diff --git a/harness/sm/non262-Date-shell.js b/harness/sm/non262-Date-shell.js new file mode 100644 index 0000000000..f1f7d18c90 --- /dev/null +++ b/harness/sm/non262-Date-shell.js @@ -0,0 +1,316 @@ +/*--- +defines: [msPerHour, TZ_ADJUST, UTC_01_JAN_1900, UTC_01_JAN_2000, UTC_29_FEB_2000, UTC_01_JAN_2005, inTimeZone, withLocale, Month, assertDateTime, runDSTOffsetCachingTestsFraction] +allow_unused: True +---*/ + +/** + * Date functions used by tests in Date suite + */ +(function(global) { + const msPerDay = 1000 * 60 * 60 * 24; + const msPerHour = 1000 * 60 * 60; + global.msPerHour = msPerHour; + + // Offset of tester's time zone from UTC. + const TZ_DIFF = GetRawTimezoneOffset(); + global.TZ_ADJUST = TZ_DIFF * msPerHour; + + const UTC_01_JAN_1900 = -2208988800000; + const UTC_01_JAN_2000 = 946684800000; + const UTC_29_FEB_2000 = UTC_01_JAN_2000 + 31 * msPerDay + 28 * msPerDay; + const UTC_01_JAN_2005 = UTC_01_JAN_2000 + TimeInYear(2000) + TimeInYear(2001) + + TimeInYear(2002) + TimeInYear(2003) + TimeInYear(2004); + global.UTC_01_JAN_1900 = UTC_01_JAN_1900; + global.UTC_01_JAN_2000 = UTC_01_JAN_2000; + global.UTC_29_FEB_2000 = UTC_29_FEB_2000; + global.UTC_01_JAN_2005 = UTC_01_JAN_2005; + + /* + * Originally, the test suite used a hard-coded value TZ_DIFF = -8. + * But that was only valid for testers in the Pacific Standard Time Zone! + * We calculate the proper number dynamically for any tester. We just + * have to be careful not to use a date subject to Daylight Savings Time... + */ + function GetRawTimezoneOffset() { + let t1 = new Date(2000, 1, 1).getTimezoneOffset(); + let t2 = new Date(2000, 1 + 6, 1).getTimezoneOffset(); + + // 1) Time zone without daylight saving time. + // 2) Northern hemisphere with daylight saving time. + if ((t1 - t2) >= 0) + return -t1 / 60; + + // 3) Southern hemisphere with daylight saving time. + return -t2 / 60; + } + + function DaysInYear(y) { + return y % 4 === 0 && (y % 100 !== 0 || y % 400 === 0) ? 366 : 365; + } + + function TimeInYear(y) { + return DaysInYear(y) * msPerDay; + } + + function getDefaultTimeZone() { + var tz = getTimeZone(); + switch (tz) { + case "EST": + case "EDT": + return "EST5EDT"; + + case "CST": + case "CDT": + return "CST6CDT"; + + case "MST": + case "MDT": + return "MST7MDT"; + + case "PST": + case "PDT": + return "PST8PDT"; + + default: + // Other time zones abbrevations are not supported. + return tz; + } + } + + function getDefaultLocale() { + // If the default locale looks like a BCP-47 language tag, return it. + var locale = global.getDefaultLocale(); + if (locale.match(/^[a-z][a-z0-9\-]+$/i)) + return locale; + + // Otherwise use undefined to reset to the default locale. + return undefined; + } + + let defaultTimeZone = null; + let defaultLocale = null; + + // Run the given test in the requested time zone. + function inTimeZone(tzname, fn) { + if (defaultTimeZone === null) + defaultTimeZone = getDefaultTimeZone(); + + setTimeZone(tzname); + try { + fn(); + } finally { + setTimeZone(defaultTimeZone); + } + } + global.inTimeZone = inTimeZone; + + // Run the given test with the requested locale. + function withLocale(locale, fn) { + if (defaultLocale === null) + defaultLocale = getDefaultLocale(); + + setDefaultLocale(locale); + try { + fn(); + } finally { + setDefaultLocale(defaultLocale); + } + } + global.withLocale = withLocale; + + const Month = { + January: 0, + February: 1, + March: 2, + April: 3, + May: 4, + June: 5, + July: 6, + August: 7, + September: 8, + October: 9, + November: 10, + December: 11, + }; + global.Month = Month; + + const weekdays = ["Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"].join("|"); + const months = ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"].join("|"); + const datePart = String.raw `(?:${weekdays}) (?:${months}) \d{2}`; + const timePart = String.raw `\d{4,6} \d{2}:\d{2}:\d{2} GMT[+-]\d{4}`; + const dateTimeRE = new RegExp(String.raw `^(${datePart} ${timePart})(?: \((.+)\))?$`); + + function assertDateTime(date, expected, ...alternativeTimeZones) { + let actual = date.toString(); + assertEq(dateTimeRE.test(expected), true, `${expected}`); + assertEq(dateTimeRE.test(actual), true, `${actual}`); + + let [, expectedDateTime, expectedTimeZone] = dateTimeRE.exec(expected); + let [, actualDateTime, actualTimeZone] = dateTimeRE.exec(actual); + + assertEq(actualDateTime, expectedDateTime); + + // The time zone identifier is optional, so only compare its value if + // it's present in |actual| and |expected|. + if (expectedTimeZone !== undefined && actualTimeZone !== undefined) { + // Test against the alternative time zone identifiers if necessary. + if (actualTimeZone !== expectedTimeZone) { + for (let alternativeTimeZone of alternativeTimeZones) { + if (actualTimeZone === alternativeTimeZone) { + expectedTimeZone = alternativeTimeZone; + break; + } + } + } + assertEq(actualTimeZone, expectedTimeZone); + } + } + global.assertDateTime = assertDateTime; +})(this); + + +function runDSTOffsetCachingTestsFraction(part, parts) +{ + var BUGNUMBER = 563938; + var summary = 'Cache DST offsets to improve SunSpider score'; + + print(BUGNUMBER + ": " + summary); + + var MAX_UNIX_TIMET = 2145859200; // "2037-12-31T08:00:00.000Z" (PST8PDT based!) + var RANGE_EXPANSION_AMOUNT = 30 * 24 * 60 * 60; + + /** + * Computes the time zone offset in minutes at the given timestamp. + */ + function tzOffsetFromUnixTimestamp(timestamp) + { + var d = new Date(NaN); + d.setTime(timestamp); // local slot = NaN, UTC slot = timestamp + return d.getTimezoneOffset(); // get UTC, calculate local => diff in minutes + } + + /** + * Clear the DST offset cache, leaving it initialized to include a timestamp + * completely unlike the provided one (i.e. one very, very far away in time + * from it). Thus an immediately following lookup for the provided timestamp + * will cache-miss and compute a clean value. + */ + function clearDSTOffsetCache(undesiredTimestamp) + { + var opposite = (undesiredTimestamp + MAX_UNIX_TIMET / 2) % MAX_UNIX_TIMET; + + // Generic purge to known, but not necessarily desired, state + tzOffsetFromUnixTimestamp(0); + tzOffsetFromUnixTimestamp(MAX_UNIX_TIMET); + + // Purge to desired state. Cycle 2x in case opposite or undesiredTimestamp + // is close to 0 or MAX_UNIX_TIMET. + tzOffsetFromUnixTimestamp(opposite); + tzOffsetFromUnixTimestamp(undesiredTimestamp); + tzOffsetFromUnixTimestamp(opposite); + tzOffsetFromUnixTimestamp(undesiredTimestamp); + } + + function computeCanonicalTZOffset(timestamp) + { + clearDSTOffsetCache(timestamp); + return tzOffsetFromUnixTimestamp(timestamp); + } + + var TEST_TIMESTAMPS_SECONDS = + [ + // Special-ish timestamps + 0, + RANGE_EXPANSION_AMOUNT, + MAX_UNIX_TIMET, + ]; + + var ONE_DAY = 24 * 60 * 60; + var EIGHTY_THREE_HOURS = 83 * 60 * 60; + var NINETY_EIGHT_HOURS = 98 * 60 * 60; + function nextIncrement(i) + { + return i === EIGHTY_THREE_HOURS ? NINETY_EIGHT_HOURS : EIGHTY_THREE_HOURS; + } + + // Now add a long sequence of non-special timestamps, from a fixed range, that + // overlaps a DST change by "a bit" on each side. 67 days should be enough + // displacement that we can occasionally exercise the implementation's + // thirty-day expansion and the DST-offset-change logic. Use two different + // increments just to be safe and catch something a single increment might not. + var DST_CHANGE_DATE = 1268553600; // March 14, 2010 + for (var t = DST_CHANGE_DATE - 67 * ONE_DAY, + i = nextIncrement(NINETY_EIGHT_HOURS), + end = DST_CHANGE_DATE + 67 * ONE_DAY; + t < end; + i = nextIncrement(i), t += i) + { + TEST_TIMESTAMPS_SECONDS.push(t); + } + + var TEST_TIMESTAMPS = + TEST_TIMESTAMPS_SECONDS.map(function(v) { return v * 1000; }); + + /************** + * BEGIN TEST * + **************/ + + // Compute the correct time zone offsets for all timestamps to be tested. + var CORRECT_TZOFFSETS = TEST_TIMESTAMPS.map(computeCanonicalTZOffset); + + // Intentionally and knowingly invoking every single logic path in the cache + // isn't easy for a human to get right (and know he's gotten it right), so + // let's do it the easy way: exhaustively try all possible four-date sequences + // selecting from our array of possible timestamps. + + var sz = TEST_TIMESTAMPS.length; + var start = Math.floor((part - 1) / parts * sz); + var end = Math.floor(part / parts * sz); + + print("Exhaustively testing timestamps " + + "[" + start + ", " + end + ") of " + sz + "..."); + + try + { + for (var i = start; i < end; i++) + { + print("Testing timestamp " + i + "..."); + + var t1 = TEST_TIMESTAMPS[i]; + for (var j = 0; j < sz; j++) + { + var t2 = TEST_TIMESTAMPS[j]; + for (var k = 0; k < sz; k++) + { + var t3 = TEST_TIMESTAMPS[k]; + for (var w = 0; w < sz; w++) + { + var t4 = TEST_TIMESTAMPS[w]; + + clearDSTOffsetCache(t1); + + var tzo1 = tzOffsetFromUnixTimestamp(t1); + var tzo2 = tzOffsetFromUnixTimestamp(t2); + var tzo3 = tzOffsetFromUnixTimestamp(t3); + var tzo4 = tzOffsetFromUnixTimestamp(t4); + + assertEq(tzo1, CORRECT_TZOFFSETS[i]); + assertEq(tzo2, CORRECT_TZOFFSETS[j]); + assertEq(tzo3, CORRECT_TZOFFSETS[k]); + assertEq(tzo4, CORRECT_TZOFFSETS[w]); + } + } + } + } + } + catch (e) + { + assertEq(true, false, + "Error when testing with timestamps " + + i + ", " + j + ", " + k + ", " + w + + " (" + t1 + ", " + t2 + ", " + t3 + ", " + t4 + ")!"); + } + + reportCompare(true, true); + print("All tests passed!"); +} diff --git a/harness/sm/non262-JSON-shell.js b/harness/sm/non262-JSON-shell.js new file mode 100644 index 0000000000..5cf8ebcd8c --- /dev/null +++ b/harness/sm/non262-JSON-shell.js @@ -0,0 +1,114 @@ +/*--- +defines: [testJSON] +allow_unused: True +---*/ +function testJSON(str, expectSyntaxError) +{ + // Leading and trailing whitespace never affect parsing, so test the string + // multiple times with and without whitespace around it as it's easy and can + // potentially detect bugs. + + // Try the provided string + try + { + JSON.parse(str); + reportCompare(false, expectSyntaxError, + "string <" + str + "> " + + "should" + (expectSyntaxError ? "n't" : "") + " " + + "have parsed as JSON"); + } + catch (e) + { + if (!(e instanceof SyntaxError)) + { + reportCompare(true, false, + "parsing string <" + str + "> threw a non-SyntaxError " + + "exception: " + e); + } + else + { + reportCompare(true, expectSyntaxError, + "string <" + str + "> " + + "should" + (expectSyntaxError ? "n't" : "") + " " + + "have parsed as JSON, exception: " + e); + } + } + + // Now try the provided string with trailing whitespace + try + { + JSON.parse(str + " "); + reportCompare(false, expectSyntaxError, + "string <" + str + " > " + + "should" + (expectSyntaxError ? "n't" : "") + " " + + "have parsed as JSON"); + } + catch (e) + { + if (!(e instanceof SyntaxError)) + { + reportCompare(true, false, + "parsing string <" + str + " > threw a non-SyntaxError " + + "exception: " + e); + } + else + { + reportCompare(true, expectSyntaxError, + "string <" + str + " > " + + "should" + (expectSyntaxError ? "n't" : "") + " " + + "have parsed as JSON, exception: " + e); + } + } + + // Now try the provided string with leading whitespace + try + { + JSON.parse(" " + str); + reportCompare(false, expectSyntaxError, + "string < " + str + "> " + + "should" + (expectSyntaxError ? "n't" : "") + " " + + "have parsed as JSON"); + } + catch (e) + { + if (!(e instanceof SyntaxError)) + { + reportCompare(true, false, + "parsing string < " + str + "> threw a non-SyntaxError " + + "exception: " + e); + } + else + { + reportCompare(true, expectSyntaxError, + "string < " + str + "> " + + "should" + (expectSyntaxError ? "n't" : "") + " " + + "have parsed as JSON, exception: " + e); + } + } + + // Now try the provided string with whitespace surrounding it + try + { + JSON.parse(" " + str + " "); + reportCompare(false, expectSyntaxError, + "string < " + str + " > " + + "should" + (expectSyntaxError ? "n't" : "") + " " + + "have parsed as JSON"); + } + catch (e) + { + if (!(e instanceof SyntaxError)) + { + reportCompare(true, false, + "parsing string < " + str + " > threw a non-SyntaxError " + + "exception: " + e); + } + else + { + reportCompare(true, expectSyntaxError, + "string < " + str + " > " + + "should" + (expectSyntaxError ? "n't" : "") + " " + + "have parsed as JSON, exception: " + e); + } + } +} diff --git a/harness/sm/non262-Math-shell.js b/harness/sm/non262-Math-shell.js new file mode 100644 index 0000000000..a4d1071c69 --- /dev/null +++ b/harness/sm/non262-Math-shell.js @@ -0,0 +1,79 @@ +/*--- +defines: [assertNear] +allow_unused: True +---*/ + +// The nearest representable values to +1.0. +const ONE_PLUS_EPSILON = 1 + Math.pow(2, -52); // 0.9999999999999999 +const ONE_MINUS_EPSILON = 1 - Math.pow(2, -53); // 1.0000000000000002 + +{ + const fail = function (msg) { + var exc = new Error(msg); + try { + // Try to improve on exc.fileName and .lineNumber; leave exc.stack + // alone. We skip two frames: fail() and its caller, an assertX() + // function. + var frames = exc.stack.trim().split("\n"); + if (frames.length > 2) { + var m = /@([^@:]*):([0-9]+)$/.exec(frames[2]); + if (m) { + exc.fileName = m[1]; + exc.lineNumber = +m[2]; + } + } + } catch (ignore) { throw ignore;} + throw exc; + }; + + let ENDIAN; // 0 for little-endian, 1 for big-endian. + + // Return the difference between the IEEE 754 bit-patterns for a and b. + // + // This is meaningful when a and b are both finite and have the same + // sign. Then the following hold: + // + // * If a === b, then diff(a, b) === 0. + // + // * If a !== b, then diff(a, b) === 1 + the number of representable values + // between a and b. + // + const f = new Float64Array([0, 0]); + const u = new Uint32Array(f.buffer); + const diff = function (a, b) { + f[0] = a; + f[1] = b; + //print(u[1].toString(16) + u[0].toString(16) + " " + u[3].toString(16) + u[2].toString(16)); + return Math.abs((u[3-ENDIAN] - u[1-ENDIAN]) * 0x100000000 + u[2+ENDIAN] - u[0+ENDIAN]); + }; + + // Set ENDIAN to the platform's endianness. + ENDIAN = 0; // try little-endian first + if (diff(2, 4) === 0x100000) // exact wrong answer we'll get on a big-endian platform + ENDIAN = 1; + assertEq(diff(2,4), 0x10000000000000); + assertEq(diff(0, Number.MIN_VALUE), 1); + assertEq(diff(1, ONE_PLUS_EPSILON), 1); + assertEq(diff(1, ONE_MINUS_EPSILON), 1); + + var assertNear = function assertNear(a, b, tolerance=1) { + if (!Number.isFinite(b)) { + fail("second argument to assertNear (expected value) must be a finite number"); + } else if (Number.isNaN(a)) { + fail("got NaN, expected a number near " + b); + } else if (!Number.isFinite(a)) { + if (b * Math.sign(a) < Number.MAX_VALUE) + fail("got " + a + ", expected a number near " + b); + } else { + // When the two arguments do not have the same sign bit, diff() + // returns some huge number. So if b is positive or negative 0, + // make target the zero that has the same sign bit as a. + var target = b === 0 ? a * 0 : b; + var err = diff(a, target); + if (err > tolerance) { + fail("got " + a + ", expected a number near " + b + + " (relative error: " + err + ")"); + } + } + }; +} diff --git a/harness/sm/non262-Reflect-shell.js b/harness/sm/non262-Reflect-shell.js new file mode 100644 index 0000000000..22d68b3513 --- /dev/null +++ b/harness/sm/non262-Reflect-shell.js @@ -0,0 +1,14 @@ +/*--- +defines: [SOME_PRIMITIVE_VALUES] +allow_unused: True +---*/ + +// List of a few values that are not objects. +var SOME_PRIMITIVE_VALUES = [ + undefined, null, + false, + -Infinity, -1.6e99, -1, -0, 0, Math.pow(2, -1074), 1, 4294967295, + Number.MAX_SAFE_INTEGER, Number.MAX_SAFE_INTEGER + 1, 1.6e99, Infinity, NaN, + "", "Phaedo", + Symbol(), Symbol("iterator"), Symbol.for("iterator"), Symbol.iterator +]; diff --git a/harness/sm/non262-RegExp-shell.js b/harness/sm/non262-RegExp-shell.js new file mode 100644 index 0000000000..b872c2d3cb --- /dev/null +++ b/harness/sm/non262-RegExp-shell.js @@ -0,0 +1,261 @@ +/* -*- tab-width: 2; indent-tabs-mode: nil; js-indent-level: 2 -*- */ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +/*--- +defines: [testRegExp, makeExpectedMatch, checkRegExpMatch] +allow_unused: True +---*/ + +/* + * Date: 07 February 2001 + * + * Functionality common to RegExp testing - + */ +//----------------------------------------------------------------------------- + +(function(global) { + + var MSG_PATTERN = '\nregexp = '; + var MSG_STRING = '\nstring = '; + var MSG_EXPECT = '\nExpect: '; + var MSG_ACTUAL = '\nActual: '; + var ERR_LENGTH = '\nERROR !!! match arrays have different lengths:'; + var ERR_MATCH = '\nERROR !!! regexp failed to give expected match array:'; + var ERR_NO_MATCH = '\nERROR !!! regexp FAILED to match anything !!!'; + var ERR_UNEXP_MATCH = '\nERROR !!! regexp MATCHED when we expected it to fail !!!'; + var CHAR_LBRACKET = '['; + var CHAR_RBRACKET = ']'; + var CHAR_QT_DBL = '"'; + var CHAR_QT = "'"; + var CHAR_NL = '\n'; + var CHAR_COMMA = ','; + var CHAR_SPACE = ' '; + var TYPE_STRING = typeof 'abc'; + + + + global.testRegExp = function testRegExp(statuses, patterns, strings, actualmatches, expectedmatches) + { + var status = ''; + var pattern = new RegExp(); + var string = ''; + var actualmatch = new Array(); + var expectedmatch = new Array(); + var state = ''; + var lActual = -1; + var lExpect = -1; + + + for (var i=0; i != patterns.length; i++) + { + status = statuses[i]; + pattern = patterns[i]; + string = strings[i]; + actualmatch=actualmatches[i]; + expectedmatch=expectedmatches[i]; + state = getState(status, pattern, string); + + description = status; + + if(actualmatch) + { + actual = formatArray(actualmatch); + if(expectedmatch) + { + // expectedmatch and actualmatch are arrays - + lExpect = expectedmatch.length; + lActual = actualmatch.length; + + var expected = formatArray(expectedmatch); + + if (lActual != lExpect) + { + reportCompare(lExpect, lActual, + state + ERR_LENGTH + + MSG_EXPECT + expected + + MSG_ACTUAL + actual + + CHAR_NL + ); + continue; + } + + // OK, the arrays have same length - + if (expected != actual) + { + reportCompare(expected, actual, + state + ERR_MATCH + + MSG_EXPECT + expected + + MSG_ACTUAL + actual + + CHAR_NL + ); + } + else + { + reportCompare(expected, actual, state) + } + + } + else //expectedmatch is null - that is, we did not expect a match - + { + expected = expectedmatch; + reportCompare(expected, actual, + state + ERR_UNEXP_MATCH + + MSG_EXPECT + expectedmatch + + MSG_ACTUAL + actual + + CHAR_NL + ); + } + + } + else // actualmatch is null + { + if (expectedmatch) + { + actual = actualmatch; + reportCompare(expected, actual, + state + ERR_NO_MATCH + + MSG_EXPECT + expectedmatch + + MSG_ACTUAL + actualmatch + + CHAR_NL + ); + } + else // we did not expect a match + { + // Being ultra-cautious. Presumably expectedmatch===actualmatch===null + expected = expectedmatch; + actual = actualmatch; + reportCompare (expectedmatch, actualmatch, state); + } + } + } + } + + function getState(status, pattern, string) + { + /* + * Escape \n's, etc. to make them LITERAL in the presentation string. + * We don't have to worry about this in |pattern|; such escaping is + * done automatically by pattern.toString(), invoked implicitly below. + * + * One would like to simply do: string = string.replace(/(\s)/g, '\$1'). + * However, the backreference $1 is not a literal string value, + * so this method doesn't work. + * + * Also tried string = string.replace(/(\s)/g, escape('$1')); + * but this just inserts the escape of the literal '$1', i.e. '%241'. + */ + string = string.replace(/\n/g, '\\n'); + string = string.replace(/\r/g, '\\r'); + string = string.replace(/\t/g, '\\t'); + string = string.replace(/\v/g, '\\v'); + string = string.replace(/\f/g, '\\f'); + + return (status + MSG_PATTERN + pattern + MSG_STRING + singleQuote(string)); + } + + + + /* + * If available, arr.toSource() gives more detail than arr.toString() + * + * var arr = Array(1,2,'3'); + * + * arr.toSource() + * [1, 2, "3"] + * + * arr.toString() + * 1,2,3 + * + * But toSource() doesn't exist in Rhino, so use our own imitation, below - + * + */ + function formatArray(arr) + { + try + { + return arr.toSource(); + } + catch(e) + { + return toSource(arr); + } + } + + + /* + * Imitate SpiderMonkey's arr.toSource() method: + * + * a) Double-quote each array element that is of string type + * b) Represent |undefined| and |null| by empty strings + * c) Delimit elements by a comma + single space + * d) Do not add delimiter at the end UNLESS the last element is |undefined| + * e) Add square brackets to the beginning and end of the string + */ + function toSource(arr) + { + var delim = CHAR_COMMA + CHAR_SPACE; + var elt = ''; + var ret = ''; + var len = arr.length; + + for (i=0; i String.fromCodePoint(x)).join(""); + } + function stringify(points) { + return points.map(x => x.toString(16)).join(); + } + + var source = codePointsToString(test.source); + var NFC = codePointsToString(test.NFC); + var NFD = codePointsToString(test.NFD); + var NFKC = codePointsToString(test.NFKC); + var NFKD = codePointsToString(test.NFKD); + var sourceStr = stringify(test.source); + var nfcStr = stringify(test.NFC); + var nfdStr = stringify(test.NFD); + var nfkcStr = stringify(test.NFKC); + var nfkdStr = stringify(test.NFKD); + + /* NFC */ + assertEq(source.normalize(), NFC, "NFC of " + sourceStr); + assertEq(NFC.normalize(), NFC, "NFC of " + nfcStr); + assertEq(NFD.normalize(), NFC, "NFC of " + nfdStr); + assertEq(NFKC.normalize(), NFKC, "NFC of " + nfkcStr); + assertEq(NFKD.normalize(), NFKC, "NFC of " + nfkdStr); + + assertEq(source.normalize(undefined), NFC, "NFC of " + sourceStr); + assertEq(NFC.normalize(undefined), NFC, "NFC of " + nfcStr); + assertEq(NFD.normalize(undefined), NFC, "NFC of " + nfdStr); + assertEq(NFKC.normalize(undefined), NFKC, "NFC of " + nfkcStr); + assertEq(NFKD.normalize(undefined), NFKC, "NFC of " + nfkdStr); + + assertEq(source.normalize("NFC"), NFC, "NFC of " + sourceStr); + assertEq(NFC.normalize("NFC"), NFC, "NFC of " + nfcStr); + assertEq(NFD.normalize("NFC"), NFC, "NFC of " + nfdStr); + assertEq(NFKC.normalize("NFC"), NFKC, "NFC of " + nfkcStr); + assertEq(NFKD.normalize("NFC"), NFKC, "NFC of " + nfkdStr); + + /* NFD */ + assertEq(source.normalize("NFD"), NFD, "NFD of " + sourceStr); + assertEq(NFC.normalize("NFD"), NFD, "NFD of " + nfcStr); + assertEq(NFD.normalize("NFD"), NFD, "NFD of " + nfdStr); + assertEq(NFKC.normalize("NFD"), NFKD, "NFD of " + nfkcStr); + assertEq(NFKD.normalize("NFD"), NFKD, "NFD of " + nfkdStr); + + /* NFKC */ + assertEq(source.normalize("NFKC"), NFKC, "NFKC of " + sourceStr); + assertEq(NFC.normalize("NFKC"), NFKC, "NFKC of " + nfcStr); + assertEq(NFD.normalize("NFKC"), NFKC, "NFKC of " + nfdStr); + assertEq(NFKC.normalize("NFKC"), NFKC, "NFKC of " + nfkcStr); + assertEq(NFKD.normalize("NFKC"), NFKC, "NFKC of " + nfkdStr); + + /* NFKD */ + assertEq(source.normalize("NFKD"), NFKD, "NFKD of " + sourceStr); + assertEq(NFC.normalize("NFKD"), NFKD, "NFKD of " + nfcStr); + assertEq(NFD.normalize("NFKD"), NFKD, "NFKD of " + nfdStr); + assertEq(NFKC.normalize("NFKD"), NFKD, "NFKD of " + nfkcStr); + assertEq(NFKD.normalize("NFKD"), NFKD, "NFKD of " + nfkdStr); +} diff --git a/harness/sm/non262-Temporal-PlainMonthDay-shell.js b/harness/sm/non262-Temporal-PlainMonthDay-shell.js new file mode 100644 index 0000000000..98e977bb47 --- /dev/null +++ b/harness/sm/non262-Temporal-PlainMonthDay-shell.js @@ -0,0 +1,49 @@ +/*--- +defines: [ISOFields, assertSameISOFields] +allow_unused: True +---*/ + +function ISOFields(monthDay) { + let re = /^(?\d{4,6})-(?\d{2})-(?\d{2})\[u-ca=(?[\w\-]+)\]$/; + + let str = monthDay.toString({calendarName: "always"}); + let match = str.match(re); + assertEq(match !== null, true, `can't match: ${str}`); + + let {year, month, day, calendar} = match.groups; + let isoYear = Number(year); + let isoMonth = Number(month); + let isoDay = Number(day); + + let date = Temporal.PlainDate.from(str); + let isoDate = date.withCalendar("iso8601"); + + assertEq(calendar, date.calendarId); + assertEq(isoYear, isoDate.year); + assertEq(isoMonth, isoDate.month); + assertEq(isoDay, isoDate.day); + + return { + isoYear, + isoMonth, + isoDay, + calendar, + }; +} + +function assertSameISOFields(actual, expected) { + let actualFields = ISOFields(actual); + let expectedFields = ISOFields(expected); + + assertEq(typeof actualFields.isoYear, "number"); + assertEq(typeof actualFields.isoMonth, "number"); + assertEq(typeof actualFields.isoDay, "number"); + + assertEq(actualFields.isoMonth > 0, true); + assertEq(actualFields.isoDay > 0, true); + + assertEq(actualFields.isoYear, expectedFields.isoYear); + assertEq(actualFields.isoMonth, expectedFields.isoMonth); + assertEq(actualFields.isoDay, expectedFields.isoDay); + assertEq(actualFields.calendar, expectedFields.calendar); +} diff --git a/harness/sm/non262-TypedArray-shell.js b/harness/sm/non262-TypedArray-shell.js new file mode 100644 index 0000000000..5fe532f0f4 --- /dev/null +++ b/harness/sm/non262-TypedArray-shell.js @@ -0,0 +1,133 @@ +/*--- +defines: [typedArrayConstructors, sharedTypedArrayConstructors, anyTypedArrayConstructors, isSharedConstructor, isFloatConstructor, isUnsignedConstructor] +allow_unused: True +---*/ +(function(global) { + "use strict"; + + const { + Float16Array, Float32Array, Float64Array, Object, Reflect, SharedArrayBuffer, WeakMap, + assertEq + } = global; + const { + apply: Reflect_apply, + construct: Reflect_construct, + } = Reflect; + const { + get: WeakMap_prototype_get, + has: WeakMap_prototype_has, + } = WeakMap.prototype; + + const sharedConstructors = new WeakMap(); + + // Synthesize a constructor for a shared memory array from the constructor + // for unshared memory. This has "good enough" fidelity for many uses. In + // cases where it's not good enough, call isSharedConstructor for local + // workarounds. + function sharedConstructor(baseConstructor) { + // Create SharedTypedArray as a subclass of %TypedArray%, following the + // built-in %TypedArray% subclasses. + class SharedTypedArray extends Object.getPrototypeOf(baseConstructor) { + constructor(...args) { + var array = Reflect_construct(baseConstructor, args); + var {buffer, byteOffset, length} = array; + var sharedBuffer = new SharedArrayBuffer(buffer.byteLength); + var sharedArray = Reflect_construct(baseConstructor, + [sharedBuffer, byteOffset, length], + new.target); + for (var i = 0; i < length; i++) + sharedArray[i] = array[i]; + assertEq(sharedArray.buffer, sharedBuffer); + return sharedArray; + } + } + + // 22.2.5.1 TypedArray.BYTES_PER_ELEMENT + Object.defineProperty(SharedTypedArray, "BYTES_PER_ELEMENT", + {__proto__: null, value: baseConstructor.BYTES_PER_ELEMENT}); + + // 22.2.6.1 TypedArray.prototype.BYTES_PER_ELEMENT + Object.defineProperty(SharedTypedArray.prototype, "BYTES_PER_ELEMENT", + {__proto__: null, value: baseConstructor.BYTES_PER_ELEMENT}); + + // Share the same name with the base constructor to avoid calling + // isSharedConstructor() in multiple places. + Object.defineProperty(SharedTypedArray, "name", + {__proto__: null, value: baseConstructor.name}); + + sharedConstructors.set(SharedTypedArray, baseConstructor); + + return SharedTypedArray; + } + + /** + * All TypedArray constructors for unshared memory. + */ + const typedArrayConstructors = Object.freeze([ + Int8Array, + Uint8Array, + Uint8ClampedArray, + Int16Array, + Uint16Array, + Int32Array, + Uint32Array, + Float32Array, + Float64Array, + ].concat(Float16Array ?? [])); + + /** + * All TypedArray constructors for shared memory. + */ + const sharedTypedArrayConstructors = Object.freeze( + typeof SharedArrayBuffer === "function" + ? typedArrayConstructors.map(sharedConstructor) + : [] + ); + + /** + * All TypedArray constructors for unshared and shared memory. + */ + const anyTypedArrayConstructors = Object.freeze([ + ...typedArrayConstructors, ...sharedTypedArrayConstructors, + ]); + + /** + * Returns `true` if `constructor` is a TypedArray constructor for shared + * memory. + */ + function isSharedConstructor(constructor) { + return Reflect_apply(WeakMap_prototype_has, sharedConstructors, [constructor]); + } + + /** + * Returns `true` if `constructor` is a TypedArray constructor for shared + * or unshared memory, with an underlying element type of one of Float16, Float32 + * or Float64. + */ + function isFloatConstructor(constructor) { + if (isSharedConstructor(constructor)) + constructor = Reflect_apply(WeakMap_prototype_get, sharedConstructors, [constructor]); + return constructor == Float32Array || constructor == Float64Array || (Float16Array && constructor == Float16Array); + } + + /** + * Returns `true` if `constructor` is a TypedArray constructor for shared + * or unshared memory, with an underlying element type of one of Uint8, + * Uint8Clamped, Uint16, or Uint32. + */ + function isUnsignedConstructor(constructor) { + if (isSharedConstructor(constructor)) + constructor = Reflect_apply(WeakMap_prototype_get, sharedConstructors, [constructor]); + return constructor == Uint8Array || + constructor == Uint8ClampedArray || + constructor == Uint16Array || + constructor == Uint32Array; + } + + global.typedArrayConstructors = typedArrayConstructors; + global.sharedTypedArrayConstructors = sharedTypedArrayConstructors; + global.anyTypedArrayConstructors = anyTypedArrayConstructors; + global.isSharedConstructor = isSharedConstructor; + global.isFloatConstructor = isFloatConstructor; + global.isUnsignedConstructor = isUnsignedConstructor; +})(this); diff --git a/harness/sm/non262-expressions-shell.js b/harness/sm/non262-expressions-shell.js new file mode 100644 index 0000000000..e09a03cd1e --- /dev/null +++ b/harness/sm/non262-expressions-shell.js @@ -0,0 +1,284 @@ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +/*--- +defines: [testDestructuringArrayDefault, formatArray, toSource] +allow_unused: True +---*/ + +(function(global) { + function func() { + } + class C { + foo() { + } + static foo() { + } + } + + function test_one(pattern, val, opt) { + var stmts = []; + var i = 0; + var c; + + stmts.push(`var ${pattern} = ${val};`); + + for (var stmt of stmts) { + if (!opt.no_plain) { + eval(` +${stmt} +`); + } + + if (!opt.no_func) { + eval(` +function f${i}() { + ${stmt} +} +f${i}(); +`); + i++; + + eval(` +var f${i} = function foo() { + ${stmt} +}; +f${i}(); +`); + i++; + + eval(` +var f${i} = () => { + ${stmt} +}; +f${i}(); +`); + i++; + } + + if (!opt.no_gen) { + eval(` +function* g${i}() { + ${stmt} +} +[...g${i}()]; +`); + i++; + + eval(` +var g${i} = function* foo() { + ${stmt} +}; +[...g${i}()]; +`); + i++; + } + + if (!opt.no_ctor) { + eval(` +class D${i} { + constructor() { + ${stmt} + } +} +new D${i}(); +`); + i++; + } + + if (!opt.no_derived_ctor) { + if (opt.no_pre_super) { + eval(` +class D${i} extends C { + constructor() { + ${stmt} + try { super(); } catch (e) {} + } +} +new D${i}(); +`); + i++; + } else { + eval(` +class D${i} extends C { + constructor() { + super(); + ${stmt} + } +} +new D${i}(); +`); + i++; + } + } + + if (!opt.no_method) { + eval(` +class D${i} extends C { + method() { + ${stmt} + } + static staticMethod() { + ${stmt} + } +} +new D${i}().method(); +D${i}.staticMethod(); +`); + i++; + } + } + + if (!opt.no_func_arg) { + eval(` +function f${i}(${pattern}) {} +f${i}(${val}); +`); + i++; + + eval(` +var f${i} = function foo(${pattern}) {}; +f${i}(${val}); +`); + i++; + + eval(` +var f${i} = (${pattern}) => {}; +f${i}(${val}); +`); + i++; + } + + if (!opt.no_gen_arg) { + eval(` +function* g${i}(${pattern}) {} +[...g${i}(${val})]; +`); + i++; + + eval(` +var g${i} = function* foo(${pattern}) {}; +[...g${i}(${val})]; +`); + i++; + } + } + + function test(expr, opt={}) { + var pattern = `[a=${expr}, ...c]`; + test_one(pattern, "[]", opt); + test_one(pattern, "[1]", opt); + + pattern = `[,a=${expr}]`; + test_one(pattern, "[]", opt); + test_one(pattern, "[1]", opt); + test_one(pattern, "[1, 2]", opt); + + pattern = `[{x: [a=${expr}]}]`; + test_one(pattern, "[{x: [1]}]", opt); + + pattern = `[x=[a=${expr}]=[]]`; + test_one(pattern, "[]", opt); + test_one(pattern, "[1]", opt); + + pattern = `[x=[a=${expr}]=[1]]`; + test_one(pattern, "[]", opt); + test_one(pattern, "[1]", opt); + } + + global.testDestructuringArrayDefault = test; +})(this); + +(function(global) { + /* + * Date: 07 February 2001 + * + * Functionality common to Array testing - + */ + //----------------------------------------------------------------------------- + + + var CHAR_LBRACKET = '['; + var CHAR_RBRACKET = ']'; + var CHAR_QT_DBL = '"'; + var CHAR_COMMA = ','; + var CHAR_SPACE = ' '; + var TYPE_STRING = typeof 'abc'; + + + /* + * If available, arr.toSource() gives more detail than arr.toString() + * + * var arr = Array(1,2,'3'); + * + * arr.toSource() + * [1, 2, "3"] + * + * arr.toString() + * 1,2,3 + * + * But toSource() doesn't exist in Rhino, so use our own imitation, below - + * + */ + function formatArray(arr) + { + try + { + return arr.toSource(); + } + catch(e) + { + return toSource(arr); + } + } + + global.formatArray = formatArray; + + /* + * Imitate SpiderMonkey's arr.toSource() method: + * + * a) Double-quote each array element that is of string type + * b) Represent |undefined| and |null| by empty strings + * c) Delimit elements by a comma + single space + * d) Do not add delimiter at the end UNLESS the last element is |undefined| + * e) Add square brackets to the beginning and end of the string + */ + function toSource(arr) + { + var delim = CHAR_COMMA + CHAR_SPACE; + var elt = ''; + var ret = ''; + var len = arr.length; + + for (i=0; i>> 0; + return !("" + u == p && u != 0xffffffff); + } + + function assertIsCloneOf(a, b, path) { + assertEq(a === b, false); + + var ca = classOf(a); + assertEq(ca, classOf(b), path); + + assertEq(Object.getPrototypeOf(a), + ca == "[object Object]" ? Object.prototype : Array.prototype, + path); + + // 'b', the original object, may have non-enumerable or XMLName + // properties; ignore them (except .length, if it's an Array). + // 'a', the clone, should not have any non-enumerable properties + // (except .length, if it's an Array) or XMLName properties. + var pb = ownProperties(b).filter(function(element) { + return isCloneable(b, element); + }); + var pa = ownProperties(a); + for (var i = 0; i < pa.length; i++) { + assertEq(typeof pa[i][0], "string", "clone should not have E4X properties " + path); + if (!isCloneable(a, pa[i])) { + throw new Error("non-cloneable clone property " + pa[i][0] + " " + path); + } + } + + // Check that, apart from properties whose names are array indexes, + // the enumerable properties appear in the same order. + var aNames = pa.map(function (pair) { return pair[1]; }).filter(notIndex); + var bNames = pa.map(function (pair) { return pair[1]; }).filter(notIndex); + assertEq(aNames.join(","), bNames.join(","), path); + + // Check that the lists are the same when including array indexes. + function byName(a, b) { a = a[0]; b = b[0]; return a < b ? -1 : a === b ? 0 : 1; } + pa.sort(byName); + pb.sort(byName); + assertEq(pa.length, pb.length, "should see the same number of properties " + path); + for (var i = 0; i < pa.length; i++) { + var aName = pa[i][0]; + var bName = pb[i][0]; + assertEq(aName, bName, path); + + var path2 = path + "." + aName; + var da = pa[i][1]; + var db = pb[i][1]; + if (!isArrayLength(a, pa[i])) { + assertEq(da.configurable, true, path2); + } + assertEq(da.writable, true, path2); + assertEq("value" in da, true, path2); + var va = da.value; + var vb = b[pb[i][0]]; + if (typeof va === "object" && va !== null) + queue.push([va, vb, path2]); + else + assertEq(va, vb, path2); + } + } + + var banner = "while testing clone of " + (desc || JSON.stringify(b)); + var a = deserialize(serialize(b)); + var queue = [[a, b, banner]]; + while (queue.length) { + var triple = queue.shift(); + assertIsCloneOf(triple[0], triple[1], triple[2]); + } + + return a; // for further testing + } + global.clone_object_check = clone_object_check; + +})(this); diff --git a/harness/sm/non262-generators-shell.js b/harness/sm/non262-generators-shell.js new file mode 100644 index 0000000000..46161a803c --- /dev/null +++ b/harness/sm/non262-generators-shell.js @@ -0,0 +1,21 @@ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ +/*--- +defines: [assertFalse, assertTrue, assertNotEq, assertIteratorResult, assertIteratorNext, assertIteratorDone] +allow_unused: True +---*/ + +function assertFalse(a) { assertEq(a, false) } +function assertTrue(a) { assertEq(a, true) } +function assertNotEq(found, not_expected) { assertEq(Object.is(found, not_expected), false) } +function assertIteratorResult(result, value, done) { + assertDeepEq(result.value, value); + assertEq(result.done, done); +} +function assertIteratorNext(iter, value) { + assertIteratorResult(iter.next(), value, false); +} +function assertIteratorDone(iter, value) { + assertIteratorResult(iter.next(), value, true); +} diff --git a/harness/sm/non262-object-shell.js b/harness/sm/non262-object-shell.js new file mode 100644 index 0000000000..c569b52521 --- /dev/null +++ b/harness/sm/non262-object-shell.js @@ -0,0 +1,67 @@ +/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +/*--- +defines: [getJSClass, findType, findClass, isObject] +allow_unused: True +---*/ + +/* + * Date: 14 Mar 2001 + * + * SUMMARY: Utility functions for testing objects - + * + * Suppose obj is an instance of a native type, e.g. Number. + * Then obj.toString() invokes Number.prototype.toString(). + * We would also like to access Object.prototype.toString(). + * + * The difference is this: suppose obj = new Number(7). + * Invoking Number.prototype.toString() on this just returns 7. + * Object.prototype.toString() on this returns '[object Number]'. + * + * The getJSClass() function returns 'Number', the [[Class]] property of obj. + * See ECMA-262 Edition 3, 13-Oct-1999, Section 8.6.2 + */ +//----------------------------------------------------------------------------- + + +var cnNoObject = 'Unexpected Error!!! Parameter to this function must be an object'; +var cnNoClass = 'Unexpected Error!!! Cannot find Class property'; +var cnObjectToString = Object.prototype.toString; +var GLOBAL = 'global'; + + +// checks that it's safe to call findType() +function getJSClass(obj) +{ + if (isObject(obj)) + return findClass(findType(obj)); + return cnNoObject; +} + + +function findType(obj) +{ + return cnObjectToString.apply(obj); +} + + +// given '[object Number]', return 'Number' +function findClass(sType) +{ + var re = /^\[.*\s+(\w+)\s*\]$/; + var a = sType.match(re); + + if (a && a[1]) + return a[1]; + return cnNoClass; +} + + +function isObject(obj) +{ + return obj instanceof Object; +} + diff --git a/harness/sm/non262-shell.js b/harness/sm/non262-shell.js new file mode 100644 index 0000000000..06f067f566 --- /dev/null +++ b/harness/sm/non262-shell.js @@ -0,0 +1,381 @@ +/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */ + +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +/*--- +defines: [completesNormally, raisesException, deepEqual, makeIterator, Permutations, assertThrowsValue, assertThrownErrorContains, assertThrowsInstanceOfWithMessageCheck, assertThrowsInstanceOf, assertThrowsInstanceOfWithMessage, assertThrowsInstanceOfWithMessageContains, assertDeepEq] +allow_unused: True +---*/ + +(function() { + const undefined = void 0; + + /* + * completesNormally(CODE) returns true if evaluating CODE (as eval + * code) completes normally (rather than throwing an exception). + */ + globalThis.completesNormally = function completesNormally(code) { + try { + eval(code); + return true; + } catch (exception) { + return false; + } + } + + /* + * raisesException(EXCEPTION)(CODE) returns true if evaluating CODE (as + * eval code) throws an exception object that is an instance of EXCEPTION, + * and returns false if it throws any other error or evaluates + * successfully. For example: raises(TypeError)("0()") == true. + */ + globalThis.raisesException = function raisesException(exception) { + return function (code) { + try { + eval(code); + return false; + } catch (actual) { + return actual instanceof exception; + } + }; + }; + + /* + * Return true if A is equal to B, where equality on arrays and objects + * means that they have the same set of enumerable properties, the values + * of each property are deep_equal, and their 'length' properties are + * equal. Equality on other types is ==. + */ + globalThis.deepEqual = function deepEqual(a, b) { + if (typeof a != typeof b) + return false; + + if (typeof a == 'object') { + var props = {}; + // For every property of a, does b have that property with an equal value? + for (var prop in a) { + if (!deepEqual(a[prop], b[prop])) + return false; + props[prop] = true; + } + // Are all of b's properties present on a? + for (var prop in b) + if (!props[prop]) + return false; + // length isn't enumerable, but we want to check it, too. + return a.length == b.length; + } + + if (a === b) { + // Distinguish 0 from -0, even though they are ===. + return a !== 0 || 1/a === 1/b; + } + + // Treat NaNs as equal, even though NaN !== NaN. + // NaNs are the only non-reflexive values, i.e., if a !== a, then a is a NaN. + // isNaN is broken: it converts its argument to number, so isNaN("foo") => true + return a !== a && b !== b; + } + + /** Make an iterator with a return method. */ + globalThis.makeIterator = function makeIterator(overrides) { + var throwMethod; + if (overrides && overrides.throw) + throwMethod = overrides.throw; + var iterator = { + throw: throwMethod, + next: function(x) { + if (overrides && overrides.next) + return overrides.next(x); + return { done: false }; + }, + return: function(x) { + if (overrides && overrides.ret) + return overrides.ret(x); + return { done: true }; + } + }; + + return function() { return iterator; }; + }; + + /** Yield every permutation of the elements in some array. */ + globalThis.Permutations = function* Permutations(items) { + if (items.length == 0) { + yield []; + } else { + items = items.slice(0); + for (let i = 0; i < items.length; i++) { + let swap = items[0]; + items[0] = items[i]; + items[i] = swap; + for (let e of Permutations(items.slice(1, items.length))) + yield [items[0]].concat(e); + } + } + }; + + if (typeof globalThis.assertThrowsValue === 'undefined') { + globalThis.assertThrowsValue = function assertThrowsValue(f, val, msg) { + var fullmsg; + try { + f(); + } catch (exc) { + if ((exc === val) === (val === val) && (val !== 0 || 1 / exc === 1 / val)) + return; + fullmsg = "Assertion failed: expected exception " + val + ", got " + exc; + } + if (fullmsg === undefined) + fullmsg = "Assertion failed: expected exception " + val + ", no exception thrown"; + if (msg !== undefined) + fullmsg += " - " + msg; + throw new Error(fullmsg); + }; + } + + if (typeof globalThis.assertThrownErrorContains === 'undefined') { + globalThis.assertThrownErrorContains = function assertThrownErrorContains(thunk, substr) { + try { + thunk(); + } catch (e) { + if (e.message.indexOf(substr) !== -1) + return; + throw new Error("Expected error containing " + substr + ", got " + e); + } + throw new Error("Expected error containing " + substr + ", no exception thrown"); + }; + } + + if (typeof globalThis.assertThrowsInstanceOfWithMessageCheck === 'undefined') { + globalThis.assertThrowsInstanceOfWithMessageCheck = function assertThrowsInstanceOfWithMessageCheck(f, ctor, check, msg) { + var fullmsg; + try { + f(); + } catch (exc) { + if (!(exc instanceof ctor)) + fullmsg = `Assertion failed: expected exception ${ctor.name}, got ${exc}`; + else { + var result = check(exc.message); + if (!result) + fullmsg = `Assertion failed: expected exception with message, got ${exc}`; + else + return; + } + } + + if (fullmsg === undefined) + fullmsg = `Assertion failed: expected exception ${ctor.name}, no exception thrown`; + if (msg !== undefined) + fullmsg += " - " + msg; + + throw new Error(fullmsg); + }; + } + + if (typeof globalThis.assertThrowsInstanceOf === 'undefined') { + globalThis.assertThrowsInstanceOf = function assertThrowsInstanceOf(f, ctor, msg) { + assertThrowsInstanceOfWithMessageCheck(f, ctor, _ => true, msg); + }; + } + + if (typeof globalThis.assertThrowsInstanceOfWithMessage === 'undefined') { + globalThis.assertThrowsInstanceOfWithMessage = function assertThrowsInstanceOfWithMessage(f, ctor, expected, msg) { + assertThrowsInstanceOfWithMessageCheck(f, ctor, message => message === expected, msg); + } + } + + if (typeof globalThis.assertThrowsInstanceOfWithMessageContains === 'undefined') { + globalThis.assertThrowsInstanceOfWithMessageContains = function assertThrowsInstanceOfWithMessageContains(f, ctor, substr, msg) { + assertThrowsInstanceOfWithMessageCheck(f, ctor, message => message.indexOf(substr) !== -1, msg); + } + } + + globalThis.assertDeepEq = (function(){ + var call = Function.prototype.call, + Array_isArray = Array.isArray, + Array_includes = call.bind(Array.prototype.includes), + Map_ = Map, + Error_ = Error, + Symbol_ = Symbol, + Symbol_keyFor = Symbol.keyFor, + Symbol_description = call.bind(Object.getOwnPropertyDescriptor(Symbol.prototype, "description").get), + Map_has = call.bind(Map.prototype.has), + Map_get = call.bind(Map.prototype.get), + Map_set = call.bind(Map.prototype.set), + Object_toString = call.bind(Object.prototype.toString), + Function_toString = call.bind(Function.prototype.toString), + Object_getPrototypeOf = Object.getPrototypeOf, + Object_hasOwnProperty = call.bind(Object.prototype.hasOwnProperty), + Object_getOwnPropertyDescriptor = Object.getOwnPropertyDescriptor, + Object_isExtensible = Object.isExtensible, + Object_getOwnPropertyNames = Object.getOwnPropertyNames; + + // Return true iff ES6 Type(v) isn't Object. + // Note that `typeof document.all === "undefined"`. + function isPrimitive(v) { + return (v === null || + v === undefined || + typeof v === "boolean" || + typeof v === "number" || + typeof v === "string" || + typeof v === "symbol"); + } + + function assertSameValue(a, b, msg) { + try { + assertEq(a, b); + } catch (exc) { + throw Error_(exc.message + (msg ? " " + msg : "")); + } + } + + function assertSameClass(a, b, msg) { + var ac = Object_toString(a), bc = Object_toString(b); + assertSameValue(ac, bc, msg); + switch (ac) { + case "[object Function]": + if (typeof isProxy !== "undefined" && !isProxy(a) && !isProxy(b)) + assertSameValue(Function_toString(a), Function_toString(b), msg); + } + } + + function at(prevmsg, segment) { + return prevmsg ? prevmsg + segment : "at _" + segment; + } + + // Assert that the arguments a and b are thoroughly structurally equivalent. + // + // For the sake of speed, we cut a corner: + // var x = {}, y = {}, ax = [x]; + // assertDeepEq([ax, x], [ax, y]); // passes (?!) + // + // Technically this should fail, since the two object graphs are different. + // (The graph of [ax, y] contains one more object than the graph of [ax, x].) + // + // To get technically correct behavior, pass {strictEquivalence: true}. + // This is slower because we have to walk the entire graph, and Object.prototype + // is big. + // + return function assertDeepEq(a, b, options) { + var strictEquivalence = options ? options.strictEquivalence : false; + + function assertSameProto(a, b, msg) { + check(Object_getPrototypeOf(a), Object_getPrototypeOf(b), at(msg, ".__proto__")); + } + + function failPropList(na, nb, msg) { + throw Error_("got own properties " + JSON.stringify(na) + ", expected " + JSON.stringify(nb) + + (msg ? " " + msg : "")); + } + + function assertSameProps(a, b, msg) { + var na = Object_getOwnPropertyNames(a), + nb = Object_getOwnPropertyNames(b); + if (na.length !== nb.length) + failPropList(na, nb, msg); + + // Ignore differences in whether Array elements are stored densely. + if (Array_isArray(a)) { + na.sort(); + nb.sort(); + } + + for (var i = 0; i < na.length; i++) { + var name = na[i]; + if (name !== nb[i]) + failPropList(na, nb, msg); + var da = Object_getOwnPropertyDescriptor(a, name), + db = Object_getOwnPropertyDescriptor(b, name); + var pmsg = at(msg, /^[_$A-Za-z0-9]+$/.test(name) + ? /0|[1-9][0-9]*/.test(name) ? "[" + name + "]" : "." + name + : "[" + JSON.stringify(name) + "]"); + assertSameValue(da.configurable, db.configurable, at(pmsg, ".[[Configurable]]")); + assertSameValue(da.enumerable, db.enumerable, at(pmsg, ".[[Enumerable]]")); + if (Object_hasOwnProperty(da, "value")) { + if (!Object_hasOwnProperty(db, "value")) + throw Error_("got data property, expected accessor property" + pmsg); + check(da.value, db.value, pmsg); + } else { + if (Object_hasOwnProperty(db, "value")) + throw Error_("got accessor property, expected data property" + pmsg); + check(da.get, db.get, at(pmsg, ".[[Get]]")); + check(da.set, db.set, at(pmsg, ".[[Set]]")); + } + } + }; + + const wellKnownSymbols = Reflect.ownKeys(Symbol) + .map(key => Symbol[key]) + .filter(value => typeof value === "symbol"); + + // The standard doesn't offer a convenient way to distinguish well-known + // symbols from user-created symbols. + function isSimilarSymbol(a, b) { + // Fast path for same symbols. + if (a === b) { + return true; + } + + // 1. Symbol descriptions must match. + // 2. Either both symbols are in the registry or none is. + // 3. Neither symbol must be a well-known symbol, because those are + // already handled through the fast path. + return Symbol_description(a) === Symbol_description(b) && + Symbol_keyFor(a) === Symbol_keyFor(b) && + !Array_includes(wellKnownSymbols, a) && + !Array_includes(wellKnownSymbols, b); + } + + var ab = new Map_(); + var bpath = new Map_(); + + function check(a, b, path) { + if (typeof a === "symbol") { + // Symbols are primitives, but they have identity. + // Symbol("x") !== Symbol("x") but + // assertDeepEq(Symbol("x"), Symbol("x")) should pass. + if (typeof b !== "symbol") { + throw Error_("got " + String(a) + ", expected " + String(b) + " " + path); + } else if (!isSimilarSymbol(a, b)) { + throw Error_("got " + String(a) + ", expected " + String(b) + " " + path); + } else if (Map_has(ab, a)) { + assertSameValue(Map_get(ab, a), b, path); + } else if (Map_has(bpath, b)) { + var bPrevPath = Map_get(bpath, b) || "_"; + throw Error_("got distinct symbols " + at(path, "") + " and " + + at(bPrevPath, "") + ", expected the same symbol both places"); + } else { + Map_set(ab, a, b); + Map_set(bpath, b, path); + } + } else if (isPrimitive(a)) { + assertSameValue(a, b, path); + } else if (isPrimitive(b)) { + throw Error_("got " + Object_toString(a) + ", expected " + String(b) + " " + path); + } else if (Map_has(ab, a)) { + assertSameValue(Map_get(ab, a), b, path); + } else if (Map_has(bpath, b)) { + var bPrevPath = Map_get(bpath, b) || "_"; + throw Error_("got distinct objects " + at(path, "") + " and " + at(bPrevPath, "") + + ", expected the same object both places"); + } else { + Map_set(ab, a, b); + Map_set(bpath, b, path); + if (a !== b || strictEquivalence) { + assertSameClass(a, b, path); + assertSameProto(a, b, path); + assertSameProps(a, b, path); + assertSameValue(Object_isExtensible(a), + Object_isExtensible(b), + at(path, ".[[Extensible]]")); + } + } + } + + check(a, b, ""); + }; + })(); + +})(); diff --git a/harness/sm/non262-strict-shell.js b/harness/sm/non262-strict-shell.js new file mode 100644 index 0000000000..198de81071 --- /dev/null +++ b/harness/sm/non262-strict-shell.js @@ -0,0 +1,69 @@ +/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */ + +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +/*--- +defines: [testLenientAndStrict, parsesSuccessfully, parseRaisesException, returns] +allow_unused: True +---*/ +(function(global) { + + /* + * Return true if both of these return true: + * - LENIENT_PRED applied to CODE + * - STRICT_PRED applied to CODE with a use strict directive added to the front + * + * Run STRICT_PRED first, for testing code that affects the global environment + * in loose mode, but fails in strict mode. + */ + global.testLenientAndStrict = function testLenientAndStrict(code, lenient_pred, strict_pred) { + return (strict_pred("'use strict'; " + code) && + lenient_pred(code)); + } + + /* + * parsesSuccessfully(CODE) returns true if CODE parses as function + * code without an error. + */ + global.parsesSuccessfully = function parsesSuccessfully(code) { + try { + Function(code); + return true; + } catch (exception) { + return false; + } + }; + + /* + * parseRaisesException(EXCEPTION)(CODE) returns true if parsing CODE + * as function code raises EXCEPTION. + */ + global.parseRaisesException = function parseRaisesException(exception) { + return function (code) { + try { + Function(code); + return false; + } catch (actual) { + return exception.prototype.isPrototypeOf(actual); + } + }; + }; + + /* + * returns(VALUE)(CODE) returns true if evaluating CODE (as eval code) + * completes normally (rather than throwing an exception), yielding a value + * strictly equal to VALUE. + */ + global.returns = function returns(value) { + return function(code) { + try { + return eval(code) === value; + } catch (exception) { + return false; + } + } + } + +})(this); diff --git a/harness/sm/non262.js b/harness/sm/non262.js new file mode 100644 index 0000000000..c1829e3e4c --- /dev/null +++ b/harness/sm/non262.js @@ -0,0 +1,74 @@ +/*--- +defines: [printBugNumber, inSection, printStatus, writeHeaderToLog, + assertThrownErrorContains, assertThrowsInstanceOfWithMessageCheck, newGlobal, print, assertEq, reportCompare, reportMatch, createIsHTMLDDA, createExternalArrayBuffer, + enableGeckoProfilingWithSlowAssertions, enableGeckoProfiling, disableGeckoProfiling] +---*/ + +function printBugNumber() {} +function inSection() {} +function printStatus() {} +function writeHeaderToLog() {} + +function assertThrownErrorContains(f, substr) { + try { + f(); + } catch (exc) { + // Do not test error messages + return; + } + throw new Test262Error("Expected error containing " + substr + ", no exception thrown"); +} + +function assertThrowsInstanceOfWithMessageCheck(f, ctor, _check, msg) { + var fullmsg; + try { + f(); + } catch (exc) { + if (exc instanceof ctor) + return; + fullmsg = `Assertion failed: expected exception ${ctor.name}, got ${exc}`; + } + + if (fullmsg === undefined) + fullmsg = `Assertion failed: expected exception ${ctor.name}, no exception thrown`; + if (msg !== undefined) + fullmsg += " - " + msg; + + throw new Error(fullmsg); +} + +globalThis.createNewGlobal = function() { + return $262.createRealm().global +} + +function print(...args) { +} +function assertEq(...args) { + assert.sameValue(...args) +} +function reportCompare(...args) { + assert.sameValue(...args) +} + +function reportMatch(expectedRegExp, actual, description = "") { + assert.sameValue(typeof actual, "string", + `Type mismatch, expected string, actual type ${typeof actual}`); + assert.notSameValue(expectedRegExp.exec(actual), null, + `Expected match to '${expectedRegExp}', Actual value '${actual}'`); +} + +if (globalThis.createIsHTMLDDA === undefined) { + globalThis.createIsHTMLDDA = function createIsHTMLDDA() { + return $262.IsHTMLDDA; + } +} + +if (globalThis.createExternalArrayBuffer === undefined) { + globalThis.createExternalArrayBuffer = function createExternalArrayBuffer(size) { + return new ArrayBuffer(size); + } +} +if (globalThis.enableGeckoProfilingWithSlowAssertions === undefined) { + globalThis.enableGeckoProfilingWithSlowAssertions = globalThis.enableGeckoProfiling = + globalThis.disableGeckoProfiling = () => {} +} \ No newline at end of file diff --git a/test/staging/sm/Array/array-length-set-during-for-in.js b/test/staging/sm/Array/array-length-set-during-for-in.js new file mode 100644 index 0000000000..3e6c9c1ff3 --- /dev/null +++ b/test/staging/sm/Array/array-length-set-during-for-in.js @@ -0,0 +1,19 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +var a = [0, 1]; +var iterations = 0; +for (var k in a) { + iterations++; + a.length = 1; +} +assert.sameValue(iterations, 1); + diff --git a/test/staging/sm/Array/array-length-set-on-nonarray.js b/test/staging/sm/Array/array-length-set-on-nonarray.js new file mode 100644 index 0000000000..39c4448b98 --- /dev/null +++ b/test/staging/sm/Array/array-length-set-on-nonarray.js @@ -0,0 +1,33 @@ +/* + * Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/licenses/publicdomain/ + */ + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +//----------------------------------------------------------------------------- +var BUGNUMBER = 548671; +var summary = + "Don't use a shared-permanent inherited property to implement " + + "[].length or (function(){}).length"; + +print(BUGNUMBER + ": " + summary); + +/************** + * BEGIN TEST * + **************/ + +var a = []; +a.p = 1; +var x = Object.create(a); +assert.sameValue(x.length, 0); +assert.sameValue(x.p, 1); +assert.sameValue(a.length, 0); + +print("All tests passed!"); diff --git a/test/staging/sm/Array/at.js b/test/staging/sm/Array/at.js new file mode 100644 index 0000000000..17d53213c5 --- /dev/null +++ b/test/staging/sm/Array/at.js @@ -0,0 +1,48 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +function basic() { + assert.sameValue([0].at(0), 0); + assert.sameValue([0].at(-1), 0); + + assert.sameValue([].at(0), undefined); + assert.sameValue([].at(-1), undefined); + assert.sameValue([].at(1), undefined); + + assert.sameValue([0, 1].at(0), 0); + assert.sameValue([0, 1].at(1), 1); + assert.sameValue([0, 1].at(-2), 0); + assert.sameValue([0, 1].at(-1), 1); + + assert.sameValue([0, 1].at(2), undefined); + assert.sameValue([0, 1].at(-3), undefined); + assert.sameValue([0, 1].at(-4), undefined); + assert.sameValue([0, 1].at(Infinity), undefined); + assert.sameValue([0, 1].at(-Infinity), undefined); + assert.sameValue([0, 1].at(NaN), 0); // ToInteger(NaN) = 0 +} + +function obj() { + var o = {length: 0, [0]: "a", at: Array.prototype.at}; + + assert.sameValue(o.at(0), undefined); + assert.sameValue(o.at(-1), undefined); + + o.length = 1; + assert.sameValue(o.at(0), "a"); + assert.sameValue(o.at(-1), "a"); + assert.sameValue(o.at(1), undefined); + assert.sameValue(o.at(-2), undefined); +} + +basic(); +obj(); + diff --git a/test/staging/sm/Array/change-array-by-copy-cross-compartment-create.js b/test/staging/sm/Array/change-array-by-copy-cross-compartment-create.js new file mode 100644 index 0000000000..5919d1bb83 --- /dev/null +++ b/test/staging/sm/Array/change-array-by-copy-cross-compartment-create.js @@ -0,0 +1,34 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ + +function test(otherGlobal) { + let arrays = [ + ["with", otherGlobal.Array.prototype.with.call([1,2,3], 1, 3)], + ["toSpliced", otherGlobal.Array.prototype.toSpliced.call([1, 2, 3], 0, 1, 4, 5)], + ["toReversed", otherGlobal.Array.prototype.toReversed.call([1, 2, 3])], + ["toSorted", otherGlobal.Array.prototype.toSorted.call([1, 2, 3], (x, y) => y > x)] + ] + + // Test that calling each method in a different compartment returns an array, and that + // the returned array's prototype matches the other compartment's Array prototype, + // not this one. + for (const [name, arr] of arrays) { + assert.sameValue(arr instanceof Array, false, name + " returned an instance of Array"); + assert.sameValue(arr instanceof otherGlobal.Array, true, name + " did not return an instance of new global's Array"); + assert.sameValue(Object.getPrototypeOf(arr) !== Object.getPrototypeOf([1, 2, 3]), true, + name + " returned an object with a prototype from the wrong realm"); + } +} + +test(createNewGlobal()); +test(createNewGlobal({newCompartment: true})); + diff --git a/test/staging/sm/Array/change-array-by-copy-errors-from-correct-realm.js b/test/staging/sm/Array/change-array-by-copy-errors-from-correct-realm.js new file mode 100644 index 0000000000..55683fc68e --- /dev/null +++ b/test/staging/sm/Array/change-array-by-copy-errors-from-correct-realm.js @@ -0,0 +1,85 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ + +function test(otherGlobal) { + assert.sameValue(TypeError !== otherGlobal.TypeError, true); + assert.sameValue(Object.getPrototypeOf(TypeError) !== Object.getPrototypeOf(otherGlobal.TypeError), true); + assert.sameValue(RangeError !== otherGlobal.RangeError, true); + assert.sameValue(Object.getPrototypeOf(RangeError) !== Object.getPrototypeOf(otherGlobal.RangeError), true); + + + var arrayLike = { + get "0"() { + throw new Error("Get 0"); + }, + get "4294967295" () { // 2 ** 32 - 1 + throw new Error("Get 2147483648"); + }, + get "4294967296" () { // 2 ** 32 + throw new Error("Get 2147483648"); + }, + length: 2 ** 32 + }; + + let gToSorted = otherGlobal.Array.prototype.toSorted; + let gToSpliced = otherGlobal.Array.prototype.toSpliced; + let gToReversed = otherGlobal.Array.prototype.toReversed; + let gWith = otherGlobal.Array.prototype.with; + + let typeErrorCalls = [ + ["toSorted - bad comparator", () => gToSorted.call([], 5)], + ["toSorted - this is null", () => gToSorted.call(null)], + ["toSpliced - array too long", () => { + var oldLen = arrayLike.length; + arrayLike.length = 2**53 - 1; + gToSpliced.call(arrayLike, 0, 0, 1); + arrayLike.length = oldLen; + }] + ] + + let rangeErrorCalls = [ + ["toSorted - array too long", () => gToSorted.call(arrayLike)], + ["toReversed - array too long", () => gToReversed.call(arrayLike)], + ["toSpliced - adding elements would exceed max array length", () => gToSpliced.call(arrayLike, 0, 0)], + ["with - index out of range", () => gWith.call([0, 1, 2], 3, 7)], + ["with - negative index", () => gWith.call([0, 1, 2], -4, 7)], + ["with - array too long", () => gWith.call(arrayLike, 0, 0)] + ] + + // For each erroneous case, make sure the error comes from + // the other realm (not this realm) + for (const [message, f] of typeErrorCalls) { + try { + f(); + } catch (exc) { + assert.sameValue(exc instanceof TypeError, false, message + " threw TypeError from wrong realm"); + assert.sameValue(exc instanceof otherGlobal.TypeError, true, message + " didn't throw TypeError from other realm"); + assert.sameValue(Object.getPrototypeOf(exc) !== Object.getPrototypeOf(TypeError), true, + message + " TypeError has wrong prototype"); + } + } + + for (const [message, f] of rangeErrorCalls) { + try { + f(); + } catch (exc) { + assert.sameValue(exc instanceof RangeError, false, message + " threw RangeError from wrong realm"); + assert.sameValue(exc instanceof otherGlobal.RangeError, true, message + " didn't throw RangeError from other realm"); + assert.sameValue(Object.getPrototypeOf(exc) !== Object.getPrototypeOf(RangeError), true, + message + " TypeError has wrong prototype"); + } + } +} + +test(createNewGlobal()); +test(createNewGlobal({newCompartment: true})); + diff --git a/test/staging/sm/Array/concat-proxy.js b/test/staging/sm/Array/concat-proxy.js new file mode 100644 index 0000000000..0bc03e18ac --- /dev/null +++ b/test/staging/sm/Array/concat-proxy.js @@ -0,0 +1,34 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +var BUGNUMBER = 1287520; +var summary = 'Array.prototype.concat should check HasProperty everytime for non-dense array'; + +print(BUGNUMBER + ": " + summary); + +var a = [1, 2, 3]; +a.constructor = { + [Symbol.species]: function(...args) { + var p = new Proxy(new Array(...args), { + defineProperty(target, propertyKey, receiver) { + if (propertyKey === "0") delete a[1]; + return Reflect.defineProperty(target, propertyKey, receiver); + } + }); + return p; + } +}; + +var p = a.concat(); +assert.sameValue(0 in p, true); +assert.sameValue(1 in p, false); +assert.sameValue(2 in p, true); + diff --git a/test/staging/sm/Array/concat-spreadable-basic.js b/test/staging/sm/Array/concat-spreadable-basic.js new file mode 100644 index 0000000000..aac540836b --- /dev/null +++ b/test/staging/sm/Array/concat-spreadable-basic.js @@ -0,0 +1,47 @@ +/* + * Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/licenses/publicdomain/ + */ + +/*--- +flags: +- onlyStrict +includes: [deepEqual.js, sm/non262-shell.js, sm/non262.js] +description: | + pending +esid: pending +---*/ +"use strict"; + +const x = Object.freeze([1, 2, 3]); + +let fakeArray = { + [Symbol.isConcatSpreadable]: true, + length: 2, + 0: "hello", + 1: "world" +} +assert.deepEqual(x.concat(fakeArray), [1, 2, 3, "hello", "world"]); +assert.deepEqual(x.concat(fakeArray, fakeArray), [1, 2, 3, "hello", "world", "hello", "world"]); + +for (let truthy of [true, 3.41, "abc", Symbol(), {}]) { + let obj = {[Symbol.isConcatSpreadable]: truthy, length: 1, 0: "hey"} + assert.deepEqual(x.concat(obj), [1, 2, 3, "hey"]); +} + +for (let notTruthy of [null, undefined, false, 0, NaN, ""]) { + let obj = {[Symbol.isConcatSpreadable]: notTruthy, length: 1, 0: "hey"} + assert.deepEqual(x.concat(obj), [1, 2, 3, obj]); +} + +let array = [5, 4]; +assert.deepEqual(x.concat(array), [1, 2, 3, 5, 4]); + +// Can make arrays non-spreadable +array[Symbol.isConcatSpreadable] = false; +assert.deepEqual(x.concat(array), [1, 2, 3, [5, 4]]); + +// Explicitly spreadable +array[Symbol.isConcatSpreadable] = true; +assert.deepEqual(x.concat(array), [1, 2, 3, 5, 4]); + diff --git a/test/staging/sm/Array/concat-spreadable-primitive.js b/test/staging/sm/Array/concat-spreadable-primitive.js new file mode 100644 index 0000000000..d4e31318f9 --- /dev/null +++ b/test/staging/sm/Array/concat-spreadable-primitive.js @@ -0,0 +1,44 @@ +/* + * Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/licenses/publicdomain/ + */ + +/*--- +flags: +- onlyStrict +includes: [deepEqual.js, sm/non262-shell.js, sm/non262.js] +description: | + pending +esid: pending +---*/ +"use strict"; + +// Primitive values should never be tried to spread +let primitives = [ + 10, + false, + Symbol() + // Can't change String.prototype.length +]; + +for (let value of primitives) { + let prototype = Object.getPrototypeOf(value); + prototype[Symbol.isConcatSpreadable] = true; + + Object.defineProperty(prototype, "length", { + configurable: true, + get() { + // Should never invoke length getter + assert.sameValue(true, false); + }, + }); + + let x = [1, 2].concat(value); + assert.deepEqual(x, [1, 2, value]); + + delete prototype[Symbol.isConcatSpreadable]; + delete prototype.length; + + prototype.length; +} + diff --git a/test/staging/sm/Array/fill.js b/test/staging/sm/Array/fill.js new file mode 100644 index 0000000000..fe04279359 --- /dev/null +++ b/test/staging/sm/Array/fill.js @@ -0,0 +1,104 @@ +/* + * Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/licenses/publicdomain/ + */ + +/*--- +includes: [deepEqual.js, sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +//----------------------------------------------------------------------------- +var BUGNUMBER = 911147; +var summary = 'Array.prototype.fill'; + +print(BUGNUMBER + ": " + summary); + +/************** + * BEGIN TEST * + **************/ + +assert.sameValue(typeof [].fill, 'function'); +assert.sameValue([].fill.length, 1); + +// Default values for arguments and absolute values for negative start and end +// arguments are resolved correctly. +assert.deepEqual([].fill(1), []); +assert.deepEqual([1,1,1].fill(2), [2,2,2]); +assert.deepEqual([1,1,1].fill(2, 1), [1,2,2]); +assert.deepEqual([1,1,1].fill(2, 1, 2), [1,2,1]); +assert.deepEqual([1,1,1].fill(2, -2), [1,2,2]); +assert.deepEqual([1,1,1].fill(2, -2, -1), [1,2,1]); +assert.deepEqual([1,1,1].fill(2, undefined), [2,2,2]); +assert.deepEqual([1,1,1].fill(2, undefined, undefined), [2,2,2]); +assert.deepEqual([1,1,1].fill(2, 1, undefined), [1,2,2]); +assert.deepEqual([1,1,1].fill(2, undefined, 1), [2,1,1]); +assert.deepEqual([1,1,1].fill(2, 2, 1), [1,1,1]); +assert.deepEqual([1,1,1].fill(2, -1, 1), [1,1,1]); +assert.deepEqual([1,1,1].fill(2, -2, 1), [1,1,1]); +assert.deepEqual([1,1,1].fill(2, 1, -2), [1,1,1]); +assert.deepEqual([1,1,1].fill(2, 0.1), [2,2,2]); +assert.deepEqual([1,1,1].fill(2, 0.9), [2,2,2]); +assert.deepEqual([1,1,1].fill(2, 1.1), [1,2,2]); +assert.deepEqual([1,1,1].fill(2, 0.1, 0.9), [1,1,1]); +assert.deepEqual([1,1,1].fill(2, 0.1, 1.9), [2,1,1]); +assert.deepEqual([1,1,1].fill(2, 0.1, 1.9), [2,1,1]); +assert.deepEqual([1,1,1].fill(2, -0), [2,2,2]); +assert.deepEqual([1,1,1].fill(2, 0, -0), [1,1,1]); +assert.deepEqual([1,1,1].fill(2, NaN), [2,2,2]); +assert.deepEqual([1,1,1].fill(2, 0, NaN), [1,1,1]); +assert.deepEqual([1,1,1].fill(2, false), [2,2,2]); +assert.deepEqual([1,1,1].fill(2, true), [1,2,2]); +assert.deepEqual([1,1,1].fill(2, "0"), [2,2,2]); +assert.deepEqual([1,1,1].fill(2, "1"), [1,2,2]); +assert.deepEqual([1,1,1].fill(2, "-2"), [1,2,2]); +assert.deepEqual([1,1,1].fill(2, "-2", "-1"), [1,2,1]); +assert.deepEqual([1,1,1].fill(2, {valueOf: ()=>1}), [1,2,2]); +assert.deepEqual([1,1,1].fill(2, 0, {valueOf: ()=>1}), [2,1,1]); + +// fill works generically for objects, too. +assert.deepEqual([].fill.call({length: 2}, 2), {0: 2, 1: 2, length: 2}); + +var setterCalled = false; +var objWithSetter = {set "0"(val) { setterCalled = true}, length: 1}; +[].fill.call(objWithSetter, 2); +assert.sameValue(setterCalled, true); + +var setHandlerCallCount = 0; +var proxy = new Proxy({length: 3}, {set(t, i, v, r) { setHandlerCallCount++; return true; }}); +[].fill.call(proxy, 2); +assert.sameValue(setHandlerCallCount, 3); + +var valueOfCallCount = 0; +var typedArray = new Uint8ClampedArray(3); +[].fill.call(typedArray, {valueOf: function() {valueOfCallCount++; return 2000;}}); +assert.sameValue(valueOfCallCount, 3); +assert.sameValue(typedArray[0], 0xff); + +// All remaining cases should throw. +var objWithGetterOnly = {get "0"() {return 1;}, length: 1}; + +var objWithReadOnlyProp = {length: 1}; +Object.defineProperty(objWithReadOnlyProp, 0, {value: 1, writable: false}); + +var objWithNonconfigurableProp = {length: 1}; +Object.defineProperty(objWithNonconfigurableProp, 0, {value: 1, configurable: false}); + +var frozenObj = {length: 1}; +Object.freeze(frozenObj); + +var frozenArray = [1, 1, 1]; +Object.freeze(frozenArray); + +assertThrowsInstanceOf(() => [].fill.call(objWithGetterOnly, 2), TypeError); +assertThrowsInstanceOf(() => [].fill.call(objWithReadOnlyProp, 2), TypeError); +assertThrowsInstanceOf(() => [].fill.call(objWithNonconfigurableProp, 2), TypeError); +assertThrowsInstanceOf(() => [].fill.call(frozenObj, 2), TypeError); +assertThrowsInstanceOf(() => [].fill.call(frozenArray, 2), TypeError); +assertThrowsInstanceOf(() => [].fill.call("111", 2), TypeError); +assertThrowsInstanceOf(() => [].fill.call(null, 2), TypeError); +assertThrowsInstanceOf(() => [].fill.call(undefined, 2), TypeError); + diff --git a/test/staging/sm/Array/for_of_1.js b/test/staging/sm/Array/for_of_1.js new file mode 100644 index 0000000000..bf917223fe --- /dev/null +++ b/test/staging/sm/Array/for_of_1.js @@ -0,0 +1,147 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +// Test corner cases of for-of iteration over Arrays. +// The current SetObject::construct method uses a ForOfIterator to extract +// values from the array, so we use that mechanism to test ForOfIterator here. + +// Test the properties and prototype of a generator object. +function TestManySmallArrays() { + function doIter(f, arr) { + return f(...new Set(arr)); + } + + function fun(a, b, c) { + var result = 0; + for (var i = 0; i < arguments.length; i++) + result += arguments[i]; + return result; + } + + + var TRUE_SUM = 0; + var N = 100; + var M = 3; + var sum = 0; + for (var i = 0; i < N; i++) { + var arr = new Array(M); + for (var j = 0; j < M; j++) { + arr[j] = j; + TRUE_SUM += j; + } + sum += doIter(fun, arr); + } + assert.sameValue(sum, TRUE_SUM); +} +TestManySmallArrays(); + +// Test the properties and prototype of a generator object. +function TestSingleSmallArray() { + function doIter(f, arr) { + return f(...new Set(arr)); + } + + function fun(a, b, c) { + var result = 0; + for (var i = 0; i < arguments.length; i++) + result += arguments[i]; + return result; + } + + + var TRUE_SUM = 0; + var N = 100; + var M = 3; + var arr = new Array(M); + for (var j = 0; j < M; j++) { + arr[j] = j; + TRUE_SUM += j; + } + TRUE_SUM *= N; + + var sum = 0; + for (var i = 0; i < N; i++) { + sum += doIter(fun, arr); + } + assert.sameValue(sum, TRUE_SUM); +} +TestSingleSmallArray(); + + +function TestChangeArrayPrototype() { + function doIter(f, arr) { + return f(...new Set(arr)); + } + + function fun(a, b, c) { + var result = 0; + for (var i = 0; i < arguments.length; i++) + result += arguments[i]; + return result; + } + + var Proto1 = Object.create(Array.prototype); + + var TRUE_SUM = 0; + var N = 100; + var MID = N/2; + var M = 3; + var arr = new Array(M); + var ARR_SUM = 0; + for (var j = 0; j < M; j++) { + arr[j] = j; + ARR_SUM += j; + } + + var sum = 0; + for (var i = 0; i < N; i++) { + sum += doIter(fun, arr); + if (i == MID) + arr.__proto__ = Proto1; + TRUE_SUM += ARR_SUM; + } + assert.sameValue(sum, TRUE_SUM); +} +TestChangeArrayPrototype(); + + +function TestChangeManyArrayShape() { + function doIter(f, arr) { + return f(...new Set(arr)); + } + + function fun(a, b, c) { + var result = 0; + for (var i = 0; i < arguments.length; i++) + result += arguments[i]; + return result; + } + + var TRUE_SUM = 0; + var N = 100; + var MID = N/2; + var M = 3; + var sum = 0; + for (var i = 0; i < N; i++) { + var arr = new Array(M); + var ARR_SUM = 0; + for (var j = 0; j < M; j++) { + arr[j] = j; + ARR_SUM += j; + } + arr['v_' + i] = i; + sum += doIter(fun, arr); + TRUE_SUM += ARR_SUM; + } + assert.sameValue(sum, TRUE_SUM); +} +TestChangeManyArrayShape(); + diff --git a/test/staging/sm/Array/for_of_2.js b/test/staging/sm/Array/for_of_2.js new file mode 100644 index 0000000000..5c9281d339 --- /dev/null +++ b/test/staging/sm/Array/for_of_2.js @@ -0,0 +1,67 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +// Test corner cases of for-of iteration over Arrays. +// The current SetObject::construct method uses a ForOfIterator to extract +// values from the array, so we use that mechanism to test ForOfIterator here. + +// +// Check case where ArrayIterator.prototype.next changes in the middle of iteration. +// +function TestChangeArrayIteratorNext() { + function doIter(f, arr) { + return f(...new Set(arr)); + } + + function fun(a, b, c) { + var result = 0; + for (var i = 0; i < arguments.length; i++) + result += arguments[i]; + return result; + } + + var GET_COUNT = 0; + function getter() { + GET_COUNT++; + if (GET_COUNT == MID) + iterProto.next = NewNext; + return M2; + } + + var iter = ([])[Symbol.iterator](); + var iterProto = Object.getPrototypeOf(iter); + var OldNext = iterProto.next; + var NewNext = function () { + return OldNext.apply(this, arguments); + }; + + var TRUE_SUM = 0; + var N = 100; + var MID = N/2; + var M = 3; + var arr = new Array(M); + var ARR_SUM = 0; + for (var j = 0; j < M; j++) { + arr[j] = j; + ARR_SUM += j; + } + var M2 = (M/2)|0; + Object.defineProperty(arr, M2, {'get':getter}); + + var sum = 0; + for (var i = 0; i < N; i++) { + sum += doIter(fun, arr); + TRUE_SUM += ARR_SUM; + } + assert.sameValue(sum, TRUE_SUM); +} +TestChangeArrayIteratorNext(); + diff --git a/test/staging/sm/Array/for_of_3.js b/test/staging/sm/Array/for_of_3.js new file mode 100644 index 0000000000..bc8dbfbd9f --- /dev/null +++ b/test/staging/sm/Array/for_of_3.js @@ -0,0 +1,69 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +// Test corner cases of for-of iteration over Arrays. +// The current SetObject::construct method uses a ForOfIterator to extract +// values from the array, so we use that mechanism to test ForOfIterator here. + +// +// Check array length increases changes during iteration. +// +function TestIncreaseArrayLength() { + function doIter(f, arr) { + return f(...new Set(arr)); + } + + function fun(a, b, c) { + var result = 0; + for (var i = 0; i < arguments.length; i++) + result += arguments[i]; + return result; + } + + var GET_COUNT = 0; + function getter() { + GET_COUNT++; + if (GET_COUNT == MID) { + ARR_SUM += arr.length; + arr.push(arr.length); + } + return M2; + } + + var iter = ([])[Symbol.iterator](); + var iterProto = Object.getPrototypeOf(iter); + var OldNext = iterProto.next; + var NewNext = function () { + return OldNext.apply(this, arguments); + }; + + var TRUE_SUM = 0; + var N = 100; + var MID = N/2; + var M = 3; + var arr = new Array(M); + var ARR_SUM = 0; + for (var j = 0; j < M; j++) { + arr[j] = j; + ARR_SUM += j; + } + var M2 = (M/2)|0; + Object.defineProperty(arr, M2, {'get':getter}); + + var sum = 0; + for (var i = 0; i < N; i++) { + sum += doIter(fun, arr); + TRUE_SUM += ARR_SUM; + } + assert.sameValue(sum, TRUE_SUM); +} +TestIncreaseArrayLength(); + diff --git a/test/staging/sm/Array/for_of_4.js b/test/staging/sm/Array/for_of_4.js new file mode 100644 index 0000000000..333d15894c --- /dev/null +++ b/test/staging/sm/Array/for_of_4.js @@ -0,0 +1,73 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +// Test corner cases of for-of iteration over Arrays. +// The current SetObject::construct method uses a ForOfIterator to extract +// values from the array, so we use that mechanism to test ForOfIterator here. + +// +// Check array length decreases changes during iteration. +// +function TestDecreaseArrayLength() { + function doIter(f, arr) { + return f(...new Set(arr)); + } + + function fun(a, b, c) { + var result = 0; + for (var i = 0; i < arguments.length; i++) + result += arguments[i]; + return result; + } + + var GET_COUNT = 0; + function getter() { + GET_COUNT++; + if (GET_COUNT == MID) { + arr.length = 0; + } + return M2; + } + + var iter = ([])[Symbol.iterator](); + var iterProto = Object.getPrototypeOf(iter); + var OldNext = iterProto.next; + var NewNext = function () { + return OldNext.apply(this, arguments); + }; + + var TRUE_SUM = 0; + var N = 100; + var MID = N/2; + var M = 3; + var arr = new Array(M); + var ARR_SUM = 0; + for (var j = 0; j < M; j++) { + arr[j] = j; + ARR_SUM += j; + } + var M2 = (M/2)|0; + Object.defineProperty(arr, M2, {'get':getter}); + + var sum = 0; + for (var i = 0; i < N; i++) { + var oldLen = arr.length; + sum += doIter(fun, arr); + var newLen = arr.length; + if (oldLen == newLen) + TRUE_SUM += arr.length > 0 ? ARR_SUM : 0; + else + TRUE_SUM += 1 + } + assert.sameValue(sum, TRUE_SUM); +} +TestDecreaseArrayLength(); + diff --git a/test/staging/sm/Array/from-iterator-close.js b/test/staging/sm/Array/from-iterator-close.js new file mode 100644 index 0000000000..620a199b4b --- /dev/null +++ b/test/staging/sm/Array/from-iterator-close.js @@ -0,0 +1,192 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +var BUGNUMBER = 1180306; +var summary = 'Array.from should close iterator on error'; + +print(BUGNUMBER + ": " + summary); + +function test(ctor, { mapVal=undefined, + nextVal=undefined, + nextThrowVal=undefined, + modifier=undefined, + exceptionVal=undefined, + exceptionType=undefined, + closed=true }) { + let iterable = { + closed: false, + [Symbol.iterator]() { + let iterator = { + first: true, + next() { + if (this.first) { + this.first = false; + if (nextThrowVal) + throw nextThrowVal; + return nextVal; + } + return { value: undefined, done: true }; + }, + return() { + iterable.closed = true; + return {}; + } + }; + if (modifier) + modifier(iterator, iterable); + + return iterator; + } + }; + if (exceptionVal) { + let caught = false; + try { + ctor.from(iterable, mapVal); + } catch (e) { + assert.sameValue(e, exceptionVal); + caught = true; + } + assert.sameValue(caught, true); + } else if (exceptionType) { + assertThrowsInstanceOf(() => ctor.from(iterable, mapVal), exceptionType); + } else { + ctor.from(iterable, mapVal); + } + assert.sameValue(iterable.closed, closed); +} + +// == Error cases with close == + +// ES 2017 draft 22.1.2.1 step 5.e.i.1. +// Cannot test. + +// ES 2017 draft 22.1.2.1 step 5.e.vi.2. +test(Array, { + mapVal: () => { throw "map throws"; }, + nextVal: { value: 1, done: false }, + exceptionVal: "map throws", + closed: true, +}); + +// ES 2017 draft 22.1.2.1 step 5.e.ix. +class MyArray extends Array { + constructor() { + return new Proxy({}, { + defineProperty() { + throw "defineProperty throws"; + } + }); + } +} +test(MyArray, { + nextVal: { value: 1, done: false }, + exceptionVal: "defineProperty throws", + closed: true, +}); + +// ES 2021 draft 7.4.6 step 5. +// if GetMethod fails, the thrown value should be ignored. +test(MyArray, { + nextVal: { value: 1, done: false }, + modifier: (iterator, iterable) => { + Object.defineProperty(iterator, "return", { + get: function() { + iterable.closed = true; + throw "return getter throws"; + } + }); + }, + exceptionVal: "defineProperty throws", + closed: true, +}); +test(MyArray, { + nextVal: { value: 1, done: false }, + modifier: (iterator, iterable) => { + Object.defineProperty(iterator, "return", { + get: function() { + iterable.closed = true; + return "non object"; + } + }); + }, + exceptionVal: "defineProperty throws", + closed: true, +}); +test(MyArray, { + nextVal: { value: 1, done: false }, + modifier: (iterator, iterable) => { + Object.defineProperty(iterator, "return", { + get: function() { + iterable.closed = true; + // Non callable. + return {}; + } + }); + }, + exceptionVal: "defineProperty throws", + closed: true, +}); + +// ES 2017 draft 7.4.6 steps 6. +// if return method throws, the thrown value should be ignored. +test(MyArray, { + nextVal: { value: 1, done: false }, + modifier: (iterator, iterable) => { + iterator.return = function() { + iterable.closed = true; + throw "return throws"; + }; + }, + exceptionVal: "defineProperty throws", + closed: true, +}); + +test(MyArray, { + nextVal: { value: 1, done: false }, + modifier: (iterator, iterable) => { + iterator.return = function() { + iterable.closed = true; + return "non object"; + }; + }, + exceptionVal: "defineProperty throws", + closed: true, +}); + +// == Error cases without close == + +// ES 2017 draft 22.1.2.1 step 5.e.iii. +test(Array, { + nextThrowVal: "next throws", + exceptionVal: "next throws", + closed: false, +}); + +test(Array, { + nextVal: { value: {}, get done() { throw "done getter throws"; } }, + exceptionVal: "done getter throws", + closed: false, +}); + +// ES 2017 draft 22.1.2.1 step 5.e.v. +test(Array, { + nextVal: { get value() { throw "value getter throws"; }, done: false }, + exceptionVal: "value getter throws", + closed: false, +}); + +// == Successful cases == + +test(Array, { + nextVal: { value: 1, done: false }, + closed: false, +}); + diff --git a/test/staging/sm/Array/from_basics.js b/test/staging/sm/Array/from_basics.js new file mode 100644 index 0000000000..7f40ef5126 --- /dev/null +++ b/test/staging/sm/Array/from_basics.js @@ -0,0 +1,59 @@ +/* + * Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/licenses/publicdomain/ + */ + +/*--- +includes: [deepEqual.js, sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +// Array.from copies arrays. +var src = [1, 2, 3], copy = Array.from(src); +assert.sameValue(copy === src, false); +assert.sameValue(Array.isArray(copy), true); +assert.deepEqual(copy, src); + +// Non-element properties are not copied. +var a = [0, 1]; +a.name = "lisa"; +assert.deepEqual(Array.from(a), [0, 1]); + +// It's a shallow copy. +src = [[0], [1]]; +copy = Array.from(src); +assert.sameValue(copy[0], src[0]); +assert.sameValue(copy[1], src[1]); + +// Array.from can copy non-iterable objects, if they're array-like. +src = {0: "zero", 1: "one", length: 2}; +copy = Array.from(src); +assert.sameValue(Array.isArray(copy), true); +assert.deepEqual(copy, ["zero", "one"]); + +// Properties past the .length are not copied. +src = {0: "zero", 1: "one", 2: "two", 9: "nine", name: "lisa", length: 2}; +assert.deepEqual(Array.from(src), ["zero", "one"]); + +// If an object has neither an @@iterator method nor .length, +// then it's treated as zero-length. +assert.deepEqual(Array.from({}), []); + +// Source object property order doesn't matter. +src = {length: 2, 1: "last", 0: "first"}; +assert.deepEqual(Array.from(src), ["first", "last"]); + +// Array.from does not preserve holes. +assert.deepEqual(Array.from(Array(3)), [undefined, undefined, undefined]); +assert.deepEqual(Array.from([, , 2, 3]), [undefined, undefined, 2, 3]); +assert.deepEqual(Array.from([0, , , ,]), [0, undefined, undefined, undefined]); + +// Even on non-iterable objects. +assert.deepEqual(Array.from({length: 4}), [undefined, undefined, undefined, undefined]); + +// Array.from should coerce negative lengths to zero. +assert.deepEqual(Array.from({length: -1}), []); + diff --git a/test/staging/sm/Array/from_constructor.js b/test/staging/sm/Array/from_constructor.js new file mode 100644 index 0000000000..a1322347d8 --- /dev/null +++ b/test/staging/sm/Array/from_constructor.js @@ -0,0 +1,64 @@ +/* + * Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/licenses/publicdomain/ + */ + +/*--- +includes: [deepEqual.js, sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +// Array.from can be applied to any constructor. +// For example, the Date builtin constructor. +var d = Array.from.call(Date, ["A", "B"]); +assert.sameValue(Array.isArray(d), false); +assert.sameValue(Object.prototype.toString.call(d), "[object Date]"); +assert.sameValue(Object.getPrototypeOf(d), Date.prototype); +assert.sameValue(d.length, 2); +assert.sameValue(d[0], "A"); +assert.sameValue(d[1], "B"); + +// Or Object. +var obj = Array.from.call(Object, []); +assert.sameValue(Array.isArray(obj), false); +assert.sameValue(Object.getPrototypeOf(obj), Object.prototype); +assert.sameValue(Object.getOwnPropertyNames(obj).join(","), "length"); +assert.sameValue(obj.length, 0); + +// Or any JS function. +function C(arg) { + this.args = arguments; +} +var c = Array.from.call(C, {length: 1, 0: "zero"}); +assert.sameValue(c instanceof C, true); +assert.sameValue(c.args.length, 1); +assert.sameValue(c.args[0], 1); +assert.sameValue(c.length, 1); +assert.sameValue(c[0], "zero"); + +// If the 'this' value passed to Array.from is not a constructor, +// a plain Array is created. +var arr = [3, 4, 5]; +var nonconstructors = [ + {}, Math, Object.getPrototypeOf, undefined, 17, + () => ({}) // arrow functions are not constructors +]; +for (var v of nonconstructors) { + obj = Array.from.call(v, arr); + assert.sameValue(Array.isArray(obj), true); + assert.deepEqual(obj, arr); +} + +// Array.from does not get confused if global.Array is replaced with another +// constructor. +function NotArray() { +} +var RealArray = Array; +NotArray.from = Array.from; +Array = NotArray; +assert.sameValue(RealArray.from([1]) instanceof RealArray, true); +assert.sameValue(NotArray.from([1]) instanceof NotArray, true); + diff --git a/test/staging/sm/Array/from_errors.js b/test/staging/sm/Array/from_errors.js new file mode 100644 index 0000000000..efbaa04223 --- /dev/null +++ b/test/staging/sm/Array/from_errors.js @@ -0,0 +1,160 @@ +/* + * Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/licenses/publicdomain/ + */ + +/*--- +includes: [deepEqual.js, sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +// Array.from throws if the argument is undefined or null. +assertThrowsInstanceOf(() => Array.from(), TypeError); +assertThrowsInstanceOf(() => Array.from(undefined), TypeError); +assertThrowsInstanceOf(() => Array.from(null), TypeError); + +// Array.from throws if an element can't be defined on the new object. +function ObjectWithReadOnlyElement() { + Object.defineProperty(this, "0", {value: null}); + this.length = 0; +} +ObjectWithReadOnlyElement.from = Array.from; +assert.deepEqual(ObjectWithReadOnlyElement.from([]), new ObjectWithReadOnlyElement); +assertThrowsInstanceOf(() => ObjectWithReadOnlyElement.from([1]), TypeError); + +// The same, but via preventExtensions. +function InextensibleObject() { + Object.preventExtensions(this); +} +InextensibleObject.from = Array.from; +assertThrowsInstanceOf(() => InextensibleObject.from([1]), TypeError); + +// We will now test this property, that Array.from throws if the .length can't +// be assigned, using several different kinds of object. +var obj; +function init(self) { + obj = self; + self[0] = self[1] = self[2] = self[3] = 0; +} + +function testUnsettableLength(C, Exc) { + if (Exc === undefined) + Exc = TypeError; // the usual expected exception type + C.from = Array.from; + + obj = null; + assertThrowsInstanceOf(() => C.from([]), Exc); + assert.sameValue(obj instanceof C, true); + for (var i = 0; i < 4; i++) + assert.sameValue(obj[0], 0); + + obj = null; + assertThrowsInstanceOf(() => C.from([0, 10, 20, 30]), Exc); + assert.sameValue(obj instanceof C, true); + for (var i = 0; i < 4; i++) + assert.sameValue(obj[i], i * 10); +} + +// Array.from throws if the new object's .length can't be assigned because +// there is no .length and the object is inextensible. +function InextensibleObject4() { + init(this); + Object.preventExtensions(this); +} +testUnsettableLength(InextensibleObject4); + +// Array.from throws if the new object's .length can't be assigned because it's +// read-only. +function ObjectWithReadOnlyLength() { + init(this); + Object.defineProperty(this, "length", {configurable: true, writable: false, value: 4}); +} +testUnsettableLength(ObjectWithReadOnlyLength); + +// The same, but using a builtin type. +Uint8Array.from = Array.from; +assertThrowsInstanceOf(() => Uint8Array.from([]), TypeError); + +// Array.from throws if the new object's .length can't be assigned because it +// inherits a readonly .length along the prototype chain. +function ObjectWithInheritedReadOnlyLength() { + init(this); +} +Object.defineProperty(ObjectWithInheritedReadOnlyLength.prototype, + "length", + {configurable: true, writable: false, value: 4}); +testUnsettableLength(ObjectWithInheritedReadOnlyLength); + +// The same, but using an object with a .length getter but no setter. +function ObjectWithGetterOnlyLength() { + init(this); + Object.defineProperty(this, "length", {configurable: true, get: () => 4}); +} +testUnsettableLength(ObjectWithGetterOnlyLength); + +// The same, but with a setter that throws. +function ObjectWithThrowingLengthSetter() { + init(this); + Object.defineProperty(this, "length", { + configurable: true, + get: () => 4, + set: () => { throw new RangeError("surprise!"); } + }); +} +testUnsettableLength(ObjectWithThrowingLengthSetter, RangeError); + +// Array.from throws if mapfn is neither callable nor undefined. +assertThrowsInstanceOf(() => Array.from([3, 4, 5], {}), TypeError); +assertThrowsInstanceOf(() => Array.from([3, 4, 5], "also not a function"), TypeError); +assertThrowsInstanceOf(() => Array.from([3, 4, 5], null), TypeError); + +// Even if the function would not have been called. +assertThrowsInstanceOf(() => Array.from([], JSON), TypeError); + +// If mapfn is not undefined and not callable, the error happens before anything else. +// Before calling the constructor, before touching the arrayLike. +var log = ""; +function C() { + log += "C"; + obj = this; +} +var p = new Proxy({}, { + has: function () { log += "1"; }, + get: function () { log += "2"; }, + getOwnPropertyDescriptor: function () { log += "3"; } +}); +assertThrowsInstanceOf(() => Array.from.call(C, p, {}), TypeError); +assert.sameValue(log, ""); + +// If mapfn throws, the new object has already been created. +var arrayish = { + get length() { log += "l"; return 1; }, + get 0() { log += "0"; return "q"; } +}; +log = ""; +var exc = {surprise: "ponies"}; +assertThrowsValue(() => Array.from.call(C, arrayish, () => { throw exc; }), exc); +assert.sameValue(log, "lC0"); +assert.sameValue(obj instanceof C, true); + +// It's a TypeError if the @@iterator property is a primitive (except null and undefined). +for (var primitive of ["foo", 17, Symbol(), true]) { + assertThrowsInstanceOf(() => Array.from({[Symbol.iterator] : primitive}), TypeError); +} +assert.deepEqual(Array.from({[Symbol.iterator]: null}), []); +assert.deepEqual(Array.from({[Symbol.iterator]: undefined}), []); + +// It's a TypeError if the iterator's .next() method returns a primitive. +for (var primitive of [undefined, null, 17]) { + assertThrowsInstanceOf( + () => Array.from({ + [Symbol.iterator]() { + return {next() { return primitive; }}; + } + }), + TypeError); +} + diff --git a/test/staging/sm/Array/from_iterable.js b/test/staging/sm/Array/from_iterable.js new file mode 100644 index 0000000000..4e60253d5b --- /dev/null +++ b/test/staging/sm/Array/from_iterable.js @@ -0,0 +1,58 @@ +/* + * Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/licenses/publicdomain/ + */ + +/*--- +includes: [deepEqual.js, sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +// Array.from works on arguments objects. +(function () { + assert.deepEqual(Array.from(arguments), ["arg0", "arg1", undefined]); +})("arg0", "arg1", undefined); + +// If an object has both .length and [@@iterator] properties, [@@iterator] is used. +var a = ['a', 'e', 'i', 'o', 'u']; +a[Symbol.iterator] = function* () { + for (var i = 5; i--; ) + yield this[i]; +}; + +var log = ''; +function f(x) { + log += x; + return x + x; +} + +var b = Array.from(a, f); +assert.deepEqual(b, ['uu', 'oo', 'ii', 'ee', 'aa']); +assert.sameValue(log, 'uoiea'); + +// In fact, if [@@iterator] is present, .length isn't queried at all. +var pa = new Proxy(a, { + has: function (target, id) { + if (id === "length") + throw new Error(".length should not be queried (has)"); + return id in target; + }, + get: function (target, id) { + if (id === "length") + throw new Error(".length should not be queried (get)"); + return target[id]; + }, + getOwnPropertyDescriptor: function (target, id) { + if (id === "length") + throw new Error(".length should not be queried (getOwnPropertyDescriptor)"); + return Object.getOwnPropertyDescriptor(target, id) + } +}); +log = ""; +b = Array.from(pa, f); +assert.deepEqual(b, ['uu', 'oo', 'ii', 'ee', 'aa']); +assert.sameValue(log, 'uoiea'); + diff --git a/test/staging/sm/Array/from_length_setter.js b/test/staging/sm/Array/from_length_setter.js new file mode 100644 index 0000000000..8fb9082d5a --- /dev/null +++ b/test/staging/sm/Array/from_length_setter.js @@ -0,0 +1,21 @@ +/* + * Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/licenses/publicdomain/ + */ + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +// Array.from calls a length setter if present. +var hits = 0; +function C() {} +C.prototype = {set length(v) { hits++; }}; +C.from = Array.from; +var copy = C.from(["A", "B"]); +assert.sameValue(hits, 1); + diff --git a/test/staging/sm/Array/from_mapping.js b/test/staging/sm/Array/from_mapping.js new file mode 100644 index 0000000000..20f0803fb0 --- /dev/null +++ b/test/staging/sm/Array/from_mapping.js @@ -0,0 +1,49 @@ +/* + * Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/licenses/publicdomain/ + */ + +/*--- +includes: [deepEqual.js, sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +// If the mapfn argument to Array.from is undefined, don't map. +assert.deepEqual(Array.from([3, 4, 5], undefined), [3, 4, 5]); +assert.deepEqual(Array.from([4, 5, 6], undefined, Math), [4, 5, 6]); + +// mapfn is called with two arguments: value and index. +var log = []; +function f() { + log.push(Array.from(arguments)); + return log.length; +} +assert.deepEqual(Array.from(['a', 'e', 'i', 'o', 'u'], f), [1, 2, 3, 4, 5]); +assert.deepEqual(log, [['a', 0], ['e', 1], ['i', 2], ['o', 3], ['u', 4]]); + +// If the object to be copied is non-iterable, mapfn is still called with two +// arguments. +log = []; +assert.deepEqual(Array.from({0: "zero", 1: "one", length: 2}, f), [1, 2]); +assert.deepEqual(log, [["zero", 0], ["one", 1]]); + +// If the object to be copied is iterable and the constructor is not Array, +// mapfn is still called with two arguments. +log = []; +function C() {} +C.from = Array.from; +var c = new C; +c[0] = 1; +c[1] = 2; +c.length = 2; +assert.deepEqual(C.from(["zero", "one"], f), c); +assert.deepEqual(log, [["zero", 0], ["one", 1]]); + +// The mapfn is called even if the value to be mapped is undefined. +assert.deepEqual(Array.from([0, 1, , 3], String), ["0", "1", "undefined", "3"]); +var arraylike = {length: 4, "0": 0, "1": 1, "3": 3}; +assert.deepEqual(Array.from(arraylike, String), ["0", "1", "undefined", "3"]); + diff --git a/test/staging/sm/Array/from_primitive.js b/test/staging/sm/Array/from_primitive.js new file mode 100644 index 0000000000..f386afc315 --- /dev/null +++ b/test/staging/sm/Array/from_primitive.js @@ -0,0 +1,29 @@ +/* + * Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/licenses/publicdomain/ + */ + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +for (let primitive of [true, 3.14, "hello", Symbol()]) { + let prototype = Object.getPrototypeOf(primitive); + + Object.defineProperty(prototype, Symbol.iterator, { + configurable: true, + get() { + "use strict"; + assert.sameValue(this, primitive); + return () => [this][Symbol.iterator](); + }, + }); + assert.sameValue(Array.from(primitive)[0], primitive); + + delete prototype[Symbol.iterator]; +} + diff --git a/test/staging/sm/Array/from_proxy.js b/test/staging/sm/Array/from_proxy.js new file mode 100644 index 0000000000..239f01a8c7 --- /dev/null +++ b/test/staging/sm/Array/from_proxy.js @@ -0,0 +1,63 @@ +/* + * Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/licenses/publicdomain/ + */ + +/*--- +includes: [deepEqual.js, sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +// Two tests involving Array.from and a Proxy. +var log = []; +function LoggingProxy(target) { + var h = { + defineProperty: function (t, id) { + log.push("define", id); + return true; + }, + has: function (t, id) { + log.push("has", id); + return id in t; + }, + get: function (t, id) { + log.push("get", id); + return t[id]; + }, + set: function (t, id, v) { + log.push("set", id); + t[id] = v; + return true; + } + }; + return new Proxy(target || [], h); +} + +// When the new object created by Array.from is a Proxy, +// Array.from calls handler.defineProperty to create new elements +// but handler.set to set the length. +LoggingProxy.from = Array.from; +LoggingProxy.from([3, 4, 5]); +assert.deepEqual(log, ["define", "0", "define", "1", "define", "2", "set", "length"]); + +// When the argument passed to Array.from is a Proxy, Array.from +// calls handler.get on it. +log = []; +assert.deepEqual(Array.from(new LoggingProxy([3, 4, 5])), [3, 4, 5]); +assert.deepEqual(log, ["get", Symbol.iterator, + "get", "length", "get", "0", + "get", "length", "get", "1", + "get", "length", "get", "2", + "get", "length"]); + +// Array-like iteration only gets the length once. +log = []; +var arr = [5, 6, 7]; +arr[Symbol.iterator] = undefined; +assert.deepEqual(Array.from(new LoggingProxy(arr)), [5, 6, 7]); +assert.deepEqual(log, ["get", Symbol.iterator, + "get", "length", "get", "0", "get", "1", "get", "2"]); + diff --git a/test/staging/sm/Array/from_realms.js b/test/staging/sm/Array/from_realms.js new file mode 100644 index 0000000000..26b5c4a520 --- /dev/null +++ b/test/staging/sm/Array/from_realms.js @@ -0,0 +1,45 @@ +/* + * Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/licenses/publicdomain/ + */ + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +if (typeof createNewGlobal === 'function') { + // G.Array.from, where G is any global, produces an array whose prototype + // is G.Array.prototype. + var g = createNewGlobal(); + var ga = g.Array.from([1, 2, 3]); + assert.sameValue(ga instanceof g.Array, true); + + // Even if G.Array is not passed in as the 'this' value to the call. + var from = g.Array.from + var ga2 = from([1, 2, 3]); + assert.sameValue(ga2 instanceof g.Array, true); + + // Array.from can be applied to a constructor from another realm. + var p = Array.from.call(g.Array, [1, 2, 3]); + assert.sameValue(p instanceof g.Array, true); + var q = g.Array.from.call(Array, [3, 4, 5]); + assert.sameValue(q instanceof Array, true); + + // The default 'this' value received by a non-strict mapping function is + // that function's global, not Array.from's global or the caller's global. + var h = createNewGlobal(), result = undefined; + h.mainGlobal = this; + h.eval("function f() { mainGlobal.result = this; }"); + g.Array.from.call(Array, [5, 6, 7], h.f); + // (Give each global in the test a name, for better error messages. But use + // globalName, because window.name is complicated.) + this.globalName = "main"; + g.globalName = "g"; + h.globalName = "h"; + assert.sameValue(result.globalName, "h"); +} + diff --git a/test/staging/sm/Array/from_string.js b/test/staging/sm/Array/from_string.js new file mode 100644 index 0000000000..415b28fef1 --- /dev/null +++ b/test/staging/sm/Array/from_string.js @@ -0,0 +1,31 @@ +/* + * Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/licenses/publicdomain/ + */ + +/*--- +includes: [deepEqual.js, sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +// Array.from on a string iterates over the string. +assert.deepEqual(Array.from("test string"), + ['t', 'e', 's', 't', ' ', 's', 't', 'r', 'i', 'n', 'g']); + +// Array.from on a string handles surrogate pairs correctly. +var gclef = "\uD834\uDD1E"; // U+1D11E MUSICAL SYMBOL G CLEF +assert.deepEqual(Array.from(gclef), [gclef]); +assert.deepEqual(Array.from(gclef + " G"), [gclef, " ", "G"]); + +// Array.from on a string calls the @@iterator method. +String.prototype[Symbol.iterator] = function* () { yield 1; yield 2; }; +assert.deepEqual(Array.from("anything"), [1, 2]); + +// If the iterator method is deleted, Strings are still arraylike. +delete String.prototype[Symbol.iterator]; +assert.deepEqual(Array.from("works"), ['w', 'o', 'r', 'k', 's']); +assert.deepEqual(Array.from(gclef), ['\uD834', '\uDD1E']); + diff --git a/test/staging/sm/Array/from_surfaces.js b/test/staging/sm/Array/from_surfaces.js new file mode 100644 index 0000000000..deaff8e230 --- /dev/null +++ b/test/staging/sm/Array/from_surfaces.js @@ -0,0 +1,21 @@ +/* + * Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/licenses/publicdomain/ + */ + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +// Check superficial features of Array.from. +var desc = Object.getOwnPropertyDescriptor(Array, "from"); +assert.sameValue(desc.configurable, true); +assert.sameValue(desc.enumerable, false); +assert.sameValue(desc.writable, true); +assert.sameValue(Array.from.length, 1); +assertThrowsInstanceOf(() => new Array.from(), TypeError); // not a constructor + diff --git a/test/staging/sm/Array/from_this.js b/test/staging/sm/Array/from_this.js new file mode 100644 index 0000000000..ad52b78434 --- /dev/null +++ b/test/staging/sm/Array/from_this.js @@ -0,0 +1,56 @@ +/* + * Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/licenses/publicdomain/ + */ + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +// The third argument to Array.from is passed as the 'this' value to the +// mapping function. +var hits = 0, obj = {}; +function f(x) { + assert.sameValue(this, obj); + hits++; +} +Array.from(["a", "b", "c"], f, obj); +assert.sameValue(hits, 3); + +// Without an argument, undefined is passed... +hits = 0; +function gs(x) { + "use strict"; + assert.sameValue(this, undefined); + hits++; +} +Array.from("def", gs); +assert.sameValue(hits, 3); + +// ...and if the mapping function is non-strict, that means the global is +// passed. +var global = this; +hits = 0; +function g(x) { + assert.sameValue(this, global); + hits++; +} +Array.from("ghi", g); +assert.sameValue(hits, 3); + +// A primitive value can be passed. +for (var v of [0, "str", undefined]) { + hits = 0; + var mapfn = function h(x) { + "use strict"; + assert.sameValue(this, v); + hits++; + }; + Array.from("pq", mapfn, v); + assert.sameValue(hits, 2); +} + diff --git a/test/staging/sm/Array/frozen-dense-array.js b/test/staging/sm/Array/frozen-dense-array.js new file mode 100644 index 0000000000..51d363ed09 --- /dev/null +++ b/test/staging/sm/Array/frozen-dense-array.js @@ -0,0 +1,51 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +/* + * Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/licenses/publicdomain/ + * Author: Emilio Cobos Álvarez + */ +var BUGNUMBER = 1310744; +var summary = "Dense array properties shouldn't be modified when they're frozen"; + +print(BUGNUMBER + ": " + summary); + +var a = Object.freeze([4, 5, 1]); + +function assertArrayIsExpected() { + assert.sameValue(a.length, 3); + assert.sameValue(a[0], 4); + assert.sameValue(a[1], 5); + assert.sameValue(a[2], 1); +} + +assertThrowsInstanceOf(() => a.reverse(), TypeError); +assertThrowsInstanceOf(() => a.shift(), TypeError); +assertThrowsInstanceOf(() => a.unshift(0), TypeError); +assertThrowsInstanceOf(() => a.sort(function() {}), TypeError); +assertThrowsInstanceOf(() => a.pop(), TypeError); +assertThrowsInstanceOf(() => a.fill(0), TypeError); +assertThrowsInstanceOf(() => a.splice(0, 1, 1), TypeError); +assertThrowsInstanceOf(() => a.push("foo"), TypeError); +assertThrowsInstanceOf(() => { "use strict"; a.length = 5; }, TypeError); +assertThrowsInstanceOf(() => { "use strict"; a[2] = "foo"; }, TypeError); +assertThrowsInstanceOf(() => { "use strict"; delete a[0]; }, TypeError); +assertThrowsInstanceOf(() => a.splice(Math.a), TypeError); + +// Shouldn't throw, since this is not strict mode, but shouldn't change the +// value of the property. +a.length = 5; +a[2] = "foo"; +assert.sameValue(delete a[0], false); + +assertArrayIsExpected(); + diff --git a/test/staging/sm/Array/frozen-dict-mode-length.js b/test/staging/sm/Array/frozen-dict-mode-length.js new file mode 100644 index 0000000000..ac07c70f11 --- /dev/null +++ b/test/staging/sm/Array/frozen-dict-mode-length.js @@ -0,0 +1,27 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +/* + * Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/licenses/publicdomain/ + * Author: Emilio Cobos Álvarez + */ +var BUGNUMBER = 1312948; +var summary = "Freezing a dictionary mode object with a length property should make Object.isFrozen report true"; + +print(BUGNUMBER + ": " + summary); + +/* Convert to dictionary mode */ +delete Array.prototype.slice; + +Object.freeze(Array.prototype); +assert.sameValue(Object.isFrozen(Array.prototype), true); + diff --git a/test/staging/sm/Array/getter-name.js b/test/staging/sm/Array/getter-name.js new file mode 100644 index 0000000000..aa63d65506 --- /dev/null +++ b/test/staging/sm/Array/getter-name.js @@ -0,0 +1,18 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +var BUGNUMBER = 1180290; +var summary = 'Array getters should have get prefix'; + +print(BUGNUMBER + ": " + summary); + +assert.sameValue(Object.getOwnPropertyDescriptor(Array, Symbol.species).get.name, "get [Symbol.species]"); + diff --git a/test/staging/sm/Array/group-callback-evaluation.js b/test/staging/sm/Array/group-callback-evaluation.js new file mode 100644 index 0000000000..b861adce1f --- /dev/null +++ b/test/staging/sm/Array/group-callback-evaluation.js @@ -0,0 +1,27 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +var array = [1, 2, 3]; + +var calls = 0; + +var grouped = Object.groupBy(array, () => { + calls++; + + return { + toString() { + return "a"; + } + } +}); + +assert.sameValue(calls, 3); + diff --git a/test/staging/sm/Array/group-propertkey-is-length.js b/test/staging/sm/Array/group-propertkey-is-length.js new file mode 100644 index 0000000000..1f99255ebd --- /dev/null +++ b/test/staging/sm/Array/group-propertkey-is-length.js @@ -0,0 +1,24 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [deepEqual.js, sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +var array = [0]; + +var grouped = Object.groupBy(array, () => "length"); + +assert.deepEqual(grouped, Object.create(null, { + length: { + value: [0], + writable: true, + enumerable: true, + configurable: true, + }, +})); + diff --git a/test/staging/sm/Array/group.js b/test/staging/sm/Array/group.js new file mode 100644 index 0000000000..235779964c --- /dev/null +++ b/test/staging/sm/Array/group.js @@ -0,0 +1,98 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [deepEqual.js, sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +function isNeg(x) { + if (Object.is(x, -0) || x < 0) { + return true; + } + return false; +} + +{ + const a1 = [-Infinity, -2, -1, -0, 0, 1, 2, Infinity]; + const expectedObj = { neg: [-Infinity, -2, -1, -0], pos: [0, 1, 2, Infinity] }; + Object.setPrototypeOf(expectedObj, null); + + const groupedArray = Object.groupBy(a1, x => isNeg(x) ? 'neg' : 'pos'); + const mappedArray = Map.groupBy(a1, x => isNeg(x) ? 'neg' : 'pos'); + + assert.sameValue(Object.getPrototypeOf(groupedArray), null) + assert.deepEqual(groupedArray, expectedObj); + assert.deepEqual(mappedArray.get("neg"), expectedObj["neg"]); + assert.deepEqual(mappedArray.get("pos"), expectedObj["pos"]); + + + const expectedObj2 = {"undefined": [1,2,3]} + Object.setPrototypeOf(expectedObj2, null); + assert.deepEqual(Object.groupBy([1,2,3], () => {}), expectedObj2); + assert.deepEqual(Object.groupBy([], () => {}), Object.create(null)); + assert.deepEqual((Map.groupBy([1,2,3], () => {})).get(undefined), [1,2,3]); + assert.sameValue((Map.groupBy([1,2,3], () => {})).size, 1); + + const negMappedArray = Map.groupBy(a1, x => isNeg(x) ? -0 : 0); + assert.deepEqual(negMappedArray.get(0), a1); + assert.deepEqual(negMappedArray.size, 1); + + assertThrowsInstanceOf(() => Object.groupBy([], undefined), TypeError); + assertThrowsInstanceOf(() => Object.groupBy([], null), TypeError); + assertThrowsInstanceOf(() => Object.groupBy([], 0), TypeError); + assertThrowsInstanceOf(() => Object.groupBy([], ""), TypeError); + assertThrowsInstanceOf(() => Map.groupBy([], undefined), TypeError); + assertThrowsInstanceOf(() => Map.groupBy([], null), TypeError); + assertThrowsInstanceOf(() => Map.groupBy([], 0), TypeError); + assertThrowsInstanceOf(() => Map.groupBy([], ""), TypeError); +} + +const array = [ 'test' ]; +Object.defineProperty(Map.prototype, 4, { + get() { + throw new Error('monkey-patched Map get call'); + }, + set(v) { + throw new Error('monkey-patched Map set call'); + }, + has(v) { + throw new Error('monkey-patched Map has call'); + } +}); + +const map1 = Map.groupBy(array, key => key.length); + +assert.sameValue('test', map1.get(4)[0]) + +Object.defineProperty(Array.prototype, '4', { + set(v) { + throw new Error('user observable array set'); + }, + get() { + throw new Error('user observable array get'); + } +}); + +const map2 = Map.groupBy(array, key => key.length); +const arr = Object.groupBy(array, key => key.length); + +assert.sameValue('test', map2.get(4)[0]) +assert.sameValue('test', arr[4][0]) + +Object.defineProperty(Object.prototype, "foo", { + get() { throw new Error("user observable object get"); }, + set(v) { throw new Error("user observable object set"); } +}); +Object.groupBy([1, 2, 3], () => 'foo'); + +// Ensure property key is correctly accessed +count = 0; +p = Object.groupBy([1], () => ({ toString() { count++; return 10 } })); +assert.sameValue(count, 1); +Map.groupBy([1], () => ({ toString() { count++; return 10 } })); +assert.sameValue(count, 1); + diff --git a/test/staging/sm/Array/includes-trailing-holes.js b/test/staging/sm/Array/includes-trailing-holes.js new file mode 100644 index 0000000000..6f650fd2c0 --- /dev/null +++ b/test/staging/sm/Array/includes-trailing-holes.js @@ -0,0 +1,25 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +// Array with trailing hole as explicit "magic elements hole". +assert.sameValue([,].includes(), true); +assert.sameValue([,].includes(undefined), true); +assert.sameValue([,].includes(undefined, 0), true); +assert.sameValue([,].includes(null), false); +assert.sameValue([,].includes(null, 0), false); + +// Array with trailing hole with no explicit "magic elements hole". +assert.sameValue(Array(1).includes(), true); +assert.sameValue(Array(1).includes(undefined), true); +assert.sameValue(Array(1).includes(undefined, 0), true); +assert.sameValue(Array(1).includes(null), false); +assert.sameValue(Array(1).includes(null, 0), false); + diff --git a/test/staging/sm/Array/includes.js b/test/staging/sm/Array/includes.js new file mode 100644 index 0000000000..7a1f4577e1 --- /dev/null +++ b/test/staging/sm/Array/includes.js @@ -0,0 +1,65 @@ +/* + * Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/licenses/publicdomain/ + */ + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +var BUGNUMBER = 1069063; +var summary = "Implement Array.prototype.includes"; + +print(BUGNUMBER + ": " + summary); + +assert.sameValue(typeof [].includes, "function"); +assert.sameValue([].includes.length, 1); + +assertTrue([1, 2, 3].includes(2)); +assertTrue([1,,2].includes(2)); +assertTrue([1, 2, 3].includes(2, 1)); +assertTrue([1, 2, 3].includes(2, -2)); +assertTrue([1, 2, 3].includes(2, -100)); +assertTrue([Object, Function, Array].includes(Function)); +assertTrue([-0].includes(0)); +assertTrue([NaN].includes(NaN)); +assertTrue([,].includes()); +assertTrue(staticIncludes("123", "2")); +assertTrue(staticIncludes({length: 3, 1: 2}, 2)); +assertTrue(staticIncludes({length: 3, 1: 2, get 3(){throw ""}}, 2)); +assertTrue(staticIncludes({length: 3, get 1() {return 2}}, 2)); +assertTrue(staticIncludes({__proto__: {1: 2}, length: 3}, 2)); +assertTrue(staticIncludes(new Proxy([1], {get(){return 2}}), 2)); + +assertFalse([1, 2, 3].includes("2")); +assertFalse([1, 2, 3].includes(2, 2)); +assertFalse([1, 2, 3].includes(2, -1)); +assertFalse([undefined].includes(NaN)); +assertFalse([{}].includes({})); +assertFalse(staticIncludes({length: 3, 1: 2}, 2, 2)); +assertFalse(staticIncludes({length: 3, get 0(){delete this[1]}, 1: 2}, 2)); +assertFalse(staticIncludes({length: -100, 0: 1}, 1)); + +assertThrowsInstanceOf(() => staticIncludes(), TypeError); +assertThrowsInstanceOf(() => staticIncludes(null), TypeError); +assertThrowsInstanceOf(() => staticIncludes({get length(){throw TypeError()}}), TypeError); +assertThrowsInstanceOf(() => staticIncludes({length: 3, get 1() {throw TypeError()}}, 2), TypeError); +assertThrowsInstanceOf(() => staticIncludes({__proto__: {get 1() {throw TypeError()}}, length: 3}, 2), TypeError); +assertThrowsInstanceOf(() => staticIncludes(new Proxy([1], {get(){throw TypeError()}})), TypeError); + +function assertTrue(v) { + assert.sameValue(v, true); +} + +function assertFalse(v) { + assert.sameValue(v, false); +} + +function staticIncludes(o, v, f) { + return [].includes.call(o, v, f); +} + diff --git a/test/staging/sm/Array/index-with-null-character.js b/test/staging/sm/Array/index-with-null-character.js new file mode 100644 index 0000000000..4b2821b110 --- /dev/null +++ b/test/staging/sm/Array/index-with-null-character.js @@ -0,0 +1,24 @@ +/* + * Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/licenses/publicdomain/ + */ + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +var testArray = [1, 2, 3] +assert.sameValue(testArray['0' + '\0'], undefined); +assert.sameValue(testArray['1' + '\0' + 'aaaa'], undefined) +assert.sameValue(testArray['\0' + '2'], undefined); +assert.sameValue(testArray['\0' + ' 2'], undefined); + +testArray['\0'] = 'hello'; +testArray[' \0'] = 'world'; +assert.sameValue(testArray['\0'], 'hello'); +assert.sameValue(testArray[' \0'], 'world'); + diff --git a/test/staging/sm/Array/indexOf-never-returns-negative-zero.js b/test/staging/sm/Array/indexOf-never-returns-negative-zero.js new file mode 100644 index 0000000000..98d77f6565 --- /dev/null +++ b/test/staging/sm/Array/indexOf-never-returns-negative-zero.js @@ -0,0 +1,13 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +assert.sameValue([17].indexOf(17, -0), +0); + diff --git a/test/staging/sm/Array/indexOf-packed-array.js b/test/staging/sm/Array/indexOf-packed-array.js new file mode 100644 index 0000000000..99c1e00351 --- /dev/null +++ b/test/staging/sm/Array/indexOf-packed-array.js @@ -0,0 +1,49 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [compareArray.js, sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +function makeArray(array) { + var log = []; + Object.setPrototypeOf(array, new Proxy(Array.prototype, new Proxy({ + has(t, pk) { + log.push(`Has:${String(pk)}`); + return Reflect.has(t, pk); + }, + }, { + get(t, pk, r) { + if (pk in t) + return Reflect.get(t, pk, r); + throw new Error(`Unexpected trap "${pk}" called`); + } + }))); + return {array, log}; +} + + +var {array, log} = makeArray([1, null, 3]); +Array.prototype.indexOf.call(array, 100, { + valueOf() { + array.length = 0; + return 0; + } +}); +assert.compareArray(log, ["Has:0", "Has:1", "Has:2"]); + + +var {array, log} = makeArray([5, undefined, 7]); +Array.prototype.lastIndexOf.call(array, 100, { + valueOf() { + array.length = 0; + return 2; + } +}); +assert.compareArray(log, ["Has:2", "Has:1", "Has:0"]); + + diff --git a/test/staging/sm/Array/isArray.js b/test/staging/sm/Array/isArray.js new file mode 100644 index 0000000000..0d9c8e0354 --- /dev/null +++ b/test/staging/sm/Array/isArray.js @@ -0,0 +1,75 @@ +/* + * Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/licenses/publicdomain/ + */ + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +var global = this; +var otherGlobal = createNewGlobal(); + +var thisGlobal = () => global; +var alternateGlobals = (function(i) { + return () => (i++ % 2) === 0 ? global : otherGlobal; +})(0); + +function performTests(pickGlobal) +{ + // Base case. + assert.sameValue(Array.isArray([]), true); + + // Simple case: proxy to an array. + var proxy = new (pickGlobal()).Proxy([], {}); + assert.sameValue(Array.isArray(proxy), true); + + // Recursive proxy ultimately terminating in an array. + for (var i = 0; i < 10; i++) { + proxy = new (pickGlobal()).Proxy(proxy, {}); + assert.sameValue(Array.isArray(proxy), true); + } + + // Revocable proxy to an array. + var revocable = (pickGlobal()).Proxy.revocable([], {}); + proxy = revocable.proxy; + assert.sameValue(Array.isArray(proxy), true); + + // Recursive proxy ultimately terminating in a revocable proxy to an array. + for (var i = 0; i < 10; i++) { + proxy = new (pickGlobal()).Proxy(proxy, {}); + assert.sameValue(Array.isArray(proxy), true); + } + + // Revoked proxy to (formerly) an array. + revocable.revoke(); + assertThrowsInstanceOf(() => Array.isArray(revocable.proxy), TypeError); + + // Recursive proxy ultimately terminating in a revoked proxy to an array. + assertThrowsInstanceOf(() => Array.isArray(proxy), TypeError); + +} + +performTests(thisGlobal); +performTests(alternateGlobals); + +function crossGlobalTest() +{ + var array = new otherGlobal.Array(); + + // Array from another global. + assert.sameValue(Array.isArray(array), true); + + // Proxy to an array from another global. + assert.sameValue(Array.isArray(new Proxy(array, {})), true); + + // Other-global proxy to an array from that selfsame global. + assert.sameValue(Array.isArray(new otherGlobal.Proxy(array, {})), true); +} + +crossGlobalTest(); + diff --git a/test/staging/sm/Array/join-01.js b/test/staging/sm/Array/join-01.js new file mode 100644 index 0000000000..c84a20bed3 --- /dev/null +++ b/test/staging/sm/Array/join-01.js @@ -0,0 +1,86 @@ +/* + * Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/licenses/publicdomain/ + */ + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +//----------------------------------------------------------------------------- +print("ES5: Array.prototype.join"); + +/************** + * BEGIN TEST * + **************/ + +var count; +var stringifyCounter = { toString: function() { count++; return "obj"; } }; + +var arr = [1, 2, 3, 4, 5]; +assert.sameValue(arr.join(), "1,2,3,4,5"); +assert.sameValue(arr.join(","), "1,2,3,4,5"); +assert.sameValue(arr.join(undefined), "1,2,3,4,5"); +assert.sameValue(arr.join(4), "142434445"); +assert.sameValue(arr.join(""), "12345"); + +count = 0; +assert.sameValue(arr.join(stringifyCounter), "1obj2obj3obj4obj5"); +assert.sameValue(count, 1); + +var holey = [1, 2, , 4, 5]; +assert.sameValue(holey.join(), "1,2,,4,5"); +assert.sameValue(holey.join(","), "1,2,,4,5"); +assert.sameValue(holey.join(undefined), "1,2,,4,5"); +assert.sameValue(holey.join(4), "14244445"); + +count = 0; +assert.sameValue(holey.join(stringifyCounter), "1obj2objobj4obj5"); +assert.sameValue(count, 1); + +var nully = [1, 2, 3, null, 5]; +assert.sameValue(nully.join(), "1,2,3,,5"); +assert.sameValue(nully.join(","), "1,2,3,,5"); +assert.sameValue(nully.join(undefined), "1,2,3,,5"); +assert.sameValue(nully.join(4), "14243445"); + +count = 0; +assert.sameValue(nully.join(stringifyCounter), "1obj2obj3objobj5"); +assert.sameValue(count, 1); + +var undefiney = [1, undefined, 3, 4, 5]; +assert.sameValue(undefiney.join(), "1,,3,4,5"); +assert.sameValue(undefiney.join(","), "1,,3,4,5"); +assert.sameValue(undefiney.join(undefined), "1,,3,4,5"); +assert.sameValue(undefiney.join(4), "14434445"); + +count = 0; +assert.sameValue(undefiney.join(stringifyCounter), "1objobj3obj4obj5"); +assert.sameValue(count, 1); + +var log = ''; +arr = {length: {valueOf: function () { log += "L"; return 2; }}, + 0: "x", 1: "z"}; +var sep = {toString: function () { log += "S"; return "y"; }}; +assert.sameValue(Array.prototype.join.call(arr, sep), "xyz"); +assert.sameValue(log, "LS"); + +var funky = + { + toString: function() + { + Array.prototype[1] = "chorp"; + Object.prototype[3] = "fnord"; + return "funky"; + } + }; +var trailingHoles = [0, funky, /* 2 */, /* 3 */,]; +assert.sameValue(trailingHoles.join(""), "0funkyfnord"); + +/******************************************************************************/ + +print("Tests complete"); diff --git a/test/staging/sm/Array/join-no-has-trap.js b/test/staging/sm/Array/join-no-has-trap.js new file mode 100644 index 0000000000..1d2b8c8097 --- /dev/null +++ b/test/staging/sm/Array/join-no-has-trap.js @@ -0,0 +1,45 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [compareArray.js, sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +// Test that Array.prototype.join doesn't call the [[HasProperty]] internal +// method of objects. + +var log = []; +var array = []; +var proxy = new Proxy(array, new Proxy({}, { + get(t, trap, r) { + return (t, pk, ...more) => { + log.push(`${trap}:${String(pk)}`); + return Reflect[trap](t, pk, ...more); + }; + } +})); + +var result; + +result = Array.prototype.join.call(proxy); +assert.compareArray(log, [ "get:length" ]); +assert.sameValue(result, ""); + +log.length = 0; +array.push(1); + +result = Array.prototype.join.call(proxy); +assert.compareArray(log, [ "get:length", "get:0" ]); +assert.sameValue(result, "1"); + +log.length = 0; +array.push(2); + +result = Array.prototype.join.call(proxy); +assert.compareArray(log, [ "get:length", "get:0", "get:1" ]); +assert.sameValue(result, "1,2"); + diff --git a/test/staging/sm/Array/lastIndexOf-never-returns-negative-zero.js b/test/staging/sm/Array/lastIndexOf-never-returns-negative-zero.js new file mode 100644 index 0000000000..b6d2e8f536 --- /dev/null +++ b/test/staging/sm/Array/lastIndexOf-never-returns-negative-zero.js @@ -0,0 +1,13 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +assert.sameValue([17].lastIndexOf(17, -0), +0); + diff --git a/test/staging/sm/Array/length-01.js b/test/staging/sm/Array/length-01.js new file mode 100644 index 0000000000..ed8805c012 --- /dev/null +++ b/test/staging/sm/Array/length-01.js @@ -0,0 +1,74 @@ +/* + * Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/licenses/publicdomain/ + */ + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +//----------------------------------------------------------------------------- +var BUGNUMBER = 600392; +var summary = + 'Object.preventExtensions([]).length = 0 should do nothing, not throw'; + +print(BUGNUMBER + ": " + summary); + +/************** + * BEGIN TEST * + **************/ + + +function testEmpty() +{ + var a = []; + assert.sameValue(a.length, 0); + assert.sameValue(Object.preventExtensions(a), a); + assert.sameValue(a.length, 0); + a.length = 0; + assert.sameValue(a.length, 0); +} +testEmpty(); + +function testEmptyStrict() +{ + "use strict"; + var a = []; + assert.sameValue(a.length, 0); + assert.sameValue(Object.preventExtensions(a), a); + assert.sameValue(a.length, 0); + a.length = 0; + assert.sameValue(a.length, 0); +} +testEmptyStrict(); + +function testNonEmpty() +{ + var a = [1, 2, 3]; + assert.sameValue(a.length, 3); + assert.sameValue(Object.preventExtensions(a), a); + assert.sameValue(a.length, 3); + a.length = 0; + assert.sameValue(a.length, 0); +} +testNonEmpty(); + +function testNonEmptyStrict() +{ + "use strict"; + var a = [1, 2, 3]; + assert.sameValue(a.length, 3); + assert.sameValue(Object.preventExtensions(a), a); + assert.sameValue(a.length, 3); + a.length = 0; + assert.sameValue(a.length, 0); +} +testNonEmptyStrict(); + +/******************************************************************************/ + +print("All tests passed!"); diff --git a/test/staging/sm/Array/length-nonwritable-redefine-nop.js b/test/staging/sm/Array/length-nonwritable-redefine-nop.js new file mode 100644 index 0000000000..3fdaf37593 --- /dev/null +++ b/test/staging/sm/Array/length-nonwritable-redefine-nop.js @@ -0,0 +1,73 @@ +/* + * Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/licenses/publicdomain/ + */ + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +//----------------------------------------------------------------------------- +var BUGNUMBER = 858381; +var summary = "No-op array length redefinition"; + +print(BUGNUMBER + ": " + summary); + +/************** + * BEGIN TEST * + **************/ + +var arr; + +// initializedLength == capacity == length +// 6 == 6 == 6 +arr = Object.defineProperty([0, 1, 2, 3, 4, 5], "length", { writable: false }); +Object.defineProperty(arr, "length", { value: 6 }); +Object.defineProperty(arr, "length", { writable: false }); +Object.defineProperty(arr, "length", { configurable: false }); +Object.defineProperty(arr, "length", { writable: false, configurable: false }); +Object.defineProperty(arr, "length", { writable: false, value: 6 }); +Object.defineProperty(arr, "length", { configurable: false, value: 6 }); +Object.defineProperty(arr, "length", { writable: false, configurable: false, value: 6 }); + +// initializedLength == capacity < length +// 6 == 6 < 8 +arr = Object.defineProperty([0, 1, 2, 3, 4, 5], "length", { value: 8, writable: false }); +Object.defineProperty(arr, "length", { value: 8 }); +Object.defineProperty(arr, "length", { writable: false }); +Object.defineProperty(arr, "length", { configurable: false }); +Object.defineProperty(arr, "length", { writable: false, configurable: false }); +Object.defineProperty(arr, "length", { writable: false, value: 8 }); +Object.defineProperty(arr, "length", { configurable: false, value: 8 }); +Object.defineProperty(arr, "length", { writable: false, configurable: false, value: 8 }); + +// initializedLength < capacity == length +// 7 < 8 == 8 +arr = Object.defineProperty([0, 1, 2, 3, 4, 5, 6, /* hole */, ], "length", + { value: 8, writable: false }); +Object.defineProperty(arr, "length", { value: 8 }); +Object.defineProperty(arr, "length", { writable: false }); +Object.defineProperty(arr, "length", { configurable: false }); +Object.defineProperty(arr, "length", { writable: false, configurable: false }); +Object.defineProperty(arr, "length", { writable: false, value: 8 }); +Object.defineProperty(arr, "length", { configurable: false, value: 8 }); +Object.defineProperty(arr, "length", { writable: false, configurable: false, value: 8 }); + +// initializedLength < capacity < length +// 3 < 6 < 8 +arr = Object.defineProperty([0, 1, 2], "length", { value: 8, writable: false }); +Object.defineProperty(arr, "length", { value: 8 }); +Object.defineProperty(arr, "length", { writable: false }); +Object.defineProperty(arr, "length", { configurable: false }); +Object.defineProperty(arr, "length", { writable: false, configurable: false }); +Object.defineProperty(arr, "length", { writable: false, value: 8 }); +Object.defineProperty(arr, "length", { configurable: false, value: 8 }); +Object.defineProperty(arr, "length", { writable: false, configurable: false, value: 8 }); + +/******************************************************************************/ + +print("Tests complete"); diff --git a/test/staging/sm/Array/length-set-object.js b/test/staging/sm/Array/length-set-object.js new file mode 100644 index 0000000000..31977a470c --- /dev/null +++ b/test/staging/sm/Array/length-set-object.js @@ -0,0 +1,71 @@ +/* + * Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/licenses/publicdomain/ + */ + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +//----------------------------------------------------------------------------- +var BUGNUMBER = 657298; +var summary = 'Various quirks of setting array length properties to objects'; + +print(BUGNUMBER + ": " + summary); + +/************** + * BEGIN TEST * + **************/ + +function invokeConversionTwice1() +{ + var count = 0; + [].length = { valueOf: function() { count++; return 1; } }; + assert.sameValue(count, 2); +} +invokeConversionTwice1(); + +function invokeConversionTwice2() +{ + var count = 0; + [].length = { toString: function() { count++; return 1; }, valueOf: null }; + assert.sameValue(count, 2); +} +invokeConversionTwice2(); + +function dontOverwriteError1() +{ + try + { + [].length = { valueOf: {}, toString: {} }; + throw new Error("didn't throw a TypeError"); + } + catch (e) + { + assert.sameValue(e instanceof TypeError, true, + "expected a TypeError running out of conversion options, got " + e); + } +} +dontOverwriteError1(); + +function dontOverwriteError2() +{ + try + { + [].length = { valueOf: function() { throw "error"; } }; + throw new Error("didn't throw a TypeError"); + } + catch (e) + { + assert.sameValue(e, "error", "expected 'error' from failed conversion, got " + e); + } +} +dontOverwriteError2(); + +/******************************************************************************/ + +print("All tests passed!"); diff --git a/test/staging/sm/Array/length-truncate-nonconfigurable-sparse.js b/test/staging/sm/Array/length-truncate-nonconfigurable-sparse.js new file mode 100644 index 0000000000..6e470246e1 --- /dev/null +++ b/test/staging/sm/Array/length-truncate-nonconfigurable-sparse.js @@ -0,0 +1,113 @@ +/* + * Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/licenses/publicdomain/ + */ + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +//----------------------------------------------------------------------------- +var BUGNUMBER = 858381; +var summary = + "Array length redefinition behavior with non-configurable elements"; + +print(BUGNUMBER + ": " + summary); + +/************** + * BEGIN TEST * + **************/ + +function addDataProperty(obj, prop, value, enumerable, configurable, writable) +{ + var desc = + { enumerable: enumerable, + configurable: configurable, + writable: writable, + value: value }; + Object.defineProperty(obj, prop, desc); +} + +function nonstrict() +{ + var arr = [0, , 2, , , 5]; + + addDataProperty(arr, 31415926, "foo", true, true, true); + addDataProperty(arr, 123456789, "bar", true, true, false); + addDataProperty(arr, 8675309, "qux", false, true, true); + addDataProperty(arr, 1735039, "eit", false, true, false); + addDataProperty(arr, 987654321, "fun", false, true, false); + + // non-array indexes to spice things up + addDataProperty(arr, "foopy", "sdfsd", false, false, false); + addDataProperty(arr, 4294967296, "psych", true, false, false); + addDataProperty(arr, 4294967295, "psych", true, false, false); + + addDataProperty(arr, 27182818, "eep", false, false, false); + + // Truncate...but only as far as possible. + arr.length = 1; + + assert.sameValue(arr.length, 27182819); + + var props = Object.getOwnPropertyNames(arr).sort(); + var expected = + ["0", "2", "5", "1735039", "8675309", "27182818", + "foopy", "4294967296", "4294967295", "length"].sort(); + + assert.sameValue(props.length, expected.length); + for (var i = 0; i < props.length; i++) + assert.sameValue(props[i], expected[i], "unexpected property: " + props[i]); +} +nonstrict(); + +function strict() +{ + "use strict"; + + var arr = [0, , 2, , , 5]; + + addDataProperty(arr, 31415926, "foo", true, true, true); + addDataProperty(arr, 123456789, "bar", true, true, false); + addDataProperty(arr, 8675309, "qux", false, true, true); + addDataProperty(arr, 1735039, "eit", false, true, false); + addDataProperty(arr, 987654321, "fun", false, true, false); + + // non-array indexes to spice things up + addDataProperty(arr, "foopy", "sdfsd", false, false, false); + addDataProperty(arr, 4294967296, "psych", true, false, false); + addDataProperty(arr, 4294967295, "psych", true, false, false); + + addDataProperty(arr, 27182818, "eep", false, false, false); + + try + { + arr.length = 1; + throw new Error("didn't throw?!"); + } + catch (e) + { + assert.sameValue(e instanceof TypeError, true, + "non-configurable property should trigger TypeError, got " + e); + } + + assert.sameValue(arr.length, 27182819); + + var props = Object.getOwnPropertyNames(arr).sort(); + var expected = + ["0", "2", "5", "1735039", "8675309", "27182818", + "foopy", "4294967296", "4294967295", "length"].sort(); + + assert.sameValue(props.length, expected.length); + for (var i = 0; i < props.length; i++) + assert.sameValue(props[i], expected[i], "unexpected property: " + props[i]); +} +strict(); + +/******************************************************************************/ + +print("Tests complete"); diff --git a/test/staging/sm/Array/length-truncate-nonconfigurable.js b/test/staging/sm/Array/length-truncate-nonconfigurable.js new file mode 100644 index 0000000000..84c07e64a9 --- /dev/null +++ b/test/staging/sm/Array/length-truncate-nonconfigurable.js @@ -0,0 +1,51 @@ +/* + * Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/licenses/publicdomain/ + */ + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +//----------------------------------------------------------------------------- +var BUGNUMBER = 858381; +var summary = + "Array length redefinition behavior with non-configurable elements"; + +print(BUGNUMBER + ": " + summary); + +/************** + * BEGIN TEST * + **************/ + +var arr = [0, 1, 2]; +Object.defineProperty(arr, 1, { configurable: false }); + +try +{ + Object.defineProperty(arr, "length", { value: 0, writable: false }); +} +catch (e) +{ + assert.sameValue(e instanceof TypeError, true, + "must throw TypeError when array truncation would have to remove " + + "non-configurable elements"); +} + +assert.sameValue(arr.length, 2, "length is highest remaining index plus one"); + +var desc = Object.getOwnPropertyDescriptor(arr, "length"); +assert.sameValue(desc !== undefined, true); + +assert.sameValue(desc.value, 2); +assert.sameValue(desc.writable, false); +assert.sameValue(desc.enumerable, false); +assert.sameValue(desc.configurable, false); + +/******************************************************************************/ + +print("Tests complete"); diff --git a/test/staging/sm/Array/length-truncate-with-indexed.js b/test/staging/sm/Array/length-truncate-with-indexed.js new file mode 100644 index 0000000000..c5de9d4d60 --- /dev/null +++ b/test/staging/sm/Array/length-truncate-with-indexed.js @@ -0,0 +1,104 @@ +/* + * Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/licenses/publicdomain/ + */ + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +//----------------------------------------------------------------------------- +var BUGNUMBER = 858381; +var summary = + "Array length setting/truncating with non-dense, indexed elements"; + +print(BUGNUMBER + ": " + summary); + +/************** + * BEGIN TEST * + **************/ + +function testTruncateDenseAndSparse() +{ + var arr; + + // initialized length 16, capacity same + arr = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15]; + + // plus a sparse element + arr[987654321] = 987654321; + + // lop off the sparse element and half the dense elements, shrink capacity + arr.length = 8; + + assert.sameValue(987654321 in arr, false); + assert.sameValue(arr[987654321], undefined); + assert.sameValue(arr.length, 8); +} +testTruncateDenseAndSparse(); + +function testTruncateSparse() +{ + // initialized length 8, capacity same + var arr = [0, 1, 2, 3, 4, 5, 6, 7]; + + // plus a sparse element + arr[987654321] = 987654321; + + // lop off the sparse element, leave initialized length/capacity unchanged + arr.length = 8; + + assert.sameValue(987654321 in arr, false); + assert.sameValue(arr[987654321], undefined); + assert.sameValue(arr.length, 8); +} +testTruncateSparse(); + +function testTruncateDenseAndSparseShrinkCapacity() +{ + // initialized length 11, capacity...somewhat larger, likely 16 + var arr = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10]; + + // plus a sparse element + arr[987654321] = 987654321; + + // lop off the sparse element, reduce initialized length, reduce capacity + arr.length = 8; + + assert.sameValue(987654321 in arr, false); + assert.sameValue(arr[987654321], undefined); + assert.sameValue(arr.length, 8); +} +testTruncateDenseAndSparseShrinkCapacity(); + +function testTruncateSparseShrinkCapacity() +{ + // initialized length 8, capacity same + var arr = [0, 1, 2, 3, 4, 5, 6, 7]; + + // capacity expands to accommodate, initialized length remains same (not equal + // to capacity or length) + arr[15] = 15; + + // now no elements past initialized length + delete arr[15]; + + // ...except a sparse element + arr[987654321] = 987654321; + + // trims sparse element, doesn't change initialized length, shrinks capacity + arr.length = 8; + + assert.sameValue(987654321 in arr, false); + assert.sameValue(arr[987654321], undefined); + assert.sameValue(arr.length, 8); +} +testTruncateSparseShrinkCapacity(); + +/******************************************************************************/ + +print("Tests complete"); diff --git a/test/staging/sm/Array/pop-empty-nonwritable.js b/test/staging/sm/Array/pop-empty-nonwritable.js new file mode 100644 index 0000000000..bc997dcaa6 --- /dev/null +++ b/test/staging/sm/Array/pop-empty-nonwritable.js @@ -0,0 +1,37 @@ +/* + * Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/licenses/publicdomain/ + */ + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +//----------------------------------------------------------------------------- +var BUGNUMBER = 858381; +var summary = 'Object.freeze([]).pop() must throw a TypeError'; + +print(BUGNUMBER + ": " + summary); + +/************** + * BEGIN TEST * + **************/ + +try +{ + Object.freeze([]).pop(); + throw new Error("didn't throw"); +} +catch (e) +{ + assert.sameValue(e instanceof TypeError, true, + "should have thrown TypeError, instead got: " + e); +} + +/******************************************************************************/ + +print("Tests complete"); diff --git a/test/staging/sm/Array/pop-no-has-trap.js b/test/staging/sm/Array/pop-no-has-trap.js new file mode 100644 index 0000000000..893b353e47 --- /dev/null +++ b/test/staging/sm/Array/pop-no-has-trap.js @@ -0,0 +1,67 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [compareArray.js, sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +// Test that Array.prototype.pop doesn't call the [[HasProperty]] internal +// method of objects when retrieving the element at the last index. + +var log = []; +var array = []; +var proxy = new Proxy(array, new Proxy({}, { + get(t, trap, r) { + return (t, pk, ...more) => { + log.push(`${trap}:${String(pk)}`); + return Reflect[trap](t, pk, ...more); + }; + } +})); + +var result; + +result = Array.prototype.pop.call(proxy); +assert.compareArray(log, [ + "get:length", + "set:length", "getOwnPropertyDescriptor:length", "defineProperty:length" +]); +assert.sameValue(result, undefined); + +log.length = 0; +array.push(1); + +result = Array.prototype.pop.call(proxy); +assert.compareArray(log, [ + "get:length", + "get:0", "deleteProperty:0", + "set:length", "getOwnPropertyDescriptor:length", "defineProperty:length" +]); +assert.sameValue(result, 1); + +log.length = 0; +array.push(2, 3); + +result = Array.prototype.pop.call(proxy); +assert.compareArray(log, [ + "get:length", + "get:1", "deleteProperty:1", + "set:length", "getOwnPropertyDescriptor:length", "defineProperty:length" +]); +assert.sameValue(result, 3); + +log.length = 0; +array.push(4, 5); + +result = Array.prototype.pop.call(proxy); +assert.compareArray(log, [ + "get:length", + "get:2", "deleteProperty:2", + "set:length", "getOwnPropertyDescriptor:length", "defineProperty:length" +]); +assert.sameValue(result, 5); + diff --git a/test/staging/sm/Array/pop-nonarray-higher-elements.js b/test/staging/sm/Array/pop-nonarray-higher-elements.js new file mode 100644 index 0000000000..89bb6a1cda --- /dev/null +++ b/test/staging/sm/Array/pop-nonarray-higher-elements.js @@ -0,0 +1,96 @@ +/* + * Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/licenses/publicdomain/ + */ + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +//----------------------------------------------------------------------------- +var BUGNUMBER = 909602; +var summary = + "Array.prototype.pop shouldn't touch elements greater than length on " + + "non-arrays"; + +print(BUGNUMBER + ": " + summary); + +/************** + * BEGIN TEST * + **************/ + +function doTest(obj, index) +{ + // print("testing " + JSON.stringify(obj) + " with index " + index); + assert.sameValue(Array.prototype.pop.call(obj), undefined); + assert.sameValue(index in obj, true); + assert.sameValue(obj[index], 42); +} + +// not-super-much-later element + +// non-zero length +function testPop1() +{ + var obj = { length: 2, 3: 42 }; + doTest(obj, 3); +} +for (var i = 0; i < 50; i++) + testPop1(); + +// zero length +function testPop2() +{ + var obj = { length: 0, 3: 42 }; + doTest(obj, 3); +} +for (var i = 0; i < 50; i++) + testPop2(); + +// much-later (but dense) element + +// non-zero length +function testPop3() +{ + var obj = { length: 2, 55: 42 }; + doTest(obj, 55); +} +for (var i = 0; i < 50; i++) + testPop3(); + +// zero length +function testPop4() +{ + var obj = { length: 0, 55: 42 }; + doTest(obj, 55); +} +for (var i = 0; i < 50; i++) + testPop4(); + +// much much much later (sparse) element + +// non-zero length +function testPop5() +{ + var obj = { length: 2, 65530: 42 }; + doTest(obj, 65530); +} +for (var i = 0; i < 50; i++) + testPop5(); + +// zero length +function testPop6() +{ + var obj = { length: 0, 65530: 42 }; + doTest(obj, 65530); +} +for (var i = 0; i < 50; i++) + testPop6(); + +/******************************************************************************/ + +print("Tests complete"); diff --git a/test/staging/sm/Array/redefine-length-frozen-array.js b/test/staging/sm/Array/redefine-length-frozen-array.js new file mode 100644 index 0000000000..e41133711b --- /dev/null +++ b/test/staging/sm/Array/redefine-length-frozen-array.js @@ -0,0 +1,29 @@ +/* + * Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/licenses/publicdomain/ + */ + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +//----------------------------------------------------------------------------- +var BUGNUMBER = 866580; +var summary = "Assertion redefining length property of a frozen array"; + +print(BUGNUMBER + ": " + summary); + +/************** + * BEGIN TEST * + **************/ + +var arr = Object.freeze([]); +Object.defineProperty(arr, "length", {}); + +/******************************************************************************/ + +print("Tests complete"); diff --git a/test/staging/sm/Array/redefine-length-frozen-dictionarymode-array.js b/test/staging/sm/Array/redefine-length-frozen-dictionarymode-array.js new file mode 100644 index 0000000000..c7e2106fdb --- /dev/null +++ b/test/staging/sm/Array/redefine-length-frozen-dictionarymode-array.js @@ -0,0 +1,39 @@ +/* + * Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/licenses/publicdomain/ + */ + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +//----------------------------------------------------------------------------- +var BUGNUMBER = 880591; +var summary = + "Assertion redefining length property of a frozen dictionary-mode array"; + +print(BUGNUMBER + ": " + summary); + +/************** + * BEGIN TEST * + **************/ + +function convertToDictionaryMode(arr) +{ + Object.defineProperty(arr, 0, { configurable: true }); + Object.defineProperty(arr, 1, { configurable: true }); + delete arr[0]; +} + +var arr = []; +convertToDictionaryMode(arr); +Object.freeze(arr); +Object.defineProperty(arr, "length", {}); + +/******************************************************************************/ + +print("Tests complete"); diff --git a/test/staging/sm/Array/redefine-nonwritable-length-custom-conversion-call-counts.js b/test/staging/sm/Array/redefine-nonwritable-length-custom-conversion-call-counts.js new file mode 100644 index 0000000000..6e56d75fff --- /dev/null +++ b/test/staging/sm/Array/redefine-nonwritable-length-custom-conversion-call-counts.js @@ -0,0 +1,48 @@ +/* + * Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/licenses/publicdomain/ + */ + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +//----------------------------------------------------------------------------- +var BUGNUMBER = 866700; +var summary = "Assertion redefining non-writable length to a non-numeric value"; + +print(BUGNUMBER + ": " + summary); + +/************** + * BEGIN TEST * + **************/ + +var count = 0; + +var convertible = + { + valueOf: function() + { + count++; + return 0; + } + }; + +var arr = []; +Object.defineProperty(arr, "length", { value: 0, writable: false }); + +Object.defineProperty(arr, "length", { value: convertible }); +assert.sameValue(count, 2); + +Object.defineProperty(arr, "length", { value: convertible }); +assert.sameValue(count, 4); + +assert.sameValue(arr.length, 0); + +/******************************************************************************/ + +print("Tests complete"); diff --git a/test/staging/sm/Array/redefine-nonwritable-length-custom-conversion-throw.js b/test/staging/sm/Array/redefine-nonwritable-length-custom-conversion-throw.js new file mode 100644 index 0000000000..e56a8d6bd8 --- /dev/null +++ b/test/staging/sm/Array/redefine-nonwritable-length-custom-conversion-throw.js @@ -0,0 +1,61 @@ +/* + * Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/licenses/publicdomain/ + */ + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +//----------------------------------------------------------------------------- +var BUGNUMBER = 866700; +var summary = "Assertion redefining non-writable length to a non-numeric value"; + +print(BUGNUMBER + ": " + summary); + +/************** + * BEGIN TEST * + **************/ + +var count = 0; + +var convertible = + { + valueOf: function() + { + count++; + if (count > 2) + return 0; + throw new SyntaxError("fnord"); + } + }; + +var arr = []; +Object.defineProperty(arr, "length", { value: 0, writable: false }); + +try +{ + Object.defineProperty(arr, "length", + { + value: convertible, + writable: true, + configurable: true, + enumerable: true + }); + throw new Error("didn't throw"); +} +catch (e) +{ + assert.sameValue(e instanceof SyntaxError, true, "expected SyntaxError, got " + e); +} + +assert.sameValue(count, 1); +assert.sameValue(arr.length, 0); + +/******************************************************************************/ + +print("Tests complete"); diff --git a/test/staging/sm/Array/redefine-nonwritable-length-nonnumeric.js b/test/staging/sm/Array/redefine-nonwritable-length-nonnumeric.js new file mode 100644 index 0000000000..592faee8a3 --- /dev/null +++ b/test/staging/sm/Array/redefine-nonwritable-length-nonnumeric.js @@ -0,0 +1,35 @@ +/* + * Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/licenses/publicdomain/ + */ + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +//----------------------------------------------------------------------------- +var BUGNUMBER = 866700; +var summary = "Assertion redefining non-writable length to a non-numeric value"; + +print(BUGNUMBER + ": " + summary); + +/************** + * BEGIN TEST * + **************/ + +var arr = []; +Object.defineProperty(arr, "length", { value: 0, writable: false }); + +// Per Array's magical behavior, the value in the descriptor gets canonicalized +// *before* SameValue comparisons occur, so this shouldn't throw. +Object.defineProperty(arr, "length", { value: '' }); + +assert.sameValue(arr.length, 0); + +/******************************************************************************/ + +print("Tests complete"); diff --git a/test/staging/sm/Array/regress-386030.js b/test/staging/sm/Array/regress-386030.js new file mode 100644 index 0000000000..42af859ada --- /dev/null +++ b/test/staging/sm/Array/regress-386030.js @@ -0,0 +1,70 @@ +/* + * Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/licenses/publicdomain/ + */ + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +//----------------------------------------------------------------------------- +var BUGNUMBER = 386030; +var summary = 'Array.reduce should ignore holes'; +var actual = ''; +var expect = ''; + + +//----------------------------------------------------------------------------- +test(); +//----------------------------------------------------------------------------- + +function test() +{ + printBugNumber(BUGNUMBER); + printStatus (summary); + + function add(a, b) { return a + b; } + function testreduce(v) { return v == 3 ? "PASS" : "FAIL"; } + + expect = 'PASS'; + + try { + a = new Array(2); + a[1] = 3; + actual = testreduce(a.reduce(add)); + } catch (e) { + actual = "FAIL, reduce"; + } + assert.sameValue(expect, actual, summary + ': 1'); + + try { + a = new Array(2); + a[0] = 3; + actual = testreduce(a.reduceRight(add)); + } catch (e) { + actual = "FAIL, reduceRight"; + } + assert.sameValue(expect, actual, summary + ': 2'); + + try { + a = new Array(2); + a.reduce(add); + actual = "FAIL, empty reduce"; + } catch (e) { + actual = "PASS"; + } + assert.sameValue(expect, actual, summary + ': 3'); + + try { + a = new Array(2); + print(a.reduceRight(add)); + actual = "FAIL, empty reduceRight"; + } catch (e) { + actual = "PASS"; + } + assert.sameValue(expect, actual, summary + ': 4'); +} diff --git a/test/staging/sm/Array/regress-424954.js b/test/staging/sm/Array/regress-424954.js new file mode 100644 index 0000000000..dea2e91231 --- /dev/null +++ b/test/staging/sm/Array/regress-424954.js @@ -0,0 +1,33 @@ +/* + * Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/licenses/publicdomain/ + */ + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +//----------------------------------------------------------------------------- +var BUGNUMBER = 424954; +var summary = 'Do not crash with [].concat(null)'; +var actual = 'No Crash'; +var expect = 'No Crash'; + + +//----------------------------------------------------------------------------- +test(); +//----------------------------------------------------------------------------- + +function test() +{ + printBugNumber(BUGNUMBER); + printStatus (summary); + + [].concat(null); + + assert.sameValue(expect, actual, summary); +} diff --git a/test/staging/sm/Array/regress-566651.js b/test/staging/sm/Array/regress-566651.js new file mode 100644 index 0000000000..cdd680a49f --- /dev/null +++ b/test/staging/sm/Array/regress-566651.js @@ -0,0 +1,26 @@ +/* + * Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/licenses/publicdomain/ + */ + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +//----------------------------------------------------------------------------- +var BUGNUMBER = 566651; +var summary = 'setting array.length to null should not throw an uncatchable exception'; +var actual = 0; +var expect = 0; + +printBugNumber(BUGNUMBER); +printStatus (summary); + +var a = []; +a.length = null; + +assert.sameValue(expect, actual, summary); diff --git a/test/staging/sm/Array/regress-599159.js b/test/staging/sm/Array/regress-599159.js new file mode 100644 index 0000000000..8197d3bb75 --- /dev/null +++ b/test/staging/sm/Array/regress-599159.js @@ -0,0 +1,17 @@ +/* + * Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/licenses/publicdomain/ + */ + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +var b = Object.create(Array.prototype); +b.length = 12; +assert.sameValue(b.length, 12); + diff --git a/test/staging/sm/Array/regress-619970.js b/test/staging/sm/Array/regress-619970.js new file mode 100644 index 0000000000..413634042a --- /dev/null +++ b/test/staging/sm/Array/regress-619970.js @@ -0,0 +1,18 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +function test() { + delete arguments[1]; + return Array.prototype.join.call(arguments); +} +assert.sameValue(test(1,2,3), "1,,3"); +Object.prototype[1] = "ponies!!!1"; +assert.sameValue(test(1,2,3), "1,ponies!!!1,3"); diff --git a/test/staging/sm/Array/reverse-order-of-low-high-accesses.js b/test/staging/sm/Array/reverse-order-of-low-high-accesses.js new file mode 100644 index 0000000000..9e69ce783f --- /dev/null +++ b/test/staging/sm/Array/reverse-order-of-low-high-accesses.js @@ -0,0 +1,93 @@ +/* + * Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/licenses/publicdomain/ + */ + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +//----------------------------------------------------------------------------- +var BUGNUMBER = 858677; +var summary = + "[].reverse should swap elements low to high using accesses to low " + + "elements, then accesses to high elements"; + +print(BUGNUMBER + ": " + summary); + +/************** + * BEGIN TEST * + **************/ + +var observed = []; + +// (0, 7) hits the lowerExists/upperExists case. +// (1, 6) hits the !lowerExists/upperExists case. +// (2, 5) hits the lowerExists/!upperExists case. +// (3, 4) hits the !lowerExists/!upperExists case. +// +// It'd be a good idea to have a second version of this test at some point +// where the "array" being reversed is a proxy, to detect proper ordering of +// getproperty, hasproperty, setproperty into a hole, and deleteproperty from a +// non-configurable element. But at present our Array.prototype.reverse +// implementation probably doesn't conform fully to all this (because our +// internal MOP is still slightly off), so punt for now. +var props = + { + 0: { + configurable: true, + get: function() { observed.push("index 0 get"); return "index 0 get"; }, + set: function(v) { observed.push("index 0 set: " + v); } + }, + /* 1: hole */ + 2: { + configurable: true, + get: function() { observed.push("index 2 get"); return "index 2 get"; }, + set: function(v) { observed.push("index 2 set: " + v); } + }, + /* 3: hole */ + /* 4: hole */ + /* 5: hole */ + 6: { + configurable: true, + get: function() { observed.push("index 6 get"); return "index 6 get"; }, + set: function(v) { observed.push("index 6 set: " + v); } + }, + 7: { + configurable: true, + get: function() { observed.push("index 7 get"); return "index 7 get"; }, + set: function(v) { observed.push("index 7 set: " + v); } + }, + }; + +var arr = Object.defineProperties(new Array(8), props); + +arr.reverse(); + +var expectedObserved = + ["index 0 get", "index 7 get", "index 0 set: index 7 get", "index 7 set: index 0 get", + "index 6 get", + "index 2 get" + /* nothing for 3/4 */]; +print(observed); +// Do this before the assertions below futz even more with |observed|. +assert.sameValue(observed.length, expectedObserved.length); +for (var i = 0; i < expectedObserved.length; i++) + assert.sameValue(observed[i], expectedObserved[i]); + +assert.sameValue(arr[0], "index 0 get"); // no deletion, setting doesn't overwrite +assert.sameValue(arr[1], "index 6 get"); // copies result of getter +assert.sameValue(2 in arr, false); // deleted +assert.sameValue(3 in arr, false); // never there +assert.sameValue(4 in arr, false); // never there +assert.sameValue(arr[5], "index 2 get"); // copies result of getter +assert.sameValue(6 in arr, false); // deleted +assert.sameValue(arr[7], "index 7 get"); // no deletion, setter doesn't overwrite + +/******************************************************************************/ + +print("Tests complete"); diff --git a/test/staging/sm/Array/set-with-indexed-property-on-prototype-chain.js b/test/staging/sm/Array/set-with-indexed-property-on-prototype-chain.js new file mode 100644 index 0000000000..1e1553c47b --- /dev/null +++ b/test/staging/sm/Array/set-with-indexed-property-on-prototype-chain.js @@ -0,0 +1,69 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +function ensureSetterCalledOnce(fn, value, index) { + var setterCalled = false; + Object.defineProperty(Array.prototype, index, { + configurable: true, + set: function(v) { + assert.sameValue(setterCalled, false); + setterCalled = true; + assert.sameValue(v, value); + } + }); + + assert.sameValue(setterCalled, false); + fn(); + assert.sameValue(setterCalled, true); + + delete Array.prototype[index]; +} + +ensureSetterCalledOnce(function() { + [].push("push"); +}, "push", 0); + +ensureSetterCalledOnce(function() { + [/* hole */, "reverse"].reverse(); +}, "reverse", 0); + +ensureSetterCalledOnce(function() { + ["reverse", /* hole */,].reverse(); +}, "reverse", 1); + +ensureSetterCalledOnce(function() { + [/* hole */, "shift"].shift(); +}, "shift", 0); + +ensureSetterCalledOnce(function() { + [/* hole */, "sort"].sort(); +}, "sort", 0); + +ensureSetterCalledOnce(function() { + [/* hole */, undefined].sort(); +}, undefined, 0); + +ensureSetterCalledOnce(function() { + [].splice(0, 0, "splice"); +}, "splice", 0); + +ensureSetterCalledOnce(function() { + [/* hole */, "splice"].splice(0, 1); +}, "splice", 0); + +ensureSetterCalledOnce(function(v) { + ["splice", /* hole */,].splice(0, 0, "item"); +}, "splice", 1); + +ensureSetterCalledOnce(function() { + [].unshift("unshift"); +}, "unshift", 0); + diff --git a/test/staging/sm/Array/shift-no-has-trap.js b/test/staging/sm/Array/shift-no-has-trap.js new file mode 100644 index 0000000000..8ac9e0fd82 --- /dev/null +++ b/test/staging/sm/Array/shift-no-has-trap.js @@ -0,0 +1,73 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [compareArray.js, sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +// Test that Array.prototype.shift doesn't call the [[HasProperty]] internal +// method of objects when retrieving the element at index 0. + +var log = []; +var array = []; +var proxy = new Proxy(array, new Proxy({}, { + get(t, trap, r) { + return (t, pk, ...more) => { + log.push(`${trap}:${String(pk)}`); + return Reflect[trap](t, pk, ...more); + }; + } +})); + +var result; + +result = Array.prototype.shift.call(proxy); +assert.compareArray(log, [ + "get:length", + "set:length", "getOwnPropertyDescriptor:length", "defineProperty:length" +]); +assert.sameValue(result, undefined); + +log.length = 0; +array.push(1); + +result = Array.prototype.shift.call(proxy); +assert.compareArray(log, [ + "get:length", + "get:0", + "deleteProperty:0", + "set:length", "getOwnPropertyDescriptor:length", "defineProperty:length" +]); +assert.sameValue(result, 1); + +log.length = 0; +array.push(2, 3); + +result = Array.prototype.shift.call(proxy); +assert.compareArray(log, [ + "get:length", + "get:0", + "has:1", "get:1", "set:0", "getOwnPropertyDescriptor:0", "defineProperty:0", + "deleteProperty:1", + "set:length", "getOwnPropertyDescriptor:length", "defineProperty:length" +]); +assert.sameValue(result, 2); + +log.length = 0; +array.push(4, 5); + +result = Array.prototype.shift.call(proxy); +assert.compareArray(log, [ + "get:length", + "get:0", + "has:1", "get:1", "set:0", "getOwnPropertyDescriptor:0", "defineProperty:0", + "has:2", "get:2", "set:1", "getOwnPropertyDescriptor:1", "defineProperty:1", + "deleteProperty:2", + "set:length", "getOwnPropertyDescriptor:length", "defineProperty:length" +]); +assert.sameValue(result, 3); + diff --git a/test/staging/sm/Array/shift_for_in.js b/test/staging/sm/Array/shift_for_in.js new file mode 100644 index 0000000000..17f8f5e8a8 --- /dev/null +++ b/test/staging/sm/Array/shift_for_in.js @@ -0,0 +1,22 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +var BUGNUMBER = 1247701; +var summary = 'Array.prototype.shift on a dense array with holes should update for-in enumeration properties.'; + +print(BUGNUMBER + ": " + summary); + +var x = ["a", , "b", , "c", "d" , "e", "f", "g"]; +for (var p in x) { + assert.sameValue(p in x, true); + x.shift(); +} + diff --git a/test/staging/sm/Array/sort-01.js b/test/staging/sm/Array/sort-01.js new file mode 100644 index 0000000000..07036f8521 --- /dev/null +++ b/test/staging/sm/Array/sort-01.js @@ -0,0 +1,28 @@ +/* + * Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/licenses/publicdomain/ + */ + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +//----------------------------------------------------------------------------- +var BUGNUMBER = 604971; +var summary = 'array.sort compare-function gets incorrect this'; + +print(BUGNUMBER + ": " + summary); + +/************** + * BEGIN TEST * + **************/ + +[1, 2, 3].sort(function() { "use strict"; assert.sameValue(this, undefined); }); + +/******************************************************************************/ + +print("All tests passed!"); diff --git a/test/staging/sm/Array/sort-array-with-holes-and-undefined.js b/test/staging/sm/Array/sort-array-with-holes-and-undefined.js new file mode 100644 index 0000000000..c6f7afef77 --- /dev/null +++ b/test/staging/sm/Array/sort-array-with-holes-and-undefined.js @@ -0,0 +1,37 @@ +/* + * Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/licenses/publicdomain/ + */ + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +//----------------------------------------------------------------------------- +var BUGNUMBER = 664528; +var summary = + "Sorting an array containing only holes and |undefined| should move all " + + "|undefined| to the start of the array"; + +print(BUGNUMBER + ": " + summary); + +/************** + * BEGIN TEST * + **************/ + +var a = [, , , undefined]; +a.sort(); + +assert.sameValue(a.hasOwnProperty(0), true); +assert.sameValue(a[0], undefined); +assert.sameValue(a.hasOwnProperty(1), false); +assert.sameValue(a.hasOwnProperty(2), false); +assert.sameValue(a.hasOwnProperty(3), false); + +/******************************************************************************/ + +print("Tests complete"); diff --git a/test/staging/sm/Array/sort-delete-ascending-order.js b/test/staging/sm/Array/sort-delete-ascending-order.js new file mode 100644 index 0000000000..935fd572aa --- /dev/null +++ b/test/staging/sm/Array/sort-delete-ascending-order.js @@ -0,0 +1,46 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [compareArray.js, sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +// Calls Array.prototype.sort and tests that properties are deleted in the same order in the +// native and the self-hosted implementation. + +function createProxy() { + var deleted = []; + var proxy = new Proxy([, , 0], { + deleteProperty(t, pk){ + deleted.push(pk); + return delete t[pk]; + } + }); + + return {proxy, deleted}; +} + +function compareFn(a, b) { + return a < b ? -1 : a > b ? 1 : 0; +} + +// Sort an array without a comparator function. This calls the native sort implementation. + +var {proxy, deleted} = createProxy(); + +assert.compareArray(deleted, []); +proxy.sort() +assert.compareArray(deleted, ["1", "2"]); + +// Now sort an array with a comparator function. This calls the self-hosted sort implementation. + +var {proxy, deleted} = createProxy(); + +assert.compareArray(deleted, []); +proxy.sort(compareFn); +assert.compareArray(deleted, ["1", "2"]); + diff --git a/test/staging/sm/Array/sort-non-function.js b/test/staging/sm/Array/sort-non-function.js new file mode 100644 index 0000000000..a558eaa489 --- /dev/null +++ b/test/staging/sm/Array/sort-non-function.js @@ -0,0 +1,31 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +// Array.prototype.sort throws if the comparator is neither undefined nor +// a callable object. + +// Use a zero length array, so we can provide any kind of callable object +// without worrying that the function is actually a valid comparator function. +const array = new Array(0); + +// Throws if the comparator is neither undefined nor callable. +for (let invalidComparator of [null, 0, true, Symbol(), {}, []]) { + assertThrowsInstanceOf(() => array.sort(invalidComparator), TypeError); +} + +// Doesn't throw if the comparator is undefined or a callable object. +for (let validComparator of [undefined, () => {}, Math.max, class {}, new Proxy(function(){}, {})]) { + array.sort(validComparator); +} + +// Also doesn't throw if no comparator was provided at all. +array.sort(); + diff --git a/test/staging/sm/Array/sort-typedarray-with-own-length.js b/test/staging/sm/Array/sort-typedarray-with-own-length.js new file mode 100644 index 0000000000..b29bf402df --- /dev/null +++ b/test/staging/sm/Array/sort-typedarray-with-own-length.js @@ -0,0 +1,42 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +function sortTypedArray(comparator) { + // Create a typed array with three elements, but also add an own "length" + // property with the value `2` to restrict the range of elements which + // will be sorted by Array.prototype.sort(). + var ta = new Int8Array([3, 2, 1]); + Object.defineProperty(ta, "length", {value: 2}); + + // Sort with Array.prototype.sort(), not %TypedArray%.prototype.sort()! + Array.prototype.sort.call(ta, comparator); + + return ta; +} + +// Comparators using the form |return a - b| are special-cased in +// Array.prototype.sort(). +function optimizedComparator(a, b) { + return a - b; +} + +// This comparator doesn't compile to the byte code sequence which gets +// special-cased in Array.prototype.sort(). +function nonOptimizedComparator(a, b) { + var d = a - b; + return d; +} + +// Both comparators should produce the same result. +assert.sameValue(sortTypedArray(optimizedComparator).toString(), "2,3,1"); +assert.sameValue(sortTypedArray(nonOptimizedComparator).toString(), "2,3,1"); + + diff --git a/test/staging/sm/Array/sort_holes.js b/test/staging/sm/Array/sort_holes.js new file mode 100644 index 0000000000..92614d0c20 --- /dev/null +++ b/test/staging/sm/Array/sort_holes.js @@ -0,0 +1,74 @@ +/* + * Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/licenses/publicdomain/ + */ + +/*--- +includes: [deepEqual.js, sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +// We should preserve holes when sorting sparce arrays. +// See bug: 1246860 + +function denseCount(arr) { + var c = 0; + for (var i = 0; i < arr.length; i++) + if (i in arr) + c++; + return c; +} + +let a = [,,,,,,,,,,,,,,,,,,,,{size: 1},{size: 2}]; +let b = [,,,,,,,,,,,,,,,,,,,,{size: 1},{size: 2}].sort(); +let c = [,,,,,,,,,,,,,,,,,,,,{size: 1},{size: 2}].sort((a, b) => {+a.size - +b.size}); + +assert.sameValue(a.length, 22); +assert.sameValue(denseCount(a), 2); +assert.sameValue(a.length, b.length); +assert.sameValue(b.length, c.length); +assert.sameValue(denseCount(a), denseCount(b)); +assert.sameValue(denseCount(b), denseCount(c)); + +let superSparce = new Array(5000); +superSparce[0] = 99; +superSparce[4000] = 0; +superSparce[4999] = -1; + +assert.sameValue(superSparce.length, 5000); +assert.sameValue(denseCount(superSparce), 3); + +superSparce.sort((a, b) => 1*a-b); +assert.sameValue(superSparce.length, 5000); +assert.sameValue(denseCount(superSparce), 3); +assert.sameValue(superSparce[0], -1); +assert.sameValue(superSparce[1], 0); +assert.sameValue(superSparce[2], 99); + +let allHoles = new Array(2600); +assert.sameValue(allHoles.length, 2600); +assert.sameValue(denseCount(allHoles), 0); +allHoles.sort((a, b) => 1*a-b); +assert.sameValue(allHoles.length, 2600); +assert.sameValue(denseCount(allHoles), 0); + +let oneHole = new Array(2600); +oneHole[1399] = {size: 27}; +assert.sameValue(oneHole.length, 2600); +assert.sameValue(denseCount(oneHole), 1); +oneHole.sort((a, b) => {+a.size - +b.size}); +assert.deepEqual(oneHole[0], {size: 27}); +assert.sameValue(oneHole.length, 2600); +assert.sameValue(denseCount(oneHole), 1); + +// Sealed objects should be sortable, including those with holes (so long +// as the holes appear at the end, so that they don't need to be moved). +assert.deepEqual(Object.seal([0, 99, -1]).sort((x, y) => 1 * x - y), + Object.seal([-1, 0, 99])); + +assert.deepEqual(Object.seal([1, 5, 4, , ,]).sort((x, y) => 1 * x - y), + Object.seal([1, 4, 5, , ,])); + diff --git a/test/staging/sm/Array/sort_native_string_nan.js b/test/staging/sm/Array/sort_native_string_nan.js new file mode 100644 index 0000000000..560f9071ad --- /dev/null +++ b/test/staging/sm/Array/sort_native_string_nan.js @@ -0,0 +1,25 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [compareArray.js, sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ + +var array = ["not-a-number", "also-not-a-number"]; +var copy = [...array]; + +// The sort comparator must be exactly equal to the bytecode pattern: +// +// JSOp::GetArg 0/1 +// JSOp::GetArg 1/0 +// JSOp::Sub +// JSOp::Return +array.sort(function(a, b) { return a - b; }); + +assert.compareArray(array, copy); + diff --git a/test/staging/sm/Array/sort_proxy.js b/test/staging/sm/Array/sort_proxy.js new file mode 100644 index 0000000000..4dddb31498 --- /dev/null +++ b/test/staging/sm/Array/sort_proxy.js @@ -0,0 +1,48 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +/* Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/publicdomain/zero/1.0/ */ + +// Ensure, via proxy, that only get, set, delete, has, and getOwnPropertyDescriptor +// are touched during sorting. + +const handler = { + set: function(target, prop, value) { + target[prop] = value; + return value; + }, + getPrototypeOf: () => { throw "You shouldn't touch getPrototypeOf!" }, + setPrototypeOf: () => { throw "You shouldn't touch setPrototypeOf!" }, + isExtensible: () => { throw "You shouldn't touch isExtensible!" }, + preventExtensions: () => { throw "You shouldn't touch preventExtensions!" }, + defineProperty: () => { throw "You shouldn't touch defineProperty!" }, + ownKeys: () => { throw "You shouldn't touch ownKeys!" }, + apply: () => { throw "You shouldn't touch apply!" }, + construct: () => { throw "You shouldn't touch construct!" }, +} + +function testArray(arr) { + let proxy = new Proxy(arr, handler) + + // The supplied comparators trigger a JavaScript implemented sort. + proxy.sort((x, y) => 1 * x - y); + arr.sort((x, y) => 1 * x - y); + + for (let i in arr) + assert.sameValue(arr[i], proxy[i]); +} + +testArray([-1]); +testArray([5, -1, 2, 99]); +testArray([5, -1, , , , 2, 99]); +testArray([]); + diff --git a/test/staging/sm/Array/sort_small.js b/test/staging/sm/Array/sort_small.js new file mode 100644 index 0000000000..20b7e25fd8 --- /dev/null +++ b/test/staging/sm/Array/sort_small.js @@ -0,0 +1,42 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +// Sort every possible permutation of some arrays. +function sortAllPermutations(data, comparefn) { + for (let permutation of Permutations(Array.from(data))) { + let sorted = (Array.from(permutation)).sort(comparefn); + for (let i in sorted) { + assert.sameValue(sorted[i], data[i], + [`[${permutation}].sort(${comparefn})`, + `returned ${sorted}, expected ${data}`].join(' ')); + } + } +} + +let lex = [2112, "bob", "is", "my", "name"]; +let nans = [1/undefined, NaN, Number.NaN] + +let num1 = [-11, 0, 0, 100, 101]; +let num2 = [-11, 100, 201234.23, undefined, undefined]; + +sortAllPermutations(lex); +sortAllPermutations(nans); + +sortAllPermutations(nans, (x, y) => x - y); +// Multiplication kills comparator optimization. +sortAllPermutations(nans, (x, y) => (1*x - 1*y)); + +sortAllPermutations(num1, (x, y) => x - y); +sortAllPermutations(num1, (x, y) => (1*x - 1*y)); + +sortAllPermutations(num2, (x, y) => x - y); +sortAllPermutations(num2, (x, y) => (1*x - 1*y)); + diff --git a/test/staging/sm/Array/species.js b/test/staging/sm/Array/species.js new file mode 100644 index 0000000000..44c56d01fb --- /dev/null +++ b/test/staging/sm/Array/species.js @@ -0,0 +1,191 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +var BUGNUMBER = 1165052; +var summary = 'Use ArraySpeciesCreate in Array.prototype.{concat,filter,map,slice,splice}.'; + +print(BUGNUMBER + ": " + summary); + +function test(funcName, args, expectedLength, expectedLogs) { + // modified @@species + function FakeArray(n) { + this.length = n; + } + var a = [1, 2, 3, 4, 5]; + a.constructor = { + [Symbol.species]: FakeArray + }; + var b = a[funcName](...args); + assert.sameValue(b.constructor, FakeArray); + + function FakeArrayWithSpecies(n) { + this.length = n; + } + FakeArrayWithSpecies[Symbol.species] = FakeArrayWithSpecies; + a = [1, 2, 3, 4, 5]; + a.constructor = FakeArrayWithSpecies; + b = a[funcName](...args); + assert.sameValue(b.constructor, FakeArrayWithSpecies); + + function FakeArrayWithHook(n) { + return new Proxy(new FakeArray(n), { + set(that, name, value) { + logs += "set:" + name + ":" + value + ","; + return true; + }, + defineProperty(that, name, desc) { + logs += "define:" + name + ":" + desc.value + ":" + desc.configurable + ":" + desc.enumerable + ":" + desc.writable + ","; + return true; + } + }); + } + var logs = ""; + var ctorProxy = new Proxy({}, { + get(that, name) { + logs += "c-get:" + name.toString() + ","; + if (name == Symbol.species) + return FakeArrayWithHook; + + return undefined; + } + }); + a = new Proxy([1, 2, 3, 4, 5], { + get(that, name) { + logs += "get:" + name.toString() + ","; + if (name == "constructor") + return ctorProxy; + return that[name]; + } + }); + b = a[funcName](...args); + assert.sameValue(b.constructor, FakeArray); + assert.sameValue(Object.keys(b).sort().join(","), "length"); + assert.sameValue(b.length, expectedLength); + assert.sameValue(logs, expectedLogs); + + // no @@species + a = [1, 2, 3, 4, 5]; + a.constructor = FakeArray; + b = a[funcName](...args); + assert.sameValue(b.constructor, Array); + + a = [1, 2, 3, 4, 5]; + a.constructor = { + [Symbol.species]: undefined + }; + b = a[funcName](...args); + assert.sameValue(b.constructor, Array); + + a = [1, 2, 3, 4, 5]; + a.constructor = { + [Symbol.species]: null + }; + b = a[funcName](...args); + assert.sameValue(b.constructor, Array); + + // invalid @@species + for (var species of [0, 1.1, true, false, "a", /a/, Symbol.iterator, [], {}]) { + a = [1, 2, 3, 4, 5]; + a.constructor = { + [Symbol.species]: species + }; + assertThrowsInstanceOf(() => a[funcName](...args), TypeError); + } + + // undefined constructor + a = [1, 2, 3, 4, 5]; + a.constructor = undefined; + b = a[funcName](...args); + assert.sameValue(b.constructor, Array); + + // invalid constructor + for (var ctor of [null, 0, 1.1, true, false, "a", Symbol.iterator]) { + a = [1, 2, 3, 4, 5]; + a.constructor = ctor; + assertThrowsInstanceOf(() => a[funcName](...args), TypeError); + } + + // not an array + a = new Proxy({ + 0: 1, 1: 2, 2: 3, 3: 4, 4: 5, + length: 5, + [funcName]: Array.prototype[funcName] + }, { + get(that, name) { + assert.sameValue(name !== "constructor", true); + return that[name]; + } + }); + b = a[funcName](...args); + assert.sameValue(b.constructor, Array); + + // @@species from different global + var g = createNewGlobal(); + g.eval("function FakeArray(n) { this.length = n; }"); + a = [1, 2, 3, 4, 5]; + a.constructor = { + [Symbol.species]: g.FakeArray + }; + b = a[funcName](...args); + assert.sameValue(b.constructor, g.FakeArray); + + a = [1, 2, 3, 4, 5]; + a.constructor = { + [Symbol.species]: g.Array + }; + b = a[funcName](...args); + assert.sameValue(b.constructor, g.Array); + + // constructor from different global + g.eval("function FakeArrayWithSpecies(n) { this.length = n; }"); + g.eval("FakeArrayWithSpecies[Symbol.species] = FakeArrayWithSpecies;"); + a = [1, 2, 3, 4, 5]; + a.constructor = g.FakeArrayWithSpecies; + b = a[funcName](...args); + assert.sameValue(b.constructor, g.FakeArrayWithSpecies); + + g.eval("var a = [1, 2, 3, 4, 5];"); + b = Array.prototype[funcName].apply(g.a, args); + assert.sameValue(b.constructor, Array); + + // running in different global + b = g.a[funcName](...args); + assert.sameValue(b.constructor, g.Array); + + // subclasses + // not-modified @@species + eval(` +class ${funcName}Class extends Array { +} +a = new ${funcName}Class(1, 2, 3, 4, 5); +b = a[funcName](...args); +assert.sameValue(b.constructor, ${funcName}Class); +`); + + // modified @@species + eval(` +class ${funcName}Class2 extends Array { + static get [Symbol.species]() { + return Date; + } +} +a = new ${funcName}Class2(1, 2, 3, 4, 5); +b = a[funcName](...args); +assert.sameValue(b.constructor, Date); +`); +} + +test("concat", [], 0, "get:concat,get:constructor,c-get:Symbol(Symbol.species),get:Symbol(Symbol.isConcatSpreadable),get:length,get:0,define:0:1:true:true:true,get:1,define:1:2:true:true:true,get:2,define:2:3:true:true:true,get:3,define:3:4:true:true:true,get:4,define:4:5:true:true:true,set:length:5,"); +test("filter", [x => x % 2], 0, "get:filter,get:length,get:constructor,c-get:Symbol(Symbol.species),get:0,define:0:1:true:true:true,get:1,get:2,define:1:3:true:true:true,get:3,get:4,define:2:5:true:true:true,"); +test("map", [x => x * 2], 5, "get:map,get:length,get:constructor,c-get:Symbol(Symbol.species),get:0,define:0:2:true:true:true,get:1,define:1:4:true:true:true,get:2,define:2:6:true:true:true,get:3,define:3:8:true:true:true,get:4,define:4:10:true:true:true,"); +test("slice", [], 5, "get:slice,get:length,get:constructor,c-get:Symbol(Symbol.species),get:0,define:0:1:true:true:true,get:1,define:1:2:true:true:true,get:2,define:2:3:true:true:true,get:3,define:3:4:true:true:true,get:4,define:4:5:true:true:true,set:length:5,"); +test("splice", [0, 5], 5, "get:splice,get:length,get:constructor,c-get:Symbol(Symbol.species),get:0,define:0:1:true:true:true,get:1,define:1:2:true:true:true,get:2,define:2:3:true:true:true,get:3,define:3:4:true:true:true,get:4,define:4:5:true:true:true,set:length:5,"); + diff --git a/test/staging/sm/Array/splice-return-array-elements-defined-not-set.js b/test/staging/sm/Array/splice-return-array-elements-defined-not-set.js new file mode 100644 index 0000000000..bc0ab47391 --- /dev/null +++ b/test/staging/sm/Array/splice-return-array-elements-defined-not-set.js @@ -0,0 +1,51 @@ +/* + * Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/licenses/publicdomain/ + */ + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +//----------------------------------------------------------------------------- +var BUGNUMBER = 668024; +var summary = + 'Array.prototype.splice should define, not set, the elements of the array ' + + 'it returns'; + +print(BUGNUMBER + ": " + summary); + +/************** + * BEGIN TEST * + **************/ + +Object.defineProperty(Object.prototype, 2, + { + set: function(v) + { + throw new Error("setter on Object.prototype called!"); + }, + get: function() { return "fnord"; }, + enumerable: false, + configurable: true + }); + +var arr = [0, 1, 2, 3, 4, 5]; +var removed = arr.splice(0, 6); + +assert.sameValue(arr.length, 0); +assert.sameValue(removed.length, 6); +assert.sameValue(removed[0], 0); +assert.sameValue(removed[1], 1); +assert.sameValue(removed[2], 2); +assert.sameValue(removed[3], 3); +assert.sameValue(removed[4], 4); +assert.sameValue(removed[5], 5); + +/******************************************************************************/ + +print("Tests complete"); diff --git a/test/staging/sm/Array/splice-species-changes-length.js b/test/staging/sm/Array/splice-species-changes-length.js new file mode 100644 index 0000000000..377167690e --- /dev/null +++ b/test/staging/sm/Array/splice-species-changes-length.js @@ -0,0 +1,57 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [compareArray.js, sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +// Case 1: splice() removes an element from the array. +{ + let array = []; + array.push(0, 1, 2); + + array.constructor = { + [Symbol.species]: function(n) { + // Increase the initialized length of the array. + array.push(3, 4, 5); + + // Make the length property non-writable. + Object.defineProperty(array, "length", {writable: false}); + + return new Array(n); + } + } + + assertThrowsInstanceOf(() => Array.prototype.splice.call(array, 0, 1), TypeError); + + assert.sameValue(array.length, 6); + assert.compareArray(array, [1, 2, /* hole */, 3, 4, 5]); +} + +// Case 2: splice() adds an element to the array. +{ + let array = []; + array.push(0, 1, 2); + + array.constructor = { + [Symbol.species]: function(n) { + // Increase the initialized length of the array. + array.push(3, 4, 5); + + // Make the length property non-writable. + Object.defineProperty(array, "length", {writable: false}); + + return new Array(n); + } + } + + assertThrowsInstanceOf(() => Array.prototype.splice.call(array, 0, 0, 123), TypeError); + + assert.sameValue(array.length, 6); + assert.compareArray(array, [123, 0, 1, 2, 4, 5]); +} + diff --git a/test/staging/sm/Array/splice-suppresses-unvisited-indexes.js b/test/staging/sm/Array/splice-suppresses-unvisited-indexes.js new file mode 100644 index 0000000000..a0bbe99624 --- /dev/null +++ b/test/staging/sm/Array/splice-suppresses-unvisited-indexes.js @@ -0,0 +1,66 @@ +/* + * Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/licenses/publicdomain/ + */ + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +//----------------------------------------------------------------------------- +var BUGNUMBER = 668024; +var summary = + 'Array.prototype.splice, when it deletes elements, should make sure any ' + + 'deleted but not visited elements are suppressed from subsequent enumeration'; + +print(BUGNUMBER + ": " + summary); + +/************** + * BEGIN TEST * + **************/ + +var arr = [0, 1, 2, 3, 4, 5, , 7]; + +var seen = []; +var sawOneBeforeThree = true; +for (var p in arr) +{ + if (p === "1") + { + // The order of enumeration of properties is unspecified, so technically, + // it would be kosher to enumerate "1" last, say, such that all properties + // in the array actually were enumerated, including an index which splice + // would delete. Don't flag that case as a failure. (SpiderMonkey doesn't + // do this, and neither do any of the other browser engines, but it is + // permissible behavior.) + if (seen.indexOf("3") >= 0) + { + sawOneBeforeThree = false; + break; + } + + arr.splice(2, 3); + } + + seen.push(p); +} + +if (sawOneBeforeThree) +{ + // ES5 12.6.4 states: + // + // If a property that has not yet been visited during enumeration is + // deleted, then it will not be visited. + // + // So if we haven't seen "3" by the time we see "1", the splice call above + // will delete "3", and therefore we must not see it. + assert.sameValue(seen.indexOf("3"), -1); +} + +/******************************************************************************/ + +print("Tests complete"); diff --git a/test/staging/sm/Array/to-length.js b/test/staging/sm/Array/to-length.js new file mode 100644 index 0000000000..9b158f32dd --- /dev/null +++ b/test/staging/sm/Array/to-length.js @@ -0,0 +1,49 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +const max = Number.MAX_SAFE_INTEGER; + +assert.sameValue(Array.prototype.indexOf.call({length: Infinity, [max - 1]: 'test'}, 'test', max - 3), max - 1); +assert.sameValue(Array.prototype.lastIndexOf.call({length: Infinity, [max - 2]: 'test', [max - 1]: 'test2'}, 'test'), max - 2); + +// ToLength doesn't truncate Infinity to zero, so the callback should be invoked +assertThrowsValue(() => Array.prototype.every.call({length: Infinity, [0]: undefined}, () => { throw "invoked" }), "invoked"); +assertThrowsValue(() => Array.prototype.some.call({length: Infinity, [0]: undefined}, () => { throw "invoked" }), "invoked"); +// Timeout before calling our callback +// assertThrowsValue(() => Array.prototype.sort.call({length: Infinity}, () => { throw "invoked" }), "invoked"); +assertThrowsValue(() => Array.prototype.forEach.call({length: Infinity, [0]: undefined}, () => { throw "invoked" }), "invoked"); +assertThrowsValue(() => Array.prototype.filter.call({length: Infinity, [0]: undefined}, () => { throw "invoked" }), "invoked"); +assertThrowsValue(() => Array.prototype.reduce.call({length: Infinity, [0]: undefined, [1]: undefined}, () => { throw "invoked" }), "invoked"); +assertThrowsValue(() => Array.prototype.reduceRight.call({length: Infinity, [max - 1]: undefined, [max - 2]: undefined}, () => { throw "invoked" }), "invoked"); +assertThrowsValue(() => Array.prototype.find.call({length: Infinity}, () => { throw "invoked" }), "invoked"); +assertThrowsValue(() => Array.prototype.findIndex.call({length: Infinity}, () => { throw "invoked" }), "invoked"); +assertThrowsValue(() => Array.prototype.fill.call({length: Infinity, set "0"(v) { throw "invoked"; }}, () => { throw "invoked" }), "invoked"); +assertThrowsValue(() => Array.prototype.copyWithin.call({length: Infinity, get [max - 2]() { throw "invoked"; }}, max - 2, max - 2), "invoked"); + +assert.sameValue(Array.prototype.includes.call({length: Infinity, [max - 1]: "test"}, "test", max - 3), true); + +// Invoking the Array constructor with MAX_SAFE_INTEGER will throw, 0 won't +assertThrowsInstanceOf(() => Array.from({length: Infinity}), RangeError); + +// Make sure ArraySpeciesCreate is called with ToLength applied to the length property +var proxy = new Proxy([], { + get(target, property) { + if (property === "length") + return Infinity; + + assert.sameValue(property, "constructor"); + function fakeConstructor(length) { assert.sameValue(length, max); throw "invoked"; }; + fakeConstructor[Symbol.species] = fakeConstructor; + return fakeConstructor; + } +}) +assertThrowsValue(() => Array.prototype.map.call(proxy, () => { }), "invoked"); + diff --git a/test/staging/sm/Array/toLocaleString-01.js b/test/staging/sm/Array/toLocaleString-01.js new file mode 100644 index 0000000000..8e74e6a87d --- /dev/null +++ b/test/staging/sm/Array/toLocaleString-01.js @@ -0,0 +1,40 @@ +/* + * Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/licenses/publicdomain/ + */ + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +//----------------------------------------------------------------------------- +var BUGNUMBER = 562446; +var summary = 'ES5: Array.prototype.toLocaleString'; + +print(BUGNUMBER + ": " + summary); + +/************** + * BEGIN TEST * + **************/ + +var o; + +o = { length: 2, 0: 7, 1: { toLocaleString: function() { return "baz" } } }; +assert.sameValue(Array.prototype.toLocaleString.call(o), "7,baz"); + +o = {}; +assert.sameValue(Array.prototype.toLocaleString.call(o), ""); + +var log = ''; +arr = {length: {valueOf: function () { log += "L"; return 2; }}, + 0: "x", 1: "z"}; +assert.sameValue(Array.prototype.toLocaleString.call(arr), "x,z"); +assert.sameValue(log, "L"); + +/******************************************************************************/ + +print("All tests passed!"); diff --git a/test/staging/sm/Array/toLocaleString-nointl.js b/test/staging/sm/Array/toLocaleString-nointl.js new file mode 100644 index 0000000000..a9a993669b --- /dev/null +++ b/test/staging/sm/Array/toLocaleString-nointl.js @@ -0,0 +1,35 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +if (typeof Intl !== "object") { + const localeSep = [,,].toLocaleString(); + + const obj = { + toLocaleString() { + assert.sameValue(arguments.length, 0); + return "pass"; + } + }; + + // Ensure no arguments are passed to the array elements. + // - Single element case. + assert.sameValue([obj].toLocaleString(), "pass"); + // - More than one element. + assert.sameValue([obj, obj].toLocaleString(), "pass" + localeSep + "pass"); + + // Ensure no arguments are passed to the array elements even if supplied. + const locales = {}, options = {}; + // - Single element case. + assert.sameValue([obj].toLocaleString(locales, options), "pass"); + // - More than one element. + assert.sameValue([obj, obj].toLocaleString(locales, options), "pass" + localeSep + "pass"); +} + diff --git a/test/staging/sm/Array/toLocaleString.js b/test/staging/sm/Array/toLocaleString.js new file mode 100644 index 0000000000..b5d2ed5bb8 --- /dev/null +++ b/test/staging/sm/Array/toLocaleString.js @@ -0,0 +1,23 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +flags: +- onlyStrict +includes: [sm/non262-shell.js, sm/non262.js] +description: | + pending +esid: pending +---*/ +"use strict"; + +Object.defineProperty(String.prototype, "toLocaleString", { + get() { + assert.sameValue(typeof this, "string"); + + return function() { return typeof this; }; + } +}) + +assert.sameValue(["test"].toLocaleString(), "string"); + diff --git a/test/staging/sm/Array/toSpliced-dense.js b/test/staging/sm/Array/toSpliced-dense.js new file mode 100644 index 0000000000..9d359ca3c1 --- /dev/null +++ b/test/staging/sm/Array/toSpliced-dense.js @@ -0,0 +1,135 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ + +const startIndices = [ + -10, -5, -4, -3, -2, -1, 0, 1, 2, 3, 4, 5, 10, +]; + +const deleteCounts = [ + 0, 1, 2, 3, 4, 5, 10, +]; + +const insertCounts = [ + 0, 1, 2, 3, 4, 5, 10, +]; + +const itemsList = insertCounts.map(count => { + return new Array(count).fill(0); +}); + +const arrays = [ + // Dense no holes. + [], + [1], + [1,2], + [1,2,3], + [1,2,3,4], + [1,2,3,4,5,6,7,8], + + // Dense trailing holes. + [,], + [1,,], + [1,2,,], + [1,2,3,,], + [1,2,3,4,,], + [1,2,3,4,5,6,7,8,,], + + // Dense leading holes. + [,], + [,1], + [,1,2], + [,1,2,3], + [,1,2,3,4], + [,1,2,3,4,5,6,7,8], + + // Dense with holes. + [1,,3], + [1,2,,4], + [1,,3,,5,6,,8], +]; + +const objects = arrays.map(array => { + let obj = { + length: array.length, + }; + for (let i = 0; i < array.length; ++i) { + if (i in array) { + obj[i] = array[i]; + } + } + return obj; +}); + +const objectsWithLargerDenseInitializedLength = arrays.map(array => { + let obj = { + length: array.length, + }; + for (let i = 0; i < array.length; ++i) { + if (i in array) { + obj[i] = array[i]; + } + } + + // Add some extra dense elements after |length|. + for (let i = 0; i < 5; ++i) { + obj[array.length + i] = "extra"; + } + + return obj; +}); + +const thisValues = [ + ...arrays, + ...objects, + ...objectsWithLargerDenseInitializedLength, +]; + +for (let thisValue of thisValues) { + for (let startIndex of startIndices) { + for (let deleteCount of deleteCounts) { + for (let items of itemsList) { + let res = Array.prototype.toSpliced.call(thisValue, startIndex, deleteCount, ...items); + + // Array.prototype.toSpliced(), steps 3-6. + let actualStart; + if (startIndex < 0) { + actualStart = Math.max(thisValue.length + startIndex, 0); + } else { + actualStart = Math.min(startIndex, thisValue.length); + } + + // Array.prototype.toSpliced(), step 10. + let actualDeleteCount = Math.min(Math.max(0, deleteCount), thisValue.length - actualStart); + + let newLength = thisValue.length + items.length - actualDeleteCount; + assert.sameValue(res.length, newLength); + + for (let i = 0; i < actualStart; ++i) { + assert.sameValue(Object.hasOwn(res, i), true); + assert.sameValue(res[i], thisValue[i]); + } + + for (let i = 0; i < items.length; ++i) { + assert.sameValue(Object.hasOwn(res, actualStart + i), true); + assert.sameValue(res[actualStart + i], items[i]); + } + + for (let i = 0; i < newLength - actualStart - items.length; ++i) { + assert.sameValue(Object.hasOwn(res, actualStart + items.length + i), true); + assert.sameValue(res[actualStart + items.length + i], + thisValue[actualStart + actualDeleteCount + i]); + } + } + } + } +} + diff --git a/test/staging/sm/Array/toSpliced.js b/test/staging/sm/Array/toSpliced.js new file mode 100644 index 0000000000..9e063c40d6 --- /dev/null +++ b/test/staging/sm/Array/toSpliced.js @@ -0,0 +1,35 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [deepEqual.js, sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ + +Object.defineProperty(Array.prototype, 0, { + set() { + throw "bad 0"; + }, +}); + +Object.defineProperty(Array.prototype, 1, { + set() { + throw "bad 1"; + }, +}); + +assert.deepEqual([].toSpliced(0, 0, 1), [1]); + +assert.deepEqual([0].toSpliced(0, 0, 0), [0, 0]); +assert.deepEqual([0].toSpliced(0, 0, 1), [1, 0]); +assert.deepEqual([0].toSpliced(0, 1, 0), [0]); +assert.deepEqual([0].toSpliced(0, 1, 1), [1]); +assert.deepEqual([0].toSpliced(1, 0, 0), [0, 0]); +assert.deepEqual([0].toSpliced(1, 0, 1), [0, 1]); +assert.deepEqual([0].toSpliced(1, 1, 0), [0, 0]); +assert.deepEqual([0].toSpliced(1, 1, 1), [0, 1]); + diff --git a/test/staging/sm/Array/toString-01.js b/test/staging/sm/Array/toString-01.js new file mode 100644 index 0000000000..32c159f592 --- /dev/null +++ b/test/staging/sm/Array/toString-01.js @@ -0,0 +1,55 @@ +/* + * Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/licenses/publicdomain/ + */ + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +//----------------------------------------------------------------------------- +var BUGNUMBER = 562446; +var summary = 'ES5: Array.prototype.toString'; + +print(BUGNUMBER + ": " + summary); + +/************** + * BEGIN TEST * + **************/ + +var o; + +o = { join: function() { assert.sameValue(arguments.length, 0); return "ohai"; } }; +assert.sameValue(Array.prototype.toString.call(o), "ohai"); + +o = {}; +assert.sameValue(Array.prototype.toString.call(o), "[object Object]"); + +Array.prototype.join = function() { return "kthxbai"; }; +assert.sameValue(Array.prototype.toString.call([]), "kthxbai"); + +o = { join: 17 }; +assert.sameValue(Array.prototype.toString.call(o), "[object Object]"); + +o = { get join() { throw 42; } }; +try +{ + var str = Array.prototype.toString.call(o); + assert.sameValue(true, false, + "expected an exception calling [].toString on an object with a " + + "join getter that throws, got " + str + " instead"); +} +catch (e) +{ + assert.sameValue(e, 42, + "expected thrown e === 42 when calling [].toString on an object " + + "with a join getter that throws, got " + e); +} + +/******************************************************************************/ + +print("All tests passed!"); diff --git a/test/staging/sm/Array/unscopables.js b/test/staging/sm/Array/unscopables.js new file mode 100644 index 0000000000..227920e436 --- /dev/null +++ b/test/staging/sm/Array/unscopables.js @@ -0,0 +1,71 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [deepEqual.js, sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +let Array_unscopables = Array.prototype[Symbol.unscopables]; + +let desc = Reflect.getOwnPropertyDescriptor(Array.prototype, Symbol.unscopables); +assert.deepEqual(desc, { + value: Array_unscopables, + writable: false, + enumerable: false, + configurable: true +}); + +assert.sameValue(Reflect.getPrototypeOf(Array_unscopables), null); + +let desc2 = Object.getOwnPropertyDescriptor(Array_unscopables, "values"); +assert.deepEqual(desc2, { + value: true, + writable: true, + enumerable: true, + configurable: true +}); + +let keys = Reflect.ownKeys(Array_unscopables); + +// FIXME: Once bug 1826643 is fixed, change this test so that all +// the keys are in alphabetical order +let expectedKeys = ["at", + "copyWithin", + "entries", + "fill", + "find", + "findIndex", + "findLast", + "findLastIndex", + "flat", + "flatMap", + "includes", + "keys", + "toReversed", + "toSorted", + "toSpliced", + "values"]; + +assert.deepEqual(keys, expectedKeys); + +for (let key of keys) + assert.sameValue(Array_unscopables[key], true); + +// Test that it actually works +assertThrowsInstanceOf(() => { + with ([]) { + return entries; + } +}, ReferenceError); + +{ + let fill = 33; + with (Array.prototype) { + assert.sameValue(fill, 33); + } +} + diff --git a/test/staging/sm/Array/unshift-01.js b/test/staging/sm/Array/unshift-01.js new file mode 100644 index 0000000000..cb92393605 --- /dev/null +++ b/test/staging/sm/Array/unshift-01.js @@ -0,0 +1,49 @@ +/* + * Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/licenses/publicdomain/ + */ + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +//----------------------------------------------------------------------------- +var BUGNUMBER = 614070; +var summary = 'Array.prototype.unshift without args'; + +print(BUGNUMBER + ": " + summary); + +/************** + * BEGIN TEST * + **************/ + +// ES6 ToLength clamps length values to 2^53 - 1. +var MAX_LENGTH = 2**53 - 1; + +var a = {}; +a.length = MAX_LENGTH + 1; +assert.sameValue([].unshift.call(a), MAX_LENGTH); +assert.sameValue(a.length, MAX_LENGTH); + +function testGetSet(len, expected) { + var newlen; + var a = { get length() { return len; }, set length(v) { newlen = v; } }; + var res = [].unshift.call(a); + assert.sameValue(res, expected); + assert.sameValue(newlen, expected); +} + +testGetSet(0, 0); +testGetSet(10, 10); +testGetSet("1", 1); +testGetSet(null, 0); +testGetSet(MAX_LENGTH + 2, MAX_LENGTH); +testGetSet(-5, 0); + +/******************************************************************************/ + +print("All tests passed!"); diff --git a/test/staging/sm/Array/unshift-with-enumeration.js b/test/staging/sm/Array/unshift-with-enumeration.js new file mode 100644 index 0000000000..715d360f69 --- /dev/null +++ b/test/staging/sm/Array/unshift-with-enumeration.js @@ -0,0 +1,27 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [compareArray.js, sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +function f(array, method, args) { + var called = false; + var keys = []; + for (var key in array) { + keys.push(key); + if (!called) { + called = true; + Reflect.apply(method, array, args); + } + } + return keys; +} + +assert.compareArray(f([1, /* hole */, 3], Array.prototype.unshift, [0]), ["0"]); +assert.compareArray(f([1, /* hole */, 3], Array.prototype.splice, [0, 0, 0]), ["0"]); + diff --git a/test/staging/sm/Array/values.js b/test/staging/sm/Array/values.js new file mode 100644 index 0000000000..8a6550b128 --- /dev/null +++ b/test/staging/sm/Array/values.js @@ -0,0 +1,28 @@ +/* + * Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/licenses/publicdomain/ + */ + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +if (Array.prototype.values) { + assert.sameValue(Array.prototype.values, Array.prototype[Symbol.iterator]); + assert.sameValue(Array.prototype.values.name, "values"); + assert.sameValue(Array.prototype.values.length, 0); + + function valuesUnscopeable() { + var values = "foo"; + with ([1, 2, 3]) { + assert.sameValue(indexOf, Array.prototype.indexOf); + assert.sameValue(values, "foo"); + } + } + valuesUnscopeable(); +} + diff --git a/test/staging/sm/Array/with-dense.js b/test/staging/sm/Array/with-dense.js new file mode 100644 index 0000000000..58652b4d77 --- /dev/null +++ b/test/staging/sm/Array/with-dense.js @@ -0,0 +1,111 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ + +const indices = [ + -10, -5, -4, -3, -2, -1, 0, 1, 2, 3, 4, 5, 10, +]; + +const arrays = [ + // Dense no holes. + [], + [1], + [1,2], + [1,2,3], + [1,2,3,4], + [1,2,3,4,5,6,7,8], + + // Dense trailing holes. + [,], + [1,,], + [1,2,,], + [1,2,3,,], + [1,2,3,4,,], + [1,2,3,4,5,6,7,8,,], + + // Dense leading holes. + [,], + [,1], + [,1,2], + [,1,2,3], + [,1,2,3,4], + [,1,2,3,4,5,6,7,8], + + // Dense with holes. + [1,,3], + [1,2,,4], + [1,,3,,5,6,,8], +]; + +const objects = arrays.map(array => { + let obj = { + length: array.length, + }; + for (let i = 0; i < array.length; ++i) { + if (i in array) { + obj[i] = array[i]; + } + } + return obj; +}); + +const objectsWithLargerDenseInitializedLength = arrays.map(array => { + let obj = { + length: array.length, + }; + for (let i = 0; i < array.length; ++i) { + if (i in array) { + obj[i] = array[i]; + } + } + + // Add some extra dense elements after |length|. + for (let i = 0; i < 5; ++i) { + obj[array.length + i] = "extra"; + } + + return obj; +}); + +const thisValues = [ + ...arrays, + ...objects, + ...objectsWithLargerDenseInitializedLength, +]; + +const replacement = {}; + +for (let thisValue of thisValues) { + for (let index of indices) { + let actualIndex = index; + if (actualIndex < 0) { + actualIndex += thisValue.length; + } + + if (actualIndex < 0 || actualIndex >= thisValue.length) { + continue; + } + + let res = Array.prototype.with.call(thisValue, index, replacement); + assert.sameValue(res.length, thisValue.length); + + for (let i = 0; i < thisValue.length; ++i) { + assert.sameValue(Object.hasOwn(res, i), true); + + if (i === actualIndex) { + assert.sameValue(res[i], replacement); + } else { + assert.sameValue(res[i], thisValue[i]); + } + } + } +} + diff --git a/test/staging/sm/Array/with.js b/test/staging/sm/Array/with.js new file mode 100644 index 0000000000..097e78488e --- /dev/null +++ b/test/staging/sm/Array/with.js @@ -0,0 +1,25 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [deepEqual.js, sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ + +Object.defineProperty(Array.prototype, 0, { + set() { + throw "bad"; + }, +}); + +// Single element case. +assert.deepEqual([0].with(0, 1), [1]); + +// More than one element. +assert.deepEqual([1, 2].with(0, 3), [3, 2]); +assert.deepEqual([1, 2].with(1, 3), [1, 3]); + diff --git a/test/staging/sm/ArrayBuffer/CloneArrayBuffer.js b/test/staging/sm/ArrayBuffer/CloneArrayBuffer.js new file mode 100644 index 0000000000..8af7756c21 --- /dev/null +++ b/test/staging/sm/ArrayBuffer/CloneArrayBuffer.js @@ -0,0 +1,44 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +var BUGNUMBER = 1264941; +var summary = 'CloneArrayBuffer should be called with byteLength of source typedArray'; + +print(BUGNUMBER + ": " + summary); + +function test(ctor, byteLength) { + var abuf = new ctor(byteLength); + assert.sameValue(abuf.byteLength, byteLength); + + for (var byteOffset of [0, 16]) { + for (var elementLength = 0; + elementLength < (byteLength - byteOffset) / Float64Array.BYTES_PER_ELEMENT; + elementLength++) { + var a1 = new Float64Array(abuf, byteOffset, elementLength); + assert.sameValue(a1.buffer.byteLength, byteLength); + assert.sameValue(a1.byteLength, elementLength * Float64Array.BYTES_PER_ELEMENT); + assert.sameValue(a1.byteOffset, byteOffset); + + var a2 = new Float64Array(a1); + assert.sameValue(a2.buffer.byteLength, a1.byteLength); + assert.sameValue(a2.byteLength, a1.byteLength); + assert.sameValue(a2.byteOffset, 0); + } + } +} + +test(ArrayBuffer, 16); +test(ArrayBuffer, 128); + +class MyArrayBuffer extends ArrayBuffer {} +test(MyArrayBuffer, 16); +test(MyArrayBuffer, 128); + diff --git a/test/staging/sm/ArrayBuffer/bug1777413.js b/test/staging/sm/ArrayBuffer/bug1777413.js new file mode 100644 index 0000000000..8549858c49 --- /dev/null +++ b/test/staging/sm/ArrayBuffer/bug1777413.js @@ -0,0 +1,17 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +info: | + needs shell functions +description: | + pending +esid: pending +---*/ + +var b = createExternalArrayBuffer(0); +assert.sameValue(b.byteLength, 0); + diff --git a/test/staging/sm/ArrayBuffer/constructorNotCallable.js b/test/staging/sm/ArrayBuffer/constructorNotCallable.js new file mode 100644 index 0000000000..97bf738b41 --- /dev/null +++ b/test/staging/sm/ArrayBuffer/constructorNotCallable.js @@ -0,0 +1,17 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +assertThrowsInstanceOf(() => ArrayBuffer(), TypeError); +assertThrowsInstanceOf(() => ArrayBuffer(1), TypeError); +assertThrowsInstanceOf(() => ArrayBuffer.call(null), TypeError); +assertThrowsInstanceOf(() => ArrayBuffer.apply(null, []), TypeError); +assertThrowsInstanceOf(() => Reflect.apply(ArrayBuffer, null, []), TypeError); + diff --git a/test/staging/sm/ArrayBuffer/getter-name.js b/test/staging/sm/ArrayBuffer/getter-name.js new file mode 100644 index 0000000000..4a24737049 --- /dev/null +++ b/test/staging/sm/ArrayBuffer/getter-name.js @@ -0,0 +1,19 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +var BUGNUMBER = 1180290; +var summary = 'ArrayBuffer getters should have get prefix'; + +print(BUGNUMBER + ": " + summary); + +assert.sameValue(Object.getOwnPropertyDescriptor(ArrayBuffer, Symbol.species).get.name, "get [Symbol.species]"); +assert.sameValue(Object.getOwnPropertyDescriptor(ArrayBuffer.prototype, "byteLength").get.name, "get byteLength"); + diff --git a/test/staging/sm/ArrayBuffer/slice-species.js b/test/staging/sm/ArrayBuffer/slice-species.js new file mode 100644 index 0000000000..060389c005 --- /dev/null +++ b/test/staging/sm/ArrayBuffer/slice-species.js @@ -0,0 +1,189 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [deepEqual.js, sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +const tests = [ + [Int8Array, [9, 10, 11, 12, 13, 14, 15, 16]], + [Uint8Array, [9, 10, 11, 12, 13, 14, 15, 16]], + [Uint8ClampedArray, [9, 10, 11, 12, 13, 14, 15, 16]], + [Int16Array, [5, 6, 7, 8]], + [Uint16Array, [5, 6, 7, 8]], + [Int32Array, [3, 4]], + [Uint32Array, [3, 4]], + [Float32Array, [3, 4]], + [Float64Array, [2]], +]; + +let logs = []; +for (let [ctor, answer] of tests) { + let arr = new ctor([1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16]); + + let proxyProto = new Proxy({}, { + get(that, name) { + throw new Error("unexpected prop access"); + } + }); + + class MyArrayBuffer extends ArrayBuffer {} + + arr.buffer.constructor = new Proxy({}, { + get(that, name) { + if (name == Symbol.species) { + logs.push("get @@species"); + let C = new Proxy(function(...args) { + logs.push("call ctor"); + return new MyArrayBuffer(...args); + }, { + get(that, name) { + logs.push("get ctor." + String(name)); + if (name == "prototype") { + return proxyProto; + } + throw new Error("unexpected prop access"); + } + }); + return C; + } + throw new Error("unexpected prop access"); + } + }); + + logs.length = 0; + let buf = arr.buffer.slice(8, 16); + assert.sameValue(buf.constructor, MyArrayBuffer); + assert.deepEqual(logs, ["get @@species", "get ctor.prototype", "call ctor"]); + assert.deepEqual([...new ctor(buf)], answer); + + + // modified @@species + let a = arr.buffer; + a.constructor = { + [Symbol.species]: MyArrayBuffer + }; + let b = a.slice(8, 16); + assert.sameValue(b.constructor, MyArrayBuffer); + assert.deepEqual([...new ctor(b)], answer); + + class MyArrayBufferWithSpecies extends ArrayBuffer { + get [Symbol.species]() { + return MyArrayBufferWithSpecies; + } + } + a = arr.buffer; + a.constructor = MyArrayBufferWithSpecies; + b = a.slice(8, 16); + assert.sameValue(b.constructor, MyArrayBufferWithSpecies); + assert.deepEqual([...new ctor(b)], answer); + + // no @@species + a = arr.buffer; + a.constructor = { + [Symbol.species]: undefined + }; + b = a.slice(8, 16); + assert.sameValue(b.constructor, ArrayBuffer); + assert.deepEqual([...new ctor(b)], answer); + + a = arr.buffer; + a.constructor = { + [Symbol.species]: null + }; + b = a.slice(8, 16); + assert.sameValue(b.constructor, ArrayBuffer); + assert.deepEqual([...new ctor(b)], answer); + + // invalid @@species + for (let species of [0, 1.1, true, false, "a", /a/, Symbol.iterator, [], {}]) { + a = arr.buffer; + a.constructor = { + [Symbol.species]: species + }; + assertThrowsInstanceOf(() => a.slice(8, 16), TypeError); + } + + // undefined constructor + a = arr.buffer; + a.constructor = undefined; + b = a.slice(8, 16); + assert.sameValue(b.constructor, ArrayBuffer); + assert.deepEqual([...new ctor(b)], answer); + + // invalid constructor + for (let ctor of [null, 0, 1.1, true, false, "a", Symbol.iterator]) { + a = arr.buffer; + a.constructor = ctor; + assertThrowsInstanceOf(() => a.slice(8, 16), TypeError); + } + + // @@species from different global + let g = createNewGlobal(); + g.eval("var MyArrayBuffer = class MyArrayBuffer extends ArrayBuffer {};"); + a = arr.buffer; + a.constructor = { + [Symbol.species]: g.MyArrayBuffer + }; + b = a.slice(8, 16); + assert.sameValue(b.constructor, g.MyArrayBuffer); + assert.deepEqual([...new ctor(b)], answer); + + a = arr.buffer; + a.constructor = { + [Symbol.species]: g.ArrayBuffer + }; + b = a.slice(8, 16); + assert.sameValue(b.constructor, g.ArrayBuffer); + assert.deepEqual([...new ctor(b)], answer); + + // constructor from different global + g.eval(` +var MyArrayBufferWithSpecies = class MyArrayBufferWithSpecies extends ArrayBuffer { + get [Symbol.species]() { + return MyArrayBufferWithSpecies; + } +}; +`); + a = arr.buffer; + a.constructor = g.MyArrayBufferWithSpecies; + b = a.slice(8, 16); + assert.sameValue(b.constructor, g.MyArrayBufferWithSpecies); + assert.deepEqual([...new ctor(b)], answer); + + g.eval(` +var arr = new ${ctor.name}([1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16]); +var a = arr.buffer; +`); + b = ArrayBuffer.prototype.slice.call(g.a, 8, 16); + assert.sameValue(b.constructor, g.ArrayBuffer); + assert.deepEqual([...new ctor(b)], answer); + + // running in different global + b = g.a.slice(8, 16); + assert.sameValue(b.constructor, g.ArrayBuffer); + assert.deepEqual([...new ctor(b)], answer); + + // subclasses + // not-modified @@species + a = new MyArrayBuffer(16); + b = a.slice(8, 16); + assert.sameValue(b.constructor, MyArrayBuffer); + + // modified @@species + class MyArrayBuffer2 extends ArrayBuffer { + } + class MyArrayBuffer3 extends ArrayBuffer { + static get [Symbol.species]() { + return MyArrayBuffer2; + } + } + a = new MyArrayBuffer3(16); + b = a.slice(8, 16); + assert.sameValue(b.constructor, MyArrayBuffer2); +} + diff --git a/test/staging/sm/AsyncGenerators/async-generator-declaration-in-modules.js b/test/staging/sm/AsyncGenerators/async-generator-declaration-in-modules.js new file mode 100644 index 0000000000..d390d956a5 --- /dev/null +++ b/test/staging/sm/AsyncGenerators/async-generator-declaration-in-modules.js @@ -0,0 +1,22 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +async function* f() { + return "success"; +} + +var AsyncGenerator = (async function*(){}).constructor; + +assert.sameValue(f instanceof AsyncGenerator, true); + +f().next().then(v => { + assert.sameValue("success", v.value); +}); diff --git a/test/staging/sm/AsyncGenerators/create-function-parse-before-getprototype.js b/test/staging/sm/AsyncGenerators/create-function-parse-before-getprototype.js new file mode 100644 index 0000000000..e0cbe5ddcc --- /dev/null +++ b/test/staging/sm/AsyncGenerators/create-function-parse-before-getprototype.js @@ -0,0 +1,28 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +var getProtoCalled = false; + +var newTarget = Object.defineProperty(function(){}.bind(), "prototype", { + get() { + getProtoCalled = true; + return null; + } +}); + +var AsyncGenerator = async function*(){}.constructor; + +assertThrowsInstanceOf(() => { + Reflect.construct(AsyncGenerator, ["@error"], newTarget); +}, SyntaxError); + +assert.sameValue(getProtoCalled, false); + diff --git a/test/staging/sm/AsyncGenerators/for-await-bad-syntax.js b/test/staging/sm/AsyncGenerators/for-await-bad-syntax.js new file mode 100644 index 0000000000..42c3626ac0 --- /dev/null +++ b/test/staging/sm/AsyncGenerators/for-await-bad-syntax.js @@ -0,0 +1,33 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +var AsyncGenerator = async function*(){}.constructor; + +function assertSyntaxError(code) { + var functionCode = `async function* f() { ${code} }`; + assertThrowsInstanceOf(() => AsyncGenerator(code), SyntaxError, "AsyncGenerator:" + code); + assertThrowsInstanceOf(() => eval(functionCode), SyntaxError, "eval:" + functionCode); + var ieval = eval; + assertThrowsInstanceOf(() => ieval(functionCode), SyntaxError, "indirect eval:" + functionCode); +} + +assertSyntaxError(`for await (;;) ;`); + +for (var decl of ["", "var", "let", "const"]) { + for (var head of ["a", "a = 0", "a, b", "[a]", "[a] = 0", "{a}", "{a} = 0"]) { + // Ends with C-style for loop syntax. + assertSyntaxError(`for await (${decl} ${head} ;;) ;`); + + // Ends with for-in loop syntax. + assertSyntaxError(`for await (${decl} ${head} in null) ;`); + } +} + diff --git a/test/staging/sm/AsyncGenerators/for-await-of-error.js b/test/staging/sm/AsyncGenerators/for-await-of-error.js new file mode 100644 index 0000000000..a965d4d49d --- /dev/null +++ b/test/staging/sm/AsyncGenerators/for-await-of-error.js @@ -0,0 +1,29 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +var BUGNUMBER = 1391519; +var summary = "for-await-of outside of async function should provide better error"; + +print(BUGNUMBER + ": " + summary); + +assertThrowsInstanceOfWithMessageContains( + () => eval("for await (let x of []) {}"), + SyntaxError, + "for await (... of ...) is only valid in" +); + +// Extra `await` shouldn't throw that error. +assertThrowsInstanceOfWithMessageContains( + () => eval("async function f() { for await await (let x of []) {} }"), + SyntaxError, + "missing ( after for" +); + diff --git a/test/staging/sm/AsyncIterator/asynciterator.js b/test/staging/sm/AsyncIterator/asynciterator.js new file mode 100644 index 0000000000..af30060555 --- /dev/null +++ b/test/staging/sm/AsyncIterator/asynciterator.js @@ -0,0 +1,23 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +info: | + Property descriptor of AsyncIterator. + + AsyncIterator is not enabled unconditionally +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +features: +- async-iteration +description: | + pending +esid: pending +---*/ +const propDesc = Reflect.getOwnPropertyDescriptor(this, 'AsyncIterator'); +assert.sameValue(propDesc.value, AsyncIterator); +assert.sameValue(propDesc.writable, true); +assert.sameValue(propDesc.enumerable, false); +assert.sameValue(propDesc.configurable, true); + diff --git a/test/staging/sm/AsyncIterator/constructor-subclassable.js b/test/staging/sm/AsyncIterator/constructor-subclassable.js new file mode 100644 index 0000000000..76063c91e2 --- /dev/null +++ b/test/staging/sm/AsyncIterator/constructor-subclassable.js @@ -0,0 +1,20 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +info: | + AsyncIterator constructor can be subclassed. +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +features: +- async-iteration +description: | + pending +esid: pending +---*/ +class TestIterator extends AsyncIterator { +} + +assert.sameValue(new TestIterator() instanceof AsyncIterator, true); + diff --git a/test/staging/sm/AsyncIterator/constructor-throw-when-called-directly.js b/test/staging/sm/AsyncIterator/constructor-throw-when-called-directly.js new file mode 100644 index 0000000000..1c2c198cc0 --- /dev/null +++ b/test/staging/sm/AsyncIterator/constructor-throw-when-called-directly.js @@ -0,0 +1,17 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +info: | + AsyncIterator constructor throws when called directly. +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +features: +- async-iteration +description: | + pending +esid: pending +---*/ +assertThrowsInstanceOf(() => new AsyncIterator(), TypeError); + diff --git a/test/staging/sm/AsyncIterator/constructor-throw-without-new.js b/test/staging/sm/AsyncIterator/constructor-throw-without-new.js new file mode 100644 index 0000000000..fe7d86c6bd --- /dev/null +++ b/test/staging/sm/AsyncIterator/constructor-throw-without-new.js @@ -0,0 +1,19 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +info: | + AsyncIterator constructor throws when called without new. + + AsyncIterator is not enabled unconditionally +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +features: +- async-iteration +description: | + pending +esid: pending +---*/ +assertThrowsInstanceOf(() => AsyncIterator(), TypeError); + diff --git a/test/staging/sm/AsyncIterator/constructor.js b/test/staging/sm/AsyncIterator/constructor.js new file mode 100644 index 0000000000..a621016147 --- /dev/null +++ b/test/staging/sm/AsyncIterator/constructor.js @@ -0,0 +1,19 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +info: | + The AsyncIterator constructor is a built-in function. + + AsyncIterator is not enabled unconditionally +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +features: +- async-iteration +description: | + pending +esid: pending +---*/ +assert.sameValue(typeof AsyncIterator, 'function'); + diff --git a/test/staging/sm/AsyncIterator/length.js b/test/staging/sm/AsyncIterator/length.js new file mode 100644 index 0000000000..29148b98a6 --- /dev/null +++ b/test/staging/sm/AsyncIterator/length.js @@ -0,0 +1,23 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +info: | + The "length" property of AsyncIterator + + AsyncIterator is not enabled unconditionally +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +features: +- async-iteration +description: | + pending +esid: pending +---*/ +const propDesc = Reflect.getOwnPropertyDescriptor(AsyncIterator, 'length'); +assert.sameValue(propDesc.value, 0); +assert.sameValue(propDesc.writable, false); +assert.sameValue(propDesc.enumerable, false); +assert.sameValue(propDesc.configurable, true); + diff --git a/test/staging/sm/AsyncIterator/name.js b/test/staging/sm/AsyncIterator/name.js new file mode 100644 index 0000000000..140ab86e6b --- /dev/null +++ b/test/staging/sm/AsyncIterator/name.js @@ -0,0 +1,23 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +info: | + The "name" property of AsyncIterator + + AsyncIterator is not enabled unconditionally +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +features: +- async-iteration +description: | + pending +esid: pending +---*/ +const propDesc = Reflect.getOwnPropertyDescriptor(AsyncIterator, 'name'); +assert.sameValue(propDesc.value, 'AsyncIterator'); +assert.sameValue(propDesc.writable, false); +assert.sameValue(propDesc.enumerable, false); +assert.sameValue(propDesc.configurable, true); + diff --git a/test/staging/sm/AsyncIterator/proto.js b/test/staging/sm/AsyncIterator/proto.js new file mode 100644 index 0000000000..1b0c6c7c12 --- /dev/null +++ b/test/staging/sm/AsyncIterator/proto.js @@ -0,0 +1,24 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +info: | + The prototype of the AsyncIterator constructor is the intrinsic object %FunctionPrototype%. + + AsyncIterator is not enabled unconditionally +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +features: +- async-iteration +description: | + pending +esid: pending +---*/ +assert.sameValue(Object.getPrototypeOf(AsyncIterator), Function.prototype); + +const propDesc = Reflect.getOwnPropertyDescriptor(AsyncIterator, 'prototype'); +assert.sameValue(propDesc.writable, false); +assert.sameValue(propDesc.enumerable, false); +assert.sameValue(propDesc.configurable, false); + diff --git a/test/staging/sm/AsyncIterator/prototype/asIndexedPairs/asIndexedPairs.js b/test/staging/sm/AsyncIterator/prototype/asIndexedPairs/asIndexedPairs.js new file mode 100644 index 0000000000..40f97095cc --- /dev/null +++ b/test/staging/sm/AsyncIterator/prototype/asIndexedPairs/asIndexedPairs.js @@ -0,0 +1,34 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +features: +- async-iteration +description: | + pending +esid: pending +---*/ + +async function* gen() { + yield 1; + yield 2; + yield 3; +} + +let iter = gen().asIndexedPairs(); + +for (const v of [[0, 1], [1, 2], [2, 3]]) { + iter.next().then( + result => { + assert.sameValue(result.done, false); + assert.sameValue(result.value[0], v[0]); + assert.sameValue(result.value[1], v[1]); + } + ); +} + +iter.next().then(({done}) => assert.sameValue(done, true)); + diff --git a/test/staging/sm/AsyncIterator/prototype/asIndexedPairs/length.js b/test/staging/sm/AsyncIterator/prototype/asIndexedPairs/length.js new file mode 100644 index 0000000000..33919d3bdd --- /dev/null +++ b/test/staging/sm/AsyncIterator/prototype/asIndexedPairs/length.js @@ -0,0 +1,26 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +esid: pending +description: | + %AsyncIterator.prototype%.asIndexedPairs length value and descriptor. +info: | + 17 ECMAScript Standard Built-in Objects +features: +- async-iteration +- iterator-helpers +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +---*/ +// + +assert.sameValue(AsyncIterator.prototype.asIndexedPairs.length, 0); + +const propertyDescriptor = Reflect.getOwnPropertyDescriptor(AsyncIterator.prototype.asIndexedPairs, 'length'); +assert.sameValue(propertyDescriptor.value, 0); +assert.sameValue(propertyDescriptor.enumerable, false); +assert.sameValue(propertyDescriptor.writable, false); +assert.sameValue(propertyDescriptor.configurable, true); + diff --git a/test/staging/sm/AsyncIterator/prototype/asIndexedPairs/name.js b/test/staging/sm/AsyncIterator/prototype/asIndexedPairs/name.js new file mode 100644 index 0000000000..d4820c4268 --- /dev/null +++ b/test/staging/sm/AsyncIterator/prototype/asIndexedPairs/name.js @@ -0,0 +1,25 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +esid: pending +description: | + %AsyncIterator.prototype%.asIndexedPairs.name value and descriptor. +info: | + 17 ECMAScript Standard Built-in Objects +features: +- async-iteration +- iterator-helpers +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +---*/ + +assert.sameValue(AsyncIterator.prototype.asIndexedPairs.name, 'asIndexedPairs'); + +const propertyDescriptor = Reflect.getOwnPropertyDescriptor(AsyncIterator.prototype.asIndexedPairs, 'name'); +assert.sameValue(propertyDescriptor.value, 'asIndexedPairs'); +assert.sameValue(propertyDescriptor.enumerable, false); +assert.sameValue(propertyDescriptor.writable, false); +assert.sameValue(propertyDescriptor.configurable, true); + diff --git a/test/staging/sm/AsyncIterator/prototype/async-iterator-helpers-from-other-global.js b/test/staging/sm/AsyncIterator/prototype/async-iterator-helpers-from-other-global.js new file mode 100644 index 0000000000..f0d99cdecb --- /dev/null +++ b/test/staging/sm/AsyncIterator/prototype/async-iterator-helpers-from-other-global.js @@ -0,0 +1,75 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +features: +- async-iteration +description: | + pending +esid: pending +---*/ + +class TestError extends Error {} + +class TestIterator extends AsyncIterator { + async next() { + return {done: false, value: 'value'}; + } + + closed = false; + async return(value) { + this.closed = true; + return {done: true, value}; + } +} + +function checkIterResult({done, value}, expectedDone, expectedValue) { + assert.sameValue(done, expectedDone); + assert.sameValue(Array.isArray(value) ? value[1] : value, expectedValue); +} + +const otherGlobal = createNewGlobal({newCompartment: true}); + +const methods = [ + ["map", x => x], + ["filter", x => true], + ["take", Infinity], + ["drop", 0], + ["asIndexedPairs", undefined], + ["flatMap", async function*(x) { yield x; }], +]; + +const {next: otherNext, return: otherReturn, throw: otherThrow} = + Object.getPrototypeOf(otherGlobal.eval("(async function*() {})().map(x => x)")); + +(async () => { + for (const [method, arg] of methods) { + const iterator = new TestIterator(); + const helper = iterator[method](arg); + checkIterResult(await otherNext.call(helper), false, 'value'); + } + + for (const [method, arg] of methods) { + const iterator = new TestIterator(); + const helper = iterator[method](arg); + assert.sameValue(iterator.closed, false); + checkIterResult(await otherReturn.call(helper), true, undefined); + assert.sameValue(iterator.closed, true); + } + + for (const [method, arg] of methods) { + const iterator = new TestIterator(); + const helper = iterator[method](arg); + try { + await otherThrow.call(helper, new TestError()); + assert.sameValue(true, false, 'Expected exception'); + } catch (exc) { + assert.sameValue(exc instanceof TestError, true); + } + checkIterResult(await helper.next(), true, undefined); + } +})(); + diff --git a/test/staging/sm/AsyncIterator/prototype/clobber-symbol.js b/test/staging/sm/AsyncIterator/prototype/clobber-symbol.js new file mode 100644 index 0000000000..06565cfa87 --- /dev/null +++ b/test/staging/sm/AsyncIterator/prototype/clobber-symbol.js @@ -0,0 +1,56 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +esid: pending +description: | + %AsyncIterator.prototype% methods work even if the global Symbol has been clobbered. +info: | + Iterator Helpers proposal 2.1.6 +features: +- Symbol.asyncIterator +- async-iteration +- iterator-helpers +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +---*/ +// +// + +Symbol = undefined; +assertThrowsInstanceOf(() => Symbol.asyncIterator, TypeError); + +async function* gen(value) { + yield value; +} + +const lazyMethods = [ + iter => iter.map(x => x), + iter => iter.filter(x => x), + iter => iter.take(1), + iter => iter.drop(0), + iter => iter.asIndexedPairs(), + iter => iter.flatMap(gen), +]; + +const strictMethods = [ + iter => iter.reduce((_, x) => x, undefined), + iter => iter.toArray(), + iter => iter.forEach(() => undefined), + iter => iter.some(x => true), + iter => iter.every(x => true), + iter => iter.find(x => true), +]; + +(async () => { + for (const method of lazyMethods) { + const {value} = await method(gen('value')).next(); + assert.sameValue(Array.isArray(value) ? value[1] : value, 'value'); + } + + for (const method of strictMethods) { + await method(gen('value')); + } +})(); + diff --git a/test/staging/sm/AsyncIterator/prototype/drop/drop-more-than-available.js b/test/staging/sm/AsyncIterator/prototype/drop/drop-more-than-available.js new file mode 100644 index 0000000000..3b64a39ea0 --- /dev/null +++ b/test/staging/sm/AsyncIterator/prototype/drop/drop-more-than-available.js @@ -0,0 +1,43 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +esid: pending +description: | + %AsyncIterator.prototype%.drop returns if the iterator is done. +info: | + Iterator Helpers proposal 2.1.6.5 1. Repeat, while remaining > 0, + ... + b. Let next be ? Await(? IteratorStep(iterated)). + c. If ? IteratorComplete(next) is true, return undefined. +features: +- async-iteration +- iterator-helpers +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +---*/ + +// +// +class TestIterator extends AsyncIterator { + counter = 0; + async next() { + return {done: ++this.counter >= 2, value: undefined}; + } +} + +(async () => { + let iter = [1, 2].values().drop(3); + let result = await iter.next(); + assert.sameValue(result.value, undefined); + assert.sameValue(result.done, true); + + iter = new TestIterator(); + let dropped = iter.drop(10); + result = await dropped.next(); + assert.sameValue(result.value, undefined); + assert.sameValue(result.done, true); + assert.sameValue(iter.counter, 2); +})(); + diff --git a/test/staging/sm/AsyncIterator/prototype/drop/drop.js b/test/staging/sm/AsyncIterator/prototype/drop/drop.js new file mode 100644 index 0000000000..224e5eb3ee --- /dev/null +++ b/test/staging/sm/AsyncIterator/prototype/drop/drop.js @@ -0,0 +1,33 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +features: +- async-iteration +description: | + pending +esid: pending +---*/ + +async function* gen() { + yield 1; + yield 2; + yield 3; +} + +let iter = gen().drop(1); + +for (const v of [2, 3]) { + iter.next().then( + ({done, value}) => { + assert.sameValue(done, false); + assert.sameValue(value, v); + } + ); +} + +iter.next().then(({done}) => assert.sameValue(done, true)); + diff --git a/test/staging/sm/AsyncIterator/prototype/drop/length.js b/test/staging/sm/AsyncIterator/prototype/drop/length.js new file mode 100644 index 0000000000..dba4cc5306 --- /dev/null +++ b/test/staging/sm/AsyncIterator/prototype/drop/length.js @@ -0,0 +1,24 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +esid: pending +description: | + %AsyncIterator.prototype%.drop length value and descriptor. +features: +- async-iteration +- iterator-helpers +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +---*/ +// + +assert.sameValue(AsyncIterator.prototype.drop.length, 1); + +const propertyDescriptor = Reflect.getOwnPropertyDescriptor(AsyncIterator.prototype.drop, 'length'); +assert.sameValue(propertyDescriptor.value, 1); +assert.sameValue(propertyDescriptor.enumerable, false); +assert.sameValue(propertyDescriptor.writable, false); +assert.sameValue(propertyDescriptor.configurable, true); + diff --git a/test/staging/sm/AsyncIterator/prototype/drop/name.js b/test/staging/sm/AsyncIterator/prototype/drop/name.js new file mode 100644 index 0000000000..9158234e92 --- /dev/null +++ b/test/staging/sm/AsyncIterator/prototype/drop/name.js @@ -0,0 +1,25 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +esid: pending +description: | + %AsyncIterator.prototype%.drop.name value and descriptor. +info: | + 17 ECMAScript Standard Built-in Objects +features: +- async-iteration +- iterator-helpers +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +---*/ + +assert.sameValue(AsyncIterator.prototype.drop.name, 'drop'); + +const propertyDescriptor = Reflect.getOwnPropertyDescriptor(AsyncIterator.prototype.drop, 'name'); +assert.sameValue(propertyDescriptor.value, 'drop'); +assert.sameValue(propertyDescriptor.enumerable, false); +assert.sameValue(propertyDescriptor.writable, false); +assert.sameValue(propertyDescriptor.configurable, true); + diff --git a/test/staging/sm/AsyncIterator/prototype/every/async-writes.js b/test/staging/sm/AsyncIterator/prototype/every/async-writes.js new file mode 100644 index 0000000000..d95d33e8b3 --- /dev/null +++ b/test/staging/sm/AsyncIterator/prototype/every/async-writes.js @@ -0,0 +1,30 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +features: +- async-iteration +description: | + pending +esid: pending +---*/ + +let x = {a: () => true}; + +async function* gen() { + yield x.a(); + yield x.a(); +} + +gen().every(() => true).then( + () => assert.sameValue(true, false, 'expected error'), + err => assert.sameValue(err instanceof Error, true), +); + +x.a = () => { + throw Error(); +}; + diff --git a/test/staging/sm/AsyncIterator/prototype/every/check-fn-after-getting-iterator.js b/test/staging/sm/AsyncIterator/prototype/every/check-fn-after-getting-iterator.js new file mode 100644 index 0000000000..e5860a831c --- /dev/null +++ b/test/staging/sm/AsyncIterator/prototype/every/check-fn-after-getting-iterator.js @@ -0,0 +1,40 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +features: +- async-iteration +description: | + pending +esid: pending +---*/ +const log = []; +const handlerProxy = new Proxy({}, { + get: (target, key, receiver) => (...args) => { + log.push(`${key}: ${args[1]?.toString()}`); + return Reflect[key](...args); + }, +}); + +class TestIterator extends AsyncIterator { + next() { + return Promise.resolve({done: true}); + } +} + +async function* gen() { + yield 1; +} + +const iter = new Proxy(new TestIterator(), handlerProxy); +iter.every(1).then(() => assert.sameValue(true, false, 'expected error'), err => assert.sameValue(err instanceof TypeError, true)); + +assert.sameValue( + log.join('\n'), + `get: every +get: next` +); + diff --git a/test/staging/sm/AsyncIterator/prototype/every/coerce-result-to-boolean.js b/test/staging/sm/AsyncIterator/prototype/every/coerce-result-to-boolean.js new file mode 100644 index 0000000000..bf4261991a --- /dev/null +++ b/test/staging/sm/AsyncIterator/prototype/every/coerce-result-to-boolean.js @@ -0,0 +1,40 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +features: +- IsHTMLDDA +- async-iteration +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ + +async function* gen(value) { + yield value; +} +const fn = x => x; +function check(value, expected) { + gen(value).every(fn).then(result => assert.sameValue(result, expected)); +} + +check(true, true); +check(1, true); +check([], true); +check({}, true); +check('test', true); + +check(false, false); +check(0, false); +check('', false); +check(null, false); +check(undefined, false); +check(NaN, false); +check(-0, false); +check(0n, false); +check(createIsHTMLDDA(), false); +check(Promise.resolve(false), false); + diff --git a/test/staging/sm/AsyncIterator/prototype/every/descriptor.js b/test/staging/sm/AsyncIterator/prototype/every/descriptor.js new file mode 100644 index 0000000000..1befd8b84e --- /dev/null +++ b/test/staging/sm/AsyncIterator/prototype/every/descriptor.js @@ -0,0 +1,20 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +features: +- async-iteration +description: | + pending +esid: pending +---*/ + +const propDesc = Reflect.getOwnPropertyDescriptor(AsyncIterator.prototype, 'every'); +assert.sameValue(typeof propDesc.value, 'function'); +assert.sameValue(propDesc.writable, true); +assert.sameValue(propDesc.enumerable, false); +assert.sameValue(propDesc.configurable, true); + diff --git a/test/staging/sm/AsyncIterator/prototype/every/error-from-correct-realm.js b/test/staging/sm/AsyncIterator/prototype/every/error-from-correct-realm.js new file mode 100644 index 0000000000..533bb81ce3 --- /dev/null +++ b/test/staging/sm/AsyncIterator/prototype/every/error-from-correct-realm.js @@ -0,0 +1,31 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +features: +- async-iteration +description: | + pending +esid: pending +---*/ + +const otherGlobal = createNewGlobal({newCompartment: true}); +assert.sameValue(TypeError !== otherGlobal.TypeError, true); + +async function *gen() {} + +gen().every().then(() => assert.sameValue(true, false, 'expected error'), err => { + assert.sameValue(err instanceof TypeError, true); +}); + +otherGlobal.AsyncIterator.prototype.every.call(gen()).then(() => assert.sameValue(true, false, 'expected error'), err => { + assert.sameValue( + err instanceof otherGlobal.TypeError, + true, + 'TypeError comes from the realm of the method.', + ); +}); + diff --git a/test/staging/sm/AsyncIterator/prototype/every/fn-not-callable-throws.js b/test/staging/sm/AsyncIterator/prototype/every/fn-not-callable-throws.js new file mode 100644 index 0000000000..b345e4a825 --- /dev/null +++ b/test/staging/sm/AsyncIterator/prototype/every/fn-not-callable-throws.js @@ -0,0 +1,36 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +features: +- async-iteration +description: | + pending +esid: pending +---*/ + +async function *gen() { + yield 1; +} + +function check(fn) { + gen().every(fn).then(() => { + throw new Error('every should have thrown'); + }, + (err) => { + assert.sameValue(err instanceof TypeError, true); + }); +} + +check(); +check(undefined); +check(null); +check(0); +check(false); +check(''); +check(Symbol('')); +check({}); + diff --git a/test/staging/sm/AsyncIterator/prototype/every/fn-throws-close-iterator.js b/test/staging/sm/AsyncIterator/prototype/every/fn-throws-close-iterator.js new file mode 100644 index 0000000000..0ef5a24281 --- /dev/null +++ b/test/staging/sm/AsyncIterator/prototype/every/fn-throws-close-iterator.js @@ -0,0 +1,34 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +features: +- async-iteration +description: | + pending +esid: pending +---*/ + +class TestIterator extends AsyncIterator { + next() { + return Promise.resolve({ done: this.closed }); + } + + closed = false; + return() { + this.closed = true; + } +} + +const fn = () => { throw new Error(); }; +const iter = new TestIterator(); + +assert.sameValue(iter.closed, false); +iter.every(fn).then(() => assert.sameValue(true, false, 'expected error'), err => { + assert.sameValue(err instanceof Error, true); + assert.sameValue(iter.closed, true); +}); + diff --git a/test/staging/sm/AsyncIterator/prototype/every/interleaving-calls.js b/test/staging/sm/AsyncIterator/prototype/every/interleaving-calls.js new file mode 100644 index 0000000000..b65b39bc85 --- /dev/null +++ b/test/staging/sm/AsyncIterator/prototype/every/interleaving-calls.js @@ -0,0 +1,34 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +features: +- async-iteration +description: | + pending +esid: pending +---*/ + +const log = []; +async function* gen(n) { + log.push(`${n}`); + yield 1; + log.push(`${n}`); + yield 2; +} + +Promise.all([gen(1).every(() => true), gen(2).every(() => true)]).then( + () => { + assert.sameValue( + log.join(' '), + '1 2 1 2', + ); + }, + err => { + throw err; + } +); + diff --git a/test/staging/sm/AsyncIterator/prototype/every/length.js b/test/staging/sm/AsyncIterator/prototype/every/length.js new file mode 100644 index 0000000000..603b56c51f --- /dev/null +++ b/test/staging/sm/AsyncIterator/prototype/every/length.js @@ -0,0 +1,23 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +description: | + The `length` property of AsyncIterator.prototype.every. +info: | + ES7 section 17: Unless otherwise specified, the length property of a built-in + Function object has the attributes { [[Writable]]: false, [[Enumerable]]: + false, [[Configurable]]: true }. +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +features: +- async-iteration +esid: pending +---*/ +const propDesc = Reflect.getOwnPropertyDescriptor(AsyncIterator.prototype.every, 'length'); +assert.sameValue(propDesc.value, 1); +assert.sameValue(propDesc.writable, false); +assert.sameValue(propDesc.enumerable, false); +assert.sameValue(propDesc.configurable, true); + diff --git a/test/staging/sm/AsyncIterator/prototype/every/name.js b/test/staging/sm/AsyncIterator/prototype/every/name.js new file mode 100644 index 0000000000..de3695890e --- /dev/null +++ b/test/staging/sm/AsyncIterator/prototype/every/name.js @@ -0,0 +1,19 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +description: | + `name` property of AsyncIterator.prototype.every. +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +features: +- async-iteration +esid: pending +---*/ +const propDesc = Reflect.getOwnPropertyDescriptor(AsyncIterator.prototype.every, 'name'); +assert.sameValue(propDesc.value, 'every'); +assert.sameValue(propDesc.writable, false); +assert.sameValue(propDesc.enumerable, false); +assert.sameValue(propDesc.configurable, true); + diff --git a/test/staging/sm/AsyncIterator/prototype/every/next-throws-iterator-not-closed.js b/test/staging/sm/AsyncIterator/prototype/every/next-throws-iterator-not-closed.js new file mode 100644 index 0000000000..91804d4255 --- /dev/null +++ b/test/staging/sm/AsyncIterator/prototype/every/next-throws-iterator-not-closed.js @@ -0,0 +1,34 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +features: +- async-iteration +description: | + pending +esid: pending +---*/ + +class TestIterator extends AsyncIterator { + next() { + throw new Error(); + } + + closed = false; + return() { + this.closed = true; + } +} + +const fn = () => {}; +const iter = new TestIterator(); + +assert.sameValue(iter.closed, false); +iter.every(fn).then(() => assert.sameValue(true, false, 'expected error'), err => { + assert.sameValue(err instanceof Error, true); + assert.sameValue(iter.closed, false); +}); + diff --git a/test/staging/sm/AsyncIterator/prototype/every/proxy.js b/test/staging/sm/AsyncIterator/prototype/every/proxy.js new file mode 100644 index 0000000000..b0d47327cd --- /dev/null +++ b/test/staging/sm/AsyncIterator/prototype/every/proxy.js @@ -0,0 +1,56 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +features: +- async-iteration +description: | + pending +esid: pending +---*/ +// +// This test checks that %AsyncIterator.prototype%.every only gets the `next` method off of the +// iterator once, and never accesses the @@asyncIterator property. +const log = []; +const handlerProxy = new Proxy({}, { + get: (target, key, receiver) => (...args) => { + log.push(`${key}: ${args[1]?.toString()}`); + return Reflect[key](...args); + }, +}); + +class Counter extends AsyncIterator { + value = 0; + next() { + const value = this.value; + if (value < 2) { + this.value = value + 1; + return Promise.resolve({done: false, value}); + } + return Promise.resolve({done: true}); + } +} + +const iter = new Proxy(new Counter(), handlerProxy); +iter.every(x => x % 2 == 0).then(value => { + assert.sameValue(value, false) + + assert.sameValue( + log.join('\n'), + `get: every +get: next +get: value +set: value +getOwnPropertyDescriptor: value +defineProperty: value +get: value +set: value +getOwnPropertyDescriptor: value +defineProperty: value +get: return` + ); +}); + diff --git a/test/staging/sm/AsyncIterator/prototype/every/return-true-if-all-match.js b/test/staging/sm/AsyncIterator/prototype/every/return-true-if-all-match.js new file mode 100644 index 0000000000..05b34832ba --- /dev/null +++ b/test/staging/sm/AsyncIterator/prototype/every/return-true-if-all-match.js @@ -0,0 +1,26 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +features: +- async-iteration +description: | + pending +esid: pending +---*/ + +async function* gen() { + yield 1; + yield 3; + yield 5; +} +const fn = x => x % 2 == 1; + +gen().every(fn).then(result => assert.sameValue(result, true)); + +async function* empty() {} +empty().every(x => x).then(result => assert.sameValue(result, true)); + diff --git a/test/staging/sm/AsyncIterator/prototype/every/short-circuit-on-false.js b/test/staging/sm/AsyncIterator/prototype/every/short-circuit-on-false.js new file mode 100644 index 0000000000..6ecf8b404d --- /dev/null +++ b/test/staging/sm/AsyncIterator/prototype/every/short-circuit-on-false.js @@ -0,0 +1,31 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +features: +- async-iteration +description: | + pending +esid: pending +---*/ + +async function* gen() { + yield 1; + yield 2; + yield 3; +} + +const log = []; +const fn = value => { + log.push(value.toString()); + return value % 2 == 1; +}; + +gen().every(fn).then(result => { + assert.sameValue(result, false); + assert.sameValue(log.join(','), '1,2'); +}); + diff --git a/test/staging/sm/AsyncIterator/prototype/every/this-not-iterator-throws.js b/test/staging/sm/AsyncIterator/prototype/every/this-not-iterator-throws.js new file mode 100644 index 0000000000..5f14d22c32 --- /dev/null +++ b/test/staging/sm/AsyncIterator/prototype/every/this-not-iterator-throws.js @@ -0,0 +1,32 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +features: +- async-iteration +description: | + pending +esid: pending +---*/ + +const fn = x => x; + +function check(x) { + AsyncIterator.prototype.every.call(x, fn).then( + () => { + throw new Error('check should have been rejected'); + }, + err => { + assert.sameValue(err instanceof TypeError, true); + } + ); +} + +check(); +check(undefined); +check({}); +check({next: 0}); + diff --git a/test/staging/sm/AsyncIterator/prototype/every/value-throws-iterator-not-closed.js b/test/staging/sm/AsyncIterator/prototype/every/value-throws-iterator-not-closed.js new file mode 100644 index 0000000000..1fe2de45db --- /dev/null +++ b/test/staging/sm/AsyncIterator/prototype/every/value-throws-iterator-not-closed.js @@ -0,0 +1,38 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +features: +- async-iteration +description: | + pending +esid: pending +---*/ + +class TestError extends Error {} +class TestIterator extends AsyncIterator { + next() { + return Promise.resolve({ + done: false, + get value() { + throw new TestError(); + } + }); + } + + closed = false; + return() { + closed = true; + } +} + +const iterator = new TestIterator(); +assert.sameValue(iterator.closed, false, 'iterator starts unclosed'); +iterator.every(x => x).then(() => assert.sameValue(true, false, 'expected error'), err => { + assert.sameValue(err instanceof TestError, true); + assert.sameValue(iterator.closed, false, 'iterator remains unclosed'); +}); + diff --git a/test/staging/sm/AsyncIterator/prototype/filter/coerce-result-to-boolean.js b/test/staging/sm/AsyncIterator/prototype/filter/coerce-result-to-boolean.js new file mode 100644 index 0000000000..e2ba13648b --- /dev/null +++ b/test/staging/sm/AsyncIterator/prototype/filter/coerce-result-to-boolean.js @@ -0,0 +1,36 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +features: +- IsHTMLDDA +- async-iteration +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ + +async function* gen(iterable) { + yield* iterable; +} + +// All truthy values are kept. +const truthyValues = [true, 1, [], {}, 'test']; +(async () => { + for await (const value of gen([...truthyValues]).filter(x => x)) { + assert.sameValue(truthyValues.shift(), value); + } +})(); + +// All falsy values are filtered out. +const falsyValues = [false, 0, '', null, undefined, NaN, -0, 0n, createIsHTMLDDA()]; +gen(falsyValues).filter(x => x).next().then( + ({done, value}) => { + assert.sameValue(done, true); + assert.sameValue(value, undefined); + } +); + diff --git a/test/staging/sm/AsyncIterator/prototype/filter/filter.js b/test/staging/sm/AsyncIterator/prototype/filter/filter.js new file mode 100644 index 0000000000..6204d78ddb --- /dev/null +++ b/test/staging/sm/AsyncIterator/prototype/filter/filter.js @@ -0,0 +1,33 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +features: +- async-iteration +description: | + pending +esid: pending +---*/ + +async function* gen() { + yield 1; + yield 2; + yield 3; +} + +let iter = gen().filter(x => x % 2); + +for (const v of [1, 3]) { + iter.next().then( + ({done, value}) => { + assert.sameValue(done, false); + assert.sameValue(value, v); + } + ); +} + +iter.next().then(({done}) => assert.sameValue(done, true)); + diff --git a/test/staging/sm/AsyncIterator/prototype/filter/length.js b/test/staging/sm/AsyncIterator/prototype/filter/length.js new file mode 100644 index 0000000000..1baed8d8e0 --- /dev/null +++ b/test/staging/sm/AsyncIterator/prototype/filter/length.js @@ -0,0 +1,26 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +esid: pending +description: | + %AsyncIterator.prototype%.filter length value and descriptor. +info: | + 17 ECMAScript Standard Built-in Objects +features: +- async-iteration +- iterator-helpers +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +---*/ +// + +assert.sameValue(AsyncIterator.prototype.filter.length, 1); + +const propertyDescriptor = Reflect.getOwnPropertyDescriptor(AsyncIterator.prototype.filter, 'length'); +assert.sameValue(propertyDescriptor.value, 1); +assert.sameValue(propertyDescriptor.enumerable, false); +assert.sameValue(propertyDescriptor.writable, false); +assert.sameValue(propertyDescriptor.configurable, true); + diff --git a/test/staging/sm/AsyncIterator/prototype/filter/name.js b/test/staging/sm/AsyncIterator/prototype/filter/name.js new file mode 100644 index 0000000000..58f157bc34 --- /dev/null +++ b/test/staging/sm/AsyncIterator/prototype/filter/name.js @@ -0,0 +1,24 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +esid: pending +description: | + %AsyncIterator.prototype%.filter.name value and descriptor. +info: | + 17 ECMAScript Standard Built-in Objects +features: +- async-iteration +- iterator-helpers +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +---*/ +assert.sameValue(AsyncIterator.prototype.filter.name, 'filter'); + +const propertyDescriptor = Reflect.getOwnPropertyDescriptor(AsyncIterator.prototype.filter, 'name'); +assert.sameValue(propertyDescriptor.value, 'filter'); +assert.sameValue(propertyDescriptor.enumerable, false); +assert.sameValue(propertyDescriptor.writable, false); +assert.sameValue(propertyDescriptor.configurable, true); + diff --git a/test/staging/sm/AsyncIterator/prototype/find/async-writes.js b/test/staging/sm/AsyncIterator/prototype/find/async-writes.js new file mode 100644 index 0000000000..aa9697b294 --- /dev/null +++ b/test/staging/sm/AsyncIterator/prototype/find/async-writes.js @@ -0,0 +1,30 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +features: +- async-iteration +description: | + pending +esid: pending +---*/ + +let x = {a: () => true}; + +async function* gen() { + yield x.a(); + yield x.a(); +} + +gen().find(() => {}).then( + () => assert.sameValue(true, false, 'expected error'), + err => assert.sameValue(err instanceof Error, true), +); + +x.a = () => { + throw Error(); +}; + diff --git a/test/staging/sm/AsyncIterator/prototype/find/check-fn-after-getting-iterator.js b/test/staging/sm/AsyncIterator/prototype/find/check-fn-after-getting-iterator.js new file mode 100644 index 0000000000..0b05d8a6d8 --- /dev/null +++ b/test/staging/sm/AsyncIterator/prototype/find/check-fn-after-getting-iterator.js @@ -0,0 +1,38 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +features: +- async-iteration +description: | + pending +esid: pending +---*/ +const log = []; +const handlerProxy = new Proxy({}, { + get: (target, key, receiver) => (...args) => { + log.push(`${key}: ${args[1]?.toString()}`); + return Reflect[key](...args); + }, +}); + +class TestIterator extends AsyncIterator { + next() { + return Promise.resolve({done: true}); + } +} + +const iter = new Proxy(new TestIterator(), handlerProxy); +iter.find(1).then(() => assert.sameValue(true, false, 'expected error'), err => { + assert.sameValue(err instanceof TypeError, true); + assert.sameValue( + log.join('\n'), + `get: find +get: next` + ); +}); + + diff --git a/test/staging/sm/AsyncIterator/prototype/find/coerce-result-to-boolean.js b/test/staging/sm/AsyncIterator/prototype/find/coerce-result-to-boolean.js new file mode 100644 index 0000000000..e1da77e9fc --- /dev/null +++ b/test/staging/sm/AsyncIterator/prototype/find/coerce-result-to-boolean.js @@ -0,0 +1,46 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +features: +- IsHTMLDDA +- async-iteration +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ + +async function* gen(value) { + yield value; +} +const fn = x => x; +function check(value, expected) { + gen(value).find(fn).then(result => assert.sameValue(result, expected)); +} + +check(true, true); +check(1, 1); +check('test', 'test'); + +check(false, undefined); +check(0, undefined); +check('', undefined); +check(null, undefined); +check(undefined, undefined); +check(NaN, undefined); +check(-0, undefined); +check(0n, undefined); +check(Promise.resolve(false), undefined); + +let array = []; +check(array, array); + +let object = {}; +check(object, object); + +const htmlDDA = createIsHTMLDDA(); +check(htmlDDA, undefined); + diff --git a/test/staging/sm/AsyncIterator/prototype/find/descriptor.js b/test/staging/sm/AsyncIterator/prototype/find/descriptor.js new file mode 100644 index 0000000000..04ca7b9150 --- /dev/null +++ b/test/staging/sm/AsyncIterator/prototype/find/descriptor.js @@ -0,0 +1,21 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +info: | + Descriptor property of AsyncIterator.prototype.find +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +features: +- async-iteration +description: | + pending +esid: pending +---*/ +const propDesc = Reflect.getOwnPropertyDescriptor(AsyncIterator.prototype, 'find'); +assert.sameValue(typeof propDesc.value, 'function'); +assert.sameValue(propDesc.writable, true); +assert.sameValue(propDesc.enumerable, false); +assert.sameValue(propDesc.configurable, true); + diff --git a/test/staging/sm/AsyncIterator/prototype/find/error-from-correct-realm.js b/test/staging/sm/AsyncIterator/prototype/find/error-from-correct-realm.js new file mode 100644 index 0000000000..0c1f3dfb69 --- /dev/null +++ b/test/staging/sm/AsyncIterator/prototype/find/error-from-correct-realm.js @@ -0,0 +1,31 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +features: +- async-iteration +description: | + pending +esid: pending +---*/ + +const otherGlobal = createNewGlobal({newCompartment: true}); +assert.sameValue(TypeError !== otherGlobal.TypeError, true); + +async function *gen() {} + +gen().find().then(() => assert.sameValue(true, false, 'expected error'), err => { + assert.sameValue(err instanceof TypeError, true); +}); + +otherGlobal.AsyncIterator.prototype.find.call(gen()).then(() => assert.sameValue(true, false, 'expected error'), err => { + assert.sameValue( + err instanceof otherGlobal.TypeError, + true, + 'TypeError comes from the realm of the method.', + ); +}); + diff --git a/test/staging/sm/AsyncIterator/prototype/find/fn-not-callable-throws.js b/test/staging/sm/AsyncIterator/prototype/find/fn-not-callable-throws.js new file mode 100644 index 0000000000..b345e4a825 --- /dev/null +++ b/test/staging/sm/AsyncIterator/prototype/find/fn-not-callable-throws.js @@ -0,0 +1,36 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +features: +- async-iteration +description: | + pending +esid: pending +---*/ + +async function *gen() { + yield 1; +} + +function check(fn) { + gen().every(fn).then(() => { + throw new Error('every should have thrown'); + }, + (err) => { + assert.sameValue(err instanceof TypeError, true); + }); +} + +check(); +check(undefined); +check(null); +check(0); +check(false); +check(''); +check(Symbol('')); +check({}); + diff --git a/test/staging/sm/AsyncIterator/prototype/find/fn-throws-close-iterator.js b/test/staging/sm/AsyncIterator/prototype/find/fn-throws-close-iterator.js new file mode 100644 index 0000000000..c2e1141595 --- /dev/null +++ b/test/staging/sm/AsyncIterator/prototype/find/fn-throws-close-iterator.js @@ -0,0 +1,36 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +features: +- async-iteration +description: | + pending +esid: pending +---*/ + +class TestIterator extends AsyncIterator { + next() { + return Promise.resolve({done: this.closed}); + } + + closed = false; + return() { + this.closed = true; + } +} + +const fn = () => { throw new Error(); }; +const iter = new TestIterator(); + +assert.sameValue(iter.closed, false); +iter.find(fn).then(() => { + throw new Error('promise should be rejected'); +}, err => { + assert.sameValue(err instanceof Error, true); + assert.sameValue(iter.closed, true); +}); + diff --git a/test/staging/sm/AsyncIterator/prototype/find/interleaving-calls.js b/test/staging/sm/AsyncIterator/prototype/find/interleaving-calls.js new file mode 100644 index 0000000000..66e424a42c --- /dev/null +++ b/test/staging/sm/AsyncIterator/prototype/find/interleaving-calls.js @@ -0,0 +1,34 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +features: +- async-iteration +description: | + pending +esid: pending +---*/ + +const log = []; +async function* gen(n) { + log.push(`${n}`); + yield 1; + log.push(`${n}`); + yield 2; +} + +Promise.all([gen(1).find(() => {}), gen(2).find(() => {})]).then( + () => { + assert.sameValue( + log.join(' '), + '1 2 1 2', + ); + }, + err => { + throw err; + } +); + diff --git a/test/staging/sm/AsyncIterator/prototype/find/length.js b/test/staging/sm/AsyncIterator/prototype/find/length.js new file mode 100644 index 0000000000..6b68ff0f5c --- /dev/null +++ b/test/staging/sm/AsyncIterator/prototype/find/length.js @@ -0,0 +1,23 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +description: | + The `length` property of AsyncIterator.prototype.find. +info: | + ES7 section 17: Unless otherwise specified, the length property of a built-in + Function object has the attributes { [[Writable]]: false, [[Enumerable]]: + false, [[Configurable]]: true }. +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +features: +- async-iteration +esid: pending +---*/ +const propDesc = Reflect.getOwnPropertyDescriptor(AsyncIterator.prototype.find, 'length'); +assert.sameValue(propDesc.value, 1); +assert.sameValue(propDesc.writable, false); +assert.sameValue(propDesc.enumerable, false); +assert.sameValue(propDesc.configurable, true); + diff --git a/test/staging/sm/AsyncIterator/prototype/find/name.js b/test/staging/sm/AsyncIterator/prototype/find/name.js new file mode 100644 index 0000000000..4b53e2550f --- /dev/null +++ b/test/staging/sm/AsyncIterator/prototype/find/name.js @@ -0,0 +1,19 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +description: | + `name` property of AsyncIterator.prototype.find. +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +features: +- async-iteration +esid: pending +---*/ +const propDesc = Reflect.getOwnPropertyDescriptor(AsyncIterator.prototype.find, 'name'); +assert.sameValue(propDesc.value, 'find'); +assert.sameValue(propDesc.writable, false); +assert.sameValue(propDesc.enumerable, false); +assert.sameValue(propDesc.configurable, true); + diff --git a/test/staging/sm/AsyncIterator/prototype/find/next-throws-iterator-not-closed.js b/test/staging/sm/AsyncIterator/prototype/find/next-throws-iterator-not-closed.js new file mode 100644 index 0000000000..8ff3da47d8 --- /dev/null +++ b/test/staging/sm/AsyncIterator/prototype/find/next-throws-iterator-not-closed.js @@ -0,0 +1,34 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +features: +- async-iteration +description: | + pending +esid: pending +---*/ + +class TestIterator extends AsyncIterator { + next() { + throw new Error(); + } + + closed = false; + return() { + this.closed = true; + } +} + +const fn = x => x; +const iter = new TestIterator(); + +assert.sameValue(iter.closed, false); +iter.find(fn).then(() => assert.sameValue(true, false, 'expected error'), err => { + assert.sameValue(err instanceof Error, true); + assert.sameValue(iter.closed, false); +}); + diff --git a/test/staging/sm/AsyncIterator/prototype/find/proxy.js b/test/staging/sm/AsyncIterator/prototype/find/proxy.js new file mode 100644 index 0000000000..e319f6a0ce --- /dev/null +++ b/test/staging/sm/AsyncIterator/prototype/find/proxy.js @@ -0,0 +1,56 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +features: +- async-iteration +description: | + pending +esid: pending +---*/ +// +// This test checks that %Iterator.prototype%.find only gets the `next` method off of the +// iterator once, and never accesses the @@iterator property. +const log = []; +const handlerProxy = new Proxy({}, { + get: (target, key, receiver) => (...args) => { + log.push(`${key}: ${args[1]?.toString()}`); + return Reflect[key](...args); + }, +}); + +class Counter extends AsyncIterator { + value = 0; + next() { + const value = this.value; + if (value < 2) { + this.value = value + 1; + return Promise.resolve({done: false, value}); + } + return Promise.resolve({done: true}); + } +} + +const iter = new Proxy(new Counter(), handlerProxy); +iter.find(x => x % 2 == 1).then(value => { + assert.sameValue(value, 1); + + assert.sameValue( + log.join('\n'), + `get: find +get: next +get: value +set: value +getOwnPropertyDescriptor: value +defineProperty: value +get: value +set: value +getOwnPropertyDescriptor: value +defineProperty: value +get: return` + ); +}); + diff --git a/test/staging/sm/AsyncIterator/prototype/find/return-undefined-if-none-match.js b/test/staging/sm/AsyncIterator/prototype/find/return-undefined-if-none-match.js new file mode 100644 index 0000000000..b8261c6cf9 --- /dev/null +++ b/test/staging/sm/AsyncIterator/prototype/find/return-undefined-if-none-match.js @@ -0,0 +1,26 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +features: +- async-iteration +description: | + pending +esid: pending +---*/ + +async function* gen() { + yield 1; + yield 3; + yield 5; +} +const fn = x => x % 2 == 0; + +gen().find(fn).then(result => assert.sameValue(result, undefined)); + +async function* empty() {} +empty().find(x => x).then(result => assert.sameValue(result, undefined)); + diff --git a/test/staging/sm/AsyncIterator/prototype/find/short-circuit-on-match.js b/test/staging/sm/AsyncIterator/prototype/find/short-circuit-on-match.js new file mode 100644 index 0000000000..ca0930f996 --- /dev/null +++ b/test/staging/sm/AsyncIterator/prototype/find/short-circuit-on-match.js @@ -0,0 +1,31 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +features: +- async-iteration +description: | + pending +esid: pending +---*/ + +async function* gen() { + yield 1; + yield 2; + yield 3; +} + +const log = []; +const fn = (value) => { + log.push(value.toString()); + return value % 2 == 0; +}; + +gen().find(fn).then(result => { + assert.sameValue(result, 2); + assert.sameValue(log.join(','), '1,2'); +}); + diff --git a/test/staging/sm/AsyncIterator/prototype/find/this-not-iterator-throws.js b/test/staging/sm/AsyncIterator/prototype/find/this-not-iterator-throws.js new file mode 100644 index 0000000000..d5c121c121 --- /dev/null +++ b/test/staging/sm/AsyncIterator/prototype/find/this-not-iterator-throws.js @@ -0,0 +1,30 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +features: +- async-iteration +description: | + pending +esid: pending +---*/ + +const fn = x => x; + +function check(x) { + AsyncIterator.prototype.find.call(x, fn).then( + () => assert.sameValue(true, false, 'expected error'), + err => { + assert.sameValue(err instanceof TypeError, true); + } + ); +} + +check(); +check(undefined); +check({}); +check({next: 0}); + diff --git a/test/staging/sm/AsyncIterator/prototype/find/value-throws-iterator-not-closed.js b/test/staging/sm/AsyncIterator/prototype/find/value-throws-iterator-not-closed.js new file mode 100644 index 0000000000..22192e1350 --- /dev/null +++ b/test/staging/sm/AsyncIterator/prototype/find/value-throws-iterator-not-closed.js @@ -0,0 +1,38 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +features: +- async-iteration +description: | + pending +esid: pending +---*/ + +class TestError extends Error {} +class TestIterator extends AsyncIterator { + next() { + return Promise.resolve({ + done: false, + get value() { + throw new TestError(); + } + }); + } + + closed = false; + return() { + closed = true; + } +} + +const iterator = new TestIterator(); +assert.sameValue(iterator.closed, false, 'iterator starts unclosed'); +iterator.find(x => x).then(() => assert.sameValue(true, false, 'expected error'), err => { + assert.sameValue(err instanceof TestError, true); + assert.sameValue(iterator.closed, false, 'iterator remains unclosed'); +}); + diff --git a/test/staging/sm/AsyncIterator/prototype/flatMap/close-iterator-when-inner-complete-throws.js b/test/staging/sm/AsyncIterator/prototype/flatMap/close-iterator-when-inner-complete-throws.js new file mode 100644 index 0000000000..c1b35e29d5 --- /dev/null +++ b/test/staging/sm/AsyncIterator/prototype/flatMap/close-iterator-when-inner-complete-throws.js @@ -0,0 +1,59 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +esid: pending +description: | + %AsyncIterator.prototype%.flatMap closes the iterator when innerComplete throws. +info: | + Iterator Helpers proposal 2.1.6.7 1. Repeat, + ... + k. Repeat, while innerAlive is true, + ... + v. Let innerComplete be IteratorComplete(innerNext). + vi. IfAbruptCloseAsyncIterator(innerComplete, iterated). +features: +- async-iteration +- iterator-helpers +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +---*/ + +// +// +class TestIterator extends AsyncIterator { + async next() { + return {done: false, value: 0}; + } + + closed = false; + async return() { + this.closed = true; + return {done: true}; + } +} + +class TestError extends Error {} +class InnerIterator extends AsyncIterator { + async next() { + return { + get done() { + throw new TestError(); + } + }; + } +} + +const iter = new TestIterator(); +const mapped = iter.flatMap(x => new InnerIterator()); + +assert.sameValue(iter.closed, false); +mapped.next().then( + _ => assert.sameValue(true, false, 'Expected reject.'), + err => { + assert.sameValue(err instanceof TestError, true); + assert.sameValue(iter.closed, true); + } +); + diff --git a/test/staging/sm/AsyncIterator/prototype/flatMap/close-iterator-when-inner-next-throws.js b/test/staging/sm/AsyncIterator/prototype/flatMap/close-iterator-when-inner-next-throws.js new file mode 100644 index 0000000000..17715ad7ec --- /dev/null +++ b/test/staging/sm/AsyncIterator/prototype/flatMap/close-iterator-when-inner-next-throws.js @@ -0,0 +1,54 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +esid: pending +description: | + %AsyncIterator.prototype%.flatMap closes the iterator when IteratorNext throws. +info: | + Iterator Helpers proposal 2.1.6.7 1. Repeat, + ... + k. Repeat, while innerAlive is true, + i. Let innerNextPromise be IteratorNext(innerIterator). + ii. IfAbruptCloseAsyncIterator(innerNextPromise, iterated). +features: +- async-iteration +- iterator-helpers +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +---*/ + +// +// +class TestIterator extends AsyncIterator { + async next() { + return {done: false, value: 0}; + } + + closed = false; + async return(value) { + this.closed = true; + return {done: true, value}; + } +} + +class TestError extends Error {} +class InnerIterator extends AsyncIterator { + async next() { + throw new TestError(); + } +} + +const iter = new TestIterator(); +const mapped = iter.flatMap(x => new InnerIterator()); + +assert.sameValue(iter.closed, false); +mapped.next().then( + _ => assert.sameValue(true, false, 'Expected reject.'), + err => { + assert.sameValue(err instanceof TestError, true); + assert.sameValue(iter.closed, true); + } +); + diff --git a/test/staging/sm/AsyncIterator/prototype/flatMap/close-iterator-when-inner-value-throws.js b/test/staging/sm/AsyncIterator/prototype/flatMap/close-iterator-when-inner-value-throws.js new file mode 100644 index 0000000000..23350f02b6 --- /dev/null +++ b/test/staging/sm/AsyncIterator/prototype/flatMap/close-iterator-when-inner-value-throws.js @@ -0,0 +1,61 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +esid: pending +description: | + %AsyncIterator.prototype%.flatMap closes the iterator when innerValue throws. +info: | + Iterator Helpers proposal 2.1.6.7 1. Repeat, + ... + k. Repeat, while innerAlive is true, + ... + viii. Else, + 1. Let innerValue be IteratorValue(innerNext). + 2. IfAbruptCloseAsyncIterator(innerValue, iterated). +features: +- async-iteration +- iterator-helpers +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +---*/ + +// +// +class TestIterator extends AsyncIterator { + async next() { + return {done: false, value: 0}; + } + + closed = false; + async return() { + this.closed = true; + return {done: true}; + } +} + +class TestError extends Error {} +class InnerIterator extends AsyncIterator { + async next() { + return { + done: false, + get value() { + throw new TestError(); + }, + }; + } +} + +const iter = new TestIterator(); +const mapped = iter.flatMap(x => new InnerIterator()); + +assert.sameValue(iter.closed, false); +mapped.next().then( + _ => assert.sameValue(true, false, 'Expected reject.'), + err => { + assert.sameValue(err instanceof TestError, true); + assert.sameValue(iter.closed, true); + } +); + diff --git a/test/staging/sm/AsyncIterator/prototype/flatMap/flatMap.js b/test/staging/sm/AsyncIterator/prototype/flatMap/flatMap.js new file mode 100644 index 0000000000..eb49761d20 --- /dev/null +++ b/test/staging/sm/AsyncIterator/prototype/flatMap/flatMap.js @@ -0,0 +1,38 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +features: +- async-iteration +description: | + pending +esid: pending +---*/ + +async function* gen() { + yield 1; + yield 2; + yield 3; +} + +async function* inner(x) { + yield x; + yield x + 1; +} + +let iter = gen().flatMap(x => inner(x)); + +for (const v of [1, 2, 2, 3, 3, 4]) { + iter.next().then( + ({done, value}) => { + assert.sameValue(done, false); + assert.sameValue(value, v); + } + ); +} + +iter.next().then(({done}) => assert.sameValue(done, true)); + diff --git a/test/staging/sm/AsyncIterator/prototype/flatMap/inner-empty-iterable.js b/test/staging/sm/AsyncIterator/prototype/flatMap/inner-empty-iterable.js new file mode 100644 index 0000000000..996abcf340 --- /dev/null +++ b/test/staging/sm/AsyncIterator/prototype/flatMap/inner-empty-iterable.js @@ -0,0 +1,48 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +esid: pending +description: | + %AsyncIterator.prototype%.flatMap skips empty inner iterables. +info: | + Iterator Helpers proposal 2.1.6.7 1. Repeat, + ... + k. Repeat, while innerAlive is true, + ... + v. Let innerComplete be IteratorComplete(innerNext). + ... + vii. If innerComplete is true, set innerAlive to false. +features: +- async-iteration +- iterator-helpers +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +---*/ + +// +// +async function* gen(values) { + yield* values; +} + +(async () => { + let iter = gen([0, 1, 2, 3]).flatMap(x => x % 2 ? gen([]) : gen([x])); + + for (const expected of [0, 2]) { + const result = await iter.next(); + assert.sameValue(result.value, expected); + assert.sameValue(result.done, false); + } + + let result = await iter.next(); + assert.sameValue(result.value, undefined); + assert.sameValue(result.done, true); + + iter = gen([0, 1, 2, 3]).flatMap(x => gen([])); + result = await iter.next(); + assert.sameValue(result.value, undefined); + assert.sameValue(result.done, true); +})(); + diff --git a/test/staging/sm/AsyncIterator/prototype/flatMap/inner-generator.js b/test/staging/sm/AsyncIterator/prototype/flatMap/inner-generator.js new file mode 100644 index 0000000000..dcf18cffb2 --- /dev/null +++ b/test/staging/sm/AsyncIterator/prototype/flatMap/inner-generator.js @@ -0,0 +1,41 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +esid: pending +description: | + %AsyncIterator.prototype%.flatMap innerIterator can be a generator. +info: | + Iterator Helpers proposal 2.1.6.7 +features: +- async-iteration +- iterator-helpers +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +---*/ + +// +// +async function* gen() { + yield 1; + yield 2; +} + +(async () => { + const iter = gen().flatMap(async function*(x) { + yield x; + yield* [x + 1, x + 2]; + }); + + for (const expected of [1, 2, 3, 2, 3, 4]) { + const result = await iter.next(); + assert.sameValue(result.value, expected); + assert.sameValue(result.done, false); + } + + const result = await iter.next(); + assert.sameValue(result.value, undefined); + assert.sameValue(result.done, true); +})(); + diff --git a/test/staging/sm/AsyncIterator/prototype/flatMap/length.js b/test/staging/sm/AsyncIterator/prototype/flatMap/length.js new file mode 100644 index 0000000000..403d207ddb --- /dev/null +++ b/test/staging/sm/AsyncIterator/prototype/flatMap/length.js @@ -0,0 +1,26 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +esid: pending +description: | + %AsyncIterator.prototype%.flatMap length value and descriptor. +info: | + 17 ECMAScript Standard Built-in Objects +features: +- async-iteration +- iterator-helpers +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +---*/ +// + +assert.sameValue(AsyncIterator.prototype.flatMap.length, 1); + +const propertyDescriptor = Reflect.getOwnPropertyDescriptor(AsyncIterator.prototype.flatMap, 'length'); +assert.sameValue(propertyDescriptor.value, 1); +assert.sameValue(propertyDescriptor.enumerable, false); +assert.sameValue(propertyDescriptor.writable, false); +assert.sameValue(propertyDescriptor.configurable, true); + diff --git a/test/staging/sm/AsyncIterator/prototype/flatMap/name.js b/test/staging/sm/AsyncIterator/prototype/flatMap/name.js new file mode 100644 index 0000000000..f6ede692fb --- /dev/null +++ b/test/staging/sm/AsyncIterator/prototype/flatMap/name.js @@ -0,0 +1,24 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +esid: pending +description: | + %AsyncIterator.prototype%.flatMap.name value and descriptor. +info: | + 17 ECMAScript Standard Built-in Objects +features: +- async-iteration +- iterator-helpers +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +---*/ +assert.sameValue(AsyncIterator.prototype.flatMap.name, 'flatMap'); + +const propertyDescriptor = Reflect.getOwnPropertyDescriptor(AsyncIterator.prototype.flatMap, 'name'); +assert.sameValue(propertyDescriptor.value, 'flatMap'); +assert.sameValue(propertyDescriptor.enumerable, false); +assert.sameValue(propertyDescriptor.writable, false); +assert.sameValue(propertyDescriptor.configurable, true); + diff --git a/test/staging/sm/AsyncIterator/prototype/flatMap/throw-when-inner-not-iterable.js b/test/staging/sm/AsyncIterator/prototype/flatMap/throw-when-inner-not-iterable.js new file mode 100644 index 0000000000..176ef608f0 --- /dev/null +++ b/test/staging/sm/AsyncIterator/prototype/flatMap/throw-when-inner-not-iterable.js @@ -0,0 +1,74 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +esid: pending +description: | + %AsyncIterator.prototype%.flatMap closes the iterator and throws when mapped isn't iterable. +info: | + Iterator Helpers proposal 2.1.6.7 1. Repeat, + ... + h. Let innerIterator be GetIterator(mapped, async). + i. IfAbruptCloseAsyncIterator(innerIterator, iterated). +features: +- async-iteration +- iterator-helpers +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +---*/ + +// +// +class NotIterable { + async next() { + return {done: true}; + } +} + +class InvalidIterable { + [Symbol.asyncIterator]() { + return {}; + } +} + +class TestIterator extends AsyncIterator { + async next() { + return {done: false, value: 0}; + } + + closed = false; + async return(value) { + this.closed = true; + return {done: true, value}; + } +} + +const nonIterables = [ + new NotIterable(), + new InvalidIterable(), + undefined, + null, + 0, + false, + Symbol(''), + 0n, + {}, +]; + +(async () => { + for (const value of nonIterables) { + const iter = new TestIterator(); + const mapped = iter.flatMap(x => value); + + assert.sameValue(iter.closed, false); + try { + await mapped.next(); + assert.sameValue(true, false, 'Expected reject'); + } catch (exc) { + assert.sameValue(exc instanceof TypeError, true); + } + assert.sameValue(iter.closed, true); + } +})(); + diff --git a/test/staging/sm/AsyncIterator/prototype/forEach/async-writes.js b/test/staging/sm/AsyncIterator/prototype/forEach/async-writes.js new file mode 100644 index 0000000000..999e0230ec --- /dev/null +++ b/test/staging/sm/AsyncIterator/prototype/forEach/async-writes.js @@ -0,0 +1,30 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +features: +- async-iteration +description: | + pending +esid: pending +---*/ + +let x = {a: () => true}; + +async function* gen() { + yield x.a(); + yield x.a(); +} + +gen().forEach(() => {}).then( + () => assert.sameValue(true, false, 'expected error'), + err => assert.sameValue(err instanceof Error, true), +); + +x.a = () => { + throw Error(); +}; + diff --git a/test/staging/sm/AsyncIterator/prototype/forEach/check-fn-after-getting-iterator.js b/test/staging/sm/AsyncIterator/prototype/forEach/check-fn-after-getting-iterator.js new file mode 100644 index 0000000000..ec284bd497 --- /dev/null +++ b/test/staging/sm/AsyncIterator/prototype/forEach/check-fn-after-getting-iterator.js @@ -0,0 +1,37 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +features: +- async-iteration +description: | + pending +esid: pending +---*/ +const log = []; +const handlerProxy = new Proxy({}, { + get: (target, key, receiver) => (...args) => { + log.push(`${key}: ${args[1]?.toString()}`); + return Reflect[key](...args); + }, +}); + +class TestIterator extends AsyncIterator { + next() { + return Promise.resolve({done: true}); + } +} + +const iter = new Proxy(new TestIterator(), handlerProxy); +iter.forEach(1).then(() => assert.sameValue(true, false, 'expected error'), err => { + assert.sameValue(err instanceof TypeError, true); + assert.sameValue( + log.join('\n'), + `get: forEach +get: next` + ); +}); + diff --git a/test/staging/sm/AsyncIterator/prototype/forEach/descriptor.js b/test/staging/sm/AsyncIterator/prototype/forEach/descriptor.js new file mode 100644 index 0000000000..3a1f9cd396 --- /dev/null +++ b/test/staging/sm/AsyncIterator/prototype/forEach/descriptor.js @@ -0,0 +1,21 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +info: | + Descriptor property of AsyncIterator.prototype.forEach +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +features: +- async-iteration +description: | + pending +esid: pending +---*/ +const propDesc = Reflect.getOwnPropertyDescriptor(AsyncIterator.prototype, 'forEach'); +assert.sameValue(typeof propDesc.value, 'function'); +assert.sameValue(propDesc.writable, true); +assert.sameValue(propDesc.enumerable, false); +assert.sameValue(propDesc.configurable, true); + diff --git a/test/staging/sm/AsyncIterator/prototype/forEach/error-from-correct-realm.js b/test/staging/sm/AsyncIterator/prototype/forEach/error-from-correct-realm.js new file mode 100644 index 0000000000..1f3d20463a --- /dev/null +++ b/test/staging/sm/AsyncIterator/prototype/forEach/error-from-correct-realm.js @@ -0,0 +1,31 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +features: +- async-iteration +description: | + pending +esid: pending +---*/ + +const otherGlobal = createNewGlobal({newCompartment: true}); +assert.sameValue(TypeError !== otherGlobal.TypeError, true); + +async function *gen() {} + +gen().forEach().then(() => assert.sameValue(true, false, 'expected error'), err => { + assert.sameValue(err instanceof TypeError, true); +}); + +otherGlobal.AsyncIterator.prototype.forEach.call(gen()).then(() => assert.sameValue(true, false, 'expected error'), err => { + assert.sameValue( + err instanceof otherGlobal.TypeError, + true, + 'TypeError comes from the realm of the method.', + ); +}); + diff --git a/test/staging/sm/AsyncIterator/prototype/forEach/fn-not-callable-throws.js b/test/staging/sm/AsyncIterator/prototype/forEach/fn-not-callable-throws.js new file mode 100644 index 0000000000..72ac8dc085 --- /dev/null +++ b/test/staging/sm/AsyncIterator/prototype/forEach/fn-not-callable-throws.js @@ -0,0 +1,34 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +features: +- async-iteration +description: | + pending +esid: pending +---*/ + +async function *gen() {} + +function check(fn) { + gen().forEach(fn).then(() => { + throw new Error('every should have thrown'); + }, + (err) => { + assert.sameValue(err instanceof TypeError, true); + }); +} + +check(); +check(undefined); +check(null); +check(0); +check(false); +check(''); +check(Symbol('')); +check({}); + diff --git a/test/staging/sm/AsyncIterator/prototype/forEach/fn-throws-close-iterator.js b/test/staging/sm/AsyncIterator/prototype/forEach/fn-throws-close-iterator.js new file mode 100644 index 0000000000..6513c5611e --- /dev/null +++ b/test/staging/sm/AsyncIterator/prototype/forEach/fn-throws-close-iterator.js @@ -0,0 +1,34 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +features: +- async-iteration +description: | + pending +esid: pending +---*/ + +class TestIterator extends AsyncIterator { + next() { + return Promise.resolve({ done: this.closed }); + } + + closed = false; + return() { + this.closed = true; + } +} + +const fn = () => { throw new Error(); }; +const iter = new TestIterator(); + +assert.sameValue(iter.closed, false); +iter.forEach(fn).then(() => assert.sameValue(true, false, 'expected error'), err => { + assert.sameValue(err instanceof Error, true); + assert.sameValue(iter.closed, true); +}); + diff --git a/test/staging/sm/AsyncIterator/prototype/forEach/interleaving-calls.js b/test/staging/sm/AsyncIterator/prototype/forEach/interleaving-calls.js new file mode 100644 index 0000000000..dfb7f82f1d --- /dev/null +++ b/test/staging/sm/AsyncIterator/prototype/forEach/interleaving-calls.js @@ -0,0 +1,34 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +features: +- async-iteration +description: | + pending +esid: pending +---*/ + +const log = []; +async function* gen(n) { + log.push(`${n}`); + yield 1; + log.push(`${n}`); + yield 2; +} + +Promise.all([gen(1).forEach(() => {}), gen(2).forEach(() => {})]).then( + () => { + assert.sameValue( + log.join(' '), + '1 2 1 2', + ); + }, + err => { + throw err; + } +); + diff --git a/test/staging/sm/AsyncIterator/prototype/forEach/length.js b/test/staging/sm/AsyncIterator/prototype/forEach/length.js new file mode 100644 index 0000000000..f20087e6e3 --- /dev/null +++ b/test/staging/sm/AsyncIterator/prototype/forEach/length.js @@ -0,0 +1,23 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +description: | + The `length` property of AsyncIterator.prototype.forEach. +info: | + ES7 section 17: Unless otherwise specified, the length property of a built-in + Function object has the attributes { [[Writable]]: false, [[Enumerable]]: + false, [[Configurable]]: true }. +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +features: +- async-iteration +esid: pending +---*/ +const propDesc = Reflect.getOwnPropertyDescriptor(AsyncIterator.prototype.forEach, 'length'); +assert.sameValue(propDesc.value, 1); +assert.sameValue(propDesc.writable, false); +assert.sameValue(propDesc.enumerable, false); +assert.sameValue(propDesc.configurable, true); + diff --git a/test/staging/sm/AsyncIterator/prototype/forEach/name.js b/test/staging/sm/AsyncIterator/prototype/forEach/name.js new file mode 100644 index 0000000000..f385222bfd --- /dev/null +++ b/test/staging/sm/AsyncIterator/prototype/forEach/name.js @@ -0,0 +1,19 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +description: | + `name` property of AsyncIterator.prototype.forEach. +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +features: +- async-iteration +esid: pending +---*/ +const propDesc = Reflect.getOwnPropertyDescriptor(AsyncIterator.prototype.forEach, 'name'); +assert.sameValue(propDesc.value, 'forEach'); +assert.sameValue(propDesc.writable, false); +assert.sameValue(propDesc.enumerable, false); +assert.sameValue(propDesc.configurable, true); + diff --git a/test/staging/sm/AsyncIterator/prototype/forEach/next-throws-iterator-not-closed.js b/test/staging/sm/AsyncIterator/prototype/forEach/next-throws-iterator-not-closed.js new file mode 100644 index 0000000000..eb4a9efed7 --- /dev/null +++ b/test/staging/sm/AsyncIterator/prototype/forEach/next-throws-iterator-not-closed.js @@ -0,0 +1,34 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +features: +- async-iteration +description: | + pending +esid: pending +---*/ + +class TestIterator extends AsyncIterator { + next() { + throw new Error(); + } + + closed = false; + return() { + this.closed = true; + } +} + +const fn = () => {}; +const iter = new TestIterator(); + +assert.sameValue(iter.closed, false); +iter.forEach(fn).then(() => assert.sameValue(true, false, 'expected error'), err => { + assert.sameValue(err instanceof Error, true); + assert.sameValue(iter.closed, false); +}); + diff --git a/test/staging/sm/AsyncIterator/prototype/forEach/proxy.js b/test/staging/sm/AsyncIterator/prototype/forEach/proxy.js new file mode 100644 index 0000000000..cd6d04b7a0 --- /dev/null +++ b/test/staging/sm/AsyncIterator/prototype/forEach/proxy.js @@ -0,0 +1,54 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +features: +- async-iteration +description: | + pending +esid: pending +---*/ +// +// This test checks that %Iterator.prototype%.forEach only gets the `next` method off of the +// iterator once, and never accesses the @@iterator property. +const log = []; +const handlerProxy = new Proxy({}, { + get: (target, key, receiver) => (...args) => { + log.push(`${key}: ${args[1]?.toString()}`); + return Reflect[key](...args); + }, +}); + +class Counter extends AsyncIterator { + value = 0; + next() { + const value = this.value; + if (value < 2) { + this.value = value + 1; + return Promise.resolve({done: false, value}); + } + return Promise.resolve({done: true}); + } +} + +const iter = new Proxy(new Counter(), handlerProxy); +iter.forEach(x => x).then(() => { + assert.sameValue( + log.join('\n'), + `get: forEach +get: next +get: value +set: value +getOwnPropertyDescriptor: value +defineProperty: value +get: value +set: value +getOwnPropertyDescriptor: value +defineProperty: value +get: value` + ); +}); + diff --git a/test/staging/sm/AsyncIterator/prototype/forEach/this-not-iterator-throws.js b/test/staging/sm/AsyncIterator/prototype/forEach/this-not-iterator-throws.js new file mode 100644 index 0000000000..88737dcd31 --- /dev/null +++ b/test/staging/sm/AsyncIterator/prototype/forEach/this-not-iterator-throws.js @@ -0,0 +1,29 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +features: +- async-iteration +description: | + pending +esid: pending +---*/ + +const fn = x => x; +function check(x) { + AsyncIterator.prototype.forEach.call(x, fn).then( + () => assert.sameValue(true, false, 'expected error'), + err => { + assert.sameValue(err instanceof TypeError, true); + } + ); +} + +check(); +check(undefined); +check({}); +check({next: 0}); + diff --git a/test/staging/sm/AsyncIterator/prototype/forEach/value-throws-iterator-not-closed.js b/test/staging/sm/AsyncIterator/prototype/forEach/value-throws-iterator-not-closed.js new file mode 100644 index 0000000000..de1535e38c --- /dev/null +++ b/test/staging/sm/AsyncIterator/prototype/forEach/value-throws-iterator-not-closed.js @@ -0,0 +1,38 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +features: +- async-iteration +description: | + pending +esid: pending +---*/ + +class TestError extends Error {} +class TestIterator extends AsyncIterator { + next() { + return Promise.resolve({ + done: false, + get value() { + throw new TestError(); + } + }); + } + + closed = false; + return() { + closed = true; + } +} + +const iterator = new TestIterator(); +assert.sameValue(iterator.closed, false, 'iterator starts unclosed'); +iterator.forEach(x => x).then(() => assert.sameValue(true, false, 'expected error'), err => { + assert.sameValue(err instanceof TestError, true); + assert.sameValue(iterator.closed, false, 'iterator remains unclosed'); +}); + diff --git a/test/staging/sm/AsyncIterator/prototype/generator-methods-throw-on-iterator-helpers.js b/test/staging/sm/AsyncIterator/prototype/generator-methods-throw-on-iterator-helpers.js new file mode 100644 index 0000000000..ce941e9087 --- /dev/null +++ b/test/staging/sm/AsyncIterator/prototype/generator-methods-throw-on-iterator-helpers.js @@ -0,0 +1,45 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +features: +- async-iteration +description: | + pending +esid: pending +---*/ + +const asyncGeneratorProto = Object.getPrototypeOf( + Object.getPrototypeOf( + (async function *() {})() + ) +); + +const methods = [ + iter => iter.map(x => x), + iter => iter.filter(x => x), + iter => iter.take(1), + iter => iter.drop(0), + iter => iter.asIndexedPairs(), + iter => iter.flatMap(x => (async function*() {})()), +]; + +for (const method of methods) { + const iteratorHelper = method((async function*() {})()); + asyncGeneratorProto.next.call(iteratorHelper).then( + _ => assert.sameValue(true, false, 'Expected reject'), + err => assert.sameValue(err instanceof TypeError, true), + ); + asyncGeneratorProto.return.call(iteratorHelper).then( + _ => assert.sameValue(true, false, 'Expected reject'), + err => assert.sameValue(err instanceof TypeError, true), + ); + asyncGeneratorProto.throw.call(iteratorHelper).then( + _ => assert.sameValue(true, false, 'Expected reject'), + err => assert.sameValue(err instanceof TypeError, true), + ); +} + diff --git a/test/staging/sm/AsyncIterator/prototype/iterator-helper-methods-throw-on-generators.js b/test/staging/sm/AsyncIterator/prototype/iterator-helper-methods-throw-on-generators.js new file mode 100644 index 0000000000..5eb4f3609f --- /dev/null +++ b/test/staging/sm/AsyncIterator/prototype/iterator-helper-methods-throw-on-generators.js @@ -0,0 +1,22 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +features: +- async-iteration +description: | + pending +esid: pending +---*/ + +async function *gen() { yield 'value'; } + +const asyncIteratorHelperProto = Object.getPrototypeOf(gen().map(x => x)); + +assertThrowsInstanceOf(() => asyncIteratorHelperProto.next.call(gen()), TypeError); +assertThrowsInstanceOf(() => asyncIteratorHelperProto.return.call(gen()), TypeError); +assertThrowsInstanceOf(() => asyncIteratorHelperProto.throw.call(gen()), TypeError); + diff --git a/test/staging/sm/AsyncIterator/prototype/lazy-methods-from-other-global.js b/test/staging/sm/AsyncIterator/prototype/lazy-methods-from-other-global.js new file mode 100644 index 0000000000..7ce488d05e --- /dev/null +++ b/test/staging/sm/AsyncIterator/prototype/lazy-methods-from-other-global.js @@ -0,0 +1,46 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +features: +- async-iteration +description: | + pending +esid: pending +---*/ + +async function* gen(values) { + yield* values; +} + +const otherAsyncIteratorProto = createNewGlobal({newCompartment: true}).AsyncIterator.prototype; + +const methods = [ + ["map", x => x], + ["filter", x => true], + ["take", Infinity], + ["drop", 0], + ["asIndexedPairs", undefined], + ["flatMap", x => gen([x])], +]; + +(async () => { + for (const [method, arg] of methods) { + const iterator = gen([1, 2, 3]); + const helper = otherAsyncIteratorProto[method].call(iterator, arg); + + for (const expected of [1, 2, 3]) { + const {done, value} = await helper.next(); + assert.sameValue(done, false); + assert.sameValue(Array.isArray(value) ? value[1] : value, expected); + } + + const {done, value} = await helper.next(); + assert.sameValue(done, true); + assert.sameValue(value, undefined); + } +})(); + diff --git a/test/staging/sm/AsyncIterator/prototype/lazy-methods-handle-empty-iterators.js b/test/staging/sm/AsyncIterator/prototype/lazy-methods-handle-empty-iterators.js new file mode 100644 index 0000000000..c56a705122 --- /dev/null +++ b/test/staging/sm/AsyncIterator/prototype/lazy-methods-handle-empty-iterators.js @@ -0,0 +1,47 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +esid: pending +description: | + Lazy %AsyncIterator.prototype% methods handle empty iterators. +info: | + Iterator Helpers proposal 2.1.6 +features: +- async-iteration +- iterator-helpers +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +---*/ + +// +// +class EmptyIterator extends AsyncIterator { + async next() { + return {done: true}; + } +} + +async function* gen() {} + +const methods = [ + iter => iter.map(x => x), + iter => iter.filter(x => x), + iter => iter.take(1), + iter => iter.drop(0), + iter => iter.asIndexedPairs(), + iter => iter.flatMap(x => gen()), +]; + +for (const method of methods) { + for (const iterator of [new EmptyIterator(), gen()]) { + method(iterator).next().then( + ({done, value}) => { + assert.sameValue(done, true); + assert.sameValue(value, undefined); + } + ); + } +} + diff --git a/test/staging/sm/AsyncIterator/prototype/lazy-methods-interleaved.js b/test/staging/sm/AsyncIterator/prototype/lazy-methods-interleaved.js new file mode 100644 index 0000000000..86bd6de9df --- /dev/null +++ b/test/staging/sm/AsyncIterator/prototype/lazy-methods-interleaved.js @@ -0,0 +1,64 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +esid: pending +description: | + Lazy %AsyncIterator.prototype% method calls can be interleaved. +info: | + Iterator Helpers proposal 2.1.6 +features: +- async-iteration +- iterator-helpers +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +---*/ + +// +// +class TestIterator extends AsyncIterator { + value = 0; + async next() { + return {done: false, value: this.value++}; + } +} + +function unwrapResult(value) { + // Unwrap the asIndexedPair return values. + while (Array.isArray(value)) { + value = value[1]; + } + return value; +} + +function check({done, value}, expectedDone, expectedValue) { + assert.sameValue(done, expectedDone); + assert.sameValue(unwrapResult(value), expectedValue); +} + +const methods = [ + ['map', x => x], + ['filter', x => true], + ['take', Infinity], + ['drop', 0], + ['asIndexedPairs', undefined], + ['flatMap', async function*(x) { yield x; }], +]; + +(async () => { + for (const [firstMethod, firstArg] of methods) { + for (const [secondMethod, secondArg] of methods) { + const iterator = new TestIterator(); + + const firstHelper = iterator[firstMethod](firstArg); + const secondHelper = iterator[secondMethod](secondArg); + + check(await firstHelper.next(), false, 0); + check(await secondHelper.next(), false, 1); + check(await firstHelper.next(), false, 2); + check(await secondHelper.next(), false, 3); + } + } +})(); + diff --git a/test/staging/sm/AsyncIterator/prototype/lazy-methods-iterator-closed-on-call-throws.js b/test/staging/sm/AsyncIterator/prototype/lazy-methods-iterator-closed-on-call-throws.js new file mode 100644 index 0000000000..8a2191ce28 --- /dev/null +++ b/test/staging/sm/AsyncIterator/prototype/lazy-methods-iterator-closed-on-call-throws.js @@ -0,0 +1,53 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +esid: pending +description: | + Lazy %AsyncIterator.prototype% methods close the iterator if callback throws. +info: | + AsyncIterator Helpers proposal 2.1.6 +features: +- async-iteration +- iterator-helpers +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +---*/ + +// +// +class TestError extends Error {} +class TestAsyncIterator extends AsyncIterator { + async next() { + return {done: false, value: 1}; + } + + closed = false; + async return() { + this.closed = true; + return {done: true}; + } +} + +function fn() { + throw new TestError(); +} +const methods = [ + iter => iter.map(fn), + iter => iter.filter(fn), + iter => iter.flatMap(fn), +]; + +for (const method of methods) { + const iter = new TestAsyncIterator(); + assert.sameValue(iter.closed, false); + method(iter).next().then( + _ => assert.sameValue(true, false, 'Expected reject'), + err => { + assert.sameValue(err instanceof TestError, true); + assert.sameValue(iter.closed, true); + }, + ); +} + diff --git a/test/staging/sm/AsyncIterator/prototype/lazy-methods-iterator-closed-on-yield-throws.js b/test/staging/sm/AsyncIterator/prototype/lazy-methods-iterator-closed-on-yield-throws.js new file mode 100644 index 0000000000..dee1898a3a --- /dev/null +++ b/test/staging/sm/AsyncIterator/prototype/lazy-methods-iterator-closed-on-yield-throws.js @@ -0,0 +1,58 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +esid: pending +description: | + Lazy %AsyncIterator.prototype% methods close the iterator if `yield` throws. +info: | + AsyncIterator Helpers proposal 2.1.6 +features: +- async-iteration +- iterator-helpers +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +---*/ + +// +// +class TestError extends Error {} +class TestAsyncIterator extends AsyncIterator { + async next() { + return {done: false, value: 1}; + } + + closed = false; + async return(value) { + this.closed = true; + return {done: true, value}; + } +} + +async function* gen(x) { yield x; } +const methods = [ + iter => iter.map(x => x), + iter => iter.filter(x => true), + iter => iter.take(1), + iter => iter.drop(0), + iter => iter.asIndexedPairs(), + iter => iter.flatMap(gen), +]; + +for (const method of methods) { + const iterator = new TestAsyncIterator(); + const iteratorHelper = method(iterator); + + assert.sameValue(iterator.closed, false); + iteratorHelper.next().then( + _ => iteratorHelper.throw(new TestError()).then( + _ => assert.sameValue(true, false, 'Expected reject'), + err => { + assert.sameValue(err instanceof TestError, true); + assert.sameValue(iterator.closed, true); + }, + ), + ); +} + diff --git a/test/staging/sm/AsyncIterator/prototype/lazy-methods-iterator-not-closed-on-next-get-then-throws.js b/test/staging/sm/AsyncIterator/prototype/lazy-methods-iterator-not-closed-on-next-get-then-throws.js new file mode 100644 index 0000000000..ca74aa42c8 --- /dev/null +++ b/test/staging/sm/AsyncIterator/prototype/lazy-methods-iterator-not-closed-on-next-get-then-throws.js @@ -0,0 +1,61 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +esid: pending +description: | + Lazy %AsyncIterator.prototype% methods don't close the iterator if getting `then` throws. +info: | + AsyncIterator Helpers proposal 2.1.6 +features: +- async-iteration +- iterator-helpers +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +---*/ + +// +// +class TestError extends Error {} + +class TestIterator extends AsyncIterator { + next() { + return { + get then() { + throw new TestError(); + } + }; + } + + closed = false; + async return(value) { + this.closed = true; + return {done: true, value}; + } +} + +const methods = [ + ["map", x => x], + ["filter", x => true], + ["take", Infinity], + ["drop", 0], + ["asIndexedPairs", undefined], + ["flatMap", async function*(x) { yield x; }], +]; + +(async () => { + for (const [method, arg] of methods) { + const iterator = new TestIterator(); + assert.sameValue(iterator.closed, false); + + try { + await iterator[method](arg).next(); + assert.sameValue(true, false, 'Expected exception'); + } catch(err) { + assert.sameValue(err instanceof TestError, true); + } + assert.sameValue(iterator.closed, false); + } +})(); + diff --git a/test/staging/sm/AsyncIterator/prototype/lazy-methods-iterator-not-closed-on-next-promise-executor-throws.js b/test/staging/sm/AsyncIterator/prototype/lazy-methods-iterator-not-closed-on-next-promise-executor-throws.js new file mode 100644 index 0000000000..96202825a0 --- /dev/null +++ b/test/staging/sm/AsyncIterator/prototype/lazy-methods-iterator-not-closed-on-next-promise-executor-throws.js @@ -0,0 +1,58 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +esid: pending +description: | + Lazy %AsyncIterator.prototype% methods don't close the iterator if executor of Promise returned by `.next` throws. +info: | + AsyncIterator Helpers proposal 2.1.6 +features: +- async-iteration +- iterator-helpers +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +---*/ + +// +// +class TestError extends Error {} +class TestIterator extends AsyncIterator { + next() { + return new Promise((resolve, reject) => { + throw new TestError(); + }); + } + + closed = false; + async return(value) { + this.closed = true; + return {done: true, value}; + } +} + +const methods = [ + ["map", x => x], + ["filter", x => true], + ["take", Infinity], + ["drop", 0], + ["asIndexedPairs", undefined], + ["flatMap", async function*(x) { yield x; }], +]; + +(async () => { + for (const [method, arg] of methods) { + const iterator = new TestIterator(); + assert.sameValue(iterator.closed, false); + + try { + await iterator[method](arg).next(); + assert.sameValue(true, false, 'Expected exception'); + } catch(err) { + assert.sameValue(err instanceof TestError, true); + } + assert.sameValue(iterator.closed, false); + } +})(); + diff --git a/test/staging/sm/AsyncIterator/prototype/lazy-methods-iterator-not-closed-on-next-returns-reject.js b/test/staging/sm/AsyncIterator/prototype/lazy-methods-iterator-not-closed-on-next-returns-reject.js new file mode 100644 index 0000000000..dd049890d0 --- /dev/null +++ b/test/staging/sm/AsyncIterator/prototype/lazy-methods-iterator-not-closed-on-next-returns-reject.js @@ -0,0 +1,56 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +esid: pending +description: | + Lazy %AsyncIterator.prototype% methods don't close the iterator if `.next` returns a rejected Promise. +info: | + AsyncIterator Helpers proposal 2.1.6 +features: +- async-iteration +- iterator-helpers +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +---*/ + +// +// +class TestError extends Error {} +class TestIterator extends AsyncIterator { + next() { + return Promise.reject(new TestError()); + } + + closed = false; + async return(value) { + this.closed = true; + return {done: true, value}; + } +} + +const methods = [ + ["map", x => x], + ["filter", x => true], + ["take", Infinity], + ["drop", 0], + ["asIndexedPairs", undefined], + ["flatMap", async function*(x) { yield x; }], +]; + +(async () => { + for (const [method, arg] of methods) { + const iterator = new TestIterator(); + assert.sameValue(iterator.closed, false); + + try { + await iterator[method](arg).next(); + assert.sameValue(true, false, 'Expected exception'); + } catch(err) { + assert.sameValue(err instanceof TestError, true); + } + assert.sameValue(iterator.closed, false); + } +})(); + diff --git a/test/staging/sm/AsyncIterator/prototype/lazy-methods-iterator-not-closed-on-next-then-throws.js b/test/staging/sm/AsyncIterator/prototype/lazy-methods-iterator-not-closed-on-next-then-throws.js new file mode 100644 index 0000000000..1e76f2e9fa --- /dev/null +++ b/test/staging/sm/AsyncIterator/prototype/lazy-methods-iterator-not-closed-on-next-then-throws.js @@ -0,0 +1,61 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +esid: pending +description: | + Lazy %AsyncIterator.prototype% methods don't close the iterator if `then` returned by `next` throws. +info: | + AsyncIterator Helpers proposal 2.1.6 +features: +- async-iteration +- iterator-helpers +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +---*/ + +// +// +class TestError extends Error {} + +class TestIterator extends AsyncIterator { + next() { + return { + then() { + throw new TestError(); + } + }; + } + + closed = false; + async return(value) { + this.closed = true; + return {done: true, value}; + } +} + +const methods = [ + ["map", x => x], + ["filter", x => true], + ["take", Infinity], + ["drop", 0], + ["asIndexedPairs", undefined], + ["flatMap", async function*(x) { yield x; }], +]; + +(async () => { + for (const [method, arg] of methods) { + const iterator = new TestIterator(); + assert.sameValue(iterator.closed, false); + + try { + await iterator[method](arg).next(); + assert.sameValue(true, false, 'Expected exception'); + } catch(err) { + assert.sameValue(err instanceof TestError, true); + } + assert.sameValue(iterator.closed, false); + } +})(); + diff --git a/test/staging/sm/AsyncIterator/prototype/lazy-methods-iterator-not-closed-on-next-throws.js b/test/staging/sm/AsyncIterator/prototype/lazy-methods-iterator-not-closed-on-next-throws.js new file mode 100644 index 0000000000..80ba2ec3b2 --- /dev/null +++ b/test/staging/sm/AsyncIterator/prototype/lazy-methods-iterator-not-closed-on-next-throws.js @@ -0,0 +1,54 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +esid: pending +description: | + Lazy %AsyncIterator.prototype% methods don't close the iterator if `.next` call throws. +info: | + AsyncIterator Helpers proposal 2.1.6 +features: +- async-iteration +- iterator-helpers +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +---*/ + +// +// +class TestError extends Error {} +class TestAsyncIterator extends AsyncIterator { + next() { + throw new TestError(); + } + + closed = false; + async return(value) { + this.closed = true; + return {done: true, value}; + } +} + +async function* gen(x) { yield x; } +const methods = [ + iter => iter.map(x => x), + iter => iter.filter(x => x), + iter => iter.take(1), + iter => iter.drop(0), + iter => iter.asIndexedPairs(), + iter => iter.flatMap(gen), +]; + +for (const method of methods) { + const iterator = new TestAsyncIterator(); + assert.sameValue(iterator.closed, false); + method(iterator).next().then( + _ => assert.sameValue(true, false, 'Expected reject'), + err => { + assert.sameValue(err instanceof TestError, true); + assert.sameValue(iterator.closed, false); + }, + ); +} + diff --git a/test/staging/sm/AsyncIterator/prototype/lazy-methods-iterator-not-closed-on-value-throws.js b/test/staging/sm/AsyncIterator/prototype/lazy-methods-iterator-not-closed-on-value-throws.js new file mode 100644 index 0000000000..dda8ce2462 --- /dev/null +++ b/test/staging/sm/AsyncIterator/prototype/lazy-methods-iterator-not-closed-on-value-throws.js @@ -0,0 +1,59 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +esid: pending +description: | + Lazy %AsyncIterator.prototype% methods don't close the iterator if `value` throws. +info: | + AsyncIterator Helpers proposal 2.1.6 +features: +- async-iteration +- iterator-helpers +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +---*/ + +// +// +class TestError extends Error {} +class TestAsyncIterator extends AsyncIterator { + async next() { + return { + get value() { + throw new TestError(); + } + }; + } + + closed = false; + async return(value) { + this.closed = true; + return {done: true, value}; + } +} + +const iterator = new TestAsyncIterator(); + +async function* gen(x) { yield x; } +const methods = [ + iter => iter.map(x => x), + iter => iter.filter(x => x), + iter => iter.take(1), + iter => iter.drop(0), + iter => iter.asIndexedPairs(), + iter => iter.flatMap(gen), +]; + +for (const method of methods) { + assert.sameValue(iterator.closed, false); + method(iterator).next().then( + _ => assert.sameValue(true, false, 'Expected reject'), + err => { + assert.sameValue(err instanceof TestError, true); + assert.sameValue(iterator.closed, false); + }, + ); +} + diff --git a/test/staging/sm/AsyncIterator/prototype/lazy-methods-iterator-returns-done-generator-finishes.js b/test/staging/sm/AsyncIterator/prototype/lazy-methods-iterator-returns-done-generator-finishes.js new file mode 100644 index 0000000000..4c8dd94344 --- /dev/null +++ b/test/staging/sm/AsyncIterator/prototype/lazy-methods-iterator-returns-done-generator-finishes.js @@ -0,0 +1,40 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +features: +- async-iteration +description: | + pending +esid: pending +---*/ + +class TestIterator extends AsyncIterator { + async next() { + return {done: true, value: 'value'}; + } +} + +async function* gen(x) { yield x; } + +const methods = [ + iter => iter.map(x => x), + iter => iter.filter(x => true), + iter => iter.take(1), + iter => iter.drop(0), + iter => iter.asIndexedPairs(), + iter => iter.flatMap(gen), +]; + +(async () => { + for (const method of methods) { + const iterator = method(new TestIterator()); + const {done, value} = await iterator.next(); + assert.sameValue(done, true); + assert.sameValue(value, undefined); + } +})(); + diff --git a/test/staging/sm/AsyncIterator/prototype/lazy-methods-multiple-return-close-iterator-once.js b/test/staging/sm/AsyncIterator/prototype/lazy-methods-multiple-return-close-iterator-once.js new file mode 100644 index 0000000000..00e9cc90e8 --- /dev/null +++ b/test/staging/sm/AsyncIterator/prototype/lazy-methods-multiple-return-close-iterator-once.js @@ -0,0 +1,69 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +esid: pending +description: | + Calling `.return()` on a lazy %AsyncIterator.prototype% method multiple times closes the source iterator once. +info: | + Iterator Helpers proposal 2.1.6 +features: +- async-iteration +- iterator-helpers +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +---*/ + +// +// +class TestIterator extends AsyncIterator { + async next() { + return {done: false, value: 1}; + } + + closeCount = 0; + async return(value) { + this.closeCount++; + return {done: true, value}; + } +} + +async function* gen(x) { yield x; } + +const methods = [ + iter => iter.map(x => x), + iter => iter.filter(x => x), + iter => iter.take(1), + iter => iter.drop(0), + iter => iter.asIndexedPairs(), + iter => iter.flatMap(gen), +]; + +(async () => { + // Call `return` after stepping the iterator once: + for (const method of methods) { + const iter = new TestIterator(); + const iterHelper = method(iter); + + await iterHelper.next(); + assert.sameValue(iter.closeCount, 0); + await iterHelper.return(); + assert.sameValue(iter.closeCount, 1); + await iterHelper.return(); + assert.sameValue(iter.closeCount, 1); + } + + // Call `return` before stepping the iterator: + for (const method of methods) { + const iter = new TestIterator(); + const iterHelper = method(iter); + + assert.sameValue(iter.closeCount, 0); + await iterHelper.return(); + assert.sameValue(iter.closeCount, 1); + await iterHelper.return(); + assert.sameValue(iter.closeCount, 1); + } +})(); + diff --git a/test/staging/sm/AsyncIterator/prototype/lazy-methods-multiple-throw-close-iterator-once.js b/test/staging/sm/AsyncIterator/prototype/lazy-methods-multiple-throw-close-iterator-once.js new file mode 100644 index 0000000000..9ef7044291 --- /dev/null +++ b/test/staging/sm/AsyncIterator/prototype/lazy-methods-multiple-throw-close-iterator-once.js @@ -0,0 +1,95 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +esid: pending +description: | + Calling `throw` on a lazy %AsyncIterator.prototype% method multiple times closes the source iterator once. +info: | + Iterator Helpers proposal 2.1.6 +features: +- async-iteration +- iterator-helpers +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +---*/ + +// +// +class TestError extends Error {} + +class TestIterator extends AsyncIterator { + async next() { + return {done: false, value: 1}; + } + + closeCount = 0; + async return(value) { + this.closeCount++; + return {done: true, value}; + } +} + +async function* gen(x) { yield x; } + +const methods = [ + iter => iter.map(x => x), + iter => iter.filter(x => true), + iter => iter.take(Infinity), + iter => iter.drop(0), + iter => iter.asIndexedPairs(), + iter => iter.flatMap(gen), +]; + +(async () => { + // Call `throw` after stepping the iterator once: + for (const method of methods) { + const iter = new TestIterator(); + const iterHelper = method(iter); + + await iterHelper.next() + assert.sameValue(iter.closeCount, 0); + + try { + await iterHelper.throw(new TestError()); + assert.sameValue(true, false, 'Expected reject'); + } catch (exc) { + assert.sameValue(exc instanceof TestError, true); + } + assert.sameValue(iter.closeCount, 1); + + try { + await iterHelper.throw(new TestError()); + assert.sameValue(true, false, 'Expected reject'); + } catch (exc) { + assert.sameValue(exc instanceof TestError, true); + } + assert.sameValue(iter.closeCount, 1); + } + + // Call `throw` before stepping the iterator: + for (const method of methods) { + const iter = new TestIterator(); + const iterHelper = method(iter); + + assert.sameValue(iter.closeCount, 0); + + try { + await iterHelper.throw(new TestError()); + assert.sameValue(true, false, 'Expected reject'); + } catch (exc) { + assert.sameValue(exc instanceof TestError, true); + } + assert.sameValue(iter.closeCount, 1); + + try { + await iterHelper.throw(new TestError()); + assert.sameValue(true, false, 'Expected reject'); + } catch (exc) { + assert.sameValue(exc instanceof TestError, true); + } + assert.sameValue(iter.closeCount, 1); + } +})(); + diff --git a/test/staging/sm/AsyncIterator/prototype/lazy-methods-mutate-iterator-after-done.js b/test/staging/sm/AsyncIterator/prototype/lazy-methods-mutate-iterator-after-done.js new file mode 100644 index 0000000000..17dde50fc8 --- /dev/null +++ b/test/staging/sm/AsyncIterator/prototype/lazy-methods-mutate-iterator-after-done.js @@ -0,0 +1,54 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +esid: pending +description: | + %AsyncIterator.prototype% methods ignore iterator mutation if already done. +info: | + Iterator Helpers proposal 2.1.6 +features: +- async-iteration +- iterator-helpers +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +---*/ +// +// + +class TestIterator extends AsyncIterator { + values = [1, 2]; + async next() { + if (this.values.length == 0) + return {done: true}; + return {done: false, value: this.values.shift()}; + } +} + +function check({done, value}, expectedDone, expectedValue) { + assert.sameValue(done, expectedDone); + assert.sameValue(Array.isArray(value) ? value[1] : value, expectedValue); +} + +const methods = [ + ['map', x => x], + ['filter', x => true], + ['take', Infinity], + ['drop', 0], + ['asIndexedPairs', undefined], + ['flatMap', async function*(x) { yield x; }], +]; + +for (const [method, arg] of methods) { + (async () => { + const iter = new TestIterator(); + const iterHelper = iter[method](arg); + check(await iterHelper.next(), false, 1); + check(await iterHelper.next(), false, 2); + check(await iterHelper.next(), true, undefined); + iter.values.push(3); + check(await iterHelper.next(), true, undefined); + })(); +} + diff --git a/test/staging/sm/AsyncIterator/prototype/lazy-methods-mutate-iterator.js b/test/staging/sm/AsyncIterator/prototype/lazy-methods-mutate-iterator.js new file mode 100644 index 0000000000..1799f31abf --- /dev/null +++ b/test/staging/sm/AsyncIterator/prototype/lazy-methods-mutate-iterator.js @@ -0,0 +1,54 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +esid: pending +description: | + %AsyncIterator.prototype% methods work properly if the iterator has been mutated. +info: | + Iterator Helpers proposal 2.1.6 +features: +- async-iteration +- iterator-helpers +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +---*/ +// +// + +class TestIterator extends AsyncIterator { + values = [1, 2]; + async next() { + if (this.values.length == 0) + return {done: true}; + return {done: false, value: this.values.shift()}; + } +} + +function check({done, value}, expectedDone, expectedValue) { + assert.sameValue(done, expectedDone); + assert.sameValue(Array.isArray(value) ? value[1] : value, expectedValue); +} + +const methods = [ + ['map', x => x], + ['filter', x => true], + ['take', Infinity], + ['drop', 0], + ['asIndexedPairs', undefined], + ['flatMap', async function*(x) { yield x; }], +]; + +for (const [method, arg] of methods) { + (async () => { + const iter = new TestIterator(); + const iterHelper = iter[method](arg); + check(await iterHelper.next(), false, 1); + check(await iterHelper.next(), false, 2); + iter.values.push(3); + check(await iterHelper.next(), false, 3); + check(await iterHelper.next(), true, undefined); + })(); +} + diff --git a/test/staging/sm/AsyncIterator/prototype/lazy-methods-not-close-iterator-next-reject.js b/test/staging/sm/AsyncIterator/prototype/lazy-methods-not-close-iterator-next-reject.js new file mode 100644 index 0000000000..35bf90f57a --- /dev/null +++ b/test/staging/sm/AsyncIterator/prototype/lazy-methods-not-close-iterator-next-reject.js @@ -0,0 +1,53 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +esid: pending +description: | + Lazy %AsyncIterator.prototype% methods don't close the iterator if `next` returns rejected promise. +info: | + AsyncIterator Helpers proposal 2.1.6 +features: +- async-iteration +- iterator-helpers +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +---*/ + +// +// +class TestIterator extends AsyncIterator { + next() { + return Promise.reject('rejection'); + } + + closed = false; + async return(value) { + this.closed = true; + return {done: true, value}; + } +} + +async function* gen(x) { yield x; } +const methods = [ + iter => iter.map(x => x), + iter => iter.filter(x => x), + iter => iter.take(1), + iter => iter.drop(0), + iter => iter.asIndexedPairs(), + iter => iter.flatMap(gen), +]; + +for (const method of methods) { + const iterator = new TestIterator(); + assert.sameValue(iterator.closed, false); + method(iterator).next().then( + _ => assert.sameValue(true, false, 'Expected reject'), + err => { + assert.sameValue(err, 'rejection'); + assert.sameValue(iterator.closed, false); + }, + ); +} + diff --git a/test/staging/sm/AsyncIterator/prototype/lazy-methods-pass-through-lastValue.js b/test/staging/sm/AsyncIterator/prototype/lazy-methods-pass-through-lastValue.js new file mode 100644 index 0000000000..e43b025633 --- /dev/null +++ b/test/staging/sm/AsyncIterator/prototype/lazy-methods-pass-through-lastValue.js @@ -0,0 +1,42 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +features: +- async-iteration +description: | + pending +esid: pending +---*/ + +class TestAsyncIterator extends AsyncIterator { + async next(value) { + return {done: false, value}; + } +} + +const methods = [ + iter => iter.map(x => x), + iter => iter.filter(x => true), + iter => iter.take(2), + iter => iter.drop(0), + iter => iter.asIndexedPairs(), +]; + +for (const method of methods) { + const iterator = new TestAsyncIterator(); + const iteratorHelper = method(iterator); + iteratorHelper.next().then( + _ => iteratorHelper.next('last value').then( + ({done, value}) => { + assert.sameValue(done, false); + // Unwrap the return value from asIndexedPairs. + assert.sameValue(Array.isArray(value) ? value[1] : value, 'last value'); + } + ), + ); +} + diff --git a/test/staging/sm/AsyncIterator/prototype/lazy-methods-pass-value-through-chain.js b/test/staging/sm/AsyncIterator/prototype/lazy-methods-pass-value-through-chain.js new file mode 100644 index 0000000000..834e0554f1 --- /dev/null +++ b/test/staging/sm/AsyncIterator/prototype/lazy-methods-pass-value-through-chain.js @@ -0,0 +1,47 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +features: +- async-iteration +description: | + pending +esid: pending +---*/ + +class TestAsyncIterator extends AsyncIterator { + async next(value) { + return {done: false, value}; + } +} + +const methods = [ + iter => iter.map(x => x), + iter => iter.filter(x => true), + iter => iter.take(2), + iter => iter.drop(0), + iter => iter.asIndexedPairs(), +]; + +for (const outerMethod of methods) { + for (const innerMethod of methods) { + const iterator = new TestAsyncIterator(); + const iteratorChain = outerMethod(innerMethod(iterator)); + iteratorChain.next().then( + _ => iteratorChain.next('last value').then( + ({done, value}) => { + assert.sameValue(done, false); + // Unwrap the asIndexedPair return values. + while (Array.isArray(value)) { + value = value[1]; + } + assert.sameValue(value, 'last value'); + } + ), + ); + } +} + diff --git a/test/staging/sm/AsyncIterator/prototype/lazy-methods-proxy-accesses.js b/test/staging/sm/AsyncIterator/prototype/lazy-methods-proxy-accesses.js new file mode 100644 index 0000000000..9e2cf5bea9 --- /dev/null +++ b/test/staging/sm/AsyncIterator/prototype/lazy-methods-proxy-accesses.js @@ -0,0 +1,73 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +esid: pending +description: | + Lazy %AsyncIterator.prototype% methods access specified properties only. +info: | + Iterator Helpers proposal 2.1.6 +features: +- async-iteration +- iterator-helpers +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +---*/ +// + +let log; +const handlerProxy = new Proxy({}, { + get: (target, key, receiver) => (...args) => { + log.push(`${key}: ${args.filter(x => typeof x != 'object').map(x => x.toString())}`); + return Reflect[key](...args); + }, +}); + +class TestIterator extends AsyncIterator { + value = 0; + async next() { + if (this.value < 1) + return new Proxy({done: false, value: this.value++}, handlerProxy); + return new Proxy({done: true, value: undefined}, handlerProxy); + } +} + +const methods = [ + ['map', x => x], + ['filter', x => true], + ['take', 4], + ['drop', 0], + ['asIndexedPairs', undefined], + ['flatMap', async function*(x) { yield x; }], +]; + +(async () => { + for (const [method, argument] of methods) { + log = []; + const iteratorProxy = new Proxy(new TestIterator(), handlerProxy); + const iteratorHelper = iteratorProxy[method](argument); + + await iteratorHelper.next(); + await iteratorHelper.next(); + const {done} = await iteratorHelper.next(); + assert.sameValue(done, true); + assert.sameValue( + log.join('\n'), + `get: ${method} +get: next +get: value +get: value +set: value,1 +getOwnPropertyDescriptor: value +defineProperty: value +get: then +get: done +get: value +get: value +get: then +get: done` + ); + } +})(); + diff --git a/test/staging/sm/AsyncIterator/prototype/lazy-methods-return-closes-iterator.js b/test/staging/sm/AsyncIterator/prototype/lazy-methods-return-closes-iterator.js new file mode 100644 index 0000000000..879df287b9 --- /dev/null +++ b/test/staging/sm/AsyncIterator/prototype/lazy-methods-return-closes-iterator.js @@ -0,0 +1,68 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +esid: pending +description: | + Calling `return` on a lazy %AsyncIterator.prototype% method closes the source iterator. +info: | + Iterator Helpers proposal 2.1.6 +features: +- async-iteration +- iterator-helpers +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +---*/ + +// +// +class TestIterator extends AsyncIterator { + async next() { + return {done: false, value: 1}; + } + + closed = false; + async return(value) { + this.closed = true; + return {done: true, value}; + } +} + +async function* gen(x) { yield x; } + +const methods = [ + iter => iter.map(x => x), + iter => iter.filter(x => x), + iter => iter.take(1), + iter => iter.drop(0), + iter => iter.asIndexedPairs(), + iter => iter.flatMap(gen), +]; + +for (const method of methods) { + const iter = new TestIterator(); + const iterHelper = method(iter); + + iterHelper.next().then(() => { + assert.sameValue(iter.closed, false); + iterHelper.return(0).then(({done, value}) => { + assert.sameValue(iter.closed, true); + assert.sameValue(done, true); + assert.sameValue(value, 0); + }); + }); +} + +for (const method of methods) { + const iter = new TestIterator(); + const iterHelper = method(iter); + + assert.sameValue(iter.closed, false); + iterHelper.return(0).then(({done, value}) => { + assert.sameValue(iter.closed, true); + assert.sameValue(done, true); + assert.sameValue(value, 0); + }); +} + diff --git a/test/staging/sm/AsyncIterator/prototype/lazy-methods-return-new-iterator-result.js b/test/staging/sm/AsyncIterator/prototype/lazy-methods-return-new-iterator-result.js new file mode 100644 index 0000000000..c97e03d32c --- /dev/null +++ b/test/staging/sm/AsyncIterator/prototype/lazy-methods-return-new-iterator-result.js @@ -0,0 +1,47 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +esid: pending +description: | + Lazy Iterator Helper methods return new iterator result objects. +info: | + Iterator Helpers proposal 2.1.6 +features: +- async-iteration +- iterator-helpers +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +---*/ + +// +// +const iterResult = {done: false, value: 1, testProperty: 'test'}; +class TestIterator extends AsyncIterator { + async next() { + return iterResult; + } +} + +async function* gen(x) { yield x; } + +const methods = [ + iter => iter.map(x => x), + iter => iter.filter(x => true), + iter => iter.take(1), + iter => iter.drop(0), + iter => iter.asIndexedPairs(), + iter => iter.flatMap(gen), +]; + +// Call `return` before stepping the iterator: +for (const method of methods) { + const iter = new TestIterator(); + const iterHelper = method(iter); + iterHelper.next().then(result => { + assert.sameValue(result == iterResult, false); + assert.sameValue(result.testProperty, undefined); + }); +} + diff --git a/test/staging/sm/AsyncIterator/prototype/lazy-methods-throw-closes-iterator-before-next.js b/test/staging/sm/AsyncIterator/prototype/lazy-methods-throw-closes-iterator-before-next.js new file mode 100644 index 0000000000..d94e844bab --- /dev/null +++ b/test/staging/sm/AsyncIterator/prototype/lazy-methods-throw-closes-iterator-before-next.js @@ -0,0 +1,63 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +esid: pending +description: | + Calling `throw` on a lazy %AsyncIterator.prototype% method closes the source iterator. +info: | + Iterator Helpers proposal 2.1.6 +features: +- async-iteration +- iterator-helpers +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +---*/ + +// +// +class TestError extends Error {} + +class TestIterator extends AsyncIterator { + async next() { + return {done: false, value: 1}; + } + + closed = false; + async return(value) { + this.closed = true; + return {done: true, value}; + } +} + +async function* gen(x) { yield x; } + +const methods = [ + iter => iter.map(x => x), + iter => iter.filter(x => x), + iter => iter.take(1), + iter => iter.drop(0), + iter => iter.asIndexedPairs(), + iter => iter.flatMap(gen), +]; + +for (const method of methods) { + const iter = new TestIterator(); + const iterHelper = method(iter); + + assert.sameValue(iter.closed, false); + iterHelper.throw(new TestError()).then( + _ => assert.sameValue(true, false, 'Expected reject.'), + err => { + assert.sameValue(err instanceof TestError, true); + assert.sameValue(iter.closed, true); + + iterHelper.next().then(({done, value}) => { + assert.sameValue(done, true); + assert.sameValue(value, undefined); + }); + }, + ); +} + diff --git a/test/staging/sm/AsyncIterator/prototype/lazy-methods-throw-eagerly-on-next-non-callable.js b/test/staging/sm/AsyncIterator/prototype/lazy-methods-throw-eagerly-on-next-non-callable.js new file mode 100644 index 0000000000..fd022c64a3 --- /dev/null +++ b/test/staging/sm/AsyncIterator/prototype/lazy-methods-throw-eagerly-on-next-non-callable.js @@ -0,0 +1,40 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +esid: pending +description: | + Lazy %AsyncIterator.prototype% methods throw eagerly when `next` is non-callable. +info: | + Iterator Helpers proposal 1.1.1 +features: +- async-iteration +- iterator-helpers +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +---*/ + +// +// +async function* gen(x) { yield x; } +const methods = [ + next => AsyncIterator.prototype.map.bind({next}, x => x), + next => AsyncIterator.prototype.filter.bind({next}, x => x), + next => AsyncIterator.prototype.take.bind({next}, 1), + next => AsyncIterator.prototype.drop.bind({next}, 0), + next => AsyncIterator.prototype.asIndexedPairs.bind({next}), + next => AsyncIterator.prototype.flatMap.bind({next}, gen), +]; + +for (const method of methods) { + assertThrowsInstanceOf(method(0), TypeError); + assertThrowsInstanceOf(method(false), TypeError); + assertThrowsInstanceOf(method(undefined), TypeError); + assertThrowsInstanceOf(method(null), TypeError); + assertThrowsInstanceOf(method(''), TypeError); + assertThrowsInstanceOf(method(Symbol('')), TypeError); + assertThrowsInstanceOf(method({}), TypeError); + assertThrowsInstanceOf(method([]), TypeError); +} + diff --git a/test/staging/sm/AsyncIterator/prototype/lazy-methods-throw-eagerly-on-non-callable.js b/test/staging/sm/AsyncIterator/prototype/lazy-methods-throw-eagerly-on-non-callable.js new file mode 100644 index 0000000000..cf98719869 --- /dev/null +++ b/test/staging/sm/AsyncIterator/prototype/lazy-methods-throw-eagerly-on-non-callable.js @@ -0,0 +1,45 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +esid: pending +description: | + Lazy %AsyncIterator.prototype% methods throw eagerly when passed non-callables. +info: | + Iterator Helpers proposal 2.1.6 +features: +- async-iteration +- iterator-helpers +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +---*/ + +// +// +async function* gen() {} + +const methods = [ + (iter, fn) => iter.map(fn), + (iter, fn) => iter.filter(fn), + (iter, fn) => iter.flatMap(fn), +]; + +for (const method of methods) { + assertThrowsInstanceOf(() => method(AsyncIterator.prototype, 0), TypeError); + assertThrowsInstanceOf(() => method(AsyncIterator.prototype, false), TypeError); + assertThrowsInstanceOf(() => method(AsyncIterator.prototype, undefined), TypeError); + assertThrowsInstanceOf(() => method(AsyncIterator.prototype, null), TypeError); + assertThrowsInstanceOf(() => method(AsyncIterator.prototype, ''), TypeError); + assertThrowsInstanceOf(() => method(AsyncIterator.prototype, Symbol('')), TypeError); + assertThrowsInstanceOf(() => method(AsyncIterator.prototype, {}), TypeError); + + assertThrowsInstanceOf(() => method(gen(), 0), TypeError); + assertThrowsInstanceOf(() => method(gen(), false), TypeError); + assertThrowsInstanceOf(() => method(gen(), undefined), TypeError); + assertThrowsInstanceOf(() => method(gen(), null), TypeError); + assertThrowsInstanceOf(() => method(gen(), ''), TypeError); + assertThrowsInstanceOf(() => method(gen(), Symbol('')), TypeError); + assertThrowsInstanceOf(() => method(gen(), {}), TypeError); +} + diff --git a/test/staging/sm/AsyncIterator/prototype/lazy-methods-throw-eagerly-on-non-iterator.js b/test/staging/sm/AsyncIterator/prototype/lazy-methods-throw-eagerly-on-non-iterator.js new file mode 100644 index 0000000000..fce8ffdadc --- /dev/null +++ b/test/staging/sm/AsyncIterator/prototype/lazy-methods-throw-eagerly-on-non-iterator.js @@ -0,0 +1,36 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +esid: pending +description: | + Lazy %AsyncIterator.prototype% methods throw eagerly when called on non-iterators. +info: | + AsyncIterator Helpers proposal 1.1.1 +features: +- async-iteration +- iterator-helpers +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +---*/ + +// +// +async function* gen(x) { yield x; } + +const methods = [ + iter => AsyncIterator.prototype.map.bind(iter, x => x), + iter => AsyncIterator.prototype.filter.bind(iter, x => x), + iter => AsyncIterator.prototype.take.bind(iter, 1), + iter => AsyncIterator.prototype.drop.bind(iter, 0), + iter => AsyncIterator.prototype.asIndexedPairs.bind(iter), + iter => AsyncIterator.prototype.flatMap.bind(iter, gen), +]; + +for (const method of methods) { + for (const value of [undefined, null, 0, false, '', Symbol(''), {}, []]) { + assertThrowsInstanceOf(method(value), TypeError); + } +} + diff --git a/test/staging/sm/AsyncIterator/prototype/lazy-methods-throw-next-done-throws.js b/test/staging/sm/AsyncIterator/prototype/lazy-methods-throw-next-done-throws.js new file mode 100644 index 0000000000..1c8b00552b --- /dev/null +++ b/test/staging/sm/AsyncIterator/prototype/lazy-methods-throw-next-done-throws.js @@ -0,0 +1,58 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +esid: pending +description: | + Lazy %AsyncIterator.prototype% methods throw if `next.done` throws. +info: | + AsyncIterator Helpers proposal 2.1.6 +features: +- async-iteration +- iterator-helpers +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +---*/ + +// +// +class TestError extends Error {} +class TestAsyncIterator extends AsyncIterator { + async next() { + return { + get done() { + throw new TestError(); + } + }; + } + + closed = false; + async return() { + this.closed = true; + return {done: true}; + } +} + +async function* gen(x) { yield x; } +const methods = [ + iter => iter.map(x => x), + iter => iter.filter(x => x), + iter => iter.take(1), + iter => iter.drop(0), + iter => iter.asIndexedPairs(), + iter => iter.flatMap(gen), +]; + +for (const method of methods) { + const iterator = new TestAsyncIterator(); + assert.sameValue(iterator.closed, false); + method(iterator).next().then( + _ => assert.sameValue(true, false, 'Expected reject'), + err => { + assert.sameValue(err instanceof TestError, true); + assert.sameValue(iterator.closed, false); + }, + ); +} + diff --git a/test/staging/sm/AsyncIterator/prototype/lazy-methods-throw-next-not-object.js b/test/staging/sm/AsyncIterator/prototype/lazy-methods-throw-next-not-object.js new file mode 100644 index 0000000000..bf713c24cd --- /dev/null +++ b/test/staging/sm/AsyncIterator/prototype/lazy-methods-throw-next-not-object.js @@ -0,0 +1,55 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +esid: pending +description: | + Lazy %AsyncIterator.prototype% methods throw if `next` call returns a non-object. +info: | + Iterator Helpers proposal 2.1.6 +features: +- async-iteration +- iterator-helpers +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +---*/ + +// +// +class TestAsyncIterator extends AsyncIterator { + async next(value) { + return value; + } + + closed = false; + async return() { + this.closed = true; + return {done: true}; + } +} + +async function* gen(x) { yield x; } +const methods = [ + iter => iter.map(x => x), + iter => iter.filter(x => x), + iter => iter.take(1), + iter => iter.drop(0), + iter => iter.asIndexedPairs(), + iter => iter.flatMap(gen), +]; + +for (const method of methods) { + for (const value of [undefined, null, 0, false, '', Symbol('')]) { + const iterator = new TestAsyncIterator(); + assert.sameValue(iterator.closed, false); + method(iterator).next(value).then( + _ => assert.sameValue(true, false, 'Expected reject'), + err => { + assert.sameValue(err instanceof TypeError, true); + assert.sameValue(iterator.closed, false); + }, + ); + } +} + diff --git a/test/staging/sm/AsyncIterator/prototype/lazy-methods-throw-on-reentry.js b/test/staging/sm/AsyncIterator/prototype/lazy-methods-throw-on-reentry.js new file mode 100644 index 0000000000..d0842087a3 --- /dev/null +++ b/test/staging/sm/AsyncIterator/prototype/lazy-methods-throw-on-reentry.js @@ -0,0 +1,27 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +features: +- async-iteration +description: | + pending +esid: pending +---*/ + +async function* gen(x) { yield x; } + +const methods = ['map', 'filter', 'flatMap']; + +for (const method of methods) { + const iter = gen('value'); + const iterHelper = iter[method](x => iterHelper.next()); + iterHelper.next().then( + _ => assert.sameValue(true, false, 'Expected reject.'), + err => assert.sameValue(err instanceof TypeError, true), + ); +} + diff --git a/test/staging/sm/AsyncIterator/prototype/map/length.js b/test/staging/sm/AsyncIterator/prototype/map/length.js new file mode 100644 index 0000000000..3f969a4255 --- /dev/null +++ b/test/staging/sm/AsyncIterator/prototype/map/length.js @@ -0,0 +1,26 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +esid: pending +description: | + %AsyncIterator.prototype%.map length value and descriptor. +info: | + 17 ECMAScript Standard Built-in Objects +features: +- async-iteration +- iterator-helpers +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +---*/ +// + +assert.sameValue(AsyncIterator.prototype.map.length, 1); + +const propertyDescriptor = Reflect.getOwnPropertyDescriptor(AsyncIterator.prototype.map, 'length'); +assert.sameValue(propertyDescriptor.value, 1); +assert.sameValue(propertyDescriptor.enumerable, false); +assert.sameValue(propertyDescriptor.writable, false); +assert.sameValue(propertyDescriptor.configurable, true); + diff --git a/test/staging/sm/AsyncIterator/prototype/map/map.js b/test/staging/sm/AsyncIterator/prototype/map/map.js new file mode 100644 index 0000000000..22e3b737f9 --- /dev/null +++ b/test/staging/sm/AsyncIterator/prototype/map/map.js @@ -0,0 +1,33 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +features: +- async-iteration +description: | + pending +esid: pending +---*/ + +async function* gen() { + yield 1; + yield 2; + yield 3; +} + +const iter = gen().map(x => x**2); + +for (const v of [1, 4, 9]) { + iter.next().then( + ({done, value}) => { + assert.sameValue(done, false); + assert.sameValue(value, v); + } + ); +} + +iter.next().then(({done}) => assert.sameValue(done, true)); + diff --git a/test/staging/sm/AsyncIterator/prototype/map/name.js b/test/staging/sm/AsyncIterator/prototype/map/name.js new file mode 100644 index 0000000000..8fcdd061df --- /dev/null +++ b/test/staging/sm/AsyncIterator/prototype/map/name.js @@ -0,0 +1,24 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +esid: pending +description: | + %AsyncIterator.prototype%.map.name value and descriptor. +info: | + 17 ECMAScript Standard Built-in Objects +features: +- async-iteration +- iterator-helpers +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +---*/ +assert.sameValue(AsyncIterator.prototype.map.name, 'map'); + +const propertyDescriptor = Reflect.getOwnPropertyDescriptor(AsyncIterator.prototype.map, 'name'); +assert.sameValue(propertyDescriptor.value, 'map'); +assert.sameValue(propertyDescriptor.enumerable, false); +assert.sameValue(propertyDescriptor.writable, false); +assert.sameValue(propertyDescriptor.configurable, true); + diff --git a/test/staging/sm/AsyncIterator/prototype/reduce/accumulator-set-to-initial-value.js b/test/staging/sm/AsyncIterator/prototype/reduce/accumulator-set-to-initial-value.js new file mode 100644 index 0000000000..a172092462 --- /dev/null +++ b/test/staging/sm/AsyncIterator/prototype/reduce/accumulator-set-to-initial-value.js @@ -0,0 +1,23 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +features: +- async-iteration +description: | + pending +esid: pending +---*/ + +const reducer = (acc, _) => acc; +async function* gen() { + yield 1; + yield 2; + yield 3; +} + +gen().reduce(reducer, 0).then(value => assert.sameValue(value, 0)); + diff --git a/test/staging/sm/AsyncIterator/prototype/reduce/async-writes.js b/test/staging/sm/AsyncIterator/prototype/reduce/async-writes.js new file mode 100644 index 0000000000..fa2bc2b2d1 --- /dev/null +++ b/test/staging/sm/AsyncIterator/prototype/reduce/async-writes.js @@ -0,0 +1,30 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +features: +- async-iteration +description: | + pending +esid: pending +---*/ + +let x = {a: () => true}; + +async function* gen() { + yield x.a(); + yield x.a(); +} + +gen().reduce(() => {}, 0).then( + () => assert.sameValue(true, false, 'expected error'), + err => assert.sameValue(err instanceof Error, true), +); + +x.a = () => { + throw Error(); +}; + diff --git a/test/staging/sm/AsyncIterator/prototype/reduce/check-fn-after-getting-iterator.js b/test/staging/sm/AsyncIterator/prototype/reduce/check-fn-after-getting-iterator.js new file mode 100644 index 0000000000..f2f44aad9f --- /dev/null +++ b/test/staging/sm/AsyncIterator/prototype/reduce/check-fn-after-getting-iterator.js @@ -0,0 +1,37 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +features: +- async-iteration +description: | + pending +esid: pending +---*/ +const log = []; +const handlerProxy = new Proxy({}, { + get: (target, key, receiver) => (...args) => { + log.push(`${key}: ${args[1]?.toString()}`); + return Reflect[key](...args); + }, +}); + +class TestIterator extends AsyncIterator { + next() { + return Promise.resolve({ done: this.closed }); + } +} + +const iter = new Proxy(new TestIterator(), handlerProxy); +iter.reduce(1).then(() => assert.sameValue(true, false, 'expected error'), err => { + assert.sameValue(err instanceof TypeError, true); + assert.sameValue( + log.join('\n'), + `get: reduce +get: next` + ); +}); + diff --git a/test/staging/sm/AsyncIterator/prototype/reduce/descriptor.js b/test/staging/sm/AsyncIterator/prototype/reduce/descriptor.js new file mode 100644 index 0000000000..af0d2daaf4 --- /dev/null +++ b/test/staging/sm/AsyncIterator/prototype/reduce/descriptor.js @@ -0,0 +1,21 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +info: | + Descriptor property of AsyncIterator.prototype.reduce +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +features: +- async-iteration +description: | + pending +esid: pending +---*/ +const propDesc = Reflect.getOwnPropertyDescriptor(AsyncIterator.prototype, 'reduce'); +assert.sameValue(typeof propDesc.value, 'function'); +assert.sameValue(propDesc.writable, true); +assert.sameValue(propDesc.enumerable, false); +assert.sameValue(propDesc.configurable, true); + diff --git a/test/staging/sm/AsyncIterator/prototype/reduce/empty-iterator-without-initial-value-throws.js b/test/staging/sm/AsyncIterator/prototype/reduce/empty-iterator-without-initial-value-throws.js new file mode 100644 index 0000000000..11b982406b --- /dev/null +++ b/test/staging/sm/AsyncIterator/prototype/reduce/empty-iterator-without-initial-value-throws.js @@ -0,0 +1,19 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +features: +- async-iteration +description: | + pending +esid: pending +---*/ + +async function* gen() {} +gen().reduce((x, y) => x + y).then(() => assert.sameValue(true, false, 'expected error'), err => { + assert.sameValue(err instanceof TypeError, true); +}); + diff --git a/test/staging/sm/AsyncIterator/prototype/reduce/error-from-correct-realm.js b/test/staging/sm/AsyncIterator/prototype/reduce/error-from-correct-realm.js new file mode 100644 index 0000000000..77d818c741 --- /dev/null +++ b/test/staging/sm/AsyncIterator/prototype/reduce/error-from-correct-realm.js @@ -0,0 +1,31 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +features: +- async-iteration +description: | + pending +esid: pending +---*/ + +const otherGlobal = createNewGlobal({newCompartment: true}); +assert.sameValue(TypeError !== otherGlobal.TypeError, true); + +async function *gen() {} + +gen().reduce().then(() => assert.sameValue(true, false, 'expected error'), err => { + assert.sameValue(err instanceof TypeError, true); +}); + +otherGlobal.AsyncIterator.prototype.reduce.call(gen()).then(() => assert.sameValue(true, false, 'expected error'), err => { + assert.sameValue( + err instanceof otherGlobal.TypeError, + true, + 'TypeError comes from the realm of the method.', + ); +}); + diff --git a/test/staging/sm/AsyncIterator/prototype/reduce/interleaving-calls.js b/test/staging/sm/AsyncIterator/prototype/reduce/interleaving-calls.js new file mode 100644 index 0000000000..022b098c6b --- /dev/null +++ b/test/staging/sm/AsyncIterator/prototype/reduce/interleaving-calls.js @@ -0,0 +1,34 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +features: +- async-iteration +description: | + pending +esid: pending +---*/ + +const log = []; +async function* gen(n) { + log.push(`${n}`); + yield 1; + log.push(`${n}`); + yield 2; +} + +Promise.all([gen(1).reduce(() => {}, 0), gen(2).reduce(() => {}, 0)]).then( + () => { + assert.sameValue( + log.join(' '), + '1 2 1 2', + ); + }, + err => { + throw err; + } +); + diff --git a/test/staging/sm/AsyncIterator/prototype/reduce/iterator-empty-return-initial-value.js b/test/staging/sm/AsyncIterator/prototype/reduce/iterator-empty-return-initial-value.js new file mode 100644 index 0000000000..186a36c346 --- /dev/null +++ b/test/staging/sm/AsyncIterator/prototype/reduce/iterator-empty-return-initial-value.js @@ -0,0 +1,19 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +features: +- async-iteration +description: | + pending +esid: pending +---*/ + +const reducer = (x, y) => 0; +async function *gen() {} + +gen().reduce(reducer, 1).then(result => assert.sameValue(result, 1)); + diff --git a/test/staging/sm/AsyncIterator/prototype/reduce/iterator-next-return-non-object-throws.js b/test/staging/sm/AsyncIterator/prototype/reduce/iterator-next-return-non-object-throws.js new file mode 100644 index 0000000000..98485db69c --- /dev/null +++ b/test/staging/sm/AsyncIterator/prototype/reduce/iterator-next-return-non-object-throws.js @@ -0,0 +1,41 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +features: +- async-iteration +description: | + pending +esid: pending +---*/ + +class TestIterator extends AsyncIterator { + constructor(value) { + super(); + this.value = value; + } + + next() { + return Promise.resolve(this.value); + } +} + +const sum = (x, y) => x + y; +function check(value) { + const iter = new TestIterator(value); + iter.reduce(sum).then(() => assert.sameValue(true, false, 'expected error'), err => { + assert.sameValue(err instanceof TypeError, true); + }); +} + +check(); +check(undefined); +check(null); +check(0); +check(false); +check(''); +check(Symbol('')); + diff --git a/test/staging/sm/AsyncIterator/prototype/reduce/left-associative.js b/test/staging/sm/AsyncIterator/prototype/reduce/left-associative.js new file mode 100644 index 0000000000..e8550c21ed --- /dev/null +++ b/test/staging/sm/AsyncIterator/prototype/reduce/left-associative.js @@ -0,0 +1,25 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +features: +- async-iteration +description: | + pending +esid: pending +---*/ + +async function* gen() { + yield 1; + yield 2; + yield 3; +} + +gen().reduce((x, y) => `(${x}+${y})`, 0) + .then(result => assert.sameValue(result, '(((0+1)+2)+3)')); +gen().reduce((x, y) => `(${x}+${y})`) + .then(result => assert.sameValue(result, '((1+2)+3)')); + diff --git a/test/staging/sm/AsyncIterator/prototype/reduce/length.js b/test/staging/sm/AsyncIterator/prototype/reduce/length.js new file mode 100644 index 0000000000..d9bdc36cd3 --- /dev/null +++ b/test/staging/sm/AsyncIterator/prototype/reduce/length.js @@ -0,0 +1,23 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +description: | + The `length` property of AsyncIterator.prototype.reduce. +info: | + ES7 section 17: Unless otherwise specified, the length property of a built-in + Function object has the attributes { [[Writable]]: false, [[Enumerable]]: + false, [[Configurable]]: true }. +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +features: +- async-iteration +esid: pending +---*/ +const propDesc = Reflect.getOwnPropertyDescriptor(AsyncIterator.prototype.reduce, 'length'); +assert.sameValue(propDesc.value, 1); +assert.sameValue(propDesc.writable, false); +assert.sameValue(propDesc.enumerable, false); +assert.sameValue(propDesc.configurable, true); + diff --git a/test/staging/sm/AsyncIterator/prototype/reduce/name.js b/test/staging/sm/AsyncIterator/prototype/reduce/name.js new file mode 100644 index 0000000000..66fb10efca --- /dev/null +++ b/test/staging/sm/AsyncIterator/prototype/reduce/name.js @@ -0,0 +1,19 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +description: | + `name` property of AsyncIterator.prototype.reduce. +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +features: +- async-iteration +esid: pending +---*/ +const propDesc = Reflect.getOwnPropertyDescriptor(AsyncIterator.prototype.reduce, 'name'); +assert.sameValue(propDesc.value, 'reduce'); +assert.sameValue(propDesc.writable, false); +assert.sameValue(propDesc.enumerable, false); +assert.sameValue(propDesc.configurable, true); + diff --git a/test/staging/sm/AsyncIterator/prototype/reduce/next-throws-iterator-not-closed.js b/test/staging/sm/AsyncIterator/prototype/reduce/next-throws-iterator-not-closed.js new file mode 100644 index 0000000000..e1d35cbd1d --- /dev/null +++ b/test/staging/sm/AsyncIterator/prototype/reduce/next-throws-iterator-not-closed.js @@ -0,0 +1,34 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +features: +- async-iteration +description: | + pending +esid: pending +---*/ + +class TestIterator extends AsyncIterator { + next() { + throw new Error(); + } + + closed = false; + return() { + this.closed = true; + } +} + +const sum = (x, y) => x + y; +const iter = new TestIterator(); + +assert.sameValue(iter.closed, false); +iter.reduce(sum).then(() => assert.sameValue(true, false, 'expected error'), err => { + assert.sameValue(err instanceof Error, true); + assert.sameValue(iter.closed, false); +}); + diff --git a/test/staging/sm/AsyncIterator/prototype/reduce/no-initial-value-set-accumulator-to-first-value.js b/test/staging/sm/AsyncIterator/prototype/reduce/no-initial-value-set-accumulator-to-first-value.js new file mode 100644 index 0000000000..664f9e4f3d --- /dev/null +++ b/test/staging/sm/AsyncIterator/prototype/reduce/no-initial-value-set-accumulator-to-first-value.js @@ -0,0 +1,23 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +features: +- async-iteration +description: | + pending +esid: pending +---*/ + +const reducer = (acc, _) => acc; +async function* gen() { + yield 1; + yield 2; + yield 3; +} + +gen().reduce(reducer).then(result => assert.sameValue(result, 1)); + diff --git a/test/staging/sm/AsyncIterator/prototype/reduce/proxy.js b/test/staging/sm/AsyncIterator/prototype/reduce/proxy.js new file mode 100644 index 0000000000..caf4f6c600 --- /dev/null +++ b/test/staging/sm/AsyncIterator/prototype/reduce/proxy.js @@ -0,0 +1,54 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +features: +- async-iteration +description: | + pending +esid: pending +---*/ +// +// This test checks that %Iterator.prototype%.reduce only gets the `next` method off of the +// iterator once, and never accesses the @@iterator property. +const log = []; +const handlerProxy = new Proxy({}, { + get: (target, key, receiver) => (...args) => { + log.push(`${key}: ${args[1]?.toString()}`); + return Reflect[key](...args); + }, +}); + +class Counter extends AsyncIterator { + value = 0; + next() { + const value = this.value; + if (value < 2) { + this.value = value + 1; + return Promise.resolve({done: false, value}); + } + return Promise.resolve({done: true}); + } +} + +const iter = new Proxy(new Counter(), handlerProxy); +iter.reduce((x, y) => x + y).then(() => { + assert.sameValue( + log.join('\n'), + `get: reduce +get: next +get: value +set: value +getOwnPropertyDescriptor: value +defineProperty: value +get: value +set: value +getOwnPropertyDescriptor: value +defineProperty: value +get: value` + ); +}); + diff --git a/test/staging/sm/AsyncIterator/prototype/reduce/reduce.js b/test/staging/sm/AsyncIterator/prototype/reduce/reduce.js new file mode 100644 index 0000000000..05e65405d2 --- /dev/null +++ b/test/staging/sm/AsyncIterator/prototype/reduce/reduce.js @@ -0,0 +1,23 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +features: +- async-iteration +description: | + pending +esid: pending +---*/ + +const reducer = (acc, value) => acc + value; +async function* gen() { + yield 1; + yield 2; + yield 3; +} + +gen().reduce(reducer, 0).then(result => assert.sameValue(result, 6)); + diff --git a/test/staging/sm/AsyncIterator/prototype/reduce/reducer-not-callable-throws.js b/test/staging/sm/AsyncIterator/prototype/reduce/reducer-not-callable-throws.js new file mode 100644 index 0000000000..dd0ccc88b8 --- /dev/null +++ b/test/staging/sm/AsyncIterator/prototype/reduce/reducer-not-callable-throws.js @@ -0,0 +1,34 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +features: +- async-iteration +description: | + pending +esid: pending +---*/ + +async function *gen() {} + +function check(fn) { + gen().reduce(fn).then(() => { + throw new Error('every should have thrown'); + }, + err => { + assert.sameValue(err instanceof TypeError, true); + }); +} + +check(); +check(undefined); +check(null); +check(0); +check(false); +check(''); +check(Symbol('')); +check({}); + diff --git a/test/staging/sm/AsyncIterator/prototype/reduce/reducer-throws-iterator-closed.js b/test/staging/sm/AsyncIterator/prototype/reduce/reducer-throws-iterator-closed.js new file mode 100644 index 0000000000..1b738c1a2e --- /dev/null +++ b/test/staging/sm/AsyncIterator/prototype/reduce/reducer-throws-iterator-closed.js @@ -0,0 +1,34 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +features: +- async-iteration +description: | + pending +esid: pending +---*/ + +class TestIterator extends AsyncIterator { + next() { + return Promise.resolve({ done: this.closed, value: undefined }); + } + + closed = false; + return() { + this.closed = true; + } +} + +const reducer = (x, y) => { throw new Error(); }; +const iter = new TestIterator(); + +assert.sameValue(iter.closed, false); +iter.reduce(reducer).then(() => assert.sameValue(true, false, 'expected error'), err => { + assert.sameValue(err instanceof Error, true); + assert.sameValue(iter.closed, true); +}); + diff --git a/test/staging/sm/AsyncIterator/prototype/reduce/this-not-iterator-throws.js b/test/staging/sm/AsyncIterator/prototype/reduce/this-not-iterator-throws.js new file mode 100644 index 0000000000..7414f207d5 --- /dev/null +++ b/test/staging/sm/AsyncIterator/prototype/reduce/this-not-iterator-throws.js @@ -0,0 +1,29 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +features: +- async-iteration +description: | + pending +esid: pending +---*/ + +const sum = (x, y) => x + y; +function check(x) { + AsyncIterator.prototype.reduce.call(x, sum).then( + () => assert.sameValue(true, false, 'expected error'), + err => { + assert.sameValue(err instanceof TypeError, true); + } + ); +} + +check(); +check(undefined); +check({}); +check({next: 0}); + diff --git a/test/staging/sm/AsyncIterator/prototype/reduce/value-throws-iterator-not-closed.js b/test/staging/sm/AsyncIterator/prototype/reduce/value-throws-iterator-not-closed.js new file mode 100644 index 0000000000..e27e6f0d90 --- /dev/null +++ b/test/staging/sm/AsyncIterator/prototype/reduce/value-throws-iterator-not-closed.js @@ -0,0 +1,38 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +features: +- async-iteration +description: | + pending +esid: pending +---*/ + +class TestError extends Error {} +class TestIterator extends AsyncIterator { + next() { + return Promise.resolve({ + done: false, + get value() { + throw new TestError(); + } + }); + } + + closed = false; + return() { + closed = true; + } +} + +const iterator = new TestIterator(); +assert.sameValue(iterator.closed, false, 'iterator starts unclosed'); +iterator.reduce((x, y) => x + y, 0).then(() => assert.sameValue(true, false, 'expected error'), err => { + assert.sameValue(err instanceof TestError, true); + assert.sameValue(iterator.closed, false, 'iterator remains unclosed'); +}); + diff --git a/test/staging/sm/AsyncIterator/prototype/some/async-writes.js b/test/staging/sm/AsyncIterator/prototype/some/async-writes.js new file mode 100644 index 0000000000..57cbad099f --- /dev/null +++ b/test/staging/sm/AsyncIterator/prototype/some/async-writes.js @@ -0,0 +1,30 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +features: +- async-iteration +description: | + pending +esid: pending +---*/ + +let x = {a: () => true}; + +async function* gen() { + yield x.a(); + yield x.a(); +} + +gen().some(() => {}).then( + () => assert.sameValue(true, false, 'expected error'), + err => assert.sameValue(err instanceof Error, true), +); + +x.a = () => { + throw Error(); +}; + diff --git a/test/staging/sm/AsyncIterator/prototype/some/check-fn-after-getting-iterator.js b/test/staging/sm/AsyncIterator/prototype/some/check-fn-after-getting-iterator.js new file mode 100644 index 0000000000..bc21cef8e0 --- /dev/null +++ b/test/staging/sm/AsyncIterator/prototype/some/check-fn-after-getting-iterator.js @@ -0,0 +1,41 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +features: +- async-iteration +description: | + pending +esid: pending +---*/ +const log = []; +const handlerProxy = new Proxy({}, { + get: (target, key, receiver) => (...args) => { + log.push(`${key}: ${args[1]?.toString()}`); + return Reflect[key](...args); + }, +}); + +class TestIterator extends AsyncIterator { + next() { + return Promise.resolve({done: true}); + } +} + +async function* gen() { + yield 1; +} + +const iter = new Proxy(new TestIterator(), handlerProxy); +iter.some(1).then(() => assert.sameValue(true, false, 'expected error'), err => assert.sameValue(err instanceof TypeError, true)); + +assert.sameValue( + log.join('\n'), + `get: some +get: next` +); + + diff --git a/test/staging/sm/AsyncIterator/prototype/some/coerce-result-to-boolean.js b/test/staging/sm/AsyncIterator/prototype/some/coerce-result-to-boolean.js new file mode 100644 index 0000000000..1f31f13fc0 --- /dev/null +++ b/test/staging/sm/AsyncIterator/prototype/some/coerce-result-to-boolean.js @@ -0,0 +1,40 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +features: +- IsHTMLDDA +- async-iteration +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ + +async function* gen(value) { + yield value; +} +const fn = x => x; +function check(value, expected) { + gen(value).some(fn).then(result => assert.sameValue(result, expected)); +} + +check(true, true); +check(1, true); +check([], true); +check({}, true); +check('test', true); + +check(false, false); +check(0, false); +check('', false); +check(null, false); +check(undefined, false); +check(NaN, false); +check(-0, false); +check(0n, false); +check(createIsHTMLDDA(), false); +check(Promise.resolve(false), false); + diff --git a/test/staging/sm/AsyncIterator/prototype/some/descriptor.js b/test/staging/sm/AsyncIterator/prototype/some/descriptor.js new file mode 100644 index 0000000000..69b2d5ff74 --- /dev/null +++ b/test/staging/sm/AsyncIterator/prototype/some/descriptor.js @@ -0,0 +1,21 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +info: | + Descriptor property of AsyncIterator.prototype.some +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +features: +- async-iteration +description: | + pending +esid: pending +---*/ +const propDesc = Reflect.getOwnPropertyDescriptor(AsyncIterator.prototype, 'some'); +assert.sameValue(typeof propDesc.value, 'function'); +assert.sameValue(propDesc.writable, true); +assert.sameValue(propDesc.enumerable, false); +assert.sameValue(propDesc.configurable, true); + diff --git a/test/staging/sm/AsyncIterator/prototype/some/error-from-correct-realm.js b/test/staging/sm/AsyncIterator/prototype/some/error-from-correct-realm.js new file mode 100644 index 0000000000..e0e534a818 --- /dev/null +++ b/test/staging/sm/AsyncIterator/prototype/some/error-from-correct-realm.js @@ -0,0 +1,31 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +features: +- async-iteration +description: | + pending +esid: pending +---*/ + +const otherGlobal = createNewGlobal({newCompartment: true}); +assert.sameValue(TypeError !== otherGlobal.TypeError, true); + +async function *gen() {} + +gen().some().then(() => assert.sameValue(true, false, 'expected error'), err => { + assert.sameValue(err instanceof TypeError, true); +}); + +otherGlobal.AsyncIterator.prototype.some.call(gen()).then(() => assert.sameValue(true, false, 'expected error'), err => { + assert.sameValue( + err instanceof otherGlobal.TypeError, + true, + 'TypeError comes from the realm of the method.', + ); +}); + diff --git a/test/staging/sm/AsyncIterator/prototype/some/fn-not-callable-throws.js b/test/staging/sm/AsyncIterator/prototype/some/fn-not-callable-throws.js new file mode 100644 index 0000000000..7cc3edaef1 --- /dev/null +++ b/test/staging/sm/AsyncIterator/prototype/some/fn-not-callable-throws.js @@ -0,0 +1,38 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +features: +- async-iteration +description: | + pending +esid: pending +---*/ + +async function *gen() { + yield 1; +} + +function check(fn) { + gen().some(fn).then( + () => { + throw new Error('every should have thrown'); + }, + err => { + assert.sameValue(err instanceof TypeError, true); + } + ); +} + +check(); +check(undefined); +check(null); +check(0); +check(false); +check(''); +check(Symbol('')); +check({}); + diff --git a/test/staging/sm/AsyncIterator/prototype/some/fn-throws-close-iterator.js b/test/staging/sm/AsyncIterator/prototype/some/fn-throws-close-iterator.js new file mode 100644 index 0000000000..4d2bbb4c83 --- /dev/null +++ b/test/staging/sm/AsyncIterator/prototype/some/fn-throws-close-iterator.js @@ -0,0 +1,34 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +features: +- async-iteration +description: | + pending +esid: pending +---*/ + +class TestIterator extends AsyncIterator { + next() { + return Promise.resolve({ done: this.closed }); + } + + closed = false; + return() { + this.closed = true; + } +} + +const fn = () => { throw new Error(); }; +const iter = new TestIterator(); + +assert.sameValue(iter.closed, false); +iter.some(fn).then(() => assert.sameValue(true, false, 'expected error'), err => { + assert.sameValue(err instanceof Error, true); + assert.sameValue(iter.closed, true); +}); + diff --git a/test/staging/sm/AsyncIterator/prototype/some/interleaving-calls.js b/test/staging/sm/AsyncIterator/prototype/some/interleaving-calls.js new file mode 100644 index 0000000000..e4a45b6a00 --- /dev/null +++ b/test/staging/sm/AsyncIterator/prototype/some/interleaving-calls.js @@ -0,0 +1,34 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +features: +- async-iteration +description: | + pending +esid: pending +---*/ + +const log = []; +async function* gen(n) { + log.push(`${n}`); + yield 1; + log.push(`${n}`); + yield 2; +} + +Promise.all([gen(1).some(() => {}), gen(2).some(() => {})]).then( + () => { + assert.sameValue( + log.join(' '), + '1 2 1 2', + ); + }, + err => { + throw err; + } +); + diff --git a/test/staging/sm/AsyncIterator/prototype/some/length.js b/test/staging/sm/AsyncIterator/prototype/some/length.js new file mode 100644 index 0000000000..da9ce8a586 --- /dev/null +++ b/test/staging/sm/AsyncIterator/prototype/some/length.js @@ -0,0 +1,23 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +description: | + The `length` property of AsyncIterator.prototype.some. +info: | + ES7 section 17: Unless otherwise specified, the length property of a built-in + Function object has the attributes { [[Writable]]: false, [[Enumerable]]: + false, [[Configurable]]: true }. +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +features: +- async-iteration +esid: pending +---*/ +const propDesc = Reflect.getOwnPropertyDescriptor(AsyncIterator.prototype.some, 'length'); +assert.sameValue(propDesc.value, 1); +assert.sameValue(propDesc.writable, false); +assert.sameValue(propDesc.enumerable, false); +assert.sameValue(propDesc.configurable, true); + diff --git a/test/staging/sm/AsyncIterator/prototype/some/name.js b/test/staging/sm/AsyncIterator/prototype/some/name.js new file mode 100644 index 0000000000..45dd02d01d --- /dev/null +++ b/test/staging/sm/AsyncIterator/prototype/some/name.js @@ -0,0 +1,19 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +description: | + `name` property of AsyncIterator.prototype.some. +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +features: +- async-iteration +esid: pending +---*/ +const propDesc = Reflect.getOwnPropertyDescriptor(AsyncIterator.prototype.some, 'name'); +assert.sameValue(propDesc.value, 'some'); +assert.sameValue(propDesc.writable, false); +assert.sameValue(propDesc.enumerable, false); +assert.sameValue(propDesc.configurable, true); + diff --git a/test/staging/sm/AsyncIterator/prototype/some/next-throws-iterator-not-closed.js b/test/staging/sm/AsyncIterator/prototype/some/next-throws-iterator-not-closed.js new file mode 100644 index 0000000000..83e4b6679e --- /dev/null +++ b/test/staging/sm/AsyncIterator/prototype/some/next-throws-iterator-not-closed.js @@ -0,0 +1,33 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +features: +- async-iteration +description: | + pending +esid: pending +---*/ + +class TestIterator extends AsyncIterator { + next() { + throw new Error(); + } + + closed = false; + return() { + this.closed = true; + } +} + +const fn = () => {}; +const iter = new TestIterator(); + +assert.sameValue(iter.closed, false); +iter.some(fn).then(() => assert.sameValue(true, false, 'expected error'), err => { + assert.sameValue(err instanceof Error, true); + assert.sameValue(iter.closed, false); +}); diff --git a/test/staging/sm/AsyncIterator/prototype/some/proxy.js b/test/staging/sm/AsyncIterator/prototype/some/proxy.js new file mode 100644 index 0000000000..fdecbeee29 --- /dev/null +++ b/test/staging/sm/AsyncIterator/prototype/some/proxy.js @@ -0,0 +1,56 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +features: +- async-iteration +description: | + pending +esid: pending +---*/ +// +// This test checks that %Iterator.prototype%.some only gets the `next` method off of the +// iterator once, and never accesses the @@iterator property. +const log = []; +const handlerProxy = new Proxy({}, { + get: (target, key, receiver) => (...args) => { + log.push(`${key}: ${args[1]?.toString()}`); + return Reflect[key](...args); + }, +}); + +class Counter extends AsyncIterator { + value = 0; + next() { + const value = this.value; + if (value < 2) { + this.value = value + 1; + return Promise.resolve({done: false, value}); + } + return Promise.resolve({done: true}); + } +} + +const iter = new Proxy(new Counter(), handlerProxy); +iter.some(x => x % 2 == 1).then(value => { + assert.sameValue(value, true); + + assert.sameValue( + log.join('\n'), + `get: some +get: next +get: value +set: value +getOwnPropertyDescriptor: value +defineProperty: value +get: value +set: value +getOwnPropertyDescriptor: value +defineProperty: value +get: return` + ); +}); + diff --git a/test/staging/sm/AsyncIterator/prototype/some/return-false-if-none-match.js b/test/staging/sm/AsyncIterator/prototype/some/return-false-if-none-match.js new file mode 100644 index 0000000000..64fea05208 --- /dev/null +++ b/test/staging/sm/AsyncIterator/prototype/some/return-false-if-none-match.js @@ -0,0 +1,26 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +features: +- async-iteration +description: | + pending +esid: pending +---*/ + +async function* gen() { + yield 1; + yield 3; + yield 5; +} +const fn = x => x % 2 == 0; + +gen().some(fn).then(result => assert.sameValue(result, false)); + +async function* empty() {} +empty().some(x => x).then(result => assert.sameValue(result, false)); + diff --git a/test/staging/sm/AsyncIterator/prototype/some/short-circuit-on-true.js b/test/staging/sm/AsyncIterator/prototype/some/short-circuit-on-true.js new file mode 100644 index 0000000000..5d5d7498b2 --- /dev/null +++ b/test/staging/sm/AsyncIterator/prototype/some/short-circuit-on-true.js @@ -0,0 +1,30 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +features: +- async-iteration +description: | + pending +esid: pending +---*/ + +async function* gen() { + yield 1; + yield 2; + yield 3; +} +const log = []; +const fn = (value) => { + log.push(value.toString()); + return value % 2 == 0; +}; + +gen().some(fn).then(result => { + assert.sameValue(result, true); + assert.sameValue(log.join(','), '1,2'); +}); + diff --git a/test/staging/sm/AsyncIterator/prototype/some/this-not-iterator-throws.js b/test/staging/sm/AsyncIterator/prototype/some/this-not-iterator-throws.js new file mode 100644 index 0000000000..fd30eae2be --- /dev/null +++ b/test/staging/sm/AsyncIterator/prototype/some/this-not-iterator-throws.js @@ -0,0 +1,29 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +features: +- async-iteration +description: | + pending +esid: pending +---*/ + +const fn = x => x; +function check(x) { + AsyncIterator.prototype.some.call(x, fn).then( + () => assert.sameValue(true, false, 'expected error'), + err => { + assert.sameValue(err instanceof TypeError, true); + } + ); +} + +check(); +check(undefined); +check({}); +check({next: 0}); + diff --git a/test/staging/sm/AsyncIterator/prototype/some/value-throws-iterator-not-closed.js b/test/staging/sm/AsyncIterator/prototype/some/value-throws-iterator-not-closed.js new file mode 100644 index 0000000000..2b0bd819e7 --- /dev/null +++ b/test/staging/sm/AsyncIterator/prototype/some/value-throws-iterator-not-closed.js @@ -0,0 +1,38 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +features: +- async-iteration +description: | + pending +esid: pending +---*/ + +class TestError extends Error {} +class TestIterator extends AsyncIterator { + next() { + return Promise.resolve({ + done: false, + get value() { + throw new TestError(); + } + }); + } + + closed = false; + return() { + closed = true; + } +} + +const iterator = new TestIterator(); +assert.sameValue(iterator.closed, false, 'iterator starts unclosed'); +iterator.some(x => x).then(() => assert.sameValue(true, false, 'expected error'), err => { + assert.sameValue(err instanceof TestError, true); + assert.sameValue(iterator.closed, false, 'iterator remains unclosed'); +}); + diff --git a/test/staging/sm/AsyncIterator/prototype/take-drop-throw-eagerly-on-negative.js b/test/staging/sm/AsyncIterator/prototype/take-drop-throw-eagerly-on-negative.js new file mode 100644 index 0000000000..825e9e2307 --- /dev/null +++ b/test/staging/sm/AsyncIterator/prototype/take-drop-throw-eagerly-on-negative.js @@ -0,0 +1,35 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +esid: pending +description: | + `take` and `drop` throw eagerly when passed negative numbers, after rounding towards 0. +info: | + Iterator Helpers proposal 2.1.6.4 and 2.1.6.5 +features: +- async-iteration +- iterator-helpers +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +---*/ + +// +// +async function* gen() {} +const iter = gen(); +const methods = [ + value => iter.take(value), + value => iter.drop(value), +]; + +for (const method of methods) { + assertThrowsInstanceOf(() => method(-1), RangeError); + assertThrowsInstanceOf(() => method(-Infinity), RangeError); + + // Both -0 and -0.9 round towards 0. + method(-0); + method(-0.9); +} + diff --git a/test/staging/sm/AsyncIterator/prototype/take-drop-throw-eagerly-on-non-integer.js b/test/staging/sm/AsyncIterator/prototype/take-drop-throw-eagerly-on-non-integer.js new file mode 100644 index 0000000000..4d333b847b --- /dev/null +++ b/test/staging/sm/AsyncIterator/prototype/take-drop-throw-eagerly-on-non-integer.js @@ -0,0 +1,38 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +esid: pending +description: | + `take` and `drop` throw eagerly when passed values that can't be converted to numbers. +info: | + Iterator Helpers proposal 2.1.6.4 and 2.1.6.5 +features: +- async-iteration +- iterator-helpers +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +---*/ + +// +// +async function* gen() {} +const iter = gen(); +const methods = [ + value => iter.take(value), + value => iter.drop(value), +]; + +const objectWithToPrimitive = { + [Symbol.toPrimitive]() { + return {}; + } +}; + +for (const method of methods) { + assertThrowsInstanceOf(() => method(0n), TypeError); + assertThrowsInstanceOf(() => method(Symbol('')), TypeError); + assertThrowsInstanceOf(() => method(objectWithToPrimitive), TypeError); +} + diff --git a/test/staging/sm/AsyncIterator/prototype/take/close-iterator-when-none-remaining.js b/test/staging/sm/AsyncIterator/prototype/take/close-iterator-when-none-remaining.js new file mode 100644 index 0000000000..7f23118dcc --- /dev/null +++ b/test/staging/sm/AsyncIterator/prototype/take/close-iterator-when-none-remaining.js @@ -0,0 +1,50 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +esid: pending +description: | + %AsyncIterator.prototype%.take closes the iterator when remaining is 0. +info: | + Iterator Helpers proposal 2.1.6.4 +features: +- async-iteration +- iterator-helpers +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +---*/ + +// +// +class TestIterator extends AsyncIterator { + async next() { + return {done: false, value: 'value'}; + } + + closed = false; + async return() { + this.closed = true; + return {done: true}; + } +} + +const iter = new TestIterator(); +const iterTake = iter.take(1); + +iterTake.next().then( + ({done, value}) => { + assert.sameValue(done, false); + assert.sameValue(value, 'value'); + assert.sameValue(iter.closed, false); + + iterTake.next().then( + ({done, value}) => { + assert.sameValue(done, true); + assert.sameValue(value, undefined); + assert.sameValue(iter.closed, true); + } + ); + } +); + diff --git a/test/staging/sm/AsyncIterator/prototype/take/length.js b/test/staging/sm/AsyncIterator/prototype/take/length.js new file mode 100644 index 0000000000..226a6f4ad7 --- /dev/null +++ b/test/staging/sm/AsyncIterator/prototype/take/length.js @@ -0,0 +1,26 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +esid: pending +description: | + %AsyncIterator.prototype%.take length value and descriptor. +info: | + 17 ECMAScript Standard Built-in Objects +features: +- async-iteration +- iterator-helpers +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +---*/ +// + +assert.sameValue(AsyncIterator.prototype.take.length, 1); + +const propertyDescriptor = Reflect.getOwnPropertyDescriptor(AsyncIterator.prototype.take, 'length'); +assert.sameValue(propertyDescriptor.value, 1); +assert.sameValue(propertyDescriptor.enumerable, false); +assert.sameValue(propertyDescriptor.writable, false); +assert.sameValue(propertyDescriptor.configurable, true); + diff --git a/test/staging/sm/AsyncIterator/prototype/take/name.js b/test/staging/sm/AsyncIterator/prototype/take/name.js new file mode 100644 index 0000000000..0d28911acc --- /dev/null +++ b/test/staging/sm/AsyncIterator/prototype/take/name.js @@ -0,0 +1,24 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +esid: pending +description: | + %AsyncIterator.prototype%.take.name value and descriptor. +info: | + 17 ECMAScript Standard Built-in Objects +features: +- async-iteration +- iterator-helpers +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +---*/ +assert.sameValue(AsyncIterator.prototype.take.name, 'take'); + +const propertyDescriptor = Reflect.getOwnPropertyDescriptor(AsyncIterator.prototype.take, 'name'); +assert.sameValue(propertyDescriptor.value, 'take'); +assert.sameValue(propertyDescriptor.enumerable, false); +assert.sameValue(propertyDescriptor.writable, false); +assert.sameValue(propertyDescriptor.configurable, true); + diff --git a/test/staging/sm/AsyncIterator/prototype/take/take-more-than-available.js b/test/staging/sm/AsyncIterator/prototype/take/take-more-than-available.js new file mode 100644 index 0000000000..b53fadcffe --- /dev/null +++ b/test/staging/sm/AsyncIterator/prototype/take/take-more-than-available.js @@ -0,0 +1,38 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +esid: pending +description: | + %AsyncIterator.prototype%.take returns if the iterator is done. +info: | + Iterator Helpers proposal 2.1.6.4 2. Repeat, + ... + c. Let next be ? Await(? IteratorNext(iterated, lastValue)). + d. If ? IteratorComplete(next) is false, return undefined. +features: +- async-iteration +- iterator-helpers +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +---*/ + +// +// +async function* gen(values) { + yield* values; +} + +(async () => { + const iter = gen([1, 2]).take(10); + for (const expected of [1, 2]) { + const result = await iter.next(); + assert.sameValue(result.value, expected); + assert.sameValue(result.done, false); + } + const result = await iter.next(); + assert.sameValue(result.value, undefined); + assert.sameValue(result.done, true); +})(); + diff --git a/test/staging/sm/AsyncIterator/prototype/take/take.js b/test/staging/sm/AsyncIterator/prototype/take/take.js new file mode 100644 index 0000000000..6657f4d60a --- /dev/null +++ b/test/staging/sm/AsyncIterator/prototype/take/take.js @@ -0,0 +1,33 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +features: +- async-iteration +description: | + pending +esid: pending +---*/ + +async function* gen() { + yield 1; + yield 2; + yield 3; +} + +let iter = gen().take(2); + +for (const v of [1, 2]) { + iter.next().then( + ({done, value}) => { + assert.sameValue(done, false); + assert.sameValue(value, v); + } + ); +} + +iter.next().then(({done}) => assert.sameValue(done, true)); + diff --git a/test/staging/sm/AsyncIterator/prototype/toArray/async-writes.js b/test/staging/sm/AsyncIterator/prototype/toArray/async-writes.js new file mode 100644 index 0000000000..17c6851114 --- /dev/null +++ b/test/staging/sm/AsyncIterator/prototype/toArray/async-writes.js @@ -0,0 +1,30 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +features: +- async-iteration +description: | + pending +esid: pending +---*/ + +let x = {a: () => true}; + +async function* gen() { + yield x.a(); + yield x.a(); +} + +gen().toArray().then( + () => assert.sameValue(true, false, 'expected error'), + err => assert.sameValue(err instanceof Error, true), +); + +x.a = () => { + throw Error(); +}; + diff --git a/test/staging/sm/AsyncIterator/prototype/toArray/create-in-current-realm.js b/test/staging/sm/AsyncIterator/prototype/toArray/create-in-current-realm.js new file mode 100644 index 0000000000..f3adb5ed7c --- /dev/null +++ b/test/staging/sm/AsyncIterator/prototype/toArray/create-in-current-realm.js @@ -0,0 +1,32 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +features: +- async-iteration +description: | + pending +esid: pending +---*/ + +const otherGlobal = createNewGlobal({newCompartment: true}); + +async function* gen() { + yield 1; + yield 2; + yield 3; +} + +gen().toArray().then(array => { + assert.sameValue(array instanceof Array, true); + assert.sameValue(array instanceof otherGlobal.Array, false); +}); + +otherGlobal.AsyncIterator.prototype.toArray.call(gen()).then(array => { + assert.sameValue(array instanceof Array, false); + assert.sameValue(array instanceof otherGlobal.Array, true); +}); + diff --git a/test/staging/sm/AsyncIterator/prototype/toArray/descriptor.js b/test/staging/sm/AsyncIterator/prototype/toArray/descriptor.js new file mode 100644 index 0000000000..755dd5debf --- /dev/null +++ b/test/staging/sm/AsyncIterator/prototype/toArray/descriptor.js @@ -0,0 +1,21 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +info: | + Descriptor property of AsyncIterator.prototype.toArray +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +features: +- async-iteration +description: | + pending +esid: pending +---*/ +const propDesc = Reflect.getOwnPropertyDescriptor(AsyncIterator.prototype, 'toArray'); +assert.sameValue(typeof propDesc.value, 'function'); +assert.sameValue(propDesc.writable, true); +assert.sameValue(propDesc.enumerable, false); +assert.sameValue(propDesc.configurable, true); + diff --git a/test/staging/sm/AsyncIterator/prototype/toArray/interleaving-calls.js b/test/staging/sm/AsyncIterator/prototype/toArray/interleaving-calls.js new file mode 100644 index 0000000000..461f76f414 --- /dev/null +++ b/test/staging/sm/AsyncIterator/prototype/toArray/interleaving-calls.js @@ -0,0 +1,34 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +features: +- async-iteration +description: | + pending +esid: pending +---*/ + +const log = []; +async function* gen(n) { + log.push(`${n}`); + yield 1; + log.push(`${n}`); + yield 2; +} + +Promise.all([gen(1).toArray(), gen(2).toArray()]).then( + () => { + assert.sameValue( + log.join(' '), + '1 2 1 2', + ); + }, + err => { + throw err; + } +); + diff --git a/test/staging/sm/AsyncIterator/prototype/toArray/iterator-empty.js b/test/staging/sm/AsyncIterator/prototype/toArray/iterator-empty.js new file mode 100644 index 0000000000..82f511be9d --- /dev/null +++ b/test/staging/sm/AsyncIterator/prototype/toArray/iterator-empty.js @@ -0,0 +1,20 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +features: +- async-iteration +description: | + pending +esid: pending +---*/ + +async function* gen() {} +gen().toArray().then(array => { + assert.sameValue(Array.isArray(array), true); + assert.sameValue(array.length, 0); +}); + diff --git a/test/staging/sm/AsyncIterator/prototype/toArray/length.js b/test/staging/sm/AsyncIterator/prototype/toArray/length.js new file mode 100644 index 0000000000..2e108f6191 --- /dev/null +++ b/test/staging/sm/AsyncIterator/prototype/toArray/length.js @@ -0,0 +1,23 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +description: | + The `length` property of AsyncIterator.prototype.toArray. +info: | + ES7 section 17: Unless otherwise specified, the length property of a built-in + Function object has the attributes { [[Writable]]: false, [[Enumerable]]: + false, [[Configurable]]: true }. +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +features: +- async-iteration +esid: pending +---*/ +const propDesc = Reflect.getOwnPropertyDescriptor(AsyncIterator.prototype.toArray, 'length'); +assert.sameValue(propDesc.value, 0); +assert.sameValue(propDesc.writable, false); +assert.sameValue(propDesc.enumerable, false); +assert.sameValue(propDesc.configurable, true); + diff --git a/test/staging/sm/AsyncIterator/prototype/toArray/name.js b/test/staging/sm/AsyncIterator/prototype/toArray/name.js new file mode 100644 index 0000000000..c4a7ddee58 --- /dev/null +++ b/test/staging/sm/AsyncIterator/prototype/toArray/name.js @@ -0,0 +1,19 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +description: | + `name` property of AsyncIterator.prototype.toArray. +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +features: +- async-iteration +esid: pending +---*/ +const propDesc = Reflect.getOwnPropertyDescriptor(AsyncIterator.prototype.toArray, 'name'); +assert.sameValue(propDesc.value, 'toArray'); +assert.sameValue(propDesc.writable, false); +assert.sameValue(propDesc.enumerable, false); +assert.sameValue(propDesc.configurable, true); + diff --git a/test/staging/sm/AsyncIterator/prototype/toArray/next-throws.js b/test/staging/sm/AsyncIterator/prototype/toArray/next-throws.js new file mode 100644 index 0000000000..204eaca266 --- /dev/null +++ b/test/staging/sm/AsyncIterator/prototype/toArray/next-throws.js @@ -0,0 +1,33 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +features: +- async-iteration +description: | + pending +esid: pending +---*/ + +class TestIterator extends AsyncIterator { + next() { + throw new Error(); + } + + closed = false; + return() { + this.closed = true; + } +} + +const iter = new TestIterator(); + +assert.sameValue(iter.closed, false); +iter.toArray().then(() => assert.sameValue(true, false, 'expected error'), err => { + assert.sameValue(err instanceof Error, true); + assert.sameValue(iter.closed, false); +}); + diff --git a/test/staging/sm/AsyncIterator/prototype/toArray/proxy.js b/test/staging/sm/AsyncIterator/prototype/toArray/proxy.js new file mode 100644 index 0000000000..fdd46757dc --- /dev/null +++ b/test/staging/sm/AsyncIterator/prototype/toArray/proxy.js @@ -0,0 +1,54 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +features: +- async-iteration +description: | + pending +esid: pending +---*/ +// +// This test checks that %Iterator.prototype%.toArray only gets the `next` method off of the +// iterator once, and never accesses the @@iterator property. +const log = []; +const handlerProxy = new Proxy({}, { + get: (target, key, receiver) => (...args) => { + log.push(`${key}: ${args[1]?.toString()}`); + return Reflect[key](...args); + }, +}); + +class Counter extends AsyncIterator { + value = 0; + next() { + const value = this.value; + if (value < 2) { + this.value = value + 1; + return Promise.resolve({done: false, value}); + } + return Promise.resolve({done: true}); + } +} + +const iter = new Proxy(new Counter(), handlerProxy); +iter.toArray().then(() => { + assert.sameValue( + log.join('\n'), + `get: toArray +get: next +get: value +set: value +getOwnPropertyDescriptor: value +defineProperty: value +get: value +set: value +getOwnPropertyDescriptor: value +defineProperty: value +get: value` + ); +}); + diff --git a/test/staging/sm/AsyncIterator/prototype/toArray/this-not-iterator-throws.js b/test/staging/sm/AsyncIterator/prototype/toArray/this-not-iterator-throws.js new file mode 100644 index 0000000000..1c44a88308 --- /dev/null +++ b/test/staging/sm/AsyncIterator/prototype/toArray/this-not-iterator-throws.js @@ -0,0 +1,31 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +features: +- async-iteration +description: | + pending +esid: pending +---*/ + + +function check(x) { + AsyncIterator.prototype.toArray.call(x).then( + () => { + throw new Error('check should have been rejected'); + }, + err => { + assert.sameValue(err instanceof TypeError, true); + } + ); +} + +check(); +check(undefined); +check({}); +check({next: 0}); + diff --git a/test/staging/sm/AsyncIterator/prototype/toArray/toArray.js b/test/staging/sm/AsyncIterator/prototype/toArray/toArray.js new file mode 100644 index 0000000000..a215d8faeb --- /dev/null +++ b/test/staging/sm/AsyncIterator/prototype/toArray/toArray.js @@ -0,0 +1,32 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +features: +- async-iteration +description: | + pending +esid: pending +---*/ + +async function* gen() { + yield 1; + yield 2; + yield 3; +} +assert.sameValue(Array.isArray(gen()), false); + +gen().toArray().then(array => { + assert.sameValue(Array.isArray(array), true); + assert.sameValue(array.length, 3); + + const expected = [1, 2, 3]; + for (const item of array) { + const expect = expected.shift(); + assert.sameValue(item, expect); + } +}); + diff --git a/test/staging/sm/AsyncIterator/prototype/toArray/value-throws-iterator-not-closed.js b/test/staging/sm/AsyncIterator/prototype/toArray/value-throws-iterator-not-closed.js new file mode 100644 index 0000000000..ca57594e4c --- /dev/null +++ b/test/staging/sm/AsyncIterator/prototype/toArray/value-throws-iterator-not-closed.js @@ -0,0 +1,43 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +features: +- async-iteration +description: | + pending +esid: pending +---*/ + +class TestError extends Error {} +class TestIterator extends AsyncIterator { + next() { + return Promise.resolve({ + done: false, + get value() { + throw new TestError(); + } + }); + } + + closed = false; + return() { + closed = true; + } +} + +const iterator = new TestIterator(); +assert.sameValue(iterator.closed, false, 'iterator starts unclosed'); +iterator.toArray().then( + () => { + throw new Error('toArray should have thrown'); + }, + err => { + assert.sameValue(err instanceof TestError, true); + assert.sameValue(iterator.closed, false, 'iterator remains unclosed'); + } +); + diff --git a/test/staging/sm/Atomics/cross-compartment.js b/test/staging/sm/Atomics/cross-compartment.js new file mode 100644 index 0000000000..ea92192357 --- /dev/null +++ b/test/staging/sm/Atomics/cross-compartment.js @@ -0,0 +1,117 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ + +const otherGlobal = createNewGlobal(); + +const intArrayConstructors = [ + otherGlobal.Int32Array, + otherGlobal.Int16Array, + otherGlobal.Int8Array, + otherGlobal.Uint32Array, + otherGlobal.Uint16Array, + otherGlobal.Uint8Array, +]; + +// Atomics.load +for (let TA of intArrayConstructors) { + let ta = new TA(new otherGlobal.SharedArrayBuffer(4)); + ta[0] = 1; + + assert.sameValue(Atomics.load(ta, 0), 1); +} + +// Atomics.store +for (let TA of intArrayConstructors) { + let ta = new TA(new otherGlobal.SharedArrayBuffer(4)); + + Atomics.store(ta, 0, 1); + + assert.sameValue(ta[0], 1); +} + +// Atomics.compareExchange +for (let TA of intArrayConstructors) { + let ta = new TA(new otherGlobal.SharedArrayBuffer(4)); + ta[0] = 1; + + let val = Atomics.compareExchange(ta, 0, 1, 2); + + assert.sameValue(val, 1); + assert.sameValue(ta[0], 2); +} + +// Atomics.exchange +for (let TA of intArrayConstructors) { + let ta = new TA(new otherGlobal.SharedArrayBuffer(4)); + ta[0] = 1; + + let val = Atomics.exchange(ta, 0, 2); + + assert.sameValue(val, 1); + assert.sameValue(ta[0], 2); +} + +// Atomics.add +for (let TA of intArrayConstructors) { + let ta = new TA(new otherGlobal.SharedArrayBuffer(4)); + ta[0] = 1; + + let val = Atomics.add(ta, 0, 2); + + assert.sameValue(val, 1); + assert.sameValue(ta[0], 3); +} + +// Atomics.sub +for (let TA of intArrayConstructors) { + let ta = new TA(new otherGlobal.SharedArrayBuffer(4)); + ta[0] = 3; + + let val = Atomics.sub(ta, 0, 2); + + assert.sameValue(val, 3); + assert.sameValue(ta[0], 1); +} + +// Atomics.and +for (let TA of intArrayConstructors) { + let ta = new TA(new otherGlobal.SharedArrayBuffer(4)); + ta[0] = 3; + + let val = Atomics.and(ta, 0, 1); + + assert.sameValue(val, 3); + assert.sameValue(ta[0], 1); +} + +// Atomics.or +for (let TA of intArrayConstructors) { + let ta = new TA(new otherGlobal.SharedArrayBuffer(4)); + ta[0] = 2; + + let val = Atomics.or(ta, 0, 1); + + assert.sameValue(val, 2); + assert.sameValue(ta[0], 3); +} + +// Atomics.xor +for (let TA of intArrayConstructors) { + let ta = new TA(new otherGlobal.SharedArrayBuffer(4)); + ta[0] = 3; + + let val = Atomics.xor(ta, 0, 1); + + assert.sameValue(val, 3); + assert.sameValue(ta[0], 2); +} + diff --git a/test/staging/sm/Atomics/detached-buffers.js b/test/staging/sm/Atomics/detached-buffers.js new file mode 100644 index 0000000000..cdfeafcf99 --- /dev/null +++ b/test/staging/sm/Atomics/detached-buffers.js @@ -0,0 +1,102 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ + +const intArrayConstructors = [ + Int32Array, + Int16Array, + Int8Array, + Uint32Array, + Uint16Array, + Uint8Array, +]; + +function badValue(ta) { + return { + valueOf() { + $262.detachArrayBuffer(ta.buffer); + return 0; + } + }; +} + +// Atomics.load +for (let TA of intArrayConstructors) { + let ta = new TA(1); + + assertThrowsInstanceOf(() => Atomics.load(ta, badValue(ta)), TypeError); +} + +// Atomics.store +for (let TA of intArrayConstructors) { + let ta = new TA(1); + + assertThrowsInstanceOf(() => Atomics.store(ta, badValue(ta), 0), TypeError); + assertThrowsInstanceOf(() => Atomics.store(ta, 0, badValue(ta)), TypeError); +} + +// Atomics.compareExchange +for (let TA of intArrayConstructors) { + let ta = new TA(1); + + assertThrowsInstanceOf(() => Atomics.compareExchange(ta, badValue(ta), 0, 0), TypeError); + assertThrowsInstanceOf(() => Atomics.compareExchange(ta, 0, badValue(ta), 0), TypeError); + assertThrowsInstanceOf(() => Atomics.compareExchange(ta, 0, 0, badValue(ta)), TypeError); +} + +// Atomics.exchange +for (let TA of intArrayConstructors) { + let ta = new TA(1); + + assertThrowsInstanceOf(() => Atomics.exchange(ta, badValue(ta), 0), TypeError); + assertThrowsInstanceOf(() => Atomics.exchange(ta, 0, badValue(ta)), TypeError); +} + +// Atomics.add +for (let TA of intArrayConstructors) { + let ta = new TA(1); + + assertThrowsInstanceOf(() => Atomics.add(ta, badValue(ta), 0), TypeError); + assertThrowsInstanceOf(() => Atomics.add(ta, 0, badValue(ta)), TypeError); +} + +// Atomics.sub +for (let TA of intArrayConstructors) { + let ta = new TA(1); + + assertThrowsInstanceOf(() => Atomics.sub(ta, badValue(ta), 0), TypeError); + assertThrowsInstanceOf(() => Atomics.sub(ta, 0, badValue(ta)), TypeError); +} + +// Atomics.and +for (let TA of intArrayConstructors) { + let ta = new TA(1); + + assertThrowsInstanceOf(() => Atomics.and(ta, badValue(ta), 0), TypeError); + assertThrowsInstanceOf(() => Atomics.and(ta, 0, badValue(ta)), TypeError); +} + +// Atomics.or +for (let TA of intArrayConstructors) { + let ta = new TA(1); + + assertThrowsInstanceOf(() => Atomics.or(ta, badValue(ta), 0), TypeError); + assertThrowsInstanceOf(() => Atomics.or(ta, 0, badValue(ta)), TypeError); +} + +// Atomics.xor +for (let TA of intArrayConstructors) { + let ta = new TA(1); + + assertThrowsInstanceOf(() => Atomics.xor(ta, badValue(ta), 0), TypeError); + assertThrowsInstanceOf(() => Atomics.xor(ta, 0, badValue(ta)), TypeError); +} + diff --git a/test/staging/sm/BigInt/Number-conversion-rounding.js b/test/staging/sm/BigInt/Number-conversion-rounding.js new file mode 100644 index 0000000000..9b0155b167 --- /dev/null +++ b/test/staging/sm/BigInt/Number-conversion-rounding.js @@ -0,0 +1,253 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +// Any copyright is dedicated to the Public Domain. +// https://creativecommons.org/licenses/publicdomain/ + +/** + * Edge-case behavior at Number.MAX_VALUE and beyond til overflow to Infinity. + */ +function maxMagnitudeTests(isNegative) +{ + var sign = isNegative ? -1 : +1; + var signBigInt = isNegative ? -1n : 1n; + + const MAX_VALUE = isNegative ? -Number.MAX_VALUE : +Number.MAX_VALUE; + + // 2**971+2**972+...+2**1022+2**1023 + var maxMagnitudeNumber = 0; + for (let i = 971; i < 1024; i++) + maxMagnitudeNumber += 2**i; + maxMagnitudeNumber *= sign; + assert.sameValue(maxMagnitudeNumber, MAX_VALUE); + + // 2**971+2**972+...+2**1022+2**1023 + var maxMagnitudeNumberAsBigInt = 0n; + for (let i = 971n; i < 1024n; i++) + maxMagnitudeNumberAsBigInt += 2n**i; + maxMagnitudeNumberAsBigInt *= signBigInt; + var expectedMaxMagnitude = isNegative + ? -(2n**1024n) + 2n**971n + : 2n**1024n - 2n**971n; + assert.sameValue(maxMagnitudeNumberAsBigInt, expectedMaxMagnitude); + + // Initial sanity tests. + assert.sameValue(BigInt(maxMagnitudeNumber), maxMagnitudeNumberAsBigInt); + assert.sameValue(maxMagnitudeNumber, Number(maxMagnitudeNumberAsBigInt)); + + // Test conversion of BigInt values above Number.MAX_VALUE. + assert.sameValue(Number(maxMagnitudeNumberAsBigInt + signBigInt * 1n), MAX_VALUE); + assert.sameValue(Number(maxMagnitudeNumberAsBigInt + signBigInt * 2n), MAX_VALUE); + assert.sameValue(Number(maxMagnitudeNumberAsBigInt + signBigInt * 3n), MAX_VALUE); + assert.sameValue(Number(maxMagnitudeNumberAsBigInt + signBigInt * 4n), MAX_VALUE); + assert.sameValue(Number(maxMagnitudeNumberAsBigInt + signBigInt * 5n), MAX_VALUE); + assert.sameValue(Number(maxMagnitudeNumberAsBigInt + signBigInt * 6n), MAX_VALUE); + assert.sameValue(Number(maxMagnitudeNumberAsBigInt + signBigInt * 7n), MAX_VALUE); + assert.sameValue(Number(maxMagnitudeNumberAsBigInt + signBigInt * 8n), MAX_VALUE); + assert.sameValue(Number(maxMagnitudeNumberAsBigInt + signBigInt * 9n), MAX_VALUE); + assert.sameValue(Number(maxMagnitudeNumberAsBigInt + signBigInt * 2n**20n), MAX_VALUE); + assert.sameValue(Number(maxMagnitudeNumberAsBigInt + signBigInt * 2n**400n), MAX_VALUE); + assert.sameValue(Number(maxMagnitudeNumberAsBigInt + signBigInt * 2n**800n), MAX_VALUE); + assert.sameValue(Number(maxMagnitudeNumberAsBigInt + signBigInt * 2n**900n), MAX_VALUE); + assert.sameValue(Number(maxMagnitudeNumberAsBigInt + signBigInt * 2n**969n), MAX_VALUE); + + // For conversion purposes, rounding for values above Number.MAX_VALUE do + // rounding with respect to Number.MAX_VALUE and 2**1024 (which is treated as + // the "even" value -- so if the value to convert lies halfway between those two + // values, 2**1024 is selected). But if 2**1024 is the value that *would* have + // been chosen by this process, Infinity is substituted. + assert.sameValue(Number(maxMagnitudeNumberAsBigInt + signBigInt * (2n**970n - 1n)), MAX_VALUE); + assert.sameValue(Number(maxMagnitudeNumberAsBigInt + signBigInt * 2n**970n), sign * Infinity); +} +maxMagnitudeTests(false); +maxMagnitudeTests(true); + +/** + * Simple single-Digit on x64, double-Digit on x86 tests. + */ + +assert.sameValue(BigInt(Number(2n**53n - 2n)), 2n**53n - 2n); +assert.sameValue(BigInt(Number(2n**53n - 1n)), 2n**53n - 1n); +assert.sameValue(BigInt(Number(2n**53n)), 2n**53n); +assert.sameValue(BigInt(Number(2n**53n + 1n)), 2n**53n); +assert.sameValue(BigInt(Number(2n**53n + 2n)), 2n**53n + 2n); +assert.sameValue(BigInt(Number(2n**53n + 3n)), 2n**53n + 4n); +assert.sameValue(BigInt(Number(2n**53n + 4n)), 2n**53n + 4n); +assert.sameValue(BigInt(Number(2n**53n + 5n)), 2n**53n + 4n); +assert.sameValue(BigInt(Number(2n**53n + 6n)), 2n**53n + 6n); +assert.sameValue(BigInt(Number(2n**53n + 7n)), 2n**53n + 8n); +assert.sameValue(BigInt(Number(2n**53n + 8n)), 2n**53n + 8n); + +assert.sameValue(BigInt(Number(2n**54n - 4n)), 2n**54n - 4n); +assert.sameValue(BigInt(Number(2n**54n - 3n)), 2n**54n - 4n); +assert.sameValue(BigInt(Number(2n**54n - 2n)), 2n**54n - 2n); +assert.sameValue(BigInt(Number(2n**54n - 1n)), 2n**54n); +assert.sameValue(BigInt(Number(2n**54n)), 2n**54n); +assert.sameValue(BigInt(Number(2n**54n + 1n)), 2n**54n); +assert.sameValue(BigInt(Number(2n**54n + 2n)), 2n**54n); +assert.sameValue(BigInt(Number(2n**54n + 3n)), 2n**54n + 4n); +assert.sameValue(BigInt(Number(2n**54n + 4n)), 2n**54n + 4n); +assert.sameValue(BigInt(Number(2n**54n + 5n)), 2n**54n + 4n); +assert.sameValue(BigInt(Number(2n**54n + 6n)), 2n**54n + 8n); +assert.sameValue(BigInt(Number(2n**54n + 7n)), 2n**54n + 8n); +assert.sameValue(BigInt(Number(2n**54n + 8n)), 2n**54n + 8n); + +assert.sameValue(BigInt(Number(2n**55n - 8n)), 2n**55n - 8n); +assert.sameValue(BigInt(Number(2n**55n - 7n)), 2n**55n - 8n); +assert.sameValue(BigInt(Number(2n**55n - 6n)), 2n**55n - 8n); +assert.sameValue(BigInt(Number(2n**55n - 5n)), 2n**55n - 4n); +assert.sameValue(BigInt(Number(2n**55n - 4n)), 2n**55n - 4n); +assert.sameValue(BigInt(Number(2n**55n - 3n)), 2n**55n - 4n); +assert.sameValue(BigInt(Number(2n**55n - 2n)), 2n**55n); +assert.sameValue(BigInt(Number(2n**55n - 1n)), 2n**55n); +assert.sameValue(BigInt(Number(2n**55n)), 2n**55n); +assert.sameValue(BigInt(Number(2n**55n + 1n)), 2n**55n); +assert.sameValue(BigInt(Number(2n**55n + 2n)), 2n**55n); +assert.sameValue(BigInt(Number(2n**55n + 3n)), 2n**55n); +assert.sameValue(BigInt(Number(2n**55n + 4n)), 2n**55n); +assert.sameValue(BigInt(Number(2n**55n + 5n)), 2n**55n + 8n); +assert.sameValue(BigInt(Number(2n**55n + 6n)), 2n**55n + 8n); +assert.sameValue(BigInt(Number(2n**55n + 7n)), 2n**55n + 8n); +assert.sameValue(BigInt(Number(2n**55n + 8n)), 2n**55n + 8n); +assert.sameValue(BigInt(Number(2n**55n + 9n)), 2n**55n + 8n); +assert.sameValue(BigInt(Number(2n**55n + 10n)), 2n**55n + 8n); +assert.sameValue(BigInt(Number(2n**55n + 11n)), 2n**55n + 8n); +assert.sameValue(BigInt(Number(2n**55n + 12n)), 2n**55n + 16n); +assert.sameValue(BigInt(Number(2n**55n + 13n)), 2n**55n + 16n); +assert.sameValue(BigInt(Number(2n**55n + 14n)), 2n**55n + 16n); +assert.sameValue(BigInt(Number(2n**55n + 15n)), 2n**55n + 16n); +assert.sameValue(BigInt(Number(2n**55n + 16n)), 2n**55n + 16n); + + +/** + * Simple double-Digit on x64, triple-Digit on x86 tests. + */ + +// The tests below that aren't subtracting bits will have no bits in the +// ultimate significand from the most-significant digit (because of the implicit +// one being excluded). +assert.sameValue(BigInt(Number(2n**64n - 2n**11n)), 2n**64n - 2n**11n); +assert.sameValue(BigInt(Number(2n**64n - 2n**11n + 2n**10n - 1n)), 2n**64n - 2n**11n); +assert.sameValue(BigInt(Number(2n**64n - 2n**11n + 2n**10n)), 2n**64n); +assert.sameValue(BigInt(Number(2n**64n - 2n**10n)), 2n**64n); +assert.sameValue(BigInt(Number(2n**64n)), 2n**64n); +assert.sameValue(BigInt(Number(2n**64n + 1n)), 2n**64n); +assert.sameValue(BigInt(Number(2n**64n + 2n**5n)), 2n**64n); +assert.sameValue(BigInt(Number(2n**64n + 2n**10n)), 2n**64n); +assert.sameValue(BigInt(Number(2n**64n + 2n**11n)), 2n**64n); +assert.sameValue(BigInt(Number(2n**64n + 2n**11n + 1n)), 2n**64n + 2n**12n); +assert.sameValue(BigInt(Number(2n**64n + 2n**12n)), 2n**64n + 2n**12n); +assert.sameValue(BigInt(Number(2n**64n + 2n**12n + 1n)), 2n**64n + 2n**12n); +assert.sameValue(BigInt(Number(2n**64n + 2n**12n + 2n**5n)), 2n**64n + 2n**12n); +assert.sameValue(BigInt(Number(2n**64n + 2n**12n + 2n**10n)), 2n**64n + 2n**12n); +assert.sameValue(BigInt(Number(2n**64n + 2n**12n + 2n**11n - 1n)), 2n**64n + 2n**12n); +assert.sameValue(BigInt(Number(2n**64n + 2n**12n + 2n**11n)), 2n**64n + 2n**13n); +assert.sameValue(BigInt(Number(2n**64n + 2n**12n + 2n**11n + 1n)), 2n**64n + 2n**13n); + +// These tests *will* have a bit from the most-significant digit in the ultimate +// significand. +assert.sameValue(BigInt(Number(2n**65n - 2n**12n)), 2n**65n - 2n**12n); +assert.sameValue(BigInt(Number(2n**65n - 2n**12n + 2n**11n - 1n)), 2n**65n - 2n**12n); +assert.sameValue(BigInt(Number(2n**65n - 2n**12n + 2n**11n)), 2n**65n); +assert.sameValue(BigInt(Number(2n**65n - 2n**11n)), 2n**65n); +assert.sameValue(BigInt(Number(2n**65n)), 2n**65n); +assert.sameValue(BigInt(Number(2n**65n + 1n)), 2n**65n); +assert.sameValue(BigInt(Number(2n**65n + 2n**5n)), 2n**65n); +assert.sameValue(BigInt(Number(2n**65n + 2n**11n)), 2n**65n); +assert.sameValue(BigInt(Number(2n**65n + 2n**12n)), 2n**65n); +assert.sameValue(BigInt(Number(2n**65n + 2n**12n + 1n)), 2n**65n + 2n**13n); +assert.sameValue(BigInt(Number(2n**65n + 2n**13n)), 2n**65n + 2n**13n); +assert.sameValue(BigInt(Number(2n**65n + 2n**13n + 1n)), 2n**65n + 2n**13n); +assert.sameValue(BigInt(Number(2n**65n + 2n**13n + 2n**5n)), 2n**65n + 2n**13n); +assert.sameValue(BigInt(Number(2n**65n + 2n**13n + 2n**11n)), 2n**65n + 2n**13n); +assert.sameValue(BigInt(Number(2n**65n + 2n**13n + 2n**12n - 1n)), 2n**65n + 2n**13n); +assert.sameValue(BigInt(Number(2n**65n + 2n**13n + 2n**12n)), 2n**65n + 2n**14n); +assert.sameValue(BigInt(Number(2n**65n + 2n**13n + 2n**12n + 1n)), 2n**65n + 2n**14n); + +// ...and in these tests, the contributed bit from the most-significant digit +// is additionally nonzero. +assert.sameValue(BigInt(Number(2n**65n + 2n**64n)), 2n**65n + 2n**64n); +assert.sameValue(BigInt(Number(2n**65n + 2n**64n + 1n)), 2n**65n + 2n**64n); +assert.sameValue(BigInt(Number(2n**65n + 2n**64n + 2n**5n)), 2n**65n + 2n**64n); +assert.sameValue(BigInt(Number(2n**65n + 2n**64n + 2n**11n)), 2n**65n + 2n**64n); +assert.sameValue(BigInt(Number(2n**65n + 2n**64n + 2n**12n)), 2n**65n + 2n**64n); +assert.sameValue(BigInt(Number(2n**65n + 2n**64n + 2n**12n + 1n)), 2n**65n + 2n**64n + 2n**13n); +assert.sameValue(BigInt(Number(2n**65n + 2n**64n + 2n**13n)), 2n**65n + 2n**64n + 2n**13n); +assert.sameValue(BigInt(Number(2n**65n + 2n**64n + 2n**13n + 1n)), 2n**65n + 2n**64n + 2n**13n); +assert.sameValue(BigInt(Number(2n**65n + 2n**64n + 2n**13n + 2n**5n)), 2n**65n + 2n**64n + 2n**13n); +assert.sameValue(BigInt(Number(2n**65n + 2n**64n + 2n**13n + 2n**11n)), 2n**65n + 2n**64n + 2n**13n); +assert.sameValue(BigInt(Number(2n**65n + 2n**64n + 2n**13n + 2n**12n - 1n)), 2n**65n + 2n**64n + 2n**13n); +assert.sameValue(BigInt(Number(2n**65n + 2n**64n + 2n**13n + 2n**12n)), 2n**65n + 2n**64n + 2n**14n); +assert.sameValue(BigInt(Number(2n**65n + 2n**64n + 2n**13n + 2n**12n + 1n)), 2n**65n + 2n**64n + 2n**14n); + +/** + * Versions of the testing above with all the high-order bits massively bumped + * upward to test that super-low bits, not just bits in high digits, are + * properly accounted for in rounding. + */ + +// The tests below that aren't subtracting bits will have no bits in the +// ultimate significand from the most-significant digit (because of the implicit +// one being excluded). +assert.sameValue(BigInt(Number(2n**940n - 2n**887n + 1n)), 2n**940n - 2n**887n); +assert.sameValue(BigInt(Number(2n**940n - 2n**887n + 2n**886n - 1n)), 2n**940n - 2n**887n); +assert.sameValue(BigInt(Number(2n**940n - 2n**887n + 2n**886n)), 2n**940n); +assert.sameValue(BigInt(Number(2n**940n - 2n**886n)), 2n**940n); +assert.sameValue(BigInt(Number(2n**940n)), 2n**940n); +assert.sameValue(BigInt(Number(2n**940n + 1n)), 2n**940n); +assert.sameValue(BigInt(Number(2n**940n + 2n**880n)), 2n**940n); +assert.sameValue(BigInt(Number(2n**940n + 2n**885n)), 2n**940n); +assert.sameValue(BigInt(Number(2n**940n + 2n**887n)), 2n**940n); +assert.sameValue(BigInt(Number(2n**940n + 2n**887n + 1n)), 2n**940n + 2n**888n); +assert.sameValue(BigInt(Number(2n**940n + 2n**888n)), 2n**940n + 2n**888n); +assert.sameValue(BigInt(Number(2n**940n + 2n**888n + 1n)), 2n**940n + 2n**888n); +assert.sameValue(BigInt(Number(2n**940n + 2n**888n + 2n**5n)), 2n**940n + 2n**888n); +assert.sameValue(BigInt(Number(2n**940n + 2n**888n + 2n**12n)), 2n**940n + 2n**888n); +assert.sameValue(BigInt(Number(2n**940n + 2n**888n + 2n**887n - 1n)), 2n**940n + 2n**888n); +assert.sameValue(BigInt(Number(2n**940n + 2n**888n + 2n**887n)), 2n**940n + 2n**889n); +assert.sameValue(BigInt(Number(2n**940n + 2n**888n + 2n**887n + 1n)), 2n**940n + 2n**889n); + +// These tests *will* have a bit from the most-significant digit in the ultimate +// significand. +assert.sameValue(BigInt(Number(2n**941n - 2n**888n)), 2n**941n - 2n**888n); +assert.sameValue(BigInt(Number(2n**941n - 2n**888n + 2n**887n - 1n)), 2n**941n - 2n**888n); +assert.sameValue(BigInt(Number(2n**941n - 2n**888n + 2n**887n)), 2n**941n); +assert.sameValue(BigInt(Number(2n**941n - 2n**887n)), 2n**941n); +assert.sameValue(BigInt(Number(2n**941n)), 2n**941n); +assert.sameValue(BigInt(Number(2n**941n + 1n)), 2n**941n); +assert.sameValue(BigInt(Number(2n**941n + 2n**881n)), 2n**941n); +assert.sameValue(BigInt(Number(2n**941n + 2n**886n)), 2n**941n); +assert.sameValue(BigInt(Number(2n**941n + 2n**888n)), 2n**941n); +assert.sameValue(BigInt(Number(2n**941n + 2n**888n + 1n)), 2n**941n + 2n**889n); +assert.sameValue(BigInt(Number(2n**941n + 2n**889n)), 2n**941n + 2n**889n); +assert.sameValue(BigInt(Number(2n**941n + 2n**889n + 1n)), 2n**941n + 2n**889n); +assert.sameValue(BigInt(Number(2n**941n + 2n**889n + 2n**5n)), 2n**941n + 2n**889n); +assert.sameValue(BigInt(Number(2n**941n + 2n**889n + 2n**12n)), 2n**941n + 2n**889n); +assert.sameValue(BigInt(Number(2n**941n + 2n**889n + 2n**888n - 1n)), 2n**941n + 2n**889n); +assert.sameValue(BigInt(Number(2n**941n + 2n**889n + 2n**888n)), 2n**941n + 2n**890n); +assert.sameValue(BigInt(Number(2n**941n + 2n**889n + 2n**888n + 1n)), 2n**941n + 2n**890n); + +// ...and in these tests, the contributed bit from the most-significant digit +// is additionally nonzero. +assert.sameValue(BigInt(Number(2n**941n + 2n**940n)), 2n**941n + 2n**940n); +assert.sameValue(BigInt(Number(2n**941n + 2n**940n + 1n)), 2n**941n + 2n**940n); +assert.sameValue(BigInt(Number(2n**941n + 2n**940n + 2n**881n)), 2n**941n + 2n**940n); +assert.sameValue(BigInt(Number(2n**941n + 2n**940n + 2n**886n)), 2n**941n + 2n**940n); +assert.sameValue(BigInt(Number(2n**941n + 2n**940n + 2n**888n)), 2n**941n + 2n**940n); +assert.sameValue(BigInt(Number(2n**941n + 2n**940n + 2n**888n + 1n)), 2n**941n + 2n**940n + 2n**889n); +assert.sameValue(BigInt(Number(2n**941n + 2n**940n + 2n**889n)), 2n**941n + 2n**940n + 2n**889n); +assert.sameValue(BigInt(Number(2n**941n + 2n**940n + 2n**889n + 1n)), 2n**941n + 2n**940n + 2n**889n); +assert.sameValue(BigInt(Number(2n**941n + 2n**940n + 2n**889n + 2n**5n)), 2n**941n + 2n**940n + 2n**889n); +assert.sameValue(BigInt(Number(2n**941n + 2n**940n + 2n**889n + 2n**12n)), 2n**941n + 2n**940n + 2n**889n); +assert.sameValue(BigInt(Number(2n**941n + 2n**940n + 2n**889n + 2n**888n - 1n)), 2n**941n + 2n**940n + 2n**889n); +assert.sameValue(BigInt(Number(2n**941n + 2n**940n + 2n**889n + 2n**888n)), 2n**941n + 2n**940n + 2n**890n); +assert.sameValue(BigInt(Number(2n**941n + 2n**940n + 2n**889n + 2n**888n + 1n)), 2n**941n + 2n**940n + 2n**890n); + diff --git a/test/staging/sm/BigInt/decimal.js b/test/staging/sm/BigInt/decimal.js new file mode 100644 index 0000000000..acbdce00b0 --- /dev/null +++ b/test/staging/sm/BigInt/decimal.js @@ -0,0 +1,40 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +// Any copyright is dedicated to the Public Domain. +// https://creativecommons.org/licenses/publicdomain/ + +// Check base-10 BigInt string conversion +const decimalTests = [ + [32n, -1n, 1n, "4294967295"], + [32n, -1n, -1n, "-4294967295"], + [32n, 0n, 1n, "4294967296"], + [32n, 0n, -1n, "-4294967296"], + [32n, 1n, 1n, "4294967297"], + [32n, 1n, -1n, "-4294967297"], + [64n, -1n, 1n, "18446744073709551615"], + [64n, -1n, -1n, "-18446744073709551615"], + [64n, 0n, 1n, "18446744073709551616"], + [64n, 0n, -1n, "-18446744073709551616"], + [64n, 1n, 1n, "18446744073709551617"], + [64n, 1n, -1n, "-18446744073709551617"], + [128n, -1n, 1n, "340282366920938463463374607431768211455"], + [128n, -1n, -1n, "-340282366920938463463374607431768211455"], + [128n, 0n, 1n, "340282366920938463463374607431768211456"], + [128n, 0n, -1n, "-340282366920938463463374607431768211456"], + [128n, 1n, 1n, "340282366920938463463374607431768211457"], + [128n, 1n, -1n, "-340282366920938463463374607431768211457"], +]; +for (const [power, offset, sign, result] of decimalTests) { + assert.sameValue(((2n**power+offset)*sign).toString(), + result); +} + diff --git a/test/staging/sm/BigInt/large-bit-length.js b/test/staging/sm/BigInt/large-bit-length.js new file mode 100644 index 0000000000..64479a92d0 --- /dev/null +++ b/test/staging/sm/BigInt/large-bit-length.js @@ -0,0 +1,43 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +// Any copyright is dedicated to the Public Domain. +// https://creativecommons.org/licenses/publicdomain/ + +function test(thunk, result) { + let val, err; + try { + val = thunk(); + } catch (e) { + err = e; + } + if (err) { + assert.sameValue(err instanceof RangeError, true); + } else { + assert.sameValue(val, result); + } +} + +const UINT32_MAX = 2**32-1; + +// Check that BigInt.asIntN and BigInt.asUintN either return correct results or +// throw RangeErrors for large |bits| arguments. GMP uses a type equivalent to +// 'unsigned long' for bit counts, which may be too small to represent all JS +// integer indexes. +for (let bits of [UINT32_MAX-1, UINT32_MAX, UINT32_MAX+1, Number.MAX_SAFE_INTEGER]) { + test(() => BigInt.asIntN(bits, 1n), 1n); + test(() => BigInt.asIntN(bits, 0n), 0n); + test(() => BigInt.asIntN(bits, -1n), -1n); + test(() => BigInt.asUintN(bits, 1n), 1n); + test(() => BigInt.asUintN(bits, 0n), 0n); + // Skip testing asUintN with negative BigInts since it could OOM. +} + diff --git a/test/staging/sm/BigInt/mod.js b/test/staging/sm/BigInt/mod.js new file mode 100644 index 0000000000..d9a3015f26 --- /dev/null +++ b/test/staging/sm/BigInt/mod.js @@ -0,0 +1,18 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +// Any copyright is dedicated to the Public Domain. +// https://creativecommons.org/licenses/publicdomain/ + +// Check that |x % x| returns zero when |x| contains multiple digits +assert.sameValue(0x10000000000000000n % 0x10000000000000000n, 0n); +assert.sameValue(-0x10000000000000000n % -0x10000000000000000n, 0n); + diff --git a/test/staging/sm/BigInt/property-name.js b/test/staging/sm/BigInt/property-name.js new file mode 100644 index 0000000000..7cef596427 --- /dev/null +++ b/test/staging/sm/BigInt/property-name.js @@ -0,0 +1,203 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [compareArray.js, sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +// BigInt literals as property keys. +{ + let o = { + 0n: "0", + 1n: "1", + + // 2**31 + 2147483647n: "2^31-1", + 2147483648n: "2^31", + 2147483649n: "2^31+1", + + // 2**32 + 4294967295n: "2^32-1", + 4294967296n: "2^32", + 4294967297n: "2^32+1", + + // 2n**63n + 9223372036854775807n: "2^63-1", + 9223372036854775808n: "2^63", + 9223372036854775809n: "2^63+1", + + // 2n**64n + 18446744073709551615n: "2^64-1", + 18446744073709551616n: "2^64", + 18446744073709551617n: "2^64+1", + }; + + assert.sameValue(o[0], "0"); + assert.sameValue(o[1], "1"); + + assert.sameValue(o[2147483647], "2^31-1"); + assert.sameValue(o[2147483648], "2^31"); + assert.sameValue(o[2147483649], "2^31+1"); + + assert.sameValue(o[4294967295], "2^32-1"); + assert.sameValue(o[4294967296], "2^32"); + assert.sameValue(o[4294967297], "2^32+1"); + + assert.sameValue(o["9223372036854775807"], "2^63-1"); + assert.sameValue(o["9223372036854775808"], "2^63"); + assert.sameValue(o["9223372036854775809"], "2^63+1"); + + assert.sameValue(o["18446744073709551615"], "2^64-1"); + assert.sameValue(o["18446744073709551616"], "2^64"); + assert.sameValue(o["18446744073709551617"], "2^64+1"); +} + +// With non-decimal different base. +{ + let o = { + 0b1n: "1", + 0o2n: "2", + 0x3n: "3", + }; + + assert.sameValue(o[1], "1"); + assert.sameValue(o[2], "2"); + assert.sameValue(o[3], "3"); +} + +// With numeric separators. +{ + let o = { + 1_2_3n: "123", + }; + + assert.sameValue(o[123], "123"); +} + +// BigInt literals as method property names. +{ + let o = { + 1n() {}, + *2n() {}, + async 3n() {}, + async* 4n() {}, + get 5n() {}, + set 6n(x) {}, + }; + + assert.compareArray(Object.getOwnPropertyNames(o), [ + "1", "2", "3", "4", "5", "6", + ]); + + assert.sameValue(o[1].name, "1"); + assert.sameValue(o[2].name, "2"); + assert.sameValue(o[3].name, "3"); + assert.sameValue(o[4].name, "4"); + assert.sameValue(Object.getOwnPropertyDescriptor(o, 5).get.name, "get 5"); + assert.sameValue(Object.getOwnPropertyDescriptor(o, 6).set.name, "set 6"); +} + +// BigInt literals as class method property names. +{ + class C { + 1n() {} + *2n() {} + async 3n() {} + async* 4n() {} + get 5n() {} + set 6n(x) {} + } + let o = C.prototype; + + assert.compareArray(Object.getOwnPropertyNames(o), [ + "1", "2", "3", "4", "5", "6", + "constructor", + ]); + + assert.sameValue(o[1].name, "1"); + assert.sameValue(o[2].name, "2"); + assert.sameValue(o[3].name, "3"); + assert.sameValue(o[4].name, "4"); + assert.sameValue(Object.getOwnPropertyDescriptor(o, 5).get.name, "get 5"); + assert.sameValue(Object.getOwnPropertyDescriptor(o, 6).set.name, "set 6"); +} + +// BigInt literals as static class method property names. +{ + class C { + static 1n() {} + static *2n() {} + static async 3n() {} + static async* 4n() {} + static get 5n() {} + static set 6n(x) {} + } + let o = C; + + // NB: Sort names because lazily resolved "length" and "name" properties are + // inserted in the wrong order. + assert.compareArray(Object.getOwnPropertyNames(o).sort(), [ + "1", "2", "3", "4", "5", "6", + "length", "name", "prototype", + ]); + + assert.sameValue(o[1].name, "1"); + assert.sameValue(o[2].name, "2"); + assert.sameValue(o[3].name, "3"); + assert.sameValue(o[4].name, "4"); + assert.sameValue(Object.getOwnPropertyDescriptor(o, 5).get.name, "get 5"); + assert.sameValue(Object.getOwnPropertyDescriptor(o, 6).set.name, "set 6"); +} + +// BigInt literals as class field property names. +{ + let o = new class { + 1n; + 2n = "ok"; + }; + + assert.sameValue(o[1], undefined); + assert.sameValue(o[2], "ok"); +} + +// In binding destructuring contexts. +{ + let {0n: a} = ["ok"]; + assert.sameValue(a, "ok"); +} + +// In binding destructuring contexts with object rest pattern. +{ + let {0n: a, ...b} = ["ok", "test"]; + assert.sameValue(a, "ok"); + assert.compareArray(Object.getOwnPropertyNames(b), ["1"]); +} + +// In assignment destructuring contexts. +{ + let a; + ({0n: a} = ["ok"]); + assert.sameValue(a, "ok"); +} + +// In assignment destructuring contexts with object rest pattern. +{ + let a, b; + ({0n: a, ...b} = ["ok", "test"]); + assert.sameValue(a, "ok"); + assert.compareArray(Object.getOwnPropertyNames(b), ["1"]); +} + +// BigInt literals as inferred names. +{ + let o = { + 0xan: function(){}, + }; + + assert.sameValue(o[10].name, "10"); +} + diff --git a/test/staging/sm/Boolean/15.6.4.2.js b/test/staging/sm/Boolean/15.6.4.2.js new file mode 100644 index 0000000000..b356c17ace --- /dev/null +++ b/test/staging/sm/Boolean/15.6.4.2.js @@ -0,0 +1,24 @@ +/* + * Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/licenses/publicdomain/ + */ + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +assert.sameValue(raisesException(TypeError)('Boolean.prototype.toString.call(42)'), true); +assert.sameValue(raisesException(TypeError)('Boolean.prototype.toString.call("")'), true); +assert.sameValue(raisesException(TypeError)('Boolean.prototype.toString.call({})'), true); +assert.sameValue(raisesException(TypeError)('Boolean.prototype.toString.call(null)'), true); +assert.sameValue(raisesException(TypeError)('Boolean.prototype.toString.call([])'), true); +assert.sameValue(raisesException(TypeError)('Boolean.prototype.toString.call(undefined)'), true); +assert.sameValue(raisesException(TypeError)('Boolean.prototype.toString.call(new String())'), true); + +assert.sameValue(completesNormally('Boolean.prototype.toString.call(true)'), true); +assert.sameValue(completesNormally('Boolean.prototype.toString.call(new Boolean(true))'), true); + diff --git a/test/staging/sm/Boolean/no-boolean-toJSON.js b/test/staging/sm/Boolean/no-boolean-toJSON.js new file mode 100644 index 0000000000..bb89e2002d --- /dev/null +++ b/test/staging/sm/Boolean/no-boolean-toJSON.js @@ -0,0 +1,26 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +/* + * Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/licenses/publicdomain/ + * Author: Tom Schuster + */ + +JSON.stringify(new Boolean(false), function(k, v) { + assert.sameValue(typeof v, "object"); +}); + +assert.sameValue(Boolean.prototype.hasOwnProperty('toJSON'), false); + +Object.prototype.toJSON = function() { return 2; }; +assert.sameValue(JSON.stringify(new Boolean(true)), "2"); + diff --git a/test/staging/sm/DataView/detach-after-construction.js b/test/staging/sm/DataView/detach-after-construction.js new file mode 100644 index 0000000000..1234e4b1d3 --- /dev/null +++ b/test/staging/sm/DataView/detach-after-construction.js @@ -0,0 +1,18 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +var buf = new ArrayBuffer([1,2]); +var bufView = new DataView(buf); + +$262.detachArrayBuffer(buf); + +assertThrowsInstanceOf(() => bufView.getInt8(0), TypeError); + diff --git a/test/staging/sm/DataView/get-set-index-range.js b/test/staging/sm/DataView/get-set-index-range.js new file mode 100644 index 0000000000..e8a567ea88 --- /dev/null +++ b/test/staging/sm/DataView/get-set-index-range.js @@ -0,0 +1,46 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +var buffer = new ArrayBuffer(2); +var view = new DataView(buffer); + +function check(view) { + for (let fun of ['getInt8', 'setInt8', 'getInt16', 'setInt16']) { + assertThrowsInstanceOf(() => view[fun](-10), RangeError); + assertThrowsInstanceOf(() => view[fun](-Infinity), RangeError); + assertThrowsInstanceOf(() => view[fun](Infinity), RangeError); + + assertThrowsInstanceOf(() => view[fun](Math.pow(2, 53)), RangeError); + assertThrowsInstanceOf(() => view[fun](Math.pow(2, 54)), RangeError); + } +} + +check(view); + +for (let fun of ['getInt8', 'getInt16']) { + assert.sameValue(view[fun](0), 0); + assert.sameValue(view[fun](undefined), 0); + assert.sameValue(view[fun](NaN), 0); +} + +if ('$262.detachArrayBuffer' in this) { + // ToIndex is called before detachment check, so we can tell the difference + // between a ToIndex failure and a real out of bounds failure. + $262.detachArrayBuffer(buffer); + + check(view); + + assertThrowsInstanceOf(() => view.getInt8(0), TypeError); + assertThrowsInstanceOf(() => view.setInt8(0, 0), TypeError); + assertThrowsInstanceOf(() => view.getInt8(Math.pow(2, 53) - 1), TypeError); + assertThrowsInstanceOf(() => view.setInt8(Math.pow(2, 53) - 1, 0), TypeError); +} + diff --git a/test/staging/sm/DataView/getter-name.js b/test/staging/sm/DataView/getter-name.js new file mode 100644 index 0000000000..67df56b47b --- /dev/null +++ b/test/staging/sm/DataView/getter-name.js @@ -0,0 +1,20 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +var BUGNUMBER = 1180290; +var summary = 'DataView getters should have get prefix'; + +print(BUGNUMBER + ": " + summary); + +assert.sameValue(Object.getOwnPropertyDescriptor(DataView.prototype, "buffer").get.name, "get buffer"); +assert.sameValue(Object.getOwnPropertyDescriptor(DataView.prototype, "byteLength").get.name, "get byteLength"); +assert.sameValue(Object.getOwnPropertyDescriptor(DataView.prototype, "byteOffset").get.name, "get byteOffset"); + diff --git a/test/staging/sm/Date/UTC-convert-all-arguments.js b/test/staging/sm/Date/UTC-convert-all-arguments.js new file mode 100644 index 0000000000..50312f04ab --- /dev/null +++ b/test/staging/sm/Date/UTC-convert-all-arguments.js @@ -0,0 +1,75 @@ +/* + * Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/licenses/publicdomain/ + */ + +/*--- +includes: [sm/non262-Date-shell.js, sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +var BUGNUMBER = 1160356; +var summary = + "Date.UTC must convert *all* arguments to number, not return NaN early if " + + "a non-finite argument is encountered"; + +print(BUGNUMBER + ": " + summary); + +/************** + * BEGIN TEST * + **************/ + +function expectThrowTypeError(f, i) +{ + try + { + f(); + throw new Error("didn't throw"); + } + catch (e) + { + assert.sameValue(e, 42, "index " + i + ": expected 42, got " + e); + } +} + +var bad = + { toString: function() { throw 17; }, valueOf: function() { throw 42; } }; + +var args = + [ + [bad], + + [NaN, bad], + [Infinity, bad], + [1970, bad], + + [1970, NaN, bad], + [1970, Infinity, bad], + [1970, 4, bad], + + [1970, 4, NaN, bad], + [1970, 4, Infinity, bad], + [1970, 4, 17, bad], + + [1970, 4, 17, NaN, bad], + [1970, 4, 17, Infinity, bad], + [1970, 4, 17, 13, bad], + + [1970, 4, 17, 13, NaN, bad], + [1970, 4, 17, 13, Infinity, bad], + [1970, 4, 17, 13, 37, bad], + + [1970, 4, 17, 13, 37, NaN, bad], + [1970, 4, 17, 13, 37, Infinity, bad], + [1970, 4, 17, 13, 37, 23, bad], + ]; + +for (var i = 0, len = args.length; i < len; i++) + expectThrowTypeError(function() { Date.UTC.apply(null, args[i]); }, i); + +/******************************************************************************/ + +print("Tests complete"); diff --git a/test/staging/sm/Date/constructor-convert-all-arguments.js b/test/staging/sm/Date/constructor-convert-all-arguments.js new file mode 100644 index 0000000000..c5949e42a8 --- /dev/null +++ b/test/staging/sm/Date/constructor-convert-all-arguments.js @@ -0,0 +1,75 @@ +/* + * Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/licenses/publicdomain/ + */ + +/*--- +includes: [sm/non262-Date-shell.js, sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +var BUGNUMBER = 1160356; +var summary = + "new Date(...) must convert *all* arguments to number, not return NaN " + + "early if a non-finite argument is encountered"; + +print(BUGNUMBER + ": " + summary); + +/************** + * BEGIN TEST * + **************/ + +function expectThrowTypeError(f, i) +{ + try + { + f(); + throw new Error("didn't throw"); + } + catch (e) + { + assert.sameValue(e, 42, "index " + i + ": expected 42, got " + e); + } +} + +var bad = + { toString: function() { throw 17; }, valueOf: function() { throw 42; } }; + +var funcs = + [ + function() { new Date(bad); }, + + function() { new Date(NaN, bad); }, + function() { new Date(Infinity, bad); }, + function() { new Date(1970, bad); }, + + function() { new Date(1970, NaN, bad); }, + function() { new Date(1970, Infinity, bad); }, + function() { new Date(1970, 4, bad); }, + + function() { new Date(1970, 4, NaN, bad); }, + function() { new Date(1970, 4, Infinity, bad); }, + function() { new Date(1970, 4, 17, bad); }, + + function() { new Date(1970, 4, 17, NaN, bad); }, + function() { new Date(1970, 4, 17, Infinity, bad); }, + function() { new Date(1970, 4, 17, 13, bad); }, + + function() { new Date(1970, 4, 17, 13, NaN, bad); }, + function() { new Date(1970, 4, 17, 13, Infinity, bad); }, + function() { new Date(1970, 4, 17, 13, 37, bad); }, + + function() { new Date(1970, 4, 17, 13, 37, NaN, bad); }, + function() { new Date(1970, 4, 17, 13, 37, Infinity, bad); }, + function() { new Date(1970, 4, 17, 13, 37, 23, bad); }, + ]; + +for (var i = 0, len = funcs.length; i < len; i++) + expectThrowTypeError(funcs[i]); + +/******************************************************************************/ + +print("Tests complete"); diff --git a/test/staging/sm/Date/constructor-one-Date-argument.js b/test/staging/sm/Date/constructor-one-Date-argument.js new file mode 100644 index 0000000000..38923dfeb8 --- /dev/null +++ b/test/staging/sm/Date/constructor-one-Date-argument.js @@ -0,0 +1,45 @@ +/* + * Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/licenses/publicdomain/ + */ + +/*--- +includes: [sm/non262-Date-shell.js, sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +var BUGNUMBER = 1187233; +var summary = + "Passing a Date object to |new Date()| should copy it, not convert it to " + + "a primitive and create it from that."; + +print(BUGNUMBER + ": " + summary); + +/************** + * BEGIN TEST * + **************/ + +Date.prototype.toString = Date.prototype.valueOf = null; +var d = new Date(new Date(8675309)); +assert.sameValue(d.getTime(), 8675309); + +Date.prototype.valueOf = () => 42; +d = new Date(new Date(8675309)); +assert.sameValue(d.getTime(), 8675309); + +var D = createNewGlobal().Date; + +D.prototype.toString = D.prototype.valueOf = null; +var d = new Date(new D(3141592654)); +assert.sameValue(d.getTime(), 3141592654); + +D.prototype.valueOf = () => 525600; +d = new Date(new D(3141592654)); +assert.sameValue(d.getTime(), 3141592654); + +/******************************************************************************/ + +print("Tests complete"); diff --git a/test/staging/sm/Date/constructor-one-argument.js b/test/staging/sm/Date/constructor-one-argument.js new file mode 100644 index 0000000000..8b5b047f90 --- /dev/null +++ b/test/staging/sm/Date/constructor-one-argument.js @@ -0,0 +1,31 @@ +/* + * Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/licenses/publicdomain/ + */ + +/*--- +includes: [sm/non262-Date-shell.js, sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +var BUGNUMBER = 738511; +var summary = + "new Date(value) should call ToPrimitive on value before testing for " + + "string-ness"; + +print(BUGNUMBER + ": " + summary); + +/************** + * BEGIN TEST * + **************/ + +assert.sameValue(new Date(new String("2012-01-31T00:00:00.000Z")).valueOf(), + 1327968000000, + "Date constructor passed a String object should parse it"); + +/******************************************************************************/ + +print("Tests complete"); diff --git a/test/staging/sm/Date/defaultvalue.js b/test/staging/sm/Date/defaultvalue.js new file mode 100644 index 0000000000..ece5ded2e7 --- /dev/null +++ b/test/staging/sm/Date/defaultvalue.js @@ -0,0 +1,195 @@ +/* + * Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/licenses/publicdomain/ + */ + +/*--- +includes: [sm/non262-Date-shell.js, sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +var BUGNUMBER = 645464; +var summary = + "[[DefaultValue]] behavior wrong for Date with overridden valueOf/toString"; + +print(BUGNUMBER + ": " + summary); + +/************** + * BEGIN TEST * + **************/ + +function allTests() +{ + var DS = new Date(2010, 1, 1).toString(); + + // equality + + var d = new Date(2010, 1, 1); + assert.sameValue(d == DS, true); + + var d2 = new Date(2010, 1, 1); + d2.valueOf = function() { assert.sameValue(arguments.length, 0); return 17; }; + assert.sameValue(d2 == DS, true); + + var d3 = new Date(2010, 1, 1); + d3.toString = function() { return 42; }; + assert.sameValue(d3 == 42, true); + + function testEquality() + { + var d = new Date(2010, 1, 1); + assert.sameValue(d == DS, true); + + var d2 = new Date(2010, 1, 1); + d2.valueOf = function() { assert.sameValue(arguments.length, 0); return 17; }; + assert.sameValue(d2 == DS, true); + + var d3 = new Date(2010, 1, 1); + d3.toString = function() { return 42; }; + assert.sameValue(d3 == 42, true); + } + testEquality(); + + + // addition of Date to number + + var d = new Date(2010, 1, 1); + assert.sameValue(d + 5, DS + "5"); + + var d2 = new Date(2010, 1, 1); + d2.toString = function() { return 9; }; + assert.sameValue(d2 + 3, 9 + 3); + + var d3 = new Date(2010, 1, 1); + d3.valueOf = function() { assert.sameValue(arguments.length, 0); return 17; }; + assert.sameValue(d3 + 5, DS + "5"); + + function testDateNumberAddition() + { + var d = new Date(2010, 1, 1); + assert.sameValue(d + 5, DS + "5"); + + var d2 = new Date(2010, 1, 1); + d2.toString = function() { return 9; }; + assert.sameValue(d2 + 3, 9 + 3); + + var d3 = new Date(2010, 1, 1); + d3.valueOf = function() { assert.sameValue(arguments.length, 0); return 17; }; + assert.sameValue(d3 + 5, DS + "5"); + } + testDateNumberAddition(); + + + // addition of Date to Date + + var d = new Date(2010, 1, 1); + assert.sameValue(d + d, DS + DS); + + var d2 = new Date(2010, 1, 1); + d2.toString = function() { return 5; }; + assert.sameValue(d2 + d2, 10); + + var d3 = new Date(2010, 1, 1); + d3.valueOf = function() { assert.sameValue(arguments.length, 0); return 8.5; }; + assert.sameValue(d3 + d3, DS + DS); + + function testDateDateAddition() + { + var d = new Date(2010, 1, 1); + assert.sameValue(d + d, DS + DS); + + var d2 = new Date(2010, 1, 1); + d2.toString = function() { return 5; }; + assert.sameValue(d2 + d2, 10); + + var d3 = new Date(2010, 1, 1); + d3.valueOf = function() { assert.sameValue(arguments.length, 0); return 8.5; }; + assert.sameValue(d3 + d3, DS + DS); + } + testDateDateAddition(); + + + // Date as bracketed property name + + var obj = { 8: 42, 9: 73 }; + obj[DS] = 17; + + var d = new Date(2010, 1, 1); + assert.sameValue(obj[d], 17); + + var d2 = new Date(2010, 1, 1); + d2.valueOf = function() { assert.sameValue(arguments.length, 0); return 8; } + assert.sameValue(obj[d2], 17); + + var d3 = new Date(2010, 1, 1); + d3.toString = function() { return 9; }; + assert.sameValue(obj[d3], 73); + + function testPropertyName() + { + var obj = { 8: 42, 9: 73 }; + obj[DS] = 17; + + var d = new Date(2010, 1, 1); + assert.sameValue(obj[d], 17); + + var d2 = new Date(2010, 1, 1); + d2.valueOf = function() { assert.sameValue(arguments.length, 0); return 8; } + assert.sameValue(obj[d2], 17); + + var d3 = new Date(2010, 1, 1); + d3.toString = function() { return 9; }; + assert.sameValue(obj[d3], 73); + } + testPropertyName(); + + + // Date as property name with |in| operator + + var obj = {}; + obj[DS] = 5; + + var d = new Date(2010, 1, 1); + assert.sameValue(d in obj, true); + + var d2 = new Date(2010, 1, 1); + d2.toString = function() { return "baz"; }; + assert.sameValue(d2 in { baz: 42 }, true); + + var d3 = new Date(2010, 1, 1); + d3.valueOf = function() { assert.sameValue(arguments.length, 0); return "quux"; }; + assert.sameValue(d3 in obj, true); + + function testInOperatorName() + { + var obj = {}; + obj[DS] = 5; + + var d = new Date(2010, 1, 1); + assert.sameValue(d in obj, true); + + var d2 = new Date(2010, 1, 1); + d2.toString = function() { return "baz"; }; + assert.sameValue(d2 in { baz: 42 }, true); + + var d3 = new Date(2010, 1, 1); + d3.valueOf = function() { assert.sameValue(arguments.length, 0); return "quux"; }; + assert.sameValue(d3 in obj, true); + } + testInOperatorName(); +} + +allTests(); + +if (typeof createNewGlobal === "function") +{ + Date = createNewGlobal().Date; + allTests(); +} + +/******************************************************************************/ + +print("All tests passed!"); diff --git a/test/staging/sm/Date/dst-offset-caching-1-of-8.js b/test/staging/sm/Date/dst-offset-caching-1-of-8.js new file mode 100644 index 0000000000..11b513eb9e --- /dev/null +++ b/test/staging/sm/Date/dst-offset-caching-1-of-8.js @@ -0,0 +1,14 @@ +/* + * Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/licenses/publicdomain/ + */ + +/*--- +includes: [sm/non262-Date-shell.js, sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +runDSTOffsetCachingTestsFraction(1, 8); diff --git a/test/staging/sm/Date/dst-offset-caching-2-of-8.js b/test/staging/sm/Date/dst-offset-caching-2-of-8.js new file mode 100644 index 0000000000..25be52fdd2 --- /dev/null +++ b/test/staging/sm/Date/dst-offset-caching-2-of-8.js @@ -0,0 +1,14 @@ +/* + * Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/licenses/publicdomain/ + */ + +/*--- +includes: [sm/non262-Date-shell.js, sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +runDSTOffsetCachingTestsFraction(2, 8); diff --git a/test/staging/sm/Date/dst-offset-caching-3-of-8.js b/test/staging/sm/Date/dst-offset-caching-3-of-8.js new file mode 100644 index 0000000000..01ad1c4ad8 --- /dev/null +++ b/test/staging/sm/Date/dst-offset-caching-3-of-8.js @@ -0,0 +1,14 @@ +/* + * Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/licenses/publicdomain/ + */ + +/*--- +includes: [sm/non262-Date-shell.js, sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +runDSTOffsetCachingTestsFraction(3, 8); diff --git a/test/staging/sm/Date/dst-offset-caching-4-of-8.js b/test/staging/sm/Date/dst-offset-caching-4-of-8.js new file mode 100644 index 0000000000..430c477a4d --- /dev/null +++ b/test/staging/sm/Date/dst-offset-caching-4-of-8.js @@ -0,0 +1,14 @@ +/* + * Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/licenses/publicdomain/ + */ + +/*--- +includes: [sm/non262-Date-shell.js, sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +runDSTOffsetCachingTestsFraction(4, 8); diff --git a/test/staging/sm/Date/dst-offset-caching-5-of-8.js b/test/staging/sm/Date/dst-offset-caching-5-of-8.js new file mode 100644 index 0000000000..af062e04de --- /dev/null +++ b/test/staging/sm/Date/dst-offset-caching-5-of-8.js @@ -0,0 +1,14 @@ +/* + * Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/licenses/publicdomain/ + */ + +/*--- +includes: [sm/non262-Date-shell.js, sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +runDSTOffsetCachingTestsFraction(5, 8); diff --git a/test/staging/sm/Date/dst-offset-caching-6-of-8.js b/test/staging/sm/Date/dst-offset-caching-6-of-8.js new file mode 100644 index 0000000000..ec4585f9a6 --- /dev/null +++ b/test/staging/sm/Date/dst-offset-caching-6-of-8.js @@ -0,0 +1,14 @@ +/* + * Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/licenses/publicdomain/ + */ + +/*--- +includes: [sm/non262-Date-shell.js, sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +runDSTOffsetCachingTestsFraction(6, 8); diff --git a/test/staging/sm/Date/dst-offset-caching-7-of-8.js b/test/staging/sm/Date/dst-offset-caching-7-of-8.js new file mode 100644 index 0000000000..94b6533929 --- /dev/null +++ b/test/staging/sm/Date/dst-offset-caching-7-of-8.js @@ -0,0 +1,14 @@ +/* + * Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/licenses/publicdomain/ + */ + +/*--- +includes: [sm/non262-Date-shell.js, sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +runDSTOffsetCachingTestsFraction(7, 8); diff --git a/test/staging/sm/Date/dst-offset-caching-8-of-8.js b/test/staging/sm/Date/dst-offset-caching-8-of-8.js new file mode 100644 index 0000000000..1c64ddde30 --- /dev/null +++ b/test/staging/sm/Date/dst-offset-caching-8-of-8.js @@ -0,0 +1,14 @@ +/* + * Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/licenses/publicdomain/ + */ + +/*--- +includes: [sm/non262-Date-shell.js, sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +runDSTOffsetCachingTestsFraction(8, 8); diff --git a/test/staging/sm/Date/equality-to-boolean.js b/test/staging/sm/Date/equality-to-boolean.js new file mode 100644 index 0000000000..2af63855f5 --- /dev/null +++ b/test/staging/sm/Date/equality-to-boolean.js @@ -0,0 +1,46 @@ +/* + * Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/licenses/publicdomain/ + */ + +/*--- +includes: [sm/non262-Date-shell.js, sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +//----------------------------------------------------------------------------- +print("Test for correct implementation of |Date == boolean| and vice versa"); + +/************** + * BEGIN TEST * + **************/ + +Date.prototype.toString = function() { return 1; }; +Date.prototype.valueOf = function() { return 0; }; + +/* + * ES5 11.9.3 doesn't directly handle obj == boolean. Instead it translates it + * as follows: + * + * obj == boolean + * ↳ obj == ToNumber(boolean), per step 7 + * ↳ ToPrimitive(obj) == ToNumber(boolean), per step 9 + * + * ToPrimitive calls [[DefaultValue]] with no hint. For Date objects this is + * treated as if it were instead called with hint String. That calls toString, + * which returns 1, so Date objects here should compare equal to true and + * unequal to false. + */ +assert.sameValue(new Date == true, true); +assert.sameValue(new Date == false, false); + +/* == is symmetric. */ +assert.sameValue(true == new Date, true); +assert.sameValue(false == new Date, false); + +/******************************************************************************/ + +print("Tests complete"); diff --git a/test/staging/sm/Date/fractions.js b/test/staging/sm/Date/fractions.js new file mode 100644 index 0000000000..45e00b79d4 --- /dev/null +++ b/test/staging/sm/Date/fractions.js @@ -0,0 +1,29 @@ +/* + * Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/licenses/publicdomain/ + */ + +/*--- +includes: [sm/non262-Date-shell.js, sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +var BUGNUMBER = 771946; +var summary = "Fractional days, months, years shouldn't trigger asserts"; + +print(BUGNUMBER + ": " + summary); + +/************** + * BEGIN TEST * + **************/ + +new Date(0).setFullYear(1.5); +new Date(0).setUTCDate(1.5); +new Date(0).setMonth(1.5); + +/******************************************************************************/ + +print("Tests complete"); diff --git a/test/staging/sm/Date/makeday-year-month-is-infinity.js b/test/staging/sm/Date/makeday-year-month-is-infinity.js new file mode 100644 index 0000000000..8745c4ab06 --- /dev/null +++ b/test/staging/sm/Date/makeday-year-month-is-infinity.js @@ -0,0 +1,22 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-Date-shell.js, sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +// MakeDay: Adding finite |year| and |month| can result in non-finite intermediate result. + +assert.sameValue(Date.UTC(Number.MAX_VALUE, Number.MAX_VALUE), NaN); +assert.sameValue(new Date(Number.MAX_VALUE, Number.MAX_VALUE).getTime(), NaN); + +// https://github.com/tc39/ecma262/issues/1087 + +var d = new Date(0); +d.setUTCFullYear(Number.MAX_VALUE, Number.MAX_VALUE); +assert.sameValue(d.getTime(), NaN); + diff --git a/test/staging/sm/Date/non-iso.js b/test/staging/sm/Date/non-iso.js new file mode 100644 index 0000000000..68e9c6459c --- /dev/null +++ b/test/staging/sm/Date/non-iso.js @@ -0,0 +1,76 @@ +/* + * Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/licenses/publicdomain/ + */ + +/*--- +includes: [sm/non262-Date-shell.js, sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +/* + * For the sake of cross compatibility with other implementations we + * follow the W3C "NOTE-datetime" specification when parsing dates of + * the form YYYY-MM-DDTHH:MM:SS save for a few exceptions: months, days, hours + * minutes, and seconds may be either one _or_ two digits long, and the 'T' + * preceding the time part may be replaced with a space. So, a string like + * "1997-3-8 1:1:1" will parse successfully. See bug: 1203298 + */ + +/************** + * BEGIN TEST * + **************/ + +assert.sameValue(new Date("1997-03-08 1:1:1.01").getTime(), + new Date("1997-03-08T01:01:01.01").getTime()); +assert.sameValue(new Date("1997-03-08 11:19:20").getTime(), + new Date("1997-03-08T11:19:20").getTime()); +assert.sameValue(new Date("1997-3-08 11:19:20").getTime(), + new Date("1997-03-08T11:19:20").getTime()); +assert.sameValue(new Date("1997-3-8 11:19:20").getTime(), + new Date("1997-03-08T11:19:20").getTime()); +assert.sameValue(new Date("+001997-3-8 11:19:20").getTime(), + new Date("1997-03-08T11:19:20").getTime()); +assert.sameValue(new Date("+001997-03-8 11:19:20").getTime(), + new Date("1997-03-08T11:19:20").getTime()); +assert.sameValue(new Date("1997-03-08 11:19").getTime(), + new Date("1997-03-08T11:19").getTime()); +assert.sameValue(new Date("1997-03-08 1:19").getTime(), + new Date("1997-03-08T01:19").getTime()); +assert.sameValue(new Date("1997-03-08 1:1").getTime(), + new Date("1997-03-08T01:01").getTime()); +assert.sameValue(new Date("1997-03-08 1:1:01").getTime(), + new Date("1997-03-08T01:01:01").getTime()); +assert.sameValue(new Date("1997-03-08 1:1:1").getTime(), + new Date("1997-03-08T01:01:01").getTime()); +assert.sameValue(new Date("1997-03-08 11").getTime(), + new Date("1997-03-08T11").getTime()); // Date(NaN) +assert.sameValue(new Date("1997-03-08 11:19:10-07").getTime(), + new Date("1997-03-08 11:19:10-0700").getTime()); +assert.sameValue(new Date("1997-03-08T11:19:10-07").getTime(), + new Date(NaN).getTime()); +assert.sameValue(new Date("1997-03-08T").getTime(), + new Date(NaN).getTime()); +assert.sameValue(new Date("1997-3-8T11:19:20").getTime(), + new Date(NaN).getTime()); +assert.sameValue(new Date("1997-03-8T11:19:20").getTime(), + new Date(NaN).getTime()); +assert.sameValue(new Date("+001997-3-8T11:19:20").getTime(), + new Date(NaN).getTime()); +assert.sameValue(new Date("+001997-3-08T11:19:20").getTime(), + new Date(NaN).getTime()); +assert.sameValue(new Date("1997-03-08T1:19").getTime(), + new Date(NaN).getTime()); +assert.sameValue(new Date("1997-03-08T1:1").getTime(), + new Date(NaN).getTime()); +assert.sameValue(new Date("1997-03-08T1:1:01").getTime(), + new Date(NaN).getTime()); +assert.sameValue(new Date("1997-03-08T1:1:1").getTime(), + new Date(NaN).getTime()); + +/******************************************************************************/ + +print("Tests complete"); diff --git a/test/staging/sm/Date/prototype-is-not-a-date.js b/test/staging/sm/Date/prototype-is-not-a-date.js new file mode 100644 index 0000000000..21a3c12a15 --- /dev/null +++ b/test/staging/sm/Date/prototype-is-not-a-date.js @@ -0,0 +1,21 @@ +/* + * Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/licenses/publicdomain/ + */ + +/*--- +includes: [sm/non262-Date-shell.js, sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +var BUGNUMBER = 861219; +var summary = "Date.prototype isn't an instance of Date"; + +print(BUGNUMBER + ": " + summary); + +assert.sameValue(Date.prototype instanceof Date, false); +assert.sameValue(Date.prototype.__proto__, Object.prototype); + diff --git a/test/staging/sm/Date/setTime-argument-shortcircuiting.js b/test/staging/sm/Date/setTime-argument-shortcircuiting.js new file mode 100644 index 0000000000..131413f320 --- /dev/null +++ b/test/staging/sm/Date/setTime-argument-shortcircuiting.js @@ -0,0 +1,154 @@ +/* + * Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/licenses/publicdomain/ + */ + +/*--- +includes: [sm/non262-Date-shell.js, sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +//----------------------------------------------------------------------------- +print("Test for correct short-circuiting implementation of Date.set methods"); + +/************** + * BEGIN TEST * + **************/ +var global = 0; +var date; + +/* Test that methods don't short circuit argument evaluation. */ +date = new Date(0).setSeconds(NaN, {valueOf:function(){global = 3}}); +assert.sameValue(global, 3); + +date = new Date(0).setUTCSeconds(NaN, {valueOf:function(){global = 4}}); +assert.sameValue(global, 4); + +date = new Date(0).setMinutes(NaN, {valueOf:function(){global = 5}}); +assert.sameValue(global, 5); + +date = new Date(0).setUTCMinutes(NaN, {valueOf:function(){global = 6}}); +assert.sameValue(global, 6); + +date = new Date(0).setHours(NaN, {valueOf:function(){global = 7}}); +assert.sameValue(global, 7); + +date = new Date(0).setUTCHours(NaN, {valueOf:function(){global = 8}}); +assert.sameValue(global, 8); + +date = new Date(0).setMonth(NaN, {valueOf:function(){global = 11}}); +assert.sameValue(global, 11); + +date = new Date(0).setUTCMonth(NaN, {valueOf:function(){global = 12}}); +assert.sameValue(global, 12); + +date = new Date(0).setFullYear(NaN, {valueOf:function(){global = 13}}); +assert.sameValue(global, 13); + +date = new Date(0).setUTCFullYear(NaN, {valueOf:function(){global = 14}}); +assert.sameValue(global, 14); + + + +/* Test that argument evaluation is not short circuited if Date == NaN */ +date = new Date(NaN).setMilliseconds({valueOf:function(){global = 15}}); +assert.sameValue(global, 15); + +date = new Date(NaN).setUTCMilliseconds({valueOf:function(){global = 16}}); +assert.sameValue(global, 16); + +date = new Date(NaN).setSeconds({valueOf:function(){global = 17}}); +assert.sameValue(global, 17); + +date = new Date(NaN).setUTCSeconds({valueOf:function(){global = 18}}); +assert.sameValue(global, 18); + +date = new Date(NaN).setMinutes({valueOf:function(){global = 19}}); +assert.sameValue(global, 19); + +date = new Date(NaN).setUTCMinutes({valueOf:function(){global = 20}}); +assert.sameValue(global, 20); + +date = new Date(NaN).setHours({valueOf:function(){global = 21}}); +assert.sameValue(global, 21); + +date = new Date(NaN).setUTCHours({valueOf:function(){global = 22}}); +assert.sameValue(global, 22); + +date = new Date(NaN).setDate({valueOf:function(){global = 23}}); +assert.sameValue(global, 23); + +date = new Date(NaN).setUTCDate({valueOf:function(){global = 24}}); +assert.sameValue(global, 24); + +date = new Date(NaN).setMonth({valueOf:function(){global = 25}}); +assert.sameValue(global, 25); + +date = new Date(NaN).setUTCMonth({valueOf:function(){global = 26}}); +assert.sameValue(global, 26); + +date = new Date(NaN).setFullYear({valueOf:function(){global = 27}}); +assert.sameValue(global, 27); + +date = new Date(NaN).setUTCFullYear({valueOf:function(){global = 28}}); +assert.sameValue(global, 28); + + +/* Test the combination of the above two. */ +date = new Date(NaN).setSeconds(NaN, {valueOf:function(){global = 31}}); +assert.sameValue(global, 31); + +date = new Date(NaN).setUTCSeconds(NaN, {valueOf:function(){global = 32}}); +assert.sameValue(global, 32); + +date = new Date(NaN).setMinutes(NaN, {valueOf:function(){global = 33}}); +assert.sameValue(global, 33); + +date = new Date(NaN).setUTCMinutes(NaN, {valueOf:function(){global = 34}}); +assert.sameValue(global, 34); + +date = new Date(NaN).setHours(NaN, {valueOf:function(){global = 35}}); +assert.sameValue(global, 35); + +date = new Date(NaN).setUTCHours(NaN, {valueOf:function(){global = 36}}); +assert.sameValue(global, 36); + +date = new Date(NaN).setMonth(NaN, {valueOf:function(){global = 39}}); +assert.sameValue(global, 39); + +date = new Date(NaN).setUTCMonth(NaN, {valueOf:function(){global = 40}}); +assert.sameValue(global, 40); + +date = new Date(NaN).setFullYear(NaN, {valueOf:function(){global = 41}}); +assert.sameValue(global, 41); + +date = new Date(NaN).setUTCFullYear(NaN, {valueOf:function(){global = 42}}); +assert.sameValue(global, 42); + + +/*Test two methods evaluation*/ +var secondGlobal = 0; + +date = new Date(NaN).setFullYear({valueOf:function(){global = 43}}, {valueOf:function(){secondGlobal = 1}}); +assert.sameValue(global, 43); +assert.sameValue(secondGlobal, 1); + +date = new Date(0).setFullYear(NaN, {valueOf:function(){global = 44}}, {valueOf:function(){secondGlobal = 2}}); +assert.sameValue(global, 44); +assert.sameValue(secondGlobal, 2); + + +/* Test year methods*/ +date = new Date(0).setYear({valueOf:function(){global = 45}}); +assert.sameValue(global, 45); + +date = new Date(NaN).setYear({valueOf:function(){global = 46}}); +assert.sameValue(global, 46); + + +/******************************************************************************/ + +print("Tests complete"); diff --git a/test/staging/sm/Date/time-components-negative-zero.js b/test/staging/sm/Date/time-components-negative-zero.js new file mode 100644 index 0000000000..a5966525ae --- /dev/null +++ b/test/staging/sm/Date/time-components-negative-zero.js @@ -0,0 +1,27 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-Date-shell.js, sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +// Don't return negative zero for get[Hours,Minutes,Seconds,Milliseconds] for dates before 1970. + +let date = new Date(1955, 0, 1); +assert.sameValue(date.getTime() < 0, true); +assert.sameValue(date.getHours(), +0); +assert.sameValue(date.getMinutes(), +0); +assert.sameValue(date.getSeconds(), +0); +assert.sameValue(date.getMilliseconds(), +0); + +let utc = new Date(Date.UTC(1955, 0, 1)); +assert.sameValue(utc.getTime() < 0, true); +assert.sameValue(utc.getUTCHours(), +0); +assert.sameValue(utc.getUTCMinutes(), +0); +assert.sameValue(utc.getUTCSeconds(), +0); +assert.sameValue(utc.getUTCMilliseconds(), +0); + diff --git a/test/staging/sm/Date/timeclip.js b/test/staging/sm/Date/timeclip.js new file mode 100644 index 0000000000..cd1d40f002 --- /dev/null +++ b/test/staging/sm/Date/timeclip.js @@ -0,0 +1,47 @@ +/* + * Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/licenses/publicdomain/ + */ + +/*--- +includes: [sm/non262-Date-shell.js, sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +var BUGNUMBER = 747197; +var summary = "TimeClip behavior for very large numbers"; + +print(BUGNUMBER + ": " + summary); + +/************** + * BEGIN TEST * + **************/ + +function addToLimit(n) { return 8.64e15 + n; } + +assert.sameValue(8.64e15 === addToLimit(0.0), true); +assert.sameValue(8.64e15 === addToLimit(0.5), true); +assert.sameValue(8.64e15 === addToLimit(0.5000000000000001), false); + +var times = + [Number.MAX_VALUE, + -Number.MAX_VALUE, + Infinity, + -Infinity, + addToLimit(0.5000000000000001), + -addToLimit(0.5000000000000001)]; + +for (var i = 0, len = times.length; i < len; i++) +{ + var d = new Date(); + assert.sameValue(d.setTime(times[i]), NaN, "times[" + i + "]"); + assert.sameValue(d.getTime(), NaN); + assert.sameValue(d.valueOf(), NaN); +} + +/******************************************************************************/ + +print("Tests complete"); diff --git a/test/staging/sm/Date/to-temporal-instant.js b/test/staging/sm/Date/to-temporal-instant.js new file mode 100644 index 0000000000..db9992c627 --- /dev/null +++ b/test/staging/sm/Date/to-temporal-instant.js @@ -0,0 +1,72 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-Date-shell.js, sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +features: +- Temporal +description: | + pending +esid: pending +---*/ + +const min = new Date(-8640000000000000).toTemporalInstant(); +const max = new Date(8640000000000000).toTemporalInstant(); +const epoch = new Date(0).toTemporalInstant(); + +const minTemporalInstant = new Temporal.Instant(-8640000000000000000000n) +const maxTemporalInstant = new Temporal.Instant(8640000000000000000000n) +const zeroInstant = new Temporal.Instant(0n) + +let zero = Temporal.Duration.from({nanoseconds: 0}); +let one = Temporal.Duration.from({nanoseconds: 1}); +let minusOne = Temporal.Duration.from({nanoseconds: -1}); + +//Test invalid date +{ + const invalidDate = new Date(NaN); + assertThrowsInstanceOf(() => invalidDate.toTemporalInstant(), RangeError); +} + +//Test Temporal.Instant properties +{ + // epochNanoseconds + assert.sameValue(min.epochNanoseconds, minTemporalInstant.epochNanoseconds); + assert.sameValue(max.epochNanoseconds, maxTemporalInstant.epochNanoseconds); + assert.sameValue(epoch.epochNanoseconds, zeroInstant.epochNanoseconds); + + // toZonedDateTime + assert.sameValue(min.toZonedDateTimeISO('UTC').toString(), minTemporalInstant.toZonedDateTimeISO('UTC').toString()); + assert.sameValue(max.toZonedDateTimeISO('UTC').toString(), maxTemporalInstant.toZonedDateTimeISO('UTC').toString()); + assert.sameValue(epoch.toZonedDateTimeISO('UTC').toString(), zeroInstant.toZonedDateTimeISO('UTC').toString()); +} + +// Test values around the minimum/maximum instant. +{ + // Adding zero to the minimum instant. + assert.sameValue(min.add(zero).epochNanoseconds, min.epochNanoseconds); + assert.sameValue(min.subtract(zero).epochNanoseconds, min.epochNanoseconds); + + // Adding zero to the maximum instant. + assert.sameValue(max.add(zero).epochNanoseconds, max.epochNanoseconds); + assert.sameValue(max.subtract(zero).epochNanoseconds, max.epochNanoseconds); + + // Adding one to the minimum instant. + assert.sameValue(min.add(one).epochNanoseconds, min.epochNanoseconds + 1n); + assert.sameValue(min.subtract(minusOne).epochNanoseconds, min.epochNanoseconds + 1n); + + // Subtracting one from the maximum instant. + assert.sameValue(max.add(minusOne).epochNanoseconds, max.epochNanoseconds - 1n); + assert.sameValue(max.subtract(one).epochNanoseconds, max.epochNanoseconds - 1n); + + // Subtracting one from the minimum instant. + assertThrowsInstanceOf(() => min.add(minusOne), RangeError); + assertThrowsInstanceOf(() => min.subtract(one), RangeError); + + // Adding one to the maximum instant. + assertThrowsInstanceOf(() => max.add(one), RangeError); + assertThrowsInstanceOf(() => max.subtract(minusOne), RangeError); +} + diff --git a/test/staging/sm/Date/toISOString-01.js b/test/staging/sm/Date/toISOString-01.js new file mode 100644 index 0000000000..422769da1c --- /dev/null +++ b/test/staging/sm/Date/toISOString-01.js @@ -0,0 +1,62 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-Date-shell.js, sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +/* Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/publicdomain/zero/1.0/ */ + +//----------------------------------------------------------------------------- +var BUGNUMBER = 730831; +var summary = 'Date.prototype.toISOString returns an invalid ISO-8601 string'; + +print(BUGNUMBER + ": " + summary); + +function iso(t) { + return new Date(t).toISOString(); +} + +function utc(year, month, day, hour, minute, second, millis) { + var date = new Date(0); + date.setUTCFullYear(year, month - 1, day); + date.setUTCHours(hour, minute, second, millis); + return date.getTime(); +} + + +// Values around maximum date for simple iso format. +var maxDateSimple = utc(9999, 12, 31, 23, 59, 59, 999); +assert.sameValue(iso(maxDateSimple - 1), "9999-12-31T23:59:59.998Z"); +assert.sameValue(iso(maxDateSimple ), "9999-12-31T23:59:59.999Z"); +assert.sameValue(iso(maxDateSimple + 1), "+010000-01-01T00:00:00.000Z"); + + +// Values around minimum date for simple iso format. +var minDateSimple = utc(0, 1, 1, 0, 0, 0, 0); +assert.sameValue(iso(minDateSimple - 1), "-000001-12-31T23:59:59.999Z"); +assert.sameValue(iso(minDateSimple ), "0000-01-01T00:00:00.000Z"); +assert.sameValue(iso(minDateSimple + 1), "0000-01-01T00:00:00.001Z"); + + +// Values around maximum date for extended iso format. +var maxDateExtended = utc(+275760, 9, 13, 0, 0, 0, 0); +assert.sameValue(maxDateExtended, +8.64e15); +assert.sameValue(iso(maxDateExtended - 1), "+275760-09-12T23:59:59.999Z"); +assert.sameValue(iso(maxDateExtended ), "+275760-09-13T00:00:00.000Z"); +assertThrowsInstanceOf(() => iso(maxDateExtended + 1), RangeError); + + +// Values around minimum date for extended iso format. +var minDateExtended = utc(-271821, 4, 20, 0, 0, 0, 0); +assert.sameValue(minDateExtended, -8.64e15); +assertThrowsInstanceOf(() => iso(minDateExtended - 1), RangeError); +assert.sameValue(iso(minDateExtended ), "-271821-04-20T00:00:00.000Z"); +assert.sameValue(iso(minDateExtended + 1), "-271821-04-20T00:00:00.001Z"); + + diff --git a/test/staging/sm/Date/toISOString.js b/test/staging/sm/Date/toISOString.js new file mode 100644 index 0000000000..62836a2fed --- /dev/null +++ b/test/staging/sm/Date/toISOString.js @@ -0,0 +1,30 @@ +/* + * Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/licenses/publicdomain/ + */ + +/*--- +includes: [sm/non262-Date-shell.js, sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +function throwsRangeError(t) { + try { + var date = new Date(); + date.setTime(t); + var r = date.toISOString(); + throw new Error("toISOString didn't throw, instead returned " + r); + } catch (err) { + assert.sameValue(err instanceof RangeError, true, 'wrong error: ' + err); + return; + } + assert.sameValue(0, 1, 'not good, nyan, nyan'); +} + +throwsRangeError(Infinity); +throwsRangeError(-Infinity); +throwsRangeError(NaN); + diff --git a/test/staging/sm/Date/toJSON-01.js b/test/staging/sm/Date/toJSON-01.js new file mode 100644 index 0000000000..e4a890b400 --- /dev/null +++ b/test/staging/sm/Date/toJSON-01.js @@ -0,0 +1,245 @@ +/* + * Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/licenses/publicdomain/ + */ + +/*--- +includes: [sm/non262-Date-shell.js, sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +var gTestfile = 'toJSON-01.js'; +//----------------------------------------------------------------------------- +var BUGNUMBER = 584811; +var summary = "Date.prototype.toJSON isn't to spec"; + +print(BUGNUMBER + ": " + summary); + +/************** + * BEGIN TEST * + **************/ + +var called; + +var dateToJSON = Date.prototype.toJSON; +assert.sameValue(Date.prototype.hasOwnProperty("toJSON"), true); +assert.sameValue(typeof dateToJSON, "function"); + +// brief test to exercise this outside of isolation, just for sanity +var invalidDate = new Date(); +invalidDate.setTime(NaN); +assert.sameValue(JSON.stringify({ p: invalidDate }), '{"p":null}'); + + +/* 15.9.5.44 Date.prototype.toJSON ( key ) */ +assert.sameValue(dateToJSON.length, 1); + +/* + * 1. Let O be the result of calling ToObject, giving it the this value as its + * argument. + */ +try +{ + dateToJSON.call(null); + throw new Error("should have thrown a TypeError"); +} +catch (e) +{ + assert.sameValue(e instanceof TypeError, true, + "ToObject throws TypeError for null/undefined"); +} + +try +{ + dateToJSON.call(undefined); + throw new Error("should have thrown a TypeError"); +} +catch (e) +{ + assert.sameValue(e instanceof TypeError, true, + "ToObject throws TypeError for null/undefined"); +} + + +/* + * 2. Let tv be ToPrimitive(O, hint Number). + * ...expands to: + * 1. Let valueOf be the result of calling the [[Get]] internal method of object O with argument "valueOf". + * 2. If IsCallable(valueOf) is true then, + * a. Let val be the result of calling the [[Call]] internal method of valueOf, with O as the this value and + * an empty argument list. + * b. If val is a primitive value, return val. + * 3. Let toString be the result of calling the [[Get]] internal method of object O with argument "toString". + * 4. If IsCallable(toString) is true then, + * a. Let str be the result of calling the [[Call]] internal method of toString, with O as the this value and + * an empty argument list. + * b. If str is a primitive value, return str. + * 5. Throw a TypeError exception. + */ +try +{ + var r = dateToJSON.call({ get valueOf() { throw 17; } }); + throw new Error("didn't throw, returned: " + r); +} +catch (e) +{ + assert.sameValue(e, 17, "bad exception: " + e); +} + +called = false; +assert.sameValue(dateToJSON.call({ valueOf: null, + toString: function() { called = true; return 12; }, + toISOString: function() { return "ohai"; } }), + "ohai"); +assert.sameValue(called, true); + +called = false; +assert.sameValue(dateToJSON.call({ valueOf: function() { called = true; return 42; }, + toISOString: function() { return null; } }), + null); +assert.sameValue(called, true); + +try +{ + called = false; + dateToJSON.call({ valueOf: function() { called = true; return {}; }, + get toString() { throw 42; } }); +} +catch (e) +{ + assert.sameValue(called, true); + assert.sameValue(e, 42, "bad exception: " + e); +} + +called = false; +assert.sameValue(dateToJSON.call({ valueOf: function() { called = true; return {}; }, + get toString() { return function() { return 8675309; }; }, + toISOString: function() { return true; } }), + true); +assert.sameValue(called, true); + +var asserted = false; +called = false; +assert.sameValue(dateToJSON.call({ valueOf: function() { called = true; return {}; }, + get toString() + { + assert.sameValue(called, true); + asserted = true; + return function() { return 8675309; }; + }, + toISOString: function() { return NaN; } }), + NaN); +assert.sameValue(asserted, true); + +try +{ + var r = dateToJSON.call({ valueOf: null, toString: null, + get toISOString() + { + throw new Error("shouldn't have been gotten"); + } }); + throw new Error("didn't throw, returned: " + r); +} +catch (e) +{ + assert.sameValue(e instanceof TypeError, true, "bad exception: " + e); +} + + +/* 3. If tv is a Number and is not finite, return null. */ +assert.sameValue(dateToJSON.call({ valueOf: function() { return Infinity; } }), null); +assert.sameValue(dateToJSON.call({ valueOf: function() { return -Infinity; } }), null); +assert.sameValue(dateToJSON.call({ valueOf: function() { return NaN; } }), null); + +assert.sameValue(dateToJSON.call({ valueOf: function() { return Infinity; }, + toISOString: function() { return {}; } }), null); +assert.sameValue(dateToJSON.call({ valueOf: function() { return -Infinity; }, + toISOString: function() { return []; } }), null); +assert.sameValue(dateToJSON.call({ valueOf: function() { return NaN; }, + toISOString: function() { return undefined; } }), null); + + +/* + * 4. Let toISO be the result of calling the [[Get]] internal method of O with + * argument "toISOString". + */ +try +{ + var r = dateToJSON.call({ get toISOString() { throw 42; } }); + throw new Error("didn't throw, returned: " + r); +} +catch (e) +{ + assert.sameValue(e, 42, "bad exception: " + e); +} + + +/* 5. If IsCallable(toISO) is false, throw a TypeError exception. */ +try +{ + var r = dateToJSON.call({ toISOString: null }); + throw new Error("didn't throw, returned: " + r); +} +catch (e) +{ + assert.sameValue(e instanceof TypeError, true, "bad exception: " + e); +} + +try +{ + var r = dateToJSON.call({ toISOString: undefined }); + throw new Error("didn't throw, returned: " + r); +} +catch (e) +{ + assert.sameValue(e instanceof TypeError, true, "bad exception: " + e); +} + +try +{ + var r = dateToJSON.call({ toISOString: "oogabooga" }); + throw new Error("didn't throw, returned: " + r); +} +catch (e) +{ + assert.sameValue(e instanceof TypeError, true, "bad exception: " + e); +} + +try +{ + var r = dateToJSON.call({ toISOString: Math.PI }); + throw new Error("didn't throw, returned: " + r); +} +catch (e) +{ + assert.sameValue(e instanceof TypeError, true, "bad exception: " + e); +} + + +/* + * 6. Return the result of calling the [[Call]] internal method of toISO with O + * as the this value and an empty argument list. + */ +var o = + { + toISOString: function(a) + { + called = true; + assert.sameValue(this, o); + assert.sameValue(a, undefined); + assert.sameValue(arguments.length, 0); + return obj; + } + }; +var obj = {}; +called = false; +assert.sameValue(dateToJSON.call(o), obj, "should have gotten obj back"); +assert.sameValue(called, true); + + +/******************************************************************************/ + +print("All tests passed!"); diff --git a/test/staging/sm/Date/toPrimitive.js b/test/staging/sm/Date/toPrimitive.js new file mode 100644 index 0000000000..408e8b7fd1 --- /dev/null +++ b/test/staging/sm/Date/toPrimitive.js @@ -0,0 +1,72 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-Date-shell.js, sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +// ES6 20.3.4.45 Date.prototype[@@toPrimitive](hint) + +// The toPrimitive method throws if the this value isn't an object. +var toPrimitive = Date.prototype[Symbol.toPrimitive]; +assertThrowsInstanceOf(() => toPrimitive.call(undefined, "default"), TypeError); +assertThrowsInstanceOf(() => toPrimitive.call(3, "default"), TypeError); + +// It doesn't have to be a Date object, though. +var obj = { + toString() { return "str"; }, + valueOf() { return "val"; } +}; +assert.sameValue(toPrimitive.call(obj, "number"), "val"); +assert.sameValue(toPrimitive.call(obj, "string"), "str"); +assert.sameValue(toPrimitive.call(obj, "default"), "str"); + +// It throws if the hint argument is missing or not one of the three allowed values. +assertThrowsInstanceOf(() => toPrimitive.call(obj), TypeError); +assertThrowsInstanceOf(() => toPrimitive.call(obj, undefined), TypeError); +assertThrowsInstanceOf(() => toPrimitive.call(obj, "boolean"), TypeError); +assertThrowsInstanceOf(() => toPrimitive.call(obj, ["number"]), TypeError); +assertThrowsInstanceOf(() => toPrimitive.call(obj, {toString() { throw "FAIL"; }}), TypeError); + +// The next few tests cover the OrdinaryToPrimitive algorithm, specified in +// ES6 7.1.1 ToPrimitive(input [, PreferredType]). + +// Date.prototype.toString or .valueOf can be overridden. +var dateobj = new Date(); +Date.prototype.toString = function () { + assert.sameValue(this, dateobj); + return 14; +}; +Date.prototype.valueOf = function () { + return "92"; +}; +assert.sameValue(dateobj[Symbol.toPrimitive]("number"), "92"); +assert.sameValue(dateobj[Symbol.toPrimitive]("string"), 14); +assert.sameValue(dateobj[Symbol.toPrimitive]("default"), 14); +assert.sameValue(dateobj == 14, true); // equality comparison: passes "default" + +// If this.toString is a non-callable value, this.valueOf is called instead. +Date.prototype.toString = {}; +assert.sameValue(dateobj[Symbol.toPrimitive]("string"), "92"); +assert.sameValue(dateobj[Symbol.toPrimitive]("default"), "92"); + +// And vice versa. +Date.prototype.toString = function () { return 15; }; +Date.prototype.valueOf = "ponies"; +assert.sameValue(dateobj[Symbol.toPrimitive]("number"), 15); + +// If neither is callable, it throws a TypeError. +Date.prototype.toString = "ponies"; +assertThrowsInstanceOf(() => dateobj[Symbol.toPrimitive]("default"), TypeError); + +// Surface features. +assert.sameValue(toPrimitive.name, "[Symbol.toPrimitive]"); +var desc = Object.getOwnPropertyDescriptor(Date.prototype, Symbol.toPrimitive); +assert.sameValue(desc.configurable, true); +assert.sameValue(desc.enumerable, false); +assert.sameValue(desc.writable, false); + diff --git a/test/staging/sm/Date/toString-generic.js b/test/staging/sm/Date/toString-generic.js new file mode 100644 index 0000000000..1c12f86bc9 --- /dev/null +++ b/test/staging/sm/Date/toString-generic.js @@ -0,0 +1,24 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-Date-shell.js, sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +var BUGNUMBER = 861219; +var summary = 'Date.prototype.toString is a generic function'; + +// Revised in ECMA 2018, Date.prototype.toString is no longer generic (bug 1381433). + +print(BUGNUMBER + ": " + summary); + +for (var thisValue of [{}, [], /foo/, Date.prototype, new Proxy(new Date(), {})]) + assertThrowsInstanceOf(() => Date.prototype.toString.call(thisValue), TypeError); + +for (var prim of [null, undefined, 0, 1.2, true, false, "foo", Symbol.iterator]) + assertThrowsInstanceOf(() => Date.prototype.toString.call(prim), TypeError); + diff --git a/test/staging/sm/Date/two-digit-years.js b/test/staging/sm/Date/two-digit-years.js new file mode 100644 index 0000000000..01215220f4 --- /dev/null +++ b/test/staging/sm/Date/two-digit-years.js @@ -0,0 +1,76 @@ +/* + * Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/licenses/publicdomain/ + */ + +/*--- +includes: [sm/non262-Date-shell.js, sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +/* + * For the sake of cross compatibility with other implementations we + * implement date parsing heuristics which support single and double + * digit years. See bug: 1265136 + */ + +/************** + * BEGIN TEST * + **************/ + +for (let year of Array(100).keys()) { + for (let month of Array(12).keys()) { + for (let day of Array(31).keys()) { + let fullYear = year >= 50 ? year + 1900 : year + 2000; + let fullDate = new Date(`${month + 1}/${day + 1}/${fullYear}`); + + // mm/dd/yy + let d1 = new Date(`${month + 1}/${day + 1}/${year}`); + assert.sameValue(d1.getTime(), fullDate.getTime()) + + // yy/mm/dd + let d2 = new Date(`${year}/${month + 1}/${day + 1}`); + if (year > 31) { + assert.sameValue(d2.getTime(), fullDate.getTime()) + } else if (year > 12) { + assert.sameValue(d2.getTime(), new Date(NaN).getTime()) + } + } + } +} + +assert.sameValue(new Date("99/1/99").getTime(), new Date(NaN).getTime()); +assert.sameValue(new Date("13/13/13").getTime(), new Date(NaN).getTime()); +assert.sameValue(new Date("0/10/0").getTime(), new Date(NaN).getTime()); + +// Written months. +for (let year of Array(1000).keys()) { + let fullDate = new Date(`5/1/${year}`); + let d1 = new Date(`may 1 ${year}`); + let d2 = new Date(`1 may ${year}`); + let d3 = new Date(`1 ${year} may`); + + assert.sameValue(d1.getTime(), fullDate.getTime()) + assert.sameValue(d2.getTime(), fullDate.getTime()) + assert.sameValue(d3.getTime(), fullDate.getTime()) + + if (year > 31) { + let d4 = new Date(`may ${year} 1`); + let d5 = new Date(`${year} may 1`); + let d6 = new Date(`${year} 1 may`); + + assert.sameValue(d4.getTime(), fullDate.getTime()) + assert.sameValue(d5.getTime(), fullDate.getTime()) + assert.sameValue(d6.getTime(), fullDate.getTime()) + } +} + +assert.sameValue(new Date("may 1999 1999").getTime(), new Date(NaN).getTime()); +assert.sameValue(new Date("may 0 0").getTime(), new Date(NaN).getTime()); + +/******************************************************************************/ + +print("Tests complete"); diff --git a/test/staging/sm/Error/AggregateError.js b/test/staging/sm/Error/AggregateError.js new file mode 100644 index 0000000000..b2de967956 --- /dev/null +++ b/test/staging/sm/Error/AggregateError.js @@ -0,0 +1,89 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [compareArray.js, sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +assert.sameValue(typeof AggregateError, "function"); +assert.sameValue(Object.getPrototypeOf(AggregateError), Error); +assert.sameValue(AggregateError.name, "AggregateError"); +assert.sameValue(AggregateError.length, 2); + +assert.sameValue(Object.getPrototypeOf(AggregateError.prototype), Error.prototype); +assert.sameValue(AggregateError.prototype.name, "AggregateError"); +assert.sameValue(AggregateError.prototype.message, ""); + +// The |errors| argument is mandatory. +assertThrowsInstanceOf(() => new AggregateError(), TypeError); +assertThrowsInstanceOf(() => AggregateError(), TypeError); + +// The .errors data property is an array object. +{ + let err = new AggregateError([]); + + let {errors} = err; + assert.sameValue(Array.isArray(errors), true); + assert.sameValue(errors.length, 0); + + // The errors object is modifiable. + errors.push(123); + assert.sameValue(errors.length, 1); + assert.sameValue(errors[0], 123); + assert.sameValue(err.errors[0], 123); + + // The property is writable. + err.errors = undefined; + assert.sameValue(err.errors, undefined); +} + +// The errors argument can be any iterable. +{ + function* g() { yield* [1, 2, 3]; } + + let {errors} = new AggregateError(g()); + assert.compareArray(errors, [1, 2, 3]); +} + +// The message property is populated by the second argument. +{ + let err; + + err = new AggregateError([]); + assert.sameValue(err.message, ""); + + err = new AggregateError([], "my message"); + assert.sameValue(err.message, "my message"); +} + +{ + assert.sameValue("errors" in AggregateError.prototype, false); + + const { + configurable, + enumerable, + value, + writable + } = Object.getOwnPropertyDescriptor(new AggregateError([]), "errors"); + assert.sameValue(configurable, true); + assert.sameValue(enumerable, false); + assert.sameValue(writable, true); + assert.sameValue(value.length, 0); + + const g = createNewGlobal(); + + let obj = {}; + let errors = new g.AggregateError([obj]).errors; + + assert.sameValue(errors.length, 1); + assert.sameValue(errors[0], obj); + + // The prototype is |g.Array.prototype| in the cross-compartment case. + let proto = Object.getPrototypeOf(errors); + assert.sameValue(proto === g.Array.prototype, true); +} + diff --git a/test/staging/sm/Error/constructor-ordering.js b/test/staging/sm/Error/constructor-ordering.js new file mode 100644 index 0000000000..b2ce16d4e8 --- /dev/null +++ b/test/staging/sm/Error/constructor-ordering.js @@ -0,0 +1,26 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +var order = 0; +function assertOrdering(ordering) { + assert.sameValue(order, ordering); + order++; +} + +// Spec mandates that the prototype is looked up /before/ we toString the +// argument. +var handler = { get() { assertOrdering(0); return Error.prototype } }; +var errorProxy = new Proxy(Error, handler); + +var toStringable = { toString() { assertOrdering(1); return "Argument"; } }; + +new errorProxy(toStringable); + diff --git a/test/staging/sm/Error/constructor-proto.js b/test/staging/sm/Error/constructor-proto.js new file mode 100644 index 0000000000..0c6aa0f71a --- /dev/null +++ b/test/staging/sm/Error/constructor-proto.js @@ -0,0 +1,25 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +const nativeErrors = [ + EvalError, + RangeError, + ReferenceError, + SyntaxError, + TypeError, + URIError +]; + +assert.sameValue(Reflect.getPrototypeOf(Error), Function.prototype) + +for (const error of nativeErrors) + assert.sameValue(Reflect.getPrototypeOf(error), Error); + diff --git a/test/staging/sm/Error/prototype-properties.js b/test/staging/sm/Error/prototype-properties.js new file mode 100644 index 0000000000..b67661df41 --- /dev/null +++ b/test/staging/sm/Error/prototype-properties.js @@ -0,0 +1,34 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +const nativeErrors = [ + EvalError, + RangeError, + ReferenceError, + SyntaxError, + TypeError, + URIError +]; + +const ownKeys = Reflect.ownKeys(Error.prototype); +for (const expected of ["constructor", "message", "name", "toString"]) { + assert.sameValue(ownKeys.includes(expected), true, "Error.prototype should have a key named " + expected); +} +assert.sameValue(Error.prototype.name, "Error"); +assert.sameValue(Error.prototype.message, ""); + +for (const error of nativeErrors) { + assert.sameValue(Reflect.ownKeys(error.prototype).sort().toString(), "constructor,message,name"); + assert.sameValue(error.prototype.name, error.name); + assert.sameValue(error.prototype.message, ""); + assert.sameValue(error.prototype.constructor, error); +} + diff --git a/test/staging/sm/Error/prototype.js b/test/staging/sm/Error/prototype.js new file mode 100644 index 0000000000..99e8ee30fb --- /dev/null +++ b/test/staging/sm/Error/prototype.js @@ -0,0 +1,26 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +const nativeErrors = [ + EvalError, + RangeError, + ReferenceError, + SyntaxError, + TypeError, + URIError +]; + +assert.sameValue(Reflect.getPrototypeOf(Error.prototype), Object.prototype) + +for (const error of nativeErrors) { + assert.sameValue(Reflect.getPrototypeOf(error.prototype), Error.prototype); +} + diff --git a/test/staging/sm/Exceptions/error-expando-reconfigure.js b/test/staging/sm/Exceptions/error-expando-reconfigure.js new file mode 100644 index 0000000000..5996b3d546 --- /dev/null +++ b/test/staging/sm/Exceptions/error-expando-reconfigure.js @@ -0,0 +1,33 @@ +/* + * Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/licenses/publicdomain/ + */ + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +var gTestfile = "error-expando-reconfigure.js" +//----------------------------------------------------------------------------- +var BUGNUMBER = 961494; +var summary = + "Reconfiguring the first expando property added to an Error object " + + "shouldn't assert"; + +print(BUGNUMBER + ": " + summary); + +/************** + * BEGIN TEST * + **************/ + +var err = new Error(); // no message argument => no err.message property +err.expando = 17; +Object.defineProperty(err, "expando", { configurable: false }); + +/******************************************************************************/ + +print("Tests complete"); diff --git a/test/staging/sm/Exceptions/error-property-enumerability.js b/test/staging/sm/Exceptions/error-property-enumerability.js new file mode 100644 index 0000000000..10184a9fc3 --- /dev/null +++ b/test/staging/sm/Exceptions/error-property-enumerability.js @@ -0,0 +1,37 @@ +/* + * Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/licenses/publicdomain/ + */ + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +var errors = ["Error", "EvalError", "RangeError", "ReferenceError", + "SyntaxError", "TypeError", "URIError"]; + +for (var i = 0; i < errors.length; i++) { + var error = this[errors[i]]; + + var desc = Object.getOwnPropertyDescriptor(error.prototype, "name"); + assert.sameValue(!!desc, true, errors[i] + ".prototype.name should exist"); + assert.sameValue((desc || {}).enumerable, false, errors[i] + ".prototype.name should not be enumerable"); + + desc = Object.getOwnPropertyDescriptor(error.prototype, "message"); + assert.sameValue(!!desc, true, errors[i] + ".prototype.message should exist"); + assert.sameValue((desc || {}).enumerable, false, errors[i] + ".prototype.message should not be enumerable"); + + var instance = new error; + desc = Object.getOwnPropertyDescriptor(instance, "message"); + assert.sameValue(!!desc, false, "new " + errors[i] + ".message should not exist"); + + instance = new error("a message"); + desc = Object.getOwnPropertyDescriptor(instance, "message"); + assert.sameValue(!!desc, true, "new " + errors[i] + "(...).message should exist"); + assert.sameValue((desc || {}).enumerable, false, "new " + errors[i] + "(...).message should not be enumerable"); +} + diff --git a/test/staging/sm/Function/10.2.1.1.6.js b/test/staging/sm/Function/10.2.1.1.6.js new file mode 100644 index 0000000000..684c8b0976 --- /dev/null +++ b/test/staging/sm/Function/10.2.1.1.6.js @@ -0,0 +1,42 @@ +/* + * Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/licenses/publicdomain/ + */ + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +function strictThis() { 'use strict'; return this; } + +/* Check that calls of flat closure slots get the right |this|. */ +function flat(g) { + function h() { return g(); } + return h; +} +assert.sameValue(flat(strictThis)(), undefined); + +/* Check that calls up upvars get the right |this|. */ +function upvar(f) { + function h() { + return f(); + } + return h(); +} +assert.sameValue(upvar(strictThis), undefined); + +/* Check that calls to with-object properties get an appropriate 'this'. */ +var obj = { f: strictThis }; +with (obj) { + /* + * The method won't compile anything containing a 'with', but it can + * compile 'g'. + */ + function g() { return f(); } + assert.sameValue(g(), obj); +} + diff --git a/test/staging/sm/Function/15.3.4.3-01.js b/test/staging/sm/Function/15.3.4.3-01.js new file mode 100644 index 0000000000..0173747ba5 --- /dev/null +++ b/test/staging/sm/Function/15.3.4.3-01.js @@ -0,0 +1,248 @@ +/* + * Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/licenses/publicdomain/ + */ + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +//----------------------------------------------------------------------------- +var BUGNUMBER = 562448; +var summary = 'Function.prototype.apply should accept any arraylike arguments'; +print(BUGNUMBER + ": " + summary); + +/************** + * BEGIN TEST * + **************/ + +function expectTypeError(fun, msg) +{ + try + { + fun(); + assert.sameValue(true, false, "should have thrown a TypeError"); + } + catch (e) + { + assert.sameValue(e instanceof TypeError, true, msg + "; instead threw " + e); + } +} + +function fun() { } + +var global = this; + + +/* Step 1. */ +var nonfuns = [null, 1, -1, 2.5, "[[Call]]", undefined, true, false, {}]; +for (var i = 0, sz = nonfuns.length; i < sz; i++) +{ + var f = function() + { + Function.prototype.apply.apply(nonfuns[i], [1, 2, 3]); + }; + var msg = + "expected TypeError calling Function.prototype.apply with uncallable this"; + expectTypeError(f, msg); +} + + +/* Step 2. */ +var thisObj = {}; + +var currentThis, currentThisBox; +function funLength() +{ + assert.sameValue(arguments.length, 0, "should have been called with no arguments"); + assert.sameValue(this, currentThis, "wrong this"); +} +function strictFunLength() +{ + "use strict"; + assert.sameValue(arguments.length, 0, "should have been called with no arguments"); + assert.sameValue(this, currentThis, "wrong this"); +} + +currentThis = global; +funLength.apply(); +funLength.apply(undefined); +funLength.apply(undefined, undefined); +funLength.apply(undefined, null); + +currentThis = undefined; +strictFunLength.apply(); +strictFunLength.apply(undefined); +strictFunLength.apply(undefined, undefined); +strictFunLength.apply(undefined, null); + +currentThis = null; +strictFunLength.apply(null); +strictFunLength.apply(null, undefined); +strictFunLength.apply(null, null); + +currentThis = thisObj; +funLength.apply(thisObj); +funLength.apply(thisObj, null); +funLength.apply(thisObj, undefined); +strictFunLength.apply(thisObj); +strictFunLength.apply(thisObj, null); +strictFunLength.apply(thisObj, undefined); + +currentThis = 17; +strictFunLength.apply(17); +strictFunLength.apply(17, null); +strictFunLength.apply(17, undefined); + +function funThisPrimitive() +{ + assert.sameValue(arguments.length, 0, "should have been called with no arguments"); + assert.sameValue(this instanceof currentThisBox, true, + "this not instanceof " + currentThisBox); + assert.sameValue(this.valueOf(), currentThis, + "wrong this valueOf()"); +} + +currentThis = 17; +currentThisBox = Number; +funThisPrimitive.apply(17); +funThisPrimitive.apply(17, undefined); +funThisPrimitive.apply(17, null); + +currentThis = "foopy"; +currentThisBox = String; +funThisPrimitive.apply("foopy"); +funThisPrimitive.apply("foopy", undefined); +funThisPrimitive.apply("foopy", null); + +currentThis = false; +currentThisBox = Boolean; +funThisPrimitive.apply(false); +funThisPrimitive.apply(false, undefined); +funThisPrimitive.apply(false, null); + + +/* Step 3. */ +var nonobjs = [1, -1, 2.5, "[[Call]]", true, false]; +for (var i = 0, sz = nonobjs.length; i < sz; i++) +{ + var f = function() { fun.apply(thisObj, nonobjs[i]); }; + var msg = "should have thrown a TypeError with non-object arguments"; + expectTypeError(f, msg); +} + + +/* Step 4. */ +var args = { get length() { throw 42; } }; +try +{ + fun.apply(thisObj, args); +} +catch (e) +{ + assert.sameValue(e, 42, "didn't throw result of [[Get]] on arguments object"); +} + + +/* + * NB: There was an erratum removing the steps numbered 5 and 7 in the original + * version of ES5; see also the comments in js_fun_apply. + */ + +/* Step 5. */ +var called = false; +var argsObjectLength = + { length: { valueOf: function() { called = true; return 17; } } }; + +fun.apply({}, argsObjectLength); +assert.sameValue(called, true, "should have been set in valueOf called via ToUint32"); + +var upvar = "unset"; +var argsObjectPrimitiveLength = + { + length: + { + valueOf: function() { upvar = "valueOf"; return {}; }, + toString: function() + { + upvar = upvar === "valueOf" ? "both" : "toString"; + return 17; + } + } + }; +fun.apply({}, argsObjectPrimitiveLength); +assert.sameValue(upvar, "both", "didn't call all hooks properly"); + + +/* Step 6-9. */ +var seenThis, res, steps; +var argsAccessors = + { + length: 4, + get 0() { steps.push("0"); return 1; }, + get 1() { steps.push("1"); return 2; }, + // make sure values shine through holes + get 3() { steps.push("3"); return 8; }, + }; + +Object.prototype[2] = 729; + +seenThis = "not seen"; +function argsAsArray() +{ + seenThis = this; + steps.push(Math.PI); + return Array.prototype.map.call(arguments, function(v) { return v; }); +} + +steps = []; +res = argsAsArray.apply(thisObj, argsAccessors); +assert.sameValue(seenThis, thisObj, "saw wrong this"); + +assert.sameValue(steps.length, 4, "wrong steps: " + steps); +assert.sameValue(steps[0], "0", "bad step 0"); +assert.sameValue(steps[1], "1", "bad step 1"); +assert.sameValue(steps[2], "3", "bad step 3"); +assert.sameValue(steps[3], Math.PI, "bad last step"); + +assert.sameValue(res.length, 4, "wrong return: " + res); +assert.sameValue(res[0], 1, "wrong ret[0]"); +assert.sameValue(res[1], 2, "wrong ret[0]"); +assert.sameValue(res[2], 729, "wrong ret[0]"); +assert.sameValue(res[3], 8, "wrong ret[0]"); + +seenThis = "not seen"; +function strictArgsAsArray() +{ + "use strict"; + seenThis = this; + steps.push(NaN); + return Array.prototype.map.call(arguments, function(v) { return v; }); +} + +steps = []; +res = strictArgsAsArray.apply(null, argsAccessors); +assert.sameValue(seenThis, null, "saw wrong this"); + +assert.sameValue(steps.length, 4, "wrong steps: " + steps); +assert.sameValue(steps[0], "0", "bad step 0"); +assert.sameValue(steps[1], "1", "bad step 1"); +assert.sameValue(steps[2], "3", "bad step 3"); +assert.sameValue(steps[3], 0 / 0, "bad last step"); + +assert.sameValue(res.length, 4, "wrong return: " + res); +assert.sameValue(res[0], 1, "wrong ret[0]"); +assert.sameValue(res[1], 2, "wrong ret[0]"); +assert.sameValue(res[2], 729, "wrong ret[0]"); +assert.sameValue(res[3], 8, "wrong ret[0]"); + +strictArgsAsArray.apply(17, argsAccessors); +assert.sameValue(seenThis, 17, "saw wrong this"); + +/******************************************************************************/ + +print("All tests passed!"); diff --git a/test/staging/sm/Function/Function-prototype.js b/test/staging/sm/Function/Function-prototype.js new file mode 100644 index 0000000000..a9ca8df4e8 --- /dev/null +++ b/test/staging/sm/Function/Function-prototype.js @@ -0,0 +1,20 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [deepEqual.js, sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +var desc = Object.getOwnPropertyDescriptor(Function.prototype, "length"); +assert.deepEqual(desc, + {value: 0, writable: false, enumerable: false, configurable: true}); + +assert.sameValue(Function.prototype.prototype, undefined); +assert.sameValue(Function.prototype.callee, undefined); +assertThrowsInstanceOf(() => Function.prototype.caller, TypeError); +assertThrowsInstanceOf(() => Function.prototype.arguments, TypeError); + diff --git a/test/staging/sm/Function/Function-with-eval.js b/test/staging/sm/Function/Function-with-eval.js new file mode 100644 index 0000000000..80655f729d --- /dev/null +++ b/test/staging/sm/Function/Function-with-eval.js @@ -0,0 +1,30 @@ +/* + * Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/licenses/publicdomain/ + */ + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +assert.sameValue(new Function( + "eval('var foo = 915805');" + + "return foo;" + )(), + 915805); + +assert.sameValue(new Function( + "eval('function foo() {" + + "return 915805;" + + "}');" + + "return foo;" + )()(), + 915805); + +/******************************************************************************/ + +print("Tests complete"); diff --git a/test/staging/sm/Function/arguments-caller-callee.js b/test/staging/sm/Function/arguments-caller-callee.js new file mode 100644 index 0000000000..84e7640e68 --- /dev/null +++ b/test/staging/sm/Function/arguments-caller-callee.js @@ -0,0 +1,69 @@ +/* + * Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/licenses/publicdomain/ + */ + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +var gTestfile = 'arguments-caller-callee.js'; +var BUGNUMBER = 514563; +var summary = "arguments.caller and arguments.callee are poison pills in ES5, " + + "later changed in ES2017 to only poison pill arguments.callee."; + +print(BUGNUMBER + ": " + summary); + +/************** + * BEGIN TEST * + **************/ + +// behavior + +function expectTypeError(fun) +{ + try + { + fun(); + throw new Error("didn't throw"); + } + catch (e) + { + assert.sameValue(e instanceof TypeError, true, + "expected TypeError calling function" + + ("name" in fun ? " " + fun.name : "") + ", instead got: " + e); + } +} + +function bar() { "use strict"; return arguments; } +assert.sameValue(bar().caller, undefined); // No error when accessing arguments.caller in ES2017+ +expectTypeError(function barCallee() { bar().callee; }); + +function baz() { return arguments; } +assert.sameValue(baz().callee, baz); + + +// accessor identity + +function strictMode() { "use strict"; return arguments; } +var canonicalTTE = Object.getOwnPropertyDescriptor(strictMode(), "callee").get; + +var args = strictMode(); + +var argsCaller = Object.getOwnPropertyDescriptor(args, "caller"); +assert.sameValue(argsCaller, undefined); + +var argsCallee = Object.getOwnPropertyDescriptor(args, "callee"); +assert.sameValue("get" in argsCallee, true); +assert.sameValue("set" in argsCallee, true); +assert.sameValue(argsCallee.get, canonicalTTE); +assert.sameValue(argsCallee.set, canonicalTTE); + + +/******************************************************************************/ + +print("All tests passed!"); diff --git a/test/staging/sm/Function/arguments-extra-property.js b/test/staging/sm/Function/arguments-extra-property.js new file mode 100644 index 0000000000..24c2680a1f --- /dev/null +++ b/test/staging/sm/Function/arguments-extra-property.js @@ -0,0 +1,42 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +var BUGNUMBER = 1263811; +var summary = "GetElem for modified arguments shouldn't be optimized to get original argument."; + +print(BUGNUMBER + ": " + summary); + +function testModifyFirst() { + function f() { + Object.defineProperty(arguments, 1, { value: 30 }); + assert.sameValue(arguments[1], 30); + } + for (let i = 0; i < 10; i++) + f(10, 20); +} +testModifyFirst(); + +function testModifyLater() { + function f() { + var ans = 20; + for (let i = 0; i < 10; i++) { + if (i == 5) { + Object.defineProperty(arguments, 1, { value: 30 }); + ans = 30; + } + assert.sameValue(arguments[1], ans); + } + } + for (let i = 0; i < 10; i++) + f(10, 20); +} +testModifyLater(); + diff --git a/test/staging/sm/Function/arguments-iterator.js b/test/staging/sm/Function/arguments-iterator.js new file mode 100644 index 0000000000..2e05a291be --- /dev/null +++ b/test/staging/sm/Function/arguments-iterator.js @@ -0,0 +1,176 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [deepEqual.js, sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +var BUGNUMBER = 992617; +var summary = "Implement arguments[@@iterator]."; + +print(BUGNUMBER + ": " + summary); + +// MappedArgumentsObject +let mapped = [ + function(a, b, c) { + assert.sameValue(Symbol.iterator in arguments, true); + delete arguments[Symbol.iterator]; + assert.sameValue(Symbol.iterator in arguments, false); + }, + function(a, b, c) { + delete arguments[Symbol.iterator]; + assert.sameValue(Symbol.iterator in arguments, false); + }, + function(a, b, c) { + arguments[Symbol.iterator] = 10; + delete arguments[Symbol.iterator]; + assert.sameValue(Symbol.iterator in arguments, false); + }, + function(a, b, c) { + Object.defineProperty(arguments, Symbol.iterator, { + value: 10, writable: true, enumerable: true, configurable: true + }); + delete arguments[Symbol.iterator]; + assert.sameValue(Symbol.iterator in arguments, false); + }, + function(a, b, c) { + assert.sameValue(arguments[Symbol.iterator], Array.prototype[Symbol.iterator]); + }, + function(a, b, c) { + assert.sameValue(arguments[Symbol.iterator].name, "values"); + }, + function(a, b, c) { + var desc = Object.getOwnPropertyDescriptor(arguments, Symbol.iterator); + assert.sameValue("value" in desc, true); + assert.sameValue(desc.value, Array.prototype[Symbol.iterator]); + assert.sameValue(desc.writable, true); + assert.sameValue(desc.enumerable, false); + assert.sameValue(desc.configurable, true); + }, + function(a, b, c) { + var iter = arguments[Symbol.iterator](); + assert.deepEqual(iter.next(), { value: 10, done: false }); + assert.deepEqual(iter.next(), { value: 20, done: false }); + assert.deepEqual(iter.next(), { value: 30, done: false }); + assert.deepEqual(iter.next(), { value: undefined, done: true }); + }, + function(a, b, c) { + assert.deepEqual([...arguments], [10, 20, 30]); + }, + function(a, b, c) { + b = 40; + assert.deepEqual([...arguments], [10, 40, 30]); + }, + function(a, b, c) { + arguments.length = 4; + assert.deepEqual([...arguments], [10, 20, 30, undefined]); + }, + function(a, b, c) { + arguments[5] = 50; + assert.deepEqual([...arguments], [10, 20, 30]); + }, + function(a, b, c) { + arguments[Symbol.iterator] = function*() { + yield 40; + yield 50; + yield 60; + }; + assert.deepEqual([...arguments], [40, 50, 60]); + }, +]; +for (let f of mapped) { + f(10, 20, 30); +} + +var g1 = createNewGlobal(); +assert.sameValue(g1.eval(` +function f(a, b, c) { + return arguments[Symbol.iterator].name; +} +f(1, 2, 3); +`), "values"); + +// UnmappedArgumentsObject +let unmapped = [ + function([a], b, c) { + assert.sameValue(Symbol.iterator in arguments, true); + delete arguments[Symbol.iterator]; + assert.sameValue(Symbol.iterator in arguments, false); + }, + function([a], b, c) { + delete arguments[Symbol.iterator]; + assert.sameValue(Symbol.iterator in arguments, false); + }, + function([a], b, c) { + arguments[Symbol.iterator] = 10; + delete arguments[Symbol.iterator]; + assert.sameValue(Symbol.iterator in arguments, false); + }, + function([a], b, c) { + Object.defineProperty(arguments, Symbol.iterator, { + value: 10, writable: true, enumerable: true, configurable: true + }); + delete arguments[Symbol.iterator]; + assert.sameValue(Symbol.iterator in arguments, false); + }, + function([a], b, c) { + assert.sameValue(arguments[Symbol.iterator], Array.prototype[Symbol.iterator]); + }, + function([a], b, c) { + assert.sameValue(arguments[Symbol.iterator].name, "values"); + }, + function([a], b, c) { + var desc = Object.getOwnPropertyDescriptor(arguments, Symbol.iterator); + assert.sameValue("value" in desc, true); + assert.sameValue(desc.value, Array.prototype[Symbol.iterator]); + assert.sameValue(desc.writable, true); + assert.sameValue(desc.enumerable, false); + assert.sameValue(desc.configurable, true); + }, + function([a], b, c) { + var iter = arguments[Symbol.iterator](); + assert.deepEqual(iter.next(), { value: [10], done: false }); + assert.deepEqual(iter.next(), { value: 20, done: false }); + assert.deepEqual(iter.next(), { value: 30, done: false }); + assert.deepEqual(iter.next(), { value: undefined, done: true }); + }, + function([a], b, c) { + assert.deepEqual([...arguments], [[10], 20, 30]); + }, + function([a], b, c) { + b = 40; + assert.deepEqual([...arguments], [[10], 20, 30]); + }, + function([a], b, c) { + arguments.length = 4; + assert.deepEqual([...arguments], [[10], 20, 30, undefined]); + }, + function([a], b, c) { + arguments[5] = 50; + assert.deepEqual([...arguments], [[10], 20, 30]); + }, + function([a], b, c) { + arguments[Symbol.iterator] = function*() { + yield 40; + yield 50; + yield 60; + }; + assert.deepEqual([...arguments], [40, 50, 60]); + }, +]; +for (let f of unmapped) { + f([10], 20, 30); +} + +var g2 = createNewGlobal(); +assert.sameValue(g2.eval(` +function f([a], b, c) { + return arguments[Symbol.iterator].name; +} +f([1], 2, 3); +`), "values"); + diff --git a/test/staging/sm/Function/arguments-parameter-shadowing.js b/test/staging/sm/Function/arguments-parameter-shadowing.js new file mode 100644 index 0000000000..d68c73d174 --- /dev/null +++ b/test/staging/sm/Function/arguments-parameter-shadowing.js @@ -0,0 +1,31 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +// Test that var declarations of arguments "shadows" the arguments binding +// used in parameter expressions. + +function g8(h = () => arguments) { + var arguments = 0; + assert.sameValue(arguments, 0); + assert.sameValue(arguments === h(), false); +} +g8(); + +function g9(h = () => arguments) { + var arguments; + assert.sameValue(void 0 === arguments, false); + assert.sameValue(h(), arguments); + arguments = 0; + assert.sameValue(arguments, 0); + assert.sameValue(arguments === h(), false); +} +g9(); + diff --git a/test/staging/sm/Function/arguments-property-attributes.js b/test/staging/sm/Function/arguments-property-attributes.js new file mode 100644 index 0000000000..12eb714b50 --- /dev/null +++ b/test/staging/sm/Function/arguments-property-attributes.js @@ -0,0 +1,103 @@ +/* + * Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/licenses/publicdomain/ + */ + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +var gTestfile = 'arguments-property-attributes.js'; +var BUGNUMBER = 516255; +var summary = "Attributes for properties of arguments objects"; + +print(BUGNUMBER + ": " + summary); + +/************** + * BEGIN TEST * + **************/ + +// normal + +function args() { return arguments; } +var a = args(0, 1); + +var argProps = Object.getOwnPropertyNames(a).sort(); +assert.sameValue(argProps.indexOf("callee") >= 0, true); +assert.sameValue(argProps.indexOf("0") >= 0, true); +assert.sameValue(argProps.indexOf("1") >= 0, true); +assert.sameValue(argProps.indexOf("length") >= 0, true); + +var calleeDesc = Object.getOwnPropertyDescriptor(a, "callee"); +assert.sameValue(calleeDesc.value, args); +assert.sameValue(calleeDesc.writable, true); +assert.sameValue(calleeDesc.enumerable, false); +assert.sameValue(calleeDesc.configurable, true); + +var zeroDesc = Object.getOwnPropertyDescriptor(a, "0"); +assert.sameValue(zeroDesc.value, 0); +assert.sameValue(zeroDesc.writable, true); +assert.sameValue(zeroDesc.enumerable, true); +assert.sameValue(zeroDesc.configurable, true); + +var oneDesc = Object.getOwnPropertyDescriptor(a, "1"); +assert.sameValue(oneDesc.value, 1); +assert.sameValue(oneDesc.writable, true); +assert.sameValue(oneDesc.enumerable, true); +assert.sameValue(oneDesc.configurable, true); + +var lengthDesc = Object.getOwnPropertyDescriptor(a, "length"); +assert.sameValue(lengthDesc.value, 2); +assert.sameValue(lengthDesc.writable, true); +assert.sameValue(lengthDesc.enumerable, false); +assert.sameValue(lengthDesc.configurable, true); + + +// strict + +function strictArgs() { "use strict"; return arguments; } +var sa = strictArgs(0, 1); + +var strictArgProps = Object.getOwnPropertyNames(sa).sort(); +assert.sameValue(strictArgProps.indexOf("callee") >= 0, true); +assert.sameValue(strictArgProps.indexOf("caller") >= 0, false); +assert.sameValue(strictArgProps.indexOf("0") >= 0, true); +assert.sameValue(strictArgProps.indexOf("1") >= 0, true); +assert.sameValue(strictArgProps.indexOf("length") >= 0, true); + +var strictCalleeDesc = Object.getOwnPropertyDescriptor(sa, "callee"); +assert.sameValue(typeof strictCalleeDesc.get, "function"); +assert.sameValue(typeof strictCalleeDesc.set, "function"); +assert.sameValue(strictCalleeDesc.get, strictCalleeDesc.set); +assert.sameValue(strictCalleeDesc.enumerable, false); +assert.sameValue(strictCalleeDesc.configurable, false); + +var strictCallerDesc = Object.getOwnPropertyDescriptor(sa, "caller"); +assert.sameValue(strictCallerDesc, undefined); + +var strictZeroDesc = Object.getOwnPropertyDescriptor(sa, "0"); +assert.sameValue(strictZeroDesc.value, 0); +assert.sameValue(strictZeroDesc.writable, true); +assert.sameValue(strictZeroDesc.enumerable, true); +assert.sameValue(strictZeroDesc.configurable, true); + +var strictOneDesc = Object.getOwnPropertyDescriptor(sa, "1"); +assert.sameValue(strictOneDesc.value, 1); +assert.sameValue(strictOneDesc.writable, true); +assert.sameValue(strictOneDesc.enumerable, true); +assert.sameValue(strictOneDesc.configurable, true); + +var strictLengthDesc = Object.getOwnPropertyDescriptor(sa, "length"); +assert.sameValue(strictLengthDesc.value, 2); +assert.sameValue(strictLengthDesc.writable, true); +assert.sameValue(strictLengthDesc.enumerable, false); +assert.sameValue(strictLengthDesc.configurable, true); + + +/******************************************************************************/ + +print("All tests passed!"); diff --git a/test/staging/sm/Function/arrow-has-duplicated.js b/test/staging/sm/Function/arrow-has-duplicated.js new file mode 100644 index 0000000000..5234061ff5 --- /dev/null +++ b/test/staging/sm/Function/arrow-has-duplicated.js @@ -0,0 +1,25 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +// Make sure duplicated name is allowed in non-strict. +function f0(a, a) { +} + +// SyntaxError should be thrown if arrow function has duplicated name. +assertThrowsInstanceOf(() => eval(` +(a, a) => { +}; +`), SyntaxError); +assertThrowsInstanceOf(() => eval(` +(a, ...a) => { +}; +`), SyntaxError); + diff --git a/test/staging/sm/Function/bound-length-and-name.js b/test/staging/sm/Function/bound-length-and-name.js new file mode 100644 index 0000000000..dcff97cbac --- /dev/null +++ b/test/staging/sm/Function/bound-length-and-name.js @@ -0,0 +1,50 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +var proxy = new Proxy(function() {}, { + getOwnPropertyDescriptor(target, name) { + assert.sameValue(name, "length"); + return {value: 3, configurable: true}; + }, + + get(target, name) { + if (name == "length") + return 3; + if (name == "name") + return "hello world"; + assert.sameValue(false, true); + } +}) + +var bound = Function.prototype.bind.call(proxy); +assert.sameValue(bound.name, "bound hello world"); +assert.sameValue(bound.length, 3); + +var fun = function() {}; +Object.defineProperty(fun, "name", {value: 1337}); +Object.defineProperty(fun, "length", {value: "15"}); +bound = fun.bind(); +assert.sameValue(bound.name, "bound "); +assert.sameValue(bound.length, 0); + +Object.defineProperty(fun, "length", {value: Number.MAX_SAFE_INTEGER}); +bound = fun.bind(); +assert.sameValue(bound.length, Number.MAX_SAFE_INTEGER); + +Object.defineProperty(fun, "length", {value: -100}); +bound = fun.bind(); +assert.sameValue(bound.length, 0); + +fun = function f(a, ...b) { }; +assert.sameValue(fun.length, 1); +bound = fun.bind(); +assert.sameValue(bound.length, 1); + diff --git a/test/staging/sm/Function/bound-non-constructable.js b/test/staging/sm/Function/bound-non-constructable.js new file mode 100644 index 0000000000..92f9f6d510 --- /dev/null +++ b/test/staging/sm/Function/bound-non-constructable.js @@ -0,0 +1,27 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [deepEqual.js, sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +var objects = [ + Math.sin.bind(null), + new Proxy(Math.sin.bind(null), {}), + Function.prototype.bind.call(new Proxy(Math.sin, {})) +] + +for (var obj of objects) { + // Target is not constructable, so a new array should be created internally. + assert.deepEqual(Array.from.call(obj, [1, 2, 3]), [1, 2, 3]); + assert.deepEqual(Array.of.call(obj, 1, 2, 3), [1, 2, 3]); + + // Make sure they are callable, but not constructable. + obj(); + assertThrowsInstanceOf(() => new obj, TypeError); +} + diff --git a/test/staging/sm/Function/builtin-no-construct.js b/test/staging/sm/Function/builtin-no-construct.js new file mode 100644 index 0000000000..60c51ccadc --- /dev/null +++ b/test/staging/sm/Function/builtin-no-construct.js @@ -0,0 +1,58 @@ +/* + * Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/licenses/publicdomain/ + */ + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +function checkMethod(method) { + try { + new method(); + assert.sameValue(0, 1, "not reached " + method); + } catch (e) { + assert.sameValue(e.message.indexOf(" is not a constructor") === -1, false); + } +} + +function checkMethods(proto) { + var names = Object.getOwnPropertyNames(proto); + for (var i = 0; i < names.length; i++) { + var name = names[i]; + if (["constructor", "arguments", "caller"].indexOf(name) >= 0) + continue; + var prop = proto[name]; + if (typeof prop === "function") + checkMethod(prop); + } +} + +checkMethod(Function.prototype); +checkMethods(JSON); +checkMethods(Math); +checkMethods(Proxy); + +var builtin_ctors = [ + Object, Function, Array, String, Boolean, Number, Date, RegExp, Error, + EvalError, RangeError, ReferenceError, SyntaxError, TypeError, URIError, +]; + +for (var i = 0; i < builtin_ctors.length; i++) { + checkMethods(builtin_ctors[i]); + checkMethods(builtin_ctors[i].prototype); +} + +var builtin_funcs = [ + eval, isFinite, isNaN, parseFloat, parseInt, + decodeURI, decodeURIComponent, encodeURI, encodeURIComponent +]; + +for (var i = 0; i < builtin_funcs.length; i++) { + checkMethod(builtin_funcs[i]); +} + diff --git a/test/staging/sm/Function/builtin-no-prototype.js b/test/staging/sm/Function/builtin-no-prototype.js new file mode 100644 index 0000000000..1129de2493 --- /dev/null +++ b/test/staging/sm/Function/builtin-no-prototype.js @@ -0,0 +1,47 @@ +/* + * Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/licenses/publicdomain/ + */ + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +assert.sameValue(undefined, void 0); + +assert.sameValue(Function.prototype.hasOwnProperty('prototype'), false); +assert.sameValue(Function.prototype.prototype, undefined); + +var builtin_ctors = [ + Object, Function, Array, String, Boolean, Number, Date, RegExp, Error, + EvalError, RangeError, ReferenceError, SyntaxError, TypeError, URIError +]; + +for (var i = 0; i < builtin_ctors.length; i++) { + var c = builtin_ctors[i]; + assert.sameValue(typeof c.prototype, (c === Function) ? "function" : "object"); + assert.sameValue(c.prototype.constructor, c); +} + +var builtin_funcs = [ + eval, isFinite, isNaN, parseFloat, parseInt, + decodeURI, decodeURIComponent, encodeURI, encodeURIComponent +]; + +for (var i = 0; i < builtin_funcs.length; i++) { + assert.sameValue(builtin_funcs[i].hasOwnProperty('prototype'), false); + assert.sameValue(builtin_funcs[i].prototype, undefined); +} + +var names = Object.getOwnPropertyNames(Math); +for (var i = 0; i < names.length; i++) { + var m = Math[names[i]]; + if (typeof m === "function") + assert.sameValue(m.prototype, undefined); +} + +assert.sameValue(0, 0, "don't crash"); diff --git a/test/staging/sm/Function/configurable-length-builtins.js b/test/staging/sm/Function/configurable-length-builtins.js new file mode 100644 index 0000000000..c898c43d38 --- /dev/null +++ b/test/staging/sm/Function/configurable-length-builtins.js @@ -0,0 +1,30 @@ +/* + * Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/licenses/publicdomain/ + */ + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +// Deleting .length from a variety of builtin functions works as expected. +for (var fun of [Math.sin, Array.prototype.map, eval]) { + assert.sameValue(delete fun.length, true); + assert.sameValue(fun.hasOwnProperty("length"), false); + assert.sameValue("length" in fun, true); // still inheriting Function.prototype.length + assert.sameValue(fun.length, 0); + + // The inherited property is nonwritable, so assigning still fails + // (silently, in sloppy mode). + fun.length = Math.hypot; + assert.sameValue(fun.length, 0); + + // It can be shadowed via defineProperty. + Object.defineProperty(fun, "length", {value: Math.hypot}); + assert.sameValue(fun.length, Math.hypot); +} + diff --git a/test/staging/sm/Function/configurable-length.js b/test/staging/sm/Function/configurable-length.js new file mode 100644 index 0000000000..cd3d3737e6 --- /dev/null +++ b/test/staging/sm/Function/configurable-length.js @@ -0,0 +1,95 @@ +/* + * Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/licenses/publicdomain/ + */ + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +// Very simple initial test that the "length" property of a function is +// configurable. More thorough tests follow. +var f = function (a1, a2, a3, a4) {}; +assert.sameValue(delete f.length, true); +assert.sameValue(f.hasOwnProperty("length"), false); +assert.sameValue(f.length, 0); // inherited from Function.prototype.length +assert.sameValue(delete Function.prototype.length, true); +assert.sameValue(f.length, undefined); + + +// Now for the details. +// +// Many of these tests are poking at the "resolve hook" mechanism SM uses to +// lazily create this property, which is wonky and deserving of some extra +// skepticism. + +// We've deleted Function.prototype.length. Check that the resolve hook does +// not resurrect it. +assert.sameValue("length" in Function.prototype, false); +Function.prototype.length = 7; +assert.sameValue(Function.prototype.length, 7); +delete Function.prototype.length; +assert.sameValue(Function.prototype.length, undefined); + +// OK, define Function.prototype.length back to its original state per spec, so +// the remaining tests can run in a more typical environment. +Object.defineProperty(Function.prototype, "length", {value: 0, configurable: true}); + +// Check the property descriptor of a function length property. +var g = function f(a1, a2, a3, a4, a5) {}; +var desc = Object.getOwnPropertyDescriptor(g, "length"); +assert.sameValue(desc.configurable, true); +assert.sameValue(desc.enumerable, false); +assert.sameValue(desc.writable, false); +assert.sameValue(desc.value, 5); + +// After deleting the length property, assigning to f.length fails because +// Function.prototype.length is non-writable. In strict mode it would throw. +delete g.length; +g.length = 12; +assert.sameValue(g.hasOwnProperty("length"), false); +assert.sameValue(g.length, 0); + +// After deleting both the length property and Function.prototype.length, +// assigning to f.length creates a new plain old data property. +delete Function.prototype.length; +g.length = 13; +var desc = Object.getOwnPropertyDescriptor(g, "length"); +assert.sameValue(desc.configurable, true); +assert.sameValue(desc.enumerable, true); +assert.sameValue(desc.writable, true); +assert.sameValue(desc.value, 13); + +// Deleting the .length of one instance of a FunctionDeclaration does not +// affect other instances. +function mkfun() { + function fun(a1, a2, a3, a4, a5) {} + return fun; +} +g = mkfun(); +var h = mkfun(); +delete h.length; +assert.sameValue(g.length, 5); +assert.sameValue(mkfun().length, 5); + +// Object.defineProperty on a brand-new function is sufficient to cause the +// LENGTH_RESOLVED flag to be set. +g = mkfun(); +Object.defineProperty(g, "length", {value: 0}); +assert.sameValue(delete g.length, true); +assert.sameValue(g.hasOwnProperty("length"), false); + +// Object.defineProperty on a brand-new function correctly merges new +// attributes with the builtin ones. +g = mkfun(); +Object.defineProperty(g, "length", { value: 42 }); +desc = Object.getOwnPropertyDescriptor(g, "length"); +assert.sameValue(desc.configurable, true); +assert.sameValue(desc.enumerable, false); +assert.sameValue(desc.writable, false); +assert.sameValue(desc.value, 42); + diff --git a/test/staging/sm/Function/constructor-binding.js b/test/staging/sm/Function/constructor-binding.js new file mode 100644 index 0000000000..287ebc3806 --- /dev/null +++ b/test/staging/sm/Function/constructor-binding.js @@ -0,0 +1,20 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +var BUGNUMBER = 636635; +var summary = "A function created by Function constructor shouldn't have anonymous binding"; + +print(BUGNUMBER + ": " + summary); + +assert.sameValue(new Function("return typeof anonymous")(), "undefined"); +assert.sameValue(new Function("return function() { return typeof anonymous; }")()(), "undefined"); +assert.sameValue(new Function("return function() { eval(''); return typeof anonymous; }")()(), "undefined"); + diff --git a/test/staging/sm/Function/create-function-parse-before-getprototype.js b/test/staging/sm/Function/create-function-parse-before-getprototype.js new file mode 100644 index 0000000000..da2a1ddb72 --- /dev/null +++ b/test/staging/sm/Function/create-function-parse-before-getprototype.js @@ -0,0 +1,26 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +var getProtoCalled = false; + +var newTarget = Object.defineProperty(function(){}.bind(), "prototype", { + get() { + getProtoCalled = true; + return null; + } +}); + +assertThrowsInstanceOf(() => { + Reflect.construct(Function, ["@error"], newTarget); +}, SyntaxError); + +assert.sameValue(getProtoCalled, false); + diff --git a/test/staging/sm/Function/function-bind.js b/test/staging/sm/Function/function-bind.js new file mode 100644 index 0000000000..4cd9e3a875 --- /dev/null +++ b/test/staging/sm/Function/function-bind.js @@ -0,0 +1,275 @@ +/* + * Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/licenses/publicdomain/ + */ + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +var gTestfile = 'function-bind.js'; +var BUGNUMBER = 429507; +var summary = "ES5: Function.prototype.bind"; + +print(BUGNUMBER + ": " + summary); + +/************** + * BEGIN TEST * + **************/ + +// ad-hoc testing + +assert.sameValue(Function.prototype.hasOwnProperty("bind"), true); + +var bind = Function.prototype.bind; +assert.sameValue(bind.length, 1); + + +var strictReturnThis = function() { "use strict"; return this; }; + +assert.sameValue(strictReturnThis.bind(undefined)(), undefined); +assert.sameValue(strictReturnThis.bind(null)(), null); + +var obj = {}; +assert.sameValue(strictReturnThis.bind(obj)(), obj); + +assert.sameValue(strictReturnThis.bind(NaN)(), NaN); + +assert.sameValue(strictReturnThis.bind(true)(), true); +assert.sameValue(strictReturnThis.bind(false)(), false); + +assert.sameValue(strictReturnThis.bind("foopy")(), "foopy"); + + +// rigorous, step-by-step testing + +function expectThrowTypeError(fun) +{ + assertThrowsInstanceOf(fun, TypeError); +} + +/* + * 1. Let Target be the this value. + * 2. If IsCallable(Target) is false, throw a TypeError exception. + */ +expectThrowTypeError(function() { bind.call(null); }); +expectThrowTypeError(function() { bind.call(undefined); }); +expectThrowTypeError(function() { bind.call(NaN); }); +expectThrowTypeError(function() { bind.call(0); }); +expectThrowTypeError(function() { bind.call(-0); }); +expectThrowTypeError(function() { bind.call(17); }); +expectThrowTypeError(function() { bind.call(42); }); +expectThrowTypeError(function() { bind.call("foobar"); }); +expectThrowTypeError(function() { bind.call(true); }); +expectThrowTypeError(function() { bind.call(false); }); +expectThrowTypeError(function() { bind.call([]); }); +expectThrowTypeError(function() { bind.call({}); }); + + +/* + * 3. Let A be a new (possibly empty) internal list of all of the argument + * values provided after thisArg (arg1, arg2 etc), in order. + * 4. Let F be a new native ECMAScript object . + * 5. Set all the internal methods, except for [[Get]], of F as specified in + * 8.12. + * 6. Set the [[Get]] internal property of F as specified in 15.3.5.4. + * 7. Set the [[TargetFunction]] internal property of F to Target. + * 8. Set the [[BoundThis]] internal property of F to the value of thisArg. + * 9. Set the [[BoundArgs]] internal property of F to A. + */ +// throughout + + +/* 10. Set the [[Class]] internal property of F to "Function". */ +var toString = Object.prototype.toString; +assert.sameValue(toString.call(function(){}), "[object Function]"); +assert.sameValue(toString.call(function a(){}), "[object Function]"); +assert.sameValue(toString.call(function(a){}), "[object Function]"); +assert.sameValue(toString.call(function a(b){}), "[object Function]"); +assert.sameValue(toString.call(function(){}.bind()), "[object Function]"); +assert.sameValue(toString.call(function a(){}.bind()), "[object Function]"); +assert.sameValue(toString.call(function(a){}.bind()), "[object Function]"); +assert.sameValue(toString.call(function a(b){}.bind()), "[object Function]"); + + +/* + * 11. Set the [[Prototype]] internal property of F to the standard built-in + * Function prototype object as specified in 15.3.3.1. + */ +assert.sameValue(Object.getPrototypeOf(bind.call(function(){})), Function.prototype); +assert.sameValue(Object.getPrototypeOf(bind.call(function a(){})), Function.prototype); +assert.sameValue(Object.getPrototypeOf(bind.call(function(a){})), Function.prototype); +assert.sameValue(Object.getPrototypeOf(bind.call(function a(b){})), Function.prototype); + + +/* + * 12. Set the [[Call]] internal property of F as described in 15.3.4.5.1. + */ +var a = Array.bind(1, 2); +assert.sameValue(a().length, 2); +assert.sameValue(a(4).length, 2); +assert.sameValue(a(4, 8).length, 3); + +function t() { return this; } +var bt = t.bind(t); +assert.sameValue(bt(), t); + +function callee() { return arguments.callee; } +var call = callee.bind(); +assert.sameValue(call(), callee); +assert.sameValue(new call(), callee); + + +/* + * 13. Set the [[Construct]] internal property of F as described in 15.3.4.5.2. + */ +function Point(x, y) +{ + this.x = x; + this.y = y; +} +var YAxisPoint = Point.bind(null, 0) + +assert.sameValue(YAxisPoint.hasOwnProperty("prototype"), false); +var p = new YAxisPoint(5); +assert.sameValue(p.x, 0); +assert.sameValue(p.y, 5); +assert.sameValue(p instanceof Point, true); +assert.sameValue(p instanceof YAxisPoint, true); +assert.sameValue(Object.prototype.toString.call(YAxisPoint), "[object Function]"); +assert.sameValue(YAxisPoint.length, 1); + + +/* + * 14. Set the [[HasInstance]] internal property of F as described in + * 15.3.4.5.3. + */ +function JoinArguments() +{ + this.args = Array.prototype.join.call(arguments, ", "); +} + +var Join1 = JoinArguments.bind(null, 1); +var Join2 = Join1.bind(null, 2); +var Join3 = Join2.bind(null, 3); +var Join4 = Join3.bind(null, 4); +var Join5 = Join4.bind(null, 5); +var Join6 = Join5.bind(null, 6); + +var r = new Join6(7); +assert.sameValue(r instanceof Join6, true); +assert.sameValue(r instanceof Join5, true); +assert.sameValue(r instanceof Join4, true); +assert.sameValue(r instanceof Join3, true); +assert.sameValue(r instanceof Join2, true); +assert.sameValue(r instanceof Join1, true); +assert.sameValue(r instanceof JoinArguments, true); +assert.sameValue(r.args, "1, 2, 3, 4, 5, 6, 7"); + + +/* + * 15. If the [[Class]] internal property of Target is "Function", then + * a. Let L be the length property of Target minus the length of A. + * b. Set the length own property of F to either 0 or L, whichever is larger. + * 16. Else set the length own property of F to 0. + */ +function none() { return arguments.length; } +assert.sameValue(none.bind(1, 2)(3, 4), 3); +assert.sameValue(none.bind(1, 2)(), 1); +assert.sameValue(none.bind(1)(2, 3), 2); +assert.sameValue(none.bind().length, 0); +assert.sameValue(none.bind(null).length, 0); +assert.sameValue(none.bind(null, 1).length, 0); +assert.sameValue(none.bind(null, 1, 2).length, 0); + +function one(a) { } +assert.sameValue(one.bind().length, 1); +assert.sameValue(one.bind(null).length, 1); +assert.sameValue(one.bind(null, 1).length, 0); +assert.sameValue(one.bind(null, 1, 2).length, 0); + +// retch +var br = Object.create(null, { length: { value: 0 } }); +try +{ + br = bind.call(/a/g, /a/g, "aaaa"); +} +catch (e) { /* nothing */ } +assert.sameValue(br.length, 0); + + +/* + * 17. Set the attributes of the length own property of F to the values + * specified in 15.3.5.1. + */ +var len1Desc = + Object.getOwnPropertyDescriptor(function(a, b, c){}.bind(), "length"); +assert.sameValue(len1Desc.value, 3); +assert.sameValue(len1Desc.writable, false); +assert.sameValue(len1Desc.enumerable, false); +assert.sameValue(len1Desc.configurable, true); + +var len2Desc = + Object.getOwnPropertyDescriptor(function(a, b, c){}.bind(null, 2), "length"); +assert.sameValue(len2Desc.value, 2); +assert.sameValue(len2Desc.writable, false); +assert.sameValue(len2Desc.enumerable, false); +assert.sameValue(len2Desc.configurable, true); + + +/* + * 18. Set the [[Extensible]] internal property of F to true. + */ +var bound = (function() { }).bind(); + +var isExtensible = Object.isExtensible || function() { return true; }; +assert.sameValue(isExtensible(bound), true); + +bound.foo = 17; +var fooDesc = Object.getOwnPropertyDescriptor(bound, "foo"); +assert.sameValue(fooDesc.value, 17); +assert.sameValue(fooDesc.writable, true); +assert.sameValue(fooDesc.enumerable, true); +assert.sameValue(fooDesc.configurable, true); + + +/* + * Steps 19-21 are removed from ES6, instead implemented through "arguments" and + * "caller" accessors on Function.prototype. So no own properties, but do check + * for the same observable behavior (modulo where the accessors live). + */ +function strict() { "use strict"; } +function nonstrict() {} + +function testBound(fun) +{ + var boundf = fun.bind(); + + assert.sameValue(Object.getOwnPropertyDescriptor(boundf, "arguments"), undefined, + "should be no arguments property"); + assert.sameValue(Object.getOwnPropertyDescriptor(boundf, "caller"), undefined, + "should be no caller property"); + + expectThrowTypeError(function() { return boundf.arguments; }); + expectThrowTypeError(function() { return boundf.caller; }); +} + +testBound(strict); +testBound(nonstrict); + +var nativeFunctionRegex = /^function\s*\(\)\s*{\s*\[native code\]\s*}$/ +assert.sameValue(nativeFunctionRegex.test((function unbound(){"body"}).bind().toString()), true); + + +/* 22. Return F. */ +var passim = function p(){}.bind(1); +assert.sameValue(typeof passim, "function"); + + +/******************************************************************************/ + +print("All tests passed!"); diff --git a/test/staging/sm/Function/function-call.js b/test/staging/sm/Function/function-call.js new file mode 100644 index 0000000000..849d074ea4 --- /dev/null +++ b/test/staging/sm/Function/function-call.js @@ -0,0 +1,137 @@ +/* + * Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/licenses/publicdomain/ + */ + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +//----------------------------------------------------------------------------- +var BUGNUMBER = 575535; +var summary = 'Function.prototype.call'; +print(BUGNUMBER + ": " + summary); + +/************** + * BEGIN TEST * + **************/ + +function expectTypeError(fun, msg) +{ + try + { + fun(); + assert.sameValue(true, false, "should have thrown a TypeError"); + } + catch (e) + { + assert.sameValue(e instanceof TypeError, true, msg + "; instead threw " + e); + } +} + +function fun() { } + +var global = this; + +assert.sameValue(Function.prototype.call.length, 1); + + +/* Step 1. */ +var nonfuns = [null, 1, -1, 2.5, "[[Call]]", undefined, true, false, {}]; +for (var i = 0, sz = nonfuns.length; i < sz; i++) +{ + var f = function() + { + Function.prototype.call.apply(nonfuns[i]); + }; + var msg = + "expected TypeError calling Function.prototype.call with uncallable this"; + expectTypeError(f, msg); +} + + +/* Steps 2-4. */ +function none() +{ + assert.sameValue(this, global, "bad this"); + assert.sameValue(arguments.length, 0, "wrong arguments"); +} + +none.call(); +none.call(undefined); +none.call(null); + +var seenThis; +function strictNone() +{ + "use strict"; + assert.sameValue(this, seenThis, "bad this"); + assert.sameValue(arguments.length, 0, "wrong arguments"); +} + +seenThis = undefined; +strictNone.call(); +strictNone.call(undefined); + +seenThis = null; +strictNone.call(null); + +seenThis = 17; +strictNone.call(17); + +var seenThisBox, args; +function some() +{ + assert.sameValue(this instanceof seenThisBox, true, + "this not instanceof " + seenThisBox); + assert.sameValue(this.valueOf(), seenThis, + "wrong this valueOf()"); + assert.sameValue(arguments.length, args.length, "wrong arguments count"); + for (var i = 0; i < args.length; i++) + assert.sameValue(arguments[i], args[i], "wrong argument " + i); +} + +seenThis = false; +seenThisBox = Boolean; +args = [8, 6, 7, NaN, undefined, 0.3]; +some.call(false, 8, 6, 7, NaN, undefined, 0.3); + +var obj = {}; + +seenThis = "foo"; +seenThisBox = String; +args = [obj]; +some.call("foo", obj); + +seenThis = obj; +seenThisBox = Object; +some.call(obj, obj); + +function strictSome() +{ + "use strict"; + assert.sameValue(this, seenThis, "wrong this"); + assert.sameValue(arguments.length, args.length, "wrong arguments count"); + for (var i = 0; i < args.length; i++) + assert.sameValue(arguments[i], args[i], "wrong argument " + i); +} + +seenThis = NaN; +args = [8, 6, 7, NaN, undefined, 0.3]; +strictSome.call(NaN, 8, 6, 7, NaN, undefined, 0.3); + +seenThis = "foo"; +args = [obj]; +strictSome.call("foo", obj); + +seenThis = obj; +strictSome.call(obj, obj); + + +/******************************************************************************/ + +print("All tests passed!"); diff --git a/test/staging/sm/Function/function-caller-restrictions.js b/test/staging/sm/Function/function-caller-restrictions.js new file mode 100644 index 0000000000..c0f76d32c2 --- /dev/null +++ b/test/staging/sm/Function/function-caller-restrictions.js @@ -0,0 +1,39 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +// Function#caller restrictions as proposed by +// https://github.com/claudepache/es-legacy-function-reflection/ + +function caller() { + return caller.caller; +} + +assert.sameValue(caller(), null); +assert.sameValue(Reflect.apply(caller, undefined, []), null); + +assert.sameValue([0].map(caller)[0], null); + +(function strict() { + "use strict"; + assert.sameValue(caller(), null); +})(); + +(async function() { + assert.sameValue(caller(), null); +})(); + +assert.sameValue(function*() { + yield caller(); +}().next().value, null); + + +if (typeof assert.sameValue === "function") { +} diff --git a/test/staging/sm/Function/function-caller.js b/test/staging/sm/Function/function-caller.js new file mode 100644 index 0000000000..770dfa598e --- /dev/null +++ b/test/staging/sm/Function/function-caller.js @@ -0,0 +1,50 @@ +/* + * Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/licenses/publicdomain/ + */ + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +var gTestfile = 'function-caller.js'; +var BUGNUMBER = 514581; +var summary = "Function.prototype.caller should throw a TypeError for " + + "strict-mode functions"; + +print(BUGNUMBER + ": " + summary); + +/************** + * BEGIN TEST * + **************/ + +// behavior + +function expectTypeError(fun) +{ + try + { + fun(); + throw new Error("didn't throw"); + } + catch (e) + { + assert.sameValue(e instanceof TypeError, true, + "expected TypeError calling function" + + ("name" in fun ? " " + fun.name : "") + ", instead got: " + e); + } +} + +function bar() { "use strict"; } +expectTypeError(function barCaller() { bar.caller; }); + +function baz() { "use strict"; return 17; } +expectTypeError(function bazCaller() { baz.caller; }); + +/******************************************************************************/ + +print("All tests passed!"); diff --git a/test/staging/sm/Function/function-constructor-toString-arguments-before-parsing-params.js b/test/staging/sm/Function/function-constructor-toString-arguments-before-parsing-params.js new file mode 100644 index 0000000000..ff7e93371f --- /dev/null +++ b/test/staging/sm/Function/function-constructor-toString-arguments-before-parsing-params.js @@ -0,0 +1,30 @@ +/* + * Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/licenses/publicdomain/ + */ + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +//----------------------------------------------------------------------------- +var BUGNUMBER = 920479; +var summary = + "Convert all arguments passed to Function() to string before doing any " + + "parsing of the to-be-created Function's parameters or body text"; + +print(BUGNUMBER + ": " + summary); + +/************** + * BEGIN TEST * + **************/ + +assertThrowsValue(() => Function("@", { toString() { throw 42; } }), 42); + +/******************************************************************************/ + +print("Tests complete"); diff --git a/test/staging/sm/Function/function-name-assignment.js b/test/staging/sm/Function/function-name-assignment.js new file mode 100644 index 0000000000..9913651bf3 --- /dev/null +++ b/test/staging/sm/Function/function-name-assignment.js @@ -0,0 +1,148 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +var BUGNUMBER = 883377; +var summary = "Anonymous function name should be set based on assignment"; + +print(BUGNUMBER + ": " + summary); + +var fooSymbol = Symbol("foo"); +var emptySymbol = Symbol(""); +var undefSymbol = Symbol(); +var globalVar; + +var exprs = [ + ["function() {}", false], + ["function named() {}", true], + ["function*() {}", false], + ["function* named() {}", true], + ["async function() {}", false], + ["async function named() {}", true], + ["() => {}", false], + ["async () => {}", false], + ["class {}", false], + ["class named {}", true], +]; + +function testAssignmentExpression(expr, named) { + eval(` + var assignment; + assignment = ${expr}; + assert.sameValue(assignment.name, named ? "named" : "assignment"); + + globalVar = ${expr}; + assert.sameValue(globalVar.name, named ? "named" : "globalVar"); + + var obj = { dynamic: null }; + with (obj) { + dynamic = ${expr}; + } + assert.sameValue(obj.dynamic.name, named ? "named" : "dynamic"); + + (function namedLambda(param1, param2) { + var assignedToNamedLambda; + assignedToNamedLambda = namedLambda = ${expr}; + assert.sameValue(namedLambda.name, "namedLambda"); + assert.sameValue(assignedToNamedLambda.name, named ? "named" : "namedLambda"); + + param1 = ${expr}; + assert.sameValue(param1.name, named ? "named" : "param1"); + + { + let param1 = ${expr}; + assert.sameValue(param1.name, named ? "named" : "param1"); + + param2 = ${expr}; + assert.sameValue(param2.name, named ? "named" : "param2"); + } + })(); + + { + let nextedLexical1, nextedLexical2; + { + let nextedLexical1 = ${expr}; + assert.sameValue(nextedLexical1.name, named ? "named" : "nextedLexical1"); + + nextedLexical2 = ${expr}; + assert.sameValue(nextedLexical2.name, named ? "named" : "nextedLexical2"); + } + } + `); + + // Not applicable cases: not IsIdentifierRef. + eval(` + var inParen; + (inParen) = ${expr}; + assert.sameValue(inParen.name, named ? "named" : ""); + `); + + // Not applicable cases: not direct RHS. + if (!expr.includes("=>")) { + eval(` + var a = true && ${expr}; + assert.sameValue(a.name, named ? "named" : ""); + `); + } else { + // Arrow function cannot be RHS of &&. + eval(` + var a = true && (${expr}); + assert.sameValue(a.name, named ? "named" : ""); + `); + } + + // Not applicable cases: property. + eval(` + var obj = {}; + + obj.prop = ${expr}; + assert.sameValue(obj.prop.name, named ? "named" : ""); + + obj["literal"] = ${expr}; + assert.sameValue(obj["literal"].name, named ? "named" : ""); + `); + + // Not applicable cases: assigned again. + eval(` + var tmp = [${expr}]; + assert.sameValue(tmp[0].name, named ? "named" : ""); + + var assignment; + assignment = tmp[0]; + assert.sameValue(assignment.name, named ? "named" : ""); + `); +} +for (var [expr, named] of exprs) { + testAssignmentExpression(expr, named); +} + +function testVariableDeclaration(expr, named) { + eval(` + var varDecl = ${expr}; + assert.sameValue(varDecl.name, named ? "named" : "varDecl"); + `); +} +for (var [expr, named] of exprs) { + testVariableDeclaration(expr, named); +} + +function testLexicalBinding(expr, named) { + eval(` + let lexical = ${expr}; + assert.sameValue(lexical.name, named ? "named" : "lexical"); + + const constLexical = ${expr}; + assert.sameValue(constLexical.name, named ? "named" : "constLexical"); + `); +} +for (var [expr, named] of exprs) { + testLexicalBinding(expr, named); +} + diff --git a/test/staging/sm/Function/function-name-binding.js b/test/staging/sm/Function/function-name-binding.js new file mode 100644 index 0000000000..07ee62a2b8 --- /dev/null +++ b/test/staging/sm/Function/function-name-binding.js @@ -0,0 +1,63 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +var BUGNUMBER = 883377; +var summary = "Anonymous function name should be set based on binding pattern"; + +print(BUGNUMBER + ": " + summary); + +var exprs = [ + ["function() {}", false], + ["function named() {}", true], + ["function*() {}", false], + ["function* named() {}", true], + ["async function() {}", false], + ["async function named() {}", true], + ["() => {}", false], + ["async () => {}", false], + ["class {}", false], + ["class named {}", true], +]; + +function testAssignmentProperty(expr, named) { + var f = eval(`(function({ prop1 = ${expr} }) { return prop1; })`); + assert.sameValue(f({}).name, named ? "named" : "prop1"); + + eval(` + var { prop1 = ${expr} } = {}; + assert.sameValue(prop1.name, named ? "named" : "prop1"); + `); +} +for (var [expr, named] of exprs) { + testAssignmentProperty(expr, named); +} + +function testAssignmentElement(expr, named) { + var f = eval(`(function([elem1 = ${expr}]) { return elem1; })`); + assert.sameValue(f([]).name, named ? "named" : "elem1"); + + eval(` + var [elem1 = ${expr}] = []; + assert.sameValue(elem1.name, named ? "named" : "elem1"); + `); +} +for (var [expr, named] of exprs) { + testAssignmentElement(expr, named); +} + +function testSingleNameBinding(expr, named) { + var f = eval(`(function(param1 = ${expr}) { return param1; })`); + assert.sameValue(f().name, named ? "named" : "param1"); +} +for (var [expr, named] of exprs) { + testSingleNameBinding(expr, named); +} + diff --git a/test/staging/sm/Function/function-name-class.js b/test/staging/sm/Function/function-name-class.js new file mode 100644 index 0000000000..05332af985 --- /dev/null +++ b/test/staging/sm/Function/function-name-class.js @@ -0,0 +1,41 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +var BUGNUMBER = 883377; +var summary = "Anonymous class with name method shouldn't be affected by assignment"; + +print(BUGNUMBER + ": " + summary); + +var classWithStaticNameMethod = class { static name() {} }; +assert.sameValue(typeof classWithStaticNameMethod.name, "function"); + +var classWithStaticNameGetter = class { static get name() { return "static name"; } }; +assert.sameValue(typeof Object.getOwnPropertyDescriptor(classWithStaticNameGetter, "name").get, "function"); +assert.sameValue(classWithStaticNameGetter.name, "static name"); + +var classWithStaticNameSetter = class { static set name(v) {} }; +assert.sameValue(typeof Object.getOwnPropertyDescriptor(classWithStaticNameSetter, "name").set, "function"); + +var n = "NAME".toLowerCase(); +var classWithStaticNameMethodComputed = class { static [n]() {} }; +assert.sameValue(typeof classWithStaticNameMethodComputed.name, "function"); + +// It doesn't apply for non-static method. + +var classWithNameMethod = class { name() {} }; +assert.sameValue(classWithNameMethod.name, "classWithNameMethod"); + +var classWithNameGetter = class { get name() { return "name"; } }; +assert.sameValue(classWithNameGetter.name, "classWithNameGetter"); + +var classWithNameSetter = class { set name(v) {} }; +assert.sameValue(classWithNameSetter.name, "classWithNameSetter"); + diff --git a/test/staging/sm/Function/function-name-computed-01.js b/test/staging/sm/Function/function-name-computed-01.js new file mode 100644 index 0000000000..d712ee6669 --- /dev/null +++ b/test/staging/sm/Function/function-name-computed-01.js @@ -0,0 +1,65 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +var obj = { + ["func"]: function() {}, + ["genFunc"]: function*() {}, + ["asyncFunc"]: async function() {}, + ["asyncGenFunc"]: async function*() {}, + ["arrowFunc"]: ()=>{}, + ["asyncArrowFunc"]: async ()=>{}, + ["method"]() {}, + ["anonClass"]: class {}, + ["nonAnonymousFunc"]: function F() {}, + ["nonAnonymousClass"]: class C{}, + get ["getter"]() {}, + set ["setter"](x) {}, +}; + +assert.sameValue(obj.func.name, "func"); +assert.sameValue(obj.genFunc.name, "genFunc"); +assert.sameValue(obj.asyncFunc.name, "asyncFunc"); +assert.sameValue(obj.asyncGenFunc.name, "asyncGenFunc"); +assert.sameValue(obj.arrowFunc.name, "arrowFunc"); +assert.sameValue(obj.asyncArrowFunc.name, "asyncArrowFunc"); +assert.sameValue(obj.method.name, "method"); +assert.sameValue(obj.anonClass.name, "anonClass"); +assert.sameValue(obj.nonAnonymousFunc.name, "F"); +assert.sameValue(obj.nonAnonymousClass.name, "C"); + +assert.sameValue(Object.getOwnPropertyDescriptor(obj, "getter").get.name, "get getter"); +assert.sameValue(Object.getOwnPropertyDescriptor(obj, "setter").set.name, "set setter"); + +let dummy = class { + ["func"]() {} + *["genFunc"] () {} + async ["asyncFunc"]() {} + async *["asyncGenFunc"]() {} + ["arrowFunc"] = ()=>{} + ["asyncArrowFunc"] = async ()=>{}; + ["method"]() {} + get ["getter"]() {} + set ["setter"](x) {} +}; + +dum = new dummy(); + +assert.sameValue(dum.func.name, "func"); +assert.sameValue(dum.genFunc.name, "genFunc"); +assert.sameValue(dum.asyncFunc.name, "asyncFunc"); +assert.sameValue(dum.asyncGenFunc.name, "asyncGenFunc"); +assert.sameValue(dum.arrowFunc.name, "arrowFunc"); +assert.sameValue(dum.asyncArrowFunc.name, "asyncArrowFunc"); +assert.sameValue(dum.method.name, "method"); + +assert.sameValue(Object.getOwnPropertyDescriptor(dummy.prototype, "getter").get.name, "get getter"); +assert.sameValue(Object.getOwnPropertyDescriptor(dummy.prototype, "setter").set.name, "set setter"); + diff --git a/test/staging/sm/Function/function-name-computed-02.js b/test/staging/sm/Function/function-name-computed-02.js new file mode 100644 index 0000000000..24c6f56c2e --- /dev/null +++ b/test/staging/sm/Function/function-name-computed-02.js @@ -0,0 +1,65 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +var obj = { + [1]: function() {}, + [2]: function*() {}, + [3]: async function() {}, + [4]: async function*() {}, + [5]: ()=>{}, + [6]: async ()=>{}, + [7] () {}, + [8]: class {}, + [9]: function F() {}, + [10]: class C{}, + get [11]() {}, + set [12](x) {}, +}; + +assert.sameValue(obj[1].name, "1"); +assert.sameValue(obj[2].name, "2"); +assert.sameValue(obj[3].name, "3"); +assert.sameValue(obj[4].name, "4"); +assert.sameValue(obj[5].name, "5"); +assert.sameValue(obj[6].name, "6"); +assert.sameValue(obj[7].name, "7"); +assert.sameValue(obj[8].name, "8"); +assert.sameValue(obj[9].name, "F"); +assert.sameValue(obj[10].name, "C"); +assert.sameValue(Object.getOwnPropertyDescriptor(obj, "11").get.name, "get 11"); +assert.sameValue(Object.getOwnPropertyDescriptor(obj, "12").set.name, "set 12"); + +let dummy = class { + [1]() {} + *[2]() {} + async [3]() {} + async *[4]() {} + [5] = ()=>{} + [6] = async ()=>{}; + [7] () {} + get [11]() {} + set [12](x) {} +}; + +dum = new dummy(); + +assert.sameValue(dum[1].name, "1"); +assert.sameValue(dum[2].name, "2"); +assert.sameValue(dum[3].name, "3"); +assert.sameValue(dum[4].name, "4"); +assert.sameValue(dum[5].name, "5"); +assert.sameValue(dum[6].name, "6"); +assert.sameValue(dum[7].name, "7"); + +assert.sameValue(Object.getOwnPropertyDescriptor(dummy.prototype, "11").get.name, "get 11"); +assert.sameValue(Object.getOwnPropertyDescriptor(dummy.prototype, "12").set.name, "set 12"); + + diff --git a/test/staging/sm/Function/function-name-for.js b/test/staging/sm/Function/function-name-for.js new file mode 100644 index 0000000000..714d4e214b --- /dev/null +++ b/test/staging/sm/Function/function-name-for.js @@ -0,0 +1,40 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +var BUGNUMBER = 883377; +var summary = "Anonymous function name should be set based on for-in initializer"; + +print(BUGNUMBER + ": " + summary); + +var exprs = [ + ["function() {}", false], + ["function named() {}", true], + ["function*() {}", false], + ["function* named() {}", true], + ["async function() {}", false], + ["async function named() {}", true], + ["() => {}", false], + ["async () => {}", false], + ["class {}", false], + ["class named {}", true], +]; + +function testForInHead(expr, named) { + eval(` + for (var forInHead = ${expr} in {}) { + } + `); + assert.sameValue(forInHead.name, named ? "named" : "forInHead"); +} +for (var [expr, named] of exprs) { + testForInHead(expr, named); +} + diff --git a/test/staging/sm/Function/function-name-method.js b/test/staging/sm/Function/function-name-method.js new file mode 100644 index 0000000000..07220cf5e5 --- /dev/null +++ b/test/staging/sm/Function/function-name-method.js @@ -0,0 +1,79 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +var BUGNUMBER = 883377; +var summary = "Anonymous function name should be set based on method definition"; + +print(BUGNUMBER + ": " + summary); + +var fooSymbol = Symbol("foo"); +var emptySymbol = Symbol(""); +var undefSymbol = Symbol(); + +function testMethod(prefix, classPrefix="", prototype=false) { + var param = (prefix == "set" || prefix == "static set") ? "v" : ""; + var sep = classPrefix ? "" : ","; + var objOrClass = eval(`(${classPrefix}{ + ${prefix} prop(${param}) {} ${sep} + ${prefix} "literal"(${param}) {} ${sep} + ${prefix} ""(${param}) {} ${sep} + ${prefix} 5(${param}) {} ${sep} + ${prefix} [Symbol.iterator](${param}) {} ${sep} + ${prefix} [fooSymbol](${param}) {} ${sep} + ${prefix} [emptySymbol](${param}) {} ${sep} + ${prefix} [undefSymbol](${param}) {} ${sep} + ${prefix} [/a/](${param}) {} ${sep} + })`); + + var target = prototype ? objOrClass.prototype : objOrClass; + + function testOne(methodName, expectedName) { + var f; + if (prefix == "get" || prefix == "static get") { + f = Object.getOwnPropertyDescriptor(target, methodName).get; + expectedName = "get " + expectedName; + } else if (prefix == "set" || prefix == "static set") { + f = Object.getOwnPropertyDescriptor(target, methodName).set; + expectedName = "set " + expectedName; + } else { + f = Object.getOwnPropertyDescriptor(target, methodName).value; + } + + assert.sameValue(f.name, expectedName); + } + testOne("prop", "prop"); + testOne("literal", "literal"); + testOne("", ""); + testOne(5, "5"); + testOne(Symbol.iterator, "[Symbol.iterator]"); + testOne(fooSymbol, "[foo]"); + testOne(emptySymbol, "[]"); + testOne(undefSymbol, ""); + testOne(/a/, "/a/"); +} +testMethod(""); +testMethod("*"); +testMethod("async"); +testMethod("get"); +testMethod("set"); + +testMethod("", "class", true); +testMethod("*", "class", true); +testMethod("async", "class", true); +testMethod("get", "class", true); +testMethod("set", "class", true); + +testMethod("static", "class"); +testMethod("static *", "class"); +testMethod("static async", "class"); +testMethod("static get", "class"); +testMethod("static set", "class"); + diff --git a/test/staging/sm/Function/function-name-property.js b/test/staging/sm/Function/function-name-property.js new file mode 100644 index 0000000000..6fad7685af --- /dev/null +++ b/test/staging/sm/Function/function-name-property.js @@ -0,0 +1,67 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +var BUGNUMBER = 883377; +var summary = "Anonymous function name should be set based on property name"; + +print(BUGNUMBER + ": " + summary); + +var fooSymbol = Symbol("foo"); +var emptySymbol = Symbol(""); +var undefSymbol = Symbol(); + +var exprs = [ + ["function() {}", false], + ["function named() {}", true], + ["function*() {}", false], + ["function* named() {}", true], + ["async function() {}", false], + ["async function named() {}", true], + ["() => {}", false], + ["async () => {}", false], + ["class {}", false], + ["class named {}", true], +]; + +function testPropertyDefinition(expr, named) { + var obj = eval(`({ + prop: ${expr}, + "literal": ${expr}, + "": ${expr}, + 5: ${expr}, + 0.4: ${expr}, + [Symbol.iterator]: ${expr}, + [fooSymbol]: ${expr}, + [emptySymbol]: ${expr}, + [undefSymbol]: ${expr}, + [/a/]: ${expr}, + })`); + assert.sameValue(obj.prop.name, named ? "named" : "prop"); + assert.sameValue(obj["literal"].name, named ? "named" : "literal"); + assert.sameValue(obj[""].name, named ? "named" : ""); + assert.sameValue(obj[5].name, named ? "named" : "5"); + assert.sameValue(obj[0.4].name, named ? "named" : "0.4"); + assert.sameValue(obj[Symbol.iterator].name, named ? "named" : "[Symbol.iterator]"); + assert.sameValue(obj[fooSymbol].name, named ? "named" : "[foo]"); + assert.sameValue(obj[emptySymbol].name, named ? "named" : "[]"); + assert.sameValue(obj[undefSymbol].name, named ? "named" : ""); + assert.sameValue(obj[/a/].name, named ? "named" : "/a/"); + + // Not applicable cases: __proto__. + obj = { + __proto__: function() {} + }; + assert.sameValue(obj.__proto__.name, ""); +} +for (var [expr, named] of exprs) { + testPropertyDefinition(expr, named); +} + diff --git a/test/staging/sm/Function/function-name.js b/test/staging/sm/Function/function-name.js new file mode 100644 index 0000000000..22f0e4465a --- /dev/null +++ b/test/staging/sm/Function/function-name.js @@ -0,0 +1,73 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +function testFunctionName(f) { + var name = f.name; + f.name = 'g'; + assert.sameValue(f.name, name); + assert.sameValue(delete f.name, true); + assert.sameValue(f.name, ''); + assert.sameValue(f.hasOwnProperty('name'), false); + f.name = 'g'; + assert.sameValue(f.name, ''); + Object.defineProperty(f, 'name', {value: 'g'}); + assert.sameValue(f.name, 'g'); +} +function testFunctionNameStrict(f) { + "use strict"; + var name = f.name; + var error; + try { + f.name = 'g'; + } catch (e) { + error = e; + } + assert.sameValue(f.name, name); + assert.sameValue(error instanceof TypeError, true); + assert.sameValue(delete f.name, true); + assert.sameValue(f.name, ''); + assert.sameValue(f.hasOwnProperty('name'), false); + error = null; + try { + f.name = 'g'; + } catch (e) { + error = e; + } + assert.sameValue(f.name, ''); + assert.sameValue(error instanceof TypeError, true); + Object.defineProperty(f, 'name', {value: 'g'}); + assert.sameValue(f.name, 'g'); +} + +assert.sameValue(Object.getOwnPropertyDescriptor(Object, "name").writable, false); +assert.sameValue(Object.getOwnPropertyDescriptor(Object, "name").enumerable, false); +assert.sameValue(Object.getOwnPropertyDescriptor(Object, "name").configurable, true); +assert.sameValue(Object.getOwnPropertyDescriptor(Object, "name").value, 'Object'); +assert.sameValue(Object.getOwnPropertyDescriptor(function f(){}, "name").writable, false); +assert.sameValue(Object.getOwnPropertyDescriptor(function f(){}, "name").enumerable, false); +assert.sameValue(Object.getOwnPropertyDescriptor(function f(){}, "name").configurable, true); +assert.sameValue(Object.getOwnPropertyDescriptor(function f(){}, "name").value, 'f'); + +// Basic test ensuring that Object.defineProperty works on pristine function. +function f() {}; +Object.defineProperty(f, 'name', {value: 'g'}); +assert.sameValue(f.name, 'g'); + +// .name behaves as expected on scripted function. +testFunctionName(function f(){}); +testFunctionNameStrict(function f(){}); +// .name behaves as expected on builtin function. +testFunctionName(Function.prototype.apply); +testFunctionNameStrict(Function.prototype.call); +// .name behaves as expected on self-hosted builtin function. +testFunctionName(Array.prototype.forEach); +testFunctionNameStrict(Array.prototype.some); + diff --git a/test/staging/sm/Function/function-toString-builtin-name.js b/test/staging/sm/Function/function-toString-builtin-name.js new file mode 100644 index 0000000000..f588876fd6 --- /dev/null +++ b/test/staging/sm/Function/function-toString-builtin-name.js @@ -0,0 +1,63 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +// Repeats the test from 'Function/function-toString-builtin.js' and additionally +// verifies the name matches the expected value. +// +// This behaviour is not required by the ECMAScript standard. + +// Greatly (!) simplified patterns for the PropertyName production. +var propertyName = [ + // PropertyName :: LiteralPropertyName :: IdentifierName + "\\w+", + + // PropertyName :: LiteralPropertyName :: StringLiteral + "(?:'[^']*')", + "(?:\"[^\"]*\")", + + // PropertyName :: LiteralPropertyName :: NumericLiteral + "\\d+", + + // PropertyName :: ComputedPropertyName + "(?:\\[[^\\]]+\\])", +].join("|") + +var nativeCode = RegExp([ + "^", "function", "(get|set)?", ("(" + propertyName + ")?"), "\\(", "\\)", "\\{", "\\[native code\\]", "\\}", "$" +].join("\\s*")); + +function assertFunctionName(fun, expected) { + var match = nativeCode.exec(fun.toString()); + assert.sameValue(match === null, false, "No match for " + expected); + assert.sameValue(match[2], expected, "Incorrect match for " + expected); +} + +// Bound functions are considered built-ins. +assertFunctionName(function(){}.bind(), undefined); +assertFunctionName(function fn(){}.bind(), undefined); + +// Built-ins which are well-known intrinsic objects. +assertFunctionName(Array, "Array"); +assertFunctionName(Object.prototype.toString, "toString"); +assertFunctionName(decodeURI, "decodeURI"); + +// Other built-in functions. +assertFunctionName(Math.asin, "asin"); +assertFunctionName(String.prototype.blink, "blink"); +assertFunctionName(RegExp.prototype[Symbol.split], "[Symbol.split]"); + +// Built-in getter functions. +assertFunctionName(Object.getOwnPropertyDescriptor(RegExp.prototype, "flags").get, "flags"); +assertFunctionName(Object.getOwnPropertyDescriptor(Object.prototype, "__proto__").get, "__proto__"); + +// Built-in setter functions. +assertFunctionName(Object.getOwnPropertyDescriptor(Object.prototype, "__proto__").set, "__proto__"); + diff --git a/test/staging/sm/Function/function-toString-builtin.js b/test/staging/sm/Function/function-toString-builtin.js new file mode 100644 index 0000000000..72f8ee4bad --- /dev/null +++ b/test/staging/sm/Function/function-toString-builtin.js @@ -0,0 +1,53 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ + +// Greatly (!) simplified patterns for the PropertyName production. +var propertyName = [ + // PropertyName :: LiteralPropertyName :: IdentifierName + "\\w+", + + // PropertyName :: LiteralPropertyName :: StringLiteral + "(?:'[^']*')", + "(?:\"[^\"]*\")", + + // PropertyName :: LiteralPropertyName :: NumericLiteral + "\\d+", + + // PropertyName :: ComputedPropertyName + "(?:\\[[^\\]]+\\])", +].join("|") + +var nativeCode = RegExp([ + "^", "function", "(get|set)?", ("(" + propertyName + ")?"), "\\(", "\\)", "\\{", "\\[native code\\]", "\\}", "$" +].join("\\s*")); + + +// Bound functions are considered built-ins. +reportMatch(nativeCode, function(){}.bind().toString()); +reportMatch(nativeCode, function fn(){}.bind().toString()); + +// Built-ins which are well-known intrinsic objects. +reportMatch(nativeCode, Array.toString()); +reportMatch(nativeCode, Object.prototype.toString.toString()); +reportMatch(nativeCode, decodeURI.toString()); + +// Other built-in functions. +reportMatch(nativeCode, Math.asin.toString()); +reportMatch(nativeCode, String.prototype.blink.toString()); +reportMatch(nativeCode, RegExp.prototype[Symbol.split].toString()); + +// Built-in getter functions. +reportMatch(nativeCode, Object.getOwnPropertyDescriptor(RegExp.prototype, "flags").get.toString()); +reportMatch(nativeCode, Object.getOwnPropertyDescriptor(Object.prototype, "__proto__").get.toString()); + +// Built-in setter functions. +reportMatch(nativeCode, Object.getOwnPropertyDescriptor(Object.prototype, "__proto__").set.toString()); diff --git a/test/staging/sm/Function/has-instance-jitted.js b/test/staging/sm/Function/has-instance-jitted.js new file mode 100644 index 0000000000..ab142bb39e --- /dev/null +++ b/test/staging/sm/Function/has-instance-jitted.js @@ -0,0 +1,105 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +const OriginalHasInstance = Function.prototype[Symbol.hasInstance]; + +// Ensure that folding doesn't impact user defined @@hasInstance methods. +{ + function Test() { + this.x = 1; + } + + Object.defineProperty(Test, Symbol.hasInstance, + {writable: true, value: () => false}); + + function x(t) { + return t instanceof Test; + } + + function y() { + let t = new Test; + let b = true; + for (let i = 0; i < 10; i++) { + b = b && x(t); + } + return b; + } + + + function z() { + let f = 0; + let t = 0; + for (let i = 0; i < 100; i++) + assert.sameValue(y(), false); + } + + z(); +} + +// Ensure that the jitting does not clobber user defined @@hasInstance methods. +{ + function a() { + function b() {}; + b.__proto__ = a.prototype; + return b; + }; + let c = new a(); + + let t = 0; + let f = 0; + let e = 0; + for (let i = 0; i < 40000; i++) { + if (i == 20000) + Object.defineProperty(a.prototype, Symbol.hasInstance, + {writable: true, value: () => true}); + if (i == 30000) + Object.setPrototypeOf(c, Function.prototype); + + if (1 instanceof c) { + t++; + } else { + f++; + } + } + + assert.sameValue(t, 10000); + assert.sameValue(f, 30000); +} + +{ + function a() {}; + function b() {}; + Object.defineProperty(a, Symbol.hasInstance, {writable: true, value: () => true}); + assert.sameValue(b instanceof a, true); + for (let _ of Array(10000)) + assert.sameValue(b instanceof a, true); +} + +{ + function a(){}; + function b(){}; + function c(){}; + function d(){}; + function e(){}; + Object.defineProperty(a, Symbol.hasInstance, {value: () => true }); + Object.defineProperty(b, Symbol.hasInstance, {value: () => true }); + Object.defineProperty(c, Symbol.hasInstance, {value: () => true }); + Object.defineProperty(d, Symbol.hasInstance, {value: () => true }); + let funcs = [a, b, c, d]; + for (let f of funcs) + assert.sameValue(e instanceof f, true); + + for (let _ of Array(10001)) { + for (let f of funcs) + assert.sameValue(e instanceof f, true); + } +} + diff --git a/test/staging/sm/Function/has-instance.js b/test/staging/sm/Function/has-instance.js new file mode 100644 index 0000000000..f0201cff06 --- /dev/null +++ b/test/staging/sm/Function/has-instance.js @@ -0,0 +1,110 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +// It is possible to override Function.prototype[@@hasInstance]. +let passed = false; +let obj = { foo: true }; +let C = function(){}; + +Object.defineProperty(C, Symbol.hasInstance, { + value: function(inst) { passed = inst.foo; return false; } +}); + +assert.sameValue(obj instanceof C, false); +assert.sameValue(passed, true); + +{ + let obj = { + [Symbol.hasInstance](v) { return true; }, + }; + let whatevs = {}; + assert.sameValue(whatevs instanceof obj, true); +} + +{ + + function zzzz() {}; + let xxxx = new zzzz(); + assert.sameValue(xxxx instanceof zzzz, true); + assert.sameValue(zzzz[Symbol.hasInstance](xxxx), true); + +} + +// Non-callable objects should return false. +const nonCallables = [ + 1, + undefined, + null, + "nope", +] + +for (let nonCallable of nonCallables) { + assert.sameValue(nonCallable instanceof Function, false); + assert.sameValue(nonCallable instanceof Object, false); +} + +// Non-callables should throw when used on the right hand side +// of `instanceof`. +assertThrowsInstanceOf(() => { + function foo() {}; + let obj = {}; + foo instanceof obj; +}, TypeError); + +// Non-callables do not throw for overridden methods +let o = {[Symbol.hasInstance](v) { return true; }} +assert.sameValue(1 instanceof o, true); + +// Non-callables return false instead of an exception when +// Function.prototype[Symbol.hasInstance] is called directly. +for (let nonCallable of nonCallables) { + assert.sameValue(Function.prototype[Symbol.hasInstance].call(nonCallable, Object), false); +} + +// It should be possible to call the Symbol.hasInstance method directly. +assert.sameValue(Function.prototype[Symbol.hasInstance].call(Function, () => 1), true); +assert.sameValue(Function.prototype[Symbol.hasInstance].call(Function, Object), true); +assert.sameValue(Function.prototype[Symbol.hasInstance].call(Function, null), false); +assert.sameValue(Function.prototype[Symbol.hasInstance].call(Function, Array), true); +assert.sameValue(Function.prototype[Symbol.hasInstance].call(Object, Array), true); +assert.sameValue(Function.prototype[Symbol.hasInstance].call(Array, Function), false); +assert.sameValue(Function.prototype[Symbol.hasInstance].call(({}), Function), false); +assert.sameValue(Function.prototype[Symbol.hasInstance].call(), false) +assert.sameValue(Function.prototype[Symbol.hasInstance].call(({})), false) + +// Ensure that bound functions are unwrapped properly +let bindme = {x: function() {}}; +let instance = new bindme.x(); +let xOuter = bindme.x; +let bound = xOuter.bind(bindme); +let doubleBound = bound.bind(bindme); +let tripleBound = bound.bind(doubleBound); +assert.sameValue(Function.prototype[Symbol.hasInstance].call(bound, instance), true); +assert.sameValue(Function.prototype[Symbol.hasInstance].call(doubleBound, instance), true); +assert.sameValue(Function.prototype[Symbol.hasInstance].call(tripleBound, instance), true); + +// Function.prototype[Symbol.hasInstance] is not configurable +let desc = Object.getOwnPropertyDescriptor(Function.prototype, Symbol.hasInstance); +assert.sameValue(desc.configurable, false); + +// Attempting to use a non-callable @@hasInstance triggers a type error +// Bug 1280892 +assertThrowsInstanceOf(() => { + var fun = function() {} + var p = new Proxy(fun, { + get(target, key) { + return /not-callable/; + } + }); + fun instanceof p; +}, TypeError); + + diff --git a/test/staging/sm/Function/implicit-this-in-parameter-expression.js b/test/staging/sm/Function/implicit-this-in-parameter-expression.js new file mode 100644 index 0000000000..ce1dec35d8 --- /dev/null +++ b/test/staging/sm/Function/implicit-this-in-parameter-expression.js @@ -0,0 +1,27 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ + +function f(a = eval(` + function g() { + 'use strict'; + return this; + } + + with ({}) { + g() /* implicit return value */ + } + `)) { + return a +}; + +assert.sameValue(f(), undefined); + diff --git a/test/staging/sm/Function/invalid-parameter-list.js b/test/staging/sm/Function/invalid-parameter-list.js new file mode 100644 index 0000000000..0073bb9a4e --- /dev/null +++ b/test/staging/sm/Function/invalid-parameter-list.js @@ -0,0 +1,37 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +// This constructor behaves like `Function` without checking +// if the parameter list end is at the expected position. +// We use this to make sure that the tests we use are otherwise +// syntactically correct. +function DumpFunction(...args) { + let code = "function anonymous("; + code += args.slice(0, -1).join(", "); + code += ") {\n"; + code += args[args.length -1]; + code += "\n}"; + eval(code); +} + +const tests = [ + ["/*", "*/) {"], + ["//", ") {"], + ["a = `", "` ) {"], + [") { var x = function (", "} "], + ["x = function (", "}) {"] +]; + +for (const test of tests) { + DumpFunction(...test); + assertThrowsInstanceOf(() => new Function(...test), SyntaxError); +} + diff --git a/test/staging/sm/Function/line-terminator-before-arrow.js b/test/staging/sm/Function/line-terminator-before-arrow.js new file mode 100644 index 0000000000..f166377e1d --- /dev/null +++ b/test/staging/sm/Function/line-terminator-before-arrow.js @@ -0,0 +1,19 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +assertThrowsInstanceOf(() => eval("() \n => {}"), SyntaxError); +assertThrowsInstanceOf(() => eval("a \n => {}"), SyntaxError); +assertThrowsInstanceOf(() => eval("(a) /*\n*/ => {}"), SyntaxError); +assertThrowsInstanceOf(() => eval("(a, b) \n => {}"), SyntaxError); +assertThrowsInstanceOf(() => eval("(a, b = 1) \n => {}"), SyntaxError); +assertThrowsInstanceOf(() => eval("(a, ...b) \n => {}"), SyntaxError); +assertThrowsInstanceOf(() => eval("(a, b = 1, ...c) \n => {}"), SyntaxError); + diff --git a/test/staging/sm/Function/method-has-duplicated.js b/test/staging/sm/Function/method-has-duplicated.js new file mode 100644 index 0000000000..766feff288 --- /dev/null +++ b/test/staging/sm/Function/method-has-duplicated.js @@ -0,0 +1,29 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +// Make sure duplicated name is allowed in non-strict. +function f0(a) { +} + +// SyntaxError should be thrown if method definition has duplicated name. +assertThrowsInstanceOf(() => eval(` +({ + m1(a, a) { + } +}); +`), SyntaxError); +assertThrowsInstanceOf(() => eval(` +({ + m2(a, ...a) { + } +}); +`), SyntaxError); + diff --git a/test/staging/sm/Function/parameter-redeclaration.js b/test/staging/sm/Function/parameter-redeclaration.js new file mode 100644 index 0000000000..317a330e6b --- /dev/null +++ b/test/staging/sm/Function/parameter-redeclaration.js @@ -0,0 +1,28 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +// 'var' is allowed to redeclare parameters. +function f1(a = 0) { + var a; +} + +// 'let' and 'const' at body-level are not allowed to redeclare parameters. +assertThrowsInstanceOf(() => { + eval(`function f2(a = 0) { + let a; + }`); +}, SyntaxError); +assertThrowsInstanceOf(() => { + eval(`function f3(a = 0) { + const a; + }`); +}, SyntaxError); + diff --git a/test/staging/sm/Function/redefine-arguments-length.js b/test/staging/sm/Function/redefine-arguments-length.js new file mode 100644 index 0000000000..d55f6d1aaf --- /dev/null +++ b/test/staging/sm/Function/redefine-arguments-length.js @@ -0,0 +1,71 @@ +/* + * Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/licenses/publicdomain/ + */ + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +var gTestfile = 'redefine-arguments-length.js'; +//----------------------------------------------------------------------------- +var BUGNUMBER = 539766; +var summary = + "Object.defineProperty sets arguments.length without setting the " + + "length-overridden bit"; + +print(BUGNUMBER + ": " + summary); + +/************** + * BEGIN TEST * + **************/ + +function test_JSOP_ARGCNT() +{ + var length = "length"; + Object.defineProperty(arguments, length, { value: 17 }); + assert.sameValue(arguments.length, 17); + assert.sameValue(arguments[length], 17); +} +test_JSOP_ARGCNT(); + +function test_js_fun_apply() +{ + var length = "length"; + Object.defineProperty(arguments, length, { value: 17 }); + + function fun() + { + assert.sameValue(arguments.length, 17); + assert.sameValue(arguments[length], 17); + assert.sameValue(arguments[0], "foo"); + for (var i = 1; i < 17; i++) + assert.sameValue(arguments[i], undefined); + } + fun.apply(null, arguments); +} +test_js_fun_apply("foo"); + +function test_array_toString_sub_1() +{ + Object.defineProperty(arguments, "length", { value: 1 }); + arguments.join = [].join; + assert.sameValue([].toString.call(arguments), "1"); +} +test_array_toString_sub_1(1, 2); + +function test_array_toString_sub_2() +{ + Object.defineProperty(arguments, "length", { value: 1 }); + assert.sameValue([].toLocaleString.call(arguments), "1"); +} +test_array_toString_sub_2(1, 2); + + +/******************************************************************************/ + +print("All tests passed!"); diff --git a/test/staging/sm/Function/regress-518103.js b/test/staging/sm/Function/regress-518103.js new file mode 100644 index 0000000000..77bfe1b3e6 --- /dev/null +++ b/test/staging/sm/Function/regress-518103.js @@ -0,0 +1,35 @@ +/* + * Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/licenses/publicdomain/ + */ + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +var BUGNUMBER = 518103; +var summary = 'lambda constructor "method" vs. instanceof'; +var actual; +var expect; + +printBugNumber(BUGNUMBER); +printStatus(summary); + +var Y = {widget: {}}; + +Y.widget.DataSource = function () {}; +Y.widget.DS_JSArray = function (A) { this.data = A; }; +Y.widget.DS_JSArray.prototype = new Y.widget.DataSource(); + +var J = new Y.widget.DS_JSArray( [ ] ); + +actual = J instanceof Y.widget.DataSource; +expect = true; + +assert.sameValue(expect, actual, summary); + +printStatus("All tests passed!"); diff --git a/test/staging/sm/Function/regress-524826.js b/test/staging/sm/Function/regress-524826.js new file mode 100644 index 0000000000..4e70d1534f --- /dev/null +++ b/test/staging/sm/Function/regress-524826.js @@ -0,0 +1,36 @@ +/* + * Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/licenses/publicdomain/ + */ + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +var BUGNUMBER = 524826; +var summary = 'null-closure property initialiser mis-brands object literal scope'; +var actual; +var expect; + +printBugNumber(BUGNUMBER); +printStatus(summary); + +function make(g) { + var o = {f: function(a,b) { return a*b; }, g: g}; + return o; +} +var z = -1; +var x = make(function(c) { return c*z; }); +var y = make(function(c) { return -c*z; }); + +function callg(o, c) { return o.g(c); }; +actual = callg(x, 1); +expect = -callg(y, 1); + +assert.sameValue(expect, actual, summary); + +printStatus("All tests passed!"); diff --git a/test/staging/sm/Function/regress-528082.js b/test/staging/sm/Function/regress-528082.js new file mode 100644 index 0000000000..e8036d683e --- /dev/null +++ b/test/staging/sm/Function/regress-528082.js @@ -0,0 +1,28 @@ +/* + * Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/licenses/publicdomain/ + */ + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +var BUGNUMBER = 528082; +var summary = 'named function expression function-name-as-upvar slot botch'; + +printBugNumber(BUGNUMBER); +printStatus(summary); + +function f() { + return function g(a) { return function () { return g; }(); }(); +} +var actual = typeof f(); +var expect = "function"; + +assert.sameValue(expect, actual, summary); + +printStatus("All tests passed!"); diff --git a/test/staging/sm/Function/regress-533254.js b/test/staging/sm/Function/regress-533254.js new file mode 100644 index 0000000000..0a22781d82 --- /dev/null +++ b/test/staging/sm/Function/regress-533254.js @@ -0,0 +1,36 @@ +/* + * Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/licenses/publicdomain/ + */ + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +var BUGNUMBER = 533254; +var summary = 'init-method late in table-big initialiser screwup'; + +printBugNumber(BUGNUMBER); +printStatus(summary); + +function f() { + var proto = {p8:8}; + var obj = { + p0:0, p1:1, p2:2, p3:3, p4:4, p5:5, p6:6, p7:7, p8:8, p9:9, + p10:0, p11:1, p12:2, p13:3, p14:4, p15:5, p16:6, p17:7, p18:8, p19:9, + m: function() { return 42; } + }; + return obj; +} +var expect = f(), + actual = f(); + +expect += ''; +actual += ''; +assert.sameValue(expect, actual, summary); + +printStatus("All tests passed!"); diff --git a/test/staging/sm/Function/regress-545980.js b/test/staging/sm/Function/regress-545980.js new file mode 100644 index 0000000000..cc7f27a020 --- /dev/null +++ b/test/staging/sm/Function/regress-545980.js @@ -0,0 +1,49 @@ +/* + * Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/licenses/publicdomain/ + */ + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +var BUGNUMBER = 518103; +var summary = 'partial flat closures must not reach across funargs'; +var actual = "no crash"; +var expect = actual; + +function Timer(){} +Timer.prototype = { initWithCallback: function (o) {Timer.q.push(o)} }; +Timer.q = []; + +var later; +var ac = {startSearch: function(q,s,n,o){later=o}}; + +var bm = {insertBookmark: function(){}, getIdForItemAt: function(){}}; + +function run_test() { + var tagIds = []; + + (function doSearch(query) { + ac.startSearch(query, "", null, { + onSearchResult: function() { + var num = tagIds.length; + + var timer = new Timer; + var next = query.slice(1); + timer.initWithCallback({ notify: function() { return doSearch(next); } }); + } + }); + })("title"); +} + +run_test(); +later.onSearchResult(); +for (var i in Timer.q) + Timer.q[i].notify(); + +assert.sameValue(expect, actual, summary); diff --git a/test/staging/sm/Function/rest-has-duplicated.js b/test/staging/sm/Function/rest-has-duplicated.js new file mode 100644 index 0000000000..8ce1b168f6 --- /dev/null +++ b/test/staging/sm/Function/rest-has-duplicated.js @@ -0,0 +1,27 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +// Make sure duplicated name is allowed in non-strict. +function f0(a, a) { +} + +// SyntaxError should be thrown if rest parameter name is duplicated. +assertThrowsInstanceOf(() => eval(` +function f1(a, ...a) { +} +`), SyntaxError); + +// SyntaxError should be thrown if there is a duplicated parameter. +assertThrowsInstanceOf(() => eval(` +function f2(a, a, ...b) { +} +`), SyntaxError); + diff --git a/test/staging/sm/Function/rest-parameter-names.js b/test/staging/sm/Function/rest-parameter-names.js new file mode 100644 index 0000000000..21a56201e2 --- /dev/null +++ b/test/staging/sm/Function/rest-parameter-names.js @@ -0,0 +1,75 @@ +/* + * Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/licenses/publicdomain/ + */ + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +//----------------------------------------------------------------------------- +var BUGNUMBER = 1288460; +var summary = + "Rest parameters to functions can be named |yield| or |eval| or |let| in " + "non-strict code"; + +print(BUGNUMBER + ": " + summary); + +/************** + * BEGIN TEST * + **************/ + +var f1 = (...yield) => yield + 42; +assert.sameValue(f1(), "42"); +assert.sameValue(f1(1), "142"); + +var f2 = (...eval) => eval + 42; +assert.sameValue(f2(), "42"); +assert.sameValue(f2(1), "142"); + +var f3 = (...let) => let + 42; +assert.sameValue(f3(), "42"); +assert.sameValue(f3(1), "142"); + +function g1(x, ...yield) +{ + return yield + x; +} +assert.sameValue(g1(0, 42), "420"); + +function g2(x, ...eval) +{ + return eval + x; +} +assert.sameValue(g2(0, 42), "420"); + +function g3(x, ...let) +{ + return let + x; +} +assert.sameValue(g3(0, 42), "420"); + +function h() +{ + "use strict"; + + var badNames = ["yield", "eval", "let"]; + + for (var badName of ["yield", "eval", "let"]) + { + assertThrowsInstanceOf(() => eval(`var q = (...${badName}) => ${badName} + 42;`), + SyntaxError); + + assertThrowsInstanceOf(() => eval(`function r(x, ...${badName}) { return x + ${badName}; }`), + SyntaxError); + } +} +h(); + +/******************************************************************************/ + +print("Tests complete"); diff --git a/test/staging/sm/Function/return-finally.js b/test/staging/sm/Function/return-finally.js new file mode 100644 index 0000000000..a41c46f9e5 --- /dev/null +++ b/test/staging/sm/Function/return-finally.js @@ -0,0 +1,181 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +var BUGNUMBER = 1202134; +var summary = "Return value should not be overwritten by finally block with normal execution."; + +print(BUGNUMBER + ": " + summary); + +// ==== single ==== + +var f; +f = function() { + // F.[[type]] is normal + // B.[[type]] is return + try { + return 42; + } finally { + } +}; +assert.sameValue(f(), 42); + +f = function() { + // F.[[type]] is return + try { + return 42; + } finally { + return 43; + } +}; +assert.sameValue(f(), 43); + +f = function() { + // F.[[type]] is throw + try { + return 42; + } finally { + throw 43; + } +}; +var caught = false; +try { + f(); +} catch (e) { + assert.sameValue(e, 43); + caught = true; +} +assert.sameValue(caught, true); + +f = function() { + // F.[[type]] is break + do try { + return 42; + } finally { + break; + } while (false); + return 43; +}; +assert.sameValue(f(), 43); + +f = function() { + // F.[[type]] is break + L: try { + return 42; + } finally { + break L; + } + return 43; +}; +assert.sameValue(f(), 43); + +f = function() { + // F.[[type]] is continue + do try { + return 42; + } finally { + continue; + } while (false); + return 43; +}; +assert.sameValue(f(), 43); + +// ==== nested ==== + +f = function() { + // F.[[type]] is normal + // B.[[type]] is return + try { + return 42; + } finally { + // F.[[type]] is break + do try { + return 43; + } finally { + break; + } while (0); + } +}; +assert.sameValue(f(), 42); + +f = function() { + // F.[[type]] is normal + // B.[[type]] is return + try { + return 42; + } finally { + // F.[[type]] is break + L: try { + return 43; + } finally { + break L; + } + } +} +assert.sameValue(f(), 42); + +f = function() { + // F.[[type]] is normal + // B.[[type]] is return + try { + return 42; + } finally { + // F.[[type]] is continue + do try { + return 43; + } finally { + continue; + } while (0); + } +}; +assert.sameValue(f(), 42); + +f = function() { + // F.[[type]] is normal + // B.[[type]] is return + try { + return 42; + } finally { + // F.[[type]] is normal + // B.[[type]] is normal + try { + // F.[[type]] is throw + try { + return 43; + } finally { + throw 9; + } + } catch (e) { + } + } +}; +assert.sameValue(f(), 42); + +f = function() { + // F.[[type]] is return + try { + return 41; + } finally { + // F.[[type]] is normal + // B.[[type]] is return + try { + return 42; + } finally { + // F.[[type]] is break + do try { + return 43; + } finally { + break; + } while (0); + } + } +}; +assert.sameValue(f(), 42); + diff --git a/test/staging/sm/Function/spread-iterator-primitive.js b/test/staging/sm/Function/spread-iterator-primitive.js new file mode 100644 index 0000000000..df0b03b0ee --- /dev/null +++ b/test/staging/sm/Function/spread-iterator-primitive.js @@ -0,0 +1,37 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +var BUGNUMBER = 1021835; +var summary = "Returning non-object from @@iterator should throw"; + +print(BUGNUMBER + ": " + summary); + +let primitives = [ + 1, + true, + undefined, + null, + "foo", + Symbol.iterator +]; + +function f() { +} + +for (let primitive of primitives) { + let arg = { + [Symbol.iterator]() { + return primitive; + } + }; + assertThrowsInstanceOf(() => f(...arg), TypeError); +} + diff --git a/test/staging/sm/Function/strict-arguments.js b/test/staging/sm/Function/strict-arguments.js new file mode 100644 index 0000000000..9373995c88 --- /dev/null +++ b/test/staging/sm/Function/strict-arguments.js @@ -0,0 +1,458 @@ +/* + * Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/licenses/publicdomain/ + */ + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +var gTestfile = 'strict-arguments.js'; +var BUGNUMBER = 516255; +var summary = + "ES5 strict mode: arguments objects of strict mode functions must copy " + + "argument values"; + +print(BUGNUMBER + ": " + summary); + +/************** + * BEGIN TEST * + **************/ + +function arrayEvery(arr, fun) +{ + return Array.prototype.every.call(arr, fun); +} + +function arraysEqual(a1, a2) +{ + return a1.length === a2.length && + arrayEvery(a1, function(v, i) { return v === a2[i]; }); +} + + +/************************ + * NON-STRICT ARGUMENTS * + ************************/ + +var obj = {}; + +function noargs() { return arguments; } + +assert.sameValue(arraysEqual(noargs(), []), true); +assert.sameValue(arraysEqual(noargs(1), [1]), true); +assert.sameValue(arraysEqual(noargs(2, obj, 8), [2, obj, 8]), true); + +function args(a) { return arguments; } + +assert.sameValue(arraysEqual(args(), []), true); +assert.sameValue(arraysEqual(args(1), [1]), true); +assert.sameValue(arraysEqual(args(1, obj), [1, obj]), true); +assert.sameValue(arraysEqual(args("foopy"), ["foopy"]), true); + +function assign(a) +{ + a = 17; + return arguments; +} + +assert.sameValue(arraysEqual(assign(1), [17]), true); + +function getLaterAssign(a) +{ + var o = arguments; + a = 17; + return o; +} + +assert.sameValue(arraysEqual(getLaterAssign(1), [17]), true); + +function assignElementGetParameter(a) +{ + arguments[0] = 17; + return a; +} + +assert.sameValue(assignElementGetParameter(42), 17); + +function assignParameterGetElement(a) +{ + a = 17; + return arguments[0]; +} + +assert.sameValue(assignParameterGetElement(42), 17); + +function assignArgSub(x, y) +{ + arguments[0] = 3; + return arguments[0]; +} + +assert.sameValue(assignArgSub(1), 3); + +function assignArgSubParamUse(x, y) +{ + arguments[0] = 3; + assert.sameValue(x, 3); + return arguments[0]; +} + +assert.sameValue(assignArgSubParamUse(1), 3); + +function assignArgumentsElement(x, y) +{ + arguments[0] = 3; + return arguments[Math.random() ? "0" : 0]; // nix arguments[const] optimizations +} + +assert.sameValue(assignArgumentsElement(1), 3); + +function assignArgumentsElementParamUse(x, y) +{ + arguments[0] = 3; + assert.sameValue(x, 3); + return arguments[Math.random() ? "0" : 0]; // nix arguments[const] optimizations +} + +assert.sameValue(assignArgumentsElementParamUse(1), 3); + +/******************** + * STRICT ARGUMENTS * + ********************/ + +function strictNoargs() +{ + "use strict"; + return arguments; +} + +assert.sameValue(arraysEqual(strictNoargs(), []), true); +assert.sameValue(arraysEqual(strictNoargs(1), [1]), true); +assert.sameValue(arraysEqual(strictNoargs(1, obj), [1, obj]), true); + +function strictArgs(a) +{ + "use strict"; + return arguments; +} + +assert.sameValue(arraysEqual(strictArgs(), []), true); +assert.sameValue(arraysEqual(strictArgs(1), [1]), true); +assert.sameValue(arraysEqual(strictArgs(1, obj), [1, obj]), true); + +function strictAssign(a) +{ + "use strict"; + a = 17; + return arguments; +} + +assert.sameValue(arraysEqual(strictAssign(), []), true); +assert.sameValue(arraysEqual(strictAssign(1), [1]), true); +assert.sameValue(arraysEqual(strictAssign(1, obj), [1, obj]), true); + +var upper; +function strictAssignAfter(a) +{ + "use strict"; + upper = arguments; + a = 42; + return upper; +} + +assert.sameValue(arraysEqual(strictAssignAfter(), []), true); +assert.sameValue(arraysEqual(strictAssignAfter(17), [17]), true); +assert.sameValue(arraysEqual(strictAssignAfter(obj), [obj]), true); + +function strictMaybeAssignOuterParam(p) +{ + "use strict"; + function inner() { p = 17; } + return arguments; +} + +assert.sameValue(arraysEqual(strictMaybeAssignOuterParam(), []), true); +assert.sameValue(arraysEqual(strictMaybeAssignOuterParam(42), [42]), true); +assert.sameValue(arraysEqual(strictMaybeAssignOuterParam(obj), [obj]), true); + +function strictAssignOuterParam(p) +{ + "use strict"; + function inner() { p = 17; } + inner(); + return arguments; +} + +assert.sameValue(arraysEqual(strictAssignOuterParam(), []), true); +assert.sameValue(arraysEqual(strictAssignOuterParam(17), [17]), true); +assert.sameValue(arraysEqual(strictAssignOuterParam(obj), [obj]), true); + +function strictAssignOuterParamPSYCH(p) +{ + "use strict"; + function inner(p) { p = 17; } + inner(); + return arguments; +} + +assert.sameValue(arraysEqual(strictAssignOuterParamPSYCH(), []), true); +assert.sameValue(arraysEqual(strictAssignOuterParamPSYCH(17), [17]), true); +assert.sameValue(arraysEqual(strictAssignOuterParamPSYCH(obj), [obj]), true); + +function strictEval(code, p) +{ + "use strict"; + eval(code); + return arguments; +} + +assert.sameValue(arraysEqual(strictEval("1", 2), ["1", 2]), true); +assert.sameValue(arraysEqual(strictEval("arguments"), ["arguments"]), true); +assert.sameValue(arraysEqual(strictEval("p = 2"), ["p = 2"]), true); +assert.sameValue(arraysEqual(strictEval("p = 2", 17), ["p = 2", 17]), true); +assert.sameValue(arraysEqual(strictEval("arguments[0] = 17"), [17]), true); +assert.sameValue(arraysEqual(strictEval("arguments[0] = 17", 42), [17, 42]), true); + +function strictMaybeNestedEval(code, p) +{ + "use strict"; + function inner() { eval(code); } + return arguments; +} + +assert.sameValue(arraysEqual(strictMaybeNestedEval("1", 2), ["1", 2]), true); +assert.sameValue(arraysEqual(strictMaybeNestedEval("arguments"), ["arguments"]), true); +assert.sameValue(arraysEqual(strictMaybeNestedEval("p = 2"), ["p = 2"]), true); +assert.sameValue(arraysEqual(strictMaybeNestedEval("p = 2", 17), ["p = 2", 17]), true); + +function strictNestedEval(code, p) +{ + "use strict"; + function inner() { eval(code); } + inner(); + return arguments; +} + +assert.sameValue(arraysEqual(strictNestedEval("1", 2), ["1", 2]), true); +assert.sameValue(arraysEqual(strictNestedEval("arguments"), ["arguments"]), true); +assert.sameValue(arraysEqual(strictNestedEval("p = 2"), ["p = 2"]), true); +assert.sameValue(arraysEqual(strictNestedEval("p = 2", 17), ["p = 2", 17]), true); +assert.sameValue(arraysEqual(strictNestedEval("arguments[0] = 17"), ["arguments[0] = 17"]), true); +assert.sameValue(arraysEqual(strictNestedEval("arguments[0] = 17", 42), ["arguments[0] = 17", 42]), true); + +function strictAssignArguments(a) +{ + "use strict"; + arguments[0] = 42; + return a; +} + +assert.sameValue(strictAssignArguments(), undefined); +assert.sameValue(strictAssignArguments(obj), obj); +assert.sameValue(strictAssignArguments(17), 17); + +function strictAssignParameterGetElement(a) +{ + "use strict"; + a = 17; + return arguments[0]; +} + +assert.sameValue(strictAssignParameterGetElement(42), 42); + +function strictAssignArgSub(x, y) +{ + "use strict"; + arguments[0] = 3; + return arguments[0]; +} + +assert.sameValue(strictAssignArgSub(1), 3); + +function strictAssignArgSubParamUse(x, y) +{ + "use strict"; + arguments[0] = 3; + assert.sameValue(x, 1); + return arguments[0]; +} + +assert.sameValue(strictAssignArgSubParamUse(1), 3); + +function strictAssignArgumentsElement(x, y) +{ + "use strict"; + arguments[0] = 3; + return arguments[Math.random() ? "0" : 0]; // nix arguments[const] optimizations +} + +assert.sameValue(strictAssignArgumentsElement(1), 3); + +function strictAssignArgumentsElementParamUse(x, y) +{ + "use strict"; + arguments[0] = 3; + assert.sameValue(x, 1); + return arguments[Math.random() ? "0" : 0]; // nix arguments[const] optimizations +} + +assert.sameValue(strictAssignArgumentsElementParamUse(1), 3); + +function strictNestedAssignShadowVar(p) +{ + "use strict"; + function inner() + { + var p = 12; + function innermost() { p = 1776; return 12; } + return innermost(); + } + return arguments; +} + +assert.sameValue(arraysEqual(strictNestedAssignShadowVar(), []), true); +assert.sameValue(arraysEqual(strictNestedAssignShadowVar(99), [99]), true); +assert.sameValue(arraysEqual(strictNestedAssignShadowVar(""), [""]), true); +assert.sameValue(arraysEqual(strictNestedAssignShadowVar(obj), [obj]), true); + +function strictNestedAssignShadowCatch(p) +{ + "use strict"; + function inner() + { + try + { + } + catch (p) + { + var f = function innermost() { p = 1776; return 12; }; + f(); + } + } + return arguments; +} + +assert.sameValue(arraysEqual(strictNestedAssignShadowCatch(), []), true); +assert.sameValue(arraysEqual(strictNestedAssignShadowCatch(99), [99]), true); +assert.sameValue(arraysEqual(strictNestedAssignShadowCatch(""), [""]), true); +assert.sameValue(arraysEqual(strictNestedAssignShadowCatch(obj), [obj]), true); + +function strictNestedAssignShadowCatchCall(p) +{ + "use strict"; + function inner() + { + try + { + } + catch (p) + { + var f = function innermost() { p = 1776; return 12; }; + f(); + } + } + inner(); + return arguments; +} + +assert.sameValue(arraysEqual(strictNestedAssignShadowCatchCall(), []), true); +assert.sameValue(arraysEqual(strictNestedAssignShadowCatchCall(99), [99]), true); +assert.sameValue(arraysEqual(strictNestedAssignShadowCatchCall(""), [""]), true); +assert.sameValue(arraysEqual(strictNestedAssignShadowCatchCall(obj), [obj]), true); + +function strictNestedAssignShadowFunction(p) +{ + "use strict"; + function inner() + { + function p() { } + p = 1776; + } + return arguments; +} + +assert.sameValue(arraysEqual(strictNestedAssignShadowFunction(), []), true); +assert.sameValue(arraysEqual(strictNestedAssignShadowFunction(99), [99]), true); +assert.sameValue(arraysEqual(strictNestedAssignShadowFunction(""), [""]), true); +assert.sameValue(arraysEqual(strictNestedAssignShadowFunction(obj), [obj]), true); + +function strictNestedAssignShadowFunctionCall(p) +{ + "use strict"; + function inner() + { + function p() { } + p = 1776; + } + return arguments; +} + +assert.sameValue(arraysEqual(strictNestedAssignShadowFunctionCall(), []), true); +assert.sameValue(arraysEqual(strictNestedAssignShadowFunctionCall(99), [99]), true); +assert.sameValue(arraysEqual(strictNestedAssignShadowFunctionCall(""), [""]), true); +assert.sameValue(arraysEqual(strictNestedAssignShadowFunctionCall(obj), [obj]), true); + +function strictNestedShadowAndMaybeEval(code, p) +{ + "use strict"; + function inner(p) { eval(code); } + return arguments; +} + +assert.sameValue(arraysEqual(strictNestedShadowAndMaybeEval("1", 2), ["1", 2]), true); +assert.sameValue(arraysEqual(strictNestedShadowAndMaybeEval("arguments"), ["arguments"]), true); +assert.sameValue(arraysEqual(strictNestedShadowAndMaybeEval("p = 2"), ["p = 2"]), true); +assert.sameValue(arraysEqual(strictNestedShadowAndMaybeEval("p = 2", 17), ["p = 2", 17]), true); +assert.sameValue(arraysEqual(strictNestedShadowAndMaybeEval("arguments[0] = 17"), ["arguments[0] = 17"]), true); +assert.sameValue(arraysEqual(strictNestedShadowAndMaybeEval("arguments[0] = 17", 42), ["arguments[0] = 17", 42]), true); + +function strictNestedShadowAndEval(code, p) +{ + "use strict"; + function inner(p) { eval(code); } + return arguments; +} + +assert.sameValue(arraysEqual(strictNestedShadowAndEval("1", 2), ["1", 2]), true); +assert.sameValue(arraysEqual(strictNestedShadowAndEval("arguments"), ["arguments"]), true); +assert.sameValue(arraysEqual(strictNestedShadowAndEval("p = 2"), ["p = 2"]), true); +assert.sameValue(arraysEqual(strictNestedShadowAndEval("p = 2", 17), ["p = 2", 17]), true); +assert.sameValue(arraysEqual(strictNestedShadowAndEval("arguments[0] = 17"), ["arguments[0] = 17"]), true); +assert.sameValue(arraysEqual(strictNestedShadowAndEval("arguments[0] = 17", 42), ["arguments[0] = 17", 42]), true); + +function strictEvalContainsMutation(code) +{ + "use strict"; + return eval(code); +} + +assert.sameValue(arraysEqual(strictEvalContainsMutation("code = 17; arguments"), ["code = 17; arguments"]), true); +assert.sameValue(arraysEqual(strictEvalContainsMutation("arguments[0] = 17; arguments"), [17]), true); +assert.sameValue(strictEvalContainsMutation("arguments[0] = 17; code"), "arguments[0] = 17; code"); + +function strictNestedAssignShadowFunctionName(p) +{ + "use strict"; + function inner() + { + function p() { p = 1776; } + p(); + } + inner(); + return arguments; +} + +assert.sameValue(arraysEqual(strictNestedAssignShadowFunctionName(), []), true); +assert.sameValue(arraysEqual(strictNestedAssignShadowFunctionName(99), [99]), true); +assert.sameValue(arraysEqual(strictNestedAssignShadowFunctionName(""), [""]), true); +assert.sameValue(arraysEqual(strictNestedAssignShadowFunctionName(obj), [obj]), true); + + +/******************************************************************************/ + +print("All tests passed!"); diff --git a/test/staging/sm/Function/throw-type-error.js b/test/staging/sm/Function/throw-type-error.js new file mode 100644 index 0000000000..19914ff8f4 --- /dev/null +++ b/test/staging/sm/Function/throw-type-error.js @@ -0,0 +1,25 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [deepEqual.js, sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +// Any copyright is dedicated to the Public Domain. +// http://creativecommons.org/publicdomain/zero/1.0/ + +const ThrowTypeError = function(){ + "use strict"; + return Object.getOwnPropertyDescriptor(arguments, "callee").get; +}(); + +assert.deepEqual(Object.getOwnPropertyDescriptor(ThrowTypeError, "length"), { + value: 0, writable: false, enumerable: false, configurable: false +}); + +assert.sameValue(Object.isFrozen(ThrowTypeError), true); + diff --git a/test/staging/sm/Iterator/constructor-subclassable.js b/test/staging/sm/Iterator/constructor-subclassable.js new file mode 100644 index 0000000000..e0ad14fd29 --- /dev/null +++ b/test/staging/sm/Iterator/constructor-subclassable.js @@ -0,0 +1,22 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +info: | + Iterator constructor can be subclassed. + + Iterator is not enabled unconditionally +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +features: +- iterator-helpers +description: | + pending +esid: pending +---*/ +class TestIterator extends Iterator { +} + +assert.sameValue(new TestIterator() instanceof Iterator, true); + diff --git a/test/staging/sm/Iterator/constructor-throw-when-called-directly.js b/test/staging/sm/Iterator/constructor-throw-when-called-directly.js new file mode 100644 index 0000000000..2a7442a072 --- /dev/null +++ b/test/staging/sm/Iterator/constructor-throw-when-called-directly.js @@ -0,0 +1,19 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +info: | + Iterator constructor throws when called directly. + + Iterator is not enabled unconditionally +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +features: +- iterator-helpers +description: | + pending +esid: pending +---*/ +assertThrowsInstanceOf(() => new Iterator(), TypeError); + diff --git a/test/staging/sm/Iterator/constructor-throw-without-new.js b/test/staging/sm/Iterator/constructor-throw-without-new.js new file mode 100644 index 0000000000..0950d43ada --- /dev/null +++ b/test/staging/sm/Iterator/constructor-throw-without-new.js @@ -0,0 +1,19 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +info: | + Iterator constructor throws when called without new. + + Iterator is not enabled unconditionally +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +features: +- iterator-helpers +description: | + pending +esid: pending +---*/ +assertThrowsInstanceOf(() => Iterator(), TypeError); + diff --git a/test/staging/sm/Iterator/constructor.js b/test/staging/sm/Iterator/constructor.js new file mode 100644 index 0000000000..cc96fa07b3 --- /dev/null +++ b/test/staging/sm/Iterator/constructor.js @@ -0,0 +1,19 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +info: | + The Iterator constructor is a built-in function. + + Iterator is not enabled unconditionally +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +features: +- iterator-helpers +description: | + pending +esid: pending +---*/ +assert.sameValue(typeof Iterator, 'function'); + diff --git a/test/staging/sm/Iterator/from/Iterator.from-descriptor.js b/test/staging/sm/Iterator/from/Iterator.from-descriptor.js new file mode 100644 index 0000000000..d4bac38b76 --- /dev/null +++ b/test/staging/sm/Iterator/from/Iterator.from-descriptor.js @@ -0,0 +1,22 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +info: | + Descriptor property of Iterator.from + + Iterator is not enabled unconditionally +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +features: +- iterator-helpers +description: | + pending +esid: pending +---*/ +const propDesc = Reflect.getOwnPropertyDescriptor(Iterator, 'from'); +assert.sameValue(propDesc.writable, true); +assert.sameValue(propDesc.enumerable, false); +assert.sameValue(propDesc.configurable, true); + diff --git a/test/staging/sm/Iterator/from/Iterator.from-length.js b/test/staging/sm/Iterator/from/Iterator.from-length.js new file mode 100644 index 0000000000..4774a21b4f --- /dev/null +++ b/test/staging/sm/Iterator/from/Iterator.from-length.js @@ -0,0 +1,25 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +description: | + The `length` property of Iterator.from. +info: | + ES7 section 17: Unless otherwise specified, the length property of a built-in + Function object has the attributes { [[Writable]]: false, [[Enumerable]]: + false, [[Configurable]]: true }. + + Iterator is not enabled unconditionally +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +features: +- iterator-helpers +esid: pending +---*/ +const propDesc = Reflect.getOwnPropertyDescriptor(Iterator.from, 'length'); +assert.sameValue(propDesc.value, 1); +assert.sameValue(propDesc.writable, false); +assert.sameValue(propDesc.enumerable, false); +assert.sameValue(propDesc.configurable, true); + diff --git a/test/staging/sm/Iterator/from/Iterator.from-name.js b/test/staging/sm/Iterator/from/Iterator.from-name.js new file mode 100644 index 0000000000..f6c9f65648 --- /dev/null +++ b/test/staging/sm/Iterator/from/Iterator.from-name.js @@ -0,0 +1,21 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +description: | + `name` property of Iterator.from. +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +features: +- iterator-helpers +info: | + Iterator is not enabled unconditionally +esid: pending +---*/ +const propDesc = Reflect.getOwnPropertyDescriptor(Iterator.from, 'name'); +assert.sameValue(propDesc.value, 'from'); +assert.sameValue(propDesc.writable, false); +assert.sameValue(propDesc.enumerable, false); +assert.sameValue(propDesc.configurable, true); + diff --git a/test/staging/sm/Iterator/from/call-from-with-different-this.js b/test/staging/sm/Iterator/from/call-from-with-different-this.js new file mode 100644 index 0000000000..aca44aaad1 --- /dev/null +++ b/test/staging/sm/Iterator/from/call-from-with-different-this.js @@ -0,0 +1,31 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +features: +- iterator-helpers +info: | + Iterator is not enabled unconditionally +description: | + pending +esid: pending +---*/ +const iter = { + next() { + assert.sameValue(arguments.length, 0); + return {done: false, value: 0}; + }, +}; +const wrap = Iterator.from.call(undefined, iter); + +const result = wrap.next("next argument is ignored"); +assert.sameValue(result.done, false); +assert.sameValue(result.value, 0); + +const returnResult = wrap.return("return argument is ignored"); +assert.sameValue(returnResult.done, true); +assert.sameValue(returnResult.value, undefined); + diff --git a/test/staging/sm/Iterator/from/iterator-not-callable-throws.js b/test/staging/sm/Iterator/from/iterator-not-callable-throws.js new file mode 100644 index 0000000000..30b752e687 --- /dev/null +++ b/test/staging/sm/Iterator/from/iterator-not-callable-throws.js @@ -0,0 +1,23 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +info: | + Iterator.from throws when called with an object with a non-callable @@iterator property. + + Iterator is not enabled unconditionally +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +features: +- iterator-helpers +description: | + pending +esid: pending +---*/ +assertThrowsInstanceOf(() => Iterator.from({ [Symbol.iterator]: 0 }), TypeError); +assertThrowsInstanceOf(() => Iterator.from({ [Symbol.iterator]: false }), TypeError); +assertThrowsInstanceOf(() => Iterator.from({ [Symbol.iterator]: "" }), TypeError); +assertThrowsInstanceOf(() => Iterator.from({ [Symbol.iterator]: {} }), TypeError); +assertThrowsInstanceOf(() => Iterator.from({ [Symbol.iterator]: Symbol('') }), TypeError); + diff --git a/test/staging/sm/Iterator/from/modify-next.js b/test/staging/sm/Iterator/from/modify-next.js new file mode 100644 index 0000000000..9b468d3b01 --- /dev/null +++ b/test/staging/sm/Iterator/from/modify-next.js @@ -0,0 +1,27 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +features: +- iterator-helpers +info: | + Iterator is not enabled unconditionally +description: | + pending +esid: pending +---*/ +const iter = { + next: () => ({ done: false, value: 0 }), +}; + +const wrap = Iterator.from(iter); + +iter.next = () => ({ done: true, value: undefined }); + +let {done, value} = wrap.next(); +assert.sameValue(done, false); +assert.sameValue(value, 0); + diff --git a/test/staging/sm/Iterator/from/modify-return.js b/test/staging/sm/Iterator/from/modify-return.js new file mode 100644 index 0000000000..2313c255d3 --- /dev/null +++ b/test/staging/sm/Iterator/from/modify-return.js @@ -0,0 +1,34 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +features: +- iterator-helpers +info: | + Iterator is not enabled unconditionally +description: | + pending +esid: pending +---*/ +const iter = { + next: () => ({ done: false, value: 0 }), + return: (value = "old return") => ({ done: true, value }), +}; + +const wrap = Iterator.from(iter); + +let {done, value} = wrap.return("return argument ignored"); +assert.sameValue(done, true); +assert.sameValue(value, "old return"); + +iter.return = () => { throw new Error(); }; +assertThrowsInstanceOf(() => wrap.return(), Error); + +iter.return = null; +let nullResult = wrap.return("return argument ignored"); +assert.sameValue(nullResult.done, true); +assert.sameValue(nullResult.value, undefined); + diff --git a/test/staging/sm/Iterator/from/o-not-object-throws.js b/test/staging/sm/Iterator/from/o-not-object-throws.js new file mode 100644 index 0000000000..031870e4d1 --- /dev/null +++ b/test/staging/sm/Iterator/from/o-not-object-throws.js @@ -0,0 +1,23 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +info: | + Iterator.from throws when called with a non-object. + + Iterator is not enabled unconditionally +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +features: +- iterator-helpers +description: | + pending +esid: pending +---*/ +assertThrowsInstanceOf(() => Iterator.from(undefined), TypeError); +assertThrowsInstanceOf(() => Iterator.from(null), TypeError); +assertThrowsInstanceOf(() => Iterator.from(0), TypeError); +assertThrowsInstanceOf(() => Iterator.from(false), TypeError); +assertThrowsInstanceOf(() => Iterator.from(Symbol('')), TypeError); + diff --git a/test/staging/sm/Iterator/from/proxy-not-wrapped.js b/test/staging/sm/Iterator/from/proxy-not-wrapped.js new file mode 100644 index 0000000000..5c1e967df5 --- /dev/null +++ b/test/staging/sm/Iterator/from/proxy-not-wrapped.js @@ -0,0 +1,46 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +features: +- iterator-helpers +info: | + Iterator is not enabled unconditionally +description: | + pending +esid: pending +---*/ +const log = []; +const handlerProxy = new Proxy({}, { + get: (target, key, receiver) => (...args) => { + log.push(`${key}: ${args[1]?.toString()}`); + + const item = Reflect[key](...args); + if (typeof item === 'function') + return (...args) => new Proxy(item.apply(receiver, args), handlerProxy); + return item; + }, +}); + +class Iter extends Iterator { + [Symbol.iterator]() { + return this; + } + next() { + return { done: false, value: 0 }; + } +} +const iter = new Iter(); +const proxy = new Proxy(iter, handlerProxy); +const wrap = Iterator.from(proxy); + +assert.sameValue( + log.join('\n'), + `get: Symbol(Symbol.iterator) +get: next +getPrototypeOf: undefined` +); + diff --git a/test/staging/sm/Iterator/from/proxy-wrap-next.js b/test/staging/sm/Iterator/from/proxy-wrap-next.js new file mode 100644 index 0000000000..6f0f2df72d --- /dev/null +++ b/test/staging/sm/Iterator/from/proxy-wrap-next.js @@ -0,0 +1,42 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [compareArray.js, sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +features: +- iterator-helpers +info: | + Iterator is not enabled unconditionally +description: | + pending +esid: pending +---*/ +const log = []; +const handlerProxy = new Proxy({}, { + get: (target, key, receiver) => (...args) => { + log.push(`${key}: ${args[1]?.toString()}`); + + const item = Reflect[key](...args); + if (typeof item === 'function') + return item.bind(receiver); + return item; + }, +}); +const iter = new Proxy({ + next: () => ({ done: false, value: 0 }), +}, handlerProxy); + +const wrap = Iterator.from(iter); +// Call next multiple times. Should not call `get` on proxy. +wrap.next(); +wrap.next(); +wrap.next(); + +assert.compareArray(log, [ + "get: Symbol(Symbol.iterator)", + "get: next", + "getPrototypeOf: undefined", +]); + diff --git a/test/staging/sm/Iterator/from/proxy-wrap-return.js b/test/staging/sm/Iterator/from/proxy-wrap-return.js new file mode 100644 index 0000000000..5af980fbde --- /dev/null +++ b/test/staging/sm/Iterator/from/proxy-wrap-return.js @@ -0,0 +1,43 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [compareArray.js, sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +features: +- iterator-helpers +info: | + Iterator is not enabled unconditionally +description: | + pending +esid: pending +---*/ +const log = []; +const handlerProxy = new Proxy({}, { + get: (target, key, receiver) => (...args) => { + log.push(`${key}: ${args[1]?.toString()}`); + + const item = Reflect[key](...args); + if (typeof item === 'function') + return item.bind(receiver); + return item; + }, +}); +const iter = new Proxy({ + next: () => ({ done: false, value: 0 }), + return: (value) => ({ done: true, value }), +}, handlerProxy); + +const wrap = Iterator.from(iter); +wrap.return(); +wrap.return(); + +assert.compareArray(log, [ + "get: Symbol(Symbol.iterator)", + "get: next", + "getPrototypeOf: undefined", + "get: return", + "get: return", +]); + diff --git a/test/staging/sm/Iterator/from/return-iterator-if-iterable.js b/test/staging/sm/Iterator/from/return-iterator-if-iterable.js new file mode 100644 index 0000000000..4f72c51fa7 --- /dev/null +++ b/test/staging/sm/Iterator/from/return-iterator-if-iterable.js @@ -0,0 +1,35 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +info: | + Iterator.from returns O if it is iterable, an iterator, and an instance of Iterator. + + Iterator is not enabled unconditionally +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +features: +- iterator-helpers +description: | + pending +esid: pending +---*/ +class TestIterator extends Iterator { + [Symbol.iterator]() { + return this; + } + + next() { + return { done: false, value: this.value++ }; + } + + value = 0; +} + +const iter = new TestIterator(); +assert.sameValue(iter, Iterator.from(iter)); + +const arrayIter = [1, 2, 3][Symbol.iterator](); +assert.sameValue(arrayIter, Iterator.from(arrayIter)); + diff --git a/test/staging/sm/Iterator/from/return-wrapper-if-not-iterable.js b/test/staging/sm/Iterator/from/return-wrapper-if-not-iterable.js new file mode 100644 index 0000000000..6604f9a20b --- /dev/null +++ b/test/staging/sm/Iterator/from/return-wrapper-if-not-iterable.js @@ -0,0 +1,38 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +info: | + Iterator.from returns an iterator wrapper if O is not an iterable. + + Iterator is not enabled unconditionally +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +features: +- iterator-helpers +description: | + pending +esid: pending +---*/ +class TestIterator { + next() { + return { done: false, value: 0 }; + } +} + +const iter = new TestIterator(); +assert.sameValue( + Symbol.iterator in iter, + false, + 'iter is not an iterable.' +); + +const wrapper = Iterator.from(iter); +assert.sameValue(iter !== wrapper, true); +assert.sameValue( + Symbol.iterator in wrapper, + true, + 'wrapper is an iterable.' +); + diff --git a/test/staging/sm/Iterator/from/return-wrapper-if-not-iterator-instance.js b/test/staging/sm/Iterator/from/return-wrapper-if-not-iterator-instance.js new file mode 100644 index 0000000000..08cb09f631 --- /dev/null +++ b/test/staging/sm/Iterator/from/return-wrapper-if-not-iterator-instance.js @@ -0,0 +1,34 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +info: | + Iterator.from returns an iterator wrapper if O is not an instance of Iterator. + + Iterator is not enabled unconditionally +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +features: +- iterator-helpers +description: | + pending +esid: pending +---*/ +class TestIterator { + [Symbol.iterator]() { + return this; + } + + next() { + return { done: false, value: 0 }; + } +} + +const iter = new TestIterator(); +assert.sameValue(iter instanceof Iterator, false); + +const wrapper = Iterator.from(iter); +assert.sameValue(iter !== wrapper, true); +assert.sameValue(wrapper instanceof Iterator, true); + diff --git a/test/staging/sm/Iterator/from/wrap-functions-on-other-global.js b/test/staging/sm/Iterator/from/wrap-functions-on-other-global.js new file mode 100644 index 0000000000..b6c3190656 --- /dev/null +++ b/test/staging/sm/Iterator/from/wrap-functions-on-other-global.js @@ -0,0 +1,39 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +features: +- iterator-helpers +description: | + pending +esid: pending +---*/ + +class TestError extends Error {} + +function checkIterResult({done, value}, expectedDone, expectedValue) { + assert.sameValue(done, expectedDone); + assert.sameValue(value, expectedValue); +} + +const iter = { + next(value) { + return {done: false, value: arguments.length}; + }, + return() { + throw new TestError(); + }, + throw: (value) => ({done: true, value}), +}; +const thisWrap = Iterator.from(iter); +const otherGlobal = createNewGlobal({newCompartment: true}); +const otherWrap = otherGlobal.Iterator.from(iter); + +checkIterResult(thisWrap.next.call(otherWrap), false, 0); +checkIterResult(thisWrap.next.call(otherWrap, 'value'), false, 0); + +assertThrowsInstanceOf(thisWrap.return.bind(otherWrap), TestError); + diff --git a/test/staging/sm/Iterator/from/wrap-method-with-non-wrap-this-throws.js b/test/staging/sm/Iterator/from/wrap-method-with-non-wrap-this-throws.js new file mode 100644 index 0000000000..db19b0d5eb --- /dev/null +++ b/test/staging/sm/Iterator/from/wrap-method-with-non-wrap-this-throws.js @@ -0,0 +1,54 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +features: +- iterator-helpers +info: | + Iterator is not enabled unconditionally +description: | + pending +esid: pending +---*/ +// All methods on %WrapForValidIteratorPrototype% require an [[Iterated]] +// internal slot on the `this` object. + +class TestIterator { + next() { + return { + done: false, + value: 0, + }; + } +} + +const nextMethod = Iterator.from(new TestIterator()).next; +assertThrowsInstanceOf(() => nextMethod.call(undefined), TypeError); +assertThrowsInstanceOf(() => nextMethod.call(null), TypeError); +assertThrowsInstanceOf(() => nextMethod.call(0), TypeError); +assertThrowsInstanceOf(() => nextMethod.call(false), TypeError); +assertThrowsInstanceOf(() => nextMethod.call('test'), TypeError); +assertThrowsInstanceOf(() => nextMethod.call(Object(1)), TypeError); +assertThrowsInstanceOf(() => nextMethod.call({}), TypeError); + +const returnMethod = Iterator.from(new TestIterator()).next; +assertThrowsInstanceOf(() => returnMethod.call(undefined), TypeError); +assertThrowsInstanceOf(() => returnMethod.call(null), TypeError); +assertThrowsInstanceOf(() => returnMethod.call(0), TypeError); +assertThrowsInstanceOf(() => returnMethod.call(false), TypeError); +assertThrowsInstanceOf(() => returnMethod.call('test'), TypeError); +assertThrowsInstanceOf(() => returnMethod.call(Object(1)), TypeError); +assertThrowsInstanceOf(() => returnMethod.call({}), TypeError); + +const throwMethod = Iterator.from(new TestIterator()).next; +assertThrowsInstanceOf(() => throwMethod.call(undefined), TypeError); +assertThrowsInstanceOf(() => throwMethod.call(null), TypeError); +assertThrowsInstanceOf(() => throwMethod.call(0), TypeError); +assertThrowsInstanceOf(() => throwMethod.call(false), TypeError); +assertThrowsInstanceOf(() => throwMethod.call('test'), TypeError); +assertThrowsInstanceOf(() => throwMethod.call(Object(1)), TypeError); +assertThrowsInstanceOf(() => throwMethod.call({}), TypeError); + diff --git a/test/staging/sm/Iterator/from/wrap-new-global.js b/test/staging/sm/Iterator/from/wrap-new-global.js new file mode 100644 index 0000000000..1b24c614bd --- /dev/null +++ b/test/staging/sm/Iterator/from/wrap-new-global.js @@ -0,0 +1,21 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +features: +- iterator-helpers +info: | + Iterator is not enabled unconditionally +description: | + pending +esid: pending +---*/ +const otherGlobal = createNewGlobal({newCompartment: true}); + +const iter = [1, 2, 3].values(); +assert.sameValue(iter, Iterator.from(iter)); +assert.sameValue(iter !== otherGlobal.Iterator.from(iter), true); + diff --git a/test/staging/sm/Iterator/from/wrap-next-forwards-value.js b/test/staging/sm/Iterator/from/wrap-next-forwards-value.js new file mode 100644 index 0000000000..f67ccabee0 --- /dev/null +++ b/test/staging/sm/Iterator/from/wrap-next-forwards-value.js @@ -0,0 +1,29 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +features: +- iterator-helpers +info: | + Iterator is not enabled unconditionally +description: | + pending +esid: pending +---*/ +class Iter { + next(value) { + assert.sameValue(arguments.length, 0); + return { done: false, value }; + } +} + +const iter = new Iter(); +const wrap = Iterator.from(iter); +assert.sameValue(iter !== wrap, true); + +assert.sameValue(iter.v, undefined); +wrap.next(1); + diff --git a/test/staging/sm/Iterator/from/wrap-next-not-object-throws.js b/test/staging/sm/Iterator/from/wrap-next-not-object-throws.js new file mode 100644 index 0000000000..5fbc438436 --- /dev/null +++ b/test/staging/sm/Iterator/from/wrap-next-not-object-throws.js @@ -0,0 +1,30 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +features: +- iterator-helpers +info: | + Iterator is not enabled unconditionally +description: | + pending +esid: pending +---*/ +const iter = (value) => Iterator.from({ + next: () => value, +}); + +for (let value of [ + undefined, + null, + 0, + false, + "test", + Symbol(""), +]) { + assert.sameValue(iter(value).next(), value); +} + diff --git a/test/staging/sm/Iterator/from/wrap-return-closes-iterator.js b/test/staging/sm/Iterator/from/wrap-return-closes-iterator.js new file mode 100644 index 0000000000..e301e47764 --- /dev/null +++ b/test/staging/sm/Iterator/from/wrap-return-closes-iterator.js @@ -0,0 +1,46 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +features: +- iterator-helpers +info: | + Iterator is not enabled unconditionally +description: | + pending +esid: pending +---*/ +class Iter { + next() { + if (this.closed) + return { done: true, value: undefined }; + return { done: false, value: 0 }; + } + + return(value) { + assert.sameValue(arguments.length, 0); + this.closed = true; + return { done: true, value: 42 }; + } +} + +const iter = new Iter(); +const wrap = Iterator.from(iter); +assert.sameValue(iter.closed, undefined); + +let result = wrap.next(); +assert.sameValue(result.done, false); +assert.sameValue(result.value, 0); + +result = wrap.return(1); +assert.sameValue(result.done, true); +assert.sameValue(result.value, 42); + +assert.sameValue(iter.closed, true); +result = wrap.next(); +assert.sameValue(result.done, true); +assert.sameValue(result.value, undefined); + diff --git a/test/staging/sm/Iterator/iterator.js b/test/staging/sm/Iterator/iterator.js new file mode 100644 index 0000000000..ee7879d50f --- /dev/null +++ b/test/staging/sm/Iterator/iterator.js @@ -0,0 +1,23 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +info: | + Property descriptor of Iterator. + + Iterator is not enabled unconditionally +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +features: +- iterator-helpers +description: | + pending +esid: pending +---*/ +const propDesc = Reflect.getOwnPropertyDescriptor(this, 'Iterator'); +assert.sameValue(propDesc.value, Iterator); +assert.sameValue(propDesc.writable, true); +assert.sameValue(propDesc.enumerable, false); +assert.sameValue(propDesc.configurable, true); + diff --git a/test/staging/sm/Iterator/length.js b/test/staging/sm/Iterator/length.js new file mode 100644 index 0000000000..d108db7845 --- /dev/null +++ b/test/staging/sm/Iterator/length.js @@ -0,0 +1,23 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +info: | + The "length" property of Iterator + + Iterator is not enabled unconditionally +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +features: +- iterator-helpers +description: | + pending +esid: pending +---*/ +const propDesc = Reflect.getOwnPropertyDescriptor(Iterator, 'length'); +assert.sameValue(propDesc.value, 0); +assert.sameValue(propDesc.writable, false); +assert.sameValue(propDesc.enumerable, false); +assert.sameValue(propDesc.configurable, true); + diff --git a/test/staging/sm/Iterator/name.js b/test/staging/sm/Iterator/name.js new file mode 100644 index 0000000000..2d0404bb6a --- /dev/null +++ b/test/staging/sm/Iterator/name.js @@ -0,0 +1,23 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +info: | + The "name" property of Iterator + + Iterator is not enabled unconditionally +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +features: +- iterator-helpers +description: | + pending +esid: pending +---*/ +const propDesc = Reflect.getOwnPropertyDescriptor(Iterator, 'name'); +assert.sameValue(propDesc.value, 'Iterator'); +assert.sameValue(propDesc.writable, false); +assert.sameValue(propDesc.enumerable, false); +assert.sameValue(propDesc.configurable, true); + diff --git a/test/staging/sm/Iterator/proto.js b/test/staging/sm/Iterator/proto.js new file mode 100644 index 0000000000..90244ed2f5 --- /dev/null +++ b/test/staging/sm/Iterator/proto.js @@ -0,0 +1,24 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +info: | + The prototype of the Iterator constructor is the intrinsic object %FunctionPrototype%. + + Iterator is not enabled unconditionally +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +features: +- iterator-helpers +description: | + pending +esid: pending +---*/ +assert.sameValue(Object.getPrototypeOf(Iterator), Function.prototype); + +const propDesc = Reflect.getOwnPropertyDescriptor(Iterator, 'prototype'); +assert.sameValue(propDesc.writable, false); +assert.sameValue(propDesc.enumerable, false); +assert.sameValue(propDesc.configurable, false); + diff --git a/test/staging/sm/Iterator/prototype/drop/drop-more-than-available.js b/test/staging/sm/Iterator/prototype/drop/drop-more-than-available.js new file mode 100644 index 0000000000..431ff88ae1 --- /dev/null +++ b/test/staging/sm/Iterator/prototype/drop/drop-more-than-available.js @@ -0,0 +1,40 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +esid: pending +description: | + %Iterator.prototype%.drop returns if the iterator is done. +info: | + Iterator Helpers proposal 2.1.5.5 1. Repeat, while remaining > 0, + ... + b. Let next be ? IteratorStep(iterated). + c. If next is false, return undefined. +features: +- iterator-helpers +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +---*/ + +// +// +let iter = [1, 2].values().drop(3); +let result = iter.next(); +assert.sameValue(result.value, undefined); +assert.sameValue(result.done, true); + +class TestIterator extends Iterator { + counter = 0; + next() { + return {done: ++this.counter >= 2, value: undefined}; + } +} + +iter = new TestIterator(); +let dropped = iter.drop(10); +result = dropped.next(); +assert.sameValue(result.value, undefined); +assert.sameValue(result.done, true); +assert.sameValue(iter.counter, 2); + diff --git a/test/staging/sm/Iterator/prototype/drop/drop.js b/test/staging/sm/Iterator/prototype/drop/drop.js new file mode 100644 index 0000000000..9fb1e9e806 --- /dev/null +++ b/test/staging/sm/Iterator/prototype/drop/drop.js @@ -0,0 +1,30 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +esid: pending +description: | + Smoketest of %Iterator.prototype%.drop. +info: | + Iterator Helpers proposal 2.1.5.5 +features: +- async-iteration +- iterator-helpers +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +---*/ + +let iter = [1, 2, 3].values().drop(1); + +for (const v of [2, 3]) { + let result = iter.next(); + assert.sameValue(result.done, false); + assert.sameValue(result.value, v); +} + +assert.sameValue(iter.next().done, true); + +// `drop`, when called without arguments, throws a RangeError, +assertThrowsInstanceOf(() => ['test'].values().drop(), RangeError); + diff --git a/test/staging/sm/Iterator/prototype/drop/length.js b/test/staging/sm/Iterator/prototype/drop/length.js new file mode 100644 index 0000000000..60a8ca0d11 --- /dev/null +++ b/test/staging/sm/Iterator/prototype/drop/length.js @@ -0,0 +1,26 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +esid: pending +description: | + %Iterator.prototype%.drop length value and descriptor. +info: | + 17 ECMAScript Standard Built-in Objects +features: +- Symbol.iterator +- iterator-helpers +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +---*/ +// + +assert.sameValue(Iterator.prototype.drop.length, 1); + +const propertyDescriptor = Reflect.getOwnPropertyDescriptor(Iterator.prototype.drop, 'length'); +assert.sameValue(propertyDescriptor.value, 1); +assert.sameValue(propertyDescriptor.enumerable, false); +assert.sameValue(propertyDescriptor.writable, false); +assert.sameValue(propertyDescriptor.configurable, true); + diff --git a/test/staging/sm/Iterator/prototype/drop/name.js b/test/staging/sm/Iterator/prototype/drop/name.js new file mode 100644 index 0000000000..abbeeb2e49 --- /dev/null +++ b/test/staging/sm/Iterator/prototype/drop/name.js @@ -0,0 +1,23 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +esid: pending +description: | + %Iterator.prototype%.drop.name value and descriptor. +info: | + 17 ECMAScript Standard Built-in Objects +features: +- iterator-helpers +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +---*/ +assert.sameValue(Iterator.prototype.drop.name, 'drop'); + +const propertyDescriptor = Reflect.getOwnPropertyDescriptor(Iterator.prototype.drop, 'name'); +assert.sameValue(propertyDescriptor.value, 'drop'); +assert.sameValue(propertyDescriptor.enumerable, false); +assert.sameValue(propertyDescriptor.writable, false); +assert.sameValue(propertyDescriptor.configurable, true); + diff --git a/test/staging/sm/Iterator/prototype/every/check-fn-after-getting-iterator.js b/test/staging/sm/Iterator/prototype/every/check-fn-after-getting-iterator.js new file mode 100644 index 0000000000..33b144ce73 --- /dev/null +++ b/test/staging/sm/Iterator/prototype/every/check-fn-after-getting-iterator.js @@ -0,0 +1,37 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [compareArray.js, sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +features: +- iterator-helpers +info: | + Iterator is not enabled unconditionally +description: | + pending +esid: pending +---*/ +const log = []; +const handlerProxy = new Proxy({}, { + get: (target, key, receiver) => (...args) => { + log.push(`${key}: ${args[1]?.toString()}`); + return Reflect[key](...args); + }, +}); + +class TestIterator extends Iterator { + next() { + return {done: true}; + } +} + +const iter = new Proxy(new TestIterator(), handlerProxy); +assertThrowsInstanceOf(() => iter.every(1), TypeError); + +assert.compareArray( + log, + ["get: every"] +); + diff --git a/test/staging/sm/Iterator/prototype/every/coerce-result-to-boolean.js b/test/staging/sm/Iterator/prototype/every/coerce-result-to-boolean.js new file mode 100644 index 0000000000..1d742fa1f5 --- /dev/null +++ b/test/staging/sm/Iterator/prototype/every/coerce-result-to-boolean.js @@ -0,0 +1,36 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +features: +- IsHTMLDDA +- iterator-helpers +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +info: | + Iterator is not enabled unconditionally +description: | + pending +esid: pending +---*/ + +const fn = (value) => value; +assert.sameValue([true].values().every(fn), true); +assert.sameValue([1].values().every(fn), true); +assert.sameValue([[]].values().every(fn), true); +assert.sameValue([{}].values().every(fn), true); +assert.sameValue(['test'].values().every(fn), true); + +assert.sameValue([false].values().every(fn), false); +assert.sameValue([0].values().every(fn), false); +assert.sameValue([''].values().every(fn), false); +assert.sameValue([null].values().every(fn), false); +assert.sameValue([undefined].values().every(fn), false); +assert.sameValue([NaN].values().every(fn), false); +assert.sameValue([-0].values().every(fn), false); +assert.sameValue([0n].values().every(fn), false); + +const htmlDDA = createIsHTMLDDA(); +assert.sameValue([htmlDDA].values().every(fn), false); + diff --git a/test/staging/sm/Iterator/prototype/every/descriptor.js b/test/staging/sm/Iterator/prototype/every/descriptor.js new file mode 100644 index 0000000000..a111f06948 --- /dev/null +++ b/test/staging/sm/Iterator/prototype/every/descriptor.js @@ -0,0 +1,23 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +info: | + Descriptor property of Iterator.prototype.every + + Iterator is not enabled unconditionally +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +features: +- iterator-helpers +description: | + pending +esid: pending +---*/ +const propDesc = Reflect.getOwnPropertyDescriptor(Iterator.prototype, 'every'); +assert.sameValue(typeof propDesc.value, 'function'); +assert.sameValue(propDesc.writable, true); +assert.sameValue(propDesc.enumerable, false); +assert.sameValue(propDesc.configurable, true); + diff --git a/test/staging/sm/Iterator/prototype/every/error-from-correct-realm.js b/test/staging/sm/Iterator/prototype/every/error-from-correct-realm.js new file mode 100644 index 0000000000..b2ca885786 --- /dev/null +++ b/test/staging/sm/Iterator/prototype/every/error-from-correct-realm.js @@ -0,0 +1,28 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +features: +- iterator-helpers +info: | + Iterator is not enabled unconditionally +description: | + pending +esid: pending +---*/ + +const otherGlobal = createNewGlobal({newCompartment: true}); +assert.sameValue(TypeError !== otherGlobal.TypeError, true); + +const iter = [].values(); + +assertThrowsInstanceOf(() => iter.every(), TypeError); +assertThrowsInstanceOf( + otherGlobal.Iterator.prototype.every.bind(iter), + otherGlobal.TypeError, + 'TypeError comes from the realm of the method.', +); + diff --git a/test/staging/sm/Iterator/prototype/every/fn-not-callable-throws.js b/test/staging/sm/Iterator/prototype/every/fn-not-callable-throws.js new file mode 100644 index 0000000000..095c718c77 --- /dev/null +++ b/test/staging/sm/Iterator/prototype/every/fn-not-callable-throws.js @@ -0,0 +1,27 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +features: +- iterator-helpers +info: | + Iterator is not enabled unconditionally +description: | + pending +esid: pending +---*/ + +const iter = [].values(); + +assertThrowsInstanceOf(() => iter.every(), TypeError); +assertThrowsInstanceOf(() => iter.every(undefined), TypeError); +assertThrowsInstanceOf(() => iter.every(null), TypeError); +assertThrowsInstanceOf(() => iter.every(0), TypeError); +assertThrowsInstanceOf(() => iter.every(false), TypeError); +assertThrowsInstanceOf(() => iter.every(''), TypeError); +assertThrowsInstanceOf(() => iter.every(Symbol('')), TypeError); +assertThrowsInstanceOf(() => iter.every({}), TypeError); + diff --git a/test/staging/sm/Iterator/prototype/every/fn-throws-close-iterator.js b/test/staging/sm/Iterator/prototype/every/fn-throws-close-iterator.js new file mode 100644 index 0000000000..eec0666339 --- /dev/null +++ b/test/staging/sm/Iterator/prototype/every/fn-throws-close-iterator.js @@ -0,0 +1,34 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +features: +- iterator-helpers +info: | + Iterator is not enabled unconditionally +description: | + pending +esid: pending +---*/ + +class TestIterator extends Iterator { + next() { + return { done: this.closed }; + } + + closed = false; + return() { + this.closed = true; + } +} + +const fn = () => { throw new Error(); }; +const iter = new TestIterator(); + +assert.sameValue(iter.closed, false); +assertThrowsInstanceOf(() => iter.every(fn), Error); +assert.sameValue(iter.closed, true); + diff --git a/test/staging/sm/Iterator/prototype/every/length.js b/test/staging/sm/Iterator/prototype/every/length.js new file mode 100644 index 0000000000..a8e0163a86 --- /dev/null +++ b/test/staging/sm/Iterator/prototype/every/length.js @@ -0,0 +1,25 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +description: | + The `length` property of Iterator.prototype.every. +info: | + ES7 section 17: Unless otherwise specified, the length property of a built-in + Function object has the attributes { [[Writable]]: false, [[Enumerable]]: + false, [[Configurable]]: true }. + + Iterator is not enabled unconditionally +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +features: +- iterator-helpers +esid: pending +---*/ +const propDesc = Reflect.getOwnPropertyDescriptor(Iterator.prototype.every, 'length'); +assert.sameValue(propDesc.value, 1); +assert.sameValue(propDesc.writable, false); +assert.sameValue(propDesc.enumerable, false); +assert.sameValue(propDesc.configurable, true); + diff --git a/test/staging/sm/Iterator/prototype/every/name.js b/test/staging/sm/Iterator/prototype/every/name.js new file mode 100644 index 0000000000..f8d9ccc7b8 --- /dev/null +++ b/test/staging/sm/Iterator/prototype/every/name.js @@ -0,0 +1,21 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +description: | + `name` property of Iterator.prototype.every. +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +features: +- iterator-helpers +info: | + Iterator is not enabled unconditionally +esid: pending +---*/ +const propDesc = Reflect.getOwnPropertyDescriptor(Iterator.prototype.every, 'name'); +assert.sameValue(propDesc.value, 'every'); +assert.sameValue(propDesc.writable, false); +assert.sameValue(propDesc.enumerable, false); +assert.sameValue(propDesc.configurable, true); + diff --git a/test/staging/sm/Iterator/prototype/every/next-throws-iterator-not-closed.js b/test/staging/sm/Iterator/prototype/every/next-throws-iterator-not-closed.js new file mode 100644 index 0000000000..bea05d4cad --- /dev/null +++ b/test/staging/sm/Iterator/prototype/every/next-throws-iterator-not-closed.js @@ -0,0 +1,34 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +features: +- iterator-helpers +info: | + Iterator is not enabled unconditionally +description: | + pending +esid: pending +---*/ + +class TestIterator extends Iterator { + next() { + throw new Error(); + } + + closed = false; + return() { + this.closed = true; + } +} + +const fn = () => {}; +const iter = new TestIterator(); + +assert.sameValue(iter.closed, false); +assertThrowsInstanceOf(() => iter.every(fn), Error); +assert.sameValue(iter.closed, false); + diff --git a/test/staging/sm/Iterator/prototype/every/proxy.js b/test/staging/sm/Iterator/prototype/every/proxy.js new file mode 100644 index 0000000000..9a9b5a8c86 --- /dev/null +++ b/test/staging/sm/Iterator/prototype/every/proxy.js @@ -0,0 +1,56 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +features: +- iterator-helpers +info: | + Iterator is not enabled unconditionally +description: | + pending +esid: pending +---*/ +// +// This test checks that %Iterator.prototype%.every only gets the `next` method off of the +// iterator once, and never accesses the @@iterator property. +const log = []; +const handlerProxy = new Proxy({}, { + get: (target, key, receiver) => (...args) => { + log.push(`${key}: ${args[1]?.toString()}`); + return Reflect[key](...args); + }, +}); + +class Counter extends Iterator { + value = 0; + next() { + const value = this.value; + if (value < 2) { + this.value = value + 1; + return {done: false, value}; + } + return {done: true}; + } +} + +const iter = new Proxy(new Counter(), handlerProxy); +assert.sameValue(iter.every(x => x % 2 == 0), false); + +assert.sameValue( + log.join('\n'), + `get: every +get: next +get: value +set: value +getOwnPropertyDescriptor: value +defineProperty: value +get: value +set: value +getOwnPropertyDescriptor: value +defineProperty: value +get: return` +); + diff --git a/test/staging/sm/Iterator/prototype/every/return-true-if-all-match.js b/test/staging/sm/Iterator/prototype/every/return-true-if-all-match.js new file mode 100644 index 0000000000..a63f555ea3 --- /dev/null +++ b/test/staging/sm/Iterator/prototype/every/return-true-if-all-match.js @@ -0,0 +1,23 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +features: +- iterator-helpers +info: | + Iterator is not enabled unconditionally +description: | + pending +esid: pending +---*/ + +const iter = [1, 3, 5].values(); +const fn = (value) => value % 2 == 1; + +assert.sameValue(iter.every(fn), true); + +assert.sameValue([].values().every(x => x), true); + diff --git a/test/staging/sm/Iterator/prototype/every/short-circuit-on-false.js b/test/staging/sm/Iterator/prototype/every/short-circuit-on-false.js new file mode 100644 index 0000000000..1f4a310b3d --- /dev/null +++ b/test/staging/sm/Iterator/prototype/every/short-circuit-on-false.js @@ -0,0 +1,26 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +features: +- iterator-helpers +info: | + Iterator is not enabled unconditionally +description: | + pending +esid: pending +---*/ + +const iter = [1, 2, 3].values(); +const log = []; +const fn = (value) => { + log.push(value.toString()); + return value % 2 == 1; +}; + +assert.sameValue(iter.every(fn), false); +assert.sameValue(log.join(','), '1,2'); + diff --git a/test/staging/sm/Iterator/prototype/every/this-not-iterator-throws.js b/test/staging/sm/Iterator/prototype/every/this-not-iterator-throws.js new file mode 100644 index 0000000000..14951b2bec --- /dev/null +++ b/test/staging/sm/Iterator/prototype/every/this-not-iterator-throws.js @@ -0,0 +1,21 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +features: +- iterator-helpers +info: | + Iterator is not enabled unconditionally +description: | + pending +esid: pending +---*/ + +const fn = x => x; +assertThrowsInstanceOf(Iterator.prototype.every.bind(undefined, fn), TypeError); +assertThrowsInstanceOf(Iterator.prototype.every.bind({}, fn), TypeError); +assertThrowsInstanceOf(Iterator.prototype.every.bind({next: 0}, fn), TypeError); + diff --git a/test/staging/sm/Iterator/prototype/every/value-throws-iterator-not-closed.js b/test/staging/sm/Iterator/prototype/every/value-throws-iterator-not-closed.js new file mode 100644 index 0000000000..11b9b9e3f0 --- /dev/null +++ b/test/staging/sm/Iterator/prototype/every/value-throws-iterator-not-closed.js @@ -0,0 +1,37 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +features: +- iterator-helpers +info: | + Iterator is not enabled unconditionally +description: | + pending +esid: pending +---*/ + +class TestError extends Error {} +class TestIterator extends Iterator { + next() { + return new Proxy({done: false}, {get: (target, key, receiver) => { + if (key === 'value') + throw new TestError(); + return 0; + }}); + } + + closed = false; + return() { + closed = true; + } +} + +const iterator = new TestIterator(); +assert.sameValue(iterator.closed, false, 'iterator starts unclosed'); +assertThrowsInstanceOf(() => iterator.every(x => x), TestError); +assert.sameValue(iterator.closed, false, 'iterator remains unclosed'); + diff --git a/test/staging/sm/Iterator/prototype/filter/coerce-result-to-boolean.js b/test/staging/sm/Iterator/prototype/filter/coerce-result-to-boolean.js new file mode 100644 index 0000000000..0ac497f3fa --- /dev/null +++ b/test/staging/sm/Iterator/prototype/filter/coerce-result-to-boolean.js @@ -0,0 +1,29 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +features: +- IsHTMLDDA +- iterator-helpers +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +info: | + Iterator is not enabled unconditionally +description: | + pending +esid: pending +---*/ + +// All truthy values are kept. +const truthyValues = [true, 1, [], {}, 'test']; +for (const value of [...truthyValues].values().filter(x => x)) { + assert.sameValue(truthyValues.shift(), value); +} + +// All falsy values are filtered out. +const falsyValues = [false, 0, '', null, undefined, NaN, -0, 0n, createIsHTMLDDA()]; +const result = falsyValues.values().filter(x => x).next(); +assert.sameValue(result.done, true); +assert.sameValue(result.value, undefined); + diff --git a/test/staging/sm/Iterator/prototype/filter/filter.js b/test/staging/sm/Iterator/prototype/filter/filter.js new file mode 100644 index 0000000000..8a9de01e1c --- /dev/null +++ b/test/staging/sm/Iterator/prototype/filter/filter.js @@ -0,0 +1,24 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +features: +- async-iteration +description: | + pending +esid: pending +---*/ + +let iter = [1, 2, 3].values().filter(x => x % 2); + +for (const v of [1, 3]) { + let result = iter.next(); + assert.sameValue(result.done, false); + assert.sameValue(result.value, v); +} + +assert.sameValue(iter.next().done, true); + diff --git a/test/staging/sm/Iterator/prototype/filter/length.js b/test/staging/sm/Iterator/prototype/filter/length.js new file mode 100644 index 0000000000..a3d1bc9e8b --- /dev/null +++ b/test/staging/sm/Iterator/prototype/filter/length.js @@ -0,0 +1,26 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +esid: pending +description: | + %Iterator.prototype%.filter length value and descriptor. +info: | + 17 ECMAScript Standard Built-in Objects +features: +- Symbol.iterator +- iterator-helpers +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +---*/ +// + +assert.sameValue(Iterator.prototype.filter.length, 1); + +const propertyDescriptor = Reflect.getOwnPropertyDescriptor(Iterator.prototype.filter, 'length'); +assert.sameValue(propertyDescriptor.value, 1); +assert.sameValue(propertyDescriptor.enumerable, false); +assert.sameValue(propertyDescriptor.writable, false); +assert.sameValue(propertyDescriptor.configurable, true); + diff --git a/test/staging/sm/Iterator/prototype/filter/name.js b/test/staging/sm/Iterator/prototype/filter/name.js new file mode 100644 index 0000000000..9a673bfec7 --- /dev/null +++ b/test/staging/sm/Iterator/prototype/filter/name.js @@ -0,0 +1,23 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +esid: pending +description: | + %Iterator.prototype%.filter.name value and descriptor. +info: | + 17 ECMAScript Standard Built-in Objects +features: +- iterator-helpers +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +---*/ +assert.sameValue(Iterator.prototype.filter.name, 'filter'); + +const propertyDescriptor = Reflect.getOwnPropertyDescriptor(Iterator.prototype.filter, 'name'); +assert.sameValue(propertyDescriptor.value, 'filter'); +assert.sameValue(propertyDescriptor.enumerable, false); +assert.sameValue(propertyDescriptor.writable, false); +assert.sameValue(propertyDescriptor.configurable, true); + diff --git a/test/staging/sm/Iterator/prototype/find/check-fn-after-getting-iterator.js b/test/staging/sm/Iterator/prototype/find/check-fn-after-getting-iterator.js new file mode 100644 index 0000000000..b7f520fda3 --- /dev/null +++ b/test/staging/sm/Iterator/prototype/find/check-fn-after-getting-iterator.js @@ -0,0 +1,37 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [compareArray.js, sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +features: +- iterator-helpers +info: | + Iterator is not enabled unconditionally +description: | + pending +esid: pending +---*/ +const log = []; +const handlerProxy = new Proxy({}, { + get: (target, key, receiver) => (...args) => { + log.push(`${key}: ${args[1]?.toString()}`); + return Reflect[key](...args); + }, +}); + +class TestIterator extends Iterator { + next() { + return {done: true}; + } +} + +const iter = new Proxy(new TestIterator(), handlerProxy); +assertThrowsInstanceOf(() => iter.find(1), TypeError); + +assert.compareArray( + log, + ["get: find"] +); + diff --git a/test/staging/sm/Iterator/prototype/find/coerce-result-to-boolean.js b/test/staging/sm/Iterator/prototype/find/coerce-result-to-boolean.js new file mode 100644 index 0000000000..60d4fe0ed3 --- /dev/null +++ b/test/staging/sm/Iterator/prototype/find/coerce-result-to-boolean.js @@ -0,0 +1,40 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +features: +- IsHTMLDDA +- iterator-helpers +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +info: | + Iterator is not enabled unconditionally +description: | + pending +esid: pending +---*/ + +const fn = (value) => value; +assert.sameValue([true].values().find(fn), true); +assert.sameValue([1].values().find(fn), 1); +assert.sameValue(['test'].values().find(fn), 'test'); + +assert.sameValue([false].values().find(fn), undefined); +assert.sameValue([0].values().find(fn), undefined); +assert.sameValue([''].values().find(fn), undefined); +assert.sameValue([null].values().find(fn), undefined); +assert.sameValue([undefined].values().find(fn), undefined); +assert.sameValue([NaN].values().find(fn), undefined); +assert.sameValue([-0].values().find(fn), undefined); +assert.sameValue([0n].values().find(fn), undefined); + +let array = []; +assert.sameValue([array].values().find(fn), array); + +let object = {}; +assert.sameValue([object].values().find(fn), object); + +const htmlDDA = createIsHTMLDDA(); +assert.sameValue([htmlDDA].values().find(fn), undefined); + diff --git a/test/staging/sm/Iterator/prototype/find/descriptor.js b/test/staging/sm/Iterator/prototype/find/descriptor.js new file mode 100644 index 0000000000..190c29ee64 --- /dev/null +++ b/test/staging/sm/Iterator/prototype/find/descriptor.js @@ -0,0 +1,23 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +info: | + Descriptor property of Iterator.prototype.find + + Iterator is not enabled unconditionally +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +features: +- iterator-helpers +description: | + pending +esid: pending +---*/ +const propDesc = Reflect.getOwnPropertyDescriptor(Iterator.prototype, 'find'); +assert.sameValue(typeof propDesc.value, 'function'); +assert.sameValue(propDesc.writable, true); +assert.sameValue(propDesc.enumerable, false); +assert.sameValue(propDesc.configurable, true); + diff --git a/test/staging/sm/Iterator/prototype/find/error-from-correct-realm.js b/test/staging/sm/Iterator/prototype/find/error-from-correct-realm.js new file mode 100644 index 0000000000..5b3ab3a0bb --- /dev/null +++ b/test/staging/sm/Iterator/prototype/find/error-from-correct-realm.js @@ -0,0 +1,28 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +features: +- iterator-helpers +info: | + Iterator is not enabled unconditionally +description: | + pending +esid: pending +---*/ + +const otherGlobal = createNewGlobal({newCompartment: true}); +assert.sameValue(TypeError !== otherGlobal.TypeError, true); + +const iter = [].values(); + +assertThrowsInstanceOf(() => iter.find(), TypeError); +assertThrowsInstanceOf( + otherGlobal.Iterator.prototype.find.bind(iter), + otherGlobal.TypeError, + 'TypeError comes from the realm of the method.', +); + diff --git a/test/staging/sm/Iterator/prototype/find/fn-not-callable-throws.js b/test/staging/sm/Iterator/prototype/find/fn-not-callable-throws.js new file mode 100644 index 0000000000..1b79cc65d3 --- /dev/null +++ b/test/staging/sm/Iterator/prototype/find/fn-not-callable-throws.js @@ -0,0 +1,27 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +features: +- iterator-helpers +info: | + Iterator is not enabled unconditionally +description: | + pending +esid: pending +---*/ + +const iter = [].values(); + +assertThrowsInstanceOf(() => iter.find(), TypeError); +assertThrowsInstanceOf(() => iter.find(undefined), TypeError); +assertThrowsInstanceOf(() => iter.find(null), TypeError); +assertThrowsInstanceOf(() => iter.find(0), TypeError); +assertThrowsInstanceOf(() => iter.find(false), TypeError); +assertThrowsInstanceOf(() => iter.find(''), TypeError); +assertThrowsInstanceOf(() => iter.find(Symbol('')), TypeError); +assertThrowsInstanceOf(() => iter.find({}), TypeError); + diff --git a/test/staging/sm/Iterator/prototype/find/fn-throws-close-iterator.js b/test/staging/sm/Iterator/prototype/find/fn-throws-close-iterator.js new file mode 100644 index 0000000000..94f31e6247 --- /dev/null +++ b/test/staging/sm/Iterator/prototype/find/fn-throws-close-iterator.js @@ -0,0 +1,34 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +features: +- iterator-helpers +info: | + Iterator is not enabled unconditionally +description: | + pending +esid: pending +---*/ + +class TestIterator extends Iterator { + next() { + return { done: this.closed }; + } + + closed = false; + return() { + this.closed = true; + } +} + +const fn = (value) => { throw new Error(); }; +const iter = new TestIterator(); + +assert.sameValue(iter.closed, false); +assertThrowsInstanceOf(() => iter.find(fn), Error); +assert.sameValue(iter.closed, true); + diff --git a/test/staging/sm/Iterator/prototype/find/length.js b/test/staging/sm/Iterator/prototype/find/length.js new file mode 100644 index 0000000000..2b6bc43ded --- /dev/null +++ b/test/staging/sm/Iterator/prototype/find/length.js @@ -0,0 +1,25 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +description: | + The `length` property of Iterator.prototype.find. +info: | + ES7 section 17: Unless otherwise specified, the length property of a built-in + Function object has the attributes { [[Writable]]: false, [[Enumerable]]: + false, [[Configurable]]: true }. + + Iterator is not enabled unconditionally +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +features: +- iterator-helpers +esid: pending +---*/ +const propDesc = Reflect.getOwnPropertyDescriptor(Iterator.prototype.find, 'length'); +assert.sameValue(propDesc.value, 1); +assert.sameValue(propDesc.writable, false); +assert.sameValue(propDesc.enumerable, false); +assert.sameValue(propDesc.configurable, true); + diff --git a/test/staging/sm/Iterator/prototype/find/name.js b/test/staging/sm/Iterator/prototype/find/name.js new file mode 100644 index 0000000000..c5f7542049 --- /dev/null +++ b/test/staging/sm/Iterator/prototype/find/name.js @@ -0,0 +1,21 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +description: | + `name` property of Iterator.prototype.find. +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +features: +- iterator-helpers +info: | + Iterator is not enabled unconditionally +esid: pending +---*/ +const propDesc = Reflect.getOwnPropertyDescriptor(Iterator.prototype.find, 'name'); +assert.sameValue(propDesc.value, 'find'); +assert.sameValue(propDesc.writable, false); +assert.sameValue(propDesc.enumerable, false); +assert.sameValue(propDesc.configurable, true); + diff --git a/test/staging/sm/Iterator/prototype/find/next-throws-iterator-not-closed.js b/test/staging/sm/Iterator/prototype/find/next-throws-iterator-not-closed.js new file mode 100644 index 0000000000..c66201f15b --- /dev/null +++ b/test/staging/sm/Iterator/prototype/find/next-throws-iterator-not-closed.js @@ -0,0 +1,34 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +features: +- iterator-helpers +info: | + Iterator is not enabled unconditionally +description: | + pending +esid: pending +---*/ + +class TestIterator extends Iterator { + next() { + throw new Error(); + } + + closed = false; + return() { + this.closed = true; + } +} + +const fn = x => x; +const iter = new TestIterator(); + +assert.sameValue(iter.closed, false); +assertThrowsInstanceOf(() => iter.find(fn), Error); +assert.sameValue(iter.closed, false); + diff --git a/test/staging/sm/Iterator/prototype/find/proxy.js b/test/staging/sm/Iterator/prototype/find/proxy.js new file mode 100644 index 0000000000..e7ca06dd6a --- /dev/null +++ b/test/staging/sm/Iterator/prototype/find/proxy.js @@ -0,0 +1,56 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +features: +- iterator-helpers +info: | + Iterator is not enabled unconditionally +description: | + pending +esid: pending +---*/ +// +// This test checks that %Iterator.prototype%.find only gets the `next` method off of the +// iterator once, and never accesses the @@iterator property. +const log = []; +const handlerProxy = new Proxy({}, { + get: (target, key, receiver) => (...args) => { + log.push(`${key}: ${args[1]?.toString()}`); + return Reflect[key](...args); + }, +}); + +class Counter extends Iterator { + value = 0; + next() { + const value = this.value; + if (value < 2) { + this.value = value + 1; + return {done: false, value}; + } + return {done: true}; + } +} + +const iter = new Proxy(new Counter(), handlerProxy); +assert.sameValue(iter.find(x => x % 2 == 1), 1); + +assert.sameValue( + log.join('\n'), + `get: find +get: next +get: value +set: value +getOwnPropertyDescriptor: value +defineProperty: value +get: value +set: value +getOwnPropertyDescriptor: value +defineProperty: value +get: return` +); + diff --git a/test/staging/sm/Iterator/prototype/find/return-undefined-if-none-match.js b/test/staging/sm/Iterator/prototype/find/return-undefined-if-none-match.js new file mode 100644 index 0000000000..7c36cdeac0 --- /dev/null +++ b/test/staging/sm/Iterator/prototype/find/return-undefined-if-none-match.js @@ -0,0 +1,23 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +features: +- iterator-helpers +info: | + Iterator is not enabled unconditionally +description: | + pending +esid: pending +---*/ + +const iter = [1, 3, 5].values(); +const fn = (value) => value % 2 == 0; + +assert.sameValue(iter.find(fn), undefined); + +assert.sameValue([].values().find(x => x), undefined); + diff --git a/test/staging/sm/Iterator/prototype/find/short-circuit-on-match.js b/test/staging/sm/Iterator/prototype/find/short-circuit-on-match.js new file mode 100644 index 0000000000..5153c4572f --- /dev/null +++ b/test/staging/sm/Iterator/prototype/find/short-circuit-on-match.js @@ -0,0 +1,26 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +features: +- iterator-helpers +info: | + Iterator is not enabled unconditionally +description: | + pending +esid: pending +---*/ + +const iter = [1, 2, 3].values(); +const log = []; +const fn = (value) => { + log.push(value.toString()); + return value % 2 == 0; +}; + +assert.sameValue(iter.find(fn), 2); +assert.sameValue(log.join(','), '1,2'); + diff --git a/test/staging/sm/Iterator/prototype/find/this-not-iterator-throws.js b/test/staging/sm/Iterator/prototype/find/this-not-iterator-throws.js new file mode 100644 index 0000000000..4749750fd6 --- /dev/null +++ b/test/staging/sm/Iterator/prototype/find/this-not-iterator-throws.js @@ -0,0 +1,21 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +features: +- iterator-helpers +info: | + Iterator is not enabled unconditionally +description: | + pending +esid: pending +---*/ + +const fn = x => x; +assertThrowsInstanceOf(Iterator.prototype.find.bind(undefined, fn), TypeError); +assertThrowsInstanceOf(Iterator.prototype.find.bind({}, fn), TypeError); +assertThrowsInstanceOf(Iterator.prototype.find.bind({next: 0}, fn), TypeError); + diff --git a/test/staging/sm/Iterator/prototype/find/value-throws-iterator-not-closed.js b/test/staging/sm/Iterator/prototype/find/value-throws-iterator-not-closed.js new file mode 100644 index 0000000000..71bd7eee30 --- /dev/null +++ b/test/staging/sm/Iterator/prototype/find/value-throws-iterator-not-closed.js @@ -0,0 +1,37 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +features: +- iterator-helpers +info: | + Iterator is not enabled unconditionally +description: | + pending +esid: pending +---*/ + +class TestError extends Error {} +class TestIterator extends Iterator { + next() { + return new Proxy({done: false}, {get: (target, key, receiver) => { + if (key === 'value') + throw new TestError(); + return 0; + }}); + } + + closed = false; + return() { + closed = true; + } +} + +const iterator = new TestIterator(); +assert.sameValue(iterator.closed, false, 'iterator starts unclosed'); +assertThrowsInstanceOf(() => iterator.find(x => x), TestError); +assert.sameValue(iterator.closed, false, 'iterator remains unclosed'); + diff --git a/test/staging/sm/Iterator/prototype/flatMap/close-iterator-when-inner-complete-throws.js b/test/staging/sm/Iterator/prototype/flatMap/close-iterator-when-inner-complete-throws.js new file mode 100644 index 0000000000..b2c462c57e --- /dev/null +++ b/test/staging/sm/Iterator/prototype/flatMap/close-iterator-when-inner-complete-throws.js @@ -0,0 +1,49 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +esid: pending +description: | + %Iterator.prototype%.flatMap closes the iterator when innerComplete throws. +info: | + Iterator Helpers proposal 2.1.5.7 1. Repeat, + ... + i. Repeat, while innerAlive is true, + iii. Let innerComplete be IteratorComplete(innerNext). + iv. IfAbruptCloseIterator(innerComplete, iterated). +features: +- iterator-helpers +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +---*/ +class TestIterator extends Iterator { + next() { + return {done: false, value: 0}; + } + + closed = false; + return() { + this.closed = true; + return {done: true}; + } +} + +class TestError extends Error {} +class InnerIterator extends Iterator { + next() { + return { + get done() { + throw new TestError(); + } + }; + } +} + +const iter = new TestIterator(); +const mapped = iter.flatMap(x => new InnerIterator()); + +assert.sameValue(iter.closed, false); +assertThrowsInstanceOf(() => mapped.next(), TestError); +assert.sameValue(iter.closed, true); + diff --git a/test/staging/sm/Iterator/prototype/flatMap/close-iterator-when-inner-next-throws.js b/test/staging/sm/Iterator/prototype/flatMap/close-iterator-when-inner-next-throws.js new file mode 100644 index 0000000000..d583b17773 --- /dev/null +++ b/test/staging/sm/Iterator/prototype/flatMap/close-iterator-when-inner-next-throws.js @@ -0,0 +1,45 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +esid: pending +description: | + %Iterator.prototype%.flatMap closes the iterator when innerNext throws. +info: | + Iterator Helpers proposal 2.1.5.7 1. Repeat, + ... + i. Repeat, while innerAlive is true, + i. Let innerNext be IteratorNext(innerIterator). + ii. IfAbruptCloseIterator(innerNext, iterated). +features: +- iterator-helpers +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +---*/ +class TestIterator extends Iterator { + next() { + return {done: false, value: 0}; + } + + closed = false; + return() { + this.closed = true; + return {done: true}; + } +} + +class TestError extends Error {} +class InnerIterator extends Iterator { + next() { + throw new TestError(); + } +} + +const iter = new TestIterator(); +const mapped = iter.flatMap(x => new InnerIterator()); + +assert.sameValue(iter.closed, false); +assertThrowsInstanceOf(() => mapped.next(), TestError); +assert.sameValue(iter.closed, true); + diff --git a/test/staging/sm/Iterator/prototype/flatMap/close-iterator-when-inner-value-throws.js b/test/staging/sm/Iterator/prototype/flatMap/close-iterator-when-inner-value-throws.js new file mode 100644 index 0000000000..1cd2a661d8 --- /dev/null +++ b/test/staging/sm/Iterator/prototype/flatMap/close-iterator-when-inner-value-throws.js @@ -0,0 +1,52 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +esid: pending +description: | + %Iterator.prototype%.flatMap closes the iterator when innerValue throws. +info: | + Iterator Helpers proposal 2.1.5.7 1. Repeat, + ... + i. Repeat, while innerAlive is true, + ... + vi. Else, + 1. Let innerValue be IteratorValue(innerNext). + 2. IfAbruptCloseIterator(innerValue, iterated). +features: +- iterator-helpers +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +---*/ +class TestIterator extends Iterator { + next() { + return {done: false, value: 0}; + } + + closed = false; + return() { + this.closed = true; + return {done: true}; + } +} + +class TestError extends Error {} +class InnerIterator extends Iterator { + next() { + return { + done: false, + get value() { + throw new TestError(); + }, + }; + } +} + +const iter = new TestIterator(); +const mapped = iter.flatMap(x => new InnerIterator()); + +assert.sameValue(iter.closed, false); +assertThrowsInstanceOf(() => mapped.next(), TestError); +assert.sameValue(iter.closed, true); + diff --git a/test/staging/sm/Iterator/prototype/flatMap/flatMap.js b/test/staging/sm/Iterator/prototype/flatMap/flatMap.js new file mode 100644 index 0000000000..cadad5f967 --- /dev/null +++ b/test/staging/sm/Iterator/prototype/flatMap/flatMap.js @@ -0,0 +1,22 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +features: +- async-iteration +description: | + pending +esid: pending +---*/ + +let iter = [1, 2, 3].values().flatMap(x => [x, x + 1]); +for (const v of [1, 2, 2, 3, 3, 4]) { + let result = iter.next(); + assert.sameValue(result.done, false); + assert.sameValue(result.value, v); +} +assert.sameValue(iter.next().done, true); + diff --git a/test/staging/sm/Iterator/prototype/flatMap/inner-empty-iterable.js b/test/staging/sm/Iterator/prototype/flatMap/inner-empty-iterable.js new file mode 100644 index 0000000000..20a06ab098 --- /dev/null +++ b/test/staging/sm/Iterator/prototype/flatMap/inner-empty-iterable.js @@ -0,0 +1,38 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +esid: pending +description: | + %Iterator.prototype%.flatMap skips empty inner iterables. +info: | + Iterator Helpers proposal 2.1.5.7 1. Repeat, + ... + i. Repeat, while innerAlive is true, + ... + iii. Let innerComplete be IteratorComplete(innerNext). + ... + v. If innerComplete is true, set innerAlive to false. +features: +- iterator-helpers +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +---*/ +let iter = [0, 1, 2, 3].values().flatMap(x => x % 2 ? [] : [x]); + +for (const expected of [0, 2]) { + const result = iter.next(); + assert.sameValue(result.value, expected); + assert.sameValue(result.done, false); +} + +let result = iter.next(); +assert.sameValue(result.value, undefined); +assert.sameValue(result.done, true); + +iter = [0, 1, 2, 3].values().flatMap(x => []); +result = iter.next(); +assert.sameValue(result.value, undefined); +assert.sameValue(result.done, true); + diff --git a/test/staging/sm/Iterator/prototype/flatMap/inner-generator.js b/test/staging/sm/Iterator/prototype/flatMap/inner-generator.js new file mode 100644 index 0000000000..d215bbd7c5 --- /dev/null +++ b/test/staging/sm/Iterator/prototype/flatMap/inner-generator.js @@ -0,0 +1,30 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +esid: pending +description: | + %Iterator.prototype%.flatMap innerIterator can be a generator. +info: | + Iterator Helpers proposal 2.1.5.7 +features: +- iterator-helpers +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +---*/ +const iter = [1, 2].values().flatMap(function*(x) { + yield x; + yield* [x + 1, x + 2]; +}); + +for (const expected of [1, 2, 3, 2, 3, 4]) { + const result = iter.next(); + assert.sameValue(result.value, expected); + assert.sameValue(result.done, false); +} + +const result = iter.next(); +assert.sameValue(result.value, undefined); +assert.sameValue(result.done, true); + diff --git a/test/staging/sm/Iterator/prototype/flatMap/length.js b/test/staging/sm/Iterator/prototype/flatMap/length.js new file mode 100644 index 0000000000..e4b89dfe65 --- /dev/null +++ b/test/staging/sm/Iterator/prototype/flatMap/length.js @@ -0,0 +1,24 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +esid: pending +description: | + %Iterator.prototype%.flatMap length value and descriptor. +info: | + 17 ECMAScript Standard Built-in Objects +features: +- Symbol.iterator +- iterator-helpers +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +---*/ +assert.sameValue(Iterator.prototype.flatMap.length, 1); + +const propertyDescriptor = Reflect.getOwnPropertyDescriptor(Iterator.prototype.flatMap, 'length'); +assert.sameValue(propertyDescriptor.value, 1); +assert.sameValue(propertyDescriptor.enumerable, false); +assert.sameValue(propertyDescriptor.writable, false); +assert.sameValue(propertyDescriptor.configurable, true); + diff --git a/test/staging/sm/Iterator/prototype/flatMap/name.js b/test/staging/sm/Iterator/prototype/flatMap/name.js new file mode 100644 index 0000000000..8acedc67cf --- /dev/null +++ b/test/staging/sm/Iterator/prototype/flatMap/name.js @@ -0,0 +1,23 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +esid: pending +description: | + %Iterator.prototype%.flatMap.name value and descriptor. +info: | + 17 ECMAScript Standard Built-in Objects +features: +- iterator-helpers +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +---*/ +assert.sameValue(Iterator.prototype.flatMap.name, 'flatMap'); + +const propertyDescriptor = Reflect.getOwnPropertyDescriptor(Iterator.prototype.flatMap, 'name'); +assert.sameValue(propertyDescriptor.value, 'flatMap'); +assert.sameValue(propertyDescriptor.enumerable, false); +assert.sameValue(propertyDescriptor.writable, false); +assert.sameValue(propertyDescriptor.configurable, true); + diff --git a/test/staging/sm/Iterator/prototype/flatMap/throw-when-inner-not-iterable.js b/test/staging/sm/Iterator/prototype/flatMap/throw-when-inner-not-iterable.js new file mode 100644 index 0000000000..4be84cecb0 --- /dev/null +++ b/test/staging/sm/Iterator/prototype/flatMap/throw-when-inner-not-iterable.js @@ -0,0 +1,56 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +esid: pending +description: | + %Iterator.prototype%.flatMap closes the iterator and throws when mapped isn't iterable. +info: | + Iterator Helpers proposal 2.1.5.7 1. Repeat, + ... + f. Let innerIterator be GetIteratorFlattenable(mapped). + g. IfAbruptCloseIterator(innerIterator, iterated). +features: +- iterator-helpers +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +---*/ +class InvalidIterable { + [Symbol.iterator]() { + return {}; + } +} + +class TestIterator extends Iterator { + next() { + return {done: false, value: 0}; + } + + closed = false; + return() { + this.closed = true; + return {done: true}; + } +} + +const nonIterables = [ + new InvalidIterable(), + undefined, + null, + 0, + false, + Symbol(''), + 0n, + {}, +]; + +for (const value of nonIterables) { + const iter = new TestIterator(); + const mapped = iter.flatMap(x => value); + + assert.sameValue(iter.closed, false); + assertThrowsInstanceOf(() => mapped.next(), TypeError); + assert.sameValue(iter.closed, true); +} + diff --git a/test/staging/sm/Iterator/prototype/forEach/check-fn-after-getting-iterator.js b/test/staging/sm/Iterator/prototype/forEach/check-fn-after-getting-iterator.js new file mode 100644 index 0000000000..a77dc16950 --- /dev/null +++ b/test/staging/sm/Iterator/prototype/forEach/check-fn-after-getting-iterator.js @@ -0,0 +1,37 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [compareArray.js, sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +features: +- iterator-helpers +info: | + Iterator is not enabled unconditionally +description: | + pending +esid: pending +---*/ +const log = []; +const handlerProxy = new Proxy({}, { + get: (target, key, receiver) => (...args) => { + log.push(`${key}: ${args[1]?.toString()}`); + return Reflect[key](...args); + }, +}); + +class TestIterator extends Iterator { + next() { + return {done: true}; + } +} + +const iter = new Proxy(new TestIterator(), handlerProxy); +assertThrowsInstanceOf(() => iter.forEach(1), TypeError); + +assert.compareArray( + log, + ["get: forEach"] +); + diff --git a/test/staging/sm/Iterator/prototype/forEach/descriptor.js b/test/staging/sm/Iterator/prototype/forEach/descriptor.js new file mode 100644 index 0000000000..042dedbe2a --- /dev/null +++ b/test/staging/sm/Iterator/prototype/forEach/descriptor.js @@ -0,0 +1,23 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +info: | + Descriptor property of Iterator.prototype.forEach + + Iterator is not enabled unconditionally +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +features: +- iterator-helpers +description: | + pending +esid: pending +---*/ +const propDesc = Reflect.getOwnPropertyDescriptor(Iterator.prototype, 'forEach'); +assert.sameValue(typeof propDesc.value, 'function'); +assert.sameValue(propDesc.writable, true); +assert.sameValue(propDesc.enumerable, false); +assert.sameValue(propDesc.configurable, true); + diff --git a/test/staging/sm/Iterator/prototype/forEach/error-from-correct-realm.js b/test/staging/sm/Iterator/prototype/forEach/error-from-correct-realm.js new file mode 100644 index 0000000000..dbdb220a63 --- /dev/null +++ b/test/staging/sm/Iterator/prototype/forEach/error-from-correct-realm.js @@ -0,0 +1,28 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +features: +- iterator-helpers +info: | + Iterator is not enabled unconditionally +description: | + pending +esid: pending +---*/ + +const otherGlobal = createNewGlobal({newCompartment: true}); +assert.sameValue(TypeError !== otherGlobal.TypeError, true); + +const iter = [].values(); + +assertThrowsInstanceOf(() => iter.forEach(), TypeError); +assertThrowsInstanceOf( + otherGlobal.Iterator.prototype.forEach.bind(iter), + otherGlobal.TypeError, + 'TypeError comes from the realm of the method.', +); + diff --git a/test/staging/sm/Iterator/prototype/forEach/fn-not-callable-throws.js b/test/staging/sm/Iterator/prototype/forEach/fn-not-callable-throws.js new file mode 100644 index 0000000000..9e943ebf69 --- /dev/null +++ b/test/staging/sm/Iterator/prototype/forEach/fn-not-callable-throws.js @@ -0,0 +1,27 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +features: +- iterator-helpers +info: | + Iterator is not enabled unconditionally +description: | + pending +esid: pending +---*/ + +const iter = [].values(); + +assertThrowsInstanceOf(() => iter.forEach(), TypeError); +assertThrowsInstanceOf(() => iter.forEach(undefined), TypeError); +assertThrowsInstanceOf(() => iter.forEach(null), TypeError); +assertThrowsInstanceOf(() => iter.forEach(0), TypeError); +assertThrowsInstanceOf(() => iter.forEach(false), TypeError); +assertThrowsInstanceOf(() => iter.forEach(''), TypeError); +assertThrowsInstanceOf(() => iter.forEach(Symbol('')), TypeError); +assertThrowsInstanceOf(() => iter.forEach({}), TypeError); + diff --git a/test/staging/sm/Iterator/prototype/forEach/fn-throws-close-iterator.js b/test/staging/sm/Iterator/prototype/forEach/fn-throws-close-iterator.js new file mode 100644 index 0000000000..f174667d57 --- /dev/null +++ b/test/staging/sm/Iterator/prototype/forEach/fn-throws-close-iterator.js @@ -0,0 +1,34 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +features: +- iterator-helpers +info: | + Iterator is not enabled unconditionally +description: | + pending +esid: pending +---*/ + +class TestIterator extends Iterator { + next() { + return { done: this.closed }; + } + + closed = false; + return() { + this.closed = true; + } +} + +const fn = () => { throw new Error(); }; +const iter = new TestIterator(); + +assert.sameValue(iter.closed, false); +assertThrowsInstanceOf(() => iter.forEach(fn), Error); +assert.sameValue(iter.closed, true); + diff --git a/test/staging/sm/Iterator/prototype/forEach/forEach.js b/test/staging/sm/Iterator/prototype/forEach/forEach.js new file mode 100644 index 0000000000..875038fe6a --- /dev/null +++ b/test/staging/sm/Iterator/prototype/forEach/forEach.js @@ -0,0 +1,23 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +features: +- iterator-helpers +info: | + Iterator is not enabled unconditionally +description: | + pending +esid: pending +---*/ + +const log = []; +const fn = (value) => log.push(value); +const iter = [1, 2, 3].values(); + +assert.sameValue(iter.forEach(fn), undefined); +assert.sameValue(log.join(','), '1,2,3'); + diff --git a/test/staging/sm/Iterator/prototype/forEach/length.js b/test/staging/sm/Iterator/prototype/forEach/length.js new file mode 100644 index 0000000000..54da4f41a1 --- /dev/null +++ b/test/staging/sm/Iterator/prototype/forEach/length.js @@ -0,0 +1,25 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +description: | + The `length` property of Iterator.prototype.forEach. +info: | + ES7 section 17: Unless otherwise specified, the length property of a built-in + Function object has the attributes { [[Writable]]: false, [[Enumerable]]: + false, [[Configurable]]: true }. + + Iterator is not enabled unconditionally +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +features: +- iterator-helpers +esid: pending +---*/ +const propDesc = Reflect.getOwnPropertyDescriptor(Iterator.prototype.forEach, 'length'); +assert.sameValue(propDesc.value, 1); +assert.sameValue(propDesc.writable, false); +assert.sameValue(propDesc.enumerable, false); +assert.sameValue(propDesc.configurable, true); + diff --git a/test/staging/sm/Iterator/prototype/forEach/name.js b/test/staging/sm/Iterator/prototype/forEach/name.js new file mode 100644 index 0000000000..5f9ab02e1c --- /dev/null +++ b/test/staging/sm/Iterator/prototype/forEach/name.js @@ -0,0 +1,21 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +description: | + `name` property of Iterator.prototype.forEach. +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +features: +- iterator-helpers +info: | + Iterator is not enabled unconditionally +esid: pending +---*/ +const propDesc = Reflect.getOwnPropertyDescriptor(Iterator.prototype.forEach, 'name'); +assert.sameValue(propDesc.value, 'forEach'); +assert.sameValue(propDesc.writable, false); +assert.sameValue(propDesc.enumerable, false); +assert.sameValue(propDesc.configurable, true); + diff --git a/test/staging/sm/Iterator/prototype/forEach/next-throws-iterator-not-closed.js b/test/staging/sm/Iterator/prototype/forEach/next-throws-iterator-not-closed.js new file mode 100644 index 0000000000..99cc3e292a --- /dev/null +++ b/test/staging/sm/Iterator/prototype/forEach/next-throws-iterator-not-closed.js @@ -0,0 +1,34 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +features: +- iterator-helpers +info: | + Iterator is not enabled unconditionally +description: | + pending +esid: pending +---*/ + +class TestIterator extends Iterator { + next() { + throw new Error(); + } + + closed = false; + return() { + this.closed = true; + } +} + +const fn = () => {}; +const iter = new TestIterator(); + +assert.sameValue(iter.closed, false); +assertThrowsInstanceOf(() => iter.forEach(fn), Error); +assert.sameValue(iter.closed, false); + diff --git a/test/staging/sm/Iterator/prototype/forEach/proxy.js b/test/staging/sm/Iterator/prototype/forEach/proxy.js new file mode 100644 index 0000000000..3bcbc4a1bb --- /dev/null +++ b/test/staging/sm/Iterator/prototype/forEach/proxy.js @@ -0,0 +1,56 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +features: +- iterator-helpers +info: | + Iterator is not enabled unconditionally +description: | + pending +esid: pending +---*/ +// +// This test checks that %Iterator.prototype%.forEach only gets the `next` method off of the +// iterator once, and never accesses the @@iterator property. +const log = []; +const handlerProxy = new Proxy({}, { + get: (target, key, receiver) => (...args) => { + log.push(`${key}: ${args[1]?.toString()}`); + return Reflect[key](...args); + }, +}); + +class Counter extends Iterator { + value = 0; + next() { + const value = this.value; + if (value < 2) { + this.value = value + 1; + return {done: false, value}; + } + return {done: true}; + } +} + +const iter = new Proxy(new Counter(), handlerProxy); +iter.forEach(x => x); + +assert.sameValue( + log.join('\n'), + `get: forEach +get: next +get: value +set: value +getOwnPropertyDescriptor: value +defineProperty: value +get: value +set: value +getOwnPropertyDescriptor: value +defineProperty: value +get: value` +); + diff --git a/test/staging/sm/Iterator/prototype/forEach/this-not-iterator-throws.js b/test/staging/sm/Iterator/prototype/forEach/this-not-iterator-throws.js new file mode 100644 index 0000000000..a5e03f0341 --- /dev/null +++ b/test/staging/sm/Iterator/prototype/forEach/this-not-iterator-throws.js @@ -0,0 +1,21 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +features: +- iterator-helpers +info: | + Iterator is not enabled unconditionally +description: | + pending +esid: pending +---*/ + +const fn = x => x; +assertThrowsInstanceOf(Iterator.prototype.forEach.bind(undefined, fn), TypeError); +assertThrowsInstanceOf(Iterator.prototype.forEach.bind({}, fn), TypeError); +assertThrowsInstanceOf(Iterator.prototype.forEach.bind({next: 0}, fn), TypeError); + diff --git a/test/staging/sm/Iterator/prototype/forEach/value-throws-iterator-not-closed.js b/test/staging/sm/Iterator/prototype/forEach/value-throws-iterator-not-closed.js new file mode 100644 index 0000000000..715efe7780 --- /dev/null +++ b/test/staging/sm/Iterator/prototype/forEach/value-throws-iterator-not-closed.js @@ -0,0 +1,37 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +features: +- iterator-helpers +info: | + Iterator is not enabled unconditionally +description: | + pending +esid: pending +---*/ + +class TestError extends Error {} +class TestIterator extends Iterator { + next() { + return new Proxy({done: false}, {get: (target, key, receiver) => { + if (key === 'value') + throw new TestError(); + return 0; + }}); + } + + closed = false; + return() { + closed = true; + } +} + +const iterator = new TestIterator(); +assert.sameValue(iterator.closed, false, 'iterator starts unclosed'); +assertThrowsInstanceOf(() => iterator.forEach(x => x), TestError); +assert.sameValue(iterator.closed, false, 'iterator remains unclosed'); + diff --git a/test/staging/sm/Iterator/prototype/generator-methods-throw-on-iterator-helpers.js b/test/staging/sm/Iterator/prototype/generator-methods-throw-on-iterator-helpers.js new file mode 100644 index 0000000000..9ab5ed0bc9 --- /dev/null +++ b/test/staging/sm/Iterator/prototype/generator-methods-throw-on-iterator-helpers.js @@ -0,0 +1,26 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +features: +- iterator-helpers +description: | + pending +esid: pending +---*/ + +const generatorProto = Object.getPrototypeOf( + Object.getPrototypeOf( + (function *() {})() + ) +); + +const iteratorHelper = [0].values().map(x => x); + +assertThrowsInstanceOf(() => generatorProto.next.call(iteratorHelper), TypeError); +assertThrowsInstanceOf(() => generatorProto.return.call(iteratorHelper), TypeError); +assertThrowsInstanceOf(() => generatorProto.throw.call(iteratorHelper), TypeError); + diff --git a/test/staging/sm/Iterator/prototype/iterator-helper-methods-throw-on-generators.js b/test/staging/sm/Iterator/prototype/iterator-helper-methods-throw-on-generators.js new file mode 100644 index 0000000000..a8d5464bb3 --- /dev/null +++ b/test/staging/sm/Iterator/prototype/iterator-helper-methods-throw-on-generators.js @@ -0,0 +1,24 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +features: +- iterator-helpers +description: | + pending +esid: pending +---*/ + +const iteratorHelperProto = Object.getPrototypeOf([].values().map(x => x)); + +function *gen() { + yield 1; +} + +assertThrowsInstanceOf(() => iteratorHelperProto.next.call(gen()), TypeError); +assertThrowsInstanceOf(() => iteratorHelperProto.return.call(gen()), TypeError); +assertThrowsInstanceOf(() => iteratorHelperProto.throw.call(gen()), TypeError); + diff --git a/test/staging/sm/Iterator/prototype/iterator-helpers-from-other-global.js b/test/staging/sm/Iterator/prototype/iterator-helpers-from-other-global.js new file mode 100644 index 0000000000..aa02274fbd --- /dev/null +++ b/test/staging/sm/Iterator/prototype/iterator-helpers-from-other-global.js @@ -0,0 +1,63 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +features: +- iterator-helpers +description: | + pending +esid: pending +---*/ + +class TestError extends Error {} + +class TestIterator extends Iterator { + next() { + return {done: false, value: 'value'}; + } + + closed = false; + return(value) { + this.closed = true; + return {done: true, value}; + } +} + +function checkIterResult({done, value}, expectedDone, expectedValue) { + assert.sameValue(done, expectedDone); + assert.sameValue(Array.isArray(value) ? value[1] : value, expectedValue); +} + +const otherGlobal = createNewGlobal({newCompartment: true}); + +const methods = [ + ["map", x => x], + ["filter", x => true], + ["take", Infinity], + ["drop", 0], + ["flatMap", x => [x]], +]; + +for (const [method, arg] of methods) { + const {next: otherNext} = Object.getPrototypeOf( + new otherGlobal.Array().values()[method](arg) + ); + const iterator = new TestIterator(); + const helper = iterator[method](arg); + checkIterResult(otherNext.call(helper), false, 'value'); +} + +for (const [method, arg] of methods) { + const {return: otherReturn} = Object.getPrototypeOf( + new otherGlobal.Array().values()[method](arg) + ); + const iterator = new TestIterator(); + const helper = iterator[method](arg); + assert.sameValue(iterator.closed, false); + checkIterResult(otherReturn.call(helper), true, undefined); + assert.sameValue(iterator.closed, true); +} + diff --git a/test/staging/sm/Iterator/prototype/lazy-methods-from-other-global.js b/test/staging/sm/Iterator/prototype/lazy-methods-from-other-global.js new file mode 100644 index 0000000000..0a71509479 --- /dev/null +++ b/test/staging/sm/Iterator/prototype/lazy-methods-from-other-global.js @@ -0,0 +1,40 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +features: +- iterator-helpers +description: | + pending +esid: pending +---*/ + +const otherIteratorProto = createNewGlobal({newCompartment: true}).Iterator.prototype; + +const methods = [ + ["map", x => x], + ["filter", x => true], + ["take", Infinity], + ["drop", 0], + ["flatMap", x => [x]], +]; + +// Use the lazy Iterator methods from another global on an iterator from this global. +for (const [method, arg] of methods) { + const iterator = [1, 2, 3].values(); + const helper = otherIteratorProto[method].call(iterator, arg); + + for (const expected of [1, 2, 3]) { + const {done, value} = helper.next(); + assert.sameValue(done, false); + assert.sameValue(Array.isArray(value) ? value[1] : value, expected); + } + + const {done, value} = helper.next(); + assert.sameValue(done, true); + assert.sameValue(value, undefined); +} + diff --git a/test/staging/sm/Iterator/prototype/lazy-methods-handle-empty-iterators.js b/test/staging/sm/Iterator/prototype/lazy-methods-handle-empty-iterators.js new file mode 100644 index 0000000000..d899a905d9 --- /dev/null +++ b/test/staging/sm/Iterator/prototype/lazy-methods-handle-empty-iterators.js @@ -0,0 +1,43 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +esid: pending +description: | + Lazy %Iterator.prototype% methods handle empty iterators. +info: | + Iterator Helpers proposal 2.1.5 +features: +- iterator-helpers +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +---*/ + +// +// +class EmptyIterator extends Iterator { + next() { + return {done: true}; + } +} + +const emptyIterator1 = new EmptyIterator(); +const emptyIterator2 = [].values(); + +const methods = [ + iter => iter.map(x => x), + iter => iter.filter(x => x), + iter => iter.take(1), + iter => iter.drop(0), + iter => iter.flatMap(x => [x]), +]; + +for (const method of methods) { + for (const iterator of [emptyIterator1, emptyIterator2]) { + const result = method(iterator).next(); + assert.sameValue(result.done, true); + assert.sameValue(result.value, undefined); + } +} + diff --git a/test/staging/sm/Iterator/prototype/lazy-methods-interleaved.js b/test/staging/sm/Iterator/prototype/lazy-methods-interleaved.js new file mode 100644 index 0000000000..dc8769f506 --- /dev/null +++ b/test/staging/sm/Iterator/prototype/lazy-methods-interleaved.js @@ -0,0 +1,61 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +esid: pending +description: | + Lazy %Iterator.prototype% method calls can be interleaved. +info: | + Iterator Helpers proposal 2.1.5 +features: +- iterator-helpers +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +---*/ + +// +// +class TestIterator extends Iterator { + value = 0; + next() { + return {done: false, value: this.value++}; + } +} + +function unwrapResult(result) { + return result; +} + +const methods = [ + iter => iter.map(x => x), + iter => iter.filter(x => true), + iter => iter.take(2), + iter => iter.drop(0), + iter => iter.flatMap(x => [x]), +]; + +for (const firstMethod of methods) { + for (const secondMethod of methods) { + const iterator = new TestIterator(); + const firstHelper = firstMethod(iterator); + const secondHelper = secondMethod(iterator); + + let firstResult = unwrapResult(firstHelper.next()); + assert.sameValue(firstResult.done, false); + assert.sameValue(firstResult.value, 0); + + let secondResult = unwrapResult(secondHelper.next()); + assert.sameValue(secondResult.done, false); + assert.sameValue(secondResult.value, 1); + + firstResult = unwrapResult(firstHelper.next()); + assert.sameValue(firstResult.done, false); + assert.sameValue(firstResult.value, 2); + + secondResult = unwrapResult(secondHelper.next()); + assert.sameValue(secondResult.done, false); + assert.sameValue(secondResult.value, 3); + } +} + diff --git a/test/staging/sm/Iterator/prototype/lazy-methods-iterator-closed-on-call-throws.js b/test/staging/sm/Iterator/prototype/lazy-methods-iterator-closed-on-call-throws.js new file mode 100644 index 0000000000..a3d2c539de --- /dev/null +++ b/test/staging/sm/Iterator/prototype/lazy-methods-iterator-closed-on-call-throws.js @@ -0,0 +1,47 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +esid: pending +description: | + Lazy %Iterator.prototype% methods close the iterator if callback throws. +info: | + Iterator Helpers proposal 2.1.5 +features: +- iterator-helpers +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +---*/ + +// +// +class TestError extends Error {} +class TestIterator extends Iterator { + next() { + return {done: false, value: 1}; + } + + closed = false; + return() { + this.closed = true; + return {done: true}; + } +} + +function fn() { + throw new TestError(); +} +const methods = [ + iter => iter.map(fn), + iter => iter.filter(fn), + iter => iter.flatMap(fn), +]; + +for (const method of methods) { + const iter = new TestIterator(); + assert.sameValue(iter.closed, false); + assertThrowsInstanceOf(() => method(iter).next(), TestError); + assert.sameValue(iter.closed, true); +} + diff --git a/test/staging/sm/Iterator/prototype/lazy-methods-iterator-closed-on-yield-throws.js b/test/staging/sm/Iterator/prototype/lazy-methods-iterator-closed-on-yield-throws.js new file mode 100644 index 0000000000..b4f8b59d54 --- /dev/null +++ b/test/staging/sm/Iterator/prototype/lazy-methods-iterator-closed-on-yield-throws.js @@ -0,0 +1,47 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +esid: pending +description: | + Lazy %Iterator.prototype% methods close the iterator if `yield` throws. +info: | + Iterator Helpers proposal 2.1.5 +features: +- iterator-helpers +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +---*/ + +// +// +class TestIterator extends Iterator { + next() { + return {done: false, value: 1}; + } + + closed = false; + return() { + this.closed = true; + return {done: true}; + } +} + +const methods = [ + iter => iter.map(x => x), + iter => iter.filter(x => true), + iter => iter.take(1), + iter => iter.drop(0), + iter => iter.flatMap(x => [x]), +]; + +for (const method of methods) { + const iterator = new TestIterator(); + assert.sameValue(iterator.closed, false); + const iteratorHelper = method(iterator); + iteratorHelper.next(); + iteratorHelper.return(); + assert.sameValue(iterator.closed, true); +} + diff --git a/test/staging/sm/Iterator/prototype/lazy-methods-iterator-not-closed-on-next-throws.js b/test/staging/sm/Iterator/prototype/lazy-methods-iterator-not-closed-on-next-throws.js new file mode 100644 index 0000000000..0c60d3a9ad --- /dev/null +++ b/test/staging/sm/Iterator/prototype/lazy-methods-iterator-not-closed-on-next-throws.js @@ -0,0 +1,47 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +esid: pending +description: | + Lazy %Iterator.prototype% methods don't close the iterator if `.next` call throws. +info: | + Iterator Helpers proposal 2.1.5 +features: +- iterator-helpers +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +---*/ + +// +// +class TestError extends Error {} +class TestIterator extends Iterator { + next() { + throw new TestError(); + } + + closed = false; + return() { + this.closed = true; + return {done: true}; + } +} + +const iterator = new TestIterator(); + +const methods = [ + iter => iter.map(x => x), + iter => iter.filter(x => x), + iter => iter.take(1), + iter => iter.drop(0), + iter => iter.flatMap(x => [x]), +]; + +for (const method of methods) { + assert.sameValue(iterator.closed, false); + assertThrowsInstanceOf(() => method(iterator).next(), TestError); + assert.sameValue(iterator.closed, false); +} + diff --git a/test/staging/sm/Iterator/prototype/lazy-methods-iterator-not-closed-on-value-throws.js b/test/staging/sm/Iterator/prototype/lazy-methods-iterator-not-closed-on-value-throws.js new file mode 100644 index 0000000000..b766e5e5b0 --- /dev/null +++ b/test/staging/sm/Iterator/prototype/lazy-methods-iterator-not-closed-on-value-throws.js @@ -0,0 +1,51 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +esid: pending +description: | + Lazy %Iterator.prototype% methods don't close the iterator if `value` throws. +info: | + Iterator Helpers proposal 2.1.5 +features: +- iterator-helpers +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +---*/ + +// +// +class TestError extends Error {} +class TestIterator extends Iterator { + next() { + return { + get value() { + throw new TestError(); + } + }; + } + + closed = false; + return() { + this.closed = true; + return {done: true}; + } +} + +const iterator = new TestIterator(); + +const methods = [ + iter => iter.map(x => x), + iter => iter.filter(x => x), + iter => iter.take(1), + iter => iter.drop(0), + iter => iter.flatMap(x => [x]), +]; + +for (const method of methods) { + assert.sameValue(iterator.closed, false); + assertThrowsInstanceOf(() => method(iterator).next(), TestError); + assert.sameValue(iterator.closed, false); +} + diff --git a/test/staging/sm/Iterator/prototype/lazy-methods-iterator-returns-done-generator-finishes.js b/test/staging/sm/Iterator/prototype/lazy-methods-iterator-returns-done-generator-finishes.js new file mode 100644 index 0000000000..fd3c61a1b6 --- /dev/null +++ b/test/staging/sm/Iterator/prototype/lazy-methods-iterator-returns-done-generator-finishes.js @@ -0,0 +1,35 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +features: +- iterator-helpers +description: | + pending +esid: pending +---*/ + +class TestIterator extends Iterator { + next() { + return {done: true, value: 'value'}; + } +} + +const methods = [ + iter => iter.map(x => x), + iter => iter.filter(x => true), + iter => iter.take(1), + iter => iter.drop(0), + iter => iter.flatMap(x => [x]), +]; + +for (const method of methods) { + const iterator = method(new TestIterator()); + const result = iterator.next(); + assert.sameValue(result.done, true); + assert.sameValue(result.value, undefined); +} + diff --git a/test/staging/sm/Iterator/prototype/lazy-methods-multiple-return-close-iterator-once.js b/test/staging/sm/Iterator/prototype/lazy-methods-multiple-return-close-iterator-once.js new file mode 100644 index 0000000000..c84a60d654 --- /dev/null +++ b/test/staging/sm/Iterator/prototype/lazy-methods-multiple-return-close-iterator-once.js @@ -0,0 +1,63 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +esid: pending +description: | + Calling `.return()` on a lazy %Iterator.prototype% method multiple times closes the source iterator once. +info: | + Iterator Helpers proposal 2.1.5 +features: +- iterator-helpers +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +---*/ + +// +// +class TestIterator extends Iterator { + next() { + return {done: false, value: 1}; + } + + closeCount = 0; + return(value) { + this.closeCount++; + return {done: true, value}; + } +} + +const methods = [ + iter => iter.map(x => x), + iter => iter.filter(x => x), + iter => iter.take(1), + iter => iter.drop(0), + iter => iter.flatMap(x => [x]), +]; + +// Call `return` after stepping the iterator once: +for (const method of methods) { + const iter = new TestIterator(); + const iterHelper = method(iter); + iterHelper.next(); + + assert.sameValue(iter.closeCount, 0); + iterHelper.return(); + assert.sameValue(iter.closeCount, 1); + iterHelper.return(); + assert.sameValue(iter.closeCount, 1); +} + +// Call `return` before stepping the iterator: +for (const method of methods) { + const iter = new TestIterator(); + const iterHelper = method(iter); + + assert.sameValue(iter.closeCount, 0); + iterHelper.return(); + assert.sameValue(iter.closeCount, 1); + iterHelper.return(); + assert.sameValue(iter.closeCount, 1); +} + diff --git a/test/staging/sm/Iterator/prototype/lazy-methods-pass-through-lastValue.js b/test/staging/sm/Iterator/prototype/lazy-methods-pass-through-lastValue.js new file mode 100644 index 0000000000..b4807c9a1d --- /dev/null +++ b/test/staging/sm/Iterator/prototype/lazy-methods-pass-through-lastValue.js @@ -0,0 +1,37 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +features: +- iterator-helpers +description: | + pending +esid: pending +---*/ + +class TestIterator extends Iterator { + next(value = "next value") { + assert.sameValue(arguments.length, 0); + return {done: false, value}; + } +} + +const methods = [ + iter => iter.map(x => x), + iter => iter.filter(x => true), + iter => iter.take(2), + iter => iter.drop(0), +]; + +for (const method of methods) { + const iterator = new TestIterator(); + const iteratorHelper = method(iterator); + iteratorHelper.next(); + let result = iteratorHelper.next('last value'); + assert.sameValue(result.done, false); + assert.sameValue(result.value, 'next value'); +} + diff --git a/test/staging/sm/Iterator/prototype/lazy-methods-pass-value-through-chain.js b/test/staging/sm/Iterator/prototype/lazy-methods-pass-value-through-chain.js new file mode 100644 index 0000000000..8f52a8350b --- /dev/null +++ b/test/staging/sm/Iterator/prototype/lazy-methods-pass-value-through-chain.js @@ -0,0 +1,39 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +features: +- iterator-helpers +description: | + pending +esid: pending +---*/ + +class TestIterator extends Iterator { + next(value = "next value") { + assert.sameValue(arguments.length, 0); + return {done: false, value}; + } +} + +const methods = [ + iter => iter.map(x => x), + iter => iter.filter(x => true), + iter => iter.take(2), + iter => iter.drop(0), +]; + +for (const outerMethod of methods) { + for (const innerMethod of methods) { + const iterator = new TestIterator(); + const iteratorChain = outerMethod(innerMethod(iterator)); + iteratorChain.next(); + let result = iteratorChain.next('last value'); + assert.sameValue(result.done, false); + assert.sameValue(result.value, 'next value'); + } +} + diff --git a/test/staging/sm/Iterator/prototype/lazy-methods-proxy-accesses.js b/test/staging/sm/Iterator/prototype/lazy-methods-proxy-accesses.js new file mode 100644 index 0000000000..52627882a5 --- /dev/null +++ b/test/staging/sm/Iterator/prototype/lazy-methods-proxy-accesses.js @@ -0,0 +1,72 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +esid: pending +description: | + Lazy %Iterator.prototype% methods access specified properties only. +features: +- iterator-helpers +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +---*/ +// + +class TestIterator extends Iterator { + value = 0; + next() { + if (this.value < 2) + return { done: false, value: this.value++ }; + return { done: true, value: undefined }; + } +} + +const handlerProxy = log => new Proxy({}, { + get: (target, key, receiver) => (...args) => { + const target = args[0]; + const item = Reflect[key](...args); + + log.push(`${key}: ${args.filter(x => typeof x != 'object').map(x => x.toString())}`); + + return item; + }, +}); + +const methods = [ + [iter => iter.map(x => x), 'map'], + [iter => iter.filter(x => true), 'filter'], + [iter => iter.take(4), 'take'], + [iter => iter.drop(0), 'drop'], + [iter => iter.flatMap(x => [x]), 'flatMap'], +]; + +for (const method of methods) { + const log = []; + const iteratorProxy = new Proxy(new TestIterator(), handlerProxy(log)); + const iteratorHelper = method[0](iteratorProxy); + const methodName = method[1]; + + iteratorHelper.next(); + iteratorHelper.next(); + iteratorHelper.next(); + assert.sameValue(iteratorHelper.next().done, true); + + assert.sameValue( + log.join('\n'), + `get: ${methodName} +get: next +get: value +get: value +getOwnPropertyDescriptor: value +defineProperty: value +set: value,1 +get: value +get: value +getOwnPropertyDescriptor: value +defineProperty: value +set: value,2 +get: value` + ) +} + diff --git a/test/staging/sm/Iterator/prototype/lazy-methods-reentry-not-close-iterator.js b/test/staging/sm/Iterator/prototype/lazy-methods-reentry-not-close-iterator.js new file mode 100644 index 0000000000..93d721aef4 --- /dev/null +++ b/test/staging/sm/Iterator/prototype/lazy-methods-reentry-not-close-iterator.js @@ -0,0 +1,53 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +features: +- iterator-helpers +description: | + pending +esid: pending +---*/ + +const methods = [ + [iter => iter.map, x => x], + [iter => iter.filter, x => true], + [iter => iter.flatMap, x => [x]], +]; + +for (const method of methods) { + const iter = [1, 2, 3].values(); + const iterMethod = method[0](iter); + let iterHelper; + let reentered = false; + iterHelper = iterMethod.call(iter, x => { + if (x == 2) { + // Reenter the currently running generator. + reentered = true; + assertThrowsInstanceOf(() => iterHelper.next(), TypeError); + } + return method[1](x); + }); + + let result = iterHelper.next(); + assert.sameValue(result.value, 1); + assert.sameValue(result.done, false); + + assert.sameValue(reentered, false); + result = iterHelper.next(); + assert.sameValue(reentered, true); + assert.sameValue(result.value, 2); + assert.sameValue(result.done, false); + + result = iterHelper.next(); + assert.sameValue(result.value, 3); + assert.sameValue(result.done, false); + + result = iterHelper.next(); + assert.sameValue(result.value, undefined); + assert.sameValue(result.done, true); +} + diff --git a/test/staging/sm/Iterator/prototype/lazy-methods-return-closes-iterator.js b/test/staging/sm/Iterator/prototype/lazy-methods-return-closes-iterator.js new file mode 100644 index 0000000000..eca0038d4a --- /dev/null +++ b/test/staging/sm/Iterator/prototype/lazy-methods-return-closes-iterator.js @@ -0,0 +1,61 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +esid: pending +description: | + Calling `.return()` on a lazy %Iterator.prototype% method closes the source iterator. +info: | + Iterator Helpers proposal 2.1.5 +features: +- iterator-helpers +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +---*/ + +// +// +class TestIterator extends Iterator { + next() { + return {done: false, value: 1}; + } + + closed = false; + return(value) { + this.closed = true; + return {done: true, value}; + } +} + +const methods = [ + iter => iter.map(x => x), + iter => iter.filter(x => x), + iter => iter.take(1), + iter => iter.drop(0), + iter => iter.flatMap(x => [x]), +]; + +for (const method of methods) { + const iter = new TestIterator(); + const iterHelper = method(iter); + iterHelper.next(); + + assert.sameValue(iter.closed, false); + const result = iterHelper.return("ignored"); + assert.sameValue(iter.closed, true); + assert.sameValue(result.done, true); + assert.sameValue(result.value, undefined); +} + +for (const method of methods) { + const iter = new TestIterator(); + const iterHelper = method(iter); + + assert.sameValue(iter.closed, false); + const result = iterHelper.return("ignored"); + assert.sameValue(iter.closed, true); + assert.sameValue(result.done, true); + assert.sameValue(result.value, undefined); +} + diff --git a/test/staging/sm/Iterator/prototype/lazy-methods-return-new-iterator-result.js b/test/staging/sm/Iterator/prototype/lazy-methods-return-new-iterator-result.js new file mode 100644 index 0000000000..26c69d5f7a --- /dev/null +++ b/test/staging/sm/Iterator/prototype/lazy-methods-return-new-iterator-result.js @@ -0,0 +1,42 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +esid: pending +description: | + Lazy Iterator Helper methods return new iterator result objects. +info: | + Iterator Helpers proposal 2.1.5 +features: +- iterator-helpers +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +---*/ + +// +// +const iterResult = {done: false, value: 1, testProperty: 'test'}; +class TestIterator extends Iterator { + next() { + return iterResult; + } +} + +const methods = [ + iter => iter.map(x => x), + iter => iter.filter(x => true), + iter => iter.take(1), + iter => iter.drop(0), + iter => iter.flatMap(x => [x]), +]; + +// Call `return` before stepping the iterator: +for (const method of methods) { + const iter = new TestIterator(); + const iterHelper = method(iter); + const result = iterHelper.next(); + assert.sameValue(result == iterResult, false); + assert.sameValue(result.testProperty, undefined); +} + diff --git a/test/staging/sm/Iterator/prototype/lazy-methods-throw-eagerly-on-next-non-callable.js b/test/staging/sm/Iterator/prototype/lazy-methods-throw-eagerly-on-next-non-callable.js new file mode 100644 index 0000000000..d01a868e65 --- /dev/null +++ b/test/staging/sm/Iterator/prototype/lazy-methods-throw-eagerly-on-next-non-callable.js @@ -0,0 +1,37 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +esid: pending +description: | + Lazy %Iterator.prototype% methods don't throw when `next` is non-callable. +info: | + Iterator Helpers proposal 1.1.1 +features: +- iterator-helpers +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +---*/ + +// +// +const methods = [ + next => Iterator.prototype.map.bind({next}, x => x), + next => Iterator.prototype.filter.bind({next}, x => x), + next => Iterator.prototype.take.bind({next}, 1), + next => Iterator.prototype.drop.bind({next}, 0), + next => Iterator.prototype.flatMap.bind({next}, x => [x]), +]; + +for (const method of methods) { + method(0); + method(false); + method(undefined); + method(null); + method(''); + method(Symbol('')); + method({}); + method([]); +} + diff --git a/test/staging/sm/Iterator/prototype/lazy-methods-throw-eagerly-on-non-callable.js b/test/staging/sm/Iterator/prototype/lazy-methods-throw-eagerly-on-non-callable.js new file mode 100644 index 0000000000..9b5b131900 --- /dev/null +++ b/test/staging/sm/Iterator/prototype/lazy-methods-throw-eagerly-on-non-callable.js @@ -0,0 +1,42 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +esid: pending +description: | + Lazy %Iterator.prototype% methods throw eagerly when passed non-callables. +info: | + Iterator Helpers proposal 2.1.5 +features: +- iterator-helpers +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +---*/ + +// +// +const methods = [ + (iter, fn) => iter.map(fn), + (iter, fn) => iter.filter(fn), + (iter, fn) => iter.flatMap(fn), +]; + +for (const method of methods) { + assertThrowsInstanceOf(() => method(Iterator.prototype, 0), TypeError); + assertThrowsInstanceOf(() => method(Iterator.prototype, false), TypeError); + assertThrowsInstanceOf(() => method(Iterator.prototype, undefined), TypeError); + assertThrowsInstanceOf(() => method(Iterator.prototype, null), TypeError); + assertThrowsInstanceOf(() => method(Iterator.prototype, ''), TypeError); + assertThrowsInstanceOf(() => method(Iterator.prototype, Symbol('')), TypeError); + assertThrowsInstanceOf(() => method(Iterator.prototype, {}), TypeError); + + assertThrowsInstanceOf(() => method([].values(), 0), TypeError); + assertThrowsInstanceOf(() => method([].values(), false), TypeError); + assertThrowsInstanceOf(() => method([].values(), undefined), TypeError); + assertThrowsInstanceOf(() => method([].values(), null), TypeError); + assertThrowsInstanceOf(() => method([].values(), ''), TypeError); + assertThrowsInstanceOf(() => method([].values(), Symbol('')), TypeError); + assertThrowsInstanceOf(() => method([].values(), {}), TypeError); +} + diff --git a/test/staging/sm/Iterator/prototype/lazy-methods-throw-eagerly-on-non-iterator.js b/test/staging/sm/Iterator/prototype/lazy-methods-throw-eagerly-on-non-iterator.js new file mode 100644 index 0000000000..5f9bc89718 --- /dev/null +++ b/test/staging/sm/Iterator/prototype/lazy-methods-throw-eagerly-on-non-iterator.js @@ -0,0 +1,39 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +esid: pending +description: | + Lazy %Iterator.prototype% methods don't throw when called with non-objects. +info: | + Iterator Helpers proposal 1.1.1 +features: +- iterator-helpers +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +---*/ + +// +// +const methods = [ + iter => Iterator.prototype.map.bind(iter, x => x), + iter => Iterator.prototype.filter.bind(iter, x => x), + iter => Iterator.prototype.take.bind(iter, 1), + iter => Iterator.prototype.drop.bind(iter, 0), + iter => Iterator.prototype.flatMap.bind(iter, x => [x]), +]; + +for (const method of methods) { + assertThrowsInstanceOf(method(undefined), TypeError); + assertThrowsInstanceOf(method(null), TypeError); + assertThrowsInstanceOf(method(0), TypeError); + assertThrowsInstanceOf(method(false), TypeError); + assertThrowsInstanceOf(method(''), TypeError); + assertThrowsInstanceOf(method(Symbol('')), TypeError); + + // No error here. + method({}); + method([]); +} + diff --git a/test/staging/sm/Iterator/prototype/lazy-methods-throw-next-done-throws.js b/test/staging/sm/Iterator/prototype/lazy-methods-throw-next-done-throws.js new file mode 100644 index 0000000000..a91899830c --- /dev/null +++ b/test/staging/sm/Iterator/prototype/lazy-methods-throw-next-done-throws.js @@ -0,0 +1,50 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +esid: pending +description: | + Lazy %Iterator.prototype% methods throw if `next.done` throws. +info: | + Iterator Helpers proposal 2.1.5 +features: +- iterator-helpers +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +---*/ + +// +// +class TestError extends Error {} +class TestIterator extends Iterator { + next() { + return { + get done() { + throw new TestError(); + } + }; + } + + closed = false; + return() { + this.closed = true; + return {done: true}; + } +} + +const methods = [ + iter => iter.map(x => x), + iter => iter.filter(x => x), + iter => iter.take(1), + iter => iter.drop(0), + iter => iter.flatMap(x => [x]), +]; + +for (const method of methods) { + const iterator = new TestIterator(); + assert.sameValue(iterator.closed, false); + assertThrowsInstanceOf(() => method(iterator).next(), TestError); + assert.sameValue(iterator.closed, false); +} + diff --git a/test/staging/sm/Iterator/prototype/lazy-methods-throw-next-not-object.js b/test/staging/sm/Iterator/prototype/lazy-methods-throw-next-not-object.js new file mode 100644 index 0000000000..f252b7f10a --- /dev/null +++ b/test/staging/sm/Iterator/prototype/lazy-methods-throw-next-not-object.js @@ -0,0 +1,47 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +esid: pending +description: | + Lazy %Iterator.prototype% methods throw if `next` call returns a non-object. +info: | + Iterator Helpers proposal 2.1.5 +features: +- iterator-helpers +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +---*/ + +// +// +class TestIterator extends Iterator { + next(value) { + return value; + } + + closed = false; + return() { + this.closed = true; + return {done: true}; + } +} + +const methods = [ + iter => iter.map(x => x), + iter => iter.filter(x => x), + iter => iter.take(1), + iter => iter.drop(0), + iter => iter.flatMap(x => [x]), +]; + +for (const method of methods) { + for (const value of [undefined, null, 0, false, '', Symbol('')]) { + const iterator = new TestIterator(); + assert.sameValue(iterator.closed, false); + assertThrowsInstanceOf(() => method(iterator).next(value), TypeError); + assert.sameValue(iterator.closed, false); + } +} + diff --git a/test/staging/sm/Iterator/prototype/lazy-methods-throw-on-reentry.js b/test/staging/sm/Iterator/prototype/lazy-methods-throw-on-reentry.js new file mode 100644 index 0000000000..a33a0558a3 --- /dev/null +++ b/test/staging/sm/Iterator/prototype/lazy-methods-throw-on-reentry.js @@ -0,0 +1,28 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +features: +- iterator-helpers +description: | + pending +esid: pending +---*/ + +const methods = [ + iter => iter.map, + iter => iter.filter, + iter => iter.flatMap, +]; + +for (const method of methods) { + const iter = [1].values(); + const iterMethod = method(iter); + let iterHelper; + iterHelper = iterMethod.call(iter, x => iterHelper.next()); + assertThrowsInstanceOf(() => iterHelper.next(), TypeError); +} + diff --git a/test/staging/sm/Iterator/prototype/map/call-next-on-iterator-while-iterating.js b/test/staging/sm/Iterator/prototype/map/call-next-on-iterator-while-iterating.js new file mode 100644 index 0000000000..8cfb85cadc --- /dev/null +++ b/test/staging/sm/Iterator/prototype/map/call-next-on-iterator-while-iterating.js @@ -0,0 +1,27 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +esid: pending +description: | + Call next on an iterator that is being iterated over. +features: +- iterator-helpers +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +---*/ + +const iterator = [1, 2, 3].values() +const items = []; + +for (const item of iterator.map(x => x ** 2)) { + const nextItem = iterator.next(); + items.push(item, nextItem.value); +} + +assert.sameValue(items[0], 1); +assert.sameValue(items[1], 2); +assert.sameValue(items[2], 9); +assert.sameValue(items[3], undefined); + diff --git a/test/staging/sm/Iterator/prototype/map/clobber-symbol.js b/test/staging/sm/Iterator/prototype/map/clobber-symbol.js new file mode 100644 index 0000000000..c769e1aadd --- /dev/null +++ b/test/staging/sm/Iterator/prototype/map/clobber-symbol.js @@ -0,0 +1,26 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +esid: pending +description: | + %Iterator.prototype%.map works even if the global Symbol has been clobbered.. +features: +- Symbol +- Symbol.iterator +- iterator-helpers +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +info: | + Iterator is not enabled unconditionally +---*/ +Symbol = undefined; +assertThrowsInstanceOf(() => Symbol.iterator, TypeError); + +const iterator = [0].values(); +assert.sameValue( + iterator.map(x => x + 1).next().value, 1, + '`%Iterator.prototype%.map` still works after Symbol has been clobbered' +); + diff --git a/test/staging/sm/Iterator/prototype/map/interleaved-map-calls.js b/test/staging/sm/Iterator/prototype/map/interleaved-map-calls.js new file mode 100644 index 0000000000..e435e21d27 --- /dev/null +++ b/test/staging/sm/Iterator/prototype/map/interleaved-map-calls.js @@ -0,0 +1,26 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +esid: pending +description: | + Interleaved %Iterator.prototype%.map calls on the same iterator. +features: +- iterator-helpers +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +---*/ +// + +const iterator = [1, 2, 3].values(); +const mapped1 = iterator.map(x => x); +const mapped2 = iterator.map(x => 0); + +assert.sameValue(mapped1.next().value, 1); +assert.sameValue(mapped2.next().value, 0); +assert.sameValue(mapped1.next().value, 3); + +assert.sameValue(mapped1.next().done, true); +assert.sameValue(mapped2.next().done, true); + diff --git a/test/staging/sm/Iterator/prototype/map/length.js b/test/staging/sm/Iterator/prototype/map/length.js new file mode 100644 index 0000000000..63440f74f2 --- /dev/null +++ b/test/staging/sm/Iterator/prototype/map/length.js @@ -0,0 +1,24 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +esid: pending +description: | + %Iterator.prototype%.map length value and descriptor. +info: | + 17 ECMAScript Standard Built-in Objects +features: +- Symbol.iterator +- iterator-helpers +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +---*/ +assert.sameValue(Iterator.prototype.map.length, 1); + +const propertyDescriptor = Reflect.getOwnPropertyDescriptor(Iterator.prototype.map, 'length'); +assert.sameValue(propertyDescriptor.value, 1); +assert.sameValue(propertyDescriptor.enumerable, false); +assert.sameValue(propertyDescriptor.writable, false); +assert.sameValue(propertyDescriptor.configurable, true); + diff --git a/test/staging/sm/Iterator/prototype/map/map.js b/test/staging/sm/Iterator/prototype/map/map.js new file mode 100644 index 0000000000..a8b642ad08 --- /dev/null +++ b/test/staging/sm/Iterator/prototype/map/map.js @@ -0,0 +1,32 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +esid: pending +description: | + %Iterator.prototype%.map value and descriptor. +info: | + 17 ECMAScript Standard Built-in Objects +features: +- iterator-helpers +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +---*/ + +const map = Reflect.getOwnPropertyDescriptor(Iterator.prototype, 'map'); + +assert.sameValue( + Iterator.prototype.map, map.value, + 'The value of `%Iterator.prototype%.map` is the same as the value in the property descriptor.' +); + +assert.sameValue( + typeof map.value, 'function', + '%Iterator.prototype%.map is a function.' +); + +assert.sameValue(map.enumerable, false); +assert.sameValue(map.writable, true); +assert.sameValue(map.configurable, true); + diff --git a/test/staging/sm/Iterator/prototype/map/mapper-not-callable-throw.js b/test/staging/sm/Iterator/prototype/map/mapper-not-callable-throw.js new file mode 100644 index 0000000000..59805be7b3 --- /dev/null +++ b/test/staging/sm/Iterator/prototype/map/mapper-not-callable-throw.js @@ -0,0 +1,36 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +esid: pending +description: | + Eagerly throw TypeError when `mapper` is not callable. +features: +- iterator-helpers +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +---*/ +// + +assertThrowsInstanceOf(() => Iterator.prototype.map(undefined), TypeError); +assertThrowsInstanceOf(() => [].values().map(undefined), TypeError); + +assertThrowsInstanceOf(() => Iterator.prototype.map(null), TypeError); +assertThrowsInstanceOf(() => [].values().map(null), TypeError); + +assertThrowsInstanceOf(() => Iterator.prototype.map(0), TypeError); +assertThrowsInstanceOf(() => [].values().map(0), TypeError); + +assertThrowsInstanceOf(() => Iterator.prototype.map(false), TypeError); +assertThrowsInstanceOf(() => [].values().map(false), TypeError); + +assertThrowsInstanceOf(() => Iterator.prototype.map({}), TypeError); +assertThrowsInstanceOf(() => [].values().map({}), TypeError); + +assertThrowsInstanceOf(() => Iterator.prototype.map(''), TypeError); +assertThrowsInstanceOf(() => [].values().map(''), TypeError); + +assertThrowsInstanceOf(() => Iterator.prototype.map(Symbol('')), TypeError); +assertThrowsInstanceOf(() => [].values().map(Symbol('')), TypeError); + diff --git a/test/staging/sm/Iterator/prototype/map/mutate-iterator-after-done.js b/test/staging/sm/Iterator/prototype/map/mutate-iterator-after-done.js new file mode 100644 index 0000000000..71096a2f68 --- /dev/null +++ b/test/staging/sm/Iterator/prototype/map/mutate-iterator-after-done.js @@ -0,0 +1,26 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +esid: pending +description: | + Mutate an iterator after it has been mapped and returned done. +features: +- iterator-helpers +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +---*/ +// + +const array = [1, 2, 3]; +const iterator = [1, 2, 3].values().map(x => x * 2); + +assert.sameValue(iterator.next().value, 2); +assert.sameValue(iterator.next().value, 4); +assert.sameValue(iterator.next().value, 6); +assert.sameValue(iterator.next().done, true); + +array.push(4); +assert.sameValue(iterator.next().done, true); + diff --git a/test/staging/sm/Iterator/prototype/map/mutate-iterator.js b/test/staging/sm/Iterator/prototype/map/mutate-iterator.js new file mode 100644 index 0000000000..ad7dc015be --- /dev/null +++ b/test/staging/sm/Iterator/prototype/map/mutate-iterator.js @@ -0,0 +1,25 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +esid: pending +description: | + Mutate an iterator after it has been mapped. +features: +- iterator-helpers +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +---*/ +// + +const array = [1, 2, 3]; +const iterator = array.values().map(x => x * 2); +array.push(4); + +assert.sameValue(iterator.next().value, 2); +assert.sameValue(iterator.next().value, 4); +assert.sameValue(iterator.next().value, 6); +assert.sameValue(iterator.next().value, 8); +assert.sameValue(iterator.next().done, true); + diff --git a/test/staging/sm/Iterator/prototype/map/name.js b/test/staging/sm/Iterator/prototype/map/name.js new file mode 100644 index 0000000000..145ecf45f5 --- /dev/null +++ b/test/staging/sm/Iterator/prototype/map/name.js @@ -0,0 +1,23 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +esid: pending +description: | + %Iterator.prototype%.map.name value and descriptor. +info: | + 17 ECMAScript Standard Built-in Objects +features: +- iterator-helpers +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +---*/ +assert.sameValue(Iterator.prototype.map.name, 'map'); + +const propertyDescriptor = Reflect.getOwnPropertyDescriptor(Iterator.prototype.map, 'name'); +assert.sameValue(propertyDescriptor.value, 'map'); +assert.sameValue(propertyDescriptor.enumerable, false); +assert.sameValue(propertyDescriptor.writable, false); +assert.sameValue(propertyDescriptor.configurable, true); + diff --git a/test/staging/sm/Iterator/prototype/map/output-at-generator-end.js b/test/staging/sm/Iterator/prototype/map/output-at-generator-end.js new file mode 100644 index 0000000000..5000917df8 --- /dev/null +++ b/test/staging/sm/Iterator/prototype/map/output-at-generator-end.js @@ -0,0 +1,27 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +esid: pending +description: | + %Iterator.prototype%.map outputs correct value at end of iterator. +features: +- iterator-helpers +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +---*/ +const iterator = [0].values().map(x => x); + +const iterRecord = iterator.next(); +assert.sameValue(iterRecord.done, false); +assert.sameValue(iterRecord.value, 0); + +let endRecord = iterator.next(); +assert.sameValue(endRecord.done, true); +assert.sameValue(endRecord.value, undefined); + +endRecord = iterator.next(); +assert.sameValue(endRecord.done, true); +assert.sameValue(endRecord.value, undefined); + diff --git a/test/staging/sm/Iterator/prototype/map/pass-lastValue-to-next.js b/test/staging/sm/Iterator/prototype/map/pass-lastValue-to-next.js new file mode 100644 index 0000000000..c8e713672d --- /dev/null +++ b/test/staging/sm/Iterator/prototype/map/pass-lastValue-to-next.js @@ -0,0 +1,38 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +esid: pending +description: | + %Iterator.prototype%.map passes lastValue to the `next` call. +info: | + Iterator Helpers Proposal 2.1.5.2 +features: +- iterator-helpers +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +---*/ +const iteratorWhereNextTakesValue = Object.setPrototypeOf({ + next: function(value) { + assert.sameValue(arguments.length, 0); + + if (this.value < 3) + return { done: false, value: this.value++ }; + return { done: true, value: undefined }; + }, + value: 0, +}, Iterator.prototype); + +const mappedIterator = iteratorWhereNextTakesValue.map(x => x); + +assert.sameValue(mappedIterator.next(1).value, 0); + +assert.sameValue(mappedIterator.next(2).value, 1); + +assert.sameValue(mappedIterator.next(3).value, 2); + +assert.sameValue(mappedIterator.next(4).done, true); + +assert.sameValue(mappedIterator.next(5).done, true); + diff --git a/test/staging/sm/Iterator/prototype/map/proxy-abrupt-completion-in-iteratorValue.js b/test/staging/sm/Iterator/prototype/map/proxy-abrupt-completion-in-iteratorValue.js new file mode 100644 index 0000000000..5ab1e17968 --- /dev/null +++ b/test/staging/sm/Iterator/prototype/map/proxy-abrupt-completion-in-iteratorValue.js @@ -0,0 +1,54 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +esid: pending +description: | + %Iterator.prototype%.map does not call return when IteratorValue returns an abrupt completion. +features: +- iterator-helpers +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +---*/ +const handlerProxy = log => new Proxy({}, { + get: (target, key, receiver) => (...args) => { + const target = args[0]; + const item = Reflect[key](...args); + + log.push(`${key}: ${args.filter(x => typeof x != 'object').map(x => x.toString())}`); + + switch (typeof item) { + case 'function': return item.bind(new Proxy(target, handlerProxy(log))); + case 'object': return new Proxy(item, handlerProxy(log)); + default: return item; + } + }, +}); + +const log = []; +const iterator = Object.setPrototypeOf({ + next: function() { + throw 'error'; + return { done: false, value: 0 }; + }, + return: function(value) { + log.push('close iterator'); + return { done: true, value }; + }, +}, Iterator.prototype); +const iteratorProxy = new Proxy(iterator, handlerProxy(log)); +const mappedProxy = iteratorProxy.map(x => x); + +try { + mappedProxy.next(); +} catch (exc) { + assert.sameValue(exc, 'error'); +} + +assert.sameValue( + log.join('\n'), +`get: map +get: next` +); + diff --git a/test/staging/sm/Iterator/prototype/map/proxy-abrupt-completion-in-yield.js b/test/staging/sm/Iterator/prototype/map/proxy-abrupt-completion-in-yield.js new file mode 100644 index 0000000000..5f9060b978 --- /dev/null +++ b/test/staging/sm/Iterator/prototype/map/proxy-abrupt-completion-in-yield.js @@ -0,0 +1,63 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +esid: pending +description: | + %Iterator.prototype%.map calls return when yield throws. +features: +- iterator-helpers +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +---*/ +class TestError extends Error {} + +class TestIterator extends Iterator { + constructor(log) { + super(); + this.log = log; + } + + next() { + return {done: false, value: 0}; + } + + return(value) { + log.push('close iterator'); + return {done: true, value}; + } +} + +const handlerProxy = log => new Proxy({}, { + get: (target, key, receiver) => (...args) => { + const target = args[0]; + const item = Reflect[key](...args); + + log.push(`${key}: ${args.filter(x => typeof x != 'object').map(x => x.toString())}`); + + switch (typeof item) { + case 'function': return item.bind(new Proxy(target, handlerProxy(log))); + case 'object': return new Proxy(item, handlerProxy(log)); + default: return item; + } + }, +}); + +const log = []; +const iterator = new TestIterator(log); +const iteratorProxy = new Proxy(iterator, handlerProxy(log)); +const mappedProxy = iteratorProxy.map(x => x); + +mappedProxy.next(); +mappedProxy.return(); +mappedProxy.next(); + +assert.sameValue( + log.join('\n'), +`get: map +get: next +get: return +close iterator` +); + diff --git a/test/staging/sm/Iterator/prototype/map/proxy-abrupt-completion.js b/test/staging/sm/Iterator/prototype/map/proxy-abrupt-completion.js new file mode 100644 index 0000000000..59f05ed6c9 --- /dev/null +++ b/test/staging/sm/Iterator/prototype/map/proxy-abrupt-completion.js @@ -0,0 +1,55 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +esid: pending +description: | + %Iterator.prototype%.map accesses specified properties only. +features: +- iterator-helpers +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +---*/ +const handlerProxy = log => new Proxy({}, { + get: (target, key, receiver) => (...args) => { + const target = args[0]; + const item = Reflect[key](...args); + + log.push(`${key}: ${args.filter(x => typeof x != 'object').map(x => x.toString())}`); + + switch (typeof item) { + case 'function': return item.bind(new Proxy(target, handlerProxy(log))); + case 'object': return new Proxy(item, handlerProxy(log)); + default: return item; + } + }, +}); + +const log = []; +const iterator = Object.setPrototypeOf({ + next: function() { + return { done: false, value: 0 }; + }, + return: function(value) { + log.push('close iterator'); + return { done: true, value }; + }, +}, Iterator.prototype); +const iteratorProxy = new Proxy(iterator, handlerProxy(log)); +const mappedProxy = iteratorProxy.map(x => { throw 'error'; }); + +try { + mappedProxy.next(); +} catch (exc) { + assert.sameValue(exc, 'error'); +} + +assert.sameValue( + log.join('\n'), +`get: map +get: next +get: return +close iterator` +); + diff --git a/test/staging/sm/Iterator/prototype/map/proxy-accesses.js b/test/staging/sm/Iterator/prototype/map/proxy-accesses.js new file mode 100644 index 0000000000..72c0791e05 --- /dev/null +++ b/test/staging/sm/Iterator/prototype/map/proxy-accesses.js @@ -0,0 +1,95 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +esid: pending +description: | + %Iterator.prototype%.map accesses specified properties only. +features: +- iterator-helpers +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +---*/ +const handlerProxy = log => new Proxy({}, { + get: (target, key, receiver) => (...args) => { + const target = args[0]; + const item = Reflect[key](...args); + + log.push(`${key}: ${args.filter(x => typeof x != 'object').map(x => x.toString())}`); + + switch (typeof item) { + case 'function': return item.bind(new Proxy(target, handlerProxy(log))); + case 'object': return new Proxy(item, handlerProxy(log)); + default: return item; + } + }, +}); + +const log = []; +const iterator = Object.setPrototypeOf({ + next: function() { + if (this.value < 3) + return { done: false, value: this.value++ }; + return { done: true, value: undefined }; + }, + value: 0, +}, Iterator.prototype); +const iteratorProxy = new Proxy(iterator, handlerProxy(log)); +const mappedProxy = iteratorProxy.map(x => x); + +for (const item of mappedProxy) { +} + +assert.sameValue( + log.join('\n'), +`get: map +get: next +get: value +get: value +getOwnPropertyDescriptor: value +has: enumerable +get: enumerable +has: configurable +get: configurable +has: value +get: value +has: writable +get: writable +has: get +has: set +defineProperty: value +set: value,1 +get: value +get: value +getOwnPropertyDescriptor: value +has: enumerable +get: enumerable +has: configurable +get: configurable +has: value +get: value +has: writable +get: writable +has: get +has: set +defineProperty: value +set: value,2 +get: value +get: value +getOwnPropertyDescriptor: value +has: enumerable +get: enumerable +has: configurable +get: configurable +has: value +get: value +has: writable +get: writable +has: get +has: set +defineProperty: value +set: value,3 +get: value` +); + diff --git a/test/staging/sm/Iterator/prototype/map/reenter-map-generator-from-mapper.js b/test/staging/sm/Iterator/prototype/map/reenter-map-generator-from-mapper.js new file mode 100644 index 0000000000..ea2468bd5e --- /dev/null +++ b/test/staging/sm/Iterator/prototype/map/reenter-map-generator-from-mapper.js @@ -0,0 +1,25 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +features: +- iterator-helpers +description: | + pending +esid: pending +---*/ + +// Re-entering the map() generator from the called mapper fails. + +let iterator; +function mapper(x) { + let n = iterator.next(); + return x; +} +iterator = [0].values().map(mapper); + +assertThrowsInstanceOf(iterator.next, TypeError); + diff --git a/test/staging/sm/Iterator/prototype/map/this-not-iterator-throw.js b/test/staging/sm/Iterator/prototype/map/this-not-iterator-throw.js new file mode 100644 index 0000000000..732ed8c60f --- /dev/null +++ b/test/staging/sm/Iterator/prototype/map/this-not-iterator-throw.js @@ -0,0 +1,24 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +esid: pending +description: | + Eagerly throw TypeError when `this` is not an iterator. +features: +- iterator-helpers +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +---*/ +// + +const mapper = (x) => x; + +assertThrowsInstanceOf(() => Iterator.prototype.map.call(undefined, mapper), TypeError); +assertThrowsInstanceOf(() => Iterator.prototype.map.call(null, mapper), TypeError); +assertThrowsInstanceOf(() => Iterator.prototype.map.call(0, mapper), TypeError); +assertThrowsInstanceOf(() => Iterator.prototype.map.call(false, mapper), TypeError); +assertThrowsInstanceOf(() => Iterator.prototype.map.call('', mapper), TypeError); +assertThrowsInstanceOf(() => Iterator.prototype.map.call(new Symbol(''), mapper), TypeError); + diff --git a/test/staging/sm/Iterator/prototype/map/this-value-array-throws.js b/test/staging/sm/Iterator/prototype/map/this-value-array-throws.js new file mode 100644 index 0000000000..da3326e4d9 --- /dev/null +++ b/test/staging/sm/Iterator/prototype/map/this-value-array-throws.js @@ -0,0 +1,18 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +esid: pending +description: | + TypeError not thrown when `this` is an Array. +features: +- Symbol.iterator +- iterator-helpers +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +---*/ +// + +Iterator.prototype.map.call([], x => x); + diff --git a/test/staging/sm/Iterator/prototype/map/throw-when-iterator-returns-non-object.js b/test/staging/sm/Iterator/prototype/map/throw-when-iterator-returns-non-object.js new file mode 100644 index 0000000000..894f481c9e --- /dev/null +++ b/test/staging/sm/Iterator/prototype/map/throw-when-iterator-returns-non-object.js @@ -0,0 +1,27 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +esid: pending +description: | + Throw TypeError if `next` call returns non-object. +features: +- iterator-helpers +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +---*/ +// + +const iterator = returnValue => Object.setPrototypeOf({ + next: () => returnValue, +}, Iterator.prototype); +const mapper = x => x; + +assertThrowsInstanceOf(() => iterator(undefined).map(mapper).next(), TypeError); +assertThrowsInstanceOf(() => iterator(null).map(mapper).next(), TypeError); +assertThrowsInstanceOf(() => iterator(0).map(mapper).next(), TypeError); +assertThrowsInstanceOf(() => iterator(false).map(mapper).next(), TypeError); +assertThrowsInstanceOf(() => iterator('').map(mapper).next(), TypeError); +assertThrowsInstanceOf(() => iterator(Symbol()).map(mapper).next(), TypeError); + diff --git a/test/staging/sm/Iterator/prototype/map/values-pass-through-chained-maps-to-next.js b/test/staging/sm/Iterator/prototype/map/values-pass-through-chained-maps-to-next.js new file mode 100644 index 0000000000..3e90b310eb --- /dev/null +++ b/test/staging/sm/Iterator/prototype/map/values-pass-through-chained-maps-to-next.js @@ -0,0 +1,40 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +esid: pending +description: | + Multiple chained %Iterator.prototype%.map calls pass `lastValue` to the iterator's `next` call. +info: | + Iterator Helpers Proposal 2.1.5.2 +features: +- iterator-helpers +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +---*/ +// + +const iteratorWhereNextTakesValue = Object.setPrototypeOf({ + next: function(value) { + assert.sameValue(arguments.length, 0); + + if (this.value < 3) + return { done: false, value: this.value++ }; + return { done: true, value: undefined }; + }, + value: 0, +}, Iterator.prototype); + +const mappedIterator = iteratorWhereNextTakesValue.map(x => 2 * x).map(x => 1 + x); + +assert.sameValue(mappedIterator.next(1).value, 1); + +assert.sameValue(mappedIterator.next(2).value, 3); + +assert.sameValue(mappedIterator.next(3).value, 5); + +assert.sameValue(mappedIterator.next(4).done, true); + +assert.sameValue(mappedIterator.next(5).done, true); + diff --git a/test/staging/sm/Iterator/prototype/reduce/accumulator-set-to-initial-value.js b/test/staging/sm/Iterator/prototype/reduce/accumulator-set-to-initial-value.js new file mode 100644 index 0000000000..1e97cc0f9b --- /dev/null +++ b/test/staging/sm/Iterator/prototype/reduce/accumulator-set-to-initial-value.js @@ -0,0 +1,21 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +features: +- iterator-helpers +info: | + Iterator is not enabled unconditionally +description: | + pending +esid: pending +---*/ + +const reducer = (acc, value) => acc; +const iterator = [1, 2, 3].values(); + +assert.sameValue(iterator.reduce(reducer, 0), 0); + diff --git a/test/staging/sm/Iterator/prototype/reduce/check-fn-after-getting-iterator.js b/test/staging/sm/Iterator/prototype/reduce/check-fn-after-getting-iterator.js new file mode 100644 index 0000000000..985e6ff2a5 --- /dev/null +++ b/test/staging/sm/Iterator/prototype/reduce/check-fn-after-getting-iterator.js @@ -0,0 +1,37 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [compareArray.js, sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +features: +- iterator-helpers +info: | + Iterator is not enabled unconditionally +description: | + pending +esid: pending +---*/ +const log = []; +const handlerProxy = new Proxy({}, { + get: (target, key, receiver) => (...args) => { + log.push(`${key}: ${args[1]?.toString()}`); + return Reflect[key](...args); + }, +}); + +class TestIterator extends Iterator { + next() { + return {done: true}; + } +} + +const iter = new Proxy(new TestIterator(), handlerProxy); +assertThrowsInstanceOf(() => iter.reduce(1), TypeError); + +assert.compareArray( + log, + ["get: reduce"] +); + diff --git a/test/staging/sm/Iterator/prototype/reduce/descriptor.js b/test/staging/sm/Iterator/prototype/reduce/descriptor.js new file mode 100644 index 0000000000..aeb3b6095f --- /dev/null +++ b/test/staging/sm/Iterator/prototype/reduce/descriptor.js @@ -0,0 +1,23 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +info: | + Descriptor property of Iterator.prototype.reduce + + Iterator is not enabled unconditionally +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +features: +- iterator-helpers +description: | + pending +esid: pending +---*/ +const propDesc = Reflect.getOwnPropertyDescriptor(Iterator.prototype, 'reduce'); +assert.sameValue(typeof propDesc.value, 'function'); +assert.sameValue(propDesc.writable, true); +assert.sameValue(propDesc.enumerable, false); +assert.sameValue(propDesc.configurable, true); + diff --git a/test/staging/sm/Iterator/prototype/reduce/empty-iterator-without-initial-value-throws.js b/test/staging/sm/Iterator/prototype/reduce/empty-iterator-without-initial-value-throws.js new file mode 100644 index 0000000000..ac7a2ac860 --- /dev/null +++ b/test/staging/sm/Iterator/prototype/reduce/empty-iterator-without-initial-value-throws.js @@ -0,0 +1,19 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +features: +- iterator-helpers +info: | + Iterator is not enabled unconditionally +description: | + pending +esid: pending +---*/ + +const iter = [].values(); +assertThrowsInstanceOf(() => iter.reduce((x, y) => x + y), TypeError); + diff --git a/test/staging/sm/Iterator/prototype/reduce/error-from-correct-realm.js b/test/staging/sm/Iterator/prototype/reduce/error-from-correct-realm.js new file mode 100644 index 0000000000..254cf27cfe --- /dev/null +++ b/test/staging/sm/Iterator/prototype/reduce/error-from-correct-realm.js @@ -0,0 +1,28 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +features: +- iterator-helpers +info: | + Iterator is not enabled unconditionally +description: | + pending +esid: pending +---*/ + +const otherGlobal = createNewGlobal({newCompartment: true}); +assert.sameValue(TypeError !== otherGlobal.TypeError, true); + +const iter = [].values(); + +assertThrowsInstanceOf(() => iter.reduce(), TypeError); +assertThrowsInstanceOf( + otherGlobal.Iterator.prototype.reduce.bind(iter), + otherGlobal.TypeError, + 'TypeError comes from the realm of the method.', +); + diff --git a/test/staging/sm/Iterator/prototype/reduce/iterator-empty-return-initial-value.js b/test/staging/sm/Iterator/prototype/reduce/iterator-empty-return-initial-value.js new file mode 100644 index 0000000000..530d4f041c --- /dev/null +++ b/test/staging/sm/Iterator/prototype/reduce/iterator-empty-return-initial-value.js @@ -0,0 +1,21 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +features: +- iterator-helpers +info: | + Iterator is not enabled unconditionally +description: | + pending +esid: pending +---*/ + +const reducer = (x, y) => 0; +const iterator = [].values(); + +assert.sameValue(iterator.reduce(reducer, 1), 1); + diff --git a/test/staging/sm/Iterator/prototype/reduce/iterator-next-return-non-object-throws.js b/test/staging/sm/Iterator/prototype/reduce/iterator-next-return-non-object-throws.js new file mode 100644 index 0000000000..7eb1377045 --- /dev/null +++ b/test/staging/sm/Iterator/prototype/reduce/iterator-next-return-non-object-throws.js @@ -0,0 +1,42 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +features: +- iterator-helpers +info: | + Iterator is not enabled unconditionally +description: | + pending +esid: pending +---*/ + +class TestIterator extends Iterator { + constructor(value) { + super(); + this.value = value; + } + + next() { + return this.value; + } +} + +const sum = (x, y) => x + y; + +let iter = new TestIterator(undefined); +assertThrowsInstanceOf(() => iter.reduce(sum), TypeError); +iter = new TestIterator(null); +assertThrowsInstanceOf(() => iter.reduce(sum), TypeError); +iter = new TestIterator(0); +assertThrowsInstanceOf(() => iter.reduce(sum), TypeError); +iter = new TestIterator(false); +assertThrowsInstanceOf(() => iter.reduce(sum), TypeError); +iter = new TestIterator(''); +assertThrowsInstanceOf(() => iter.reduce(sum), TypeError); +iter = new TestIterator(Symbol('')); +assertThrowsInstanceOf(() => iter.reduce(sum), TypeError); + diff --git a/test/staging/sm/Iterator/prototype/reduce/left-associative.js b/test/staging/sm/Iterator/prototype/reduce/left-associative.js new file mode 100644 index 0000000000..3476cbf6c7 --- /dev/null +++ b/test/staging/sm/Iterator/prototype/reduce/left-associative.js @@ -0,0 +1,19 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +features: +- iterator-helpers +info: | + Iterator is not enabled unconditionally +description: | + pending +esid: pending +---*/ + +assert.sameValue([1, 2, 3].values().reduce((x, y) => `(${x}+${y})`, 0), '(((0+1)+2)+3)'); +assert.sameValue([1, 2, 3].values().reduce((x, y) => `(${x}+${y})`), '((1+2)+3)'); + diff --git a/test/staging/sm/Iterator/prototype/reduce/length.js b/test/staging/sm/Iterator/prototype/reduce/length.js new file mode 100644 index 0000000000..d10914e6f1 --- /dev/null +++ b/test/staging/sm/Iterator/prototype/reduce/length.js @@ -0,0 +1,25 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +description: | + The `length` property of Iterator.prototype.reduce. +info: | + ES7 section 17: Unless otherwise specified, the length property of a built-in + Function object has the attributes { [[Writable]]: false, [[Enumerable]]: + false, [[Configurable]]: true }. + + Iterator is not enabled unconditionally +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +features: +- iterator-helpers +esid: pending +---*/ +const propDesc = Reflect.getOwnPropertyDescriptor(Iterator.prototype.reduce, 'length'); +assert.sameValue(propDesc.value, 1); +assert.sameValue(propDesc.writable, false); +assert.sameValue(propDesc.enumerable, false); +assert.sameValue(propDesc.configurable, true); + diff --git a/test/staging/sm/Iterator/prototype/reduce/name.js b/test/staging/sm/Iterator/prototype/reduce/name.js new file mode 100644 index 0000000000..bb07ab9bb3 --- /dev/null +++ b/test/staging/sm/Iterator/prototype/reduce/name.js @@ -0,0 +1,21 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +description: | + `name` property of Iterator.prototype.reduce. +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +features: +- iterator-helpers +info: | + Iterator is not enabled unconditionally +esid: pending +---*/ +const propDesc = Reflect.getOwnPropertyDescriptor(Iterator.prototype.reduce, 'name'); +assert.sameValue(propDesc.value, 'reduce'); +assert.sameValue(propDesc.writable, false); +assert.sameValue(propDesc.enumerable, false); +assert.sameValue(propDesc.configurable, true); + diff --git a/test/staging/sm/Iterator/prototype/reduce/next-throws-iterator-not-closed.js b/test/staging/sm/Iterator/prototype/reduce/next-throws-iterator-not-closed.js new file mode 100644 index 0000000000..e16e70cd59 --- /dev/null +++ b/test/staging/sm/Iterator/prototype/reduce/next-throws-iterator-not-closed.js @@ -0,0 +1,34 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +features: +- iterator-helpers +info: | + Iterator is not enabled unconditionally +description: | + pending +esid: pending +---*/ + +class TestIterator extends Iterator { + next() { + throw new Error(); + } + + closed = false; + return() { + this.closed = true; + } +} + +const sum = (x, y) => x + y; +const iter = new TestIterator(); + +assert.sameValue(iter.closed, false); +assertThrowsInstanceOf(() => iter.reduce(sum), Error); +assert.sameValue(iter.closed, false); + diff --git a/test/staging/sm/Iterator/prototype/reduce/no-initial-value-set-accumulator-to-first-value.js b/test/staging/sm/Iterator/prototype/reduce/no-initial-value-set-accumulator-to-first-value.js new file mode 100644 index 0000000000..5d17678ca6 --- /dev/null +++ b/test/staging/sm/Iterator/prototype/reduce/no-initial-value-set-accumulator-to-first-value.js @@ -0,0 +1,21 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +features: +- iterator-helpers +info: | + Iterator is not enabled unconditionally +description: | + pending +esid: pending +---*/ + +const reducer = (acc, value) => acc; +const iterator = [1, 2, 3].values(); + +assert.sameValue(iterator.reduce(reducer), 1); + diff --git a/test/staging/sm/Iterator/prototype/reduce/proxy.js b/test/staging/sm/Iterator/prototype/reduce/proxy.js new file mode 100644 index 0000000000..e9caea25df --- /dev/null +++ b/test/staging/sm/Iterator/prototype/reduce/proxy.js @@ -0,0 +1,56 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +features: +- iterator-helpers +info: | + Iterator is not enabled unconditionally +description: | + pending +esid: pending +---*/ +// +// This test checks that %Iterator.prototype%.reduce only gets the `next` method off of the +// iterator once, and never accesses the @@iterator property. +const log = []; +const handlerProxy = new Proxy({}, { + get: (target, key, receiver) => (...args) => { + log.push(`${key}: ${args[1]?.toString()}`); + return Reflect[key](...args); + }, +}); + +class Counter extends Iterator { + value = 0; + next() { + const value = this.value; + if (value < 2) { + this.value = value + 1; + return {done: false, value}; + } + return {done: true}; + } +} + +const iter = new Proxy(new Counter(), handlerProxy); +iter.reduce((x, y) => x + y); + +assert.sameValue( + log.join('\n'), + `get: reduce +get: next +get: value +set: value +getOwnPropertyDescriptor: value +defineProperty: value +get: value +set: value +getOwnPropertyDescriptor: value +defineProperty: value +get: value` +); + diff --git a/test/staging/sm/Iterator/prototype/reduce/reduce.js b/test/staging/sm/Iterator/prototype/reduce/reduce.js new file mode 100644 index 0000000000..c448bed33d --- /dev/null +++ b/test/staging/sm/Iterator/prototype/reduce/reduce.js @@ -0,0 +1,21 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +features: +- iterator-helpers +info: | + Iterator is not enabled unconditionally +description: | + pending +esid: pending +---*/ + +const reducer = (acc, value) => acc + value; +const iterator = [1, 2, 3].values(); + +assert.sameValue(iterator.reduce(reducer, 0), 6); + diff --git a/test/staging/sm/Iterator/prototype/reduce/reducer-not-callable-throws.js b/test/staging/sm/Iterator/prototype/reduce/reducer-not-callable-throws.js new file mode 100644 index 0000000000..d60a9f4b56 --- /dev/null +++ b/test/staging/sm/Iterator/prototype/reduce/reducer-not-callable-throws.js @@ -0,0 +1,32 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +features: +- iterator-helpers +info: | + Iterator is not enabled unconditionally +description: | + pending +esid: pending +---*/ + +class TestIterator extends Iterator { + next() { + return { done: false, value: 0 }; + } +} + +const iter = new TestIterator(); +assertThrowsInstanceOf(() => iter.reduce(), TypeError); +assertThrowsInstanceOf(() => iter.reduce(undefined), TypeError); +assertThrowsInstanceOf(() => iter.reduce(null), TypeError); +assertThrowsInstanceOf(() => iter.reduce(0), TypeError); +assertThrowsInstanceOf(() => iter.reduce(false), TypeError); +assertThrowsInstanceOf(() => iter.reduce(''), TypeError); +assertThrowsInstanceOf(() => iter.reduce(Symbol('')), TypeError); +assertThrowsInstanceOf(() => iter.reduce({}), TypeError); + diff --git a/test/staging/sm/Iterator/prototype/reduce/reducer-throws-iterator-closed.js b/test/staging/sm/Iterator/prototype/reduce/reducer-throws-iterator-closed.js new file mode 100644 index 0000000000..ad308faf15 --- /dev/null +++ b/test/staging/sm/Iterator/prototype/reduce/reducer-throws-iterator-closed.js @@ -0,0 +1,34 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +features: +- iterator-helpers +info: | + Iterator is not enabled unconditionally +description: | + pending +esid: pending +---*/ + +class TestIterator extends Iterator { + next() { + return { done: this.closed, value: undefined }; + } + + closed = false; + return() { + this.closed = true; + } +} + +const reducer = (x, y) => { throw new Error(); }; +const iter = new TestIterator(); + +assert.sameValue(iter.closed, false); +assertThrowsInstanceOf(() => iter.reduce(reducer), Error); +assert.sameValue(iter.closed, true); + diff --git a/test/staging/sm/Iterator/prototype/reduce/this-not-iterator-throws.js b/test/staging/sm/Iterator/prototype/reduce/this-not-iterator-throws.js new file mode 100644 index 0000000000..2e40e31bb7 --- /dev/null +++ b/test/staging/sm/Iterator/prototype/reduce/this-not-iterator-throws.js @@ -0,0 +1,21 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +features: +- iterator-helpers +info: | + Iterator is not enabled unconditionally +description: | + pending +esid: pending +---*/ + +const sum = (x, y) => x + y; +assertThrowsInstanceOf(Iterator.prototype.reduce.bind(undefined, sum), TypeError); +assertThrowsInstanceOf(Iterator.prototype.reduce.bind({}, sum), TypeError); +assertThrowsInstanceOf(Iterator.prototype.reduce.bind({next: 0}, sum), TypeError); + diff --git a/test/staging/sm/Iterator/prototype/reduce/value-throws-iterator-not-closed.js b/test/staging/sm/Iterator/prototype/reduce/value-throws-iterator-not-closed.js new file mode 100644 index 0000000000..e24edf573e --- /dev/null +++ b/test/staging/sm/Iterator/prototype/reduce/value-throws-iterator-not-closed.js @@ -0,0 +1,37 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +features: +- iterator-helpers +info: | + Iterator is not enabled unconditionally +description: | + pending +esid: pending +---*/ + +class TestError extends Error {} +class TestIterator extends Iterator { + next() { + return new Proxy({done: false}, {get: (target, key, receiver) => { + if (key === 'value') + throw new TestError(); + return 0; + }}); + } + + closed = false; + return() { + closed = true; + } +} + +const iterator = new TestIterator(); +assert.sameValue(iterator.closed, false, 'iterator starts unclosed'); +assertThrowsInstanceOf(() => iterator.reduce((x, y) => x + y, 0), TestError); +assert.sameValue(iterator.closed, false, 'iterator remains unclosed'); + diff --git a/test/staging/sm/Iterator/prototype/some/check-fn-after-getting-iterator.js b/test/staging/sm/Iterator/prototype/some/check-fn-after-getting-iterator.js new file mode 100644 index 0000000000..4ed28d539c --- /dev/null +++ b/test/staging/sm/Iterator/prototype/some/check-fn-after-getting-iterator.js @@ -0,0 +1,37 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [compareArray.js, sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +features: +- iterator-helpers +info: | + Iterator is not enabled unconditionally +description: | + pending +esid: pending +---*/ +const log = []; +const handlerProxy = new Proxy({}, { + get: (target, key, receiver) => (...args) => { + log.push(`${key}: ${args[1]?.toString()}`); + return Reflect[key](...args); + }, +}); + +class TestIterator extends Iterator { + next() { + return {done: true}; + } +} + +const iter = new Proxy(new TestIterator(), handlerProxy); +assertThrowsInstanceOf(() => iter.some(1), TypeError); + +assert.compareArray( + log, + ["get: some"] +); + diff --git a/test/staging/sm/Iterator/prototype/some/coerce-result-to-boolean.js b/test/staging/sm/Iterator/prototype/some/coerce-result-to-boolean.js new file mode 100644 index 0000000000..2b1aae48bd --- /dev/null +++ b/test/staging/sm/Iterator/prototype/some/coerce-result-to-boolean.js @@ -0,0 +1,36 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +features: +- IsHTMLDDA +- iterator-helpers +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +info: | + Iterator is not enabled unconditionally +description: | + pending +esid: pending +---*/ + +const fn = (value) => value; +assert.sameValue([true].values().some(fn), true); +assert.sameValue([1].values().some(fn), true); +assert.sameValue([[]].values().some(fn), true); +assert.sameValue([{}].values().some(fn), true); +assert.sameValue(['test'].values().some(fn), true); + +assert.sameValue([false].values().some(fn), false); +assert.sameValue([0].values().some(fn), false); +assert.sameValue([''].values().some(fn), false); +assert.sameValue([null].values().some(fn), false); +assert.sameValue([undefined].values().some(fn), false); +assert.sameValue([NaN].values().some(fn), false); +assert.sameValue([-0].values().some(fn), false); +assert.sameValue([0n].values().some(fn), false); + +const htmlDDA = createIsHTMLDDA(); +assert.sameValue([htmlDDA].values().some(fn), false); + diff --git a/test/staging/sm/Iterator/prototype/some/descriptor.js b/test/staging/sm/Iterator/prototype/some/descriptor.js new file mode 100644 index 0000000000..4d6e634a94 --- /dev/null +++ b/test/staging/sm/Iterator/prototype/some/descriptor.js @@ -0,0 +1,23 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +info: | + Descriptor property of Iterator.prototype.some + + Iterator is not enabled unconditionally +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +features: +- iterator-helpers +description: | + pending +esid: pending +---*/ +const propDesc = Reflect.getOwnPropertyDescriptor(Iterator.prototype, 'some'); +assert.sameValue(typeof propDesc.value, 'function'); +assert.sameValue(propDesc.writable, true); +assert.sameValue(propDesc.enumerable, false); +assert.sameValue(propDesc.configurable, true); + diff --git a/test/staging/sm/Iterator/prototype/some/error-from-correct-realm.js b/test/staging/sm/Iterator/prototype/some/error-from-correct-realm.js new file mode 100644 index 0000000000..347cf9db61 --- /dev/null +++ b/test/staging/sm/Iterator/prototype/some/error-from-correct-realm.js @@ -0,0 +1,28 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +features: +- iterator-helpers +info: | + Iterator is not enabled unconditionally +description: | + pending +esid: pending +---*/ + +const otherGlobal = createNewGlobal({newCompartment: true}); +assert.sameValue(TypeError !== otherGlobal.TypeError, true); + +const iter = [].values(); + +assertThrowsInstanceOf(() => iter.some(), TypeError); +assertThrowsInstanceOf( + otherGlobal.Iterator.prototype.some.bind(iter), + otherGlobal.TypeError, + 'TypeError comes from the realm of the method.', +); + diff --git a/test/staging/sm/Iterator/prototype/some/fn-not-callable-throws.js b/test/staging/sm/Iterator/prototype/some/fn-not-callable-throws.js new file mode 100644 index 0000000000..a35aa1bd55 --- /dev/null +++ b/test/staging/sm/Iterator/prototype/some/fn-not-callable-throws.js @@ -0,0 +1,27 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +features: +- iterator-helpers +info: | + Iterator is not enabled unconditionally +description: | + pending +esid: pending +---*/ + +const iter = [].values(); + +assertThrowsInstanceOf(() => iter.some(), TypeError); +assertThrowsInstanceOf(() => iter.some(undefined), TypeError); +assertThrowsInstanceOf(() => iter.some(null), TypeError); +assertThrowsInstanceOf(() => iter.some(0), TypeError); +assertThrowsInstanceOf(() => iter.some(false), TypeError); +assertThrowsInstanceOf(() => iter.some(''), TypeError); +assertThrowsInstanceOf(() => iter.some(Symbol('')), TypeError); +assertThrowsInstanceOf(() => iter.some({}), TypeError); + diff --git a/test/staging/sm/Iterator/prototype/some/fn-throws-close-iterator.js b/test/staging/sm/Iterator/prototype/some/fn-throws-close-iterator.js new file mode 100644 index 0000000000..f96fb33e0a --- /dev/null +++ b/test/staging/sm/Iterator/prototype/some/fn-throws-close-iterator.js @@ -0,0 +1,34 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +features: +- iterator-helpers +info: | + Iterator is not enabled unconditionally +description: | + pending +esid: pending +---*/ + +class TestIterator extends Iterator { + next() { + return { done: this.closed }; + } + + closed = false; + return() { + this.closed = true; + } +} + +const fn = () => { throw new Error(); }; +const iter = new TestIterator(); + +assert.sameValue(iter.closed, false); +assertThrowsInstanceOf(() => iter.some(fn), Error); +assert.sameValue(iter.closed, true); + diff --git a/test/staging/sm/Iterator/prototype/some/length.js b/test/staging/sm/Iterator/prototype/some/length.js new file mode 100644 index 0000000000..847dffc8a4 --- /dev/null +++ b/test/staging/sm/Iterator/prototype/some/length.js @@ -0,0 +1,25 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +description: | + The `length` property of Iterator.prototype.some. +info: | + ES7 section 17: Unless otherwise specified, the length property of a built-in + Function object has the attributes { [[Writable]]: false, [[Enumerable]]: + false, [[Configurable]]: true }. + + Iterator is not enabled unconditionally +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +features: +- iterator-helpers +esid: pending +---*/ +const propDesc = Reflect.getOwnPropertyDescriptor(Iterator.prototype.some, 'length'); +assert.sameValue(propDesc.value, 1); +assert.sameValue(propDesc.writable, false); +assert.sameValue(propDesc.enumerable, false); +assert.sameValue(propDesc.configurable, true); + diff --git a/test/staging/sm/Iterator/prototype/some/name.js b/test/staging/sm/Iterator/prototype/some/name.js new file mode 100644 index 0000000000..2602902e84 --- /dev/null +++ b/test/staging/sm/Iterator/prototype/some/name.js @@ -0,0 +1,21 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +description: | + `name` property of Iterator.prototype.some. +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +features: +- iterator-helpers +info: | + Iterator is not enabled unconditionally +esid: pending +---*/ +const propDesc = Reflect.getOwnPropertyDescriptor(Iterator.prototype.some, 'name'); +assert.sameValue(propDesc.value, 'some'); +assert.sameValue(propDesc.writable, false); +assert.sameValue(propDesc.enumerable, false); +assert.sameValue(propDesc.configurable, true); + diff --git a/test/staging/sm/Iterator/prototype/some/next-throws-iterator-not-closed.js b/test/staging/sm/Iterator/prototype/some/next-throws-iterator-not-closed.js new file mode 100644 index 0000000000..12ad43399a --- /dev/null +++ b/test/staging/sm/Iterator/prototype/some/next-throws-iterator-not-closed.js @@ -0,0 +1,34 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +features: +- iterator-helpers +info: | + Iterator is not enabled unconditionally +description: | + pending +esid: pending +---*/ + +class TestIterator extends Iterator { + next() { + throw new Error(); + } + + closed = false; + return() { + this.closed = true; + } +} + +const fn = () => {}; +const iter = new TestIterator(); + +assert.sameValue(iter.closed, false); +assertThrowsInstanceOf(() => iter.some(fn), Error); +assert.sameValue(iter.closed, false); + diff --git a/test/staging/sm/Iterator/prototype/some/proxy.js b/test/staging/sm/Iterator/prototype/some/proxy.js new file mode 100644 index 0000000000..c800c3a88b --- /dev/null +++ b/test/staging/sm/Iterator/prototype/some/proxy.js @@ -0,0 +1,56 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +features: +- iterator-helpers +info: | + Iterator is not enabled unconditionally +description: | + pending +esid: pending +---*/ +// +// This test checks that %Iterator.prototype%.some only gets the `next` method off of the +// iterator once, and never accesses the @@iterator property. +const log = []; +const handlerProxy = new Proxy({}, { + get: (target, key, receiver) => (...args) => { + log.push(`${key}: ${args[1]?.toString()}`); + return Reflect[key](...args); + }, +}); + +class Counter extends Iterator { + value = 0; + next() { + const value = this.value; + if (value < 2) { + this.value = value + 1; + return {done: false, value}; + } + return {done: true}; + } +} + +const iter = new Proxy(new Counter(), handlerProxy); +assert.sameValue(iter.some(x => x % 2 == 1), true); + +assert.sameValue( + log.join('\n'), + `get: some +get: next +get: value +set: value +getOwnPropertyDescriptor: value +defineProperty: value +get: value +set: value +getOwnPropertyDescriptor: value +defineProperty: value +get: return` +); + diff --git a/test/staging/sm/Iterator/prototype/some/return-false-if-none-match.js b/test/staging/sm/Iterator/prototype/some/return-false-if-none-match.js new file mode 100644 index 0000000000..30e540756b --- /dev/null +++ b/test/staging/sm/Iterator/prototype/some/return-false-if-none-match.js @@ -0,0 +1,23 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +features: +- iterator-helpers +info: | + Iterator is not enabled unconditionally +description: | + pending +esid: pending +---*/ + +const iter = [1, 3, 5].values(); +const fn = (value) => value % 2 == 0; + +assert.sameValue(iter.some(fn), false); + +assert.sameValue([].values().some(x => x), false); + diff --git a/test/staging/sm/Iterator/prototype/some/short-circuit-on-true.js b/test/staging/sm/Iterator/prototype/some/short-circuit-on-true.js new file mode 100644 index 0000000000..47fbbdc9d6 --- /dev/null +++ b/test/staging/sm/Iterator/prototype/some/short-circuit-on-true.js @@ -0,0 +1,26 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +features: +- iterator-helpers +info: | + Iterator is not enabled unconditionally +description: | + pending +esid: pending +---*/ + +const iter = [1, 2, 3].values(); +const log = []; +const fn = (value) => { + log.push(value.toString()); + return value % 2 == 0; +}; + +assert.sameValue(iter.some(fn), true); +assert.sameValue(log.join(','), '1,2'); + diff --git a/test/staging/sm/Iterator/prototype/some/this-not-iterator-throws.js b/test/staging/sm/Iterator/prototype/some/this-not-iterator-throws.js new file mode 100644 index 0000000000..fc49a84ab0 --- /dev/null +++ b/test/staging/sm/Iterator/prototype/some/this-not-iterator-throws.js @@ -0,0 +1,21 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +features: +- iterator-helpers +info: | + Iterator is not enabled unconditionally +description: | + pending +esid: pending +---*/ + +const fn = x => x; +assertThrowsInstanceOf(Iterator.prototype.some.bind(undefined, fn), TypeError); +assertThrowsInstanceOf(Iterator.prototype.some.bind({}, fn), TypeError); +assertThrowsInstanceOf(Iterator.prototype.some.bind({next: 0}, fn), TypeError); + diff --git a/test/staging/sm/Iterator/prototype/some/value-throws-iterator-not-closed.js b/test/staging/sm/Iterator/prototype/some/value-throws-iterator-not-closed.js new file mode 100644 index 0000000000..cd540ac2dc --- /dev/null +++ b/test/staging/sm/Iterator/prototype/some/value-throws-iterator-not-closed.js @@ -0,0 +1,37 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +features: +- iterator-helpers +info: | + Iterator is not enabled unconditionally +description: | + pending +esid: pending +---*/ + +class TestError extends Error {} +class TestIterator extends Iterator { + next() { + return new Proxy({done: false}, {get: (target, key, receiver) => { + if (key === 'value') + throw new TestError(); + return 0; + }}); + } + + closed = false; + return() { + closed = true; + } +} + +const iterator = new TestIterator(); +assert.sameValue(iterator.closed, false, 'iterator starts unclosed'); +assertThrowsInstanceOf(() => iterator.some(x => x), TestError); +assert.sameValue(iterator.closed, false, 'iterator remains unclosed'); + diff --git a/test/staging/sm/Iterator/prototype/take-drop-throw-eagerly-on-negative.js b/test/staging/sm/Iterator/prototype/take-drop-throw-eagerly-on-negative.js new file mode 100644 index 0000000000..407f517809 --- /dev/null +++ b/test/staging/sm/Iterator/prototype/take-drop-throw-eagerly-on-negative.js @@ -0,0 +1,34 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +esid: pending +description: | + `take` and `drop` throw eagerly when passed negative numbers, after rounding towards 0. +info: | + Iterator Helpers proposal 2.1.5.4 and 2.1.5.5 +features: +- iterator-helpers +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +---*/ + +// +// +const iter = [].values(); +const methods = [ + value => iter.take(value), + value => iter.drop(value), +]; + +for (const method of methods) { + assertThrowsInstanceOf(() => method(-1), RangeError); + assertThrowsInstanceOf(() => method(-Infinity), RangeError); + assertThrowsInstanceOf(() => method(NaN), RangeError); + assertThrowsInstanceOf(() => method(-NaN), RangeError); + + method(-0); + method(-0.9); +} + diff --git a/test/staging/sm/Iterator/prototype/take-drop-throw-eagerly-on-non-integer.js b/test/staging/sm/Iterator/prototype/take-drop-throw-eagerly-on-non-integer.js new file mode 100644 index 0000000000..56f5092dc7 --- /dev/null +++ b/test/staging/sm/Iterator/prototype/take-drop-throw-eagerly-on-non-integer.js @@ -0,0 +1,36 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +esid: pending +description: | + `take` and `drop` throw eagerly when passed values that can't be converted to numbers. +info: | + Iterator Helpers proposal 2.1.5.4 and 2.1.5.5 +features: +- iterator-helpers +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +---*/ + +// +// +const iter = [].values(); +const methods = [ + value => iter.take(value), + value => iter.drop(value), +]; + +const objectWithToPrimitive = { + [Symbol.toPrimitive]() { + return {}; + } +}; + +for (const method of methods) { + assertThrowsInstanceOf(() => method(0n), TypeError); + assertThrowsInstanceOf(() => method(Symbol('')), TypeError); + assertThrowsInstanceOf(() => method(objectWithToPrimitive), TypeError); +} + diff --git a/test/staging/sm/Iterator/prototype/take/close-iterator-when-none-remaining.js b/test/staging/sm/Iterator/prototype/take/close-iterator-when-none-remaining.js new file mode 100644 index 0000000000..6af6996e82 --- /dev/null +++ b/test/staging/sm/Iterator/prototype/take/close-iterator-when-none-remaining.js @@ -0,0 +1,43 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +esid: pending +description: | + %Iterator.prototype%.take closes the iterator when remaining is 0. +info: | + Iterator Helpers proposal 2.1.5.4 +features: +- iterator-helpers +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +---*/ + +// +// +class TestIterator extends Iterator { + next() { + return {done: false, value: 1}; + } + + closed = false; + return() { + this.closed = true; + return {done: true}; + } +} + +const iter = new TestIterator(); +const iterTake = iter.take(1); + +let result = iterTake.next(); +assert.sameValue(result.done, false); +assert.sameValue(result.value, 1); +assert.sameValue(iter.closed, false); + +result = iterTake.next(); +assert.sameValue(result.done, true); +assert.sameValue(result.value, undefined); +assert.sameValue(iter.closed, true); + diff --git a/test/staging/sm/Iterator/prototype/take/length.js b/test/staging/sm/Iterator/prototype/take/length.js new file mode 100644 index 0000000000..008e45a9d0 --- /dev/null +++ b/test/staging/sm/Iterator/prototype/take/length.js @@ -0,0 +1,24 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +esid: pending +description: | + %Iterator.prototype%.take length value and descriptor. +info: | + 17 ECMAScript Standard Built-in Objects +features: +- Symbol.iterator +- iterator-helpers +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +---*/ +assert.sameValue(Iterator.prototype.take.length, 1); + +const propertyDescriptor = Reflect.getOwnPropertyDescriptor(Iterator.prototype.take, 'length'); +assert.sameValue(propertyDescriptor.value, 1); +assert.sameValue(propertyDescriptor.enumerable, false); +assert.sameValue(propertyDescriptor.writable, false); +assert.sameValue(propertyDescriptor.configurable, true); + diff --git a/test/staging/sm/Iterator/prototype/take/name.js b/test/staging/sm/Iterator/prototype/take/name.js new file mode 100644 index 0000000000..84b30512c1 --- /dev/null +++ b/test/staging/sm/Iterator/prototype/take/name.js @@ -0,0 +1,23 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +esid: pending +description: | + %Iterator.prototype%.take.name value and descriptor. +info: | + 17 ECMAScript Standard Built-in Objects +features: +- iterator-helpers +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +---*/ +assert.sameValue(Iterator.prototype.take.name, 'take'); + +const propertyDescriptor = Reflect.getOwnPropertyDescriptor(Iterator.prototype.take, 'name'); +assert.sameValue(propertyDescriptor.value, 'take'); +assert.sameValue(propertyDescriptor.enumerable, false); +assert.sameValue(propertyDescriptor.writable, false); +assert.sameValue(propertyDescriptor.configurable, true); + diff --git a/test/staging/sm/Iterator/prototype/take/take-more-than-available.js b/test/staging/sm/Iterator/prototype/take/take-more-than-available.js new file mode 100644 index 0000000000..ec9b16e2ec --- /dev/null +++ b/test/staging/sm/Iterator/prototype/take/take-more-than-available.js @@ -0,0 +1,55 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +esid: pending +description: | + %Iterator.prototype%.take returns if the iterator is done. +info: | + Iterator Helpers proposal 2.1.5.4 2. Repeat, + ... + c. Let next be ? IteratorStep(iterated, lastValue). + d. If next is false, return undefined. +features: +- iterator-helpers +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +---*/ + +// +// +let iter = [1, 2].values().take(3); +for (const expected of [1, 2]) { + const result = iter.next(); + assert.sameValue(result.value, expected); + assert.sameValue(result.done, false); +} +let result = iter.next(); +assert.sameValue(result.value, undefined); +assert.sameValue(result.done, true); + +class TestIterator extends Iterator { + counter = 0; + next() { + return {done: ++this.counter >= 2, value: undefined}; + } + + closed = false; + return(value) { + this.closed = true; + return {done: true, value}; + } +} + +iter = new TestIterator(); +let taken = iter.take(10); +for (const value of taken) { + assert.sameValue(value, undefined); +} +result = taken.next(); +assert.sameValue(result.value, undefined); +assert.sameValue(result.done, true); +assert.sameValue(iter.counter, 2); +assert.sameValue(iter.closed, false); + diff --git a/test/staging/sm/Iterator/prototype/take/take.js b/test/staging/sm/Iterator/prototype/take/take.js new file mode 100644 index 0000000000..6e00929d06 --- /dev/null +++ b/test/staging/sm/Iterator/prototype/take/take.js @@ -0,0 +1,30 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +esid: pending +description: | + Smoketest of %Iterator.prototype%.take. +info: | + Iterator Helpers proposal 2.1.5.4 +features: +- async-iteration +- iterator-helpers +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +---*/ + +let iter = [1, 2, 3].values().take(2); + +for (const v of [1, 2]) { + let result = iter.next(); + assert.sameValue(result.done, false); + assert.sameValue(result.value, v); +} + +assert.sameValue(iter.next().done, true); + +// `take`, when called without arguments, throws a RangeError, +assertThrowsInstanceOf(() => ['test'].values().take(), RangeError); + diff --git a/test/staging/sm/Iterator/prototype/toArray/create-in-current-realm.js b/test/staging/sm/Iterator/prototype/toArray/create-in-current-realm.js new file mode 100644 index 0000000000..42e8d88d9d --- /dev/null +++ b/test/staging/sm/Iterator/prototype/toArray/create-in-current-realm.js @@ -0,0 +1,26 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +features: +- iterator-helpers +info: | + Iterator is not enabled unconditionally +description: | + pending +esid: pending +---*/ + +const otherGlobal = createNewGlobal({newCompartment: true}); + +let array = [1, 2, 3].values().toArray(); +assert.sameValue(array instanceof Array, true); +assert.sameValue(array instanceof otherGlobal.Array, false); + +array = otherGlobal.Iterator.prototype.toArray.call([1, 2, 3].values()); +assert.sameValue(array instanceof Array, false); +assert.sameValue(array instanceof otherGlobal.Array, true); + diff --git a/test/staging/sm/Iterator/prototype/toArray/descriptor.js b/test/staging/sm/Iterator/prototype/toArray/descriptor.js new file mode 100644 index 0000000000..0f814ca413 --- /dev/null +++ b/test/staging/sm/Iterator/prototype/toArray/descriptor.js @@ -0,0 +1,23 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +info: | + Descriptor property of Iterator.prototype.toArray + + Iterator is not enabled unconditionally +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +features: +- iterator-helpers +description: | + pending +esid: pending +---*/ +const propDesc = Reflect.getOwnPropertyDescriptor(Iterator.prototype, 'toArray'); +assert.sameValue(typeof propDesc.value, 'function'); +assert.sameValue(propDesc.writable, true); +assert.sameValue(propDesc.enumerable, false); +assert.sameValue(propDesc.configurable, true); + diff --git a/test/staging/sm/Iterator/prototype/toArray/iterator-empty.js b/test/staging/sm/Iterator/prototype/toArray/iterator-empty.js new file mode 100644 index 0000000000..89c3ba66e8 --- /dev/null +++ b/test/staging/sm/Iterator/prototype/toArray/iterator-empty.js @@ -0,0 +1,22 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +features: +- iterator-helpers +info: | + Iterator is not enabled unconditionally +description: | + pending +esid: pending +---*/ + +const iter = [].values(); +const array = iter.toArray(); + +assert.sameValue(Array.isArray(array), true); +assert.sameValue(array.length, 0); + diff --git a/test/staging/sm/Iterator/prototype/toArray/length.js b/test/staging/sm/Iterator/prototype/toArray/length.js new file mode 100644 index 0000000000..4f5ab7287a --- /dev/null +++ b/test/staging/sm/Iterator/prototype/toArray/length.js @@ -0,0 +1,25 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +description: | + The `length` property of Iterator.prototype.toArray. +info: | + ES7 section 17: Unless otherwise specified, the length property of a built-in + Function object has the attributes { [[Writable]]: false, [[Enumerable]]: + false, [[Configurable]]: true }. + + Iterator is not enabled unconditionally +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +features: +- iterator-helpers +esid: pending +---*/ +const propDesc = Reflect.getOwnPropertyDescriptor(Iterator.prototype.toArray, 'length'); +assert.sameValue(propDesc.value, 0); +assert.sameValue(propDesc.writable, false); +assert.sameValue(propDesc.enumerable, false); +assert.sameValue(propDesc.configurable, true); + diff --git a/test/staging/sm/Iterator/prototype/toArray/name.js b/test/staging/sm/Iterator/prototype/toArray/name.js new file mode 100644 index 0000000000..915d1848f0 --- /dev/null +++ b/test/staging/sm/Iterator/prototype/toArray/name.js @@ -0,0 +1,21 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +description: | + `name` property of Iterator.prototype.toArray. +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +features: +- iterator-helpers +info: | + Iterator is not enabled unconditionally +esid: pending +---*/ +const propDesc = Reflect.getOwnPropertyDescriptor(Iterator.prototype.toArray, 'name'); +assert.sameValue(propDesc.value, 'toArray'); +assert.sameValue(propDesc.writable, false); +assert.sameValue(propDesc.enumerable, false); +assert.sameValue(propDesc.configurable, true); + diff --git a/test/staging/sm/Iterator/prototype/toArray/next-throws.js b/test/staging/sm/Iterator/prototype/toArray/next-throws.js new file mode 100644 index 0000000000..7252c44591 --- /dev/null +++ b/test/staging/sm/Iterator/prototype/toArray/next-throws.js @@ -0,0 +1,26 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +features: +- iterator-helpers +info: | + Iterator is not enabled unconditionally +description: | + pending +esid: pending +---*/ + +class TestIterator extends Iterator { + next() { + throw new Error(); + } +} + +const iter = new TestIterator(); + +assertThrowsInstanceOf(() => iter.toArray(), Error); + diff --git a/test/staging/sm/Iterator/prototype/toArray/proxy.js b/test/staging/sm/Iterator/prototype/toArray/proxy.js new file mode 100644 index 0000000000..f8f04c500b --- /dev/null +++ b/test/staging/sm/Iterator/prototype/toArray/proxy.js @@ -0,0 +1,56 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +features: +- iterator-helpers +info: | + Iterator is not enabled unconditionally +description: | + pending +esid: pending +---*/ +// +// This test checks that %Iterator.prototype%.toArray only gets the `next` method off of the +// iterator once, and never accesses the @@iterator property. +const log = []; +const handlerProxy = new Proxy({}, { + get: (target, key, receiver) => (...args) => { + log.push(`${key}: ${args[1]?.toString()}`); + return Reflect[key](...args); + }, +}); + +class Counter extends Iterator { + value = 0; + next() { + const value = this.value; + if (value < 2) { + this.value = value + 1; + return {done: false, value}; + } + return {done: true}; + } +} + +const iter = new Proxy(new Counter(), handlerProxy); +const array = iter.toArray(); + +assert.sameValue( + log.join('\n'), + `get: toArray +get: next +get: value +set: value +getOwnPropertyDescriptor: value +defineProperty: value +get: value +set: value +getOwnPropertyDescriptor: value +defineProperty: value +get: value` +); + diff --git a/test/staging/sm/Iterator/prototype/toArray/this-not-iterator-throws.js b/test/staging/sm/Iterator/prototype/toArray/this-not-iterator-throws.js new file mode 100644 index 0000000000..33b3ba345f --- /dev/null +++ b/test/staging/sm/Iterator/prototype/toArray/this-not-iterator-throws.js @@ -0,0 +1,20 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +features: +- iterator-helpers +info: | + Iterator is not enabled unconditionally +description: | + pending +esid: pending +---*/ + +assertThrowsInstanceOf(Iterator.prototype.toArray.bind(undefined), TypeError); +assertThrowsInstanceOf(Iterator.prototype.toArray.bind({}), TypeError); +assertThrowsInstanceOf(Iterator.prototype.toArray.bind({next: 0}), TypeError); + diff --git a/test/staging/sm/Iterator/prototype/toArray/toArray.js b/test/staging/sm/Iterator/prototype/toArray/toArray.js new file mode 100644 index 0000000000..ee66928d08 --- /dev/null +++ b/test/staging/sm/Iterator/prototype/toArray/toArray.js @@ -0,0 +1,29 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +features: +- iterator-helpers +info: | + Iterator is not enabled unconditionally +description: | + pending +esid: pending +---*/ + +const iter = [1, 2, 3].values(); +assert.sameValue(Array.isArray(iter), false); + +const array = iter.toArray(); +assert.sameValue(Array.isArray(array), true); +assert.sameValue(array.length, 3); + +const expected = [1, 2, 3]; +for (const item of array) { + const expect = expected.shift(); + assert.sameValue(item, expect); +} + diff --git a/test/staging/sm/Iterator/prototype/toArray/value-throws-iterator-not-closed.js b/test/staging/sm/Iterator/prototype/toArray/value-throws-iterator-not-closed.js new file mode 100644 index 0000000000..b348bf4b1a --- /dev/null +++ b/test/staging/sm/Iterator/prototype/toArray/value-throws-iterator-not-closed.js @@ -0,0 +1,37 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +features: +- iterator-helpers +info: | + Iterator is not enabled unconditionally +description: | + pending +esid: pending +---*/ + +class TestError extends Error {} +class TestIterator extends Iterator { + next() { + return new Proxy({done: false}, {get: (target, key, receiver) => { + if (key === 'value') + throw new TestError(); + return 0; + }}); + } + + closed = false; + return() { + closed = true; + } +} + +const iterator = new TestIterator(); +assert.sameValue(iterator.closed, false, 'iterator starts unclosed'); +assertThrowsInstanceOf(() => iterator.toArray(), TestError); +assert.sameValue(iterator.closed, false, 'iterator remains unclosed'); + diff --git a/test/staging/sm/JSON/cyclic-stringify-unrelated.js b/test/staging/sm/JSON/cyclic-stringify-unrelated.js new file mode 100644 index 0000000000..327f4ad5fe --- /dev/null +++ b/test/staging/sm/JSON/cyclic-stringify-unrelated.js @@ -0,0 +1,46 @@ +/* + * Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/licenses/publicdomain/ + */ + +/*--- +includes: [sm/non262-JSON-shell.js, sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +//----------------------------------------------------------------------------- +var BUGNUMBER = 1197097; +var summary = "JSON.stringify shouldn't use context-wide cycle detection"; + +print(BUGNUMBER + ": " + summary); + +/************** + * BEGIN TEST * + **************/ + +var arr; + +// Nested yet separate JSON.stringify is okay. +arr = [{}]; +assert.sameValue(JSON.stringify(arr, function(k, v) { + assert.sameValue(JSON.stringify(arr), "[{}]"); + return v; +}), "[{}]"); + +// SpiderMonkey censors cycles in array-joining. This mechanism must not +// interfere with the cycle detection in JSON.stringify. +arr = [{ + toString: function() { + var s = JSON.stringify(arr); + assert.sameValue(s, "[{}]"); + return s; + } +}]; +assert.sameValue(arr.join(), "[{}]"); + +/******************************************************************************/ + +print("Tests complete"); diff --git a/test/staging/sm/JSON/cyclic-stringify.js b/test/staging/sm/JSON/cyclic-stringify.js new file mode 100644 index 0000000000..ece9abc85a --- /dev/null +++ b/test/staging/sm/JSON/cyclic-stringify.js @@ -0,0 +1,107 @@ +/* + * Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/licenses/publicdomain/ + */ + +/*--- +includes: [sm/non262-JSON-shell.js, sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +//----------------------------------------------------------------------------- +var BUGNUMBER = 578273; +var summary = + "ES5: Properly detect cycles in JSON.stringify (throw TypeError, check for " + + "cycles rather than imprecisely rely on recursion limits)"; + +print(BUGNUMBER + ": " + summary); + +/************** + * BEGIN TEST * + **************/ + +// objects + +var count = 0; +var desc = + { + get: function() { count++; return obj; }, + enumerable: true, + configurable: true + }; +var obj = Object.defineProperty({ p1: 0 }, "p2", desc); + +try +{ + var str = JSON.stringify(obj); + assert.sameValue(false, true, "should have thrown, got " + str); +} +catch (e) +{ + assert.sameValue(e instanceof TypeError, true, + "wrong error type: " + e.constructor.name); + assert.sameValue(count, 1, + "cyclic data structures not detected immediately"); +} + +count = 0; +var obj2 = Object.defineProperty({}, "obj", desc); +try +{ + var str = JSON.stringify(obj2); + assert.sameValue(false, true, "should have thrown, got " + str); +} +catch (e) +{ + assert.sameValue(e instanceof TypeError, true, + "wrong error type: " + e.constructor.name); + assert.sameValue(count, 2, + "cyclic data structures not detected immediately"); +} + + +// arrays + +var count = 0; +var desc = + { + get: function() { count++; return arr; }, + enumerable: true, + configurable: true + }; +var arr = Object.defineProperty([], "0", desc); + +try +{ + var str = JSON.stringify(arr); + assert.sameValue(false, true, "should have thrown, got " + str); +} +catch (e) +{ + assert.sameValue(e instanceof TypeError, true, + "wrong error type: " + e.constructor.name); + assert.sameValue(count, 1, + "cyclic data structures not detected immediately"); +} + +count = 0; +var arr2 = Object.defineProperty([], "0", desc); +try +{ + var str = JSON.stringify(arr2); + assert.sameValue(false, true, "should have thrown, got " + str); +} +catch (e) +{ + assert.sameValue(e instanceof TypeError, true, + "wrong error type: " + e.constructor.name); + assert.sameValue(count, 2, + "cyclic data structures not detected immediately"); +} + +/******************************************************************************/ + +print("Tests complete"); diff --git a/test/staging/sm/JSON/immutable-reviver.js b/test/staging/sm/JSON/immutable-reviver.js new file mode 100644 index 0000000000..4ff84c9c10 --- /dev/null +++ b/test/staging/sm/JSON/immutable-reviver.js @@ -0,0 +1,33 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-JSON-shell.js, sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +features: +- record-tuple +description: | + pending +esid: pending +---*/ + +const values = []; + +const result = JSON.parseImmutable('{"x":1,"a":[1,2,{},[]]}', function (k, v) { + values.push(#[k, v]); + return v; +}); + +assert.sameValue(result, #{x: 1, a: #[1, 2, #{}, #[]]}); + +const next = () => values.shift(); +assert.sameValue(next(), #["x", 1]); +assert.sameValue(next(), #["0", 1]); +assert.sameValue(next(), #["1", 2]); +assert.sameValue(next(), #["2", #{}]); +assert.sameValue(next(), #["3", #[]]); +assert.sameValue(next(), #["a", #[1, 2, #{}, #[]]]); +assert.sameValue(next(), #["", result]); +assert.sameValue(values.length, 0); + diff --git a/test/staging/sm/JSON/immutable.js b/test/staging/sm/JSON/immutable.js new file mode 100644 index 0000000000..d6454fcd6d --- /dev/null +++ b/test/staging/sm/JSON/immutable.js @@ -0,0 +1,24 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-JSON-shell.js, sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +features: +- record-tuple +description: | + pending +esid: pending +---*/ + +assert.sameValue( + JSON.parseImmutable('{"x":1,"a":[1,2,{},[]]}'), + #{ x: 1, a: #[1, 2, #{}, #[]] } +); + +assert.sameValue( + JSON.parseImmutable('{"a":1,"a":2}'), + #{ a: 2 } +); + diff --git a/test/staging/sm/JSON/parse-arguments.js b/test/staging/sm/JSON/parse-arguments.js new file mode 100644 index 0000000000..c3158b139b --- /dev/null +++ b/test/staging/sm/JSON/parse-arguments.js @@ -0,0 +1,37 @@ +/* + * Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/licenses/publicdomain/ + */ + +/*--- +includes: [sm/non262-JSON-shell.js, sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +var gTestfile = 'parse-arguments.js'; +//----------------------------------------------------------------------------- +var BUGNUMBER = 653847; +var summary = "JSON.parse handling of omitted arguments"; + +print(BUGNUMBER + ": " + summary); + +/************** + * BEGIN TEST * + **************/ + +try +{ + var r = JSON.parse(); + throw new Error("didn't throw, returned " + r); +} +catch (e) +{ + assert.sameValue(e instanceof SyntaxError, true, "expected syntax error, got: " + e); +} + +/******************************************************************************/ + +print("Tests complete"); diff --git a/test/staging/sm/JSON/parse-crockford-01.js b/test/staging/sm/JSON/parse-crockford-01.js new file mode 100644 index 0000000000..84cad8be24 --- /dev/null +++ b/test/staging/sm/JSON/parse-crockford-01.js @@ -0,0 +1,129 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-JSON-shell.js, sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +var str = + '[\n' + + ' "JSON Test Pattern pass1",\n' + + ' {"object with 1 member":["array with 1 element"]},\n' + + ' {},\n' + + ' [],\n' + + ' -42,\n' + + ' true,\n' + + ' false,\n' + + ' null,\n' + + ' {\n' + + ' "integer": 1234567890,\n' + + ' "real": -9876.543210,\n' + + ' "e": 0.123456789e-12,\n' + + ' "E": 1.234567890E+34,\n' + + ' "": 23456789012E66,\n' + + ' "zero": 0,\n' + + ' "one": 1,\n' + + ' "space": " ",\n' + + ' "quote": "\\"",\n' + + ' "backslash": "\\\\",\n' + + ' "controls": "\\b\\f\\n\\r\\t",\n' + + ' "slash": "/ & \\/",\n' + + ' "alpha": "abcdefghijklmnopqrstuvwyz",\n' + + ' "ALPHA": "ABCDEFGHIJKLMNOPQRSTUVWYZ",\n' + + ' "digit": "0123456789",\n' + + ' "0123456789": "digit",\n' + + ' "special": "`1~!@#$%^&*()_+-={\':[,]}|;.?",\n' + + ' "hex": "\\u0123\\u4567\\u89AB\\uCDEF\\uabcd\\uef4A",\n' + + ' "true": true,\n' + + ' "false": false,\n' + + ' "null": null,\n' + + ' "array":[ ],\n' + + ' "object":{ },\n' + + ' "address": "50 St. James Street",\n' + + ' "url": "http://www.JSON.org/",\n' + + ' "comment": "// /* */": " ",\n' + + ' " s p a c e d " :[1,2 , 3\n' + + '\n' + + ',\n' + + '\n' + + '4 , 5 , 6 ,7 ],"compact":[1,2,3,4,5,6,7],\n' + + ' "jsontext": "{\\"object with 1 member\\":[\\"array with 1 element\\"]}",\n' + + ' "quotes": "" \\u0022 %22 0x22 034 "",\n' + + ' "\\/\\\\\\"\\uCAFE\\uBABE\\uAB98\\uFCDE\\ubcda\\uef4A\\b\\f\\n\\r\\t`1~!@#$%^&*()_+-=[]{}|;:\',./<>?"\n' + + ': "A key can be any string"\n' + + ' },\n' + + ' 0.5 ,98.6\n' + + ',\n' + + '99.44\n' + + ',\n' + + '\n' + + '1066,\n' + + '1e1,\n' + + '0.1e1,\n' + + '1e-1,\n' + + '1e00,2e+00,2e-00\n' + + ',"rosebud"]\n'; + +var x = JSON.parse(str); + +assert.sameValue(x[0], "JSON Test Pattern pass1"); +assert.sameValue(x[1]["object with 1 member"][0], "array with 1 element"); +assert.sameValue(x[2].constructor, Object); +assert.sameValue(x[3].constructor, Array); +assert.sameValue(x[4], -42); +assert.sameValue(x[5], true); +assert.sameValue(x[6], false); +assert.sameValue(x[7], null); +assert.sameValue(x[8].constructor, Object); +assert.sameValue(x[8]["integer"], 1234567890); +assert.sameValue(x[8]["real"], -9876.543210); +assert.sameValue(x[8]["e"], 0.123456789e-12); +assert.sameValue(x[8]["E"], 1.234567890E+34); +assert.sameValue(x[8][""], 23456789012E66); +assert.sameValue(x[8]["zero"], 0); +assert.sameValue(x[8]["one"], 1); +assert.sameValue(x[8]["space"], " "); +assert.sameValue(x[8]["quote"], "\""); +assert.sameValue(x[8]["backslash"], "\\"); +assert.sameValue(x[8]["controls"], "\b\f\n\r\t"); +assert.sameValue(x[8]["slash"], "/ & /"); +assert.sameValue(x[8]["alpha"], "abcdefghijklmnopqrstuvwyz"); +assert.sameValue(x[8]["ALPHA"], "ABCDEFGHIJKLMNOPQRSTUVWYZ"); +assert.sameValue(x[8]["digit"], "0123456789"); +assert.sameValue(x[8]["0123456789"], "digit"); +assert.sameValue(x[8]["special"], "`1~!@#$%^&*()_+-={':[,]}|;.?"); +assert.sameValue(x[8]["hex"], "\u0123\u4567\u89AB\uCDEF\uabcd\uef4A"); +assert.sameValue(x[8]["true"], true); +assert.sameValue(x[8]["false"], false); +assert.sameValue(x[8]["null"], null); +assert.sameValue(x[8]["array"].length, 0); +assert.sameValue(x[8]["object"].constructor, Object); +assert.sameValue(x[8]["address"], "50 St. James Street"); +assert.sameValue(x[8]["url"], "http://www.JSON.org/"); +assert.sameValue(x[8]["comment"], "// /* */"], " "); +assert.sameValue(x[8][" s p a c e d "].length, 7); +assert.sameValue(x[8]["compact"].length, 7); +assert.sameValue(x[8]["jsontext"], "{\"object with 1 member\":[\"array with 1 element\"]}"); +assert.sameValue(x[8]["quotes"], "" \u0022 %22 0x22 034 ""); +assert.sameValue(x[8]["\/\\\"\uCAFE\uBABE\uAB98\uFCDE\ubcda\uef4A\b\f\n\r\t`1~!@#$%^&*()_+-=[]{}|;:',./<>?"], "A key can be any string"); +assert.sameValue(x[9], 0.5); +assert.sameValue(x[10], 98.6); +assert.sameValue(x[11], 99.44); +assert.sameValue(x[12], 1066); +assert.sameValue(x[13], 1e1); +assert.sameValue(x[14], 0.1e1); +assert.sameValue(x[15], 1e-1); +assert.sameValue(x[16], 1e00); +assert.sameValue(x[17], 2e+00); +assert.sameValue(x[18], 2e-00); +assert.sameValue(x[19], "rosebud"); + +/******************************************************************************/ + +print("Tests complete"); diff --git a/test/staging/sm/JSON/parse-mega-huge-array.js b/test/staging/sm/JSON/parse-mega-huge-array.js new file mode 100644 index 0000000000..219e123b09 --- /dev/null +++ b/test/staging/sm/JSON/parse-mega-huge-array.js @@ -0,0 +1,35 @@ +/* + * Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/licenses/publicdomain/ + */ + +/*--- +includes: [sm/non262-JSON-shell.js, sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +var gTestfile = 'parse-mega-huge-array.js'; +//----------------------------------------------------------------------------- +var BUGNUMBER = 667527; +var summary = "JSON.parse should parse arrays of essentially unlimited size"; + +print(BUGNUMBER + ": " + summary); + +/************** + * BEGIN TEST * + **************/ + +var body = "0,"; +for (var i = 0; i < 21; i++) + body = body + body; +var str = '[' + body + '0]'; + +var arr = JSON.parse(str); +assert.sameValue(arr.length, Math.pow(2, 21) + 1); + +/******************************************************************************/ + +print("Tests complete"); diff --git a/test/staging/sm/JSON/parse-number-syntax.js b/test/staging/sm/JSON/parse-number-syntax.js new file mode 100644 index 0000000000..6251380751 --- /dev/null +++ b/test/staging/sm/JSON/parse-number-syntax.js @@ -0,0 +1,39 @@ +/* + * Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/licenses/publicdomain/ + */ + +/*--- +includes: [sm/non262-JSON-shell.js, sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +testJSON('-', true); +testJSON('+', true); +testJSON('-f', true); +testJSON('+f', true); +testJSON('00', true); +testJSON('01', true); +testJSON('1.', true); +testJSON('1.0e', true); +testJSON('1.0e+', true); +testJSON('1.0e-', true); +testJSON('1.0e+z', true); +testJSON('1.0e-z', true); +testJSON('1.0ee', true); +testJSON('1.e1', true); +testJSON('1.e+1', true); +testJSON('1.e-1', true); +testJSON('.', true); +testJSON('.1', true); +testJSON('.1e', true); +testJSON('.1e1', true); +testJSON('.1e+1', true); +testJSON('.1e-1', true); + +/******************************************************************************/ + +print("Tests complete"); diff --git a/test/staging/sm/JSON/parse-octal-syntax-error.js b/test/staging/sm/JSON/parse-octal-syntax-error.js new file mode 100644 index 0000000000..cedcea35e8 --- /dev/null +++ b/test/staging/sm/JSON/parse-octal-syntax-error.js @@ -0,0 +1,16 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-JSON-shell.js, sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +testJSON('{"Numbers cannot have leading zeroes": 013}', true); + +/******************************************************************************/ + +print("Tests complete"); diff --git a/test/staging/sm/JSON/parse-primitives.js b/test/staging/sm/JSON/parse-primitives.js new file mode 100644 index 0000000000..73f242978e --- /dev/null +++ b/test/staging/sm/JSON/parse-primitives.js @@ -0,0 +1,70 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-JSON-shell.js, sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +var x; + +// check an empty object, just for sanity +var emptyObject = "{}"; +x = JSON.parse(emptyObject); +assert.sameValue(typeof x, "object"); +assert.sameValue(x instanceof Object, true); + +x = JSON.parse(emptyObject); +assert.sameValue(typeof x, "object"); + +// booleans and null +x = JSON.parse("true"); +assert.sameValue(x, true); + +x = JSON.parse("true "); +assert.sameValue(x, true); + +x = JSON.parse("false"); +assert.sameValue(x, false); + +x = JSON.parse(" null "); +assert.sameValue(x, null); + +// numbers +x = JSON.parse("1234567890"); +assert.sameValue(x, 1234567890); + +x = JSON.parse("-9876.543210"); +assert.sameValue(x, -9876.543210); + +x = JSON.parse("0.123456789e-12"); +assert.sameValue(x, 0.123456789e-12); + +x = JSON.parse("1.234567890E+34"); +assert.sameValue(x, 1.234567890E+34); + +x = JSON.parse(" 23456789012E66 \r\r\r\r \n\n\n\n "); +assert.sameValue(x, 23456789012E66); + +// strings +x = JSON.parse('"foo"'); +assert.sameValue(x, "foo"); + +x = JSON.parse('"\\r\\n"'); +assert.sameValue(x, "\r\n"); + +x = JSON.parse(' "\\uabcd\uef4A"'); +assert.sameValue(x, "\uabcd\uef4A"); + +x = JSON.parse('"\\uabcd" '); +assert.sameValue(x, "\uabcd"); + +x = JSON.parse('"\\f"'); +assert.sameValue(x, "\f"); + +/******************************************************************************/ + +print("Tests complete"); diff --git a/test/staging/sm/JSON/parse-reviver-array-delete.js b/test/staging/sm/JSON/parse-reviver-array-delete.js new file mode 100644 index 0000000000..757a6e8a8a --- /dev/null +++ b/test/staging/sm/JSON/parse-reviver-array-delete.js @@ -0,0 +1,96 @@ +/* + * Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/licenses/publicdomain/ + */ + +/*--- +includes: [sm/non262-JSON-shell.js, sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +var gTestfile = 'parse-reviver-array-delete.js'; +//----------------------------------------------------------------------------- +var BUGNUMBER = 999999; +var summary = "JSON.parse with a reviver which elides array elements"; + +print(BUGNUMBER + ": " + summary); + +/************** + * BEGIN TEST * + **************/ + +/* + * The reviver deletes all properties from the to-be-returned array. Thus + * stringification reveals properties on the prototype chain -- but there are + * none, so this result is unsurprising. + */ +assert.sameValue(JSON.parse('[1,2,3,4,5,6,7,8,9,0,1,2,3,4,5,6,7,8,9,0]', + function revive(k, v) + { + if (k === "") + return v; + return undefined; + }) + "", + ",,,,,,,,,,,,,,,,,,,"); + +/* + * Now let's try a reviver that deletes every property but a mega-huge one. + */ +var str = "["; +var expected = ""; +var expected2 = ""; +for (var i = 0; i < 2048; i++) +{ + str += "1,"; + if (i === 2047) + { + expected += "1"; + expected2 += "1"; + } + if (i === 3) + expected2 += "17"; + expected += ","; + expected2 += ","; +} +str += "1]"; + +assert.sameValue(JSON.parse(str, + function reviver(k, v) + { + if (k === "" || k === "2047") + return v; + return undefined; + }) + "", + expected); + + +Array.prototype[3] = 17; + +/* Now, with a property on the prototype chain, it'll show through. */ +assert.sameValue(JSON.parse('[1,2,3,4,5,6,7,8,9,0,1,2,3,4,5,6,7,8,9,0]', + function revive(k, v) + { + if (k === "") + return v; + return undefined; + }) + "", + ",,,17,,,,,,,,,,,,,,,,"); + + +/* And here too. */ +assert.sameValue(JSON.parse(str, + function reviver(k, v) + { + if (k === "" || k === "2047") + return v; + return undefined; + }) + "", + expected2); + + +/******************************************************************************/ + +print("Tests complete"); diff --git a/test/staging/sm/JSON/parse-reviver.js b/test/staging/sm/JSON/parse-reviver.js new file mode 100644 index 0000000000..2de53c599f --- /dev/null +++ b/test/staging/sm/JSON/parse-reviver.js @@ -0,0 +1,53 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-JSON-shell.js, sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +function doubler(k, v) +{ + assert.sameValue(typeof k, "string"); + + if (typeof v == "number") + return 2 * v; + + return v; +} + +var x = JSON.parse('{"a":5,"b":6}', doubler); +assert.sameValue(x.hasOwnProperty('a'), true); +assert.sameValue(x.hasOwnProperty('b'), true); +assert.sameValue(x.a, 10); +assert.sameValue(x.b, 12); + +x = JSON.parse('[3, 4, 5]', doubler); +assert.sameValue(x[0], 6); +assert.sameValue(x[1], 8); +assert.sameValue(x[2], 10); + +// make sure reviver isn't called after a failed parse +var called = false; +function dontCallMe(k, v) +{ + called = true; +} + +try +{ + JSON.parse('{{{{{{{}}}}', dontCallMe); + throw new Error("didn't throw?"); +} +catch (e) +{ + assert.sameValue(e instanceof SyntaxError, true, "wrong exception: " + e); +} +assert.sameValue(called, false); + +/******************************************************************************/ + +print("Tests complete"); diff --git a/test/staging/sm/JSON/parse-syntax-errors-01.js b/test/staging/sm/JSON/parse-syntax-errors-01.js new file mode 100644 index 0000000000..abd25e6358 --- /dev/null +++ b/test/staging/sm/JSON/parse-syntax-errors-01.js @@ -0,0 +1,21 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-JSON-shell.js, sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +testJSON("{}...", true); +testJSON('{"foo": truBBBB}', true); +testJSON('{foo: truBBBB}', true); +testJSON('{"foo": undefined}', true); +testJSON('{"foo": ]', true); +testJSON('{"foo', true); + +/******************************************************************************/ + +print("Tests complete"); diff --git a/test/staging/sm/JSON/parse-syntax-errors-02.js b/test/staging/sm/JSON/parse-syntax-errors-02.js new file mode 100644 index 0000000000..50119fbe41 --- /dev/null +++ b/test/staging/sm/JSON/parse-syntax-errors-02.js @@ -0,0 +1,51 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-JSON-shell.js, sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +testJSON('"Unterminated string literal', true); +testJSON('["Unclosed array"', true); +testJSON('{unquoted_key: "keys must be quoted"}', true); +testJSON('["extra comma",]', true); +testJSON('["double extra comma",,]', true); +testJSON('[ , "<-- missing value"]', true); +testJSON('["Comma after the close"],', true); +testJSON('["Extra close"]]', true); +testJSON('{"Extra comma": true,}', true); +testJSON('{"Extra value after close": true} "misplaced quoted value"', true); +testJSON('{"Illegal expression": 1 + 2}', true); +testJSON('{"Illegal invocation": alert()}', true); +testJSON('{"Numbers cannot be hex": 0x14}', true); +testJSON('["Illegal backslash escape: \\x15"]', true); +testJSON('[\\naked]', true); +testJSON('["Illegal backslash escape: \\017"]', true); +testJSON('{"Missing colon" null}', true); +testJSON('{"Double colon":: null}', true); +testJSON('{"Comma instead of colon", null}', true); +testJSON('["Colon instead of comma": false]', true); +testJSON('["Bad value", truth]', true); +testJSON("['single quote']", true); +testJSON('[" tab character in string "]', true); +testJSON('["tab\\ character\\ in\\ string\\ "]', true); +testJSON('["line\rbreak"]', true); +testJSON('["line\nbreak"]', true); +testJSON('["line\r\nbreak"]', true); +testJSON('["line\\\rbreak"]', true); +testJSON('["line\\\nbreak"]', true); +testJSON('["line\\\r\nbreak"]', true); +testJSON('[0e]', true); +testJSON('[0e+]', true); +testJSON('[0e+-1]', true); +testJSON('{"Comma instead of closing brace": true,', true); +testJSON('["mismatch"}', true); +testJSON('0{', true); + +/******************************************************************************/ + +print("Tests complete"); diff --git a/test/staging/sm/JSON/parse-syntax-errors-03.js b/test/staging/sm/JSON/parse-syntax-errors-03.js new file mode 100644 index 0000000000..0fb0559c12 --- /dev/null +++ b/test/staging/sm/JSON/parse-syntax-errors-03.js @@ -0,0 +1,62 @@ +/* + * Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/licenses/publicdomain/ + */ + +/*--- +includes: [sm/non262-JSON-shell.js, sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +testJSON('[', true); +testJSON('[1', true); +testJSON('[1,]', true); +testJSON('[1,{', true); +testJSON('[1,}', true); +testJSON('[1,{]', true); +testJSON('[1,}]', true); +testJSON('[1,{"', true); +testJSON('[1,}"', true); +testJSON('[1,{"\\', true); +testJSON('[1,}"\\', true); +testJSON('[1,"', true); +testJSON('[1,"\\', true); + +testJSON('{', true); +testJSON('{1', true); +testJSON('{,', true); +testJSON('{"', true); +testJSON('{"\\', true); +testJSON('{"\\u', true); +testJSON('{"\\uG', true); +testJSON('{"\\u0', true); +testJSON('{"\\u01', true); +testJSON('{"\\u012', true); +testJSON('{"\\u0123', true); +testJSON('{"\\u0123"', true); +testJSON('{"a"', true); +testJSON('{"a"}', true); +testJSON('{"a":', true); +testJSON('{"a",}', true); +testJSON('{"a":}', true); +testJSON('{"a":,}', true); +testJSON('{"a":5,}', true); +testJSON('{"a":5,[', true); +testJSON('{"a":5,"', true); +testJSON('{"a":5,"', true); +testJSON('{"a":5,"\\', true); +testJSON("a[false ]".substring(1, 7) /* "[false" */, true); + +testJSON('this', true); + +testJSON('[1,{}]', false); +testJSON('{}', false); +testJSON('{"a":5}', false); +testJSON('{"\\u0123":5}', false); + +/******************************************************************************/ + +print("Tests complete"); diff --git a/test/staging/sm/JSON/parse-with-source.js b/test/staging/sm/JSON/parse-with-source.js new file mode 100644 index 0000000000..85d0b61937 --- /dev/null +++ b/test/staging/sm/JSON/parse-with-source.js @@ -0,0 +1,145 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [compareArray.js, deepEqual.js, sm/non262-JSON-shell.js, sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ + +(function checkJSONParseWithSource() { + var actual; + + function reviver(key, value, context) { + assert.sameValue(arguments.length, 3); + if ("source" in context) { + actual.push(context["source"]); + } else { // objects and arrays have no "source" + actual.push(null); + } + } + + let tests = [ + // STRINGS + {input: '""', expected: ['""']}, + {input: '"str"', expected: ['"str"']}, + {input: '"str" ', expected: ['"str"']}, + {input: ' "str" ', expected: ['"str"']}, + {input: ' " str"', expected: ['" str"']}, + {input: '"\uD83D\uDE0A\u2764\u2FC1"', expected: ['"\uD83D\uDE0A\u2764\u2FC1"']}, + // NUMBERS + {input: '1', expected: ['1']}, + {input: ' 1', expected: ['1']}, + {input: '4.2', expected: ['4.2']}, + {input: '4.2 ', expected: ['4.2']}, + {input: '4.2000 ', expected: ['4.2000']}, + {input: '4e2000 ', expected: ['4e2000']}, + {input: '4.4e2000 ', expected: ['4.4e2000']}, + {input: '9007199254740999', expected: ['9007199254740999']}, + {input: '-31', expected: ['-31']}, + {input: '-3.1', expected: ['-3.1']}, + {input: ' -31 ', expected: ['-31']}, + // BOOLEANS + {input: 'true', expected: ['true']}, + {input: 'true ', expected: ['true']}, + {input: 'false', expected: ['false']}, + {input: ' false', expected: ['false']}, + // NULL + {input: 'null', expected: ['null']}, + {input: ' null', expected: ['null']}, + {input: '\tnull ', expected: ['null']}, + {input: 'null\t', expected: ['null']}, + // OBJECTS + {input: '{ }', expected: [null]}, + {input: '{ "4": 1 }', expected: ['1', null]}, + {input: '{ "a": 1 }', expected: ['1', null]}, + {input: '{ "b": 2, "a": 1 }', expected: ['2', '1', null]}, + {input: '{ "b": 2, "1": 1 }', expected: ['1', '2', null]}, + {input: '{ "b": 2, "c": null }', expected: ['2', 'null', null]}, + {input: '{ "b": 2, "b": 1, "b": 4 }', expected: ['4', null]}, + {input: '{ "b": 2, "a": "1" }', expected: ['2', '"1"', null]}, + {input: '{ "b": { "c": 3 }, "a": 1 }', expected: ['3', null, '1', null]}, + // ARRAYS + {input: '[]', expected: [null]}, + {input: '[1, 5, 2]', expected: ['1', '5', '2', null]}, + {input: '[1, null, 2]', expected: ['1', 'null', '2', null]}, + {input: '[1, {"a":2}, "7"]', expected: ['1', '2', null, '"7"', null]}, + {input: '[1, [2, [3, [4, 5], [6, 7], 8], 9], 10]', expected: ['1', '2', '3', '4', '5', null, '6', '7', null, '8', null, '9', null, '10', null]}, + {input: '[1, [2, [3, [4, 5, 6, 7, 8, 9, 10], []]]]', expected: ['1', '2', '3', '4', '5', '6', '7', '8', '9', '10', null, null, null, null, null]}, + {input: '{"a": [1, {"b":2}, "7"], "c": 8}', expected: ['1', '2', null, '"7"', null, '8', null]}, + ]; + for (const test of tests) { + actual = []; + JSON.parse(test.input, reviver); + assert.compareArray(actual, test.expected); + } + + // If the constructed object is modified but the result of the modification is + // the same as the original, we should still provide the source + function replace_c_with_same_val(key, value, context) { + if (key === "a") { + this["c"] = "ABCDEABCDE"; + } + if (key) { + assert.sameValue("source" in context, true); + } + return value; + } + JSON.parse('{ "a": "b", "c": "ABCDEABCDE" }', replace_c_with_same_val); +})(); + +(function checkRawJSON() { + function assertIsRawJson(rawJson, expectedRawJsonValue) { + assert.sameValue(null, Object.getPrototypeOf(rawJson)); + assert.sameValue(true, Object.hasOwn(rawJson, 'rawJSON')); + assert.deepEqual(['rawJSON'], Object.keys(rawJson)); + assert.deepEqual(['rawJSON'], Object.getOwnPropertyNames(rawJson)); + assert.deepEqual([], Object.getOwnPropertySymbols(rawJson)); + assert.sameValue(expectedRawJsonValue, rawJson.rawJSON); + } + + assert.sameValue(true, Object.isFrozen(JSON.rawJSON('"shouldBeFrozen"'))); + assertThrowsInstanceOf(() => JSON.rawJSON(), SyntaxError); + assertIsRawJson(JSON.rawJSON(1, 2), '1'); +})(); + +(function checkIsRawJSON() { + assert.sameValue(false, JSON.isRawJSON()); + assert.sameValue(false, JSON.isRawJSON({}, {})); + assert.sameValue(false, JSON.isRawJSON({}, JSON.rawJSON(2))); + assert.sameValue(true, JSON.isRawJSON(JSON.rawJSON(1), JSON.rawJSON(2))); +})(); + +(function checkUseAsPrototype() { + var p = JSON.rawJSON(false); + var obj = { a: "hi" }; + Object.setPrototypeOf(obj, p); + assert.deepEqual(obj.rawJSON, "false"); +})(); + +(function checkErrorsComeFromCorrectRealm() { + const otherGlobal = createNewGlobal({newCompartment: true}); + assert.sameValue(TypeError !== otherGlobal.TypeError, true); + + assertErrorComesFromCorrectRealm = (fun, thisRealmType) => { + assertThrowsInstanceOf(() => fun(this), thisRealmType, + `${thisRealmType.name} should come from this realm.`); + assertThrowsInstanceOf(() => fun(otherGlobal), otherGlobal[thisRealmType.name], + `${thisRealmType.name} should come from the other realm.`); + } + + otherGlobal.eval('obj = {}'); + + assertErrorComesFromCorrectRealm((gbl) => gbl.JSON.rawJSON(Symbol('123')), TypeError); + assertErrorComesFromCorrectRealm((gbl) => gbl.JSON.rawJSON(undefined), SyntaxError); + assertErrorComesFromCorrectRealm((gbl) => gbl.JSON.rawJSON({}), SyntaxError); + assertErrorComesFromCorrectRealm((gbl) => gbl.JSON.rawJSON(otherGlobal.obj), SyntaxError); + assertErrorComesFromCorrectRealm((gbl) => gbl.JSON.rawJSON([]), SyntaxError); + assertErrorComesFromCorrectRealm((gbl) => gbl.JSON.rawJSON('123\n'), SyntaxError); + assertErrorComesFromCorrectRealm((gbl) => gbl.JSON.rawJSON('\t123'), SyntaxError); + assertErrorComesFromCorrectRealm((gbl) => gbl.JSON.rawJSON(''), SyntaxError); +})(); + diff --git a/test/staging/sm/JSON/parse.js b/test/staging/sm/JSON/parse.js new file mode 100644 index 0000000000..ea3f378d54 --- /dev/null +++ b/test/staging/sm/JSON/parse.js @@ -0,0 +1,183 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-JSON-shell.js, sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +function assertIsObject(x) +{ + assert.sameValue(typeof x, "object"); + assert.sameValue(x instanceof Object, true); +} + +function assertIsArray(x) +{ + assertIsObject(x); + assert.sameValue(Array.isArray(x), true); + assert.sameValue(Object.getPrototypeOf(x), Array.prototype); + assert.sameValue(x instanceof Array, true); + assert.sameValue(x.constructor, Array); +} + +var x; +var props; + +// empty object +x = JSON.parse("{}"); +assertIsObject(x); +assert.sameValue(Object.getOwnPropertyNames(x).length, 0); + +// empty array +x = JSON.parse("[]"); +assertIsArray(x); +assert.sameValue(x.length, 0); + +// one element array +x = JSON.parse("[[]]"); +assertIsArray(x); +assert.sameValue(x.length, 1); +assertIsArray(x[0]); +assert.sameValue(x[0].length, 0); + +// multiple arrays +x = JSON.parse("[[],[],[]]"); +assertIsArray(x); +assert.sameValue(x.length, 3); +assertIsArray(x[0]); +assert.sameValue(x[0].length, 0); +assertIsArray(x[1]); +assert.sameValue(x[1].length, 0); +assertIsArray(x[2]); +assert.sameValue(x[2].length, 0); + +// array key/value +x = JSON.parse('{"foo":[]}'); +assertIsObject(x); +props = Object.getOwnPropertyNames(x); +assert.sameValue(props.length, 1); +assert.sameValue(props[0], "foo"); +assertIsArray(x.foo); +assert.sameValue(x.foo.length, 0); + +x = JSON.parse('{"foo":[], "bar":[]}'); +assertIsObject(x); +props = Object.getOwnPropertyNames(x).sort(); +assert.sameValue(props.length, 2); +assert.sameValue(props[0], "bar"); +assert.sameValue(props[1], "foo"); +assertIsArray(x.foo); +assert.sameValue(x.foo.length, 0); +assertIsArray(x.bar); +assert.sameValue(x.bar.length, 0); + +// nesting +x = JSON.parse('{"foo":[{}]}'); +assertIsObject(x); +props = Object.getOwnPropertyNames(x); +assert.sameValue(props.length, 1); +assert.sameValue(props[0], "foo"); +assertIsArray(x.foo); +assert.sameValue(x.foo.length, 1); +assertIsObject(x.foo[0]); +assert.sameValue(Object.getOwnPropertyNames(x.foo[0]).length, 0); + +x = JSON.parse('{"foo":[{"foo":[{"foo":{}}]}]}'); +assertIsObject(x.foo[0].foo[0].foo); + +x = JSON.parse('{"foo":[{"foo":[{"foo":[]}]}]}'); +assertIsArray(x.foo[0].foo[0].foo); + +// strings +x = JSON.parse('{"foo":"bar"}'); +assertIsObject(x); +props = Object.getOwnPropertyNames(x); +assert.sameValue(props.length, 1); +assert.sameValue(props[0], "foo"); +assert.sameValue(x.foo, "bar"); + +x = JSON.parse('["foo", "bar", "baz"]'); +assertIsArray(x); +assert.sameValue(x.length, 3); +assert.sameValue(x[0], "foo"); +assert.sameValue(x[1], "bar"); +assert.sameValue(x[2], "baz"); + +// numbers +x = JSON.parse('{"foo":5.5, "bar":5}'); +assertIsObject(x); +props = Object.getOwnPropertyNames(x).sort(); +assert.sameValue(props.length, 2); +assert.sameValue(props[0], "bar"); +assert.sameValue(props[1], "foo"); +assert.sameValue(x.foo, 5.5); +assert.sameValue(x.bar, 5); + +// keywords +x = JSON.parse('{"foo": true, "bar":false, "baz":null}'); +assertIsObject(x); +props = Object.getOwnPropertyNames(x).sort(); +assert.sameValue(props.length, 3); +assert.sameValue(props[0], "bar"); +assert.sameValue(props[1], "baz"); +assert.sameValue(props[2], "foo"); +assert.sameValue(x.foo, true); +assert.sameValue(x.bar, false); +assert.sameValue(x.baz, null); + +// short escapes +x = JSON.parse('{"foo": "\\"", "bar":"\\\\", "baz":"\\b","qux":"\\f", "quux":"\\n", "quuux":"\\r","quuuux":"\\t"}'); +props = Object.getOwnPropertyNames(x).sort(); +assert.sameValue(props.length, 7); +assert.sameValue(props[0], "bar"); +assert.sameValue(props[1], "baz"); +assert.sameValue(props[2], "foo"); +assert.sameValue(props[3], "quuuux"); +assert.sameValue(props[4], "quuux"); +assert.sameValue(props[5], "quux"); +assert.sameValue(props[6], "qux"); +assert.sameValue(x.foo, '"'); +assert.sameValue(x.bar, '\\'); +assert.sameValue(x.baz, '\b'); +assert.sameValue(x.qux, '\f'); +assert.sameValue(x.quux, "\n"); +assert.sameValue(x.quuux, "\r"); +assert.sameValue(x.quuuux, "\t"); + +// unicode escape +x = JSON.parse('{"foo":"hmm\\u006dmm"}'); +assertIsObject(x); +props = Object.getOwnPropertyNames(x); +assert.sameValue(props.length, 1); +assert.sameValue(props[0], "foo"); +assert.sameValue("hmm\u006dmm", x.foo); + +x = JSON.parse('{"hmm\\u006dmm":"foo"}'); +assertIsObject(x); +props = Object.getOwnPropertyNames(x); +assert.sameValue(props.length, 1); +assert.sameValue(props[0], "hmmmmm"); +assert.sameValue(x.hmm\u006dmm, "foo"); + +// miscellaneous +x = JSON.parse('{"JSON Test Pattern pass3": {"The outermost value": "must be an object or array.","In this test": "It is an object." }}'); +assertIsObject(x); +props = Object.getOwnPropertyNames(x); +assert.sameValue(props.length, 1); +assert.sameValue(props[0], "JSON Test Pattern pass3"); +assertIsObject(x["JSON Test Pattern pass3"]); +props = Object.getOwnPropertyNames(x["JSON Test Pattern pass3"]).sort(); +assert.sameValue(props.length, 2); +assert.sameValue(props[0], "In this test"); +assert.sameValue(props[1], "The outermost value"); +assert.sameValue(x["JSON Test Pattern pass3"]["The outermost value"], + "must be an object or array."); +assert.sameValue(x["JSON Test Pattern pass3"]["In this test"], "It is an object."); + +/******************************************************************************/ + +print("Tests complete"); diff --git a/test/staging/sm/JSON/regress-459293.js b/test/staging/sm/JSON/regress-459293.js new file mode 100644 index 0000000000..1938c09cd7 --- /dev/null +++ b/test/staging/sm/JSON/regress-459293.js @@ -0,0 +1,31 @@ +/* + * Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/licenses/publicdomain/ + */ + +/*--- +includes: [sm/non262-JSON-shell.js, sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +//----------------------------------------------------------------------------- +var BUGNUMBER = 459293; +var summary = 'Allow redeclaration of JSON'; +var actual = ''; +var expect = ''; + + printBugNumber(BUGNUMBER); + printStatus (summary); + + try + { + eval('var JSON = "foo";'); + } + catch(ex) + { + actual = ex + ''; + } + assert.sameValue(expect, actual, summary); diff --git a/test/staging/sm/JSON/small-codepoints.js b/test/staging/sm/JSON/small-codepoints.js new file mode 100644 index 0000000000..9a4e1ed06f --- /dev/null +++ b/test/staging/sm/JSON/small-codepoints.js @@ -0,0 +1,26 @@ +/* + * Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/licenses/publicdomain/ + */ + +/*--- +includes: [sm/non262-JSON-shell.js, sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +var gTestfile = 'small-codepoints.js'; +//----------------------------------------------------------------------------- +var BUGNUMBER = 554079; +var summary = 'JSON.parse should reject U+0000 through U+001F'; + +print(BUGNUMBER + ": " + summary); + +/************** + * BEGIN TEST * + **************/ + +for (var i = 0; i <= 0x1F; i++) + testJSON('["a' + String.fromCharCode(i) + 'c"]', true); diff --git a/test/staging/sm/JSON/stringify-boxed-primitives.js b/test/staging/sm/JSON/stringify-boxed-primitives.js new file mode 100644 index 0000000000..16d072a547 --- /dev/null +++ b/test/staging/sm/JSON/stringify-boxed-primitives.js @@ -0,0 +1,134 @@ +/* + * Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/licenses/publicdomain/ + */ + +/*--- +includes: [sm/non262-JSON-shell.js, sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +var gTestfile = 'stringify-boxed-primitives.js'; +//----------------------------------------------------------------------------- +var BUGNUMBER = 584909; +var summary = "Stringification of Boolean/String/Number objects"; + +print(BUGNUMBER + ": " + summary); + +/************** + * BEGIN TEST * + **************/ + +function redefine(obj, prop, fun) +{ + var desc = + { value: fun, writable: true, configurable: true, enumerable: false }; + Object.defineProperty(obj, prop, desc); +} + +assert.sameValue(JSON.stringify(new Boolean(false)), "false"); + +assert.sameValue(JSON.stringify(new Number(5)), "5"); + +assert.sameValue(JSON.stringify(new String("foopy")), '"foopy"'); + + +var numToString = Number.prototype.toString; +var numValueOf = Number.prototype.valueOf; +var objToString = Object.prototype.toString; +var objValueOf = Object.prototype.valueOf; +var boolToString = Boolean.prototype.toString; +var boolValueOf = Boolean.prototype.valueOf; + +redefine(Boolean.prototype, "toString", function() { return 17; }); +assert.sameValue(JSON.stringify(new Boolean(false)), "false") +delete Boolean.prototype.toString; +assert.sameValue(JSON.stringify(new Boolean(false)), "false"); +delete Object.prototype.toString; +assert.sameValue(JSON.stringify(new Boolean(false)), "false"); +delete Boolean.prototype.valueOf; +assert.sameValue(JSON.stringify(new Boolean(false)), "false"); +delete Object.prototype.valueOf; +assert.sameValue(JSON.stringify(new Boolean(false)), "false"); + + +redefine(Boolean.prototype, "toString", boolToString); +redefine(Boolean.prototype, "valueOf", boolValueOf); +redefine(Object.prototype, "toString", objToString); +redefine(Object.prototype, "valueOf", objValueOf); + +redefine(Number.prototype, "toString", function() { return 42; }); +assert.sameValue(JSON.stringify(new Number(5)), "5"); +redefine(Number.prototype, "valueOf", function() { return 17; }); +assert.sameValue(JSON.stringify(new Number(5)), "17"); +delete Number.prototype.toString; +assert.sameValue(JSON.stringify(new Number(5)), "17"); +delete Number.prototype.valueOf; +assert.sameValue(JSON.stringify(new Number(5)), "null"); // isNaN(Number("[object Number]")) +delete Object.prototype.toString; +try +{ + JSON.stringify(new Number(5)); + throw new Error("didn't throw"); +} +catch (e) +{ + assert.sameValue(e instanceof TypeError, true, + "ToNumber failure, should throw TypeError"); +} +delete Object.prototype.valueOf; +try +{ + JSON.stringify(new Number(5)); + throw new Error("didn't throw"); +} +catch (e) +{ + assert.sameValue(e instanceof TypeError, true, + "ToNumber failure, should throw TypeError"); +} + + +redefine(Number.prototype, "toString", numToString); +redefine(Number.prototype, "valueOf", numValueOf); +redefine(Object.prototype, "toString", objToString); +redefine(Object.prototype, "valueOf", objValueOf); + + +redefine(String.prototype, "valueOf", function() { return 17; }); +assert.sameValue(JSON.stringify(new String(5)), '"5"'); +redefine(String.prototype, "toString", function() { return 42; }); +assert.sameValue(JSON.stringify(new String(5)), '"42"'); +delete String.prototype.toString; +assert.sameValue(JSON.stringify(new String(5)), '"[object String]"'); +delete Object.prototype.toString; +assert.sameValue(JSON.stringify(new String(5)), '"17"'); +delete String.prototype.valueOf; +try +{ + JSON.stringify(new String(5)); + throw new Error("didn't throw"); +} +catch (e) +{ + assert.sameValue(e instanceof TypeError, true, + "ToString failure, should throw TypeError"); +} +delete Object.prototype.valueOf; +try +{ + JSON.stringify(new String(5)); + throw new Error("didn't throw"); +} +catch (e) +{ + assert.sameValue(e instanceof TypeError, true, + "ToString failure, should throw TypeError"); +} + +/******************************************************************************/ + +print("All tests passed!"); diff --git a/test/staging/sm/JSON/stringify-call-replacer-once.js b/test/staging/sm/JSON/stringify-call-replacer-once.js new file mode 100644 index 0000000000..b9a25dfedc --- /dev/null +++ b/test/staging/sm/JSON/stringify-call-replacer-once.js @@ -0,0 +1,41 @@ +/* + * Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/licenses/publicdomain/ + */ + +/*--- +includes: [sm/non262-JSON-shell.js, sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +var gTestfile = 'stringify-call-replacer-once.js'; +//----------------------------------------------------------------------------- +var BUGNUMBER = 584909; +var summary = "Call replacer function exactly once per value"; + +print(BUGNUMBER + ": " + summary); + +/************** + * BEGIN TEST * + **************/ + +var factor = 1; +function replacer(k, v) +{ + if (k === "") + return v; + + return v * ++factor; +} + +var obj = { a: 1, b: 2, c: 3 }; + +assert.sameValue(JSON.stringify(obj, replacer), '{"a":2,"b":6,"c":12}'); +assert.sameValue(factor, 4); + +/******************************************************************************/ + +print("Tests complete"); diff --git a/test/staging/sm/JSON/stringify-call-toJSON-once.js b/test/staging/sm/JSON/stringify-call-toJSON-once.js new file mode 100644 index 0000000000..46efad8f13 --- /dev/null +++ b/test/staging/sm/JSON/stringify-call-toJSON-once.js @@ -0,0 +1,39 @@ +/* + * Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/licenses/publicdomain/ + */ + +/*--- +includes: [sm/non262-JSON-shell.js, sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +var gTestfile = 'stringify-call-toJSON-once.js'; +//----------------------------------------------------------------------------- +var BUGNUMBER = 584909; +var summary = "Stringification of Boolean/String/Number objects"; + +print(BUGNUMBER + ": " + summary); + +/************** + * BEGIN TEST * + **************/ + +var obj = + { + p: { + toJSON: function() + { + return { toJSON: function() { return 17; } }; + } + } + }; + +assert.sameValue(JSON.stringify(obj), '{"p":{}}'); + +/******************************************************************************/ + +print("Tests complete"); diff --git a/test/staging/sm/JSON/stringify-dropping-elements.js b/test/staging/sm/JSON/stringify-dropping-elements.js new file mode 100644 index 0000000000..f5687a521b --- /dev/null +++ b/test/staging/sm/JSON/stringify-dropping-elements.js @@ -0,0 +1,28 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-JSON-shell.js, sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +assert.sameValue(JSON.stringify({foo: 123}), + '{"foo":123}'); +assert.sameValue(JSON.stringify({foo: 123, bar: function () {}}), + '{"foo":123}'); +assert.sameValue(JSON.stringify({foo: 123, bar: function () {}, baz: 123}), + '{"foo":123,"baz":123}'); + +assert.sameValue(JSON.stringify([123]), + '[123]'); +assert.sameValue(JSON.stringify([123, function () {}]), + '[123,null]'); +assert.sameValue(JSON.stringify([123, function () {}, 456]), + '[123,null,456]'); + +/******************************************************************************/ + +print("Tests complete"); diff --git a/test/staging/sm/JSON/stringify-gap.js b/test/staging/sm/JSON/stringify-gap.js new file mode 100644 index 0000000000..8f16401b97 --- /dev/null +++ b/test/staging/sm/JSON/stringify-gap.js @@ -0,0 +1,68 @@ +/* + * Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/licenses/publicdomain/ + */ + +/*--- +includes: [sm/non262-JSON-shell.js, sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +var gTestfile = 'stringify-gap.js'; +//----------------------------------------------------------------------------- +var BUGNUMBER = 584909; +var summary = + "JSON.stringify(_1, _2, numberGreaterThanOne) produces wrong output"; + +print(BUGNUMBER + ": " + summary); + +/************** + * BEGIN TEST * + **************/ + +var LF = "\n"; +var GAP = " "; + +var obj = { a: { b: [1, 2], c: { d: 3, e: 4 }, f: [], g: {}, h: [5], i: { j: 6 } } }; + +var expected = + '{\n' + + ' "a": {\n' + + ' "b": [\n' + + ' 1,\n' + + ' 2\n' + + ' ],\n' + + ' "c": {\n' + + ' "d": 3,\n' + + ' "e": 4\n' + + ' },\n' + + ' "f": [],\n' + + ' "g": {},\n' + + ' "h": [\n' + + ' 5\n' + + ' ],\n' + + ' "i": {\n' + + ' "j": 6\n' + + ' }\n' + + ' }\n' + + '}'; + +assert.sameValue(JSON.stringify(obj, null, 3), expected); +assert.sameValue(JSON.stringify(obj, null, " "), expected); + +obj = [1, 2, 3]; + +String.prototype.toString = function() { return "--"; }; + +assert.sameValue(JSON.stringify(obj, null, new String(" ")), "[\n--1,\n--2,\n--3\n]"); + +Number.prototype.valueOf = function() { return 0; }; + +assert.sameValue(JSON.stringify(obj, null, new Number(3)), "[1,2,3]"); + +/******************************************************************************/ + +print("All tests passed!"); diff --git a/test/staging/sm/JSON/stringify-ignore-noncallable-toJSON.js b/test/staging/sm/JSON/stringify-ignore-noncallable-toJSON.js new file mode 100644 index 0000000000..d7f4f23dba --- /dev/null +++ b/test/staging/sm/JSON/stringify-ignore-noncallable-toJSON.js @@ -0,0 +1,35 @@ +/* + * Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/licenses/publicdomain/ + */ + +/*--- +includes: [sm/non262-JSON-shell.js, sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +var gTestfile = 'stringify-ignore-noncallable-toJSON.js'; +//----------------------------------------------------------------------------- +var BUGNUMBER = 584909; +var summary = "If the toJSON property isn't callable, don't try to call it"; + +print(BUGNUMBER + ": " + summary); + +/************** + * BEGIN TEST * + **************/ + +var obj = + { + p: { toJSON: null }, + m: { toJSON: {} } + }; + +assert.sameValue(JSON.stringify(obj), '{"p":{"toJSON":null},"m":{"toJSON":{}}}'); + +/******************************************************************************/ + +print("Tests complete"); diff --git a/test/staging/sm/JSON/stringify-large-replacer-array.js b/test/staging/sm/JSON/stringify-large-replacer-array.js new file mode 100644 index 0000000000..040a0794d2 --- /dev/null +++ b/test/staging/sm/JSON/stringify-large-replacer-array.js @@ -0,0 +1,33 @@ +/* + * Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/licenses/publicdomain/ + */ + +/*--- +includes: [sm/non262-JSON-shell.js, sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +var gTestfile = 'stringify-large-replacer-array.js'; +//----------------------------------------------------------------------------- +var BUGNUMBER = 816033; +var summary = "JSON.stringify with a large replacer array"; + +print(BUGNUMBER + ": " + summary); + +/************** + * BEGIN TEST * + **************/ + +var replacer = []; +for (var i = 0; i < 4096; i++) + replacer.push(i); + +assert.sameValue(JSON.stringify({ "foopy": "FAIL", "4093": 17 }, replacer), '{"4093":17}'); + +/******************************************************************************/ + +print("Tests complete"); diff --git a/test/staging/sm/JSON/stringify-missing-arguments.js b/test/staging/sm/JSON/stringify-missing-arguments.js new file mode 100644 index 0000000000..e6521962cf --- /dev/null +++ b/test/staging/sm/JSON/stringify-missing-arguments.js @@ -0,0 +1,29 @@ +/* + * Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/licenses/publicdomain/ + */ + +/*--- +includes: [sm/non262-JSON-shell.js, sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +var gTestfile = 'stringify-missing-arguments.js'; +//----------------------------------------------------------------------------- +var BUGNUMBER = 648471; +var summary = "JSON.stringify with no arguments"; + +print(BUGNUMBER + ": " + summary); + +/************** + * BEGIN TEST * + **************/ + +assert.sameValue(JSON.stringify(), undefined); + +/******************************************************************************/ + +print("All tests passed!"); diff --git a/test/staging/sm/JSON/stringify-nonarray-noncallable-replacer.js b/test/staging/sm/JSON/stringify-nonarray-noncallable-replacer.js new file mode 100644 index 0000000000..ff1f637b39 --- /dev/null +++ b/test/staging/sm/JSON/stringify-nonarray-noncallable-replacer.js @@ -0,0 +1,48 @@ +/* + * Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/licenses/publicdomain/ + */ + +/*--- +includes: [sm/non262-JSON-shell.js, sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +var gTestfile = 'stringify-nonarray-noncallable-replacer.js'; +//----------------------------------------------------------------------------- +var BUGNUMBER = 653782; +var summary = + "Treat non-array, non-callable replacers as if none had been specified"; + +print(BUGNUMBER + ": " + summary); + +/************** + * BEGIN TEST * + **************/ + +var obj = { p: 2 }; +var str = '{"p":2}'; + +assert.sameValue(JSON.stringify(obj), str); +assert.sameValue(JSON.stringify(obj, ["p"]), str); +assert.sameValue(JSON.stringify(obj, null), str); +assert.sameValue(JSON.stringify(obj, undefined), str); +assert.sameValue(JSON.stringify(obj, 2), str); +assert.sameValue(JSON.stringify(obj, Math.PI), str); +assert.sameValue(JSON.stringify(obj, NaN), str); +assert.sameValue(JSON.stringify(obj, true), str); +assert.sameValue(JSON.stringify(obj, false), str); +assert.sameValue(JSON.stringify(obj, Infinity), str); +assert.sameValue(JSON.stringify(obj, "foopy"), str); +assert.sameValue(JSON.stringify(obj, {}), str); +assert.sameValue(JSON.stringify(obj, /abcd/), str); +assert.sameValue(JSON.stringify(obj, new Boolean(true)), str); +assert.sameValue(JSON.stringify(obj, new Number(42)), str); +assert.sameValue(JSON.stringify(obj, new String("aequorin")), str); + +/******************************************************************************/ + +print("Tests complete"); diff --git a/test/staging/sm/JSON/stringify-primitives.js b/test/staging/sm/JSON/stringify-primitives.js new file mode 100644 index 0000000000..805e0f97e1 --- /dev/null +++ b/test/staging/sm/JSON/stringify-primitives.js @@ -0,0 +1,47 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-JSON-shell.js, sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +// sanity +var x = JSON.stringify({}); +assert.sameValue(x, "{}"); + +// booleans and null +x = JSON.stringify(true); +assert.sameValue(x, "true"); + +x = JSON.stringify(false); +assert.sameValue(x, "false"); + +x = JSON.stringify(new Boolean(false)); +assert.sameValue(x, "false"); + +x = JSON.stringify(null); +assert.sameValue(x, "null"); + +x = JSON.stringify(1234); +assert.sameValue(x, "1234"); + +x = JSON.stringify(new Number(1234)); +assert.sameValue(x, "1234"); + +x = JSON.stringify("asdf"); +assert.sameValue(x, '"asdf"'); + +x = JSON.stringify(new String("asdf")); +assert.sameValue(x, '"asdf"'); + +assert.sameValue(JSON.stringify(undefined), undefined); +assert.sameValue(JSON.stringify(function(){}), undefined); +assert.sameValue(JSON.stringify(JSON.stringify), undefined); + +/******************************************************************************/ + +print("Tests complete"); diff --git a/test/staging/sm/JSON/stringify-replacer-array-boxed-elements.js b/test/staging/sm/JSON/stringify-replacer-array-boxed-elements.js new file mode 100644 index 0000000000..20d8370cf3 --- /dev/null +++ b/test/staging/sm/JSON/stringify-replacer-array-boxed-elements.js @@ -0,0 +1,67 @@ +/* + * Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/licenses/publicdomain/ + */ + +/*--- +includes: [sm/non262-JSON-shell.js, sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +var gTestfile = 'stringify-replacer-array-boxed-elements.js'; +//----------------------------------------------------------------------------- +var BUGNUMBER = 648471; +var summary = "Boxed-string/number objects in replacer arrays"; + +print(BUGNUMBER + ": " + summary); + +/************** + * BEGIN TEST * + **************/ + +var S = new String(3); +var N = new Number(4); + +assert.sameValue(JSON.stringify({ 3: 3, 4: 4 }, [S]), + '{"3":3}'); +assert.sameValue(JSON.stringify({ 3: 3, 4: 4 }, [N]), + '{"4":4}'); + +Number.prototype.toString = function() { return 3; }; +assert.sameValue(JSON.stringify({ 3: 3, 4: 4 }, [N]), + '{"3":3}'); + +String.prototype.toString = function() { return 4; }; +assert.sameValue(JSON.stringify({ 3: 3, 4: 4 }, [S]), + '{"4":4}'); + +Number.prototype.toString = function() { return new String(42); }; +assert.sameValue(JSON.stringify({ 3: 3, 4: 4 }, [N]), + '{"4":4}'); + +String.prototype.toString = function() { return new Number(17); }; +assert.sameValue(JSON.stringify({ 3: 3, 4: 4 }, [S]), + '{"3":3}'); + +Number.prototype.toString = null; +assert.sameValue(JSON.stringify({ 3: 3, 4: 4 }, [N]), + '{"4":4}'); + +String.prototype.toString = null; +assert.sameValue(JSON.stringify({ 3: 3, 4: 4 }, [S]), + '{"3":3}'); + +Number.prototype.valueOf = function() { return 17; }; +assert.sameValue(JSON.stringify({ 4: 4, 17: 17 }, [N]), + '{"17":17}'); + +String.prototype.valueOf = function() { return 42; }; +assert.sameValue(JSON.stringify({ 3: 3, 42: 42 }, [S]), + '{"42":42}'); + +/******************************************************************************/ + +print("Tests complete"); diff --git a/test/staging/sm/JSON/stringify-replacer-array-duplicated-element.js b/test/staging/sm/JSON/stringify-replacer-array-duplicated-element.js new file mode 100644 index 0000000000..3e181de30a --- /dev/null +++ b/test/staging/sm/JSON/stringify-replacer-array-duplicated-element.js @@ -0,0 +1,76 @@ +/* + * Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/licenses/publicdomain/ + */ + +/*--- +includes: [sm/non262-JSON-shell.js, sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +var gTestfile = 'stringify-replacer-array-hijinks.js'; +//----------------------------------------------------------------------------- +var BUGNUMBER = 648471; +var summary = + "Better/more correct handling for replacer arrays with getter array index " + + "properties"; + +print(BUGNUMBER + ": " + summary); + +/************** + * BEGIN TEST * + **************/ + +var bigOdd = Math.pow(2, 50) + 1; + +function two() +{ + return Math.random() < 0.5 ? 2 : "2"; +} + +assert.sameValue(JSON.stringify({ 1: 1 }, [1, 1]), '{"1":1}'); + +assert.sameValue(JSON.stringify({ 1: 1 }, [1, "1"]), '{"1":1}'); + +assert.sameValue(JSON.stringify({ 1: 1 }, [1, bigOdd % two()]), '{"1":1}'); + +assert.sameValue(JSON.stringify({ 1: 1 }, ["1", 1]), '{"1":1}'); + +assert.sameValue(JSON.stringify({ 1: 1 }, ["1", "1"]), '{"1":1}'); + +assert.sameValue(JSON.stringify({ 1: 1 }, ["1", bigOdd % two()]), '{"1":1}'); + +assert.sameValue(JSON.stringify({ 1: 1 }, [bigOdd % two(), 1]), '{"1":1}'); + +assert.sameValue(JSON.stringify({ 1: 1 }, [bigOdd % two(), "1"]), '{"1":1}'); + +assert.sameValue(JSON.stringify({ 1: 1 }, [bigOdd % two(), bigOdd % two()]), '{"1":1}'); + + +assert.sameValue(JSON.stringify({ 1: 1 }, [1, new String(1)]), '{"1":1}'); + +assert.sameValue(JSON.stringify({ 1: 1 }, [1, new Number(1)]), '{"1":1}'); + +assert.sameValue(JSON.stringify({ 1: 1 }, ["1", new Number(1)]), '{"1":1}'); + +assert.sameValue(JSON.stringify({ 1: 1 }, ["1", new String(1)]), '{"1":1}'); + +assert.sameValue(JSON.stringify({ 1: 1 }, [bigOdd % two(), new Number(1)]), '{"1":1}'); + +assert.sameValue(JSON.stringify({ 1: 1 }, [bigOdd % two(), new String(1)]), '{"1":1}'); + + +assert.sameValue(JSON.stringify({ 1: 1 }, [new String(1), new String(1)]), '{"1":1}'); + +assert.sameValue(JSON.stringify({ 1: 1 }, [new String(1), new Number(1)]), '{"1":1}'); + +assert.sameValue(JSON.stringify({ 1: 1 }, [new Number(1), new String(1)]), '{"1":1}'); + +assert.sameValue(JSON.stringify({ 1: 1 }, [new Number(1), new Number(1)]), '{"1":1}'); + +/******************************************************************************/ + +print("Tests complete"); diff --git a/test/staging/sm/JSON/stringify-replacer-array-edgecase-jsid-elements.js b/test/staging/sm/JSON/stringify-replacer-array-edgecase-jsid-elements.js new file mode 100644 index 0000000000..ecab508dac --- /dev/null +++ b/test/staging/sm/JSON/stringify-replacer-array-edgecase-jsid-elements.js @@ -0,0 +1,84 @@ +/* + * Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/licenses/publicdomain/ + */ + +/*--- +includes: [sm/non262-JSON-shell.js, sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +var gTestfile = 'stringify-replacer-array-edgecase-jsid-elements.js'; +//----------------------------------------------------------------------------- +var BUGNUMBER = 648471; +var summary = + "Better/more correct handling for replacer arrays with getter array index " + + "properties"; + +print(BUGNUMBER + ": " + summary); + +/************** + * BEGIN TEST * + **************/ + +/* JSID_INT_MIN/MAX copied from jsapi.h. */ + +var obj = + { + /* [JSID_INT_MIN - 1, JSID_INT_MIN + 1] */ + "-1073741825": -1073741825, + "-1073741824": -1073741824, + "-1073741823": -1073741823, + + "-2.5": -2.5, + "-1": -1, + + 0: 0, + + 1: 1, + 2.5: 2.5, + + /* [JSID_INT_MAX - 1, JSID_INT_MAX + 1] */ + 1073741822: 1073741822, + 1073741823: 1073741823, + 1073741824: 1073741824, + }; + +for (var s in obj) +{ + var n = obj[s]; + assert.sameValue(+s, n); + assert.sameValue(JSON.stringify(obj, [n]), + '{"' + s + '":' + n + '}', + "Failed to stringify numeric property " + n + "correctly"); + assert.sameValue(JSON.stringify(obj, [s]), + '{"' + s + '":' + n + '}', + "Failed to stringify string property " + n + "correctly"); + assert.sameValue(JSON.stringify(obj, [s, ]), + '{"' + s + '":' + n + '}', + "Failed to stringify string then number properties ('" + s + "', " + n + ") correctly"); + assert.sameValue(JSON.stringify(obj, [n, s]), + '{"' + s + '":' + n + '}', + "Failed to stringify number then string properties (" + n + ", '" + s + "') correctly"); +} + +// -0 is tricky, because ToString(-0) === "0", so test it specially. +assert.sameValue(JSON.stringify({ "-0": 17, 0: 42 }, [-0]), + '{"0":42}', + "Failed to stringify numeric property -0 correctly"); +assert.sameValue(JSON.stringify({ "-0": 17, 0: 42 }, ["-0"]), + '{"-0":17}', + "Failed to stringify string property -0 correctly"); +assert.sameValue(JSON.stringify({ "-0": 17, 0: 42 }, ["-0", -0]), + '{"-0":17,"0":42}', + "Failed to stringify string then number properties ('-0', -0) correctly"); +assert.sameValue(JSON.stringify({ "-0": 17, 0: 42 }, [-0, "-0"]), + '{"0":42,"-0":17}', + "Failed to stringify number then string properties (-0, '-0) correctly"); + +/******************************************************************************/ + +print("Tests complete"); diff --git a/test/staging/sm/JSON/stringify-replacer-array-hijinks.js b/test/staging/sm/JSON/stringify-replacer-array-hijinks.js new file mode 100644 index 0000000000..d77a8f9e40 --- /dev/null +++ b/test/staging/sm/JSON/stringify-replacer-array-hijinks.js @@ -0,0 +1,66 @@ +/* + * Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/licenses/publicdomain/ + */ + +/*--- +includes: [sm/non262-JSON-shell.js, sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +var gTestfile = 'stringify-replacer-array-hijinks.js'; +//----------------------------------------------------------------------------- +var BUGNUMBER = 648471; +var summary = + "Better/more correct handling for replacer arrays with getter array index " + + "properties"; + +print(BUGNUMBER + ": " + summary); + +/************** + * BEGIN TEST * + **************/ + +var replacer = [0, 1, 2, 3]; +Object.prototype[3] = 3; +Object.defineProperty(replacer, 1, { + get: function() + { + Object.defineProperty(replacer, 4, { value: 4 }); + delete replacer[2]; + delete replacer[3]; + replacer[5] = 5; + return 1; + } +}); + +var s = + JSON.stringify({0: { 1: { 3: { 4: { 5: { 2: "omitted" } } } } } }, replacer); + +// The replacer array's length is as seen on first query, so property names are +// accumulated for indexes i ∈ {0, 1, 2, 3}, but index 1 deletes 2 and 3, so 2 +// isn't seen but 3 is seen as Object.prototype[3]. +assert.sameValue('{"0":{"1":{"3":{"3":3}},"3":3},"3":3}', s); + + +var replacer = [0, 1, 2, 3]; +Object.defineProperty(replacer, 0, { + get: function() + { + replacer.length = 0; + return {}; + } +}); + +// The replacer.length truncation means only properties on the prototype chain +// shine through, but it doesn't affect the original bounds of the iteration +// used to determine property names which will be included in the final string. +assert.sameValue(JSON.stringify({ 0: 0, 1: 1, 2: 2, 3: 3 }, replacer), + '{"3":3}'); + +/******************************************************************************/ + +print("Tests complete"); diff --git a/test/staging/sm/JSON/stringify-replacer-array-skipped-element.js b/test/staging/sm/JSON/stringify-replacer-array-skipped-element.js new file mode 100644 index 0000000000..61ebe8c7aa --- /dev/null +++ b/test/staging/sm/JSON/stringify-replacer-array-skipped-element.js @@ -0,0 +1,69 @@ +/* + * Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/licenses/publicdomain/ + */ + +/*--- +includes: [sm/non262-JSON-shell.js, sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +var gTestfile = 'stringify-replacer-array-skipped-element.js'; +//----------------------------------------------------------------------------- +var BUGNUMBER = 648471; +var summary = + "Better/more correct handling for replacer arrays with getter array index " + + "properties"; + +print(BUGNUMBER + ": " + summary); + +/************** + * BEGIN TEST * + **************/ + +assert.sameValue(JSON.stringify({ 3: 3, 4: 4 }, + ["3", { toString: function() { return "4" } }]), + '{"3":3}'); + +assert.sameValue(JSON.stringify({ 3: 3, true: 4 }, ["3", true]), + '{"3":3}'); + +assert.sameValue(JSON.stringify({ 3: 3, true: 4 }, ["3", "true", true]), + '{"3":3,"true":4}'); + +assert.sameValue(JSON.stringify({ 3: 3, true: 4 }, ["3", true, "true"]), + '{"3":3,"true":4}'); + +assert.sameValue(JSON.stringify({ 3: 3, false: 4 }, ["3", false]), + '{"3":3}'); + +assert.sameValue(JSON.stringify({ 3: 3, false: 4 }, ["3", "false", false]), + '{"3":3,"false":4}'); + +assert.sameValue(JSON.stringify({ 3: 3, false: 4 }, ["3", false, "false"]), + '{"3":3,"false":4}'); + +assert.sameValue(JSON.stringify({ 3: 3, undefined: 4 }, ["3", undefined]), + '{"3":3}'); + +assert.sameValue(JSON.stringify({ 3: 3, undefined: 4 }, ["3", "undefined", undefined]), + '{"3":3,"undefined":4}'); + +assert.sameValue(JSON.stringify({ 3: 3, undefined: 4 }, ["3", undefined, "undefined"]), + '{"3":3,"undefined":4}'); + +assert.sameValue(JSON.stringify({ 3: 3, null: 4 }, ["3", null]), + '{"3":3}'); + +assert.sameValue(JSON.stringify({ 3: 3, null: 4 }, ["3", "null", null]), + '{"3":3,"null":4}'); + +assert.sameValue(JSON.stringify({ 3: 3, null: 4 }, ["3", null, "null"]), + '{"3":3,"null":4}'); + +/******************************************************************************/ + +print("Tests complete"); diff --git a/test/staging/sm/JSON/stringify-replacer-array-trailing-holes.js b/test/staging/sm/JSON/stringify-replacer-array-trailing-holes.js new file mode 100644 index 0000000000..a37c7f20c2 --- /dev/null +++ b/test/staging/sm/JSON/stringify-replacer-array-trailing-holes.js @@ -0,0 +1,56 @@ +/* + * Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/licenses/publicdomain/ + */ + +/*--- +includes: [sm/non262-JSON-shell.js, sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +var gTestfile = "stringify-replacer-array-trailing-holes.js"; +//----------------------------------------------------------------------------- +var BUGNUMBER = 1217069; +var summary = + "Better/more correct handling for replacer arrays with trailing holes " + + "through which inherited elements might appear"; + +print(BUGNUMBER + ": " + summary); + +/************** + * BEGIN TEST * + **************/ + +var obj = { 0: "hi", 1: "n-nao", 2: "run away!", 3: "bye" }; + +var s; + +var replacer = [0, /* 1 */, /* 2 */, /* 3 */, ]; + +assert.sameValue(JSON.stringify(obj, replacer), + '{"0":"hi"}'); + +var nobj = new Number(0); +nobj.toString = () => { replacer[1] = 1; return 0; }; +replacer[0] = nobj; + +assert.sameValue(JSON.stringify(obj, replacer), + '{"0":"hi","1":"n-nao"}'); + +delete replacer[1]; +replacer[0] = 0; + +Object.prototype[0] = 0; +Object.prototype[1] = 1; +Object.prototype[2] = 2; +Object.prototype[3] = 3; + +assert.sameValue(JSON.stringify(obj, replacer), + '{"0":"hi","1":"n-nao","2":"run away!","3":"bye"}'); + +/******************************************************************************/ + +print("Tests complete"); diff --git a/test/staging/sm/JSON/stringify-replacer-with-array-indexes.js b/test/staging/sm/JSON/stringify-replacer-with-array-indexes.js new file mode 100644 index 0000000000..4eb939a51e --- /dev/null +++ b/test/staging/sm/JSON/stringify-replacer-with-array-indexes.js @@ -0,0 +1,63 @@ +/* + * Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/licenses/publicdomain/ + */ + +/*--- +includes: [sm/non262-JSON-shell.js, sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +var gTestfile = 'stringify-replacer-with-array-indexes.js'; +//----------------------------------------------------------------------------- +var BUGNUMBER = 584909; +var summary = + "Call the replacer function for array elements with stringified indexes"; + +print(BUGNUMBER + ": " + summary); + +/************** + * BEGIN TEST * + **************/ + +var arr = [0, 1, 2, 3, 4]; + +var seenTopmost = false; +var index = 0; +function replacer() +{ + assert.sameValue(arguments.length, 2); + + var key = arguments[0], value = arguments[1]; + + // Topmost array: ignore replacer call. + if (key === "") + { + assert.sameValue(seenTopmost, false); + seenTopmost = true; + return value; + } + + assert.sameValue(seenTopmost, true); + + assert.sameValue(typeof key, "string"); + assert.sameValue(key === index, false); + assert.sameValue(key === index + "", true); + + assert.sameValue(value, index); + + index++; + + assert.sameValue(this, arr); + + return value; +} + +assert.sameValue(JSON.stringify(arr, replacer), '[0,1,2,3,4]'); + +/******************************************************************************/ + +print("Tests complete"); diff --git a/test/staging/sm/JSON/stringify-replacer.js b/test/staging/sm/JSON/stringify-replacer.js new file mode 100644 index 0000000000..80ad14610a --- /dev/null +++ b/test/staging/sm/JSON/stringify-replacer.js @@ -0,0 +1,163 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-JSON-shell.js, sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +/** + * These return* functions are used by the + * replacer tests taken from bug 512447 + */ +function returnObjectFor1(k, v) +{ + if (k == "1") + return {}; + return v; +} +function returnArrayFor1(k, v) +{ + if (k == "1") + return []; + return v; +} +function returnNullFor1(k, v) +{ + if (k == "1") + return null; + return v; +} +function returnStringForUndefined(k, v) +{ + if (v === undefined) + return "undefined value"; + return v; +} +var cycleObject = {}; cycleObject.cycle = cycleObject; +function returnCycleObjectFor1(k, v) +{ + if (k == "1") + return cycleObject; + return v; +} +var array = [0, 1, 2]; array[3] = array; +function returnCycleArrayFor1(k, v) +{ + if (k == "1") + return array; + return v; +} + +// BEGIN TEST +var x; + +x = JSON.stringify({ key: 2 }, + function(k,v) { return k ? undefined : v; }); +assert.sameValue(x, "{}"); + +x = JSON.stringify(["hmm", "hmm"], + function(k,v) { return k !== "" ? undefined : v; }); +assert.sameValue(x, "[null,null]"); + +var foo = ["hmm"]; +function censor(k, v) +{ + if (v !== foo) + return "XXX"; + return v; +} +x = JSON.stringify(foo, censor); +assert.sameValue(x, '["XXX"]'); + +foo = ["bar", ["baz"], "qux"]; +x = JSON.stringify(foo, censor); +assert.sameValue(x, '["XXX","XXX","XXX"]'); + +function censor2(k, v) +{ + if (typeof(v) == "string") + return "XXX"; + return v; +} + +foo = ["bar", ["baz"], "qux"]; +x = JSON.stringify(foo, censor2); +assert.sameValue(x, '["XXX",["XXX"],"XXX"]'); + +foo = { bar: 42, qux: 42, quux: 42 }; +x = JSON.stringify(foo, ["bar"]); +assert.sameValue(x, '{"bar":42}'); + +foo = {bar: {bar: 42, schmoo:[]}, qux: 42, quux: 42}; +x = JSON.stringify(foo, ["bar", "schmoo"]); +assert.sameValue(x, '{"bar":{"bar":42,"schmoo":[]}}'); + +x = JSON.stringify(foo, null, ""); +assert.sameValue(x, '{"bar":{"bar":42,"schmoo":[]},"qux":42,"quux":42}'); + +x = JSON.stringify(foo, null, " "); +assert.sameValue(x, '{\n "bar": {\n "bar": 42,\n "schmoo": []\n },\n "qux": 42,\n "quux": 42\n}'); + +foo = {bar:{bar:{}}} +x = JSON.stringify(foo, null, " "); +assert.sameValue(x, '{\n "bar": {\n "bar": {}\n }\n}'); + +x = JSON.stringify({ x: 1, arr: [1] }, + function (k,v) { return typeof v === 'number' ? 3 : v; }); +assert.sameValue(x, '{"x":3,"arr":[3]}'); + +foo = ['e']; +x = JSON.stringify(foo, null, '\t'); +assert.sameValue(x, '[\n\t"e"\n]'); + +foo = {0:0, 1:1, 2:2, 3:undefined}; +x = JSON.stringify(foo, returnObjectFor1); +assert.sameValue(x, '{"0":0,"1":{},"2":2}'); + +x = JSON.stringify(foo, returnArrayFor1); +assert.sameValue(x, '{"0":0,"1":[],"2":2}'); + +x = JSON.stringify(foo, returnNullFor1); +assert.sameValue(x, '{"0":0,"1":null,"2":2}'); + +x = JSON.stringify(foo, returnStringForUndefined); +assert.sameValue(x, '{"0":0,"1":1,"2":2,"3":"undefined value"}'); + +try +{ + JSON.stringify(foo, returnCycleObjectFor1); + throw new Error("no error thrown"); +} +catch (e) +{ + assert.sameValue(e instanceof TypeError, true, "no TypeError thrown: " + e); +} + +try +{ + JSON.stringify(foo, returnCycleArrayFor1); + throw new Error("no error thrown"); +} +catch (e) +{ + assert.sameValue(e instanceof TypeError, true, "no TypeError thrown: " + e); +} + +foo = [0, 1, 2, undefined]; +try +{ + JSON.stringify(foo, returnCycleObjectFor1); + throw new Error("no error thrown"); +} +catch (e) +{ + assert.sameValue(e instanceof TypeError, true, "no TypeError thrown: " + e); +} + +/******************************************************************************/ + +print("Tests complete"); diff --git a/test/staging/sm/JSON/stringify-special-escapes.js b/test/staging/sm/JSON/stringify-special-escapes.js new file mode 100644 index 0000000000..4f4c091c2d --- /dev/null +++ b/test/staging/sm/JSON/stringify-special-escapes.js @@ -0,0 +1,284 @@ +/* + * Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/licenses/publicdomain/ + */ + +/*--- +includes: [sm/non262-JSON-shell.js, sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +var gTestfile = 'stringify-special-escapes.js'; +//----------------------------------------------------------------------------- +var BUGNUMBER = 512266; +var summary = + "JSON.stringify of \\b\\f\\n\\r\\t should use one-character escapes, not hex"; + +print(BUGNUMBER + ": " + summary); + +/************** + * BEGIN TEST * + **************/ + +assert.sameValue(JSON.stringify("\u0000"), '"\\u0000"'); +assert.sameValue(JSON.stringify("\u0001"), '"\\u0001"'); +assert.sameValue(JSON.stringify("\u0002"), '"\\u0002"'); +assert.sameValue(JSON.stringify("\u0003"), '"\\u0003"'); +assert.sameValue(JSON.stringify("\u0004"), '"\\u0004"'); +assert.sameValue(JSON.stringify("\u0005"), '"\\u0005"'); +assert.sameValue(JSON.stringify("\u0006"), '"\\u0006"'); +assert.sameValue(JSON.stringify("\u0007"), '"\\u0007"'); +assert.sameValue(JSON.stringify("\u0008"), '"\\b"'); +assert.sameValue(JSON.stringify("\u0009"), '"\\t"'); +assert.sameValue(JSON.stringify("\u000A"), '"\\n"'); +assert.sameValue(JSON.stringify("\u000B"), '"\\u000b"'); +assert.sameValue(JSON.stringify("\u000C"), '"\\f"'); +assert.sameValue(JSON.stringify("\u000D"), '"\\r"'); +assert.sameValue(JSON.stringify("\u000E"), '"\\u000e"'); +assert.sameValue(JSON.stringify("\u000F"), '"\\u000f"'); +assert.sameValue(JSON.stringify("\u0010"), '"\\u0010"'); +assert.sameValue(JSON.stringify("\u0011"), '"\\u0011"'); +assert.sameValue(JSON.stringify("\u0012"), '"\\u0012"'); +assert.sameValue(JSON.stringify("\u0013"), '"\\u0013"'); +assert.sameValue(JSON.stringify("\u0014"), '"\\u0014"'); +assert.sameValue(JSON.stringify("\u0015"), '"\\u0015"'); +assert.sameValue(JSON.stringify("\u0016"), '"\\u0016"'); +assert.sameValue(JSON.stringify("\u0017"), '"\\u0017"'); +assert.sameValue(JSON.stringify("\u0018"), '"\\u0018"'); +assert.sameValue(JSON.stringify("\u0019"), '"\\u0019"'); +assert.sameValue(JSON.stringify("\u001A"), '"\\u001a"'); +assert.sameValue(JSON.stringify("\u001B"), '"\\u001b"'); +assert.sameValue(JSON.stringify("\u001C"), '"\\u001c"'); +assert.sameValue(JSON.stringify("\u001D"), '"\\u001d"'); +assert.sameValue(JSON.stringify("\u001E"), '"\\u001e"'); +assert.sameValue(JSON.stringify("\u001F"), '"\\u001f"'); +assert.sameValue(JSON.stringify("\u0020"), '" "'); + +assert.sameValue(JSON.stringify("\\u0000"), '"\\\\u0000"'); +assert.sameValue(JSON.stringify("\\u0001"), '"\\\\u0001"'); +assert.sameValue(JSON.stringify("\\u0002"), '"\\\\u0002"'); +assert.sameValue(JSON.stringify("\\u0003"), '"\\\\u0003"'); +assert.sameValue(JSON.stringify("\\u0004"), '"\\\\u0004"'); +assert.sameValue(JSON.stringify("\\u0005"), '"\\\\u0005"'); +assert.sameValue(JSON.stringify("\\u0006"), '"\\\\u0006"'); +assert.sameValue(JSON.stringify("\\u0007"), '"\\\\u0007"'); +assert.sameValue(JSON.stringify("\\u0008"), '"\\\\u0008"'); +assert.sameValue(JSON.stringify("\\u0009"), '"\\\\u0009"'); +assert.sameValue(JSON.stringify("\\u000A"), '"\\\\u000A"'); +assert.sameValue(JSON.stringify("\\u000B"), '"\\\\u000B"'); +assert.sameValue(JSON.stringify("\\u000C"), '"\\\\u000C"'); +assert.sameValue(JSON.stringify("\\u000D"), '"\\\\u000D"'); +assert.sameValue(JSON.stringify("\\u000E"), '"\\\\u000E"'); +assert.sameValue(JSON.stringify("\\u000F"), '"\\\\u000F"'); +assert.sameValue(JSON.stringify("\\u0010"), '"\\\\u0010"'); +assert.sameValue(JSON.stringify("\\u0011"), '"\\\\u0011"'); +assert.sameValue(JSON.stringify("\\u0012"), '"\\\\u0012"'); +assert.sameValue(JSON.stringify("\\u0013"), '"\\\\u0013"'); +assert.sameValue(JSON.stringify("\\u0014"), '"\\\\u0014"'); +assert.sameValue(JSON.stringify("\\u0015"), '"\\\\u0015"'); +assert.sameValue(JSON.stringify("\\u0016"), '"\\\\u0016"'); +assert.sameValue(JSON.stringify("\\u0017"), '"\\\\u0017"'); +assert.sameValue(JSON.stringify("\\u0018"), '"\\\\u0018"'); +assert.sameValue(JSON.stringify("\\u0019"), '"\\\\u0019"'); +assert.sameValue(JSON.stringify("\\u001A"), '"\\\\u001A"'); +assert.sameValue(JSON.stringify("\\u001B"), '"\\\\u001B"'); +assert.sameValue(JSON.stringify("\\u001C"), '"\\\\u001C"'); +assert.sameValue(JSON.stringify("\\u001D"), '"\\\\u001D"'); +assert.sameValue(JSON.stringify("\\u001E"), '"\\\\u001E"'); +assert.sameValue(JSON.stringify("\\u001F"), '"\\\\u001F"'); +assert.sameValue(JSON.stringify("\\u0020"), '"\\\\u0020"'); + + +assert.sameValue(JSON.stringify("a\u0000"), '"a\\u0000"'); +assert.sameValue(JSON.stringify("a\u0001"), '"a\\u0001"'); +assert.sameValue(JSON.stringify("a\u0002"), '"a\\u0002"'); +assert.sameValue(JSON.stringify("a\u0003"), '"a\\u0003"'); +assert.sameValue(JSON.stringify("a\u0004"), '"a\\u0004"'); +assert.sameValue(JSON.stringify("a\u0005"), '"a\\u0005"'); +assert.sameValue(JSON.stringify("a\u0006"), '"a\\u0006"'); +assert.sameValue(JSON.stringify("a\u0007"), '"a\\u0007"'); +assert.sameValue(JSON.stringify("a\u0008"), '"a\\b"'); +assert.sameValue(JSON.stringify("a\u0009"), '"a\\t"'); +assert.sameValue(JSON.stringify("a\u000A"), '"a\\n"'); +assert.sameValue(JSON.stringify("a\u000B"), '"a\\u000b"'); +assert.sameValue(JSON.stringify("a\u000C"), '"a\\f"'); +assert.sameValue(JSON.stringify("a\u000D"), '"a\\r"'); +assert.sameValue(JSON.stringify("a\u000E"), '"a\\u000e"'); +assert.sameValue(JSON.stringify("a\u000F"), '"a\\u000f"'); +assert.sameValue(JSON.stringify("a\u0010"), '"a\\u0010"'); +assert.sameValue(JSON.stringify("a\u0011"), '"a\\u0011"'); +assert.sameValue(JSON.stringify("a\u0012"), '"a\\u0012"'); +assert.sameValue(JSON.stringify("a\u0013"), '"a\\u0013"'); +assert.sameValue(JSON.stringify("a\u0014"), '"a\\u0014"'); +assert.sameValue(JSON.stringify("a\u0015"), '"a\\u0015"'); +assert.sameValue(JSON.stringify("a\u0016"), '"a\\u0016"'); +assert.sameValue(JSON.stringify("a\u0017"), '"a\\u0017"'); +assert.sameValue(JSON.stringify("a\u0018"), '"a\\u0018"'); +assert.sameValue(JSON.stringify("a\u0019"), '"a\\u0019"'); +assert.sameValue(JSON.stringify("a\u001A"), '"a\\u001a"'); +assert.sameValue(JSON.stringify("a\u001B"), '"a\\u001b"'); +assert.sameValue(JSON.stringify("a\u001C"), '"a\\u001c"'); +assert.sameValue(JSON.stringify("a\u001D"), '"a\\u001d"'); +assert.sameValue(JSON.stringify("a\u001E"), '"a\\u001e"'); +assert.sameValue(JSON.stringify("a\u001F"), '"a\\u001f"'); +assert.sameValue(JSON.stringify("a\u0020"), '"a "'); + +assert.sameValue(JSON.stringify("a\\u0000"), '"a\\\\u0000"'); +assert.sameValue(JSON.stringify("a\\u0001"), '"a\\\\u0001"'); +assert.sameValue(JSON.stringify("a\\u0002"), '"a\\\\u0002"'); +assert.sameValue(JSON.stringify("a\\u0003"), '"a\\\\u0003"'); +assert.sameValue(JSON.stringify("a\\u0004"), '"a\\\\u0004"'); +assert.sameValue(JSON.stringify("a\\u0005"), '"a\\\\u0005"'); +assert.sameValue(JSON.stringify("a\\u0006"), '"a\\\\u0006"'); +assert.sameValue(JSON.stringify("a\\u0007"), '"a\\\\u0007"'); +assert.sameValue(JSON.stringify("a\\u0008"), '"a\\\\u0008"'); +assert.sameValue(JSON.stringify("a\\u0009"), '"a\\\\u0009"'); +assert.sameValue(JSON.stringify("a\\u000A"), '"a\\\\u000A"'); +assert.sameValue(JSON.stringify("a\\u000B"), '"a\\\\u000B"'); +assert.sameValue(JSON.stringify("a\\u000C"), '"a\\\\u000C"'); +assert.sameValue(JSON.stringify("a\\u000D"), '"a\\\\u000D"'); +assert.sameValue(JSON.stringify("a\\u000E"), '"a\\\\u000E"'); +assert.sameValue(JSON.stringify("a\\u000F"), '"a\\\\u000F"'); +assert.sameValue(JSON.stringify("a\\u0010"), '"a\\\\u0010"'); +assert.sameValue(JSON.stringify("a\\u0011"), '"a\\\\u0011"'); +assert.sameValue(JSON.stringify("a\\u0012"), '"a\\\\u0012"'); +assert.sameValue(JSON.stringify("a\\u0013"), '"a\\\\u0013"'); +assert.sameValue(JSON.stringify("a\\u0014"), '"a\\\\u0014"'); +assert.sameValue(JSON.stringify("a\\u0015"), '"a\\\\u0015"'); +assert.sameValue(JSON.stringify("a\\u0016"), '"a\\\\u0016"'); +assert.sameValue(JSON.stringify("a\\u0017"), '"a\\\\u0017"'); +assert.sameValue(JSON.stringify("a\\u0018"), '"a\\\\u0018"'); +assert.sameValue(JSON.stringify("a\\u0019"), '"a\\\\u0019"'); +assert.sameValue(JSON.stringify("a\\u001A"), '"a\\\\u001A"'); +assert.sameValue(JSON.stringify("a\\u001B"), '"a\\\\u001B"'); +assert.sameValue(JSON.stringify("a\\u001C"), '"a\\\\u001C"'); +assert.sameValue(JSON.stringify("a\\u001D"), '"a\\\\u001D"'); +assert.sameValue(JSON.stringify("a\\u001E"), '"a\\\\u001E"'); +assert.sameValue(JSON.stringify("a\\u001F"), '"a\\\\u001F"'); +assert.sameValue(JSON.stringify("a\\u0020"), '"a\\\\u0020"'); + + +assert.sameValue(JSON.stringify("\u0000Q"), '"\\u0000Q"'); +assert.sameValue(JSON.stringify("\u0001Q"), '"\\u0001Q"'); +assert.sameValue(JSON.stringify("\u0002Q"), '"\\u0002Q"'); +assert.sameValue(JSON.stringify("\u0003Q"), '"\\u0003Q"'); +assert.sameValue(JSON.stringify("\u0004Q"), '"\\u0004Q"'); +assert.sameValue(JSON.stringify("\u0005Q"), '"\\u0005Q"'); +assert.sameValue(JSON.stringify("\u0006Q"), '"\\u0006Q"'); +assert.sameValue(JSON.stringify("\u0007Q"), '"\\u0007Q"'); +assert.sameValue(JSON.stringify("\u0008Q"), '"\\bQ"'); +assert.sameValue(JSON.stringify("\u0009Q"), '"\\tQ"'); +assert.sameValue(JSON.stringify("\u000AQ"), '"\\nQ"'); +assert.sameValue(JSON.stringify("\u000BQ"), '"\\u000bQ"'); +assert.sameValue(JSON.stringify("\u000CQ"), '"\\fQ"'); +assert.sameValue(JSON.stringify("\u000DQ"), '"\\rQ"'); +assert.sameValue(JSON.stringify("\u000EQ"), '"\\u000eQ"'); +assert.sameValue(JSON.stringify("\u000FQ"), '"\\u000fQ"'); +assert.sameValue(JSON.stringify("\u0010Q"), '"\\u0010Q"'); +assert.sameValue(JSON.stringify("\u0011Q"), '"\\u0011Q"'); +assert.sameValue(JSON.stringify("\u0012Q"), '"\\u0012Q"'); +assert.sameValue(JSON.stringify("\u0013Q"), '"\\u0013Q"'); +assert.sameValue(JSON.stringify("\u0014Q"), '"\\u0014Q"'); +assert.sameValue(JSON.stringify("\u0015Q"), '"\\u0015Q"'); +assert.sameValue(JSON.stringify("\u0016Q"), '"\\u0016Q"'); +assert.sameValue(JSON.stringify("\u0017Q"), '"\\u0017Q"'); +assert.sameValue(JSON.stringify("\u0018Q"), '"\\u0018Q"'); +assert.sameValue(JSON.stringify("\u0019Q"), '"\\u0019Q"'); +assert.sameValue(JSON.stringify("\u001AQ"), '"\\u001aQ"'); +assert.sameValue(JSON.stringify("\u001BQ"), '"\\u001bQ"'); +assert.sameValue(JSON.stringify("\u001CQ"), '"\\u001cQ"'); +assert.sameValue(JSON.stringify("\u001DQ"), '"\\u001dQ"'); +assert.sameValue(JSON.stringify("\u001EQ"), '"\\u001eQ"'); +assert.sameValue(JSON.stringify("\u001FQ"), '"\\u001fQ"'); +assert.sameValue(JSON.stringify("\u0020Q"), '" Q"'); + +assert.sameValue(JSON.stringify("\\u0000Q"), '"\\\\u0000Q"'); +assert.sameValue(JSON.stringify("\\u0001Q"), '"\\\\u0001Q"'); +assert.sameValue(JSON.stringify("\\u0002Q"), '"\\\\u0002Q"'); +assert.sameValue(JSON.stringify("\\u0003Q"), '"\\\\u0003Q"'); +assert.sameValue(JSON.stringify("\\u0004Q"), '"\\\\u0004Q"'); +assert.sameValue(JSON.stringify("\\u0005Q"), '"\\\\u0005Q"'); +assert.sameValue(JSON.stringify("\\u0006Q"), '"\\\\u0006Q"'); +assert.sameValue(JSON.stringify("\\u0007Q"), '"\\\\u0007Q"'); +assert.sameValue(JSON.stringify("\\u0008Q"), '"\\\\u0008Q"'); +assert.sameValue(JSON.stringify("\\u0009Q"), '"\\\\u0009Q"'); +assert.sameValue(JSON.stringify("\\u000AQ"), '"\\\\u000AQ"'); +assert.sameValue(JSON.stringify("\\u000BQ"), '"\\\\u000BQ"'); +assert.sameValue(JSON.stringify("\\u000CQ"), '"\\\\u000CQ"'); +assert.sameValue(JSON.stringify("\\u000DQ"), '"\\\\u000DQ"'); +assert.sameValue(JSON.stringify("\\u000EQ"), '"\\\\u000EQ"'); +assert.sameValue(JSON.stringify("\\u000FQ"), '"\\\\u000FQ"'); +assert.sameValue(JSON.stringify("\\u0010Q"), '"\\\\u0010Q"'); +assert.sameValue(JSON.stringify("\\u0011Q"), '"\\\\u0011Q"'); +assert.sameValue(JSON.stringify("\\u0012Q"), '"\\\\u0012Q"'); +assert.sameValue(JSON.stringify("\\u0013Q"), '"\\\\u0013Q"'); +assert.sameValue(JSON.stringify("\\u0014Q"), '"\\\\u0014Q"'); +assert.sameValue(JSON.stringify("\\u0015Q"), '"\\\\u0015Q"'); +assert.sameValue(JSON.stringify("\\u0016Q"), '"\\\\u0016Q"'); +assert.sameValue(JSON.stringify("\\u0017Q"), '"\\\\u0017Q"'); +assert.sameValue(JSON.stringify("\\u0018Q"), '"\\\\u0018Q"'); +assert.sameValue(JSON.stringify("\\u0019Q"), '"\\\\u0019Q"'); +assert.sameValue(JSON.stringify("\\u001AQ"), '"\\\\u001AQ"'); +assert.sameValue(JSON.stringify("\\u001BQ"), '"\\\\u001BQ"'); +assert.sameValue(JSON.stringify("\\u001CQ"), '"\\\\u001CQ"'); +assert.sameValue(JSON.stringify("\\u001DQ"), '"\\\\u001DQ"'); +assert.sameValue(JSON.stringify("\\u001EQ"), '"\\\\u001EQ"'); +assert.sameValue(JSON.stringify("\\u001FQ"), '"\\\\u001FQ"'); +assert.sameValue(JSON.stringify("\\u0020Q"), '"\\\\u0020Q"'); + +// https://tc39.github.io/proposal-well-formed-stringify/ + +assert.sameValue(JSON.stringify("\ud7ff"), '"\ud7ff"'); +assert.sameValue(JSON.stringify("\ud800"), '"\\ud800"'); +assert.sameValue(JSON.stringify("\ud937"), '"\\ud937"'); +assert.sameValue(JSON.stringify("\uda20"), '"\\uda20"'); +assert.sameValue(JSON.stringify("\udbff"), '"\\udbff"'); + +assert.sameValue(JSON.stringify("\udc00"), '"\\udc00"'); +assert.sameValue(JSON.stringify("\udddd"), '"\\udddd"'); +assert.sameValue(JSON.stringify("\udeaf"), '"\\udeaf"'); +assert.sameValue(JSON.stringify("\udfff"), '"\\udfff"'); +assert.sameValue(JSON.stringify("\ue000"), '"\ue000"'); + +assert.sameValue(JSON.stringify("\ud7ffa"), '"\ud7ffa"'); +assert.sameValue(JSON.stringify("\ud800a"), '"\\ud800a"'); +assert.sameValue(JSON.stringify("\ud937a"), '"\\ud937a"'); +assert.sameValue(JSON.stringify("\uda20a"), '"\\uda20a"'); +assert.sameValue(JSON.stringify("\udbffa"), '"\\udbffa"'); + +assert.sameValue(JSON.stringify("\udc00a"), '"\\udc00a"'); +assert.sameValue(JSON.stringify("\udddda"), '"\\udddda"'); +assert.sameValue(JSON.stringify("\udeafa"), '"\\udeafa"'); +assert.sameValue(JSON.stringify("\udfffa"), '"\\udfffa"'); +assert.sameValue(JSON.stringify("\ue000a"), '"\ue000a"'); + +assert.sameValue(JSON.stringify("\ud7ff\ud800"), '"\ud7ff\\ud800"'); +assert.sameValue(JSON.stringify("\ud800\ud800"), '"\\ud800\\ud800"'); +assert.sameValue(JSON.stringify("\ud937\ud800"), '"\\ud937\\ud800"'); +assert.sameValue(JSON.stringify("\uda20\ud800"), '"\\uda20\\ud800"'); +assert.sameValue(JSON.stringify("\udbff\ud800"), '"\\udbff\\ud800"'); + +assert.sameValue(JSON.stringify("\udc00\ud800"), '"\\udc00\\ud800"'); +assert.sameValue(JSON.stringify("\udddd\ud800"), '"\\udddd\\ud800"'); +assert.sameValue(JSON.stringify("\udeaf\ud800"), '"\\udeaf\\ud800"'); +assert.sameValue(JSON.stringify("\udfff\ud800"), '"\\udfff\\ud800"'); +assert.sameValue(JSON.stringify("\ue000\ud800"), '"\ue000\\ud800"'); + +assert.sameValue(JSON.stringify("\ud7ff\udc00"), '"\ud7ff\\udc00"'); +assert.sameValue(JSON.stringify("\ud800\udc00"), '"\ud800\udc00"'); +assert.sameValue(JSON.stringify("\ud937\udc00"), '"\ud937\udc00"'); +assert.sameValue(JSON.stringify("\uda20\udc00"), '"\uda20\udc00"'); +assert.sameValue(JSON.stringify("\udbff\udc00"), '"\udbff\udc00"'); + +assert.sameValue(JSON.stringify("\udc00\udc00"), '"\\udc00\\udc00"'); +assert.sameValue(JSON.stringify("\udddd\udc00"), '"\\udddd\\udc00"'); +assert.sameValue(JSON.stringify("\udeaf\udc00"), '"\\udeaf\\udc00"'); +assert.sameValue(JSON.stringify("\udfff\udc00"), '"\\udfff\\udc00"'); +assert.sameValue(JSON.stringify("\ue000\udc00"), '"\ue000\\udc00"'); + +/******************************************************************************/ + +print("Tests complete"); diff --git a/test/staging/sm/JSON/stringify-toJSON-arguments.js b/test/staging/sm/JSON/stringify-toJSON-arguments.js new file mode 100644 index 0000000000..80d5c7c098 --- /dev/null +++ b/test/staging/sm/JSON/stringify-toJSON-arguments.js @@ -0,0 +1,41 @@ +/* + * Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/licenses/publicdomain/ + */ + +/*--- +includes: [sm/non262-JSON-shell.js, sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +var gTestfile = 'stringify-toJSON-arguments.js'; +//----------------------------------------------------------------------------- +var BUGNUMBER = 584909; +var summary = "Arguments when an object's toJSON method is called"; + +print(BUGNUMBER + ": " + summary); + +/************** + * BEGIN TEST * + **************/ + +var obj = + { + p: { + toJSON: function(key) + { + assert.sameValue(arguments.length, 1); + assert.sameValue(key, "p"); + return 17; + } + } + }; + +assert.sameValue(JSON.stringify(obj), '{"p":17}'); + +/******************************************************************************/ + +print("Tests complete"); diff --git a/test/staging/sm/JSON/stringify.js b/test/staging/sm/JSON/stringify.js new file mode 100644 index 0000000000..1e4efaf41f --- /dev/null +++ b/test/staging/sm/JSON/stringify.js @@ -0,0 +1,95 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-JSON-shell.js, sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +function assertStringify(v, expect) +{ + assert.sameValue(JSON.stringify(v), expect); +} + +assertStringify({}, "{}"); +assertStringify([], "[]"); +assertStringify({"foo":"bar"}, '{"foo":"bar"}'); +assertStringify({"null":null}, '{"null":null}'); +assertStringify({"five":5}, '{"five":5}'); +assertStringify({"five":5, "six":6}, '{"five":5,"six":6}'); +assertStringify({"x":{"y":"z"}}, '{"x":{"y":"z"}}'); +assertStringify({"w":{"x":{"y":"z"}}}, '{"w":{"x":{"y":"z"}}}'); +assertStringify([1,2,3], '[1,2,3]'); +assertStringify({"w":{"x":{"y":[1,2,3]}}}, '{"w":{"x":{"y":[1,2,3]}}}'); +assertStringify({"false":false}, '{"false":false}'); +assertStringify({"true":true}, '{"true":true}'); +assertStringify({"child has two members": {"this":"one", 2:"and this one"}}, + '{"child has two members":{"2":"and this one","this":"one"}}'); +assertStringify({"x":{"a":"b","c":{"y":"z"},"f":"g"}}, + '{"x":{"a":"b","c":{"y":"z"},"f":"g"}}'); +assertStringify({"x":[1,{"y":"z"},3]}, '{"x":[1,{"y":"z"},3]}'); +assertStringify([new String("hmm")], '["hmm"]'); +assertStringify([new Boolean(true)], '[true]'); +assertStringify([new Number(42)], '[42]'); +assertStringify([new Date(Date.UTC(1978, 8, 13, 12, 24, 34, 23))], + '["1978-09-13T12:24:34.023Z"]'); +assertStringify([1,,3], '[1,null,3]'); +assertStringify({"mm\"mm":"hmm"}, '{"mm\\\"mm":"hmm"}'); +assertStringify({"mm\"mm\"mm":"hmm"}, '{"mm\\\"mm\\\"mm":"hmm"}'); +assertStringify({'"':"hmm"}, '{"\\\"":"hmm"}'); +assertStringify({'\\':"hmm"}, '{"\\\\":"hmm"}'); +assertStringify({'mmm\\mmm':"hmm"}, '{"mmm\\\\mmm":"hmm"}'); +assertStringify({'mmm\\mmm\\mmm':"hmm"}, '{"mmm\\\\mmm\\\\mmm":"hmm"}'); +assertStringify({"mm\u000bmm":"hmm"}, '{"mm\\u000bmm":"hmm"}'); +assertStringify({"mm\u0000mm":"hmm"}, '{"mm\\u0000mm":"hmm"}'); +assertStringify({"\u0000\u000b":""}, '{"\\u0000\\u000b":""}'); +assertStringify({"\u000b\ufdfd":"hmm"}, '{"\\u000b\ufdfd":"hmm"}'); +assertStringify({"\u000b\ufdfd":"h\xfc\ufdfdm"}, '{"\\u000b\ufdfd":"h\xfc\ufdfdm"}'); + +var x = {"free":"variable"}; +assertStringify(x, '{"free":"variable"}'); +assertStringify({"y":x}, '{"y":{"free":"variable"}}'); + +// array prop +assertStringify({ a: [1,2,3] }, '{"a":[1,2,3]}'); + +assertStringify({"y": { foo: function(hmm) { return hmm; } } }, '{"y":{}}'); + +// test toJSON +var hmm = { toJSON: function() { return {"foo":"bar"} } }; +assertStringify({"hmm":hmm}, '{"hmm":{"foo":"bar"}}'); +assertStringify(hmm, '{"foo":"bar"}'); // on the root + +// toJSON on prototype +var Y = function() { + this.not = "there?"; + this.d = "e"; +}; +Y.prototype = { + not: "there?", + toJSON: function() { return {"foo":"bar"}} +}; +var y = new Y(); +assertStringify(y.toJSON(), '{"foo":"bar"}'); +assertStringify(y, '{"foo":"bar"}'); + +// return undefined from toJSON +assertStringify({"hmm": { toJSON: function() { return; } } }, '{}'); + +// array with named prop +var x = new Array(); +x[0] = 1; +x.foo = "bar"; +assertStringify(x, '[1]'); + +// prototype +var X = function() { this.a = "b" }; +X.prototype = { c: "d" }; +assertStringify(new X(), '{"a":"b"}'); + +/******************************************************************************/ + +print("Tests complete"); diff --git a/test/staging/sm/JSON/trailing-comma.js b/test/staging/sm/JSON/trailing-comma.js new file mode 100644 index 0000000000..f585cf86a3 --- /dev/null +++ b/test/staging/sm/JSON/trailing-comma.js @@ -0,0 +1,42 @@ +/* + * Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/licenses/publicdomain/ + */ + +/*--- +includes: [sm/non262-JSON-shell.js, sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +var gTestfile = 'trailing-comma.js'; +//----------------------------------------------------------------------------- +var BUGNUMBER = 564621; +var summary = 'JSON.parse should reject {"a" : "b",} or [1,]'; + +print(BUGNUMBER + ": " + summary); + +/************** + * BEGIN TEST * + **************/ + +testJSON('[]', false); +testJSON('[1]', false); +testJSON('["a"]', false); +testJSON('{}', false); +testJSON('{"a":1}', false); +testJSON('{"a":"b"}', false); +testJSON('{"a":true}', false); +testJSON('[{}]', false); + +testJSON('[1,]', true); +testJSON('["a",]', true); +testJSON('{,}', true); +testJSON('{"a":1,}', true); +testJSON('{"a":"b",}', true); +testJSON('{"a":true,}', true); +testJSON('[{,}]', true); +testJSON('[[1,]]', true); +testJSON('[{"a":"b",}]', true); diff --git a/test/staging/sm/Map/NaN-as-key.js b/test/staging/sm/Map/NaN-as-key.js new file mode 100644 index 0000000000..ed1ead2170 --- /dev/null +++ b/test/staging/sm/Map/NaN-as-key.js @@ -0,0 +1,60 @@ +/* + * Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/licenses/publicdomain/ + */ + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +//----------------------------------------------------------------------------- +var BUGNUMBER = 722260; +var summary = 'All NaNs must be treated as identical keys for Map'; + +print(BUGNUMBER + ": " + summary); + +/************** + * BEGIN TEST * + **************/ + +/* Avoid constant-folding that would happen were |undefined| to be used. */ +var key = -/a/g.missingProperty; + +var m = new Map(); +m.set(key, 17); +assert.sameValue(m.get(key), 17); +assert.sameValue(m.get(-key), 17); +assert.sameValue(m.get(NaN), 17); + +m.delete(-key); +assert.sameValue(m.has(key), false); +assert.sameValue(m.has(-key), false); +assert.sameValue(m.has(NaN), false); + +m.set(-key, 17); +assert.sameValue(m.get(key), 17); +assert.sameValue(m.get(-key), 17); +assert.sameValue(m.get(NaN), 17); + +m.delete(NaN); +assert.sameValue(m.has(key), false); +assert.sameValue(m.has(-key), false); +assert.sameValue(m.has(NaN), false); + +m.set(NaN, 17); +assert.sameValue(m.get(key), 17); +assert.sameValue(m.get(-key), 17); +assert.sameValue(m.get(NaN), 17); + +m.delete(key); +assert.sameValue(m.has(key), false); +assert.sameValue(m.has(-key), false); +assert.sameValue(m.has(NaN), false); + +/******************************************************************************/ + +print("Tests complete"); diff --git a/test/staging/sm/Map/constructor-iterator-close.js b/test/staging/sm/Map/constructor-iterator-close.js new file mode 100644 index 0000000000..f78e0f1909 --- /dev/null +++ b/test/staging/sm/Map/constructor-iterator-close.js @@ -0,0 +1,302 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +var BUGNUMBER = 1180306; +var summary = 'Map/Set/WeakMap/WeakSet constructor should close iterator on error'; + +print(BUGNUMBER + ": " + summary); + +function test(ctors, { nextVal=undefined, + nextThrowVal=undefined, + modifier=undefined, + exceptionVal=undefined, + exceptionType=undefined, + closed=true }) { + function getIterable() { + let iterable = { + closed: false, + [Symbol.iterator]() { + let iterator = { + first: true, + next() { + if (this.first) { + this.first = false; + if (nextThrowVal) + throw nextThrowVal; + return nextVal; + } + return { value: undefined, done: true }; + }, + return() { + iterable.closed = true; + return {}; + } + }; + if (modifier) + modifier(iterator, iterable); + + return iterator; + } + }; + return iterable; + } + + for (let ctor of ctors) { + let iterable = getIterable(); + if (exceptionVal) { + let caught = false; + try { + new ctor(iterable); + } catch (e) { + assert.sameValue(e, exceptionVal); + caught = true; + } + assert.sameValue(caught, true); + } else if (exceptionType) { + assertThrowsInstanceOf(() => new ctor(iterable), exceptionType); + } else { + new ctor(iterable); + } + assert.sameValue(iterable.closed, closed); + } +} + +// == Error cases with close == + +// ES 2017 draft 23.1.1.1 Map step 8.d.ii. +// ES 2017 draft 23.3.1.1 WeakMap step 8.d.ii. +test([Map, WeakMap], { + nextVal: { value: "non object", done: false }, + exceptionType: TypeError, + closed: true, +}); + +// ES 2017 draft 23.1.1.1 Map step 8.f. +// ES 2017 draft 23.3.1.1 WeakMap step 8.f. +test([Map, WeakMap], { + nextVal: { value: { get 0() { throw "0 getter throws"; } }, done: false }, + exceptionVal: "0 getter throws", + closed: true, +}); + +// ES 2017 draft 23.1.1.1 Map step 8.h. +// ES 2017 draft 23.3.1.1 WeakMap step 8.h. +test([Map, WeakMap], { + nextVal: { value: { 0: {}, get 1() { throw "1 getter throws"; } }, done: false }, + exceptionVal: "1 getter throws", + closed: true, +}); + +// ES 2017 draft 23.1.1.1 Map step 8.j. +// ES 2017 draft 23.3.1.1 WeakMap step 8.j. +class MyMap extends Map { + set(k, v) { + throw "setter throws"; + } +} +class MyWeakMap extends WeakMap { + set(k, v) { + throw "setter throws"; + } +} +test([MyMap, MyWeakMap], { + nextVal: { value: [{}, {}], done: false }, + exceptionVal: "setter throws", + closed: true, +}); + +// ES 2017 draft 23.2.1.1 Set step 8.e. +// ES 2017 draft 23.4.1.1 WeakSet step 8.e. +class MySet extends Set { + add(v) { + throw "adder throws"; + } +} +class MyWeakSet extends WeakSet { + add(v) { + throw "adder throws"; + } +} +test([MySet, MyWeakSet], { + nextVal: { value: {}, done: false }, + exceptionVal: "adder throws", + closed: true, +}); + +// ES 2021 draft 7.4.6 step 5. +// if GetMethod fails, the thrown value should be ignored. +test([MyMap, MyWeakMap], { + nextVal: { value: [{}, {}], done: false }, + modifier: (iterator, iterable) => { + Object.defineProperty(iterator, "return", { + get: function() { + iterable.closed = true; + throw "return getter throws"; + } + }); + }, + exceptionVal: "setter throws", + closed: true, +}); +test([MySet, MyWeakSet], { + nextVal: { value: [{}, {}], done: false }, + modifier: (iterator, iterable) => { + Object.defineProperty(iterator, "return", { + get: function() { + iterable.closed = true; + throw "return getter throws"; + } + }); + }, + exceptionVal: "adder throws", + closed: true, +}); +test([MyMap, MyWeakMap], { + nextVal: { value: [{}, {}], done: false }, + modifier: (iterator, iterable) => { + Object.defineProperty(iterator, "return", { + get: function() { + iterable.closed = true; + return "non object"; + } + }); + }, + exceptionVal: "setter throws", + closed: true, +}); +test([MySet, MyWeakSet], { + nextVal: { value: [{}, {}], done: false }, + modifier: (iterator, iterable) => { + Object.defineProperty(iterator, "return", { + get: function() { + iterable.closed = true; + return "non object"; + } + }); + }, + exceptionVal: "adder throws", + closed: true, +}); +test([MyMap, MyWeakMap], { + nextVal: { value: [{}, {}], done: false }, + modifier: (iterator, iterable) => { + Object.defineProperty(iterator, "return", { + get: function() { + iterable.closed = true; + // Non callable. + return {}; + } + }); + }, + exceptionVal: "setter throws", + closed: true, +}); +test([MySet, MyWeakSet], { + nextVal: { value: [{}, {}], done: false }, + modifier: (iterator, iterable) => { + Object.defineProperty(iterator, "return", { + get: function() { + iterable.closed = true; + // Non callable. + return {}; + } + }); + }, + exceptionVal: "adder throws", + closed: true, +}); + +// ES 2017 draft 7.4.6 steps 6. +// if return method throws, the thrown value should be ignored. +test([MyMap, MyWeakMap], { + nextVal: { value: [{}, {}], done: false }, + modifier: (iterator, iterable) => { + iterator.return = function() { + iterable.closed = true; + throw "return throws"; + }; + }, + exceptionVal: "setter throws", + closed: true, +}); +test([MySet, MyWeakSet], { + nextVal: { value: [{}, {}], done: false }, + modifier: (iterator, iterable) => { + iterator.return = function() { + iterable.closed = true; + throw "return throws"; + }; + }, + exceptionVal: "adder throws", + closed: true, +}); + +test([MyMap, MyWeakMap], { + nextVal: { value: [{}, {}], done: false }, + modifier: (iterator, iterable) => { + iterator.return = function() { + iterable.closed = true; + return "non object"; + }; + }, + exceptionVal: "setter throws", + closed: true, +}); +test([MySet, MyWeakSet], { + nextVal: { value: [{}, {}], done: false }, + modifier: (iterator, iterable) => { + iterator.return = function() { + iterable.closed = true; + return "non object"; + }; + }, + exceptionVal: "adder throws", + closed: true, +}); + +// == Error cases without close == + +// ES 2017 draft 23.1.1.1 Map step 8.a. +// ES 2017 draft 23.3.1.1 WeakMap step 8.a. +// ES 2017 draft 23.2.1.1 Set step 8.a. +// ES 2017 draft 23.4.1.1 WeakSet step 8.a. +test([Map, WeakMap, Set, WeakSet], { + nextThrowVal: "next throws", + exceptionVal: "next throws", + closed: false, +}); +test([Map, WeakMap, Set, WeakSet], { + nextVal: { value: {}, get done() { throw "done getter throws"; } }, + exceptionVal: "done getter throws", + closed: false, +}); + +// ES 2017 draft 23.1.1.1 Map step 8.c. +// ES 2017 draft 23.3.1.1 WeakMap step 8.c. +// ES 2017 draft 23.2.1.1 Set step 8.c. +// ES 2017 draft 23.4.1.1 WeakSet step 8.c. +test([Map, WeakMap, Set, WeakSet], { + nextVal: { get value() { throw "value getter throws"; }, done: false }, + exceptionVal: "value getter throws", + closed: false, +}); + +// == Successful cases == + +test([Map, WeakMap], { + nextVal: { value: [{}, {}], done: false }, + closed: false, +}); +test([Set, WeakSet], { + nextVal: { value: {}, done: false }, + closed: false, +}); + diff --git a/test/staging/sm/Map/constructor-iterator-primitive.js b/test/staging/sm/Map/constructor-iterator-primitive.js new file mode 100644 index 0000000000..b37fc504e6 --- /dev/null +++ b/test/staging/sm/Map/constructor-iterator-primitive.js @@ -0,0 +1,43 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +var BUGNUMBER = 1021835; +var summary = "Returning non-object from @@iterator should throw"; + +print(BUGNUMBER + ": " + summary); + +let ctors = [ + Map, + Set, + WeakMap, + WeakSet +]; + +let primitives = [ + 1, + true, + undefined, + null, + "foo", + Symbol.iterator +]; + +for (let ctor of ctors) { + for (let primitive of primitives) { + let arg = { + [Symbol.iterator]() { + return primitive; + } + }; + assertThrowsInstanceOf(() => new ctor(arg), TypeError); + } +} + diff --git a/test/staging/sm/Map/forEach-selfhosted-behavior.js b/test/staging/sm/Map/forEach-selfhosted-behavior.js new file mode 100644 index 0000000000..7a9a3ca6de --- /dev/null +++ b/test/staging/sm/Map/forEach-selfhosted-behavior.js @@ -0,0 +1,56 @@ +/* + * Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/licenses/publicdomain/ + */ + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +//----------------------------------------------------------------------------- +var BUGNUMBER = 987243; +var summary = "Don't use .call(...) in the self-hosted Map.prototype.forEach"; + +print(BUGNUMBER + ": " + summary); + +/************** + * BEGIN TEST * + **************/ + +var functionCall = Function.prototype.call; + +function throwSyntaxError() +{ + throw new SyntaxError("Function.prototype.call incorrectly called"); +} + +function lalala() {} + +Function.prototype.call = throwSyntaxError; + +new Map().forEach(throwSyntaxError); +new Map([[1, 2]]).forEach(lalala); +new Map([[1, 2], [3, 4]]).forEach(lalala); + +Function.prototype.call = function() { this.set(42, "fnord"); }; + +new Map().forEach(throwSyntaxError); +new Map([[1, 2]]).forEach(lalala); +new Map([[1, 2], [3, 4]]).forEach(lalala); + +var callCount = 0; +Function.prototype.call = function() { callCount++; }; + +new Map().forEach(throwSyntaxError); +new Map([[1, 2]]).forEach(lalala); +new Map([[1, 2], [3, 4]]).forEach(lalala); + +assert.sameValue(callCount, 0); + +/******************************************************************************/ + +print("Tests complete"); diff --git a/test/staging/sm/Map/getter-name.js b/test/staging/sm/Map/getter-name.js new file mode 100644 index 0000000000..3d2815811d --- /dev/null +++ b/test/staging/sm/Map/getter-name.js @@ -0,0 +1,19 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +var BUGNUMBER = 1180290; +var summary = 'Map getters should have get prefix'; + +print(BUGNUMBER + ": " + summary); + +assert.sameValue(Object.getOwnPropertyDescriptor(Map, Symbol.species).get.name, "get [Symbol.species]"); +assert.sameValue(Object.getOwnPropertyDescriptor(Map.prototype, "size").get.name, "get size"); + diff --git a/test/staging/sm/Map/iterable.js b/test/staging/sm/Map/iterable.js new file mode 100644 index 0000000000..96628a6ebf --- /dev/null +++ b/test/staging/sm/Map/iterable.js @@ -0,0 +1,36 @@ +/* + * Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/licenses/publicdomain/ + */ + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +let length; +let iterable = { + [Symbol.iterator]() { return this; }, + next() { length = arguments.length; return {done: true}; } +}; + +new Map(iterable); +// ensure no arguments are passed to next() during construction (Bug 1197095) +assert.sameValue(length, 0); + +let typeofThis; +Object.defineProperty(Number.prototype, Symbol.iterator, { + value() { + "use strict"; + typeofThis = typeof this; + return { next() { return {done: true}; } }; + } +}); + +new Map(0); +// ensure that iterable objects retain their type (Bug 1197094) +assert.sameValue(typeofThis, "number"); + diff --git a/test/staging/sm/Map/iterator-thisv-error.js b/test/staging/sm/Map/iterator-thisv-error.js new file mode 100644 index 0000000000..a25d1aaa7e --- /dev/null +++ b/test/staging/sm/Map/iterator-thisv-error.js @@ -0,0 +1,28 @@ +/* + * Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/licenses/publicdomain/ + */ + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +function test(fn, thisv) { + assertThrowsInstanceOfWithMessageCheck( + () => fn.call(thisv), + TypeError, + message => + /^\w+ method called on incompatible.+/.test(message) && !message.includes("std_")); +} + +for (var thisv of [null, undefined, false, true, 0, ""]) { + test(Map.prototype.values, thisv); + test(Map.prototype.keys, thisv); + test(Map.prototype.entries, thisv); + test(Map.prototype[Symbol.iterator], thisv); +} + diff --git a/test/staging/sm/Map/record-tuple.js b/test/staging/sm/Map/record-tuple.js new file mode 100644 index 0000000000..eabfacaaac --- /dev/null +++ b/test/staging/sm/Map/record-tuple.js @@ -0,0 +1,53 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +features: +- record-tuple +description: | + pending +esid: pending +---*/ + +function test(input, query, same) { + assert.sameValue(set(input).has(query), same); + assert.sameValue(new Map([[input, 1]]).has(query), same); + if (same) assert.sameValue(new Map([[input, 1]]).get(query), 1); +} +function first(it) { + for (const v of it) return v; +} +function set(v) { + return new Set([v]); +} + + +test(#[0, 1], #[0, 1], true); +test(#[0, 1], #[1, 0], false); + +test(#{x: 1}, #{x: 1}, true); +test(#{x: 1}, #{y: 1}, false); +test(#{x: 1}, #{x: 0}, false); +test(#{x: 0, y: 1}, #{x: 0, y: 1}, true); +test(#{x: 0, y: 1}, #{y: 1, x: 0}, true); +test(#{x: 0, y: 1}, #{x: 1, y: 0}, false); +test(#{x: 0, y: 1}, #{x: 0, y: 0}, false); + +test(#[NaN], #[NaN], true); +test(#{x: NaN}, #{x: NaN}, true); +test(#[+0], #[-0], true); +test(#{x: +0}, #{x: -0}, true); +assert.sameValue(Object.is(first(set(#[+0]))[0], +0), true); +assert.sameValue(Object.is(first(set(#[-0]))[0], -0), true); +assert.sameValue(Object.is(first(set(#{x: +0})).x, +0), true); +assert.sameValue(Object.is(first(set(#{x: -0})).x, -0), true); + +// Test ropes. +test(#["ab" + String.fromCodePoint(67)], #["ab" + String.fromCodePoint(67)], true); +test(#{ x: "ab" + String.fromCodePoint(67) }, #{ x: "ab" + String.fromCodePoint(67) }, true); +test(#["ab" + String.fromCodePoint(67)], #["ab" + String.fromCodePoint(68)], false); +test(#{ x: "ab" + String.fromCodePoint(67) }, #{ x: "ab" + String.fromCodePoint(68) }, false); + diff --git a/test/staging/sm/Map/symbols.js b/test/staging/sm/Map/symbols.js new file mode 100644 index 0000000000..3c2eae5932 --- /dev/null +++ b/test/staging/sm/Map/symbols.js @@ -0,0 +1,41 @@ +/* + * Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/licenses/publicdomain/ + */ + +/*--- +includes: [deepEqual.js, sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +var m = new Map; + +// Symbols can be Map keys. +var sym = Symbol(); +m.set(sym, "zero"); +assert.sameValue(m.has(sym), true); +assert.sameValue(m.get(sym), "zero"); +assert.sameValue(m.has(Symbol()), false); +assert.sameValue(m.get(Symbol()), undefined); +assert.sameValue([...m][0][0], sym); +m.set(sym, "replaced"); +assert.sameValue(m.get(sym), "replaced"); +m.delete(sym); +assert.sameValue(m.has(sym), false); +assert.sameValue(m.size, 0); + +// Symbols returned by Symbol.for() can be Map keys. +for (var word of "that that is is that that is not is not is that not it".split(' ')) { + sym = Symbol.for(word); + m.set(sym, (m.get(sym) || 0) + 1); +} +assert.deepEqual([...m], [ + [Symbol.for("that"), 5], + [Symbol.for("is"), 5], + [Symbol.for("not"), 3], + [Symbol.for("it"), 1] +]); + diff --git a/test/staging/sm/Math/20.2.2.ToNumber.js b/test/staging/sm/Math/20.2.2.ToNumber.js new file mode 100644 index 0000000000..f585e0ace4 --- /dev/null +++ b/test/staging/sm/Math/20.2.2.ToNumber.js @@ -0,0 +1,118 @@ +/* + * Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/licenses/publicdomain/ + */ + +/*--- +includes: [sm/non262-Math-shell.js, sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +/* + * ECMA-262 6th Edition / Draft November 8, 2013 + * + * 20.2.2 Function Properties of the Math Object + */ + +/* + * This custom object will allow us to check if valueOf() is called + */ + +TestNumber.prototype = new Number(); + +function TestNumber(value) { + this.value = value; + this.valueOfCalled = false; +} + +TestNumber.prototype = { + valueOf: function() { + this.valueOfCalled = true; + return this.value; + } +} + +// Verify that each TestNumber's flag is set after calling Math func +function test(func /*, args */) { + var args = Array.prototype.slice.call(arguments, 1); + func.apply(null, args); + + for (var i = 0; i < args.length; ++i) + assert.sameValue(args[i].valueOfCalled, true); +} + +// Note that we are not testing these functions' return values +// We only test whether valueOf() is called for each argument + +// 1. Test Math.atan2() +var x = new TestNumber(1); +test(Math.atan2, x); + +var x = new TestNumber(1); +var y = new TestNumber(2); +test(Math.atan2, y, x); + +// Remove comment block once patch for bug 896264 is approved +/* +// 2. Test Math.hypot() +var x = new TestNumber(1); +test(Math.hypot, x); + +var x = new TestNumber(1); +var y = new TestNumber(2); +test(Math.hypot, x, y); + +var x = new TestNumber(1); +var y = new TestNumber(2); +var z = new TestNumber(3); +test(Math.hypot, x, y, z); +*/ + +// Remove comment block once patch for bug 808148 is approved +/* +// 3. Test Math.imul() +var x = new TestNumber(1); +test(Math.imul, x); + +var x = new TestNumber(1); +var y = new TestNumber(2); +test(Math.imul, x, y); +*/ + +// 4. Test Math.max() +var x = new TestNumber(1); +test(Math.max, x); + +var x = new TestNumber(1); +var y = new TestNumber(2); +test(Math.max, x, y); + +var x = new TestNumber(1); +var y = new TestNumber(2); +var z = new TestNumber(3); +test(Math.max, x, y, z); + +// 5. Test Math.min() +var x = new TestNumber(1); +test(Math.min, x); + +var x = new TestNumber(1); +var y = new TestNumber(2); +test(Math.min, x, y); + +var x = new TestNumber(1); +var y = new TestNumber(2); +var z = new TestNumber(3); +test(Math.min, x, y, z); + +// 6. Test Math.pow() +var x = new TestNumber(1); +test(Math.pow, x); + +var x = new TestNumber(1); +var y = new TestNumber(2); +test(Math.pow, x, y); + diff --git a/test/staging/sm/Math/acosh-approx.js b/test/staging/sm/Math/acosh-approx.js new file mode 100644 index 0000000000..6f64dbe33b --- /dev/null +++ b/test/staging/sm/Math/acosh-approx.js @@ -0,0 +1,293 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-Math-shell.js, sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +var cosh_data = [ + [1.0000014305114746, 0.0016914556651292944], + [1.0000019073486328, 0.001953124689559275], + [1.000007152557373, 0.003782208044661295], + [1.000013828277588, 0.005258943946801101], + [1.0000171661376953, 0.005859366618129203], + [1.0000600814819336, 0.010961831992188852], + [1.0001168251037598, 0.015285472131830425], + [1.0001487731933594, 0.017249319093529877], + [1.0003981590270996, 0.028218171738655373], + [1.000638484954834, 0.03573281468231457], + [1.0010714530944824, 0.046287402472878776], + [1.0030217170715332, 0.07771996527168971], + [1.0049939155578613, 0.0998975930860278], + [1.0092840194702148, 0.13615938768032465], + [1.024169921875, 0.21942279004958354], + [1.0622773170471191, 0.3511165938166055], + [1.1223440170288086, 0.48975026711288183], + [1.2495574951171875, 0.692556883708491], + [1.4912219047546387, 0.954530572221414], + [1.9838471412658691, 1.307581416910453], + [2.1576128005981445, 1.4035188779741334], + [2.406397819519043, 1.5250070845427517], + [3.386958122253418, 1.8905372013072799], + [4.451677322387695, 2.1735673399948254], + [6.9391326904296875, 2.625091127868242], + [7.756023406982422, 2.737434918695162], + [8.882369995117188, 2.8740317167801948], + [9.869171142578125, 2.97998639328949], + [16.848876953125, 3.516549380542481], + [16.88458251953125, 3.51867003468025], + [18.18859100341797, 3.593185165198829], + [18.82012176513672, 3.6273672142963385], + [19.184181213378906, 3.646553244410946], + [24.039520263671875, 3.872413451393967], + [26.556991577148438, 3.972085568933329], + [27.921104431152344, 4.022209178119238], + [32.314666748046875, 4.168428891496629], + [34.73008728027344, 4.240546229861005], + [36.51556396484375, 4.290698214968891], + [38.851287841796875, 4.352722738491574], + [49.46875, 4.594386162629449], + [49.67265319824219, 4.598500387004538], + [55.821014404296875, 4.7152173401856095], + [57.119781494140625, 4.73822104001982], + [60.37983703613281, 4.793733825338029], + [63.4661865234375, 4.8435923769530165], + [63.822418212890625, 4.849190310904695], + [64.36642456054688, 4.85767897228448], + [65.82318115234375, 4.880061548144127], + [68.60302734375, 4.921430721025434], + [70.173583984375, 4.94406835208057], + [71.80126953125, 4.967000841791218], + [75.40786743164062, 5.016014824864732], + [75.49771118164062, 5.017205657609766], + [78.06475830078125, 5.0506448716550825], + [79.64892578125, 5.0707363201405276], + [79.8707275390625, 5.073517411135063], + [82.14324951171875, 5.101574796209937], + [86.42214965820312, 5.152357710985635], + [87.75869750976562, 5.167705692500117], + [94.24942016601562, 5.2390637098028074], + [95.00259399414062, 5.247023676519904], + [96.06402587890625, 5.258134994273664], + [99.10101318359375, 5.289261389093961], + [104.82595825195312, 5.345425863147171], + [105.89431762695312, 5.3555664787245885], + [106.750244140625, 5.363617180711895], + [109.40167236328125, 5.388152468690488], + [111.29598999023438, 5.405320225963013], + [112.68215942382812, 5.417698597745429], + [115.84786987304688, 5.445406415908933], + [122.51895141601562, 5.501396249028249], + [126.29083251953125, 5.531718947357248], + [127.88677978515625, 5.544277233951787], + [128.29241943359375, 5.547444176085567], + [129.49658203125, 5.556786759298988], + [138.73651123046875, 5.625710723366437], + [139.18450927734375, 5.628934733085022], + [139.9705810546875, 5.634566685055491], + [143.6336669921875, 5.660401141376928], + [149.2176513671875, 5.698541939965668], + [150.61602783203125, 5.7078698961812995], + [151.65460205078125, 5.714741890601693], + [154.77532958984375, 5.735111323217677], + [158.9586181640625, 5.761781191641161], + [159.23260498046875, 5.763503378028959], + [166.89166259765625, 5.810483079631769], + [169.22418212890625, 5.824362807770767], + [170.85247802734375, 5.833939098607025], + [175.641845703125, 5.861586030831371], + [176.47808837890625, 5.866335876872544], + [177.0284423828125, 5.869449614294116], + [178.81622314453125, 5.879497954012966], + [181.28570556640625, 5.893213844044451], + [190.84246826171875, 5.944588630523773], + [191.39764404296875, 5.947493525920713], + [194.2606201171875, 5.962341215900494], + [194.89630126953125, 5.9656082276276], + [196.72125244140625, 5.9749284849312865], + [196.76788330078125, 5.975165500176202], + [198.0592041015625, 5.981706804024238], + [199.97052001953125, 5.991310884439669], + [202.70001220703125, 6.004868209578554], + [204.95684814453125, 6.0159406892865155], + [206.92059326171875, 6.025476453825986], + [211.4588623046875, 6.047172064627678], + [211.6217041015625, 6.0479418642231595], + [212.15936279296875, 6.050479329955437], + [219.93341064453125, 6.086466833749719], + [223.34747314453125, 6.101870903204913], + [228.56036376953125, 6.1249427443985525], + [229.53656005859375, 6.129204755426344], + [231.15753173828125, 6.136241935513706], + [235.22589111328125, 6.153688953514383], + [237.17108154296875, 6.1619244798633215], + [237.904541015625, 6.165012268502458], + [243.202392578125, 6.187036941752032], + [244.296875, 6.191527178125454], + [245.39239501953125, 6.196001570568187], + [245.80389404296875, 6.197677082130341], + [249.68365478515625, 6.2133379061260285], + [252.32763671875, 6.223871642756905], + [253.4725341796875, 6.228398760115369], + [264.1583251953125, 6.269692237869835], + [265.867919921875, 6.276143287577458], + [273.893798828125, 6.305884283737176], + [274.060546875, 6.306492908028797], + [274.06298828125, 6.3065018163217115], + [275.31201171875, 6.31104892482331], + [281.2171630859375, 6.3322712125431915], + [284.3428955078125, 6.343324976847916], + [284.8428955078125, 6.345081883725142], + [287.3035888671875, 6.353683609448096], + [290.8973388671875, 6.366114643735997], + [293.0467529296875, 6.373476431987165], + [293.048583984375, 6.3734826803404045], + [296.819091796875, 6.3862671775996915], + [297.6572265625, 6.389086936901673], + [308.40625, 6.424562459508495], + [316.5472412109375, 6.4506171773701535], + [320.2418212890625, 6.462221144761522], + [322.33642578125, 6.468740575092418], + [323.5101318359375, 6.472375224718483], + [327.8939208984375, 6.485834999462654], + [328.0833740234375, 6.486412623146554], + [328.214599609375, 6.486812521370483], + [332.13916015625, 6.498698952535687], + [339.6888427734375, 6.521175044233963], + [340.171630859375, 6.522595306993373], + [340.22998046875, 6.522766822935215], + [340.9984130859375, 6.52502285413445], + [347.719482421875, 6.5445411825986985], + [347.921142578125, 6.5451209675856825], + [349.8392333984375, 6.55061885367159], + [353.1812744140625, 6.560126626713879], + [353.3170166015625, 6.560510895819139], + [354.9730224609375, 6.565186990039135], + [355.6412353515625, 6.567067660815945], + [363.193603515625, 6.588081320423386], + [363.7503662109375, 6.5896131163651415], + [366.66650390625, 6.597598047275183], + [370.5828857421875, 6.608222493065004], + [371.822998046875, 6.611563301604297], + [375.8822021484375, 6.622421213257873], + [377.1107177734375, 6.625684248051368], + [377.588623046875, 6.626950731244344], + [378.8428955078125, 6.630267034079059], + [379.1123046875, 6.630977920761718], + [381.1038818359375, 6.636217452968849], + [382.1112060546875, 6.638857149899159], + [382.9927978515625, 6.641161660644278], + [387.1845703125, 6.652047018118426], + [389.669921875, 6.658445560711748], + [389.804443359375, 6.658790721334144], + [396.3114013671875, 6.675345858154136], + [397.005126953125, 6.677094789236718], + [397.1934814453125, 6.6775691166680895], + [397.8046875, 6.679106750673113], + [398.8426513671875, 6.681712590609845], + [399.1663818359375, 6.682523938576487], + [399.2547607421875, 6.68274532345516], + [400.33984375, 6.685459416477178], + [403.9578857421875, 6.694456277839498], + [404.279541015625, 6.6952522228540765], + [405.0574951171875, 6.6971746771142415], + [407.328125, 6.702764738337774], + [407.547119140625, 6.7033022311799595], + [410.5994873046875, 6.710763953621196], + [410.8016357421875, 6.711256159037373], + [411.129638671875, 6.712054288828399], + [411.9053955078125, 6.713939407502346], + [415.5833740234375, 6.722828986708716], + [417.669189453125, 6.727835453862132], + [420.517822265625, 6.734632628835641], + [424.3853759765625, 6.743787740494532], + [424.7154541015625, 6.744565219553757], + [436.3419189453125, 6.7715720212680655], + [438.501953125, 6.776510146304201], + [439.3369140625, 6.778412462065226], + [445.5606689453125, 6.79247934060035], + [452.9901123046875, 6.809016260337229], + [453.77490234375, 6.810747231716348], + [456.7745361328125, 6.817335895109251], + [457.9520263671875, 6.819910421197311], + [458.6795654296875, 6.821497844004013], + [460.5164794921875, 6.8254946428721475], + [461.8717041015625, 6.828433164406687], + [464.7025146484375, 6.834543470287694], + [467.0626220703125, 6.839609377592375], + [467.0712890625, 6.839627933844213], + [470.096923828125, 6.846084943645239], + [475.1607666015625, 6.856799276049143], + [477.5537109375, 6.861822721577315], + [478.626220703125, 6.864066049482581], + [478.7958984375, 6.864420497333681], + [479.6864013671875, 6.866278653973069], + [479.7867431640625, 6.866487814627139], + [479.9122314453125, 6.8667493311188395], + [482.4793701171875, 6.872084270243208], + [482.5181884765625, 6.872164723177875], + [483.8797607421875, 6.874982560453874], + [484.4649658203125, 6.876191234145179], + [485.3258056640625, 6.877966548833207], + [490.57373046875, 6.888721726428236], + [493.7423095703125, 6.89515989558997], + [494.272216796875, 6.896232568812718], + [496.44775390625, 6.900624415355815], + [497.0401611328125, 6.901816998553275], + [498.234130859375, 6.9042162822876465], + [665.0791015625, 7.193052598670793], + [1170.29150390625, 7.758155143419732], + [2058.7958984375, 8.323023697145112], + [5824.533203125, 9.36298131161099], + [9114.30859375, 9.810748008110926], + [31388.40625, 11.047341056314202], + [53732.765625, 11.584925435512535], + [117455.09375, 12.366958539207397], + [246210.625, 13.107089828327874], + [513670.125, 13.84248373881162], + [788353.25, 14.27084873575108], + [1736171, 15.060339852215408], + [3770530, 15.835873313657556], + [4344090, 15.977474039173265], + [11419360, 16.943967899150145], + [31023240, 17.943394339560967], + [40665424, 18.214035936745432], + [129788064, 19.374560581709215], + [225668224, 19.927723623778547], + [450631936, 20.619308638400597], + [750941952, 21.129986093026698], + [1887358976, 22.05159150215413], + [3738011648, 22.734966842639743], + [7486695424, 23.42954051928097], + [12668080128, 23.955498471391667], + [23918272512, 24.591055724582848], + [48862560256, 25.305424481799395], + [113763549184, 26.150535181949436], + [161334755328, 26.499894449532565], + [321933279232, 27.19075733422632], + [715734122496, 27.989721778208146], + [1875817529344, 28.953212876533797] +]; + +var sloppy_tolerance = 8; // FIXME + +for (var [x, y] of cosh_data) + assertNear(Math.acosh(x), y, sloppy_tolerance); + +assertNear(Math.acosh(1e300), 691.4686750787737, sloppy_tolerance); +assertNear(Math.acosh(1.0000000001), 0.000014142136208675862, sloppy_tolerance); + +for (var i = 0; i <= 100; i++) { + var x = (i - 50) / 5; + var y = Math.cosh(x); + var z = Math.acosh(y); + assertNear(z, Math.abs(x), sloppy_tolerance); +} + +for (var i = 1; i < 20; i++) + assertNear(Math.acosh(Math.cosh(i)), i, sloppy_tolerance); + diff --git a/test/staging/sm/Math/acosh-exact.js b/test/staging/sm/Math/acosh-exact.js new file mode 100644 index 0000000000..6e06e243b5 --- /dev/null +++ b/test/staging/sm/Math/acosh-exact.js @@ -0,0 +1,36 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-Math-shell.js, sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +// Properties of Math.acosh that are guaranteed by the spec. + +// If x is NaN, the result is NaN. +assert.sameValue(Math.acosh(NaN), NaN); + +// If x is less than 1, the result is NaN. +assert.sameValue(Math.acosh(ONE_MINUS_EPSILON), NaN); +assert.sameValue(Math.acosh(Number.MIN_VALUE), NaN); +assert.sameValue(Math.acosh(+0), NaN); +assert.sameValue(Math.acosh(-0), NaN); +assert.sameValue(Math.acosh(-Number.MIN_VALUE), NaN); +assert.sameValue(Math.acosh(-1), NaN); +assert.sameValue(Math.acosh(-Number.MAX_VALUE), NaN); +assert.sameValue(Math.acosh(-Infinity), NaN); + +for (var i = -20; i < 1; i++) + assert.sameValue(Math.acosh(i), NaN); + +// If x is 1, the result is +0. +assert.sameValue(Math.acosh(1), +0); + +// If x is +∞, the result is +∞. +assert.sameValue(Math.acosh(Number.POSITIVE_INFINITY), Number.POSITIVE_INFINITY); + + diff --git a/test/staging/sm/Math/asinh-approx.js b/test/staging/sm/Math/asinh-approx.js new file mode 100644 index 0000000000..7be2f8c424 --- /dev/null +++ b/test/staging/sm/Math/asinh-approx.js @@ -0,0 +1,312 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-Math-shell.js, sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +var sinh_data = [ + [-497.181640625, -6.902103625349695], + [-495.216552734375, -6.898143347143859], + [-488.0980224609375, -6.883664481302669], + [-486.4609375, -6.880304842490273], + [-482.2261962890625, -6.871561546509046], + [-468.167236328125, -6.841973895837549], + [-465.553955078125, -6.836376331805493], + [-464.288330078125, -6.833654100575195], + [-463.558837890625, -6.8320816635009045], + [-453.82861328125, -6.8108680173663085], + [-448.7835693359375, -6.799689165151487], + [-446.0499267578125, -6.793579326246197], + [-432.4046630859375, -6.762510387544996], + [-424.145751953125, -6.743225720989222], + [-402.8682861328125, -6.691758395994307], + [-402.4595947265625, -6.690743430063694], + [-390.1383056640625, -6.6596501292114505], + [-387.5355224609375, -6.652956360641761], + [-381.0023193359375, -6.635954365364267], + [-374.8172607421875, -6.619587562578274], + [-374.1033935546875, -6.617681179427804], + [-373.01318359375, -6.614762741096185], + [-370.0938720703125, -6.60690568753706], + [-364.5230712890625, -6.591738907156094], + [-361.3756103515625, -6.583066984213974], + [-358.1136474609375, -6.573999516974134], + [-350.8861083984375, -6.553610904389896], + [-350.7060546875, -6.553097634736138], + [-345.5616455078125, -6.538320325468202], + [-342.386962890625, -6.529090881007076], + [-341.9425048828125, -6.527791927233787], + [-337.3883056640625, -6.514383886150781], + [-328.8133544921875, -6.488639771044976], + [-326.1348876953125, -6.480460592697477], + [-313.12744140625, -6.439759999015992], + [-311.6180419921875, -6.434927968512049], + [-303.40478515625, -6.4082177348965725], + [-291.9320068359375, -6.369671035834965], + [-289.791015625, -6.362310184909175], + [-288.07568359375, -6.356373428913315], + [-282.76220703125, -6.337756593913614], + [-278.9659423828125, -6.32424009706147], + [-276.1881103515625, -6.314232650754295], + [-269.843994140625, -6.290994606392703], + [-256.47509765625, -6.240182555852785], + [-248.91619873046875, -6.2102675039793604], + [-245.71783447265625, -6.197335184435549], + [-244.9049072265625, -6.194021350132335], + [-242.49176025390625, -6.184119163536406], + [-223.97491455078125, -6.104686221071835], + [-223.0770263671875, -6.100669325836893], + [-221.50177001953125, -6.093582856519022], + [-214.1610107421875, -6.0598807500687935], + [-202.9705810546875, -6.0062142965262515], + [-200.1683349609375, -5.9923121073369945], + [-198.0869140625, -5.981859446096083], + [-191.8330078125, -5.9497792165852905], + [-183.4495849609375, -5.90509449745879], + [-182.9005126953125, -5.902097012275789], + [-167.5517578125, -5.8144483910067954], + [-162.87738037109375, -5.786154254111214], + [-159.6142578125, -5.765917008989405], + [-150.01629638671875, -5.703902219845274], + [-148.34051513671875, -5.6926689504460395], + [-147.23760986328125, -5.685206387751923], + [-143.65484619140625, -5.660572815631807], + [-138.70599365234375, -5.625516713960633], + [-119.55416870117188, -5.476934234171879], + [-118.44155883789062, -5.467584665632571], + [-112.7041015625, -5.417932675603434], + [-111.43020629882812, -5.406565756574079], + [-107.77297973632812, -5.373195678988387], + [-107.6795654296875, -5.3723285712183735], + [-105.091796875, -5.348004040102253], + [-101.261474609375, -5.31087758970896], + [-95.79150390625, -5.255348419702703], + [-91.26885986328125, -5.206986845736275], + [-87.33349609375, -5.162914035396619], + [-78.23873901367188, -5.052952927749896], + [-77.912353515625, -5.048772883924985], + [-76.83489990234375, -5.034848487644809], + [-61.255645751953125, -4.808269821238499], + [-54.41380310058594, -4.689849459883311], + [-43.967193603515625, -4.476720236388958], + [-42.01084899902344, -4.431216695067421], + [-30.609375, -4.114720236218123], + [-26.711166381835938, -3.9785790831656023], + [-25.241317749023438, -3.9220215830953484], + [-14.624359130859375, -3.3770026324620295], + [-12.431087493896484, -3.214961448471211], + [-10.235607147216797, -3.021397455139021], + [-9.41094970703125, -2.937831931335705], + [-1.635939121246338, -1.267878515574959], + [1.6504814008555524e-12, 1.6504814008555524e-12], + [2.0654207510961697e-12, 2.0654207510961697e-12], + [6.933230031758164e-12, 6.933230031758164e-12], + [1.3351444949627478e-11, 1.3351444949627478e-11], + [1.6399812063916386e-11, 1.6399812063916386e-11], + [5.730159402528301e-11, 5.730159402528301e-11], + [1.113731329382972e-10, 1.113731329382972e-10], + [1.4214707189097453e-10, 1.4214707189097453e-10], + [3.8006320313144215e-10, 3.8006320313144215e-10], + [6.09162720266454e-10, 6.09162720266454e-10], + [1.0221641311147778e-9, 1.0221641311147778e-9], + [2.8819222563924995e-9, 2.8819222563924995e-9], + [4.7627768395841485e-9, 4.7627768395841485e-9], + [8.854133426439148e-9, 8.854133426439148e-9], + [2.3050326092288742e-8, 2.305032609228874e-8], + [5.9392490925347374e-8, 5.939249092534734e-8], + [1.166764889148908e-7, 1.1667648891489053e-7], + [2.3799674409019644e-7, 2.379967440901942e-7], + [4.684659415943315e-7, 4.6846594159431437e-7], + [9.382699772686465e-7, 9.382699772685088e-7], + [0.00000110398559627356, 0.0000011039855962733358], + [0.0000032917760108830407, 0.000003291776010877096], + [0.00000751721381675452, 0.000007517213816683722], + [0.000015114666894078255, 0.000015114666893502755], + [0.00002986399340443313, 0.00002986399339999406], + [0.00003387028118595481, 0.000033870281179478836], + [0.00009066011989489198, 0.00009066011977069884], + [0.00021949532674625516, 0.00021949532498377364], + [0.00043952150736004114, 0.00043952149320897676], + [0.0006333151832222939, 0.0006333151408864353], + [0.001115123275667429, 0.0011151230445582744], + [0.001962467096745968, 0.0019624658370807177], + [0.005553754046559334, 0.005553725496786973], + [0.008691128343343735, 0.008691018931968294], + [0.02993336319923401, 0.02992889492062484], + [0.05124260485172272, 0.05122020579778827], + [0.11201295256614685, 0.1117800293787828], + [0.23480379581451416, 0.23269806521543376], + [0.4898730516433716, 0.4721357117742938], + [0.7518312931060791, 0.694611571189336], + [1.655740737915039, 1.2781607348262256], + [3.5958566665649414, 1.9917262343245115], + [3.662705421447754, 2.009484184971722], + [4.142845153808594, 2.128787712416205], + [5.957065582275391, 2.4846967934155475], + [10.890350341796875, 3.083125584533294], + [27.3714599609375, 4.002981567623351], + [29.58606719970703, 4.080736210902826], + [30.79753875732422, 4.120845430011113], + [38.78157043457031, 4.351258506393416], + [46.88148498535156, 4.540883728536112], + [47.21551513671875, 4.547981853382592], + [47.2205810546875, 4.5480891170767], + [49.72361755371094, 4.599728302509061], + [61.557464599609375, 4.8131842711857535], + [67.82162475585938, 4.910082619934558], + [68.82363891601562, 4.924747230639767], + [73.75466918945312, 4.993937439635391], + [80.95669555664062, 5.087099712053554], + [85.26406860351562, 5.1389346970196295], + [85.2677001953125, 5.138977285472121], + [92.8238525390625, 5.223879832616765], + [94.50357055664062, 5.241812789460327], + [116.044677734375, 5.447141014648796], + [123.77554321289062, 5.511633288238573], + [132.3592529296875, 5.578681289305598], + [139.7633056640625, 5.633110296634631], + [143.9609375, 5.662701238627725], + [146.31298828125, 5.678906941005323], + [155.0980224609375, 5.737214893086866], + [155.47784423828125, 5.739660763047893], + [155.74066162109375, 5.741349685869528], + [163.60546875, 5.790614371552514], + [178.735107421875, 5.879059869096351], + [179.70269775390625, 5.884458728291027], + [179.81976318359375, 5.885109945587401], + [181.3594970703125, 5.893636014368936], + [194.82861328125, 5.965274032538233], + [195.23284912109375, 5.967346683696556], + [199.07666015625, 5.986843466070591], + [205.77423095703125, 6.019932686217942], + [206.04608154296875, 6.021252909681261], + [209.36480712890625, 6.037231102920489], + [210.703857421875, 6.043606439928324], + [215.2139892578125, 6.06478541011501], + [225.83892822265625, 6.112974120371601], + [226.95465087890625, 6.117902255760311], + [232.79864501953125, 6.1433256889594094], + [240.647216796875, 6.176483527820343], + [243.1324462890625, 6.186757751007361], + [251.26702880859375, 6.219667373726848], + [253.72906494140625, 6.229418088083555], + [254.6866455078125, 6.233184983047428], + [257.2001953125, 6.243005711460192], + [257.7401123046875, 6.245102704489327], + [261.731201171875, 6.260468857392134], + [263.75, 6.268152459140511], + [265.5167236328125, 6.2748285545831655], + [273.9171142578125, 6.305976070434008], + [278.897705078125, 6.32399546069982], + [279.167236328125, 6.324961403980197], + [292.207275390625, 6.370613506132747], + [293.5975341796875, 6.375359978930309], + [293.9749755859375, 6.3766447200146], + [295.1998291015625, 6.380802563199264], + [297.2799072265625, 6.387824152942429], + [297.9285888671875, 6.390003820200831], + [298.1058349609375, 6.3905985680679], + [300.2803955078125, 6.397866642974941], + [307.531005859375, 6.421725738171608], + [308.1754150390625, 6.423818963102848], + [309.7344970703125, 6.428865255911759], + [314.2847900390625, 6.443449261058927], + [314.7236328125, 6.444844602076255], + [320.8406982421875, 6.464094341970107], + [321.2459716796875, 6.465356699668166], + [321.9031982421875, 6.467400466944125], + [323.457763671875, 6.472218114936839], + [330.82861328125, 6.4947499213823265], + [335.008544921875, 6.507305446835735], + [340.7171630859375, 6.524202033435675], + [348.4677734375, 6.546694993078936], + [349.1292724609375, 6.548591493378012], + [372.4288330078125, 6.613194950203132], + [376.7574462890625, 6.6247505436339065], + [378.4306640625, 6.629181796246806], + [390.9031982421875, 6.6616087711302185], + [405.7918701171875, 6.698989091751707], + [407.3646240234375, 6.702857353572475], + [413.3758544921875, 6.717505881986416], + [415.7354736328125, 6.723197804327891], + [417.193603515625, 6.726699007993023], + [420.874755859375, 6.735483889307782], + [429.2635498046875, 6.755219602793124], + [429.756103515625, 6.756366380816258], + [433.9931640625, 6.766177290841293], + [434.0106201171875, 6.766217511883346], + [440.073974609375, 6.780091308338912], + [450.2220458984375, 6.802889310303153], + [455.017578125, 6.813484439494547], + [457.1668701171875, 6.818196843455478], + [457.5068359375, 6.818940201487998], + [459.2913818359375, 6.822833193143805], + [459.492431640625, 6.82327083544577], + [459.743896484375, 6.823817951018], + [464.888427734375, 6.834945773756887], + [464.96630859375, 6.835113285253827], + [467.6949462890625, 6.840964582694129], + [468.86767578125, 6.84346890521034], + [470.5927734375, 6.847141429556457], + [481.109619140625, 6.869243403190376], + [487.4595947265625, 6.882355637062964], + [488.521484375, 6.884531678915821], + [492.8812255859375, 6.89341643293734], + [494.0684814453125, 6.895822338701104], + [496.4613037109375, 6.900653737167637], + [716.154052734375, 7.2670429692740965], + [1799.92578125, 8.188647968122073], + [3564.845703125, 8.872023251113289], + [7139.869140625, 9.566596912986167], + [12081.22265625, 10.092554861905608], + [22810.2421875, 10.728112113864427], + [46598.96875, 11.442480870715618], + [108493.375, 12.28759157077177], + [153860.8125, 12.636950838344218], + [307019.5, 13.327813723030063], + [682577.25, 14.126778167009777], + [1788919, 15.090269265334971], + [3769169, 15.835512291283944], + [4327820, 15.973721689554742], + [11044024, 16.910547205715446], + [21423208, 17.573132558903225], + [62828288, 18.649063156437965], + [70207360, 18.760110887365155], + [154231424, 19.547111966180875], + [294509056, 20.193967491567523], + [1070557184, 21.484592263156223], + [1957922816, 22.088297141021556], + [3912507392, 22.780591462699917], + [7279233024, 23.401438520318692], + [9665245184, 23.684949498080787], + [22627590144, 24.5355829820426], + [60601991168, 25.520740767599584], + [134018236416, 26.31438890085422], + [204864946176, 26.73876398039979], + [284346286080, 27.06660583008718], + [914576637952, 28.234874284944635], + [1581915832320, 28.78280496108106] +]; + +for (var [x, y] of sinh_data) + assertNear(Math.asinh(x), y); + +assertNear(Math.asinh(1e300), 691.4686750787737); +assertNear(Math.asinh(1e-300), 1e-300); +assertNear(Math.asinh(1e-5), 0.000009999999999833334); +assertNear(Math.asinh(0.3), 0.29567304756342244); +assertNear(Math.asinh(1), 0.881373587019543); + +for (var i = 0; i <= 80; i++) { + var x = (i - 40) / 4; + assertNear(Math.asinh(Math.sinh(x)), x); +} + +for (var i = -20; i < 20; i++) + assertNear(Math.asinh(Math.sinh(i)), i); + diff --git a/test/staging/sm/Math/asinh-exact.js b/test/staging/sm/Math/asinh-exact.js new file mode 100644 index 0000000000..bdc74cd2e6 --- /dev/null +++ b/test/staging/sm/Math/asinh-exact.js @@ -0,0 +1,29 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-Math-shell.js, sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +// Properties of Math.asinh that are guaranteed by the spec. + +// If x is NaN, the result is NaN. +assert.sameValue(Math.asinh(NaN), NaN); + +// If x is +0, the result is +0. +assert.sameValue(Math.asinh(+0), +0); + +// If x is −0, the result is −0. +assert.sameValue(Math.asinh(-0), -0); + +// If x is +∞, the result is +∞. +assert.sameValue(Math.asinh(Infinity), Infinity); + +// If x is −∞, the result is −∞. +assert.sameValue(Math.asinh(-Infinity), -Infinity); + + diff --git a/test/staging/sm/Math/atanh-approx.js b/test/staging/sm/Math/atanh-approx.js new file mode 100644 index 0000000000..af36caaf2a --- /dev/null +++ b/test/staging/sm/Math/atanh-approx.js @@ -0,0 +1,290 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-Math-shell.js, sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +var tanh_data = [ + [-0.9999983310699463, -6.998237084679027], + [-0.9999978542327881, -6.87257975132917], + [-0.999992847442627, -6.2705920974657525], + [-0.9999861717224121, -5.940967614084813], + [-0.9999828338623047, -5.832855225378502], + [-0.9999399185180664, -5.20646301208756], + [-0.9998834133148193, -4.8749821841810785], + [-0.9998509883880615, -4.752279497280338], + [-0.9996016025543213, -4.260504202858904], + [-0.9993612766265869, -4.0244334353203115], + [-0.9989283084869385, -3.7655641082999236], + [-0.9969782829284668, -3.246782610980921], + [-0.9950058460235596, -2.9950671179940938], + [-0.9942638874053955, -2.9256242749609536], + [-0.990715742111206, -2.6839646283308363], + [-0.9903340339660645, -2.663723350226518], + [-0.9760982990264893, -2.207464998348322], + [-0.975830078125, -2.201817459680556], + [-0.9728245735168457, -2.1424542308291437], + [-0.9643559455871582, -2.0046686756020917], + [-0.9377224445343018, -1.7188337346177065], + [-0.9362406730651855, -1.7066940482565154], + [-0.9310147762298584, -1.6659543005533146], + [-0.9284839630126953, -1.6472838718760747], + [-0.9270248413085938, -1.6368067340881562], + [-0.9075665473937988, -1.5135473477311114], + [-0.897477388381958, -1.4590986086331497], + [-0.8920106887817383, -1.431681573516303], + [-0.8776559829711914, -1.365471286049011], + [-0.864722728729248, -1.3117705583444539], + [-0.8482067584991455, -1.249725893334944], + [-0.8056559562683105, -1.1145246028592257], + [-0.8048388957977295, -1.112200609756455], + [-0.7801985740661621, -1.0458778330822556], + [-0.7749934196472168, -1.032711173436253], + [-0.7619285583496094, -1.0007967281362184], + [-0.7504425048828125, -0.9739672824457072], + [-0.7495596408843994, -0.9719492983286864], + [-0.7481319904327393, -0.968698942014487], + [-0.7459518909454346, -0.9637657636705832], + [-0.7401137351989746, -0.9507308314464193], + [-0.7289731502532959, -0.9265325319867653], + [-0.7226788997650146, -0.9132299082876396], + [-0.7161557674407959, -0.8997082193533088], + [-0.7017018795013428, -0.8706453720344796], + [-0.7013418674468994, -0.86993650130945], + [-0.691054105758667, -0.8499705913361888], + [-0.6847054958343506, -0.837919455842005], + [-0.6838164329528809, -0.8362476144993315], + [-0.6747090816497803, -0.8193374156276964], + [-0.6575610637664795, -0.7885046044142132], + [-0.6522045135498047, -0.7791255597799839], + [-0.6261923313140869, -0.7351275788820003], + [-0.623173713684082, -0.7301771459970386], + [-0.6067488193511963, -0.7037597526130627], + [-0.5838055610656738, -0.6682166303197608], + [-0.579524040222168, -0.6617457665293066], + [-0.5760939121246338, -0.656596458857398], + [-0.5654678344726562, -0.6408350116350283], + [-0.5578761100769043, -0.6297442839791668], + [-0.5523209571838379, -0.6217149641475687], + [-0.5396339893341064, -0.6036390747171698], + [-0.5128989219665527, -0.5666556256064771], + [-0.5087778568267822, -0.5610793900942042], + [-0.4977825880050659, -0.546353950571504], + [-0.4913865327835083, -0.5378865967606703], + [-0.48976075649261475, -0.5357455496477738], + [-0.48493504524230957, -0.5294166456244711], + [-0.4479050636291504, -0.4820764946679979], + [-0.4461095333099365, -0.4798325976916711], + [-0.4429593086242676, -0.47590653371561276], + [-0.42827916145324707, -0.45778739362936793], + [-0.40590059757232666, -0.4306933608076879], + [-0.40029656887054443, -0.4240020382545707], + [-0.3961341381072998, -0.4190551379319939], + [-0.3836275339126587, -0.40430627175908734], + [-0.36686253547668457, -0.3847928551425507], + [-0.3657644987106323, -0.38352464227459343], + [-0.33507001399993896, -0.3485286317501442], + [-0.32572221755981445, -0.3380352468276522], + [-0.3191967010498047, -0.3307524237890151], + [-0.3000025749206543, -0.3095224337886503], + [-0.29665136337280273, -0.3058438250228025], + [-0.2944457530975342, -0.3034271164344305], + [-0.2872810363769531, -0.29560018347246825], + [-0.27738428115844727, -0.28484608203169437], + [-0.2390844225883484, -0.2438028008332661], + [-0.23685944080352783, -0.24144425169391517], + [-0.2253856658935547, -0.2293228153248168], + [-0.22283810377120972, -0.22664053064745143], + [-0.21552443504333496, -0.21895773601143995], + [-0.2153375744819641, -0.21876178107952995], + [-0.21016258001327515, -0.21334143320771737], + [-0.20250272750854492, -0.2053409277979887], + [-0.19156384468078613, -0.19396008474133075], + [-0.18251943588256836, -0.18458771439322938], + [-0.17464947700500488, -0.17645844608618066], + [-0.15646183490753174, -0.15775766677189154], + [-0.15580910444259644, -0.15708862621964176], + [-0.15365445613861084, -0.15488112515549593], + [-0.122499018907547, -0.12311733609904851], + [-0.1088167130947113, -0.10924929296737837], + [-0.08792558312416077, -0.08815322150790302], + [-0.08401328325271606, -0.08421178632314608], + [-0.06121261417865753, -0.06128924075509796], + [-0.05341699719429016, -0.05346789060550386], + [-0.05047759413719177, -0.05052053189238029], + [-0.02924579381942749, -0.029254136237332657], + [-0.02485968917608261, -0.02486481220617492], + [-0.020469173789024353, -0.02047203328100153], + [-0.01882001757621765, -0.018822240021756347], + [-0.016152501106262207, -0.016153906073109205], + [-0.0032715508714318275, -0.003271562543358962], + [1.6504814008555524e-12, 1.6504814008555524e-12], + [2.0654207510961697e-12, 2.0654207510961697e-12], + [6.933230031758164e-12, 6.933230031758164e-12], + [1.3351444949627478e-11, 1.3351444949627478e-11], + [1.6399812063916386e-11, 1.6399812063916386e-11], + [5.730159402528301e-11, 5.730159402528301e-11], + [1.113731329382972e-10, 1.113731329382972e-10], + [1.4214707189097453e-10, 1.4214707189097453e-10], + [3.8006320313144215e-10, 3.8006320313144215e-10], + [6.09162720266454e-10, 6.09162720266454e-10], + [1.0221641311147778e-9, 1.0221641311147778e-9], + [2.8819222563924995e-9, 2.8819222563924995e-9], + [4.7627768395841485e-9, 4.7627768395841485e-9], + [8.854133426439148e-9, 8.854133426439148e-9], + [2.3050326092288742e-8, 2.3050326092288745e-8], + [5.9392490925347374e-8, 5.939249092534745e-8], + [1.166764889148908e-7, 1.1667648891489133e-7], + [2.3799674409019644e-7, 2.3799674409020094e-7], + [4.684659415943315e-7, 4.684659415943658e-7], + [9.382699772686465e-7, 9.382699772689218e-7], + [0.00000110398559627356, 0.0000011039855962740086], + [0.0000032917760108830407, 0.0000032917760108949305], + [0.00000751721381675452, 0.000007517213816896115], + [0.000015114666894078255, 0.000015114666895229252], + [0.00002986399340443313, 0.00002986399341331128], + [0.00003387028118595481, 0.000033870281198906756], + [0.00009066011989489198, 0.00009066012014327826], + [0.00021949532674625516, 0.0002194953302712184], + [0.00043952150736004114, 0.0004395215356621756], + [0.0006333151832222939, 0.0006333152678940465], + [0.001115123275667429, 0.0011151237378863419], + [0.001962467096745968, 0.001962469616086656], + [0.005553754046559334, 0.005553811147953338], + [0.007324676960706711, 0.0073248079567425], + [0.008691128343343735, 0.008691347183450786], + [0.011912941932678223, 0.011913505535037906], + [0.02993336319923401, 0.029942308168570204], + [0.05124260485172272, 0.05128752666822782], + [0.05473744869232178, 0.05479221508125444], + [0.06158891320228577, 0.061666963819518306], + [0.09375360608100891, 0.09402975380882211], + [0.09442159533500671, 0.09470370926367391], + [0.09443172812461853, 0.09471393321406026], + [0.09943729639053345, 0.09976699249016487], + [0.11201295256614685, 0.11248498303558895], + [0.12310260534286499, 0.12373016402339168], + [0.13562965393066406, 0.13647060950861248], + [0.13763350248336792, 0.13851257866094746], + [0.14749455451965332, 0.14857829980464834], + [0.1618971824645996, 0.16333433166790448], + [0.17051106691360474, 0.17219298693637355], + [0.17051833868026733, 0.17220047646299907], + [0.18562912940979004, 0.18780647318150087], + [0.18898820877075195, 0.1912876932893582], + [0.23206615447998047, 0.23637212433914523], + [0.23480379581451416, 0.2392675448267427], + [0.2646920680999756, 0.27114729033023005], + [0.2794986963272095, 0.2871382059344433], + [0.28789305686950684, 0.2962673858386819], + [0.292596697807312, 0.30140373665239234], + [0.3101649284362793, 0.320727882769785], + [0.3109246492385864, 0.3215686893944558], + [0.31145012378692627, 0.3221505056451929], + [0.3271782398223877, 0.3396649461699478], + [0.3574345111846924, 0.37394153436545424], + [0.3593693971633911, 0.37616159223090223], + [0.35960352420806885, 0.37643046596933716], + [0.3626827001571655, 0.3799714809649667], + [0.38961827754974365, 0.4113499159905353], + [0.3904266357421875, 0.41230330080214], + [0.3981136083602905, 0.4214052375603139], + [0.411507248878479, 0.43742438709579096], + [0.4120509624481201, 0.43807911823743495], + [0.41868770122528076, 0.4460997186945703], + [0.42136549949645996, 0.4493511447897729], + [0.4516327381134033, 0.48674948990473677], + [0.4538639783859253, 0.4895560176112375], + [0.4655507802963257, 0.5043748446613433], + [0.48124635219573975, 0.5246050193978663], + [0.48621630668640137, 0.5310932154891663], + [0.4898730516433716, 0.5358932909903701], + [0.5024838447570801, 0.5526234425942533], + [0.5074074268341064, 0.5592320547729962], + [0.5093221664428711, 0.5618140818296767], + [0.5143489837646484, 0.5686253097655146], + [0.5154285430908203, 0.5700943191671631], + [0.5234100818634033, 0.5810250825991418], + [0.5274472236633301, 0.5866018515043636], + [0.5309803485870361, 0.5915094458340507], + [0.5477793216705322, 0.6152030999229688], + [0.5577394962310791, 0.6295459624918965], + [0.5582785606384277, 0.6303287742357745], + [0.5843560695648193, 0.6690521906099505], + [0.5871362686157227, 0.6732844960442398], + [0.5878911018371582, 0.6744372167164567], + [0.5903406143188477, 0.6781887236623534], + [0.5945003032684326, 0.684597775489552], + [0.5957975387573242, 0.6866065102131665], + [0.5961520671844482, 0.6871563252400655], + [0.6005008220672607, 0.6939300827887145], + [0.6150004863739014, 0.7169242329194352], + [0.6162893772125244, 0.7189998055497108], + [0.6194069385528564, 0.7240422748778544], + [0.6285066604614258, 0.7389438896054792], + [0.6293842792510986, 0.7403958734869583], + [0.6416172981262207, 0.7609178886018204], + [0.6424276828765869, 0.7622965466812235], + [0.6437420845031738, 0.7645378650643101], + [0.6468508243560791, 0.769864795178161], + [0.6615910530090332, 0.7956379107512945], + [0.669950008392334, 0.8106524185805045], + [0.6813662052154541, 0.8316597473423232], + [0.6968657970428467, 0.8611812790659296], + [0.6981887817382812, 0.8637579113749143], + [0.7447831630706787, 0.9611360201710216], + [0.7518312931060791, 0.9771540941752986], + [0.7534394264221191, 0.9808634133542229], + [0.7567856311798096, 0.9886489208209699], + [0.7817282676696777, 1.0497991719828956], + [0.8115026950836182, 1.1314141444187586], + [0.814647912979126, 1.1406947755584418], + [0.8266689777374268, 1.1775230833699681], + [0.8313877582550049, 1.1926138225701433], + [0.8343038558959961, 1.2021323323039612], + [0.8416652679443359, 1.2268570644335162], + [0.8584413528442383, 1.2873896671573652], + [0.8678996562957764, 1.3245040433929398], + [0.8679344654083252, 1.3246451309261607], + [0.8800599575042725, 1.3760334877782177], + [0.9003539085388184, 1.4740852961194106], + [0.9099440574645996, 1.5271990851861994], + [0.9142425060272217, 1.5527768948273004], + [0.9149219989776611, 1.556931837197936], + [0.9184908866882324, 1.5792896628381612], + [0.9188928604125977, 1.5818663359427627], + [0.919395923614502, 1.5851082843320008], + [0.9296839237213135, 1.6560555223295368], + [0.9298396110534668, 1.6572041418041492], + [0.9352962970733643, 1.6990986433619266], + [0.9376416206359863, 1.718164398807965], + [0.9410912990570068, 1.7475084077246632], + [0.962122917175293, 1.9737180163455101], + [0.9748215675354004, 2.1811227771083783], + [0.9769454002380371, 2.2257214499698255], + [0.985663890838623, 2.4654635601650536], + [0.9880380630493164, 2.5565869228142004], + [0.9928233623504639, 2.8132383539094192], + [1e-300, 1e-300], + [0.00001, 0.000010000000000333334], + [0.3, 0.3095196042031117], + [1e-30, 1e-30], + [1e-10, 1e-10], +]; + +var sloppy_tolerance = 2; // FIXME + +for (var [x, y] of tanh_data) + assertNear(Math.atanh(x), y, sloppy_tolerance); + +assertNear(Math.atanh(+3 / 5), +Math.log(2), sloppy_tolerance); +assertNear(Math.atanh(-3 / 5), -Math.log(2), sloppy_tolerance); + +for (var i = -1; i < 1; i += 0.05) + assertNear(Math.atanh(Math.tanh(i)), i, sloppy_tolerance); + diff --git a/test/staging/sm/Math/atanh-exact.js b/test/staging/sm/Math/atanh-exact.js new file mode 100644 index 0000000000..677531be83 --- /dev/null +++ b/test/staging/sm/Math/atanh-exact.js @@ -0,0 +1,45 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-Math-shell.js, sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +// Properties of Math.atanh that are guaranteed by the spec. + +// If x is NaN, the result is NaN. +assert.sameValue(Math.atanh(NaN), NaN); + +// If x is less than −1, the result is NaN. +assert.sameValue(Math.atanh(-ONE_PLUS_EPSILON), NaN); +assert.sameValue(Math.atanh(-Number.MAX_VALUE), NaN); +assert.sameValue(Math.atanh(-Infinity), NaN); + +for (var i = -5; i < -1; i += 0.1) + assert.sameValue(Math.atanh(i), NaN); + +// If x is greater than 1, the result is NaN. +assert.sameValue(Math.atanh(ONE_PLUS_EPSILON), NaN); +assert.sameValue(Math.atanh(Number.MAX_VALUE), NaN); +assert.sameValue(Math.atanh(Infinity), NaN); + +for (var i = +5; i > +1; i -= 0.1) + assert.sameValue(Math.atanh(i), NaN); + +// If x is −1, the result is −∞. +assert.sameValue(Math.atanh(-1), -Infinity); + +// If x is +1, the result is +∞. +assert.sameValue(Math.atanh(+1), Infinity); + +// If x is +0, the result is +0. +assert.sameValue(Math.atanh(+0), +0); + +// If x is −0, the result is −0. +assert.sameValue(Math.atanh(-0), -0); + + diff --git a/test/staging/sm/Math/cbrt-approx.js b/test/staging/sm/Math/cbrt-approx.js new file mode 100644 index 0000000000..1f9614c68d --- /dev/null +++ b/test/staging/sm/Math/cbrt-approx.js @@ -0,0 +1,27 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-Math-shell.js, sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +assert.sameValue(Math.cbrt(1), 1); +assert.sameValue(Math.cbrt(-1), -1); + +assertNear(Math.cbrt(1e-300), 1e-100); +assertNear(Math.cbrt(-1e-300), -1e-100); + +var cbrt_data = [ + [ Math.E, 1.3956124250860895 ], + [ Math.PI, 1.4645918875615231 ], + [ Math.LN2, 0.8849970445005177 ], + [ Math.SQRT2, 1.1224620483093728 ] +]; + +for (var [x, y] of cbrt_data) + assertNear(Math.cbrt(x), y); + diff --git a/test/staging/sm/Math/cbrt-exact.js b/test/staging/sm/Math/cbrt-exact.js new file mode 100644 index 0000000000..635b4cf3eb --- /dev/null +++ b/test/staging/sm/Math/cbrt-exact.js @@ -0,0 +1,29 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-Math-shell.js, sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +// Properties of Math.cbrt that are guaranteed by the spec. + +// If x is NaN, the result is NaN. +assert.sameValue(Math.cbrt(NaN), NaN); + +// If x is +0, the result is +0. +assert.sameValue(Math.cbrt(+0), +0); + +// If x is −0, the result is −0. +assert.sameValue(Math.cbrt(-0), -0); + +// If x is +∞, the result is +∞. +assert.sameValue(Math.cbrt(Infinity), Infinity); + +// If x is −∞, the result is −∞. +assert.sameValue(Math.cbrt(-Infinity), -Infinity); + + diff --git a/test/staging/sm/Math/clz32.js b/test/staging/sm/Math/clz32.js new file mode 100644 index 0000000000..7db62e57fa --- /dev/null +++ b/test/staging/sm/Math/clz32.js @@ -0,0 +1,50 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-Math-shell.js, sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +// Undefined and NaN end up as zero after ToUint32 +assert.sameValue(Math.clz32(), 32); +assert.sameValue(Math.clz32(NaN), 32); +assert.sameValue(Math.clz32.call(), 32); +// 0 +assert.sameValue(Math.clz32(null), 32); +assert.sameValue(Math.clz32(false), 32); +// 1 +assert.sameValue(Math.clz32(true), 31); +// 3 +assert.sameValue(Math.clz32(3.5), 30); +// NaN -> 0 +assert.sameValue(Math.clz32({}), 32); +// 2 +assert.sameValue(Math.clz32({valueOf: function() { return 2; }}), 30); +// 0 -> 0 +assert.sameValue(Math.clz32([]), 32); +assert.sameValue(Math.clz32(""), 32); +// NaN -> 0 +assert.sameValue(Math.clz32([1, 2, 3]), 32); +assert.sameValue(Math.clz32("bar"), 32); +// 15 +assert.sameValue(Math.clz32("15"), 28); + + +assert.sameValue(Math.clz32(0x80000000), 0); +assert.sameValue(Math.clz32(0xF0FF1000), 0); +assert.sameValue(Math.clz32(0x7F8F0001), 1); +assert.sameValue(Math.clz32(0x3FFF0100), 2); +assert.sameValue(Math.clz32(0x1FF50010), 3); +assert.sameValue(Math.clz32(0x00800000), 8); +assert.sameValue(Math.clz32(0x00400000), 9); +assert.sameValue(Math.clz32(0x00008000), 16); +assert.sameValue(Math.clz32(0x00004000), 17); +assert.sameValue(Math.clz32(0x00000080), 24); +assert.sameValue(Math.clz32(0x00000040), 25); +assert.sameValue(Math.clz32(0x00000001), 31); +assert.sameValue(Math.clz32(0), 32); + diff --git a/test/staging/sm/Math/cosh-approx.js b/test/staging/sm/Math/cosh-approx.js new file mode 100644 index 0000000000..57da63d5a3 --- /dev/null +++ b/test/staging/sm/Math/cosh-approx.js @@ -0,0 +1,286 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-Math-shell.js, sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +assert.sameValue(Math.cosh(1000), Infinity); +assert.sameValue(Math.cosh(Number.MAX_VALUE), Infinity); +assertNear(Math.cosh(1e-30), 1); +assertNear(Math.cosh(1e-10), 1); + +var cosh_data = [ + [0.0016914556651292944, 1.0000014305114746], + [0.001953124689559275, 1.0000019073486328], + [0.003782208044661295, 1.000007152557373], + [0.005258943946801101, 1.000013828277588], + [0.005859366618129203, 1.0000171661376953], + [0.010961831992188852, 1.0000600814819336], + [0.015285472131830425, 1.0001168251037598], + [0.017249319093529877, 1.0001487731933594], + [0.028218171738655373, 1.0003981590270996], + [0.03573281468231457, 1.000638484954834], + [0.046287402472878776, 1.0010714530944824], + [0.07771996527168971, 1.0030217170715332], + [0.0998975930860278, 1.0049939155578613], + [0.13615938768032465, 1.0092840194702148], + [0.21942279004958354, 1.024169921875], + [0.3511165938166055, 1.0622773170471191], + [0.48975026711288183, 1.1223440170288086], + [0.692556883708491, 1.2495574951171875], + [0.954530572221414, 1.4912219047546387], + [1.307581416910453, 1.983847141265869], + [1.4035188779741334, 2.1576128005981445], + [1.5250070845427517, 2.406397819519043], + [1.8905372013072799, 3.386958122253418], + [2.1735673399948254, 4.451677322387695], + [2.625091127868242, 6.939132690429686], + [2.737434918695162, 7.756023406982421], + [2.8740317167801948, 8.88236999511719], + [2.97998639328949, 9.869171142578123], + [3.516549380542481, 16.848876953125], + [3.51867003468025, 16.884582519531254], + [3.593185165198829, 18.18859100341797], + [3.6273672142963385, 18.82012176513672], + [3.646553244410946, 19.184181213378906], + [3.872413451393967, 24.03952026367187], + [3.972085568933329, 26.556991577148434], + [4.022209178119238, 27.921104431152337], + [4.168428891496629, 32.31466674804686], + [4.240546229861005, 34.730087280273445], + [4.290698214968891, 36.51556396484376], + [4.352722738491574, 38.851287841796875], + [4.594386162629449, 49.46875], + [4.598500387004538, 49.67265319824219], + [4.7152173401856095, 55.821014404296896], + [4.73822104001982, 57.119781494140604], + [4.793733825338029, 60.37983703613279], + [4.8435923769530165, 63.46618652343747], + [4.849190310904695, 63.82241821289062], + [4.85767897228448, 64.36642456054685], + [4.880061548144127, 65.82318115234375], + [4.921430721025434, 68.60302734374997], + [4.94406835208057, 70.17358398437497], + [4.967000841791218, 71.80126953124997], + [5.016014824864732, 75.40786743164065], + [5.017205657609766, 75.49771118164062], + [5.0506448716550825, 78.06475830078126], + [5.0707363201405276, 79.64892578125], + [5.073517411135063, 79.87072753906253], + [5.101574796209937, 82.14324951171874], + [5.152357710985635, 86.4221496582031], + [5.167705692500117, 87.75869750976562], + [5.2390637098028074, 94.24942016601562], + [5.247023676519904, 95.00259399414062], + [5.258134994273664, 96.06402587890626], + [5.289261389093961, 99.10101318359374], + [5.345425863147171, 104.82595825195315], + [5.3555664787245885, 105.89431762695308], + [5.363617180711895, 106.750244140625], + [5.388152468690488, 109.40167236328122], + [5.405320225963013, 111.2959899902344], + [5.417698597745429, 112.68215942382815], + [5.445406415908933, 115.8478698730469], + [5.501396249028249, 122.51895141601562], + [5.531718947357248, 126.29083251953128], + [5.544277233951787, 127.88677978515626], + [5.547444176085567, 128.29241943359372], + [5.556786759298988, 129.49658203125006], + [5.625710723366437, 138.7365112304687], + [5.628934733085022, 139.18450927734378], + [5.634566685055491, 139.97058105468747], + [5.660401141376928, 143.63366699218747], + [5.698541939965668, 149.21765136718753], + [5.7078698961812995, 150.6160278320313], + [5.714741890601693, 151.6546020507813], + [5.735111323217677, 154.77532958984378], + [5.761781191641161, 158.95861816406253], + [5.763503378028959, 159.23260498046878], + [5.810483079631769, 166.89166259765622], + [5.824362807770767, 169.22418212890625], + [5.833939098607025, 170.85247802734372], + [5.861586030831371, 175.64184570312503], + [5.866335876872544, 176.47808837890625], + [5.869449614294116, 177.02844238281247], + [5.879497954012966, 178.81622314453122], + [5.893213844044451, 181.28570556640625], + [5.944588630523773, 190.84246826171866], + [5.947493525920713, 191.39764404296875], + [5.962341215900494, 194.26062011718753], + [5.9656082276276, 194.89630126953122], + [5.9749284849312865, 196.7212524414062], + [5.975165500176202, 196.76788330078128], + [5.981706804024238, 198.05920410156241], + [5.991310884439669, 199.9705200195312], + [6.004868209578554, 202.70001220703122], + [6.0159406892865155, 204.95684814453116], + [6.025476453825986, 206.92059326171866], + [6.047172064627678, 211.45886230468741], + [6.0479418642231595, 211.62170410156256], + [6.050479329955437, 212.1593627929687], + [6.086466833749719, 219.93341064453125], + [6.101870903204913, 223.3474731445312], + [6.1249427443985525, 228.56036376953128], + [6.129204755426344, 229.53656005859375], + [6.136241935513706, 231.1575317382813], + [6.153688953514383, 235.22589111328134], + [6.1619244798633215, 237.17108154296884], + [6.165012268502458, 237.90454101562506], + [6.187036941752032, 243.202392578125], + [6.191527178125454, 244.29687500000003], + [6.196001570568187, 245.3923950195312], + [6.197677082130341, 245.80389404296875], + [6.2133379061260285, 249.68365478515622], + [6.223871642756905, 252.3276367187501], + [6.228398760115369, 253.47253417968756], + [6.269692237869835, 264.1583251953126], + [6.276143287577458, 265.8679199218749], + [6.305884283737176, 273.89379882812494], + [6.306492908028797, 274.0605468750001], + [6.3065018163217115, 274.06298828125006], + [6.31104892482331, 275.3120117187501], + [6.3322712125431915, 281.2171630859374], + [6.343324976847916, 284.34289550781244], + [6.345081883725142, 284.84289550781256], + [6.353683609448096, 287.30358886718756], + [6.366114643735997, 290.8973388671876], + [6.373476431987165, 293.0467529296875], + [6.3734826803404045, 293.04858398437494], + [6.3862671775996915, 296.819091796875], + [6.389086936901673, 297.6572265625], + [6.424562459508495, 308.4062500000001], + [6.4506171773701535, 316.5472412109376], + [6.462221144761522, 320.24182128906256], + [6.468740575092418, 322.33642578125], + [6.472375224718483, 323.5101318359374], + [6.485834999462654, 327.8939208984375], + [6.486412623146554, 328.08337402343744], + [6.486812521370483, 328.214599609375], + [6.498698952535687, 332.1391601562501], + [6.521175044233963, 339.6888427734376], + [6.522595306993373, 340.171630859375], + [6.522766822935215, 340.2299804687499], + [6.52502285413445, 340.99841308593744], + [6.5445411825986985, 347.7194824218749], + [6.5451209675856825, 347.9211425781249], + [6.55061885367159, 349.8392333984375], + [6.560126626713879, 353.1812744140626], + [6.560510895819139, 353.31701660156244], + [6.565186990039135, 354.97302246093756], + [6.567067660815945, 355.64123535156233], + [6.588081320423386, 363.19360351562517], + [6.5896131163651415, 363.7503662109376], + [6.597598047275183, 366.66650390624983], + [6.608222493065004, 370.5828857421874], + [6.611563301604297, 371.822998046875], + [6.622421213257873, 375.88220214843756], + [6.625684248051368, 377.11071777343744], + [6.626950731244344, 377.58862304687483], + [6.630267034079059, 378.8428955078124], + [6.630977920761718, 379.11230468749994], + [6.636217452968849, 381.10388183593756], + [6.638857149899159, 382.1112060546874], + [6.641161660644278, 382.9927978515625], + [6.652047018118426, 387.1845703124999], + [6.658445560711748, 389.66992187499994], + [6.658790721334144, 389.8044433593749], + [6.675345858154136, 396.3114013671875], + [6.677094789236718, 397.00512695312494], + [6.6775691166680895, 397.1934814453124], + [6.679106750673113, 397.80468749999994], + [6.681712590609845, 398.84265136718744], + [6.682523938576487, 399.16638183593744], + [6.68274532345516, 399.2547607421874], + [6.685459416477178, 400.3398437499999], + [6.694456277839498, 403.9578857421875], + [6.6952522228540765, 404.27954101562517], + [6.6971746771142415, 405.05749511718744], + [6.702764738337774, 407.328125], + [6.7033022311799595, 407.54711914062506], + [6.710763953621196, 410.59948730468756], + [6.711256159037373, 410.8016357421876], + [6.712054288828399, 411.12963867187494], + [6.713939407502346, 411.9053955078124], + [6.722828986708716, 415.5833740234374], + [6.727835453862132, 417.66918945312506], + [6.734632628835641, 420.51782226562506], + [6.743787740494532, 424.38537597656233], + [6.744565219553757, 424.71545410156244], + [6.7715720212680655, 436.3419189453125], + [6.776510146304201, 438.50195312500017], + [6.778412462065226, 439.33691406250017], + [6.79247934060035, 445.5606689453126], + [6.809016260337229, 452.9901123046875], + [6.810747231716348, 453.7749023437499], + [6.817335895109251, 456.7745361328125], + [6.819910421197311, 457.9520263671875], + [6.821497844004013, 458.6795654296874], + [6.8254946428721475, 460.51647949218767], + [6.828433164406687, 461.87170410156256], + [6.834543470287694, 464.70251464843756], + [6.839609377592375, 467.06262207031267], + [6.839627933844213, 467.0712890625001], + [6.846084943645239, 470.09692382812494], + [6.856799276049143, 475.16076660156233], + [6.861822721577315, 477.5537109374998], + [6.864066049482581, 478.62622070312517], + [6.864420497333681, 478.79589843750017], + [6.866278653973069, 479.68640136718733], + [6.866487814627139, 479.7867431640625], + [6.8667493311188395, 479.9122314453126], + [6.872084270243208, 482.4793701171875], + [6.872164723177875, 482.5181884765627], + [6.874982560453874, 483.87976074218767], + [6.876191234145179, 484.46496582031233], + [6.877966548833207, 485.3258056640624], + [6.888721726428236, 490.57373046875006], + [6.89515989558997, 493.74230957031244], + [6.896232568812718, 494.2722167968751], + [6.900624415355815, 496.44775390624983], + [6.901816998553275, 497.0401611328125], + [6.9042162822876465, 498.23413085937483], + [7.193052598670793, 665.0791015625001], + [7.758155143419732, 1170.29150390625], + [8.323023697145112, 2058.795898437501], + [9.36298131161099, 5824.533203125004], + [9.810748008110926, 9114.308593750004], + [11.047341056314202, 31388.40624999998], + [11.584925435512535, 53732.765624999956], + [12.366958539207397, 117455.0937500001], + [13.107089828327874, 246210.62499999983], + [13.84248373881162, 513670.1250000003], + [14.27084873575108, 788353.2499999999], + [15.060339852215408, 1736170.999999999], + [15.835873313657556, 3770530.0000000005], + [15.977474039173265, 4344089.999999998], + [16.943967899150145, 11419360.000000006], + [17.943394339560967, 31023239.99999997], + [18.214035936745432, 40665424.00000006], + [19.374560581709215, 129788063.99999991], + [19.927723623778547, 225668224.00000027], + [20.619308638400597, 450631936.0000006], + [21.129986093026698, 750941952.0000008], + [22.05159150215413, 1887358976.0000033], + [22.734966842639743, 3738011648.0000052], + [23.42954051928097, 7486695423.99999], + [23.955498471391667, 12668080127.99998], + [24.591055724582848, 23918272512], + [25.305424481799395, 48862560256.00005], + [26.150535181949436, 113763549183.99998], + [26.499894449532565, 161334755328.00018], + [27.19075733422632, 321933279232.0004], + [27.989721778208146, 715734122496], + [28.953212876533797, 1875817529343.9976], +]; + +for (var [x, y] of cosh_data) + assertNear(Math.cosh(x), y); + +for (var i = -20; i < 20; i++) + assertNear(Math.cosh(i), (Math.exp(i) + Math.exp(-i)) / 2); + diff --git a/test/staging/sm/Math/cosh-exact.js b/test/staging/sm/Math/cosh-exact.js new file mode 100644 index 0000000000..6653e00963 --- /dev/null +++ b/test/staging/sm/Math/cosh-exact.js @@ -0,0 +1,29 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-Math-shell.js, sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +// Properties of Math.cosh that are guaranteed by the spec. + +// If x is NaN, the result is NaN. +assert.sameValue(Math.cosh(NaN), NaN); + +// If x is +0, the result is 1. +assert.sameValue(Math.cosh(+0), 1); + +// If x is −0, the result is 1. +assert.sameValue(Math.cosh(-0), 1); + +// If x is +∞, the result is +∞. +assert.sameValue(Math.cosh(Infinity), Infinity); + +// If x is −∞, the result is +∞. +assert.sameValue(Math.cosh(-Infinity), Infinity); + + diff --git a/test/staging/sm/Math/exp-exact.js b/test/staging/sm/Math/exp-exact.js new file mode 100644 index 0000000000..89d9310ced --- /dev/null +++ b/test/staging/sm/Math/exp-exact.js @@ -0,0 +1,38 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-Math-shell.js, sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +// Properties of Math.exp that are guaranteed by the spec. + +// If x is NaN, the result is NaN. +assert.sameValue(Math.exp(NaN), NaN); + +// If x is +0, the result is 1. +assert.sameValue(Math.exp(+0), 1); + +// If x is −0, the result is 1. +assert.sameValue(Math.exp(-0), 1); + +// If x is +∞, the result is +∞. +assert.sameValue(Math.exp(Infinity), Infinity); + +// If x is −∞, the result is +0. +assert.sameValue(Math.exp(-Infinity), +0); + + +// Not guaranteed by the specification, but generally assumed to hold. + +// If x is 1, the result is Math.E. +assert.sameValue(Math.exp(1), Math.E); + +// If x is -1, the result is 1/Math.E. +assert.sameValue(Math.exp(-1), 1 / Math.E); + + diff --git a/test/staging/sm/Math/expm1-approx.js b/test/staging/sm/Math/expm1-approx.js new file mode 100644 index 0000000000..ef7f34c7df --- /dev/null +++ b/test/staging/sm/Math/expm1-approx.js @@ -0,0 +1,72 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-Math-shell.js, sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +assertNear(Math.expm1(1e-300), 1e-300); +assertNear(Math.expm1(1e-100), 1e-100); +assertNear(Math.expm1(1e-14), 1.000000000000005e-14); +assertNear(Math.expm1(1e-6), 0.0000010000005000001665); + +var expm1_data = [ + [ -1.875817529344e-70, -1.875817529344e-70 ], + [ -7.09962844069878e-15, -7.099628440698755e-15 ], + [ -2.114990849122478e-10, -2.1149908488988187e-10 ], + [ -0.0000031404608812881633, -0.000003140455950046052 ], + + [ -0.0000011039855962733358, -0.0000011039849868814618 ], + [ -0.000015114666893502755, -0.0000151145526675006 ], + [ -0.000033870281179478836, -0.000033869707587981166 ], + [ -0.00043952149320897676, -0.00043942491778698985 ], + [ -0.005553725496786973, -0.005538332073473123 ], + [ -0.05122020579778827, -0.049930563302241604 ], + [ -0.4721357117742938, -0.3763311320344197 ], + [ -1.2781607348262256, -0.7214508446489242 ], + + [ 1.875817529344e-70, 1.875817529344e-70 ], + [ 6.261923313140869e-30, 6.261923313140869e-30 ], + [ 7.09962844069878e-15, 7.099628440698805e-15 ], + [ 1.3671879628418538e-12, 1.3671879628427884e-12 ], + [ 2.114990849122478e-10, 2.1149908493461373e-10 ], + [ 1.6900931765206906e-8, 1.6900931908027652e-8 ], + [ 0.0000031404608812881633, 0.0000031404658125405988 ], + + [ 0.0000011039855962733358, 0.0000011039862056656584 ], + [ 0.000015114666893502755, 0.000015114781120655907 ], + [ 0.000033870281179478836, 0.00003387085478392845 ], + [ 0.00043952149320897676, 0.0004396180969330924 ], + [ 0.005553725496786973, 0.005569176019645543 ], + [ 0.05122020579778827, 0.05255464640120383 ], + [ 0.4721357117742938, 0.6034149712523235 ], + [ 1.2781607348262256, 2.590030631181154 ], + + [ 3.0693960800487883, 20.528897017773147 ], + [ 5.560441648750136, 258.9376120972927 ], + [ 7.4227656046482595, 1672.6557833191303 ], + [ 11.378926299184645, 87458.07941992789 ], +]; + +for (var [x, y] of expm1_data) + assertNear(Math.expm1(x), y); + +var sloppy_tolerance = 34; + +var expm1_data_sloppy = [ + [ 20.11881628179155, 546375092.2355127 ], + [ 33.45034324980283, 336743709091858.2 ], + [ 46.43974518513109, 147409364838076710000 ], + [ 54.60105936314322, 5.163435870507142e+23 ], + [ 84.29619209850242, 4.067907545704549e+36 ], + [ 125.38131800315817, 2.8340959047812913e+54 ], + [ 216.85489905212918, 1.5096839294759775e+94 ], +]; + +for (var [x, y] of expm1_data_sloppy) + assertNear(Math.expm1(x), y, sloppy_tolerance); + diff --git a/test/staging/sm/Math/expm1-exact.js b/test/staging/sm/Math/expm1-exact.js new file mode 100644 index 0000000000..5417855762 --- /dev/null +++ b/test/staging/sm/Math/expm1-exact.js @@ -0,0 +1,29 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-Math-shell.js, sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +// Properties of Math.expm1 that are guaranteed by the spec. + +// If x is NaN, the result is NaN. +assert.sameValue(Math.expm1(NaN), NaN); + +// If x is +0, the result is +0. +assert.sameValue(Math.expm1(+0), +0); + +// If x is −0, the result is −0. +assert.sameValue(Math.expm1(-0), -0); + +// If x is +∞, the result is +∞. +assert.sameValue(Math.expm1(Infinity), Infinity); + +// If x is −∞, the result is -1. +assert.sameValue(Math.expm1(-Infinity), -1); + + diff --git a/test/staging/sm/Math/expm1-monotonicity.js b/test/staging/sm/Math/expm1-monotonicity.js new file mode 100644 index 0000000000..86ee775158 --- /dev/null +++ b/test/staging/sm/Math/expm1-monotonicity.js @@ -0,0 +1,103 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-Math-shell.js, sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +var BUGNUMBER = 897634; +var summary = "expm1 should be monotonically increasing"; + +print(BUGNUMBER + ": " + summary); + +function test(x, prev, next) { + assert.sameValue(Math.expm1(prev) <= Math.expm1(x), true); + assert.sameValue(Math.expm1(x) <= Math.expm1(next), true); +} + +// Thresholds in fdlibm expm1 implementation. + +// |hx| == 0x40862E42 or not +test(-709.7822265625, -709.7822265625001, -709.7822265624999); +test(709.7822265625, 709.7822265624999, 709.7822265625001); + +// |hx| == 0x4043687A or not +test(-38.81622314453125, -38.81622314453126, -38.81622314453124); +test(38.81622314453125, 38.81622314453124, 38.81622314453126); + +// |hx| == 0x7ff00000 or not +test(-1.7976931348623157e+308, -Infinity, -1.7976931348623155e+308); +test(1.7976931348623157e+308, 1.7976931348623155e+308, Infinity); + +// |hx| == 0x3fd62e42 or not +test(-0.3465733528137207, -0.34657335281372076, -0.34657335281372065); +test(0.3465733528137207, 0.34657335281372065, 0.34657335281372076); + +// |hx| == 0x3FF0A2B2 or not +test(-1.0397205352783203, -1.0397205352783205, -1.03972053527832); +test(1.0397205352783203, 1.03972053527832, 1.0397205352783205); + +// |hx| == 0x3c900000 or not +test(-5.551115123125783e-17, -5.551115123125784e-17, -5.551115123125782e-17); +test(5.551115123125783e-17, 5.551115123125782e-17, 5.551115123125784e-17); + +// x < -0.25 or not +test(-0.25, -0.25000000000000006, -0.24999999999999997); + +// k == -1 or k == -2 +test(-1.0397207708399179, -1.039720770839918, -1.0397207708399177); + +// k == -1 or k == 0 +test(-0.3465735912322998, -0.34657359123229986, -0.34657359123229975); + +// k == 0 or k == 1 +test(0.3465735912322998, 0.34657359123229975, 0.34657359123229986); + +// k == 1 or k == 2 +test(1.039720770839918, 1.0397207708399179, 1.0397207708399183); + +// k == 19 or k == 20 +test(13.516370020918933, 13.51637002091893, 13.516370020918934); + +// k == 56 or k == 57 +test(39.16281570163691, 39.1628157016369, 39.162815701636916); + +// k == 1023 or k == 1024 +test(709.436139303104, 709.4361393031039, 709.4361393031041); + +// k == 1024 or more +test(709.7827128933841, 709.782712893384, 709.7827128933842); + +// Some more random cases. +test(-1.7976931348623157e+308, -Infinity, -1.7976931348623155e+308); +test(-1e+223, -1.0000000000000002e+223, -9.999999999999999e+222); +test(-1e+100, -1.0000000000000002e+100, -9.999999999999998e+99); +test(-10000000000, -10000000000.000002, -9999999999.999998); +test(-100000, -100000.00000000001, -99999.99999999999); +test(-100, -100.00000000000001, -99.99999999999999); +test(-10, -10.000000000000002, -9.999999999999998); +test(-1, -1, -0.9999999999999999); +test(-0.01, -0.010000000000000002, -0.009999999999999998); +test(-0.00001, -0.000010000000000000003, -0.000009999999999999999); +test(-1e-10, -1.0000000000000002e-10, -9.999999999999999e-11); +test(-1e-100, -1.0000000000000001e-100, -9.999999999999999e-101); +test(-5e-324, -1e-323, 0); +test(0, -5e-324, 5e-324); +test(5e-324, 0, 1e-323); +test(1e-100, 9.999999999999999e-101, 1.0000000000000001e-100); +test(1e-10, 9.999999999999999e-11, 1.0000000000000002e-10); +test(0.00001, 0.000009999999999999999, 0.000010000000000000003); +test(0.01, 0.009999999999999998, 0.010000000000000002); +test(1, 0.9999999999999999, 1); +test(10, 9.999999999999998, 10.000000000000002); +test(100, 99.99999999999999, 100.00000000000001); +test(100000, 99999.99999999999, 100000.00000000001); +test(10000000000, 9999999999.999998, 10000000000.000002); +test(1e+100, 9.999999999999998e+99, 1.0000000000000002e+100); +test(1e+223, 9.999999999999999e+222, 1.0000000000000002e+223); +test(1.7976931348623157e+308, 1.7976931348623155e+308, Infinity); + diff --git a/test/staging/sm/Math/f16round.js b/test/staging/sm/Math/f16round.js new file mode 100644 index 0000000000..011908ad72 --- /dev/null +++ b/test/staging/sm/Math/f16round.js @@ -0,0 +1,164 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-Math-shell.js, sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ + +// Some tests regarding conversion to Float16 +assert.sameValue(Math.f16round(), NaN); + +// Special values +assert.sameValue(Math.f16round(NaN), NaN); +assert.sameValue(Math.f16round(-Infinity), -Infinity); +assert.sameValue(Math.f16round(Infinity), Infinity); +assert.sameValue(Math.f16round(-0), -0); +assert.sameValue(Math.f16round(+0), +0); + +// Polyfill function for Float16 conversion, adapted from +// https://github.com/petamoriken/float16/. +// The original license is preseved below. +function toFloat16(num) { + // MIT License + + // Copyright (c) 2017-2024 Kenta Moriuchi + + // Permission is hereby granted, free of charge, to any person obtaining a copy + // of this software and associated documentation files (the "Software"), to deal + // in the Software without restriction, including without limitation the rights + // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + // copies of the Software, and to permit persons to whom the Software is + // furnished to do so, subject to the following conditions: + + // The above copyright notice and this permission notice shall be included in all + // copies or substantial portions of the Software. + + // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + // SOFTWARE. + + const INVERSE_OF_EPSILON = 1 / Number.EPSILON; + + /** + * rounds to the nearest value; + * if the number falls midway, it is rounded to the nearest value with an even least significant digit + * @param {number} num + * @returns {number} + */ + function roundTiesToEven(num) { + return (num + INVERSE_OF_EPSILON) - INVERSE_OF_EPSILON; + } + + const FLOAT16_MIN_VALUE = 6.103515625e-05; + const FLOAT16_MAX_VALUE = 65504; + const FLOAT16_EPSILON = 0.0009765625; + + const FLOAT16_EPSILON_MULTIPLIED_BY_FLOAT16_MIN_VALUE = FLOAT16_EPSILON * FLOAT16_MIN_VALUE; + const FLOAT16_EPSILON_DEVIDED_BY_EPSILON = FLOAT16_EPSILON * INVERSE_OF_EPSILON; + + function roundToFloat16(num) { + const number = +num; + + // NaN, Infinity, -Infinity, 0, -0 + if (!isFinite(number) || number === 0) { + return number; + } + + // finite except 0, -0 + const sign = number > 0 ? 1 : -1; + const absolute = Math.abs(number); + + // small number + if (absolute < FLOAT16_MIN_VALUE) { + return sign * roundTiesToEven(absolute / FLOAT16_EPSILON_MULTIPLIED_BY_FLOAT16_MIN_VALUE) * FLOAT16_EPSILON_MULTIPLIED_BY_FLOAT16_MIN_VALUE; + } + + const temp = (1 + FLOAT16_EPSILON_DEVIDED_BY_EPSILON) * absolute; + const result = temp - (temp - absolute); + + // large number + if (result > FLOAT16_MAX_VALUE || isNaN(result)) { + return sign * Infinity; + } + + return sign * result; + } + + return roundToFloat16(num); +}; + +// A test on a certain range of numbers, including big numbers, so that +// we get a loss in precision for some of them. +for (var i = 0; i < 64; ++i) { + var p = Math.pow(2, i) + 1; + assert.sameValue(Math.f16round(p), toFloat16(p)); + assert.sameValue(Math.f16round(-p), toFloat16(-p)); +} + +/******************************************** +/* Tests on maximal Float16 / Double values * +/*******************************************/ +function maxValue(exponentWidth, significandWidth) { + var n = 0; + var maxExp = Math.pow(2, exponentWidth - 1) - 1; + for (var i = significandWidth; i >= 0; i--) + n += Math.pow(2, maxExp - i); + return n; +} + +var DBL_MAX = maxValue(11, 52); +assert.sameValue(DBL_MAX, Number.MAX_VALUE); // sanity check + +// Finite as a double, too big for a float16 +assert.sameValue(Math.f16round(DBL_MAX), Infinity); + +var FLT16_MAX = maxValue(5, 10); +assert.sameValue(Math.f16round(FLT16_MAX), FLT16_MAX); +assert.sameValue(Math.f16round(65519), FLT16_MAX); // round-nearest rounds down to FLT16_MAX +assert.sameValue(Math.f16round(65520), Infinity); // no longer rounds down to FLT16_MAX + +/********************************************************* +/******* Tests on denormalizations and roundings ********* +/********************************************************/ +function minValue(exponentWidth, significandWidth) { + return Math.pow(2, -(Math.pow(2, exponentWidth - 1) - 2) - significandWidth); +} + +var DBL_MIN = Math.pow(2, -1074); +assert.sameValue(DBL_MIN, Number.MIN_VALUE); // sanity check + +// Too small for a float16 +assert.sameValue(Math.f16round(DBL_MIN), 0); + +var FLT16_MIN = minValue(5, 10); +assert.sameValue(Math.f16round(FLT16_MIN), FLT16_MIN); + +assert.sameValue(Math.f16round(FLT16_MIN / 2), 0); // halfway, round-nearest rounds down to 0 (even) + +// FLT16_MIN + a small amount rounds up to FLT16_MIN +// Constant taken from https://github.com/petamoriken/float16/ +assert.sameValue(Math.f16round(2.980232238769531911744490042422139897126953655970282852649688720703125e-8), FLT16_MIN); + +assert.sameValue(Math.f16round(-FLT16_MIN), -FLT16_MIN); +assert.sameValue(Math.f16round(-FLT16_MIN / 2), -0); // halfway, round-nearest rounds up to -0 (even) +// -FLT16_MIN - a small amount rounds down to -FLT16_MIN +// Constant taken from https://github.com/petamoriken/float16/ +assert.sameValue(Math.f16round(2.980232238769531911744490042422139897126953655970282852649688720703125e-8), FLT16_MIN); + +// Test some constants from https://github.com/petamoriken/float16/ +assert.sameValue(Math.f16round(0.499994), 0.5); +assert.sameValue(Math.f16round(1.337), 1.3369140625); + +// This will round incorrectly if the implementation first rounds to Float32, +// then to Float16 +assert.sameValue(Math.f16round(1.00048828125000022204), 1.0009765625); + diff --git a/test/staging/sm/Math/fround.js b/test/staging/sm/Math/fround.js new file mode 100644 index 0000000000..58f6817f58 --- /dev/null +++ b/test/staging/sm/Math/fround.js @@ -0,0 +1,88 @@ +/* + * Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/licenses/publicdomain/ + */ + +/*--- +includes: [sm/non262-Math-shell.js, sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +// Some tests regarding conversion to Float32 +assert.sameValue(Math.fround(), NaN); + +// Special values +assert.sameValue(Math.fround(NaN), NaN); +assert.sameValue(Math.fround(-Infinity), -Infinity); +assert.sameValue(Math.fround(Infinity), Infinity); +assert.sameValue(Math.fround(-0), -0); +assert.sameValue(Math.fround(+0), +0); + +// Polyfill function for Float32 conversion +var toFloat32 = (function() { + var f32 = new Float32Array(1); + function f(x) { + f32[0] = x; + return f32[0]; + } + return f; +})(); + +// A test on a certain range of numbers, including big numbers, so that +// we get a loss in precision for some of them. +for (var i = 0; i < 64; ++i) { + var p = Math.pow(2, i) + 1; + assert.sameValue(Math.fround(p), toFloat32(p)); + assert.sameValue(Math.fround(-p), toFloat32(-p)); +} + +/******************************************** +/* Tests on maximal Float32 / Double values * +/*******************************************/ +function maxValue(exponentWidth, significandWidth) { + var n = 0; + var maxExp = Math.pow(2, exponentWidth - 1) - 1; + for (var i = significandWidth; i >= 0; i--) + n += Math.pow(2, maxExp - i); + return n; +} + +var DBL_MAX = maxValue(11, 52); +assert.sameValue(DBL_MAX, Number.MAX_VALUE); // sanity check + +// Finite as a double, too big for a float +assert.sameValue(Math.fround(DBL_MAX), Infinity); + +var FLT_MAX = maxValue(8, 23); +assert.sameValue(Math.fround(FLT_MAX), FLT_MAX); +assert.sameValue(Math.fround(FLT_MAX + Math.pow(2, Math.pow(2, 8 - 1) - 1 - 23 - 2)), FLT_MAX); // round-nearest rounds down to FLT_MAX +assert.sameValue(Math.fround(FLT_MAX + Math.pow(2, Math.pow(2, 8 - 1) - 1 - 23 - 1)), Infinity); // no longer rounds down to FLT_MAX + +/********************************************************* +/******* Tests on denormalizations and roundings ********* +/********************************************************/ + +function minValue(exponentWidth, significandWidth) { + return Math.pow(2, -(Math.pow(2, exponentWidth - 1) - 2) - significandWidth); +} + +var DBL_MIN = Math.pow(2, -1074); +assert.sameValue(DBL_MIN, Number.MIN_VALUE); // sanity check + +// Too small for a float +assert.sameValue(Math.fround(DBL_MIN), 0); + +var FLT_MIN = minValue(8, 23); +assert.sameValue(Math.fround(FLT_MIN), FLT_MIN); + +assert.sameValue(Math.fround(FLT_MIN / 2), 0); // halfway, round-nearest rounds down to 0 (even) +assert.sameValue(Math.fround(FLT_MIN / 2 + Math.pow(2, -202)), FLT_MIN); // first double > FLT_MIN / 2, rounds up to FLT_MIN + +assert.sameValue(Math.fround(-FLT_MIN), -FLT_MIN); + +assert.sameValue(Math.fround(-FLT_MIN / 2), -0); // halfway, round-nearest rounds up to -0 (even) +assert.sameValue(Math.fround(-FLT_MIN / 2 - Math.pow(2, -202)), -FLT_MIN); // first double < -FLT_MIN / 2, rounds down to -FLT_MIN + diff --git a/test/staging/sm/Math/log10-approx.js b/test/staging/sm/Math/log10-approx.js new file mode 100644 index 0000000000..1e141651bb --- /dev/null +++ b/test/staging/sm/Math/log10-approx.js @@ -0,0 +1,18 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-Math-shell.js, sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +assertNear(Math.log10(2), 0.3010299956639812); +assertNear(Math.log10(7), 0.8450980400142568); +assertNear(Math.log10(Math.E), Math.LOG10E); + +for (var i = -10; i < 10; i++) + assertNear(Math.log10(Math.pow(10, i)), i); + diff --git a/test/staging/sm/Math/log10-exact.js b/test/staging/sm/Math/log10-exact.js new file mode 100644 index 0000000000..ec076b365d --- /dev/null +++ b/test/staging/sm/Math/log10-exact.js @@ -0,0 +1,40 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-Math-shell.js, sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +// Properties of Math.log10 that are guaranteed by the spec. + +// If x is NaN, the result is NaN. +assert.sameValue(Math.log10(NaN), NaN); + +// If x is less than 0, the result is NaN. +assert.sameValue(Math.log10(-1e-10), NaN); +assert.sameValue(Math.log10(-1e-5), NaN); +assert.sameValue(Math.log10(-1e-1), NaN); +assert.sameValue(Math.log10(-Number.MIN_VALUE), NaN); +assert.sameValue(Math.log10(-Number.MAX_VALUE), NaN); +assert.sameValue(Math.log10(-Infinity), NaN); + +for (var i = -1; i > -10; i--) + assert.sameValue(Math.log10(i), NaN); + +// If x is +0, the result is −∞. +assert.sameValue(Math.log10(+0), -Infinity); + +// If x is −0, the result is −∞. +assert.sameValue(Math.log10(-0), -Infinity); + +// If x is 1, the result is +0. +assert.sameValue(Math.log10(1), +0); + +// If x is +∞, the result is +∞. +assert.sameValue(Math.log10(Infinity), Infinity); + + diff --git a/test/staging/sm/Math/log1p-approx.js b/test/staging/sm/Math/log1p-approx.js new file mode 100644 index 0000000000..d4e10db4bc --- /dev/null +++ b/test/staging/sm/Math/log1p-approx.js @@ -0,0 +1,30 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-Math-shell.js, sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +assertNear(Math.log1p(1e-300), 1e-300); +assertNear(Math.log1p(1e-15), 9.999999999999995e-16); +assertNear(Math.log1p(1e-6), 9.999995000003334e-7); + +var log1p_data = [ + [ 1.875817529344e-70, 1.875817529344e-70 ], + [ 6.261923313140869e-30, 6.261923313140869e-30 ], + [ 7.09962844069878e-15, 7.099628440698755e-15 ], + [ 1.3671879628418538e-12, 1.3671879628409192e-12 ], + [ 2.114990849122478e-10, 2.1149908488988187e-10 ], + [ 1.6900931765206906e-8, 1.690093162238616e-8 ], + [ 0.0000709962844069878, 0.00007099376429006658 ], + [ 0.0016793412882520897, 0.00167793277137076 ], + [ 0.011404608812881634, 0.011340066517988035 ], +]; + +for (var [x, y] of log1p_data) + assertNear(Math.log1p(x), y); + diff --git a/test/staging/sm/Math/log1p-exact.js b/test/staging/sm/Math/log1p-exact.js new file mode 100644 index 0000000000..981635d7d1 --- /dev/null +++ b/test/staging/sm/Math/log1p-exact.js @@ -0,0 +1,38 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-Math-shell.js, sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +// Properties of Math.log1p that are guaranteed by the spec. + +// If x is NaN, the result is NaN. +assert.sameValue(Math.log1p(NaN), NaN); + +// If x is less than -1, the result is NaN. +assert.sameValue(Math.log1p(-1 - 1e-10), NaN); +assert.sameValue(Math.log1p(-1 - 1e-5), NaN); +assert.sameValue(Math.log1p(-1 - 1e-1), NaN); +assert.sameValue(Math.log1p(-ONE_PLUS_EPSILON), NaN); + +for (var i = -2; i > -20; i--) + assert.sameValue(Math.log1p(i), NaN); + +// If x is -1, the result is -∞. +assert.sameValue(Math.log1p(-1), -Infinity); + +// If x is +0, the result is +0. +assert.sameValue(Math.log1p(+0), +0); + +// If x is −0, the result is −0. +assert.sameValue(Math.log1p(-0), -0); + +// If x is +∞, the result is +∞. +assert.sameValue(Math.log1p(Infinity), Infinity); + + diff --git a/test/staging/sm/Math/log2-approx.js b/test/staging/sm/Math/log2-approx.js new file mode 100644 index 0000000000..239f7ffa69 --- /dev/null +++ b/test/staging/sm/Math/log2-approx.js @@ -0,0 +1,18 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-Math-shell.js, sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +for (var i = -1074; i < 1023; i++) + assertNear(Math.log2(Math.pow(2, i)), i); + +assertNear(Math.log2(5), 2.321928094887362); +assertNear(Math.log2(7), 2.807354922057604); +assertNear(Math.log2(Math.E), Math.LOG2E); + diff --git a/test/staging/sm/Math/log2-exact.js b/test/staging/sm/Math/log2-exact.js new file mode 100644 index 0000000000..5bb01e9619 --- /dev/null +++ b/test/staging/sm/Math/log2-exact.js @@ -0,0 +1,40 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-Math-shell.js, sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +// Properties of Math.log2 that are guaranteed by the spec. + +// If x is NaN, the result is NaN. +assert.sameValue(Math.log2(NaN), NaN); + +// If x is less than 0, the result is NaN. +assert.sameValue(Math.log2(-1e-10), NaN); +assert.sameValue(Math.log2(-1e-5), NaN); +assert.sameValue(Math.log2(-1e-1), NaN); +assert.sameValue(Math.log2(-Number.MIN_VALUE), NaN); +assert.sameValue(Math.log2(-Number.MAX_VALUE), NaN); +assert.sameValue(Math.log2(-Infinity), NaN); + +for (var i = -1; i > -10; i--) + assert.sameValue(Math.log2(i), NaN); + +// If x is +0, the result is −∞. +assert.sameValue(Math.log2(+0), -Infinity); + +// If x is −0, the result is −∞. +assert.sameValue(Math.log2(-0), -Infinity); + +// If x is 1, the result is +0. +assert.sameValue(Math.log2(1), +0); + +// If x is +∞, the result is +∞. +assert.sameValue(Math.log2(Infinity), Infinity); + + diff --git a/test/staging/sm/Math/sign.js b/test/staging/sm/Math/sign.js new file mode 100644 index 0000000000..40607e8512 --- /dev/null +++ b/test/staging/sm/Math/sign.js @@ -0,0 +1,44 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-Math-shell.js, sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +// If x is NaN, the result is NaN. +assert.sameValue(Math.sign(NaN), NaN); + +// If x is −0, the result is −0. +assert.sameValue(Math.sign(-0), -0); + +// If x is +0, the result is +0. +assert.sameValue(Math.sign(+0), +0); + +// If x is negative and not −0, the result is −1. +assert.sameValue(Math.sign(-Number.MIN_VALUE), -1); +assert.sameValue(Math.sign(-Number.MAX_VALUE), -1); +assert.sameValue(Math.sign(-Infinity), -1); + +for (var i = -1; i > -20; i--) + assert.sameValue(Math.sign(i), -1); + +assert.sameValue(Math.sign(-1e-300), -1); +assert.sameValue(Math.sign(-0x80000000), -1); + +// If x is positive and not +0, the result is +1. +assert.sameValue(Math.sign(Number.MIN_VALUE), +1); +assert.sameValue(Math.sign(Number.MAX_VALUE), +1); +assert.sameValue(Math.sign(Infinity), +1); + +for (var i = 1; i < 20; i++) + assert.sameValue(Math.sign(i), +1); + +assert.sameValue(Math.sign(+1e-300), +1); +assert.sameValue(Math.sign(0x80000000), +1); +assert.sameValue(Math.sign(0xffffffff), +1); + + diff --git a/test/staging/sm/Math/sinh-approx.js b/test/staging/sm/Math/sinh-approx.js new file mode 100644 index 0000000000..d46204e125 --- /dev/null +++ b/test/staging/sm/Math/sinh-approx.js @@ -0,0 +1,306 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-Math-shell.js, sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +for (var i = -20; i < 20; i++) + assertNear(Math.sinh(i), (Math.exp(i) - Math.exp(-i)) / 2); + +assert.sameValue(Math.sinh(1000), Infinity); +assert.sameValue(Math.sinh(Number.MAX_VALUE), Infinity); +assertNear(Math.sinh(1e-30), 1e-30); +assertNear(Math.sinh(1e-10), 1e-10); + +var sinh_data = [ + [-6.902103625349695, -497.1816406250001], + [-6.898143347143859, -495.21655273437517], + [-6.883664481302669, -488.0980224609375], + [-6.880304842490273, -486.46093750000006], + [-6.871561546509046, -482.2261962890624], + [-6.841973895837549, -468.167236328125], + [-6.836376331805493, -465.5539550781251], + [-6.833654100575195, -464.2883300781251], + [-6.8320816635009045, -463.55883789062483], + [-6.8108680173663085, -453.82861328125], + [-6.799689165151487, -448.78356933593756], + [-6.793579326246197, -446.0499267578126], + [-6.762510387544996, -432.4046630859374], + [-6.743225720989222, -424.14575195312506], + [-6.691758395994307, -402.86828613281244], + [-6.690743430063694, -402.4595947265625], + [-6.6596501292114505, -390.1383056640624], + [-6.652956360641761, -387.5355224609375], + [-6.635954365364267, -381.00231933593767], + [-6.619587562578274, -374.81726074218744], + [-6.617681179427804, -374.10339355468744], + [-6.614762741096185, -373.0131835937501], + [-6.60690568753706, -370.0938720703124], + [-6.591738907156094, -364.5230712890626], + [-6.583066984213974, -361.3756103515625], + [-6.573999516974134, -358.1136474609374], + [-6.553610904389896, -350.8861083984376], + [-6.553097634736138, -350.7060546875001], + [-6.538320325468202, -345.56164550781267], + [-6.529090881007076, -342.386962890625], + [-6.527791927233787, -341.94250488281256], + [-6.514383886150781, -337.38830566406244], + [-6.488639771044976, -328.8133544921875], + [-6.480460592697477, -326.13488769531256], + [-6.439759999015992, -313.1274414062499], + [-6.434927968512049, -311.61804199218744], + [-6.4082177348965725, -303.4047851562501], + [-6.369671035834965, -291.93200683593756], + [-6.362310184909175, -289.79101562500006], + [-6.356373428913315, -288.0756835937499], + [-6.337756593913614, -282.76220703125006], + [-6.32424009706147, -278.96594238281256], + [-6.314232650754295, -276.18811035156256], + [-6.290994606392703, -269.8439941406249], + [-6.240182555852785, -256.4750976562499], + [-6.2102675039793604, -248.9161987304687], + [-6.197335184435549, -245.71783447265628], + [-6.194021350132335, -244.90490722656253], + [-6.184119163536406, -242.4917602539062], + [-6.104686221071835, -223.97491455078116], + [-6.100669325836893, -223.07702636718747], + [-6.093582856519022, -221.50177001953122], + [-6.0598807500687935, -214.16101074218741], + [-6.0062142965262515, -202.97058105468741], + [-5.9923121073369945, -200.1683349609375], + [-5.981859446096083, -198.08691406249997], + [-5.9497792165852905, -191.83300781250006], + [-5.90509449745879, -183.44958496093747], + [-5.902097012275789, -182.90051269531256], + [-5.8144483910067954, -167.55175781250006], + [-5.786154254111214, -162.8773803710938], + [-5.765917008989405, -159.61425781250006], + [-5.703902219845274, -150.0162963867188], + [-5.6926689504460395, -148.34051513671872], + [-5.685206387751923, -147.23760986328122], + [-5.660572815631807, -143.6548461914062], + [-5.625516713960633, -138.70599365234375], + [-5.476934234171879, -119.55416870117192], + [-5.467584665632571, -118.4415588378906], + [-5.417932675603434, -112.70410156250004], + [-5.406565756574079, -111.43020629882811], + [-5.373195678988387, -107.77297973632808], + [-5.3723285712183735, -107.67956542968749], + [-5.348004040102253, -105.09179687499999], + [-5.31087758970896, -101.261474609375], + [-5.255348419702703, -95.79150390624997], + [-5.206986845736275, -91.26885986328122], + [-5.162914035396619, -87.33349609375003], + [-5.052952927749896, -78.23873901367186], + [-5.048772883924985, -77.91235351562501], + [-5.034848487644809, -76.83489990234378], + [-4.808269821238499, -61.25564575195312], + [-4.689849459883311, -54.413803100585945], + [-4.476720236388958, -43.96719360351561], + [-4.431216695067421, -42.01084899902342], + [-4.114720236218123, -30.60937499999999], + [-3.9785790831656023, -26.711166381835938], + [-3.9220215830953484, -25.24131774902344], + [-3.3770026324620295, -14.624359130859379], + [-3.214961448471211, -12.431087493896483], + [-3.021397455139021, -10.235607147216797], + [-2.937831931335705, -9.41094970703125], + [-1.267878515574959, -1.6359391212463381], + [1.6504814008555524e-12, 1.6504814008555524e-12], + [2.0654207510961697e-12, 2.0654207510961697e-12], + [6.933230031758164e-12, 6.933230031758164e-12], + [1.3351444949627478e-11, 1.3351444949627478e-11], + [1.6399812063916386e-11, 1.6399812063916386e-11], + [5.730159402528301e-11, 5.730159402528301e-11], + [1.113731329382972e-10, 1.113731329382972e-10], + [1.4214707189097453e-10, 1.4214707189097453e-10], + [3.8006320313144215e-10, 3.8006320313144215e-10], + [6.09162720266454e-10, 6.09162720266454e-10], + [1.0221641311147778e-9, 1.0221641311147778e-9], + [2.8819222563924995e-9, 2.8819222563924995e-9], + [4.7627768395841485e-9, 4.7627768395841485e-9], + [8.854133426439148e-9, 8.854133426439148e-9], + [2.305032609228874e-8, 2.3050326092288742e-8], + [5.939249092534734e-8, 5.9392490925347374e-8], + [1.1667648891489053e-7, 1.166764889148908e-7], + [2.379967440901942e-7, 2.3799674409019644e-7], + [4.6846594159431437e-7, 4.684659415943315e-7], + [9.382699772685088e-7, 9.382699772686465e-7], + [0.0000011039855962733358, 0.00000110398559627356], + [0.000003291776010877096, 0.0000032917760108830407], + [0.000007517213816683722, 0.00000751721381675452], + [0.000015114666893502755, 0.000015114666894078255], + [0.00002986399339999406, 0.00002986399340443313], + [0.000033870281179478836, 0.00003387028118595481], + [0.00009066011977069884, 0.00009066011989489198], + [0.00021949532498377364, 0.00021949532674625516], + [0.00043952149320897676, 0.00043952150736004114], + [0.0006333151408864353, 0.0006333151832222939], + [0.0011151230445582744, 0.001115123275667429], + [0.0019624658370807177, 0.001962467096745968], + [0.005553725496786973, 0.005553754046559334], + [0.008691018931968294, 0.008691128343343735], + [0.02992889492062484, 0.02993336319923401], + [0.05122020579778827, 0.05124260485172272], + [0.1117800293787828, 0.11201295256614685], + [0.23269806521543376, 0.23480379581451416], + [0.4721357117742938, 0.4898730516433716], + [0.694611571189336, 0.7518312931060792], + [1.2781607348262256, 1.6557407379150393], + [1.9917262343245115, 3.5958566665649414], + [2.009484184971722, 3.6627054214477544], + [2.128787712416205, 4.142845153808595], + [2.4846967934155475, 5.95706558227539], + [3.083125584533294, 10.890350341796875], + [4.002981567623351, 27.3714599609375], + [4.080736210902826, 29.586067199707028], + [4.120845430011113, 30.79753875732421], + [4.351258506393416, 38.78157043457031], + [4.540883728536112, 46.88148498535155], + [4.547981853382592, 47.21551513671875], + [4.5480891170767, 47.220581054687514], + [4.599728302509061, 49.72361755371096], + [4.8131842711857535, 61.557464599609396], + [4.910082619934558, 67.82162475585939], + [4.924747230639767, 68.82363891601564], + [4.993937439635391, 73.75466918945312], + [5.087099712053554, 80.95669555664065], + [5.1389346970196295, 85.26406860351562], + [5.138977285472121, 85.26770019531251], + [5.223879832616765, 92.82385253906247], + [5.241812789460327, 94.50357055664062], + [5.447141014648796, 116.04467773437499], + [5.511633288238573, 123.77554321289061], + [5.578681289305598, 132.3592529296875], + [5.633110296634631, 139.76330566406253], + [5.662701238627725, 143.96093750000003], + [5.678906941005323, 146.31298828124997], + [5.737214893086866, 155.0980224609375], + [5.739660763047893, 155.4778442382812], + [5.741349685869528, 155.74066162109372], + [5.790614371552514, 163.60546874999994], + [5.879059869096351, 178.73510742187494], + [5.884458728291027, 179.70269775390622], + [5.885109945587401, 179.8197631835937], + [5.893636014368936, 181.35949707031256], + [5.965274032538233, 194.82861328125003], + [5.967346683696556, 195.23284912109375], + [5.986843466070591, 199.07666015624994], + [6.019932686217942, 205.77423095703134], + [6.021252909681261, 206.0460815429687], + [6.037231102920489, 209.36480712890634], + [6.043606439928324, 210.70385742187506], + [6.06478541011501, 215.21398925781244], + [6.112974120371601, 225.83892822265622], + [6.117902255760311, 226.95465087890622], + [6.1433256889594094, 232.79864501953136], + [6.176483527820343, 240.64721679687503], + [6.186757751007361, 243.13244628906241], + [6.219667373726848, 251.26702880859372], + [6.229418088083555, 253.72906494140634], + [6.233184983047428, 254.68664550781241], + [6.243005711460192, 257.20019531250006], + [6.245102704489327, 257.74011230468744], + [6.260468857392134, 261.73120117187506], + [6.268152459140511, 263.74999999999994], + [6.2748285545831655, 265.5167236328125], + [6.305976070434008, 273.9171142578125], + [6.32399546069982, 278.8977050781249], + [6.324961403980197, 279.16723632812506], + [6.370613506132747, 292.20727539062494], + [6.375359978930309, 293.59753417968744], + [6.3766447200146, 293.9749755859376], + [6.380802563199264, 295.19982910156244], + [6.387824152942429, 297.27990722656244], + [6.390003820200831, 297.9285888671876], + [6.3905985680679, 298.10583496093744], + [6.397866642974941, 300.2803955078125], + [6.421725738171608, 307.5310058593751], + [6.423818963102848, 308.17541503906244], + [6.428865255911759, 309.7344970703124], + [6.443449261058927, 314.28479003906244], + [6.444844602076255, 314.7236328125], + [6.464094341970107, 320.84069824218756], + [6.465356699668166, 321.24597167968744], + [6.467400466944125, 321.90319824218756], + [6.472218114936839, 323.457763671875], + [6.4947499213823265, 330.8286132812501], + [6.507305446835735, 335.00854492187483], + [6.524202033435675, 340.71716308593756], + [6.546694993078936, 348.46777343749994], + [6.548591493378012, 349.1292724609374], + [6.613194950203132, 372.4288330078126], + [6.6247505436339065, 376.7574462890626], + [6.629181796246806, 378.43066406249994], + [6.6616087711302185, 390.9031982421874], + [6.698989091751707, 405.79187011718744], + [6.702857353572475, 407.3646240234375], + [6.717505881986416, 413.37585449218756], + [6.723197804327891, 415.73547363281256], + [6.726699007993023, 417.1936035156251], + [6.735483889307782, 420.87475585937483], + [6.755219602793124, 429.26354980468756], + [6.756366380816258, 429.75610351562506], + [6.766177290841293, 433.99316406250006], + [6.766217511883346, 434.01062011718767], + [6.780091308338912, 440.0739746093749], + [6.802889310303153, 450.22204589843744], + [6.813484439494547, 455.017578125], + [6.818196843455478, 457.16687011718744], + [6.818940201487998, 457.50683593749994], + [6.822833193143805, 459.29138183593756], + [6.82327083544577, 459.49243164062506], + [6.823817951018, 459.743896484375], + [6.834945773756887, 464.8884277343749], + [6.835113285253827, 464.96630859375017], + [6.840964582694129, 467.6949462890624], + [6.84346890521034, 468.86767578125017], + [6.847141429556457, 470.5927734375002], + [6.869243403190376, 481.10961914062483], + [6.882355637062964, 487.4595947265624], + [6.884531678915821, 488.5214843750001], + [6.89341643293734, 492.8812255859376], + [6.895822338701104, 494.06848144531233], + [6.900653737167637, 496.46130371093733], + [7.2670429692740965, 716.1540527343751], + [8.188647968122073, 1799.925781250001], + [8.872023251113289, 3564.8457031250014], + [9.566596912986167, 7139.869140625004], + [10.092554861905608, 12081.222656249996], + [10.728112113864427, 22810.24218749999], + [11.442480870715618, 46598.96875000003], + [12.28759157077177, 108493.37500000009], + [12.636950838344218, 153860.81249999988], + [13.327813723030063, 307019.4999999998], + [14.126778167009777, 682577.25], + [15.090269265334971, 1788919.000000001], + [15.835512291283944, 3769169], + [15.973721689554742, 4327820.000000002], + [16.910547205715446, 11044023.999999983], + [17.573132558903225, 21423208.000000004], + [18.649063156437965, 62828288.00000006], + [18.760110887365155, 70207360.00000012], + [19.547111966180875, 154231424.00000012], + [20.193967491567523, 294509055.9999997], + [21.484592263156223, 1070557183.9999999], + [22.088297141021556, 1957922816.0000024], + [22.780591462699917, 3912507392.0000005], + [23.401438520318692, 7279233024.000007], + [23.684949498080787, 9665245184.000017], + [24.5355829820426, 22627590144.000004], + [25.520740767599584, 60601991168.00004], + [26.31438890085422, 134018236416.00002], + [26.73876398039979, 204864946175.99973], + [27.06660583008718, 284346286080.00024], + [28.234874284944635, 914576637951.9989], + [28.78280496108106, 1581915832319.9973] +]; + +for (var [x, y] of sinh_data) + assertNear(Math.sinh(x), y); + diff --git a/test/staging/sm/Math/sinh-exact.js b/test/staging/sm/Math/sinh-exact.js new file mode 100644 index 0000000000..43cc4e823c --- /dev/null +++ b/test/staging/sm/Math/sinh-exact.js @@ -0,0 +1,29 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-Math-shell.js, sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +// Properties of Math.sinh that are guaranteed by the spec. + +// If x is NaN, the result is NaN. +assert.sameValue(Math.sinh(NaN), NaN); + +// If x is +0, the result is +0. +assert.sameValue(Math.sinh(+0), +0); + +// If x is −0, the result is −0. +assert.sameValue(Math.sinh(-0), -0); + +// If x is +∞, the result is +∞. +assert.sameValue(Math.sinh(Infinity), Infinity); + +// If x is −∞, the result is −∞. +assert.sameValue(Math.sinh(-Infinity), -Infinity); + + diff --git a/test/staging/sm/Math/tanh-approx.js b/test/staging/sm/Math/tanh-approx.js new file mode 100644 index 0000000000..05fe14c04e --- /dev/null +++ b/test/staging/sm/Math/tanh-approx.js @@ -0,0 +1,292 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-Math-shell.js, sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +var sloppy_tolerance = 2; + +for (var i = -20; i < 20; i++) { + assertNear(Math.tanh(i), + (Math.exp(i) - Math.exp(-i)) / (Math.exp(i) + Math.exp(-i)), + sloppy_tolerance); +} + +assert.sameValue(Math.tanh(1e300), 1); + +var tanh_data = [ + [-0.9999983310699463, -6.998237084679027], + [-0.9999978542327881, -6.87257975132917], + [-0.999992847442627, -6.2705920974657525], + [-0.9999861717224121, -5.940967614084813], + [-0.9999828338623047, -5.832855225378502], + [-0.9999399185180664, -5.20646301208756], + [-0.9998834133148193, -4.8749821841810785], + [-0.9998509883880615, -4.752279497280338], + [-0.9996016025543213, -4.260504202858904], + [-0.9993612766265869, -4.0244334353203115], + [-0.9989283084869385, -3.7655641082999236], + [-0.9969782829284668, -3.246782610980921], + [-0.9950058460235596, -2.9950671179940938], + [-0.9942638874053955, -2.9256242749609536], + [-0.990715742111206, -2.6839646283308363], + [-0.9903340339660645, -2.663723350226518], + [-0.9760982990264893, -2.207464998348322], + [-0.975830078125, -2.201817459680556], + [-0.9728245735168457, -2.1424542308291437], + [-0.9643559455871582, -2.0046686756020917], + [-0.9377224445343018, -1.7188337346177065], + [-0.9362406730651855, -1.7066940482565154], + [-0.9310147762298584, -1.6659543005533146], + [-0.9284839630126953, -1.6472838718760747], + [-0.9270248413085938, -1.6368067340881562], + [-0.9075665473937988, -1.5135473477311114], + [-0.897477388381958, -1.4590986086331497], + [-0.8920106887817383, -1.431681573516303], + [-0.8776559829711914, -1.365471286049011], + [-0.864722728729248, -1.3117705583444539], + [-0.8482067584991455, -1.249725893334944], + [-0.8056559562683105, -1.1145246028592257], + [-0.8048388957977295, -1.112200609756455], + [-0.7801985740661621, -1.0458778330822556], + [-0.7749934196472168, -1.032711173436253], + [-0.7619285583496094, -1.0007967281362184], + [-0.7504425048828125, -0.9739672824457072], + [-0.7495596408843994, -0.9719492983286864], + [-0.7481319904327393, -0.968698942014487], + [-0.7459518909454346, -0.9637657636705832], + [-0.7401137351989746, -0.9507308314464193], + [-0.7289731502532959, -0.9265325319867653], + [-0.7226788997650146, -0.9132299082876396], + [-0.7161557674407959, -0.8997082193533088], + [-0.7017018795013428, -0.8706453720344796], + [-0.7013418674468994, -0.86993650130945], + [-0.691054105758667, -0.8499705913361888], + [-0.6847054958343506, -0.837919455842005], + [-0.6838164329528809, -0.8362476144993315], + [-0.6747090816497803, -0.8193374156276964], + [-0.6575610637664795, -0.7885046044142132], + [-0.6522045135498047, -0.7791255597799839], + [-0.6261923313140869, -0.7351275788820003], + [-0.623173713684082, -0.7301771459970386], + [-0.6067488193511963, -0.7037597526130627], + [-0.5838055610656738, -0.6682166303197608], + [-0.579524040222168, -0.6617457665293066], + [-0.5760939121246338, -0.656596458857398], + [-0.5654678344726562, -0.6408350116350283], + [-0.5578761100769043, -0.6297442839791668], + [-0.5523209571838379, -0.6217149641475687], + [-0.5396339893341064, -0.6036390747171698], + [-0.5128989219665527, -0.5666556256064771], + [-0.5087778568267822, -0.5610793900942042], + [-0.4977825880050659, -0.546353950571504], + [-0.4913865327835083, -0.5378865967606703], + [-0.48976075649261475, -0.5357455496477738], + [-0.48493504524230957, -0.5294166456244711], + [-0.4479050636291504, -0.4820764946679979], + [-0.4461095333099365, -0.4798325976916711], + [-0.4429593086242676, -0.47590653371561276], + [-0.42827916145324707, -0.45778739362936793], + [-0.40590059757232666, -0.4306933608076879], + [-0.40029656887054443, -0.4240020382545707], + [-0.3961341381072998, -0.4190551379319939], + [-0.3836275339126587, -0.40430627175908734], + [-0.36686253547668457, -0.3847928551425507], + [-0.3657644987106323, -0.38352464227459343], + [-0.33507001399993896, -0.3485286317501442], + [-0.32572221755981445, -0.3380352468276522], + [-0.3191967010498047, -0.3307524237890151], + [-0.3000025749206543, -0.3095224337886503], + [-0.29665136337280273, -0.3058438250228025], + [-0.2944457530975342, -0.3034271164344305], + [-0.2872810363769531, -0.29560018347246825], + [-0.27738428115844727, -0.28484608203169437], + [-0.2390844225883484, -0.2438028008332661], + [-0.23685944080352783, -0.24144425169391517], + [-0.2253856658935547, -0.2293228153248168], + [-0.22283810377120972, -0.22664053064745143], + [-0.21552443504333496, -0.21895773601143995], + [-0.2153375744819641, -0.21876178107952995], + [-0.21016258001327515, -0.21334143320771737], + [-0.20250272750854492, -0.2053409277979887], + [-0.19156384468078613, -0.19396008474133075], + [-0.18251943588256836, -0.18458771439322938], + [-0.17464947700500488, -0.17645844608618066], + [-0.15646183490753174, -0.15775766677189154], + [-0.15580910444259644, -0.15708862621964176], + [-0.15365445613861084, -0.15488112515549593], + [-0.122499018907547, -0.12311733609904851], + [-0.1088167130947113, -0.10924929296737837], + [-0.08792558312416077, -0.08815322150790302], + [-0.08401328325271606, -0.08421178632314608], + [-0.06121261417865753, -0.06128924075509796], + [-0.05341699719429016, -0.05346789060550386], + [-0.05047759413719177, -0.05052053189238029], + [-0.02924579381942749, -0.029254136237332657], + [-0.02485968917608261, -0.02486481220617492], + [-0.020469173789024353, -0.02047203328100153], + [-0.01882001757621765, -0.018822240021756347], + [-0.016152501106262207, -0.016153906073109205], + [-0.0032715508714318275, -0.003271562543358962], + [1.6504814008555524e-12, 1.6504814008555524e-12], + [2.0654207510961697e-12, 2.0654207510961697e-12], + [6.933230031758164e-12, 6.933230031758164e-12], + [1.3351444949627478e-11, 1.3351444949627478e-11], + [1.6399812063916386e-11, 1.6399812063916386e-11], + [5.730159402528301e-11, 5.730159402528301e-11], + [1.113731329382972e-10, 1.113731329382972e-10], + [1.4214707189097453e-10, 1.4214707189097453e-10], + [3.8006320313144215e-10, 3.8006320313144215e-10], + [6.09162720266454e-10, 6.09162720266454e-10], + [1.0221641311147778e-9, 1.0221641311147778e-9], + [2.8819222563924995e-9, 2.8819222563924995e-9], + [4.7627768395841485e-9, 4.7627768395841485e-9], + [8.854133426439148e-9, 8.854133426439148e-9], + [2.3050326092288742e-8, 2.3050326092288745e-8], + [5.9392490925347374e-8, 5.939249092534745e-8], + [1.166764889148908e-7, 1.1667648891489133e-7], + [2.3799674409019644e-7, 2.3799674409020094e-7], + [4.684659415943315e-7, 4.684659415943658e-7], + [9.382699772686465e-7, 9.382699772689218e-7], + [0.00000110398559627356, 0.0000011039855962740086], + [0.0000032917760108830407, 0.0000032917760108949305], + [0.00000751721381675452, 0.000007517213816896115], + [0.000015114666894078255, 0.000015114666895229252], + [0.00002986399340443313, 0.00002986399341331128], + [0.00003387028118595481, 0.000033870281198906756], + [0.00009066011989489198, 0.00009066012014327826], + [0.00021949532674625516, 0.0002194953302712184], + [0.00043952150736004114, 0.0004395215356621756], + [0.0006333151832222939, 0.0006333152678940465], + [0.001115123275667429, 0.0011151237378863419], + [0.001962467096745968, 0.001962469616086656], + [0.005553754046559334, 0.005553811147953338], + [0.007324676960706711, 0.0073248079567425], + [0.008691128343343735, 0.008691347183450786], + [0.011912941932678223, 0.011913505535037906], + [0.02993336319923401, 0.029942308168570204], + [0.05124260485172272, 0.05128752666822782], + [0.05473744869232178, 0.05479221508125444], + [0.06158891320228577, 0.061666963819518306], + [0.09375360608100891, 0.09402975380882211], + [0.09442159533500671, 0.09470370926367391], + [0.09443172812461853, 0.09471393321406026], + [0.09943729639053345, 0.09976699249016487], + [0.11201295256614685, 0.11248498303558895], + [0.12310260534286499, 0.12373016402339168], + [0.13562965393066406, 0.13647060950861248], + [0.13763350248336792, 0.13851257866094746], + [0.14749455451965332, 0.14857829980464834], + [0.1618971824645996, 0.16333433166790448], + [0.17051106691360474, 0.17219298693637355], + [0.17051833868026733, 0.17220047646299907], + [0.18562912940979004, 0.18780647318150087], + [0.18898820877075195, 0.1912876932893582], + [0.23206615447998047, 0.23637212433914523], + [0.23480379581451416, 0.2392675448267427], + [0.2646920680999756, 0.27114729033023005], + [0.2794986963272095, 0.2871382059344433], + [0.28789305686950684, 0.2962673858386819], + [0.292596697807312, 0.30140373665239234], + [0.3101649284362793, 0.320727882769785], + [0.3109246492385864, 0.3215686893944558], + [0.31145012378692627, 0.3221505056451929], + [0.3271782398223877, 0.3396649461699478], + [0.3574345111846924, 0.37394153436545424], + [0.3593693971633911, 0.37616159223090223], + [0.35960352420806885, 0.37643046596933716], + [0.3626827001571655, 0.3799714809649667], + [0.38961827754974365, 0.4113499159905353], + [0.3904266357421875, 0.41230330080214], + [0.3981136083602905, 0.4214052375603139], + [0.411507248878479, 0.43742438709579096], + [0.4120509624481201, 0.43807911823743495], + [0.41868770122528076, 0.4460997186945703], + [0.42136549949645996, 0.4493511447897729], + [0.4516327381134033, 0.48674948990473677], + [0.4538639783859253, 0.4895560176112375], + [0.4655507802963257, 0.5043748446613433], + [0.48124635219573975, 0.5246050193978663], + [0.48621630668640137, 0.5310932154891663], + [0.4898730516433716, 0.5358932909903701], + [0.5024838447570801, 0.5526234425942533], + [0.5074074268341064, 0.5592320547729962], + [0.5093221664428711, 0.5618140818296767], + [0.5143489837646484, 0.5686253097655146], + [0.5154285430908203, 0.5700943191671631], + [0.5234100818634033, 0.5810250825991418], + [0.5274472236633301, 0.5866018515043636], + [0.5309803485870361, 0.5915094458340507], + [0.5477793216705322, 0.6152030999229688], + [0.5577394962310791, 0.6295459624918965], + [0.5582785606384277, 0.6303287742357745], + [0.5843560695648193, 0.6690521906099505], + [0.5871362686157227, 0.6732844960442398], + [0.5878911018371582, 0.6744372167164567], + [0.5903406143188477, 0.6781887236623534], + [0.5945003032684326, 0.684597775489552], + [0.5957975387573242, 0.6866065102131665], + [0.5961520671844482, 0.6871563252400655], + [0.6005008220672607, 0.6939300827887145], + [0.6150004863739014, 0.7169242329194352], + [0.6162893772125244, 0.7189998055497108], + [0.6194069385528564, 0.7240422748778544], + [0.6285066604614258, 0.7389438896054792], + [0.6293842792510986, 0.7403958734869583], + [0.6416172981262207, 0.7609178886018204], + [0.6424276828765869, 0.7622965466812235], + [0.6437420845031738, 0.7645378650643101], + [0.6468508243560791, 0.769864795178161], + [0.6615910530090332, 0.7956379107512945], + [0.669950008392334, 0.8106524185805045], + [0.6813662052154541, 0.8316597473423232], + [0.6968657970428467, 0.8611812790659296], + [0.6981887817382812, 0.8637579113749143], + [0.7447831630706787, 0.9611360201710216], + [0.7518312931060791, 0.9771540941752986], + [0.7534394264221191, 0.9808634133542229], + [0.7567856311798096, 0.9886489208209699], + [0.7817282676696777, 1.0497991719828956], + [0.8115026950836182, 1.1314141444187586], + [0.814647912979126, 1.1406947755584418], + [0.8266689777374268, 1.1775230833699681], + [0.8313877582550049, 1.1926138225701433], + [0.8343038558959961, 1.2021323323039612], + [0.8416652679443359, 1.2268570644335162], + [0.8584413528442383, 1.2873896671573652], + [0.8678996562957764, 1.3245040433929398], + [0.8679344654083252, 1.3246451309261607], + [0.8800599575042725, 1.3760334877782177], + [0.9003539085388184, 1.4740852961194106], + [0.9099440574645996, 1.5271990851861994], + [0.9142425060272217, 1.5527768948273004], + [0.9149219989776611, 1.556931837197936], + [0.9184908866882324, 1.5792896628381612], + [0.9188928604125977, 1.5818663359427627], + [0.919395923614502, 1.5851082843320008], + [0.9296839237213135, 1.6560555223295368], + [0.9298396110534668, 1.6572041418041492], + [0.9352962970733643, 1.6990986433619266], + [0.9376416206359863, 1.718164398807965], + [0.9410912990570068, 1.7475084077246632], + [0.962122917175293, 1.9737180163455101], + [0.9748215675354004, 2.1811227771083783], + [0.9769454002380371, 2.2257214499698255], + [0.985663890838623, 2.4654635601650536], + [0.9880380630493164, 2.5565869228142004], + [0.9928233623504639, 2.8132383539094192], + [1e-300, 1e-300], + [0.00001, 0.000010000000000333334], + [0.3, 0.3095196042031117], + [1e-30, 1e-30], + [1e-10, 1e-10], +]; + +for (var [x, y] of tanh_data) + assertNear(Math.tanh(y), x, sloppy_tolerance); + diff --git a/test/staging/sm/Math/tanh-exact.js b/test/staging/sm/Math/tanh-exact.js new file mode 100644 index 0000000000..40575b291f --- /dev/null +++ b/test/staging/sm/Math/tanh-exact.js @@ -0,0 +1,29 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-Math-shell.js, sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +// Properties of Math.tanh that are guaranteed by the spec. + +// If x is NaN, the result is NaN. +assert.sameValue(Math.tanh(NaN), NaN); + +// If x is +0, the result is +0. +assert.sameValue(Math.tanh(+0), +0); + +// If x is −0, the result is −0. +assert.sameValue(Math.tanh(-0), -0); + +// If x is +∞, the result is +1. +assert.sameValue(Math.tanh(Number.POSITIVE_INFINITY), +1); + +// If x is −∞, the result is -1. +assert.sameValue(Math.tanh(Number.NEGATIVE_INFINITY), -1); + + diff --git a/test/staging/sm/Math/trunc.js b/test/staging/sm/Math/trunc.js new file mode 100644 index 0000000000..b320daad29 --- /dev/null +++ b/test/staging/sm/Math/trunc.js @@ -0,0 +1,60 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-Math-shell.js, sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +// If x is NaN, the result is NaN. +assert.sameValue(Math.trunc(NaN), NaN); + +// If x is −0, the result is −0. +assert.sameValue(Math.trunc(-0), -0); + +// If x is +0, the result is +0. +assert.sameValue(Math.trunc(+0), +0); + +// If x is +∞, the result is +∞. +assert.sameValue(Math.trunc(Infinity), Infinity); + +// If x is −∞, the result is −∞. +assert.sameValue(Math.trunc(-Infinity), -Infinity); + +// Other boundary cases. +var MAX_NONINTEGER_VALUE = 4503599627370495.5; +var TRUNC_MAX_NONINTEGER_VALUE = 4503599627370495; + +assert.sameValue(Math.trunc(Number.MIN_VALUE), +0); +assert.sameValue(Math.trunc(ONE_MINUS_EPSILON), +0); +assert.sameValue(Math.trunc(ONE_PLUS_EPSILON), 1); +assert.sameValue(Math.trunc(MAX_NONINTEGER_VALUE), TRUNC_MAX_NONINTEGER_VALUE); +assert.sameValue(Math.trunc(Number.MAX_VALUE), Number.MAX_VALUE); + +assert.sameValue(Math.trunc(-Number.MIN_VALUE), -0); +assert.sameValue(Math.trunc(-ONE_MINUS_EPSILON), -0); +assert.sameValue(Math.trunc(-ONE_PLUS_EPSILON), -1); +assert.sameValue(Math.trunc(-MAX_NONINTEGER_VALUE), -TRUNC_MAX_NONINTEGER_VALUE); +assert.sameValue(Math.trunc(-Number.MAX_VALUE), -Number.MAX_VALUE); + +// Other cases. +for (var i = 1, f = 1.1; i < 20; i++, f += 1.0) + assert.sameValue(Math.trunc(f), i); + +for (var i = -1, f = -1.1; i > -20; i--, f -= 1.0) + assert.sameValue(Math.trunc(f), i); + +assert.sameValue(Math.trunc(1e40 + 0.5), 1e40); + +assert.sameValue(Math.trunc(1e300), 1e300); +assert.sameValue(Math.trunc(-1e300), -1e300); +assert.sameValue(Math.trunc(1e-300), 0); +assert.sameValue(Math.trunc(-1e-300), -0); + +assert.sameValue(Math.trunc(+0.9999), +0); +assert.sameValue(Math.trunc(-0.9999), -0); + + diff --git a/test/staging/sm/Number/0x-without-following-hexdigits.js b/test/staging/sm/Number/0x-without-following-hexdigits.js new file mode 100644 index 0000000000..8e932edef6 --- /dev/null +++ b/test/staging/sm/Number/0x-without-following-hexdigits.js @@ -0,0 +1,37 @@ +/* + * Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/licenses/publicdomain/ + */ + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +//----------------------------------------------------------------------------- +var BUGNUMBER = 582643; +var summary = "'0x' not followed by hex digits should be a syntax error"; + +print(BUGNUMBER + ": " + summary); + +/************** + * BEGIN TEST * + **************/ + +try +{ + eval("0x"); + throw new Error("didn't throw parsing 0x (with no subsequent hex digits)"); +} +catch (e) +{ + assert.sameValue(e instanceof SyntaxError, true, + "bad exception thrown: " + e); +} + +/******************************************************************************/ + +print("All tests passed!"); diff --git a/test/staging/sm/Number/15.7.3.7-EPSILON.js b/test/staging/sm/Number/15.7.3.7-EPSILON.js new file mode 100644 index 0000000000..1df47ba54f --- /dev/null +++ b/test/staging/sm/Number/15.7.3.7-EPSILON.js @@ -0,0 +1,32 @@ +/* + * Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/licenses/publicdomain/ + */ + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +//----------------------------------------------------------------------------- +var BUGNUMBER = 885798; +var summary = "ES6 (draft May 2013) 15.7.3.7 Number.EPSILON"; + +print(BUGNUMBER + ": " + summary); + +/************** + * BEGIN TEST * + **************/ + +// Test value +assert.sameValue(Number.EPSILON, Math.pow(2, -52)); + +// Test property attributes +var descriptor = Object.getOwnPropertyDescriptor(Number, 'EPSILON'); +assert.sameValue(descriptor.writable, false); +assert.sameValue(descriptor.configurable, false); +assert.sameValue(descriptor.enumerable, false); + diff --git a/test/staging/sm/Number/15.7.4.2.js b/test/staging/sm/Number/15.7.4.2.js new file mode 100644 index 0000000000..2a99b80b70 --- /dev/null +++ b/test/staging/sm/Number/15.7.4.2.js @@ -0,0 +1,38 @@ +/* + * Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/licenses/publicdomain/ + */ + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +assert.sameValue(raisesException(TypeError)('Number.prototype.toString.call(true)'), true); +assert.sameValue(raisesException(TypeError)('Number.prototype.toString.call("")'), true); +assert.sameValue(raisesException(TypeError)('Number.prototype.toString.call({})'), true); +assert.sameValue(raisesException(TypeError)('Number.prototype.toString.call(null)'), true); +assert.sameValue(raisesException(TypeError)('Number.prototype.toString.call([])'), true); +assert.sameValue(raisesException(TypeError)('Number.prototype.toString.call(undefined)'), true); +assert.sameValue(raisesException(TypeError)('Number.prototype.toString.call(new Boolean(true))'), true); + +assert.sameValue(completesNormally('Number.prototype.toString.call(42)'), true); +assert.sameValue(completesNormally('Number.prototype.toString.call(new Number(42))'), true); + +function testAround(middle) +{ + var range = 260; + var low = middle - range/2; + for (var i = 0; i < range; ++i) + assert.sameValue(low + i, parseInt(String(low + i))); +} + +testAround(-Math.pow(2,32)); +testAround(-Math.pow(2,16)); +testAround(0); +testAround(+Math.pow(2,16)); +testAround(+Math.pow(2,32)); + diff --git a/test/staging/sm/Number/20.1.2.10-MIN_SAFE_INTEGER.js b/test/staging/sm/Number/20.1.2.10-MIN_SAFE_INTEGER.js new file mode 100644 index 0000000000..a5e3b79f9f --- /dev/null +++ b/test/staging/sm/Number/20.1.2.10-MIN_SAFE_INTEGER.js @@ -0,0 +1,34 @@ +/* + * Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/licenses/publicdomain/ + */ + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +//----------------------------------------------------------------------------- + +var BUGNUMBER = 885798; +var summary = "ES6 (draft April 2014) 20.1.2.10 Number.MIN_SAFE_INTEGER"; + +print(BUGNUMBER + ": " + summary); + +/************** + * BEGIN TEST * + **************/ + +// Test value +assert.sameValue(Number.MIN_SAFE_INTEGER, -(Math.pow(2, 53) - 1)); + +//Test property attributes +var descriptor = Object.getOwnPropertyDescriptor(Number, 'MIN_SAFE_INTEGER'); + +assert.sameValue(descriptor.writable, false); +assert.sameValue(descriptor.configurable, false); +assert.sameValue(descriptor.enumerable, false); + diff --git a/test/staging/sm/Number/20.1.2.6-MAX_SAFE_INTEGER.js b/test/staging/sm/Number/20.1.2.6-MAX_SAFE_INTEGER.js new file mode 100644 index 0000000000..336b5bb559 --- /dev/null +++ b/test/staging/sm/Number/20.1.2.6-MAX_SAFE_INTEGER.js @@ -0,0 +1,34 @@ +/* + * Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/licenses/publicdomain/ + */ + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +//----------------------------------------------------------------------------- + +var BUGNUMBER = 885798; +var summary = "ES6 (draft April 2014) 20.1.2.6 Number.MAX_SAFE_INTEGER"; + +print(BUGNUMBER + ": " + summary); + +/************** + * BEGIN TEST * + **************/ + +// Test value +assert.sameValue(Number.MAX_SAFE_INTEGER, Math.pow(2, 53) - 1); + +//Test property attributes +var descriptor = Object.getOwnPropertyDescriptor(Number, 'MAX_SAFE_INTEGER'); + +assert.sameValue(descriptor.writable, false); +assert.sameValue(descriptor.configurable, false); +assert.sameValue(descriptor.enumerable, false); + diff --git a/test/staging/sm/Number/20.1.3.2-toExponential.js b/test/staging/sm/Number/20.1.3.2-toExponential.js new file mode 100644 index 0000000000..895e928140 --- /dev/null +++ b/test/staging/sm/Number/20.1.3.2-toExponential.js @@ -0,0 +1,58 @@ +/* + * Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/licenses/publicdomain/ + */ + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +//----------------------------------------------------------------------------- + +var BUGNUMBER = 818617; +var summary = "ECMAScript 2017 Draft ECMA-262 Section 20.1.3.2: Number.prototype.toExponential"; + +print(BUGNUMBER + ": " + summary); + +/************** + * BEGIN TEST * + **************/ + +// With NaN, fractionDigits out of range. +assert.sameValue(Number.prototype.toExponential.call(NaN, 555), 'NaN'); + +// With NaN fractionDigits in range. +assert.sameValue(Number.prototype.toExponential.call(NaN, 5), 'NaN'); + +// With Infinity, fractionDigits out of range. +assert.sameValue(Number.prototype.toExponential.call(Infinity, 555), 'Infinity'); + +// With Infinity, fractionDigits in range. +assert.sameValue(Number.prototype.toExponential.call(Infinity, 5), 'Infinity'); + +// With -Infinity, fractionDigits out of range. +assert.sameValue(Number.prototype.toExponential.call(-Infinity, 555), '-Infinity'); + +// With -Infinity, fractionDigits in range. +assert.sameValue(Number.prototype.toExponential.call(-Infinity, 5), '-Infinity'); + +// With NaN, function assigning a value. +let x = 10; +assert.sameValue(Number.prototype.toExponential.call(NaN, { valueOf() { x = 20; return 1; } }), 'NaN'); +assert.sameValue(x, 20); + +// With NaN, function throwing an exception. +assertThrowsValue( + () => Number.prototype.toExponential.call(NaN, { valueOf() { throw "hello"; } }), + "hello"); + +// Not a number throws TypeError +assertThrowsInstanceOf(() => Number.prototype.toExponential.call("Hello"), TypeError); + +if (typeof assert.sameValue === "function") { +} + diff --git a/test/staging/sm/Number/20.1.3.2-toPrecision.js b/test/staging/sm/Number/20.1.3.2-toPrecision.js new file mode 100644 index 0000000000..4b12d0627d --- /dev/null +++ b/test/staging/sm/Number/20.1.3.2-toPrecision.js @@ -0,0 +1,58 @@ +/* + * Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/licenses/publicdomain/ + */ + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +//----------------------------------------------------------------------------- + +var BUGNUMBER = 818617; +var summary = "ECMAScript 2017 Draft ECMA-262 Section 20.1.3.5: Number.prototype.toPrecision"; + +print(BUGNUMBER + ": " + summary); + +/************** + * BEGIN TEST * + **************/ + +// With NaN, fractionDigits out of range. +assert.sameValue(Number.prototype.toPrecision.call(NaN, 555), 'NaN'); + +// With NaN, fractionDigits in range. +assert.sameValue(Number.prototype.toPrecision.call(NaN, 5), 'NaN'); + +// With Infinity, fractionDigits out of range. +assert.sameValue(Number.prototype.toPrecision.call(Infinity, 555), 'Infinity'); + +// With Infinity, fractionDigits in range. +assert.sameValue(Number.prototype.toPrecision.call(Infinity, 5), 'Infinity'); + +// With -Infinity, fractionDigits out of range. +assert.sameValue(Number.prototype.toPrecision.call(-Infinity, 555), '-Infinity'); + +// With -Infinity, fractionDigits in range. +assert.sameValue(Number.prototype.toPrecision.call(-Infinity, 5), '-Infinity'); + +// With NaN, function assigning a value. +let x = 10; +assert.sameValue(Number.prototype.toPrecision.call(NaN, { valueOf() { x = 20; return 1; } }), 'NaN'); +assert.sameValue(x, 20); + +// With NaN, function throwing an exception. +assertThrowsValue( + () => Number.prototype.toPrecision.call(NaN, { valueOf() { throw "hello"; } }), + "hello"); + +// Not a number throws TypeError +assertThrowsInstanceOf(() => Number.prototype.toPrecision.call("Hello"), TypeError); + +if (typeof assert.sameValue === "function") { +} + diff --git a/test/staging/sm/Number/20.1.3.3-toFixed.js b/test/staging/sm/Number/20.1.3.3-toFixed.js new file mode 100644 index 0000000000..90a6ead719 --- /dev/null +++ b/test/staging/sm/Number/20.1.3.3-toFixed.js @@ -0,0 +1,23 @@ +/* + * Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/licenses/publicdomain/ + */ + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +assert.sameValue(Number.prototype.toFixed.call(-Infinity), "-Infinity"); +assert.sameValue(Number.prototype.toFixed.call(Infinity), "Infinity"); +assert.sameValue(Number.prototype.toFixed.call(NaN), "NaN"); + +assertThrowsInstanceOf(() => Number.prototype.toFixed.call(-Infinity, 555), RangeError); +assertThrowsInstanceOf(() => Number.prototype.toFixed.call(Infinity, 555), RangeError); +assertThrowsInstanceOf(() => Number.prototype.toFixed.call(NaN, 555), RangeError); + +assertThrowsInstanceOf(() => Number.prototype.toFixed.call("Hello"), TypeError); + diff --git a/test/staging/sm/Number/conversion-invalid-precision.js b/test/staging/sm/Number/conversion-invalid-precision.js new file mode 100644 index 0000000000..1bdedddf61 --- /dev/null +++ b/test/staging/sm/Number/conversion-invalid-precision.js @@ -0,0 +1,51 @@ +/* + * Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/licenses/publicdomain/ + */ + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +var BUGNUMBER = 795745; +var summary = + "Number.prototype.to* should throw a RangeError when passed a bad precision"; + +print(BUGNUMBER + ": " + summary); + +/************** + * BEGIN TEST * + **************/ + +function test(method, prec) +{ + try + { + Number.prototype[method].call(0, prec); + throw "should have thrown"; + } + catch (e) + { + assert.sameValue(e instanceof RangeError, true, + "expected RangeError for " + method + " with precision " + prec + + ", got " + e); + } +} + +test("toExponential", -32); +test("toFixed", -32); +test("toPrecision", -32); + +test("toExponential", 9999999); +test("toFixed", 9999999); +test("toPrecision", 9999999); + +test("toPrecision", 0); + +/******************************************************************************/ + +print("Tests complete"); diff --git a/test/staging/sm/Number/defaultvalue.js b/test/staging/sm/Number/defaultvalue.js new file mode 100644 index 0000000000..5bfcd2dd17 --- /dev/null +++ b/test/staging/sm/Number/defaultvalue.js @@ -0,0 +1,175 @@ +/* + * Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/licenses/publicdomain/ + */ + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +var BUGNUMBER = 645464; +var summary = + "[[DefaultValue]] behavior wrong for Number with overridden valueOf/toString"; + +print(BUGNUMBER + ": " + summary); + +/************** + * BEGIN TEST * + **************/ + + +// equality + +var n = new Number(); +assert.sameValue(n == 0, true); + +var n2 = new Number(); +n2.valueOf = function() { return 17; }; +assert.sameValue(n2 == 17, true); + +var n3 = new Number(); +n3.toString = function() { return 42; }; +assert.sameValue(n3 == 0, true); + +function testEquality() +{ + var n = new Number(); + assert.sameValue(n == 0, true); + + var n2 = new Number(); + n2.valueOf = function() { return 17; }; + assert.sameValue(n2 == 17, true); + + var n3 = new Number(); + n3.toString = function() { return 42; }; + assert.sameValue(n3 == 0, true); +} +testEquality(); + + +// addition of Number to number + +var n = new Number(); +assert.sameValue(n + 5, 5); + +var n2 = new Number(); +n2.toString = function() { return 9; }; +assert.sameValue(n2 + 3, 3); + +var n3 = new Number(); +n3.valueOf = function() { return 17; }; +assert.sameValue(n3 + 5, 22); + +function testNumberAddition() +{ + var n = new Number(); + assert.sameValue(n + 5, 5); + + var n2 = new Number(); + n2.toString = function() { return 9; }; + assert.sameValue(n2 + 3, 3); + + var n3 = new Number(); + n3.valueOf = function() { return 17; }; + assert.sameValue(n3 + 5, 22); +} +testNumberAddition(); + + +// addition of Number to Number + +var n = new Number(); +assert.sameValue(n + n, 0); + +var n2 = new Number(); +n2.toString = function() { return 5; }; +assert.sameValue(n2 + n2, 0); + +var n3 = new Number(); +n3.valueOf = function() { return 8.5; }; +assert.sameValue(n3 + n3, 17); + +function testNonNumberAddition() +{ + var n = new Number(); + assert.sameValue(n + n, 0); + + var n2 = new Number(); + n2.toString = function() { return 5; }; + assert.sameValue(n2 + n2, 0); + + var n3 = new Number(); + n3.valueOf = function() { return 8.5; }; + assert.sameValue(n3 + n3, 17); +} +testNonNumberAddition(); + + +// Number as bracketed property name + +var obj = { 0: 17, 8: 42, 9: 8675309 }; + +var n = new Number(); +assert.sameValue(obj[n], 17); + +var n2 = new Number(); +n2.valueOf = function() { return 8; } +assert.sameValue(obj[n2], 17); + +var n3 = new Number(); +n3.toString = function() { return 9; }; +assert.sameValue(obj[n3], 8675309); + +function testPropertyNameToNumber() +{ + var obj = { 0: 17, 8: 42, 9: 8675309 }; + + var n = new Number(); + assert.sameValue(obj[n], 17); + + var n2 = new Number(); + n2.valueOf = function() { return 8; } + assert.sameValue(obj[n2], 17); + + var n3 = new Number(); + n3.toString = function() { return 9; }; + assert.sameValue(obj[n3], 8675309); +} +testPropertyNameToNumber(); + + +// Number as property name with |in| operator + +var n = new Number(); +assert.sameValue(n in { 0: 5 }, true); + +var n2 = new Number(); +n2.toString = function() { return "baz"; }; +assert.sameValue(n2 in { baz: 42 }, true); + +var n3 = new Number(); +n3.valueOf = function() { return "quux"; }; +assert.sameValue(n3 in { 0: 17 }, true); + +function testInOperatorName() +{ + var n = new Number(); + assert.sameValue(n in { 0: 5 }, true); + + var n2 = new Number(); + n2.toString = function() { return "baz"; }; + assert.sameValue(n2 in { baz: 42 }, true); + + var n3 = new Number(); + n3.valueOf = function() { return "quux"; }; + assert.sameValue(n3 in { 0: 17 }, true); +} +testInOperatorName(); + +/******************************************************************************/ + +print("All tests passed!"); diff --git a/test/staging/sm/Number/isSafeInteger-01.js b/test/staging/sm/Number/isSafeInteger-01.js new file mode 100644 index 0000000000..d362a684ce --- /dev/null +++ b/test/staging/sm/Number/isSafeInteger-01.js @@ -0,0 +1,47 @@ +/* + * Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/licenses/publicdomain/ + */ + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +//----------------------------------------------------------------------------- +var BUGNUMBER = 1003764; +var summary = "ES6 (draft Draft May 22, 2014) ES6 20.1.2.5 Number.isSafeInteger(number)"; + +print(BUGNUMBER + ": " + summary); + +assert.sameValue(Number.isSafeInteger.length, 1); + +assert.sameValue(Number.isSafeInteger({}), false); +assert.sameValue(Number.isSafeInteger(NaN), false); +assert.sameValue(Number.isSafeInteger(+Infinity), false); +assert.sameValue(Number.isSafeInteger(-Infinity), false); + +assert.sameValue(Number.isSafeInteger(-1), true); +assert.sameValue(Number.isSafeInteger(+0), true); +assert.sameValue(Number.isSafeInteger(-0), true); +assert.sameValue(Number.isSafeInteger(1), true); + +assert.sameValue(Number.isSafeInteger(3.2), false); + +assert.sameValue(Number.isSafeInteger(Math.pow(2, 53) - 2), true); +assert.sameValue(Number.isSafeInteger(Math.pow(2, 53) - 1), true); +assert.sameValue(Number.isSafeInteger(Math.pow(2, 53)), false); +assert.sameValue(Number.isSafeInteger(Math.pow(2, 53) + 1), false); +assert.sameValue(Number.isSafeInteger(Math.pow(2, 53) + 2), false); + +assert.sameValue(Number.isSafeInteger(-Math.pow(2, 53) - 2), false); +assert.sameValue(Number.isSafeInteger(-Math.pow(2, 53) - 1), false); +assert.sameValue(Number.isSafeInteger(-Math.pow(2, 53)), false); +assert.sameValue(Number.isSafeInteger(-Math.pow(2, 53) + 1), true); +assert.sameValue(Number.isSafeInteger(-Math.pow(2, 53) + 2), true); + + +print("All tests passed!"); diff --git a/test/staging/sm/Number/numericSeparator.js b/test/staging/sm/Number/numericSeparator.js new file mode 100644 index 0000000000..53de156c9b --- /dev/null +++ b/test/staging/sm/Number/numericSeparator.js @@ -0,0 +1,17 @@ +/* + * Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/licenses/publicdomain/ + */ + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +assertThrowsInstanceOf(function() { eval('let a = 100_00_;'); }, SyntaxError); +assertThrowsInstanceOf(() => eval("let b = 10__;"), SyntaxError); +assertThrowsInstanceOf(() => eval("let b = 1._2;"), SyntaxError); + diff --git a/test/staging/sm/Number/parseFloat-01.js b/test/staging/sm/Number/parseFloat-01.js new file mode 100644 index 0000000000..99f20e3bd3 --- /dev/null +++ b/test/staging/sm/Number/parseFloat-01.js @@ -0,0 +1,34 @@ +/* + * Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/licenses/publicdomain/ + */ + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +//----------------------------------------------------------------------------- +var BUGNUMBER = 886949; +var summary = "ES6 (draft May 2013) 15.7.3.10 Number.parseFloat(string)"; + +print(BUGNUMBER + ": " + summary); + +assert.sameValue(Number.parseFloat("Infinity"), Infinity); +assert.sameValue(Number.parseFloat("+Infinity"), Infinity); +assert.sameValue(Number.parseFloat("-Infinity"), -Infinity); + +assert.sameValue(Number.parseFloat("inf"), NaN); +assert.sameValue(Number.parseFloat("Inf"), NaN); +assert.sameValue(Number.parseFloat("infinity"), NaN); + +assert.sameValue(Number.parseFloat("nan"), NaN); +assert.sameValue(Number.parseFloat("NaN"), NaN); + +/* Number.parseFloat should be the same function object as global parseFloat. */ +assert.sameValue(Number.parseFloat, parseFloat); + +print("All tests passed!"); diff --git a/test/staging/sm/Number/parseInt-01.js b/test/staging/sm/Number/parseInt-01.js new file mode 100644 index 0000000000..72f179206b --- /dev/null +++ b/test/staging/sm/Number/parseInt-01.js @@ -0,0 +1,179 @@ +/* + * Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/licenses/publicdomain/ + */ + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +//----------------------------------------------------------------------------- +var BUGNUMBER = 886949; +var summary = "ES6 (draft May 2013) 15.7.3.9 Number.parseInt(string, radix)"; + +print(BUGNUMBER + ": " + summary); + +/************** + * BEGIN TEST * + **************/ + +var str, radix; +var upvar; + +/* 1. Let inputString be ToString(string). */ + +assert.sameValue(Number.parseInt({ toString: function() { return "17" } }, 10), 17); + +upvar = 0; +str = { get toString() { upvar++; return function() { upvar++; return "12345"; } } }; +assert.sameValue(Number.parseInt(str, 10), 12345); +assert.sameValue(upvar, 2); + + +/* + * 2. Let S be a newly created substring of inputString consisting of the first + * character that is not a StrWhiteSpaceChar and all characters following + * that character. (In other words, remove leading white space.) + */ + +var ws = + ["\t", "\v", "\f", " ", "\xA0", "\uFEFF", + "\u2004", "\u3000", // a few Unicode whitespaces + "\r", "\n", "\u2028", "\u2029"]; + +str = "8675309"; +for (var i = 0, sz = ws.length; i < sz; i++) +{ + assert.sameValue(Number.parseInt(ws[i] + str, 10), 8675309); + for (var j = 0, sz = ws.length; j < sz; j++) + { + assert.sameValue(Number.parseInt(ws[i] + ws[j] + str, 10), 8675309, + ws[i].charCodeAt(0).toString(16) + ", " + + ws[j].charCodeAt(0).toString(16)); + } +} + + +/* + * 3. Let sign be 1. + * 4. If S is not empty and the first character of S is a minus sign -, let + * sign be −1. + */ +str = "5552368"; +assert.sameValue(Number.parseInt("-" + str, 10), -Number.parseInt(str, 10)); +assert.sameValue(Number.parseInt(" -" + str, 10), -Number.parseInt(str, 10)); +assert.sameValue(Number.parseInt("-", 10), NaN); +assert.sameValue(Number.parseInt("", 10), NaN); +assert.sameValue(Number.parseInt("-0", 10), -0); + + +/* + * 5. If S is not empty and the first character of S is a plus sign + or a + * minus sign -, then remove the first character from S. + */ +assert.sameValue(Number.parseInt("+12345", 10), 12345); +assert.sameValue(Number.parseInt(" +12345", 10), 12345); +assert.sameValue(Number.parseInt("-12345", 10), -12345); +assert.sameValue(Number.parseInt(" -12345", 10), -12345); + + +/* + * 6. Let R = ToInt32(radix). + */ + +upvar = ""; +str = + { toString: function() { if (!upvar) upvar = "string"; return "42"; } }; +radix = + { toString: function() { if (!upvar) upvar = "radix"; return "10"; } }; + +assert.sameValue(Number.parseInt(str, radix), 42); +assert.sameValue(upvar, "string"); + +assert.sameValue(Number.parseInt("123", null), 123); +assert.sameValue(Number.parseInt("123", undefined), 123); +assert.sameValue(Number.parseInt("123", NaN), 123); +assert.sameValue(Number.parseInt("123", -0), 123); +assert.sameValue(Number.parseInt("10", 72057594037927950), 16); +assert.sameValue(Number.parseInt("10", -4294967292), 4); +assert.sameValue(Number.parseInt("0x10", 1e308), 16); +assert.sameValue(Number.parseInt("10", 1e308), 10); +assert.sameValue(Number.parseInt("10", { valueOf: function() { return 16; } }), 16); + + +/* + * 7. Let stripPrefix be true. + * 8. If R ≠ 0, then + * a. If R < 2 or R > 36, then return NaN. + * b. If R ≠ 16, let stripPrefix be false. + * 9. Else, R = 0 + * a. Let R = 10. + * 10. If stripPrefix is true, then + * a. If the length of S is at least 2 and the first two characters of S + * are either “0x” or “0X”, then remove the first two characters from S and + * let R = 16. + */ +var vs = ["1", "51", "917", "2343", "99963"]; +for (var i = 0, sz = vs.length; i < sz; i++) + assert.sameValue(Number.parseInt(vs[i], 0), Number.parseInt(vs[i], 10), "bad " + vs[i]); + +assert.sameValue(Number.parseInt("0x10"), 16); +assert.sameValue(Number.parseInt("0x10", 0), 16); +assert.sameValue(Number.parseInt("0x10", 16), 16); +assert.sameValue(Number.parseInt("0x10", 8), 0); +assert.sameValue(Number.parseInt("-0x10", 16), -16); + +assert.sameValue(Number.parseInt("5", 1), NaN); +assert.sameValue(Number.parseInt("5", 37), NaN); +assert.sameValue(Number.parseInt("5", { valueOf: function() { return -1; } }), NaN); + + +/* + * 11. If S contains any character that is not a radix-R digit, then let Z be + * the substring of S consisting of all characters before the first such + * character; otherwise, let Z be S. + * 12. If Z is empty, return NaN. + */ +assert.sameValue(Number.parseInt(""), NaN); +assert.sameValue(Number.parseInt("ohai"), NaN); +assert.sameValue(Number.parseInt("0xohai"), NaN); +assert.sameValue(Number.parseInt("-ohai"), NaN); +assert.sameValue(Number.parseInt("+ohai"), NaN); +assert.sameValue(Number.parseInt(" ohai"), NaN); + +assert.sameValue(Number.parseInt("0xaohai"), 10); +assert.sameValue(Number.parseInt("hohai", 18), 17); + + +/* + * 13. Let mathInt be the mathematical integer value that is represented by Z + * in radix-R notation, using the letters A-Z and a-z for digits with + * values 10 through 35. (However, if R is 10 and Z contains more than 20 + * significant digits, every significant digit after the 20th may be + * replaced by a 0 digit, at the option of the implementation; and if R is + * not 2, 4, 8, 10, 16, or 32, then mathInt may be an implementation- + * dependent approximation to the mathematical integer value that is + * represented by Z in radix-R notation.) + * 14. Let number be the Number value for mathInt. + * 15. Return sign × number. + */ +assert.sameValue(Number.parseInt("ohai", 36), 1142154); +assert.sameValue(Number.parseInt("0ohai", 36), 1142154); +assert.sameValue(Number.parseInt("00ohai", 36), 1142154); +assert.sameValue(Number.parseInt("A", 16), 10); +assert.sameValue(Number.parseInt("0A", 16), 10); +assert.sameValue(Number.parseInt("00A", 16), 10); +assert.sameValue(Number.parseInt("A", 17), 10); +assert.sameValue(Number.parseInt("0A", 17), 10); +assert.sameValue(Number.parseInt("00A", 17), 10); + +/* Number.parseInt should be the same function object as global parseInt. */ +assert.sameValue(Number.parseInt, parseInt); + +/******************************************************************************/ + +print("All tests passed!"); diff --git a/test/staging/sm/Number/parseInt-default-to-decimal.js b/test/staging/sm/Number/parseInt-default-to-decimal.js new file mode 100644 index 0000000000..606e3f7ac7 --- /dev/null +++ b/test/staging/sm/Number/parseInt-default-to-decimal.js @@ -0,0 +1,37 @@ +/* + * Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/licenses/publicdomain/ + */ + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +//----------------------------------------------------------------------------- +var BUGNUMBER = 886949; +var summary = "ES6 (draft May 2013) 15.7.3.9 Number.parseInt(string, radix)." + + " Verify that Number.parseInt defaults to decimal."; + +print(BUGNUMBER + ": " + summary); + +/************** + * BEGIN TEST * + **************/ + +assert.sameValue(Number.parseInt("08"), 8); +assert.sameValue(Number.parseInt("09"), 9); +assert.sameValue(Number.parseInt("014"), 14); + +function strictParseInt(s) { "use strict"; return Number.parseInt(s); } + +assert.sameValue(strictParseInt("08"), 8); +assert.sameValue(strictParseInt("09"), 9); +assert.sameValue(strictParseInt("014"), 14); + +/******************************************************************************/ + +print("All tests passed!"); diff --git a/test/staging/sm/Number/toExponential-values.js b/test/staging/sm/Number/toExponential-values.js new file mode 100644 index 0000000000..05d611f191 --- /dev/null +++ b/test/staging/sm/Number/toExponential-values.js @@ -0,0 +1,128 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +let values = [ + [-0, undefined, "0e+0"], + [-0, 0, "0e+0"], + [-0, 1, "0.0e+0"], + [-0, 10, "0.0000000000e+0"], + [-0, 50, "0.00000000000000000000000000000000000000000000000000e+0"], + [-0, 100, "0.0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+0"], + [0, undefined, "0e+0"], + [0, 0, "0e+0"], + [0, 1, "0.0e+0"], + [0, 10, "0.0000000000e+0"], + [0, 50, "0.00000000000000000000000000000000000000000000000000e+0"], + [0, 100, "0.0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+0"], + [NaN, undefined, "NaN"], + [NaN, 0, "NaN"], + [NaN, 1, "NaN"], + [NaN, 10, "NaN"], + [NaN, 50, "NaN"], + [NaN, 100, "NaN"], + [Infinity, undefined, "Infinity"], + [Infinity, 0, "Infinity"], + [Infinity, 1, "Infinity"], + [Infinity, 10, "Infinity"], + [Infinity, 50, "Infinity"], + [Infinity, 100, "Infinity"], + [-Infinity, undefined, "-Infinity"], + [-Infinity, 0, "-Infinity"], + [-Infinity, 1, "-Infinity"], + [-Infinity, 10, "-Infinity"], + [-Infinity, 50, "-Infinity"], + [-Infinity, 100, "-Infinity"], + [3.141592653589793, undefined, "3.141592653589793e+0"], + [3.141592653589793, 0, "3e+0"], + [3.141592653589793, 1, "3.1e+0"], + [3.141592653589793, 10, "3.1415926536e+0"], + [3.141592653589793, 50, "3.14159265358979311599796346854418516159057617187500e+0"], + [3.141592653589793, 100, "3.1415926535897931159979634685441851615905761718750000000000000000000000000000000000000000000000000000e+0"], + [-1, undefined, "-1e+0"], + [-1, 0, "-1e+0"], + [-1, 1, "-1.0e+0"], + [-1, 10, "-1.0000000000e+0"], + [-1, 50, "-1.00000000000000000000000000000000000000000000000000e+0"], + [-1, 100, "-1.0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+0"], + [1, undefined, "1e+0"], + [1, 0, "1e+0"], + [1, 1, "1.0e+0"], + [1, 10, "1.0000000000e+0"], + [1, 50, "1.00000000000000000000000000000000000000000000000000e+0"], + [1, 100, "1.0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+0"], + [-123456.78, undefined, "-1.2345678e+5"], + [-123456.78, 0, "-1e+5"], + [-123456.78, 1, "-1.2e+5"], + [-123456.78, 10, "-1.2345678000e+5"], + [-123456.78, 50, "-1.23456779999999998835846781730651855468750000000000e+5"], + [-123456.78, 100, "-1.2345677999999999883584678173065185546875000000000000000000000000000000000000000000000000000000000000e+5"], + [123456.78, undefined, "1.2345678e+5"], + [123456.78, 0, "1e+5"], + [123456.78, 1, "1.2e+5"], + [123456.78, 10, "1.2345678000e+5"], + [123456.78, 50, "1.23456779999999998835846781730651855468750000000000e+5"], + [123456.78, 100, "1.2345677999999999883584678173065185546875000000000000000000000000000000000000000000000000000000000000e+5"], + [100000000000000000000, undefined, "1e+20"], + [100000000000000000000, 0, "1e+20"], + [100000000000000000000, 1, "1.0e+20"], + [100000000000000000000, 10, "1.0000000000e+20"], + [100000000000000000000, 50, "1.00000000000000000000000000000000000000000000000000e+20"], + [100000000000000000000, 100, "1.0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+20"], + [1e+21, undefined, "1e+21"], + [1e+21, 0, "1e+21"], + [1e+21, 1, "1.0e+21"], + [1e+21, 10, "1.0000000000e+21"], + [1e+21, 50, "1.00000000000000000000000000000000000000000000000000e+21"], + [1e+21, 100, "1.0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+21"], + [-100000000000000000000, undefined, "-1e+20"], + [-100000000000000000000, 0, "-1e+20"], + [-100000000000000000000, 1, "-1.0e+20"], + [-100000000000000000000, 10, "-1.0000000000e+20"], + [-100000000000000000000, 50, "-1.00000000000000000000000000000000000000000000000000e+20"], + [-100000000000000000000, 100, "-1.0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+20"], + [-1e+21, undefined, "-1e+21"], + [-1e+21, 0, "-1e+21"], + [-1e+21, 1, "-1.0e+21"], + [-1e+21, 10, "-1.0000000000e+21"], + [-1e+21, 50, "-1.00000000000000000000000000000000000000000000000000e+21"], + [-1e+21, 100, "-1.0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+21"], + [Number.MAX_VALUE, undefined, "1.7976931348623157e+308"], + [Number.MAX_VALUE, 0, "2e+308"], + [Number.MAX_VALUE, 1, "1.8e+308"], + [Number.MAX_VALUE, 10, "1.7976931349e+308"], + [Number.MAX_VALUE, 50, "1.79769313486231570814527423731704356798070567525845e+308"], + [Number.MAX_VALUE, 100, "1.7976931348623157081452742373170435679807056752584499659891747680315726078002853876058955863276687817e+308"], + [-Number.MAX_VALUE, undefined, "-1.7976931348623157e+308"], + [-Number.MAX_VALUE, 0, "-2e+308"], + [-Number.MAX_VALUE, 1, "-1.8e+308"], + [-Number.MAX_VALUE, 10, "-1.7976931349e+308"], + [-Number.MAX_VALUE, 50, "-1.79769313486231570814527423731704356798070567525845e+308"], + [-Number.MAX_VALUE, 100, "-1.7976931348623157081452742373170435679807056752584499659891747680315726078002853876058955863276687817e+308"], + [Number.MIN_VALUE, undefined, "5e-324"], + [Number.MIN_VALUE, 0, "5e-324"], + [Number.MIN_VALUE, 1, "4.9e-324"], + [Number.MIN_VALUE, 10, "4.9406564584e-324"], + [Number.MIN_VALUE, 50, "4.94065645841246544176568792868221372365059802614325e-324"], + [Number.MIN_VALUE, 100, "4.9406564584124654417656879286822137236505980261432476442558568250067550727020875186529983636163599238e-324"], + [-Number.MIN_VALUE, undefined, "-5e-324"], + [-Number.MIN_VALUE, 0, "-5e-324"], + [-Number.MIN_VALUE, 1, "-4.9e-324"], + [-Number.MIN_VALUE, 10, "-4.9406564584e-324"], + [-Number.MIN_VALUE, 50, "-4.94065645841246544176568792868221372365059802614325e-324"], + [-Number.MIN_VALUE, 100, "-4.9406564584124654417656879286822137236505980261432476442558568250067550727020875186529983636163599238e-324"], +]; + +for (let [val, prec, expected] of values) { + assert.sameValue(Number.prototype.toExponential.call(val, prec), expected); +} + +if (typeof assert.sameValue === "function") { +} diff --git a/test/staging/sm/Number/toFixed-values.js b/test/staging/sm/Number/toFixed-values.js new file mode 100644 index 0000000000..3fc53ebbb8 --- /dev/null +++ b/test/staging/sm/Number/toFixed-values.js @@ -0,0 +1,128 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +let values = [ + [-0, undefined, "0"], + [-0, 0, "0"], + [-0, 1, "0.0"], + [-0, 10, "0.0000000000"], + [-0, 50, "0.00000000000000000000000000000000000000000000000000"], + [-0, 100, "0.0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"], + [0, undefined, "0"], + [0, 0, "0"], + [0, 1, "0.0"], + [0, 10, "0.0000000000"], + [0, 50, "0.00000000000000000000000000000000000000000000000000"], + [0, 100, "0.0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"], + [NaN, undefined, "NaN"], + [NaN, 0, "NaN"], + [NaN, 1, "NaN"], + [NaN, 10, "NaN"], + [NaN, 50, "NaN"], + [NaN, 100, "NaN"], + [Infinity, undefined, "Infinity"], + [Infinity, 0, "Infinity"], + [Infinity, 1, "Infinity"], + [Infinity, 10, "Infinity"], + [Infinity, 50, "Infinity"], + [Infinity, 100, "Infinity"], + [-Infinity, undefined, "-Infinity"], + [-Infinity, 0, "-Infinity"], + [-Infinity, 1, "-Infinity"], + [-Infinity, 10, "-Infinity"], + [-Infinity, 50, "-Infinity"], + [-Infinity, 100, "-Infinity"], + [3.141592653589793, undefined, "3"], + [3.141592653589793, 0, "3"], + [3.141592653589793, 1, "3.1"], + [3.141592653589793, 10, "3.1415926536"], + [3.141592653589793, 50, "3.14159265358979311599796346854418516159057617187500"], + [3.141592653589793, 100, "3.1415926535897931159979634685441851615905761718750000000000000000000000000000000000000000000000000000"], + [-1, undefined, "-1"], + [-1, 0, "-1"], + [-1, 1, "-1.0"], + [-1, 10, "-1.0000000000"], + [-1, 50, "-1.00000000000000000000000000000000000000000000000000"], + [-1, 100, "-1.0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"], + [1, undefined, "1"], + [1, 0, "1"], + [1, 1, "1.0"], + [1, 10, "1.0000000000"], + [1, 50, "1.00000000000000000000000000000000000000000000000000"], + [1, 100, "1.0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"], + [-123456.78, undefined, "-123457"], + [-123456.78, 0, "-123457"], + [-123456.78, 1, "-123456.8"], + [-123456.78, 10, "-123456.7800000000"], + [-123456.78, 50, "-123456.77999999999883584678173065185546875000000000000000"], + [-123456.78, 100, "-123456.7799999999988358467817306518554687500000000000000000000000000000000000000000000000000000000000000000"], + [123456.78, undefined, "123457"], + [123456.78, 0, "123457"], + [123456.78, 1, "123456.8"], + [123456.78, 10, "123456.7800000000"], + [123456.78, 50, "123456.77999999999883584678173065185546875000000000000000"], + [123456.78, 100, "123456.7799999999988358467817306518554687500000000000000000000000000000000000000000000000000000000000000000"], + [100000000000000000000, undefined, "100000000000000000000"], + [100000000000000000000, 0, "100000000000000000000"], + [100000000000000000000, 1, "100000000000000000000.0"], + [100000000000000000000, 10, "100000000000000000000.0000000000"], + [100000000000000000000, 50, "100000000000000000000.00000000000000000000000000000000000000000000000000"], + [100000000000000000000, 100, "100000000000000000000.0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"], + [1e+21, undefined, "1e+21"], + [1e+21, 0, "1e+21"], + [1e+21, 1, "1e+21"], + [1e+21, 10, "1e+21"], + [1e+21, 50, "1e+21"], + [1e+21, 100, "1e+21"], + [-100000000000000000000, undefined, "-100000000000000000000"], + [-100000000000000000000, 0, "-100000000000000000000"], + [-100000000000000000000, 1, "-100000000000000000000.0"], + [-100000000000000000000, 10, "-100000000000000000000.0000000000"], + [-100000000000000000000, 50, "-100000000000000000000.00000000000000000000000000000000000000000000000000"], + [-100000000000000000000, 100, "-100000000000000000000.0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"], + [-1e+21, undefined, "-1e+21"], + [-1e+21, 0, "-1e+21"], + [-1e+21, 1, "-1e+21"], + [-1e+21, 10, "-1e+21"], + [-1e+21, 50, "-1e+21"], + [-1e+21, 100, "-1e+21"], + [Number.MAX_VALUE, undefined, "1.7976931348623157e+308"], + [Number.MAX_VALUE, 0, "1.7976931348623157e+308"], + [Number.MAX_VALUE, 1, "1.7976931348623157e+308"], + [Number.MAX_VALUE, 10, "1.7976931348623157e+308"], + [Number.MAX_VALUE, 50, "1.7976931348623157e+308"], + [Number.MAX_VALUE, 100, "1.7976931348623157e+308"], + [-Number.MAX_VALUE, undefined, "-1.7976931348623157e+308"], + [-Number.MAX_VALUE, 0, "-1.7976931348623157e+308"], + [-Number.MAX_VALUE, 1, "-1.7976931348623157e+308"], + [-Number.MAX_VALUE, 10, "-1.7976931348623157e+308"], + [-Number.MAX_VALUE, 50, "-1.7976931348623157e+308"], + [-Number.MAX_VALUE, 100, "-1.7976931348623157e+308"], + [Number.MIN_VALUE, undefined, "0"], + [Number.MIN_VALUE, 0, "0"], + [Number.MIN_VALUE, 1, "0.0"], + [Number.MIN_VALUE, 10, "0.0000000000"], + [Number.MIN_VALUE, 50, "0.00000000000000000000000000000000000000000000000000"], + [Number.MIN_VALUE, 100, "0.0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"], + [-Number.MIN_VALUE, undefined, "-0"], + [-Number.MIN_VALUE, 0, "-0"], + [-Number.MIN_VALUE, 1, "-0.0"], + [-Number.MIN_VALUE, 10, "-0.0000000000"], + [-Number.MIN_VALUE, 50, "-0.00000000000000000000000000000000000000000000000000"], + [-Number.MIN_VALUE, 100, "-0.0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"], +]; + +for (let [val, prec, expected] of values) { + assert.sameValue(Number.prototype.toFixed.call(val, prec), expected); +} + +if (typeof assert.sameValue === "function") { +} diff --git a/test/staging/sm/Number/toPrecision-values.js b/test/staging/sm/Number/toPrecision-values.js new file mode 100644 index 0000000000..929b2f0eee --- /dev/null +++ b/test/staging/sm/Number/toPrecision-values.js @@ -0,0 +1,110 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +let values = [ + [-0, undefined, "0"], + [-0, 1, "0"], + [-0, 10, "0.000000000"], + [-0, 50, "0.0000000000000000000000000000000000000000000000000"], + [-0, 100, "0.000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"], + [0, undefined, "0"], + [0, 1, "0"], + [0, 10, "0.000000000"], + [0, 50, "0.0000000000000000000000000000000000000000000000000"], + [0, 100, "0.000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"], + [NaN, undefined, "NaN"], + [NaN, 1, "NaN"], + [NaN, 10, "NaN"], + [NaN, 50, "NaN"], + [NaN, 100, "NaN"], + [Infinity, undefined, "Infinity"], + [Infinity, 1, "Infinity"], + [Infinity, 10, "Infinity"], + [Infinity, 50, "Infinity"], + [Infinity, 100, "Infinity"], + [-Infinity, undefined, "-Infinity"], + [-Infinity, 1, "-Infinity"], + [-Infinity, 10, "-Infinity"], + [-Infinity, 50, "-Infinity"], + [-Infinity, 100, "-Infinity"], + [3.141592653589793, undefined, "3.141592653589793"], + [3.141592653589793, 1, "3"], + [3.141592653589793, 10, "3.141592654"], + [3.141592653589793, 50, "3.1415926535897931159979634685441851615905761718750"], + [3.141592653589793, 100, "3.141592653589793115997963468544185161590576171875000000000000000000000000000000000000000000000000000"], + [-1, undefined, "-1"], + [-1, 1, "-1"], + [-1, 10, "-1.000000000"], + [-1, 50, "-1.0000000000000000000000000000000000000000000000000"], + [-1, 100, "-1.000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"], + [1, undefined, "1"], + [1, 1, "1"], + [1, 10, "1.000000000"], + [1, 50, "1.0000000000000000000000000000000000000000000000000"], + [1, 100, "1.000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"], + [-123456.78, undefined, "-123456.78"], + [-123456.78, 1, "-1e+5"], + [-123456.78, 10, "-123456.7800"], + [-123456.78, 50, "-123456.77999999999883584678173065185546875000000000"], + [-123456.78, 100, "-123456.7799999999988358467817306518554687500000000000000000000000000000000000000000000000000000000000"], + [123456.78, undefined, "123456.78"], + [123456.78, 1, "1e+5"], + [123456.78, 10, "123456.7800"], + [123456.78, 50, "123456.77999999999883584678173065185546875000000000"], + [123456.78, 100, "123456.7799999999988358467817306518554687500000000000000000000000000000000000000000000000000000000000"], + [100000000000000000000, undefined, "100000000000000000000"], + [100000000000000000000, 1, "1e+20"], + [100000000000000000000, 10, "1.000000000e+20"], + [100000000000000000000, 50, "100000000000000000000.00000000000000000000000000000"], + [100000000000000000000, 100, "100000000000000000000.0000000000000000000000000000000000000000000000000000000000000000000000000000000"], + [1e+21, undefined, "1e+21"], + [1e+21, 1, "1e+21"], + [1e+21, 10, "1.000000000e+21"], + [1e+21, 50, "1000000000000000000000.0000000000000000000000000000"], + [1e+21, 100, "1000000000000000000000.000000000000000000000000000000000000000000000000000000000000000000000000000000"], + [-100000000000000000000, undefined, "-100000000000000000000"], + [-100000000000000000000, 1, "-1e+20"], + [-100000000000000000000, 10, "-1.000000000e+20"], + [-100000000000000000000, 50, "-100000000000000000000.00000000000000000000000000000"], + [-100000000000000000000, 100, "-100000000000000000000.0000000000000000000000000000000000000000000000000000000000000000000000000000000"], + [-1e+21, undefined, "-1e+21"], + [-1e+21, 1, "-1e+21"], + [-1e+21, 10, "-1.000000000e+21"], + [-1e+21, 50, "-1000000000000000000000.0000000000000000000000000000"], + [-1e+21, 100, "-1000000000000000000000.000000000000000000000000000000000000000000000000000000000000000000000000000000"], + [Number.MAX_VALUE, undefined, "1.7976931348623157e+308"], + [Number.MAX_VALUE, 1, "2e+308"], + [Number.MAX_VALUE, 10, "1.797693135e+308"], + [Number.MAX_VALUE, 50, "1.7976931348623157081452742373170435679807056752584e+308"], + [Number.MAX_VALUE, 100, "1.797693134862315708145274237317043567980705675258449965989174768031572607800285387605895586327668782e+308"], + [-Number.MAX_VALUE, undefined, "-1.7976931348623157e+308"], + [-Number.MAX_VALUE, 1, "-2e+308"], + [-Number.MAX_VALUE, 10, "-1.797693135e+308"], + [-Number.MAX_VALUE, 50, "-1.7976931348623157081452742373170435679807056752584e+308"], + [-Number.MAX_VALUE, 100, "-1.797693134862315708145274237317043567980705675258449965989174768031572607800285387605895586327668782e+308"], + [Number.MIN_VALUE, undefined, "5e-324"], + [Number.MIN_VALUE, 1, "5e-324"], + [Number.MIN_VALUE, 10, "4.940656458e-324"], + [Number.MIN_VALUE, 50, "4.9406564584124654417656879286822137236505980261432e-324"], + [Number.MIN_VALUE, 100, "4.940656458412465441765687928682213723650598026143247644255856825006755072702087518652998363616359924e-324"], + [-Number.MIN_VALUE, undefined, "-5e-324"], + [-Number.MIN_VALUE, 1, "-5e-324"], + [-Number.MIN_VALUE, 10, "-4.940656458e-324"], + [-Number.MIN_VALUE, 50, "-4.9406564584124654417656879286822137236505980261432e-324"], + [-Number.MIN_VALUE, 100, "-4.940656458412465441765687928682213723650598026143247644255856825006755072702087518652998363616359924e-324"], +]; + +for (let [val, prec, expected] of values) { + assert.sameValue(Number.prototype.toPrecision.call(val, prec), expected); +} + +if (typeof assert.sameValue === "function") { +} diff --git a/test/staging/sm/Number/toString-radix-handling.js b/test/staging/sm/Number/toString-radix-handling.js new file mode 100644 index 0000000000..0c924573de --- /dev/null +++ b/test/staging/sm/Number/toString-radix-handling.js @@ -0,0 +1,42 @@ +/* + * Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/licenses/publicdomain/ + */ + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +var BUGNUMBER = 647385; +var summary = + "Number.prototype.toString should use ToInteger on the radix and should " + + "throw a RangeError if the radix is bad"; + +print(BUGNUMBER + ": " + summary); + +/************** + * BEGIN TEST * + **************/ + +function test(r) +{ + try + { + 5..toString(r); + throw "should have thrown"; + } + catch (e) + { + assert.sameValue(e instanceof RangeError, true, "expected a RangeError, got " + e); + } +} +test(Math.pow(2, 32) + 10); +test(55); + +/******************************************************************************/ + +print("All tests passed!"); diff --git a/test/staging/sm/Number/tonumber-string-hex.js b/test/staging/sm/Number/tonumber-string-hex.js new file mode 100644 index 0000000000..b58dbe1edf --- /dev/null +++ b/test/staging/sm/Number/tonumber-string-hex.js @@ -0,0 +1,43 @@ +/* + * Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/licenses/publicdomain/ + */ + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +var BUGNUMBER = 872853; +var summary = 'Various tests of ToNumber(string), particularly +"0x" being NaN'; + +print(BUGNUMBER + ": " + summary); + +/************** + * BEGIN TEST * + **************/ + +assert.sameValue(+"0x", NaN); +assert.sameValue(+"\t0x", NaN); +assert.sameValue(+"0x\n", NaN); +assert.sameValue(+"\n0x\t", NaN); +assert.sameValue(+"0x0", 0); +assert.sameValue(+"0xa", 10); +assert.sameValue(+"0xff", 255); +assert.sameValue(+"-0x", NaN); +assert.sameValue(+"-0xa", NaN); +assert.sameValue(+"-0xff", NaN); +assert.sameValue(+"0xInfinity", NaN); +assert.sameValue(+"+Infinity", Infinity); +assert.sameValue(+"-Infinity", -Infinity); +assert.sameValue(+"\t+Infinity", Infinity); +assert.sameValue(+"-Infinity\n", -Infinity); +assert.sameValue(+"+ Infinity", NaN); +assert.sameValue(+"- Infinity", NaN); + +/******************************************************************************/ + +print("Tests complete"); diff --git a/test/staging/sm/PrivateName/constructor-args.js b/test/staging/sm/PrivateName/constructor-args.js new file mode 100644 index 0000000000..880fffb4cc --- /dev/null +++ b/test/staging/sm/PrivateName/constructor-args.js @@ -0,0 +1,33 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +class A { + #x = "hello"; + constructor(o = this.#x) { + this.value = o; + } +}; + +var a = new A; +assert.sameValue(a.value, "hello"); + + +class B extends A { + constructor() { + // Cannot access 'this' until super() called. + super(); + assert.sameValue("value" in this, true); + assert.sameValue(this.value, "hello"); + } +} + +var b = new B; + diff --git a/test/staging/sm/PrivateName/error-outside-class.js b/test/staging/sm/PrivateName/error-outside-class.js new file mode 100644 index 0000000000..352f06a660 --- /dev/null +++ b/test/staging/sm/PrivateName/error-outside-class.js @@ -0,0 +1,23 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ + +// Can't reference a private field without an object +assertThrowsInstanceOf(() => eval('#x'), SyntaxError); + +// Can't reference a private field without an enclosing class +assertThrowsInstanceOf(() => eval('this.#x'), SyntaxError); + +// Can't reference a private field in a random function outside a class context +assertThrowsInstanceOf( + () => eval('function foo() { return this.#x'), SyntaxError); + + diff --git a/test/staging/sm/PrivateName/home-object-when-preceded-by-computed-key.js b/test/staging/sm/PrivateName/home-object-when-preceded-by-computed-key.js new file mode 100644 index 0000000000..4a8ed7725d --- /dev/null +++ b/test/staging/sm/PrivateName/home-object-when-preceded-by-computed-key.js @@ -0,0 +1,43 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +class Base { + m() { return "pass"; } + static m() { return "fail"; } +} + +var key = { + toString() { + return "computed"; + } +}; + +let obj1 = new class extends Base { + [key]() {} + + // Private method with a directly preceding method using a computed key led + // to assigning the wrong home object. + #m() { return super.m(); } + m() { return this.#m(); } +}; + +assert.sameValue(obj1.m(), "pass"); + +let obj2 = new class extends Base { + // Same test as above, but this time preceded by a static method. + static [key]() {} + + #m() { return super.m(); } + m() { return this.#m(); } +}; + +assert.sameValue(obj2.m(), "pass"); + diff --git a/test/staging/sm/PrivateName/illegal-in-class-context.js b/test/staging/sm/PrivateName/illegal-in-class-context.js new file mode 100644 index 0000000000..bae96b5852 --- /dev/null +++ b/test/staging/sm/PrivateName/illegal-in-class-context.js @@ -0,0 +1,26 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ + +assertThrowsInstanceOf(() => eval(`class A { #x; #x; }`), SyntaxError); + +// No computed private fields +assertThrowsInstanceOf( + () => eval(`var x = "foo"; class A { #[x] = 20; }`), SyntaxError); + +assertThrowsInstanceOfWithMessage(() => eval(`class A { #x; h(o) { return !#x; }}`), + SyntaxError, + "invalid use of private name in unary expression without object reference"); +assertThrowsInstanceOfWithMessage(() => eval(`class A { #x; h(o) { return 1 + #x in o; }}`), + SyntaxError, + "invalid use of private name due to operator precedence"); + + diff --git a/test/staging/sm/PrivateName/illegal-in-identifier-context.js b/test/staging/sm/PrivateName/illegal-in-identifier-context.js new file mode 100644 index 0000000000..740e5c8142 --- /dev/null +++ b/test/staging/sm/PrivateName/illegal-in-identifier-context.js @@ -0,0 +1,53 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ + +// Private names can't appear in contexts where plain identifiers are expected. + +// Private names as binding identifiers. +assertThrowsInstanceOf(() => eval(`var #a;`), SyntaxError); +assertThrowsInstanceOf(() => eval(`let #a;`), SyntaxError); +assertThrowsInstanceOf(() => eval(`const #a = 0;`), SyntaxError); +assertThrowsInstanceOf(() => eval(`function #a(){}`), SyntaxError); +assertThrowsInstanceOf(() => eval(`function f(#a){}`), SyntaxError); + +// With escape sequences (leading and non-leading case). +assertThrowsInstanceOf(() => eval(String.raw`var #\u0061;`), SyntaxError); +assertThrowsInstanceOf(() => eval(String.raw`var #a\u0061;`), SyntaxError); +assertThrowsInstanceOf(() => eval(String.raw`let #\u0061;`), SyntaxError); +assertThrowsInstanceOf(() => eval(String.raw`let #a\u0061;`), SyntaxError); +assertThrowsInstanceOf(() => eval(String.raw`const #\u0061 = 0;`), SyntaxError); +assertThrowsInstanceOf(() => eval(String.raw`const #a\u0061 = 0;`), SyntaxError); +assertThrowsInstanceOf(() => eval(String.raw`function #\u0061(){}`), SyntaxError); +assertThrowsInstanceOf(() => eval(String.raw`function #a\u0061(){}`), SyntaxError); +assertThrowsInstanceOf(() => eval(String.raw`function f(#\u0061){}`), SyntaxError); +assertThrowsInstanceOf(() => eval(String.raw`function f(#a\u0061){}`), SyntaxError); + + +// Private names as label identifiers. +assertThrowsInstanceOf(() => eval(`#a: ;`), SyntaxError); + +// With escape sequences (leading and non-leading case). +assertThrowsInstanceOf(() => eval(String.raw`#\u0061: ;`), SyntaxError); +assertThrowsInstanceOf(() => eval(String.raw`#a\u0061: ;`), SyntaxError); + + +// Private names as identifier references. +assertThrowsInstanceOf(() => eval(`#a = 0;`), SyntaxError); +assertThrowsInstanceOf(() => eval(`typeof #a;`), SyntaxError); + +// With escape sequences (leading and non-leading case). +assertThrowsInstanceOf(() => eval(String.raw`#\u0061 = 0;`), SyntaxError); +assertThrowsInstanceOf(() => eval(String.raw`#a\u0061 = 0;`), SyntaxError); +assertThrowsInstanceOf(() => eval(String.raw`typeof #\u0061;`), SyntaxError); +assertThrowsInstanceOf(() => eval(String.raw`typeof #a\u0061;`), SyntaxError); + + diff --git a/test/staging/sm/PrivateName/illegal-in-object-context.js b/test/staging/sm/PrivateName/illegal-in-object-context.js new file mode 100644 index 0000000000..7e4d11e041 --- /dev/null +++ b/test/staging/sm/PrivateName/illegal-in-object-context.js @@ -0,0 +1,23 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ + +// Private names aren't valid in object literals. + +assertThrowsInstanceOf(() => eval(`var o = {#a: 0};`), SyntaxError); +assertThrowsInstanceOf(() => eval(`var o = {#a};`), SyntaxError); +assertThrowsInstanceOf(() => eval(`var o = {#a(){}};`), SyntaxError); +assertThrowsInstanceOf(() => eval(`var o = {get #a(){}};`), SyntaxError); +assertThrowsInstanceOf(() => eval(`var o = {set #a(v){}};`), SyntaxError); +assertThrowsInstanceOf(() => eval(`var o = {*#a(v){}};`), SyntaxError); +assertThrowsInstanceOf(() => eval(`var o = {async #a(v){}};`), SyntaxError); +assertThrowsInstanceOf(() => eval(`var o = {async *#a(v){}};`), SyntaxError); + diff --git a/test/staging/sm/PrivateName/lexical-presence.js b/test/staging/sm/PrivateName/lexical-presence.js new file mode 100644 index 0000000000..874e2f1292 --- /dev/null +++ b/test/staging/sm/PrivateName/lexical-presence.js @@ -0,0 +1,64 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ + +// Verify that private fields are enabled. +class A { + #x; +}; + +function assertThrowsSyntaxError(str) { + assertThrowsInstanceOf(() => eval(str), SyntaxError); // Direct Eval + assertThrowsInstanceOf(() => (1, eval)(str), SyntaxError); // Indirect Eval + assertThrowsInstanceOf(() => Function(str), SyntaxError); // Function +} + +assertThrowsSyntaxError(` + class B { + g() { + return this.#x; + } + }; +`); + +assertThrowsSyntaxError(` +with (new class A { #x; }) { + class B { + #y; + constructor() { return this.#x; } + } + } +`); + +// Make sure we don't create a generic binding for #x. +with (new class { + #x = 12; +}) { + assert.sameValue('#x' in this, false); +} + +// Try to fetch a non-existing field using different +// compilation contexts +function assertNonExisting(fetchCode) { + source = `var X = class { + b() { + ${fetchCode} + } + } + var a = new X; + a.b()` + assertThrowsInstanceOf(() => eval(source), SyntaxError); +} + +assertNonExisting(`return eval("this.#x")"`); +assertNonExisting(`return (1,eval)("this.#x")`); +assertNonExisting(`var f = Function("this.#x"); return f();`); + diff --git a/test/staging/sm/PrivateName/modify-non-extensible.js b/test/staging/sm/PrivateName/modify-non-extensible.js new file mode 100644 index 0000000000..250f71e4d9 --- /dev/null +++ b/test/staging/sm/PrivateName/modify-non-extensible.js @@ -0,0 +1,84 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ + +// Returns the argument in the constructor to allow stamping private fields into +// arbitrary objects. +class OverrideBase { + constructor(o) { + return o; + } +}; + +class A extends OverrideBase { + #a = 1; + g() { + return this.#a + } + + static gs(o) { + return o.#a; + } + static inca(obj) { + obj.#a++; + } +} + +var obj = {}; +Object.seal(obj); +new A(obj); // Add #a to obj, but not g. +assert.sameValue('g' in obj, false); +assert.sameValue(A.gs(obj), 1); +A.inca(obj); +assert.sameValue(A.gs(obj), 2); + +// Ensure that the object remains non-extensible +obj.h = 'hi' +assert.sameValue('h' in obj, false); + + +Object.freeze(obj); +A.inca(obj); // Despite being frozen, private names are modifiable. +assert.sameValue(A.gs(obj), 3); +assert.sameValue(Object.isFrozen(obj), true); + +var proxy = new Proxy({}, {}); +assert.sameValue(Object.isFrozen(proxy), false); + +new A(proxy); +assert.sameValue(A.gs(proxy), 1); + +// Note: this doesn't exercise the non-native object +// path in TestIntegrityLevel like you might expect. +// +// For that see below. +Object.freeze(proxy); +assert.sameValue(Object.isFrozen(proxy), true); + +A.inca(proxy); +assert.sameValue(A.gs(proxy), 2) + +var target = { a: 10 }; +Object.freeze(target); +new A(target); +assert.sameValue(Object.isFrozen(target), true) + +var getOwnKeys = []; +var proxy = new Proxy(target, { + getOwnPropertyDescriptor: function (target, key) { + getOwnKeys.push(key); + return Reflect.getOwnPropertyDescriptor(target, key); + }, +}); + +Object.isFrozen(proxy); +assert.sameValue(getOwnKeys.length, 1); + diff --git a/test/staging/sm/PrivateName/names.js b/test/staging/sm/PrivateName/names.js new file mode 100644 index 0000000000..03d485c177 --- /dev/null +++ b/test/staging/sm/PrivateName/names.js @@ -0,0 +1,39 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +var C = class { + static #field = () => 'Test262'; + static field = () => 'Test262'; + #instance = () => 'Test262'; + instance = () => 'Test262'; + + static accessPrivateField() { + return this.#field; + } + + accessPrivateInstanceField() { + return this.#instance; + } + + static accessField() { + return this.field; + } + + accessInstanceField() { + return this.instance; + } +} +assert.sameValue(C.accessPrivateField().name, '#field') +assert.sameValue(C.accessField().name, 'field'); +var c = new C; +assert.sameValue(c.accessPrivateInstanceField().name, '#instance'); +assert.sameValue(c.accessInstanceField().name, 'instance'); + diff --git a/test/staging/sm/PrivateName/nested-class-in-computed-property-key.js b/test/staging/sm/PrivateName/nested-class-in-computed-property-key.js new file mode 100644 index 0000000000..7b92ae24c2 --- /dev/null +++ b/test/staging/sm/PrivateName/nested-class-in-computed-property-key.js @@ -0,0 +1,26 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +let capturedPrivateAccess; +class A { + // Declare private name in outer class. + static #x = 42; + + static [( + // Inner class in computed property key. + class {}, + + // Access to private name from outer class. + capturedPrivateAccess = () => A.#x + )]; +} +assert.sameValue(capturedPrivateAccess(), 42); + diff --git a/test/staging/sm/PrivateName/nested-class-name-used.js b/test/staging/sm/PrivateName/nested-class-name-used.js new file mode 100644 index 0000000000..536aa030d1 --- /dev/null +++ b/test/staging/sm/PrivateName/nested-class-name-used.js @@ -0,0 +1,41 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +// AllPrivateIdentifiersValid uses only lexical string names, not +// the dynamic private names; which means the below is not a syntax +// error but is instead a TypeError on access. + +class A { + #x = 10; + f() { + class B { + g() { + return this.#x; // note: #x isn't declared in this class, but + // the enclosing. + } + }; + this.y = new B; + } + constructor() { + this.f(); + } + g() { + return this.y.g(); + } +}; + +a = new A; +try { + a.g(); +} catch (e) { + assert.sameValue(e instanceof TypeError, true); +} + diff --git a/test/staging/sm/PrivateName/not-iterable.js b/test/staging/sm/PrivateName/not-iterable.js new file mode 100644 index 0000000000..9489c5479c --- /dev/null +++ b/test/staging/sm/PrivateName/not-iterable.js @@ -0,0 +1,47 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +// +// Ensure PrivateNames aren't iterable. + +class O { + #x = 123; + gx() { + return this.#x; + } +} +var o = new O; + +assert.sameValue(o.gx(), 123); + +assert.sameValue(Object.keys(o).length, 0); +assert.sameValue(Object.getOwnPropertyNames(o).length, 0); +assert.sameValue(Object.getOwnPropertySymbols(o).length, 0); +assert.sameValue(Reflect.ownKeys(o).length, 0); + +var forIn = []; +for (var pk in o) { + forIn.push(pk); +} +assert.sameValue(forIn.length, 0); + +// Proxy case +var proxy = new Proxy(o, {}); +assert.sameValue(Object.keys(proxy).length, 0); +assert.sameValue(Object.getOwnPropertyNames(proxy).length, 0); +assert.sameValue(Object.getOwnPropertySymbols(proxy).length, 0); +assert.sameValue(Reflect.ownKeys(proxy).length, 0); + +for (var pk in proxy) { + forIn.push(pk); +} +assert.sameValue(forIn.length, 0); + diff --git a/test/staging/sm/PrivateName/parse-utf8-non-ascii-identifier.js b/test/staging/sm/PrivateName/parse-utf8-non-ascii-identifier.js new file mode 100644 index 0000000000..be9d89dacc --- /dev/null +++ b/test/staging/sm/PrivateName/parse-utf8-non-ascii-identifier.js @@ -0,0 +1,31 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +// Test that non-ASCII identifier names are correctly parsed in the Utf-8 parser. + +// Utf-8 encoding for U+05EF is (0xD7 0xAF), the first code unit isn't a valid +// Ascii ID_START code unit. +class NonAscii { + // U+05EF HEBREW YOD TRIANGLE + #ׯ; +} + +// Also check using Unicode escapes works. +class NonAsciiUnicodeEscape1 { + // U+05EF HEBREW YOD TRIANGLE + #\u05ef; +} + +class NonAsciiUnicodeEscape2 { + // U+05EF HEBREW YOD TRIANGLE + #\u{5ef}; +} + diff --git a/test/staging/sm/PrivateName/proxy-1.js b/test/staging/sm/PrivateName/proxy-1.js new file mode 100644 index 0000000000..cbbf42a0d5 --- /dev/null +++ b/test/staging/sm/PrivateName/proxy-1.js @@ -0,0 +1,30 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ + +class A { + #x = 10; + g() { + return this.#x; + } +}; + +var p = new Proxy(new A, {}); +var completed = false; +try { + p.g(); + completed = true; +} catch (e) { + assert.sameValue(e instanceof TypeError, true); +} +assert.sameValue(completed, false); + + diff --git a/test/staging/sm/PrivateName/proxy-init-set.js b/test/staging/sm/PrivateName/proxy-init-set.js new file mode 100644 index 0000000000..e6fd9d9659 --- /dev/null +++ b/test/staging/sm/PrivateName/proxy-init-set.js @@ -0,0 +1,83 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +// Ensure that the distinction between Proxy Init and Proxy Set holds + +function assertThrowsTypeError(f) { + var type; + try { + f(); + } catch (ex) { + type = ex.name; + } + assert.sameValue(type, 'TypeError'); +} + + + +var target = {}; +var p1 = new Proxy(target, {}); +var p2 = new Proxy(target, {}); + +class Base { + constructor(o) { + return o; + } +} + +class A extends Base { + #field = 10; + static gf(o) { + return o.#field; + } + static sf(o) { + o.#field = 15; + } +} + +class B extends Base { + #field = 25; + static gf(o) { + return o.#field; + } + static sf(o) { + o.#field = 20; + } +} + +// Verify field handling on the proxy we install it on. +new A(p1); +assert.sameValue(A.gf(p1), 10); +A.sf(p1) +assert.sameValue(A.gf(p1), 15); + +// Despite P1 being stamped with A's field, it shouldn't +// be sufficient to set B's field. +assertThrowsTypeError(() => B.sf(p1)); +assertThrowsTypeError(() => B.gf(p1)); +assertThrowsTypeError(() => B.sf(p1)); +new B(p1); +assert.sameValue(B.gf(p1), 25); +B.sf(p1); +assert.sameValue(B.gf(p1), 20); + +// A's field should't be on the target +assertThrowsTypeError(() => A.gf(target)); + +// Can't set the field, doesn't exist +assertThrowsTypeError(() => A.sf(p2)); + +// Definitely can't get the field, doesn't exist. +assertThrowsTypeError(() => A.gf(p2)); + +// Still should't be on the target. +assertThrowsTypeError(() => A.gf(target)); + diff --git a/test/staging/sm/PrivateName/read-private-eval.js b/test/staging/sm/PrivateName/read-private-eval.js new file mode 100644 index 0000000000..29c3d66b60 --- /dev/null +++ b/test/staging/sm/PrivateName/read-private-eval.js @@ -0,0 +1,22 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ + +class A { + #x = 14; + g() { + return eval('this.#x'); + } +} + +a = new A; +assert.sameValue(a.g(), 14); + diff --git a/test/staging/sm/PrivateName/unicode-names.js b/test/staging/sm/PrivateName/unicode-names.js new file mode 100644 index 0000000000..5ef70d46cc --- /dev/null +++ b/test/staging/sm/PrivateName/unicode-names.js @@ -0,0 +1,19 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ + +source = `class A { + // Ensure this name parses. + #℘; +}`; + +Function(source); + diff --git a/test/staging/sm/Promise/bug-1287334.js b/test/staging/sm/Promise/bug-1287334.js new file mode 100644 index 0000000000..c02f79c249 --- /dev/null +++ b/test/staging/sm/Promise/bug-1287334.js @@ -0,0 +1,17 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +var promise = Promise.resolve(1); +var FakeCtor = function(exec){ exec(function(){}, function(){}); }; +Object.defineProperty(Promise, Symbol.species, {value: FakeCtor}); +// This just shouldn't crash. It does without bug 1287334 fixed. +promise.then(function(){}); + diff --git a/test/staging/sm/Promise/bug-1288382.js b/test/staging/sm/Promise/bug-1288382.js new file mode 100644 index 0000000000..1e578a665f --- /dev/null +++ b/test/staging/sm/Promise/bug-1288382.js @@ -0,0 +1,18 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +// This just shouldn't trigger a failed assert. +// It does without bug 1288382 fixed. +Promise.all.call(class { + constructor(exec){ exec(()=>{}, ()=>{}); } + static resolve() { return {then(){}}; } +}, [null]); + diff --git a/test/staging/sm/Promise/bug-1289040.js b/test/staging/sm/Promise/bug-1289040.js new file mode 100644 index 0000000000..7ad6b46121 --- /dev/null +++ b/test/staging/sm/Promise/bug-1289040.js @@ -0,0 +1,18 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +var global = createNewGlobal(); +Promise.prototype.then = global.Promise.prototype.then; +p1 = new Promise(function f(r) { + r(1); +}); +p2 = p1.then(function g(){}); + diff --git a/test/staging/sm/Promise/for-of-iterator-uses-getv.js b/test/staging/sm/Promise/for-of-iterator-uses-getv.js new file mode 100644 index 0000000000..08b01c84ca --- /dev/null +++ b/test/staging/sm/Promise/for-of-iterator-uses-getv.js @@ -0,0 +1,34 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +flags: +- onlyStrict +includes: [sm/non262-shell.js, sm/non262.js] +description: | + pending +esid: pending +---*/ +"use strict"; // Use strict-mode to ensure |this| arguments aren't converted to objects. + +var emptyIterator = { + next() { + return {done: true}; + } +}; + +Object.defineProperty(Number.prototype, Symbol.iterator, { + configurable: true, + get() { + assert.sameValue(typeof this, "number"); + return function() { + assert.sameValue(typeof this, "number"); + return emptyIterator; + } + } +}); + +Promise.all(0); +Promise.allSettled(0); +Promise.race(0); + diff --git a/test/staging/sm/Promise/methods-non-enumerable.js b/test/staging/sm/Promise/methods-non-enumerable.js new file mode 100644 index 0000000000..a0bcdb5237 --- /dev/null +++ b/test/staging/sm/Promise/methods-non-enumerable.js @@ -0,0 +1,14 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +assert.sameValue(Object.keys(Promise).length, 0); +assert.sameValue(Object.keys(Promise.prototype).length, 0); + diff --git a/test/staging/sm/Promise/promise-species.js b/test/staging/sm/Promise/promise-species.js new file mode 100644 index 0000000000..efa9a1831e --- /dev/null +++ b/test/staging/sm/Promise/promise-species.js @@ -0,0 +1,18 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +assert.sameValue(Promise[Symbol.species], Promise); +let prop = Object.getOwnPropertyDescriptor(Promise, Symbol.species); +assert.sameValue('get' in prop, true); +assert.sameValue(typeof prop.get, 'function'); +assert.sameValue('set' in prop, true); +assert.sameValue(prop.set, undefined); + diff --git a/test/staging/sm/Proxy/define-writable-as-non-writable.js b/test/staging/sm/Proxy/define-writable-as-non-writable.js new file mode 100644 index 0000000000..42132ed717 --- /dev/null +++ b/test/staging/sm/Proxy/define-writable-as-non-writable.js @@ -0,0 +1,29 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +flags: +- onlyStrict +includes: [sm/non262-shell.js, sm/non262.js] +description: | + pending +esid: pending +---*/ +"use strict"; + +var target = {}; +Object.defineProperty(target, "test", {configurable: false, writable: true, value: 5}); + +var proxy = new Proxy(target, { + defineProperty(target, property) { + assert.sameValue(property, "test"); + return true; + } +}); + +assertThrowsInstanceOf( + () => Object.defineProperty(proxy, "test", {writable: false}), TypeError); + +assertThrowsInstanceOf( + () => Reflect.defineProperty(proxy, "test", {writable: false}), TypeError); + diff --git a/test/staging/sm/Proxy/delete-non-extensible.js b/test/staging/sm/Proxy/delete-non-extensible.js new file mode 100644 index 0000000000..80fb7cc47e --- /dev/null +++ b/test/staging/sm/Proxy/delete-non-extensible.js @@ -0,0 +1,28 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +flags: +- onlyStrict +includes: [sm/non262-shell.js, sm/non262.js] +description: | + pending +esid: pending +---*/ +"use strict"; + +var target = { test: true }; +Object.preventExtensions(target); + +var proxy = new Proxy(target, { + deleteProperty(target, property) { + return true; + } +}); + +assert.sameValue(delete proxy.missing, true); +assert.sameValue(Reflect.deleteProperty(proxy, "missing"), true); + +assertThrowsInstanceOf(() => { delete proxy.test; }, TypeError); +assertThrowsInstanceOf(() => Reflect.deleteProperty(proxy, "test"), TypeError); + diff --git a/test/staging/sm/Proxy/getPrototypeOf.js b/test/staging/sm/Proxy/getPrototypeOf.js new file mode 100644 index 0000000000..803599574a --- /dev/null +++ b/test/staging/sm/Proxy/getPrototypeOf.js @@ -0,0 +1,290 @@ +/* + * Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/licenses/publicdomain/ + */ + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +var gTestfile = "getPrototypeOf.js"; +var BUGNUMBER = 888969; +var summary = "Scripted proxies' [[GetPrototypeOf]] behavior"; + +print(BUGNUMBER + ": " + summary); + +/************** + * BEGIN TEST * + **************/ + +const log = []; + +function observe(obj) +{ + var observingHandler = new Proxy({}, { + get(target, p, receiver) { + log.push(p); + return Reflect.get(target, p, receiver); + } + }); + + return new Proxy(obj, observingHandler); +} + +function nop() {} + +var p, h; + +// 1. Let handler be the value of the [[ProxyHandler]] internal slot of O. +// 2. If handler is null, throw a TypeError exception. +// 3. Assert: Type(handler) is Object. +var rev = Proxy.revocable({}, {}); +p = rev.proxy; + +assert.sameValue(Object.getPrototypeOf(p), Object.prototype); +rev.revoke(); +assertThrowsInstanceOf(() => Object.getPrototypeOf(p), TypeError); + +// 4. Let target be the value of the [[ProxyTarget]] internal slot of O. +// 5. Let trap be ? GetMethod(handler, "getPrototypeOf"). + +// Getting handler.getPrototypeOf might throw. +assertThrowsValue(() => Object.getPrototypeOf(new Proxy({}, + { get getPrototypeOf() { + throw 17; + } })), + 17); + +// The handler's getPrototypeOf, once gotten, might throw. +p = new Proxy({}, { getPrototypeOf() { throw 42; } }); + +assertThrowsValue(() => Object.getPrototypeOf(p), 42); + +// The trap might not be callable. +p = new Proxy({}, { getPrototypeOf: 17 }); + +assertThrowsInstanceOf(() => Object.getPrototypeOf(p), + TypeError); + +// 6. If trap is undefined, then +// a. Return ? target.[[GetPrototypeOf]](). + +var x, tp; + +tp = + new Proxy(new Number(8675309), // behavior overridden by getPrototypeOf + { getPrototypeOf() { x = "getPrototypeOf trap"; return null; } }); + +// The target's [[GetPrototypeOf]] should be invoked if the handler's +// .getPrototypeOf is undefined. +p = new Proxy(tp, { getPrototypeOf: undefined }); +x = "unset"; +assert.sameValue(Object.getPrototypeOf(p), null); +assert.sameValue(x, "getPrototypeOf trap"); + +// Likewise if the handler's .getPrototypeOf is null. +p = new Proxy(tp, { getPrototypeOf: null }); +x = "unset"; +assert.sameValue(Object.getPrototypeOf(p), null); +assert.sameValue(x, "getPrototypeOf trap"); + +// Now the target is an empty object with a Number object as its [[Prototype]]. +var customProto = new Number(8675309); +tp = + new Proxy({}, + { getPrototypeOf() { + x = "getPrototypeOf trap"; + return customProto; + } }); + +// The target's [[GetPrototypeOf]] should be invoked if the handler's +// .getPrototypeOf is undefined. +p = new Proxy(tp, { getPrototypeOf: undefined }); +x = "unset"; +assert.sameValue(Object.getPrototypeOf(p), customProto); +assert.sameValue(x, "getPrototypeOf trap"); + +// Likewise if the handler's .getPrototypeOf is null. +p = new Proxy(tp, { getPrototypeOf: null }); +x = "unset"; +assert.sameValue(Object.getPrototypeOf(p), customProto); +assert.sameValue(x, "getPrototypeOf trap"); + +// 7. Let handlerProto be ? Call(trap, handler, « target »). + +// The trap callable might throw. +p = new Proxy({}, { getPrototypeOf() { throw "ohai"; } }); + +assertThrowsValue(() => Object.getPrototypeOf(p), + "ohai"); + +var throwingTrap = + new Proxy(function() { throw "not called"; }, + { apply() { throw 37; } }); + +p = new Proxy({}, { getPrototypeOf: throwingTrap }); + +assertThrowsValue(() => Object.getPrototypeOf(p), + 37); + +// The trap callable must *only* be called. +p = new Proxy({}, + { + getPrototypeOf: observe(function() { throw "boo-urns"; }) + }); + +log.length = 0; +assertThrowsValue(() => Object.getPrototypeOf(p), + "boo-urns"); + +assert.sameValue(log.length, 1); +assert.sameValue(log[0], "apply"); + +// 8. If Type(handlerProto) is neither Object nor Null, throw a TypeError exception. + +var rval; + +var typeTestingTarget = {}; +p = new Proxy(typeTestingTarget, { getPrototypeOf() { return rval; } }); + +function returnsPrimitives() +{ + rval = undefined; + assertThrowsInstanceOf(() => Object.getPrototypeOf(p), + TypeError); + + rval = true; + assertThrowsInstanceOf(() => Object.getPrototypeOf(p), + TypeError); + + rval = false; + assertThrowsInstanceOf(() => Object.getPrototypeOf(p), + TypeError); + + rval = 0.0; + assertThrowsInstanceOf(() => Object.getPrototypeOf(p), + TypeError); + + rval = -0.0; + assertThrowsInstanceOf(() => Object.getPrototypeOf(p), + TypeError); + + rval = 3.141592654; + assertThrowsInstanceOf(() => Object.getPrototypeOf(p), + TypeError); + + rval = NaN; + assertThrowsInstanceOf(() => Object.getPrototypeOf(p), + TypeError); + + rval = -Infinity; + assertThrowsInstanceOf(() => Object.getPrototypeOf(p), + TypeError); + + rval = "[[Prototype]] FOR REALZ"; + assertThrowsInstanceOf(() => Object.getPrototypeOf(p), + TypeError); + + rval = Symbol("[[Prototype]] FOR REALZ"); + assertThrowsInstanceOf(() => Object.getPrototypeOf(p), + TypeError); +} + +returnsPrimitives(); +Object.preventExtensions(typeTestingTarget); +returnsPrimitives(); + +// 9. Let extensibleTarget be ? IsExtensible(target). + +var act, extens; + +var typeTestingProxyTarget = + new Proxy({}, { isExtensible() { + seen = act(); + return extens; + } }); + +p = new Proxy(typeTestingProxyTarget, { getPrototypeOf() { return rval; } }); + +rval = null; +act = () => { throw "fnord" }; +assertThrowsValue(() => Object.getPrototypeOf(p), + "fnord"); + +rval = /abc/; +act = () => { throw "fnord again" }; +assertThrowsValue(() => Object.getPrototypeOf(p), + "fnord again"); + +rval = Object.prototype; +act = () => { throw "fnord" }; +assertThrowsValue(() => Object.getPrototypeOf(p), + "fnord"); + +// 10. If extensibleTarget is true, return handlerProto. + +p = new Proxy({}, { getPrototypeOf() { return rval; } }); + +rval = Number.prototype; +assert.sameValue(Object.getPrototypeOf(p), Number.prototype); + +// 11. Let targetProto be ? target.[[GetPrototypeOf]](). + +var targetProto; + +var targetWithProto = + new Proxy(Object.preventExtensions(Object.create(null)), + { getPrototypeOf() { act2(); return targetProto; } }); + +p = new Proxy(targetWithProto, + { getPrototypeOf() { act1(); return rval; } }); + +rval = null; +targetProto = null; + +var regex = /targetProto/; + +act1 = () => log.push("act1"); +act2 = () => log.push("act2"); + +log.length = 0; +assert.sameValue(Object.getPrototypeOf(p), null); +assert.sameValue(log.length, 2); +assert.sameValue(log[0], "act1"); +assert.sameValue(log[1], "act2"); + +act1 = () => log.push("act1 again"); +act2 = () => { throw "target throw"; }; + +log.length = 0; +assertThrowsValue(() => Object.getPrototypeOf(p), + "target throw"); +assert.sameValue(log.length, 1); +assert.sameValue(log[0], "act1 again"); + +// 12. If SameValue(handlerProto, targetProto) is false, throw a TypeError exception. + +act1 = act2 = nop; +rval = /a/; +assertThrowsInstanceOf(() => Object.getPrototypeOf(p), + TypeError); + +// 13. Return handlerProto. + +rval = null; +targetProto = null; + +assert.sameValue(Object.getPrototypeOf(p), null); + +p = new Proxy(Object.preventExtensions(new Number(55)), + { getPrototypeOf() { return Number.prototype; } }); + +assert.sameValue(Object.getPrototypeOf(p), Number.prototype); + +/******************************************************************************/ + +print("Tests complete"); diff --git a/test/staging/sm/Proxy/global-receiver.js b/test/staging/sm/Proxy/global-receiver.js new file mode 100644 index 0000000000..97cc9b1f45 --- /dev/null +++ b/test/staging/sm/Proxy/global-receiver.js @@ -0,0 +1,45 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +// The global object can be the receiver passed to the get and set traps of a Proxy. +var global = this; +var proto = Object.getPrototypeOf(global); +var gets = 0, sets = 0; + +try { + Object.setPrototypeOf(global, new Proxy(proto, { + has(t, id) { + return id === "bareword" || Reflect.has(t, id); + }, + get(t, id, r) { + gets++; + assert.sameValue(r, global); + return Reflect.get(t, id, r); + }, + set(t, id, v, r) { + sets++; + assert.sameValue(r, global); + return Reflect.set(t, id, v, r); + } + })); +} catch (e) { + global.bareword = undefined; + gets = 1; + sets = 1; +} + +assert.sameValue(bareword, undefined); +assert.sameValue(gets, 1); + +bareword = 12; +assert.sameValue(sets, 1); +assert.sameValue(global.bareword, 12); + diff --git a/test/staging/sm/Proxy/hasInstance.js b/test/staging/sm/Proxy/hasInstance.js new file mode 100644 index 0000000000..6b8a790574 --- /dev/null +++ b/test/staging/sm/Proxy/hasInstance.js @@ -0,0 +1,23 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [deepEqual.js, sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +var get = []; +var fun = function() {} +var p = new Proxy(fun, { + get(target, key) { + get.push(key); + return target[key]; + } +}); + +assert.sameValue(new fun instanceof p, true); +assert.deepEqual(get, [Symbol.hasInstance, "prototype"]); + diff --git a/test/staging/sm/Proxy/json-stringify-replacer-array-revocable-proxy.js b/test/staging/sm/Proxy/json-stringify-replacer-array-revocable-proxy.js new file mode 100644 index 0000000000..fb2c8762b1 --- /dev/null +++ b/test/staging/sm/Proxy/json-stringify-replacer-array-revocable-proxy.js @@ -0,0 +1,46 @@ +/* + * Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/licenses/publicdomain/ + */ + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +var gTestfile = "json-stringify-replacer-array-revocable-proxy.js"; +//----------------------------------------------------------------------------- +var BUGNUMBER = 1196497; +var summary = + "Don't assert when JSON.stringify is passed a revocable proxy to an array, " + + "then that proxy is revoked midflight during stringification"; + +print(BUGNUMBER + ": " + summary); + +/************** + * BEGIN TEST * + **************/ + +var arr = []; +var { proxy, revoke } = Proxy.revocable(arr, { + get(thisv, prop, receiver) { + // First (and only) get will be for "length", to determine the length of the + // list of properties to serialize. Returning 0 uses the empty list, + // resulting in |a: 0| being ignored below. + assert.sameValue(thisv, arr); + assert.sameValue(prop, "length"); + assert.sameValue(receiver, proxy); + + revoke(); + return 0; + } +}); + +assert.sameValue(JSON.stringify({a: 0}, proxy), "{}"); + +/******************************************************************************/ + +print("Tests complete"); diff --git a/test/staging/sm/Proxy/ownkeys-allowed-types.js b/test/staging/sm/Proxy/ownkeys-allowed-types.js new file mode 100644 index 0000000000..0ab2a0a491 --- /dev/null +++ b/test/staging/sm/Proxy/ownkeys-allowed-types.js @@ -0,0 +1,29 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +function makeProxy(type) { + return new Proxy({}, { ownKeys() { return [type]; } }); +} + +for (var type of [123, 12.5, true, false, undefined, null, {}, []]) { + var proxy = makeProxy(type); + assertThrowsInstanceOf(() => Object.ownKeys(proxy), TypeError); + assertThrowsInstanceOf(() => Object.getOwnPropertyNames(proxy), TypeError); +} + +type = Symbol(); +proxy = makeProxy(type); +assert.sameValue(Object.getOwnPropertySymbols(proxy)[0], type); + +type = "abc"; +proxy = makeProxy(type); +assert.sameValue(Object.getOwnPropertyNames(proxy)[0], type); + diff --git a/test/staging/sm/Proxy/ownkeys-linear.js b/test/staging/sm/Proxy/ownkeys-linear.js new file mode 100644 index 0000000000..44e728fa2f --- /dev/null +++ b/test/staging/sm/Proxy/ownkeys-linear.js @@ -0,0 +1,75 @@ +/* + * Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/licenses/publicdomain/ + */ + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +var gTestfile = 'ownkeys-linear.js'; +var BUGNUMBER = 1257779; +var summary = + "Scripted proxies' [[OwnPropertyKeys]] should have linear complexity"; + +print(BUGNUMBER + ": " + summary); + +/************** + * BEGIN TEST * + **************/ + +// Making this 50k makes cgc builds time out on tbpl. 5k takes 28s locally. +// 10k takes 84s locally. So pick an intermediate number, with a generous +// constant factor in case cgc-on-tbpl is much slower. +const HALF_COUNT = 7500; + +var configurables = []; +for (var i = 0; i < HALF_COUNT; i++) + configurables.push("conf" + i); + +var nonconfigurables = []; +for (var i = 0; i < HALF_COUNT; i++) + nonconfigurables.push("nonconf" + i); + +var target = {}; +for (var name of configurables) + Object.defineProperty(target, name, { configurable: false, value: 0 }); +for (var name of nonconfigurables) + Object.defineProperty(target, name, { configurable: true, value: 0 }); + +var handler = { + ownKeys(t) { + assert.sameValue(t, target, "target mismatch!"); + + var trapResult = []; + + // Append all nonconfigurables in reverse order of presence. + for (var i = nonconfigurables.length; i > 0; i--) + trapResult.push(nonconfigurables[i - 1]); + + // Then the same for all configurables. + for (var i = configurables.length; i > 0; i--) + trapResult.push(configurables[i - 1]); + + // The end consequence is that this ordering is exactly opposite the + // ordering they'll have on the target, and so worst-case performance will + // occur if the spec's |uncheckedResultKeys| structure is a vector having + // the same order as |trapResult|, searched from beginning to end in the + // presence-checks in the last few steps of the [[OwnPropertyKeys]] + // algorithm. + return trapResult; + } +}; + +var p = new Proxy(target, handler); + +// The test passes if it doesn't time out. +assert.sameValue(Object.getOwnPropertyNames(p).length, HALF_COUNT * 2); + +/******************************************************************************/ + +print("Tests complete"); diff --git a/test/staging/sm/Proxy/ownkeys-trap-duplicates.js b/test/staging/sm/Proxy/ownkeys-trap-duplicates.js new file mode 100644 index 0000000000..7a2d1dc24e --- /dev/null +++ b/test/staging/sm/Proxy/ownkeys-trap-duplicates.js @@ -0,0 +1,38 @@ +/* + * Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/licenses/publicdomain/ + */ + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +var gTestfile = 'ownkeys-trap-duplicates.js'; +var BUGNUMBER = 1293995; +var summary = + "Scripted proxies' [[OwnPropertyKeys]] should not throw if the trap " + + "implementation returns duplicate properties and the object is " + + "non-extensible or has non-configurable properties." + + "Revised (bug 1389752): Throw TypeError for duplicate properties."; + +print(BUGNUMBER + ": " + summary); + +/************** + * BEGIN TEST * + **************/ + +var target = Object.preventExtensions({ a: 1 }); +var proxy = new Proxy(target, { ownKeys(t) { return ["a", "a"]; } }); +assertThrowsInstanceOf(() => Object.getOwnPropertyNames(proxy), TypeError); + +target = Object.freeze({ a: 1 }); +proxy = new Proxy(target, { ownKeys(t) { return ["a", "a"]; } }); +assertThrowsInstanceOf(() => Object.getOwnPropertyNames(proxy), TypeError); + +/******************************************************************************/ + +print("Tests complete"); diff --git a/test/staging/sm/Proxy/proxy-__proto__.js b/test/staging/sm/Proxy/proxy-__proto__.js new file mode 100644 index 0000000000..936faa576f --- /dev/null +++ b/test/staging/sm/Proxy/proxy-__proto__.js @@ -0,0 +1,64 @@ +/* + * Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/licenses/publicdomain/ + */ + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +var gTestfile = 'proxy-__proto__.js'; +var BUGNUMBER = 950407; +var summary = "Behavior of __proto__ on ES6 proxies"; + +print(BUGNUMBER + ": " + summary); + +/************** + * BEGIN TEST * + **************/ + +var protoDesc = Object.getOwnPropertyDescriptor(Object.prototype, "__proto__"); +var protoGetter = protoDesc.get; +var protoSetter = protoDesc.set; + +function testProxy(target, initialProto) +{ + print("Now testing behavior for new Proxy(" + ("" + target) + ", {})"); + + var pobj = new Proxy(target, {}); + + // Check [[Prototype]] before attempted mutation + assert.sameValue(Object.getPrototypeOf(pobj), initialProto); + assert.sameValue(protoGetter.call(pobj), initialProto); + + // Attempt [[Prototype]] mutation + protoSetter.call(pobj, null); + + // Check [[Prototype]] after attempted mutation + assert.sameValue(Object.getPrototypeOf(pobj), null); + assert.sameValue(protoGetter.call(pobj), null); + assert.sameValue(Object.getPrototypeOf(target), null); +} + +// Proxy object with non-null [[Prototype]] +var nonNullProto = { toString: function() { return "non-null prototype"; } }; +var target = Object.create(nonNullProto); +testProxy(target, nonNullProto); + +// Proxy object with null [[Prototype]] +target = Object.create(null); +target.toString = function() { return "null prototype" }; +testProxy(target, null); + +// Proxy function with [[Call]] +var callForCallOnly = function () { }; +callForCallOnly.toString = function() { return "callable target"; }; +testProxy(callForCallOnly, Function.prototype); + +/******************************************************************************/ + +print("Tests complete"); diff --git a/test/staging/sm/Proxy/proxy-constructNonObject.js b/test/staging/sm/Proxy/proxy-constructNonObject.js new file mode 100644 index 0000000000..69347f1c01 --- /dev/null +++ b/test/staging/sm/Proxy/proxy-constructNonObject.js @@ -0,0 +1,27 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +function bogusConstruct(target) { return 4; } +function bogusConstructUndefined(target) { } + +var handler = { construct: bogusConstruct } + +function callable() {} + +var p = new Proxy(callable, handler); + +assertThrowsInstanceOf(function () { new p(); }, TypeError, + "[[Construct must throw if an object is not returned."); + +handler.construct = bogusConstructUndefined; +assertThrowsInstanceOf(function () { new p(); }, TypeError, + "[[Construct must throw if an object is not returned."); + diff --git a/test/staging/sm/Proxy/proxy-no-receiver-overwrite.js b/test/staging/sm/Proxy/proxy-no-receiver-overwrite.js new file mode 100644 index 0000000000..ea815f5ee2 --- /dev/null +++ b/test/staging/sm/Proxy/proxy-no-receiver-overwrite.js @@ -0,0 +1,32 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +flags: +- onlyStrict +includes: [sm/non262-shell.js, sm/non262.js] +description: | + pending +esid: pending +---*/ +"use strict"; + +var y = new Proxy({}, { + getOwnPropertyDescriptor(target, key) { + if (key === "a") { + return { configurable: true, get: function(v) {} }; + } else { + assert.sameValue(key, "b"); + return { configurable: true, writable: false, value: 15 }; + } + }, + + defineProperty() { + throw "not invoked"; + } +}) + +// This will invoke [[Set]] on the target, with the proxy as receiver. +assertThrowsInstanceOf(() => y.a = 1, TypeError); +assertThrowsInstanceOf(() => y.b = 2, TypeError); + diff --git a/test/staging/sm/Proxy/proxy-proto-lazy-props.js b/test/staging/sm/Proxy/proxy-proto-lazy-props.js new file mode 100644 index 0000000000..34a82f1479 --- /dev/null +++ b/test/staging/sm/Proxy/proxy-proto-lazy-props.js @@ -0,0 +1,70 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +function makeProxyPrototype(target) { + return Object.setPrototypeOf(target, new Proxy({}, new Proxy({ + getPrototypeOf() { + return null; + }, + ownKeys() { + return []; + }, + get(t, pk, r) { + throw new Error("Unexpected [[Get]]: " + String(pk)); + } + }, { + get(t, pk, r) { + if (pk in t) + return Reflect.get(t, pk, r); + throw new Error("Unexpected trap called: " + pk); + } + }))); +} + +function enumerateMappedArgs(x) { + var a = makeProxyPrototype(arguments); + + // Delete all lazy properties and ensure no [[Has]] trap is called for them + // on the prototype chain. + delete a.length; + delete a.callee; + delete a[Symbol.iterator]; + delete a[0]; + + for (var k in a); +} +enumerateMappedArgs(0); + +function enumerateUnmappedArgs(x) { + "use strict"; + var a = makeProxyPrototype(arguments); + + delete a.length; + // delete a.callee; // .callee is non-configurable + delete a[Symbol.iterator]; + delete a[0]; + + for (var k in a); +} +enumerateUnmappedArgs(0); + +function enumerateFunction() { + var f = makeProxyPrototype(function named() {}); + + // delete f.prototype; // .prototype is non-configurable + delete f.length; + delete f.name; + + for (var k in f); +} +enumerateFunction(); + + diff --git a/test/staging/sm/Proxy/proxy-with-revoked-arguments.js b/test/staging/sm/Proxy/proxy-with-revoked-arguments.js new file mode 100644 index 0000000000..31ab4fc5ca --- /dev/null +++ b/test/staging/sm/Proxy/proxy-with-revoked-arguments.js @@ -0,0 +1,62 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +var BUGNUMBER = 1151149; +var summary = "Proxy constructor should not throw if either the target or handler is a revoked proxy."; + +print(BUGNUMBER + ": " + summary); + +var p = new Proxy({}, {}); + +new Proxy(p, {}); +new Proxy({}, p); + +var r = Proxy.revocable({}, {}); +p = r.proxy; + +new Proxy(p, {}); +new Proxy({}, p); + +r.revoke(); + +new Proxy(p, {}); +new Proxy({}, p); + + +var r2 = Proxy.revocable({}, {}); +r = Proxy.revocable(r2.proxy, {}); +p = r.proxy; + +new Proxy(p, {}); +new Proxy({}, p); + +r2.revoke(); + +new Proxy(p, {}); +new Proxy({}, p); + +r.revoke(); + +new Proxy(p, {}); +new Proxy({}, p); + + +var g = createNewGlobal(); +p = g.eval(`var r = Proxy.revocable({}, {}); r.proxy;`); + +new Proxy(p, {}); +new Proxy({}, p); + +g.eval(`r.revoke();`); + +new Proxy(p, {}); +new Proxy({}, p); + diff --git a/test/staging/sm/Proxy/regress-bug1037770.js b/test/staging/sm/Proxy/regress-bug1037770.js new file mode 100644 index 0000000000..5f4b866e3e --- /dev/null +++ b/test/staging/sm/Proxy/regress-bug1037770.js @@ -0,0 +1,16 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +foo = 1; +Object.defineProperty(this, "foo", {writable:false, configurable:true}); +foo = 2; +assert.sameValue(foo, 1); + diff --git a/test/staging/sm/Proxy/regress-bug1062349.js b/test/staging/sm/Proxy/regress-bug1062349.js new file mode 100644 index 0000000000..dbd8400f70 --- /dev/null +++ b/test/staging/sm/Proxy/regress-bug1062349.js @@ -0,0 +1,41 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [deepEqual.js, sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +// Adapted from a test case contributed by André Bargull in bug 1062349. + +var log = []; +var hh = { + get(t, pk) { + log.push("trap: " + pk); + return t[pk]; + } +}; +var h = new Proxy({ + get set() { + log.push("called set()"); + Object.defineProperty(o, "prop", {value: 0}); + log.push("o.prop:", Object.getOwnPropertyDescriptor(o, "prop")); + } +}, hh); +var p = new Proxy({}, h); +var o = {__proto__: p}; + +o.prop = 1; + +var expectedDesc = {value: 0, writable: false, enumerable: false, configurable: false}; +assert.deepEqual(log, [ + "trap: set", + "called set()", + "o.prop:", + expectedDesc +]); +assert.deepEqual(Object.getOwnPropertyDescriptor(o, "prop"), expectedDesc); + diff --git a/test/staging/sm/Proxy/regress-bug950407.js b/test/staging/sm/Proxy/regress-bug950407.js new file mode 100644 index 0000000000..d2fa6ea2c4 --- /dev/null +++ b/test/staging/sm/Proxy/regress-bug950407.js @@ -0,0 +1,18 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +var ab = new ArrayBuffer(5); +var p = new Proxy(ab, {}); +var ps = Object.getOwnPropertyDescriptor(Object.prototype, "__proto__").set; +var new_proto = {}; +ps.call(p, new_proto); + +assert.sameValue(ab.__proto__, new_proto); diff --git a/test/staging/sm/Proxy/report-writable-as-non-writable.js b/test/staging/sm/Proxy/report-writable-as-non-writable.js new file mode 100644 index 0000000000..5278781948 --- /dev/null +++ b/test/staging/sm/Proxy/report-writable-as-non-writable.js @@ -0,0 +1,30 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +flags: +- onlyStrict +includes: [sm/non262-shell.js, sm/non262.js] +description: | + pending +esid: pending +---*/ +"use strict"; + +var target = {}; +Object.defineProperty(target, "test", + {configurable: false, writable: true, value: 1}); + +var proxy = new Proxy(target, { + getOwnPropertyDescriptor(target, property) { + assert.sameValue(property, "test"); + return {configurable: false, writable: false, value: 1}; + } +}); + +assertThrowsInstanceOf(() => Object.getOwnPropertyDescriptor(proxy, "test"), + TypeError); + +assertThrowsInstanceOf(() => Reflect.getOwnPropertyDescriptor(proxy, "test"), + TypeError); + diff --git a/test/staging/sm/Proxy/revocable-proxy-prototype.js b/test/staging/sm/Proxy/revocable-proxy-prototype.js new file mode 100644 index 0000000000..31de3b7c62 --- /dev/null +++ b/test/staging/sm/Proxy/revocable-proxy-prototype.js @@ -0,0 +1,45 @@ +/* + * Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/licenses/publicdomain/ + */ + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +var gTestfile = 'revocable-proxy-prototype.js'; +var BUGNUMBER = 1052139; +var summary = "Accessing a revocable proxy's [[Prototype]] shouldn't crash"; + +print(BUGNUMBER + ": " + summary); + +/************** + * BEGIN TEST * + **************/ +function checkFunctionAppliedToRevokedProxy(fun) +{ + var p = Proxy.revocable({}, {}); + p.revoke(); + + try + { + fun(p.proxy); + throw "didn't throw"; + } + catch (e) + { + assert.sameValue(e instanceof TypeError, true, + "expected TypeError, got " + e); + } +} + +checkFunctionAppliedToRevokedProxy(proxy => Object.getPrototypeOf(proxy)); +checkFunctionAppliedToRevokedProxy(proxy => Object.setPrototypeOf(proxy, null)); + +/******************************************************************************/ + +print("Tests complete"); diff --git a/test/staging/sm/Proxy/revoke-as-side-effect.js b/test/staging/sm/Proxy/revoke-as-side-effect.js new file mode 100644 index 0000000000..475d6aaf0b --- /dev/null +++ b/test/staging/sm/Proxy/revoke-as-side-effect.js @@ -0,0 +1,82 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +function createProxy(proxyTarget) { + var {proxy, revoke} = Proxy.revocable(proxyTarget, new Proxy({}, { + get(target, propertyKey, receiver) { + print("trap get:", propertyKey); + revoke(); + } + })); + return proxy; +} + +var obj; + +// [[GetPrototypeOf]] +assert.sameValue(Object.getPrototypeOf(createProxy({})), Object.prototype); +assert.sameValue(Object.getPrototypeOf(createProxy([])), Array.prototype); + +// [[SetPrototypeOf]] +obj = {}; +Object.setPrototypeOf(createProxy(obj), Array.prototype); +assert.sameValue(Object.getPrototypeOf(obj), Array.prototype); + +// [[IsExtensible]] +assert.sameValue(Object.isExtensible(createProxy({})), true); +assert.sameValue(Object.isExtensible(createProxy(Object.preventExtensions({}))), false); + +// [[PreventExtensions]] +obj = {}; +Object.preventExtensions(createProxy(obj)); +assert.sameValue(Object.isExtensible(obj), false); + +// [[GetOwnProperty]] +assert.sameValue(Object.getOwnPropertyDescriptor(createProxy({}), "a"), undefined); +assert.sameValue(Object.getOwnPropertyDescriptor(createProxy({a: 5}), "a").value, 5); + +// [[DefineOwnProperty]] +obj = {}; +Object.defineProperty(createProxy(obj), "a", {value: 5}); +assert.sameValue(obj.a, 5); + +// [[HasProperty]] +assert.sameValue("a" in createProxy({}), false); +assert.sameValue("a" in createProxy({a: 5}), true); + +// [[Get]] +assert.sameValue(createProxy({}).a, undefined); +assert.sameValue(createProxy({a: 5}).a, 5); + +// [[Set]] +assertThrowsInstanceOf(() => createProxy({}).a = 0, TypeError); +assertThrowsInstanceOf(() => createProxy({a: 5}).a = 0, TypeError); + +// [[Delete]] +assert.sameValue(delete createProxy({}).a, true); +assert.sameValue(delete createProxy(Object.defineProperty({}, "a", {configurable: false})).a, false); + +// [[OwnPropertyKeys]] +assert.sameValue(Object.getOwnPropertyNames(createProxy({})).length, 0); +assert.sameValue(Object.getOwnPropertyNames(createProxy({a: 5})).length, 1); + +// [[Call]] +assert.sameValue(createProxy(function() { return "ok" })(), "ok"); + +// [[Construct]] +// This throws because after the "construct" trap on the proxy is consulted, +// OrdinaryCreateFromConstructor (called because the |q| function's +// [[ConstructorKind]] is "base" per FunctionAllocate) accesses +// |new.target.prototype| to create the |this| for the construct operation, that +// would be returned if |return obj;| didn't override it. +assertThrowsInstanceOf(() => new (createProxy(function q(){ return obj; })), + TypeError); + diff --git a/test/staging/sm/Proxy/revoke-no-name.js b/test/staging/sm/Proxy/revoke-no-name.js new file mode 100644 index 0000000000..24abb3169f --- /dev/null +++ b/test/staging/sm/Proxy/revoke-no-name.js @@ -0,0 +1,13 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +var revocationFunction = Proxy.revocable({}, {}).revoke; +assert.sameValue(revocationFunction.name, ""); diff --git a/test/staging/sm/Proxy/revoked-get-function-realm-typeerror.js b/test/staging/sm/Proxy/revoked-get-function-realm-typeerror.js new file mode 100644 index 0000000000..151cd521b6 --- /dev/null +++ b/test/staging/sm/Proxy/revoked-get-function-realm-typeerror.js @@ -0,0 +1,128 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +var constructors = [ + // 19.1 Object Objects + {constructor: Object}, + + // 19.2 Function Objects + {constructor: Function}, + + // 19.3 Boolean Objects + {constructor: Boolean}, + + // 19.5 Error Objects + {constructor: Error}, + + // 19.5.5 Native Error Types Used in This Standard + {constructor: EvalError}, + {constructor: RangeError}, + {constructor: ReferenceError}, + {constructor: SyntaxError}, + {constructor: TypeError}, + {constructor: URIError}, + + // 20.1 Number Objects + {constructor: Number}, + + // 20.3 Date Objects + {constructor: Date}, + + // 21.1 String Objects + {constructor: String}, + + // 21.2 RegExp (Regular Expression) Objects + {constructor: RegExp}, + + // 22.1 Array Objects + {constructor: Array}, + + // 22.2 TypedArray Objects + {constructor: Int8Array}, + + // 23.1 Map Objects + {constructor: Map}, + + // 23.2 Set Objects + {constructor: Set}, + + // 23.3 WeakMap Objects + {constructor: WeakMap}, + + // 23.4 WeakSet Objects + {constructor: WeakSet}, + + // 24.1 ArrayBuffer Objects + {constructor: ArrayBuffer}, + + // 24.2 SharedArrayBuffer Objects + ...(typeof SharedArrayBuffer === "function" ? [{constructor: SharedArrayBuffer}] : []), + + // 24.3 DataView Objects + {constructor: DataView, args: [new ArrayBuffer(0)]}, + + // 25.2 GeneratorFunction Objects + {constructor: function*(){}.constructor}, + + // 25.3 AsyncGeneratorFunction Objects + {constructor: async function*(){}.constructor}, + + // 25.6 Promise Objects + {constructor: Promise, args: [function(){}]}, + + // 25.7 AsyncFunction Objects + {constructor: async function(){}.constructor}, + + // 9.2 ECMAScript Function Objects + {constructor: function(){}}, + + // Intl can be disabled at compile-time. + ...(typeof Intl !== "undefined" ? [ + // 10 Collator Objects + {constructor: Intl.Collator}, + + // 11 NumberFormat Objects + {constructor: Intl.NumberFormat}, + + // 12 DateTimeFormat Objects + {constructor: Intl.DateTimeFormat}, + + // 13 PluralRules Objects + {constructor: Intl.PluralRules}, + + // Intl.RelativeTimeFormat proposal + {constructor: Intl.RelativeTimeFormat}, + + // Intl.Locale is not yet enabled by default. + ...(Intl.Locale ? [Intl.Locale] : []), + ] : []), +]; + +for (let {constructor, args = []} of constructors) { + let revoked = 0; + let {proxy, revoke} = Proxy.revocable(function(){}, { + get(t, pk, r) { + if (pk === "prototype") { + revoked++; + revoke(); + return undefined; + } + return Reflect.get(t, pk, r); + } + }); + + assertThrowsInstanceOf(() => { + Reflect.construct(constructor, args, proxy); + }, TypeError); + + assert.sameValue(revoked, 1); +} + diff --git a/test/staging/sm/Proxy/setPrototypeOf.js b/test/staging/sm/Proxy/setPrototypeOf.js new file mode 100644 index 0000000000..69c31b746c --- /dev/null +++ b/test/staging/sm/Proxy/setPrototypeOf.js @@ -0,0 +1,263 @@ +/* + * Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/licenses/publicdomain/ + */ + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +var gTestfile = "setPrototypeOf.js"; +var BUGNUMBER = 888969; +var summary = "Scripted proxies' [[SetPrototypeOf]] behavior"; + +print(BUGNUMBER + ": " + summary); + +/************** + * BEGIN TEST * + **************/ + +const log = []; + +function observe(obj) +{ + var observingHandler = new Proxy({}, { + get(target, p, receiver) { + log.push(p); + return Reflect.get(target, p, receiver); + } + }); + + return new Proxy(obj, observingHandler); +} + +var p, h; + +// 1. Assert: Either Type(V) is Object or Type(V) is Null. +// 2. Let handler be the value of the [[ProxyHandler]] internal slot of O. +// 3. If handler is null, throw a TypeError exception. +// 4. Assert: Type(handler) is Object. +// 5. Let target be the value of the [[ProxyTarget]] internal slot of O. + +var rev = Proxy.revocable({}, {}); +p = rev.proxy; + +var originalProto = Reflect.getPrototypeOf(p); +assert.sameValue(originalProto, Object.prototype); + +rev.revoke(); +assertThrowsInstanceOf(() => Reflect.setPrototypeOf(p, originalProto), + TypeError); +assertThrowsInstanceOf(() => Reflect.setPrototypeOf(p, null), + TypeError); + +// 6. Let trap be ? GetMethod(handler, "setPrototypeOf"). + +// handler has uncallable (and not null/undefined) property +p = new Proxy({}, { setPrototypeOf: 9 }); +assertThrowsInstanceOf(() => Reflect.setPrototypeOf(p, null), + TypeError); + +p = new Proxy({}, { setPrototypeOf: -3.7 }); +assertThrowsInstanceOf(() => Reflect.setPrototypeOf(p, null), + TypeError); + +p = new Proxy({}, { setPrototypeOf: NaN }); +assertThrowsInstanceOf(() => Reflect.setPrototypeOf(p, null), + TypeError); + +p = new Proxy({}, { setPrototypeOf: Infinity }); +assertThrowsInstanceOf(() => Reflect.setPrototypeOf(p, null), + TypeError); + +p = new Proxy({}, { setPrototypeOf: true }); +assertThrowsInstanceOf(() => Reflect.setPrototypeOf(p, null), + TypeError); + +p = new Proxy({}, { setPrototypeOf: /x/ }); +assertThrowsInstanceOf(() => Reflect.setPrototypeOf(p, null), + TypeError); + +p = new Proxy({}, { setPrototypeOf: Symbol(42) }); +assertThrowsInstanceOf(() => Reflect.setPrototypeOf(p, null), + TypeError); + +p = new Proxy({}, { setPrototypeOf: class X {} }); +assertThrowsInstanceOf(() => Reflect.setPrototypeOf(p, null), + TypeError); + +p = new Proxy({}, observe({})); + +assert.sameValue(Reflect.setPrototypeOf(p, Object.prototype), true); +assert.sameValue(log.length, 1); +assert.sameValue(log[0], "get"); + +h = observe({ setPrototypeOf() { throw 3.14; } }); +p = new Proxy(Object.create(Object.prototype), h); + +// "setting" without change +log.length = 0; +assertThrowsValue(() => Reflect.setPrototypeOf(p, Object.prototype), + 3.14); +assert.sameValue(log.length, 1); +assert.sameValue(log[0], "get"); + +// "setting" with change +log.length = 0; +assertThrowsValue(() => Reflect.setPrototypeOf(p, /foo/), + 3.14); +assert.sameValue(log.length, 1); +assert.sameValue(log[0], "get"); + +// 7. If trap is undefined, then +// a. Return ? target.[[SetPrototypeOf]](V). + +var settingProtoThrows = + new Proxy({}, { setPrototypeOf() { throw "agnizes"; } }); + +p = new Proxy(settingProtoThrows, { setPrototypeOf: undefined }); +assertThrowsValue(() => Reflect.setPrototypeOf(p, null), + "agnizes"); + +p = new Proxy(settingProtoThrows, { setPrototypeOf: null }); +assertThrowsValue(() => Reflect.setPrototypeOf(p, null), + "agnizes"); + +var anotherProto = + new Proxy({}, + { setPrototypeOf(t, p) { + log.push("reached"); + return Reflect.setPrototypeOf(t, p); + } }); + +p = new Proxy(anotherProto, { setPrototypeOf: undefined }); + +log.length = 0; +assert.sameValue(Reflect.setPrototypeOf(p, null), true); +assert.sameValue(log.length, 1); +assert.sameValue(log[0], "reached"); + +p = new Proxy(anotherProto, { setPrototypeOf: null }); + +log.length = 0; +assert.sameValue(Reflect.setPrototypeOf(p, null), true); +assert.sameValue(log.length, 1); +assert.sameValue(log[0], "reached"); + +// 8. Let booleanTrapResult be ToBoolean(? Call(trap, handler, « target, V »)). + +// The trap callable might throw. +p = new Proxy({}, { setPrototypeOf() { throw "ohai"; } }); + +assertThrowsValue(() => Reflect.setPrototypeOf(p, /x/), + "ohai"); + +var throwingTrap = + new Proxy(function() { throw "not called"; }, + { apply() { throw 37; } }); + +p = new Proxy({}, { setPrototypeOf: throwingTrap }); + +assertThrowsValue(() => Reflect.setPrototypeOf(p, Object.prototype), + 37); + +// The trap callable must *only* be called. +p = new Proxy({}, + { + setPrototypeOf: observe(function() { throw "boo-urns"; }) + }); + +log.length = 0; +assertThrowsValue(() => Reflect.setPrototypeOf(p, Object.prototype), + "boo-urns"); + +assert.sameValue(log.length, 1); +assert.sameValue(log[0], "apply"); + +// 9. If booleanTrapResult is false, return false. + +p = new Proxy({}, { setPrototypeOf() { return false; } }); +assert.sameValue(Reflect.setPrototypeOf(p, Object.prototype), false); + +p = new Proxy({}, { setPrototypeOf() { return +0; } }); +assert.sameValue(Reflect.setPrototypeOf(p, Object.prototype), false); + +p = new Proxy({}, { setPrototypeOf() { return -0; } }); +assert.sameValue(Reflect.setPrototypeOf(p, Object.prototype), false); + +p = new Proxy({}, { setPrototypeOf() { return NaN; } }); +assert.sameValue(Reflect.setPrototypeOf(p, Object.prototype), false); + +p = new Proxy({}, { setPrototypeOf() { return ""; } }); +assert.sameValue(Reflect.setPrototypeOf(p, Object.prototype), false); + +p = new Proxy({}, { setPrototypeOf() { return undefined; } }); +assert.sameValue(Reflect.setPrototypeOf(p, Object.prototype), false); + +// 10. Let extensibleTarget be ? IsExtensible(target). + +var targetThrowIsExtensible = + new Proxy({}, { isExtensible() { throw "psych!"; } }); + +p = new Proxy(targetThrowIsExtensible, { setPrototypeOf() { return true; } }); +assertThrowsValue(() => Reflect.setPrototypeOf(p, Object.prototype), + "psych!"); + +// 11. If extensibleTarget is true, return true. + +var targ = {}; + +p = new Proxy(targ, { setPrototypeOf() { return true; } }); +assert.sameValue(Reflect.setPrototypeOf(p, /x/), true); +assert.sameValue(Reflect.getPrototypeOf(targ), Object.prototype); +assert.sameValue(Reflect.getPrototypeOf(p), Object.prototype); + +p = new Proxy(targ, { setPrototypeOf() { return /x/; } }); +assert.sameValue(Reflect.setPrototypeOf(p, /x/), true); +assert.sameValue(Reflect.getPrototypeOf(targ), Object.prototype); +assert.sameValue(Reflect.getPrototypeOf(p), Object.prototype); + +p = new Proxy(targ, { setPrototypeOf() { return Infinity; } }); +assert.sameValue(Reflect.setPrototypeOf(p, /x/), true); +assert.sameValue(Reflect.getPrototypeOf(targ), Object.prototype); +assert.sameValue(Reflect.getPrototypeOf(p), Object.prototype); + +p = new Proxy(targ, { setPrototypeOf() { return Symbol(true); } }); +assert.sameValue(Reflect.setPrototypeOf(p, /x/), true); +assert.sameValue(Reflect.getPrototypeOf(targ), Object.prototype); +assert.sameValue(Reflect.getPrototypeOf(p), Object.prototype); + +// 12. Let targetProto be ? target.[[GetPrototypeOf]](). + +var targetNotExtensibleGetProtoThrows = + new Proxy(Object.preventExtensions({}), + { getPrototypeOf() { throw NaN; } }); + +p = new Proxy(targetNotExtensibleGetProtoThrows, + { setPrototypeOf() { log.push("goober"); return true; } }); + +log.length = 0; +assertThrowsValue(() => Reflect.setPrototypeOf(p, /abcd/), + NaN); + +// 13. If SameValue(V, targetProto) is false, throw a TypeError exception. + +var newProto; + +p = new Proxy(Object.preventExtensions(Object.create(Math)), + { setPrototypeOf(t, p) { return true; } }); + +assertThrowsInstanceOf(() => Reflect.setPrototypeOf(p, null), + TypeError); + +// 14. Return true. + +assert.sameValue(Reflect.setPrototypeOf(p, Math), true); + +/******************************************************************************/ + +print("Tests complete"); diff --git a/test/staging/sm/Proxy/trap-null.js b/test/staging/sm/Proxy/trap-null.js new file mode 100644 index 0000000000..5125aa87a6 --- /dev/null +++ b/test/staging/sm/Proxy/trap-null.js @@ -0,0 +1,108 @@ +/* + * Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/licenses/publicdomain/ + */ + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +var gTestfile = 'trap-null.js'; +var BUGNUMBER = 1257102; +var summary = "null as a trap value on a handler should operate on the target"; + +print(BUGNUMBER + ": " + summary); + +/************** + * BEGIN TEST * + **************/ + +// This might seem like overkill, but this proxying trick caught typos of +// several trap names before this test landed. \o/ /o\ +var allTraps = { + getPrototypeOf: null, + setPrototypeOf: null, + isExtensible: null, + preventExtensions: null, + getOwnPropertyDescriptor: null, + defineProperty: null, + has: null, + get: null, + set: null, + deleteProperty: null, + ownKeys: null, + apply: null, + construct: null, +}; + +var complainingHandler = new Proxy(allTraps, { + get(target, p, receiver) { + var v = Reflect.get(target, p, receiver); + if (v !== null) + throw new TypeError("failed to set one of the traps to null? " + p); + + return v; + } +}); + +var proxyTarget = function(x) { + "use strict"; + var str = this + x; + str += new.target ? "constructing" : "calling"; + return new.target ? new String(str) : str; +}; +proxyTarget.prototype.toString = () => "###"; +proxyTarget.prototype.valueOf = () => "@@@"; + +var proxy = new Proxy(proxyTarget, complainingHandler); + +assert.sameValue(Reflect.getPrototypeOf(proxy), Function.prototype); + +assert.sameValue(Object.getPrototypeOf(proxyTarget), Function.prototype); +assert.sameValue(Reflect.setPrototypeOf(proxy, null), true); +assert.sameValue(Object.getPrototypeOf(proxyTarget), null); + +assert.sameValue(Reflect.isExtensible(proxy), true); + +assert.sameValue(Reflect.isExtensible(proxyTarget), true); +assert.sameValue(Reflect.preventExtensions(proxy), true); +assert.sameValue(Reflect.isExtensible(proxy), false); +assert.sameValue(Reflect.isExtensible(proxyTarget), false); + +var desc = Reflect.getOwnPropertyDescriptor(proxy, "length"); +assert.sameValue(desc.value, 1); + +assert.sameValue(desc.configurable, true); +assert.sameValue(Reflect.defineProperty(proxy, "length", { value: 3, configurable: false }), true); +desc = Reflect.getOwnPropertyDescriptor(proxy, "length"); +assert.sameValue(desc.configurable, false); + +assert.sameValue(Reflect.has(proxy, "length"), true); + +assert.sameValue(Reflect.get(proxy, "length"), 3); + +assert.sameValue(Reflect.set(proxy, "length", 3), false); + +assert.sameValue(Reflect.deleteProperty(proxy, "length"), false); + +var keys = Reflect.ownKeys(proxy); +assert.sameValue(keys.length, 3); +keys.sort(); +assert.sameValue(keys[0], "length"); +assert.sameValue(keys[1], "name"); +assert.sameValue(keys[2], "prototype"); + +assert.sameValue(Reflect.apply(proxy, "hi!", [" "]), "hi! calling"); + +var res = Reflect.construct(proxy, [" - "]); +assert.sameValue(typeof res, "object"); +assert.sameValue(res instanceof String, true); +assert.sameValue(res.valueOf(), "@@@ - constructing"); + +/******************************************************************************/ + +print("Tests complete"); diff --git a/test/staging/sm/Record/constructor.js b/test/staging/sm/Record/constructor.js new file mode 100644 index 0000000000..d3e15b3676 --- /dev/null +++ b/test/staging/sm/Record/constructor.js @@ -0,0 +1,48 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +features: +- record-tuple +description: | + pending +esid: pending +---*/ + +assertThrowsInstanceOf( + () => new Record(), + TypeError, + "Record is not a constructor" +); + +assert.sameValue(typeof Record({}), "record"); +assert.sameValue(typeof Object(Record({})), "object"); +assert.sameValue(Record({}) instanceof Record, false); + +// TODO: It's still not decided what the prototype of records should be +//assertThrowsInstanceOf(() => Object(Record({})) instanceof Record, TypeError); +// assert.sameValue(Record.prototype, null); +// assert.sameValue(Record({}).__proto__, null); +// assert.sameValue(Object(Record({})).__proto__, null); + +assertThrowsInstanceOf( + () => Record(), + TypeError, + "can't convert undefined to object" +); + +assertThrowsInstanceOf( + () => Record(undefined), + TypeError, + "can't convert undefined to object" +); + +assertThrowsInstanceOf( + () => Record(null), + TypeError, + "can't convert null to object" +); + diff --git a/test/staging/sm/Record/cross-realm.js b/test/staging/sm/Record/cross-realm.js new file mode 100644 index 0000000000..cf7b22bffd --- /dev/null +++ b/test/staging/sm/Record/cross-realm.js @@ -0,0 +1,20 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +features: +- record-tuple +description: | + pending +esid: pending +---*/ + +const realm = createNewGlobal(); + +const realm_record = realm.eval(`Record({ x: 1, y: 2 })`); + +assert.sameValue(realm_record === #{ x: 1, y: 2 }, true); + diff --git a/test/staging/sm/Record/enumeration.js b/test/staging/sm/Record/enumeration.js new file mode 100644 index 0000000000..1131aa9cf9 --- /dev/null +++ b/test/staging/sm/Record/enumeration.js @@ -0,0 +1,65 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +features: +- record-tuple +description: | + pending +esid: pending +---*/ + +var rec = #{ x: 1, y: 2, a: 3 }; + +var keys = Object.keys(rec); +assert.sameValue(keys.length, 3); +assert.sameValue(keys[0], "a"); +assert.sameValue(keys[1], "x"); +assert.sameValue(keys[2], "y"); + +var values = Object.values(rec); +assert.sameValue(values.length, 3); +assert.sameValue(values[0], 3); +assert.sameValue(values[1], 1); +assert.sameValue(values[2], 2); + +var entries = Object.entries(rec); +assert.sameValue(entries.length, 3); +assert.sameValue(entries[0][0], "a"); +assert.sameValue(entries[0][1], 3); +assert.sameValue(entries[1][0], "x"); +assert.sameValue(entries[1][1], 1); +assert.sameValue(entries[2][0], "y"); +assert.sameValue(entries[2][1], 2); + +var ownKeys = Reflect.ownKeys(Object(rec)); +assert.sameValue(ownKeys.length, 3); +assert.sameValue(ownKeys[0], "a"); +assert.sameValue(ownKeys[1], "x"); +assert.sameValue(ownKeys[2], "y"); + +var spreadKeys = Object.keys({ ...rec }); +assert.sameValue(spreadKeys.length, 3); +assert.sameValue(spreadKeys[0], "a"); +assert.sameValue(spreadKeys[1], "x"); +assert.sameValue(spreadKeys[2], "y"); + +var spreadKeysObj = Object.keys({ ...Object(rec) }); +assert.sameValue(spreadKeysObj.length, 3); +assert.sameValue(spreadKeysObj[0], "a"); +assert.sameValue(spreadKeysObj[1], "x"); +assert.sameValue(spreadKeysObj[2], "y"); + +var i = 0; +for (var key in rec) { + switch (i++) { + case 0: assert.sameValue(key, "a"); break; + case 1: assert.sameValue(key, "x"); break; + case 2: assert.sameValue(key, "y"); break; + default: assertUnreachable(); + } +} + diff --git a/test/staging/sm/Record/equality.js b/test/staging/sm/Record/equality.js new file mode 100644 index 0000000000..22e1c6b1b1 --- /dev/null +++ b/test/staging/sm/Record/equality.js @@ -0,0 +1,34 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +features: +- record-tuple +description: | + pending +esid: pending +---*/ + +assert.sameValue(#{} === #{}, true); +assert.sameValue(#{} === #{ x: 1 }, false); +assert.sameValue(#{} === #{ x: undefined }, false); +assert.sameValue(#{ x: 1 } === #{ x: 1 }, true); +assert.sameValue(#{ x: 2 } === #{ x: 1 }, false); +assert.sameValue(#{ y: 1 } === #{ x: 1 }, false); +assert.sameValue(#{ x: 1, y: 2 } === #{ y: 2, x: 1 }, true); +assert.sameValue(#{ x: 1, y: 2 } === #{ y: 1, x: 2 }, false); + +let withPositiveZero = #{ x: +0 }; +let withNegativeZero = #{ x: -0 }; + +assert.sameValue(withPositiveZero === withNegativeZero, true); +assert.sameValue(#[withPositiveZero] === #[withNegativeZero], true); +assert.sameValue(Object.is(withPositiveZero, withNegativeZero), false); +assert.sameValue(Object.is(#[withPositiveZero], #[withNegativeZero]), false); + +assert.sameValue(#{ x: NaN } === #{ x: NaN }, true); +assert.sameValue(Object.is(#{ x: NaN }, #{ x: NaN }), true); + diff --git a/test/staging/sm/Record/json.js b/test/staging/sm/Record/json.js new file mode 100644 index 0000000000..0cf627c972 --- /dev/null +++ b/test/staging/sm/Record/json.js @@ -0,0 +1,24 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +features: +- record-tuple +description: | + pending +esid: pending +---*/ + +assert.sameValue( + JSON.stringify(#{ x: 1, a: #[1, 2, #{}, #[]] }), + '{"a":[1,2,{},[]],"x":1}' +); + +assert.sameValue( + JSON.stringify({ rec: Object(#{ x: 1 }), tup: Object(#[1, 2]) }), + '{"rec":{"x":1},"tup":[1,2]}' +); + diff --git a/test/staging/sm/Record/literal.js b/test/staging/sm/Record/literal.js new file mode 100644 index 0000000000..0a20b11de1 --- /dev/null +++ b/test/staging/sm/Record/literal.js @@ -0,0 +1,52 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +features: +- record-tuple +description: | + pending +esid: pending +---*/ + +let rec = #{ x: 1, "y": 2, 0: 3, 1n: 4, [`key${4}`]: 5 }; + +assert.sameValue(rec.x, 1); +assert.sameValue(rec.y, 2); +assert.sameValue(rec[0], 3); +assert.sameValue(rec[1], 4); +assert.sameValue(rec.key4, 5); + +let dup = #{ x: 1, x: 2 }; +assert.sameValue(dup.x, 2); + +assertThrowsInstanceOf( + () => #{ [Symbol()]: 1 }, + TypeError, + "Symbols cannot be used as record keys" + ); + +let rec2 = #{ x: 1, ...{ a: 2, z: 3 }, b: 4, ...{ d: 5 } }; +assert.sameValue(rec2.x, 1); +assert.sameValue(rec2.a, 2); +assert.sameValue(rec2.z, 3); +assert.sameValue(rec2.b, 4); +assert.sameValue(rec2.d, 5); + +assertThrowsInstanceOf( + () => #{ ...{ [Symbol()]: 1 } }, + TypeError, + "Symbols cannot be used as record keys" +); + +let rec3 = #{ + ...Object.defineProperty({}, "x", { value: 1 }), + ...Object.defineProperty({}, Symbol(), { value: 2 }), +}; +assert.sameValue(rec3.x, undefined); + +let rec4 = #{ ...{}, ...{}, ...{} }; + diff --git a/test/staging/sm/Record/properties.js b/test/staging/sm/Record/properties.js new file mode 100644 index 0000000000..8f8eb44c09 --- /dev/null +++ b/test/staging/sm/Record/properties.js @@ -0,0 +1,31 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +features: +- record-tuple +description: | + pending +esid: pending +---*/ + +var rec = Record({ + x: 1, + 4: 2, + z: 10n ** 100n, + w: Record({}), + n: Tuple(), + [Symbol.iterator]: 4, +}); + +assert.sameValue(rec.x, 1); +assert.sameValue(rec[4], 2); +assert.sameValue(rec.z, 10n ** 100n); +assert.sameValue(typeof rec.w, "record"); +assert.sameValue(typeof rec.n, "tuple"); +assert.sameValue(rec[Symbol.iterator], undefined); +assert.sameValue(rec.hasOwnProperty, undefined); + diff --git a/test/staging/sm/Record/property-descriptors.js b/test/staging/sm/Record/property-descriptors.js new file mode 100644 index 0000000000..6436953c3a --- /dev/null +++ b/test/staging/sm/Record/property-descriptors.js @@ -0,0 +1,100 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +features: +- record-tuple +description: | + pending +esid: pending +---*/ + +var rec = Record({ x: 1, y: 2, a: 3 }); + +var desc = Object.getOwnPropertyDescriptor(rec, "x"); +assert.sameValue(desc.value, 1); +assert.sameValue(desc.writable, false); +assert.sameValue(desc.enumerable, true); +assert.sameValue(desc.configurable, false); + +assert.sameValue(Object.getOwnPropertyDescriptor(rec, "z"), undefined); + +var recO = Object(rec); + +assertThrowsInstanceOf( + () => Object.defineProperty(rec, "x", { value: 1 }), + TypeError, + "#{ \"a\": 3, \"x\": 1, \"y\": 2 } is not a non-null object" +); + +assertThrowsInstanceOf( + () => Object.defineProperty(recO, "b", {}), + TypeError, + "can't define property \"b\": Record is not extensible" +); + +assertThrowsInstanceOf( + () => Object.defineProperty(recO, Symbol(), {}), + TypeError, + "can't define property \"b\": Record is not extensible" +); + +assertThrowsInstanceOf( + () => Object.defineProperty(recO, "x", { value: 2 }), + TypeError, + '"x" is read-only' +); + +Object.defineProperty(recO, "x", { value: 1 }); + +assertThrowsInstanceOf( + () => Object.defineProperty(recO, "x", { value: 2, writable: true }), + TypeError, + 'Invalid record property descriptor' +); + +assertThrowsInstanceOf( + () => Object.defineProperty(recO, "x", { value: 2, enumerable: false }), + TypeError, + 'Invalid record property descriptor' +); + +assertThrowsInstanceOf( + () => Object.defineProperty(recO, "x", { value: 2, configurable: true }), + TypeError, + 'Invalid record property descriptor' +); + +assert.sameValue(Object.prototype.propertyIsEnumerable.call(rec, "x"), true); +assert.sameValue(Object.prototype.propertyIsEnumerable.call(rec, "x"), true); +assert.sameValue(Object.prototype.propertyIsEnumerable.call(rec, "w"), false); +assert.sameValue(Object.prototype.propertyIsEnumerable.call(rec, "w"), false); +assert.sameValue(Object.prototype.propertyIsEnumerable.call(recO, "x"), true); +assert.sameValue(Object.prototype.propertyIsEnumerable.call(recO, "x"), true); +assert.sameValue(Object.prototype.propertyIsEnumerable.call(recO, "w"), false); +assert.sameValue(Object.prototype.propertyIsEnumerable.call(recO, "w"), false); + +assert.sameValue(Object.prototype.hasOwnProperty.call(rec, "x"), true); +assert.sameValue(Object.prototype.hasOwnProperty.call(rec, "x"), true); +assert.sameValue(Object.prototype.hasOwnProperty.call(rec, "w"), false); +assert.sameValue(Object.prototype.hasOwnProperty.call(rec, "w"), false); +assert.sameValue(Object.prototype.hasOwnProperty.call(recO, "x"), true); +assert.sameValue(Object.prototype.hasOwnProperty.call(recO, "x"), true); +assert.sameValue(Object.prototype.hasOwnProperty.call(recO, "w"), false); +assert.sameValue(Object.prototype.hasOwnProperty.call(recO, "w"), false); + +assert.sameValue("x" in recO, true); +assert.sameValue("w" in recO, false); + +assert.sameValue(delete rec.x, false); +assert.sameValue(delete rec.x, false); +assert.sameValue(delete rec.w, true); +assert.sameValue(delete rec.w, true); +assert.sameValue(delete recO.x, false); +assert.sameValue(delete recO.x, false); +assert.sameValue(delete recO.w, true); +assert.sameValue(delete recO.w, true); + diff --git a/test/staging/sm/Record/wrapper.js b/test/staging/sm/Record/wrapper.js new file mode 100644 index 0000000000..6c7ebf315a --- /dev/null +++ b/test/staging/sm/Record/wrapper.js @@ -0,0 +1,36 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +features: +- record-tuple +description: | + pending +esid: pending +---*/ + +var boxO = Object(#{ x: 1, y: 2 }); + +assert.sameValue(Object.isExtensible(boxO), false); +assert.sameValue(Object.isSealed(boxO), true); +assert.sameValue(Object.isFrozen(boxO), true); + +boxO.x = 3; +assert.sameValue(boxO.x, 1); +assertThrowsInstanceOf(() => { "use strict"; boxO.x = 3; }, TypeError); +assert.sameValue(boxO.x, 1); + +boxO.z = 3; +assert.sameValue(boxO.z, undefined); +assertThrowsInstanceOf(() => { "use strict"; boxO.z = 3; }, TypeError); +assert.sameValue(boxO.z, undefined); + +assertThrowsInstanceOf(() => { Object.defineProperty(boxO, "x", { value: 3 }); }, TypeError); +assert.sameValue(boxO.x, 1); + +assertThrowsInstanceOf(() => { Object.defineProperty(boxO, "z", { value: 3 }); }, TypeError); +assert.sameValue(boxO.z, undefined); + diff --git a/test/staging/sm/Reflect/apply.js b/test/staging/sm/Reflect/apply.js new file mode 100644 index 0000000000..0a5dc762f4 --- /dev/null +++ b/test/staging/sm/Reflect/apply.js @@ -0,0 +1,139 @@ +/* + * Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/licenses/publicdomain/ + */ + +/*--- +includes: [sm/non262-Reflect-shell.js, sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +// Reflect.apply calls functions. +assert.sameValue(Reflect.apply(Math.floor, undefined, [1.75]), 1); + +// Reflect.apply requires a target object that's callable. +var nonCallable = [{}, [], (class clsX { constructor() {} })]; +for (var value of nonCallable) { + assertThrowsInstanceOf(() => Reflect.apply(nonCallable), TypeError); +} + +// When target is not callable, Reflect.apply does not try to get argumentList.length before throwing. +var hits = 0; +var bogusArgumentList = {get length() { hit++; throw "FAIL";}}; +assertThrowsInstanceOf(() => Reflect.apply({callable: false}, null, bogusArgumentList), + TypeError); +assert.sameValue(hits, 0); + +// Reflect.apply works on a range of different callable objects. +// Builtin functions (we also tested Math.floor above): +assert.sameValue(Reflect.apply(String.fromCharCode, + undefined, + [104, 101, 108, 108, 111]), + "hello"); + +// Builtin methods: +assert.sameValue(Reflect.apply(RegExp.prototype.exec, + /ab/, + ["confabulation"]).index, + 4); + +// Builtin methods of primitive objects: +assert.sameValue(Reflect.apply("".charAt, + "ponies", + [3]), + "i"); + +// Bound functions: +assert.sameValue(Reflect.apply(function () { return this; }.bind(Math), + Function, + []), + Math); +assert.sameValue(Reflect.apply(Array.prototype.concat.bind([1, 2], [3]), + [4, 5], + [[6, 7, 8]]).join(), + "1,2,3,6,7,8"); + +// Generator functions: +function* g(arg) { yield "pass" + arg; } +assert.sameValue(Reflect.apply(g, + undefined, + ["word"]).next().value, + "password"); + +// Proxies: +function f() { return 13; } +assert.sameValue(Reflect.apply(new Proxy(f, {}), + undefined, + []), + 13); + +// Cross-compartment wrappers: +var gw = createNewGlobal(); +assert.sameValue(Reflect.apply(gw.parseInt, + undefined, + ["45"]), + 45); +assert.sameValue(Reflect.apply(gw.Symbol.for, + undefined, + ["moon"]), + Symbol.for("moon")); + +gw.eval("function q() { return q; }"); +assert.sameValue(Reflect.apply(gw.q, + undefined, + []), + gw.q); + + +// Exceptions are propagated. +var nope = new Error("nope"); +function fail() { + throw nope; +} +assertThrowsValue(() => Reflect.apply(fail, undefined, []), + nope); + +// Exceptions thrown by cross-compartment wrappers are re-wrapped for the +// calling compartment. +var gxw = gw.eval("var x = new Error('x'); x"); +gw.eval("function fail() { throw x; }"); +assertThrowsValue(() => Reflect.apply(gw.fail, undefined, []), + gxw); + +// The thisArgument is passed to the target function as the 'this' value. +var obj = {}; +hits = 0; +assert.sameValue(Reflect.apply(function () { hits++; assert.sameValue(this, obj); }, + obj, + []), + undefined); +assert.sameValue(hits, 1); + +// Primitive values can be thisArgument. +function strictThis() { "use strict"; return this; } +for (var value of [null, undefined, 0, -0, NaN, Symbol("moon")]) { + assert.sameValue(Reflect.apply(strictThis, value, []), + value); +} + +// If the target is a non-strict function and thisArgument is a primitive value +// other than null or undefined, then thisArgument is converted to a wrapper +// object. +var testValues = [true, 1e9, "ok", Symbol("ok")]; +function nonStrictThis(expected) { + assert.sameValue(typeof this, "object"); + assert.sameValue(Reflect.apply(Object.prototype.toString, this, []).toLowerCase(), expected); + return "ok"; +} +for (var value of testValues) { + assert.sameValue(Reflect.apply(nonStrictThis, + value, + ["[object " + typeof value + "]"]), + "ok"); +} + +// For more Reflect.apply tests, see target.js and argumentsList.js. + diff --git a/test/staging/sm/Reflect/argumentsList.js b/test/staging/sm/Reflect/argumentsList.js new file mode 100644 index 0000000000..c35f28775e --- /dev/null +++ b/test/staging/sm/Reflect/argumentsList.js @@ -0,0 +1,149 @@ +/* + * Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/licenses/publicdomain/ + */ + +/*--- +includes: [deepEqual.js, sm/non262-Reflect-shell.js, sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +// Tests for the argumentList argument to Reflect.apply and Reflect.construct. + +// Reflect.apply and Reflect.construct require an argumentList argument that must be an object. +assertThrowsInstanceOf(() => Reflect.apply(Math.min, undefined), // missing + TypeError); +assertThrowsInstanceOf(() => Reflect.construct(Object), // missing + TypeError); +for (var primitive of SOME_PRIMITIVE_VALUES) { + assertThrowsInstanceOf(() => Reflect.apply(Math.min, undefined, primitive), + TypeError); + assertThrowsInstanceOf(() => Reflect.construct(Object, primitive), + TypeError); +} + +// Array used by several tests below. +var BOTH = [ + Reflect.apply, + // Adapt Reflect.construct to accept the same arguments as Reflect.apply. + (target, thisArgument, argumentList) => Reflect.construct(target, argumentList) +]; + +// The argumentList is copied and becomes the list of arguments passed to the function. +function getRest(...x) { return x; } +var args = [1, 2, 3]; +for (var method of BOTH) { + var result = method(getRest, undefined, args); + assert.sameValue(result.join(), args.join()); + assert.sameValue(result !== args, true); +} + +// argumentList.length can be less than func.length. +function testLess(a, b, c, d, e) { + assert.sameValue(a, 1); + assert.sameValue(b, true); + assert.sameValue(c, "three"); + assert.sameValue(d, Symbol.for); + assert.sameValue(e, undefined); + + assert.sameValue(arguments.length, 4); + assert.sameValue(arguments !== args, true); + return "ok"; +} +args = [1, true, "three", Symbol.for]; +assert.sameValue(Reflect.apply(testLess, undefined, args), "ok"); +assert.sameValue(Reflect.construct(testLess, args) instanceof testLess, true); + +// argumentList.length can be more than func.length. +function testMoar(a) { + assert.sameValue(a, args[0]); + return "good"; +} +assert.sameValue(Reflect.apply(testMoar, undefined, args), "good"); +assert.sameValue(Reflect.construct(testMoar, args) instanceof testMoar, true); + +// argumentList can be any object with a .length property. +function getArgs(...args) { + return args; +} +for (var method of BOTH) { + assert.deepEqual(method(getArgs, undefined, {length: 0}), + []); + assert.deepEqual(method(getArgs, undefined, {length: 1, "0": "zero"}), + ["zero"]); + assert.deepEqual(method(getArgs, undefined, {length: 2}), + [undefined, undefined]); + assert.deepEqual(method(getArgs, undefined, function (a, b, c) {}), + [undefined, undefined, undefined]); +} + +// The Iterable/Iterator interfaces are not used. +var funnyArgs = { + 0: "zero", + 1: "one", + length: 2, + [Symbol.iterator]() { throw "FAIL 1"; }, + next() { throw "FAIL 2"; } +}; +for (var method of BOTH) { + assert.deepEqual(method(getArgs, undefined, funnyArgs), + ["zero", "one"]); +} + +// If argumentList has no .length property, no arguments are passed. +function count() { return {numArgsReceived: arguments.length}; } +for (var method of BOTH) { + assert.sameValue(method(count, undefined, {"0": 0, "1": 1}).numArgsReceived, + 0); + function* g() { yield 1; yield 2; } + assert.sameValue(method(count, undefined, g()).numArgsReceived, + 0); +} + +// If argumentsList.length has a getter, it is called. +var log; +args = { + get length() { log += "L"; return 1; }, + get "0"() { log += "0"; return "zero"; }, + get "1"() { log += "1"; return "one"; } +}; +for (var method of BOTH) { + log = ""; + assert.deepEqual(method(getArgs, undefined, args), + ["zero"]); + assert.sameValue(log, "L0"); +} + +// The argumentsList.length getter can throw; the exception is propagated. +var exc = {status: "bad"}; +args = { + get length() { throw exc; } +}; +for (var method of BOTH) { + assertThrowsValue(() => method(count, undefined, args), exc); +} + +// argumentsList.length is converted to an integer. +for (var value of [1.7, "1", {valueOf() { return "1"; }}]) { + args = { + length: value, + "0": "ponies" + }; + for (var method of BOTH) { + var result = method(getArgs, undefined, args); + assert.sameValue(result.length, 1); + assert.sameValue(result[0], "ponies"); + } +} + +// If argumentsList.length is negative or NaN, no arguments are passed. +for (var method of BOTH) { + for (var num of [-1, -0.1, -0, -1e99, -Infinity, NaN]) { + assert.sameValue(method(count, undefined, {length: num}).numArgsReceived, + 0); + } +} + diff --git a/test/staging/sm/Reflect/construct.js b/test/staging/sm/Reflect/construct.js new file mode 100644 index 0000000000..1c3a752e07 --- /dev/null +++ b/test/staging/sm/Reflect/construct.js @@ -0,0 +1,116 @@ +/* + * Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/licenses/publicdomain/ + */ + +/*--- +includes: [deepEqual.js, sm/non262-Reflect-shell.js, sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +// Reflect.construct invokes constructors. + +assert.deepEqual(Reflect.construct(Object, []), {}); +assert.deepEqual(Reflect.construct(String, ["hello"]), new String("hello")); + +// Constructing Date creates a real Date object. +var d = Reflect.construct(Date, [1776, 6, 4]); +assert.sameValue(d instanceof Date, true); +assert.sameValue(d.getFullYear(), 1776); // non-generic method requires real Date object + +// [[Construct]] methods don't necessarily create new objects. +var obj = {}; +assert.sameValue(Reflect.construct(Object, [obj]), obj); + + +// === Various kinds of constructors +// We've already seen some builtin constructors. +// +// JS functions: +function f(x) { this.x = x; } +assert.deepEqual(Reflect.construct(f, [3]), new f(3)); +f.prototype = Array.prototype; +assert.deepEqual(Reflect.construct(f, [3]), new f(3)); + +// Bound functions: +var bound = f.bind(null, "carrot"); +assert.deepEqual(Reflect.construct(bound, []), new bound); + +// Classes: +class Base { + constructor(...args) { + this.args = args; + this.newTarget = new.target; + } +} +class Derived extends Base { + constructor(...args) { super(...args); } +} + +assert.deepEqual(Reflect.construct(Base, []), new Base); +assert.deepEqual(Reflect.construct(Derived, [7]), new Derived(7)); +g = Derived.bind(null, "q"); +assert.deepEqual(Reflect.construct(g, [8, 9]), new g(8, 9)); + +// Cross-compartment wrappers: +var g = createNewGlobal(); +var local = {here: this}; +g.eval("function F(arg) { this.arg = arg }"); +assert.deepEqual(Reflect.construct(g.F, [local]), new g.F(local)); + +// If first argument to Reflect.construct isn't a constructor, it throws a +// TypeError. +var nonConstructors = [ + {}, + Reflect.construct, // builtin functions aren't constructors + x => x + 1, + Math.max.bind(null, 0), // bound non-constructors aren't constructors + ((x, y) => x > y).bind(null, 0), + + // A Proxy to a non-constructor function isn't a constructor, even if a + // construct handler is present. + new Proxy(Reflect.construct, {construct(){}}), +]; +for (var obj of nonConstructors) { + assertThrowsInstanceOf(() => Reflect.construct(obj, []), TypeError); + assertThrowsInstanceOf(() => Reflect.construct(obj, [], Object), TypeError); +} + + +// === new.target tests + +// If the newTarget argument to Reflect.construct is missing, the target is used. +function checkNewTarget() { + assert.sameValue(new.target, expected); + expected = undefined; +} +var expected = checkNewTarget; +Reflect.construct(checkNewTarget, []); + +// The newTarget argument is correctly passed to the constructor. +var constructors = [Object, Function, f, bound]; +for (var ctor of constructors) { + expected = ctor; + Reflect.construct(checkNewTarget, [], ctor); + assert.sameValue(expected, undefined); +} + +// The newTarget argument must be a constructor. +for (var v of SOME_PRIMITIVE_VALUES.concat(nonConstructors)) { + assertThrowsInstanceOf(() => Reflect.construct(checkNewTarget, [], v), TypeError); +} + +// The builtin Array constructor uses new.target.prototype and always +// creates a real array object. +function someConstructor() {} +var result = Reflect.construct(Array, [], someConstructor); +assert.sameValue(Reflect.getPrototypeOf(result), someConstructor.prototype); +assert.sameValue(result.length, 0); +assert.sameValue(Array.isArray(result), true); + + +// For more Reflect.construct tests, see target.js and argumentsList.js. + diff --git a/test/staging/sm/Reflect/defineProperty.js b/test/staging/sm/Reflect/defineProperty.js new file mode 100644 index 0000000000..0ddd4481c7 --- /dev/null +++ b/test/staging/sm/Reflect/defineProperty.js @@ -0,0 +1,175 @@ +/* + * Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/licenses/publicdomain/ + */ + +/*--- +features: +- IsHTMLDDA +includes: [deepEqual.js, sm/non262-Reflect-shell.js, sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +// Reflect.defineProperty defines properties. +var obj = {}; +assert.sameValue(Reflect.defineProperty(obj, "x", {value: 7}), true); +assert.sameValue(obj.x, 7); +var desc = Reflect.getOwnPropertyDescriptor(obj, "x"); +assert.deepEqual(desc, {value: 7, + writable: false, + enumerable: false, + configurable: false}); + +// Reflect.defineProperty can define a symbol-keyed property. +var key = Symbol(":o)"); +assert.sameValue(Reflect.defineProperty(obj, key, {value: 8}), true); +assert.sameValue(obj[key], 8); + +// array .length property +obj = [1, 2, 3, 4, 5]; +assert.sameValue(Reflect.defineProperty(obj, "length", {value: 4}), true); +assert.deepEqual(obj, [1, 2, 3, 4]); + +// The target can be a proxy. +obj = {}; +var proxy = new Proxy(obj, { + defineProperty(t, id, desc) { + t[id] = 1; + return true; + } +}); +assert.sameValue(Reflect.defineProperty(proxy, "prop", {value: 7}), true); +assert.sameValue(obj.prop, 1); +assert.sameValue(delete obj.prop, true); +assert.sameValue("prop" in obj, false); + +// The attributes object is re-parsed, not passed through to the +// handler.defineProperty method. +obj = {}; +var attributes = { + configurable: 17, + enumerable: undefined, + value: null +}; +proxy = new Proxy(obj, { + defineProperty(t, id, desc) { + assert.sameValue(desc !== attributes, true); + assert.sameValue(desc.configurable, true); + assert.sameValue(desc.enumerable, false); + assert.sameValue(desc.value, null); + assert.sameValue("writable" in desc, false); + return 15; // and the return value here is coerced to boolean + } +}); +assert.sameValue(Reflect.defineProperty(proxy, "prop", attributes), true); + + +// === Failure and error cases +// +// Reflect.defineProperty behaves much like Object.defineProperty, which has +// extremely thorough tests elsewhere, and the implementation is largely +// shared. Duplicating those tests with Reflect.defineProperty would be a +// big waste. +// +// However, certain failures cause Reflect.defineProperty to return false +// without throwing a TypeError (unlike Object.defineProperty). So here we test +// many error cases to check that behavior. + +// missing attributes argument +assertThrowsInstanceOf(() => Reflect.defineProperty(obj, "y"), + TypeError); + +// non-object attributes argument +for (var attributes of SOME_PRIMITIVE_VALUES) { + assertThrowsInstanceOf(() => Reflect.defineProperty(obj, "y", attributes), + TypeError); +} + +// inextensible object +obj = Object.preventExtensions({}); +assert.sameValue(Reflect.defineProperty(obj, "prop", {value: 4}), false); + +// inextensible object with irrelevant inherited property +obj = Object.preventExtensions(Object.create({"prop": 3})); +assert.sameValue(Reflect.defineProperty(obj, "prop", {value: 4}), false); + +// redefine nonconfigurable to configurable +obj = Object.freeze({prop: 1}); +assert.sameValue(Reflect.defineProperty(obj, "prop", {configurable: true}), false); + +// redefine enumerability of nonconfigurable property +obj = Object.freeze(Object.defineProperties({}, { + x: {enumerable: true, configurable: false, value: 0}, + y: {enumerable: false, configurable: false, value: 0}, +})); +assert.sameValue(Reflect.defineProperty(obj, "x", {enumerable: false}), false); +assert.sameValue(Reflect.defineProperty(obj, "y", {enumerable: true}), false); + +// redefine nonconfigurable data to accessor property, or vice versa +obj = Object.seal({x: 1, get y() { return 2; }}); +assert.sameValue(Reflect.defineProperty(obj, "x", {get() { return 2; }}), false); +assert.sameValue(Reflect.defineProperty(obj, "y", {value: 1}), false); + +// redefine nonwritable, nonconfigurable property as writable +obj = Object.freeze({prop: 0}); +assert.sameValue(Reflect.defineProperty(obj, "prop", {writable: true}), false); +assert.sameValue(Reflect.defineProperty(obj, "prop", {writable: false}), true); // no-op + +// change value of nonconfigurable nonwritable property +obj = Object.freeze({prop: 0}); +assert.sameValue(Reflect.defineProperty(obj, "prop", {value: -0}), false); +assert.sameValue(Reflect.defineProperty(obj, "prop", {value: +0}), true); // no-op + +// change getter or setter +function g() {} +function s(x) {} +obj = {}; +Object.defineProperty(obj, "prop", {get: g, set: s, configurable: false}); +assert.sameValue(Reflect.defineProperty(obj, "prop", {get: s}), false); +assert.sameValue(Reflect.defineProperty(obj, "prop", {get: g}), true); // no-op +assert.sameValue(Reflect.defineProperty(obj, "prop", {set: g}), false); +assert.sameValue(Reflect.defineProperty(obj, "prop", {set: s}), true); // no-op + +// Proxy defineProperty handler method that returns false +var falseValues = [false, 0, -0, "", NaN, null, undefined]; +if (typeof createIsHTMLDDA === "function") + falseValues.push(createIsHTMLDDA()); +var value; +proxy = new Proxy({}, { + defineProperty(t, id, desc) { + return value; + } +}); +for (value of falseValues) { + assert.sameValue(Reflect.defineProperty(proxy, "prop", {value: 1}), false); +} + +// Proxy defineProperty handler method returns true, in violation of invariants. +// Per spec, this is a TypeError, not a false return. +obj = Object.freeze({x: 1}); +proxy = new Proxy(obj, { + defineProperty(t, id, desc) { + return true; + } +}); +assertThrowsInstanceOf(() => Reflect.defineProperty(proxy, "x", {value: 2}), TypeError); +assertThrowsInstanceOf(() => Reflect.defineProperty(proxy, "y", {value: 0}), TypeError); +assert.sameValue(Reflect.defineProperty(proxy, "x", {value: 1}), true); + +// The second argument is converted ToPropertyKey before any internal methods +// are called on the first argument. +var poison = + (counter => new Proxy({}, new Proxy({}, { get() { throw counter++; } })))(42); +assertThrowsValue(() => { + Reflect.defineProperty(poison, { + toString() { throw 17; }, + valueOf() { throw 8675309; } + }, poison); +}, 17); + + +// For more Reflect.defineProperty tests, see target.js and propertyKeys.js. + diff --git a/test/staging/sm/Reflect/deleteProperty.js b/test/staging/sm/Reflect/deleteProperty.js new file mode 100644 index 0000000000..b6ec719de1 --- /dev/null +++ b/test/staging/sm/Reflect/deleteProperty.js @@ -0,0 +1,89 @@ +/* + * Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/licenses/publicdomain/ + */ + +/*--- +includes: [deepEqual.js, sm/non262-Reflect-shell.js, sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +// Reflect.deleteProperty deletes properties. +var obj = {x: 1, y: 2}; +assert.sameValue(Reflect.deleteProperty(obj, "x"), true); +assert.deepEqual(obj, {y: 2}); + +var arr = [1, 1, 2, 3, 5]; +assert.sameValue(Reflect.deleteProperty(arr, "3"), true); +assert.deepEqual(arr, [1, 1, 2, , 5]); + + +// === Failure and error cases +// Since Reflect.deleteProperty is almost exactly identical to the non-strict +// `delete` operator, there is not much to test that would not be redundant. + +// Returns true if no such property exists. +assert.sameValue(Reflect.deleteProperty({}, "q"), true); + +// Or if it's inherited. +var proto = {x: 1}; +assert.sameValue(Reflect.deleteProperty(Object.create(proto), "x"), true); +assert.sameValue(proto.x, 1); + +// Return false if asked to delete a non-configurable property. +var arr = []; +assert.sameValue(Reflect.deleteProperty(arr, "length"), false); +assert.sameValue(arr.hasOwnProperty("length"), true); +assert.sameValue(Reflect.deleteProperty(this, "undefined"), false); +assert.sameValue(this.undefined, void 0); + +// Return false if a Proxy's deleteProperty handler returns a false-y value. +var value; +var proxy = new Proxy({}, { + deleteProperty(t, k) { + return value; + } +}); +for (value of [true, false, 0, "something", {}]) { + assert.sameValue(Reflect.deleteProperty(proxy, "q"), !!value); +} + +// If a Proxy's handler method throws, the error is propagated. +proxy = new Proxy({}, { + deleteProperty(t, k) { throw "vase"; } +}); +assertThrowsValue(() => Reflect.deleteProperty(proxy, "prop"), "vase"); + +// Throw a TypeError if a Proxy's handler method returns true in violation of +// the object invariants. +proxy = new Proxy(Object.freeze({prop: 1}), { + deleteProperty(t, k) { return true; } +}); +assertThrowsInstanceOf(() => Reflect.deleteProperty(proxy, "prop"), TypeError); + + +// === Deleting elements from `arguments` + +// Non-strict arguments element becomes unmapped +function f(x, y, z) { + assert.sameValue(Reflect.deleteProperty(arguments, "0"), true); + arguments.x = 33; + return x; +} +assert.sameValue(f(17, 19, 23), 17); + +// Frozen non-strict arguments element +function testFrozenArguments() { + Object.freeze(arguments); + assert.sameValue(Reflect.deleteProperty(arguments, "0"), false); + assert.sameValue(arguments[0], "zero"); + assert.sameValue(arguments[1], "one"); +} +testFrozenArguments("zero", "one"); + + +// For more Reflect.deleteProperty tests, see target.js and propertyKeys.js. + diff --git a/test/staging/sm/Reflect/get.js b/test/staging/sm/Reflect/get.js new file mode 100644 index 0000000000..5359a8bfc3 --- /dev/null +++ b/test/staging/sm/Reflect/get.js @@ -0,0 +1,81 @@ +/* + * Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/licenses/publicdomain/ + */ + +/*--- +includes: [sm/non262-Reflect-shell.js, sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +// Reflect.get gets the value of a property. + +var x = {p: 1}; +assert.sameValue(Reflect.get(x, "p"), 1); +assert.sameValue(Reflect.get(x, "toString"), Object.prototype.toString); +assert.sameValue(Reflect.get(x, "missing"), undefined); + + +// === Various targets + +// Array +assert.sameValue(Reflect.get([], 700), undefined); +assert.sameValue(Reflect.get(["zero", "one"], 1), "one"); + +// TypedArray +assert.sameValue(Reflect.get(new Uint8Array([0, 1, 2, 3, 4, 5, 6, 7]), 7), 7); + +// Treatment of NaN +var f = new Float64Array([NaN]); +var u = new Uint32Array(f.buffer); +u[0]++; +u[1]++; +assert.sameValue(f[0], NaN); +assert.sameValue(Reflect.get(f, 0), NaN); + +// Proxy with no get handler +assert.sameValue(Reflect.get(new Proxy(x, {}), "p"), 1); + +// Proxy with a get handler +var obj = new Proxy(x, { + get(t, k, r) { return k + "ful"; } +}); +assert.sameValue(Reflect.get(obj, "mood"), "moodful"); + +// Exceptions thrown by a proxy's get handler are propagated. +assertThrowsInstanceOf(() => Reflect.get(obj, Symbol()), TypeError); + +// Ordinary object, property has a setter and no getter +obj = {set name(x) {}}; +assert.sameValue(Reflect.get(obj, "name"), undefined); + + +// === Receiver + +// Receiver argument is passed to getters as the this-value. +obj = { get x() { return this; }}; +assert.sameValue(Reflect.get(obj, "x", Math), Math); +assert.sameValue(Reflect.get(Object.create(obj), "x", JSON), JSON); + +// If missing, target is passed instead. +assert.sameValue(Reflect.get(obj, "x"), obj); + +// Receiver argument is passed to the proxy get handler. +obj = new Proxy({}, { + get(t, k, r) { + assert.sameValue(k, "itself"); + return r; + } +}); +assert.sameValue(Reflect.get(obj, "itself"), obj); +assert.sameValue(Reflect.get(obj, "itself", Math), Math); +assert.sameValue(Reflect.get(Object.create(obj), "itself", Math), Math); + +// The receiver shouldn't have to be an object +assert.sameValue(Reflect.get(obj, "itself", 37.2), 37.2); + +// For more Reflect.get tests, see target.js and propertyKeys.js. + diff --git a/test/staging/sm/Reflect/getOwnPropertyDescriptor.js b/test/staging/sm/Reflect/getOwnPropertyDescriptor.js new file mode 100644 index 0000000000..8fd2459b46 --- /dev/null +++ b/test/staging/sm/Reflect/getOwnPropertyDescriptor.js @@ -0,0 +1,30 @@ +/* + * Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/licenses/publicdomain/ + */ + +/*--- +includes: [deepEqual.js, sm/non262-Reflect-shell.js, sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +// Reflect.getOwnPropertyDescriptor inspects object properties. +assert.deepEqual( + Reflect.getOwnPropertyDescriptor({x: "hello"}, "x"), + {value: "hello", writable: true, enumerable: true, configurable: true}); +assert.sameValue( + Reflect.getOwnPropertyDescriptor({x: "hello"}, "y"), + undefined); +assert.deepEqual( + Reflect.getOwnPropertyDescriptor([], "length"), + {value: 0, writable: true, enumerable: false, configurable: false}); + +// Reflect.getOwnPropertyDescriptor shares its implementation with +// Object.getOwnPropertyDescriptor. The only difference is how non-object +// targets are handled. +// +// For more Reflect.getOwnPropertyDescriptor tests, see target.js and propertyKeys.js. + diff --git a/test/staging/sm/Reflect/getPrototypeOf.js b/test/staging/sm/Reflect/getPrototypeOf.js new file mode 100644 index 0000000000..905917bedd --- /dev/null +++ b/test/staging/sm/Reflect/getPrototypeOf.js @@ -0,0 +1,26 @@ +/* + * Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/licenses/publicdomain/ + */ + +/*--- +includes: [sm/non262-Reflect-shell.js, sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +// Reflect.getPrototypeOf returns an object's prototype. +assert.sameValue(Reflect.getPrototypeOf({}), Object.prototype); +assert.sameValue(Reflect.getPrototypeOf(Object.prototype), null); +assert.sameValue(Reflect.getPrototypeOf(Object.create(null)), null); + +var proxy = new Proxy({}, { + getPrototypeOf(t) { return Math; } +}); + +assert.sameValue(Reflect.getPrototypeOf(proxy), Math); + +// For more Reflect.getPrototypeOf tests, see target.js. + diff --git a/test/staging/sm/Reflect/has.js b/test/staging/sm/Reflect/has.js new file mode 100644 index 0000000000..52728c9827 --- /dev/null +++ b/test/staging/sm/Reflect/has.js @@ -0,0 +1,50 @@ +/* + * Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/licenses/publicdomain/ + */ + +/*--- +includes: [sm/non262-Reflect-shell.js, sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +// Reflect.has is identical to the `in` operator. +assert.sameValue(Reflect.has({x: 0}, "x"), true); +assert.sameValue(Reflect.has({x: 0}, "y"), false); +assert.sameValue(Reflect.has({x: 0}, "toString"), true); + +// The target can be an array; Reflect.has works on array elements. +var arr = ["zero"]; +arr[10000] = 0; +assert.sameValue(Reflect.has(arr, "10000"), true); +assert.sameValue(Reflect.has(arr, 10000), true); +assert.sameValue(Reflect.has(arr, "-0"), false); +assert.sameValue(Reflect.has(arr, -0), true); + +// And string objects (though not string primitives; see target.js). +var str = new String("hello"); +assert.sameValue(Reflect.has(str, "4"), true); +assert.sameValue(Reflect.has(str, "-0"), false); +assert.sameValue(Reflect.has(str, -0), true); + +// Proxy without .has() handler method +var obj = {get prop() {}}; +for (var i = 0; i < 2; i++) { + obj = new Proxy(obj, {}); + assert.sameValue(Reflect.has(obj, "prop"), true); + assert.sameValue(Reflect.has(obj, "nope"), false); +} + +// Proxy with .has() handler method +obj = new Proxy({}, { + has(t, k) { return k.startsWith("door"); } +}); +assert.sameValue(Reflect.has(obj, "doorbell"), true); +assert.sameValue(Reflect.has(obj, "dormitory"), false); + + +// For more Reflect.has tests, see target.js and propertyKeys.js. + diff --git a/test/staging/sm/Reflect/isExtensible.js b/test/staging/sm/Reflect/isExtensible.js new file mode 100644 index 0000000000..3125a09c02 --- /dev/null +++ b/test/staging/sm/Reflect/isExtensible.js @@ -0,0 +1,66 @@ +/* + * Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/licenses/publicdomain/ + */ + +/*--- +includes: [sm/non262-Reflect-shell.js, sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +// Reflect.isExtensible behaves just like Object.extensible except when the +// target argument is missing or is not an object (and that behavior is tested +// in target.js). + +// Test basic functionality. +var someObjects = [ + {}, + {a: "a"}, + [0, 1], + new Uint8Array(64), + Object(Symbol("table")), + new Proxy({}, {}) +]; +if (typeof SharedArrayBuffer != "undefined") + someObjects.push(new Uint8Array(new SharedArrayBuffer(64))); + +for (var obj of someObjects) { + assert.sameValue(Reflect.isExtensible(obj), true); + assert.sameValue(Reflect.preventExtensions(obj), true); + assert.sameValue(Reflect.isExtensible(obj), false); +} + +// Array with nonwritable length. +var arr = [0, 1, 2, 3]; +Object.defineProperty(arr, "length", {writable: false}); +assert.sameValue(Reflect.isExtensible(arr), true); + +// Proxy case. +for (var ext of [true, false]) { + var obj = {}; + if (!ext) + Object.preventExtensions(obj); + var proxy = new Proxy(obj, { + isExtensible() { return ext; } + }); + assert.sameValue(Reflect.isExtensible(proxy), ext); +} + +// If a Proxy's isExtensible method throws, the exception is propagated. +proxy = new Proxy({}, { + isExtensible() { throw "oops"; } +}); +assertThrowsValue(() => Reflect.isExtensible(proxy), "oops"); + +// If an invariant is broken, [[IsExtensible]] does not return false. It throws +// a TypeError. +proxy = new Proxy({}, { + isExtensible() { return false; } +}); +assertThrowsInstanceOf(() => Reflect.isExtensible(proxy), TypeError); + +// For more Reflect.isExtensible tests, see target.js. + diff --git a/test/staging/sm/Reflect/ownKeys.js b/test/staging/sm/Reflect/ownKeys.js new file mode 100644 index 0000000000..ebd01dec1b --- /dev/null +++ b/test/staging/sm/Reflect/ownKeys.js @@ -0,0 +1,75 @@ +/* + * Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/licenses/publicdomain/ + */ + +/*--- +includes: [deepEqual.js, sm/non262-Reflect-shell.js, sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +// Reflect.ownKeys(obj) returns an array of an object's own property keys. + +// Test that Reflect.ownKeys gets the expected result when applied to various +// objects. (These tests also check the basics: that the result is an array, +// that its prototype is correct, etc.) +var sym = Symbol.for("comet"); +var sym2 = Symbol.for("meteor"); +var cases = [ + {object: {z: 3, y: 2, x: 1}, + keys: ["z", "y", "x"]}, + {object: [], + keys: ["length"]}, + {object: new Int8Array(4), + keys: ["0", "1", "2", "3"]}, + {object: new Proxy({a: 7}, {}), + keys: ["a"]}, + {object: {[sym]: "ok"}, + keys: [sym]}, + {object: {[sym]: 0, // test 9.1.12 ordering + "str": 0, + "773": 0, + "0": 0, + [sym2]: 0, + "-1": 0, + "8": 0, + "second str": 0}, + keys: ["0", "8", "773", // indexes in numeric order + "str", "-1", "second str", // strings in insertion order + sym, sym2]}, // symbols in insertion order + {object: createNewGlobal().Math, // cross-compartment wrapper + keys: Reflect.ownKeys(Math)} +]; +for (var {object, keys} of cases) + assert.deepEqual(Reflect.ownKeys(object), keys); + +// Reflect.ownKeys() creates a new array each time it is called. +var object = {}, keys = []; +for (var i = 0; i < 3; i++) { + var newKeys = Reflect.ownKeys(object); + assert.sameValue(newKeys !== keys, true); + keys = newKeys; +} + +// Proxy behavior with successful ownKeys() handler +keys = ["str", "0"]; +obj = {}; +proxy = new Proxy(obj, { + ownKeys() { return keys; } +}); +var actual = Reflect.ownKeys(proxy); +assert.deepEqual(actual, keys); // we get correct answers +assert.sameValue(actual !== keys, true); // but not the same object + +// If a proxy breaks invariants, a TypeError is thrown. +var obj = Object.preventExtensions({}); +var proxy = new Proxy(obj, { + ownKeys() { return ["something"]; } +}); +assertThrowsInstanceOf(() => Reflect.ownKeys(proxy), TypeError); + +// For more Reflect.ownKeys tests, see target.js. + diff --git a/test/staging/sm/Reflect/preventExtensions.js b/test/staging/sm/Reflect/preventExtensions.js new file mode 100644 index 0000000000..99a3df1974 --- /dev/null +++ b/test/staging/sm/Reflect/preventExtensions.js @@ -0,0 +1,65 @@ +/* + * Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/licenses/publicdomain/ + */ + +/*--- +includes: [sm/non262-Reflect-shell.js, sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +// Reflect.preventExtensions is the same as Object.preventExtensions, except +// for the return value and the behavior in error cases. + +var someObjects = [ + {}, + new Int32Array(7), + Object(Symbol("table")), + new Proxy({}, {}) +]; + +for (var obj of someObjects) { + assert.sameValue(Reflect.preventExtensions(obj), true); + // [[PreventExtensions]] on an already-inextensible object is a no-op. + assert.sameValue(Reflect.preventExtensions(obj), true); +} + +// Error cases. +assertThrowsInstanceOf(() => Reflect.isExtensible(), TypeError); +for (var value of [undefined, null, true, 1, NaN, "Phaedo", Symbol("good")]) { + assertThrowsInstanceOf(() => Reflect.isExtensible(value), TypeError); +} + +// A proxy's preventExtensions handler can return false without doing anything. +obj = {}; +var proxy = new Proxy(obj, { + preventExtensions() { return false; } +}); +assert.sameValue(Reflect.preventExtensions(proxy), false); +assert.sameValue(Reflect.isExtensible(obj), true); +assert.sameValue(Reflect.isExtensible(proxy), true); + +// If a proxy's preventExtensions handler throws, the exception is propagated. +obj = {}; +proxy = new Proxy(obj, { + preventExtensions() { throw "fit"; } +}); +assertThrowsValue(() => Reflect.preventExtensions(proxy), "fit"); +assert.sameValue(Reflect.isExtensible(obj), true); +assert.sameValue(Reflect.isExtensible(proxy), true); + +// If a proxy's preventExtensions handler returns true while leaving the target +// extensible, that's a TypeError. +obj = {}; +proxy = new Proxy(obj, { + preventExtensions() { return true; } +}); +assertThrowsInstanceOf(() => Reflect.preventExtensions(proxy), TypeError); +assert.sameValue(Reflect.isExtensible(obj), true); +assert.sameValue(Reflect.isExtensible(proxy), true); + +// For more Reflect.preventExtensions tests, see target.js. + diff --git a/test/staging/sm/Reflect/propertyKeys.js b/test/staging/sm/Reflect/propertyKeys.js new file mode 100644 index 0000000000..af3ab50cde --- /dev/null +++ b/test/staging/sm/Reflect/propertyKeys.js @@ -0,0 +1,93 @@ +/* + * Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/licenses/publicdomain/ + */ + +/*--- +includes: [deepEqual.js, sm/non262-Reflect-shell.js, sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +// Test corner cases involving Reflect methods' propertyKey arguments. + +// keys - Array of propertyKey values to be tested. +// +// Each element of this array is a record with these properties: +// +// * value: a value that will be passed as a property key +// to the various Reflect methods; +// +// * expected: (optional) the string or symbol that ToPropertyKey(value) +// should return. If this is omitted, ToPropertyKey(value) === value. +// +var keys = [ + {value: null, expected: "null"}, + {value: undefined, expected: "undefined"}, + {value: true, expected: "true"}, + {value: 42, expected: "42"}, + {value: "string"}, + {value: ""}, + {value: "string with \0"}, + {value: new String("ok"), expected: "ok"}, + {value: Symbol("sym")}, + {value: Symbol.iterator}, + {value: Object(Symbol.for("comet")), expected: Symbol.for("comet")}, + { + value: { + toString() { return "key"; }, + valueOf() { return "bad"; } + }, + expected: "key" + }, + { + value: { + toString: undefined, + valueOf() { return "fallback"; } + }, + expected: "fallback" + }, + { + value: { + [Symbol.toPrimitive](hint) { return hint; } + }, + expected: "string" + }, + { + value: { + [Symbol.toPrimitive](hint) { return Symbol.for(hint); } + }, + expected: Symbol.for("string") + } +]; + +for (var {value, expected} of keys) { + if (expected === undefined) + expected = value; + + var obj = {}; + assert.sameValue(Reflect.defineProperty(obj, value, {value: 1, configurable: true}), true); + assert.deepEqual(Reflect.ownKeys(obj), [expected]); + assert.deepEqual(Reflect.getOwnPropertyDescriptor(obj, value), + {value: 1, + writable: false, + enumerable: false, + configurable: true}); + assert.sameValue(Reflect.deleteProperty(obj, value), true); + assert.sameValue(Reflect.has(obj, value), false); + assert.sameValue(Reflect.set(obj, value, 113), true); + assert.sameValue(obj[expected], 113); + assert.sameValue(Reflect.has(obj, value), true); + assert.sameValue(Reflect.get(obj, value), 113); +} + +// ToPropertyKey can throw. +var exc = {}; +var badKey = {toString() { throw exc; }}; +var methodNames = ["defineProperty", "deleteProperty", "has", "get", "getOwnPropertyDescriptor", "set"]; +for (var name of methodNames) { + assertThrowsValue(() => Reflect[name]({}, badKey), exc); +} + diff --git a/test/staging/sm/Reflect/set.js b/test/staging/sm/Reflect/set.js new file mode 100644 index 0000000000..d7be0bbaf1 --- /dev/null +++ b/test/staging/sm/Reflect/set.js @@ -0,0 +1,291 @@ +/* + * Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/licenses/publicdomain/ + */ + +/*--- +includes: [deepEqual.js, sm/non262-Reflect-shell.js, sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +// Reflect.set does property assignment. +// With three arguments, this is pretty straightforward. +var obj = {}; +assert.sameValue(Reflect.set(obj, "prop", "value"), true); +assert.sameValue(obj.prop, "value"); + + +// === Various targets + +// It can assign array elements. +var arr = ["duck", "duck", "duck"]; +assert.sameValue(Reflect.set(arr, 2, "goose"), true); +assert.sameValue(arr[2], "goose"); + +// It can extend an array. +assert.sameValue(Reflect.set(arr, 3, "Model T"), true); +assert.sameValue(arr.length, 4); + +// It can truncate an array. +assert.sameValue(Reflect.set(arr, "length", 1), true); +assert.deepEqual(arr, ["duck"]); + +// It won't assign to non-writable properties of String objects. +var str = new String("hello"); +assert.sameValue(Reflect.set(str, "0", "y"), false); +assert.sameValue(str[0], "h"); +assert.sameValue(Reflect.set(str, "length", 700), false); +assert.sameValue(str.length, 5); + + +// === Receivers +// The optional fourth argument is the receiver, which [[Set]] methods use for +// various things. + +// On ordinary objects, if the property has a setter, the receiver is passed as +// the this-value to the setter. +var expected; +var obj = { + set prop(v) { + "use strict"; + assert.sameValue(v, 32); + assert.sameValue(this, expected); + } +}; +for (expected of [obj, {}, [], 37.3]) { + assert.sameValue(Reflect.set(obj, "prop", 32, expected), true); +} + +// If the property doesn't already exist, it is defined on the receiver. +obj = {}; +var obj2 = {}; +assert.sameValue(Reflect.set(obj, "prop", 47, obj2), true); +assert.deepEqual(obj, {}); +assert.deepEqual(Reflect.getOwnPropertyDescriptor(obj2, "prop"), + {value: 47, writable: true, enumerable: true, configurable: true}); + +// If the property doesn't already exist, and the receiver isn't an object, return false. +for (var v of SOME_PRIMITIVE_VALUES) { + assert.sameValue(Reflect.set({}, "x", 0, v), false); +} + +// Receiver defaults to the target. +obj = {}; +var hits; +var expectedReceiver; +var proxy = new Proxy(obj, { + set(t, k, v, r) { + assert.sameValue(t, obj); + assert.sameValue(k, "key"); + assert.sameValue(v, "value"); + assert.sameValue(r, expectedReceiver); // not obj + hits++; + return true; + } +}); +hits = 0; +expectedReceiver = proxy; +assert.sameValue(Reflect.set(proxy, "key", "value"), true); +assert.sameValue(hits, 1); + +// But not if explicitly present and undefined. +hits = 0; +expectedReceiver = undefined; +assert.sameValue(Reflect.set(proxy, "key", "value", undefined), true); +assert.sameValue(hits, 1); + +// Reflect.set can be used as fallback behavior in a proxy handler .set() +// method. +var log; +obj = { + set prop(v) { + log += "p"; + assert.sameValue(v, "value"); + assert.sameValue(this, proxy); // not obj! + } +}; +proxy = new Proxy(obj, { + set(t, k, v, r) { + assert.sameValue(t, obj); + assert.sameValue(r, proxy); + log += "s"; + return Reflect.set(t, k, v, r); + } +}); +log = ""; +assert.sameValue(Reflect.set(proxy, "prop", "value"), true); +assert.sameValue(log, "sp"); + + +// === Cross-compartment wrapper behavior. + +// When calling a cross-compartment wrapper, receiver is rewrapped for the +// target compartment. +var g = createNewGlobal(); +if (!("assert" in g) && "assert" in globalThis) + g.assert = assert; // necessary when exporting to test262 +if (!("assert.sameValue" in g)) + g.assert.sameValue = assert.sameValue; // necessary in the browser +g.eval(` + var hits; + var obj = { + set x(v) { + "use strict"; + assert.sameValue(this, receiver); + assert.sameValue(v, "xyzzy"); + hits++; + } + }; + var receiver = {}; +`); +g.hits = 0; +assert.sameValue(Reflect.set(g.obj, "x", "xyzzy", g.receiver), true); +assert.sameValue(g.hits, 1); + +// ...even when receiver is from a different compartment than target. +var receiver = {}; +g.receiver = receiver; +g.hits = 0; +assert.sameValue(Reflect.set(g.obj, "x", "xyzzy", receiver), true); +assert.sameValue(g.hits, 1); + +// ...even when receiver is a primtive value, even undefined. +for (receiver of SOME_PRIMITIVE_VALUES) { + g.receiver = receiver; + g.hits = 0; + assert.sameValue(Reflect.set(g.obj, "x", "xyzzy", receiver), true); + assert.sameValue(g.hits, 1); +} + + +// === Less than 3 arguments + +// With two arguments, the value is assumed to be undefined. +obj = {}; +assert.sameValue(Reflect.set(obj, "size"), true); +assert.deepEqual(Reflect.getOwnPropertyDescriptor(obj, "size"), + {value: undefined, writable: true, enumerable: true, configurable: true}); + +// With just one argument, the key is "undefined". +obj = {}; +assert.sameValue(Reflect.set(obj), true); +assert.deepEqual(Reflect.getOwnPropertyDescriptor(obj, "undefined"), + {value: undefined, writable: true, enumerable: true, configurable: true}); + +// For the no argument-case, see target.js. + + +// === Failure cases + +// Non-writable data property +obj = {}; +Reflect.defineProperty(obj, "x", {value: 0, writable: false}); +assert.sameValue(Reflect.set(obj, "x", 1), false); +assert.sameValue(obj.x, 0); + +// The same, but inherited from a prototype +var obj2 = Object.create(obj); +assert.sameValue(Reflect.set(obj2, "x", 1), false); +assert.sameValue(obj2.hasOwnProperty("x"), false); +assert.sameValue(obj2.x, 0); + +// Getter, no setter +obj = {}; +var desc = {get: () => 12, set: undefined, enumerable: false, configurable: true}; +Reflect.defineProperty(obj, "y", desc); +assert.sameValue(Reflect.set(obj, "y", 13), false); +assert.deepEqual(Reflect.getOwnPropertyDescriptor(obj, "y"), desc); + +// The same, but inherited from a prototype +obj2 = Object.create(obj); +assert.sameValue(Reflect.set(obj2, "y", 1), false); +assert.sameValue(obj2.hasOwnProperty("y"), false); +assert.deepEqual(Reflect.getOwnPropertyDescriptor(obj, "y"), desc); + +// Proxy set handler returns a false value +for (var no of [false, ""]) { + var hits = 0; + obj = {}; + var proxy = new Proxy(obj, { + set(t, k, v, r) { + assert.sameValue(t, obj); + assert.sameValue(k, "x"); + assert.sameValue(v, 33); + assert.sameValue(r, proxy); + hits++; + return no; + } + }); + assert.sameValue(Reflect.set(proxy, "x", 33), false); + assert.sameValue(hits, 1); + assert.sameValue("x" in obj, false); +} + +// Proxy handler method throws +obj = {}; +proxy = new Proxy(obj, { + set(t, k, v, r) { throw "i don't like " + v; } +}); +assertThrowsValue(() => Reflect.set(proxy, "food", "cheese"), "i don't like cheese"); + +// If a Proxy set handler breaks the object invariants, it's a TypeError. +for (obj of [{a: 0}, {get a() { return 0; }}]) { + Object.freeze(obj); + proxy = new Proxy(obj, { + set(t, k, v, r) { return true; } + }); + assertThrowsInstanceOf(() => Reflect.set(proxy, "a", "b"), TypeError); +} + +// Per spec, this should first call p.[[Set]]("0", 42, a) and +// then (since p has no own properties) a.[[Set]]("0", 42, a). +// The latter should not define a property on p. +var a = [0, 1, 2, 3]; +var p = Object.create(a); +Reflect.set(p, "0", 42, a); +assert.sameValue(p.hasOwnProperty("0"), false); +assert.deepEqual(Reflect.getOwnPropertyDescriptor(a, "0"), + {value: 42, writable: true, enumerable: true, configurable: true}); + +// Test behavior of ordinary objects' [[Set]] method (ES6 9.1.9). +// On an ordinary object, if the property key isn't present, [[Set]] calls +// receiver.[[GetOwnProperty]]() and then receiver.[[DefineProperty]](). +var log; +obj = {}; +var proxyTarget = {}; +var existingDescriptor, expected, defineResult; +var receiver = new Proxy(proxyTarget, { + getOwnPropertyDescriptor(t, k) { + log += "g"; + return existingDescriptor; + }, + defineProperty(t, k, desc) { + log += "d"; + assert.sameValue(t, proxyTarget); + assert.sameValue(k, "prop"); + assert.deepEqual(desc, expected); + return defineResult; + } +}); +existingDescriptor = undefined; +expected = {value: 5, writable: true, enumerable: true, configurable: true}; +for (var defineResult of [true, false]) { + log = ""; + assert.sameValue(Reflect.set(obj, "prop", 5, receiver), defineResult); + assert.sameValue(log, "gd"); +} + +existingDescriptor = {value: 7, writable: true, enumerable: false, configurable: true}; +expected = {value: 4}; +for (var defineResult of [true, false]) { + log = ""; + assert.sameValue(Reflect.set(obj, "prop", 4, receiver), defineResult); + assert.sameValue(log, "gd"); +} + + +// For more Reflect.set tests, see target.js and propertyKeys.js. + diff --git a/test/staging/sm/Reflect/setPrototypeOf.js b/test/staging/sm/Reflect/setPrototypeOf.js new file mode 100644 index 0000000000..86e9ee1a36 --- /dev/null +++ b/test/staging/sm/Reflect/setPrototypeOf.js @@ -0,0 +1,81 @@ +/* + * Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/licenses/publicdomain/ + */ + +/*--- +includes: [sm/non262-Reflect-shell.js, sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +// Reflect.setPrototypeOf changes an object's [[Prototype]]. +var obj = {}; +assert.sameValue(Object.getPrototypeOf(obj), Object.prototype); +var proto = {}; +assert.sameValue(Reflect.setPrototypeOf(obj, proto), true); +assert.sameValue(Object.getPrototypeOf(obj), proto); + +// It can change an object's [[Prototype]] to null. +obj = {}; +assert.sameValue(Reflect.setPrototypeOf(obj, null), true); +assert.sameValue(Object.getPrototypeOf(obj), null); + +// The proto argument is required too. +obj = {}; +assertThrowsInstanceOf(() => Reflect.setPrototypeOf(obj), TypeError); + +// The proto argument must be either null or an object. +for (proto of [undefined, false, 0, 1.6, "that", Symbol.iterator]) { + assertThrowsInstanceOf(() => Reflect.setPrototypeOf(obj, proto), TypeError); +} + +// Return false if the target isn't extensible. +proto = {}; +obj = Object.preventExtensions(Object.create(proto)); +assert.sameValue(Reflect.setPrototypeOf(obj, {}), false); +assert.sameValue(Reflect.setPrototypeOf(obj, null), false); +assert.sameValue(Reflect.setPrototypeOf(obj, proto), true); // except if not changing anything + +// Return false rather than create a [[Prototype]] cycle. +obj = {}; +assert.sameValue(Reflect.setPrototypeOf(obj, obj), false); + +// Don't create a [[Prototype]] cycle involving 2 objects. +obj = Object.create(proto); +assert.sameValue(Reflect.setPrototypeOf(proto, obj), false); + +// Don't create a longish [[Prototype]] cycle. +for (var i = 0; i < 256; i++) + obj = Object.create(obj); +assert.sameValue(Reflect.setPrototypeOf(proto, obj), false); + +// The spec claims we should allow creating cycles involving proxies. (The +// cycle check quietly exits on encountering the proxy.) +obj = {}; +var proxy = new Proxy(Object.create(obj), {}); + +assert.sameValue(Reflect.setPrototypeOf(obj, proxy), true); +assert.sameValue(Reflect.getPrototypeOf(obj), proxy); +assert.sameValue(Reflect.getPrototypeOf(proxy), obj); + +// If a proxy handler returns a false-y value, return false. +var hits = 0; +proto = {name: "proto"}; +obj = {name: "obj"}; +proxy = new Proxy(obj, { + setPrototypeOf(t, p) { + assert.sameValue(t, obj); + assert.sameValue(p, proto); + hits++; + return 0; + } +}); + +assert.sameValue(Reflect.setPrototypeOf(proxy, proto), false); +assert.sameValue(hits, 1); + +// For more Reflect.setPrototypeOf tests, see target.js. + diff --git a/test/staging/sm/Reflect/surfaces.js b/test/staging/sm/Reflect/surfaces.js new file mode 100644 index 0000000000..831e42108e --- /dev/null +++ b/test/staging/sm/Reflect/surfaces.js @@ -0,0 +1,68 @@ +/* + * Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/licenses/publicdomain/ + */ + +/*--- +includes: [sm/non262-Reflect-shell.js, sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +// Check surface features of the Reflect object. +assert.sameValue(typeof Reflect, 'object'); +assert.sameValue(Object.getPrototypeOf(Reflect), Object.prototype); +assert.sameValue(Reflect.toString(), '[object Reflect]'); +assertThrowsInstanceOf(() => new Reflect, TypeError); + +var desc = Object.getOwnPropertyDescriptor(this, "Reflect"); +assert.sameValue(desc.enumerable, false); +assert.sameValue(desc.configurable, true); +assert.sameValue(desc.writable, true); + +for (const name in Reflect) + throw new Error("Reflect should not have any enumerable properties"); + +// The name and length of all the standard Reflect methods. +var methods = { + apply: 3, + construct: 2, + defineProperty: 3, + deleteProperty: 2, + get: 2, + getOwnPropertyDescriptor: 2, + getPrototypeOf: 1, + has: 2, + isExtensible: 1, + ownKeys: 1, + preventExtensions: 1, + set: 3, + setPrototypeOf: 2 +}; + +// Check that all Reflect properties are listed above. +for (const name of Reflect.ownKeys(Reflect)) { + // If this assertion fails, congratulations on implementing a new Reflect feature! + // Add it to the list of methods above. + if (typeof name !== "symbol" && name !== "parse") + assert.sameValue(name in methods, true, `unexpected property found: Reflect.${name}`); +} + +// Check the .length and property attributes of each Reflect method. +for (const name of Object.keys(methods)) { + var desc = Object.getOwnPropertyDescriptor(Reflect, name); + assert.sameValue(desc.enumerable, false); + assert.sameValue(desc.configurable, true); + assert.sameValue(desc.writable, true); + var f = desc.value; + assert.sameValue(typeof f, "function"); + assert.sameValue(f.length, methods[name]); +} + +// Check that the SpiderMonkey "resolve hook" mechanism does not resurrect the +// Reflect property once it is deleted. +delete this.Reflect; +assert.sameValue("Reflect" in this, false); + diff --git a/test/staging/sm/Reflect/target.js b/test/staging/sm/Reflect/target.js new file mode 100644 index 0000000000..dbcc30b8d3 --- /dev/null +++ b/test/staging/sm/Reflect/target.js @@ -0,0 +1,53 @@ +/* + * Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/licenses/publicdomain/ + */ + +/*--- +includes: [sm/non262-Reflect-shell.js, sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +// Check correct handling of the `target` argument shared by every Reflect method. + +// For each standard Reflect method, an array of arguments +// that would be OK after a suitable target argument. +var methodInfo = { + apply: [undefined, []], + construct: [[]], + defineProperty: ["x", {}], + deleteProperty: ["x"], + get: ["x", {}], + getOwnPropertyDescriptor: ["x"], + getPrototypeOf: [], + has: ["x"], + isExtensible: [], + ownKeys: [], + preventExtensions: [], + set: ["x", 0], + setPrototypeOf: [{}] +}; + +// Check that all Reflect properties are listed above. +for (const name of Reflect.ownKeys(Reflect)) { + // If this assertion fails, congratulations on implementing a new Reflect feature! + // Add it to methodInfo above. + if (typeof name !== "symbol" && name !== "parse") + assert.sameValue(name in methodInfo, true); +} + +for (const name of Object.keys(methodInfo)) { + var args = methodInfo[name]; + + // The target argument is required. + assertThrowsInstanceOf(Reflect[name], TypeError); + + // Throw if the target argument is not an object. + for (var value of SOME_PRIMITIVE_VALUES) { + assertThrowsInstanceOf(() => Reflect[name](value, ...args), TypeError); + } +} + diff --git a/test/staging/sm/RegExp/15.10.5-01.js b/test/staging/sm/RegExp/15.10.5-01.js new file mode 100644 index 0000000000..7f6382f456 --- /dev/null +++ b/test/staging/sm/RegExp/15.10.5-01.js @@ -0,0 +1,26 @@ +/* + * Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/licenses/publicdomain/ + */ + +/*--- +includes: [sm/non262-RegExp-shell.js, sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +var BUGNUMBER = 614603; +var summary = "RegExp.length"; + +print(BUGNUMBER + ": " + summary); + +/************** + * BEGIN TEST * + **************/ + +assert.sameValue(RegExp.length, 2); +assert.sameValue(/a/.constructor.length, 2); + +print("All tests passed!"); diff --git a/test/staging/sm/RegExp/15.10.7.5-01.js b/test/staging/sm/RegExp/15.10.7.5-01.js new file mode 100644 index 0000000000..d4a3ca74b3 --- /dev/null +++ b/test/staging/sm/RegExp/15.10.7.5-01.js @@ -0,0 +1,76 @@ +/* + * Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/licenses/publicdomain/ + */ + +/*--- +includes: [sm/non262-RegExp-shell.js, sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +var BUGNUMBER = 465199; +var summary = "RegExp lastIndex property set should not coerce type to number"; + +print(BUGNUMBER + ": " + summary); + +/************** + * BEGIN TEST * + **************/ + +var called = false; +var o = { valueOf: function() { called = true; return 1; } }; +var r = /a/g; +var desc, m; + +assert.sameValue(r.lastIndex, 0); + +desc = Object.getOwnPropertyDescriptor(r, "lastIndex"); +assert.sameValue(desc.enumerable, false); +assert.sameValue(desc.configurable, false); +assert.sameValue(desc.value, 0); +assert.sameValue(desc.writable, true); + +r.lastIndex = o; + +assert.sameValue(r.lastIndex, o); + +desc = Object.getOwnPropertyDescriptor(r, "lastIndex"); +assert.sameValue(desc.enumerable, false); +assert.sameValue(desc.configurable, false); +assert.sameValue(desc.value, o); +assert.sameValue(desc.writable, true); + +assert.sameValue(called, false); +assert.sameValue(r.exec("aaaa").length, 1); +assert.sameValue(called, true); +assert.sameValue(r.lastIndex, 2); + +desc = Object.getOwnPropertyDescriptor(r, "lastIndex"); +assert.sameValue(desc.enumerable, false); +assert.sameValue(desc.configurable, false); +assert.sameValue(desc.value, 2); +assert.sameValue(desc.writable, true); + + +r.lastIndex = -0.2; +assert.sameValue(r.lastIndex, -0.2); + +m = r.exec("aaaa"); +assert.sameValue(Array.isArray(m), true); +assert.sameValue(m.length, 1); +assert.sameValue(m[0], "a"); +assert.sameValue(r.lastIndex, 1); + +m = r.exec("aaaa"); +assert.sameValue(Array.isArray(m), true); +assert.sameValue(m.length, 1); +assert.sameValue(m[0], "a"); +assert.sameValue(r.lastIndex, 2); + + +/******************************************************************************/ + +print("All tests passed!"); diff --git a/test/staging/sm/RegExp/7.8.5-01.js b/test/staging/sm/RegExp/7.8.5-01.js new file mode 100644 index 0000000000..f7a61fe84d --- /dev/null +++ b/test/staging/sm/RegExp/7.8.5-01.js @@ -0,0 +1,40 @@ +/* + * Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/licenses/publicdomain/ + */ + +/*--- +includes: [sm/non262-RegExp-shell.js, sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +var BUGNUMBER = 615070; +var summary = "Line terminator after backslash is invalid in regexp literals"; + +print(BUGNUMBER + ": " + summary); + +/************** + * BEGIN TEST * + **************/ + +var regexps = ["/\\\u000A/", "/\\\u000D/", "/\\\u2028/", "/\\\u2029/", + "/ab\\\n/", "/ab\\\r/", "/ab\\\u2028/", "/ab\\\u2029/", + "/ab[c\\\n]/", "/a[bc\\", "/\\"]; + +for(var i=0; i RegExp.prototype[Symbol.match].call({ exec }, "foo"), + TypeError); +} + diff --git a/test/staging/sm/RegExp/RegExpExec-return.js b/test/staging/sm/RegExp/RegExpExec-return.js new file mode 100644 index 0000000000..9203912b03 --- /dev/null +++ b/test/staging/sm/RegExp/RegExpExec-return.js @@ -0,0 +1,40 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-RegExp-shell.js, sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +var BUGNUMBER = 887016; +var summary = "RegExpExec should throw if returned value is not an object nor null."; + +print(BUGNUMBER + ": " + summary); + +for (var ret of [null, {}, [], /a/]) { + assert.sameValue(RegExp.prototype[Symbol.match].call({ + get global() { + return false; + }, + exec(S) { + return ret; + } + }, "foo"), ret); +} + +for (ret of [undefined, 1, true, false, Symbol.iterator]) { + assertThrowsInstanceOf(() => { + RegExp.prototype[Symbol.match].call({ + get global() { + return false; + }, + exec(S) { + return ret; + } + }, "foo"); + }, TypeError); +} + diff --git a/test/staging/sm/RegExp/character-class-escape-s.js b/test/staging/sm/RegExp/character-class-escape-s.js new file mode 100644 index 0000000000..fe2a21bfd1 --- /dev/null +++ b/test/staging/sm/RegExp/character-class-escape-s.js @@ -0,0 +1,61 @@ +/* + * Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/licenses/publicdomain/ + */ + +/*--- +includes: [sm/non262-RegExp-shell.js, sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +/* Generated by make_unicode.py DO NOT MODIFY */ +/* Unicode version: 15.0.0 */ + +var onlySpace = String.fromCodePoint( + 0x0009 /* (CHARACTER TABULATION) */, + 0x000A /* (LINE FEED (LF)) */, + 0x000B /* (LINE TABULATION) */, + 0x000C /* (FORM FEED (FF)) */, + 0x000D /* (CARRIAGE RETURN (CR)) */, + 0x0020 /* SPACE */, + 0x00A0 /* NO-BREAK SPACE (NON-BREAKING SPACE) */, + 0x1680 /* OGHAM SPACE MARK */, + 0x2000 /* EN QUAD */, + 0x2001 /* EM QUAD */, + 0x2002 /* EN SPACE */, + 0x2003 /* EM SPACE */, + 0x2004 /* THREE-PER-EM SPACE */, + 0x2005 /* FOUR-PER-EM SPACE */, + 0x2006 /* SIX-PER-EM SPACE */, + 0x2007 /* FIGURE SPACE */, + 0x2008 /* PUNCTUATION SPACE */, + 0x2009 /* THIN SPACE */, + 0x200A /* HAIR SPACE */, + 0x2028 /* LINE SEPARATOR */, + 0x2029 /* PARAGRAPH SEPARATOR */, + 0x202F /* NARROW NO-BREAK SPACE */, + 0x205F /* MEDIUM MATHEMATICAL SPACE */, + 0x3000 /* IDEOGRAPHIC SPACE */, + 0xFEFF /* ZERO WIDTH NO-BREAK SPACE (BYTE ORDER MARK) */ +); + +assert.sameValue(/^\s+$/.exec(onlySpace) !== null, true); +assert.sameValue(/^[\s]+$/.exec(onlySpace) !== null, true); +assert.sameValue(/^[^\s]+$/.exec(onlySpace) === null, true); + +assert.sameValue(/^\S+$/.exec(onlySpace) === null, true); +assert.sameValue(/^[\S]+$/.exec(onlySpace) === null, true); +assert.sameValue(/^[^\S]+$/.exec(onlySpace) !== null, true); + +// Also test with Unicode RegExps. +assert.sameValue(/^\s+$/u.exec(onlySpace) !== null, true); +assert.sameValue(/^[\s]+$/u.exec(onlySpace) !== null, true); +assert.sameValue(/^[^\s]+$/u.exec(onlySpace) === null, true); + +assert.sameValue(/^\S+$/u.exec(onlySpace) === null, true); +assert.sameValue(/^[\S]+$/u.exec(onlySpace) === null, true); +assert.sameValue(/^[^\S]+$/u.exec(onlySpace) !== null, true); + diff --git a/test/staging/sm/RegExp/class-null.js b/test/staging/sm/RegExp/class-null.js new file mode 100644 index 0000000000..421a00947a --- /dev/null +++ b/test/staging/sm/RegExp/class-null.js @@ -0,0 +1,24 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-RegExp-shell.js, sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +var BUGNUMBER = 1279467; +var summary = "Null in character class in RegExp with unicode flag."; + +print(BUGNUMBER + ": " + summary); + +var m = /([\0]+)/u.exec("\u0000"); +assert.sameValue(m.length, 2); +assert.sameValue(m[0], '\u0000'); +assert.sameValue(m[1], '\u0000'); + +var m = /([\0]+)/u.exec("0"); +assert.sameValue(m, null); + diff --git a/test/staging/sm/RegExp/compile-lastIndex.js b/test/staging/sm/RegExp/compile-lastIndex.js new file mode 100644 index 0000000000..c1c9d83b57 --- /dev/null +++ b/test/staging/sm/RegExp/compile-lastIndex.js @@ -0,0 +1,87 @@ +/* + * Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/licenses/publicdomain/ + */ + +/*--- +includes: [sm/non262-RegExp-shell.js, sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +var BUGNUMBER = 1253099; +var summary = + "RegExp.prototype.compile must perform all its steps *except* setting " + + ".lastIndex, then throw, when provided a RegExp whose .lastIndex has been " + + "made non-writable"; + +print(BUGNUMBER + ": " + summary); + +/************** + * BEGIN TEST * + **************/ + +var regex = /foo/i; + +// Aside from making .lastIndex non-writable, this has one incidental effect +// ubiquitously tested through the remainder of this test: +// +// * RegExp.prototype.compile will do everything it ordinarily does, BUT it +// will throw a TypeError when attempting to zero .lastIndex immediately +// before succeeding overall. +// +// Ain't it great? +Object.defineProperty(regex, "lastIndex", { value: 42, writable: false }); + +assert.sameValue(regex.global, false); +assert.sameValue(regex.ignoreCase, true); +assert.sameValue(regex.multiline, false); +assert.sameValue(regex.unicode, false); +assert.sameValue(regex.sticky, false); +assert.sameValue(Object.getOwnPropertyDescriptor(regex, "lastIndex").writable, false); +assert.sameValue(regex.lastIndex, 42); + +assert.sameValue(regex.test("foo"), true); +assert.sameValue(regex.test("FOO"), true); +assert.sameValue(regex.test("bar"), false); +assert.sameValue(regex.test("BAR"), false); + +assertThrowsInstanceOf(() => regex.compile("bar"), TypeError); + +assert.sameValue(regex.global, false); +assert.sameValue(regex.ignoreCase, false); +assert.sameValue(regex.multiline, false); +assert.sameValue(regex.unicode, false); +assert.sameValue(regex.sticky, false); +assert.sameValue(Object.getOwnPropertyDescriptor(regex, "lastIndex").writable, false); +assert.sameValue(regex.lastIndex, 42); +assert.sameValue(regex.test("foo"), false); +assert.sameValue(regex.test("FOO"), false); +assert.sameValue(regex.test("bar"), true); +assert.sameValue(regex.test("BAR"), false); + +assertThrowsInstanceOf(() => regex.compile("^baz", "m"), TypeError); + +assert.sameValue(regex.global, false); +assert.sameValue(regex.ignoreCase, false); +assert.sameValue(regex.multiline, true); +assert.sameValue(regex.unicode, false); +assert.sameValue(regex.sticky, false); +assert.sameValue(Object.getOwnPropertyDescriptor(regex, "lastIndex").writable, false); +assert.sameValue(regex.lastIndex, 42); +assert.sameValue(regex.test("foo"), false); +assert.sameValue(regex.test("FOO"), false); +assert.sameValue(regex.test("bar"), false); +assert.sameValue(regex.test("BAR"), false); +assert.sameValue(regex.test("baz"), true); +assert.sameValue(regex.test("BAZ"), false); +assert.sameValue(regex.test("012345678901234567890123456789012345678901baz"), false); +assert.sameValue(regex.test("012345678901234567890123456789012345678901\nbaz"), true); +assert.sameValue(regex.test("012345678901234567890123456789012345678901BAZ"), false); +assert.sameValue(regex.test("012345678901234567890123456789012345678901\nBAZ"), false); + +/******************************************************************************/ + +print("Tests complete"); diff --git a/test/staging/sm/RegExp/constructor-IsRegExp.js b/test/staging/sm/RegExp/constructor-IsRegExp.js new file mode 100644 index 0000000000..f18e20a9b9 --- /dev/null +++ b/test/staging/sm/RegExp/constructor-IsRegExp.js @@ -0,0 +1,95 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-RegExp-shell.js, sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +var BUGNUMBER = 1147817; +var summary = "RegExp constructor with pattern with @@match."; + +print(BUGNUMBER + ": " + summary); + +var matchValue; +var constructorValue; + +var matchGet; +var constructorGet; +var sourceGet; +var flagsGet; +function reset() { + matchGet = false; + constructorGet = false; + sourceGet = false; + flagsGet = false; +} +var obj = { + get [Symbol.match]() { + matchGet = true; + return matchValue; + }, + get constructor() { + constructorGet = true; + return constructorValue; + }, + get source() { + sourceGet = true; + return "foo"; + }, + get flags() { + flagsGet = true; + return "i"; + }, + toString() { + return "bar"; + } +}; + +matchValue = true; +constructorValue = function() {}; + +reset(); +assert.sameValue(RegExp(obj).toString(), "/foo/i"); +assert.sameValue(matchGet, true); +assert.sameValue(constructorGet, true); +assert.sameValue(sourceGet, true); +assert.sameValue(flagsGet, true); + +reset(); +assert.sameValue(RegExp(obj, "g").toString(), "/foo/g"); +assert.sameValue(matchGet, true); +assert.sameValue(constructorGet, false); +assert.sameValue(sourceGet, true); +assert.sameValue(flagsGet, false); + +matchValue = false; +constructorValue = function() {}; + +reset(); +assert.sameValue(RegExp(obj).toString(), "/bar/"); +assert.sameValue(matchGet, true); +assert.sameValue(constructorGet, false); +assert.sameValue(sourceGet, false); +assert.sameValue(flagsGet, false); + +reset(); +assert.sameValue(RegExp(obj, "g").toString(), "/bar/g"); +assert.sameValue(matchGet, true); +assert.sameValue(constructorGet, false); +assert.sameValue(sourceGet, false); +assert.sameValue(flagsGet, false); + +matchValue = true; +constructorValue = RegExp; + +reset(); +assert.sameValue(RegExp(obj), obj); +assert.sameValue(matchGet, true); +assert.sameValue(constructorGet, true); +assert.sameValue(sourceGet, false); +assert.sameValue(flagsGet, false); + diff --git a/test/staging/sm/RegExp/constructor-constructor.js b/test/staging/sm/RegExp/constructor-constructor.js new file mode 100644 index 0000000000..966293af09 --- /dev/null +++ b/test/staging/sm/RegExp/constructor-constructor.js @@ -0,0 +1,87 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-RegExp-shell.js, sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +var BUGNUMBER = 1147817; +var summary = "RegExp constructor should check pattern.constructor."; + +print(BUGNUMBER + ": " + summary); + +var g = createNewGlobal(); + +var re = /foo/; +assert.sameValue(RegExp(re), re); +re.constructor = 10; +assert.sameValue(RegExp(re) === re, false); +assert.sameValue(RegExp(re).toString(), re.toString()); + +// If pattern comes from different global, RegExp shouldn't return it. +re = g.eval(`var re = /foo/; re;`); +assert.sameValue(RegExp(re) === re, false); +assert.sameValue(RegExp(re).toString(), re.toString()); +g.eval(`re.constructor = 10;`); +assert.sameValue(RegExp(re) === re, false); +assert.sameValue(RegExp(re).toString(), re.toString()); + + +re = new Proxy(/a/, { + get(that, name) { + return that[name]; + } +}); +assert.sameValue(RegExp(re), re); +re = new Proxy(/a/, { + get(that, name) { + if (name == "constructor") { + return function() {}; + } + return that[name]; + } +}); +assert.sameValue(RegExp(re) === re, false); +re = new Proxy(/a/, { + get(that, name) { + if (name == Symbol.match) { + return undefined; + } + return that[name]; + } +}); +assert.sameValue(RegExp(re) === re, false); + +re = new Proxy(g.eval(`/a/`), { + get(that, name) { + return that[name]; + } +}); +assert.sameValue(RegExp(re) === re, false); + +re = g.eval(`new Proxy(/a/, { + get(that, name) { + return that[name]; + } +});`); +assert.sameValue(RegExp(re) === re, false); + + +var obj = { [Symbol.match]: true, source: "foo", flags: "gi" }; +assert.sameValue(RegExp(obj) === obj, false); +assert.sameValue(RegExp(obj).toString(), "/foo/gi"); +obj.constructor = RegExp; +assert.sameValue(RegExp(obj), obj); + +obj = g.eval(`var obj = { [Symbol.match]: true, source: "foo", flags: "gi" }; obj;`); +assert.sameValue(RegExp(obj) === obj, false); +assert.sameValue(RegExp(obj).toString(), "/foo/gi"); +g.eval(`obj.constructor = RegExp`); +assert.sameValue(RegExp(obj) === obj, false); +obj.constructor = RegExp; +assert.sameValue(RegExp(obj), obj); + diff --git a/test/staging/sm/RegExp/constructor-ordering-2.js b/test/staging/sm/RegExp/constructor-ordering-2.js new file mode 100644 index 0000000000..f150aa777a --- /dev/null +++ b/test/staging/sm/RegExp/constructor-ordering-2.js @@ -0,0 +1,30 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-RegExp-shell.js, sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +// Make sure that we don't ToString the second argument until /after/ doing +// the appropriate subclassing lookups + +var didLookup = false; + +var re = /a/; +var flags = { toString() { assert.sameValue(didLookup, true); return "g"; } }; +var newRe = Reflect.construct(RegExp, [re, flags], + Object.defineProperty(function(){}.bind(null), "prototype", { + get() { + didLookup = true; + return RegExp.prototype; + } +})); + +assert.sameValue(Object.getPrototypeOf(newRe), RegExp.prototype); +assert.sameValue(didLookup, true); + + diff --git a/test/staging/sm/RegExp/constructor-ordering.js b/test/staging/sm/RegExp/constructor-ordering.js new file mode 100644 index 0000000000..62d5dc51a3 --- /dev/null +++ b/test/staging/sm/RegExp/constructor-ordering.js @@ -0,0 +1,25 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-RegExp-shell.js, sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +// Make sure that we don't misorder subclassing accesses with respect to +// accessing regex arg internal slots +// +// Test credit André Bargull. + +var re = /a/; +var newRe = Reflect.construct(RegExp, [re], Object.defineProperty(function(){}.bind(null), "prototype", { + get() { + re.compile("b"); + return RegExp.prototype; + } +})); +assert.sameValue(newRe.source, "a"); + diff --git a/test/staging/sm/RegExp/constructor-regexp-unicode.js b/test/staging/sm/RegExp/constructor-regexp-unicode.js new file mode 100644 index 0000000000..f8e958b314 --- /dev/null +++ b/test/staging/sm/RegExp/constructor-regexp-unicode.js @@ -0,0 +1,18 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-RegExp-shell.js, sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +var BUGNUMBER = 1274393; +var summary = "RegExp constructor should check the pattern syntax again when adding unicode flag."; + +print(BUGNUMBER + ": " + summary); + +assertThrowsInstanceOf(() => RegExp(/\-/, "u"), SyntaxError); + diff --git a/test/staging/sm/RegExp/constructor-regexp.js b/test/staging/sm/RegExp/constructor-regexp.js new file mode 100644 index 0000000000..7dad024d93 --- /dev/null +++ b/test/staging/sm/RegExp/constructor-regexp.js @@ -0,0 +1,70 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-RegExp-shell.js, sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +var BUGNUMBER = 1130860; +var summary = "RegExp constructor shouldn't invoke source/flags getters on argument RegExp instance."; + +print(BUGNUMBER + ": " + summary); + +// same-compartment +var a = /foo/; +var flagsCalled = false; +var sourceCalled = false; +Object.defineProperty(a, "source", { get: () => { + sourceCalled = true; + return "bar"; +}}); +Object.defineProperty(a, "flags", { get: () => { + flagsCalled = true; + return "i"; +}}); + +assert.sameValue(a.source, "bar"); +assert.sameValue(a.flags, "i"); +assert.sameValue(sourceCalled, true); +assert.sameValue(flagsCalled, true); + +sourceCalled = false; +flagsCalled = false; +assert.sameValue(new RegExp(a).source, "foo"); +assert.sameValue(sourceCalled, false); +assert.sameValue(flagsCalled, false); + +// cross-compartment +var g = createNewGlobal(); +var b = g.eval(` +var b = /foo2/; +var flagsCalled = false; +var sourceCalled = false; +Object.defineProperty(b, "source", { get: () => { + sourceCalled = true; + return "bar2"; +}}); +Object.defineProperty(b, "flags", { get: () => { + flagsCalled = true; + return "i"; +}}); +b; +`); + +assert.sameValue(b.source, "bar2"); +assert.sameValue(b.flags, "i"); +assert.sameValue(g.eval("sourceCalled;"), true); +assert.sameValue(g.eval("flagsCalled;"), true); + +g.eval(` +sourceCalled = false; +flagsCalled = false; +`); +assert.sameValue(new RegExp(b).source, "foo2"); +assert.sameValue(g.eval("sourceCalled;"), false); +assert.sameValue(g.eval("flagsCalled;"), false); + diff --git a/test/staging/sm/RegExp/cross-compartment-getter.js b/test/staging/sm/RegExp/cross-compartment-getter.js new file mode 100644 index 0000000000..92e0c26d80 --- /dev/null +++ b/test/staging/sm/RegExp/cross-compartment-getter.js @@ -0,0 +1,52 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-RegExp-shell.js, sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +const otherGlobal = createNewGlobal({newCompartment: true}); + +let regExp = otherGlobal.eval("/a(b|c)/iy"); + +function get(name) { + const descriptor = Object.getOwnPropertyDescriptor(RegExp.prototype, name); + return descriptor.get.call(regExp); +} + +assert.sameValue(get("flags"), "iy"); +assert.sameValue(get("global"), false); +assert.sameValue(get("ignoreCase"), true); +assert.sameValue(get("multiline"), false); +assert.sameValue(get("dotAll"), false); +assert.sameValue(get("source"), "a(b|c)"); +assert.sameValue(get("sticky"), true); +assert.sameValue(get("unicode"), false); + +regExp = otherGlobal.eval("new RegExp('', 'gu')"); + +assert.sameValue(get("flags"), "gu"); +assert.sameValue(get("global"), true); +assert.sameValue(get("ignoreCase"), false); +assert.sameValue(get("multiline"), false); +assert.sameValue(get("dotAll"), false); +assert.sameValue(get("source"), "(?:)"); +assert.sameValue(get("sticky"), false); +assert.sameValue(get("unicode"), true); + +// Trigger escaping +regExp = otherGlobal.eval("new RegExp('a/b', '')"); + +assert.sameValue(get("flags"), ""); +assert.sameValue(get("global"), false); +assert.sameValue(get("ignoreCase"), false); +assert.sameValue(get("multiline"), false); +assert.sameValue(get("dotAll"), false); +assert.sameValue(get("source"), "a\\/b"); +assert.sameValue(get("sticky"), false); +assert.sameValue(get("unicode"), false); + diff --git a/test/staging/sm/RegExp/descriptor.js b/test/staging/sm/RegExp/descriptor.js new file mode 100644 index 0000000000..1718f5c92d --- /dev/null +++ b/test/staging/sm/RegExp/descriptor.js @@ -0,0 +1,34 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-RegExp-shell.js, sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +var BUGNUMBER = 1120169; +var summary = "Implement RegExp.prototype.{global, ignoreCase, multiline, sticky, unicode} - property descriptor"; + +print(BUGNUMBER + ": " + summary); + +var getters = [ + "flags", + "global", + "ignoreCase", + "multiline", + "source", + "sticky", + "unicode", +]; + +for (var name of getters) { + var desc = Object.getOwnPropertyDescriptor(RegExp.prototype, name); + assert.sameValue(desc.configurable, true); + assert.sameValue(desc.enumerable, false); + assert.sameValue("writable" in desc, false); + assert.sameValue("get" in desc, true); +} + diff --git a/test/staging/sm/RegExp/empty-lookahead.js b/test/staging/sm/RegExp/empty-lookahead.js new file mode 100644 index 0000000000..465eb2dc14 --- /dev/null +++ b/test/staging/sm/RegExp/empty-lookahead.js @@ -0,0 +1,17 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-RegExp-shell.js, sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +//bug 473941 +var regexp; + +regexp = /(?=)/; +assert.sameValue(regexp.test('test'), true); + diff --git a/test/staging/sm/RegExp/escape.js b/test/staging/sm/RegExp/escape.js new file mode 100644 index 0000000000..e55eca1744 --- /dev/null +++ b/test/staging/sm/RegExp/escape.js @@ -0,0 +1,79 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-RegExp-shell.js, sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +var BUGNUMBER = 1130860; +var summary = 'Slash and LineTerminator should be escaped correctly.'; + +print(BUGNUMBER + ": " + summary); + +function test(re, source) { + assert.sameValue(re.source, source); + assert.sameValue(eval("/" + re.source + "/").source, source); + assert.sameValue(re.toString(), "/" + source + "/"); +} + +test(/\\n/, "\\\\n"); +test(/\\\n/, "\\\\\\n"); +test(/\\\\n/, "\\\\\\\\n"); +test(RegExp("\\n"), "\\n"); +test(RegExp("\\\n"), "\\n"); +test(RegExp("\\\\n"), "\\\\n"); + +test(/\\r/, "\\\\r"); +test(/\\\r/, "\\\\\\r"); +test(/\\\\r/, "\\\\\\\\r"); +test(RegExp("\\r"), "\\r"); +test(RegExp("\\\r"), "\\r"); +test(RegExp("\\\\r"), "\\\\r"); + +test(/\\u2028/, "\\\\u2028"); +test(/\\\u2028/, "\\\\\\u2028"); +test(/\\\\u2028/, "\\\\\\\\u2028"); +test(RegExp("\\u2028"), "\\u2028"); +test(RegExp("\\\u2028"), "\\u2028"); +test(RegExp("\\\\u2028"), "\\\\u2028"); + +test(/\\u2029/, "\\\\u2029"); +test(/\\\u2029/, "\\\\\\u2029"); +test(/\\\\u2029/, "\\\\\\\\u2029"); +test(RegExp("\\u2029"), "\\u2029"); +test(RegExp("\\\u2029"), "\\u2029"); +test(RegExp("\\\\u2029"), "\\\\u2029"); + +test(/\//, "\\/"); +test(/\\\//, "\\\\\\/"); +test(RegExp("/"), "\\/"); +test(RegExp("\/"), "\\/"); +test(RegExp("\\/"), "\\/"); +test(RegExp("\\\/"), "\\/"); +test(RegExp("\\\\/"), "\\\\\\/"); + +test(/[/]/, "[/]"); +test(/[\/]/, "[\\/]"); +test(/[\\/]/, "[\\\\/]"); +test(/[\\\/]/, "[\\\\\\/]"); +test(RegExp("[/]"), "[/]"); +test(RegExp("[\/]"), "[/]"); +test(RegExp("[\\/]"), "[\\/]"); +test(RegExp("[\\\/]"), "[\\/]"); +test(RegExp("[\\\\/]"), "[\\\\/]"); + +test(RegExp("\[/\]"), "[/]"); +test(RegExp("\[\\/\]"), "[\\/]"); + +test(/\[\/\]/, "\\[\\/\\]"); +test(/\[\\\/\]/, "\\[\\\\\\/\\]"); +test(RegExp("\\[/\\]"), "\\[\\/\\]"); +test(RegExp("\\[\/\\]"), "\\[\\/\\]"); +test(RegExp("\\[\\/\\]"), "\\[\\/\\]"); +test(RegExp("\\[\\\/\\]"), "\\[\\/\\]"); +test(RegExp("\\[\\\\/\\]"), "\\[\\\\\\/\\]"); + diff --git a/test/staging/sm/RegExp/exec-lastIndex-ToInteger.js b/test/staging/sm/RegExp/exec-lastIndex-ToInteger.js new file mode 100644 index 0000000000..6cc4cebf5b --- /dev/null +++ b/test/staging/sm/RegExp/exec-lastIndex-ToInteger.js @@ -0,0 +1,44 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-RegExp-shell.js, sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +/* + * Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/licenses/publicdomain/ + * + * Author: Geoffrey Sneddon + */ + +var BUGNUMBER = 646490; +var summary = + "RegExp.prototype.exec doesn't get the lastIndex and ToInteger() it for " + + "non-global regular expressions when it should"; + +print(BUGNUMBER + ": " + summary); + +/************** + * BEGIN TEST * + **************/ + +var re = /./, called = 0; +re.lastIndex = {valueOf: function() { called++; return 0; }}; +re.exec("."); +re.lastIndex = {toString: function() { called++; return "0"; }}; +re.exec("."); +re.lastIndex = { + valueOf: function() { called++; return 0; }, + toString: function() { called--; } +}; +re.exec("."); +assert.sameValue(called, 3, "FAIL, got " + called); + +/******************************************************************************/ + +print("All tests passed!"); diff --git a/test/staging/sm/RegExp/exec-lastIndex-negative.js b/test/staging/sm/RegExp/exec-lastIndex-negative.js new file mode 100644 index 0000000000..e3b4f9e301 --- /dev/null +++ b/test/staging/sm/RegExp/exec-lastIndex-negative.js @@ -0,0 +1,36 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-RegExp-shell.js, sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +var BUGNUMBER = 1207922; +var summary = "negative lastIndex should be treated as 0."; + +print(BUGNUMBER + ": " + summary); + +var pattern = /abc/gi; +var string = 'AbcaBcabC'; + +var indices = [ + -1, + -Math.pow(2,32), + -(Math.pow(2,32) + 1), + -Math.pow(2,32) * 2, + -Math.pow(2,40), + -Number.MAX_VALUE, +]; +for (var index of indices) { + pattern.lastIndex = index; + var result = pattern.exec(string); + assert.sameValue(result.index, 0); + assert.sameValue(result.length, 1); + assert.sameValue(result[0], "Abc"); + assert.sameValue(pattern.lastIndex, 3); +} + diff --git a/test/staging/sm/RegExp/exec.js b/test/staging/sm/RegExp/exec.js new file mode 100644 index 0000000000..6fdade5756 --- /dev/null +++ b/test/staging/sm/RegExp/exec.js @@ -0,0 +1,245 @@ +/* + * Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/licenses/publicdomain/ + */ + +/*--- +includes: [sm/non262-RegExp-shell.js, sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +var BUGNUMBER = 646490; +var summary = + "RegExp.prototype.exec doesn't get the lastIndex and ToInteger() it for " + + "non-global regular expressions when it should"; + +print(BUGNUMBER + ": " + summary); + +/************** + * BEGIN TEST * + **************/ + +function expectThrowTypeError(fun) +{ + try + { + var r = fun(); + throw new Error("didn't throw TypeError, returned " + r); + } + catch (e) + { + assert.sameValue(e instanceof TypeError, true, + "didn't throw TypeError, got: " + e); + } +} + +function checkExec(description, regex, args, obj) +{ + var lastIndex = obj.lastIndex; + var index = obj.index; + var input = obj.input; + var indexArray = obj.indexArray; + + var res = regex.exec.apply(regex, args); + + assert.sameValue(Array.isArray(res), true, description + ": not an array"); + assert.sameValue(regex.lastIndex, lastIndex, description + ": wrong lastIndex"); + assert.sameValue(res.index, index, description + ": wrong index"); + assert.sameValue(res.input, input, description + ": wrong input"); + assert.sameValue(res.length, indexArray.length, description + ": wrong length"); + for (var i = 0, sz = indexArray.length; i < sz; i++) + assert.sameValue(res[i], indexArray[i], description + " " + i + ": wrong index value"); +} + +var exec = RegExp.prototype.exec; +var r, res, called, obj; + +/* 1. Let R be this RegExp object. */ +expectThrowTypeError(function() { exec.call(null); }); +expectThrowTypeError(function() { exec.call(""); }); +expectThrowTypeError(function() { exec.call(5); }); +expectThrowTypeError(function() { exec.call({}); }); +expectThrowTypeError(function() { exec.call([]); }); +expectThrowTypeError(function() { exec.call(); }); +expectThrowTypeError(function() { exec.call(true); }); +expectThrowTypeError(function() { exec.call(Object.create(RegExp.prototype)); }); +expectThrowTypeError(function() { exec.call(Object.create(/a/)); }); + + +/* 2. Let S be the value of ToString(string). */ +called = false; +r = /a/; +assert.sameValue(r.lastIndex, 0); + +checkExec("/a/", r, [{ toString: function() { called = true; return 'ba'; } }], + { lastIndex: 0, + index: 1, + input: "ba", + indexArray: ["a"] }); +assert.sameValue(called, true); + +called = false; +try +{ + res = r.exec({ toString: null, valueOf: function() { called = true; throw 17; } }); + throw new Error("didn't throw"); +} +catch (e) +{ + assert.sameValue(e, 17); +} + +assert.sameValue(called, true); + +called = false; +obj = r.lastIndex = { valueOf: function() { assert.sameValue(true, false, "shouldn't have been called"); } }; +try +{ + res = r.exec({ toString: null, valueOf: function() { assert.sameValue(called, false); called = true; throw 17; } }); + throw new Error("didn't throw"); +} +catch (e) +{ + assert.sameValue(e, 17); +} + +assert.sameValue(called, true); +assert.sameValue(r.lastIndex, obj); + +// We don't test lack of an argument because of RegExp statics non-standard +// behaviors overriding what really should happen for lack of an argument, sigh. + + +/* + * 3. Let length be the length of S. + * 4. Let lastIndex be the result of calling the [[Get]] internal method of R with argument "lastIndex". + * 5. Let i be the value of ToInteger(lastIndex). + */ +r = /b/; +r.lastIndex = { valueOf: {}, toString: {} }; +expectThrowTypeError(function() { r.exec("foopy"); }); +r.lastIndex = { valueOf: function() { throw new TypeError(); } }; +expectThrowTypeError(function() { r.exec("foopy"); }); + + +/* + * 6. Let global be the result of calling the [[Get]] internal method of R with argument "global". + * 7. If global is false, then let i = 0. + */ +obj = { valueOf: function() { return 5; } }; +r = /abc/; +r.lastIndex = obj; + +checkExec("/abc/ take one", r, ["abc-------abc"], + { lastIndex: obj, + index: 0, + input: "abc-------abc", + indexArray: ["abc"] }); + +checkExec("/abc/ take two", r, ["abc-------abc"], + { lastIndex: obj, + index: 0, + input: "abc-------abc", + indexArray: ["abc"] }); + + +/* + * 8. Let matchSucceeded be false. + * 9. Repeat, while matchSucceeded is false + * a. If i < 0 or i > length, then + * i. Call the [[Put]] internal method of R with arguments "lastIndex", 0, and true. + * ii. Return null. + * b. Call the [[Match]] internal method of R with arguments S and i. + * c. If [[Match]] returned failure, then + * i. Let i = i+1. + * d. else + * i. Let r be the State result of the call to [[Match]]. + * ii. Set matchSucceeded to true. + * e. Let i = i+1. + */ +r = /abc()?/; +r.lastIndex = -5; +checkExec("/abc()?/ with lastIndex -5", r, ["abc-------abc"], + { lastIndex: -5, + index: 0, + input: "abc-------abc", + indexArray: ["abc", undefined] }); + + +r = /abc/; +r.lastIndex = -17; +res = r.exec("cdefg"); +assert.sameValue(res, null); +assert.sameValue(r.lastIndex, -17); + +r = /abc/g; +r.lastIndex = -42; +res = r.exec("cdefg"); +assert.sameValue(res, null); +assert.sameValue(r.lastIndex, 0); + + +/* + * 10. Let e be r's endIndex value. + * 11. If global is true, + * a. Call the [[Put]] internal method of R with arguments "lastIndex", e, and true. + */ +r = /abc/g; +r.lastIndex = 17; +assert.sameValue(r.exec("sdfs"), null); +assert.sameValue(r.lastIndex, 0); + +r = /abc/g; +r.lastIndex = 2; +checkExec("/abc/g", r, ["00abc"], + { lastIndex: 5, + index: 2, + input: "00abc", + indexArray: ["abc"] }); + + + +r = /a(b)c/g; +r.lastIndex = 2; +checkExec("/a(b)c/g take two", r, ["00abcd"], + { lastIndex: 5, + index: 2, + input: "00abcd", + indexArray: ["abc", "b"] }); + + +/* + * 12. Let n be the length of r's captures array. (This is the same value as + * 15.10.2.1's NCapturingParens.) + * 13. Let A be a new array created as if by the expression new Array() where + * Array is the standard built-in constructor with that name. + * 14. Let matchIndex be the position of the matched substring within the + * complete String S. + * 15. Call the [[DefineOwnProperty]] internal method of A with arguments + * "index", Property Descriptor {[[Value]]: matchIndex, [[Writable]: true, + * [[Enumerable]]: true, [[Configurable]]: true}, and true. + * 16. Call the [[DefineOwnProperty]] internal method of A with arguments + * "input", Property Descriptor {[[Value]]: S, [[Writable]: true, + * [[Enumerable]]: true, [[Configurable]]: true}, and true. + * 17. Call the [[DefineOwnProperty]] internal method of A with arguments + * "length", Property Descriptor {[[Value]]: n + 1}, and true. + * 18. Let matchedSubstr be the matched substring (i.e. the portion of S + * between offset i inclusive and offset e exclusive). + * 19. Call the [[DefineOwnProperty]] internal method of A with arguments "0", + * Property Descriptor {[[Value]]: matchedSubstr, [[Writable]: true, + * [[Enumerable]]: true, [[Configurable]]: true}, and true. + * 20. For each integer i such that I > 0 and I ≤ n + * a. Let captureI be i th element of r's captures array. + * b. Call the [[DefineOwnProperty]] internal method of A with arguments + * ToString(i), Property Descriptor {[[Value]]: captureI, [[Writable]: + * true, [[Enumerable]]: true, [[Configurable]]: true}, and true. + * 21. Return A. + */ +// throughout, above (and in other tests) + +/******************************************************************************/ + +print("All tests passed!"); diff --git a/test/staging/sm/RegExp/flag-accessors.js b/test/staging/sm/RegExp/flag-accessors.js new file mode 100644 index 0000000000..77259233c6 --- /dev/null +++ b/test/staging/sm/RegExp/flag-accessors.js @@ -0,0 +1,56 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-RegExp-shell.js, sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +var BUGNUMBER = 1120169; +var summary = "Implement RegExp.prototype.{global, ignoreCase, multiline, sticky, unicode}"; + +print(BUGNUMBER + ": " + summary); + +var props = [ + "global", + "ignoreCase", + "multiline", + "sticky", + "unicode", +]; + +for (var prop of props) { + assert.sameValue(RegExp.prototype[prop], undefined, + `expected undefined for ${prop} on prototype`); +} + +test(/foo/iymg, [true, true, true, true, false]); +test(RegExp(""), [false, false, false, false, false]); +test(RegExp("", "mygi"), [true, true, true, true, false]); +test(RegExp("", "mygiu"), [true, true, true, true, true]); + +testThrowsGeneric(); +testThrowsGeneric(1); +testThrowsGeneric(""); +testThrowsGeneric({}); +testThrowsGeneric(new Proxy({}, {get(){ return true; }})); + +function test(obj, expects) { + for (var i = 0; i < props.length; i++) { + assert.sameValue(obj[props[i]], expects[i]); + } +} + +function testThrowsGeneric(obj) { + for (var prop of props) { + assertThrowsInstanceOf(() => genericGet(obj, prop), TypeError); + } +} + +function genericGet(obj, prop) { + return Object.getOwnPropertyDescriptor(RegExp.prototype, prop).get.call(obj); +} + diff --git a/test/staging/sm/RegExp/flags-param-handling.js b/test/staging/sm/RegExp/flags-param-handling.js new file mode 100644 index 0000000000..dc20b548cb --- /dev/null +++ b/test/staging/sm/RegExp/flags-param-handling.js @@ -0,0 +1,27 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-RegExp-shell.js, sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +assert.sameValue(RegExp(/foo/my).flags, "my"); +assert.sameValue(RegExp(/foo/, "gi").flags, "gi"); +assert.sameValue(RegExp(/foo/my, "gi").flags, "gi"); +assert.sameValue(RegExp(/foo/my, "").flags, ""); +assert.sameValue(RegExp(/foo/my, undefined).flags, "my"); +assertThrowsInstanceOf(() => RegExp(/foo/my, null), SyntaxError); +assertThrowsInstanceOf(() => RegExp(/foo/my, "foo"), SyntaxError); + +assert.sameValue(/a/.compile("b", "gi").flags, "gi"); +assert.sameValue(/a/.compile(/b/my).flags, "my"); +assert.sameValue(/a/.compile(/b/my, undefined).flags, "my"); +assertThrowsInstanceOf(() => /a/.compile(/b/my, "gi"), TypeError); +assertThrowsInstanceOf(() => /a/.compile(/b/my, ""), TypeError); +assertThrowsInstanceOf(() => /a/.compile(/b/my, null), TypeError); +assertThrowsInstanceOf(() => /a/.compile(/b/my, "foo"), TypeError); + diff --git a/test/staging/sm/RegExp/flags.js b/test/staging/sm/RegExp/flags.js new file mode 100644 index 0000000000..d5ac99be9f --- /dev/null +++ b/test/staging/sm/RegExp/flags.js @@ -0,0 +1,35 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-RegExp-shell.js, sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +var BUGNUMBER = 1108467; +var summary = "Implement RegExp.prototype.flags"; + +print(BUGNUMBER + ": " + summary); + +assert.sameValue(RegExp.prototype.flags, ""); +assert.sameValue(/foo/iymg.flags, "gimy"); +assert.sameValue(RegExp("").flags, ""); +assert.sameValue(RegExp("", "mygi").flags, "gimy"); +assert.sameValue(RegExp("", "mygui").flags, "gimuy"); +assert.sameValue(genericFlags({}), ""); +assert.sameValue(genericFlags({ignoreCase: true}), "i"); +assert.sameValue(genericFlags({sticky:1, unicode:1, global: 0}), "uy"); +assert.sameValue(genericFlags({__proto__: {multiline: true}}), "m"); +assert.sameValue(genericFlags(new Proxy({}, {get(){return true}})), "dgimsuvy"); + +assertThrowsInstanceOf(() => genericFlags(), TypeError); +assertThrowsInstanceOf(() => genericFlags(1), TypeError); +assertThrowsInstanceOf(() => genericFlags(""), TypeError); + +function genericFlags(obj) { + return Object.getOwnPropertyDescriptor(RegExp.prototype,"flags").get.call(obj); +} + diff --git a/test/staging/sm/RegExp/getter-name.js b/test/staging/sm/RegExp/getter-name.js new file mode 100644 index 0000000000..8a48ef665e --- /dev/null +++ b/test/staging/sm/RegExp/getter-name.js @@ -0,0 +1,25 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-RegExp-shell.js, sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +var BUGNUMBER = 1180290; +var summary = 'RegExp getters should have get prefix'; + +print(BUGNUMBER + ": " + summary); + +assert.sameValue(Object.getOwnPropertyDescriptor(RegExp, Symbol.species).get.name, "get [Symbol.species]"); +assert.sameValue(Object.getOwnPropertyDescriptor(RegExp.prototype, "flags").get.name, "get flags"); +assert.sameValue(Object.getOwnPropertyDescriptor(RegExp.prototype, "global").get.name, "get global"); +assert.sameValue(Object.getOwnPropertyDescriptor(RegExp.prototype, "ignoreCase").get.name, "get ignoreCase"); +assert.sameValue(Object.getOwnPropertyDescriptor(RegExp.prototype, "multiline").get.name, "get multiline"); +assert.sameValue(Object.getOwnPropertyDescriptor(RegExp.prototype, "source").get.name, "get source"); +assert.sameValue(Object.getOwnPropertyDescriptor(RegExp.prototype, "sticky").get.name, "get sticky"); +assert.sameValue(Object.getOwnPropertyDescriptor(RegExp.prototype, "unicode").get.name, "get unicode"); + diff --git a/test/staging/sm/RegExp/ignoreCase-multiple.js b/test/staging/sm/RegExp/ignoreCase-multiple.js new file mode 100644 index 0000000000..206c49e6a4 --- /dev/null +++ b/test/staging/sm/RegExp/ignoreCase-multiple.js @@ -0,0 +1,80 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-RegExp-shell.js, sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +var BUGNUMBER = 1280046; +var summary = "ignoreCase match should perform Canonicalize both on input and pattern."; + +print(BUGNUMBER + ": " + summary); + +// Each element [code1, upper, code2] satisfies the following condition: +// ToUpperCase(code1) == upper +// ToUpperCase(code2) == upper +var pairs = + [ + // U+00B5: MICRO SIGN + // U+039C: GREEK CAPITAL LETTER MU + // U+03BC: GREEK SMALL LETTER MU + ["\u00B5", "\u039C", "\u03BC"], + // U+0345: COMBINING GREEK YPOGEGRAMMENI + // U+0399: GREEK CAPITAL LETTER IOTA + // U+03B9: GREEK SMALL LETTER IOTA + ["\u0345", "\u0399", "\u03B9"], + // U+03C2: GREEK SMALL LETTER FINAL SIGMA + // U+03A3: GREEK CAPITAL LETTER SIGMA + // U+03C3: GREEK SMALL LETTER SIGMA + ["\u03C2", "\u03A3", "\u03C3"], + // U+03D0: GREEK BETA SYMBOL + // U+0392: GREEK CAPITAL LETTER BETA + // U+03B2: GREEK SMALL LETTER BETA + ["\u03D0", "\u0392", "\u03B2"], + // U+03D1: GREEK THETA SYMBOL + // U+0398: GREEK CAPITAL LETTER THETA + // U+03B8: GREEK SMALL LETTER THETA + ["\u03D1", "\u0398", "\u03B8"], + // U+03D5: GREEK PHI SYMBOL + // U+03A6: GREEK CAPITAL LETTER PHI + // U+03C6: GREEK SMALL LETTER PHI + ["\u03D5", "\u03A6", "\u03C6"], + // U+03D6: GREEK PI SYMBOL + // U+03A0: GREEK CAPITAL LETTER PI + // U+03C0: GREEK SMALL LETTER PI + ["\u03D6", "\u03A0", "\u03C0"], + // U+03F0: GREEK KAPPA SYMBOL + // U+039A: GREEK CAPITAL LETTER KAPPA + // U+03BA: GREEK SMALL LETTER KAPPA + ["\u03F0", "\u039A", "\u03BA"], + // U+03F1: GREEK RHO SYMBOL + // U+03A1: GREEK CAPITAL LETTER RHO + // U+03C1: GREEK SMALL LETTER RHO + ["\u03F1", "\u03A1", "\u03C1"], + // U+03F5: GREEK LUNATE EPSILON SYMBOL + // U+0395: GREEK CAPITAL LETTER EPSILON + // U+03B5: GREEK SMALL LETTER EPSILON + ["\u03F5", "\u0395", "\u03B5"], + // U+1E9B: LATIN SMALL LETTER LONG S WITH DOT ABOVE + // U+1E60: LATIN CAPITAL LETTER S WITH DOT ABOVE + // U+1E61: LATIN SMALL LETTER S WITH DOT ABOVE + ["\u1E9B", "\u1E60", "\u1E61"], + // U+1FBE: GREEK PROSGEGRAMMENI + // U+0399: GREEK CAPITAL LETTER IOTA + // U+03B9: GREEK SMALL LETTER IOTA + ["\u1FBE", "\u0399", "\u03B9"], + ]; + +for (var [code1, upper, code2] of pairs) { + assert.sameValue(new RegExp(code1, "i").test(code2), true); + assert.sameValue(new RegExp(code1, "i").test(upper), true); + assert.sameValue(new RegExp(upper, "i").test(code1), true); + assert.sameValue(new RegExp(upper, "i").test(code2), true); + assert.sameValue(new RegExp(code2, "i").test(code1), true); + assert.sameValue(new RegExp(code2, "i").test(upper), true); +} + diff --git a/test/staging/sm/RegExp/ignoreCase-non-latin1-to-latin1.js b/test/staging/sm/RegExp/ignoreCase-non-latin1-to-latin1.js new file mode 100644 index 0000000000..d341dc9bdd --- /dev/null +++ b/test/staging/sm/RegExp/ignoreCase-non-latin1-to-latin1.js @@ -0,0 +1,128 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-RegExp-shell.js, sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ + +var BUGNUMBER = 1338779; +var summary = "Non-Latin1 to Latin1 mapping in ignoreCase."; + +assert.sameValue(/(\u039C)/.test("\xB5"), false); +assert.sameValue(/(\u039C)+/.test("\xB5"), false); +assert.sameValue(/(\u039C)/i.test("\xB5"), true); +assert.sameValue(/(\u039C)+/i.test("\xB5"), true); +assert.sameValue(/(\u039C)/u.test("\xB5"), false); +assert.sameValue(/(\u039C)+/u.test("\xB5"), false); +assert.sameValue(/(\u039C)/ui.test("\xB5"), true); +assert.sameValue(/(\u039C)+/ui.test("\xB5"), true); + +assert.sameValue(/(\xB5)/.test("\u039C"), false); +assert.sameValue(/(\xB5)+/.test("\u039C"), false); +assert.sameValue(/(\xB5)/i.test("\u039C"), true); +assert.sameValue(/(\xB5)+/i.test("\u039C"), true); +assert.sameValue(/(\xB5)/u.test("\u039C"), false); +assert.sameValue(/(\xB5)+/u.test("\u039C"), false); +assert.sameValue(/(\xB5)/ui.test("\u039C"), true); +assert.sameValue(/(\xB5)+/ui.test("\u039C"), true); + + +assert.sameValue(/(\u0178)/.test("\xFF"), false); +assert.sameValue(/(\u0178)+/.test("\xFF"), false); +assert.sameValue(/(\u0178)/i.test("\xFF"), true); +assert.sameValue(/(\u0178)+/i.test("\xFF"), true); +assert.sameValue(/(\u0178)/u.test("\xFF"), false); +assert.sameValue(/(\u0178)+/u.test("\xFF"), false); +assert.sameValue(/(\u0178)/ui.test("\xFF"), true); +assert.sameValue(/(\u0178)+/ui.test("\xFF"), true); + +assert.sameValue(/(\xFF)/.test("\u0178"), false); +assert.sameValue(/(\xFF)+/.test("\u0178"), false); +assert.sameValue(/(\xFF)/i.test("\u0178"), true); +assert.sameValue(/(\xFF)+/i.test("\u0178"), true); +assert.sameValue(/(\xFF)/u.test("\u0178"), false); +assert.sameValue(/(\xFF)+/u.test("\u0178"), false); +assert.sameValue(/(\xFF)/ui.test("\u0178"), true); +assert.sameValue(/(\xFF)+/ui.test("\u0178"), true); + + +assert.sameValue(/(\u017F)/.test("\x73"), false); +assert.sameValue(/(\u017F)+/.test("\x73"), false); +assert.sameValue(/(\u017F)/i.test("\x73"), false); +assert.sameValue(/(\u017F)+/i.test("\x73"), false); +assert.sameValue(/(\u017F)/u.test("\x73"), false); +assert.sameValue(/(\u017F)+/u.test("\x73"), false); +assert.sameValue(/(\u017F)/iu.test("\x73"), true); +assert.sameValue(/(\u017F)+/iu.test("\x73"), true); + +assert.sameValue(/(\x73)/.test("\u017F"), false); +assert.sameValue(/(\x73)+/.test("\u017F"), false); +assert.sameValue(/(\x73)/i.test("\u017F"), false); +assert.sameValue(/(\x73)+/i.test("\u017F"), false); +assert.sameValue(/(\x73)/u.test("\u017F"), false); +assert.sameValue(/(\x73)+/u.test("\u017F"), false); +assert.sameValue(/(\x73)/iu.test("\u017F"), true); +assert.sameValue(/(\x73)+/iu.test("\u017F"), true); + + +assert.sameValue(/(\u1E9E)/.test("\xDF"), false); +assert.sameValue(/(\u1E9E)+/.test("\xDF"), false); +assert.sameValue(/(\u1E9E)/i.test("\xDF"), false); +assert.sameValue(/(\u1E9E)+/i.test("\xDF"), false); +assert.sameValue(/(\u1E9E)/u.test("\xDF"), false); +assert.sameValue(/(\u1E9E)+/u.test("\xDF"), false); +assert.sameValue(/(\u1E9E)/iu.test("\xDF"), true); +assert.sameValue(/(\u1E9E)+/iu.test("\xDF"), true); + +assert.sameValue(/(\xDF)/.test("\u1E9E"), false); +assert.sameValue(/(\xDF)+/.test("\u1E9E"), false); +assert.sameValue(/(\xDF)/i.test("\u1E9E"), false); +assert.sameValue(/(\xDF)+/i.test("\u1E9E"), false); +assert.sameValue(/(\xDF)/u.test("\u1E9E"), false); +assert.sameValue(/(\xDF)+/u.test("\u1E9E"), false); +assert.sameValue(/(\xDF)/iu.test("\u1E9E"), true); +assert.sameValue(/(\xDF)+/iu.test("\u1E9E"), true); + + +assert.sameValue(/(\u212A)/.test("\x6B"), false); +assert.sameValue(/(\u212A)+/.test("\x6B"), false); +assert.sameValue(/(\u212A)/i.test("\x6B"), false); +assert.sameValue(/(\u212A)+/i.test("\x6B"), false); +assert.sameValue(/(\u212A)/u.test("\x6B"), false); +assert.sameValue(/(\u212A)+/u.test("\x6B"), false); +assert.sameValue(/(\u212A)/iu.test("\x6B"), true); +assert.sameValue(/(\u212A)+/iu.test("\x6B"), true); + +assert.sameValue(/(\x6B)/.test("\u212A"), false); +assert.sameValue(/(\x6B)+/.test("\u212A"), false); +assert.sameValue(/(\x6B)/i.test("\u212A"), false); +assert.sameValue(/(\x6B)+/i.test("\u212A"), false); +assert.sameValue(/(\x6B)/u.test("\u212A"), false); +assert.sameValue(/(\x6B)+/u.test("\u212A"), false); +assert.sameValue(/(\x6B)/iu.test("\u212A"), true); +assert.sameValue(/(\x6B)+/iu.test("\u212A"), true); + + +assert.sameValue(/(\u212B)/.test("\xE5"), false); +assert.sameValue(/(\u212B)+/.test("\xE5"), false); +assert.sameValue(/(\u212B)/i.test("\xE5"), false); +assert.sameValue(/(\u212B)+/i.test("\xE5"), false); +assert.sameValue(/(\u212B)/u.test("\xE5"), false); +assert.sameValue(/(\u212B)+/u.test("\xE5"), false); +assert.sameValue(/(\u212B)/iu.test("\xE5"), true); +assert.sameValue(/(\u212B)+/iu.test("\xE5"), true); + +assert.sameValue(/(\xE5)/.test("\u212B"), false); +assert.sameValue(/(\xE5)+/.test("\u212B"), false); +assert.sameValue(/(\xE5)/i.test("\u212B"), false); +assert.sameValue(/(\xE5)+/i.test("\u212B"), false); +assert.sameValue(/(\xE5)/u.test("\u212B"), false); +assert.sameValue(/(\xE5)+/u.test("\u212B"), false); +assert.sameValue(/(\xE5)/iu.test("\u212B"), true); +assert.sameValue(/(\xE5)+/iu.test("\u212B"), true); + diff --git a/test/staging/sm/RegExp/instance-property-storage-introspection.js b/test/staging/sm/RegExp/instance-property-storage-introspection.js new file mode 100644 index 0000000000..6491d460ac --- /dev/null +++ b/test/staging/sm/RegExp/instance-property-storage-introspection.js @@ -0,0 +1,133 @@ +/* + * Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/licenses/publicdomain/ + */ + +/*--- +includes: [sm/non262-RegExp-shell.js, sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +var BUGNUMBER = 640072; +var summary = + "Represent /a/.{lastIndex,global,source,multiline,sticky,ignoreCase} with " + + "plain old data properties"; + +print(BUGNUMBER + ": " + summary); + +/************** + * BEGIN TEST * + **************/ + +function checkDataProperty(obj, p, expect, msg) +{ + var d = Object.getOwnPropertyDescriptor(obj, p); + + assert.sameValue(d.value, expect.value, msg + ": bad value for " + p); + assert.sameValue(d.writable, expect.writable, msg + ": bad writable for " + p); + assert.sameValue(d.enumerable, expect.enumerable, msg + ": bad enumerable for " + p); + assert.sameValue(d.configurable, expect.configurable, msg + ": bad configurable for " + p); + + // Try redefining the property using its initial values: these should all be + // silent no-ops. + Object.defineProperty(obj, p, { value: expect.value }); + Object.defineProperty(obj, p, { writable: expect.writable }); + Object.defineProperty(obj, p, { enumerable: expect.enumerable }); + Object.defineProperty(obj, p, { configurable: expect.configurable }); + + var d2 = Object.getOwnPropertyDescriptor(obj, p); + assert.sameValue(d.value, d2.value, msg + ": value changed on redefinition of " + p + "?"); + assert.sameValue(d.writable, d2.writable, msg + ": writable changed on redefinition of " + p + "?"); + assert.sameValue(d.enumerable, d2.enumerable, msg + ": enumerable changed on redefinition of " + p + "?"); + assert.sameValue(d.configurable, d2.configurable, msg + ": configurable changed on redefinition of " + p + "?"); +} + + +// Check a bunch of "empty" regular expressions first. + +var choices = [{ msg: "new RegExp()", + get: function() { return new RegExp(); } }, + { msg: "/(?:)/", + get: Function("return /(?:)/;") }]; + +function checkRegExp(r, msg, lastIndex) +{ + var expect; + + expect = { value: lastIndex, enumerable: false, configurable: false, writable: true }; + checkDataProperty(r, "lastIndex", expect, msg); +} + +checkRegExp(new RegExp(), "new RegExp()", 0); +checkRegExp(/(?:)/, "/(?:)/", 0); +checkRegExp(Function("return /(?:)/;")(), 'Function("return /(?:)/;")()', 0); + +for (var i = 0; i < choices.length; i++) +{ + var choice = choices[i]; + var msg = choice.msg; + var r = choice.get(); + + checkRegExp(r, msg, 0); +} + +// Now test less generic regular expressions + +checkRegExp(/a/gim, "/a/gim", 0); + +var r; + +do +{ + r = /abcd/mg; + checkRegExp(r, "/abcd/mg initially", 0); + r.exec("abcdefg"); + checkRegExp(r, "/abcd/mg step 1", 4); + r.exec("abcdabcd"); + checkRegExp(r, "/abcd/mg step 2", 8); + r.exec("abcdabcd"); + checkRegExp(r, "/abcd/mg end", 0); + + r = /cde/ig; + checkRegExp(r, "/cde/ig initially", 0); + var obj = r.lastIndex = { valueOf: function() { return 2; } }; + checkRegExp(r, "/cde/ig after lastIndex", obj); + r.exec("aaacdef"); + checkRegExp(r, "/cde/ig after exec", 6); + Object.defineProperty(r, "lastIndex", { value: 3 }); + checkRegExp(r, "/cde/ig after define 3", 3); + Object.defineProperty(r, "lastIndex", { value: obj }); + checkRegExp(r, "/cde/ig after lastIndex", obj); + + + // Tricky bits of testing: make sure that redefining lastIndex doesn't change + // the slot where the lastIndex property is initially stored, even if + // the redefinition also changes writability. + r = /a/g; + checkRegExp(r, "/a/g initially", 0); + Object.defineProperty(r, "lastIndex", { value: 2 }); + r.exec("aabbbba"); + checkRegExp(r, "/a/g after first exec", 7); + assert.sameValue(r.lastIndex, 7); + r.lastIndex = 2; + checkRegExp(r, "/a/g after assign", 2); + r.exec("aabbbba"); + assert.sameValue(r.lastIndex, 7); // check in reverse order + checkRegExp(r, "/a/g after second exec", 7); + + r = /c/g; + r.lastIndex = 2; + checkRegExp(r, "/c/g initially", 2); + Object.defineProperty(r, "lastIndex", { writable: false }); + assert.sameValue(Object.getOwnPropertyDescriptor(r, "lastIndex").writable, false); + try { r.exec("aabbbba"); } catch (e) { /* swallow error if thrown */ } + assert.sameValue(Object.getOwnPropertyDescriptor(r, "lastIndex").writable, false); +} +while (Math.random() > 17); // fake loop to discourage RegExp object caching + +/******************************************************************************/ + +print("All tests passed!"); diff --git a/test/staging/sm/RegExp/lastIndex-exec.js b/test/staging/sm/RegExp/lastIndex-exec.js new file mode 100644 index 0000000000..2903e16a4f --- /dev/null +++ b/test/staging/sm/RegExp/lastIndex-exec.js @@ -0,0 +1,89 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-RegExp-shell.js, sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +// RegExp.prototype.exec: Test lastIndex changes for ES2017. + +// Test various combinations of: +// - Pattern matches or doesn't match +// - Global and/or sticky flag is set. +// - lastIndex exceeds the input string length +// - lastIndex is +-0 +const testCases = [ + { regExp: /a/, lastIndex: 0, input: "a", result: 0 }, + { regExp: /a/g, lastIndex: 0, input: "a", result: 1 }, + { regExp: /a/y, lastIndex: 0, input: "a", result: 1 }, + + { regExp: /a/, lastIndex: 0, input: "b", result: 0 }, + { regExp: /a/g, lastIndex: 0, input: "b", result: 0 }, + { regExp: /a/y, lastIndex: 0, input: "b", result: 0 }, + + { regExp: /a/, lastIndex: -0, input: "a", result: -0 }, + { regExp: /a/g, lastIndex: -0, input: "a", result: 1 }, + { regExp: /a/y, lastIndex: -0, input: "a", result: 1 }, + + { regExp: /a/, lastIndex: -0, input: "b", result: -0 }, + { regExp: /a/g, lastIndex: -0, input: "b", result: 0 }, + { regExp: /a/y, lastIndex: -0, input: "b", result: 0 }, + + { regExp: /a/, lastIndex: -1, input: "a", result: -1 }, + { regExp: /a/g, lastIndex: -1, input: "a", result: 1 }, + { regExp: /a/y, lastIndex: -1, input: "a", result: 1 }, + + { regExp: /a/, lastIndex: -1, input: "b", result: -1 }, + { regExp: /a/g, lastIndex: -1, input: "b", result: 0 }, + { regExp: /a/y, lastIndex: -1, input: "b", result: 0 }, + + { regExp: /a/, lastIndex: 100, input: "a", result: 100 }, + { regExp: /a/g, lastIndex: 100, input: "a", result: 0 }, + { regExp: /a/y, lastIndex: 100, input: "a", result: 0 }, +]; + +// Basic test. +for (let {regExp, lastIndex, input, result} of testCases) { + let re = new RegExp(regExp); + re.lastIndex = lastIndex; + re.exec(input); + assert.sameValue(re.lastIndex, result); +} + +// Test when lastIndex is non-writable. +for (let {regExp, lastIndex, input} of testCases) { + let re = new RegExp(regExp); + Object.defineProperty(re, "lastIndex", { value: lastIndex, writable: false }); + if (re.global || re.sticky) { + assertThrowsInstanceOf(() => re.exec(input), TypeError); + } else { + re.exec(input); + } + assert.sameValue(re.lastIndex, lastIndex); +} + +// Test when lastIndex is changed to non-writable as a side-effect. +for (let {regExp, lastIndex, input} of testCases) { + let re = new RegExp(regExp); + let called = false; + re.lastIndex = { + valueOf() { + assert.sameValue(called, false); + called = true; + Object.defineProperty(re, "lastIndex", { value: 9000, writable: false }); + return lastIndex; + } + }; + if (re.global || re.sticky) { + assertThrowsInstanceOf(() => re.exec(input), TypeError); + } else { + re.exec(input); + } + assert.sameValue(re.lastIndex, 9000); + assert.sameValue(called, true); +} + diff --git a/test/staging/sm/RegExp/lastIndex-match-or-replace.js b/test/staging/sm/RegExp/lastIndex-match-or-replace.js new file mode 100644 index 0000000000..460a755abf --- /dev/null +++ b/test/staging/sm/RegExp/lastIndex-match-or-replace.js @@ -0,0 +1,132 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-RegExp-shell.js, sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +// RegExp.prototype[Symbol.match, Symbol.replace]: Test lastIndex changes for ES2017. + +// RegExp-like class to test the RegExp method slow paths. +class DuckRegExp extends RegExp { + constructor(pattern, flags) { + return Object.create(DuckRegExp.prototype, { + regExp: { + value: new RegExp(pattern, flags) + }, + lastIndex: { + value: 0, writable: true, enumerable: false, configurable: false + } + }); + } + + exec(...args) { + this.regExp.lastIndex = this.lastIndex; + try { + return this.regExp.exec(...args); + } finally { + if (this.global || this.sticky) + this.lastIndex = this.regExp.lastIndex; + } + } + + get source() { return this.regExp.source; } + + get flags() { return this.regExp.flags; } + get global() { return this.regExp.global; } + get ignoreCase() { return this.regExp.ignoreCase; } + get multiline() { return this.regExp.multiline; } + get sticky() { return this.regExp.sticky; } + get unicode() { return this.regExp.unicode; } +} + +// Test various combinations of: +// - Pattern matches or doesn't match +// - Global and/or sticky flag is set. +// - lastIndex exceeds the input string length +// - lastIndex is +-0 +const testCases = [ + { regExp: /a/, lastIndex: 0, input: "a", result: 0 }, + { regExp: /a/g, lastIndex: 0, input: "a", result: 0 }, + { regExp: /a/y, lastIndex: 0, input: "a", result: 1 }, + + { regExp: /a/, lastIndex: 0, input: "b", result: 0 }, + { regExp: /a/g, lastIndex: 0, input: "b", result: 0 }, + { regExp: /a/y, lastIndex: 0, input: "b", result: 0 }, + + { regExp: /a/, lastIndex: -0, input: "a", result: -0 }, + { regExp: /a/g, lastIndex: -0, input: "a", result: 0 }, + { regExp: /a/y, lastIndex: -0, input: "a", result: 1 }, + + { regExp: /a/, lastIndex: -0, input: "b", result: -0 }, + { regExp: /a/g, lastIndex: -0, input: "b", result: 0 }, + { regExp: /a/y, lastIndex: -0, input: "b", result: 0 }, + + { regExp: /a/, lastIndex: -1, input: "a", result: -1 }, + { regExp: /a/g, lastIndex: -1, input: "a", result: 0 }, + { regExp: /a/y, lastIndex: -1, input: "a", result: 1 }, + + { regExp: /a/, lastIndex: -1, input: "b", result: -1 }, + { regExp: /a/g, lastIndex: -1, input: "b", result: 0 }, + { regExp: /a/y, lastIndex: -1, input: "b", result: 0 }, + + { regExp: /a/, lastIndex: 100, input: "a", result: 100 }, + { regExp: /a/g, lastIndex: 100, input: "a", result: 0 }, + { regExp: /a/y, lastIndex: 100, input: "a", result: 0 }, +]; + +for (let method of [RegExp.prototype[Symbol.match], RegExp.prototype[Symbol.replace]]) { + for (let Constructor of [RegExp, DuckRegExp]) { + // Basic test. + for (let {regExp, lastIndex, input, result} of testCases) { + let re = new Constructor(regExp); + re.lastIndex = lastIndex; + Reflect.apply(method, re, [input]); + assert.sameValue(re.lastIndex, result); + } + + // Test when lastIndex is non-writable. + for (let {regExp, lastIndex, input} of testCases) { + let re = new Constructor(regExp); + Object.defineProperty(re, "lastIndex", { value: lastIndex, writable: false }); + if (re.global || re.sticky) { + assertThrowsInstanceOf(() => Reflect.apply(method, re, [input]), TypeError); + } else { + Reflect.apply(method, re, [input]); + } + assert.sameValue(re.lastIndex, lastIndex); + } + + // Test when lastIndex is changed to non-writable as a side-effect. + for (let {regExp, lastIndex, input, result} of testCases) { + let re = new Constructor(regExp); + let called = false; + re.lastIndex = { + valueOf() { + assert.sameValue(called, false); + called = true; + Object.defineProperty(re, "lastIndex", { value: 9000, writable: false }); + return lastIndex; + } + }; + if (re.sticky) { + assertThrowsInstanceOf(() => Reflect.apply(method, re, [input]), TypeError); + assert.sameValue(called, true); + assert.sameValue(re.lastIndex, 9000); + } else if (re.global) { + Reflect.apply(method, re, [input]); + assert.sameValue(called, false); + assert.sameValue(re.lastIndex, result); + } else { + Reflect.apply(method, re, [input]); + assert.sameValue(called, true); + assert.sameValue(re.lastIndex, 9000); + } + } + } +} + diff --git a/test/staging/sm/RegExp/lastIndex-nonwritable.js b/test/staging/sm/RegExp/lastIndex-nonwritable.js new file mode 100644 index 0000000000..93a75b18c3 --- /dev/null +++ b/test/staging/sm/RegExp/lastIndex-nonwritable.js @@ -0,0 +1,36 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-RegExp-shell.js, sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +var BUGNUMBER = 1168416; +var summary = "Regexp.prototype.test/exec shouldn't change lastIndex if not writable."; + +print(BUGNUMBER + ": " + summary); + +var regex = /0/g; +Object.freeze(regex); +var str = "abc000"; + +var desc = Object.getOwnPropertyDescriptor(regex, "lastIndex"); +assert.sameValue(desc.writable, false); +assert.sameValue(desc.value, 0); + +assertThrowsInstanceOf(() => regex.test(str), TypeError); + +desc = Object.getOwnPropertyDescriptor(regex, "lastIndex"); +assert.sameValue(desc.writable, false); +assert.sameValue(desc.value, 0); + +assertThrowsInstanceOf(() => regex.exec(str), TypeError); + +desc = Object.getOwnPropertyDescriptor(regex, "lastIndex"); +assert.sameValue(desc.writable, false); +assert.sameValue(desc.value, 0); + diff --git a/test/staging/sm/RegExp/lastIndex-search.js b/test/staging/sm/RegExp/lastIndex-search.js new file mode 100644 index 0000000000..6904c06327 --- /dev/null +++ b/test/staging/sm/RegExp/lastIndex-search.js @@ -0,0 +1,127 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-RegExp-shell.js, sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +// RegExp.prototype[Symbol.search]: Test lastIndex changes for ES2017. + +// RegExp-like class to test the RegExp method slow paths. +class DuckRegExp extends RegExp { + constructor(pattern, flags) { + return Object.create(DuckRegExp.prototype, { + regExp: { + value: new RegExp(pattern, flags) + }, + lastIndex: { + value: 0, writable: true, enumerable: false, configurable: false + } + }); + } + + exec(...args) { + this.regExp.lastIndex = this.lastIndex; + try { + return this.regExp.exec(...args); + } finally { + if (this.global || this.sticky) + this.lastIndex = this.regExp.lastIndex; + } + } + + get source() { return this.regExp.source; } + + get global() { return this.regExp.global; } + get ignoreCase() { return this.regExp.ignoreCase; } + get multiline() { return this.regExp.multiline; } + get sticky() { return this.regExp.sticky; } + get unicode() { return this.regExp.unicode; } +} + +// Test various combinations of: +// - Pattern matches or doesn't match +// - Global and/or sticky flag is set. +// - lastIndex exceeds the input string length +// - lastIndex is +-0 +const testCasesNotPositiveZero = [ + { regExp: /a/, lastIndex: -1, input: "a" }, + { regExp: /a/g, lastIndex: -1, input: "a" }, + { regExp: /a/y, lastIndex: -1, input: "a" }, + + { regExp: /a/, lastIndex: 100, input: "a" }, + { regExp: /a/g, lastIndex: 100, input: "a" }, + { regExp: /a/y, lastIndex: 100, input: "a" }, + + { regExp: /a/, lastIndex: -1, input: "b" }, + { regExp: /a/g, lastIndex: -1, input: "b" }, + { regExp: /a/y, lastIndex: -1, input: "b" }, + + { regExp: /a/, lastIndex: -0, input: "a" }, + { regExp: /a/g, lastIndex: -0, input: "a" }, + { regExp: /a/y, lastIndex: -0, input: "a" }, + + { regExp: /a/, lastIndex: -0, input: "b" }, + { regExp: /a/g, lastIndex: -0, input: "b" }, + { regExp: /a/y, lastIndex: -0, input: "b" }, +]; + +const testCasesPositiveZero = [ + { regExp: /a/, lastIndex: 0, input: "a" }, + { regExp: /a/g, lastIndex: 0, input: "a" }, + { regExp: /a/y, lastIndex: 0, input: "a" }, + + { regExp: /a/, lastIndex: 0, input: "b" }, + { regExp: /a/g, lastIndex: 0, input: "b" }, + { regExp: /a/y, lastIndex: 0, input: "b" }, +]; + +const testCases = [...testCasesNotPositiveZero, ...testCasesPositiveZero]; + +for (let Constructor of [RegExp, DuckRegExp]) { + // Basic test. + for (let {regExp, lastIndex, input} of testCases) { + let re = new Constructor(regExp); + re.lastIndex = lastIndex; + re[Symbol.search](input); + assert.sameValue(re.lastIndex, lastIndex); + } + + // Test when lastIndex is non-writable and not positive zero. + for (let {regExp, lastIndex, input} of testCasesNotPositiveZero) { + let re = new Constructor(regExp); + Object.defineProperty(re, "lastIndex", { value: lastIndex, writable: false }); + assertThrowsInstanceOf(() => re[Symbol.search](input), TypeError); + assert.sameValue(re.lastIndex, lastIndex); + } + + // Test when lastIndex is non-writable and positive zero. + for (let {regExp, lastIndex, input} of testCasesPositiveZero) { + let re = new Constructor(regExp); + Object.defineProperty(re, "lastIndex", { value: lastIndex, writable: false }); + if (re.global || re.sticky) { + assertThrowsInstanceOf(() => re[Symbol.search](input), TypeError); + } else { + re[Symbol.search](input); + } + assert.sameValue(re.lastIndex, lastIndex); + } + + // Test lastIndex isn't converted to a number. + for (let {regExp, lastIndex, input} of testCases) { + let re = new RegExp(regExp); + let badIndex = { + valueOf() { + assert.sameValue(false, true); + } + }; + re.lastIndex = badIndex; + re[Symbol.search](input); + assert.sameValue(re.lastIndex, badIndex); + } +} + diff --git a/test/staging/sm/RegExp/match-local-tolength-recompilation.js b/test/staging/sm/RegExp/match-local-tolength-recompilation.js new file mode 100644 index 0000000000..3bbd3cbe92 --- /dev/null +++ b/test/staging/sm/RegExp/match-local-tolength-recompilation.js @@ -0,0 +1,84 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-RegExp-shell.js, sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +// Side-effects when calling ToLength(regExp.lastIndex) in +// RegExp.prototype[@@match] for non-global RegExp can recompile the RegExp. + +for (var flag of ["", "y"]) { + var regExp = new RegExp("a", flag); + + regExp.lastIndex = { + valueOf() { + regExp.compile("b"); + return 0; + } + }; + + var result = regExp[Symbol.match]("b"); + assert.sameValue(result !== null, true); +} + +// Recompilation modifies flag: +// Case 1: Adds global flag, validate by checking lastIndex. +var regExp = new RegExp("a", ""); +regExp.lastIndex = { + valueOf() { + // |regExp| is now in global mode, RegExpBuiltinExec should update the + // lastIndex property to reflect last match. + regExp.compile("a", "g"); + return 0; + } +}; +regExp[Symbol.match]("a"); +assert.sameValue(regExp.lastIndex, 1); + +// Case 2: Removes sticky flag with match, validate by checking lastIndex. +var regExp = new RegExp("a", "y"); +regExp.lastIndex = { + valueOf() { + // |regExp| is no longer sticky, RegExpBuiltinExec shouldn't modify the + // lastIndex property. + regExp.compile("a", ""); + regExp.lastIndex = 9000; + return 0; + } +}; +regExp[Symbol.match]("a"); +assert.sameValue(regExp.lastIndex, 9000); + +// Case 3.a: Removes sticky flag without match, validate by checking lastIndex. +var regExp = new RegExp("a", "y"); +regExp.lastIndex = { + valueOf() { + // |regExp| is no longer sticky, RegExpBuiltinExec shouldn't modify the + // lastIndex property. + regExp.compile("b", ""); + regExp.lastIndex = 9001; + return 0; + } +}; +regExp[Symbol.match]("a"); +assert.sameValue(regExp.lastIndex, 9001); + +// Case 3.b: Removes sticky flag without match, validate by checking lastIndex. +var regExp = new RegExp("a", "y"); +regExp.lastIndex = { + valueOf() { + // |regExp| is no longer sticky, RegExpBuiltinExec shouldn't modify the + // lastIndex property. + regExp.compile("b", ""); + regExp.lastIndex = 9002; + return 10000; + } +}; +regExp[Symbol.match]("a"); +assert.sameValue(regExp.lastIndex, 9002); + diff --git a/test/staging/sm/RegExp/match-this.js b/test/staging/sm/RegExp/match-this.js new file mode 100644 index 0000000000..4f9067b797 --- /dev/null +++ b/test/staging/sm/RegExp/match-this.js @@ -0,0 +1,21 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-RegExp-shell.js, sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +var BUGNUMBER = 887016; +var summary = "RegExp.prototype[@@match] should check this value."; + +print(BUGNUMBER + ": " + summary); + +for (var v of [null, 1, true, undefined, "", Symbol.iterator]) { + assertThrowsInstanceOf(() => RegExp.prototype[Symbol.match].call(v), + TypeError); +} + diff --git a/test/staging/sm/RegExp/match-trace.js b/test/staging/sm/RegExp/match-trace.js new file mode 100644 index 0000000000..52a7521cdc --- /dev/null +++ b/test/staging/sm/RegExp/match-trace.js @@ -0,0 +1,159 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-RegExp-shell.js, sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +var BUGNUMBER = 887016; +var summary = "Trace RegExp.prototype[@@match] behavior."; + +print(BUGNUMBER + ": " + summary); + +var n; +var log; +var target; +var global; +var unicode; +var logProxy; + +var execResult; +var lastIndexResult; +var lastIndexExpected; + +function P(A) { + return new Proxy(A, { + get(that, name) { + if (logProxy) + log += "get:result[" + name + "],"; + return that[name]; + } + }); +} + +var myRegExp = { + get flags() { + log += "get:flags,"; + var flags = ""; + if (global) flags += "g"; + if (unicode) flags += "u"; + return flags; + }, + get global() { + // This getter should not be invoked, because we override the flags getter. + log += "get:global," + }, + get unicode() { + // This getter should not be invoked, because we override the flags getter. + log += "get:unicode," + }, + get lastIndex() { + log += "get:lastIndex,"; + return lastIndexResult[n]; + }, + set lastIndex(v) { + log += "set:lastIndex,"; + assert.sameValue(v, lastIndexExpected[n]); + }, + get exec() { + log += "get:exec,"; + return function(S) { + log += "call:exec,"; + assert.sameValue(S, target); + return execResult[n++]; + }; + }, +}; + +function reset() { + n = 0; + log = ""; + target = "abcAbcABC"; + global = true; + unicode = false; + logProxy = true; +} + +// Trace global with non-empty match. +reset(); +execResult = [ P(["abc"]), P(["ABC"]), null ]; +lastIndexResult = [ , , , ]; +lastIndexExpected = [ 0, , , ]; +var ret = RegExp.prototype[Symbol.match].call(myRegExp, target); +assert.sameValue(JSON.stringify(ret), `["abc","ABC"]`); +assert.sameValue(log, + "get:flags," + + "set:lastIndex," + + "get:exec,call:exec,get:result[0]," + + "get:exec,call:exec,get:result[0]," + + "get:exec,call:exec,"); + +// Trace global with empty match. +reset(); +execResult = [ P([""]), P([""]), null ]; +lastIndexResult = [ , 4, 20, ]; +lastIndexExpected = [ 0, 5, 21, ]; +ret = RegExp.prototype[Symbol.match].call(myRegExp, target); +assert.sameValue(JSON.stringify(ret), `["",""]`); +assert.sameValue(log, + "get:flags," + + "set:lastIndex," + + "get:exec,call:exec,get:result[0],get:lastIndex,set:lastIndex," + + "get:exec,call:exec,get:result[0],get:lastIndex,set:lastIndex," + + "get:exec,call:exec,"); + +// Trace global and unicode with empty match. +// 1. not surrogate pair +// 2. lead surrogate pair +// 3. trail surrogate pair +// 4. lead surrogate pair without trail surrogate pair +// 5. index overflow +reset(); +unicode = true; +// 0123 4 5678 +target = "___\uD83D\uDC38___\uD83D"; +execResult = [ P([""]), P([""]), P([""]), P([""]), P([""]), null ]; +lastIndexResult = [ , 2, 3, 4, 8, 9, ]; +lastIndexExpected = [ 0, 3, 5, 5, 9, 10, ]; +ret = RegExp.prototype[Symbol.match].call(myRegExp, target); +assert.sameValue(JSON.stringify(ret), `["","","","",""]`); +assert.sameValue(log, + "get:flags," + + "set:lastIndex," + + "get:exec,call:exec,get:result[0],get:lastIndex,set:lastIndex," + + "get:exec,call:exec,get:result[0],get:lastIndex,set:lastIndex," + + "get:exec,call:exec,get:result[0],get:lastIndex,set:lastIndex," + + "get:exec,call:exec,get:result[0],get:lastIndex,set:lastIndex," + + "get:exec,call:exec,get:result[0],get:lastIndex,set:lastIndex," + + "get:exec,call:exec,"); + +// Trace global with no match. +reset(); +execResult = [ null ]; +lastIndexResult = [ , ]; +lastIndexExpected = [ 0, ]; +ret = RegExp.prototype[Symbol.match].call(myRegExp, target); +assert.sameValue(ret, null); +assert.sameValue(log, + "get:flags," + + "set:lastIndex," + + "get:exec,call:exec,"); + +// Trace non-global. +reset(); +global = false; +execResult = [ P(["abc"]) ]; +lastIndexResult = []; +lastIndexExpected = []; +ret = RegExp.prototype[Symbol.match].call(myRegExp, target); +// ret is the Proxy on non-global case, disable logging. +logProxy = false; +assert.sameValue(JSON.stringify(ret), `["abc"]`); +assert.sameValue(log, + "get:flags," + + "get:exec,call:exec,"); + diff --git a/test/staging/sm/RegExp/match.js b/test/staging/sm/RegExp/match.js new file mode 100644 index 0000000000..67749678b8 --- /dev/null +++ b/test/staging/sm/RegExp/match.js @@ -0,0 +1,45 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-RegExp-shell.js, sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +var BUGNUMBER = 887016; +var summary = "Implement RegExp.prototype[@@match]."; + +print(BUGNUMBER + ": " + summary); + +assert.sameValue(RegExp.prototype[Symbol.match].name, "[Symbol.match]"); +assert.sameValue(RegExp.prototype[Symbol.match].length, 1); +var desc = Object.getOwnPropertyDescriptor(RegExp.prototype, Symbol.match); +assert.sameValue(desc.configurable, true); +assert.sameValue(desc.enumerable, false); +assert.sameValue(desc.writable, true); + +var re = /a/; +var v = re[Symbol.match]("abcAbcABC"); +assert.sameValue(Array.isArray(v), true); +assert.sameValue(v.length, 1); +assert.sameValue(v[0], "a"); + +re = /d/; +v = re[Symbol.match]("abcAbcABC"); +assert.sameValue(v, null); + +re = /a/ig; +v = re[Symbol.match]("abcAbcABC"); +assert.sameValue(Array.isArray(v), true); +assert.sameValue(v.length, 3); +assert.sameValue(v[0], "a"); +assert.sameValue(v[1], "A"); +assert.sameValue(v[2], "A"); + +re = /d/g; +v = re[Symbol.match]("abcAbcABC"); +assert.sameValue(v, null); + diff --git a/test/staging/sm/RegExp/prototype-different-global.js b/test/staging/sm/RegExp/prototype-different-global.js new file mode 100644 index 0000000000..2bfb4d8698 --- /dev/null +++ b/test/staging/sm/RegExp/prototype-different-global.js @@ -0,0 +1,37 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-RegExp-shell.js, sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +function test(otherGlobal) { + var otherRegExp = otherGlobal.RegExp; + + for (let name of ["global", "ignoreCase", "multiline", "sticky", "unicode", "source"]) { + let getter = Object.getOwnPropertyDescriptor(RegExp.prototype, name).get; + assert.sameValue(typeof getter, "function"); + + // Note: TypeError gets reported from wrong global if cross-compartment, + // so we test both cases. + let ex; + try { + getter.call(otherRegExp.prototype); + } catch (e) { + ex = e; + } + assert.sameValue(ex instanceof TypeError || ex instanceof otherGlobal.TypeError, true); + } + + let flagsGetter = Object.getOwnPropertyDescriptor(RegExp.prototype, "flags").get; + assert.sameValue(flagsGetter.call(otherRegExp.prototype), ""); + + assert.sameValue(RegExp.prototype.toString.call(otherRegExp.prototype), "/(?:)/"); +} +test(createNewGlobal()); +test(createNewGlobal({newCompartment: true})); + diff --git a/test/staging/sm/RegExp/prototype.js b/test/staging/sm/RegExp/prototype.js new file mode 100644 index 0000000000..828628ac42 --- /dev/null +++ b/test/staging/sm/RegExp/prototype.js @@ -0,0 +1,46 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [compareArray.js, sm/non262-RegExp-shell.js, sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +const t = RegExp.prototype; + +let properties = "toString,compile,exec,test," + + "flags,dotAll,global,hasIndices,ignoreCase,multiline,source,sticky,unicode,unicodeSets," + + "constructor," + + "Symbol(Symbol.match),Symbol(Symbol.replace),Symbol(Symbol.search),Symbol(Symbol.split)"; +if (Object.prototype.toSource) { + properties = "toSource," + properties; +} +if (Symbol.matchAll) { + properties += ",Symbol(Symbol.matchAll)"; +} +assert.compareArray(Reflect.ownKeys(t).map(String).sort(), properties.split(",").sort()); + + +// Invoking getters on the prototype should not throw +function getter(name) { + return Object.getOwnPropertyDescriptor(t, name).get.call(t); +} + +assert.sameValue(getter("flags"), ""); +assert.sameValue(getter("global"), undefined); +assert.sameValue(getter("ignoreCase"), undefined); +assert.sameValue(getter("multiline"), undefined); +assert.sameValue(getter("source"), "(?:)"); +assert.sameValue(getter("sticky"), undefined); +assert.sameValue(getter("unicode"), undefined); + +assert.sameValue(t.toString(), "/(?:)/"); + +// The methods don't work with the prototype +assertThrowsInstanceOf(() => t.compile("b", "i"), TypeError); +assertThrowsInstanceOf(() => t.test("x"), TypeError); +assertThrowsInstanceOf(() => t.exec("x"), TypeError); + diff --git a/test/staging/sm/RegExp/regress-576828.js b/test/staging/sm/RegExp/regress-576828.js new file mode 100644 index 0000000000..7de773cddc --- /dev/null +++ b/test/staging/sm/RegExp/regress-576828.js @@ -0,0 +1,17 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-RegExp-shell.js, sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +var re = /(z\1){3}/; +var str = 'zzz'; +var actual = re.exec(str); +var expected = makeExpectedMatch(['zzz', 'z'], 0, str); +checkRegExpMatch(actual, expected); + diff --git a/test/staging/sm/RegExp/regress-613820-1.js b/test/staging/sm/RegExp/regress-613820-1.js new file mode 100644 index 0000000000..6d11983471 --- /dev/null +++ b/test/staging/sm/RegExp/regress-613820-1.js @@ -0,0 +1,18 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-RegExp-shell.js, sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +/* Back reference is actually a forwards reference. */ +var re = /(\2(a)){2}/; +var str = 'aaa'; +var actual = re.exec(str); +var expected = makeExpectedMatch(['aa', 'a', 'a'], 0, str); +checkRegExpMatch(actual, expected); + diff --git a/test/staging/sm/RegExp/regress-613820-2.js b/test/staging/sm/RegExp/regress-613820-2.js new file mode 100644 index 0000000000..65f8e99d51 --- /dev/null +++ b/test/staging/sm/RegExp/regress-613820-2.js @@ -0,0 +1,18 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-RegExp-shell.js, sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +/* Resetting of inner capture groups across quantified capturing parens. */ +var re = /(?:(f)(o)(o)|(b)(a)(r))*/; +var str = 'foobar'; +var actual = re.exec(str); +var expected = makeExpectedMatch(['foobar', undefined, undefined, undefined, 'b', 'a', 'r'], 0, str); +checkRegExpMatch(actual, expected); + diff --git a/test/staging/sm/RegExp/regress-613820-3.js b/test/staging/sm/RegExp/regress-613820-3.js new file mode 100644 index 0000000000..ebdfea8cd2 --- /dev/null +++ b/test/staging/sm/RegExp/regress-613820-3.js @@ -0,0 +1,18 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-RegExp-shell.js, sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +/* Capture group reset to undefined during second iteration, so backreference doesn't see prior result. */ +var re = /(?:^(a)|\1(a)|(ab)){2}/; +var str = 'aab'; +var actual = re.exec(str); +var expected = makeExpectedMatch(['aa', undefined, 'a', undefined], 0, str); +checkRegExpMatch(actual, expected); + diff --git a/test/staging/sm/RegExp/regress-yarr-regexp.js b/test/staging/sm/RegExp/regress-yarr-regexp.js new file mode 100644 index 0000000000..10758de485 --- /dev/null +++ b/test/staging/sm/RegExp/regress-yarr-regexp.js @@ -0,0 +1,29 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [compareArray.js, sm/non262-RegExp-shell.js, sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +var gcgcz = /((?:.)+)((?:.)*)/; /* Greedy capture, greedy capture zero. */ +assert.compareArray(["a", "a", ""], gcgcz.exec("a")); +assert.compareArray(["ab", "ab", ""], gcgcz.exec("ab")); +assert.compareArray(["abc", "abc", ""], gcgcz.exec("abc")); + +assert.compareArray(["a", ""], /((?:)*?)a/.exec("a")); +assert.compareArray(["a", ""], /((?:.)*?)a/.exec("a")); +assert.compareArray(["a", ""], /a((?:.)*)/.exec("a")); + +assert.compareArray(["B", "B"], /([A-Z])/.exec("fooBar")); + +// These just mustn't crash. See bug 872971 +try { assert.sameValue(/x{2147483648}x/.test('1'), false); } catch (e) {} +try { assert.sameValue(/x{2147483648,}x/.test('1'), false); } catch (e) {} +try { assert.sameValue(/x{2147483647,2147483648}x/.test('1'), false); } catch (e) {} +// Same for these. See bug 813366 +try { assert.sameValue("".match(/.{2147483647}11/), null); } catch (e) {} +try { assert.sameValue("".match(/(?:(?=g)).{2147483648,}/ + ""), null); } catch (e) {} diff --git a/test/staging/sm/RegExp/replace-compile-elembase.js b/test/staging/sm/RegExp/replace-compile-elembase.js new file mode 100644 index 0000000000..c889b4ed8d --- /dev/null +++ b/test/staging/sm/RegExp/replace-compile-elembase.js @@ -0,0 +1,31 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-RegExp-shell.js, sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +(function() { + var rx = /a/g; + var b = { + get a() { + rx.compile("b"); + return "A"; + } + }; + + // Replacer function which is applicable for the elem-base optimization in + // RegExp.prototype.@@replace. + function replacer(a) { + return b[a]; + } + + var result = rx[Symbol.replace]("aaa", replacer); + + assert.sameValue(result, "AAA"); +})(); + diff --git a/test/staging/sm/RegExp/replace-compile.js b/test/staging/sm/RegExp/replace-compile.js new file mode 100644 index 0000000000..561ca9016f --- /dev/null +++ b/test/staging/sm/RegExp/replace-compile.js @@ -0,0 +1,30 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-RegExp-shell.js, sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +var BUGNUMBER = 1287524; +var summary = 'RegExp.prototype[@@replace] should call replacer function after collecting all matches.'; + +print(BUGNUMBER + ": " + summary); + +var rx = RegExp("a", "g"); +var r = rx[Symbol.replace]("abba", function() { + rx.compile("b", "g"); + return "?"; +}); +assert.sameValue(r, "?bb?"); + +rx = RegExp("a", "g"); +r = "abba".replace(rx, function() { + rx.compile("b", "g"); + return "?"; +}); +assert.sameValue(r, "?bb?"); + diff --git a/test/staging/sm/RegExp/replace-global-unicode.js b/test/staging/sm/RegExp/replace-global-unicode.js new file mode 100644 index 0000000000..267af322c7 --- /dev/null +++ b/test/staging/sm/RegExp/replace-global-unicode.js @@ -0,0 +1,27 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-RegExp-shell.js, sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +var BUGNUMBER = 1287524; +var summary = 'RegExp.prototype[@@replace] should not use optimized path if RegExp.prototype.unicode is modified.'; + +print(BUGNUMBER + ": " + summary); + +Object.defineProperty(RegExp.prototype, "unicode", { + get() { + RegExp.prototype.exec = () => null; + } +}); + +var rx = RegExp("a", "g"); +var s = "abba"; +var r = rx[Symbol.replace](s, "c"); +assert.sameValue(r, "abba"); + diff --git a/test/staging/sm/RegExp/replace-local-tolength-lastindex.js b/test/staging/sm/RegExp/replace-local-tolength-lastindex.js new file mode 100644 index 0000000000..eb715a9086 --- /dev/null +++ b/test/staging/sm/RegExp/replace-local-tolength-lastindex.js @@ -0,0 +1,31 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-RegExp-shell.js, sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +// RegExp.prototype[@@replace] always executes ToLength(regExp.lastIndex) for +// non-global RegExps. + +for (var flag of ["", "g", "y", "gy"]) { + var regExp = new RegExp("a", flag); + + var called = false; + regExp.lastIndex = { + valueOf() { + assert.sameValue(called, false); + called = true; + return 0; + } + }; + + assert.sameValue(called, false); + regExp[Symbol.replace](""); + assert.sameValue(called, !flag.includes("g")); +} + diff --git a/test/staging/sm/RegExp/replace-local-tolength-recompilation.js b/test/staging/sm/RegExp/replace-local-tolength-recompilation.js new file mode 100644 index 0000000000..1d4e49b16e --- /dev/null +++ b/test/staging/sm/RegExp/replace-local-tolength-recompilation.js @@ -0,0 +1,84 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-RegExp-shell.js, sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +// Side-effects when calling ToLength(regExp.lastIndex) in +// RegExp.prototype[@@replace] for non-global RegExp can recompile the RegExp. + +for (var flag of ["", "y"]) { + var regExp = new RegExp("a", flag); + + regExp.lastIndex = { + valueOf() { + regExp.compile("b"); + return 0; + } + }; + + var result = regExp[Symbol.replace]("b", "pass"); + assert.sameValue(result, "pass"); +} + +// Recompilation modifies flag: +// Case 1: Adds global flag, validate by checking lastIndex. +var regExp = new RegExp("a", ""); +regExp.lastIndex = { + valueOf() { + // |regExp| is now in global mode, RegExpBuiltinExec should update the + // lastIndex property to reflect last match. + regExp.compile("a", "g"); + return 0; + } +}; +regExp[Symbol.replace]("a", ""); +assert.sameValue(regExp.lastIndex, 1); + +// Case 2: Removes sticky flag with match, validate by checking lastIndex. +var regExp = new RegExp("a", "y"); +regExp.lastIndex = { + valueOf() { + // |regExp| is no longer sticky, RegExpBuiltinExec shouldn't modify the + // lastIndex property. + regExp.compile("a", ""); + regExp.lastIndex = 9000; + return 0; + } +}; +regExp[Symbol.replace]("a", ""); +assert.sameValue(regExp.lastIndex, 9000); + +// Case 3.a: Removes sticky flag without match, validate by checking lastIndex. +var regExp = new RegExp("a", "y"); +regExp.lastIndex = { + valueOf() { + // |regExp| is no longer sticky, RegExpBuiltinExec shouldn't modify the + // lastIndex property. + regExp.compile("b", ""); + regExp.lastIndex = 9001; + return 0; + } +}; +regExp[Symbol.replace]("a", ""); +assert.sameValue(regExp.lastIndex, 9001); + +// Case 3.b: Removes sticky flag without match, validate by checking lastIndex. +var regExp = new RegExp("a", "y"); +regExp.lastIndex = { + valueOf() { + // |regExp| is no longer sticky, RegExpBuiltinExec shouldn't modify the + // lastIndex property. + regExp.compile("b", ""); + regExp.lastIndex = 9002; + return 10000; + } +}; +regExp[Symbol.replace]("a", ""); +assert.sameValue(regExp.lastIndex, 9002); + diff --git a/test/staging/sm/RegExp/replace-sticky-lastIndex.js b/test/staging/sm/RegExp/replace-sticky-lastIndex.js new file mode 100644 index 0000000000..ce5359a9db --- /dev/null +++ b/test/staging/sm/RegExp/replace-sticky-lastIndex.js @@ -0,0 +1,32 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-RegExp-shell.js, sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +var BUGNUMBER = 887016; +var summary = "String.prototype.replace should do nothing if lastIndex is invalid for sticky RegExp"; + +print(BUGNUMBER + ": " + summary); + +var re = /a/y; +re.lastIndex = -1; +assert.sameValue("a".replace(re, "b"), "b"); +re.lastIndex = 0; +assert.sameValue("a".replace(re, "b"), "b"); +re.lastIndex = 1; +assert.sameValue("a".replace(re, "b"), "a"); +re.lastIndex = 2; +assert.sameValue("a".replace(re, "b"), "a"); +re.lastIndex = "foo"; +assert.sameValue("a".replace(re, "b"), "b"); +re.lastIndex = "1"; +assert.sameValue("a".replace(re, "b"), "a"); +re.lastIndex = {}; +assert.sameValue("a".replace(re, "b"), "b"); + diff --git a/test/staging/sm/RegExp/replace-sticky.js b/test/staging/sm/RegExp/replace-sticky.js new file mode 100644 index 0000000000..950f1b0900 --- /dev/null +++ b/test/staging/sm/RegExp/replace-sticky.js @@ -0,0 +1,30 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-RegExp-shell.js, sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +var BUGNUMBER = 887016; +var summary = "String.prototype.replace should use and update lastIndex if sticky flag is set"; + +print(BUGNUMBER + ": " + summary); + +var input = "abcdeabcdeabcdefghij"; +var re = new RegExp("abcde", "y"); +re.test(input); +assert.sameValue(re.lastIndex, 5); +var ret = input.replace(re, "ABCDE"); +assert.sameValue(ret, "abcdeABCDEabcdefghij"); +assert.sameValue(re.lastIndex, 10); +ret = input.replace(re, "ABCDE"); +assert.sameValue(ret, "abcdeabcdeABCDEfghij"); +assert.sameValue(re.lastIndex, 15); +ret = input.replace(re, "ABCDE"); +assert.sameValue(ret, "abcdeabcdeabcdefghij"); +assert.sameValue(re.lastIndex, 0); + diff --git a/test/staging/sm/RegExp/replace-this.js b/test/staging/sm/RegExp/replace-this.js new file mode 100644 index 0000000000..a90007609b --- /dev/null +++ b/test/staging/sm/RegExp/replace-this.js @@ -0,0 +1,21 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-RegExp-shell.js, sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +var BUGNUMBER = 887016; +var summary = "RegExp.prototype[@@replace] should check |this| value."; + +print(BUGNUMBER + ": " + summary); + +for (var v of [null, 1, true, undefined, "", Symbol.iterator]) { + assertThrowsInstanceOf(() => RegExp.prototype[Symbol.replace].call(v), + TypeError); +} + diff --git a/test/staging/sm/RegExp/replace-trace.js b/test/staging/sm/RegExp/replace-trace.js new file mode 100644 index 0000000000..9f2b9351d4 --- /dev/null +++ b/test/staging/sm/RegExp/replace-trace.js @@ -0,0 +1,316 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-RegExp-shell.js, sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +var BUGNUMBER = 887016; +var summary = "Trace RegExp.prototype[@@replace] behavior."; + +print(BUGNUMBER + ": " + summary); + +var n; +var log; +var target; +var global; +var unicode; + +var execResult; +var lastIndexResult; +var lastIndexExpected; + +var arraySetterObserved = false; +function startObserve() { + for (var i = 0; i < 10; i++) { + Object.defineProperty(Array.prototype, i, { + set: function(v) { + arraySetterObserved = true; + }, + configurable: true, + }); + } +} +function stopObserve() { + for (var i = 0; i < 10; i++) + delete Array.prototype[i] +} + +startObserve(); + +function P(A, index, matched2) { + var i = 0; + A.index = index; + return new Proxy(A, { + get(that, name) { + log += "get:result[" + name + "],"; + + // Return a different value for 2nd access to result[0]. + if (matched2 !== undefined && name == 0) { + if (i == 1) { + return matched2; + } + i++; + } + + return that[name]; + } + }); +} + +var myRegExp = { + get flags() { + log += "get:flags,"; + var flags = ""; + if (global) flags += "g"; + if (unicode) flags += "u"; + return flags; + }, + get global() { + // This getter should not be invoked, because we override the flags getter. + log += "get:global," + }, + get unicode() { + // This getter should not be invoked, because we override the flags getter. + log += "get:unicode," + }, + get lastIndex() { + log += "get:lastIndex,"; + return lastIndexResult[n]; + }, + set lastIndex(v) { + log += "set:lastIndex,"; + assert.sameValue(v, lastIndexExpected[n]); + }, + get exec() { + log += "get:exec,"; + return function(S) { + log += "call:exec,"; + assert.sameValue(S, target); + return execResult[n++]; + }; + }, +}; + +function reset() { + n = 0; + log = ""; + target = "abcAbcABC"; + global = true; + unicode = false; + arraySetterObserved = false; +} + +// Trace global with non-empty match. +reset(); +execResult = [ P(["bc"], 1), null ]; +lastIndexResult = [ , , ]; +lastIndexExpected = [ 0, , ]; +var ret = RegExp.prototype[Symbol.replace].call(myRegExp, target, "_XYZ_"); +assert.sameValue(arraySetterObserved, false); +assert.sameValue(ret, "a_XYZ_AbcABC"); +assert.sameValue(log, + "get:flags," + + "set:lastIndex," + + "get:exec,call:exec," + + "get:result[0]," + + "get:exec,call:exec," + + "get:result[length],get:result[0],get:result[index],get:result[groups],"); + +// Trace global with empty match. +reset(); +execResult = [ P([""], 1), null ]; +lastIndexResult = [ , 5, ]; +lastIndexExpected = [ 0, 6, ]; +ret = RegExp.prototype[Symbol.replace].call(myRegExp, target, "_XYZ_"); +assert.sameValue(arraySetterObserved, false); +assert.sameValue(ret, "a_XYZ_bcAbcABC"); +assert.sameValue(log, + "get:flags," + + "set:lastIndex," + + "get:exec,call:exec," + + "get:result[0]," + + "get:lastIndex,set:lastIndex," + + "get:exec,call:exec," + + "get:result[length],get:result[0],get:result[index],get:result[groups],"); + +// Trace global and unicode with empty match. +// 1. not surrogate pair +// 2. lead surrogate pair +// 3. trail surrogate pair +// 4. lead surrogate pair without trail surrogate pair +// 5. index overflow +reset(); +unicode = true; +// 0123 4 5678 +target = "---\uD83D\uDC38---\uD83D"; +execResult = [ P([""], 1), P([""], 2), P([""], 3), P([""], 4), P([""], 5), null ]; +lastIndexResult = [ , 2, 3, 4, 8, 9, ]; +lastIndexExpected = [ 0, 3, 5, 5, 9, 10, ]; +ret = RegExp.prototype[Symbol.replace].call(myRegExp, target, "_XYZ_"); +assert.sameValue(arraySetterObserved, false); +assert.sameValue(ret, "-_XYZ_-_XYZ_-_XYZ_\uD83D_XYZ_\uDC38_XYZ_---\uD83D"); +assert.sameValue(log, + "get:flags," + + "set:lastIndex," + + "get:exec,call:exec," + + "get:result[0]," + + "get:lastIndex,set:lastIndex," + + "get:exec,call:exec," + + "get:result[0]," + + "get:lastIndex,set:lastIndex," + + "get:exec,call:exec," + + "get:result[0]," + + "get:lastIndex,set:lastIndex," + + "get:exec,call:exec," + + "get:result[0]," + + "get:lastIndex,set:lastIndex," + + "get:exec,call:exec," + + "get:result[0]," + + "get:lastIndex,set:lastIndex," + + "get:exec,call:exec," + + "get:result[length],get:result[0],get:result[index],get:result[groups]," + + "get:result[length],get:result[0],get:result[index],get:result[groups]," + + "get:result[length],get:result[0],get:result[index],get:result[groups]," + + "get:result[length],get:result[0],get:result[index],get:result[groups]," + + "get:result[length],get:result[0],get:result[index],get:result[groups],"); + +// Trace global with captures and substitutions. +reset(); +execResult = [ P(["bc", "b", "c"], 1), null ]; +lastIndexResult = [ , , ]; +lastIndexExpected = [ 0, , ]; +ret = RegExp.prototype[Symbol.replace].call(myRegExp, target, "[$&,$`,$',$1,$2,$3,$]"); +assert.sameValue(arraySetterObserved, false); +assert.sameValue(ret, "a[bc,a,AbcABC,b,c,$3,$]AbcABC"); +assert.sameValue(log, + "get:flags," + + "set:lastIndex," + + "get:exec,call:exec," + + "get:result[0]," + + "get:exec,call:exec," + + "get:result[length],get:result[0],get:result[index]," + + "get:result[1],get:result[2],get:result[groups],"); + +// Trace global with empty match and captures and substitutions, +// with different matched. +reset(); +execResult = [ P(["", "b", "c"], 1, "BC"), null ]; +lastIndexResult = [ , 5, ]; +lastIndexExpected = [ 0, 6, ]; +ret = RegExp.prototype[Symbol.replace].call(myRegExp, target, "[$&,$`,$',$1,$2,$3,$]"); +assert.sameValue(arraySetterObserved, false); +assert.sameValue(ret, "a[BC,a,AbcABC,b,c,$3,$]AbcABC"); +assert.sameValue(log, + "get:flags," + + "set:lastIndex," + + "get:exec,call:exec," + + "get:result[0]," + + "get:lastIndex,set:lastIndex," + + "get:exec,call:exec," + + "get:result[length],get:result[0],get:result[index]," + + "get:result[1],get:result[2],get:result[groups],"); + +// Trace global with empty match and captures and function, +// with different matched. +reset(); +execResult = [ P(["", "b", "c"], 1, "BC"), null ]; +lastIndexResult = [ , 5, ]; +lastIndexExpected = [ 0, 6, ]; +function replaceFunc(...args) { + log += "call:replaceFunc,"; + assert.sameValue(args.length, 5); + assert.sameValue(args[0], "BC"); + assert.sameValue(args[1], "b"); + assert.sameValue(args[2], "c"); + assert.sameValue(args[3], 1); + assert.sameValue(args[4], target); + return "_ret_"; +} +// This also tests RegExpStatics save/restore with no match. +ret = RegExp.prototype[Symbol.replace].call(myRegExp, target, replaceFunc); +assert.sameValue(arraySetterObserved, false); +assert.sameValue(ret, "a_ret_AbcABC"); +assert.sameValue(log, + "get:flags," + + "set:lastIndex," + + "get:exec,call:exec," + + "get:result[0]," + + "get:lastIndex,set:lastIndex," + + "get:exec,call:exec," + + "get:result[length],get:result[0],get:result[index]," + + "get:result[1],get:result[2],get:result[groups]," + + "call:replaceFunc,"); + +// Trace global with non-empty match, move backwards. +// 2nd match shouldn't be replaced. +reset(); +execResult = [ P(["X"], 5), P(["YZ"], 1), null ]; +lastIndexResult = [ , , , ]; +lastIndexExpected = [ 0, , , ]; +ret = RegExp.prototype[Symbol.replace].call(myRegExp, target, "_XYZ_"); +assert.sameValue(arraySetterObserved, false); +assert.sameValue(ret, "abcAb_XYZ_ABC"); +assert.sameValue(log, + "get:flags," + + "set:lastIndex," + + "get:exec,call:exec," + + "get:result[0]," + + "get:exec,call:exec," + + "get:result[0]," + + "get:exec,call:exec," + + "get:result[length],get:result[0],get:result[index],get:result[groups]," + + "get:result[length],get:result[0],get:result[index],get:result[groups],"); + +// Trace global with non-empty match, position + matchLength overflows. +reset(); +execResult = [ P(["fooooooo"], 7), null ]; +lastIndexResult = [ , , ]; +lastIndexExpected = [ 0, , ]; +ret = RegExp.prototype[Symbol.replace].call(myRegExp, target, "_XYZ_"); +assert.sameValue(arraySetterObserved, false); +assert.sameValue(ret, "abcAbcA_XYZ_"); +assert.sameValue(log, + "get:flags," + + "set:lastIndex," + + "get:exec,call:exec," + + "get:result[0]," + + "get:exec,call:exec," + + "get:result[length],get:result[0],get:result[index],get:result[groups],"); + +// Trace global with non-empty match, position overflows. +reset(); +execResult = [ P(["fooooooo"], 12), null ]; +lastIndexResult = [ , , ]; +lastIndexExpected = [ 0, , ]; +ret = RegExp.prototype[Symbol.replace].call(myRegExp, target, "_XYZ_"); +assert.sameValue(arraySetterObserved, false); +assert.sameValue(ret, "abcAbcABC_XYZ_"); +assert.sameValue(log, + "get:flags," + + "set:lastIndex," + + "get:exec,call:exec," + + "get:result[0]," + + "get:exec,call:exec," + + "get:result[length],get:result[0],get:result[index],get:result[groups],"); + +// Trace non-global. +reset(); +global = false; +execResult = [ P(["bc"], 1) ]; +lastIndexResult = [ , , ]; +lastIndexExpected = [ 0, , ]; +ret = RegExp.prototype[Symbol.replace].call(myRegExp, target, "_XYZ_"); +assert.sameValue(arraySetterObserved, false); +assert.sameValue(ret, "a_XYZ_AbcABC"); +assert.sameValue(log, + "get:flags," + + "get:exec,call:exec," + + "get:result[length],get:result[0],get:result[index],get:result[groups],"); + +stopObserve(); + diff --git a/test/staging/sm/RegExp/replace-twoBytes.js b/test/staging/sm/RegExp/replace-twoBytes.js new file mode 100644 index 0000000000..b0163ba9be --- /dev/null +++ b/test/staging/sm/RegExp/replace-twoBytes.js @@ -0,0 +1,53 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-RegExp-shell.js, sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +var BUGNUMBER = 1269719; +var summary = "RegExp.prototype[@@replace] should check latin1/twoBytes for all strings used in relate operation."; + +print(BUGNUMBER + ": " + summary); + +var ans = [ + "[AB$2$3$]", + "[AB$2$3$]\u3048", + "[AB$2$3$]", + "[AB$2$3$]\u3048", + "[A\u3044$2$3$]", + "[A\u3044$2$3$]\u3048", + "[A\u3044$2$3$]", + "[A\u3044$2$3$]\u3048", + "[\u3042B$2$3$]", + "[\u3042B$2$3$]\u3048", + "[\u3042B$2$3$]", + "[\u3042B$2$3$]\u3048", + "[\u3042\u3044$2$3$]", + "[\u3042\u3044$2$3$]\u3048", + "[\u3042\u3044$2$3$]", + "[\u3042\u3044$2$3$]\u3048", +]; +var i = 0; +for (var matched of ["A", "\u3042"]) { + for (var group1 of ["B", "\u3044"]) { + for (var string of ["C", "\u3046"]) { + for (var replacement of ["[$&$`$'$1$2$3$]", "[$&$`$'$1$2$3$]\u3048"]) { + var myRegExp = { + get exec() { + return function() { + return [matched, group1]; + }; + } + }; + assert.sameValue(RegExp.prototype[Symbol.replace].call(myRegExp, string, replacement), ans[i]); + i++; + } + } + } +} + diff --git a/test/staging/sm/RegExp/replace.js b/test/staging/sm/RegExp/replace.js new file mode 100644 index 0000000000..8956a9b237 --- /dev/null +++ b/test/staging/sm/RegExp/replace.js @@ -0,0 +1,43 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-RegExp-shell.js, sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +var BUGNUMBER = 887016; +var summary = "Implement RegExp.prototype[@@replace]."; + +print(BUGNUMBER + ": " + summary); + +assert.sameValue(RegExp.prototype[Symbol.replace].name, "[Symbol.replace]"); +assert.sameValue(RegExp.prototype[Symbol.replace].length, 2); +var desc = Object.getOwnPropertyDescriptor(RegExp.prototype, Symbol.replace); +assert.sameValue(desc.configurable, true); +assert.sameValue(desc.enumerable, false); +assert.sameValue(desc.writable, true); + +var re = /a/; +var v = re[Symbol.replace]("abcAbcABC", "X"); +assert.sameValue(v, "XbcAbcABC"); + +re = /d/; +v = re[Symbol.replace]("abcAbcABC", "X"); +assert.sameValue(v, "abcAbcABC"); + +re = /a/ig; +v = re[Symbol.replace]("abcAbcABC", "X"); +assert.sameValue(v, "XbcXbcXBC"); + +re = /(a)(b)(cd)/; +v = re[Symbol.replace]("012abcd345", "_$$_$&_$`_$'_$0_$1_$2_$3_$4_$+_$"); +assert.sameValue(v, "012_$_abcd_012_345_$0_a_b_cd_$4_$+_$345"); + +re = /(a)(b)(cd)/; +v = re[Symbol.replace]("012abcd345", "_\u3042_$$_$&_$`_$'_$0_$1_$2_$3_$4_$+_$"); +assert.sameValue(v, "012_\u3042_$_abcd_012_345_$0_a_b_cd_$4_$+_$345"); + diff --git a/test/staging/sm/RegExp/search-this.js b/test/staging/sm/RegExp/search-this.js new file mode 100644 index 0000000000..3e578800d2 --- /dev/null +++ b/test/staging/sm/RegExp/search-this.js @@ -0,0 +1,21 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-RegExp-shell.js, sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +var BUGNUMBER = 887016; +var summary = "RegExp.prototype[@@search] should check this value."; + +print(BUGNUMBER + ": " + summary); + +for (var v of [null, 1, true, undefined, "", Symbol.iterator]) { + assertThrowsInstanceOf(() => RegExp.prototype[Symbol.search].call(v), + TypeError); +} + diff --git a/test/staging/sm/RegExp/search-trace.js b/test/staging/sm/RegExp/search-trace.js new file mode 100644 index 0000000000..7d1b8b78cb --- /dev/null +++ b/test/staging/sm/RegExp/search-trace.js @@ -0,0 +1,87 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-RegExp-shell.js, sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +var BUGNUMBER = 887016; +var summary = "Trace RegExp.prototype[@@search] behavior."; + +print(BUGNUMBER + ": " + summary); + +var n; +var log; +var target; + +var execResult; +var lastIndexResult; +var lastIndexExpected; + +function P(index) { + return new Proxy({ index }, { + get(that, name) { + log += "get:result[" + name + "],"; + return that[name]; + } + }); +} + +var myRegExp = { + get lastIndex() { + log += "get:lastIndex,"; + return lastIndexResult[n]; + }, + set lastIndex(v) { + log += "set:lastIndex,"; + assert.sameValue(v, lastIndexExpected[n]); + }, + get exec() { + log += "get:exec,"; + return function(S) { + log += "call:exec,"; + assert.sameValue(S, target); + return execResult[n++]; + }; + }, +}; + +function reset() { + n = 0; + log = ""; + target = "abcAbcABC"; +} + +// Trace hit. +reset(); +execResult = [ P(16) ]; +lastIndexResult = [ 10, , ]; +lastIndexExpected = [ 0, 10 ]; +var ret = RegExp.prototype[Symbol.search].call(myRegExp, target); +assert.sameValue(ret, 16); +assert.sameValue(log, + "get:lastIndex," + + "set:lastIndex," + + "get:exec,call:exec," + + "get:lastIndex," + + "set:lastIndex," + + "get:result[index],"); + +// Trace not hit. +reset(); +execResult = [ null ]; +lastIndexResult = [ 10, , ]; +lastIndexExpected = [ 0, 10 ]; +ret = RegExp.prototype[Symbol.search].call(myRegExp, target); +assert.sameValue(ret, -1); +assert.sameValue(log, + "get:lastIndex," + + "set:lastIndex," + + "get:exec,call:exec," + + "get:lastIndex," + + "set:lastIndex,"); + diff --git a/test/staging/sm/RegExp/search.js b/test/staging/sm/RegExp/search.js new file mode 100644 index 0000000000..07a5c7a593 --- /dev/null +++ b/test/staging/sm/RegExp/search.js @@ -0,0 +1,35 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-RegExp-shell.js, sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +var BUGNUMBER = 887016; +var summary = "Implement RegExp.prototype[@@search]."; + +print(BUGNUMBER + ": " + summary); + +assert.sameValue(RegExp.prototype[Symbol.search].name, "[Symbol.search]"); +assert.sameValue(RegExp.prototype[Symbol.search].length, 1); +var desc = Object.getOwnPropertyDescriptor(RegExp.prototype, Symbol.search); +assert.sameValue(desc.configurable, true); +assert.sameValue(desc.enumerable, false); +assert.sameValue(desc.writable, true); + +var re = /B/; +var v = re[Symbol.search]("abcAbcABC"); +assert.sameValue(v, 7); + +re = /B/i; +v = re[Symbol.search]("abcAbcABCD"); +assert.sameValue(v, 1); + +re = /d/; +v = re[Symbol.search]("abcAbcABCD"); +assert.sameValue(v, -1); + diff --git a/test/staging/sm/RegExp/source.js b/test/staging/sm/RegExp/source.js new file mode 100644 index 0000000000..209e6097da --- /dev/null +++ b/test/staging/sm/RegExp/source.js @@ -0,0 +1,38 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-RegExp-shell.js, sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +var BUGNUMBER = 1120169; +var summary = "Implement RegExp.prototype.source"; + +print(BUGNUMBER + ": " + summary); + +assert.sameValue(RegExp.prototype.source, "(?:)"); +assert.sameValue(/foo/.source, "foo"); +assert.sameValue(/foo/iymg.source, "foo"); +assert.sameValue(/\//.source, "\\/"); +assert.sameValue(/\n\r/.source, "\\n\\r"); +assert.sameValue(/\u2028\u2029/.source, "\\u2028\\u2029"); +assert.sameValue(RegExp("").source, "(?:)"); +assert.sameValue(RegExp("", "mygi").source, "(?:)"); +assert.sameValue(RegExp("/").source, "\\/"); +assert.sameValue(RegExp("\n\r").source, "\\n\\r"); +assert.sameValue(RegExp("\u2028\u2029").source, "\\u2028\\u2029"); + +assertThrowsInstanceOf(() => genericSource(), TypeError); +assertThrowsInstanceOf(() => genericSource(1), TypeError); +assertThrowsInstanceOf(() => genericSource(""), TypeError); +assertThrowsInstanceOf(() => genericSource({}), TypeError); +assertThrowsInstanceOf(() => genericSource(new Proxy(/foo/, {get(){ return true; }})), TypeError); + +function genericSource(obj) { + return Object.getOwnPropertyDescriptor(RegExp.prototype, "source").get.call(obj); +} + diff --git a/test/staging/sm/RegExp/split-deleted-flags.js b/test/staging/sm/RegExp/split-deleted-flags.js new file mode 100644 index 0000000000..07bce6de51 --- /dev/null +++ b/test/staging/sm/RegExp/split-deleted-flags.js @@ -0,0 +1,20 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-RegExp-shell.js, sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +var BUGNUMBER = 1322319; +var summary = "RegExp.prototype.split should throw if RegRxp.prototype.flags is deleted." + +print(BUGNUMBER + ": " + summary); + +delete RegExp.prototype.flags; + +assertThrowsInstanceOf(() => "aaaaa".split(/a/), SyntaxError); + diff --git a/test/staging/sm/RegExp/split-flags-on-obj.js b/test/staging/sm/RegExp/split-flags-on-obj.js new file mode 100644 index 0000000000..9180ab65aa --- /dev/null +++ b/test/staging/sm/RegExp/split-flags-on-obj.js @@ -0,0 +1,30 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [deepEqual.js, sm/non262-RegExp-shell.js, sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +var BUGNUMBER = 0; +var summary = "RegExp.prototype.split should reflect the change to Object.prototype.flags."; + +print(BUGNUMBER + ": " + summary); + +Object.defineProperty(Object.prototype, "flags", Object.getOwnPropertyDescriptor(RegExp.prototype, "flags")); +delete RegExp.prototype.flags; + +let re = /a/i; +let a = re[Symbol.split]("1a2A3a4A5"); +assert.deepEqual(a, ["1", "2", "3", "4", "5"]); + +delete Object.prototype.flags; + +Object.prototype.flags = ""; + +a = re[Symbol.split]("1a2A3a4A5"); +assert.deepEqual(a, ["1", "2A3", "4A5"]); + diff --git a/test/staging/sm/RegExp/split-invalid-lastIndex.js b/test/staging/sm/RegExp/split-invalid-lastIndex.js new file mode 100644 index 0000000000..6403bc49ba --- /dev/null +++ b/test/staging/sm/RegExp/split-invalid-lastIndex.js @@ -0,0 +1,40 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-RegExp-shell.js, sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +var BUGNUMBER = 1263851; +var summary = "RegExp.prototype[@@split] should handle if lastIndex is out of bound."; + +print(BUGNUMBER + ": " + summary); + +var myRegExp = { + get constructor() { + return { + get [Symbol.species]() { + return function() { + return { + get lastIndex() { + return 9; + }, + set lastIndex(v) {}, + exec() { + return []; + } + }; + }; + } + }; + } +}; +var result = RegExp.prototype[Symbol.split].call(myRegExp, "abcde");; +assert.sameValue(result.length, 2); +assert.sameValue(result[0], ""); +assert.sameValue(result[1], ""); + diff --git a/test/staging/sm/RegExp/split-limit.js b/test/staging/sm/RegExp/split-limit.js new file mode 100644 index 0000000000..bfcce73bff --- /dev/null +++ b/test/staging/sm/RegExp/split-limit.js @@ -0,0 +1,23 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-RegExp-shell.js, sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +var BUGNUMBER = 1287525; +var summary = "RegExp.prototype[@@split] shouldn't use optimized path if limit is not number."; + +print(BUGNUMBER + ": " + summary); + +var rx = /a/; +var r = rx[Symbol.split]("abba", {valueOf() { + RegExp.prototype.exec = () => null; + return 100; +}}); +assert.sameValue(r.length, 1); + diff --git a/test/staging/sm/RegExp/split-obj.js b/test/staging/sm/RegExp/split-obj.js new file mode 100644 index 0000000000..9d6afa4cda --- /dev/null +++ b/test/staging/sm/RegExp/split-obj.js @@ -0,0 +1,20 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [deepEqual.js, sm/non262-RegExp-shell.js, sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +var BUGNUMBER = 887016; +var summary = "RegExp.prototype[@@split] should check if this value is RegExp."; + +print(BUGNUMBER + ": " + summary); + +var obj = { flags: "", toString: () => "-" }; +assert.deepEqual(RegExp.prototype[Symbol.split].call(obj, "a-b-c"), + ["a", "b", "c"]); + diff --git a/test/staging/sm/RegExp/split-prop-access.js b/test/staging/sm/RegExp/split-prop-access.js new file mode 100644 index 0000000000..46617f5687 --- /dev/null +++ b/test/staging/sm/RegExp/split-prop-access.js @@ -0,0 +1,28 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-RegExp-shell.js, sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +var BUGNUMBER = 1287525; +var summary = 'String.prototype.split should call ToUint32(limit) before ToString(separator).'; + +print(BUGNUMBER + ": " + summary); + +var accessed = false; + +var rx = /a/; +Object.defineProperty(rx, Symbol.match, { + get() { + accessed = true; + } +}); +rx[Symbol.split]("abba"); + +assert.sameValue(accessed, true); + diff --git a/test/staging/sm/RegExp/split-this.js b/test/staging/sm/RegExp/split-this.js new file mode 100644 index 0000000000..7e151b5538 --- /dev/null +++ b/test/staging/sm/RegExp/split-this.js @@ -0,0 +1,21 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-RegExp-shell.js, sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +var BUGNUMBER = 887016; +var summary = "RegExp.prototype[@@split] should check this value."; + +print(BUGNUMBER + ": " + summary); + +for (var v of [null, 1, true, undefined, "", Symbol.iterator]) { + assertThrowsInstanceOf(() => RegExp.prototype[Symbol.split].call(v), + TypeError); +} + diff --git a/test/staging/sm/RegExp/split-trace.js b/test/staging/sm/RegExp/split-trace.js new file mode 100644 index 0000000000..47a4921481 --- /dev/null +++ b/test/staging/sm/RegExp/split-trace.js @@ -0,0 +1,238 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-RegExp-shell.js, sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +var BUGNUMBER = 887016; +var summary = "Trace RegExp.prototype[@@split] behavior."; + +print(BUGNUMBER + ": " + summary); + +var n; +var log; +var target; +var flags; +var expectedFlags; + +var execResult; +var lastIndexResult; +var lastIndexExpected; + +var arraySetterObserved = false; +function startObserve() { + for (var i = 0; i < 10; i++) { + Object.defineProperty(Array.prototype, i, { + set: function(v) { + arraySetterObserved = true; + }, + configurable: true, + }); + } +} +function stopObserve() { + for (var i = 0; i < 10; i++) + delete Array.prototype[i] +} + +startObserve(); + +function P(A) { + return new Proxy(A, { + get(that, name) { + log += "get:result[" + name + "],"; + return that[name]; + } + }); +} + +var myRegExp = { + get constructor() { + log += "get:constructor,"; + return { + get [Symbol.species]() { + log += "get:species,"; + return function(pattern, flags) { + assert.sameValue(pattern, myRegExp); + assert.sameValue(flags, expectedFlags); + log += "call:constructor,"; + return { + get lastIndex() { + log += "get:lastIndex,"; + return lastIndexResult[n]; + }, + set lastIndex(v) { + log += "set:lastIndex,"; + assert.sameValue(v, lastIndexExpected[n]); + }, + get flags() { + log += "get:flags,"; + return flags; + }, + get exec() { + log += "get:exec,"; + return function(S) { + log += "call:exec,"; + assert.sameValue(S, target); + return execResult[n++]; + }; + }, + }; + }; + } + }; + }, + get flags() { + log += "get:flags,"; + return flags; + }, +}; + +function reset() { + n = 0; + log = ""; + target = "abcde"; + flags = ""; + expectedFlags = "y"; + arraySetterObserved = false; +} + +// Trace match and no match. +reset(); +execResult = [ null, P(["b"]), null, P(["d"]), null ]; +lastIndexResult = [ , , 2, , 4, , ]; +lastIndexExpected = [ 0, 1, 2, 3, 4, ]; +var ret = RegExp.prototype[Symbol.split].call(myRegExp, target); +assert.sameValue(arraySetterObserved, false); +assert.sameValue(JSON.stringify(ret), `["a","c","e"]`); +assert.sameValue(log, + "get:constructor," + + "get:species," + + "get:flags," + + "call:constructor," + + "set:lastIndex,get:exec,call:exec," + + "set:lastIndex,get:exec,call:exec,get:lastIndex," + + "get:result[length]," + + "set:lastIndex,get:exec,call:exec," + + "set:lastIndex,get:exec,call:exec,get:lastIndex," + + "get:result[length]," + + "set:lastIndex,get:exec,call:exec,"); + +// Trace non-empty flags, empty target, no match. +reset(); +flags = "iy"; +expectedFlags = "iy"; +target = ""; +execResult = [ null ]; +lastIndexResult = []; +lastIndexExpected = []; +ret = RegExp.prototype[Symbol.split].call(myRegExp, target); +assert.sameValue(arraySetterObserved, false); +assert.sameValue(JSON.stringify(ret), `[""]`); +assert.sameValue(log, + "get:constructor," + + "get:species," + + "get:flags," + + "call:constructor," + + "get:exec,call:exec,"); + +// Trace empty target, match. +reset(); +target = ""; +execResult = [ P([""]) ]; +lastIndexResult = []; +lastIndexExpected = []; +ret = RegExp.prototype[Symbol.split].call(myRegExp, target); +assert.sameValue(arraySetterObserved, false); +assert.sameValue(JSON.stringify(ret), `[]`); +assert.sameValue(log, + "get:constructor," + + "get:species," + + "get:flags," + + "call:constructor," + + "get:exec,call:exec,"); + +// Trace captures. +reset(); +target = "abc"; +execResult = [ null, P(["b", "X", "YZ"]), null ]; +lastIndexResult = [ , , 2, , ]; +lastIndexExpected = [ 0, 1, 2, ]; +ret = RegExp.prototype[Symbol.split].call(myRegExp, target); +assert.sameValue(arraySetterObserved, false); +assert.sameValue(JSON.stringify(ret), `["a","X","YZ","c"]`); +assert.sameValue(log, + "get:constructor," + + "get:species," + + "get:flags," + + "call:constructor," + + "set:lastIndex,get:exec,call:exec," + + "set:lastIndex,get:exec,call:exec,get:lastIndex," + + "get:result[length]," + + "get:result[1],get:result[2]," + + "set:lastIndex,get:exec,call:exec,"); + +// Trace unicode. +// 1. not surrogate pair +// 2. lead surrogate pair +// 3. trail surrogate pair +// 4. lead surrogate pair without trail surrogate pair +// 5. index overflow +reset(); +flags = "u"; +expectedFlags = "uy"; +target = "-\uD83D\uDC38\uDC38\uD83D"; +execResult = [ null, null, null, null ]; +lastIndexResult = [ , , , , , ]; +lastIndexExpected = [ 0, 1, 3, 4, ]; +ret = RegExp.prototype[Symbol.split].call(myRegExp, target); +assert.sameValue(arraySetterObserved, false); +assert.sameValue(JSON.stringify(ret), `["-\uD83D\uDC38\\udc38\\ud83d"]`); +assert.sameValue(log, + "get:constructor," + + "get:species," + + "get:flags," + + "call:constructor," + + "set:lastIndex,get:exec,call:exec," + + "set:lastIndex,get:exec,call:exec," + + "set:lastIndex,get:exec,call:exec," + + "set:lastIndex,get:exec,call:exec,"); + +// Trace unicode, match, same position and different position. +reset(); +flags = "u"; +expectedFlags = "uy"; +target = "-\uD83D\uDC38\uDC38\uD83D"; +var E = P(["", "X"]); +execResult = [ E, E, E, E, E, E, E ]; +lastIndexResult = [ , 0, 1, 1, 3, 3, 4, 4 ]; +lastIndexExpected = [ 0, 1, 1, 3, 3, 4, 4, ]; +ret = RegExp.prototype[Symbol.split].call(myRegExp, target); +assert.sameValue(arraySetterObserved, false); +assert.sameValue(JSON.stringify(ret), `["-","X","\uD83D\uDC38","X","\\udc38","X","\\ud83d"]`); +assert.sameValue(log, + "get:constructor," + + "get:species," + + "get:flags," + + "call:constructor," + + "set:lastIndex,get:exec,call:exec,get:lastIndex," + + "set:lastIndex,get:exec,call:exec,get:lastIndex," + + "get:result[length]," + + "get:result[1]," + + "set:lastIndex,get:exec,call:exec,get:lastIndex," + + "set:lastIndex,get:exec,call:exec,get:lastIndex," + + "get:result[length]," + + "get:result[1]," + + "set:lastIndex,get:exec,call:exec,get:lastIndex," + + "set:lastIndex,get:exec,call:exec,get:lastIndex," + + "get:result[length]," + + "get:result[1]," + + "set:lastIndex,get:exec,call:exec,get:lastIndex,"); + +stopObserve(); + diff --git a/test/staging/sm/RegExp/split.js b/test/staging/sm/RegExp/split.js new file mode 100644 index 0000000000..f83d5b6e70 --- /dev/null +++ b/test/staging/sm/RegExp/split.js @@ -0,0 +1,39 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-RegExp-shell.js, sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +var BUGNUMBER = 887016; +var summary = "Implement RegExp.prototype[@@split]."; + +print(BUGNUMBER + ": " + summary); + +assert.sameValue(RegExp.prototype[Symbol.split].name, "[Symbol.split]"); +assert.sameValue(RegExp.prototype[Symbol.split].length, 2); +var desc = Object.getOwnPropertyDescriptor(RegExp.prototype, Symbol.split); +assert.sameValue(desc.configurable, true); +assert.sameValue(desc.enumerable, false); +assert.sameValue(desc.writable, true); + +var re = /b/; +var v = re[Symbol.split]("abcAbcABC"); +assert.sameValue(JSON.stringify(v), `["a","cA","cABC"]`); + +re = /d/; +v = re[Symbol.split]("abcAbcABC"); +assert.sameValue(JSON.stringify(v), `["abcAbcABC"]`); + +re = /b/ig; +v = re[Symbol.split]("abcAbcABC"); +assert.sameValue(JSON.stringify(v), `["a","cA","cA","C"]`); + +re = /b/ig; +v = re[Symbol.split]("abcAbcABC", 2); +assert.sameValue(JSON.stringify(v), `["a","cA"]`); + diff --git a/test/staging/sm/RegExp/sticky.js b/test/staging/sm/RegExp/sticky.js new file mode 100644 index 0000000000..8e7ce5bc80 --- /dev/null +++ b/test/staging/sm/RegExp/sticky.js @@ -0,0 +1,135 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-RegExp-shell.js, sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +var BUGNUMBER = 773687; +var summary = 'sticky flag should not break assertion behavior.'; + +print(BUGNUMBER + ": " + summary); + +function test(re, text, expectations) { + // Sanity check for test data itself. + assert.sameValue(expectations.length, text.length + 1); + + for (var i = 0; i < expectations.length; i++) { + var result = expectations[i]; + + re.lastIndex = i; + var match = re.exec(text); + if (result === null) { + assert.sameValue(re.lastIndex, 0); + assert.sameValue(match, null); + } else { + assert.sameValue(re.lastIndex, result.lastIndex); + assert.sameValue(match !== null, true); + assert.sameValue(match.length, result.matches.length); + for (var j = 0; j < result.matches.length; j++) + assert.sameValue(match[j], result.matches[j]); + assert.sameValue(match.index, result.index); + } + } +} + +// simple text +test(/bc/y, "abcabd", [ + null, + { lastIndex: 3, matches: ["bc"], index: 1 }, + null, + null, + null, + null, + null, +]); + +// complex pattern +test(/bc|c|d/y, "abcabd", [ + null, + { lastIndex: 3, matches: ["bc"], index: 1 }, + { lastIndex: 3, matches: ["c"], index: 2 }, + null, + null, + { lastIndex: 6, matches: ["d"], index: 5 }, + null, +]); + +test(/.*(bc|c|d)/y, "abcabd", [ + { lastIndex: 6, matches: ["abcabd", "d"], index: 0 }, + { lastIndex: 6, matches: ["bcabd", "d"], index: 1 }, + { lastIndex: 6, matches: ["cabd", "d"], index: 2 }, + { lastIndex: 6, matches: ["abd", "d"], index: 3 }, + { lastIndex: 6, matches: ["bd", "d"], index: 4 }, + { lastIndex: 6, matches: ["d", "d"], index: 5 }, + null, +]); + +test(/.*?(bc|c|d)/y, "abcabd", [ + { lastIndex: 3, matches: ["abc", "bc"], index: 0 }, + { lastIndex: 3, matches: ["bc", "bc"], index: 1 }, + { lastIndex: 3, matches: ["c", "c"], index: 2 }, + { lastIndex: 6, matches: ["abd", "d"], index: 3 }, + { lastIndex: 6, matches: ["bd", "d"], index: 4 }, + { lastIndex: 6, matches: ["d", "d"], index: 5 }, + null, +]); + +test(/(bc|.*c|d)/y, "abcabd", [ + { lastIndex: 3, matches: ["abc", "abc"], index: 0 }, + { lastIndex: 3, matches: ["bc", "bc"], index: 1 }, + { lastIndex: 3, matches: ["c", "c"], index: 2 }, + null, + null, + { lastIndex: 6, matches: ["d", "d"], index: 5 }, + null, +]); + +// ^ assertions +test(/^/y, "abcabc", [ + { lastIndex: 0, matches: [""], index: 0 }, + null, + null, + null, + null, + null, + null, +]); + +test(/^a/my, "abc\nabc", [ + { lastIndex: 1, matches: ["a"], index: 0 }, + null, + null, + null, + { lastIndex: 5, matches: ["a"], index: 4 }, + null, + null, + null, +]); + +// \b assertions +test(/\b/y, "abc bc", [ + { lastIndex: 0, matches: [""], index: 0 }, + null, + null, + { lastIndex: 3, matches: [""], index: 3 }, + { lastIndex: 4, matches: [""], index: 4 }, + null, + { lastIndex: 6, matches: [""], index: 6 }, +]); + +// \B assertions +test(/\B/y, "abc bc", [ + null, + { lastIndex: 1, matches: [""], index: 1 }, + { lastIndex: 2, matches: [""], index: 2 }, + null, + null, + { lastIndex: 5, matches: [""], index: 5 }, + null, +]); + diff --git a/test/staging/sm/RegExp/test-emptyMatch.js b/test/staging/sm/RegExp/test-emptyMatch.js new file mode 100644 index 0000000000..f1051e5aff --- /dev/null +++ b/test/staging/sm/RegExp/test-emptyMatch.js @@ -0,0 +1,32 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-RegExp-shell.js, sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +var BUGNUMBER = 1322035; +var summary = 'RegExp.prototype.test should update lastIndex to correct position even if pattern starts with .*'; + +print(BUGNUMBER + ": " + summary); + +var regExp = /.*x?/g; +regExp.test('12345'); +assert.sameValue(regExp.lastIndex, 5); + +regExp = /.*x*/g; +regExp.test('12345'); +assert.sameValue(regExp.lastIndex, 5); + +regExp = /.*()/g; +regExp.test('12345'); +assert.sameValue(regExp.lastIndex, 5); + +regExp = /.*(x|)/g; +regExp.test('12345'); +assert.sameValue(regExp.lastIndex, 5); + diff --git a/test/staging/sm/RegExp/test-trailing.js b/test/staging/sm/RegExp/test-trailing.js new file mode 100644 index 0000000000..52949891f8 --- /dev/null +++ b/test/staging/sm/RegExp/test-trailing.js @@ -0,0 +1,40 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-RegExp-shell.js, sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +var BUGNUMBER = 1304737; +var summary = "Trailing .* should not be ignored on matchOnly match."; + +print(BUGNUMBER + ": " + summary); + +function test(r, lastIndexIsZero) { + r.lastIndex = 0; + r.test("foo"); + assert.sameValue(r.lastIndex, lastIndexIsZero ? 0 : 3); + + r.lastIndex = 0; + r.test("foo\nbar"); + assert.sameValue(r.lastIndex, lastIndexIsZero ? 0 : 3); + + var input = "foo" + ".bar".repeat(20000); + r.lastIndex = 0; + r.test(input); + assert.sameValue(r.lastIndex, lastIndexIsZero ? 0 : input.length); + + r.lastIndex = 0; + r.test(input + "\nbaz"); + assert.sameValue(r.lastIndex, lastIndexIsZero ? 0 : input.length); +} + +test(/f.*/, true); +test(/f.*/g, false); +test(/f.*/y, false); +test(/f.*/gy, false); + diff --git a/test/staging/sm/RegExp/toString.js b/test/staging/sm/RegExp/toString.js new file mode 100644 index 0000000000..2f81bf6917 --- /dev/null +++ b/test/staging/sm/RegExp/toString.js @@ -0,0 +1,51 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-RegExp-shell.js, sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +var BUGNUMBER = 1079919; +var summary = "Make RegExp.prototype.toString to be a generic function."; + +print(BUGNUMBER + ": " + summary); + +assert.sameValue(RegExp.prototype.toString(), "/(?:)/"); +assert.sameValue(/foo/.toString(), "/foo/"); +assert.sameValue(/foo/i.toString(), "/foo/i"); +assert.sameValue(/foo/gimy.toString(), "/foo/gimy"); +assert.sameValue(/foo/igym.toString(), "/foo/gimy"); +assert.sameValue(/\n\r/.toString(), "/\\n\\r/"); +assert.sameValue(/\u2028\u2029/.toString(), "/\\u2028\\u2029/"); +assert.sameValue(/\//.toString(), "/\\//"); +assert.sameValue(RegExp().toString(), "/(?:)/"); +assert.sameValue(RegExp("", "gimy").toString(), "/(?:)/gimy"); +assert.sameValue(RegExp("\n\r").toString(), "/\\n\\r/"); +assert.sameValue(RegExp("\u2028\u2029").toString(), "/\\u2028\\u2029/"); +assert.sameValue(RegExp("/").toString(), "/\\//"); + +assertThrowsInstanceOf(() => RegExp.prototype.toString.call(), TypeError); +assertThrowsInstanceOf(() => RegExp.prototype.toString.call(1), TypeError); +assertThrowsInstanceOf(() => RegExp.prototype.toString.call(""), TypeError); +assert.sameValue(RegExp.prototype.toString.call({}), "/undefined/undefined"); +assert.sameValue(RegExp.prototype.toString.call({ source:"foo", flags:"bar" }), "/foo/bar"); + +var a = []; +var p = new Proxy({}, { + get(that, name) { + a.push(name); + return { + toString() { + a.push(name + "-tostring"); + return name; + } + }; + } +}); +assert.sameValue(RegExp.prototype.toString.call(p), "/source/flags"); +assert.sameValue(a.join(","), "source,source-tostring,flags,flags-tostring"); + diff --git a/test/staging/sm/RegExp/unicode-back-reference.js b/test/staging/sm/RegExp/unicode-back-reference.js new file mode 100644 index 0000000000..f5dd4ff3ed --- /dev/null +++ b/test/staging/sm/RegExp/unicode-back-reference.js @@ -0,0 +1,48 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [compareArray.js, sm/non262-RegExp-shell.js, sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +var BUGNUMBER = 1135377; +var summary = "Implement RegExp unicode flag -- back reference should not match lead surrogate that has corresponding trail surrogate."; + +print(BUGNUMBER + ": " + summary); + +// The last character of back reference is not a surrogate. +assert.compareArray(/foo(.+)bar\1/u.exec("fooAbarA\uDC00"), + ["fooAbarA", "A"]); +assert.compareArray(/foo(.+)bar\1/u.exec("fooAbarA\uD834"), + ["fooAbarA", "A"]); +assert.compareArray(/foo(.+)bar\1/u.exec("fooAbarAA"), + ["fooAbarA", "A"]); +assert.compareArray(/foo(.+)bar\1/u.exec("fooAbarA"), + ["fooAbarA", "A"]); + +// The last character of back reference is a lead surrogate. +assert.sameValue(/foo(.+)bar\1/u.exec("foo\uD834bar\uD834\uDC00"), null); +assert.compareArray(/foo(.+)bar\1/u.exec("foo\uD834bar\uD834\uD834"), + ["foo\uD834bar\uD834", "\uD834"]); +assert.compareArray(/foo(.+)bar\1/u.exec("foo\uD834bar\uD834A"), + ["foo\uD834bar\uD834", "\uD834"]); +assert.compareArray(/foo(.+)bar\1/u.exec("foo\uD834bar\uD834"), + ["foo\uD834bar\uD834", "\uD834"]); + +// The last character of back reference is a trail surrogate. +assert.compareArray(/foo(.+)bar\1/u.exec("foo\uDC00bar\uDC00\uDC00"), + ["foo\uDC00bar\uDC00", "\uDC00"]); +assert.compareArray(/foo(.+)bar\1/u.exec("foo\uDC00bar\uDC00\uD834"), + ["foo\uDC00bar\uDC00", "\uDC00"]); +assert.compareArray(/foo(.+)bar\1/u.exec("foo\uDC00bar\uDC00A"), + ["foo\uDC00bar\uDC00", "\uDC00"]); +assert.compareArray(/foo(.+)bar\1/u.exec("foo\uDC00bar\uDC00"), + ["foo\uDC00bar\uDC00", "\uDC00"]); + +// Pattern should not match to surrogate pair partially. +assert.sameValue(/^(.+)\1$/u.exec("\uDC00foobar\uD834\uDC00foobar\uD834"), null); + diff --git a/test/staging/sm/RegExp/unicode-braced.js b/test/staging/sm/RegExp/unicode-braced.js new file mode 100644 index 0000000000..d57a5cdcbe --- /dev/null +++ b/test/staging/sm/RegExp/unicode-braced.js @@ -0,0 +1,175 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [compareArray.js, sm/non262-RegExp-shell.js, sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +var BUGNUMBER = 1135377; +var summary = "Implement RegExp unicode flag -- braced pattern in RegExpUnicodeEscapeSequence."; + +print(BUGNUMBER + ": " + summary); + +// ==== standalone ==== + +assert.compareArray(/\u{41}/u.exec("ABC"), + ["A"]); +assert.compareArray(/\u{41}/.exec("ABC" + "u".repeat(41)), + ["u".repeat(41)]); + +assert.compareArray(/\u{4A}/u.exec("JKL"), + ["J"]); +assert.compareArray(/\u{4A}/.exec("JKLu{4A}"), + ["u{4A}"]); + +assert.compareArray(/\u{1F438}/u.exec("\u{1F438}"), + ["\u{1F438}"]); +assert.compareArray(/\u{1F438}/.exec("u{1F438}"), + ["u{1F438}"]); + +assert.compareArray(/\u{0}/u.exec("\u{0}"), + ["\u{0}"]); +assert.compareArray(/\u{10FFFF}/u.exec("\u{10FFFF}"), + ["\u{10FFFF}"]); +assert.compareArray(/\u{10ffff}/u.exec("\u{10FFFF}"), + ["\u{10FFFF}"]); + +// leading 0 +assert.compareArray(/\u{0000000000000000000000}/u.exec("\u{0}"), + ["\u{0}"]); +assert.compareArray(/\u{000000000000000010FFFF}/u.exec("\u{10FFFF}"), + ["\u{10FFFF}"]); + +// RegExp constructor +assert.compareArray(new RegExp("\\u{0}", "u").exec("\u{0}"), + ["\u{0}"]); +assert.compareArray(new RegExp("\\u{41}", "u").exec("ABC"), + ["A"]); +assert.compareArray(new RegExp("\\u{1F438}", "u").exec("\u{1F438}"), + ["\u{1F438}"]); +assert.compareArray(new RegExp("\\u{10FFFF}", "u").exec("\u{10FFFF}"), + ["\u{10FFFF}"]); + +assert.compareArray(new RegExp("\\u{0000000000000000}", "u").exec("\u{0}"), + ["\u{0}"]); + +assert.compareArray(eval(`/\\u{${"0".repeat(Math.pow(2, 24)) + "1234"}}/u`).exec("\u{1234}"), + ["\u{1234}"]); +assert.compareArray(new RegExp(`\\u{${"0".repeat(Math.pow(2, 24)) + "1234"}}`, "u").exec("\u{1234}"), + ["\u{1234}"]); + +// ==== ? ==== + +assert.compareArray(/\u{1F438}?/u.exec("\u{1F438}"), + ["\u{1F438}"]); +assert.compareArray(/\u{1F438}?/u.exec(""), + [""]); + +// lead-only target +assert.compareArray(/\u{1F438}?/u.exec("\uD83D"), + [""]); + +// RegExp constructor +assert.compareArray(new RegExp("\\u{1F438}?", "u").exec("\u{1F438}"), + ["\u{1F438}"]); +assert.compareArray(new RegExp("\\u{1F438}?", "u").exec(""), + [""]); +assert.compareArray(new RegExp("\\u{1F438}?", "u").exec("\uD83D"), + [""]); + +// ==== + ==== + +assert.compareArray(/\u{1F438}+/u.exec("\u{1F438}"), + ["\u{1F438}"]); +assert.compareArray(/\u{1F438}+/u.exec("\u{1F438}\u{1F438}"), + ["\u{1F438}\u{1F438}"]); +assert.sameValue(/\u{1F438}+/u.exec(""), + null); + +// lead-only target +assert.sameValue(/\u{1F438}+/u.exec("\uD83D"), + null); +assert.compareArray(/\u{1F438}+/u.exec("\uD83D\uDC38\uDC38"), + ["\uD83D\uDC38"]); + +// ==== * ==== + +assert.compareArray(/\u{1F438}*/u.exec("\u{1F438}"), + ["\u{1F438}"]); +assert.compareArray(/\u{1F438}*/u.exec("\u{1F438}\u{1F438}"), + ["\u{1F438}\u{1F438}"]); +assert.compareArray(/\u{1F438}*/u.exec(""), + [""]); + +// lead-only target +assert.compareArray(/\u{1F438}*/u.exec("\uD83D"), + [""]); +assert.compareArray(/\u{1F438}*/u.exec("\uD83D\uDC38\uDC38"), + ["\uD83D\uDC38"]); + +// ==== lead-only ==== + +// match only non-surrogate pair +assert.compareArray(/\u{D83D}/u.exec("\uD83D\uDBFF"), + ["\uD83D"]); +assert.sameValue(/\u{D83D}/u.exec("\uD83D\uDC00"), + null); +assert.sameValue(/\u{D83D}/u.exec("\uD83D\uDFFF"), + null); +assert.compareArray(/\u{D83D}/u.exec("\uD83D\uE000"), + ["\uD83D"]); + +// match before non-tail char +assert.compareArray(/\u{D83D}/u.exec("\uD83D"), + ["\uD83D"]); +assert.compareArray(/\u{D83D}/u.exec("\uD83DA"), + ["\uD83D"]); + +// ==== trail-only ==== + +// match only non-surrogate pair +assert.compareArray(/\u{DC38}/u.exec("\uD7FF\uDC38"), + ["\uDC38"]); +assert.sameValue(/\u{DC38}/u.exec("\uD800\uDC38"), + null); +assert.sameValue(/\u{DC38}/u.exec("\uDBFF\uDC38"), + null); +assert.compareArray(/\u{DC38}/u.exec("\uDC00\uDC38"), + ["\uDC38"]); + +// match after non-lead char +assert.compareArray(/\u{DC38}/u.exec("\uDC38"), + ["\uDC38"]); +assert.compareArray(/\u{DC38}/u.exec("A\uDC38"), + ["\uDC38"]); + +// ==== wrong patterns ==== + +assertThrowsInstanceOf(() => eval(`/\\u{-1}/u`), SyntaxError); +assertThrowsInstanceOf(() => eval(`/\\u{0.0}/u`), SyntaxError); +assertThrowsInstanceOf(() => eval(`/\\u{G}/u`), SyntaxError); +assertThrowsInstanceOf(() => eval(`/\\u{}/u`), SyntaxError); +assertThrowsInstanceOf(() => eval(`/\\u{{/u`), SyntaxError); +assertThrowsInstanceOf(() => eval(`/\\u{/u`), SyntaxError); +assertThrowsInstanceOf(() => eval(`/\\u{110000}/u`), SyntaxError); +assertThrowsInstanceOf(() => eval(`/\\u{00110000}/u`), SyntaxError); +assertThrowsInstanceOf(() => eval(`/\\u{100000000000000000000000000000}/u`), SyntaxError); +assertThrowsInstanceOf(() => eval(`/\\u{FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF}/u`), SyntaxError); +assertThrowsInstanceOf(() => eval(`/\\u{ FFFF}/u`), SyntaxError); +assertThrowsInstanceOf(() => eval(`/\\u{FFFF }/u`), SyntaxError); +assertThrowsInstanceOf(() => eval(`/\\u{FF FF}/u`), SyntaxError); +assertThrowsInstanceOf(() => eval(`/\\u{F F F F}/u`), SyntaxError); +assertThrowsInstanceOf(() => eval(`/\\u{100000001}/u`), SyntaxError); + +// surrogate pair with braced +assert.sameValue(/\u{D83D}\u{DC38}+/u.exec("\uD83D\uDC38\uDC38"), + null); +assert.sameValue(/\uD83D\u{DC38}+/u.exec("\uD83D\uDC38\uDC38"), + null); +assert.sameValue(/\u{D83D}\uDC38+/u.exec("\uD83D\uDC38\uDC38"), + null); + diff --git a/test/staging/sm/RegExp/unicode-character-class-escape.js b/test/staging/sm/RegExp/unicode-character-class-escape.js new file mode 100644 index 0000000000..a16e97ddec --- /dev/null +++ b/test/staging/sm/RegExp/unicode-character-class-escape.js @@ -0,0 +1,84 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [compareArray.js, sm/non262-RegExp-shell.js, sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +var BUGNUMBER = 1135377; +var summary = "Implement RegExp unicode flag -- CharacterClassEscape."; + +print(BUGNUMBER + ": " + summary); + +// BMP + +assert.compareArray(/\d+/u.exec("abcxyzABCXYZ0123456789_\t\r\n\v\x0c\xa0\uFEFF*"), + ["0123456789"]); +assert.compareArray(/\D+/u.exec("abcxyzABCXYZ0123456789_\t\r\n\v\x0c\xa0\uFEFF*"), + ["abcxyzABCXYZ"]); + +assert.compareArray(/\s+/u.exec("abcxyzABCXYZ0123456789_\t\r\n\v\x0c\xa0\uFEFF*"), + ["\t\r\n\v\x0c\xa0\uFEFF"]); +assert.compareArray(/\S+/u.exec("abcxyzABCXYZ0123456789_\t\r\n\v\x0c\xa0\uFEFF*"), + ["abcxyzABCXYZ0123456789_"]); + +assert.compareArray(/\w+/u.exec("abcxyzABCXYZ0123456789_\t\r\n\v\x0c\xa0\uFEFF*"), + ["abcxyzABCXYZ0123456789_"]); +assert.compareArray(/\W+/u.exec("abcxyzABCXYZ0123456789_\t\r\n\v\x0c\xa0\uFEFF*"), + ["\t\r\n\v\x0c\xa0\uFEFF*"]); + +assert.compareArray(/\n+/u.exec("abcxyzABCXYZ0123456789_\t\r\n\v\x0c\xa0\uFEFF*"), + ["\n"]); + +assert.compareArray(/[\d]+/u.exec("abcxyzABCXYZ0123456789_\t\r\n\v\x0c\xa0\uFEFF*"), + ["0123456789"]); +assert.compareArray(/[\D]+/u.exec("abcxyzABCXYZ0123456789_\t\r\n\v\x0c\xa0\uFEFF*"), + ["abcxyzABCXYZ"]); + +assert.compareArray(/[\s]+/u.exec("abcxyzABCXYZ0123456789_\t\r\n\v\x0c\xa0\uFEFF*"), + ["\t\r\n\v\x0c\xa0\uFEFF"]); +assert.compareArray(/[\S]+/u.exec("abcxyzABCXYZ0123456789_\t\r\n\v\x0c\xa0\uFEFF*"), + ["abcxyzABCXYZ0123456789_"]); + +assert.compareArray(/[\w]+/u.exec("abcxyzABCXYZ0123456789_\t\r\n\v\x0c\xa0\uFEFF*"), + ["abcxyzABCXYZ0123456789_"]); +assert.compareArray(/[\W]+/u.exec("abcxyzABCXYZ0123456789_\t\r\n\v\x0c\xa0\uFEFF*"), + ["\t\r\n\v\x0c\xa0\uFEFF*"]); + +assert.compareArray(/[\n]+/u.exec("abcxyzABCXYZ0123456789_\t\r\n\v\x0c\xa0\uFEFF*"), + ["\n"]); + +// non-BMP + +function testNonBMP(re) { + assert.compareArray(re.exec("\uD83D\uDBFF"), + ["\uD83D"]); + assert.compareArray(re.exec("\uD83D\uDC00"), + ["\uD83D\uDC00"]); + assert.compareArray(re.exec("\uD83D\uDFFF"), + ["\uD83D\uDFFF"]); + assert.compareArray(re.exec("\uD83D\uE000"), + ["\uD83D"]); + + assert.compareArray(re.exec("\uD7FF\uDC38"), + ["\uD7FF"]); + assert.compareArray(re.exec("\uD800\uDC38"), + ["\uD800\uDC38"]); + assert.compareArray(re.exec("\uDBFF\uDC38"), + ["\uDBFF\uDC38"]); + assert.compareArray(re.exec("\uDC00\uDC38"), + ["\uDC00"]); +} + +testNonBMP(/\D/u); +testNonBMP(/\S/u); +testNonBMP(/\W/u); + +testNonBMP(/[\D]/u); +testNonBMP(/[\S]/u); +testNonBMP(/[\W]/u); + diff --git a/test/staging/sm/RegExp/unicode-class-braced.js b/test/staging/sm/RegExp/unicode-class-braced.js new file mode 100644 index 0000000000..0b582ffd03 --- /dev/null +++ b/test/staging/sm/RegExp/unicode-class-braced.js @@ -0,0 +1,245 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [compareArray.js, sm/non262-RegExp-shell.js, sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +var BUGNUMBER = 1135377; +var summary = "Implement RegExp unicode flag -- braced pattern in RegExpUnicodeEscapeSequence in CharacterClass."; + +print(BUGNUMBER + ": " + summary); + +// ==== standalone ==== + +assert.compareArray(/[\u{41}]/u.exec("ABC"), + ["A"]); + +assert.compareArray(/[\u{1F438}]/u.exec("\u{1F438}"), + ["\u{1F438}"]); +assert.sameValue(/[\u{1F438}]/u.exec("\uD83D"), + null); +assert.sameValue(/[\u{1F438}]/u.exec("\uDC38"), + null); + +assert.compareArray(/[\u{0}]/u.exec("\u{0}"), + ["\u{0}"]); +assert.compareArray(/[\u{10FFFF}]/u.exec("\u{10FFFF}"), + ["\u{10FFFF}"]); +assert.compareArray(/[\u{10ffff}]/u.exec("\u{10FFFF}"), + ["\u{10FFFF}"]); + +// leading 0 +assert.compareArray(/[\u{0000000000000000000000}]/u.exec("\u{0}"), + ["\u{0}"]); +assert.compareArray(/[\u{000000000000000010FFFF}]/u.exec("\u{10FFFF}"), + ["\u{10FFFF}"]); + +// RegExp constructor +assert.compareArray(new RegExp("[\\u{0}]", "u").exec("\u{0}"), + ["\u{0}"]); +assert.compareArray(new RegExp("[\\u{41}]", "u").exec("ABC"), + ["A"]); +assert.compareArray(new RegExp("[\\u{1F438}]", "u").exec("\u{1F438}"), + ["\u{1F438}"]); +assert.compareArray(new RegExp("[\\u{10FFFF}]", "u").exec("\u{10FFFF}"), + ["\u{10FFFF}"]); + +assert.compareArray(new RegExp("[\\u{0000000000000000}]", "u").exec("\u{0}"), + ["\u{0}"]); + +assert.compareArray(eval(`/[\\u{${"0".repeat(Math.pow(2, 24)) + "1234"}}]/u`).exec("\u{1234}"), + ["\u{1234}"]); +assert.compareArray(new RegExp(`[\\u{${"0".repeat(Math.pow(2, 24)) + "1234"}}]`, "u").exec("\u{1234}"), + ["\u{1234}"]); + +// ==== BMP + non-BMP ==== + +assert.compareArray(/[A\u{1F438}]/u.exec("A\u{1F438}"), + ["A"]); +assert.compareArray(/[A\u{1F438}]/u.exec("\u{1F438}A"), + ["\u{1F438}"]); + +// lead-only target +assert.compareArray(/[A\u{1F438}]/u.exec("\uD83DA"), + ["A"]); +assert.sameValue(/[A\u{1F438}]/u.exec("\uD83D"), + null); + +// + +assert.compareArray(/[A\u{1F438}]+/u.exec("\u{1F438}A\u{1F438}A"), + ["\u{1F438}A\u{1F438}A"]); + +// trail surrogate + lead surrogate +assert.compareArray(/[A\u{1F438}]+/u.exec("\uD83D\uDC38A\uDC38\uD83DA"), + ["\uD83D\uDC38A"]); + +// ==== non-BMP + non-BMP ==== + +assert.compareArray(/[\u{1F418}\u{1F438}]/u.exec("\u{1F418}\u{1F438}"), + ["\u{1F418}"]); + +assert.compareArray(/[\u{1F418}\u{1F438}]+/u.exec("\u{1F418}\u{1F438}"), + ["\u{1F418}\u{1F438}"]); +assert.compareArray(/[\u{1F418}\u{1F438}]+/u.exec("\u{1F418}\uDC38\uD83D"), + ["\u{1F418}"]); +assert.compareArray(/[\u{1F418}\u{1F438}]+/u.exec("\uDC18\uD83D\u{1F438}"), + ["\u{1F438}"]); +assert.compareArray(/[\u{1F418}\u{1F438}]+/u.exec("\uDC18\u{1F438}\uD83D"), + ["\u{1F438}"]); + +// trail surrogate + lead surrogate +assert.sameValue(/[\u{1F418}\u{1F438}]+/u.exec("\uDC18\uDC38\uD83D\uD83D"), + null); + +// ==== non-BMP + non-BMP range (from_lead == to_lead) ==== + +assert.compareArray(/[\u{1F418}-\u{1F438}]/u.exec("\u{1F418}"), + ["\u{1F418}"]); +assert.compareArray(/[\u{1F418}-\u{1F438}]/u.exec("\u{1F438}"), + ["\u{1F438}"]); +assert.compareArray(/[\u{1F418}-\u{1F438}]/u.exec("\u{1F427}"), + ["\u{1F427}"]); + +assert.sameValue(/[\u{1F418}-\u{1F438}]/u.exec("\u{1F417}"), + null); +assert.sameValue(/[\u{1F418}-\u{1F438}]/u.exec("\u{1F439}"), + null); + +// ==== non-BMP + non-BMP range (from_lead + 1 == to_lead) ==== + +assert.compareArray(/[\u{1F17C}-\u{1F438}]/u.exec("\uD83C\uDD7C"), + ["\uD83C\uDD7C"]); +assert.compareArray(/[\u{1F17C}-\u{1F438}]/u.exec("\u{1F438}"), + ["\u{1F438}"]); +assert.compareArray(/[\u{1F17C}-\u{1F438}]/u.exec("\uD83C\uDF99"), + ["\uD83C\uDF99"]); +assert.compareArray(/[\u{1F17C}-\u{1F438}]/u.exec("\uD83D\uDC00"), + ["\uD83D\uDC00"]); + +assert.sameValue(/[\u{1F17C}-\u{1F438}]/u.exec("\uD83C\uDD7B"), + null); +assert.sameValue(/[\u{1F17C}-\u{1F438}]/u.exec("\uD83C\uE000"), + null); +assert.sameValue(/[\u{1F17C}-\u{1F438}]/u.exec("\uD83D\uDB99"), + null); +assert.sameValue(/[\u{1F17C}-\u{1F438}]/u.exec("\uD83D\uDC39"), + null); + +// ==== non-BMP + non-BMP range (from_lead + 2 == to_lead) ==== + +assert.compareArray(/[\u{1F17C}-\u{1F829}]/u.exec("\uD83C\uDD7C"), + ["\uD83C\uDD7C"]); +assert.compareArray(/[\u{1F17C}-\u{1F829}]/u.exec("\uD83E\uDC29"), + ["\uD83E\uDC29"]); + +assert.compareArray(/[\u{1F17C}-\u{1F829}]/u.exec("\uD83C\uDF99"), + ["\uD83C\uDF99"]); +assert.compareArray(/[\u{1F17C}-\u{1F829}]/u.exec("\uD83D\uDC00"), + ["\uD83D\uDC00"]); +assert.compareArray(/[\u{1F17C}-\u{1F829}]/u.exec("\uD83D\uDF99"), + ["\uD83D\uDF99"]); +assert.compareArray(/[\u{1F17C}-\u{1F829}]/u.exec("\uD83E\uDC00"), + ["\uD83E\uDC00"]); + +assert.sameValue(/[\u{1F17C}-\u{1F829}]/u.exec("\uD83C\uDD7B"), + null); +assert.sameValue(/[\u{1F17C}-\u{1F829}]/u.exec("\uD83C\uE000"), + null); +assert.sameValue(/[\u{1F17C}-\u{1F829}]/u.exec("\uD83D\uDB99"), + null); +assert.sameValue(/[\u{1F17C}-\u{1F829}]/u.exec("\uD83D\uE000"), + null); +assert.sameValue(/[\u{1F17C}-\u{1F829}]/u.exec("\uD83E\uDB99"), + null); +assert.sameValue(/[\u{1F17C}-\u{1F829}]/u.exec("\uD83E\uDC30"), + null); + +// ==== non-BMP + non-BMP range (other) ==== + +assert.compareArray(/[\u{1D164}-\u{1F438}]/u.exec("\uD834\uDD64"), + ["\uD834\uDD64"]); +assert.compareArray(/[\u{1D164}-\u{1F438}]/u.exec("\u{1F438}"), + ["\u{1F438}"]); +assert.compareArray(/[\u{1D164}-\u{1F438}]/u.exec("\uD836\uDF99"), + ["\uD836\uDF99"]); +assert.compareArray(/[\u{1D164}-\u{1F438}]/u.exec("\uD838\uDC00"), + ["\uD838\uDC00"]); + +assert.sameValue(/[\u{1D164}-\u{1F438}]/u.exec("\uD834\uDD63"), + null); +assert.sameValue(/[\u{1D164}-\u{1F438}]/u.exec("\uD83D\uDC39"), + null); + +assert.sameValue(/[\u{1D164}-\u{1F438}]/u.exec("\uD834\uE000"), + null); +assert.sameValue(/[\u{1D164}-\u{1F438}]/u.exec("\uD835\uDB99"), + null); +assert.sameValue(/[\u{1D164}-\u{1F438}]/u.exec("\uD83C\uE000"), + null); +assert.sameValue(/[\u{1D164}-\u{1F438}]/u.exec("\uD83D\uDB99"), + null); + +// ==== BMP + non-BMP range ==== + +assert.compareArray(/[\u{42}-\u{1F438}]/u.exec("B"), + ["B"]); +assert.compareArray(/[\u{42}-\u{1F438}]/u.exec("C"), + ["C"]); +assert.compareArray(/[\u{42}-\u{1F438}]/u.exec("\uFFFF"), + ["\uFFFF"]); +assert.compareArray(/[\u{42}-\u{1F438}]/u.exec("\uD800\uDC00"), + ["\uD800\uDC00"]); + +assert.compareArray(/[\u{42}-\u{1F438}]/u.exec("\uD800"), + ["\uD800"]); +assert.compareArray(/[\u{42}-\u{1F438}]/u.exec("\uDBFF"), + ["\uDBFF"]); +assert.compareArray(/[\u{42}-\u{1F438}]/u.exec("\uDC00"), + ["\uDC00"]); +assert.compareArray(/[\u{42}-\u{1F438}]/u.exec("\uDFFF"), + ["\uDFFF"]); + +assert.compareArray(/[\u{42}-\u{1F438}]/u.exec("\uD83D"), + ["\uD83D"]); +assert.compareArray(/[\u{42}-\u{1F438}]/u.exec("\uDC38"), + ["\uDC38"]); + +assert.compareArray(/[\u{42}-\u{1F438}]/u.exec("\uD83D\uDBFF"), + ["\uD83D"]); +assert.compareArray(/[\u{42}-\u{1F438}]/u.exec("\uD83D\uDC00"), + ["\uD83D\uDC00"]); +assert.compareArray(/[\u{42}-\u{1F438}]/u.exec("\uD83D\uDC38"), + ["\uD83D\uDC38"]); +assert.sameValue(/[\u{42}-\u{1F438}]/u.exec("\uD83D\uDC39"), + null); +assert.sameValue(/[\u{42}-\u{1F438}]/u.exec("\uD83D\uDFFF"), + null); +assert.compareArray(/[\u{42}-\u{1F438}]/u.exec("\uD83D\uE000"), + ["\uD83D"]); + +assert.sameValue(/[\u{42}-\u{1F438}]/u.exec("A"), + null); + +// ==== wrong patterns ==== + +assertThrowsInstanceOf(() => eval(`/[\\u{-1}]/u`), SyntaxError); +assertThrowsInstanceOf(() => eval(`/[\\u{0.0}]/u`), SyntaxError); +assertThrowsInstanceOf(() => eval(`/[\\u{G}]/u`), SyntaxError); +assertThrowsInstanceOf(() => eval(`/[\\u{}]/u`), SyntaxError); +assertThrowsInstanceOf(() => eval(`/[\\u{{]/u`), SyntaxError); +assertThrowsInstanceOf(() => eval(`/[\\u{]/u`), SyntaxError); +assertThrowsInstanceOf(() => eval(`/[\\u{110000}]/u`), SyntaxError); +assertThrowsInstanceOf(() => eval(`/[\\u{00110000}]/u`), SyntaxError); +assertThrowsInstanceOf(() => eval(`/[\\u{100000000000000000000000000000}]/u`), SyntaxError); +assertThrowsInstanceOf(() => eval(`/[\\u{FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF}]/u`), SyntaxError); +assertThrowsInstanceOf(() => eval(`/[\\u{ FFFF}]/u`), SyntaxError); +assertThrowsInstanceOf(() => eval(`/[\\u{FFFF }]/u`), SyntaxError); +assertThrowsInstanceOf(() => eval(`/[\\u{FF FF}]/u`), SyntaxError); +assertThrowsInstanceOf(() => eval(`/[\\u{F F F F}]/u`), SyntaxError); +assertThrowsInstanceOf(() => eval(`/[\\u{100000001}]/u`), SyntaxError); + diff --git a/test/staging/sm/RegExp/unicode-class-empty.js b/test/staging/sm/RegExp/unicode-class-empty.js new file mode 100644 index 0000000000..6badbaa4f1 --- /dev/null +++ b/test/staging/sm/RegExp/unicode-class-empty.js @@ -0,0 +1,34 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [compareArray.js, sm/non262-RegExp-shell.js, sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +var BUGNUMBER = 1135377; +var summary = "Implement RegExp unicode flag -- empty class should not match anything."; + +print(BUGNUMBER + ": " + summary); + +assert.sameValue(/[]/u.exec("A"), + null); +assert.sameValue(/[]/u.exec("\uD83D"), + null); +assert.sameValue(/[]/u.exec("\uDC38"), + null); +assert.sameValue(/[]/u.exec("\uD83D\uDC38"), + null); + +assert.compareArray(/[^]/u.exec("A"), + ["A"]); +assert.compareArray(/[^]/u.exec("\uD83D"), + ["\uD83D"]); +assert.compareArray(/[^]/u.exec("\uDC38"), + ["\uDC38"]); +assert.compareArray(/[^]/u.exec("\uD83D\uDC38"), + ["\uD83D\uDC38"]); + diff --git a/test/staging/sm/RegExp/unicode-class-ignoreCase.js b/test/staging/sm/RegExp/unicode-class-ignoreCase.js new file mode 100644 index 0000000000..fb7f3bd899 --- /dev/null +++ b/test/staging/sm/RegExp/unicode-class-ignoreCase.js @@ -0,0 +1,38 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [compareArray.js, sm/non262-RegExp-shell.js, sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ + +var BUGNUMBER = 1135377; +var summary = "Implement RegExp unicode flag -- ignoreCase flag for CharacterClass."; + +print(BUGNUMBER + ": " + summary); + +assert.compareArray(/[ABC]+/iu.exec("DCBAabcd"), + ["CBAabc"]); + +assert.compareArray(/[A\u{10401}]+/iu.exec("A\u{10401}a\u{10429}"), + ["A\u{10401}a\u{10429}"]); + +assert.compareArray(/[\u{10401}-\u{10404}\u{10408}-\u{1040B}]+/iu.exec("\u{10400}\u{10401}\u{10402}\u{10403}\u{10404}\u{10408}\u{10409}\u{1040A}\u{1040B}\u{1040C}"), + ["\u{10401}\u{10402}\u{10403}\u{10404}\u{10408}\u{10409}\u{1040A}\u{1040B}"]); +assert.compareArray(/[\u{10401}-\u{10404}\u{10408}-\u{1040B}]+/iu.exec("\u{10428}\u{10429}\u{1042A}\u{1042B}\u{1042C}\u{10430}\u{10431}\u{10432}\u{10433}\u{10434}"), + ["\u{10429}\u{1042A}\u{1042B}\u{1042C}\u{10430}\u{10431}\u{10432}\u{10433}"]); + +assert.compareArray(/[\u{10429}-\u{1042C}\u{10430}-\u{10433}]+/iu.exec("\u{10400}\u{10401}\u{10402}\u{10403}\u{10404}\u{10408}\u{10409}\u{1040A}\u{1040B}\u{1040C}"), + ["\u{10401}\u{10402}\u{10403}\u{10404}\u{10408}\u{10409}\u{1040A}\u{1040B}"]); +assert.compareArray(/[\u{10429}-\u{1042C}\u{10430}-\u{10433}]+/iu.exec("\u{10428}\u{10429}\u{1042A}\u{1042B}\u{1042C}\u{10430}\u{10431}\u{10432}\u{10433}\u{10434}"), + ["\u{10429}\u{1042A}\u{1042B}\u{1042C}\u{10430}\u{10431}\u{10432}\u{10433}"]); + +assert.compareArray(/[\u{10401}-\u{10404}\u{10430}-\u{10433}]+/iu.exec("\u{10400}\u{10401}\u{10402}\u{10403}\u{10404}\u{10408}\u{10409}\u{1040A}\u{1040B}\u{1040C}"), + ["\u{10401}\u{10402}\u{10403}\u{10404}\u{10408}\u{10409}\u{1040A}\u{1040B}"]); +assert.compareArray(/[\u{10401}-\u{10404}\u{10430}-\u{10433}]+/iu.exec("\u{10428}\u{10429}\u{1042A}\u{1042B}\u{1042C}\u{10430}\u{10431}\u{10432}\u{10433}\u{10434}"), + ["\u{10429}\u{1042A}\u{1042B}\u{1042C}\u{10430}\u{10431}\u{10432}\u{10433}"]); + diff --git a/test/staging/sm/RegExp/unicode-class-lead-trail.js b/test/staging/sm/RegExp/unicode-class-lead-trail.js new file mode 100644 index 0000000000..113baeee2b --- /dev/null +++ b/test/staging/sm/RegExp/unicode-class-lead-trail.js @@ -0,0 +1,151 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [compareArray.js, sm/non262-RegExp-shell.js, sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +var BUGNUMBER = 1135377; +var summary = "Implement RegExp unicode flag -- lead and trail pattern in RegExpUnicodeEscapeSequence in CharacterClass."; + +print(BUGNUMBER + ": " + summary); + +// ==== standalone ==== + +assert.compareArray(/[\uD83D\uDC38]/u.exec("\uD83D\uDC38"), + ["\uD83D\uDC38"]); +assert.sameValue(/[\uD83D\uDC38]/u.exec("\uD83D"), + null); +assert.sameValue(/[\uD83D\uDC38]/u.exec("\uDC38"), + null); + +// no unicode flag +assert.compareArray(/[\uD83D\uDC38]/.exec("\uD83D\uDC38"), + ["\uD83D"]); +assert.compareArray(/[\uD83D\uDC38]/.exec("\uD83D"), + ["\uD83D"]); +assert.compareArray(/[\uD83D\uDC38]/.exec("\uDC38"), + ["\uDC38"]); + +// RegExp constructor +assert.compareArray(new RegExp("[\uD83D\uDC38]", "u").exec("\uD83D\uDC38"), + ["\uD83D\uDC38"]); +assert.sameValue(new RegExp("[\uD83D\uDC38]", "u").exec("\uD83D"), + null); +assert.sameValue(new RegExp("[\uD83D\uDC38]", "u").exec("\uDC38"), + null); + +// RegExp constructor, no unicode flag +assert.compareArray(new RegExp("[\uD83D\uDC38]", "").exec("\uD83D\uDC38"), + ["\uD83D"]); +assert.compareArray(new RegExp("[\uD83D\uDC38]", "").exec("\uD83D"), + ["\uD83D"]); +assert.compareArray(new RegExp("[\uD83D\uDC38]", "").exec("\uDC38"), + ["\uDC38"]); + +// ==== lead-only ==== + +// match only non-surrogate pair +assert.compareArray(/[\uD83D]/u.exec("\uD83D\uDBFF"), + ["\uD83D"]); +assert.sameValue(/[\uD83D]/u.exec("\uD83D\uDC00"), + null); +assert.sameValue(/[\uD83D]/u.exec("\uD83D\uDFFF"), + null); +assert.compareArray(/[\uD83D]/u.exec("\uD83D\uE000"), + ["\uD83D"]); + +// match before non-tail char +assert.compareArray(/[\uD83D]/u.exec("\uD83D"), + ["\uD83D"]); +assert.compareArray(/[\uD83D]/u.exec("\uD83DA"), + ["\uD83D"]); + +// no unicode flag +assert.compareArray(/[\uD83D]/.exec("\uD83D\uDBFF"), + ["\uD83D"]); +assert.compareArray(/[\uD83D]/.exec("\uD83D\uDC00"), + ["\uD83D"]); +assert.compareArray(/[\uD83D]/.exec("\uD83D\uDFFF"), + ["\uD83D"]); +assert.compareArray(/[\uD83D]/.exec("\uD83D\uE000"), + ["\uD83D"]); +assert.compareArray(/[\uD83D]/.exec("\uD83D"), + ["\uD83D"]); +assert.compareArray(/[\uD83D]/.exec("\uD83DA"), + ["\uD83D"]); + +// ==== trail-only ==== + +// match only non-surrogate pair +assert.compareArray(/[\uDC38]/u.exec("\uD7FF\uDC38"), + ["\uDC38"]); +assert.sameValue(/[\uDC38]/u.exec("\uD800\uDC38"), + null); +assert.sameValue(/[\uDC38]/u.exec("\uDBFF\uDC38"), + null); +assert.compareArray(/[\uDC38]/u.exec("\uDC00\uDC38"), + ["\uDC38"]); + +// match after non-lead char +assert.compareArray(/[\uDC38]/u.exec("\uDC38"), + ["\uDC38"]); +assert.compareArray(/[\uDC38]/u.exec("A\uDC38"), + ["\uDC38"]); + +// no unicode flag +assert.compareArray(/[\uDC38]/.exec("\uD7FF\uDC38"), + ["\uDC38"]); +assert.compareArray(/[\uDC38]/.exec("\uD800\uDC38"), + ["\uDC38"]); +assert.compareArray(/[\uDC38]/.exec("\uDBFF\uDC38"), + ["\uDC38"]); +assert.compareArray(/[\uDC38]/.exec("\uDC00\uDC38"), + ["\uDC38"]); +assert.compareArray(/[\uDC38]/.exec("\uDC38"), + ["\uDC38"]); +assert.compareArray(/[\uDC38]/.exec("A\uDC38"), + ["\uDC38"]); + +// ==== invalid trail ==== + +assert.compareArray(/[\uD83D\u3042]*/u.exec("\uD83D"), + ["\uD83D"]); +assert.compareArray(/[\uD83D\u3042]*/u.exec("\uD83D\u3042"), + ["\uD83D\u3042"]); +assert.compareArray(/[\uD83D\u3042]*/u.exec("\uD83D\u3042\u3042\uD83D"), + ["\uD83D\u3042\u3042\uD83D"]); + +assert.compareArray(/[\uD83D\u{3042}]*/u.exec("\uD83D"), + ["\uD83D"]); +assert.compareArray(/[\uD83D\u{3042}]*/u.exec("\uD83D\u3042"), + ["\uD83D\u3042"]); +assert.compareArray(/[\uD83D\u{3042}]*/u.exec("\uD83D\u3042\u3042\uD83D"), + ["\uD83D\u3042\u3042\uD83D"]); + +assert.compareArray(/[\uD83DA]*/u.exec("\uD83D"), + ["\uD83D"]); +assert.compareArray(/[\uD83DA]*/u.exec("\uD83DA"), + ["\uD83DA"]); +assert.compareArray(/[\uD83DA]*/u.exec("\uD83DAA\uD83D"), + ["\uD83DAA\uD83D"]); + +// ==== wrong patterns ==== + +assertThrowsInstanceOf(() => eval(`/[\\u]/u`), SyntaxError); +assertThrowsInstanceOf(() => eval(`/[\\u0]/u`), SyntaxError); +assertThrowsInstanceOf(() => eval(`/[\\u00]/u`), SyntaxError); +assertThrowsInstanceOf(() => eval(`/[\\u000]/u`), SyntaxError); +assertThrowsInstanceOf(() => eval(`/[\\u000G]/u`), SyntaxError); +assertThrowsInstanceOf(() => eval(`/[\\u0.00]/u`), SyntaxError); +assertThrowsInstanceOf(() => eval(`/[\\uD83D\\u]/u`), SyntaxError); +assertThrowsInstanceOf(() => eval(`/[\\uD83D\\u0]/u`), SyntaxError); +assertThrowsInstanceOf(() => eval(`/[\\uD83D\\u00]/u`), SyntaxError); +assertThrowsInstanceOf(() => eval(`/[\\uD83D\\u000]/u`), SyntaxError); +assertThrowsInstanceOf(() => eval(`/[\\uD83D\\u000G]/u`), SyntaxError); +assertThrowsInstanceOf(() => eval(`/[\\uD83D\\u0.00]/u`), SyntaxError); + diff --git a/test/staging/sm/RegExp/unicode-class-negated.js b/test/staging/sm/RegExp/unicode-class-negated.js new file mode 100644 index 0000000000..a4d7a91bde --- /dev/null +++ b/test/staging/sm/RegExp/unicode-class-negated.js @@ -0,0 +1,73 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [compareArray.js, sm/non262-RegExp-shell.js, sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +var BUGNUMBER = 1135377; +var summary = "Implement RegExp unicode flag -- negated CharacterClass."; + +print(BUGNUMBER + ": " + summary); + +// ==== BMP ==== + +assert.compareArray(/[^A]/u.exec("ABC"), + ["B"]); +assert.compareArray(/[^A]/u.exec("A\u{1F438}C"), + ["\u{1F438}"]); +assert.compareArray(/[^A]/u.exec("A\uD83DC"), + ["\uD83D"]); +assert.compareArray(/[^A]/u.exec("A\uDC38C"), + ["\uDC38"]); + +assert.compareArray(/[^\uE000]/u.exec("\uE000\uE001"), + ["\uE001"]); +assert.compareArray(/[^\uE000]/u.exec("\uE000\u{1F438}"), + ["\u{1F438}"]); +assert.compareArray(/[^\uE000]/u.exec("\uE000\uD83D"), + ["\uD83D"]); +assert.compareArray(/[^\uE000]/u.exec("\uE000\uDC38"), + ["\uDC38"]); + +// ==== non-BMP ==== + +assert.compareArray(/[^\u{1F438}]/u.exec("\u{1F438}A"), + ["A"]); +assert.compareArray(/[^\u{1F438}]/u.exec("\u{1F438}\u{1F439}"), + ["\u{1F439}"]); +assert.compareArray(/[^\u{1F438}]/u.exec("\u{1F438}\uD83D"), + ["\uD83D"]); +assert.compareArray(/[^\u{1F438}]/u.exec("\u{1F438}\uDC38"), + ["\uDC38"]); + +// ==== lead-only ==== + +assert.compareArray(/[^\uD83D]/u.exec("\u{1F438}A"), + ["\u{1F438}"]); +assert.compareArray(/[^\uD83D]/u.exec("\uD83D\uDBFF"), + ["\uDBFF"]); +assert.compareArray(/[^\uD83D]/u.exec("\uD83D\uDC00"), + ["\uD83D\uDC00"]); +assert.compareArray(/[^\uD83D]/u.exec("\uD83D\uDFFF"), + ["\uD83D\uDFFF"]); +assert.compareArray(/[^\uD83D]/u.exec("\uD83D\uE000"), + ["\uE000"]); + +// ==== trail-only ==== + +assert.compareArray(/[^\uDC38]/u.exec("\u{1F438}A"), + ["\u{1F438}"]); +assert.compareArray(/[^\uDC38]/u.exec("\uD7FF\uDC38"), + ["\uD7FF"]); +assert.compareArray(/[^\uDC38]/u.exec("\uD800\uDC38"), + ["\uD800\uDC38"]); +assert.compareArray(/[^\uDC38]/u.exec("\uDBFF\uDC38"), + ["\uDBFF\uDC38"]); +assert.compareArray(/[^\uDC38]/u.exec("\uDC00\uDC38"), + ["\uDC00"]); + diff --git a/test/staging/sm/RegExp/unicode-class-range.js b/test/staging/sm/RegExp/unicode-class-range.js new file mode 100644 index 0000000000..55cdfa80bf --- /dev/null +++ b/test/staging/sm/RegExp/unicode-class-range.js @@ -0,0 +1,37 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-RegExp-shell.js, sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +var BUGNUMBER = 1135377; +var summary = "Implement RegExp unicode flag -- disallow range with CharacterClassEscape."; + +print(BUGNUMBER + ": " + summary); + +assertThrowsInstanceOf(() => eval(`/[\\w-\\uFFFF]/u`), SyntaxError); +assertThrowsInstanceOf(() => eval(`/[\\W-\\uFFFF]/u`), SyntaxError); +assertThrowsInstanceOf(() => eval(`/[\\d-\\uFFFF]/u`), SyntaxError); +assertThrowsInstanceOf(() => eval(`/[\\D-\\uFFFF]/u`), SyntaxError); +assertThrowsInstanceOf(() => eval(`/[\\s-\\uFFFF]/u`), SyntaxError); +assertThrowsInstanceOf(() => eval(`/[\\S-\\uFFFF]/u`), SyntaxError); + +assertThrowsInstanceOf(() => eval(`/[\\uFFFF-\\w]/u`), SyntaxError); +assertThrowsInstanceOf(() => eval(`/[\\uFFFF-\\W]/u`), SyntaxError); +assertThrowsInstanceOf(() => eval(`/[\\uFFFF-\\d]/u`), SyntaxError); +assertThrowsInstanceOf(() => eval(`/[\\uFFFF-\\D]/u`), SyntaxError); +assertThrowsInstanceOf(() => eval(`/[\\uFFFF-\\s]/u`), SyntaxError); +assertThrowsInstanceOf(() => eval(`/[\\uFFFF-\\S]/u`), SyntaxError); + +assertThrowsInstanceOf(() => eval(`/[\\w-\\w]/u`), SyntaxError); +assertThrowsInstanceOf(() => eval(`/[\\W-\\W]/u`), SyntaxError); +assertThrowsInstanceOf(() => eval(`/[\\d-\\d]/u`), SyntaxError); +assertThrowsInstanceOf(() => eval(`/[\\D-\\D]/u`), SyntaxError); +assertThrowsInstanceOf(() => eval(`/[\\s-\\s]/u`), SyntaxError); +assertThrowsInstanceOf(() => eval(`/[\\S-\\S]/u`), SyntaxError); + diff --git a/test/staging/sm/RegExp/unicode-class-raw.js b/test/staging/sm/RegExp/unicode-class-raw.js new file mode 100644 index 0000000000..668e4d532f --- /dev/null +++ b/test/staging/sm/RegExp/unicode-class-raw.js @@ -0,0 +1,74 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [compareArray.js, sm/non262-RegExp-shell.js, sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +var BUGNUMBER = 1135377; +var summary = "Implement RegExp unicode flag -- raw unicode."; + +print(BUGNUMBER + ": " + summary); + +// ==== standalone ==== + +assert.compareArray(eval(`/[\uD83D\uDC38]/u`).exec("\u{1F438}"), + ["\u{1F438}"]); + +// no unicode flag +assert.compareArray(eval(`/[\uD83D\uDC38]/`).exec("\u{1F438}"), + ["\uD83D"]); + +// escaped (lead) +assert.sameValue(eval(`/[\\uD83D\uDC38]/u`).exec("\u{1F438}"), + null); +assert.sameValue(eval(`/[\\u{D83D}\uDC38]/u`).exec("\u{1F438}"), + null); + +// escaped (trail) +assert.sameValue(eval(`/[\uD83D\\uDC38]/u`).exec("\u{1F438}"), + null); +assert.sameValue(eval(`/[\uD83D\\u{DC38}]/u`).exec("\u{1F438}"), + null); + +// escaped (lead), no unicode flag +assert.compareArray(eval(`/[\\uD83D\uDC38]/`).exec("\u{1F438}"), + ["\uD83D"]); + +// escaped (trail), no unicode flag +assert.compareArray(eval(`/[\uD83D\\uDC38]/`).exec("\u{1F438}"), + ["\uD83D"]); + +// ==== RegExp constructor ==== + +assert.compareArray(new RegExp("[\uD83D\uDC38]", "u").exec("\u{1F438}"), + ["\u{1F438}"]); + +// no unicode flag +assert.compareArray(new RegExp("[\uD83D\uDC38]", "").exec("\u{1F438}"), + ["\uD83D"]); + +// escaped(lead) +assert.sameValue(new RegExp("[\\uD83D\uDC38]", "u").exec("\u{1F438}"), + null); +assert.sameValue(new RegExp("[\\u{D83D}\uDC38]", "u").exec("\u{1F438}"), + null); + +// escaped(trail) +assert.sameValue(new RegExp("[\uD83D\\uDC38]", "u").exec("\u{1F438}"), + null); +assert.sameValue(new RegExp("[\uD83D\\u{DC38}]", "u").exec("\u{1F438}"), + null); + +// escaped(lead), no unicode flag +assert.compareArray(new RegExp("[\\uD83D\uDC38]", "").exec("\u{1F438}"), + ["\uD83D"]); + +// escaped(trail), no unicode flag +assert.compareArray(new RegExp("[\uD83D\\uDC38]", "").exec("\u{1F438}"), + ["\uD83D"]); + diff --git a/test/staging/sm/RegExp/unicode-disallow-extended.js b/test/staging/sm/RegExp/unicode-disallow-extended.js new file mode 100644 index 0000000000..fbc28bc7c9 --- /dev/null +++ b/test/staging/sm/RegExp/unicode-disallow-extended.js @@ -0,0 +1,148 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [compareArray.js, sm/non262-RegExp-shell.js, sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +var BUGNUMBER = 1135377; +var summary = "Implement RegExp unicode flag -- disallow extended patterns."; + +print(BUGNUMBER + ": " + summary); + +// IdentityEscape + +assert.compareArray(/\^\$\\\.\*\+\?\(\)\[\]\{\}\|/u.exec("^$\\.*+?()[]{}|"), + ["^$\\.*+?()[]{}|"]); +assertThrowsInstanceOf(() => eval(`/\\A/u`), SyntaxError); +assertThrowsInstanceOf(() => eval(`/\\-/u`), SyntaxError); +assertThrowsInstanceOf(() => eval(`/\\U{10}/u`), SyntaxError); +assertThrowsInstanceOf(() => eval(`/\\U0000/u`), SyntaxError); +assertThrowsInstanceOf(() => eval(`/\\uD83D\\U0000/u`), SyntaxError); + +assert.compareArray(/[\^\$\\\.\*\+\?\(\)\[\]\{\}\|]+/u.exec("^$\\.*+?()[]{}|"), + ["^$\\.*+?()[]{}|"]); +assertThrowsInstanceOf(() => eval(`/[\\A]/u`), SyntaxError); +assert.compareArray(/[A\-Z]+/u.exec("a-zABC"), + ["-"]); +assertThrowsInstanceOf(() => eval(`/[\\U{10}]/u`), SyntaxError); +assertThrowsInstanceOf(() => eval(`/[\\U0000]/u`), SyntaxError); +assertThrowsInstanceOf(() => eval(`/[\\uD83D\\U0000]/u`), SyntaxError); + +// PatternCharacter +assertThrowsInstanceOf(() => eval(`/{}/u`), SyntaxError); +assertThrowsInstanceOf(() => eval(`/{/u`), SyntaxError); +assertThrowsInstanceOf(() => eval(`/}/u`), SyntaxError); +assertThrowsInstanceOf(() => eval(`/]/u`), SyntaxError); +assertThrowsInstanceOf(() => eval(`/{0}/u`), SyntaxError); +assertThrowsInstanceOf(() => eval(`/{1,}/u`), SyntaxError); +assertThrowsInstanceOf(() => eval(`/{1,2}/u`), SyntaxError); + +// QuantifiableAssertion +assert.compareArray(/.B(?=A)/u.exec("cBaCBA"), + ["CB"]); +assert.compareArray(/.B(?!A)/u.exec("CBAcBa"), + ["cB"]); +assert.compareArray(/.B(?:A)/u.exec("cBaCBA"), + ["CBA"]); +assert.compareArray(/.B(A)/u.exec("cBaCBA"), + ["CBA", "A"]); + +assertThrowsInstanceOf(() => eval(`/.B(?=A)+/u`), SyntaxError); +assertThrowsInstanceOf(() => eval(`/.B(?!A)+/u`), SyntaxError); +assert.compareArray(/.B(?:A)+/u.exec("cBaCBA"), + ["CBA"]); +assert.compareArray(/.B(A)+/u.exec("cBaCBA"), + ["CBA", "A"]); + +// ControlLetter +assert.compareArray(/\cA/u.exec("\u0001"), + ["\u0001"]); +assert.compareArray(/\cZ/u.exec("\u001a"), + ["\u001a"]); +assert.compareArray(/\ca/u.exec("\u0001"), + ["\u0001"]); +assert.compareArray(/\cz/u.exec("\u001a"), + ["\u001a"]); + +assert.compareArray(/[\cA]/u.exec("\u0001"), + ["\u0001"]); +assert.compareArray(/[\cZ]/u.exec("\u001a"), + ["\u001a"]); +assert.compareArray(/[\ca]/u.exec("\u0001"), + ["\u0001"]); +assert.compareArray(/[\cz]/u.exec("\u001a"), + ["\u001a"]); + +assertThrowsInstanceOf(() => eval(`/\\c/u`), SyntaxError); +assertThrowsInstanceOf(() => eval(`/\\c1/u`), SyntaxError); +assertThrowsInstanceOf(() => eval(`/\\c_/u`), SyntaxError); + +assertThrowsInstanceOf(() => eval(`/[\\c]/u`), SyntaxError); +assertThrowsInstanceOf(() => eval(`/[\\c1]/u`), SyntaxError); +assertThrowsInstanceOf(() => eval(`/[\\c_]/u`), SyntaxError); + +// HexEscapeSequence +assertThrowsInstanceOf(() => eval(`/\\x/u`), SyntaxError); +assertThrowsInstanceOf(() => eval(`/\\x0/u`), SyntaxError); +assertThrowsInstanceOf(() => eval(`/\\x1/u`), SyntaxError); +assertThrowsInstanceOf(() => eval(`/\\x1G/u`), SyntaxError); + +assertThrowsInstanceOf(() => eval(`/[\\x]/u`), SyntaxError); +assertThrowsInstanceOf(() => eval(`/[\\x0]/u`), SyntaxError); +assertThrowsInstanceOf(() => eval(`/[\\x1]/u`), SyntaxError); +assertThrowsInstanceOf(() => eval(`/[\\x1G]/u`), SyntaxError); + +// LegacyOctalEscapeSequence +assertThrowsInstanceOf(() => eval(`/\\52/u`), SyntaxError); +assertThrowsInstanceOf(() => eval(`/\\052/u`), SyntaxError); + +assertThrowsInstanceOf(() => eval(`/[\\52]/u`), SyntaxError); +assertThrowsInstanceOf(() => eval(`/[\\052]/u`), SyntaxError); + +// DecimalEscape +assert.compareArray(/\0/u.exec("\0"), + ["\0"]); +assert.compareArray(/[\0]/u.exec("\0"), + ["\0"]); +assert.compareArray(/\0A/u.exec("\0A"), + ["\0A"]); +assert.compareArray(/\0G/u.exec("\0G"), + ["\0G"]); +assert.compareArray(/(A.)\1/u.exec("ABACABAB"), + ["ABAB", "AB"]); +assert.compareArray(/(A.)(B.)(C.)(D.)(E.)(F.)(G.)(H.)(I.)(J.)(K.)\10/u.exec("A1B2C3D4E5F6G7H8I9JaKbJa"), + ["A1B2C3D4E5F6G7H8I9JaKbJa", "A1", "B2", "C3", "D4", "E5", "F6", "G7", "H8", "I9", "Ja", "Kb"]); + +assertThrowsInstanceOf(() => eval(`/\\00/u`), SyntaxError); +assertThrowsInstanceOf(() => eval(`/\\01/u`), SyntaxError); +assertThrowsInstanceOf(() => eval(`/\\09/u`), SyntaxError); +assertThrowsInstanceOf(() => eval(`/\\1/u`), SyntaxError); +assertThrowsInstanceOf(() => eval(`/\\2/u`), SyntaxError); +assertThrowsInstanceOf(() => eval(`/\\3/u`), SyntaxError); +assertThrowsInstanceOf(() => eval(`/\\4/u`), SyntaxError); +assertThrowsInstanceOf(() => eval(`/\\5/u`), SyntaxError); +assertThrowsInstanceOf(() => eval(`/\\6/u`), SyntaxError); +assertThrowsInstanceOf(() => eval(`/\\7/u`), SyntaxError); +assertThrowsInstanceOf(() => eval(`/\\8/u`), SyntaxError); +assertThrowsInstanceOf(() => eval(`/\\9/u`), SyntaxError); +assertThrowsInstanceOf(() => eval(`/\\10/u`), SyntaxError); + +assertThrowsInstanceOf(() => eval(`/[\\00]/u`), SyntaxError); +assertThrowsInstanceOf(() => eval(`/[\\01]/u`), SyntaxError); +assertThrowsInstanceOf(() => eval(`/[\\09]/u`), SyntaxError); +assertThrowsInstanceOf(() => eval(`/[\\1]/u`), SyntaxError); +assertThrowsInstanceOf(() => eval(`/[\\2]/u`), SyntaxError); +assertThrowsInstanceOf(() => eval(`/[\\3]/u`), SyntaxError); +assertThrowsInstanceOf(() => eval(`/[\\4]/u`), SyntaxError); +assertThrowsInstanceOf(() => eval(`/[\\5]/u`), SyntaxError); +assertThrowsInstanceOf(() => eval(`/[\\6]/u`), SyntaxError); +assertThrowsInstanceOf(() => eval(`/[\\7]/u`), SyntaxError); +assertThrowsInstanceOf(() => eval(`/[\\8]/u`), SyntaxError); +assertThrowsInstanceOf(() => eval(`/[\\9]/u`), SyntaxError); +assertThrowsInstanceOf(() => eval(`/[\\10]/u`), SyntaxError); + diff --git a/test/staging/sm/RegExp/unicode-everything.js b/test/staging/sm/RegExp/unicode-everything.js new file mode 100644 index 0000000000..ade05b8db9 --- /dev/null +++ b/test/staging/sm/RegExp/unicode-everything.js @@ -0,0 +1,68 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [compareArray.js, sm/non262-RegExp-shell.js, sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +var BUGNUMBER = 1135377; +var summary = "Implement RegExp unicode flag -- everything Atom."; + +print(BUGNUMBER + ": " + summary); + +// ==== standalone ==== + +assert.compareArray(/./u.exec("ABC"), + ["A"]); +assert.compareArray(/./u.exec("\u{1F438}BC"), + ["\u{1F438}"]); + +assert.compareArray(/./u.exec("\uD83D\uDBFF"), + ["\uD83D"]); +assert.compareArray(/./u.exec("\uD83D\uDC00"), + ["\uD83D\uDC00"]); +assert.compareArray(/./u.exec("\uD83D\uDFFF"), + ["\uD83D\uDFFF"]); +assert.compareArray(/./u.exec("\uD83D\uE000"), + ["\uD83D"]); +assert.compareArray(/./u.exec("\uD83D"), + ["\uD83D"]); +assert.compareArray(/./u.exec("\uD83DA"), + ["\uD83D"]); + +assert.compareArray(/./u.exec("\uD7FF\uDC38"), + ["\uD7FF"]); +assert.compareArray(/./u.exec("\uD800\uDC38"), + ["\uD800\uDC38"]); +assert.compareArray(/./u.exec("\uDBFF\uDC38"), + ["\uDBFF\uDC38"]); +assert.compareArray(/./u.exec("\uDC00\uDC38"), + ["\uDC00"]); +assert.compareArray(/./u.exec("\uDC38"), + ["\uDC38"]); +assert.compareArray(/./u.exec("A\uDC38"), + ["A"]); + +assert.compareArray(/.A/u.exec("\uD7FF\uDC38A"), + ["\uDC38A"]); +assert.compareArray(/.A/u.exec("\uD800\uDC38A"), + ["\uD800\uDC38A"]); +assert.compareArray(/.A/u.exec("\uDBFF\uDC38A"), + ["\uDBFF\uDC38A"]); +assert.compareArray(/.A/u.exec("\uDC00\uDC38A"), + ["\uDC38A"]); + +// ==== leading multiple ==== + +assert.compareArray(/.*A/u.exec("\u{1F438}\u{1F438}\u{1F438}A"), + ["\u{1F438}\u{1F438}\u{1F438}A"]); + +// ==== trailing multiple ==== + +assert.compareArray(/A.*/u.exec("A\u{1F438}\u{1F438}\u{1F438}"), + ["A\u{1F438}\u{1F438}\u{1F438}"]); + diff --git a/test/staging/sm/RegExp/unicode-ignoreCase-ascii.js b/test/staging/sm/RegExp/unicode-ignoreCase-ascii.js new file mode 100644 index 0000000000..ca35350805 --- /dev/null +++ b/test/staging/sm/RegExp/unicode-ignoreCase-ascii.js @@ -0,0 +1,55 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [compareArray.js, sm/non262-RegExp-shell.js, sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ + +var BUGNUMBER = 1135377; +var summary = "Implement RegExp unicode flag -- ignoreCase flag with non-ascii to ascii map."; + +print(BUGNUMBER + ": " + summary); + +// LATIN CAPITAL LETTER Y WITH DIAERESIS +assert.compareArray(/\u0178/iu.exec("\u00FF"), + ["\u00FF"]); +assert.compareArray(/\u00FF/iu.exec("\u0178"), + ["\u0178"]); + +// LATIN SMALL LETTER LONG S +assert.compareArray(/\u017F/iu.exec("S"), + ["S"]); +assert.compareArray(/\u017F/iu.exec("s"), + ["s"]); +assert.compareArray(/S/iu.exec("\u017F"), + ["\u017F"]); +assert.compareArray(/s/iu.exec("\u017F"), + ["\u017F"]); + +// LATIN CAPITAL LETTER SHARP S +assert.compareArray(/\u1E9E/iu.exec("\u00DF"), + ["\u00DF"]); +assert.compareArray(/\u00DF/iu.exec("\u1E9E"), + ["\u1E9E"]); + +// KELVIN SIGN +assert.compareArray(/\u212A/iu.exec("K"), + ["K"]); +assert.compareArray(/\u212A/iu.exec("k"), + ["k"]); +assert.compareArray(/K/iu.exec("\u212A"), + ["\u212A"]); +assert.compareArray(/k/iu.exec("\u212A"), + ["\u212A"]); + +// ANGSTROM SIGN +assert.compareArray(/\u212B/iu.exec("\u00E5"), + ["\u00E5"]); +assert.compareArray(/\u00E5/iu.exec("\u212B"), + ["\u212B"]); + diff --git a/test/staging/sm/RegExp/unicode-ignoreCase-escape.js b/test/staging/sm/RegExp/unicode-ignoreCase-escape.js new file mode 100644 index 0000000000..2a48cdc2c8 --- /dev/null +++ b/test/staging/sm/RegExp/unicode-ignoreCase-escape.js @@ -0,0 +1,81 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [compareArray.js, sm/non262-RegExp-shell.js, sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ + +var BUGNUMBER = 1135377; +var summary = "Implement RegExp unicode flag -- ignoreCase flag with character class escape."; + +// \W doesn't match S or K from the change in +// https://github.com/tc39/ecma262/pull/525 +// (bug 1281739) + +print(BUGNUMBER + ": " + summary); + +// LATIN SMALL LETTER LONG S + +assert.compareArray(/\w/iu.exec("S"), + ["S"]); +assert.compareArray(/\w/iu.exec("s"), + ["s"]); +assert.compareArray(/\w/iu.exec("\u017F"), + ["\u017F"]); + +assert.compareArray(/[^\W]/iu.exec("S"), + ["S"]); +assert.compareArray(/[^\W]/iu.exec("s"), + ["s"]); +assert.compareArray(/[^\W]/iu.exec("\u017F"), + ["\u017F"]); + +assert.sameValue(/\W/iu.exec("S"), + null); +assert.sameValue(/\W/iu.exec("s"), + null); +assert.sameValue(/\W/iu.exec("\u017F"), + null); + +assert.sameValue(/[^\w]/iu.exec("S"), + null); +assert.sameValue(/[^\w]/iu.exec("s"), + null); +assert.sameValue(/[^\w]/iu.exec("\u017F"), + null); + +// KELVIN SIGN + +assert.compareArray(/\w/iu.exec("k"), + ["k"]); +assert.compareArray(/\w/iu.exec("k"), + ["k"]); +assert.compareArray(/\w/iu.exec("\u212A"), + ["\u212A"]); + +assert.compareArray(/[^\W]/iu.exec("k"), + ["k"]); +assert.compareArray(/[^\W]/iu.exec("k"), + ["k"]); +assert.compareArray(/[^\W]/iu.exec("\u212A"), + ["\u212A"]); + +assert.sameValue(/\W/iu.exec("k"), + null); +assert.sameValue(/\W/iu.exec("k"), + null); +assert.sameValue(/\W/iu.exec("\u212A"), + null); + +assert.sameValue(/[^\w]/iu.exec("k"), + null); +assert.sameValue(/[^\w]/iu.exec("k"), + null); +assert.sameValue(/[^\w]/iu.exec("\u212A"), + null); + diff --git a/test/staging/sm/RegExp/unicode-ignoreCase-negated.js b/test/staging/sm/RegExp/unicode-ignoreCase-negated.js new file mode 100644 index 0000000000..1ab4a247a5 --- /dev/null +++ b/test/staging/sm/RegExp/unicode-ignoreCase-negated.js @@ -0,0 +1,28 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [compareArray.js, sm/non262-RegExp-shell.js, sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +var BUGNUMBER = 1135377; +var summary = "Implement RegExp unicode flag -- ignoreCase flag with negated character class."; + +print(BUGNUMBER + ": " + summary); + +assert.sameValue(/[^A]/iu.exec("A"), + null); +assert.sameValue(/[^a]/iu.exec("A"), + null); +assert.sameValue(/[^A]/iu.exec("a"), + null); +assert.sameValue(/[^a]/iu.exec("a"), + null); + +assert.compareArray(/[^A]/iu.exec("b"), + ["b"]); + diff --git a/test/staging/sm/RegExp/unicode-ignoreCase-word-boundary.js b/test/staging/sm/RegExp/unicode-ignoreCase-word-boundary.js new file mode 100644 index 0000000000..c29718bfc7 --- /dev/null +++ b/test/staging/sm/RegExp/unicode-ignoreCase-word-boundary.js @@ -0,0 +1,56 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-RegExp-shell.js, sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ + +var BUGNUMBER = 1338373; +var summary = "Word boundary should match U+017F and U+212A in unicode+ignoreCase."; + +assert.sameValue(/\b/iu.test('\u017F'), true); +assert.sameValue(/\b/i.test('\u017F'), false); +assert.sameValue(/\b/u.test('\u017F'), false); +assert.sameValue(/\b/.test('\u017F'), false); + +assert.sameValue(/\b/iu.test('\u212A'), true); +assert.sameValue(/\b/i.test('\u212A'), false); +assert.sameValue(/\b/u.test('\u212A'), false); +assert.sameValue(/\b/.test('\u212A'), false); + +assert.sameValue(/\B/iu.test('\u017F'), false); +assert.sameValue(/\B/i.test('\u017F'), true); +assert.sameValue(/\B/u.test('\u017F'), true); +assert.sameValue(/\B/.test('\u017F'), true); + +assert.sameValue(/\B/iu.test('\u212A'), false); +assert.sameValue(/\B/i.test('\u212A'), true); +assert.sameValue(/\B/u.test('\u212A'), true); +assert.sameValue(/\B/.test('\u212A'), true); + +// Bug 1338779 - More testcases. +assert.sameValue(/(i\B\u017F)/ui.test("is"), true); +assert.sameValue(/(i\B\u017F)/ui.test("it"), false); +assert.sameValue(/(i\B\u017F)+/ui.test("is"), true); +assert.sameValue(/(i\B\u017F)+/ui.test("it"), false); + +assert.sameValue(/(\u017F\Bi)/ui.test("si"), true); +assert.sameValue(/(\u017F\Bi)/ui.test("ti"), false); +assert.sameValue(/(\u017F\Bi)+/ui.test("si"), true); +assert.sameValue(/(\u017F\Bi)+/ui.test("ti"), false); + +assert.sameValue(/(i\B\u212A)/ui.test("ik"), true); +assert.sameValue(/(i\B\u212A)/ui.test("it"), false); +assert.sameValue(/(i\B\u212A)+/ui.test("ik"), true); +assert.sameValue(/(i\B\u212A)+/ui.test("it"), false); + +assert.sameValue(/(\u212A\Bi)/ui.test("ki"), true); +assert.sameValue(/(\u212A\Bi)/ui.test("ti"), false); +assert.sameValue(/(\u212A\Bi)+/ui.test("ki"), true); +assert.sameValue(/(\u212A\Bi)+/ui.test("ti"), false); + diff --git a/test/staging/sm/RegExp/unicode-ignoreCase.js b/test/staging/sm/RegExp/unicode-ignoreCase.js new file mode 100644 index 0000000000..f92e235a92 --- /dev/null +++ b/test/staging/sm/RegExp/unicode-ignoreCase.js @@ -0,0 +1,2908 @@ +/* + * Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/licenses/publicdomain/ + */ + +/*--- +includes: [compareArray.js, sm/non262-RegExp-shell.js, sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ + +/* Generated by make_unicode.py DO NOT MODIFY */ +/* Unicode version: 15.0.0 */ + +var BUGNUMBER = 1135377; +var summary = "Implement RegExp unicode flag -- ignoreCase flag."; + +print(BUGNUMBER + ": " + summary); + +function test(code, ...equivs) { + var codeRe = new RegExp(String.fromCodePoint(code) + "+", "iu"); + var ans = String.fromCodePoint(code) + equivs.map(c => String.fromCodePoint(c)).join(""); + assert.compareArray(codeRe.exec("<" + ans + ">"), [ans]); + codeRe = new RegExp("[" + String.fromCodePoint(code) + "]+", "iu"); + assert.compareArray(codeRe.exec("<" + ans + ">"), [ans]); +} +test(0x0041, 0x0061); // LATIN CAPITAL LETTER A, LATIN SMALL LETTER A +test(0x0042, 0x0062); // LATIN CAPITAL LETTER B, LATIN SMALL LETTER B +test(0x0043, 0x0063); // LATIN CAPITAL LETTER C, LATIN SMALL LETTER C +test(0x0044, 0x0064); // LATIN CAPITAL LETTER D, LATIN SMALL LETTER D +test(0x0045, 0x0065); // LATIN CAPITAL LETTER E, LATIN SMALL LETTER E +test(0x0046, 0x0066); // LATIN CAPITAL LETTER F, LATIN SMALL LETTER F +test(0x0047, 0x0067); // LATIN CAPITAL LETTER G, LATIN SMALL LETTER G +test(0x0048, 0x0068); // LATIN CAPITAL LETTER H, LATIN SMALL LETTER H +test(0x0049, 0x0069); // LATIN CAPITAL LETTER I, LATIN SMALL LETTER I +test(0x004A, 0x006A); // LATIN CAPITAL LETTER J, LATIN SMALL LETTER J +test(0x004B, 0x006B, 0x212A); // LATIN CAPITAL LETTER K, LATIN SMALL LETTER K, KELVIN SIGN (DEGREES KELVIN) +test(0x004C, 0x006C); // LATIN CAPITAL LETTER L, LATIN SMALL LETTER L +test(0x004D, 0x006D); // LATIN CAPITAL LETTER M, LATIN SMALL LETTER M +test(0x004E, 0x006E); // LATIN CAPITAL LETTER N, LATIN SMALL LETTER N +test(0x004F, 0x006F); // LATIN CAPITAL LETTER O, LATIN SMALL LETTER O +test(0x0050, 0x0070); // LATIN CAPITAL LETTER P, LATIN SMALL LETTER P +test(0x0051, 0x0071); // LATIN CAPITAL LETTER Q, LATIN SMALL LETTER Q +test(0x0052, 0x0072); // LATIN CAPITAL LETTER R, LATIN SMALL LETTER R +test(0x0053, 0x0073, 0x017F); // LATIN CAPITAL LETTER S, LATIN SMALL LETTER S, LATIN SMALL LETTER LONG S +test(0x0054, 0x0074); // LATIN CAPITAL LETTER T, LATIN SMALL LETTER T +test(0x0055, 0x0075); // LATIN CAPITAL LETTER U, LATIN SMALL LETTER U +test(0x0056, 0x0076); // LATIN CAPITAL LETTER V, LATIN SMALL LETTER V +test(0x0057, 0x0077); // LATIN CAPITAL LETTER W, LATIN SMALL LETTER W +test(0x0058, 0x0078); // LATIN CAPITAL LETTER X, LATIN SMALL LETTER X +test(0x0059, 0x0079); // LATIN CAPITAL LETTER Y, LATIN SMALL LETTER Y +test(0x005A, 0x007A); // LATIN CAPITAL LETTER Z, LATIN SMALL LETTER Z +test(0x0061, 0x0041); // LATIN SMALL LETTER A, LATIN CAPITAL LETTER A +test(0x0062, 0x0042); // LATIN SMALL LETTER B, LATIN CAPITAL LETTER B +test(0x0063, 0x0043); // LATIN SMALL LETTER C, LATIN CAPITAL LETTER C +test(0x0064, 0x0044); // LATIN SMALL LETTER D, LATIN CAPITAL LETTER D +test(0x0065, 0x0045); // LATIN SMALL LETTER E, LATIN CAPITAL LETTER E +test(0x0066, 0x0046); // LATIN SMALL LETTER F, LATIN CAPITAL LETTER F +test(0x0067, 0x0047); // LATIN SMALL LETTER G, LATIN CAPITAL LETTER G +test(0x0068, 0x0048); // LATIN SMALL LETTER H, LATIN CAPITAL LETTER H +test(0x0069, 0x0049); // LATIN SMALL LETTER I, LATIN CAPITAL LETTER I +test(0x006A, 0x004A); // LATIN SMALL LETTER J, LATIN CAPITAL LETTER J +test(0x006B, 0x004B, 0x212A); // LATIN SMALL LETTER K, LATIN CAPITAL LETTER K, KELVIN SIGN (DEGREES KELVIN) +test(0x006C, 0x004C); // LATIN SMALL LETTER L, LATIN CAPITAL LETTER L +test(0x006D, 0x004D); // LATIN SMALL LETTER M, LATIN CAPITAL LETTER M +test(0x006E, 0x004E); // LATIN SMALL LETTER N, LATIN CAPITAL LETTER N +test(0x006F, 0x004F); // LATIN SMALL LETTER O, LATIN CAPITAL LETTER O +test(0x0070, 0x0050); // LATIN SMALL LETTER P, LATIN CAPITAL LETTER P +test(0x0071, 0x0051); // LATIN SMALL LETTER Q, LATIN CAPITAL LETTER Q +test(0x0072, 0x0052); // LATIN SMALL LETTER R, LATIN CAPITAL LETTER R +test(0x0073, 0x0053, 0x017F); // LATIN SMALL LETTER S, LATIN CAPITAL LETTER S, LATIN SMALL LETTER LONG S +test(0x0074, 0x0054); // LATIN SMALL LETTER T, LATIN CAPITAL LETTER T +test(0x0075, 0x0055); // LATIN SMALL LETTER U, LATIN CAPITAL LETTER U +test(0x0076, 0x0056); // LATIN SMALL LETTER V, LATIN CAPITAL LETTER V +test(0x0077, 0x0057); // LATIN SMALL LETTER W, LATIN CAPITAL LETTER W +test(0x0078, 0x0058); // LATIN SMALL LETTER X, LATIN CAPITAL LETTER X +test(0x0079, 0x0059); // LATIN SMALL LETTER Y, LATIN CAPITAL LETTER Y +test(0x007A, 0x005A); // LATIN SMALL LETTER Z, LATIN CAPITAL LETTER Z +test(0x00B5, 0x03BC, 0x039C); // MICRO SIGN, GREEK SMALL LETTER MU, GREEK CAPITAL LETTER MU +test(0x00C0, 0x00E0); // LATIN CAPITAL LETTER A WITH GRAVE (LATIN CAPITAL LETTER A GRAVE), LATIN SMALL LETTER A WITH GRAVE (LATIN SMALL LETTER A GRAVE) +test(0x00C1, 0x00E1); // LATIN CAPITAL LETTER A WITH ACUTE (LATIN CAPITAL LETTER A ACUTE), LATIN SMALL LETTER A WITH ACUTE (LATIN SMALL LETTER A ACUTE) +test(0x00C2, 0x00E2); // LATIN CAPITAL LETTER A WITH CIRCUMFLEX (LATIN CAPITAL LETTER A CIRCUMFLEX), LATIN SMALL LETTER A WITH CIRCUMFLEX (LATIN SMALL LETTER A CIRCUMFLEX) +test(0x00C3, 0x00E3); // LATIN CAPITAL LETTER A WITH TILDE (LATIN CAPITAL LETTER A TILDE), LATIN SMALL LETTER A WITH TILDE (LATIN SMALL LETTER A TILDE) +test(0x00C4, 0x00E4); // LATIN CAPITAL LETTER A WITH DIAERESIS (LATIN CAPITAL LETTER A DIAERESIS), LATIN SMALL LETTER A WITH DIAERESIS (LATIN SMALL LETTER A DIAERESIS) +test(0x00C5, 0x00E5, 0x212B); // LATIN CAPITAL LETTER A WITH RING ABOVE (LATIN CAPITAL LETTER A RING), LATIN SMALL LETTER A WITH RING ABOVE (LATIN SMALL LETTER A RING), ANGSTROM SIGN (ANGSTROM UNIT) +test(0x00C6, 0x00E6); // LATIN CAPITAL LETTER AE (LATIN CAPITAL LETTER A E), LATIN SMALL LETTER AE (LATIN SMALL LETTER A E) +test(0x00C7, 0x00E7); // LATIN CAPITAL LETTER C WITH CEDILLA (LATIN CAPITAL LETTER C CEDILLA), LATIN SMALL LETTER C WITH CEDILLA (LATIN SMALL LETTER C CEDILLA) +test(0x00C8, 0x00E8); // LATIN CAPITAL LETTER E WITH GRAVE (LATIN CAPITAL LETTER E GRAVE), LATIN SMALL LETTER E WITH GRAVE (LATIN SMALL LETTER E GRAVE) +test(0x00C9, 0x00E9); // LATIN CAPITAL LETTER E WITH ACUTE (LATIN CAPITAL LETTER E ACUTE), LATIN SMALL LETTER E WITH ACUTE (LATIN SMALL LETTER E ACUTE) +test(0x00CA, 0x00EA); // LATIN CAPITAL LETTER E WITH CIRCUMFLEX (LATIN CAPITAL LETTER E CIRCUMFLEX), LATIN SMALL LETTER E WITH CIRCUMFLEX (LATIN SMALL LETTER E CIRCUMFLEX) +test(0x00CB, 0x00EB); // LATIN CAPITAL LETTER E WITH DIAERESIS (LATIN CAPITAL LETTER E DIAERESIS), LATIN SMALL LETTER E WITH DIAERESIS (LATIN SMALL LETTER E DIAERESIS) +test(0x00CC, 0x00EC); // LATIN CAPITAL LETTER I WITH GRAVE (LATIN CAPITAL LETTER I GRAVE), LATIN SMALL LETTER I WITH GRAVE (LATIN SMALL LETTER I GRAVE) +test(0x00CD, 0x00ED); // LATIN CAPITAL LETTER I WITH ACUTE (LATIN CAPITAL LETTER I ACUTE), LATIN SMALL LETTER I WITH ACUTE (LATIN SMALL LETTER I ACUTE) +test(0x00CE, 0x00EE); // LATIN CAPITAL LETTER I WITH CIRCUMFLEX (LATIN CAPITAL LETTER I CIRCUMFLEX), LATIN SMALL LETTER I WITH CIRCUMFLEX (LATIN SMALL LETTER I CIRCUMFLEX) +test(0x00CF, 0x00EF); // LATIN CAPITAL LETTER I WITH DIAERESIS (LATIN CAPITAL LETTER I DIAERESIS), LATIN SMALL LETTER I WITH DIAERESIS (LATIN SMALL LETTER I DIAERESIS) +test(0x00D0, 0x00F0); // LATIN CAPITAL LETTER ETH, LATIN SMALL LETTER ETH +test(0x00D1, 0x00F1); // LATIN CAPITAL LETTER N WITH TILDE (LATIN CAPITAL LETTER N TILDE), LATIN SMALL LETTER N WITH TILDE (LATIN SMALL LETTER N TILDE) +test(0x00D2, 0x00F2); // LATIN CAPITAL LETTER O WITH GRAVE (LATIN CAPITAL LETTER O GRAVE), LATIN SMALL LETTER O WITH GRAVE (LATIN SMALL LETTER O GRAVE) +test(0x00D3, 0x00F3); // LATIN CAPITAL LETTER O WITH ACUTE (LATIN CAPITAL LETTER O ACUTE), LATIN SMALL LETTER O WITH ACUTE (LATIN SMALL LETTER O ACUTE) +test(0x00D4, 0x00F4); // LATIN CAPITAL LETTER O WITH CIRCUMFLEX (LATIN CAPITAL LETTER O CIRCUMFLEX), LATIN SMALL LETTER O WITH CIRCUMFLEX (LATIN SMALL LETTER O CIRCUMFLEX) +test(0x00D5, 0x00F5); // LATIN CAPITAL LETTER O WITH TILDE (LATIN CAPITAL LETTER O TILDE), LATIN SMALL LETTER O WITH TILDE (LATIN SMALL LETTER O TILDE) +test(0x00D6, 0x00F6); // LATIN CAPITAL LETTER O WITH DIAERESIS (LATIN CAPITAL LETTER O DIAERESIS), LATIN SMALL LETTER O WITH DIAERESIS (LATIN SMALL LETTER O DIAERESIS) +test(0x00D8, 0x00F8); // LATIN CAPITAL LETTER O WITH STROKE (LATIN CAPITAL LETTER O SLASH), LATIN SMALL LETTER O WITH STROKE (LATIN SMALL LETTER O SLASH) +test(0x00D9, 0x00F9); // LATIN CAPITAL LETTER U WITH GRAVE (LATIN CAPITAL LETTER U GRAVE), LATIN SMALL LETTER U WITH GRAVE (LATIN SMALL LETTER U GRAVE) +test(0x00DA, 0x00FA); // LATIN CAPITAL LETTER U WITH ACUTE (LATIN CAPITAL LETTER U ACUTE), LATIN SMALL LETTER U WITH ACUTE (LATIN SMALL LETTER U ACUTE) +test(0x00DB, 0x00FB); // LATIN CAPITAL LETTER U WITH CIRCUMFLEX (LATIN CAPITAL LETTER U CIRCUMFLEX), LATIN SMALL LETTER U WITH CIRCUMFLEX (LATIN SMALL LETTER U CIRCUMFLEX) +test(0x00DC, 0x00FC); // LATIN CAPITAL LETTER U WITH DIAERESIS (LATIN CAPITAL LETTER U DIAERESIS), LATIN SMALL LETTER U WITH DIAERESIS (LATIN SMALL LETTER U DIAERESIS) +test(0x00DD, 0x00FD); // LATIN CAPITAL LETTER Y WITH ACUTE (LATIN CAPITAL LETTER Y ACUTE), LATIN SMALL LETTER Y WITH ACUTE (LATIN SMALL LETTER Y ACUTE) +test(0x00DE, 0x00FE); // LATIN CAPITAL LETTER THORN, LATIN SMALL LETTER THORN +test(0x00DF, 0x1E9E); // LATIN SMALL LETTER SHARP S, LATIN CAPITAL LETTER SHARP S +test(0x00E0, 0x00C0); // LATIN SMALL LETTER A WITH GRAVE (LATIN SMALL LETTER A GRAVE), LATIN CAPITAL LETTER A WITH GRAVE (LATIN CAPITAL LETTER A GRAVE) +test(0x00E1, 0x00C1); // LATIN SMALL LETTER A WITH ACUTE (LATIN SMALL LETTER A ACUTE), LATIN CAPITAL LETTER A WITH ACUTE (LATIN CAPITAL LETTER A ACUTE) +test(0x00E2, 0x00C2); // LATIN SMALL LETTER A WITH CIRCUMFLEX (LATIN SMALL LETTER A CIRCUMFLEX), LATIN CAPITAL LETTER A WITH CIRCUMFLEX (LATIN CAPITAL LETTER A CIRCUMFLEX) +test(0x00E3, 0x00C3); // LATIN SMALL LETTER A WITH TILDE (LATIN SMALL LETTER A TILDE), LATIN CAPITAL LETTER A WITH TILDE (LATIN CAPITAL LETTER A TILDE) +test(0x00E4, 0x00C4); // LATIN SMALL LETTER A WITH DIAERESIS (LATIN SMALL LETTER A DIAERESIS), LATIN CAPITAL LETTER A WITH DIAERESIS (LATIN CAPITAL LETTER A DIAERESIS) +test(0x00E5, 0x00C5, 0x212B); // LATIN SMALL LETTER A WITH RING ABOVE (LATIN SMALL LETTER A RING), LATIN CAPITAL LETTER A WITH RING ABOVE (LATIN CAPITAL LETTER A RING), ANGSTROM SIGN (ANGSTROM UNIT) +test(0x00E6, 0x00C6); // LATIN SMALL LETTER AE (LATIN SMALL LETTER A E), LATIN CAPITAL LETTER AE (LATIN CAPITAL LETTER A E) +test(0x00E7, 0x00C7); // LATIN SMALL LETTER C WITH CEDILLA (LATIN SMALL LETTER C CEDILLA), LATIN CAPITAL LETTER C WITH CEDILLA (LATIN CAPITAL LETTER C CEDILLA) +test(0x00E8, 0x00C8); // LATIN SMALL LETTER E WITH GRAVE (LATIN SMALL LETTER E GRAVE), LATIN CAPITAL LETTER E WITH GRAVE (LATIN CAPITAL LETTER E GRAVE) +test(0x00E9, 0x00C9); // LATIN SMALL LETTER E WITH ACUTE (LATIN SMALL LETTER E ACUTE), LATIN CAPITAL LETTER E WITH ACUTE (LATIN CAPITAL LETTER E ACUTE) +test(0x00EA, 0x00CA); // LATIN SMALL LETTER E WITH CIRCUMFLEX (LATIN SMALL LETTER E CIRCUMFLEX), LATIN CAPITAL LETTER E WITH CIRCUMFLEX (LATIN CAPITAL LETTER E CIRCUMFLEX) +test(0x00EB, 0x00CB); // LATIN SMALL LETTER E WITH DIAERESIS (LATIN SMALL LETTER E DIAERESIS), LATIN CAPITAL LETTER E WITH DIAERESIS (LATIN CAPITAL LETTER E DIAERESIS) +test(0x00EC, 0x00CC); // LATIN SMALL LETTER I WITH GRAVE (LATIN SMALL LETTER I GRAVE), LATIN CAPITAL LETTER I WITH GRAVE (LATIN CAPITAL LETTER I GRAVE) +test(0x00ED, 0x00CD); // LATIN SMALL LETTER I WITH ACUTE (LATIN SMALL LETTER I ACUTE), LATIN CAPITAL LETTER I WITH ACUTE (LATIN CAPITAL LETTER I ACUTE) +test(0x00EE, 0x00CE); // LATIN SMALL LETTER I WITH CIRCUMFLEX (LATIN SMALL LETTER I CIRCUMFLEX), LATIN CAPITAL LETTER I WITH CIRCUMFLEX (LATIN CAPITAL LETTER I CIRCUMFLEX) +test(0x00EF, 0x00CF); // LATIN SMALL LETTER I WITH DIAERESIS (LATIN SMALL LETTER I DIAERESIS), LATIN CAPITAL LETTER I WITH DIAERESIS (LATIN CAPITAL LETTER I DIAERESIS) +test(0x00F0, 0x00D0); // LATIN SMALL LETTER ETH, LATIN CAPITAL LETTER ETH +test(0x00F1, 0x00D1); // LATIN SMALL LETTER N WITH TILDE (LATIN SMALL LETTER N TILDE), LATIN CAPITAL LETTER N WITH TILDE (LATIN CAPITAL LETTER N TILDE) +test(0x00F2, 0x00D2); // LATIN SMALL LETTER O WITH GRAVE (LATIN SMALL LETTER O GRAVE), LATIN CAPITAL LETTER O WITH GRAVE (LATIN CAPITAL LETTER O GRAVE) +test(0x00F3, 0x00D3); // LATIN SMALL LETTER O WITH ACUTE (LATIN SMALL LETTER O ACUTE), LATIN CAPITAL LETTER O WITH ACUTE (LATIN CAPITAL LETTER O ACUTE) +test(0x00F4, 0x00D4); // LATIN SMALL LETTER O WITH CIRCUMFLEX (LATIN SMALL LETTER O CIRCUMFLEX), LATIN CAPITAL LETTER O WITH CIRCUMFLEX (LATIN CAPITAL LETTER O CIRCUMFLEX) +test(0x00F5, 0x00D5); // LATIN SMALL LETTER O WITH TILDE (LATIN SMALL LETTER O TILDE), LATIN CAPITAL LETTER O WITH TILDE (LATIN CAPITAL LETTER O TILDE) +test(0x00F6, 0x00D6); // LATIN SMALL LETTER O WITH DIAERESIS (LATIN SMALL LETTER O DIAERESIS), LATIN CAPITAL LETTER O WITH DIAERESIS (LATIN CAPITAL LETTER O DIAERESIS) +test(0x00F8, 0x00D8); // LATIN SMALL LETTER O WITH STROKE (LATIN SMALL LETTER O SLASH), LATIN CAPITAL LETTER O WITH STROKE (LATIN CAPITAL LETTER O SLASH) +test(0x00F9, 0x00D9); // LATIN SMALL LETTER U WITH GRAVE (LATIN SMALL LETTER U GRAVE), LATIN CAPITAL LETTER U WITH GRAVE (LATIN CAPITAL LETTER U GRAVE) +test(0x00FA, 0x00DA); // LATIN SMALL LETTER U WITH ACUTE (LATIN SMALL LETTER U ACUTE), LATIN CAPITAL LETTER U WITH ACUTE (LATIN CAPITAL LETTER U ACUTE) +test(0x00FB, 0x00DB); // LATIN SMALL LETTER U WITH CIRCUMFLEX (LATIN SMALL LETTER U CIRCUMFLEX), LATIN CAPITAL LETTER U WITH CIRCUMFLEX (LATIN CAPITAL LETTER U CIRCUMFLEX) +test(0x00FC, 0x00DC); // LATIN SMALL LETTER U WITH DIAERESIS (LATIN SMALL LETTER U DIAERESIS), LATIN CAPITAL LETTER U WITH DIAERESIS (LATIN CAPITAL LETTER U DIAERESIS) +test(0x00FD, 0x00DD); // LATIN SMALL LETTER Y WITH ACUTE (LATIN SMALL LETTER Y ACUTE), LATIN CAPITAL LETTER Y WITH ACUTE (LATIN CAPITAL LETTER Y ACUTE) +test(0x00FE, 0x00DE); // LATIN SMALL LETTER THORN, LATIN CAPITAL LETTER THORN +test(0x00FF, 0x0178); // LATIN SMALL LETTER Y WITH DIAERESIS (LATIN SMALL LETTER Y DIAERESIS), LATIN CAPITAL LETTER Y WITH DIAERESIS (LATIN CAPITAL LETTER Y DIAERESIS) +test(0x0100, 0x0101); // LATIN CAPITAL LETTER A WITH MACRON (LATIN CAPITAL LETTER A MACRON), LATIN SMALL LETTER A WITH MACRON (LATIN SMALL LETTER A MACRON) +test(0x0101, 0x0100); // LATIN SMALL LETTER A WITH MACRON (LATIN SMALL LETTER A MACRON), LATIN CAPITAL LETTER A WITH MACRON (LATIN CAPITAL LETTER A MACRON) +test(0x0102, 0x0103); // LATIN CAPITAL LETTER A WITH BREVE (LATIN CAPITAL LETTER A BREVE), LATIN SMALL LETTER A WITH BREVE (LATIN SMALL LETTER A BREVE) +test(0x0103, 0x0102); // LATIN SMALL LETTER A WITH BREVE (LATIN SMALL LETTER A BREVE), LATIN CAPITAL LETTER A WITH BREVE (LATIN CAPITAL LETTER A BREVE) +test(0x0104, 0x0105); // LATIN CAPITAL LETTER A WITH OGONEK (LATIN CAPITAL LETTER A OGONEK), LATIN SMALL LETTER A WITH OGONEK (LATIN SMALL LETTER A OGONEK) +test(0x0105, 0x0104); // LATIN SMALL LETTER A WITH OGONEK (LATIN SMALL LETTER A OGONEK), LATIN CAPITAL LETTER A WITH OGONEK (LATIN CAPITAL LETTER A OGONEK) +test(0x0106, 0x0107); // LATIN CAPITAL LETTER C WITH ACUTE (LATIN CAPITAL LETTER C ACUTE), LATIN SMALL LETTER C WITH ACUTE (LATIN SMALL LETTER C ACUTE) +test(0x0107, 0x0106); // LATIN SMALL LETTER C WITH ACUTE (LATIN SMALL LETTER C ACUTE), LATIN CAPITAL LETTER C WITH ACUTE (LATIN CAPITAL LETTER C ACUTE) +test(0x0108, 0x0109); // LATIN CAPITAL LETTER C WITH CIRCUMFLEX (LATIN CAPITAL LETTER C CIRCUMFLEX), LATIN SMALL LETTER C WITH CIRCUMFLEX (LATIN SMALL LETTER C CIRCUMFLEX) +test(0x0109, 0x0108); // LATIN SMALL LETTER C WITH CIRCUMFLEX (LATIN SMALL LETTER C CIRCUMFLEX), LATIN CAPITAL LETTER C WITH CIRCUMFLEX (LATIN CAPITAL LETTER C CIRCUMFLEX) +test(0x010A, 0x010B); // LATIN CAPITAL LETTER C WITH DOT ABOVE (LATIN CAPITAL LETTER C DOT), LATIN SMALL LETTER C WITH DOT ABOVE (LATIN SMALL LETTER C DOT) +test(0x010B, 0x010A); // LATIN SMALL LETTER C WITH DOT ABOVE (LATIN SMALL LETTER C DOT), LATIN CAPITAL LETTER C WITH DOT ABOVE (LATIN CAPITAL LETTER C DOT) +test(0x010C, 0x010D); // LATIN CAPITAL LETTER C WITH CARON (LATIN CAPITAL LETTER C HACEK), LATIN SMALL LETTER C WITH CARON (LATIN SMALL LETTER C HACEK) +test(0x010D, 0x010C); // LATIN SMALL LETTER C WITH CARON (LATIN SMALL LETTER C HACEK), LATIN CAPITAL LETTER C WITH CARON (LATIN CAPITAL LETTER C HACEK) +test(0x010E, 0x010F); // LATIN CAPITAL LETTER D WITH CARON (LATIN CAPITAL LETTER D HACEK), LATIN SMALL LETTER D WITH CARON (LATIN SMALL LETTER D HACEK) +test(0x010F, 0x010E); // LATIN SMALL LETTER D WITH CARON (LATIN SMALL LETTER D HACEK), LATIN CAPITAL LETTER D WITH CARON (LATIN CAPITAL LETTER D HACEK) +test(0x0110, 0x0111); // LATIN CAPITAL LETTER D WITH STROKE (LATIN CAPITAL LETTER D BAR), LATIN SMALL LETTER D WITH STROKE (LATIN SMALL LETTER D BAR) +test(0x0111, 0x0110); // LATIN SMALL LETTER D WITH STROKE (LATIN SMALL LETTER D BAR), LATIN CAPITAL LETTER D WITH STROKE (LATIN CAPITAL LETTER D BAR) +test(0x0112, 0x0113); // LATIN CAPITAL LETTER E WITH MACRON (LATIN CAPITAL LETTER E MACRON), LATIN SMALL LETTER E WITH MACRON (LATIN SMALL LETTER E MACRON) +test(0x0113, 0x0112); // LATIN SMALL LETTER E WITH MACRON (LATIN SMALL LETTER E MACRON), LATIN CAPITAL LETTER E WITH MACRON (LATIN CAPITAL LETTER E MACRON) +test(0x0114, 0x0115); // LATIN CAPITAL LETTER E WITH BREVE (LATIN CAPITAL LETTER E BREVE), LATIN SMALL LETTER E WITH BREVE (LATIN SMALL LETTER E BREVE) +test(0x0115, 0x0114); // LATIN SMALL LETTER E WITH BREVE (LATIN SMALL LETTER E BREVE), LATIN CAPITAL LETTER E WITH BREVE (LATIN CAPITAL LETTER E BREVE) +test(0x0116, 0x0117); // LATIN CAPITAL LETTER E WITH DOT ABOVE (LATIN CAPITAL LETTER E DOT), LATIN SMALL LETTER E WITH DOT ABOVE (LATIN SMALL LETTER E DOT) +test(0x0117, 0x0116); // LATIN SMALL LETTER E WITH DOT ABOVE (LATIN SMALL LETTER E DOT), LATIN CAPITAL LETTER E WITH DOT ABOVE (LATIN CAPITAL LETTER E DOT) +test(0x0118, 0x0119); // LATIN CAPITAL LETTER E WITH OGONEK (LATIN CAPITAL LETTER E OGONEK), LATIN SMALL LETTER E WITH OGONEK (LATIN SMALL LETTER E OGONEK) +test(0x0119, 0x0118); // LATIN SMALL LETTER E WITH OGONEK (LATIN SMALL LETTER E OGONEK), LATIN CAPITAL LETTER E WITH OGONEK (LATIN CAPITAL LETTER E OGONEK) +test(0x011A, 0x011B); // LATIN CAPITAL LETTER E WITH CARON (LATIN CAPITAL LETTER E HACEK), LATIN SMALL LETTER E WITH CARON (LATIN SMALL LETTER E HACEK) +test(0x011B, 0x011A); // LATIN SMALL LETTER E WITH CARON (LATIN SMALL LETTER E HACEK), LATIN CAPITAL LETTER E WITH CARON (LATIN CAPITAL LETTER E HACEK) +test(0x011C, 0x011D); // LATIN CAPITAL LETTER G WITH CIRCUMFLEX (LATIN CAPITAL LETTER G CIRCUMFLEX), LATIN SMALL LETTER G WITH CIRCUMFLEX (LATIN SMALL LETTER G CIRCUMFLEX) +test(0x011D, 0x011C); // LATIN SMALL LETTER G WITH CIRCUMFLEX (LATIN SMALL LETTER G CIRCUMFLEX), LATIN CAPITAL LETTER G WITH CIRCUMFLEX (LATIN CAPITAL LETTER G CIRCUMFLEX) +test(0x011E, 0x011F); // LATIN CAPITAL LETTER G WITH BREVE (LATIN CAPITAL LETTER G BREVE), LATIN SMALL LETTER G WITH BREVE (LATIN SMALL LETTER G BREVE) +test(0x011F, 0x011E); // LATIN SMALL LETTER G WITH BREVE (LATIN SMALL LETTER G BREVE), LATIN CAPITAL LETTER G WITH BREVE (LATIN CAPITAL LETTER G BREVE) +test(0x0120, 0x0121); // LATIN CAPITAL LETTER G WITH DOT ABOVE (LATIN CAPITAL LETTER G DOT), LATIN SMALL LETTER G WITH DOT ABOVE (LATIN SMALL LETTER G DOT) +test(0x0121, 0x0120); // LATIN SMALL LETTER G WITH DOT ABOVE (LATIN SMALL LETTER G DOT), LATIN CAPITAL LETTER G WITH DOT ABOVE (LATIN CAPITAL LETTER G DOT) +test(0x0122, 0x0123); // LATIN CAPITAL LETTER G WITH CEDILLA (LATIN CAPITAL LETTER G CEDILLA), LATIN SMALL LETTER G WITH CEDILLA (LATIN SMALL LETTER G CEDILLA) +test(0x0123, 0x0122); // LATIN SMALL LETTER G WITH CEDILLA (LATIN SMALL LETTER G CEDILLA), LATIN CAPITAL LETTER G WITH CEDILLA (LATIN CAPITAL LETTER G CEDILLA) +test(0x0124, 0x0125); // LATIN CAPITAL LETTER H WITH CIRCUMFLEX (LATIN CAPITAL LETTER H CIRCUMFLEX), LATIN SMALL LETTER H WITH CIRCUMFLEX (LATIN SMALL LETTER H CIRCUMFLEX) +test(0x0125, 0x0124); // LATIN SMALL LETTER H WITH CIRCUMFLEX (LATIN SMALL LETTER H CIRCUMFLEX), LATIN CAPITAL LETTER H WITH CIRCUMFLEX (LATIN CAPITAL LETTER H CIRCUMFLEX) +test(0x0126, 0x0127); // LATIN CAPITAL LETTER H WITH STROKE (LATIN CAPITAL LETTER H BAR), LATIN SMALL LETTER H WITH STROKE (LATIN SMALL LETTER H BAR) +test(0x0127, 0x0126); // LATIN SMALL LETTER H WITH STROKE (LATIN SMALL LETTER H BAR), LATIN CAPITAL LETTER H WITH STROKE (LATIN CAPITAL LETTER H BAR) +test(0x0128, 0x0129); // LATIN CAPITAL LETTER I WITH TILDE (LATIN CAPITAL LETTER I TILDE), LATIN SMALL LETTER I WITH TILDE (LATIN SMALL LETTER I TILDE) +test(0x0129, 0x0128); // LATIN SMALL LETTER I WITH TILDE (LATIN SMALL LETTER I TILDE), LATIN CAPITAL LETTER I WITH TILDE (LATIN CAPITAL LETTER I TILDE) +test(0x012A, 0x012B); // LATIN CAPITAL LETTER I WITH MACRON (LATIN CAPITAL LETTER I MACRON), LATIN SMALL LETTER I WITH MACRON (LATIN SMALL LETTER I MACRON) +test(0x012B, 0x012A); // LATIN SMALL LETTER I WITH MACRON (LATIN SMALL LETTER I MACRON), LATIN CAPITAL LETTER I WITH MACRON (LATIN CAPITAL LETTER I MACRON) +test(0x012C, 0x012D); // LATIN CAPITAL LETTER I WITH BREVE (LATIN CAPITAL LETTER I BREVE), LATIN SMALL LETTER I WITH BREVE (LATIN SMALL LETTER I BREVE) +test(0x012D, 0x012C); // LATIN SMALL LETTER I WITH BREVE (LATIN SMALL LETTER I BREVE), LATIN CAPITAL LETTER I WITH BREVE (LATIN CAPITAL LETTER I BREVE) +test(0x012E, 0x012F); // LATIN CAPITAL LETTER I WITH OGONEK (LATIN CAPITAL LETTER I OGONEK), LATIN SMALL LETTER I WITH OGONEK (LATIN SMALL LETTER I OGONEK) +test(0x012F, 0x012E); // LATIN SMALL LETTER I WITH OGONEK (LATIN SMALL LETTER I OGONEK), LATIN CAPITAL LETTER I WITH OGONEK (LATIN CAPITAL LETTER I OGONEK) +test(0x0132, 0x0133); // LATIN CAPITAL LIGATURE IJ (LATIN CAPITAL LETTER I J), LATIN SMALL LIGATURE IJ (LATIN SMALL LETTER I J) +test(0x0133, 0x0132); // LATIN SMALL LIGATURE IJ (LATIN SMALL LETTER I J), LATIN CAPITAL LIGATURE IJ (LATIN CAPITAL LETTER I J) +test(0x0134, 0x0135); // LATIN CAPITAL LETTER J WITH CIRCUMFLEX (LATIN CAPITAL LETTER J CIRCUMFLEX), LATIN SMALL LETTER J WITH CIRCUMFLEX (LATIN SMALL LETTER J CIRCUMFLEX) +test(0x0135, 0x0134); // LATIN SMALL LETTER J WITH CIRCUMFLEX (LATIN SMALL LETTER J CIRCUMFLEX), LATIN CAPITAL LETTER J WITH CIRCUMFLEX (LATIN CAPITAL LETTER J CIRCUMFLEX) +test(0x0136, 0x0137); // LATIN CAPITAL LETTER K WITH CEDILLA (LATIN CAPITAL LETTER K CEDILLA), LATIN SMALL LETTER K WITH CEDILLA (LATIN SMALL LETTER K CEDILLA) +test(0x0137, 0x0136); // LATIN SMALL LETTER K WITH CEDILLA (LATIN SMALL LETTER K CEDILLA), LATIN CAPITAL LETTER K WITH CEDILLA (LATIN CAPITAL LETTER K CEDILLA) +test(0x0139, 0x013A); // LATIN CAPITAL LETTER L WITH ACUTE (LATIN CAPITAL LETTER L ACUTE), LATIN SMALL LETTER L WITH ACUTE (LATIN SMALL LETTER L ACUTE) +test(0x013A, 0x0139); // LATIN SMALL LETTER L WITH ACUTE (LATIN SMALL LETTER L ACUTE), LATIN CAPITAL LETTER L WITH ACUTE (LATIN CAPITAL LETTER L ACUTE) +test(0x013B, 0x013C); // LATIN CAPITAL LETTER L WITH CEDILLA (LATIN CAPITAL LETTER L CEDILLA), LATIN SMALL LETTER L WITH CEDILLA (LATIN SMALL LETTER L CEDILLA) +test(0x013C, 0x013B); // LATIN SMALL LETTER L WITH CEDILLA (LATIN SMALL LETTER L CEDILLA), LATIN CAPITAL LETTER L WITH CEDILLA (LATIN CAPITAL LETTER L CEDILLA) +test(0x013D, 0x013E); // LATIN CAPITAL LETTER L WITH CARON (LATIN CAPITAL LETTER L HACEK), LATIN SMALL LETTER L WITH CARON (LATIN SMALL LETTER L HACEK) +test(0x013E, 0x013D); // LATIN SMALL LETTER L WITH CARON (LATIN SMALL LETTER L HACEK), LATIN CAPITAL LETTER L WITH CARON (LATIN CAPITAL LETTER L HACEK) +test(0x013F, 0x0140); // LATIN CAPITAL LETTER L WITH MIDDLE DOT, LATIN SMALL LETTER L WITH MIDDLE DOT +test(0x0140, 0x013F); // LATIN SMALL LETTER L WITH MIDDLE DOT, LATIN CAPITAL LETTER L WITH MIDDLE DOT +test(0x0141, 0x0142); // LATIN CAPITAL LETTER L WITH STROKE (LATIN CAPITAL LETTER L SLASH), LATIN SMALL LETTER L WITH STROKE (LATIN SMALL LETTER L SLASH) +test(0x0142, 0x0141); // LATIN SMALL LETTER L WITH STROKE (LATIN SMALL LETTER L SLASH), LATIN CAPITAL LETTER L WITH STROKE (LATIN CAPITAL LETTER L SLASH) +test(0x0143, 0x0144); // LATIN CAPITAL LETTER N WITH ACUTE (LATIN CAPITAL LETTER N ACUTE), LATIN SMALL LETTER N WITH ACUTE (LATIN SMALL LETTER N ACUTE) +test(0x0144, 0x0143); // LATIN SMALL LETTER N WITH ACUTE (LATIN SMALL LETTER N ACUTE), LATIN CAPITAL LETTER N WITH ACUTE (LATIN CAPITAL LETTER N ACUTE) +test(0x0145, 0x0146); // LATIN CAPITAL LETTER N WITH CEDILLA (LATIN CAPITAL LETTER N CEDILLA), LATIN SMALL LETTER N WITH CEDILLA (LATIN SMALL LETTER N CEDILLA) +test(0x0146, 0x0145); // LATIN SMALL LETTER N WITH CEDILLA (LATIN SMALL LETTER N CEDILLA), LATIN CAPITAL LETTER N WITH CEDILLA (LATIN CAPITAL LETTER N CEDILLA) +test(0x0147, 0x0148); // LATIN CAPITAL LETTER N WITH CARON (LATIN CAPITAL LETTER N HACEK), LATIN SMALL LETTER N WITH CARON (LATIN SMALL LETTER N HACEK) +test(0x0148, 0x0147); // LATIN SMALL LETTER N WITH CARON (LATIN SMALL LETTER N HACEK), LATIN CAPITAL LETTER N WITH CARON (LATIN CAPITAL LETTER N HACEK) +test(0x014A, 0x014B); // LATIN CAPITAL LETTER ENG, LATIN SMALL LETTER ENG +test(0x014B, 0x014A); // LATIN SMALL LETTER ENG, LATIN CAPITAL LETTER ENG +test(0x014C, 0x014D); // LATIN CAPITAL LETTER O WITH MACRON (LATIN CAPITAL LETTER O MACRON), LATIN SMALL LETTER O WITH MACRON (LATIN SMALL LETTER O MACRON) +test(0x014D, 0x014C); // LATIN SMALL LETTER O WITH MACRON (LATIN SMALL LETTER O MACRON), LATIN CAPITAL LETTER O WITH MACRON (LATIN CAPITAL LETTER O MACRON) +test(0x014E, 0x014F); // LATIN CAPITAL LETTER O WITH BREVE (LATIN CAPITAL LETTER O BREVE), LATIN SMALL LETTER O WITH BREVE (LATIN SMALL LETTER O BREVE) +test(0x014F, 0x014E); // LATIN SMALL LETTER O WITH BREVE (LATIN SMALL LETTER O BREVE), LATIN CAPITAL LETTER O WITH BREVE (LATIN CAPITAL LETTER O BREVE) +test(0x0150, 0x0151); // LATIN CAPITAL LETTER O WITH DOUBLE ACUTE (LATIN CAPITAL LETTER O DOUBLE ACUTE), LATIN SMALL LETTER O WITH DOUBLE ACUTE (LATIN SMALL LETTER O DOUBLE ACUTE) +test(0x0151, 0x0150); // LATIN SMALL LETTER O WITH DOUBLE ACUTE (LATIN SMALL LETTER O DOUBLE ACUTE), LATIN CAPITAL LETTER O WITH DOUBLE ACUTE (LATIN CAPITAL LETTER O DOUBLE ACUTE) +test(0x0152, 0x0153); // LATIN CAPITAL LIGATURE OE (LATIN CAPITAL LETTER O E), LATIN SMALL LIGATURE OE (LATIN SMALL LETTER O E) +test(0x0153, 0x0152); // LATIN SMALL LIGATURE OE (LATIN SMALL LETTER O E), LATIN CAPITAL LIGATURE OE (LATIN CAPITAL LETTER O E) +test(0x0154, 0x0155); // LATIN CAPITAL LETTER R WITH ACUTE (LATIN CAPITAL LETTER R ACUTE), LATIN SMALL LETTER R WITH ACUTE (LATIN SMALL LETTER R ACUTE) +test(0x0155, 0x0154); // LATIN SMALL LETTER R WITH ACUTE (LATIN SMALL LETTER R ACUTE), LATIN CAPITAL LETTER R WITH ACUTE (LATIN CAPITAL LETTER R ACUTE) +test(0x0156, 0x0157); // LATIN CAPITAL LETTER R WITH CEDILLA (LATIN CAPITAL LETTER R CEDILLA), LATIN SMALL LETTER R WITH CEDILLA (LATIN SMALL LETTER R CEDILLA) +test(0x0157, 0x0156); // LATIN SMALL LETTER R WITH CEDILLA (LATIN SMALL LETTER R CEDILLA), LATIN CAPITAL LETTER R WITH CEDILLA (LATIN CAPITAL LETTER R CEDILLA) +test(0x0158, 0x0159); // LATIN CAPITAL LETTER R WITH CARON (LATIN CAPITAL LETTER R HACEK), LATIN SMALL LETTER R WITH CARON (LATIN SMALL LETTER R HACEK) +test(0x0159, 0x0158); // LATIN SMALL LETTER R WITH CARON (LATIN SMALL LETTER R HACEK), LATIN CAPITAL LETTER R WITH CARON (LATIN CAPITAL LETTER R HACEK) +test(0x015A, 0x015B); // LATIN CAPITAL LETTER S WITH ACUTE (LATIN CAPITAL LETTER S ACUTE), LATIN SMALL LETTER S WITH ACUTE (LATIN SMALL LETTER S ACUTE) +test(0x015B, 0x015A); // LATIN SMALL LETTER S WITH ACUTE (LATIN SMALL LETTER S ACUTE), LATIN CAPITAL LETTER S WITH ACUTE (LATIN CAPITAL LETTER S ACUTE) +test(0x015C, 0x015D); // LATIN CAPITAL LETTER S WITH CIRCUMFLEX (LATIN CAPITAL LETTER S CIRCUMFLEX), LATIN SMALL LETTER S WITH CIRCUMFLEX (LATIN SMALL LETTER S CIRCUMFLEX) +test(0x015D, 0x015C); // LATIN SMALL LETTER S WITH CIRCUMFLEX (LATIN SMALL LETTER S CIRCUMFLEX), LATIN CAPITAL LETTER S WITH CIRCUMFLEX (LATIN CAPITAL LETTER S CIRCUMFLEX) +test(0x015E, 0x015F); // LATIN CAPITAL LETTER S WITH CEDILLA (LATIN CAPITAL LETTER S CEDILLA), LATIN SMALL LETTER S WITH CEDILLA (LATIN SMALL LETTER S CEDILLA) +test(0x015F, 0x015E); // LATIN SMALL LETTER S WITH CEDILLA (LATIN SMALL LETTER S CEDILLA), LATIN CAPITAL LETTER S WITH CEDILLA (LATIN CAPITAL LETTER S CEDILLA) +test(0x0160, 0x0161); // LATIN CAPITAL LETTER S WITH CARON (LATIN CAPITAL LETTER S HACEK), LATIN SMALL LETTER S WITH CARON (LATIN SMALL LETTER S HACEK) +test(0x0161, 0x0160); // LATIN SMALL LETTER S WITH CARON (LATIN SMALL LETTER S HACEK), LATIN CAPITAL LETTER S WITH CARON (LATIN CAPITAL LETTER S HACEK) +test(0x0162, 0x0163); // LATIN CAPITAL LETTER T WITH CEDILLA (LATIN CAPITAL LETTER T CEDILLA), LATIN SMALL LETTER T WITH CEDILLA (LATIN SMALL LETTER T CEDILLA) +test(0x0163, 0x0162); // LATIN SMALL LETTER T WITH CEDILLA (LATIN SMALL LETTER T CEDILLA), LATIN CAPITAL LETTER T WITH CEDILLA (LATIN CAPITAL LETTER T CEDILLA) +test(0x0164, 0x0165); // LATIN CAPITAL LETTER T WITH CARON (LATIN CAPITAL LETTER T HACEK), LATIN SMALL LETTER T WITH CARON (LATIN SMALL LETTER T HACEK) +test(0x0165, 0x0164); // LATIN SMALL LETTER T WITH CARON (LATIN SMALL LETTER T HACEK), LATIN CAPITAL LETTER T WITH CARON (LATIN CAPITAL LETTER T HACEK) +test(0x0166, 0x0167); // LATIN CAPITAL LETTER T WITH STROKE (LATIN CAPITAL LETTER T BAR), LATIN SMALL LETTER T WITH STROKE (LATIN SMALL LETTER T BAR) +test(0x0167, 0x0166); // LATIN SMALL LETTER T WITH STROKE (LATIN SMALL LETTER T BAR), LATIN CAPITAL LETTER T WITH STROKE (LATIN CAPITAL LETTER T BAR) +test(0x0168, 0x0169); // LATIN CAPITAL LETTER U WITH TILDE (LATIN CAPITAL LETTER U TILDE), LATIN SMALL LETTER U WITH TILDE (LATIN SMALL LETTER U TILDE) +test(0x0169, 0x0168); // LATIN SMALL LETTER U WITH TILDE (LATIN SMALL LETTER U TILDE), LATIN CAPITAL LETTER U WITH TILDE (LATIN CAPITAL LETTER U TILDE) +test(0x016A, 0x016B); // LATIN CAPITAL LETTER U WITH MACRON (LATIN CAPITAL LETTER U MACRON), LATIN SMALL LETTER U WITH MACRON (LATIN SMALL LETTER U MACRON) +test(0x016B, 0x016A); // LATIN SMALL LETTER U WITH MACRON (LATIN SMALL LETTER U MACRON), LATIN CAPITAL LETTER U WITH MACRON (LATIN CAPITAL LETTER U MACRON) +test(0x016C, 0x016D); // LATIN CAPITAL LETTER U WITH BREVE (LATIN CAPITAL LETTER U BREVE), LATIN SMALL LETTER U WITH BREVE (LATIN SMALL LETTER U BREVE) +test(0x016D, 0x016C); // LATIN SMALL LETTER U WITH BREVE (LATIN SMALL LETTER U BREVE), LATIN CAPITAL LETTER U WITH BREVE (LATIN CAPITAL LETTER U BREVE) +test(0x016E, 0x016F); // LATIN CAPITAL LETTER U WITH RING ABOVE (LATIN CAPITAL LETTER U RING), LATIN SMALL LETTER U WITH RING ABOVE (LATIN SMALL LETTER U RING) +test(0x016F, 0x016E); // LATIN SMALL LETTER U WITH RING ABOVE (LATIN SMALL LETTER U RING), LATIN CAPITAL LETTER U WITH RING ABOVE (LATIN CAPITAL LETTER U RING) +test(0x0170, 0x0171); // LATIN CAPITAL LETTER U WITH DOUBLE ACUTE (LATIN CAPITAL LETTER U DOUBLE ACUTE), LATIN SMALL LETTER U WITH DOUBLE ACUTE (LATIN SMALL LETTER U DOUBLE ACUTE) +test(0x0171, 0x0170); // LATIN SMALL LETTER U WITH DOUBLE ACUTE (LATIN SMALL LETTER U DOUBLE ACUTE), LATIN CAPITAL LETTER U WITH DOUBLE ACUTE (LATIN CAPITAL LETTER U DOUBLE ACUTE) +test(0x0172, 0x0173); // LATIN CAPITAL LETTER U WITH OGONEK (LATIN CAPITAL LETTER U OGONEK), LATIN SMALL LETTER U WITH OGONEK (LATIN SMALL LETTER U OGONEK) +test(0x0173, 0x0172); // LATIN SMALL LETTER U WITH OGONEK (LATIN SMALL LETTER U OGONEK), LATIN CAPITAL LETTER U WITH OGONEK (LATIN CAPITAL LETTER U OGONEK) +test(0x0174, 0x0175); // LATIN CAPITAL LETTER W WITH CIRCUMFLEX (LATIN CAPITAL LETTER W CIRCUMFLEX), LATIN SMALL LETTER W WITH CIRCUMFLEX (LATIN SMALL LETTER W CIRCUMFLEX) +test(0x0175, 0x0174); // LATIN SMALL LETTER W WITH CIRCUMFLEX (LATIN SMALL LETTER W CIRCUMFLEX), LATIN CAPITAL LETTER W WITH CIRCUMFLEX (LATIN CAPITAL LETTER W CIRCUMFLEX) +test(0x0176, 0x0177); // LATIN CAPITAL LETTER Y WITH CIRCUMFLEX (LATIN CAPITAL LETTER Y CIRCUMFLEX), LATIN SMALL LETTER Y WITH CIRCUMFLEX (LATIN SMALL LETTER Y CIRCUMFLEX) +test(0x0177, 0x0176); // LATIN SMALL LETTER Y WITH CIRCUMFLEX (LATIN SMALL LETTER Y CIRCUMFLEX), LATIN CAPITAL LETTER Y WITH CIRCUMFLEX (LATIN CAPITAL LETTER Y CIRCUMFLEX) +test(0x0178, 0x00FF); // LATIN CAPITAL LETTER Y WITH DIAERESIS (LATIN CAPITAL LETTER Y DIAERESIS), LATIN SMALL LETTER Y WITH DIAERESIS (LATIN SMALL LETTER Y DIAERESIS) +test(0x0179, 0x017A); // LATIN CAPITAL LETTER Z WITH ACUTE (LATIN CAPITAL LETTER Z ACUTE), LATIN SMALL LETTER Z WITH ACUTE (LATIN SMALL LETTER Z ACUTE) +test(0x017A, 0x0179); // LATIN SMALL LETTER Z WITH ACUTE (LATIN SMALL LETTER Z ACUTE), LATIN CAPITAL LETTER Z WITH ACUTE (LATIN CAPITAL LETTER Z ACUTE) +test(0x017B, 0x017C); // LATIN CAPITAL LETTER Z WITH DOT ABOVE (LATIN CAPITAL LETTER Z DOT), LATIN SMALL LETTER Z WITH DOT ABOVE (LATIN SMALL LETTER Z DOT) +test(0x017C, 0x017B); // LATIN SMALL LETTER Z WITH DOT ABOVE (LATIN SMALL LETTER Z DOT), LATIN CAPITAL LETTER Z WITH DOT ABOVE (LATIN CAPITAL LETTER Z DOT) +test(0x017D, 0x017E); // LATIN CAPITAL LETTER Z WITH CARON (LATIN CAPITAL LETTER Z HACEK), LATIN SMALL LETTER Z WITH CARON (LATIN SMALL LETTER Z HACEK) +test(0x017E, 0x017D); // LATIN SMALL LETTER Z WITH CARON (LATIN SMALL LETTER Z HACEK), LATIN CAPITAL LETTER Z WITH CARON (LATIN CAPITAL LETTER Z HACEK) +test(0x017F, 0x0073, 0x0053); // LATIN SMALL LETTER LONG S, LATIN SMALL LETTER S, LATIN CAPITAL LETTER S +test(0x0180, 0x0243); // LATIN SMALL LETTER B WITH STROKE (LATIN SMALL LETTER B BAR), LATIN CAPITAL LETTER B WITH STROKE +test(0x0181, 0x0253); // LATIN CAPITAL LETTER B WITH HOOK (LATIN CAPITAL LETTER B HOOK), LATIN SMALL LETTER B WITH HOOK (LATIN SMALL LETTER B HOOK) +test(0x0182, 0x0183); // LATIN CAPITAL LETTER B WITH TOPBAR (LATIN CAPITAL LETTER B TOPBAR), LATIN SMALL LETTER B WITH TOPBAR (LATIN SMALL LETTER B TOPBAR) +test(0x0183, 0x0182); // LATIN SMALL LETTER B WITH TOPBAR (LATIN SMALL LETTER B TOPBAR), LATIN CAPITAL LETTER B WITH TOPBAR (LATIN CAPITAL LETTER B TOPBAR) +test(0x0184, 0x0185); // LATIN CAPITAL LETTER TONE SIX, LATIN SMALL LETTER TONE SIX +test(0x0185, 0x0184); // LATIN SMALL LETTER TONE SIX, LATIN CAPITAL LETTER TONE SIX +test(0x0186, 0x0254); // LATIN CAPITAL LETTER OPEN O, LATIN SMALL LETTER OPEN O +test(0x0187, 0x0188); // LATIN CAPITAL LETTER C WITH HOOK (LATIN CAPITAL LETTER C HOOK), LATIN SMALL LETTER C WITH HOOK (LATIN SMALL LETTER C HOOK) +test(0x0188, 0x0187); // LATIN SMALL LETTER C WITH HOOK (LATIN SMALL LETTER C HOOK), LATIN CAPITAL LETTER C WITH HOOK (LATIN CAPITAL LETTER C HOOK) +test(0x0189, 0x0256); // LATIN CAPITAL LETTER AFRICAN D, LATIN SMALL LETTER D WITH TAIL (LATIN SMALL LETTER D RETROFLEX HOOK) +test(0x018A, 0x0257); // LATIN CAPITAL LETTER D WITH HOOK (LATIN CAPITAL LETTER D HOOK), LATIN SMALL LETTER D WITH HOOK (LATIN SMALL LETTER D HOOK) +test(0x018B, 0x018C); // LATIN CAPITAL LETTER D WITH TOPBAR (LATIN CAPITAL LETTER D TOPBAR), LATIN SMALL LETTER D WITH TOPBAR (LATIN SMALL LETTER D TOPBAR) +test(0x018C, 0x018B); // LATIN SMALL LETTER D WITH TOPBAR (LATIN SMALL LETTER D TOPBAR), LATIN CAPITAL LETTER D WITH TOPBAR (LATIN CAPITAL LETTER D TOPBAR) +test(0x018E, 0x01DD); // LATIN CAPITAL LETTER REVERSED E (LATIN CAPITAL LETTER TURNED E), LATIN SMALL LETTER TURNED E +test(0x018F, 0x0259); // LATIN CAPITAL LETTER SCHWA, LATIN SMALL LETTER SCHWA +test(0x0190, 0x025B); // LATIN CAPITAL LETTER OPEN E (LATIN CAPITAL LETTER EPSILON), LATIN SMALL LETTER OPEN E (LATIN SMALL LETTER EPSILON) +test(0x0191, 0x0192); // LATIN CAPITAL LETTER F WITH HOOK (LATIN CAPITAL LETTER F HOOK), LATIN SMALL LETTER F WITH HOOK (LATIN SMALL LETTER SCRIPT F) +test(0x0192, 0x0191); // LATIN SMALL LETTER F WITH HOOK (LATIN SMALL LETTER SCRIPT F), LATIN CAPITAL LETTER F WITH HOOK (LATIN CAPITAL LETTER F HOOK) +test(0x0193, 0x0260); // LATIN CAPITAL LETTER G WITH HOOK (LATIN CAPITAL LETTER G HOOK), LATIN SMALL LETTER G WITH HOOK (LATIN SMALL LETTER G HOOK) +test(0x0194, 0x0263); // LATIN CAPITAL LETTER GAMMA, LATIN SMALL LETTER GAMMA +test(0x0195, 0x01F6); // LATIN SMALL LETTER HV (LATIN SMALL LETTER H V), LATIN CAPITAL LETTER HWAIR +test(0x0196, 0x0269); // LATIN CAPITAL LETTER IOTA, LATIN SMALL LETTER IOTA +test(0x0197, 0x0268); // LATIN CAPITAL LETTER I WITH STROKE (LATIN CAPITAL LETTER BARRED I), LATIN SMALL LETTER I WITH STROKE (LATIN SMALL LETTER BARRED I) +test(0x0198, 0x0199); // LATIN CAPITAL LETTER K WITH HOOK (LATIN CAPITAL LETTER K HOOK), LATIN SMALL LETTER K WITH HOOK (LATIN SMALL LETTER K HOOK) +test(0x0199, 0x0198); // LATIN SMALL LETTER K WITH HOOK (LATIN SMALL LETTER K HOOK), LATIN CAPITAL LETTER K WITH HOOK (LATIN CAPITAL LETTER K HOOK) +test(0x019A, 0x023D); // LATIN SMALL LETTER L WITH BAR (LATIN SMALL LETTER BARRED L), LATIN CAPITAL LETTER L WITH BAR +test(0x019C, 0x026F); // LATIN CAPITAL LETTER TURNED M, LATIN SMALL LETTER TURNED M +test(0x019D, 0x0272); // LATIN CAPITAL LETTER N WITH LEFT HOOK (LATIN CAPITAL LETTER N HOOK), LATIN SMALL LETTER N WITH LEFT HOOK (LATIN SMALL LETTER N HOOK) +test(0x019E, 0x0220); // LATIN SMALL LETTER N WITH LONG RIGHT LEG, LATIN CAPITAL LETTER N WITH LONG RIGHT LEG +test(0x019F, 0x0275); // LATIN CAPITAL LETTER O WITH MIDDLE TILDE (LATIN CAPITAL LETTER BARRED O), LATIN SMALL LETTER BARRED O +test(0x01A0, 0x01A1); // LATIN CAPITAL LETTER O WITH HORN (LATIN CAPITAL LETTER O HORN), LATIN SMALL LETTER O WITH HORN (LATIN SMALL LETTER O HORN) +test(0x01A1, 0x01A0); // LATIN SMALL LETTER O WITH HORN (LATIN SMALL LETTER O HORN), LATIN CAPITAL LETTER O WITH HORN (LATIN CAPITAL LETTER O HORN) +test(0x01A2, 0x01A3); // LATIN CAPITAL LETTER OI (LATIN CAPITAL LETTER O I), LATIN SMALL LETTER OI (LATIN SMALL LETTER O I) +test(0x01A3, 0x01A2); // LATIN SMALL LETTER OI (LATIN SMALL LETTER O I), LATIN CAPITAL LETTER OI (LATIN CAPITAL LETTER O I) +test(0x01A4, 0x01A5); // LATIN CAPITAL LETTER P WITH HOOK (LATIN CAPITAL LETTER P HOOK), LATIN SMALL LETTER P WITH HOOK (LATIN SMALL LETTER P HOOK) +test(0x01A5, 0x01A4); // LATIN SMALL LETTER P WITH HOOK (LATIN SMALL LETTER P HOOK), LATIN CAPITAL LETTER P WITH HOOK (LATIN CAPITAL LETTER P HOOK) +test(0x01A6, 0x0280); // LATIN LETTER YR (LATIN LETTER Y R), LATIN LETTER SMALL CAPITAL R +test(0x01A7, 0x01A8); // LATIN CAPITAL LETTER TONE TWO, LATIN SMALL LETTER TONE TWO +test(0x01A8, 0x01A7); // LATIN SMALL LETTER TONE TWO, LATIN CAPITAL LETTER TONE TWO +test(0x01A9, 0x0283); // LATIN CAPITAL LETTER ESH, LATIN SMALL LETTER ESH +test(0x01AC, 0x01AD); // LATIN CAPITAL LETTER T WITH HOOK (LATIN CAPITAL LETTER T HOOK), LATIN SMALL LETTER T WITH HOOK (LATIN SMALL LETTER T HOOK) +test(0x01AD, 0x01AC); // LATIN SMALL LETTER T WITH HOOK (LATIN SMALL LETTER T HOOK), LATIN CAPITAL LETTER T WITH HOOK (LATIN CAPITAL LETTER T HOOK) +test(0x01AE, 0x0288); // LATIN CAPITAL LETTER T WITH RETROFLEX HOOK (LATIN CAPITAL LETTER T RETROFLEX HOOK), LATIN SMALL LETTER T WITH RETROFLEX HOOK (LATIN SMALL LETTER T RETROFLEX HOOK) +test(0x01AF, 0x01B0); // LATIN CAPITAL LETTER U WITH HORN (LATIN CAPITAL LETTER U HORN), LATIN SMALL LETTER U WITH HORN (LATIN SMALL LETTER U HORN) +test(0x01B0, 0x01AF); // LATIN SMALL LETTER U WITH HORN (LATIN SMALL LETTER U HORN), LATIN CAPITAL LETTER U WITH HORN (LATIN CAPITAL LETTER U HORN) +test(0x01B1, 0x028A); // LATIN CAPITAL LETTER UPSILON, LATIN SMALL LETTER UPSILON +test(0x01B2, 0x028B); // LATIN CAPITAL LETTER V WITH HOOK (LATIN CAPITAL LETTER SCRIPT V), LATIN SMALL LETTER V WITH HOOK (LATIN SMALL LETTER SCRIPT V) +test(0x01B3, 0x01B4); // LATIN CAPITAL LETTER Y WITH HOOK (LATIN CAPITAL LETTER Y HOOK), LATIN SMALL LETTER Y WITH HOOK (LATIN SMALL LETTER Y HOOK) +test(0x01B4, 0x01B3); // LATIN SMALL LETTER Y WITH HOOK (LATIN SMALL LETTER Y HOOK), LATIN CAPITAL LETTER Y WITH HOOK (LATIN CAPITAL LETTER Y HOOK) +test(0x01B5, 0x01B6); // LATIN CAPITAL LETTER Z WITH STROKE (LATIN CAPITAL LETTER Z BAR), LATIN SMALL LETTER Z WITH STROKE (LATIN SMALL LETTER Z BAR) +test(0x01B6, 0x01B5); // LATIN SMALL LETTER Z WITH STROKE (LATIN SMALL LETTER Z BAR), LATIN CAPITAL LETTER Z WITH STROKE (LATIN CAPITAL LETTER Z BAR) +test(0x01B7, 0x0292); // LATIN CAPITAL LETTER EZH (LATIN CAPITAL LETTER YOGH), LATIN SMALL LETTER EZH (LATIN SMALL LETTER YOGH) +test(0x01B8, 0x01B9); // LATIN CAPITAL LETTER EZH REVERSED (LATIN CAPITAL LETTER REVERSED YOGH), LATIN SMALL LETTER EZH REVERSED (LATIN SMALL LETTER REVERSED YOGH) +test(0x01B9, 0x01B8); // LATIN SMALL LETTER EZH REVERSED (LATIN SMALL LETTER REVERSED YOGH), LATIN CAPITAL LETTER EZH REVERSED (LATIN CAPITAL LETTER REVERSED YOGH) +test(0x01BC, 0x01BD); // LATIN CAPITAL LETTER TONE FIVE, LATIN SMALL LETTER TONE FIVE +test(0x01BD, 0x01BC); // LATIN SMALL LETTER TONE FIVE, LATIN CAPITAL LETTER TONE FIVE +test(0x01BF, 0x01F7); // LATIN LETTER WYNN, LATIN CAPITAL LETTER WYNN +test(0x01C4, 0x01C6, 0x01C5); // LATIN CAPITAL LETTER DZ WITH CARON (LATIN CAPITAL LETTER D Z HACEK), LATIN SMALL LETTER DZ WITH CARON (LATIN SMALL LETTER D Z HACEK), LATIN CAPITAL LETTER D WITH SMALL LETTER Z WITH CARON (LATIN LETTER CAPITAL D SMALL Z HACEK) +test(0x01C5, 0x01C6, 0x01C4); // LATIN CAPITAL LETTER D WITH SMALL LETTER Z WITH CARON (LATIN LETTER CAPITAL D SMALL Z HACEK), LATIN SMALL LETTER DZ WITH CARON (LATIN SMALL LETTER D Z HACEK), LATIN CAPITAL LETTER DZ WITH CARON (LATIN CAPITAL LETTER D Z HACEK) +test(0x01C6, 0x01C4, 0x01C5); // LATIN SMALL LETTER DZ WITH CARON (LATIN SMALL LETTER D Z HACEK), LATIN CAPITAL LETTER DZ WITH CARON (LATIN CAPITAL LETTER D Z HACEK), LATIN CAPITAL LETTER D WITH SMALL LETTER Z WITH CARON (LATIN LETTER CAPITAL D SMALL Z HACEK) +test(0x01C7, 0x01C9, 0x01C8); // LATIN CAPITAL LETTER LJ (LATIN CAPITAL LETTER L J), LATIN SMALL LETTER LJ (LATIN SMALL LETTER L J), LATIN CAPITAL LETTER L WITH SMALL LETTER J (LATIN LETTER CAPITAL L SMALL J) +test(0x01C8, 0x01C9, 0x01C7); // LATIN CAPITAL LETTER L WITH SMALL LETTER J (LATIN LETTER CAPITAL L SMALL J), LATIN SMALL LETTER LJ (LATIN SMALL LETTER L J), LATIN CAPITAL LETTER LJ (LATIN CAPITAL LETTER L J) +test(0x01C9, 0x01C7, 0x01C8); // LATIN SMALL LETTER LJ (LATIN SMALL LETTER L J), LATIN CAPITAL LETTER LJ (LATIN CAPITAL LETTER L J), LATIN CAPITAL LETTER L WITH SMALL LETTER J (LATIN LETTER CAPITAL L SMALL J) +test(0x01CA, 0x01CC, 0x01CB); // LATIN CAPITAL LETTER NJ (LATIN CAPITAL LETTER N J), LATIN SMALL LETTER NJ (LATIN SMALL LETTER N J), LATIN CAPITAL LETTER N WITH SMALL LETTER J (LATIN LETTER CAPITAL N SMALL J) +test(0x01CB, 0x01CC, 0x01CA); // LATIN CAPITAL LETTER N WITH SMALL LETTER J (LATIN LETTER CAPITAL N SMALL J), LATIN SMALL LETTER NJ (LATIN SMALL LETTER N J), LATIN CAPITAL LETTER NJ (LATIN CAPITAL LETTER N J) +test(0x01CC, 0x01CA, 0x01CB); // LATIN SMALL LETTER NJ (LATIN SMALL LETTER N J), LATIN CAPITAL LETTER NJ (LATIN CAPITAL LETTER N J), LATIN CAPITAL LETTER N WITH SMALL LETTER J (LATIN LETTER CAPITAL N SMALL J) +test(0x01CD, 0x01CE); // LATIN CAPITAL LETTER A WITH CARON (LATIN CAPITAL LETTER A HACEK), LATIN SMALL LETTER A WITH CARON (LATIN SMALL LETTER A HACEK) +test(0x01CE, 0x01CD); // LATIN SMALL LETTER A WITH CARON (LATIN SMALL LETTER A HACEK), LATIN CAPITAL LETTER A WITH CARON (LATIN CAPITAL LETTER A HACEK) +test(0x01CF, 0x01D0); // LATIN CAPITAL LETTER I WITH CARON (LATIN CAPITAL LETTER I HACEK), LATIN SMALL LETTER I WITH CARON (LATIN SMALL LETTER I HACEK) +test(0x01D0, 0x01CF); // LATIN SMALL LETTER I WITH CARON (LATIN SMALL LETTER I HACEK), LATIN CAPITAL LETTER I WITH CARON (LATIN CAPITAL LETTER I HACEK) +test(0x01D1, 0x01D2); // LATIN CAPITAL LETTER O WITH CARON (LATIN CAPITAL LETTER O HACEK), LATIN SMALL LETTER O WITH CARON (LATIN SMALL LETTER O HACEK) +test(0x01D2, 0x01D1); // LATIN SMALL LETTER O WITH CARON (LATIN SMALL LETTER O HACEK), LATIN CAPITAL LETTER O WITH CARON (LATIN CAPITAL LETTER O HACEK) +test(0x01D3, 0x01D4); // LATIN CAPITAL LETTER U WITH CARON (LATIN CAPITAL LETTER U HACEK), LATIN SMALL LETTER U WITH CARON (LATIN SMALL LETTER U HACEK) +test(0x01D4, 0x01D3); // LATIN SMALL LETTER U WITH CARON (LATIN SMALL LETTER U HACEK), LATIN CAPITAL LETTER U WITH CARON (LATIN CAPITAL LETTER U HACEK) +test(0x01D5, 0x01D6); // LATIN CAPITAL LETTER U WITH DIAERESIS AND MACRON (LATIN CAPITAL LETTER U DIAERESIS MACRON), LATIN SMALL LETTER U WITH DIAERESIS AND MACRON (LATIN SMALL LETTER U DIAERESIS MACRON) +test(0x01D6, 0x01D5); // LATIN SMALL LETTER U WITH DIAERESIS AND MACRON (LATIN SMALL LETTER U DIAERESIS MACRON), LATIN CAPITAL LETTER U WITH DIAERESIS AND MACRON (LATIN CAPITAL LETTER U DIAERESIS MACRON) +test(0x01D7, 0x01D8); // LATIN CAPITAL LETTER U WITH DIAERESIS AND ACUTE (LATIN CAPITAL LETTER U DIAERESIS ACUTE), LATIN SMALL LETTER U WITH DIAERESIS AND ACUTE (LATIN SMALL LETTER U DIAERESIS ACUTE) +test(0x01D8, 0x01D7); // LATIN SMALL LETTER U WITH DIAERESIS AND ACUTE (LATIN SMALL LETTER U DIAERESIS ACUTE), LATIN CAPITAL LETTER U WITH DIAERESIS AND ACUTE (LATIN CAPITAL LETTER U DIAERESIS ACUTE) +test(0x01D9, 0x01DA); // LATIN CAPITAL LETTER U WITH DIAERESIS AND CARON (LATIN CAPITAL LETTER U DIAERESIS HACEK), LATIN SMALL LETTER U WITH DIAERESIS AND CARON (LATIN SMALL LETTER U DIAERESIS HACEK) +test(0x01DA, 0x01D9); // LATIN SMALL LETTER U WITH DIAERESIS AND CARON (LATIN SMALL LETTER U DIAERESIS HACEK), LATIN CAPITAL LETTER U WITH DIAERESIS AND CARON (LATIN CAPITAL LETTER U DIAERESIS HACEK) +test(0x01DB, 0x01DC); // LATIN CAPITAL LETTER U WITH DIAERESIS AND GRAVE (LATIN CAPITAL LETTER U DIAERESIS GRAVE), LATIN SMALL LETTER U WITH DIAERESIS AND GRAVE (LATIN SMALL LETTER U DIAERESIS GRAVE) +test(0x01DC, 0x01DB); // LATIN SMALL LETTER U WITH DIAERESIS AND GRAVE (LATIN SMALL LETTER U DIAERESIS GRAVE), LATIN CAPITAL LETTER U WITH DIAERESIS AND GRAVE (LATIN CAPITAL LETTER U DIAERESIS GRAVE) +test(0x01DD, 0x018E); // LATIN SMALL LETTER TURNED E, LATIN CAPITAL LETTER REVERSED E (LATIN CAPITAL LETTER TURNED E) +test(0x01DE, 0x01DF); // LATIN CAPITAL LETTER A WITH DIAERESIS AND MACRON (LATIN CAPITAL LETTER A DIAERESIS MACRON), LATIN SMALL LETTER A WITH DIAERESIS AND MACRON (LATIN SMALL LETTER A DIAERESIS MACRON) +test(0x01DF, 0x01DE); // LATIN SMALL LETTER A WITH DIAERESIS AND MACRON (LATIN SMALL LETTER A DIAERESIS MACRON), LATIN CAPITAL LETTER A WITH DIAERESIS AND MACRON (LATIN CAPITAL LETTER A DIAERESIS MACRON) +test(0x01E0, 0x01E1); // LATIN CAPITAL LETTER A WITH DOT ABOVE AND MACRON (LATIN CAPITAL LETTER A DOT MACRON), LATIN SMALL LETTER A WITH DOT ABOVE AND MACRON (LATIN SMALL LETTER A DOT MACRON) +test(0x01E1, 0x01E0); // LATIN SMALL LETTER A WITH DOT ABOVE AND MACRON (LATIN SMALL LETTER A DOT MACRON), LATIN CAPITAL LETTER A WITH DOT ABOVE AND MACRON (LATIN CAPITAL LETTER A DOT MACRON) +test(0x01E2, 0x01E3); // LATIN CAPITAL LETTER AE WITH MACRON (LATIN CAPITAL LETTER A E MACRON), LATIN SMALL LETTER AE WITH MACRON (LATIN SMALL LETTER A E MACRON) +test(0x01E3, 0x01E2); // LATIN SMALL LETTER AE WITH MACRON (LATIN SMALL LETTER A E MACRON), LATIN CAPITAL LETTER AE WITH MACRON (LATIN CAPITAL LETTER A E MACRON) +test(0x01E4, 0x01E5); // LATIN CAPITAL LETTER G WITH STROKE (LATIN CAPITAL LETTER G BAR), LATIN SMALL LETTER G WITH STROKE (LATIN SMALL LETTER G BAR) +test(0x01E5, 0x01E4); // LATIN SMALL LETTER G WITH STROKE (LATIN SMALL LETTER G BAR), LATIN CAPITAL LETTER G WITH STROKE (LATIN CAPITAL LETTER G BAR) +test(0x01E6, 0x01E7); // LATIN CAPITAL LETTER G WITH CARON (LATIN CAPITAL LETTER G HACEK), LATIN SMALL LETTER G WITH CARON (LATIN SMALL LETTER G HACEK) +test(0x01E7, 0x01E6); // LATIN SMALL LETTER G WITH CARON (LATIN SMALL LETTER G HACEK), LATIN CAPITAL LETTER G WITH CARON (LATIN CAPITAL LETTER G HACEK) +test(0x01E8, 0x01E9); // LATIN CAPITAL LETTER K WITH CARON (LATIN CAPITAL LETTER K HACEK), LATIN SMALL LETTER K WITH CARON (LATIN SMALL LETTER K HACEK) +test(0x01E9, 0x01E8); // LATIN SMALL LETTER K WITH CARON (LATIN SMALL LETTER K HACEK), LATIN CAPITAL LETTER K WITH CARON (LATIN CAPITAL LETTER K HACEK) +test(0x01EA, 0x01EB); // LATIN CAPITAL LETTER O WITH OGONEK (LATIN CAPITAL LETTER O OGONEK), LATIN SMALL LETTER O WITH OGONEK (LATIN SMALL LETTER O OGONEK) +test(0x01EB, 0x01EA); // LATIN SMALL LETTER O WITH OGONEK (LATIN SMALL LETTER O OGONEK), LATIN CAPITAL LETTER O WITH OGONEK (LATIN CAPITAL LETTER O OGONEK) +test(0x01EC, 0x01ED); // LATIN CAPITAL LETTER O WITH OGONEK AND MACRON (LATIN CAPITAL LETTER O OGONEK MACRON), LATIN SMALL LETTER O WITH OGONEK AND MACRON (LATIN SMALL LETTER O OGONEK MACRON) +test(0x01ED, 0x01EC); // LATIN SMALL LETTER O WITH OGONEK AND MACRON (LATIN SMALL LETTER O OGONEK MACRON), LATIN CAPITAL LETTER O WITH OGONEK AND MACRON (LATIN CAPITAL LETTER O OGONEK MACRON) +test(0x01EE, 0x01EF); // LATIN CAPITAL LETTER EZH WITH CARON (LATIN CAPITAL LETTER YOGH HACEK), LATIN SMALL LETTER EZH WITH CARON (LATIN SMALL LETTER YOGH HACEK) +test(0x01EF, 0x01EE); // LATIN SMALL LETTER EZH WITH CARON (LATIN SMALL LETTER YOGH HACEK), LATIN CAPITAL LETTER EZH WITH CARON (LATIN CAPITAL LETTER YOGH HACEK) +test(0x01F1, 0x01F3, 0x01F2); // LATIN CAPITAL LETTER DZ, LATIN SMALL LETTER DZ, LATIN CAPITAL LETTER D WITH SMALL LETTER Z +test(0x01F2, 0x01F3, 0x01F1); // LATIN CAPITAL LETTER D WITH SMALL LETTER Z, LATIN SMALL LETTER DZ, LATIN CAPITAL LETTER DZ +test(0x01F3, 0x01F1, 0x01F2); // LATIN SMALL LETTER DZ, LATIN CAPITAL LETTER DZ, LATIN CAPITAL LETTER D WITH SMALL LETTER Z +test(0x01F4, 0x01F5); // LATIN CAPITAL LETTER G WITH ACUTE, LATIN SMALL LETTER G WITH ACUTE +test(0x01F5, 0x01F4); // LATIN SMALL LETTER G WITH ACUTE, LATIN CAPITAL LETTER G WITH ACUTE +test(0x01F6, 0x0195); // LATIN CAPITAL LETTER HWAIR, LATIN SMALL LETTER HV (LATIN SMALL LETTER H V) +test(0x01F7, 0x01BF); // LATIN CAPITAL LETTER WYNN, LATIN LETTER WYNN +test(0x01F8, 0x01F9); // LATIN CAPITAL LETTER N WITH GRAVE, LATIN SMALL LETTER N WITH GRAVE +test(0x01F9, 0x01F8); // LATIN SMALL LETTER N WITH GRAVE, LATIN CAPITAL LETTER N WITH GRAVE +test(0x01FA, 0x01FB); // LATIN CAPITAL LETTER A WITH RING ABOVE AND ACUTE, LATIN SMALL LETTER A WITH RING ABOVE AND ACUTE +test(0x01FB, 0x01FA); // LATIN SMALL LETTER A WITH RING ABOVE AND ACUTE, LATIN CAPITAL LETTER A WITH RING ABOVE AND ACUTE +test(0x01FC, 0x01FD); // LATIN CAPITAL LETTER AE WITH ACUTE, LATIN SMALL LETTER AE WITH ACUTE +test(0x01FD, 0x01FC); // LATIN SMALL LETTER AE WITH ACUTE, LATIN CAPITAL LETTER AE WITH ACUTE +test(0x01FE, 0x01FF); // LATIN CAPITAL LETTER O WITH STROKE AND ACUTE, LATIN SMALL LETTER O WITH STROKE AND ACUTE +test(0x01FF, 0x01FE); // LATIN SMALL LETTER O WITH STROKE AND ACUTE, LATIN CAPITAL LETTER O WITH STROKE AND ACUTE +test(0x0200, 0x0201); // LATIN CAPITAL LETTER A WITH DOUBLE GRAVE, LATIN SMALL LETTER A WITH DOUBLE GRAVE +test(0x0201, 0x0200); // LATIN SMALL LETTER A WITH DOUBLE GRAVE, LATIN CAPITAL LETTER A WITH DOUBLE GRAVE +test(0x0202, 0x0203); // LATIN CAPITAL LETTER A WITH INVERTED BREVE, LATIN SMALL LETTER A WITH INVERTED BREVE +test(0x0203, 0x0202); // LATIN SMALL LETTER A WITH INVERTED BREVE, LATIN CAPITAL LETTER A WITH INVERTED BREVE +test(0x0204, 0x0205); // LATIN CAPITAL LETTER E WITH DOUBLE GRAVE, LATIN SMALL LETTER E WITH DOUBLE GRAVE +test(0x0205, 0x0204); // LATIN SMALL LETTER E WITH DOUBLE GRAVE, LATIN CAPITAL LETTER E WITH DOUBLE GRAVE +test(0x0206, 0x0207); // LATIN CAPITAL LETTER E WITH INVERTED BREVE, LATIN SMALL LETTER E WITH INVERTED BREVE +test(0x0207, 0x0206); // LATIN SMALL LETTER E WITH INVERTED BREVE, LATIN CAPITAL LETTER E WITH INVERTED BREVE +test(0x0208, 0x0209); // LATIN CAPITAL LETTER I WITH DOUBLE GRAVE, LATIN SMALL LETTER I WITH DOUBLE GRAVE +test(0x0209, 0x0208); // LATIN SMALL LETTER I WITH DOUBLE GRAVE, LATIN CAPITAL LETTER I WITH DOUBLE GRAVE +test(0x020A, 0x020B); // LATIN CAPITAL LETTER I WITH INVERTED BREVE, LATIN SMALL LETTER I WITH INVERTED BREVE +test(0x020B, 0x020A); // LATIN SMALL LETTER I WITH INVERTED BREVE, LATIN CAPITAL LETTER I WITH INVERTED BREVE +test(0x020C, 0x020D); // LATIN CAPITAL LETTER O WITH DOUBLE GRAVE, LATIN SMALL LETTER O WITH DOUBLE GRAVE +test(0x020D, 0x020C); // LATIN SMALL LETTER O WITH DOUBLE GRAVE, LATIN CAPITAL LETTER O WITH DOUBLE GRAVE +test(0x020E, 0x020F); // LATIN CAPITAL LETTER O WITH INVERTED BREVE, LATIN SMALL LETTER O WITH INVERTED BREVE +test(0x020F, 0x020E); // LATIN SMALL LETTER O WITH INVERTED BREVE, LATIN CAPITAL LETTER O WITH INVERTED BREVE +test(0x0210, 0x0211); // LATIN CAPITAL LETTER R WITH DOUBLE GRAVE, LATIN SMALL LETTER R WITH DOUBLE GRAVE +test(0x0211, 0x0210); // LATIN SMALL LETTER R WITH DOUBLE GRAVE, LATIN CAPITAL LETTER R WITH DOUBLE GRAVE +test(0x0212, 0x0213); // LATIN CAPITAL LETTER R WITH INVERTED BREVE, LATIN SMALL LETTER R WITH INVERTED BREVE +test(0x0213, 0x0212); // LATIN SMALL LETTER R WITH INVERTED BREVE, LATIN CAPITAL LETTER R WITH INVERTED BREVE +test(0x0214, 0x0215); // LATIN CAPITAL LETTER U WITH DOUBLE GRAVE, LATIN SMALL LETTER U WITH DOUBLE GRAVE +test(0x0215, 0x0214); // LATIN SMALL LETTER U WITH DOUBLE GRAVE, LATIN CAPITAL LETTER U WITH DOUBLE GRAVE +test(0x0216, 0x0217); // LATIN CAPITAL LETTER U WITH INVERTED BREVE, LATIN SMALL LETTER U WITH INVERTED BREVE +test(0x0217, 0x0216); // LATIN SMALL LETTER U WITH INVERTED BREVE, LATIN CAPITAL LETTER U WITH INVERTED BREVE +test(0x0218, 0x0219); // LATIN CAPITAL LETTER S WITH COMMA BELOW, LATIN SMALL LETTER S WITH COMMA BELOW +test(0x0219, 0x0218); // LATIN SMALL LETTER S WITH COMMA BELOW, LATIN CAPITAL LETTER S WITH COMMA BELOW +test(0x021A, 0x021B); // LATIN CAPITAL LETTER T WITH COMMA BELOW, LATIN SMALL LETTER T WITH COMMA BELOW +test(0x021B, 0x021A); // LATIN SMALL LETTER T WITH COMMA BELOW, LATIN CAPITAL LETTER T WITH COMMA BELOW +test(0x021C, 0x021D); // LATIN CAPITAL LETTER YOGH, LATIN SMALL LETTER YOGH +test(0x021D, 0x021C); // LATIN SMALL LETTER YOGH, LATIN CAPITAL LETTER YOGH +test(0x021E, 0x021F); // LATIN CAPITAL LETTER H WITH CARON, LATIN SMALL LETTER H WITH CARON +test(0x021F, 0x021E); // LATIN SMALL LETTER H WITH CARON, LATIN CAPITAL LETTER H WITH CARON +test(0x0220, 0x019E); // LATIN CAPITAL LETTER N WITH LONG RIGHT LEG, LATIN SMALL LETTER N WITH LONG RIGHT LEG +test(0x0222, 0x0223); // LATIN CAPITAL LETTER OU, LATIN SMALL LETTER OU +test(0x0223, 0x0222); // LATIN SMALL LETTER OU, LATIN CAPITAL LETTER OU +test(0x0224, 0x0225); // LATIN CAPITAL LETTER Z WITH HOOK, LATIN SMALL LETTER Z WITH HOOK +test(0x0225, 0x0224); // LATIN SMALL LETTER Z WITH HOOK, LATIN CAPITAL LETTER Z WITH HOOK +test(0x0226, 0x0227); // LATIN CAPITAL LETTER A WITH DOT ABOVE, LATIN SMALL LETTER A WITH DOT ABOVE +test(0x0227, 0x0226); // LATIN SMALL LETTER A WITH DOT ABOVE, LATIN CAPITAL LETTER A WITH DOT ABOVE +test(0x0228, 0x0229); // LATIN CAPITAL LETTER E WITH CEDILLA, LATIN SMALL LETTER E WITH CEDILLA +test(0x0229, 0x0228); // LATIN SMALL LETTER E WITH CEDILLA, LATIN CAPITAL LETTER E WITH CEDILLA +test(0x022A, 0x022B); // LATIN CAPITAL LETTER O WITH DIAERESIS AND MACRON, LATIN SMALL LETTER O WITH DIAERESIS AND MACRON +test(0x022B, 0x022A); // LATIN SMALL LETTER O WITH DIAERESIS AND MACRON, LATIN CAPITAL LETTER O WITH DIAERESIS AND MACRON +test(0x022C, 0x022D); // LATIN CAPITAL LETTER O WITH TILDE AND MACRON, LATIN SMALL LETTER O WITH TILDE AND MACRON +test(0x022D, 0x022C); // LATIN SMALL LETTER O WITH TILDE AND MACRON, LATIN CAPITAL LETTER O WITH TILDE AND MACRON +test(0x022E, 0x022F); // LATIN CAPITAL LETTER O WITH DOT ABOVE, LATIN SMALL LETTER O WITH DOT ABOVE +test(0x022F, 0x022E); // LATIN SMALL LETTER O WITH DOT ABOVE, LATIN CAPITAL LETTER O WITH DOT ABOVE +test(0x0230, 0x0231); // LATIN CAPITAL LETTER O WITH DOT ABOVE AND MACRON, LATIN SMALL LETTER O WITH DOT ABOVE AND MACRON +test(0x0231, 0x0230); // LATIN SMALL LETTER O WITH DOT ABOVE AND MACRON, LATIN CAPITAL LETTER O WITH DOT ABOVE AND MACRON +test(0x0232, 0x0233); // LATIN CAPITAL LETTER Y WITH MACRON, LATIN SMALL LETTER Y WITH MACRON +test(0x0233, 0x0232); // LATIN SMALL LETTER Y WITH MACRON, LATIN CAPITAL LETTER Y WITH MACRON +test(0x023A, 0x2C65); // LATIN CAPITAL LETTER A WITH STROKE, LATIN SMALL LETTER A WITH STROKE +test(0x023B, 0x023C); // LATIN CAPITAL LETTER C WITH STROKE, LATIN SMALL LETTER C WITH STROKE +test(0x023C, 0x023B); // LATIN SMALL LETTER C WITH STROKE, LATIN CAPITAL LETTER C WITH STROKE +test(0x023D, 0x019A); // LATIN CAPITAL LETTER L WITH BAR, LATIN SMALL LETTER L WITH BAR (LATIN SMALL LETTER BARRED L) +test(0x023E, 0x2C66); // LATIN CAPITAL LETTER T WITH DIAGONAL STROKE, LATIN SMALL LETTER T WITH DIAGONAL STROKE +test(0x023F, 0x2C7E); // LATIN SMALL LETTER S WITH SWASH TAIL, LATIN CAPITAL LETTER S WITH SWASH TAIL +test(0x0240, 0x2C7F); // LATIN SMALL LETTER Z WITH SWASH TAIL, LATIN CAPITAL LETTER Z WITH SWASH TAIL +test(0x0241, 0x0242); // LATIN CAPITAL LETTER GLOTTAL STOP, LATIN SMALL LETTER GLOTTAL STOP +test(0x0242, 0x0241); // LATIN SMALL LETTER GLOTTAL STOP, LATIN CAPITAL LETTER GLOTTAL STOP +test(0x0243, 0x0180); // LATIN CAPITAL LETTER B WITH STROKE, LATIN SMALL LETTER B WITH STROKE (LATIN SMALL LETTER B BAR) +test(0x0244, 0x0289); // LATIN CAPITAL LETTER U BAR, LATIN SMALL LETTER U BAR +test(0x0245, 0x028C); // LATIN CAPITAL LETTER TURNED V, LATIN SMALL LETTER TURNED V +test(0x0246, 0x0247); // LATIN CAPITAL LETTER E WITH STROKE, LATIN SMALL LETTER E WITH STROKE +test(0x0247, 0x0246); // LATIN SMALL LETTER E WITH STROKE, LATIN CAPITAL LETTER E WITH STROKE +test(0x0248, 0x0249); // LATIN CAPITAL LETTER J WITH STROKE, LATIN SMALL LETTER J WITH STROKE +test(0x0249, 0x0248); // LATIN SMALL LETTER J WITH STROKE, LATIN CAPITAL LETTER J WITH STROKE +test(0x024A, 0x024B); // LATIN CAPITAL LETTER SMALL Q WITH HOOK TAIL, LATIN SMALL LETTER Q WITH HOOK TAIL +test(0x024B, 0x024A); // LATIN SMALL LETTER Q WITH HOOK TAIL, LATIN CAPITAL LETTER SMALL Q WITH HOOK TAIL +test(0x024C, 0x024D); // LATIN CAPITAL LETTER R WITH STROKE, LATIN SMALL LETTER R WITH STROKE +test(0x024D, 0x024C); // LATIN SMALL LETTER R WITH STROKE, LATIN CAPITAL LETTER R WITH STROKE +test(0x024E, 0x024F); // LATIN CAPITAL LETTER Y WITH STROKE, LATIN SMALL LETTER Y WITH STROKE +test(0x024F, 0x024E); // LATIN SMALL LETTER Y WITH STROKE, LATIN CAPITAL LETTER Y WITH STROKE +test(0x0250, 0x2C6F); // LATIN SMALL LETTER TURNED A, LATIN CAPITAL LETTER TURNED A +test(0x0251, 0x2C6D); // LATIN SMALL LETTER ALPHA (LATIN SMALL LETTER SCRIPT A), LATIN CAPITAL LETTER ALPHA +test(0x0252, 0x2C70); // LATIN SMALL LETTER TURNED ALPHA (LATIN SMALL LETTER TURNED SCRIPT A), LATIN CAPITAL LETTER TURNED ALPHA +test(0x0253, 0x0181); // LATIN SMALL LETTER B WITH HOOK (LATIN SMALL LETTER B HOOK), LATIN CAPITAL LETTER B WITH HOOK (LATIN CAPITAL LETTER B HOOK) +test(0x0254, 0x0186); // LATIN SMALL LETTER OPEN O, LATIN CAPITAL LETTER OPEN O +test(0x0256, 0x0189); // LATIN SMALL LETTER D WITH TAIL (LATIN SMALL LETTER D RETROFLEX HOOK), LATIN CAPITAL LETTER AFRICAN D +test(0x0257, 0x018A); // LATIN SMALL LETTER D WITH HOOK (LATIN SMALL LETTER D HOOK), LATIN CAPITAL LETTER D WITH HOOK (LATIN CAPITAL LETTER D HOOK) +test(0x0259, 0x018F); // LATIN SMALL LETTER SCHWA, LATIN CAPITAL LETTER SCHWA +test(0x025B, 0x0190); // LATIN SMALL LETTER OPEN E (LATIN SMALL LETTER EPSILON), LATIN CAPITAL LETTER OPEN E (LATIN CAPITAL LETTER EPSILON) +test(0x025C, 0xA7AB); // LATIN SMALL LETTER REVERSED OPEN E (LATIN SMALL LETTER REVERSED EPSILON), LATIN CAPITAL LETTER REVERSED OPEN E +test(0x0260, 0x0193); // LATIN SMALL LETTER G WITH HOOK (LATIN SMALL LETTER G HOOK), LATIN CAPITAL LETTER G WITH HOOK (LATIN CAPITAL LETTER G HOOK) +test(0x0261, 0xA7AC); // LATIN SMALL LETTER SCRIPT G, LATIN CAPITAL LETTER SCRIPT G +test(0x0263, 0x0194); // LATIN SMALL LETTER GAMMA, LATIN CAPITAL LETTER GAMMA +test(0x0265, 0xA78D); // LATIN SMALL LETTER TURNED H, LATIN CAPITAL LETTER TURNED H +test(0x0266, 0xA7AA); // LATIN SMALL LETTER H WITH HOOK (LATIN SMALL LETTER H HOOK), LATIN CAPITAL LETTER H WITH HOOK +test(0x0268, 0x0197); // LATIN SMALL LETTER I WITH STROKE (LATIN SMALL LETTER BARRED I), LATIN CAPITAL LETTER I WITH STROKE (LATIN CAPITAL LETTER BARRED I) +test(0x0269, 0x0196); // LATIN SMALL LETTER IOTA, LATIN CAPITAL LETTER IOTA +test(0x026A, 0xA7AE); // LATIN LETTER SMALL CAPITAL I, LATIN CAPITAL LETTER SMALL CAPITAL I +test(0x026B, 0x2C62); // LATIN SMALL LETTER L WITH MIDDLE TILDE, LATIN CAPITAL LETTER L WITH MIDDLE TILDE +test(0x026C, 0xA7AD); // LATIN SMALL LETTER L WITH BELT (LATIN SMALL LETTER L BELT), LATIN CAPITAL LETTER L WITH BELT +test(0x026F, 0x019C); // LATIN SMALL LETTER TURNED M, LATIN CAPITAL LETTER TURNED M +test(0x0271, 0x2C6E); // LATIN SMALL LETTER M WITH HOOK (LATIN SMALL LETTER M HOOK), LATIN CAPITAL LETTER M WITH HOOK +test(0x0272, 0x019D); // LATIN SMALL LETTER N WITH LEFT HOOK (LATIN SMALL LETTER N HOOK), LATIN CAPITAL LETTER N WITH LEFT HOOK (LATIN CAPITAL LETTER N HOOK) +test(0x0275, 0x019F); // LATIN SMALL LETTER BARRED O, LATIN CAPITAL LETTER O WITH MIDDLE TILDE (LATIN CAPITAL LETTER BARRED O) +test(0x027D, 0x2C64); // LATIN SMALL LETTER R WITH TAIL (LATIN SMALL LETTER R HOOK), LATIN CAPITAL LETTER R WITH TAIL +test(0x0280, 0x01A6); // LATIN LETTER SMALL CAPITAL R, LATIN LETTER YR (LATIN LETTER Y R) +test(0x0282, 0xA7C5); // LATIN SMALL LETTER S WITH HOOK (LATIN SMALL LETTER S HOOK), LATIN CAPITAL LETTER S WITH HOOK +test(0x0283, 0x01A9); // LATIN SMALL LETTER ESH, LATIN CAPITAL LETTER ESH +test(0x0287, 0xA7B1); // LATIN SMALL LETTER TURNED T, LATIN CAPITAL LETTER TURNED T +test(0x0288, 0x01AE); // LATIN SMALL LETTER T WITH RETROFLEX HOOK (LATIN SMALL LETTER T RETROFLEX HOOK), LATIN CAPITAL LETTER T WITH RETROFLEX HOOK (LATIN CAPITAL LETTER T RETROFLEX HOOK) +test(0x0289, 0x0244); // LATIN SMALL LETTER U BAR, LATIN CAPITAL LETTER U BAR +test(0x028A, 0x01B1); // LATIN SMALL LETTER UPSILON, LATIN CAPITAL LETTER UPSILON +test(0x028B, 0x01B2); // LATIN SMALL LETTER V WITH HOOK (LATIN SMALL LETTER SCRIPT V), LATIN CAPITAL LETTER V WITH HOOK (LATIN CAPITAL LETTER SCRIPT V) +test(0x028C, 0x0245); // LATIN SMALL LETTER TURNED V, LATIN CAPITAL LETTER TURNED V +test(0x0292, 0x01B7); // LATIN SMALL LETTER EZH (LATIN SMALL LETTER YOGH), LATIN CAPITAL LETTER EZH (LATIN CAPITAL LETTER YOGH) +test(0x029D, 0xA7B2); // LATIN SMALL LETTER J WITH CROSSED-TAIL (LATIN SMALL LETTER CROSSED-TAIL J), LATIN CAPITAL LETTER J WITH CROSSED-TAIL +test(0x029E, 0xA7B0); // LATIN SMALL LETTER TURNED K, LATIN CAPITAL LETTER TURNED K +test(0x0345, 0x03B9, 0x0399, 0x1FBE); // COMBINING GREEK YPOGEGRAMMENI (GREEK NON-SPACING IOTA BELOW), GREEK SMALL LETTER IOTA, GREEK CAPITAL LETTER IOTA, GREEK PROSGEGRAMMENI +test(0x0370, 0x0371); // GREEK CAPITAL LETTER HETA, GREEK SMALL LETTER HETA +test(0x0371, 0x0370); // GREEK SMALL LETTER HETA, GREEK CAPITAL LETTER HETA +test(0x0372, 0x0373); // GREEK CAPITAL LETTER ARCHAIC SAMPI, GREEK SMALL LETTER ARCHAIC SAMPI +test(0x0373, 0x0372); // GREEK SMALL LETTER ARCHAIC SAMPI, GREEK CAPITAL LETTER ARCHAIC SAMPI +test(0x0376, 0x0377); // GREEK CAPITAL LETTER PAMPHYLIAN DIGAMMA, GREEK SMALL LETTER PAMPHYLIAN DIGAMMA +test(0x0377, 0x0376); // GREEK SMALL LETTER PAMPHYLIAN DIGAMMA, GREEK CAPITAL LETTER PAMPHYLIAN DIGAMMA +test(0x037B, 0x03FD); // GREEK SMALL REVERSED LUNATE SIGMA SYMBOL, GREEK CAPITAL REVERSED LUNATE SIGMA SYMBOL +test(0x037C, 0x03FE); // GREEK SMALL DOTTED LUNATE SIGMA SYMBOL, GREEK CAPITAL DOTTED LUNATE SIGMA SYMBOL +test(0x037D, 0x03FF); // GREEK SMALL REVERSED DOTTED LUNATE SIGMA SYMBOL, GREEK CAPITAL REVERSED DOTTED LUNATE SIGMA SYMBOL +test(0x037F, 0x03F3); // GREEK CAPITAL LETTER YOT, GREEK LETTER YOT +test(0x0386, 0x03AC); // GREEK CAPITAL LETTER ALPHA WITH TONOS (GREEK CAPITAL LETTER ALPHA TONOS), GREEK SMALL LETTER ALPHA WITH TONOS (GREEK SMALL LETTER ALPHA TONOS) +test(0x0388, 0x03AD); // GREEK CAPITAL LETTER EPSILON WITH TONOS (GREEK CAPITAL LETTER EPSILON TONOS), GREEK SMALL LETTER EPSILON WITH TONOS (GREEK SMALL LETTER EPSILON TONOS) +test(0x0389, 0x03AE); // GREEK CAPITAL LETTER ETA WITH TONOS (GREEK CAPITAL LETTER ETA TONOS), GREEK SMALL LETTER ETA WITH TONOS (GREEK SMALL LETTER ETA TONOS) +test(0x038A, 0x03AF); // GREEK CAPITAL LETTER IOTA WITH TONOS (GREEK CAPITAL LETTER IOTA TONOS), GREEK SMALL LETTER IOTA WITH TONOS (GREEK SMALL LETTER IOTA TONOS) +test(0x038C, 0x03CC); // GREEK CAPITAL LETTER OMICRON WITH TONOS (GREEK CAPITAL LETTER OMICRON TONOS), GREEK SMALL LETTER OMICRON WITH TONOS (GREEK SMALL LETTER OMICRON TONOS) +test(0x038E, 0x03CD); // GREEK CAPITAL LETTER UPSILON WITH TONOS (GREEK CAPITAL LETTER UPSILON TONOS), GREEK SMALL LETTER UPSILON WITH TONOS (GREEK SMALL LETTER UPSILON TONOS) +test(0x038F, 0x03CE); // GREEK CAPITAL LETTER OMEGA WITH TONOS (GREEK CAPITAL LETTER OMEGA TONOS), GREEK SMALL LETTER OMEGA WITH TONOS (GREEK SMALL LETTER OMEGA TONOS) +test(0x0391, 0x03B1); // GREEK CAPITAL LETTER ALPHA, GREEK SMALL LETTER ALPHA +test(0x0392, 0x03B2, 0x03D0); // GREEK CAPITAL LETTER BETA, GREEK SMALL LETTER BETA, GREEK BETA SYMBOL (GREEK SMALL LETTER CURLED BETA) +test(0x0393, 0x03B3); // GREEK CAPITAL LETTER GAMMA, GREEK SMALL LETTER GAMMA +test(0x0394, 0x03B4); // GREEK CAPITAL LETTER DELTA, GREEK SMALL LETTER DELTA +test(0x0395, 0x03B5, 0x03F5); // GREEK CAPITAL LETTER EPSILON, GREEK SMALL LETTER EPSILON, GREEK LUNATE EPSILON SYMBOL +test(0x0396, 0x03B6); // GREEK CAPITAL LETTER ZETA, GREEK SMALL LETTER ZETA +test(0x0397, 0x03B7); // GREEK CAPITAL LETTER ETA, GREEK SMALL LETTER ETA +test(0x0398, 0x03B8, 0x03D1, 0x03F4); // GREEK CAPITAL LETTER THETA, GREEK SMALL LETTER THETA, GREEK THETA SYMBOL (GREEK SMALL LETTER SCRIPT THETA), GREEK CAPITAL THETA SYMBOL +test(0x0399, 0x03B9, 0x0345, 0x1FBE); // GREEK CAPITAL LETTER IOTA, GREEK SMALL LETTER IOTA, COMBINING GREEK YPOGEGRAMMENI (GREEK NON-SPACING IOTA BELOW), GREEK PROSGEGRAMMENI +test(0x039A, 0x03BA, 0x03F0); // GREEK CAPITAL LETTER KAPPA, GREEK SMALL LETTER KAPPA, GREEK KAPPA SYMBOL (GREEK SMALL LETTER SCRIPT KAPPA) +test(0x039B, 0x03BB); // GREEK CAPITAL LETTER LAMDA (GREEK CAPITAL LETTER LAMBDA), GREEK SMALL LETTER LAMDA (GREEK SMALL LETTER LAMBDA) +test(0x039C, 0x03BC, 0x00B5); // GREEK CAPITAL LETTER MU, GREEK SMALL LETTER MU, MICRO SIGN +test(0x039D, 0x03BD); // GREEK CAPITAL LETTER NU, GREEK SMALL LETTER NU +test(0x039E, 0x03BE); // GREEK CAPITAL LETTER XI, GREEK SMALL LETTER XI +test(0x039F, 0x03BF); // GREEK CAPITAL LETTER OMICRON, GREEK SMALL LETTER OMICRON +test(0x03A0, 0x03C0, 0x03D6); // GREEK CAPITAL LETTER PI, GREEK SMALL LETTER PI, GREEK PI SYMBOL (GREEK SMALL LETTER OMEGA PI) +test(0x03A1, 0x03C1, 0x03F1); // GREEK CAPITAL LETTER RHO, GREEK SMALL LETTER RHO, GREEK RHO SYMBOL (GREEK SMALL LETTER TAILED RHO) +test(0x03A3, 0x03C3, 0x03C2); // GREEK CAPITAL LETTER SIGMA, GREEK SMALL LETTER SIGMA, GREEK SMALL LETTER FINAL SIGMA +test(0x03A4, 0x03C4); // GREEK CAPITAL LETTER TAU, GREEK SMALL LETTER TAU +test(0x03A5, 0x03C5); // GREEK CAPITAL LETTER UPSILON, GREEK SMALL LETTER UPSILON +test(0x03A6, 0x03C6, 0x03D5); // GREEK CAPITAL LETTER PHI, GREEK SMALL LETTER PHI, GREEK PHI SYMBOL (GREEK SMALL LETTER SCRIPT PHI) +test(0x03A7, 0x03C7); // GREEK CAPITAL LETTER CHI, GREEK SMALL LETTER CHI +test(0x03A8, 0x03C8); // GREEK CAPITAL LETTER PSI, GREEK SMALL LETTER PSI +test(0x03A9, 0x03C9, 0x2126); // GREEK CAPITAL LETTER OMEGA, GREEK SMALL LETTER OMEGA, OHM SIGN (OHM) +test(0x03AA, 0x03CA); // GREEK CAPITAL LETTER IOTA WITH DIALYTIKA (GREEK CAPITAL LETTER IOTA DIAERESIS), GREEK SMALL LETTER IOTA WITH DIALYTIKA (GREEK SMALL LETTER IOTA DIAERESIS) +test(0x03AB, 0x03CB); // GREEK CAPITAL LETTER UPSILON WITH DIALYTIKA (GREEK CAPITAL LETTER UPSILON DIAERESIS), GREEK SMALL LETTER UPSILON WITH DIALYTIKA (GREEK SMALL LETTER UPSILON DIAERESIS) +test(0x03AC, 0x0386); // GREEK SMALL LETTER ALPHA WITH TONOS (GREEK SMALL LETTER ALPHA TONOS), GREEK CAPITAL LETTER ALPHA WITH TONOS (GREEK CAPITAL LETTER ALPHA TONOS) +test(0x03AD, 0x0388); // GREEK SMALL LETTER EPSILON WITH TONOS (GREEK SMALL LETTER EPSILON TONOS), GREEK CAPITAL LETTER EPSILON WITH TONOS (GREEK CAPITAL LETTER EPSILON TONOS) +test(0x03AE, 0x0389); // GREEK SMALL LETTER ETA WITH TONOS (GREEK SMALL LETTER ETA TONOS), GREEK CAPITAL LETTER ETA WITH TONOS (GREEK CAPITAL LETTER ETA TONOS) +test(0x03AF, 0x038A); // GREEK SMALL LETTER IOTA WITH TONOS (GREEK SMALL LETTER IOTA TONOS), GREEK CAPITAL LETTER IOTA WITH TONOS (GREEK CAPITAL LETTER IOTA TONOS) +test(0x03B1, 0x0391); // GREEK SMALL LETTER ALPHA, GREEK CAPITAL LETTER ALPHA +test(0x03B2, 0x0392, 0x03D0); // GREEK SMALL LETTER BETA, GREEK CAPITAL LETTER BETA, GREEK BETA SYMBOL (GREEK SMALL LETTER CURLED BETA) +test(0x03B3, 0x0393); // GREEK SMALL LETTER GAMMA, GREEK CAPITAL LETTER GAMMA +test(0x03B4, 0x0394); // GREEK SMALL LETTER DELTA, GREEK CAPITAL LETTER DELTA +test(0x03B5, 0x0395, 0x03F5); // GREEK SMALL LETTER EPSILON, GREEK CAPITAL LETTER EPSILON, GREEK LUNATE EPSILON SYMBOL +test(0x03B6, 0x0396); // GREEK SMALL LETTER ZETA, GREEK CAPITAL LETTER ZETA +test(0x03B7, 0x0397); // GREEK SMALL LETTER ETA, GREEK CAPITAL LETTER ETA +test(0x03B8, 0x0398, 0x03D1, 0x03F4); // GREEK SMALL LETTER THETA, GREEK CAPITAL LETTER THETA, GREEK THETA SYMBOL (GREEK SMALL LETTER SCRIPT THETA), GREEK CAPITAL THETA SYMBOL +test(0x03B9, 0x0345, 0x0399, 0x1FBE); // GREEK SMALL LETTER IOTA, COMBINING GREEK YPOGEGRAMMENI (GREEK NON-SPACING IOTA BELOW), GREEK CAPITAL LETTER IOTA, GREEK PROSGEGRAMMENI +test(0x03BA, 0x039A, 0x03F0); // GREEK SMALL LETTER KAPPA, GREEK CAPITAL LETTER KAPPA, GREEK KAPPA SYMBOL (GREEK SMALL LETTER SCRIPT KAPPA) +test(0x03BB, 0x039B); // GREEK SMALL LETTER LAMDA (GREEK SMALL LETTER LAMBDA), GREEK CAPITAL LETTER LAMDA (GREEK CAPITAL LETTER LAMBDA) +test(0x03BC, 0x00B5, 0x039C); // GREEK SMALL LETTER MU, MICRO SIGN, GREEK CAPITAL LETTER MU +test(0x03BD, 0x039D); // GREEK SMALL LETTER NU, GREEK CAPITAL LETTER NU +test(0x03BE, 0x039E); // GREEK SMALL LETTER XI, GREEK CAPITAL LETTER XI +test(0x03BF, 0x039F); // GREEK SMALL LETTER OMICRON, GREEK CAPITAL LETTER OMICRON +test(0x03C0, 0x03A0, 0x03D6); // GREEK SMALL LETTER PI, GREEK CAPITAL LETTER PI, GREEK PI SYMBOL (GREEK SMALL LETTER OMEGA PI) +test(0x03C1, 0x03A1, 0x03F1); // GREEK SMALL LETTER RHO, GREEK CAPITAL LETTER RHO, GREEK RHO SYMBOL (GREEK SMALL LETTER TAILED RHO) +test(0x03C2, 0x03C3, 0x03A3); // GREEK SMALL LETTER FINAL SIGMA, GREEK SMALL LETTER SIGMA, GREEK CAPITAL LETTER SIGMA +test(0x03C3, 0x03A3, 0x03C2); // GREEK SMALL LETTER SIGMA, GREEK CAPITAL LETTER SIGMA, GREEK SMALL LETTER FINAL SIGMA +test(0x03C4, 0x03A4); // GREEK SMALL LETTER TAU, GREEK CAPITAL LETTER TAU +test(0x03C5, 0x03A5); // GREEK SMALL LETTER UPSILON, GREEK CAPITAL LETTER UPSILON +test(0x03C6, 0x03A6, 0x03D5); // GREEK SMALL LETTER PHI, GREEK CAPITAL LETTER PHI, GREEK PHI SYMBOL (GREEK SMALL LETTER SCRIPT PHI) +test(0x03C7, 0x03A7); // GREEK SMALL LETTER CHI, GREEK CAPITAL LETTER CHI +test(0x03C8, 0x03A8); // GREEK SMALL LETTER PSI, GREEK CAPITAL LETTER PSI +test(0x03C9, 0x03A9, 0x2126); // GREEK SMALL LETTER OMEGA, GREEK CAPITAL LETTER OMEGA, OHM SIGN (OHM) +test(0x03CA, 0x03AA); // GREEK SMALL LETTER IOTA WITH DIALYTIKA (GREEK SMALL LETTER IOTA DIAERESIS), GREEK CAPITAL LETTER IOTA WITH DIALYTIKA (GREEK CAPITAL LETTER IOTA DIAERESIS) +test(0x03CB, 0x03AB); // GREEK SMALL LETTER UPSILON WITH DIALYTIKA (GREEK SMALL LETTER UPSILON DIAERESIS), GREEK CAPITAL LETTER UPSILON WITH DIALYTIKA (GREEK CAPITAL LETTER UPSILON DIAERESIS) +test(0x03CC, 0x038C); // GREEK SMALL LETTER OMICRON WITH TONOS (GREEK SMALL LETTER OMICRON TONOS), GREEK CAPITAL LETTER OMICRON WITH TONOS (GREEK CAPITAL LETTER OMICRON TONOS) +test(0x03CD, 0x038E); // GREEK SMALL LETTER UPSILON WITH TONOS (GREEK SMALL LETTER UPSILON TONOS), GREEK CAPITAL LETTER UPSILON WITH TONOS (GREEK CAPITAL LETTER UPSILON TONOS) +test(0x03CE, 0x038F); // GREEK SMALL LETTER OMEGA WITH TONOS (GREEK SMALL LETTER OMEGA TONOS), GREEK CAPITAL LETTER OMEGA WITH TONOS (GREEK CAPITAL LETTER OMEGA TONOS) +test(0x03CF, 0x03D7); // GREEK CAPITAL KAI SYMBOL, GREEK KAI SYMBOL +test(0x03D0, 0x03B2, 0x0392); // GREEK BETA SYMBOL (GREEK SMALL LETTER CURLED BETA), GREEK SMALL LETTER BETA, GREEK CAPITAL LETTER BETA +test(0x03D1, 0x03B8, 0x0398, 0x03F4); // GREEK THETA SYMBOL (GREEK SMALL LETTER SCRIPT THETA), GREEK SMALL LETTER THETA, GREEK CAPITAL LETTER THETA, GREEK CAPITAL THETA SYMBOL +test(0x03D5, 0x03C6, 0x03A6); // GREEK PHI SYMBOL (GREEK SMALL LETTER SCRIPT PHI), GREEK SMALL LETTER PHI, GREEK CAPITAL LETTER PHI +test(0x03D6, 0x03C0, 0x03A0); // GREEK PI SYMBOL (GREEK SMALL LETTER OMEGA PI), GREEK SMALL LETTER PI, GREEK CAPITAL LETTER PI +test(0x03D7, 0x03CF); // GREEK KAI SYMBOL, GREEK CAPITAL KAI SYMBOL +test(0x03D8, 0x03D9); // GREEK LETTER ARCHAIC KOPPA, GREEK SMALL LETTER ARCHAIC KOPPA +test(0x03D9, 0x03D8); // GREEK SMALL LETTER ARCHAIC KOPPA, GREEK LETTER ARCHAIC KOPPA +test(0x03DA, 0x03DB); // GREEK LETTER STIGMA (GREEK CAPITAL LETTER STIGMA), GREEK SMALL LETTER STIGMA +test(0x03DB, 0x03DA); // GREEK SMALL LETTER STIGMA, GREEK LETTER STIGMA (GREEK CAPITAL LETTER STIGMA) +test(0x03DC, 0x03DD); // GREEK LETTER DIGAMMA (GREEK CAPITAL LETTER DIGAMMA), GREEK SMALL LETTER DIGAMMA +test(0x03DD, 0x03DC); // GREEK SMALL LETTER DIGAMMA, GREEK LETTER DIGAMMA (GREEK CAPITAL LETTER DIGAMMA) +test(0x03DE, 0x03DF); // GREEK LETTER KOPPA (GREEK CAPITAL LETTER KOPPA), GREEK SMALL LETTER KOPPA +test(0x03DF, 0x03DE); // GREEK SMALL LETTER KOPPA, GREEK LETTER KOPPA (GREEK CAPITAL LETTER KOPPA) +test(0x03E0, 0x03E1); // GREEK LETTER SAMPI (GREEK CAPITAL LETTER SAMPI), GREEK SMALL LETTER SAMPI +test(0x03E1, 0x03E0); // GREEK SMALL LETTER SAMPI, GREEK LETTER SAMPI (GREEK CAPITAL LETTER SAMPI) +test(0x03E2, 0x03E3); // COPTIC CAPITAL LETTER SHEI (GREEK CAPITAL LETTER SHEI), COPTIC SMALL LETTER SHEI (GREEK SMALL LETTER SHEI) +test(0x03E3, 0x03E2); // COPTIC SMALL LETTER SHEI (GREEK SMALL LETTER SHEI), COPTIC CAPITAL LETTER SHEI (GREEK CAPITAL LETTER SHEI) +test(0x03E4, 0x03E5); // COPTIC CAPITAL LETTER FEI (GREEK CAPITAL LETTER FEI), COPTIC SMALL LETTER FEI (GREEK SMALL LETTER FEI) +test(0x03E5, 0x03E4); // COPTIC SMALL LETTER FEI (GREEK SMALL LETTER FEI), COPTIC CAPITAL LETTER FEI (GREEK CAPITAL LETTER FEI) +test(0x03E6, 0x03E7); // COPTIC CAPITAL LETTER KHEI (GREEK CAPITAL LETTER KHEI), COPTIC SMALL LETTER KHEI (GREEK SMALL LETTER KHEI) +test(0x03E7, 0x03E6); // COPTIC SMALL LETTER KHEI (GREEK SMALL LETTER KHEI), COPTIC CAPITAL LETTER KHEI (GREEK CAPITAL LETTER KHEI) +test(0x03E8, 0x03E9); // COPTIC CAPITAL LETTER HORI (GREEK CAPITAL LETTER HORI), COPTIC SMALL LETTER HORI (GREEK SMALL LETTER HORI) +test(0x03E9, 0x03E8); // COPTIC SMALL LETTER HORI (GREEK SMALL LETTER HORI), COPTIC CAPITAL LETTER HORI (GREEK CAPITAL LETTER HORI) +test(0x03EA, 0x03EB); // COPTIC CAPITAL LETTER GANGIA (GREEK CAPITAL LETTER GANGIA), COPTIC SMALL LETTER GANGIA (GREEK SMALL LETTER GANGIA) +test(0x03EB, 0x03EA); // COPTIC SMALL LETTER GANGIA (GREEK SMALL LETTER GANGIA), COPTIC CAPITAL LETTER GANGIA (GREEK CAPITAL LETTER GANGIA) +test(0x03EC, 0x03ED); // COPTIC CAPITAL LETTER SHIMA (GREEK CAPITAL LETTER SHIMA), COPTIC SMALL LETTER SHIMA (GREEK SMALL LETTER SHIMA) +test(0x03ED, 0x03EC); // COPTIC SMALL LETTER SHIMA (GREEK SMALL LETTER SHIMA), COPTIC CAPITAL LETTER SHIMA (GREEK CAPITAL LETTER SHIMA) +test(0x03EE, 0x03EF); // COPTIC CAPITAL LETTER DEI (GREEK CAPITAL LETTER DEI), COPTIC SMALL LETTER DEI (GREEK SMALL LETTER DEI) +test(0x03EF, 0x03EE); // COPTIC SMALL LETTER DEI (GREEK SMALL LETTER DEI), COPTIC CAPITAL LETTER DEI (GREEK CAPITAL LETTER DEI) +test(0x03F0, 0x03BA, 0x039A); // GREEK KAPPA SYMBOL (GREEK SMALL LETTER SCRIPT KAPPA), GREEK SMALL LETTER KAPPA, GREEK CAPITAL LETTER KAPPA +test(0x03F1, 0x03C1, 0x03A1); // GREEK RHO SYMBOL (GREEK SMALL LETTER TAILED RHO), GREEK SMALL LETTER RHO, GREEK CAPITAL LETTER RHO +test(0x03F2, 0x03F9); // GREEK LUNATE SIGMA SYMBOL (GREEK SMALL LETTER LUNATE SIGMA), GREEK CAPITAL LUNATE SIGMA SYMBOL +test(0x03F3, 0x037F); // GREEK LETTER YOT, GREEK CAPITAL LETTER YOT +test(0x03F4, 0x03B8, 0x0398, 0x03D1); // GREEK CAPITAL THETA SYMBOL, GREEK SMALL LETTER THETA, GREEK CAPITAL LETTER THETA, GREEK THETA SYMBOL (GREEK SMALL LETTER SCRIPT THETA) +test(0x03F5, 0x03B5, 0x0395); // GREEK LUNATE EPSILON SYMBOL, GREEK SMALL LETTER EPSILON, GREEK CAPITAL LETTER EPSILON +test(0x03F7, 0x03F8); // GREEK CAPITAL LETTER SHO, GREEK SMALL LETTER SHO +test(0x03F8, 0x03F7); // GREEK SMALL LETTER SHO, GREEK CAPITAL LETTER SHO +test(0x03F9, 0x03F2); // GREEK CAPITAL LUNATE SIGMA SYMBOL, GREEK LUNATE SIGMA SYMBOL (GREEK SMALL LETTER LUNATE SIGMA) +test(0x03FA, 0x03FB); // GREEK CAPITAL LETTER SAN, GREEK SMALL LETTER SAN +test(0x03FB, 0x03FA); // GREEK SMALL LETTER SAN, GREEK CAPITAL LETTER SAN +test(0x03FD, 0x037B); // GREEK CAPITAL REVERSED LUNATE SIGMA SYMBOL, GREEK SMALL REVERSED LUNATE SIGMA SYMBOL +test(0x03FE, 0x037C); // GREEK CAPITAL DOTTED LUNATE SIGMA SYMBOL, GREEK SMALL DOTTED LUNATE SIGMA SYMBOL +test(0x03FF, 0x037D); // GREEK CAPITAL REVERSED DOTTED LUNATE SIGMA SYMBOL, GREEK SMALL REVERSED DOTTED LUNATE SIGMA SYMBOL +test(0x0400, 0x0450); // CYRILLIC CAPITAL LETTER IE WITH GRAVE, CYRILLIC SMALL LETTER IE WITH GRAVE +test(0x0401, 0x0451); // CYRILLIC CAPITAL LETTER IO, CYRILLIC SMALL LETTER IO +test(0x0402, 0x0452); // CYRILLIC CAPITAL LETTER DJE, CYRILLIC SMALL LETTER DJE +test(0x0403, 0x0453); // CYRILLIC CAPITAL LETTER GJE, CYRILLIC SMALL LETTER GJE +test(0x0404, 0x0454); // CYRILLIC CAPITAL LETTER UKRAINIAN IE (CYRILLIC CAPITAL LETTER E), CYRILLIC SMALL LETTER UKRAINIAN IE (CYRILLIC SMALL LETTER E) +test(0x0405, 0x0455); // CYRILLIC CAPITAL LETTER DZE, CYRILLIC SMALL LETTER DZE +test(0x0406, 0x0456); // CYRILLIC CAPITAL LETTER BYELORUSSIAN-UKRAINIAN I (CYRILLIC CAPITAL LETTER I), CYRILLIC SMALL LETTER BYELORUSSIAN-UKRAINIAN I (CYRILLIC SMALL LETTER I) +test(0x0407, 0x0457); // CYRILLIC CAPITAL LETTER YI, CYRILLIC SMALL LETTER YI +test(0x0408, 0x0458); // CYRILLIC CAPITAL LETTER JE, CYRILLIC SMALL LETTER JE +test(0x0409, 0x0459); // CYRILLIC CAPITAL LETTER LJE, CYRILLIC SMALL LETTER LJE +test(0x040A, 0x045A); // CYRILLIC CAPITAL LETTER NJE, CYRILLIC SMALL LETTER NJE +test(0x040B, 0x045B); // CYRILLIC CAPITAL LETTER TSHE, CYRILLIC SMALL LETTER TSHE +test(0x040C, 0x045C); // CYRILLIC CAPITAL LETTER KJE, CYRILLIC SMALL LETTER KJE +test(0x040D, 0x045D); // CYRILLIC CAPITAL LETTER I WITH GRAVE, CYRILLIC SMALL LETTER I WITH GRAVE +test(0x040E, 0x045E); // CYRILLIC CAPITAL LETTER SHORT U, CYRILLIC SMALL LETTER SHORT U +test(0x040F, 0x045F); // CYRILLIC CAPITAL LETTER DZHE, CYRILLIC SMALL LETTER DZHE +test(0x0410, 0x0430); // CYRILLIC CAPITAL LETTER A, CYRILLIC SMALL LETTER A +test(0x0411, 0x0431); // CYRILLIC CAPITAL LETTER BE, CYRILLIC SMALL LETTER BE +test(0x0412, 0x0432, 0x1C80); // CYRILLIC CAPITAL LETTER VE, CYRILLIC SMALL LETTER VE, CYRILLIC SMALL LETTER ROUNDED VE +test(0x0413, 0x0433); // CYRILLIC CAPITAL LETTER GHE (CYRILLIC CAPITAL LETTER GE), CYRILLIC SMALL LETTER GHE (CYRILLIC SMALL LETTER GE) +test(0x0414, 0x0434, 0x1C81); // CYRILLIC CAPITAL LETTER DE, CYRILLIC SMALL LETTER DE, CYRILLIC SMALL LETTER LONG-LEGGED DE +test(0x0415, 0x0435); // CYRILLIC CAPITAL LETTER IE, CYRILLIC SMALL LETTER IE +test(0x0416, 0x0436); // CYRILLIC CAPITAL LETTER ZHE, CYRILLIC SMALL LETTER ZHE +test(0x0417, 0x0437); // CYRILLIC CAPITAL LETTER ZE, CYRILLIC SMALL LETTER ZE +test(0x0418, 0x0438); // CYRILLIC CAPITAL LETTER I (CYRILLIC CAPITAL LETTER II), CYRILLIC SMALL LETTER I (CYRILLIC SMALL LETTER II) +test(0x0419, 0x0439); // CYRILLIC CAPITAL LETTER SHORT I (CYRILLIC CAPITAL LETTER SHORT II), CYRILLIC SMALL LETTER SHORT I (CYRILLIC SMALL LETTER SHORT II) +test(0x041A, 0x043A); // CYRILLIC CAPITAL LETTER KA, CYRILLIC SMALL LETTER KA +test(0x041B, 0x043B); // CYRILLIC CAPITAL LETTER EL, CYRILLIC SMALL LETTER EL +test(0x041C, 0x043C); // CYRILLIC CAPITAL LETTER EM, CYRILLIC SMALL LETTER EM +test(0x041D, 0x043D); // CYRILLIC CAPITAL LETTER EN, CYRILLIC SMALL LETTER EN +test(0x041E, 0x043E, 0x1C82); // CYRILLIC CAPITAL LETTER O, CYRILLIC SMALL LETTER O, CYRILLIC SMALL LETTER NARROW O +test(0x041F, 0x043F); // CYRILLIC CAPITAL LETTER PE, CYRILLIC SMALL LETTER PE +test(0x0420, 0x0440); // CYRILLIC CAPITAL LETTER ER, CYRILLIC SMALL LETTER ER +test(0x0421, 0x0441, 0x1C83); // CYRILLIC CAPITAL LETTER ES, CYRILLIC SMALL LETTER ES, CYRILLIC SMALL LETTER WIDE ES +test(0x0422, 0x0442, 0x1C84, 0x1C85); // CYRILLIC CAPITAL LETTER TE, CYRILLIC SMALL LETTER TE, CYRILLIC SMALL LETTER TALL TE, CYRILLIC SMALL LETTER THREE-LEGGED TE +test(0x0423, 0x0443); // CYRILLIC CAPITAL LETTER U, CYRILLIC SMALL LETTER U +test(0x0424, 0x0444); // CYRILLIC CAPITAL LETTER EF, CYRILLIC SMALL LETTER EF +test(0x0425, 0x0445); // CYRILLIC CAPITAL LETTER HA (CYRILLIC CAPITAL LETTER KHA), CYRILLIC SMALL LETTER HA (CYRILLIC SMALL LETTER KHA) +test(0x0426, 0x0446); // CYRILLIC CAPITAL LETTER TSE, CYRILLIC SMALL LETTER TSE +test(0x0427, 0x0447); // CYRILLIC CAPITAL LETTER CHE, CYRILLIC SMALL LETTER CHE +test(0x0428, 0x0448); // CYRILLIC CAPITAL LETTER SHA, CYRILLIC SMALL LETTER SHA +test(0x0429, 0x0449); // CYRILLIC CAPITAL LETTER SHCHA, CYRILLIC SMALL LETTER SHCHA +test(0x042A, 0x044A, 0x1C86); // CYRILLIC CAPITAL LETTER HARD SIGN, CYRILLIC SMALL LETTER HARD SIGN, CYRILLIC SMALL LETTER TALL HARD SIGN +test(0x042B, 0x044B); // CYRILLIC CAPITAL LETTER YERU (CYRILLIC CAPITAL LETTER YERI), CYRILLIC SMALL LETTER YERU (CYRILLIC SMALL LETTER YERI) +test(0x042C, 0x044C); // CYRILLIC CAPITAL LETTER SOFT SIGN, CYRILLIC SMALL LETTER SOFT SIGN +test(0x042D, 0x044D); // CYRILLIC CAPITAL LETTER E (CYRILLIC CAPITAL LETTER REVERSED E), CYRILLIC SMALL LETTER E (CYRILLIC SMALL LETTER REVERSED E) +test(0x042E, 0x044E); // CYRILLIC CAPITAL LETTER YU (CYRILLIC CAPITAL LETTER IU), CYRILLIC SMALL LETTER YU (CYRILLIC SMALL LETTER IU) +test(0x042F, 0x044F); // CYRILLIC CAPITAL LETTER YA (CYRILLIC CAPITAL LETTER IA), CYRILLIC SMALL LETTER YA (CYRILLIC SMALL LETTER IA) +test(0x0430, 0x0410); // CYRILLIC SMALL LETTER A, CYRILLIC CAPITAL LETTER A +test(0x0431, 0x0411); // CYRILLIC SMALL LETTER BE, CYRILLIC CAPITAL LETTER BE +test(0x0432, 0x0412, 0x1C80); // CYRILLIC SMALL LETTER VE, CYRILLIC CAPITAL LETTER VE, CYRILLIC SMALL LETTER ROUNDED VE +test(0x0433, 0x0413); // CYRILLIC SMALL LETTER GHE (CYRILLIC SMALL LETTER GE), CYRILLIC CAPITAL LETTER GHE (CYRILLIC CAPITAL LETTER GE) +test(0x0434, 0x0414, 0x1C81); // CYRILLIC SMALL LETTER DE, CYRILLIC CAPITAL LETTER DE, CYRILLIC SMALL LETTER LONG-LEGGED DE +test(0x0435, 0x0415); // CYRILLIC SMALL LETTER IE, CYRILLIC CAPITAL LETTER IE +test(0x0436, 0x0416); // CYRILLIC SMALL LETTER ZHE, CYRILLIC CAPITAL LETTER ZHE +test(0x0437, 0x0417); // CYRILLIC SMALL LETTER ZE, CYRILLIC CAPITAL LETTER ZE +test(0x0438, 0x0418); // CYRILLIC SMALL LETTER I (CYRILLIC SMALL LETTER II), CYRILLIC CAPITAL LETTER I (CYRILLIC CAPITAL LETTER II) +test(0x0439, 0x0419); // CYRILLIC SMALL LETTER SHORT I (CYRILLIC SMALL LETTER SHORT II), CYRILLIC CAPITAL LETTER SHORT I (CYRILLIC CAPITAL LETTER SHORT II) +test(0x043A, 0x041A); // CYRILLIC SMALL LETTER KA, CYRILLIC CAPITAL LETTER KA +test(0x043B, 0x041B); // CYRILLIC SMALL LETTER EL, CYRILLIC CAPITAL LETTER EL +test(0x043C, 0x041C); // CYRILLIC SMALL LETTER EM, CYRILLIC CAPITAL LETTER EM +test(0x043D, 0x041D); // CYRILLIC SMALL LETTER EN, CYRILLIC CAPITAL LETTER EN +test(0x043E, 0x041E, 0x1C82); // CYRILLIC SMALL LETTER O, CYRILLIC CAPITAL LETTER O, CYRILLIC SMALL LETTER NARROW O +test(0x043F, 0x041F); // CYRILLIC SMALL LETTER PE, CYRILLIC CAPITAL LETTER PE +test(0x0440, 0x0420); // CYRILLIC SMALL LETTER ER, CYRILLIC CAPITAL LETTER ER +test(0x0441, 0x0421, 0x1C83); // CYRILLIC SMALL LETTER ES, CYRILLIC CAPITAL LETTER ES, CYRILLIC SMALL LETTER WIDE ES +test(0x0442, 0x0422, 0x1C84, 0x1C85); // CYRILLIC SMALL LETTER TE, CYRILLIC CAPITAL LETTER TE, CYRILLIC SMALL LETTER TALL TE, CYRILLIC SMALL LETTER THREE-LEGGED TE +test(0x0443, 0x0423); // CYRILLIC SMALL LETTER U, CYRILLIC CAPITAL LETTER U +test(0x0444, 0x0424); // CYRILLIC SMALL LETTER EF, CYRILLIC CAPITAL LETTER EF +test(0x0445, 0x0425); // CYRILLIC SMALL LETTER HA (CYRILLIC SMALL LETTER KHA), CYRILLIC CAPITAL LETTER HA (CYRILLIC CAPITAL LETTER KHA) +test(0x0446, 0x0426); // CYRILLIC SMALL LETTER TSE, CYRILLIC CAPITAL LETTER TSE +test(0x0447, 0x0427); // CYRILLIC SMALL LETTER CHE, CYRILLIC CAPITAL LETTER CHE +test(0x0448, 0x0428); // CYRILLIC SMALL LETTER SHA, CYRILLIC CAPITAL LETTER SHA +test(0x0449, 0x0429); // CYRILLIC SMALL LETTER SHCHA, CYRILLIC CAPITAL LETTER SHCHA +test(0x044A, 0x042A, 0x1C86); // CYRILLIC SMALL LETTER HARD SIGN, CYRILLIC CAPITAL LETTER HARD SIGN, CYRILLIC SMALL LETTER TALL HARD SIGN +test(0x044B, 0x042B); // CYRILLIC SMALL LETTER YERU (CYRILLIC SMALL LETTER YERI), CYRILLIC CAPITAL LETTER YERU (CYRILLIC CAPITAL LETTER YERI) +test(0x044C, 0x042C); // CYRILLIC SMALL LETTER SOFT SIGN, CYRILLIC CAPITAL LETTER SOFT SIGN +test(0x044D, 0x042D); // CYRILLIC SMALL LETTER E (CYRILLIC SMALL LETTER REVERSED E), CYRILLIC CAPITAL LETTER E (CYRILLIC CAPITAL LETTER REVERSED E) +test(0x044E, 0x042E); // CYRILLIC SMALL LETTER YU (CYRILLIC SMALL LETTER IU), CYRILLIC CAPITAL LETTER YU (CYRILLIC CAPITAL LETTER IU) +test(0x044F, 0x042F); // CYRILLIC SMALL LETTER YA (CYRILLIC SMALL LETTER IA), CYRILLIC CAPITAL LETTER YA (CYRILLIC CAPITAL LETTER IA) +test(0x0450, 0x0400); // CYRILLIC SMALL LETTER IE WITH GRAVE, CYRILLIC CAPITAL LETTER IE WITH GRAVE +test(0x0451, 0x0401); // CYRILLIC SMALL LETTER IO, CYRILLIC CAPITAL LETTER IO +test(0x0452, 0x0402); // CYRILLIC SMALL LETTER DJE, CYRILLIC CAPITAL LETTER DJE +test(0x0453, 0x0403); // CYRILLIC SMALL LETTER GJE, CYRILLIC CAPITAL LETTER GJE +test(0x0454, 0x0404); // CYRILLIC SMALL LETTER UKRAINIAN IE (CYRILLIC SMALL LETTER E), CYRILLIC CAPITAL LETTER UKRAINIAN IE (CYRILLIC CAPITAL LETTER E) +test(0x0455, 0x0405); // CYRILLIC SMALL LETTER DZE, CYRILLIC CAPITAL LETTER DZE +test(0x0456, 0x0406); // CYRILLIC SMALL LETTER BYELORUSSIAN-UKRAINIAN I (CYRILLIC SMALL LETTER I), CYRILLIC CAPITAL LETTER BYELORUSSIAN-UKRAINIAN I (CYRILLIC CAPITAL LETTER I) +test(0x0457, 0x0407); // CYRILLIC SMALL LETTER YI, CYRILLIC CAPITAL LETTER YI +test(0x0458, 0x0408); // CYRILLIC SMALL LETTER JE, CYRILLIC CAPITAL LETTER JE +test(0x0459, 0x0409); // CYRILLIC SMALL LETTER LJE, CYRILLIC CAPITAL LETTER LJE +test(0x045A, 0x040A); // CYRILLIC SMALL LETTER NJE, CYRILLIC CAPITAL LETTER NJE +test(0x045B, 0x040B); // CYRILLIC SMALL LETTER TSHE, CYRILLIC CAPITAL LETTER TSHE +test(0x045C, 0x040C); // CYRILLIC SMALL LETTER KJE, CYRILLIC CAPITAL LETTER KJE +test(0x045D, 0x040D); // CYRILLIC SMALL LETTER I WITH GRAVE, CYRILLIC CAPITAL LETTER I WITH GRAVE +test(0x045E, 0x040E); // CYRILLIC SMALL LETTER SHORT U, CYRILLIC CAPITAL LETTER SHORT U +test(0x045F, 0x040F); // CYRILLIC SMALL LETTER DZHE, CYRILLIC CAPITAL LETTER DZHE +test(0x0460, 0x0461); // CYRILLIC CAPITAL LETTER OMEGA, CYRILLIC SMALL LETTER OMEGA +test(0x0461, 0x0460); // CYRILLIC SMALL LETTER OMEGA, CYRILLIC CAPITAL LETTER OMEGA +test(0x0462, 0x0463, 0x1C87); // CYRILLIC CAPITAL LETTER YAT, CYRILLIC SMALL LETTER YAT, CYRILLIC SMALL LETTER TALL YAT +test(0x0463, 0x0462, 0x1C87); // CYRILLIC SMALL LETTER YAT, CYRILLIC CAPITAL LETTER YAT, CYRILLIC SMALL LETTER TALL YAT +test(0x0464, 0x0465); // CYRILLIC CAPITAL LETTER IOTIFIED E, CYRILLIC SMALL LETTER IOTIFIED E +test(0x0465, 0x0464); // CYRILLIC SMALL LETTER IOTIFIED E, CYRILLIC CAPITAL LETTER IOTIFIED E +test(0x0466, 0x0467); // CYRILLIC CAPITAL LETTER LITTLE YUS, CYRILLIC SMALL LETTER LITTLE YUS +test(0x0467, 0x0466); // CYRILLIC SMALL LETTER LITTLE YUS, CYRILLIC CAPITAL LETTER LITTLE YUS +test(0x0468, 0x0469); // CYRILLIC CAPITAL LETTER IOTIFIED LITTLE YUS, CYRILLIC SMALL LETTER IOTIFIED LITTLE YUS +test(0x0469, 0x0468); // CYRILLIC SMALL LETTER IOTIFIED LITTLE YUS, CYRILLIC CAPITAL LETTER IOTIFIED LITTLE YUS +test(0x046A, 0x046B); // CYRILLIC CAPITAL LETTER BIG YUS, CYRILLIC SMALL LETTER BIG YUS +test(0x046B, 0x046A); // CYRILLIC SMALL LETTER BIG YUS, CYRILLIC CAPITAL LETTER BIG YUS +test(0x046C, 0x046D); // CYRILLIC CAPITAL LETTER IOTIFIED BIG YUS, CYRILLIC SMALL LETTER IOTIFIED BIG YUS +test(0x046D, 0x046C); // CYRILLIC SMALL LETTER IOTIFIED BIG YUS, CYRILLIC CAPITAL LETTER IOTIFIED BIG YUS +test(0x046E, 0x046F); // CYRILLIC CAPITAL LETTER KSI, CYRILLIC SMALL LETTER KSI +test(0x046F, 0x046E); // CYRILLIC SMALL LETTER KSI, CYRILLIC CAPITAL LETTER KSI +test(0x0470, 0x0471); // CYRILLIC CAPITAL LETTER PSI, CYRILLIC SMALL LETTER PSI +test(0x0471, 0x0470); // CYRILLIC SMALL LETTER PSI, CYRILLIC CAPITAL LETTER PSI +test(0x0472, 0x0473); // CYRILLIC CAPITAL LETTER FITA, CYRILLIC SMALL LETTER FITA +test(0x0473, 0x0472); // CYRILLIC SMALL LETTER FITA, CYRILLIC CAPITAL LETTER FITA +test(0x0474, 0x0475); // CYRILLIC CAPITAL LETTER IZHITSA, CYRILLIC SMALL LETTER IZHITSA +test(0x0475, 0x0474); // CYRILLIC SMALL LETTER IZHITSA, CYRILLIC CAPITAL LETTER IZHITSA +test(0x0476, 0x0477); // CYRILLIC CAPITAL LETTER IZHITSA WITH DOUBLE GRAVE ACCENT (CYRILLIC CAPITAL LETTER IZHITSA DOUBLE GRAVE), CYRILLIC SMALL LETTER IZHITSA WITH DOUBLE GRAVE ACCENT (CYRILLIC SMALL LETTER IZHITSA DOUBLE GRAVE) +test(0x0477, 0x0476); // CYRILLIC SMALL LETTER IZHITSA WITH DOUBLE GRAVE ACCENT (CYRILLIC SMALL LETTER IZHITSA DOUBLE GRAVE), CYRILLIC CAPITAL LETTER IZHITSA WITH DOUBLE GRAVE ACCENT (CYRILLIC CAPITAL LETTER IZHITSA DOUBLE GRAVE) +test(0x0478, 0x0479); // CYRILLIC CAPITAL LETTER UK (CYRILLIC CAPITAL LETTER UK DIGRAPH), CYRILLIC SMALL LETTER UK (CYRILLIC SMALL LETTER UK DIGRAPH) +test(0x0479, 0x0478); // CYRILLIC SMALL LETTER UK (CYRILLIC SMALL LETTER UK DIGRAPH), CYRILLIC CAPITAL LETTER UK (CYRILLIC CAPITAL LETTER UK DIGRAPH) +test(0x047A, 0x047B); // CYRILLIC CAPITAL LETTER ROUND OMEGA, CYRILLIC SMALL LETTER ROUND OMEGA +test(0x047B, 0x047A); // CYRILLIC SMALL LETTER ROUND OMEGA, CYRILLIC CAPITAL LETTER ROUND OMEGA +test(0x047C, 0x047D); // CYRILLIC CAPITAL LETTER OMEGA WITH TITLO (CYRILLIC CAPITAL LETTER OMEGA TITLO), CYRILLIC SMALL LETTER OMEGA WITH TITLO (CYRILLIC SMALL LETTER OMEGA TITLO) +test(0x047D, 0x047C); // CYRILLIC SMALL LETTER OMEGA WITH TITLO (CYRILLIC SMALL LETTER OMEGA TITLO), CYRILLIC CAPITAL LETTER OMEGA WITH TITLO (CYRILLIC CAPITAL LETTER OMEGA TITLO) +test(0x047E, 0x047F); // CYRILLIC CAPITAL LETTER OT, CYRILLIC SMALL LETTER OT +test(0x047F, 0x047E); // CYRILLIC SMALL LETTER OT, CYRILLIC CAPITAL LETTER OT +test(0x0480, 0x0481); // CYRILLIC CAPITAL LETTER KOPPA, CYRILLIC SMALL LETTER KOPPA +test(0x0481, 0x0480); // CYRILLIC SMALL LETTER KOPPA, CYRILLIC CAPITAL LETTER KOPPA +test(0x048A, 0x048B); // CYRILLIC CAPITAL LETTER SHORT I WITH TAIL, CYRILLIC SMALL LETTER SHORT I WITH TAIL +test(0x048B, 0x048A); // CYRILLIC SMALL LETTER SHORT I WITH TAIL, CYRILLIC CAPITAL LETTER SHORT I WITH TAIL +test(0x048C, 0x048D); // CYRILLIC CAPITAL LETTER SEMISOFT SIGN, CYRILLIC SMALL LETTER SEMISOFT SIGN +test(0x048D, 0x048C); // CYRILLIC SMALL LETTER SEMISOFT SIGN, CYRILLIC CAPITAL LETTER SEMISOFT SIGN +test(0x048E, 0x048F); // CYRILLIC CAPITAL LETTER ER WITH TICK, CYRILLIC SMALL LETTER ER WITH TICK +test(0x048F, 0x048E); // CYRILLIC SMALL LETTER ER WITH TICK, CYRILLIC CAPITAL LETTER ER WITH TICK +test(0x0490, 0x0491); // CYRILLIC CAPITAL LETTER GHE WITH UPTURN (CYRILLIC CAPITAL LETTER GE WITH UPTURN), CYRILLIC SMALL LETTER GHE WITH UPTURN (CYRILLIC SMALL LETTER GE WITH UPTURN) +test(0x0491, 0x0490); // CYRILLIC SMALL LETTER GHE WITH UPTURN (CYRILLIC SMALL LETTER GE WITH UPTURN), CYRILLIC CAPITAL LETTER GHE WITH UPTURN (CYRILLIC CAPITAL LETTER GE WITH UPTURN) +test(0x0492, 0x0493); // CYRILLIC CAPITAL LETTER GHE WITH STROKE (CYRILLIC CAPITAL LETTER GE BAR), CYRILLIC SMALL LETTER GHE WITH STROKE (CYRILLIC SMALL LETTER GE BAR) +test(0x0493, 0x0492); // CYRILLIC SMALL LETTER GHE WITH STROKE (CYRILLIC SMALL LETTER GE BAR), CYRILLIC CAPITAL LETTER GHE WITH STROKE (CYRILLIC CAPITAL LETTER GE BAR) +test(0x0494, 0x0495); // CYRILLIC CAPITAL LETTER GHE WITH MIDDLE HOOK (CYRILLIC CAPITAL LETTER GE HOOK), CYRILLIC SMALL LETTER GHE WITH MIDDLE HOOK (CYRILLIC SMALL LETTER GE HOOK) +test(0x0495, 0x0494); // CYRILLIC SMALL LETTER GHE WITH MIDDLE HOOK (CYRILLIC SMALL LETTER GE HOOK), CYRILLIC CAPITAL LETTER GHE WITH MIDDLE HOOK (CYRILLIC CAPITAL LETTER GE HOOK) +test(0x0496, 0x0497); // CYRILLIC CAPITAL LETTER ZHE WITH DESCENDER (CYRILLIC CAPITAL LETTER ZHE WITH RIGHT DESCENDER), CYRILLIC SMALL LETTER ZHE WITH DESCENDER (CYRILLIC SMALL LETTER ZHE WITH RIGHT DESCENDER) +test(0x0497, 0x0496); // CYRILLIC SMALL LETTER ZHE WITH DESCENDER (CYRILLIC SMALL LETTER ZHE WITH RIGHT DESCENDER), CYRILLIC CAPITAL LETTER ZHE WITH DESCENDER (CYRILLIC CAPITAL LETTER ZHE WITH RIGHT DESCENDER) +test(0x0498, 0x0499); // CYRILLIC CAPITAL LETTER ZE WITH DESCENDER (CYRILLIC CAPITAL LETTER ZE CEDILLA), CYRILLIC SMALL LETTER ZE WITH DESCENDER (CYRILLIC SMALL LETTER ZE CEDILLA) +test(0x0499, 0x0498); // CYRILLIC SMALL LETTER ZE WITH DESCENDER (CYRILLIC SMALL LETTER ZE CEDILLA), CYRILLIC CAPITAL LETTER ZE WITH DESCENDER (CYRILLIC CAPITAL LETTER ZE CEDILLA) +test(0x049A, 0x049B); // CYRILLIC CAPITAL LETTER KA WITH DESCENDER (CYRILLIC CAPITAL LETTER KA WITH RIGHT DESCENDER), CYRILLIC SMALL LETTER KA WITH DESCENDER (CYRILLIC SMALL LETTER KA WITH RIGHT DESCENDER) +test(0x049B, 0x049A); // CYRILLIC SMALL LETTER KA WITH DESCENDER (CYRILLIC SMALL LETTER KA WITH RIGHT DESCENDER), CYRILLIC CAPITAL LETTER KA WITH DESCENDER (CYRILLIC CAPITAL LETTER KA WITH RIGHT DESCENDER) +test(0x049C, 0x049D); // CYRILLIC CAPITAL LETTER KA WITH VERTICAL STROKE (CYRILLIC CAPITAL LETTER KA VERTICAL BAR), CYRILLIC SMALL LETTER KA WITH VERTICAL STROKE (CYRILLIC SMALL LETTER KA VERTICAL BAR) +test(0x049D, 0x049C); // CYRILLIC SMALL LETTER KA WITH VERTICAL STROKE (CYRILLIC SMALL LETTER KA VERTICAL BAR), CYRILLIC CAPITAL LETTER KA WITH VERTICAL STROKE (CYRILLIC CAPITAL LETTER KA VERTICAL BAR) +test(0x049E, 0x049F); // CYRILLIC CAPITAL LETTER KA WITH STROKE (CYRILLIC CAPITAL LETTER KA BAR), CYRILLIC SMALL LETTER KA WITH STROKE (CYRILLIC SMALL LETTER KA BAR) +test(0x049F, 0x049E); // CYRILLIC SMALL LETTER KA WITH STROKE (CYRILLIC SMALL LETTER KA BAR), CYRILLIC CAPITAL LETTER KA WITH STROKE (CYRILLIC CAPITAL LETTER KA BAR) +test(0x04A0, 0x04A1); // CYRILLIC CAPITAL LETTER BASHKIR KA (CYRILLIC CAPITAL LETTER REVERSED GE KA), CYRILLIC SMALL LETTER BASHKIR KA (CYRILLIC SMALL LETTER REVERSED GE KA) +test(0x04A1, 0x04A0); // CYRILLIC SMALL LETTER BASHKIR KA (CYRILLIC SMALL LETTER REVERSED GE KA), CYRILLIC CAPITAL LETTER BASHKIR KA (CYRILLIC CAPITAL LETTER REVERSED GE KA) +test(0x04A2, 0x04A3); // CYRILLIC CAPITAL LETTER EN WITH DESCENDER (CYRILLIC CAPITAL LETTER EN WITH RIGHT DESCENDER), CYRILLIC SMALL LETTER EN WITH DESCENDER (CYRILLIC SMALL LETTER EN WITH RIGHT DESCENDER) +test(0x04A3, 0x04A2); // CYRILLIC SMALL LETTER EN WITH DESCENDER (CYRILLIC SMALL LETTER EN WITH RIGHT DESCENDER), CYRILLIC CAPITAL LETTER EN WITH DESCENDER (CYRILLIC CAPITAL LETTER EN WITH RIGHT DESCENDER) +test(0x04A4, 0x04A5); // CYRILLIC CAPITAL LIGATURE EN GHE (CYRILLIC CAPITAL LETTER EN GE), CYRILLIC SMALL LIGATURE EN GHE (CYRILLIC SMALL LETTER EN GE) +test(0x04A5, 0x04A4); // CYRILLIC SMALL LIGATURE EN GHE (CYRILLIC SMALL LETTER EN GE), CYRILLIC CAPITAL LIGATURE EN GHE (CYRILLIC CAPITAL LETTER EN GE) +test(0x04A6, 0x04A7); // CYRILLIC CAPITAL LETTER PE WITH MIDDLE HOOK (CYRILLIC CAPITAL LETTER PE HOOK), CYRILLIC SMALL LETTER PE WITH MIDDLE HOOK (CYRILLIC SMALL LETTER PE HOOK) +test(0x04A7, 0x04A6); // CYRILLIC SMALL LETTER PE WITH MIDDLE HOOK (CYRILLIC SMALL LETTER PE HOOK), CYRILLIC CAPITAL LETTER PE WITH MIDDLE HOOK (CYRILLIC CAPITAL LETTER PE HOOK) +test(0x04A8, 0x04A9); // CYRILLIC CAPITAL LETTER ABKHASIAN HA (CYRILLIC CAPITAL LETTER O HOOK), CYRILLIC SMALL LETTER ABKHASIAN HA (CYRILLIC SMALL LETTER O HOOK) +test(0x04A9, 0x04A8); // CYRILLIC SMALL LETTER ABKHASIAN HA (CYRILLIC SMALL LETTER O HOOK), CYRILLIC CAPITAL LETTER ABKHASIAN HA (CYRILLIC CAPITAL LETTER O HOOK) +test(0x04AA, 0x04AB); // CYRILLIC CAPITAL LETTER ES WITH DESCENDER (CYRILLIC CAPITAL LETTER ES CEDILLA), CYRILLIC SMALL LETTER ES WITH DESCENDER (CYRILLIC SMALL LETTER ES CEDILLA) +test(0x04AB, 0x04AA); // CYRILLIC SMALL LETTER ES WITH DESCENDER (CYRILLIC SMALL LETTER ES CEDILLA), CYRILLIC CAPITAL LETTER ES WITH DESCENDER (CYRILLIC CAPITAL LETTER ES CEDILLA) +test(0x04AC, 0x04AD); // CYRILLIC CAPITAL LETTER TE WITH DESCENDER (CYRILLIC CAPITAL LETTER TE WITH RIGHT DESCENDER), CYRILLIC SMALL LETTER TE WITH DESCENDER (CYRILLIC SMALL LETTER TE WITH RIGHT DESCENDER) +test(0x04AD, 0x04AC); // CYRILLIC SMALL LETTER TE WITH DESCENDER (CYRILLIC SMALL LETTER TE WITH RIGHT DESCENDER), CYRILLIC CAPITAL LETTER TE WITH DESCENDER (CYRILLIC CAPITAL LETTER TE WITH RIGHT DESCENDER) +test(0x04AE, 0x04AF); // CYRILLIC CAPITAL LETTER STRAIGHT U, CYRILLIC SMALL LETTER STRAIGHT U +test(0x04AF, 0x04AE); // CYRILLIC SMALL LETTER STRAIGHT U, CYRILLIC CAPITAL LETTER STRAIGHT U +test(0x04B0, 0x04B1); // CYRILLIC CAPITAL LETTER STRAIGHT U WITH STROKE (CYRILLIC CAPITAL LETTER STRAIGHT U BAR), CYRILLIC SMALL LETTER STRAIGHT U WITH STROKE (CYRILLIC SMALL LETTER STRAIGHT U BAR) +test(0x04B1, 0x04B0); // CYRILLIC SMALL LETTER STRAIGHT U WITH STROKE (CYRILLIC SMALL LETTER STRAIGHT U BAR), CYRILLIC CAPITAL LETTER STRAIGHT U WITH STROKE (CYRILLIC CAPITAL LETTER STRAIGHT U BAR) +test(0x04B2, 0x04B3); // CYRILLIC CAPITAL LETTER HA WITH DESCENDER (CYRILLIC CAPITAL LETTER KHA WITH RIGHT DESCENDER), CYRILLIC SMALL LETTER HA WITH DESCENDER (CYRILLIC SMALL LETTER KHA WITH RIGHT DESCENDER) +test(0x04B3, 0x04B2); // CYRILLIC SMALL LETTER HA WITH DESCENDER (CYRILLIC SMALL LETTER KHA WITH RIGHT DESCENDER), CYRILLIC CAPITAL LETTER HA WITH DESCENDER (CYRILLIC CAPITAL LETTER KHA WITH RIGHT DESCENDER) +test(0x04B4, 0x04B5); // CYRILLIC CAPITAL LIGATURE TE TSE (CYRILLIC CAPITAL LETTER TE TSE), CYRILLIC SMALL LIGATURE TE TSE (CYRILLIC SMALL LETTER TE TSE) +test(0x04B5, 0x04B4); // CYRILLIC SMALL LIGATURE TE TSE (CYRILLIC SMALL LETTER TE TSE), CYRILLIC CAPITAL LIGATURE TE TSE (CYRILLIC CAPITAL LETTER TE TSE) +test(0x04B6, 0x04B7); // CYRILLIC CAPITAL LETTER CHE WITH DESCENDER (CYRILLIC CAPITAL LETTER CHE WITH RIGHT DESCENDER), CYRILLIC SMALL LETTER CHE WITH DESCENDER (CYRILLIC SMALL LETTER CHE WITH RIGHT DESCENDER) +test(0x04B7, 0x04B6); // CYRILLIC SMALL LETTER CHE WITH DESCENDER (CYRILLIC SMALL LETTER CHE WITH RIGHT DESCENDER), CYRILLIC CAPITAL LETTER CHE WITH DESCENDER (CYRILLIC CAPITAL LETTER CHE WITH RIGHT DESCENDER) +test(0x04B8, 0x04B9); // CYRILLIC CAPITAL LETTER CHE WITH VERTICAL STROKE (CYRILLIC CAPITAL LETTER CHE VERTICAL BAR), CYRILLIC SMALL LETTER CHE WITH VERTICAL STROKE (CYRILLIC SMALL LETTER CHE VERTICAL BAR) +test(0x04B9, 0x04B8); // CYRILLIC SMALL LETTER CHE WITH VERTICAL STROKE (CYRILLIC SMALL LETTER CHE VERTICAL BAR), CYRILLIC CAPITAL LETTER CHE WITH VERTICAL STROKE (CYRILLIC CAPITAL LETTER CHE VERTICAL BAR) +test(0x04BA, 0x04BB); // CYRILLIC CAPITAL LETTER SHHA (CYRILLIC CAPITAL LETTER H), CYRILLIC SMALL LETTER SHHA (CYRILLIC SMALL LETTER H) +test(0x04BB, 0x04BA); // CYRILLIC SMALL LETTER SHHA (CYRILLIC SMALL LETTER H), CYRILLIC CAPITAL LETTER SHHA (CYRILLIC CAPITAL LETTER H) +test(0x04BC, 0x04BD); // CYRILLIC CAPITAL LETTER ABKHASIAN CHE (CYRILLIC CAPITAL LETTER IE HOOK), CYRILLIC SMALL LETTER ABKHASIAN CHE (CYRILLIC SMALL LETTER IE HOOK) +test(0x04BD, 0x04BC); // CYRILLIC SMALL LETTER ABKHASIAN CHE (CYRILLIC SMALL LETTER IE HOOK), CYRILLIC CAPITAL LETTER ABKHASIAN CHE (CYRILLIC CAPITAL LETTER IE HOOK) +test(0x04BE, 0x04BF); // CYRILLIC CAPITAL LETTER ABKHASIAN CHE WITH DESCENDER (CYRILLIC CAPITAL LETTER IE HOOK OGONEK), CYRILLIC SMALL LETTER ABKHASIAN CHE WITH DESCENDER (CYRILLIC SMALL LETTER IE HOOK OGONEK) +test(0x04BF, 0x04BE); // CYRILLIC SMALL LETTER ABKHASIAN CHE WITH DESCENDER (CYRILLIC SMALL LETTER IE HOOK OGONEK), CYRILLIC CAPITAL LETTER ABKHASIAN CHE WITH DESCENDER (CYRILLIC CAPITAL LETTER IE HOOK OGONEK) +test(0x04C0, 0x04CF); // CYRILLIC LETTER PALOCHKA (CYRILLIC LETTER I), CYRILLIC SMALL LETTER PALOCHKA +test(0x04C1, 0x04C2); // CYRILLIC CAPITAL LETTER ZHE WITH BREVE (CYRILLIC CAPITAL LETTER SHORT ZHE), CYRILLIC SMALL LETTER ZHE WITH BREVE (CYRILLIC SMALL LETTER SHORT ZHE) +test(0x04C2, 0x04C1); // CYRILLIC SMALL LETTER ZHE WITH BREVE (CYRILLIC SMALL LETTER SHORT ZHE), CYRILLIC CAPITAL LETTER ZHE WITH BREVE (CYRILLIC CAPITAL LETTER SHORT ZHE) +test(0x04C3, 0x04C4); // CYRILLIC CAPITAL LETTER KA WITH HOOK (CYRILLIC CAPITAL LETTER KA HOOK), CYRILLIC SMALL LETTER KA WITH HOOK (CYRILLIC SMALL LETTER KA HOOK) +test(0x04C4, 0x04C3); // CYRILLIC SMALL LETTER KA WITH HOOK (CYRILLIC SMALL LETTER KA HOOK), CYRILLIC CAPITAL LETTER KA WITH HOOK (CYRILLIC CAPITAL LETTER KA HOOK) +test(0x04C5, 0x04C6); // CYRILLIC CAPITAL LETTER EL WITH TAIL, CYRILLIC SMALL LETTER EL WITH TAIL +test(0x04C6, 0x04C5); // CYRILLIC SMALL LETTER EL WITH TAIL, CYRILLIC CAPITAL LETTER EL WITH TAIL +test(0x04C7, 0x04C8); // CYRILLIC CAPITAL LETTER EN WITH HOOK (CYRILLIC CAPITAL LETTER EN HOOK), CYRILLIC SMALL LETTER EN WITH HOOK (CYRILLIC SMALL LETTER EN HOOK) +test(0x04C8, 0x04C7); // CYRILLIC SMALL LETTER EN WITH HOOK (CYRILLIC SMALL LETTER EN HOOK), CYRILLIC CAPITAL LETTER EN WITH HOOK (CYRILLIC CAPITAL LETTER EN HOOK) +test(0x04C9, 0x04CA); // CYRILLIC CAPITAL LETTER EN WITH TAIL, CYRILLIC SMALL LETTER EN WITH TAIL +test(0x04CA, 0x04C9); // CYRILLIC SMALL LETTER EN WITH TAIL, CYRILLIC CAPITAL LETTER EN WITH TAIL +test(0x04CB, 0x04CC); // CYRILLIC CAPITAL LETTER KHAKASSIAN CHE (CYRILLIC CAPITAL LETTER CHE WITH LEFT DESCENDER), CYRILLIC SMALL LETTER KHAKASSIAN CHE (CYRILLIC SMALL LETTER CHE WITH LEFT DESCENDER) +test(0x04CC, 0x04CB); // CYRILLIC SMALL LETTER KHAKASSIAN CHE (CYRILLIC SMALL LETTER CHE WITH LEFT DESCENDER), CYRILLIC CAPITAL LETTER KHAKASSIAN CHE (CYRILLIC CAPITAL LETTER CHE WITH LEFT DESCENDER) +test(0x04CD, 0x04CE); // CYRILLIC CAPITAL LETTER EM WITH TAIL, CYRILLIC SMALL LETTER EM WITH TAIL +test(0x04CE, 0x04CD); // CYRILLIC SMALL LETTER EM WITH TAIL, CYRILLIC CAPITAL LETTER EM WITH TAIL +test(0x04CF, 0x04C0); // CYRILLIC SMALL LETTER PALOCHKA, CYRILLIC LETTER PALOCHKA (CYRILLIC LETTER I) +test(0x04D0, 0x04D1); // CYRILLIC CAPITAL LETTER A WITH BREVE, CYRILLIC SMALL LETTER A WITH BREVE +test(0x04D1, 0x04D0); // CYRILLIC SMALL LETTER A WITH BREVE, CYRILLIC CAPITAL LETTER A WITH BREVE +test(0x04D2, 0x04D3); // CYRILLIC CAPITAL LETTER A WITH DIAERESIS, CYRILLIC SMALL LETTER A WITH DIAERESIS +test(0x04D3, 0x04D2); // CYRILLIC SMALL LETTER A WITH DIAERESIS, CYRILLIC CAPITAL LETTER A WITH DIAERESIS +test(0x04D4, 0x04D5); // CYRILLIC CAPITAL LIGATURE A IE, CYRILLIC SMALL LIGATURE A IE +test(0x04D5, 0x04D4); // CYRILLIC SMALL LIGATURE A IE, CYRILLIC CAPITAL LIGATURE A IE +test(0x04D6, 0x04D7); // CYRILLIC CAPITAL LETTER IE WITH BREVE, CYRILLIC SMALL LETTER IE WITH BREVE +test(0x04D7, 0x04D6); // CYRILLIC SMALL LETTER IE WITH BREVE, CYRILLIC CAPITAL LETTER IE WITH BREVE +test(0x04D8, 0x04D9); // CYRILLIC CAPITAL LETTER SCHWA, CYRILLIC SMALL LETTER SCHWA +test(0x04D9, 0x04D8); // CYRILLIC SMALL LETTER SCHWA, CYRILLIC CAPITAL LETTER SCHWA +test(0x04DA, 0x04DB); // CYRILLIC CAPITAL LETTER SCHWA WITH DIAERESIS, CYRILLIC SMALL LETTER SCHWA WITH DIAERESIS +test(0x04DB, 0x04DA); // CYRILLIC SMALL LETTER SCHWA WITH DIAERESIS, CYRILLIC CAPITAL LETTER SCHWA WITH DIAERESIS +test(0x04DC, 0x04DD); // CYRILLIC CAPITAL LETTER ZHE WITH DIAERESIS, CYRILLIC SMALL LETTER ZHE WITH DIAERESIS +test(0x04DD, 0x04DC); // CYRILLIC SMALL LETTER ZHE WITH DIAERESIS, CYRILLIC CAPITAL LETTER ZHE WITH DIAERESIS +test(0x04DE, 0x04DF); // CYRILLIC CAPITAL LETTER ZE WITH DIAERESIS, CYRILLIC SMALL LETTER ZE WITH DIAERESIS +test(0x04DF, 0x04DE); // CYRILLIC SMALL LETTER ZE WITH DIAERESIS, CYRILLIC CAPITAL LETTER ZE WITH DIAERESIS +test(0x04E0, 0x04E1); // CYRILLIC CAPITAL LETTER ABKHASIAN DZE, CYRILLIC SMALL LETTER ABKHASIAN DZE +test(0x04E1, 0x04E0); // CYRILLIC SMALL LETTER ABKHASIAN DZE, CYRILLIC CAPITAL LETTER ABKHASIAN DZE +test(0x04E2, 0x04E3); // CYRILLIC CAPITAL LETTER I WITH MACRON, CYRILLIC SMALL LETTER I WITH MACRON +test(0x04E3, 0x04E2); // CYRILLIC SMALL LETTER I WITH MACRON, CYRILLIC CAPITAL LETTER I WITH MACRON +test(0x04E4, 0x04E5); // CYRILLIC CAPITAL LETTER I WITH DIAERESIS, CYRILLIC SMALL LETTER I WITH DIAERESIS +test(0x04E5, 0x04E4); // CYRILLIC SMALL LETTER I WITH DIAERESIS, CYRILLIC CAPITAL LETTER I WITH DIAERESIS +test(0x04E6, 0x04E7); // CYRILLIC CAPITAL LETTER O WITH DIAERESIS, CYRILLIC SMALL LETTER O WITH DIAERESIS +test(0x04E7, 0x04E6); // CYRILLIC SMALL LETTER O WITH DIAERESIS, CYRILLIC CAPITAL LETTER O WITH DIAERESIS +test(0x04E8, 0x04E9); // CYRILLIC CAPITAL LETTER BARRED O, CYRILLIC SMALL LETTER BARRED O +test(0x04E9, 0x04E8); // CYRILLIC SMALL LETTER BARRED O, CYRILLIC CAPITAL LETTER BARRED O +test(0x04EA, 0x04EB); // CYRILLIC CAPITAL LETTER BARRED O WITH DIAERESIS, CYRILLIC SMALL LETTER BARRED O WITH DIAERESIS +test(0x04EB, 0x04EA); // CYRILLIC SMALL LETTER BARRED O WITH DIAERESIS, CYRILLIC CAPITAL LETTER BARRED O WITH DIAERESIS +test(0x04EC, 0x04ED); // CYRILLIC CAPITAL LETTER E WITH DIAERESIS, CYRILLIC SMALL LETTER E WITH DIAERESIS +test(0x04ED, 0x04EC); // CYRILLIC SMALL LETTER E WITH DIAERESIS, CYRILLIC CAPITAL LETTER E WITH DIAERESIS +test(0x04EE, 0x04EF); // CYRILLIC CAPITAL LETTER U WITH MACRON, CYRILLIC SMALL LETTER U WITH MACRON +test(0x04EF, 0x04EE); // CYRILLIC SMALL LETTER U WITH MACRON, CYRILLIC CAPITAL LETTER U WITH MACRON +test(0x04F0, 0x04F1); // CYRILLIC CAPITAL LETTER U WITH DIAERESIS, CYRILLIC SMALL LETTER U WITH DIAERESIS +test(0x04F1, 0x04F0); // CYRILLIC SMALL LETTER U WITH DIAERESIS, CYRILLIC CAPITAL LETTER U WITH DIAERESIS +test(0x04F2, 0x04F3); // CYRILLIC CAPITAL LETTER U WITH DOUBLE ACUTE, CYRILLIC SMALL LETTER U WITH DOUBLE ACUTE +test(0x04F3, 0x04F2); // CYRILLIC SMALL LETTER U WITH DOUBLE ACUTE, CYRILLIC CAPITAL LETTER U WITH DOUBLE ACUTE +test(0x04F4, 0x04F5); // CYRILLIC CAPITAL LETTER CHE WITH DIAERESIS, CYRILLIC SMALL LETTER CHE WITH DIAERESIS +test(0x04F5, 0x04F4); // CYRILLIC SMALL LETTER CHE WITH DIAERESIS, CYRILLIC CAPITAL LETTER CHE WITH DIAERESIS +test(0x04F6, 0x04F7); // CYRILLIC CAPITAL LETTER GHE WITH DESCENDER, CYRILLIC SMALL LETTER GHE WITH DESCENDER +test(0x04F7, 0x04F6); // CYRILLIC SMALL LETTER GHE WITH DESCENDER, CYRILLIC CAPITAL LETTER GHE WITH DESCENDER +test(0x04F8, 0x04F9); // CYRILLIC CAPITAL LETTER YERU WITH DIAERESIS, CYRILLIC SMALL LETTER YERU WITH DIAERESIS +test(0x04F9, 0x04F8); // CYRILLIC SMALL LETTER YERU WITH DIAERESIS, CYRILLIC CAPITAL LETTER YERU WITH DIAERESIS +test(0x04FA, 0x04FB); // CYRILLIC CAPITAL LETTER GHE WITH STROKE AND HOOK, CYRILLIC SMALL LETTER GHE WITH STROKE AND HOOK +test(0x04FB, 0x04FA); // CYRILLIC SMALL LETTER GHE WITH STROKE AND HOOK, CYRILLIC CAPITAL LETTER GHE WITH STROKE AND HOOK +test(0x04FC, 0x04FD); // CYRILLIC CAPITAL LETTER HA WITH HOOK, CYRILLIC SMALL LETTER HA WITH HOOK +test(0x04FD, 0x04FC); // CYRILLIC SMALL LETTER HA WITH HOOK, CYRILLIC CAPITAL LETTER HA WITH HOOK +test(0x04FE, 0x04FF); // CYRILLIC CAPITAL LETTER HA WITH STROKE, CYRILLIC SMALL LETTER HA WITH STROKE +test(0x04FF, 0x04FE); // CYRILLIC SMALL LETTER HA WITH STROKE, CYRILLIC CAPITAL LETTER HA WITH STROKE +test(0x0500, 0x0501); // CYRILLIC CAPITAL LETTER KOMI DE, CYRILLIC SMALL LETTER KOMI DE +test(0x0501, 0x0500); // CYRILLIC SMALL LETTER KOMI DE, CYRILLIC CAPITAL LETTER KOMI DE +test(0x0502, 0x0503); // CYRILLIC CAPITAL LETTER KOMI DJE, CYRILLIC SMALL LETTER KOMI DJE +test(0x0503, 0x0502); // CYRILLIC SMALL LETTER KOMI DJE, CYRILLIC CAPITAL LETTER KOMI DJE +test(0x0504, 0x0505); // CYRILLIC CAPITAL LETTER KOMI ZJE, CYRILLIC SMALL LETTER KOMI ZJE +test(0x0505, 0x0504); // CYRILLIC SMALL LETTER KOMI ZJE, CYRILLIC CAPITAL LETTER KOMI ZJE +test(0x0506, 0x0507); // CYRILLIC CAPITAL LETTER KOMI DZJE, CYRILLIC SMALL LETTER KOMI DZJE +test(0x0507, 0x0506); // CYRILLIC SMALL LETTER KOMI DZJE, CYRILLIC CAPITAL LETTER KOMI DZJE +test(0x0508, 0x0509); // CYRILLIC CAPITAL LETTER KOMI LJE, CYRILLIC SMALL LETTER KOMI LJE +test(0x0509, 0x0508); // CYRILLIC SMALL LETTER KOMI LJE, CYRILLIC CAPITAL LETTER KOMI LJE +test(0x050A, 0x050B); // CYRILLIC CAPITAL LETTER KOMI NJE, CYRILLIC SMALL LETTER KOMI NJE +test(0x050B, 0x050A); // CYRILLIC SMALL LETTER KOMI NJE, CYRILLIC CAPITAL LETTER KOMI NJE +test(0x050C, 0x050D); // CYRILLIC CAPITAL LETTER KOMI SJE, CYRILLIC SMALL LETTER KOMI SJE +test(0x050D, 0x050C); // CYRILLIC SMALL LETTER KOMI SJE, CYRILLIC CAPITAL LETTER KOMI SJE +test(0x050E, 0x050F); // CYRILLIC CAPITAL LETTER KOMI TJE, CYRILLIC SMALL LETTER KOMI TJE +test(0x050F, 0x050E); // CYRILLIC SMALL LETTER KOMI TJE, CYRILLIC CAPITAL LETTER KOMI TJE +test(0x0510, 0x0511); // CYRILLIC CAPITAL LETTER REVERSED ZE, CYRILLIC SMALL LETTER REVERSED ZE +test(0x0511, 0x0510); // CYRILLIC SMALL LETTER REVERSED ZE, CYRILLIC CAPITAL LETTER REVERSED ZE +test(0x0512, 0x0513); // CYRILLIC CAPITAL LETTER EL WITH HOOK, CYRILLIC SMALL LETTER EL WITH HOOK +test(0x0513, 0x0512); // CYRILLIC SMALL LETTER EL WITH HOOK, CYRILLIC CAPITAL LETTER EL WITH HOOK +test(0x0514, 0x0515); // CYRILLIC CAPITAL LETTER LHA, CYRILLIC SMALL LETTER LHA +test(0x0515, 0x0514); // CYRILLIC SMALL LETTER LHA, CYRILLIC CAPITAL LETTER LHA +test(0x0516, 0x0517); // CYRILLIC CAPITAL LETTER RHA, CYRILLIC SMALL LETTER RHA +test(0x0517, 0x0516); // CYRILLIC SMALL LETTER RHA, CYRILLIC CAPITAL LETTER RHA +test(0x0518, 0x0519); // CYRILLIC CAPITAL LETTER YAE, CYRILLIC SMALL LETTER YAE +test(0x0519, 0x0518); // CYRILLIC SMALL LETTER YAE, CYRILLIC CAPITAL LETTER YAE +test(0x051A, 0x051B); // CYRILLIC CAPITAL LETTER QA, CYRILLIC SMALL LETTER QA +test(0x051B, 0x051A); // CYRILLIC SMALL LETTER QA, CYRILLIC CAPITAL LETTER QA +test(0x051C, 0x051D); // CYRILLIC CAPITAL LETTER WE, CYRILLIC SMALL LETTER WE +test(0x051D, 0x051C); // CYRILLIC SMALL LETTER WE, CYRILLIC CAPITAL LETTER WE +test(0x051E, 0x051F); // CYRILLIC CAPITAL LETTER ALEUT KA, CYRILLIC SMALL LETTER ALEUT KA +test(0x051F, 0x051E); // CYRILLIC SMALL LETTER ALEUT KA, CYRILLIC CAPITAL LETTER ALEUT KA +test(0x0520, 0x0521); // CYRILLIC CAPITAL LETTER EL WITH MIDDLE HOOK, CYRILLIC SMALL LETTER EL WITH MIDDLE HOOK +test(0x0521, 0x0520); // CYRILLIC SMALL LETTER EL WITH MIDDLE HOOK, CYRILLIC CAPITAL LETTER EL WITH MIDDLE HOOK +test(0x0522, 0x0523); // CYRILLIC CAPITAL LETTER EN WITH MIDDLE HOOK, CYRILLIC SMALL LETTER EN WITH MIDDLE HOOK +test(0x0523, 0x0522); // CYRILLIC SMALL LETTER EN WITH MIDDLE HOOK, CYRILLIC CAPITAL LETTER EN WITH MIDDLE HOOK +test(0x0524, 0x0525); // CYRILLIC CAPITAL LETTER PE WITH DESCENDER, CYRILLIC SMALL LETTER PE WITH DESCENDER +test(0x0525, 0x0524); // CYRILLIC SMALL LETTER PE WITH DESCENDER, CYRILLIC CAPITAL LETTER PE WITH DESCENDER +test(0x0526, 0x0527); // CYRILLIC CAPITAL LETTER SHHA WITH DESCENDER, CYRILLIC SMALL LETTER SHHA WITH DESCENDER +test(0x0527, 0x0526); // CYRILLIC SMALL LETTER SHHA WITH DESCENDER, CYRILLIC CAPITAL LETTER SHHA WITH DESCENDER +test(0x0528, 0x0529); // CYRILLIC CAPITAL LETTER EN WITH LEFT HOOK, CYRILLIC SMALL LETTER EN WITH LEFT HOOK +test(0x0529, 0x0528); // CYRILLIC SMALL LETTER EN WITH LEFT HOOK, CYRILLIC CAPITAL LETTER EN WITH LEFT HOOK +test(0x052A, 0x052B); // CYRILLIC CAPITAL LETTER DZZHE, CYRILLIC SMALL LETTER DZZHE +test(0x052B, 0x052A); // CYRILLIC SMALL LETTER DZZHE, CYRILLIC CAPITAL LETTER DZZHE +test(0x052C, 0x052D); // CYRILLIC CAPITAL LETTER DCHE, CYRILLIC SMALL LETTER DCHE +test(0x052D, 0x052C); // CYRILLIC SMALL LETTER DCHE, CYRILLIC CAPITAL LETTER DCHE +test(0x052E, 0x052F); // CYRILLIC CAPITAL LETTER EL WITH DESCENDER, CYRILLIC SMALL LETTER EL WITH DESCENDER +test(0x052F, 0x052E); // CYRILLIC SMALL LETTER EL WITH DESCENDER, CYRILLIC CAPITAL LETTER EL WITH DESCENDER +test(0x0531, 0x0561); // ARMENIAN CAPITAL LETTER AYB, ARMENIAN SMALL LETTER AYB +test(0x0532, 0x0562); // ARMENIAN CAPITAL LETTER BEN, ARMENIAN SMALL LETTER BEN +test(0x0533, 0x0563); // ARMENIAN CAPITAL LETTER GIM, ARMENIAN SMALL LETTER GIM +test(0x0534, 0x0564); // ARMENIAN CAPITAL LETTER DA, ARMENIAN SMALL LETTER DA +test(0x0535, 0x0565); // ARMENIAN CAPITAL LETTER ECH, ARMENIAN SMALL LETTER ECH +test(0x0536, 0x0566); // ARMENIAN CAPITAL LETTER ZA, ARMENIAN SMALL LETTER ZA +test(0x0537, 0x0567); // ARMENIAN CAPITAL LETTER EH, ARMENIAN SMALL LETTER EH +test(0x0538, 0x0568); // ARMENIAN CAPITAL LETTER ET, ARMENIAN SMALL LETTER ET +test(0x0539, 0x0569); // ARMENIAN CAPITAL LETTER TO, ARMENIAN SMALL LETTER TO +test(0x053A, 0x056A); // ARMENIAN CAPITAL LETTER ZHE, ARMENIAN SMALL LETTER ZHE +test(0x053B, 0x056B); // ARMENIAN CAPITAL LETTER INI, ARMENIAN SMALL LETTER INI +test(0x053C, 0x056C); // ARMENIAN CAPITAL LETTER LIWN, ARMENIAN SMALL LETTER LIWN +test(0x053D, 0x056D); // ARMENIAN CAPITAL LETTER XEH, ARMENIAN SMALL LETTER XEH +test(0x053E, 0x056E); // ARMENIAN CAPITAL LETTER CA, ARMENIAN SMALL LETTER CA +test(0x053F, 0x056F); // ARMENIAN CAPITAL LETTER KEN, ARMENIAN SMALL LETTER KEN +test(0x0540, 0x0570); // ARMENIAN CAPITAL LETTER HO, ARMENIAN SMALL LETTER HO +test(0x0541, 0x0571); // ARMENIAN CAPITAL LETTER JA, ARMENIAN SMALL LETTER JA +test(0x0542, 0x0572); // ARMENIAN CAPITAL LETTER GHAD (ARMENIAN CAPITAL LETTER LAD), ARMENIAN SMALL LETTER GHAD (ARMENIAN SMALL LETTER LAD) +test(0x0543, 0x0573); // ARMENIAN CAPITAL LETTER CHEH, ARMENIAN SMALL LETTER CHEH +test(0x0544, 0x0574); // ARMENIAN CAPITAL LETTER MEN, ARMENIAN SMALL LETTER MEN +test(0x0545, 0x0575); // ARMENIAN CAPITAL LETTER YI, ARMENIAN SMALL LETTER YI +test(0x0546, 0x0576); // ARMENIAN CAPITAL LETTER NOW, ARMENIAN SMALL LETTER NOW +test(0x0547, 0x0577); // ARMENIAN CAPITAL LETTER SHA, ARMENIAN SMALL LETTER SHA +test(0x0548, 0x0578); // ARMENIAN CAPITAL LETTER VO, ARMENIAN SMALL LETTER VO +test(0x0549, 0x0579); // ARMENIAN CAPITAL LETTER CHA, ARMENIAN SMALL LETTER CHA +test(0x054A, 0x057A); // ARMENIAN CAPITAL LETTER PEH, ARMENIAN SMALL LETTER PEH +test(0x054B, 0x057B); // ARMENIAN CAPITAL LETTER JHEH, ARMENIAN SMALL LETTER JHEH +test(0x054C, 0x057C); // ARMENIAN CAPITAL LETTER RA, ARMENIAN SMALL LETTER RA +test(0x054D, 0x057D); // ARMENIAN CAPITAL LETTER SEH, ARMENIAN SMALL LETTER SEH +test(0x054E, 0x057E); // ARMENIAN CAPITAL LETTER VEW, ARMENIAN SMALL LETTER VEW +test(0x054F, 0x057F); // ARMENIAN CAPITAL LETTER TIWN, ARMENIAN SMALL LETTER TIWN +test(0x0550, 0x0580); // ARMENIAN CAPITAL LETTER REH, ARMENIAN SMALL LETTER REH +test(0x0551, 0x0581); // ARMENIAN CAPITAL LETTER CO, ARMENIAN SMALL LETTER CO +test(0x0552, 0x0582); // ARMENIAN CAPITAL LETTER YIWN, ARMENIAN SMALL LETTER YIWN +test(0x0553, 0x0583); // ARMENIAN CAPITAL LETTER PIWR, ARMENIAN SMALL LETTER PIWR +test(0x0554, 0x0584); // ARMENIAN CAPITAL LETTER KEH, ARMENIAN SMALL LETTER KEH +test(0x0555, 0x0585); // ARMENIAN CAPITAL LETTER OH, ARMENIAN SMALL LETTER OH +test(0x0556, 0x0586); // ARMENIAN CAPITAL LETTER FEH, ARMENIAN SMALL LETTER FEH +test(0x0561, 0x0531); // ARMENIAN SMALL LETTER AYB, ARMENIAN CAPITAL LETTER AYB +test(0x0562, 0x0532); // ARMENIAN SMALL LETTER BEN, ARMENIAN CAPITAL LETTER BEN +test(0x0563, 0x0533); // ARMENIAN SMALL LETTER GIM, ARMENIAN CAPITAL LETTER GIM +test(0x0564, 0x0534); // ARMENIAN SMALL LETTER DA, ARMENIAN CAPITAL LETTER DA +test(0x0565, 0x0535); // ARMENIAN SMALL LETTER ECH, ARMENIAN CAPITAL LETTER ECH +test(0x0566, 0x0536); // ARMENIAN SMALL LETTER ZA, ARMENIAN CAPITAL LETTER ZA +test(0x0567, 0x0537); // ARMENIAN SMALL LETTER EH, ARMENIAN CAPITAL LETTER EH +test(0x0568, 0x0538); // ARMENIAN SMALL LETTER ET, ARMENIAN CAPITAL LETTER ET +test(0x0569, 0x0539); // ARMENIAN SMALL LETTER TO, ARMENIAN CAPITAL LETTER TO +test(0x056A, 0x053A); // ARMENIAN SMALL LETTER ZHE, ARMENIAN CAPITAL LETTER ZHE +test(0x056B, 0x053B); // ARMENIAN SMALL LETTER INI, ARMENIAN CAPITAL LETTER INI +test(0x056C, 0x053C); // ARMENIAN SMALL LETTER LIWN, ARMENIAN CAPITAL LETTER LIWN +test(0x056D, 0x053D); // ARMENIAN SMALL LETTER XEH, ARMENIAN CAPITAL LETTER XEH +test(0x056E, 0x053E); // ARMENIAN SMALL LETTER CA, ARMENIAN CAPITAL LETTER CA +test(0x056F, 0x053F); // ARMENIAN SMALL LETTER KEN, ARMENIAN CAPITAL LETTER KEN +test(0x0570, 0x0540); // ARMENIAN SMALL LETTER HO, ARMENIAN CAPITAL LETTER HO +test(0x0571, 0x0541); // ARMENIAN SMALL LETTER JA, ARMENIAN CAPITAL LETTER JA +test(0x0572, 0x0542); // ARMENIAN SMALL LETTER GHAD (ARMENIAN SMALL LETTER LAD), ARMENIAN CAPITAL LETTER GHAD (ARMENIAN CAPITAL LETTER LAD) +test(0x0573, 0x0543); // ARMENIAN SMALL LETTER CHEH, ARMENIAN CAPITAL LETTER CHEH +test(0x0574, 0x0544); // ARMENIAN SMALL LETTER MEN, ARMENIAN CAPITAL LETTER MEN +test(0x0575, 0x0545); // ARMENIAN SMALL LETTER YI, ARMENIAN CAPITAL LETTER YI +test(0x0576, 0x0546); // ARMENIAN SMALL LETTER NOW, ARMENIAN CAPITAL LETTER NOW +test(0x0577, 0x0547); // ARMENIAN SMALL LETTER SHA, ARMENIAN CAPITAL LETTER SHA +test(0x0578, 0x0548); // ARMENIAN SMALL LETTER VO, ARMENIAN CAPITAL LETTER VO +test(0x0579, 0x0549); // ARMENIAN SMALL LETTER CHA, ARMENIAN CAPITAL LETTER CHA +test(0x057A, 0x054A); // ARMENIAN SMALL LETTER PEH, ARMENIAN CAPITAL LETTER PEH +test(0x057B, 0x054B); // ARMENIAN SMALL LETTER JHEH, ARMENIAN CAPITAL LETTER JHEH +test(0x057C, 0x054C); // ARMENIAN SMALL LETTER RA, ARMENIAN CAPITAL LETTER RA +test(0x057D, 0x054D); // ARMENIAN SMALL LETTER SEH, ARMENIAN CAPITAL LETTER SEH +test(0x057E, 0x054E); // ARMENIAN SMALL LETTER VEW, ARMENIAN CAPITAL LETTER VEW +test(0x057F, 0x054F); // ARMENIAN SMALL LETTER TIWN, ARMENIAN CAPITAL LETTER TIWN +test(0x0580, 0x0550); // ARMENIAN SMALL LETTER REH, ARMENIAN CAPITAL LETTER REH +test(0x0581, 0x0551); // ARMENIAN SMALL LETTER CO, ARMENIAN CAPITAL LETTER CO +test(0x0582, 0x0552); // ARMENIAN SMALL LETTER YIWN, ARMENIAN CAPITAL LETTER YIWN +test(0x0583, 0x0553); // ARMENIAN SMALL LETTER PIWR, ARMENIAN CAPITAL LETTER PIWR +test(0x0584, 0x0554); // ARMENIAN SMALL LETTER KEH, ARMENIAN CAPITAL LETTER KEH +test(0x0585, 0x0555); // ARMENIAN SMALL LETTER OH, ARMENIAN CAPITAL LETTER OH +test(0x0586, 0x0556); // ARMENIAN SMALL LETTER FEH, ARMENIAN CAPITAL LETTER FEH +test(0x10A0, 0x2D00); // GEORGIAN CAPITAL LETTER AN, GEORGIAN SMALL LETTER AN +test(0x10A1, 0x2D01); // GEORGIAN CAPITAL LETTER BAN, GEORGIAN SMALL LETTER BAN +test(0x10A2, 0x2D02); // GEORGIAN CAPITAL LETTER GAN, GEORGIAN SMALL LETTER GAN +test(0x10A3, 0x2D03); // GEORGIAN CAPITAL LETTER DON, GEORGIAN SMALL LETTER DON +test(0x10A4, 0x2D04); // GEORGIAN CAPITAL LETTER EN, GEORGIAN SMALL LETTER EN +test(0x10A5, 0x2D05); // GEORGIAN CAPITAL LETTER VIN, GEORGIAN SMALL LETTER VIN +test(0x10A6, 0x2D06); // GEORGIAN CAPITAL LETTER ZEN, GEORGIAN SMALL LETTER ZEN +test(0x10A7, 0x2D07); // GEORGIAN CAPITAL LETTER TAN, GEORGIAN SMALL LETTER TAN +test(0x10A8, 0x2D08); // GEORGIAN CAPITAL LETTER IN, GEORGIAN SMALL LETTER IN +test(0x10A9, 0x2D09); // GEORGIAN CAPITAL LETTER KAN, GEORGIAN SMALL LETTER KAN +test(0x10AA, 0x2D0A); // GEORGIAN CAPITAL LETTER LAS, GEORGIAN SMALL LETTER LAS +test(0x10AB, 0x2D0B); // GEORGIAN CAPITAL LETTER MAN, GEORGIAN SMALL LETTER MAN +test(0x10AC, 0x2D0C); // GEORGIAN CAPITAL LETTER NAR, GEORGIAN SMALL LETTER NAR +test(0x10AD, 0x2D0D); // GEORGIAN CAPITAL LETTER ON, GEORGIAN SMALL LETTER ON +test(0x10AE, 0x2D0E); // GEORGIAN CAPITAL LETTER PAR, GEORGIAN SMALL LETTER PAR +test(0x10AF, 0x2D0F); // GEORGIAN CAPITAL LETTER ZHAR, GEORGIAN SMALL LETTER ZHAR +test(0x10B0, 0x2D10); // GEORGIAN CAPITAL LETTER RAE, GEORGIAN SMALL LETTER RAE +test(0x10B1, 0x2D11); // GEORGIAN CAPITAL LETTER SAN, GEORGIAN SMALL LETTER SAN +test(0x10B2, 0x2D12); // GEORGIAN CAPITAL LETTER TAR, GEORGIAN SMALL LETTER TAR +test(0x10B3, 0x2D13); // GEORGIAN CAPITAL LETTER UN, GEORGIAN SMALL LETTER UN +test(0x10B4, 0x2D14); // GEORGIAN CAPITAL LETTER PHAR, GEORGIAN SMALL LETTER PHAR +test(0x10B5, 0x2D15); // GEORGIAN CAPITAL LETTER KHAR, GEORGIAN SMALL LETTER KHAR +test(0x10B6, 0x2D16); // GEORGIAN CAPITAL LETTER GHAN, GEORGIAN SMALL LETTER GHAN +test(0x10B7, 0x2D17); // GEORGIAN CAPITAL LETTER QAR, GEORGIAN SMALL LETTER QAR +test(0x10B8, 0x2D18); // GEORGIAN CAPITAL LETTER SHIN, GEORGIAN SMALL LETTER SHIN +test(0x10B9, 0x2D19); // GEORGIAN CAPITAL LETTER CHIN, GEORGIAN SMALL LETTER CHIN +test(0x10BA, 0x2D1A); // GEORGIAN CAPITAL LETTER CAN, GEORGIAN SMALL LETTER CAN +test(0x10BB, 0x2D1B); // GEORGIAN CAPITAL LETTER JIL, GEORGIAN SMALL LETTER JIL +test(0x10BC, 0x2D1C); // GEORGIAN CAPITAL LETTER CIL, GEORGIAN SMALL LETTER CIL +test(0x10BD, 0x2D1D); // GEORGIAN CAPITAL LETTER CHAR, GEORGIAN SMALL LETTER CHAR +test(0x10BE, 0x2D1E); // GEORGIAN CAPITAL LETTER XAN, GEORGIAN SMALL LETTER XAN +test(0x10BF, 0x2D1F); // GEORGIAN CAPITAL LETTER JHAN, GEORGIAN SMALL LETTER JHAN +test(0x10C0, 0x2D20); // GEORGIAN CAPITAL LETTER HAE, GEORGIAN SMALL LETTER HAE +test(0x10C1, 0x2D21); // GEORGIAN CAPITAL LETTER HE, GEORGIAN SMALL LETTER HE +test(0x10C2, 0x2D22); // GEORGIAN CAPITAL LETTER HIE, GEORGIAN SMALL LETTER HIE +test(0x10C3, 0x2D23); // GEORGIAN CAPITAL LETTER WE, GEORGIAN SMALL LETTER WE +test(0x10C4, 0x2D24); // GEORGIAN CAPITAL LETTER HAR, GEORGIAN SMALL LETTER HAR +test(0x10C5, 0x2D25); // GEORGIAN CAPITAL LETTER HOE, GEORGIAN SMALL LETTER HOE +test(0x10C7, 0x2D27); // GEORGIAN CAPITAL LETTER YN, GEORGIAN SMALL LETTER YN +test(0x10CD, 0x2D2D); // GEORGIAN CAPITAL LETTER AEN, GEORGIAN SMALL LETTER AEN +test(0x10D0, 0x1C90); // GEORGIAN LETTER AN (GEORGIAN SMALL LETTER AN), GEORGIAN MTAVRULI CAPITAL LETTER AN +test(0x10D1, 0x1C91); // GEORGIAN LETTER BAN (GEORGIAN SMALL LETTER BAN), GEORGIAN MTAVRULI CAPITAL LETTER BAN +test(0x10D2, 0x1C92); // GEORGIAN LETTER GAN (GEORGIAN SMALL LETTER GAN), GEORGIAN MTAVRULI CAPITAL LETTER GAN +test(0x10D3, 0x1C93); // GEORGIAN LETTER DON (GEORGIAN SMALL LETTER DON), GEORGIAN MTAVRULI CAPITAL LETTER DON +test(0x10D4, 0x1C94); // GEORGIAN LETTER EN (GEORGIAN SMALL LETTER EN), GEORGIAN MTAVRULI CAPITAL LETTER EN +test(0x10D5, 0x1C95); // GEORGIAN LETTER VIN (GEORGIAN SMALL LETTER VIN), GEORGIAN MTAVRULI CAPITAL LETTER VIN +test(0x10D6, 0x1C96); // GEORGIAN LETTER ZEN (GEORGIAN SMALL LETTER ZEN), GEORGIAN MTAVRULI CAPITAL LETTER ZEN +test(0x10D7, 0x1C97); // GEORGIAN LETTER TAN (GEORGIAN SMALL LETTER TAN), GEORGIAN MTAVRULI CAPITAL LETTER TAN +test(0x10D8, 0x1C98); // GEORGIAN LETTER IN (GEORGIAN SMALL LETTER IN), GEORGIAN MTAVRULI CAPITAL LETTER IN +test(0x10D9, 0x1C99); // GEORGIAN LETTER KAN (GEORGIAN SMALL LETTER KAN), GEORGIAN MTAVRULI CAPITAL LETTER KAN +test(0x10DA, 0x1C9A); // GEORGIAN LETTER LAS (GEORGIAN SMALL LETTER LAS), GEORGIAN MTAVRULI CAPITAL LETTER LAS +test(0x10DB, 0x1C9B); // GEORGIAN LETTER MAN (GEORGIAN SMALL LETTER MAN), GEORGIAN MTAVRULI CAPITAL LETTER MAN +test(0x10DC, 0x1C9C); // GEORGIAN LETTER NAR (GEORGIAN SMALL LETTER NAR), GEORGIAN MTAVRULI CAPITAL LETTER NAR +test(0x10DD, 0x1C9D); // GEORGIAN LETTER ON (GEORGIAN SMALL LETTER ON), GEORGIAN MTAVRULI CAPITAL LETTER ON +test(0x10DE, 0x1C9E); // GEORGIAN LETTER PAR (GEORGIAN SMALL LETTER PAR), GEORGIAN MTAVRULI CAPITAL LETTER PAR +test(0x10DF, 0x1C9F); // GEORGIAN LETTER ZHAR (GEORGIAN SMALL LETTER ZHAR), GEORGIAN MTAVRULI CAPITAL LETTER ZHAR +test(0x10E0, 0x1CA0); // GEORGIAN LETTER RAE (GEORGIAN SMALL LETTER RAE), GEORGIAN MTAVRULI CAPITAL LETTER RAE +test(0x10E1, 0x1CA1); // GEORGIAN LETTER SAN (GEORGIAN SMALL LETTER SAN), GEORGIAN MTAVRULI CAPITAL LETTER SAN +test(0x10E2, 0x1CA2); // GEORGIAN LETTER TAR (GEORGIAN SMALL LETTER TAR), GEORGIAN MTAVRULI CAPITAL LETTER TAR +test(0x10E3, 0x1CA3); // GEORGIAN LETTER UN (GEORGIAN SMALL LETTER UN), GEORGIAN MTAVRULI CAPITAL LETTER UN +test(0x10E4, 0x1CA4); // GEORGIAN LETTER PHAR (GEORGIAN SMALL LETTER PHAR), GEORGIAN MTAVRULI CAPITAL LETTER PHAR +test(0x10E5, 0x1CA5); // GEORGIAN LETTER KHAR (GEORGIAN SMALL LETTER KHAR), GEORGIAN MTAVRULI CAPITAL LETTER KHAR +test(0x10E6, 0x1CA6); // GEORGIAN LETTER GHAN (GEORGIAN SMALL LETTER GHAN), GEORGIAN MTAVRULI CAPITAL LETTER GHAN +test(0x10E7, 0x1CA7); // GEORGIAN LETTER QAR (GEORGIAN SMALL LETTER QAR), GEORGIAN MTAVRULI CAPITAL LETTER QAR +test(0x10E8, 0x1CA8); // GEORGIAN LETTER SHIN (GEORGIAN SMALL LETTER SHIN), GEORGIAN MTAVRULI CAPITAL LETTER SHIN +test(0x10E9, 0x1CA9); // GEORGIAN LETTER CHIN (GEORGIAN SMALL LETTER CHIN), GEORGIAN MTAVRULI CAPITAL LETTER CHIN +test(0x10EA, 0x1CAA); // GEORGIAN LETTER CAN (GEORGIAN SMALL LETTER CAN), GEORGIAN MTAVRULI CAPITAL LETTER CAN +test(0x10EB, 0x1CAB); // GEORGIAN LETTER JIL (GEORGIAN SMALL LETTER JIL), GEORGIAN MTAVRULI CAPITAL LETTER JIL +test(0x10EC, 0x1CAC); // GEORGIAN LETTER CIL (GEORGIAN SMALL LETTER CIL), GEORGIAN MTAVRULI CAPITAL LETTER CIL +test(0x10ED, 0x1CAD); // GEORGIAN LETTER CHAR (GEORGIAN SMALL LETTER CHAR), GEORGIAN MTAVRULI CAPITAL LETTER CHAR +test(0x10EE, 0x1CAE); // GEORGIAN LETTER XAN (GEORGIAN SMALL LETTER XAN), GEORGIAN MTAVRULI CAPITAL LETTER XAN +test(0x10EF, 0x1CAF); // GEORGIAN LETTER JHAN (GEORGIAN SMALL LETTER JHAN), GEORGIAN MTAVRULI CAPITAL LETTER JHAN +test(0x10F0, 0x1CB0); // GEORGIAN LETTER HAE (GEORGIAN SMALL LETTER HAE), GEORGIAN MTAVRULI CAPITAL LETTER HAE +test(0x10F1, 0x1CB1); // GEORGIAN LETTER HE (GEORGIAN SMALL LETTER HE), GEORGIAN MTAVRULI CAPITAL LETTER HE +test(0x10F2, 0x1CB2); // GEORGIAN LETTER HIE (GEORGIAN SMALL LETTER HIE), GEORGIAN MTAVRULI CAPITAL LETTER HIE +test(0x10F3, 0x1CB3); // GEORGIAN LETTER WE (GEORGIAN SMALL LETTER WE), GEORGIAN MTAVRULI CAPITAL LETTER WE +test(0x10F4, 0x1CB4); // GEORGIAN LETTER HAR (GEORGIAN SMALL LETTER HAR), GEORGIAN MTAVRULI CAPITAL LETTER HAR +test(0x10F5, 0x1CB5); // GEORGIAN LETTER HOE (GEORGIAN SMALL LETTER HOE), GEORGIAN MTAVRULI CAPITAL LETTER HOE +test(0x10F6, 0x1CB6); // GEORGIAN LETTER FI (GEORGIAN SMALL LETTER FI), GEORGIAN MTAVRULI CAPITAL LETTER FI +test(0x10F7, 0x1CB7); // GEORGIAN LETTER YN, GEORGIAN MTAVRULI CAPITAL LETTER YN +test(0x10F8, 0x1CB8); // GEORGIAN LETTER ELIFI, GEORGIAN MTAVRULI CAPITAL LETTER ELIFI +test(0x10F9, 0x1CB9); // GEORGIAN LETTER TURNED GAN, GEORGIAN MTAVRULI CAPITAL LETTER TURNED GAN +test(0x10FA, 0x1CBA); // GEORGIAN LETTER AIN, GEORGIAN MTAVRULI CAPITAL LETTER AIN +test(0x10FD, 0x1CBD); // GEORGIAN LETTER AEN, GEORGIAN MTAVRULI CAPITAL LETTER AEN +test(0x10FE, 0x1CBE); // GEORGIAN LETTER HARD SIGN, GEORGIAN MTAVRULI CAPITAL LETTER HARD SIGN +test(0x10FF, 0x1CBF); // GEORGIAN LETTER LABIAL SIGN, GEORGIAN MTAVRULI CAPITAL LETTER LABIAL SIGN +test(0x13A0, 0xAB70); // CHEROKEE LETTER A, CHEROKEE SMALL LETTER A +test(0x13A1, 0xAB71); // CHEROKEE LETTER E, CHEROKEE SMALL LETTER E +test(0x13A2, 0xAB72); // CHEROKEE LETTER I, CHEROKEE SMALL LETTER I +test(0x13A3, 0xAB73); // CHEROKEE LETTER O, CHEROKEE SMALL LETTER O +test(0x13A4, 0xAB74); // CHEROKEE LETTER U, CHEROKEE SMALL LETTER U +test(0x13A5, 0xAB75); // CHEROKEE LETTER V, CHEROKEE SMALL LETTER V +test(0x13A6, 0xAB76); // CHEROKEE LETTER GA, CHEROKEE SMALL LETTER GA +test(0x13A7, 0xAB77); // CHEROKEE LETTER KA, CHEROKEE SMALL LETTER KA +test(0x13A8, 0xAB78); // CHEROKEE LETTER GE, CHEROKEE SMALL LETTER GE +test(0x13A9, 0xAB79); // CHEROKEE LETTER GI, CHEROKEE SMALL LETTER GI +test(0x13AA, 0xAB7A); // CHEROKEE LETTER GO, CHEROKEE SMALL LETTER GO +test(0x13AB, 0xAB7B); // CHEROKEE LETTER GU, CHEROKEE SMALL LETTER GU +test(0x13AC, 0xAB7C); // CHEROKEE LETTER GV, CHEROKEE SMALL LETTER GV +test(0x13AD, 0xAB7D); // CHEROKEE LETTER HA, CHEROKEE SMALL LETTER HA +test(0x13AE, 0xAB7E); // CHEROKEE LETTER HE, CHEROKEE SMALL LETTER HE +test(0x13AF, 0xAB7F); // CHEROKEE LETTER HI, CHEROKEE SMALL LETTER HI +test(0x13B0, 0xAB80); // CHEROKEE LETTER HO, CHEROKEE SMALL LETTER HO +test(0x13B1, 0xAB81); // CHEROKEE LETTER HU, CHEROKEE SMALL LETTER HU +test(0x13B2, 0xAB82); // CHEROKEE LETTER HV, CHEROKEE SMALL LETTER HV +test(0x13B3, 0xAB83); // CHEROKEE LETTER LA, CHEROKEE SMALL LETTER LA +test(0x13B4, 0xAB84); // CHEROKEE LETTER LE, CHEROKEE SMALL LETTER LE +test(0x13B5, 0xAB85); // CHEROKEE LETTER LI, CHEROKEE SMALL LETTER LI +test(0x13B6, 0xAB86); // CHEROKEE LETTER LO, CHEROKEE SMALL LETTER LO +test(0x13B7, 0xAB87); // CHEROKEE LETTER LU, CHEROKEE SMALL LETTER LU +test(0x13B8, 0xAB88); // CHEROKEE LETTER LV, CHEROKEE SMALL LETTER LV +test(0x13B9, 0xAB89); // CHEROKEE LETTER MA, CHEROKEE SMALL LETTER MA +test(0x13BA, 0xAB8A); // CHEROKEE LETTER ME, CHEROKEE SMALL LETTER ME +test(0x13BB, 0xAB8B); // CHEROKEE LETTER MI, CHEROKEE SMALL LETTER MI +test(0x13BC, 0xAB8C); // CHEROKEE LETTER MO, CHEROKEE SMALL LETTER MO +test(0x13BD, 0xAB8D); // CHEROKEE LETTER MU, CHEROKEE SMALL LETTER MU +test(0x13BE, 0xAB8E); // CHEROKEE LETTER NA, CHEROKEE SMALL LETTER NA +test(0x13BF, 0xAB8F); // CHEROKEE LETTER HNA, CHEROKEE SMALL LETTER HNA +test(0x13C0, 0xAB90); // CHEROKEE LETTER NAH, CHEROKEE SMALL LETTER NAH +test(0x13C1, 0xAB91); // CHEROKEE LETTER NE, CHEROKEE SMALL LETTER NE +test(0x13C2, 0xAB92); // CHEROKEE LETTER NI, CHEROKEE SMALL LETTER NI +test(0x13C3, 0xAB93); // CHEROKEE LETTER NO, CHEROKEE SMALL LETTER NO +test(0x13C4, 0xAB94); // CHEROKEE LETTER NU, CHEROKEE SMALL LETTER NU +test(0x13C5, 0xAB95); // CHEROKEE LETTER NV, CHEROKEE SMALL LETTER NV +test(0x13C6, 0xAB96); // CHEROKEE LETTER QUA, CHEROKEE SMALL LETTER QUA +test(0x13C7, 0xAB97); // CHEROKEE LETTER QUE, CHEROKEE SMALL LETTER QUE +test(0x13C8, 0xAB98); // CHEROKEE LETTER QUI, CHEROKEE SMALL LETTER QUI +test(0x13C9, 0xAB99); // CHEROKEE LETTER QUO, CHEROKEE SMALL LETTER QUO +test(0x13CA, 0xAB9A); // CHEROKEE LETTER QUU, CHEROKEE SMALL LETTER QUU +test(0x13CB, 0xAB9B); // CHEROKEE LETTER QUV, CHEROKEE SMALL LETTER QUV +test(0x13CC, 0xAB9C); // CHEROKEE LETTER SA, CHEROKEE SMALL LETTER SA +test(0x13CD, 0xAB9D); // CHEROKEE LETTER S, CHEROKEE SMALL LETTER S +test(0x13CE, 0xAB9E); // CHEROKEE LETTER SE, CHEROKEE SMALL LETTER SE +test(0x13CF, 0xAB9F); // CHEROKEE LETTER SI, CHEROKEE SMALL LETTER SI +test(0x13D0, 0xABA0); // CHEROKEE LETTER SO, CHEROKEE SMALL LETTER SO +test(0x13D1, 0xABA1); // CHEROKEE LETTER SU, CHEROKEE SMALL LETTER SU +test(0x13D2, 0xABA2); // CHEROKEE LETTER SV, CHEROKEE SMALL LETTER SV +test(0x13D3, 0xABA3); // CHEROKEE LETTER DA, CHEROKEE SMALL LETTER DA +test(0x13D4, 0xABA4); // CHEROKEE LETTER TA, CHEROKEE SMALL LETTER TA +test(0x13D5, 0xABA5); // CHEROKEE LETTER DE, CHEROKEE SMALL LETTER DE +test(0x13D6, 0xABA6); // CHEROKEE LETTER TE, CHEROKEE SMALL LETTER TE +test(0x13D7, 0xABA7); // CHEROKEE LETTER DI, CHEROKEE SMALL LETTER DI +test(0x13D8, 0xABA8); // CHEROKEE LETTER TI, CHEROKEE SMALL LETTER TI +test(0x13D9, 0xABA9); // CHEROKEE LETTER DO, CHEROKEE SMALL LETTER DO +test(0x13DA, 0xABAA); // CHEROKEE LETTER DU, CHEROKEE SMALL LETTER DU +test(0x13DB, 0xABAB); // CHEROKEE LETTER DV, CHEROKEE SMALL LETTER DV +test(0x13DC, 0xABAC); // CHEROKEE LETTER DLA, CHEROKEE SMALL LETTER DLA +test(0x13DD, 0xABAD); // CHEROKEE LETTER TLA, CHEROKEE SMALL LETTER TLA +test(0x13DE, 0xABAE); // CHEROKEE LETTER TLE, CHEROKEE SMALL LETTER TLE +test(0x13DF, 0xABAF); // CHEROKEE LETTER TLI, CHEROKEE SMALL LETTER TLI +test(0x13E0, 0xABB0); // CHEROKEE LETTER TLO, CHEROKEE SMALL LETTER TLO +test(0x13E1, 0xABB1); // CHEROKEE LETTER TLU, CHEROKEE SMALL LETTER TLU +test(0x13E2, 0xABB2); // CHEROKEE LETTER TLV, CHEROKEE SMALL LETTER TLV +test(0x13E3, 0xABB3); // CHEROKEE LETTER TSA, CHEROKEE SMALL LETTER TSA +test(0x13E4, 0xABB4); // CHEROKEE LETTER TSE, CHEROKEE SMALL LETTER TSE +test(0x13E5, 0xABB5); // CHEROKEE LETTER TSI, CHEROKEE SMALL LETTER TSI +test(0x13E6, 0xABB6); // CHEROKEE LETTER TSO, CHEROKEE SMALL LETTER TSO +test(0x13E7, 0xABB7); // CHEROKEE LETTER TSU, CHEROKEE SMALL LETTER TSU +test(0x13E8, 0xABB8); // CHEROKEE LETTER TSV, CHEROKEE SMALL LETTER TSV +test(0x13E9, 0xABB9); // CHEROKEE LETTER WA, CHEROKEE SMALL LETTER WA +test(0x13EA, 0xABBA); // CHEROKEE LETTER WE, CHEROKEE SMALL LETTER WE +test(0x13EB, 0xABBB); // CHEROKEE LETTER WI, CHEROKEE SMALL LETTER WI +test(0x13EC, 0xABBC); // CHEROKEE LETTER WO, CHEROKEE SMALL LETTER WO +test(0x13ED, 0xABBD); // CHEROKEE LETTER WU, CHEROKEE SMALL LETTER WU +test(0x13EE, 0xABBE); // CHEROKEE LETTER WV, CHEROKEE SMALL LETTER WV +test(0x13EF, 0xABBF); // CHEROKEE LETTER YA, CHEROKEE SMALL LETTER YA +test(0x13F0, 0x13F8); // CHEROKEE LETTER YE, CHEROKEE SMALL LETTER YE +test(0x13F1, 0x13F9); // CHEROKEE LETTER YI, CHEROKEE SMALL LETTER YI +test(0x13F2, 0x13FA); // CHEROKEE LETTER YO, CHEROKEE SMALL LETTER YO +test(0x13F3, 0x13FB); // CHEROKEE LETTER YU, CHEROKEE SMALL LETTER YU +test(0x13F4, 0x13FC); // CHEROKEE LETTER YV, CHEROKEE SMALL LETTER YV +test(0x13F5, 0x13FD); // CHEROKEE LETTER MV, CHEROKEE SMALL LETTER MV +test(0x13F8, 0x13F0); // CHEROKEE SMALL LETTER YE, CHEROKEE LETTER YE +test(0x13F9, 0x13F1); // CHEROKEE SMALL LETTER YI, CHEROKEE LETTER YI +test(0x13FA, 0x13F2); // CHEROKEE SMALL LETTER YO, CHEROKEE LETTER YO +test(0x13FB, 0x13F3); // CHEROKEE SMALL LETTER YU, CHEROKEE LETTER YU +test(0x13FC, 0x13F4); // CHEROKEE SMALL LETTER YV, CHEROKEE LETTER YV +test(0x13FD, 0x13F5); // CHEROKEE SMALL LETTER MV, CHEROKEE LETTER MV +test(0x1C80, 0x0432, 0x0412); // CYRILLIC SMALL LETTER ROUNDED VE, CYRILLIC SMALL LETTER VE, CYRILLIC CAPITAL LETTER VE +test(0x1C81, 0x0434, 0x0414); // CYRILLIC SMALL LETTER LONG-LEGGED DE, CYRILLIC SMALL LETTER DE, CYRILLIC CAPITAL LETTER DE +test(0x1C82, 0x043E, 0x041E); // CYRILLIC SMALL LETTER NARROW O, CYRILLIC SMALL LETTER O, CYRILLIC CAPITAL LETTER O +test(0x1C83, 0x0441, 0x0421); // CYRILLIC SMALL LETTER WIDE ES, CYRILLIC SMALL LETTER ES, CYRILLIC CAPITAL LETTER ES +test(0x1C84, 0x0442, 0x0422, 0x1C85); // CYRILLIC SMALL LETTER TALL TE, CYRILLIC SMALL LETTER TE, CYRILLIC CAPITAL LETTER TE, CYRILLIC SMALL LETTER THREE-LEGGED TE +test(0x1C85, 0x0442, 0x0422, 0x1C84); // CYRILLIC SMALL LETTER THREE-LEGGED TE, CYRILLIC SMALL LETTER TE, CYRILLIC CAPITAL LETTER TE, CYRILLIC SMALL LETTER TALL TE +test(0x1C86, 0x044A, 0x042A); // CYRILLIC SMALL LETTER TALL HARD SIGN, CYRILLIC SMALL LETTER HARD SIGN, CYRILLIC CAPITAL LETTER HARD SIGN +test(0x1C87, 0x0463, 0x0462); // CYRILLIC SMALL LETTER TALL YAT, CYRILLIC SMALL LETTER YAT, CYRILLIC CAPITAL LETTER YAT +test(0x1C88, 0xA64B, 0xA64A); // CYRILLIC SMALL LETTER UNBLENDED UK, CYRILLIC SMALL LETTER MONOGRAPH UK, CYRILLIC CAPITAL LETTER MONOGRAPH UK +test(0x1C90, 0x10D0); // GEORGIAN MTAVRULI CAPITAL LETTER AN, GEORGIAN LETTER AN (GEORGIAN SMALL LETTER AN) +test(0x1C91, 0x10D1); // GEORGIAN MTAVRULI CAPITAL LETTER BAN, GEORGIAN LETTER BAN (GEORGIAN SMALL LETTER BAN) +test(0x1C92, 0x10D2); // GEORGIAN MTAVRULI CAPITAL LETTER GAN, GEORGIAN LETTER GAN (GEORGIAN SMALL LETTER GAN) +test(0x1C93, 0x10D3); // GEORGIAN MTAVRULI CAPITAL LETTER DON, GEORGIAN LETTER DON (GEORGIAN SMALL LETTER DON) +test(0x1C94, 0x10D4); // GEORGIAN MTAVRULI CAPITAL LETTER EN, GEORGIAN LETTER EN (GEORGIAN SMALL LETTER EN) +test(0x1C95, 0x10D5); // GEORGIAN MTAVRULI CAPITAL LETTER VIN, GEORGIAN LETTER VIN (GEORGIAN SMALL LETTER VIN) +test(0x1C96, 0x10D6); // GEORGIAN MTAVRULI CAPITAL LETTER ZEN, GEORGIAN LETTER ZEN (GEORGIAN SMALL LETTER ZEN) +test(0x1C97, 0x10D7); // GEORGIAN MTAVRULI CAPITAL LETTER TAN, GEORGIAN LETTER TAN (GEORGIAN SMALL LETTER TAN) +test(0x1C98, 0x10D8); // GEORGIAN MTAVRULI CAPITAL LETTER IN, GEORGIAN LETTER IN (GEORGIAN SMALL LETTER IN) +test(0x1C99, 0x10D9); // GEORGIAN MTAVRULI CAPITAL LETTER KAN, GEORGIAN LETTER KAN (GEORGIAN SMALL LETTER KAN) +test(0x1C9A, 0x10DA); // GEORGIAN MTAVRULI CAPITAL LETTER LAS, GEORGIAN LETTER LAS (GEORGIAN SMALL LETTER LAS) +test(0x1C9B, 0x10DB); // GEORGIAN MTAVRULI CAPITAL LETTER MAN, GEORGIAN LETTER MAN (GEORGIAN SMALL LETTER MAN) +test(0x1C9C, 0x10DC); // GEORGIAN MTAVRULI CAPITAL LETTER NAR, GEORGIAN LETTER NAR (GEORGIAN SMALL LETTER NAR) +test(0x1C9D, 0x10DD); // GEORGIAN MTAVRULI CAPITAL LETTER ON, GEORGIAN LETTER ON (GEORGIAN SMALL LETTER ON) +test(0x1C9E, 0x10DE); // GEORGIAN MTAVRULI CAPITAL LETTER PAR, GEORGIAN LETTER PAR (GEORGIAN SMALL LETTER PAR) +test(0x1C9F, 0x10DF); // GEORGIAN MTAVRULI CAPITAL LETTER ZHAR, GEORGIAN LETTER ZHAR (GEORGIAN SMALL LETTER ZHAR) +test(0x1CA0, 0x10E0); // GEORGIAN MTAVRULI CAPITAL LETTER RAE, GEORGIAN LETTER RAE (GEORGIAN SMALL LETTER RAE) +test(0x1CA1, 0x10E1); // GEORGIAN MTAVRULI CAPITAL LETTER SAN, GEORGIAN LETTER SAN (GEORGIAN SMALL LETTER SAN) +test(0x1CA2, 0x10E2); // GEORGIAN MTAVRULI CAPITAL LETTER TAR, GEORGIAN LETTER TAR (GEORGIAN SMALL LETTER TAR) +test(0x1CA3, 0x10E3); // GEORGIAN MTAVRULI CAPITAL LETTER UN, GEORGIAN LETTER UN (GEORGIAN SMALL LETTER UN) +test(0x1CA4, 0x10E4); // GEORGIAN MTAVRULI CAPITAL LETTER PHAR, GEORGIAN LETTER PHAR (GEORGIAN SMALL LETTER PHAR) +test(0x1CA5, 0x10E5); // GEORGIAN MTAVRULI CAPITAL LETTER KHAR, GEORGIAN LETTER KHAR (GEORGIAN SMALL LETTER KHAR) +test(0x1CA6, 0x10E6); // GEORGIAN MTAVRULI CAPITAL LETTER GHAN, GEORGIAN LETTER GHAN (GEORGIAN SMALL LETTER GHAN) +test(0x1CA7, 0x10E7); // GEORGIAN MTAVRULI CAPITAL LETTER QAR, GEORGIAN LETTER QAR (GEORGIAN SMALL LETTER QAR) +test(0x1CA8, 0x10E8); // GEORGIAN MTAVRULI CAPITAL LETTER SHIN, GEORGIAN LETTER SHIN (GEORGIAN SMALL LETTER SHIN) +test(0x1CA9, 0x10E9); // GEORGIAN MTAVRULI CAPITAL LETTER CHIN, GEORGIAN LETTER CHIN (GEORGIAN SMALL LETTER CHIN) +test(0x1CAA, 0x10EA); // GEORGIAN MTAVRULI CAPITAL LETTER CAN, GEORGIAN LETTER CAN (GEORGIAN SMALL LETTER CAN) +test(0x1CAB, 0x10EB); // GEORGIAN MTAVRULI CAPITAL LETTER JIL, GEORGIAN LETTER JIL (GEORGIAN SMALL LETTER JIL) +test(0x1CAC, 0x10EC); // GEORGIAN MTAVRULI CAPITAL LETTER CIL, GEORGIAN LETTER CIL (GEORGIAN SMALL LETTER CIL) +test(0x1CAD, 0x10ED); // GEORGIAN MTAVRULI CAPITAL LETTER CHAR, GEORGIAN LETTER CHAR (GEORGIAN SMALL LETTER CHAR) +test(0x1CAE, 0x10EE); // GEORGIAN MTAVRULI CAPITAL LETTER XAN, GEORGIAN LETTER XAN (GEORGIAN SMALL LETTER XAN) +test(0x1CAF, 0x10EF); // GEORGIAN MTAVRULI CAPITAL LETTER JHAN, GEORGIAN LETTER JHAN (GEORGIAN SMALL LETTER JHAN) +test(0x1CB0, 0x10F0); // GEORGIAN MTAVRULI CAPITAL LETTER HAE, GEORGIAN LETTER HAE (GEORGIAN SMALL LETTER HAE) +test(0x1CB1, 0x10F1); // GEORGIAN MTAVRULI CAPITAL LETTER HE, GEORGIAN LETTER HE (GEORGIAN SMALL LETTER HE) +test(0x1CB2, 0x10F2); // GEORGIAN MTAVRULI CAPITAL LETTER HIE, GEORGIAN LETTER HIE (GEORGIAN SMALL LETTER HIE) +test(0x1CB3, 0x10F3); // GEORGIAN MTAVRULI CAPITAL LETTER WE, GEORGIAN LETTER WE (GEORGIAN SMALL LETTER WE) +test(0x1CB4, 0x10F4); // GEORGIAN MTAVRULI CAPITAL LETTER HAR, GEORGIAN LETTER HAR (GEORGIAN SMALL LETTER HAR) +test(0x1CB5, 0x10F5); // GEORGIAN MTAVRULI CAPITAL LETTER HOE, GEORGIAN LETTER HOE (GEORGIAN SMALL LETTER HOE) +test(0x1CB6, 0x10F6); // GEORGIAN MTAVRULI CAPITAL LETTER FI, GEORGIAN LETTER FI (GEORGIAN SMALL LETTER FI) +test(0x1CB7, 0x10F7); // GEORGIAN MTAVRULI CAPITAL LETTER YN, GEORGIAN LETTER YN +test(0x1CB8, 0x10F8); // GEORGIAN MTAVRULI CAPITAL LETTER ELIFI, GEORGIAN LETTER ELIFI +test(0x1CB9, 0x10F9); // GEORGIAN MTAVRULI CAPITAL LETTER TURNED GAN, GEORGIAN LETTER TURNED GAN +test(0x1CBA, 0x10FA); // GEORGIAN MTAVRULI CAPITAL LETTER AIN, GEORGIAN LETTER AIN +test(0x1CBD, 0x10FD); // GEORGIAN MTAVRULI CAPITAL LETTER AEN, GEORGIAN LETTER AEN +test(0x1CBE, 0x10FE); // GEORGIAN MTAVRULI CAPITAL LETTER HARD SIGN, GEORGIAN LETTER HARD SIGN +test(0x1CBF, 0x10FF); // GEORGIAN MTAVRULI CAPITAL LETTER LABIAL SIGN, GEORGIAN LETTER LABIAL SIGN +test(0x1D79, 0xA77D); // LATIN SMALL LETTER INSULAR G, LATIN CAPITAL LETTER INSULAR G +test(0x1D7D, 0x2C63); // LATIN SMALL LETTER P WITH STROKE, LATIN CAPITAL LETTER P WITH STROKE +test(0x1D8E, 0xA7C6); // LATIN SMALL LETTER Z WITH PALATAL HOOK, LATIN CAPITAL LETTER Z WITH PALATAL HOOK +test(0x1E00, 0x1E01); // LATIN CAPITAL LETTER A WITH RING BELOW, LATIN SMALL LETTER A WITH RING BELOW +test(0x1E01, 0x1E00); // LATIN SMALL LETTER A WITH RING BELOW, LATIN CAPITAL LETTER A WITH RING BELOW +test(0x1E02, 0x1E03); // LATIN CAPITAL LETTER B WITH DOT ABOVE, LATIN SMALL LETTER B WITH DOT ABOVE +test(0x1E03, 0x1E02); // LATIN SMALL LETTER B WITH DOT ABOVE, LATIN CAPITAL LETTER B WITH DOT ABOVE +test(0x1E04, 0x1E05); // LATIN CAPITAL LETTER B WITH DOT BELOW, LATIN SMALL LETTER B WITH DOT BELOW +test(0x1E05, 0x1E04); // LATIN SMALL LETTER B WITH DOT BELOW, LATIN CAPITAL LETTER B WITH DOT BELOW +test(0x1E06, 0x1E07); // LATIN CAPITAL LETTER B WITH LINE BELOW, LATIN SMALL LETTER B WITH LINE BELOW +test(0x1E07, 0x1E06); // LATIN SMALL LETTER B WITH LINE BELOW, LATIN CAPITAL LETTER B WITH LINE BELOW +test(0x1E08, 0x1E09); // LATIN CAPITAL LETTER C WITH CEDILLA AND ACUTE, LATIN SMALL LETTER C WITH CEDILLA AND ACUTE +test(0x1E09, 0x1E08); // LATIN SMALL LETTER C WITH CEDILLA AND ACUTE, LATIN CAPITAL LETTER C WITH CEDILLA AND ACUTE +test(0x1E0A, 0x1E0B); // LATIN CAPITAL LETTER D WITH DOT ABOVE, LATIN SMALL LETTER D WITH DOT ABOVE +test(0x1E0B, 0x1E0A); // LATIN SMALL LETTER D WITH DOT ABOVE, LATIN CAPITAL LETTER D WITH DOT ABOVE +test(0x1E0C, 0x1E0D); // LATIN CAPITAL LETTER D WITH DOT BELOW, LATIN SMALL LETTER D WITH DOT BELOW +test(0x1E0D, 0x1E0C); // LATIN SMALL LETTER D WITH DOT BELOW, LATIN CAPITAL LETTER D WITH DOT BELOW +test(0x1E0E, 0x1E0F); // LATIN CAPITAL LETTER D WITH LINE BELOW, LATIN SMALL LETTER D WITH LINE BELOW +test(0x1E0F, 0x1E0E); // LATIN SMALL LETTER D WITH LINE BELOW, LATIN CAPITAL LETTER D WITH LINE BELOW +test(0x1E10, 0x1E11); // LATIN CAPITAL LETTER D WITH CEDILLA, LATIN SMALL LETTER D WITH CEDILLA +test(0x1E11, 0x1E10); // LATIN SMALL LETTER D WITH CEDILLA, LATIN CAPITAL LETTER D WITH CEDILLA +test(0x1E12, 0x1E13); // LATIN CAPITAL LETTER D WITH CIRCUMFLEX BELOW, LATIN SMALL LETTER D WITH CIRCUMFLEX BELOW +test(0x1E13, 0x1E12); // LATIN SMALL LETTER D WITH CIRCUMFLEX BELOW, LATIN CAPITAL LETTER D WITH CIRCUMFLEX BELOW +test(0x1E14, 0x1E15); // LATIN CAPITAL LETTER E WITH MACRON AND GRAVE, LATIN SMALL LETTER E WITH MACRON AND GRAVE +test(0x1E15, 0x1E14); // LATIN SMALL LETTER E WITH MACRON AND GRAVE, LATIN CAPITAL LETTER E WITH MACRON AND GRAVE +test(0x1E16, 0x1E17); // LATIN CAPITAL LETTER E WITH MACRON AND ACUTE, LATIN SMALL LETTER E WITH MACRON AND ACUTE +test(0x1E17, 0x1E16); // LATIN SMALL LETTER E WITH MACRON AND ACUTE, LATIN CAPITAL LETTER E WITH MACRON AND ACUTE +test(0x1E18, 0x1E19); // LATIN CAPITAL LETTER E WITH CIRCUMFLEX BELOW, LATIN SMALL LETTER E WITH CIRCUMFLEX BELOW +test(0x1E19, 0x1E18); // LATIN SMALL LETTER E WITH CIRCUMFLEX BELOW, LATIN CAPITAL LETTER E WITH CIRCUMFLEX BELOW +test(0x1E1A, 0x1E1B); // LATIN CAPITAL LETTER E WITH TILDE BELOW, LATIN SMALL LETTER E WITH TILDE BELOW +test(0x1E1B, 0x1E1A); // LATIN SMALL LETTER E WITH TILDE BELOW, LATIN CAPITAL LETTER E WITH TILDE BELOW +test(0x1E1C, 0x1E1D); // LATIN CAPITAL LETTER E WITH CEDILLA AND BREVE, LATIN SMALL LETTER E WITH CEDILLA AND BREVE +test(0x1E1D, 0x1E1C); // LATIN SMALL LETTER E WITH CEDILLA AND BREVE, LATIN CAPITAL LETTER E WITH CEDILLA AND BREVE +test(0x1E1E, 0x1E1F); // LATIN CAPITAL LETTER F WITH DOT ABOVE, LATIN SMALL LETTER F WITH DOT ABOVE +test(0x1E1F, 0x1E1E); // LATIN SMALL LETTER F WITH DOT ABOVE, LATIN CAPITAL LETTER F WITH DOT ABOVE +test(0x1E20, 0x1E21); // LATIN CAPITAL LETTER G WITH MACRON, LATIN SMALL LETTER G WITH MACRON +test(0x1E21, 0x1E20); // LATIN SMALL LETTER G WITH MACRON, LATIN CAPITAL LETTER G WITH MACRON +test(0x1E22, 0x1E23); // LATIN CAPITAL LETTER H WITH DOT ABOVE, LATIN SMALL LETTER H WITH DOT ABOVE +test(0x1E23, 0x1E22); // LATIN SMALL LETTER H WITH DOT ABOVE, LATIN CAPITAL LETTER H WITH DOT ABOVE +test(0x1E24, 0x1E25); // LATIN CAPITAL LETTER H WITH DOT BELOW, LATIN SMALL LETTER H WITH DOT BELOW +test(0x1E25, 0x1E24); // LATIN SMALL LETTER H WITH DOT BELOW, LATIN CAPITAL LETTER H WITH DOT BELOW +test(0x1E26, 0x1E27); // LATIN CAPITAL LETTER H WITH DIAERESIS, LATIN SMALL LETTER H WITH DIAERESIS +test(0x1E27, 0x1E26); // LATIN SMALL LETTER H WITH DIAERESIS, LATIN CAPITAL LETTER H WITH DIAERESIS +test(0x1E28, 0x1E29); // LATIN CAPITAL LETTER H WITH CEDILLA, LATIN SMALL LETTER H WITH CEDILLA +test(0x1E29, 0x1E28); // LATIN SMALL LETTER H WITH CEDILLA, LATIN CAPITAL LETTER H WITH CEDILLA +test(0x1E2A, 0x1E2B); // LATIN CAPITAL LETTER H WITH BREVE BELOW, LATIN SMALL LETTER H WITH BREVE BELOW +test(0x1E2B, 0x1E2A); // LATIN SMALL LETTER H WITH BREVE BELOW, LATIN CAPITAL LETTER H WITH BREVE BELOW +test(0x1E2C, 0x1E2D); // LATIN CAPITAL LETTER I WITH TILDE BELOW, LATIN SMALL LETTER I WITH TILDE BELOW +test(0x1E2D, 0x1E2C); // LATIN SMALL LETTER I WITH TILDE BELOW, LATIN CAPITAL LETTER I WITH TILDE BELOW +test(0x1E2E, 0x1E2F); // LATIN CAPITAL LETTER I WITH DIAERESIS AND ACUTE, LATIN SMALL LETTER I WITH DIAERESIS AND ACUTE +test(0x1E2F, 0x1E2E); // LATIN SMALL LETTER I WITH DIAERESIS AND ACUTE, LATIN CAPITAL LETTER I WITH DIAERESIS AND ACUTE +test(0x1E30, 0x1E31); // LATIN CAPITAL LETTER K WITH ACUTE, LATIN SMALL LETTER K WITH ACUTE +test(0x1E31, 0x1E30); // LATIN SMALL LETTER K WITH ACUTE, LATIN CAPITAL LETTER K WITH ACUTE +test(0x1E32, 0x1E33); // LATIN CAPITAL LETTER K WITH DOT BELOW, LATIN SMALL LETTER K WITH DOT BELOW +test(0x1E33, 0x1E32); // LATIN SMALL LETTER K WITH DOT BELOW, LATIN CAPITAL LETTER K WITH DOT BELOW +test(0x1E34, 0x1E35); // LATIN CAPITAL LETTER K WITH LINE BELOW, LATIN SMALL LETTER K WITH LINE BELOW +test(0x1E35, 0x1E34); // LATIN SMALL LETTER K WITH LINE BELOW, LATIN CAPITAL LETTER K WITH LINE BELOW +test(0x1E36, 0x1E37); // LATIN CAPITAL LETTER L WITH DOT BELOW, LATIN SMALL LETTER L WITH DOT BELOW +test(0x1E37, 0x1E36); // LATIN SMALL LETTER L WITH DOT BELOW, LATIN CAPITAL LETTER L WITH DOT BELOW +test(0x1E38, 0x1E39); // LATIN CAPITAL LETTER L WITH DOT BELOW AND MACRON, LATIN SMALL LETTER L WITH DOT BELOW AND MACRON +test(0x1E39, 0x1E38); // LATIN SMALL LETTER L WITH DOT BELOW AND MACRON, LATIN CAPITAL LETTER L WITH DOT BELOW AND MACRON +test(0x1E3A, 0x1E3B); // LATIN CAPITAL LETTER L WITH LINE BELOW, LATIN SMALL LETTER L WITH LINE BELOW +test(0x1E3B, 0x1E3A); // LATIN SMALL LETTER L WITH LINE BELOW, LATIN CAPITAL LETTER L WITH LINE BELOW +test(0x1E3C, 0x1E3D); // LATIN CAPITAL LETTER L WITH CIRCUMFLEX BELOW, LATIN SMALL LETTER L WITH CIRCUMFLEX BELOW +test(0x1E3D, 0x1E3C); // LATIN SMALL LETTER L WITH CIRCUMFLEX BELOW, LATIN CAPITAL LETTER L WITH CIRCUMFLEX BELOW +test(0x1E3E, 0x1E3F); // LATIN CAPITAL LETTER M WITH ACUTE, LATIN SMALL LETTER M WITH ACUTE +test(0x1E3F, 0x1E3E); // LATIN SMALL LETTER M WITH ACUTE, LATIN CAPITAL LETTER M WITH ACUTE +test(0x1E40, 0x1E41); // LATIN CAPITAL LETTER M WITH DOT ABOVE, LATIN SMALL LETTER M WITH DOT ABOVE +test(0x1E41, 0x1E40); // LATIN SMALL LETTER M WITH DOT ABOVE, LATIN CAPITAL LETTER M WITH DOT ABOVE +test(0x1E42, 0x1E43); // LATIN CAPITAL LETTER M WITH DOT BELOW, LATIN SMALL LETTER M WITH DOT BELOW +test(0x1E43, 0x1E42); // LATIN SMALL LETTER M WITH DOT BELOW, LATIN CAPITAL LETTER M WITH DOT BELOW +test(0x1E44, 0x1E45); // LATIN CAPITAL LETTER N WITH DOT ABOVE, LATIN SMALL LETTER N WITH DOT ABOVE +test(0x1E45, 0x1E44); // LATIN SMALL LETTER N WITH DOT ABOVE, LATIN CAPITAL LETTER N WITH DOT ABOVE +test(0x1E46, 0x1E47); // LATIN CAPITAL LETTER N WITH DOT BELOW, LATIN SMALL LETTER N WITH DOT BELOW +test(0x1E47, 0x1E46); // LATIN SMALL LETTER N WITH DOT BELOW, LATIN CAPITAL LETTER N WITH DOT BELOW +test(0x1E48, 0x1E49); // LATIN CAPITAL LETTER N WITH LINE BELOW, LATIN SMALL LETTER N WITH LINE BELOW +test(0x1E49, 0x1E48); // LATIN SMALL LETTER N WITH LINE BELOW, LATIN CAPITAL LETTER N WITH LINE BELOW +test(0x1E4A, 0x1E4B); // LATIN CAPITAL LETTER N WITH CIRCUMFLEX BELOW, LATIN SMALL LETTER N WITH CIRCUMFLEX BELOW +test(0x1E4B, 0x1E4A); // LATIN SMALL LETTER N WITH CIRCUMFLEX BELOW, LATIN CAPITAL LETTER N WITH CIRCUMFLEX BELOW +test(0x1E4C, 0x1E4D); // LATIN CAPITAL LETTER O WITH TILDE AND ACUTE, LATIN SMALL LETTER O WITH TILDE AND ACUTE +test(0x1E4D, 0x1E4C); // LATIN SMALL LETTER O WITH TILDE AND ACUTE, LATIN CAPITAL LETTER O WITH TILDE AND ACUTE +test(0x1E4E, 0x1E4F); // LATIN CAPITAL LETTER O WITH TILDE AND DIAERESIS, LATIN SMALL LETTER O WITH TILDE AND DIAERESIS +test(0x1E4F, 0x1E4E); // LATIN SMALL LETTER O WITH TILDE AND DIAERESIS, LATIN CAPITAL LETTER O WITH TILDE AND DIAERESIS +test(0x1E50, 0x1E51); // LATIN CAPITAL LETTER O WITH MACRON AND GRAVE, LATIN SMALL LETTER O WITH MACRON AND GRAVE +test(0x1E51, 0x1E50); // LATIN SMALL LETTER O WITH MACRON AND GRAVE, LATIN CAPITAL LETTER O WITH MACRON AND GRAVE +test(0x1E52, 0x1E53); // LATIN CAPITAL LETTER O WITH MACRON AND ACUTE, LATIN SMALL LETTER O WITH MACRON AND ACUTE +test(0x1E53, 0x1E52); // LATIN SMALL LETTER O WITH MACRON AND ACUTE, LATIN CAPITAL LETTER O WITH MACRON AND ACUTE +test(0x1E54, 0x1E55); // LATIN CAPITAL LETTER P WITH ACUTE, LATIN SMALL LETTER P WITH ACUTE +test(0x1E55, 0x1E54); // LATIN SMALL LETTER P WITH ACUTE, LATIN CAPITAL LETTER P WITH ACUTE +test(0x1E56, 0x1E57); // LATIN CAPITAL LETTER P WITH DOT ABOVE, LATIN SMALL LETTER P WITH DOT ABOVE +test(0x1E57, 0x1E56); // LATIN SMALL LETTER P WITH DOT ABOVE, LATIN CAPITAL LETTER P WITH DOT ABOVE +test(0x1E58, 0x1E59); // LATIN CAPITAL LETTER R WITH DOT ABOVE, LATIN SMALL LETTER R WITH DOT ABOVE +test(0x1E59, 0x1E58); // LATIN SMALL LETTER R WITH DOT ABOVE, LATIN CAPITAL LETTER R WITH DOT ABOVE +test(0x1E5A, 0x1E5B); // LATIN CAPITAL LETTER R WITH DOT BELOW, LATIN SMALL LETTER R WITH DOT BELOW +test(0x1E5B, 0x1E5A); // LATIN SMALL LETTER R WITH DOT BELOW, LATIN CAPITAL LETTER R WITH DOT BELOW +test(0x1E5C, 0x1E5D); // LATIN CAPITAL LETTER R WITH DOT BELOW AND MACRON, LATIN SMALL LETTER R WITH DOT BELOW AND MACRON +test(0x1E5D, 0x1E5C); // LATIN SMALL LETTER R WITH DOT BELOW AND MACRON, LATIN CAPITAL LETTER R WITH DOT BELOW AND MACRON +test(0x1E5E, 0x1E5F); // LATIN CAPITAL LETTER R WITH LINE BELOW, LATIN SMALL LETTER R WITH LINE BELOW +test(0x1E5F, 0x1E5E); // LATIN SMALL LETTER R WITH LINE BELOW, LATIN CAPITAL LETTER R WITH LINE BELOW +test(0x1E60, 0x1E61, 0x1E9B); // LATIN CAPITAL LETTER S WITH DOT ABOVE, LATIN SMALL LETTER S WITH DOT ABOVE, LATIN SMALL LETTER LONG S WITH DOT ABOVE +test(0x1E61, 0x1E60, 0x1E9B); // LATIN SMALL LETTER S WITH DOT ABOVE, LATIN CAPITAL LETTER S WITH DOT ABOVE, LATIN SMALL LETTER LONG S WITH DOT ABOVE +test(0x1E62, 0x1E63); // LATIN CAPITAL LETTER S WITH DOT BELOW, LATIN SMALL LETTER S WITH DOT BELOW +test(0x1E63, 0x1E62); // LATIN SMALL LETTER S WITH DOT BELOW, LATIN CAPITAL LETTER S WITH DOT BELOW +test(0x1E64, 0x1E65); // LATIN CAPITAL LETTER S WITH ACUTE AND DOT ABOVE, LATIN SMALL LETTER S WITH ACUTE AND DOT ABOVE +test(0x1E65, 0x1E64); // LATIN SMALL LETTER S WITH ACUTE AND DOT ABOVE, LATIN CAPITAL LETTER S WITH ACUTE AND DOT ABOVE +test(0x1E66, 0x1E67); // LATIN CAPITAL LETTER S WITH CARON AND DOT ABOVE, LATIN SMALL LETTER S WITH CARON AND DOT ABOVE +test(0x1E67, 0x1E66); // LATIN SMALL LETTER S WITH CARON AND DOT ABOVE, LATIN CAPITAL LETTER S WITH CARON AND DOT ABOVE +test(0x1E68, 0x1E69); // LATIN CAPITAL LETTER S WITH DOT BELOW AND DOT ABOVE, LATIN SMALL LETTER S WITH DOT BELOW AND DOT ABOVE +test(0x1E69, 0x1E68); // LATIN SMALL LETTER S WITH DOT BELOW AND DOT ABOVE, LATIN CAPITAL LETTER S WITH DOT BELOW AND DOT ABOVE +test(0x1E6A, 0x1E6B); // LATIN CAPITAL LETTER T WITH DOT ABOVE, LATIN SMALL LETTER T WITH DOT ABOVE +test(0x1E6B, 0x1E6A); // LATIN SMALL LETTER T WITH DOT ABOVE, LATIN CAPITAL LETTER T WITH DOT ABOVE +test(0x1E6C, 0x1E6D); // LATIN CAPITAL LETTER T WITH DOT BELOW, LATIN SMALL LETTER T WITH DOT BELOW +test(0x1E6D, 0x1E6C); // LATIN SMALL LETTER T WITH DOT BELOW, LATIN CAPITAL LETTER T WITH DOT BELOW +test(0x1E6E, 0x1E6F); // LATIN CAPITAL LETTER T WITH LINE BELOW, LATIN SMALL LETTER T WITH LINE BELOW +test(0x1E6F, 0x1E6E); // LATIN SMALL LETTER T WITH LINE BELOW, LATIN CAPITAL LETTER T WITH LINE BELOW +test(0x1E70, 0x1E71); // LATIN CAPITAL LETTER T WITH CIRCUMFLEX BELOW, LATIN SMALL LETTER T WITH CIRCUMFLEX BELOW +test(0x1E71, 0x1E70); // LATIN SMALL LETTER T WITH CIRCUMFLEX BELOW, LATIN CAPITAL LETTER T WITH CIRCUMFLEX BELOW +test(0x1E72, 0x1E73); // LATIN CAPITAL LETTER U WITH DIAERESIS BELOW, LATIN SMALL LETTER U WITH DIAERESIS BELOW +test(0x1E73, 0x1E72); // LATIN SMALL LETTER U WITH DIAERESIS BELOW, LATIN CAPITAL LETTER U WITH DIAERESIS BELOW +test(0x1E74, 0x1E75); // LATIN CAPITAL LETTER U WITH TILDE BELOW, LATIN SMALL LETTER U WITH TILDE BELOW +test(0x1E75, 0x1E74); // LATIN SMALL LETTER U WITH TILDE BELOW, LATIN CAPITAL LETTER U WITH TILDE BELOW +test(0x1E76, 0x1E77); // LATIN CAPITAL LETTER U WITH CIRCUMFLEX BELOW, LATIN SMALL LETTER U WITH CIRCUMFLEX BELOW +test(0x1E77, 0x1E76); // LATIN SMALL LETTER U WITH CIRCUMFLEX BELOW, LATIN CAPITAL LETTER U WITH CIRCUMFLEX BELOW +test(0x1E78, 0x1E79); // LATIN CAPITAL LETTER U WITH TILDE AND ACUTE, LATIN SMALL LETTER U WITH TILDE AND ACUTE +test(0x1E79, 0x1E78); // LATIN SMALL LETTER U WITH TILDE AND ACUTE, LATIN CAPITAL LETTER U WITH TILDE AND ACUTE +test(0x1E7A, 0x1E7B); // LATIN CAPITAL LETTER U WITH MACRON AND DIAERESIS, LATIN SMALL LETTER U WITH MACRON AND DIAERESIS +test(0x1E7B, 0x1E7A); // LATIN SMALL LETTER U WITH MACRON AND DIAERESIS, LATIN CAPITAL LETTER U WITH MACRON AND DIAERESIS +test(0x1E7C, 0x1E7D); // LATIN CAPITAL LETTER V WITH TILDE, LATIN SMALL LETTER V WITH TILDE +test(0x1E7D, 0x1E7C); // LATIN SMALL LETTER V WITH TILDE, LATIN CAPITAL LETTER V WITH TILDE +test(0x1E7E, 0x1E7F); // LATIN CAPITAL LETTER V WITH DOT BELOW, LATIN SMALL LETTER V WITH DOT BELOW +test(0x1E7F, 0x1E7E); // LATIN SMALL LETTER V WITH DOT BELOW, LATIN CAPITAL LETTER V WITH DOT BELOW +test(0x1E80, 0x1E81); // LATIN CAPITAL LETTER W WITH GRAVE, LATIN SMALL LETTER W WITH GRAVE +test(0x1E81, 0x1E80); // LATIN SMALL LETTER W WITH GRAVE, LATIN CAPITAL LETTER W WITH GRAVE +test(0x1E82, 0x1E83); // LATIN CAPITAL LETTER W WITH ACUTE, LATIN SMALL LETTER W WITH ACUTE +test(0x1E83, 0x1E82); // LATIN SMALL LETTER W WITH ACUTE, LATIN CAPITAL LETTER W WITH ACUTE +test(0x1E84, 0x1E85); // LATIN CAPITAL LETTER W WITH DIAERESIS, LATIN SMALL LETTER W WITH DIAERESIS +test(0x1E85, 0x1E84); // LATIN SMALL LETTER W WITH DIAERESIS, LATIN CAPITAL LETTER W WITH DIAERESIS +test(0x1E86, 0x1E87); // LATIN CAPITAL LETTER W WITH DOT ABOVE, LATIN SMALL LETTER W WITH DOT ABOVE +test(0x1E87, 0x1E86); // LATIN SMALL LETTER W WITH DOT ABOVE, LATIN CAPITAL LETTER W WITH DOT ABOVE +test(0x1E88, 0x1E89); // LATIN CAPITAL LETTER W WITH DOT BELOW, LATIN SMALL LETTER W WITH DOT BELOW +test(0x1E89, 0x1E88); // LATIN SMALL LETTER W WITH DOT BELOW, LATIN CAPITAL LETTER W WITH DOT BELOW +test(0x1E8A, 0x1E8B); // LATIN CAPITAL LETTER X WITH DOT ABOVE, LATIN SMALL LETTER X WITH DOT ABOVE +test(0x1E8B, 0x1E8A); // LATIN SMALL LETTER X WITH DOT ABOVE, LATIN CAPITAL LETTER X WITH DOT ABOVE +test(0x1E8C, 0x1E8D); // LATIN CAPITAL LETTER X WITH DIAERESIS, LATIN SMALL LETTER X WITH DIAERESIS +test(0x1E8D, 0x1E8C); // LATIN SMALL LETTER X WITH DIAERESIS, LATIN CAPITAL LETTER X WITH DIAERESIS +test(0x1E8E, 0x1E8F); // LATIN CAPITAL LETTER Y WITH DOT ABOVE, LATIN SMALL LETTER Y WITH DOT ABOVE +test(0x1E8F, 0x1E8E); // LATIN SMALL LETTER Y WITH DOT ABOVE, LATIN CAPITAL LETTER Y WITH DOT ABOVE +test(0x1E90, 0x1E91); // LATIN CAPITAL LETTER Z WITH CIRCUMFLEX, LATIN SMALL LETTER Z WITH CIRCUMFLEX +test(0x1E91, 0x1E90); // LATIN SMALL LETTER Z WITH CIRCUMFLEX, LATIN CAPITAL LETTER Z WITH CIRCUMFLEX +test(0x1E92, 0x1E93); // LATIN CAPITAL LETTER Z WITH DOT BELOW, LATIN SMALL LETTER Z WITH DOT BELOW +test(0x1E93, 0x1E92); // LATIN SMALL LETTER Z WITH DOT BELOW, LATIN CAPITAL LETTER Z WITH DOT BELOW +test(0x1E94, 0x1E95); // LATIN CAPITAL LETTER Z WITH LINE BELOW, LATIN SMALL LETTER Z WITH LINE BELOW +test(0x1E95, 0x1E94); // LATIN SMALL LETTER Z WITH LINE BELOW, LATIN CAPITAL LETTER Z WITH LINE BELOW +test(0x1E9B, 0x1E61, 0x1E60); // LATIN SMALL LETTER LONG S WITH DOT ABOVE, LATIN SMALL LETTER S WITH DOT ABOVE, LATIN CAPITAL LETTER S WITH DOT ABOVE +test(0x1E9E, 0x00DF); // LATIN CAPITAL LETTER SHARP S, LATIN SMALL LETTER SHARP S +test(0x1EA0, 0x1EA1); // LATIN CAPITAL LETTER A WITH DOT BELOW, LATIN SMALL LETTER A WITH DOT BELOW +test(0x1EA1, 0x1EA0); // LATIN SMALL LETTER A WITH DOT BELOW, LATIN CAPITAL LETTER A WITH DOT BELOW +test(0x1EA2, 0x1EA3); // LATIN CAPITAL LETTER A WITH HOOK ABOVE, LATIN SMALL LETTER A WITH HOOK ABOVE +test(0x1EA3, 0x1EA2); // LATIN SMALL LETTER A WITH HOOK ABOVE, LATIN CAPITAL LETTER A WITH HOOK ABOVE +test(0x1EA4, 0x1EA5); // LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND ACUTE, LATIN SMALL LETTER A WITH CIRCUMFLEX AND ACUTE +test(0x1EA5, 0x1EA4); // LATIN SMALL LETTER A WITH CIRCUMFLEX AND ACUTE, LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND ACUTE +test(0x1EA6, 0x1EA7); // LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND GRAVE, LATIN SMALL LETTER A WITH CIRCUMFLEX AND GRAVE +test(0x1EA7, 0x1EA6); // LATIN SMALL LETTER A WITH CIRCUMFLEX AND GRAVE, LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND GRAVE +test(0x1EA8, 0x1EA9); // LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND HOOK ABOVE, LATIN SMALL LETTER A WITH CIRCUMFLEX AND HOOK ABOVE +test(0x1EA9, 0x1EA8); // LATIN SMALL LETTER A WITH CIRCUMFLEX AND HOOK ABOVE, LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND HOOK ABOVE +test(0x1EAA, 0x1EAB); // LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND TILDE, LATIN SMALL LETTER A WITH CIRCUMFLEX AND TILDE +test(0x1EAB, 0x1EAA); // LATIN SMALL LETTER A WITH CIRCUMFLEX AND TILDE, LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND TILDE +test(0x1EAC, 0x1EAD); // LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND DOT BELOW, LATIN SMALL LETTER A WITH CIRCUMFLEX AND DOT BELOW +test(0x1EAD, 0x1EAC); // LATIN SMALL LETTER A WITH CIRCUMFLEX AND DOT BELOW, LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND DOT BELOW +test(0x1EAE, 0x1EAF); // LATIN CAPITAL LETTER A WITH BREVE AND ACUTE, LATIN SMALL LETTER A WITH BREVE AND ACUTE +test(0x1EAF, 0x1EAE); // LATIN SMALL LETTER A WITH BREVE AND ACUTE, LATIN CAPITAL LETTER A WITH BREVE AND ACUTE +test(0x1EB0, 0x1EB1); // LATIN CAPITAL LETTER A WITH BREVE AND GRAVE, LATIN SMALL LETTER A WITH BREVE AND GRAVE +test(0x1EB1, 0x1EB0); // LATIN SMALL LETTER A WITH BREVE AND GRAVE, LATIN CAPITAL LETTER A WITH BREVE AND GRAVE +test(0x1EB2, 0x1EB3); // LATIN CAPITAL LETTER A WITH BREVE AND HOOK ABOVE, LATIN SMALL LETTER A WITH BREVE AND HOOK ABOVE +test(0x1EB3, 0x1EB2); // LATIN SMALL LETTER A WITH BREVE AND HOOK ABOVE, LATIN CAPITAL LETTER A WITH BREVE AND HOOK ABOVE +test(0x1EB4, 0x1EB5); // LATIN CAPITAL LETTER A WITH BREVE AND TILDE, LATIN SMALL LETTER A WITH BREVE AND TILDE +test(0x1EB5, 0x1EB4); // LATIN SMALL LETTER A WITH BREVE AND TILDE, LATIN CAPITAL LETTER A WITH BREVE AND TILDE +test(0x1EB6, 0x1EB7); // LATIN CAPITAL LETTER A WITH BREVE AND DOT BELOW, LATIN SMALL LETTER A WITH BREVE AND DOT BELOW +test(0x1EB7, 0x1EB6); // LATIN SMALL LETTER A WITH BREVE AND DOT BELOW, LATIN CAPITAL LETTER A WITH BREVE AND DOT BELOW +test(0x1EB8, 0x1EB9); // LATIN CAPITAL LETTER E WITH DOT BELOW, LATIN SMALL LETTER E WITH DOT BELOW +test(0x1EB9, 0x1EB8); // LATIN SMALL LETTER E WITH DOT BELOW, LATIN CAPITAL LETTER E WITH DOT BELOW +test(0x1EBA, 0x1EBB); // LATIN CAPITAL LETTER E WITH HOOK ABOVE, LATIN SMALL LETTER E WITH HOOK ABOVE +test(0x1EBB, 0x1EBA); // LATIN SMALL LETTER E WITH HOOK ABOVE, LATIN CAPITAL LETTER E WITH HOOK ABOVE +test(0x1EBC, 0x1EBD); // LATIN CAPITAL LETTER E WITH TILDE, LATIN SMALL LETTER E WITH TILDE +test(0x1EBD, 0x1EBC); // LATIN SMALL LETTER E WITH TILDE, LATIN CAPITAL LETTER E WITH TILDE +test(0x1EBE, 0x1EBF); // LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND ACUTE, LATIN SMALL LETTER E WITH CIRCUMFLEX AND ACUTE +test(0x1EBF, 0x1EBE); // LATIN SMALL LETTER E WITH CIRCUMFLEX AND ACUTE, LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND ACUTE +test(0x1EC0, 0x1EC1); // LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND GRAVE, LATIN SMALL LETTER E WITH CIRCUMFLEX AND GRAVE +test(0x1EC1, 0x1EC0); // LATIN SMALL LETTER E WITH CIRCUMFLEX AND GRAVE, LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND GRAVE +test(0x1EC2, 0x1EC3); // LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND HOOK ABOVE, LATIN SMALL LETTER E WITH CIRCUMFLEX AND HOOK ABOVE +test(0x1EC3, 0x1EC2); // LATIN SMALL LETTER E WITH CIRCUMFLEX AND HOOK ABOVE, LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND HOOK ABOVE +test(0x1EC4, 0x1EC5); // LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND TILDE, LATIN SMALL LETTER E WITH CIRCUMFLEX AND TILDE +test(0x1EC5, 0x1EC4); // LATIN SMALL LETTER E WITH CIRCUMFLEX AND TILDE, LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND TILDE +test(0x1EC6, 0x1EC7); // LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND DOT BELOW, LATIN SMALL LETTER E WITH CIRCUMFLEX AND DOT BELOW +test(0x1EC7, 0x1EC6); // LATIN SMALL LETTER E WITH CIRCUMFLEX AND DOT BELOW, LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND DOT BELOW +test(0x1EC8, 0x1EC9); // LATIN CAPITAL LETTER I WITH HOOK ABOVE, LATIN SMALL LETTER I WITH HOOK ABOVE +test(0x1EC9, 0x1EC8); // LATIN SMALL LETTER I WITH HOOK ABOVE, LATIN CAPITAL LETTER I WITH HOOK ABOVE +test(0x1ECA, 0x1ECB); // LATIN CAPITAL LETTER I WITH DOT BELOW, LATIN SMALL LETTER I WITH DOT BELOW +test(0x1ECB, 0x1ECA); // LATIN SMALL LETTER I WITH DOT BELOW, LATIN CAPITAL LETTER I WITH DOT BELOW +test(0x1ECC, 0x1ECD); // LATIN CAPITAL LETTER O WITH DOT BELOW, LATIN SMALL LETTER O WITH DOT BELOW +test(0x1ECD, 0x1ECC); // LATIN SMALL LETTER O WITH DOT BELOW, LATIN CAPITAL LETTER O WITH DOT BELOW +test(0x1ECE, 0x1ECF); // LATIN CAPITAL LETTER O WITH HOOK ABOVE, LATIN SMALL LETTER O WITH HOOK ABOVE +test(0x1ECF, 0x1ECE); // LATIN SMALL LETTER O WITH HOOK ABOVE, LATIN CAPITAL LETTER O WITH HOOK ABOVE +test(0x1ED0, 0x1ED1); // LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND ACUTE, LATIN SMALL LETTER O WITH CIRCUMFLEX AND ACUTE +test(0x1ED1, 0x1ED0); // LATIN SMALL LETTER O WITH CIRCUMFLEX AND ACUTE, LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND ACUTE +test(0x1ED2, 0x1ED3); // LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND GRAVE, LATIN SMALL LETTER O WITH CIRCUMFLEX AND GRAVE +test(0x1ED3, 0x1ED2); // LATIN SMALL LETTER O WITH CIRCUMFLEX AND GRAVE, LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND GRAVE +test(0x1ED4, 0x1ED5); // LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND HOOK ABOVE, LATIN SMALL LETTER O WITH CIRCUMFLEX AND HOOK ABOVE +test(0x1ED5, 0x1ED4); // LATIN SMALL LETTER O WITH CIRCUMFLEX AND HOOK ABOVE, LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND HOOK ABOVE +test(0x1ED6, 0x1ED7); // LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND TILDE, LATIN SMALL LETTER O WITH CIRCUMFLEX AND TILDE +test(0x1ED7, 0x1ED6); // LATIN SMALL LETTER O WITH CIRCUMFLEX AND TILDE, LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND TILDE +test(0x1ED8, 0x1ED9); // LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND DOT BELOW, LATIN SMALL LETTER O WITH CIRCUMFLEX AND DOT BELOW +test(0x1ED9, 0x1ED8); // LATIN SMALL LETTER O WITH CIRCUMFLEX AND DOT BELOW, LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND DOT BELOW +test(0x1EDA, 0x1EDB); // LATIN CAPITAL LETTER O WITH HORN AND ACUTE, LATIN SMALL LETTER O WITH HORN AND ACUTE +test(0x1EDB, 0x1EDA); // LATIN SMALL LETTER O WITH HORN AND ACUTE, LATIN CAPITAL LETTER O WITH HORN AND ACUTE +test(0x1EDC, 0x1EDD); // LATIN CAPITAL LETTER O WITH HORN AND GRAVE, LATIN SMALL LETTER O WITH HORN AND GRAVE +test(0x1EDD, 0x1EDC); // LATIN SMALL LETTER O WITH HORN AND GRAVE, LATIN CAPITAL LETTER O WITH HORN AND GRAVE +test(0x1EDE, 0x1EDF); // LATIN CAPITAL LETTER O WITH HORN AND HOOK ABOVE, LATIN SMALL LETTER O WITH HORN AND HOOK ABOVE +test(0x1EDF, 0x1EDE); // LATIN SMALL LETTER O WITH HORN AND HOOK ABOVE, LATIN CAPITAL LETTER O WITH HORN AND HOOK ABOVE +test(0x1EE0, 0x1EE1); // LATIN CAPITAL LETTER O WITH HORN AND TILDE, LATIN SMALL LETTER O WITH HORN AND TILDE +test(0x1EE1, 0x1EE0); // LATIN SMALL LETTER O WITH HORN AND TILDE, LATIN CAPITAL LETTER O WITH HORN AND TILDE +test(0x1EE2, 0x1EE3); // LATIN CAPITAL LETTER O WITH HORN AND DOT BELOW, LATIN SMALL LETTER O WITH HORN AND DOT BELOW +test(0x1EE3, 0x1EE2); // LATIN SMALL LETTER O WITH HORN AND DOT BELOW, LATIN CAPITAL LETTER O WITH HORN AND DOT BELOW +test(0x1EE4, 0x1EE5); // LATIN CAPITAL LETTER U WITH DOT BELOW, LATIN SMALL LETTER U WITH DOT BELOW +test(0x1EE5, 0x1EE4); // LATIN SMALL LETTER U WITH DOT BELOW, LATIN CAPITAL LETTER U WITH DOT BELOW +test(0x1EE6, 0x1EE7); // LATIN CAPITAL LETTER U WITH HOOK ABOVE, LATIN SMALL LETTER U WITH HOOK ABOVE +test(0x1EE7, 0x1EE6); // LATIN SMALL LETTER U WITH HOOK ABOVE, LATIN CAPITAL LETTER U WITH HOOK ABOVE +test(0x1EE8, 0x1EE9); // LATIN CAPITAL LETTER U WITH HORN AND ACUTE, LATIN SMALL LETTER U WITH HORN AND ACUTE +test(0x1EE9, 0x1EE8); // LATIN SMALL LETTER U WITH HORN AND ACUTE, LATIN CAPITAL LETTER U WITH HORN AND ACUTE +test(0x1EEA, 0x1EEB); // LATIN CAPITAL LETTER U WITH HORN AND GRAVE, LATIN SMALL LETTER U WITH HORN AND GRAVE +test(0x1EEB, 0x1EEA); // LATIN SMALL LETTER U WITH HORN AND GRAVE, LATIN CAPITAL LETTER U WITH HORN AND GRAVE +test(0x1EEC, 0x1EED); // LATIN CAPITAL LETTER U WITH HORN AND HOOK ABOVE, LATIN SMALL LETTER U WITH HORN AND HOOK ABOVE +test(0x1EED, 0x1EEC); // LATIN SMALL LETTER U WITH HORN AND HOOK ABOVE, LATIN CAPITAL LETTER U WITH HORN AND HOOK ABOVE +test(0x1EEE, 0x1EEF); // LATIN CAPITAL LETTER U WITH HORN AND TILDE, LATIN SMALL LETTER U WITH HORN AND TILDE +test(0x1EEF, 0x1EEE); // LATIN SMALL LETTER U WITH HORN AND TILDE, LATIN CAPITAL LETTER U WITH HORN AND TILDE +test(0x1EF0, 0x1EF1); // LATIN CAPITAL LETTER U WITH HORN AND DOT BELOW, LATIN SMALL LETTER U WITH HORN AND DOT BELOW +test(0x1EF1, 0x1EF0); // LATIN SMALL LETTER U WITH HORN AND DOT BELOW, LATIN CAPITAL LETTER U WITH HORN AND DOT BELOW +test(0x1EF2, 0x1EF3); // LATIN CAPITAL LETTER Y WITH GRAVE, LATIN SMALL LETTER Y WITH GRAVE +test(0x1EF3, 0x1EF2); // LATIN SMALL LETTER Y WITH GRAVE, LATIN CAPITAL LETTER Y WITH GRAVE +test(0x1EF4, 0x1EF5); // LATIN CAPITAL LETTER Y WITH DOT BELOW, LATIN SMALL LETTER Y WITH DOT BELOW +test(0x1EF5, 0x1EF4); // LATIN SMALL LETTER Y WITH DOT BELOW, LATIN CAPITAL LETTER Y WITH DOT BELOW +test(0x1EF6, 0x1EF7); // LATIN CAPITAL LETTER Y WITH HOOK ABOVE, LATIN SMALL LETTER Y WITH HOOK ABOVE +test(0x1EF7, 0x1EF6); // LATIN SMALL LETTER Y WITH HOOK ABOVE, LATIN CAPITAL LETTER Y WITH HOOK ABOVE +test(0x1EF8, 0x1EF9); // LATIN CAPITAL LETTER Y WITH TILDE, LATIN SMALL LETTER Y WITH TILDE +test(0x1EF9, 0x1EF8); // LATIN SMALL LETTER Y WITH TILDE, LATIN CAPITAL LETTER Y WITH TILDE +test(0x1EFA, 0x1EFB); // LATIN CAPITAL LETTER MIDDLE-WELSH LL, LATIN SMALL LETTER MIDDLE-WELSH LL +test(0x1EFB, 0x1EFA); // LATIN SMALL LETTER MIDDLE-WELSH LL, LATIN CAPITAL LETTER MIDDLE-WELSH LL +test(0x1EFC, 0x1EFD); // LATIN CAPITAL LETTER MIDDLE-WELSH V, LATIN SMALL LETTER MIDDLE-WELSH V +test(0x1EFD, 0x1EFC); // LATIN SMALL LETTER MIDDLE-WELSH V, LATIN CAPITAL LETTER MIDDLE-WELSH V +test(0x1EFE, 0x1EFF); // LATIN CAPITAL LETTER Y WITH LOOP, LATIN SMALL LETTER Y WITH LOOP +test(0x1EFF, 0x1EFE); // LATIN SMALL LETTER Y WITH LOOP, LATIN CAPITAL LETTER Y WITH LOOP +test(0x1F00, 0x1F08); // GREEK SMALL LETTER ALPHA WITH PSILI, GREEK CAPITAL LETTER ALPHA WITH PSILI +test(0x1F01, 0x1F09); // GREEK SMALL LETTER ALPHA WITH DASIA, GREEK CAPITAL LETTER ALPHA WITH DASIA +test(0x1F02, 0x1F0A); // GREEK SMALL LETTER ALPHA WITH PSILI AND VARIA, GREEK CAPITAL LETTER ALPHA WITH PSILI AND VARIA +test(0x1F03, 0x1F0B); // GREEK SMALL LETTER ALPHA WITH DASIA AND VARIA, GREEK CAPITAL LETTER ALPHA WITH DASIA AND VARIA +test(0x1F04, 0x1F0C); // GREEK SMALL LETTER ALPHA WITH PSILI AND OXIA, GREEK CAPITAL LETTER ALPHA WITH PSILI AND OXIA +test(0x1F05, 0x1F0D); // GREEK SMALL LETTER ALPHA WITH DASIA AND OXIA, GREEK CAPITAL LETTER ALPHA WITH DASIA AND OXIA +test(0x1F06, 0x1F0E); // GREEK SMALL LETTER ALPHA WITH PSILI AND PERISPOMENI, GREEK CAPITAL LETTER ALPHA WITH PSILI AND PERISPOMENI +test(0x1F07, 0x1F0F); // GREEK SMALL LETTER ALPHA WITH DASIA AND PERISPOMENI, GREEK CAPITAL LETTER ALPHA WITH DASIA AND PERISPOMENI +test(0x1F08, 0x1F00); // GREEK CAPITAL LETTER ALPHA WITH PSILI, GREEK SMALL LETTER ALPHA WITH PSILI +test(0x1F09, 0x1F01); // GREEK CAPITAL LETTER ALPHA WITH DASIA, GREEK SMALL LETTER ALPHA WITH DASIA +test(0x1F0A, 0x1F02); // GREEK CAPITAL LETTER ALPHA WITH PSILI AND VARIA, GREEK SMALL LETTER ALPHA WITH PSILI AND VARIA +test(0x1F0B, 0x1F03); // GREEK CAPITAL LETTER ALPHA WITH DASIA AND VARIA, GREEK SMALL LETTER ALPHA WITH DASIA AND VARIA +test(0x1F0C, 0x1F04); // GREEK CAPITAL LETTER ALPHA WITH PSILI AND OXIA, GREEK SMALL LETTER ALPHA WITH PSILI AND OXIA +test(0x1F0D, 0x1F05); // GREEK CAPITAL LETTER ALPHA WITH DASIA AND OXIA, GREEK SMALL LETTER ALPHA WITH DASIA AND OXIA +test(0x1F0E, 0x1F06); // GREEK CAPITAL LETTER ALPHA WITH PSILI AND PERISPOMENI, GREEK SMALL LETTER ALPHA WITH PSILI AND PERISPOMENI +test(0x1F0F, 0x1F07); // GREEK CAPITAL LETTER ALPHA WITH DASIA AND PERISPOMENI, GREEK SMALL LETTER ALPHA WITH DASIA AND PERISPOMENI +test(0x1F10, 0x1F18); // GREEK SMALL LETTER EPSILON WITH PSILI, GREEK CAPITAL LETTER EPSILON WITH PSILI +test(0x1F11, 0x1F19); // GREEK SMALL LETTER EPSILON WITH DASIA, GREEK CAPITAL LETTER EPSILON WITH DASIA +test(0x1F12, 0x1F1A); // GREEK SMALL LETTER EPSILON WITH PSILI AND VARIA, GREEK CAPITAL LETTER EPSILON WITH PSILI AND VARIA +test(0x1F13, 0x1F1B); // GREEK SMALL LETTER EPSILON WITH DASIA AND VARIA, GREEK CAPITAL LETTER EPSILON WITH DASIA AND VARIA +test(0x1F14, 0x1F1C); // GREEK SMALL LETTER EPSILON WITH PSILI AND OXIA, GREEK CAPITAL LETTER EPSILON WITH PSILI AND OXIA +test(0x1F15, 0x1F1D); // GREEK SMALL LETTER EPSILON WITH DASIA AND OXIA, GREEK CAPITAL LETTER EPSILON WITH DASIA AND OXIA +test(0x1F18, 0x1F10); // GREEK CAPITAL LETTER EPSILON WITH PSILI, GREEK SMALL LETTER EPSILON WITH PSILI +test(0x1F19, 0x1F11); // GREEK CAPITAL LETTER EPSILON WITH DASIA, GREEK SMALL LETTER EPSILON WITH DASIA +test(0x1F1A, 0x1F12); // GREEK CAPITAL LETTER EPSILON WITH PSILI AND VARIA, GREEK SMALL LETTER EPSILON WITH PSILI AND VARIA +test(0x1F1B, 0x1F13); // GREEK CAPITAL LETTER EPSILON WITH DASIA AND VARIA, GREEK SMALL LETTER EPSILON WITH DASIA AND VARIA +test(0x1F1C, 0x1F14); // GREEK CAPITAL LETTER EPSILON WITH PSILI AND OXIA, GREEK SMALL LETTER EPSILON WITH PSILI AND OXIA +test(0x1F1D, 0x1F15); // GREEK CAPITAL LETTER EPSILON WITH DASIA AND OXIA, GREEK SMALL LETTER EPSILON WITH DASIA AND OXIA +test(0x1F20, 0x1F28); // GREEK SMALL LETTER ETA WITH PSILI, GREEK CAPITAL LETTER ETA WITH PSILI +test(0x1F21, 0x1F29); // GREEK SMALL LETTER ETA WITH DASIA, GREEK CAPITAL LETTER ETA WITH DASIA +test(0x1F22, 0x1F2A); // GREEK SMALL LETTER ETA WITH PSILI AND VARIA, GREEK CAPITAL LETTER ETA WITH PSILI AND VARIA +test(0x1F23, 0x1F2B); // GREEK SMALL LETTER ETA WITH DASIA AND VARIA, GREEK CAPITAL LETTER ETA WITH DASIA AND VARIA +test(0x1F24, 0x1F2C); // GREEK SMALL LETTER ETA WITH PSILI AND OXIA, GREEK CAPITAL LETTER ETA WITH PSILI AND OXIA +test(0x1F25, 0x1F2D); // GREEK SMALL LETTER ETA WITH DASIA AND OXIA, GREEK CAPITAL LETTER ETA WITH DASIA AND OXIA +test(0x1F26, 0x1F2E); // GREEK SMALL LETTER ETA WITH PSILI AND PERISPOMENI, GREEK CAPITAL LETTER ETA WITH PSILI AND PERISPOMENI +test(0x1F27, 0x1F2F); // GREEK SMALL LETTER ETA WITH DASIA AND PERISPOMENI, GREEK CAPITAL LETTER ETA WITH DASIA AND PERISPOMENI +test(0x1F28, 0x1F20); // GREEK CAPITAL LETTER ETA WITH PSILI, GREEK SMALL LETTER ETA WITH PSILI +test(0x1F29, 0x1F21); // GREEK CAPITAL LETTER ETA WITH DASIA, GREEK SMALL LETTER ETA WITH DASIA +test(0x1F2A, 0x1F22); // GREEK CAPITAL LETTER ETA WITH PSILI AND VARIA, GREEK SMALL LETTER ETA WITH PSILI AND VARIA +test(0x1F2B, 0x1F23); // GREEK CAPITAL LETTER ETA WITH DASIA AND VARIA, GREEK SMALL LETTER ETA WITH DASIA AND VARIA +test(0x1F2C, 0x1F24); // GREEK CAPITAL LETTER ETA WITH PSILI AND OXIA, GREEK SMALL LETTER ETA WITH PSILI AND OXIA +test(0x1F2D, 0x1F25); // GREEK CAPITAL LETTER ETA WITH DASIA AND OXIA, GREEK SMALL LETTER ETA WITH DASIA AND OXIA +test(0x1F2E, 0x1F26); // GREEK CAPITAL LETTER ETA WITH PSILI AND PERISPOMENI, GREEK SMALL LETTER ETA WITH PSILI AND PERISPOMENI +test(0x1F2F, 0x1F27); // GREEK CAPITAL LETTER ETA WITH DASIA AND PERISPOMENI, GREEK SMALL LETTER ETA WITH DASIA AND PERISPOMENI +test(0x1F30, 0x1F38); // GREEK SMALL LETTER IOTA WITH PSILI, GREEK CAPITAL LETTER IOTA WITH PSILI +test(0x1F31, 0x1F39); // GREEK SMALL LETTER IOTA WITH DASIA, GREEK CAPITAL LETTER IOTA WITH DASIA +test(0x1F32, 0x1F3A); // GREEK SMALL LETTER IOTA WITH PSILI AND VARIA, GREEK CAPITAL LETTER IOTA WITH PSILI AND VARIA +test(0x1F33, 0x1F3B); // GREEK SMALL LETTER IOTA WITH DASIA AND VARIA, GREEK CAPITAL LETTER IOTA WITH DASIA AND VARIA +test(0x1F34, 0x1F3C); // GREEK SMALL LETTER IOTA WITH PSILI AND OXIA, GREEK CAPITAL LETTER IOTA WITH PSILI AND OXIA +test(0x1F35, 0x1F3D); // GREEK SMALL LETTER IOTA WITH DASIA AND OXIA, GREEK CAPITAL LETTER IOTA WITH DASIA AND OXIA +test(0x1F36, 0x1F3E); // GREEK SMALL LETTER IOTA WITH PSILI AND PERISPOMENI, GREEK CAPITAL LETTER IOTA WITH PSILI AND PERISPOMENI +test(0x1F37, 0x1F3F); // GREEK SMALL LETTER IOTA WITH DASIA AND PERISPOMENI, GREEK CAPITAL LETTER IOTA WITH DASIA AND PERISPOMENI +test(0x1F38, 0x1F30); // GREEK CAPITAL LETTER IOTA WITH PSILI, GREEK SMALL LETTER IOTA WITH PSILI +test(0x1F39, 0x1F31); // GREEK CAPITAL LETTER IOTA WITH DASIA, GREEK SMALL LETTER IOTA WITH DASIA +test(0x1F3A, 0x1F32); // GREEK CAPITAL LETTER IOTA WITH PSILI AND VARIA, GREEK SMALL LETTER IOTA WITH PSILI AND VARIA +test(0x1F3B, 0x1F33); // GREEK CAPITAL LETTER IOTA WITH DASIA AND VARIA, GREEK SMALL LETTER IOTA WITH DASIA AND VARIA +test(0x1F3C, 0x1F34); // GREEK CAPITAL LETTER IOTA WITH PSILI AND OXIA, GREEK SMALL LETTER IOTA WITH PSILI AND OXIA +test(0x1F3D, 0x1F35); // GREEK CAPITAL LETTER IOTA WITH DASIA AND OXIA, GREEK SMALL LETTER IOTA WITH DASIA AND OXIA +test(0x1F3E, 0x1F36); // GREEK CAPITAL LETTER IOTA WITH PSILI AND PERISPOMENI, GREEK SMALL LETTER IOTA WITH PSILI AND PERISPOMENI +test(0x1F3F, 0x1F37); // GREEK CAPITAL LETTER IOTA WITH DASIA AND PERISPOMENI, GREEK SMALL LETTER IOTA WITH DASIA AND PERISPOMENI +test(0x1F40, 0x1F48); // GREEK SMALL LETTER OMICRON WITH PSILI, GREEK CAPITAL LETTER OMICRON WITH PSILI +test(0x1F41, 0x1F49); // GREEK SMALL LETTER OMICRON WITH DASIA, GREEK CAPITAL LETTER OMICRON WITH DASIA +test(0x1F42, 0x1F4A); // GREEK SMALL LETTER OMICRON WITH PSILI AND VARIA, GREEK CAPITAL LETTER OMICRON WITH PSILI AND VARIA +test(0x1F43, 0x1F4B); // GREEK SMALL LETTER OMICRON WITH DASIA AND VARIA, GREEK CAPITAL LETTER OMICRON WITH DASIA AND VARIA +test(0x1F44, 0x1F4C); // GREEK SMALL LETTER OMICRON WITH PSILI AND OXIA, GREEK CAPITAL LETTER OMICRON WITH PSILI AND OXIA +test(0x1F45, 0x1F4D); // GREEK SMALL LETTER OMICRON WITH DASIA AND OXIA, GREEK CAPITAL LETTER OMICRON WITH DASIA AND OXIA +test(0x1F48, 0x1F40); // GREEK CAPITAL LETTER OMICRON WITH PSILI, GREEK SMALL LETTER OMICRON WITH PSILI +test(0x1F49, 0x1F41); // GREEK CAPITAL LETTER OMICRON WITH DASIA, GREEK SMALL LETTER OMICRON WITH DASIA +test(0x1F4A, 0x1F42); // GREEK CAPITAL LETTER OMICRON WITH PSILI AND VARIA, GREEK SMALL LETTER OMICRON WITH PSILI AND VARIA +test(0x1F4B, 0x1F43); // GREEK CAPITAL LETTER OMICRON WITH DASIA AND VARIA, GREEK SMALL LETTER OMICRON WITH DASIA AND VARIA +test(0x1F4C, 0x1F44); // GREEK CAPITAL LETTER OMICRON WITH PSILI AND OXIA, GREEK SMALL LETTER OMICRON WITH PSILI AND OXIA +test(0x1F4D, 0x1F45); // GREEK CAPITAL LETTER OMICRON WITH DASIA AND OXIA, GREEK SMALL LETTER OMICRON WITH DASIA AND OXIA +test(0x1F51, 0x1F59); // GREEK SMALL LETTER UPSILON WITH DASIA, GREEK CAPITAL LETTER UPSILON WITH DASIA +test(0x1F53, 0x1F5B); // GREEK SMALL LETTER UPSILON WITH DASIA AND VARIA, GREEK CAPITAL LETTER UPSILON WITH DASIA AND VARIA +test(0x1F55, 0x1F5D); // GREEK SMALL LETTER UPSILON WITH DASIA AND OXIA, GREEK CAPITAL LETTER UPSILON WITH DASIA AND OXIA +test(0x1F57, 0x1F5F); // GREEK SMALL LETTER UPSILON WITH DASIA AND PERISPOMENI, GREEK CAPITAL LETTER UPSILON WITH DASIA AND PERISPOMENI +test(0x1F59, 0x1F51); // GREEK CAPITAL LETTER UPSILON WITH DASIA, GREEK SMALL LETTER UPSILON WITH DASIA +test(0x1F5B, 0x1F53); // GREEK CAPITAL LETTER UPSILON WITH DASIA AND VARIA, GREEK SMALL LETTER UPSILON WITH DASIA AND VARIA +test(0x1F5D, 0x1F55); // GREEK CAPITAL LETTER UPSILON WITH DASIA AND OXIA, GREEK SMALL LETTER UPSILON WITH DASIA AND OXIA +test(0x1F5F, 0x1F57); // GREEK CAPITAL LETTER UPSILON WITH DASIA AND PERISPOMENI, GREEK SMALL LETTER UPSILON WITH DASIA AND PERISPOMENI +test(0x1F60, 0x1F68); // GREEK SMALL LETTER OMEGA WITH PSILI, GREEK CAPITAL LETTER OMEGA WITH PSILI +test(0x1F61, 0x1F69); // GREEK SMALL LETTER OMEGA WITH DASIA, GREEK CAPITAL LETTER OMEGA WITH DASIA +test(0x1F62, 0x1F6A); // GREEK SMALL LETTER OMEGA WITH PSILI AND VARIA, GREEK CAPITAL LETTER OMEGA WITH PSILI AND VARIA +test(0x1F63, 0x1F6B); // GREEK SMALL LETTER OMEGA WITH DASIA AND VARIA, GREEK CAPITAL LETTER OMEGA WITH DASIA AND VARIA +test(0x1F64, 0x1F6C); // GREEK SMALL LETTER OMEGA WITH PSILI AND OXIA, GREEK CAPITAL LETTER OMEGA WITH PSILI AND OXIA +test(0x1F65, 0x1F6D); // GREEK SMALL LETTER OMEGA WITH DASIA AND OXIA, GREEK CAPITAL LETTER OMEGA WITH DASIA AND OXIA +test(0x1F66, 0x1F6E); // GREEK SMALL LETTER OMEGA WITH PSILI AND PERISPOMENI, GREEK CAPITAL LETTER OMEGA WITH PSILI AND PERISPOMENI +test(0x1F67, 0x1F6F); // GREEK SMALL LETTER OMEGA WITH DASIA AND PERISPOMENI, GREEK CAPITAL LETTER OMEGA WITH DASIA AND PERISPOMENI +test(0x1F68, 0x1F60); // GREEK CAPITAL LETTER OMEGA WITH PSILI, GREEK SMALL LETTER OMEGA WITH PSILI +test(0x1F69, 0x1F61); // GREEK CAPITAL LETTER OMEGA WITH DASIA, GREEK SMALL LETTER OMEGA WITH DASIA +test(0x1F6A, 0x1F62); // GREEK CAPITAL LETTER OMEGA WITH PSILI AND VARIA, GREEK SMALL LETTER OMEGA WITH PSILI AND VARIA +test(0x1F6B, 0x1F63); // GREEK CAPITAL LETTER OMEGA WITH DASIA AND VARIA, GREEK SMALL LETTER OMEGA WITH DASIA AND VARIA +test(0x1F6C, 0x1F64); // GREEK CAPITAL LETTER OMEGA WITH PSILI AND OXIA, GREEK SMALL LETTER OMEGA WITH PSILI AND OXIA +test(0x1F6D, 0x1F65); // GREEK CAPITAL LETTER OMEGA WITH DASIA AND OXIA, GREEK SMALL LETTER OMEGA WITH DASIA AND OXIA +test(0x1F6E, 0x1F66); // GREEK CAPITAL LETTER OMEGA WITH PSILI AND PERISPOMENI, GREEK SMALL LETTER OMEGA WITH PSILI AND PERISPOMENI +test(0x1F6F, 0x1F67); // GREEK CAPITAL LETTER OMEGA WITH DASIA AND PERISPOMENI, GREEK SMALL LETTER OMEGA WITH DASIA AND PERISPOMENI +test(0x1F70, 0x1FBA); // GREEK SMALL LETTER ALPHA WITH VARIA, GREEK CAPITAL LETTER ALPHA WITH VARIA +test(0x1F71, 0x1FBB); // GREEK SMALL LETTER ALPHA WITH OXIA, GREEK CAPITAL LETTER ALPHA WITH OXIA +test(0x1F72, 0x1FC8); // GREEK SMALL LETTER EPSILON WITH VARIA, GREEK CAPITAL LETTER EPSILON WITH VARIA +test(0x1F73, 0x1FC9); // GREEK SMALL LETTER EPSILON WITH OXIA, GREEK CAPITAL LETTER EPSILON WITH OXIA +test(0x1F74, 0x1FCA); // GREEK SMALL LETTER ETA WITH VARIA, GREEK CAPITAL LETTER ETA WITH VARIA +test(0x1F75, 0x1FCB); // GREEK SMALL LETTER ETA WITH OXIA, GREEK CAPITAL LETTER ETA WITH OXIA +test(0x1F76, 0x1FDA); // GREEK SMALL LETTER IOTA WITH VARIA, GREEK CAPITAL LETTER IOTA WITH VARIA +test(0x1F77, 0x1FDB); // GREEK SMALL LETTER IOTA WITH OXIA, GREEK CAPITAL LETTER IOTA WITH OXIA +test(0x1F78, 0x1FF8); // GREEK SMALL LETTER OMICRON WITH VARIA, GREEK CAPITAL LETTER OMICRON WITH VARIA +test(0x1F79, 0x1FF9); // GREEK SMALL LETTER OMICRON WITH OXIA, GREEK CAPITAL LETTER OMICRON WITH OXIA +test(0x1F7A, 0x1FEA); // GREEK SMALL LETTER UPSILON WITH VARIA, GREEK CAPITAL LETTER UPSILON WITH VARIA +test(0x1F7B, 0x1FEB); // GREEK SMALL LETTER UPSILON WITH OXIA, GREEK CAPITAL LETTER UPSILON WITH OXIA +test(0x1F7C, 0x1FFA); // GREEK SMALL LETTER OMEGA WITH VARIA, GREEK CAPITAL LETTER OMEGA WITH VARIA +test(0x1F7D, 0x1FFB); // GREEK SMALL LETTER OMEGA WITH OXIA, GREEK CAPITAL LETTER OMEGA WITH OXIA +test(0x1F80, 0x1F88); // GREEK SMALL LETTER ALPHA WITH PSILI AND YPOGEGRAMMENI, GREEK CAPITAL LETTER ALPHA WITH PSILI AND PROSGEGRAMMENI +test(0x1F81, 0x1F89); // GREEK SMALL LETTER ALPHA WITH DASIA AND YPOGEGRAMMENI, GREEK CAPITAL LETTER ALPHA WITH DASIA AND PROSGEGRAMMENI +test(0x1F82, 0x1F8A); // GREEK SMALL LETTER ALPHA WITH PSILI AND VARIA AND YPOGEGRAMMENI, GREEK CAPITAL LETTER ALPHA WITH PSILI AND VARIA AND PROSGEGRAMMENI +test(0x1F83, 0x1F8B); // GREEK SMALL LETTER ALPHA WITH DASIA AND VARIA AND YPOGEGRAMMENI, GREEK CAPITAL LETTER ALPHA WITH DASIA AND VARIA AND PROSGEGRAMMENI +test(0x1F84, 0x1F8C); // GREEK SMALL LETTER ALPHA WITH PSILI AND OXIA AND YPOGEGRAMMENI, GREEK CAPITAL LETTER ALPHA WITH PSILI AND OXIA AND PROSGEGRAMMENI +test(0x1F85, 0x1F8D); // GREEK SMALL LETTER ALPHA WITH DASIA AND OXIA AND YPOGEGRAMMENI, GREEK CAPITAL LETTER ALPHA WITH DASIA AND OXIA AND PROSGEGRAMMENI +test(0x1F86, 0x1F8E); // GREEK SMALL LETTER ALPHA WITH PSILI AND PERISPOMENI AND YPOGEGRAMMENI, GREEK CAPITAL LETTER ALPHA WITH PSILI AND PERISPOMENI AND PROSGEGRAMMENI +test(0x1F87, 0x1F8F); // GREEK SMALL LETTER ALPHA WITH DASIA AND PERISPOMENI AND YPOGEGRAMMENI, GREEK CAPITAL LETTER ALPHA WITH DASIA AND PERISPOMENI AND PROSGEGRAMMENI +test(0x1F88, 0x1F80); // GREEK CAPITAL LETTER ALPHA WITH PSILI AND PROSGEGRAMMENI, GREEK SMALL LETTER ALPHA WITH PSILI AND YPOGEGRAMMENI +test(0x1F89, 0x1F81); // GREEK CAPITAL LETTER ALPHA WITH DASIA AND PROSGEGRAMMENI, GREEK SMALL LETTER ALPHA WITH DASIA AND YPOGEGRAMMENI +test(0x1F8A, 0x1F82); // GREEK CAPITAL LETTER ALPHA WITH PSILI AND VARIA AND PROSGEGRAMMENI, GREEK SMALL LETTER ALPHA WITH PSILI AND VARIA AND YPOGEGRAMMENI +test(0x1F8B, 0x1F83); // GREEK CAPITAL LETTER ALPHA WITH DASIA AND VARIA AND PROSGEGRAMMENI, GREEK SMALL LETTER ALPHA WITH DASIA AND VARIA AND YPOGEGRAMMENI +test(0x1F8C, 0x1F84); // GREEK CAPITAL LETTER ALPHA WITH PSILI AND OXIA AND PROSGEGRAMMENI, GREEK SMALL LETTER ALPHA WITH PSILI AND OXIA AND YPOGEGRAMMENI +test(0x1F8D, 0x1F85); // GREEK CAPITAL LETTER ALPHA WITH DASIA AND OXIA AND PROSGEGRAMMENI, GREEK SMALL LETTER ALPHA WITH DASIA AND OXIA AND YPOGEGRAMMENI +test(0x1F8E, 0x1F86); // GREEK CAPITAL LETTER ALPHA WITH PSILI AND PERISPOMENI AND PROSGEGRAMMENI, GREEK SMALL LETTER ALPHA WITH PSILI AND PERISPOMENI AND YPOGEGRAMMENI +test(0x1F8F, 0x1F87); // GREEK CAPITAL LETTER ALPHA WITH DASIA AND PERISPOMENI AND PROSGEGRAMMENI, GREEK SMALL LETTER ALPHA WITH DASIA AND PERISPOMENI AND YPOGEGRAMMENI +test(0x1F90, 0x1F98); // GREEK SMALL LETTER ETA WITH PSILI AND YPOGEGRAMMENI, GREEK CAPITAL LETTER ETA WITH PSILI AND PROSGEGRAMMENI +test(0x1F91, 0x1F99); // GREEK SMALL LETTER ETA WITH DASIA AND YPOGEGRAMMENI, GREEK CAPITAL LETTER ETA WITH DASIA AND PROSGEGRAMMENI +test(0x1F92, 0x1F9A); // GREEK SMALL LETTER ETA WITH PSILI AND VARIA AND YPOGEGRAMMENI, GREEK CAPITAL LETTER ETA WITH PSILI AND VARIA AND PROSGEGRAMMENI +test(0x1F93, 0x1F9B); // GREEK SMALL LETTER ETA WITH DASIA AND VARIA AND YPOGEGRAMMENI, GREEK CAPITAL LETTER ETA WITH DASIA AND VARIA AND PROSGEGRAMMENI +test(0x1F94, 0x1F9C); // GREEK SMALL LETTER ETA WITH PSILI AND OXIA AND YPOGEGRAMMENI, GREEK CAPITAL LETTER ETA WITH PSILI AND OXIA AND PROSGEGRAMMENI +test(0x1F95, 0x1F9D); // GREEK SMALL LETTER ETA WITH DASIA AND OXIA AND YPOGEGRAMMENI, GREEK CAPITAL LETTER ETA WITH DASIA AND OXIA AND PROSGEGRAMMENI +test(0x1F96, 0x1F9E); // GREEK SMALL LETTER ETA WITH PSILI AND PERISPOMENI AND YPOGEGRAMMENI, GREEK CAPITAL LETTER ETA WITH PSILI AND PERISPOMENI AND PROSGEGRAMMENI +test(0x1F97, 0x1F9F); // GREEK SMALL LETTER ETA WITH DASIA AND PERISPOMENI AND YPOGEGRAMMENI, GREEK CAPITAL LETTER ETA WITH DASIA AND PERISPOMENI AND PROSGEGRAMMENI +test(0x1F98, 0x1F90); // GREEK CAPITAL LETTER ETA WITH PSILI AND PROSGEGRAMMENI, GREEK SMALL LETTER ETA WITH PSILI AND YPOGEGRAMMENI +test(0x1F99, 0x1F91); // GREEK CAPITAL LETTER ETA WITH DASIA AND PROSGEGRAMMENI, GREEK SMALL LETTER ETA WITH DASIA AND YPOGEGRAMMENI +test(0x1F9A, 0x1F92); // GREEK CAPITAL LETTER ETA WITH PSILI AND VARIA AND PROSGEGRAMMENI, GREEK SMALL LETTER ETA WITH PSILI AND VARIA AND YPOGEGRAMMENI +test(0x1F9B, 0x1F93); // GREEK CAPITAL LETTER ETA WITH DASIA AND VARIA AND PROSGEGRAMMENI, GREEK SMALL LETTER ETA WITH DASIA AND VARIA AND YPOGEGRAMMENI +test(0x1F9C, 0x1F94); // GREEK CAPITAL LETTER ETA WITH PSILI AND OXIA AND PROSGEGRAMMENI, GREEK SMALL LETTER ETA WITH PSILI AND OXIA AND YPOGEGRAMMENI +test(0x1F9D, 0x1F95); // GREEK CAPITAL LETTER ETA WITH DASIA AND OXIA AND PROSGEGRAMMENI, GREEK SMALL LETTER ETA WITH DASIA AND OXIA AND YPOGEGRAMMENI +test(0x1F9E, 0x1F96); // GREEK CAPITAL LETTER ETA WITH PSILI AND PERISPOMENI AND PROSGEGRAMMENI, GREEK SMALL LETTER ETA WITH PSILI AND PERISPOMENI AND YPOGEGRAMMENI +test(0x1F9F, 0x1F97); // GREEK CAPITAL LETTER ETA WITH DASIA AND PERISPOMENI AND PROSGEGRAMMENI, GREEK SMALL LETTER ETA WITH DASIA AND PERISPOMENI AND YPOGEGRAMMENI +test(0x1FA0, 0x1FA8); // GREEK SMALL LETTER OMEGA WITH PSILI AND YPOGEGRAMMENI, GREEK CAPITAL LETTER OMEGA WITH PSILI AND PROSGEGRAMMENI +test(0x1FA1, 0x1FA9); // GREEK SMALL LETTER OMEGA WITH DASIA AND YPOGEGRAMMENI, GREEK CAPITAL LETTER OMEGA WITH DASIA AND PROSGEGRAMMENI +test(0x1FA2, 0x1FAA); // GREEK SMALL LETTER OMEGA WITH PSILI AND VARIA AND YPOGEGRAMMENI, GREEK CAPITAL LETTER OMEGA WITH PSILI AND VARIA AND PROSGEGRAMMENI +test(0x1FA3, 0x1FAB); // GREEK SMALL LETTER OMEGA WITH DASIA AND VARIA AND YPOGEGRAMMENI, GREEK CAPITAL LETTER OMEGA WITH DASIA AND VARIA AND PROSGEGRAMMENI +test(0x1FA4, 0x1FAC); // GREEK SMALL LETTER OMEGA WITH PSILI AND OXIA AND YPOGEGRAMMENI, GREEK CAPITAL LETTER OMEGA WITH PSILI AND OXIA AND PROSGEGRAMMENI +test(0x1FA5, 0x1FAD); // GREEK SMALL LETTER OMEGA WITH DASIA AND OXIA AND YPOGEGRAMMENI, GREEK CAPITAL LETTER OMEGA WITH DASIA AND OXIA AND PROSGEGRAMMENI +test(0x1FA6, 0x1FAE); // GREEK SMALL LETTER OMEGA WITH PSILI AND PERISPOMENI AND YPOGEGRAMMENI, GREEK CAPITAL LETTER OMEGA WITH PSILI AND PERISPOMENI AND PROSGEGRAMMENI +test(0x1FA7, 0x1FAF); // GREEK SMALL LETTER OMEGA WITH DASIA AND PERISPOMENI AND YPOGEGRAMMENI, GREEK CAPITAL LETTER OMEGA WITH DASIA AND PERISPOMENI AND PROSGEGRAMMENI +test(0x1FA8, 0x1FA0); // GREEK CAPITAL LETTER OMEGA WITH PSILI AND PROSGEGRAMMENI, GREEK SMALL LETTER OMEGA WITH PSILI AND YPOGEGRAMMENI +test(0x1FA9, 0x1FA1); // GREEK CAPITAL LETTER OMEGA WITH DASIA AND PROSGEGRAMMENI, GREEK SMALL LETTER OMEGA WITH DASIA AND YPOGEGRAMMENI +test(0x1FAA, 0x1FA2); // GREEK CAPITAL LETTER OMEGA WITH PSILI AND VARIA AND PROSGEGRAMMENI, GREEK SMALL LETTER OMEGA WITH PSILI AND VARIA AND YPOGEGRAMMENI +test(0x1FAB, 0x1FA3); // GREEK CAPITAL LETTER OMEGA WITH DASIA AND VARIA AND PROSGEGRAMMENI, GREEK SMALL LETTER OMEGA WITH DASIA AND VARIA AND YPOGEGRAMMENI +test(0x1FAC, 0x1FA4); // GREEK CAPITAL LETTER OMEGA WITH PSILI AND OXIA AND PROSGEGRAMMENI, GREEK SMALL LETTER OMEGA WITH PSILI AND OXIA AND YPOGEGRAMMENI +test(0x1FAD, 0x1FA5); // GREEK CAPITAL LETTER OMEGA WITH DASIA AND OXIA AND PROSGEGRAMMENI, GREEK SMALL LETTER OMEGA WITH DASIA AND OXIA AND YPOGEGRAMMENI +test(0x1FAE, 0x1FA6); // GREEK CAPITAL LETTER OMEGA WITH PSILI AND PERISPOMENI AND PROSGEGRAMMENI, GREEK SMALL LETTER OMEGA WITH PSILI AND PERISPOMENI AND YPOGEGRAMMENI +test(0x1FAF, 0x1FA7); // GREEK CAPITAL LETTER OMEGA WITH DASIA AND PERISPOMENI AND PROSGEGRAMMENI, GREEK SMALL LETTER OMEGA WITH DASIA AND PERISPOMENI AND YPOGEGRAMMENI +test(0x1FB0, 0x1FB8); // GREEK SMALL LETTER ALPHA WITH VRACHY, GREEK CAPITAL LETTER ALPHA WITH VRACHY +test(0x1FB1, 0x1FB9); // GREEK SMALL LETTER ALPHA WITH MACRON, GREEK CAPITAL LETTER ALPHA WITH MACRON +test(0x1FB3, 0x1FBC); // GREEK SMALL LETTER ALPHA WITH YPOGEGRAMMENI, GREEK CAPITAL LETTER ALPHA WITH PROSGEGRAMMENI +test(0x1FB8, 0x1FB0); // GREEK CAPITAL LETTER ALPHA WITH VRACHY, GREEK SMALL LETTER ALPHA WITH VRACHY +test(0x1FB9, 0x1FB1); // GREEK CAPITAL LETTER ALPHA WITH MACRON, GREEK SMALL LETTER ALPHA WITH MACRON +test(0x1FBA, 0x1F70); // GREEK CAPITAL LETTER ALPHA WITH VARIA, GREEK SMALL LETTER ALPHA WITH VARIA +test(0x1FBB, 0x1F71); // GREEK CAPITAL LETTER ALPHA WITH OXIA, GREEK SMALL LETTER ALPHA WITH OXIA +test(0x1FBC, 0x1FB3); // GREEK CAPITAL LETTER ALPHA WITH PROSGEGRAMMENI, GREEK SMALL LETTER ALPHA WITH YPOGEGRAMMENI +test(0x1FBE, 0x03B9, 0x0345, 0x0399); // GREEK PROSGEGRAMMENI, GREEK SMALL LETTER IOTA, COMBINING GREEK YPOGEGRAMMENI (GREEK NON-SPACING IOTA BELOW), GREEK CAPITAL LETTER IOTA +test(0x1FC3, 0x1FCC); // GREEK SMALL LETTER ETA WITH YPOGEGRAMMENI, GREEK CAPITAL LETTER ETA WITH PROSGEGRAMMENI +test(0x1FC8, 0x1F72); // GREEK CAPITAL LETTER EPSILON WITH VARIA, GREEK SMALL LETTER EPSILON WITH VARIA +test(0x1FC9, 0x1F73); // GREEK CAPITAL LETTER EPSILON WITH OXIA, GREEK SMALL LETTER EPSILON WITH OXIA +test(0x1FCA, 0x1F74); // GREEK CAPITAL LETTER ETA WITH VARIA, GREEK SMALL LETTER ETA WITH VARIA +test(0x1FCB, 0x1F75); // GREEK CAPITAL LETTER ETA WITH OXIA, GREEK SMALL LETTER ETA WITH OXIA +test(0x1FCC, 0x1FC3); // GREEK CAPITAL LETTER ETA WITH PROSGEGRAMMENI, GREEK SMALL LETTER ETA WITH YPOGEGRAMMENI +test(0x1FD0, 0x1FD8); // GREEK SMALL LETTER IOTA WITH VRACHY, GREEK CAPITAL LETTER IOTA WITH VRACHY +test(0x1FD1, 0x1FD9); // GREEK SMALL LETTER IOTA WITH MACRON, GREEK CAPITAL LETTER IOTA WITH MACRON +test(0x1FD8, 0x1FD0); // GREEK CAPITAL LETTER IOTA WITH VRACHY, GREEK SMALL LETTER IOTA WITH VRACHY +test(0x1FD9, 0x1FD1); // GREEK CAPITAL LETTER IOTA WITH MACRON, GREEK SMALL LETTER IOTA WITH MACRON +test(0x1FDA, 0x1F76); // GREEK CAPITAL LETTER IOTA WITH VARIA, GREEK SMALL LETTER IOTA WITH VARIA +test(0x1FDB, 0x1F77); // GREEK CAPITAL LETTER IOTA WITH OXIA, GREEK SMALL LETTER IOTA WITH OXIA +test(0x1FE0, 0x1FE8); // GREEK SMALL LETTER UPSILON WITH VRACHY, GREEK CAPITAL LETTER UPSILON WITH VRACHY +test(0x1FE1, 0x1FE9); // GREEK SMALL LETTER UPSILON WITH MACRON, GREEK CAPITAL LETTER UPSILON WITH MACRON +test(0x1FE5, 0x1FEC); // GREEK SMALL LETTER RHO WITH DASIA, GREEK CAPITAL LETTER RHO WITH DASIA +test(0x1FE8, 0x1FE0); // GREEK CAPITAL LETTER UPSILON WITH VRACHY, GREEK SMALL LETTER UPSILON WITH VRACHY +test(0x1FE9, 0x1FE1); // GREEK CAPITAL LETTER UPSILON WITH MACRON, GREEK SMALL LETTER UPSILON WITH MACRON +test(0x1FEA, 0x1F7A); // GREEK CAPITAL LETTER UPSILON WITH VARIA, GREEK SMALL LETTER UPSILON WITH VARIA +test(0x1FEB, 0x1F7B); // GREEK CAPITAL LETTER UPSILON WITH OXIA, GREEK SMALL LETTER UPSILON WITH OXIA +test(0x1FEC, 0x1FE5); // GREEK CAPITAL LETTER RHO WITH DASIA, GREEK SMALL LETTER RHO WITH DASIA +test(0x1FF3, 0x1FFC); // GREEK SMALL LETTER OMEGA WITH YPOGEGRAMMENI, GREEK CAPITAL LETTER OMEGA WITH PROSGEGRAMMENI +test(0x1FF8, 0x1F78); // GREEK CAPITAL LETTER OMICRON WITH VARIA, GREEK SMALL LETTER OMICRON WITH VARIA +test(0x1FF9, 0x1F79); // GREEK CAPITAL LETTER OMICRON WITH OXIA, GREEK SMALL LETTER OMICRON WITH OXIA +test(0x1FFA, 0x1F7C); // GREEK CAPITAL LETTER OMEGA WITH VARIA, GREEK SMALL LETTER OMEGA WITH VARIA +test(0x1FFB, 0x1F7D); // GREEK CAPITAL LETTER OMEGA WITH OXIA, GREEK SMALL LETTER OMEGA WITH OXIA +test(0x1FFC, 0x1FF3); // GREEK CAPITAL LETTER OMEGA WITH PROSGEGRAMMENI, GREEK SMALL LETTER OMEGA WITH YPOGEGRAMMENI +test(0x2126, 0x03C9, 0x03A9); // OHM SIGN (OHM), GREEK SMALL LETTER OMEGA, GREEK CAPITAL LETTER OMEGA +test(0x212A, 0x006B, 0x004B); // KELVIN SIGN (DEGREES KELVIN), LATIN SMALL LETTER K, LATIN CAPITAL LETTER K +test(0x212B, 0x00E5, 0x00C5); // ANGSTROM SIGN (ANGSTROM UNIT), LATIN SMALL LETTER A WITH RING ABOVE (LATIN SMALL LETTER A RING), LATIN CAPITAL LETTER A WITH RING ABOVE (LATIN CAPITAL LETTER A RING) +test(0x2132, 0x214E); // TURNED CAPITAL F (TURNED F), TURNED SMALL F +test(0x214E, 0x2132); // TURNED SMALL F, TURNED CAPITAL F (TURNED F) +test(0x2160, 0x2170); // ROMAN NUMERAL ONE, SMALL ROMAN NUMERAL ONE +test(0x2161, 0x2171); // ROMAN NUMERAL TWO, SMALL ROMAN NUMERAL TWO +test(0x2162, 0x2172); // ROMAN NUMERAL THREE, SMALL ROMAN NUMERAL THREE +test(0x2163, 0x2173); // ROMAN NUMERAL FOUR, SMALL ROMAN NUMERAL FOUR +test(0x2164, 0x2174); // ROMAN NUMERAL FIVE, SMALL ROMAN NUMERAL FIVE +test(0x2165, 0x2175); // ROMAN NUMERAL SIX, SMALL ROMAN NUMERAL SIX +test(0x2166, 0x2176); // ROMAN NUMERAL SEVEN, SMALL ROMAN NUMERAL SEVEN +test(0x2167, 0x2177); // ROMAN NUMERAL EIGHT, SMALL ROMAN NUMERAL EIGHT +test(0x2168, 0x2178); // ROMAN NUMERAL NINE, SMALL ROMAN NUMERAL NINE +test(0x2169, 0x2179); // ROMAN NUMERAL TEN, SMALL ROMAN NUMERAL TEN +test(0x216A, 0x217A); // ROMAN NUMERAL ELEVEN, SMALL ROMAN NUMERAL ELEVEN +test(0x216B, 0x217B); // ROMAN NUMERAL TWELVE, SMALL ROMAN NUMERAL TWELVE +test(0x216C, 0x217C); // ROMAN NUMERAL FIFTY, SMALL ROMAN NUMERAL FIFTY +test(0x216D, 0x217D); // ROMAN NUMERAL ONE HUNDRED, SMALL ROMAN NUMERAL ONE HUNDRED +test(0x216E, 0x217E); // ROMAN NUMERAL FIVE HUNDRED, SMALL ROMAN NUMERAL FIVE HUNDRED +test(0x216F, 0x217F); // ROMAN NUMERAL ONE THOUSAND, SMALL ROMAN NUMERAL ONE THOUSAND +test(0x2170, 0x2160); // SMALL ROMAN NUMERAL ONE, ROMAN NUMERAL ONE +test(0x2171, 0x2161); // SMALL ROMAN NUMERAL TWO, ROMAN NUMERAL TWO +test(0x2172, 0x2162); // SMALL ROMAN NUMERAL THREE, ROMAN NUMERAL THREE +test(0x2173, 0x2163); // SMALL ROMAN NUMERAL FOUR, ROMAN NUMERAL FOUR +test(0x2174, 0x2164); // SMALL ROMAN NUMERAL FIVE, ROMAN NUMERAL FIVE +test(0x2175, 0x2165); // SMALL ROMAN NUMERAL SIX, ROMAN NUMERAL SIX +test(0x2176, 0x2166); // SMALL ROMAN NUMERAL SEVEN, ROMAN NUMERAL SEVEN +test(0x2177, 0x2167); // SMALL ROMAN NUMERAL EIGHT, ROMAN NUMERAL EIGHT +test(0x2178, 0x2168); // SMALL ROMAN NUMERAL NINE, ROMAN NUMERAL NINE +test(0x2179, 0x2169); // SMALL ROMAN NUMERAL TEN, ROMAN NUMERAL TEN +test(0x217A, 0x216A); // SMALL ROMAN NUMERAL ELEVEN, ROMAN NUMERAL ELEVEN +test(0x217B, 0x216B); // SMALL ROMAN NUMERAL TWELVE, ROMAN NUMERAL TWELVE +test(0x217C, 0x216C); // SMALL ROMAN NUMERAL FIFTY, ROMAN NUMERAL FIFTY +test(0x217D, 0x216D); // SMALL ROMAN NUMERAL ONE HUNDRED, ROMAN NUMERAL ONE HUNDRED +test(0x217E, 0x216E); // SMALL ROMAN NUMERAL FIVE HUNDRED, ROMAN NUMERAL FIVE HUNDRED +test(0x217F, 0x216F); // SMALL ROMAN NUMERAL ONE THOUSAND, ROMAN NUMERAL ONE THOUSAND +test(0x2183, 0x2184); // ROMAN NUMERAL REVERSED ONE HUNDRED, LATIN SMALL LETTER REVERSED C +test(0x2184, 0x2183); // LATIN SMALL LETTER REVERSED C, ROMAN NUMERAL REVERSED ONE HUNDRED +test(0x24B6, 0x24D0); // CIRCLED LATIN CAPITAL LETTER A, CIRCLED LATIN SMALL LETTER A +test(0x24B7, 0x24D1); // CIRCLED LATIN CAPITAL LETTER B, CIRCLED LATIN SMALL LETTER B +test(0x24B8, 0x24D2); // CIRCLED LATIN CAPITAL LETTER C, CIRCLED LATIN SMALL LETTER C +test(0x24B9, 0x24D3); // CIRCLED LATIN CAPITAL LETTER D, CIRCLED LATIN SMALL LETTER D +test(0x24BA, 0x24D4); // CIRCLED LATIN CAPITAL LETTER E, CIRCLED LATIN SMALL LETTER E +test(0x24BB, 0x24D5); // CIRCLED LATIN CAPITAL LETTER F, CIRCLED LATIN SMALL LETTER F +test(0x24BC, 0x24D6); // CIRCLED LATIN CAPITAL LETTER G, CIRCLED LATIN SMALL LETTER G +test(0x24BD, 0x24D7); // CIRCLED LATIN CAPITAL LETTER H, CIRCLED LATIN SMALL LETTER H +test(0x24BE, 0x24D8); // CIRCLED LATIN CAPITAL LETTER I, CIRCLED LATIN SMALL LETTER I +test(0x24BF, 0x24D9); // CIRCLED LATIN CAPITAL LETTER J, CIRCLED LATIN SMALL LETTER J +test(0x24C0, 0x24DA); // CIRCLED LATIN CAPITAL LETTER K, CIRCLED LATIN SMALL LETTER K +test(0x24C1, 0x24DB); // CIRCLED LATIN CAPITAL LETTER L, CIRCLED LATIN SMALL LETTER L +test(0x24C2, 0x24DC); // CIRCLED LATIN CAPITAL LETTER M, CIRCLED LATIN SMALL LETTER M +test(0x24C3, 0x24DD); // CIRCLED LATIN CAPITAL LETTER N, CIRCLED LATIN SMALL LETTER N +test(0x24C4, 0x24DE); // CIRCLED LATIN CAPITAL LETTER O, CIRCLED LATIN SMALL LETTER O +test(0x24C5, 0x24DF); // CIRCLED LATIN CAPITAL LETTER P, CIRCLED LATIN SMALL LETTER P +test(0x24C6, 0x24E0); // CIRCLED LATIN CAPITAL LETTER Q, CIRCLED LATIN SMALL LETTER Q +test(0x24C7, 0x24E1); // CIRCLED LATIN CAPITAL LETTER R, CIRCLED LATIN SMALL LETTER R +test(0x24C8, 0x24E2); // CIRCLED LATIN CAPITAL LETTER S, CIRCLED LATIN SMALL LETTER S +test(0x24C9, 0x24E3); // CIRCLED LATIN CAPITAL LETTER T, CIRCLED LATIN SMALL LETTER T +test(0x24CA, 0x24E4); // CIRCLED LATIN CAPITAL LETTER U, CIRCLED LATIN SMALL LETTER U +test(0x24CB, 0x24E5); // CIRCLED LATIN CAPITAL LETTER V, CIRCLED LATIN SMALL LETTER V +test(0x24CC, 0x24E6); // CIRCLED LATIN CAPITAL LETTER W, CIRCLED LATIN SMALL LETTER W +test(0x24CD, 0x24E7); // CIRCLED LATIN CAPITAL LETTER X, CIRCLED LATIN SMALL LETTER X +test(0x24CE, 0x24E8); // CIRCLED LATIN CAPITAL LETTER Y, CIRCLED LATIN SMALL LETTER Y +test(0x24CF, 0x24E9); // CIRCLED LATIN CAPITAL LETTER Z, CIRCLED LATIN SMALL LETTER Z +test(0x24D0, 0x24B6); // CIRCLED LATIN SMALL LETTER A, CIRCLED LATIN CAPITAL LETTER A +test(0x24D1, 0x24B7); // CIRCLED LATIN SMALL LETTER B, CIRCLED LATIN CAPITAL LETTER B +test(0x24D2, 0x24B8); // CIRCLED LATIN SMALL LETTER C, CIRCLED LATIN CAPITAL LETTER C +test(0x24D3, 0x24B9); // CIRCLED LATIN SMALL LETTER D, CIRCLED LATIN CAPITAL LETTER D +test(0x24D4, 0x24BA); // CIRCLED LATIN SMALL LETTER E, CIRCLED LATIN CAPITAL LETTER E +test(0x24D5, 0x24BB); // CIRCLED LATIN SMALL LETTER F, CIRCLED LATIN CAPITAL LETTER F +test(0x24D6, 0x24BC); // CIRCLED LATIN SMALL LETTER G, CIRCLED LATIN CAPITAL LETTER G +test(0x24D7, 0x24BD); // CIRCLED LATIN SMALL LETTER H, CIRCLED LATIN CAPITAL LETTER H +test(0x24D8, 0x24BE); // CIRCLED LATIN SMALL LETTER I, CIRCLED LATIN CAPITAL LETTER I +test(0x24D9, 0x24BF); // CIRCLED LATIN SMALL LETTER J, CIRCLED LATIN CAPITAL LETTER J +test(0x24DA, 0x24C0); // CIRCLED LATIN SMALL LETTER K, CIRCLED LATIN CAPITAL LETTER K +test(0x24DB, 0x24C1); // CIRCLED LATIN SMALL LETTER L, CIRCLED LATIN CAPITAL LETTER L +test(0x24DC, 0x24C2); // CIRCLED LATIN SMALL LETTER M, CIRCLED LATIN CAPITAL LETTER M +test(0x24DD, 0x24C3); // CIRCLED LATIN SMALL LETTER N, CIRCLED LATIN CAPITAL LETTER N +test(0x24DE, 0x24C4); // CIRCLED LATIN SMALL LETTER O, CIRCLED LATIN CAPITAL LETTER O +test(0x24DF, 0x24C5); // CIRCLED LATIN SMALL LETTER P, CIRCLED LATIN CAPITAL LETTER P +test(0x24E0, 0x24C6); // CIRCLED LATIN SMALL LETTER Q, CIRCLED LATIN CAPITAL LETTER Q +test(0x24E1, 0x24C7); // CIRCLED LATIN SMALL LETTER R, CIRCLED LATIN CAPITAL LETTER R +test(0x24E2, 0x24C8); // CIRCLED LATIN SMALL LETTER S, CIRCLED LATIN CAPITAL LETTER S +test(0x24E3, 0x24C9); // CIRCLED LATIN SMALL LETTER T, CIRCLED LATIN CAPITAL LETTER T +test(0x24E4, 0x24CA); // CIRCLED LATIN SMALL LETTER U, CIRCLED LATIN CAPITAL LETTER U +test(0x24E5, 0x24CB); // CIRCLED LATIN SMALL LETTER V, CIRCLED LATIN CAPITAL LETTER V +test(0x24E6, 0x24CC); // CIRCLED LATIN SMALL LETTER W, CIRCLED LATIN CAPITAL LETTER W +test(0x24E7, 0x24CD); // CIRCLED LATIN SMALL LETTER X, CIRCLED LATIN CAPITAL LETTER X +test(0x24E8, 0x24CE); // CIRCLED LATIN SMALL LETTER Y, CIRCLED LATIN CAPITAL LETTER Y +test(0x24E9, 0x24CF); // CIRCLED LATIN SMALL LETTER Z, CIRCLED LATIN CAPITAL LETTER Z +test(0x2C00, 0x2C30); // GLAGOLITIC CAPITAL LETTER AZU, GLAGOLITIC SMALL LETTER AZU +test(0x2C01, 0x2C31); // GLAGOLITIC CAPITAL LETTER BUKY, GLAGOLITIC SMALL LETTER BUKY +test(0x2C02, 0x2C32); // GLAGOLITIC CAPITAL LETTER VEDE, GLAGOLITIC SMALL LETTER VEDE +test(0x2C03, 0x2C33); // GLAGOLITIC CAPITAL LETTER GLAGOLI, GLAGOLITIC SMALL LETTER GLAGOLI +test(0x2C04, 0x2C34); // GLAGOLITIC CAPITAL LETTER DOBRO, GLAGOLITIC SMALL LETTER DOBRO +test(0x2C05, 0x2C35); // GLAGOLITIC CAPITAL LETTER YESTU, GLAGOLITIC SMALL LETTER YESTU +test(0x2C06, 0x2C36); // GLAGOLITIC CAPITAL LETTER ZHIVETE, GLAGOLITIC SMALL LETTER ZHIVETE +test(0x2C07, 0x2C37); // GLAGOLITIC CAPITAL LETTER DZELO, GLAGOLITIC SMALL LETTER DZELO +test(0x2C08, 0x2C38); // GLAGOLITIC CAPITAL LETTER ZEMLJA, GLAGOLITIC SMALL LETTER ZEMLJA +test(0x2C09, 0x2C39); // GLAGOLITIC CAPITAL LETTER IZHE, GLAGOLITIC SMALL LETTER IZHE +test(0x2C0A, 0x2C3A); // GLAGOLITIC CAPITAL LETTER INITIAL IZHE, GLAGOLITIC SMALL LETTER INITIAL IZHE +test(0x2C0B, 0x2C3B); // GLAGOLITIC CAPITAL LETTER I, GLAGOLITIC SMALL LETTER I +test(0x2C0C, 0x2C3C); // GLAGOLITIC CAPITAL LETTER DJERVI, GLAGOLITIC SMALL LETTER DJERVI +test(0x2C0D, 0x2C3D); // GLAGOLITIC CAPITAL LETTER KAKO, GLAGOLITIC SMALL LETTER KAKO +test(0x2C0E, 0x2C3E); // GLAGOLITIC CAPITAL LETTER LJUDIJE, GLAGOLITIC SMALL LETTER LJUDIJE +test(0x2C0F, 0x2C3F); // GLAGOLITIC CAPITAL LETTER MYSLITE, GLAGOLITIC SMALL LETTER MYSLITE +test(0x2C10, 0x2C40); // GLAGOLITIC CAPITAL LETTER NASHI, GLAGOLITIC SMALL LETTER NASHI +test(0x2C11, 0x2C41); // GLAGOLITIC CAPITAL LETTER ONU, GLAGOLITIC SMALL LETTER ONU +test(0x2C12, 0x2C42); // GLAGOLITIC CAPITAL LETTER POKOJI, GLAGOLITIC SMALL LETTER POKOJI +test(0x2C13, 0x2C43); // GLAGOLITIC CAPITAL LETTER RITSI, GLAGOLITIC SMALL LETTER RITSI +test(0x2C14, 0x2C44); // GLAGOLITIC CAPITAL LETTER SLOVO, GLAGOLITIC SMALL LETTER SLOVO +test(0x2C15, 0x2C45); // GLAGOLITIC CAPITAL LETTER TVRIDO, GLAGOLITIC SMALL LETTER TVRIDO +test(0x2C16, 0x2C46); // GLAGOLITIC CAPITAL LETTER UKU, GLAGOLITIC SMALL LETTER UKU +test(0x2C17, 0x2C47); // GLAGOLITIC CAPITAL LETTER FRITU, GLAGOLITIC SMALL LETTER FRITU +test(0x2C18, 0x2C48); // GLAGOLITIC CAPITAL LETTER HERU, GLAGOLITIC SMALL LETTER HERU +test(0x2C19, 0x2C49); // GLAGOLITIC CAPITAL LETTER OTU, GLAGOLITIC SMALL LETTER OTU +test(0x2C1A, 0x2C4A); // GLAGOLITIC CAPITAL LETTER PE, GLAGOLITIC SMALL LETTER PE +test(0x2C1B, 0x2C4B); // GLAGOLITIC CAPITAL LETTER SHTA, GLAGOLITIC SMALL LETTER SHTA +test(0x2C1C, 0x2C4C); // GLAGOLITIC CAPITAL LETTER TSI, GLAGOLITIC SMALL LETTER TSI +test(0x2C1D, 0x2C4D); // GLAGOLITIC CAPITAL LETTER CHRIVI, GLAGOLITIC SMALL LETTER CHRIVI +test(0x2C1E, 0x2C4E); // GLAGOLITIC CAPITAL LETTER SHA, GLAGOLITIC SMALL LETTER SHA +test(0x2C1F, 0x2C4F); // GLAGOLITIC CAPITAL LETTER YERU, GLAGOLITIC SMALL LETTER YERU +test(0x2C20, 0x2C50); // GLAGOLITIC CAPITAL LETTER YERI, GLAGOLITIC SMALL LETTER YERI +test(0x2C21, 0x2C51); // GLAGOLITIC CAPITAL LETTER YATI, GLAGOLITIC SMALL LETTER YATI +test(0x2C22, 0x2C52); // GLAGOLITIC CAPITAL LETTER SPIDERY HA, GLAGOLITIC SMALL LETTER SPIDERY HA +test(0x2C23, 0x2C53); // GLAGOLITIC CAPITAL LETTER YU, GLAGOLITIC SMALL LETTER YU +test(0x2C24, 0x2C54); // GLAGOLITIC CAPITAL LETTER SMALL YUS, GLAGOLITIC SMALL LETTER SMALL YUS +test(0x2C25, 0x2C55); // GLAGOLITIC CAPITAL LETTER SMALL YUS WITH TAIL, GLAGOLITIC SMALL LETTER SMALL YUS WITH TAIL +test(0x2C26, 0x2C56); // GLAGOLITIC CAPITAL LETTER YO, GLAGOLITIC SMALL LETTER YO +test(0x2C27, 0x2C57); // GLAGOLITIC CAPITAL LETTER IOTATED SMALL YUS, GLAGOLITIC SMALL LETTER IOTATED SMALL YUS +test(0x2C28, 0x2C58); // GLAGOLITIC CAPITAL LETTER BIG YUS, GLAGOLITIC SMALL LETTER BIG YUS +test(0x2C29, 0x2C59); // GLAGOLITIC CAPITAL LETTER IOTATED BIG YUS, GLAGOLITIC SMALL LETTER IOTATED BIG YUS +test(0x2C2A, 0x2C5A); // GLAGOLITIC CAPITAL LETTER FITA, GLAGOLITIC SMALL LETTER FITA +test(0x2C2B, 0x2C5B); // GLAGOLITIC CAPITAL LETTER IZHITSA, GLAGOLITIC SMALL LETTER IZHITSA +test(0x2C2C, 0x2C5C); // GLAGOLITIC CAPITAL LETTER SHTAPIC, GLAGOLITIC SMALL LETTER SHTAPIC +test(0x2C2D, 0x2C5D); // GLAGOLITIC CAPITAL LETTER TROKUTASTI A, GLAGOLITIC SMALL LETTER TROKUTASTI A +test(0x2C2E, 0x2C5E); // GLAGOLITIC CAPITAL LETTER LATINATE MYSLITE, GLAGOLITIC SMALL LETTER LATINATE MYSLITE +test(0x2C2F, 0x2C5F); // GLAGOLITIC CAPITAL LETTER CAUDATE CHRIVI, GLAGOLITIC SMALL LETTER CAUDATE CHRIVI +test(0x2C30, 0x2C00); // GLAGOLITIC SMALL LETTER AZU, GLAGOLITIC CAPITAL LETTER AZU +test(0x2C31, 0x2C01); // GLAGOLITIC SMALL LETTER BUKY, GLAGOLITIC CAPITAL LETTER BUKY +test(0x2C32, 0x2C02); // GLAGOLITIC SMALL LETTER VEDE, GLAGOLITIC CAPITAL LETTER VEDE +test(0x2C33, 0x2C03); // GLAGOLITIC SMALL LETTER GLAGOLI, GLAGOLITIC CAPITAL LETTER GLAGOLI +test(0x2C34, 0x2C04); // GLAGOLITIC SMALL LETTER DOBRO, GLAGOLITIC CAPITAL LETTER DOBRO +test(0x2C35, 0x2C05); // GLAGOLITIC SMALL LETTER YESTU, GLAGOLITIC CAPITAL LETTER YESTU +test(0x2C36, 0x2C06); // GLAGOLITIC SMALL LETTER ZHIVETE, GLAGOLITIC CAPITAL LETTER ZHIVETE +test(0x2C37, 0x2C07); // GLAGOLITIC SMALL LETTER DZELO, GLAGOLITIC CAPITAL LETTER DZELO +test(0x2C38, 0x2C08); // GLAGOLITIC SMALL LETTER ZEMLJA, GLAGOLITIC CAPITAL LETTER ZEMLJA +test(0x2C39, 0x2C09); // GLAGOLITIC SMALL LETTER IZHE, GLAGOLITIC CAPITAL LETTER IZHE +test(0x2C3A, 0x2C0A); // GLAGOLITIC SMALL LETTER INITIAL IZHE, GLAGOLITIC CAPITAL LETTER INITIAL IZHE +test(0x2C3B, 0x2C0B); // GLAGOLITIC SMALL LETTER I, GLAGOLITIC CAPITAL LETTER I +test(0x2C3C, 0x2C0C); // GLAGOLITIC SMALL LETTER DJERVI, GLAGOLITIC CAPITAL LETTER DJERVI +test(0x2C3D, 0x2C0D); // GLAGOLITIC SMALL LETTER KAKO, GLAGOLITIC CAPITAL LETTER KAKO +test(0x2C3E, 0x2C0E); // GLAGOLITIC SMALL LETTER LJUDIJE, GLAGOLITIC CAPITAL LETTER LJUDIJE +test(0x2C3F, 0x2C0F); // GLAGOLITIC SMALL LETTER MYSLITE, GLAGOLITIC CAPITAL LETTER MYSLITE +test(0x2C40, 0x2C10); // GLAGOLITIC SMALL LETTER NASHI, GLAGOLITIC CAPITAL LETTER NASHI +test(0x2C41, 0x2C11); // GLAGOLITIC SMALL LETTER ONU, GLAGOLITIC CAPITAL LETTER ONU +test(0x2C42, 0x2C12); // GLAGOLITIC SMALL LETTER POKOJI, GLAGOLITIC CAPITAL LETTER POKOJI +test(0x2C43, 0x2C13); // GLAGOLITIC SMALL LETTER RITSI, GLAGOLITIC CAPITAL LETTER RITSI +test(0x2C44, 0x2C14); // GLAGOLITIC SMALL LETTER SLOVO, GLAGOLITIC CAPITAL LETTER SLOVO +test(0x2C45, 0x2C15); // GLAGOLITIC SMALL LETTER TVRIDO, GLAGOLITIC CAPITAL LETTER TVRIDO +test(0x2C46, 0x2C16); // GLAGOLITIC SMALL LETTER UKU, GLAGOLITIC CAPITAL LETTER UKU +test(0x2C47, 0x2C17); // GLAGOLITIC SMALL LETTER FRITU, GLAGOLITIC CAPITAL LETTER FRITU +test(0x2C48, 0x2C18); // GLAGOLITIC SMALL LETTER HERU, GLAGOLITIC CAPITAL LETTER HERU +test(0x2C49, 0x2C19); // GLAGOLITIC SMALL LETTER OTU, GLAGOLITIC CAPITAL LETTER OTU +test(0x2C4A, 0x2C1A); // GLAGOLITIC SMALL LETTER PE, GLAGOLITIC CAPITAL LETTER PE +test(0x2C4B, 0x2C1B); // GLAGOLITIC SMALL LETTER SHTA, GLAGOLITIC CAPITAL LETTER SHTA +test(0x2C4C, 0x2C1C); // GLAGOLITIC SMALL LETTER TSI, GLAGOLITIC CAPITAL LETTER TSI +test(0x2C4D, 0x2C1D); // GLAGOLITIC SMALL LETTER CHRIVI, GLAGOLITIC CAPITAL LETTER CHRIVI +test(0x2C4E, 0x2C1E); // GLAGOLITIC SMALL LETTER SHA, GLAGOLITIC CAPITAL LETTER SHA +test(0x2C4F, 0x2C1F); // GLAGOLITIC SMALL LETTER YERU, GLAGOLITIC CAPITAL LETTER YERU +test(0x2C50, 0x2C20); // GLAGOLITIC SMALL LETTER YERI, GLAGOLITIC CAPITAL LETTER YERI +test(0x2C51, 0x2C21); // GLAGOLITIC SMALL LETTER YATI, GLAGOLITIC CAPITAL LETTER YATI +test(0x2C52, 0x2C22); // GLAGOLITIC SMALL LETTER SPIDERY HA, GLAGOLITIC CAPITAL LETTER SPIDERY HA +test(0x2C53, 0x2C23); // GLAGOLITIC SMALL LETTER YU, GLAGOLITIC CAPITAL LETTER YU +test(0x2C54, 0x2C24); // GLAGOLITIC SMALL LETTER SMALL YUS, GLAGOLITIC CAPITAL LETTER SMALL YUS +test(0x2C55, 0x2C25); // GLAGOLITIC SMALL LETTER SMALL YUS WITH TAIL, GLAGOLITIC CAPITAL LETTER SMALL YUS WITH TAIL +test(0x2C56, 0x2C26); // GLAGOLITIC SMALL LETTER YO, GLAGOLITIC CAPITAL LETTER YO +test(0x2C57, 0x2C27); // GLAGOLITIC SMALL LETTER IOTATED SMALL YUS, GLAGOLITIC CAPITAL LETTER IOTATED SMALL YUS +test(0x2C58, 0x2C28); // GLAGOLITIC SMALL LETTER BIG YUS, GLAGOLITIC CAPITAL LETTER BIG YUS +test(0x2C59, 0x2C29); // GLAGOLITIC SMALL LETTER IOTATED BIG YUS, GLAGOLITIC CAPITAL LETTER IOTATED BIG YUS +test(0x2C5A, 0x2C2A); // GLAGOLITIC SMALL LETTER FITA, GLAGOLITIC CAPITAL LETTER FITA +test(0x2C5B, 0x2C2B); // GLAGOLITIC SMALL LETTER IZHITSA, GLAGOLITIC CAPITAL LETTER IZHITSA +test(0x2C5C, 0x2C2C); // GLAGOLITIC SMALL LETTER SHTAPIC, GLAGOLITIC CAPITAL LETTER SHTAPIC +test(0x2C5D, 0x2C2D); // GLAGOLITIC SMALL LETTER TROKUTASTI A, GLAGOLITIC CAPITAL LETTER TROKUTASTI A +test(0x2C5E, 0x2C2E); // GLAGOLITIC SMALL LETTER LATINATE MYSLITE, GLAGOLITIC CAPITAL LETTER LATINATE MYSLITE +test(0x2C5F, 0x2C2F); // GLAGOLITIC SMALL LETTER CAUDATE CHRIVI, GLAGOLITIC CAPITAL LETTER CAUDATE CHRIVI +test(0x2C60, 0x2C61); // LATIN CAPITAL LETTER L WITH DOUBLE BAR, LATIN SMALL LETTER L WITH DOUBLE BAR +test(0x2C61, 0x2C60); // LATIN SMALL LETTER L WITH DOUBLE BAR, LATIN CAPITAL LETTER L WITH DOUBLE BAR +test(0x2C62, 0x026B); // LATIN CAPITAL LETTER L WITH MIDDLE TILDE, LATIN SMALL LETTER L WITH MIDDLE TILDE +test(0x2C63, 0x1D7D); // LATIN CAPITAL LETTER P WITH STROKE, LATIN SMALL LETTER P WITH STROKE +test(0x2C64, 0x027D); // LATIN CAPITAL LETTER R WITH TAIL, LATIN SMALL LETTER R WITH TAIL (LATIN SMALL LETTER R HOOK) +test(0x2C65, 0x023A); // LATIN SMALL LETTER A WITH STROKE, LATIN CAPITAL LETTER A WITH STROKE +test(0x2C66, 0x023E); // LATIN SMALL LETTER T WITH DIAGONAL STROKE, LATIN CAPITAL LETTER T WITH DIAGONAL STROKE +test(0x2C67, 0x2C68); // LATIN CAPITAL LETTER H WITH DESCENDER, LATIN SMALL LETTER H WITH DESCENDER +test(0x2C68, 0x2C67); // LATIN SMALL LETTER H WITH DESCENDER, LATIN CAPITAL LETTER H WITH DESCENDER +test(0x2C69, 0x2C6A); // LATIN CAPITAL LETTER K WITH DESCENDER, LATIN SMALL LETTER K WITH DESCENDER +test(0x2C6A, 0x2C69); // LATIN SMALL LETTER K WITH DESCENDER, LATIN CAPITAL LETTER K WITH DESCENDER +test(0x2C6B, 0x2C6C); // LATIN CAPITAL LETTER Z WITH DESCENDER, LATIN SMALL LETTER Z WITH DESCENDER +test(0x2C6C, 0x2C6B); // LATIN SMALL LETTER Z WITH DESCENDER, LATIN CAPITAL LETTER Z WITH DESCENDER +test(0x2C6D, 0x0251); // LATIN CAPITAL LETTER ALPHA, LATIN SMALL LETTER ALPHA (LATIN SMALL LETTER SCRIPT A) +test(0x2C6E, 0x0271); // LATIN CAPITAL LETTER M WITH HOOK, LATIN SMALL LETTER M WITH HOOK (LATIN SMALL LETTER M HOOK) +test(0x2C6F, 0x0250); // LATIN CAPITAL LETTER TURNED A, LATIN SMALL LETTER TURNED A +test(0x2C70, 0x0252); // LATIN CAPITAL LETTER TURNED ALPHA, LATIN SMALL LETTER TURNED ALPHA (LATIN SMALL LETTER TURNED SCRIPT A) +test(0x2C72, 0x2C73); // LATIN CAPITAL LETTER W WITH HOOK, LATIN SMALL LETTER W WITH HOOK +test(0x2C73, 0x2C72); // LATIN SMALL LETTER W WITH HOOK, LATIN CAPITAL LETTER W WITH HOOK +test(0x2C75, 0x2C76); // LATIN CAPITAL LETTER HALF H, LATIN SMALL LETTER HALF H +test(0x2C76, 0x2C75); // LATIN SMALL LETTER HALF H, LATIN CAPITAL LETTER HALF H +test(0x2C7E, 0x023F); // LATIN CAPITAL LETTER S WITH SWASH TAIL, LATIN SMALL LETTER S WITH SWASH TAIL +test(0x2C7F, 0x0240); // LATIN CAPITAL LETTER Z WITH SWASH TAIL, LATIN SMALL LETTER Z WITH SWASH TAIL +test(0x2C80, 0x2C81); // COPTIC CAPITAL LETTER ALFA, COPTIC SMALL LETTER ALFA +test(0x2C81, 0x2C80); // COPTIC SMALL LETTER ALFA, COPTIC CAPITAL LETTER ALFA +test(0x2C82, 0x2C83); // COPTIC CAPITAL LETTER VIDA, COPTIC SMALL LETTER VIDA +test(0x2C83, 0x2C82); // COPTIC SMALL LETTER VIDA, COPTIC CAPITAL LETTER VIDA +test(0x2C84, 0x2C85); // COPTIC CAPITAL LETTER GAMMA, COPTIC SMALL LETTER GAMMA +test(0x2C85, 0x2C84); // COPTIC SMALL LETTER GAMMA, COPTIC CAPITAL LETTER GAMMA +test(0x2C86, 0x2C87); // COPTIC CAPITAL LETTER DALDA, COPTIC SMALL LETTER DALDA +test(0x2C87, 0x2C86); // COPTIC SMALL LETTER DALDA, COPTIC CAPITAL LETTER DALDA +test(0x2C88, 0x2C89); // COPTIC CAPITAL LETTER EIE, COPTIC SMALL LETTER EIE +test(0x2C89, 0x2C88); // COPTIC SMALL LETTER EIE, COPTIC CAPITAL LETTER EIE +test(0x2C8A, 0x2C8B); // COPTIC CAPITAL LETTER SOU, COPTIC SMALL LETTER SOU +test(0x2C8B, 0x2C8A); // COPTIC SMALL LETTER SOU, COPTIC CAPITAL LETTER SOU +test(0x2C8C, 0x2C8D); // COPTIC CAPITAL LETTER ZATA, COPTIC SMALL LETTER ZATA +test(0x2C8D, 0x2C8C); // COPTIC SMALL LETTER ZATA, COPTIC CAPITAL LETTER ZATA +test(0x2C8E, 0x2C8F); // COPTIC CAPITAL LETTER HATE, COPTIC SMALL LETTER HATE +test(0x2C8F, 0x2C8E); // COPTIC SMALL LETTER HATE, COPTIC CAPITAL LETTER HATE +test(0x2C90, 0x2C91); // COPTIC CAPITAL LETTER THETHE, COPTIC SMALL LETTER THETHE +test(0x2C91, 0x2C90); // COPTIC SMALL LETTER THETHE, COPTIC CAPITAL LETTER THETHE +test(0x2C92, 0x2C93); // COPTIC CAPITAL LETTER IAUDA, COPTIC SMALL LETTER IAUDA +test(0x2C93, 0x2C92); // COPTIC SMALL LETTER IAUDA, COPTIC CAPITAL LETTER IAUDA +test(0x2C94, 0x2C95); // COPTIC CAPITAL LETTER KAPA, COPTIC SMALL LETTER KAPA +test(0x2C95, 0x2C94); // COPTIC SMALL LETTER KAPA, COPTIC CAPITAL LETTER KAPA +test(0x2C96, 0x2C97); // COPTIC CAPITAL LETTER LAULA, COPTIC SMALL LETTER LAULA +test(0x2C97, 0x2C96); // COPTIC SMALL LETTER LAULA, COPTIC CAPITAL LETTER LAULA +test(0x2C98, 0x2C99); // COPTIC CAPITAL LETTER MI, COPTIC SMALL LETTER MI +test(0x2C99, 0x2C98); // COPTIC SMALL LETTER MI, COPTIC CAPITAL LETTER MI +test(0x2C9A, 0x2C9B); // COPTIC CAPITAL LETTER NI, COPTIC SMALL LETTER NI +test(0x2C9B, 0x2C9A); // COPTIC SMALL LETTER NI, COPTIC CAPITAL LETTER NI +test(0x2C9C, 0x2C9D); // COPTIC CAPITAL LETTER KSI, COPTIC SMALL LETTER KSI +test(0x2C9D, 0x2C9C); // COPTIC SMALL LETTER KSI, COPTIC CAPITAL LETTER KSI +test(0x2C9E, 0x2C9F); // COPTIC CAPITAL LETTER O, COPTIC SMALL LETTER O +test(0x2C9F, 0x2C9E); // COPTIC SMALL LETTER O, COPTIC CAPITAL LETTER O +test(0x2CA0, 0x2CA1); // COPTIC CAPITAL LETTER PI, COPTIC SMALL LETTER PI +test(0x2CA1, 0x2CA0); // COPTIC SMALL LETTER PI, COPTIC CAPITAL LETTER PI +test(0x2CA2, 0x2CA3); // COPTIC CAPITAL LETTER RO, COPTIC SMALL LETTER RO +test(0x2CA3, 0x2CA2); // COPTIC SMALL LETTER RO, COPTIC CAPITAL LETTER RO +test(0x2CA4, 0x2CA5); // COPTIC CAPITAL LETTER SIMA, COPTIC SMALL LETTER SIMA +test(0x2CA5, 0x2CA4); // COPTIC SMALL LETTER SIMA, COPTIC CAPITAL LETTER SIMA +test(0x2CA6, 0x2CA7); // COPTIC CAPITAL LETTER TAU, COPTIC SMALL LETTER TAU +test(0x2CA7, 0x2CA6); // COPTIC SMALL LETTER TAU, COPTIC CAPITAL LETTER TAU +test(0x2CA8, 0x2CA9); // COPTIC CAPITAL LETTER UA, COPTIC SMALL LETTER UA +test(0x2CA9, 0x2CA8); // COPTIC SMALL LETTER UA, COPTIC CAPITAL LETTER UA +test(0x2CAA, 0x2CAB); // COPTIC CAPITAL LETTER FI, COPTIC SMALL LETTER FI +test(0x2CAB, 0x2CAA); // COPTIC SMALL LETTER FI, COPTIC CAPITAL LETTER FI +test(0x2CAC, 0x2CAD); // COPTIC CAPITAL LETTER KHI, COPTIC SMALL LETTER KHI +test(0x2CAD, 0x2CAC); // COPTIC SMALL LETTER KHI, COPTIC CAPITAL LETTER KHI +test(0x2CAE, 0x2CAF); // COPTIC CAPITAL LETTER PSI, COPTIC SMALL LETTER PSI +test(0x2CAF, 0x2CAE); // COPTIC SMALL LETTER PSI, COPTIC CAPITAL LETTER PSI +test(0x2CB0, 0x2CB1); // COPTIC CAPITAL LETTER OOU, COPTIC SMALL LETTER OOU +test(0x2CB1, 0x2CB0); // COPTIC SMALL LETTER OOU, COPTIC CAPITAL LETTER OOU +test(0x2CB2, 0x2CB3); // COPTIC CAPITAL LETTER DIALECT-P ALEF, COPTIC SMALL LETTER DIALECT-P ALEF +test(0x2CB3, 0x2CB2); // COPTIC SMALL LETTER DIALECT-P ALEF, COPTIC CAPITAL LETTER DIALECT-P ALEF +test(0x2CB4, 0x2CB5); // COPTIC CAPITAL LETTER OLD COPTIC AIN, COPTIC SMALL LETTER OLD COPTIC AIN +test(0x2CB5, 0x2CB4); // COPTIC SMALL LETTER OLD COPTIC AIN, COPTIC CAPITAL LETTER OLD COPTIC AIN +test(0x2CB6, 0x2CB7); // COPTIC CAPITAL LETTER CRYPTOGRAMMIC EIE, COPTIC SMALL LETTER CRYPTOGRAMMIC EIE +test(0x2CB7, 0x2CB6); // COPTIC SMALL LETTER CRYPTOGRAMMIC EIE, COPTIC CAPITAL LETTER CRYPTOGRAMMIC EIE +test(0x2CB8, 0x2CB9); // COPTIC CAPITAL LETTER DIALECT-P KAPA, COPTIC SMALL LETTER DIALECT-P KAPA +test(0x2CB9, 0x2CB8); // COPTIC SMALL LETTER DIALECT-P KAPA, COPTIC CAPITAL LETTER DIALECT-P KAPA +test(0x2CBA, 0x2CBB); // COPTIC CAPITAL LETTER DIALECT-P NI, COPTIC SMALL LETTER DIALECT-P NI +test(0x2CBB, 0x2CBA); // COPTIC SMALL LETTER DIALECT-P NI, COPTIC CAPITAL LETTER DIALECT-P NI +test(0x2CBC, 0x2CBD); // COPTIC CAPITAL LETTER CRYPTOGRAMMIC NI, COPTIC SMALL LETTER CRYPTOGRAMMIC NI +test(0x2CBD, 0x2CBC); // COPTIC SMALL LETTER CRYPTOGRAMMIC NI, COPTIC CAPITAL LETTER CRYPTOGRAMMIC NI +test(0x2CBE, 0x2CBF); // COPTIC CAPITAL LETTER OLD COPTIC OOU, COPTIC SMALL LETTER OLD COPTIC OOU +test(0x2CBF, 0x2CBE); // COPTIC SMALL LETTER OLD COPTIC OOU, COPTIC CAPITAL LETTER OLD COPTIC OOU +test(0x2CC0, 0x2CC1); // COPTIC CAPITAL LETTER SAMPI, COPTIC SMALL LETTER SAMPI +test(0x2CC1, 0x2CC0); // COPTIC SMALL LETTER SAMPI, COPTIC CAPITAL LETTER SAMPI +test(0x2CC2, 0x2CC3); // COPTIC CAPITAL LETTER CROSSED SHEI, COPTIC SMALL LETTER CROSSED SHEI +test(0x2CC3, 0x2CC2); // COPTIC SMALL LETTER CROSSED SHEI, COPTIC CAPITAL LETTER CROSSED SHEI +test(0x2CC4, 0x2CC5); // COPTIC CAPITAL LETTER OLD COPTIC SHEI, COPTIC SMALL LETTER OLD COPTIC SHEI +test(0x2CC5, 0x2CC4); // COPTIC SMALL LETTER OLD COPTIC SHEI, COPTIC CAPITAL LETTER OLD COPTIC SHEI +test(0x2CC6, 0x2CC7); // COPTIC CAPITAL LETTER OLD COPTIC ESH, COPTIC SMALL LETTER OLD COPTIC ESH +test(0x2CC7, 0x2CC6); // COPTIC SMALL LETTER OLD COPTIC ESH, COPTIC CAPITAL LETTER OLD COPTIC ESH +test(0x2CC8, 0x2CC9); // COPTIC CAPITAL LETTER AKHMIMIC KHEI, COPTIC SMALL LETTER AKHMIMIC KHEI +test(0x2CC9, 0x2CC8); // COPTIC SMALL LETTER AKHMIMIC KHEI, COPTIC CAPITAL LETTER AKHMIMIC KHEI +test(0x2CCA, 0x2CCB); // COPTIC CAPITAL LETTER DIALECT-P HORI, COPTIC SMALL LETTER DIALECT-P HORI +test(0x2CCB, 0x2CCA); // COPTIC SMALL LETTER DIALECT-P HORI, COPTIC CAPITAL LETTER DIALECT-P HORI +test(0x2CCC, 0x2CCD); // COPTIC CAPITAL LETTER OLD COPTIC HORI, COPTIC SMALL LETTER OLD COPTIC HORI +test(0x2CCD, 0x2CCC); // COPTIC SMALL LETTER OLD COPTIC HORI, COPTIC CAPITAL LETTER OLD COPTIC HORI +test(0x2CCE, 0x2CCF); // COPTIC CAPITAL LETTER OLD COPTIC HA, COPTIC SMALL LETTER OLD COPTIC HA +test(0x2CCF, 0x2CCE); // COPTIC SMALL LETTER OLD COPTIC HA, COPTIC CAPITAL LETTER OLD COPTIC HA +test(0x2CD0, 0x2CD1); // COPTIC CAPITAL LETTER L-SHAPED HA, COPTIC SMALL LETTER L-SHAPED HA +test(0x2CD1, 0x2CD0); // COPTIC SMALL LETTER L-SHAPED HA, COPTIC CAPITAL LETTER L-SHAPED HA +test(0x2CD2, 0x2CD3); // COPTIC CAPITAL LETTER OLD COPTIC HEI, COPTIC SMALL LETTER OLD COPTIC HEI +test(0x2CD3, 0x2CD2); // COPTIC SMALL LETTER OLD COPTIC HEI, COPTIC CAPITAL LETTER OLD COPTIC HEI +test(0x2CD4, 0x2CD5); // COPTIC CAPITAL LETTER OLD COPTIC HAT, COPTIC SMALL LETTER OLD COPTIC HAT +test(0x2CD5, 0x2CD4); // COPTIC SMALL LETTER OLD COPTIC HAT, COPTIC CAPITAL LETTER OLD COPTIC HAT +test(0x2CD6, 0x2CD7); // COPTIC CAPITAL LETTER OLD COPTIC GANGIA, COPTIC SMALL LETTER OLD COPTIC GANGIA +test(0x2CD7, 0x2CD6); // COPTIC SMALL LETTER OLD COPTIC GANGIA, COPTIC CAPITAL LETTER OLD COPTIC GANGIA +test(0x2CD8, 0x2CD9); // COPTIC CAPITAL LETTER OLD COPTIC DJA, COPTIC SMALL LETTER OLD COPTIC DJA +test(0x2CD9, 0x2CD8); // COPTIC SMALL LETTER OLD COPTIC DJA, COPTIC CAPITAL LETTER OLD COPTIC DJA +test(0x2CDA, 0x2CDB); // COPTIC CAPITAL LETTER OLD COPTIC SHIMA, COPTIC SMALL LETTER OLD COPTIC SHIMA +test(0x2CDB, 0x2CDA); // COPTIC SMALL LETTER OLD COPTIC SHIMA, COPTIC CAPITAL LETTER OLD COPTIC SHIMA +test(0x2CDC, 0x2CDD); // COPTIC CAPITAL LETTER OLD NUBIAN SHIMA, COPTIC SMALL LETTER OLD NUBIAN SHIMA +test(0x2CDD, 0x2CDC); // COPTIC SMALL LETTER OLD NUBIAN SHIMA, COPTIC CAPITAL LETTER OLD NUBIAN SHIMA +test(0x2CDE, 0x2CDF); // COPTIC CAPITAL LETTER OLD NUBIAN NGI, COPTIC SMALL LETTER OLD NUBIAN NGI +test(0x2CDF, 0x2CDE); // COPTIC SMALL LETTER OLD NUBIAN NGI, COPTIC CAPITAL LETTER OLD NUBIAN NGI +test(0x2CE0, 0x2CE1); // COPTIC CAPITAL LETTER OLD NUBIAN NYI, COPTIC SMALL LETTER OLD NUBIAN NYI +test(0x2CE1, 0x2CE0); // COPTIC SMALL LETTER OLD NUBIAN NYI, COPTIC CAPITAL LETTER OLD NUBIAN NYI +test(0x2CE2, 0x2CE3); // COPTIC CAPITAL LETTER OLD NUBIAN WAU, COPTIC SMALL LETTER OLD NUBIAN WAU +test(0x2CE3, 0x2CE2); // COPTIC SMALL LETTER OLD NUBIAN WAU, COPTIC CAPITAL LETTER OLD NUBIAN WAU +test(0x2CEB, 0x2CEC); // COPTIC CAPITAL LETTER CRYPTOGRAMMIC SHEI, COPTIC SMALL LETTER CRYPTOGRAMMIC SHEI +test(0x2CEC, 0x2CEB); // COPTIC SMALL LETTER CRYPTOGRAMMIC SHEI, COPTIC CAPITAL LETTER CRYPTOGRAMMIC SHEI +test(0x2CED, 0x2CEE); // COPTIC CAPITAL LETTER CRYPTOGRAMMIC GANGIA, COPTIC SMALL LETTER CRYPTOGRAMMIC GANGIA +test(0x2CEE, 0x2CED); // COPTIC SMALL LETTER CRYPTOGRAMMIC GANGIA, COPTIC CAPITAL LETTER CRYPTOGRAMMIC GANGIA +test(0x2CF2, 0x2CF3); // COPTIC CAPITAL LETTER BOHAIRIC KHEI, COPTIC SMALL LETTER BOHAIRIC KHEI +test(0x2CF3, 0x2CF2); // COPTIC SMALL LETTER BOHAIRIC KHEI, COPTIC CAPITAL LETTER BOHAIRIC KHEI +test(0x2D00, 0x10A0); // GEORGIAN SMALL LETTER AN, GEORGIAN CAPITAL LETTER AN +test(0x2D01, 0x10A1); // GEORGIAN SMALL LETTER BAN, GEORGIAN CAPITAL LETTER BAN +test(0x2D02, 0x10A2); // GEORGIAN SMALL LETTER GAN, GEORGIAN CAPITAL LETTER GAN +test(0x2D03, 0x10A3); // GEORGIAN SMALL LETTER DON, GEORGIAN CAPITAL LETTER DON +test(0x2D04, 0x10A4); // GEORGIAN SMALL LETTER EN, GEORGIAN CAPITAL LETTER EN +test(0x2D05, 0x10A5); // GEORGIAN SMALL LETTER VIN, GEORGIAN CAPITAL LETTER VIN +test(0x2D06, 0x10A6); // GEORGIAN SMALL LETTER ZEN, GEORGIAN CAPITAL LETTER ZEN +test(0x2D07, 0x10A7); // GEORGIAN SMALL LETTER TAN, GEORGIAN CAPITAL LETTER TAN +test(0x2D08, 0x10A8); // GEORGIAN SMALL LETTER IN, GEORGIAN CAPITAL LETTER IN +test(0x2D09, 0x10A9); // GEORGIAN SMALL LETTER KAN, GEORGIAN CAPITAL LETTER KAN +test(0x2D0A, 0x10AA); // GEORGIAN SMALL LETTER LAS, GEORGIAN CAPITAL LETTER LAS +test(0x2D0B, 0x10AB); // GEORGIAN SMALL LETTER MAN, GEORGIAN CAPITAL LETTER MAN +test(0x2D0C, 0x10AC); // GEORGIAN SMALL LETTER NAR, GEORGIAN CAPITAL LETTER NAR +test(0x2D0D, 0x10AD); // GEORGIAN SMALL LETTER ON, GEORGIAN CAPITAL LETTER ON +test(0x2D0E, 0x10AE); // GEORGIAN SMALL LETTER PAR, GEORGIAN CAPITAL LETTER PAR +test(0x2D0F, 0x10AF); // GEORGIAN SMALL LETTER ZHAR, GEORGIAN CAPITAL LETTER ZHAR +test(0x2D10, 0x10B0); // GEORGIAN SMALL LETTER RAE, GEORGIAN CAPITAL LETTER RAE +test(0x2D11, 0x10B1); // GEORGIAN SMALL LETTER SAN, GEORGIAN CAPITAL LETTER SAN +test(0x2D12, 0x10B2); // GEORGIAN SMALL LETTER TAR, GEORGIAN CAPITAL LETTER TAR +test(0x2D13, 0x10B3); // GEORGIAN SMALL LETTER UN, GEORGIAN CAPITAL LETTER UN +test(0x2D14, 0x10B4); // GEORGIAN SMALL LETTER PHAR, GEORGIAN CAPITAL LETTER PHAR +test(0x2D15, 0x10B5); // GEORGIAN SMALL LETTER KHAR, GEORGIAN CAPITAL LETTER KHAR +test(0x2D16, 0x10B6); // GEORGIAN SMALL LETTER GHAN, GEORGIAN CAPITAL LETTER GHAN +test(0x2D17, 0x10B7); // GEORGIAN SMALL LETTER QAR, GEORGIAN CAPITAL LETTER QAR +test(0x2D18, 0x10B8); // GEORGIAN SMALL LETTER SHIN, GEORGIAN CAPITAL LETTER SHIN +test(0x2D19, 0x10B9); // GEORGIAN SMALL LETTER CHIN, GEORGIAN CAPITAL LETTER CHIN +test(0x2D1A, 0x10BA); // GEORGIAN SMALL LETTER CAN, GEORGIAN CAPITAL LETTER CAN +test(0x2D1B, 0x10BB); // GEORGIAN SMALL LETTER JIL, GEORGIAN CAPITAL LETTER JIL +test(0x2D1C, 0x10BC); // GEORGIAN SMALL LETTER CIL, GEORGIAN CAPITAL LETTER CIL +test(0x2D1D, 0x10BD); // GEORGIAN SMALL LETTER CHAR, GEORGIAN CAPITAL LETTER CHAR +test(0x2D1E, 0x10BE); // GEORGIAN SMALL LETTER XAN, GEORGIAN CAPITAL LETTER XAN +test(0x2D1F, 0x10BF); // GEORGIAN SMALL LETTER JHAN, GEORGIAN CAPITAL LETTER JHAN +test(0x2D20, 0x10C0); // GEORGIAN SMALL LETTER HAE, GEORGIAN CAPITAL LETTER HAE +test(0x2D21, 0x10C1); // GEORGIAN SMALL LETTER HE, GEORGIAN CAPITAL LETTER HE +test(0x2D22, 0x10C2); // GEORGIAN SMALL LETTER HIE, GEORGIAN CAPITAL LETTER HIE +test(0x2D23, 0x10C3); // GEORGIAN SMALL LETTER WE, GEORGIAN CAPITAL LETTER WE +test(0x2D24, 0x10C4); // GEORGIAN SMALL LETTER HAR, GEORGIAN CAPITAL LETTER HAR +test(0x2D25, 0x10C5); // GEORGIAN SMALL LETTER HOE, GEORGIAN CAPITAL LETTER HOE +test(0x2D27, 0x10C7); // GEORGIAN SMALL LETTER YN, GEORGIAN CAPITAL LETTER YN +test(0x2D2D, 0x10CD); // GEORGIAN SMALL LETTER AEN, GEORGIAN CAPITAL LETTER AEN +test(0xA640, 0xA641); // CYRILLIC CAPITAL LETTER ZEMLYA, CYRILLIC SMALL LETTER ZEMLYA +test(0xA641, 0xA640); // CYRILLIC SMALL LETTER ZEMLYA, CYRILLIC CAPITAL LETTER ZEMLYA +test(0xA642, 0xA643); // CYRILLIC CAPITAL LETTER DZELO, CYRILLIC SMALL LETTER DZELO +test(0xA643, 0xA642); // CYRILLIC SMALL LETTER DZELO, CYRILLIC CAPITAL LETTER DZELO +test(0xA644, 0xA645); // CYRILLIC CAPITAL LETTER REVERSED DZE, CYRILLIC SMALL LETTER REVERSED DZE +test(0xA645, 0xA644); // CYRILLIC SMALL LETTER REVERSED DZE, CYRILLIC CAPITAL LETTER REVERSED DZE +test(0xA646, 0xA647); // CYRILLIC CAPITAL LETTER IOTA, CYRILLIC SMALL LETTER IOTA +test(0xA647, 0xA646); // CYRILLIC SMALL LETTER IOTA, CYRILLIC CAPITAL LETTER IOTA +test(0xA648, 0xA649); // CYRILLIC CAPITAL LETTER DJERV, CYRILLIC SMALL LETTER DJERV +test(0xA649, 0xA648); // CYRILLIC SMALL LETTER DJERV, CYRILLIC CAPITAL LETTER DJERV +test(0xA64A, 0xA64B, 0x1C88); // CYRILLIC CAPITAL LETTER MONOGRAPH UK, CYRILLIC SMALL LETTER MONOGRAPH UK, CYRILLIC SMALL LETTER UNBLENDED UK +test(0xA64B, 0x1C88, 0xA64A); // CYRILLIC SMALL LETTER MONOGRAPH UK, CYRILLIC SMALL LETTER UNBLENDED UK, CYRILLIC CAPITAL LETTER MONOGRAPH UK +test(0xA64C, 0xA64D); // CYRILLIC CAPITAL LETTER BROAD OMEGA, CYRILLIC SMALL LETTER BROAD OMEGA +test(0xA64D, 0xA64C); // CYRILLIC SMALL LETTER BROAD OMEGA, CYRILLIC CAPITAL LETTER BROAD OMEGA +test(0xA64E, 0xA64F); // CYRILLIC CAPITAL LETTER NEUTRAL YER, CYRILLIC SMALL LETTER NEUTRAL YER +test(0xA64F, 0xA64E); // CYRILLIC SMALL LETTER NEUTRAL YER, CYRILLIC CAPITAL LETTER NEUTRAL YER +test(0xA650, 0xA651); // CYRILLIC CAPITAL LETTER YERU WITH BACK YER, CYRILLIC SMALL LETTER YERU WITH BACK YER +test(0xA651, 0xA650); // CYRILLIC SMALL LETTER YERU WITH BACK YER, CYRILLIC CAPITAL LETTER YERU WITH BACK YER +test(0xA652, 0xA653); // CYRILLIC CAPITAL LETTER IOTIFIED YAT, CYRILLIC SMALL LETTER IOTIFIED YAT +test(0xA653, 0xA652); // CYRILLIC SMALL LETTER IOTIFIED YAT, CYRILLIC CAPITAL LETTER IOTIFIED YAT +test(0xA654, 0xA655); // CYRILLIC CAPITAL LETTER REVERSED YU, CYRILLIC SMALL LETTER REVERSED YU +test(0xA655, 0xA654); // CYRILLIC SMALL LETTER REVERSED YU, CYRILLIC CAPITAL LETTER REVERSED YU +test(0xA656, 0xA657); // CYRILLIC CAPITAL LETTER IOTIFIED A, CYRILLIC SMALL LETTER IOTIFIED A +test(0xA657, 0xA656); // CYRILLIC SMALL LETTER IOTIFIED A, CYRILLIC CAPITAL LETTER IOTIFIED A +test(0xA658, 0xA659); // CYRILLIC CAPITAL LETTER CLOSED LITTLE YUS, CYRILLIC SMALL LETTER CLOSED LITTLE YUS +test(0xA659, 0xA658); // CYRILLIC SMALL LETTER CLOSED LITTLE YUS, CYRILLIC CAPITAL LETTER CLOSED LITTLE YUS +test(0xA65A, 0xA65B); // CYRILLIC CAPITAL LETTER BLENDED YUS, CYRILLIC SMALL LETTER BLENDED YUS +test(0xA65B, 0xA65A); // CYRILLIC SMALL LETTER BLENDED YUS, CYRILLIC CAPITAL LETTER BLENDED YUS +test(0xA65C, 0xA65D); // CYRILLIC CAPITAL LETTER IOTIFIED CLOSED LITTLE YUS, CYRILLIC SMALL LETTER IOTIFIED CLOSED LITTLE YUS +test(0xA65D, 0xA65C); // CYRILLIC SMALL LETTER IOTIFIED CLOSED LITTLE YUS, CYRILLIC CAPITAL LETTER IOTIFIED CLOSED LITTLE YUS +test(0xA65E, 0xA65F); // CYRILLIC CAPITAL LETTER YN, CYRILLIC SMALL LETTER YN +test(0xA65F, 0xA65E); // CYRILLIC SMALL LETTER YN, CYRILLIC CAPITAL LETTER YN +test(0xA660, 0xA661); // CYRILLIC CAPITAL LETTER REVERSED TSE, CYRILLIC SMALL LETTER REVERSED TSE +test(0xA661, 0xA660); // CYRILLIC SMALL LETTER REVERSED TSE, CYRILLIC CAPITAL LETTER REVERSED TSE +test(0xA662, 0xA663); // CYRILLIC CAPITAL LETTER SOFT DE, CYRILLIC SMALL LETTER SOFT DE +test(0xA663, 0xA662); // CYRILLIC SMALL LETTER SOFT DE, CYRILLIC CAPITAL LETTER SOFT DE +test(0xA664, 0xA665); // CYRILLIC CAPITAL LETTER SOFT EL, CYRILLIC SMALL LETTER SOFT EL +test(0xA665, 0xA664); // CYRILLIC SMALL LETTER SOFT EL, CYRILLIC CAPITAL LETTER SOFT EL +test(0xA666, 0xA667); // CYRILLIC CAPITAL LETTER SOFT EM, CYRILLIC SMALL LETTER SOFT EM +test(0xA667, 0xA666); // CYRILLIC SMALL LETTER SOFT EM, CYRILLIC CAPITAL LETTER SOFT EM +test(0xA668, 0xA669); // CYRILLIC CAPITAL LETTER MONOCULAR O, CYRILLIC SMALL LETTER MONOCULAR O +test(0xA669, 0xA668); // CYRILLIC SMALL LETTER MONOCULAR O, CYRILLIC CAPITAL LETTER MONOCULAR O +test(0xA66A, 0xA66B); // CYRILLIC CAPITAL LETTER BINOCULAR O, CYRILLIC SMALL LETTER BINOCULAR O +test(0xA66B, 0xA66A); // CYRILLIC SMALL LETTER BINOCULAR O, CYRILLIC CAPITAL LETTER BINOCULAR O +test(0xA66C, 0xA66D); // CYRILLIC CAPITAL LETTER DOUBLE MONOCULAR O, CYRILLIC SMALL LETTER DOUBLE MONOCULAR O +test(0xA66D, 0xA66C); // CYRILLIC SMALL LETTER DOUBLE MONOCULAR O, CYRILLIC CAPITAL LETTER DOUBLE MONOCULAR O +test(0xA680, 0xA681); // CYRILLIC CAPITAL LETTER DWE, CYRILLIC SMALL LETTER DWE +test(0xA681, 0xA680); // CYRILLIC SMALL LETTER DWE, CYRILLIC CAPITAL LETTER DWE +test(0xA682, 0xA683); // CYRILLIC CAPITAL LETTER DZWE, CYRILLIC SMALL LETTER DZWE +test(0xA683, 0xA682); // CYRILLIC SMALL LETTER DZWE, CYRILLIC CAPITAL LETTER DZWE +test(0xA684, 0xA685); // CYRILLIC CAPITAL LETTER ZHWE, CYRILLIC SMALL LETTER ZHWE +test(0xA685, 0xA684); // CYRILLIC SMALL LETTER ZHWE, CYRILLIC CAPITAL LETTER ZHWE +test(0xA686, 0xA687); // CYRILLIC CAPITAL LETTER CCHE, CYRILLIC SMALL LETTER CCHE +test(0xA687, 0xA686); // CYRILLIC SMALL LETTER CCHE, CYRILLIC CAPITAL LETTER CCHE +test(0xA688, 0xA689); // CYRILLIC CAPITAL LETTER DZZE, CYRILLIC SMALL LETTER DZZE +test(0xA689, 0xA688); // CYRILLIC SMALL LETTER DZZE, CYRILLIC CAPITAL LETTER DZZE +test(0xA68A, 0xA68B); // CYRILLIC CAPITAL LETTER TE WITH MIDDLE HOOK, CYRILLIC SMALL LETTER TE WITH MIDDLE HOOK +test(0xA68B, 0xA68A); // CYRILLIC SMALL LETTER TE WITH MIDDLE HOOK, CYRILLIC CAPITAL LETTER TE WITH MIDDLE HOOK +test(0xA68C, 0xA68D); // CYRILLIC CAPITAL LETTER TWE, CYRILLIC SMALL LETTER TWE +test(0xA68D, 0xA68C); // CYRILLIC SMALL LETTER TWE, CYRILLIC CAPITAL LETTER TWE +test(0xA68E, 0xA68F); // CYRILLIC CAPITAL LETTER TSWE, CYRILLIC SMALL LETTER TSWE +test(0xA68F, 0xA68E); // CYRILLIC SMALL LETTER TSWE, CYRILLIC CAPITAL LETTER TSWE +test(0xA690, 0xA691); // CYRILLIC CAPITAL LETTER TSSE, CYRILLIC SMALL LETTER TSSE +test(0xA691, 0xA690); // CYRILLIC SMALL LETTER TSSE, CYRILLIC CAPITAL LETTER TSSE +test(0xA692, 0xA693); // CYRILLIC CAPITAL LETTER TCHE, CYRILLIC SMALL LETTER TCHE +test(0xA693, 0xA692); // CYRILLIC SMALL LETTER TCHE, CYRILLIC CAPITAL LETTER TCHE +test(0xA694, 0xA695); // CYRILLIC CAPITAL LETTER HWE, CYRILLIC SMALL LETTER HWE +test(0xA695, 0xA694); // CYRILLIC SMALL LETTER HWE, CYRILLIC CAPITAL LETTER HWE +test(0xA696, 0xA697); // CYRILLIC CAPITAL LETTER SHWE, CYRILLIC SMALL LETTER SHWE +test(0xA697, 0xA696); // CYRILLIC SMALL LETTER SHWE, CYRILLIC CAPITAL LETTER SHWE +test(0xA698, 0xA699); // CYRILLIC CAPITAL LETTER DOUBLE O, CYRILLIC SMALL LETTER DOUBLE O +test(0xA699, 0xA698); // CYRILLIC SMALL LETTER DOUBLE O, CYRILLIC CAPITAL LETTER DOUBLE O +test(0xA69A, 0xA69B); // CYRILLIC CAPITAL LETTER CROSSED O, CYRILLIC SMALL LETTER CROSSED O +test(0xA69B, 0xA69A); // CYRILLIC SMALL LETTER CROSSED O, CYRILLIC CAPITAL LETTER CROSSED O +test(0xA722, 0xA723); // LATIN CAPITAL LETTER EGYPTOLOGICAL ALEF, LATIN SMALL LETTER EGYPTOLOGICAL ALEF +test(0xA723, 0xA722); // LATIN SMALL LETTER EGYPTOLOGICAL ALEF, LATIN CAPITAL LETTER EGYPTOLOGICAL ALEF +test(0xA724, 0xA725); // LATIN CAPITAL LETTER EGYPTOLOGICAL AIN, LATIN SMALL LETTER EGYPTOLOGICAL AIN +test(0xA725, 0xA724); // LATIN SMALL LETTER EGYPTOLOGICAL AIN, LATIN CAPITAL LETTER EGYPTOLOGICAL AIN +test(0xA726, 0xA727); // LATIN CAPITAL LETTER HENG, LATIN SMALL LETTER HENG +test(0xA727, 0xA726); // LATIN SMALL LETTER HENG, LATIN CAPITAL LETTER HENG +test(0xA728, 0xA729); // LATIN CAPITAL LETTER TZ, LATIN SMALL LETTER TZ +test(0xA729, 0xA728); // LATIN SMALL LETTER TZ, LATIN CAPITAL LETTER TZ +test(0xA72A, 0xA72B); // LATIN CAPITAL LETTER TRESILLO, LATIN SMALL LETTER TRESILLO +test(0xA72B, 0xA72A); // LATIN SMALL LETTER TRESILLO, LATIN CAPITAL LETTER TRESILLO +test(0xA72C, 0xA72D); // LATIN CAPITAL LETTER CUATRILLO, LATIN SMALL LETTER CUATRILLO +test(0xA72D, 0xA72C); // LATIN SMALL LETTER CUATRILLO, LATIN CAPITAL LETTER CUATRILLO +test(0xA72E, 0xA72F); // LATIN CAPITAL LETTER CUATRILLO WITH COMMA, LATIN SMALL LETTER CUATRILLO WITH COMMA +test(0xA72F, 0xA72E); // LATIN SMALL LETTER CUATRILLO WITH COMMA, LATIN CAPITAL LETTER CUATRILLO WITH COMMA +test(0xA732, 0xA733); // LATIN CAPITAL LETTER AA, LATIN SMALL LETTER AA +test(0xA733, 0xA732); // LATIN SMALL LETTER AA, LATIN CAPITAL LETTER AA +test(0xA734, 0xA735); // LATIN CAPITAL LETTER AO, LATIN SMALL LETTER AO +test(0xA735, 0xA734); // LATIN SMALL LETTER AO, LATIN CAPITAL LETTER AO +test(0xA736, 0xA737); // LATIN CAPITAL LETTER AU, LATIN SMALL LETTER AU +test(0xA737, 0xA736); // LATIN SMALL LETTER AU, LATIN CAPITAL LETTER AU +test(0xA738, 0xA739); // LATIN CAPITAL LETTER AV, LATIN SMALL LETTER AV +test(0xA739, 0xA738); // LATIN SMALL LETTER AV, LATIN CAPITAL LETTER AV +test(0xA73A, 0xA73B); // LATIN CAPITAL LETTER AV WITH HORIZONTAL BAR, LATIN SMALL LETTER AV WITH HORIZONTAL BAR +test(0xA73B, 0xA73A); // LATIN SMALL LETTER AV WITH HORIZONTAL BAR, LATIN CAPITAL LETTER AV WITH HORIZONTAL BAR +test(0xA73C, 0xA73D); // LATIN CAPITAL LETTER AY, LATIN SMALL LETTER AY +test(0xA73D, 0xA73C); // LATIN SMALL LETTER AY, LATIN CAPITAL LETTER AY +test(0xA73E, 0xA73F); // LATIN CAPITAL LETTER REVERSED C WITH DOT, LATIN SMALL LETTER REVERSED C WITH DOT +test(0xA73F, 0xA73E); // LATIN SMALL LETTER REVERSED C WITH DOT, LATIN CAPITAL LETTER REVERSED C WITH DOT +test(0xA740, 0xA741); // LATIN CAPITAL LETTER K WITH STROKE, LATIN SMALL LETTER K WITH STROKE +test(0xA741, 0xA740); // LATIN SMALL LETTER K WITH STROKE, LATIN CAPITAL LETTER K WITH STROKE +test(0xA742, 0xA743); // LATIN CAPITAL LETTER K WITH DIAGONAL STROKE, LATIN SMALL LETTER K WITH DIAGONAL STROKE +test(0xA743, 0xA742); // LATIN SMALL LETTER K WITH DIAGONAL STROKE, LATIN CAPITAL LETTER K WITH DIAGONAL STROKE +test(0xA744, 0xA745); // LATIN CAPITAL LETTER K WITH STROKE AND DIAGONAL STROKE, LATIN SMALL LETTER K WITH STROKE AND DIAGONAL STROKE +test(0xA745, 0xA744); // LATIN SMALL LETTER K WITH STROKE AND DIAGONAL STROKE, LATIN CAPITAL LETTER K WITH STROKE AND DIAGONAL STROKE +test(0xA746, 0xA747); // LATIN CAPITAL LETTER BROKEN L, LATIN SMALL LETTER BROKEN L +test(0xA747, 0xA746); // LATIN SMALL LETTER BROKEN L, LATIN CAPITAL LETTER BROKEN L +test(0xA748, 0xA749); // LATIN CAPITAL LETTER L WITH HIGH STROKE, LATIN SMALL LETTER L WITH HIGH STROKE +test(0xA749, 0xA748); // LATIN SMALL LETTER L WITH HIGH STROKE, LATIN CAPITAL LETTER L WITH HIGH STROKE +test(0xA74A, 0xA74B); // LATIN CAPITAL LETTER O WITH LONG STROKE OVERLAY, LATIN SMALL LETTER O WITH LONG STROKE OVERLAY +test(0xA74B, 0xA74A); // LATIN SMALL LETTER O WITH LONG STROKE OVERLAY, LATIN CAPITAL LETTER O WITH LONG STROKE OVERLAY +test(0xA74C, 0xA74D); // LATIN CAPITAL LETTER O WITH LOOP, LATIN SMALL LETTER O WITH LOOP +test(0xA74D, 0xA74C); // LATIN SMALL LETTER O WITH LOOP, LATIN CAPITAL LETTER O WITH LOOP +test(0xA74E, 0xA74F); // LATIN CAPITAL LETTER OO, LATIN SMALL LETTER OO +test(0xA74F, 0xA74E); // LATIN SMALL LETTER OO, LATIN CAPITAL LETTER OO +test(0xA750, 0xA751); // LATIN CAPITAL LETTER P WITH STROKE THROUGH DESCENDER, LATIN SMALL LETTER P WITH STROKE THROUGH DESCENDER +test(0xA751, 0xA750); // LATIN SMALL LETTER P WITH STROKE THROUGH DESCENDER, LATIN CAPITAL LETTER P WITH STROKE THROUGH DESCENDER +test(0xA752, 0xA753); // LATIN CAPITAL LETTER P WITH FLOURISH, LATIN SMALL LETTER P WITH FLOURISH +test(0xA753, 0xA752); // LATIN SMALL LETTER P WITH FLOURISH, LATIN CAPITAL LETTER P WITH FLOURISH +test(0xA754, 0xA755); // LATIN CAPITAL LETTER P WITH SQUIRREL TAIL, LATIN SMALL LETTER P WITH SQUIRREL TAIL +test(0xA755, 0xA754); // LATIN SMALL LETTER P WITH SQUIRREL TAIL, LATIN CAPITAL LETTER P WITH SQUIRREL TAIL +test(0xA756, 0xA757); // LATIN CAPITAL LETTER Q WITH STROKE THROUGH DESCENDER, LATIN SMALL LETTER Q WITH STROKE THROUGH DESCENDER +test(0xA757, 0xA756); // LATIN SMALL LETTER Q WITH STROKE THROUGH DESCENDER, LATIN CAPITAL LETTER Q WITH STROKE THROUGH DESCENDER +test(0xA758, 0xA759); // LATIN CAPITAL LETTER Q WITH DIAGONAL STROKE, LATIN SMALL LETTER Q WITH DIAGONAL STROKE +test(0xA759, 0xA758); // LATIN SMALL LETTER Q WITH DIAGONAL STROKE, LATIN CAPITAL LETTER Q WITH DIAGONAL STROKE +test(0xA75A, 0xA75B); // LATIN CAPITAL LETTER R ROTUNDA, LATIN SMALL LETTER R ROTUNDA +test(0xA75B, 0xA75A); // LATIN SMALL LETTER R ROTUNDA, LATIN CAPITAL LETTER R ROTUNDA +test(0xA75C, 0xA75D); // LATIN CAPITAL LETTER RUM ROTUNDA, LATIN SMALL LETTER RUM ROTUNDA +test(0xA75D, 0xA75C); // LATIN SMALL LETTER RUM ROTUNDA, LATIN CAPITAL LETTER RUM ROTUNDA +test(0xA75E, 0xA75F); // LATIN CAPITAL LETTER V WITH DIAGONAL STROKE, LATIN SMALL LETTER V WITH DIAGONAL STROKE +test(0xA75F, 0xA75E); // LATIN SMALL LETTER V WITH DIAGONAL STROKE, LATIN CAPITAL LETTER V WITH DIAGONAL STROKE +test(0xA760, 0xA761); // LATIN CAPITAL LETTER VY, LATIN SMALL LETTER VY +test(0xA761, 0xA760); // LATIN SMALL LETTER VY, LATIN CAPITAL LETTER VY +test(0xA762, 0xA763); // LATIN CAPITAL LETTER VISIGOTHIC Z, LATIN SMALL LETTER VISIGOTHIC Z +test(0xA763, 0xA762); // LATIN SMALL LETTER VISIGOTHIC Z, LATIN CAPITAL LETTER VISIGOTHIC Z +test(0xA764, 0xA765); // LATIN CAPITAL LETTER THORN WITH STROKE, LATIN SMALL LETTER THORN WITH STROKE +test(0xA765, 0xA764); // LATIN SMALL LETTER THORN WITH STROKE, LATIN CAPITAL LETTER THORN WITH STROKE +test(0xA766, 0xA767); // LATIN CAPITAL LETTER THORN WITH STROKE THROUGH DESCENDER, LATIN SMALL LETTER THORN WITH STROKE THROUGH DESCENDER +test(0xA767, 0xA766); // LATIN SMALL LETTER THORN WITH STROKE THROUGH DESCENDER, LATIN CAPITAL LETTER THORN WITH STROKE THROUGH DESCENDER +test(0xA768, 0xA769); // LATIN CAPITAL LETTER VEND, LATIN SMALL LETTER VEND +test(0xA769, 0xA768); // LATIN SMALL LETTER VEND, LATIN CAPITAL LETTER VEND +test(0xA76A, 0xA76B); // LATIN CAPITAL LETTER ET, LATIN SMALL LETTER ET +test(0xA76B, 0xA76A); // LATIN SMALL LETTER ET, LATIN CAPITAL LETTER ET +test(0xA76C, 0xA76D); // LATIN CAPITAL LETTER IS, LATIN SMALL LETTER IS +test(0xA76D, 0xA76C); // LATIN SMALL LETTER IS, LATIN CAPITAL LETTER IS +test(0xA76E, 0xA76F); // LATIN CAPITAL LETTER CON, LATIN SMALL LETTER CON +test(0xA76F, 0xA76E); // LATIN SMALL LETTER CON, LATIN CAPITAL LETTER CON +test(0xA779, 0xA77A); // LATIN CAPITAL LETTER INSULAR D, LATIN SMALL LETTER INSULAR D +test(0xA77A, 0xA779); // LATIN SMALL LETTER INSULAR D, LATIN CAPITAL LETTER INSULAR D +test(0xA77B, 0xA77C); // LATIN CAPITAL LETTER INSULAR F, LATIN SMALL LETTER INSULAR F +test(0xA77C, 0xA77B); // LATIN SMALL LETTER INSULAR F, LATIN CAPITAL LETTER INSULAR F +test(0xA77D, 0x1D79); // LATIN CAPITAL LETTER INSULAR G, LATIN SMALL LETTER INSULAR G +test(0xA77E, 0xA77F); // LATIN CAPITAL LETTER TURNED INSULAR G, LATIN SMALL LETTER TURNED INSULAR G +test(0xA77F, 0xA77E); // LATIN SMALL LETTER TURNED INSULAR G, LATIN CAPITAL LETTER TURNED INSULAR G +test(0xA780, 0xA781); // LATIN CAPITAL LETTER TURNED L, LATIN SMALL LETTER TURNED L +test(0xA781, 0xA780); // LATIN SMALL LETTER TURNED L, LATIN CAPITAL LETTER TURNED L +test(0xA782, 0xA783); // LATIN CAPITAL LETTER INSULAR R, LATIN SMALL LETTER INSULAR R +test(0xA783, 0xA782); // LATIN SMALL LETTER INSULAR R, LATIN CAPITAL LETTER INSULAR R +test(0xA784, 0xA785); // LATIN CAPITAL LETTER INSULAR S, LATIN SMALL LETTER INSULAR S +test(0xA785, 0xA784); // LATIN SMALL LETTER INSULAR S, LATIN CAPITAL LETTER INSULAR S +test(0xA786, 0xA787); // LATIN CAPITAL LETTER INSULAR T, LATIN SMALL LETTER INSULAR T +test(0xA787, 0xA786); // LATIN SMALL LETTER INSULAR T, LATIN CAPITAL LETTER INSULAR T +test(0xA78B, 0xA78C); // LATIN CAPITAL LETTER SALTILLO, LATIN SMALL LETTER SALTILLO +test(0xA78C, 0xA78B); // LATIN SMALL LETTER SALTILLO, LATIN CAPITAL LETTER SALTILLO +test(0xA78D, 0x0265); // LATIN CAPITAL LETTER TURNED H, LATIN SMALL LETTER TURNED H +test(0xA790, 0xA791); // LATIN CAPITAL LETTER N WITH DESCENDER, LATIN SMALL LETTER N WITH DESCENDER +test(0xA791, 0xA790); // LATIN SMALL LETTER N WITH DESCENDER, LATIN CAPITAL LETTER N WITH DESCENDER +test(0xA792, 0xA793); // LATIN CAPITAL LETTER C WITH BAR, LATIN SMALL LETTER C WITH BAR +test(0xA793, 0xA792); // LATIN SMALL LETTER C WITH BAR, LATIN CAPITAL LETTER C WITH BAR +test(0xA794, 0xA7C4); // LATIN SMALL LETTER C WITH PALATAL HOOK, LATIN CAPITAL LETTER C WITH PALATAL HOOK +test(0xA796, 0xA797); // LATIN CAPITAL LETTER B WITH FLOURISH, LATIN SMALL LETTER B WITH FLOURISH +test(0xA797, 0xA796); // LATIN SMALL LETTER B WITH FLOURISH, LATIN CAPITAL LETTER B WITH FLOURISH +test(0xA798, 0xA799); // LATIN CAPITAL LETTER F WITH STROKE, LATIN SMALL LETTER F WITH STROKE +test(0xA799, 0xA798); // LATIN SMALL LETTER F WITH STROKE, LATIN CAPITAL LETTER F WITH STROKE +test(0xA79A, 0xA79B); // LATIN CAPITAL LETTER VOLAPUK AE, LATIN SMALL LETTER VOLAPUK AE +test(0xA79B, 0xA79A); // LATIN SMALL LETTER VOLAPUK AE, LATIN CAPITAL LETTER VOLAPUK AE +test(0xA79C, 0xA79D); // LATIN CAPITAL LETTER VOLAPUK OE, LATIN SMALL LETTER VOLAPUK OE +test(0xA79D, 0xA79C); // LATIN SMALL LETTER VOLAPUK OE, LATIN CAPITAL LETTER VOLAPUK OE +test(0xA79E, 0xA79F); // LATIN CAPITAL LETTER VOLAPUK UE, LATIN SMALL LETTER VOLAPUK UE +test(0xA79F, 0xA79E); // LATIN SMALL LETTER VOLAPUK UE, LATIN CAPITAL LETTER VOLAPUK UE +test(0xA7A0, 0xA7A1); // LATIN CAPITAL LETTER G WITH OBLIQUE STROKE, LATIN SMALL LETTER G WITH OBLIQUE STROKE +test(0xA7A1, 0xA7A0); // LATIN SMALL LETTER G WITH OBLIQUE STROKE, LATIN CAPITAL LETTER G WITH OBLIQUE STROKE +test(0xA7A2, 0xA7A3); // LATIN CAPITAL LETTER K WITH OBLIQUE STROKE, LATIN SMALL LETTER K WITH OBLIQUE STROKE +test(0xA7A3, 0xA7A2); // LATIN SMALL LETTER K WITH OBLIQUE STROKE, LATIN CAPITAL LETTER K WITH OBLIQUE STROKE +test(0xA7A4, 0xA7A5); // LATIN CAPITAL LETTER N WITH OBLIQUE STROKE, LATIN SMALL LETTER N WITH OBLIQUE STROKE +test(0xA7A5, 0xA7A4); // LATIN SMALL LETTER N WITH OBLIQUE STROKE, LATIN CAPITAL LETTER N WITH OBLIQUE STROKE +test(0xA7A6, 0xA7A7); // LATIN CAPITAL LETTER R WITH OBLIQUE STROKE, LATIN SMALL LETTER R WITH OBLIQUE STROKE +test(0xA7A7, 0xA7A6); // LATIN SMALL LETTER R WITH OBLIQUE STROKE, LATIN CAPITAL LETTER R WITH OBLIQUE STROKE +test(0xA7A8, 0xA7A9); // LATIN CAPITAL LETTER S WITH OBLIQUE STROKE, LATIN SMALL LETTER S WITH OBLIQUE STROKE +test(0xA7A9, 0xA7A8); // LATIN SMALL LETTER S WITH OBLIQUE STROKE, LATIN CAPITAL LETTER S WITH OBLIQUE STROKE +test(0xA7AA, 0x0266); // LATIN CAPITAL LETTER H WITH HOOK, LATIN SMALL LETTER H WITH HOOK (LATIN SMALL LETTER H HOOK) +test(0xA7AB, 0x025C); // LATIN CAPITAL LETTER REVERSED OPEN E, LATIN SMALL LETTER REVERSED OPEN E (LATIN SMALL LETTER REVERSED EPSILON) +test(0xA7AC, 0x0261); // LATIN CAPITAL LETTER SCRIPT G, LATIN SMALL LETTER SCRIPT G +test(0xA7AD, 0x026C); // LATIN CAPITAL LETTER L WITH BELT, LATIN SMALL LETTER L WITH BELT (LATIN SMALL LETTER L BELT) +test(0xA7AE, 0x026A); // LATIN CAPITAL LETTER SMALL CAPITAL I, LATIN LETTER SMALL CAPITAL I +test(0xA7B0, 0x029E); // LATIN CAPITAL LETTER TURNED K, LATIN SMALL LETTER TURNED K +test(0xA7B1, 0x0287); // LATIN CAPITAL LETTER TURNED T, LATIN SMALL LETTER TURNED T +test(0xA7B2, 0x029D); // LATIN CAPITAL LETTER J WITH CROSSED-TAIL, LATIN SMALL LETTER J WITH CROSSED-TAIL (LATIN SMALL LETTER CROSSED-TAIL J) +test(0xA7B3, 0xAB53); // LATIN CAPITAL LETTER CHI, LATIN SMALL LETTER CHI +test(0xA7B4, 0xA7B5); // LATIN CAPITAL LETTER BETA, LATIN SMALL LETTER BETA +test(0xA7B5, 0xA7B4); // LATIN SMALL LETTER BETA, LATIN CAPITAL LETTER BETA +test(0xA7B6, 0xA7B7); // LATIN CAPITAL LETTER OMEGA, LATIN SMALL LETTER OMEGA +test(0xA7B7, 0xA7B6); // LATIN SMALL LETTER OMEGA, LATIN CAPITAL LETTER OMEGA +test(0xA7B8, 0xA7B9); // LATIN CAPITAL LETTER U WITH STROKE, LATIN SMALL LETTER U WITH STROKE +test(0xA7B9, 0xA7B8); // LATIN SMALL LETTER U WITH STROKE, LATIN CAPITAL LETTER U WITH STROKE +test(0xA7BA, 0xA7BB); // LATIN CAPITAL LETTER GLOTTAL A, LATIN SMALL LETTER GLOTTAL A +test(0xA7BB, 0xA7BA); // LATIN SMALL LETTER GLOTTAL A, LATIN CAPITAL LETTER GLOTTAL A +test(0xA7BC, 0xA7BD); // LATIN CAPITAL LETTER GLOTTAL I, LATIN SMALL LETTER GLOTTAL I +test(0xA7BD, 0xA7BC); // LATIN SMALL LETTER GLOTTAL I, LATIN CAPITAL LETTER GLOTTAL I +test(0xA7BE, 0xA7BF); // LATIN CAPITAL LETTER GLOTTAL U, LATIN SMALL LETTER GLOTTAL U +test(0xA7BF, 0xA7BE); // LATIN SMALL LETTER GLOTTAL U, LATIN CAPITAL LETTER GLOTTAL U +test(0xA7C0, 0xA7C1); // LATIN CAPITAL LETTER OLD POLISH O, LATIN SMALL LETTER OLD POLISH O +test(0xA7C1, 0xA7C0); // LATIN SMALL LETTER OLD POLISH O, LATIN CAPITAL LETTER OLD POLISH O +test(0xA7C2, 0xA7C3); // LATIN CAPITAL LETTER ANGLICANA W, LATIN SMALL LETTER ANGLICANA W +test(0xA7C3, 0xA7C2); // LATIN SMALL LETTER ANGLICANA W, LATIN CAPITAL LETTER ANGLICANA W +test(0xA7C4, 0xA794); // LATIN CAPITAL LETTER C WITH PALATAL HOOK, LATIN SMALL LETTER C WITH PALATAL HOOK +test(0xA7C5, 0x0282); // LATIN CAPITAL LETTER S WITH HOOK, LATIN SMALL LETTER S WITH HOOK (LATIN SMALL LETTER S HOOK) +test(0xA7C6, 0x1D8E); // LATIN CAPITAL LETTER Z WITH PALATAL HOOK, LATIN SMALL LETTER Z WITH PALATAL HOOK +test(0xA7C7, 0xA7C8); // LATIN CAPITAL LETTER D WITH SHORT STROKE OVERLAY, LATIN SMALL LETTER D WITH SHORT STROKE OVERLAY +test(0xA7C8, 0xA7C7); // LATIN SMALL LETTER D WITH SHORT STROKE OVERLAY, LATIN CAPITAL LETTER D WITH SHORT STROKE OVERLAY +test(0xA7C9, 0xA7CA); // LATIN CAPITAL LETTER S WITH SHORT STROKE OVERLAY, LATIN SMALL LETTER S WITH SHORT STROKE OVERLAY +test(0xA7CA, 0xA7C9); // LATIN SMALL LETTER S WITH SHORT STROKE OVERLAY, LATIN CAPITAL LETTER S WITH SHORT STROKE OVERLAY +test(0xA7D0, 0xA7D1); // LATIN CAPITAL LETTER CLOSED INSULAR G, LATIN SMALL LETTER CLOSED INSULAR G +test(0xA7D1, 0xA7D0); // LATIN SMALL LETTER CLOSED INSULAR G, LATIN CAPITAL LETTER CLOSED INSULAR G +test(0xA7D6, 0xA7D7); // LATIN CAPITAL LETTER MIDDLE SCOTS S, LATIN SMALL LETTER MIDDLE SCOTS S +test(0xA7D7, 0xA7D6); // LATIN SMALL LETTER MIDDLE SCOTS S, LATIN CAPITAL LETTER MIDDLE SCOTS S +test(0xA7D8, 0xA7D9); // LATIN CAPITAL LETTER SIGMOID S, LATIN SMALL LETTER SIGMOID S +test(0xA7D9, 0xA7D8); // LATIN SMALL LETTER SIGMOID S, LATIN CAPITAL LETTER SIGMOID S +test(0xA7F5, 0xA7F6); // LATIN CAPITAL LETTER REVERSED HALF H, LATIN SMALL LETTER REVERSED HALF H +test(0xA7F6, 0xA7F5); // LATIN SMALL LETTER REVERSED HALF H, LATIN CAPITAL LETTER REVERSED HALF H +test(0xAB53, 0xA7B3); // LATIN SMALL LETTER CHI, LATIN CAPITAL LETTER CHI +test(0xAB70, 0x13A0); // CHEROKEE SMALL LETTER A, CHEROKEE LETTER A +test(0xAB71, 0x13A1); // CHEROKEE SMALL LETTER E, CHEROKEE LETTER E +test(0xAB72, 0x13A2); // CHEROKEE SMALL LETTER I, CHEROKEE LETTER I +test(0xAB73, 0x13A3); // CHEROKEE SMALL LETTER O, CHEROKEE LETTER O +test(0xAB74, 0x13A4); // CHEROKEE SMALL LETTER U, CHEROKEE LETTER U +test(0xAB75, 0x13A5); // CHEROKEE SMALL LETTER V, CHEROKEE LETTER V +test(0xAB76, 0x13A6); // CHEROKEE SMALL LETTER GA, CHEROKEE LETTER GA +test(0xAB77, 0x13A7); // CHEROKEE SMALL LETTER KA, CHEROKEE LETTER KA +test(0xAB78, 0x13A8); // CHEROKEE SMALL LETTER GE, CHEROKEE LETTER GE +test(0xAB79, 0x13A9); // CHEROKEE SMALL LETTER GI, CHEROKEE LETTER GI +test(0xAB7A, 0x13AA); // CHEROKEE SMALL LETTER GO, CHEROKEE LETTER GO +test(0xAB7B, 0x13AB); // CHEROKEE SMALL LETTER GU, CHEROKEE LETTER GU +test(0xAB7C, 0x13AC); // CHEROKEE SMALL LETTER GV, CHEROKEE LETTER GV +test(0xAB7D, 0x13AD); // CHEROKEE SMALL LETTER HA, CHEROKEE LETTER HA +test(0xAB7E, 0x13AE); // CHEROKEE SMALL LETTER HE, CHEROKEE LETTER HE +test(0xAB7F, 0x13AF); // CHEROKEE SMALL LETTER HI, CHEROKEE LETTER HI +test(0xAB80, 0x13B0); // CHEROKEE SMALL LETTER HO, CHEROKEE LETTER HO +test(0xAB81, 0x13B1); // CHEROKEE SMALL LETTER HU, CHEROKEE LETTER HU +test(0xAB82, 0x13B2); // CHEROKEE SMALL LETTER HV, CHEROKEE LETTER HV +test(0xAB83, 0x13B3); // CHEROKEE SMALL LETTER LA, CHEROKEE LETTER LA +test(0xAB84, 0x13B4); // CHEROKEE SMALL LETTER LE, CHEROKEE LETTER LE +test(0xAB85, 0x13B5); // CHEROKEE SMALL LETTER LI, CHEROKEE LETTER LI +test(0xAB86, 0x13B6); // CHEROKEE SMALL LETTER LO, CHEROKEE LETTER LO +test(0xAB87, 0x13B7); // CHEROKEE SMALL LETTER LU, CHEROKEE LETTER LU +test(0xAB88, 0x13B8); // CHEROKEE SMALL LETTER LV, CHEROKEE LETTER LV +test(0xAB89, 0x13B9); // CHEROKEE SMALL LETTER MA, CHEROKEE LETTER MA +test(0xAB8A, 0x13BA); // CHEROKEE SMALL LETTER ME, CHEROKEE LETTER ME +test(0xAB8B, 0x13BB); // CHEROKEE SMALL LETTER MI, CHEROKEE LETTER MI +test(0xAB8C, 0x13BC); // CHEROKEE SMALL LETTER MO, CHEROKEE LETTER MO +test(0xAB8D, 0x13BD); // CHEROKEE SMALL LETTER MU, CHEROKEE LETTER MU +test(0xAB8E, 0x13BE); // CHEROKEE SMALL LETTER NA, CHEROKEE LETTER NA +test(0xAB8F, 0x13BF); // CHEROKEE SMALL LETTER HNA, CHEROKEE LETTER HNA +test(0xAB90, 0x13C0); // CHEROKEE SMALL LETTER NAH, CHEROKEE LETTER NAH +test(0xAB91, 0x13C1); // CHEROKEE SMALL LETTER NE, CHEROKEE LETTER NE +test(0xAB92, 0x13C2); // CHEROKEE SMALL LETTER NI, CHEROKEE LETTER NI +test(0xAB93, 0x13C3); // CHEROKEE SMALL LETTER NO, CHEROKEE LETTER NO +test(0xAB94, 0x13C4); // CHEROKEE SMALL LETTER NU, CHEROKEE LETTER NU +test(0xAB95, 0x13C5); // CHEROKEE SMALL LETTER NV, CHEROKEE LETTER NV +test(0xAB96, 0x13C6); // CHEROKEE SMALL LETTER QUA, CHEROKEE LETTER QUA +test(0xAB97, 0x13C7); // CHEROKEE SMALL LETTER QUE, CHEROKEE LETTER QUE +test(0xAB98, 0x13C8); // CHEROKEE SMALL LETTER QUI, CHEROKEE LETTER QUI +test(0xAB99, 0x13C9); // CHEROKEE SMALL LETTER QUO, CHEROKEE LETTER QUO +test(0xAB9A, 0x13CA); // CHEROKEE SMALL LETTER QUU, CHEROKEE LETTER QUU +test(0xAB9B, 0x13CB); // CHEROKEE SMALL LETTER QUV, CHEROKEE LETTER QUV +test(0xAB9C, 0x13CC); // CHEROKEE SMALL LETTER SA, CHEROKEE LETTER SA +test(0xAB9D, 0x13CD); // CHEROKEE SMALL LETTER S, CHEROKEE LETTER S +test(0xAB9E, 0x13CE); // CHEROKEE SMALL LETTER SE, CHEROKEE LETTER SE +test(0xAB9F, 0x13CF); // CHEROKEE SMALL LETTER SI, CHEROKEE LETTER SI +test(0xABA0, 0x13D0); // CHEROKEE SMALL LETTER SO, CHEROKEE LETTER SO +test(0xABA1, 0x13D1); // CHEROKEE SMALL LETTER SU, CHEROKEE LETTER SU +test(0xABA2, 0x13D2); // CHEROKEE SMALL LETTER SV, CHEROKEE LETTER SV +test(0xABA3, 0x13D3); // CHEROKEE SMALL LETTER DA, CHEROKEE LETTER DA +test(0xABA4, 0x13D4); // CHEROKEE SMALL LETTER TA, CHEROKEE LETTER TA +test(0xABA5, 0x13D5); // CHEROKEE SMALL LETTER DE, CHEROKEE LETTER DE +test(0xABA6, 0x13D6); // CHEROKEE SMALL LETTER TE, CHEROKEE LETTER TE +test(0xABA7, 0x13D7); // CHEROKEE SMALL LETTER DI, CHEROKEE LETTER DI +test(0xABA8, 0x13D8); // CHEROKEE SMALL LETTER TI, CHEROKEE LETTER TI +test(0xABA9, 0x13D9); // CHEROKEE SMALL LETTER DO, CHEROKEE LETTER DO +test(0xABAA, 0x13DA); // CHEROKEE SMALL LETTER DU, CHEROKEE LETTER DU +test(0xABAB, 0x13DB); // CHEROKEE SMALL LETTER DV, CHEROKEE LETTER DV +test(0xABAC, 0x13DC); // CHEROKEE SMALL LETTER DLA, CHEROKEE LETTER DLA +test(0xABAD, 0x13DD); // CHEROKEE SMALL LETTER TLA, CHEROKEE LETTER TLA +test(0xABAE, 0x13DE); // CHEROKEE SMALL LETTER TLE, CHEROKEE LETTER TLE +test(0xABAF, 0x13DF); // CHEROKEE SMALL LETTER TLI, CHEROKEE LETTER TLI +test(0xABB0, 0x13E0); // CHEROKEE SMALL LETTER TLO, CHEROKEE LETTER TLO +test(0xABB1, 0x13E1); // CHEROKEE SMALL LETTER TLU, CHEROKEE LETTER TLU +test(0xABB2, 0x13E2); // CHEROKEE SMALL LETTER TLV, CHEROKEE LETTER TLV +test(0xABB3, 0x13E3); // CHEROKEE SMALL LETTER TSA, CHEROKEE LETTER TSA +test(0xABB4, 0x13E4); // CHEROKEE SMALL LETTER TSE, CHEROKEE LETTER TSE +test(0xABB5, 0x13E5); // CHEROKEE SMALL LETTER TSI, CHEROKEE LETTER TSI +test(0xABB6, 0x13E6); // CHEROKEE SMALL LETTER TSO, CHEROKEE LETTER TSO +test(0xABB7, 0x13E7); // CHEROKEE SMALL LETTER TSU, CHEROKEE LETTER TSU +test(0xABB8, 0x13E8); // CHEROKEE SMALL LETTER TSV, CHEROKEE LETTER TSV +test(0xABB9, 0x13E9); // CHEROKEE SMALL LETTER WA, CHEROKEE LETTER WA +test(0xABBA, 0x13EA); // CHEROKEE SMALL LETTER WE, CHEROKEE LETTER WE +test(0xABBB, 0x13EB); // CHEROKEE SMALL LETTER WI, CHEROKEE LETTER WI +test(0xABBC, 0x13EC); // CHEROKEE SMALL LETTER WO, CHEROKEE LETTER WO +test(0xABBD, 0x13ED); // CHEROKEE SMALL LETTER WU, CHEROKEE LETTER WU +test(0xABBE, 0x13EE); // CHEROKEE SMALL LETTER WV, CHEROKEE LETTER WV +test(0xABBF, 0x13EF); // CHEROKEE SMALL LETTER YA, CHEROKEE LETTER YA +test(0xFF21, 0xFF41); // FULLWIDTH LATIN CAPITAL LETTER A, FULLWIDTH LATIN SMALL LETTER A +test(0xFF22, 0xFF42); // FULLWIDTH LATIN CAPITAL LETTER B, FULLWIDTH LATIN SMALL LETTER B +test(0xFF23, 0xFF43); // FULLWIDTH LATIN CAPITAL LETTER C, FULLWIDTH LATIN SMALL LETTER C +test(0xFF24, 0xFF44); // FULLWIDTH LATIN CAPITAL LETTER D, FULLWIDTH LATIN SMALL LETTER D +test(0xFF25, 0xFF45); // FULLWIDTH LATIN CAPITAL LETTER E, FULLWIDTH LATIN SMALL LETTER E +test(0xFF26, 0xFF46); // FULLWIDTH LATIN CAPITAL LETTER F, FULLWIDTH LATIN SMALL LETTER F +test(0xFF27, 0xFF47); // FULLWIDTH LATIN CAPITAL LETTER G, FULLWIDTH LATIN SMALL LETTER G +test(0xFF28, 0xFF48); // FULLWIDTH LATIN CAPITAL LETTER H, FULLWIDTH LATIN SMALL LETTER H +test(0xFF29, 0xFF49); // FULLWIDTH LATIN CAPITAL LETTER I, FULLWIDTH LATIN SMALL LETTER I +test(0xFF2A, 0xFF4A); // FULLWIDTH LATIN CAPITAL LETTER J, FULLWIDTH LATIN SMALL LETTER J +test(0xFF2B, 0xFF4B); // FULLWIDTH LATIN CAPITAL LETTER K, FULLWIDTH LATIN SMALL LETTER K +test(0xFF2C, 0xFF4C); // FULLWIDTH LATIN CAPITAL LETTER L, FULLWIDTH LATIN SMALL LETTER L +test(0xFF2D, 0xFF4D); // FULLWIDTH LATIN CAPITAL LETTER M, FULLWIDTH LATIN SMALL LETTER M +test(0xFF2E, 0xFF4E); // FULLWIDTH LATIN CAPITAL LETTER N, FULLWIDTH LATIN SMALL LETTER N +test(0xFF2F, 0xFF4F); // FULLWIDTH LATIN CAPITAL LETTER O, FULLWIDTH LATIN SMALL LETTER O +test(0xFF30, 0xFF50); // FULLWIDTH LATIN CAPITAL LETTER P, FULLWIDTH LATIN SMALL LETTER P +test(0xFF31, 0xFF51); // FULLWIDTH LATIN CAPITAL LETTER Q, FULLWIDTH LATIN SMALL LETTER Q +test(0xFF32, 0xFF52); // FULLWIDTH LATIN CAPITAL LETTER R, FULLWIDTH LATIN SMALL LETTER R +test(0xFF33, 0xFF53); // FULLWIDTH LATIN CAPITAL LETTER S, FULLWIDTH LATIN SMALL LETTER S +test(0xFF34, 0xFF54); // FULLWIDTH LATIN CAPITAL LETTER T, FULLWIDTH LATIN SMALL LETTER T +test(0xFF35, 0xFF55); // FULLWIDTH LATIN CAPITAL LETTER U, FULLWIDTH LATIN SMALL LETTER U +test(0xFF36, 0xFF56); // FULLWIDTH LATIN CAPITAL LETTER V, FULLWIDTH LATIN SMALL LETTER V +test(0xFF37, 0xFF57); // FULLWIDTH LATIN CAPITAL LETTER W, FULLWIDTH LATIN SMALL LETTER W +test(0xFF38, 0xFF58); // FULLWIDTH LATIN CAPITAL LETTER X, FULLWIDTH LATIN SMALL LETTER X +test(0xFF39, 0xFF59); // FULLWIDTH LATIN CAPITAL LETTER Y, FULLWIDTH LATIN SMALL LETTER Y +test(0xFF3A, 0xFF5A); // FULLWIDTH LATIN CAPITAL LETTER Z, FULLWIDTH LATIN SMALL LETTER Z +test(0xFF41, 0xFF21); // FULLWIDTH LATIN SMALL LETTER A, FULLWIDTH LATIN CAPITAL LETTER A +test(0xFF42, 0xFF22); // FULLWIDTH LATIN SMALL LETTER B, FULLWIDTH LATIN CAPITAL LETTER B +test(0xFF43, 0xFF23); // FULLWIDTH LATIN SMALL LETTER C, FULLWIDTH LATIN CAPITAL LETTER C +test(0xFF44, 0xFF24); // FULLWIDTH LATIN SMALL LETTER D, FULLWIDTH LATIN CAPITAL LETTER D +test(0xFF45, 0xFF25); // FULLWIDTH LATIN SMALL LETTER E, FULLWIDTH LATIN CAPITAL LETTER E +test(0xFF46, 0xFF26); // FULLWIDTH LATIN SMALL LETTER F, FULLWIDTH LATIN CAPITAL LETTER F +test(0xFF47, 0xFF27); // FULLWIDTH LATIN SMALL LETTER G, FULLWIDTH LATIN CAPITAL LETTER G +test(0xFF48, 0xFF28); // FULLWIDTH LATIN SMALL LETTER H, FULLWIDTH LATIN CAPITAL LETTER H +test(0xFF49, 0xFF29); // FULLWIDTH LATIN SMALL LETTER I, FULLWIDTH LATIN CAPITAL LETTER I +test(0xFF4A, 0xFF2A); // FULLWIDTH LATIN SMALL LETTER J, FULLWIDTH LATIN CAPITAL LETTER J +test(0xFF4B, 0xFF2B); // FULLWIDTH LATIN SMALL LETTER K, FULLWIDTH LATIN CAPITAL LETTER K +test(0xFF4C, 0xFF2C); // FULLWIDTH LATIN SMALL LETTER L, FULLWIDTH LATIN CAPITAL LETTER L +test(0xFF4D, 0xFF2D); // FULLWIDTH LATIN SMALL LETTER M, FULLWIDTH LATIN CAPITAL LETTER M +test(0xFF4E, 0xFF2E); // FULLWIDTH LATIN SMALL LETTER N, FULLWIDTH LATIN CAPITAL LETTER N +test(0xFF4F, 0xFF2F); // FULLWIDTH LATIN SMALL LETTER O, FULLWIDTH LATIN CAPITAL LETTER O +test(0xFF50, 0xFF30); // FULLWIDTH LATIN SMALL LETTER P, FULLWIDTH LATIN CAPITAL LETTER P +test(0xFF51, 0xFF31); // FULLWIDTH LATIN SMALL LETTER Q, FULLWIDTH LATIN CAPITAL LETTER Q +test(0xFF52, 0xFF32); // FULLWIDTH LATIN SMALL LETTER R, FULLWIDTH LATIN CAPITAL LETTER R +test(0xFF53, 0xFF33); // FULLWIDTH LATIN SMALL LETTER S, FULLWIDTH LATIN CAPITAL LETTER S +test(0xFF54, 0xFF34); // FULLWIDTH LATIN SMALL LETTER T, FULLWIDTH LATIN CAPITAL LETTER T +test(0xFF55, 0xFF35); // FULLWIDTH LATIN SMALL LETTER U, FULLWIDTH LATIN CAPITAL LETTER U +test(0xFF56, 0xFF36); // FULLWIDTH LATIN SMALL LETTER V, FULLWIDTH LATIN CAPITAL LETTER V +test(0xFF57, 0xFF37); // FULLWIDTH LATIN SMALL LETTER W, FULLWIDTH LATIN CAPITAL LETTER W +test(0xFF58, 0xFF38); // FULLWIDTH LATIN SMALL LETTER X, FULLWIDTH LATIN CAPITAL LETTER X +test(0xFF59, 0xFF39); // FULLWIDTH LATIN SMALL LETTER Y, FULLWIDTH LATIN CAPITAL LETTER Y +test(0xFF5A, 0xFF3A); // FULLWIDTH LATIN SMALL LETTER Z, FULLWIDTH LATIN CAPITAL LETTER Z +test(0x10400, 0x10428); // DESERET CAPITAL LETTER LONG I, DESERET SMALL LETTER LONG I +test(0x10401, 0x10429); // DESERET CAPITAL LETTER LONG E, DESERET SMALL LETTER LONG E +test(0x10402, 0x1042A); // DESERET CAPITAL LETTER LONG A, DESERET SMALL LETTER LONG A +test(0x10403, 0x1042B); // DESERET CAPITAL LETTER LONG AH, DESERET SMALL LETTER LONG AH +test(0x10404, 0x1042C); // DESERET CAPITAL LETTER LONG O, DESERET SMALL LETTER LONG O +test(0x10405, 0x1042D); // DESERET CAPITAL LETTER LONG OO, DESERET SMALL LETTER LONG OO +test(0x10406, 0x1042E); // DESERET CAPITAL LETTER SHORT I, DESERET SMALL LETTER SHORT I +test(0x10407, 0x1042F); // DESERET CAPITAL LETTER SHORT E, DESERET SMALL LETTER SHORT E +test(0x10408, 0x10430); // DESERET CAPITAL LETTER SHORT A, DESERET SMALL LETTER SHORT A +test(0x10409, 0x10431); // DESERET CAPITAL LETTER SHORT AH, DESERET SMALL LETTER SHORT AH +test(0x1040A, 0x10432); // DESERET CAPITAL LETTER SHORT O, DESERET SMALL LETTER SHORT O +test(0x1040B, 0x10433); // DESERET CAPITAL LETTER SHORT OO, DESERET SMALL LETTER SHORT OO +test(0x1040C, 0x10434); // DESERET CAPITAL LETTER AY, DESERET SMALL LETTER AY +test(0x1040D, 0x10435); // DESERET CAPITAL LETTER OW, DESERET SMALL LETTER OW +test(0x1040E, 0x10436); // DESERET CAPITAL LETTER WU, DESERET SMALL LETTER WU +test(0x1040F, 0x10437); // DESERET CAPITAL LETTER YEE, DESERET SMALL LETTER YEE +test(0x10410, 0x10438); // DESERET CAPITAL LETTER H, DESERET SMALL LETTER H +test(0x10411, 0x10439); // DESERET CAPITAL LETTER PEE, DESERET SMALL LETTER PEE +test(0x10412, 0x1043A); // DESERET CAPITAL LETTER BEE, DESERET SMALL LETTER BEE +test(0x10413, 0x1043B); // DESERET CAPITAL LETTER TEE, DESERET SMALL LETTER TEE +test(0x10414, 0x1043C); // DESERET CAPITAL LETTER DEE, DESERET SMALL LETTER DEE +test(0x10415, 0x1043D); // DESERET CAPITAL LETTER CHEE, DESERET SMALL LETTER CHEE +test(0x10416, 0x1043E); // DESERET CAPITAL LETTER JEE, DESERET SMALL LETTER JEE +test(0x10417, 0x1043F); // DESERET CAPITAL LETTER KAY, DESERET SMALL LETTER KAY +test(0x10418, 0x10440); // DESERET CAPITAL LETTER GAY, DESERET SMALL LETTER GAY +test(0x10419, 0x10441); // DESERET CAPITAL LETTER EF, DESERET SMALL LETTER EF +test(0x1041A, 0x10442); // DESERET CAPITAL LETTER VEE, DESERET SMALL LETTER VEE +test(0x1041B, 0x10443); // DESERET CAPITAL LETTER ETH, DESERET SMALL LETTER ETH +test(0x1041C, 0x10444); // DESERET CAPITAL LETTER THEE, DESERET SMALL LETTER THEE +test(0x1041D, 0x10445); // DESERET CAPITAL LETTER ES, DESERET SMALL LETTER ES +test(0x1041E, 0x10446); // DESERET CAPITAL LETTER ZEE, DESERET SMALL LETTER ZEE +test(0x1041F, 0x10447); // DESERET CAPITAL LETTER ESH, DESERET SMALL LETTER ESH +test(0x10420, 0x10448); // DESERET CAPITAL LETTER ZHEE, DESERET SMALL LETTER ZHEE +test(0x10421, 0x10449); // DESERET CAPITAL LETTER ER, DESERET SMALL LETTER ER +test(0x10422, 0x1044A); // DESERET CAPITAL LETTER EL, DESERET SMALL LETTER EL +test(0x10423, 0x1044B); // DESERET CAPITAL LETTER EM, DESERET SMALL LETTER EM +test(0x10424, 0x1044C); // DESERET CAPITAL LETTER EN, DESERET SMALL LETTER EN +test(0x10425, 0x1044D); // DESERET CAPITAL LETTER ENG, DESERET SMALL LETTER ENG +test(0x10426, 0x1044E); // DESERET CAPITAL LETTER OI, DESERET SMALL LETTER OI +test(0x10427, 0x1044F); // DESERET CAPITAL LETTER EW, DESERET SMALL LETTER EW +test(0x10428, 0x10400); // DESERET SMALL LETTER LONG I, DESERET CAPITAL LETTER LONG I +test(0x10429, 0x10401); // DESERET SMALL LETTER LONG E, DESERET CAPITAL LETTER LONG E +test(0x1042A, 0x10402); // DESERET SMALL LETTER LONG A, DESERET CAPITAL LETTER LONG A +test(0x1042B, 0x10403); // DESERET SMALL LETTER LONG AH, DESERET CAPITAL LETTER LONG AH +test(0x1042C, 0x10404); // DESERET SMALL LETTER LONG O, DESERET CAPITAL LETTER LONG O +test(0x1042D, 0x10405); // DESERET SMALL LETTER LONG OO, DESERET CAPITAL LETTER LONG OO +test(0x1042E, 0x10406); // DESERET SMALL LETTER SHORT I, DESERET CAPITAL LETTER SHORT I +test(0x1042F, 0x10407); // DESERET SMALL LETTER SHORT E, DESERET CAPITAL LETTER SHORT E +test(0x10430, 0x10408); // DESERET SMALL LETTER SHORT A, DESERET CAPITAL LETTER SHORT A +test(0x10431, 0x10409); // DESERET SMALL LETTER SHORT AH, DESERET CAPITAL LETTER SHORT AH +test(0x10432, 0x1040A); // DESERET SMALL LETTER SHORT O, DESERET CAPITAL LETTER SHORT O +test(0x10433, 0x1040B); // DESERET SMALL LETTER SHORT OO, DESERET CAPITAL LETTER SHORT OO +test(0x10434, 0x1040C); // DESERET SMALL LETTER AY, DESERET CAPITAL LETTER AY +test(0x10435, 0x1040D); // DESERET SMALL LETTER OW, DESERET CAPITAL LETTER OW +test(0x10436, 0x1040E); // DESERET SMALL LETTER WU, DESERET CAPITAL LETTER WU +test(0x10437, 0x1040F); // DESERET SMALL LETTER YEE, DESERET CAPITAL LETTER YEE +test(0x10438, 0x10410); // DESERET SMALL LETTER H, DESERET CAPITAL LETTER H +test(0x10439, 0x10411); // DESERET SMALL LETTER PEE, DESERET CAPITAL LETTER PEE +test(0x1043A, 0x10412); // DESERET SMALL LETTER BEE, DESERET CAPITAL LETTER BEE +test(0x1043B, 0x10413); // DESERET SMALL LETTER TEE, DESERET CAPITAL LETTER TEE +test(0x1043C, 0x10414); // DESERET SMALL LETTER DEE, DESERET CAPITAL LETTER DEE +test(0x1043D, 0x10415); // DESERET SMALL LETTER CHEE, DESERET CAPITAL LETTER CHEE +test(0x1043E, 0x10416); // DESERET SMALL LETTER JEE, DESERET CAPITAL LETTER JEE +test(0x1043F, 0x10417); // DESERET SMALL LETTER KAY, DESERET CAPITAL LETTER KAY +test(0x10440, 0x10418); // DESERET SMALL LETTER GAY, DESERET CAPITAL LETTER GAY +test(0x10441, 0x10419); // DESERET SMALL LETTER EF, DESERET CAPITAL LETTER EF +test(0x10442, 0x1041A); // DESERET SMALL LETTER VEE, DESERET CAPITAL LETTER VEE +test(0x10443, 0x1041B); // DESERET SMALL LETTER ETH, DESERET CAPITAL LETTER ETH +test(0x10444, 0x1041C); // DESERET SMALL LETTER THEE, DESERET CAPITAL LETTER THEE +test(0x10445, 0x1041D); // DESERET SMALL LETTER ES, DESERET CAPITAL LETTER ES +test(0x10446, 0x1041E); // DESERET SMALL LETTER ZEE, DESERET CAPITAL LETTER ZEE +test(0x10447, 0x1041F); // DESERET SMALL LETTER ESH, DESERET CAPITAL LETTER ESH +test(0x10448, 0x10420); // DESERET SMALL LETTER ZHEE, DESERET CAPITAL LETTER ZHEE +test(0x10449, 0x10421); // DESERET SMALL LETTER ER, DESERET CAPITAL LETTER ER +test(0x1044A, 0x10422); // DESERET SMALL LETTER EL, DESERET CAPITAL LETTER EL +test(0x1044B, 0x10423); // DESERET SMALL LETTER EM, DESERET CAPITAL LETTER EM +test(0x1044C, 0x10424); // DESERET SMALL LETTER EN, DESERET CAPITAL LETTER EN +test(0x1044D, 0x10425); // DESERET SMALL LETTER ENG, DESERET CAPITAL LETTER ENG +test(0x1044E, 0x10426); // DESERET SMALL LETTER OI, DESERET CAPITAL LETTER OI +test(0x1044F, 0x10427); // DESERET SMALL LETTER EW, DESERET CAPITAL LETTER EW +test(0x104B0, 0x104D8); // OSAGE CAPITAL LETTER A, OSAGE SMALL LETTER A +test(0x104B1, 0x104D9); // OSAGE CAPITAL LETTER AI, OSAGE SMALL LETTER AI +test(0x104B2, 0x104DA); // OSAGE CAPITAL LETTER AIN, OSAGE SMALL LETTER AIN +test(0x104B3, 0x104DB); // OSAGE CAPITAL LETTER AH, OSAGE SMALL LETTER AH +test(0x104B4, 0x104DC); // OSAGE CAPITAL LETTER BRA, OSAGE SMALL LETTER BRA +test(0x104B5, 0x104DD); // OSAGE CAPITAL LETTER CHA, OSAGE SMALL LETTER CHA +test(0x104B6, 0x104DE); // OSAGE CAPITAL LETTER EHCHA, OSAGE SMALL LETTER EHCHA +test(0x104B7, 0x104DF); // OSAGE CAPITAL LETTER E, OSAGE SMALL LETTER E +test(0x104B8, 0x104E0); // OSAGE CAPITAL LETTER EIN, OSAGE SMALL LETTER EIN +test(0x104B9, 0x104E1); // OSAGE CAPITAL LETTER HA, OSAGE SMALL LETTER HA +test(0x104BA, 0x104E2); // OSAGE CAPITAL LETTER HYA, OSAGE SMALL LETTER HYA +test(0x104BB, 0x104E3); // OSAGE CAPITAL LETTER I, OSAGE SMALL LETTER I +test(0x104BC, 0x104E4); // OSAGE CAPITAL LETTER KA, OSAGE SMALL LETTER KA +test(0x104BD, 0x104E5); // OSAGE CAPITAL LETTER EHKA, OSAGE SMALL LETTER EHKA +test(0x104BE, 0x104E6); // OSAGE CAPITAL LETTER KYA, OSAGE SMALL LETTER KYA +test(0x104BF, 0x104E7); // OSAGE CAPITAL LETTER LA, OSAGE SMALL LETTER LA +test(0x104C0, 0x104E8); // OSAGE CAPITAL LETTER MA, OSAGE SMALL LETTER MA +test(0x104C1, 0x104E9); // OSAGE CAPITAL LETTER NA, OSAGE SMALL LETTER NA +test(0x104C2, 0x104EA); // OSAGE CAPITAL LETTER O, OSAGE SMALL LETTER O +test(0x104C3, 0x104EB); // OSAGE CAPITAL LETTER OIN, OSAGE SMALL LETTER OIN +test(0x104C4, 0x104EC); // OSAGE CAPITAL LETTER PA, OSAGE SMALL LETTER PA +test(0x104C5, 0x104ED); // OSAGE CAPITAL LETTER EHPA, OSAGE SMALL LETTER EHPA +test(0x104C6, 0x104EE); // OSAGE CAPITAL LETTER SA, OSAGE SMALL LETTER SA +test(0x104C7, 0x104EF); // OSAGE CAPITAL LETTER SHA, OSAGE SMALL LETTER SHA +test(0x104C8, 0x104F0); // OSAGE CAPITAL LETTER TA, OSAGE SMALL LETTER TA +test(0x104C9, 0x104F1); // OSAGE CAPITAL LETTER EHTA, OSAGE SMALL LETTER EHTA +test(0x104CA, 0x104F2); // OSAGE CAPITAL LETTER TSA, OSAGE SMALL LETTER TSA +test(0x104CB, 0x104F3); // OSAGE CAPITAL LETTER EHTSA, OSAGE SMALL LETTER EHTSA +test(0x104CC, 0x104F4); // OSAGE CAPITAL LETTER TSHA, OSAGE SMALL LETTER TSHA +test(0x104CD, 0x104F5); // OSAGE CAPITAL LETTER DHA, OSAGE SMALL LETTER DHA +test(0x104CE, 0x104F6); // OSAGE CAPITAL LETTER U, OSAGE SMALL LETTER U +test(0x104CF, 0x104F7); // OSAGE CAPITAL LETTER WA, OSAGE SMALL LETTER WA +test(0x104D0, 0x104F8); // OSAGE CAPITAL LETTER KHA, OSAGE SMALL LETTER KHA +test(0x104D1, 0x104F9); // OSAGE CAPITAL LETTER GHA, OSAGE SMALL LETTER GHA +test(0x104D2, 0x104FA); // OSAGE CAPITAL LETTER ZA, OSAGE SMALL LETTER ZA +test(0x104D3, 0x104FB); // OSAGE CAPITAL LETTER ZHA, OSAGE SMALL LETTER ZHA +test(0x104D8, 0x104B0); // OSAGE SMALL LETTER A, OSAGE CAPITAL LETTER A +test(0x104D9, 0x104B1); // OSAGE SMALL LETTER AI, OSAGE CAPITAL LETTER AI +test(0x104DA, 0x104B2); // OSAGE SMALL LETTER AIN, OSAGE CAPITAL LETTER AIN +test(0x104DB, 0x104B3); // OSAGE SMALL LETTER AH, OSAGE CAPITAL LETTER AH +test(0x104DC, 0x104B4); // OSAGE SMALL LETTER BRA, OSAGE CAPITAL LETTER BRA +test(0x104DD, 0x104B5); // OSAGE SMALL LETTER CHA, OSAGE CAPITAL LETTER CHA +test(0x104DE, 0x104B6); // OSAGE SMALL LETTER EHCHA, OSAGE CAPITAL LETTER EHCHA +test(0x104DF, 0x104B7); // OSAGE SMALL LETTER E, OSAGE CAPITAL LETTER E +test(0x104E0, 0x104B8); // OSAGE SMALL LETTER EIN, OSAGE CAPITAL LETTER EIN +test(0x104E1, 0x104B9); // OSAGE SMALL LETTER HA, OSAGE CAPITAL LETTER HA +test(0x104E2, 0x104BA); // OSAGE SMALL LETTER HYA, OSAGE CAPITAL LETTER HYA +test(0x104E3, 0x104BB); // OSAGE SMALL LETTER I, OSAGE CAPITAL LETTER I +test(0x104E4, 0x104BC); // OSAGE SMALL LETTER KA, OSAGE CAPITAL LETTER KA +test(0x104E5, 0x104BD); // OSAGE SMALL LETTER EHKA, OSAGE CAPITAL LETTER EHKA +test(0x104E6, 0x104BE); // OSAGE SMALL LETTER KYA, OSAGE CAPITAL LETTER KYA +test(0x104E7, 0x104BF); // OSAGE SMALL LETTER LA, OSAGE CAPITAL LETTER LA +test(0x104E8, 0x104C0); // OSAGE SMALL LETTER MA, OSAGE CAPITAL LETTER MA +test(0x104E9, 0x104C1); // OSAGE SMALL LETTER NA, OSAGE CAPITAL LETTER NA +test(0x104EA, 0x104C2); // OSAGE SMALL LETTER O, OSAGE CAPITAL LETTER O +test(0x104EB, 0x104C3); // OSAGE SMALL LETTER OIN, OSAGE CAPITAL LETTER OIN +test(0x104EC, 0x104C4); // OSAGE SMALL LETTER PA, OSAGE CAPITAL LETTER PA +test(0x104ED, 0x104C5); // OSAGE SMALL LETTER EHPA, OSAGE CAPITAL LETTER EHPA +test(0x104EE, 0x104C6); // OSAGE SMALL LETTER SA, OSAGE CAPITAL LETTER SA +test(0x104EF, 0x104C7); // OSAGE SMALL LETTER SHA, OSAGE CAPITAL LETTER SHA +test(0x104F0, 0x104C8); // OSAGE SMALL LETTER TA, OSAGE CAPITAL LETTER TA +test(0x104F1, 0x104C9); // OSAGE SMALL LETTER EHTA, OSAGE CAPITAL LETTER EHTA +test(0x104F2, 0x104CA); // OSAGE SMALL LETTER TSA, OSAGE CAPITAL LETTER TSA +test(0x104F3, 0x104CB); // OSAGE SMALL LETTER EHTSA, OSAGE CAPITAL LETTER EHTSA +test(0x104F4, 0x104CC); // OSAGE SMALL LETTER TSHA, OSAGE CAPITAL LETTER TSHA +test(0x104F5, 0x104CD); // OSAGE SMALL LETTER DHA, OSAGE CAPITAL LETTER DHA +test(0x104F6, 0x104CE); // OSAGE SMALL LETTER U, OSAGE CAPITAL LETTER U +test(0x104F7, 0x104CF); // OSAGE SMALL LETTER WA, OSAGE CAPITAL LETTER WA +test(0x104F8, 0x104D0); // OSAGE SMALL LETTER KHA, OSAGE CAPITAL LETTER KHA +test(0x104F9, 0x104D1); // OSAGE SMALL LETTER GHA, OSAGE CAPITAL LETTER GHA +test(0x104FA, 0x104D2); // OSAGE SMALL LETTER ZA, OSAGE CAPITAL LETTER ZA +test(0x104FB, 0x104D3); // OSAGE SMALL LETTER ZHA, OSAGE CAPITAL LETTER ZHA +test(0x10570, 0x10597); // VITHKUQI CAPITAL LETTER A, VITHKUQI SMALL LETTER A +test(0x10571, 0x10598); // VITHKUQI CAPITAL LETTER BBE, VITHKUQI SMALL LETTER BBE +test(0x10572, 0x10599); // VITHKUQI CAPITAL LETTER BE, VITHKUQI SMALL LETTER BE +test(0x10573, 0x1059A); // VITHKUQI CAPITAL LETTER CE, VITHKUQI SMALL LETTER CE +test(0x10574, 0x1059B); // VITHKUQI CAPITAL LETTER CHE, VITHKUQI SMALL LETTER CHE +test(0x10575, 0x1059C); // VITHKUQI CAPITAL LETTER DE, VITHKUQI SMALL LETTER DE +test(0x10576, 0x1059D); // VITHKUQI CAPITAL LETTER DHE, VITHKUQI SMALL LETTER DHE +test(0x10577, 0x1059E); // VITHKUQI CAPITAL LETTER EI, VITHKUQI SMALL LETTER EI +test(0x10578, 0x1059F); // VITHKUQI CAPITAL LETTER E, VITHKUQI SMALL LETTER E +test(0x10579, 0x105A0); // VITHKUQI CAPITAL LETTER FE, VITHKUQI SMALL LETTER FE +test(0x1057A, 0x105A1); // VITHKUQI CAPITAL LETTER GA, VITHKUQI SMALL LETTER GA +test(0x1057C, 0x105A3); // VITHKUQI CAPITAL LETTER HA, VITHKUQI SMALL LETTER HA +test(0x1057D, 0x105A4); // VITHKUQI CAPITAL LETTER HHA, VITHKUQI SMALL LETTER HHA +test(0x1057E, 0x105A5); // VITHKUQI CAPITAL LETTER I, VITHKUQI SMALL LETTER I +test(0x1057F, 0x105A6); // VITHKUQI CAPITAL LETTER IJE, VITHKUQI SMALL LETTER IJE +test(0x10580, 0x105A7); // VITHKUQI CAPITAL LETTER JE, VITHKUQI SMALL LETTER JE +test(0x10581, 0x105A8); // VITHKUQI CAPITAL LETTER KA, VITHKUQI SMALL LETTER KA +test(0x10582, 0x105A9); // VITHKUQI CAPITAL LETTER LA, VITHKUQI SMALL LETTER LA +test(0x10583, 0x105AA); // VITHKUQI CAPITAL LETTER LLA, VITHKUQI SMALL LETTER LLA +test(0x10584, 0x105AB); // VITHKUQI CAPITAL LETTER ME, VITHKUQI SMALL LETTER ME +test(0x10585, 0x105AC); // VITHKUQI CAPITAL LETTER NE, VITHKUQI SMALL LETTER NE +test(0x10586, 0x105AD); // VITHKUQI CAPITAL LETTER NJE, VITHKUQI SMALL LETTER NJE +test(0x10587, 0x105AE); // VITHKUQI CAPITAL LETTER O, VITHKUQI SMALL LETTER O +test(0x10588, 0x105AF); // VITHKUQI CAPITAL LETTER PE, VITHKUQI SMALL LETTER PE +test(0x10589, 0x105B0); // VITHKUQI CAPITAL LETTER QA, VITHKUQI SMALL LETTER QA +test(0x1058A, 0x105B1); // VITHKUQI CAPITAL LETTER RE, VITHKUQI SMALL LETTER RE +test(0x1058C, 0x105B3); // VITHKUQI CAPITAL LETTER SE, VITHKUQI SMALL LETTER SE +test(0x1058D, 0x105B4); // VITHKUQI CAPITAL LETTER SHE, VITHKUQI SMALL LETTER SHE +test(0x1058E, 0x105B5); // VITHKUQI CAPITAL LETTER TE, VITHKUQI SMALL LETTER TE +test(0x1058F, 0x105B6); // VITHKUQI CAPITAL LETTER THE, VITHKUQI SMALL LETTER THE +test(0x10590, 0x105B7); // VITHKUQI CAPITAL LETTER U, VITHKUQI SMALL LETTER U +test(0x10591, 0x105B8); // VITHKUQI CAPITAL LETTER VE, VITHKUQI SMALL LETTER VE +test(0x10592, 0x105B9); // VITHKUQI CAPITAL LETTER XE, VITHKUQI SMALL LETTER XE +test(0x10594, 0x105BB); // VITHKUQI CAPITAL LETTER Y, VITHKUQI SMALL LETTER Y +test(0x10595, 0x105BC); // VITHKUQI CAPITAL LETTER ZE, VITHKUQI SMALL LETTER ZE +test(0x10597, 0x10570); // VITHKUQI SMALL LETTER A, VITHKUQI CAPITAL LETTER A +test(0x10598, 0x10571); // VITHKUQI SMALL LETTER BBE, VITHKUQI CAPITAL LETTER BBE +test(0x10599, 0x10572); // VITHKUQI SMALL LETTER BE, VITHKUQI CAPITAL LETTER BE +test(0x1059A, 0x10573); // VITHKUQI SMALL LETTER CE, VITHKUQI CAPITAL LETTER CE +test(0x1059B, 0x10574); // VITHKUQI SMALL LETTER CHE, VITHKUQI CAPITAL LETTER CHE +test(0x1059C, 0x10575); // VITHKUQI SMALL LETTER DE, VITHKUQI CAPITAL LETTER DE +test(0x1059D, 0x10576); // VITHKUQI SMALL LETTER DHE, VITHKUQI CAPITAL LETTER DHE +test(0x1059E, 0x10577); // VITHKUQI SMALL LETTER EI, VITHKUQI CAPITAL LETTER EI +test(0x1059F, 0x10578); // VITHKUQI SMALL LETTER E, VITHKUQI CAPITAL LETTER E +test(0x105A0, 0x10579); // VITHKUQI SMALL LETTER FE, VITHKUQI CAPITAL LETTER FE +test(0x105A1, 0x1057A); // VITHKUQI SMALL LETTER GA, VITHKUQI CAPITAL LETTER GA +test(0x105A3, 0x1057C); // VITHKUQI SMALL LETTER HA, VITHKUQI CAPITAL LETTER HA +test(0x105A4, 0x1057D); // VITHKUQI SMALL LETTER HHA, VITHKUQI CAPITAL LETTER HHA +test(0x105A5, 0x1057E); // VITHKUQI SMALL LETTER I, VITHKUQI CAPITAL LETTER I +test(0x105A6, 0x1057F); // VITHKUQI SMALL LETTER IJE, VITHKUQI CAPITAL LETTER IJE +test(0x105A7, 0x10580); // VITHKUQI SMALL LETTER JE, VITHKUQI CAPITAL LETTER JE +test(0x105A8, 0x10581); // VITHKUQI SMALL LETTER KA, VITHKUQI CAPITAL LETTER KA +test(0x105A9, 0x10582); // VITHKUQI SMALL LETTER LA, VITHKUQI CAPITAL LETTER LA +test(0x105AA, 0x10583); // VITHKUQI SMALL LETTER LLA, VITHKUQI CAPITAL LETTER LLA +test(0x105AB, 0x10584); // VITHKUQI SMALL LETTER ME, VITHKUQI CAPITAL LETTER ME +test(0x105AC, 0x10585); // VITHKUQI SMALL LETTER NE, VITHKUQI CAPITAL LETTER NE +test(0x105AD, 0x10586); // VITHKUQI SMALL LETTER NJE, VITHKUQI CAPITAL LETTER NJE +test(0x105AE, 0x10587); // VITHKUQI SMALL LETTER O, VITHKUQI CAPITAL LETTER O +test(0x105AF, 0x10588); // VITHKUQI SMALL LETTER PE, VITHKUQI CAPITAL LETTER PE +test(0x105B0, 0x10589); // VITHKUQI SMALL LETTER QA, VITHKUQI CAPITAL LETTER QA +test(0x105B1, 0x1058A); // VITHKUQI SMALL LETTER RE, VITHKUQI CAPITAL LETTER RE +test(0x105B3, 0x1058C); // VITHKUQI SMALL LETTER SE, VITHKUQI CAPITAL LETTER SE +test(0x105B4, 0x1058D); // VITHKUQI SMALL LETTER SHE, VITHKUQI CAPITAL LETTER SHE +test(0x105B5, 0x1058E); // VITHKUQI SMALL LETTER TE, VITHKUQI CAPITAL LETTER TE +test(0x105B6, 0x1058F); // VITHKUQI SMALL LETTER THE, VITHKUQI CAPITAL LETTER THE +test(0x105B7, 0x10590); // VITHKUQI SMALL LETTER U, VITHKUQI CAPITAL LETTER U +test(0x105B8, 0x10591); // VITHKUQI SMALL LETTER VE, VITHKUQI CAPITAL LETTER VE +test(0x105B9, 0x10592); // VITHKUQI SMALL LETTER XE, VITHKUQI CAPITAL LETTER XE +test(0x105BB, 0x10594); // VITHKUQI SMALL LETTER Y, VITHKUQI CAPITAL LETTER Y +test(0x105BC, 0x10595); // VITHKUQI SMALL LETTER ZE, VITHKUQI CAPITAL LETTER ZE +test(0x10C80, 0x10CC0); // OLD HUNGARIAN CAPITAL LETTER A, OLD HUNGARIAN SMALL LETTER A +test(0x10C81, 0x10CC1); // OLD HUNGARIAN CAPITAL LETTER AA, OLD HUNGARIAN SMALL LETTER AA +test(0x10C82, 0x10CC2); // OLD HUNGARIAN CAPITAL LETTER EB, OLD HUNGARIAN SMALL LETTER EB +test(0x10C83, 0x10CC3); // OLD HUNGARIAN CAPITAL LETTER AMB, OLD HUNGARIAN SMALL LETTER AMB +test(0x10C84, 0x10CC4); // OLD HUNGARIAN CAPITAL LETTER EC, OLD HUNGARIAN SMALL LETTER EC +test(0x10C85, 0x10CC5); // OLD HUNGARIAN CAPITAL LETTER ENC, OLD HUNGARIAN SMALL LETTER ENC +test(0x10C86, 0x10CC6); // OLD HUNGARIAN CAPITAL LETTER ECS, OLD HUNGARIAN SMALL LETTER ECS +test(0x10C87, 0x10CC7); // OLD HUNGARIAN CAPITAL LETTER ED, OLD HUNGARIAN SMALL LETTER ED +test(0x10C88, 0x10CC8); // OLD HUNGARIAN CAPITAL LETTER AND, OLD HUNGARIAN SMALL LETTER AND +test(0x10C89, 0x10CC9); // OLD HUNGARIAN CAPITAL LETTER E, OLD HUNGARIAN SMALL LETTER E +test(0x10C8A, 0x10CCA); // OLD HUNGARIAN CAPITAL LETTER CLOSE E, OLD HUNGARIAN SMALL LETTER CLOSE E +test(0x10C8B, 0x10CCB); // OLD HUNGARIAN CAPITAL LETTER EE, OLD HUNGARIAN SMALL LETTER EE +test(0x10C8C, 0x10CCC); // OLD HUNGARIAN CAPITAL LETTER EF, OLD HUNGARIAN SMALL LETTER EF +test(0x10C8D, 0x10CCD); // OLD HUNGARIAN CAPITAL LETTER EG, OLD HUNGARIAN SMALL LETTER EG +test(0x10C8E, 0x10CCE); // OLD HUNGARIAN CAPITAL LETTER EGY, OLD HUNGARIAN SMALL LETTER EGY +test(0x10C8F, 0x10CCF); // OLD HUNGARIAN CAPITAL LETTER EH, OLD HUNGARIAN SMALL LETTER EH +test(0x10C90, 0x10CD0); // OLD HUNGARIAN CAPITAL LETTER I, OLD HUNGARIAN SMALL LETTER I +test(0x10C91, 0x10CD1); // OLD HUNGARIAN CAPITAL LETTER II, OLD HUNGARIAN SMALL LETTER II +test(0x10C92, 0x10CD2); // OLD HUNGARIAN CAPITAL LETTER EJ, OLD HUNGARIAN SMALL LETTER EJ +test(0x10C93, 0x10CD3); // OLD HUNGARIAN CAPITAL LETTER EK, OLD HUNGARIAN SMALL LETTER EK +test(0x10C94, 0x10CD4); // OLD HUNGARIAN CAPITAL LETTER AK, OLD HUNGARIAN SMALL LETTER AK +test(0x10C95, 0x10CD5); // OLD HUNGARIAN CAPITAL LETTER UNK, OLD HUNGARIAN SMALL LETTER UNK +test(0x10C96, 0x10CD6); // OLD HUNGARIAN CAPITAL LETTER EL, OLD HUNGARIAN SMALL LETTER EL +test(0x10C97, 0x10CD7); // OLD HUNGARIAN CAPITAL LETTER ELY, OLD HUNGARIAN SMALL LETTER ELY +test(0x10C98, 0x10CD8); // OLD HUNGARIAN CAPITAL LETTER EM, OLD HUNGARIAN SMALL LETTER EM +test(0x10C99, 0x10CD9); // OLD HUNGARIAN CAPITAL LETTER EN, OLD HUNGARIAN SMALL LETTER EN +test(0x10C9A, 0x10CDA); // OLD HUNGARIAN CAPITAL LETTER ENY, OLD HUNGARIAN SMALL LETTER ENY +test(0x10C9B, 0x10CDB); // OLD HUNGARIAN CAPITAL LETTER O, OLD HUNGARIAN SMALL LETTER O +test(0x10C9C, 0x10CDC); // OLD HUNGARIAN CAPITAL LETTER OO, OLD HUNGARIAN SMALL LETTER OO +test(0x10C9D, 0x10CDD); // OLD HUNGARIAN CAPITAL LETTER NIKOLSBURG OE, OLD HUNGARIAN SMALL LETTER NIKOLSBURG OE +test(0x10C9E, 0x10CDE); // OLD HUNGARIAN CAPITAL LETTER RUDIMENTA OE, OLD HUNGARIAN SMALL LETTER RUDIMENTA OE +test(0x10C9F, 0x10CDF); // OLD HUNGARIAN CAPITAL LETTER OEE, OLD HUNGARIAN SMALL LETTER OEE +test(0x10CA0, 0x10CE0); // OLD HUNGARIAN CAPITAL LETTER EP, OLD HUNGARIAN SMALL LETTER EP +test(0x10CA1, 0x10CE1); // OLD HUNGARIAN CAPITAL LETTER EMP, OLD HUNGARIAN SMALL LETTER EMP +test(0x10CA2, 0x10CE2); // OLD HUNGARIAN CAPITAL LETTER ER, OLD HUNGARIAN SMALL LETTER ER +test(0x10CA3, 0x10CE3); // OLD HUNGARIAN CAPITAL LETTER SHORT ER, OLD HUNGARIAN SMALL LETTER SHORT ER +test(0x10CA4, 0x10CE4); // OLD HUNGARIAN CAPITAL LETTER ES, OLD HUNGARIAN SMALL LETTER ES +test(0x10CA5, 0x10CE5); // OLD HUNGARIAN CAPITAL LETTER ESZ, OLD HUNGARIAN SMALL LETTER ESZ +test(0x10CA6, 0x10CE6); // OLD HUNGARIAN CAPITAL LETTER ET, OLD HUNGARIAN SMALL LETTER ET +test(0x10CA7, 0x10CE7); // OLD HUNGARIAN CAPITAL LETTER ENT, OLD HUNGARIAN SMALL LETTER ENT +test(0x10CA8, 0x10CE8); // OLD HUNGARIAN CAPITAL LETTER ETY, OLD HUNGARIAN SMALL LETTER ETY +test(0x10CA9, 0x10CE9); // OLD HUNGARIAN CAPITAL LETTER ECH, OLD HUNGARIAN SMALL LETTER ECH +test(0x10CAA, 0x10CEA); // OLD HUNGARIAN CAPITAL LETTER U, OLD HUNGARIAN SMALL LETTER U +test(0x10CAB, 0x10CEB); // OLD HUNGARIAN CAPITAL LETTER UU, OLD HUNGARIAN SMALL LETTER UU +test(0x10CAC, 0x10CEC); // OLD HUNGARIAN CAPITAL LETTER NIKOLSBURG UE, OLD HUNGARIAN SMALL LETTER NIKOLSBURG UE +test(0x10CAD, 0x10CED); // OLD HUNGARIAN CAPITAL LETTER RUDIMENTA UE, OLD HUNGARIAN SMALL LETTER RUDIMENTA UE +test(0x10CAE, 0x10CEE); // OLD HUNGARIAN CAPITAL LETTER EV, OLD HUNGARIAN SMALL LETTER EV +test(0x10CAF, 0x10CEF); // OLD HUNGARIAN CAPITAL LETTER EZ, OLD HUNGARIAN SMALL LETTER EZ +test(0x10CB0, 0x10CF0); // OLD HUNGARIAN CAPITAL LETTER EZS, OLD HUNGARIAN SMALL LETTER EZS +test(0x10CB1, 0x10CF1); // OLD HUNGARIAN CAPITAL LETTER ENT-SHAPED SIGN, OLD HUNGARIAN SMALL LETTER ENT-SHAPED SIGN +test(0x10CB2, 0x10CF2); // OLD HUNGARIAN CAPITAL LETTER US, OLD HUNGARIAN SMALL LETTER US +test(0x10CC0, 0x10C80); // OLD HUNGARIAN SMALL LETTER A, OLD HUNGARIAN CAPITAL LETTER A +test(0x10CC1, 0x10C81); // OLD HUNGARIAN SMALL LETTER AA, OLD HUNGARIAN CAPITAL LETTER AA +test(0x10CC2, 0x10C82); // OLD HUNGARIAN SMALL LETTER EB, OLD HUNGARIAN CAPITAL LETTER EB +test(0x10CC3, 0x10C83); // OLD HUNGARIAN SMALL LETTER AMB, OLD HUNGARIAN CAPITAL LETTER AMB +test(0x10CC4, 0x10C84); // OLD HUNGARIAN SMALL LETTER EC, OLD HUNGARIAN CAPITAL LETTER EC +test(0x10CC5, 0x10C85); // OLD HUNGARIAN SMALL LETTER ENC, OLD HUNGARIAN CAPITAL LETTER ENC +test(0x10CC6, 0x10C86); // OLD HUNGARIAN SMALL LETTER ECS, OLD HUNGARIAN CAPITAL LETTER ECS +test(0x10CC7, 0x10C87); // OLD HUNGARIAN SMALL LETTER ED, OLD HUNGARIAN CAPITAL LETTER ED +test(0x10CC8, 0x10C88); // OLD HUNGARIAN SMALL LETTER AND, OLD HUNGARIAN CAPITAL LETTER AND +test(0x10CC9, 0x10C89); // OLD HUNGARIAN SMALL LETTER E, OLD HUNGARIAN CAPITAL LETTER E +test(0x10CCA, 0x10C8A); // OLD HUNGARIAN SMALL LETTER CLOSE E, OLD HUNGARIAN CAPITAL LETTER CLOSE E +test(0x10CCB, 0x10C8B); // OLD HUNGARIAN SMALL LETTER EE, OLD HUNGARIAN CAPITAL LETTER EE +test(0x10CCC, 0x10C8C); // OLD HUNGARIAN SMALL LETTER EF, OLD HUNGARIAN CAPITAL LETTER EF +test(0x10CCD, 0x10C8D); // OLD HUNGARIAN SMALL LETTER EG, OLD HUNGARIAN CAPITAL LETTER EG +test(0x10CCE, 0x10C8E); // OLD HUNGARIAN SMALL LETTER EGY, OLD HUNGARIAN CAPITAL LETTER EGY +test(0x10CCF, 0x10C8F); // OLD HUNGARIAN SMALL LETTER EH, OLD HUNGARIAN CAPITAL LETTER EH +test(0x10CD0, 0x10C90); // OLD HUNGARIAN SMALL LETTER I, OLD HUNGARIAN CAPITAL LETTER I +test(0x10CD1, 0x10C91); // OLD HUNGARIAN SMALL LETTER II, OLD HUNGARIAN CAPITAL LETTER II +test(0x10CD2, 0x10C92); // OLD HUNGARIAN SMALL LETTER EJ, OLD HUNGARIAN CAPITAL LETTER EJ +test(0x10CD3, 0x10C93); // OLD HUNGARIAN SMALL LETTER EK, OLD HUNGARIAN CAPITAL LETTER EK +test(0x10CD4, 0x10C94); // OLD HUNGARIAN SMALL LETTER AK, OLD HUNGARIAN CAPITAL LETTER AK +test(0x10CD5, 0x10C95); // OLD HUNGARIAN SMALL LETTER UNK, OLD HUNGARIAN CAPITAL LETTER UNK +test(0x10CD6, 0x10C96); // OLD HUNGARIAN SMALL LETTER EL, OLD HUNGARIAN CAPITAL LETTER EL +test(0x10CD7, 0x10C97); // OLD HUNGARIAN SMALL LETTER ELY, OLD HUNGARIAN CAPITAL LETTER ELY +test(0x10CD8, 0x10C98); // OLD HUNGARIAN SMALL LETTER EM, OLD HUNGARIAN CAPITAL LETTER EM +test(0x10CD9, 0x10C99); // OLD HUNGARIAN SMALL LETTER EN, OLD HUNGARIAN CAPITAL LETTER EN +test(0x10CDA, 0x10C9A); // OLD HUNGARIAN SMALL LETTER ENY, OLD HUNGARIAN CAPITAL LETTER ENY +test(0x10CDB, 0x10C9B); // OLD HUNGARIAN SMALL LETTER O, OLD HUNGARIAN CAPITAL LETTER O +test(0x10CDC, 0x10C9C); // OLD HUNGARIAN SMALL LETTER OO, OLD HUNGARIAN CAPITAL LETTER OO +test(0x10CDD, 0x10C9D); // OLD HUNGARIAN SMALL LETTER NIKOLSBURG OE, OLD HUNGARIAN CAPITAL LETTER NIKOLSBURG OE +test(0x10CDE, 0x10C9E); // OLD HUNGARIAN SMALL LETTER RUDIMENTA OE, OLD HUNGARIAN CAPITAL LETTER RUDIMENTA OE +test(0x10CDF, 0x10C9F); // OLD HUNGARIAN SMALL LETTER OEE, OLD HUNGARIAN CAPITAL LETTER OEE +test(0x10CE0, 0x10CA0); // OLD HUNGARIAN SMALL LETTER EP, OLD HUNGARIAN CAPITAL LETTER EP +test(0x10CE1, 0x10CA1); // OLD HUNGARIAN SMALL LETTER EMP, OLD HUNGARIAN CAPITAL LETTER EMP +test(0x10CE2, 0x10CA2); // OLD HUNGARIAN SMALL LETTER ER, OLD HUNGARIAN CAPITAL LETTER ER +test(0x10CE3, 0x10CA3); // OLD HUNGARIAN SMALL LETTER SHORT ER, OLD HUNGARIAN CAPITAL LETTER SHORT ER +test(0x10CE4, 0x10CA4); // OLD HUNGARIAN SMALL LETTER ES, OLD HUNGARIAN CAPITAL LETTER ES +test(0x10CE5, 0x10CA5); // OLD HUNGARIAN SMALL LETTER ESZ, OLD HUNGARIAN CAPITAL LETTER ESZ +test(0x10CE6, 0x10CA6); // OLD HUNGARIAN SMALL LETTER ET, OLD HUNGARIAN CAPITAL LETTER ET +test(0x10CE7, 0x10CA7); // OLD HUNGARIAN SMALL LETTER ENT, OLD HUNGARIAN CAPITAL LETTER ENT +test(0x10CE8, 0x10CA8); // OLD HUNGARIAN SMALL LETTER ETY, OLD HUNGARIAN CAPITAL LETTER ETY +test(0x10CE9, 0x10CA9); // OLD HUNGARIAN SMALL LETTER ECH, OLD HUNGARIAN CAPITAL LETTER ECH +test(0x10CEA, 0x10CAA); // OLD HUNGARIAN SMALL LETTER U, OLD HUNGARIAN CAPITAL LETTER U +test(0x10CEB, 0x10CAB); // OLD HUNGARIAN SMALL LETTER UU, OLD HUNGARIAN CAPITAL LETTER UU +test(0x10CEC, 0x10CAC); // OLD HUNGARIAN SMALL LETTER NIKOLSBURG UE, OLD HUNGARIAN CAPITAL LETTER NIKOLSBURG UE +test(0x10CED, 0x10CAD); // OLD HUNGARIAN SMALL LETTER RUDIMENTA UE, OLD HUNGARIAN CAPITAL LETTER RUDIMENTA UE +test(0x10CEE, 0x10CAE); // OLD HUNGARIAN SMALL LETTER EV, OLD HUNGARIAN CAPITAL LETTER EV +test(0x10CEF, 0x10CAF); // OLD HUNGARIAN SMALL LETTER EZ, OLD HUNGARIAN CAPITAL LETTER EZ +test(0x10CF0, 0x10CB0); // OLD HUNGARIAN SMALL LETTER EZS, OLD HUNGARIAN CAPITAL LETTER EZS +test(0x10CF1, 0x10CB1); // OLD HUNGARIAN SMALL LETTER ENT-SHAPED SIGN, OLD HUNGARIAN CAPITAL LETTER ENT-SHAPED SIGN +test(0x10CF2, 0x10CB2); // OLD HUNGARIAN SMALL LETTER US, OLD HUNGARIAN CAPITAL LETTER US +test(0x118A0, 0x118C0); // WARANG CITI CAPITAL LETTER NGAA, WARANG CITI SMALL LETTER NGAA +test(0x118A1, 0x118C1); // WARANG CITI CAPITAL LETTER A, WARANG CITI SMALL LETTER A +test(0x118A2, 0x118C2); // WARANG CITI CAPITAL LETTER WI, WARANG CITI SMALL LETTER WI +test(0x118A3, 0x118C3); // WARANG CITI CAPITAL LETTER YU, WARANG CITI SMALL LETTER YU +test(0x118A4, 0x118C4); // WARANG CITI CAPITAL LETTER YA, WARANG CITI SMALL LETTER YA +test(0x118A5, 0x118C5); // WARANG CITI CAPITAL LETTER YO, WARANG CITI SMALL LETTER YO +test(0x118A6, 0x118C6); // WARANG CITI CAPITAL LETTER II, WARANG CITI SMALL LETTER II +test(0x118A7, 0x118C7); // WARANG CITI CAPITAL LETTER UU, WARANG CITI SMALL LETTER UU +test(0x118A8, 0x118C8); // WARANG CITI CAPITAL LETTER E, WARANG CITI SMALL LETTER E +test(0x118A9, 0x118C9); // WARANG CITI CAPITAL LETTER O, WARANG CITI SMALL LETTER O +test(0x118AA, 0x118CA); // WARANG CITI CAPITAL LETTER ANG, WARANG CITI SMALL LETTER ANG +test(0x118AB, 0x118CB); // WARANG CITI CAPITAL LETTER GA, WARANG CITI SMALL LETTER GA +test(0x118AC, 0x118CC); // WARANG CITI CAPITAL LETTER KO, WARANG CITI SMALL LETTER KO +test(0x118AD, 0x118CD); // WARANG CITI CAPITAL LETTER ENY, WARANG CITI SMALL LETTER ENY +test(0x118AE, 0x118CE); // WARANG CITI CAPITAL LETTER YUJ, WARANG CITI SMALL LETTER YUJ +test(0x118AF, 0x118CF); // WARANG CITI CAPITAL LETTER UC, WARANG CITI SMALL LETTER UC +test(0x118B0, 0x118D0); // WARANG CITI CAPITAL LETTER ENN, WARANG CITI SMALL LETTER ENN +test(0x118B1, 0x118D1); // WARANG CITI CAPITAL LETTER ODD, WARANG CITI SMALL LETTER ODD +test(0x118B2, 0x118D2); // WARANG CITI CAPITAL LETTER TTE, WARANG CITI SMALL LETTER TTE +test(0x118B3, 0x118D3); // WARANG CITI CAPITAL LETTER NUNG, WARANG CITI SMALL LETTER NUNG +test(0x118B4, 0x118D4); // WARANG CITI CAPITAL LETTER DA, WARANG CITI SMALL LETTER DA +test(0x118B5, 0x118D5); // WARANG CITI CAPITAL LETTER AT, WARANG CITI SMALL LETTER AT +test(0x118B6, 0x118D6); // WARANG CITI CAPITAL LETTER AM, WARANG CITI SMALL LETTER AM +test(0x118B7, 0x118D7); // WARANG CITI CAPITAL LETTER BU, WARANG CITI SMALL LETTER BU +test(0x118B8, 0x118D8); // WARANG CITI CAPITAL LETTER PU, WARANG CITI SMALL LETTER PU +test(0x118B9, 0x118D9); // WARANG CITI CAPITAL LETTER HIYO, WARANG CITI SMALL LETTER HIYO +test(0x118BA, 0x118DA); // WARANG CITI CAPITAL LETTER HOLO, WARANG CITI SMALL LETTER HOLO +test(0x118BB, 0x118DB); // WARANG CITI CAPITAL LETTER HORR, WARANG CITI SMALL LETTER HORR +test(0x118BC, 0x118DC); // WARANG CITI CAPITAL LETTER HAR, WARANG CITI SMALL LETTER HAR +test(0x118BD, 0x118DD); // WARANG CITI CAPITAL LETTER SSUU, WARANG CITI SMALL LETTER SSUU +test(0x118BE, 0x118DE); // WARANG CITI CAPITAL LETTER SII, WARANG CITI SMALL LETTER SII +test(0x118BF, 0x118DF); // WARANG CITI CAPITAL LETTER VIYO, WARANG CITI SMALL LETTER VIYO +test(0x118C0, 0x118A0); // WARANG CITI SMALL LETTER NGAA, WARANG CITI CAPITAL LETTER NGAA +test(0x118C1, 0x118A1); // WARANG CITI SMALL LETTER A, WARANG CITI CAPITAL LETTER A +test(0x118C2, 0x118A2); // WARANG CITI SMALL LETTER WI, WARANG CITI CAPITAL LETTER WI +test(0x118C3, 0x118A3); // WARANG CITI SMALL LETTER YU, WARANG CITI CAPITAL LETTER YU +test(0x118C4, 0x118A4); // WARANG CITI SMALL LETTER YA, WARANG CITI CAPITAL LETTER YA +test(0x118C5, 0x118A5); // WARANG CITI SMALL LETTER YO, WARANG CITI CAPITAL LETTER YO +test(0x118C6, 0x118A6); // WARANG CITI SMALL LETTER II, WARANG CITI CAPITAL LETTER II +test(0x118C7, 0x118A7); // WARANG CITI SMALL LETTER UU, WARANG CITI CAPITAL LETTER UU +test(0x118C8, 0x118A8); // WARANG CITI SMALL LETTER E, WARANG CITI CAPITAL LETTER E +test(0x118C9, 0x118A9); // WARANG CITI SMALL LETTER O, WARANG CITI CAPITAL LETTER O +test(0x118CA, 0x118AA); // WARANG CITI SMALL LETTER ANG, WARANG CITI CAPITAL LETTER ANG +test(0x118CB, 0x118AB); // WARANG CITI SMALL LETTER GA, WARANG CITI CAPITAL LETTER GA +test(0x118CC, 0x118AC); // WARANG CITI SMALL LETTER KO, WARANG CITI CAPITAL LETTER KO +test(0x118CD, 0x118AD); // WARANG CITI SMALL LETTER ENY, WARANG CITI CAPITAL LETTER ENY +test(0x118CE, 0x118AE); // WARANG CITI SMALL LETTER YUJ, WARANG CITI CAPITAL LETTER YUJ +test(0x118CF, 0x118AF); // WARANG CITI SMALL LETTER UC, WARANG CITI CAPITAL LETTER UC +test(0x118D0, 0x118B0); // WARANG CITI SMALL LETTER ENN, WARANG CITI CAPITAL LETTER ENN +test(0x118D1, 0x118B1); // WARANG CITI SMALL LETTER ODD, WARANG CITI CAPITAL LETTER ODD +test(0x118D2, 0x118B2); // WARANG CITI SMALL LETTER TTE, WARANG CITI CAPITAL LETTER TTE +test(0x118D3, 0x118B3); // WARANG CITI SMALL LETTER NUNG, WARANG CITI CAPITAL LETTER NUNG +test(0x118D4, 0x118B4); // WARANG CITI SMALL LETTER DA, WARANG CITI CAPITAL LETTER DA +test(0x118D5, 0x118B5); // WARANG CITI SMALL LETTER AT, WARANG CITI CAPITAL LETTER AT +test(0x118D6, 0x118B6); // WARANG CITI SMALL LETTER AM, WARANG CITI CAPITAL LETTER AM +test(0x118D7, 0x118B7); // WARANG CITI SMALL LETTER BU, WARANG CITI CAPITAL LETTER BU +test(0x118D8, 0x118B8); // WARANG CITI SMALL LETTER PU, WARANG CITI CAPITAL LETTER PU +test(0x118D9, 0x118B9); // WARANG CITI SMALL LETTER HIYO, WARANG CITI CAPITAL LETTER HIYO +test(0x118DA, 0x118BA); // WARANG CITI SMALL LETTER HOLO, WARANG CITI CAPITAL LETTER HOLO +test(0x118DB, 0x118BB); // WARANG CITI SMALL LETTER HORR, WARANG CITI CAPITAL LETTER HORR +test(0x118DC, 0x118BC); // WARANG CITI SMALL LETTER HAR, WARANG CITI CAPITAL LETTER HAR +test(0x118DD, 0x118BD); // WARANG CITI SMALL LETTER SSUU, WARANG CITI CAPITAL LETTER SSUU +test(0x118DE, 0x118BE); // WARANG CITI SMALL LETTER SII, WARANG CITI CAPITAL LETTER SII +test(0x118DF, 0x118BF); // WARANG CITI SMALL LETTER VIYO, WARANG CITI CAPITAL LETTER VIYO +test(0x16E40, 0x16E60); // MEDEFAIDRIN CAPITAL LETTER M, MEDEFAIDRIN SMALL LETTER M +test(0x16E41, 0x16E61); // MEDEFAIDRIN CAPITAL LETTER S, MEDEFAIDRIN SMALL LETTER S +test(0x16E42, 0x16E62); // MEDEFAIDRIN CAPITAL LETTER V, MEDEFAIDRIN SMALL LETTER V +test(0x16E43, 0x16E63); // MEDEFAIDRIN CAPITAL LETTER W, MEDEFAIDRIN SMALL LETTER W +test(0x16E44, 0x16E64); // MEDEFAIDRIN CAPITAL LETTER ATIU, MEDEFAIDRIN SMALL LETTER ATIU +test(0x16E45, 0x16E65); // MEDEFAIDRIN CAPITAL LETTER Z, MEDEFAIDRIN SMALL LETTER Z +test(0x16E46, 0x16E66); // MEDEFAIDRIN CAPITAL LETTER KP, MEDEFAIDRIN SMALL LETTER KP +test(0x16E47, 0x16E67); // MEDEFAIDRIN CAPITAL LETTER P, MEDEFAIDRIN SMALL LETTER P +test(0x16E48, 0x16E68); // MEDEFAIDRIN CAPITAL LETTER T, MEDEFAIDRIN SMALL LETTER T +test(0x16E49, 0x16E69); // MEDEFAIDRIN CAPITAL LETTER G, MEDEFAIDRIN SMALL LETTER G +test(0x16E4A, 0x16E6A); // MEDEFAIDRIN CAPITAL LETTER F, MEDEFAIDRIN SMALL LETTER F +test(0x16E4B, 0x16E6B); // MEDEFAIDRIN CAPITAL LETTER I, MEDEFAIDRIN SMALL LETTER I +test(0x16E4C, 0x16E6C); // MEDEFAIDRIN CAPITAL LETTER K, MEDEFAIDRIN SMALL LETTER K +test(0x16E4D, 0x16E6D); // MEDEFAIDRIN CAPITAL LETTER A, MEDEFAIDRIN SMALL LETTER A +test(0x16E4E, 0x16E6E); // MEDEFAIDRIN CAPITAL LETTER J, MEDEFAIDRIN SMALL LETTER J +test(0x16E4F, 0x16E6F); // MEDEFAIDRIN CAPITAL LETTER E, MEDEFAIDRIN SMALL LETTER E +test(0x16E50, 0x16E70); // MEDEFAIDRIN CAPITAL LETTER B, MEDEFAIDRIN SMALL LETTER B +test(0x16E51, 0x16E71); // MEDEFAIDRIN CAPITAL LETTER C, MEDEFAIDRIN SMALL LETTER C +test(0x16E52, 0x16E72); // MEDEFAIDRIN CAPITAL LETTER U, MEDEFAIDRIN SMALL LETTER U +test(0x16E53, 0x16E73); // MEDEFAIDRIN CAPITAL LETTER YU, MEDEFAIDRIN SMALL LETTER YU +test(0x16E54, 0x16E74); // MEDEFAIDRIN CAPITAL LETTER L, MEDEFAIDRIN SMALL LETTER L +test(0x16E55, 0x16E75); // MEDEFAIDRIN CAPITAL LETTER Q, MEDEFAIDRIN SMALL LETTER Q +test(0x16E56, 0x16E76); // MEDEFAIDRIN CAPITAL LETTER HP, MEDEFAIDRIN SMALL LETTER HP +test(0x16E57, 0x16E77); // MEDEFAIDRIN CAPITAL LETTER NY, MEDEFAIDRIN SMALL LETTER NY +test(0x16E58, 0x16E78); // MEDEFAIDRIN CAPITAL LETTER X, MEDEFAIDRIN SMALL LETTER X +test(0x16E59, 0x16E79); // MEDEFAIDRIN CAPITAL LETTER D, MEDEFAIDRIN SMALL LETTER D +test(0x16E5A, 0x16E7A); // MEDEFAIDRIN CAPITAL LETTER OE, MEDEFAIDRIN SMALL LETTER OE +test(0x16E5B, 0x16E7B); // MEDEFAIDRIN CAPITAL LETTER N, MEDEFAIDRIN SMALL LETTER N +test(0x16E5C, 0x16E7C); // MEDEFAIDRIN CAPITAL LETTER R, MEDEFAIDRIN SMALL LETTER R +test(0x16E5D, 0x16E7D); // MEDEFAIDRIN CAPITAL LETTER O, MEDEFAIDRIN SMALL LETTER O +test(0x16E5E, 0x16E7E); // MEDEFAIDRIN CAPITAL LETTER AI, MEDEFAIDRIN SMALL LETTER AI +test(0x16E5F, 0x16E7F); // MEDEFAIDRIN CAPITAL LETTER Y, MEDEFAIDRIN SMALL LETTER Y +test(0x16E60, 0x16E40); // MEDEFAIDRIN SMALL LETTER M, MEDEFAIDRIN CAPITAL LETTER M +test(0x16E61, 0x16E41); // MEDEFAIDRIN SMALL LETTER S, MEDEFAIDRIN CAPITAL LETTER S +test(0x16E62, 0x16E42); // MEDEFAIDRIN SMALL LETTER V, MEDEFAIDRIN CAPITAL LETTER V +test(0x16E63, 0x16E43); // MEDEFAIDRIN SMALL LETTER W, MEDEFAIDRIN CAPITAL LETTER W +test(0x16E64, 0x16E44); // MEDEFAIDRIN SMALL LETTER ATIU, MEDEFAIDRIN CAPITAL LETTER ATIU +test(0x16E65, 0x16E45); // MEDEFAIDRIN SMALL LETTER Z, MEDEFAIDRIN CAPITAL LETTER Z +test(0x16E66, 0x16E46); // MEDEFAIDRIN SMALL LETTER KP, MEDEFAIDRIN CAPITAL LETTER KP +test(0x16E67, 0x16E47); // MEDEFAIDRIN SMALL LETTER P, MEDEFAIDRIN CAPITAL LETTER P +test(0x16E68, 0x16E48); // MEDEFAIDRIN SMALL LETTER T, MEDEFAIDRIN CAPITAL LETTER T +test(0x16E69, 0x16E49); // MEDEFAIDRIN SMALL LETTER G, MEDEFAIDRIN CAPITAL LETTER G +test(0x16E6A, 0x16E4A); // MEDEFAIDRIN SMALL LETTER F, MEDEFAIDRIN CAPITAL LETTER F +test(0x16E6B, 0x16E4B); // MEDEFAIDRIN SMALL LETTER I, MEDEFAIDRIN CAPITAL LETTER I +test(0x16E6C, 0x16E4C); // MEDEFAIDRIN SMALL LETTER K, MEDEFAIDRIN CAPITAL LETTER K +test(0x16E6D, 0x16E4D); // MEDEFAIDRIN SMALL LETTER A, MEDEFAIDRIN CAPITAL LETTER A +test(0x16E6E, 0x16E4E); // MEDEFAIDRIN SMALL LETTER J, MEDEFAIDRIN CAPITAL LETTER J +test(0x16E6F, 0x16E4F); // MEDEFAIDRIN SMALL LETTER E, MEDEFAIDRIN CAPITAL LETTER E +test(0x16E70, 0x16E50); // MEDEFAIDRIN SMALL LETTER B, MEDEFAIDRIN CAPITAL LETTER B +test(0x16E71, 0x16E51); // MEDEFAIDRIN SMALL LETTER C, MEDEFAIDRIN CAPITAL LETTER C +test(0x16E72, 0x16E52); // MEDEFAIDRIN SMALL LETTER U, MEDEFAIDRIN CAPITAL LETTER U +test(0x16E73, 0x16E53); // MEDEFAIDRIN SMALL LETTER YU, MEDEFAIDRIN CAPITAL LETTER YU +test(0x16E74, 0x16E54); // MEDEFAIDRIN SMALL LETTER L, MEDEFAIDRIN CAPITAL LETTER L +test(0x16E75, 0x16E55); // MEDEFAIDRIN SMALL LETTER Q, MEDEFAIDRIN CAPITAL LETTER Q +test(0x16E76, 0x16E56); // MEDEFAIDRIN SMALL LETTER HP, MEDEFAIDRIN CAPITAL LETTER HP +test(0x16E77, 0x16E57); // MEDEFAIDRIN SMALL LETTER NY, MEDEFAIDRIN CAPITAL LETTER NY +test(0x16E78, 0x16E58); // MEDEFAIDRIN SMALL LETTER X, MEDEFAIDRIN CAPITAL LETTER X +test(0x16E79, 0x16E59); // MEDEFAIDRIN SMALL LETTER D, MEDEFAIDRIN CAPITAL LETTER D +test(0x16E7A, 0x16E5A); // MEDEFAIDRIN SMALL LETTER OE, MEDEFAIDRIN CAPITAL LETTER OE +test(0x16E7B, 0x16E5B); // MEDEFAIDRIN SMALL LETTER N, MEDEFAIDRIN CAPITAL LETTER N +test(0x16E7C, 0x16E5C); // MEDEFAIDRIN SMALL LETTER R, MEDEFAIDRIN CAPITAL LETTER R +test(0x16E7D, 0x16E5D); // MEDEFAIDRIN SMALL LETTER O, MEDEFAIDRIN CAPITAL LETTER O +test(0x16E7E, 0x16E5E); // MEDEFAIDRIN SMALL LETTER AI, MEDEFAIDRIN CAPITAL LETTER AI +test(0x16E7F, 0x16E5F); // MEDEFAIDRIN SMALL LETTER Y, MEDEFAIDRIN CAPITAL LETTER Y +test(0x1E900, 0x1E922); // ADLAM CAPITAL LETTER ALIF, ADLAM SMALL LETTER ALIF +test(0x1E901, 0x1E923); // ADLAM CAPITAL LETTER DAALI, ADLAM SMALL LETTER DAALI +test(0x1E902, 0x1E924); // ADLAM CAPITAL LETTER LAAM, ADLAM SMALL LETTER LAAM +test(0x1E903, 0x1E925); // ADLAM CAPITAL LETTER MIIM, ADLAM SMALL LETTER MIIM +test(0x1E904, 0x1E926); // ADLAM CAPITAL LETTER BA, ADLAM SMALL LETTER BA +test(0x1E905, 0x1E927); // ADLAM CAPITAL LETTER SINNYIIYHE, ADLAM SMALL LETTER SINNYIIYHE +test(0x1E906, 0x1E928); // ADLAM CAPITAL LETTER PE, ADLAM SMALL LETTER PE +test(0x1E907, 0x1E929); // ADLAM CAPITAL LETTER BHE, ADLAM SMALL LETTER BHE +test(0x1E908, 0x1E92A); // ADLAM CAPITAL LETTER RA, ADLAM SMALL LETTER RA +test(0x1E909, 0x1E92B); // ADLAM CAPITAL LETTER E, ADLAM SMALL LETTER E +test(0x1E90A, 0x1E92C); // ADLAM CAPITAL LETTER FA, ADLAM SMALL LETTER FA +test(0x1E90B, 0x1E92D); // ADLAM CAPITAL LETTER I, ADLAM SMALL LETTER I +test(0x1E90C, 0x1E92E); // ADLAM CAPITAL LETTER O, ADLAM SMALL LETTER O +test(0x1E90D, 0x1E92F); // ADLAM CAPITAL LETTER DHA, ADLAM SMALL LETTER DHA +test(0x1E90E, 0x1E930); // ADLAM CAPITAL LETTER YHE, ADLAM SMALL LETTER YHE +test(0x1E90F, 0x1E931); // ADLAM CAPITAL LETTER WAW, ADLAM SMALL LETTER WAW +test(0x1E910, 0x1E932); // ADLAM CAPITAL LETTER NUN, ADLAM SMALL LETTER NUN +test(0x1E911, 0x1E933); // ADLAM CAPITAL LETTER KAF, ADLAM SMALL LETTER KAF +test(0x1E912, 0x1E934); // ADLAM CAPITAL LETTER YA, ADLAM SMALL LETTER YA +test(0x1E913, 0x1E935); // ADLAM CAPITAL LETTER U, ADLAM SMALL LETTER U +test(0x1E914, 0x1E936); // ADLAM CAPITAL LETTER JIIM, ADLAM SMALL LETTER JIIM +test(0x1E915, 0x1E937); // ADLAM CAPITAL LETTER CHI, ADLAM SMALL LETTER CHI +test(0x1E916, 0x1E938); // ADLAM CAPITAL LETTER HA, ADLAM SMALL LETTER HA +test(0x1E917, 0x1E939); // ADLAM CAPITAL LETTER QAAF, ADLAM SMALL LETTER QAAF +test(0x1E918, 0x1E93A); // ADLAM CAPITAL LETTER GA, ADLAM SMALL LETTER GA +test(0x1E919, 0x1E93B); // ADLAM CAPITAL LETTER NYA, ADLAM SMALL LETTER NYA +test(0x1E91A, 0x1E93C); // ADLAM CAPITAL LETTER TU, ADLAM SMALL LETTER TU +test(0x1E91B, 0x1E93D); // ADLAM CAPITAL LETTER NHA, ADLAM SMALL LETTER NHA +test(0x1E91C, 0x1E93E); // ADLAM CAPITAL LETTER VA, ADLAM SMALL LETTER VA +test(0x1E91D, 0x1E93F); // ADLAM CAPITAL LETTER KHA, ADLAM SMALL LETTER KHA +test(0x1E91E, 0x1E940); // ADLAM CAPITAL LETTER GBE, ADLAM SMALL LETTER GBE +test(0x1E91F, 0x1E941); // ADLAM CAPITAL LETTER ZAL, ADLAM SMALL LETTER ZAL +test(0x1E920, 0x1E942); // ADLAM CAPITAL LETTER KPO, ADLAM SMALL LETTER KPO +test(0x1E921, 0x1E943); // ADLAM CAPITAL LETTER SHA, ADLAM SMALL LETTER SHA +test(0x1E922, 0x1E900); // ADLAM SMALL LETTER ALIF, ADLAM CAPITAL LETTER ALIF +test(0x1E923, 0x1E901); // ADLAM SMALL LETTER DAALI, ADLAM CAPITAL LETTER DAALI +test(0x1E924, 0x1E902); // ADLAM SMALL LETTER LAAM, ADLAM CAPITAL LETTER LAAM +test(0x1E925, 0x1E903); // ADLAM SMALL LETTER MIIM, ADLAM CAPITAL LETTER MIIM +test(0x1E926, 0x1E904); // ADLAM SMALL LETTER BA, ADLAM CAPITAL LETTER BA +test(0x1E927, 0x1E905); // ADLAM SMALL LETTER SINNYIIYHE, ADLAM CAPITAL LETTER SINNYIIYHE +test(0x1E928, 0x1E906); // ADLAM SMALL LETTER PE, ADLAM CAPITAL LETTER PE +test(0x1E929, 0x1E907); // ADLAM SMALL LETTER BHE, ADLAM CAPITAL LETTER BHE +test(0x1E92A, 0x1E908); // ADLAM SMALL LETTER RA, ADLAM CAPITAL LETTER RA +test(0x1E92B, 0x1E909); // ADLAM SMALL LETTER E, ADLAM CAPITAL LETTER E +test(0x1E92C, 0x1E90A); // ADLAM SMALL LETTER FA, ADLAM CAPITAL LETTER FA +test(0x1E92D, 0x1E90B); // ADLAM SMALL LETTER I, ADLAM CAPITAL LETTER I +test(0x1E92E, 0x1E90C); // ADLAM SMALL LETTER O, ADLAM CAPITAL LETTER O +test(0x1E92F, 0x1E90D); // ADLAM SMALL LETTER DHA, ADLAM CAPITAL LETTER DHA +test(0x1E930, 0x1E90E); // ADLAM SMALL LETTER YHE, ADLAM CAPITAL LETTER YHE +test(0x1E931, 0x1E90F); // ADLAM SMALL LETTER WAW, ADLAM CAPITAL LETTER WAW +test(0x1E932, 0x1E910); // ADLAM SMALL LETTER NUN, ADLAM CAPITAL LETTER NUN +test(0x1E933, 0x1E911); // ADLAM SMALL LETTER KAF, ADLAM CAPITAL LETTER KAF +test(0x1E934, 0x1E912); // ADLAM SMALL LETTER YA, ADLAM CAPITAL LETTER YA +test(0x1E935, 0x1E913); // ADLAM SMALL LETTER U, ADLAM CAPITAL LETTER U +test(0x1E936, 0x1E914); // ADLAM SMALL LETTER JIIM, ADLAM CAPITAL LETTER JIIM +test(0x1E937, 0x1E915); // ADLAM SMALL LETTER CHI, ADLAM CAPITAL LETTER CHI +test(0x1E938, 0x1E916); // ADLAM SMALL LETTER HA, ADLAM CAPITAL LETTER HA +test(0x1E939, 0x1E917); // ADLAM SMALL LETTER QAAF, ADLAM CAPITAL LETTER QAAF +test(0x1E93A, 0x1E918); // ADLAM SMALL LETTER GA, ADLAM CAPITAL LETTER GA +test(0x1E93B, 0x1E919); // ADLAM SMALL LETTER NYA, ADLAM CAPITAL LETTER NYA +test(0x1E93C, 0x1E91A); // ADLAM SMALL LETTER TU, ADLAM CAPITAL LETTER TU +test(0x1E93D, 0x1E91B); // ADLAM SMALL LETTER NHA, ADLAM CAPITAL LETTER NHA +test(0x1E93E, 0x1E91C); // ADLAM SMALL LETTER VA, ADLAM CAPITAL LETTER VA +test(0x1E93F, 0x1E91D); // ADLAM SMALL LETTER KHA, ADLAM CAPITAL LETTER KHA +test(0x1E940, 0x1E91E); // ADLAM SMALL LETTER GBE, ADLAM CAPITAL LETTER GBE +test(0x1E941, 0x1E91F); // ADLAM SMALL LETTER ZAL, ADLAM CAPITAL LETTER ZAL +test(0x1E942, 0x1E920); // ADLAM SMALL LETTER KPO, ADLAM CAPITAL LETTER KPO +test(0x1E943, 0x1E921); // ADLAM SMALL LETTER SHA, ADLAM CAPITAL LETTER SHA + diff --git a/test/staging/sm/RegExp/unicode-lead-trail.js b/test/staging/sm/RegExp/unicode-lead-trail.js new file mode 100644 index 0000000000..72ad453d41 --- /dev/null +++ b/test/staging/sm/RegExp/unicode-lead-trail.js @@ -0,0 +1,227 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [compareArray.js, sm/non262-RegExp-shell.js, sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +var BUGNUMBER = 1135377; +var summary = "Implement RegExp unicode flag -- lead and trail patterns in RegExpUnicodeEscapeSequence."; + +print(BUGNUMBER + ": " + summary); + +// ==== standalone ==== + +assert.compareArray(/\uD83D\uDC38/u.exec("\u{1F438}"), + ["\u{1F438}"]); + +// no unicode flag +assert.compareArray(/\uD83D\uDC38/.exec("\u{1F438}"), + ["\u{1F438}"]); + +// RegExp constructor +assert.compareArray(new RegExp("\\uD83D\\uDC38", "u").exec("\u{1F438}"), + ["\u{1F438}"]); + +// RegExp constructor, no unicode flag +assert.compareArray(new RegExp("\\uD83D\\uDC38", "").exec("\u{1F438}"), + ["\u{1F438}"]); + +// ==== ? ==== + +assert.compareArray(/\uD83D\uDC38?/u.exec("\u{1F438}"), + ["\u{1F438}"]); +assert.compareArray(/\uD83D\uDC38?/u.exec(""), + [""]); + +// lead-only target +assert.compareArray(/\uD83D\uDC38?/u.exec("\uD83D"), + [""]); + +// no unicode flag +assert.compareArray(/\uD83D\uDC38?/.exec("\u{1F438}"), + ["\u{1F438}"]); +assert.sameValue(/\uD83D\uDC38?/.exec(""), + null); + +assert.compareArray(/\uD83D\uDC38?/.exec("\uD83D"), + ["\uD83D"]); + +// RegExp constructor +assert.compareArray(new RegExp("\\uD83D\\uDC38?", "u").exec("\u{1F438}"), + ["\u{1F438}"]); +assert.compareArray(new RegExp("\\uD83D\\uDC38?", "u").exec(""), + [""]); + +assert.compareArray(new RegExp("\\uD83D\\uDC38?", "u").exec("\uD83D"), + [""]); + +// RegExp constructor, no unicode flag +assert.compareArray(new RegExp("\\uD83D\\uDC38?", "").exec("\u{1F438}"), + ["\u{1F438}"]); +assert.sameValue(new RegExp("\\uD83D\\uDC38?", "").exec(""), + null); + +assert.compareArray(new RegExp("\\uD83D\\uDC38?", "").exec("\uD83D"), + ["\uD83D"]); + +// ==== + ==== + +assert.compareArray(/\uD83D\uDC38+/u.exec("\u{1F438}"), + ["\u{1F438}"]); +assert.compareArray(/\uD83D\uDC38+/u.exec("\u{1F438}\u{1F438}"), + ["\u{1F438}\u{1F438}"]); +assert.sameValue(/\uD83D\uDC38+/u.exec(""), + null); + +// lead-only target +assert.sameValue(/\uD83D\uDC38+/u.exec("\uD83D"), + null); +assert.compareArray(/\uD83D\uDC38+/u.exec("\uD83D\uDC38\uDC38"), + ["\uD83D\uDC38"]); + +// no unicode flag +assert.compareArray(/\uD83D\uDC38+/.exec("\u{1F438}"), + ["\u{1F438}"]); +assert.compareArray(/\uD83D\uDC38+/.exec("\u{1F438}\u{1F438}"), + ["\u{1F438}"]); +assert.sameValue(/\uD83D\uDC38+/.exec("\uD83D"), + null); +assert.compareArray(/\uD83D\uDC38+/.exec("\uD83D\uDC38\uDC38"), + ["\uD83D\uDC38\uDC38"]); +assert.sameValue(/\uD83D\uDC38+/.exec(""), + null); + +// ==== * ==== + +assert.compareArray(/\uD83D\uDC38*/u.exec("\u{1F438}"), + ["\u{1F438}"]); +assert.compareArray(/\uD83D\uDC38*/u.exec("\u{1F438}\u{1F438}"), + ["\u{1F438}\u{1F438}"]); +assert.compareArray(/\uD83D\uDC38*/u.exec(""), + [""]); + +// lead-only target +assert.compareArray(/\uD83D\uDC38*/u.exec("\uD83D"), + [""]); +assert.compareArray(/\uD83D\uDC38*/u.exec("\uD83D\uDC38\uDC38"), + ["\uD83D\uDC38"]); + +// no unicode flag +assert.compareArray(/\uD83D\uDC38*/.exec("\u{1F438}"), + ["\u{1F438}"]); +assert.compareArray(/\uD83D\uDC38*/.exec("\u{1F438}\u{1F438}"), + ["\u{1F438}"]); +assert.compareArray(/\uD83D\uDC38*/.exec("\uD83D"), + ["\uD83D"]); +assert.compareArray(/\uD83D\uDC38*/.exec("\uD83D\uDC38\uDC38"), + ["\uD83D\uDC38\uDC38"]); +assert.sameValue(/\uD83D\uDC38*/.exec(""), + null); + +// ==== lead-only ==== + +// match only non-surrogate pair +assert.compareArray(/\uD83D/u.exec("\uD83D\uDBFF"), + ["\uD83D"]); +assert.sameValue(/\uD83D/u.exec("\uD83D\uDC00"), + null); +assert.sameValue(/\uD83D/u.exec("\uD83D\uDFFF"), + null); +assert.compareArray(/\uD83D/u.exec("\uD83D\uE000"), + ["\uD83D"]); + +// match before non-tail char +assert.compareArray(/\uD83D/u.exec("\uD83D"), + ["\uD83D"]); +assert.compareArray(/\uD83D/u.exec("\uD83DA"), + ["\uD83D"]); + +// no unicode flag +assert.compareArray(/\uD83D/.exec("\uD83D\uDBFF"), + ["\uD83D"]); +assert.compareArray(/\uD83D/.exec("\uD83D\uDC00"), + ["\uD83D"]); +assert.compareArray(/\uD83D/.exec("\uD83D\uDFFF"), + ["\uD83D"]); +assert.compareArray(/\uD83D/.exec("\uD83D\uE000"), + ["\uD83D"]); +assert.compareArray(/\uD83D/.exec("\uD83D"), + ["\uD83D"]); +assert.compareArray(/\uD83D/.exec("\uD83DA"), + ["\uD83D"]); + +// ==== trail-only ==== + +// match only non-surrogate pair +assert.compareArray(/\uDC38/u.exec("\uD7FF\uDC38"), + ["\uDC38"]); +assert.sameValue(/\uDC38/u.exec("\uD800\uDC38"), + null); +assert.sameValue(/\uDC38/u.exec("\uDBFF\uDC38"), + null); +assert.compareArray(/\uDC38/u.exec("\uDC00\uDC38"), + ["\uDC38"]); + +// match after non-lead char +assert.compareArray(/\uDC38/u.exec("\uDC38"), + ["\uDC38"]); +assert.compareArray(/\uDC38/u.exec("A\uDC38"), + ["\uDC38"]); + +// no unicode flag +assert.compareArray(/\uDC38/.exec("\uD7FF\uDC38"), + ["\uDC38"]); +assert.compareArray(/\uDC38/.exec("\uD800\uDC38"), + ["\uDC38"]); +assert.compareArray(/\uDC38/.exec("\uDBFF\uDC38"), + ["\uDC38"]); +assert.compareArray(/\uDC38/.exec("\uDC00\uDC38"), + ["\uDC38"]); +assert.compareArray(/\uDC38/.exec("\uDC38"), + ["\uDC38"]); +assert.compareArray(/\uDC38/.exec("A\uDC38"), + ["\uDC38"]); + +// ==== invalid trail ==== + +assert.compareArray(/\uD83D\u3042*/u.exec("\uD83D"), + ["\uD83D"]); +assert.compareArray(/\uD83D\u3042*/u.exec("\uD83D\u3042"), + ["\uD83D\u3042"]); +assert.compareArray(/\uD83D\u3042*/u.exec("\uD83D\u3042\u3042"), + ["\uD83D\u3042\u3042"]); + +assert.compareArray(/\uD83D\u{3042}*/u.exec("\uD83D"), + ["\uD83D"]); +assert.compareArray(/\uD83D\u{3042}*/u.exec("\uD83D\u3042"), + ["\uD83D\u3042"]); +assert.compareArray(/\uD83D\u{3042}*/u.exec("\uD83D\u3042\u3042"), + ["\uD83D\u3042\u3042"]); + +assert.compareArray(/\uD83DA*/u.exec("\uD83D"), + ["\uD83D"]); +assert.compareArray(/\uD83DA*/u.exec("\uD83DA"), + ["\uD83DA"]); +assert.compareArray(/\uD83DA*/u.exec("\uD83DAA"), + ["\uD83DAA"]); + +// ==== wrong patterns ==== + +assertThrowsInstanceOf(() => eval(`/\\u/u`), SyntaxError); +assertThrowsInstanceOf(() => eval(`/\\u0/u`), SyntaxError); +assertThrowsInstanceOf(() => eval(`/\\u00/u`), SyntaxError); +assertThrowsInstanceOf(() => eval(`/\\u000/u`), SyntaxError); +assertThrowsInstanceOf(() => eval(`/\\u000G/u`), SyntaxError); +assertThrowsInstanceOf(() => eval(`/\\u0.00/u`), SyntaxError); +assertThrowsInstanceOf(() => eval(`/\\uD83D\\u/u`), SyntaxError); +assertThrowsInstanceOf(() => eval(`/\\uD83D\\u0/u`), SyntaxError); +assertThrowsInstanceOf(() => eval(`/\\uD83D\\u00/u`), SyntaxError); +assertThrowsInstanceOf(() => eval(`/\\uD83D\\u000/u`), SyntaxError); +assertThrowsInstanceOf(() => eval(`/\\uD83D\\u000G/u`), SyntaxError); +assertThrowsInstanceOf(() => eval(`/\\uD83D\\u0.00/u`), SyntaxError); + diff --git a/test/staging/sm/RegExp/unicode-raw.js b/test/staging/sm/RegExp/unicode-raw.js new file mode 100644 index 0000000000..ed7bd6f3e0 --- /dev/null +++ b/test/staging/sm/RegExp/unicode-raw.js @@ -0,0 +1,148 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [compareArray.js, sm/non262-RegExp-shell.js, sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +var BUGNUMBER = 1135377; +var summary = "Implement RegExp unicode flag -- raw unicode."; + +print(BUGNUMBER + ": " + summary); + +// ==== standalone ==== + +assert.compareArray(eval(`/\uD83D\uDC38/u`).exec("\u{1F438}"), + ["\u{1F438}"]); + +// no unicode flag +assert.compareArray(eval(`/\uD83D\uDC38/`).exec("\u{1F438}"), + ["\u{1F438}"]); + +// escaped (lead) +assert.sameValue(eval(`/\\uD83D\uDC38/u`).exec("\u{1F438}"), + null); +assert.sameValue(eval(`/\\u{D83D}\uDC38/u`).exec("\u{1F438}"), + null); + +// escaped (trail) +assert.sameValue(eval(`/\uD83D\\uDC38/u`).exec("\u{1F438}"), + null); +assert.sameValue(eval(`/\uD83D\\u{DC38}/u`).exec("\u{1F438}"), + null); + +// escaped (lead), no unicode flag +assert.compareArray(eval(`/\\uD83D\uDC38/`).exec("\u{1F438}"), + ["\u{1F438}"]); + +// escaped (trail), no unicode flag +assert.compareArray(eval(`/\uD83D\\uDC38/`).exec("\u{1F438}"), + ["\u{1F438}"]); + +// ==== RegExp constructor ==== + +assert.compareArray(new RegExp("\uD83D\uDC38", "u").exec("\u{1F438}"), + ["\u{1F438}"]); + +// no unicode flag +assert.compareArray(new RegExp("\uD83D\uDC38", "").exec("\u{1F438}"), + ["\u{1F438}"]); + +// escaped(lead) +assert.sameValue(new RegExp("\\uD83D\uDC38", "u").exec("\u{1F438}"), + null); +assert.sameValue(new RegExp("\\u{D83D}\uDC38", "u").exec("\u{1F438}"), + null); + +// escaped(trail) +assert.sameValue(new RegExp("\uD83D\\uDC38", "u").exec("\u{1F438}"), + null); +assert.sameValue(new RegExp("\uD83D\\u{DC38}", "u").exec("\u{1F438}"), + null); + +// escaped(lead), no unicode flag +assert.compareArray(new RegExp("\\uD83D\uDC38", "").exec("\u{1F438}"), + ["\u{1F438}"]); + +// escaped(trail), no unicode flag +assert.compareArray(new RegExp("\uD83D\\uDC38", "").exec("\u{1F438}"), + ["\u{1F438}"]); + +// ==== ? ==== + +assert.compareArray(eval(`/\uD83D\uDC38?/u`).exec("\u{1F438}"), + ["\u{1F438}"]); +assert.compareArray(eval(`/\uD83D\uDC38?/u`).exec(""), + [""]); + +assert.compareArray(eval(`/\uD83D\uDC38?/u`).exec("\uD83D"), + [""]); + +// no unicode flag +assert.compareArray(eval(`/\uD83D\uDC38?/`).exec("\u{1F438}"), + ["\u{1F438}"]); +assert.sameValue(eval(`/\uD83D\uDC38?/`).exec(""), + null); + +assert.compareArray(eval(`/\uD83D\uDC38?/`).exec("\uD83D"), + ["\uD83D"]); + +// escaped (lead) +assert.sameValue(eval(`/\\uD83D\uDC38?/u`).exec("\u{1F438}"), + null); +assert.sameValue(eval(`/\\uD83D\uDC38?/u`).exec(""), + null); + +assert.compareArray(eval(`/\\uD83D\uDC38?/u`).exec("\uD83D"), + ["\uD83D"]); + +// escaped (trail) +assert.sameValue(eval(`/\uD83D\\uDC38?/u`).exec("\u{1F438}"), + null); +assert.sameValue(eval(`/\uD83D\\uDC38?/u`).exec(""), + null); + +assert.compareArray(eval(`/\uD83D\\uDC38?/u`).exec("\uD83D"), + ["\uD83D"]); + +// escaped (lead), no unicode flag +assert.compareArray(eval(`/\\uD83D\uDC38?/`).exec("\u{1F438}"), + ["\u{1F438}"]); +assert.sameValue(eval(`/\\uD83D\uDC38?/`).exec(""), + null); + +assert.compareArray(eval(`/\\uD83D\uDC38?/`).exec("\uD83D"), + ["\uD83D"]); + +// escaped (trail), no unicode flag +assert.compareArray(eval(`/\uD83D\\uDC38?/`).exec("\u{1F438}"), + ["\u{1F438}"]); +assert.sameValue(eval(`/\uD83D\\uDC38?/`).exec(""), + null); + +assert.compareArray(eval(`/\uD83D\\uDC38?/`).exec("\uD83D"), + ["\uD83D"]); + +// ==== RegExp constructor, ? ==== + +assert.compareArray(new RegExp("\uD83D\uDC38?", "u").exec("\u{1F438}"), + ["\u{1F438}"]); +assert.compareArray(new RegExp("\uD83D\uDC38?", "u").exec(""), + [""]); + +assert.compareArray(new RegExp("\uD83D\uDC38?", "u").exec("\uD83D"), + [""]); + +// no unicode flag +assert.compareArray(new RegExp("\uD83D\uDC38?", "").exec("\u{1F438}"), + ["\u{1F438}"]); +assert.sameValue(new RegExp("\uD83D\uDC38?", "").exec(""), + null); + +assert.compareArray(new RegExp("\uD83D\uDC38?", "").exec("\uD83D"), + ["\uD83D"]); + diff --git a/test/staging/sm/Set/difference.js b/test/staging/sm/Set/difference.js new file mode 100644 index 0000000000..234704f4d0 --- /dev/null +++ b/test/staging/sm/Set/difference.js @@ -0,0 +1,470 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [compareArray.js, deepEqual.js, sm/non262-Set-shell.js, sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ + +assert.sameValue(typeof Set.prototype.difference, "function"); +assert.deepEqual(Object.getOwnPropertyDescriptor(Set.prototype.difference, "length"), { + value: 1, writable: false, enumerable: false, configurable: true, +}); +assert.deepEqual(Object.getOwnPropertyDescriptor(Set.prototype.difference, "name"), { + value: "difference", writable: false, enumerable: false, configurable: true, +}); + +const emptySet = new Set(); +const emptySetLike = new SetLike(); +const emptyMap = new Map(); + +function asMap(values) { + return new Map(values.map(v => [v, v])); +} + +// Difference of two empty sets is an empty set. +assertSetContainsExactOrderedItems(emptySet.difference(emptySet), []); +assertSetContainsExactOrderedItems(emptySet.difference(emptySetLike), []); +assertSetContainsExactOrderedItems(emptySet.difference(emptyMap), []); + +// Test native Set, Set-like, and Map objects. +for (let values of [ + [], [1], [1, 2], [1, true, null, {}], +]) { + // Difference with an empty set. + assertSetContainsExactOrderedItems(new Set(values).difference(emptySet), values); + assertSetContainsExactOrderedItems(new Set(values).difference(emptySetLike), values); + assertSetContainsExactOrderedItems(new Set(values).difference(emptyMap), values); + assertSetContainsExactOrderedItems(emptySet.difference(new Set(values)), []); + assertSetContainsExactOrderedItems(emptySet.difference(new SetLike(values)), []); + assertSetContainsExactOrderedItems(emptySet.difference(asMap(values)), []); + + // Two sets with the exact same values. + assertSetContainsExactOrderedItems(new Set(values).difference(new Set(values)), []); + assertSetContainsExactOrderedItems(new Set(values).difference(new SetLike(values)), []); + assertSetContainsExactOrderedItems(new Set(values).difference(asMap(values)), []); + + // Difference of the same set object. + let set = new Set(values); + assertSetContainsExactOrderedItems(set.difference(set), []); +} + +// Check property accesses are in the correct order. +{ + let log = []; + + let sizeValue = 0; + + let {proxy: keysIter} = LoggingProxy({ + next() { + log.push("next()"); + return {done: true}; + } + }, log); + + let {proxy: setLike} = LoggingProxy({ + size: { + valueOf() { + log.push("valueOf()"); + return sizeValue; + } + }, + has() { + throw new Error("Unexpected call to |has| method"); + }, + keys() { + log.push("keys()"); + return keysIter; + }, + }, log); + + log.length = 0; + assertSetContainsExactOrderedItems(emptySet.difference(setLike), []); + + assert.compareArray(log, [ + "[[get]]", "size", + "valueOf()", + "[[get]]", "has", + "[[get]]", "keys", + ]); + + // Input has more elements than the this-value. + sizeValue = 1; + + log.length = 0; + assertSetContainsExactOrderedItems(emptySet.difference(setLike), []); + + assert.compareArray(log, [ + "[[get]]", "size", + "valueOf()", + "[[get]]", "has", + "[[get]]", "keys", + ]); + + // Input has fewer elements than the this-value. + sizeValue = 0; + + log.length = 0; + assertSetContainsExactOrderedItems(new Set([1]).difference(setLike), [1]); + + assert.compareArray(log, [ + "[[get]]", "size", + "valueOf()", + "[[get]]", "has", + "[[get]]", "keys", + "keys()", + "[[get]]", "next", + "next()", + ]); +} + +// Check input validation. +{ + let log = []; + + const nonCallable = {}; + let sizeValue = 0; + + let {proxy: keysIter} = LoggingProxy({ + next: nonCallable, + }, log); + + let {proxy: setLike, obj: setLikeObj} = LoggingProxy({ + size: { + valueOf() { + log.push("valueOf()"); + return sizeValue; + } + }, + has() { + throw new Error("Unexpected call to |has| method"); + }, + keys() { + log.push("keys()"); + return keysIter; + }, + }, log); + + log.length = 0; + assertSetContainsExactOrderedItems(emptySet.difference(setLike), []); + + assert.compareArray(log, [ + "[[get]]", "size", + "valueOf()", + "[[get]]", "has", + "[[get]]", "keys", + ]); + + log.length = 0; + assertThrowsInstanceOf(() => new Set([1]).difference(setLike), TypeError); + + assert.compareArray(log, [ + "[[get]]", "size", + "valueOf()", + "[[get]]", "has", + "[[get]]", "keys", + "keys()", + "[[get]]", "next", + ]); + + // Change |keys| to return a non-object value. + setLikeObj.keys = () => 123; + + log.length = 0; + assertSetContainsExactOrderedItems(emptySet.difference(setLike), []); + + assert.compareArray(log, [ + "[[get]]", "size", + "valueOf()", + "[[get]]", "has", + "[[get]]", "keys", + ]); + + log.length = 0; + assertThrowsInstanceOf(() => new Set([1]).difference(setLike), TypeError); + + assert.compareArray(log, [ + "[[get]]", "size", + "valueOf()", + "[[get]]", "has", + "[[get]]", "keys", + ]); + + // Change |keys| to a non-callable value. + setLikeObj.keys = nonCallable; + + log.length = 0; + assertThrowsInstanceOf(() => emptySet.difference(setLike), TypeError); + + assert.compareArray(log, [ + "[[get]]", "size", + "valueOf()", + "[[get]]", "has", + "[[get]]", "keys", + ]); + + // Change |has| to a non-callable value. + setLikeObj.has = nonCallable; + + log.length = 0; + assertThrowsInstanceOf(() => emptySet.difference(setLike), TypeError); + + assert.compareArray(log, [ + "[[get]]", "size", + "valueOf()", + "[[get]]", "has", + ]); + + // Change |size| to NaN. + sizeValue = NaN; + + log.length = 0; + assertThrowsInstanceOf(() => emptySet.difference(setLike), TypeError); + + assert.compareArray(log, [ + "[[get]]", "size", + "valueOf()", + ]); + + // Change |size| to undefined. + sizeValue = undefined; + + log.length = 0; + assertThrowsInstanceOf(() => emptySet.difference(setLike), TypeError); + + assert.compareArray(log, [ + "[[get]]", "size", + "valueOf()", + ]); +} + +// Doesn't accept Array as an input. +assertThrowsInstanceOf(() => emptySet.difference([]), TypeError); + +// Works with Set subclasses. +{ + class MySet extends Set {} + + let myEmptySet = new MySet; + + assertSetContainsExactOrderedItems(emptySet.difference(myEmptySet), []); + assertSetContainsExactOrderedItems(myEmptySet.difference(myEmptySet), []); + assertSetContainsExactOrderedItems(myEmptySet.difference(emptySet), []); +} + +// Doesn't access any properties on the this-value. +{ + let log = []; + + let {proxy: setProto} = LoggingProxy(Set.prototype, log); + + let set = new Set([1, 2, 3]); + Object.setPrototypeOf(set, setProto); + + assertSetContainsExactOrderedItems(Set.prototype.difference.call(set, emptySet), [1, 2, 3]); + + assert.compareArray(log, []); +} + +// Throws a TypeError when the this-value isn't a Set object. +for (let thisValue of [ + null, undefined, true, "", {}, new Map, new Proxy(new Set, {}), +]) { + assertThrowsInstanceOf(() => Set.prototype.difference.call(thisValue, emptySet), TypeError); +} + +// Doesn't return the original Set object. +{ + let set = new Set([1]); + assert.sameValue(set.difference(emptySet) !== set, true); + assert.sameValue(set.difference(new Set([2])) !== set, true); +} + +// Test insertion order +{ + let set = new Set([1, 2, 3]); + + // Case 1: Input is empty. + assertSetContainsExactOrderedItems(set.difference(new Set([])), [1, 2, 3]); + + // Case 2: Input has fewer elements. + assertSetContainsExactOrderedItems(set.difference(new Set([1, 2])), [3]); + assertSetContainsExactOrderedItems(set.difference(new Set([2, 1])), [3]); + assertSetContainsExactOrderedItems(set.difference(new Set([11, 2])), [1, 3]); + assertSetContainsExactOrderedItems(set.difference(new Set([2, 11])), [1, 3]); + + // Case 3: Input has same number of elements. + assertSetContainsExactOrderedItems(set.difference(new Set([1, 2, 3])), []); + assertSetContainsExactOrderedItems(set.difference(new Set([2, 3, 1])), []); + assertSetContainsExactOrderedItems(set.difference(new Set([3, 2, 1])), []); + assertSetContainsExactOrderedItems(set.difference(new Set([11, 2, 3])), [1]); + assertSetContainsExactOrderedItems(set.difference(new Set([2, 3, 11])), [1]); + assertSetContainsExactOrderedItems(set.difference(new Set([3, 2, 11])), [1]); + + // Case 4: Input has more elements. + assertSetContainsExactOrderedItems(set.difference(new Set([2, 3, 4, 5])), [1]); + assertSetContainsExactOrderedItems(set.difference(new Set([4, 5, 2, 3])), [1]); + assertSetContainsExactOrderedItems(set.difference(new Set([5, 4, 3, 2])), [1]); +} + +// Calls |has| when the this-value has fewer or the same number of keys. +{ + const keys = [1, 2, 3]; + + for (let size of [keys.length, 100, Infinity]) { + let i = 0; + + let setLike = { + size, + has(v) { + assert.sameValue(this, setLike); + assert.sameValue(arguments.length, 1); + assert.sameValue(i < keys.length, true); + assert.sameValue(v, keys[i++]); + return true; + }, + keys() { + throw new Error("Unexpected call to |keys| method"); + }, + }; + + assertSetContainsExactOrderedItems(new Set(keys).difference(setLike), []); + } +} + +// Calls |keys| when the this-value has more keys. +{ + const keys = [1, 2, 3]; + + for (let size of [0, 1, 2]) { + let i = 0; + + let setLike = { + size, + has() { + throw new Error("Unexpected call to |has| method"); + }, + keys() { + assert.sameValue(this, setLike); + assert.sameValue(arguments.length, 0); + + let iterator = { + next() { + assert.sameValue(this, iterator); + assert.sameValue(arguments.length, 0); + if (i < keys.length) { + return { + done: false, + value: keys[i++], + }; + } + return { + done: true, + get value() { + throw new Error("Unexpected call to |value| getter"); + }, + }; + } + }; + + return iterator; + }, + }; + + assertSetContainsExactOrderedItems(new Set(keys).difference(setLike), []); + } +} + +// Test result set order when the this-value was modified. +{ + let originalKeys = null; + + let setLike = { + size: 100, + has(v) { + if (!originalKeys) { + assertSetContainsExactOrderedItems(set, [1, 2, 3, 4]); + + originalKeys = [...set.keys()]; + + // Remove all existing items. + set.clear(); + + // Add new keys 11 and 22. + set.add(11); + set.add(22); + } + + // |has| is called exactly once for each key. + assert.sameValue(originalKeys.includes(v), true); + + originalKeys.splice(originalKeys.indexOf(v), 1); + + return true; + }, + keys() { + throw new Error("Unexpected call to |keys| method"); + }, + }; + + let set = new Set([1, 2, 3, 4]); + + assertSetContainsExactOrderedItems(set.difference(setLike), []); + assertSetContainsExactOrderedItems(set, [11, 22]); + assert.compareArray(originalKeys, []); +} +{ + let setLike = { + size: 0, + has() { + throw new Error("Unexpected call to |has| method"); + }, + *keys() { + assertSetContainsExactOrderedItems(set, [1, 2, 3, 4]); + + let originalKeys = [...set.keys()]; + + // Remove all existing items. + set.clear(); + + // Add new keys 11 and 22. + set.add(11); + set.add(22); + + // Yield the original keys of |set|. + yield* originalKeys; + }, + }; + + let set = new Set([1, 2, 3, 4]); + + assertSetContainsExactOrderedItems(set.difference(setLike), []); + assertSetContainsExactOrderedItems(set, [11, 22]); +} + +// Tests which modify any built-ins should appear last, because modifications may disable +// optimised code paths. + +// Doesn't call the built-in |Set.prototype.{has, keys, size}| functions. +const SetPrototypeHas = Object.getOwnPropertyDescriptor(Set.prototype, "has"); +const SetPrototypeKeys = Object.getOwnPropertyDescriptor(Set.prototype, "keys"); +const SetPrototypeSize = Object.getOwnPropertyDescriptor(Set.prototype, "size"); + +delete Set.prototype.has; +delete Set.prototype.keys; +delete Set.prototype.size; + +try { + let set = new Set([1, 2, 3]); + let other = new SetLike([1, 2, 3]); + assertSetContainsExactOrderedItems(set.difference(other), []); +} finally { + Object.defineProperty(Set.prototype, "has", SetPrototypeHas); + Object.defineProperty(Set.prototype, "keys", SetPrototypeKeys); + Object.defineProperty(Set.prototype, "size", SetPrototypeSize); +} + diff --git a/test/staging/sm/Set/intersection.js b/test/staging/sm/Set/intersection.js new file mode 100644 index 0000000000..eff9a8d363 --- /dev/null +++ b/test/staging/sm/Set/intersection.js @@ -0,0 +1,486 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [compareArray.js, deepEqual.js, sm/non262-Set-shell.js, sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ + +assert.sameValue(typeof Set.prototype.intersection, "function"); +assert.deepEqual(Object.getOwnPropertyDescriptor(Set.prototype.intersection, "length"), { + value: 1, writable: false, enumerable: false, configurable: true, +}); +assert.deepEqual(Object.getOwnPropertyDescriptor(Set.prototype.intersection, "name"), { + value: "intersection", writable: false, enumerable: false, configurable: true, +}); + +const emptySet = new Set(); +const emptySetLike = new SetLike(); +const emptyMap = new Map(); + +function asMap(values) { + return new Map(values.map(v => [v, v])); +} + +// Intersection of two empty sets is an empty set. +assertSetContainsExactOrderedItems(emptySet.intersection(emptySet), []); +assertSetContainsExactOrderedItems(emptySet.intersection(emptySetLike), []); +assertSetContainsExactOrderedItems(emptySet.intersection(emptyMap), []); + +// Test native Set, Set-like, and Map objects. +for (let values of [ + [], [1], [1, 2], [1, true, null, {}], +]) { + // Intersection with an empty set. + assertSetContainsExactOrderedItems(new Set(values).intersection(emptySet), []); + assertSetContainsExactOrderedItems(new Set(values).intersection(emptySetLike), []); + assertSetContainsExactOrderedItems(new Set(values).intersection(emptyMap), []); + assertSetContainsExactOrderedItems(emptySet.intersection(new Set(values)), []); + assertSetContainsExactOrderedItems(emptySet.intersection(new SetLike(values)), []); + assertSetContainsExactOrderedItems(emptySet.intersection(asMap(values)), []); + + // Two sets with the exact same values. + assertSetContainsExactOrderedItems(new Set(values).intersection(new Set(values)), values); + assertSetContainsExactOrderedItems(new Set(values).intersection(new SetLike(values)), values); + assertSetContainsExactOrderedItems(new Set(values).intersection(asMap(values)), values); + + // Intersection of the same set object. + let set = new Set(values); + assertSetContainsExactOrderedItems(set.intersection(set), values); +} + +// Check property accesses are in the correct order. +{ + let log = []; + + let sizeValue = 0; + + let {proxy: keysIter} = LoggingProxy({ + next() { + log.push("next()"); + return {done: true}; + } + }, log); + + let {proxy: setLike} = LoggingProxy({ + size: { + valueOf() { + log.push("valueOf()"); + return sizeValue; + } + }, + has() { + throw new Error("Unexpected call to |has| method"); + }, + keys() { + log.push("keys()"); + return keysIter; + }, + }, log); + + log.length = 0; + assertSetContainsExactOrderedItems(emptySet.intersection(setLike), []); + + assert.compareArray(log, [ + "[[get]]", "size", + "valueOf()", + "[[get]]", "has", + "[[get]]", "keys", + ]); + + // Input has more elements than the this-value. + sizeValue = 1; + + log.length = 0; + assertSetContainsExactOrderedItems(emptySet.intersection(setLike), []); + + assert.compareArray(log, [ + "[[get]]", "size", + "valueOf()", + "[[get]]", "has", + "[[get]]", "keys", + ]); + + // Input has fewer elements than the this-value. + sizeValue = 0; + + log.length = 0; + assertSetContainsExactOrderedItems(new Set([1]).intersection(setLike), []); + + assert.compareArray(log, [ + "[[get]]", "size", + "valueOf()", + "[[get]]", "has", + "[[get]]", "keys", + "keys()", + "[[get]]", "next", + "next()", + ]); +} + +// Check input validation. +{ + let log = []; + + const nonCallable = {}; + let sizeValue = 0; + + let {proxy: keysIter} = LoggingProxy({ + next: nonCallable, + }, log); + + let {proxy: setLike, obj: setLikeObj} = LoggingProxy({ + size: { + valueOf() { + log.push("valueOf()"); + return sizeValue; + } + }, + has() { + throw new Error("Unexpected call to |has| method"); + }, + keys() { + log.push("keys()"); + return keysIter; + }, + }, log); + + log.length = 0; + assertSetContainsExactOrderedItems(emptySet.intersection(setLike), []); + + assert.compareArray(log, [ + "[[get]]", "size", + "valueOf()", + "[[get]]", "has", + "[[get]]", "keys", + ]); + + log.length = 0; + assertThrowsInstanceOf(() => new Set([1]).intersection(setLike), TypeError); + + assert.compareArray(log, [ + "[[get]]", "size", + "valueOf()", + "[[get]]", "has", + "[[get]]", "keys", + "keys()", + "[[get]]", "next", + ]); + + // Change |keys| to return a non-object value. + setLikeObj.keys = () => 123; + + log.length = 0; + assertSetContainsExactOrderedItems(emptySet.intersection(setLike), []); + + assert.compareArray(log, [ + "[[get]]", "size", + "valueOf()", + "[[get]]", "has", + "[[get]]", "keys", + ]); + + log.length = 0; + assertThrowsInstanceOf(() => new Set([1]).intersection(setLike), TypeError); + + assert.compareArray(log, [ + "[[get]]", "size", + "valueOf()", + "[[get]]", "has", + "[[get]]", "keys", + ]); + + // Change |keys| to a non-callable value. + setLikeObj.keys = nonCallable; + + log.length = 0; + assertThrowsInstanceOf(() => emptySet.intersection(setLike), TypeError); + + assert.compareArray(log, [ + "[[get]]", "size", + "valueOf()", + "[[get]]", "has", + "[[get]]", "keys", + ]); + + // Change |has| to a non-callable value. + setLikeObj.has = nonCallable; + + log.length = 0; + assertThrowsInstanceOf(() => emptySet.intersection(setLike), TypeError); + + assert.compareArray(log, [ + "[[get]]", "size", + "valueOf()", + "[[get]]", "has", + ]); + + // Change |size| to NaN. + sizeValue = NaN; + + log.length = 0; + assertThrowsInstanceOf(() => emptySet.intersection(setLike), TypeError); + + assert.compareArray(log, [ + "[[get]]", "size", + "valueOf()", + ]); + + // Change |size| to undefined. + sizeValue = undefined; + + log.length = 0; + assertThrowsInstanceOf(() => emptySet.intersection(setLike), TypeError); + + assert.compareArray(log, [ + "[[get]]", "size", + "valueOf()", + ]); +} + +// Doesn't accept Array as an input. +assertThrowsInstanceOf(() => emptySet.intersection([]), TypeError); + +// Works with Set subclasses. +{ + class MySet extends Set {} + + let myEmptySet = new MySet; + + assertSetContainsExactOrderedItems(emptySet.intersection(myEmptySet), []); + assertSetContainsExactOrderedItems(myEmptySet.intersection(myEmptySet), []); + assertSetContainsExactOrderedItems(myEmptySet.intersection(emptySet), []); +} + +// Doesn't access any properties on the this-value. +{ + let log = []; + + let {proxy: setProto} = LoggingProxy(Set.prototype, log); + + let set = new Set([1, 2, 3]); + Object.setPrototypeOf(set, setProto); + + assertSetContainsExactOrderedItems(Set.prototype.intersection.call(set, emptySet), []); + + assert.compareArray(log, []); +} + +// Throws a TypeError when the this-value isn't a Set object. +for (let thisValue of [ + null, undefined, true, "", {}, new Map, new Proxy(new Set, {}), +]) { + assertThrowsInstanceOf(() => Set.prototype.intersection.call(thisValue, emptySet), TypeError); +} + +// Doesn't return the original Set object. +{ + let set = new Set([1]); + assert.sameValue(set.intersection(emptySet) !== set, true); + assert.sameValue(set.intersection(new Set([2])) !== set, true); +} + +// Test insertion order +{ + let set = new Set([1, 2, 3]); + + // Case 1: Input is empty. + assertSetContainsExactOrderedItems(set.intersection(new Set([])), []); + + // Case 2: Input has fewer elements. + assertSetContainsExactOrderedItems(set.intersection(new Set([1, 2])), [1, 2]); + assertSetContainsExactOrderedItems(set.intersection(new Set([2, 1])), [2, 1]); + assertSetContainsExactOrderedItems(set.intersection(new Set([11, 2])), [2]); + assertSetContainsExactOrderedItems(set.intersection(new Set([2, 11])), [2]); + + // Case 3: Input has same number of elements. + assertSetContainsExactOrderedItems(set.intersection(new Set([1, 2, 3])), [1, 2, 3]); + assertSetContainsExactOrderedItems(set.intersection(new Set([2, 3, 1])), [1, 2, 3]); + assertSetContainsExactOrderedItems(set.intersection(new Set([3, 2, 1])), [1, 2, 3]); + assertSetContainsExactOrderedItems(set.intersection(new Set([11, 2, 3])), [2, 3]); + assertSetContainsExactOrderedItems(set.intersection(new Set([2, 3, 11])), [2, 3]); + assertSetContainsExactOrderedItems(set.intersection(new Set([3, 2, 11])), [2, 3]); + + // Case 4: Input has more elements. + assertSetContainsExactOrderedItems(set.intersection(new Set([2, 3, 4, 5])), [2, 3]); + assertSetContainsExactOrderedItems(set.intersection(new Set([4, 5, 2, 3])), [2, 3]); + assertSetContainsExactOrderedItems(set.intersection(new Set([5, 4, 3, 2])), [2, 3]); +} + +// Calls |has| when the this-value has fewer or the same number of keys. +{ + const keys = [1, 2, 3]; + + for (let size of [keys.length, 100, Infinity]) { + let i = 0; + + let setLike = { + size, + has(v) { + assert.sameValue(this, setLike); + assert.sameValue(arguments.length, 1); + assert.sameValue(i < keys.length, true); + assert.sameValue(v, keys[i++]); + return true; + }, + keys() { + throw new Error("Unexpected call to |keys| method"); + }, + }; + + assertSetContainsExactOrderedItems(new Set(keys).intersection(setLike), keys); + } +} + +// Calls |keys| when the this-value has more keys. +{ + const keys = [1, 2, 3]; + + for (let size of [0, 1, 2]) { + let i = 0; + + let setLike = { + size, + has() { + throw new Error("Unexpected call to |keys| method"); + }, + keys() { + assert.sameValue(this, setLike); + assert.sameValue(arguments.length, 0); + + let iterator = { + next() { + assert.sameValue(this, iterator); + assert.sameValue(arguments.length, 0); + if (i < keys.length) { + return { + done: false, + value: keys[i++], + }; + } + return { + done: true, + get value() { + throw new Error("Unexpected call to |value| getter"); + }, + }; + } + }; + + return iterator; + }, + }; + + assertSetContainsExactOrderedItems(new Set(keys).intersection(setLike), keys); + } +} + +// Test result set order when the this-value was modified. +{ + let setLike = { + size: 0, + has() { + throw new Error("Unexpected call to |has| method"); + }, + *keys() { + // Yield the same keys as in |set|. + yield* set.keys(); + + // Remove all existing items. + set.clear(); + + // Re-add keys 2 and 3, but in reversed order. + set.add(3); + set.add(2); + + // Additionally add 99. + set.add(99); + }, + }; + + let set = new Set([1, 2, 3, 4]); + + assertSetContainsExactOrderedItems(set.intersection(setLike), [1, 2, 3, 4]); + assertSetContainsExactOrderedItems(set, [3, 2, 99]); +} +{ + let setLike = { + size: 0, + has() { + throw new Error("Unexpected call to |has| method"); + }, + *keys() { + // Yield the same keys as in |set|. + yield* set.keys(); + + // Remove only keys 2 and 3. + set.delete(2); + set.delete(3); + + // Re-add keys 2 and 3, but in reversed order. + set.add(3); + set.add(2); + }, + }; + + let set = new Set([1, 2, 3, 4]); + + assertSetContainsExactOrderedItems(set.intersection(setLike), [1, 2, 3, 4]); + assertSetContainsExactOrderedItems(set, [1, 4, 3, 2]); +} + +// Test the same item can't be added multiple times. +{ + let seen = []; + + let setLike = { + size: 100, + has(v) { + // Remove and then re-add 2. + if (v === 2 && !seen.includes(v)) { + set.delete(v); + set.add(v); + } + + // Remember all visited keys. + seen.push(v); + + return true; + }, + keys() { + throw new Error("Unexpected call to |keys| method"); + }, + }; + + let set = new Set([1, 2, 3]); + + assertSetContainsExactOrderedItems(set.intersection(setLike), [1, 2, 3]); + assert.compareArray(seen, [1, 2, 3, 2]); +} + +// Tests which modify any built-ins should appear last, because modifications may disable +// optimised code paths. + +// Doesn't call the built-in |Set.prototype.{has, keys, size}| functions. +const SetPrototypeHas = Object.getOwnPropertyDescriptor(Set.prototype, "has"); +const SetPrototypeKeys = Object.getOwnPropertyDescriptor(Set.prototype, "keys"); +const SetPrototypeSize = Object.getOwnPropertyDescriptor(Set.prototype, "size"); + +delete Set.prototype.has; +delete Set.prototype.keys; +delete Set.prototype.size; + +try { + let set = new Set([1, 2, 3]); + let other = new SetLike([1, 2, 3]); + assertSetContainsExactOrderedItems(set.intersection(other), [1, 2, 3]); +} finally { + Object.defineProperty(Set.prototype, "has", SetPrototypeHas); + Object.defineProperty(Set.prototype, "keys", SetPrototypeKeys); + Object.defineProperty(Set.prototype, "size", SetPrototypeSize); +} + diff --git a/test/staging/sm/Set/is-disjoint-from.js b/test/staging/sm/Set/is-disjoint-from.js new file mode 100644 index 0000000000..cd74aa39ab --- /dev/null +++ b/test/staging/sm/Set/is-disjoint-from.js @@ -0,0 +1,456 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [compareArray.js, deepEqual.js, sm/non262-Set-shell.js, sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ + +assert.sameValue(typeof Set.prototype.isDisjointFrom, "function"); +assert.deepEqual(Object.getOwnPropertyDescriptor(Set.prototype.isDisjointFrom, "length"), { + value: 1, writable: false, enumerable: false, configurable: true, +}); +assert.deepEqual(Object.getOwnPropertyDescriptor(Set.prototype.isDisjointFrom, "name"), { + value: "isDisjointFrom", writable: false, enumerable: false, configurable: true, +}); + +const emptySet = new Set(); +const emptySetLike = new SetLike(); +const emptyMap = new Map(); + +function asMap(values) { + return new Map(values.map(v => [v, v])); +} + +// Empty set is disjoint from the empty set. +assert.sameValue(emptySet.isDisjointFrom(emptySet), true); +assert.sameValue(emptySet.isDisjointFrom(emptySetLike), true); +assert.sameValue(emptySet.isDisjointFrom(emptyMap), true); + +// Test native Set, Set-like, and Map objects. +for (let values of [ + [], [1], [1, 2], [1, true, null, {}], +]) { + // Disjoint operation with an empty set. + assert.sameValue(new Set(values).isDisjointFrom(emptySet), true); + assert.sameValue(new Set(values).isDisjointFrom(emptySetLike), true); + assert.sameValue(new Set(values).isDisjointFrom(emptyMap), true); + assert.sameValue(emptySet.isDisjointFrom(new Set(values)), true); + assert.sameValue(emptySet.isDisjointFrom(new SetLike(values)), true); + assert.sameValue(emptySet.isDisjointFrom(asMap(values)), true); + + // Two sets with the exact same values. + assert.sameValue(new Set(values).isDisjointFrom(new Set(values)), values.length === 0); + assert.sameValue(new Set(values).isDisjointFrom(new SetLike(values)), values.length === 0); + assert.sameValue(new Set(values).isDisjointFrom(asMap(values)), values.length === 0); + + // Disjoint operation of the same set object. + let set = new Set(values); + assert.sameValue(set.isDisjointFrom(set), values.length === 0); +} + +// Check property accesses are in the correct order. +{ + let log = []; + + let sizeValue = 0; + + let {proxy: keysIter} = LoggingProxy({ + next() { + log.push("next()"); + return {done: true}; + } + }, log); + + let {proxy: setLike} = LoggingProxy({ + size: { + valueOf() { + log.push("valueOf()"); + return sizeValue; + } + }, + has() { + throw new Error("Unexpected call to |has| method"); + }, + keys() { + log.push("keys()"); + return keysIter; + }, + }, log); + + assert.sameValue(emptySet.isDisjointFrom(setLike), true); + + assert.compareArray(log, [ + "[[get]]", "size", + "valueOf()", + "[[get]]", "has", + "[[get]]", "keys", + ]); + + // |keys| is called when the this-value has more elements. + + log.length = 0; + assert.sameValue(new Set([1]).isDisjointFrom(setLike), true); + + assert.compareArray(log, [ + "[[get]]", "size", + "valueOf()", + "[[get]]", "has", + "[[get]]", "keys", + "keys()", + "[[get]]", "next", + "next()", + ]); +} + +// Check input validation. +{ + let log = []; + + const nonCallable = {}; + let sizeValue = 0; + + let {proxy: keysIter} = LoggingProxy({ + next: nonCallable, + }, log); + + let {proxy: setLike, obj: setLikeObj} = LoggingProxy({ + size: { + valueOf() { + log.push("valueOf()"); + return sizeValue; + } + }, + has() { + throw new Error("Unexpected call to |has| method"); + }, + keys() { + log.push("keys()"); + return keysIter; + }, + }, log); + + log.length = 0; + assert.sameValue(emptySet.isDisjointFrom(setLike), true); + + assert.compareArray(log, [ + "[[get]]", "size", + "valueOf()", + "[[get]]", "has", + "[[get]]", "keys", + ]); + + log.length = 0; + assertThrowsInstanceOf(() => new Set([1]).isDisjointFrom(setLike), TypeError); + + assert.compareArray(log, [ + "[[get]]", "size", + "valueOf()", + "[[get]]", "has", + "[[get]]", "keys", + "keys()", + "[[get]]", "next", + ]); + + // Change |keys| to return a non-object value. + setLikeObj.keys = () => 123; + + log.length = 0; + assert.sameValue(emptySet.isDisjointFrom(setLike), true); + + assert.compareArray(log, [ + "[[get]]", "size", + "valueOf()", + "[[get]]", "has", + "[[get]]", "keys", + ]); + + log.length = 0; + assertThrowsInstanceOf(() => new Set([1]).isDisjointFrom(setLike), TypeError); + + assert.compareArray(log, [ + "[[get]]", "size", + "valueOf()", + "[[get]]", "has", + "[[get]]", "keys", + ]); + + // Change |keys| to a non-callable value. + setLikeObj.keys = nonCallable; + + log.length = 0; + assertThrowsInstanceOf(() => emptySet.isDisjointFrom(setLike), TypeError); + + assert.compareArray(log, [ + "[[get]]", "size", + "valueOf()", + "[[get]]", "has", + "[[get]]", "keys", + ]); + + // Change |has| to a non-callable value. + setLikeObj.has = nonCallable; + + log.length = 0; + assertThrowsInstanceOf(() => emptySet.isDisjointFrom(setLike), TypeError); + + assert.compareArray(log, [ + "[[get]]", "size", + "valueOf()", + "[[get]]", "has", + ]); + + // Change |size| to NaN. + sizeValue = NaN; + + log.length = 0; + assertThrowsInstanceOf(() => emptySet.isDisjointFrom(setLike), TypeError); + + assert.compareArray(log, [ + "[[get]]", "size", + "valueOf()", + ]); + + // Change |size| to undefined. + sizeValue = undefined; + + log.length = 0; + assertThrowsInstanceOf(() => emptySet.isDisjointFrom(setLike), TypeError); + + assert.compareArray(log, [ + "[[get]]", "size", + "valueOf()", + ]); +} + +// Doesn't accept Array as an input. +assertThrowsInstanceOf(() => emptySet.isDisjointFrom([]), TypeError); + +// Works with Set subclasses. +{ + class MySet extends Set {} + + let myEmptySet = new MySet; + + assert.sameValue(emptySet.isDisjointFrom(myEmptySet), true); + assert.sameValue(myEmptySet.isDisjointFrom(myEmptySet), true); + assert.sameValue(myEmptySet.isDisjointFrom(emptySet), true); +} + +// Doesn't access any properties on the this-value. +{ + let log = []; + + let {proxy: setProto} = LoggingProxy(Set.prototype, log); + + let set = new Set([]); + Object.setPrototypeOf(set, setProto); + + assert.sameValue(Set.prototype.isDisjointFrom.call(set, emptySet), true); + + assert.compareArray(log, []); +} + +// Throws a TypeError when the this-value isn't a Set object. +for (let thisValue of [ + null, undefined, true, "", {}, new Map, new Proxy(new Set, {}), +]) { + assertThrowsInstanceOf(() => Set.prototype.isDisjointFrom.call(thisValue, emptySet), TypeError); +} + +// Calls |has| when the this-value has fewer keys. +{ + const keys = [1, 2, 3]; + + for (let size of [keys.length, 100, Infinity]) { + let i = 0; + + let setLike = { + size, + has(v) { + assert.sameValue(this, setLike); + assert.sameValue(arguments.length, 1); + assert.sameValue(i < keys.length, true); + assert.sameValue(v, keys[i++]); + return false; + }, + keys() { + throw new Error("Unexpected call to |keys| method"); + }, + }; + + assert.sameValue(new Set([1, 2, 3]).isDisjointFrom(setLike), true); + } +} + +// Calls |keys| when the this-value has more keys. +{ + const keys = [1, 2, 3]; + + for (let size of [0, 1, 2]) { + let setLike = { + size, + has() { + throw new Error("Unexpected call to |has| method"); + }, + *keys() { + yield* [4, 5, 6]; + }, + }; + + assert.sameValue(new Set(keys).isDisjointFrom(setLike), true); + } + + // Also test early return after first match. + for (let size of [0, 1, 2]) { + let setLike = { + size, + has() { + throw new Error("Unexpected call to |has| method"); + }, + *keys() { + yield keys[0]; + + throw new Error("keys iterator called too many times"); + }, + }; + + assert.sameValue(new Set(keys).isDisjointFrom(setLike), false); + } +} + +// Test when this-value is modified during iteration. +{ + let set = new Set([]); + + // |setLike| has more entries than |set|. + let setLike = { + size: 100, + has(v) { + assert.sameValue(set.has(v), true); + set.delete(v); + return false; + }, + keys() { + throw new Error("Unexpected call to |keys| method"); + }, + }; + + assert.sameValue(set.isDisjointFrom(setLike), true); + assertSetContainsExactOrderedItems(set, []); +} +{ + let set = new Set([0]); + + let keys = [1, 2, 3]; + + let lastValue; + let keysIter = { + next() { + if (lastValue !== undefined) { + assert.sameValue(set.has(lastValue), false); + set.add(lastValue); + + lastValue = undefined; + } + + if (keys.length) { + let value = keys.shift(); + lastValue = value; + return { + done: false, + get value() { + return value; + } + }; + } + return { + done: true, + get value() { + throw new Error("Unexpected call to |value| getter"); + } + }; + } + }; + + // |setLike| has fewer entries than |set|. + let setLike = { + size: 0, + has() { + throw new Error("Unexpected call to |has| method"); + }, + keys() { + return keysIter; + }, + }; + + assert.sameValue(set.isDisjointFrom(setLike), true); + assertSetContainsExactOrderedItems(set, [0, 1, 2, 3]); +} + +// IteratorClose is called for early returns. +{ + let log = []; + + let keysIter = { + next() { + log.push("next"); + return {done: false, value: 1}; + }, + return() { + log.push("return"); + return { + get value() { throw new Error("Unexpected call to |value| getter"); }, + get done() { throw new Error("Unexpected call to |done| getter"); }, + }; + } + }; + + let setLike = { + size: 0, + has() { + throw new Error("Unexpected call to |has| method"); + }, + keys() { + return keysIter; + }, + }; + + assert.sameValue(new Set([1, 2, 3]).isDisjointFrom(setLike), false); + + assert.compareArray(log, ["next", "return"]); +} + +// IteratorClose isn't called for non-early returns. +{ + let setLike = new SetLike([4, 5, 6]); + + assert.sameValue(new Set([1, 2, 3]).isDisjointFrom(setLike), true); +} + +// Tests which modify any built-ins should appear last, because modifications may disable +// optimised code paths. + +// Doesn't call the built-in |Set.prototype.{has, keys, size}| functions. +const SetPrototypeHas = Object.getOwnPropertyDescriptor(Set.prototype, "has"); +const SetPrototypeKeys = Object.getOwnPropertyDescriptor(Set.prototype, "keys"); +const SetPrototypeSize = Object.getOwnPropertyDescriptor(Set.prototype, "size"); + +delete Set.prototype.has; +delete Set.prototype.keys; +delete Set.prototype.size; + +try { + let set = new Set([1, 2, 3]); + let other = new SetLike([1, 2, 3]); + assert.sameValue(set.isDisjointFrom(other), false); +} finally { + Object.defineProperty(Set.prototype, "has", SetPrototypeHas); + Object.defineProperty(Set.prototype, "keys", SetPrototypeKeys); + Object.defineProperty(Set.prototype, "size", SetPrototypeSize); +} + diff --git a/test/staging/sm/Set/is-subset-of.js b/test/staging/sm/Set/is-subset-of.js new file mode 100644 index 0000000000..a4974f62d1 --- /dev/null +++ b/test/staging/sm/Set/is-subset-of.js @@ -0,0 +1,341 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [compareArray.js, deepEqual.js, sm/non262-Set-shell.js, sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ + +assert.sameValue(typeof Set.prototype.isSubsetOf, "function"); +assert.deepEqual(Object.getOwnPropertyDescriptor(Set.prototype.isSubsetOf, "length"), { + value: 1, writable: false, enumerable: false, configurable: true, +}); +assert.deepEqual(Object.getOwnPropertyDescriptor(Set.prototype.isSubsetOf, "name"), { + value: "isSubsetOf", writable: false, enumerable: false, configurable: true, +}); + +const emptySet = new Set(); +const emptySetLike = new SetLike(); +const emptyMap = new Map(); + +function asMap(values) { + return new Map(values.map(v => [v, v])); +} + +// Empty set is a subset of the empty set. +assert.sameValue(emptySet.isSubsetOf(emptySet), true); +assert.sameValue(emptySet.isSubsetOf(emptySetLike), true); +assert.sameValue(emptySet.isSubsetOf(emptyMap), true); + +// Test native Set, Set-like, and Map objects. +for (let values of [ + [], [1], [1, 2], [1, true, null, {}], +]) { + // Subset operation with an empty set. + assert.sameValue(new Set(values).isSubsetOf(emptySet), values.length === 0); + assert.sameValue(new Set(values).isSubsetOf(emptySetLike), values.length === 0); + assert.sameValue(new Set(values).isSubsetOf(emptyMap), values.length === 0); + assert.sameValue(emptySet.isSubsetOf(new Set(values)), true); + assert.sameValue(emptySet.isSubsetOf(new SetLike(values)), true); + assert.sameValue(emptySet.isSubsetOf(asMap(values)), true); + + // Two sets with the exact same values. + assert.sameValue(new Set(values).isSubsetOf(new Set(values)), true); + assert.sameValue(new Set(values).isSubsetOf(new SetLike(values)), true); + assert.sameValue(new Set(values).isSubsetOf(asMap(values)), true); + + // Subset operation of the same set object. + let set = new Set(values); + assert.sameValue(set.isSubsetOf(set), true); +} + +// Check property accesses are in the correct order. +{ + let log = []; + + let sizeValue = 0; + + let {proxy: keysIter} = LoggingProxy({ + next() { + log.push("next()"); + return {done: true}; + } + }, log); + + let {proxy: setLike} = LoggingProxy({ + size: { + valueOf() { + log.push("valueOf()"); + return sizeValue; + } + }, + has() { + throw new Error("Unexpected call to |has| method"); + }, + keys() { + log.push("keys()"); + return keysIter; + }, + }, log); + + assert.sameValue(emptySet.isSubsetOf(setLike), true); + + assert.compareArray(log, [ + "[[get]]", "size", + "valueOf()", + "[[get]]", "has", + "[[get]]", "keys", + ]); +} + +// Check input validation. +{ + let log = []; + + const nonCallable = {}; + let sizeValue = 0; + + let {proxy: setLike, obj: setLikeObj} = LoggingProxy({ + size: { + valueOf() { + log.push("valueOf()"); + return sizeValue; + } + }, + has() { + throw new Error("Unexpected call to |has| method"); + }, + keys() { + throw new Error("Unexpected call to |keys| method"); + }, + }, log); + + // Change |keys| to a non-callable value. + setLikeObj.keys = nonCallable; + + log.length = 0; + assertThrowsInstanceOf(() => emptySet.isSubsetOf(setLike), TypeError); + + assert.compareArray(log, [ + "[[get]]", "size", + "valueOf()", + "[[get]]", "has", + "[[get]]", "keys", + ]); + + // Change |has| to a non-callable value. + setLikeObj.has = nonCallable; + + log.length = 0; + assertThrowsInstanceOf(() => emptySet.isSubsetOf(setLike), TypeError); + + assert.compareArray(log, [ + "[[get]]", "size", + "valueOf()", + "[[get]]", "has", + ]); + + // Change |size| to NaN. + sizeValue = NaN; + + log.length = 0; + assertThrowsInstanceOf(() => emptySet.isSubsetOf(setLike), TypeError); + + assert.compareArray(log, [ + "[[get]]", "size", + "valueOf()", + ]); + + // Change |size| to undefined. + sizeValue = undefined; + + log.length = 0; + assertThrowsInstanceOf(() => emptySet.isSubsetOf(setLike), TypeError); + + assert.compareArray(log, [ + "[[get]]", "size", + "valueOf()", + ]); +} + +// Doesn't accept Array as an input. +assertThrowsInstanceOf(() => emptySet.isSubsetOf([]), TypeError); + +// Works with Set subclasses. +{ + class MySet extends Set {} + + let myEmptySet = new MySet; + + assert.sameValue(emptySet.isSubsetOf(myEmptySet), true); + assert.sameValue(myEmptySet.isSubsetOf(myEmptySet), true); + assert.sameValue(myEmptySet.isSubsetOf(emptySet), true); +} + +// Doesn't access any properties on the this-value. +{ + let log = []; + + let {proxy: setProto} = LoggingProxy(Set.prototype, log); + + let set = new Set([]); + Object.setPrototypeOf(set, setProto); + + assert.sameValue(Set.prototype.isSubsetOf.call(set, emptySet), true); + + assert.compareArray(log, []); +} + +// Throws a TypeError when the this-value isn't a Set object. +for (let thisValue of [ + null, undefined, true, "", {}, new Map, new Proxy(new Set, {}), +]) { + assertThrowsInstanceOf(() => Set.prototype.isSubsetOf.call(thisValue, emptySet), TypeError); +} + +// Doesn't call |has| when this-value has more elements. +{ + let set = new Set([1, 2, 3]); + + for (let size of [0, 1, 2]) { + let setLike = { + size, + has() { + throw new Error("Unexpected call to |has| method"); + }, + keys() { + throw new Error("Unexpected call to |keys| method"); + }, + }; + + assert.sameValue(set.isSubsetOf(setLike), false); + } +} + +// Test when this-value is modified during iteration. +{ + let set = new Set([1, 2, 3]); + + let seen = new Set(); + + let setLike = { + size: 100, + has(v) { + assert.sameValue(arguments.length, 1); + assert.sameValue(this, setLike); + assert.sameValue(set.has(v), true); + + assert.sameValue(seen.has(v), false); + seen.add(v); + + // Delete the current element. + set.delete(v); + + return true; + }, + keys() { + throw new Error("Unexpected call to |keys| method"); + }, + }; + + assert.sameValue(set.isSubsetOf(setLike), true); + assertSetContainsExactOrderedItems(set, []); + assertSetContainsExactOrderedItems(seen, [1, 2, 3]); +} +{ + let set = new Set([1]); + + let seen = new Set(); + let newKeys = [2, 3, 4, 5]; + + let setLike = { + size: 100, + has(v) { + assert.sameValue(arguments.length, 1); + assert.sameValue(this, setLike); + assert.sameValue(set.has(v), true); + + assert.sameValue(seen.has(v), false); + seen.add(v); + + // Delete the current element. + set.delete(v); + + // Add new elements. + if (newKeys.length) { + set.add(newKeys.shift()); + } + + return true; + }, + keys() { + throw new Error("Unexpected call to |keys| method"); + }, + }; + + assert.sameValue(set.isSubsetOf(setLike), true); + assertSetContainsExactOrderedItems(set, []); + assertSetContainsExactOrderedItems(seen, [1, 2, 3, 4, 5]); + assert.sameValue(newKeys.length, 0); +} +{ + let set = new Set([1, 2, 3]); + + let seen = new Set(); + let deleted = false; + + let setLike = { + size: 100, + has(v) { + assert.sameValue(arguments.length, 1); + assert.sameValue(this, setLike); + assert.sameValue(set.has(v), true); + + assert.sameValue(seen.has(v), false); + seen.add(v); + + if (!deleted) { + assert.sameValue(v, 1); + set.delete(2); + deleted = true; + } + + return true; + }, + keys() { + throw new Error("Unexpected call to |keys| method"); + }, + }; + + assert.sameValue(set.isSubsetOf(setLike), true); + assertSetContainsExactOrderedItems(set, [1, 3]); + assertSetContainsExactOrderedItems(seen, [1, 3]); + assert.sameValue(deleted, true); +} + +// Tests which modify any built-ins should appear last, because modifications may disable +// optimised code paths. + +// Doesn't call the built-in |Set.prototype.{has, keys, size}| functions. +const SetPrototypeHas = Object.getOwnPropertyDescriptor(Set.prototype, "has"); +const SetPrototypeKeys = Object.getOwnPropertyDescriptor(Set.prototype, "keys"); +const SetPrototypeSize = Object.getOwnPropertyDescriptor(Set.prototype, "size"); + +delete Set.prototype.has; +delete Set.prototype.keys; +delete Set.prototype.size; + +try { + let set = new Set([1, 2, 3]); + let other = new SetLike([1, 2, 3]); + assert.sameValue(set.isSubsetOf(other), true); +} finally { + Object.defineProperty(Set.prototype, "has", SetPrototypeHas); + Object.defineProperty(Set.prototype, "keys", SetPrototypeKeys); + Object.defineProperty(Set.prototype, "size", SetPrototypeSize); +} + diff --git a/test/staging/sm/Set/is-superset-of.js b/test/staging/sm/Set/is-superset-of.js new file mode 100644 index 0000000000..ef66fa12dc --- /dev/null +++ b/test/staging/sm/Set/is-superset-of.js @@ -0,0 +1,368 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [compareArray.js, deepEqual.js, sm/non262-Set-shell.js, sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ + +assert.sameValue(typeof Set.prototype.isSupersetOf, "function"); +assert.deepEqual(Object.getOwnPropertyDescriptor(Set.prototype.isSupersetOf, "length"), { + value: 1, writable: false, enumerable: false, configurable: true, +}); +assert.deepEqual(Object.getOwnPropertyDescriptor(Set.prototype.isSupersetOf, "name"), { + value: "isSupersetOf", writable: false, enumerable: false, configurable: true, +}); + +const emptySet = new Set(); +const emptySetLike = new SetLike(); +const emptyMap = new Map(); + +function asMap(values) { + return new Map(values.map(v => [v, v])); +} + +// Empty set is a superset of the empty set. +assert.sameValue(emptySet.isSupersetOf(emptySet), true); +assert.sameValue(emptySet.isSupersetOf(emptySetLike), true); +assert.sameValue(emptySet.isSupersetOf(emptyMap), true); + +// Test native Set, Set-like, and Map objects. +for (let values of [ + [], [1], [1, 2], [1, true, null, {}], +]) { + // Superset operation with an empty set. + assert.sameValue(new Set(values).isSupersetOf(emptySet), true); + assert.sameValue(new Set(values).isSupersetOf(emptySetLike), true); + assert.sameValue(new Set(values).isSupersetOf(emptyMap), true); + assert.sameValue(emptySet.isSupersetOf(new Set(values)), values.length === 0); + assert.sameValue(emptySet.isSupersetOf(new SetLike(values)), values.length === 0); + assert.sameValue(emptySet.isSupersetOf(asMap(values)), values.length === 0); + + // Two sets with the exact same values. + assert.sameValue(new Set(values).isSupersetOf(new Set(values)), true); + assert.sameValue(new Set(values).isSupersetOf(new SetLike(values)), true); + assert.sameValue(new Set(values).isSupersetOf(asMap(values)), true); + + // Superset operation of the same set object. + let set = new Set(values); + assert.sameValue(set.isSupersetOf(set), true); +} + +// Check property accesses are in the correct order. +{ + let log = []; + + let sizeValue = 0; + + let {proxy: keysIter} = LoggingProxy({ + next() { + log.push("next()"); + return {done: true}; + } + }, log); + + let {proxy: setLike} = LoggingProxy({ + size: { + valueOf() { + log.push("valueOf()"); + return sizeValue; + } + }, + has() { + throw new Error("Unexpected call to |has| method"); + }, + keys() { + log.push("keys()"); + return keysIter; + }, + }, log); + + assert.sameValue(emptySet.isSupersetOf(setLike), true); + + assert.compareArray(log, [ + "[[get]]", "size", + "valueOf()", + "[[get]]", "has", + "[[get]]", "keys", + "keys()", + "[[get]]", "next", + "next()", + ]); + + // |keys| isn't called when the this-value has fewer elements. + sizeValue = 1; + + log.length = 0; + assert.sameValue(emptySet.isSupersetOf(setLike), false); + + assert.compareArray(log, [ + "[[get]]", "size", + "valueOf()", + "[[get]]", "has", + "[[get]]", "keys", + ]); +} + +// Check input validation. +{ + let log = []; + + const nonCallable = {}; + let sizeValue = 0; + + let {proxy: keysIter} = LoggingProxy({ + next: nonCallable, + }, log); + + let {proxy: setLike, obj: setLikeObj} = LoggingProxy({ + size: { + valueOf() { + log.push("valueOf()"); + return sizeValue; + } + }, + has() { + throw new Error("Unexpected call to |has| method"); + }, + keys() { + log.push("keys()"); + return keysIter; + }, + }, log); + + log.length = 0; + assertThrowsInstanceOf(() => emptySet.isSupersetOf(setLike), TypeError); + + assert.compareArray(log, [ + "[[get]]", "size", + "valueOf()", + "[[get]]", "has", + "[[get]]", "keys", + "keys()", + "[[get]]", "next", + ]); + + // Change |keys| to return a non-object value. + setLikeObj.keys = () => 123; + + log.length = 0; + assertThrowsInstanceOf(() => emptySet.isSupersetOf(setLike), TypeError); + + assert.compareArray(log, [ + "[[get]]", "size", + "valueOf()", + "[[get]]", "has", + "[[get]]", "keys", + ]); + + // Change |keys| to a non-callable value. + setLikeObj.keys = nonCallable; + + log.length = 0; + assertThrowsInstanceOf(() => emptySet.isSupersetOf(setLike), TypeError); + + assert.compareArray(log, [ + "[[get]]", "size", + "valueOf()", + "[[get]]", "has", + "[[get]]", "keys", + ]); + + // Change |has| to a non-callable value. + setLikeObj.has = nonCallable; + + log.length = 0; + assertThrowsInstanceOf(() => emptySet.isSupersetOf(setLike), TypeError); + + assert.compareArray(log, [ + "[[get]]", "size", + "valueOf()", + "[[get]]", "has", + ]); + + // Change |size| to NaN. + sizeValue = NaN; + + log.length = 0; + assertThrowsInstanceOf(() => emptySet.isSupersetOf(setLike), TypeError); + + assert.compareArray(log, [ + "[[get]]", "size", + "valueOf()", + ]); + + // Change |size| to undefined. + sizeValue = undefined; + + log.length = 0; + assertThrowsInstanceOf(() => emptySet.isSupersetOf(setLike), TypeError); + + assert.compareArray(log, [ + "[[get]]", "size", + "valueOf()", + ]); +} + +// Doesn't accept Array as an input. +assertThrowsInstanceOf(() => emptySet.isSupersetOf([]), TypeError); + +// Works with Set subclasses. +{ + class MySet extends Set {} + + let myEmptySet = new MySet; + + assert.sameValue(emptySet.isSupersetOf(myEmptySet), true); + assert.sameValue(myEmptySet.isSupersetOf(myEmptySet), true); + assert.sameValue(myEmptySet.isSupersetOf(emptySet), true); +} + +// Doesn't access any properties on the this-value. +{ + let log = []; + + let {proxy: setProto} = LoggingProxy(Set.prototype, log); + + let set = new Set([]); + Object.setPrototypeOf(set, setProto); + + assert.sameValue(Set.prototype.isSupersetOf.call(set, emptySet), true); + + assert.compareArray(log, []); +} + +// Throws a TypeError when the this-value isn't a Set object. +for (let thisValue of [ + null, undefined, true, "", {}, new Map, new Proxy(new Set, {}), +]) { + assertThrowsInstanceOf(() => Set.prototype.isSupersetOf.call(thisValue, emptySet), TypeError); +} + +// Doesn't call |has| nor |keys| when this-value has fewer elements. +{ + let set = new Set([1, 2, 3]); + + for (let size of [100, Infinity]) { + let setLike = { + size, + has() { + throw new Error("Unexpected call to |has| method"); + }, + keys() { + throw new Error("Unexpected call to |keys| method"); + }, + }; + + assert.sameValue(set.isSupersetOf(setLike), false); + } +} + +// Test when this-value is modified during iteration. +{ + let set = new Set([]); + + let keys = [1, 2, 3]; + + let keysIter = { + next() { + if (keys.length) { + let value = keys.shift(); + return { + done: false, + get value() { + assert.sameValue(set.has(value), false); + set.add(value); + return value; + } + }; + } + return { + done: true, + get value() { + throw new Error("Unexpected call to |value| getter"); + } + }; + } + }; + + let setLike = { + size: 0, + has() { + throw new Error("Unexpected call to |has| method"); + }, + keys() { + return keysIter; + }, + }; + + assert.sameValue(set.isSupersetOf(setLike), true); + assertSetContainsExactOrderedItems(set, [1, 2, 3]); +} + +// IteratorClose is called for early returns. +{ + let log = []; + + let keysIter = { + next() { + log.push("next"); + return {done: false, value: 1}; + }, + return() { + log.push("return"); + return { + get value() { throw new Error("Unexpected call to |value| getter"); }, + get done() { throw new Error("Unexpected call to |done| getter"); }, + }; + } + }; + + let setLike = { + size: 0, + has() { + throw new Error("Unexpected call to |has| method"); + }, + keys() { + return keysIter; + }, + }; + + assert.sameValue(new Set([2, 3, 4]).isSupersetOf(setLike), false); + + assert.compareArray(log, ["next", "return"]); +} + +// IteratorClose isn't called for non-early returns. +{ + let setLike = new SetLike([1, 2, 3]); + + assert.sameValue(new Set([1, 2, 3]).isSupersetOf(setLike), true); +} + +// Tests which modify any built-ins should appear last, because modifications may disable +// optimised code paths. + +// Doesn't call the built-in |Set.prototype.{has, keys, size}| functions. +const SetPrototypeHas = Object.getOwnPropertyDescriptor(Set.prototype, "has"); +const SetPrototypeKeys = Object.getOwnPropertyDescriptor(Set.prototype, "keys"); +const SetPrototypeSize = Object.getOwnPropertyDescriptor(Set.prototype, "size"); + +delete Set.prototype.has; +delete Set.prototype.keys; +delete Set.prototype.size; + +try { + let set = new Set([1, 2, 3]); + let other = new SetLike([1, 2, 3]); + assert.sameValue(set.isSupersetOf(other), true); +} finally { + Object.defineProperty(Set.prototype, "has", SetPrototypeHas); + Object.defineProperty(Set.prototype, "keys", SetPrototypeKeys); + Object.defineProperty(Set.prototype, "size", SetPrototypeSize); +} + diff --git a/test/staging/sm/Set/symmetric-difference.js b/test/staging/sm/Set/symmetric-difference.js new file mode 100644 index 0000000000..6758824276 --- /dev/null +++ b/test/staging/sm/Set/symmetric-difference.js @@ -0,0 +1,311 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [compareArray.js, deepEqual.js, sm/non262-Set-shell.js, sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ + +assert.sameValue(typeof Set.prototype.symmetricDifference, "function"); +assert.deepEqual(Object.getOwnPropertyDescriptor(Set.prototype.symmetricDifference, "length"), { + value: 1, writable: false, enumerable: false, configurable: true, +}); +assert.deepEqual(Object.getOwnPropertyDescriptor(Set.prototype.symmetricDifference, "name"), { + value: "symmetricDifference", writable: false, enumerable: false, configurable: true, +}); + +const emptySet = new Set(); +const emptySetLike = new SetLike(); +const emptyMap = new Map(); + +function asMap(values) { + return new Map(values.map(v => [v, v])); +} + +// Symmetric difference of two empty sets is an empty set. +assertSetContainsExactOrderedItems(emptySet.symmetricDifference(emptySet), []); +assertSetContainsExactOrderedItems(emptySet.symmetricDifference(emptySetLike), []); +assertSetContainsExactOrderedItems(emptySet.symmetricDifference(emptyMap), []); + +// Test native Set, Set-like, and Map objects. +for (let values of [ + [], [1], [1, 2], [1, true, null, {}], +]) { + // Symmetric difference with an empty set. + assertSetContainsExactOrderedItems(new Set(values).symmetricDifference(emptySet), values); + assertSetContainsExactOrderedItems(new Set(values).symmetricDifference(emptySetLike), values); + assertSetContainsExactOrderedItems(new Set(values).symmetricDifference(emptyMap), values); + assertSetContainsExactOrderedItems(emptySet.symmetricDifference(new Set(values)), values); + assertSetContainsExactOrderedItems(emptySet.symmetricDifference(new SetLike(values)), values); + assertSetContainsExactOrderedItems(emptySet.symmetricDifference(asMap(values)), values); + + // Two sets with the exact same values. + assertSetContainsExactOrderedItems(new Set(values).symmetricDifference(new Set(values)), []); + assertSetContainsExactOrderedItems(new Set(values).symmetricDifference(new SetLike(values)), []); + assertSetContainsExactOrderedItems(new Set(values).symmetricDifference(asMap(values)), []); + + // Symmetric difference of the same set object. + let set = new Set(values); + assertSetContainsExactOrderedItems(set.symmetricDifference(set), []); +} + +// Check property accesses are in the correct order. +{ + let log = []; + + let sizeValue = 0; + + let {proxy: keysIter} = LoggingProxy({ + next() { + log.push("next()"); + return {done: true}; + } + }, log); + + let {proxy: setLike} = LoggingProxy({ + size: { + valueOf() { + log.push("valueOf()"); + return sizeValue; + } + }, + has() { + throw new Error("Unexpected call to |has| method"); + }, + keys() { + log.push("keys()"); + return keysIter; + }, + }, log); + + assertSetContainsExactOrderedItems(emptySet.symmetricDifference(setLike), []); + + assert.compareArray(log, [ + "[[get]]", "size", + "valueOf()", + "[[get]]", "has", + "[[get]]", "keys", + "keys()", + "[[get]]", "next", + "next()", + ]); +} + +// Check input validation. +{ + let log = []; + + const nonCallable = {}; + let sizeValue = 0; + + let {proxy: keysIter} = LoggingProxy({ + next: nonCallable, + }, log); + + let {proxy: setLike, obj: setLikeObj} = LoggingProxy({ + size: { + valueOf() { + log.push("valueOf()"); + return sizeValue; + } + }, + has() { + throw new Error("Unexpected call to |has| method"); + }, + keys() { + log.push("keys()"); + return keysIter; + }, + }, log); + + log.length = 0; + assertThrowsInstanceOf(() => emptySet.symmetricDifference(setLike), TypeError); + + assert.compareArray(log, [ + "[[get]]", "size", + "valueOf()", + "[[get]]", "has", + "[[get]]", "keys", + "keys()", + "[[get]]", "next", + ]); + + // Change |keys| to return a non-object value. + setLikeObj.keys = () => 123; + + log.length = 0; + assertThrowsInstanceOf(() => emptySet.symmetricDifference(setLike), TypeError); + + assert.compareArray(log, [ + "[[get]]", "size", + "valueOf()", + "[[get]]", "has", + "[[get]]", "keys", + ]); + + // Change |keys| to a non-callable value. + setLikeObj.keys = nonCallable; + + log.length = 0; + assertThrowsInstanceOf(() => emptySet.symmetricDifference(setLike), TypeError); + + assert.compareArray(log, [ + "[[get]]", "size", + "valueOf()", + "[[get]]", "has", + "[[get]]", "keys", + ]); + + // Change |has| to a non-callable value. + setLikeObj.has = nonCallable; + + log.length = 0; + assertThrowsInstanceOf(() => emptySet.symmetricDifference(setLike), TypeError); + + assert.compareArray(log, [ + "[[get]]", "size", + "valueOf()", + "[[get]]", "has", + ]); + + // Change |size| to NaN. + sizeValue = NaN; + + log.length = 0; + assertThrowsInstanceOf(() => emptySet.symmetricDifference(setLike), TypeError); + + assert.compareArray(log, [ + "[[get]]", "size", + "valueOf()", + ]); + + // Change |size| to undefined. + sizeValue = undefined; + + log.length = 0; + assertThrowsInstanceOf(() => emptySet.symmetricDifference(setLike), TypeError); + + assert.compareArray(log, [ + "[[get]]", "size", + "valueOf()", + ]); +} + +// Doesn't accept Array as an input. +assertThrowsInstanceOf(() => emptySet.symmetricDifference([]), TypeError); + +// Works with Set subclasses. +{ + class MySet extends Set {} + + let myEmptySet = new MySet; + + assertSetContainsExactOrderedItems(emptySet.symmetricDifference(myEmptySet), []); + assertSetContainsExactOrderedItems(myEmptySet.symmetricDifference(myEmptySet), []); + assertSetContainsExactOrderedItems(myEmptySet.symmetricDifference(emptySet), []); +} + +// Doesn't access any properties on the this-value. +{ + let log = []; + + let {proxy: setProto} = LoggingProxy(Set.prototype, log); + + let set = new Set([1, 2, 3]); + Object.setPrototypeOf(set, setProto); + + assertSetContainsExactOrderedItems(Set.prototype.symmetricDifference.call(set, emptySet), [1, 2, 3]); + + assert.compareArray(log, []); +} + +// Throws a TypeError when the this-value isn't a Set object. +for (let thisValue of [ + null, undefined, true, "", {}, new Map, new Proxy(new Set, {}), +]) { + assertThrowsInstanceOf(() => Set.prototype.symmetricDifference.call(thisValue, emptySet), TypeError); +} + +// Doesn't return the original Set object. +{ + let set = new Set([1]); + assert.sameValue(set.symmetricDifference(emptySet) !== set, true); + assert.sameValue(set.symmetricDifference(new Set([2])) !== set, true); +} + +// Test insertion order +{ + let set = new Set([1, 2]); + + // Case 1: Input is empty. + assertSetContainsExactOrderedItems(set.symmetricDifference(new Set([])), [1, 2]); + + // Case 2: Input has fewer elements. + assertSetContainsExactOrderedItems(set.symmetricDifference(new Set([3])), [1, 2, 3]); + assertSetContainsExactOrderedItems(set.symmetricDifference(new Set([2])), [1]); + + // Case 3: Input has same number of elements. + assertSetContainsExactOrderedItems(set.symmetricDifference(new Set([3, 4])), [1, 2, 3, 4]); + assertSetContainsExactOrderedItems(set.symmetricDifference(new Set([2, 3])), [1, 3]); + + // Case 4: Input has more elements. + assertSetContainsExactOrderedItems(set.symmetricDifference(new Set([3, 4, 5])), [1, 2, 3, 4, 5]); + assertSetContainsExactOrderedItems(set.symmetricDifference(new Set([2, 4, 5])), [1, 4, 5]); +} + +// Test that the input set is copied after accessing the |next| property of the keys iterator. +{ + let set = new Set([1, 2, 3]); + + let setLike = { + size: 0, + has() { + throw new Error("Unexpected call to |has| method"); + }, + keys() { + return { + get next() { + // Clear the set when getting the |next| method. + set.clear(); + + // And then add a single new key. + set.add(4); + + return function() { + return {done: true}; + }; + } + }; + }, + }; + + // The result should consist of the single, newly added key. + assertSetContainsExactOrderedItems(set.symmetricDifference(setLike), [4]); +} + +// Tests which modify any built-ins should appear last, because modifications may disable +// optimised code paths. + +// Doesn't call the built-in |Set.prototype.{has, keys, size}| functions. +const SetPrototypeHas = Object.getOwnPropertyDescriptor(Set.prototype, "has"); +const SetPrototypeKeys = Object.getOwnPropertyDescriptor(Set.prototype, "keys"); +const SetPrototypeSize = Object.getOwnPropertyDescriptor(Set.prototype, "size"); + +delete Set.prototype.has; +delete Set.prototype.keys; +delete Set.prototype.size; + +try { + let set = new Set([1, 2, 3]); + let other = new SetLike([1, 2, 3]); + assertSetContainsExactOrderedItems(set.symmetricDifference(other), []); +} finally { + Object.defineProperty(Set.prototype, "has", SetPrototypeHas); + Object.defineProperty(Set.prototype, "keys", SetPrototypeKeys); + Object.defineProperty(Set.prototype, "size", SetPrototypeSize); +} + diff --git a/test/staging/sm/Set/union.js b/test/staging/sm/Set/union.js new file mode 100644 index 0000000000..9f5fcc9a51 --- /dev/null +++ b/test/staging/sm/Set/union.js @@ -0,0 +1,308 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [compareArray.js, deepEqual.js, sm/non262-Set-shell.js, sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ + +assert.sameValue(typeof Set.prototype.union, "function"); +assert.deepEqual(Object.getOwnPropertyDescriptor(Set.prototype.union, "length"), { + value: 1, writable: false, enumerable: false, configurable: true, +}); +assert.deepEqual(Object.getOwnPropertyDescriptor(Set.prototype.union, "name"), { + value: "union", writable: false, enumerable: false, configurable: true, +}); + +const emptySet = new Set(); +const emptySetLike = new SetLike(); +const emptyMap = new Map(); + +function asMap(values) { + return new Map(values.map(v => [v, v])); +} + +// Union of two empty sets is an empty set. +assertSetContainsExactOrderedItems(emptySet.union(emptySet), []); +assertSetContainsExactOrderedItems(emptySet.union(emptySetLike), []); +assertSetContainsExactOrderedItems(emptySet.union(emptyMap), []); + +// Test native Set, Set-like, and Map objects. +for (let values of [ + [], [1], [1, 2], [1, true, null, {}], +]) { + // Union with an empty set. + assertSetContainsExactOrderedItems(new Set(values).union(emptySet), values); + assertSetContainsExactOrderedItems(new Set(values).union(emptySetLike), values); + assertSetContainsExactOrderedItems(new Set(values).union(emptyMap), values); + assertSetContainsExactOrderedItems(emptySet.union(new Set(values)), values); + assertSetContainsExactOrderedItems(emptySet.union(new SetLike(values)), values); + assertSetContainsExactOrderedItems(emptySet.union(asMap(values)), values); + + // Two sets with the exact same values. + assertSetContainsExactOrderedItems(new Set(values).union(new Set(values)), values); + assertSetContainsExactOrderedItems(new Set(values).union(new SetLike(values)), values); + assertSetContainsExactOrderedItems(new Set(values).union(asMap(values)), values); + + // Union of the same set object. + let set = new Set(values); + assertSetContainsExactOrderedItems(set.union(set), values); +} + +// Check property accesses are in the correct order. +{ + let log = []; + + let sizeValue = 0; + + let {proxy: keysIter} = LoggingProxy({ + next() { + log.push("next()"); + return {done: true}; + } + }, log); + + let {proxy: setLike} = LoggingProxy({ + size: { + valueOf() { + log.push("valueOf()"); + return sizeValue; + } + }, + has() { + throw new Error("Unexpected call to |has| method"); + }, + keys() { + log.push("keys()"); + return keysIter; + }, + }, log); + + assertSetContainsExactOrderedItems(emptySet.union(setLike), []); + + assert.compareArray(log, [ + "[[get]]", "size", + "valueOf()", + "[[get]]", "has", + "[[get]]", "keys", + "keys()", + "[[get]]", "next", + "next()", + ]); +} + +// Check input validation. +{ + let log = []; + + const nonCallable = {}; + let sizeValue = 0; + + let {proxy: keysIter} = LoggingProxy({ + next: nonCallable, + }, log); + + let {proxy: setLike, obj: setLikeObj} = LoggingProxy({ + size: { + valueOf() { + log.push("valueOf()"); + return sizeValue; + } + }, + has() { + throw new Error("Unexpected call to |has| method"); + }, + keys() { + log.push("keys()"); + return keysIter; + }, + }, log); + + log.length = 0; + assertThrowsInstanceOf(() => emptySet.union(setLike), TypeError); + + assert.compareArray(log, [ + "[[get]]", "size", + "valueOf()", + "[[get]]", "has", + "[[get]]", "keys", + "keys()", + "[[get]]", "next", + ]); + + // Change |keys| to return a non-object value. + setLikeObj.keys = () => 123; + + log.length = 0; + assertThrowsInstanceOf(() => emptySet.union(setLike), TypeError); + + assert.compareArray(log, [ + "[[get]]", "size", + "valueOf()", + "[[get]]", "has", + "[[get]]", "keys", + ]); + + // Change |keys| to a non-callable value. + setLikeObj.keys = nonCallable; + + log.length = 0; + assertThrowsInstanceOf(() => emptySet.union(setLike), TypeError); + + assert.compareArray(log, [ + "[[get]]", "size", + "valueOf()", + "[[get]]", "has", + "[[get]]", "keys", + ]); + + // Change |has| to a non-callable value. + setLikeObj.has = nonCallable; + + log.length = 0; + assertThrowsInstanceOf(() => emptySet.union(setLike), TypeError); + + assert.compareArray(log, [ + "[[get]]", "size", + "valueOf()", + "[[get]]", "has", + ]); + + // Change |size| to NaN. + sizeValue = NaN; + + log.length = 0; + assertThrowsInstanceOf(() => emptySet.union(setLike), TypeError); + + assert.compareArray(log, [ + "[[get]]", "size", + "valueOf()", + ]); + + // Change |size| to undefined. + sizeValue = undefined; + + log.length = 0; + assertThrowsInstanceOf(() => emptySet.union(setLike), TypeError); + + assert.compareArray(log, [ + "[[get]]", "size", + "valueOf()", + ]); +} + +// Doesn't accept Array as an input. +assertThrowsInstanceOf(() => emptySet.union([]), TypeError); + +// Works with Set subclasses. +{ + class MySet extends Set {} + + let myEmptySet = new MySet; + + assertSetContainsExactOrderedItems(emptySet.union(myEmptySet), []); + assertSetContainsExactOrderedItems(myEmptySet.union(myEmptySet), []); + assertSetContainsExactOrderedItems(myEmptySet.union(emptySet), []); +} + +// Doesn't access any properties on the this-value. +{ + let log = []; + + let {proxy: setProto} = LoggingProxy(Set.prototype, log); + + let set = new Set([1, 2, 3]); + Object.setPrototypeOf(set, setProto); + + assertSetContainsExactOrderedItems(Set.prototype.union.call(set, emptySet), [1, 2, 3]); + + assert.compareArray(log, []); +} + +// Throws a TypeError when the this-value isn't a Set object. +for (let thisValue of [ + null, undefined, true, "", {}, new Map, new Proxy(new Set, {}), +]) { + assertThrowsInstanceOf(() => Set.prototype.union.call(thisValue, emptySet), TypeError); +} + +// Doesn't return the original Set object. +{ + let set = new Set([1]); + assert.sameValue(set.union(emptySet) !== set, true); + assert.sameValue(set.union(new Set([2])) !== set, true); +} + +// Test insertion order +{ + let set = new Set([1, 2]); + + // Case 1: Input is empty. + assertSetContainsExactOrderedItems(set.union(new Set([])), [1, 2]); + + // Case 2: Input has fewer elements. + assertSetContainsExactOrderedItems(set.union(new Set([3])), [1, 2, 3]); + + // Case 3: Input has same number of elements. + assertSetContainsExactOrderedItems(set.union(new Set([3, 4])), [1, 2, 3, 4]); + + // Case 4: Input has more elements. + assertSetContainsExactOrderedItems(set.union(new Set([3, 4, 5])), [1, 2, 3, 4, 5]); +} + +// Test that the input set is copied after accessing the |next| property of the keys iterator. +{ + let set = new Set([1, 2, 3]); + + let setLike = { + size: 0, + has() { + throw new Error("Unexpected call to |has| method"); + }, + keys() { + return { + get next() { + // Clear the set when getting the |next| method. + set.clear(); + + // And then add a single new key. + set.add(4); + + return function() { + return {done: true}; + }; + } + }; + }, + }; + + // The result should consist of the single, newly added key. + assertSetContainsExactOrderedItems(set.union(setLike), [4]); +} + +// Tests which modify any built-ins should appear last, because modifications may disable +// optimised code paths. + +// Doesn't call the built-in |Set.prototype.{has, keys, size}| functions. +const SetPrototypeHas = Object.getOwnPropertyDescriptor(Set.prototype, "has"); +const SetPrototypeKeys = Object.getOwnPropertyDescriptor(Set.prototype, "keys"); +const SetPrototypeSize = Object.getOwnPropertyDescriptor(Set.prototype, "size"); + +delete Set.prototype.has; +delete Set.prototype.keys; +delete Set.prototype.size; + +try { + let set = new Set([1, 2, 3]); + let other = new SetLike([1, 2, 3]); + assertSetContainsExactOrderedItems(set.union(other), [1, 2, 3]); +} finally { + Object.defineProperty(Set.prototype, "has", SetPrototypeHas); + Object.defineProperty(Set.prototype, "keys", SetPrototypeKeys); + Object.defineProperty(Set.prototype, "size", SetPrototypeSize); +} + diff --git a/test/staging/sm/String/15.5.4.11-01.js b/test/staging/sm/String/15.5.4.11-01.js new file mode 100644 index 0000000000..a657d3cfed --- /dev/null +++ b/test/staging/sm/String/15.5.4.11-01.js @@ -0,0 +1,71 @@ +/* + * Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/licenses/publicdomain/ + */ + +/*--- +includes: [sm/non262-String-shell.js, sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +var BUGNUMBER = 587366; +var summary = "String.prototype.replace with non-regexp searchValue"; + +print(BUGNUMBER + ": " + summary); + +/************** + * BEGIN TEST * + **************/ + +/* + * Check that regexp statics are preserved across the whole test. + * If the engine is trying to cheat by turning stuff into regexps, + * we should catch it! + */ +/(a|(b)|c)+/.exec('abcabc'); +var before = { + "source" : RegExp.source, + "$`": RegExp.leftContext, + "$'": RegExp.rightContext, + "$&": RegExp.lastMatch, + "$1": RegExp.$1, + "$2": RegExp.$2 +}; + +var text = 'I once was lost but now am found.'; +var searchValue = 'found'; +var replaceValue; + +/* Lambda substitution. */ +replaceValue = function(matchStr, matchStart, textStr) { + assert.sameValue(matchStr, searchValue); + assert.sameValue(matchStart, 27); + assert.sameValue(textStr, text); + return 'not watching that show anymore'; +} +var result = text.replace(searchValue, replaceValue); +assert.sameValue(result, 'I once was lost but now am not watching that show anymore.'); + +/* Dollar substitution. */ +replaceValue = "...wait, where was I again? And where is all my $$$$$$? Oh right, $`$&$'" + + " But with no $$$$$$"; /* Note the dot is not replaced and trails the end. */ +result = text.replace(searchValue, replaceValue); +assert.sameValue(result, 'I once was lost but now am ...wait, where was I again?' + + ' And where is all my $$$? Oh right, I once was lost but now am found.' + + ' But with no $$$.'); + +/* Missing capture group dollar substitution. */ +replaceValue = "$1$&$2$'$3"; +result = text.replace(searchValue, replaceValue); +assert.sameValue(result, 'I once was lost but now am $1found$2.$3.'); + +/* Check RegExp statics haven't been mutated. */ +for (var ident in before) + assert.sameValue(RegExp[ident], before[ident]); + +/******************************************************************************/ + +print("All tests passed!"); diff --git a/test/staging/sm/String/15.5.4.2.js b/test/staging/sm/String/15.5.4.2.js new file mode 100644 index 0000000000..47485b303f --- /dev/null +++ b/test/staging/sm/String/15.5.4.2.js @@ -0,0 +1,21 @@ +/* + * Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/licenses/publicdomain/ + */ + +/*--- +includes: [sm/non262-String-shell.js, sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +assert.sameValue(raisesException(TypeError)('String.prototype.toString.call(42)'), true); +assert.sameValue(raisesException(TypeError)('String.prototype.toString.call(true)'), true); +assert.sameValue(raisesException(TypeError)('String.prototype.toString.call({})'), true); +assert.sameValue(raisesException(TypeError)('String.prototype.toString.call(null)'), true); +assert.sameValue(raisesException(TypeError)('String.prototype.toString.call([])'), true); +assert.sameValue(raisesException(TypeError)('String.prototype.toString.call(undefined)'), true); +assert.sameValue(completesNormally('String.prototype.toString.call("")'), true); + diff --git a/test/staging/sm/String/15.5.4.7.js b/test/staging/sm/String/15.5.4.7.js new file mode 100644 index 0000000000..e72a9abbe7 --- /dev/null +++ b/test/staging/sm/String/15.5.4.7.js @@ -0,0 +1,26 @@ +/* + * Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/licenses/publicdomain/ + */ + +/*--- +includes: [sm/non262-String-shell.js, sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +var BUGNUMBER = 612838; +var summary = "String.prototype.indexOf with empty searchString"; + +print(BUGNUMBER + ": " + summary); + +assert.sameValue("123".indexOf("", -1), 0); +assert.sameValue("123".indexOf("", 0), 0); +assert.sameValue("123".indexOf("", 1), 1); +assert.sameValue("123".indexOf("", 3), 3); +assert.sameValue("123".indexOf("", 4), 3); +assert.sameValue("123".indexOf("", 12345), 3); + +print("All tests passed!"); diff --git a/test/staging/sm/String/AdvanceStringIndex.js b/test/staging/sm/String/AdvanceStringIndex.js new file mode 100644 index 0000000000..40b5b8fd60 --- /dev/null +++ b/test/staging/sm/String/AdvanceStringIndex.js @@ -0,0 +1,52 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [compareArray.js, sm/non262-String-shell.js, sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +var BUGNUMBER = 1135377; +var summary = "Implement RegExp unicode flag -- AdvanceStringIndex in global match and replace."; + +print(BUGNUMBER + ": " + summary); + +// ==== String.prototype.match ==== + +assert.compareArray("\uD83D\uDC38\uD83D\uDC39X\uD83D\uDC3A".match(/\uD83D|X|/gu), + ["", "", "X", "", ""]); +assert.compareArray("\uD83D\uDC38\uD83D\uDC39X\uD83D\uDC3A".match(/\uDC38|X|/gu), + ["", "", "X", "", ""]); +assert.compareArray("\uD83D\uDC38\uD83D\uDC39X\uD83D\uDC3A".match(/\uD83D\uDC38|X|/gu), + ["\uD83D\uDC38", "", "X", "", ""]); + +// ==== String.prototype.replace ==== + +// empty string replacement (optimized) +assert.compareArray("\uD83D\uDC38\uD83D\uDC39X\uD83D\uDC3A".replace(/\uD83D|X|/gu, ""), + "\uD83D\uDC38\uD83D\uDC39\uD83D\uDC3A"); +assert.compareArray("\uD83D\uDC38\uD83D\uDC39X\uD83D\uDC3A".replace(/\uDC38|X|/gu, ""), + "\uD83D\uDC38\uD83D\uDC39\uD83D\uDC3A"); +assert.compareArray("\uD83D\uDC38\uD83D\uDC39X\uD83D\uDC3A".replace(/\uD83D\uDC38|X|/gu, ""), + "\uD83D\uDC39\uD83D\uDC3A"); + +// non-empty string replacement +assert.compareArray("\uD83D\uDC38\uD83D\uDC39X\uD83D\uDC3A".replace(/\uD83D|X|/gu, "x"), + "x\uD83D\uDC38x\uD83D\uDC39xx\uD83D\uDC3Ax"); +assert.compareArray("\uD83D\uDC38\uD83D\uDC39X\uD83D\uDC3A".replace(/\uDC38|X|/gu, "x"), + "x\uD83D\uDC38x\uD83D\uDC39xx\uD83D\uDC3Ax"); +assert.compareArray("\uD83D\uDC38\uD83D\uDC39X\uD83D\uDC3A".replace(/\uD83D\uDC38|X|/gu, "x"), + "xx\uD83D\uDC39xx\uD83D\uDC3Ax"); + +// ==== String.prototype.split ==== + +assert.compareArray("\uD83D\uDC38\uD83D\uDC39X\uD83D\uDC3A".split(/\uD83D|X|/u), + ["\uD83D\uDC38", "\uD83D\uDC39", "\uD83D\uDC3A"]); +assert.compareArray("\uD83D\uDC38\uD83D\uDC39X\uD83D\uDC3A".split(/\uDC38|X|/u), + ["\uD83D\uDC38", "\uD83D\uDC39", "\uD83D\uDC3A"]); +assert.compareArray("\uD83D\uDC38\uD83D\uDC39X\uD83D\uDC3A".split(/\uD83D\uDC38|X|/u), + ["", "\uD83D\uDC39", "\uD83D\uDC3A"]); + diff --git a/test/staging/sm/String/IsRegExp.js b/test/staging/sm/String/IsRegExp.js new file mode 100644 index 0000000000..41b1f03135 --- /dev/null +++ b/test/staging/sm/String/IsRegExp.js @@ -0,0 +1,33 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-String-shell.js, sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +var BUGNUMBER = 1054755; +var summary = 'String.prototype.{startsWith,endsWith,includes} should call IsRegExp.'; + +print(BUGNUMBER + ": " + summary); + +for (var method of ["startsWith", "endsWith", "includes"]) { + for (var re of [/foo/, new RegExp()]) { + assertThrowsInstanceOf(() => "foo"[method](re), TypeError); + + re[Symbol.match] = false; + "foo"[method](re); + } + + for (var v1 of [true, 1, "bar", [], {}, Symbol.iterator]) { + assertThrowsInstanceOf(() => "foo"[method]({ [Symbol.match]: v1 }), TypeError); + } + + for (var v2 of [false, 0, undefined, ""]) { + "foo"[method]({ [Symbol.match]: v2 }); + } +} + diff --git a/test/staging/sm/String/at.js b/test/staging/sm/String/at.js new file mode 100644 index 0000000000..dbea79a66a --- /dev/null +++ b/test/staging/sm/String/at.js @@ -0,0 +1,47 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-String-shell.js, sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +function basic() { + assert.sameValue("a".at(0), "a"); + assert.sameValue("a".at(-1), "a"); + + assert.sameValue("".at(0), undefined); + assert.sameValue("".at(-1), undefined); + assert.sameValue("".at(1), undefined); + + assert.sameValue("ab".at(0), "a"); + assert.sameValue("ab".at(1), "b"); + assert.sameValue("ab".at(-2), "a"); + assert.sameValue("ab".at(-1), "b"); + + assert.sameValue("ab".at(2), undefined); + assert.sameValue("ab".at(-3), undefined); + assert.sameValue("ab".at(-4), undefined); + assert.sameValue("ab".at(Infinity), undefined); + assert.sameValue("ab".at(-Infinity), undefined); + assert.sameValue("ab".at(NaN), "a"); // ToInteger(NaN) = 0 + + assert.sameValue("\u{1f921}".at(0), "\u{d83e}"); + assert.sameValue("\u{1f921}".at(1), "\u{dd21}"); +} + +function other() { + var n = 146; + assert.sameValue(String.prototype.at.call(n, 0), "1"); + var obj = {}; + assert.sameValue(String.prototype.at.call(obj, -1), "]"); + var b = true; + assert.sameValue(String.prototype.at.call(b, 0), "t"); +} + +basic(); +other(); + diff --git a/test/staging/sm/String/codePointAt.js b/test/staging/sm/String/codePointAt.js new file mode 100644 index 0000000000..301727cc8d --- /dev/null +++ b/test/staging/sm/String/codePointAt.js @@ -0,0 +1,94 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-String-shell.js, sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +var BUGNUMBER = 918879; +var summary = 'String.prototype.codePointAt'; + +print(BUGNUMBER + ": " + summary); + +// Tests taken from: +// https://github.com/mathiasbynens/String.prototype.codePointAt/blob/master/tests/tests.js +assert.sameValue(String.prototype.codePointAt.length, 1); +assert.sameValue(String.prototype.propertyIsEnumerable('codePointAt'), false); + +// String that starts with a BMP symbol +assert.sameValue('abc\uD834\uDF06def'.codePointAt(''), 0x61); +assert.sameValue('abc\uD834\uDF06def'.codePointAt('_'), 0x61); +assert.sameValue('abc\uD834\uDF06def'.codePointAt(), 0x61); +assert.sameValue('abc\uD834\uDF06def'.codePointAt(-Infinity), undefined); +assert.sameValue('abc\uD834\uDF06def'.codePointAt(-1), undefined); +assert.sameValue('abc\uD834\uDF06def'.codePointAt(-0), 0x61); +assert.sameValue('abc\uD834\uDF06def'.codePointAt(0), 0x61); +assert.sameValue('abc\uD834\uDF06def'.codePointAt(3), 0x1D306); +assert.sameValue('abc\uD834\uDF06def'.codePointAt(4), 0xDF06); +assert.sameValue('abc\uD834\uDF06def'.codePointAt(5), 0x64); +assert.sameValue('abc\uD834\uDF06def'.codePointAt(42), undefined); +assert.sameValue('abc\uD834\uDF06def'.codePointAt(Infinity), undefined); +assert.sameValue('abc\uD834\uDF06def'.codePointAt(Infinity), undefined); +assert.sameValue('abc\uD834\uDF06def'.codePointAt(NaN), 0x61); +assert.sameValue('abc\uD834\uDF06def'.codePointAt(false), 0x61); +assert.sameValue('abc\uD834\uDF06def'.codePointAt(null), 0x61); +assert.sameValue('abc\uD834\uDF06def'.codePointAt(undefined), 0x61); + +// String that starts with an astral symbol +assert.sameValue('\uD834\uDF06def'.codePointAt(''), 0x1D306); +assert.sameValue('\uD834\uDF06def'.codePointAt('1'), 0xDF06); +assert.sameValue('\uD834\uDF06def'.codePointAt('_'), 0x1D306); +assert.sameValue('\uD834\uDF06def'.codePointAt(), 0x1D306); +assert.sameValue('\uD834\uDF06def'.codePointAt(-1), undefined); +assert.sameValue('\uD834\uDF06def'.codePointAt(-0), 0x1D306); +assert.sameValue('\uD834\uDF06def'.codePointAt(0), 0x1D306); +assert.sameValue('\uD834\uDF06def'.codePointAt(1), 0xDF06); +assert.sameValue('\uD834\uDF06def'.codePointAt(42), undefined); +assert.sameValue('\uD834\uDF06def'.codePointAt(false), 0x1D306); +assert.sameValue('\uD834\uDF06def'.codePointAt(null), 0x1D306); +assert.sameValue('\uD834\uDF06def'.codePointAt(undefined), 0x1D306); + +// Lone high surrogates +assert.sameValue('\uD834abc'.codePointAt(''), 0xD834); +assert.sameValue('\uD834abc'.codePointAt('_'), 0xD834); +assert.sameValue('\uD834abc'.codePointAt(), 0xD834); +assert.sameValue('\uD834abc'.codePointAt(-1), undefined); +assert.sameValue('\uD834abc'.codePointAt(-0), 0xD834); +assert.sameValue('\uD834abc'.codePointAt(0), 0xD834); +assert.sameValue('\uD834abc'.codePointAt(false), 0xD834); +assert.sameValue('\uD834abc'.codePointAt(NaN), 0xD834); +assert.sameValue('\uD834abc'.codePointAt(null), 0xD834); +assert.sameValue('\uD834abc'.codePointAt(undefined), 0xD834); + +// Lone low surrogates +assert.sameValue('\uDF06abc'.codePointAt(''), 0xDF06); +assert.sameValue('\uDF06abc'.codePointAt('_'), 0xDF06); +assert.sameValue('\uDF06abc'.codePointAt(), 0xDF06); +assert.sameValue('\uDF06abc'.codePointAt(-1), undefined); +assert.sameValue('\uDF06abc'.codePointAt(-0), 0xDF06); +assert.sameValue('\uDF06abc'.codePointAt(0), 0xDF06); +assert.sameValue('\uDF06abc'.codePointAt(false), 0xDF06); +assert.sameValue('\uDF06abc'.codePointAt(NaN), 0xDF06); +assert.sameValue('\uDF06abc'.codePointAt(null), 0xDF06); +assert.sameValue('\uDF06abc'.codePointAt(undefined), 0xDF06); + +(function() { String.prototype.codePointAt.call(undefined); }, TypeError); +assertThrowsInstanceOf(function() { String.prototype.codePointAt.call(undefined, 4); }, TypeError); +assertThrowsInstanceOf(function() { String.prototype.codePointAt.call(null); }, TypeError); +assertThrowsInstanceOf(function() { String.prototype.codePointAt.call(null, 4); }, TypeError); +assert.sameValue(String.prototype.codePointAt.call(42, 0), 0x34); +assert.sameValue(String.prototype.codePointAt.call(42, 1), 0x32); +assert.sameValue(String.prototype.codePointAt.call({ 'toString': function() { return 'abc'; } }, 2), 0x63); + +assertThrowsInstanceOf(function() { String.prototype.codePointAt.apply(undefined); }, TypeError); +assertThrowsInstanceOf(function() { String.prototype.codePointAt.apply(undefined, [4]); }, TypeError); +assertThrowsInstanceOf(function() { String.prototype.codePointAt.apply(null); }, TypeError); +assertThrowsInstanceOf(function() { String.prototype.codePointAt.apply(null, [4]); }, TypeError); +assert.sameValue(String.prototype.codePointAt.apply(42, [0]), 0x34); +assert.sameValue(String.prototype.codePointAt.apply(42, [1]), 0x32); +assert.sameValue(String.prototype.codePointAt.apply({ 'toString': function() { return 'abc'; } }, [2]), 0x63); + diff --git a/test/staging/sm/String/defaultvalue.js b/test/staging/sm/String/defaultvalue.js new file mode 100644 index 0000000000..6f62c65ff5 --- /dev/null +++ b/test/staging/sm/String/defaultvalue.js @@ -0,0 +1,174 @@ +/* + * Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/licenses/publicdomain/ + */ + +/*--- +includes: [sm/non262-String-shell.js, sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +var BUGNUMBER = 645464; +var summary = + "[[DefaultValue]] behavior wrong for String with overridden valueOf/toString"; + +print(BUGNUMBER + ": " + summary); + +/************** + * BEGIN TEST * + **************/ + +// equality + +var s = new String("c"); +assert.sameValue(s == "c", true); + +var s2 = new String(); +s2.valueOf = function() { return "foo"; }; +assert.sameValue(s2 == "foo", true); + +var s3 = new String(); +s3.toString = function() { return "bar"; }; +assert.sameValue(s3 == "", true); + +function testEquality() +{ + var s = new String("c"); + assert.sameValue(s == "c", true); + + var s2 = new String(); + s2.valueOf = function() { return "foo"; }; + assert.sameValue(s2 == "foo", true); + + var s3 = new String(); + s3.toString = function() { return "bar"; }; + assert.sameValue(s3 == "", true); +} +testEquality(); + + +// addition of String to string + +var s = new String(); +assert.sameValue(s + "", ""); + +var s2 = new String(); +s2.toString = function() { return "bar"; }; +assert.sameValue(s2 + "", ""); + +var s3 = new String(); +s3.valueOf = function() { return "baz"; }; +assert.sameValue(s3 + "", "baz"); + +function testStringAddition() +{ + var s = new String(); + assert.sameValue(s + "", ""); + + var s2 = new String(); + s2.toString = function() { return "bar"; }; + assert.sameValue(s2 + "", ""); + + var s3 = new String(); + s3.valueOf = function() { return "baz"; }; + assert.sameValue(s3 + "", "baz"); +} +testStringAddition(); + + +// addition of String to String + +var s = new String(); +assert.sameValue(s + s, ""); + +var s2 = new String(); +s2.toString = function() { return "baz"; }; +assert.sameValue(s2 + s2, ""); + +var s3 = new String(); +s3.valueOf = function() { return "quux"; }; +assert.sameValue(s3 + s3, "quuxquux"); + +function testNonStringAddition() +{ + var s = new String(); + assert.sameValue(s + s, ""); + + var s2 = new String(); + s2.toString = function() { return "baz"; }; + assert.sameValue(s2 + s2, ""); + + var s3 = new String(); + s3.valueOf = function() { return "quux"; }; + assert.sameValue(s3 + s3, "quuxquux"); +} +testNonStringAddition(); + + +// String as bracketed property name + +var obj = { primitive: 17, valueOf: 42, toString: 8675309 }; + +var s = new String("primitive"); +assert.sameValue(obj[s], 17); + +var s2 = new String("primitive"); +s2.valueOf = function() { return "valueOf"; } +assert.sameValue(obj[s2], 17); + +var s3 = new String("primitive"); +s3.toString = function() { return "toString"; }; +assert.sameValue(obj[s3], 8675309); + +function testPropertyNameToString() +{ + var obj = { primitive: 17, valueOf: 42, toString: 8675309 }; + + var s = new String("primitive"); + assert.sameValue(obj[s], 17); + + var s2 = new String("primitive"); + s2.valueOf = function() { return "valueOf"; } + assert.sameValue(obj[s2], 17); + + var s3 = new String("primitive"); + s3.toString = function() { return "toString"; }; + assert.sameValue(obj[s3], 8675309); +} +testPropertyNameToString(); + + +// String as property name with |in| operator + +var s = new String(); +assert.sameValue(s in { "": 5 }, true); + +var s2 = new String(); +s.toString = function() { return "baz"; }; +assert.sameValue(s in { baz: 42 }, true); + +var s3 = new String(); +s3.valueOf = function() { return "quux"; }; +assert.sameValue(s3 in { "": 17 }, true); + +function testInOperatorName() +{ + var s = new String(); + assert.sameValue(s in { "": 5 }, true); + + var s2 = new String(); + s.toString = function() { return "baz"; }; + assert.sameValue(s in { baz: 42 }, true); + + var s3 = new String(); + s3.valueOf = function() { return "quux"; }; + assert.sameValue(s3 in { "": 17 }, true); +} +testInOperatorName(); + +/******************************************************************************/ + +print("All tests passed!"); diff --git a/test/staging/sm/String/fromCodePoint.js b/test/staging/sm/String/fromCodePoint.js new file mode 100644 index 0000000000..5f788aede2 --- /dev/null +++ b/test/staging/sm/String/fromCodePoint.js @@ -0,0 +1,70 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-String-shell.js, sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +var BUGNUMBER = 918879; +var summary = 'String.fromCodePoint'; + +print(BUGNUMBER + ": " + summary); + +// Tests taken from: +// https://github.com/mathiasbynens/String.fromCodePoint/blob/master/tests/tests.js + +assert.sameValue(String.fromCodePoint.length, 1); +assert.sameValue(String.fromCodePoint.name, 'fromCodePoint'); +assert.sameValue(String.propertyIsEnumerable('fromCodePoint'), false); + +assert.sameValue(String.fromCodePoint(''), '\0'); +assert.sameValue(String.fromCodePoint(), ''); +assert.sameValue(String.fromCodePoint(-0), '\0'); +assert.sameValue(String.fromCodePoint(0), '\0'); +assert.sameValue(String.fromCodePoint(0x1D306), '\uD834\uDF06'); +assert.sameValue(String.fromCodePoint(0x1D306, 0x61, 0x1D307), '\uD834\uDF06a\uD834\uDF07'); +assert.sameValue(String.fromCodePoint(0x61, 0x62, 0x1D307), 'ab\uD834\uDF07'); +assert.sameValue(String.fromCodePoint(false), '\0'); +assert.sameValue(String.fromCodePoint(null), '\0'); + +assertThrowsInstanceOf(function() { String.fromCodePoint('_'); }, RangeError); +assertThrowsInstanceOf(function() { String.fromCodePoint('+Infinity'); }, RangeError); +assertThrowsInstanceOf(function() { String.fromCodePoint('-Infinity'); }, RangeError); +assertThrowsInstanceOf(function() { String.fromCodePoint(-1); }, RangeError); +assertThrowsInstanceOf(function() { String.fromCodePoint(0x10FFFF + 1); }, RangeError); +assertThrowsInstanceOf(function() { String.fromCodePoint(3.14); }, RangeError); +assertThrowsInstanceOf(function() { String.fromCodePoint(3e-2); }, RangeError); +assertThrowsInstanceOf(function() { String.fromCodePoint(Infinity); }, RangeError); +assertThrowsInstanceOf(function() { String.fromCodePoint(NaN); }, RangeError); +assertThrowsInstanceOf(function() { String.fromCodePoint(undefined); }, RangeError); +assertThrowsInstanceOf(function() { String.fromCodePoint({}); }, RangeError); + +var counter = Math.pow(2, 15) * 3 / 2; +var result = []; +while (--counter >= 0) { + result.push(0); // one code unit per symbol +} +String.fromCodePoint.apply(null, result); // must not throw + +var counter = Math.pow(2, 15) * 3 / 2; +var result = []; +while (--counter >= 0) { + result.push(0xFFFF + 1); // two code units per symbol +} +String.fromCodePoint.apply(null, result); // must not throw + +// str_fromCodePoint_one_arg (single argument, creates an inline string) +assert.sameValue(String.fromCodePoint(0x31), '1'); +// str_fromCodePoint_few_args (few arguments, creates an inline string) +// JSFatInlineString::MAX_LENGTH_TWO_BYTE / 2 = floor(11 / 2) = 5 +assert.sameValue(String.fromCodePoint(0x31, 0x32), '12'); +assert.sameValue(String.fromCodePoint(0x31, 0x32, 0x33), '123'); +assert.sameValue(String.fromCodePoint(0x31, 0x32, 0x33, 0x34), '1234'); +assert.sameValue(String.fromCodePoint(0x31, 0x32, 0x33, 0x34, 0x35), '12345'); +// str_fromCodePoint (many arguments, creates a malloc string) +assert.sameValue(String.fromCodePoint(0x31, 0x32, 0x33, 0x34, 0x35, 0x36), '123456'); + diff --git a/test/staging/sm/String/internalUsage.js b/test/staging/sm/String/internalUsage.js new file mode 100644 index 0000000000..c7f19d61ea --- /dev/null +++ b/test/staging/sm/String/internalUsage.js @@ -0,0 +1,40 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-String-shell.js, sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +var BUGNUMBER = 1268138; +var summary = 'Internal usage of split should not be affected by prototpe change'; + +print(BUGNUMBER + ": " + summary); + +function test() { + var t = 24*60*60*1000; + var possibleAnswer = ["1.1.1970", "2.1.1970", "3.1.1970"]; + + String.prototype[Symbol.split] = function(s, limit) { return [""]; }; + var s = Intl.DateTimeFormat("de", {}).format(t); + assert.sameValue(possibleAnswer.includes(s), true); + + String.prototype[Symbol.split] = function(s, limit) { return ["x-foo"]; }; + s = Intl.DateTimeFormat("de", {}).format(t); + assert.sameValue(possibleAnswer.includes(s), true); + + String.prototype[Symbol.split] = function(s, limit) { return ["de-u-co"]; }; + s = Intl.DateTimeFormat("de", {}).format(t); + assert.sameValue(possibleAnswer.includes(s), true); + + String.prototype[Symbol.split] = function(s, limit) { return ["en-US"]; }; + s = Intl.DateTimeFormat("de", {}).format(t); + assert.sameValue(possibleAnswer.includes(s), true); +} + +if (this.hasOwnProperty("Intl")) + test(); + diff --git a/test/staging/sm/String/iterator_edge_cases.js b/test/staging/sm/String/iterator_edge_cases.js new file mode 100644 index 0000000000..3689e59443 --- /dev/null +++ b/test/staging/sm/String/iterator_edge_cases.js @@ -0,0 +1,33 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [deepEqual.js, sm/non262-String-shell.js, sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +// Test that we can't confuse %StringIteratorPrototype% for a +// StringIterator object. +function TestStringIteratorPrototypeConfusion() { + var iter = ""[Symbol.iterator](); + assertThrowsInstanceOfWithMessage( + () => iter.next.call(Object.getPrototypeOf(iter)), + TypeError, + "next method called on incompatible String Iterator"); +} +TestStringIteratorPrototypeConfusion(); + +// Tests that we can use %StringIteratorPrototype%.next on a +// cross-compartment iterator. +function TestStringIteratorWrappers() { + var iter = ""[Symbol.iterator](); + assert.deepEqual(iter.next.call(createNewGlobal().eval('"x"[Symbol.iterator]()')), + { value: "x", done: false }) +} +if (typeof createNewGlobal === "function") { + TestStringIteratorWrappers(); +} + diff --git a/test/staging/sm/String/make-normalize-generateddata-input.py b/test/staging/sm/String/make-normalize-generateddata-input.py new file mode 100644 index 0000000000..086275e67d --- /dev/null +++ b/test/staging/sm/String/make-normalize-generateddata-input.py @@ -0,0 +1,87 @@ +#!/usr/bin/python -B + +""" Usage: make-normalize-generateddata-input.py PATH_TO_MOZILLA_CENTRAL + + This script generates test input data for String.prototype.normalize + from intl/icu/source/data/unidata/NormalizationTest.txt + to js/src/tests/non262/String/normalize-generateddata-input.js +""" + +import re +import sys + +sep_pat = re.compile(" +") + + +def to_code_list(codes): + return "[" + ", ".join("0x{0}".format(x) for x in re.split(sep_pat, codes)) + "]" + + +def convert(dir): + ver_pat = re.compile(r"NormalizationTest-([0-9\.]+)\.txt") + part_pat = re.compile("^@(Part([0-9]+) .+)$") + test_pat = re.compile( + "^([0-9A-Fa-f ]+);([0-9A-Fa-f ]+);([0-9A-Fa-f ]+);([0-9A-Fa-f ]+);([0-9A-Fa-f ]+);$" + ) + ignore_pat = re.compile("^#|^$") + js_path = "js/src/tests/non262/String/normalize-generateddata-input.js" + txt_path = "intl/icu/source/data/unidata/NormalizationTest.txt" + + part_opened = False + not_empty = False + with open("{dir}/{path}".format(dir=dir, path=txt_path), "r") as f: + with open("{dir}/{path}".format(dir=dir, path=js_path), "w") as outf: + for line in f: + m = test_pat.search(line) + if m: + if not_empty: + outf.write(",") + outf.write("\n") + pat = "{{ source: {source}, NFC: {NFC}, NFD: {NFD}, NFKC: {NFKC}, NFKD: {NFKD} }}" # NOQA: E501 + outf.write( + pat.format( + source=to_code_list(m.group(1)), + NFC=to_code_list(m.group(2)), + NFD=to_code_list(m.group(3)), + NFKC=to_code_list(m.group(4)), + NFKD=to_code_list(m.group(5)), + ) + ) + not_empty = True + continue + m = part_pat.search(line) + if m: + desc = m.group(1) + part = m.group(2) + if part_opened: + outf.write("\n];\n") + outf.write("/* {desc} */\n".format(desc=desc)) + outf.write("var tests_part{part} = [".format(part=part)) + part_opened = True + not_empty = False + continue + m = ver_pat.search(line) + if m: + ver = m.group(1) + outf.write( + "/* created from NormalizationTest-{ver}.txt */\n".format( + ver=ver + ) + ) + continue + m = ignore_pat.search(line) + if m: + continue + print("Unknown line: {0}".format(line), file=sys.stderr) + if part_opened: + outf.write("\n];\n") + + +if __name__ == "__main__": + if len(sys.argv) < 2: + print( + "Usage: make-normalize-generateddata-input.py PATH_TO_MOZILLA_CENTRAL", + file=sys.stderr, + ) + sys.exit(1) + convert(sys.argv[1]) diff --git a/test/staging/sm/String/match-GetMethod.js b/test/staging/sm/String/match-GetMethod.js new file mode 100644 index 0000000000..a92e1bddba --- /dev/null +++ b/test/staging/sm/String/match-GetMethod.js @@ -0,0 +1,38 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [deepEqual.js, sm/non262-String-shell.js, sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +var BUGNUMBER = 1290655; +var summary = "String.prototype.match should call GetMethod."; + +print(BUGNUMBER + ": " + summary); + +function create(value) { + return { + [Symbol.match]: value, + toString() { + return "-"; + } + }; +} + +var expected = ["-"]; +expected.index = 1; +expected.input = "a-a"; +expected.groups = undefined; + +for (let v of [null, undefined]) { + assert.deepEqual("a-a".match(create(v)), expected); +} + +for (let v of [1, true, Symbol.iterator, "", {}, []]) { + assertThrowsInstanceOf(() => "a-a".match(create(v)), TypeError); +} + diff --git a/test/staging/sm/String/match-defines-match-elements.js b/test/staging/sm/String/match-defines-match-elements.js new file mode 100644 index 0000000000..09ae47b1f7 --- /dev/null +++ b/test/staging/sm/String/match-defines-match-elements.js @@ -0,0 +1,52 @@ +/* + * Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/licenses/publicdomain/ + */ + +/*--- +includes: [sm/non262-String-shell.js, sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +var BUGNUMBER = 677820; +var summary = + "String.prototype.match must define matches on the returned array, not set " + + "them"; + +print(BUGNUMBER + ": " + summary); + +/************** + * BEGIN TEST * + **************/ + +var called = false; +function setterFunction(v) { called = true; } +function getterFunction(v) { return "getter"; } + +Object.defineProperty(Array.prototype, 1, + { get: getterFunction, set: setterFunction }); + +assert.sameValue(called, false); +var matches = "abcdef".match(/./g); +assert.sameValue(called, false); +assert.sameValue(matches.length, 6); +assert.sameValue(matches[0], "a"); +assert.sameValue(matches[1], "b"); +assert.sameValue(matches[2], "c"); +assert.sameValue(matches[3], "d"); +assert.sameValue(matches[4], "e"); +assert.sameValue(matches[5], "f"); + +var desc = Object.getOwnPropertyDescriptor(Array.prototype, 1); +assert.sameValue(desc.get, getterFunction); +assert.sameValue(desc.set, setterFunction); +assert.sameValue(desc.enumerable, false); +assert.sameValue(desc.configurable, false); +assert.sameValue([][1], "getter"); + +assert.sameValue(called, false); + +print("Tests complete"); diff --git a/test/staging/sm/String/match-forward-lookahead.js b/test/staging/sm/String/match-forward-lookahead.js new file mode 100644 index 0000000000..8947a39f8b --- /dev/null +++ b/test/staging/sm/String/match-forward-lookahead.js @@ -0,0 +1,32 @@ +/* + * Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/licenses/publicdomain/ + */ + +/*--- +includes: [sm/non262-String-shell.js, sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +var BUGNUMBER = 501739; +var summary = + "String.prototype.match behavior with zero-length matches involving " + + "forward lookahead"; + +print(BUGNUMBER + ": " + summary); + +/************** + * BEGIN TEST * + **************/ + +var r = /(?=x)/g; + +var res = "aaaaaaaaaxaaaaaaaaax".match(r); +assert.sameValue(res.length, 2); + +/******************************************************************************/ + +print("Tests complete"); diff --git a/test/staging/sm/String/match-throws-nonwritable-lastIndex-global.js b/test/staging/sm/String/match-throws-nonwritable-lastIndex-global.js new file mode 100644 index 0000000000..42cc6a1380 --- /dev/null +++ b/test/staging/sm/String/match-throws-nonwritable-lastIndex-global.js @@ -0,0 +1,93 @@ +/* + * Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/licenses/publicdomain/ + */ + +/*--- +includes: [sm/non262-String-shell.js, sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +var BUGNUMBER = 501739; +var summary = + "String.prototype.match should throw when called with a global RegExp " + + "whose .lastIndex is non-writable"; + +print(BUGNUMBER + ": " + summary); + +/************** + * BEGIN TEST * + **************/ + +var s = '0x2x4x6x8'; + +// First time with .lastIndex === 0 + +var p1 = /x/g; +Object.defineProperty(p1, "lastIndex", { writable: false }); + +try +{ + s.match(p1); + throw "didn't throw"; +} +catch (e) +{ + assert.sameValue(e instanceof TypeError, true, + "should have thrown a TypeError, instead got: " + e); +} + +// Second time with .lastIndex !== 0 + +var p2 = /x/g; +Object.defineProperty(p2, "lastIndex", { writable: false, value: 3 }); + +try +{ + s.match(p2); + throw "didn't throw"; +} +catch (e) +{ + assert.sameValue(e instanceof TypeError, true, + "should have thrown a TypeError, instead got: " + e); +} + +// Third time with .lastIndex === 0, no matches + +var p3 = /q/g; +Object.defineProperty(p3, "lastIndex", { writable: false }); + +try +{ + s.match(p3); + throw "didn't throw"; +} +catch (e) +{ + assert.sameValue(e instanceof TypeError, true, + "should have thrown a TypeError, instead got: " + e); +} + +// Fourth time with .lastIndex !== 0, no matches + +var p4 = /q/g; +Object.defineProperty(p4, "lastIndex", { writable: false, value: 3 }); + +try +{ + s.match(p4); + throw "didn't throw"; +} +catch (e) +{ + assert.sameValue(e instanceof TypeError, true, + "should have thrown a TypeError, instead got: " + e); +} + +/******************************************************************************/ + +print("Tests complete"); diff --git a/test/staging/sm/String/match-updates-global-lastIndex.js b/test/staging/sm/String/match-updates-global-lastIndex.js new file mode 100644 index 0000000000..f02c7000fa --- /dev/null +++ b/test/staging/sm/String/match-updates-global-lastIndex.js @@ -0,0 +1,36 @@ +/* + * Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/licenses/publicdomain/ + */ + +/*--- +includes: [sm/non262-String-shell.js, sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +var BUGNUMBER = 501739; +var summary = + "String.prototype.match should zero the .lastIndex when called with a " + + "global RegExp"; + +print(BUGNUMBER + ": " + summary); + +/************** + * BEGIN TEST * + **************/ + +var s = '0x2x4x6x8'; +var p = /x/g; +p.lastIndex = 3; + +var arr = s.match(p); +assert.sameValue(arr.length, 4); +arr.forEach(function(v) { assert.sameValue(v, "x"); }); +assert.sameValue(p.lastIndex, 0); + +/******************************************************************************/ + +print("Tests complete"); diff --git a/test/staging/sm/String/match.js b/test/staging/sm/String/match.js new file mode 100644 index 0000000000..34093cf18f --- /dev/null +++ b/test/staging/sm/String/match.js @@ -0,0 +1,40 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-String-shell.js, sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +var BUGNUMBER = 887016; +var summary = "Call RegExp.prototype[@@match] from String.prototype.match."; + +print(BUGNUMBER + ": " + summary); + +var called = 0; +var myRegExp = { + [Symbol.match](S) { + assert.sameValue(S, "abcAbcABC"); + called++; + return 42; + } +}; +assert.sameValue("abcAbcABC".match(myRegExp), 42); +assert.sameValue(called, 1); + +var origMatch = RegExp.prototype[Symbol.match]; + +called = 0; +RegExp.prototype[Symbol.match] = function(S) { + assert.sameValue(S, "abcAbcABC"); + called++; + return 43; +}; +assert.sameValue("abcAbcABC".match("abc"), 43); +assert.sameValue(called, 1); + +RegExp.prototype[Symbol.match] = origMatch; + diff --git a/test/staging/sm/String/matchAll.js b/test/staging/sm/String/matchAll.js new file mode 100644 index 0000000000..a02f403621 --- /dev/null +++ b/test/staging/sm/String/matchAll.js @@ -0,0 +1,297 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [compareArray.js, sm/non262-String-shell.js, sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +// Basic surface tests. + +assert.sameValue(typeof String.prototype.matchAll, "function"); +assert.sameValue(String.prototype.matchAll.name, "matchAll"); +assert.sameValue(String.prototype.matchAll.length, 1); + +assert.sameValue(typeof Symbol.matchAll, "symbol"); + +assert.sameValue(typeof RegExp.prototype[Symbol.matchAll], "function"); +assert.sameValue(RegExp.prototype[Symbol.matchAll].name, "[Symbol.matchAll]"); +assert.sameValue(RegExp.prototype[Symbol.matchAll].length, 1); + +const IteratorPrototype = Object.getPrototypeOf(Object.getPrototypeOf([][Symbol.iterator]())); +const RegExpStringIteratorPrototype = Object.getPrototypeOf("".matchAll("")); + +assert.sameValue(Object.getPrototypeOf(RegExpStringIteratorPrototype), IteratorPrototype); + +assert.sameValue(typeof RegExpStringIteratorPrototype.next, "function"); +assert.sameValue(RegExpStringIteratorPrototype.next.name, "next"); +assert.sameValue(RegExpStringIteratorPrototype.next.length, 0); + +assert.sameValue(RegExpStringIteratorPrototype[Symbol.toStringTag], "RegExp String Iterator"); + + +// Basic functional tests. + +const RegExp_prototype_exec = RegExp.prototype.exec; +const RegExp_prototype_match = RegExp.prototype[Symbol.match]; + +function assertEqIterMatchResult(actual, expected) { + assert.sameValue(actual.done, expected.done); + if (actual.value === undefined || expected.value === undefined) { + assert.sameValue(actual.value, expected.value); + } else { + assert.compareArray(actual.value, expected.value); + assert.sameValue(actual.value.input, expected.value.input); + assert.sameValue(actual.value.index, expected.value.index); + } +} + +function assertEqMatchResults(actual, expected) { + var actualIter = actual[Symbol.iterator](); + var expectedIter = expected[Symbol.iterator](); + while (true) { + var actualResult = actualIter.next(); + var expectedResult = expectedIter.next(); + assertEqIterMatchResult(actualResult, expectedResult); + if (actualResult.done && expectedResult.done) + return; + } +} + +function* matchResults(string, regexp, lastIndex = 0) { + regexp.lastIndex = lastIndex; + while (true) { + var match = Reflect.apply(RegExp_prototype_exec, regexp, [string]); + if (match === null) + return; + yield match; + if (!regexp.global) + return; + } +} + +assertEqMatchResults(/a/[Symbol.matchAll]("ababcca"), matchResults("ababcca", /a/)); +assertEqMatchResults("ababcca".matchAll(/a/g), matchResults("ababcca", /a/g)); +assertEqMatchResults("ababcca".matchAll("a"), matchResults("ababcca", /a/g)); + + +// Cross-compartment tests. + +{ + let otherGlobal = createNewGlobal(); + + let iterator = otherGlobal.eval(`"ababcca".matchAll(/a/g)`); + let expected = matchResults("ababcca", /a/g); + + assertEqIterMatchResult(RegExpStringIteratorPrototype.next.call(iterator), + expected.next()); +} + + +// Optimization tests. +// +// The optimized path for MatchAllIterator reuses the input RegExp to avoid +// extra RegExp allocations. To make this optimization undetectable from +// user code, we need to ensure that: +// 1. Modifications to the input RegExp through RegExp.prototype.compile are +// detected and properly handled (= ignored). +// 2. The RegExpStringIterator doesn't modify the input RegExp, for example +// by updating the lastIndex property. +// 3. Guards against modifications of built-in RegExp.prototype are installed. + +// Recompile RegExp (source) before first match. +{ + let regexp = /a+/g; + let iterator = "aabb".matchAll(regexp); + + regexp.compile("b+", "g"); + assertEqMatchResults(iterator, matchResults("aabb", /a+/g)); +} + +// Recompile RegExp (flags) before first match. +{ + let regexp = /a+/gi; + let iterator = "aAbb".matchAll(regexp); + + regexp.compile("a+", ""); + assertEqMatchResults(iterator, matchResults("aAbb", /a+/gi)); +} + +// Recompile RegExp (source) after first match. +{ + let regexp = /a+/g; + let iterator = "aabbaa".matchAll(regexp); + let expected = matchResults("aabbaa", /a+/g); + + assertEqIterMatchResult(iterator.next(), expected.next()); + regexp.compile("b+", "g"); + assertEqIterMatchResult(iterator.next(), expected.next()); +} + +// Recompile RegExp (flags) after first match. +{ + let regexp = /a+/g; + let iterator = "aabbAA".matchAll(regexp); + let expected = matchResults("aabbAA", /a+/g); + + assertEqIterMatchResult(iterator.next(), expected.next()); + regexp.compile("a+", "i"); + assertEqIterMatchResult(iterator.next(), expected.next()); +} + +// lastIndex property of input RegExp not modified when optimized path used. +{ + let regexp = /a+/g; + regexp.lastIndex = 1; + let iterator = "aabbaa".matchAll(regexp); + let expected = matchResults("aabbaa", /a+/g, 1); + + assert.sameValue(regexp.lastIndex, 1); + assertEqIterMatchResult(iterator.next(), expected.next()); + assert.sameValue(regexp.lastIndex, 1); + assertEqIterMatchResult(iterator.next(), expected.next()); + assert.sameValue(regexp.lastIndex, 1); +} + +// Modifications to lastIndex property of input RegExp ignored when optimized path used. +{ + let regexp = /a+/g; + let iterator = "aabbaa".matchAll(regexp); + regexp.lastIndex = 1; + let expected = matchResults("aabbaa", /a+/g); + + assert.sameValue(regexp.lastIndex, 1); + assertEqIterMatchResult(iterator.next(), expected.next()); + assert.sameValue(regexp.lastIndex, 1); + assertEqIterMatchResult(iterator.next(), expected.next()); + assert.sameValue(regexp.lastIndex, 1); +} + +// RegExp.prototype[Symbol.match] is modified to a getter, ensure this getter +// is called exactly twice. +try { + let regexp = /a+/g; + + let callCount = 0; + Object.defineProperty(RegExp.prototype, Symbol.match, { + get() { + assert.sameValue(this, regexp); + callCount++; + return RegExp_prototype_match; + } + }); + let iterator = "aabbaa".matchAll(regexp); + assert.sameValue(callCount, 2); +} finally { + // Restore optimizable RegExp.prototype shape. + Object.defineProperty(RegExp.prototype, Symbol.match, { + value: RegExp_prototype_match, + writable: true, enumerable: false, configurable: true + }); +} + +// RegExp.prototype.exec is changed to a getter. +try { + let regexp = /a+/g; + let iterator = "aabbaa".matchAll(regexp); + let lastIndices = [0, 2, 6][Symbol.iterator](); + + let iteratorRegExp = null; + let callCount = 0; + Object.defineProperty(RegExp.prototype, "exec", { + get() { + callCount++; + + if (iteratorRegExp === null) + iteratorRegExp = this; + + assert.sameValue(this === regexp, false); + assert.sameValue(this, iteratorRegExp); + assert.sameValue(this.source, regexp.source); + assert.sameValue(this.flags, regexp.flags); + assert.sameValue(this.lastIndex, lastIndices.next().value); + return RegExp_prototype_exec; + } + }); + + assertEqMatchResults(iterator, matchResults("aabbaa", /a+/g)); + assert.sameValue(callCount, 3); +} finally { + // Restore optimizable RegExp.prototype shape. + Object.defineProperty(RegExp.prototype, "exec", { + value: RegExp_prototype_exec, + writable: true, enumerable: false, configurable: true + }); +} + +// RegExp.prototype.exec is changed to a value property. +try { + let regexp = /a+/g; + let iterator = "aabbaa".matchAll(regexp); + let lastIndices = [0, 2, 6][Symbol.iterator](); + + let iteratorRegExp = null; + let callCount = 0; + RegExp.prototype.exec = function(...args) { + callCount++; + + if (iteratorRegExp === null) + iteratorRegExp = this; + + assert.sameValue(this === regexp, false); + assert.sameValue(this, iteratorRegExp); + assert.sameValue(this.source, regexp.source); + assert.sameValue(this.flags, regexp.flags); + assert.sameValue(this.lastIndex, lastIndices.next().value); + return Reflect.apply(RegExp_prototype_exec, this, args); + }; + + assertEqMatchResults(iterator, matchResults("aabbaa", /a+/g)); + assert.sameValue(callCount, 3); +} finally { + // Restore optimizable RegExp.prototype shape. + Object.defineProperty(RegExp.prototype, "exec", { + value: RegExp_prototype_exec, + writable: true, enumerable: false, configurable: true + }); +} + +// Initial 'lastIndex' is zero if the RegExp is neither global nor sticky (1). +{ + let regexp = /a+/; + regexp.lastIndex = 2; + + let iterator = regexp[Symbol.matchAll]("aaaaa"); + assertEqMatchResults(iterator, matchResults("aaaaa", /a+/g, 0)); +} + +// Initial 'lastIndex' is zero if the RegExp is neither global nor sticky (2). +{ + let regexp = /a+/g; + regexp.lastIndex = 2; + + let iterator = regexp[Symbol.matchAll]("aaaaa"); + assertEqMatchResults(iterator, matchResults("aaaaa", /a+/g, 2)); +} + +// Initial 'lastIndex' is zero if the RegExp is neither global nor sticky (3). +{ + let regexp = /a+/y; + regexp.lastIndex = 2; + + let iterator = regexp[Symbol.matchAll]("aaaaa"); + assertEqMatchResults(iterator, matchResults("aaaaa", /a+/g, 2)); +} + +//Initial 'lastIndex' is zero if the RegExp is neither global nor sticky (4). +{ + let regexp = /a+/gy; + regexp.lastIndex = 2; + + let iterator = regexp[Symbol.matchAll]("aaaaa"); + assertEqMatchResults(iterator, matchResults("aaaaa", /a+/g, 2)); +} + diff --git a/test/staging/sm/String/normalize-form-non-atom.js b/test/staging/sm/String/normalize-form-non-atom.js new file mode 100644 index 0000000000..191cc5f232 --- /dev/null +++ b/test/staging/sm/String/normalize-form-non-atom.js @@ -0,0 +1,27 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-String-shell.js, sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +var BUGNUMBER = 1145326; +var summary = 'String.prototype.normalize error when normalization form parameter is not an atom'; + +print(BUGNUMBER + ": " + summary); + +function test() { + assert.sameValue("abc".normalize("NFKC".split("").join("")), "abc"); + assert.sameValue("abc".normalize("NFKCabc".replace("abc", "")), "abc"); + assert.sameValue("abc".normalize("N" + "F" + "K" + "C"), "abc"); +} + +if ("normalize" in String.prototype) { + // String.prototype.normalize is not enabled in all builds. + test(); +} + diff --git a/test/staging/sm/String/normalize-generateddata-input.js b/test/staging/sm/String/normalize-generateddata-input.js new file mode 100644 index 0000000000..ad1b15e8ed --- /dev/null +++ b/test/staging/sm/String/normalize-generateddata-input.js @@ -0,0 +1,19098 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-String-shell.js, sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +/* created from NormalizationTest-15.0.0.txt */ +/* Part0 # Specific cases */ +var tests_part0 = [ +{ source: [0x1E0A], NFC: [0x1E0A], NFD: [0x0044, 0x0307], NFKC: [0x1E0A], NFKD: [0x0044, 0x0307] }, +{ source: [0x1E0C], NFC: [0x1E0C], NFD: [0x0044, 0x0323], NFKC: [0x1E0C], NFKD: [0x0044, 0x0323] }, +{ source: [0x1E0A, 0x0323], NFC: [0x1E0C, 0x0307], NFD: [0x0044, 0x0323, 0x0307], NFKC: [0x1E0C, 0x0307], NFKD: [0x0044, 0x0323, 0x0307] }, +{ source: [0x1E0C, 0x0307], NFC: [0x1E0C, 0x0307], NFD: [0x0044, 0x0323, 0x0307], NFKC: [0x1E0C, 0x0307], NFKD: [0x0044, 0x0323, 0x0307] }, +{ source: [0x0044, 0x0307, 0x0323], NFC: [0x1E0C, 0x0307], NFD: [0x0044, 0x0323, 0x0307], NFKC: [0x1E0C, 0x0307], NFKD: [0x0044, 0x0323, 0x0307] }, +{ source: [0x0044, 0x0323, 0x0307], NFC: [0x1E0C, 0x0307], NFD: [0x0044, 0x0323, 0x0307], NFKC: [0x1E0C, 0x0307], NFKD: [0x0044, 0x0323, 0x0307] }, +{ source: [0x1E0A, 0x031B], NFC: [0x1E0A, 0x031B], NFD: [0x0044, 0x031B, 0x0307], NFKC: [0x1E0A, 0x031B], NFKD: [0x0044, 0x031B, 0x0307] }, +{ source: [0x1E0C, 0x031B], NFC: [0x1E0C, 0x031B], NFD: [0x0044, 0x031B, 0x0323], NFKC: [0x1E0C, 0x031B], NFKD: [0x0044, 0x031B, 0x0323] }, +{ source: [0x1E0A, 0x031B, 0x0323], NFC: [0x1E0C, 0x031B, 0x0307], NFD: [0x0044, 0x031B, 0x0323, 0x0307], NFKC: [0x1E0C, 0x031B, 0x0307], NFKD: [0x0044, 0x031B, 0x0323, 0x0307] }, +{ source: [0x1E0C, 0x031B, 0x0307], NFC: [0x1E0C, 0x031B, 0x0307], NFD: [0x0044, 0x031B, 0x0323, 0x0307], NFKC: [0x1E0C, 0x031B, 0x0307], NFKD: [0x0044, 0x031B, 0x0323, 0x0307] }, +{ source: [0x0044, 0x031B, 0x0307, 0x0323], NFC: [0x1E0C, 0x031B, 0x0307], NFD: [0x0044, 0x031B, 0x0323, 0x0307], NFKC: [0x1E0C, 0x031B, 0x0307], NFKD: [0x0044, 0x031B, 0x0323, 0x0307] }, +{ source: [0x0044, 0x031B, 0x0323, 0x0307], NFC: [0x1E0C, 0x031B, 0x0307], NFD: [0x0044, 0x031B, 0x0323, 0x0307], NFKC: [0x1E0C, 0x031B, 0x0307], NFKD: [0x0044, 0x031B, 0x0323, 0x0307] }, +{ source: [0x00C8], NFC: [0x00C8], NFD: [0x0045, 0x0300], NFKC: [0x00C8], NFKD: [0x0045, 0x0300] }, +{ source: [0x0112], NFC: [0x0112], NFD: [0x0045, 0x0304], NFKC: [0x0112], NFKD: [0x0045, 0x0304] }, +{ source: [0x0045, 0x0300], NFC: [0x00C8], NFD: [0x0045, 0x0300], NFKC: [0x00C8], NFKD: [0x0045, 0x0300] }, +{ source: [0x0045, 0x0304], NFC: [0x0112], NFD: [0x0045, 0x0304], NFKC: [0x0112], NFKD: [0x0045, 0x0304] }, +{ source: [0x1E14], NFC: [0x1E14], NFD: [0x0045, 0x0304, 0x0300], NFKC: [0x1E14], NFKD: [0x0045, 0x0304, 0x0300] }, +{ source: [0x0112, 0x0300], NFC: [0x1E14], NFD: [0x0045, 0x0304, 0x0300], NFKC: [0x1E14], NFKD: [0x0045, 0x0304, 0x0300] }, +{ source: [0x1E14, 0x0304], NFC: [0x1E14, 0x0304], NFD: [0x0045, 0x0304, 0x0300, 0x0304], NFKC: [0x1E14, 0x0304], NFKD: [0x0045, 0x0304, 0x0300, 0x0304] }, +{ source: [0x0045, 0x0304, 0x0300], NFC: [0x1E14], NFD: [0x0045, 0x0304, 0x0300], NFKC: [0x1E14], NFKD: [0x0045, 0x0304, 0x0300] }, +{ source: [0x0045, 0x0300, 0x0304], NFC: [0x00C8, 0x0304], NFD: [0x0045, 0x0300, 0x0304], NFKC: [0x00C8, 0x0304], NFKD: [0x0045, 0x0300, 0x0304] }, +{ source: [0x05B8, 0x05B9, 0x05B1, 0x0591, 0x05C3, 0x05B0, 0x05AC, 0x059F], NFC: [0x05B1, 0x05B8, 0x05B9, 0x0591, 0x05C3, 0x05B0, 0x05AC, 0x059F], NFD: [0x05B1, 0x05B8, 0x05B9, 0x0591, 0x05C3, 0x05B0, 0x05AC, 0x059F], NFKC: [0x05B1, 0x05B8, 0x05B9, 0x0591, 0x05C3, 0x05B0, 0x05AC, 0x059F], NFKD: [0x05B1, 0x05B8, 0x05B9, 0x0591, 0x05C3, 0x05B0, 0x05AC, 0x059F] }, +{ source: [0x0592, 0x05B7, 0x05BC, 0x05A5, 0x05B0, 0x05C0, 0x05C4, 0x05AD], NFC: [0x05B0, 0x05B7, 0x05BC, 0x05A5, 0x0592, 0x05C0, 0x05AD, 0x05C4], NFD: [0x05B0, 0x05B7, 0x05BC, 0x05A5, 0x0592, 0x05C0, 0x05AD, 0x05C4], NFKC: [0x05B0, 0x05B7, 0x05BC, 0x05A5, 0x0592, 0x05C0, 0x05AD, 0x05C4], NFKD: [0x05B0, 0x05B7, 0x05BC, 0x05A5, 0x0592, 0x05C0, 0x05AD, 0x05C4] }, +{ source: [0x1100, 0xAC00, 0x11A8], NFC: [0x1100, 0xAC01], NFD: [0x1100, 0x1100, 0x1161, 0x11A8], NFKC: [0x1100, 0xAC01], NFKD: [0x1100, 0x1100, 0x1161, 0x11A8] }, +{ source: [0x1100, 0xAC00, 0x11A8, 0x11A8], NFC: [0x1100, 0xAC01, 0x11A8], NFD: [0x1100, 0x1100, 0x1161, 0x11A8, 0x11A8], NFKC: [0x1100, 0xAC01, 0x11A8], NFKD: [0x1100, 0x1100, 0x1161, 0x11A8, 0x11A8] } +]; +/* Part1 # Character by character test */ +var tests_part1 = [ +{ source: [0x00A0], NFC: [0x00A0], NFD: [0x00A0], NFKC: [0x0020], NFKD: [0x0020] }, +{ source: [0x00A8], NFC: [0x00A8], NFD: [0x00A8], NFKC: [0x0020, 0x0308], NFKD: [0x0020, 0x0308] }, +{ source: [0x00AA], NFC: [0x00AA], NFD: [0x00AA], NFKC: [0x0061], NFKD: [0x0061] }, +{ source: [0x00AF], NFC: [0x00AF], NFD: [0x00AF], NFKC: [0x0020, 0x0304], NFKD: [0x0020, 0x0304] }, +{ source: [0x00B2], NFC: [0x00B2], NFD: [0x00B2], NFKC: [0x0032], NFKD: [0x0032] }, +{ source: [0x00B3], NFC: [0x00B3], NFD: [0x00B3], NFKC: [0x0033], NFKD: [0x0033] }, +{ source: [0x00B4], NFC: [0x00B4], NFD: [0x00B4], NFKC: [0x0020, 0x0301], NFKD: [0x0020, 0x0301] }, +{ source: [0x00B5], NFC: [0x00B5], NFD: [0x00B5], NFKC: [0x03BC], NFKD: [0x03BC] }, +{ source: [0x00B8], NFC: [0x00B8], NFD: [0x00B8], NFKC: [0x0020, 0x0327], NFKD: [0x0020, 0x0327] }, +{ source: [0x00B9], NFC: [0x00B9], NFD: [0x00B9], NFKC: [0x0031], NFKD: [0x0031] }, +{ source: [0x00BA], NFC: [0x00BA], NFD: [0x00BA], NFKC: [0x006F], NFKD: [0x006F] }, +{ source: [0x00BC], NFC: [0x00BC], NFD: [0x00BC], NFKC: [0x0031, 0x2044, 0x0034], NFKD: [0x0031, 0x2044, 0x0034] }, +{ source: [0x00BD], NFC: [0x00BD], NFD: [0x00BD], NFKC: [0x0031, 0x2044, 0x0032], NFKD: [0x0031, 0x2044, 0x0032] }, +{ source: [0x00BE], NFC: [0x00BE], NFD: [0x00BE], NFKC: [0x0033, 0x2044, 0x0034], NFKD: [0x0033, 0x2044, 0x0034] }, +{ source: [0x00C0], NFC: [0x00C0], NFD: [0x0041, 0x0300], NFKC: [0x00C0], NFKD: [0x0041, 0x0300] }, +{ source: [0x00C1], NFC: [0x00C1], NFD: [0x0041, 0x0301], NFKC: [0x00C1], NFKD: [0x0041, 0x0301] }, +{ source: [0x00C2], NFC: [0x00C2], NFD: [0x0041, 0x0302], NFKC: [0x00C2], NFKD: [0x0041, 0x0302] }, +{ source: [0x00C3], NFC: [0x00C3], NFD: [0x0041, 0x0303], NFKC: [0x00C3], NFKD: [0x0041, 0x0303] }, +{ source: [0x00C4], NFC: [0x00C4], NFD: [0x0041, 0x0308], NFKC: [0x00C4], NFKD: [0x0041, 0x0308] }, +{ source: [0x00C5], NFC: [0x00C5], NFD: [0x0041, 0x030A], NFKC: [0x00C5], NFKD: [0x0041, 0x030A] }, +{ source: [0x00C7], NFC: [0x00C7], NFD: [0x0043, 0x0327], NFKC: [0x00C7], NFKD: [0x0043, 0x0327] }, +{ source: [0x00C8], NFC: [0x00C8], NFD: [0x0045, 0x0300], NFKC: [0x00C8], NFKD: [0x0045, 0x0300] }, +{ source: [0x00C9], NFC: [0x00C9], NFD: [0x0045, 0x0301], NFKC: [0x00C9], NFKD: [0x0045, 0x0301] }, +{ source: [0x00CA], NFC: [0x00CA], NFD: [0x0045, 0x0302], NFKC: [0x00CA], NFKD: [0x0045, 0x0302] }, +{ source: [0x00CB], NFC: [0x00CB], NFD: [0x0045, 0x0308], NFKC: [0x00CB], NFKD: [0x0045, 0x0308] }, +{ source: [0x00CC], NFC: [0x00CC], NFD: [0x0049, 0x0300], NFKC: [0x00CC], NFKD: [0x0049, 0x0300] }, +{ source: [0x00CD], NFC: [0x00CD], NFD: [0x0049, 0x0301], NFKC: [0x00CD], NFKD: [0x0049, 0x0301] }, +{ source: [0x00CE], NFC: [0x00CE], NFD: [0x0049, 0x0302], NFKC: [0x00CE], NFKD: [0x0049, 0x0302] }, +{ source: [0x00CF], NFC: [0x00CF], NFD: [0x0049, 0x0308], NFKC: [0x00CF], NFKD: [0x0049, 0x0308] }, +{ source: [0x00D1], NFC: [0x00D1], NFD: [0x004E, 0x0303], NFKC: [0x00D1], NFKD: [0x004E, 0x0303] }, +{ source: [0x00D2], NFC: [0x00D2], NFD: [0x004F, 0x0300], NFKC: [0x00D2], NFKD: [0x004F, 0x0300] }, +{ source: [0x00D3], NFC: [0x00D3], NFD: [0x004F, 0x0301], NFKC: [0x00D3], NFKD: [0x004F, 0x0301] }, +{ source: [0x00D4], NFC: [0x00D4], NFD: [0x004F, 0x0302], NFKC: [0x00D4], NFKD: [0x004F, 0x0302] }, +{ source: [0x00D5], NFC: [0x00D5], NFD: [0x004F, 0x0303], NFKC: [0x00D5], NFKD: [0x004F, 0x0303] }, +{ source: [0x00D6], NFC: [0x00D6], NFD: [0x004F, 0x0308], NFKC: [0x00D6], NFKD: [0x004F, 0x0308] }, +{ source: [0x00D9], NFC: [0x00D9], NFD: [0x0055, 0x0300], NFKC: [0x00D9], NFKD: [0x0055, 0x0300] }, +{ source: [0x00DA], NFC: [0x00DA], NFD: [0x0055, 0x0301], NFKC: [0x00DA], NFKD: [0x0055, 0x0301] }, +{ source: [0x00DB], NFC: [0x00DB], NFD: [0x0055, 0x0302], NFKC: [0x00DB], NFKD: [0x0055, 0x0302] }, +{ source: [0x00DC], NFC: [0x00DC], NFD: [0x0055, 0x0308], NFKC: [0x00DC], NFKD: [0x0055, 0x0308] }, +{ source: [0x00DD], NFC: [0x00DD], NFD: [0x0059, 0x0301], NFKC: [0x00DD], NFKD: [0x0059, 0x0301] }, +{ source: [0x00E0], NFC: [0x00E0], NFD: [0x0061, 0x0300], NFKC: [0x00E0], NFKD: [0x0061, 0x0300] }, +{ source: [0x00E1], NFC: [0x00E1], NFD: [0x0061, 0x0301], NFKC: [0x00E1], NFKD: [0x0061, 0x0301] }, +{ source: [0x00E2], NFC: [0x00E2], NFD: [0x0061, 0x0302], NFKC: [0x00E2], NFKD: [0x0061, 0x0302] }, +{ source: [0x00E3], NFC: [0x00E3], NFD: [0x0061, 0x0303], NFKC: [0x00E3], NFKD: [0x0061, 0x0303] }, +{ source: [0x00E4], NFC: [0x00E4], NFD: [0x0061, 0x0308], NFKC: [0x00E4], NFKD: [0x0061, 0x0308] }, +{ source: [0x00E5], NFC: [0x00E5], NFD: [0x0061, 0x030A], NFKC: [0x00E5], NFKD: [0x0061, 0x030A] }, +{ source: [0x00E7], NFC: [0x00E7], NFD: [0x0063, 0x0327], NFKC: [0x00E7], NFKD: [0x0063, 0x0327] }, +{ source: [0x00E8], NFC: [0x00E8], NFD: [0x0065, 0x0300], NFKC: [0x00E8], NFKD: [0x0065, 0x0300] }, +{ source: [0x00E9], NFC: [0x00E9], NFD: [0x0065, 0x0301], NFKC: [0x00E9], NFKD: [0x0065, 0x0301] }, +{ source: [0x00EA], NFC: [0x00EA], NFD: [0x0065, 0x0302], NFKC: [0x00EA], NFKD: [0x0065, 0x0302] }, +{ source: [0x00EB], NFC: [0x00EB], NFD: [0x0065, 0x0308], NFKC: [0x00EB], NFKD: [0x0065, 0x0308] }, +{ source: [0x00EC], NFC: [0x00EC], NFD: [0x0069, 0x0300], NFKC: [0x00EC], NFKD: [0x0069, 0x0300] }, +{ source: [0x00ED], NFC: [0x00ED], NFD: [0x0069, 0x0301], NFKC: [0x00ED], NFKD: [0x0069, 0x0301] }, +{ source: [0x00EE], NFC: [0x00EE], NFD: [0x0069, 0x0302], NFKC: [0x00EE], NFKD: [0x0069, 0x0302] }, +{ source: [0x00EF], NFC: [0x00EF], NFD: [0x0069, 0x0308], NFKC: [0x00EF], NFKD: [0x0069, 0x0308] }, +{ source: [0x00F1], NFC: [0x00F1], NFD: [0x006E, 0x0303], NFKC: [0x00F1], NFKD: [0x006E, 0x0303] }, +{ source: [0x00F2], NFC: [0x00F2], NFD: [0x006F, 0x0300], NFKC: [0x00F2], NFKD: [0x006F, 0x0300] }, +{ source: [0x00F3], NFC: [0x00F3], NFD: [0x006F, 0x0301], NFKC: [0x00F3], NFKD: [0x006F, 0x0301] }, +{ source: [0x00F4], NFC: [0x00F4], NFD: [0x006F, 0x0302], NFKC: [0x00F4], NFKD: [0x006F, 0x0302] }, +{ source: [0x00F5], NFC: [0x00F5], NFD: [0x006F, 0x0303], NFKC: [0x00F5], NFKD: [0x006F, 0x0303] }, +{ source: [0x00F6], NFC: [0x00F6], NFD: [0x006F, 0x0308], NFKC: [0x00F6], NFKD: [0x006F, 0x0308] }, +{ source: [0x00F9], NFC: [0x00F9], NFD: [0x0075, 0x0300], NFKC: [0x00F9], NFKD: [0x0075, 0x0300] }, +{ source: [0x00FA], NFC: [0x00FA], NFD: [0x0075, 0x0301], NFKC: [0x00FA], NFKD: [0x0075, 0x0301] }, +{ source: [0x00FB], NFC: [0x00FB], NFD: [0x0075, 0x0302], NFKC: [0x00FB], NFKD: [0x0075, 0x0302] }, +{ source: [0x00FC], NFC: [0x00FC], NFD: [0x0075, 0x0308], NFKC: [0x00FC], NFKD: [0x0075, 0x0308] }, +{ source: [0x00FD], NFC: [0x00FD], NFD: [0x0079, 0x0301], NFKC: [0x00FD], NFKD: [0x0079, 0x0301] }, +{ source: [0x00FF], NFC: [0x00FF], NFD: [0x0079, 0x0308], NFKC: [0x00FF], NFKD: [0x0079, 0x0308] }, +{ source: [0x0100], NFC: [0x0100], NFD: [0x0041, 0x0304], NFKC: [0x0100], NFKD: [0x0041, 0x0304] }, +{ source: [0x0101], NFC: [0x0101], NFD: [0x0061, 0x0304], NFKC: [0x0101], NFKD: [0x0061, 0x0304] }, +{ source: [0x0102], NFC: [0x0102], NFD: [0x0041, 0x0306], NFKC: [0x0102], NFKD: [0x0041, 0x0306] }, +{ source: [0x0103], NFC: [0x0103], NFD: [0x0061, 0x0306], NFKC: [0x0103], NFKD: [0x0061, 0x0306] }, +{ source: [0x0104], NFC: [0x0104], NFD: [0x0041, 0x0328], NFKC: [0x0104], NFKD: [0x0041, 0x0328] }, +{ source: [0x0105], NFC: [0x0105], NFD: [0x0061, 0x0328], NFKC: [0x0105], NFKD: [0x0061, 0x0328] }, +{ source: [0x0106], NFC: [0x0106], NFD: [0x0043, 0x0301], NFKC: [0x0106], NFKD: [0x0043, 0x0301] }, +{ source: [0x0107], NFC: [0x0107], NFD: [0x0063, 0x0301], NFKC: [0x0107], NFKD: [0x0063, 0x0301] }, +{ source: [0x0108], NFC: [0x0108], NFD: [0x0043, 0x0302], NFKC: [0x0108], NFKD: [0x0043, 0x0302] }, +{ source: [0x0109], NFC: [0x0109], NFD: [0x0063, 0x0302], NFKC: [0x0109], NFKD: [0x0063, 0x0302] }, +{ source: [0x010A], NFC: [0x010A], NFD: [0x0043, 0x0307], NFKC: [0x010A], NFKD: [0x0043, 0x0307] }, +{ source: [0x010B], NFC: [0x010B], NFD: [0x0063, 0x0307], NFKC: [0x010B], NFKD: [0x0063, 0x0307] }, +{ source: [0x010C], NFC: [0x010C], NFD: [0x0043, 0x030C], NFKC: [0x010C], NFKD: [0x0043, 0x030C] }, +{ source: [0x010D], NFC: [0x010D], NFD: [0x0063, 0x030C], NFKC: [0x010D], NFKD: [0x0063, 0x030C] }, +{ source: [0x010E], NFC: [0x010E], NFD: [0x0044, 0x030C], NFKC: [0x010E], NFKD: [0x0044, 0x030C] }, +{ source: [0x010F], NFC: [0x010F], NFD: [0x0064, 0x030C], NFKC: [0x010F], NFKD: [0x0064, 0x030C] }, +{ source: [0x0112], NFC: [0x0112], NFD: [0x0045, 0x0304], NFKC: [0x0112], NFKD: [0x0045, 0x0304] }, +{ source: [0x0113], NFC: [0x0113], NFD: [0x0065, 0x0304], NFKC: [0x0113], NFKD: [0x0065, 0x0304] }, +{ source: [0x0114], NFC: [0x0114], NFD: [0x0045, 0x0306], NFKC: [0x0114], NFKD: [0x0045, 0x0306] }, +{ source: [0x0115], NFC: [0x0115], NFD: [0x0065, 0x0306], NFKC: [0x0115], NFKD: [0x0065, 0x0306] }, +{ source: [0x0116], NFC: [0x0116], NFD: [0x0045, 0x0307], NFKC: [0x0116], NFKD: [0x0045, 0x0307] }, +{ source: [0x0117], NFC: [0x0117], NFD: [0x0065, 0x0307], NFKC: [0x0117], NFKD: [0x0065, 0x0307] }, +{ source: [0x0118], NFC: [0x0118], NFD: [0x0045, 0x0328], NFKC: [0x0118], NFKD: [0x0045, 0x0328] }, +{ source: [0x0119], NFC: [0x0119], NFD: [0x0065, 0x0328], NFKC: [0x0119], NFKD: [0x0065, 0x0328] }, +{ source: [0x011A], NFC: [0x011A], NFD: [0x0045, 0x030C], NFKC: [0x011A], NFKD: [0x0045, 0x030C] }, +{ source: [0x011B], NFC: [0x011B], NFD: [0x0065, 0x030C], NFKC: [0x011B], NFKD: [0x0065, 0x030C] }, +{ source: [0x011C], NFC: [0x011C], NFD: [0x0047, 0x0302], NFKC: [0x011C], NFKD: [0x0047, 0x0302] }, +{ source: [0x011D], NFC: [0x011D], NFD: [0x0067, 0x0302], NFKC: [0x011D], NFKD: [0x0067, 0x0302] }, +{ source: [0x011E], NFC: [0x011E], NFD: [0x0047, 0x0306], NFKC: [0x011E], NFKD: [0x0047, 0x0306] }, +{ source: [0x011F], NFC: [0x011F], NFD: [0x0067, 0x0306], NFKC: [0x011F], NFKD: [0x0067, 0x0306] }, +{ source: [0x0120], NFC: [0x0120], NFD: [0x0047, 0x0307], NFKC: [0x0120], NFKD: [0x0047, 0x0307] }, +{ source: [0x0121], NFC: [0x0121], NFD: [0x0067, 0x0307], NFKC: [0x0121], NFKD: [0x0067, 0x0307] }, +{ source: [0x0122], NFC: [0x0122], NFD: [0x0047, 0x0327], NFKC: [0x0122], NFKD: [0x0047, 0x0327] }, +{ source: [0x0123], NFC: [0x0123], NFD: [0x0067, 0x0327], NFKC: [0x0123], NFKD: [0x0067, 0x0327] }, +{ source: [0x0124], NFC: [0x0124], NFD: [0x0048, 0x0302], NFKC: [0x0124], NFKD: [0x0048, 0x0302] }, +{ source: [0x0125], NFC: [0x0125], NFD: [0x0068, 0x0302], NFKC: [0x0125], NFKD: [0x0068, 0x0302] }, +{ source: [0x0128], NFC: [0x0128], NFD: [0x0049, 0x0303], NFKC: [0x0128], NFKD: [0x0049, 0x0303] }, +{ source: [0x0129], NFC: [0x0129], NFD: [0x0069, 0x0303], NFKC: [0x0129], NFKD: [0x0069, 0x0303] }, +{ source: [0x012A], NFC: [0x012A], NFD: [0x0049, 0x0304], NFKC: [0x012A], NFKD: [0x0049, 0x0304] }, +{ source: [0x012B], NFC: [0x012B], NFD: [0x0069, 0x0304], NFKC: [0x012B], NFKD: [0x0069, 0x0304] }, +{ source: [0x012C], NFC: [0x012C], NFD: [0x0049, 0x0306], NFKC: [0x012C], NFKD: [0x0049, 0x0306] }, +{ source: [0x012D], NFC: [0x012D], NFD: [0x0069, 0x0306], NFKC: [0x012D], NFKD: [0x0069, 0x0306] }, +{ source: [0x012E], NFC: [0x012E], NFD: [0x0049, 0x0328], NFKC: [0x012E], NFKD: [0x0049, 0x0328] }, +{ source: [0x012F], NFC: [0x012F], NFD: [0x0069, 0x0328], NFKC: [0x012F], NFKD: [0x0069, 0x0328] }, +{ source: [0x0130], NFC: [0x0130], NFD: [0x0049, 0x0307], NFKC: [0x0130], NFKD: [0x0049, 0x0307] }, +{ source: [0x0132], NFC: [0x0132], NFD: [0x0132], NFKC: [0x0049, 0x004A], NFKD: [0x0049, 0x004A] }, +{ source: [0x0133], NFC: [0x0133], NFD: [0x0133], NFKC: [0x0069, 0x006A], NFKD: [0x0069, 0x006A] }, +{ source: [0x0134], NFC: [0x0134], NFD: [0x004A, 0x0302], NFKC: [0x0134], NFKD: [0x004A, 0x0302] }, +{ source: [0x0135], NFC: [0x0135], NFD: [0x006A, 0x0302], NFKC: [0x0135], NFKD: [0x006A, 0x0302] }, +{ source: [0x0136], NFC: [0x0136], NFD: [0x004B, 0x0327], NFKC: [0x0136], NFKD: [0x004B, 0x0327] }, +{ source: [0x0137], NFC: [0x0137], NFD: [0x006B, 0x0327], NFKC: [0x0137], NFKD: [0x006B, 0x0327] }, +{ source: [0x0139], NFC: [0x0139], NFD: [0x004C, 0x0301], NFKC: [0x0139], NFKD: [0x004C, 0x0301] }, +{ source: [0x013A], NFC: [0x013A], NFD: [0x006C, 0x0301], NFKC: [0x013A], NFKD: [0x006C, 0x0301] }, +{ source: [0x013B], NFC: [0x013B], NFD: [0x004C, 0x0327], NFKC: [0x013B], NFKD: [0x004C, 0x0327] }, +{ source: [0x013C], NFC: [0x013C], NFD: [0x006C, 0x0327], NFKC: [0x013C], NFKD: [0x006C, 0x0327] }, +{ source: [0x013D], NFC: [0x013D], NFD: [0x004C, 0x030C], NFKC: [0x013D], NFKD: [0x004C, 0x030C] }, +{ source: [0x013E], NFC: [0x013E], NFD: [0x006C, 0x030C], NFKC: [0x013E], NFKD: [0x006C, 0x030C] }, +{ source: [0x013F], NFC: [0x013F], NFD: [0x013F], NFKC: [0x004C, 0x00B7], NFKD: [0x004C, 0x00B7] }, +{ source: [0x0140], NFC: [0x0140], NFD: [0x0140], NFKC: [0x006C, 0x00B7], NFKD: [0x006C, 0x00B7] }, +{ source: [0x0143], NFC: [0x0143], NFD: [0x004E, 0x0301], NFKC: [0x0143], NFKD: [0x004E, 0x0301] }, +{ source: [0x0144], NFC: [0x0144], NFD: [0x006E, 0x0301], NFKC: [0x0144], NFKD: [0x006E, 0x0301] }, +{ source: [0x0145], NFC: [0x0145], NFD: [0x004E, 0x0327], NFKC: [0x0145], NFKD: [0x004E, 0x0327] }, +{ source: [0x0146], NFC: [0x0146], NFD: [0x006E, 0x0327], NFKC: [0x0146], NFKD: [0x006E, 0x0327] }, +{ source: [0x0147], NFC: [0x0147], NFD: [0x004E, 0x030C], NFKC: [0x0147], NFKD: [0x004E, 0x030C] }, +{ source: [0x0148], NFC: [0x0148], NFD: [0x006E, 0x030C], NFKC: [0x0148], NFKD: [0x006E, 0x030C] }, +{ source: [0x0149], NFC: [0x0149], NFD: [0x0149], NFKC: [0x02BC, 0x006E], NFKD: [0x02BC, 0x006E] }, +{ source: [0x014C], NFC: [0x014C], NFD: [0x004F, 0x0304], NFKC: [0x014C], NFKD: [0x004F, 0x0304] }, +{ source: [0x014D], NFC: [0x014D], NFD: [0x006F, 0x0304], NFKC: [0x014D], NFKD: [0x006F, 0x0304] }, +{ source: [0x014E], NFC: [0x014E], NFD: [0x004F, 0x0306], NFKC: [0x014E], NFKD: [0x004F, 0x0306] }, +{ source: [0x014F], NFC: [0x014F], NFD: [0x006F, 0x0306], NFKC: [0x014F], NFKD: [0x006F, 0x0306] }, +{ source: [0x0150], NFC: [0x0150], NFD: [0x004F, 0x030B], NFKC: [0x0150], NFKD: [0x004F, 0x030B] }, +{ source: [0x0151], NFC: [0x0151], NFD: [0x006F, 0x030B], NFKC: [0x0151], NFKD: [0x006F, 0x030B] }, +{ source: [0x0154], NFC: [0x0154], NFD: [0x0052, 0x0301], NFKC: [0x0154], NFKD: [0x0052, 0x0301] }, +{ source: [0x0155], NFC: [0x0155], NFD: [0x0072, 0x0301], NFKC: [0x0155], NFKD: [0x0072, 0x0301] }, +{ source: [0x0156], NFC: [0x0156], NFD: [0x0052, 0x0327], NFKC: [0x0156], NFKD: [0x0052, 0x0327] }, +{ source: [0x0157], NFC: [0x0157], NFD: [0x0072, 0x0327], NFKC: [0x0157], NFKD: [0x0072, 0x0327] }, +{ source: [0x0158], NFC: [0x0158], NFD: [0x0052, 0x030C], NFKC: [0x0158], NFKD: [0x0052, 0x030C] }, +{ source: [0x0159], NFC: [0x0159], NFD: [0x0072, 0x030C], NFKC: [0x0159], NFKD: [0x0072, 0x030C] }, +{ source: [0x015A], NFC: [0x015A], NFD: [0x0053, 0x0301], NFKC: [0x015A], NFKD: [0x0053, 0x0301] }, +{ source: [0x015B], NFC: [0x015B], NFD: [0x0073, 0x0301], NFKC: [0x015B], NFKD: [0x0073, 0x0301] }, +{ source: [0x015C], NFC: [0x015C], NFD: [0x0053, 0x0302], NFKC: [0x015C], NFKD: [0x0053, 0x0302] }, +{ source: [0x015D], NFC: [0x015D], NFD: [0x0073, 0x0302], NFKC: [0x015D], NFKD: [0x0073, 0x0302] }, +{ source: [0x015E], NFC: [0x015E], NFD: [0x0053, 0x0327], NFKC: [0x015E], NFKD: [0x0053, 0x0327] }, +{ source: [0x015F], NFC: [0x015F], NFD: [0x0073, 0x0327], NFKC: [0x015F], NFKD: [0x0073, 0x0327] }, +{ source: [0x0160], NFC: [0x0160], NFD: [0x0053, 0x030C], NFKC: [0x0160], NFKD: [0x0053, 0x030C] }, +{ source: [0x0161], NFC: [0x0161], NFD: [0x0073, 0x030C], NFKC: [0x0161], NFKD: [0x0073, 0x030C] }, +{ source: [0x0162], NFC: [0x0162], NFD: [0x0054, 0x0327], NFKC: [0x0162], NFKD: [0x0054, 0x0327] }, +{ source: [0x0163], NFC: [0x0163], NFD: [0x0074, 0x0327], NFKC: [0x0163], NFKD: [0x0074, 0x0327] }, +{ source: [0x0164], NFC: [0x0164], NFD: [0x0054, 0x030C], NFKC: [0x0164], NFKD: [0x0054, 0x030C] }, +{ source: [0x0165], NFC: [0x0165], NFD: [0x0074, 0x030C], NFKC: [0x0165], NFKD: [0x0074, 0x030C] }, +{ source: [0x0168], NFC: [0x0168], NFD: [0x0055, 0x0303], NFKC: [0x0168], NFKD: [0x0055, 0x0303] }, +{ source: [0x0169], NFC: [0x0169], NFD: [0x0075, 0x0303], NFKC: [0x0169], NFKD: [0x0075, 0x0303] }, +{ source: [0x016A], NFC: [0x016A], NFD: [0x0055, 0x0304], NFKC: [0x016A], NFKD: [0x0055, 0x0304] }, +{ source: [0x016B], NFC: [0x016B], NFD: [0x0075, 0x0304], NFKC: [0x016B], NFKD: [0x0075, 0x0304] }, +{ source: [0x016C], NFC: [0x016C], NFD: [0x0055, 0x0306], NFKC: [0x016C], NFKD: [0x0055, 0x0306] }, +{ source: [0x016D], NFC: [0x016D], NFD: [0x0075, 0x0306], NFKC: [0x016D], NFKD: [0x0075, 0x0306] }, +{ source: [0x016E], NFC: [0x016E], NFD: [0x0055, 0x030A], NFKC: [0x016E], NFKD: [0x0055, 0x030A] }, +{ source: [0x016F], NFC: [0x016F], NFD: [0x0075, 0x030A], NFKC: [0x016F], NFKD: [0x0075, 0x030A] }, +{ source: [0x0170], NFC: [0x0170], NFD: [0x0055, 0x030B], NFKC: [0x0170], NFKD: [0x0055, 0x030B] }, +{ source: [0x0171], NFC: [0x0171], NFD: [0x0075, 0x030B], NFKC: [0x0171], NFKD: [0x0075, 0x030B] }, +{ source: [0x0172], NFC: [0x0172], NFD: [0x0055, 0x0328], NFKC: [0x0172], NFKD: [0x0055, 0x0328] }, +{ source: [0x0173], NFC: [0x0173], NFD: [0x0075, 0x0328], NFKC: [0x0173], NFKD: [0x0075, 0x0328] }, +{ source: [0x0174], NFC: [0x0174], NFD: [0x0057, 0x0302], NFKC: [0x0174], NFKD: [0x0057, 0x0302] }, +{ source: [0x0175], NFC: [0x0175], NFD: [0x0077, 0x0302], NFKC: [0x0175], NFKD: [0x0077, 0x0302] }, +{ source: [0x0176], NFC: [0x0176], NFD: [0x0059, 0x0302], NFKC: [0x0176], NFKD: [0x0059, 0x0302] }, +{ source: [0x0177], NFC: [0x0177], NFD: [0x0079, 0x0302], NFKC: [0x0177], NFKD: [0x0079, 0x0302] }, +{ source: [0x0178], NFC: [0x0178], NFD: [0x0059, 0x0308], NFKC: [0x0178], NFKD: [0x0059, 0x0308] }, +{ source: [0x0179], NFC: [0x0179], NFD: [0x005A, 0x0301], NFKC: [0x0179], NFKD: [0x005A, 0x0301] }, +{ source: [0x017A], NFC: [0x017A], NFD: [0x007A, 0x0301], NFKC: [0x017A], NFKD: [0x007A, 0x0301] }, +{ source: [0x017B], NFC: [0x017B], NFD: [0x005A, 0x0307], NFKC: [0x017B], NFKD: [0x005A, 0x0307] }, +{ source: [0x017C], NFC: [0x017C], NFD: [0x007A, 0x0307], NFKC: [0x017C], NFKD: [0x007A, 0x0307] }, +{ source: [0x017D], NFC: [0x017D], NFD: [0x005A, 0x030C], NFKC: [0x017D], NFKD: [0x005A, 0x030C] }, +{ source: [0x017E], NFC: [0x017E], NFD: [0x007A, 0x030C], NFKC: [0x017E], NFKD: [0x007A, 0x030C] }, +{ source: [0x017F], NFC: [0x017F], NFD: [0x017F], NFKC: [0x0073], NFKD: [0x0073] }, +{ source: [0x01A0], NFC: [0x01A0], NFD: [0x004F, 0x031B], NFKC: [0x01A0], NFKD: [0x004F, 0x031B] }, +{ source: [0x01A1], NFC: [0x01A1], NFD: [0x006F, 0x031B], NFKC: [0x01A1], NFKD: [0x006F, 0x031B] }, +{ source: [0x01AF], NFC: [0x01AF], NFD: [0x0055, 0x031B], NFKC: [0x01AF], NFKD: [0x0055, 0x031B] }, +{ source: [0x01B0], NFC: [0x01B0], NFD: [0x0075, 0x031B], NFKC: [0x01B0], NFKD: [0x0075, 0x031B] }, +{ source: [0x01C4], NFC: [0x01C4], NFD: [0x01C4], NFKC: [0x0044, 0x017D], NFKD: [0x0044, 0x005A, 0x030C] }, +{ source: [0x01C5], NFC: [0x01C5], NFD: [0x01C5], NFKC: [0x0044, 0x017E], NFKD: [0x0044, 0x007A, 0x030C] }, +{ source: [0x01C6], NFC: [0x01C6], NFD: [0x01C6], NFKC: [0x0064, 0x017E], NFKD: [0x0064, 0x007A, 0x030C] }, +{ source: [0x01C7], NFC: [0x01C7], NFD: [0x01C7], NFKC: [0x004C, 0x004A], NFKD: [0x004C, 0x004A] }, +{ source: [0x01C8], NFC: [0x01C8], NFD: [0x01C8], NFKC: [0x004C, 0x006A], NFKD: [0x004C, 0x006A] }, +{ source: [0x01C9], NFC: [0x01C9], NFD: [0x01C9], NFKC: [0x006C, 0x006A], NFKD: [0x006C, 0x006A] }, +{ source: [0x01CA], NFC: [0x01CA], NFD: [0x01CA], NFKC: [0x004E, 0x004A], NFKD: [0x004E, 0x004A] }, +{ source: [0x01CB], NFC: [0x01CB], NFD: [0x01CB], NFKC: [0x004E, 0x006A], NFKD: [0x004E, 0x006A] }, +{ source: [0x01CC], NFC: [0x01CC], NFD: [0x01CC], NFKC: [0x006E, 0x006A], NFKD: [0x006E, 0x006A] }, +{ source: [0x01CD], NFC: [0x01CD], NFD: [0x0041, 0x030C], NFKC: [0x01CD], NFKD: [0x0041, 0x030C] }, +{ source: [0x01CE], NFC: [0x01CE], NFD: [0x0061, 0x030C], NFKC: [0x01CE], NFKD: [0x0061, 0x030C] }, +{ source: [0x01CF], NFC: [0x01CF], NFD: [0x0049, 0x030C], NFKC: [0x01CF], NFKD: [0x0049, 0x030C] }, +{ source: [0x01D0], NFC: [0x01D0], NFD: [0x0069, 0x030C], NFKC: [0x01D0], NFKD: [0x0069, 0x030C] }, +{ source: [0x01D1], NFC: [0x01D1], NFD: [0x004F, 0x030C], NFKC: [0x01D1], NFKD: [0x004F, 0x030C] }, +{ source: [0x01D2], NFC: [0x01D2], NFD: [0x006F, 0x030C], NFKC: [0x01D2], NFKD: [0x006F, 0x030C] }, +{ source: [0x01D3], NFC: [0x01D3], NFD: [0x0055, 0x030C], NFKC: [0x01D3], NFKD: [0x0055, 0x030C] }, +{ source: [0x01D4], NFC: [0x01D4], NFD: [0x0075, 0x030C], NFKC: [0x01D4], NFKD: [0x0075, 0x030C] }, +{ source: [0x01D5], NFC: [0x01D5], NFD: [0x0055, 0x0308, 0x0304], NFKC: [0x01D5], NFKD: [0x0055, 0x0308, 0x0304] }, +{ source: [0x01D6], NFC: [0x01D6], NFD: [0x0075, 0x0308, 0x0304], NFKC: [0x01D6], NFKD: [0x0075, 0x0308, 0x0304] }, +{ source: [0x01D7], NFC: [0x01D7], NFD: [0x0055, 0x0308, 0x0301], NFKC: [0x01D7], NFKD: [0x0055, 0x0308, 0x0301] }, +{ source: [0x01D8], NFC: [0x01D8], NFD: [0x0075, 0x0308, 0x0301], NFKC: [0x01D8], NFKD: [0x0075, 0x0308, 0x0301] }, +{ source: [0x01D9], NFC: [0x01D9], NFD: [0x0055, 0x0308, 0x030C], NFKC: [0x01D9], NFKD: [0x0055, 0x0308, 0x030C] }, +{ source: [0x01DA], NFC: [0x01DA], NFD: [0x0075, 0x0308, 0x030C], NFKC: [0x01DA], NFKD: [0x0075, 0x0308, 0x030C] }, +{ source: [0x01DB], NFC: [0x01DB], NFD: [0x0055, 0x0308, 0x0300], NFKC: [0x01DB], NFKD: [0x0055, 0x0308, 0x0300] }, +{ source: [0x01DC], NFC: [0x01DC], NFD: [0x0075, 0x0308, 0x0300], NFKC: [0x01DC], NFKD: [0x0075, 0x0308, 0x0300] }, +{ source: [0x01DE], NFC: [0x01DE], NFD: [0x0041, 0x0308, 0x0304], NFKC: [0x01DE], NFKD: [0x0041, 0x0308, 0x0304] }, +{ source: [0x01DF], NFC: [0x01DF], NFD: [0x0061, 0x0308, 0x0304], NFKC: [0x01DF], NFKD: [0x0061, 0x0308, 0x0304] }, +{ source: [0x01E0], NFC: [0x01E0], NFD: [0x0041, 0x0307, 0x0304], NFKC: [0x01E0], NFKD: [0x0041, 0x0307, 0x0304] }, +{ source: [0x01E1], NFC: [0x01E1], NFD: [0x0061, 0x0307, 0x0304], NFKC: [0x01E1], NFKD: [0x0061, 0x0307, 0x0304] }, +{ source: [0x01E2], NFC: [0x01E2], NFD: [0x00C6, 0x0304], NFKC: [0x01E2], NFKD: [0x00C6, 0x0304] }, +{ source: [0x01E3], NFC: [0x01E3], NFD: [0x00E6, 0x0304], NFKC: [0x01E3], NFKD: [0x00E6, 0x0304] }, +{ source: [0x01E6], NFC: [0x01E6], NFD: [0x0047, 0x030C], NFKC: [0x01E6], NFKD: [0x0047, 0x030C] }, +{ source: [0x01E7], NFC: [0x01E7], NFD: [0x0067, 0x030C], NFKC: [0x01E7], NFKD: [0x0067, 0x030C] }, +{ source: [0x01E8], NFC: [0x01E8], NFD: [0x004B, 0x030C], NFKC: [0x01E8], NFKD: [0x004B, 0x030C] }, +{ source: [0x01E9], NFC: [0x01E9], NFD: [0x006B, 0x030C], NFKC: [0x01E9], NFKD: [0x006B, 0x030C] }, +{ source: [0x01EA], NFC: [0x01EA], NFD: [0x004F, 0x0328], NFKC: [0x01EA], NFKD: [0x004F, 0x0328] }, +{ source: [0x01EB], NFC: [0x01EB], NFD: [0x006F, 0x0328], NFKC: [0x01EB], NFKD: [0x006F, 0x0328] }, +{ source: [0x01EC], NFC: [0x01EC], NFD: [0x004F, 0x0328, 0x0304], NFKC: [0x01EC], NFKD: [0x004F, 0x0328, 0x0304] }, +{ source: [0x01ED], NFC: [0x01ED], NFD: [0x006F, 0x0328, 0x0304], NFKC: [0x01ED], NFKD: [0x006F, 0x0328, 0x0304] }, +{ source: [0x01EE], NFC: [0x01EE], NFD: [0x01B7, 0x030C], NFKC: [0x01EE], NFKD: [0x01B7, 0x030C] }, +{ source: [0x01EF], NFC: [0x01EF], NFD: [0x0292, 0x030C], NFKC: [0x01EF], NFKD: [0x0292, 0x030C] }, +{ source: [0x01F0], NFC: [0x01F0], NFD: [0x006A, 0x030C], NFKC: [0x01F0], NFKD: [0x006A, 0x030C] }, +{ source: [0x01F1], NFC: [0x01F1], NFD: [0x01F1], NFKC: [0x0044, 0x005A], NFKD: [0x0044, 0x005A] }, +{ source: [0x01F2], NFC: [0x01F2], NFD: [0x01F2], NFKC: [0x0044, 0x007A], NFKD: [0x0044, 0x007A] }, +{ source: [0x01F3], NFC: [0x01F3], NFD: [0x01F3], NFKC: [0x0064, 0x007A], NFKD: [0x0064, 0x007A] }, +{ source: [0x01F4], NFC: [0x01F4], NFD: [0x0047, 0x0301], NFKC: [0x01F4], NFKD: [0x0047, 0x0301] }, +{ source: [0x01F5], NFC: [0x01F5], NFD: [0x0067, 0x0301], NFKC: [0x01F5], NFKD: [0x0067, 0x0301] }, +{ source: [0x01F8], NFC: [0x01F8], NFD: [0x004E, 0x0300], NFKC: [0x01F8], NFKD: [0x004E, 0x0300] }, +{ source: [0x01F9], NFC: [0x01F9], NFD: [0x006E, 0x0300], NFKC: [0x01F9], NFKD: [0x006E, 0x0300] }, +{ source: [0x01FA], NFC: [0x01FA], NFD: [0x0041, 0x030A, 0x0301], NFKC: [0x01FA], NFKD: [0x0041, 0x030A, 0x0301] }, +{ source: [0x01FB], NFC: [0x01FB], NFD: [0x0061, 0x030A, 0x0301], NFKC: [0x01FB], NFKD: [0x0061, 0x030A, 0x0301] }, +{ source: [0x01FC], NFC: [0x01FC], NFD: [0x00C6, 0x0301], NFKC: [0x01FC], NFKD: [0x00C6, 0x0301] }, +{ source: [0x01FD], NFC: [0x01FD], NFD: [0x00E6, 0x0301], NFKC: [0x01FD], NFKD: [0x00E6, 0x0301] }, +{ source: [0x01FE], NFC: [0x01FE], NFD: [0x00D8, 0x0301], NFKC: [0x01FE], NFKD: [0x00D8, 0x0301] }, +{ source: [0x01FF], NFC: [0x01FF], NFD: [0x00F8, 0x0301], NFKC: [0x01FF], NFKD: [0x00F8, 0x0301] }, +{ source: [0x0200], NFC: [0x0200], NFD: [0x0041, 0x030F], NFKC: [0x0200], NFKD: [0x0041, 0x030F] }, +{ source: [0x0201], NFC: [0x0201], NFD: [0x0061, 0x030F], NFKC: [0x0201], NFKD: [0x0061, 0x030F] }, +{ source: [0x0202], NFC: [0x0202], NFD: [0x0041, 0x0311], NFKC: [0x0202], NFKD: [0x0041, 0x0311] }, +{ source: [0x0203], NFC: [0x0203], NFD: [0x0061, 0x0311], NFKC: [0x0203], NFKD: [0x0061, 0x0311] }, +{ source: [0x0204], NFC: [0x0204], NFD: [0x0045, 0x030F], NFKC: [0x0204], NFKD: [0x0045, 0x030F] }, +{ source: [0x0205], NFC: [0x0205], NFD: [0x0065, 0x030F], NFKC: [0x0205], NFKD: [0x0065, 0x030F] }, +{ source: [0x0206], NFC: [0x0206], NFD: [0x0045, 0x0311], NFKC: [0x0206], NFKD: [0x0045, 0x0311] }, +{ source: [0x0207], NFC: [0x0207], NFD: [0x0065, 0x0311], NFKC: [0x0207], NFKD: [0x0065, 0x0311] }, +{ source: [0x0208], NFC: [0x0208], NFD: [0x0049, 0x030F], NFKC: [0x0208], NFKD: [0x0049, 0x030F] }, +{ source: [0x0209], NFC: [0x0209], NFD: [0x0069, 0x030F], NFKC: [0x0209], NFKD: [0x0069, 0x030F] }, +{ source: [0x020A], NFC: [0x020A], NFD: [0x0049, 0x0311], NFKC: [0x020A], NFKD: [0x0049, 0x0311] }, +{ source: [0x020B], NFC: [0x020B], NFD: [0x0069, 0x0311], NFKC: [0x020B], NFKD: [0x0069, 0x0311] }, +{ source: [0x020C], NFC: [0x020C], NFD: [0x004F, 0x030F], NFKC: [0x020C], NFKD: [0x004F, 0x030F] }, +{ source: [0x020D], NFC: [0x020D], NFD: [0x006F, 0x030F], NFKC: [0x020D], NFKD: [0x006F, 0x030F] }, +{ source: [0x020E], NFC: [0x020E], NFD: [0x004F, 0x0311], NFKC: [0x020E], NFKD: [0x004F, 0x0311] }, +{ source: [0x020F], NFC: [0x020F], NFD: [0x006F, 0x0311], NFKC: [0x020F], NFKD: [0x006F, 0x0311] }, +{ source: [0x0210], NFC: [0x0210], NFD: [0x0052, 0x030F], NFKC: [0x0210], NFKD: [0x0052, 0x030F] }, +{ source: [0x0211], NFC: [0x0211], NFD: [0x0072, 0x030F], NFKC: [0x0211], NFKD: [0x0072, 0x030F] }, +{ source: [0x0212], NFC: [0x0212], NFD: [0x0052, 0x0311], NFKC: [0x0212], NFKD: [0x0052, 0x0311] }, +{ source: [0x0213], NFC: [0x0213], NFD: [0x0072, 0x0311], NFKC: [0x0213], NFKD: [0x0072, 0x0311] }, +{ source: [0x0214], NFC: [0x0214], NFD: [0x0055, 0x030F], NFKC: [0x0214], NFKD: [0x0055, 0x030F] }, +{ source: [0x0215], NFC: [0x0215], NFD: [0x0075, 0x030F], NFKC: [0x0215], NFKD: [0x0075, 0x030F] }, +{ source: [0x0216], NFC: [0x0216], NFD: [0x0055, 0x0311], NFKC: [0x0216], NFKD: [0x0055, 0x0311] }, +{ source: [0x0217], NFC: [0x0217], NFD: [0x0075, 0x0311], NFKC: [0x0217], NFKD: [0x0075, 0x0311] }, +{ source: [0x0218], NFC: [0x0218], NFD: [0x0053, 0x0326], NFKC: [0x0218], NFKD: [0x0053, 0x0326] }, +{ source: [0x0219], NFC: [0x0219], NFD: [0x0073, 0x0326], NFKC: [0x0219], NFKD: [0x0073, 0x0326] }, +{ source: [0x021A], NFC: [0x021A], NFD: [0x0054, 0x0326], NFKC: [0x021A], NFKD: [0x0054, 0x0326] }, +{ source: [0x021B], NFC: [0x021B], NFD: [0x0074, 0x0326], NFKC: [0x021B], NFKD: [0x0074, 0x0326] }, +{ source: [0x021E], NFC: [0x021E], NFD: [0x0048, 0x030C], NFKC: [0x021E], NFKD: [0x0048, 0x030C] }, +{ source: [0x021F], NFC: [0x021F], NFD: [0x0068, 0x030C], NFKC: [0x021F], NFKD: [0x0068, 0x030C] }, +{ source: [0x0226], NFC: [0x0226], NFD: [0x0041, 0x0307], NFKC: [0x0226], NFKD: [0x0041, 0x0307] }, +{ source: [0x0227], NFC: [0x0227], NFD: [0x0061, 0x0307], NFKC: [0x0227], NFKD: [0x0061, 0x0307] }, +{ source: [0x0228], NFC: [0x0228], NFD: [0x0045, 0x0327], NFKC: [0x0228], NFKD: [0x0045, 0x0327] }, +{ source: [0x0229], NFC: [0x0229], NFD: [0x0065, 0x0327], NFKC: [0x0229], NFKD: [0x0065, 0x0327] }, +{ source: [0x022A], NFC: [0x022A], NFD: [0x004F, 0x0308, 0x0304], NFKC: [0x022A], NFKD: [0x004F, 0x0308, 0x0304] }, +{ source: [0x022B], NFC: [0x022B], NFD: [0x006F, 0x0308, 0x0304], NFKC: [0x022B], NFKD: [0x006F, 0x0308, 0x0304] }, +{ source: [0x022C], NFC: [0x022C], NFD: [0x004F, 0x0303, 0x0304], NFKC: [0x022C], NFKD: [0x004F, 0x0303, 0x0304] }, +{ source: [0x022D], NFC: [0x022D], NFD: [0x006F, 0x0303, 0x0304], NFKC: [0x022D], NFKD: [0x006F, 0x0303, 0x0304] }, +{ source: [0x022E], NFC: [0x022E], NFD: [0x004F, 0x0307], NFKC: [0x022E], NFKD: [0x004F, 0x0307] }, +{ source: [0x022F], NFC: [0x022F], NFD: [0x006F, 0x0307], NFKC: [0x022F], NFKD: [0x006F, 0x0307] }, +{ source: [0x0230], NFC: [0x0230], NFD: [0x004F, 0x0307, 0x0304], NFKC: [0x0230], NFKD: [0x004F, 0x0307, 0x0304] }, +{ source: [0x0231], NFC: [0x0231], NFD: [0x006F, 0x0307, 0x0304], NFKC: [0x0231], NFKD: [0x006F, 0x0307, 0x0304] }, +{ source: [0x0232], NFC: [0x0232], NFD: [0x0059, 0x0304], NFKC: [0x0232], NFKD: [0x0059, 0x0304] }, +{ source: [0x0233], NFC: [0x0233], NFD: [0x0079, 0x0304], NFKC: [0x0233], NFKD: [0x0079, 0x0304] }, +{ source: [0x02B0], NFC: [0x02B0], NFD: [0x02B0], NFKC: [0x0068], NFKD: [0x0068] }, +{ source: [0x02B1], NFC: [0x02B1], NFD: [0x02B1], NFKC: [0x0266], NFKD: [0x0266] }, +{ source: [0x02B2], NFC: [0x02B2], NFD: [0x02B2], NFKC: [0x006A], NFKD: [0x006A] }, +{ source: [0x02B3], NFC: [0x02B3], NFD: [0x02B3], NFKC: [0x0072], NFKD: [0x0072] }, +{ source: [0x02B4], NFC: [0x02B4], NFD: [0x02B4], NFKC: [0x0279], NFKD: [0x0279] }, +{ source: [0x02B5], NFC: [0x02B5], NFD: [0x02B5], NFKC: [0x027B], NFKD: [0x027B] }, +{ source: [0x02B6], NFC: [0x02B6], NFD: [0x02B6], NFKC: [0x0281], NFKD: [0x0281] }, +{ source: [0x02B7], NFC: [0x02B7], NFD: [0x02B7], NFKC: [0x0077], NFKD: [0x0077] }, +{ source: [0x02B8], NFC: [0x02B8], NFD: [0x02B8], NFKC: [0x0079], NFKD: [0x0079] }, +{ source: [0x02D8], NFC: [0x02D8], NFD: [0x02D8], NFKC: [0x0020, 0x0306], NFKD: [0x0020, 0x0306] }, +{ source: [0x02D9], NFC: [0x02D9], NFD: [0x02D9], NFKC: [0x0020, 0x0307], NFKD: [0x0020, 0x0307] }, +{ source: [0x02DA], NFC: [0x02DA], NFD: [0x02DA], NFKC: [0x0020, 0x030A], NFKD: [0x0020, 0x030A] }, +{ source: [0x02DB], NFC: [0x02DB], NFD: [0x02DB], NFKC: [0x0020, 0x0328], NFKD: [0x0020, 0x0328] }, +{ source: [0x02DC], NFC: [0x02DC], NFD: [0x02DC], NFKC: [0x0020, 0x0303], NFKD: [0x0020, 0x0303] }, +{ source: [0x02DD], NFC: [0x02DD], NFD: [0x02DD], NFKC: [0x0020, 0x030B], NFKD: [0x0020, 0x030B] }, +{ source: [0x02E0], NFC: [0x02E0], NFD: [0x02E0], NFKC: [0x0263], NFKD: [0x0263] }, +{ source: [0x02E1], NFC: [0x02E1], NFD: [0x02E1], NFKC: [0x006C], NFKD: [0x006C] }, +{ source: [0x02E2], NFC: [0x02E2], NFD: [0x02E2], NFKC: [0x0073], NFKD: [0x0073] }, +{ source: [0x02E3], NFC: [0x02E3], NFD: [0x02E3], NFKC: [0x0078], NFKD: [0x0078] }, +{ source: [0x02E4], NFC: [0x02E4], NFD: [0x02E4], NFKC: [0x0295], NFKD: [0x0295] }, +{ source: [0x0340], NFC: [0x0300], NFD: [0x0300], NFKC: [0x0300], NFKD: [0x0300] }, +{ source: [0x0341], NFC: [0x0301], NFD: [0x0301], NFKC: [0x0301], NFKD: [0x0301] }, +{ source: [0x0343], NFC: [0x0313], NFD: [0x0313], NFKC: [0x0313], NFKD: [0x0313] }, +{ source: [0x0344], NFC: [0x0308, 0x0301], NFD: [0x0308, 0x0301], NFKC: [0x0308, 0x0301], NFKD: [0x0308, 0x0301] }, +{ source: [0x0374], NFC: [0x02B9], NFD: [0x02B9], NFKC: [0x02B9], NFKD: [0x02B9] }, +{ source: [0x037A], NFC: [0x037A], NFD: [0x037A], NFKC: [0x0020, 0x0345], NFKD: [0x0020, 0x0345] }, +{ source: [0x037E], NFC: [0x003B], NFD: [0x003B], NFKC: [0x003B], NFKD: [0x003B] }, +{ source: [0x0384], NFC: [0x0384], NFD: [0x0384], NFKC: [0x0020, 0x0301], NFKD: [0x0020, 0x0301] }, +{ source: [0x0385], NFC: [0x0385], NFD: [0x00A8, 0x0301], NFKC: [0x0020, 0x0308, 0x0301], NFKD: [0x0020, 0x0308, 0x0301] }, +{ source: [0x0386], NFC: [0x0386], NFD: [0x0391, 0x0301], NFKC: [0x0386], NFKD: [0x0391, 0x0301] }, +{ source: [0x0387], NFC: [0x00B7], NFD: [0x00B7], NFKC: [0x00B7], NFKD: [0x00B7] }, +{ source: [0x0388], NFC: [0x0388], NFD: [0x0395, 0x0301], NFKC: [0x0388], NFKD: [0x0395, 0x0301] }, +{ source: [0x0389], NFC: [0x0389], NFD: [0x0397, 0x0301], NFKC: [0x0389], NFKD: [0x0397, 0x0301] }, +{ source: [0x038A], NFC: [0x038A], NFD: [0x0399, 0x0301], NFKC: [0x038A], NFKD: [0x0399, 0x0301] }, +{ source: [0x038C], NFC: [0x038C], NFD: [0x039F, 0x0301], NFKC: [0x038C], NFKD: [0x039F, 0x0301] }, +{ source: [0x038E], NFC: [0x038E], NFD: [0x03A5, 0x0301], NFKC: [0x038E], NFKD: [0x03A5, 0x0301] }, +{ source: [0x038F], NFC: [0x038F], NFD: [0x03A9, 0x0301], NFKC: [0x038F], NFKD: [0x03A9, 0x0301] }, +{ source: [0x0390], NFC: [0x0390], NFD: [0x03B9, 0x0308, 0x0301], NFKC: [0x0390], NFKD: [0x03B9, 0x0308, 0x0301] }, +{ source: [0x03AA], NFC: [0x03AA], NFD: [0x0399, 0x0308], NFKC: [0x03AA], NFKD: [0x0399, 0x0308] }, +{ source: [0x03AB], NFC: [0x03AB], NFD: [0x03A5, 0x0308], NFKC: [0x03AB], NFKD: [0x03A5, 0x0308] }, +{ source: [0x03AC], NFC: [0x03AC], NFD: [0x03B1, 0x0301], NFKC: [0x03AC], NFKD: [0x03B1, 0x0301] }, +{ source: [0x03AD], NFC: [0x03AD], NFD: [0x03B5, 0x0301], NFKC: [0x03AD], NFKD: [0x03B5, 0x0301] }, +{ source: [0x03AE], NFC: [0x03AE], NFD: [0x03B7, 0x0301], NFKC: [0x03AE], NFKD: [0x03B7, 0x0301] }, +{ source: [0x03AF], NFC: [0x03AF], NFD: [0x03B9, 0x0301], NFKC: [0x03AF], NFKD: [0x03B9, 0x0301] }, +{ source: [0x03B0], NFC: [0x03B0], NFD: [0x03C5, 0x0308, 0x0301], NFKC: [0x03B0], NFKD: [0x03C5, 0x0308, 0x0301] }, +{ source: [0x03CA], NFC: [0x03CA], NFD: [0x03B9, 0x0308], NFKC: [0x03CA], NFKD: [0x03B9, 0x0308] }, +{ source: [0x03CB], NFC: [0x03CB], NFD: [0x03C5, 0x0308], NFKC: [0x03CB], NFKD: [0x03C5, 0x0308] }, +{ source: [0x03CC], NFC: [0x03CC], NFD: [0x03BF, 0x0301], NFKC: [0x03CC], NFKD: [0x03BF, 0x0301] }, +{ source: [0x03CD], NFC: [0x03CD], NFD: [0x03C5, 0x0301], NFKC: [0x03CD], NFKD: [0x03C5, 0x0301] }, +{ source: [0x03CE], NFC: [0x03CE], NFD: [0x03C9, 0x0301], NFKC: [0x03CE], NFKD: [0x03C9, 0x0301] }, +{ source: [0x03D0], NFC: [0x03D0], NFD: [0x03D0], NFKC: [0x03B2], NFKD: [0x03B2] }, +{ source: [0x03D1], NFC: [0x03D1], NFD: [0x03D1], NFKC: [0x03B8], NFKD: [0x03B8] }, +{ source: [0x03D2], NFC: [0x03D2], NFD: [0x03D2], NFKC: [0x03A5], NFKD: [0x03A5] }, +{ source: [0x03D3], NFC: [0x03D3], NFD: [0x03D2, 0x0301], NFKC: [0x038E], NFKD: [0x03A5, 0x0301] }, +{ source: [0x03D4], NFC: [0x03D4], NFD: [0x03D2, 0x0308], NFKC: [0x03AB], NFKD: [0x03A5, 0x0308] }, +{ source: [0x03D5], NFC: [0x03D5], NFD: [0x03D5], NFKC: [0x03C6], NFKD: [0x03C6] }, +{ source: [0x03D6], NFC: [0x03D6], NFD: [0x03D6], NFKC: [0x03C0], NFKD: [0x03C0] }, +{ source: [0x03F0], NFC: [0x03F0], NFD: [0x03F0], NFKC: [0x03BA], NFKD: [0x03BA] }, +{ source: [0x03F1], NFC: [0x03F1], NFD: [0x03F1], NFKC: [0x03C1], NFKD: [0x03C1] }, +{ source: [0x03F2], NFC: [0x03F2], NFD: [0x03F2], NFKC: [0x03C2], NFKD: [0x03C2] }, +{ source: [0x03F4], NFC: [0x03F4], NFD: [0x03F4], NFKC: [0x0398], NFKD: [0x0398] }, +{ source: [0x03F5], NFC: [0x03F5], NFD: [0x03F5], NFKC: [0x03B5], NFKD: [0x03B5] }, +{ source: [0x03F9], NFC: [0x03F9], NFD: [0x03F9], NFKC: [0x03A3], NFKD: [0x03A3] }, +{ source: [0x0400], NFC: [0x0400], NFD: [0x0415, 0x0300], NFKC: [0x0400], NFKD: [0x0415, 0x0300] }, +{ source: [0x0401], NFC: [0x0401], NFD: [0x0415, 0x0308], NFKC: [0x0401], NFKD: [0x0415, 0x0308] }, +{ source: [0x0403], NFC: [0x0403], NFD: [0x0413, 0x0301], NFKC: [0x0403], NFKD: [0x0413, 0x0301] }, +{ source: [0x0407], NFC: [0x0407], NFD: [0x0406, 0x0308], NFKC: [0x0407], NFKD: [0x0406, 0x0308] }, +{ source: [0x040C], NFC: [0x040C], NFD: [0x041A, 0x0301], NFKC: [0x040C], NFKD: [0x041A, 0x0301] }, +{ source: [0x040D], NFC: [0x040D], NFD: [0x0418, 0x0300], NFKC: [0x040D], NFKD: [0x0418, 0x0300] }, +{ source: [0x040E], NFC: [0x040E], NFD: [0x0423, 0x0306], NFKC: [0x040E], NFKD: [0x0423, 0x0306] }, +{ source: [0x0419], NFC: [0x0419], NFD: [0x0418, 0x0306], NFKC: [0x0419], NFKD: [0x0418, 0x0306] }, +{ source: [0x0439], NFC: [0x0439], NFD: [0x0438, 0x0306], NFKC: [0x0439], NFKD: [0x0438, 0x0306] }, +{ source: [0x0450], NFC: [0x0450], NFD: [0x0435, 0x0300], NFKC: [0x0450], NFKD: [0x0435, 0x0300] }, +{ source: [0x0451], NFC: [0x0451], NFD: [0x0435, 0x0308], NFKC: [0x0451], NFKD: [0x0435, 0x0308] }, +{ source: [0x0453], NFC: [0x0453], NFD: [0x0433, 0x0301], NFKC: [0x0453], NFKD: [0x0433, 0x0301] }, +{ source: [0x0457], NFC: [0x0457], NFD: [0x0456, 0x0308], NFKC: [0x0457], NFKD: [0x0456, 0x0308] }, +{ source: [0x045C], NFC: [0x045C], NFD: [0x043A, 0x0301], NFKC: [0x045C], NFKD: [0x043A, 0x0301] }, +{ source: [0x045D], NFC: [0x045D], NFD: [0x0438, 0x0300], NFKC: [0x045D], NFKD: [0x0438, 0x0300] }, +{ source: [0x045E], NFC: [0x045E], NFD: [0x0443, 0x0306], NFKC: [0x045E], NFKD: [0x0443, 0x0306] }, +{ source: [0x0476], NFC: [0x0476], NFD: [0x0474, 0x030F], NFKC: [0x0476], NFKD: [0x0474, 0x030F] }, +{ source: [0x0477], NFC: [0x0477], NFD: [0x0475, 0x030F], NFKC: [0x0477], NFKD: [0x0475, 0x030F] }, +{ source: [0x04C1], NFC: [0x04C1], NFD: [0x0416, 0x0306], NFKC: [0x04C1], NFKD: [0x0416, 0x0306] }, +{ source: [0x04C2], NFC: [0x04C2], NFD: [0x0436, 0x0306], NFKC: [0x04C2], NFKD: [0x0436, 0x0306] }, +{ source: [0x04D0], NFC: [0x04D0], NFD: [0x0410, 0x0306], NFKC: [0x04D0], NFKD: [0x0410, 0x0306] }, +{ source: [0x04D1], NFC: [0x04D1], NFD: [0x0430, 0x0306], NFKC: [0x04D1], NFKD: [0x0430, 0x0306] }, +{ source: [0x04D2], NFC: [0x04D2], NFD: [0x0410, 0x0308], NFKC: [0x04D2], NFKD: [0x0410, 0x0308] }, +{ source: [0x04D3], NFC: [0x04D3], NFD: [0x0430, 0x0308], NFKC: [0x04D3], NFKD: [0x0430, 0x0308] }, +{ source: [0x04D6], NFC: [0x04D6], NFD: [0x0415, 0x0306], NFKC: [0x04D6], NFKD: [0x0415, 0x0306] }, +{ source: [0x04D7], NFC: [0x04D7], NFD: [0x0435, 0x0306], NFKC: [0x04D7], NFKD: [0x0435, 0x0306] }, +{ source: [0x04DA], NFC: [0x04DA], NFD: [0x04D8, 0x0308], NFKC: [0x04DA], NFKD: [0x04D8, 0x0308] }, +{ source: [0x04DB], NFC: [0x04DB], NFD: [0x04D9, 0x0308], NFKC: [0x04DB], NFKD: [0x04D9, 0x0308] }, +{ source: [0x04DC], NFC: [0x04DC], NFD: [0x0416, 0x0308], NFKC: [0x04DC], NFKD: [0x0416, 0x0308] }, +{ source: [0x04DD], NFC: [0x04DD], NFD: [0x0436, 0x0308], NFKC: [0x04DD], NFKD: [0x0436, 0x0308] }, +{ source: [0x04DE], NFC: [0x04DE], NFD: [0x0417, 0x0308], NFKC: [0x04DE], NFKD: [0x0417, 0x0308] }, +{ source: [0x04DF], NFC: [0x04DF], NFD: [0x0437, 0x0308], NFKC: [0x04DF], NFKD: [0x0437, 0x0308] }, +{ source: [0x04E2], NFC: [0x04E2], NFD: [0x0418, 0x0304], NFKC: [0x04E2], NFKD: [0x0418, 0x0304] }, +{ source: [0x04E3], NFC: [0x04E3], NFD: [0x0438, 0x0304], NFKC: [0x04E3], NFKD: [0x0438, 0x0304] }, +{ source: [0x04E4], NFC: [0x04E4], NFD: [0x0418, 0x0308], NFKC: [0x04E4], NFKD: [0x0418, 0x0308] }, +{ source: [0x04E5], NFC: [0x04E5], NFD: [0x0438, 0x0308], NFKC: [0x04E5], NFKD: [0x0438, 0x0308] }, +{ source: [0x04E6], NFC: [0x04E6], NFD: [0x041E, 0x0308], NFKC: [0x04E6], NFKD: [0x041E, 0x0308] }, +{ source: [0x04E7], NFC: [0x04E7], NFD: [0x043E, 0x0308], NFKC: [0x04E7], NFKD: [0x043E, 0x0308] }, +{ source: [0x04EA], NFC: [0x04EA], NFD: [0x04E8, 0x0308], NFKC: [0x04EA], NFKD: [0x04E8, 0x0308] }, +{ source: [0x04EB], NFC: [0x04EB], NFD: [0x04E9, 0x0308], NFKC: [0x04EB], NFKD: [0x04E9, 0x0308] }, +{ source: [0x04EC], NFC: [0x04EC], NFD: [0x042D, 0x0308], NFKC: [0x04EC], NFKD: [0x042D, 0x0308] }, +{ source: [0x04ED], NFC: [0x04ED], NFD: [0x044D, 0x0308], NFKC: [0x04ED], NFKD: [0x044D, 0x0308] }, +{ source: [0x04EE], NFC: [0x04EE], NFD: [0x0423, 0x0304], NFKC: [0x04EE], NFKD: [0x0423, 0x0304] }, +{ source: [0x04EF], NFC: [0x04EF], NFD: [0x0443, 0x0304], NFKC: [0x04EF], NFKD: [0x0443, 0x0304] }, +{ source: [0x04F0], NFC: [0x04F0], NFD: [0x0423, 0x0308], NFKC: [0x04F0], NFKD: [0x0423, 0x0308] }, +{ source: [0x04F1], NFC: [0x04F1], NFD: [0x0443, 0x0308], NFKC: [0x04F1], NFKD: [0x0443, 0x0308] }, +{ source: [0x04F2], NFC: [0x04F2], NFD: [0x0423, 0x030B], NFKC: [0x04F2], NFKD: [0x0423, 0x030B] }, +{ source: [0x04F3], NFC: [0x04F3], NFD: [0x0443, 0x030B], NFKC: [0x04F3], NFKD: [0x0443, 0x030B] }, +{ source: [0x04F4], NFC: [0x04F4], NFD: [0x0427, 0x0308], NFKC: [0x04F4], NFKD: [0x0427, 0x0308] }, +{ source: [0x04F5], NFC: [0x04F5], NFD: [0x0447, 0x0308], NFKC: [0x04F5], NFKD: [0x0447, 0x0308] }, +{ source: [0x04F8], NFC: [0x04F8], NFD: [0x042B, 0x0308], NFKC: [0x04F8], NFKD: [0x042B, 0x0308] }, +{ source: [0x04F9], NFC: [0x04F9], NFD: [0x044B, 0x0308], NFKC: [0x04F9], NFKD: [0x044B, 0x0308] }, +{ source: [0x0587], NFC: [0x0587], NFD: [0x0587], NFKC: [0x0565, 0x0582], NFKD: [0x0565, 0x0582] }, +{ source: [0x0622], NFC: [0x0622], NFD: [0x0627, 0x0653], NFKC: [0x0622], NFKD: [0x0627, 0x0653] }, +{ source: [0x0623], NFC: [0x0623], NFD: [0x0627, 0x0654], NFKC: [0x0623], NFKD: [0x0627, 0x0654] }, +{ source: [0x0624], NFC: [0x0624], NFD: [0x0648, 0x0654], NFKC: [0x0624], NFKD: [0x0648, 0x0654] }, +{ source: [0x0625], NFC: [0x0625], NFD: [0x0627, 0x0655], NFKC: [0x0625], NFKD: [0x0627, 0x0655] }, +{ source: [0x0626], NFC: [0x0626], NFD: [0x064A, 0x0654], NFKC: [0x0626], NFKD: [0x064A, 0x0654] }, +{ source: [0x0675], NFC: [0x0675], NFD: [0x0675], NFKC: [0x0627, 0x0674], NFKD: [0x0627, 0x0674] }, +{ source: [0x0676], NFC: [0x0676], NFD: [0x0676], NFKC: [0x0648, 0x0674], NFKD: [0x0648, 0x0674] }, +{ source: [0x0677], NFC: [0x0677], NFD: [0x0677], NFKC: [0x06C7, 0x0674], NFKD: [0x06C7, 0x0674] }, +{ source: [0x0678], NFC: [0x0678], NFD: [0x0678], NFKC: [0x064A, 0x0674], NFKD: [0x064A, 0x0674] }, +{ source: [0x06C0], NFC: [0x06C0], NFD: [0x06D5, 0x0654], NFKC: [0x06C0], NFKD: [0x06D5, 0x0654] }, +{ source: [0x06C2], NFC: [0x06C2], NFD: [0x06C1, 0x0654], NFKC: [0x06C2], NFKD: [0x06C1, 0x0654] }, +{ source: [0x06D3], NFC: [0x06D3], NFD: [0x06D2, 0x0654], NFKC: [0x06D3], NFKD: [0x06D2, 0x0654] }, +{ source: [0x0929], NFC: [0x0929], NFD: [0x0928, 0x093C], NFKC: [0x0929], NFKD: [0x0928, 0x093C] }, +{ source: [0x0931], NFC: [0x0931], NFD: [0x0930, 0x093C], NFKC: [0x0931], NFKD: [0x0930, 0x093C] }, +{ source: [0x0934], NFC: [0x0934], NFD: [0x0933, 0x093C], NFKC: [0x0934], NFKD: [0x0933, 0x093C] }, +{ source: [0x0958], NFC: [0x0915, 0x093C], NFD: [0x0915, 0x093C], NFKC: [0x0915, 0x093C], NFKD: [0x0915, 0x093C] }, +{ source: [0x0959], NFC: [0x0916, 0x093C], NFD: [0x0916, 0x093C], NFKC: [0x0916, 0x093C], NFKD: [0x0916, 0x093C] }, +{ source: [0x095A], NFC: [0x0917, 0x093C], NFD: [0x0917, 0x093C], NFKC: [0x0917, 0x093C], NFKD: [0x0917, 0x093C] }, +{ source: [0x095B], NFC: [0x091C, 0x093C], NFD: [0x091C, 0x093C], NFKC: [0x091C, 0x093C], NFKD: [0x091C, 0x093C] }, +{ source: [0x095C], NFC: [0x0921, 0x093C], NFD: [0x0921, 0x093C], NFKC: [0x0921, 0x093C], NFKD: [0x0921, 0x093C] }, +{ source: [0x095D], NFC: [0x0922, 0x093C], NFD: [0x0922, 0x093C], NFKC: [0x0922, 0x093C], NFKD: [0x0922, 0x093C] }, +{ source: [0x095E], NFC: [0x092B, 0x093C], NFD: [0x092B, 0x093C], NFKC: [0x092B, 0x093C], NFKD: [0x092B, 0x093C] }, +{ source: [0x095F], NFC: [0x092F, 0x093C], NFD: [0x092F, 0x093C], NFKC: [0x092F, 0x093C], NFKD: [0x092F, 0x093C] }, +{ source: [0x09CB], NFC: [0x09CB], NFD: [0x09C7, 0x09BE], NFKC: [0x09CB], NFKD: [0x09C7, 0x09BE] }, +{ source: [0x09CC], NFC: [0x09CC], NFD: [0x09C7, 0x09D7], NFKC: [0x09CC], NFKD: [0x09C7, 0x09D7] }, +{ source: [0x09DC], NFC: [0x09A1, 0x09BC], NFD: [0x09A1, 0x09BC], NFKC: [0x09A1, 0x09BC], NFKD: [0x09A1, 0x09BC] }, +{ source: [0x09DD], NFC: [0x09A2, 0x09BC], NFD: [0x09A2, 0x09BC], NFKC: [0x09A2, 0x09BC], NFKD: [0x09A2, 0x09BC] }, +{ source: [0x09DF], NFC: [0x09AF, 0x09BC], NFD: [0x09AF, 0x09BC], NFKC: [0x09AF, 0x09BC], NFKD: [0x09AF, 0x09BC] }, +{ source: [0x0A33], NFC: [0x0A32, 0x0A3C], NFD: [0x0A32, 0x0A3C], NFKC: [0x0A32, 0x0A3C], NFKD: [0x0A32, 0x0A3C] }, +{ source: [0x0A36], NFC: [0x0A38, 0x0A3C], NFD: [0x0A38, 0x0A3C], NFKC: [0x0A38, 0x0A3C], NFKD: [0x0A38, 0x0A3C] }, +{ source: [0x0A59], NFC: [0x0A16, 0x0A3C], NFD: [0x0A16, 0x0A3C], NFKC: [0x0A16, 0x0A3C], NFKD: [0x0A16, 0x0A3C] }, +{ source: [0x0A5A], NFC: [0x0A17, 0x0A3C], NFD: [0x0A17, 0x0A3C], NFKC: [0x0A17, 0x0A3C], NFKD: [0x0A17, 0x0A3C] }, +{ source: [0x0A5B], NFC: [0x0A1C, 0x0A3C], NFD: [0x0A1C, 0x0A3C], NFKC: [0x0A1C, 0x0A3C], NFKD: [0x0A1C, 0x0A3C] }, +{ source: [0x0A5E], NFC: [0x0A2B, 0x0A3C], NFD: [0x0A2B, 0x0A3C], NFKC: [0x0A2B, 0x0A3C], NFKD: [0x0A2B, 0x0A3C] }, +{ source: [0x0B48], NFC: [0x0B48], NFD: [0x0B47, 0x0B56], NFKC: [0x0B48], NFKD: [0x0B47, 0x0B56] }, +{ source: [0x0B4B], NFC: [0x0B4B], NFD: [0x0B47, 0x0B3E], NFKC: [0x0B4B], NFKD: [0x0B47, 0x0B3E] }, +{ source: [0x0B4C], NFC: [0x0B4C], NFD: [0x0B47, 0x0B57], NFKC: [0x0B4C], NFKD: [0x0B47, 0x0B57] }, +{ source: [0x0B5C], NFC: [0x0B21, 0x0B3C], NFD: [0x0B21, 0x0B3C], NFKC: [0x0B21, 0x0B3C], NFKD: [0x0B21, 0x0B3C] }, +{ source: [0x0B5D], NFC: [0x0B22, 0x0B3C], NFD: [0x0B22, 0x0B3C], NFKC: [0x0B22, 0x0B3C], NFKD: [0x0B22, 0x0B3C] }, +{ source: [0x0B94], NFC: [0x0B94], NFD: [0x0B92, 0x0BD7], NFKC: [0x0B94], NFKD: [0x0B92, 0x0BD7] }, +{ source: [0x0BCA], NFC: [0x0BCA], NFD: [0x0BC6, 0x0BBE], NFKC: [0x0BCA], NFKD: [0x0BC6, 0x0BBE] }, +{ source: [0x0BCB], NFC: [0x0BCB], NFD: [0x0BC7, 0x0BBE], NFKC: [0x0BCB], NFKD: [0x0BC7, 0x0BBE] }, +{ source: [0x0BCC], NFC: [0x0BCC], NFD: [0x0BC6, 0x0BD7], NFKC: [0x0BCC], NFKD: [0x0BC6, 0x0BD7] }, +{ source: [0x0C48], NFC: [0x0C48], NFD: [0x0C46, 0x0C56], NFKC: [0x0C48], NFKD: [0x0C46, 0x0C56] }, +{ source: [0x0CC0], NFC: [0x0CC0], NFD: [0x0CBF, 0x0CD5], NFKC: [0x0CC0], NFKD: [0x0CBF, 0x0CD5] }, +{ source: [0x0CC7], NFC: [0x0CC7], NFD: [0x0CC6, 0x0CD5], NFKC: [0x0CC7], NFKD: [0x0CC6, 0x0CD5] }, +{ source: [0x0CC8], NFC: [0x0CC8], NFD: [0x0CC6, 0x0CD6], NFKC: [0x0CC8], NFKD: [0x0CC6, 0x0CD6] }, +{ source: [0x0CCA], NFC: [0x0CCA], NFD: [0x0CC6, 0x0CC2], NFKC: [0x0CCA], NFKD: [0x0CC6, 0x0CC2] }, +{ source: [0x0CCB], NFC: [0x0CCB], NFD: [0x0CC6, 0x0CC2, 0x0CD5], NFKC: [0x0CCB], NFKD: [0x0CC6, 0x0CC2, 0x0CD5] }, +{ source: [0x0D4A], NFC: [0x0D4A], NFD: [0x0D46, 0x0D3E], NFKC: [0x0D4A], NFKD: [0x0D46, 0x0D3E] }, +{ source: [0x0D4B], NFC: [0x0D4B], NFD: [0x0D47, 0x0D3E], NFKC: [0x0D4B], NFKD: [0x0D47, 0x0D3E] }, +{ source: [0x0D4C], NFC: [0x0D4C], NFD: [0x0D46, 0x0D57], NFKC: [0x0D4C], NFKD: [0x0D46, 0x0D57] }, +{ source: [0x0DDA], NFC: [0x0DDA], NFD: [0x0DD9, 0x0DCA], NFKC: [0x0DDA], NFKD: [0x0DD9, 0x0DCA] }, +{ source: [0x0DDC], NFC: [0x0DDC], NFD: [0x0DD9, 0x0DCF], NFKC: [0x0DDC], NFKD: [0x0DD9, 0x0DCF] }, +{ source: [0x0DDD], NFC: [0x0DDD], NFD: [0x0DD9, 0x0DCF, 0x0DCA], NFKC: [0x0DDD], NFKD: [0x0DD9, 0x0DCF, 0x0DCA] }, +{ source: [0x0DDE], NFC: [0x0DDE], NFD: [0x0DD9, 0x0DDF], NFKC: [0x0DDE], NFKD: [0x0DD9, 0x0DDF] }, +{ source: [0x0E33], NFC: [0x0E33], NFD: [0x0E33], NFKC: [0x0E4D, 0x0E32], NFKD: [0x0E4D, 0x0E32] }, +{ source: [0x0EB3], NFC: [0x0EB3], NFD: [0x0EB3], NFKC: [0x0ECD, 0x0EB2], NFKD: [0x0ECD, 0x0EB2] }, +{ source: [0x0EDC], NFC: [0x0EDC], NFD: [0x0EDC], NFKC: [0x0EAB, 0x0E99], NFKD: [0x0EAB, 0x0E99] }, +{ source: [0x0EDD], NFC: [0x0EDD], NFD: [0x0EDD], NFKC: [0x0EAB, 0x0EA1], NFKD: [0x0EAB, 0x0EA1] }, +{ source: [0x0F0C], NFC: [0x0F0C], NFD: [0x0F0C], NFKC: [0x0F0B], NFKD: [0x0F0B] }, +{ source: [0x0F43], NFC: [0x0F42, 0x0FB7], NFD: [0x0F42, 0x0FB7], NFKC: [0x0F42, 0x0FB7], NFKD: [0x0F42, 0x0FB7] }, +{ source: [0x0F4D], NFC: [0x0F4C, 0x0FB7], NFD: [0x0F4C, 0x0FB7], NFKC: [0x0F4C, 0x0FB7], NFKD: [0x0F4C, 0x0FB7] }, +{ source: [0x0F52], NFC: [0x0F51, 0x0FB7], NFD: [0x0F51, 0x0FB7], NFKC: [0x0F51, 0x0FB7], NFKD: [0x0F51, 0x0FB7] }, +{ source: [0x0F57], NFC: [0x0F56, 0x0FB7], NFD: [0x0F56, 0x0FB7], NFKC: [0x0F56, 0x0FB7], NFKD: [0x0F56, 0x0FB7] }, +{ source: [0x0F5C], NFC: [0x0F5B, 0x0FB7], NFD: [0x0F5B, 0x0FB7], NFKC: [0x0F5B, 0x0FB7], NFKD: [0x0F5B, 0x0FB7] }, +{ source: [0x0F69], NFC: [0x0F40, 0x0FB5], NFD: [0x0F40, 0x0FB5], NFKC: [0x0F40, 0x0FB5], NFKD: [0x0F40, 0x0FB5] }, +{ source: [0x0F73], NFC: [0x0F71, 0x0F72], NFD: [0x0F71, 0x0F72], NFKC: [0x0F71, 0x0F72], NFKD: [0x0F71, 0x0F72] }, +{ source: [0x0F75], NFC: [0x0F71, 0x0F74], NFD: [0x0F71, 0x0F74], NFKC: [0x0F71, 0x0F74], NFKD: [0x0F71, 0x0F74] }, +{ source: [0x0F76], NFC: [0x0FB2, 0x0F80], NFD: [0x0FB2, 0x0F80], NFKC: [0x0FB2, 0x0F80], NFKD: [0x0FB2, 0x0F80] }, +{ source: [0x0F77], NFC: [0x0F77], NFD: [0x0F77], NFKC: [0x0FB2, 0x0F71, 0x0F80], NFKD: [0x0FB2, 0x0F71, 0x0F80] }, +{ source: [0x0F78], NFC: [0x0FB3, 0x0F80], NFD: [0x0FB3, 0x0F80], NFKC: [0x0FB3, 0x0F80], NFKD: [0x0FB3, 0x0F80] }, +{ source: [0x0F79], NFC: [0x0F79], NFD: [0x0F79], NFKC: [0x0FB3, 0x0F71, 0x0F80], NFKD: [0x0FB3, 0x0F71, 0x0F80] }, +{ source: [0x0F81], NFC: [0x0F71, 0x0F80], NFD: [0x0F71, 0x0F80], NFKC: [0x0F71, 0x0F80], NFKD: [0x0F71, 0x0F80] }, +{ source: [0x0F93], NFC: [0x0F92, 0x0FB7], NFD: [0x0F92, 0x0FB7], NFKC: [0x0F92, 0x0FB7], NFKD: [0x0F92, 0x0FB7] }, +{ source: [0x0F9D], NFC: [0x0F9C, 0x0FB7], NFD: [0x0F9C, 0x0FB7], NFKC: [0x0F9C, 0x0FB7], NFKD: [0x0F9C, 0x0FB7] }, +{ source: [0x0FA2], NFC: [0x0FA1, 0x0FB7], NFD: [0x0FA1, 0x0FB7], NFKC: [0x0FA1, 0x0FB7], NFKD: [0x0FA1, 0x0FB7] }, +{ source: [0x0FA7], NFC: [0x0FA6, 0x0FB7], NFD: [0x0FA6, 0x0FB7], NFKC: [0x0FA6, 0x0FB7], NFKD: [0x0FA6, 0x0FB7] }, +{ source: [0x0FAC], NFC: [0x0FAB, 0x0FB7], NFD: [0x0FAB, 0x0FB7], NFKC: [0x0FAB, 0x0FB7], NFKD: [0x0FAB, 0x0FB7] }, +{ source: [0x0FB9], NFC: [0x0F90, 0x0FB5], NFD: [0x0F90, 0x0FB5], NFKC: [0x0F90, 0x0FB5], NFKD: [0x0F90, 0x0FB5] }, +{ source: [0x1026], NFC: [0x1026], NFD: [0x1025, 0x102E], NFKC: [0x1026], NFKD: [0x1025, 0x102E] }, +{ source: [0x10FC], NFC: [0x10FC], NFD: [0x10FC], NFKC: [0x10DC], NFKD: [0x10DC] }, +{ source: [0x1B06], NFC: [0x1B06], NFD: [0x1B05, 0x1B35], NFKC: [0x1B06], NFKD: [0x1B05, 0x1B35] }, +{ source: [0x1B08], NFC: [0x1B08], NFD: [0x1B07, 0x1B35], NFKC: [0x1B08], NFKD: [0x1B07, 0x1B35] }, +{ source: [0x1B0A], NFC: [0x1B0A], NFD: [0x1B09, 0x1B35], NFKC: [0x1B0A], NFKD: [0x1B09, 0x1B35] }, +{ source: [0x1B0C], NFC: [0x1B0C], NFD: [0x1B0B, 0x1B35], NFKC: [0x1B0C], NFKD: [0x1B0B, 0x1B35] }, +{ source: [0x1B0E], NFC: [0x1B0E], NFD: [0x1B0D, 0x1B35], NFKC: [0x1B0E], NFKD: [0x1B0D, 0x1B35] }, +{ source: [0x1B12], NFC: [0x1B12], NFD: [0x1B11, 0x1B35], NFKC: [0x1B12], NFKD: [0x1B11, 0x1B35] }, +{ source: [0x1B3B], NFC: [0x1B3B], NFD: [0x1B3A, 0x1B35], NFKC: [0x1B3B], NFKD: [0x1B3A, 0x1B35] }, +{ source: [0x1B3D], NFC: [0x1B3D], NFD: [0x1B3C, 0x1B35], NFKC: [0x1B3D], NFKD: [0x1B3C, 0x1B35] }, +{ source: [0x1B40], NFC: [0x1B40], NFD: [0x1B3E, 0x1B35], NFKC: [0x1B40], NFKD: [0x1B3E, 0x1B35] }, +{ source: [0x1B41], NFC: [0x1B41], NFD: [0x1B3F, 0x1B35], NFKC: [0x1B41], NFKD: [0x1B3F, 0x1B35] }, +{ source: [0x1B43], NFC: [0x1B43], NFD: [0x1B42, 0x1B35], NFKC: [0x1B43], NFKD: [0x1B42, 0x1B35] }, +{ source: [0x1D2C], NFC: [0x1D2C], NFD: [0x1D2C], NFKC: [0x0041], NFKD: [0x0041] }, +{ source: [0x1D2D], NFC: [0x1D2D], NFD: [0x1D2D], NFKC: [0x00C6], NFKD: [0x00C6] }, +{ source: [0x1D2E], NFC: [0x1D2E], NFD: [0x1D2E], NFKC: [0x0042], NFKD: [0x0042] }, +{ source: [0x1D30], NFC: [0x1D30], NFD: [0x1D30], NFKC: [0x0044], NFKD: [0x0044] }, +{ source: [0x1D31], NFC: [0x1D31], NFD: [0x1D31], NFKC: [0x0045], NFKD: [0x0045] }, +{ source: [0x1D32], NFC: [0x1D32], NFD: [0x1D32], NFKC: [0x018E], NFKD: [0x018E] }, +{ source: [0x1D33], NFC: [0x1D33], NFD: [0x1D33], NFKC: [0x0047], NFKD: [0x0047] }, +{ source: [0x1D34], NFC: [0x1D34], NFD: [0x1D34], NFKC: [0x0048], NFKD: [0x0048] }, +{ source: [0x1D35], NFC: [0x1D35], NFD: [0x1D35], NFKC: [0x0049], NFKD: [0x0049] }, +{ source: [0x1D36], NFC: [0x1D36], NFD: [0x1D36], NFKC: [0x004A], NFKD: [0x004A] }, +{ source: [0x1D37], NFC: [0x1D37], NFD: [0x1D37], NFKC: [0x004B], NFKD: [0x004B] }, +{ source: [0x1D38], NFC: [0x1D38], NFD: [0x1D38], NFKC: [0x004C], NFKD: [0x004C] }, +{ source: [0x1D39], NFC: [0x1D39], NFD: [0x1D39], NFKC: [0x004D], NFKD: [0x004D] }, +{ source: [0x1D3A], NFC: [0x1D3A], NFD: [0x1D3A], NFKC: [0x004E], NFKD: [0x004E] }, +{ source: [0x1D3C], NFC: [0x1D3C], NFD: [0x1D3C], NFKC: [0x004F], NFKD: [0x004F] }, +{ source: [0x1D3D], NFC: [0x1D3D], NFD: [0x1D3D], NFKC: [0x0222], NFKD: [0x0222] }, +{ source: [0x1D3E], NFC: [0x1D3E], NFD: [0x1D3E], NFKC: [0x0050], NFKD: [0x0050] }, +{ source: [0x1D3F], NFC: [0x1D3F], NFD: [0x1D3F], NFKC: [0x0052], NFKD: [0x0052] }, +{ source: [0x1D40], NFC: [0x1D40], NFD: [0x1D40], NFKC: [0x0054], NFKD: [0x0054] }, +{ source: [0x1D41], NFC: [0x1D41], NFD: [0x1D41], NFKC: [0x0055], NFKD: [0x0055] }, +{ source: [0x1D42], NFC: [0x1D42], NFD: [0x1D42], NFKC: [0x0057], NFKD: [0x0057] }, +{ source: [0x1D43], NFC: [0x1D43], NFD: [0x1D43], NFKC: [0x0061], NFKD: [0x0061] }, +{ source: [0x1D44], NFC: [0x1D44], NFD: [0x1D44], NFKC: [0x0250], NFKD: [0x0250] }, +{ source: [0x1D45], NFC: [0x1D45], NFD: [0x1D45], NFKC: [0x0251], NFKD: [0x0251] }, +{ source: [0x1D46], NFC: [0x1D46], NFD: [0x1D46], NFKC: [0x1D02], NFKD: [0x1D02] }, +{ source: [0x1D47], NFC: [0x1D47], NFD: [0x1D47], NFKC: [0x0062], NFKD: [0x0062] }, +{ source: [0x1D48], NFC: [0x1D48], NFD: [0x1D48], NFKC: [0x0064], NFKD: [0x0064] }, +{ source: [0x1D49], NFC: [0x1D49], NFD: [0x1D49], NFKC: [0x0065], NFKD: [0x0065] }, +{ source: [0x1D4A], NFC: [0x1D4A], NFD: [0x1D4A], NFKC: [0x0259], NFKD: [0x0259] }, +{ source: [0x1D4B], NFC: [0x1D4B], NFD: [0x1D4B], NFKC: [0x025B], NFKD: [0x025B] }, +{ source: [0x1D4C], NFC: [0x1D4C], NFD: [0x1D4C], NFKC: [0x025C], NFKD: [0x025C] }, +{ source: [0x1D4D], NFC: [0x1D4D], NFD: [0x1D4D], NFKC: [0x0067], NFKD: [0x0067] }, +{ source: [0x1D4F], NFC: [0x1D4F], NFD: [0x1D4F], NFKC: [0x006B], NFKD: [0x006B] }, +{ source: [0x1D50], NFC: [0x1D50], NFD: [0x1D50], NFKC: [0x006D], NFKD: [0x006D] }, +{ source: [0x1D51], NFC: [0x1D51], NFD: [0x1D51], NFKC: [0x014B], NFKD: [0x014B] }, +{ source: [0x1D52], NFC: [0x1D52], NFD: [0x1D52], NFKC: [0x006F], NFKD: [0x006F] }, +{ source: [0x1D53], NFC: [0x1D53], NFD: [0x1D53], NFKC: [0x0254], NFKD: [0x0254] }, +{ source: [0x1D54], NFC: [0x1D54], NFD: [0x1D54], NFKC: [0x1D16], NFKD: [0x1D16] }, +{ source: [0x1D55], NFC: [0x1D55], NFD: [0x1D55], NFKC: [0x1D17], NFKD: [0x1D17] }, +{ source: [0x1D56], NFC: [0x1D56], NFD: [0x1D56], NFKC: [0x0070], NFKD: [0x0070] }, +{ source: [0x1D57], NFC: [0x1D57], NFD: [0x1D57], NFKC: [0x0074], NFKD: [0x0074] }, +{ source: [0x1D58], NFC: [0x1D58], NFD: [0x1D58], NFKC: [0x0075], NFKD: [0x0075] }, +{ source: [0x1D59], NFC: [0x1D59], NFD: [0x1D59], NFKC: [0x1D1D], NFKD: [0x1D1D] }, +{ source: [0x1D5A], NFC: [0x1D5A], NFD: [0x1D5A], NFKC: [0x026F], NFKD: [0x026F] }, +{ source: [0x1D5B], NFC: [0x1D5B], NFD: [0x1D5B], NFKC: [0x0076], NFKD: [0x0076] }, +{ source: [0x1D5C], NFC: [0x1D5C], NFD: [0x1D5C], NFKC: [0x1D25], NFKD: [0x1D25] }, +{ source: [0x1D5D], NFC: [0x1D5D], NFD: [0x1D5D], NFKC: [0x03B2], NFKD: [0x03B2] }, +{ source: [0x1D5E], NFC: [0x1D5E], NFD: [0x1D5E], NFKC: [0x03B3], NFKD: [0x03B3] }, +{ source: [0x1D5F], NFC: [0x1D5F], NFD: [0x1D5F], NFKC: [0x03B4], NFKD: [0x03B4] }, +{ source: [0x1D60], NFC: [0x1D60], NFD: [0x1D60], NFKC: [0x03C6], NFKD: [0x03C6] }, +{ source: [0x1D61], NFC: [0x1D61], NFD: [0x1D61], NFKC: [0x03C7], NFKD: [0x03C7] }, +{ source: [0x1D62], NFC: [0x1D62], NFD: [0x1D62], NFKC: [0x0069], NFKD: [0x0069] }, +{ source: [0x1D63], NFC: [0x1D63], NFD: [0x1D63], NFKC: [0x0072], NFKD: [0x0072] }, +{ source: [0x1D64], NFC: [0x1D64], NFD: [0x1D64], NFKC: [0x0075], NFKD: [0x0075] }, +{ source: [0x1D65], NFC: [0x1D65], NFD: [0x1D65], NFKC: [0x0076], NFKD: [0x0076] }, +{ source: [0x1D66], NFC: [0x1D66], NFD: [0x1D66], NFKC: [0x03B2], NFKD: [0x03B2] }, +{ source: [0x1D67], NFC: [0x1D67], NFD: [0x1D67], NFKC: [0x03B3], NFKD: [0x03B3] }, +{ source: [0x1D68], NFC: [0x1D68], NFD: [0x1D68], NFKC: [0x03C1], NFKD: [0x03C1] }, +{ source: [0x1D69], NFC: [0x1D69], NFD: [0x1D69], NFKC: [0x03C6], NFKD: [0x03C6] }, +{ source: [0x1D6A], NFC: [0x1D6A], NFD: [0x1D6A], NFKC: [0x03C7], NFKD: [0x03C7] }, +{ source: [0x1D78], NFC: [0x1D78], NFD: [0x1D78], NFKC: [0x043D], NFKD: [0x043D] }, +{ source: [0x1D9B], NFC: [0x1D9B], NFD: [0x1D9B], NFKC: [0x0252], NFKD: [0x0252] }, +{ source: [0x1D9C], NFC: [0x1D9C], NFD: [0x1D9C], NFKC: [0x0063], NFKD: [0x0063] }, +{ source: [0x1D9D], NFC: [0x1D9D], NFD: [0x1D9D], NFKC: [0x0255], NFKD: [0x0255] }, +{ source: [0x1D9E], NFC: [0x1D9E], NFD: [0x1D9E], NFKC: [0x00F0], NFKD: [0x00F0] }, +{ source: [0x1D9F], NFC: [0x1D9F], NFD: [0x1D9F], NFKC: [0x025C], NFKD: [0x025C] }, +{ source: [0x1DA0], NFC: [0x1DA0], NFD: [0x1DA0], NFKC: [0x0066], NFKD: [0x0066] }, +{ source: [0x1DA1], NFC: [0x1DA1], NFD: [0x1DA1], NFKC: [0x025F], NFKD: [0x025F] }, +{ source: [0x1DA2], NFC: [0x1DA2], NFD: [0x1DA2], NFKC: [0x0261], NFKD: [0x0261] }, +{ source: [0x1DA3], NFC: [0x1DA3], NFD: [0x1DA3], NFKC: [0x0265], NFKD: [0x0265] }, +{ source: [0x1DA4], NFC: [0x1DA4], NFD: [0x1DA4], NFKC: [0x0268], NFKD: [0x0268] }, +{ source: [0x1DA5], NFC: [0x1DA5], NFD: [0x1DA5], NFKC: [0x0269], NFKD: [0x0269] }, +{ source: [0x1DA6], NFC: [0x1DA6], NFD: [0x1DA6], NFKC: [0x026A], NFKD: [0x026A] }, +{ source: [0x1DA7], NFC: [0x1DA7], NFD: [0x1DA7], NFKC: [0x1D7B], NFKD: [0x1D7B] }, +{ source: [0x1DA8], NFC: [0x1DA8], NFD: [0x1DA8], NFKC: [0x029D], NFKD: [0x029D] }, +{ source: [0x1DA9], NFC: [0x1DA9], NFD: [0x1DA9], NFKC: [0x026D], NFKD: [0x026D] }, +{ source: [0x1DAA], NFC: [0x1DAA], NFD: [0x1DAA], NFKC: [0x1D85], NFKD: [0x1D85] }, +{ source: [0x1DAB], NFC: [0x1DAB], NFD: [0x1DAB], NFKC: [0x029F], NFKD: [0x029F] }, +{ source: [0x1DAC], NFC: [0x1DAC], NFD: [0x1DAC], NFKC: [0x0271], NFKD: [0x0271] }, +{ source: [0x1DAD], NFC: [0x1DAD], NFD: [0x1DAD], NFKC: [0x0270], NFKD: [0x0270] }, +{ source: [0x1DAE], NFC: [0x1DAE], NFD: [0x1DAE], NFKC: [0x0272], NFKD: [0x0272] }, +{ source: [0x1DAF], NFC: [0x1DAF], NFD: [0x1DAF], NFKC: [0x0273], NFKD: [0x0273] }, +{ source: [0x1DB0], NFC: [0x1DB0], NFD: [0x1DB0], NFKC: [0x0274], NFKD: [0x0274] }, +{ source: [0x1DB1], NFC: [0x1DB1], NFD: [0x1DB1], NFKC: [0x0275], NFKD: [0x0275] }, +{ source: [0x1DB2], NFC: [0x1DB2], NFD: [0x1DB2], NFKC: [0x0278], NFKD: [0x0278] }, +{ source: [0x1DB3], NFC: [0x1DB3], NFD: [0x1DB3], NFKC: [0x0282], NFKD: [0x0282] }, +{ source: [0x1DB4], NFC: [0x1DB4], NFD: [0x1DB4], NFKC: [0x0283], NFKD: [0x0283] }, +{ source: [0x1DB5], NFC: [0x1DB5], NFD: [0x1DB5], NFKC: [0x01AB], NFKD: [0x01AB] }, +{ source: [0x1DB6], NFC: [0x1DB6], NFD: [0x1DB6], NFKC: [0x0289], NFKD: [0x0289] }, +{ source: [0x1DB7], NFC: [0x1DB7], NFD: [0x1DB7], NFKC: [0x028A], NFKD: [0x028A] }, +{ source: [0x1DB8], NFC: [0x1DB8], NFD: [0x1DB8], NFKC: [0x1D1C], NFKD: [0x1D1C] }, +{ source: [0x1DB9], NFC: [0x1DB9], NFD: [0x1DB9], NFKC: [0x028B], NFKD: [0x028B] }, +{ source: [0x1DBA], NFC: [0x1DBA], NFD: [0x1DBA], NFKC: [0x028C], NFKD: [0x028C] }, +{ source: [0x1DBB], NFC: [0x1DBB], NFD: [0x1DBB], NFKC: [0x007A], NFKD: [0x007A] }, +{ source: [0x1DBC], NFC: [0x1DBC], NFD: [0x1DBC], NFKC: [0x0290], NFKD: [0x0290] }, +{ source: [0x1DBD], NFC: [0x1DBD], NFD: [0x1DBD], NFKC: [0x0291], NFKD: [0x0291] }, +{ source: [0x1DBE], NFC: [0x1DBE], NFD: [0x1DBE], NFKC: [0x0292], NFKD: [0x0292] }, +{ source: [0x1DBF], NFC: [0x1DBF], NFD: [0x1DBF], NFKC: [0x03B8], NFKD: [0x03B8] }, +{ source: [0x1E00], NFC: [0x1E00], NFD: [0x0041, 0x0325], NFKC: [0x1E00], NFKD: [0x0041, 0x0325] }, +{ source: [0x1E01], NFC: [0x1E01], NFD: [0x0061, 0x0325], NFKC: [0x1E01], NFKD: [0x0061, 0x0325] }, +{ source: [0x1E02], NFC: [0x1E02], NFD: [0x0042, 0x0307], NFKC: [0x1E02], NFKD: [0x0042, 0x0307] }, +{ source: [0x1E03], NFC: [0x1E03], NFD: [0x0062, 0x0307], NFKC: [0x1E03], NFKD: [0x0062, 0x0307] }, +{ source: [0x1E04], NFC: [0x1E04], NFD: [0x0042, 0x0323], NFKC: [0x1E04], NFKD: [0x0042, 0x0323] }, +{ source: [0x1E05], NFC: [0x1E05], NFD: [0x0062, 0x0323], NFKC: [0x1E05], NFKD: [0x0062, 0x0323] }, +{ source: [0x1E06], NFC: [0x1E06], NFD: [0x0042, 0x0331], NFKC: [0x1E06], NFKD: [0x0042, 0x0331] }, +{ source: [0x1E07], NFC: [0x1E07], NFD: [0x0062, 0x0331], NFKC: [0x1E07], NFKD: [0x0062, 0x0331] }, +{ source: [0x1E08], NFC: [0x1E08], NFD: [0x0043, 0x0327, 0x0301], NFKC: [0x1E08], NFKD: [0x0043, 0x0327, 0x0301] }, +{ source: [0x1E09], NFC: [0x1E09], NFD: [0x0063, 0x0327, 0x0301], NFKC: [0x1E09], NFKD: [0x0063, 0x0327, 0x0301] }, +{ source: [0x1E0A], NFC: [0x1E0A], NFD: [0x0044, 0x0307], NFKC: [0x1E0A], NFKD: [0x0044, 0x0307] }, +{ source: [0x1E0B], NFC: [0x1E0B], NFD: [0x0064, 0x0307], NFKC: [0x1E0B], NFKD: [0x0064, 0x0307] }, +{ source: [0x1E0C], NFC: [0x1E0C], NFD: [0x0044, 0x0323], NFKC: [0x1E0C], NFKD: [0x0044, 0x0323] }, +{ source: [0x1E0D], NFC: [0x1E0D], NFD: [0x0064, 0x0323], NFKC: [0x1E0D], NFKD: [0x0064, 0x0323] }, +{ source: [0x1E0E], NFC: [0x1E0E], NFD: [0x0044, 0x0331], NFKC: [0x1E0E], NFKD: [0x0044, 0x0331] }, +{ source: [0x1E0F], NFC: [0x1E0F], NFD: [0x0064, 0x0331], NFKC: [0x1E0F], NFKD: [0x0064, 0x0331] }, +{ source: [0x1E10], NFC: [0x1E10], NFD: [0x0044, 0x0327], NFKC: [0x1E10], NFKD: [0x0044, 0x0327] }, +{ source: [0x1E11], NFC: [0x1E11], NFD: [0x0064, 0x0327], NFKC: [0x1E11], NFKD: [0x0064, 0x0327] }, +{ source: [0x1E12], NFC: [0x1E12], NFD: [0x0044, 0x032D], NFKC: [0x1E12], NFKD: [0x0044, 0x032D] }, +{ source: [0x1E13], NFC: [0x1E13], NFD: [0x0064, 0x032D], NFKC: [0x1E13], NFKD: [0x0064, 0x032D] }, +{ source: [0x1E14], NFC: [0x1E14], NFD: [0x0045, 0x0304, 0x0300], NFKC: [0x1E14], NFKD: [0x0045, 0x0304, 0x0300] }, +{ source: [0x1E15], NFC: [0x1E15], NFD: [0x0065, 0x0304, 0x0300], NFKC: [0x1E15], NFKD: [0x0065, 0x0304, 0x0300] }, +{ source: [0x1E16], NFC: [0x1E16], NFD: [0x0045, 0x0304, 0x0301], NFKC: [0x1E16], NFKD: [0x0045, 0x0304, 0x0301] }, +{ source: [0x1E17], NFC: [0x1E17], NFD: [0x0065, 0x0304, 0x0301], NFKC: [0x1E17], NFKD: [0x0065, 0x0304, 0x0301] }, +{ source: [0x1E18], NFC: [0x1E18], NFD: [0x0045, 0x032D], NFKC: [0x1E18], NFKD: [0x0045, 0x032D] }, +{ source: [0x1E19], NFC: [0x1E19], NFD: [0x0065, 0x032D], NFKC: [0x1E19], NFKD: [0x0065, 0x032D] }, +{ source: [0x1E1A], NFC: [0x1E1A], NFD: [0x0045, 0x0330], NFKC: [0x1E1A], NFKD: [0x0045, 0x0330] }, +{ source: [0x1E1B], NFC: [0x1E1B], NFD: [0x0065, 0x0330], NFKC: [0x1E1B], NFKD: [0x0065, 0x0330] }, +{ source: [0x1E1C], NFC: [0x1E1C], NFD: [0x0045, 0x0327, 0x0306], NFKC: [0x1E1C], NFKD: [0x0045, 0x0327, 0x0306] }, +{ source: [0x1E1D], NFC: [0x1E1D], NFD: [0x0065, 0x0327, 0x0306], NFKC: [0x1E1D], NFKD: [0x0065, 0x0327, 0x0306] }, +{ source: [0x1E1E], NFC: [0x1E1E], NFD: [0x0046, 0x0307], NFKC: [0x1E1E], NFKD: [0x0046, 0x0307] }, +{ source: [0x1E1F], NFC: [0x1E1F], NFD: [0x0066, 0x0307], NFKC: [0x1E1F], NFKD: [0x0066, 0x0307] }, +{ source: [0x1E20], NFC: [0x1E20], NFD: [0x0047, 0x0304], NFKC: [0x1E20], NFKD: [0x0047, 0x0304] }, +{ source: [0x1E21], NFC: [0x1E21], NFD: [0x0067, 0x0304], NFKC: [0x1E21], NFKD: [0x0067, 0x0304] }, +{ source: [0x1E22], NFC: [0x1E22], NFD: [0x0048, 0x0307], NFKC: [0x1E22], NFKD: [0x0048, 0x0307] }, +{ source: [0x1E23], NFC: [0x1E23], NFD: [0x0068, 0x0307], NFKC: [0x1E23], NFKD: [0x0068, 0x0307] }, +{ source: [0x1E24], NFC: [0x1E24], NFD: [0x0048, 0x0323], NFKC: [0x1E24], NFKD: [0x0048, 0x0323] }, +{ source: [0x1E25], NFC: [0x1E25], NFD: [0x0068, 0x0323], NFKC: [0x1E25], NFKD: [0x0068, 0x0323] }, +{ source: [0x1E26], NFC: [0x1E26], NFD: [0x0048, 0x0308], NFKC: [0x1E26], NFKD: [0x0048, 0x0308] }, +{ source: [0x1E27], NFC: [0x1E27], NFD: [0x0068, 0x0308], NFKC: [0x1E27], NFKD: [0x0068, 0x0308] }, +{ source: [0x1E28], NFC: [0x1E28], NFD: [0x0048, 0x0327], NFKC: [0x1E28], NFKD: [0x0048, 0x0327] }, +{ source: [0x1E29], NFC: [0x1E29], NFD: [0x0068, 0x0327], NFKC: [0x1E29], NFKD: [0x0068, 0x0327] }, +{ source: [0x1E2A], NFC: [0x1E2A], NFD: [0x0048, 0x032E], NFKC: [0x1E2A], NFKD: [0x0048, 0x032E] }, +{ source: [0x1E2B], NFC: [0x1E2B], NFD: [0x0068, 0x032E], NFKC: [0x1E2B], NFKD: [0x0068, 0x032E] }, +{ source: [0x1E2C], NFC: [0x1E2C], NFD: [0x0049, 0x0330], NFKC: [0x1E2C], NFKD: [0x0049, 0x0330] }, +{ source: [0x1E2D], NFC: [0x1E2D], NFD: [0x0069, 0x0330], NFKC: [0x1E2D], NFKD: [0x0069, 0x0330] }, +{ source: [0x1E2E], NFC: [0x1E2E], NFD: [0x0049, 0x0308, 0x0301], NFKC: [0x1E2E], NFKD: [0x0049, 0x0308, 0x0301] }, +{ source: [0x1E2F], NFC: [0x1E2F], NFD: [0x0069, 0x0308, 0x0301], NFKC: [0x1E2F], NFKD: [0x0069, 0x0308, 0x0301] }, +{ source: [0x1E30], NFC: [0x1E30], NFD: [0x004B, 0x0301], NFKC: [0x1E30], NFKD: [0x004B, 0x0301] }, +{ source: [0x1E31], NFC: [0x1E31], NFD: [0x006B, 0x0301], NFKC: [0x1E31], NFKD: [0x006B, 0x0301] }, +{ source: [0x1E32], NFC: [0x1E32], NFD: [0x004B, 0x0323], NFKC: [0x1E32], NFKD: [0x004B, 0x0323] }, +{ source: [0x1E33], NFC: [0x1E33], NFD: [0x006B, 0x0323], NFKC: [0x1E33], NFKD: [0x006B, 0x0323] }, +{ source: [0x1E34], NFC: [0x1E34], NFD: [0x004B, 0x0331], NFKC: [0x1E34], NFKD: [0x004B, 0x0331] }, +{ source: [0x1E35], NFC: [0x1E35], NFD: [0x006B, 0x0331], NFKC: [0x1E35], NFKD: [0x006B, 0x0331] }, +{ source: [0x1E36], NFC: [0x1E36], NFD: [0x004C, 0x0323], NFKC: [0x1E36], NFKD: [0x004C, 0x0323] }, +{ source: [0x1E37], NFC: [0x1E37], NFD: [0x006C, 0x0323], NFKC: [0x1E37], NFKD: [0x006C, 0x0323] }, +{ source: [0x1E38], NFC: [0x1E38], NFD: [0x004C, 0x0323, 0x0304], NFKC: [0x1E38], NFKD: [0x004C, 0x0323, 0x0304] }, +{ source: [0x1E39], NFC: [0x1E39], NFD: [0x006C, 0x0323, 0x0304], NFKC: [0x1E39], NFKD: [0x006C, 0x0323, 0x0304] }, +{ source: [0x1E3A], NFC: [0x1E3A], NFD: [0x004C, 0x0331], NFKC: [0x1E3A], NFKD: [0x004C, 0x0331] }, +{ source: [0x1E3B], NFC: [0x1E3B], NFD: [0x006C, 0x0331], NFKC: [0x1E3B], NFKD: [0x006C, 0x0331] }, +{ source: [0x1E3C], NFC: [0x1E3C], NFD: [0x004C, 0x032D], NFKC: [0x1E3C], NFKD: [0x004C, 0x032D] }, +{ source: [0x1E3D], NFC: [0x1E3D], NFD: [0x006C, 0x032D], NFKC: [0x1E3D], NFKD: [0x006C, 0x032D] }, +{ source: [0x1E3E], NFC: [0x1E3E], NFD: [0x004D, 0x0301], NFKC: [0x1E3E], NFKD: [0x004D, 0x0301] }, +{ source: [0x1E3F], NFC: [0x1E3F], NFD: [0x006D, 0x0301], NFKC: [0x1E3F], NFKD: [0x006D, 0x0301] }, +{ source: [0x1E40], NFC: [0x1E40], NFD: [0x004D, 0x0307], NFKC: [0x1E40], NFKD: [0x004D, 0x0307] }, +{ source: [0x1E41], NFC: [0x1E41], NFD: [0x006D, 0x0307], NFKC: [0x1E41], NFKD: [0x006D, 0x0307] }, +{ source: [0x1E42], NFC: [0x1E42], NFD: [0x004D, 0x0323], NFKC: [0x1E42], NFKD: [0x004D, 0x0323] }, +{ source: [0x1E43], NFC: [0x1E43], NFD: [0x006D, 0x0323], NFKC: [0x1E43], NFKD: [0x006D, 0x0323] }, +{ source: [0x1E44], NFC: [0x1E44], NFD: [0x004E, 0x0307], NFKC: [0x1E44], NFKD: [0x004E, 0x0307] }, +{ source: [0x1E45], NFC: [0x1E45], NFD: [0x006E, 0x0307], NFKC: [0x1E45], NFKD: [0x006E, 0x0307] }, +{ source: [0x1E46], NFC: [0x1E46], NFD: [0x004E, 0x0323], NFKC: [0x1E46], NFKD: [0x004E, 0x0323] }, +{ source: [0x1E47], NFC: [0x1E47], NFD: [0x006E, 0x0323], NFKC: [0x1E47], NFKD: [0x006E, 0x0323] }, +{ source: [0x1E48], NFC: [0x1E48], NFD: [0x004E, 0x0331], NFKC: [0x1E48], NFKD: [0x004E, 0x0331] }, +{ source: [0x1E49], NFC: [0x1E49], NFD: [0x006E, 0x0331], NFKC: [0x1E49], NFKD: [0x006E, 0x0331] }, +{ source: [0x1E4A], NFC: [0x1E4A], NFD: [0x004E, 0x032D], NFKC: [0x1E4A], NFKD: [0x004E, 0x032D] }, +{ source: [0x1E4B], NFC: [0x1E4B], NFD: [0x006E, 0x032D], NFKC: [0x1E4B], NFKD: [0x006E, 0x032D] }, +{ source: [0x1E4C], NFC: [0x1E4C], NFD: [0x004F, 0x0303, 0x0301], NFKC: [0x1E4C], NFKD: [0x004F, 0x0303, 0x0301] }, +{ source: [0x1E4D], NFC: [0x1E4D], NFD: [0x006F, 0x0303, 0x0301], NFKC: [0x1E4D], NFKD: [0x006F, 0x0303, 0x0301] }, +{ source: [0x1E4E], NFC: [0x1E4E], NFD: [0x004F, 0x0303, 0x0308], NFKC: [0x1E4E], NFKD: [0x004F, 0x0303, 0x0308] }, +{ source: [0x1E4F], NFC: [0x1E4F], NFD: [0x006F, 0x0303, 0x0308], NFKC: [0x1E4F], NFKD: [0x006F, 0x0303, 0x0308] }, +{ source: [0x1E50], NFC: [0x1E50], NFD: [0x004F, 0x0304, 0x0300], NFKC: [0x1E50], NFKD: [0x004F, 0x0304, 0x0300] }, +{ source: [0x1E51], NFC: [0x1E51], NFD: [0x006F, 0x0304, 0x0300], NFKC: [0x1E51], NFKD: [0x006F, 0x0304, 0x0300] }, +{ source: [0x1E52], NFC: [0x1E52], NFD: [0x004F, 0x0304, 0x0301], NFKC: [0x1E52], NFKD: [0x004F, 0x0304, 0x0301] }, +{ source: [0x1E53], NFC: [0x1E53], NFD: [0x006F, 0x0304, 0x0301], NFKC: [0x1E53], NFKD: [0x006F, 0x0304, 0x0301] }, +{ source: [0x1E54], NFC: [0x1E54], NFD: [0x0050, 0x0301], NFKC: [0x1E54], NFKD: [0x0050, 0x0301] }, +{ source: [0x1E55], NFC: [0x1E55], NFD: [0x0070, 0x0301], NFKC: [0x1E55], NFKD: [0x0070, 0x0301] }, +{ source: [0x1E56], NFC: [0x1E56], NFD: [0x0050, 0x0307], NFKC: [0x1E56], NFKD: [0x0050, 0x0307] }, +{ source: [0x1E57], NFC: [0x1E57], NFD: [0x0070, 0x0307], NFKC: [0x1E57], NFKD: [0x0070, 0x0307] }, +{ source: [0x1E58], NFC: [0x1E58], NFD: [0x0052, 0x0307], NFKC: [0x1E58], NFKD: [0x0052, 0x0307] }, +{ source: [0x1E59], NFC: [0x1E59], NFD: [0x0072, 0x0307], NFKC: [0x1E59], NFKD: [0x0072, 0x0307] }, +{ source: [0x1E5A], NFC: [0x1E5A], NFD: [0x0052, 0x0323], NFKC: [0x1E5A], NFKD: [0x0052, 0x0323] }, +{ source: [0x1E5B], NFC: [0x1E5B], NFD: [0x0072, 0x0323], NFKC: [0x1E5B], NFKD: [0x0072, 0x0323] }, +{ source: [0x1E5C], NFC: [0x1E5C], NFD: [0x0052, 0x0323, 0x0304], NFKC: [0x1E5C], NFKD: [0x0052, 0x0323, 0x0304] }, +{ source: [0x1E5D], NFC: [0x1E5D], NFD: [0x0072, 0x0323, 0x0304], NFKC: [0x1E5D], NFKD: [0x0072, 0x0323, 0x0304] }, +{ source: [0x1E5E], NFC: [0x1E5E], NFD: [0x0052, 0x0331], NFKC: [0x1E5E], NFKD: [0x0052, 0x0331] }, +{ source: [0x1E5F], NFC: [0x1E5F], NFD: [0x0072, 0x0331], NFKC: [0x1E5F], NFKD: [0x0072, 0x0331] }, +{ source: [0x1E60], NFC: [0x1E60], NFD: [0x0053, 0x0307], NFKC: [0x1E60], NFKD: [0x0053, 0x0307] }, +{ source: [0x1E61], NFC: [0x1E61], NFD: [0x0073, 0x0307], NFKC: [0x1E61], NFKD: [0x0073, 0x0307] }, +{ source: [0x1E62], NFC: [0x1E62], NFD: [0x0053, 0x0323], NFKC: [0x1E62], NFKD: [0x0053, 0x0323] }, +{ source: [0x1E63], NFC: [0x1E63], NFD: [0x0073, 0x0323], NFKC: [0x1E63], NFKD: [0x0073, 0x0323] }, +{ source: [0x1E64], NFC: [0x1E64], NFD: [0x0053, 0x0301, 0x0307], NFKC: [0x1E64], NFKD: [0x0053, 0x0301, 0x0307] }, +{ source: [0x1E65], NFC: [0x1E65], NFD: [0x0073, 0x0301, 0x0307], NFKC: [0x1E65], NFKD: [0x0073, 0x0301, 0x0307] }, +{ source: [0x1E66], NFC: [0x1E66], NFD: [0x0053, 0x030C, 0x0307], NFKC: [0x1E66], NFKD: [0x0053, 0x030C, 0x0307] }, +{ source: [0x1E67], NFC: [0x1E67], NFD: [0x0073, 0x030C, 0x0307], NFKC: [0x1E67], NFKD: [0x0073, 0x030C, 0x0307] }, +{ source: [0x1E68], NFC: [0x1E68], NFD: [0x0053, 0x0323, 0x0307], NFKC: [0x1E68], NFKD: [0x0053, 0x0323, 0x0307] }, +{ source: [0x1E69], NFC: [0x1E69], NFD: [0x0073, 0x0323, 0x0307], NFKC: [0x1E69], NFKD: [0x0073, 0x0323, 0x0307] }, +{ source: [0x1E6A], NFC: [0x1E6A], NFD: [0x0054, 0x0307], NFKC: [0x1E6A], NFKD: [0x0054, 0x0307] }, +{ source: [0x1E6B], NFC: [0x1E6B], NFD: [0x0074, 0x0307], NFKC: [0x1E6B], NFKD: [0x0074, 0x0307] }, +{ source: [0x1E6C], NFC: [0x1E6C], NFD: [0x0054, 0x0323], NFKC: [0x1E6C], NFKD: [0x0054, 0x0323] }, +{ source: [0x1E6D], NFC: [0x1E6D], NFD: [0x0074, 0x0323], NFKC: [0x1E6D], NFKD: [0x0074, 0x0323] }, +{ source: [0x1E6E], NFC: [0x1E6E], NFD: [0x0054, 0x0331], NFKC: [0x1E6E], NFKD: [0x0054, 0x0331] }, +{ source: [0x1E6F], NFC: [0x1E6F], NFD: [0x0074, 0x0331], NFKC: [0x1E6F], NFKD: [0x0074, 0x0331] }, +{ source: [0x1E70], NFC: [0x1E70], NFD: [0x0054, 0x032D], NFKC: [0x1E70], NFKD: [0x0054, 0x032D] }, +{ source: [0x1E71], NFC: [0x1E71], NFD: [0x0074, 0x032D], NFKC: [0x1E71], NFKD: [0x0074, 0x032D] }, +{ source: [0x1E72], NFC: [0x1E72], NFD: [0x0055, 0x0324], NFKC: [0x1E72], NFKD: [0x0055, 0x0324] }, +{ source: [0x1E73], NFC: [0x1E73], NFD: [0x0075, 0x0324], NFKC: [0x1E73], NFKD: [0x0075, 0x0324] }, +{ source: [0x1E74], NFC: [0x1E74], NFD: [0x0055, 0x0330], NFKC: [0x1E74], NFKD: [0x0055, 0x0330] }, +{ source: [0x1E75], NFC: [0x1E75], NFD: [0x0075, 0x0330], NFKC: [0x1E75], NFKD: [0x0075, 0x0330] }, +{ source: [0x1E76], NFC: [0x1E76], NFD: [0x0055, 0x032D], NFKC: [0x1E76], NFKD: [0x0055, 0x032D] }, +{ source: [0x1E77], NFC: [0x1E77], NFD: [0x0075, 0x032D], NFKC: [0x1E77], NFKD: [0x0075, 0x032D] }, +{ source: [0x1E78], NFC: [0x1E78], NFD: [0x0055, 0x0303, 0x0301], NFKC: [0x1E78], NFKD: [0x0055, 0x0303, 0x0301] }, +{ source: [0x1E79], NFC: [0x1E79], NFD: [0x0075, 0x0303, 0x0301], NFKC: [0x1E79], NFKD: [0x0075, 0x0303, 0x0301] }, +{ source: [0x1E7A], NFC: [0x1E7A], NFD: [0x0055, 0x0304, 0x0308], NFKC: [0x1E7A], NFKD: [0x0055, 0x0304, 0x0308] }, +{ source: [0x1E7B], NFC: [0x1E7B], NFD: [0x0075, 0x0304, 0x0308], NFKC: [0x1E7B], NFKD: [0x0075, 0x0304, 0x0308] }, +{ source: [0x1E7C], NFC: [0x1E7C], NFD: [0x0056, 0x0303], NFKC: [0x1E7C], NFKD: [0x0056, 0x0303] }, +{ source: [0x1E7D], NFC: [0x1E7D], NFD: [0x0076, 0x0303], NFKC: [0x1E7D], NFKD: [0x0076, 0x0303] }, +{ source: [0x1E7E], NFC: [0x1E7E], NFD: [0x0056, 0x0323], NFKC: [0x1E7E], NFKD: [0x0056, 0x0323] }, +{ source: [0x1E7F], NFC: [0x1E7F], NFD: [0x0076, 0x0323], NFKC: [0x1E7F], NFKD: [0x0076, 0x0323] }, +{ source: [0x1E80], NFC: [0x1E80], NFD: [0x0057, 0x0300], NFKC: [0x1E80], NFKD: [0x0057, 0x0300] }, +{ source: [0x1E81], NFC: [0x1E81], NFD: [0x0077, 0x0300], NFKC: [0x1E81], NFKD: [0x0077, 0x0300] }, +{ source: [0x1E82], NFC: [0x1E82], NFD: [0x0057, 0x0301], NFKC: [0x1E82], NFKD: [0x0057, 0x0301] }, +{ source: [0x1E83], NFC: [0x1E83], NFD: [0x0077, 0x0301], NFKC: [0x1E83], NFKD: [0x0077, 0x0301] }, +{ source: [0x1E84], NFC: [0x1E84], NFD: [0x0057, 0x0308], NFKC: [0x1E84], NFKD: [0x0057, 0x0308] }, +{ source: [0x1E85], NFC: [0x1E85], NFD: [0x0077, 0x0308], NFKC: [0x1E85], NFKD: [0x0077, 0x0308] }, +{ source: [0x1E86], NFC: [0x1E86], NFD: [0x0057, 0x0307], NFKC: [0x1E86], NFKD: [0x0057, 0x0307] }, +{ source: [0x1E87], NFC: [0x1E87], NFD: [0x0077, 0x0307], NFKC: [0x1E87], NFKD: [0x0077, 0x0307] }, +{ source: [0x1E88], NFC: [0x1E88], NFD: [0x0057, 0x0323], NFKC: [0x1E88], NFKD: [0x0057, 0x0323] }, +{ source: [0x1E89], NFC: [0x1E89], NFD: [0x0077, 0x0323], NFKC: [0x1E89], NFKD: [0x0077, 0x0323] }, +{ source: [0x1E8A], NFC: [0x1E8A], NFD: [0x0058, 0x0307], NFKC: [0x1E8A], NFKD: [0x0058, 0x0307] }, +{ source: [0x1E8B], NFC: [0x1E8B], NFD: [0x0078, 0x0307], NFKC: [0x1E8B], NFKD: [0x0078, 0x0307] }, +{ source: [0x1E8C], NFC: [0x1E8C], NFD: [0x0058, 0x0308], NFKC: [0x1E8C], NFKD: [0x0058, 0x0308] }, +{ source: [0x1E8D], NFC: [0x1E8D], NFD: [0x0078, 0x0308], NFKC: [0x1E8D], NFKD: [0x0078, 0x0308] }, +{ source: [0x1E8E], NFC: [0x1E8E], NFD: [0x0059, 0x0307], NFKC: [0x1E8E], NFKD: [0x0059, 0x0307] }, +{ source: [0x1E8F], NFC: [0x1E8F], NFD: [0x0079, 0x0307], NFKC: [0x1E8F], NFKD: [0x0079, 0x0307] }, +{ source: [0x1E90], NFC: [0x1E90], NFD: [0x005A, 0x0302], NFKC: [0x1E90], NFKD: [0x005A, 0x0302] }, +{ source: [0x1E91], NFC: [0x1E91], NFD: [0x007A, 0x0302], NFKC: [0x1E91], NFKD: [0x007A, 0x0302] }, +{ source: [0x1E92], NFC: [0x1E92], NFD: [0x005A, 0x0323], NFKC: [0x1E92], NFKD: [0x005A, 0x0323] }, +{ source: [0x1E93], NFC: [0x1E93], NFD: [0x007A, 0x0323], NFKC: [0x1E93], NFKD: [0x007A, 0x0323] }, +{ source: [0x1E94], NFC: [0x1E94], NFD: [0x005A, 0x0331], NFKC: [0x1E94], NFKD: [0x005A, 0x0331] }, +{ source: [0x1E95], NFC: [0x1E95], NFD: [0x007A, 0x0331], NFKC: [0x1E95], NFKD: [0x007A, 0x0331] }, +{ source: [0x1E96], NFC: [0x1E96], NFD: [0x0068, 0x0331], NFKC: [0x1E96], NFKD: [0x0068, 0x0331] }, +{ source: [0x1E97], NFC: [0x1E97], NFD: [0x0074, 0x0308], NFKC: [0x1E97], NFKD: [0x0074, 0x0308] }, +{ source: [0x1E98], NFC: [0x1E98], NFD: [0x0077, 0x030A], NFKC: [0x1E98], NFKD: [0x0077, 0x030A] }, +{ source: [0x1E99], NFC: [0x1E99], NFD: [0x0079, 0x030A], NFKC: [0x1E99], NFKD: [0x0079, 0x030A] }, +{ source: [0x1E9A], NFC: [0x1E9A], NFD: [0x1E9A], NFKC: [0x0061, 0x02BE], NFKD: [0x0061, 0x02BE] }, +{ source: [0x1E9B], NFC: [0x1E9B], NFD: [0x017F, 0x0307], NFKC: [0x1E61], NFKD: [0x0073, 0x0307] }, +{ source: [0x1EA0], NFC: [0x1EA0], NFD: [0x0041, 0x0323], NFKC: [0x1EA0], NFKD: [0x0041, 0x0323] }, +{ source: [0x1EA1], NFC: [0x1EA1], NFD: [0x0061, 0x0323], NFKC: [0x1EA1], NFKD: [0x0061, 0x0323] }, +{ source: [0x1EA2], NFC: [0x1EA2], NFD: [0x0041, 0x0309], NFKC: [0x1EA2], NFKD: [0x0041, 0x0309] }, +{ source: [0x1EA3], NFC: [0x1EA3], NFD: [0x0061, 0x0309], NFKC: [0x1EA3], NFKD: [0x0061, 0x0309] }, +{ source: [0x1EA4], NFC: [0x1EA4], NFD: [0x0041, 0x0302, 0x0301], NFKC: [0x1EA4], NFKD: [0x0041, 0x0302, 0x0301] }, +{ source: [0x1EA5], NFC: [0x1EA5], NFD: [0x0061, 0x0302, 0x0301], NFKC: [0x1EA5], NFKD: [0x0061, 0x0302, 0x0301] }, +{ source: [0x1EA6], NFC: [0x1EA6], NFD: [0x0041, 0x0302, 0x0300], NFKC: [0x1EA6], NFKD: [0x0041, 0x0302, 0x0300] }, +{ source: [0x1EA7], NFC: [0x1EA7], NFD: [0x0061, 0x0302, 0x0300], NFKC: [0x1EA7], NFKD: [0x0061, 0x0302, 0x0300] }, +{ source: [0x1EA8], NFC: [0x1EA8], NFD: [0x0041, 0x0302, 0x0309], NFKC: [0x1EA8], NFKD: [0x0041, 0x0302, 0x0309] }, +{ source: [0x1EA9], NFC: [0x1EA9], NFD: [0x0061, 0x0302, 0x0309], NFKC: [0x1EA9], NFKD: [0x0061, 0x0302, 0x0309] }, +{ source: [0x1EAA], NFC: [0x1EAA], NFD: [0x0041, 0x0302, 0x0303], NFKC: [0x1EAA], NFKD: [0x0041, 0x0302, 0x0303] }, +{ source: [0x1EAB], NFC: [0x1EAB], NFD: [0x0061, 0x0302, 0x0303], NFKC: [0x1EAB], NFKD: [0x0061, 0x0302, 0x0303] }, +{ source: [0x1EAC], NFC: [0x1EAC], NFD: [0x0041, 0x0323, 0x0302], NFKC: [0x1EAC], NFKD: [0x0041, 0x0323, 0x0302] }, +{ source: [0x1EAD], NFC: [0x1EAD], NFD: [0x0061, 0x0323, 0x0302], NFKC: [0x1EAD], NFKD: [0x0061, 0x0323, 0x0302] }, +{ source: [0x1EAE], NFC: [0x1EAE], NFD: [0x0041, 0x0306, 0x0301], NFKC: [0x1EAE], NFKD: [0x0041, 0x0306, 0x0301] }, +{ source: [0x1EAF], NFC: [0x1EAF], NFD: [0x0061, 0x0306, 0x0301], NFKC: [0x1EAF], NFKD: [0x0061, 0x0306, 0x0301] }, +{ source: [0x1EB0], NFC: [0x1EB0], NFD: [0x0041, 0x0306, 0x0300], NFKC: [0x1EB0], NFKD: [0x0041, 0x0306, 0x0300] }, +{ source: [0x1EB1], NFC: [0x1EB1], NFD: [0x0061, 0x0306, 0x0300], NFKC: [0x1EB1], NFKD: [0x0061, 0x0306, 0x0300] }, +{ source: [0x1EB2], NFC: [0x1EB2], NFD: [0x0041, 0x0306, 0x0309], NFKC: [0x1EB2], NFKD: [0x0041, 0x0306, 0x0309] }, +{ source: [0x1EB3], NFC: [0x1EB3], NFD: [0x0061, 0x0306, 0x0309], NFKC: [0x1EB3], NFKD: [0x0061, 0x0306, 0x0309] }, +{ source: [0x1EB4], NFC: [0x1EB4], NFD: [0x0041, 0x0306, 0x0303], NFKC: [0x1EB4], NFKD: [0x0041, 0x0306, 0x0303] }, +{ source: [0x1EB5], NFC: [0x1EB5], NFD: [0x0061, 0x0306, 0x0303], NFKC: [0x1EB5], NFKD: [0x0061, 0x0306, 0x0303] }, +{ source: [0x1EB6], NFC: [0x1EB6], NFD: [0x0041, 0x0323, 0x0306], NFKC: [0x1EB6], NFKD: [0x0041, 0x0323, 0x0306] }, +{ source: [0x1EB7], NFC: [0x1EB7], NFD: [0x0061, 0x0323, 0x0306], NFKC: [0x1EB7], NFKD: [0x0061, 0x0323, 0x0306] }, +{ source: [0x1EB8], NFC: [0x1EB8], NFD: [0x0045, 0x0323], NFKC: [0x1EB8], NFKD: [0x0045, 0x0323] }, +{ source: [0x1EB9], NFC: [0x1EB9], NFD: [0x0065, 0x0323], NFKC: [0x1EB9], NFKD: [0x0065, 0x0323] }, +{ source: [0x1EBA], NFC: [0x1EBA], NFD: [0x0045, 0x0309], NFKC: [0x1EBA], NFKD: [0x0045, 0x0309] }, +{ source: [0x1EBB], NFC: [0x1EBB], NFD: [0x0065, 0x0309], NFKC: [0x1EBB], NFKD: [0x0065, 0x0309] }, +{ source: [0x1EBC], NFC: [0x1EBC], NFD: [0x0045, 0x0303], NFKC: [0x1EBC], NFKD: [0x0045, 0x0303] }, +{ source: [0x1EBD], NFC: [0x1EBD], NFD: [0x0065, 0x0303], NFKC: [0x1EBD], NFKD: [0x0065, 0x0303] }, +{ source: [0x1EBE], NFC: [0x1EBE], NFD: [0x0045, 0x0302, 0x0301], NFKC: [0x1EBE], NFKD: [0x0045, 0x0302, 0x0301] }, +{ source: [0x1EBF], NFC: [0x1EBF], NFD: [0x0065, 0x0302, 0x0301], NFKC: [0x1EBF], NFKD: [0x0065, 0x0302, 0x0301] }, +{ source: [0x1EC0], NFC: [0x1EC0], NFD: [0x0045, 0x0302, 0x0300], NFKC: [0x1EC0], NFKD: [0x0045, 0x0302, 0x0300] }, +{ source: [0x1EC1], NFC: [0x1EC1], NFD: [0x0065, 0x0302, 0x0300], NFKC: [0x1EC1], NFKD: [0x0065, 0x0302, 0x0300] }, +{ source: [0x1EC2], NFC: [0x1EC2], NFD: [0x0045, 0x0302, 0x0309], NFKC: [0x1EC2], NFKD: [0x0045, 0x0302, 0x0309] }, +{ source: [0x1EC3], NFC: [0x1EC3], NFD: [0x0065, 0x0302, 0x0309], NFKC: [0x1EC3], NFKD: [0x0065, 0x0302, 0x0309] }, +{ source: [0x1EC4], NFC: [0x1EC4], NFD: [0x0045, 0x0302, 0x0303], NFKC: [0x1EC4], NFKD: [0x0045, 0x0302, 0x0303] }, +{ source: [0x1EC5], NFC: [0x1EC5], NFD: [0x0065, 0x0302, 0x0303], NFKC: [0x1EC5], NFKD: [0x0065, 0x0302, 0x0303] }, +{ source: [0x1EC6], NFC: [0x1EC6], NFD: [0x0045, 0x0323, 0x0302], NFKC: [0x1EC6], NFKD: [0x0045, 0x0323, 0x0302] }, +{ source: [0x1EC7], NFC: [0x1EC7], NFD: [0x0065, 0x0323, 0x0302], NFKC: [0x1EC7], NFKD: [0x0065, 0x0323, 0x0302] }, +{ source: [0x1EC8], NFC: [0x1EC8], NFD: [0x0049, 0x0309], NFKC: [0x1EC8], NFKD: [0x0049, 0x0309] }, +{ source: [0x1EC9], NFC: [0x1EC9], NFD: [0x0069, 0x0309], NFKC: [0x1EC9], NFKD: [0x0069, 0x0309] }, +{ source: [0x1ECA], NFC: [0x1ECA], NFD: [0x0049, 0x0323], NFKC: [0x1ECA], NFKD: [0x0049, 0x0323] }, +{ source: [0x1ECB], NFC: [0x1ECB], NFD: [0x0069, 0x0323], NFKC: [0x1ECB], NFKD: [0x0069, 0x0323] }, +{ source: [0x1ECC], NFC: [0x1ECC], NFD: [0x004F, 0x0323], NFKC: [0x1ECC], NFKD: [0x004F, 0x0323] }, +{ source: [0x1ECD], NFC: [0x1ECD], NFD: [0x006F, 0x0323], NFKC: [0x1ECD], NFKD: [0x006F, 0x0323] }, +{ source: [0x1ECE], NFC: [0x1ECE], NFD: [0x004F, 0x0309], NFKC: [0x1ECE], NFKD: [0x004F, 0x0309] }, +{ source: [0x1ECF], NFC: [0x1ECF], NFD: [0x006F, 0x0309], NFKC: [0x1ECF], NFKD: [0x006F, 0x0309] }, +{ source: [0x1ED0], NFC: [0x1ED0], NFD: [0x004F, 0x0302, 0x0301], NFKC: [0x1ED0], NFKD: [0x004F, 0x0302, 0x0301] }, +{ source: [0x1ED1], NFC: [0x1ED1], NFD: [0x006F, 0x0302, 0x0301], NFKC: [0x1ED1], NFKD: [0x006F, 0x0302, 0x0301] }, +{ source: [0x1ED2], NFC: [0x1ED2], NFD: [0x004F, 0x0302, 0x0300], NFKC: [0x1ED2], NFKD: [0x004F, 0x0302, 0x0300] }, +{ source: [0x1ED3], NFC: [0x1ED3], NFD: [0x006F, 0x0302, 0x0300], NFKC: [0x1ED3], NFKD: [0x006F, 0x0302, 0x0300] }, +{ source: [0x1ED4], NFC: [0x1ED4], NFD: [0x004F, 0x0302, 0x0309], NFKC: [0x1ED4], NFKD: [0x004F, 0x0302, 0x0309] }, +{ source: [0x1ED5], NFC: [0x1ED5], NFD: [0x006F, 0x0302, 0x0309], NFKC: [0x1ED5], NFKD: [0x006F, 0x0302, 0x0309] }, +{ source: [0x1ED6], NFC: [0x1ED6], NFD: [0x004F, 0x0302, 0x0303], NFKC: [0x1ED6], NFKD: [0x004F, 0x0302, 0x0303] }, +{ source: [0x1ED7], NFC: [0x1ED7], NFD: [0x006F, 0x0302, 0x0303], NFKC: [0x1ED7], NFKD: [0x006F, 0x0302, 0x0303] }, +{ source: [0x1ED8], NFC: [0x1ED8], NFD: [0x004F, 0x0323, 0x0302], NFKC: [0x1ED8], NFKD: [0x004F, 0x0323, 0x0302] }, +{ source: [0x1ED9], NFC: [0x1ED9], NFD: [0x006F, 0x0323, 0x0302], NFKC: [0x1ED9], NFKD: [0x006F, 0x0323, 0x0302] }, +{ source: [0x1EDA], NFC: [0x1EDA], NFD: [0x004F, 0x031B, 0x0301], NFKC: [0x1EDA], NFKD: [0x004F, 0x031B, 0x0301] }, +{ source: [0x1EDB], NFC: [0x1EDB], NFD: [0x006F, 0x031B, 0x0301], NFKC: [0x1EDB], NFKD: [0x006F, 0x031B, 0x0301] }, +{ source: [0x1EDC], NFC: [0x1EDC], NFD: [0x004F, 0x031B, 0x0300], NFKC: [0x1EDC], NFKD: [0x004F, 0x031B, 0x0300] }, +{ source: [0x1EDD], NFC: [0x1EDD], NFD: [0x006F, 0x031B, 0x0300], NFKC: [0x1EDD], NFKD: [0x006F, 0x031B, 0x0300] }, +{ source: [0x1EDE], NFC: [0x1EDE], NFD: [0x004F, 0x031B, 0x0309], NFKC: [0x1EDE], NFKD: [0x004F, 0x031B, 0x0309] }, +{ source: [0x1EDF], NFC: [0x1EDF], NFD: [0x006F, 0x031B, 0x0309], NFKC: [0x1EDF], NFKD: [0x006F, 0x031B, 0x0309] }, +{ source: [0x1EE0], NFC: [0x1EE0], NFD: [0x004F, 0x031B, 0x0303], NFKC: [0x1EE0], NFKD: [0x004F, 0x031B, 0x0303] }, +{ source: [0x1EE1], NFC: [0x1EE1], NFD: [0x006F, 0x031B, 0x0303], NFKC: [0x1EE1], NFKD: [0x006F, 0x031B, 0x0303] }, +{ source: [0x1EE2], NFC: [0x1EE2], NFD: [0x004F, 0x031B, 0x0323], NFKC: [0x1EE2], NFKD: [0x004F, 0x031B, 0x0323] }, +{ source: [0x1EE3], NFC: [0x1EE3], NFD: [0x006F, 0x031B, 0x0323], NFKC: [0x1EE3], NFKD: [0x006F, 0x031B, 0x0323] }, +{ source: [0x1EE4], NFC: [0x1EE4], NFD: [0x0055, 0x0323], NFKC: [0x1EE4], NFKD: [0x0055, 0x0323] }, +{ source: [0x1EE5], NFC: [0x1EE5], NFD: [0x0075, 0x0323], NFKC: [0x1EE5], NFKD: [0x0075, 0x0323] }, +{ source: [0x1EE6], NFC: [0x1EE6], NFD: [0x0055, 0x0309], NFKC: [0x1EE6], NFKD: [0x0055, 0x0309] }, +{ source: [0x1EE7], NFC: [0x1EE7], NFD: [0x0075, 0x0309], NFKC: [0x1EE7], NFKD: [0x0075, 0x0309] }, +{ source: [0x1EE8], NFC: [0x1EE8], NFD: [0x0055, 0x031B, 0x0301], NFKC: [0x1EE8], NFKD: [0x0055, 0x031B, 0x0301] }, +{ source: [0x1EE9], NFC: [0x1EE9], NFD: [0x0075, 0x031B, 0x0301], NFKC: [0x1EE9], NFKD: [0x0075, 0x031B, 0x0301] }, +{ source: [0x1EEA], NFC: [0x1EEA], NFD: [0x0055, 0x031B, 0x0300], NFKC: [0x1EEA], NFKD: [0x0055, 0x031B, 0x0300] }, +{ source: [0x1EEB], NFC: [0x1EEB], NFD: [0x0075, 0x031B, 0x0300], NFKC: [0x1EEB], NFKD: [0x0075, 0x031B, 0x0300] }, +{ source: [0x1EEC], NFC: [0x1EEC], NFD: [0x0055, 0x031B, 0x0309], NFKC: [0x1EEC], NFKD: [0x0055, 0x031B, 0x0309] }, +{ source: [0x1EED], NFC: [0x1EED], NFD: [0x0075, 0x031B, 0x0309], NFKC: [0x1EED], NFKD: [0x0075, 0x031B, 0x0309] }, +{ source: [0x1EEE], NFC: [0x1EEE], NFD: [0x0055, 0x031B, 0x0303], NFKC: [0x1EEE], NFKD: [0x0055, 0x031B, 0x0303] }, +{ source: [0x1EEF], NFC: [0x1EEF], NFD: [0x0075, 0x031B, 0x0303], NFKC: [0x1EEF], NFKD: [0x0075, 0x031B, 0x0303] }, +{ source: [0x1EF0], NFC: [0x1EF0], NFD: [0x0055, 0x031B, 0x0323], NFKC: [0x1EF0], NFKD: [0x0055, 0x031B, 0x0323] }, +{ source: [0x1EF1], NFC: [0x1EF1], NFD: [0x0075, 0x031B, 0x0323], NFKC: [0x1EF1], NFKD: [0x0075, 0x031B, 0x0323] }, +{ source: [0x1EF2], NFC: [0x1EF2], NFD: [0x0059, 0x0300], NFKC: [0x1EF2], NFKD: [0x0059, 0x0300] }, +{ source: [0x1EF3], NFC: [0x1EF3], NFD: [0x0079, 0x0300], NFKC: [0x1EF3], NFKD: [0x0079, 0x0300] }, +{ source: [0x1EF4], NFC: [0x1EF4], NFD: [0x0059, 0x0323], NFKC: [0x1EF4], NFKD: [0x0059, 0x0323] }, +{ source: [0x1EF5], NFC: [0x1EF5], NFD: [0x0079, 0x0323], NFKC: [0x1EF5], NFKD: [0x0079, 0x0323] }, +{ source: [0x1EF6], NFC: [0x1EF6], NFD: [0x0059, 0x0309], NFKC: [0x1EF6], NFKD: [0x0059, 0x0309] }, +{ source: [0x1EF7], NFC: [0x1EF7], NFD: [0x0079, 0x0309], NFKC: [0x1EF7], NFKD: [0x0079, 0x0309] }, +{ source: [0x1EF8], NFC: [0x1EF8], NFD: [0x0059, 0x0303], NFKC: [0x1EF8], NFKD: [0x0059, 0x0303] }, +{ source: [0x1EF9], NFC: [0x1EF9], NFD: [0x0079, 0x0303], NFKC: [0x1EF9], NFKD: [0x0079, 0x0303] }, +{ source: [0x1F00], NFC: [0x1F00], NFD: [0x03B1, 0x0313], NFKC: [0x1F00], NFKD: [0x03B1, 0x0313] }, +{ source: [0x1F01], NFC: [0x1F01], NFD: [0x03B1, 0x0314], NFKC: [0x1F01], NFKD: [0x03B1, 0x0314] }, +{ source: [0x1F02], NFC: [0x1F02], NFD: [0x03B1, 0x0313, 0x0300], NFKC: [0x1F02], NFKD: [0x03B1, 0x0313, 0x0300] }, +{ source: [0x1F03], NFC: [0x1F03], NFD: [0x03B1, 0x0314, 0x0300], NFKC: [0x1F03], NFKD: [0x03B1, 0x0314, 0x0300] }, +{ source: [0x1F04], NFC: [0x1F04], NFD: [0x03B1, 0x0313, 0x0301], NFKC: [0x1F04], NFKD: [0x03B1, 0x0313, 0x0301] }, +{ source: [0x1F05], NFC: [0x1F05], NFD: [0x03B1, 0x0314, 0x0301], NFKC: [0x1F05], NFKD: [0x03B1, 0x0314, 0x0301] }, +{ source: [0x1F06], NFC: [0x1F06], NFD: [0x03B1, 0x0313, 0x0342], NFKC: [0x1F06], NFKD: [0x03B1, 0x0313, 0x0342] }, +{ source: [0x1F07], NFC: [0x1F07], NFD: [0x03B1, 0x0314, 0x0342], NFKC: [0x1F07], NFKD: [0x03B1, 0x0314, 0x0342] }, +{ source: [0x1F08], NFC: [0x1F08], NFD: [0x0391, 0x0313], NFKC: [0x1F08], NFKD: [0x0391, 0x0313] }, +{ source: [0x1F09], NFC: [0x1F09], NFD: [0x0391, 0x0314], NFKC: [0x1F09], NFKD: [0x0391, 0x0314] }, +{ source: [0x1F0A], NFC: [0x1F0A], NFD: [0x0391, 0x0313, 0x0300], NFKC: [0x1F0A], NFKD: [0x0391, 0x0313, 0x0300] }, +{ source: [0x1F0B], NFC: [0x1F0B], NFD: [0x0391, 0x0314, 0x0300], NFKC: [0x1F0B], NFKD: [0x0391, 0x0314, 0x0300] }, +{ source: [0x1F0C], NFC: [0x1F0C], NFD: [0x0391, 0x0313, 0x0301], NFKC: [0x1F0C], NFKD: [0x0391, 0x0313, 0x0301] }, +{ source: [0x1F0D], NFC: [0x1F0D], NFD: [0x0391, 0x0314, 0x0301], NFKC: [0x1F0D], NFKD: [0x0391, 0x0314, 0x0301] }, +{ source: [0x1F0E], NFC: [0x1F0E], NFD: [0x0391, 0x0313, 0x0342], NFKC: [0x1F0E], NFKD: [0x0391, 0x0313, 0x0342] }, +{ source: [0x1F0F], NFC: [0x1F0F], NFD: [0x0391, 0x0314, 0x0342], NFKC: [0x1F0F], NFKD: [0x0391, 0x0314, 0x0342] }, +{ source: [0x1F10], NFC: [0x1F10], NFD: [0x03B5, 0x0313], NFKC: [0x1F10], NFKD: [0x03B5, 0x0313] }, +{ source: [0x1F11], NFC: [0x1F11], NFD: [0x03B5, 0x0314], NFKC: [0x1F11], NFKD: [0x03B5, 0x0314] }, +{ source: [0x1F12], NFC: [0x1F12], NFD: [0x03B5, 0x0313, 0x0300], NFKC: [0x1F12], NFKD: [0x03B5, 0x0313, 0x0300] }, +{ source: [0x1F13], NFC: [0x1F13], NFD: [0x03B5, 0x0314, 0x0300], NFKC: [0x1F13], NFKD: [0x03B5, 0x0314, 0x0300] }, +{ source: [0x1F14], NFC: [0x1F14], NFD: [0x03B5, 0x0313, 0x0301], NFKC: [0x1F14], NFKD: [0x03B5, 0x0313, 0x0301] }, +{ source: [0x1F15], NFC: [0x1F15], NFD: [0x03B5, 0x0314, 0x0301], NFKC: [0x1F15], NFKD: [0x03B5, 0x0314, 0x0301] }, +{ source: [0x1F18], NFC: [0x1F18], NFD: [0x0395, 0x0313], NFKC: [0x1F18], NFKD: [0x0395, 0x0313] }, +{ source: [0x1F19], NFC: [0x1F19], NFD: [0x0395, 0x0314], NFKC: [0x1F19], NFKD: [0x0395, 0x0314] }, +{ source: [0x1F1A], NFC: [0x1F1A], NFD: [0x0395, 0x0313, 0x0300], NFKC: [0x1F1A], NFKD: [0x0395, 0x0313, 0x0300] }, +{ source: [0x1F1B], NFC: [0x1F1B], NFD: [0x0395, 0x0314, 0x0300], NFKC: [0x1F1B], NFKD: [0x0395, 0x0314, 0x0300] }, +{ source: [0x1F1C], NFC: [0x1F1C], NFD: [0x0395, 0x0313, 0x0301], NFKC: [0x1F1C], NFKD: [0x0395, 0x0313, 0x0301] }, +{ source: [0x1F1D], NFC: [0x1F1D], NFD: [0x0395, 0x0314, 0x0301], NFKC: [0x1F1D], NFKD: [0x0395, 0x0314, 0x0301] }, +{ source: [0x1F20], NFC: [0x1F20], NFD: [0x03B7, 0x0313], NFKC: [0x1F20], NFKD: [0x03B7, 0x0313] }, +{ source: [0x1F21], NFC: [0x1F21], NFD: [0x03B7, 0x0314], NFKC: [0x1F21], NFKD: [0x03B7, 0x0314] }, +{ source: [0x1F22], NFC: [0x1F22], NFD: [0x03B7, 0x0313, 0x0300], NFKC: [0x1F22], NFKD: [0x03B7, 0x0313, 0x0300] }, +{ source: [0x1F23], NFC: [0x1F23], NFD: [0x03B7, 0x0314, 0x0300], NFKC: [0x1F23], NFKD: [0x03B7, 0x0314, 0x0300] }, +{ source: [0x1F24], NFC: [0x1F24], NFD: [0x03B7, 0x0313, 0x0301], NFKC: [0x1F24], NFKD: [0x03B7, 0x0313, 0x0301] }, +{ source: [0x1F25], NFC: [0x1F25], NFD: [0x03B7, 0x0314, 0x0301], NFKC: [0x1F25], NFKD: [0x03B7, 0x0314, 0x0301] }, +{ source: [0x1F26], NFC: [0x1F26], NFD: [0x03B7, 0x0313, 0x0342], NFKC: [0x1F26], NFKD: [0x03B7, 0x0313, 0x0342] }, +{ source: [0x1F27], NFC: [0x1F27], NFD: [0x03B7, 0x0314, 0x0342], NFKC: [0x1F27], NFKD: [0x03B7, 0x0314, 0x0342] }, +{ source: [0x1F28], NFC: [0x1F28], NFD: [0x0397, 0x0313], NFKC: [0x1F28], NFKD: [0x0397, 0x0313] }, +{ source: [0x1F29], NFC: [0x1F29], NFD: [0x0397, 0x0314], NFKC: [0x1F29], NFKD: [0x0397, 0x0314] }, +{ source: [0x1F2A], NFC: [0x1F2A], NFD: [0x0397, 0x0313, 0x0300], NFKC: [0x1F2A], NFKD: [0x0397, 0x0313, 0x0300] }, +{ source: [0x1F2B], NFC: [0x1F2B], NFD: [0x0397, 0x0314, 0x0300], NFKC: [0x1F2B], NFKD: [0x0397, 0x0314, 0x0300] }, +{ source: [0x1F2C], NFC: [0x1F2C], NFD: [0x0397, 0x0313, 0x0301], NFKC: [0x1F2C], NFKD: [0x0397, 0x0313, 0x0301] }, +{ source: [0x1F2D], NFC: [0x1F2D], NFD: [0x0397, 0x0314, 0x0301], NFKC: [0x1F2D], NFKD: [0x0397, 0x0314, 0x0301] }, +{ source: [0x1F2E], NFC: [0x1F2E], NFD: [0x0397, 0x0313, 0x0342], NFKC: [0x1F2E], NFKD: [0x0397, 0x0313, 0x0342] }, +{ source: [0x1F2F], NFC: [0x1F2F], NFD: [0x0397, 0x0314, 0x0342], NFKC: [0x1F2F], NFKD: [0x0397, 0x0314, 0x0342] }, +{ source: [0x1F30], NFC: [0x1F30], NFD: [0x03B9, 0x0313], NFKC: [0x1F30], NFKD: [0x03B9, 0x0313] }, +{ source: [0x1F31], NFC: [0x1F31], NFD: [0x03B9, 0x0314], NFKC: [0x1F31], NFKD: [0x03B9, 0x0314] }, +{ source: [0x1F32], NFC: [0x1F32], NFD: [0x03B9, 0x0313, 0x0300], NFKC: [0x1F32], NFKD: [0x03B9, 0x0313, 0x0300] }, +{ source: [0x1F33], NFC: [0x1F33], NFD: [0x03B9, 0x0314, 0x0300], NFKC: [0x1F33], NFKD: [0x03B9, 0x0314, 0x0300] }, +{ source: [0x1F34], NFC: [0x1F34], NFD: [0x03B9, 0x0313, 0x0301], NFKC: [0x1F34], NFKD: [0x03B9, 0x0313, 0x0301] }, +{ source: [0x1F35], NFC: [0x1F35], NFD: [0x03B9, 0x0314, 0x0301], NFKC: [0x1F35], NFKD: [0x03B9, 0x0314, 0x0301] }, +{ source: [0x1F36], NFC: [0x1F36], NFD: [0x03B9, 0x0313, 0x0342], NFKC: [0x1F36], NFKD: [0x03B9, 0x0313, 0x0342] }, +{ source: [0x1F37], NFC: [0x1F37], NFD: [0x03B9, 0x0314, 0x0342], NFKC: [0x1F37], NFKD: [0x03B9, 0x0314, 0x0342] }, +{ source: [0x1F38], NFC: [0x1F38], NFD: [0x0399, 0x0313], NFKC: [0x1F38], NFKD: [0x0399, 0x0313] }, +{ source: [0x1F39], NFC: [0x1F39], NFD: [0x0399, 0x0314], NFKC: [0x1F39], NFKD: [0x0399, 0x0314] }, +{ source: [0x1F3A], NFC: [0x1F3A], NFD: [0x0399, 0x0313, 0x0300], NFKC: [0x1F3A], NFKD: [0x0399, 0x0313, 0x0300] }, +{ source: [0x1F3B], NFC: [0x1F3B], NFD: [0x0399, 0x0314, 0x0300], NFKC: [0x1F3B], NFKD: [0x0399, 0x0314, 0x0300] }, +{ source: [0x1F3C], NFC: [0x1F3C], NFD: [0x0399, 0x0313, 0x0301], NFKC: [0x1F3C], NFKD: [0x0399, 0x0313, 0x0301] }, +{ source: [0x1F3D], NFC: [0x1F3D], NFD: [0x0399, 0x0314, 0x0301], NFKC: [0x1F3D], NFKD: [0x0399, 0x0314, 0x0301] }, +{ source: [0x1F3E], NFC: [0x1F3E], NFD: [0x0399, 0x0313, 0x0342], NFKC: [0x1F3E], NFKD: [0x0399, 0x0313, 0x0342] }, +{ source: [0x1F3F], NFC: [0x1F3F], NFD: [0x0399, 0x0314, 0x0342], NFKC: [0x1F3F], NFKD: [0x0399, 0x0314, 0x0342] }, +{ source: [0x1F40], NFC: [0x1F40], NFD: [0x03BF, 0x0313], NFKC: [0x1F40], NFKD: [0x03BF, 0x0313] }, +{ source: [0x1F41], NFC: [0x1F41], NFD: [0x03BF, 0x0314], NFKC: [0x1F41], NFKD: [0x03BF, 0x0314] }, +{ source: [0x1F42], NFC: [0x1F42], NFD: [0x03BF, 0x0313, 0x0300], NFKC: [0x1F42], NFKD: [0x03BF, 0x0313, 0x0300] }, +{ source: [0x1F43], NFC: [0x1F43], NFD: [0x03BF, 0x0314, 0x0300], NFKC: [0x1F43], NFKD: [0x03BF, 0x0314, 0x0300] }, +{ source: [0x1F44], NFC: [0x1F44], NFD: [0x03BF, 0x0313, 0x0301], NFKC: [0x1F44], NFKD: [0x03BF, 0x0313, 0x0301] }, +{ source: [0x1F45], NFC: [0x1F45], NFD: [0x03BF, 0x0314, 0x0301], NFKC: [0x1F45], NFKD: [0x03BF, 0x0314, 0x0301] }, +{ source: [0x1F48], NFC: [0x1F48], NFD: [0x039F, 0x0313], NFKC: [0x1F48], NFKD: [0x039F, 0x0313] }, +{ source: [0x1F49], NFC: [0x1F49], NFD: [0x039F, 0x0314], NFKC: [0x1F49], NFKD: [0x039F, 0x0314] }, +{ source: [0x1F4A], NFC: [0x1F4A], NFD: [0x039F, 0x0313, 0x0300], NFKC: [0x1F4A], NFKD: [0x039F, 0x0313, 0x0300] }, +{ source: [0x1F4B], NFC: [0x1F4B], NFD: [0x039F, 0x0314, 0x0300], NFKC: [0x1F4B], NFKD: [0x039F, 0x0314, 0x0300] }, +{ source: [0x1F4C], NFC: [0x1F4C], NFD: [0x039F, 0x0313, 0x0301], NFKC: [0x1F4C], NFKD: [0x039F, 0x0313, 0x0301] }, +{ source: [0x1F4D], NFC: [0x1F4D], NFD: [0x039F, 0x0314, 0x0301], NFKC: [0x1F4D], NFKD: [0x039F, 0x0314, 0x0301] }, +{ source: [0x1F50], NFC: [0x1F50], NFD: [0x03C5, 0x0313], NFKC: [0x1F50], NFKD: [0x03C5, 0x0313] }, +{ source: [0x1F51], NFC: [0x1F51], NFD: [0x03C5, 0x0314], NFKC: [0x1F51], NFKD: [0x03C5, 0x0314] }, +{ source: [0x1F52], NFC: [0x1F52], NFD: [0x03C5, 0x0313, 0x0300], NFKC: [0x1F52], NFKD: [0x03C5, 0x0313, 0x0300] }, +{ source: [0x1F53], NFC: [0x1F53], NFD: [0x03C5, 0x0314, 0x0300], NFKC: [0x1F53], NFKD: [0x03C5, 0x0314, 0x0300] }, +{ source: [0x1F54], NFC: [0x1F54], NFD: [0x03C5, 0x0313, 0x0301], NFKC: [0x1F54], NFKD: [0x03C5, 0x0313, 0x0301] }, +{ source: [0x1F55], NFC: [0x1F55], NFD: [0x03C5, 0x0314, 0x0301], NFKC: [0x1F55], NFKD: [0x03C5, 0x0314, 0x0301] }, +{ source: [0x1F56], NFC: [0x1F56], NFD: [0x03C5, 0x0313, 0x0342], NFKC: [0x1F56], NFKD: [0x03C5, 0x0313, 0x0342] }, +{ source: [0x1F57], NFC: [0x1F57], NFD: [0x03C5, 0x0314, 0x0342], NFKC: [0x1F57], NFKD: [0x03C5, 0x0314, 0x0342] }, +{ source: [0x1F59], NFC: [0x1F59], NFD: [0x03A5, 0x0314], NFKC: [0x1F59], NFKD: [0x03A5, 0x0314] }, +{ source: [0x1F5B], NFC: [0x1F5B], NFD: [0x03A5, 0x0314, 0x0300], NFKC: [0x1F5B], NFKD: [0x03A5, 0x0314, 0x0300] }, +{ source: [0x1F5D], NFC: [0x1F5D], NFD: [0x03A5, 0x0314, 0x0301], NFKC: [0x1F5D], NFKD: [0x03A5, 0x0314, 0x0301] }, +{ source: [0x1F5F], NFC: [0x1F5F], NFD: [0x03A5, 0x0314, 0x0342], NFKC: [0x1F5F], NFKD: [0x03A5, 0x0314, 0x0342] }, +{ source: [0x1F60], NFC: [0x1F60], NFD: [0x03C9, 0x0313], NFKC: [0x1F60], NFKD: [0x03C9, 0x0313] }, +{ source: [0x1F61], NFC: [0x1F61], NFD: [0x03C9, 0x0314], NFKC: [0x1F61], NFKD: [0x03C9, 0x0314] }, +{ source: [0x1F62], NFC: [0x1F62], NFD: [0x03C9, 0x0313, 0x0300], NFKC: [0x1F62], NFKD: [0x03C9, 0x0313, 0x0300] }, +{ source: [0x1F63], NFC: [0x1F63], NFD: [0x03C9, 0x0314, 0x0300], NFKC: [0x1F63], NFKD: [0x03C9, 0x0314, 0x0300] }, +{ source: [0x1F64], NFC: [0x1F64], NFD: [0x03C9, 0x0313, 0x0301], NFKC: [0x1F64], NFKD: [0x03C9, 0x0313, 0x0301] }, +{ source: [0x1F65], NFC: [0x1F65], NFD: [0x03C9, 0x0314, 0x0301], NFKC: [0x1F65], NFKD: [0x03C9, 0x0314, 0x0301] }, +{ source: [0x1F66], NFC: [0x1F66], NFD: [0x03C9, 0x0313, 0x0342], NFKC: [0x1F66], NFKD: [0x03C9, 0x0313, 0x0342] }, +{ source: [0x1F67], NFC: [0x1F67], NFD: [0x03C9, 0x0314, 0x0342], NFKC: [0x1F67], NFKD: [0x03C9, 0x0314, 0x0342] }, +{ source: [0x1F68], NFC: [0x1F68], NFD: [0x03A9, 0x0313], NFKC: [0x1F68], NFKD: [0x03A9, 0x0313] }, +{ source: [0x1F69], NFC: [0x1F69], NFD: [0x03A9, 0x0314], NFKC: [0x1F69], NFKD: [0x03A9, 0x0314] }, +{ source: [0x1F6A], NFC: [0x1F6A], NFD: [0x03A9, 0x0313, 0x0300], NFKC: [0x1F6A], NFKD: [0x03A9, 0x0313, 0x0300] }, +{ source: [0x1F6B], NFC: [0x1F6B], NFD: [0x03A9, 0x0314, 0x0300], NFKC: [0x1F6B], NFKD: [0x03A9, 0x0314, 0x0300] }, +{ source: [0x1F6C], NFC: [0x1F6C], NFD: [0x03A9, 0x0313, 0x0301], NFKC: [0x1F6C], NFKD: [0x03A9, 0x0313, 0x0301] }, +{ source: [0x1F6D], NFC: [0x1F6D], NFD: [0x03A9, 0x0314, 0x0301], NFKC: [0x1F6D], NFKD: [0x03A9, 0x0314, 0x0301] }, +{ source: [0x1F6E], NFC: [0x1F6E], NFD: [0x03A9, 0x0313, 0x0342], NFKC: [0x1F6E], NFKD: [0x03A9, 0x0313, 0x0342] }, +{ source: [0x1F6F], NFC: [0x1F6F], NFD: [0x03A9, 0x0314, 0x0342], NFKC: [0x1F6F], NFKD: [0x03A9, 0x0314, 0x0342] }, +{ source: [0x1F70], NFC: [0x1F70], NFD: [0x03B1, 0x0300], NFKC: [0x1F70], NFKD: [0x03B1, 0x0300] }, +{ source: [0x1F71], NFC: [0x03AC], NFD: [0x03B1, 0x0301], NFKC: [0x03AC], NFKD: [0x03B1, 0x0301] }, +{ source: [0x1F72], NFC: [0x1F72], NFD: [0x03B5, 0x0300], NFKC: [0x1F72], NFKD: [0x03B5, 0x0300] }, +{ source: [0x1F73], NFC: [0x03AD], NFD: [0x03B5, 0x0301], NFKC: [0x03AD], NFKD: [0x03B5, 0x0301] }, +{ source: [0x1F74], NFC: [0x1F74], NFD: [0x03B7, 0x0300], NFKC: [0x1F74], NFKD: [0x03B7, 0x0300] }, +{ source: [0x1F75], NFC: [0x03AE], NFD: [0x03B7, 0x0301], NFKC: [0x03AE], NFKD: [0x03B7, 0x0301] }, +{ source: [0x1F76], NFC: [0x1F76], NFD: [0x03B9, 0x0300], NFKC: [0x1F76], NFKD: [0x03B9, 0x0300] }, +{ source: [0x1F77], NFC: [0x03AF], NFD: [0x03B9, 0x0301], NFKC: [0x03AF], NFKD: [0x03B9, 0x0301] }, +{ source: [0x1F78], NFC: [0x1F78], NFD: [0x03BF, 0x0300], NFKC: [0x1F78], NFKD: [0x03BF, 0x0300] }, +{ source: [0x1F79], NFC: [0x03CC], NFD: [0x03BF, 0x0301], NFKC: [0x03CC], NFKD: [0x03BF, 0x0301] }, +{ source: [0x1F7A], NFC: [0x1F7A], NFD: [0x03C5, 0x0300], NFKC: [0x1F7A], NFKD: [0x03C5, 0x0300] }, +{ source: [0x1F7B], NFC: [0x03CD], NFD: [0x03C5, 0x0301], NFKC: [0x03CD], NFKD: [0x03C5, 0x0301] }, +{ source: [0x1F7C], NFC: [0x1F7C], NFD: [0x03C9, 0x0300], NFKC: [0x1F7C], NFKD: [0x03C9, 0x0300] }, +{ source: [0x1F7D], NFC: [0x03CE], NFD: [0x03C9, 0x0301], NFKC: [0x03CE], NFKD: [0x03C9, 0x0301] }, +{ source: [0x1F80], NFC: [0x1F80], NFD: [0x03B1, 0x0313, 0x0345], NFKC: [0x1F80], NFKD: [0x03B1, 0x0313, 0x0345] }, +{ source: [0x1F81], NFC: [0x1F81], NFD: [0x03B1, 0x0314, 0x0345], NFKC: [0x1F81], NFKD: [0x03B1, 0x0314, 0x0345] }, +{ source: [0x1F82], NFC: [0x1F82], NFD: [0x03B1, 0x0313, 0x0300, 0x0345], NFKC: [0x1F82], NFKD: [0x03B1, 0x0313, 0x0300, 0x0345] }, +{ source: [0x1F83], NFC: [0x1F83], NFD: [0x03B1, 0x0314, 0x0300, 0x0345], NFKC: [0x1F83], NFKD: [0x03B1, 0x0314, 0x0300, 0x0345] }, +{ source: [0x1F84], NFC: [0x1F84], NFD: [0x03B1, 0x0313, 0x0301, 0x0345], NFKC: [0x1F84], NFKD: [0x03B1, 0x0313, 0x0301, 0x0345] }, +{ source: [0x1F85], NFC: [0x1F85], NFD: [0x03B1, 0x0314, 0x0301, 0x0345], NFKC: [0x1F85], NFKD: [0x03B1, 0x0314, 0x0301, 0x0345] }, +{ source: [0x1F86], NFC: [0x1F86], NFD: [0x03B1, 0x0313, 0x0342, 0x0345], NFKC: [0x1F86], NFKD: [0x03B1, 0x0313, 0x0342, 0x0345] }, +{ source: [0x1F87], NFC: [0x1F87], NFD: [0x03B1, 0x0314, 0x0342, 0x0345], NFKC: [0x1F87], NFKD: [0x03B1, 0x0314, 0x0342, 0x0345] }, +{ source: [0x1F88], NFC: [0x1F88], NFD: [0x0391, 0x0313, 0x0345], NFKC: [0x1F88], NFKD: [0x0391, 0x0313, 0x0345] }, +{ source: [0x1F89], NFC: [0x1F89], NFD: [0x0391, 0x0314, 0x0345], NFKC: [0x1F89], NFKD: [0x0391, 0x0314, 0x0345] }, +{ source: [0x1F8A], NFC: [0x1F8A], NFD: [0x0391, 0x0313, 0x0300, 0x0345], NFKC: [0x1F8A], NFKD: [0x0391, 0x0313, 0x0300, 0x0345] }, +{ source: [0x1F8B], NFC: [0x1F8B], NFD: [0x0391, 0x0314, 0x0300, 0x0345], NFKC: [0x1F8B], NFKD: [0x0391, 0x0314, 0x0300, 0x0345] }, +{ source: [0x1F8C], NFC: [0x1F8C], NFD: [0x0391, 0x0313, 0x0301, 0x0345], NFKC: [0x1F8C], NFKD: [0x0391, 0x0313, 0x0301, 0x0345] }, +{ source: [0x1F8D], NFC: [0x1F8D], NFD: [0x0391, 0x0314, 0x0301, 0x0345], NFKC: [0x1F8D], NFKD: [0x0391, 0x0314, 0x0301, 0x0345] }, +{ source: [0x1F8E], NFC: [0x1F8E], NFD: [0x0391, 0x0313, 0x0342, 0x0345], NFKC: [0x1F8E], NFKD: [0x0391, 0x0313, 0x0342, 0x0345] }, +{ source: [0x1F8F], NFC: [0x1F8F], NFD: [0x0391, 0x0314, 0x0342, 0x0345], NFKC: [0x1F8F], NFKD: [0x0391, 0x0314, 0x0342, 0x0345] }, +{ source: [0x1F90], NFC: [0x1F90], NFD: [0x03B7, 0x0313, 0x0345], NFKC: [0x1F90], NFKD: [0x03B7, 0x0313, 0x0345] }, +{ source: [0x1F91], NFC: [0x1F91], NFD: [0x03B7, 0x0314, 0x0345], NFKC: [0x1F91], NFKD: [0x03B7, 0x0314, 0x0345] }, +{ source: [0x1F92], NFC: [0x1F92], NFD: [0x03B7, 0x0313, 0x0300, 0x0345], NFKC: [0x1F92], NFKD: [0x03B7, 0x0313, 0x0300, 0x0345] }, +{ source: [0x1F93], NFC: [0x1F93], NFD: [0x03B7, 0x0314, 0x0300, 0x0345], NFKC: [0x1F93], NFKD: [0x03B7, 0x0314, 0x0300, 0x0345] }, +{ source: [0x1F94], NFC: [0x1F94], NFD: [0x03B7, 0x0313, 0x0301, 0x0345], NFKC: [0x1F94], NFKD: [0x03B7, 0x0313, 0x0301, 0x0345] }, +{ source: [0x1F95], NFC: [0x1F95], NFD: [0x03B7, 0x0314, 0x0301, 0x0345], NFKC: [0x1F95], NFKD: [0x03B7, 0x0314, 0x0301, 0x0345] }, +{ source: [0x1F96], NFC: [0x1F96], NFD: [0x03B7, 0x0313, 0x0342, 0x0345], NFKC: [0x1F96], NFKD: [0x03B7, 0x0313, 0x0342, 0x0345] }, +{ source: [0x1F97], NFC: [0x1F97], NFD: [0x03B7, 0x0314, 0x0342, 0x0345], NFKC: [0x1F97], NFKD: [0x03B7, 0x0314, 0x0342, 0x0345] }, +{ source: [0x1F98], NFC: [0x1F98], NFD: [0x0397, 0x0313, 0x0345], NFKC: [0x1F98], NFKD: [0x0397, 0x0313, 0x0345] }, +{ source: [0x1F99], NFC: [0x1F99], NFD: [0x0397, 0x0314, 0x0345], NFKC: [0x1F99], NFKD: [0x0397, 0x0314, 0x0345] }, +{ source: [0x1F9A], NFC: [0x1F9A], NFD: [0x0397, 0x0313, 0x0300, 0x0345], NFKC: [0x1F9A], NFKD: [0x0397, 0x0313, 0x0300, 0x0345] }, +{ source: [0x1F9B], NFC: [0x1F9B], NFD: [0x0397, 0x0314, 0x0300, 0x0345], NFKC: [0x1F9B], NFKD: [0x0397, 0x0314, 0x0300, 0x0345] }, +{ source: [0x1F9C], NFC: [0x1F9C], NFD: [0x0397, 0x0313, 0x0301, 0x0345], NFKC: [0x1F9C], NFKD: [0x0397, 0x0313, 0x0301, 0x0345] }, +{ source: [0x1F9D], NFC: [0x1F9D], NFD: [0x0397, 0x0314, 0x0301, 0x0345], NFKC: [0x1F9D], NFKD: [0x0397, 0x0314, 0x0301, 0x0345] }, +{ source: [0x1F9E], NFC: [0x1F9E], NFD: [0x0397, 0x0313, 0x0342, 0x0345], NFKC: [0x1F9E], NFKD: [0x0397, 0x0313, 0x0342, 0x0345] }, +{ source: [0x1F9F], NFC: [0x1F9F], NFD: [0x0397, 0x0314, 0x0342, 0x0345], NFKC: [0x1F9F], NFKD: [0x0397, 0x0314, 0x0342, 0x0345] }, +{ source: [0x1FA0], NFC: [0x1FA0], NFD: [0x03C9, 0x0313, 0x0345], NFKC: [0x1FA0], NFKD: [0x03C9, 0x0313, 0x0345] }, +{ source: [0x1FA1], NFC: [0x1FA1], NFD: [0x03C9, 0x0314, 0x0345], NFKC: [0x1FA1], NFKD: [0x03C9, 0x0314, 0x0345] }, +{ source: [0x1FA2], NFC: [0x1FA2], NFD: [0x03C9, 0x0313, 0x0300, 0x0345], NFKC: [0x1FA2], NFKD: [0x03C9, 0x0313, 0x0300, 0x0345] }, +{ source: [0x1FA3], NFC: [0x1FA3], NFD: [0x03C9, 0x0314, 0x0300, 0x0345], NFKC: [0x1FA3], NFKD: [0x03C9, 0x0314, 0x0300, 0x0345] }, +{ source: [0x1FA4], NFC: [0x1FA4], NFD: [0x03C9, 0x0313, 0x0301, 0x0345], NFKC: [0x1FA4], NFKD: [0x03C9, 0x0313, 0x0301, 0x0345] }, +{ source: [0x1FA5], NFC: [0x1FA5], NFD: [0x03C9, 0x0314, 0x0301, 0x0345], NFKC: [0x1FA5], NFKD: [0x03C9, 0x0314, 0x0301, 0x0345] }, +{ source: [0x1FA6], NFC: [0x1FA6], NFD: [0x03C9, 0x0313, 0x0342, 0x0345], NFKC: [0x1FA6], NFKD: [0x03C9, 0x0313, 0x0342, 0x0345] }, +{ source: [0x1FA7], NFC: [0x1FA7], NFD: [0x03C9, 0x0314, 0x0342, 0x0345], NFKC: [0x1FA7], NFKD: [0x03C9, 0x0314, 0x0342, 0x0345] }, +{ source: [0x1FA8], NFC: [0x1FA8], NFD: [0x03A9, 0x0313, 0x0345], NFKC: [0x1FA8], NFKD: [0x03A9, 0x0313, 0x0345] }, +{ source: [0x1FA9], NFC: [0x1FA9], NFD: [0x03A9, 0x0314, 0x0345], NFKC: [0x1FA9], NFKD: [0x03A9, 0x0314, 0x0345] }, +{ source: [0x1FAA], NFC: [0x1FAA], NFD: [0x03A9, 0x0313, 0x0300, 0x0345], NFKC: [0x1FAA], NFKD: [0x03A9, 0x0313, 0x0300, 0x0345] }, +{ source: [0x1FAB], NFC: [0x1FAB], NFD: [0x03A9, 0x0314, 0x0300, 0x0345], NFKC: [0x1FAB], NFKD: [0x03A9, 0x0314, 0x0300, 0x0345] }, +{ source: [0x1FAC], NFC: [0x1FAC], NFD: [0x03A9, 0x0313, 0x0301, 0x0345], NFKC: [0x1FAC], NFKD: [0x03A9, 0x0313, 0x0301, 0x0345] }, +{ source: [0x1FAD], NFC: [0x1FAD], NFD: [0x03A9, 0x0314, 0x0301, 0x0345], NFKC: [0x1FAD], NFKD: [0x03A9, 0x0314, 0x0301, 0x0345] }, +{ source: [0x1FAE], NFC: [0x1FAE], NFD: [0x03A9, 0x0313, 0x0342, 0x0345], NFKC: [0x1FAE], NFKD: [0x03A9, 0x0313, 0x0342, 0x0345] }, +{ source: [0x1FAF], NFC: [0x1FAF], NFD: [0x03A9, 0x0314, 0x0342, 0x0345], NFKC: [0x1FAF], NFKD: [0x03A9, 0x0314, 0x0342, 0x0345] }, +{ source: [0x1FB0], NFC: [0x1FB0], NFD: [0x03B1, 0x0306], NFKC: [0x1FB0], NFKD: [0x03B1, 0x0306] }, +{ source: [0x1FB1], NFC: [0x1FB1], NFD: [0x03B1, 0x0304], NFKC: [0x1FB1], NFKD: [0x03B1, 0x0304] }, +{ source: [0x1FB2], NFC: [0x1FB2], NFD: [0x03B1, 0x0300, 0x0345], NFKC: [0x1FB2], NFKD: [0x03B1, 0x0300, 0x0345] }, +{ source: [0x1FB3], NFC: [0x1FB3], NFD: [0x03B1, 0x0345], NFKC: [0x1FB3], NFKD: [0x03B1, 0x0345] }, +{ source: [0x1FB4], NFC: [0x1FB4], NFD: [0x03B1, 0x0301, 0x0345], NFKC: [0x1FB4], NFKD: [0x03B1, 0x0301, 0x0345] }, +{ source: [0x1FB6], NFC: [0x1FB6], NFD: [0x03B1, 0x0342], NFKC: [0x1FB6], NFKD: [0x03B1, 0x0342] }, +{ source: [0x1FB7], NFC: [0x1FB7], NFD: [0x03B1, 0x0342, 0x0345], NFKC: [0x1FB7], NFKD: [0x03B1, 0x0342, 0x0345] }, +{ source: [0x1FB8], NFC: [0x1FB8], NFD: [0x0391, 0x0306], NFKC: [0x1FB8], NFKD: [0x0391, 0x0306] }, +{ source: [0x1FB9], NFC: [0x1FB9], NFD: [0x0391, 0x0304], NFKC: [0x1FB9], NFKD: [0x0391, 0x0304] }, +{ source: [0x1FBA], NFC: [0x1FBA], NFD: [0x0391, 0x0300], NFKC: [0x1FBA], NFKD: [0x0391, 0x0300] }, +{ source: [0x1FBB], NFC: [0x0386], NFD: [0x0391, 0x0301], NFKC: [0x0386], NFKD: [0x0391, 0x0301] }, +{ source: [0x1FBC], NFC: [0x1FBC], NFD: [0x0391, 0x0345], NFKC: [0x1FBC], NFKD: [0x0391, 0x0345] }, +{ source: [0x1FBD], NFC: [0x1FBD], NFD: [0x1FBD], NFKC: [0x0020, 0x0313], NFKD: [0x0020, 0x0313] }, +{ source: [0x1FBE], NFC: [0x03B9], NFD: [0x03B9], NFKC: [0x03B9], NFKD: [0x03B9] }, +{ source: [0x1FBF], NFC: [0x1FBF], NFD: [0x1FBF], NFKC: [0x0020, 0x0313], NFKD: [0x0020, 0x0313] }, +{ source: [0x1FC0], NFC: [0x1FC0], NFD: [0x1FC0], NFKC: [0x0020, 0x0342], NFKD: [0x0020, 0x0342] }, +{ source: [0x1FC1], NFC: [0x1FC1], NFD: [0x00A8, 0x0342], NFKC: [0x0020, 0x0308, 0x0342], NFKD: [0x0020, 0x0308, 0x0342] }, +{ source: [0x1FC2], NFC: [0x1FC2], NFD: [0x03B7, 0x0300, 0x0345], NFKC: [0x1FC2], NFKD: [0x03B7, 0x0300, 0x0345] }, +{ source: [0x1FC3], NFC: [0x1FC3], NFD: [0x03B7, 0x0345], NFKC: [0x1FC3], NFKD: [0x03B7, 0x0345] }, +{ source: [0x1FC4], NFC: [0x1FC4], NFD: [0x03B7, 0x0301, 0x0345], NFKC: [0x1FC4], NFKD: [0x03B7, 0x0301, 0x0345] }, +{ source: [0x1FC6], NFC: [0x1FC6], NFD: [0x03B7, 0x0342], NFKC: [0x1FC6], NFKD: [0x03B7, 0x0342] }, +{ source: [0x1FC7], NFC: [0x1FC7], NFD: [0x03B7, 0x0342, 0x0345], NFKC: [0x1FC7], NFKD: [0x03B7, 0x0342, 0x0345] }, +{ source: [0x1FC8], NFC: [0x1FC8], NFD: [0x0395, 0x0300], NFKC: [0x1FC8], NFKD: [0x0395, 0x0300] }, +{ source: [0x1FC9], NFC: [0x0388], NFD: [0x0395, 0x0301], NFKC: [0x0388], NFKD: [0x0395, 0x0301] }, +{ source: [0x1FCA], NFC: [0x1FCA], NFD: [0x0397, 0x0300], NFKC: [0x1FCA], NFKD: [0x0397, 0x0300] }, +{ source: [0x1FCB], NFC: [0x0389], NFD: [0x0397, 0x0301], NFKC: [0x0389], NFKD: [0x0397, 0x0301] }, +{ source: [0x1FCC], NFC: [0x1FCC], NFD: [0x0397, 0x0345], NFKC: [0x1FCC], NFKD: [0x0397, 0x0345] }, +{ source: [0x1FCD], NFC: [0x1FCD], NFD: [0x1FBF, 0x0300], NFKC: [0x0020, 0x0313, 0x0300], NFKD: [0x0020, 0x0313, 0x0300] }, +{ source: [0x1FCE], NFC: [0x1FCE], NFD: [0x1FBF, 0x0301], NFKC: [0x0020, 0x0313, 0x0301], NFKD: [0x0020, 0x0313, 0x0301] }, +{ source: [0x1FCF], NFC: [0x1FCF], NFD: [0x1FBF, 0x0342], NFKC: [0x0020, 0x0313, 0x0342], NFKD: [0x0020, 0x0313, 0x0342] }, +{ source: [0x1FD0], NFC: [0x1FD0], NFD: [0x03B9, 0x0306], NFKC: [0x1FD0], NFKD: [0x03B9, 0x0306] }, +{ source: [0x1FD1], NFC: [0x1FD1], NFD: [0x03B9, 0x0304], NFKC: [0x1FD1], NFKD: [0x03B9, 0x0304] }, +{ source: [0x1FD2], NFC: [0x1FD2], NFD: [0x03B9, 0x0308, 0x0300], NFKC: [0x1FD2], NFKD: [0x03B9, 0x0308, 0x0300] }, +{ source: [0x1FD3], NFC: [0x0390], NFD: [0x03B9, 0x0308, 0x0301], NFKC: [0x0390], NFKD: [0x03B9, 0x0308, 0x0301] }, +{ source: [0x1FD6], NFC: [0x1FD6], NFD: [0x03B9, 0x0342], NFKC: [0x1FD6], NFKD: [0x03B9, 0x0342] }, +{ source: [0x1FD7], NFC: [0x1FD7], NFD: [0x03B9, 0x0308, 0x0342], NFKC: [0x1FD7], NFKD: [0x03B9, 0x0308, 0x0342] }, +{ source: [0x1FD8], NFC: [0x1FD8], NFD: [0x0399, 0x0306], NFKC: [0x1FD8], NFKD: [0x0399, 0x0306] }, +{ source: [0x1FD9], NFC: [0x1FD9], NFD: [0x0399, 0x0304], NFKC: [0x1FD9], NFKD: [0x0399, 0x0304] }, +{ source: [0x1FDA], NFC: [0x1FDA], NFD: [0x0399, 0x0300], NFKC: [0x1FDA], NFKD: [0x0399, 0x0300] }, +{ source: [0x1FDB], NFC: [0x038A], NFD: [0x0399, 0x0301], NFKC: [0x038A], NFKD: [0x0399, 0x0301] }, +{ source: [0x1FDD], NFC: [0x1FDD], NFD: [0x1FFE, 0x0300], NFKC: [0x0020, 0x0314, 0x0300], NFKD: [0x0020, 0x0314, 0x0300] }, +{ source: [0x1FDE], NFC: [0x1FDE], NFD: [0x1FFE, 0x0301], NFKC: [0x0020, 0x0314, 0x0301], NFKD: [0x0020, 0x0314, 0x0301] }, +{ source: [0x1FDF], NFC: [0x1FDF], NFD: [0x1FFE, 0x0342], NFKC: [0x0020, 0x0314, 0x0342], NFKD: [0x0020, 0x0314, 0x0342] }, +{ source: [0x1FE0], NFC: [0x1FE0], NFD: [0x03C5, 0x0306], NFKC: [0x1FE0], NFKD: [0x03C5, 0x0306] }, +{ source: [0x1FE1], NFC: [0x1FE1], NFD: [0x03C5, 0x0304], NFKC: [0x1FE1], NFKD: [0x03C5, 0x0304] }, +{ source: [0x1FE2], NFC: [0x1FE2], NFD: [0x03C5, 0x0308, 0x0300], NFKC: [0x1FE2], NFKD: [0x03C5, 0x0308, 0x0300] }, +{ source: [0x1FE3], NFC: [0x03B0], NFD: [0x03C5, 0x0308, 0x0301], NFKC: [0x03B0], NFKD: [0x03C5, 0x0308, 0x0301] }, +{ source: [0x1FE4], NFC: [0x1FE4], NFD: [0x03C1, 0x0313], NFKC: [0x1FE4], NFKD: [0x03C1, 0x0313] }, +{ source: [0x1FE5], NFC: [0x1FE5], NFD: [0x03C1, 0x0314], NFKC: [0x1FE5], NFKD: [0x03C1, 0x0314] }, +{ source: [0x1FE6], NFC: [0x1FE6], NFD: [0x03C5, 0x0342], NFKC: [0x1FE6], NFKD: [0x03C5, 0x0342] }, +{ source: [0x1FE7], NFC: [0x1FE7], NFD: [0x03C5, 0x0308, 0x0342], NFKC: [0x1FE7], NFKD: [0x03C5, 0x0308, 0x0342] }, +{ source: [0x1FE8], NFC: [0x1FE8], NFD: [0x03A5, 0x0306], NFKC: [0x1FE8], NFKD: [0x03A5, 0x0306] }, +{ source: [0x1FE9], NFC: [0x1FE9], NFD: [0x03A5, 0x0304], NFKC: [0x1FE9], NFKD: [0x03A5, 0x0304] }, +{ source: [0x1FEA], NFC: [0x1FEA], NFD: [0x03A5, 0x0300], NFKC: [0x1FEA], NFKD: [0x03A5, 0x0300] }, +{ source: [0x1FEB], NFC: [0x038E], NFD: [0x03A5, 0x0301], NFKC: [0x038E], NFKD: [0x03A5, 0x0301] }, +{ source: [0x1FEC], NFC: [0x1FEC], NFD: [0x03A1, 0x0314], NFKC: [0x1FEC], NFKD: [0x03A1, 0x0314] }, +{ source: [0x1FED], NFC: [0x1FED], NFD: [0x00A8, 0x0300], NFKC: [0x0020, 0x0308, 0x0300], NFKD: [0x0020, 0x0308, 0x0300] }, +{ source: [0x1FEE], NFC: [0x0385], NFD: [0x00A8, 0x0301], NFKC: [0x0020, 0x0308, 0x0301], NFKD: [0x0020, 0x0308, 0x0301] }, +{ source: [0x1FEF], NFC: [0x0060], NFD: [0x0060], NFKC: [0x0060], NFKD: [0x0060] }, +{ source: [0x1FF2], NFC: [0x1FF2], NFD: [0x03C9, 0x0300, 0x0345], NFKC: [0x1FF2], NFKD: [0x03C9, 0x0300, 0x0345] }, +{ source: [0x1FF3], NFC: [0x1FF3], NFD: [0x03C9, 0x0345], NFKC: [0x1FF3], NFKD: [0x03C9, 0x0345] }, +{ source: [0x1FF4], NFC: [0x1FF4], NFD: [0x03C9, 0x0301, 0x0345], NFKC: [0x1FF4], NFKD: [0x03C9, 0x0301, 0x0345] }, +{ source: [0x1FF6], NFC: [0x1FF6], NFD: [0x03C9, 0x0342], NFKC: [0x1FF6], NFKD: [0x03C9, 0x0342] }, +{ source: [0x1FF7], NFC: [0x1FF7], NFD: [0x03C9, 0x0342, 0x0345], NFKC: [0x1FF7], NFKD: [0x03C9, 0x0342, 0x0345] }, +{ source: [0x1FF8], NFC: [0x1FF8], NFD: [0x039F, 0x0300], NFKC: [0x1FF8], NFKD: [0x039F, 0x0300] }, +{ source: [0x1FF9], NFC: [0x038C], NFD: [0x039F, 0x0301], NFKC: [0x038C], NFKD: [0x039F, 0x0301] }, +{ source: [0x1FFA], NFC: [0x1FFA], NFD: [0x03A9, 0x0300], NFKC: [0x1FFA], NFKD: [0x03A9, 0x0300] }, +{ source: [0x1FFB], NFC: [0x038F], NFD: [0x03A9, 0x0301], NFKC: [0x038F], NFKD: [0x03A9, 0x0301] }, +{ source: [0x1FFC], NFC: [0x1FFC], NFD: [0x03A9, 0x0345], NFKC: [0x1FFC], NFKD: [0x03A9, 0x0345] }, +{ source: [0x1FFD], NFC: [0x00B4], NFD: [0x00B4], NFKC: [0x0020, 0x0301], NFKD: [0x0020, 0x0301] }, +{ source: [0x1FFE], NFC: [0x1FFE], NFD: [0x1FFE], NFKC: [0x0020, 0x0314], NFKD: [0x0020, 0x0314] }, +{ source: [0x2000], NFC: [0x2002], NFD: [0x2002], NFKC: [0x0020], NFKD: [0x0020] }, +{ source: [0x2001], NFC: [0x2003], NFD: [0x2003], NFKC: [0x0020], NFKD: [0x0020] }, +{ source: [0x2002], NFC: [0x2002], NFD: [0x2002], NFKC: [0x0020], NFKD: [0x0020] }, +{ source: [0x2003], NFC: [0x2003], NFD: [0x2003], NFKC: [0x0020], NFKD: [0x0020] }, +{ source: [0x2004], NFC: [0x2004], NFD: [0x2004], NFKC: [0x0020], NFKD: [0x0020] }, +{ source: [0x2005], NFC: [0x2005], NFD: [0x2005], NFKC: [0x0020], NFKD: [0x0020] }, +{ source: [0x2006], NFC: [0x2006], NFD: [0x2006], NFKC: [0x0020], NFKD: [0x0020] }, +{ source: [0x2007], NFC: [0x2007], NFD: [0x2007], NFKC: [0x0020], NFKD: [0x0020] }, +{ source: [0x2008], NFC: [0x2008], NFD: [0x2008], NFKC: [0x0020], NFKD: [0x0020] }, +{ source: [0x2009], NFC: [0x2009], NFD: [0x2009], NFKC: [0x0020], NFKD: [0x0020] }, +{ source: [0x200A], NFC: [0x200A], NFD: [0x200A], NFKC: [0x0020], NFKD: [0x0020] }, +{ source: [0x2011], NFC: [0x2011], NFD: [0x2011], NFKC: [0x2010], NFKD: [0x2010] }, +{ source: [0x2017], NFC: [0x2017], NFD: [0x2017], NFKC: [0x0020, 0x0333], NFKD: [0x0020, 0x0333] }, +{ source: [0x2024], NFC: [0x2024], NFD: [0x2024], NFKC: [0x002E], NFKD: [0x002E] }, +{ source: [0x2025], NFC: [0x2025], NFD: [0x2025], NFKC: [0x002E, 0x002E], NFKD: [0x002E, 0x002E] }, +{ source: [0x2026], NFC: [0x2026], NFD: [0x2026], NFKC: [0x002E, 0x002E, 0x002E], NFKD: [0x002E, 0x002E, 0x002E] }, +{ source: [0x202F], NFC: [0x202F], NFD: [0x202F], NFKC: [0x0020], NFKD: [0x0020] }, +{ source: [0x2033], NFC: [0x2033], NFD: [0x2033], NFKC: [0x2032, 0x2032], NFKD: [0x2032, 0x2032] }, +{ source: [0x2034], NFC: [0x2034], NFD: [0x2034], NFKC: [0x2032, 0x2032, 0x2032], NFKD: [0x2032, 0x2032, 0x2032] }, +{ source: [0x2036], NFC: [0x2036], NFD: [0x2036], NFKC: [0x2035, 0x2035], NFKD: [0x2035, 0x2035] }, +{ source: [0x2037], NFC: [0x2037], NFD: [0x2037], NFKC: [0x2035, 0x2035, 0x2035], NFKD: [0x2035, 0x2035, 0x2035] }, +{ source: [0x203C], NFC: [0x203C], NFD: [0x203C], NFKC: [0x0021, 0x0021], NFKD: [0x0021, 0x0021] }, +{ source: [0x203E], NFC: [0x203E], NFD: [0x203E], NFKC: [0x0020, 0x0305], NFKD: [0x0020, 0x0305] }, +{ source: [0x2047], NFC: [0x2047], NFD: [0x2047], NFKC: [0x003F, 0x003F], NFKD: [0x003F, 0x003F] }, +{ source: [0x2048], NFC: [0x2048], NFD: [0x2048], NFKC: [0x003F, 0x0021], NFKD: [0x003F, 0x0021] }, +{ source: [0x2049], NFC: [0x2049], NFD: [0x2049], NFKC: [0x0021, 0x003F], NFKD: [0x0021, 0x003F] }, +{ source: [0x2057], NFC: [0x2057], NFD: [0x2057], NFKC: [0x2032, 0x2032, 0x2032, 0x2032], NFKD: [0x2032, 0x2032, 0x2032, 0x2032] }, +{ source: [0x205F], NFC: [0x205F], NFD: [0x205F], NFKC: [0x0020], NFKD: [0x0020] }, +{ source: [0x2070], NFC: [0x2070], NFD: [0x2070], NFKC: [0x0030], NFKD: [0x0030] }, +{ source: [0x2071], NFC: [0x2071], NFD: [0x2071], NFKC: [0x0069], NFKD: [0x0069] }, +{ source: [0x2074], NFC: [0x2074], NFD: [0x2074], NFKC: [0x0034], NFKD: [0x0034] }, +{ source: [0x2075], NFC: [0x2075], NFD: [0x2075], NFKC: [0x0035], NFKD: [0x0035] }, +{ source: [0x2076], NFC: [0x2076], NFD: [0x2076], NFKC: [0x0036], NFKD: [0x0036] }, +{ source: [0x2077], NFC: [0x2077], NFD: [0x2077], NFKC: [0x0037], NFKD: [0x0037] }, +{ source: [0x2078], NFC: [0x2078], NFD: [0x2078], NFKC: [0x0038], NFKD: [0x0038] }, +{ source: [0x2079], NFC: [0x2079], NFD: [0x2079], NFKC: [0x0039], NFKD: [0x0039] }, +{ source: [0x207A], NFC: [0x207A], NFD: [0x207A], NFKC: [0x002B], NFKD: [0x002B] }, +{ source: [0x207B], NFC: [0x207B], NFD: [0x207B], NFKC: [0x2212], NFKD: [0x2212] }, +{ source: [0x207C], NFC: [0x207C], NFD: [0x207C], NFKC: [0x003D], NFKD: [0x003D] }, +{ source: [0x207D], NFC: [0x207D], NFD: [0x207D], NFKC: [0x0028], NFKD: [0x0028] }, +{ source: [0x207E], NFC: [0x207E], NFD: [0x207E], NFKC: [0x0029], NFKD: [0x0029] }, +{ source: [0x207F], NFC: [0x207F], NFD: [0x207F], NFKC: [0x006E], NFKD: [0x006E] }, +{ source: [0x2080], NFC: [0x2080], NFD: [0x2080], NFKC: [0x0030], NFKD: [0x0030] }, +{ source: [0x2081], NFC: [0x2081], NFD: [0x2081], NFKC: [0x0031], NFKD: [0x0031] }, +{ source: [0x2082], NFC: [0x2082], NFD: [0x2082], NFKC: [0x0032], NFKD: [0x0032] }, +{ source: [0x2083], NFC: [0x2083], NFD: [0x2083], NFKC: [0x0033], NFKD: [0x0033] }, +{ source: [0x2084], NFC: [0x2084], NFD: [0x2084], NFKC: [0x0034], NFKD: [0x0034] }, +{ source: [0x2085], NFC: [0x2085], NFD: [0x2085], NFKC: [0x0035], NFKD: [0x0035] }, +{ source: [0x2086], NFC: [0x2086], NFD: [0x2086], NFKC: [0x0036], NFKD: [0x0036] }, +{ source: [0x2087], NFC: [0x2087], NFD: [0x2087], NFKC: [0x0037], NFKD: [0x0037] }, +{ source: [0x2088], NFC: [0x2088], NFD: [0x2088], NFKC: [0x0038], NFKD: [0x0038] }, +{ source: [0x2089], NFC: [0x2089], NFD: [0x2089], NFKC: [0x0039], NFKD: [0x0039] }, +{ source: [0x208A], NFC: [0x208A], NFD: [0x208A], NFKC: [0x002B], NFKD: [0x002B] }, +{ source: [0x208B], NFC: [0x208B], NFD: [0x208B], NFKC: [0x2212], NFKD: [0x2212] }, +{ source: [0x208C], NFC: [0x208C], NFD: [0x208C], NFKC: [0x003D], NFKD: [0x003D] }, +{ source: [0x208D], NFC: [0x208D], NFD: [0x208D], NFKC: [0x0028], NFKD: [0x0028] }, +{ source: [0x208E], NFC: [0x208E], NFD: [0x208E], NFKC: [0x0029], NFKD: [0x0029] }, +{ source: [0x2090], NFC: [0x2090], NFD: [0x2090], NFKC: [0x0061], NFKD: [0x0061] }, +{ source: [0x2091], NFC: [0x2091], NFD: [0x2091], NFKC: [0x0065], NFKD: [0x0065] }, +{ source: [0x2092], NFC: [0x2092], NFD: [0x2092], NFKC: [0x006F], NFKD: [0x006F] }, +{ source: [0x2093], NFC: [0x2093], NFD: [0x2093], NFKC: [0x0078], NFKD: [0x0078] }, +{ source: [0x2094], NFC: [0x2094], NFD: [0x2094], NFKC: [0x0259], NFKD: [0x0259] }, +{ source: [0x2095], NFC: [0x2095], NFD: [0x2095], NFKC: [0x0068], NFKD: [0x0068] }, +{ source: [0x2096], NFC: [0x2096], NFD: [0x2096], NFKC: [0x006B], NFKD: [0x006B] }, +{ source: [0x2097], NFC: [0x2097], NFD: [0x2097], NFKC: [0x006C], NFKD: [0x006C] }, +{ source: [0x2098], NFC: [0x2098], NFD: [0x2098], NFKC: [0x006D], NFKD: [0x006D] }, +{ source: [0x2099], NFC: [0x2099], NFD: [0x2099], NFKC: [0x006E], NFKD: [0x006E] }, +{ source: [0x209A], NFC: [0x209A], NFD: [0x209A], NFKC: [0x0070], NFKD: [0x0070] }, +{ source: [0x209B], NFC: [0x209B], NFD: [0x209B], NFKC: [0x0073], NFKD: [0x0073] }, +{ source: [0x209C], NFC: [0x209C], NFD: [0x209C], NFKC: [0x0074], NFKD: [0x0074] }, +{ source: [0x20A8], NFC: [0x20A8], NFD: [0x20A8], NFKC: [0x0052, 0x0073], NFKD: [0x0052, 0x0073] }, +{ source: [0x2100], NFC: [0x2100], NFD: [0x2100], NFKC: [0x0061, 0x002F, 0x0063], NFKD: [0x0061, 0x002F, 0x0063] }, +{ source: [0x2101], NFC: [0x2101], NFD: [0x2101], NFKC: [0x0061, 0x002F, 0x0073], NFKD: [0x0061, 0x002F, 0x0073] }, +{ source: [0x2102], NFC: [0x2102], NFD: [0x2102], NFKC: [0x0043], NFKD: [0x0043] }, +{ source: [0x2103], NFC: [0x2103], NFD: [0x2103], NFKC: [0x00B0, 0x0043], NFKD: [0x00B0, 0x0043] }, +{ source: [0x2105], NFC: [0x2105], NFD: [0x2105], NFKC: [0x0063, 0x002F, 0x006F], NFKD: [0x0063, 0x002F, 0x006F] }, +{ source: [0x2106], NFC: [0x2106], NFD: [0x2106], NFKC: [0x0063, 0x002F, 0x0075], NFKD: [0x0063, 0x002F, 0x0075] }, +{ source: [0x2107], NFC: [0x2107], NFD: [0x2107], NFKC: [0x0190], NFKD: [0x0190] }, +{ source: [0x2109], NFC: [0x2109], NFD: [0x2109], NFKC: [0x00B0, 0x0046], NFKD: [0x00B0, 0x0046] }, +{ source: [0x210A], NFC: [0x210A], NFD: [0x210A], NFKC: [0x0067], NFKD: [0x0067] }, +{ source: [0x210B], NFC: [0x210B], NFD: [0x210B], NFKC: [0x0048], NFKD: [0x0048] }, +{ source: [0x210C], NFC: [0x210C], NFD: [0x210C], NFKC: [0x0048], NFKD: [0x0048] }, +{ source: [0x210D], NFC: [0x210D], NFD: [0x210D], NFKC: [0x0048], NFKD: [0x0048] }, +{ source: [0x210E], NFC: [0x210E], NFD: [0x210E], NFKC: [0x0068], NFKD: [0x0068] }, +{ source: [0x210F], NFC: [0x210F], NFD: [0x210F], NFKC: [0x0127], NFKD: [0x0127] }, +{ source: [0x2110], NFC: [0x2110], NFD: [0x2110], NFKC: [0x0049], NFKD: [0x0049] }, +{ source: [0x2111], NFC: [0x2111], NFD: [0x2111], NFKC: [0x0049], NFKD: [0x0049] }, +{ source: [0x2112], NFC: [0x2112], NFD: [0x2112], NFKC: [0x004C], NFKD: [0x004C] }, +{ source: [0x2113], NFC: [0x2113], NFD: [0x2113], NFKC: [0x006C], NFKD: [0x006C] }, +{ source: [0x2115], NFC: [0x2115], NFD: [0x2115], NFKC: [0x004E], NFKD: [0x004E] }, +{ source: [0x2116], NFC: [0x2116], NFD: [0x2116], NFKC: [0x004E, 0x006F], NFKD: [0x004E, 0x006F] }, +{ source: [0x2119], NFC: [0x2119], NFD: [0x2119], NFKC: [0x0050], NFKD: [0x0050] }, +{ source: [0x211A], NFC: [0x211A], NFD: [0x211A], NFKC: [0x0051], NFKD: [0x0051] }, +{ source: [0x211B], NFC: [0x211B], NFD: [0x211B], NFKC: [0x0052], NFKD: [0x0052] }, +{ source: [0x211C], NFC: [0x211C], NFD: [0x211C], NFKC: [0x0052], NFKD: [0x0052] }, +{ source: [0x211D], NFC: [0x211D], NFD: [0x211D], NFKC: [0x0052], NFKD: [0x0052] }, +{ source: [0x2120], NFC: [0x2120], NFD: [0x2120], NFKC: [0x0053, 0x004D], NFKD: [0x0053, 0x004D] }, +{ source: [0x2121], NFC: [0x2121], NFD: [0x2121], NFKC: [0x0054, 0x0045, 0x004C], NFKD: [0x0054, 0x0045, 0x004C] }, +{ source: [0x2122], NFC: [0x2122], NFD: [0x2122], NFKC: [0x0054, 0x004D], NFKD: [0x0054, 0x004D] }, +{ source: [0x2124], NFC: [0x2124], NFD: [0x2124], NFKC: [0x005A], NFKD: [0x005A] }, +{ source: [0x2126], NFC: [0x03A9], NFD: [0x03A9], NFKC: [0x03A9], NFKD: [0x03A9] }, +{ source: [0x2128], NFC: [0x2128], NFD: [0x2128], NFKC: [0x005A], NFKD: [0x005A] }, +{ source: [0x212A], NFC: [0x004B], NFD: [0x004B], NFKC: [0x004B], NFKD: [0x004B] }, +{ source: [0x212B], NFC: [0x00C5], NFD: [0x0041, 0x030A], NFKC: [0x00C5], NFKD: [0x0041, 0x030A] }, +{ source: [0x212C], NFC: [0x212C], NFD: [0x212C], NFKC: [0x0042], NFKD: [0x0042] }, +{ source: [0x212D], NFC: [0x212D], NFD: [0x212D], NFKC: [0x0043], NFKD: [0x0043] }, +{ source: [0x212F], NFC: [0x212F], NFD: [0x212F], NFKC: [0x0065], NFKD: [0x0065] }, +{ source: [0x2130], NFC: [0x2130], NFD: [0x2130], NFKC: [0x0045], NFKD: [0x0045] }, +{ source: [0x2131], NFC: [0x2131], NFD: [0x2131], NFKC: [0x0046], NFKD: [0x0046] }, +{ source: [0x2133], NFC: [0x2133], NFD: [0x2133], NFKC: [0x004D], NFKD: [0x004D] }, +{ source: [0x2134], NFC: [0x2134], NFD: [0x2134], NFKC: [0x006F], NFKD: [0x006F] }, +{ source: [0x2135], NFC: [0x2135], NFD: [0x2135], NFKC: [0x05D0], NFKD: [0x05D0] }, +{ source: [0x2136], NFC: [0x2136], NFD: [0x2136], NFKC: [0x05D1], NFKD: [0x05D1] }, +{ source: [0x2137], NFC: [0x2137], NFD: [0x2137], NFKC: [0x05D2], NFKD: [0x05D2] }, +{ source: [0x2138], NFC: [0x2138], NFD: [0x2138], NFKC: [0x05D3], NFKD: [0x05D3] }, +{ source: [0x2139], NFC: [0x2139], NFD: [0x2139], NFKC: [0x0069], NFKD: [0x0069] }, +{ source: [0x213B], NFC: [0x213B], NFD: [0x213B], NFKC: [0x0046, 0x0041, 0x0058], NFKD: [0x0046, 0x0041, 0x0058] }, +{ source: [0x213C], NFC: [0x213C], NFD: [0x213C], NFKC: [0x03C0], NFKD: [0x03C0] }, +{ source: [0x213D], NFC: [0x213D], NFD: [0x213D], NFKC: [0x03B3], NFKD: [0x03B3] }, +{ source: [0x213E], NFC: [0x213E], NFD: [0x213E], NFKC: [0x0393], NFKD: [0x0393] }, +{ source: [0x213F], NFC: [0x213F], NFD: [0x213F], NFKC: [0x03A0], NFKD: [0x03A0] }, +{ source: [0x2140], NFC: [0x2140], NFD: [0x2140], NFKC: [0x2211], NFKD: [0x2211] }, +{ source: [0x2145], NFC: [0x2145], NFD: [0x2145], NFKC: [0x0044], NFKD: [0x0044] }, +{ source: [0x2146], NFC: [0x2146], NFD: [0x2146], NFKC: [0x0064], NFKD: [0x0064] }, +{ source: [0x2147], NFC: [0x2147], NFD: [0x2147], NFKC: [0x0065], NFKD: [0x0065] }, +{ source: [0x2148], NFC: [0x2148], NFD: [0x2148], NFKC: [0x0069], NFKD: [0x0069] }, +{ source: [0x2149], NFC: [0x2149], NFD: [0x2149], NFKC: [0x006A], NFKD: [0x006A] }, +{ source: [0x2150], NFC: [0x2150], NFD: [0x2150], NFKC: [0x0031, 0x2044, 0x0037], NFKD: [0x0031, 0x2044, 0x0037] }, +{ source: [0x2151], NFC: [0x2151], NFD: [0x2151], NFKC: [0x0031, 0x2044, 0x0039], NFKD: [0x0031, 0x2044, 0x0039] }, +{ source: [0x2152], NFC: [0x2152], NFD: [0x2152], NFKC: [0x0031, 0x2044, 0x0031, 0x0030], NFKD: [0x0031, 0x2044, 0x0031, 0x0030] }, +{ source: [0x2153], NFC: [0x2153], NFD: [0x2153], NFKC: [0x0031, 0x2044, 0x0033], NFKD: [0x0031, 0x2044, 0x0033] }, +{ source: [0x2154], NFC: [0x2154], NFD: [0x2154], NFKC: [0x0032, 0x2044, 0x0033], NFKD: [0x0032, 0x2044, 0x0033] }, +{ source: [0x2155], NFC: [0x2155], NFD: [0x2155], NFKC: [0x0031, 0x2044, 0x0035], NFKD: [0x0031, 0x2044, 0x0035] }, +{ source: [0x2156], NFC: [0x2156], NFD: [0x2156], NFKC: [0x0032, 0x2044, 0x0035], NFKD: [0x0032, 0x2044, 0x0035] }, +{ source: [0x2157], NFC: [0x2157], NFD: [0x2157], NFKC: [0x0033, 0x2044, 0x0035], NFKD: [0x0033, 0x2044, 0x0035] }, +{ source: [0x2158], NFC: [0x2158], NFD: [0x2158], NFKC: [0x0034, 0x2044, 0x0035], NFKD: [0x0034, 0x2044, 0x0035] }, +{ source: [0x2159], NFC: [0x2159], NFD: [0x2159], NFKC: [0x0031, 0x2044, 0x0036], NFKD: [0x0031, 0x2044, 0x0036] }, +{ source: [0x215A], NFC: [0x215A], NFD: [0x215A], NFKC: [0x0035, 0x2044, 0x0036], NFKD: [0x0035, 0x2044, 0x0036] }, +{ source: [0x215B], NFC: [0x215B], NFD: [0x215B], NFKC: [0x0031, 0x2044, 0x0038], NFKD: [0x0031, 0x2044, 0x0038] }, +{ source: [0x215C], NFC: [0x215C], NFD: [0x215C], NFKC: [0x0033, 0x2044, 0x0038], NFKD: [0x0033, 0x2044, 0x0038] }, +{ source: [0x215D], NFC: [0x215D], NFD: [0x215D], NFKC: [0x0035, 0x2044, 0x0038], NFKD: [0x0035, 0x2044, 0x0038] }, +{ source: [0x215E], NFC: [0x215E], NFD: [0x215E], NFKC: [0x0037, 0x2044, 0x0038], NFKD: [0x0037, 0x2044, 0x0038] }, +{ source: [0x215F], NFC: [0x215F], NFD: [0x215F], NFKC: [0x0031, 0x2044], NFKD: [0x0031, 0x2044] }, +{ source: [0x2160], NFC: [0x2160], NFD: [0x2160], NFKC: [0x0049], NFKD: [0x0049] }, +{ source: [0x2161], NFC: [0x2161], NFD: [0x2161], NFKC: [0x0049, 0x0049], NFKD: [0x0049, 0x0049] }, +{ source: [0x2162], NFC: [0x2162], NFD: [0x2162], NFKC: [0x0049, 0x0049, 0x0049], NFKD: [0x0049, 0x0049, 0x0049] }, +{ source: [0x2163], NFC: [0x2163], NFD: [0x2163], NFKC: [0x0049, 0x0056], NFKD: [0x0049, 0x0056] }, +{ source: [0x2164], NFC: [0x2164], NFD: [0x2164], NFKC: [0x0056], NFKD: [0x0056] }, +{ source: [0x2165], NFC: [0x2165], NFD: [0x2165], NFKC: [0x0056, 0x0049], NFKD: [0x0056, 0x0049] }, +{ source: [0x2166], NFC: [0x2166], NFD: [0x2166], NFKC: [0x0056, 0x0049, 0x0049], NFKD: [0x0056, 0x0049, 0x0049] }, +{ source: [0x2167], NFC: [0x2167], NFD: [0x2167], NFKC: [0x0056, 0x0049, 0x0049, 0x0049], NFKD: [0x0056, 0x0049, 0x0049, 0x0049] }, +{ source: [0x2168], NFC: [0x2168], NFD: [0x2168], NFKC: [0x0049, 0x0058], NFKD: [0x0049, 0x0058] }, +{ source: [0x2169], NFC: [0x2169], NFD: [0x2169], NFKC: [0x0058], NFKD: [0x0058] }, +{ source: [0x216A], NFC: [0x216A], NFD: [0x216A], NFKC: [0x0058, 0x0049], NFKD: [0x0058, 0x0049] }, +{ source: [0x216B], NFC: [0x216B], NFD: [0x216B], NFKC: [0x0058, 0x0049, 0x0049], NFKD: [0x0058, 0x0049, 0x0049] }, +{ source: [0x216C], NFC: [0x216C], NFD: [0x216C], NFKC: [0x004C], NFKD: [0x004C] }, +{ source: [0x216D], NFC: [0x216D], NFD: [0x216D], NFKC: [0x0043], NFKD: [0x0043] }, +{ source: [0x216E], NFC: [0x216E], NFD: [0x216E], NFKC: [0x0044], NFKD: [0x0044] }, +{ source: [0x216F], NFC: [0x216F], NFD: [0x216F], NFKC: [0x004D], NFKD: [0x004D] }, +{ source: [0x2170], NFC: [0x2170], NFD: [0x2170], NFKC: [0x0069], NFKD: [0x0069] }, +{ source: [0x2171], NFC: [0x2171], NFD: [0x2171], NFKC: [0x0069, 0x0069], NFKD: [0x0069, 0x0069] }, +{ source: [0x2172], NFC: [0x2172], NFD: [0x2172], NFKC: [0x0069, 0x0069, 0x0069], NFKD: [0x0069, 0x0069, 0x0069] }, +{ source: [0x2173], NFC: [0x2173], NFD: [0x2173], NFKC: [0x0069, 0x0076], NFKD: [0x0069, 0x0076] }, +{ source: [0x2174], NFC: [0x2174], NFD: [0x2174], NFKC: [0x0076], NFKD: [0x0076] }, +{ source: [0x2175], NFC: [0x2175], NFD: [0x2175], NFKC: [0x0076, 0x0069], NFKD: [0x0076, 0x0069] }, +{ source: [0x2176], NFC: [0x2176], NFD: [0x2176], NFKC: [0x0076, 0x0069, 0x0069], NFKD: [0x0076, 0x0069, 0x0069] }, +{ source: [0x2177], NFC: [0x2177], NFD: [0x2177], NFKC: [0x0076, 0x0069, 0x0069, 0x0069], NFKD: [0x0076, 0x0069, 0x0069, 0x0069] }, +{ source: [0x2178], NFC: [0x2178], NFD: [0x2178], NFKC: [0x0069, 0x0078], NFKD: [0x0069, 0x0078] }, +{ source: [0x2179], NFC: [0x2179], NFD: [0x2179], NFKC: [0x0078], NFKD: [0x0078] }, +{ source: [0x217A], NFC: [0x217A], NFD: [0x217A], NFKC: [0x0078, 0x0069], NFKD: [0x0078, 0x0069] }, +{ source: [0x217B], NFC: [0x217B], NFD: [0x217B], NFKC: [0x0078, 0x0069, 0x0069], NFKD: [0x0078, 0x0069, 0x0069] }, +{ source: [0x217C], NFC: [0x217C], NFD: [0x217C], NFKC: [0x006C], NFKD: [0x006C] }, +{ source: [0x217D], NFC: [0x217D], NFD: [0x217D], NFKC: [0x0063], NFKD: [0x0063] }, +{ source: [0x217E], NFC: [0x217E], NFD: [0x217E], NFKC: [0x0064], NFKD: [0x0064] }, +{ source: [0x217F], NFC: [0x217F], NFD: [0x217F], NFKC: [0x006D], NFKD: [0x006D] }, +{ source: [0x2189], NFC: [0x2189], NFD: [0x2189], NFKC: [0x0030, 0x2044, 0x0033], NFKD: [0x0030, 0x2044, 0x0033] }, +{ source: [0x219A], NFC: [0x219A], NFD: [0x2190, 0x0338], NFKC: [0x219A], NFKD: [0x2190, 0x0338] }, +{ source: [0x219B], NFC: [0x219B], NFD: [0x2192, 0x0338], NFKC: [0x219B], NFKD: [0x2192, 0x0338] }, +{ source: [0x21AE], NFC: [0x21AE], NFD: [0x2194, 0x0338], NFKC: [0x21AE], NFKD: [0x2194, 0x0338] }, +{ source: [0x21CD], NFC: [0x21CD], NFD: [0x21D0, 0x0338], NFKC: [0x21CD], NFKD: [0x21D0, 0x0338] }, +{ source: [0x21CE], NFC: [0x21CE], NFD: [0x21D4, 0x0338], NFKC: [0x21CE], NFKD: [0x21D4, 0x0338] }, +{ source: [0x21CF], NFC: [0x21CF], NFD: [0x21D2, 0x0338], NFKC: [0x21CF], NFKD: [0x21D2, 0x0338] }, +{ source: [0x2204], NFC: [0x2204], NFD: [0x2203, 0x0338], NFKC: [0x2204], NFKD: [0x2203, 0x0338] }, +{ source: [0x2209], NFC: [0x2209], NFD: [0x2208, 0x0338], NFKC: [0x2209], NFKD: [0x2208, 0x0338] }, +{ source: [0x220C], NFC: [0x220C], NFD: [0x220B, 0x0338], NFKC: [0x220C], NFKD: [0x220B, 0x0338] }, +{ source: [0x2224], NFC: [0x2224], NFD: [0x2223, 0x0338], NFKC: [0x2224], NFKD: [0x2223, 0x0338] }, +{ source: [0x2226], NFC: [0x2226], NFD: [0x2225, 0x0338], NFKC: [0x2226], NFKD: [0x2225, 0x0338] }, +{ source: [0x222C], NFC: [0x222C], NFD: [0x222C], NFKC: [0x222B, 0x222B], NFKD: [0x222B, 0x222B] }, +{ source: [0x222D], NFC: [0x222D], NFD: [0x222D], NFKC: [0x222B, 0x222B, 0x222B], NFKD: [0x222B, 0x222B, 0x222B] }, +{ source: [0x222F], NFC: [0x222F], NFD: [0x222F], NFKC: [0x222E, 0x222E], NFKD: [0x222E, 0x222E] }, +{ source: [0x2230], NFC: [0x2230], NFD: [0x2230], NFKC: [0x222E, 0x222E, 0x222E], NFKD: [0x222E, 0x222E, 0x222E] }, +{ source: [0x2241], NFC: [0x2241], NFD: [0x223C, 0x0338], NFKC: [0x2241], NFKD: [0x223C, 0x0338] }, +{ source: [0x2244], NFC: [0x2244], NFD: [0x2243, 0x0338], NFKC: [0x2244], NFKD: [0x2243, 0x0338] }, +{ source: [0x2247], NFC: [0x2247], NFD: [0x2245, 0x0338], NFKC: [0x2247], NFKD: [0x2245, 0x0338] }, +{ source: [0x2249], NFC: [0x2249], NFD: [0x2248, 0x0338], NFKC: [0x2249], NFKD: [0x2248, 0x0338] }, +{ source: [0x2260], NFC: [0x2260], NFD: [0x003D, 0x0338], NFKC: [0x2260], NFKD: [0x003D, 0x0338] }, +{ source: [0x2262], NFC: [0x2262], NFD: [0x2261, 0x0338], NFKC: [0x2262], NFKD: [0x2261, 0x0338] }, +{ source: [0x226D], NFC: [0x226D], NFD: [0x224D, 0x0338], NFKC: [0x226D], NFKD: [0x224D, 0x0338] }, +{ source: [0x226E], NFC: [0x226E], NFD: [0x003C, 0x0338], NFKC: [0x226E], NFKD: [0x003C, 0x0338] }, +{ source: [0x226F], NFC: [0x226F], NFD: [0x003E, 0x0338], NFKC: [0x226F], NFKD: [0x003E, 0x0338] }, +{ source: [0x2270], NFC: [0x2270], NFD: [0x2264, 0x0338], NFKC: [0x2270], NFKD: [0x2264, 0x0338] }, +{ source: [0x2271], NFC: [0x2271], NFD: [0x2265, 0x0338], NFKC: [0x2271], NFKD: [0x2265, 0x0338] }, +{ source: [0x2274], NFC: [0x2274], NFD: [0x2272, 0x0338], NFKC: [0x2274], NFKD: [0x2272, 0x0338] }, +{ source: [0x2275], NFC: [0x2275], NFD: [0x2273, 0x0338], NFKC: [0x2275], NFKD: [0x2273, 0x0338] }, +{ source: [0x2278], NFC: [0x2278], NFD: [0x2276, 0x0338], NFKC: [0x2278], NFKD: [0x2276, 0x0338] }, +{ source: [0x2279], NFC: [0x2279], NFD: [0x2277, 0x0338], NFKC: [0x2279], NFKD: [0x2277, 0x0338] }, +{ source: [0x2280], NFC: [0x2280], NFD: [0x227A, 0x0338], NFKC: [0x2280], NFKD: [0x227A, 0x0338] }, +{ source: [0x2281], NFC: [0x2281], NFD: [0x227B, 0x0338], NFKC: [0x2281], NFKD: [0x227B, 0x0338] }, +{ source: [0x2284], NFC: [0x2284], NFD: [0x2282, 0x0338], NFKC: [0x2284], NFKD: [0x2282, 0x0338] }, +{ source: [0x2285], NFC: [0x2285], NFD: [0x2283, 0x0338], NFKC: [0x2285], NFKD: [0x2283, 0x0338] }, +{ source: [0x2288], NFC: [0x2288], NFD: [0x2286, 0x0338], NFKC: [0x2288], NFKD: [0x2286, 0x0338] }, +{ source: [0x2289], NFC: [0x2289], NFD: [0x2287, 0x0338], NFKC: [0x2289], NFKD: [0x2287, 0x0338] }, +{ source: [0x22AC], NFC: [0x22AC], NFD: [0x22A2, 0x0338], NFKC: [0x22AC], NFKD: [0x22A2, 0x0338] }, +{ source: [0x22AD], NFC: [0x22AD], NFD: [0x22A8, 0x0338], NFKC: [0x22AD], NFKD: [0x22A8, 0x0338] }, +{ source: [0x22AE], NFC: [0x22AE], NFD: [0x22A9, 0x0338], NFKC: [0x22AE], NFKD: [0x22A9, 0x0338] }, +{ source: [0x22AF], NFC: [0x22AF], NFD: [0x22AB, 0x0338], NFKC: [0x22AF], NFKD: [0x22AB, 0x0338] }, +{ source: [0x22E0], NFC: [0x22E0], NFD: [0x227C, 0x0338], NFKC: [0x22E0], NFKD: [0x227C, 0x0338] }, +{ source: [0x22E1], NFC: [0x22E1], NFD: [0x227D, 0x0338], NFKC: [0x22E1], NFKD: [0x227D, 0x0338] }, +{ source: [0x22E2], NFC: [0x22E2], NFD: [0x2291, 0x0338], NFKC: [0x22E2], NFKD: [0x2291, 0x0338] }, +{ source: [0x22E3], NFC: [0x22E3], NFD: [0x2292, 0x0338], NFKC: [0x22E3], NFKD: [0x2292, 0x0338] }, +{ source: [0x22EA], NFC: [0x22EA], NFD: [0x22B2, 0x0338], NFKC: [0x22EA], NFKD: [0x22B2, 0x0338] }, +{ source: [0x22EB], NFC: [0x22EB], NFD: [0x22B3, 0x0338], NFKC: [0x22EB], NFKD: [0x22B3, 0x0338] }, +{ source: [0x22EC], NFC: [0x22EC], NFD: [0x22B4, 0x0338], NFKC: [0x22EC], NFKD: [0x22B4, 0x0338] }, +{ source: [0x22ED], NFC: [0x22ED], NFD: [0x22B5, 0x0338], NFKC: [0x22ED], NFKD: [0x22B5, 0x0338] }, +{ source: [0x2329], NFC: [0x3008], NFD: [0x3008], NFKC: [0x3008], NFKD: [0x3008] }, +{ source: [0x232A], NFC: [0x3009], NFD: [0x3009], NFKC: [0x3009], NFKD: [0x3009] }, +{ source: [0x2460], NFC: [0x2460], NFD: [0x2460], NFKC: [0x0031], NFKD: [0x0031] }, +{ source: [0x2461], NFC: [0x2461], NFD: [0x2461], NFKC: [0x0032], NFKD: [0x0032] }, +{ source: [0x2462], NFC: [0x2462], NFD: [0x2462], NFKC: [0x0033], NFKD: [0x0033] }, +{ source: [0x2463], NFC: [0x2463], NFD: [0x2463], NFKC: [0x0034], NFKD: [0x0034] }, +{ source: [0x2464], NFC: [0x2464], NFD: [0x2464], NFKC: [0x0035], NFKD: [0x0035] }, +{ source: [0x2465], NFC: [0x2465], NFD: [0x2465], NFKC: [0x0036], NFKD: [0x0036] }, +{ source: [0x2466], NFC: [0x2466], NFD: [0x2466], NFKC: [0x0037], NFKD: [0x0037] }, +{ source: [0x2467], NFC: [0x2467], NFD: [0x2467], NFKC: [0x0038], NFKD: [0x0038] }, +{ source: [0x2468], NFC: [0x2468], NFD: [0x2468], NFKC: [0x0039], NFKD: [0x0039] }, +{ source: [0x2469], NFC: [0x2469], NFD: [0x2469], NFKC: [0x0031, 0x0030], NFKD: [0x0031, 0x0030] }, +{ source: [0x246A], NFC: [0x246A], NFD: [0x246A], NFKC: [0x0031, 0x0031], NFKD: [0x0031, 0x0031] }, +{ source: [0x246B], NFC: [0x246B], NFD: [0x246B], NFKC: [0x0031, 0x0032], NFKD: [0x0031, 0x0032] }, +{ source: [0x246C], NFC: [0x246C], NFD: [0x246C], NFKC: [0x0031, 0x0033], NFKD: [0x0031, 0x0033] }, +{ source: [0x246D], NFC: [0x246D], NFD: [0x246D], NFKC: [0x0031, 0x0034], NFKD: [0x0031, 0x0034] }, +{ source: [0x246E], NFC: [0x246E], NFD: [0x246E], NFKC: [0x0031, 0x0035], NFKD: [0x0031, 0x0035] }, +{ source: [0x246F], NFC: [0x246F], NFD: [0x246F], NFKC: [0x0031, 0x0036], NFKD: [0x0031, 0x0036] }, +{ source: [0x2470], NFC: [0x2470], NFD: [0x2470], NFKC: [0x0031, 0x0037], NFKD: [0x0031, 0x0037] }, +{ source: [0x2471], NFC: [0x2471], NFD: [0x2471], NFKC: [0x0031, 0x0038], NFKD: [0x0031, 0x0038] }, +{ source: [0x2472], NFC: [0x2472], NFD: [0x2472], NFKC: [0x0031, 0x0039], NFKD: [0x0031, 0x0039] }, +{ source: [0x2473], NFC: [0x2473], NFD: [0x2473], NFKC: [0x0032, 0x0030], NFKD: [0x0032, 0x0030] }, +{ source: [0x2474], NFC: [0x2474], NFD: [0x2474], NFKC: [0x0028, 0x0031, 0x0029], NFKD: [0x0028, 0x0031, 0x0029] }, +{ source: [0x2475], NFC: [0x2475], NFD: [0x2475], NFKC: [0x0028, 0x0032, 0x0029], NFKD: [0x0028, 0x0032, 0x0029] }, +{ source: [0x2476], NFC: [0x2476], NFD: [0x2476], NFKC: [0x0028, 0x0033, 0x0029], NFKD: [0x0028, 0x0033, 0x0029] }, +{ source: [0x2477], NFC: [0x2477], NFD: [0x2477], NFKC: [0x0028, 0x0034, 0x0029], NFKD: [0x0028, 0x0034, 0x0029] }, +{ source: [0x2478], NFC: [0x2478], NFD: [0x2478], NFKC: [0x0028, 0x0035, 0x0029], NFKD: [0x0028, 0x0035, 0x0029] }, +{ source: [0x2479], NFC: [0x2479], NFD: [0x2479], NFKC: [0x0028, 0x0036, 0x0029], NFKD: [0x0028, 0x0036, 0x0029] }, +{ source: [0x247A], NFC: [0x247A], NFD: [0x247A], NFKC: [0x0028, 0x0037, 0x0029], NFKD: [0x0028, 0x0037, 0x0029] }, +{ source: [0x247B], NFC: [0x247B], NFD: [0x247B], NFKC: [0x0028, 0x0038, 0x0029], NFKD: [0x0028, 0x0038, 0x0029] }, +{ source: [0x247C], NFC: [0x247C], NFD: [0x247C], NFKC: [0x0028, 0x0039, 0x0029], NFKD: [0x0028, 0x0039, 0x0029] }, +{ source: [0x247D], NFC: [0x247D], NFD: [0x247D], NFKC: [0x0028, 0x0031, 0x0030, 0x0029], NFKD: [0x0028, 0x0031, 0x0030, 0x0029] }, +{ source: [0x247E], NFC: [0x247E], NFD: [0x247E], NFKC: [0x0028, 0x0031, 0x0031, 0x0029], NFKD: [0x0028, 0x0031, 0x0031, 0x0029] }, +{ source: [0x247F], NFC: [0x247F], NFD: [0x247F], NFKC: [0x0028, 0x0031, 0x0032, 0x0029], NFKD: [0x0028, 0x0031, 0x0032, 0x0029] }, +{ source: [0x2480], NFC: [0x2480], NFD: [0x2480], NFKC: [0x0028, 0x0031, 0x0033, 0x0029], NFKD: [0x0028, 0x0031, 0x0033, 0x0029] }, +{ source: [0x2481], NFC: [0x2481], NFD: [0x2481], NFKC: [0x0028, 0x0031, 0x0034, 0x0029], NFKD: [0x0028, 0x0031, 0x0034, 0x0029] }, +{ source: [0x2482], NFC: [0x2482], NFD: [0x2482], NFKC: [0x0028, 0x0031, 0x0035, 0x0029], NFKD: [0x0028, 0x0031, 0x0035, 0x0029] }, +{ source: [0x2483], NFC: [0x2483], NFD: [0x2483], NFKC: [0x0028, 0x0031, 0x0036, 0x0029], NFKD: [0x0028, 0x0031, 0x0036, 0x0029] }, +{ source: [0x2484], NFC: [0x2484], NFD: [0x2484], NFKC: [0x0028, 0x0031, 0x0037, 0x0029], NFKD: [0x0028, 0x0031, 0x0037, 0x0029] }, +{ source: [0x2485], NFC: [0x2485], NFD: [0x2485], NFKC: [0x0028, 0x0031, 0x0038, 0x0029], NFKD: [0x0028, 0x0031, 0x0038, 0x0029] }, +{ source: [0x2486], NFC: [0x2486], NFD: [0x2486], NFKC: [0x0028, 0x0031, 0x0039, 0x0029], NFKD: [0x0028, 0x0031, 0x0039, 0x0029] }, +{ source: [0x2487], NFC: [0x2487], NFD: [0x2487], NFKC: [0x0028, 0x0032, 0x0030, 0x0029], NFKD: [0x0028, 0x0032, 0x0030, 0x0029] }, +{ source: [0x2488], NFC: [0x2488], NFD: [0x2488], NFKC: [0x0031, 0x002E], NFKD: [0x0031, 0x002E] }, +{ source: [0x2489], NFC: [0x2489], NFD: [0x2489], NFKC: [0x0032, 0x002E], NFKD: [0x0032, 0x002E] }, +{ source: [0x248A], NFC: [0x248A], NFD: [0x248A], NFKC: [0x0033, 0x002E], NFKD: [0x0033, 0x002E] }, +{ source: [0x248B], NFC: [0x248B], NFD: [0x248B], NFKC: [0x0034, 0x002E], NFKD: [0x0034, 0x002E] }, +{ source: [0x248C], NFC: [0x248C], NFD: [0x248C], NFKC: [0x0035, 0x002E], NFKD: [0x0035, 0x002E] }, +{ source: [0x248D], NFC: [0x248D], NFD: [0x248D], NFKC: [0x0036, 0x002E], NFKD: [0x0036, 0x002E] }, +{ source: [0x248E], NFC: [0x248E], NFD: [0x248E], NFKC: [0x0037, 0x002E], NFKD: [0x0037, 0x002E] }, +{ source: [0x248F], NFC: [0x248F], NFD: [0x248F], NFKC: [0x0038, 0x002E], NFKD: [0x0038, 0x002E] }, +{ source: [0x2490], NFC: [0x2490], NFD: [0x2490], NFKC: [0x0039, 0x002E], NFKD: [0x0039, 0x002E] }, +{ source: [0x2491], NFC: [0x2491], NFD: [0x2491], NFKC: [0x0031, 0x0030, 0x002E], NFKD: [0x0031, 0x0030, 0x002E] }, +{ source: [0x2492], NFC: [0x2492], NFD: [0x2492], NFKC: [0x0031, 0x0031, 0x002E], NFKD: [0x0031, 0x0031, 0x002E] }, +{ source: [0x2493], NFC: [0x2493], NFD: [0x2493], NFKC: [0x0031, 0x0032, 0x002E], NFKD: [0x0031, 0x0032, 0x002E] }, +{ source: [0x2494], NFC: [0x2494], NFD: [0x2494], NFKC: [0x0031, 0x0033, 0x002E], NFKD: [0x0031, 0x0033, 0x002E] }, +{ source: [0x2495], NFC: [0x2495], NFD: [0x2495], NFKC: [0x0031, 0x0034, 0x002E], NFKD: [0x0031, 0x0034, 0x002E] }, +{ source: [0x2496], NFC: [0x2496], NFD: [0x2496], NFKC: [0x0031, 0x0035, 0x002E], NFKD: [0x0031, 0x0035, 0x002E] }, +{ source: [0x2497], NFC: [0x2497], NFD: [0x2497], NFKC: [0x0031, 0x0036, 0x002E], NFKD: [0x0031, 0x0036, 0x002E] }, +{ source: [0x2498], NFC: [0x2498], NFD: [0x2498], NFKC: [0x0031, 0x0037, 0x002E], NFKD: [0x0031, 0x0037, 0x002E] }, +{ source: [0x2499], NFC: [0x2499], NFD: [0x2499], NFKC: [0x0031, 0x0038, 0x002E], NFKD: [0x0031, 0x0038, 0x002E] }, +{ source: [0x249A], NFC: [0x249A], NFD: [0x249A], NFKC: [0x0031, 0x0039, 0x002E], NFKD: [0x0031, 0x0039, 0x002E] }, +{ source: [0x249B], NFC: [0x249B], NFD: [0x249B], NFKC: [0x0032, 0x0030, 0x002E], NFKD: [0x0032, 0x0030, 0x002E] }, +{ source: [0x249C], NFC: [0x249C], NFD: [0x249C], NFKC: [0x0028, 0x0061, 0x0029], NFKD: [0x0028, 0x0061, 0x0029] }, +{ source: [0x249D], NFC: [0x249D], NFD: [0x249D], NFKC: [0x0028, 0x0062, 0x0029], NFKD: [0x0028, 0x0062, 0x0029] }, +{ source: [0x249E], NFC: [0x249E], NFD: [0x249E], NFKC: [0x0028, 0x0063, 0x0029], NFKD: [0x0028, 0x0063, 0x0029] }, +{ source: [0x249F], NFC: [0x249F], NFD: [0x249F], NFKC: [0x0028, 0x0064, 0x0029], NFKD: [0x0028, 0x0064, 0x0029] }, +{ source: [0x24A0], NFC: [0x24A0], NFD: [0x24A0], NFKC: [0x0028, 0x0065, 0x0029], NFKD: [0x0028, 0x0065, 0x0029] }, +{ source: [0x24A1], NFC: [0x24A1], NFD: [0x24A1], NFKC: [0x0028, 0x0066, 0x0029], NFKD: [0x0028, 0x0066, 0x0029] }, +{ source: [0x24A2], NFC: [0x24A2], NFD: [0x24A2], NFKC: [0x0028, 0x0067, 0x0029], NFKD: [0x0028, 0x0067, 0x0029] }, +{ source: [0x24A3], NFC: [0x24A3], NFD: [0x24A3], NFKC: [0x0028, 0x0068, 0x0029], NFKD: [0x0028, 0x0068, 0x0029] }, +{ source: [0x24A4], NFC: [0x24A4], NFD: [0x24A4], NFKC: [0x0028, 0x0069, 0x0029], NFKD: [0x0028, 0x0069, 0x0029] }, +{ source: [0x24A5], NFC: [0x24A5], NFD: [0x24A5], NFKC: [0x0028, 0x006A, 0x0029], NFKD: [0x0028, 0x006A, 0x0029] }, +{ source: [0x24A6], NFC: [0x24A6], NFD: [0x24A6], NFKC: [0x0028, 0x006B, 0x0029], NFKD: [0x0028, 0x006B, 0x0029] }, +{ source: [0x24A7], NFC: [0x24A7], NFD: [0x24A7], NFKC: [0x0028, 0x006C, 0x0029], NFKD: [0x0028, 0x006C, 0x0029] }, +{ source: [0x24A8], NFC: [0x24A8], NFD: [0x24A8], NFKC: [0x0028, 0x006D, 0x0029], NFKD: [0x0028, 0x006D, 0x0029] }, +{ source: [0x24A9], NFC: [0x24A9], NFD: [0x24A9], NFKC: [0x0028, 0x006E, 0x0029], NFKD: [0x0028, 0x006E, 0x0029] }, +{ source: [0x24AA], NFC: [0x24AA], NFD: [0x24AA], NFKC: [0x0028, 0x006F, 0x0029], NFKD: [0x0028, 0x006F, 0x0029] }, +{ source: [0x24AB], NFC: [0x24AB], NFD: [0x24AB], NFKC: [0x0028, 0x0070, 0x0029], NFKD: [0x0028, 0x0070, 0x0029] }, +{ source: [0x24AC], NFC: [0x24AC], NFD: [0x24AC], NFKC: [0x0028, 0x0071, 0x0029], NFKD: [0x0028, 0x0071, 0x0029] }, +{ source: [0x24AD], NFC: [0x24AD], NFD: [0x24AD], NFKC: [0x0028, 0x0072, 0x0029], NFKD: [0x0028, 0x0072, 0x0029] }, +{ source: [0x24AE], NFC: [0x24AE], NFD: [0x24AE], NFKC: [0x0028, 0x0073, 0x0029], NFKD: [0x0028, 0x0073, 0x0029] }, +{ source: [0x24AF], NFC: [0x24AF], NFD: [0x24AF], NFKC: [0x0028, 0x0074, 0x0029], NFKD: [0x0028, 0x0074, 0x0029] }, +{ source: [0x24B0], NFC: [0x24B0], NFD: [0x24B0], NFKC: [0x0028, 0x0075, 0x0029], NFKD: [0x0028, 0x0075, 0x0029] }, +{ source: [0x24B1], NFC: [0x24B1], NFD: [0x24B1], NFKC: [0x0028, 0x0076, 0x0029], NFKD: [0x0028, 0x0076, 0x0029] }, +{ source: [0x24B2], NFC: [0x24B2], NFD: [0x24B2], NFKC: [0x0028, 0x0077, 0x0029], NFKD: [0x0028, 0x0077, 0x0029] }, +{ source: [0x24B3], NFC: [0x24B3], NFD: [0x24B3], NFKC: [0x0028, 0x0078, 0x0029], NFKD: [0x0028, 0x0078, 0x0029] }, +{ source: [0x24B4], NFC: [0x24B4], NFD: [0x24B4], NFKC: [0x0028, 0x0079, 0x0029], NFKD: [0x0028, 0x0079, 0x0029] }, +{ source: [0x24B5], NFC: [0x24B5], NFD: [0x24B5], NFKC: [0x0028, 0x007A, 0x0029], NFKD: [0x0028, 0x007A, 0x0029] }, +{ source: [0x24B6], NFC: [0x24B6], NFD: [0x24B6], NFKC: [0x0041], NFKD: [0x0041] }, +{ source: [0x24B7], NFC: [0x24B7], NFD: [0x24B7], NFKC: [0x0042], NFKD: [0x0042] }, +{ source: [0x24B8], NFC: [0x24B8], NFD: [0x24B8], NFKC: [0x0043], NFKD: [0x0043] }, +{ source: [0x24B9], NFC: [0x24B9], NFD: [0x24B9], NFKC: [0x0044], NFKD: [0x0044] }, +{ source: [0x24BA], NFC: [0x24BA], NFD: [0x24BA], NFKC: [0x0045], NFKD: [0x0045] }, +{ source: [0x24BB], NFC: [0x24BB], NFD: [0x24BB], NFKC: [0x0046], NFKD: [0x0046] }, +{ source: [0x24BC], NFC: [0x24BC], NFD: [0x24BC], NFKC: [0x0047], NFKD: [0x0047] }, +{ source: [0x24BD], NFC: [0x24BD], NFD: [0x24BD], NFKC: [0x0048], NFKD: [0x0048] }, +{ source: [0x24BE], NFC: [0x24BE], NFD: [0x24BE], NFKC: [0x0049], NFKD: [0x0049] }, +{ source: [0x24BF], NFC: [0x24BF], NFD: [0x24BF], NFKC: [0x004A], NFKD: [0x004A] }, +{ source: [0x24C0], NFC: [0x24C0], NFD: [0x24C0], NFKC: [0x004B], NFKD: [0x004B] }, +{ source: [0x24C1], NFC: [0x24C1], NFD: [0x24C1], NFKC: [0x004C], NFKD: [0x004C] }, +{ source: [0x24C2], NFC: [0x24C2], NFD: [0x24C2], NFKC: [0x004D], NFKD: [0x004D] }, +{ source: [0x24C3], NFC: [0x24C3], NFD: [0x24C3], NFKC: [0x004E], NFKD: [0x004E] }, +{ source: [0x24C4], NFC: [0x24C4], NFD: [0x24C4], NFKC: [0x004F], NFKD: [0x004F] }, +{ source: [0x24C5], NFC: [0x24C5], NFD: [0x24C5], NFKC: [0x0050], NFKD: [0x0050] }, +{ source: [0x24C6], NFC: [0x24C6], NFD: [0x24C6], NFKC: [0x0051], NFKD: [0x0051] }, +{ source: [0x24C7], NFC: [0x24C7], NFD: [0x24C7], NFKC: [0x0052], NFKD: [0x0052] }, +{ source: [0x24C8], NFC: [0x24C8], NFD: [0x24C8], NFKC: [0x0053], NFKD: [0x0053] }, +{ source: [0x24C9], NFC: [0x24C9], NFD: [0x24C9], NFKC: [0x0054], NFKD: [0x0054] }, +{ source: [0x24CA], NFC: [0x24CA], NFD: [0x24CA], NFKC: [0x0055], NFKD: [0x0055] }, +{ source: [0x24CB], NFC: [0x24CB], NFD: [0x24CB], NFKC: [0x0056], NFKD: [0x0056] }, +{ source: [0x24CC], NFC: [0x24CC], NFD: [0x24CC], NFKC: [0x0057], NFKD: [0x0057] }, +{ source: [0x24CD], NFC: [0x24CD], NFD: [0x24CD], NFKC: [0x0058], NFKD: [0x0058] }, +{ source: [0x24CE], NFC: [0x24CE], NFD: [0x24CE], NFKC: [0x0059], NFKD: [0x0059] }, +{ source: [0x24CF], NFC: [0x24CF], NFD: [0x24CF], NFKC: [0x005A], NFKD: [0x005A] }, +{ source: [0x24D0], NFC: [0x24D0], NFD: [0x24D0], NFKC: [0x0061], NFKD: [0x0061] }, +{ source: [0x24D1], NFC: [0x24D1], NFD: [0x24D1], NFKC: [0x0062], NFKD: [0x0062] }, +{ source: [0x24D2], NFC: [0x24D2], NFD: [0x24D2], NFKC: [0x0063], NFKD: [0x0063] }, +{ source: [0x24D3], NFC: [0x24D3], NFD: [0x24D3], NFKC: [0x0064], NFKD: [0x0064] }, +{ source: [0x24D4], NFC: [0x24D4], NFD: [0x24D4], NFKC: [0x0065], NFKD: [0x0065] }, +{ source: [0x24D5], NFC: [0x24D5], NFD: [0x24D5], NFKC: [0x0066], NFKD: [0x0066] }, +{ source: [0x24D6], NFC: [0x24D6], NFD: [0x24D6], NFKC: [0x0067], NFKD: [0x0067] }, +{ source: [0x24D7], NFC: [0x24D7], NFD: [0x24D7], NFKC: [0x0068], NFKD: [0x0068] }, +{ source: [0x24D8], NFC: [0x24D8], NFD: [0x24D8], NFKC: [0x0069], NFKD: [0x0069] }, +{ source: [0x24D9], NFC: [0x24D9], NFD: [0x24D9], NFKC: [0x006A], NFKD: [0x006A] }, +{ source: [0x24DA], NFC: [0x24DA], NFD: [0x24DA], NFKC: [0x006B], NFKD: [0x006B] }, +{ source: [0x24DB], NFC: [0x24DB], NFD: [0x24DB], NFKC: [0x006C], NFKD: [0x006C] }, +{ source: [0x24DC], NFC: [0x24DC], NFD: [0x24DC], NFKC: [0x006D], NFKD: [0x006D] }, +{ source: [0x24DD], NFC: [0x24DD], NFD: [0x24DD], NFKC: [0x006E], NFKD: [0x006E] }, +{ source: [0x24DE], NFC: [0x24DE], NFD: [0x24DE], NFKC: [0x006F], NFKD: [0x006F] }, +{ source: [0x24DF], NFC: [0x24DF], NFD: [0x24DF], NFKC: [0x0070], NFKD: [0x0070] }, +{ source: [0x24E0], NFC: [0x24E0], NFD: [0x24E0], NFKC: [0x0071], NFKD: [0x0071] }, +{ source: [0x24E1], NFC: [0x24E1], NFD: [0x24E1], NFKC: [0x0072], NFKD: [0x0072] }, +{ source: [0x24E2], NFC: [0x24E2], NFD: [0x24E2], NFKC: [0x0073], NFKD: [0x0073] }, +{ source: [0x24E3], NFC: [0x24E3], NFD: [0x24E3], NFKC: [0x0074], NFKD: [0x0074] }, +{ source: [0x24E4], NFC: [0x24E4], NFD: [0x24E4], NFKC: [0x0075], NFKD: [0x0075] }, +{ source: [0x24E5], NFC: [0x24E5], NFD: [0x24E5], NFKC: [0x0076], NFKD: [0x0076] }, +{ source: [0x24E6], NFC: [0x24E6], NFD: [0x24E6], NFKC: [0x0077], NFKD: [0x0077] }, +{ source: [0x24E7], NFC: [0x24E7], NFD: [0x24E7], NFKC: [0x0078], NFKD: [0x0078] }, +{ source: [0x24E8], NFC: [0x24E8], NFD: [0x24E8], NFKC: [0x0079], NFKD: [0x0079] }, +{ source: [0x24E9], NFC: [0x24E9], NFD: [0x24E9], NFKC: [0x007A], NFKD: [0x007A] }, +{ source: [0x24EA], NFC: [0x24EA], NFD: [0x24EA], NFKC: [0x0030], NFKD: [0x0030] }, +{ source: [0x2A0C], NFC: [0x2A0C], NFD: [0x2A0C], NFKC: [0x222B, 0x222B, 0x222B, 0x222B], NFKD: [0x222B, 0x222B, 0x222B, 0x222B] }, +{ source: [0x2A74], NFC: [0x2A74], NFD: [0x2A74], NFKC: [0x003A, 0x003A, 0x003D], NFKD: [0x003A, 0x003A, 0x003D] }, +{ source: [0x2A75], NFC: [0x2A75], NFD: [0x2A75], NFKC: [0x003D, 0x003D], NFKD: [0x003D, 0x003D] }, +{ source: [0x2A76], NFC: [0x2A76], NFD: [0x2A76], NFKC: [0x003D, 0x003D, 0x003D], NFKD: [0x003D, 0x003D, 0x003D] }, +{ source: [0x2ADC], NFC: [0x2ADD, 0x0338], NFD: [0x2ADD, 0x0338], NFKC: [0x2ADD, 0x0338], NFKD: [0x2ADD, 0x0338] }, +{ source: [0x2C7C], NFC: [0x2C7C], NFD: [0x2C7C], NFKC: [0x006A], NFKD: [0x006A] }, +{ source: [0x2C7D], NFC: [0x2C7D], NFD: [0x2C7D], NFKC: [0x0056], NFKD: [0x0056] }, +{ source: [0x2D6F], NFC: [0x2D6F], NFD: [0x2D6F], NFKC: [0x2D61], NFKD: [0x2D61] }, +{ source: [0x2E9F], NFC: [0x2E9F], NFD: [0x2E9F], NFKC: [0x6BCD], NFKD: [0x6BCD] }, +{ source: [0x2EF3], NFC: [0x2EF3], NFD: [0x2EF3], NFKC: [0x9F9F], NFKD: [0x9F9F] }, +{ source: [0x2F00], NFC: [0x2F00], NFD: [0x2F00], NFKC: [0x4E00], NFKD: [0x4E00] }, +{ source: [0x2F01], NFC: [0x2F01], NFD: [0x2F01], NFKC: [0x4E28], NFKD: [0x4E28] }, +{ source: [0x2F02], NFC: [0x2F02], NFD: [0x2F02], NFKC: [0x4E36], NFKD: [0x4E36] }, +{ source: [0x2F03], NFC: [0x2F03], NFD: [0x2F03], NFKC: [0x4E3F], NFKD: [0x4E3F] }, +{ source: [0x2F04], NFC: [0x2F04], NFD: [0x2F04], NFKC: [0x4E59], NFKD: [0x4E59] }, +{ source: [0x2F05], NFC: [0x2F05], NFD: [0x2F05], NFKC: [0x4E85], NFKD: [0x4E85] }, +{ source: [0x2F06], NFC: [0x2F06], NFD: [0x2F06], NFKC: [0x4E8C], NFKD: [0x4E8C] }, +{ source: [0x2F07], NFC: [0x2F07], NFD: [0x2F07], NFKC: [0x4EA0], NFKD: [0x4EA0] }, +{ source: [0x2F08], NFC: [0x2F08], NFD: [0x2F08], NFKC: [0x4EBA], NFKD: [0x4EBA] }, +{ source: [0x2F09], NFC: [0x2F09], NFD: [0x2F09], NFKC: [0x513F], NFKD: [0x513F] }, +{ source: [0x2F0A], NFC: [0x2F0A], NFD: [0x2F0A], NFKC: [0x5165], NFKD: [0x5165] }, +{ source: [0x2F0B], NFC: [0x2F0B], NFD: [0x2F0B], NFKC: [0x516B], NFKD: [0x516B] }, +{ source: [0x2F0C], NFC: [0x2F0C], NFD: [0x2F0C], NFKC: [0x5182], NFKD: [0x5182] }, +{ source: [0x2F0D], NFC: [0x2F0D], NFD: [0x2F0D], NFKC: [0x5196], NFKD: [0x5196] }, +{ source: [0x2F0E], NFC: [0x2F0E], NFD: [0x2F0E], NFKC: [0x51AB], NFKD: [0x51AB] }, +{ source: [0x2F0F], NFC: [0x2F0F], NFD: [0x2F0F], NFKC: [0x51E0], NFKD: [0x51E0] }, +{ source: [0x2F10], NFC: [0x2F10], NFD: [0x2F10], NFKC: [0x51F5], NFKD: [0x51F5] }, +{ source: [0x2F11], NFC: [0x2F11], NFD: [0x2F11], NFKC: [0x5200], NFKD: [0x5200] }, +{ source: [0x2F12], NFC: [0x2F12], NFD: [0x2F12], NFKC: [0x529B], NFKD: [0x529B] }, +{ source: [0x2F13], NFC: [0x2F13], NFD: [0x2F13], NFKC: [0x52F9], NFKD: [0x52F9] }, +{ source: [0x2F14], NFC: [0x2F14], NFD: [0x2F14], NFKC: [0x5315], NFKD: [0x5315] }, +{ source: [0x2F15], NFC: [0x2F15], NFD: [0x2F15], NFKC: [0x531A], NFKD: [0x531A] }, +{ source: [0x2F16], NFC: [0x2F16], NFD: [0x2F16], NFKC: [0x5338], NFKD: [0x5338] }, +{ source: [0x2F17], NFC: [0x2F17], NFD: [0x2F17], NFKC: [0x5341], NFKD: [0x5341] }, +{ source: [0x2F18], NFC: [0x2F18], NFD: [0x2F18], NFKC: [0x535C], NFKD: [0x535C] }, +{ source: [0x2F19], NFC: [0x2F19], NFD: [0x2F19], NFKC: [0x5369], NFKD: [0x5369] }, +{ source: [0x2F1A], NFC: [0x2F1A], NFD: [0x2F1A], NFKC: [0x5382], NFKD: [0x5382] }, +{ source: [0x2F1B], NFC: [0x2F1B], NFD: [0x2F1B], NFKC: [0x53B6], NFKD: [0x53B6] }, +{ source: [0x2F1C], NFC: [0x2F1C], NFD: [0x2F1C], NFKC: [0x53C8], NFKD: [0x53C8] }, +{ source: [0x2F1D], NFC: [0x2F1D], NFD: [0x2F1D], NFKC: [0x53E3], NFKD: [0x53E3] }, +{ source: [0x2F1E], NFC: [0x2F1E], NFD: [0x2F1E], NFKC: [0x56D7], NFKD: [0x56D7] }, +{ source: [0x2F1F], NFC: [0x2F1F], NFD: [0x2F1F], NFKC: [0x571F], NFKD: [0x571F] }, +{ source: [0x2F20], NFC: [0x2F20], NFD: [0x2F20], NFKC: [0x58EB], NFKD: [0x58EB] }, +{ source: [0x2F21], NFC: [0x2F21], NFD: [0x2F21], NFKC: [0x5902], NFKD: [0x5902] }, +{ source: [0x2F22], NFC: [0x2F22], NFD: [0x2F22], NFKC: [0x590A], NFKD: [0x590A] }, +{ source: [0x2F23], NFC: [0x2F23], NFD: [0x2F23], NFKC: [0x5915], NFKD: [0x5915] }, +{ source: [0x2F24], NFC: [0x2F24], NFD: [0x2F24], NFKC: [0x5927], NFKD: [0x5927] }, +{ source: [0x2F25], NFC: [0x2F25], NFD: [0x2F25], NFKC: [0x5973], NFKD: [0x5973] }, +{ source: [0x2F26], NFC: [0x2F26], NFD: [0x2F26], NFKC: [0x5B50], NFKD: [0x5B50] }, +{ source: [0x2F27], NFC: [0x2F27], NFD: [0x2F27], NFKC: [0x5B80], NFKD: [0x5B80] }, +{ source: [0x2F28], NFC: [0x2F28], NFD: [0x2F28], NFKC: [0x5BF8], NFKD: [0x5BF8] }, +{ source: [0x2F29], NFC: [0x2F29], NFD: [0x2F29], NFKC: [0x5C0F], NFKD: [0x5C0F] }, +{ source: [0x2F2A], NFC: [0x2F2A], NFD: [0x2F2A], NFKC: [0x5C22], NFKD: [0x5C22] }, +{ source: [0x2F2B], NFC: [0x2F2B], NFD: [0x2F2B], NFKC: [0x5C38], NFKD: [0x5C38] }, +{ source: [0x2F2C], NFC: [0x2F2C], NFD: [0x2F2C], NFKC: [0x5C6E], NFKD: [0x5C6E] }, +{ source: [0x2F2D], NFC: [0x2F2D], NFD: [0x2F2D], NFKC: [0x5C71], NFKD: [0x5C71] }, +{ source: [0x2F2E], NFC: [0x2F2E], NFD: [0x2F2E], NFKC: [0x5DDB], NFKD: [0x5DDB] }, +{ source: [0x2F2F], NFC: [0x2F2F], NFD: [0x2F2F], NFKC: [0x5DE5], NFKD: [0x5DE5] }, +{ source: [0x2F30], NFC: [0x2F30], NFD: [0x2F30], NFKC: [0x5DF1], NFKD: [0x5DF1] }, +{ source: [0x2F31], NFC: [0x2F31], NFD: [0x2F31], NFKC: [0x5DFE], NFKD: [0x5DFE] }, +{ source: [0x2F32], NFC: [0x2F32], NFD: [0x2F32], NFKC: [0x5E72], NFKD: [0x5E72] }, +{ source: [0x2F33], NFC: [0x2F33], NFD: [0x2F33], NFKC: [0x5E7A], NFKD: [0x5E7A] }, +{ source: [0x2F34], NFC: [0x2F34], NFD: [0x2F34], NFKC: [0x5E7F], NFKD: [0x5E7F] }, +{ source: [0x2F35], NFC: [0x2F35], NFD: [0x2F35], NFKC: [0x5EF4], NFKD: [0x5EF4] }, +{ source: [0x2F36], NFC: [0x2F36], NFD: [0x2F36], NFKC: [0x5EFE], NFKD: [0x5EFE] }, +{ source: [0x2F37], NFC: [0x2F37], NFD: [0x2F37], NFKC: [0x5F0B], NFKD: [0x5F0B] }, +{ source: [0x2F38], NFC: [0x2F38], NFD: [0x2F38], NFKC: [0x5F13], NFKD: [0x5F13] }, +{ source: [0x2F39], NFC: [0x2F39], NFD: [0x2F39], NFKC: [0x5F50], NFKD: [0x5F50] }, +{ source: [0x2F3A], NFC: [0x2F3A], NFD: [0x2F3A], NFKC: [0x5F61], NFKD: [0x5F61] }, +{ source: [0x2F3B], NFC: [0x2F3B], NFD: [0x2F3B], NFKC: [0x5F73], NFKD: [0x5F73] }, +{ source: [0x2F3C], NFC: [0x2F3C], NFD: [0x2F3C], NFKC: [0x5FC3], NFKD: [0x5FC3] }, +{ source: [0x2F3D], NFC: [0x2F3D], NFD: [0x2F3D], NFKC: [0x6208], NFKD: [0x6208] }, +{ source: [0x2F3E], NFC: [0x2F3E], NFD: [0x2F3E], NFKC: [0x6236], NFKD: [0x6236] }, +{ source: [0x2F3F], NFC: [0x2F3F], NFD: [0x2F3F], NFKC: [0x624B], NFKD: [0x624B] }, +{ source: [0x2F40], NFC: [0x2F40], NFD: [0x2F40], NFKC: [0x652F], NFKD: [0x652F] }, +{ source: [0x2F41], NFC: [0x2F41], NFD: [0x2F41], NFKC: [0x6534], NFKD: [0x6534] }, +{ source: [0x2F42], NFC: [0x2F42], NFD: [0x2F42], NFKC: [0x6587], NFKD: [0x6587] }, +{ source: [0x2F43], NFC: [0x2F43], NFD: [0x2F43], NFKC: [0x6597], NFKD: [0x6597] }, +{ source: [0x2F44], NFC: [0x2F44], NFD: [0x2F44], NFKC: [0x65A4], NFKD: [0x65A4] }, +{ source: [0x2F45], NFC: [0x2F45], NFD: [0x2F45], NFKC: [0x65B9], NFKD: [0x65B9] }, +{ source: [0x2F46], NFC: [0x2F46], NFD: [0x2F46], NFKC: [0x65E0], NFKD: [0x65E0] }, +{ source: [0x2F47], NFC: [0x2F47], NFD: [0x2F47], NFKC: [0x65E5], NFKD: [0x65E5] }, +{ source: [0x2F48], NFC: [0x2F48], NFD: [0x2F48], NFKC: [0x66F0], NFKD: [0x66F0] }, +{ source: [0x2F49], NFC: [0x2F49], NFD: [0x2F49], NFKC: [0x6708], NFKD: [0x6708] }, +{ source: [0x2F4A], NFC: [0x2F4A], NFD: [0x2F4A], NFKC: [0x6728], NFKD: [0x6728] }, +{ source: [0x2F4B], NFC: [0x2F4B], NFD: [0x2F4B], NFKC: [0x6B20], NFKD: [0x6B20] }, +{ source: [0x2F4C], NFC: [0x2F4C], NFD: [0x2F4C], NFKC: [0x6B62], NFKD: [0x6B62] }, +{ source: [0x2F4D], NFC: [0x2F4D], NFD: [0x2F4D], NFKC: [0x6B79], NFKD: [0x6B79] }, +{ source: [0x2F4E], NFC: [0x2F4E], NFD: [0x2F4E], NFKC: [0x6BB3], NFKD: [0x6BB3] }, +{ source: [0x2F4F], NFC: [0x2F4F], NFD: [0x2F4F], NFKC: [0x6BCB], NFKD: [0x6BCB] }, +{ source: [0x2F50], NFC: [0x2F50], NFD: [0x2F50], NFKC: [0x6BD4], NFKD: [0x6BD4] }, +{ source: [0x2F51], NFC: [0x2F51], NFD: [0x2F51], NFKC: [0x6BDB], NFKD: [0x6BDB] }, +{ source: [0x2F52], NFC: [0x2F52], NFD: [0x2F52], NFKC: [0x6C0F], NFKD: [0x6C0F] }, +{ source: [0x2F53], NFC: [0x2F53], NFD: [0x2F53], NFKC: [0x6C14], NFKD: [0x6C14] }, +{ source: [0x2F54], NFC: [0x2F54], NFD: [0x2F54], NFKC: [0x6C34], NFKD: [0x6C34] }, +{ source: [0x2F55], NFC: [0x2F55], NFD: [0x2F55], NFKC: [0x706B], NFKD: [0x706B] }, +{ source: [0x2F56], NFC: [0x2F56], NFD: [0x2F56], NFKC: [0x722A], NFKD: [0x722A] }, +{ source: [0x2F57], NFC: [0x2F57], NFD: [0x2F57], NFKC: [0x7236], NFKD: [0x7236] }, +{ source: [0x2F58], NFC: [0x2F58], NFD: [0x2F58], NFKC: [0x723B], NFKD: [0x723B] }, +{ source: [0x2F59], NFC: [0x2F59], NFD: [0x2F59], NFKC: [0x723F], NFKD: [0x723F] }, +{ source: [0x2F5A], NFC: [0x2F5A], NFD: [0x2F5A], NFKC: [0x7247], NFKD: [0x7247] }, +{ source: [0x2F5B], NFC: [0x2F5B], NFD: [0x2F5B], NFKC: [0x7259], NFKD: [0x7259] }, +{ source: [0x2F5C], NFC: [0x2F5C], NFD: [0x2F5C], NFKC: [0x725B], NFKD: [0x725B] }, +{ source: [0x2F5D], NFC: [0x2F5D], NFD: [0x2F5D], NFKC: [0x72AC], NFKD: [0x72AC] }, +{ source: [0x2F5E], NFC: [0x2F5E], NFD: [0x2F5E], NFKC: [0x7384], NFKD: [0x7384] }, +{ source: [0x2F5F], NFC: [0x2F5F], NFD: [0x2F5F], NFKC: [0x7389], NFKD: [0x7389] }, +{ source: [0x2F60], NFC: [0x2F60], NFD: [0x2F60], NFKC: [0x74DC], NFKD: [0x74DC] }, +{ source: [0x2F61], NFC: [0x2F61], NFD: [0x2F61], NFKC: [0x74E6], NFKD: [0x74E6] }, +{ source: [0x2F62], NFC: [0x2F62], NFD: [0x2F62], NFKC: [0x7518], NFKD: [0x7518] }, +{ source: [0x2F63], NFC: [0x2F63], NFD: [0x2F63], NFKC: [0x751F], NFKD: [0x751F] }, +{ source: [0x2F64], NFC: [0x2F64], NFD: [0x2F64], NFKC: [0x7528], NFKD: [0x7528] }, +{ source: [0x2F65], NFC: [0x2F65], NFD: [0x2F65], NFKC: [0x7530], NFKD: [0x7530] }, +{ source: [0x2F66], NFC: [0x2F66], NFD: [0x2F66], NFKC: [0x758B], NFKD: [0x758B] }, +{ source: [0x2F67], NFC: [0x2F67], NFD: [0x2F67], NFKC: [0x7592], NFKD: [0x7592] }, +{ source: [0x2F68], NFC: [0x2F68], NFD: [0x2F68], NFKC: [0x7676], NFKD: [0x7676] }, +{ source: [0x2F69], NFC: [0x2F69], NFD: [0x2F69], NFKC: [0x767D], NFKD: [0x767D] }, +{ source: [0x2F6A], NFC: [0x2F6A], NFD: [0x2F6A], NFKC: [0x76AE], NFKD: [0x76AE] }, +{ source: [0x2F6B], NFC: [0x2F6B], NFD: [0x2F6B], NFKC: [0x76BF], NFKD: [0x76BF] }, +{ source: [0x2F6C], NFC: [0x2F6C], NFD: [0x2F6C], NFKC: [0x76EE], NFKD: [0x76EE] }, +{ source: [0x2F6D], NFC: [0x2F6D], NFD: [0x2F6D], NFKC: [0x77DB], NFKD: [0x77DB] }, +{ source: [0x2F6E], NFC: [0x2F6E], NFD: [0x2F6E], NFKC: [0x77E2], NFKD: [0x77E2] }, +{ source: [0x2F6F], NFC: [0x2F6F], NFD: [0x2F6F], NFKC: [0x77F3], NFKD: [0x77F3] }, +{ source: [0x2F70], NFC: [0x2F70], NFD: [0x2F70], NFKC: [0x793A], NFKD: [0x793A] }, +{ source: [0x2F71], NFC: [0x2F71], NFD: [0x2F71], NFKC: [0x79B8], NFKD: [0x79B8] }, +{ source: [0x2F72], NFC: [0x2F72], NFD: [0x2F72], NFKC: [0x79BE], NFKD: [0x79BE] }, +{ source: [0x2F73], NFC: [0x2F73], NFD: [0x2F73], NFKC: [0x7A74], NFKD: [0x7A74] }, +{ source: [0x2F74], NFC: [0x2F74], NFD: [0x2F74], NFKC: [0x7ACB], NFKD: [0x7ACB] }, +{ source: [0x2F75], NFC: [0x2F75], NFD: [0x2F75], NFKC: [0x7AF9], NFKD: [0x7AF9] }, +{ source: [0x2F76], NFC: [0x2F76], NFD: [0x2F76], NFKC: [0x7C73], NFKD: [0x7C73] }, +{ source: [0x2F77], NFC: [0x2F77], NFD: [0x2F77], NFKC: [0x7CF8], NFKD: [0x7CF8] }, +{ source: [0x2F78], NFC: [0x2F78], NFD: [0x2F78], NFKC: [0x7F36], NFKD: [0x7F36] }, +{ source: [0x2F79], NFC: [0x2F79], NFD: [0x2F79], NFKC: [0x7F51], NFKD: [0x7F51] }, +{ source: [0x2F7A], NFC: [0x2F7A], NFD: [0x2F7A], NFKC: [0x7F8A], NFKD: [0x7F8A] }, +{ source: [0x2F7B], NFC: [0x2F7B], NFD: [0x2F7B], NFKC: [0x7FBD], NFKD: [0x7FBD] }, +{ source: [0x2F7C], NFC: [0x2F7C], NFD: [0x2F7C], NFKC: [0x8001], NFKD: [0x8001] }, +{ source: [0x2F7D], NFC: [0x2F7D], NFD: [0x2F7D], NFKC: [0x800C], NFKD: [0x800C] }, +{ source: [0x2F7E], NFC: [0x2F7E], NFD: [0x2F7E], NFKC: [0x8012], NFKD: [0x8012] }, +{ source: [0x2F7F], NFC: [0x2F7F], NFD: [0x2F7F], NFKC: [0x8033], NFKD: [0x8033] }, +{ source: [0x2F80], NFC: [0x2F80], NFD: [0x2F80], NFKC: [0x807F], NFKD: [0x807F] }, +{ source: [0x2F81], NFC: [0x2F81], NFD: [0x2F81], NFKC: [0x8089], NFKD: [0x8089] }, +{ source: [0x2F82], NFC: [0x2F82], NFD: [0x2F82], NFKC: [0x81E3], NFKD: [0x81E3] }, +{ source: [0x2F83], NFC: [0x2F83], NFD: [0x2F83], NFKC: [0x81EA], NFKD: [0x81EA] }, +{ source: [0x2F84], NFC: [0x2F84], NFD: [0x2F84], NFKC: [0x81F3], NFKD: [0x81F3] }, +{ source: [0x2F85], NFC: [0x2F85], NFD: [0x2F85], NFKC: [0x81FC], NFKD: [0x81FC] }, +{ source: [0x2F86], NFC: [0x2F86], NFD: [0x2F86], NFKC: [0x820C], NFKD: [0x820C] }, +{ source: [0x2F87], NFC: [0x2F87], NFD: [0x2F87], NFKC: [0x821B], NFKD: [0x821B] }, +{ source: [0x2F88], NFC: [0x2F88], NFD: [0x2F88], NFKC: [0x821F], NFKD: [0x821F] }, +{ source: [0x2F89], NFC: [0x2F89], NFD: [0x2F89], NFKC: [0x826E], NFKD: [0x826E] }, +{ source: [0x2F8A], NFC: [0x2F8A], NFD: [0x2F8A], NFKC: [0x8272], NFKD: [0x8272] }, +{ source: [0x2F8B], NFC: [0x2F8B], NFD: [0x2F8B], NFKC: [0x8278], NFKD: [0x8278] }, +{ source: [0x2F8C], NFC: [0x2F8C], NFD: [0x2F8C], NFKC: [0x864D], NFKD: [0x864D] }, +{ source: [0x2F8D], NFC: [0x2F8D], NFD: [0x2F8D], NFKC: [0x866B], NFKD: [0x866B] }, +{ source: [0x2F8E], NFC: [0x2F8E], NFD: [0x2F8E], NFKC: [0x8840], NFKD: [0x8840] }, +{ source: [0x2F8F], NFC: [0x2F8F], NFD: [0x2F8F], NFKC: [0x884C], NFKD: [0x884C] }, +{ source: [0x2F90], NFC: [0x2F90], NFD: [0x2F90], NFKC: [0x8863], NFKD: [0x8863] }, +{ source: [0x2F91], NFC: [0x2F91], NFD: [0x2F91], NFKC: [0x897E], NFKD: [0x897E] }, +{ source: [0x2F92], NFC: [0x2F92], NFD: [0x2F92], NFKC: [0x898B], NFKD: [0x898B] }, +{ source: [0x2F93], NFC: [0x2F93], NFD: [0x2F93], NFKC: [0x89D2], NFKD: [0x89D2] }, +{ source: [0x2F94], NFC: [0x2F94], NFD: [0x2F94], NFKC: [0x8A00], NFKD: [0x8A00] }, +{ source: [0x2F95], NFC: [0x2F95], NFD: [0x2F95], NFKC: [0x8C37], NFKD: [0x8C37] }, +{ source: [0x2F96], NFC: [0x2F96], NFD: [0x2F96], NFKC: [0x8C46], NFKD: [0x8C46] }, +{ source: [0x2F97], NFC: [0x2F97], NFD: [0x2F97], NFKC: [0x8C55], NFKD: [0x8C55] }, +{ source: [0x2F98], NFC: [0x2F98], NFD: [0x2F98], NFKC: [0x8C78], NFKD: [0x8C78] }, +{ source: [0x2F99], NFC: [0x2F99], NFD: [0x2F99], NFKC: [0x8C9D], NFKD: [0x8C9D] }, +{ source: [0x2F9A], NFC: [0x2F9A], NFD: [0x2F9A], NFKC: [0x8D64], NFKD: [0x8D64] }, +{ source: [0x2F9B], NFC: [0x2F9B], NFD: [0x2F9B], NFKC: [0x8D70], NFKD: [0x8D70] }, +{ source: [0x2F9C], NFC: [0x2F9C], NFD: [0x2F9C], NFKC: [0x8DB3], NFKD: [0x8DB3] }, +{ source: [0x2F9D], NFC: [0x2F9D], NFD: [0x2F9D], NFKC: [0x8EAB], NFKD: [0x8EAB] }, +{ source: [0x2F9E], NFC: [0x2F9E], NFD: [0x2F9E], NFKC: [0x8ECA], NFKD: [0x8ECA] }, +{ source: [0x2F9F], NFC: [0x2F9F], NFD: [0x2F9F], NFKC: [0x8F9B], NFKD: [0x8F9B] }, +{ source: [0x2FA0], NFC: [0x2FA0], NFD: [0x2FA0], NFKC: [0x8FB0], NFKD: [0x8FB0] }, +{ source: [0x2FA1], NFC: [0x2FA1], NFD: [0x2FA1], NFKC: [0x8FB5], NFKD: [0x8FB5] }, +{ source: [0x2FA2], NFC: [0x2FA2], NFD: [0x2FA2], NFKC: [0x9091], NFKD: [0x9091] }, +{ source: [0x2FA3], NFC: [0x2FA3], NFD: [0x2FA3], NFKC: [0x9149], NFKD: [0x9149] }, +{ source: [0x2FA4], NFC: [0x2FA4], NFD: [0x2FA4], NFKC: [0x91C6], NFKD: [0x91C6] }, +{ source: [0x2FA5], NFC: [0x2FA5], NFD: [0x2FA5], NFKC: [0x91CC], NFKD: [0x91CC] }, +{ source: [0x2FA6], NFC: [0x2FA6], NFD: [0x2FA6], NFKC: [0x91D1], NFKD: [0x91D1] }, +{ source: [0x2FA7], NFC: [0x2FA7], NFD: [0x2FA7], NFKC: [0x9577], NFKD: [0x9577] }, +{ source: [0x2FA8], NFC: [0x2FA8], NFD: [0x2FA8], NFKC: [0x9580], NFKD: [0x9580] }, +{ source: [0x2FA9], NFC: [0x2FA9], NFD: [0x2FA9], NFKC: [0x961C], NFKD: [0x961C] }, +{ source: [0x2FAA], NFC: [0x2FAA], NFD: [0x2FAA], NFKC: [0x96B6], NFKD: [0x96B6] }, +{ source: [0x2FAB], NFC: [0x2FAB], NFD: [0x2FAB], NFKC: [0x96B9], NFKD: [0x96B9] }, +{ source: [0x2FAC], NFC: [0x2FAC], NFD: [0x2FAC], NFKC: [0x96E8], NFKD: [0x96E8] }, +{ source: [0x2FAD], NFC: [0x2FAD], NFD: [0x2FAD], NFKC: [0x9751], NFKD: [0x9751] }, +{ source: [0x2FAE], NFC: [0x2FAE], NFD: [0x2FAE], NFKC: [0x975E], NFKD: [0x975E] }, +{ source: [0x2FAF], NFC: [0x2FAF], NFD: [0x2FAF], NFKC: [0x9762], NFKD: [0x9762] }, +{ source: [0x2FB0], NFC: [0x2FB0], NFD: [0x2FB0], NFKC: [0x9769], NFKD: [0x9769] }, +{ source: [0x2FB1], NFC: [0x2FB1], NFD: [0x2FB1], NFKC: [0x97CB], NFKD: [0x97CB] }, +{ source: [0x2FB2], NFC: [0x2FB2], NFD: [0x2FB2], NFKC: [0x97ED], NFKD: [0x97ED] }, +{ source: [0x2FB3], NFC: [0x2FB3], NFD: [0x2FB3], NFKC: [0x97F3], NFKD: [0x97F3] }, +{ source: [0x2FB4], NFC: [0x2FB4], NFD: [0x2FB4], NFKC: [0x9801], NFKD: [0x9801] }, +{ source: [0x2FB5], NFC: [0x2FB5], NFD: [0x2FB5], NFKC: [0x98A8], NFKD: [0x98A8] }, +{ source: [0x2FB6], NFC: [0x2FB6], NFD: [0x2FB6], NFKC: [0x98DB], NFKD: [0x98DB] }, +{ source: [0x2FB7], NFC: [0x2FB7], NFD: [0x2FB7], NFKC: [0x98DF], NFKD: [0x98DF] }, +{ source: [0x2FB8], NFC: [0x2FB8], NFD: [0x2FB8], NFKC: [0x9996], NFKD: [0x9996] }, +{ source: [0x2FB9], NFC: [0x2FB9], NFD: [0x2FB9], NFKC: [0x9999], NFKD: [0x9999] }, +{ source: [0x2FBA], NFC: [0x2FBA], NFD: [0x2FBA], NFKC: [0x99AC], NFKD: [0x99AC] }, +{ source: [0x2FBB], NFC: [0x2FBB], NFD: [0x2FBB], NFKC: [0x9AA8], NFKD: [0x9AA8] }, +{ source: [0x2FBC], NFC: [0x2FBC], NFD: [0x2FBC], NFKC: [0x9AD8], NFKD: [0x9AD8] }, +{ source: [0x2FBD], NFC: [0x2FBD], NFD: [0x2FBD], NFKC: [0x9ADF], NFKD: [0x9ADF] }, +{ source: [0x2FBE], NFC: [0x2FBE], NFD: [0x2FBE], NFKC: [0x9B25], NFKD: [0x9B25] }, +{ source: [0x2FBF], NFC: [0x2FBF], NFD: [0x2FBF], NFKC: [0x9B2F], NFKD: [0x9B2F] }, +{ source: [0x2FC0], NFC: [0x2FC0], NFD: [0x2FC0], NFKC: [0x9B32], NFKD: [0x9B32] }, +{ source: [0x2FC1], NFC: [0x2FC1], NFD: [0x2FC1], NFKC: [0x9B3C], NFKD: [0x9B3C] }, +{ source: [0x2FC2], NFC: [0x2FC2], NFD: [0x2FC2], NFKC: [0x9B5A], NFKD: [0x9B5A] }, +{ source: [0x2FC3], NFC: [0x2FC3], NFD: [0x2FC3], NFKC: [0x9CE5], NFKD: [0x9CE5] }, +{ source: [0x2FC4], NFC: [0x2FC4], NFD: [0x2FC4], NFKC: [0x9E75], NFKD: [0x9E75] }, +{ source: [0x2FC5], NFC: [0x2FC5], NFD: [0x2FC5], NFKC: [0x9E7F], NFKD: [0x9E7F] }, +{ source: [0x2FC6], NFC: [0x2FC6], NFD: [0x2FC6], NFKC: [0x9EA5], NFKD: [0x9EA5] }, +{ source: [0x2FC7], NFC: [0x2FC7], NFD: [0x2FC7], NFKC: [0x9EBB], NFKD: [0x9EBB] }, +{ source: [0x2FC8], NFC: [0x2FC8], NFD: [0x2FC8], NFKC: [0x9EC3], NFKD: [0x9EC3] }, +{ source: [0x2FC9], NFC: [0x2FC9], NFD: [0x2FC9], NFKC: [0x9ECD], NFKD: [0x9ECD] }, +{ source: [0x2FCA], NFC: [0x2FCA], NFD: [0x2FCA], NFKC: [0x9ED1], NFKD: [0x9ED1] }, +{ source: [0x2FCB], NFC: [0x2FCB], NFD: [0x2FCB], NFKC: [0x9EF9], NFKD: [0x9EF9] }, +{ source: [0x2FCC], NFC: [0x2FCC], NFD: [0x2FCC], NFKC: [0x9EFD], NFKD: [0x9EFD] }, +{ source: [0x2FCD], NFC: [0x2FCD], NFD: [0x2FCD], NFKC: [0x9F0E], NFKD: [0x9F0E] }, +{ source: [0x2FCE], NFC: [0x2FCE], NFD: [0x2FCE], NFKC: [0x9F13], NFKD: [0x9F13] }, +{ source: [0x2FCF], NFC: [0x2FCF], NFD: [0x2FCF], NFKC: [0x9F20], NFKD: [0x9F20] }, +{ source: [0x2FD0], NFC: [0x2FD0], NFD: [0x2FD0], NFKC: [0x9F3B], NFKD: [0x9F3B] }, +{ source: [0x2FD1], NFC: [0x2FD1], NFD: [0x2FD1], NFKC: [0x9F4A], NFKD: [0x9F4A] }, +{ source: [0x2FD2], NFC: [0x2FD2], NFD: [0x2FD2], NFKC: [0x9F52], NFKD: [0x9F52] }, +{ source: [0x2FD3], NFC: [0x2FD3], NFD: [0x2FD3], NFKC: [0x9F8D], NFKD: [0x9F8D] }, +{ source: [0x2FD4], NFC: [0x2FD4], NFD: [0x2FD4], NFKC: [0x9F9C], NFKD: [0x9F9C] }, +{ source: [0x2FD5], NFC: [0x2FD5], NFD: [0x2FD5], NFKC: [0x9FA0], NFKD: [0x9FA0] }, +{ source: [0x3000], NFC: [0x3000], NFD: [0x3000], NFKC: [0x0020], NFKD: [0x0020] }, +{ source: [0x3036], NFC: [0x3036], NFD: [0x3036], NFKC: [0x3012], NFKD: [0x3012] }, +{ source: [0x3038], NFC: [0x3038], NFD: [0x3038], NFKC: [0x5341], NFKD: [0x5341] }, +{ source: [0x3039], NFC: [0x3039], NFD: [0x3039], NFKC: [0x5344], NFKD: [0x5344] }, +{ source: [0x303A], NFC: [0x303A], NFD: [0x303A], NFKC: [0x5345], NFKD: [0x5345] }, +{ source: [0x304C], NFC: [0x304C], NFD: [0x304B, 0x3099], NFKC: [0x304C], NFKD: [0x304B, 0x3099] }, +{ source: [0x304E], NFC: [0x304E], NFD: [0x304D, 0x3099], NFKC: [0x304E], NFKD: [0x304D, 0x3099] }, +{ source: [0x3050], NFC: [0x3050], NFD: [0x304F, 0x3099], NFKC: [0x3050], NFKD: [0x304F, 0x3099] }, +{ source: [0x3052], NFC: [0x3052], NFD: [0x3051, 0x3099], NFKC: [0x3052], NFKD: [0x3051, 0x3099] }, +{ source: [0x3054], NFC: [0x3054], NFD: [0x3053, 0x3099], NFKC: [0x3054], NFKD: [0x3053, 0x3099] }, +{ source: [0x3056], NFC: [0x3056], NFD: [0x3055, 0x3099], NFKC: [0x3056], NFKD: [0x3055, 0x3099] }, +{ source: [0x3058], NFC: [0x3058], NFD: [0x3057, 0x3099], NFKC: [0x3058], NFKD: [0x3057, 0x3099] }, +{ source: [0x305A], NFC: [0x305A], NFD: [0x3059, 0x3099], NFKC: [0x305A], NFKD: [0x3059, 0x3099] }, +{ source: [0x305C], NFC: [0x305C], NFD: [0x305B, 0x3099], NFKC: [0x305C], NFKD: [0x305B, 0x3099] }, +{ source: [0x305E], NFC: [0x305E], NFD: [0x305D, 0x3099], NFKC: [0x305E], NFKD: [0x305D, 0x3099] }, +{ source: [0x3060], NFC: [0x3060], NFD: [0x305F, 0x3099], NFKC: [0x3060], NFKD: [0x305F, 0x3099] }, +{ source: [0x3062], NFC: [0x3062], NFD: [0x3061, 0x3099], NFKC: [0x3062], NFKD: [0x3061, 0x3099] }, +{ source: [0x3065], NFC: [0x3065], NFD: [0x3064, 0x3099], NFKC: [0x3065], NFKD: [0x3064, 0x3099] }, +{ source: [0x3067], NFC: [0x3067], NFD: [0x3066, 0x3099], NFKC: [0x3067], NFKD: [0x3066, 0x3099] }, +{ source: [0x3069], NFC: [0x3069], NFD: [0x3068, 0x3099], NFKC: [0x3069], NFKD: [0x3068, 0x3099] }, +{ source: [0x3070], NFC: [0x3070], NFD: [0x306F, 0x3099], NFKC: [0x3070], NFKD: [0x306F, 0x3099] }, +{ source: [0x3071], NFC: [0x3071], NFD: [0x306F, 0x309A], NFKC: [0x3071], NFKD: [0x306F, 0x309A] }, +{ source: [0x3073], NFC: [0x3073], NFD: [0x3072, 0x3099], NFKC: [0x3073], NFKD: [0x3072, 0x3099] }, +{ source: [0x3074], NFC: [0x3074], NFD: [0x3072, 0x309A], NFKC: [0x3074], NFKD: [0x3072, 0x309A] }, +{ source: [0x3076], NFC: [0x3076], NFD: [0x3075, 0x3099], NFKC: [0x3076], NFKD: [0x3075, 0x3099] }, +{ source: [0x3077], NFC: [0x3077], NFD: [0x3075, 0x309A], NFKC: [0x3077], NFKD: [0x3075, 0x309A] }, +{ source: [0x3079], NFC: [0x3079], NFD: [0x3078, 0x3099], NFKC: [0x3079], NFKD: [0x3078, 0x3099] }, +{ source: [0x307A], NFC: [0x307A], NFD: [0x3078, 0x309A], NFKC: [0x307A], NFKD: [0x3078, 0x309A] }, +{ source: [0x307C], NFC: [0x307C], NFD: [0x307B, 0x3099], NFKC: [0x307C], NFKD: [0x307B, 0x3099] }, +{ source: [0x307D], NFC: [0x307D], NFD: [0x307B, 0x309A], NFKC: [0x307D], NFKD: [0x307B, 0x309A] }, +{ source: [0x3094], NFC: [0x3094], NFD: [0x3046, 0x3099], NFKC: [0x3094], NFKD: [0x3046, 0x3099] }, +{ source: [0x309B], NFC: [0x309B], NFD: [0x309B], NFKC: [0x0020, 0x3099], NFKD: [0x0020, 0x3099] }, +{ source: [0x309C], NFC: [0x309C], NFD: [0x309C], NFKC: [0x0020, 0x309A], NFKD: [0x0020, 0x309A] }, +{ source: [0x309E], NFC: [0x309E], NFD: [0x309D, 0x3099], NFKC: [0x309E], NFKD: [0x309D, 0x3099] }, +{ source: [0x309F], NFC: [0x309F], NFD: [0x309F], NFKC: [0x3088, 0x308A], NFKD: [0x3088, 0x308A] }, +{ source: [0x30AC], NFC: [0x30AC], NFD: [0x30AB, 0x3099], NFKC: [0x30AC], NFKD: [0x30AB, 0x3099] }, +{ source: [0x30AE], NFC: [0x30AE], NFD: [0x30AD, 0x3099], NFKC: [0x30AE], NFKD: [0x30AD, 0x3099] }, +{ source: [0x30B0], NFC: [0x30B0], NFD: [0x30AF, 0x3099], NFKC: [0x30B0], NFKD: [0x30AF, 0x3099] }, +{ source: [0x30B2], NFC: [0x30B2], NFD: [0x30B1, 0x3099], NFKC: [0x30B2], NFKD: [0x30B1, 0x3099] }, +{ source: [0x30B4], NFC: [0x30B4], NFD: [0x30B3, 0x3099], NFKC: [0x30B4], NFKD: [0x30B3, 0x3099] }, +{ source: [0x30B6], NFC: [0x30B6], NFD: [0x30B5, 0x3099], NFKC: [0x30B6], NFKD: [0x30B5, 0x3099] }, +{ source: [0x30B8], NFC: [0x30B8], NFD: [0x30B7, 0x3099], NFKC: [0x30B8], NFKD: [0x30B7, 0x3099] }, +{ source: [0x30BA], NFC: [0x30BA], NFD: [0x30B9, 0x3099], NFKC: [0x30BA], NFKD: [0x30B9, 0x3099] }, +{ source: [0x30BC], NFC: [0x30BC], NFD: [0x30BB, 0x3099], NFKC: [0x30BC], NFKD: [0x30BB, 0x3099] }, +{ source: [0x30BE], NFC: [0x30BE], NFD: [0x30BD, 0x3099], NFKC: [0x30BE], NFKD: [0x30BD, 0x3099] }, +{ source: [0x30C0], NFC: [0x30C0], NFD: [0x30BF, 0x3099], NFKC: [0x30C0], NFKD: [0x30BF, 0x3099] }, +{ source: [0x30C2], NFC: [0x30C2], NFD: [0x30C1, 0x3099], NFKC: [0x30C2], NFKD: [0x30C1, 0x3099] }, +{ source: [0x30C5], NFC: [0x30C5], NFD: [0x30C4, 0x3099], NFKC: [0x30C5], NFKD: [0x30C4, 0x3099] }, +{ source: [0x30C7], NFC: [0x30C7], NFD: [0x30C6, 0x3099], NFKC: [0x30C7], NFKD: [0x30C6, 0x3099] }, +{ source: [0x30C9], NFC: [0x30C9], NFD: [0x30C8, 0x3099], NFKC: [0x30C9], NFKD: [0x30C8, 0x3099] }, +{ source: [0x30D0], NFC: [0x30D0], NFD: [0x30CF, 0x3099], NFKC: [0x30D0], NFKD: [0x30CF, 0x3099] }, +{ source: [0x30D1], NFC: [0x30D1], NFD: [0x30CF, 0x309A], NFKC: [0x30D1], NFKD: [0x30CF, 0x309A] }, +{ source: [0x30D3], NFC: [0x30D3], NFD: [0x30D2, 0x3099], NFKC: [0x30D3], NFKD: [0x30D2, 0x3099] }, +{ source: [0x30D4], NFC: [0x30D4], NFD: [0x30D2, 0x309A], NFKC: [0x30D4], NFKD: [0x30D2, 0x309A] }, +{ source: [0x30D6], NFC: [0x30D6], NFD: [0x30D5, 0x3099], NFKC: [0x30D6], NFKD: [0x30D5, 0x3099] }, +{ source: [0x30D7], NFC: [0x30D7], NFD: [0x30D5, 0x309A], NFKC: [0x30D7], NFKD: [0x30D5, 0x309A] }, +{ source: [0x30D9], NFC: [0x30D9], NFD: [0x30D8, 0x3099], NFKC: [0x30D9], NFKD: [0x30D8, 0x3099] }, +{ source: [0x30DA], NFC: [0x30DA], NFD: [0x30D8, 0x309A], NFKC: [0x30DA], NFKD: [0x30D8, 0x309A] }, +{ source: [0x30DC], NFC: [0x30DC], NFD: [0x30DB, 0x3099], NFKC: [0x30DC], NFKD: [0x30DB, 0x3099] }, +{ source: [0x30DD], NFC: [0x30DD], NFD: [0x30DB, 0x309A], NFKC: [0x30DD], NFKD: [0x30DB, 0x309A] }, +{ source: [0x30F4], NFC: [0x30F4], NFD: [0x30A6, 0x3099], NFKC: [0x30F4], NFKD: [0x30A6, 0x3099] }, +{ source: [0x30F7], NFC: [0x30F7], NFD: [0x30EF, 0x3099], NFKC: [0x30F7], NFKD: [0x30EF, 0x3099] }, +{ source: [0x30F8], NFC: [0x30F8], NFD: [0x30F0, 0x3099], NFKC: [0x30F8], NFKD: [0x30F0, 0x3099] }, +{ source: [0x30F9], NFC: [0x30F9], NFD: [0x30F1, 0x3099], NFKC: [0x30F9], NFKD: [0x30F1, 0x3099] }, +{ source: [0x30FA], NFC: [0x30FA], NFD: [0x30F2, 0x3099], NFKC: [0x30FA], NFKD: [0x30F2, 0x3099] }, +{ source: [0x30FE], NFC: [0x30FE], NFD: [0x30FD, 0x3099], NFKC: [0x30FE], NFKD: [0x30FD, 0x3099] }, +{ source: [0x30FF], NFC: [0x30FF], NFD: [0x30FF], NFKC: [0x30B3, 0x30C8], NFKD: [0x30B3, 0x30C8] }, +{ source: [0x3131], NFC: [0x3131], NFD: [0x3131], NFKC: [0x1100], NFKD: [0x1100] }, +{ source: [0x3132], NFC: [0x3132], NFD: [0x3132], NFKC: [0x1101], NFKD: [0x1101] }, +{ source: [0x3133], NFC: [0x3133], NFD: [0x3133], NFKC: [0x11AA], NFKD: [0x11AA] }, +{ source: [0x3134], NFC: [0x3134], NFD: [0x3134], NFKC: [0x1102], NFKD: [0x1102] }, +{ source: [0x3135], NFC: [0x3135], NFD: [0x3135], NFKC: [0x11AC], NFKD: [0x11AC] }, +{ source: [0x3136], NFC: [0x3136], NFD: [0x3136], NFKC: [0x11AD], NFKD: [0x11AD] }, +{ source: [0x3137], NFC: [0x3137], NFD: [0x3137], NFKC: [0x1103], NFKD: [0x1103] }, +{ source: [0x3138], NFC: [0x3138], NFD: [0x3138], NFKC: [0x1104], NFKD: [0x1104] }, +{ source: [0x3139], NFC: [0x3139], NFD: [0x3139], NFKC: [0x1105], NFKD: [0x1105] }, +{ source: [0x313A], NFC: [0x313A], NFD: [0x313A], NFKC: [0x11B0], NFKD: [0x11B0] }, +{ source: [0x313B], NFC: [0x313B], NFD: [0x313B], NFKC: [0x11B1], NFKD: [0x11B1] }, +{ source: [0x313C], NFC: [0x313C], NFD: [0x313C], NFKC: [0x11B2], NFKD: [0x11B2] }, +{ source: [0x313D], NFC: [0x313D], NFD: [0x313D], NFKC: [0x11B3], NFKD: [0x11B3] }, +{ source: [0x313E], NFC: [0x313E], NFD: [0x313E], NFKC: [0x11B4], NFKD: [0x11B4] }, +{ source: [0x313F], NFC: [0x313F], NFD: [0x313F], NFKC: [0x11B5], NFKD: [0x11B5] }, +{ source: [0x3140], NFC: [0x3140], NFD: [0x3140], NFKC: [0x111A], NFKD: [0x111A] }, +{ source: [0x3141], NFC: [0x3141], NFD: [0x3141], NFKC: [0x1106], NFKD: [0x1106] }, +{ source: [0x3142], NFC: [0x3142], NFD: [0x3142], NFKC: [0x1107], NFKD: [0x1107] }, +{ source: [0x3143], NFC: [0x3143], NFD: [0x3143], NFKC: [0x1108], NFKD: [0x1108] }, +{ source: [0x3144], NFC: [0x3144], NFD: [0x3144], NFKC: [0x1121], NFKD: [0x1121] }, +{ source: [0x3145], NFC: [0x3145], NFD: [0x3145], NFKC: [0x1109], NFKD: [0x1109] }, +{ source: [0x3146], NFC: [0x3146], NFD: [0x3146], NFKC: [0x110A], NFKD: [0x110A] }, +{ source: [0x3147], NFC: [0x3147], NFD: [0x3147], NFKC: [0x110B], NFKD: [0x110B] }, +{ source: [0x3148], NFC: [0x3148], NFD: [0x3148], NFKC: [0x110C], NFKD: [0x110C] }, +{ source: [0x3149], NFC: [0x3149], NFD: [0x3149], NFKC: [0x110D], NFKD: [0x110D] }, +{ source: [0x314A], NFC: [0x314A], NFD: [0x314A], NFKC: [0x110E], NFKD: [0x110E] }, +{ source: [0x314B], NFC: [0x314B], NFD: [0x314B], NFKC: [0x110F], NFKD: [0x110F] }, +{ source: [0x314C], NFC: [0x314C], NFD: [0x314C], NFKC: [0x1110], NFKD: [0x1110] }, +{ source: [0x314D], NFC: [0x314D], NFD: [0x314D], NFKC: [0x1111], NFKD: [0x1111] }, +{ source: [0x314E], NFC: [0x314E], NFD: [0x314E], NFKC: [0x1112], NFKD: [0x1112] }, +{ source: [0x314F], NFC: [0x314F], NFD: [0x314F], NFKC: [0x1161], NFKD: [0x1161] }, +{ source: [0x3150], NFC: [0x3150], NFD: [0x3150], NFKC: [0x1162], NFKD: [0x1162] }, +{ source: [0x3151], NFC: [0x3151], NFD: [0x3151], NFKC: [0x1163], NFKD: [0x1163] }, +{ source: [0x3152], NFC: [0x3152], NFD: [0x3152], NFKC: [0x1164], NFKD: [0x1164] }, +{ source: [0x3153], NFC: [0x3153], NFD: [0x3153], NFKC: [0x1165], NFKD: [0x1165] }, +{ source: [0x3154], NFC: [0x3154], NFD: [0x3154], NFKC: [0x1166], NFKD: [0x1166] }, +{ source: [0x3155], NFC: [0x3155], NFD: [0x3155], NFKC: [0x1167], NFKD: [0x1167] }, +{ source: [0x3156], NFC: [0x3156], NFD: [0x3156], NFKC: [0x1168], NFKD: [0x1168] }, +{ source: [0x3157], NFC: [0x3157], NFD: [0x3157], NFKC: [0x1169], NFKD: [0x1169] }, +{ source: [0x3158], NFC: [0x3158], NFD: [0x3158], NFKC: [0x116A], NFKD: [0x116A] }, +{ source: [0x3159], NFC: [0x3159], NFD: [0x3159], NFKC: [0x116B], NFKD: [0x116B] }, +{ source: [0x315A], NFC: [0x315A], NFD: [0x315A], NFKC: [0x116C], NFKD: [0x116C] }, +{ source: [0x315B], NFC: [0x315B], NFD: [0x315B], NFKC: [0x116D], NFKD: [0x116D] }, +{ source: [0x315C], NFC: [0x315C], NFD: [0x315C], NFKC: [0x116E], NFKD: [0x116E] }, +{ source: [0x315D], NFC: [0x315D], NFD: [0x315D], NFKC: [0x116F], NFKD: [0x116F] }, +{ source: [0x315E], NFC: [0x315E], NFD: [0x315E], NFKC: [0x1170], NFKD: [0x1170] }, +{ source: [0x315F], NFC: [0x315F], NFD: [0x315F], NFKC: [0x1171], NFKD: [0x1171] }, +{ source: [0x3160], NFC: [0x3160], NFD: [0x3160], NFKC: [0x1172], NFKD: [0x1172] }, +{ source: [0x3161], NFC: [0x3161], NFD: [0x3161], NFKC: [0x1173], NFKD: [0x1173] }, +{ source: [0x3162], NFC: [0x3162], NFD: [0x3162], NFKC: [0x1174], NFKD: [0x1174] }, +{ source: [0x3163], NFC: [0x3163], NFD: [0x3163], NFKC: [0x1175], NFKD: [0x1175] }, +{ source: [0x3164], NFC: [0x3164], NFD: [0x3164], NFKC: [0x1160], NFKD: [0x1160] }, +{ source: [0x3165], NFC: [0x3165], NFD: [0x3165], NFKC: [0x1114], NFKD: [0x1114] }, +{ source: [0x3166], NFC: [0x3166], NFD: [0x3166], NFKC: [0x1115], NFKD: [0x1115] }, +{ source: [0x3167], NFC: [0x3167], NFD: [0x3167], NFKC: [0x11C7], NFKD: [0x11C7] }, +{ source: [0x3168], NFC: [0x3168], NFD: [0x3168], NFKC: [0x11C8], NFKD: [0x11C8] }, +{ source: [0x3169], NFC: [0x3169], NFD: [0x3169], NFKC: [0x11CC], NFKD: [0x11CC] }, +{ source: [0x316A], NFC: [0x316A], NFD: [0x316A], NFKC: [0x11CE], NFKD: [0x11CE] }, +{ source: [0x316B], NFC: [0x316B], NFD: [0x316B], NFKC: [0x11D3], NFKD: [0x11D3] }, +{ source: [0x316C], NFC: [0x316C], NFD: [0x316C], NFKC: [0x11D7], NFKD: [0x11D7] }, +{ source: [0x316D], NFC: [0x316D], NFD: [0x316D], NFKC: [0x11D9], NFKD: [0x11D9] }, +{ source: [0x316E], NFC: [0x316E], NFD: [0x316E], NFKC: [0x111C], NFKD: [0x111C] }, +{ source: [0x316F], NFC: [0x316F], NFD: [0x316F], NFKC: [0x11DD], NFKD: [0x11DD] }, +{ source: [0x3170], NFC: [0x3170], NFD: [0x3170], NFKC: [0x11DF], NFKD: [0x11DF] }, +{ source: [0x3171], NFC: [0x3171], NFD: [0x3171], NFKC: [0x111D], NFKD: [0x111D] }, +{ source: [0x3172], NFC: [0x3172], NFD: [0x3172], NFKC: [0x111E], NFKD: [0x111E] }, +{ source: [0x3173], NFC: [0x3173], NFD: [0x3173], NFKC: [0x1120], NFKD: [0x1120] }, +{ source: [0x3174], NFC: [0x3174], NFD: [0x3174], NFKC: [0x1122], NFKD: [0x1122] }, +{ source: [0x3175], NFC: [0x3175], NFD: [0x3175], NFKC: [0x1123], NFKD: [0x1123] }, +{ source: [0x3176], NFC: [0x3176], NFD: [0x3176], NFKC: [0x1127], NFKD: [0x1127] }, +{ source: [0x3177], NFC: [0x3177], NFD: [0x3177], NFKC: [0x1129], NFKD: [0x1129] }, +{ source: [0x3178], NFC: [0x3178], NFD: [0x3178], NFKC: [0x112B], NFKD: [0x112B] }, +{ source: [0x3179], NFC: [0x3179], NFD: [0x3179], NFKC: [0x112C], NFKD: [0x112C] }, +{ source: [0x317A], NFC: [0x317A], NFD: [0x317A], NFKC: [0x112D], NFKD: [0x112D] }, +{ source: [0x317B], NFC: [0x317B], NFD: [0x317B], NFKC: [0x112E], NFKD: [0x112E] }, +{ source: [0x317C], NFC: [0x317C], NFD: [0x317C], NFKC: [0x112F], NFKD: [0x112F] }, +{ source: [0x317D], NFC: [0x317D], NFD: [0x317D], NFKC: [0x1132], NFKD: [0x1132] }, +{ source: [0x317E], NFC: [0x317E], NFD: [0x317E], NFKC: [0x1136], NFKD: [0x1136] }, +{ source: [0x317F], NFC: [0x317F], NFD: [0x317F], NFKC: [0x1140], NFKD: [0x1140] }, +{ source: [0x3180], NFC: [0x3180], NFD: [0x3180], NFKC: [0x1147], NFKD: [0x1147] }, +{ source: [0x3181], NFC: [0x3181], NFD: [0x3181], NFKC: [0x114C], NFKD: [0x114C] }, +{ source: [0x3182], NFC: [0x3182], NFD: [0x3182], NFKC: [0x11F1], NFKD: [0x11F1] }, +{ source: [0x3183], NFC: [0x3183], NFD: [0x3183], NFKC: [0x11F2], NFKD: [0x11F2] }, +{ source: [0x3184], NFC: [0x3184], NFD: [0x3184], NFKC: [0x1157], NFKD: [0x1157] }, +{ source: [0x3185], NFC: [0x3185], NFD: [0x3185], NFKC: [0x1158], NFKD: [0x1158] }, +{ source: [0x3186], NFC: [0x3186], NFD: [0x3186], NFKC: [0x1159], NFKD: [0x1159] }, +{ source: [0x3187], NFC: [0x3187], NFD: [0x3187], NFKC: [0x1184], NFKD: [0x1184] }, +{ source: [0x3188], NFC: [0x3188], NFD: [0x3188], NFKC: [0x1185], NFKD: [0x1185] }, +{ source: [0x3189], NFC: [0x3189], NFD: [0x3189], NFKC: [0x1188], NFKD: [0x1188] }, +{ source: [0x318A], NFC: [0x318A], NFD: [0x318A], NFKC: [0x1191], NFKD: [0x1191] }, +{ source: [0x318B], NFC: [0x318B], NFD: [0x318B], NFKC: [0x1192], NFKD: [0x1192] }, +{ source: [0x318C], NFC: [0x318C], NFD: [0x318C], NFKC: [0x1194], NFKD: [0x1194] }, +{ source: [0x318D], NFC: [0x318D], NFD: [0x318D], NFKC: [0x119E], NFKD: [0x119E] }, +{ source: [0x318E], NFC: [0x318E], NFD: [0x318E], NFKC: [0x11A1], NFKD: [0x11A1] }, +{ source: [0x3192], NFC: [0x3192], NFD: [0x3192], NFKC: [0x4E00], NFKD: [0x4E00] }, +{ source: [0x3193], NFC: [0x3193], NFD: [0x3193], NFKC: [0x4E8C], NFKD: [0x4E8C] }, +{ source: [0x3194], NFC: [0x3194], NFD: [0x3194], NFKC: [0x4E09], NFKD: [0x4E09] }, +{ source: [0x3195], NFC: [0x3195], NFD: [0x3195], NFKC: [0x56DB], NFKD: [0x56DB] }, +{ source: [0x3196], NFC: [0x3196], NFD: [0x3196], NFKC: [0x4E0A], NFKD: [0x4E0A] }, +{ source: [0x3197], NFC: [0x3197], NFD: [0x3197], NFKC: [0x4E2D], NFKD: [0x4E2D] }, +{ source: [0x3198], NFC: [0x3198], NFD: [0x3198], NFKC: [0x4E0B], NFKD: [0x4E0B] }, +{ source: [0x3199], NFC: [0x3199], NFD: [0x3199], NFKC: [0x7532], NFKD: [0x7532] }, +{ source: [0x319A], NFC: [0x319A], NFD: [0x319A], NFKC: [0x4E59], NFKD: [0x4E59] }, +{ source: [0x319B], NFC: [0x319B], NFD: [0x319B], NFKC: [0x4E19], NFKD: [0x4E19] }, +{ source: [0x319C], NFC: [0x319C], NFD: [0x319C], NFKC: [0x4E01], NFKD: [0x4E01] }, +{ source: [0x319D], NFC: [0x319D], NFD: [0x319D], NFKC: [0x5929], NFKD: [0x5929] }, +{ source: [0x319E], NFC: [0x319E], NFD: [0x319E], NFKC: [0x5730], NFKD: [0x5730] }, +{ source: [0x319F], NFC: [0x319F], NFD: [0x319F], NFKC: [0x4EBA], NFKD: [0x4EBA] }, +{ source: [0x3200], NFC: [0x3200], NFD: [0x3200], NFKC: [0x0028, 0x1100, 0x0029], NFKD: [0x0028, 0x1100, 0x0029] }, +{ source: [0x3201], NFC: [0x3201], NFD: [0x3201], NFKC: [0x0028, 0x1102, 0x0029], NFKD: [0x0028, 0x1102, 0x0029] }, +{ source: [0x3202], NFC: [0x3202], NFD: [0x3202], NFKC: [0x0028, 0x1103, 0x0029], NFKD: [0x0028, 0x1103, 0x0029] }, +{ source: [0x3203], NFC: [0x3203], NFD: [0x3203], NFKC: [0x0028, 0x1105, 0x0029], NFKD: [0x0028, 0x1105, 0x0029] }, +{ source: [0x3204], NFC: [0x3204], NFD: [0x3204], NFKC: [0x0028, 0x1106, 0x0029], NFKD: [0x0028, 0x1106, 0x0029] }, +{ source: [0x3205], NFC: [0x3205], NFD: [0x3205], NFKC: [0x0028, 0x1107, 0x0029], NFKD: [0x0028, 0x1107, 0x0029] }, +{ source: [0x3206], NFC: [0x3206], NFD: [0x3206], NFKC: [0x0028, 0x1109, 0x0029], NFKD: [0x0028, 0x1109, 0x0029] }, +{ source: [0x3207], NFC: [0x3207], NFD: [0x3207], NFKC: [0x0028, 0x110B, 0x0029], NFKD: [0x0028, 0x110B, 0x0029] }, +{ source: [0x3208], NFC: [0x3208], NFD: [0x3208], NFKC: [0x0028, 0x110C, 0x0029], NFKD: [0x0028, 0x110C, 0x0029] }, +{ source: [0x3209], NFC: [0x3209], NFD: [0x3209], NFKC: [0x0028, 0x110E, 0x0029], NFKD: [0x0028, 0x110E, 0x0029] }, +{ source: [0x320A], NFC: [0x320A], NFD: [0x320A], NFKC: [0x0028, 0x110F, 0x0029], NFKD: [0x0028, 0x110F, 0x0029] }, +{ source: [0x320B], NFC: [0x320B], NFD: [0x320B], NFKC: [0x0028, 0x1110, 0x0029], NFKD: [0x0028, 0x1110, 0x0029] }, +{ source: [0x320C], NFC: [0x320C], NFD: [0x320C], NFKC: [0x0028, 0x1111, 0x0029], NFKD: [0x0028, 0x1111, 0x0029] }, +{ source: [0x320D], NFC: [0x320D], NFD: [0x320D], NFKC: [0x0028, 0x1112, 0x0029], NFKD: [0x0028, 0x1112, 0x0029] }, +{ source: [0x320E], NFC: [0x320E], NFD: [0x320E], NFKC: [0x0028, 0xAC00, 0x0029], NFKD: [0x0028, 0x1100, 0x1161, 0x0029] }, +{ source: [0x320F], NFC: [0x320F], NFD: [0x320F], NFKC: [0x0028, 0xB098, 0x0029], NFKD: [0x0028, 0x1102, 0x1161, 0x0029] }, +{ source: [0x3210], NFC: [0x3210], NFD: [0x3210], NFKC: [0x0028, 0xB2E4, 0x0029], NFKD: [0x0028, 0x1103, 0x1161, 0x0029] }, +{ source: [0x3211], NFC: [0x3211], NFD: [0x3211], NFKC: [0x0028, 0xB77C, 0x0029], NFKD: [0x0028, 0x1105, 0x1161, 0x0029] }, +{ source: [0x3212], NFC: [0x3212], NFD: [0x3212], NFKC: [0x0028, 0xB9C8, 0x0029], NFKD: [0x0028, 0x1106, 0x1161, 0x0029] }, +{ source: [0x3213], NFC: [0x3213], NFD: [0x3213], NFKC: [0x0028, 0xBC14, 0x0029], NFKD: [0x0028, 0x1107, 0x1161, 0x0029] }, +{ source: [0x3214], NFC: [0x3214], NFD: [0x3214], NFKC: [0x0028, 0xC0AC, 0x0029], NFKD: [0x0028, 0x1109, 0x1161, 0x0029] }, +{ source: [0x3215], NFC: [0x3215], NFD: [0x3215], NFKC: [0x0028, 0xC544, 0x0029], NFKD: [0x0028, 0x110B, 0x1161, 0x0029] }, +{ source: [0x3216], NFC: [0x3216], NFD: [0x3216], NFKC: [0x0028, 0xC790, 0x0029], NFKD: [0x0028, 0x110C, 0x1161, 0x0029] }, +{ source: [0x3217], NFC: [0x3217], NFD: [0x3217], NFKC: [0x0028, 0xCC28, 0x0029], NFKD: [0x0028, 0x110E, 0x1161, 0x0029] }, +{ source: [0x3218], NFC: [0x3218], NFD: [0x3218], NFKC: [0x0028, 0xCE74, 0x0029], NFKD: [0x0028, 0x110F, 0x1161, 0x0029] }, +{ source: [0x3219], NFC: [0x3219], NFD: [0x3219], NFKC: [0x0028, 0xD0C0, 0x0029], NFKD: [0x0028, 0x1110, 0x1161, 0x0029] }, +{ source: [0x321A], NFC: [0x321A], NFD: [0x321A], NFKC: [0x0028, 0xD30C, 0x0029], NFKD: [0x0028, 0x1111, 0x1161, 0x0029] }, +{ source: [0x321B], NFC: [0x321B], NFD: [0x321B], NFKC: [0x0028, 0xD558, 0x0029], NFKD: [0x0028, 0x1112, 0x1161, 0x0029] }, +{ source: [0x321C], NFC: [0x321C], NFD: [0x321C], NFKC: [0x0028, 0xC8FC, 0x0029], NFKD: [0x0028, 0x110C, 0x116E, 0x0029] }, +{ source: [0x321D], NFC: [0x321D], NFD: [0x321D], NFKC: [0x0028, 0xC624, 0xC804, 0x0029], NFKD: [0x0028, 0x110B, 0x1169, 0x110C, 0x1165, 0x11AB, 0x0029] }, +{ source: [0x321E], NFC: [0x321E], NFD: [0x321E], NFKC: [0x0028, 0xC624, 0xD6C4, 0x0029], NFKD: [0x0028, 0x110B, 0x1169, 0x1112, 0x116E, 0x0029] }, +{ source: [0x3220], NFC: [0x3220], NFD: [0x3220], NFKC: [0x0028, 0x4E00, 0x0029], NFKD: [0x0028, 0x4E00, 0x0029] }, +{ source: [0x3221], NFC: [0x3221], NFD: [0x3221], NFKC: [0x0028, 0x4E8C, 0x0029], NFKD: [0x0028, 0x4E8C, 0x0029] }, +{ source: [0x3222], NFC: [0x3222], NFD: [0x3222], NFKC: [0x0028, 0x4E09, 0x0029], NFKD: [0x0028, 0x4E09, 0x0029] }, +{ source: [0x3223], NFC: [0x3223], NFD: [0x3223], NFKC: [0x0028, 0x56DB, 0x0029], NFKD: [0x0028, 0x56DB, 0x0029] }, +{ source: [0x3224], NFC: [0x3224], NFD: [0x3224], NFKC: [0x0028, 0x4E94, 0x0029], NFKD: [0x0028, 0x4E94, 0x0029] }, +{ source: [0x3225], NFC: [0x3225], NFD: [0x3225], NFKC: [0x0028, 0x516D, 0x0029], NFKD: [0x0028, 0x516D, 0x0029] }, +{ source: [0x3226], NFC: [0x3226], NFD: [0x3226], NFKC: [0x0028, 0x4E03, 0x0029], NFKD: [0x0028, 0x4E03, 0x0029] }, +{ source: [0x3227], NFC: [0x3227], NFD: [0x3227], NFKC: [0x0028, 0x516B, 0x0029], NFKD: [0x0028, 0x516B, 0x0029] }, +{ source: [0x3228], NFC: [0x3228], NFD: [0x3228], NFKC: [0x0028, 0x4E5D, 0x0029], NFKD: [0x0028, 0x4E5D, 0x0029] }, +{ source: [0x3229], NFC: [0x3229], NFD: [0x3229], NFKC: [0x0028, 0x5341, 0x0029], NFKD: [0x0028, 0x5341, 0x0029] }, +{ source: [0x322A], NFC: [0x322A], NFD: [0x322A], NFKC: [0x0028, 0x6708, 0x0029], NFKD: [0x0028, 0x6708, 0x0029] }, +{ source: [0x322B], NFC: [0x322B], NFD: [0x322B], NFKC: [0x0028, 0x706B, 0x0029], NFKD: [0x0028, 0x706B, 0x0029] }, +{ source: [0x322C], NFC: [0x322C], NFD: [0x322C], NFKC: [0x0028, 0x6C34, 0x0029], NFKD: [0x0028, 0x6C34, 0x0029] }, +{ source: [0x322D], NFC: [0x322D], NFD: [0x322D], NFKC: [0x0028, 0x6728, 0x0029], NFKD: [0x0028, 0x6728, 0x0029] }, +{ source: [0x322E], NFC: [0x322E], NFD: [0x322E], NFKC: [0x0028, 0x91D1, 0x0029], NFKD: [0x0028, 0x91D1, 0x0029] }, +{ source: [0x322F], NFC: [0x322F], NFD: [0x322F], NFKC: [0x0028, 0x571F, 0x0029], NFKD: [0x0028, 0x571F, 0x0029] }, +{ source: [0x3230], NFC: [0x3230], NFD: [0x3230], NFKC: [0x0028, 0x65E5, 0x0029], NFKD: [0x0028, 0x65E5, 0x0029] }, +{ source: [0x3231], NFC: [0x3231], NFD: [0x3231], NFKC: [0x0028, 0x682A, 0x0029], NFKD: [0x0028, 0x682A, 0x0029] }, +{ source: [0x3232], NFC: [0x3232], NFD: [0x3232], NFKC: [0x0028, 0x6709, 0x0029], NFKD: [0x0028, 0x6709, 0x0029] }, +{ source: [0x3233], NFC: [0x3233], NFD: [0x3233], NFKC: [0x0028, 0x793E, 0x0029], NFKD: [0x0028, 0x793E, 0x0029] }, +{ source: [0x3234], NFC: [0x3234], NFD: [0x3234], NFKC: [0x0028, 0x540D, 0x0029], NFKD: [0x0028, 0x540D, 0x0029] }, +{ source: [0x3235], NFC: [0x3235], NFD: [0x3235], NFKC: [0x0028, 0x7279, 0x0029], NFKD: [0x0028, 0x7279, 0x0029] }, +{ source: [0x3236], NFC: [0x3236], NFD: [0x3236], NFKC: [0x0028, 0x8CA1, 0x0029], NFKD: [0x0028, 0x8CA1, 0x0029] }, +{ source: [0x3237], NFC: [0x3237], NFD: [0x3237], NFKC: [0x0028, 0x795D, 0x0029], NFKD: [0x0028, 0x795D, 0x0029] }, +{ source: [0x3238], NFC: [0x3238], NFD: [0x3238], NFKC: [0x0028, 0x52B4, 0x0029], NFKD: [0x0028, 0x52B4, 0x0029] }, +{ source: [0x3239], NFC: [0x3239], NFD: [0x3239], NFKC: [0x0028, 0x4EE3, 0x0029], NFKD: [0x0028, 0x4EE3, 0x0029] }, +{ source: [0x323A], NFC: [0x323A], NFD: [0x323A], NFKC: [0x0028, 0x547C, 0x0029], NFKD: [0x0028, 0x547C, 0x0029] }, +{ source: [0x323B], NFC: [0x323B], NFD: [0x323B], NFKC: [0x0028, 0x5B66, 0x0029], NFKD: [0x0028, 0x5B66, 0x0029] }, +{ source: [0x323C], NFC: [0x323C], NFD: [0x323C], NFKC: [0x0028, 0x76E3, 0x0029], NFKD: [0x0028, 0x76E3, 0x0029] }, +{ source: [0x323D], NFC: [0x323D], NFD: [0x323D], NFKC: [0x0028, 0x4F01, 0x0029], NFKD: [0x0028, 0x4F01, 0x0029] }, +{ source: [0x323E], NFC: [0x323E], NFD: [0x323E], NFKC: [0x0028, 0x8CC7, 0x0029], NFKD: [0x0028, 0x8CC7, 0x0029] }, +{ source: [0x323F], NFC: [0x323F], NFD: [0x323F], NFKC: [0x0028, 0x5354, 0x0029], NFKD: [0x0028, 0x5354, 0x0029] }, +{ source: [0x3240], NFC: [0x3240], NFD: [0x3240], NFKC: [0x0028, 0x796D, 0x0029], NFKD: [0x0028, 0x796D, 0x0029] }, +{ source: [0x3241], NFC: [0x3241], NFD: [0x3241], NFKC: [0x0028, 0x4F11, 0x0029], NFKD: [0x0028, 0x4F11, 0x0029] }, +{ source: [0x3242], NFC: [0x3242], NFD: [0x3242], NFKC: [0x0028, 0x81EA, 0x0029], NFKD: [0x0028, 0x81EA, 0x0029] }, +{ source: [0x3243], NFC: [0x3243], NFD: [0x3243], NFKC: [0x0028, 0x81F3, 0x0029], NFKD: [0x0028, 0x81F3, 0x0029] }, +{ source: [0x3244], NFC: [0x3244], NFD: [0x3244], NFKC: [0x554F], NFKD: [0x554F] }, +{ source: [0x3245], NFC: [0x3245], NFD: [0x3245], NFKC: [0x5E7C], NFKD: [0x5E7C] }, +{ source: [0x3246], NFC: [0x3246], NFD: [0x3246], NFKC: [0x6587], NFKD: [0x6587] }, +{ source: [0x3247], NFC: [0x3247], NFD: [0x3247], NFKC: [0x7B8F], NFKD: [0x7B8F] }, +{ source: [0x3250], NFC: [0x3250], NFD: [0x3250], NFKC: [0x0050, 0x0054, 0x0045], NFKD: [0x0050, 0x0054, 0x0045] }, +{ source: [0x3251], NFC: [0x3251], NFD: [0x3251], NFKC: [0x0032, 0x0031], NFKD: [0x0032, 0x0031] }, +{ source: [0x3252], NFC: [0x3252], NFD: [0x3252], NFKC: [0x0032, 0x0032], NFKD: [0x0032, 0x0032] }, +{ source: [0x3253], NFC: [0x3253], NFD: [0x3253], NFKC: [0x0032, 0x0033], NFKD: [0x0032, 0x0033] }, +{ source: [0x3254], NFC: [0x3254], NFD: [0x3254], NFKC: [0x0032, 0x0034], NFKD: [0x0032, 0x0034] }, +{ source: [0x3255], NFC: [0x3255], NFD: [0x3255], NFKC: [0x0032, 0x0035], NFKD: [0x0032, 0x0035] }, +{ source: [0x3256], NFC: [0x3256], NFD: [0x3256], NFKC: [0x0032, 0x0036], NFKD: [0x0032, 0x0036] }, +{ source: [0x3257], NFC: [0x3257], NFD: [0x3257], NFKC: [0x0032, 0x0037], NFKD: [0x0032, 0x0037] }, +{ source: [0x3258], NFC: [0x3258], NFD: [0x3258], NFKC: [0x0032, 0x0038], NFKD: [0x0032, 0x0038] }, +{ source: [0x3259], NFC: [0x3259], NFD: [0x3259], NFKC: [0x0032, 0x0039], NFKD: [0x0032, 0x0039] }, +{ source: [0x325A], NFC: [0x325A], NFD: [0x325A], NFKC: [0x0033, 0x0030], NFKD: [0x0033, 0x0030] }, +{ source: [0x325B], NFC: [0x325B], NFD: [0x325B], NFKC: [0x0033, 0x0031], NFKD: [0x0033, 0x0031] }, +{ source: [0x325C], NFC: [0x325C], NFD: [0x325C], NFKC: [0x0033, 0x0032], NFKD: [0x0033, 0x0032] }, +{ source: [0x325D], NFC: [0x325D], NFD: [0x325D], NFKC: [0x0033, 0x0033], NFKD: [0x0033, 0x0033] }, +{ source: [0x325E], NFC: [0x325E], NFD: [0x325E], NFKC: [0x0033, 0x0034], NFKD: [0x0033, 0x0034] }, +{ source: [0x325F], NFC: [0x325F], NFD: [0x325F], NFKC: [0x0033, 0x0035], NFKD: [0x0033, 0x0035] }, +{ source: [0x3260], NFC: [0x3260], NFD: [0x3260], NFKC: [0x1100], NFKD: [0x1100] }, +{ source: [0x3261], NFC: [0x3261], NFD: [0x3261], NFKC: [0x1102], NFKD: [0x1102] }, +{ source: [0x3262], NFC: [0x3262], NFD: [0x3262], NFKC: [0x1103], NFKD: [0x1103] }, +{ source: [0x3263], NFC: [0x3263], NFD: [0x3263], NFKC: [0x1105], NFKD: [0x1105] }, +{ source: [0x3264], NFC: [0x3264], NFD: [0x3264], NFKC: [0x1106], NFKD: [0x1106] }, +{ source: [0x3265], NFC: [0x3265], NFD: [0x3265], NFKC: [0x1107], NFKD: [0x1107] }, +{ source: [0x3266], NFC: [0x3266], NFD: [0x3266], NFKC: [0x1109], NFKD: [0x1109] }, +{ source: [0x3267], NFC: [0x3267], NFD: [0x3267], NFKC: [0x110B], NFKD: [0x110B] }, +{ source: [0x3268], NFC: [0x3268], NFD: [0x3268], NFKC: [0x110C], NFKD: [0x110C] }, +{ source: [0x3269], NFC: [0x3269], NFD: [0x3269], NFKC: [0x110E], NFKD: [0x110E] }, +{ source: [0x326A], NFC: [0x326A], NFD: [0x326A], NFKC: [0x110F], NFKD: [0x110F] }, +{ source: [0x326B], NFC: [0x326B], NFD: [0x326B], NFKC: [0x1110], NFKD: [0x1110] }, +{ source: [0x326C], NFC: [0x326C], NFD: [0x326C], NFKC: [0x1111], NFKD: [0x1111] }, +{ source: [0x326D], NFC: [0x326D], NFD: [0x326D], NFKC: [0x1112], NFKD: [0x1112] }, +{ source: [0x326E], NFC: [0x326E], NFD: [0x326E], NFKC: [0xAC00], NFKD: [0x1100, 0x1161] }, +{ source: [0x326F], NFC: [0x326F], NFD: [0x326F], NFKC: [0xB098], NFKD: [0x1102, 0x1161] }, +{ source: [0x3270], NFC: [0x3270], NFD: [0x3270], NFKC: [0xB2E4], NFKD: [0x1103, 0x1161] }, +{ source: [0x3271], NFC: [0x3271], NFD: [0x3271], NFKC: [0xB77C], NFKD: [0x1105, 0x1161] }, +{ source: [0x3272], NFC: [0x3272], NFD: [0x3272], NFKC: [0xB9C8], NFKD: [0x1106, 0x1161] }, +{ source: [0x3273], NFC: [0x3273], NFD: [0x3273], NFKC: [0xBC14], NFKD: [0x1107, 0x1161] }, +{ source: [0x3274], NFC: [0x3274], NFD: [0x3274], NFKC: [0xC0AC], NFKD: [0x1109, 0x1161] }, +{ source: [0x3275], NFC: [0x3275], NFD: [0x3275], NFKC: [0xC544], NFKD: [0x110B, 0x1161] }, +{ source: [0x3276], NFC: [0x3276], NFD: [0x3276], NFKC: [0xC790], NFKD: [0x110C, 0x1161] }, +{ source: [0x3277], NFC: [0x3277], NFD: [0x3277], NFKC: [0xCC28], NFKD: [0x110E, 0x1161] }, +{ source: [0x3278], NFC: [0x3278], NFD: [0x3278], NFKC: [0xCE74], NFKD: [0x110F, 0x1161] }, +{ source: [0x3279], NFC: [0x3279], NFD: [0x3279], NFKC: [0xD0C0], NFKD: [0x1110, 0x1161] }, +{ source: [0x327A], NFC: [0x327A], NFD: [0x327A], NFKC: [0xD30C], NFKD: [0x1111, 0x1161] }, +{ source: [0x327B], NFC: [0x327B], NFD: [0x327B], NFKC: [0xD558], NFKD: [0x1112, 0x1161] }, +{ source: [0x327C], NFC: [0x327C], NFD: [0x327C], NFKC: [0xCC38, 0xACE0], NFKD: [0x110E, 0x1161, 0x11B7, 0x1100, 0x1169] }, +{ source: [0x327D], NFC: [0x327D], NFD: [0x327D], NFKC: [0xC8FC, 0xC758], NFKD: [0x110C, 0x116E, 0x110B, 0x1174] }, +{ source: [0x327E], NFC: [0x327E], NFD: [0x327E], NFKC: [0xC6B0], NFKD: [0x110B, 0x116E] }, +{ source: [0x3280], NFC: [0x3280], NFD: [0x3280], NFKC: [0x4E00], NFKD: [0x4E00] }, +{ source: [0x3281], NFC: [0x3281], NFD: [0x3281], NFKC: [0x4E8C], NFKD: [0x4E8C] }, +{ source: [0x3282], NFC: [0x3282], NFD: [0x3282], NFKC: [0x4E09], NFKD: [0x4E09] }, +{ source: [0x3283], NFC: [0x3283], NFD: [0x3283], NFKC: [0x56DB], NFKD: [0x56DB] }, +{ source: [0x3284], NFC: [0x3284], NFD: [0x3284], NFKC: [0x4E94], NFKD: [0x4E94] }, +{ source: [0x3285], NFC: [0x3285], NFD: [0x3285], NFKC: [0x516D], NFKD: [0x516D] }, +{ source: [0x3286], NFC: [0x3286], NFD: [0x3286], NFKC: [0x4E03], NFKD: [0x4E03] }, +{ source: [0x3287], NFC: [0x3287], NFD: [0x3287], NFKC: [0x516B], NFKD: [0x516B] }, +{ source: [0x3288], NFC: [0x3288], NFD: [0x3288], NFKC: [0x4E5D], NFKD: [0x4E5D] }, +{ source: [0x3289], NFC: [0x3289], NFD: [0x3289], NFKC: [0x5341], NFKD: [0x5341] }, +{ source: [0x328A], NFC: [0x328A], NFD: [0x328A], NFKC: [0x6708], NFKD: [0x6708] }, +{ source: [0x328B], NFC: [0x328B], NFD: [0x328B], NFKC: [0x706B], NFKD: [0x706B] }, +{ source: [0x328C], NFC: [0x328C], NFD: [0x328C], NFKC: [0x6C34], NFKD: [0x6C34] }, +{ source: [0x328D], NFC: [0x328D], NFD: [0x328D], NFKC: [0x6728], NFKD: [0x6728] }, +{ source: [0x328E], NFC: [0x328E], NFD: [0x328E], NFKC: [0x91D1], NFKD: [0x91D1] }, +{ source: [0x328F], NFC: [0x328F], NFD: [0x328F], NFKC: [0x571F], NFKD: [0x571F] }, +{ source: [0x3290], NFC: [0x3290], NFD: [0x3290], NFKC: [0x65E5], NFKD: [0x65E5] }, +{ source: [0x3291], NFC: [0x3291], NFD: [0x3291], NFKC: [0x682A], NFKD: [0x682A] }, +{ source: [0x3292], NFC: [0x3292], NFD: [0x3292], NFKC: [0x6709], NFKD: [0x6709] }, +{ source: [0x3293], NFC: [0x3293], NFD: [0x3293], NFKC: [0x793E], NFKD: [0x793E] }, +{ source: [0x3294], NFC: [0x3294], NFD: [0x3294], NFKC: [0x540D], NFKD: [0x540D] }, +{ source: [0x3295], NFC: [0x3295], NFD: [0x3295], NFKC: [0x7279], NFKD: [0x7279] }, +{ source: [0x3296], NFC: [0x3296], NFD: [0x3296], NFKC: [0x8CA1], NFKD: [0x8CA1] }, +{ source: [0x3297], NFC: [0x3297], NFD: [0x3297], NFKC: [0x795D], NFKD: [0x795D] }, +{ source: [0x3298], NFC: [0x3298], NFD: [0x3298], NFKC: [0x52B4], NFKD: [0x52B4] }, +{ source: [0x3299], NFC: [0x3299], NFD: [0x3299], NFKC: [0x79D8], NFKD: [0x79D8] }, +{ source: [0x329A], NFC: [0x329A], NFD: [0x329A], NFKC: [0x7537], NFKD: [0x7537] }, +{ source: [0x329B], NFC: [0x329B], NFD: [0x329B], NFKC: [0x5973], NFKD: [0x5973] }, +{ source: [0x329C], NFC: [0x329C], NFD: [0x329C], NFKC: [0x9069], NFKD: [0x9069] }, +{ source: [0x329D], NFC: [0x329D], NFD: [0x329D], NFKC: [0x512A], NFKD: [0x512A] }, +{ source: [0x329E], NFC: [0x329E], NFD: [0x329E], NFKC: [0x5370], NFKD: [0x5370] }, +{ source: [0x329F], NFC: [0x329F], NFD: [0x329F], NFKC: [0x6CE8], NFKD: [0x6CE8] }, +{ source: [0x32A0], NFC: [0x32A0], NFD: [0x32A0], NFKC: [0x9805], NFKD: [0x9805] }, +{ source: [0x32A1], NFC: [0x32A1], NFD: [0x32A1], NFKC: [0x4F11], NFKD: [0x4F11] }, +{ source: [0x32A2], NFC: [0x32A2], NFD: [0x32A2], NFKC: [0x5199], NFKD: [0x5199] }, +{ source: [0x32A3], NFC: [0x32A3], NFD: [0x32A3], NFKC: [0x6B63], NFKD: [0x6B63] }, +{ source: [0x32A4], NFC: [0x32A4], NFD: [0x32A4], NFKC: [0x4E0A], NFKD: [0x4E0A] }, +{ source: [0x32A5], NFC: [0x32A5], NFD: [0x32A5], NFKC: [0x4E2D], NFKD: [0x4E2D] }, +{ source: [0x32A6], NFC: [0x32A6], NFD: [0x32A6], NFKC: [0x4E0B], NFKD: [0x4E0B] }, +{ source: [0x32A7], NFC: [0x32A7], NFD: [0x32A7], NFKC: [0x5DE6], NFKD: [0x5DE6] }, +{ source: [0x32A8], NFC: [0x32A8], NFD: [0x32A8], NFKC: [0x53F3], NFKD: [0x53F3] }, +{ source: [0x32A9], NFC: [0x32A9], NFD: [0x32A9], NFKC: [0x533B], NFKD: [0x533B] }, +{ source: [0x32AA], NFC: [0x32AA], NFD: [0x32AA], NFKC: [0x5B97], NFKD: [0x5B97] }, +{ source: [0x32AB], NFC: [0x32AB], NFD: [0x32AB], NFKC: [0x5B66], NFKD: [0x5B66] }, +{ source: [0x32AC], NFC: [0x32AC], NFD: [0x32AC], NFKC: [0x76E3], NFKD: [0x76E3] }, +{ source: [0x32AD], NFC: [0x32AD], NFD: [0x32AD], NFKC: [0x4F01], NFKD: [0x4F01] }, +{ source: [0x32AE], NFC: [0x32AE], NFD: [0x32AE], NFKC: [0x8CC7], NFKD: [0x8CC7] }, +{ source: [0x32AF], NFC: [0x32AF], NFD: [0x32AF], NFKC: [0x5354], NFKD: [0x5354] }, +{ source: [0x32B0], NFC: [0x32B0], NFD: [0x32B0], NFKC: [0x591C], NFKD: [0x591C] }, +{ source: [0x32B1], NFC: [0x32B1], NFD: [0x32B1], NFKC: [0x0033, 0x0036], NFKD: [0x0033, 0x0036] }, +{ source: [0x32B2], NFC: [0x32B2], NFD: [0x32B2], NFKC: [0x0033, 0x0037], NFKD: [0x0033, 0x0037] }, +{ source: [0x32B3], NFC: [0x32B3], NFD: [0x32B3], NFKC: [0x0033, 0x0038], NFKD: [0x0033, 0x0038] }, +{ source: [0x32B4], NFC: [0x32B4], NFD: [0x32B4], NFKC: [0x0033, 0x0039], NFKD: [0x0033, 0x0039] }, +{ source: [0x32B5], NFC: [0x32B5], NFD: [0x32B5], NFKC: [0x0034, 0x0030], NFKD: [0x0034, 0x0030] }, +{ source: [0x32B6], NFC: [0x32B6], NFD: [0x32B6], NFKC: [0x0034, 0x0031], NFKD: [0x0034, 0x0031] }, +{ source: [0x32B7], NFC: [0x32B7], NFD: [0x32B7], NFKC: [0x0034, 0x0032], NFKD: [0x0034, 0x0032] }, +{ source: [0x32B8], NFC: [0x32B8], NFD: [0x32B8], NFKC: [0x0034, 0x0033], NFKD: [0x0034, 0x0033] }, +{ source: [0x32B9], NFC: [0x32B9], NFD: [0x32B9], NFKC: [0x0034, 0x0034], NFKD: [0x0034, 0x0034] }, +{ source: [0x32BA], NFC: [0x32BA], NFD: [0x32BA], NFKC: [0x0034, 0x0035], NFKD: [0x0034, 0x0035] }, +{ source: [0x32BB], NFC: [0x32BB], NFD: [0x32BB], NFKC: [0x0034, 0x0036], NFKD: [0x0034, 0x0036] }, +{ source: [0x32BC], NFC: [0x32BC], NFD: [0x32BC], NFKC: [0x0034, 0x0037], NFKD: [0x0034, 0x0037] }, +{ source: [0x32BD], NFC: [0x32BD], NFD: [0x32BD], NFKC: [0x0034, 0x0038], NFKD: [0x0034, 0x0038] }, +{ source: [0x32BE], NFC: [0x32BE], NFD: [0x32BE], NFKC: [0x0034, 0x0039], NFKD: [0x0034, 0x0039] }, +{ source: [0x32BF], NFC: [0x32BF], NFD: [0x32BF], NFKC: [0x0035, 0x0030], NFKD: [0x0035, 0x0030] }, +{ source: [0x32C0], NFC: [0x32C0], NFD: [0x32C0], NFKC: [0x0031, 0x6708], NFKD: [0x0031, 0x6708] }, +{ source: [0x32C1], NFC: [0x32C1], NFD: [0x32C1], NFKC: [0x0032, 0x6708], NFKD: [0x0032, 0x6708] }, +{ source: [0x32C2], NFC: [0x32C2], NFD: [0x32C2], NFKC: [0x0033, 0x6708], NFKD: [0x0033, 0x6708] }, +{ source: [0x32C3], NFC: [0x32C3], NFD: [0x32C3], NFKC: [0x0034, 0x6708], NFKD: [0x0034, 0x6708] }, +{ source: [0x32C4], NFC: [0x32C4], NFD: [0x32C4], NFKC: [0x0035, 0x6708], NFKD: [0x0035, 0x6708] }, +{ source: [0x32C5], NFC: [0x32C5], NFD: [0x32C5], NFKC: [0x0036, 0x6708], NFKD: [0x0036, 0x6708] }, +{ source: [0x32C6], NFC: [0x32C6], NFD: [0x32C6], NFKC: [0x0037, 0x6708], NFKD: [0x0037, 0x6708] }, +{ source: [0x32C7], NFC: [0x32C7], NFD: [0x32C7], NFKC: [0x0038, 0x6708], NFKD: [0x0038, 0x6708] }, +{ source: [0x32C8], NFC: [0x32C8], NFD: [0x32C8], NFKC: [0x0039, 0x6708], NFKD: [0x0039, 0x6708] }, +{ source: [0x32C9], NFC: [0x32C9], NFD: [0x32C9], NFKC: [0x0031, 0x0030, 0x6708], NFKD: [0x0031, 0x0030, 0x6708] }, +{ source: [0x32CA], NFC: [0x32CA], NFD: [0x32CA], NFKC: [0x0031, 0x0031, 0x6708], NFKD: [0x0031, 0x0031, 0x6708] }, +{ source: [0x32CB], NFC: [0x32CB], NFD: [0x32CB], NFKC: [0x0031, 0x0032, 0x6708], NFKD: [0x0031, 0x0032, 0x6708] }, +{ source: [0x32CC], NFC: [0x32CC], NFD: [0x32CC], NFKC: [0x0048, 0x0067], NFKD: [0x0048, 0x0067] }, +{ source: [0x32CD], NFC: [0x32CD], NFD: [0x32CD], NFKC: [0x0065, 0x0072, 0x0067], NFKD: [0x0065, 0x0072, 0x0067] }, +{ source: [0x32CE], NFC: [0x32CE], NFD: [0x32CE], NFKC: [0x0065, 0x0056], NFKD: [0x0065, 0x0056] }, +{ source: [0x32CF], NFC: [0x32CF], NFD: [0x32CF], NFKC: [0x004C, 0x0054, 0x0044], NFKD: [0x004C, 0x0054, 0x0044] }, +{ source: [0x32D0], NFC: [0x32D0], NFD: [0x32D0], NFKC: [0x30A2], NFKD: [0x30A2] }, +{ source: [0x32D1], NFC: [0x32D1], NFD: [0x32D1], NFKC: [0x30A4], NFKD: [0x30A4] }, +{ source: [0x32D2], NFC: [0x32D2], NFD: [0x32D2], NFKC: [0x30A6], NFKD: [0x30A6] }, +{ source: [0x32D3], NFC: [0x32D3], NFD: [0x32D3], NFKC: [0x30A8], NFKD: [0x30A8] }, +{ source: [0x32D4], NFC: [0x32D4], NFD: [0x32D4], NFKC: [0x30AA], NFKD: [0x30AA] }, +{ source: [0x32D5], NFC: [0x32D5], NFD: [0x32D5], NFKC: [0x30AB], NFKD: [0x30AB] }, +{ source: [0x32D6], NFC: [0x32D6], NFD: [0x32D6], NFKC: [0x30AD], NFKD: [0x30AD] }, +{ source: [0x32D7], NFC: [0x32D7], NFD: [0x32D7], NFKC: [0x30AF], NFKD: [0x30AF] }, +{ source: [0x32D8], NFC: [0x32D8], NFD: [0x32D8], NFKC: [0x30B1], NFKD: [0x30B1] }, +{ source: [0x32D9], NFC: [0x32D9], NFD: [0x32D9], NFKC: [0x30B3], NFKD: [0x30B3] }, +{ source: [0x32DA], NFC: [0x32DA], NFD: [0x32DA], NFKC: [0x30B5], NFKD: [0x30B5] }, +{ source: [0x32DB], NFC: [0x32DB], NFD: [0x32DB], NFKC: [0x30B7], NFKD: [0x30B7] }, +{ source: [0x32DC], NFC: [0x32DC], NFD: [0x32DC], NFKC: [0x30B9], NFKD: [0x30B9] }, +{ source: [0x32DD], NFC: [0x32DD], NFD: [0x32DD], NFKC: [0x30BB], NFKD: [0x30BB] }, +{ source: [0x32DE], NFC: [0x32DE], NFD: [0x32DE], NFKC: [0x30BD], NFKD: [0x30BD] }, +{ source: [0x32DF], NFC: [0x32DF], NFD: [0x32DF], NFKC: [0x30BF], NFKD: [0x30BF] }, +{ source: [0x32E0], NFC: [0x32E0], NFD: [0x32E0], NFKC: [0x30C1], NFKD: [0x30C1] }, +{ source: [0x32E1], NFC: [0x32E1], NFD: [0x32E1], NFKC: [0x30C4], NFKD: [0x30C4] }, +{ source: [0x32E2], NFC: [0x32E2], NFD: [0x32E2], NFKC: [0x30C6], NFKD: [0x30C6] }, +{ source: [0x32E3], NFC: [0x32E3], NFD: [0x32E3], NFKC: [0x30C8], NFKD: [0x30C8] }, +{ source: [0x32E4], NFC: [0x32E4], NFD: [0x32E4], NFKC: [0x30CA], NFKD: [0x30CA] }, +{ source: [0x32E5], NFC: [0x32E5], NFD: [0x32E5], NFKC: [0x30CB], NFKD: [0x30CB] }, +{ source: [0x32E6], NFC: [0x32E6], NFD: [0x32E6], NFKC: [0x30CC], NFKD: [0x30CC] }, +{ source: [0x32E7], NFC: [0x32E7], NFD: [0x32E7], NFKC: [0x30CD], NFKD: [0x30CD] }, +{ source: [0x32E8], NFC: [0x32E8], NFD: [0x32E8], NFKC: [0x30CE], NFKD: [0x30CE] }, +{ source: [0x32E9], NFC: [0x32E9], NFD: [0x32E9], NFKC: [0x30CF], NFKD: [0x30CF] }, +{ source: [0x32EA], NFC: [0x32EA], NFD: [0x32EA], NFKC: [0x30D2], NFKD: [0x30D2] }, +{ source: [0x32EB], NFC: [0x32EB], NFD: [0x32EB], NFKC: [0x30D5], NFKD: [0x30D5] }, +{ source: [0x32EC], NFC: [0x32EC], NFD: [0x32EC], NFKC: [0x30D8], NFKD: [0x30D8] }, +{ source: [0x32ED], NFC: [0x32ED], NFD: [0x32ED], NFKC: [0x30DB], NFKD: [0x30DB] }, +{ source: [0x32EE], NFC: [0x32EE], NFD: [0x32EE], NFKC: [0x30DE], NFKD: [0x30DE] }, +{ source: [0x32EF], NFC: [0x32EF], NFD: [0x32EF], NFKC: [0x30DF], NFKD: [0x30DF] }, +{ source: [0x32F0], NFC: [0x32F0], NFD: [0x32F0], NFKC: [0x30E0], NFKD: [0x30E0] }, +{ source: [0x32F1], NFC: [0x32F1], NFD: [0x32F1], NFKC: [0x30E1], NFKD: [0x30E1] }, +{ source: [0x32F2], NFC: [0x32F2], NFD: [0x32F2], NFKC: [0x30E2], NFKD: [0x30E2] }, +{ source: [0x32F3], NFC: [0x32F3], NFD: [0x32F3], NFKC: [0x30E4], NFKD: [0x30E4] }, +{ source: [0x32F4], NFC: [0x32F4], NFD: [0x32F4], NFKC: [0x30E6], NFKD: [0x30E6] }, +{ source: [0x32F5], NFC: [0x32F5], NFD: [0x32F5], NFKC: [0x30E8], NFKD: [0x30E8] }, +{ source: [0x32F6], NFC: [0x32F6], NFD: [0x32F6], NFKC: [0x30E9], NFKD: [0x30E9] }, +{ source: [0x32F7], NFC: [0x32F7], NFD: [0x32F7], NFKC: [0x30EA], NFKD: [0x30EA] }, +{ source: [0x32F8], NFC: [0x32F8], NFD: [0x32F8], NFKC: [0x30EB], NFKD: [0x30EB] }, +{ source: [0x32F9], NFC: [0x32F9], NFD: [0x32F9], NFKC: [0x30EC], NFKD: [0x30EC] }, +{ source: [0x32FA], NFC: [0x32FA], NFD: [0x32FA], NFKC: [0x30ED], NFKD: [0x30ED] }, +{ source: [0x32FB], NFC: [0x32FB], NFD: [0x32FB], NFKC: [0x30EF], NFKD: [0x30EF] }, +{ source: [0x32FC], NFC: [0x32FC], NFD: [0x32FC], NFKC: [0x30F0], NFKD: [0x30F0] }, +{ source: [0x32FD], NFC: [0x32FD], NFD: [0x32FD], NFKC: [0x30F1], NFKD: [0x30F1] }, +{ source: [0x32FE], NFC: [0x32FE], NFD: [0x32FE], NFKC: [0x30F2], NFKD: [0x30F2] }, +{ source: [0x32FF], NFC: [0x32FF], NFD: [0x32FF], NFKC: [0x4EE4, 0x548C], NFKD: [0x4EE4, 0x548C] }, +{ source: [0x3300], NFC: [0x3300], NFD: [0x3300], NFKC: [0x30A2, 0x30D1, 0x30FC, 0x30C8], NFKD: [0x30A2, 0x30CF, 0x309A, 0x30FC, 0x30C8] }, +{ source: [0x3301], NFC: [0x3301], NFD: [0x3301], NFKC: [0x30A2, 0x30EB, 0x30D5, 0x30A1], NFKD: [0x30A2, 0x30EB, 0x30D5, 0x30A1] }, +{ source: [0x3302], NFC: [0x3302], NFD: [0x3302], NFKC: [0x30A2, 0x30F3, 0x30DA, 0x30A2], NFKD: [0x30A2, 0x30F3, 0x30D8, 0x309A, 0x30A2] }, +{ source: [0x3303], NFC: [0x3303], NFD: [0x3303], NFKC: [0x30A2, 0x30FC, 0x30EB], NFKD: [0x30A2, 0x30FC, 0x30EB] }, +{ source: [0x3304], NFC: [0x3304], NFD: [0x3304], NFKC: [0x30A4, 0x30CB, 0x30F3, 0x30B0], NFKD: [0x30A4, 0x30CB, 0x30F3, 0x30AF, 0x3099] }, +{ source: [0x3305], NFC: [0x3305], NFD: [0x3305], NFKC: [0x30A4, 0x30F3, 0x30C1], NFKD: [0x30A4, 0x30F3, 0x30C1] }, +{ source: [0x3306], NFC: [0x3306], NFD: [0x3306], NFKC: [0x30A6, 0x30A9, 0x30F3], NFKD: [0x30A6, 0x30A9, 0x30F3] }, +{ source: [0x3307], NFC: [0x3307], NFD: [0x3307], NFKC: [0x30A8, 0x30B9, 0x30AF, 0x30FC, 0x30C9], NFKD: [0x30A8, 0x30B9, 0x30AF, 0x30FC, 0x30C8, 0x3099] }, +{ source: [0x3308], NFC: [0x3308], NFD: [0x3308], NFKC: [0x30A8, 0x30FC, 0x30AB, 0x30FC], NFKD: [0x30A8, 0x30FC, 0x30AB, 0x30FC] }, +{ source: [0x3309], NFC: [0x3309], NFD: [0x3309], NFKC: [0x30AA, 0x30F3, 0x30B9], NFKD: [0x30AA, 0x30F3, 0x30B9] }, +{ source: [0x330A], NFC: [0x330A], NFD: [0x330A], NFKC: [0x30AA, 0x30FC, 0x30E0], NFKD: [0x30AA, 0x30FC, 0x30E0] }, +{ source: [0x330B], NFC: [0x330B], NFD: [0x330B], NFKC: [0x30AB, 0x30A4, 0x30EA], NFKD: [0x30AB, 0x30A4, 0x30EA] }, +{ source: [0x330C], NFC: [0x330C], NFD: [0x330C], NFKC: [0x30AB, 0x30E9, 0x30C3, 0x30C8], NFKD: [0x30AB, 0x30E9, 0x30C3, 0x30C8] }, +{ source: [0x330D], NFC: [0x330D], NFD: [0x330D], NFKC: [0x30AB, 0x30ED, 0x30EA, 0x30FC], NFKD: [0x30AB, 0x30ED, 0x30EA, 0x30FC] }, +{ source: [0x330E], NFC: [0x330E], NFD: [0x330E], NFKC: [0x30AC, 0x30ED, 0x30F3], NFKD: [0x30AB, 0x3099, 0x30ED, 0x30F3] }, +{ source: [0x330F], NFC: [0x330F], NFD: [0x330F], NFKC: [0x30AC, 0x30F3, 0x30DE], NFKD: [0x30AB, 0x3099, 0x30F3, 0x30DE] }, +{ source: [0x3310], NFC: [0x3310], NFD: [0x3310], NFKC: [0x30AE, 0x30AC], NFKD: [0x30AD, 0x3099, 0x30AB, 0x3099] }, +{ source: [0x3311], NFC: [0x3311], NFD: [0x3311], NFKC: [0x30AE, 0x30CB, 0x30FC], NFKD: [0x30AD, 0x3099, 0x30CB, 0x30FC] }, +{ source: [0x3312], NFC: [0x3312], NFD: [0x3312], NFKC: [0x30AD, 0x30E5, 0x30EA, 0x30FC], NFKD: [0x30AD, 0x30E5, 0x30EA, 0x30FC] }, +{ source: [0x3313], NFC: [0x3313], NFD: [0x3313], NFKC: [0x30AE, 0x30EB, 0x30C0, 0x30FC], NFKD: [0x30AD, 0x3099, 0x30EB, 0x30BF, 0x3099, 0x30FC] }, +{ source: [0x3314], NFC: [0x3314], NFD: [0x3314], NFKC: [0x30AD, 0x30ED], NFKD: [0x30AD, 0x30ED] }, +{ source: [0x3315], NFC: [0x3315], NFD: [0x3315], NFKC: [0x30AD, 0x30ED, 0x30B0, 0x30E9, 0x30E0], NFKD: [0x30AD, 0x30ED, 0x30AF, 0x3099, 0x30E9, 0x30E0] }, +{ source: [0x3316], NFC: [0x3316], NFD: [0x3316], NFKC: [0x30AD, 0x30ED, 0x30E1, 0x30FC, 0x30C8, 0x30EB], NFKD: [0x30AD, 0x30ED, 0x30E1, 0x30FC, 0x30C8, 0x30EB] }, +{ source: [0x3317], NFC: [0x3317], NFD: [0x3317], NFKC: [0x30AD, 0x30ED, 0x30EF, 0x30C3, 0x30C8], NFKD: [0x30AD, 0x30ED, 0x30EF, 0x30C3, 0x30C8] }, +{ source: [0x3318], NFC: [0x3318], NFD: [0x3318], NFKC: [0x30B0, 0x30E9, 0x30E0], NFKD: [0x30AF, 0x3099, 0x30E9, 0x30E0] }, +{ source: [0x3319], NFC: [0x3319], NFD: [0x3319], NFKC: [0x30B0, 0x30E9, 0x30E0, 0x30C8, 0x30F3], NFKD: [0x30AF, 0x3099, 0x30E9, 0x30E0, 0x30C8, 0x30F3] }, +{ source: [0x331A], NFC: [0x331A], NFD: [0x331A], NFKC: [0x30AF, 0x30EB, 0x30BC, 0x30A4, 0x30ED], NFKD: [0x30AF, 0x30EB, 0x30BB, 0x3099, 0x30A4, 0x30ED] }, +{ source: [0x331B], NFC: [0x331B], NFD: [0x331B], NFKC: [0x30AF, 0x30ED, 0x30FC, 0x30CD], NFKD: [0x30AF, 0x30ED, 0x30FC, 0x30CD] }, +{ source: [0x331C], NFC: [0x331C], NFD: [0x331C], NFKC: [0x30B1, 0x30FC, 0x30B9], NFKD: [0x30B1, 0x30FC, 0x30B9] }, +{ source: [0x331D], NFC: [0x331D], NFD: [0x331D], NFKC: [0x30B3, 0x30EB, 0x30CA], NFKD: [0x30B3, 0x30EB, 0x30CA] }, +{ source: [0x331E], NFC: [0x331E], NFD: [0x331E], NFKC: [0x30B3, 0x30FC, 0x30DD], NFKD: [0x30B3, 0x30FC, 0x30DB, 0x309A] }, +{ source: [0x331F], NFC: [0x331F], NFD: [0x331F], NFKC: [0x30B5, 0x30A4, 0x30AF, 0x30EB], NFKD: [0x30B5, 0x30A4, 0x30AF, 0x30EB] }, +{ source: [0x3320], NFC: [0x3320], NFD: [0x3320], NFKC: [0x30B5, 0x30F3, 0x30C1, 0x30FC, 0x30E0], NFKD: [0x30B5, 0x30F3, 0x30C1, 0x30FC, 0x30E0] }, +{ source: [0x3321], NFC: [0x3321], NFD: [0x3321], NFKC: [0x30B7, 0x30EA, 0x30F3, 0x30B0], NFKD: [0x30B7, 0x30EA, 0x30F3, 0x30AF, 0x3099] }, +{ source: [0x3322], NFC: [0x3322], NFD: [0x3322], NFKC: [0x30BB, 0x30F3, 0x30C1], NFKD: [0x30BB, 0x30F3, 0x30C1] }, +{ source: [0x3323], NFC: [0x3323], NFD: [0x3323], NFKC: [0x30BB, 0x30F3, 0x30C8], NFKD: [0x30BB, 0x30F3, 0x30C8] }, +{ source: [0x3324], NFC: [0x3324], NFD: [0x3324], NFKC: [0x30C0, 0x30FC, 0x30B9], NFKD: [0x30BF, 0x3099, 0x30FC, 0x30B9] }, +{ source: [0x3325], NFC: [0x3325], NFD: [0x3325], NFKC: [0x30C7, 0x30B7], NFKD: [0x30C6, 0x3099, 0x30B7] }, +{ source: [0x3326], NFC: [0x3326], NFD: [0x3326], NFKC: [0x30C9, 0x30EB], NFKD: [0x30C8, 0x3099, 0x30EB] }, +{ source: [0x3327], NFC: [0x3327], NFD: [0x3327], NFKC: [0x30C8, 0x30F3], NFKD: [0x30C8, 0x30F3] }, +{ source: [0x3328], NFC: [0x3328], NFD: [0x3328], NFKC: [0x30CA, 0x30CE], NFKD: [0x30CA, 0x30CE] }, +{ source: [0x3329], NFC: [0x3329], NFD: [0x3329], NFKC: [0x30CE, 0x30C3, 0x30C8], NFKD: [0x30CE, 0x30C3, 0x30C8] }, +{ source: [0x332A], NFC: [0x332A], NFD: [0x332A], NFKC: [0x30CF, 0x30A4, 0x30C4], NFKD: [0x30CF, 0x30A4, 0x30C4] }, +{ source: [0x332B], NFC: [0x332B], NFD: [0x332B], NFKC: [0x30D1, 0x30FC, 0x30BB, 0x30F3, 0x30C8], NFKD: [0x30CF, 0x309A, 0x30FC, 0x30BB, 0x30F3, 0x30C8] }, +{ source: [0x332C], NFC: [0x332C], NFD: [0x332C], NFKC: [0x30D1, 0x30FC, 0x30C4], NFKD: [0x30CF, 0x309A, 0x30FC, 0x30C4] }, +{ source: [0x332D], NFC: [0x332D], NFD: [0x332D], NFKC: [0x30D0, 0x30FC, 0x30EC, 0x30EB], NFKD: [0x30CF, 0x3099, 0x30FC, 0x30EC, 0x30EB] }, +{ source: [0x332E], NFC: [0x332E], NFD: [0x332E], NFKC: [0x30D4, 0x30A2, 0x30B9, 0x30C8, 0x30EB], NFKD: [0x30D2, 0x309A, 0x30A2, 0x30B9, 0x30C8, 0x30EB] }, +{ source: [0x332F], NFC: [0x332F], NFD: [0x332F], NFKC: [0x30D4, 0x30AF, 0x30EB], NFKD: [0x30D2, 0x309A, 0x30AF, 0x30EB] }, +{ source: [0x3330], NFC: [0x3330], NFD: [0x3330], NFKC: [0x30D4, 0x30B3], NFKD: [0x30D2, 0x309A, 0x30B3] }, +{ source: [0x3331], NFC: [0x3331], NFD: [0x3331], NFKC: [0x30D3, 0x30EB], NFKD: [0x30D2, 0x3099, 0x30EB] }, +{ source: [0x3332], NFC: [0x3332], NFD: [0x3332], NFKC: [0x30D5, 0x30A1, 0x30E9, 0x30C3, 0x30C9], NFKD: [0x30D5, 0x30A1, 0x30E9, 0x30C3, 0x30C8, 0x3099] }, +{ source: [0x3333], NFC: [0x3333], NFD: [0x3333], NFKC: [0x30D5, 0x30A3, 0x30FC, 0x30C8], NFKD: [0x30D5, 0x30A3, 0x30FC, 0x30C8] }, +{ source: [0x3334], NFC: [0x3334], NFD: [0x3334], NFKC: [0x30D6, 0x30C3, 0x30B7, 0x30A7, 0x30EB], NFKD: [0x30D5, 0x3099, 0x30C3, 0x30B7, 0x30A7, 0x30EB] }, +{ source: [0x3335], NFC: [0x3335], NFD: [0x3335], NFKC: [0x30D5, 0x30E9, 0x30F3], NFKD: [0x30D5, 0x30E9, 0x30F3] }, +{ source: [0x3336], NFC: [0x3336], NFD: [0x3336], NFKC: [0x30D8, 0x30AF, 0x30BF, 0x30FC, 0x30EB], NFKD: [0x30D8, 0x30AF, 0x30BF, 0x30FC, 0x30EB] }, +{ source: [0x3337], NFC: [0x3337], NFD: [0x3337], NFKC: [0x30DA, 0x30BD], NFKD: [0x30D8, 0x309A, 0x30BD] }, +{ source: [0x3338], NFC: [0x3338], NFD: [0x3338], NFKC: [0x30DA, 0x30CB, 0x30D2], NFKD: [0x30D8, 0x309A, 0x30CB, 0x30D2] }, +{ source: [0x3339], NFC: [0x3339], NFD: [0x3339], NFKC: [0x30D8, 0x30EB, 0x30C4], NFKD: [0x30D8, 0x30EB, 0x30C4] }, +{ source: [0x333A], NFC: [0x333A], NFD: [0x333A], NFKC: [0x30DA, 0x30F3, 0x30B9], NFKD: [0x30D8, 0x309A, 0x30F3, 0x30B9] }, +{ source: [0x333B], NFC: [0x333B], NFD: [0x333B], NFKC: [0x30DA, 0x30FC, 0x30B8], NFKD: [0x30D8, 0x309A, 0x30FC, 0x30B7, 0x3099] }, +{ source: [0x333C], NFC: [0x333C], NFD: [0x333C], NFKC: [0x30D9, 0x30FC, 0x30BF], NFKD: [0x30D8, 0x3099, 0x30FC, 0x30BF] }, +{ source: [0x333D], NFC: [0x333D], NFD: [0x333D], NFKC: [0x30DD, 0x30A4, 0x30F3, 0x30C8], NFKD: [0x30DB, 0x309A, 0x30A4, 0x30F3, 0x30C8] }, +{ source: [0x333E], NFC: [0x333E], NFD: [0x333E], NFKC: [0x30DC, 0x30EB, 0x30C8], NFKD: [0x30DB, 0x3099, 0x30EB, 0x30C8] }, +{ source: [0x333F], NFC: [0x333F], NFD: [0x333F], NFKC: [0x30DB, 0x30F3], NFKD: [0x30DB, 0x30F3] }, +{ source: [0x3340], NFC: [0x3340], NFD: [0x3340], NFKC: [0x30DD, 0x30F3, 0x30C9], NFKD: [0x30DB, 0x309A, 0x30F3, 0x30C8, 0x3099] }, +{ source: [0x3341], NFC: [0x3341], NFD: [0x3341], NFKC: [0x30DB, 0x30FC, 0x30EB], NFKD: [0x30DB, 0x30FC, 0x30EB] }, +{ source: [0x3342], NFC: [0x3342], NFD: [0x3342], NFKC: [0x30DB, 0x30FC, 0x30F3], NFKD: [0x30DB, 0x30FC, 0x30F3] }, +{ source: [0x3343], NFC: [0x3343], NFD: [0x3343], NFKC: [0x30DE, 0x30A4, 0x30AF, 0x30ED], NFKD: [0x30DE, 0x30A4, 0x30AF, 0x30ED] }, +{ source: [0x3344], NFC: [0x3344], NFD: [0x3344], NFKC: [0x30DE, 0x30A4, 0x30EB], NFKD: [0x30DE, 0x30A4, 0x30EB] }, +{ source: [0x3345], NFC: [0x3345], NFD: [0x3345], NFKC: [0x30DE, 0x30C3, 0x30CF], NFKD: [0x30DE, 0x30C3, 0x30CF] }, +{ source: [0x3346], NFC: [0x3346], NFD: [0x3346], NFKC: [0x30DE, 0x30EB, 0x30AF], NFKD: [0x30DE, 0x30EB, 0x30AF] }, +{ source: [0x3347], NFC: [0x3347], NFD: [0x3347], NFKC: [0x30DE, 0x30F3, 0x30B7, 0x30E7, 0x30F3], NFKD: [0x30DE, 0x30F3, 0x30B7, 0x30E7, 0x30F3] }, +{ source: [0x3348], NFC: [0x3348], NFD: [0x3348], NFKC: [0x30DF, 0x30AF, 0x30ED, 0x30F3], NFKD: [0x30DF, 0x30AF, 0x30ED, 0x30F3] }, +{ source: [0x3349], NFC: [0x3349], NFD: [0x3349], NFKC: [0x30DF, 0x30EA], NFKD: [0x30DF, 0x30EA] }, +{ source: [0x334A], NFC: [0x334A], NFD: [0x334A], NFKC: [0x30DF, 0x30EA, 0x30D0, 0x30FC, 0x30EB], NFKD: [0x30DF, 0x30EA, 0x30CF, 0x3099, 0x30FC, 0x30EB] }, +{ source: [0x334B], NFC: [0x334B], NFD: [0x334B], NFKC: [0x30E1, 0x30AC], NFKD: [0x30E1, 0x30AB, 0x3099] }, +{ source: [0x334C], NFC: [0x334C], NFD: [0x334C], NFKC: [0x30E1, 0x30AC, 0x30C8, 0x30F3], NFKD: [0x30E1, 0x30AB, 0x3099, 0x30C8, 0x30F3] }, +{ source: [0x334D], NFC: [0x334D], NFD: [0x334D], NFKC: [0x30E1, 0x30FC, 0x30C8, 0x30EB], NFKD: [0x30E1, 0x30FC, 0x30C8, 0x30EB] }, +{ source: [0x334E], NFC: [0x334E], NFD: [0x334E], NFKC: [0x30E4, 0x30FC, 0x30C9], NFKD: [0x30E4, 0x30FC, 0x30C8, 0x3099] }, +{ source: [0x334F], NFC: [0x334F], NFD: [0x334F], NFKC: [0x30E4, 0x30FC, 0x30EB], NFKD: [0x30E4, 0x30FC, 0x30EB] }, +{ source: [0x3350], NFC: [0x3350], NFD: [0x3350], NFKC: [0x30E6, 0x30A2, 0x30F3], NFKD: [0x30E6, 0x30A2, 0x30F3] }, +{ source: [0x3351], NFC: [0x3351], NFD: [0x3351], NFKC: [0x30EA, 0x30C3, 0x30C8, 0x30EB], NFKD: [0x30EA, 0x30C3, 0x30C8, 0x30EB] }, +{ source: [0x3352], NFC: [0x3352], NFD: [0x3352], NFKC: [0x30EA, 0x30E9], NFKD: [0x30EA, 0x30E9] }, +{ source: [0x3353], NFC: [0x3353], NFD: [0x3353], NFKC: [0x30EB, 0x30D4, 0x30FC], NFKD: [0x30EB, 0x30D2, 0x309A, 0x30FC] }, +{ source: [0x3354], NFC: [0x3354], NFD: [0x3354], NFKC: [0x30EB, 0x30FC, 0x30D6, 0x30EB], NFKD: [0x30EB, 0x30FC, 0x30D5, 0x3099, 0x30EB] }, +{ source: [0x3355], NFC: [0x3355], NFD: [0x3355], NFKC: [0x30EC, 0x30E0], NFKD: [0x30EC, 0x30E0] }, +{ source: [0x3356], NFC: [0x3356], NFD: [0x3356], NFKC: [0x30EC, 0x30F3, 0x30C8, 0x30B2, 0x30F3], NFKD: [0x30EC, 0x30F3, 0x30C8, 0x30B1, 0x3099, 0x30F3] }, +{ source: [0x3357], NFC: [0x3357], NFD: [0x3357], NFKC: [0x30EF, 0x30C3, 0x30C8], NFKD: [0x30EF, 0x30C3, 0x30C8] }, +{ source: [0x3358], NFC: [0x3358], NFD: [0x3358], NFKC: [0x0030, 0x70B9], NFKD: [0x0030, 0x70B9] }, +{ source: [0x3359], NFC: [0x3359], NFD: [0x3359], NFKC: [0x0031, 0x70B9], NFKD: [0x0031, 0x70B9] }, +{ source: [0x335A], NFC: [0x335A], NFD: [0x335A], NFKC: [0x0032, 0x70B9], NFKD: [0x0032, 0x70B9] }, +{ source: [0x335B], NFC: [0x335B], NFD: [0x335B], NFKC: [0x0033, 0x70B9], NFKD: [0x0033, 0x70B9] }, +{ source: [0x335C], NFC: [0x335C], NFD: [0x335C], NFKC: [0x0034, 0x70B9], NFKD: [0x0034, 0x70B9] }, +{ source: [0x335D], NFC: [0x335D], NFD: [0x335D], NFKC: [0x0035, 0x70B9], NFKD: [0x0035, 0x70B9] }, +{ source: [0x335E], NFC: [0x335E], NFD: [0x335E], NFKC: [0x0036, 0x70B9], NFKD: [0x0036, 0x70B9] }, +{ source: [0x335F], NFC: [0x335F], NFD: [0x335F], NFKC: [0x0037, 0x70B9], NFKD: [0x0037, 0x70B9] }, +{ source: [0x3360], NFC: [0x3360], NFD: [0x3360], NFKC: [0x0038, 0x70B9], NFKD: [0x0038, 0x70B9] }, +{ source: [0x3361], NFC: [0x3361], NFD: [0x3361], NFKC: [0x0039, 0x70B9], NFKD: [0x0039, 0x70B9] }, +{ source: [0x3362], NFC: [0x3362], NFD: [0x3362], NFKC: [0x0031, 0x0030, 0x70B9], NFKD: [0x0031, 0x0030, 0x70B9] }, +{ source: [0x3363], NFC: [0x3363], NFD: [0x3363], NFKC: [0x0031, 0x0031, 0x70B9], NFKD: [0x0031, 0x0031, 0x70B9] }, +{ source: [0x3364], NFC: [0x3364], NFD: [0x3364], NFKC: [0x0031, 0x0032, 0x70B9], NFKD: [0x0031, 0x0032, 0x70B9] }, +{ source: [0x3365], NFC: [0x3365], NFD: [0x3365], NFKC: [0x0031, 0x0033, 0x70B9], NFKD: [0x0031, 0x0033, 0x70B9] }, +{ source: [0x3366], NFC: [0x3366], NFD: [0x3366], NFKC: [0x0031, 0x0034, 0x70B9], NFKD: [0x0031, 0x0034, 0x70B9] }, +{ source: [0x3367], NFC: [0x3367], NFD: [0x3367], NFKC: [0x0031, 0x0035, 0x70B9], NFKD: [0x0031, 0x0035, 0x70B9] }, +{ source: [0x3368], NFC: [0x3368], NFD: [0x3368], NFKC: [0x0031, 0x0036, 0x70B9], NFKD: [0x0031, 0x0036, 0x70B9] }, +{ source: [0x3369], NFC: [0x3369], NFD: [0x3369], NFKC: [0x0031, 0x0037, 0x70B9], NFKD: [0x0031, 0x0037, 0x70B9] }, +{ source: [0x336A], NFC: [0x336A], NFD: [0x336A], NFKC: [0x0031, 0x0038, 0x70B9], NFKD: [0x0031, 0x0038, 0x70B9] }, +{ source: [0x336B], NFC: [0x336B], NFD: [0x336B], NFKC: [0x0031, 0x0039, 0x70B9], NFKD: [0x0031, 0x0039, 0x70B9] }, +{ source: [0x336C], NFC: [0x336C], NFD: [0x336C], NFKC: [0x0032, 0x0030, 0x70B9], NFKD: [0x0032, 0x0030, 0x70B9] }, +{ source: [0x336D], NFC: [0x336D], NFD: [0x336D], NFKC: [0x0032, 0x0031, 0x70B9], NFKD: [0x0032, 0x0031, 0x70B9] }, +{ source: [0x336E], NFC: [0x336E], NFD: [0x336E], NFKC: [0x0032, 0x0032, 0x70B9], NFKD: [0x0032, 0x0032, 0x70B9] }, +{ source: [0x336F], NFC: [0x336F], NFD: [0x336F], NFKC: [0x0032, 0x0033, 0x70B9], NFKD: [0x0032, 0x0033, 0x70B9] }, +{ source: [0x3370], NFC: [0x3370], NFD: [0x3370], NFKC: [0x0032, 0x0034, 0x70B9], NFKD: [0x0032, 0x0034, 0x70B9] }, +{ source: [0x3371], NFC: [0x3371], NFD: [0x3371], NFKC: [0x0068, 0x0050, 0x0061], NFKD: [0x0068, 0x0050, 0x0061] }, +{ source: [0x3372], NFC: [0x3372], NFD: [0x3372], NFKC: [0x0064, 0x0061], NFKD: [0x0064, 0x0061] }, +{ source: [0x3373], NFC: [0x3373], NFD: [0x3373], NFKC: [0x0041, 0x0055], NFKD: [0x0041, 0x0055] }, +{ source: [0x3374], NFC: [0x3374], NFD: [0x3374], NFKC: [0x0062, 0x0061, 0x0072], NFKD: [0x0062, 0x0061, 0x0072] }, +{ source: [0x3375], NFC: [0x3375], NFD: [0x3375], NFKC: [0x006F, 0x0056], NFKD: [0x006F, 0x0056] }, +{ source: [0x3376], NFC: [0x3376], NFD: [0x3376], NFKC: [0x0070, 0x0063], NFKD: [0x0070, 0x0063] }, +{ source: [0x3377], NFC: [0x3377], NFD: [0x3377], NFKC: [0x0064, 0x006D], NFKD: [0x0064, 0x006D] }, +{ source: [0x3378], NFC: [0x3378], NFD: [0x3378], NFKC: [0x0064, 0x006D, 0x0032], NFKD: [0x0064, 0x006D, 0x0032] }, +{ source: [0x3379], NFC: [0x3379], NFD: [0x3379], NFKC: [0x0064, 0x006D, 0x0033], NFKD: [0x0064, 0x006D, 0x0033] }, +{ source: [0x337A], NFC: [0x337A], NFD: [0x337A], NFKC: [0x0049, 0x0055], NFKD: [0x0049, 0x0055] }, +{ source: [0x337B], NFC: [0x337B], NFD: [0x337B], NFKC: [0x5E73, 0x6210], NFKD: [0x5E73, 0x6210] }, +{ source: [0x337C], NFC: [0x337C], NFD: [0x337C], NFKC: [0x662D, 0x548C], NFKD: [0x662D, 0x548C] }, +{ source: [0x337D], NFC: [0x337D], NFD: [0x337D], NFKC: [0x5927, 0x6B63], NFKD: [0x5927, 0x6B63] }, +{ source: [0x337E], NFC: [0x337E], NFD: [0x337E], NFKC: [0x660E, 0x6CBB], NFKD: [0x660E, 0x6CBB] }, +{ source: [0x337F], NFC: [0x337F], NFD: [0x337F], NFKC: [0x682A, 0x5F0F, 0x4F1A, 0x793E], NFKD: [0x682A, 0x5F0F, 0x4F1A, 0x793E] }, +{ source: [0x3380], NFC: [0x3380], NFD: [0x3380], NFKC: [0x0070, 0x0041], NFKD: [0x0070, 0x0041] }, +{ source: [0x3381], NFC: [0x3381], NFD: [0x3381], NFKC: [0x006E, 0x0041], NFKD: [0x006E, 0x0041] }, +{ source: [0x3382], NFC: [0x3382], NFD: [0x3382], NFKC: [0x03BC, 0x0041], NFKD: [0x03BC, 0x0041] }, +{ source: [0x3383], NFC: [0x3383], NFD: [0x3383], NFKC: [0x006D, 0x0041], NFKD: [0x006D, 0x0041] }, +{ source: [0x3384], NFC: [0x3384], NFD: [0x3384], NFKC: [0x006B, 0x0041], NFKD: [0x006B, 0x0041] }, +{ source: [0x3385], NFC: [0x3385], NFD: [0x3385], NFKC: [0x004B, 0x0042], NFKD: [0x004B, 0x0042] }, +{ source: [0x3386], NFC: [0x3386], NFD: [0x3386], NFKC: [0x004D, 0x0042], NFKD: [0x004D, 0x0042] }, +{ source: [0x3387], NFC: [0x3387], NFD: [0x3387], NFKC: [0x0047, 0x0042], NFKD: [0x0047, 0x0042] }, +{ source: [0x3388], NFC: [0x3388], NFD: [0x3388], NFKC: [0x0063, 0x0061, 0x006C], NFKD: [0x0063, 0x0061, 0x006C] }, +{ source: [0x3389], NFC: [0x3389], NFD: [0x3389], NFKC: [0x006B, 0x0063, 0x0061, 0x006C], NFKD: [0x006B, 0x0063, 0x0061, 0x006C] }, +{ source: [0x338A], NFC: [0x338A], NFD: [0x338A], NFKC: [0x0070, 0x0046], NFKD: [0x0070, 0x0046] }, +{ source: [0x338B], NFC: [0x338B], NFD: [0x338B], NFKC: [0x006E, 0x0046], NFKD: [0x006E, 0x0046] }, +{ source: [0x338C], NFC: [0x338C], NFD: [0x338C], NFKC: [0x03BC, 0x0046], NFKD: [0x03BC, 0x0046] }, +{ source: [0x338D], NFC: [0x338D], NFD: [0x338D], NFKC: [0x03BC, 0x0067], NFKD: [0x03BC, 0x0067] }, +{ source: [0x338E], NFC: [0x338E], NFD: [0x338E], NFKC: [0x006D, 0x0067], NFKD: [0x006D, 0x0067] }, +{ source: [0x338F], NFC: [0x338F], NFD: [0x338F], NFKC: [0x006B, 0x0067], NFKD: [0x006B, 0x0067] }, +{ source: [0x3390], NFC: [0x3390], NFD: [0x3390], NFKC: [0x0048, 0x007A], NFKD: [0x0048, 0x007A] }, +{ source: [0x3391], NFC: [0x3391], NFD: [0x3391], NFKC: [0x006B, 0x0048, 0x007A], NFKD: [0x006B, 0x0048, 0x007A] }, +{ source: [0x3392], NFC: [0x3392], NFD: [0x3392], NFKC: [0x004D, 0x0048, 0x007A], NFKD: [0x004D, 0x0048, 0x007A] }, +{ source: [0x3393], NFC: [0x3393], NFD: [0x3393], NFKC: [0x0047, 0x0048, 0x007A], NFKD: [0x0047, 0x0048, 0x007A] }, +{ source: [0x3394], NFC: [0x3394], NFD: [0x3394], NFKC: [0x0054, 0x0048, 0x007A], NFKD: [0x0054, 0x0048, 0x007A] }, +{ source: [0x3395], NFC: [0x3395], NFD: [0x3395], NFKC: [0x03BC, 0x006C], NFKD: [0x03BC, 0x006C] }, +{ source: [0x3396], NFC: [0x3396], NFD: [0x3396], NFKC: [0x006D, 0x006C], NFKD: [0x006D, 0x006C] }, +{ source: [0x3397], NFC: [0x3397], NFD: [0x3397], NFKC: [0x0064, 0x006C], NFKD: [0x0064, 0x006C] }, +{ source: [0x3398], NFC: [0x3398], NFD: [0x3398], NFKC: [0x006B, 0x006C], NFKD: [0x006B, 0x006C] }, +{ source: [0x3399], NFC: [0x3399], NFD: [0x3399], NFKC: [0x0066, 0x006D], NFKD: [0x0066, 0x006D] }, +{ source: [0x339A], NFC: [0x339A], NFD: [0x339A], NFKC: [0x006E, 0x006D], NFKD: [0x006E, 0x006D] }, +{ source: [0x339B], NFC: [0x339B], NFD: [0x339B], NFKC: [0x03BC, 0x006D], NFKD: [0x03BC, 0x006D] }, +{ source: [0x339C], NFC: [0x339C], NFD: [0x339C], NFKC: [0x006D, 0x006D], NFKD: [0x006D, 0x006D] }, +{ source: [0x339D], NFC: [0x339D], NFD: [0x339D], NFKC: [0x0063, 0x006D], NFKD: [0x0063, 0x006D] }, +{ source: [0x339E], NFC: [0x339E], NFD: [0x339E], NFKC: [0x006B, 0x006D], NFKD: [0x006B, 0x006D] }, +{ source: [0x339F], NFC: [0x339F], NFD: [0x339F], NFKC: [0x006D, 0x006D, 0x0032], NFKD: [0x006D, 0x006D, 0x0032] }, +{ source: [0x33A0], NFC: [0x33A0], NFD: [0x33A0], NFKC: [0x0063, 0x006D, 0x0032], NFKD: [0x0063, 0x006D, 0x0032] }, +{ source: [0x33A1], NFC: [0x33A1], NFD: [0x33A1], NFKC: [0x006D, 0x0032], NFKD: [0x006D, 0x0032] }, +{ source: [0x33A2], NFC: [0x33A2], NFD: [0x33A2], NFKC: [0x006B, 0x006D, 0x0032], NFKD: [0x006B, 0x006D, 0x0032] }, +{ source: [0x33A3], NFC: [0x33A3], NFD: [0x33A3], NFKC: [0x006D, 0x006D, 0x0033], NFKD: [0x006D, 0x006D, 0x0033] }, +{ source: [0x33A4], NFC: [0x33A4], NFD: [0x33A4], NFKC: [0x0063, 0x006D, 0x0033], NFKD: [0x0063, 0x006D, 0x0033] }, +{ source: [0x33A5], NFC: [0x33A5], NFD: [0x33A5], NFKC: [0x006D, 0x0033], NFKD: [0x006D, 0x0033] }, +{ source: [0x33A6], NFC: [0x33A6], NFD: [0x33A6], NFKC: [0x006B, 0x006D, 0x0033], NFKD: [0x006B, 0x006D, 0x0033] }, +{ source: [0x33A7], NFC: [0x33A7], NFD: [0x33A7], NFKC: [0x006D, 0x2215, 0x0073], NFKD: [0x006D, 0x2215, 0x0073] }, +{ source: [0x33A8], NFC: [0x33A8], NFD: [0x33A8], NFKC: [0x006D, 0x2215, 0x0073, 0x0032], NFKD: [0x006D, 0x2215, 0x0073, 0x0032] }, +{ source: [0x33A9], NFC: [0x33A9], NFD: [0x33A9], NFKC: [0x0050, 0x0061], NFKD: [0x0050, 0x0061] }, +{ source: [0x33AA], NFC: [0x33AA], NFD: [0x33AA], NFKC: [0x006B, 0x0050, 0x0061], NFKD: [0x006B, 0x0050, 0x0061] }, +{ source: [0x33AB], NFC: [0x33AB], NFD: [0x33AB], NFKC: [0x004D, 0x0050, 0x0061], NFKD: [0x004D, 0x0050, 0x0061] }, +{ source: [0x33AC], NFC: [0x33AC], NFD: [0x33AC], NFKC: [0x0047, 0x0050, 0x0061], NFKD: [0x0047, 0x0050, 0x0061] }, +{ source: [0x33AD], NFC: [0x33AD], NFD: [0x33AD], NFKC: [0x0072, 0x0061, 0x0064], NFKD: [0x0072, 0x0061, 0x0064] }, +{ source: [0x33AE], NFC: [0x33AE], NFD: [0x33AE], NFKC: [0x0072, 0x0061, 0x0064, 0x2215, 0x0073], NFKD: [0x0072, 0x0061, 0x0064, 0x2215, 0x0073] }, +{ source: [0x33AF], NFC: [0x33AF], NFD: [0x33AF], NFKC: [0x0072, 0x0061, 0x0064, 0x2215, 0x0073, 0x0032], NFKD: [0x0072, 0x0061, 0x0064, 0x2215, 0x0073, 0x0032] }, +{ source: [0x33B0], NFC: [0x33B0], NFD: [0x33B0], NFKC: [0x0070, 0x0073], NFKD: [0x0070, 0x0073] }, +{ source: [0x33B1], NFC: [0x33B1], NFD: [0x33B1], NFKC: [0x006E, 0x0073], NFKD: [0x006E, 0x0073] }, +{ source: [0x33B2], NFC: [0x33B2], NFD: [0x33B2], NFKC: [0x03BC, 0x0073], NFKD: [0x03BC, 0x0073] }, +{ source: [0x33B3], NFC: [0x33B3], NFD: [0x33B3], NFKC: [0x006D, 0x0073], NFKD: [0x006D, 0x0073] }, +{ source: [0x33B4], NFC: [0x33B4], NFD: [0x33B4], NFKC: [0x0070, 0x0056], NFKD: [0x0070, 0x0056] }, +{ source: [0x33B5], NFC: [0x33B5], NFD: [0x33B5], NFKC: [0x006E, 0x0056], NFKD: [0x006E, 0x0056] }, +{ source: [0x33B6], NFC: [0x33B6], NFD: [0x33B6], NFKC: [0x03BC, 0x0056], NFKD: [0x03BC, 0x0056] }, +{ source: [0x33B7], NFC: [0x33B7], NFD: [0x33B7], NFKC: [0x006D, 0x0056], NFKD: [0x006D, 0x0056] }, +{ source: [0x33B8], NFC: [0x33B8], NFD: [0x33B8], NFKC: [0x006B, 0x0056], NFKD: [0x006B, 0x0056] }, +{ source: [0x33B9], NFC: [0x33B9], NFD: [0x33B9], NFKC: [0x004D, 0x0056], NFKD: [0x004D, 0x0056] }, +{ source: [0x33BA], NFC: [0x33BA], NFD: [0x33BA], NFKC: [0x0070, 0x0057], NFKD: [0x0070, 0x0057] }, +{ source: [0x33BB], NFC: [0x33BB], NFD: [0x33BB], NFKC: [0x006E, 0x0057], NFKD: [0x006E, 0x0057] }, +{ source: [0x33BC], NFC: [0x33BC], NFD: [0x33BC], NFKC: [0x03BC, 0x0057], NFKD: [0x03BC, 0x0057] }, +{ source: [0x33BD], NFC: [0x33BD], NFD: [0x33BD], NFKC: [0x006D, 0x0057], NFKD: [0x006D, 0x0057] }, +{ source: [0x33BE], NFC: [0x33BE], NFD: [0x33BE], NFKC: [0x006B, 0x0057], NFKD: [0x006B, 0x0057] }, +{ source: [0x33BF], NFC: [0x33BF], NFD: [0x33BF], NFKC: [0x004D, 0x0057], NFKD: [0x004D, 0x0057] }, +{ source: [0x33C0], NFC: [0x33C0], NFD: [0x33C0], NFKC: [0x006B, 0x03A9], NFKD: [0x006B, 0x03A9] }, +{ source: [0x33C1], NFC: [0x33C1], NFD: [0x33C1], NFKC: [0x004D, 0x03A9], NFKD: [0x004D, 0x03A9] }, +{ source: [0x33C2], NFC: [0x33C2], NFD: [0x33C2], NFKC: [0x0061, 0x002E, 0x006D, 0x002E], NFKD: [0x0061, 0x002E, 0x006D, 0x002E] }, +{ source: [0x33C3], NFC: [0x33C3], NFD: [0x33C3], NFKC: [0x0042, 0x0071], NFKD: [0x0042, 0x0071] }, +{ source: [0x33C4], NFC: [0x33C4], NFD: [0x33C4], NFKC: [0x0063, 0x0063], NFKD: [0x0063, 0x0063] }, +{ source: [0x33C5], NFC: [0x33C5], NFD: [0x33C5], NFKC: [0x0063, 0x0064], NFKD: [0x0063, 0x0064] }, +{ source: [0x33C6], NFC: [0x33C6], NFD: [0x33C6], NFKC: [0x0043, 0x2215, 0x006B, 0x0067], NFKD: [0x0043, 0x2215, 0x006B, 0x0067] }, +{ source: [0x33C7], NFC: [0x33C7], NFD: [0x33C7], NFKC: [0x0043, 0x006F, 0x002E], NFKD: [0x0043, 0x006F, 0x002E] }, +{ source: [0x33C8], NFC: [0x33C8], NFD: [0x33C8], NFKC: [0x0064, 0x0042], NFKD: [0x0064, 0x0042] }, +{ source: [0x33C9], NFC: [0x33C9], NFD: [0x33C9], NFKC: [0x0047, 0x0079], NFKD: [0x0047, 0x0079] }, +{ source: [0x33CA], NFC: [0x33CA], NFD: [0x33CA], NFKC: [0x0068, 0x0061], NFKD: [0x0068, 0x0061] }, +{ source: [0x33CB], NFC: [0x33CB], NFD: [0x33CB], NFKC: [0x0048, 0x0050], NFKD: [0x0048, 0x0050] }, +{ source: [0x33CC], NFC: [0x33CC], NFD: [0x33CC], NFKC: [0x0069, 0x006E], NFKD: [0x0069, 0x006E] }, +{ source: [0x33CD], NFC: [0x33CD], NFD: [0x33CD], NFKC: [0x004B, 0x004B], NFKD: [0x004B, 0x004B] }, +{ source: [0x33CE], NFC: [0x33CE], NFD: [0x33CE], NFKC: [0x004B, 0x004D], NFKD: [0x004B, 0x004D] }, +{ source: [0x33CF], NFC: [0x33CF], NFD: [0x33CF], NFKC: [0x006B, 0x0074], NFKD: [0x006B, 0x0074] }, +{ source: [0x33D0], NFC: [0x33D0], NFD: [0x33D0], NFKC: [0x006C, 0x006D], NFKD: [0x006C, 0x006D] }, +{ source: [0x33D1], NFC: [0x33D1], NFD: [0x33D1], NFKC: [0x006C, 0x006E], NFKD: [0x006C, 0x006E] }, +{ source: [0x33D2], NFC: [0x33D2], NFD: [0x33D2], NFKC: [0x006C, 0x006F, 0x0067], NFKD: [0x006C, 0x006F, 0x0067] }, +{ source: [0x33D3], NFC: [0x33D3], NFD: [0x33D3], NFKC: [0x006C, 0x0078], NFKD: [0x006C, 0x0078] }, +{ source: [0x33D4], NFC: [0x33D4], NFD: [0x33D4], NFKC: [0x006D, 0x0062], NFKD: [0x006D, 0x0062] }, +{ source: [0x33D5], NFC: [0x33D5], NFD: [0x33D5], NFKC: [0x006D, 0x0069, 0x006C], NFKD: [0x006D, 0x0069, 0x006C] }, +{ source: [0x33D6], NFC: [0x33D6], NFD: [0x33D6], NFKC: [0x006D, 0x006F, 0x006C], NFKD: [0x006D, 0x006F, 0x006C] }, +{ source: [0x33D7], NFC: [0x33D7], NFD: [0x33D7], NFKC: [0x0050, 0x0048], NFKD: [0x0050, 0x0048] }, +{ source: [0x33D8], NFC: [0x33D8], NFD: [0x33D8], NFKC: [0x0070, 0x002E, 0x006D, 0x002E], NFKD: [0x0070, 0x002E, 0x006D, 0x002E] }, +{ source: [0x33D9], NFC: [0x33D9], NFD: [0x33D9], NFKC: [0x0050, 0x0050, 0x004D], NFKD: [0x0050, 0x0050, 0x004D] }, +{ source: [0x33DA], NFC: [0x33DA], NFD: [0x33DA], NFKC: [0x0050, 0x0052], NFKD: [0x0050, 0x0052] }, +{ source: [0x33DB], NFC: [0x33DB], NFD: [0x33DB], NFKC: [0x0073, 0x0072], NFKD: [0x0073, 0x0072] }, +{ source: [0x33DC], NFC: [0x33DC], NFD: [0x33DC], NFKC: [0x0053, 0x0076], NFKD: [0x0053, 0x0076] }, +{ source: [0x33DD], NFC: [0x33DD], NFD: [0x33DD], NFKC: [0x0057, 0x0062], NFKD: [0x0057, 0x0062] }, +{ source: [0x33DE], NFC: [0x33DE], NFD: [0x33DE], NFKC: [0x0056, 0x2215, 0x006D], NFKD: [0x0056, 0x2215, 0x006D] }, +{ source: [0x33DF], NFC: [0x33DF], NFD: [0x33DF], NFKC: [0x0041, 0x2215, 0x006D], NFKD: [0x0041, 0x2215, 0x006D] }, +{ source: [0x33E0], NFC: [0x33E0], NFD: [0x33E0], NFKC: [0x0031, 0x65E5], NFKD: [0x0031, 0x65E5] }, +{ source: [0x33E1], NFC: [0x33E1], NFD: [0x33E1], NFKC: [0x0032, 0x65E5], NFKD: [0x0032, 0x65E5] }, +{ source: [0x33E2], NFC: [0x33E2], NFD: [0x33E2], NFKC: [0x0033, 0x65E5], NFKD: [0x0033, 0x65E5] }, +{ source: [0x33E3], NFC: [0x33E3], NFD: [0x33E3], NFKC: [0x0034, 0x65E5], NFKD: [0x0034, 0x65E5] }, +{ source: [0x33E4], NFC: [0x33E4], NFD: [0x33E4], NFKC: [0x0035, 0x65E5], NFKD: [0x0035, 0x65E5] }, +{ source: [0x33E5], NFC: [0x33E5], NFD: [0x33E5], NFKC: [0x0036, 0x65E5], NFKD: [0x0036, 0x65E5] }, +{ source: [0x33E6], NFC: [0x33E6], NFD: [0x33E6], NFKC: [0x0037, 0x65E5], NFKD: [0x0037, 0x65E5] }, +{ source: [0x33E7], NFC: [0x33E7], NFD: [0x33E7], NFKC: [0x0038, 0x65E5], NFKD: [0x0038, 0x65E5] }, +{ source: [0x33E8], NFC: [0x33E8], NFD: [0x33E8], NFKC: [0x0039, 0x65E5], NFKD: [0x0039, 0x65E5] }, +{ source: [0x33E9], NFC: [0x33E9], NFD: [0x33E9], NFKC: [0x0031, 0x0030, 0x65E5], NFKD: [0x0031, 0x0030, 0x65E5] }, +{ source: [0x33EA], NFC: [0x33EA], NFD: [0x33EA], NFKC: [0x0031, 0x0031, 0x65E5], NFKD: [0x0031, 0x0031, 0x65E5] }, +{ source: [0x33EB], NFC: [0x33EB], NFD: [0x33EB], NFKC: [0x0031, 0x0032, 0x65E5], NFKD: [0x0031, 0x0032, 0x65E5] }, +{ source: [0x33EC], NFC: [0x33EC], NFD: [0x33EC], NFKC: [0x0031, 0x0033, 0x65E5], NFKD: [0x0031, 0x0033, 0x65E5] }, +{ source: [0x33ED], NFC: [0x33ED], NFD: [0x33ED], NFKC: [0x0031, 0x0034, 0x65E5], NFKD: [0x0031, 0x0034, 0x65E5] }, +{ source: [0x33EE], NFC: [0x33EE], NFD: [0x33EE], NFKC: [0x0031, 0x0035, 0x65E5], NFKD: [0x0031, 0x0035, 0x65E5] }, +{ source: [0x33EF], NFC: [0x33EF], NFD: [0x33EF], NFKC: [0x0031, 0x0036, 0x65E5], NFKD: [0x0031, 0x0036, 0x65E5] }, +{ source: [0x33F0], NFC: [0x33F0], NFD: [0x33F0], NFKC: [0x0031, 0x0037, 0x65E5], NFKD: [0x0031, 0x0037, 0x65E5] }, +{ source: [0x33F1], NFC: [0x33F1], NFD: [0x33F1], NFKC: [0x0031, 0x0038, 0x65E5], NFKD: [0x0031, 0x0038, 0x65E5] }, +{ source: [0x33F2], NFC: [0x33F2], NFD: [0x33F2], NFKC: [0x0031, 0x0039, 0x65E5], NFKD: [0x0031, 0x0039, 0x65E5] }, +{ source: [0x33F3], NFC: [0x33F3], NFD: [0x33F3], NFKC: [0x0032, 0x0030, 0x65E5], NFKD: [0x0032, 0x0030, 0x65E5] }, +{ source: [0x33F4], NFC: [0x33F4], NFD: [0x33F4], NFKC: [0x0032, 0x0031, 0x65E5], NFKD: [0x0032, 0x0031, 0x65E5] }, +{ source: [0x33F5], NFC: [0x33F5], NFD: [0x33F5], NFKC: [0x0032, 0x0032, 0x65E5], NFKD: [0x0032, 0x0032, 0x65E5] }, +{ source: [0x33F6], NFC: [0x33F6], NFD: [0x33F6], NFKC: [0x0032, 0x0033, 0x65E5], NFKD: [0x0032, 0x0033, 0x65E5] }, +{ source: [0x33F7], NFC: [0x33F7], NFD: [0x33F7], NFKC: [0x0032, 0x0034, 0x65E5], NFKD: [0x0032, 0x0034, 0x65E5] }, +{ source: [0x33F8], NFC: [0x33F8], NFD: [0x33F8], NFKC: [0x0032, 0x0035, 0x65E5], NFKD: [0x0032, 0x0035, 0x65E5] }, +{ source: [0x33F9], NFC: [0x33F9], NFD: [0x33F9], NFKC: [0x0032, 0x0036, 0x65E5], NFKD: [0x0032, 0x0036, 0x65E5] }, +{ source: [0x33FA], NFC: [0x33FA], NFD: [0x33FA], NFKC: [0x0032, 0x0037, 0x65E5], NFKD: [0x0032, 0x0037, 0x65E5] }, +{ source: [0x33FB], NFC: [0x33FB], NFD: [0x33FB], NFKC: [0x0032, 0x0038, 0x65E5], NFKD: [0x0032, 0x0038, 0x65E5] }, +{ source: [0x33FC], NFC: [0x33FC], NFD: [0x33FC], NFKC: [0x0032, 0x0039, 0x65E5], NFKD: [0x0032, 0x0039, 0x65E5] }, +{ source: [0x33FD], NFC: [0x33FD], NFD: [0x33FD], NFKC: [0x0033, 0x0030, 0x65E5], NFKD: [0x0033, 0x0030, 0x65E5] }, +{ source: [0x33FE], NFC: [0x33FE], NFD: [0x33FE], NFKC: [0x0033, 0x0031, 0x65E5], NFKD: [0x0033, 0x0031, 0x65E5] }, +{ source: [0x33FF], NFC: [0x33FF], NFD: [0x33FF], NFKC: [0x0067, 0x0061, 0x006C], NFKD: [0x0067, 0x0061, 0x006C] }, +{ source: [0xA69C], NFC: [0xA69C], NFD: [0xA69C], NFKC: [0x044A], NFKD: [0x044A] }, +{ source: [0xA69D], NFC: [0xA69D], NFD: [0xA69D], NFKC: [0x044C], NFKD: [0x044C] }, +{ source: [0xA770], NFC: [0xA770], NFD: [0xA770], NFKC: [0xA76F], NFKD: [0xA76F] }, +{ source: [0xA7F2], NFC: [0xA7F2], NFD: [0xA7F2], NFKC: [0x0043], NFKD: [0x0043] }, +{ source: [0xA7F3], NFC: [0xA7F3], NFD: [0xA7F3], NFKC: [0x0046], NFKD: [0x0046] }, +{ source: [0xA7F4], NFC: [0xA7F4], NFD: [0xA7F4], NFKC: [0x0051], NFKD: [0x0051] }, +{ source: [0xA7F8], NFC: [0xA7F8], NFD: [0xA7F8], NFKC: [0x0126], NFKD: [0x0126] }, +{ source: [0xA7F9], NFC: [0xA7F9], NFD: [0xA7F9], NFKC: [0x0153], NFKD: [0x0153] }, +{ source: [0xAB5C], NFC: [0xAB5C], NFD: [0xAB5C], NFKC: [0xA727], NFKD: [0xA727] }, +{ source: [0xAB5D], NFC: [0xAB5D], NFD: [0xAB5D], NFKC: [0xAB37], NFKD: [0xAB37] }, +{ source: [0xAB5E], NFC: [0xAB5E], NFD: [0xAB5E], NFKC: [0x026B], NFKD: [0x026B] }, +{ source: [0xAB5F], NFC: [0xAB5F], NFD: [0xAB5F], NFKC: [0xAB52], NFKD: [0xAB52] }, +{ source: [0xAB69], NFC: [0xAB69], NFD: [0xAB69], NFKC: [0x028D], NFKD: [0x028D] }, +{ source: [0xAC00], NFC: [0xAC00], NFD: [0x1100, 0x1161], NFKC: [0xAC00], NFKD: [0x1100, 0x1161] }, +{ source: [0xAC01], NFC: [0xAC01], NFD: [0x1100, 0x1161, 0x11A8], NFKC: [0xAC01], NFKD: [0x1100, 0x1161, 0x11A8] }, +{ source: [0xAC02], NFC: [0xAC02], NFD: [0x1100, 0x1161, 0x11A9], NFKC: [0xAC02], NFKD: [0x1100, 0x1161, 0x11A9] }, +{ source: [0xAC03], NFC: [0xAC03], NFD: [0x1100, 0x1161, 0x11AA], NFKC: [0xAC03], NFKD: [0x1100, 0x1161, 0x11AA] }, +{ source: [0xAC04], NFC: [0xAC04], NFD: [0x1100, 0x1161, 0x11AB], NFKC: [0xAC04], NFKD: [0x1100, 0x1161, 0x11AB] }, +{ source: [0xAC05], NFC: [0xAC05], NFD: [0x1100, 0x1161, 0x11AC], NFKC: [0xAC05], NFKD: [0x1100, 0x1161, 0x11AC] }, +{ source: [0xAC06], NFC: [0xAC06], NFD: [0x1100, 0x1161, 0x11AD], NFKC: [0xAC06], NFKD: [0x1100, 0x1161, 0x11AD] }, +{ source: [0xAC07], NFC: [0xAC07], NFD: [0x1100, 0x1161, 0x11AE], NFKC: [0xAC07], NFKD: [0x1100, 0x1161, 0x11AE] }, +{ source: [0xAC08], NFC: [0xAC08], NFD: [0x1100, 0x1161, 0x11AF], NFKC: [0xAC08], NFKD: [0x1100, 0x1161, 0x11AF] }, +{ source: [0xAC09], NFC: [0xAC09], NFD: [0x1100, 0x1161, 0x11B0], NFKC: [0xAC09], NFKD: [0x1100, 0x1161, 0x11B0] }, +{ source: [0xAC0A], NFC: [0xAC0A], NFD: [0x1100, 0x1161, 0x11B1], NFKC: [0xAC0A], NFKD: [0x1100, 0x1161, 0x11B1] }, +{ source: [0xAC0B], NFC: [0xAC0B], NFD: [0x1100, 0x1161, 0x11B2], NFKC: [0xAC0B], NFKD: [0x1100, 0x1161, 0x11B2] }, +{ source: [0xAC0C], NFC: [0xAC0C], NFD: [0x1100, 0x1161, 0x11B3], NFKC: [0xAC0C], NFKD: [0x1100, 0x1161, 0x11B3] }, +{ source: [0xAC0D], NFC: [0xAC0D], NFD: [0x1100, 0x1161, 0x11B4], NFKC: [0xAC0D], NFKD: [0x1100, 0x1161, 0x11B4] }, +{ source: [0xAC0E], NFC: [0xAC0E], NFD: [0x1100, 0x1161, 0x11B5], NFKC: [0xAC0E], NFKD: [0x1100, 0x1161, 0x11B5] }, +{ source: [0xAC0F], NFC: [0xAC0F], NFD: [0x1100, 0x1161, 0x11B6], NFKC: [0xAC0F], NFKD: [0x1100, 0x1161, 0x11B6] }, +{ source: [0xAC10], NFC: [0xAC10], NFD: [0x1100, 0x1161, 0x11B7], NFKC: [0xAC10], NFKD: [0x1100, 0x1161, 0x11B7] }, +{ source: [0xAC11], NFC: [0xAC11], NFD: [0x1100, 0x1161, 0x11B8], NFKC: [0xAC11], NFKD: [0x1100, 0x1161, 0x11B8] }, +{ source: [0xAC12], NFC: [0xAC12], NFD: [0x1100, 0x1161, 0x11B9], NFKC: [0xAC12], NFKD: [0x1100, 0x1161, 0x11B9] }, +{ source: [0xAC13], NFC: [0xAC13], NFD: [0x1100, 0x1161, 0x11BA], NFKC: [0xAC13], NFKD: [0x1100, 0x1161, 0x11BA] }, +{ source: [0xAC14], NFC: [0xAC14], NFD: [0x1100, 0x1161, 0x11BB], NFKC: [0xAC14], NFKD: [0x1100, 0x1161, 0x11BB] }, +{ source: [0xAC15], NFC: [0xAC15], NFD: [0x1100, 0x1161, 0x11BC], NFKC: [0xAC15], NFKD: [0x1100, 0x1161, 0x11BC] }, +{ source: [0xAC16], NFC: [0xAC16], NFD: [0x1100, 0x1161, 0x11BD], NFKC: [0xAC16], NFKD: [0x1100, 0x1161, 0x11BD] }, +{ source: [0xAC17], NFC: [0xAC17], NFD: [0x1100, 0x1161, 0x11BE], NFKC: [0xAC17], NFKD: [0x1100, 0x1161, 0x11BE] }, +{ source: [0xAC18], NFC: [0xAC18], NFD: [0x1100, 0x1161, 0x11BF], NFKC: [0xAC18], NFKD: [0x1100, 0x1161, 0x11BF] }, +{ source: [0xAC19], NFC: [0xAC19], NFD: [0x1100, 0x1161, 0x11C0], NFKC: [0xAC19], NFKD: [0x1100, 0x1161, 0x11C0] }, +{ source: [0xAC1A], NFC: [0xAC1A], NFD: [0x1100, 0x1161, 0x11C1], NFKC: [0xAC1A], NFKD: [0x1100, 0x1161, 0x11C1] }, +{ source: [0xAC1B], NFC: [0xAC1B], NFD: [0x1100, 0x1161, 0x11C2], NFKC: [0xAC1B], NFKD: [0x1100, 0x1161, 0x11C2] }, +{ source: [0xAC1C], NFC: [0xAC1C], NFD: [0x1100, 0x1162], NFKC: [0xAC1C], NFKD: [0x1100, 0x1162] }, +{ source: [0xAC1D], NFC: [0xAC1D], NFD: [0x1100, 0x1162, 0x11A8], NFKC: [0xAC1D], NFKD: [0x1100, 0x1162, 0x11A8] }, +{ source: [0xAC1E], NFC: [0xAC1E], NFD: [0x1100, 0x1162, 0x11A9], NFKC: [0xAC1E], NFKD: [0x1100, 0x1162, 0x11A9] }, +{ source: [0xAC1F], NFC: [0xAC1F], NFD: [0x1100, 0x1162, 0x11AA], NFKC: [0xAC1F], NFKD: [0x1100, 0x1162, 0x11AA] }, +{ source: [0xAC20], NFC: [0xAC20], NFD: [0x1100, 0x1162, 0x11AB], NFKC: [0xAC20], NFKD: [0x1100, 0x1162, 0x11AB] }, +{ source: [0xAC21], NFC: [0xAC21], NFD: [0x1100, 0x1162, 0x11AC], NFKC: [0xAC21], NFKD: [0x1100, 0x1162, 0x11AC] }, +{ source: [0xAC22], NFC: [0xAC22], NFD: [0x1100, 0x1162, 0x11AD], NFKC: [0xAC22], NFKD: [0x1100, 0x1162, 0x11AD] }, +{ source: [0xAC23], NFC: [0xAC23], NFD: [0x1100, 0x1162, 0x11AE], NFKC: [0xAC23], NFKD: [0x1100, 0x1162, 0x11AE] }, +{ source: [0xAC24], NFC: [0xAC24], NFD: [0x1100, 0x1162, 0x11AF], NFKC: [0xAC24], NFKD: [0x1100, 0x1162, 0x11AF] }, +{ source: [0xAC25], NFC: [0xAC25], NFD: [0x1100, 0x1162, 0x11B0], NFKC: [0xAC25], NFKD: [0x1100, 0x1162, 0x11B0] }, +{ source: [0xAC26], NFC: [0xAC26], NFD: [0x1100, 0x1162, 0x11B1], NFKC: [0xAC26], NFKD: [0x1100, 0x1162, 0x11B1] }, +{ source: [0xAC27], NFC: [0xAC27], NFD: [0x1100, 0x1162, 0x11B2], NFKC: [0xAC27], NFKD: [0x1100, 0x1162, 0x11B2] }, +{ source: [0xAC28], NFC: [0xAC28], NFD: [0x1100, 0x1162, 0x11B3], NFKC: [0xAC28], NFKD: [0x1100, 0x1162, 0x11B3] }, +{ source: [0xAC29], NFC: [0xAC29], NFD: [0x1100, 0x1162, 0x11B4], NFKC: [0xAC29], NFKD: [0x1100, 0x1162, 0x11B4] }, +{ source: [0xAC2A], NFC: [0xAC2A], NFD: [0x1100, 0x1162, 0x11B5], NFKC: [0xAC2A], NFKD: [0x1100, 0x1162, 0x11B5] }, +{ source: [0xAC2B], NFC: [0xAC2B], NFD: [0x1100, 0x1162, 0x11B6], NFKC: [0xAC2B], NFKD: [0x1100, 0x1162, 0x11B6] }, +{ source: [0xAC2C], NFC: [0xAC2C], NFD: [0x1100, 0x1162, 0x11B7], NFKC: [0xAC2C], NFKD: [0x1100, 0x1162, 0x11B7] }, +{ source: [0xAC2D], NFC: [0xAC2D], NFD: [0x1100, 0x1162, 0x11B8], NFKC: [0xAC2D], NFKD: [0x1100, 0x1162, 0x11B8] }, +{ source: [0xAC2E], NFC: [0xAC2E], NFD: [0x1100, 0x1162, 0x11B9], NFKC: [0xAC2E], NFKD: [0x1100, 0x1162, 0x11B9] }, +{ source: [0xAC2F], NFC: [0xAC2F], NFD: [0x1100, 0x1162, 0x11BA], NFKC: [0xAC2F], NFKD: [0x1100, 0x1162, 0x11BA] }, +{ source: [0xAC30], NFC: [0xAC30], NFD: [0x1100, 0x1162, 0x11BB], NFKC: [0xAC30], NFKD: [0x1100, 0x1162, 0x11BB] }, +{ source: [0xAC31], NFC: [0xAC31], NFD: [0x1100, 0x1162, 0x11BC], NFKC: [0xAC31], NFKD: [0x1100, 0x1162, 0x11BC] }, +{ source: [0xAC32], NFC: [0xAC32], NFD: [0x1100, 0x1162, 0x11BD], NFKC: [0xAC32], NFKD: [0x1100, 0x1162, 0x11BD] }, +{ source: [0xAC33], NFC: [0xAC33], NFD: [0x1100, 0x1162, 0x11BE], NFKC: [0xAC33], NFKD: [0x1100, 0x1162, 0x11BE] }, +{ source: [0xAC34], NFC: [0xAC34], NFD: [0x1100, 0x1162, 0x11BF], NFKC: [0xAC34], NFKD: [0x1100, 0x1162, 0x11BF] }, +{ source: [0xAC35], NFC: [0xAC35], NFD: [0x1100, 0x1162, 0x11C0], NFKC: [0xAC35], NFKD: [0x1100, 0x1162, 0x11C0] }, +{ source: [0xAC36], NFC: [0xAC36], NFD: [0x1100, 0x1162, 0x11C1], NFKC: [0xAC36], NFKD: [0x1100, 0x1162, 0x11C1] }, +{ source: [0xAC37], NFC: [0xAC37], NFD: [0x1100, 0x1162, 0x11C2], NFKC: [0xAC37], NFKD: [0x1100, 0x1162, 0x11C2] }, +{ source: [0xAC38], NFC: [0xAC38], NFD: [0x1100, 0x1163], NFKC: [0xAC38], NFKD: [0x1100, 0x1163] }, +{ source: [0xAC39], NFC: [0xAC39], NFD: [0x1100, 0x1163, 0x11A8], NFKC: [0xAC39], NFKD: [0x1100, 0x1163, 0x11A8] }, +{ source: [0xAC3A], NFC: [0xAC3A], NFD: [0x1100, 0x1163, 0x11A9], NFKC: [0xAC3A], NFKD: [0x1100, 0x1163, 0x11A9] }, +{ source: [0xAC3B], NFC: [0xAC3B], NFD: [0x1100, 0x1163, 0x11AA], NFKC: [0xAC3B], NFKD: [0x1100, 0x1163, 0x11AA] }, +{ source: [0xAC3C], NFC: [0xAC3C], NFD: [0x1100, 0x1163, 0x11AB], NFKC: [0xAC3C], NFKD: [0x1100, 0x1163, 0x11AB] }, +{ source: [0xAC3D], NFC: [0xAC3D], NFD: [0x1100, 0x1163, 0x11AC], NFKC: [0xAC3D], NFKD: [0x1100, 0x1163, 0x11AC] }, +{ source: [0xAC3E], NFC: [0xAC3E], NFD: [0x1100, 0x1163, 0x11AD], NFKC: [0xAC3E], NFKD: [0x1100, 0x1163, 0x11AD] }, +{ source: [0xAC3F], NFC: [0xAC3F], NFD: [0x1100, 0x1163, 0x11AE], NFKC: [0xAC3F], NFKD: [0x1100, 0x1163, 0x11AE] }, +{ source: [0xAC40], NFC: [0xAC40], NFD: [0x1100, 0x1163, 0x11AF], NFKC: [0xAC40], NFKD: [0x1100, 0x1163, 0x11AF] }, +{ source: [0xAC41], NFC: [0xAC41], NFD: [0x1100, 0x1163, 0x11B0], NFKC: [0xAC41], NFKD: [0x1100, 0x1163, 0x11B0] }, +{ source: [0xAC42], NFC: [0xAC42], NFD: [0x1100, 0x1163, 0x11B1], NFKC: [0xAC42], NFKD: [0x1100, 0x1163, 0x11B1] }, +{ source: [0xAC43], NFC: [0xAC43], NFD: [0x1100, 0x1163, 0x11B2], NFKC: [0xAC43], NFKD: [0x1100, 0x1163, 0x11B2] }, +{ source: [0xAC44], NFC: [0xAC44], NFD: [0x1100, 0x1163, 0x11B3], NFKC: [0xAC44], NFKD: [0x1100, 0x1163, 0x11B3] }, +{ source: [0xAC45], NFC: [0xAC45], NFD: [0x1100, 0x1163, 0x11B4], NFKC: [0xAC45], NFKD: [0x1100, 0x1163, 0x11B4] }, +{ source: [0xAC46], NFC: [0xAC46], NFD: [0x1100, 0x1163, 0x11B5], NFKC: [0xAC46], NFKD: [0x1100, 0x1163, 0x11B5] }, +{ source: [0xAC47], NFC: [0xAC47], NFD: [0x1100, 0x1163, 0x11B6], NFKC: [0xAC47], NFKD: [0x1100, 0x1163, 0x11B6] }, +{ source: [0xAC48], NFC: [0xAC48], NFD: [0x1100, 0x1163, 0x11B7], NFKC: [0xAC48], NFKD: [0x1100, 0x1163, 0x11B7] }, +{ source: [0xAC49], NFC: [0xAC49], NFD: [0x1100, 0x1163, 0x11B8], NFKC: [0xAC49], NFKD: [0x1100, 0x1163, 0x11B8] }, +{ source: [0xAC4A], NFC: [0xAC4A], NFD: [0x1100, 0x1163, 0x11B9], NFKC: [0xAC4A], NFKD: [0x1100, 0x1163, 0x11B9] }, +{ source: [0xAC4B], NFC: [0xAC4B], NFD: [0x1100, 0x1163, 0x11BA], NFKC: [0xAC4B], NFKD: [0x1100, 0x1163, 0x11BA] }, +{ source: [0xAC4C], NFC: [0xAC4C], NFD: [0x1100, 0x1163, 0x11BB], NFKC: [0xAC4C], NFKD: [0x1100, 0x1163, 0x11BB] }, +{ source: [0xAC4D], NFC: [0xAC4D], NFD: [0x1100, 0x1163, 0x11BC], NFKC: [0xAC4D], NFKD: [0x1100, 0x1163, 0x11BC] }, +{ source: [0xAC4E], NFC: [0xAC4E], NFD: [0x1100, 0x1163, 0x11BD], NFKC: [0xAC4E], NFKD: [0x1100, 0x1163, 0x11BD] }, +{ source: [0xAC4F], NFC: [0xAC4F], NFD: [0x1100, 0x1163, 0x11BE], NFKC: [0xAC4F], NFKD: [0x1100, 0x1163, 0x11BE] }, +{ source: [0xAC50], NFC: [0xAC50], NFD: [0x1100, 0x1163, 0x11BF], NFKC: [0xAC50], NFKD: [0x1100, 0x1163, 0x11BF] }, +{ source: [0xAC51], NFC: [0xAC51], NFD: [0x1100, 0x1163, 0x11C0], NFKC: [0xAC51], NFKD: [0x1100, 0x1163, 0x11C0] }, +{ source: [0xAC52], NFC: [0xAC52], NFD: [0x1100, 0x1163, 0x11C1], NFKC: [0xAC52], NFKD: [0x1100, 0x1163, 0x11C1] }, +{ source: [0xAC53], NFC: [0xAC53], NFD: [0x1100, 0x1163, 0x11C2], NFKC: [0xAC53], NFKD: [0x1100, 0x1163, 0x11C2] }, +{ source: [0xAC54], NFC: [0xAC54], NFD: [0x1100, 0x1164], NFKC: [0xAC54], NFKD: [0x1100, 0x1164] }, +{ source: [0xAC55], NFC: [0xAC55], NFD: [0x1100, 0x1164, 0x11A8], NFKC: [0xAC55], NFKD: [0x1100, 0x1164, 0x11A8] }, +{ source: [0xAC56], NFC: [0xAC56], NFD: [0x1100, 0x1164, 0x11A9], NFKC: [0xAC56], NFKD: [0x1100, 0x1164, 0x11A9] }, +{ source: [0xAC57], NFC: [0xAC57], NFD: [0x1100, 0x1164, 0x11AA], NFKC: [0xAC57], NFKD: [0x1100, 0x1164, 0x11AA] }, +{ source: [0xAC58], NFC: [0xAC58], NFD: [0x1100, 0x1164, 0x11AB], NFKC: [0xAC58], NFKD: [0x1100, 0x1164, 0x11AB] }, +{ source: [0xAC59], NFC: [0xAC59], NFD: [0x1100, 0x1164, 0x11AC], NFKC: [0xAC59], NFKD: [0x1100, 0x1164, 0x11AC] }, +{ source: [0xAC5A], NFC: [0xAC5A], NFD: [0x1100, 0x1164, 0x11AD], NFKC: [0xAC5A], NFKD: [0x1100, 0x1164, 0x11AD] }, +{ source: [0xAC5B], NFC: [0xAC5B], NFD: [0x1100, 0x1164, 0x11AE], NFKC: [0xAC5B], NFKD: [0x1100, 0x1164, 0x11AE] }, +{ source: [0xAC5C], NFC: [0xAC5C], NFD: [0x1100, 0x1164, 0x11AF], NFKC: [0xAC5C], NFKD: [0x1100, 0x1164, 0x11AF] }, +{ source: [0xAC5D], NFC: [0xAC5D], NFD: [0x1100, 0x1164, 0x11B0], NFKC: [0xAC5D], NFKD: [0x1100, 0x1164, 0x11B0] }, +{ source: [0xAC5E], NFC: [0xAC5E], NFD: [0x1100, 0x1164, 0x11B1], NFKC: [0xAC5E], NFKD: [0x1100, 0x1164, 0x11B1] }, +{ source: [0xAC5F], NFC: [0xAC5F], NFD: [0x1100, 0x1164, 0x11B2], NFKC: [0xAC5F], NFKD: [0x1100, 0x1164, 0x11B2] }, +{ source: [0xAC60], NFC: [0xAC60], NFD: [0x1100, 0x1164, 0x11B3], NFKC: [0xAC60], NFKD: [0x1100, 0x1164, 0x11B3] }, +{ source: [0xAC61], NFC: [0xAC61], NFD: [0x1100, 0x1164, 0x11B4], NFKC: [0xAC61], NFKD: [0x1100, 0x1164, 0x11B4] }, +{ source: [0xAC62], NFC: [0xAC62], NFD: [0x1100, 0x1164, 0x11B5], NFKC: [0xAC62], NFKD: [0x1100, 0x1164, 0x11B5] }, +{ source: [0xAC63], NFC: [0xAC63], NFD: [0x1100, 0x1164, 0x11B6], NFKC: [0xAC63], NFKD: [0x1100, 0x1164, 0x11B6] }, +{ source: [0xAC64], NFC: [0xAC64], NFD: [0x1100, 0x1164, 0x11B7], NFKC: [0xAC64], NFKD: [0x1100, 0x1164, 0x11B7] }, +{ source: [0xAC65], NFC: [0xAC65], NFD: [0x1100, 0x1164, 0x11B8], NFKC: [0xAC65], NFKD: [0x1100, 0x1164, 0x11B8] }, +{ source: [0xAC66], NFC: [0xAC66], NFD: [0x1100, 0x1164, 0x11B9], NFKC: [0xAC66], NFKD: [0x1100, 0x1164, 0x11B9] }, +{ source: [0xAC67], NFC: [0xAC67], NFD: [0x1100, 0x1164, 0x11BA], NFKC: [0xAC67], NFKD: [0x1100, 0x1164, 0x11BA] }, +{ source: [0xAC68], NFC: [0xAC68], NFD: [0x1100, 0x1164, 0x11BB], NFKC: [0xAC68], NFKD: [0x1100, 0x1164, 0x11BB] }, +{ source: [0xAC69], NFC: [0xAC69], NFD: [0x1100, 0x1164, 0x11BC], NFKC: [0xAC69], NFKD: [0x1100, 0x1164, 0x11BC] }, +{ source: [0xAC6A], NFC: [0xAC6A], NFD: [0x1100, 0x1164, 0x11BD], NFKC: [0xAC6A], NFKD: [0x1100, 0x1164, 0x11BD] }, +{ source: [0xAC6B], NFC: [0xAC6B], NFD: [0x1100, 0x1164, 0x11BE], NFKC: [0xAC6B], NFKD: [0x1100, 0x1164, 0x11BE] }, +{ source: [0xAC6C], NFC: [0xAC6C], NFD: [0x1100, 0x1164, 0x11BF], NFKC: [0xAC6C], NFKD: [0x1100, 0x1164, 0x11BF] }, +{ source: [0xAC6D], NFC: [0xAC6D], NFD: [0x1100, 0x1164, 0x11C0], NFKC: [0xAC6D], NFKD: [0x1100, 0x1164, 0x11C0] }, +{ source: [0xAC6E], NFC: [0xAC6E], NFD: [0x1100, 0x1164, 0x11C1], NFKC: [0xAC6E], NFKD: [0x1100, 0x1164, 0x11C1] }, +{ source: [0xAC6F], NFC: [0xAC6F], NFD: [0x1100, 0x1164, 0x11C2], NFKC: [0xAC6F], NFKD: [0x1100, 0x1164, 0x11C2] }, +{ source: [0xAC70], NFC: [0xAC70], NFD: [0x1100, 0x1165], NFKC: [0xAC70], NFKD: [0x1100, 0x1165] }, +{ source: [0xAC71], NFC: [0xAC71], NFD: [0x1100, 0x1165, 0x11A8], NFKC: [0xAC71], NFKD: [0x1100, 0x1165, 0x11A8] }, +{ source: [0xAC72], NFC: [0xAC72], NFD: [0x1100, 0x1165, 0x11A9], NFKC: [0xAC72], NFKD: [0x1100, 0x1165, 0x11A9] }, +{ source: [0xAC73], NFC: [0xAC73], NFD: [0x1100, 0x1165, 0x11AA], NFKC: [0xAC73], NFKD: [0x1100, 0x1165, 0x11AA] }, +{ source: [0xAC74], NFC: [0xAC74], NFD: [0x1100, 0x1165, 0x11AB], NFKC: [0xAC74], NFKD: [0x1100, 0x1165, 0x11AB] }, +{ source: [0xAC75], NFC: [0xAC75], NFD: [0x1100, 0x1165, 0x11AC], NFKC: [0xAC75], NFKD: [0x1100, 0x1165, 0x11AC] }, +{ source: [0xAC76], NFC: [0xAC76], NFD: [0x1100, 0x1165, 0x11AD], NFKC: [0xAC76], NFKD: [0x1100, 0x1165, 0x11AD] }, +{ source: [0xAC77], NFC: [0xAC77], NFD: [0x1100, 0x1165, 0x11AE], NFKC: [0xAC77], NFKD: [0x1100, 0x1165, 0x11AE] }, +{ source: [0xAC78], NFC: [0xAC78], NFD: [0x1100, 0x1165, 0x11AF], NFKC: [0xAC78], NFKD: [0x1100, 0x1165, 0x11AF] }, +{ source: [0xAC79], NFC: [0xAC79], NFD: [0x1100, 0x1165, 0x11B0], NFKC: [0xAC79], NFKD: [0x1100, 0x1165, 0x11B0] }, +{ source: [0xAC7A], NFC: [0xAC7A], NFD: [0x1100, 0x1165, 0x11B1], NFKC: [0xAC7A], NFKD: [0x1100, 0x1165, 0x11B1] }, +{ source: [0xAC7B], NFC: [0xAC7B], NFD: [0x1100, 0x1165, 0x11B2], NFKC: [0xAC7B], NFKD: [0x1100, 0x1165, 0x11B2] }, +{ source: [0xAC7C], NFC: [0xAC7C], NFD: [0x1100, 0x1165, 0x11B3], NFKC: [0xAC7C], NFKD: [0x1100, 0x1165, 0x11B3] }, +{ source: [0xAC7D], NFC: [0xAC7D], NFD: [0x1100, 0x1165, 0x11B4], NFKC: [0xAC7D], NFKD: [0x1100, 0x1165, 0x11B4] }, +{ source: [0xAC7E], NFC: [0xAC7E], NFD: [0x1100, 0x1165, 0x11B5], NFKC: [0xAC7E], NFKD: [0x1100, 0x1165, 0x11B5] }, +{ source: [0xAC7F], NFC: [0xAC7F], NFD: [0x1100, 0x1165, 0x11B6], NFKC: [0xAC7F], NFKD: [0x1100, 0x1165, 0x11B6] }, +{ source: [0xAC80], NFC: [0xAC80], NFD: [0x1100, 0x1165, 0x11B7], NFKC: [0xAC80], NFKD: [0x1100, 0x1165, 0x11B7] }, +{ source: [0xAC81], NFC: [0xAC81], NFD: [0x1100, 0x1165, 0x11B8], NFKC: [0xAC81], NFKD: [0x1100, 0x1165, 0x11B8] }, +{ source: [0xAC82], NFC: [0xAC82], NFD: [0x1100, 0x1165, 0x11B9], NFKC: [0xAC82], NFKD: [0x1100, 0x1165, 0x11B9] }, +{ source: [0xAC83], NFC: [0xAC83], NFD: [0x1100, 0x1165, 0x11BA], NFKC: [0xAC83], NFKD: [0x1100, 0x1165, 0x11BA] }, +{ source: [0xAC84], NFC: [0xAC84], NFD: [0x1100, 0x1165, 0x11BB], NFKC: [0xAC84], NFKD: [0x1100, 0x1165, 0x11BB] }, +{ source: [0xAC85], NFC: [0xAC85], NFD: [0x1100, 0x1165, 0x11BC], NFKC: [0xAC85], NFKD: [0x1100, 0x1165, 0x11BC] }, +{ source: [0xAC86], NFC: [0xAC86], NFD: [0x1100, 0x1165, 0x11BD], NFKC: [0xAC86], NFKD: [0x1100, 0x1165, 0x11BD] }, +{ source: [0xAC87], NFC: [0xAC87], NFD: [0x1100, 0x1165, 0x11BE], NFKC: [0xAC87], NFKD: [0x1100, 0x1165, 0x11BE] }, +{ source: [0xAC88], NFC: [0xAC88], NFD: [0x1100, 0x1165, 0x11BF], NFKC: [0xAC88], NFKD: [0x1100, 0x1165, 0x11BF] }, +{ source: [0xAC89], NFC: [0xAC89], NFD: [0x1100, 0x1165, 0x11C0], NFKC: [0xAC89], NFKD: [0x1100, 0x1165, 0x11C0] }, +{ source: [0xAC8A], NFC: [0xAC8A], NFD: [0x1100, 0x1165, 0x11C1], NFKC: [0xAC8A], NFKD: [0x1100, 0x1165, 0x11C1] }, +{ source: [0xAC8B], NFC: [0xAC8B], NFD: [0x1100, 0x1165, 0x11C2], NFKC: [0xAC8B], NFKD: [0x1100, 0x1165, 0x11C2] }, +{ source: [0xAC8C], NFC: [0xAC8C], NFD: [0x1100, 0x1166], NFKC: [0xAC8C], NFKD: [0x1100, 0x1166] }, +{ source: [0xAC8D], NFC: [0xAC8D], NFD: [0x1100, 0x1166, 0x11A8], NFKC: [0xAC8D], NFKD: [0x1100, 0x1166, 0x11A8] }, +{ source: [0xAC8E], NFC: [0xAC8E], NFD: [0x1100, 0x1166, 0x11A9], NFKC: [0xAC8E], NFKD: [0x1100, 0x1166, 0x11A9] }, +{ source: [0xAC8F], NFC: [0xAC8F], NFD: [0x1100, 0x1166, 0x11AA], NFKC: [0xAC8F], NFKD: [0x1100, 0x1166, 0x11AA] }, +{ source: [0xAC90], NFC: [0xAC90], NFD: [0x1100, 0x1166, 0x11AB], NFKC: [0xAC90], NFKD: [0x1100, 0x1166, 0x11AB] }, +{ source: [0xAC91], NFC: [0xAC91], NFD: [0x1100, 0x1166, 0x11AC], NFKC: [0xAC91], NFKD: [0x1100, 0x1166, 0x11AC] }, +{ source: [0xAC92], NFC: [0xAC92], NFD: [0x1100, 0x1166, 0x11AD], NFKC: [0xAC92], NFKD: [0x1100, 0x1166, 0x11AD] }, +{ source: [0xAC93], NFC: [0xAC93], NFD: [0x1100, 0x1166, 0x11AE], NFKC: [0xAC93], NFKD: [0x1100, 0x1166, 0x11AE] }, +{ source: [0xAC94], NFC: [0xAC94], NFD: [0x1100, 0x1166, 0x11AF], NFKC: [0xAC94], NFKD: [0x1100, 0x1166, 0x11AF] }, +{ source: [0xAC95], NFC: [0xAC95], NFD: [0x1100, 0x1166, 0x11B0], NFKC: [0xAC95], NFKD: [0x1100, 0x1166, 0x11B0] }, +{ source: [0xAC96], NFC: [0xAC96], NFD: [0x1100, 0x1166, 0x11B1], NFKC: [0xAC96], NFKD: [0x1100, 0x1166, 0x11B1] }, +{ source: [0xAC97], NFC: [0xAC97], NFD: [0x1100, 0x1166, 0x11B2], NFKC: [0xAC97], NFKD: [0x1100, 0x1166, 0x11B2] }, +{ source: [0xAC98], NFC: [0xAC98], NFD: [0x1100, 0x1166, 0x11B3], NFKC: [0xAC98], NFKD: [0x1100, 0x1166, 0x11B3] }, +{ source: [0xAC99], NFC: [0xAC99], NFD: [0x1100, 0x1166, 0x11B4], NFKC: [0xAC99], NFKD: [0x1100, 0x1166, 0x11B4] }, +{ source: [0xAC9A], NFC: [0xAC9A], NFD: [0x1100, 0x1166, 0x11B5], NFKC: [0xAC9A], NFKD: [0x1100, 0x1166, 0x11B5] }, +{ source: [0xAC9B], NFC: [0xAC9B], NFD: [0x1100, 0x1166, 0x11B6], NFKC: [0xAC9B], NFKD: [0x1100, 0x1166, 0x11B6] }, +{ source: [0xAC9C], NFC: [0xAC9C], NFD: [0x1100, 0x1166, 0x11B7], NFKC: [0xAC9C], NFKD: [0x1100, 0x1166, 0x11B7] }, +{ source: [0xAC9D], NFC: [0xAC9D], NFD: [0x1100, 0x1166, 0x11B8], NFKC: [0xAC9D], NFKD: [0x1100, 0x1166, 0x11B8] }, +{ source: [0xAC9E], NFC: [0xAC9E], NFD: [0x1100, 0x1166, 0x11B9], NFKC: [0xAC9E], NFKD: [0x1100, 0x1166, 0x11B9] }, +{ source: [0xAC9F], NFC: [0xAC9F], NFD: [0x1100, 0x1166, 0x11BA], NFKC: [0xAC9F], NFKD: [0x1100, 0x1166, 0x11BA] }, +{ source: [0xACA0], NFC: [0xACA0], NFD: [0x1100, 0x1166, 0x11BB], NFKC: [0xACA0], NFKD: [0x1100, 0x1166, 0x11BB] }, +{ source: [0xACA1], NFC: [0xACA1], NFD: [0x1100, 0x1166, 0x11BC], NFKC: [0xACA1], NFKD: [0x1100, 0x1166, 0x11BC] }, +{ source: [0xACA2], NFC: [0xACA2], NFD: [0x1100, 0x1166, 0x11BD], NFKC: [0xACA2], NFKD: [0x1100, 0x1166, 0x11BD] }, +{ source: [0xACA3], NFC: [0xACA3], NFD: [0x1100, 0x1166, 0x11BE], NFKC: [0xACA3], NFKD: [0x1100, 0x1166, 0x11BE] }, +{ source: [0xACA4], NFC: [0xACA4], NFD: [0x1100, 0x1166, 0x11BF], NFKC: [0xACA4], NFKD: [0x1100, 0x1166, 0x11BF] }, +{ source: [0xACA5], NFC: [0xACA5], NFD: [0x1100, 0x1166, 0x11C0], NFKC: [0xACA5], NFKD: [0x1100, 0x1166, 0x11C0] }, +{ source: [0xACA6], NFC: [0xACA6], NFD: [0x1100, 0x1166, 0x11C1], NFKC: [0xACA6], NFKD: [0x1100, 0x1166, 0x11C1] }, +{ source: [0xACA7], NFC: [0xACA7], NFD: [0x1100, 0x1166, 0x11C2], NFKC: [0xACA7], NFKD: [0x1100, 0x1166, 0x11C2] }, +{ source: [0xACA8], NFC: [0xACA8], NFD: [0x1100, 0x1167], NFKC: [0xACA8], NFKD: [0x1100, 0x1167] }, +{ source: [0xACA9], NFC: [0xACA9], NFD: [0x1100, 0x1167, 0x11A8], NFKC: [0xACA9], NFKD: [0x1100, 0x1167, 0x11A8] }, +{ source: [0xACAA], NFC: [0xACAA], NFD: [0x1100, 0x1167, 0x11A9], NFKC: [0xACAA], NFKD: [0x1100, 0x1167, 0x11A9] }, +{ source: [0xACAB], NFC: [0xACAB], NFD: [0x1100, 0x1167, 0x11AA], NFKC: [0xACAB], NFKD: [0x1100, 0x1167, 0x11AA] }, +{ source: [0xACAC], NFC: [0xACAC], NFD: [0x1100, 0x1167, 0x11AB], NFKC: [0xACAC], NFKD: [0x1100, 0x1167, 0x11AB] }, +{ source: [0xACAD], NFC: [0xACAD], NFD: [0x1100, 0x1167, 0x11AC], NFKC: [0xACAD], NFKD: [0x1100, 0x1167, 0x11AC] }, +{ source: [0xACAE], NFC: [0xACAE], NFD: [0x1100, 0x1167, 0x11AD], NFKC: [0xACAE], NFKD: [0x1100, 0x1167, 0x11AD] }, +{ source: [0xACAF], NFC: [0xACAF], NFD: [0x1100, 0x1167, 0x11AE], NFKC: [0xACAF], NFKD: [0x1100, 0x1167, 0x11AE] }, +{ source: [0xACB0], NFC: [0xACB0], NFD: [0x1100, 0x1167, 0x11AF], NFKC: [0xACB0], NFKD: [0x1100, 0x1167, 0x11AF] }, +{ source: [0xACB1], NFC: [0xACB1], NFD: [0x1100, 0x1167, 0x11B0], NFKC: [0xACB1], NFKD: [0x1100, 0x1167, 0x11B0] }, +{ source: [0xACB2], NFC: [0xACB2], NFD: [0x1100, 0x1167, 0x11B1], NFKC: [0xACB2], NFKD: [0x1100, 0x1167, 0x11B1] }, +{ source: [0xACB3], NFC: [0xACB3], NFD: [0x1100, 0x1167, 0x11B2], NFKC: [0xACB3], NFKD: [0x1100, 0x1167, 0x11B2] }, +{ source: [0xACB4], NFC: [0xACB4], NFD: [0x1100, 0x1167, 0x11B3], NFKC: [0xACB4], NFKD: [0x1100, 0x1167, 0x11B3] }, +{ source: [0xACB5], NFC: [0xACB5], NFD: [0x1100, 0x1167, 0x11B4], NFKC: [0xACB5], NFKD: [0x1100, 0x1167, 0x11B4] }, +{ source: [0xACB6], NFC: [0xACB6], NFD: [0x1100, 0x1167, 0x11B5], NFKC: [0xACB6], NFKD: [0x1100, 0x1167, 0x11B5] }, +{ source: [0xACB7], NFC: [0xACB7], NFD: [0x1100, 0x1167, 0x11B6], NFKC: [0xACB7], NFKD: [0x1100, 0x1167, 0x11B6] }, +{ source: [0xACB8], NFC: [0xACB8], NFD: [0x1100, 0x1167, 0x11B7], NFKC: [0xACB8], NFKD: [0x1100, 0x1167, 0x11B7] }, +{ source: [0xACB9], NFC: [0xACB9], NFD: [0x1100, 0x1167, 0x11B8], NFKC: [0xACB9], NFKD: [0x1100, 0x1167, 0x11B8] }, +{ source: [0xACBA], NFC: [0xACBA], NFD: [0x1100, 0x1167, 0x11B9], NFKC: [0xACBA], NFKD: [0x1100, 0x1167, 0x11B9] }, +{ source: [0xACBB], NFC: [0xACBB], NFD: [0x1100, 0x1167, 0x11BA], NFKC: [0xACBB], NFKD: [0x1100, 0x1167, 0x11BA] }, +{ source: [0xACBC], NFC: [0xACBC], NFD: [0x1100, 0x1167, 0x11BB], NFKC: [0xACBC], NFKD: [0x1100, 0x1167, 0x11BB] }, +{ source: [0xACBD], NFC: [0xACBD], NFD: [0x1100, 0x1167, 0x11BC], NFKC: [0xACBD], NFKD: [0x1100, 0x1167, 0x11BC] }, +{ source: [0xACBE], NFC: [0xACBE], NFD: [0x1100, 0x1167, 0x11BD], NFKC: [0xACBE], NFKD: [0x1100, 0x1167, 0x11BD] }, +{ source: [0xACBF], NFC: [0xACBF], NFD: [0x1100, 0x1167, 0x11BE], NFKC: [0xACBF], NFKD: [0x1100, 0x1167, 0x11BE] }, +{ source: [0xACC0], NFC: [0xACC0], NFD: [0x1100, 0x1167, 0x11BF], NFKC: [0xACC0], NFKD: [0x1100, 0x1167, 0x11BF] }, +{ source: [0xACC1], NFC: [0xACC1], NFD: [0x1100, 0x1167, 0x11C0], NFKC: [0xACC1], NFKD: [0x1100, 0x1167, 0x11C0] }, +{ source: [0xACC2], NFC: [0xACC2], NFD: [0x1100, 0x1167, 0x11C1], NFKC: [0xACC2], NFKD: [0x1100, 0x1167, 0x11C1] }, +{ source: [0xACC3], NFC: [0xACC3], NFD: [0x1100, 0x1167, 0x11C2], NFKC: [0xACC3], NFKD: [0x1100, 0x1167, 0x11C2] }, +{ source: [0xACC4], NFC: [0xACC4], NFD: [0x1100, 0x1168], NFKC: [0xACC4], NFKD: [0x1100, 0x1168] }, +{ source: [0xACC5], NFC: [0xACC5], NFD: [0x1100, 0x1168, 0x11A8], NFKC: [0xACC5], NFKD: [0x1100, 0x1168, 0x11A8] }, +{ source: [0xACC6], NFC: [0xACC6], NFD: [0x1100, 0x1168, 0x11A9], NFKC: [0xACC6], NFKD: [0x1100, 0x1168, 0x11A9] }, +{ source: [0xACC7], NFC: [0xACC7], NFD: [0x1100, 0x1168, 0x11AA], NFKC: [0xACC7], NFKD: [0x1100, 0x1168, 0x11AA] }, +{ source: [0xACC8], NFC: [0xACC8], NFD: [0x1100, 0x1168, 0x11AB], NFKC: [0xACC8], NFKD: [0x1100, 0x1168, 0x11AB] }, +{ source: [0xACC9], NFC: [0xACC9], NFD: [0x1100, 0x1168, 0x11AC], NFKC: [0xACC9], NFKD: [0x1100, 0x1168, 0x11AC] }, +{ source: [0xACCA], NFC: [0xACCA], NFD: [0x1100, 0x1168, 0x11AD], NFKC: [0xACCA], NFKD: [0x1100, 0x1168, 0x11AD] }, +{ source: [0xACCB], NFC: [0xACCB], NFD: [0x1100, 0x1168, 0x11AE], NFKC: [0xACCB], NFKD: [0x1100, 0x1168, 0x11AE] }, +{ source: [0xACCC], NFC: [0xACCC], NFD: [0x1100, 0x1168, 0x11AF], NFKC: [0xACCC], NFKD: [0x1100, 0x1168, 0x11AF] }, +{ source: [0xACCD], NFC: [0xACCD], NFD: [0x1100, 0x1168, 0x11B0], NFKC: [0xACCD], NFKD: [0x1100, 0x1168, 0x11B0] }, +{ source: [0xACCE], NFC: [0xACCE], NFD: [0x1100, 0x1168, 0x11B1], NFKC: [0xACCE], NFKD: [0x1100, 0x1168, 0x11B1] }, +{ source: [0xACCF], NFC: [0xACCF], NFD: [0x1100, 0x1168, 0x11B2], NFKC: [0xACCF], NFKD: [0x1100, 0x1168, 0x11B2] }, +{ source: [0xACD0], NFC: [0xACD0], NFD: [0x1100, 0x1168, 0x11B3], NFKC: [0xACD0], NFKD: [0x1100, 0x1168, 0x11B3] }, +{ source: [0xACD1], NFC: [0xACD1], NFD: [0x1100, 0x1168, 0x11B4], NFKC: [0xACD1], NFKD: [0x1100, 0x1168, 0x11B4] }, +{ source: [0xACD2], NFC: [0xACD2], NFD: [0x1100, 0x1168, 0x11B5], NFKC: [0xACD2], NFKD: [0x1100, 0x1168, 0x11B5] }, +{ source: [0xACD3], NFC: [0xACD3], NFD: [0x1100, 0x1168, 0x11B6], NFKC: [0xACD3], NFKD: [0x1100, 0x1168, 0x11B6] }, +{ source: [0xACD4], NFC: [0xACD4], NFD: [0x1100, 0x1168, 0x11B7], NFKC: [0xACD4], NFKD: [0x1100, 0x1168, 0x11B7] }, +{ source: [0xACD5], NFC: [0xACD5], NFD: [0x1100, 0x1168, 0x11B8], NFKC: [0xACD5], NFKD: [0x1100, 0x1168, 0x11B8] }, +{ source: [0xACD6], NFC: [0xACD6], NFD: [0x1100, 0x1168, 0x11B9], NFKC: [0xACD6], NFKD: [0x1100, 0x1168, 0x11B9] }, +{ source: [0xACD7], NFC: [0xACD7], NFD: [0x1100, 0x1168, 0x11BA], NFKC: [0xACD7], NFKD: [0x1100, 0x1168, 0x11BA] }, +{ source: [0xACD8], NFC: [0xACD8], NFD: [0x1100, 0x1168, 0x11BB], NFKC: [0xACD8], NFKD: [0x1100, 0x1168, 0x11BB] }, +{ source: [0xACD9], NFC: [0xACD9], NFD: [0x1100, 0x1168, 0x11BC], NFKC: [0xACD9], NFKD: [0x1100, 0x1168, 0x11BC] }, +{ source: [0xACDA], NFC: [0xACDA], NFD: [0x1100, 0x1168, 0x11BD], NFKC: [0xACDA], NFKD: [0x1100, 0x1168, 0x11BD] }, +{ source: [0xACDB], NFC: [0xACDB], NFD: [0x1100, 0x1168, 0x11BE], NFKC: [0xACDB], NFKD: [0x1100, 0x1168, 0x11BE] }, +{ source: [0xACDC], NFC: [0xACDC], NFD: [0x1100, 0x1168, 0x11BF], NFKC: [0xACDC], NFKD: [0x1100, 0x1168, 0x11BF] }, +{ source: [0xACDD], NFC: [0xACDD], NFD: [0x1100, 0x1168, 0x11C0], NFKC: [0xACDD], NFKD: [0x1100, 0x1168, 0x11C0] }, +{ source: [0xACDE], NFC: [0xACDE], NFD: [0x1100, 0x1168, 0x11C1], NFKC: [0xACDE], NFKD: [0x1100, 0x1168, 0x11C1] }, +{ source: [0xACDF], NFC: [0xACDF], NFD: [0x1100, 0x1168, 0x11C2], NFKC: [0xACDF], NFKD: [0x1100, 0x1168, 0x11C2] }, +{ source: [0xACE0], NFC: [0xACE0], NFD: [0x1100, 0x1169], NFKC: [0xACE0], NFKD: [0x1100, 0x1169] }, +{ source: [0xACE1], NFC: [0xACE1], NFD: [0x1100, 0x1169, 0x11A8], NFKC: [0xACE1], NFKD: [0x1100, 0x1169, 0x11A8] }, +{ source: [0xACE2], NFC: [0xACE2], NFD: [0x1100, 0x1169, 0x11A9], NFKC: [0xACE2], NFKD: [0x1100, 0x1169, 0x11A9] }, +{ source: [0xACE3], NFC: [0xACE3], NFD: [0x1100, 0x1169, 0x11AA], NFKC: [0xACE3], NFKD: [0x1100, 0x1169, 0x11AA] }, +{ source: [0xACE4], NFC: [0xACE4], NFD: [0x1100, 0x1169, 0x11AB], NFKC: [0xACE4], NFKD: [0x1100, 0x1169, 0x11AB] }, +{ source: [0xACE5], NFC: [0xACE5], NFD: [0x1100, 0x1169, 0x11AC], NFKC: [0xACE5], NFKD: [0x1100, 0x1169, 0x11AC] }, +{ source: [0xACE6], NFC: [0xACE6], NFD: [0x1100, 0x1169, 0x11AD], NFKC: [0xACE6], NFKD: [0x1100, 0x1169, 0x11AD] }, +{ source: [0xACE7], NFC: [0xACE7], NFD: [0x1100, 0x1169, 0x11AE], NFKC: [0xACE7], NFKD: [0x1100, 0x1169, 0x11AE] }, +{ source: [0xACE8], NFC: [0xACE8], NFD: [0x1100, 0x1169, 0x11AF], NFKC: [0xACE8], NFKD: [0x1100, 0x1169, 0x11AF] }, +{ source: [0xACE9], NFC: [0xACE9], NFD: [0x1100, 0x1169, 0x11B0], NFKC: [0xACE9], NFKD: [0x1100, 0x1169, 0x11B0] }, +{ source: [0xACEA], NFC: [0xACEA], NFD: [0x1100, 0x1169, 0x11B1], NFKC: [0xACEA], NFKD: [0x1100, 0x1169, 0x11B1] }, +{ source: [0xACEB], NFC: [0xACEB], NFD: [0x1100, 0x1169, 0x11B2], NFKC: [0xACEB], NFKD: [0x1100, 0x1169, 0x11B2] }, +{ source: [0xACEC], NFC: [0xACEC], NFD: [0x1100, 0x1169, 0x11B3], NFKC: [0xACEC], NFKD: [0x1100, 0x1169, 0x11B3] }, +{ source: [0xACED], NFC: [0xACED], NFD: [0x1100, 0x1169, 0x11B4], NFKC: [0xACED], NFKD: [0x1100, 0x1169, 0x11B4] }, +{ source: [0xACEE], NFC: [0xACEE], NFD: [0x1100, 0x1169, 0x11B5], NFKC: [0xACEE], NFKD: [0x1100, 0x1169, 0x11B5] }, +{ source: [0xACEF], NFC: [0xACEF], NFD: [0x1100, 0x1169, 0x11B6], NFKC: [0xACEF], NFKD: [0x1100, 0x1169, 0x11B6] }, +{ source: [0xACF0], NFC: [0xACF0], NFD: [0x1100, 0x1169, 0x11B7], NFKC: [0xACF0], NFKD: [0x1100, 0x1169, 0x11B7] }, +{ source: [0xACF1], NFC: [0xACF1], NFD: [0x1100, 0x1169, 0x11B8], NFKC: [0xACF1], NFKD: [0x1100, 0x1169, 0x11B8] }, +{ source: [0xACF2], NFC: [0xACF2], NFD: [0x1100, 0x1169, 0x11B9], NFKC: [0xACF2], NFKD: [0x1100, 0x1169, 0x11B9] }, +{ source: [0xACF3], NFC: [0xACF3], NFD: [0x1100, 0x1169, 0x11BA], NFKC: [0xACF3], NFKD: [0x1100, 0x1169, 0x11BA] }, +{ source: [0xACF4], NFC: [0xACF4], NFD: [0x1100, 0x1169, 0x11BB], NFKC: [0xACF4], NFKD: [0x1100, 0x1169, 0x11BB] }, +{ source: [0xACF5], NFC: [0xACF5], NFD: [0x1100, 0x1169, 0x11BC], NFKC: [0xACF5], NFKD: [0x1100, 0x1169, 0x11BC] }, +{ source: [0xACF6], NFC: [0xACF6], NFD: [0x1100, 0x1169, 0x11BD], NFKC: [0xACF6], NFKD: [0x1100, 0x1169, 0x11BD] }, +{ source: [0xACF7], NFC: [0xACF7], NFD: [0x1100, 0x1169, 0x11BE], NFKC: [0xACF7], NFKD: [0x1100, 0x1169, 0x11BE] }, +{ source: [0xACF8], NFC: [0xACF8], NFD: [0x1100, 0x1169, 0x11BF], NFKC: [0xACF8], NFKD: [0x1100, 0x1169, 0x11BF] }, +{ source: [0xACF9], NFC: [0xACF9], NFD: [0x1100, 0x1169, 0x11C0], NFKC: [0xACF9], NFKD: [0x1100, 0x1169, 0x11C0] }, +{ source: [0xACFA], NFC: [0xACFA], NFD: [0x1100, 0x1169, 0x11C1], NFKC: [0xACFA], NFKD: [0x1100, 0x1169, 0x11C1] }, +{ source: [0xACFB], NFC: [0xACFB], NFD: [0x1100, 0x1169, 0x11C2], NFKC: [0xACFB], NFKD: [0x1100, 0x1169, 0x11C2] }, +{ source: [0xACFC], NFC: [0xACFC], NFD: [0x1100, 0x116A], NFKC: [0xACFC], NFKD: [0x1100, 0x116A] }, +{ source: [0xACFD], NFC: [0xACFD], NFD: [0x1100, 0x116A, 0x11A8], NFKC: [0xACFD], NFKD: [0x1100, 0x116A, 0x11A8] }, +{ source: [0xACFE], NFC: [0xACFE], NFD: [0x1100, 0x116A, 0x11A9], NFKC: [0xACFE], NFKD: [0x1100, 0x116A, 0x11A9] }, +{ source: [0xACFF], NFC: [0xACFF], NFD: [0x1100, 0x116A, 0x11AA], NFKC: [0xACFF], NFKD: [0x1100, 0x116A, 0x11AA] }, +{ source: [0xAD00], NFC: [0xAD00], NFD: [0x1100, 0x116A, 0x11AB], NFKC: [0xAD00], NFKD: [0x1100, 0x116A, 0x11AB] }, +{ source: [0xAD01], NFC: [0xAD01], NFD: [0x1100, 0x116A, 0x11AC], NFKC: [0xAD01], NFKD: [0x1100, 0x116A, 0x11AC] }, +{ source: [0xAD02], NFC: [0xAD02], NFD: [0x1100, 0x116A, 0x11AD], NFKC: [0xAD02], NFKD: [0x1100, 0x116A, 0x11AD] }, +{ source: [0xAD03], NFC: [0xAD03], NFD: [0x1100, 0x116A, 0x11AE], NFKC: [0xAD03], NFKD: [0x1100, 0x116A, 0x11AE] }, +{ source: [0xAD04], NFC: [0xAD04], NFD: [0x1100, 0x116A, 0x11AF], NFKC: [0xAD04], NFKD: [0x1100, 0x116A, 0x11AF] }, +{ source: [0xAD05], NFC: [0xAD05], NFD: [0x1100, 0x116A, 0x11B0], NFKC: [0xAD05], NFKD: [0x1100, 0x116A, 0x11B0] }, +{ source: [0xAD06], NFC: [0xAD06], NFD: [0x1100, 0x116A, 0x11B1], NFKC: [0xAD06], NFKD: [0x1100, 0x116A, 0x11B1] }, +{ source: [0xAD07], NFC: [0xAD07], NFD: [0x1100, 0x116A, 0x11B2], NFKC: [0xAD07], NFKD: [0x1100, 0x116A, 0x11B2] }, +{ source: [0xAD08], NFC: [0xAD08], NFD: [0x1100, 0x116A, 0x11B3], NFKC: [0xAD08], NFKD: [0x1100, 0x116A, 0x11B3] }, +{ source: [0xAD09], NFC: [0xAD09], NFD: [0x1100, 0x116A, 0x11B4], NFKC: [0xAD09], NFKD: [0x1100, 0x116A, 0x11B4] }, +{ source: [0xAD0A], NFC: [0xAD0A], NFD: [0x1100, 0x116A, 0x11B5], NFKC: [0xAD0A], NFKD: [0x1100, 0x116A, 0x11B5] }, +{ source: [0xAD0B], NFC: [0xAD0B], NFD: [0x1100, 0x116A, 0x11B6], NFKC: [0xAD0B], NFKD: [0x1100, 0x116A, 0x11B6] }, +{ source: [0xAD0C], NFC: [0xAD0C], NFD: [0x1100, 0x116A, 0x11B7], NFKC: [0xAD0C], NFKD: [0x1100, 0x116A, 0x11B7] }, +{ source: [0xAD0D], NFC: [0xAD0D], NFD: [0x1100, 0x116A, 0x11B8], NFKC: [0xAD0D], NFKD: [0x1100, 0x116A, 0x11B8] }, +{ source: [0xAD0E], NFC: [0xAD0E], NFD: [0x1100, 0x116A, 0x11B9], NFKC: [0xAD0E], NFKD: [0x1100, 0x116A, 0x11B9] }, +{ source: [0xAD0F], NFC: [0xAD0F], NFD: [0x1100, 0x116A, 0x11BA], NFKC: [0xAD0F], NFKD: [0x1100, 0x116A, 0x11BA] }, +{ source: [0xAD10], NFC: [0xAD10], NFD: [0x1100, 0x116A, 0x11BB], NFKC: [0xAD10], NFKD: [0x1100, 0x116A, 0x11BB] }, +{ source: [0xAD11], NFC: [0xAD11], NFD: [0x1100, 0x116A, 0x11BC], NFKC: [0xAD11], NFKD: [0x1100, 0x116A, 0x11BC] }, +{ source: [0xAD12], NFC: [0xAD12], NFD: [0x1100, 0x116A, 0x11BD], NFKC: [0xAD12], NFKD: [0x1100, 0x116A, 0x11BD] }, +{ source: [0xAD13], NFC: [0xAD13], NFD: [0x1100, 0x116A, 0x11BE], NFKC: [0xAD13], NFKD: [0x1100, 0x116A, 0x11BE] }, +{ source: [0xAD14], NFC: [0xAD14], NFD: [0x1100, 0x116A, 0x11BF], NFKC: [0xAD14], NFKD: [0x1100, 0x116A, 0x11BF] }, +{ source: [0xAD15], NFC: [0xAD15], NFD: [0x1100, 0x116A, 0x11C0], NFKC: [0xAD15], NFKD: [0x1100, 0x116A, 0x11C0] }, +{ source: [0xAD16], NFC: [0xAD16], NFD: [0x1100, 0x116A, 0x11C1], NFKC: [0xAD16], NFKD: [0x1100, 0x116A, 0x11C1] }, +{ source: [0xAD17], NFC: [0xAD17], NFD: [0x1100, 0x116A, 0x11C2], NFKC: [0xAD17], NFKD: [0x1100, 0x116A, 0x11C2] }, +{ source: [0xAD18], NFC: [0xAD18], NFD: [0x1100, 0x116B], NFKC: [0xAD18], NFKD: [0x1100, 0x116B] }, +{ source: [0xAD19], NFC: [0xAD19], NFD: [0x1100, 0x116B, 0x11A8], NFKC: [0xAD19], NFKD: [0x1100, 0x116B, 0x11A8] }, +{ source: [0xAD1A], NFC: [0xAD1A], NFD: [0x1100, 0x116B, 0x11A9], NFKC: [0xAD1A], NFKD: [0x1100, 0x116B, 0x11A9] }, +{ source: [0xAD1B], NFC: [0xAD1B], NFD: [0x1100, 0x116B, 0x11AA], NFKC: [0xAD1B], NFKD: [0x1100, 0x116B, 0x11AA] }, +{ source: [0xAD1C], NFC: [0xAD1C], NFD: [0x1100, 0x116B, 0x11AB], NFKC: [0xAD1C], NFKD: [0x1100, 0x116B, 0x11AB] }, +{ source: [0xAD1D], NFC: [0xAD1D], NFD: [0x1100, 0x116B, 0x11AC], NFKC: [0xAD1D], NFKD: [0x1100, 0x116B, 0x11AC] }, +{ source: [0xAD1E], NFC: [0xAD1E], NFD: [0x1100, 0x116B, 0x11AD], NFKC: [0xAD1E], NFKD: [0x1100, 0x116B, 0x11AD] }, +{ source: [0xAD1F], NFC: [0xAD1F], NFD: [0x1100, 0x116B, 0x11AE], NFKC: [0xAD1F], NFKD: [0x1100, 0x116B, 0x11AE] }, +{ source: [0xAD20], NFC: [0xAD20], NFD: [0x1100, 0x116B, 0x11AF], NFKC: [0xAD20], NFKD: [0x1100, 0x116B, 0x11AF] }, +{ source: [0xAD21], NFC: [0xAD21], NFD: [0x1100, 0x116B, 0x11B0], NFKC: [0xAD21], NFKD: [0x1100, 0x116B, 0x11B0] }, +{ source: [0xAD22], NFC: [0xAD22], NFD: [0x1100, 0x116B, 0x11B1], NFKC: [0xAD22], NFKD: [0x1100, 0x116B, 0x11B1] }, +{ source: [0xAD23], NFC: [0xAD23], NFD: [0x1100, 0x116B, 0x11B2], NFKC: [0xAD23], NFKD: [0x1100, 0x116B, 0x11B2] }, +{ source: [0xAD24], NFC: [0xAD24], NFD: [0x1100, 0x116B, 0x11B3], NFKC: [0xAD24], NFKD: [0x1100, 0x116B, 0x11B3] }, +{ source: [0xAD25], NFC: [0xAD25], NFD: [0x1100, 0x116B, 0x11B4], NFKC: [0xAD25], NFKD: [0x1100, 0x116B, 0x11B4] }, +{ source: [0xAD26], NFC: [0xAD26], NFD: [0x1100, 0x116B, 0x11B5], NFKC: [0xAD26], NFKD: [0x1100, 0x116B, 0x11B5] }, +{ source: [0xAD27], NFC: [0xAD27], NFD: [0x1100, 0x116B, 0x11B6], NFKC: [0xAD27], NFKD: [0x1100, 0x116B, 0x11B6] }, +{ source: [0xAD28], NFC: [0xAD28], NFD: [0x1100, 0x116B, 0x11B7], NFKC: [0xAD28], NFKD: [0x1100, 0x116B, 0x11B7] }, +{ source: [0xAD29], NFC: [0xAD29], NFD: [0x1100, 0x116B, 0x11B8], NFKC: [0xAD29], NFKD: [0x1100, 0x116B, 0x11B8] }, +{ source: [0xAD2A], NFC: [0xAD2A], NFD: [0x1100, 0x116B, 0x11B9], NFKC: [0xAD2A], NFKD: [0x1100, 0x116B, 0x11B9] }, +{ source: [0xAD2B], NFC: [0xAD2B], NFD: [0x1100, 0x116B, 0x11BA], NFKC: [0xAD2B], NFKD: [0x1100, 0x116B, 0x11BA] }, +{ source: [0xAD2C], NFC: [0xAD2C], NFD: [0x1100, 0x116B, 0x11BB], NFKC: [0xAD2C], NFKD: [0x1100, 0x116B, 0x11BB] }, +{ source: [0xAD2D], NFC: [0xAD2D], NFD: [0x1100, 0x116B, 0x11BC], NFKC: [0xAD2D], NFKD: [0x1100, 0x116B, 0x11BC] }, +{ source: [0xAD2E], NFC: [0xAD2E], NFD: [0x1100, 0x116B, 0x11BD], NFKC: [0xAD2E], NFKD: [0x1100, 0x116B, 0x11BD] }, +{ source: [0xAD2F], NFC: [0xAD2F], NFD: [0x1100, 0x116B, 0x11BE], NFKC: [0xAD2F], NFKD: [0x1100, 0x116B, 0x11BE] }, +{ source: [0xAD30], NFC: [0xAD30], NFD: [0x1100, 0x116B, 0x11BF], NFKC: [0xAD30], NFKD: [0x1100, 0x116B, 0x11BF] }, +{ source: [0xAD31], NFC: [0xAD31], NFD: [0x1100, 0x116B, 0x11C0], NFKC: [0xAD31], NFKD: [0x1100, 0x116B, 0x11C0] }, +{ source: [0xAD32], NFC: [0xAD32], NFD: [0x1100, 0x116B, 0x11C1], NFKC: [0xAD32], NFKD: [0x1100, 0x116B, 0x11C1] }, +{ source: [0xAD33], NFC: [0xAD33], NFD: [0x1100, 0x116B, 0x11C2], NFKC: [0xAD33], NFKD: [0x1100, 0x116B, 0x11C2] }, +{ source: [0xAD34], NFC: [0xAD34], NFD: [0x1100, 0x116C], NFKC: [0xAD34], NFKD: [0x1100, 0x116C] }, +{ source: [0xAD35], NFC: [0xAD35], NFD: [0x1100, 0x116C, 0x11A8], NFKC: [0xAD35], NFKD: [0x1100, 0x116C, 0x11A8] }, +{ source: [0xAD36], NFC: [0xAD36], NFD: [0x1100, 0x116C, 0x11A9], NFKC: [0xAD36], NFKD: [0x1100, 0x116C, 0x11A9] }, +{ source: [0xAD37], NFC: [0xAD37], NFD: [0x1100, 0x116C, 0x11AA], NFKC: [0xAD37], NFKD: [0x1100, 0x116C, 0x11AA] }, +{ source: [0xAD38], NFC: [0xAD38], NFD: [0x1100, 0x116C, 0x11AB], NFKC: [0xAD38], NFKD: [0x1100, 0x116C, 0x11AB] }, +{ source: [0xAD39], NFC: [0xAD39], NFD: [0x1100, 0x116C, 0x11AC], NFKC: [0xAD39], NFKD: [0x1100, 0x116C, 0x11AC] }, +{ source: [0xAD3A], NFC: [0xAD3A], NFD: [0x1100, 0x116C, 0x11AD], NFKC: [0xAD3A], NFKD: [0x1100, 0x116C, 0x11AD] }, +{ source: [0xAD3B], NFC: [0xAD3B], NFD: [0x1100, 0x116C, 0x11AE], NFKC: [0xAD3B], NFKD: [0x1100, 0x116C, 0x11AE] }, +{ source: [0xAD3C], NFC: [0xAD3C], NFD: [0x1100, 0x116C, 0x11AF], NFKC: [0xAD3C], NFKD: [0x1100, 0x116C, 0x11AF] }, +{ source: [0xAD3D], NFC: [0xAD3D], NFD: [0x1100, 0x116C, 0x11B0], NFKC: [0xAD3D], NFKD: [0x1100, 0x116C, 0x11B0] }, +{ source: [0xAD3E], NFC: [0xAD3E], NFD: [0x1100, 0x116C, 0x11B1], NFKC: [0xAD3E], NFKD: [0x1100, 0x116C, 0x11B1] }, +{ source: [0xAD3F], NFC: [0xAD3F], NFD: [0x1100, 0x116C, 0x11B2], NFKC: [0xAD3F], NFKD: [0x1100, 0x116C, 0x11B2] }, +{ source: [0xAD40], NFC: [0xAD40], NFD: [0x1100, 0x116C, 0x11B3], NFKC: [0xAD40], NFKD: [0x1100, 0x116C, 0x11B3] }, +{ source: [0xAD41], NFC: [0xAD41], NFD: [0x1100, 0x116C, 0x11B4], NFKC: [0xAD41], NFKD: [0x1100, 0x116C, 0x11B4] }, +{ source: [0xAD42], NFC: [0xAD42], NFD: [0x1100, 0x116C, 0x11B5], NFKC: [0xAD42], NFKD: [0x1100, 0x116C, 0x11B5] }, +{ source: [0xAD43], NFC: [0xAD43], NFD: [0x1100, 0x116C, 0x11B6], NFKC: [0xAD43], NFKD: [0x1100, 0x116C, 0x11B6] }, +{ source: [0xAD44], NFC: [0xAD44], NFD: [0x1100, 0x116C, 0x11B7], NFKC: [0xAD44], NFKD: [0x1100, 0x116C, 0x11B7] }, +{ source: [0xAD45], NFC: [0xAD45], NFD: [0x1100, 0x116C, 0x11B8], NFKC: [0xAD45], NFKD: [0x1100, 0x116C, 0x11B8] }, +{ source: [0xAD46], NFC: [0xAD46], NFD: [0x1100, 0x116C, 0x11B9], NFKC: [0xAD46], NFKD: [0x1100, 0x116C, 0x11B9] }, +{ source: [0xAD47], NFC: [0xAD47], NFD: [0x1100, 0x116C, 0x11BA], NFKC: [0xAD47], NFKD: [0x1100, 0x116C, 0x11BA] }, +{ source: [0xAD48], NFC: [0xAD48], NFD: [0x1100, 0x116C, 0x11BB], NFKC: [0xAD48], NFKD: [0x1100, 0x116C, 0x11BB] }, +{ source: [0xAD49], NFC: [0xAD49], NFD: [0x1100, 0x116C, 0x11BC], NFKC: [0xAD49], NFKD: [0x1100, 0x116C, 0x11BC] }, +{ source: [0xAD4A], NFC: [0xAD4A], NFD: [0x1100, 0x116C, 0x11BD], NFKC: [0xAD4A], NFKD: [0x1100, 0x116C, 0x11BD] }, +{ source: [0xAD4B], NFC: [0xAD4B], NFD: [0x1100, 0x116C, 0x11BE], NFKC: [0xAD4B], NFKD: [0x1100, 0x116C, 0x11BE] }, +{ source: [0xAD4C], NFC: [0xAD4C], NFD: [0x1100, 0x116C, 0x11BF], NFKC: [0xAD4C], NFKD: [0x1100, 0x116C, 0x11BF] }, +{ source: [0xAD4D], NFC: [0xAD4D], NFD: [0x1100, 0x116C, 0x11C0], NFKC: [0xAD4D], NFKD: [0x1100, 0x116C, 0x11C0] }, +{ source: [0xAD4E], NFC: [0xAD4E], NFD: [0x1100, 0x116C, 0x11C1], NFKC: [0xAD4E], NFKD: [0x1100, 0x116C, 0x11C1] }, +{ source: [0xAD4F], NFC: [0xAD4F], NFD: [0x1100, 0x116C, 0x11C2], NFKC: [0xAD4F], NFKD: [0x1100, 0x116C, 0x11C2] }, +{ source: [0xAD50], NFC: [0xAD50], NFD: [0x1100, 0x116D], NFKC: [0xAD50], NFKD: [0x1100, 0x116D] }, +{ source: [0xAD51], NFC: [0xAD51], NFD: [0x1100, 0x116D, 0x11A8], NFKC: [0xAD51], NFKD: [0x1100, 0x116D, 0x11A8] }, +{ source: [0xAD52], NFC: [0xAD52], NFD: [0x1100, 0x116D, 0x11A9], NFKC: [0xAD52], NFKD: [0x1100, 0x116D, 0x11A9] }, +{ source: [0xAD53], NFC: [0xAD53], NFD: [0x1100, 0x116D, 0x11AA], NFKC: [0xAD53], NFKD: [0x1100, 0x116D, 0x11AA] }, +{ source: [0xAD54], NFC: [0xAD54], NFD: [0x1100, 0x116D, 0x11AB], NFKC: [0xAD54], NFKD: [0x1100, 0x116D, 0x11AB] }, +{ source: [0xAD55], NFC: [0xAD55], NFD: [0x1100, 0x116D, 0x11AC], NFKC: [0xAD55], NFKD: [0x1100, 0x116D, 0x11AC] }, +{ source: [0xAD56], NFC: [0xAD56], NFD: [0x1100, 0x116D, 0x11AD], NFKC: [0xAD56], NFKD: [0x1100, 0x116D, 0x11AD] }, +{ source: [0xAD57], NFC: [0xAD57], NFD: [0x1100, 0x116D, 0x11AE], NFKC: [0xAD57], NFKD: [0x1100, 0x116D, 0x11AE] }, +{ source: [0xAD58], NFC: [0xAD58], NFD: [0x1100, 0x116D, 0x11AF], NFKC: [0xAD58], NFKD: [0x1100, 0x116D, 0x11AF] }, +{ source: [0xAD59], NFC: [0xAD59], NFD: [0x1100, 0x116D, 0x11B0], NFKC: [0xAD59], NFKD: [0x1100, 0x116D, 0x11B0] }, +{ source: [0xAD5A], NFC: [0xAD5A], NFD: [0x1100, 0x116D, 0x11B1], NFKC: [0xAD5A], NFKD: [0x1100, 0x116D, 0x11B1] }, +{ source: [0xAD5B], NFC: [0xAD5B], NFD: [0x1100, 0x116D, 0x11B2], NFKC: [0xAD5B], NFKD: [0x1100, 0x116D, 0x11B2] }, +{ source: [0xAD5C], NFC: [0xAD5C], NFD: [0x1100, 0x116D, 0x11B3], NFKC: [0xAD5C], NFKD: [0x1100, 0x116D, 0x11B3] }, +{ source: [0xAD5D], NFC: [0xAD5D], NFD: [0x1100, 0x116D, 0x11B4], NFKC: [0xAD5D], NFKD: [0x1100, 0x116D, 0x11B4] }, +{ source: [0xAD5E], NFC: [0xAD5E], NFD: [0x1100, 0x116D, 0x11B5], NFKC: [0xAD5E], NFKD: [0x1100, 0x116D, 0x11B5] }, +{ source: [0xAD5F], NFC: [0xAD5F], NFD: [0x1100, 0x116D, 0x11B6], NFKC: [0xAD5F], NFKD: [0x1100, 0x116D, 0x11B6] }, +{ source: [0xAD60], NFC: [0xAD60], NFD: [0x1100, 0x116D, 0x11B7], NFKC: [0xAD60], NFKD: [0x1100, 0x116D, 0x11B7] }, +{ source: [0xAD61], NFC: [0xAD61], NFD: [0x1100, 0x116D, 0x11B8], NFKC: [0xAD61], NFKD: [0x1100, 0x116D, 0x11B8] }, +{ source: [0xAD62], NFC: [0xAD62], NFD: [0x1100, 0x116D, 0x11B9], NFKC: [0xAD62], NFKD: [0x1100, 0x116D, 0x11B9] }, +{ source: [0xAD63], NFC: [0xAD63], NFD: [0x1100, 0x116D, 0x11BA], NFKC: [0xAD63], NFKD: [0x1100, 0x116D, 0x11BA] }, +{ source: [0xAD64], NFC: [0xAD64], NFD: [0x1100, 0x116D, 0x11BB], NFKC: [0xAD64], NFKD: [0x1100, 0x116D, 0x11BB] }, +{ source: [0xAD65], NFC: [0xAD65], NFD: [0x1100, 0x116D, 0x11BC], NFKC: [0xAD65], NFKD: [0x1100, 0x116D, 0x11BC] }, +{ source: [0xAD66], NFC: [0xAD66], NFD: [0x1100, 0x116D, 0x11BD], NFKC: [0xAD66], NFKD: [0x1100, 0x116D, 0x11BD] }, +{ source: [0xAD67], NFC: [0xAD67], NFD: [0x1100, 0x116D, 0x11BE], NFKC: [0xAD67], NFKD: [0x1100, 0x116D, 0x11BE] }, +{ source: [0xAD68], NFC: [0xAD68], NFD: [0x1100, 0x116D, 0x11BF], NFKC: [0xAD68], NFKD: [0x1100, 0x116D, 0x11BF] }, +{ source: [0xAD69], NFC: [0xAD69], NFD: [0x1100, 0x116D, 0x11C0], NFKC: [0xAD69], NFKD: [0x1100, 0x116D, 0x11C0] }, +{ source: [0xAD6A], NFC: [0xAD6A], NFD: [0x1100, 0x116D, 0x11C1], NFKC: [0xAD6A], NFKD: [0x1100, 0x116D, 0x11C1] }, +{ source: [0xAD6B], NFC: [0xAD6B], NFD: [0x1100, 0x116D, 0x11C2], NFKC: [0xAD6B], NFKD: [0x1100, 0x116D, 0x11C2] }, +{ source: [0xAD6C], NFC: [0xAD6C], NFD: [0x1100, 0x116E], NFKC: [0xAD6C], NFKD: [0x1100, 0x116E] }, +{ source: [0xAD6D], NFC: [0xAD6D], NFD: [0x1100, 0x116E, 0x11A8], NFKC: [0xAD6D], NFKD: [0x1100, 0x116E, 0x11A8] }, +{ source: [0xAD6E], NFC: [0xAD6E], NFD: [0x1100, 0x116E, 0x11A9], NFKC: [0xAD6E], NFKD: [0x1100, 0x116E, 0x11A9] }, +{ source: [0xAD6F], NFC: [0xAD6F], NFD: [0x1100, 0x116E, 0x11AA], NFKC: [0xAD6F], NFKD: [0x1100, 0x116E, 0x11AA] }, +{ source: [0xAD70], NFC: [0xAD70], NFD: [0x1100, 0x116E, 0x11AB], NFKC: [0xAD70], NFKD: [0x1100, 0x116E, 0x11AB] }, +{ source: [0xAD71], NFC: [0xAD71], NFD: [0x1100, 0x116E, 0x11AC], NFKC: [0xAD71], NFKD: [0x1100, 0x116E, 0x11AC] }, +{ source: [0xAD72], NFC: [0xAD72], NFD: [0x1100, 0x116E, 0x11AD], NFKC: [0xAD72], NFKD: [0x1100, 0x116E, 0x11AD] }, +{ source: [0xAD73], NFC: [0xAD73], NFD: [0x1100, 0x116E, 0x11AE], NFKC: [0xAD73], NFKD: [0x1100, 0x116E, 0x11AE] }, +{ source: [0xAD74], NFC: [0xAD74], NFD: [0x1100, 0x116E, 0x11AF], NFKC: [0xAD74], NFKD: [0x1100, 0x116E, 0x11AF] }, +{ source: [0xAD75], NFC: [0xAD75], NFD: [0x1100, 0x116E, 0x11B0], NFKC: [0xAD75], NFKD: [0x1100, 0x116E, 0x11B0] }, +{ source: [0xAD76], NFC: [0xAD76], NFD: [0x1100, 0x116E, 0x11B1], NFKC: [0xAD76], NFKD: [0x1100, 0x116E, 0x11B1] }, +{ source: [0xAD77], NFC: [0xAD77], NFD: [0x1100, 0x116E, 0x11B2], NFKC: [0xAD77], NFKD: [0x1100, 0x116E, 0x11B2] }, +{ source: [0xAD78], NFC: [0xAD78], NFD: [0x1100, 0x116E, 0x11B3], NFKC: [0xAD78], NFKD: [0x1100, 0x116E, 0x11B3] }, +{ source: [0xAD79], NFC: [0xAD79], NFD: [0x1100, 0x116E, 0x11B4], NFKC: [0xAD79], NFKD: [0x1100, 0x116E, 0x11B4] }, +{ source: [0xAD7A], NFC: [0xAD7A], NFD: [0x1100, 0x116E, 0x11B5], NFKC: [0xAD7A], NFKD: [0x1100, 0x116E, 0x11B5] }, +{ source: [0xAD7B], NFC: [0xAD7B], NFD: [0x1100, 0x116E, 0x11B6], NFKC: [0xAD7B], NFKD: [0x1100, 0x116E, 0x11B6] }, +{ source: [0xAD7C], NFC: [0xAD7C], NFD: [0x1100, 0x116E, 0x11B7], NFKC: [0xAD7C], NFKD: [0x1100, 0x116E, 0x11B7] }, +{ source: [0xAD7D], NFC: [0xAD7D], NFD: [0x1100, 0x116E, 0x11B8], NFKC: [0xAD7D], NFKD: [0x1100, 0x116E, 0x11B8] }, +{ source: [0xAD7E], NFC: [0xAD7E], NFD: [0x1100, 0x116E, 0x11B9], NFKC: [0xAD7E], NFKD: [0x1100, 0x116E, 0x11B9] }, +{ source: [0xAD7F], NFC: [0xAD7F], NFD: [0x1100, 0x116E, 0x11BA], NFKC: [0xAD7F], NFKD: [0x1100, 0x116E, 0x11BA] }, +{ source: [0xAD80], NFC: [0xAD80], NFD: [0x1100, 0x116E, 0x11BB], NFKC: [0xAD80], NFKD: [0x1100, 0x116E, 0x11BB] }, +{ source: [0xAD81], NFC: [0xAD81], NFD: [0x1100, 0x116E, 0x11BC], NFKC: [0xAD81], NFKD: [0x1100, 0x116E, 0x11BC] }, +{ source: [0xAD82], NFC: [0xAD82], NFD: [0x1100, 0x116E, 0x11BD], NFKC: [0xAD82], NFKD: [0x1100, 0x116E, 0x11BD] }, +{ source: [0xAD83], NFC: [0xAD83], NFD: [0x1100, 0x116E, 0x11BE], NFKC: [0xAD83], NFKD: [0x1100, 0x116E, 0x11BE] }, +{ source: [0xAD84], NFC: [0xAD84], NFD: [0x1100, 0x116E, 0x11BF], NFKC: [0xAD84], NFKD: [0x1100, 0x116E, 0x11BF] }, +{ source: [0xAD85], NFC: [0xAD85], NFD: [0x1100, 0x116E, 0x11C0], NFKC: [0xAD85], NFKD: [0x1100, 0x116E, 0x11C0] }, +{ source: [0xAD86], NFC: [0xAD86], NFD: [0x1100, 0x116E, 0x11C1], NFKC: [0xAD86], NFKD: [0x1100, 0x116E, 0x11C1] }, +{ source: [0xAD87], NFC: [0xAD87], NFD: [0x1100, 0x116E, 0x11C2], NFKC: [0xAD87], NFKD: [0x1100, 0x116E, 0x11C2] }, +{ source: [0xAD88], NFC: [0xAD88], NFD: [0x1100, 0x116F], NFKC: [0xAD88], NFKD: [0x1100, 0x116F] }, +{ source: [0xAD89], NFC: [0xAD89], NFD: [0x1100, 0x116F, 0x11A8], NFKC: [0xAD89], NFKD: [0x1100, 0x116F, 0x11A8] }, +{ source: [0xAD8A], NFC: [0xAD8A], NFD: [0x1100, 0x116F, 0x11A9], NFKC: [0xAD8A], NFKD: [0x1100, 0x116F, 0x11A9] }, +{ source: [0xAD8B], NFC: [0xAD8B], NFD: [0x1100, 0x116F, 0x11AA], NFKC: [0xAD8B], NFKD: [0x1100, 0x116F, 0x11AA] }, +{ source: [0xAD8C], NFC: [0xAD8C], NFD: [0x1100, 0x116F, 0x11AB], NFKC: [0xAD8C], NFKD: [0x1100, 0x116F, 0x11AB] }, +{ source: [0xAD8D], NFC: [0xAD8D], NFD: [0x1100, 0x116F, 0x11AC], NFKC: [0xAD8D], NFKD: [0x1100, 0x116F, 0x11AC] }, +{ source: [0xAD8E], NFC: [0xAD8E], NFD: [0x1100, 0x116F, 0x11AD], NFKC: [0xAD8E], NFKD: [0x1100, 0x116F, 0x11AD] }, +{ source: [0xAD8F], NFC: [0xAD8F], NFD: [0x1100, 0x116F, 0x11AE], NFKC: [0xAD8F], NFKD: [0x1100, 0x116F, 0x11AE] }, +{ source: [0xAD90], NFC: [0xAD90], NFD: [0x1100, 0x116F, 0x11AF], NFKC: [0xAD90], NFKD: [0x1100, 0x116F, 0x11AF] }, +{ source: [0xAD91], NFC: [0xAD91], NFD: [0x1100, 0x116F, 0x11B0], NFKC: [0xAD91], NFKD: [0x1100, 0x116F, 0x11B0] }, +{ source: [0xAD92], NFC: [0xAD92], NFD: [0x1100, 0x116F, 0x11B1], NFKC: [0xAD92], NFKD: [0x1100, 0x116F, 0x11B1] }, +{ source: [0xAD93], NFC: [0xAD93], NFD: [0x1100, 0x116F, 0x11B2], NFKC: [0xAD93], NFKD: [0x1100, 0x116F, 0x11B2] }, +{ source: [0xAD94], NFC: [0xAD94], NFD: [0x1100, 0x116F, 0x11B3], NFKC: [0xAD94], NFKD: [0x1100, 0x116F, 0x11B3] }, +{ source: [0xAD95], NFC: [0xAD95], NFD: [0x1100, 0x116F, 0x11B4], NFKC: [0xAD95], NFKD: [0x1100, 0x116F, 0x11B4] }, +{ source: [0xAD96], NFC: [0xAD96], NFD: [0x1100, 0x116F, 0x11B5], NFKC: [0xAD96], NFKD: [0x1100, 0x116F, 0x11B5] }, +{ source: [0xAD97], NFC: [0xAD97], NFD: [0x1100, 0x116F, 0x11B6], NFKC: [0xAD97], NFKD: [0x1100, 0x116F, 0x11B6] }, +{ source: [0xAD98], NFC: [0xAD98], NFD: [0x1100, 0x116F, 0x11B7], NFKC: [0xAD98], NFKD: [0x1100, 0x116F, 0x11B7] }, +{ source: [0xAD99], NFC: [0xAD99], NFD: [0x1100, 0x116F, 0x11B8], NFKC: [0xAD99], NFKD: [0x1100, 0x116F, 0x11B8] }, +{ source: [0xAD9A], NFC: [0xAD9A], NFD: [0x1100, 0x116F, 0x11B9], NFKC: [0xAD9A], NFKD: [0x1100, 0x116F, 0x11B9] }, +{ source: [0xAD9B], NFC: [0xAD9B], NFD: [0x1100, 0x116F, 0x11BA], NFKC: [0xAD9B], NFKD: [0x1100, 0x116F, 0x11BA] }, +{ source: [0xAD9C], NFC: [0xAD9C], NFD: [0x1100, 0x116F, 0x11BB], NFKC: [0xAD9C], NFKD: [0x1100, 0x116F, 0x11BB] }, +{ source: [0xAD9D], NFC: [0xAD9D], NFD: [0x1100, 0x116F, 0x11BC], NFKC: [0xAD9D], NFKD: [0x1100, 0x116F, 0x11BC] }, +{ source: [0xAD9E], NFC: [0xAD9E], NFD: [0x1100, 0x116F, 0x11BD], NFKC: [0xAD9E], NFKD: [0x1100, 0x116F, 0x11BD] }, +{ source: [0xAD9F], NFC: [0xAD9F], NFD: [0x1100, 0x116F, 0x11BE], NFKC: [0xAD9F], NFKD: [0x1100, 0x116F, 0x11BE] }, +{ source: [0xADA0], NFC: [0xADA0], NFD: [0x1100, 0x116F, 0x11BF], NFKC: [0xADA0], NFKD: [0x1100, 0x116F, 0x11BF] }, +{ source: [0xADA1], NFC: [0xADA1], NFD: [0x1100, 0x116F, 0x11C0], NFKC: [0xADA1], NFKD: [0x1100, 0x116F, 0x11C0] }, +{ source: [0xADA2], NFC: [0xADA2], NFD: [0x1100, 0x116F, 0x11C1], NFKC: [0xADA2], NFKD: [0x1100, 0x116F, 0x11C1] }, +{ source: [0xADA3], NFC: [0xADA3], NFD: [0x1100, 0x116F, 0x11C2], NFKC: [0xADA3], NFKD: [0x1100, 0x116F, 0x11C2] }, +{ source: [0xADA4], NFC: [0xADA4], NFD: [0x1100, 0x1170], NFKC: [0xADA4], NFKD: [0x1100, 0x1170] }, +{ source: [0xADA5], NFC: [0xADA5], NFD: [0x1100, 0x1170, 0x11A8], NFKC: [0xADA5], NFKD: [0x1100, 0x1170, 0x11A8] }, +{ source: [0xADA6], NFC: [0xADA6], NFD: [0x1100, 0x1170, 0x11A9], NFKC: [0xADA6], NFKD: [0x1100, 0x1170, 0x11A9] }, +{ source: [0xADA7], NFC: [0xADA7], NFD: [0x1100, 0x1170, 0x11AA], NFKC: [0xADA7], NFKD: [0x1100, 0x1170, 0x11AA] }, +{ source: [0xADA8], NFC: [0xADA8], NFD: [0x1100, 0x1170, 0x11AB], NFKC: [0xADA8], NFKD: [0x1100, 0x1170, 0x11AB] }, +{ source: [0xADA9], NFC: [0xADA9], NFD: [0x1100, 0x1170, 0x11AC], NFKC: [0xADA9], NFKD: [0x1100, 0x1170, 0x11AC] }, +{ source: [0xADAA], NFC: [0xADAA], NFD: [0x1100, 0x1170, 0x11AD], NFKC: [0xADAA], NFKD: [0x1100, 0x1170, 0x11AD] }, +{ source: [0xADAB], NFC: [0xADAB], NFD: [0x1100, 0x1170, 0x11AE], NFKC: [0xADAB], NFKD: [0x1100, 0x1170, 0x11AE] }, +{ source: [0xADAC], NFC: [0xADAC], NFD: [0x1100, 0x1170, 0x11AF], NFKC: [0xADAC], NFKD: [0x1100, 0x1170, 0x11AF] }, +{ source: [0xADAD], NFC: [0xADAD], NFD: [0x1100, 0x1170, 0x11B0], NFKC: [0xADAD], NFKD: [0x1100, 0x1170, 0x11B0] }, +{ source: [0xADAE], NFC: [0xADAE], NFD: [0x1100, 0x1170, 0x11B1], NFKC: [0xADAE], NFKD: [0x1100, 0x1170, 0x11B1] }, +{ source: [0xADAF], NFC: [0xADAF], NFD: [0x1100, 0x1170, 0x11B2], NFKC: [0xADAF], NFKD: [0x1100, 0x1170, 0x11B2] }, +{ source: [0xADB0], NFC: [0xADB0], NFD: [0x1100, 0x1170, 0x11B3], NFKC: [0xADB0], NFKD: [0x1100, 0x1170, 0x11B3] }, +{ source: [0xADB1], NFC: [0xADB1], NFD: [0x1100, 0x1170, 0x11B4], NFKC: [0xADB1], NFKD: [0x1100, 0x1170, 0x11B4] }, +{ source: [0xADB2], NFC: [0xADB2], NFD: [0x1100, 0x1170, 0x11B5], NFKC: [0xADB2], NFKD: [0x1100, 0x1170, 0x11B5] }, +{ source: [0xADB3], NFC: [0xADB3], NFD: [0x1100, 0x1170, 0x11B6], NFKC: [0xADB3], NFKD: [0x1100, 0x1170, 0x11B6] }, +{ source: [0xADB4], NFC: [0xADB4], NFD: [0x1100, 0x1170, 0x11B7], NFKC: [0xADB4], NFKD: [0x1100, 0x1170, 0x11B7] }, +{ source: [0xADB5], NFC: [0xADB5], NFD: [0x1100, 0x1170, 0x11B8], NFKC: [0xADB5], NFKD: [0x1100, 0x1170, 0x11B8] }, +{ source: [0xADB6], NFC: [0xADB6], NFD: [0x1100, 0x1170, 0x11B9], NFKC: [0xADB6], NFKD: [0x1100, 0x1170, 0x11B9] }, +{ source: [0xADB7], NFC: [0xADB7], NFD: [0x1100, 0x1170, 0x11BA], NFKC: [0xADB7], NFKD: [0x1100, 0x1170, 0x11BA] }, +{ source: [0xADB8], NFC: [0xADB8], NFD: [0x1100, 0x1170, 0x11BB], NFKC: [0xADB8], NFKD: [0x1100, 0x1170, 0x11BB] }, +{ source: [0xADB9], NFC: [0xADB9], NFD: [0x1100, 0x1170, 0x11BC], NFKC: [0xADB9], NFKD: [0x1100, 0x1170, 0x11BC] }, +{ source: [0xADBA], NFC: [0xADBA], NFD: [0x1100, 0x1170, 0x11BD], NFKC: [0xADBA], NFKD: [0x1100, 0x1170, 0x11BD] }, +{ source: [0xADBB], NFC: [0xADBB], NFD: [0x1100, 0x1170, 0x11BE], NFKC: [0xADBB], NFKD: [0x1100, 0x1170, 0x11BE] }, +{ source: [0xADBC], NFC: [0xADBC], NFD: [0x1100, 0x1170, 0x11BF], NFKC: [0xADBC], NFKD: [0x1100, 0x1170, 0x11BF] }, +{ source: [0xADBD], NFC: [0xADBD], NFD: [0x1100, 0x1170, 0x11C0], NFKC: [0xADBD], NFKD: [0x1100, 0x1170, 0x11C0] }, +{ source: [0xADBE], NFC: [0xADBE], NFD: [0x1100, 0x1170, 0x11C1], NFKC: [0xADBE], NFKD: [0x1100, 0x1170, 0x11C1] }, +{ source: [0xADBF], NFC: [0xADBF], NFD: [0x1100, 0x1170, 0x11C2], NFKC: [0xADBF], NFKD: [0x1100, 0x1170, 0x11C2] }, +{ source: [0xADC0], NFC: [0xADC0], NFD: [0x1100, 0x1171], NFKC: [0xADC0], NFKD: [0x1100, 0x1171] }, +{ source: [0xADC1], NFC: [0xADC1], NFD: [0x1100, 0x1171, 0x11A8], NFKC: [0xADC1], NFKD: [0x1100, 0x1171, 0x11A8] }, +{ source: [0xADC2], NFC: [0xADC2], NFD: [0x1100, 0x1171, 0x11A9], NFKC: [0xADC2], NFKD: [0x1100, 0x1171, 0x11A9] }, +{ source: [0xADC3], NFC: [0xADC3], NFD: [0x1100, 0x1171, 0x11AA], NFKC: [0xADC3], NFKD: [0x1100, 0x1171, 0x11AA] }, +{ source: [0xADC4], NFC: [0xADC4], NFD: [0x1100, 0x1171, 0x11AB], NFKC: [0xADC4], NFKD: [0x1100, 0x1171, 0x11AB] }, +{ source: [0xADC5], NFC: [0xADC5], NFD: [0x1100, 0x1171, 0x11AC], NFKC: [0xADC5], NFKD: [0x1100, 0x1171, 0x11AC] }, +{ source: [0xADC6], NFC: [0xADC6], NFD: [0x1100, 0x1171, 0x11AD], NFKC: [0xADC6], NFKD: [0x1100, 0x1171, 0x11AD] }, +{ source: [0xADC7], NFC: [0xADC7], NFD: [0x1100, 0x1171, 0x11AE], NFKC: [0xADC7], NFKD: [0x1100, 0x1171, 0x11AE] }, +{ source: [0xADC8], NFC: [0xADC8], NFD: [0x1100, 0x1171, 0x11AF], NFKC: [0xADC8], NFKD: [0x1100, 0x1171, 0x11AF] }, +{ source: [0xADC9], NFC: [0xADC9], NFD: [0x1100, 0x1171, 0x11B0], NFKC: [0xADC9], NFKD: [0x1100, 0x1171, 0x11B0] }, +{ source: [0xADCA], NFC: [0xADCA], NFD: [0x1100, 0x1171, 0x11B1], NFKC: [0xADCA], NFKD: [0x1100, 0x1171, 0x11B1] }, +{ source: [0xADCB], NFC: [0xADCB], NFD: [0x1100, 0x1171, 0x11B2], NFKC: [0xADCB], NFKD: [0x1100, 0x1171, 0x11B2] }, +{ source: [0xADCC], NFC: [0xADCC], NFD: [0x1100, 0x1171, 0x11B3], NFKC: [0xADCC], NFKD: [0x1100, 0x1171, 0x11B3] }, +{ source: [0xADCD], NFC: [0xADCD], NFD: [0x1100, 0x1171, 0x11B4], NFKC: [0xADCD], NFKD: [0x1100, 0x1171, 0x11B4] }, +{ source: [0xADCE], NFC: [0xADCE], NFD: [0x1100, 0x1171, 0x11B5], NFKC: [0xADCE], NFKD: [0x1100, 0x1171, 0x11B5] }, +{ source: [0xADCF], NFC: [0xADCF], NFD: [0x1100, 0x1171, 0x11B6], NFKC: [0xADCF], NFKD: [0x1100, 0x1171, 0x11B6] }, +{ source: [0xADD0], NFC: [0xADD0], NFD: [0x1100, 0x1171, 0x11B7], NFKC: [0xADD0], NFKD: [0x1100, 0x1171, 0x11B7] }, +{ source: [0xADD1], NFC: [0xADD1], NFD: [0x1100, 0x1171, 0x11B8], NFKC: [0xADD1], NFKD: [0x1100, 0x1171, 0x11B8] }, +{ source: [0xADD2], NFC: [0xADD2], NFD: [0x1100, 0x1171, 0x11B9], NFKC: [0xADD2], NFKD: [0x1100, 0x1171, 0x11B9] }, +{ source: [0xADD3], NFC: [0xADD3], NFD: [0x1100, 0x1171, 0x11BA], NFKC: [0xADD3], NFKD: [0x1100, 0x1171, 0x11BA] }, +{ source: [0xADD4], NFC: [0xADD4], NFD: [0x1100, 0x1171, 0x11BB], NFKC: [0xADD4], NFKD: [0x1100, 0x1171, 0x11BB] }, +{ source: [0xADD5], NFC: [0xADD5], NFD: [0x1100, 0x1171, 0x11BC], NFKC: [0xADD5], NFKD: [0x1100, 0x1171, 0x11BC] }, +{ source: [0xADD6], NFC: [0xADD6], NFD: [0x1100, 0x1171, 0x11BD], NFKC: [0xADD6], NFKD: [0x1100, 0x1171, 0x11BD] }, +{ source: [0xADD7], NFC: [0xADD7], NFD: [0x1100, 0x1171, 0x11BE], NFKC: [0xADD7], NFKD: [0x1100, 0x1171, 0x11BE] }, +{ source: [0xADD8], NFC: [0xADD8], NFD: [0x1100, 0x1171, 0x11BF], NFKC: [0xADD8], NFKD: [0x1100, 0x1171, 0x11BF] }, +{ source: [0xADD9], NFC: [0xADD9], NFD: [0x1100, 0x1171, 0x11C0], NFKC: [0xADD9], NFKD: [0x1100, 0x1171, 0x11C0] }, +{ source: [0xADDA], NFC: [0xADDA], NFD: [0x1100, 0x1171, 0x11C1], NFKC: [0xADDA], NFKD: [0x1100, 0x1171, 0x11C1] }, +{ source: [0xADDB], NFC: [0xADDB], NFD: [0x1100, 0x1171, 0x11C2], NFKC: [0xADDB], NFKD: [0x1100, 0x1171, 0x11C2] }, +{ source: [0xADDC], NFC: [0xADDC], NFD: [0x1100, 0x1172], NFKC: [0xADDC], NFKD: [0x1100, 0x1172] }, +{ source: [0xADDD], NFC: [0xADDD], NFD: [0x1100, 0x1172, 0x11A8], NFKC: [0xADDD], NFKD: [0x1100, 0x1172, 0x11A8] }, +{ source: [0xADDE], NFC: [0xADDE], NFD: [0x1100, 0x1172, 0x11A9], NFKC: [0xADDE], NFKD: [0x1100, 0x1172, 0x11A9] }, +{ source: [0xADDF], NFC: [0xADDF], NFD: [0x1100, 0x1172, 0x11AA], NFKC: [0xADDF], NFKD: [0x1100, 0x1172, 0x11AA] }, +{ source: [0xADE0], NFC: [0xADE0], NFD: [0x1100, 0x1172, 0x11AB], NFKC: [0xADE0], NFKD: [0x1100, 0x1172, 0x11AB] }, +{ source: [0xADE1], NFC: [0xADE1], NFD: [0x1100, 0x1172, 0x11AC], NFKC: [0xADE1], NFKD: [0x1100, 0x1172, 0x11AC] }, +{ source: [0xADE2], NFC: [0xADE2], NFD: [0x1100, 0x1172, 0x11AD], NFKC: [0xADE2], NFKD: [0x1100, 0x1172, 0x11AD] }, +{ source: [0xADE3], NFC: [0xADE3], NFD: [0x1100, 0x1172, 0x11AE], NFKC: [0xADE3], NFKD: [0x1100, 0x1172, 0x11AE] }, +{ source: [0xADE4], NFC: [0xADE4], NFD: [0x1100, 0x1172, 0x11AF], NFKC: [0xADE4], NFKD: [0x1100, 0x1172, 0x11AF] }, +{ source: [0xADE5], NFC: [0xADE5], NFD: [0x1100, 0x1172, 0x11B0], NFKC: [0xADE5], NFKD: [0x1100, 0x1172, 0x11B0] }, +{ source: [0xADE6], NFC: [0xADE6], NFD: [0x1100, 0x1172, 0x11B1], NFKC: [0xADE6], NFKD: [0x1100, 0x1172, 0x11B1] }, +{ source: [0xADE7], NFC: [0xADE7], NFD: [0x1100, 0x1172, 0x11B2], NFKC: [0xADE7], NFKD: [0x1100, 0x1172, 0x11B2] }, +{ source: [0xADE8], NFC: [0xADE8], NFD: [0x1100, 0x1172, 0x11B3], NFKC: [0xADE8], NFKD: [0x1100, 0x1172, 0x11B3] }, +{ source: [0xADE9], NFC: [0xADE9], NFD: [0x1100, 0x1172, 0x11B4], NFKC: [0xADE9], NFKD: [0x1100, 0x1172, 0x11B4] }, +{ source: [0xADEA], NFC: [0xADEA], NFD: [0x1100, 0x1172, 0x11B5], NFKC: [0xADEA], NFKD: [0x1100, 0x1172, 0x11B5] }, +{ source: [0xADEB], NFC: [0xADEB], NFD: [0x1100, 0x1172, 0x11B6], NFKC: [0xADEB], NFKD: [0x1100, 0x1172, 0x11B6] }, +{ source: [0xADEC], NFC: [0xADEC], NFD: [0x1100, 0x1172, 0x11B7], NFKC: [0xADEC], NFKD: [0x1100, 0x1172, 0x11B7] }, +{ source: [0xADED], NFC: [0xADED], NFD: [0x1100, 0x1172, 0x11B8], NFKC: [0xADED], NFKD: [0x1100, 0x1172, 0x11B8] }, +{ source: [0xADEE], NFC: [0xADEE], NFD: [0x1100, 0x1172, 0x11B9], NFKC: [0xADEE], NFKD: [0x1100, 0x1172, 0x11B9] }, +{ source: [0xADEF], NFC: [0xADEF], NFD: [0x1100, 0x1172, 0x11BA], NFKC: [0xADEF], NFKD: [0x1100, 0x1172, 0x11BA] }, +{ source: [0xADF0], NFC: [0xADF0], NFD: [0x1100, 0x1172, 0x11BB], NFKC: [0xADF0], NFKD: [0x1100, 0x1172, 0x11BB] }, +{ source: [0xADF1], NFC: [0xADF1], NFD: [0x1100, 0x1172, 0x11BC], NFKC: [0xADF1], NFKD: [0x1100, 0x1172, 0x11BC] }, +{ source: [0xADF2], NFC: [0xADF2], NFD: [0x1100, 0x1172, 0x11BD], NFKC: [0xADF2], NFKD: [0x1100, 0x1172, 0x11BD] }, +{ source: [0xADF3], NFC: [0xADF3], NFD: [0x1100, 0x1172, 0x11BE], NFKC: [0xADF3], NFKD: [0x1100, 0x1172, 0x11BE] }, +{ source: [0xADF4], NFC: [0xADF4], NFD: [0x1100, 0x1172, 0x11BF], NFKC: [0xADF4], NFKD: [0x1100, 0x1172, 0x11BF] }, +{ source: [0xADF5], NFC: [0xADF5], NFD: [0x1100, 0x1172, 0x11C0], NFKC: [0xADF5], NFKD: [0x1100, 0x1172, 0x11C0] }, +{ source: [0xADF6], NFC: [0xADF6], NFD: [0x1100, 0x1172, 0x11C1], NFKC: [0xADF6], NFKD: [0x1100, 0x1172, 0x11C1] }, +{ source: [0xADF7], NFC: [0xADF7], NFD: [0x1100, 0x1172, 0x11C2], NFKC: [0xADF7], NFKD: [0x1100, 0x1172, 0x11C2] }, +{ source: [0xADF8], NFC: [0xADF8], NFD: [0x1100, 0x1173], NFKC: [0xADF8], NFKD: [0x1100, 0x1173] }, +{ source: [0xADF9], NFC: [0xADF9], NFD: [0x1100, 0x1173, 0x11A8], NFKC: [0xADF9], NFKD: [0x1100, 0x1173, 0x11A8] }, +{ source: [0xADFA], NFC: [0xADFA], NFD: [0x1100, 0x1173, 0x11A9], NFKC: [0xADFA], NFKD: [0x1100, 0x1173, 0x11A9] }, +{ source: [0xADFB], NFC: [0xADFB], NFD: [0x1100, 0x1173, 0x11AA], NFKC: [0xADFB], NFKD: [0x1100, 0x1173, 0x11AA] }, +{ source: [0xADFC], NFC: [0xADFC], NFD: [0x1100, 0x1173, 0x11AB], NFKC: [0xADFC], NFKD: [0x1100, 0x1173, 0x11AB] }, +{ source: [0xADFD], NFC: [0xADFD], NFD: [0x1100, 0x1173, 0x11AC], NFKC: [0xADFD], NFKD: [0x1100, 0x1173, 0x11AC] }, +{ source: [0xADFE], NFC: [0xADFE], NFD: [0x1100, 0x1173, 0x11AD], NFKC: [0xADFE], NFKD: [0x1100, 0x1173, 0x11AD] }, +{ source: [0xADFF], NFC: [0xADFF], NFD: [0x1100, 0x1173, 0x11AE], NFKC: [0xADFF], NFKD: [0x1100, 0x1173, 0x11AE] }, +{ source: [0xAE00], NFC: [0xAE00], NFD: [0x1100, 0x1173, 0x11AF], NFKC: [0xAE00], NFKD: [0x1100, 0x1173, 0x11AF] }, +{ source: [0xAE01], NFC: [0xAE01], NFD: [0x1100, 0x1173, 0x11B0], NFKC: [0xAE01], NFKD: [0x1100, 0x1173, 0x11B0] }, +{ source: [0xAE02], NFC: [0xAE02], NFD: [0x1100, 0x1173, 0x11B1], NFKC: [0xAE02], NFKD: [0x1100, 0x1173, 0x11B1] }, +{ source: [0xAE03], NFC: [0xAE03], NFD: [0x1100, 0x1173, 0x11B2], NFKC: [0xAE03], NFKD: [0x1100, 0x1173, 0x11B2] }, +{ source: [0xAE04], NFC: [0xAE04], NFD: [0x1100, 0x1173, 0x11B3], NFKC: [0xAE04], NFKD: [0x1100, 0x1173, 0x11B3] }, +{ source: [0xAE05], NFC: [0xAE05], NFD: [0x1100, 0x1173, 0x11B4], NFKC: [0xAE05], NFKD: [0x1100, 0x1173, 0x11B4] }, +{ source: [0xAE06], NFC: [0xAE06], NFD: [0x1100, 0x1173, 0x11B5], NFKC: [0xAE06], NFKD: [0x1100, 0x1173, 0x11B5] }, +{ source: [0xAE07], NFC: [0xAE07], NFD: [0x1100, 0x1173, 0x11B6], NFKC: [0xAE07], NFKD: [0x1100, 0x1173, 0x11B6] }, +{ source: [0xAE08], NFC: [0xAE08], NFD: [0x1100, 0x1173, 0x11B7], NFKC: [0xAE08], NFKD: [0x1100, 0x1173, 0x11B7] }, +{ source: [0xAE09], NFC: [0xAE09], NFD: [0x1100, 0x1173, 0x11B8], NFKC: [0xAE09], NFKD: [0x1100, 0x1173, 0x11B8] }, +{ source: [0xAE0A], NFC: [0xAE0A], NFD: [0x1100, 0x1173, 0x11B9], NFKC: [0xAE0A], NFKD: [0x1100, 0x1173, 0x11B9] }, +{ source: [0xAE0B], NFC: [0xAE0B], NFD: [0x1100, 0x1173, 0x11BA], NFKC: [0xAE0B], NFKD: [0x1100, 0x1173, 0x11BA] }, +{ source: [0xAE0C], NFC: [0xAE0C], NFD: [0x1100, 0x1173, 0x11BB], NFKC: [0xAE0C], NFKD: [0x1100, 0x1173, 0x11BB] }, +{ source: [0xAE0D], NFC: [0xAE0D], NFD: [0x1100, 0x1173, 0x11BC], NFKC: [0xAE0D], NFKD: [0x1100, 0x1173, 0x11BC] }, +{ source: [0xAE0E], NFC: [0xAE0E], NFD: [0x1100, 0x1173, 0x11BD], NFKC: [0xAE0E], NFKD: [0x1100, 0x1173, 0x11BD] }, +{ source: [0xAE0F], NFC: [0xAE0F], NFD: [0x1100, 0x1173, 0x11BE], NFKC: [0xAE0F], NFKD: [0x1100, 0x1173, 0x11BE] }, +{ source: [0xAE10], NFC: [0xAE10], NFD: [0x1100, 0x1173, 0x11BF], NFKC: [0xAE10], NFKD: [0x1100, 0x1173, 0x11BF] }, +{ source: [0xAE11], NFC: [0xAE11], NFD: [0x1100, 0x1173, 0x11C0], NFKC: [0xAE11], NFKD: [0x1100, 0x1173, 0x11C0] }, +{ source: [0xAE12], NFC: [0xAE12], NFD: [0x1100, 0x1173, 0x11C1], NFKC: [0xAE12], NFKD: [0x1100, 0x1173, 0x11C1] }, +{ source: [0xAE13], NFC: [0xAE13], NFD: [0x1100, 0x1173, 0x11C2], NFKC: [0xAE13], NFKD: [0x1100, 0x1173, 0x11C2] }, +{ source: [0xAE14], NFC: [0xAE14], NFD: [0x1100, 0x1174], NFKC: [0xAE14], NFKD: [0x1100, 0x1174] }, +{ source: [0xAE15], NFC: [0xAE15], NFD: [0x1100, 0x1174, 0x11A8], NFKC: [0xAE15], NFKD: [0x1100, 0x1174, 0x11A8] }, +{ source: [0xAE16], NFC: [0xAE16], NFD: [0x1100, 0x1174, 0x11A9], NFKC: [0xAE16], NFKD: [0x1100, 0x1174, 0x11A9] }, +{ source: [0xAE17], NFC: [0xAE17], NFD: [0x1100, 0x1174, 0x11AA], NFKC: [0xAE17], NFKD: [0x1100, 0x1174, 0x11AA] }, +{ source: [0xAE18], NFC: [0xAE18], NFD: [0x1100, 0x1174, 0x11AB], NFKC: [0xAE18], NFKD: [0x1100, 0x1174, 0x11AB] }, +{ source: [0xAE19], NFC: [0xAE19], NFD: [0x1100, 0x1174, 0x11AC], NFKC: [0xAE19], NFKD: [0x1100, 0x1174, 0x11AC] }, +{ source: [0xAE1A], NFC: [0xAE1A], NFD: [0x1100, 0x1174, 0x11AD], NFKC: [0xAE1A], NFKD: [0x1100, 0x1174, 0x11AD] }, +{ source: [0xAE1B], NFC: [0xAE1B], NFD: [0x1100, 0x1174, 0x11AE], NFKC: [0xAE1B], NFKD: [0x1100, 0x1174, 0x11AE] }, +{ source: [0xAE1C], NFC: [0xAE1C], NFD: [0x1100, 0x1174, 0x11AF], NFKC: [0xAE1C], NFKD: [0x1100, 0x1174, 0x11AF] }, +{ source: [0xAE1D], NFC: [0xAE1D], NFD: [0x1100, 0x1174, 0x11B0], NFKC: [0xAE1D], NFKD: [0x1100, 0x1174, 0x11B0] }, +{ source: [0xAE1E], NFC: [0xAE1E], NFD: [0x1100, 0x1174, 0x11B1], NFKC: [0xAE1E], NFKD: [0x1100, 0x1174, 0x11B1] }, +{ source: [0xAE1F], NFC: [0xAE1F], NFD: [0x1100, 0x1174, 0x11B2], NFKC: [0xAE1F], NFKD: [0x1100, 0x1174, 0x11B2] }, +{ source: [0xAE20], NFC: [0xAE20], NFD: [0x1100, 0x1174, 0x11B3], NFKC: [0xAE20], NFKD: [0x1100, 0x1174, 0x11B3] }, +{ source: [0xAE21], NFC: [0xAE21], NFD: [0x1100, 0x1174, 0x11B4], NFKC: [0xAE21], NFKD: [0x1100, 0x1174, 0x11B4] }, +{ source: [0xAE22], NFC: [0xAE22], NFD: [0x1100, 0x1174, 0x11B5], NFKC: [0xAE22], NFKD: [0x1100, 0x1174, 0x11B5] }, +{ source: [0xAE23], NFC: [0xAE23], NFD: [0x1100, 0x1174, 0x11B6], NFKC: [0xAE23], NFKD: [0x1100, 0x1174, 0x11B6] }, +{ source: [0xAE24], NFC: [0xAE24], NFD: [0x1100, 0x1174, 0x11B7], NFKC: [0xAE24], NFKD: [0x1100, 0x1174, 0x11B7] }, +{ source: [0xAE25], NFC: [0xAE25], NFD: [0x1100, 0x1174, 0x11B8], NFKC: [0xAE25], NFKD: [0x1100, 0x1174, 0x11B8] }, +{ source: [0xAE26], NFC: [0xAE26], NFD: [0x1100, 0x1174, 0x11B9], NFKC: [0xAE26], NFKD: [0x1100, 0x1174, 0x11B9] }, +{ source: [0xAE27], NFC: [0xAE27], NFD: [0x1100, 0x1174, 0x11BA], NFKC: [0xAE27], NFKD: [0x1100, 0x1174, 0x11BA] }, +{ source: [0xAE28], NFC: [0xAE28], NFD: [0x1100, 0x1174, 0x11BB], NFKC: [0xAE28], NFKD: [0x1100, 0x1174, 0x11BB] }, +{ source: [0xAE29], NFC: [0xAE29], NFD: [0x1100, 0x1174, 0x11BC], NFKC: [0xAE29], NFKD: [0x1100, 0x1174, 0x11BC] }, +{ source: [0xAE2A], NFC: [0xAE2A], NFD: [0x1100, 0x1174, 0x11BD], NFKC: [0xAE2A], NFKD: [0x1100, 0x1174, 0x11BD] }, +{ source: [0xAE2B], NFC: [0xAE2B], NFD: [0x1100, 0x1174, 0x11BE], NFKC: [0xAE2B], NFKD: [0x1100, 0x1174, 0x11BE] }, +{ source: [0xAE2C], NFC: [0xAE2C], NFD: [0x1100, 0x1174, 0x11BF], NFKC: [0xAE2C], NFKD: [0x1100, 0x1174, 0x11BF] }, +{ source: [0xAE2D], NFC: [0xAE2D], NFD: [0x1100, 0x1174, 0x11C0], NFKC: [0xAE2D], NFKD: [0x1100, 0x1174, 0x11C0] }, +{ source: [0xAE2E], NFC: [0xAE2E], NFD: [0x1100, 0x1174, 0x11C1], NFKC: [0xAE2E], NFKD: [0x1100, 0x1174, 0x11C1] }, +{ source: [0xAE2F], NFC: [0xAE2F], NFD: [0x1100, 0x1174, 0x11C2], NFKC: [0xAE2F], NFKD: [0x1100, 0x1174, 0x11C2] }, +{ source: [0xAE30], NFC: [0xAE30], NFD: [0x1100, 0x1175], NFKC: [0xAE30], NFKD: [0x1100, 0x1175] }, +{ source: [0xAE31], NFC: [0xAE31], NFD: [0x1100, 0x1175, 0x11A8], NFKC: [0xAE31], NFKD: [0x1100, 0x1175, 0x11A8] }, +{ source: [0xAE32], NFC: [0xAE32], NFD: [0x1100, 0x1175, 0x11A9], NFKC: [0xAE32], NFKD: [0x1100, 0x1175, 0x11A9] }, +{ source: [0xAE33], NFC: [0xAE33], NFD: [0x1100, 0x1175, 0x11AA], NFKC: [0xAE33], NFKD: [0x1100, 0x1175, 0x11AA] }, +{ source: [0xAE34], NFC: [0xAE34], NFD: [0x1100, 0x1175, 0x11AB], NFKC: [0xAE34], NFKD: [0x1100, 0x1175, 0x11AB] }, +{ source: [0xAE35], NFC: [0xAE35], NFD: [0x1100, 0x1175, 0x11AC], NFKC: [0xAE35], NFKD: [0x1100, 0x1175, 0x11AC] }, +{ source: [0xAE36], NFC: [0xAE36], NFD: [0x1100, 0x1175, 0x11AD], NFKC: [0xAE36], NFKD: [0x1100, 0x1175, 0x11AD] }, +{ source: [0xAE37], NFC: [0xAE37], NFD: [0x1100, 0x1175, 0x11AE], NFKC: [0xAE37], NFKD: [0x1100, 0x1175, 0x11AE] }, +{ source: [0xAE38], NFC: [0xAE38], NFD: [0x1100, 0x1175, 0x11AF], NFKC: [0xAE38], NFKD: [0x1100, 0x1175, 0x11AF] }, +{ source: [0xAE39], NFC: [0xAE39], NFD: [0x1100, 0x1175, 0x11B0], NFKC: [0xAE39], NFKD: [0x1100, 0x1175, 0x11B0] }, +{ source: [0xAE3A], NFC: [0xAE3A], NFD: [0x1100, 0x1175, 0x11B1], NFKC: [0xAE3A], NFKD: [0x1100, 0x1175, 0x11B1] }, +{ source: [0xAE3B], NFC: [0xAE3B], NFD: [0x1100, 0x1175, 0x11B2], NFKC: [0xAE3B], NFKD: [0x1100, 0x1175, 0x11B2] }, +{ source: [0xAE3C], NFC: [0xAE3C], NFD: [0x1100, 0x1175, 0x11B3], NFKC: [0xAE3C], NFKD: [0x1100, 0x1175, 0x11B3] }, +{ source: [0xAE3D], NFC: [0xAE3D], NFD: [0x1100, 0x1175, 0x11B4], NFKC: [0xAE3D], NFKD: [0x1100, 0x1175, 0x11B4] }, +{ source: [0xAE3E], NFC: [0xAE3E], NFD: [0x1100, 0x1175, 0x11B5], NFKC: [0xAE3E], NFKD: [0x1100, 0x1175, 0x11B5] }, +{ source: [0xAE3F], NFC: [0xAE3F], NFD: [0x1100, 0x1175, 0x11B6], NFKC: [0xAE3F], NFKD: [0x1100, 0x1175, 0x11B6] }, +{ source: [0xAE40], NFC: [0xAE40], NFD: [0x1100, 0x1175, 0x11B7], NFKC: [0xAE40], NFKD: [0x1100, 0x1175, 0x11B7] }, +{ source: [0xAE41], NFC: [0xAE41], NFD: [0x1100, 0x1175, 0x11B8], NFKC: [0xAE41], NFKD: [0x1100, 0x1175, 0x11B8] }, +{ source: [0xAE42], NFC: [0xAE42], NFD: [0x1100, 0x1175, 0x11B9], NFKC: [0xAE42], NFKD: [0x1100, 0x1175, 0x11B9] }, +{ source: [0xAE43], NFC: [0xAE43], NFD: [0x1100, 0x1175, 0x11BA], NFKC: [0xAE43], NFKD: [0x1100, 0x1175, 0x11BA] }, +{ source: [0xAE44], NFC: [0xAE44], NFD: [0x1100, 0x1175, 0x11BB], NFKC: [0xAE44], NFKD: [0x1100, 0x1175, 0x11BB] }, +{ source: [0xAE45], NFC: [0xAE45], NFD: [0x1100, 0x1175, 0x11BC], NFKC: [0xAE45], NFKD: [0x1100, 0x1175, 0x11BC] }, +{ source: [0xAE46], NFC: [0xAE46], NFD: [0x1100, 0x1175, 0x11BD], NFKC: [0xAE46], NFKD: [0x1100, 0x1175, 0x11BD] }, +{ source: [0xAE47], NFC: [0xAE47], NFD: [0x1100, 0x1175, 0x11BE], NFKC: [0xAE47], NFKD: [0x1100, 0x1175, 0x11BE] }, +{ source: [0xAE48], NFC: [0xAE48], NFD: [0x1100, 0x1175, 0x11BF], NFKC: [0xAE48], NFKD: [0x1100, 0x1175, 0x11BF] }, +{ source: [0xAE49], NFC: [0xAE49], NFD: [0x1100, 0x1175, 0x11C0], NFKC: [0xAE49], NFKD: [0x1100, 0x1175, 0x11C0] }, +{ source: [0xAE4A], NFC: [0xAE4A], NFD: [0x1100, 0x1175, 0x11C1], NFKC: [0xAE4A], NFKD: [0x1100, 0x1175, 0x11C1] }, +{ source: [0xAE4B], NFC: [0xAE4B], NFD: [0x1100, 0x1175, 0x11C2], NFKC: [0xAE4B], NFKD: [0x1100, 0x1175, 0x11C2] }, +{ source: [0xAE4C], NFC: [0xAE4C], NFD: [0x1101, 0x1161], NFKC: [0xAE4C], NFKD: [0x1101, 0x1161] }, +{ source: [0xAE4D], NFC: [0xAE4D], NFD: [0x1101, 0x1161, 0x11A8], NFKC: [0xAE4D], NFKD: [0x1101, 0x1161, 0x11A8] }, +{ source: [0xAE4E], NFC: [0xAE4E], NFD: [0x1101, 0x1161, 0x11A9], NFKC: [0xAE4E], NFKD: [0x1101, 0x1161, 0x11A9] }, +{ source: [0xAE4F], NFC: [0xAE4F], NFD: [0x1101, 0x1161, 0x11AA], NFKC: [0xAE4F], NFKD: [0x1101, 0x1161, 0x11AA] }, +{ source: [0xAE50], NFC: [0xAE50], NFD: [0x1101, 0x1161, 0x11AB], NFKC: [0xAE50], NFKD: [0x1101, 0x1161, 0x11AB] }, +{ source: [0xAE51], NFC: [0xAE51], NFD: [0x1101, 0x1161, 0x11AC], NFKC: [0xAE51], NFKD: [0x1101, 0x1161, 0x11AC] }, +{ source: [0xAE52], NFC: [0xAE52], NFD: [0x1101, 0x1161, 0x11AD], NFKC: [0xAE52], NFKD: [0x1101, 0x1161, 0x11AD] }, +{ source: [0xAE53], NFC: [0xAE53], NFD: [0x1101, 0x1161, 0x11AE], NFKC: [0xAE53], NFKD: [0x1101, 0x1161, 0x11AE] }, +{ source: [0xAE54], NFC: [0xAE54], NFD: [0x1101, 0x1161, 0x11AF], NFKC: [0xAE54], NFKD: [0x1101, 0x1161, 0x11AF] }, +{ source: [0xAE55], NFC: [0xAE55], NFD: [0x1101, 0x1161, 0x11B0], NFKC: [0xAE55], NFKD: [0x1101, 0x1161, 0x11B0] }, +{ source: [0xAE56], NFC: [0xAE56], NFD: [0x1101, 0x1161, 0x11B1], NFKC: [0xAE56], NFKD: [0x1101, 0x1161, 0x11B1] }, +{ source: [0xAE57], NFC: [0xAE57], NFD: [0x1101, 0x1161, 0x11B2], NFKC: [0xAE57], NFKD: [0x1101, 0x1161, 0x11B2] }, +{ source: [0xAE58], NFC: [0xAE58], NFD: [0x1101, 0x1161, 0x11B3], NFKC: [0xAE58], NFKD: [0x1101, 0x1161, 0x11B3] }, +{ source: [0xAE59], NFC: [0xAE59], NFD: [0x1101, 0x1161, 0x11B4], NFKC: [0xAE59], NFKD: [0x1101, 0x1161, 0x11B4] }, +{ source: [0xAE5A], NFC: [0xAE5A], NFD: [0x1101, 0x1161, 0x11B5], NFKC: [0xAE5A], NFKD: [0x1101, 0x1161, 0x11B5] }, +{ source: [0xAE5B], NFC: [0xAE5B], NFD: [0x1101, 0x1161, 0x11B6], NFKC: [0xAE5B], NFKD: [0x1101, 0x1161, 0x11B6] }, +{ source: [0xAE5C], NFC: [0xAE5C], NFD: [0x1101, 0x1161, 0x11B7], NFKC: [0xAE5C], NFKD: [0x1101, 0x1161, 0x11B7] }, +{ source: [0xAE5D], NFC: [0xAE5D], NFD: [0x1101, 0x1161, 0x11B8], NFKC: [0xAE5D], NFKD: [0x1101, 0x1161, 0x11B8] }, +{ source: [0xAE5E], NFC: [0xAE5E], NFD: [0x1101, 0x1161, 0x11B9], NFKC: [0xAE5E], NFKD: [0x1101, 0x1161, 0x11B9] }, +{ source: [0xAE5F], NFC: [0xAE5F], NFD: [0x1101, 0x1161, 0x11BA], NFKC: [0xAE5F], NFKD: [0x1101, 0x1161, 0x11BA] }, +{ source: [0xAE60], NFC: [0xAE60], NFD: [0x1101, 0x1161, 0x11BB], NFKC: [0xAE60], NFKD: [0x1101, 0x1161, 0x11BB] }, +{ source: [0xAE61], NFC: [0xAE61], NFD: [0x1101, 0x1161, 0x11BC], NFKC: [0xAE61], NFKD: [0x1101, 0x1161, 0x11BC] }, +{ source: [0xAE62], NFC: [0xAE62], NFD: [0x1101, 0x1161, 0x11BD], NFKC: [0xAE62], NFKD: [0x1101, 0x1161, 0x11BD] }, +{ source: [0xAE63], NFC: [0xAE63], NFD: [0x1101, 0x1161, 0x11BE], NFKC: [0xAE63], NFKD: [0x1101, 0x1161, 0x11BE] }, +{ source: [0xAE64], NFC: [0xAE64], NFD: [0x1101, 0x1161, 0x11BF], NFKC: [0xAE64], NFKD: [0x1101, 0x1161, 0x11BF] }, +{ source: [0xAE65], NFC: [0xAE65], NFD: [0x1101, 0x1161, 0x11C0], NFKC: [0xAE65], NFKD: [0x1101, 0x1161, 0x11C0] }, +{ source: [0xAE66], NFC: [0xAE66], NFD: [0x1101, 0x1161, 0x11C1], NFKC: [0xAE66], NFKD: [0x1101, 0x1161, 0x11C1] }, +{ source: [0xAE67], NFC: [0xAE67], NFD: [0x1101, 0x1161, 0x11C2], NFKC: [0xAE67], NFKD: [0x1101, 0x1161, 0x11C2] }, +{ source: [0xAE68], NFC: [0xAE68], NFD: [0x1101, 0x1162], NFKC: [0xAE68], NFKD: [0x1101, 0x1162] }, +{ source: [0xAE69], NFC: [0xAE69], NFD: [0x1101, 0x1162, 0x11A8], NFKC: [0xAE69], NFKD: [0x1101, 0x1162, 0x11A8] }, +{ source: [0xAE6A], NFC: [0xAE6A], NFD: [0x1101, 0x1162, 0x11A9], NFKC: [0xAE6A], NFKD: [0x1101, 0x1162, 0x11A9] }, +{ source: [0xAE6B], NFC: [0xAE6B], NFD: [0x1101, 0x1162, 0x11AA], NFKC: [0xAE6B], NFKD: [0x1101, 0x1162, 0x11AA] }, +{ source: [0xAE6C], NFC: [0xAE6C], NFD: [0x1101, 0x1162, 0x11AB], NFKC: [0xAE6C], NFKD: [0x1101, 0x1162, 0x11AB] }, +{ source: [0xAE6D], NFC: [0xAE6D], NFD: [0x1101, 0x1162, 0x11AC], NFKC: [0xAE6D], NFKD: [0x1101, 0x1162, 0x11AC] }, +{ source: [0xAE6E], NFC: [0xAE6E], NFD: [0x1101, 0x1162, 0x11AD], NFKC: [0xAE6E], NFKD: [0x1101, 0x1162, 0x11AD] }, +{ source: [0xAE6F], NFC: [0xAE6F], NFD: [0x1101, 0x1162, 0x11AE], NFKC: [0xAE6F], NFKD: [0x1101, 0x1162, 0x11AE] }, +{ source: [0xAE70], NFC: [0xAE70], NFD: [0x1101, 0x1162, 0x11AF], NFKC: [0xAE70], NFKD: [0x1101, 0x1162, 0x11AF] }, +{ source: [0xAE71], NFC: [0xAE71], NFD: [0x1101, 0x1162, 0x11B0], NFKC: [0xAE71], NFKD: [0x1101, 0x1162, 0x11B0] }, +{ source: [0xAE72], NFC: [0xAE72], NFD: [0x1101, 0x1162, 0x11B1], NFKC: [0xAE72], NFKD: [0x1101, 0x1162, 0x11B1] }, +{ source: [0xAE73], NFC: [0xAE73], NFD: [0x1101, 0x1162, 0x11B2], NFKC: [0xAE73], NFKD: [0x1101, 0x1162, 0x11B2] }, +{ source: [0xAE74], NFC: [0xAE74], NFD: [0x1101, 0x1162, 0x11B3], NFKC: [0xAE74], NFKD: [0x1101, 0x1162, 0x11B3] }, +{ source: [0xAE75], NFC: [0xAE75], NFD: [0x1101, 0x1162, 0x11B4], NFKC: [0xAE75], NFKD: [0x1101, 0x1162, 0x11B4] }, +{ source: [0xAE76], NFC: [0xAE76], NFD: [0x1101, 0x1162, 0x11B5], NFKC: [0xAE76], NFKD: [0x1101, 0x1162, 0x11B5] }, +{ source: [0xAE77], NFC: [0xAE77], NFD: [0x1101, 0x1162, 0x11B6], NFKC: [0xAE77], NFKD: [0x1101, 0x1162, 0x11B6] }, +{ source: [0xAE78], NFC: [0xAE78], NFD: [0x1101, 0x1162, 0x11B7], NFKC: [0xAE78], NFKD: [0x1101, 0x1162, 0x11B7] }, +{ source: [0xAE79], NFC: [0xAE79], NFD: [0x1101, 0x1162, 0x11B8], NFKC: [0xAE79], NFKD: [0x1101, 0x1162, 0x11B8] }, +{ source: [0xAE7A], NFC: [0xAE7A], NFD: [0x1101, 0x1162, 0x11B9], NFKC: [0xAE7A], NFKD: [0x1101, 0x1162, 0x11B9] }, +{ source: [0xAE7B], NFC: [0xAE7B], NFD: [0x1101, 0x1162, 0x11BA], NFKC: [0xAE7B], NFKD: [0x1101, 0x1162, 0x11BA] }, +{ source: [0xAE7C], NFC: [0xAE7C], NFD: [0x1101, 0x1162, 0x11BB], NFKC: [0xAE7C], NFKD: [0x1101, 0x1162, 0x11BB] }, +{ source: [0xAE7D], NFC: [0xAE7D], NFD: [0x1101, 0x1162, 0x11BC], NFKC: [0xAE7D], NFKD: [0x1101, 0x1162, 0x11BC] }, +{ source: [0xAE7E], NFC: [0xAE7E], NFD: [0x1101, 0x1162, 0x11BD], NFKC: [0xAE7E], NFKD: [0x1101, 0x1162, 0x11BD] }, +{ source: [0xAE7F], NFC: [0xAE7F], NFD: [0x1101, 0x1162, 0x11BE], NFKC: [0xAE7F], NFKD: [0x1101, 0x1162, 0x11BE] }, +{ source: [0xAE80], NFC: [0xAE80], NFD: [0x1101, 0x1162, 0x11BF], NFKC: [0xAE80], NFKD: [0x1101, 0x1162, 0x11BF] }, +{ source: [0xAE81], NFC: [0xAE81], NFD: [0x1101, 0x1162, 0x11C0], NFKC: [0xAE81], NFKD: [0x1101, 0x1162, 0x11C0] }, +{ source: [0xAE82], NFC: [0xAE82], NFD: [0x1101, 0x1162, 0x11C1], NFKC: [0xAE82], NFKD: [0x1101, 0x1162, 0x11C1] }, +{ source: [0xAE83], NFC: [0xAE83], NFD: [0x1101, 0x1162, 0x11C2], NFKC: [0xAE83], NFKD: [0x1101, 0x1162, 0x11C2] }, +{ source: [0xAE84], NFC: [0xAE84], NFD: [0x1101, 0x1163], NFKC: [0xAE84], NFKD: [0x1101, 0x1163] }, +{ source: [0xAE85], NFC: [0xAE85], NFD: [0x1101, 0x1163, 0x11A8], NFKC: [0xAE85], NFKD: [0x1101, 0x1163, 0x11A8] }, +{ source: [0xAE86], NFC: [0xAE86], NFD: [0x1101, 0x1163, 0x11A9], NFKC: [0xAE86], NFKD: [0x1101, 0x1163, 0x11A9] }, +{ source: [0xAE87], NFC: [0xAE87], NFD: [0x1101, 0x1163, 0x11AA], NFKC: [0xAE87], NFKD: [0x1101, 0x1163, 0x11AA] }, +{ source: [0xAE88], NFC: [0xAE88], NFD: [0x1101, 0x1163, 0x11AB], NFKC: [0xAE88], NFKD: [0x1101, 0x1163, 0x11AB] }, +{ source: [0xAE89], NFC: [0xAE89], NFD: [0x1101, 0x1163, 0x11AC], NFKC: [0xAE89], NFKD: [0x1101, 0x1163, 0x11AC] }, +{ source: [0xAE8A], NFC: [0xAE8A], NFD: [0x1101, 0x1163, 0x11AD], NFKC: [0xAE8A], NFKD: [0x1101, 0x1163, 0x11AD] }, +{ source: [0xAE8B], NFC: [0xAE8B], NFD: [0x1101, 0x1163, 0x11AE], NFKC: [0xAE8B], NFKD: [0x1101, 0x1163, 0x11AE] }, +{ source: [0xAE8C], NFC: [0xAE8C], NFD: [0x1101, 0x1163, 0x11AF], NFKC: [0xAE8C], NFKD: [0x1101, 0x1163, 0x11AF] }, +{ source: [0xAE8D], NFC: [0xAE8D], NFD: [0x1101, 0x1163, 0x11B0], NFKC: [0xAE8D], NFKD: [0x1101, 0x1163, 0x11B0] }, +{ source: [0xAE8E], NFC: [0xAE8E], NFD: [0x1101, 0x1163, 0x11B1], NFKC: [0xAE8E], NFKD: [0x1101, 0x1163, 0x11B1] }, +{ source: [0xAE8F], NFC: [0xAE8F], NFD: [0x1101, 0x1163, 0x11B2], NFKC: [0xAE8F], NFKD: [0x1101, 0x1163, 0x11B2] }, +{ source: [0xAE90], NFC: [0xAE90], NFD: [0x1101, 0x1163, 0x11B3], NFKC: [0xAE90], NFKD: [0x1101, 0x1163, 0x11B3] }, +{ source: [0xAE91], NFC: [0xAE91], NFD: [0x1101, 0x1163, 0x11B4], NFKC: [0xAE91], NFKD: [0x1101, 0x1163, 0x11B4] }, +{ source: [0xAE92], NFC: [0xAE92], NFD: [0x1101, 0x1163, 0x11B5], NFKC: [0xAE92], NFKD: [0x1101, 0x1163, 0x11B5] }, +{ source: [0xAE93], NFC: [0xAE93], NFD: [0x1101, 0x1163, 0x11B6], NFKC: [0xAE93], NFKD: [0x1101, 0x1163, 0x11B6] }, +{ source: [0xAE94], NFC: [0xAE94], NFD: [0x1101, 0x1163, 0x11B7], NFKC: [0xAE94], NFKD: [0x1101, 0x1163, 0x11B7] }, +{ source: [0xAE95], NFC: [0xAE95], NFD: [0x1101, 0x1163, 0x11B8], NFKC: [0xAE95], NFKD: [0x1101, 0x1163, 0x11B8] }, +{ source: [0xAE96], NFC: [0xAE96], NFD: [0x1101, 0x1163, 0x11B9], NFKC: [0xAE96], NFKD: [0x1101, 0x1163, 0x11B9] }, +{ source: [0xAE97], NFC: [0xAE97], NFD: [0x1101, 0x1163, 0x11BA], NFKC: [0xAE97], NFKD: [0x1101, 0x1163, 0x11BA] }, +{ source: [0xAE98], NFC: [0xAE98], NFD: [0x1101, 0x1163, 0x11BB], NFKC: [0xAE98], NFKD: [0x1101, 0x1163, 0x11BB] }, +{ source: [0xAE99], NFC: [0xAE99], NFD: [0x1101, 0x1163, 0x11BC], NFKC: [0xAE99], NFKD: [0x1101, 0x1163, 0x11BC] }, +{ source: [0xAE9A], NFC: [0xAE9A], NFD: [0x1101, 0x1163, 0x11BD], NFKC: [0xAE9A], NFKD: [0x1101, 0x1163, 0x11BD] }, +{ source: [0xAE9B], NFC: [0xAE9B], NFD: [0x1101, 0x1163, 0x11BE], NFKC: [0xAE9B], NFKD: [0x1101, 0x1163, 0x11BE] }, +{ source: [0xAE9C], NFC: [0xAE9C], NFD: [0x1101, 0x1163, 0x11BF], NFKC: [0xAE9C], NFKD: [0x1101, 0x1163, 0x11BF] }, +{ source: [0xAE9D], NFC: [0xAE9D], NFD: [0x1101, 0x1163, 0x11C0], NFKC: [0xAE9D], NFKD: [0x1101, 0x1163, 0x11C0] }, +{ source: [0xAE9E], NFC: [0xAE9E], NFD: [0x1101, 0x1163, 0x11C1], NFKC: [0xAE9E], NFKD: [0x1101, 0x1163, 0x11C1] }, +{ source: [0xAE9F], NFC: [0xAE9F], NFD: [0x1101, 0x1163, 0x11C2], NFKC: [0xAE9F], NFKD: [0x1101, 0x1163, 0x11C2] }, +{ source: [0xAEA0], NFC: [0xAEA0], NFD: [0x1101, 0x1164], NFKC: [0xAEA0], NFKD: [0x1101, 0x1164] }, +{ source: [0xAEA1], NFC: [0xAEA1], NFD: [0x1101, 0x1164, 0x11A8], NFKC: [0xAEA1], NFKD: [0x1101, 0x1164, 0x11A8] }, +{ source: [0xAEA2], NFC: [0xAEA2], NFD: [0x1101, 0x1164, 0x11A9], NFKC: [0xAEA2], NFKD: [0x1101, 0x1164, 0x11A9] }, +{ source: [0xAEA3], NFC: [0xAEA3], NFD: [0x1101, 0x1164, 0x11AA], NFKC: [0xAEA3], NFKD: [0x1101, 0x1164, 0x11AA] }, +{ source: [0xAEA4], NFC: [0xAEA4], NFD: [0x1101, 0x1164, 0x11AB], NFKC: [0xAEA4], NFKD: [0x1101, 0x1164, 0x11AB] }, +{ source: [0xAEA5], NFC: [0xAEA5], NFD: [0x1101, 0x1164, 0x11AC], NFKC: [0xAEA5], NFKD: [0x1101, 0x1164, 0x11AC] }, +{ source: [0xAEA6], NFC: [0xAEA6], NFD: [0x1101, 0x1164, 0x11AD], NFKC: [0xAEA6], NFKD: [0x1101, 0x1164, 0x11AD] }, +{ source: [0xAEA7], NFC: [0xAEA7], NFD: [0x1101, 0x1164, 0x11AE], NFKC: [0xAEA7], NFKD: [0x1101, 0x1164, 0x11AE] }, +{ source: [0xAEA8], NFC: [0xAEA8], NFD: [0x1101, 0x1164, 0x11AF], NFKC: [0xAEA8], NFKD: [0x1101, 0x1164, 0x11AF] }, +{ source: [0xAEA9], NFC: [0xAEA9], NFD: [0x1101, 0x1164, 0x11B0], NFKC: [0xAEA9], NFKD: [0x1101, 0x1164, 0x11B0] }, +{ source: [0xAEAA], NFC: [0xAEAA], NFD: [0x1101, 0x1164, 0x11B1], NFKC: [0xAEAA], NFKD: [0x1101, 0x1164, 0x11B1] }, +{ source: [0xAEAB], NFC: [0xAEAB], NFD: [0x1101, 0x1164, 0x11B2], NFKC: [0xAEAB], NFKD: [0x1101, 0x1164, 0x11B2] }, +{ source: [0xAEAC], NFC: [0xAEAC], NFD: [0x1101, 0x1164, 0x11B3], NFKC: [0xAEAC], NFKD: [0x1101, 0x1164, 0x11B3] }, +{ source: [0xAEAD], NFC: [0xAEAD], NFD: [0x1101, 0x1164, 0x11B4], NFKC: [0xAEAD], NFKD: [0x1101, 0x1164, 0x11B4] }, +{ source: [0xAEAE], NFC: [0xAEAE], NFD: [0x1101, 0x1164, 0x11B5], NFKC: [0xAEAE], NFKD: [0x1101, 0x1164, 0x11B5] }, +{ source: [0xAEAF], NFC: [0xAEAF], NFD: [0x1101, 0x1164, 0x11B6], NFKC: [0xAEAF], NFKD: [0x1101, 0x1164, 0x11B6] }, +{ source: [0xAEB0], NFC: [0xAEB0], NFD: [0x1101, 0x1164, 0x11B7], NFKC: [0xAEB0], NFKD: [0x1101, 0x1164, 0x11B7] }, +{ source: [0xAEB1], NFC: [0xAEB1], NFD: [0x1101, 0x1164, 0x11B8], NFKC: [0xAEB1], NFKD: [0x1101, 0x1164, 0x11B8] }, +{ source: [0xAEB2], NFC: [0xAEB2], NFD: [0x1101, 0x1164, 0x11B9], NFKC: [0xAEB2], NFKD: [0x1101, 0x1164, 0x11B9] }, +{ source: [0xAEB3], NFC: [0xAEB3], NFD: [0x1101, 0x1164, 0x11BA], NFKC: [0xAEB3], NFKD: [0x1101, 0x1164, 0x11BA] }, +{ source: [0xAEB4], NFC: [0xAEB4], NFD: [0x1101, 0x1164, 0x11BB], NFKC: [0xAEB4], NFKD: [0x1101, 0x1164, 0x11BB] }, +{ source: [0xAEB5], NFC: [0xAEB5], NFD: [0x1101, 0x1164, 0x11BC], NFKC: [0xAEB5], NFKD: [0x1101, 0x1164, 0x11BC] }, +{ source: [0xAEB6], NFC: [0xAEB6], NFD: [0x1101, 0x1164, 0x11BD], NFKC: [0xAEB6], NFKD: [0x1101, 0x1164, 0x11BD] }, +{ source: [0xAEB7], NFC: [0xAEB7], NFD: [0x1101, 0x1164, 0x11BE], NFKC: [0xAEB7], NFKD: [0x1101, 0x1164, 0x11BE] }, +{ source: [0xAEB8], NFC: [0xAEB8], NFD: [0x1101, 0x1164, 0x11BF], NFKC: [0xAEB8], NFKD: [0x1101, 0x1164, 0x11BF] }, +{ source: [0xAEB9], NFC: [0xAEB9], NFD: [0x1101, 0x1164, 0x11C0], NFKC: [0xAEB9], NFKD: [0x1101, 0x1164, 0x11C0] }, +{ source: [0xAEBA], NFC: [0xAEBA], NFD: [0x1101, 0x1164, 0x11C1], NFKC: [0xAEBA], NFKD: [0x1101, 0x1164, 0x11C1] }, +{ source: [0xAEBB], NFC: [0xAEBB], NFD: [0x1101, 0x1164, 0x11C2], NFKC: [0xAEBB], NFKD: [0x1101, 0x1164, 0x11C2] }, +{ source: [0xAEBC], NFC: [0xAEBC], NFD: [0x1101, 0x1165], NFKC: [0xAEBC], NFKD: [0x1101, 0x1165] }, +{ source: [0xAEBD], NFC: [0xAEBD], NFD: [0x1101, 0x1165, 0x11A8], NFKC: [0xAEBD], NFKD: [0x1101, 0x1165, 0x11A8] }, +{ source: [0xAEBE], NFC: [0xAEBE], NFD: [0x1101, 0x1165, 0x11A9], NFKC: [0xAEBE], NFKD: [0x1101, 0x1165, 0x11A9] }, +{ source: [0xAEBF], NFC: [0xAEBF], NFD: [0x1101, 0x1165, 0x11AA], NFKC: [0xAEBF], NFKD: [0x1101, 0x1165, 0x11AA] }, +{ source: [0xAEC0], NFC: [0xAEC0], NFD: [0x1101, 0x1165, 0x11AB], NFKC: [0xAEC0], NFKD: [0x1101, 0x1165, 0x11AB] }, +{ source: [0xAEC1], NFC: [0xAEC1], NFD: [0x1101, 0x1165, 0x11AC], NFKC: [0xAEC1], NFKD: [0x1101, 0x1165, 0x11AC] }, +{ source: [0xAEC2], NFC: [0xAEC2], NFD: [0x1101, 0x1165, 0x11AD], NFKC: [0xAEC2], NFKD: [0x1101, 0x1165, 0x11AD] }, +{ source: [0xAEC3], NFC: [0xAEC3], NFD: [0x1101, 0x1165, 0x11AE], NFKC: [0xAEC3], NFKD: [0x1101, 0x1165, 0x11AE] }, +{ source: [0xAEC4], NFC: [0xAEC4], NFD: [0x1101, 0x1165, 0x11AF], NFKC: [0xAEC4], NFKD: [0x1101, 0x1165, 0x11AF] }, +{ source: [0xAEC5], NFC: [0xAEC5], NFD: [0x1101, 0x1165, 0x11B0], NFKC: [0xAEC5], NFKD: [0x1101, 0x1165, 0x11B0] }, +{ source: [0xAEC6], NFC: [0xAEC6], NFD: [0x1101, 0x1165, 0x11B1], NFKC: [0xAEC6], NFKD: [0x1101, 0x1165, 0x11B1] }, +{ source: [0xAEC7], NFC: [0xAEC7], NFD: [0x1101, 0x1165, 0x11B2], NFKC: [0xAEC7], NFKD: [0x1101, 0x1165, 0x11B2] }, +{ source: [0xAEC8], NFC: [0xAEC8], NFD: [0x1101, 0x1165, 0x11B3], NFKC: [0xAEC8], NFKD: [0x1101, 0x1165, 0x11B3] }, +{ source: [0xAEC9], NFC: [0xAEC9], NFD: [0x1101, 0x1165, 0x11B4], NFKC: [0xAEC9], NFKD: [0x1101, 0x1165, 0x11B4] }, +{ source: [0xAECA], NFC: [0xAECA], NFD: [0x1101, 0x1165, 0x11B5], NFKC: [0xAECA], NFKD: [0x1101, 0x1165, 0x11B5] }, +{ source: [0xAECB], NFC: [0xAECB], NFD: [0x1101, 0x1165, 0x11B6], NFKC: [0xAECB], NFKD: [0x1101, 0x1165, 0x11B6] }, +{ source: [0xAECC], NFC: [0xAECC], NFD: [0x1101, 0x1165, 0x11B7], NFKC: [0xAECC], NFKD: [0x1101, 0x1165, 0x11B7] }, +{ source: [0xAECD], NFC: [0xAECD], NFD: [0x1101, 0x1165, 0x11B8], NFKC: [0xAECD], NFKD: [0x1101, 0x1165, 0x11B8] }, +{ source: [0xAECE], NFC: [0xAECE], NFD: [0x1101, 0x1165, 0x11B9], NFKC: [0xAECE], NFKD: [0x1101, 0x1165, 0x11B9] }, +{ source: [0xAECF], NFC: [0xAECF], NFD: [0x1101, 0x1165, 0x11BA], NFKC: [0xAECF], NFKD: [0x1101, 0x1165, 0x11BA] }, +{ source: [0xAED0], NFC: [0xAED0], NFD: [0x1101, 0x1165, 0x11BB], NFKC: [0xAED0], NFKD: [0x1101, 0x1165, 0x11BB] }, +{ source: [0xAED1], NFC: [0xAED1], NFD: [0x1101, 0x1165, 0x11BC], NFKC: [0xAED1], NFKD: [0x1101, 0x1165, 0x11BC] }, +{ source: [0xAED2], NFC: [0xAED2], NFD: [0x1101, 0x1165, 0x11BD], NFKC: [0xAED2], NFKD: [0x1101, 0x1165, 0x11BD] }, +{ source: [0xAED3], NFC: [0xAED3], NFD: [0x1101, 0x1165, 0x11BE], NFKC: [0xAED3], NFKD: [0x1101, 0x1165, 0x11BE] }, +{ source: [0xAED4], NFC: [0xAED4], NFD: [0x1101, 0x1165, 0x11BF], NFKC: [0xAED4], NFKD: [0x1101, 0x1165, 0x11BF] }, +{ source: [0xAED5], NFC: [0xAED5], NFD: [0x1101, 0x1165, 0x11C0], NFKC: [0xAED5], NFKD: [0x1101, 0x1165, 0x11C0] }, +{ source: [0xAED6], NFC: [0xAED6], NFD: [0x1101, 0x1165, 0x11C1], NFKC: [0xAED6], NFKD: [0x1101, 0x1165, 0x11C1] }, +{ source: [0xAED7], NFC: [0xAED7], NFD: [0x1101, 0x1165, 0x11C2], NFKC: [0xAED7], NFKD: [0x1101, 0x1165, 0x11C2] }, +{ source: [0xAED8], NFC: [0xAED8], NFD: [0x1101, 0x1166], NFKC: [0xAED8], NFKD: [0x1101, 0x1166] }, +{ source: [0xAED9], NFC: [0xAED9], NFD: [0x1101, 0x1166, 0x11A8], NFKC: [0xAED9], NFKD: [0x1101, 0x1166, 0x11A8] }, +{ source: [0xAEDA], NFC: [0xAEDA], NFD: [0x1101, 0x1166, 0x11A9], NFKC: [0xAEDA], NFKD: [0x1101, 0x1166, 0x11A9] }, +{ source: [0xAEDB], NFC: [0xAEDB], NFD: [0x1101, 0x1166, 0x11AA], NFKC: [0xAEDB], NFKD: [0x1101, 0x1166, 0x11AA] }, +{ source: [0xAEDC], NFC: [0xAEDC], NFD: [0x1101, 0x1166, 0x11AB], NFKC: [0xAEDC], NFKD: [0x1101, 0x1166, 0x11AB] }, +{ source: [0xAEDD], NFC: [0xAEDD], NFD: [0x1101, 0x1166, 0x11AC], NFKC: [0xAEDD], NFKD: [0x1101, 0x1166, 0x11AC] }, +{ source: [0xAEDE], NFC: [0xAEDE], NFD: [0x1101, 0x1166, 0x11AD], NFKC: [0xAEDE], NFKD: [0x1101, 0x1166, 0x11AD] }, +{ source: [0xAEDF], NFC: [0xAEDF], NFD: [0x1101, 0x1166, 0x11AE], NFKC: [0xAEDF], NFKD: [0x1101, 0x1166, 0x11AE] }, +{ source: [0xAEE0], NFC: [0xAEE0], NFD: [0x1101, 0x1166, 0x11AF], NFKC: [0xAEE0], NFKD: [0x1101, 0x1166, 0x11AF] }, +{ source: [0xAEE1], NFC: [0xAEE1], NFD: [0x1101, 0x1166, 0x11B0], NFKC: [0xAEE1], NFKD: [0x1101, 0x1166, 0x11B0] }, +{ source: [0xAEE2], NFC: [0xAEE2], NFD: [0x1101, 0x1166, 0x11B1], NFKC: [0xAEE2], NFKD: [0x1101, 0x1166, 0x11B1] }, +{ source: [0xAEE3], NFC: [0xAEE3], NFD: [0x1101, 0x1166, 0x11B2], NFKC: [0xAEE3], NFKD: [0x1101, 0x1166, 0x11B2] }, +{ source: [0xAEE4], NFC: [0xAEE4], NFD: [0x1101, 0x1166, 0x11B3], NFKC: [0xAEE4], NFKD: [0x1101, 0x1166, 0x11B3] }, +{ source: [0xAEE5], NFC: [0xAEE5], NFD: [0x1101, 0x1166, 0x11B4], NFKC: [0xAEE5], NFKD: [0x1101, 0x1166, 0x11B4] }, +{ source: [0xAEE6], NFC: [0xAEE6], NFD: [0x1101, 0x1166, 0x11B5], NFKC: [0xAEE6], NFKD: [0x1101, 0x1166, 0x11B5] }, +{ source: [0xAEE7], NFC: [0xAEE7], NFD: [0x1101, 0x1166, 0x11B6], NFKC: [0xAEE7], NFKD: [0x1101, 0x1166, 0x11B6] }, +{ source: [0xAEE8], NFC: [0xAEE8], NFD: [0x1101, 0x1166, 0x11B7], NFKC: [0xAEE8], NFKD: [0x1101, 0x1166, 0x11B7] }, +{ source: [0xAEE9], NFC: [0xAEE9], NFD: [0x1101, 0x1166, 0x11B8], NFKC: [0xAEE9], NFKD: [0x1101, 0x1166, 0x11B8] }, +{ source: [0xAEEA], NFC: [0xAEEA], NFD: [0x1101, 0x1166, 0x11B9], NFKC: [0xAEEA], NFKD: [0x1101, 0x1166, 0x11B9] }, +{ source: [0xAEEB], NFC: [0xAEEB], NFD: [0x1101, 0x1166, 0x11BA], NFKC: [0xAEEB], NFKD: [0x1101, 0x1166, 0x11BA] }, +{ source: [0xAEEC], NFC: [0xAEEC], NFD: [0x1101, 0x1166, 0x11BB], NFKC: [0xAEEC], NFKD: [0x1101, 0x1166, 0x11BB] }, +{ source: [0xAEED], NFC: [0xAEED], NFD: [0x1101, 0x1166, 0x11BC], NFKC: [0xAEED], NFKD: [0x1101, 0x1166, 0x11BC] }, +{ source: [0xAEEE], NFC: [0xAEEE], NFD: [0x1101, 0x1166, 0x11BD], NFKC: [0xAEEE], NFKD: [0x1101, 0x1166, 0x11BD] }, +{ source: [0xAEEF], NFC: [0xAEEF], NFD: [0x1101, 0x1166, 0x11BE], NFKC: [0xAEEF], NFKD: [0x1101, 0x1166, 0x11BE] }, +{ source: [0xAEF0], NFC: [0xAEF0], NFD: [0x1101, 0x1166, 0x11BF], NFKC: [0xAEF0], NFKD: [0x1101, 0x1166, 0x11BF] }, +{ source: [0xAEF1], NFC: [0xAEF1], NFD: [0x1101, 0x1166, 0x11C0], NFKC: [0xAEF1], NFKD: [0x1101, 0x1166, 0x11C0] }, +{ source: [0xAEF2], NFC: [0xAEF2], NFD: [0x1101, 0x1166, 0x11C1], NFKC: [0xAEF2], NFKD: [0x1101, 0x1166, 0x11C1] }, +{ source: [0xAEF3], NFC: [0xAEF3], NFD: [0x1101, 0x1166, 0x11C2], NFKC: [0xAEF3], NFKD: [0x1101, 0x1166, 0x11C2] }, +{ source: [0xAEF4], NFC: [0xAEF4], NFD: [0x1101, 0x1167], NFKC: [0xAEF4], NFKD: [0x1101, 0x1167] }, +{ source: [0xAEF5], NFC: [0xAEF5], NFD: [0x1101, 0x1167, 0x11A8], NFKC: [0xAEF5], NFKD: [0x1101, 0x1167, 0x11A8] }, +{ source: [0xAEF6], NFC: [0xAEF6], NFD: [0x1101, 0x1167, 0x11A9], NFKC: [0xAEF6], NFKD: [0x1101, 0x1167, 0x11A9] }, +{ source: [0xAEF7], NFC: [0xAEF7], NFD: [0x1101, 0x1167, 0x11AA], NFKC: [0xAEF7], NFKD: [0x1101, 0x1167, 0x11AA] }, +{ source: [0xAEF8], NFC: [0xAEF8], NFD: [0x1101, 0x1167, 0x11AB], NFKC: [0xAEF8], NFKD: [0x1101, 0x1167, 0x11AB] }, +{ source: [0xAEF9], NFC: [0xAEF9], NFD: [0x1101, 0x1167, 0x11AC], NFKC: [0xAEF9], NFKD: [0x1101, 0x1167, 0x11AC] }, +{ source: [0xAEFA], NFC: [0xAEFA], NFD: [0x1101, 0x1167, 0x11AD], NFKC: [0xAEFA], NFKD: [0x1101, 0x1167, 0x11AD] }, +{ source: [0xAEFB], NFC: [0xAEFB], NFD: [0x1101, 0x1167, 0x11AE], NFKC: [0xAEFB], NFKD: [0x1101, 0x1167, 0x11AE] }, +{ source: [0xAEFC], NFC: [0xAEFC], NFD: [0x1101, 0x1167, 0x11AF], NFKC: [0xAEFC], NFKD: [0x1101, 0x1167, 0x11AF] }, +{ source: [0xAEFD], NFC: [0xAEFD], NFD: [0x1101, 0x1167, 0x11B0], NFKC: [0xAEFD], NFKD: [0x1101, 0x1167, 0x11B0] }, +{ source: [0xAEFE], NFC: [0xAEFE], NFD: [0x1101, 0x1167, 0x11B1], NFKC: [0xAEFE], NFKD: [0x1101, 0x1167, 0x11B1] }, +{ source: [0xAEFF], NFC: [0xAEFF], NFD: [0x1101, 0x1167, 0x11B2], NFKC: [0xAEFF], NFKD: [0x1101, 0x1167, 0x11B2] }, +{ source: [0xAF00], NFC: [0xAF00], NFD: [0x1101, 0x1167, 0x11B3], NFKC: [0xAF00], NFKD: [0x1101, 0x1167, 0x11B3] }, +{ source: [0xAF01], NFC: [0xAF01], NFD: [0x1101, 0x1167, 0x11B4], NFKC: [0xAF01], NFKD: [0x1101, 0x1167, 0x11B4] }, +{ source: [0xAF02], NFC: [0xAF02], NFD: [0x1101, 0x1167, 0x11B5], NFKC: [0xAF02], NFKD: [0x1101, 0x1167, 0x11B5] }, +{ source: [0xAF03], NFC: [0xAF03], NFD: [0x1101, 0x1167, 0x11B6], NFKC: [0xAF03], NFKD: [0x1101, 0x1167, 0x11B6] }, +{ source: [0xAF04], NFC: [0xAF04], NFD: [0x1101, 0x1167, 0x11B7], NFKC: [0xAF04], NFKD: [0x1101, 0x1167, 0x11B7] }, +{ source: [0xAF05], NFC: [0xAF05], NFD: [0x1101, 0x1167, 0x11B8], NFKC: [0xAF05], NFKD: [0x1101, 0x1167, 0x11B8] }, +{ source: [0xAF06], NFC: [0xAF06], NFD: [0x1101, 0x1167, 0x11B9], NFKC: [0xAF06], NFKD: [0x1101, 0x1167, 0x11B9] }, +{ source: [0xAF07], NFC: [0xAF07], NFD: [0x1101, 0x1167, 0x11BA], NFKC: [0xAF07], NFKD: [0x1101, 0x1167, 0x11BA] }, +{ source: [0xAF08], NFC: [0xAF08], NFD: [0x1101, 0x1167, 0x11BB], NFKC: [0xAF08], NFKD: [0x1101, 0x1167, 0x11BB] }, +{ source: [0xAF09], NFC: [0xAF09], NFD: [0x1101, 0x1167, 0x11BC], NFKC: [0xAF09], NFKD: [0x1101, 0x1167, 0x11BC] }, +{ source: [0xAF0A], NFC: [0xAF0A], NFD: [0x1101, 0x1167, 0x11BD], NFKC: [0xAF0A], NFKD: [0x1101, 0x1167, 0x11BD] }, +{ source: [0xAF0B], NFC: [0xAF0B], NFD: [0x1101, 0x1167, 0x11BE], NFKC: [0xAF0B], NFKD: [0x1101, 0x1167, 0x11BE] }, +{ source: [0xAF0C], NFC: [0xAF0C], NFD: [0x1101, 0x1167, 0x11BF], NFKC: [0xAF0C], NFKD: [0x1101, 0x1167, 0x11BF] }, +{ source: [0xAF0D], NFC: [0xAF0D], NFD: [0x1101, 0x1167, 0x11C0], NFKC: [0xAF0D], NFKD: [0x1101, 0x1167, 0x11C0] }, +{ source: [0xAF0E], NFC: [0xAF0E], NFD: [0x1101, 0x1167, 0x11C1], NFKC: [0xAF0E], NFKD: [0x1101, 0x1167, 0x11C1] }, +{ source: [0xAF0F], NFC: [0xAF0F], NFD: [0x1101, 0x1167, 0x11C2], NFKC: [0xAF0F], NFKD: [0x1101, 0x1167, 0x11C2] }, +{ source: [0xAF10], NFC: [0xAF10], NFD: [0x1101, 0x1168], NFKC: [0xAF10], NFKD: [0x1101, 0x1168] }, +{ source: [0xAF11], NFC: [0xAF11], NFD: [0x1101, 0x1168, 0x11A8], NFKC: [0xAF11], NFKD: [0x1101, 0x1168, 0x11A8] }, +{ source: [0xAF12], NFC: [0xAF12], NFD: [0x1101, 0x1168, 0x11A9], NFKC: [0xAF12], NFKD: [0x1101, 0x1168, 0x11A9] }, +{ source: [0xAF13], NFC: [0xAF13], NFD: [0x1101, 0x1168, 0x11AA], NFKC: [0xAF13], NFKD: [0x1101, 0x1168, 0x11AA] }, +{ source: [0xAF14], NFC: [0xAF14], NFD: [0x1101, 0x1168, 0x11AB], NFKC: [0xAF14], NFKD: [0x1101, 0x1168, 0x11AB] }, +{ source: [0xAF15], NFC: [0xAF15], NFD: [0x1101, 0x1168, 0x11AC], NFKC: [0xAF15], NFKD: [0x1101, 0x1168, 0x11AC] }, +{ source: [0xAF16], NFC: [0xAF16], NFD: [0x1101, 0x1168, 0x11AD], NFKC: [0xAF16], NFKD: [0x1101, 0x1168, 0x11AD] }, +{ source: [0xAF17], NFC: [0xAF17], NFD: [0x1101, 0x1168, 0x11AE], NFKC: [0xAF17], NFKD: [0x1101, 0x1168, 0x11AE] }, +{ source: [0xAF18], NFC: [0xAF18], NFD: [0x1101, 0x1168, 0x11AF], NFKC: [0xAF18], NFKD: [0x1101, 0x1168, 0x11AF] }, +{ source: [0xAF19], NFC: [0xAF19], NFD: [0x1101, 0x1168, 0x11B0], NFKC: [0xAF19], NFKD: [0x1101, 0x1168, 0x11B0] }, +{ source: [0xAF1A], NFC: [0xAF1A], NFD: [0x1101, 0x1168, 0x11B1], NFKC: [0xAF1A], NFKD: [0x1101, 0x1168, 0x11B1] }, +{ source: [0xAF1B], NFC: [0xAF1B], NFD: [0x1101, 0x1168, 0x11B2], NFKC: [0xAF1B], NFKD: [0x1101, 0x1168, 0x11B2] }, +{ source: [0xAF1C], NFC: [0xAF1C], NFD: [0x1101, 0x1168, 0x11B3], NFKC: [0xAF1C], NFKD: [0x1101, 0x1168, 0x11B3] }, +{ source: [0xAF1D], NFC: [0xAF1D], NFD: [0x1101, 0x1168, 0x11B4], NFKC: [0xAF1D], NFKD: [0x1101, 0x1168, 0x11B4] }, +{ source: [0xAF1E], NFC: [0xAF1E], NFD: [0x1101, 0x1168, 0x11B5], NFKC: [0xAF1E], NFKD: [0x1101, 0x1168, 0x11B5] }, +{ source: [0xAF1F], NFC: [0xAF1F], NFD: [0x1101, 0x1168, 0x11B6], NFKC: [0xAF1F], NFKD: [0x1101, 0x1168, 0x11B6] }, +{ source: [0xAF20], NFC: [0xAF20], NFD: [0x1101, 0x1168, 0x11B7], NFKC: [0xAF20], NFKD: [0x1101, 0x1168, 0x11B7] }, +{ source: [0xAF21], NFC: [0xAF21], NFD: [0x1101, 0x1168, 0x11B8], NFKC: [0xAF21], NFKD: [0x1101, 0x1168, 0x11B8] }, +{ source: [0xAF22], NFC: [0xAF22], NFD: [0x1101, 0x1168, 0x11B9], NFKC: [0xAF22], NFKD: [0x1101, 0x1168, 0x11B9] }, +{ source: [0xAF23], NFC: [0xAF23], NFD: [0x1101, 0x1168, 0x11BA], NFKC: [0xAF23], NFKD: [0x1101, 0x1168, 0x11BA] }, +{ source: [0xAF24], NFC: [0xAF24], NFD: [0x1101, 0x1168, 0x11BB], NFKC: [0xAF24], NFKD: [0x1101, 0x1168, 0x11BB] }, +{ source: [0xAF25], NFC: [0xAF25], NFD: [0x1101, 0x1168, 0x11BC], NFKC: [0xAF25], NFKD: [0x1101, 0x1168, 0x11BC] }, +{ source: [0xAF26], NFC: [0xAF26], NFD: [0x1101, 0x1168, 0x11BD], NFKC: [0xAF26], NFKD: [0x1101, 0x1168, 0x11BD] }, +{ source: [0xAF27], NFC: [0xAF27], NFD: [0x1101, 0x1168, 0x11BE], NFKC: [0xAF27], NFKD: [0x1101, 0x1168, 0x11BE] }, +{ source: [0xAF28], NFC: [0xAF28], NFD: [0x1101, 0x1168, 0x11BF], NFKC: [0xAF28], NFKD: [0x1101, 0x1168, 0x11BF] }, +{ source: [0xAF29], NFC: [0xAF29], NFD: [0x1101, 0x1168, 0x11C0], NFKC: [0xAF29], NFKD: [0x1101, 0x1168, 0x11C0] }, +{ source: [0xAF2A], NFC: [0xAF2A], NFD: [0x1101, 0x1168, 0x11C1], NFKC: [0xAF2A], NFKD: [0x1101, 0x1168, 0x11C1] }, +{ source: [0xAF2B], NFC: [0xAF2B], NFD: [0x1101, 0x1168, 0x11C2], NFKC: [0xAF2B], NFKD: [0x1101, 0x1168, 0x11C2] }, +{ source: [0xAF2C], NFC: [0xAF2C], NFD: [0x1101, 0x1169], NFKC: [0xAF2C], NFKD: [0x1101, 0x1169] }, +{ source: [0xAF2D], NFC: [0xAF2D], NFD: [0x1101, 0x1169, 0x11A8], NFKC: [0xAF2D], NFKD: [0x1101, 0x1169, 0x11A8] }, +{ source: [0xAF2E], NFC: [0xAF2E], NFD: [0x1101, 0x1169, 0x11A9], NFKC: [0xAF2E], NFKD: [0x1101, 0x1169, 0x11A9] }, +{ source: [0xAF2F], NFC: [0xAF2F], NFD: [0x1101, 0x1169, 0x11AA], NFKC: [0xAF2F], NFKD: [0x1101, 0x1169, 0x11AA] }, +{ source: [0xAF30], NFC: [0xAF30], NFD: [0x1101, 0x1169, 0x11AB], NFKC: [0xAF30], NFKD: [0x1101, 0x1169, 0x11AB] }, +{ source: [0xAF31], NFC: [0xAF31], NFD: [0x1101, 0x1169, 0x11AC], NFKC: [0xAF31], NFKD: [0x1101, 0x1169, 0x11AC] }, +{ source: [0xAF32], NFC: [0xAF32], NFD: [0x1101, 0x1169, 0x11AD], NFKC: [0xAF32], NFKD: [0x1101, 0x1169, 0x11AD] }, +{ source: [0xAF33], NFC: [0xAF33], NFD: [0x1101, 0x1169, 0x11AE], NFKC: [0xAF33], NFKD: [0x1101, 0x1169, 0x11AE] }, +{ source: [0xAF34], NFC: [0xAF34], NFD: [0x1101, 0x1169, 0x11AF], NFKC: [0xAF34], NFKD: [0x1101, 0x1169, 0x11AF] }, +{ source: [0xAF35], NFC: [0xAF35], NFD: [0x1101, 0x1169, 0x11B0], NFKC: [0xAF35], NFKD: [0x1101, 0x1169, 0x11B0] }, +{ source: [0xAF36], NFC: [0xAF36], NFD: [0x1101, 0x1169, 0x11B1], NFKC: [0xAF36], NFKD: [0x1101, 0x1169, 0x11B1] }, +{ source: [0xAF37], NFC: [0xAF37], NFD: [0x1101, 0x1169, 0x11B2], NFKC: [0xAF37], NFKD: [0x1101, 0x1169, 0x11B2] }, +{ source: [0xAF38], NFC: [0xAF38], NFD: [0x1101, 0x1169, 0x11B3], NFKC: [0xAF38], NFKD: [0x1101, 0x1169, 0x11B3] }, +{ source: [0xAF39], NFC: [0xAF39], NFD: [0x1101, 0x1169, 0x11B4], NFKC: [0xAF39], NFKD: [0x1101, 0x1169, 0x11B4] }, +{ source: [0xAF3A], NFC: [0xAF3A], NFD: [0x1101, 0x1169, 0x11B5], NFKC: [0xAF3A], NFKD: [0x1101, 0x1169, 0x11B5] }, +{ source: [0xAF3B], NFC: [0xAF3B], NFD: [0x1101, 0x1169, 0x11B6], NFKC: [0xAF3B], NFKD: [0x1101, 0x1169, 0x11B6] }, +{ source: [0xAF3C], NFC: [0xAF3C], NFD: [0x1101, 0x1169, 0x11B7], NFKC: [0xAF3C], NFKD: [0x1101, 0x1169, 0x11B7] }, +{ source: [0xAF3D], NFC: [0xAF3D], NFD: [0x1101, 0x1169, 0x11B8], NFKC: [0xAF3D], NFKD: [0x1101, 0x1169, 0x11B8] }, +{ source: [0xAF3E], NFC: [0xAF3E], NFD: [0x1101, 0x1169, 0x11B9], NFKC: [0xAF3E], NFKD: [0x1101, 0x1169, 0x11B9] }, +{ source: [0xAF3F], NFC: [0xAF3F], NFD: [0x1101, 0x1169, 0x11BA], NFKC: [0xAF3F], NFKD: [0x1101, 0x1169, 0x11BA] }, +{ source: [0xAF40], NFC: [0xAF40], NFD: [0x1101, 0x1169, 0x11BB], NFKC: [0xAF40], NFKD: [0x1101, 0x1169, 0x11BB] }, +{ source: [0xAF41], NFC: [0xAF41], NFD: [0x1101, 0x1169, 0x11BC], NFKC: [0xAF41], NFKD: [0x1101, 0x1169, 0x11BC] }, +{ source: [0xAF42], NFC: [0xAF42], NFD: [0x1101, 0x1169, 0x11BD], NFKC: [0xAF42], NFKD: [0x1101, 0x1169, 0x11BD] }, +{ source: [0xAF43], NFC: [0xAF43], NFD: [0x1101, 0x1169, 0x11BE], NFKC: [0xAF43], NFKD: [0x1101, 0x1169, 0x11BE] }, +{ source: [0xAF44], NFC: [0xAF44], NFD: [0x1101, 0x1169, 0x11BF], NFKC: [0xAF44], NFKD: [0x1101, 0x1169, 0x11BF] }, +{ source: [0xAF45], NFC: [0xAF45], NFD: [0x1101, 0x1169, 0x11C0], NFKC: [0xAF45], NFKD: [0x1101, 0x1169, 0x11C0] }, +{ source: [0xAF46], NFC: [0xAF46], NFD: [0x1101, 0x1169, 0x11C1], NFKC: [0xAF46], NFKD: [0x1101, 0x1169, 0x11C1] }, +{ source: [0xAF47], NFC: [0xAF47], NFD: [0x1101, 0x1169, 0x11C2], NFKC: [0xAF47], NFKD: [0x1101, 0x1169, 0x11C2] }, +{ source: [0xAF48], NFC: [0xAF48], NFD: [0x1101, 0x116A], NFKC: [0xAF48], NFKD: [0x1101, 0x116A] }, +{ source: [0xAF49], NFC: [0xAF49], NFD: [0x1101, 0x116A, 0x11A8], NFKC: [0xAF49], NFKD: [0x1101, 0x116A, 0x11A8] }, +{ source: [0xAF4A], NFC: [0xAF4A], NFD: [0x1101, 0x116A, 0x11A9], NFKC: [0xAF4A], NFKD: [0x1101, 0x116A, 0x11A9] }, +{ source: [0xAF4B], NFC: [0xAF4B], NFD: [0x1101, 0x116A, 0x11AA], NFKC: [0xAF4B], NFKD: [0x1101, 0x116A, 0x11AA] }, +{ source: [0xAF4C], NFC: [0xAF4C], NFD: [0x1101, 0x116A, 0x11AB], NFKC: [0xAF4C], NFKD: [0x1101, 0x116A, 0x11AB] }, +{ source: [0xAF4D], NFC: [0xAF4D], NFD: [0x1101, 0x116A, 0x11AC], NFKC: [0xAF4D], NFKD: [0x1101, 0x116A, 0x11AC] }, +{ source: [0xAF4E], NFC: [0xAF4E], NFD: [0x1101, 0x116A, 0x11AD], NFKC: [0xAF4E], NFKD: [0x1101, 0x116A, 0x11AD] }, +{ source: [0xAF4F], NFC: [0xAF4F], NFD: [0x1101, 0x116A, 0x11AE], NFKC: [0xAF4F], NFKD: [0x1101, 0x116A, 0x11AE] }, +{ source: [0xAF50], NFC: [0xAF50], NFD: [0x1101, 0x116A, 0x11AF], NFKC: [0xAF50], NFKD: [0x1101, 0x116A, 0x11AF] }, +{ source: [0xAF51], NFC: [0xAF51], NFD: [0x1101, 0x116A, 0x11B0], NFKC: [0xAF51], NFKD: [0x1101, 0x116A, 0x11B0] }, +{ source: [0xAF52], NFC: [0xAF52], NFD: [0x1101, 0x116A, 0x11B1], NFKC: [0xAF52], NFKD: [0x1101, 0x116A, 0x11B1] }, +{ source: [0xAF53], NFC: [0xAF53], NFD: [0x1101, 0x116A, 0x11B2], NFKC: [0xAF53], NFKD: [0x1101, 0x116A, 0x11B2] }, +{ source: [0xAF54], NFC: [0xAF54], NFD: [0x1101, 0x116A, 0x11B3], NFKC: [0xAF54], NFKD: [0x1101, 0x116A, 0x11B3] }, +{ source: [0xAF55], NFC: [0xAF55], NFD: [0x1101, 0x116A, 0x11B4], NFKC: [0xAF55], NFKD: [0x1101, 0x116A, 0x11B4] }, +{ source: [0xAF56], NFC: [0xAF56], NFD: [0x1101, 0x116A, 0x11B5], NFKC: [0xAF56], NFKD: [0x1101, 0x116A, 0x11B5] }, +{ source: [0xAF57], NFC: [0xAF57], NFD: [0x1101, 0x116A, 0x11B6], NFKC: [0xAF57], NFKD: [0x1101, 0x116A, 0x11B6] }, +{ source: [0xAF58], NFC: [0xAF58], NFD: [0x1101, 0x116A, 0x11B7], NFKC: [0xAF58], NFKD: [0x1101, 0x116A, 0x11B7] }, +{ source: [0xAF59], NFC: [0xAF59], NFD: [0x1101, 0x116A, 0x11B8], NFKC: [0xAF59], NFKD: [0x1101, 0x116A, 0x11B8] }, +{ source: [0xAF5A], NFC: [0xAF5A], NFD: [0x1101, 0x116A, 0x11B9], NFKC: [0xAF5A], NFKD: [0x1101, 0x116A, 0x11B9] }, +{ source: [0xAF5B], NFC: [0xAF5B], NFD: [0x1101, 0x116A, 0x11BA], NFKC: [0xAF5B], NFKD: [0x1101, 0x116A, 0x11BA] }, +{ source: [0xAF5C], NFC: [0xAF5C], NFD: [0x1101, 0x116A, 0x11BB], NFKC: [0xAF5C], NFKD: [0x1101, 0x116A, 0x11BB] }, +{ source: [0xAF5D], NFC: [0xAF5D], NFD: [0x1101, 0x116A, 0x11BC], NFKC: [0xAF5D], NFKD: [0x1101, 0x116A, 0x11BC] }, +{ source: [0xAF5E], NFC: [0xAF5E], NFD: [0x1101, 0x116A, 0x11BD], NFKC: [0xAF5E], NFKD: [0x1101, 0x116A, 0x11BD] }, +{ source: [0xAF5F], NFC: [0xAF5F], NFD: [0x1101, 0x116A, 0x11BE], NFKC: [0xAF5F], NFKD: [0x1101, 0x116A, 0x11BE] }, +{ source: [0xAF60], NFC: [0xAF60], NFD: [0x1101, 0x116A, 0x11BF], NFKC: [0xAF60], NFKD: [0x1101, 0x116A, 0x11BF] }, +{ source: [0xAF61], NFC: [0xAF61], NFD: [0x1101, 0x116A, 0x11C0], NFKC: [0xAF61], NFKD: [0x1101, 0x116A, 0x11C0] }, +{ source: [0xAF62], NFC: [0xAF62], NFD: [0x1101, 0x116A, 0x11C1], NFKC: [0xAF62], NFKD: [0x1101, 0x116A, 0x11C1] }, +{ source: [0xAF63], NFC: [0xAF63], NFD: [0x1101, 0x116A, 0x11C2], NFKC: [0xAF63], NFKD: [0x1101, 0x116A, 0x11C2] }, +{ source: [0xAF64], NFC: [0xAF64], NFD: [0x1101, 0x116B], NFKC: [0xAF64], NFKD: [0x1101, 0x116B] }, +{ source: [0xAF65], NFC: [0xAF65], NFD: [0x1101, 0x116B, 0x11A8], NFKC: [0xAF65], NFKD: [0x1101, 0x116B, 0x11A8] }, +{ source: [0xAF66], NFC: [0xAF66], NFD: [0x1101, 0x116B, 0x11A9], NFKC: [0xAF66], NFKD: [0x1101, 0x116B, 0x11A9] }, +{ source: [0xAF67], NFC: [0xAF67], NFD: [0x1101, 0x116B, 0x11AA], NFKC: [0xAF67], NFKD: [0x1101, 0x116B, 0x11AA] }, +{ source: [0xAF68], NFC: [0xAF68], NFD: [0x1101, 0x116B, 0x11AB], NFKC: [0xAF68], NFKD: [0x1101, 0x116B, 0x11AB] }, +{ source: [0xAF69], NFC: [0xAF69], NFD: [0x1101, 0x116B, 0x11AC], NFKC: [0xAF69], NFKD: [0x1101, 0x116B, 0x11AC] }, +{ source: [0xAF6A], NFC: [0xAF6A], NFD: [0x1101, 0x116B, 0x11AD], NFKC: [0xAF6A], NFKD: [0x1101, 0x116B, 0x11AD] }, +{ source: [0xAF6B], NFC: [0xAF6B], NFD: [0x1101, 0x116B, 0x11AE], NFKC: [0xAF6B], NFKD: [0x1101, 0x116B, 0x11AE] }, +{ source: [0xAF6C], NFC: [0xAF6C], NFD: [0x1101, 0x116B, 0x11AF], NFKC: [0xAF6C], NFKD: [0x1101, 0x116B, 0x11AF] }, +{ source: [0xAF6D], NFC: [0xAF6D], NFD: [0x1101, 0x116B, 0x11B0], NFKC: [0xAF6D], NFKD: [0x1101, 0x116B, 0x11B0] }, +{ source: [0xAF6E], NFC: [0xAF6E], NFD: [0x1101, 0x116B, 0x11B1], NFKC: [0xAF6E], NFKD: [0x1101, 0x116B, 0x11B1] }, +{ source: [0xAF6F], NFC: [0xAF6F], NFD: [0x1101, 0x116B, 0x11B2], NFKC: [0xAF6F], NFKD: [0x1101, 0x116B, 0x11B2] }, +{ source: [0xAF70], NFC: [0xAF70], NFD: [0x1101, 0x116B, 0x11B3], NFKC: [0xAF70], NFKD: [0x1101, 0x116B, 0x11B3] }, +{ source: [0xAF71], NFC: [0xAF71], NFD: [0x1101, 0x116B, 0x11B4], NFKC: [0xAF71], NFKD: [0x1101, 0x116B, 0x11B4] }, +{ source: [0xAF72], NFC: [0xAF72], NFD: [0x1101, 0x116B, 0x11B5], NFKC: [0xAF72], NFKD: [0x1101, 0x116B, 0x11B5] }, +{ source: [0xAF73], NFC: [0xAF73], NFD: [0x1101, 0x116B, 0x11B6], NFKC: [0xAF73], NFKD: [0x1101, 0x116B, 0x11B6] }, +{ source: [0xAF74], NFC: [0xAF74], NFD: [0x1101, 0x116B, 0x11B7], NFKC: [0xAF74], NFKD: [0x1101, 0x116B, 0x11B7] }, +{ source: [0xAF75], NFC: [0xAF75], NFD: [0x1101, 0x116B, 0x11B8], NFKC: [0xAF75], NFKD: [0x1101, 0x116B, 0x11B8] }, +{ source: [0xAF76], NFC: [0xAF76], NFD: [0x1101, 0x116B, 0x11B9], NFKC: [0xAF76], NFKD: [0x1101, 0x116B, 0x11B9] }, +{ source: [0xAF77], NFC: [0xAF77], NFD: [0x1101, 0x116B, 0x11BA], NFKC: [0xAF77], NFKD: [0x1101, 0x116B, 0x11BA] }, +{ source: [0xAF78], NFC: [0xAF78], NFD: [0x1101, 0x116B, 0x11BB], NFKC: [0xAF78], NFKD: [0x1101, 0x116B, 0x11BB] }, +{ source: [0xAF79], NFC: [0xAF79], NFD: [0x1101, 0x116B, 0x11BC], NFKC: [0xAF79], NFKD: [0x1101, 0x116B, 0x11BC] }, +{ source: [0xAF7A], NFC: [0xAF7A], NFD: [0x1101, 0x116B, 0x11BD], NFKC: [0xAF7A], NFKD: [0x1101, 0x116B, 0x11BD] }, +{ source: [0xAF7B], NFC: [0xAF7B], NFD: [0x1101, 0x116B, 0x11BE], NFKC: [0xAF7B], NFKD: [0x1101, 0x116B, 0x11BE] }, +{ source: [0xAF7C], NFC: [0xAF7C], NFD: [0x1101, 0x116B, 0x11BF], NFKC: [0xAF7C], NFKD: [0x1101, 0x116B, 0x11BF] }, +{ source: [0xAF7D], NFC: [0xAF7D], NFD: [0x1101, 0x116B, 0x11C0], NFKC: [0xAF7D], NFKD: [0x1101, 0x116B, 0x11C0] }, +{ source: [0xAF7E], NFC: [0xAF7E], NFD: [0x1101, 0x116B, 0x11C1], NFKC: [0xAF7E], NFKD: [0x1101, 0x116B, 0x11C1] }, +{ source: [0xAF7F], NFC: [0xAF7F], NFD: [0x1101, 0x116B, 0x11C2], NFKC: [0xAF7F], NFKD: [0x1101, 0x116B, 0x11C2] }, +{ source: [0xAF80], NFC: [0xAF80], NFD: [0x1101, 0x116C], NFKC: [0xAF80], NFKD: [0x1101, 0x116C] }, +{ source: [0xAF81], NFC: [0xAF81], NFD: [0x1101, 0x116C, 0x11A8], NFKC: [0xAF81], NFKD: [0x1101, 0x116C, 0x11A8] }, +{ source: [0xAF82], NFC: [0xAF82], NFD: [0x1101, 0x116C, 0x11A9], NFKC: [0xAF82], NFKD: [0x1101, 0x116C, 0x11A9] }, +{ source: [0xAF83], NFC: [0xAF83], NFD: [0x1101, 0x116C, 0x11AA], NFKC: [0xAF83], NFKD: [0x1101, 0x116C, 0x11AA] }, +{ source: [0xAF84], NFC: [0xAF84], NFD: [0x1101, 0x116C, 0x11AB], NFKC: [0xAF84], NFKD: [0x1101, 0x116C, 0x11AB] }, +{ source: [0xAF85], NFC: [0xAF85], NFD: [0x1101, 0x116C, 0x11AC], NFKC: [0xAF85], NFKD: [0x1101, 0x116C, 0x11AC] }, +{ source: [0xAF86], NFC: [0xAF86], NFD: [0x1101, 0x116C, 0x11AD], NFKC: [0xAF86], NFKD: [0x1101, 0x116C, 0x11AD] }, +{ source: [0xAF87], NFC: [0xAF87], NFD: [0x1101, 0x116C, 0x11AE], NFKC: [0xAF87], NFKD: [0x1101, 0x116C, 0x11AE] }, +{ source: [0xAF88], NFC: [0xAF88], NFD: [0x1101, 0x116C, 0x11AF], NFKC: [0xAF88], NFKD: [0x1101, 0x116C, 0x11AF] }, +{ source: [0xAF89], NFC: [0xAF89], NFD: [0x1101, 0x116C, 0x11B0], NFKC: [0xAF89], NFKD: [0x1101, 0x116C, 0x11B0] }, +{ source: [0xAF8A], NFC: [0xAF8A], NFD: [0x1101, 0x116C, 0x11B1], NFKC: [0xAF8A], NFKD: [0x1101, 0x116C, 0x11B1] }, +{ source: [0xAF8B], NFC: [0xAF8B], NFD: [0x1101, 0x116C, 0x11B2], NFKC: [0xAF8B], NFKD: [0x1101, 0x116C, 0x11B2] }, +{ source: [0xAF8C], NFC: [0xAF8C], NFD: [0x1101, 0x116C, 0x11B3], NFKC: [0xAF8C], NFKD: [0x1101, 0x116C, 0x11B3] }, +{ source: [0xAF8D], NFC: [0xAF8D], NFD: [0x1101, 0x116C, 0x11B4], NFKC: [0xAF8D], NFKD: [0x1101, 0x116C, 0x11B4] }, +{ source: [0xAF8E], NFC: [0xAF8E], NFD: [0x1101, 0x116C, 0x11B5], NFKC: [0xAF8E], NFKD: [0x1101, 0x116C, 0x11B5] }, +{ source: [0xAF8F], NFC: [0xAF8F], NFD: [0x1101, 0x116C, 0x11B6], NFKC: [0xAF8F], NFKD: [0x1101, 0x116C, 0x11B6] }, +{ source: [0xAF90], NFC: [0xAF90], NFD: [0x1101, 0x116C, 0x11B7], NFKC: [0xAF90], NFKD: [0x1101, 0x116C, 0x11B7] }, +{ source: [0xAF91], NFC: [0xAF91], NFD: [0x1101, 0x116C, 0x11B8], NFKC: [0xAF91], NFKD: [0x1101, 0x116C, 0x11B8] }, +{ source: [0xAF92], NFC: [0xAF92], NFD: [0x1101, 0x116C, 0x11B9], NFKC: [0xAF92], NFKD: [0x1101, 0x116C, 0x11B9] }, +{ source: [0xAF93], NFC: [0xAF93], NFD: [0x1101, 0x116C, 0x11BA], NFKC: [0xAF93], NFKD: [0x1101, 0x116C, 0x11BA] }, +{ source: [0xAF94], NFC: [0xAF94], NFD: [0x1101, 0x116C, 0x11BB], NFKC: [0xAF94], NFKD: [0x1101, 0x116C, 0x11BB] }, +{ source: [0xAF95], NFC: [0xAF95], NFD: [0x1101, 0x116C, 0x11BC], NFKC: [0xAF95], NFKD: [0x1101, 0x116C, 0x11BC] }, +{ source: [0xAF96], NFC: [0xAF96], NFD: [0x1101, 0x116C, 0x11BD], NFKC: [0xAF96], NFKD: [0x1101, 0x116C, 0x11BD] }, +{ source: [0xAF97], NFC: [0xAF97], NFD: [0x1101, 0x116C, 0x11BE], NFKC: [0xAF97], NFKD: [0x1101, 0x116C, 0x11BE] }, +{ source: [0xAF98], NFC: [0xAF98], NFD: [0x1101, 0x116C, 0x11BF], NFKC: [0xAF98], NFKD: [0x1101, 0x116C, 0x11BF] }, +{ source: [0xAF99], NFC: [0xAF99], NFD: [0x1101, 0x116C, 0x11C0], NFKC: [0xAF99], NFKD: [0x1101, 0x116C, 0x11C0] }, +{ source: [0xAF9A], NFC: [0xAF9A], NFD: [0x1101, 0x116C, 0x11C1], NFKC: [0xAF9A], NFKD: [0x1101, 0x116C, 0x11C1] }, +{ source: [0xAF9B], NFC: [0xAF9B], NFD: [0x1101, 0x116C, 0x11C2], NFKC: [0xAF9B], NFKD: [0x1101, 0x116C, 0x11C2] }, +{ source: [0xAF9C], NFC: [0xAF9C], NFD: [0x1101, 0x116D], NFKC: [0xAF9C], NFKD: [0x1101, 0x116D] }, +{ source: [0xAF9D], NFC: [0xAF9D], NFD: [0x1101, 0x116D, 0x11A8], NFKC: [0xAF9D], NFKD: [0x1101, 0x116D, 0x11A8] }, +{ source: [0xAF9E], NFC: [0xAF9E], NFD: [0x1101, 0x116D, 0x11A9], NFKC: [0xAF9E], NFKD: [0x1101, 0x116D, 0x11A9] }, +{ source: [0xAF9F], NFC: [0xAF9F], NFD: [0x1101, 0x116D, 0x11AA], NFKC: [0xAF9F], NFKD: [0x1101, 0x116D, 0x11AA] }, +{ source: [0xAFA0], NFC: [0xAFA0], NFD: [0x1101, 0x116D, 0x11AB], NFKC: [0xAFA0], NFKD: [0x1101, 0x116D, 0x11AB] }, +{ source: [0xAFA1], NFC: [0xAFA1], NFD: [0x1101, 0x116D, 0x11AC], NFKC: [0xAFA1], NFKD: [0x1101, 0x116D, 0x11AC] }, +{ source: [0xAFA2], NFC: [0xAFA2], NFD: [0x1101, 0x116D, 0x11AD], NFKC: [0xAFA2], NFKD: [0x1101, 0x116D, 0x11AD] }, +{ source: [0xAFA3], NFC: [0xAFA3], NFD: [0x1101, 0x116D, 0x11AE], NFKC: [0xAFA3], NFKD: [0x1101, 0x116D, 0x11AE] }, +{ source: [0xAFA4], NFC: [0xAFA4], NFD: [0x1101, 0x116D, 0x11AF], NFKC: [0xAFA4], NFKD: [0x1101, 0x116D, 0x11AF] }, +{ source: [0xAFA5], NFC: [0xAFA5], NFD: [0x1101, 0x116D, 0x11B0], NFKC: [0xAFA5], NFKD: [0x1101, 0x116D, 0x11B0] }, +{ source: [0xAFA6], NFC: [0xAFA6], NFD: [0x1101, 0x116D, 0x11B1], NFKC: [0xAFA6], NFKD: [0x1101, 0x116D, 0x11B1] }, +{ source: [0xAFA7], NFC: [0xAFA7], NFD: [0x1101, 0x116D, 0x11B2], NFKC: [0xAFA7], NFKD: [0x1101, 0x116D, 0x11B2] }, +{ source: [0xAFA8], NFC: [0xAFA8], NFD: [0x1101, 0x116D, 0x11B3], NFKC: [0xAFA8], NFKD: [0x1101, 0x116D, 0x11B3] }, +{ source: [0xAFA9], NFC: [0xAFA9], NFD: [0x1101, 0x116D, 0x11B4], NFKC: [0xAFA9], NFKD: [0x1101, 0x116D, 0x11B4] }, +{ source: [0xAFAA], NFC: [0xAFAA], NFD: [0x1101, 0x116D, 0x11B5], NFKC: [0xAFAA], NFKD: [0x1101, 0x116D, 0x11B5] }, +{ source: [0xAFAB], NFC: [0xAFAB], NFD: [0x1101, 0x116D, 0x11B6], NFKC: [0xAFAB], NFKD: [0x1101, 0x116D, 0x11B6] }, +{ source: [0xAFAC], NFC: [0xAFAC], NFD: [0x1101, 0x116D, 0x11B7], NFKC: [0xAFAC], NFKD: [0x1101, 0x116D, 0x11B7] }, +{ source: [0xAFAD], NFC: [0xAFAD], NFD: [0x1101, 0x116D, 0x11B8], NFKC: [0xAFAD], NFKD: [0x1101, 0x116D, 0x11B8] }, +{ source: [0xAFAE], NFC: [0xAFAE], NFD: [0x1101, 0x116D, 0x11B9], NFKC: [0xAFAE], NFKD: [0x1101, 0x116D, 0x11B9] }, +{ source: [0xAFAF], NFC: [0xAFAF], NFD: [0x1101, 0x116D, 0x11BA], NFKC: [0xAFAF], NFKD: [0x1101, 0x116D, 0x11BA] }, +{ source: [0xAFB0], NFC: [0xAFB0], NFD: [0x1101, 0x116D, 0x11BB], NFKC: [0xAFB0], NFKD: [0x1101, 0x116D, 0x11BB] }, +{ source: [0xAFB1], NFC: [0xAFB1], NFD: [0x1101, 0x116D, 0x11BC], NFKC: [0xAFB1], NFKD: [0x1101, 0x116D, 0x11BC] }, +{ source: [0xAFB2], NFC: [0xAFB2], NFD: [0x1101, 0x116D, 0x11BD], NFKC: [0xAFB2], NFKD: [0x1101, 0x116D, 0x11BD] }, +{ source: [0xAFB3], NFC: [0xAFB3], NFD: [0x1101, 0x116D, 0x11BE], NFKC: [0xAFB3], NFKD: [0x1101, 0x116D, 0x11BE] }, +{ source: [0xAFB4], NFC: [0xAFB4], NFD: [0x1101, 0x116D, 0x11BF], NFKC: [0xAFB4], NFKD: [0x1101, 0x116D, 0x11BF] }, +{ source: [0xAFB5], NFC: [0xAFB5], NFD: [0x1101, 0x116D, 0x11C0], NFKC: [0xAFB5], NFKD: [0x1101, 0x116D, 0x11C0] }, +{ source: [0xAFB6], NFC: [0xAFB6], NFD: [0x1101, 0x116D, 0x11C1], NFKC: [0xAFB6], NFKD: [0x1101, 0x116D, 0x11C1] }, +{ source: [0xAFB7], NFC: [0xAFB7], NFD: [0x1101, 0x116D, 0x11C2], NFKC: [0xAFB7], NFKD: [0x1101, 0x116D, 0x11C2] }, +{ source: [0xAFB8], NFC: [0xAFB8], NFD: [0x1101, 0x116E], NFKC: [0xAFB8], NFKD: [0x1101, 0x116E] }, +{ source: [0xAFB9], NFC: [0xAFB9], NFD: [0x1101, 0x116E, 0x11A8], NFKC: [0xAFB9], NFKD: [0x1101, 0x116E, 0x11A8] }, +{ source: [0xAFBA], NFC: [0xAFBA], NFD: [0x1101, 0x116E, 0x11A9], NFKC: [0xAFBA], NFKD: [0x1101, 0x116E, 0x11A9] }, +{ source: [0xAFBB], NFC: [0xAFBB], NFD: [0x1101, 0x116E, 0x11AA], NFKC: [0xAFBB], NFKD: [0x1101, 0x116E, 0x11AA] }, +{ source: [0xAFBC], NFC: [0xAFBC], NFD: [0x1101, 0x116E, 0x11AB], NFKC: [0xAFBC], NFKD: [0x1101, 0x116E, 0x11AB] }, +{ source: [0xAFBD], NFC: [0xAFBD], NFD: [0x1101, 0x116E, 0x11AC], NFKC: [0xAFBD], NFKD: [0x1101, 0x116E, 0x11AC] }, +{ source: [0xAFBE], NFC: [0xAFBE], NFD: [0x1101, 0x116E, 0x11AD], NFKC: [0xAFBE], NFKD: [0x1101, 0x116E, 0x11AD] }, +{ source: [0xAFBF], NFC: [0xAFBF], NFD: [0x1101, 0x116E, 0x11AE], NFKC: [0xAFBF], NFKD: [0x1101, 0x116E, 0x11AE] }, +{ source: [0xAFC0], NFC: [0xAFC0], NFD: [0x1101, 0x116E, 0x11AF], NFKC: [0xAFC0], NFKD: [0x1101, 0x116E, 0x11AF] }, +{ source: [0xAFC1], NFC: [0xAFC1], NFD: [0x1101, 0x116E, 0x11B0], NFKC: [0xAFC1], NFKD: [0x1101, 0x116E, 0x11B0] }, +{ source: [0xAFC2], NFC: [0xAFC2], NFD: [0x1101, 0x116E, 0x11B1], NFKC: [0xAFC2], NFKD: [0x1101, 0x116E, 0x11B1] }, +{ source: [0xAFC3], NFC: [0xAFC3], NFD: [0x1101, 0x116E, 0x11B2], NFKC: [0xAFC3], NFKD: [0x1101, 0x116E, 0x11B2] }, +{ source: [0xAFC4], NFC: [0xAFC4], NFD: [0x1101, 0x116E, 0x11B3], NFKC: [0xAFC4], NFKD: [0x1101, 0x116E, 0x11B3] }, +{ source: [0xAFC5], NFC: [0xAFC5], NFD: [0x1101, 0x116E, 0x11B4], NFKC: [0xAFC5], NFKD: [0x1101, 0x116E, 0x11B4] }, +{ source: [0xAFC6], NFC: [0xAFC6], NFD: [0x1101, 0x116E, 0x11B5], NFKC: [0xAFC6], NFKD: [0x1101, 0x116E, 0x11B5] }, +{ source: [0xAFC7], NFC: [0xAFC7], NFD: [0x1101, 0x116E, 0x11B6], NFKC: [0xAFC7], NFKD: [0x1101, 0x116E, 0x11B6] }, +{ source: [0xAFC8], NFC: [0xAFC8], NFD: [0x1101, 0x116E, 0x11B7], NFKC: [0xAFC8], NFKD: [0x1101, 0x116E, 0x11B7] }, +{ source: [0xAFC9], NFC: [0xAFC9], NFD: [0x1101, 0x116E, 0x11B8], NFKC: [0xAFC9], NFKD: [0x1101, 0x116E, 0x11B8] }, +{ source: [0xAFCA], NFC: [0xAFCA], NFD: [0x1101, 0x116E, 0x11B9], NFKC: [0xAFCA], NFKD: [0x1101, 0x116E, 0x11B9] }, +{ source: [0xAFCB], NFC: [0xAFCB], NFD: [0x1101, 0x116E, 0x11BA], NFKC: [0xAFCB], NFKD: [0x1101, 0x116E, 0x11BA] }, +{ source: [0xAFCC], NFC: [0xAFCC], NFD: [0x1101, 0x116E, 0x11BB], NFKC: [0xAFCC], NFKD: [0x1101, 0x116E, 0x11BB] }, +{ source: [0xAFCD], NFC: [0xAFCD], NFD: [0x1101, 0x116E, 0x11BC], NFKC: [0xAFCD], NFKD: [0x1101, 0x116E, 0x11BC] }, +{ source: [0xAFCE], NFC: [0xAFCE], NFD: [0x1101, 0x116E, 0x11BD], NFKC: [0xAFCE], NFKD: [0x1101, 0x116E, 0x11BD] }, +{ source: [0xAFCF], NFC: [0xAFCF], NFD: [0x1101, 0x116E, 0x11BE], NFKC: [0xAFCF], NFKD: [0x1101, 0x116E, 0x11BE] }, +{ source: [0xAFD0], NFC: [0xAFD0], NFD: [0x1101, 0x116E, 0x11BF], NFKC: [0xAFD0], NFKD: [0x1101, 0x116E, 0x11BF] }, +{ source: [0xAFD1], NFC: [0xAFD1], NFD: [0x1101, 0x116E, 0x11C0], NFKC: [0xAFD1], NFKD: [0x1101, 0x116E, 0x11C0] }, +{ source: [0xAFD2], NFC: [0xAFD2], NFD: [0x1101, 0x116E, 0x11C1], NFKC: [0xAFD2], NFKD: [0x1101, 0x116E, 0x11C1] }, +{ source: [0xAFD3], NFC: [0xAFD3], NFD: [0x1101, 0x116E, 0x11C2], NFKC: [0xAFD3], NFKD: [0x1101, 0x116E, 0x11C2] }, +{ source: [0xAFD4], NFC: [0xAFD4], NFD: [0x1101, 0x116F], NFKC: [0xAFD4], NFKD: [0x1101, 0x116F] }, +{ source: [0xAFD5], NFC: [0xAFD5], NFD: [0x1101, 0x116F, 0x11A8], NFKC: [0xAFD5], NFKD: [0x1101, 0x116F, 0x11A8] }, +{ source: [0xAFD6], NFC: [0xAFD6], NFD: [0x1101, 0x116F, 0x11A9], NFKC: [0xAFD6], NFKD: [0x1101, 0x116F, 0x11A9] }, +{ source: [0xAFD7], NFC: [0xAFD7], NFD: [0x1101, 0x116F, 0x11AA], NFKC: [0xAFD7], NFKD: [0x1101, 0x116F, 0x11AA] }, +{ source: [0xAFD8], NFC: [0xAFD8], NFD: [0x1101, 0x116F, 0x11AB], NFKC: [0xAFD8], NFKD: [0x1101, 0x116F, 0x11AB] }, +{ source: [0xAFD9], NFC: [0xAFD9], NFD: [0x1101, 0x116F, 0x11AC], NFKC: [0xAFD9], NFKD: [0x1101, 0x116F, 0x11AC] }, +{ source: [0xAFDA], NFC: [0xAFDA], NFD: [0x1101, 0x116F, 0x11AD], NFKC: [0xAFDA], NFKD: [0x1101, 0x116F, 0x11AD] }, +{ source: [0xAFDB], NFC: [0xAFDB], NFD: [0x1101, 0x116F, 0x11AE], NFKC: [0xAFDB], NFKD: [0x1101, 0x116F, 0x11AE] }, +{ source: [0xAFDC], NFC: [0xAFDC], NFD: [0x1101, 0x116F, 0x11AF], NFKC: [0xAFDC], NFKD: [0x1101, 0x116F, 0x11AF] }, +{ source: [0xAFDD], NFC: [0xAFDD], NFD: [0x1101, 0x116F, 0x11B0], NFKC: [0xAFDD], NFKD: [0x1101, 0x116F, 0x11B0] }, +{ source: [0xAFDE], NFC: [0xAFDE], NFD: [0x1101, 0x116F, 0x11B1], NFKC: [0xAFDE], NFKD: [0x1101, 0x116F, 0x11B1] }, +{ source: [0xAFDF], NFC: [0xAFDF], NFD: [0x1101, 0x116F, 0x11B2], NFKC: [0xAFDF], NFKD: [0x1101, 0x116F, 0x11B2] }, +{ source: [0xAFE0], NFC: [0xAFE0], NFD: [0x1101, 0x116F, 0x11B3], NFKC: [0xAFE0], NFKD: [0x1101, 0x116F, 0x11B3] }, +{ source: [0xAFE1], NFC: [0xAFE1], NFD: [0x1101, 0x116F, 0x11B4], NFKC: [0xAFE1], NFKD: [0x1101, 0x116F, 0x11B4] }, +{ source: [0xAFE2], NFC: [0xAFE2], NFD: [0x1101, 0x116F, 0x11B5], NFKC: [0xAFE2], NFKD: [0x1101, 0x116F, 0x11B5] }, +{ source: [0xAFE3], NFC: [0xAFE3], NFD: [0x1101, 0x116F, 0x11B6], NFKC: [0xAFE3], NFKD: [0x1101, 0x116F, 0x11B6] }, +{ source: [0xAFE4], NFC: [0xAFE4], NFD: [0x1101, 0x116F, 0x11B7], NFKC: [0xAFE4], NFKD: [0x1101, 0x116F, 0x11B7] }, +{ source: [0xAFE5], NFC: [0xAFE5], NFD: [0x1101, 0x116F, 0x11B8], NFKC: [0xAFE5], NFKD: [0x1101, 0x116F, 0x11B8] }, +{ source: [0xAFE6], NFC: [0xAFE6], NFD: [0x1101, 0x116F, 0x11B9], NFKC: [0xAFE6], NFKD: [0x1101, 0x116F, 0x11B9] }, +{ source: [0xAFE7], NFC: [0xAFE7], NFD: [0x1101, 0x116F, 0x11BA], NFKC: [0xAFE7], NFKD: [0x1101, 0x116F, 0x11BA] }, +{ source: [0xAFE8], NFC: [0xAFE8], NFD: [0x1101, 0x116F, 0x11BB], NFKC: [0xAFE8], NFKD: [0x1101, 0x116F, 0x11BB] }, +{ source: [0xAFE9], NFC: [0xAFE9], NFD: [0x1101, 0x116F, 0x11BC], NFKC: [0xAFE9], NFKD: [0x1101, 0x116F, 0x11BC] }, +{ source: [0xAFEA], NFC: [0xAFEA], NFD: [0x1101, 0x116F, 0x11BD], NFKC: [0xAFEA], NFKD: [0x1101, 0x116F, 0x11BD] }, +{ source: [0xAFEB], NFC: [0xAFEB], NFD: [0x1101, 0x116F, 0x11BE], NFKC: [0xAFEB], NFKD: [0x1101, 0x116F, 0x11BE] }, +{ source: [0xAFEC], NFC: [0xAFEC], NFD: [0x1101, 0x116F, 0x11BF], NFKC: [0xAFEC], NFKD: [0x1101, 0x116F, 0x11BF] }, +{ source: [0xAFED], NFC: [0xAFED], NFD: [0x1101, 0x116F, 0x11C0], NFKC: [0xAFED], NFKD: [0x1101, 0x116F, 0x11C0] }, +{ source: [0xAFEE], NFC: [0xAFEE], NFD: [0x1101, 0x116F, 0x11C1], NFKC: [0xAFEE], NFKD: [0x1101, 0x116F, 0x11C1] }, +{ source: [0xAFEF], NFC: [0xAFEF], NFD: [0x1101, 0x116F, 0x11C2], NFKC: [0xAFEF], NFKD: [0x1101, 0x116F, 0x11C2] }, +{ source: [0xAFF0], NFC: [0xAFF0], NFD: [0x1101, 0x1170], NFKC: [0xAFF0], NFKD: [0x1101, 0x1170] }, +{ source: [0xAFF1], NFC: [0xAFF1], NFD: [0x1101, 0x1170, 0x11A8], NFKC: [0xAFF1], NFKD: [0x1101, 0x1170, 0x11A8] }, +{ source: [0xAFF2], NFC: [0xAFF2], NFD: [0x1101, 0x1170, 0x11A9], NFKC: [0xAFF2], NFKD: [0x1101, 0x1170, 0x11A9] }, +{ source: [0xAFF3], NFC: [0xAFF3], NFD: [0x1101, 0x1170, 0x11AA], NFKC: [0xAFF3], NFKD: [0x1101, 0x1170, 0x11AA] }, +{ source: [0xAFF4], NFC: [0xAFF4], NFD: [0x1101, 0x1170, 0x11AB], NFKC: [0xAFF4], NFKD: [0x1101, 0x1170, 0x11AB] }, +{ source: [0xAFF5], NFC: [0xAFF5], NFD: [0x1101, 0x1170, 0x11AC], NFKC: [0xAFF5], NFKD: [0x1101, 0x1170, 0x11AC] }, +{ source: [0xAFF6], NFC: [0xAFF6], NFD: [0x1101, 0x1170, 0x11AD], NFKC: [0xAFF6], NFKD: [0x1101, 0x1170, 0x11AD] }, +{ source: [0xAFF7], NFC: [0xAFF7], NFD: [0x1101, 0x1170, 0x11AE], NFKC: [0xAFF7], NFKD: [0x1101, 0x1170, 0x11AE] }, +{ source: [0xAFF8], NFC: [0xAFF8], NFD: [0x1101, 0x1170, 0x11AF], NFKC: [0xAFF8], NFKD: [0x1101, 0x1170, 0x11AF] }, +{ source: [0xAFF9], NFC: [0xAFF9], NFD: [0x1101, 0x1170, 0x11B0], NFKC: [0xAFF9], NFKD: [0x1101, 0x1170, 0x11B0] }, +{ source: [0xAFFA], NFC: [0xAFFA], NFD: [0x1101, 0x1170, 0x11B1], NFKC: [0xAFFA], NFKD: [0x1101, 0x1170, 0x11B1] }, +{ source: [0xAFFB], NFC: [0xAFFB], NFD: [0x1101, 0x1170, 0x11B2], NFKC: [0xAFFB], NFKD: [0x1101, 0x1170, 0x11B2] }, +{ source: [0xAFFC], NFC: [0xAFFC], NFD: [0x1101, 0x1170, 0x11B3], NFKC: [0xAFFC], NFKD: [0x1101, 0x1170, 0x11B3] }, +{ source: [0xAFFD], NFC: [0xAFFD], NFD: [0x1101, 0x1170, 0x11B4], NFKC: [0xAFFD], NFKD: [0x1101, 0x1170, 0x11B4] }, +{ source: [0xAFFE], NFC: [0xAFFE], NFD: [0x1101, 0x1170, 0x11B5], NFKC: [0xAFFE], NFKD: [0x1101, 0x1170, 0x11B5] }, +{ source: [0xAFFF], NFC: [0xAFFF], NFD: [0x1101, 0x1170, 0x11B6], NFKC: [0xAFFF], NFKD: [0x1101, 0x1170, 0x11B6] }, +{ source: [0xB000], NFC: [0xB000], NFD: [0x1101, 0x1170, 0x11B7], NFKC: [0xB000], NFKD: [0x1101, 0x1170, 0x11B7] }, +{ source: [0xB001], NFC: [0xB001], NFD: [0x1101, 0x1170, 0x11B8], NFKC: [0xB001], NFKD: [0x1101, 0x1170, 0x11B8] }, +{ source: [0xB002], NFC: [0xB002], NFD: [0x1101, 0x1170, 0x11B9], NFKC: [0xB002], NFKD: [0x1101, 0x1170, 0x11B9] }, +{ source: [0xB003], NFC: [0xB003], NFD: [0x1101, 0x1170, 0x11BA], NFKC: [0xB003], NFKD: [0x1101, 0x1170, 0x11BA] }, +{ source: [0xB004], NFC: [0xB004], NFD: [0x1101, 0x1170, 0x11BB], NFKC: [0xB004], NFKD: [0x1101, 0x1170, 0x11BB] }, +{ source: [0xB005], NFC: [0xB005], NFD: [0x1101, 0x1170, 0x11BC], NFKC: [0xB005], NFKD: [0x1101, 0x1170, 0x11BC] }, +{ source: [0xB006], NFC: [0xB006], NFD: [0x1101, 0x1170, 0x11BD], NFKC: [0xB006], NFKD: [0x1101, 0x1170, 0x11BD] }, +{ source: [0xB007], NFC: [0xB007], NFD: [0x1101, 0x1170, 0x11BE], NFKC: [0xB007], NFKD: [0x1101, 0x1170, 0x11BE] }, +{ source: [0xB008], NFC: [0xB008], NFD: [0x1101, 0x1170, 0x11BF], NFKC: [0xB008], NFKD: [0x1101, 0x1170, 0x11BF] }, +{ source: [0xB009], NFC: [0xB009], NFD: [0x1101, 0x1170, 0x11C0], NFKC: [0xB009], NFKD: [0x1101, 0x1170, 0x11C0] }, +{ source: [0xB00A], NFC: [0xB00A], NFD: [0x1101, 0x1170, 0x11C1], NFKC: [0xB00A], NFKD: [0x1101, 0x1170, 0x11C1] }, +{ source: [0xB00B], NFC: [0xB00B], NFD: [0x1101, 0x1170, 0x11C2], NFKC: [0xB00B], NFKD: [0x1101, 0x1170, 0x11C2] }, +{ source: [0xB00C], NFC: [0xB00C], NFD: [0x1101, 0x1171], NFKC: [0xB00C], NFKD: [0x1101, 0x1171] }, +{ source: [0xB00D], NFC: [0xB00D], NFD: [0x1101, 0x1171, 0x11A8], NFKC: [0xB00D], NFKD: [0x1101, 0x1171, 0x11A8] }, +{ source: [0xB00E], NFC: [0xB00E], NFD: [0x1101, 0x1171, 0x11A9], NFKC: [0xB00E], NFKD: [0x1101, 0x1171, 0x11A9] }, +{ source: [0xB00F], NFC: [0xB00F], NFD: [0x1101, 0x1171, 0x11AA], NFKC: [0xB00F], NFKD: [0x1101, 0x1171, 0x11AA] }, +{ source: [0xB010], NFC: [0xB010], NFD: [0x1101, 0x1171, 0x11AB], NFKC: [0xB010], NFKD: [0x1101, 0x1171, 0x11AB] }, +{ source: [0xB011], NFC: [0xB011], NFD: [0x1101, 0x1171, 0x11AC], NFKC: [0xB011], NFKD: [0x1101, 0x1171, 0x11AC] }, +{ source: [0xB012], NFC: [0xB012], NFD: [0x1101, 0x1171, 0x11AD], NFKC: [0xB012], NFKD: [0x1101, 0x1171, 0x11AD] }, +{ source: [0xB013], NFC: [0xB013], NFD: [0x1101, 0x1171, 0x11AE], NFKC: [0xB013], NFKD: [0x1101, 0x1171, 0x11AE] }, +{ source: [0xB014], NFC: [0xB014], NFD: [0x1101, 0x1171, 0x11AF], NFKC: [0xB014], NFKD: [0x1101, 0x1171, 0x11AF] }, +{ source: [0xB015], NFC: [0xB015], NFD: [0x1101, 0x1171, 0x11B0], NFKC: [0xB015], NFKD: [0x1101, 0x1171, 0x11B0] }, +{ source: [0xB016], NFC: [0xB016], NFD: [0x1101, 0x1171, 0x11B1], NFKC: [0xB016], NFKD: [0x1101, 0x1171, 0x11B1] }, +{ source: [0xB017], NFC: [0xB017], NFD: [0x1101, 0x1171, 0x11B2], NFKC: [0xB017], NFKD: [0x1101, 0x1171, 0x11B2] }, +{ source: [0xB018], NFC: [0xB018], NFD: [0x1101, 0x1171, 0x11B3], NFKC: [0xB018], NFKD: [0x1101, 0x1171, 0x11B3] }, +{ source: [0xB019], NFC: [0xB019], NFD: [0x1101, 0x1171, 0x11B4], NFKC: [0xB019], NFKD: [0x1101, 0x1171, 0x11B4] }, +{ source: [0xB01A], NFC: [0xB01A], NFD: [0x1101, 0x1171, 0x11B5], NFKC: [0xB01A], NFKD: [0x1101, 0x1171, 0x11B5] }, +{ source: [0xB01B], NFC: [0xB01B], NFD: [0x1101, 0x1171, 0x11B6], NFKC: [0xB01B], NFKD: [0x1101, 0x1171, 0x11B6] }, +{ source: [0xB01C], NFC: [0xB01C], NFD: [0x1101, 0x1171, 0x11B7], NFKC: [0xB01C], NFKD: [0x1101, 0x1171, 0x11B7] }, +{ source: [0xB01D], NFC: [0xB01D], NFD: [0x1101, 0x1171, 0x11B8], NFKC: [0xB01D], NFKD: [0x1101, 0x1171, 0x11B8] }, +{ source: [0xB01E], NFC: [0xB01E], NFD: [0x1101, 0x1171, 0x11B9], NFKC: [0xB01E], NFKD: [0x1101, 0x1171, 0x11B9] }, +{ source: [0xB01F], NFC: [0xB01F], NFD: [0x1101, 0x1171, 0x11BA], NFKC: [0xB01F], NFKD: [0x1101, 0x1171, 0x11BA] }, +{ source: [0xB020], NFC: [0xB020], NFD: [0x1101, 0x1171, 0x11BB], NFKC: [0xB020], NFKD: [0x1101, 0x1171, 0x11BB] }, +{ source: [0xB021], NFC: [0xB021], NFD: [0x1101, 0x1171, 0x11BC], NFKC: [0xB021], NFKD: [0x1101, 0x1171, 0x11BC] }, +{ source: [0xB022], NFC: [0xB022], NFD: [0x1101, 0x1171, 0x11BD], NFKC: [0xB022], NFKD: [0x1101, 0x1171, 0x11BD] }, +{ source: [0xB023], NFC: [0xB023], NFD: [0x1101, 0x1171, 0x11BE], NFKC: [0xB023], NFKD: [0x1101, 0x1171, 0x11BE] }, +{ source: [0xB024], NFC: [0xB024], NFD: [0x1101, 0x1171, 0x11BF], NFKC: [0xB024], NFKD: [0x1101, 0x1171, 0x11BF] }, +{ source: [0xB025], NFC: [0xB025], NFD: [0x1101, 0x1171, 0x11C0], NFKC: [0xB025], NFKD: [0x1101, 0x1171, 0x11C0] }, +{ source: [0xB026], NFC: [0xB026], NFD: [0x1101, 0x1171, 0x11C1], NFKC: [0xB026], NFKD: [0x1101, 0x1171, 0x11C1] }, +{ source: [0xB027], NFC: [0xB027], NFD: [0x1101, 0x1171, 0x11C2], NFKC: [0xB027], NFKD: [0x1101, 0x1171, 0x11C2] }, +{ source: [0xB028], NFC: [0xB028], NFD: [0x1101, 0x1172], NFKC: [0xB028], NFKD: [0x1101, 0x1172] }, +{ source: [0xB029], NFC: [0xB029], NFD: [0x1101, 0x1172, 0x11A8], NFKC: [0xB029], NFKD: [0x1101, 0x1172, 0x11A8] }, +{ source: [0xB02A], NFC: [0xB02A], NFD: [0x1101, 0x1172, 0x11A9], NFKC: [0xB02A], NFKD: [0x1101, 0x1172, 0x11A9] }, +{ source: [0xB02B], NFC: [0xB02B], NFD: [0x1101, 0x1172, 0x11AA], NFKC: [0xB02B], NFKD: [0x1101, 0x1172, 0x11AA] }, +{ source: [0xB02C], NFC: [0xB02C], NFD: [0x1101, 0x1172, 0x11AB], NFKC: [0xB02C], NFKD: [0x1101, 0x1172, 0x11AB] }, +{ source: [0xB02D], NFC: [0xB02D], NFD: [0x1101, 0x1172, 0x11AC], NFKC: [0xB02D], NFKD: [0x1101, 0x1172, 0x11AC] }, +{ source: [0xB02E], NFC: [0xB02E], NFD: [0x1101, 0x1172, 0x11AD], NFKC: [0xB02E], NFKD: [0x1101, 0x1172, 0x11AD] }, +{ source: [0xB02F], NFC: [0xB02F], NFD: [0x1101, 0x1172, 0x11AE], NFKC: [0xB02F], NFKD: [0x1101, 0x1172, 0x11AE] }, +{ source: [0xB030], NFC: [0xB030], NFD: [0x1101, 0x1172, 0x11AF], NFKC: [0xB030], NFKD: [0x1101, 0x1172, 0x11AF] }, +{ source: [0xB031], NFC: [0xB031], NFD: [0x1101, 0x1172, 0x11B0], NFKC: [0xB031], NFKD: [0x1101, 0x1172, 0x11B0] }, +{ source: [0xB032], NFC: [0xB032], NFD: [0x1101, 0x1172, 0x11B1], NFKC: [0xB032], NFKD: [0x1101, 0x1172, 0x11B1] }, +{ source: [0xB033], NFC: [0xB033], NFD: [0x1101, 0x1172, 0x11B2], NFKC: [0xB033], NFKD: [0x1101, 0x1172, 0x11B2] }, +{ source: [0xB034], NFC: [0xB034], NFD: [0x1101, 0x1172, 0x11B3], NFKC: [0xB034], NFKD: [0x1101, 0x1172, 0x11B3] }, +{ source: [0xB035], NFC: [0xB035], NFD: [0x1101, 0x1172, 0x11B4], NFKC: [0xB035], NFKD: [0x1101, 0x1172, 0x11B4] }, +{ source: [0xB036], NFC: [0xB036], NFD: [0x1101, 0x1172, 0x11B5], NFKC: [0xB036], NFKD: [0x1101, 0x1172, 0x11B5] }, +{ source: [0xB037], NFC: [0xB037], NFD: [0x1101, 0x1172, 0x11B6], NFKC: [0xB037], NFKD: [0x1101, 0x1172, 0x11B6] }, +{ source: [0xB038], NFC: [0xB038], NFD: [0x1101, 0x1172, 0x11B7], NFKC: [0xB038], NFKD: [0x1101, 0x1172, 0x11B7] }, +{ source: [0xB039], NFC: [0xB039], NFD: [0x1101, 0x1172, 0x11B8], NFKC: [0xB039], NFKD: [0x1101, 0x1172, 0x11B8] }, +{ source: [0xB03A], NFC: [0xB03A], NFD: [0x1101, 0x1172, 0x11B9], NFKC: [0xB03A], NFKD: [0x1101, 0x1172, 0x11B9] }, +{ source: [0xB03B], NFC: [0xB03B], NFD: [0x1101, 0x1172, 0x11BA], NFKC: [0xB03B], NFKD: [0x1101, 0x1172, 0x11BA] }, +{ source: [0xB03C], NFC: [0xB03C], NFD: [0x1101, 0x1172, 0x11BB], NFKC: [0xB03C], NFKD: [0x1101, 0x1172, 0x11BB] }, +{ source: [0xB03D], NFC: [0xB03D], NFD: [0x1101, 0x1172, 0x11BC], NFKC: [0xB03D], NFKD: [0x1101, 0x1172, 0x11BC] }, +{ source: [0xB03E], NFC: [0xB03E], NFD: [0x1101, 0x1172, 0x11BD], NFKC: [0xB03E], NFKD: [0x1101, 0x1172, 0x11BD] }, +{ source: [0xB03F], NFC: [0xB03F], NFD: [0x1101, 0x1172, 0x11BE], NFKC: [0xB03F], NFKD: [0x1101, 0x1172, 0x11BE] }, +{ source: [0xB040], NFC: [0xB040], NFD: [0x1101, 0x1172, 0x11BF], NFKC: [0xB040], NFKD: [0x1101, 0x1172, 0x11BF] }, +{ source: [0xB041], NFC: [0xB041], NFD: [0x1101, 0x1172, 0x11C0], NFKC: [0xB041], NFKD: [0x1101, 0x1172, 0x11C0] }, +{ source: [0xB042], NFC: [0xB042], NFD: [0x1101, 0x1172, 0x11C1], NFKC: [0xB042], NFKD: [0x1101, 0x1172, 0x11C1] }, +{ source: [0xB043], NFC: [0xB043], NFD: [0x1101, 0x1172, 0x11C2], NFKC: [0xB043], NFKD: [0x1101, 0x1172, 0x11C2] }, +{ source: [0xB044], NFC: [0xB044], NFD: [0x1101, 0x1173], NFKC: [0xB044], NFKD: [0x1101, 0x1173] }, +{ source: [0xB045], NFC: [0xB045], NFD: [0x1101, 0x1173, 0x11A8], NFKC: [0xB045], NFKD: [0x1101, 0x1173, 0x11A8] }, +{ source: [0xB046], NFC: [0xB046], NFD: [0x1101, 0x1173, 0x11A9], NFKC: [0xB046], NFKD: [0x1101, 0x1173, 0x11A9] }, +{ source: [0xB047], NFC: [0xB047], NFD: [0x1101, 0x1173, 0x11AA], NFKC: [0xB047], NFKD: [0x1101, 0x1173, 0x11AA] }, +{ source: [0xB048], NFC: [0xB048], NFD: [0x1101, 0x1173, 0x11AB], NFKC: [0xB048], NFKD: [0x1101, 0x1173, 0x11AB] }, +{ source: [0xB049], NFC: [0xB049], NFD: [0x1101, 0x1173, 0x11AC], NFKC: [0xB049], NFKD: [0x1101, 0x1173, 0x11AC] }, +{ source: [0xB04A], NFC: [0xB04A], NFD: [0x1101, 0x1173, 0x11AD], NFKC: [0xB04A], NFKD: [0x1101, 0x1173, 0x11AD] }, +{ source: [0xB04B], NFC: [0xB04B], NFD: [0x1101, 0x1173, 0x11AE], NFKC: [0xB04B], NFKD: [0x1101, 0x1173, 0x11AE] }, +{ source: [0xB04C], NFC: [0xB04C], NFD: [0x1101, 0x1173, 0x11AF], NFKC: [0xB04C], NFKD: [0x1101, 0x1173, 0x11AF] }, +{ source: [0xB04D], NFC: [0xB04D], NFD: [0x1101, 0x1173, 0x11B0], NFKC: [0xB04D], NFKD: [0x1101, 0x1173, 0x11B0] }, +{ source: [0xB04E], NFC: [0xB04E], NFD: [0x1101, 0x1173, 0x11B1], NFKC: [0xB04E], NFKD: [0x1101, 0x1173, 0x11B1] }, +{ source: [0xB04F], NFC: [0xB04F], NFD: [0x1101, 0x1173, 0x11B2], NFKC: [0xB04F], NFKD: [0x1101, 0x1173, 0x11B2] }, +{ source: [0xB050], NFC: [0xB050], NFD: [0x1101, 0x1173, 0x11B3], NFKC: [0xB050], NFKD: [0x1101, 0x1173, 0x11B3] }, +{ source: [0xB051], NFC: [0xB051], NFD: [0x1101, 0x1173, 0x11B4], NFKC: [0xB051], NFKD: [0x1101, 0x1173, 0x11B4] }, +{ source: [0xB052], NFC: [0xB052], NFD: [0x1101, 0x1173, 0x11B5], NFKC: [0xB052], NFKD: [0x1101, 0x1173, 0x11B5] }, +{ source: [0xB053], NFC: [0xB053], NFD: [0x1101, 0x1173, 0x11B6], NFKC: [0xB053], NFKD: [0x1101, 0x1173, 0x11B6] }, +{ source: [0xB054], NFC: [0xB054], NFD: [0x1101, 0x1173, 0x11B7], NFKC: [0xB054], NFKD: [0x1101, 0x1173, 0x11B7] }, +{ source: [0xB055], NFC: [0xB055], NFD: [0x1101, 0x1173, 0x11B8], NFKC: [0xB055], NFKD: [0x1101, 0x1173, 0x11B8] }, +{ source: [0xB056], NFC: [0xB056], NFD: [0x1101, 0x1173, 0x11B9], NFKC: [0xB056], NFKD: [0x1101, 0x1173, 0x11B9] }, +{ source: [0xB057], NFC: [0xB057], NFD: [0x1101, 0x1173, 0x11BA], NFKC: [0xB057], NFKD: [0x1101, 0x1173, 0x11BA] }, +{ source: [0xB058], NFC: [0xB058], NFD: [0x1101, 0x1173, 0x11BB], NFKC: [0xB058], NFKD: [0x1101, 0x1173, 0x11BB] }, +{ source: [0xB059], NFC: [0xB059], NFD: [0x1101, 0x1173, 0x11BC], NFKC: [0xB059], NFKD: [0x1101, 0x1173, 0x11BC] }, +{ source: [0xB05A], NFC: [0xB05A], NFD: [0x1101, 0x1173, 0x11BD], NFKC: [0xB05A], NFKD: [0x1101, 0x1173, 0x11BD] }, +{ source: [0xB05B], NFC: [0xB05B], NFD: [0x1101, 0x1173, 0x11BE], NFKC: [0xB05B], NFKD: [0x1101, 0x1173, 0x11BE] }, +{ source: [0xB05C], NFC: [0xB05C], NFD: [0x1101, 0x1173, 0x11BF], NFKC: [0xB05C], NFKD: [0x1101, 0x1173, 0x11BF] }, +{ source: [0xB05D], NFC: [0xB05D], NFD: [0x1101, 0x1173, 0x11C0], NFKC: [0xB05D], NFKD: [0x1101, 0x1173, 0x11C0] }, +{ source: [0xB05E], NFC: [0xB05E], NFD: [0x1101, 0x1173, 0x11C1], NFKC: [0xB05E], NFKD: [0x1101, 0x1173, 0x11C1] }, +{ source: [0xB05F], NFC: [0xB05F], NFD: [0x1101, 0x1173, 0x11C2], NFKC: [0xB05F], NFKD: [0x1101, 0x1173, 0x11C2] }, +{ source: [0xB060], NFC: [0xB060], NFD: [0x1101, 0x1174], NFKC: [0xB060], NFKD: [0x1101, 0x1174] }, +{ source: [0xB061], NFC: [0xB061], NFD: [0x1101, 0x1174, 0x11A8], NFKC: [0xB061], NFKD: [0x1101, 0x1174, 0x11A8] }, +{ source: [0xB062], NFC: [0xB062], NFD: [0x1101, 0x1174, 0x11A9], NFKC: [0xB062], NFKD: [0x1101, 0x1174, 0x11A9] }, +{ source: [0xB063], NFC: [0xB063], NFD: [0x1101, 0x1174, 0x11AA], NFKC: [0xB063], NFKD: [0x1101, 0x1174, 0x11AA] }, +{ source: [0xB064], NFC: [0xB064], NFD: [0x1101, 0x1174, 0x11AB], NFKC: [0xB064], NFKD: [0x1101, 0x1174, 0x11AB] }, +{ source: [0xB065], NFC: [0xB065], NFD: [0x1101, 0x1174, 0x11AC], NFKC: [0xB065], NFKD: [0x1101, 0x1174, 0x11AC] }, +{ source: [0xB066], NFC: [0xB066], NFD: [0x1101, 0x1174, 0x11AD], NFKC: [0xB066], NFKD: [0x1101, 0x1174, 0x11AD] }, +{ source: [0xB067], NFC: [0xB067], NFD: [0x1101, 0x1174, 0x11AE], NFKC: [0xB067], NFKD: [0x1101, 0x1174, 0x11AE] }, +{ source: [0xB068], NFC: [0xB068], NFD: [0x1101, 0x1174, 0x11AF], NFKC: [0xB068], NFKD: [0x1101, 0x1174, 0x11AF] }, +{ source: [0xB069], NFC: [0xB069], NFD: [0x1101, 0x1174, 0x11B0], NFKC: [0xB069], NFKD: [0x1101, 0x1174, 0x11B0] }, +{ source: [0xB06A], NFC: [0xB06A], NFD: [0x1101, 0x1174, 0x11B1], NFKC: [0xB06A], NFKD: [0x1101, 0x1174, 0x11B1] }, +{ source: [0xB06B], NFC: [0xB06B], NFD: [0x1101, 0x1174, 0x11B2], NFKC: [0xB06B], NFKD: [0x1101, 0x1174, 0x11B2] }, +{ source: [0xB06C], NFC: [0xB06C], NFD: [0x1101, 0x1174, 0x11B3], NFKC: [0xB06C], NFKD: [0x1101, 0x1174, 0x11B3] }, +{ source: [0xB06D], NFC: [0xB06D], NFD: [0x1101, 0x1174, 0x11B4], NFKC: [0xB06D], NFKD: [0x1101, 0x1174, 0x11B4] }, +{ source: [0xB06E], NFC: [0xB06E], NFD: [0x1101, 0x1174, 0x11B5], NFKC: [0xB06E], NFKD: [0x1101, 0x1174, 0x11B5] }, +{ source: [0xB06F], NFC: [0xB06F], NFD: [0x1101, 0x1174, 0x11B6], NFKC: [0xB06F], NFKD: [0x1101, 0x1174, 0x11B6] }, +{ source: [0xB070], NFC: [0xB070], NFD: [0x1101, 0x1174, 0x11B7], NFKC: [0xB070], NFKD: [0x1101, 0x1174, 0x11B7] }, +{ source: [0xB071], NFC: [0xB071], NFD: [0x1101, 0x1174, 0x11B8], NFKC: [0xB071], NFKD: [0x1101, 0x1174, 0x11B8] }, +{ source: [0xB072], NFC: [0xB072], NFD: [0x1101, 0x1174, 0x11B9], NFKC: [0xB072], NFKD: [0x1101, 0x1174, 0x11B9] }, +{ source: [0xB073], NFC: [0xB073], NFD: [0x1101, 0x1174, 0x11BA], NFKC: [0xB073], NFKD: [0x1101, 0x1174, 0x11BA] }, +{ source: [0xB074], NFC: [0xB074], NFD: [0x1101, 0x1174, 0x11BB], NFKC: [0xB074], NFKD: [0x1101, 0x1174, 0x11BB] }, +{ source: [0xB075], NFC: [0xB075], NFD: [0x1101, 0x1174, 0x11BC], NFKC: [0xB075], NFKD: [0x1101, 0x1174, 0x11BC] }, +{ source: [0xB076], NFC: [0xB076], NFD: [0x1101, 0x1174, 0x11BD], NFKC: [0xB076], NFKD: [0x1101, 0x1174, 0x11BD] }, +{ source: [0xB077], NFC: [0xB077], NFD: [0x1101, 0x1174, 0x11BE], NFKC: [0xB077], NFKD: [0x1101, 0x1174, 0x11BE] }, +{ source: [0xB078], NFC: [0xB078], NFD: [0x1101, 0x1174, 0x11BF], NFKC: [0xB078], NFKD: [0x1101, 0x1174, 0x11BF] }, +{ source: [0xB079], NFC: [0xB079], NFD: [0x1101, 0x1174, 0x11C0], NFKC: [0xB079], NFKD: [0x1101, 0x1174, 0x11C0] }, +{ source: [0xB07A], NFC: [0xB07A], NFD: [0x1101, 0x1174, 0x11C1], NFKC: [0xB07A], NFKD: [0x1101, 0x1174, 0x11C1] }, +{ source: [0xB07B], NFC: [0xB07B], NFD: [0x1101, 0x1174, 0x11C2], NFKC: [0xB07B], NFKD: [0x1101, 0x1174, 0x11C2] }, +{ source: [0xB07C], NFC: [0xB07C], NFD: [0x1101, 0x1175], NFKC: [0xB07C], NFKD: [0x1101, 0x1175] }, +{ source: [0xB07D], NFC: [0xB07D], NFD: [0x1101, 0x1175, 0x11A8], NFKC: [0xB07D], NFKD: [0x1101, 0x1175, 0x11A8] }, +{ source: [0xB07E], NFC: [0xB07E], NFD: [0x1101, 0x1175, 0x11A9], NFKC: [0xB07E], NFKD: [0x1101, 0x1175, 0x11A9] }, +{ source: [0xB07F], NFC: [0xB07F], NFD: [0x1101, 0x1175, 0x11AA], NFKC: [0xB07F], NFKD: [0x1101, 0x1175, 0x11AA] }, +{ source: [0xB080], NFC: [0xB080], NFD: [0x1101, 0x1175, 0x11AB], NFKC: [0xB080], NFKD: [0x1101, 0x1175, 0x11AB] }, +{ source: [0xB081], NFC: [0xB081], NFD: [0x1101, 0x1175, 0x11AC], NFKC: [0xB081], NFKD: [0x1101, 0x1175, 0x11AC] }, +{ source: [0xB082], NFC: [0xB082], NFD: [0x1101, 0x1175, 0x11AD], NFKC: [0xB082], NFKD: [0x1101, 0x1175, 0x11AD] }, +{ source: [0xB083], NFC: [0xB083], NFD: [0x1101, 0x1175, 0x11AE], NFKC: [0xB083], NFKD: [0x1101, 0x1175, 0x11AE] }, +{ source: [0xB084], NFC: [0xB084], NFD: [0x1101, 0x1175, 0x11AF], NFKC: [0xB084], NFKD: [0x1101, 0x1175, 0x11AF] }, +{ source: [0xB085], NFC: [0xB085], NFD: [0x1101, 0x1175, 0x11B0], NFKC: [0xB085], NFKD: [0x1101, 0x1175, 0x11B0] }, +{ source: [0xB086], NFC: [0xB086], NFD: [0x1101, 0x1175, 0x11B1], NFKC: [0xB086], NFKD: [0x1101, 0x1175, 0x11B1] }, +{ source: [0xB087], NFC: [0xB087], NFD: [0x1101, 0x1175, 0x11B2], NFKC: [0xB087], NFKD: [0x1101, 0x1175, 0x11B2] }, +{ source: [0xB088], NFC: [0xB088], NFD: [0x1101, 0x1175, 0x11B3], NFKC: [0xB088], NFKD: [0x1101, 0x1175, 0x11B3] }, +{ source: [0xB089], NFC: [0xB089], NFD: [0x1101, 0x1175, 0x11B4], NFKC: [0xB089], NFKD: [0x1101, 0x1175, 0x11B4] }, +{ source: [0xB08A], NFC: [0xB08A], NFD: [0x1101, 0x1175, 0x11B5], NFKC: [0xB08A], NFKD: [0x1101, 0x1175, 0x11B5] }, +{ source: [0xB08B], NFC: [0xB08B], NFD: [0x1101, 0x1175, 0x11B6], NFKC: [0xB08B], NFKD: [0x1101, 0x1175, 0x11B6] }, +{ source: [0xB08C], NFC: [0xB08C], NFD: [0x1101, 0x1175, 0x11B7], NFKC: [0xB08C], NFKD: [0x1101, 0x1175, 0x11B7] }, +{ source: [0xB08D], NFC: [0xB08D], NFD: [0x1101, 0x1175, 0x11B8], NFKC: [0xB08D], NFKD: [0x1101, 0x1175, 0x11B8] }, +{ source: [0xB08E], NFC: [0xB08E], NFD: [0x1101, 0x1175, 0x11B9], NFKC: [0xB08E], NFKD: [0x1101, 0x1175, 0x11B9] }, +{ source: [0xB08F], NFC: [0xB08F], NFD: [0x1101, 0x1175, 0x11BA], NFKC: [0xB08F], NFKD: [0x1101, 0x1175, 0x11BA] }, +{ source: [0xB090], NFC: [0xB090], NFD: [0x1101, 0x1175, 0x11BB], NFKC: [0xB090], NFKD: [0x1101, 0x1175, 0x11BB] }, +{ source: [0xB091], NFC: [0xB091], NFD: [0x1101, 0x1175, 0x11BC], NFKC: [0xB091], NFKD: [0x1101, 0x1175, 0x11BC] }, +{ source: [0xB092], NFC: [0xB092], NFD: [0x1101, 0x1175, 0x11BD], NFKC: [0xB092], NFKD: [0x1101, 0x1175, 0x11BD] }, +{ source: [0xB093], NFC: [0xB093], NFD: [0x1101, 0x1175, 0x11BE], NFKC: [0xB093], NFKD: [0x1101, 0x1175, 0x11BE] }, +{ source: [0xB094], NFC: [0xB094], NFD: [0x1101, 0x1175, 0x11BF], NFKC: [0xB094], NFKD: [0x1101, 0x1175, 0x11BF] }, +{ source: [0xB095], NFC: [0xB095], NFD: [0x1101, 0x1175, 0x11C0], NFKC: [0xB095], NFKD: [0x1101, 0x1175, 0x11C0] }, +{ source: [0xB096], NFC: [0xB096], NFD: [0x1101, 0x1175, 0x11C1], NFKC: [0xB096], NFKD: [0x1101, 0x1175, 0x11C1] }, +{ source: [0xB097], NFC: [0xB097], NFD: [0x1101, 0x1175, 0x11C2], NFKC: [0xB097], NFKD: [0x1101, 0x1175, 0x11C2] }, +{ source: [0xB098], NFC: [0xB098], NFD: [0x1102, 0x1161], NFKC: [0xB098], NFKD: [0x1102, 0x1161] }, +{ source: [0xB099], NFC: [0xB099], NFD: [0x1102, 0x1161, 0x11A8], NFKC: [0xB099], NFKD: [0x1102, 0x1161, 0x11A8] }, +{ source: [0xB09A], NFC: [0xB09A], NFD: [0x1102, 0x1161, 0x11A9], NFKC: [0xB09A], NFKD: [0x1102, 0x1161, 0x11A9] }, +{ source: [0xB09B], NFC: [0xB09B], NFD: [0x1102, 0x1161, 0x11AA], NFKC: [0xB09B], NFKD: [0x1102, 0x1161, 0x11AA] }, +{ source: [0xB09C], NFC: [0xB09C], NFD: [0x1102, 0x1161, 0x11AB], NFKC: [0xB09C], NFKD: [0x1102, 0x1161, 0x11AB] }, +{ source: [0xB09D], NFC: [0xB09D], NFD: [0x1102, 0x1161, 0x11AC], NFKC: [0xB09D], NFKD: [0x1102, 0x1161, 0x11AC] }, +{ source: [0xB09E], NFC: [0xB09E], NFD: [0x1102, 0x1161, 0x11AD], NFKC: [0xB09E], NFKD: [0x1102, 0x1161, 0x11AD] }, +{ source: [0xB09F], NFC: [0xB09F], NFD: [0x1102, 0x1161, 0x11AE], NFKC: [0xB09F], NFKD: [0x1102, 0x1161, 0x11AE] }, +{ source: [0xB0A0], NFC: [0xB0A0], NFD: [0x1102, 0x1161, 0x11AF], NFKC: [0xB0A0], NFKD: [0x1102, 0x1161, 0x11AF] }, +{ source: [0xB0A1], NFC: [0xB0A1], NFD: [0x1102, 0x1161, 0x11B0], NFKC: [0xB0A1], NFKD: [0x1102, 0x1161, 0x11B0] }, +{ source: [0xB0A2], NFC: [0xB0A2], NFD: [0x1102, 0x1161, 0x11B1], NFKC: [0xB0A2], NFKD: [0x1102, 0x1161, 0x11B1] }, +{ source: [0xB0A3], NFC: [0xB0A3], NFD: [0x1102, 0x1161, 0x11B2], NFKC: [0xB0A3], NFKD: [0x1102, 0x1161, 0x11B2] }, +{ source: [0xB0A4], NFC: [0xB0A4], NFD: [0x1102, 0x1161, 0x11B3], NFKC: [0xB0A4], NFKD: [0x1102, 0x1161, 0x11B3] }, +{ source: [0xB0A5], NFC: [0xB0A5], NFD: [0x1102, 0x1161, 0x11B4], NFKC: [0xB0A5], NFKD: [0x1102, 0x1161, 0x11B4] }, +{ source: [0xB0A6], NFC: [0xB0A6], NFD: [0x1102, 0x1161, 0x11B5], NFKC: [0xB0A6], NFKD: [0x1102, 0x1161, 0x11B5] }, +{ source: [0xB0A7], NFC: [0xB0A7], NFD: [0x1102, 0x1161, 0x11B6], NFKC: [0xB0A7], NFKD: [0x1102, 0x1161, 0x11B6] }, +{ source: [0xB0A8], NFC: [0xB0A8], NFD: [0x1102, 0x1161, 0x11B7], NFKC: [0xB0A8], NFKD: [0x1102, 0x1161, 0x11B7] }, +{ source: [0xB0A9], NFC: [0xB0A9], NFD: [0x1102, 0x1161, 0x11B8], NFKC: [0xB0A9], NFKD: [0x1102, 0x1161, 0x11B8] }, +{ source: [0xB0AA], NFC: [0xB0AA], NFD: [0x1102, 0x1161, 0x11B9], NFKC: [0xB0AA], NFKD: [0x1102, 0x1161, 0x11B9] }, +{ source: [0xB0AB], NFC: [0xB0AB], NFD: [0x1102, 0x1161, 0x11BA], NFKC: [0xB0AB], NFKD: [0x1102, 0x1161, 0x11BA] }, +{ source: [0xB0AC], NFC: [0xB0AC], NFD: [0x1102, 0x1161, 0x11BB], NFKC: [0xB0AC], NFKD: [0x1102, 0x1161, 0x11BB] }, +{ source: [0xB0AD], NFC: [0xB0AD], NFD: [0x1102, 0x1161, 0x11BC], NFKC: [0xB0AD], NFKD: [0x1102, 0x1161, 0x11BC] }, +{ source: [0xB0AE], NFC: [0xB0AE], NFD: [0x1102, 0x1161, 0x11BD], NFKC: [0xB0AE], NFKD: [0x1102, 0x1161, 0x11BD] }, +{ source: [0xB0AF], NFC: [0xB0AF], NFD: [0x1102, 0x1161, 0x11BE], NFKC: [0xB0AF], NFKD: [0x1102, 0x1161, 0x11BE] }, +{ source: [0xB0B0], NFC: [0xB0B0], NFD: [0x1102, 0x1161, 0x11BF], NFKC: [0xB0B0], NFKD: [0x1102, 0x1161, 0x11BF] }, +{ source: [0xB0B1], NFC: [0xB0B1], NFD: [0x1102, 0x1161, 0x11C0], NFKC: [0xB0B1], NFKD: [0x1102, 0x1161, 0x11C0] }, +{ source: [0xB0B2], NFC: [0xB0B2], NFD: [0x1102, 0x1161, 0x11C1], NFKC: [0xB0B2], NFKD: [0x1102, 0x1161, 0x11C1] }, +{ source: [0xB0B3], NFC: [0xB0B3], NFD: [0x1102, 0x1161, 0x11C2], NFKC: [0xB0B3], NFKD: [0x1102, 0x1161, 0x11C2] }, +{ source: [0xB0B4], NFC: [0xB0B4], NFD: [0x1102, 0x1162], NFKC: [0xB0B4], NFKD: [0x1102, 0x1162] }, +{ source: [0xB0B5], NFC: [0xB0B5], NFD: [0x1102, 0x1162, 0x11A8], NFKC: [0xB0B5], NFKD: [0x1102, 0x1162, 0x11A8] }, +{ source: [0xB0B6], NFC: [0xB0B6], NFD: [0x1102, 0x1162, 0x11A9], NFKC: [0xB0B6], NFKD: [0x1102, 0x1162, 0x11A9] }, +{ source: [0xB0B7], NFC: [0xB0B7], NFD: [0x1102, 0x1162, 0x11AA], NFKC: [0xB0B7], NFKD: [0x1102, 0x1162, 0x11AA] }, +{ source: [0xB0B8], NFC: [0xB0B8], NFD: [0x1102, 0x1162, 0x11AB], NFKC: [0xB0B8], NFKD: [0x1102, 0x1162, 0x11AB] }, +{ source: [0xB0B9], NFC: [0xB0B9], NFD: [0x1102, 0x1162, 0x11AC], NFKC: [0xB0B9], NFKD: [0x1102, 0x1162, 0x11AC] }, +{ source: [0xB0BA], NFC: [0xB0BA], NFD: [0x1102, 0x1162, 0x11AD], NFKC: [0xB0BA], NFKD: [0x1102, 0x1162, 0x11AD] }, +{ source: [0xB0BB], NFC: [0xB0BB], NFD: [0x1102, 0x1162, 0x11AE], NFKC: [0xB0BB], NFKD: [0x1102, 0x1162, 0x11AE] }, +{ source: [0xB0BC], NFC: [0xB0BC], NFD: [0x1102, 0x1162, 0x11AF], NFKC: [0xB0BC], NFKD: [0x1102, 0x1162, 0x11AF] }, +{ source: [0xB0BD], NFC: [0xB0BD], NFD: [0x1102, 0x1162, 0x11B0], NFKC: [0xB0BD], NFKD: [0x1102, 0x1162, 0x11B0] }, +{ source: [0xB0BE], NFC: [0xB0BE], NFD: [0x1102, 0x1162, 0x11B1], NFKC: [0xB0BE], NFKD: [0x1102, 0x1162, 0x11B1] }, +{ source: [0xB0BF], NFC: [0xB0BF], NFD: [0x1102, 0x1162, 0x11B2], NFKC: [0xB0BF], NFKD: [0x1102, 0x1162, 0x11B2] }, +{ source: [0xB0C0], NFC: [0xB0C0], NFD: [0x1102, 0x1162, 0x11B3], NFKC: [0xB0C0], NFKD: [0x1102, 0x1162, 0x11B3] }, +{ source: [0xB0C1], NFC: [0xB0C1], NFD: [0x1102, 0x1162, 0x11B4], NFKC: [0xB0C1], NFKD: [0x1102, 0x1162, 0x11B4] }, +{ source: [0xB0C2], NFC: [0xB0C2], NFD: [0x1102, 0x1162, 0x11B5], NFKC: [0xB0C2], NFKD: [0x1102, 0x1162, 0x11B5] }, +{ source: [0xB0C3], NFC: [0xB0C3], NFD: [0x1102, 0x1162, 0x11B6], NFKC: [0xB0C3], NFKD: [0x1102, 0x1162, 0x11B6] }, +{ source: [0xB0C4], NFC: [0xB0C4], NFD: [0x1102, 0x1162, 0x11B7], NFKC: [0xB0C4], NFKD: [0x1102, 0x1162, 0x11B7] }, +{ source: [0xB0C5], NFC: [0xB0C5], NFD: [0x1102, 0x1162, 0x11B8], NFKC: [0xB0C5], NFKD: [0x1102, 0x1162, 0x11B8] }, +{ source: [0xB0C6], NFC: [0xB0C6], NFD: [0x1102, 0x1162, 0x11B9], NFKC: [0xB0C6], NFKD: [0x1102, 0x1162, 0x11B9] }, +{ source: [0xB0C7], NFC: [0xB0C7], NFD: [0x1102, 0x1162, 0x11BA], NFKC: [0xB0C7], NFKD: [0x1102, 0x1162, 0x11BA] }, +{ source: [0xB0C8], NFC: [0xB0C8], NFD: [0x1102, 0x1162, 0x11BB], NFKC: [0xB0C8], NFKD: [0x1102, 0x1162, 0x11BB] }, +{ source: [0xB0C9], NFC: [0xB0C9], NFD: [0x1102, 0x1162, 0x11BC], NFKC: [0xB0C9], NFKD: [0x1102, 0x1162, 0x11BC] }, +{ source: [0xB0CA], NFC: [0xB0CA], NFD: [0x1102, 0x1162, 0x11BD], NFKC: [0xB0CA], NFKD: [0x1102, 0x1162, 0x11BD] }, +{ source: [0xB0CB], NFC: [0xB0CB], NFD: [0x1102, 0x1162, 0x11BE], NFKC: [0xB0CB], NFKD: [0x1102, 0x1162, 0x11BE] }, +{ source: [0xB0CC], NFC: [0xB0CC], NFD: [0x1102, 0x1162, 0x11BF], NFKC: [0xB0CC], NFKD: [0x1102, 0x1162, 0x11BF] }, +{ source: [0xB0CD], NFC: [0xB0CD], NFD: [0x1102, 0x1162, 0x11C0], NFKC: [0xB0CD], NFKD: [0x1102, 0x1162, 0x11C0] }, +{ source: [0xB0CE], NFC: [0xB0CE], NFD: [0x1102, 0x1162, 0x11C1], NFKC: [0xB0CE], NFKD: [0x1102, 0x1162, 0x11C1] }, +{ source: [0xB0CF], NFC: [0xB0CF], NFD: [0x1102, 0x1162, 0x11C2], NFKC: [0xB0CF], NFKD: [0x1102, 0x1162, 0x11C2] }, +{ source: [0xB0D0], NFC: [0xB0D0], NFD: [0x1102, 0x1163], NFKC: [0xB0D0], NFKD: [0x1102, 0x1163] }, +{ source: [0xB0D1], NFC: [0xB0D1], NFD: [0x1102, 0x1163, 0x11A8], NFKC: [0xB0D1], NFKD: [0x1102, 0x1163, 0x11A8] }, +{ source: [0xB0D2], NFC: [0xB0D2], NFD: [0x1102, 0x1163, 0x11A9], NFKC: [0xB0D2], NFKD: [0x1102, 0x1163, 0x11A9] }, +{ source: [0xB0D3], NFC: [0xB0D3], NFD: [0x1102, 0x1163, 0x11AA], NFKC: [0xB0D3], NFKD: [0x1102, 0x1163, 0x11AA] }, +{ source: [0xB0D4], NFC: [0xB0D4], NFD: [0x1102, 0x1163, 0x11AB], NFKC: [0xB0D4], NFKD: [0x1102, 0x1163, 0x11AB] }, +{ source: [0xB0D5], NFC: [0xB0D5], NFD: [0x1102, 0x1163, 0x11AC], NFKC: [0xB0D5], NFKD: [0x1102, 0x1163, 0x11AC] }, +{ source: [0xB0D6], NFC: [0xB0D6], NFD: [0x1102, 0x1163, 0x11AD], NFKC: [0xB0D6], NFKD: [0x1102, 0x1163, 0x11AD] }, +{ source: [0xB0D7], NFC: [0xB0D7], NFD: [0x1102, 0x1163, 0x11AE], NFKC: [0xB0D7], NFKD: [0x1102, 0x1163, 0x11AE] }, +{ source: [0xB0D8], NFC: [0xB0D8], NFD: [0x1102, 0x1163, 0x11AF], NFKC: [0xB0D8], NFKD: [0x1102, 0x1163, 0x11AF] }, +{ source: [0xB0D9], NFC: [0xB0D9], NFD: [0x1102, 0x1163, 0x11B0], NFKC: [0xB0D9], NFKD: [0x1102, 0x1163, 0x11B0] }, +{ source: [0xB0DA], NFC: [0xB0DA], NFD: [0x1102, 0x1163, 0x11B1], NFKC: [0xB0DA], NFKD: [0x1102, 0x1163, 0x11B1] }, +{ source: [0xB0DB], NFC: [0xB0DB], NFD: [0x1102, 0x1163, 0x11B2], NFKC: [0xB0DB], NFKD: [0x1102, 0x1163, 0x11B2] }, +{ source: [0xB0DC], NFC: [0xB0DC], NFD: [0x1102, 0x1163, 0x11B3], NFKC: [0xB0DC], NFKD: [0x1102, 0x1163, 0x11B3] }, +{ source: [0xB0DD], NFC: [0xB0DD], NFD: [0x1102, 0x1163, 0x11B4], NFKC: [0xB0DD], NFKD: [0x1102, 0x1163, 0x11B4] }, +{ source: [0xB0DE], NFC: [0xB0DE], NFD: [0x1102, 0x1163, 0x11B5], NFKC: [0xB0DE], NFKD: [0x1102, 0x1163, 0x11B5] }, +{ source: [0xB0DF], NFC: [0xB0DF], NFD: [0x1102, 0x1163, 0x11B6], NFKC: [0xB0DF], NFKD: [0x1102, 0x1163, 0x11B6] }, +{ source: [0xB0E0], NFC: [0xB0E0], NFD: [0x1102, 0x1163, 0x11B7], NFKC: [0xB0E0], NFKD: [0x1102, 0x1163, 0x11B7] }, +{ source: [0xB0E1], NFC: [0xB0E1], NFD: [0x1102, 0x1163, 0x11B8], NFKC: [0xB0E1], NFKD: [0x1102, 0x1163, 0x11B8] }, +{ source: [0xB0E2], NFC: [0xB0E2], NFD: [0x1102, 0x1163, 0x11B9], NFKC: [0xB0E2], NFKD: [0x1102, 0x1163, 0x11B9] }, +{ source: [0xB0E3], NFC: [0xB0E3], NFD: [0x1102, 0x1163, 0x11BA], NFKC: [0xB0E3], NFKD: [0x1102, 0x1163, 0x11BA] }, +{ source: [0xB0E4], NFC: [0xB0E4], NFD: [0x1102, 0x1163, 0x11BB], NFKC: [0xB0E4], NFKD: [0x1102, 0x1163, 0x11BB] }, +{ source: [0xB0E5], NFC: [0xB0E5], NFD: [0x1102, 0x1163, 0x11BC], NFKC: [0xB0E5], NFKD: [0x1102, 0x1163, 0x11BC] }, +{ source: [0xB0E6], NFC: [0xB0E6], NFD: [0x1102, 0x1163, 0x11BD], NFKC: [0xB0E6], NFKD: [0x1102, 0x1163, 0x11BD] }, +{ source: [0xB0E7], NFC: [0xB0E7], NFD: [0x1102, 0x1163, 0x11BE], NFKC: [0xB0E7], NFKD: [0x1102, 0x1163, 0x11BE] }, +{ source: [0xB0E8], NFC: [0xB0E8], NFD: [0x1102, 0x1163, 0x11BF], NFKC: [0xB0E8], NFKD: [0x1102, 0x1163, 0x11BF] }, +{ source: [0xB0E9], NFC: [0xB0E9], NFD: [0x1102, 0x1163, 0x11C0], NFKC: [0xB0E9], NFKD: [0x1102, 0x1163, 0x11C0] }, +{ source: [0xB0EA], NFC: [0xB0EA], NFD: [0x1102, 0x1163, 0x11C1], NFKC: [0xB0EA], NFKD: [0x1102, 0x1163, 0x11C1] }, +{ source: [0xB0EB], NFC: [0xB0EB], NFD: [0x1102, 0x1163, 0x11C2], NFKC: [0xB0EB], NFKD: [0x1102, 0x1163, 0x11C2] }, +{ source: [0xB0EC], NFC: [0xB0EC], NFD: [0x1102, 0x1164], NFKC: [0xB0EC], NFKD: [0x1102, 0x1164] }, +{ source: [0xB0ED], NFC: [0xB0ED], NFD: [0x1102, 0x1164, 0x11A8], NFKC: [0xB0ED], NFKD: [0x1102, 0x1164, 0x11A8] }, +{ source: [0xB0EE], NFC: [0xB0EE], NFD: [0x1102, 0x1164, 0x11A9], NFKC: [0xB0EE], NFKD: [0x1102, 0x1164, 0x11A9] }, +{ source: [0xB0EF], NFC: [0xB0EF], NFD: [0x1102, 0x1164, 0x11AA], NFKC: [0xB0EF], NFKD: [0x1102, 0x1164, 0x11AA] }, +{ source: [0xB0F0], NFC: [0xB0F0], NFD: [0x1102, 0x1164, 0x11AB], NFKC: [0xB0F0], NFKD: [0x1102, 0x1164, 0x11AB] }, +{ source: [0xB0F1], NFC: [0xB0F1], NFD: [0x1102, 0x1164, 0x11AC], NFKC: [0xB0F1], NFKD: [0x1102, 0x1164, 0x11AC] }, +{ source: [0xB0F2], NFC: [0xB0F2], NFD: [0x1102, 0x1164, 0x11AD], NFKC: [0xB0F2], NFKD: [0x1102, 0x1164, 0x11AD] }, +{ source: [0xB0F3], NFC: [0xB0F3], NFD: [0x1102, 0x1164, 0x11AE], NFKC: [0xB0F3], NFKD: [0x1102, 0x1164, 0x11AE] }, +{ source: [0xB0F4], NFC: [0xB0F4], NFD: [0x1102, 0x1164, 0x11AF], NFKC: [0xB0F4], NFKD: [0x1102, 0x1164, 0x11AF] }, +{ source: [0xB0F5], NFC: [0xB0F5], NFD: [0x1102, 0x1164, 0x11B0], NFKC: [0xB0F5], NFKD: [0x1102, 0x1164, 0x11B0] }, +{ source: [0xB0F6], NFC: [0xB0F6], NFD: [0x1102, 0x1164, 0x11B1], NFKC: [0xB0F6], NFKD: [0x1102, 0x1164, 0x11B1] }, +{ source: [0xB0F7], NFC: [0xB0F7], NFD: [0x1102, 0x1164, 0x11B2], NFKC: [0xB0F7], NFKD: [0x1102, 0x1164, 0x11B2] }, +{ source: [0xB0F8], NFC: [0xB0F8], NFD: [0x1102, 0x1164, 0x11B3], NFKC: [0xB0F8], NFKD: [0x1102, 0x1164, 0x11B3] }, +{ source: [0xB0F9], NFC: [0xB0F9], NFD: [0x1102, 0x1164, 0x11B4], NFKC: [0xB0F9], NFKD: [0x1102, 0x1164, 0x11B4] }, +{ source: [0xB0FA], NFC: [0xB0FA], NFD: [0x1102, 0x1164, 0x11B5], NFKC: [0xB0FA], NFKD: [0x1102, 0x1164, 0x11B5] }, +{ source: [0xB0FB], NFC: [0xB0FB], NFD: [0x1102, 0x1164, 0x11B6], NFKC: [0xB0FB], NFKD: [0x1102, 0x1164, 0x11B6] }, +{ source: [0xB0FC], NFC: [0xB0FC], NFD: [0x1102, 0x1164, 0x11B7], NFKC: [0xB0FC], NFKD: [0x1102, 0x1164, 0x11B7] }, +{ source: [0xB0FD], NFC: [0xB0FD], NFD: [0x1102, 0x1164, 0x11B8], NFKC: [0xB0FD], NFKD: [0x1102, 0x1164, 0x11B8] }, +{ source: [0xB0FE], NFC: [0xB0FE], NFD: [0x1102, 0x1164, 0x11B9], NFKC: [0xB0FE], NFKD: [0x1102, 0x1164, 0x11B9] }, +{ source: [0xB0FF], NFC: [0xB0FF], NFD: [0x1102, 0x1164, 0x11BA], NFKC: [0xB0FF], NFKD: [0x1102, 0x1164, 0x11BA] }, +{ source: [0xB100], NFC: [0xB100], NFD: [0x1102, 0x1164, 0x11BB], NFKC: [0xB100], NFKD: [0x1102, 0x1164, 0x11BB] }, +{ source: [0xB101], NFC: [0xB101], NFD: [0x1102, 0x1164, 0x11BC], NFKC: [0xB101], NFKD: [0x1102, 0x1164, 0x11BC] }, +{ source: [0xB102], NFC: [0xB102], NFD: [0x1102, 0x1164, 0x11BD], NFKC: [0xB102], NFKD: [0x1102, 0x1164, 0x11BD] }, +{ source: [0xB103], NFC: [0xB103], NFD: [0x1102, 0x1164, 0x11BE], NFKC: [0xB103], NFKD: [0x1102, 0x1164, 0x11BE] }, +{ source: [0xB104], NFC: [0xB104], NFD: [0x1102, 0x1164, 0x11BF], NFKC: [0xB104], NFKD: [0x1102, 0x1164, 0x11BF] }, +{ source: [0xB105], NFC: [0xB105], NFD: [0x1102, 0x1164, 0x11C0], NFKC: [0xB105], NFKD: [0x1102, 0x1164, 0x11C0] }, +{ source: [0xB106], NFC: [0xB106], NFD: [0x1102, 0x1164, 0x11C1], NFKC: [0xB106], NFKD: [0x1102, 0x1164, 0x11C1] }, +{ source: [0xB107], NFC: [0xB107], NFD: [0x1102, 0x1164, 0x11C2], NFKC: [0xB107], NFKD: [0x1102, 0x1164, 0x11C2] }, +{ source: [0xB108], NFC: [0xB108], NFD: [0x1102, 0x1165], NFKC: [0xB108], NFKD: [0x1102, 0x1165] }, +{ source: [0xB109], NFC: [0xB109], NFD: [0x1102, 0x1165, 0x11A8], NFKC: [0xB109], NFKD: [0x1102, 0x1165, 0x11A8] }, +{ source: [0xB10A], NFC: [0xB10A], NFD: [0x1102, 0x1165, 0x11A9], NFKC: [0xB10A], NFKD: [0x1102, 0x1165, 0x11A9] }, +{ source: [0xB10B], NFC: [0xB10B], NFD: [0x1102, 0x1165, 0x11AA], NFKC: [0xB10B], NFKD: [0x1102, 0x1165, 0x11AA] }, +{ source: [0xB10C], NFC: [0xB10C], NFD: [0x1102, 0x1165, 0x11AB], NFKC: [0xB10C], NFKD: [0x1102, 0x1165, 0x11AB] }, +{ source: [0xB10D], NFC: [0xB10D], NFD: [0x1102, 0x1165, 0x11AC], NFKC: [0xB10D], NFKD: [0x1102, 0x1165, 0x11AC] }, +{ source: [0xB10E], NFC: [0xB10E], NFD: [0x1102, 0x1165, 0x11AD], NFKC: [0xB10E], NFKD: [0x1102, 0x1165, 0x11AD] }, +{ source: [0xB10F], NFC: [0xB10F], NFD: [0x1102, 0x1165, 0x11AE], NFKC: [0xB10F], NFKD: [0x1102, 0x1165, 0x11AE] }, +{ source: [0xB110], NFC: [0xB110], NFD: [0x1102, 0x1165, 0x11AF], NFKC: [0xB110], NFKD: [0x1102, 0x1165, 0x11AF] }, +{ source: [0xB111], NFC: [0xB111], NFD: [0x1102, 0x1165, 0x11B0], NFKC: [0xB111], NFKD: [0x1102, 0x1165, 0x11B0] }, +{ source: [0xB112], NFC: [0xB112], NFD: [0x1102, 0x1165, 0x11B1], NFKC: [0xB112], NFKD: [0x1102, 0x1165, 0x11B1] }, +{ source: [0xB113], NFC: [0xB113], NFD: [0x1102, 0x1165, 0x11B2], NFKC: [0xB113], NFKD: [0x1102, 0x1165, 0x11B2] }, +{ source: [0xB114], NFC: [0xB114], NFD: [0x1102, 0x1165, 0x11B3], NFKC: [0xB114], NFKD: [0x1102, 0x1165, 0x11B3] }, +{ source: [0xB115], NFC: [0xB115], NFD: [0x1102, 0x1165, 0x11B4], NFKC: [0xB115], NFKD: [0x1102, 0x1165, 0x11B4] }, +{ source: [0xB116], NFC: [0xB116], NFD: [0x1102, 0x1165, 0x11B5], NFKC: [0xB116], NFKD: [0x1102, 0x1165, 0x11B5] }, +{ source: [0xB117], NFC: [0xB117], NFD: [0x1102, 0x1165, 0x11B6], NFKC: [0xB117], NFKD: [0x1102, 0x1165, 0x11B6] }, +{ source: [0xB118], NFC: [0xB118], NFD: [0x1102, 0x1165, 0x11B7], NFKC: [0xB118], NFKD: [0x1102, 0x1165, 0x11B7] }, +{ source: [0xB119], NFC: [0xB119], NFD: [0x1102, 0x1165, 0x11B8], NFKC: [0xB119], NFKD: [0x1102, 0x1165, 0x11B8] }, +{ source: [0xB11A], NFC: [0xB11A], NFD: [0x1102, 0x1165, 0x11B9], NFKC: [0xB11A], NFKD: [0x1102, 0x1165, 0x11B9] }, +{ source: [0xB11B], NFC: [0xB11B], NFD: [0x1102, 0x1165, 0x11BA], NFKC: [0xB11B], NFKD: [0x1102, 0x1165, 0x11BA] }, +{ source: [0xB11C], NFC: [0xB11C], NFD: [0x1102, 0x1165, 0x11BB], NFKC: [0xB11C], NFKD: [0x1102, 0x1165, 0x11BB] }, +{ source: [0xB11D], NFC: [0xB11D], NFD: [0x1102, 0x1165, 0x11BC], NFKC: [0xB11D], NFKD: [0x1102, 0x1165, 0x11BC] }, +{ source: [0xB11E], NFC: [0xB11E], NFD: [0x1102, 0x1165, 0x11BD], NFKC: [0xB11E], NFKD: [0x1102, 0x1165, 0x11BD] }, +{ source: [0xB11F], NFC: [0xB11F], NFD: [0x1102, 0x1165, 0x11BE], NFKC: [0xB11F], NFKD: [0x1102, 0x1165, 0x11BE] }, +{ source: [0xB120], NFC: [0xB120], NFD: [0x1102, 0x1165, 0x11BF], NFKC: [0xB120], NFKD: [0x1102, 0x1165, 0x11BF] }, +{ source: [0xB121], NFC: [0xB121], NFD: [0x1102, 0x1165, 0x11C0], NFKC: [0xB121], NFKD: [0x1102, 0x1165, 0x11C0] }, +{ source: [0xB122], NFC: [0xB122], NFD: [0x1102, 0x1165, 0x11C1], NFKC: [0xB122], NFKD: [0x1102, 0x1165, 0x11C1] }, +{ source: [0xB123], NFC: [0xB123], NFD: [0x1102, 0x1165, 0x11C2], NFKC: [0xB123], NFKD: [0x1102, 0x1165, 0x11C2] }, +{ source: [0xB124], NFC: [0xB124], NFD: [0x1102, 0x1166], NFKC: [0xB124], NFKD: [0x1102, 0x1166] }, +{ source: [0xB125], NFC: [0xB125], NFD: [0x1102, 0x1166, 0x11A8], NFKC: [0xB125], NFKD: [0x1102, 0x1166, 0x11A8] }, +{ source: [0xB126], NFC: [0xB126], NFD: [0x1102, 0x1166, 0x11A9], NFKC: [0xB126], NFKD: [0x1102, 0x1166, 0x11A9] }, +{ source: [0xB127], NFC: [0xB127], NFD: [0x1102, 0x1166, 0x11AA], NFKC: [0xB127], NFKD: [0x1102, 0x1166, 0x11AA] }, +{ source: [0xB128], NFC: [0xB128], NFD: [0x1102, 0x1166, 0x11AB], NFKC: [0xB128], NFKD: [0x1102, 0x1166, 0x11AB] }, +{ source: [0xB129], NFC: [0xB129], NFD: [0x1102, 0x1166, 0x11AC], NFKC: [0xB129], NFKD: [0x1102, 0x1166, 0x11AC] }, +{ source: [0xB12A], NFC: [0xB12A], NFD: [0x1102, 0x1166, 0x11AD], NFKC: [0xB12A], NFKD: [0x1102, 0x1166, 0x11AD] }, +{ source: [0xB12B], NFC: [0xB12B], NFD: [0x1102, 0x1166, 0x11AE], NFKC: [0xB12B], NFKD: [0x1102, 0x1166, 0x11AE] }, +{ source: [0xB12C], NFC: [0xB12C], NFD: [0x1102, 0x1166, 0x11AF], NFKC: [0xB12C], NFKD: [0x1102, 0x1166, 0x11AF] }, +{ source: [0xB12D], NFC: [0xB12D], NFD: [0x1102, 0x1166, 0x11B0], NFKC: [0xB12D], NFKD: [0x1102, 0x1166, 0x11B0] }, +{ source: [0xB12E], NFC: [0xB12E], NFD: [0x1102, 0x1166, 0x11B1], NFKC: [0xB12E], NFKD: [0x1102, 0x1166, 0x11B1] }, +{ source: [0xB12F], NFC: [0xB12F], NFD: [0x1102, 0x1166, 0x11B2], NFKC: [0xB12F], NFKD: [0x1102, 0x1166, 0x11B2] }, +{ source: [0xB130], NFC: [0xB130], NFD: [0x1102, 0x1166, 0x11B3], NFKC: [0xB130], NFKD: [0x1102, 0x1166, 0x11B3] }, +{ source: [0xB131], NFC: [0xB131], NFD: [0x1102, 0x1166, 0x11B4], NFKC: [0xB131], NFKD: [0x1102, 0x1166, 0x11B4] }, +{ source: [0xB132], NFC: [0xB132], NFD: [0x1102, 0x1166, 0x11B5], NFKC: [0xB132], NFKD: [0x1102, 0x1166, 0x11B5] }, +{ source: [0xB133], NFC: [0xB133], NFD: [0x1102, 0x1166, 0x11B6], NFKC: [0xB133], NFKD: [0x1102, 0x1166, 0x11B6] }, +{ source: [0xB134], NFC: [0xB134], NFD: [0x1102, 0x1166, 0x11B7], NFKC: [0xB134], NFKD: [0x1102, 0x1166, 0x11B7] }, +{ source: [0xB135], NFC: [0xB135], NFD: [0x1102, 0x1166, 0x11B8], NFKC: [0xB135], NFKD: [0x1102, 0x1166, 0x11B8] }, +{ source: [0xB136], NFC: [0xB136], NFD: [0x1102, 0x1166, 0x11B9], NFKC: [0xB136], NFKD: [0x1102, 0x1166, 0x11B9] }, +{ source: [0xB137], NFC: [0xB137], NFD: [0x1102, 0x1166, 0x11BA], NFKC: [0xB137], NFKD: [0x1102, 0x1166, 0x11BA] }, +{ source: [0xB138], NFC: [0xB138], NFD: [0x1102, 0x1166, 0x11BB], NFKC: [0xB138], NFKD: [0x1102, 0x1166, 0x11BB] }, +{ source: [0xB139], NFC: [0xB139], NFD: [0x1102, 0x1166, 0x11BC], NFKC: [0xB139], NFKD: [0x1102, 0x1166, 0x11BC] }, +{ source: [0xB13A], NFC: [0xB13A], NFD: [0x1102, 0x1166, 0x11BD], NFKC: [0xB13A], NFKD: [0x1102, 0x1166, 0x11BD] }, +{ source: [0xB13B], NFC: [0xB13B], NFD: [0x1102, 0x1166, 0x11BE], NFKC: [0xB13B], NFKD: [0x1102, 0x1166, 0x11BE] }, +{ source: [0xB13C], NFC: [0xB13C], NFD: [0x1102, 0x1166, 0x11BF], NFKC: [0xB13C], NFKD: [0x1102, 0x1166, 0x11BF] }, +{ source: [0xB13D], NFC: [0xB13D], NFD: [0x1102, 0x1166, 0x11C0], NFKC: [0xB13D], NFKD: [0x1102, 0x1166, 0x11C0] }, +{ source: [0xB13E], NFC: [0xB13E], NFD: [0x1102, 0x1166, 0x11C1], NFKC: [0xB13E], NFKD: [0x1102, 0x1166, 0x11C1] }, +{ source: [0xB13F], NFC: [0xB13F], NFD: [0x1102, 0x1166, 0x11C2], NFKC: [0xB13F], NFKD: [0x1102, 0x1166, 0x11C2] }, +{ source: [0xB140], NFC: [0xB140], NFD: [0x1102, 0x1167], NFKC: [0xB140], NFKD: [0x1102, 0x1167] }, +{ source: [0xB141], NFC: [0xB141], NFD: [0x1102, 0x1167, 0x11A8], NFKC: [0xB141], NFKD: [0x1102, 0x1167, 0x11A8] }, +{ source: [0xB142], NFC: [0xB142], NFD: [0x1102, 0x1167, 0x11A9], NFKC: [0xB142], NFKD: [0x1102, 0x1167, 0x11A9] }, +{ source: [0xB143], NFC: [0xB143], NFD: [0x1102, 0x1167, 0x11AA], NFKC: [0xB143], NFKD: [0x1102, 0x1167, 0x11AA] }, +{ source: [0xB144], NFC: [0xB144], NFD: [0x1102, 0x1167, 0x11AB], NFKC: [0xB144], NFKD: [0x1102, 0x1167, 0x11AB] }, +{ source: [0xB145], NFC: [0xB145], NFD: [0x1102, 0x1167, 0x11AC], NFKC: [0xB145], NFKD: [0x1102, 0x1167, 0x11AC] }, +{ source: [0xB146], NFC: [0xB146], NFD: [0x1102, 0x1167, 0x11AD], NFKC: [0xB146], NFKD: [0x1102, 0x1167, 0x11AD] }, +{ source: [0xB147], NFC: [0xB147], NFD: [0x1102, 0x1167, 0x11AE], NFKC: [0xB147], NFKD: [0x1102, 0x1167, 0x11AE] }, +{ source: [0xB148], NFC: [0xB148], NFD: [0x1102, 0x1167, 0x11AF], NFKC: [0xB148], NFKD: [0x1102, 0x1167, 0x11AF] }, +{ source: [0xB149], NFC: [0xB149], NFD: [0x1102, 0x1167, 0x11B0], NFKC: [0xB149], NFKD: [0x1102, 0x1167, 0x11B0] }, +{ source: [0xB14A], NFC: [0xB14A], NFD: [0x1102, 0x1167, 0x11B1], NFKC: [0xB14A], NFKD: [0x1102, 0x1167, 0x11B1] }, +{ source: [0xB14B], NFC: [0xB14B], NFD: [0x1102, 0x1167, 0x11B2], NFKC: [0xB14B], NFKD: [0x1102, 0x1167, 0x11B2] }, +{ source: [0xB14C], NFC: [0xB14C], NFD: [0x1102, 0x1167, 0x11B3], NFKC: [0xB14C], NFKD: [0x1102, 0x1167, 0x11B3] }, +{ source: [0xB14D], NFC: [0xB14D], NFD: [0x1102, 0x1167, 0x11B4], NFKC: [0xB14D], NFKD: [0x1102, 0x1167, 0x11B4] }, +{ source: [0xB14E], NFC: [0xB14E], NFD: [0x1102, 0x1167, 0x11B5], NFKC: [0xB14E], NFKD: [0x1102, 0x1167, 0x11B5] }, +{ source: [0xB14F], NFC: [0xB14F], NFD: [0x1102, 0x1167, 0x11B6], NFKC: [0xB14F], NFKD: [0x1102, 0x1167, 0x11B6] }, +{ source: [0xB150], NFC: [0xB150], NFD: [0x1102, 0x1167, 0x11B7], NFKC: [0xB150], NFKD: [0x1102, 0x1167, 0x11B7] }, +{ source: [0xB151], NFC: [0xB151], NFD: [0x1102, 0x1167, 0x11B8], NFKC: [0xB151], NFKD: [0x1102, 0x1167, 0x11B8] }, +{ source: [0xB152], NFC: [0xB152], NFD: [0x1102, 0x1167, 0x11B9], NFKC: [0xB152], NFKD: [0x1102, 0x1167, 0x11B9] }, +{ source: [0xB153], NFC: [0xB153], NFD: [0x1102, 0x1167, 0x11BA], NFKC: [0xB153], NFKD: [0x1102, 0x1167, 0x11BA] }, +{ source: [0xB154], NFC: [0xB154], NFD: [0x1102, 0x1167, 0x11BB], NFKC: [0xB154], NFKD: [0x1102, 0x1167, 0x11BB] }, +{ source: [0xB155], NFC: [0xB155], NFD: [0x1102, 0x1167, 0x11BC], NFKC: [0xB155], NFKD: [0x1102, 0x1167, 0x11BC] }, +{ source: [0xB156], NFC: [0xB156], NFD: [0x1102, 0x1167, 0x11BD], NFKC: [0xB156], NFKD: [0x1102, 0x1167, 0x11BD] }, +{ source: [0xB157], NFC: [0xB157], NFD: [0x1102, 0x1167, 0x11BE], NFKC: [0xB157], NFKD: [0x1102, 0x1167, 0x11BE] }, +{ source: [0xB158], NFC: [0xB158], NFD: [0x1102, 0x1167, 0x11BF], NFKC: [0xB158], NFKD: [0x1102, 0x1167, 0x11BF] }, +{ source: [0xB159], NFC: [0xB159], NFD: [0x1102, 0x1167, 0x11C0], NFKC: [0xB159], NFKD: [0x1102, 0x1167, 0x11C0] }, +{ source: [0xB15A], NFC: [0xB15A], NFD: [0x1102, 0x1167, 0x11C1], NFKC: [0xB15A], NFKD: [0x1102, 0x1167, 0x11C1] }, +{ source: [0xB15B], NFC: [0xB15B], NFD: [0x1102, 0x1167, 0x11C2], NFKC: [0xB15B], NFKD: [0x1102, 0x1167, 0x11C2] }, +{ source: [0xB15C], NFC: [0xB15C], NFD: [0x1102, 0x1168], NFKC: [0xB15C], NFKD: [0x1102, 0x1168] }, +{ source: [0xB15D], NFC: [0xB15D], NFD: [0x1102, 0x1168, 0x11A8], NFKC: [0xB15D], NFKD: [0x1102, 0x1168, 0x11A8] }, +{ source: [0xB15E], NFC: [0xB15E], NFD: [0x1102, 0x1168, 0x11A9], NFKC: [0xB15E], NFKD: [0x1102, 0x1168, 0x11A9] }, +{ source: [0xB15F], NFC: [0xB15F], NFD: [0x1102, 0x1168, 0x11AA], NFKC: [0xB15F], NFKD: [0x1102, 0x1168, 0x11AA] }, +{ source: [0xB160], NFC: [0xB160], NFD: [0x1102, 0x1168, 0x11AB], NFKC: [0xB160], NFKD: [0x1102, 0x1168, 0x11AB] }, +{ source: [0xB161], NFC: [0xB161], NFD: [0x1102, 0x1168, 0x11AC], NFKC: [0xB161], NFKD: [0x1102, 0x1168, 0x11AC] }, +{ source: [0xB162], NFC: [0xB162], NFD: [0x1102, 0x1168, 0x11AD], NFKC: [0xB162], NFKD: [0x1102, 0x1168, 0x11AD] }, +{ source: [0xB163], NFC: [0xB163], NFD: [0x1102, 0x1168, 0x11AE], NFKC: [0xB163], NFKD: [0x1102, 0x1168, 0x11AE] }, +{ source: [0xB164], NFC: [0xB164], NFD: [0x1102, 0x1168, 0x11AF], NFKC: [0xB164], NFKD: [0x1102, 0x1168, 0x11AF] }, +{ source: [0xB165], NFC: [0xB165], NFD: [0x1102, 0x1168, 0x11B0], NFKC: [0xB165], NFKD: [0x1102, 0x1168, 0x11B0] }, +{ source: [0xB166], NFC: [0xB166], NFD: [0x1102, 0x1168, 0x11B1], NFKC: [0xB166], NFKD: [0x1102, 0x1168, 0x11B1] }, +{ source: [0xB167], NFC: [0xB167], NFD: [0x1102, 0x1168, 0x11B2], NFKC: [0xB167], NFKD: [0x1102, 0x1168, 0x11B2] }, +{ source: [0xB168], NFC: [0xB168], NFD: [0x1102, 0x1168, 0x11B3], NFKC: [0xB168], NFKD: [0x1102, 0x1168, 0x11B3] }, +{ source: [0xB169], NFC: [0xB169], NFD: [0x1102, 0x1168, 0x11B4], NFKC: [0xB169], NFKD: [0x1102, 0x1168, 0x11B4] }, +{ source: [0xB16A], NFC: [0xB16A], NFD: [0x1102, 0x1168, 0x11B5], NFKC: [0xB16A], NFKD: [0x1102, 0x1168, 0x11B5] }, +{ source: [0xB16B], NFC: [0xB16B], NFD: [0x1102, 0x1168, 0x11B6], NFKC: [0xB16B], NFKD: [0x1102, 0x1168, 0x11B6] }, +{ source: [0xB16C], NFC: [0xB16C], NFD: [0x1102, 0x1168, 0x11B7], NFKC: [0xB16C], NFKD: [0x1102, 0x1168, 0x11B7] }, +{ source: [0xB16D], NFC: [0xB16D], NFD: [0x1102, 0x1168, 0x11B8], NFKC: [0xB16D], NFKD: [0x1102, 0x1168, 0x11B8] }, +{ source: [0xB16E], NFC: [0xB16E], NFD: [0x1102, 0x1168, 0x11B9], NFKC: [0xB16E], NFKD: [0x1102, 0x1168, 0x11B9] }, +{ source: [0xB16F], NFC: [0xB16F], NFD: [0x1102, 0x1168, 0x11BA], NFKC: [0xB16F], NFKD: [0x1102, 0x1168, 0x11BA] }, +{ source: [0xB170], NFC: [0xB170], NFD: [0x1102, 0x1168, 0x11BB], NFKC: [0xB170], NFKD: [0x1102, 0x1168, 0x11BB] }, +{ source: [0xB171], NFC: [0xB171], NFD: [0x1102, 0x1168, 0x11BC], NFKC: [0xB171], NFKD: [0x1102, 0x1168, 0x11BC] }, +{ source: [0xB172], NFC: [0xB172], NFD: [0x1102, 0x1168, 0x11BD], NFKC: [0xB172], NFKD: [0x1102, 0x1168, 0x11BD] }, +{ source: [0xB173], NFC: [0xB173], NFD: [0x1102, 0x1168, 0x11BE], NFKC: [0xB173], NFKD: [0x1102, 0x1168, 0x11BE] }, +{ source: [0xB174], NFC: [0xB174], NFD: [0x1102, 0x1168, 0x11BF], NFKC: [0xB174], NFKD: [0x1102, 0x1168, 0x11BF] }, +{ source: [0xB175], NFC: [0xB175], NFD: [0x1102, 0x1168, 0x11C0], NFKC: [0xB175], NFKD: [0x1102, 0x1168, 0x11C0] }, +{ source: [0xB176], NFC: [0xB176], NFD: [0x1102, 0x1168, 0x11C1], NFKC: [0xB176], NFKD: [0x1102, 0x1168, 0x11C1] }, +{ source: [0xB177], NFC: [0xB177], NFD: [0x1102, 0x1168, 0x11C2], NFKC: [0xB177], NFKD: [0x1102, 0x1168, 0x11C2] }, +{ source: [0xB178], NFC: [0xB178], NFD: [0x1102, 0x1169], NFKC: [0xB178], NFKD: [0x1102, 0x1169] }, +{ source: [0xB179], NFC: [0xB179], NFD: [0x1102, 0x1169, 0x11A8], NFKC: [0xB179], NFKD: [0x1102, 0x1169, 0x11A8] }, +{ source: [0xB17A], NFC: [0xB17A], NFD: [0x1102, 0x1169, 0x11A9], NFKC: [0xB17A], NFKD: [0x1102, 0x1169, 0x11A9] }, +{ source: [0xB17B], NFC: [0xB17B], NFD: [0x1102, 0x1169, 0x11AA], NFKC: [0xB17B], NFKD: [0x1102, 0x1169, 0x11AA] }, +{ source: [0xB17C], NFC: [0xB17C], NFD: [0x1102, 0x1169, 0x11AB], NFKC: [0xB17C], NFKD: [0x1102, 0x1169, 0x11AB] }, +{ source: [0xB17D], NFC: [0xB17D], NFD: [0x1102, 0x1169, 0x11AC], NFKC: [0xB17D], NFKD: [0x1102, 0x1169, 0x11AC] }, +{ source: [0xB17E], NFC: [0xB17E], NFD: [0x1102, 0x1169, 0x11AD], NFKC: [0xB17E], NFKD: [0x1102, 0x1169, 0x11AD] }, +{ source: [0xB17F], NFC: [0xB17F], NFD: [0x1102, 0x1169, 0x11AE], NFKC: [0xB17F], NFKD: [0x1102, 0x1169, 0x11AE] }, +{ source: [0xB180], NFC: [0xB180], NFD: [0x1102, 0x1169, 0x11AF], NFKC: [0xB180], NFKD: [0x1102, 0x1169, 0x11AF] }, +{ source: [0xB181], NFC: [0xB181], NFD: [0x1102, 0x1169, 0x11B0], NFKC: [0xB181], NFKD: [0x1102, 0x1169, 0x11B0] }, +{ source: [0xB182], NFC: [0xB182], NFD: [0x1102, 0x1169, 0x11B1], NFKC: [0xB182], NFKD: [0x1102, 0x1169, 0x11B1] }, +{ source: [0xB183], NFC: [0xB183], NFD: [0x1102, 0x1169, 0x11B2], NFKC: [0xB183], NFKD: [0x1102, 0x1169, 0x11B2] }, +{ source: [0xB184], NFC: [0xB184], NFD: [0x1102, 0x1169, 0x11B3], NFKC: [0xB184], NFKD: [0x1102, 0x1169, 0x11B3] }, +{ source: [0xB185], NFC: [0xB185], NFD: [0x1102, 0x1169, 0x11B4], NFKC: [0xB185], NFKD: [0x1102, 0x1169, 0x11B4] }, +{ source: [0xB186], NFC: [0xB186], NFD: [0x1102, 0x1169, 0x11B5], NFKC: [0xB186], NFKD: [0x1102, 0x1169, 0x11B5] }, +{ source: [0xB187], NFC: [0xB187], NFD: [0x1102, 0x1169, 0x11B6], NFKC: [0xB187], NFKD: [0x1102, 0x1169, 0x11B6] }, +{ source: [0xB188], NFC: [0xB188], NFD: [0x1102, 0x1169, 0x11B7], NFKC: [0xB188], NFKD: [0x1102, 0x1169, 0x11B7] }, +{ source: [0xB189], NFC: [0xB189], NFD: [0x1102, 0x1169, 0x11B8], NFKC: [0xB189], NFKD: [0x1102, 0x1169, 0x11B8] }, +{ source: [0xB18A], NFC: [0xB18A], NFD: [0x1102, 0x1169, 0x11B9], NFKC: [0xB18A], NFKD: [0x1102, 0x1169, 0x11B9] }, +{ source: [0xB18B], NFC: [0xB18B], NFD: [0x1102, 0x1169, 0x11BA], NFKC: [0xB18B], NFKD: [0x1102, 0x1169, 0x11BA] }, +{ source: [0xB18C], NFC: [0xB18C], NFD: [0x1102, 0x1169, 0x11BB], NFKC: [0xB18C], NFKD: [0x1102, 0x1169, 0x11BB] }, +{ source: [0xB18D], NFC: [0xB18D], NFD: [0x1102, 0x1169, 0x11BC], NFKC: [0xB18D], NFKD: [0x1102, 0x1169, 0x11BC] }, +{ source: [0xB18E], NFC: [0xB18E], NFD: [0x1102, 0x1169, 0x11BD], NFKC: [0xB18E], NFKD: [0x1102, 0x1169, 0x11BD] }, +{ source: [0xB18F], NFC: [0xB18F], NFD: [0x1102, 0x1169, 0x11BE], NFKC: [0xB18F], NFKD: [0x1102, 0x1169, 0x11BE] }, +{ source: [0xB190], NFC: [0xB190], NFD: [0x1102, 0x1169, 0x11BF], NFKC: [0xB190], NFKD: [0x1102, 0x1169, 0x11BF] }, +{ source: [0xB191], NFC: [0xB191], NFD: [0x1102, 0x1169, 0x11C0], NFKC: [0xB191], NFKD: [0x1102, 0x1169, 0x11C0] }, +{ source: [0xB192], NFC: [0xB192], NFD: [0x1102, 0x1169, 0x11C1], NFKC: [0xB192], NFKD: [0x1102, 0x1169, 0x11C1] }, +{ source: [0xB193], NFC: [0xB193], NFD: [0x1102, 0x1169, 0x11C2], NFKC: [0xB193], NFKD: [0x1102, 0x1169, 0x11C2] }, +{ source: [0xB194], NFC: [0xB194], NFD: [0x1102, 0x116A], NFKC: [0xB194], NFKD: [0x1102, 0x116A] }, +{ source: [0xB195], NFC: [0xB195], NFD: [0x1102, 0x116A, 0x11A8], NFKC: [0xB195], NFKD: [0x1102, 0x116A, 0x11A8] }, +{ source: [0xB196], NFC: [0xB196], NFD: [0x1102, 0x116A, 0x11A9], NFKC: [0xB196], NFKD: [0x1102, 0x116A, 0x11A9] }, +{ source: [0xB197], NFC: [0xB197], NFD: [0x1102, 0x116A, 0x11AA], NFKC: [0xB197], NFKD: [0x1102, 0x116A, 0x11AA] }, +{ source: [0xB198], NFC: [0xB198], NFD: [0x1102, 0x116A, 0x11AB], NFKC: [0xB198], NFKD: [0x1102, 0x116A, 0x11AB] }, +{ source: [0xB199], NFC: [0xB199], NFD: [0x1102, 0x116A, 0x11AC], NFKC: [0xB199], NFKD: [0x1102, 0x116A, 0x11AC] }, +{ source: [0xB19A], NFC: [0xB19A], NFD: [0x1102, 0x116A, 0x11AD], NFKC: [0xB19A], NFKD: [0x1102, 0x116A, 0x11AD] }, +{ source: [0xB19B], NFC: [0xB19B], NFD: [0x1102, 0x116A, 0x11AE], NFKC: [0xB19B], NFKD: [0x1102, 0x116A, 0x11AE] }, +{ source: [0xB19C], NFC: [0xB19C], NFD: [0x1102, 0x116A, 0x11AF], NFKC: [0xB19C], NFKD: [0x1102, 0x116A, 0x11AF] }, +{ source: [0xB19D], NFC: [0xB19D], NFD: [0x1102, 0x116A, 0x11B0], NFKC: [0xB19D], NFKD: [0x1102, 0x116A, 0x11B0] }, +{ source: [0xB19E], NFC: [0xB19E], NFD: [0x1102, 0x116A, 0x11B1], NFKC: [0xB19E], NFKD: [0x1102, 0x116A, 0x11B1] }, +{ source: [0xB19F], NFC: [0xB19F], NFD: [0x1102, 0x116A, 0x11B2], NFKC: [0xB19F], NFKD: [0x1102, 0x116A, 0x11B2] }, +{ source: [0xB1A0], NFC: [0xB1A0], NFD: [0x1102, 0x116A, 0x11B3], NFKC: [0xB1A0], NFKD: [0x1102, 0x116A, 0x11B3] }, +{ source: [0xB1A1], NFC: [0xB1A1], NFD: [0x1102, 0x116A, 0x11B4], NFKC: [0xB1A1], NFKD: [0x1102, 0x116A, 0x11B4] }, +{ source: [0xB1A2], NFC: [0xB1A2], NFD: [0x1102, 0x116A, 0x11B5], NFKC: [0xB1A2], NFKD: [0x1102, 0x116A, 0x11B5] }, +{ source: [0xB1A3], NFC: [0xB1A3], NFD: [0x1102, 0x116A, 0x11B6], NFKC: [0xB1A3], NFKD: [0x1102, 0x116A, 0x11B6] }, +{ source: [0xB1A4], NFC: [0xB1A4], NFD: [0x1102, 0x116A, 0x11B7], NFKC: [0xB1A4], NFKD: [0x1102, 0x116A, 0x11B7] }, +{ source: [0xB1A5], NFC: [0xB1A5], NFD: [0x1102, 0x116A, 0x11B8], NFKC: [0xB1A5], NFKD: [0x1102, 0x116A, 0x11B8] }, +{ source: [0xB1A6], NFC: [0xB1A6], NFD: [0x1102, 0x116A, 0x11B9], NFKC: [0xB1A6], NFKD: [0x1102, 0x116A, 0x11B9] }, +{ source: [0xB1A7], NFC: [0xB1A7], NFD: [0x1102, 0x116A, 0x11BA], NFKC: [0xB1A7], NFKD: [0x1102, 0x116A, 0x11BA] }, +{ source: [0xB1A8], NFC: [0xB1A8], NFD: [0x1102, 0x116A, 0x11BB], NFKC: [0xB1A8], NFKD: [0x1102, 0x116A, 0x11BB] }, +{ source: [0xB1A9], NFC: [0xB1A9], NFD: [0x1102, 0x116A, 0x11BC], NFKC: [0xB1A9], NFKD: [0x1102, 0x116A, 0x11BC] }, +{ source: [0xB1AA], NFC: [0xB1AA], NFD: [0x1102, 0x116A, 0x11BD], NFKC: [0xB1AA], NFKD: [0x1102, 0x116A, 0x11BD] }, +{ source: [0xB1AB], NFC: [0xB1AB], NFD: [0x1102, 0x116A, 0x11BE], NFKC: [0xB1AB], NFKD: [0x1102, 0x116A, 0x11BE] }, +{ source: [0xB1AC], NFC: [0xB1AC], NFD: [0x1102, 0x116A, 0x11BF], NFKC: [0xB1AC], NFKD: [0x1102, 0x116A, 0x11BF] }, +{ source: [0xB1AD], NFC: [0xB1AD], NFD: [0x1102, 0x116A, 0x11C0], NFKC: [0xB1AD], NFKD: [0x1102, 0x116A, 0x11C0] }, +{ source: [0xB1AE], NFC: [0xB1AE], NFD: [0x1102, 0x116A, 0x11C1], NFKC: [0xB1AE], NFKD: [0x1102, 0x116A, 0x11C1] }, +{ source: [0xB1AF], NFC: [0xB1AF], NFD: [0x1102, 0x116A, 0x11C2], NFKC: [0xB1AF], NFKD: [0x1102, 0x116A, 0x11C2] }, +{ source: [0xB1B0], NFC: [0xB1B0], NFD: [0x1102, 0x116B], NFKC: [0xB1B0], NFKD: [0x1102, 0x116B] }, +{ source: [0xB1B1], NFC: [0xB1B1], NFD: [0x1102, 0x116B, 0x11A8], NFKC: [0xB1B1], NFKD: [0x1102, 0x116B, 0x11A8] }, +{ source: [0xB1B2], NFC: [0xB1B2], NFD: [0x1102, 0x116B, 0x11A9], NFKC: [0xB1B2], NFKD: [0x1102, 0x116B, 0x11A9] }, +{ source: [0xB1B3], NFC: [0xB1B3], NFD: [0x1102, 0x116B, 0x11AA], NFKC: [0xB1B3], NFKD: [0x1102, 0x116B, 0x11AA] }, +{ source: [0xB1B4], NFC: [0xB1B4], NFD: [0x1102, 0x116B, 0x11AB], NFKC: [0xB1B4], NFKD: [0x1102, 0x116B, 0x11AB] }, +{ source: [0xB1B5], NFC: [0xB1B5], NFD: [0x1102, 0x116B, 0x11AC], NFKC: [0xB1B5], NFKD: [0x1102, 0x116B, 0x11AC] }, +{ source: [0xB1B6], NFC: [0xB1B6], NFD: [0x1102, 0x116B, 0x11AD], NFKC: [0xB1B6], NFKD: [0x1102, 0x116B, 0x11AD] }, +{ source: [0xB1B7], NFC: [0xB1B7], NFD: [0x1102, 0x116B, 0x11AE], NFKC: [0xB1B7], NFKD: [0x1102, 0x116B, 0x11AE] }, +{ source: [0xB1B8], NFC: [0xB1B8], NFD: [0x1102, 0x116B, 0x11AF], NFKC: [0xB1B8], NFKD: [0x1102, 0x116B, 0x11AF] }, +{ source: [0xB1B9], NFC: [0xB1B9], NFD: [0x1102, 0x116B, 0x11B0], NFKC: [0xB1B9], NFKD: [0x1102, 0x116B, 0x11B0] }, +{ source: [0xB1BA], NFC: [0xB1BA], NFD: [0x1102, 0x116B, 0x11B1], NFKC: [0xB1BA], NFKD: [0x1102, 0x116B, 0x11B1] }, +{ source: [0xB1BB], NFC: [0xB1BB], NFD: [0x1102, 0x116B, 0x11B2], NFKC: [0xB1BB], NFKD: [0x1102, 0x116B, 0x11B2] }, +{ source: [0xB1BC], NFC: [0xB1BC], NFD: [0x1102, 0x116B, 0x11B3], NFKC: [0xB1BC], NFKD: [0x1102, 0x116B, 0x11B3] }, +{ source: [0xB1BD], NFC: [0xB1BD], NFD: [0x1102, 0x116B, 0x11B4], NFKC: [0xB1BD], NFKD: [0x1102, 0x116B, 0x11B4] }, +{ source: [0xB1BE], NFC: [0xB1BE], NFD: [0x1102, 0x116B, 0x11B5], NFKC: [0xB1BE], NFKD: [0x1102, 0x116B, 0x11B5] }, +{ source: [0xB1BF], NFC: [0xB1BF], NFD: [0x1102, 0x116B, 0x11B6], NFKC: [0xB1BF], NFKD: [0x1102, 0x116B, 0x11B6] }, +{ source: [0xB1C0], NFC: [0xB1C0], NFD: [0x1102, 0x116B, 0x11B7], NFKC: [0xB1C0], NFKD: [0x1102, 0x116B, 0x11B7] }, +{ source: [0xB1C1], NFC: [0xB1C1], NFD: [0x1102, 0x116B, 0x11B8], NFKC: [0xB1C1], NFKD: [0x1102, 0x116B, 0x11B8] }, +{ source: [0xB1C2], NFC: [0xB1C2], NFD: [0x1102, 0x116B, 0x11B9], NFKC: [0xB1C2], NFKD: [0x1102, 0x116B, 0x11B9] }, +{ source: [0xB1C3], NFC: [0xB1C3], NFD: [0x1102, 0x116B, 0x11BA], NFKC: [0xB1C3], NFKD: [0x1102, 0x116B, 0x11BA] }, +{ source: [0xB1C4], NFC: [0xB1C4], NFD: [0x1102, 0x116B, 0x11BB], NFKC: [0xB1C4], NFKD: [0x1102, 0x116B, 0x11BB] }, +{ source: [0xB1C5], NFC: [0xB1C5], NFD: [0x1102, 0x116B, 0x11BC], NFKC: [0xB1C5], NFKD: [0x1102, 0x116B, 0x11BC] }, +{ source: [0xB1C6], NFC: [0xB1C6], NFD: [0x1102, 0x116B, 0x11BD], NFKC: [0xB1C6], NFKD: [0x1102, 0x116B, 0x11BD] }, +{ source: [0xB1C7], NFC: [0xB1C7], NFD: [0x1102, 0x116B, 0x11BE], NFKC: [0xB1C7], NFKD: [0x1102, 0x116B, 0x11BE] }, +{ source: [0xB1C8], NFC: [0xB1C8], NFD: [0x1102, 0x116B, 0x11BF], NFKC: [0xB1C8], NFKD: [0x1102, 0x116B, 0x11BF] }, +{ source: [0xB1C9], NFC: [0xB1C9], NFD: [0x1102, 0x116B, 0x11C0], NFKC: [0xB1C9], NFKD: [0x1102, 0x116B, 0x11C0] }, +{ source: [0xB1CA], NFC: [0xB1CA], NFD: [0x1102, 0x116B, 0x11C1], NFKC: [0xB1CA], NFKD: [0x1102, 0x116B, 0x11C1] }, +{ source: [0xB1CB], NFC: [0xB1CB], NFD: [0x1102, 0x116B, 0x11C2], NFKC: [0xB1CB], NFKD: [0x1102, 0x116B, 0x11C2] }, +{ source: [0xB1CC], NFC: [0xB1CC], NFD: [0x1102, 0x116C], NFKC: [0xB1CC], NFKD: [0x1102, 0x116C] }, +{ source: [0xB1CD], NFC: [0xB1CD], NFD: [0x1102, 0x116C, 0x11A8], NFKC: [0xB1CD], NFKD: [0x1102, 0x116C, 0x11A8] }, +{ source: [0xB1CE], NFC: [0xB1CE], NFD: [0x1102, 0x116C, 0x11A9], NFKC: [0xB1CE], NFKD: [0x1102, 0x116C, 0x11A9] }, +{ source: [0xB1CF], NFC: [0xB1CF], NFD: [0x1102, 0x116C, 0x11AA], NFKC: [0xB1CF], NFKD: [0x1102, 0x116C, 0x11AA] }, +{ source: [0xB1D0], NFC: [0xB1D0], NFD: [0x1102, 0x116C, 0x11AB], NFKC: [0xB1D0], NFKD: [0x1102, 0x116C, 0x11AB] }, +{ source: [0xB1D1], NFC: [0xB1D1], NFD: [0x1102, 0x116C, 0x11AC], NFKC: [0xB1D1], NFKD: [0x1102, 0x116C, 0x11AC] }, +{ source: [0xB1D2], NFC: [0xB1D2], NFD: [0x1102, 0x116C, 0x11AD], NFKC: [0xB1D2], NFKD: [0x1102, 0x116C, 0x11AD] }, +{ source: [0xB1D3], NFC: [0xB1D3], NFD: [0x1102, 0x116C, 0x11AE], NFKC: [0xB1D3], NFKD: [0x1102, 0x116C, 0x11AE] }, +{ source: [0xB1D4], NFC: [0xB1D4], NFD: [0x1102, 0x116C, 0x11AF], NFKC: [0xB1D4], NFKD: [0x1102, 0x116C, 0x11AF] }, +{ source: [0xB1D5], NFC: [0xB1D5], NFD: [0x1102, 0x116C, 0x11B0], NFKC: [0xB1D5], NFKD: [0x1102, 0x116C, 0x11B0] }, +{ source: [0xB1D6], NFC: [0xB1D6], NFD: [0x1102, 0x116C, 0x11B1], NFKC: [0xB1D6], NFKD: [0x1102, 0x116C, 0x11B1] }, +{ source: [0xB1D7], NFC: [0xB1D7], NFD: [0x1102, 0x116C, 0x11B2], NFKC: [0xB1D7], NFKD: [0x1102, 0x116C, 0x11B2] }, +{ source: [0xB1D8], NFC: [0xB1D8], NFD: [0x1102, 0x116C, 0x11B3], NFKC: [0xB1D8], NFKD: [0x1102, 0x116C, 0x11B3] }, +{ source: [0xB1D9], NFC: [0xB1D9], NFD: [0x1102, 0x116C, 0x11B4], NFKC: [0xB1D9], NFKD: [0x1102, 0x116C, 0x11B4] }, +{ source: [0xB1DA], NFC: [0xB1DA], NFD: [0x1102, 0x116C, 0x11B5], NFKC: [0xB1DA], NFKD: [0x1102, 0x116C, 0x11B5] }, +{ source: [0xB1DB], NFC: [0xB1DB], NFD: [0x1102, 0x116C, 0x11B6], NFKC: [0xB1DB], NFKD: [0x1102, 0x116C, 0x11B6] }, +{ source: [0xB1DC], NFC: [0xB1DC], NFD: [0x1102, 0x116C, 0x11B7], NFKC: [0xB1DC], NFKD: [0x1102, 0x116C, 0x11B7] }, +{ source: [0xB1DD], NFC: [0xB1DD], NFD: [0x1102, 0x116C, 0x11B8], NFKC: [0xB1DD], NFKD: [0x1102, 0x116C, 0x11B8] }, +{ source: [0xB1DE], NFC: [0xB1DE], NFD: [0x1102, 0x116C, 0x11B9], NFKC: [0xB1DE], NFKD: [0x1102, 0x116C, 0x11B9] }, +{ source: [0xB1DF], NFC: [0xB1DF], NFD: [0x1102, 0x116C, 0x11BA], NFKC: [0xB1DF], NFKD: [0x1102, 0x116C, 0x11BA] }, +{ source: [0xB1E0], NFC: [0xB1E0], NFD: [0x1102, 0x116C, 0x11BB], NFKC: [0xB1E0], NFKD: [0x1102, 0x116C, 0x11BB] }, +{ source: [0xB1E1], NFC: [0xB1E1], NFD: [0x1102, 0x116C, 0x11BC], NFKC: [0xB1E1], NFKD: [0x1102, 0x116C, 0x11BC] }, +{ source: [0xB1E2], NFC: [0xB1E2], NFD: [0x1102, 0x116C, 0x11BD], NFKC: [0xB1E2], NFKD: [0x1102, 0x116C, 0x11BD] }, +{ source: [0xB1E3], NFC: [0xB1E3], NFD: [0x1102, 0x116C, 0x11BE], NFKC: [0xB1E3], NFKD: [0x1102, 0x116C, 0x11BE] }, +{ source: [0xB1E4], NFC: [0xB1E4], NFD: [0x1102, 0x116C, 0x11BF], NFKC: [0xB1E4], NFKD: [0x1102, 0x116C, 0x11BF] }, +{ source: [0xB1E5], NFC: [0xB1E5], NFD: [0x1102, 0x116C, 0x11C0], NFKC: [0xB1E5], NFKD: [0x1102, 0x116C, 0x11C0] }, +{ source: [0xB1E6], NFC: [0xB1E6], NFD: [0x1102, 0x116C, 0x11C1], NFKC: [0xB1E6], NFKD: [0x1102, 0x116C, 0x11C1] }, +{ source: [0xB1E7], NFC: [0xB1E7], NFD: [0x1102, 0x116C, 0x11C2], NFKC: [0xB1E7], NFKD: [0x1102, 0x116C, 0x11C2] }, +{ source: [0xB1E8], NFC: [0xB1E8], NFD: [0x1102, 0x116D], NFKC: [0xB1E8], NFKD: [0x1102, 0x116D] }, +{ source: [0xB1E9], NFC: [0xB1E9], NFD: [0x1102, 0x116D, 0x11A8], NFKC: [0xB1E9], NFKD: [0x1102, 0x116D, 0x11A8] }, +{ source: [0xB1EA], NFC: [0xB1EA], NFD: [0x1102, 0x116D, 0x11A9], NFKC: [0xB1EA], NFKD: [0x1102, 0x116D, 0x11A9] }, +{ source: [0xB1EB], NFC: [0xB1EB], NFD: [0x1102, 0x116D, 0x11AA], NFKC: [0xB1EB], NFKD: [0x1102, 0x116D, 0x11AA] }, +{ source: [0xB1EC], NFC: [0xB1EC], NFD: [0x1102, 0x116D, 0x11AB], NFKC: [0xB1EC], NFKD: [0x1102, 0x116D, 0x11AB] }, +{ source: [0xB1ED], NFC: [0xB1ED], NFD: [0x1102, 0x116D, 0x11AC], NFKC: [0xB1ED], NFKD: [0x1102, 0x116D, 0x11AC] }, +{ source: [0xB1EE], NFC: [0xB1EE], NFD: [0x1102, 0x116D, 0x11AD], NFKC: [0xB1EE], NFKD: [0x1102, 0x116D, 0x11AD] }, +{ source: [0xB1EF], NFC: [0xB1EF], NFD: [0x1102, 0x116D, 0x11AE], NFKC: [0xB1EF], NFKD: [0x1102, 0x116D, 0x11AE] }, +{ source: [0xB1F0], NFC: [0xB1F0], NFD: [0x1102, 0x116D, 0x11AF], NFKC: [0xB1F0], NFKD: [0x1102, 0x116D, 0x11AF] }, +{ source: [0xB1F1], NFC: [0xB1F1], NFD: [0x1102, 0x116D, 0x11B0], NFKC: [0xB1F1], NFKD: [0x1102, 0x116D, 0x11B0] }, +{ source: [0xB1F2], NFC: [0xB1F2], NFD: [0x1102, 0x116D, 0x11B1], NFKC: [0xB1F2], NFKD: [0x1102, 0x116D, 0x11B1] }, +{ source: [0xB1F3], NFC: [0xB1F3], NFD: [0x1102, 0x116D, 0x11B2], NFKC: [0xB1F3], NFKD: [0x1102, 0x116D, 0x11B2] }, +{ source: [0xB1F4], NFC: [0xB1F4], NFD: [0x1102, 0x116D, 0x11B3], NFKC: [0xB1F4], NFKD: [0x1102, 0x116D, 0x11B3] }, +{ source: [0xB1F5], NFC: [0xB1F5], NFD: [0x1102, 0x116D, 0x11B4], NFKC: [0xB1F5], NFKD: [0x1102, 0x116D, 0x11B4] }, +{ source: [0xB1F6], NFC: [0xB1F6], NFD: [0x1102, 0x116D, 0x11B5], NFKC: [0xB1F6], NFKD: [0x1102, 0x116D, 0x11B5] }, +{ source: [0xB1F7], NFC: [0xB1F7], NFD: [0x1102, 0x116D, 0x11B6], NFKC: [0xB1F7], NFKD: [0x1102, 0x116D, 0x11B6] }, +{ source: [0xB1F8], NFC: [0xB1F8], NFD: [0x1102, 0x116D, 0x11B7], NFKC: [0xB1F8], NFKD: [0x1102, 0x116D, 0x11B7] }, +{ source: [0xB1F9], NFC: [0xB1F9], NFD: [0x1102, 0x116D, 0x11B8], NFKC: [0xB1F9], NFKD: [0x1102, 0x116D, 0x11B8] }, +{ source: [0xB1FA], NFC: [0xB1FA], NFD: [0x1102, 0x116D, 0x11B9], NFKC: [0xB1FA], NFKD: [0x1102, 0x116D, 0x11B9] }, +{ source: [0xB1FB], NFC: [0xB1FB], NFD: [0x1102, 0x116D, 0x11BA], NFKC: [0xB1FB], NFKD: [0x1102, 0x116D, 0x11BA] }, +{ source: [0xB1FC], NFC: [0xB1FC], NFD: [0x1102, 0x116D, 0x11BB], NFKC: [0xB1FC], NFKD: [0x1102, 0x116D, 0x11BB] }, +{ source: [0xB1FD], NFC: [0xB1FD], NFD: [0x1102, 0x116D, 0x11BC], NFKC: [0xB1FD], NFKD: [0x1102, 0x116D, 0x11BC] }, +{ source: [0xB1FE], NFC: [0xB1FE], NFD: [0x1102, 0x116D, 0x11BD], NFKC: [0xB1FE], NFKD: [0x1102, 0x116D, 0x11BD] }, +{ source: [0xB1FF], NFC: [0xB1FF], NFD: [0x1102, 0x116D, 0x11BE], NFKC: [0xB1FF], NFKD: [0x1102, 0x116D, 0x11BE] }, +{ source: [0xB200], NFC: [0xB200], NFD: [0x1102, 0x116D, 0x11BF], NFKC: [0xB200], NFKD: [0x1102, 0x116D, 0x11BF] }, +{ source: [0xB201], NFC: [0xB201], NFD: [0x1102, 0x116D, 0x11C0], NFKC: [0xB201], NFKD: [0x1102, 0x116D, 0x11C0] }, +{ source: [0xB202], NFC: [0xB202], NFD: [0x1102, 0x116D, 0x11C1], NFKC: [0xB202], NFKD: [0x1102, 0x116D, 0x11C1] }, +{ source: [0xB203], NFC: [0xB203], NFD: [0x1102, 0x116D, 0x11C2], NFKC: [0xB203], NFKD: [0x1102, 0x116D, 0x11C2] }, +{ source: [0xB204], NFC: [0xB204], NFD: [0x1102, 0x116E], NFKC: [0xB204], NFKD: [0x1102, 0x116E] }, +{ source: [0xB205], NFC: [0xB205], NFD: [0x1102, 0x116E, 0x11A8], NFKC: [0xB205], NFKD: [0x1102, 0x116E, 0x11A8] }, +{ source: [0xB206], NFC: [0xB206], NFD: [0x1102, 0x116E, 0x11A9], NFKC: [0xB206], NFKD: [0x1102, 0x116E, 0x11A9] }, +{ source: [0xB207], NFC: [0xB207], NFD: [0x1102, 0x116E, 0x11AA], NFKC: [0xB207], NFKD: [0x1102, 0x116E, 0x11AA] }, +{ source: [0xB208], NFC: [0xB208], NFD: [0x1102, 0x116E, 0x11AB], NFKC: [0xB208], NFKD: [0x1102, 0x116E, 0x11AB] }, +{ source: [0xB209], NFC: [0xB209], NFD: [0x1102, 0x116E, 0x11AC], NFKC: [0xB209], NFKD: [0x1102, 0x116E, 0x11AC] }, +{ source: [0xB20A], NFC: [0xB20A], NFD: [0x1102, 0x116E, 0x11AD], NFKC: [0xB20A], NFKD: [0x1102, 0x116E, 0x11AD] }, +{ source: [0xB20B], NFC: [0xB20B], NFD: [0x1102, 0x116E, 0x11AE], NFKC: [0xB20B], NFKD: [0x1102, 0x116E, 0x11AE] }, +{ source: [0xB20C], NFC: [0xB20C], NFD: [0x1102, 0x116E, 0x11AF], NFKC: [0xB20C], NFKD: [0x1102, 0x116E, 0x11AF] }, +{ source: [0xB20D], NFC: [0xB20D], NFD: [0x1102, 0x116E, 0x11B0], NFKC: [0xB20D], NFKD: [0x1102, 0x116E, 0x11B0] }, +{ source: [0xB20E], NFC: [0xB20E], NFD: [0x1102, 0x116E, 0x11B1], NFKC: [0xB20E], NFKD: [0x1102, 0x116E, 0x11B1] }, +{ source: [0xB20F], NFC: [0xB20F], NFD: [0x1102, 0x116E, 0x11B2], NFKC: [0xB20F], NFKD: [0x1102, 0x116E, 0x11B2] }, +{ source: [0xB210], NFC: [0xB210], NFD: [0x1102, 0x116E, 0x11B3], NFKC: [0xB210], NFKD: [0x1102, 0x116E, 0x11B3] }, +{ source: [0xB211], NFC: [0xB211], NFD: [0x1102, 0x116E, 0x11B4], NFKC: [0xB211], NFKD: [0x1102, 0x116E, 0x11B4] }, +{ source: [0xB212], NFC: [0xB212], NFD: [0x1102, 0x116E, 0x11B5], NFKC: [0xB212], NFKD: [0x1102, 0x116E, 0x11B5] }, +{ source: [0xB213], NFC: [0xB213], NFD: [0x1102, 0x116E, 0x11B6], NFKC: [0xB213], NFKD: [0x1102, 0x116E, 0x11B6] }, +{ source: [0xB214], NFC: [0xB214], NFD: [0x1102, 0x116E, 0x11B7], NFKC: [0xB214], NFKD: [0x1102, 0x116E, 0x11B7] }, +{ source: [0xB215], NFC: [0xB215], NFD: [0x1102, 0x116E, 0x11B8], NFKC: [0xB215], NFKD: [0x1102, 0x116E, 0x11B8] }, +{ source: [0xB216], NFC: [0xB216], NFD: [0x1102, 0x116E, 0x11B9], NFKC: [0xB216], NFKD: [0x1102, 0x116E, 0x11B9] }, +{ source: [0xB217], NFC: [0xB217], NFD: [0x1102, 0x116E, 0x11BA], NFKC: [0xB217], NFKD: [0x1102, 0x116E, 0x11BA] }, +{ source: [0xB218], NFC: [0xB218], NFD: [0x1102, 0x116E, 0x11BB], NFKC: [0xB218], NFKD: [0x1102, 0x116E, 0x11BB] }, +{ source: [0xB219], NFC: [0xB219], NFD: [0x1102, 0x116E, 0x11BC], NFKC: [0xB219], NFKD: [0x1102, 0x116E, 0x11BC] }, +{ source: [0xB21A], NFC: [0xB21A], NFD: [0x1102, 0x116E, 0x11BD], NFKC: [0xB21A], NFKD: [0x1102, 0x116E, 0x11BD] }, +{ source: [0xB21B], NFC: [0xB21B], NFD: [0x1102, 0x116E, 0x11BE], NFKC: [0xB21B], NFKD: [0x1102, 0x116E, 0x11BE] }, +{ source: [0xB21C], NFC: [0xB21C], NFD: [0x1102, 0x116E, 0x11BF], NFKC: [0xB21C], NFKD: [0x1102, 0x116E, 0x11BF] }, +{ source: [0xB21D], NFC: [0xB21D], NFD: [0x1102, 0x116E, 0x11C0], NFKC: [0xB21D], NFKD: [0x1102, 0x116E, 0x11C0] }, +{ source: [0xB21E], NFC: [0xB21E], NFD: [0x1102, 0x116E, 0x11C1], NFKC: [0xB21E], NFKD: [0x1102, 0x116E, 0x11C1] }, +{ source: [0xB21F], NFC: [0xB21F], NFD: [0x1102, 0x116E, 0x11C2], NFKC: [0xB21F], NFKD: [0x1102, 0x116E, 0x11C2] }, +{ source: [0xB220], NFC: [0xB220], NFD: [0x1102, 0x116F], NFKC: [0xB220], NFKD: [0x1102, 0x116F] }, +{ source: [0xB221], NFC: [0xB221], NFD: [0x1102, 0x116F, 0x11A8], NFKC: [0xB221], NFKD: [0x1102, 0x116F, 0x11A8] }, +{ source: [0xB222], NFC: [0xB222], NFD: [0x1102, 0x116F, 0x11A9], NFKC: [0xB222], NFKD: [0x1102, 0x116F, 0x11A9] }, +{ source: [0xB223], NFC: [0xB223], NFD: [0x1102, 0x116F, 0x11AA], NFKC: [0xB223], NFKD: [0x1102, 0x116F, 0x11AA] }, +{ source: [0xB224], NFC: [0xB224], NFD: [0x1102, 0x116F, 0x11AB], NFKC: [0xB224], NFKD: [0x1102, 0x116F, 0x11AB] }, +{ source: [0xB225], NFC: [0xB225], NFD: [0x1102, 0x116F, 0x11AC], NFKC: [0xB225], NFKD: [0x1102, 0x116F, 0x11AC] }, +{ source: [0xB226], NFC: [0xB226], NFD: [0x1102, 0x116F, 0x11AD], NFKC: [0xB226], NFKD: [0x1102, 0x116F, 0x11AD] }, +{ source: [0xB227], NFC: [0xB227], NFD: [0x1102, 0x116F, 0x11AE], NFKC: [0xB227], NFKD: [0x1102, 0x116F, 0x11AE] }, +{ source: [0xB228], NFC: [0xB228], NFD: [0x1102, 0x116F, 0x11AF], NFKC: [0xB228], NFKD: [0x1102, 0x116F, 0x11AF] }, +{ source: [0xB229], NFC: [0xB229], NFD: [0x1102, 0x116F, 0x11B0], NFKC: [0xB229], NFKD: [0x1102, 0x116F, 0x11B0] }, +{ source: [0xB22A], NFC: [0xB22A], NFD: [0x1102, 0x116F, 0x11B1], NFKC: [0xB22A], NFKD: [0x1102, 0x116F, 0x11B1] }, +{ source: [0xB22B], NFC: [0xB22B], NFD: [0x1102, 0x116F, 0x11B2], NFKC: [0xB22B], NFKD: [0x1102, 0x116F, 0x11B2] }, +{ source: [0xB22C], NFC: [0xB22C], NFD: [0x1102, 0x116F, 0x11B3], NFKC: [0xB22C], NFKD: [0x1102, 0x116F, 0x11B3] }, +{ source: [0xB22D], NFC: [0xB22D], NFD: [0x1102, 0x116F, 0x11B4], NFKC: [0xB22D], NFKD: [0x1102, 0x116F, 0x11B4] }, +{ source: [0xB22E], NFC: [0xB22E], NFD: [0x1102, 0x116F, 0x11B5], NFKC: [0xB22E], NFKD: [0x1102, 0x116F, 0x11B5] }, +{ source: [0xB22F], NFC: [0xB22F], NFD: [0x1102, 0x116F, 0x11B6], NFKC: [0xB22F], NFKD: [0x1102, 0x116F, 0x11B6] }, +{ source: [0xB230], NFC: [0xB230], NFD: [0x1102, 0x116F, 0x11B7], NFKC: [0xB230], NFKD: [0x1102, 0x116F, 0x11B7] }, +{ source: [0xB231], NFC: [0xB231], NFD: [0x1102, 0x116F, 0x11B8], NFKC: [0xB231], NFKD: [0x1102, 0x116F, 0x11B8] }, +{ source: [0xB232], NFC: [0xB232], NFD: [0x1102, 0x116F, 0x11B9], NFKC: [0xB232], NFKD: [0x1102, 0x116F, 0x11B9] }, +{ source: [0xB233], NFC: [0xB233], NFD: [0x1102, 0x116F, 0x11BA], NFKC: [0xB233], NFKD: [0x1102, 0x116F, 0x11BA] }, +{ source: [0xB234], NFC: [0xB234], NFD: [0x1102, 0x116F, 0x11BB], NFKC: [0xB234], NFKD: [0x1102, 0x116F, 0x11BB] }, +{ source: [0xB235], NFC: [0xB235], NFD: [0x1102, 0x116F, 0x11BC], NFKC: [0xB235], NFKD: [0x1102, 0x116F, 0x11BC] }, +{ source: [0xB236], NFC: [0xB236], NFD: [0x1102, 0x116F, 0x11BD], NFKC: [0xB236], NFKD: [0x1102, 0x116F, 0x11BD] }, +{ source: [0xB237], NFC: [0xB237], NFD: [0x1102, 0x116F, 0x11BE], NFKC: [0xB237], NFKD: [0x1102, 0x116F, 0x11BE] }, +{ source: [0xB238], NFC: [0xB238], NFD: [0x1102, 0x116F, 0x11BF], NFKC: [0xB238], NFKD: [0x1102, 0x116F, 0x11BF] }, +{ source: [0xB239], NFC: [0xB239], NFD: [0x1102, 0x116F, 0x11C0], NFKC: [0xB239], NFKD: [0x1102, 0x116F, 0x11C0] }, +{ source: [0xB23A], NFC: [0xB23A], NFD: [0x1102, 0x116F, 0x11C1], NFKC: [0xB23A], NFKD: [0x1102, 0x116F, 0x11C1] }, +{ source: [0xB23B], NFC: [0xB23B], NFD: [0x1102, 0x116F, 0x11C2], NFKC: [0xB23B], NFKD: [0x1102, 0x116F, 0x11C2] }, +{ source: [0xB23C], NFC: [0xB23C], NFD: [0x1102, 0x1170], NFKC: [0xB23C], NFKD: [0x1102, 0x1170] }, +{ source: [0xB23D], NFC: [0xB23D], NFD: [0x1102, 0x1170, 0x11A8], NFKC: [0xB23D], NFKD: [0x1102, 0x1170, 0x11A8] }, +{ source: [0xB23E], NFC: [0xB23E], NFD: [0x1102, 0x1170, 0x11A9], NFKC: [0xB23E], NFKD: [0x1102, 0x1170, 0x11A9] }, +{ source: [0xB23F], NFC: [0xB23F], NFD: [0x1102, 0x1170, 0x11AA], NFKC: [0xB23F], NFKD: [0x1102, 0x1170, 0x11AA] }, +{ source: [0xB240], NFC: [0xB240], NFD: [0x1102, 0x1170, 0x11AB], NFKC: [0xB240], NFKD: [0x1102, 0x1170, 0x11AB] }, +{ source: [0xB241], NFC: [0xB241], NFD: [0x1102, 0x1170, 0x11AC], NFKC: [0xB241], NFKD: [0x1102, 0x1170, 0x11AC] }, +{ source: [0xB242], NFC: [0xB242], NFD: [0x1102, 0x1170, 0x11AD], NFKC: [0xB242], NFKD: [0x1102, 0x1170, 0x11AD] }, +{ source: [0xB243], NFC: [0xB243], NFD: [0x1102, 0x1170, 0x11AE], NFKC: [0xB243], NFKD: [0x1102, 0x1170, 0x11AE] }, +{ source: [0xB244], NFC: [0xB244], NFD: [0x1102, 0x1170, 0x11AF], NFKC: [0xB244], NFKD: [0x1102, 0x1170, 0x11AF] }, +{ source: [0xB245], NFC: [0xB245], NFD: [0x1102, 0x1170, 0x11B0], NFKC: [0xB245], NFKD: [0x1102, 0x1170, 0x11B0] }, +{ source: [0xB246], NFC: [0xB246], NFD: [0x1102, 0x1170, 0x11B1], NFKC: [0xB246], NFKD: [0x1102, 0x1170, 0x11B1] }, +{ source: [0xB247], NFC: [0xB247], NFD: [0x1102, 0x1170, 0x11B2], NFKC: [0xB247], NFKD: [0x1102, 0x1170, 0x11B2] }, +{ source: [0xB248], NFC: [0xB248], NFD: [0x1102, 0x1170, 0x11B3], NFKC: [0xB248], NFKD: [0x1102, 0x1170, 0x11B3] }, +{ source: [0xB249], NFC: [0xB249], NFD: [0x1102, 0x1170, 0x11B4], NFKC: [0xB249], NFKD: [0x1102, 0x1170, 0x11B4] }, +{ source: [0xB24A], NFC: [0xB24A], NFD: [0x1102, 0x1170, 0x11B5], NFKC: [0xB24A], NFKD: [0x1102, 0x1170, 0x11B5] }, +{ source: [0xB24B], NFC: [0xB24B], NFD: [0x1102, 0x1170, 0x11B6], NFKC: [0xB24B], NFKD: [0x1102, 0x1170, 0x11B6] }, +{ source: [0xB24C], NFC: [0xB24C], NFD: [0x1102, 0x1170, 0x11B7], NFKC: [0xB24C], NFKD: [0x1102, 0x1170, 0x11B7] }, +{ source: [0xB24D], NFC: [0xB24D], NFD: [0x1102, 0x1170, 0x11B8], NFKC: [0xB24D], NFKD: [0x1102, 0x1170, 0x11B8] }, +{ source: [0xB24E], NFC: [0xB24E], NFD: [0x1102, 0x1170, 0x11B9], NFKC: [0xB24E], NFKD: [0x1102, 0x1170, 0x11B9] }, +{ source: [0xB24F], NFC: [0xB24F], NFD: [0x1102, 0x1170, 0x11BA], NFKC: [0xB24F], NFKD: [0x1102, 0x1170, 0x11BA] }, +{ source: [0xB250], NFC: [0xB250], NFD: [0x1102, 0x1170, 0x11BB], NFKC: [0xB250], NFKD: [0x1102, 0x1170, 0x11BB] }, +{ source: [0xB251], NFC: [0xB251], NFD: [0x1102, 0x1170, 0x11BC], NFKC: [0xB251], NFKD: [0x1102, 0x1170, 0x11BC] }, +{ source: [0xB252], NFC: [0xB252], NFD: [0x1102, 0x1170, 0x11BD], NFKC: [0xB252], NFKD: [0x1102, 0x1170, 0x11BD] }, +{ source: [0xB253], NFC: [0xB253], NFD: [0x1102, 0x1170, 0x11BE], NFKC: [0xB253], NFKD: [0x1102, 0x1170, 0x11BE] }, +{ source: [0xB254], NFC: [0xB254], NFD: [0x1102, 0x1170, 0x11BF], NFKC: [0xB254], NFKD: [0x1102, 0x1170, 0x11BF] }, +{ source: [0xB255], NFC: [0xB255], NFD: [0x1102, 0x1170, 0x11C0], NFKC: [0xB255], NFKD: [0x1102, 0x1170, 0x11C0] }, +{ source: [0xB256], NFC: [0xB256], NFD: [0x1102, 0x1170, 0x11C1], NFKC: [0xB256], NFKD: [0x1102, 0x1170, 0x11C1] }, +{ source: [0xB257], NFC: [0xB257], NFD: [0x1102, 0x1170, 0x11C2], NFKC: [0xB257], NFKD: [0x1102, 0x1170, 0x11C2] }, +{ source: [0xB258], NFC: [0xB258], NFD: [0x1102, 0x1171], NFKC: [0xB258], NFKD: [0x1102, 0x1171] }, +{ source: [0xB259], NFC: [0xB259], NFD: [0x1102, 0x1171, 0x11A8], NFKC: [0xB259], NFKD: [0x1102, 0x1171, 0x11A8] }, +{ source: [0xB25A], NFC: [0xB25A], NFD: [0x1102, 0x1171, 0x11A9], NFKC: [0xB25A], NFKD: [0x1102, 0x1171, 0x11A9] }, +{ source: [0xB25B], NFC: [0xB25B], NFD: [0x1102, 0x1171, 0x11AA], NFKC: [0xB25B], NFKD: [0x1102, 0x1171, 0x11AA] }, +{ source: [0xB25C], NFC: [0xB25C], NFD: [0x1102, 0x1171, 0x11AB], NFKC: [0xB25C], NFKD: [0x1102, 0x1171, 0x11AB] }, +{ source: [0xB25D], NFC: [0xB25D], NFD: [0x1102, 0x1171, 0x11AC], NFKC: [0xB25D], NFKD: [0x1102, 0x1171, 0x11AC] }, +{ source: [0xB25E], NFC: [0xB25E], NFD: [0x1102, 0x1171, 0x11AD], NFKC: [0xB25E], NFKD: [0x1102, 0x1171, 0x11AD] }, +{ source: [0xB25F], NFC: [0xB25F], NFD: [0x1102, 0x1171, 0x11AE], NFKC: [0xB25F], NFKD: [0x1102, 0x1171, 0x11AE] }, +{ source: [0xB260], NFC: [0xB260], NFD: [0x1102, 0x1171, 0x11AF], NFKC: [0xB260], NFKD: [0x1102, 0x1171, 0x11AF] }, +{ source: [0xB261], NFC: [0xB261], NFD: [0x1102, 0x1171, 0x11B0], NFKC: [0xB261], NFKD: [0x1102, 0x1171, 0x11B0] }, +{ source: [0xB262], NFC: [0xB262], NFD: [0x1102, 0x1171, 0x11B1], NFKC: [0xB262], NFKD: [0x1102, 0x1171, 0x11B1] }, +{ source: [0xB263], NFC: [0xB263], NFD: [0x1102, 0x1171, 0x11B2], NFKC: [0xB263], NFKD: [0x1102, 0x1171, 0x11B2] }, +{ source: [0xB264], NFC: [0xB264], NFD: [0x1102, 0x1171, 0x11B3], NFKC: [0xB264], NFKD: [0x1102, 0x1171, 0x11B3] }, +{ source: [0xB265], NFC: [0xB265], NFD: [0x1102, 0x1171, 0x11B4], NFKC: [0xB265], NFKD: [0x1102, 0x1171, 0x11B4] }, +{ source: [0xB266], NFC: [0xB266], NFD: [0x1102, 0x1171, 0x11B5], NFKC: [0xB266], NFKD: [0x1102, 0x1171, 0x11B5] }, +{ source: [0xB267], NFC: [0xB267], NFD: [0x1102, 0x1171, 0x11B6], NFKC: [0xB267], NFKD: [0x1102, 0x1171, 0x11B6] }, +{ source: [0xB268], NFC: [0xB268], NFD: [0x1102, 0x1171, 0x11B7], NFKC: [0xB268], NFKD: [0x1102, 0x1171, 0x11B7] }, +{ source: [0xB269], NFC: [0xB269], NFD: [0x1102, 0x1171, 0x11B8], NFKC: [0xB269], NFKD: [0x1102, 0x1171, 0x11B8] }, +{ source: [0xB26A], NFC: [0xB26A], NFD: [0x1102, 0x1171, 0x11B9], NFKC: [0xB26A], NFKD: [0x1102, 0x1171, 0x11B9] }, +{ source: [0xB26B], NFC: [0xB26B], NFD: [0x1102, 0x1171, 0x11BA], NFKC: [0xB26B], NFKD: [0x1102, 0x1171, 0x11BA] }, +{ source: [0xB26C], NFC: [0xB26C], NFD: [0x1102, 0x1171, 0x11BB], NFKC: [0xB26C], NFKD: [0x1102, 0x1171, 0x11BB] }, +{ source: [0xB26D], NFC: [0xB26D], NFD: [0x1102, 0x1171, 0x11BC], NFKC: [0xB26D], NFKD: [0x1102, 0x1171, 0x11BC] }, +{ source: [0xB26E], NFC: [0xB26E], NFD: [0x1102, 0x1171, 0x11BD], NFKC: [0xB26E], NFKD: [0x1102, 0x1171, 0x11BD] }, +{ source: [0xB26F], NFC: [0xB26F], NFD: [0x1102, 0x1171, 0x11BE], NFKC: [0xB26F], NFKD: [0x1102, 0x1171, 0x11BE] }, +{ source: [0xB270], NFC: [0xB270], NFD: [0x1102, 0x1171, 0x11BF], NFKC: [0xB270], NFKD: [0x1102, 0x1171, 0x11BF] }, +{ source: [0xB271], NFC: [0xB271], NFD: [0x1102, 0x1171, 0x11C0], NFKC: [0xB271], NFKD: [0x1102, 0x1171, 0x11C0] }, +{ source: [0xB272], NFC: [0xB272], NFD: [0x1102, 0x1171, 0x11C1], NFKC: [0xB272], NFKD: [0x1102, 0x1171, 0x11C1] }, +{ source: [0xB273], NFC: [0xB273], NFD: [0x1102, 0x1171, 0x11C2], NFKC: [0xB273], NFKD: [0x1102, 0x1171, 0x11C2] }, +{ source: [0xB274], NFC: [0xB274], NFD: [0x1102, 0x1172], NFKC: [0xB274], NFKD: [0x1102, 0x1172] }, +{ source: [0xB275], NFC: [0xB275], NFD: [0x1102, 0x1172, 0x11A8], NFKC: [0xB275], NFKD: [0x1102, 0x1172, 0x11A8] }, +{ source: [0xB276], NFC: [0xB276], NFD: [0x1102, 0x1172, 0x11A9], NFKC: [0xB276], NFKD: [0x1102, 0x1172, 0x11A9] }, +{ source: [0xB277], NFC: [0xB277], NFD: [0x1102, 0x1172, 0x11AA], NFKC: [0xB277], NFKD: [0x1102, 0x1172, 0x11AA] }, +{ source: [0xB278], NFC: [0xB278], NFD: [0x1102, 0x1172, 0x11AB], NFKC: [0xB278], NFKD: [0x1102, 0x1172, 0x11AB] }, +{ source: [0xB279], NFC: [0xB279], NFD: [0x1102, 0x1172, 0x11AC], NFKC: [0xB279], NFKD: [0x1102, 0x1172, 0x11AC] }, +{ source: [0xB27A], NFC: [0xB27A], NFD: [0x1102, 0x1172, 0x11AD], NFKC: [0xB27A], NFKD: [0x1102, 0x1172, 0x11AD] }, +{ source: [0xB27B], NFC: [0xB27B], NFD: [0x1102, 0x1172, 0x11AE], NFKC: [0xB27B], NFKD: [0x1102, 0x1172, 0x11AE] }, +{ source: [0xB27C], NFC: [0xB27C], NFD: [0x1102, 0x1172, 0x11AF], NFKC: [0xB27C], NFKD: [0x1102, 0x1172, 0x11AF] }, +{ source: [0xB27D], NFC: [0xB27D], NFD: [0x1102, 0x1172, 0x11B0], NFKC: [0xB27D], NFKD: [0x1102, 0x1172, 0x11B0] }, +{ source: [0xB27E], NFC: [0xB27E], NFD: [0x1102, 0x1172, 0x11B1], NFKC: [0xB27E], NFKD: [0x1102, 0x1172, 0x11B1] }, +{ source: [0xB27F], NFC: [0xB27F], NFD: [0x1102, 0x1172, 0x11B2], NFKC: [0xB27F], NFKD: [0x1102, 0x1172, 0x11B2] }, +{ source: [0xB280], NFC: [0xB280], NFD: [0x1102, 0x1172, 0x11B3], NFKC: [0xB280], NFKD: [0x1102, 0x1172, 0x11B3] }, +{ source: [0xB281], NFC: [0xB281], NFD: [0x1102, 0x1172, 0x11B4], NFKC: [0xB281], NFKD: [0x1102, 0x1172, 0x11B4] }, +{ source: [0xB282], NFC: [0xB282], NFD: [0x1102, 0x1172, 0x11B5], NFKC: [0xB282], NFKD: [0x1102, 0x1172, 0x11B5] }, +{ source: [0xB283], NFC: [0xB283], NFD: [0x1102, 0x1172, 0x11B6], NFKC: [0xB283], NFKD: [0x1102, 0x1172, 0x11B6] }, +{ source: [0xB284], NFC: [0xB284], NFD: [0x1102, 0x1172, 0x11B7], NFKC: [0xB284], NFKD: [0x1102, 0x1172, 0x11B7] }, +{ source: [0xB285], NFC: [0xB285], NFD: [0x1102, 0x1172, 0x11B8], NFKC: [0xB285], NFKD: [0x1102, 0x1172, 0x11B8] }, +{ source: [0xB286], NFC: [0xB286], NFD: [0x1102, 0x1172, 0x11B9], NFKC: [0xB286], NFKD: [0x1102, 0x1172, 0x11B9] }, +{ source: [0xB287], NFC: [0xB287], NFD: [0x1102, 0x1172, 0x11BA], NFKC: [0xB287], NFKD: [0x1102, 0x1172, 0x11BA] }, +{ source: [0xB288], NFC: [0xB288], NFD: [0x1102, 0x1172, 0x11BB], NFKC: [0xB288], NFKD: [0x1102, 0x1172, 0x11BB] }, +{ source: [0xB289], NFC: [0xB289], NFD: [0x1102, 0x1172, 0x11BC], NFKC: [0xB289], NFKD: [0x1102, 0x1172, 0x11BC] }, +{ source: [0xB28A], NFC: [0xB28A], NFD: [0x1102, 0x1172, 0x11BD], NFKC: [0xB28A], NFKD: [0x1102, 0x1172, 0x11BD] }, +{ source: [0xB28B], NFC: [0xB28B], NFD: [0x1102, 0x1172, 0x11BE], NFKC: [0xB28B], NFKD: [0x1102, 0x1172, 0x11BE] }, +{ source: [0xB28C], NFC: [0xB28C], NFD: [0x1102, 0x1172, 0x11BF], NFKC: [0xB28C], NFKD: [0x1102, 0x1172, 0x11BF] }, +{ source: [0xB28D], NFC: [0xB28D], NFD: [0x1102, 0x1172, 0x11C0], NFKC: [0xB28D], NFKD: [0x1102, 0x1172, 0x11C0] }, +{ source: [0xB28E], NFC: [0xB28E], NFD: [0x1102, 0x1172, 0x11C1], NFKC: [0xB28E], NFKD: [0x1102, 0x1172, 0x11C1] }, +{ source: [0xB28F], NFC: [0xB28F], NFD: [0x1102, 0x1172, 0x11C2], NFKC: [0xB28F], NFKD: [0x1102, 0x1172, 0x11C2] }, +{ source: [0xB290], NFC: [0xB290], NFD: [0x1102, 0x1173], NFKC: [0xB290], NFKD: [0x1102, 0x1173] }, +{ source: [0xB291], NFC: [0xB291], NFD: [0x1102, 0x1173, 0x11A8], NFKC: [0xB291], NFKD: [0x1102, 0x1173, 0x11A8] }, +{ source: [0xB292], NFC: [0xB292], NFD: [0x1102, 0x1173, 0x11A9], NFKC: [0xB292], NFKD: [0x1102, 0x1173, 0x11A9] }, +{ source: [0xB293], NFC: [0xB293], NFD: [0x1102, 0x1173, 0x11AA], NFKC: [0xB293], NFKD: [0x1102, 0x1173, 0x11AA] }, +{ source: [0xB294], NFC: [0xB294], NFD: [0x1102, 0x1173, 0x11AB], NFKC: [0xB294], NFKD: [0x1102, 0x1173, 0x11AB] }, +{ source: [0xB295], NFC: [0xB295], NFD: [0x1102, 0x1173, 0x11AC], NFKC: [0xB295], NFKD: [0x1102, 0x1173, 0x11AC] }, +{ source: [0xB296], NFC: [0xB296], NFD: [0x1102, 0x1173, 0x11AD], NFKC: [0xB296], NFKD: [0x1102, 0x1173, 0x11AD] }, +{ source: [0xB297], NFC: [0xB297], NFD: [0x1102, 0x1173, 0x11AE], NFKC: [0xB297], NFKD: [0x1102, 0x1173, 0x11AE] }, +{ source: [0xB298], NFC: [0xB298], NFD: [0x1102, 0x1173, 0x11AF], NFKC: [0xB298], NFKD: [0x1102, 0x1173, 0x11AF] }, +{ source: [0xB299], NFC: [0xB299], NFD: [0x1102, 0x1173, 0x11B0], NFKC: [0xB299], NFKD: [0x1102, 0x1173, 0x11B0] }, +{ source: [0xB29A], NFC: [0xB29A], NFD: [0x1102, 0x1173, 0x11B1], NFKC: [0xB29A], NFKD: [0x1102, 0x1173, 0x11B1] }, +{ source: [0xB29B], NFC: [0xB29B], NFD: [0x1102, 0x1173, 0x11B2], NFKC: [0xB29B], NFKD: [0x1102, 0x1173, 0x11B2] }, +{ source: [0xB29C], NFC: [0xB29C], NFD: [0x1102, 0x1173, 0x11B3], NFKC: [0xB29C], NFKD: [0x1102, 0x1173, 0x11B3] }, +{ source: [0xB29D], NFC: [0xB29D], NFD: [0x1102, 0x1173, 0x11B4], NFKC: [0xB29D], NFKD: [0x1102, 0x1173, 0x11B4] }, +{ source: [0xB29E], NFC: [0xB29E], NFD: [0x1102, 0x1173, 0x11B5], NFKC: [0xB29E], NFKD: [0x1102, 0x1173, 0x11B5] }, +{ source: [0xB29F], NFC: [0xB29F], NFD: [0x1102, 0x1173, 0x11B6], NFKC: [0xB29F], NFKD: [0x1102, 0x1173, 0x11B6] }, +{ source: [0xB2A0], NFC: [0xB2A0], NFD: [0x1102, 0x1173, 0x11B7], NFKC: [0xB2A0], NFKD: [0x1102, 0x1173, 0x11B7] }, +{ source: [0xB2A1], NFC: [0xB2A1], NFD: [0x1102, 0x1173, 0x11B8], NFKC: [0xB2A1], NFKD: [0x1102, 0x1173, 0x11B8] }, +{ source: [0xB2A2], NFC: [0xB2A2], NFD: [0x1102, 0x1173, 0x11B9], NFKC: [0xB2A2], NFKD: [0x1102, 0x1173, 0x11B9] }, +{ source: [0xB2A3], NFC: [0xB2A3], NFD: [0x1102, 0x1173, 0x11BA], NFKC: [0xB2A3], NFKD: [0x1102, 0x1173, 0x11BA] }, +{ source: [0xB2A4], NFC: [0xB2A4], NFD: [0x1102, 0x1173, 0x11BB], NFKC: [0xB2A4], NFKD: [0x1102, 0x1173, 0x11BB] }, +{ source: [0xB2A5], NFC: [0xB2A5], NFD: [0x1102, 0x1173, 0x11BC], NFKC: [0xB2A5], NFKD: [0x1102, 0x1173, 0x11BC] }, +{ source: [0xB2A6], NFC: [0xB2A6], NFD: [0x1102, 0x1173, 0x11BD], NFKC: [0xB2A6], NFKD: [0x1102, 0x1173, 0x11BD] }, +{ source: [0xB2A7], NFC: [0xB2A7], NFD: [0x1102, 0x1173, 0x11BE], NFKC: [0xB2A7], NFKD: [0x1102, 0x1173, 0x11BE] }, +{ source: [0xB2A8], NFC: [0xB2A8], NFD: [0x1102, 0x1173, 0x11BF], NFKC: [0xB2A8], NFKD: [0x1102, 0x1173, 0x11BF] }, +{ source: [0xB2A9], NFC: [0xB2A9], NFD: [0x1102, 0x1173, 0x11C0], NFKC: [0xB2A9], NFKD: [0x1102, 0x1173, 0x11C0] }, +{ source: [0xB2AA], NFC: [0xB2AA], NFD: [0x1102, 0x1173, 0x11C1], NFKC: [0xB2AA], NFKD: [0x1102, 0x1173, 0x11C1] }, +{ source: [0xB2AB], NFC: [0xB2AB], NFD: [0x1102, 0x1173, 0x11C2], NFKC: [0xB2AB], NFKD: [0x1102, 0x1173, 0x11C2] }, +{ source: [0xB2AC], NFC: [0xB2AC], NFD: [0x1102, 0x1174], NFKC: [0xB2AC], NFKD: [0x1102, 0x1174] }, +{ source: [0xB2AD], NFC: [0xB2AD], NFD: [0x1102, 0x1174, 0x11A8], NFKC: [0xB2AD], NFKD: [0x1102, 0x1174, 0x11A8] }, +{ source: [0xB2AE], NFC: [0xB2AE], NFD: [0x1102, 0x1174, 0x11A9], NFKC: [0xB2AE], NFKD: [0x1102, 0x1174, 0x11A9] }, +{ source: [0xB2AF], NFC: [0xB2AF], NFD: [0x1102, 0x1174, 0x11AA], NFKC: [0xB2AF], NFKD: [0x1102, 0x1174, 0x11AA] }, +{ source: [0xB2B0], NFC: [0xB2B0], NFD: [0x1102, 0x1174, 0x11AB], NFKC: [0xB2B0], NFKD: [0x1102, 0x1174, 0x11AB] }, +{ source: [0xB2B1], NFC: [0xB2B1], NFD: [0x1102, 0x1174, 0x11AC], NFKC: [0xB2B1], NFKD: [0x1102, 0x1174, 0x11AC] }, +{ source: [0xB2B2], NFC: [0xB2B2], NFD: [0x1102, 0x1174, 0x11AD], NFKC: [0xB2B2], NFKD: [0x1102, 0x1174, 0x11AD] }, +{ source: [0xB2B3], NFC: [0xB2B3], NFD: [0x1102, 0x1174, 0x11AE], NFKC: [0xB2B3], NFKD: [0x1102, 0x1174, 0x11AE] }, +{ source: [0xB2B4], NFC: [0xB2B4], NFD: [0x1102, 0x1174, 0x11AF], NFKC: [0xB2B4], NFKD: [0x1102, 0x1174, 0x11AF] }, +{ source: [0xB2B5], NFC: [0xB2B5], NFD: [0x1102, 0x1174, 0x11B0], NFKC: [0xB2B5], NFKD: [0x1102, 0x1174, 0x11B0] }, +{ source: [0xB2B6], NFC: [0xB2B6], NFD: [0x1102, 0x1174, 0x11B1], NFKC: [0xB2B6], NFKD: [0x1102, 0x1174, 0x11B1] }, +{ source: [0xB2B7], NFC: [0xB2B7], NFD: [0x1102, 0x1174, 0x11B2], NFKC: [0xB2B7], NFKD: [0x1102, 0x1174, 0x11B2] }, +{ source: [0xB2B8], NFC: [0xB2B8], NFD: [0x1102, 0x1174, 0x11B3], NFKC: [0xB2B8], NFKD: [0x1102, 0x1174, 0x11B3] }, +{ source: [0xB2B9], NFC: [0xB2B9], NFD: [0x1102, 0x1174, 0x11B4], NFKC: [0xB2B9], NFKD: [0x1102, 0x1174, 0x11B4] }, +{ source: [0xB2BA], NFC: [0xB2BA], NFD: [0x1102, 0x1174, 0x11B5], NFKC: [0xB2BA], NFKD: [0x1102, 0x1174, 0x11B5] }, +{ source: [0xB2BB], NFC: [0xB2BB], NFD: [0x1102, 0x1174, 0x11B6], NFKC: [0xB2BB], NFKD: [0x1102, 0x1174, 0x11B6] }, +{ source: [0xB2BC], NFC: [0xB2BC], NFD: [0x1102, 0x1174, 0x11B7], NFKC: [0xB2BC], NFKD: [0x1102, 0x1174, 0x11B7] }, +{ source: [0xB2BD], NFC: [0xB2BD], NFD: [0x1102, 0x1174, 0x11B8], NFKC: [0xB2BD], NFKD: [0x1102, 0x1174, 0x11B8] }, +{ source: [0xB2BE], NFC: [0xB2BE], NFD: [0x1102, 0x1174, 0x11B9], NFKC: [0xB2BE], NFKD: [0x1102, 0x1174, 0x11B9] }, +{ source: [0xB2BF], NFC: [0xB2BF], NFD: [0x1102, 0x1174, 0x11BA], NFKC: [0xB2BF], NFKD: [0x1102, 0x1174, 0x11BA] }, +{ source: [0xB2C0], NFC: [0xB2C0], NFD: [0x1102, 0x1174, 0x11BB], NFKC: [0xB2C0], NFKD: [0x1102, 0x1174, 0x11BB] }, +{ source: [0xB2C1], NFC: [0xB2C1], NFD: [0x1102, 0x1174, 0x11BC], NFKC: [0xB2C1], NFKD: [0x1102, 0x1174, 0x11BC] }, +{ source: [0xB2C2], NFC: [0xB2C2], NFD: [0x1102, 0x1174, 0x11BD], NFKC: [0xB2C2], NFKD: [0x1102, 0x1174, 0x11BD] }, +{ source: [0xB2C3], NFC: [0xB2C3], NFD: [0x1102, 0x1174, 0x11BE], NFKC: [0xB2C3], NFKD: [0x1102, 0x1174, 0x11BE] }, +{ source: [0xB2C4], NFC: [0xB2C4], NFD: [0x1102, 0x1174, 0x11BF], NFKC: [0xB2C4], NFKD: [0x1102, 0x1174, 0x11BF] }, +{ source: [0xB2C5], NFC: [0xB2C5], NFD: [0x1102, 0x1174, 0x11C0], NFKC: [0xB2C5], NFKD: [0x1102, 0x1174, 0x11C0] }, +{ source: [0xB2C6], NFC: [0xB2C6], NFD: [0x1102, 0x1174, 0x11C1], NFKC: [0xB2C6], NFKD: [0x1102, 0x1174, 0x11C1] }, +{ source: [0xB2C7], NFC: [0xB2C7], NFD: [0x1102, 0x1174, 0x11C2], NFKC: [0xB2C7], NFKD: [0x1102, 0x1174, 0x11C2] }, +{ source: [0xB2C8], NFC: [0xB2C8], NFD: [0x1102, 0x1175], NFKC: [0xB2C8], NFKD: [0x1102, 0x1175] }, +{ source: [0xB2C9], NFC: [0xB2C9], NFD: [0x1102, 0x1175, 0x11A8], NFKC: [0xB2C9], NFKD: [0x1102, 0x1175, 0x11A8] }, +{ source: [0xB2CA], NFC: [0xB2CA], NFD: [0x1102, 0x1175, 0x11A9], NFKC: [0xB2CA], NFKD: [0x1102, 0x1175, 0x11A9] }, +{ source: [0xB2CB], NFC: [0xB2CB], NFD: [0x1102, 0x1175, 0x11AA], NFKC: [0xB2CB], NFKD: [0x1102, 0x1175, 0x11AA] }, +{ source: [0xB2CC], NFC: [0xB2CC], NFD: [0x1102, 0x1175, 0x11AB], NFKC: [0xB2CC], NFKD: [0x1102, 0x1175, 0x11AB] }, +{ source: [0xB2CD], NFC: [0xB2CD], NFD: [0x1102, 0x1175, 0x11AC], NFKC: [0xB2CD], NFKD: [0x1102, 0x1175, 0x11AC] }, +{ source: [0xB2CE], NFC: [0xB2CE], NFD: [0x1102, 0x1175, 0x11AD], NFKC: [0xB2CE], NFKD: [0x1102, 0x1175, 0x11AD] }, +{ source: [0xB2CF], NFC: [0xB2CF], NFD: [0x1102, 0x1175, 0x11AE], NFKC: [0xB2CF], NFKD: [0x1102, 0x1175, 0x11AE] }, +{ source: [0xB2D0], NFC: [0xB2D0], NFD: [0x1102, 0x1175, 0x11AF], NFKC: [0xB2D0], NFKD: [0x1102, 0x1175, 0x11AF] }, +{ source: [0xB2D1], NFC: [0xB2D1], NFD: [0x1102, 0x1175, 0x11B0], NFKC: [0xB2D1], NFKD: [0x1102, 0x1175, 0x11B0] }, +{ source: [0xB2D2], NFC: [0xB2D2], NFD: [0x1102, 0x1175, 0x11B1], NFKC: [0xB2D2], NFKD: [0x1102, 0x1175, 0x11B1] }, +{ source: [0xB2D3], NFC: [0xB2D3], NFD: [0x1102, 0x1175, 0x11B2], NFKC: [0xB2D3], NFKD: [0x1102, 0x1175, 0x11B2] }, +{ source: [0xB2D4], NFC: [0xB2D4], NFD: [0x1102, 0x1175, 0x11B3], NFKC: [0xB2D4], NFKD: [0x1102, 0x1175, 0x11B3] }, +{ source: [0xB2D5], NFC: [0xB2D5], NFD: [0x1102, 0x1175, 0x11B4], NFKC: [0xB2D5], NFKD: [0x1102, 0x1175, 0x11B4] }, +{ source: [0xB2D6], NFC: [0xB2D6], NFD: [0x1102, 0x1175, 0x11B5], NFKC: [0xB2D6], NFKD: [0x1102, 0x1175, 0x11B5] }, +{ source: [0xB2D7], NFC: [0xB2D7], NFD: [0x1102, 0x1175, 0x11B6], NFKC: [0xB2D7], NFKD: [0x1102, 0x1175, 0x11B6] }, +{ source: [0xB2D8], NFC: [0xB2D8], NFD: [0x1102, 0x1175, 0x11B7], NFKC: [0xB2D8], NFKD: [0x1102, 0x1175, 0x11B7] }, +{ source: [0xB2D9], NFC: [0xB2D9], NFD: [0x1102, 0x1175, 0x11B8], NFKC: [0xB2D9], NFKD: [0x1102, 0x1175, 0x11B8] }, +{ source: [0xB2DA], NFC: [0xB2DA], NFD: [0x1102, 0x1175, 0x11B9], NFKC: [0xB2DA], NFKD: [0x1102, 0x1175, 0x11B9] }, +{ source: [0xB2DB], NFC: [0xB2DB], NFD: [0x1102, 0x1175, 0x11BA], NFKC: [0xB2DB], NFKD: [0x1102, 0x1175, 0x11BA] }, +{ source: [0xB2DC], NFC: [0xB2DC], NFD: [0x1102, 0x1175, 0x11BB], NFKC: [0xB2DC], NFKD: [0x1102, 0x1175, 0x11BB] }, +{ source: [0xB2DD], NFC: [0xB2DD], NFD: [0x1102, 0x1175, 0x11BC], NFKC: [0xB2DD], NFKD: [0x1102, 0x1175, 0x11BC] }, +{ source: [0xB2DE], NFC: [0xB2DE], NFD: [0x1102, 0x1175, 0x11BD], NFKC: [0xB2DE], NFKD: [0x1102, 0x1175, 0x11BD] }, +{ source: [0xB2DF], NFC: [0xB2DF], NFD: [0x1102, 0x1175, 0x11BE], NFKC: [0xB2DF], NFKD: [0x1102, 0x1175, 0x11BE] }, +{ source: [0xB2E0], NFC: [0xB2E0], NFD: [0x1102, 0x1175, 0x11BF], NFKC: [0xB2E0], NFKD: [0x1102, 0x1175, 0x11BF] }, +{ source: [0xB2E1], NFC: [0xB2E1], NFD: [0x1102, 0x1175, 0x11C0], NFKC: [0xB2E1], NFKD: [0x1102, 0x1175, 0x11C0] }, +{ source: [0xB2E2], NFC: [0xB2E2], NFD: [0x1102, 0x1175, 0x11C1], NFKC: [0xB2E2], NFKD: [0x1102, 0x1175, 0x11C1] }, +{ source: [0xB2E3], NFC: [0xB2E3], NFD: [0x1102, 0x1175, 0x11C2], NFKC: [0xB2E3], NFKD: [0x1102, 0x1175, 0x11C2] }, +{ source: [0xB2E4], NFC: [0xB2E4], NFD: [0x1103, 0x1161], NFKC: [0xB2E4], NFKD: [0x1103, 0x1161] }, +{ source: [0xB2E5], NFC: [0xB2E5], NFD: [0x1103, 0x1161, 0x11A8], NFKC: [0xB2E5], NFKD: [0x1103, 0x1161, 0x11A8] }, +{ source: [0xB2E6], NFC: [0xB2E6], NFD: [0x1103, 0x1161, 0x11A9], NFKC: [0xB2E6], NFKD: [0x1103, 0x1161, 0x11A9] }, +{ source: [0xB2E7], NFC: [0xB2E7], NFD: [0x1103, 0x1161, 0x11AA], NFKC: [0xB2E7], NFKD: [0x1103, 0x1161, 0x11AA] }, +{ source: [0xB2E8], NFC: [0xB2E8], NFD: [0x1103, 0x1161, 0x11AB], NFKC: [0xB2E8], NFKD: [0x1103, 0x1161, 0x11AB] }, +{ source: [0xB2E9], NFC: [0xB2E9], NFD: [0x1103, 0x1161, 0x11AC], NFKC: [0xB2E9], NFKD: [0x1103, 0x1161, 0x11AC] }, +{ source: [0xB2EA], NFC: [0xB2EA], NFD: [0x1103, 0x1161, 0x11AD], NFKC: [0xB2EA], NFKD: [0x1103, 0x1161, 0x11AD] }, +{ source: [0xB2EB], NFC: [0xB2EB], NFD: [0x1103, 0x1161, 0x11AE], NFKC: [0xB2EB], NFKD: [0x1103, 0x1161, 0x11AE] }, +{ source: [0xB2EC], NFC: [0xB2EC], NFD: [0x1103, 0x1161, 0x11AF], NFKC: [0xB2EC], NFKD: [0x1103, 0x1161, 0x11AF] }, +{ source: [0xB2ED], NFC: [0xB2ED], NFD: [0x1103, 0x1161, 0x11B0], NFKC: [0xB2ED], NFKD: [0x1103, 0x1161, 0x11B0] }, +{ source: [0xB2EE], NFC: [0xB2EE], NFD: [0x1103, 0x1161, 0x11B1], NFKC: [0xB2EE], NFKD: [0x1103, 0x1161, 0x11B1] }, +{ source: [0xB2EF], NFC: [0xB2EF], NFD: [0x1103, 0x1161, 0x11B2], NFKC: [0xB2EF], NFKD: [0x1103, 0x1161, 0x11B2] }, +{ source: [0xB2F0], NFC: [0xB2F0], NFD: [0x1103, 0x1161, 0x11B3], NFKC: [0xB2F0], NFKD: [0x1103, 0x1161, 0x11B3] }, +{ source: [0xB2F1], NFC: [0xB2F1], NFD: [0x1103, 0x1161, 0x11B4], NFKC: [0xB2F1], NFKD: [0x1103, 0x1161, 0x11B4] }, +{ source: [0xB2F2], NFC: [0xB2F2], NFD: [0x1103, 0x1161, 0x11B5], NFKC: [0xB2F2], NFKD: [0x1103, 0x1161, 0x11B5] }, +{ source: [0xB2F3], NFC: [0xB2F3], NFD: [0x1103, 0x1161, 0x11B6], NFKC: [0xB2F3], NFKD: [0x1103, 0x1161, 0x11B6] }, +{ source: [0xB2F4], NFC: [0xB2F4], NFD: [0x1103, 0x1161, 0x11B7], NFKC: [0xB2F4], NFKD: [0x1103, 0x1161, 0x11B7] }, +{ source: [0xB2F5], NFC: [0xB2F5], NFD: [0x1103, 0x1161, 0x11B8], NFKC: [0xB2F5], NFKD: [0x1103, 0x1161, 0x11B8] }, +{ source: [0xB2F6], NFC: [0xB2F6], NFD: [0x1103, 0x1161, 0x11B9], NFKC: [0xB2F6], NFKD: [0x1103, 0x1161, 0x11B9] }, +{ source: [0xB2F7], NFC: [0xB2F7], NFD: [0x1103, 0x1161, 0x11BA], NFKC: [0xB2F7], NFKD: [0x1103, 0x1161, 0x11BA] }, +{ source: [0xB2F8], NFC: [0xB2F8], NFD: [0x1103, 0x1161, 0x11BB], NFKC: [0xB2F8], NFKD: [0x1103, 0x1161, 0x11BB] }, +{ source: [0xB2F9], NFC: [0xB2F9], NFD: [0x1103, 0x1161, 0x11BC], NFKC: [0xB2F9], NFKD: [0x1103, 0x1161, 0x11BC] }, +{ source: [0xB2FA], NFC: [0xB2FA], NFD: [0x1103, 0x1161, 0x11BD], NFKC: [0xB2FA], NFKD: [0x1103, 0x1161, 0x11BD] }, +{ source: [0xB2FB], NFC: [0xB2FB], NFD: [0x1103, 0x1161, 0x11BE], NFKC: [0xB2FB], NFKD: [0x1103, 0x1161, 0x11BE] }, +{ source: [0xB2FC], NFC: [0xB2FC], NFD: [0x1103, 0x1161, 0x11BF], NFKC: [0xB2FC], NFKD: [0x1103, 0x1161, 0x11BF] }, +{ source: [0xB2FD], NFC: [0xB2FD], NFD: [0x1103, 0x1161, 0x11C0], NFKC: [0xB2FD], NFKD: [0x1103, 0x1161, 0x11C0] }, +{ source: [0xB2FE], NFC: [0xB2FE], NFD: [0x1103, 0x1161, 0x11C1], NFKC: [0xB2FE], NFKD: [0x1103, 0x1161, 0x11C1] }, +{ source: [0xB2FF], NFC: [0xB2FF], NFD: [0x1103, 0x1161, 0x11C2], NFKC: [0xB2FF], NFKD: [0x1103, 0x1161, 0x11C2] }, +{ source: [0xB300], NFC: [0xB300], NFD: [0x1103, 0x1162], NFKC: [0xB300], NFKD: [0x1103, 0x1162] }, +{ source: [0xB301], NFC: [0xB301], NFD: [0x1103, 0x1162, 0x11A8], NFKC: [0xB301], NFKD: [0x1103, 0x1162, 0x11A8] }, +{ source: [0xB302], NFC: [0xB302], NFD: [0x1103, 0x1162, 0x11A9], NFKC: [0xB302], NFKD: [0x1103, 0x1162, 0x11A9] }, +{ source: [0xB303], NFC: [0xB303], NFD: [0x1103, 0x1162, 0x11AA], NFKC: [0xB303], NFKD: [0x1103, 0x1162, 0x11AA] }, +{ source: [0xB304], NFC: [0xB304], NFD: [0x1103, 0x1162, 0x11AB], NFKC: [0xB304], NFKD: [0x1103, 0x1162, 0x11AB] }, +{ source: [0xB305], NFC: [0xB305], NFD: [0x1103, 0x1162, 0x11AC], NFKC: [0xB305], NFKD: [0x1103, 0x1162, 0x11AC] }, +{ source: [0xB306], NFC: [0xB306], NFD: [0x1103, 0x1162, 0x11AD], NFKC: [0xB306], NFKD: [0x1103, 0x1162, 0x11AD] }, +{ source: [0xB307], NFC: [0xB307], NFD: [0x1103, 0x1162, 0x11AE], NFKC: [0xB307], NFKD: [0x1103, 0x1162, 0x11AE] }, +{ source: [0xB308], NFC: [0xB308], NFD: [0x1103, 0x1162, 0x11AF], NFKC: [0xB308], NFKD: [0x1103, 0x1162, 0x11AF] }, +{ source: [0xB309], NFC: [0xB309], NFD: [0x1103, 0x1162, 0x11B0], NFKC: [0xB309], NFKD: [0x1103, 0x1162, 0x11B0] }, +{ source: [0xB30A], NFC: [0xB30A], NFD: [0x1103, 0x1162, 0x11B1], NFKC: [0xB30A], NFKD: [0x1103, 0x1162, 0x11B1] }, +{ source: [0xB30B], NFC: [0xB30B], NFD: [0x1103, 0x1162, 0x11B2], NFKC: [0xB30B], NFKD: [0x1103, 0x1162, 0x11B2] }, +{ source: [0xB30C], NFC: [0xB30C], NFD: [0x1103, 0x1162, 0x11B3], NFKC: [0xB30C], NFKD: [0x1103, 0x1162, 0x11B3] }, +{ source: [0xB30D], NFC: [0xB30D], NFD: [0x1103, 0x1162, 0x11B4], NFKC: [0xB30D], NFKD: [0x1103, 0x1162, 0x11B4] }, +{ source: [0xB30E], NFC: [0xB30E], NFD: [0x1103, 0x1162, 0x11B5], NFKC: [0xB30E], NFKD: [0x1103, 0x1162, 0x11B5] }, +{ source: [0xB30F], NFC: [0xB30F], NFD: [0x1103, 0x1162, 0x11B6], NFKC: [0xB30F], NFKD: [0x1103, 0x1162, 0x11B6] }, +{ source: [0xB310], NFC: [0xB310], NFD: [0x1103, 0x1162, 0x11B7], NFKC: [0xB310], NFKD: [0x1103, 0x1162, 0x11B7] }, +{ source: [0xB311], NFC: [0xB311], NFD: [0x1103, 0x1162, 0x11B8], NFKC: [0xB311], NFKD: [0x1103, 0x1162, 0x11B8] }, +{ source: [0xB312], NFC: [0xB312], NFD: [0x1103, 0x1162, 0x11B9], NFKC: [0xB312], NFKD: [0x1103, 0x1162, 0x11B9] }, +{ source: [0xB313], NFC: [0xB313], NFD: [0x1103, 0x1162, 0x11BA], NFKC: [0xB313], NFKD: [0x1103, 0x1162, 0x11BA] }, +{ source: [0xB314], NFC: [0xB314], NFD: [0x1103, 0x1162, 0x11BB], NFKC: [0xB314], NFKD: [0x1103, 0x1162, 0x11BB] }, +{ source: [0xB315], NFC: [0xB315], NFD: [0x1103, 0x1162, 0x11BC], NFKC: [0xB315], NFKD: [0x1103, 0x1162, 0x11BC] }, +{ source: [0xB316], NFC: [0xB316], NFD: [0x1103, 0x1162, 0x11BD], NFKC: [0xB316], NFKD: [0x1103, 0x1162, 0x11BD] }, +{ source: [0xB317], NFC: [0xB317], NFD: [0x1103, 0x1162, 0x11BE], NFKC: [0xB317], NFKD: [0x1103, 0x1162, 0x11BE] }, +{ source: [0xB318], NFC: [0xB318], NFD: [0x1103, 0x1162, 0x11BF], NFKC: [0xB318], NFKD: [0x1103, 0x1162, 0x11BF] }, +{ source: [0xB319], NFC: [0xB319], NFD: [0x1103, 0x1162, 0x11C0], NFKC: [0xB319], NFKD: [0x1103, 0x1162, 0x11C0] }, +{ source: [0xB31A], NFC: [0xB31A], NFD: [0x1103, 0x1162, 0x11C1], NFKC: [0xB31A], NFKD: [0x1103, 0x1162, 0x11C1] }, +{ source: [0xB31B], NFC: [0xB31B], NFD: [0x1103, 0x1162, 0x11C2], NFKC: [0xB31B], NFKD: [0x1103, 0x1162, 0x11C2] }, +{ source: [0xB31C], NFC: [0xB31C], NFD: [0x1103, 0x1163], NFKC: [0xB31C], NFKD: [0x1103, 0x1163] }, +{ source: [0xB31D], NFC: [0xB31D], NFD: [0x1103, 0x1163, 0x11A8], NFKC: [0xB31D], NFKD: [0x1103, 0x1163, 0x11A8] }, +{ source: [0xB31E], NFC: [0xB31E], NFD: [0x1103, 0x1163, 0x11A9], NFKC: [0xB31E], NFKD: [0x1103, 0x1163, 0x11A9] }, +{ source: [0xB31F], NFC: [0xB31F], NFD: [0x1103, 0x1163, 0x11AA], NFKC: [0xB31F], NFKD: [0x1103, 0x1163, 0x11AA] }, +{ source: [0xB320], NFC: [0xB320], NFD: [0x1103, 0x1163, 0x11AB], NFKC: [0xB320], NFKD: [0x1103, 0x1163, 0x11AB] }, +{ source: [0xB321], NFC: [0xB321], NFD: [0x1103, 0x1163, 0x11AC], NFKC: [0xB321], NFKD: [0x1103, 0x1163, 0x11AC] }, +{ source: [0xB322], NFC: [0xB322], NFD: [0x1103, 0x1163, 0x11AD], NFKC: [0xB322], NFKD: [0x1103, 0x1163, 0x11AD] }, +{ source: [0xB323], NFC: [0xB323], NFD: [0x1103, 0x1163, 0x11AE], NFKC: [0xB323], NFKD: [0x1103, 0x1163, 0x11AE] }, +{ source: [0xB324], NFC: [0xB324], NFD: [0x1103, 0x1163, 0x11AF], NFKC: [0xB324], NFKD: [0x1103, 0x1163, 0x11AF] }, +{ source: [0xB325], NFC: [0xB325], NFD: [0x1103, 0x1163, 0x11B0], NFKC: [0xB325], NFKD: [0x1103, 0x1163, 0x11B0] }, +{ source: [0xB326], NFC: [0xB326], NFD: [0x1103, 0x1163, 0x11B1], NFKC: [0xB326], NFKD: [0x1103, 0x1163, 0x11B1] }, +{ source: [0xB327], NFC: [0xB327], NFD: [0x1103, 0x1163, 0x11B2], NFKC: [0xB327], NFKD: [0x1103, 0x1163, 0x11B2] }, +{ source: [0xB328], NFC: [0xB328], NFD: [0x1103, 0x1163, 0x11B3], NFKC: [0xB328], NFKD: [0x1103, 0x1163, 0x11B3] }, +{ source: [0xB329], NFC: [0xB329], NFD: [0x1103, 0x1163, 0x11B4], NFKC: [0xB329], NFKD: [0x1103, 0x1163, 0x11B4] }, +{ source: [0xB32A], NFC: [0xB32A], NFD: [0x1103, 0x1163, 0x11B5], NFKC: [0xB32A], NFKD: [0x1103, 0x1163, 0x11B5] }, +{ source: [0xB32B], NFC: [0xB32B], NFD: [0x1103, 0x1163, 0x11B6], NFKC: [0xB32B], NFKD: [0x1103, 0x1163, 0x11B6] }, +{ source: [0xB32C], NFC: [0xB32C], NFD: [0x1103, 0x1163, 0x11B7], NFKC: [0xB32C], NFKD: [0x1103, 0x1163, 0x11B7] }, +{ source: [0xB32D], NFC: [0xB32D], NFD: [0x1103, 0x1163, 0x11B8], NFKC: [0xB32D], NFKD: [0x1103, 0x1163, 0x11B8] }, +{ source: [0xB32E], NFC: [0xB32E], NFD: [0x1103, 0x1163, 0x11B9], NFKC: [0xB32E], NFKD: [0x1103, 0x1163, 0x11B9] }, +{ source: [0xB32F], NFC: [0xB32F], NFD: [0x1103, 0x1163, 0x11BA], NFKC: [0xB32F], NFKD: [0x1103, 0x1163, 0x11BA] }, +{ source: [0xB330], NFC: [0xB330], NFD: [0x1103, 0x1163, 0x11BB], NFKC: [0xB330], NFKD: [0x1103, 0x1163, 0x11BB] }, +{ source: [0xB331], NFC: [0xB331], NFD: [0x1103, 0x1163, 0x11BC], NFKC: [0xB331], NFKD: [0x1103, 0x1163, 0x11BC] }, +{ source: [0xB332], NFC: [0xB332], NFD: [0x1103, 0x1163, 0x11BD], NFKC: [0xB332], NFKD: [0x1103, 0x1163, 0x11BD] }, +{ source: [0xB333], NFC: [0xB333], NFD: [0x1103, 0x1163, 0x11BE], NFKC: [0xB333], NFKD: [0x1103, 0x1163, 0x11BE] }, +{ source: [0xB334], NFC: [0xB334], NFD: [0x1103, 0x1163, 0x11BF], NFKC: [0xB334], NFKD: [0x1103, 0x1163, 0x11BF] }, +{ source: [0xB335], NFC: [0xB335], NFD: [0x1103, 0x1163, 0x11C0], NFKC: [0xB335], NFKD: [0x1103, 0x1163, 0x11C0] }, +{ source: [0xB336], NFC: [0xB336], NFD: [0x1103, 0x1163, 0x11C1], NFKC: [0xB336], NFKD: [0x1103, 0x1163, 0x11C1] }, +{ source: [0xB337], NFC: [0xB337], NFD: [0x1103, 0x1163, 0x11C2], NFKC: [0xB337], NFKD: [0x1103, 0x1163, 0x11C2] }, +{ source: [0xB338], NFC: [0xB338], NFD: [0x1103, 0x1164], NFKC: [0xB338], NFKD: [0x1103, 0x1164] }, +{ source: [0xB339], NFC: [0xB339], NFD: [0x1103, 0x1164, 0x11A8], NFKC: [0xB339], NFKD: [0x1103, 0x1164, 0x11A8] }, +{ source: [0xB33A], NFC: [0xB33A], NFD: [0x1103, 0x1164, 0x11A9], NFKC: [0xB33A], NFKD: [0x1103, 0x1164, 0x11A9] }, +{ source: [0xB33B], NFC: [0xB33B], NFD: [0x1103, 0x1164, 0x11AA], NFKC: [0xB33B], NFKD: [0x1103, 0x1164, 0x11AA] }, +{ source: [0xB33C], NFC: [0xB33C], NFD: [0x1103, 0x1164, 0x11AB], NFKC: [0xB33C], NFKD: [0x1103, 0x1164, 0x11AB] }, +{ source: [0xB33D], NFC: [0xB33D], NFD: [0x1103, 0x1164, 0x11AC], NFKC: [0xB33D], NFKD: [0x1103, 0x1164, 0x11AC] }, +{ source: [0xB33E], NFC: [0xB33E], NFD: [0x1103, 0x1164, 0x11AD], NFKC: [0xB33E], NFKD: [0x1103, 0x1164, 0x11AD] }, +{ source: [0xB33F], NFC: [0xB33F], NFD: [0x1103, 0x1164, 0x11AE], NFKC: [0xB33F], NFKD: [0x1103, 0x1164, 0x11AE] }, +{ source: [0xB340], NFC: [0xB340], NFD: [0x1103, 0x1164, 0x11AF], NFKC: [0xB340], NFKD: [0x1103, 0x1164, 0x11AF] }, +{ source: [0xB341], NFC: [0xB341], NFD: [0x1103, 0x1164, 0x11B0], NFKC: [0xB341], NFKD: [0x1103, 0x1164, 0x11B0] }, +{ source: [0xB342], NFC: [0xB342], NFD: [0x1103, 0x1164, 0x11B1], NFKC: [0xB342], NFKD: [0x1103, 0x1164, 0x11B1] }, +{ source: [0xB343], NFC: [0xB343], NFD: [0x1103, 0x1164, 0x11B2], NFKC: [0xB343], NFKD: [0x1103, 0x1164, 0x11B2] }, +{ source: [0xB344], NFC: [0xB344], NFD: [0x1103, 0x1164, 0x11B3], NFKC: [0xB344], NFKD: [0x1103, 0x1164, 0x11B3] }, +{ source: [0xB345], NFC: [0xB345], NFD: [0x1103, 0x1164, 0x11B4], NFKC: [0xB345], NFKD: [0x1103, 0x1164, 0x11B4] }, +{ source: [0xB346], NFC: [0xB346], NFD: [0x1103, 0x1164, 0x11B5], NFKC: [0xB346], NFKD: [0x1103, 0x1164, 0x11B5] }, +{ source: [0xB347], NFC: [0xB347], NFD: [0x1103, 0x1164, 0x11B6], NFKC: [0xB347], NFKD: [0x1103, 0x1164, 0x11B6] }, +{ source: [0xB348], NFC: [0xB348], NFD: [0x1103, 0x1164, 0x11B7], NFKC: [0xB348], NFKD: [0x1103, 0x1164, 0x11B7] }, +{ source: [0xB349], NFC: [0xB349], NFD: [0x1103, 0x1164, 0x11B8], NFKC: [0xB349], NFKD: [0x1103, 0x1164, 0x11B8] }, +{ source: [0xB34A], NFC: [0xB34A], NFD: [0x1103, 0x1164, 0x11B9], NFKC: [0xB34A], NFKD: [0x1103, 0x1164, 0x11B9] }, +{ source: [0xB34B], NFC: [0xB34B], NFD: [0x1103, 0x1164, 0x11BA], NFKC: [0xB34B], NFKD: [0x1103, 0x1164, 0x11BA] }, +{ source: [0xB34C], NFC: [0xB34C], NFD: [0x1103, 0x1164, 0x11BB], NFKC: [0xB34C], NFKD: [0x1103, 0x1164, 0x11BB] }, +{ source: [0xB34D], NFC: [0xB34D], NFD: [0x1103, 0x1164, 0x11BC], NFKC: [0xB34D], NFKD: [0x1103, 0x1164, 0x11BC] }, +{ source: [0xB34E], NFC: [0xB34E], NFD: [0x1103, 0x1164, 0x11BD], NFKC: [0xB34E], NFKD: [0x1103, 0x1164, 0x11BD] }, +{ source: [0xB34F], NFC: [0xB34F], NFD: [0x1103, 0x1164, 0x11BE], NFKC: [0xB34F], NFKD: [0x1103, 0x1164, 0x11BE] }, +{ source: [0xB350], NFC: [0xB350], NFD: [0x1103, 0x1164, 0x11BF], NFKC: [0xB350], NFKD: [0x1103, 0x1164, 0x11BF] }, +{ source: [0xB351], NFC: [0xB351], NFD: [0x1103, 0x1164, 0x11C0], NFKC: [0xB351], NFKD: [0x1103, 0x1164, 0x11C0] }, +{ source: [0xB352], NFC: [0xB352], NFD: [0x1103, 0x1164, 0x11C1], NFKC: [0xB352], NFKD: [0x1103, 0x1164, 0x11C1] }, +{ source: [0xB353], NFC: [0xB353], NFD: [0x1103, 0x1164, 0x11C2], NFKC: [0xB353], NFKD: [0x1103, 0x1164, 0x11C2] }, +{ source: [0xB354], NFC: [0xB354], NFD: [0x1103, 0x1165], NFKC: [0xB354], NFKD: [0x1103, 0x1165] }, +{ source: [0xB355], NFC: [0xB355], NFD: [0x1103, 0x1165, 0x11A8], NFKC: [0xB355], NFKD: [0x1103, 0x1165, 0x11A8] }, +{ source: [0xB356], NFC: [0xB356], NFD: [0x1103, 0x1165, 0x11A9], NFKC: [0xB356], NFKD: [0x1103, 0x1165, 0x11A9] }, +{ source: [0xB357], NFC: [0xB357], NFD: [0x1103, 0x1165, 0x11AA], NFKC: [0xB357], NFKD: [0x1103, 0x1165, 0x11AA] }, +{ source: [0xB358], NFC: [0xB358], NFD: [0x1103, 0x1165, 0x11AB], NFKC: [0xB358], NFKD: [0x1103, 0x1165, 0x11AB] }, +{ source: [0xB359], NFC: [0xB359], NFD: [0x1103, 0x1165, 0x11AC], NFKC: [0xB359], NFKD: [0x1103, 0x1165, 0x11AC] }, +{ source: [0xB35A], NFC: [0xB35A], NFD: [0x1103, 0x1165, 0x11AD], NFKC: [0xB35A], NFKD: [0x1103, 0x1165, 0x11AD] }, +{ source: [0xB35B], NFC: [0xB35B], NFD: [0x1103, 0x1165, 0x11AE], NFKC: [0xB35B], NFKD: [0x1103, 0x1165, 0x11AE] }, +{ source: [0xB35C], NFC: [0xB35C], NFD: [0x1103, 0x1165, 0x11AF], NFKC: [0xB35C], NFKD: [0x1103, 0x1165, 0x11AF] }, +{ source: [0xB35D], NFC: [0xB35D], NFD: [0x1103, 0x1165, 0x11B0], NFKC: [0xB35D], NFKD: [0x1103, 0x1165, 0x11B0] }, +{ source: [0xB35E], NFC: [0xB35E], NFD: [0x1103, 0x1165, 0x11B1], NFKC: [0xB35E], NFKD: [0x1103, 0x1165, 0x11B1] }, +{ source: [0xB35F], NFC: [0xB35F], NFD: [0x1103, 0x1165, 0x11B2], NFKC: [0xB35F], NFKD: [0x1103, 0x1165, 0x11B2] }, +{ source: [0xB360], NFC: [0xB360], NFD: [0x1103, 0x1165, 0x11B3], NFKC: [0xB360], NFKD: [0x1103, 0x1165, 0x11B3] }, +{ source: [0xB361], NFC: [0xB361], NFD: [0x1103, 0x1165, 0x11B4], NFKC: [0xB361], NFKD: [0x1103, 0x1165, 0x11B4] }, +{ source: [0xB362], NFC: [0xB362], NFD: [0x1103, 0x1165, 0x11B5], NFKC: [0xB362], NFKD: [0x1103, 0x1165, 0x11B5] }, +{ source: [0xB363], NFC: [0xB363], NFD: [0x1103, 0x1165, 0x11B6], NFKC: [0xB363], NFKD: [0x1103, 0x1165, 0x11B6] }, +{ source: [0xB364], NFC: [0xB364], NFD: [0x1103, 0x1165, 0x11B7], NFKC: [0xB364], NFKD: [0x1103, 0x1165, 0x11B7] }, +{ source: [0xB365], NFC: [0xB365], NFD: [0x1103, 0x1165, 0x11B8], NFKC: [0xB365], NFKD: [0x1103, 0x1165, 0x11B8] }, +{ source: [0xB366], NFC: [0xB366], NFD: [0x1103, 0x1165, 0x11B9], NFKC: [0xB366], NFKD: [0x1103, 0x1165, 0x11B9] }, +{ source: [0xB367], NFC: [0xB367], NFD: [0x1103, 0x1165, 0x11BA], NFKC: [0xB367], NFKD: [0x1103, 0x1165, 0x11BA] }, +{ source: [0xB368], NFC: [0xB368], NFD: [0x1103, 0x1165, 0x11BB], NFKC: [0xB368], NFKD: [0x1103, 0x1165, 0x11BB] }, +{ source: [0xB369], NFC: [0xB369], NFD: [0x1103, 0x1165, 0x11BC], NFKC: [0xB369], NFKD: [0x1103, 0x1165, 0x11BC] }, +{ source: [0xB36A], NFC: [0xB36A], NFD: [0x1103, 0x1165, 0x11BD], NFKC: [0xB36A], NFKD: [0x1103, 0x1165, 0x11BD] }, +{ source: [0xB36B], NFC: [0xB36B], NFD: [0x1103, 0x1165, 0x11BE], NFKC: [0xB36B], NFKD: [0x1103, 0x1165, 0x11BE] }, +{ source: [0xB36C], NFC: [0xB36C], NFD: [0x1103, 0x1165, 0x11BF], NFKC: [0xB36C], NFKD: [0x1103, 0x1165, 0x11BF] }, +{ source: [0xB36D], NFC: [0xB36D], NFD: [0x1103, 0x1165, 0x11C0], NFKC: [0xB36D], NFKD: [0x1103, 0x1165, 0x11C0] }, +{ source: [0xB36E], NFC: [0xB36E], NFD: [0x1103, 0x1165, 0x11C1], NFKC: [0xB36E], NFKD: [0x1103, 0x1165, 0x11C1] }, +{ source: [0xB36F], NFC: [0xB36F], NFD: [0x1103, 0x1165, 0x11C2], NFKC: [0xB36F], NFKD: [0x1103, 0x1165, 0x11C2] }, +{ source: [0xB370], NFC: [0xB370], NFD: [0x1103, 0x1166], NFKC: [0xB370], NFKD: [0x1103, 0x1166] }, +{ source: [0xB371], NFC: [0xB371], NFD: [0x1103, 0x1166, 0x11A8], NFKC: [0xB371], NFKD: [0x1103, 0x1166, 0x11A8] }, +{ source: [0xB372], NFC: [0xB372], NFD: [0x1103, 0x1166, 0x11A9], NFKC: [0xB372], NFKD: [0x1103, 0x1166, 0x11A9] }, +{ source: [0xB373], NFC: [0xB373], NFD: [0x1103, 0x1166, 0x11AA], NFKC: [0xB373], NFKD: [0x1103, 0x1166, 0x11AA] }, +{ source: [0xB374], NFC: [0xB374], NFD: [0x1103, 0x1166, 0x11AB], NFKC: [0xB374], NFKD: [0x1103, 0x1166, 0x11AB] }, +{ source: [0xB375], NFC: [0xB375], NFD: [0x1103, 0x1166, 0x11AC], NFKC: [0xB375], NFKD: [0x1103, 0x1166, 0x11AC] }, +{ source: [0xB376], NFC: [0xB376], NFD: [0x1103, 0x1166, 0x11AD], NFKC: [0xB376], NFKD: [0x1103, 0x1166, 0x11AD] }, +{ source: [0xB377], NFC: [0xB377], NFD: [0x1103, 0x1166, 0x11AE], NFKC: [0xB377], NFKD: [0x1103, 0x1166, 0x11AE] }, +{ source: [0xB378], NFC: [0xB378], NFD: [0x1103, 0x1166, 0x11AF], NFKC: [0xB378], NFKD: [0x1103, 0x1166, 0x11AF] }, +{ source: [0xB379], NFC: [0xB379], NFD: [0x1103, 0x1166, 0x11B0], NFKC: [0xB379], NFKD: [0x1103, 0x1166, 0x11B0] }, +{ source: [0xB37A], NFC: [0xB37A], NFD: [0x1103, 0x1166, 0x11B1], NFKC: [0xB37A], NFKD: [0x1103, 0x1166, 0x11B1] }, +{ source: [0xB37B], NFC: [0xB37B], NFD: [0x1103, 0x1166, 0x11B2], NFKC: [0xB37B], NFKD: [0x1103, 0x1166, 0x11B2] }, +{ source: [0xB37C], NFC: [0xB37C], NFD: [0x1103, 0x1166, 0x11B3], NFKC: [0xB37C], NFKD: [0x1103, 0x1166, 0x11B3] }, +{ source: [0xB37D], NFC: [0xB37D], NFD: [0x1103, 0x1166, 0x11B4], NFKC: [0xB37D], NFKD: [0x1103, 0x1166, 0x11B4] }, +{ source: [0xB37E], NFC: [0xB37E], NFD: [0x1103, 0x1166, 0x11B5], NFKC: [0xB37E], NFKD: [0x1103, 0x1166, 0x11B5] }, +{ source: [0xB37F], NFC: [0xB37F], NFD: [0x1103, 0x1166, 0x11B6], NFKC: [0xB37F], NFKD: [0x1103, 0x1166, 0x11B6] }, +{ source: [0xB380], NFC: [0xB380], NFD: [0x1103, 0x1166, 0x11B7], NFKC: [0xB380], NFKD: [0x1103, 0x1166, 0x11B7] }, +{ source: [0xB381], NFC: [0xB381], NFD: [0x1103, 0x1166, 0x11B8], NFKC: [0xB381], NFKD: [0x1103, 0x1166, 0x11B8] }, +{ source: [0xB382], NFC: [0xB382], NFD: [0x1103, 0x1166, 0x11B9], NFKC: [0xB382], NFKD: [0x1103, 0x1166, 0x11B9] }, +{ source: [0xB383], NFC: [0xB383], NFD: [0x1103, 0x1166, 0x11BA], NFKC: [0xB383], NFKD: [0x1103, 0x1166, 0x11BA] }, +{ source: [0xB384], NFC: [0xB384], NFD: [0x1103, 0x1166, 0x11BB], NFKC: [0xB384], NFKD: [0x1103, 0x1166, 0x11BB] }, +{ source: [0xB385], NFC: [0xB385], NFD: [0x1103, 0x1166, 0x11BC], NFKC: [0xB385], NFKD: [0x1103, 0x1166, 0x11BC] }, +{ source: [0xB386], NFC: [0xB386], NFD: [0x1103, 0x1166, 0x11BD], NFKC: [0xB386], NFKD: [0x1103, 0x1166, 0x11BD] }, +{ source: [0xB387], NFC: [0xB387], NFD: [0x1103, 0x1166, 0x11BE], NFKC: [0xB387], NFKD: [0x1103, 0x1166, 0x11BE] }, +{ source: [0xB388], NFC: [0xB388], NFD: [0x1103, 0x1166, 0x11BF], NFKC: [0xB388], NFKD: [0x1103, 0x1166, 0x11BF] }, +{ source: [0xB389], NFC: [0xB389], NFD: [0x1103, 0x1166, 0x11C0], NFKC: [0xB389], NFKD: [0x1103, 0x1166, 0x11C0] }, +{ source: [0xB38A], NFC: [0xB38A], NFD: [0x1103, 0x1166, 0x11C1], NFKC: [0xB38A], NFKD: [0x1103, 0x1166, 0x11C1] }, +{ source: [0xB38B], NFC: [0xB38B], NFD: [0x1103, 0x1166, 0x11C2], NFKC: [0xB38B], NFKD: [0x1103, 0x1166, 0x11C2] }, +{ source: [0xB38C], NFC: [0xB38C], NFD: [0x1103, 0x1167], NFKC: [0xB38C], NFKD: [0x1103, 0x1167] }, +{ source: [0xB38D], NFC: [0xB38D], NFD: [0x1103, 0x1167, 0x11A8], NFKC: [0xB38D], NFKD: [0x1103, 0x1167, 0x11A8] }, +{ source: [0xB38E], NFC: [0xB38E], NFD: [0x1103, 0x1167, 0x11A9], NFKC: [0xB38E], NFKD: [0x1103, 0x1167, 0x11A9] }, +{ source: [0xB38F], NFC: [0xB38F], NFD: [0x1103, 0x1167, 0x11AA], NFKC: [0xB38F], NFKD: [0x1103, 0x1167, 0x11AA] }, +{ source: [0xB390], NFC: [0xB390], NFD: [0x1103, 0x1167, 0x11AB], NFKC: [0xB390], NFKD: [0x1103, 0x1167, 0x11AB] }, +{ source: [0xB391], NFC: [0xB391], NFD: [0x1103, 0x1167, 0x11AC], NFKC: [0xB391], NFKD: [0x1103, 0x1167, 0x11AC] }, +{ source: [0xB392], NFC: [0xB392], NFD: [0x1103, 0x1167, 0x11AD], NFKC: [0xB392], NFKD: [0x1103, 0x1167, 0x11AD] }, +{ source: [0xB393], NFC: [0xB393], NFD: [0x1103, 0x1167, 0x11AE], NFKC: [0xB393], NFKD: [0x1103, 0x1167, 0x11AE] }, +{ source: [0xB394], NFC: [0xB394], NFD: [0x1103, 0x1167, 0x11AF], NFKC: [0xB394], NFKD: [0x1103, 0x1167, 0x11AF] }, +{ source: [0xB395], NFC: [0xB395], NFD: [0x1103, 0x1167, 0x11B0], NFKC: [0xB395], NFKD: [0x1103, 0x1167, 0x11B0] }, +{ source: [0xB396], NFC: [0xB396], NFD: [0x1103, 0x1167, 0x11B1], NFKC: [0xB396], NFKD: [0x1103, 0x1167, 0x11B1] }, +{ source: [0xB397], NFC: [0xB397], NFD: [0x1103, 0x1167, 0x11B2], NFKC: [0xB397], NFKD: [0x1103, 0x1167, 0x11B2] }, +{ source: [0xB398], NFC: [0xB398], NFD: [0x1103, 0x1167, 0x11B3], NFKC: [0xB398], NFKD: [0x1103, 0x1167, 0x11B3] }, +{ source: [0xB399], NFC: [0xB399], NFD: [0x1103, 0x1167, 0x11B4], NFKC: [0xB399], NFKD: [0x1103, 0x1167, 0x11B4] }, +{ source: [0xB39A], NFC: [0xB39A], NFD: [0x1103, 0x1167, 0x11B5], NFKC: [0xB39A], NFKD: [0x1103, 0x1167, 0x11B5] }, +{ source: [0xB39B], NFC: [0xB39B], NFD: [0x1103, 0x1167, 0x11B6], NFKC: [0xB39B], NFKD: [0x1103, 0x1167, 0x11B6] }, +{ source: [0xB39C], NFC: [0xB39C], NFD: [0x1103, 0x1167, 0x11B7], NFKC: [0xB39C], NFKD: [0x1103, 0x1167, 0x11B7] }, +{ source: [0xB39D], NFC: [0xB39D], NFD: [0x1103, 0x1167, 0x11B8], NFKC: [0xB39D], NFKD: [0x1103, 0x1167, 0x11B8] }, +{ source: [0xB39E], NFC: [0xB39E], NFD: [0x1103, 0x1167, 0x11B9], NFKC: [0xB39E], NFKD: [0x1103, 0x1167, 0x11B9] }, +{ source: [0xB39F], NFC: [0xB39F], NFD: [0x1103, 0x1167, 0x11BA], NFKC: [0xB39F], NFKD: [0x1103, 0x1167, 0x11BA] }, +{ source: [0xB3A0], NFC: [0xB3A0], NFD: [0x1103, 0x1167, 0x11BB], NFKC: [0xB3A0], NFKD: [0x1103, 0x1167, 0x11BB] }, +{ source: [0xB3A1], NFC: [0xB3A1], NFD: [0x1103, 0x1167, 0x11BC], NFKC: [0xB3A1], NFKD: [0x1103, 0x1167, 0x11BC] }, +{ source: [0xB3A2], NFC: [0xB3A2], NFD: [0x1103, 0x1167, 0x11BD], NFKC: [0xB3A2], NFKD: [0x1103, 0x1167, 0x11BD] }, +{ source: [0xB3A3], NFC: [0xB3A3], NFD: [0x1103, 0x1167, 0x11BE], NFKC: [0xB3A3], NFKD: [0x1103, 0x1167, 0x11BE] }, +{ source: [0xB3A4], NFC: [0xB3A4], NFD: [0x1103, 0x1167, 0x11BF], NFKC: [0xB3A4], NFKD: [0x1103, 0x1167, 0x11BF] }, +{ source: [0xB3A5], NFC: [0xB3A5], NFD: [0x1103, 0x1167, 0x11C0], NFKC: [0xB3A5], NFKD: [0x1103, 0x1167, 0x11C0] }, +{ source: [0xB3A6], NFC: [0xB3A6], NFD: [0x1103, 0x1167, 0x11C1], NFKC: [0xB3A6], NFKD: [0x1103, 0x1167, 0x11C1] }, +{ source: [0xB3A7], NFC: [0xB3A7], NFD: [0x1103, 0x1167, 0x11C2], NFKC: [0xB3A7], NFKD: [0x1103, 0x1167, 0x11C2] }, +{ source: [0xB3A8], NFC: [0xB3A8], NFD: [0x1103, 0x1168], NFKC: [0xB3A8], NFKD: [0x1103, 0x1168] }, +{ source: [0xB3A9], NFC: [0xB3A9], NFD: [0x1103, 0x1168, 0x11A8], NFKC: [0xB3A9], NFKD: [0x1103, 0x1168, 0x11A8] }, +{ source: [0xB3AA], NFC: [0xB3AA], NFD: [0x1103, 0x1168, 0x11A9], NFKC: [0xB3AA], NFKD: [0x1103, 0x1168, 0x11A9] }, +{ source: [0xB3AB], NFC: [0xB3AB], NFD: [0x1103, 0x1168, 0x11AA], NFKC: [0xB3AB], NFKD: [0x1103, 0x1168, 0x11AA] }, +{ source: [0xB3AC], NFC: [0xB3AC], NFD: [0x1103, 0x1168, 0x11AB], NFKC: [0xB3AC], NFKD: [0x1103, 0x1168, 0x11AB] }, +{ source: [0xB3AD], NFC: [0xB3AD], NFD: [0x1103, 0x1168, 0x11AC], NFKC: [0xB3AD], NFKD: [0x1103, 0x1168, 0x11AC] }, +{ source: [0xB3AE], NFC: [0xB3AE], NFD: [0x1103, 0x1168, 0x11AD], NFKC: [0xB3AE], NFKD: [0x1103, 0x1168, 0x11AD] }, +{ source: [0xB3AF], NFC: [0xB3AF], NFD: [0x1103, 0x1168, 0x11AE], NFKC: [0xB3AF], NFKD: [0x1103, 0x1168, 0x11AE] }, +{ source: [0xB3B0], NFC: [0xB3B0], NFD: [0x1103, 0x1168, 0x11AF], NFKC: [0xB3B0], NFKD: [0x1103, 0x1168, 0x11AF] }, +{ source: [0xB3B1], NFC: [0xB3B1], NFD: [0x1103, 0x1168, 0x11B0], NFKC: [0xB3B1], NFKD: [0x1103, 0x1168, 0x11B0] }, +{ source: [0xB3B2], NFC: [0xB3B2], NFD: [0x1103, 0x1168, 0x11B1], NFKC: [0xB3B2], NFKD: [0x1103, 0x1168, 0x11B1] }, +{ source: [0xB3B3], NFC: [0xB3B3], NFD: [0x1103, 0x1168, 0x11B2], NFKC: [0xB3B3], NFKD: [0x1103, 0x1168, 0x11B2] }, +{ source: [0xB3B4], NFC: [0xB3B4], NFD: [0x1103, 0x1168, 0x11B3], NFKC: [0xB3B4], NFKD: [0x1103, 0x1168, 0x11B3] }, +{ source: [0xB3B5], NFC: [0xB3B5], NFD: [0x1103, 0x1168, 0x11B4], NFKC: [0xB3B5], NFKD: [0x1103, 0x1168, 0x11B4] }, +{ source: [0xB3B6], NFC: [0xB3B6], NFD: [0x1103, 0x1168, 0x11B5], NFKC: [0xB3B6], NFKD: [0x1103, 0x1168, 0x11B5] }, +{ source: [0xB3B7], NFC: [0xB3B7], NFD: [0x1103, 0x1168, 0x11B6], NFKC: [0xB3B7], NFKD: [0x1103, 0x1168, 0x11B6] }, +{ source: [0xB3B8], NFC: [0xB3B8], NFD: [0x1103, 0x1168, 0x11B7], NFKC: [0xB3B8], NFKD: [0x1103, 0x1168, 0x11B7] }, +{ source: [0xB3B9], NFC: [0xB3B9], NFD: [0x1103, 0x1168, 0x11B8], NFKC: [0xB3B9], NFKD: [0x1103, 0x1168, 0x11B8] }, +{ source: [0xB3BA], NFC: [0xB3BA], NFD: [0x1103, 0x1168, 0x11B9], NFKC: [0xB3BA], NFKD: [0x1103, 0x1168, 0x11B9] }, +{ source: [0xB3BB], NFC: [0xB3BB], NFD: [0x1103, 0x1168, 0x11BA], NFKC: [0xB3BB], NFKD: [0x1103, 0x1168, 0x11BA] }, +{ source: [0xB3BC], NFC: [0xB3BC], NFD: [0x1103, 0x1168, 0x11BB], NFKC: [0xB3BC], NFKD: [0x1103, 0x1168, 0x11BB] }, +{ source: [0xB3BD], NFC: [0xB3BD], NFD: [0x1103, 0x1168, 0x11BC], NFKC: [0xB3BD], NFKD: [0x1103, 0x1168, 0x11BC] }, +{ source: [0xB3BE], NFC: [0xB3BE], NFD: [0x1103, 0x1168, 0x11BD], NFKC: [0xB3BE], NFKD: [0x1103, 0x1168, 0x11BD] }, +{ source: [0xB3BF], NFC: [0xB3BF], NFD: [0x1103, 0x1168, 0x11BE], NFKC: [0xB3BF], NFKD: [0x1103, 0x1168, 0x11BE] }, +{ source: [0xB3C0], NFC: [0xB3C0], NFD: [0x1103, 0x1168, 0x11BF], NFKC: [0xB3C0], NFKD: [0x1103, 0x1168, 0x11BF] }, +{ source: [0xB3C1], NFC: [0xB3C1], NFD: [0x1103, 0x1168, 0x11C0], NFKC: [0xB3C1], NFKD: [0x1103, 0x1168, 0x11C0] }, +{ source: [0xB3C2], NFC: [0xB3C2], NFD: [0x1103, 0x1168, 0x11C1], NFKC: [0xB3C2], NFKD: [0x1103, 0x1168, 0x11C1] }, +{ source: [0xB3C3], NFC: [0xB3C3], NFD: [0x1103, 0x1168, 0x11C2], NFKC: [0xB3C3], NFKD: [0x1103, 0x1168, 0x11C2] }, +{ source: [0xB3C4], NFC: [0xB3C4], NFD: [0x1103, 0x1169], NFKC: [0xB3C4], NFKD: [0x1103, 0x1169] }, +{ source: [0xB3C5], NFC: [0xB3C5], NFD: [0x1103, 0x1169, 0x11A8], NFKC: [0xB3C5], NFKD: [0x1103, 0x1169, 0x11A8] }, +{ source: [0xB3C6], NFC: [0xB3C6], NFD: [0x1103, 0x1169, 0x11A9], NFKC: [0xB3C6], NFKD: [0x1103, 0x1169, 0x11A9] }, +{ source: [0xB3C7], NFC: [0xB3C7], NFD: [0x1103, 0x1169, 0x11AA], NFKC: [0xB3C7], NFKD: [0x1103, 0x1169, 0x11AA] }, +{ source: [0xB3C8], NFC: [0xB3C8], NFD: [0x1103, 0x1169, 0x11AB], NFKC: [0xB3C8], NFKD: [0x1103, 0x1169, 0x11AB] }, +{ source: [0xB3C9], NFC: [0xB3C9], NFD: [0x1103, 0x1169, 0x11AC], NFKC: [0xB3C9], NFKD: [0x1103, 0x1169, 0x11AC] }, +{ source: [0xB3CA], NFC: [0xB3CA], NFD: [0x1103, 0x1169, 0x11AD], NFKC: [0xB3CA], NFKD: [0x1103, 0x1169, 0x11AD] }, +{ source: [0xB3CB], NFC: [0xB3CB], NFD: [0x1103, 0x1169, 0x11AE], NFKC: [0xB3CB], NFKD: [0x1103, 0x1169, 0x11AE] }, +{ source: [0xB3CC], NFC: [0xB3CC], NFD: [0x1103, 0x1169, 0x11AF], NFKC: [0xB3CC], NFKD: [0x1103, 0x1169, 0x11AF] }, +{ source: [0xB3CD], NFC: [0xB3CD], NFD: [0x1103, 0x1169, 0x11B0], NFKC: [0xB3CD], NFKD: [0x1103, 0x1169, 0x11B0] }, +{ source: [0xB3CE], NFC: [0xB3CE], NFD: [0x1103, 0x1169, 0x11B1], NFKC: [0xB3CE], NFKD: [0x1103, 0x1169, 0x11B1] }, +{ source: [0xB3CF], NFC: [0xB3CF], NFD: [0x1103, 0x1169, 0x11B2], NFKC: [0xB3CF], NFKD: [0x1103, 0x1169, 0x11B2] }, +{ source: [0xB3D0], NFC: [0xB3D0], NFD: [0x1103, 0x1169, 0x11B3], NFKC: [0xB3D0], NFKD: [0x1103, 0x1169, 0x11B3] }, +{ source: [0xB3D1], NFC: [0xB3D1], NFD: [0x1103, 0x1169, 0x11B4], NFKC: [0xB3D1], NFKD: [0x1103, 0x1169, 0x11B4] }, +{ source: [0xB3D2], NFC: [0xB3D2], NFD: [0x1103, 0x1169, 0x11B5], NFKC: [0xB3D2], NFKD: [0x1103, 0x1169, 0x11B5] }, +{ source: [0xB3D3], NFC: [0xB3D3], NFD: [0x1103, 0x1169, 0x11B6], NFKC: [0xB3D3], NFKD: [0x1103, 0x1169, 0x11B6] }, +{ source: [0xB3D4], NFC: [0xB3D4], NFD: [0x1103, 0x1169, 0x11B7], NFKC: [0xB3D4], NFKD: [0x1103, 0x1169, 0x11B7] }, +{ source: [0xB3D5], NFC: [0xB3D5], NFD: [0x1103, 0x1169, 0x11B8], NFKC: [0xB3D5], NFKD: [0x1103, 0x1169, 0x11B8] }, +{ source: [0xB3D6], NFC: [0xB3D6], NFD: [0x1103, 0x1169, 0x11B9], NFKC: [0xB3D6], NFKD: [0x1103, 0x1169, 0x11B9] }, +{ source: [0xB3D7], NFC: [0xB3D7], NFD: [0x1103, 0x1169, 0x11BA], NFKC: [0xB3D7], NFKD: [0x1103, 0x1169, 0x11BA] }, +{ source: [0xB3D8], NFC: [0xB3D8], NFD: [0x1103, 0x1169, 0x11BB], NFKC: [0xB3D8], NFKD: [0x1103, 0x1169, 0x11BB] }, +{ source: [0xB3D9], NFC: [0xB3D9], NFD: [0x1103, 0x1169, 0x11BC], NFKC: [0xB3D9], NFKD: [0x1103, 0x1169, 0x11BC] }, +{ source: [0xB3DA], NFC: [0xB3DA], NFD: [0x1103, 0x1169, 0x11BD], NFKC: [0xB3DA], NFKD: [0x1103, 0x1169, 0x11BD] }, +{ source: [0xB3DB], NFC: [0xB3DB], NFD: [0x1103, 0x1169, 0x11BE], NFKC: [0xB3DB], NFKD: [0x1103, 0x1169, 0x11BE] }, +{ source: [0xB3DC], NFC: [0xB3DC], NFD: [0x1103, 0x1169, 0x11BF], NFKC: [0xB3DC], NFKD: [0x1103, 0x1169, 0x11BF] }, +{ source: [0xB3DD], NFC: [0xB3DD], NFD: [0x1103, 0x1169, 0x11C0], NFKC: [0xB3DD], NFKD: [0x1103, 0x1169, 0x11C0] }, +{ source: [0xB3DE], NFC: [0xB3DE], NFD: [0x1103, 0x1169, 0x11C1], NFKC: [0xB3DE], NFKD: [0x1103, 0x1169, 0x11C1] }, +{ source: [0xB3DF], NFC: [0xB3DF], NFD: [0x1103, 0x1169, 0x11C2], NFKC: [0xB3DF], NFKD: [0x1103, 0x1169, 0x11C2] }, +{ source: [0xB3E0], NFC: [0xB3E0], NFD: [0x1103, 0x116A], NFKC: [0xB3E0], NFKD: [0x1103, 0x116A] }, +{ source: [0xB3E1], NFC: [0xB3E1], NFD: [0x1103, 0x116A, 0x11A8], NFKC: [0xB3E1], NFKD: [0x1103, 0x116A, 0x11A8] }, +{ source: [0xB3E2], NFC: [0xB3E2], NFD: [0x1103, 0x116A, 0x11A9], NFKC: [0xB3E2], NFKD: [0x1103, 0x116A, 0x11A9] }, +{ source: [0xB3E3], NFC: [0xB3E3], NFD: [0x1103, 0x116A, 0x11AA], NFKC: [0xB3E3], NFKD: [0x1103, 0x116A, 0x11AA] }, +{ source: [0xB3E4], NFC: [0xB3E4], NFD: [0x1103, 0x116A, 0x11AB], NFKC: [0xB3E4], NFKD: [0x1103, 0x116A, 0x11AB] }, +{ source: [0xB3E5], NFC: [0xB3E5], NFD: [0x1103, 0x116A, 0x11AC], NFKC: [0xB3E5], NFKD: [0x1103, 0x116A, 0x11AC] }, +{ source: [0xB3E6], NFC: [0xB3E6], NFD: [0x1103, 0x116A, 0x11AD], NFKC: [0xB3E6], NFKD: [0x1103, 0x116A, 0x11AD] }, +{ source: [0xB3E7], NFC: [0xB3E7], NFD: [0x1103, 0x116A, 0x11AE], NFKC: [0xB3E7], NFKD: [0x1103, 0x116A, 0x11AE] }, +{ source: [0xB3E8], NFC: [0xB3E8], NFD: [0x1103, 0x116A, 0x11AF], NFKC: [0xB3E8], NFKD: [0x1103, 0x116A, 0x11AF] }, +{ source: [0xB3E9], NFC: [0xB3E9], NFD: [0x1103, 0x116A, 0x11B0], NFKC: [0xB3E9], NFKD: [0x1103, 0x116A, 0x11B0] }, +{ source: [0xB3EA], NFC: [0xB3EA], NFD: [0x1103, 0x116A, 0x11B1], NFKC: [0xB3EA], NFKD: [0x1103, 0x116A, 0x11B1] }, +{ source: [0xB3EB], NFC: [0xB3EB], NFD: [0x1103, 0x116A, 0x11B2], NFKC: [0xB3EB], NFKD: [0x1103, 0x116A, 0x11B2] }, +{ source: [0xB3EC], NFC: [0xB3EC], NFD: [0x1103, 0x116A, 0x11B3], NFKC: [0xB3EC], NFKD: [0x1103, 0x116A, 0x11B3] }, +{ source: [0xB3ED], NFC: [0xB3ED], NFD: [0x1103, 0x116A, 0x11B4], NFKC: [0xB3ED], NFKD: [0x1103, 0x116A, 0x11B4] }, +{ source: [0xB3EE], NFC: [0xB3EE], NFD: [0x1103, 0x116A, 0x11B5], NFKC: [0xB3EE], NFKD: [0x1103, 0x116A, 0x11B5] }, +{ source: [0xB3EF], NFC: [0xB3EF], NFD: [0x1103, 0x116A, 0x11B6], NFKC: [0xB3EF], NFKD: [0x1103, 0x116A, 0x11B6] }, +{ source: [0xB3F0], NFC: [0xB3F0], NFD: [0x1103, 0x116A, 0x11B7], NFKC: [0xB3F0], NFKD: [0x1103, 0x116A, 0x11B7] }, +{ source: [0xB3F1], NFC: [0xB3F1], NFD: [0x1103, 0x116A, 0x11B8], NFKC: [0xB3F1], NFKD: [0x1103, 0x116A, 0x11B8] }, +{ source: [0xB3F2], NFC: [0xB3F2], NFD: [0x1103, 0x116A, 0x11B9], NFKC: [0xB3F2], NFKD: [0x1103, 0x116A, 0x11B9] }, +{ source: [0xB3F3], NFC: [0xB3F3], NFD: [0x1103, 0x116A, 0x11BA], NFKC: [0xB3F3], NFKD: [0x1103, 0x116A, 0x11BA] }, +{ source: [0xB3F4], NFC: [0xB3F4], NFD: [0x1103, 0x116A, 0x11BB], NFKC: [0xB3F4], NFKD: [0x1103, 0x116A, 0x11BB] }, +{ source: [0xB3F5], NFC: [0xB3F5], NFD: [0x1103, 0x116A, 0x11BC], NFKC: [0xB3F5], NFKD: [0x1103, 0x116A, 0x11BC] }, +{ source: [0xB3F6], NFC: [0xB3F6], NFD: [0x1103, 0x116A, 0x11BD], NFKC: [0xB3F6], NFKD: [0x1103, 0x116A, 0x11BD] }, +{ source: [0xB3F7], NFC: [0xB3F7], NFD: [0x1103, 0x116A, 0x11BE], NFKC: [0xB3F7], NFKD: [0x1103, 0x116A, 0x11BE] }, +{ source: [0xB3F8], NFC: [0xB3F8], NFD: [0x1103, 0x116A, 0x11BF], NFKC: [0xB3F8], NFKD: [0x1103, 0x116A, 0x11BF] }, +{ source: [0xB3F9], NFC: [0xB3F9], NFD: [0x1103, 0x116A, 0x11C0], NFKC: [0xB3F9], NFKD: [0x1103, 0x116A, 0x11C0] }, +{ source: [0xB3FA], NFC: [0xB3FA], NFD: [0x1103, 0x116A, 0x11C1], NFKC: [0xB3FA], NFKD: [0x1103, 0x116A, 0x11C1] }, +{ source: [0xB3FB], NFC: [0xB3FB], NFD: [0x1103, 0x116A, 0x11C2], NFKC: [0xB3FB], NFKD: [0x1103, 0x116A, 0x11C2] }, +{ source: [0xB3FC], NFC: [0xB3FC], NFD: [0x1103, 0x116B], NFKC: [0xB3FC], NFKD: [0x1103, 0x116B] }, +{ source: [0xB3FD], NFC: [0xB3FD], NFD: [0x1103, 0x116B, 0x11A8], NFKC: [0xB3FD], NFKD: [0x1103, 0x116B, 0x11A8] }, +{ source: [0xB3FE], NFC: [0xB3FE], NFD: [0x1103, 0x116B, 0x11A9], NFKC: [0xB3FE], NFKD: [0x1103, 0x116B, 0x11A9] }, +{ source: [0xB3FF], NFC: [0xB3FF], NFD: [0x1103, 0x116B, 0x11AA], NFKC: [0xB3FF], NFKD: [0x1103, 0x116B, 0x11AA] }, +{ source: [0xB400], NFC: [0xB400], NFD: [0x1103, 0x116B, 0x11AB], NFKC: [0xB400], NFKD: [0x1103, 0x116B, 0x11AB] }, +{ source: [0xB401], NFC: [0xB401], NFD: [0x1103, 0x116B, 0x11AC], NFKC: [0xB401], NFKD: [0x1103, 0x116B, 0x11AC] }, +{ source: [0xB402], NFC: [0xB402], NFD: [0x1103, 0x116B, 0x11AD], NFKC: [0xB402], NFKD: [0x1103, 0x116B, 0x11AD] }, +{ source: [0xB403], NFC: [0xB403], NFD: [0x1103, 0x116B, 0x11AE], NFKC: [0xB403], NFKD: [0x1103, 0x116B, 0x11AE] }, +{ source: [0xB404], NFC: [0xB404], NFD: [0x1103, 0x116B, 0x11AF], NFKC: [0xB404], NFKD: [0x1103, 0x116B, 0x11AF] }, +{ source: [0xB405], NFC: [0xB405], NFD: [0x1103, 0x116B, 0x11B0], NFKC: [0xB405], NFKD: [0x1103, 0x116B, 0x11B0] }, +{ source: [0xB406], NFC: [0xB406], NFD: [0x1103, 0x116B, 0x11B1], NFKC: [0xB406], NFKD: [0x1103, 0x116B, 0x11B1] }, +{ source: [0xB407], NFC: [0xB407], NFD: [0x1103, 0x116B, 0x11B2], NFKC: [0xB407], NFKD: [0x1103, 0x116B, 0x11B2] }, +{ source: [0xB408], NFC: [0xB408], NFD: [0x1103, 0x116B, 0x11B3], NFKC: [0xB408], NFKD: [0x1103, 0x116B, 0x11B3] }, +{ source: [0xB409], NFC: [0xB409], NFD: [0x1103, 0x116B, 0x11B4], NFKC: [0xB409], NFKD: [0x1103, 0x116B, 0x11B4] }, +{ source: [0xB40A], NFC: [0xB40A], NFD: [0x1103, 0x116B, 0x11B5], NFKC: [0xB40A], NFKD: [0x1103, 0x116B, 0x11B5] }, +{ source: [0xB40B], NFC: [0xB40B], NFD: [0x1103, 0x116B, 0x11B6], NFKC: [0xB40B], NFKD: [0x1103, 0x116B, 0x11B6] }, +{ source: [0xB40C], NFC: [0xB40C], NFD: [0x1103, 0x116B, 0x11B7], NFKC: [0xB40C], NFKD: [0x1103, 0x116B, 0x11B7] }, +{ source: [0xB40D], NFC: [0xB40D], NFD: [0x1103, 0x116B, 0x11B8], NFKC: [0xB40D], NFKD: [0x1103, 0x116B, 0x11B8] }, +{ source: [0xB40E], NFC: [0xB40E], NFD: [0x1103, 0x116B, 0x11B9], NFKC: [0xB40E], NFKD: [0x1103, 0x116B, 0x11B9] }, +{ source: [0xB40F], NFC: [0xB40F], NFD: [0x1103, 0x116B, 0x11BA], NFKC: [0xB40F], NFKD: [0x1103, 0x116B, 0x11BA] }, +{ source: [0xB410], NFC: [0xB410], NFD: [0x1103, 0x116B, 0x11BB], NFKC: [0xB410], NFKD: [0x1103, 0x116B, 0x11BB] }, +{ source: [0xB411], NFC: [0xB411], NFD: [0x1103, 0x116B, 0x11BC], NFKC: [0xB411], NFKD: [0x1103, 0x116B, 0x11BC] }, +{ source: [0xB412], NFC: [0xB412], NFD: [0x1103, 0x116B, 0x11BD], NFKC: [0xB412], NFKD: [0x1103, 0x116B, 0x11BD] }, +{ source: [0xB413], NFC: [0xB413], NFD: [0x1103, 0x116B, 0x11BE], NFKC: [0xB413], NFKD: [0x1103, 0x116B, 0x11BE] }, +{ source: [0xB414], NFC: [0xB414], NFD: [0x1103, 0x116B, 0x11BF], NFKC: [0xB414], NFKD: [0x1103, 0x116B, 0x11BF] }, +{ source: [0xB415], NFC: [0xB415], NFD: [0x1103, 0x116B, 0x11C0], NFKC: [0xB415], NFKD: [0x1103, 0x116B, 0x11C0] }, +{ source: [0xB416], NFC: [0xB416], NFD: [0x1103, 0x116B, 0x11C1], NFKC: [0xB416], NFKD: [0x1103, 0x116B, 0x11C1] }, +{ source: [0xB417], NFC: [0xB417], NFD: [0x1103, 0x116B, 0x11C2], NFKC: [0xB417], NFKD: [0x1103, 0x116B, 0x11C2] }, +{ source: [0xB418], NFC: [0xB418], NFD: [0x1103, 0x116C], NFKC: [0xB418], NFKD: [0x1103, 0x116C] }, +{ source: [0xB419], NFC: [0xB419], NFD: [0x1103, 0x116C, 0x11A8], NFKC: [0xB419], NFKD: [0x1103, 0x116C, 0x11A8] }, +{ source: [0xB41A], NFC: [0xB41A], NFD: [0x1103, 0x116C, 0x11A9], NFKC: [0xB41A], NFKD: [0x1103, 0x116C, 0x11A9] }, +{ source: [0xB41B], NFC: [0xB41B], NFD: [0x1103, 0x116C, 0x11AA], NFKC: [0xB41B], NFKD: [0x1103, 0x116C, 0x11AA] }, +{ source: [0xB41C], NFC: [0xB41C], NFD: [0x1103, 0x116C, 0x11AB], NFKC: [0xB41C], NFKD: [0x1103, 0x116C, 0x11AB] }, +{ source: [0xB41D], NFC: [0xB41D], NFD: [0x1103, 0x116C, 0x11AC], NFKC: [0xB41D], NFKD: [0x1103, 0x116C, 0x11AC] }, +{ source: [0xB41E], NFC: [0xB41E], NFD: [0x1103, 0x116C, 0x11AD], NFKC: [0xB41E], NFKD: [0x1103, 0x116C, 0x11AD] }, +{ source: [0xB41F], NFC: [0xB41F], NFD: [0x1103, 0x116C, 0x11AE], NFKC: [0xB41F], NFKD: [0x1103, 0x116C, 0x11AE] }, +{ source: [0xB420], NFC: [0xB420], NFD: [0x1103, 0x116C, 0x11AF], NFKC: [0xB420], NFKD: [0x1103, 0x116C, 0x11AF] }, +{ source: [0xB421], NFC: [0xB421], NFD: [0x1103, 0x116C, 0x11B0], NFKC: [0xB421], NFKD: [0x1103, 0x116C, 0x11B0] }, +{ source: [0xB422], NFC: [0xB422], NFD: [0x1103, 0x116C, 0x11B1], NFKC: [0xB422], NFKD: [0x1103, 0x116C, 0x11B1] }, +{ source: [0xB423], NFC: [0xB423], NFD: [0x1103, 0x116C, 0x11B2], NFKC: [0xB423], NFKD: [0x1103, 0x116C, 0x11B2] }, +{ source: [0xB424], NFC: [0xB424], NFD: [0x1103, 0x116C, 0x11B3], NFKC: [0xB424], NFKD: [0x1103, 0x116C, 0x11B3] }, +{ source: [0xB425], NFC: [0xB425], NFD: [0x1103, 0x116C, 0x11B4], NFKC: [0xB425], NFKD: [0x1103, 0x116C, 0x11B4] }, +{ source: [0xB426], NFC: [0xB426], NFD: [0x1103, 0x116C, 0x11B5], NFKC: [0xB426], NFKD: [0x1103, 0x116C, 0x11B5] }, +{ source: [0xB427], NFC: [0xB427], NFD: [0x1103, 0x116C, 0x11B6], NFKC: [0xB427], NFKD: [0x1103, 0x116C, 0x11B6] }, +{ source: [0xB428], NFC: [0xB428], NFD: [0x1103, 0x116C, 0x11B7], NFKC: [0xB428], NFKD: [0x1103, 0x116C, 0x11B7] }, +{ source: [0xB429], NFC: [0xB429], NFD: [0x1103, 0x116C, 0x11B8], NFKC: [0xB429], NFKD: [0x1103, 0x116C, 0x11B8] }, +{ source: [0xB42A], NFC: [0xB42A], NFD: [0x1103, 0x116C, 0x11B9], NFKC: [0xB42A], NFKD: [0x1103, 0x116C, 0x11B9] }, +{ source: [0xB42B], NFC: [0xB42B], NFD: [0x1103, 0x116C, 0x11BA], NFKC: [0xB42B], NFKD: [0x1103, 0x116C, 0x11BA] }, +{ source: [0xB42C], NFC: [0xB42C], NFD: [0x1103, 0x116C, 0x11BB], NFKC: [0xB42C], NFKD: [0x1103, 0x116C, 0x11BB] }, +{ source: [0xB42D], NFC: [0xB42D], NFD: [0x1103, 0x116C, 0x11BC], NFKC: [0xB42D], NFKD: [0x1103, 0x116C, 0x11BC] }, +{ source: [0xB42E], NFC: [0xB42E], NFD: [0x1103, 0x116C, 0x11BD], NFKC: [0xB42E], NFKD: [0x1103, 0x116C, 0x11BD] }, +{ source: [0xB42F], NFC: [0xB42F], NFD: [0x1103, 0x116C, 0x11BE], NFKC: [0xB42F], NFKD: [0x1103, 0x116C, 0x11BE] }, +{ source: [0xB430], NFC: [0xB430], NFD: [0x1103, 0x116C, 0x11BF], NFKC: [0xB430], NFKD: [0x1103, 0x116C, 0x11BF] }, +{ source: [0xB431], NFC: [0xB431], NFD: [0x1103, 0x116C, 0x11C0], NFKC: [0xB431], NFKD: [0x1103, 0x116C, 0x11C0] }, +{ source: [0xB432], NFC: [0xB432], NFD: [0x1103, 0x116C, 0x11C1], NFKC: [0xB432], NFKD: [0x1103, 0x116C, 0x11C1] }, +{ source: [0xB433], NFC: [0xB433], NFD: [0x1103, 0x116C, 0x11C2], NFKC: [0xB433], NFKD: [0x1103, 0x116C, 0x11C2] }, +{ source: [0xB434], NFC: [0xB434], NFD: [0x1103, 0x116D], NFKC: [0xB434], NFKD: [0x1103, 0x116D] }, +{ source: [0xB435], NFC: [0xB435], NFD: [0x1103, 0x116D, 0x11A8], NFKC: [0xB435], NFKD: [0x1103, 0x116D, 0x11A8] }, +{ source: [0xB436], NFC: [0xB436], NFD: [0x1103, 0x116D, 0x11A9], NFKC: [0xB436], NFKD: [0x1103, 0x116D, 0x11A9] }, +{ source: [0xB437], NFC: [0xB437], NFD: [0x1103, 0x116D, 0x11AA], NFKC: [0xB437], NFKD: [0x1103, 0x116D, 0x11AA] }, +{ source: [0xB438], NFC: [0xB438], NFD: [0x1103, 0x116D, 0x11AB], NFKC: [0xB438], NFKD: [0x1103, 0x116D, 0x11AB] }, +{ source: [0xB439], NFC: [0xB439], NFD: [0x1103, 0x116D, 0x11AC], NFKC: [0xB439], NFKD: [0x1103, 0x116D, 0x11AC] }, +{ source: [0xB43A], NFC: [0xB43A], NFD: [0x1103, 0x116D, 0x11AD], NFKC: [0xB43A], NFKD: [0x1103, 0x116D, 0x11AD] }, +{ source: [0xB43B], NFC: [0xB43B], NFD: [0x1103, 0x116D, 0x11AE], NFKC: [0xB43B], NFKD: [0x1103, 0x116D, 0x11AE] }, +{ source: [0xB43C], NFC: [0xB43C], NFD: [0x1103, 0x116D, 0x11AF], NFKC: [0xB43C], NFKD: [0x1103, 0x116D, 0x11AF] }, +{ source: [0xB43D], NFC: [0xB43D], NFD: [0x1103, 0x116D, 0x11B0], NFKC: [0xB43D], NFKD: [0x1103, 0x116D, 0x11B0] }, +{ source: [0xB43E], NFC: [0xB43E], NFD: [0x1103, 0x116D, 0x11B1], NFKC: [0xB43E], NFKD: [0x1103, 0x116D, 0x11B1] }, +{ source: [0xB43F], NFC: [0xB43F], NFD: [0x1103, 0x116D, 0x11B2], NFKC: [0xB43F], NFKD: [0x1103, 0x116D, 0x11B2] }, +{ source: [0xB440], NFC: [0xB440], NFD: [0x1103, 0x116D, 0x11B3], NFKC: [0xB440], NFKD: [0x1103, 0x116D, 0x11B3] }, +{ source: [0xB441], NFC: [0xB441], NFD: [0x1103, 0x116D, 0x11B4], NFKC: [0xB441], NFKD: [0x1103, 0x116D, 0x11B4] }, +{ source: [0xB442], NFC: [0xB442], NFD: [0x1103, 0x116D, 0x11B5], NFKC: [0xB442], NFKD: [0x1103, 0x116D, 0x11B5] }, +{ source: [0xB443], NFC: [0xB443], NFD: [0x1103, 0x116D, 0x11B6], NFKC: [0xB443], NFKD: [0x1103, 0x116D, 0x11B6] }, +{ source: [0xB444], NFC: [0xB444], NFD: [0x1103, 0x116D, 0x11B7], NFKC: [0xB444], NFKD: [0x1103, 0x116D, 0x11B7] }, +{ source: [0xB445], NFC: [0xB445], NFD: [0x1103, 0x116D, 0x11B8], NFKC: [0xB445], NFKD: [0x1103, 0x116D, 0x11B8] }, +{ source: [0xB446], NFC: [0xB446], NFD: [0x1103, 0x116D, 0x11B9], NFKC: [0xB446], NFKD: [0x1103, 0x116D, 0x11B9] }, +{ source: [0xB447], NFC: [0xB447], NFD: [0x1103, 0x116D, 0x11BA], NFKC: [0xB447], NFKD: [0x1103, 0x116D, 0x11BA] }, +{ source: [0xB448], NFC: [0xB448], NFD: [0x1103, 0x116D, 0x11BB], NFKC: [0xB448], NFKD: [0x1103, 0x116D, 0x11BB] }, +{ source: [0xB449], NFC: [0xB449], NFD: [0x1103, 0x116D, 0x11BC], NFKC: [0xB449], NFKD: [0x1103, 0x116D, 0x11BC] }, +{ source: [0xB44A], NFC: [0xB44A], NFD: [0x1103, 0x116D, 0x11BD], NFKC: [0xB44A], NFKD: [0x1103, 0x116D, 0x11BD] }, +{ source: [0xB44B], NFC: [0xB44B], NFD: [0x1103, 0x116D, 0x11BE], NFKC: [0xB44B], NFKD: [0x1103, 0x116D, 0x11BE] }, +{ source: [0xB44C], NFC: [0xB44C], NFD: [0x1103, 0x116D, 0x11BF], NFKC: [0xB44C], NFKD: [0x1103, 0x116D, 0x11BF] }, +{ source: [0xB44D], NFC: [0xB44D], NFD: [0x1103, 0x116D, 0x11C0], NFKC: [0xB44D], NFKD: [0x1103, 0x116D, 0x11C0] }, +{ source: [0xB44E], NFC: [0xB44E], NFD: [0x1103, 0x116D, 0x11C1], NFKC: [0xB44E], NFKD: [0x1103, 0x116D, 0x11C1] }, +{ source: [0xB44F], NFC: [0xB44F], NFD: [0x1103, 0x116D, 0x11C2], NFKC: [0xB44F], NFKD: [0x1103, 0x116D, 0x11C2] }, +{ source: [0xB450], NFC: [0xB450], NFD: [0x1103, 0x116E], NFKC: [0xB450], NFKD: [0x1103, 0x116E] }, +{ source: [0xB451], NFC: [0xB451], NFD: [0x1103, 0x116E, 0x11A8], NFKC: [0xB451], NFKD: [0x1103, 0x116E, 0x11A8] }, +{ source: [0xB452], NFC: [0xB452], NFD: [0x1103, 0x116E, 0x11A9], NFKC: [0xB452], NFKD: [0x1103, 0x116E, 0x11A9] }, +{ source: [0xB453], NFC: [0xB453], NFD: [0x1103, 0x116E, 0x11AA], NFKC: [0xB453], NFKD: [0x1103, 0x116E, 0x11AA] }, +{ source: [0xB454], NFC: [0xB454], NFD: [0x1103, 0x116E, 0x11AB], NFKC: [0xB454], NFKD: [0x1103, 0x116E, 0x11AB] }, +{ source: [0xB455], NFC: [0xB455], NFD: [0x1103, 0x116E, 0x11AC], NFKC: [0xB455], NFKD: [0x1103, 0x116E, 0x11AC] }, +{ source: [0xB456], NFC: [0xB456], NFD: [0x1103, 0x116E, 0x11AD], NFKC: [0xB456], NFKD: [0x1103, 0x116E, 0x11AD] }, +{ source: [0xB457], NFC: [0xB457], NFD: [0x1103, 0x116E, 0x11AE], NFKC: [0xB457], NFKD: [0x1103, 0x116E, 0x11AE] }, +{ source: [0xB458], NFC: [0xB458], NFD: [0x1103, 0x116E, 0x11AF], NFKC: [0xB458], NFKD: [0x1103, 0x116E, 0x11AF] }, +{ source: [0xB459], NFC: [0xB459], NFD: [0x1103, 0x116E, 0x11B0], NFKC: [0xB459], NFKD: [0x1103, 0x116E, 0x11B0] }, +{ source: [0xB45A], NFC: [0xB45A], NFD: [0x1103, 0x116E, 0x11B1], NFKC: [0xB45A], NFKD: [0x1103, 0x116E, 0x11B1] }, +{ source: [0xB45B], NFC: [0xB45B], NFD: [0x1103, 0x116E, 0x11B2], NFKC: [0xB45B], NFKD: [0x1103, 0x116E, 0x11B2] }, +{ source: [0xB45C], NFC: [0xB45C], NFD: [0x1103, 0x116E, 0x11B3], NFKC: [0xB45C], NFKD: [0x1103, 0x116E, 0x11B3] }, +{ source: [0xB45D], NFC: [0xB45D], NFD: [0x1103, 0x116E, 0x11B4], NFKC: [0xB45D], NFKD: [0x1103, 0x116E, 0x11B4] }, +{ source: [0xB45E], NFC: [0xB45E], NFD: [0x1103, 0x116E, 0x11B5], NFKC: [0xB45E], NFKD: [0x1103, 0x116E, 0x11B5] }, +{ source: [0xB45F], NFC: [0xB45F], NFD: [0x1103, 0x116E, 0x11B6], NFKC: [0xB45F], NFKD: [0x1103, 0x116E, 0x11B6] }, +{ source: [0xB460], NFC: [0xB460], NFD: [0x1103, 0x116E, 0x11B7], NFKC: [0xB460], NFKD: [0x1103, 0x116E, 0x11B7] }, +{ source: [0xB461], NFC: [0xB461], NFD: [0x1103, 0x116E, 0x11B8], NFKC: [0xB461], NFKD: [0x1103, 0x116E, 0x11B8] }, +{ source: [0xB462], NFC: [0xB462], NFD: [0x1103, 0x116E, 0x11B9], NFKC: [0xB462], NFKD: [0x1103, 0x116E, 0x11B9] }, +{ source: [0xB463], NFC: [0xB463], NFD: [0x1103, 0x116E, 0x11BA], NFKC: [0xB463], NFKD: [0x1103, 0x116E, 0x11BA] }, +{ source: [0xB464], NFC: [0xB464], NFD: [0x1103, 0x116E, 0x11BB], NFKC: [0xB464], NFKD: [0x1103, 0x116E, 0x11BB] }, +{ source: [0xB465], NFC: [0xB465], NFD: [0x1103, 0x116E, 0x11BC], NFKC: [0xB465], NFKD: [0x1103, 0x116E, 0x11BC] }, +{ source: [0xB466], NFC: [0xB466], NFD: [0x1103, 0x116E, 0x11BD], NFKC: [0xB466], NFKD: [0x1103, 0x116E, 0x11BD] }, +{ source: [0xB467], NFC: [0xB467], NFD: [0x1103, 0x116E, 0x11BE], NFKC: [0xB467], NFKD: [0x1103, 0x116E, 0x11BE] }, +{ source: [0xB468], NFC: [0xB468], NFD: [0x1103, 0x116E, 0x11BF], NFKC: [0xB468], NFKD: [0x1103, 0x116E, 0x11BF] }, +{ source: [0xB469], NFC: [0xB469], NFD: [0x1103, 0x116E, 0x11C0], NFKC: [0xB469], NFKD: [0x1103, 0x116E, 0x11C0] }, +{ source: [0xB46A], NFC: [0xB46A], NFD: [0x1103, 0x116E, 0x11C1], NFKC: [0xB46A], NFKD: [0x1103, 0x116E, 0x11C1] }, +{ source: [0xB46B], NFC: [0xB46B], NFD: [0x1103, 0x116E, 0x11C2], NFKC: [0xB46B], NFKD: [0x1103, 0x116E, 0x11C2] }, +{ source: [0xB46C], NFC: [0xB46C], NFD: [0x1103, 0x116F], NFKC: [0xB46C], NFKD: [0x1103, 0x116F] }, +{ source: [0xB46D], NFC: [0xB46D], NFD: [0x1103, 0x116F, 0x11A8], NFKC: [0xB46D], NFKD: [0x1103, 0x116F, 0x11A8] }, +{ source: [0xB46E], NFC: [0xB46E], NFD: [0x1103, 0x116F, 0x11A9], NFKC: [0xB46E], NFKD: [0x1103, 0x116F, 0x11A9] }, +{ source: [0xB46F], NFC: [0xB46F], NFD: [0x1103, 0x116F, 0x11AA], NFKC: [0xB46F], NFKD: [0x1103, 0x116F, 0x11AA] }, +{ source: [0xB470], NFC: [0xB470], NFD: [0x1103, 0x116F, 0x11AB], NFKC: [0xB470], NFKD: [0x1103, 0x116F, 0x11AB] }, +{ source: [0xB471], NFC: [0xB471], NFD: [0x1103, 0x116F, 0x11AC], NFKC: [0xB471], NFKD: [0x1103, 0x116F, 0x11AC] }, +{ source: [0xB472], NFC: [0xB472], NFD: [0x1103, 0x116F, 0x11AD], NFKC: [0xB472], NFKD: [0x1103, 0x116F, 0x11AD] }, +{ source: [0xB473], NFC: [0xB473], NFD: [0x1103, 0x116F, 0x11AE], NFKC: [0xB473], NFKD: [0x1103, 0x116F, 0x11AE] }, +{ source: [0xB474], NFC: [0xB474], NFD: [0x1103, 0x116F, 0x11AF], NFKC: [0xB474], NFKD: [0x1103, 0x116F, 0x11AF] }, +{ source: [0xB475], NFC: [0xB475], NFD: [0x1103, 0x116F, 0x11B0], NFKC: [0xB475], NFKD: [0x1103, 0x116F, 0x11B0] }, +{ source: [0xB476], NFC: [0xB476], NFD: [0x1103, 0x116F, 0x11B1], NFKC: [0xB476], NFKD: [0x1103, 0x116F, 0x11B1] }, +{ source: [0xB477], NFC: [0xB477], NFD: [0x1103, 0x116F, 0x11B2], NFKC: [0xB477], NFKD: [0x1103, 0x116F, 0x11B2] }, +{ source: [0xB478], NFC: [0xB478], NFD: [0x1103, 0x116F, 0x11B3], NFKC: [0xB478], NFKD: [0x1103, 0x116F, 0x11B3] }, +{ source: [0xB479], NFC: [0xB479], NFD: [0x1103, 0x116F, 0x11B4], NFKC: [0xB479], NFKD: [0x1103, 0x116F, 0x11B4] }, +{ source: [0xB47A], NFC: [0xB47A], NFD: [0x1103, 0x116F, 0x11B5], NFKC: [0xB47A], NFKD: [0x1103, 0x116F, 0x11B5] }, +{ source: [0xB47B], NFC: [0xB47B], NFD: [0x1103, 0x116F, 0x11B6], NFKC: [0xB47B], NFKD: [0x1103, 0x116F, 0x11B6] }, +{ source: [0xB47C], NFC: [0xB47C], NFD: [0x1103, 0x116F, 0x11B7], NFKC: [0xB47C], NFKD: [0x1103, 0x116F, 0x11B7] }, +{ source: [0xB47D], NFC: [0xB47D], NFD: [0x1103, 0x116F, 0x11B8], NFKC: [0xB47D], NFKD: [0x1103, 0x116F, 0x11B8] }, +{ source: [0xB47E], NFC: [0xB47E], NFD: [0x1103, 0x116F, 0x11B9], NFKC: [0xB47E], NFKD: [0x1103, 0x116F, 0x11B9] }, +{ source: [0xB47F], NFC: [0xB47F], NFD: [0x1103, 0x116F, 0x11BA], NFKC: [0xB47F], NFKD: [0x1103, 0x116F, 0x11BA] }, +{ source: [0xB480], NFC: [0xB480], NFD: [0x1103, 0x116F, 0x11BB], NFKC: [0xB480], NFKD: [0x1103, 0x116F, 0x11BB] }, +{ source: [0xB481], NFC: [0xB481], NFD: [0x1103, 0x116F, 0x11BC], NFKC: [0xB481], NFKD: [0x1103, 0x116F, 0x11BC] }, +{ source: [0xB482], NFC: [0xB482], NFD: [0x1103, 0x116F, 0x11BD], NFKC: [0xB482], NFKD: [0x1103, 0x116F, 0x11BD] }, +{ source: [0xB483], NFC: [0xB483], NFD: [0x1103, 0x116F, 0x11BE], NFKC: [0xB483], NFKD: [0x1103, 0x116F, 0x11BE] }, +{ source: [0xB484], NFC: [0xB484], NFD: [0x1103, 0x116F, 0x11BF], NFKC: [0xB484], NFKD: [0x1103, 0x116F, 0x11BF] }, +{ source: [0xB485], NFC: [0xB485], NFD: [0x1103, 0x116F, 0x11C0], NFKC: [0xB485], NFKD: [0x1103, 0x116F, 0x11C0] }, +{ source: [0xB486], NFC: [0xB486], NFD: [0x1103, 0x116F, 0x11C1], NFKC: [0xB486], NFKD: [0x1103, 0x116F, 0x11C1] }, +{ source: [0xB487], NFC: [0xB487], NFD: [0x1103, 0x116F, 0x11C2], NFKC: [0xB487], NFKD: [0x1103, 0x116F, 0x11C2] }, +{ source: [0xB488], NFC: [0xB488], NFD: [0x1103, 0x1170], NFKC: [0xB488], NFKD: [0x1103, 0x1170] }, +{ source: [0xB489], NFC: [0xB489], NFD: [0x1103, 0x1170, 0x11A8], NFKC: [0xB489], NFKD: [0x1103, 0x1170, 0x11A8] }, +{ source: [0xB48A], NFC: [0xB48A], NFD: [0x1103, 0x1170, 0x11A9], NFKC: [0xB48A], NFKD: [0x1103, 0x1170, 0x11A9] }, +{ source: [0xB48B], NFC: [0xB48B], NFD: [0x1103, 0x1170, 0x11AA], NFKC: [0xB48B], NFKD: [0x1103, 0x1170, 0x11AA] }, +{ source: [0xB48C], NFC: [0xB48C], NFD: [0x1103, 0x1170, 0x11AB], NFKC: [0xB48C], NFKD: [0x1103, 0x1170, 0x11AB] }, +{ source: [0xB48D], NFC: [0xB48D], NFD: [0x1103, 0x1170, 0x11AC], NFKC: [0xB48D], NFKD: [0x1103, 0x1170, 0x11AC] }, +{ source: [0xB48E], NFC: [0xB48E], NFD: [0x1103, 0x1170, 0x11AD], NFKC: [0xB48E], NFKD: [0x1103, 0x1170, 0x11AD] }, +{ source: [0xB48F], NFC: [0xB48F], NFD: [0x1103, 0x1170, 0x11AE], NFKC: [0xB48F], NFKD: [0x1103, 0x1170, 0x11AE] }, +{ source: [0xB490], NFC: [0xB490], NFD: [0x1103, 0x1170, 0x11AF], NFKC: [0xB490], NFKD: [0x1103, 0x1170, 0x11AF] }, +{ source: [0xB491], NFC: [0xB491], NFD: [0x1103, 0x1170, 0x11B0], NFKC: [0xB491], NFKD: [0x1103, 0x1170, 0x11B0] }, +{ source: [0xB492], NFC: [0xB492], NFD: [0x1103, 0x1170, 0x11B1], NFKC: [0xB492], NFKD: [0x1103, 0x1170, 0x11B1] }, +{ source: [0xB493], NFC: [0xB493], NFD: [0x1103, 0x1170, 0x11B2], NFKC: [0xB493], NFKD: [0x1103, 0x1170, 0x11B2] }, +{ source: [0xB494], NFC: [0xB494], NFD: [0x1103, 0x1170, 0x11B3], NFKC: [0xB494], NFKD: [0x1103, 0x1170, 0x11B3] }, +{ source: [0xB495], NFC: [0xB495], NFD: [0x1103, 0x1170, 0x11B4], NFKC: [0xB495], NFKD: [0x1103, 0x1170, 0x11B4] }, +{ source: [0xB496], NFC: [0xB496], NFD: [0x1103, 0x1170, 0x11B5], NFKC: [0xB496], NFKD: [0x1103, 0x1170, 0x11B5] }, +{ source: [0xB497], NFC: [0xB497], NFD: [0x1103, 0x1170, 0x11B6], NFKC: [0xB497], NFKD: [0x1103, 0x1170, 0x11B6] }, +{ source: [0xB498], NFC: [0xB498], NFD: [0x1103, 0x1170, 0x11B7], NFKC: [0xB498], NFKD: [0x1103, 0x1170, 0x11B7] }, +{ source: [0xB499], NFC: [0xB499], NFD: [0x1103, 0x1170, 0x11B8], NFKC: [0xB499], NFKD: [0x1103, 0x1170, 0x11B8] }, +{ source: [0xB49A], NFC: [0xB49A], NFD: [0x1103, 0x1170, 0x11B9], NFKC: [0xB49A], NFKD: [0x1103, 0x1170, 0x11B9] }, +{ source: [0xB49B], NFC: [0xB49B], NFD: [0x1103, 0x1170, 0x11BA], NFKC: [0xB49B], NFKD: [0x1103, 0x1170, 0x11BA] }, +{ source: [0xB49C], NFC: [0xB49C], NFD: [0x1103, 0x1170, 0x11BB], NFKC: [0xB49C], NFKD: [0x1103, 0x1170, 0x11BB] }, +{ source: [0xB49D], NFC: [0xB49D], NFD: [0x1103, 0x1170, 0x11BC], NFKC: [0xB49D], NFKD: [0x1103, 0x1170, 0x11BC] }, +{ source: [0xB49E], NFC: [0xB49E], NFD: [0x1103, 0x1170, 0x11BD], NFKC: [0xB49E], NFKD: [0x1103, 0x1170, 0x11BD] }, +{ source: [0xB49F], NFC: [0xB49F], NFD: [0x1103, 0x1170, 0x11BE], NFKC: [0xB49F], NFKD: [0x1103, 0x1170, 0x11BE] }, +{ source: [0xB4A0], NFC: [0xB4A0], NFD: [0x1103, 0x1170, 0x11BF], NFKC: [0xB4A0], NFKD: [0x1103, 0x1170, 0x11BF] }, +{ source: [0xB4A1], NFC: [0xB4A1], NFD: [0x1103, 0x1170, 0x11C0], NFKC: [0xB4A1], NFKD: [0x1103, 0x1170, 0x11C0] }, +{ source: [0xB4A2], NFC: [0xB4A2], NFD: [0x1103, 0x1170, 0x11C1], NFKC: [0xB4A2], NFKD: [0x1103, 0x1170, 0x11C1] }, +{ source: [0xB4A3], NFC: [0xB4A3], NFD: [0x1103, 0x1170, 0x11C2], NFKC: [0xB4A3], NFKD: [0x1103, 0x1170, 0x11C2] }, +{ source: [0xB4A4], NFC: [0xB4A4], NFD: [0x1103, 0x1171], NFKC: [0xB4A4], NFKD: [0x1103, 0x1171] }, +{ source: [0xB4A5], NFC: [0xB4A5], NFD: [0x1103, 0x1171, 0x11A8], NFKC: [0xB4A5], NFKD: [0x1103, 0x1171, 0x11A8] }, +{ source: [0xB4A6], NFC: [0xB4A6], NFD: [0x1103, 0x1171, 0x11A9], NFKC: [0xB4A6], NFKD: [0x1103, 0x1171, 0x11A9] }, +{ source: [0xB4A7], NFC: [0xB4A7], NFD: [0x1103, 0x1171, 0x11AA], NFKC: [0xB4A7], NFKD: [0x1103, 0x1171, 0x11AA] }, +{ source: [0xB4A8], NFC: [0xB4A8], NFD: [0x1103, 0x1171, 0x11AB], NFKC: [0xB4A8], NFKD: [0x1103, 0x1171, 0x11AB] }, +{ source: [0xB4A9], NFC: [0xB4A9], NFD: [0x1103, 0x1171, 0x11AC], NFKC: [0xB4A9], NFKD: [0x1103, 0x1171, 0x11AC] }, +{ source: [0xB4AA], NFC: [0xB4AA], NFD: [0x1103, 0x1171, 0x11AD], NFKC: [0xB4AA], NFKD: [0x1103, 0x1171, 0x11AD] }, +{ source: [0xB4AB], NFC: [0xB4AB], NFD: [0x1103, 0x1171, 0x11AE], NFKC: [0xB4AB], NFKD: [0x1103, 0x1171, 0x11AE] }, +{ source: [0xB4AC], NFC: [0xB4AC], NFD: [0x1103, 0x1171, 0x11AF], NFKC: [0xB4AC], NFKD: [0x1103, 0x1171, 0x11AF] }, +{ source: [0xB4AD], NFC: [0xB4AD], NFD: [0x1103, 0x1171, 0x11B0], NFKC: [0xB4AD], NFKD: [0x1103, 0x1171, 0x11B0] }, +{ source: [0xB4AE], NFC: [0xB4AE], NFD: [0x1103, 0x1171, 0x11B1], NFKC: [0xB4AE], NFKD: [0x1103, 0x1171, 0x11B1] }, +{ source: [0xB4AF], NFC: [0xB4AF], NFD: [0x1103, 0x1171, 0x11B2], NFKC: [0xB4AF], NFKD: [0x1103, 0x1171, 0x11B2] }, +{ source: [0xB4B0], NFC: [0xB4B0], NFD: [0x1103, 0x1171, 0x11B3], NFKC: [0xB4B0], NFKD: [0x1103, 0x1171, 0x11B3] }, +{ source: [0xB4B1], NFC: [0xB4B1], NFD: [0x1103, 0x1171, 0x11B4], NFKC: [0xB4B1], NFKD: [0x1103, 0x1171, 0x11B4] }, +{ source: [0xB4B2], NFC: [0xB4B2], NFD: [0x1103, 0x1171, 0x11B5], NFKC: [0xB4B2], NFKD: [0x1103, 0x1171, 0x11B5] }, +{ source: [0xB4B3], NFC: [0xB4B3], NFD: [0x1103, 0x1171, 0x11B6], NFKC: [0xB4B3], NFKD: [0x1103, 0x1171, 0x11B6] }, +{ source: [0xB4B4], NFC: [0xB4B4], NFD: [0x1103, 0x1171, 0x11B7], NFKC: [0xB4B4], NFKD: [0x1103, 0x1171, 0x11B7] }, +{ source: [0xB4B5], NFC: [0xB4B5], NFD: [0x1103, 0x1171, 0x11B8], NFKC: [0xB4B5], NFKD: [0x1103, 0x1171, 0x11B8] }, +{ source: [0xB4B6], NFC: [0xB4B6], NFD: [0x1103, 0x1171, 0x11B9], NFKC: [0xB4B6], NFKD: [0x1103, 0x1171, 0x11B9] }, +{ source: [0xB4B7], NFC: [0xB4B7], NFD: [0x1103, 0x1171, 0x11BA], NFKC: [0xB4B7], NFKD: [0x1103, 0x1171, 0x11BA] }, +{ source: [0xB4B8], NFC: [0xB4B8], NFD: [0x1103, 0x1171, 0x11BB], NFKC: [0xB4B8], NFKD: [0x1103, 0x1171, 0x11BB] }, +{ source: [0xB4B9], NFC: [0xB4B9], NFD: [0x1103, 0x1171, 0x11BC], NFKC: [0xB4B9], NFKD: [0x1103, 0x1171, 0x11BC] }, +{ source: [0xB4BA], NFC: [0xB4BA], NFD: [0x1103, 0x1171, 0x11BD], NFKC: [0xB4BA], NFKD: [0x1103, 0x1171, 0x11BD] }, +{ source: [0xB4BB], NFC: [0xB4BB], NFD: [0x1103, 0x1171, 0x11BE], NFKC: [0xB4BB], NFKD: [0x1103, 0x1171, 0x11BE] }, +{ source: [0xB4BC], NFC: [0xB4BC], NFD: [0x1103, 0x1171, 0x11BF], NFKC: [0xB4BC], NFKD: [0x1103, 0x1171, 0x11BF] }, +{ source: [0xB4BD], NFC: [0xB4BD], NFD: [0x1103, 0x1171, 0x11C0], NFKC: [0xB4BD], NFKD: [0x1103, 0x1171, 0x11C0] }, +{ source: [0xB4BE], NFC: [0xB4BE], NFD: [0x1103, 0x1171, 0x11C1], NFKC: [0xB4BE], NFKD: [0x1103, 0x1171, 0x11C1] }, +{ source: [0xB4BF], NFC: [0xB4BF], NFD: [0x1103, 0x1171, 0x11C2], NFKC: [0xB4BF], NFKD: [0x1103, 0x1171, 0x11C2] }, +{ source: [0xB4C0], NFC: [0xB4C0], NFD: [0x1103, 0x1172], NFKC: [0xB4C0], NFKD: [0x1103, 0x1172] }, +{ source: [0xB4C1], NFC: [0xB4C1], NFD: [0x1103, 0x1172, 0x11A8], NFKC: [0xB4C1], NFKD: [0x1103, 0x1172, 0x11A8] }, +{ source: [0xB4C2], NFC: [0xB4C2], NFD: [0x1103, 0x1172, 0x11A9], NFKC: [0xB4C2], NFKD: [0x1103, 0x1172, 0x11A9] }, +{ source: [0xB4C3], NFC: [0xB4C3], NFD: [0x1103, 0x1172, 0x11AA], NFKC: [0xB4C3], NFKD: [0x1103, 0x1172, 0x11AA] }, +{ source: [0xB4C4], NFC: [0xB4C4], NFD: [0x1103, 0x1172, 0x11AB], NFKC: [0xB4C4], NFKD: [0x1103, 0x1172, 0x11AB] }, +{ source: [0xB4C5], NFC: [0xB4C5], NFD: [0x1103, 0x1172, 0x11AC], NFKC: [0xB4C5], NFKD: [0x1103, 0x1172, 0x11AC] }, +{ source: [0xB4C6], NFC: [0xB4C6], NFD: [0x1103, 0x1172, 0x11AD], NFKC: [0xB4C6], NFKD: [0x1103, 0x1172, 0x11AD] }, +{ source: [0xB4C7], NFC: [0xB4C7], NFD: [0x1103, 0x1172, 0x11AE], NFKC: [0xB4C7], NFKD: [0x1103, 0x1172, 0x11AE] }, +{ source: [0xB4C8], NFC: [0xB4C8], NFD: [0x1103, 0x1172, 0x11AF], NFKC: [0xB4C8], NFKD: [0x1103, 0x1172, 0x11AF] }, +{ source: [0xB4C9], NFC: [0xB4C9], NFD: [0x1103, 0x1172, 0x11B0], NFKC: [0xB4C9], NFKD: [0x1103, 0x1172, 0x11B0] }, +{ source: [0xB4CA], NFC: [0xB4CA], NFD: [0x1103, 0x1172, 0x11B1], NFKC: [0xB4CA], NFKD: [0x1103, 0x1172, 0x11B1] }, +{ source: [0xB4CB], NFC: [0xB4CB], NFD: [0x1103, 0x1172, 0x11B2], NFKC: [0xB4CB], NFKD: [0x1103, 0x1172, 0x11B2] }, +{ source: [0xB4CC], NFC: [0xB4CC], NFD: [0x1103, 0x1172, 0x11B3], NFKC: [0xB4CC], NFKD: [0x1103, 0x1172, 0x11B3] }, +{ source: [0xB4CD], NFC: [0xB4CD], NFD: [0x1103, 0x1172, 0x11B4], NFKC: [0xB4CD], NFKD: [0x1103, 0x1172, 0x11B4] }, +{ source: [0xB4CE], NFC: [0xB4CE], NFD: [0x1103, 0x1172, 0x11B5], NFKC: [0xB4CE], NFKD: [0x1103, 0x1172, 0x11B5] }, +{ source: [0xB4CF], NFC: [0xB4CF], NFD: [0x1103, 0x1172, 0x11B6], NFKC: [0xB4CF], NFKD: [0x1103, 0x1172, 0x11B6] }, +{ source: [0xB4D0], NFC: [0xB4D0], NFD: [0x1103, 0x1172, 0x11B7], NFKC: [0xB4D0], NFKD: [0x1103, 0x1172, 0x11B7] }, +{ source: [0xB4D1], NFC: [0xB4D1], NFD: [0x1103, 0x1172, 0x11B8], NFKC: [0xB4D1], NFKD: [0x1103, 0x1172, 0x11B8] }, +{ source: [0xB4D2], NFC: [0xB4D2], NFD: [0x1103, 0x1172, 0x11B9], NFKC: [0xB4D2], NFKD: [0x1103, 0x1172, 0x11B9] }, +{ source: [0xB4D3], NFC: [0xB4D3], NFD: [0x1103, 0x1172, 0x11BA], NFKC: [0xB4D3], NFKD: [0x1103, 0x1172, 0x11BA] }, +{ source: [0xB4D4], NFC: [0xB4D4], NFD: [0x1103, 0x1172, 0x11BB], NFKC: [0xB4D4], NFKD: [0x1103, 0x1172, 0x11BB] }, +{ source: [0xB4D5], NFC: [0xB4D5], NFD: [0x1103, 0x1172, 0x11BC], NFKC: [0xB4D5], NFKD: [0x1103, 0x1172, 0x11BC] }, +{ source: [0xB4D6], NFC: [0xB4D6], NFD: [0x1103, 0x1172, 0x11BD], NFKC: [0xB4D6], NFKD: [0x1103, 0x1172, 0x11BD] }, +{ source: [0xB4D7], NFC: [0xB4D7], NFD: [0x1103, 0x1172, 0x11BE], NFKC: [0xB4D7], NFKD: [0x1103, 0x1172, 0x11BE] }, +{ source: [0xB4D8], NFC: [0xB4D8], NFD: [0x1103, 0x1172, 0x11BF], NFKC: [0xB4D8], NFKD: [0x1103, 0x1172, 0x11BF] }, +{ source: [0xB4D9], NFC: [0xB4D9], NFD: [0x1103, 0x1172, 0x11C0], NFKC: [0xB4D9], NFKD: [0x1103, 0x1172, 0x11C0] }, +{ source: [0xB4DA], NFC: [0xB4DA], NFD: [0x1103, 0x1172, 0x11C1], NFKC: [0xB4DA], NFKD: [0x1103, 0x1172, 0x11C1] }, +{ source: [0xB4DB], NFC: [0xB4DB], NFD: [0x1103, 0x1172, 0x11C2], NFKC: [0xB4DB], NFKD: [0x1103, 0x1172, 0x11C2] }, +{ source: [0xB4DC], NFC: [0xB4DC], NFD: [0x1103, 0x1173], NFKC: [0xB4DC], NFKD: [0x1103, 0x1173] }, +{ source: [0xB4DD], NFC: [0xB4DD], NFD: [0x1103, 0x1173, 0x11A8], NFKC: [0xB4DD], NFKD: [0x1103, 0x1173, 0x11A8] }, +{ source: [0xB4DE], NFC: [0xB4DE], NFD: [0x1103, 0x1173, 0x11A9], NFKC: [0xB4DE], NFKD: [0x1103, 0x1173, 0x11A9] }, +{ source: [0xB4DF], NFC: [0xB4DF], NFD: [0x1103, 0x1173, 0x11AA], NFKC: [0xB4DF], NFKD: [0x1103, 0x1173, 0x11AA] }, +{ source: [0xB4E0], NFC: [0xB4E0], NFD: [0x1103, 0x1173, 0x11AB], NFKC: [0xB4E0], NFKD: [0x1103, 0x1173, 0x11AB] }, +{ source: [0xB4E1], NFC: [0xB4E1], NFD: [0x1103, 0x1173, 0x11AC], NFKC: [0xB4E1], NFKD: [0x1103, 0x1173, 0x11AC] }, +{ source: [0xB4E2], NFC: [0xB4E2], NFD: [0x1103, 0x1173, 0x11AD], NFKC: [0xB4E2], NFKD: [0x1103, 0x1173, 0x11AD] }, +{ source: [0xB4E3], NFC: [0xB4E3], NFD: [0x1103, 0x1173, 0x11AE], NFKC: [0xB4E3], NFKD: [0x1103, 0x1173, 0x11AE] }, +{ source: [0xB4E4], NFC: [0xB4E4], NFD: [0x1103, 0x1173, 0x11AF], NFKC: [0xB4E4], NFKD: [0x1103, 0x1173, 0x11AF] }, +{ source: [0xB4E5], NFC: [0xB4E5], NFD: [0x1103, 0x1173, 0x11B0], NFKC: [0xB4E5], NFKD: [0x1103, 0x1173, 0x11B0] }, +{ source: [0xB4E6], NFC: [0xB4E6], NFD: [0x1103, 0x1173, 0x11B1], NFKC: [0xB4E6], NFKD: [0x1103, 0x1173, 0x11B1] }, +{ source: [0xB4E7], NFC: [0xB4E7], NFD: [0x1103, 0x1173, 0x11B2], NFKC: [0xB4E7], NFKD: [0x1103, 0x1173, 0x11B2] }, +{ source: [0xB4E8], NFC: [0xB4E8], NFD: [0x1103, 0x1173, 0x11B3], NFKC: [0xB4E8], NFKD: [0x1103, 0x1173, 0x11B3] }, +{ source: [0xB4E9], NFC: [0xB4E9], NFD: [0x1103, 0x1173, 0x11B4], NFKC: [0xB4E9], NFKD: [0x1103, 0x1173, 0x11B4] }, +{ source: [0xB4EA], NFC: [0xB4EA], NFD: [0x1103, 0x1173, 0x11B5], NFKC: [0xB4EA], NFKD: [0x1103, 0x1173, 0x11B5] }, +{ source: [0xB4EB], NFC: [0xB4EB], NFD: [0x1103, 0x1173, 0x11B6], NFKC: [0xB4EB], NFKD: [0x1103, 0x1173, 0x11B6] }, +{ source: [0xB4EC], NFC: [0xB4EC], NFD: [0x1103, 0x1173, 0x11B7], NFKC: [0xB4EC], NFKD: [0x1103, 0x1173, 0x11B7] }, +{ source: [0xB4ED], NFC: [0xB4ED], NFD: [0x1103, 0x1173, 0x11B8], NFKC: [0xB4ED], NFKD: [0x1103, 0x1173, 0x11B8] }, +{ source: [0xB4EE], NFC: [0xB4EE], NFD: [0x1103, 0x1173, 0x11B9], NFKC: [0xB4EE], NFKD: [0x1103, 0x1173, 0x11B9] }, +{ source: [0xB4EF], NFC: [0xB4EF], NFD: [0x1103, 0x1173, 0x11BA], NFKC: [0xB4EF], NFKD: [0x1103, 0x1173, 0x11BA] }, +{ source: [0xB4F0], NFC: [0xB4F0], NFD: [0x1103, 0x1173, 0x11BB], NFKC: [0xB4F0], NFKD: [0x1103, 0x1173, 0x11BB] }, +{ source: [0xB4F1], NFC: [0xB4F1], NFD: [0x1103, 0x1173, 0x11BC], NFKC: [0xB4F1], NFKD: [0x1103, 0x1173, 0x11BC] }, +{ source: [0xB4F2], NFC: [0xB4F2], NFD: [0x1103, 0x1173, 0x11BD], NFKC: [0xB4F2], NFKD: [0x1103, 0x1173, 0x11BD] }, +{ source: [0xB4F3], NFC: [0xB4F3], NFD: [0x1103, 0x1173, 0x11BE], NFKC: [0xB4F3], NFKD: [0x1103, 0x1173, 0x11BE] }, +{ source: [0xB4F4], NFC: [0xB4F4], NFD: [0x1103, 0x1173, 0x11BF], NFKC: [0xB4F4], NFKD: [0x1103, 0x1173, 0x11BF] }, +{ source: [0xB4F5], NFC: [0xB4F5], NFD: [0x1103, 0x1173, 0x11C0], NFKC: [0xB4F5], NFKD: [0x1103, 0x1173, 0x11C0] }, +{ source: [0xB4F6], NFC: [0xB4F6], NFD: [0x1103, 0x1173, 0x11C1], NFKC: [0xB4F6], NFKD: [0x1103, 0x1173, 0x11C1] }, +{ source: [0xB4F7], NFC: [0xB4F7], NFD: [0x1103, 0x1173, 0x11C2], NFKC: [0xB4F7], NFKD: [0x1103, 0x1173, 0x11C2] }, +{ source: [0xB4F8], NFC: [0xB4F8], NFD: [0x1103, 0x1174], NFKC: [0xB4F8], NFKD: [0x1103, 0x1174] }, +{ source: [0xB4F9], NFC: [0xB4F9], NFD: [0x1103, 0x1174, 0x11A8], NFKC: [0xB4F9], NFKD: [0x1103, 0x1174, 0x11A8] }, +{ source: [0xB4FA], NFC: [0xB4FA], NFD: [0x1103, 0x1174, 0x11A9], NFKC: [0xB4FA], NFKD: [0x1103, 0x1174, 0x11A9] }, +{ source: [0xB4FB], NFC: [0xB4FB], NFD: [0x1103, 0x1174, 0x11AA], NFKC: [0xB4FB], NFKD: [0x1103, 0x1174, 0x11AA] }, +{ source: [0xB4FC], NFC: [0xB4FC], NFD: [0x1103, 0x1174, 0x11AB], NFKC: [0xB4FC], NFKD: [0x1103, 0x1174, 0x11AB] }, +{ source: [0xB4FD], NFC: [0xB4FD], NFD: [0x1103, 0x1174, 0x11AC], NFKC: [0xB4FD], NFKD: [0x1103, 0x1174, 0x11AC] }, +{ source: [0xB4FE], NFC: [0xB4FE], NFD: [0x1103, 0x1174, 0x11AD], NFKC: [0xB4FE], NFKD: [0x1103, 0x1174, 0x11AD] }, +{ source: [0xB4FF], NFC: [0xB4FF], NFD: [0x1103, 0x1174, 0x11AE], NFKC: [0xB4FF], NFKD: [0x1103, 0x1174, 0x11AE] }, +{ source: [0xB500], NFC: [0xB500], NFD: [0x1103, 0x1174, 0x11AF], NFKC: [0xB500], NFKD: [0x1103, 0x1174, 0x11AF] }, +{ source: [0xB501], NFC: [0xB501], NFD: [0x1103, 0x1174, 0x11B0], NFKC: [0xB501], NFKD: [0x1103, 0x1174, 0x11B0] }, +{ source: [0xB502], NFC: [0xB502], NFD: [0x1103, 0x1174, 0x11B1], NFKC: [0xB502], NFKD: [0x1103, 0x1174, 0x11B1] }, +{ source: [0xB503], NFC: [0xB503], NFD: [0x1103, 0x1174, 0x11B2], NFKC: [0xB503], NFKD: [0x1103, 0x1174, 0x11B2] }, +{ source: [0xB504], NFC: [0xB504], NFD: [0x1103, 0x1174, 0x11B3], NFKC: [0xB504], NFKD: [0x1103, 0x1174, 0x11B3] }, +{ source: [0xB505], NFC: [0xB505], NFD: [0x1103, 0x1174, 0x11B4], NFKC: [0xB505], NFKD: [0x1103, 0x1174, 0x11B4] }, +{ source: [0xB506], NFC: [0xB506], NFD: [0x1103, 0x1174, 0x11B5], NFKC: [0xB506], NFKD: [0x1103, 0x1174, 0x11B5] }, +{ source: [0xB507], NFC: [0xB507], NFD: [0x1103, 0x1174, 0x11B6], NFKC: [0xB507], NFKD: [0x1103, 0x1174, 0x11B6] }, +{ source: [0xB508], NFC: [0xB508], NFD: [0x1103, 0x1174, 0x11B7], NFKC: [0xB508], NFKD: [0x1103, 0x1174, 0x11B7] }, +{ source: [0xB509], NFC: [0xB509], NFD: [0x1103, 0x1174, 0x11B8], NFKC: [0xB509], NFKD: [0x1103, 0x1174, 0x11B8] }, +{ source: [0xB50A], NFC: [0xB50A], NFD: [0x1103, 0x1174, 0x11B9], NFKC: [0xB50A], NFKD: [0x1103, 0x1174, 0x11B9] }, +{ source: [0xB50B], NFC: [0xB50B], NFD: [0x1103, 0x1174, 0x11BA], NFKC: [0xB50B], NFKD: [0x1103, 0x1174, 0x11BA] }, +{ source: [0xB50C], NFC: [0xB50C], NFD: [0x1103, 0x1174, 0x11BB], NFKC: [0xB50C], NFKD: [0x1103, 0x1174, 0x11BB] }, +{ source: [0xB50D], NFC: [0xB50D], NFD: [0x1103, 0x1174, 0x11BC], NFKC: [0xB50D], NFKD: [0x1103, 0x1174, 0x11BC] }, +{ source: [0xB50E], NFC: [0xB50E], NFD: [0x1103, 0x1174, 0x11BD], NFKC: [0xB50E], NFKD: [0x1103, 0x1174, 0x11BD] }, +{ source: [0xB50F], NFC: [0xB50F], NFD: [0x1103, 0x1174, 0x11BE], NFKC: [0xB50F], NFKD: [0x1103, 0x1174, 0x11BE] }, +{ source: [0xB510], NFC: [0xB510], NFD: [0x1103, 0x1174, 0x11BF], NFKC: [0xB510], NFKD: [0x1103, 0x1174, 0x11BF] }, +{ source: [0xB511], NFC: [0xB511], NFD: [0x1103, 0x1174, 0x11C0], NFKC: [0xB511], NFKD: [0x1103, 0x1174, 0x11C0] }, +{ source: [0xB512], NFC: [0xB512], NFD: [0x1103, 0x1174, 0x11C1], NFKC: [0xB512], NFKD: [0x1103, 0x1174, 0x11C1] }, +{ source: [0xB513], NFC: [0xB513], NFD: [0x1103, 0x1174, 0x11C2], NFKC: [0xB513], NFKD: [0x1103, 0x1174, 0x11C2] }, +{ source: [0xB514], NFC: [0xB514], NFD: [0x1103, 0x1175], NFKC: [0xB514], NFKD: [0x1103, 0x1175] }, +{ source: [0xB515], NFC: [0xB515], NFD: [0x1103, 0x1175, 0x11A8], NFKC: [0xB515], NFKD: [0x1103, 0x1175, 0x11A8] }, +{ source: [0xB516], NFC: [0xB516], NFD: [0x1103, 0x1175, 0x11A9], NFKC: [0xB516], NFKD: [0x1103, 0x1175, 0x11A9] }, +{ source: [0xB517], NFC: [0xB517], NFD: [0x1103, 0x1175, 0x11AA], NFKC: [0xB517], NFKD: [0x1103, 0x1175, 0x11AA] }, +{ source: [0xB518], NFC: [0xB518], NFD: [0x1103, 0x1175, 0x11AB], NFKC: [0xB518], NFKD: [0x1103, 0x1175, 0x11AB] }, +{ source: [0xB519], NFC: [0xB519], NFD: [0x1103, 0x1175, 0x11AC], NFKC: [0xB519], NFKD: [0x1103, 0x1175, 0x11AC] }, +{ source: [0xB51A], NFC: [0xB51A], NFD: [0x1103, 0x1175, 0x11AD], NFKC: [0xB51A], NFKD: [0x1103, 0x1175, 0x11AD] }, +{ source: [0xB51B], NFC: [0xB51B], NFD: [0x1103, 0x1175, 0x11AE], NFKC: [0xB51B], NFKD: [0x1103, 0x1175, 0x11AE] }, +{ source: [0xB51C], NFC: [0xB51C], NFD: [0x1103, 0x1175, 0x11AF], NFKC: [0xB51C], NFKD: [0x1103, 0x1175, 0x11AF] }, +{ source: [0xB51D], NFC: [0xB51D], NFD: [0x1103, 0x1175, 0x11B0], NFKC: [0xB51D], NFKD: [0x1103, 0x1175, 0x11B0] }, +{ source: [0xB51E], NFC: [0xB51E], NFD: [0x1103, 0x1175, 0x11B1], NFKC: [0xB51E], NFKD: [0x1103, 0x1175, 0x11B1] }, +{ source: [0xB51F], NFC: [0xB51F], NFD: [0x1103, 0x1175, 0x11B2], NFKC: [0xB51F], NFKD: [0x1103, 0x1175, 0x11B2] }, +{ source: [0xB520], NFC: [0xB520], NFD: [0x1103, 0x1175, 0x11B3], NFKC: [0xB520], NFKD: [0x1103, 0x1175, 0x11B3] }, +{ source: [0xB521], NFC: [0xB521], NFD: [0x1103, 0x1175, 0x11B4], NFKC: [0xB521], NFKD: [0x1103, 0x1175, 0x11B4] }, +{ source: [0xB522], NFC: [0xB522], NFD: [0x1103, 0x1175, 0x11B5], NFKC: [0xB522], NFKD: [0x1103, 0x1175, 0x11B5] }, +{ source: [0xB523], NFC: [0xB523], NFD: [0x1103, 0x1175, 0x11B6], NFKC: [0xB523], NFKD: [0x1103, 0x1175, 0x11B6] }, +{ source: [0xB524], NFC: [0xB524], NFD: [0x1103, 0x1175, 0x11B7], NFKC: [0xB524], NFKD: [0x1103, 0x1175, 0x11B7] }, +{ source: [0xB525], NFC: [0xB525], NFD: [0x1103, 0x1175, 0x11B8], NFKC: [0xB525], NFKD: [0x1103, 0x1175, 0x11B8] }, +{ source: [0xB526], NFC: [0xB526], NFD: [0x1103, 0x1175, 0x11B9], NFKC: [0xB526], NFKD: [0x1103, 0x1175, 0x11B9] }, +{ source: [0xB527], NFC: [0xB527], NFD: [0x1103, 0x1175, 0x11BA], NFKC: [0xB527], NFKD: [0x1103, 0x1175, 0x11BA] }, +{ source: [0xB528], NFC: [0xB528], NFD: [0x1103, 0x1175, 0x11BB], NFKC: [0xB528], NFKD: [0x1103, 0x1175, 0x11BB] }, +{ source: [0xB529], NFC: [0xB529], NFD: [0x1103, 0x1175, 0x11BC], NFKC: [0xB529], NFKD: [0x1103, 0x1175, 0x11BC] }, +{ source: [0xB52A], NFC: [0xB52A], NFD: [0x1103, 0x1175, 0x11BD], NFKC: [0xB52A], NFKD: [0x1103, 0x1175, 0x11BD] }, +{ source: [0xB52B], NFC: [0xB52B], NFD: [0x1103, 0x1175, 0x11BE], NFKC: [0xB52B], NFKD: [0x1103, 0x1175, 0x11BE] }, +{ source: [0xB52C], NFC: [0xB52C], NFD: [0x1103, 0x1175, 0x11BF], NFKC: [0xB52C], NFKD: [0x1103, 0x1175, 0x11BF] }, +{ source: [0xB52D], NFC: [0xB52D], NFD: [0x1103, 0x1175, 0x11C0], NFKC: [0xB52D], NFKD: [0x1103, 0x1175, 0x11C0] }, +{ source: [0xB52E], NFC: [0xB52E], NFD: [0x1103, 0x1175, 0x11C1], NFKC: [0xB52E], NFKD: [0x1103, 0x1175, 0x11C1] }, +{ source: [0xB52F], NFC: [0xB52F], NFD: [0x1103, 0x1175, 0x11C2], NFKC: [0xB52F], NFKD: [0x1103, 0x1175, 0x11C2] }, +{ source: [0xB530], NFC: [0xB530], NFD: [0x1104, 0x1161], NFKC: [0xB530], NFKD: [0x1104, 0x1161] }, +{ source: [0xB531], NFC: [0xB531], NFD: [0x1104, 0x1161, 0x11A8], NFKC: [0xB531], NFKD: [0x1104, 0x1161, 0x11A8] }, +{ source: [0xB532], NFC: [0xB532], NFD: [0x1104, 0x1161, 0x11A9], NFKC: [0xB532], NFKD: [0x1104, 0x1161, 0x11A9] }, +{ source: [0xB533], NFC: [0xB533], NFD: [0x1104, 0x1161, 0x11AA], NFKC: [0xB533], NFKD: [0x1104, 0x1161, 0x11AA] }, +{ source: [0xB534], NFC: [0xB534], NFD: [0x1104, 0x1161, 0x11AB], NFKC: [0xB534], NFKD: [0x1104, 0x1161, 0x11AB] }, +{ source: [0xB535], NFC: [0xB535], NFD: [0x1104, 0x1161, 0x11AC], NFKC: [0xB535], NFKD: [0x1104, 0x1161, 0x11AC] }, +{ source: [0xB536], NFC: [0xB536], NFD: [0x1104, 0x1161, 0x11AD], NFKC: [0xB536], NFKD: [0x1104, 0x1161, 0x11AD] }, +{ source: [0xB537], NFC: [0xB537], NFD: [0x1104, 0x1161, 0x11AE], NFKC: [0xB537], NFKD: [0x1104, 0x1161, 0x11AE] }, +{ source: [0xB538], NFC: [0xB538], NFD: [0x1104, 0x1161, 0x11AF], NFKC: [0xB538], NFKD: [0x1104, 0x1161, 0x11AF] }, +{ source: [0xB539], NFC: [0xB539], NFD: [0x1104, 0x1161, 0x11B0], NFKC: [0xB539], NFKD: [0x1104, 0x1161, 0x11B0] }, +{ source: [0xB53A], NFC: [0xB53A], NFD: [0x1104, 0x1161, 0x11B1], NFKC: [0xB53A], NFKD: [0x1104, 0x1161, 0x11B1] }, +{ source: [0xB53B], NFC: [0xB53B], NFD: [0x1104, 0x1161, 0x11B2], NFKC: [0xB53B], NFKD: [0x1104, 0x1161, 0x11B2] }, +{ source: [0xB53C], NFC: [0xB53C], NFD: [0x1104, 0x1161, 0x11B3], NFKC: [0xB53C], NFKD: [0x1104, 0x1161, 0x11B3] }, +{ source: [0xB53D], NFC: [0xB53D], NFD: [0x1104, 0x1161, 0x11B4], NFKC: [0xB53D], NFKD: [0x1104, 0x1161, 0x11B4] }, +{ source: [0xB53E], NFC: [0xB53E], NFD: [0x1104, 0x1161, 0x11B5], NFKC: [0xB53E], NFKD: [0x1104, 0x1161, 0x11B5] }, +{ source: [0xB53F], NFC: [0xB53F], NFD: [0x1104, 0x1161, 0x11B6], NFKC: [0xB53F], NFKD: [0x1104, 0x1161, 0x11B6] }, +{ source: [0xB540], NFC: [0xB540], NFD: [0x1104, 0x1161, 0x11B7], NFKC: [0xB540], NFKD: [0x1104, 0x1161, 0x11B7] }, +{ source: [0xB541], NFC: [0xB541], NFD: [0x1104, 0x1161, 0x11B8], NFKC: [0xB541], NFKD: [0x1104, 0x1161, 0x11B8] }, +{ source: [0xB542], NFC: [0xB542], NFD: [0x1104, 0x1161, 0x11B9], NFKC: [0xB542], NFKD: [0x1104, 0x1161, 0x11B9] }, +{ source: [0xB543], NFC: [0xB543], NFD: [0x1104, 0x1161, 0x11BA], NFKC: [0xB543], NFKD: [0x1104, 0x1161, 0x11BA] }, +{ source: [0xB544], NFC: [0xB544], NFD: [0x1104, 0x1161, 0x11BB], NFKC: [0xB544], NFKD: [0x1104, 0x1161, 0x11BB] }, +{ source: [0xB545], NFC: [0xB545], NFD: [0x1104, 0x1161, 0x11BC], NFKC: [0xB545], NFKD: [0x1104, 0x1161, 0x11BC] }, +{ source: [0xB546], NFC: [0xB546], NFD: [0x1104, 0x1161, 0x11BD], NFKC: [0xB546], NFKD: [0x1104, 0x1161, 0x11BD] }, +{ source: [0xB547], NFC: [0xB547], NFD: [0x1104, 0x1161, 0x11BE], NFKC: [0xB547], NFKD: [0x1104, 0x1161, 0x11BE] }, +{ source: [0xB548], NFC: [0xB548], NFD: [0x1104, 0x1161, 0x11BF], NFKC: [0xB548], NFKD: [0x1104, 0x1161, 0x11BF] }, +{ source: [0xB549], NFC: [0xB549], NFD: [0x1104, 0x1161, 0x11C0], NFKC: [0xB549], NFKD: [0x1104, 0x1161, 0x11C0] }, +{ source: [0xB54A], NFC: [0xB54A], NFD: [0x1104, 0x1161, 0x11C1], NFKC: [0xB54A], NFKD: [0x1104, 0x1161, 0x11C1] }, +{ source: [0xB54B], NFC: [0xB54B], NFD: [0x1104, 0x1161, 0x11C2], NFKC: [0xB54B], NFKD: [0x1104, 0x1161, 0x11C2] }, +{ source: [0xB54C], NFC: [0xB54C], NFD: [0x1104, 0x1162], NFKC: [0xB54C], NFKD: [0x1104, 0x1162] }, +{ source: [0xB54D], NFC: [0xB54D], NFD: [0x1104, 0x1162, 0x11A8], NFKC: [0xB54D], NFKD: [0x1104, 0x1162, 0x11A8] }, +{ source: [0xB54E], NFC: [0xB54E], NFD: [0x1104, 0x1162, 0x11A9], NFKC: [0xB54E], NFKD: [0x1104, 0x1162, 0x11A9] }, +{ source: [0xB54F], NFC: [0xB54F], NFD: [0x1104, 0x1162, 0x11AA], NFKC: [0xB54F], NFKD: [0x1104, 0x1162, 0x11AA] }, +{ source: [0xB550], NFC: [0xB550], NFD: [0x1104, 0x1162, 0x11AB], NFKC: [0xB550], NFKD: [0x1104, 0x1162, 0x11AB] }, +{ source: [0xB551], NFC: [0xB551], NFD: [0x1104, 0x1162, 0x11AC], NFKC: [0xB551], NFKD: [0x1104, 0x1162, 0x11AC] }, +{ source: [0xB552], NFC: [0xB552], NFD: [0x1104, 0x1162, 0x11AD], NFKC: [0xB552], NFKD: [0x1104, 0x1162, 0x11AD] }, +{ source: [0xB553], NFC: [0xB553], NFD: [0x1104, 0x1162, 0x11AE], NFKC: [0xB553], NFKD: [0x1104, 0x1162, 0x11AE] }, +{ source: [0xB554], NFC: [0xB554], NFD: [0x1104, 0x1162, 0x11AF], NFKC: [0xB554], NFKD: [0x1104, 0x1162, 0x11AF] }, +{ source: [0xB555], NFC: [0xB555], NFD: [0x1104, 0x1162, 0x11B0], NFKC: [0xB555], NFKD: [0x1104, 0x1162, 0x11B0] }, +{ source: [0xB556], NFC: [0xB556], NFD: [0x1104, 0x1162, 0x11B1], NFKC: [0xB556], NFKD: [0x1104, 0x1162, 0x11B1] }, +{ source: [0xB557], NFC: [0xB557], NFD: [0x1104, 0x1162, 0x11B2], NFKC: [0xB557], NFKD: [0x1104, 0x1162, 0x11B2] }, +{ source: [0xB558], NFC: [0xB558], NFD: [0x1104, 0x1162, 0x11B3], NFKC: [0xB558], NFKD: [0x1104, 0x1162, 0x11B3] }, +{ source: [0xB559], NFC: [0xB559], NFD: [0x1104, 0x1162, 0x11B4], NFKC: [0xB559], NFKD: [0x1104, 0x1162, 0x11B4] }, +{ source: [0xB55A], NFC: [0xB55A], NFD: [0x1104, 0x1162, 0x11B5], NFKC: [0xB55A], NFKD: [0x1104, 0x1162, 0x11B5] }, +{ source: [0xB55B], NFC: [0xB55B], NFD: [0x1104, 0x1162, 0x11B6], NFKC: [0xB55B], NFKD: [0x1104, 0x1162, 0x11B6] }, +{ source: [0xB55C], NFC: [0xB55C], NFD: [0x1104, 0x1162, 0x11B7], NFKC: [0xB55C], NFKD: [0x1104, 0x1162, 0x11B7] }, +{ source: [0xB55D], NFC: [0xB55D], NFD: [0x1104, 0x1162, 0x11B8], NFKC: [0xB55D], NFKD: [0x1104, 0x1162, 0x11B8] }, +{ source: [0xB55E], NFC: [0xB55E], NFD: [0x1104, 0x1162, 0x11B9], NFKC: [0xB55E], NFKD: [0x1104, 0x1162, 0x11B9] }, +{ source: [0xB55F], NFC: [0xB55F], NFD: [0x1104, 0x1162, 0x11BA], NFKC: [0xB55F], NFKD: [0x1104, 0x1162, 0x11BA] }, +{ source: [0xB560], NFC: [0xB560], NFD: [0x1104, 0x1162, 0x11BB], NFKC: [0xB560], NFKD: [0x1104, 0x1162, 0x11BB] }, +{ source: [0xB561], NFC: [0xB561], NFD: [0x1104, 0x1162, 0x11BC], NFKC: [0xB561], NFKD: [0x1104, 0x1162, 0x11BC] }, +{ source: [0xB562], NFC: [0xB562], NFD: [0x1104, 0x1162, 0x11BD], NFKC: [0xB562], NFKD: [0x1104, 0x1162, 0x11BD] }, +{ source: [0xB563], NFC: [0xB563], NFD: [0x1104, 0x1162, 0x11BE], NFKC: [0xB563], NFKD: [0x1104, 0x1162, 0x11BE] }, +{ source: [0xB564], NFC: [0xB564], NFD: [0x1104, 0x1162, 0x11BF], NFKC: [0xB564], NFKD: [0x1104, 0x1162, 0x11BF] }, +{ source: [0xB565], NFC: [0xB565], NFD: [0x1104, 0x1162, 0x11C0], NFKC: [0xB565], NFKD: [0x1104, 0x1162, 0x11C0] }, +{ source: [0xB566], NFC: [0xB566], NFD: [0x1104, 0x1162, 0x11C1], NFKC: [0xB566], NFKD: [0x1104, 0x1162, 0x11C1] }, +{ source: [0xB567], NFC: [0xB567], NFD: [0x1104, 0x1162, 0x11C2], NFKC: [0xB567], NFKD: [0x1104, 0x1162, 0x11C2] }, +{ source: [0xB568], NFC: [0xB568], NFD: [0x1104, 0x1163], NFKC: [0xB568], NFKD: [0x1104, 0x1163] }, +{ source: [0xB569], NFC: [0xB569], NFD: [0x1104, 0x1163, 0x11A8], NFKC: [0xB569], NFKD: [0x1104, 0x1163, 0x11A8] }, +{ source: [0xB56A], NFC: [0xB56A], NFD: [0x1104, 0x1163, 0x11A9], NFKC: [0xB56A], NFKD: [0x1104, 0x1163, 0x11A9] }, +{ source: [0xB56B], NFC: [0xB56B], NFD: [0x1104, 0x1163, 0x11AA], NFKC: [0xB56B], NFKD: [0x1104, 0x1163, 0x11AA] }, +{ source: [0xB56C], NFC: [0xB56C], NFD: [0x1104, 0x1163, 0x11AB], NFKC: [0xB56C], NFKD: [0x1104, 0x1163, 0x11AB] }, +{ source: [0xB56D], NFC: [0xB56D], NFD: [0x1104, 0x1163, 0x11AC], NFKC: [0xB56D], NFKD: [0x1104, 0x1163, 0x11AC] }, +{ source: [0xB56E], NFC: [0xB56E], NFD: [0x1104, 0x1163, 0x11AD], NFKC: [0xB56E], NFKD: [0x1104, 0x1163, 0x11AD] }, +{ source: [0xB56F], NFC: [0xB56F], NFD: [0x1104, 0x1163, 0x11AE], NFKC: [0xB56F], NFKD: [0x1104, 0x1163, 0x11AE] }, +{ source: [0xB570], NFC: [0xB570], NFD: [0x1104, 0x1163, 0x11AF], NFKC: [0xB570], NFKD: [0x1104, 0x1163, 0x11AF] }, +{ source: [0xB571], NFC: [0xB571], NFD: [0x1104, 0x1163, 0x11B0], NFKC: [0xB571], NFKD: [0x1104, 0x1163, 0x11B0] }, +{ source: [0xB572], NFC: [0xB572], NFD: [0x1104, 0x1163, 0x11B1], NFKC: [0xB572], NFKD: [0x1104, 0x1163, 0x11B1] }, +{ source: [0xB573], NFC: [0xB573], NFD: [0x1104, 0x1163, 0x11B2], NFKC: [0xB573], NFKD: [0x1104, 0x1163, 0x11B2] }, +{ source: [0xB574], NFC: [0xB574], NFD: [0x1104, 0x1163, 0x11B3], NFKC: [0xB574], NFKD: [0x1104, 0x1163, 0x11B3] }, +{ source: [0xB575], NFC: [0xB575], NFD: [0x1104, 0x1163, 0x11B4], NFKC: [0xB575], NFKD: [0x1104, 0x1163, 0x11B4] }, +{ source: [0xB576], NFC: [0xB576], NFD: [0x1104, 0x1163, 0x11B5], NFKC: [0xB576], NFKD: [0x1104, 0x1163, 0x11B5] }, +{ source: [0xB577], NFC: [0xB577], NFD: [0x1104, 0x1163, 0x11B6], NFKC: [0xB577], NFKD: [0x1104, 0x1163, 0x11B6] }, +{ source: [0xB578], NFC: [0xB578], NFD: [0x1104, 0x1163, 0x11B7], NFKC: [0xB578], NFKD: [0x1104, 0x1163, 0x11B7] }, +{ source: [0xB579], NFC: [0xB579], NFD: [0x1104, 0x1163, 0x11B8], NFKC: [0xB579], NFKD: [0x1104, 0x1163, 0x11B8] }, +{ source: [0xB57A], NFC: [0xB57A], NFD: [0x1104, 0x1163, 0x11B9], NFKC: [0xB57A], NFKD: [0x1104, 0x1163, 0x11B9] }, +{ source: [0xB57B], NFC: [0xB57B], NFD: [0x1104, 0x1163, 0x11BA], NFKC: [0xB57B], NFKD: [0x1104, 0x1163, 0x11BA] }, +{ source: [0xB57C], NFC: [0xB57C], NFD: [0x1104, 0x1163, 0x11BB], NFKC: [0xB57C], NFKD: [0x1104, 0x1163, 0x11BB] }, +{ source: [0xB57D], NFC: [0xB57D], NFD: [0x1104, 0x1163, 0x11BC], NFKC: [0xB57D], NFKD: [0x1104, 0x1163, 0x11BC] }, +{ source: [0xB57E], NFC: [0xB57E], NFD: [0x1104, 0x1163, 0x11BD], NFKC: [0xB57E], NFKD: [0x1104, 0x1163, 0x11BD] }, +{ source: [0xB57F], NFC: [0xB57F], NFD: [0x1104, 0x1163, 0x11BE], NFKC: [0xB57F], NFKD: [0x1104, 0x1163, 0x11BE] }, +{ source: [0xB580], NFC: [0xB580], NFD: [0x1104, 0x1163, 0x11BF], NFKC: [0xB580], NFKD: [0x1104, 0x1163, 0x11BF] }, +{ source: [0xB581], NFC: [0xB581], NFD: [0x1104, 0x1163, 0x11C0], NFKC: [0xB581], NFKD: [0x1104, 0x1163, 0x11C0] }, +{ source: [0xB582], NFC: [0xB582], NFD: [0x1104, 0x1163, 0x11C1], NFKC: [0xB582], NFKD: [0x1104, 0x1163, 0x11C1] }, +{ source: [0xB583], NFC: [0xB583], NFD: [0x1104, 0x1163, 0x11C2], NFKC: [0xB583], NFKD: [0x1104, 0x1163, 0x11C2] }, +{ source: [0xB584], NFC: [0xB584], NFD: [0x1104, 0x1164], NFKC: [0xB584], NFKD: [0x1104, 0x1164] }, +{ source: [0xB585], NFC: [0xB585], NFD: [0x1104, 0x1164, 0x11A8], NFKC: [0xB585], NFKD: [0x1104, 0x1164, 0x11A8] }, +{ source: [0xB586], NFC: [0xB586], NFD: [0x1104, 0x1164, 0x11A9], NFKC: [0xB586], NFKD: [0x1104, 0x1164, 0x11A9] }, +{ source: [0xB587], NFC: [0xB587], NFD: [0x1104, 0x1164, 0x11AA], NFKC: [0xB587], NFKD: [0x1104, 0x1164, 0x11AA] }, +{ source: [0xB588], NFC: [0xB588], NFD: [0x1104, 0x1164, 0x11AB], NFKC: [0xB588], NFKD: [0x1104, 0x1164, 0x11AB] }, +{ source: [0xB589], NFC: [0xB589], NFD: [0x1104, 0x1164, 0x11AC], NFKC: [0xB589], NFKD: [0x1104, 0x1164, 0x11AC] }, +{ source: [0xB58A], NFC: [0xB58A], NFD: [0x1104, 0x1164, 0x11AD], NFKC: [0xB58A], NFKD: [0x1104, 0x1164, 0x11AD] }, +{ source: [0xB58B], NFC: [0xB58B], NFD: [0x1104, 0x1164, 0x11AE], NFKC: [0xB58B], NFKD: [0x1104, 0x1164, 0x11AE] }, +{ source: [0xB58C], NFC: [0xB58C], NFD: [0x1104, 0x1164, 0x11AF], NFKC: [0xB58C], NFKD: [0x1104, 0x1164, 0x11AF] }, +{ source: [0xB58D], NFC: [0xB58D], NFD: [0x1104, 0x1164, 0x11B0], NFKC: [0xB58D], NFKD: [0x1104, 0x1164, 0x11B0] }, +{ source: [0xB58E], NFC: [0xB58E], NFD: [0x1104, 0x1164, 0x11B1], NFKC: [0xB58E], NFKD: [0x1104, 0x1164, 0x11B1] }, +{ source: [0xB58F], NFC: [0xB58F], NFD: [0x1104, 0x1164, 0x11B2], NFKC: [0xB58F], NFKD: [0x1104, 0x1164, 0x11B2] }, +{ source: [0xB590], NFC: [0xB590], NFD: [0x1104, 0x1164, 0x11B3], NFKC: [0xB590], NFKD: [0x1104, 0x1164, 0x11B3] }, +{ source: [0xB591], NFC: [0xB591], NFD: [0x1104, 0x1164, 0x11B4], NFKC: [0xB591], NFKD: [0x1104, 0x1164, 0x11B4] }, +{ source: [0xB592], NFC: [0xB592], NFD: [0x1104, 0x1164, 0x11B5], NFKC: [0xB592], NFKD: [0x1104, 0x1164, 0x11B5] }, +{ source: [0xB593], NFC: [0xB593], NFD: [0x1104, 0x1164, 0x11B6], NFKC: [0xB593], NFKD: [0x1104, 0x1164, 0x11B6] }, +{ source: [0xB594], NFC: [0xB594], NFD: [0x1104, 0x1164, 0x11B7], NFKC: [0xB594], NFKD: [0x1104, 0x1164, 0x11B7] }, +{ source: [0xB595], NFC: [0xB595], NFD: [0x1104, 0x1164, 0x11B8], NFKC: [0xB595], NFKD: [0x1104, 0x1164, 0x11B8] }, +{ source: [0xB596], NFC: [0xB596], NFD: [0x1104, 0x1164, 0x11B9], NFKC: [0xB596], NFKD: [0x1104, 0x1164, 0x11B9] }, +{ source: [0xB597], NFC: [0xB597], NFD: [0x1104, 0x1164, 0x11BA], NFKC: [0xB597], NFKD: [0x1104, 0x1164, 0x11BA] }, +{ source: [0xB598], NFC: [0xB598], NFD: [0x1104, 0x1164, 0x11BB], NFKC: [0xB598], NFKD: [0x1104, 0x1164, 0x11BB] }, +{ source: [0xB599], NFC: [0xB599], NFD: [0x1104, 0x1164, 0x11BC], NFKC: [0xB599], NFKD: [0x1104, 0x1164, 0x11BC] }, +{ source: [0xB59A], NFC: [0xB59A], NFD: [0x1104, 0x1164, 0x11BD], NFKC: [0xB59A], NFKD: [0x1104, 0x1164, 0x11BD] }, +{ source: [0xB59B], NFC: [0xB59B], NFD: [0x1104, 0x1164, 0x11BE], NFKC: [0xB59B], NFKD: [0x1104, 0x1164, 0x11BE] }, +{ source: [0xB59C], NFC: [0xB59C], NFD: [0x1104, 0x1164, 0x11BF], NFKC: [0xB59C], NFKD: [0x1104, 0x1164, 0x11BF] }, +{ source: [0xB59D], NFC: [0xB59D], NFD: [0x1104, 0x1164, 0x11C0], NFKC: [0xB59D], NFKD: [0x1104, 0x1164, 0x11C0] }, +{ source: [0xB59E], NFC: [0xB59E], NFD: [0x1104, 0x1164, 0x11C1], NFKC: [0xB59E], NFKD: [0x1104, 0x1164, 0x11C1] }, +{ source: [0xB59F], NFC: [0xB59F], NFD: [0x1104, 0x1164, 0x11C2], NFKC: [0xB59F], NFKD: [0x1104, 0x1164, 0x11C2] }, +{ source: [0xB5A0], NFC: [0xB5A0], NFD: [0x1104, 0x1165], NFKC: [0xB5A0], NFKD: [0x1104, 0x1165] }, +{ source: [0xB5A1], NFC: [0xB5A1], NFD: [0x1104, 0x1165, 0x11A8], NFKC: [0xB5A1], NFKD: [0x1104, 0x1165, 0x11A8] }, +{ source: [0xB5A2], NFC: [0xB5A2], NFD: [0x1104, 0x1165, 0x11A9], NFKC: [0xB5A2], NFKD: [0x1104, 0x1165, 0x11A9] }, +{ source: [0xB5A3], NFC: [0xB5A3], NFD: [0x1104, 0x1165, 0x11AA], NFKC: [0xB5A3], NFKD: [0x1104, 0x1165, 0x11AA] }, +{ source: [0xB5A4], NFC: [0xB5A4], NFD: [0x1104, 0x1165, 0x11AB], NFKC: [0xB5A4], NFKD: [0x1104, 0x1165, 0x11AB] }, +{ source: [0xB5A5], NFC: [0xB5A5], NFD: [0x1104, 0x1165, 0x11AC], NFKC: [0xB5A5], NFKD: [0x1104, 0x1165, 0x11AC] }, +{ source: [0xB5A6], NFC: [0xB5A6], NFD: [0x1104, 0x1165, 0x11AD], NFKC: [0xB5A6], NFKD: [0x1104, 0x1165, 0x11AD] }, +{ source: [0xB5A7], NFC: [0xB5A7], NFD: [0x1104, 0x1165, 0x11AE], NFKC: [0xB5A7], NFKD: [0x1104, 0x1165, 0x11AE] }, +{ source: [0xB5A8], NFC: [0xB5A8], NFD: [0x1104, 0x1165, 0x11AF], NFKC: [0xB5A8], NFKD: [0x1104, 0x1165, 0x11AF] }, +{ source: [0xB5A9], NFC: [0xB5A9], NFD: [0x1104, 0x1165, 0x11B0], NFKC: [0xB5A9], NFKD: [0x1104, 0x1165, 0x11B0] }, +{ source: [0xB5AA], NFC: [0xB5AA], NFD: [0x1104, 0x1165, 0x11B1], NFKC: [0xB5AA], NFKD: [0x1104, 0x1165, 0x11B1] }, +{ source: [0xB5AB], NFC: [0xB5AB], NFD: [0x1104, 0x1165, 0x11B2], NFKC: [0xB5AB], NFKD: [0x1104, 0x1165, 0x11B2] }, +{ source: [0xB5AC], NFC: [0xB5AC], NFD: [0x1104, 0x1165, 0x11B3], NFKC: [0xB5AC], NFKD: [0x1104, 0x1165, 0x11B3] }, +{ source: [0xB5AD], NFC: [0xB5AD], NFD: [0x1104, 0x1165, 0x11B4], NFKC: [0xB5AD], NFKD: [0x1104, 0x1165, 0x11B4] }, +{ source: [0xB5AE], NFC: [0xB5AE], NFD: [0x1104, 0x1165, 0x11B5], NFKC: [0xB5AE], NFKD: [0x1104, 0x1165, 0x11B5] }, +{ source: [0xB5AF], NFC: [0xB5AF], NFD: [0x1104, 0x1165, 0x11B6], NFKC: [0xB5AF], NFKD: [0x1104, 0x1165, 0x11B6] }, +{ source: [0xB5B0], NFC: [0xB5B0], NFD: [0x1104, 0x1165, 0x11B7], NFKC: [0xB5B0], NFKD: [0x1104, 0x1165, 0x11B7] }, +{ source: [0xB5B1], NFC: [0xB5B1], NFD: [0x1104, 0x1165, 0x11B8], NFKC: [0xB5B1], NFKD: [0x1104, 0x1165, 0x11B8] }, +{ source: [0xB5B2], NFC: [0xB5B2], NFD: [0x1104, 0x1165, 0x11B9], NFKC: [0xB5B2], NFKD: [0x1104, 0x1165, 0x11B9] }, +{ source: [0xB5B3], NFC: [0xB5B3], NFD: [0x1104, 0x1165, 0x11BA], NFKC: [0xB5B3], NFKD: [0x1104, 0x1165, 0x11BA] }, +{ source: [0xB5B4], NFC: [0xB5B4], NFD: [0x1104, 0x1165, 0x11BB], NFKC: [0xB5B4], NFKD: [0x1104, 0x1165, 0x11BB] }, +{ source: [0xB5B5], NFC: [0xB5B5], NFD: [0x1104, 0x1165, 0x11BC], NFKC: [0xB5B5], NFKD: [0x1104, 0x1165, 0x11BC] }, +{ source: [0xB5B6], NFC: [0xB5B6], NFD: [0x1104, 0x1165, 0x11BD], NFKC: [0xB5B6], NFKD: [0x1104, 0x1165, 0x11BD] }, +{ source: [0xB5B7], NFC: [0xB5B7], NFD: [0x1104, 0x1165, 0x11BE], NFKC: [0xB5B7], NFKD: [0x1104, 0x1165, 0x11BE] }, +{ source: [0xB5B8], NFC: [0xB5B8], NFD: [0x1104, 0x1165, 0x11BF], NFKC: [0xB5B8], NFKD: [0x1104, 0x1165, 0x11BF] }, +{ source: [0xB5B9], NFC: [0xB5B9], NFD: [0x1104, 0x1165, 0x11C0], NFKC: [0xB5B9], NFKD: [0x1104, 0x1165, 0x11C0] }, +{ source: [0xB5BA], NFC: [0xB5BA], NFD: [0x1104, 0x1165, 0x11C1], NFKC: [0xB5BA], NFKD: [0x1104, 0x1165, 0x11C1] }, +{ source: [0xB5BB], NFC: [0xB5BB], NFD: [0x1104, 0x1165, 0x11C2], NFKC: [0xB5BB], NFKD: [0x1104, 0x1165, 0x11C2] }, +{ source: [0xB5BC], NFC: [0xB5BC], NFD: [0x1104, 0x1166], NFKC: [0xB5BC], NFKD: [0x1104, 0x1166] }, +{ source: [0xB5BD], NFC: [0xB5BD], NFD: [0x1104, 0x1166, 0x11A8], NFKC: [0xB5BD], NFKD: [0x1104, 0x1166, 0x11A8] }, +{ source: [0xB5BE], NFC: [0xB5BE], NFD: [0x1104, 0x1166, 0x11A9], NFKC: [0xB5BE], NFKD: [0x1104, 0x1166, 0x11A9] }, +{ source: [0xB5BF], NFC: [0xB5BF], NFD: [0x1104, 0x1166, 0x11AA], NFKC: [0xB5BF], NFKD: [0x1104, 0x1166, 0x11AA] }, +{ source: [0xB5C0], NFC: [0xB5C0], NFD: [0x1104, 0x1166, 0x11AB], NFKC: [0xB5C0], NFKD: [0x1104, 0x1166, 0x11AB] }, +{ source: [0xB5C1], NFC: [0xB5C1], NFD: [0x1104, 0x1166, 0x11AC], NFKC: [0xB5C1], NFKD: [0x1104, 0x1166, 0x11AC] }, +{ source: [0xB5C2], NFC: [0xB5C2], NFD: [0x1104, 0x1166, 0x11AD], NFKC: [0xB5C2], NFKD: [0x1104, 0x1166, 0x11AD] }, +{ source: [0xB5C3], NFC: [0xB5C3], NFD: [0x1104, 0x1166, 0x11AE], NFKC: [0xB5C3], NFKD: [0x1104, 0x1166, 0x11AE] }, +{ source: [0xB5C4], NFC: [0xB5C4], NFD: [0x1104, 0x1166, 0x11AF], NFKC: [0xB5C4], NFKD: [0x1104, 0x1166, 0x11AF] }, +{ source: [0xB5C5], NFC: [0xB5C5], NFD: [0x1104, 0x1166, 0x11B0], NFKC: [0xB5C5], NFKD: [0x1104, 0x1166, 0x11B0] }, +{ source: [0xB5C6], NFC: [0xB5C6], NFD: [0x1104, 0x1166, 0x11B1], NFKC: [0xB5C6], NFKD: [0x1104, 0x1166, 0x11B1] }, +{ source: [0xB5C7], NFC: [0xB5C7], NFD: [0x1104, 0x1166, 0x11B2], NFKC: [0xB5C7], NFKD: [0x1104, 0x1166, 0x11B2] }, +{ source: [0xB5C8], NFC: [0xB5C8], NFD: [0x1104, 0x1166, 0x11B3], NFKC: [0xB5C8], NFKD: [0x1104, 0x1166, 0x11B3] }, +{ source: [0xB5C9], NFC: [0xB5C9], NFD: [0x1104, 0x1166, 0x11B4], NFKC: [0xB5C9], NFKD: [0x1104, 0x1166, 0x11B4] }, +{ source: [0xB5CA], NFC: [0xB5CA], NFD: [0x1104, 0x1166, 0x11B5], NFKC: [0xB5CA], NFKD: [0x1104, 0x1166, 0x11B5] }, +{ source: [0xB5CB], NFC: [0xB5CB], NFD: [0x1104, 0x1166, 0x11B6], NFKC: [0xB5CB], NFKD: [0x1104, 0x1166, 0x11B6] }, +{ source: [0xB5CC], NFC: [0xB5CC], NFD: [0x1104, 0x1166, 0x11B7], NFKC: [0xB5CC], NFKD: [0x1104, 0x1166, 0x11B7] }, +{ source: [0xB5CD], NFC: [0xB5CD], NFD: [0x1104, 0x1166, 0x11B8], NFKC: [0xB5CD], NFKD: [0x1104, 0x1166, 0x11B8] }, +{ source: [0xB5CE], NFC: [0xB5CE], NFD: [0x1104, 0x1166, 0x11B9], NFKC: [0xB5CE], NFKD: [0x1104, 0x1166, 0x11B9] }, +{ source: [0xB5CF], NFC: [0xB5CF], NFD: [0x1104, 0x1166, 0x11BA], NFKC: [0xB5CF], NFKD: [0x1104, 0x1166, 0x11BA] }, +{ source: [0xB5D0], NFC: [0xB5D0], NFD: [0x1104, 0x1166, 0x11BB], NFKC: [0xB5D0], NFKD: [0x1104, 0x1166, 0x11BB] }, +{ source: [0xB5D1], NFC: [0xB5D1], NFD: [0x1104, 0x1166, 0x11BC], NFKC: [0xB5D1], NFKD: [0x1104, 0x1166, 0x11BC] }, +{ source: [0xB5D2], NFC: [0xB5D2], NFD: [0x1104, 0x1166, 0x11BD], NFKC: [0xB5D2], NFKD: [0x1104, 0x1166, 0x11BD] }, +{ source: [0xB5D3], NFC: [0xB5D3], NFD: [0x1104, 0x1166, 0x11BE], NFKC: [0xB5D3], NFKD: [0x1104, 0x1166, 0x11BE] }, +{ source: [0xB5D4], NFC: [0xB5D4], NFD: [0x1104, 0x1166, 0x11BF], NFKC: [0xB5D4], NFKD: [0x1104, 0x1166, 0x11BF] }, +{ source: [0xB5D5], NFC: [0xB5D5], NFD: [0x1104, 0x1166, 0x11C0], NFKC: [0xB5D5], NFKD: [0x1104, 0x1166, 0x11C0] }, +{ source: [0xB5D6], NFC: [0xB5D6], NFD: [0x1104, 0x1166, 0x11C1], NFKC: [0xB5D6], NFKD: [0x1104, 0x1166, 0x11C1] }, +{ source: [0xB5D7], NFC: [0xB5D7], NFD: [0x1104, 0x1166, 0x11C2], NFKC: [0xB5D7], NFKD: [0x1104, 0x1166, 0x11C2] }, +{ source: [0xB5D8], NFC: [0xB5D8], NFD: [0x1104, 0x1167], NFKC: [0xB5D8], NFKD: [0x1104, 0x1167] }, +{ source: [0xB5D9], NFC: [0xB5D9], NFD: [0x1104, 0x1167, 0x11A8], NFKC: [0xB5D9], NFKD: [0x1104, 0x1167, 0x11A8] }, +{ source: [0xB5DA], NFC: [0xB5DA], NFD: [0x1104, 0x1167, 0x11A9], NFKC: [0xB5DA], NFKD: [0x1104, 0x1167, 0x11A9] }, +{ source: [0xB5DB], NFC: [0xB5DB], NFD: [0x1104, 0x1167, 0x11AA], NFKC: [0xB5DB], NFKD: [0x1104, 0x1167, 0x11AA] }, +{ source: [0xB5DC], NFC: [0xB5DC], NFD: [0x1104, 0x1167, 0x11AB], NFKC: [0xB5DC], NFKD: [0x1104, 0x1167, 0x11AB] }, +{ source: [0xB5DD], NFC: [0xB5DD], NFD: [0x1104, 0x1167, 0x11AC], NFKC: [0xB5DD], NFKD: [0x1104, 0x1167, 0x11AC] }, +{ source: [0xB5DE], NFC: [0xB5DE], NFD: [0x1104, 0x1167, 0x11AD], NFKC: [0xB5DE], NFKD: [0x1104, 0x1167, 0x11AD] }, +{ source: [0xB5DF], NFC: [0xB5DF], NFD: [0x1104, 0x1167, 0x11AE], NFKC: [0xB5DF], NFKD: [0x1104, 0x1167, 0x11AE] }, +{ source: [0xB5E0], NFC: [0xB5E0], NFD: [0x1104, 0x1167, 0x11AF], NFKC: [0xB5E0], NFKD: [0x1104, 0x1167, 0x11AF] }, +{ source: [0xB5E1], NFC: [0xB5E1], NFD: [0x1104, 0x1167, 0x11B0], NFKC: [0xB5E1], NFKD: [0x1104, 0x1167, 0x11B0] }, +{ source: [0xB5E2], NFC: [0xB5E2], NFD: [0x1104, 0x1167, 0x11B1], NFKC: [0xB5E2], NFKD: [0x1104, 0x1167, 0x11B1] }, +{ source: [0xB5E3], NFC: [0xB5E3], NFD: [0x1104, 0x1167, 0x11B2], NFKC: [0xB5E3], NFKD: [0x1104, 0x1167, 0x11B2] }, +{ source: [0xB5E4], NFC: [0xB5E4], NFD: [0x1104, 0x1167, 0x11B3], NFKC: [0xB5E4], NFKD: [0x1104, 0x1167, 0x11B3] }, +{ source: [0xB5E5], NFC: [0xB5E5], NFD: [0x1104, 0x1167, 0x11B4], NFKC: [0xB5E5], NFKD: [0x1104, 0x1167, 0x11B4] }, +{ source: [0xB5E6], NFC: [0xB5E6], NFD: [0x1104, 0x1167, 0x11B5], NFKC: [0xB5E6], NFKD: [0x1104, 0x1167, 0x11B5] }, +{ source: [0xB5E7], NFC: [0xB5E7], NFD: [0x1104, 0x1167, 0x11B6], NFKC: [0xB5E7], NFKD: [0x1104, 0x1167, 0x11B6] }, +{ source: [0xB5E8], NFC: [0xB5E8], NFD: [0x1104, 0x1167, 0x11B7], NFKC: [0xB5E8], NFKD: [0x1104, 0x1167, 0x11B7] }, +{ source: [0xB5E9], NFC: [0xB5E9], NFD: [0x1104, 0x1167, 0x11B8], NFKC: [0xB5E9], NFKD: [0x1104, 0x1167, 0x11B8] }, +{ source: [0xB5EA], NFC: [0xB5EA], NFD: [0x1104, 0x1167, 0x11B9], NFKC: [0xB5EA], NFKD: [0x1104, 0x1167, 0x11B9] }, +{ source: [0xB5EB], NFC: [0xB5EB], NFD: [0x1104, 0x1167, 0x11BA], NFKC: [0xB5EB], NFKD: [0x1104, 0x1167, 0x11BA] }, +{ source: [0xB5EC], NFC: [0xB5EC], NFD: [0x1104, 0x1167, 0x11BB], NFKC: [0xB5EC], NFKD: [0x1104, 0x1167, 0x11BB] }, +{ source: [0xB5ED], NFC: [0xB5ED], NFD: [0x1104, 0x1167, 0x11BC], NFKC: [0xB5ED], NFKD: [0x1104, 0x1167, 0x11BC] }, +{ source: [0xB5EE], NFC: [0xB5EE], NFD: [0x1104, 0x1167, 0x11BD], NFKC: [0xB5EE], NFKD: [0x1104, 0x1167, 0x11BD] }, +{ source: [0xB5EF], NFC: [0xB5EF], NFD: [0x1104, 0x1167, 0x11BE], NFKC: [0xB5EF], NFKD: [0x1104, 0x1167, 0x11BE] }, +{ source: [0xB5F0], NFC: [0xB5F0], NFD: [0x1104, 0x1167, 0x11BF], NFKC: [0xB5F0], NFKD: [0x1104, 0x1167, 0x11BF] }, +{ source: [0xB5F1], NFC: [0xB5F1], NFD: [0x1104, 0x1167, 0x11C0], NFKC: [0xB5F1], NFKD: [0x1104, 0x1167, 0x11C0] }, +{ source: [0xB5F2], NFC: [0xB5F2], NFD: [0x1104, 0x1167, 0x11C1], NFKC: [0xB5F2], NFKD: [0x1104, 0x1167, 0x11C1] }, +{ source: [0xB5F3], NFC: [0xB5F3], NFD: [0x1104, 0x1167, 0x11C2], NFKC: [0xB5F3], NFKD: [0x1104, 0x1167, 0x11C2] }, +{ source: [0xB5F4], NFC: [0xB5F4], NFD: [0x1104, 0x1168], NFKC: [0xB5F4], NFKD: [0x1104, 0x1168] }, +{ source: [0xB5F5], NFC: [0xB5F5], NFD: [0x1104, 0x1168, 0x11A8], NFKC: [0xB5F5], NFKD: [0x1104, 0x1168, 0x11A8] }, +{ source: [0xB5F6], NFC: [0xB5F6], NFD: [0x1104, 0x1168, 0x11A9], NFKC: [0xB5F6], NFKD: [0x1104, 0x1168, 0x11A9] }, +{ source: [0xB5F7], NFC: [0xB5F7], NFD: [0x1104, 0x1168, 0x11AA], NFKC: [0xB5F7], NFKD: [0x1104, 0x1168, 0x11AA] }, +{ source: [0xB5F8], NFC: [0xB5F8], NFD: [0x1104, 0x1168, 0x11AB], NFKC: [0xB5F8], NFKD: [0x1104, 0x1168, 0x11AB] }, +{ source: [0xB5F9], NFC: [0xB5F9], NFD: [0x1104, 0x1168, 0x11AC], NFKC: [0xB5F9], NFKD: [0x1104, 0x1168, 0x11AC] }, +{ source: [0xB5FA], NFC: [0xB5FA], NFD: [0x1104, 0x1168, 0x11AD], NFKC: [0xB5FA], NFKD: [0x1104, 0x1168, 0x11AD] }, +{ source: [0xB5FB], NFC: [0xB5FB], NFD: [0x1104, 0x1168, 0x11AE], NFKC: [0xB5FB], NFKD: [0x1104, 0x1168, 0x11AE] }, +{ source: [0xB5FC], NFC: [0xB5FC], NFD: [0x1104, 0x1168, 0x11AF], NFKC: [0xB5FC], NFKD: [0x1104, 0x1168, 0x11AF] }, +{ source: [0xB5FD], NFC: [0xB5FD], NFD: [0x1104, 0x1168, 0x11B0], NFKC: [0xB5FD], NFKD: [0x1104, 0x1168, 0x11B0] }, +{ source: [0xB5FE], NFC: [0xB5FE], NFD: [0x1104, 0x1168, 0x11B1], NFKC: [0xB5FE], NFKD: [0x1104, 0x1168, 0x11B1] }, +{ source: [0xB5FF], NFC: [0xB5FF], NFD: [0x1104, 0x1168, 0x11B2], NFKC: [0xB5FF], NFKD: [0x1104, 0x1168, 0x11B2] }, +{ source: [0xB600], NFC: [0xB600], NFD: [0x1104, 0x1168, 0x11B3], NFKC: [0xB600], NFKD: [0x1104, 0x1168, 0x11B3] }, +{ source: [0xB601], NFC: [0xB601], NFD: [0x1104, 0x1168, 0x11B4], NFKC: [0xB601], NFKD: [0x1104, 0x1168, 0x11B4] }, +{ source: [0xB602], NFC: [0xB602], NFD: [0x1104, 0x1168, 0x11B5], NFKC: [0xB602], NFKD: [0x1104, 0x1168, 0x11B5] }, +{ source: [0xB603], NFC: [0xB603], NFD: [0x1104, 0x1168, 0x11B6], NFKC: [0xB603], NFKD: [0x1104, 0x1168, 0x11B6] }, +{ source: [0xB604], NFC: [0xB604], NFD: [0x1104, 0x1168, 0x11B7], NFKC: [0xB604], NFKD: [0x1104, 0x1168, 0x11B7] }, +{ source: [0xB605], NFC: [0xB605], NFD: [0x1104, 0x1168, 0x11B8], NFKC: [0xB605], NFKD: [0x1104, 0x1168, 0x11B8] }, +{ source: [0xB606], NFC: [0xB606], NFD: [0x1104, 0x1168, 0x11B9], NFKC: [0xB606], NFKD: [0x1104, 0x1168, 0x11B9] }, +{ source: [0xB607], NFC: [0xB607], NFD: [0x1104, 0x1168, 0x11BA], NFKC: [0xB607], NFKD: [0x1104, 0x1168, 0x11BA] }, +{ source: [0xB608], NFC: [0xB608], NFD: [0x1104, 0x1168, 0x11BB], NFKC: [0xB608], NFKD: [0x1104, 0x1168, 0x11BB] }, +{ source: [0xB609], NFC: [0xB609], NFD: [0x1104, 0x1168, 0x11BC], NFKC: [0xB609], NFKD: [0x1104, 0x1168, 0x11BC] }, +{ source: [0xB60A], NFC: [0xB60A], NFD: [0x1104, 0x1168, 0x11BD], NFKC: [0xB60A], NFKD: [0x1104, 0x1168, 0x11BD] }, +{ source: [0xB60B], NFC: [0xB60B], NFD: [0x1104, 0x1168, 0x11BE], NFKC: [0xB60B], NFKD: [0x1104, 0x1168, 0x11BE] }, +{ source: [0xB60C], NFC: [0xB60C], NFD: [0x1104, 0x1168, 0x11BF], NFKC: [0xB60C], NFKD: [0x1104, 0x1168, 0x11BF] }, +{ source: [0xB60D], NFC: [0xB60D], NFD: [0x1104, 0x1168, 0x11C0], NFKC: [0xB60D], NFKD: [0x1104, 0x1168, 0x11C0] }, +{ source: [0xB60E], NFC: [0xB60E], NFD: [0x1104, 0x1168, 0x11C1], NFKC: [0xB60E], NFKD: [0x1104, 0x1168, 0x11C1] }, +{ source: [0xB60F], NFC: [0xB60F], NFD: [0x1104, 0x1168, 0x11C2], NFKC: [0xB60F], NFKD: [0x1104, 0x1168, 0x11C2] }, +{ source: [0xB610], NFC: [0xB610], NFD: [0x1104, 0x1169], NFKC: [0xB610], NFKD: [0x1104, 0x1169] }, +{ source: [0xB611], NFC: [0xB611], NFD: [0x1104, 0x1169, 0x11A8], NFKC: [0xB611], NFKD: [0x1104, 0x1169, 0x11A8] }, +{ source: [0xB612], NFC: [0xB612], NFD: [0x1104, 0x1169, 0x11A9], NFKC: [0xB612], NFKD: [0x1104, 0x1169, 0x11A9] }, +{ source: [0xB613], NFC: [0xB613], NFD: [0x1104, 0x1169, 0x11AA], NFKC: [0xB613], NFKD: [0x1104, 0x1169, 0x11AA] }, +{ source: [0xB614], NFC: [0xB614], NFD: [0x1104, 0x1169, 0x11AB], NFKC: [0xB614], NFKD: [0x1104, 0x1169, 0x11AB] }, +{ source: [0xB615], NFC: [0xB615], NFD: [0x1104, 0x1169, 0x11AC], NFKC: [0xB615], NFKD: [0x1104, 0x1169, 0x11AC] }, +{ source: [0xB616], NFC: [0xB616], NFD: [0x1104, 0x1169, 0x11AD], NFKC: [0xB616], NFKD: [0x1104, 0x1169, 0x11AD] }, +{ source: [0xB617], NFC: [0xB617], NFD: [0x1104, 0x1169, 0x11AE], NFKC: [0xB617], NFKD: [0x1104, 0x1169, 0x11AE] }, +{ source: [0xB618], NFC: [0xB618], NFD: [0x1104, 0x1169, 0x11AF], NFKC: [0xB618], NFKD: [0x1104, 0x1169, 0x11AF] }, +{ source: [0xB619], NFC: [0xB619], NFD: [0x1104, 0x1169, 0x11B0], NFKC: [0xB619], NFKD: [0x1104, 0x1169, 0x11B0] }, +{ source: [0xB61A], NFC: [0xB61A], NFD: [0x1104, 0x1169, 0x11B1], NFKC: [0xB61A], NFKD: [0x1104, 0x1169, 0x11B1] }, +{ source: [0xB61B], NFC: [0xB61B], NFD: [0x1104, 0x1169, 0x11B2], NFKC: [0xB61B], NFKD: [0x1104, 0x1169, 0x11B2] }, +{ source: [0xB61C], NFC: [0xB61C], NFD: [0x1104, 0x1169, 0x11B3], NFKC: [0xB61C], NFKD: [0x1104, 0x1169, 0x11B3] }, +{ source: [0xB61D], NFC: [0xB61D], NFD: [0x1104, 0x1169, 0x11B4], NFKC: [0xB61D], NFKD: [0x1104, 0x1169, 0x11B4] }, +{ source: [0xB61E], NFC: [0xB61E], NFD: [0x1104, 0x1169, 0x11B5], NFKC: [0xB61E], NFKD: [0x1104, 0x1169, 0x11B5] }, +{ source: [0xB61F], NFC: [0xB61F], NFD: [0x1104, 0x1169, 0x11B6], NFKC: [0xB61F], NFKD: [0x1104, 0x1169, 0x11B6] }, +{ source: [0xB620], NFC: [0xB620], NFD: [0x1104, 0x1169, 0x11B7], NFKC: [0xB620], NFKD: [0x1104, 0x1169, 0x11B7] }, +{ source: [0xB621], NFC: [0xB621], NFD: [0x1104, 0x1169, 0x11B8], NFKC: [0xB621], NFKD: [0x1104, 0x1169, 0x11B8] }, +{ source: [0xB622], NFC: [0xB622], NFD: [0x1104, 0x1169, 0x11B9], NFKC: [0xB622], NFKD: [0x1104, 0x1169, 0x11B9] }, +{ source: [0xB623], NFC: [0xB623], NFD: [0x1104, 0x1169, 0x11BA], NFKC: [0xB623], NFKD: [0x1104, 0x1169, 0x11BA] }, +{ source: [0xB624], NFC: [0xB624], NFD: [0x1104, 0x1169, 0x11BB], NFKC: [0xB624], NFKD: [0x1104, 0x1169, 0x11BB] }, +{ source: [0xB625], NFC: [0xB625], NFD: [0x1104, 0x1169, 0x11BC], NFKC: [0xB625], NFKD: [0x1104, 0x1169, 0x11BC] }, +{ source: [0xB626], NFC: [0xB626], NFD: [0x1104, 0x1169, 0x11BD], NFKC: [0xB626], NFKD: [0x1104, 0x1169, 0x11BD] }, +{ source: [0xB627], NFC: [0xB627], NFD: [0x1104, 0x1169, 0x11BE], NFKC: [0xB627], NFKD: [0x1104, 0x1169, 0x11BE] }, +{ source: [0xB628], NFC: [0xB628], NFD: [0x1104, 0x1169, 0x11BF], NFKC: [0xB628], NFKD: [0x1104, 0x1169, 0x11BF] }, +{ source: [0xB629], NFC: [0xB629], NFD: [0x1104, 0x1169, 0x11C0], NFKC: [0xB629], NFKD: [0x1104, 0x1169, 0x11C0] }, +{ source: [0xB62A], NFC: [0xB62A], NFD: [0x1104, 0x1169, 0x11C1], NFKC: [0xB62A], NFKD: [0x1104, 0x1169, 0x11C1] }, +{ source: [0xB62B], NFC: [0xB62B], NFD: [0x1104, 0x1169, 0x11C2], NFKC: [0xB62B], NFKD: [0x1104, 0x1169, 0x11C2] }, +{ source: [0xB62C], NFC: [0xB62C], NFD: [0x1104, 0x116A], NFKC: [0xB62C], NFKD: [0x1104, 0x116A] }, +{ source: [0xB62D], NFC: [0xB62D], NFD: [0x1104, 0x116A, 0x11A8], NFKC: [0xB62D], NFKD: [0x1104, 0x116A, 0x11A8] }, +{ source: [0xB62E], NFC: [0xB62E], NFD: [0x1104, 0x116A, 0x11A9], NFKC: [0xB62E], NFKD: [0x1104, 0x116A, 0x11A9] }, +{ source: [0xB62F], NFC: [0xB62F], NFD: [0x1104, 0x116A, 0x11AA], NFKC: [0xB62F], NFKD: [0x1104, 0x116A, 0x11AA] }, +{ source: [0xB630], NFC: [0xB630], NFD: [0x1104, 0x116A, 0x11AB], NFKC: [0xB630], NFKD: [0x1104, 0x116A, 0x11AB] }, +{ source: [0xB631], NFC: [0xB631], NFD: [0x1104, 0x116A, 0x11AC], NFKC: [0xB631], NFKD: [0x1104, 0x116A, 0x11AC] }, +{ source: [0xB632], NFC: [0xB632], NFD: [0x1104, 0x116A, 0x11AD], NFKC: [0xB632], NFKD: [0x1104, 0x116A, 0x11AD] }, +{ source: [0xB633], NFC: [0xB633], NFD: [0x1104, 0x116A, 0x11AE], NFKC: [0xB633], NFKD: [0x1104, 0x116A, 0x11AE] }, +{ source: [0xB634], NFC: [0xB634], NFD: [0x1104, 0x116A, 0x11AF], NFKC: [0xB634], NFKD: [0x1104, 0x116A, 0x11AF] }, +{ source: [0xB635], NFC: [0xB635], NFD: [0x1104, 0x116A, 0x11B0], NFKC: [0xB635], NFKD: [0x1104, 0x116A, 0x11B0] }, +{ source: [0xB636], NFC: [0xB636], NFD: [0x1104, 0x116A, 0x11B1], NFKC: [0xB636], NFKD: [0x1104, 0x116A, 0x11B1] }, +{ source: [0xB637], NFC: [0xB637], NFD: [0x1104, 0x116A, 0x11B2], NFKC: [0xB637], NFKD: [0x1104, 0x116A, 0x11B2] }, +{ source: [0xB638], NFC: [0xB638], NFD: [0x1104, 0x116A, 0x11B3], NFKC: [0xB638], NFKD: [0x1104, 0x116A, 0x11B3] }, +{ source: [0xB639], NFC: [0xB639], NFD: [0x1104, 0x116A, 0x11B4], NFKC: [0xB639], NFKD: [0x1104, 0x116A, 0x11B4] }, +{ source: [0xB63A], NFC: [0xB63A], NFD: [0x1104, 0x116A, 0x11B5], NFKC: [0xB63A], NFKD: [0x1104, 0x116A, 0x11B5] }, +{ source: [0xB63B], NFC: [0xB63B], NFD: [0x1104, 0x116A, 0x11B6], NFKC: [0xB63B], NFKD: [0x1104, 0x116A, 0x11B6] }, +{ source: [0xB63C], NFC: [0xB63C], NFD: [0x1104, 0x116A, 0x11B7], NFKC: [0xB63C], NFKD: [0x1104, 0x116A, 0x11B7] }, +{ source: [0xB63D], NFC: [0xB63D], NFD: [0x1104, 0x116A, 0x11B8], NFKC: [0xB63D], NFKD: [0x1104, 0x116A, 0x11B8] }, +{ source: [0xB63E], NFC: [0xB63E], NFD: [0x1104, 0x116A, 0x11B9], NFKC: [0xB63E], NFKD: [0x1104, 0x116A, 0x11B9] }, +{ source: [0xB63F], NFC: [0xB63F], NFD: [0x1104, 0x116A, 0x11BA], NFKC: [0xB63F], NFKD: [0x1104, 0x116A, 0x11BA] }, +{ source: [0xB640], NFC: [0xB640], NFD: [0x1104, 0x116A, 0x11BB], NFKC: [0xB640], NFKD: [0x1104, 0x116A, 0x11BB] }, +{ source: [0xB641], NFC: [0xB641], NFD: [0x1104, 0x116A, 0x11BC], NFKC: [0xB641], NFKD: [0x1104, 0x116A, 0x11BC] }, +{ source: [0xB642], NFC: [0xB642], NFD: [0x1104, 0x116A, 0x11BD], NFKC: [0xB642], NFKD: [0x1104, 0x116A, 0x11BD] }, +{ source: [0xB643], NFC: [0xB643], NFD: [0x1104, 0x116A, 0x11BE], NFKC: [0xB643], NFKD: [0x1104, 0x116A, 0x11BE] }, +{ source: [0xB644], NFC: [0xB644], NFD: [0x1104, 0x116A, 0x11BF], NFKC: [0xB644], NFKD: [0x1104, 0x116A, 0x11BF] }, +{ source: [0xB645], NFC: [0xB645], NFD: [0x1104, 0x116A, 0x11C0], NFKC: [0xB645], NFKD: [0x1104, 0x116A, 0x11C0] }, +{ source: [0xB646], NFC: [0xB646], NFD: [0x1104, 0x116A, 0x11C1], NFKC: [0xB646], NFKD: [0x1104, 0x116A, 0x11C1] }, +{ source: [0xB647], NFC: [0xB647], NFD: [0x1104, 0x116A, 0x11C2], NFKC: [0xB647], NFKD: [0x1104, 0x116A, 0x11C2] }, +{ source: [0xB648], NFC: [0xB648], NFD: [0x1104, 0x116B], NFKC: [0xB648], NFKD: [0x1104, 0x116B] }, +{ source: [0xB649], NFC: [0xB649], NFD: [0x1104, 0x116B, 0x11A8], NFKC: [0xB649], NFKD: [0x1104, 0x116B, 0x11A8] }, +{ source: [0xB64A], NFC: [0xB64A], NFD: [0x1104, 0x116B, 0x11A9], NFKC: [0xB64A], NFKD: [0x1104, 0x116B, 0x11A9] }, +{ source: [0xB64B], NFC: [0xB64B], NFD: [0x1104, 0x116B, 0x11AA], NFKC: [0xB64B], NFKD: [0x1104, 0x116B, 0x11AA] }, +{ source: [0xB64C], NFC: [0xB64C], NFD: [0x1104, 0x116B, 0x11AB], NFKC: [0xB64C], NFKD: [0x1104, 0x116B, 0x11AB] }, +{ source: [0xB64D], NFC: [0xB64D], NFD: [0x1104, 0x116B, 0x11AC], NFKC: [0xB64D], NFKD: [0x1104, 0x116B, 0x11AC] }, +{ source: [0xB64E], NFC: [0xB64E], NFD: [0x1104, 0x116B, 0x11AD], NFKC: [0xB64E], NFKD: [0x1104, 0x116B, 0x11AD] }, +{ source: [0xB64F], NFC: [0xB64F], NFD: [0x1104, 0x116B, 0x11AE], NFKC: [0xB64F], NFKD: [0x1104, 0x116B, 0x11AE] }, +{ source: [0xB650], NFC: [0xB650], NFD: [0x1104, 0x116B, 0x11AF], NFKC: [0xB650], NFKD: [0x1104, 0x116B, 0x11AF] }, +{ source: [0xB651], NFC: [0xB651], NFD: [0x1104, 0x116B, 0x11B0], NFKC: [0xB651], NFKD: [0x1104, 0x116B, 0x11B0] }, +{ source: [0xB652], NFC: [0xB652], NFD: [0x1104, 0x116B, 0x11B1], NFKC: [0xB652], NFKD: [0x1104, 0x116B, 0x11B1] }, +{ source: [0xB653], NFC: [0xB653], NFD: [0x1104, 0x116B, 0x11B2], NFKC: [0xB653], NFKD: [0x1104, 0x116B, 0x11B2] }, +{ source: [0xB654], NFC: [0xB654], NFD: [0x1104, 0x116B, 0x11B3], NFKC: [0xB654], NFKD: [0x1104, 0x116B, 0x11B3] }, +{ source: [0xB655], NFC: [0xB655], NFD: [0x1104, 0x116B, 0x11B4], NFKC: [0xB655], NFKD: [0x1104, 0x116B, 0x11B4] }, +{ source: [0xB656], NFC: [0xB656], NFD: [0x1104, 0x116B, 0x11B5], NFKC: [0xB656], NFKD: [0x1104, 0x116B, 0x11B5] }, +{ source: [0xB657], NFC: [0xB657], NFD: [0x1104, 0x116B, 0x11B6], NFKC: [0xB657], NFKD: [0x1104, 0x116B, 0x11B6] }, +{ source: [0xB658], NFC: [0xB658], NFD: [0x1104, 0x116B, 0x11B7], NFKC: [0xB658], NFKD: [0x1104, 0x116B, 0x11B7] }, +{ source: [0xB659], NFC: [0xB659], NFD: [0x1104, 0x116B, 0x11B8], NFKC: [0xB659], NFKD: [0x1104, 0x116B, 0x11B8] }, +{ source: [0xB65A], NFC: [0xB65A], NFD: [0x1104, 0x116B, 0x11B9], NFKC: [0xB65A], NFKD: [0x1104, 0x116B, 0x11B9] }, +{ source: [0xB65B], NFC: [0xB65B], NFD: [0x1104, 0x116B, 0x11BA], NFKC: [0xB65B], NFKD: [0x1104, 0x116B, 0x11BA] }, +{ source: [0xB65C], NFC: [0xB65C], NFD: [0x1104, 0x116B, 0x11BB], NFKC: [0xB65C], NFKD: [0x1104, 0x116B, 0x11BB] }, +{ source: [0xB65D], NFC: [0xB65D], NFD: [0x1104, 0x116B, 0x11BC], NFKC: [0xB65D], NFKD: [0x1104, 0x116B, 0x11BC] }, +{ source: [0xB65E], NFC: [0xB65E], NFD: [0x1104, 0x116B, 0x11BD], NFKC: [0xB65E], NFKD: [0x1104, 0x116B, 0x11BD] }, +{ source: [0xB65F], NFC: [0xB65F], NFD: [0x1104, 0x116B, 0x11BE], NFKC: [0xB65F], NFKD: [0x1104, 0x116B, 0x11BE] }, +{ source: [0xB660], NFC: [0xB660], NFD: [0x1104, 0x116B, 0x11BF], NFKC: [0xB660], NFKD: [0x1104, 0x116B, 0x11BF] }, +{ source: [0xB661], NFC: [0xB661], NFD: [0x1104, 0x116B, 0x11C0], NFKC: [0xB661], NFKD: [0x1104, 0x116B, 0x11C0] }, +{ source: [0xB662], NFC: [0xB662], NFD: [0x1104, 0x116B, 0x11C1], NFKC: [0xB662], NFKD: [0x1104, 0x116B, 0x11C1] }, +{ source: [0xB663], NFC: [0xB663], NFD: [0x1104, 0x116B, 0x11C2], NFKC: [0xB663], NFKD: [0x1104, 0x116B, 0x11C2] }, +{ source: [0xB664], NFC: [0xB664], NFD: [0x1104, 0x116C], NFKC: [0xB664], NFKD: [0x1104, 0x116C] }, +{ source: [0xB665], NFC: [0xB665], NFD: [0x1104, 0x116C, 0x11A8], NFKC: [0xB665], NFKD: [0x1104, 0x116C, 0x11A8] }, +{ source: [0xB666], NFC: [0xB666], NFD: [0x1104, 0x116C, 0x11A9], NFKC: [0xB666], NFKD: [0x1104, 0x116C, 0x11A9] }, +{ source: [0xB667], NFC: [0xB667], NFD: [0x1104, 0x116C, 0x11AA], NFKC: [0xB667], NFKD: [0x1104, 0x116C, 0x11AA] }, +{ source: [0xB668], NFC: [0xB668], NFD: [0x1104, 0x116C, 0x11AB], NFKC: [0xB668], NFKD: [0x1104, 0x116C, 0x11AB] }, +{ source: [0xB669], NFC: [0xB669], NFD: [0x1104, 0x116C, 0x11AC], NFKC: [0xB669], NFKD: [0x1104, 0x116C, 0x11AC] }, +{ source: [0xB66A], NFC: [0xB66A], NFD: [0x1104, 0x116C, 0x11AD], NFKC: [0xB66A], NFKD: [0x1104, 0x116C, 0x11AD] }, +{ source: [0xB66B], NFC: [0xB66B], NFD: [0x1104, 0x116C, 0x11AE], NFKC: [0xB66B], NFKD: [0x1104, 0x116C, 0x11AE] }, +{ source: [0xB66C], NFC: [0xB66C], NFD: [0x1104, 0x116C, 0x11AF], NFKC: [0xB66C], NFKD: [0x1104, 0x116C, 0x11AF] }, +{ source: [0xB66D], NFC: [0xB66D], NFD: [0x1104, 0x116C, 0x11B0], NFKC: [0xB66D], NFKD: [0x1104, 0x116C, 0x11B0] }, +{ source: [0xB66E], NFC: [0xB66E], NFD: [0x1104, 0x116C, 0x11B1], NFKC: [0xB66E], NFKD: [0x1104, 0x116C, 0x11B1] }, +{ source: [0xB66F], NFC: [0xB66F], NFD: [0x1104, 0x116C, 0x11B2], NFKC: [0xB66F], NFKD: [0x1104, 0x116C, 0x11B2] }, +{ source: [0xB670], NFC: [0xB670], NFD: [0x1104, 0x116C, 0x11B3], NFKC: [0xB670], NFKD: [0x1104, 0x116C, 0x11B3] }, +{ source: [0xB671], NFC: [0xB671], NFD: [0x1104, 0x116C, 0x11B4], NFKC: [0xB671], NFKD: [0x1104, 0x116C, 0x11B4] }, +{ source: [0xB672], NFC: [0xB672], NFD: [0x1104, 0x116C, 0x11B5], NFKC: [0xB672], NFKD: [0x1104, 0x116C, 0x11B5] }, +{ source: [0xB673], NFC: [0xB673], NFD: [0x1104, 0x116C, 0x11B6], NFKC: [0xB673], NFKD: [0x1104, 0x116C, 0x11B6] }, +{ source: [0xB674], NFC: [0xB674], NFD: [0x1104, 0x116C, 0x11B7], NFKC: [0xB674], NFKD: [0x1104, 0x116C, 0x11B7] }, +{ source: [0xB675], NFC: [0xB675], NFD: [0x1104, 0x116C, 0x11B8], NFKC: [0xB675], NFKD: [0x1104, 0x116C, 0x11B8] }, +{ source: [0xB676], NFC: [0xB676], NFD: [0x1104, 0x116C, 0x11B9], NFKC: [0xB676], NFKD: [0x1104, 0x116C, 0x11B9] }, +{ source: [0xB677], NFC: [0xB677], NFD: [0x1104, 0x116C, 0x11BA], NFKC: [0xB677], NFKD: [0x1104, 0x116C, 0x11BA] }, +{ source: [0xB678], NFC: [0xB678], NFD: [0x1104, 0x116C, 0x11BB], NFKC: [0xB678], NFKD: [0x1104, 0x116C, 0x11BB] }, +{ source: [0xB679], NFC: [0xB679], NFD: [0x1104, 0x116C, 0x11BC], NFKC: [0xB679], NFKD: [0x1104, 0x116C, 0x11BC] }, +{ source: [0xB67A], NFC: [0xB67A], NFD: [0x1104, 0x116C, 0x11BD], NFKC: [0xB67A], NFKD: [0x1104, 0x116C, 0x11BD] }, +{ source: [0xB67B], NFC: [0xB67B], NFD: [0x1104, 0x116C, 0x11BE], NFKC: [0xB67B], NFKD: [0x1104, 0x116C, 0x11BE] }, +{ source: [0xB67C], NFC: [0xB67C], NFD: [0x1104, 0x116C, 0x11BF], NFKC: [0xB67C], NFKD: [0x1104, 0x116C, 0x11BF] }, +{ source: [0xB67D], NFC: [0xB67D], NFD: [0x1104, 0x116C, 0x11C0], NFKC: [0xB67D], NFKD: [0x1104, 0x116C, 0x11C0] }, +{ source: [0xB67E], NFC: [0xB67E], NFD: [0x1104, 0x116C, 0x11C1], NFKC: [0xB67E], NFKD: [0x1104, 0x116C, 0x11C1] }, +{ source: [0xB67F], NFC: [0xB67F], NFD: [0x1104, 0x116C, 0x11C2], NFKC: [0xB67F], NFKD: [0x1104, 0x116C, 0x11C2] }, +{ source: [0xB680], NFC: [0xB680], NFD: [0x1104, 0x116D], NFKC: [0xB680], NFKD: [0x1104, 0x116D] }, +{ source: [0xB681], NFC: [0xB681], NFD: [0x1104, 0x116D, 0x11A8], NFKC: [0xB681], NFKD: [0x1104, 0x116D, 0x11A8] }, +{ source: [0xB682], NFC: [0xB682], NFD: [0x1104, 0x116D, 0x11A9], NFKC: [0xB682], NFKD: [0x1104, 0x116D, 0x11A9] }, +{ source: [0xB683], NFC: [0xB683], NFD: [0x1104, 0x116D, 0x11AA], NFKC: [0xB683], NFKD: [0x1104, 0x116D, 0x11AA] }, +{ source: [0xB684], NFC: [0xB684], NFD: [0x1104, 0x116D, 0x11AB], NFKC: [0xB684], NFKD: [0x1104, 0x116D, 0x11AB] }, +{ source: [0xB685], NFC: [0xB685], NFD: [0x1104, 0x116D, 0x11AC], NFKC: [0xB685], NFKD: [0x1104, 0x116D, 0x11AC] }, +{ source: [0xB686], NFC: [0xB686], NFD: [0x1104, 0x116D, 0x11AD], NFKC: [0xB686], NFKD: [0x1104, 0x116D, 0x11AD] }, +{ source: [0xB687], NFC: [0xB687], NFD: [0x1104, 0x116D, 0x11AE], NFKC: [0xB687], NFKD: [0x1104, 0x116D, 0x11AE] }, +{ source: [0xB688], NFC: [0xB688], NFD: [0x1104, 0x116D, 0x11AF], NFKC: [0xB688], NFKD: [0x1104, 0x116D, 0x11AF] }, +{ source: [0xB689], NFC: [0xB689], NFD: [0x1104, 0x116D, 0x11B0], NFKC: [0xB689], NFKD: [0x1104, 0x116D, 0x11B0] }, +{ source: [0xB68A], NFC: [0xB68A], NFD: [0x1104, 0x116D, 0x11B1], NFKC: [0xB68A], NFKD: [0x1104, 0x116D, 0x11B1] }, +{ source: [0xB68B], NFC: [0xB68B], NFD: [0x1104, 0x116D, 0x11B2], NFKC: [0xB68B], NFKD: [0x1104, 0x116D, 0x11B2] }, +{ source: [0xB68C], NFC: [0xB68C], NFD: [0x1104, 0x116D, 0x11B3], NFKC: [0xB68C], NFKD: [0x1104, 0x116D, 0x11B3] }, +{ source: [0xB68D], NFC: [0xB68D], NFD: [0x1104, 0x116D, 0x11B4], NFKC: [0xB68D], NFKD: [0x1104, 0x116D, 0x11B4] }, +{ source: [0xB68E], NFC: [0xB68E], NFD: [0x1104, 0x116D, 0x11B5], NFKC: [0xB68E], NFKD: [0x1104, 0x116D, 0x11B5] }, +{ source: [0xB68F], NFC: [0xB68F], NFD: [0x1104, 0x116D, 0x11B6], NFKC: [0xB68F], NFKD: [0x1104, 0x116D, 0x11B6] }, +{ source: [0xB690], NFC: [0xB690], NFD: [0x1104, 0x116D, 0x11B7], NFKC: [0xB690], NFKD: [0x1104, 0x116D, 0x11B7] }, +{ source: [0xB691], NFC: [0xB691], NFD: [0x1104, 0x116D, 0x11B8], NFKC: [0xB691], NFKD: [0x1104, 0x116D, 0x11B8] }, +{ source: [0xB692], NFC: [0xB692], NFD: [0x1104, 0x116D, 0x11B9], NFKC: [0xB692], NFKD: [0x1104, 0x116D, 0x11B9] }, +{ source: [0xB693], NFC: [0xB693], NFD: [0x1104, 0x116D, 0x11BA], NFKC: [0xB693], NFKD: [0x1104, 0x116D, 0x11BA] }, +{ source: [0xB694], NFC: [0xB694], NFD: [0x1104, 0x116D, 0x11BB], NFKC: [0xB694], NFKD: [0x1104, 0x116D, 0x11BB] }, +{ source: [0xB695], NFC: [0xB695], NFD: [0x1104, 0x116D, 0x11BC], NFKC: [0xB695], NFKD: [0x1104, 0x116D, 0x11BC] }, +{ source: [0xB696], NFC: [0xB696], NFD: [0x1104, 0x116D, 0x11BD], NFKC: [0xB696], NFKD: [0x1104, 0x116D, 0x11BD] }, +{ source: [0xB697], NFC: [0xB697], NFD: [0x1104, 0x116D, 0x11BE], NFKC: [0xB697], NFKD: [0x1104, 0x116D, 0x11BE] }, +{ source: [0xB698], NFC: [0xB698], NFD: [0x1104, 0x116D, 0x11BF], NFKC: [0xB698], NFKD: [0x1104, 0x116D, 0x11BF] }, +{ source: [0xB699], NFC: [0xB699], NFD: [0x1104, 0x116D, 0x11C0], NFKC: [0xB699], NFKD: [0x1104, 0x116D, 0x11C0] }, +{ source: [0xB69A], NFC: [0xB69A], NFD: [0x1104, 0x116D, 0x11C1], NFKC: [0xB69A], NFKD: [0x1104, 0x116D, 0x11C1] }, +{ source: [0xB69B], NFC: [0xB69B], NFD: [0x1104, 0x116D, 0x11C2], NFKC: [0xB69B], NFKD: [0x1104, 0x116D, 0x11C2] }, +{ source: [0xB69C], NFC: [0xB69C], NFD: [0x1104, 0x116E], NFKC: [0xB69C], NFKD: [0x1104, 0x116E] }, +{ source: [0xB69D], NFC: [0xB69D], NFD: [0x1104, 0x116E, 0x11A8], NFKC: [0xB69D], NFKD: [0x1104, 0x116E, 0x11A8] }, +{ source: [0xB69E], NFC: [0xB69E], NFD: [0x1104, 0x116E, 0x11A9], NFKC: [0xB69E], NFKD: [0x1104, 0x116E, 0x11A9] }, +{ source: [0xB69F], NFC: [0xB69F], NFD: [0x1104, 0x116E, 0x11AA], NFKC: [0xB69F], NFKD: [0x1104, 0x116E, 0x11AA] }, +{ source: [0xB6A0], NFC: [0xB6A0], NFD: [0x1104, 0x116E, 0x11AB], NFKC: [0xB6A0], NFKD: [0x1104, 0x116E, 0x11AB] }, +{ source: [0xB6A1], NFC: [0xB6A1], NFD: [0x1104, 0x116E, 0x11AC], NFKC: [0xB6A1], NFKD: [0x1104, 0x116E, 0x11AC] }, +{ source: [0xB6A2], NFC: [0xB6A2], NFD: [0x1104, 0x116E, 0x11AD], NFKC: [0xB6A2], NFKD: [0x1104, 0x116E, 0x11AD] }, +{ source: [0xB6A3], NFC: [0xB6A3], NFD: [0x1104, 0x116E, 0x11AE], NFKC: [0xB6A3], NFKD: [0x1104, 0x116E, 0x11AE] }, +{ source: [0xB6A4], NFC: [0xB6A4], NFD: [0x1104, 0x116E, 0x11AF], NFKC: [0xB6A4], NFKD: [0x1104, 0x116E, 0x11AF] }, +{ source: [0xB6A5], NFC: [0xB6A5], NFD: [0x1104, 0x116E, 0x11B0], NFKC: [0xB6A5], NFKD: [0x1104, 0x116E, 0x11B0] }, +{ source: [0xB6A6], NFC: [0xB6A6], NFD: [0x1104, 0x116E, 0x11B1], NFKC: [0xB6A6], NFKD: [0x1104, 0x116E, 0x11B1] }, +{ source: [0xB6A7], NFC: [0xB6A7], NFD: [0x1104, 0x116E, 0x11B2], NFKC: [0xB6A7], NFKD: [0x1104, 0x116E, 0x11B2] }, +{ source: [0xB6A8], NFC: [0xB6A8], NFD: [0x1104, 0x116E, 0x11B3], NFKC: [0xB6A8], NFKD: [0x1104, 0x116E, 0x11B3] }, +{ source: [0xB6A9], NFC: [0xB6A9], NFD: [0x1104, 0x116E, 0x11B4], NFKC: [0xB6A9], NFKD: [0x1104, 0x116E, 0x11B4] }, +{ source: [0xB6AA], NFC: [0xB6AA], NFD: [0x1104, 0x116E, 0x11B5], NFKC: [0xB6AA], NFKD: [0x1104, 0x116E, 0x11B5] }, +{ source: [0xB6AB], NFC: [0xB6AB], NFD: [0x1104, 0x116E, 0x11B6], NFKC: [0xB6AB], NFKD: [0x1104, 0x116E, 0x11B6] }, +{ source: [0xB6AC], NFC: [0xB6AC], NFD: [0x1104, 0x116E, 0x11B7], NFKC: [0xB6AC], NFKD: [0x1104, 0x116E, 0x11B7] }, +{ source: [0xB6AD], NFC: [0xB6AD], NFD: [0x1104, 0x116E, 0x11B8], NFKC: [0xB6AD], NFKD: [0x1104, 0x116E, 0x11B8] }, +{ source: [0xB6AE], NFC: [0xB6AE], NFD: [0x1104, 0x116E, 0x11B9], NFKC: [0xB6AE], NFKD: [0x1104, 0x116E, 0x11B9] }, +{ source: [0xB6AF], NFC: [0xB6AF], NFD: [0x1104, 0x116E, 0x11BA], NFKC: [0xB6AF], NFKD: [0x1104, 0x116E, 0x11BA] }, +{ source: [0xB6B0], NFC: [0xB6B0], NFD: [0x1104, 0x116E, 0x11BB], NFKC: [0xB6B0], NFKD: [0x1104, 0x116E, 0x11BB] }, +{ source: [0xB6B1], NFC: [0xB6B1], NFD: [0x1104, 0x116E, 0x11BC], NFKC: [0xB6B1], NFKD: [0x1104, 0x116E, 0x11BC] }, +{ source: [0xB6B2], NFC: [0xB6B2], NFD: [0x1104, 0x116E, 0x11BD], NFKC: [0xB6B2], NFKD: [0x1104, 0x116E, 0x11BD] }, +{ source: [0xB6B3], NFC: [0xB6B3], NFD: [0x1104, 0x116E, 0x11BE], NFKC: [0xB6B3], NFKD: [0x1104, 0x116E, 0x11BE] }, +{ source: [0xB6B4], NFC: [0xB6B4], NFD: [0x1104, 0x116E, 0x11BF], NFKC: [0xB6B4], NFKD: [0x1104, 0x116E, 0x11BF] }, +{ source: [0xB6B5], NFC: [0xB6B5], NFD: [0x1104, 0x116E, 0x11C0], NFKC: [0xB6B5], NFKD: [0x1104, 0x116E, 0x11C0] }, +{ source: [0xB6B6], NFC: [0xB6B6], NFD: [0x1104, 0x116E, 0x11C1], NFKC: [0xB6B6], NFKD: [0x1104, 0x116E, 0x11C1] }, +{ source: [0xB6B7], NFC: [0xB6B7], NFD: [0x1104, 0x116E, 0x11C2], NFKC: [0xB6B7], NFKD: [0x1104, 0x116E, 0x11C2] }, +{ source: [0xB6B8], NFC: [0xB6B8], NFD: [0x1104, 0x116F], NFKC: [0xB6B8], NFKD: [0x1104, 0x116F] }, +{ source: [0xB6B9], NFC: [0xB6B9], NFD: [0x1104, 0x116F, 0x11A8], NFKC: [0xB6B9], NFKD: [0x1104, 0x116F, 0x11A8] }, +{ source: [0xB6BA], NFC: [0xB6BA], NFD: [0x1104, 0x116F, 0x11A9], NFKC: [0xB6BA], NFKD: [0x1104, 0x116F, 0x11A9] }, +{ source: [0xB6BB], NFC: [0xB6BB], NFD: [0x1104, 0x116F, 0x11AA], NFKC: [0xB6BB], NFKD: [0x1104, 0x116F, 0x11AA] }, +{ source: [0xB6BC], NFC: [0xB6BC], NFD: [0x1104, 0x116F, 0x11AB], NFKC: [0xB6BC], NFKD: [0x1104, 0x116F, 0x11AB] }, +{ source: [0xB6BD], NFC: [0xB6BD], NFD: [0x1104, 0x116F, 0x11AC], NFKC: [0xB6BD], NFKD: [0x1104, 0x116F, 0x11AC] }, +{ source: [0xB6BE], NFC: [0xB6BE], NFD: [0x1104, 0x116F, 0x11AD], NFKC: [0xB6BE], NFKD: [0x1104, 0x116F, 0x11AD] }, +{ source: [0xB6BF], NFC: [0xB6BF], NFD: [0x1104, 0x116F, 0x11AE], NFKC: [0xB6BF], NFKD: [0x1104, 0x116F, 0x11AE] }, +{ source: [0xB6C0], NFC: [0xB6C0], NFD: [0x1104, 0x116F, 0x11AF], NFKC: [0xB6C0], NFKD: [0x1104, 0x116F, 0x11AF] }, +{ source: [0xB6C1], NFC: [0xB6C1], NFD: [0x1104, 0x116F, 0x11B0], NFKC: [0xB6C1], NFKD: [0x1104, 0x116F, 0x11B0] }, +{ source: [0xB6C2], NFC: [0xB6C2], NFD: [0x1104, 0x116F, 0x11B1], NFKC: [0xB6C2], NFKD: [0x1104, 0x116F, 0x11B1] }, +{ source: [0xB6C3], NFC: [0xB6C3], NFD: [0x1104, 0x116F, 0x11B2], NFKC: [0xB6C3], NFKD: [0x1104, 0x116F, 0x11B2] }, +{ source: [0xB6C4], NFC: [0xB6C4], NFD: [0x1104, 0x116F, 0x11B3], NFKC: [0xB6C4], NFKD: [0x1104, 0x116F, 0x11B3] }, +{ source: [0xB6C5], NFC: [0xB6C5], NFD: [0x1104, 0x116F, 0x11B4], NFKC: [0xB6C5], NFKD: [0x1104, 0x116F, 0x11B4] }, +{ source: [0xB6C6], NFC: [0xB6C6], NFD: [0x1104, 0x116F, 0x11B5], NFKC: [0xB6C6], NFKD: [0x1104, 0x116F, 0x11B5] }, +{ source: [0xB6C7], NFC: [0xB6C7], NFD: [0x1104, 0x116F, 0x11B6], NFKC: [0xB6C7], NFKD: [0x1104, 0x116F, 0x11B6] }, +{ source: [0xB6C8], NFC: [0xB6C8], NFD: [0x1104, 0x116F, 0x11B7], NFKC: [0xB6C8], NFKD: [0x1104, 0x116F, 0x11B7] }, +{ source: [0xB6C9], NFC: [0xB6C9], NFD: [0x1104, 0x116F, 0x11B8], NFKC: [0xB6C9], NFKD: [0x1104, 0x116F, 0x11B8] }, +{ source: [0xB6CA], NFC: [0xB6CA], NFD: [0x1104, 0x116F, 0x11B9], NFKC: [0xB6CA], NFKD: [0x1104, 0x116F, 0x11B9] }, +{ source: [0xB6CB], NFC: [0xB6CB], NFD: [0x1104, 0x116F, 0x11BA], NFKC: [0xB6CB], NFKD: [0x1104, 0x116F, 0x11BA] }, +{ source: [0xB6CC], NFC: [0xB6CC], NFD: [0x1104, 0x116F, 0x11BB], NFKC: [0xB6CC], NFKD: [0x1104, 0x116F, 0x11BB] }, +{ source: [0xB6CD], NFC: [0xB6CD], NFD: [0x1104, 0x116F, 0x11BC], NFKC: [0xB6CD], NFKD: [0x1104, 0x116F, 0x11BC] }, +{ source: [0xB6CE], NFC: [0xB6CE], NFD: [0x1104, 0x116F, 0x11BD], NFKC: [0xB6CE], NFKD: [0x1104, 0x116F, 0x11BD] }, +{ source: [0xB6CF], NFC: [0xB6CF], NFD: [0x1104, 0x116F, 0x11BE], NFKC: [0xB6CF], NFKD: [0x1104, 0x116F, 0x11BE] }, +{ source: [0xB6D0], NFC: [0xB6D0], NFD: [0x1104, 0x116F, 0x11BF], NFKC: [0xB6D0], NFKD: [0x1104, 0x116F, 0x11BF] }, +{ source: [0xB6D1], NFC: [0xB6D1], NFD: [0x1104, 0x116F, 0x11C0], NFKC: [0xB6D1], NFKD: [0x1104, 0x116F, 0x11C0] }, +{ source: [0xB6D2], NFC: [0xB6D2], NFD: [0x1104, 0x116F, 0x11C1], NFKC: [0xB6D2], NFKD: [0x1104, 0x116F, 0x11C1] }, +{ source: [0xB6D3], NFC: [0xB6D3], NFD: [0x1104, 0x116F, 0x11C2], NFKC: [0xB6D3], NFKD: [0x1104, 0x116F, 0x11C2] }, +{ source: [0xB6D4], NFC: [0xB6D4], NFD: [0x1104, 0x1170], NFKC: [0xB6D4], NFKD: [0x1104, 0x1170] }, +{ source: [0xB6D5], NFC: [0xB6D5], NFD: [0x1104, 0x1170, 0x11A8], NFKC: [0xB6D5], NFKD: [0x1104, 0x1170, 0x11A8] }, +{ source: [0xB6D6], NFC: [0xB6D6], NFD: [0x1104, 0x1170, 0x11A9], NFKC: [0xB6D6], NFKD: [0x1104, 0x1170, 0x11A9] }, +{ source: [0xB6D7], NFC: [0xB6D7], NFD: [0x1104, 0x1170, 0x11AA], NFKC: [0xB6D7], NFKD: [0x1104, 0x1170, 0x11AA] }, +{ source: [0xB6D8], NFC: [0xB6D8], NFD: [0x1104, 0x1170, 0x11AB], NFKC: [0xB6D8], NFKD: [0x1104, 0x1170, 0x11AB] }, +{ source: [0xB6D9], NFC: [0xB6D9], NFD: [0x1104, 0x1170, 0x11AC], NFKC: [0xB6D9], NFKD: [0x1104, 0x1170, 0x11AC] }, +{ source: [0xB6DA], NFC: [0xB6DA], NFD: [0x1104, 0x1170, 0x11AD], NFKC: [0xB6DA], NFKD: [0x1104, 0x1170, 0x11AD] }, +{ source: [0xB6DB], NFC: [0xB6DB], NFD: [0x1104, 0x1170, 0x11AE], NFKC: [0xB6DB], NFKD: [0x1104, 0x1170, 0x11AE] }, +{ source: [0xB6DC], NFC: [0xB6DC], NFD: [0x1104, 0x1170, 0x11AF], NFKC: [0xB6DC], NFKD: [0x1104, 0x1170, 0x11AF] }, +{ source: [0xB6DD], NFC: [0xB6DD], NFD: [0x1104, 0x1170, 0x11B0], NFKC: [0xB6DD], NFKD: [0x1104, 0x1170, 0x11B0] }, +{ source: [0xB6DE], NFC: [0xB6DE], NFD: [0x1104, 0x1170, 0x11B1], NFKC: [0xB6DE], NFKD: [0x1104, 0x1170, 0x11B1] }, +{ source: [0xB6DF], NFC: [0xB6DF], NFD: [0x1104, 0x1170, 0x11B2], NFKC: [0xB6DF], NFKD: [0x1104, 0x1170, 0x11B2] }, +{ source: [0xB6E0], NFC: [0xB6E0], NFD: [0x1104, 0x1170, 0x11B3], NFKC: [0xB6E0], NFKD: [0x1104, 0x1170, 0x11B3] }, +{ source: [0xB6E1], NFC: [0xB6E1], NFD: [0x1104, 0x1170, 0x11B4], NFKC: [0xB6E1], NFKD: [0x1104, 0x1170, 0x11B4] }, +{ source: [0xB6E2], NFC: [0xB6E2], NFD: [0x1104, 0x1170, 0x11B5], NFKC: [0xB6E2], NFKD: [0x1104, 0x1170, 0x11B5] }, +{ source: [0xB6E3], NFC: [0xB6E3], NFD: [0x1104, 0x1170, 0x11B6], NFKC: [0xB6E3], NFKD: [0x1104, 0x1170, 0x11B6] }, +{ source: [0xB6E4], NFC: [0xB6E4], NFD: [0x1104, 0x1170, 0x11B7], NFKC: [0xB6E4], NFKD: [0x1104, 0x1170, 0x11B7] }, +{ source: [0xB6E5], NFC: [0xB6E5], NFD: [0x1104, 0x1170, 0x11B8], NFKC: [0xB6E5], NFKD: [0x1104, 0x1170, 0x11B8] }, +{ source: [0xB6E6], NFC: [0xB6E6], NFD: [0x1104, 0x1170, 0x11B9], NFKC: [0xB6E6], NFKD: [0x1104, 0x1170, 0x11B9] }, +{ source: [0xB6E7], NFC: [0xB6E7], NFD: [0x1104, 0x1170, 0x11BA], NFKC: [0xB6E7], NFKD: [0x1104, 0x1170, 0x11BA] }, +{ source: [0xB6E8], NFC: [0xB6E8], NFD: [0x1104, 0x1170, 0x11BB], NFKC: [0xB6E8], NFKD: [0x1104, 0x1170, 0x11BB] }, +{ source: [0xB6E9], NFC: [0xB6E9], NFD: [0x1104, 0x1170, 0x11BC], NFKC: [0xB6E9], NFKD: [0x1104, 0x1170, 0x11BC] }, +{ source: [0xB6EA], NFC: [0xB6EA], NFD: [0x1104, 0x1170, 0x11BD], NFKC: [0xB6EA], NFKD: [0x1104, 0x1170, 0x11BD] }, +{ source: [0xB6EB], NFC: [0xB6EB], NFD: [0x1104, 0x1170, 0x11BE], NFKC: [0xB6EB], NFKD: [0x1104, 0x1170, 0x11BE] }, +{ source: [0xB6EC], NFC: [0xB6EC], NFD: [0x1104, 0x1170, 0x11BF], NFKC: [0xB6EC], NFKD: [0x1104, 0x1170, 0x11BF] }, +{ source: [0xB6ED], NFC: [0xB6ED], NFD: [0x1104, 0x1170, 0x11C0], NFKC: [0xB6ED], NFKD: [0x1104, 0x1170, 0x11C0] }, +{ source: [0xB6EE], NFC: [0xB6EE], NFD: [0x1104, 0x1170, 0x11C1], NFKC: [0xB6EE], NFKD: [0x1104, 0x1170, 0x11C1] }, +{ source: [0xB6EF], NFC: [0xB6EF], NFD: [0x1104, 0x1170, 0x11C2], NFKC: [0xB6EF], NFKD: [0x1104, 0x1170, 0x11C2] }, +{ source: [0xB6F0], NFC: [0xB6F0], NFD: [0x1104, 0x1171], NFKC: [0xB6F0], NFKD: [0x1104, 0x1171] }, +{ source: [0xB6F1], NFC: [0xB6F1], NFD: [0x1104, 0x1171, 0x11A8], NFKC: [0xB6F1], NFKD: [0x1104, 0x1171, 0x11A8] }, +{ source: [0xB6F2], NFC: [0xB6F2], NFD: [0x1104, 0x1171, 0x11A9], NFKC: [0xB6F2], NFKD: [0x1104, 0x1171, 0x11A9] }, +{ source: [0xB6F3], NFC: [0xB6F3], NFD: [0x1104, 0x1171, 0x11AA], NFKC: [0xB6F3], NFKD: [0x1104, 0x1171, 0x11AA] }, +{ source: [0xB6F4], NFC: [0xB6F4], NFD: [0x1104, 0x1171, 0x11AB], NFKC: [0xB6F4], NFKD: [0x1104, 0x1171, 0x11AB] }, +{ source: [0xB6F5], NFC: [0xB6F5], NFD: [0x1104, 0x1171, 0x11AC], NFKC: [0xB6F5], NFKD: [0x1104, 0x1171, 0x11AC] }, +{ source: [0xB6F6], NFC: [0xB6F6], NFD: [0x1104, 0x1171, 0x11AD], NFKC: [0xB6F6], NFKD: [0x1104, 0x1171, 0x11AD] }, +{ source: [0xB6F7], NFC: [0xB6F7], NFD: [0x1104, 0x1171, 0x11AE], NFKC: [0xB6F7], NFKD: [0x1104, 0x1171, 0x11AE] }, +{ source: [0xB6F8], NFC: [0xB6F8], NFD: [0x1104, 0x1171, 0x11AF], NFKC: [0xB6F8], NFKD: [0x1104, 0x1171, 0x11AF] }, +{ source: [0xB6F9], NFC: [0xB6F9], NFD: [0x1104, 0x1171, 0x11B0], NFKC: [0xB6F9], NFKD: [0x1104, 0x1171, 0x11B0] }, +{ source: [0xB6FA], NFC: [0xB6FA], NFD: [0x1104, 0x1171, 0x11B1], NFKC: [0xB6FA], NFKD: [0x1104, 0x1171, 0x11B1] }, +{ source: [0xB6FB], NFC: [0xB6FB], NFD: [0x1104, 0x1171, 0x11B2], NFKC: [0xB6FB], NFKD: [0x1104, 0x1171, 0x11B2] }, +{ source: [0xB6FC], NFC: [0xB6FC], NFD: [0x1104, 0x1171, 0x11B3], NFKC: [0xB6FC], NFKD: [0x1104, 0x1171, 0x11B3] }, +{ source: [0xB6FD], NFC: [0xB6FD], NFD: [0x1104, 0x1171, 0x11B4], NFKC: [0xB6FD], NFKD: [0x1104, 0x1171, 0x11B4] }, +{ source: [0xB6FE], NFC: [0xB6FE], NFD: [0x1104, 0x1171, 0x11B5], NFKC: [0xB6FE], NFKD: [0x1104, 0x1171, 0x11B5] }, +{ source: [0xB6FF], NFC: [0xB6FF], NFD: [0x1104, 0x1171, 0x11B6], NFKC: [0xB6FF], NFKD: [0x1104, 0x1171, 0x11B6] }, +{ source: [0xB700], NFC: [0xB700], NFD: [0x1104, 0x1171, 0x11B7], NFKC: [0xB700], NFKD: [0x1104, 0x1171, 0x11B7] }, +{ source: [0xB701], NFC: [0xB701], NFD: [0x1104, 0x1171, 0x11B8], NFKC: [0xB701], NFKD: [0x1104, 0x1171, 0x11B8] }, +{ source: [0xB702], NFC: [0xB702], NFD: [0x1104, 0x1171, 0x11B9], NFKC: [0xB702], NFKD: [0x1104, 0x1171, 0x11B9] }, +{ source: [0xB703], NFC: [0xB703], NFD: [0x1104, 0x1171, 0x11BA], NFKC: [0xB703], NFKD: [0x1104, 0x1171, 0x11BA] }, +{ source: [0xB704], NFC: [0xB704], NFD: [0x1104, 0x1171, 0x11BB], NFKC: [0xB704], NFKD: [0x1104, 0x1171, 0x11BB] }, +{ source: [0xB705], NFC: [0xB705], NFD: [0x1104, 0x1171, 0x11BC], NFKC: [0xB705], NFKD: [0x1104, 0x1171, 0x11BC] }, +{ source: [0xB706], NFC: [0xB706], NFD: [0x1104, 0x1171, 0x11BD], NFKC: [0xB706], NFKD: [0x1104, 0x1171, 0x11BD] }, +{ source: [0xB707], NFC: [0xB707], NFD: [0x1104, 0x1171, 0x11BE], NFKC: [0xB707], NFKD: [0x1104, 0x1171, 0x11BE] }, +{ source: [0xB708], NFC: [0xB708], NFD: [0x1104, 0x1171, 0x11BF], NFKC: [0xB708], NFKD: [0x1104, 0x1171, 0x11BF] }, +{ source: [0xB709], NFC: [0xB709], NFD: [0x1104, 0x1171, 0x11C0], NFKC: [0xB709], NFKD: [0x1104, 0x1171, 0x11C0] }, +{ source: [0xB70A], NFC: [0xB70A], NFD: [0x1104, 0x1171, 0x11C1], NFKC: [0xB70A], NFKD: [0x1104, 0x1171, 0x11C1] }, +{ source: [0xB70B], NFC: [0xB70B], NFD: [0x1104, 0x1171, 0x11C2], NFKC: [0xB70B], NFKD: [0x1104, 0x1171, 0x11C2] }, +{ source: [0xB70C], NFC: [0xB70C], NFD: [0x1104, 0x1172], NFKC: [0xB70C], NFKD: [0x1104, 0x1172] }, +{ source: [0xB70D], NFC: [0xB70D], NFD: [0x1104, 0x1172, 0x11A8], NFKC: [0xB70D], NFKD: [0x1104, 0x1172, 0x11A8] }, +{ source: [0xB70E], NFC: [0xB70E], NFD: [0x1104, 0x1172, 0x11A9], NFKC: [0xB70E], NFKD: [0x1104, 0x1172, 0x11A9] }, +{ source: [0xB70F], NFC: [0xB70F], NFD: [0x1104, 0x1172, 0x11AA], NFKC: [0xB70F], NFKD: [0x1104, 0x1172, 0x11AA] }, +{ source: [0xB710], NFC: [0xB710], NFD: [0x1104, 0x1172, 0x11AB], NFKC: [0xB710], NFKD: [0x1104, 0x1172, 0x11AB] }, +{ source: [0xB711], NFC: [0xB711], NFD: [0x1104, 0x1172, 0x11AC], NFKC: [0xB711], NFKD: [0x1104, 0x1172, 0x11AC] }, +{ source: [0xB712], NFC: [0xB712], NFD: [0x1104, 0x1172, 0x11AD], NFKC: [0xB712], NFKD: [0x1104, 0x1172, 0x11AD] }, +{ source: [0xB713], NFC: [0xB713], NFD: [0x1104, 0x1172, 0x11AE], NFKC: [0xB713], NFKD: [0x1104, 0x1172, 0x11AE] }, +{ source: [0xB714], NFC: [0xB714], NFD: [0x1104, 0x1172, 0x11AF], NFKC: [0xB714], NFKD: [0x1104, 0x1172, 0x11AF] }, +{ source: [0xB715], NFC: [0xB715], NFD: [0x1104, 0x1172, 0x11B0], NFKC: [0xB715], NFKD: [0x1104, 0x1172, 0x11B0] }, +{ source: [0xB716], NFC: [0xB716], NFD: [0x1104, 0x1172, 0x11B1], NFKC: [0xB716], NFKD: [0x1104, 0x1172, 0x11B1] }, +{ source: [0xB717], NFC: [0xB717], NFD: [0x1104, 0x1172, 0x11B2], NFKC: [0xB717], NFKD: [0x1104, 0x1172, 0x11B2] }, +{ source: [0xB718], NFC: [0xB718], NFD: [0x1104, 0x1172, 0x11B3], NFKC: [0xB718], NFKD: [0x1104, 0x1172, 0x11B3] }, +{ source: [0xB719], NFC: [0xB719], NFD: [0x1104, 0x1172, 0x11B4], NFKC: [0xB719], NFKD: [0x1104, 0x1172, 0x11B4] }, +{ source: [0xB71A], NFC: [0xB71A], NFD: [0x1104, 0x1172, 0x11B5], NFKC: [0xB71A], NFKD: [0x1104, 0x1172, 0x11B5] }, +{ source: [0xB71B], NFC: [0xB71B], NFD: [0x1104, 0x1172, 0x11B6], NFKC: [0xB71B], NFKD: [0x1104, 0x1172, 0x11B6] }, +{ source: [0xB71C], NFC: [0xB71C], NFD: [0x1104, 0x1172, 0x11B7], NFKC: [0xB71C], NFKD: [0x1104, 0x1172, 0x11B7] }, +{ source: [0xB71D], NFC: [0xB71D], NFD: [0x1104, 0x1172, 0x11B8], NFKC: [0xB71D], NFKD: [0x1104, 0x1172, 0x11B8] }, +{ source: [0xB71E], NFC: [0xB71E], NFD: [0x1104, 0x1172, 0x11B9], NFKC: [0xB71E], NFKD: [0x1104, 0x1172, 0x11B9] }, +{ source: [0xB71F], NFC: [0xB71F], NFD: [0x1104, 0x1172, 0x11BA], NFKC: [0xB71F], NFKD: [0x1104, 0x1172, 0x11BA] }, +{ source: [0xB720], NFC: [0xB720], NFD: [0x1104, 0x1172, 0x11BB], NFKC: [0xB720], NFKD: [0x1104, 0x1172, 0x11BB] }, +{ source: [0xB721], NFC: [0xB721], NFD: [0x1104, 0x1172, 0x11BC], NFKC: [0xB721], NFKD: [0x1104, 0x1172, 0x11BC] }, +{ source: [0xB722], NFC: [0xB722], NFD: [0x1104, 0x1172, 0x11BD], NFKC: [0xB722], NFKD: [0x1104, 0x1172, 0x11BD] }, +{ source: [0xB723], NFC: [0xB723], NFD: [0x1104, 0x1172, 0x11BE], NFKC: [0xB723], NFKD: [0x1104, 0x1172, 0x11BE] }, +{ source: [0xB724], NFC: [0xB724], NFD: [0x1104, 0x1172, 0x11BF], NFKC: [0xB724], NFKD: [0x1104, 0x1172, 0x11BF] }, +{ source: [0xB725], NFC: [0xB725], NFD: [0x1104, 0x1172, 0x11C0], NFKC: [0xB725], NFKD: [0x1104, 0x1172, 0x11C0] }, +{ source: [0xB726], NFC: [0xB726], NFD: [0x1104, 0x1172, 0x11C1], NFKC: [0xB726], NFKD: [0x1104, 0x1172, 0x11C1] }, +{ source: [0xB727], NFC: [0xB727], NFD: [0x1104, 0x1172, 0x11C2], NFKC: [0xB727], NFKD: [0x1104, 0x1172, 0x11C2] }, +{ source: [0xB728], NFC: [0xB728], NFD: [0x1104, 0x1173], NFKC: [0xB728], NFKD: [0x1104, 0x1173] }, +{ source: [0xB729], NFC: [0xB729], NFD: [0x1104, 0x1173, 0x11A8], NFKC: [0xB729], NFKD: [0x1104, 0x1173, 0x11A8] }, +{ source: [0xB72A], NFC: [0xB72A], NFD: [0x1104, 0x1173, 0x11A9], NFKC: [0xB72A], NFKD: [0x1104, 0x1173, 0x11A9] }, +{ source: [0xB72B], NFC: [0xB72B], NFD: [0x1104, 0x1173, 0x11AA], NFKC: [0xB72B], NFKD: [0x1104, 0x1173, 0x11AA] }, +{ source: [0xB72C], NFC: [0xB72C], NFD: [0x1104, 0x1173, 0x11AB], NFKC: [0xB72C], NFKD: [0x1104, 0x1173, 0x11AB] }, +{ source: [0xB72D], NFC: [0xB72D], NFD: [0x1104, 0x1173, 0x11AC], NFKC: [0xB72D], NFKD: [0x1104, 0x1173, 0x11AC] }, +{ source: [0xB72E], NFC: [0xB72E], NFD: [0x1104, 0x1173, 0x11AD], NFKC: [0xB72E], NFKD: [0x1104, 0x1173, 0x11AD] }, +{ source: [0xB72F], NFC: [0xB72F], NFD: [0x1104, 0x1173, 0x11AE], NFKC: [0xB72F], NFKD: [0x1104, 0x1173, 0x11AE] }, +{ source: [0xB730], NFC: [0xB730], NFD: [0x1104, 0x1173, 0x11AF], NFKC: [0xB730], NFKD: [0x1104, 0x1173, 0x11AF] }, +{ source: [0xB731], NFC: [0xB731], NFD: [0x1104, 0x1173, 0x11B0], NFKC: [0xB731], NFKD: [0x1104, 0x1173, 0x11B0] }, +{ source: [0xB732], NFC: [0xB732], NFD: [0x1104, 0x1173, 0x11B1], NFKC: [0xB732], NFKD: [0x1104, 0x1173, 0x11B1] }, +{ source: [0xB733], NFC: [0xB733], NFD: [0x1104, 0x1173, 0x11B2], NFKC: [0xB733], NFKD: [0x1104, 0x1173, 0x11B2] }, +{ source: [0xB734], NFC: [0xB734], NFD: [0x1104, 0x1173, 0x11B3], NFKC: [0xB734], NFKD: [0x1104, 0x1173, 0x11B3] }, +{ source: [0xB735], NFC: [0xB735], NFD: [0x1104, 0x1173, 0x11B4], NFKC: [0xB735], NFKD: [0x1104, 0x1173, 0x11B4] }, +{ source: [0xB736], NFC: [0xB736], NFD: [0x1104, 0x1173, 0x11B5], NFKC: [0xB736], NFKD: [0x1104, 0x1173, 0x11B5] }, +{ source: [0xB737], NFC: [0xB737], NFD: [0x1104, 0x1173, 0x11B6], NFKC: [0xB737], NFKD: [0x1104, 0x1173, 0x11B6] }, +{ source: [0xB738], NFC: [0xB738], NFD: [0x1104, 0x1173, 0x11B7], NFKC: [0xB738], NFKD: [0x1104, 0x1173, 0x11B7] }, +{ source: [0xB739], NFC: [0xB739], NFD: [0x1104, 0x1173, 0x11B8], NFKC: [0xB739], NFKD: [0x1104, 0x1173, 0x11B8] }, +{ source: [0xB73A], NFC: [0xB73A], NFD: [0x1104, 0x1173, 0x11B9], NFKC: [0xB73A], NFKD: [0x1104, 0x1173, 0x11B9] }, +{ source: [0xB73B], NFC: [0xB73B], NFD: [0x1104, 0x1173, 0x11BA], NFKC: [0xB73B], NFKD: [0x1104, 0x1173, 0x11BA] }, +{ source: [0xB73C], NFC: [0xB73C], NFD: [0x1104, 0x1173, 0x11BB], NFKC: [0xB73C], NFKD: [0x1104, 0x1173, 0x11BB] }, +{ source: [0xB73D], NFC: [0xB73D], NFD: [0x1104, 0x1173, 0x11BC], NFKC: [0xB73D], NFKD: [0x1104, 0x1173, 0x11BC] }, +{ source: [0xB73E], NFC: [0xB73E], NFD: [0x1104, 0x1173, 0x11BD], NFKC: [0xB73E], NFKD: [0x1104, 0x1173, 0x11BD] }, +{ source: [0xB73F], NFC: [0xB73F], NFD: [0x1104, 0x1173, 0x11BE], NFKC: [0xB73F], NFKD: [0x1104, 0x1173, 0x11BE] }, +{ source: [0xB740], NFC: [0xB740], NFD: [0x1104, 0x1173, 0x11BF], NFKC: [0xB740], NFKD: [0x1104, 0x1173, 0x11BF] }, +{ source: [0xB741], NFC: [0xB741], NFD: [0x1104, 0x1173, 0x11C0], NFKC: [0xB741], NFKD: [0x1104, 0x1173, 0x11C0] }, +{ source: [0xB742], NFC: [0xB742], NFD: [0x1104, 0x1173, 0x11C1], NFKC: [0xB742], NFKD: [0x1104, 0x1173, 0x11C1] }, +{ source: [0xB743], NFC: [0xB743], NFD: [0x1104, 0x1173, 0x11C2], NFKC: [0xB743], NFKD: [0x1104, 0x1173, 0x11C2] }, +{ source: [0xB744], NFC: [0xB744], NFD: [0x1104, 0x1174], NFKC: [0xB744], NFKD: [0x1104, 0x1174] }, +{ source: [0xB745], NFC: [0xB745], NFD: [0x1104, 0x1174, 0x11A8], NFKC: [0xB745], NFKD: [0x1104, 0x1174, 0x11A8] }, +{ source: [0xB746], NFC: [0xB746], NFD: [0x1104, 0x1174, 0x11A9], NFKC: [0xB746], NFKD: [0x1104, 0x1174, 0x11A9] }, +{ source: [0xB747], NFC: [0xB747], NFD: [0x1104, 0x1174, 0x11AA], NFKC: [0xB747], NFKD: [0x1104, 0x1174, 0x11AA] }, +{ source: [0xB748], NFC: [0xB748], NFD: [0x1104, 0x1174, 0x11AB], NFKC: [0xB748], NFKD: [0x1104, 0x1174, 0x11AB] }, +{ source: [0xB749], NFC: [0xB749], NFD: [0x1104, 0x1174, 0x11AC], NFKC: [0xB749], NFKD: [0x1104, 0x1174, 0x11AC] }, +{ source: [0xB74A], NFC: [0xB74A], NFD: [0x1104, 0x1174, 0x11AD], NFKC: [0xB74A], NFKD: [0x1104, 0x1174, 0x11AD] }, +{ source: [0xB74B], NFC: [0xB74B], NFD: [0x1104, 0x1174, 0x11AE], NFKC: [0xB74B], NFKD: [0x1104, 0x1174, 0x11AE] }, +{ source: [0xB74C], NFC: [0xB74C], NFD: [0x1104, 0x1174, 0x11AF], NFKC: [0xB74C], NFKD: [0x1104, 0x1174, 0x11AF] }, +{ source: [0xB74D], NFC: [0xB74D], NFD: [0x1104, 0x1174, 0x11B0], NFKC: [0xB74D], NFKD: [0x1104, 0x1174, 0x11B0] }, +{ source: [0xB74E], NFC: [0xB74E], NFD: [0x1104, 0x1174, 0x11B1], NFKC: [0xB74E], NFKD: [0x1104, 0x1174, 0x11B1] }, +{ source: [0xB74F], NFC: [0xB74F], NFD: [0x1104, 0x1174, 0x11B2], NFKC: [0xB74F], NFKD: [0x1104, 0x1174, 0x11B2] }, +{ source: [0xB750], NFC: [0xB750], NFD: [0x1104, 0x1174, 0x11B3], NFKC: [0xB750], NFKD: [0x1104, 0x1174, 0x11B3] }, +{ source: [0xB751], NFC: [0xB751], NFD: [0x1104, 0x1174, 0x11B4], NFKC: [0xB751], NFKD: [0x1104, 0x1174, 0x11B4] }, +{ source: [0xB752], NFC: [0xB752], NFD: [0x1104, 0x1174, 0x11B5], NFKC: [0xB752], NFKD: [0x1104, 0x1174, 0x11B5] }, +{ source: [0xB753], NFC: [0xB753], NFD: [0x1104, 0x1174, 0x11B6], NFKC: [0xB753], NFKD: [0x1104, 0x1174, 0x11B6] }, +{ source: [0xB754], NFC: [0xB754], NFD: [0x1104, 0x1174, 0x11B7], NFKC: [0xB754], NFKD: [0x1104, 0x1174, 0x11B7] }, +{ source: [0xB755], NFC: [0xB755], NFD: [0x1104, 0x1174, 0x11B8], NFKC: [0xB755], NFKD: [0x1104, 0x1174, 0x11B8] }, +{ source: [0xB756], NFC: [0xB756], NFD: [0x1104, 0x1174, 0x11B9], NFKC: [0xB756], NFKD: [0x1104, 0x1174, 0x11B9] }, +{ source: [0xB757], NFC: [0xB757], NFD: [0x1104, 0x1174, 0x11BA], NFKC: [0xB757], NFKD: [0x1104, 0x1174, 0x11BA] }, +{ source: [0xB758], NFC: [0xB758], NFD: [0x1104, 0x1174, 0x11BB], NFKC: [0xB758], NFKD: [0x1104, 0x1174, 0x11BB] }, +{ source: [0xB759], NFC: [0xB759], NFD: [0x1104, 0x1174, 0x11BC], NFKC: [0xB759], NFKD: [0x1104, 0x1174, 0x11BC] }, +{ source: [0xB75A], NFC: [0xB75A], NFD: [0x1104, 0x1174, 0x11BD], NFKC: [0xB75A], NFKD: [0x1104, 0x1174, 0x11BD] }, +{ source: [0xB75B], NFC: [0xB75B], NFD: [0x1104, 0x1174, 0x11BE], NFKC: [0xB75B], NFKD: [0x1104, 0x1174, 0x11BE] }, +{ source: [0xB75C], NFC: [0xB75C], NFD: [0x1104, 0x1174, 0x11BF], NFKC: [0xB75C], NFKD: [0x1104, 0x1174, 0x11BF] }, +{ source: [0xB75D], NFC: [0xB75D], NFD: [0x1104, 0x1174, 0x11C0], NFKC: [0xB75D], NFKD: [0x1104, 0x1174, 0x11C0] }, +{ source: [0xB75E], NFC: [0xB75E], NFD: [0x1104, 0x1174, 0x11C1], NFKC: [0xB75E], NFKD: [0x1104, 0x1174, 0x11C1] }, +{ source: [0xB75F], NFC: [0xB75F], NFD: [0x1104, 0x1174, 0x11C2], NFKC: [0xB75F], NFKD: [0x1104, 0x1174, 0x11C2] }, +{ source: [0xB760], NFC: [0xB760], NFD: [0x1104, 0x1175], NFKC: [0xB760], NFKD: [0x1104, 0x1175] }, +{ source: [0xB761], NFC: [0xB761], NFD: [0x1104, 0x1175, 0x11A8], NFKC: [0xB761], NFKD: [0x1104, 0x1175, 0x11A8] }, +{ source: [0xB762], NFC: [0xB762], NFD: [0x1104, 0x1175, 0x11A9], NFKC: [0xB762], NFKD: [0x1104, 0x1175, 0x11A9] }, +{ source: [0xB763], NFC: [0xB763], NFD: [0x1104, 0x1175, 0x11AA], NFKC: [0xB763], NFKD: [0x1104, 0x1175, 0x11AA] }, +{ source: [0xB764], NFC: [0xB764], NFD: [0x1104, 0x1175, 0x11AB], NFKC: [0xB764], NFKD: [0x1104, 0x1175, 0x11AB] }, +{ source: [0xB765], NFC: [0xB765], NFD: [0x1104, 0x1175, 0x11AC], NFKC: [0xB765], NFKD: [0x1104, 0x1175, 0x11AC] }, +{ source: [0xB766], NFC: [0xB766], NFD: [0x1104, 0x1175, 0x11AD], NFKC: [0xB766], NFKD: [0x1104, 0x1175, 0x11AD] }, +{ source: [0xB767], NFC: [0xB767], NFD: [0x1104, 0x1175, 0x11AE], NFKC: [0xB767], NFKD: [0x1104, 0x1175, 0x11AE] }, +{ source: [0xB768], NFC: [0xB768], NFD: [0x1104, 0x1175, 0x11AF], NFKC: [0xB768], NFKD: [0x1104, 0x1175, 0x11AF] }, +{ source: [0xB769], NFC: [0xB769], NFD: [0x1104, 0x1175, 0x11B0], NFKC: [0xB769], NFKD: [0x1104, 0x1175, 0x11B0] }, +{ source: [0xB76A], NFC: [0xB76A], NFD: [0x1104, 0x1175, 0x11B1], NFKC: [0xB76A], NFKD: [0x1104, 0x1175, 0x11B1] }, +{ source: [0xB76B], NFC: [0xB76B], NFD: [0x1104, 0x1175, 0x11B2], NFKC: [0xB76B], NFKD: [0x1104, 0x1175, 0x11B2] }, +{ source: [0xB76C], NFC: [0xB76C], NFD: [0x1104, 0x1175, 0x11B3], NFKC: [0xB76C], NFKD: [0x1104, 0x1175, 0x11B3] }, +{ source: [0xB76D], NFC: [0xB76D], NFD: [0x1104, 0x1175, 0x11B4], NFKC: [0xB76D], NFKD: [0x1104, 0x1175, 0x11B4] }, +{ source: [0xB76E], NFC: [0xB76E], NFD: [0x1104, 0x1175, 0x11B5], NFKC: [0xB76E], NFKD: [0x1104, 0x1175, 0x11B5] }, +{ source: [0xB76F], NFC: [0xB76F], NFD: [0x1104, 0x1175, 0x11B6], NFKC: [0xB76F], NFKD: [0x1104, 0x1175, 0x11B6] }, +{ source: [0xB770], NFC: [0xB770], NFD: [0x1104, 0x1175, 0x11B7], NFKC: [0xB770], NFKD: [0x1104, 0x1175, 0x11B7] }, +{ source: [0xB771], NFC: [0xB771], NFD: [0x1104, 0x1175, 0x11B8], NFKC: [0xB771], NFKD: [0x1104, 0x1175, 0x11B8] }, +{ source: [0xB772], NFC: [0xB772], NFD: [0x1104, 0x1175, 0x11B9], NFKC: [0xB772], NFKD: [0x1104, 0x1175, 0x11B9] }, +{ source: [0xB773], NFC: [0xB773], NFD: [0x1104, 0x1175, 0x11BA], NFKC: [0xB773], NFKD: [0x1104, 0x1175, 0x11BA] }, +{ source: [0xB774], NFC: [0xB774], NFD: [0x1104, 0x1175, 0x11BB], NFKC: [0xB774], NFKD: [0x1104, 0x1175, 0x11BB] }, +{ source: [0xB775], NFC: [0xB775], NFD: [0x1104, 0x1175, 0x11BC], NFKC: [0xB775], NFKD: [0x1104, 0x1175, 0x11BC] }, +{ source: [0xB776], NFC: [0xB776], NFD: [0x1104, 0x1175, 0x11BD], NFKC: [0xB776], NFKD: [0x1104, 0x1175, 0x11BD] }, +{ source: [0xB777], NFC: [0xB777], NFD: [0x1104, 0x1175, 0x11BE], NFKC: [0xB777], NFKD: [0x1104, 0x1175, 0x11BE] }, +{ source: [0xB778], NFC: [0xB778], NFD: [0x1104, 0x1175, 0x11BF], NFKC: [0xB778], NFKD: [0x1104, 0x1175, 0x11BF] }, +{ source: [0xB779], NFC: [0xB779], NFD: [0x1104, 0x1175, 0x11C0], NFKC: [0xB779], NFKD: [0x1104, 0x1175, 0x11C0] }, +{ source: [0xB77A], NFC: [0xB77A], NFD: [0x1104, 0x1175, 0x11C1], NFKC: [0xB77A], NFKD: [0x1104, 0x1175, 0x11C1] }, +{ source: [0xB77B], NFC: [0xB77B], NFD: [0x1104, 0x1175, 0x11C2], NFKC: [0xB77B], NFKD: [0x1104, 0x1175, 0x11C2] }, +{ source: [0xB77C], NFC: [0xB77C], NFD: [0x1105, 0x1161], NFKC: [0xB77C], NFKD: [0x1105, 0x1161] }, +{ source: [0xB77D], NFC: [0xB77D], NFD: [0x1105, 0x1161, 0x11A8], NFKC: [0xB77D], NFKD: [0x1105, 0x1161, 0x11A8] }, +{ source: [0xB77E], NFC: [0xB77E], NFD: [0x1105, 0x1161, 0x11A9], NFKC: [0xB77E], NFKD: [0x1105, 0x1161, 0x11A9] }, +{ source: [0xB77F], NFC: [0xB77F], NFD: [0x1105, 0x1161, 0x11AA], NFKC: [0xB77F], NFKD: [0x1105, 0x1161, 0x11AA] }, +{ source: [0xB780], NFC: [0xB780], NFD: [0x1105, 0x1161, 0x11AB], NFKC: [0xB780], NFKD: [0x1105, 0x1161, 0x11AB] }, +{ source: [0xB781], NFC: [0xB781], NFD: [0x1105, 0x1161, 0x11AC], NFKC: [0xB781], NFKD: [0x1105, 0x1161, 0x11AC] }, +{ source: [0xB782], NFC: [0xB782], NFD: [0x1105, 0x1161, 0x11AD], NFKC: [0xB782], NFKD: [0x1105, 0x1161, 0x11AD] }, +{ source: [0xB783], NFC: [0xB783], NFD: [0x1105, 0x1161, 0x11AE], NFKC: [0xB783], NFKD: [0x1105, 0x1161, 0x11AE] }, +{ source: [0xB784], NFC: [0xB784], NFD: [0x1105, 0x1161, 0x11AF], NFKC: [0xB784], NFKD: [0x1105, 0x1161, 0x11AF] }, +{ source: [0xB785], NFC: [0xB785], NFD: [0x1105, 0x1161, 0x11B0], NFKC: [0xB785], NFKD: [0x1105, 0x1161, 0x11B0] }, +{ source: [0xB786], NFC: [0xB786], NFD: [0x1105, 0x1161, 0x11B1], NFKC: [0xB786], NFKD: [0x1105, 0x1161, 0x11B1] }, +{ source: [0xB787], NFC: [0xB787], NFD: [0x1105, 0x1161, 0x11B2], NFKC: [0xB787], NFKD: [0x1105, 0x1161, 0x11B2] }, +{ source: [0xB788], NFC: [0xB788], NFD: [0x1105, 0x1161, 0x11B3], NFKC: [0xB788], NFKD: [0x1105, 0x1161, 0x11B3] }, +{ source: [0xB789], NFC: [0xB789], NFD: [0x1105, 0x1161, 0x11B4], NFKC: [0xB789], NFKD: [0x1105, 0x1161, 0x11B4] }, +{ source: [0xB78A], NFC: [0xB78A], NFD: [0x1105, 0x1161, 0x11B5], NFKC: [0xB78A], NFKD: [0x1105, 0x1161, 0x11B5] }, +{ source: [0xB78B], NFC: [0xB78B], NFD: [0x1105, 0x1161, 0x11B6], NFKC: [0xB78B], NFKD: [0x1105, 0x1161, 0x11B6] }, +{ source: [0xB78C], NFC: [0xB78C], NFD: [0x1105, 0x1161, 0x11B7], NFKC: [0xB78C], NFKD: [0x1105, 0x1161, 0x11B7] }, +{ source: [0xB78D], NFC: [0xB78D], NFD: [0x1105, 0x1161, 0x11B8], NFKC: [0xB78D], NFKD: [0x1105, 0x1161, 0x11B8] }, +{ source: [0xB78E], NFC: [0xB78E], NFD: [0x1105, 0x1161, 0x11B9], NFKC: [0xB78E], NFKD: [0x1105, 0x1161, 0x11B9] }, +{ source: [0xB78F], NFC: [0xB78F], NFD: [0x1105, 0x1161, 0x11BA], NFKC: [0xB78F], NFKD: [0x1105, 0x1161, 0x11BA] }, +{ source: [0xB790], NFC: [0xB790], NFD: [0x1105, 0x1161, 0x11BB], NFKC: [0xB790], NFKD: [0x1105, 0x1161, 0x11BB] }, +{ source: [0xB791], NFC: [0xB791], NFD: [0x1105, 0x1161, 0x11BC], NFKC: [0xB791], NFKD: [0x1105, 0x1161, 0x11BC] }, +{ source: [0xB792], NFC: [0xB792], NFD: [0x1105, 0x1161, 0x11BD], NFKC: [0xB792], NFKD: [0x1105, 0x1161, 0x11BD] }, +{ source: [0xB793], NFC: [0xB793], NFD: [0x1105, 0x1161, 0x11BE], NFKC: [0xB793], NFKD: [0x1105, 0x1161, 0x11BE] }, +{ source: [0xB794], NFC: [0xB794], NFD: [0x1105, 0x1161, 0x11BF], NFKC: [0xB794], NFKD: [0x1105, 0x1161, 0x11BF] }, +{ source: [0xB795], NFC: [0xB795], NFD: [0x1105, 0x1161, 0x11C0], NFKC: [0xB795], NFKD: [0x1105, 0x1161, 0x11C0] }, +{ source: [0xB796], NFC: [0xB796], NFD: [0x1105, 0x1161, 0x11C1], NFKC: [0xB796], NFKD: [0x1105, 0x1161, 0x11C1] }, +{ source: [0xB797], NFC: [0xB797], NFD: [0x1105, 0x1161, 0x11C2], NFKC: [0xB797], NFKD: [0x1105, 0x1161, 0x11C2] }, +{ source: [0xB798], NFC: [0xB798], NFD: [0x1105, 0x1162], NFKC: [0xB798], NFKD: [0x1105, 0x1162] }, +{ source: [0xB799], NFC: [0xB799], NFD: [0x1105, 0x1162, 0x11A8], NFKC: [0xB799], NFKD: [0x1105, 0x1162, 0x11A8] }, +{ source: [0xB79A], NFC: [0xB79A], NFD: [0x1105, 0x1162, 0x11A9], NFKC: [0xB79A], NFKD: [0x1105, 0x1162, 0x11A9] }, +{ source: [0xB79B], NFC: [0xB79B], NFD: [0x1105, 0x1162, 0x11AA], NFKC: [0xB79B], NFKD: [0x1105, 0x1162, 0x11AA] }, +{ source: [0xB79C], NFC: [0xB79C], NFD: [0x1105, 0x1162, 0x11AB], NFKC: [0xB79C], NFKD: [0x1105, 0x1162, 0x11AB] }, +{ source: [0xB79D], NFC: [0xB79D], NFD: [0x1105, 0x1162, 0x11AC], NFKC: [0xB79D], NFKD: [0x1105, 0x1162, 0x11AC] }, +{ source: [0xB79E], NFC: [0xB79E], NFD: [0x1105, 0x1162, 0x11AD], NFKC: [0xB79E], NFKD: [0x1105, 0x1162, 0x11AD] }, +{ source: [0xB79F], NFC: [0xB79F], NFD: [0x1105, 0x1162, 0x11AE], NFKC: [0xB79F], NFKD: [0x1105, 0x1162, 0x11AE] }, +{ source: [0xB7A0], NFC: [0xB7A0], NFD: [0x1105, 0x1162, 0x11AF], NFKC: [0xB7A0], NFKD: [0x1105, 0x1162, 0x11AF] }, +{ source: [0xB7A1], NFC: [0xB7A1], NFD: [0x1105, 0x1162, 0x11B0], NFKC: [0xB7A1], NFKD: [0x1105, 0x1162, 0x11B0] }, +{ source: [0xB7A2], NFC: [0xB7A2], NFD: [0x1105, 0x1162, 0x11B1], NFKC: [0xB7A2], NFKD: [0x1105, 0x1162, 0x11B1] }, +{ source: [0xB7A3], NFC: [0xB7A3], NFD: [0x1105, 0x1162, 0x11B2], NFKC: [0xB7A3], NFKD: [0x1105, 0x1162, 0x11B2] }, +{ source: [0xB7A4], NFC: [0xB7A4], NFD: [0x1105, 0x1162, 0x11B3], NFKC: [0xB7A4], NFKD: [0x1105, 0x1162, 0x11B3] }, +{ source: [0xB7A5], NFC: [0xB7A5], NFD: [0x1105, 0x1162, 0x11B4], NFKC: [0xB7A5], NFKD: [0x1105, 0x1162, 0x11B4] }, +{ source: [0xB7A6], NFC: [0xB7A6], NFD: [0x1105, 0x1162, 0x11B5], NFKC: [0xB7A6], NFKD: [0x1105, 0x1162, 0x11B5] }, +{ source: [0xB7A7], NFC: [0xB7A7], NFD: [0x1105, 0x1162, 0x11B6], NFKC: [0xB7A7], NFKD: [0x1105, 0x1162, 0x11B6] }, +{ source: [0xB7A8], NFC: [0xB7A8], NFD: [0x1105, 0x1162, 0x11B7], NFKC: [0xB7A8], NFKD: [0x1105, 0x1162, 0x11B7] }, +{ source: [0xB7A9], NFC: [0xB7A9], NFD: [0x1105, 0x1162, 0x11B8], NFKC: [0xB7A9], NFKD: [0x1105, 0x1162, 0x11B8] }, +{ source: [0xB7AA], NFC: [0xB7AA], NFD: [0x1105, 0x1162, 0x11B9], NFKC: [0xB7AA], NFKD: [0x1105, 0x1162, 0x11B9] }, +{ source: [0xB7AB], NFC: [0xB7AB], NFD: [0x1105, 0x1162, 0x11BA], NFKC: [0xB7AB], NFKD: [0x1105, 0x1162, 0x11BA] }, +{ source: [0xB7AC], NFC: [0xB7AC], NFD: [0x1105, 0x1162, 0x11BB], NFKC: [0xB7AC], NFKD: [0x1105, 0x1162, 0x11BB] }, +{ source: [0xB7AD], NFC: [0xB7AD], NFD: [0x1105, 0x1162, 0x11BC], NFKC: [0xB7AD], NFKD: [0x1105, 0x1162, 0x11BC] }, +{ source: [0xB7AE], NFC: [0xB7AE], NFD: [0x1105, 0x1162, 0x11BD], NFKC: [0xB7AE], NFKD: [0x1105, 0x1162, 0x11BD] }, +{ source: [0xB7AF], NFC: [0xB7AF], NFD: [0x1105, 0x1162, 0x11BE], NFKC: [0xB7AF], NFKD: [0x1105, 0x1162, 0x11BE] }, +{ source: [0xB7B0], NFC: [0xB7B0], NFD: [0x1105, 0x1162, 0x11BF], NFKC: [0xB7B0], NFKD: [0x1105, 0x1162, 0x11BF] }, +{ source: [0xB7B1], NFC: [0xB7B1], NFD: [0x1105, 0x1162, 0x11C0], NFKC: [0xB7B1], NFKD: [0x1105, 0x1162, 0x11C0] }, +{ source: [0xB7B2], NFC: [0xB7B2], NFD: [0x1105, 0x1162, 0x11C1], NFKC: [0xB7B2], NFKD: [0x1105, 0x1162, 0x11C1] }, +{ source: [0xB7B3], NFC: [0xB7B3], NFD: [0x1105, 0x1162, 0x11C2], NFKC: [0xB7B3], NFKD: [0x1105, 0x1162, 0x11C2] }, +{ source: [0xB7B4], NFC: [0xB7B4], NFD: [0x1105, 0x1163], NFKC: [0xB7B4], NFKD: [0x1105, 0x1163] }, +{ source: [0xB7B5], NFC: [0xB7B5], NFD: [0x1105, 0x1163, 0x11A8], NFKC: [0xB7B5], NFKD: [0x1105, 0x1163, 0x11A8] }, +{ source: [0xB7B6], NFC: [0xB7B6], NFD: [0x1105, 0x1163, 0x11A9], NFKC: [0xB7B6], NFKD: [0x1105, 0x1163, 0x11A9] }, +{ source: [0xB7B7], NFC: [0xB7B7], NFD: [0x1105, 0x1163, 0x11AA], NFKC: [0xB7B7], NFKD: [0x1105, 0x1163, 0x11AA] }, +{ source: [0xB7B8], NFC: [0xB7B8], NFD: [0x1105, 0x1163, 0x11AB], NFKC: [0xB7B8], NFKD: [0x1105, 0x1163, 0x11AB] }, +{ source: [0xB7B9], NFC: [0xB7B9], NFD: [0x1105, 0x1163, 0x11AC], NFKC: [0xB7B9], NFKD: [0x1105, 0x1163, 0x11AC] }, +{ source: [0xB7BA], NFC: [0xB7BA], NFD: [0x1105, 0x1163, 0x11AD], NFKC: [0xB7BA], NFKD: [0x1105, 0x1163, 0x11AD] }, +{ source: [0xB7BB], NFC: [0xB7BB], NFD: [0x1105, 0x1163, 0x11AE], NFKC: [0xB7BB], NFKD: [0x1105, 0x1163, 0x11AE] }, +{ source: [0xB7BC], NFC: [0xB7BC], NFD: [0x1105, 0x1163, 0x11AF], NFKC: [0xB7BC], NFKD: [0x1105, 0x1163, 0x11AF] }, +{ source: [0xB7BD], NFC: [0xB7BD], NFD: [0x1105, 0x1163, 0x11B0], NFKC: [0xB7BD], NFKD: [0x1105, 0x1163, 0x11B0] }, +{ source: [0xB7BE], NFC: [0xB7BE], NFD: [0x1105, 0x1163, 0x11B1], NFKC: [0xB7BE], NFKD: [0x1105, 0x1163, 0x11B1] }, +{ source: [0xB7BF], NFC: [0xB7BF], NFD: [0x1105, 0x1163, 0x11B2], NFKC: [0xB7BF], NFKD: [0x1105, 0x1163, 0x11B2] }, +{ source: [0xB7C0], NFC: [0xB7C0], NFD: [0x1105, 0x1163, 0x11B3], NFKC: [0xB7C0], NFKD: [0x1105, 0x1163, 0x11B3] }, +{ source: [0xB7C1], NFC: [0xB7C1], NFD: [0x1105, 0x1163, 0x11B4], NFKC: [0xB7C1], NFKD: [0x1105, 0x1163, 0x11B4] }, +{ source: [0xB7C2], NFC: [0xB7C2], NFD: [0x1105, 0x1163, 0x11B5], NFKC: [0xB7C2], NFKD: [0x1105, 0x1163, 0x11B5] }, +{ source: [0xB7C3], NFC: [0xB7C3], NFD: [0x1105, 0x1163, 0x11B6], NFKC: [0xB7C3], NFKD: [0x1105, 0x1163, 0x11B6] }, +{ source: [0xB7C4], NFC: [0xB7C4], NFD: [0x1105, 0x1163, 0x11B7], NFKC: [0xB7C4], NFKD: [0x1105, 0x1163, 0x11B7] }, +{ source: [0xB7C5], NFC: [0xB7C5], NFD: [0x1105, 0x1163, 0x11B8], NFKC: [0xB7C5], NFKD: [0x1105, 0x1163, 0x11B8] }, +{ source: [0xB7C6], NFC: [0xB7C6], NFD: [0x1105, 0x1163, 0x11B9], NFKC: [0xB7C6], NFKD: [0x1105, 0x1163, 0x11B9] }, +{ source: [0xB7C7], NFC: [0xB7C7], NFD: [0x1105, 0x1163, 0x11BA], NFKC: [0xB7C7], NFKD: [0x1105, 0x1163, 0x11BA] }, +{ source: [0xB7C8], NFC: [0xB7C8], NFD: [0x1105, 0x1163, 0x11BB], NFKC: [0xB7C8], NFKD: [0x1105, 0x1163, 0x11BB] }, +{ source: [0xB7C9], NFC: [0xB7C9], NFD: [0x1105, 0x1163, 0x11BC], NFKC: [0xB7C9], NFKD: [0x1105, 0x1163, 0x11BC] }, +{ source: [0xB7CA], NFC: [0xB7CA], NFD: [0x1105, 0x1163, 0x11BD], NFKC: [0xB7CA], NFKD: [0x1105, 0x1163, 0x11BD] }, +{ source: [0xB7CB], NFC: [0xB7CB], NFD: [0x1105, 0x1163, 0x11BE], NFKC: [0xB7CB], NFKD: [0x1105, 0x1163, 0x11BE] }, +{ source: [0xB7CC], NFC: [0xB7CC], NFD: [0x1105, 0x1163, 0x11BF], NFKC: [0xB7CC], NFKD: [0x1105, 0x1163, 0x11BF] }, +{ source: [0xB7CD], NFC: [0xB7CD], NFD: [0x1105, 0x1163, 0x11C0], NFKC: [0xB7CD], NFKD: [0x1105, 0x1163, 0x11C0] }, +{ source: [0xB7CE], NFC: [0xB7CE], NFD: [0x1105, 0x1163, 0x11C1], NFKC: [0xB7CE], NFKD: [0x1105, 0x1163, 0x11C1] }, +{ source: [0xB7CF], NFC: [0xB7CF], NFD: [0x1105, 0x1163, 0x11C2], NFKC: [0xB7CF], NFKD: [0x1105, 0x1163, 0x11C2] }, +{ source: [0xB7D0], NFC: [0xB7D0], NFD: [0x1105, 0x1164], NFKC: [0xB7D0], NFKD: [0x1105, 0x1164] }, +{ source: [0xB7D1], NFC: [0xB7D1], NFD: [0x1105, 0x1164, 0x11A8], NFKC: [0xB7D1], NFKD: [0x1105, 0x1164, 0x11A8] }, +{ source: [0xB7D2], NFC: [0xB7D2], NFD: [0x1105, 0x1164, 0x11A9], NFKC: [0xB7D2], NFKD: [0x1105, 0x1164, 0x11A9] }, +{ source: [0xB7D3], NFC: [0xB7D3], NFD: [0x1105, 0x1164, 0x11AA], NFKC: [0xB7D3], NFKD: [0x1105, 0x1164, 0x11AA] }, +{ source: [0xB7D4], NFC: [0xB7D4], NFD: [0x1105, 0x1164, 0x11AB], NFKC: [0xB7D4], NFKD: [0x1105, 0x1164, 0x11AB] }, +{ source: [0xB7D5], NFC: [0xB7D5], NFD: [0x1105, 0x1164, 0x11AC], NFKC: [0xB7D5], NFKD: [0x1105, 0x1164, 0x11AC] }, +{ source: [0xB7D6], NFC: [0xB7D6], NFD: [0x1105, 0x1164, 0x11AD], NFKC: [0xB7D6], NFKD: [0x1105, 0x1164, 0x11AD] }, +{ source: [0xB7D7], NFC: [0xB7D7], NFD: [0x1105, 0x1164, 0x11AE], NFKC: [0xB7D7], NFKD: [0x1105, 0x1164, 0x11AE] }, +{ source: [0xB7D8], NFC: [0xB7D8], NFD: [0x1105, 0x1164, 0x11AF], NFKC: [0xB7D8], NFKD: [0x1105, 0x1164, 0x11AF] }, +{ source: [0xB7D9], NFC: [0xB7D9], NFD: [0x1105, 0x1164, 0x11B0], NFKC: [0xB7D9], NFKD: [0x1105, 0x1164, 0x11B0] }, +{ source: [0xB7DA], NFC: [0xB7DA], NFD: [0x1105, 0x1164, 0x11B1], NFKC: [0xB7DA], NFKD: [0x1105, 0x1164, 0x11B1] }, +{ source: [0xB7DB], NFC: [0xB7DB], NFD: [0x1105, 0x1164, 0x11B2], NFKC: [0xB7DB], NFKD: [0x1105, 0x1164, 0x11B2] }, +{ source: [0xB7DC], NFC: [0xB7DC], NFD: [0x1105, 0x1164, 0x11B3], NFKC: [0xB7DC], NFKD: [0x1105, 0x1164, 0x11B3] }, +{ source: [0xB7DD], NFC: [0xB7DD], NFD: [0x1105, 0x1164, 0x11B4], NFKC: [0xB7DD], NFKD: [0x1105, 0x1164, 0x11B4] }, +{ source: [0xB7DE], NFC: [0xB7DE], NFD: [0x1105, 0x1164, 0x11B5], NFKC: [0xB7DE], NFKD: [0x1105, 0x1164, 0x11B5] }, +{ source: [0xB7DF], NFC: [0xB7DF], NFD: [0x1105, 0x1164, 0x11B6], NFKC: [0xB7DF], NFKD: [0x1105, 0x1164, 0x11B6] }, +{ source: [0xB7E0], NFC: [0xB7E0], NFD: [0x1105, 0x1164, 0x11B7], NFKC: [0xB7E0], NFKD: [0x1105, 0x1164, 0x11B7] }, +{ source: [0xB7E1], NFC: [0xB7E1], NFD: [0x1105, 0x1164, 0x11B8], NFKC: [0xB7E1], NFKD: [0x1105, 0x1164, 0x11B8] }, +{ source: [0xB7E2], NFC: [0xB7E2], NFD: [0x1105, 0x1164, 0x11B9], NFKC: [0xB7E2], NFKD: [0x1105, 0x1164, 0x11B9] }, +{ source: [0xB7E3], NFC: [0xB7E3], NFD: [0x1105, 0x1164, 0x11BA], NFKC: [0xB7E3], NFKD: [0x1105, 0x1164, 0x11BA] }, +{ source: [0xB7E4], NFC: [0xB7E4], NFD: [0x1105, 0x1164, 0x11BB], NFKC: [0xB7E4], NFKD: [0x1105, 0x1164, 0x11BB] }, +{ source: [0xB7E5], NFC: [0xB7E5], NFD: [0x1105, 0x1164, 0x11BC], NFKC: [0xB7E5], NFKD: [0x1105, 0x1164, 0x11BC] }, +{ source: [0xB7E6], NFC: [0xB7E6], NFD: [0x1105, 0x1164, 0x11BD], NFKC: [0xB7E6], NFKD: [0x1105, 0x1164, 0x11BD] }, +{ source: [0xB7E7], NFC: [0xB7E7], NFD: [0x1105, 0x1164, 0x11BE], NFKC: [0xB7E7], NFKD: [0x1105, 0x1164, 0x11BE] }, +{ source: [0xB7E8], NFC: [0xB7E8], NFD: [0x1105, 0x1164, 0x11BF], NFKC: [0xB7E8], NFKD: [0x1105, 0x1164, 0x11BF] }, +{ source: [0xB7E9], NFC: [0xB7E9], NFD: [0x1105, 0x1164, 0x11C0], NFKC: [0xB7E9], NFKD: [0x1105, 0x1164, 0x11C0] }, +{ source: [0xB7EA], NFC: [0xB7EA], NFD: [0x1105, 0x1164, 0x11C1], NFKC: [0xB7EA], NFKD: [0x1105, 0x1164, 0x11C1] }, +{ source: [0xB7EB], NFC: [0xB7EB], NFD: [0x1105, 0x1164, 0x11C2], NFKC: [0xB7EB], NFKD: [0x1105, 0x1164, 0x11C2] }, +{ source: [0xB7EC], NFC: [0xB7EC], NFD: [0x1105, 0x1165], NFKC: [0xB7EC], NFKD: [0x1105, 0x1165] }, +{ source: [0xB7ED], NFC: [0xB7ED], NFD: [0x1105, 0x1165, 0x11A8], NFKC: [0xB7ED], NFKD: [0x1105, 0x1165, 0x11A8] }, +{ source: [0xB7EE], NFC: [0xB7EE], NFD: [0x1105, 0x1165, 0x11A9], NFKC: [0xB7EE], NFKD: [0x1105, 0x1165, 0x11A9] }, +{ source: [0xB7EF], NFC: [0xB7EF], NFD: [0x1105, 0x1165, 0x11AA], NFKC: [0xB7EF], NFKD: [0x1105, 0x1165, 0x11AA] }, +{ source: [0xB7F0], NFC: [0xB7F0], NFD: [0x1105, 0x1165, 0x11AB], NFKC: [0xB7F0], NFKD: [0x1105, 0x1165, 0x11AB] }, +{ source: [0xB7F1], NFC: [0xB7F1], NFD: [0x1105, 0x1165, 0x11AC], NFKC: [0xB7F1], NFKD: [0x1105, 0x1165, 0x11AC] }, +{ source: [0xB7F2], NFC: [0xB7F2], NFD: [0x1105, 0x1165, 0x11AD], NFKC: [0xB7F2], NFKD: [0x1105, 0x1165, 0x11AD] }, +{ source: [0xB7F3], NFC: [0xB7F3], NFD: [0x1105, 0x1165, 0x11AE], NFKC: [0xB7F3], NFKD: [0x1105, 0x1165, 0x11AE] }, +{ source: [0xB7F4], NFC: [0xB7F4], NFD: [0x1105, 0x1165, 0x11AF], NFKC: [0xB7F4], NFKD: [0x1105, 0x1165, 0x11AF] }, +{ source: [0xB7F5], NFC: [0xB7F5], NFD: [0x1105, 0x1165, 0x11B0], NFKC: [0xB7F5], NFKD: [0x1105, 0x1165, 0x11B0] }, +{ source: [0xB7F6], NFC: [0xB7F6], NFD: [0x1105, 0x1165, 0x11B1], NFKC: [0xB7F6], NFKD: [0x1105, 0x1165, 0x11B1] }, +{ source: [0xB7F7], NFC: [0xB7F7], NFD: [0x1105, 0x1165, 0x11B2], NFKC: [0xB7F7], NFKD: [0x1105, 0x1165, 0x11B2] }, +{ source: [0xB7F8], NFC: [0xB7F8], NFD: [0x1105, 0x1165, 0x11B3], NFKC: [0xB7F8], NFKD: [0x1105, 0x1165, 0x11B3] }, +{ source: [0xB7F9], NFC: [0xB7F9], NFD: [0x1105, 0x1165, 0x11B4], NFKC: [0xB7F9], NFKD: [0x1105, 0x1165, 0x11B4] }, +{ source: [0xB7FA], NFC: [0xB7FA], NFD: [0x1105, 0x1165, 0x11B5], NFKC: [0xB7FA], NFKD: [0x1105, 0x1165, 0x11B5] }, +{ source: [0xB7FB], NFC: [0xB7FB], NFD: [0x1105, 0x1165, 0x11B6], NFKC: [0xB7FB], NFKD: [0x1105, 0x1165, 0x11B6] }, +{ source: [0xB7FC], NFC: [0xB7FC], NFD: [0x1105, 0x1165, 0x11B7], NFKC: [0xB7FC], NFKD: [0x1105, 0x1165, 0x11B7] }, +{ source: [0xB7FD], NFC: [0xB7FD], NFD: [0x1105, 0x1165, 0x11B8], NFKC: [0xB7FD], NFKD: [0x1105, 0x1165, 0x11B8] }, +{ source: [0xB7FE], NFC: [0xB7FE], NFD: [0x1105, 0x1165, 0x11B9], NFKC: [0xB7FE], NFKD: [0x1105, 0x1165, 0x11B9] }, +{ source: [0xB7FF], NFC: [0xB7FF], NFD: [0x1105, 0x1165, 0x11BA], NFKC: [0xB7FF], NFKD: [0x1105, 0x1165, 0x11BA] }, +{ source: [0xB800], NFC: [0xB800], NFD: [0x1105, 0x1165, 0x11BB], NFKC: [0xB800], NFKD: [0x1105, 0x1165, 0x11BB] }, +{ source: [0xB801], NFC: [0xB801], NFD: [0x1105, 0x1165, 0x11BC], NFKC: [0xB801], NFKD: [0x1105, 0x1165, 0x11BC] }, +{ source: [0xB802], NFC: [0xB802], NFD: [0x1105, 0x1165, 0x11BD], NFKC: [0xB802], NFKD: [0x1105, 0x1165, 0x11BD] }, +{ source: [0xB803], NFC: [0xB803], NFD: [0x1105, 0x1165, 0x11BE], NFKC: [0xB803], NFKD: [0x1105, 0x1165, 0x11BE] }, +{ source: [0xB804], NFC: [0xB804], NFD: [0x1105, 0x1165, 0x11BF], NFKC: [0xB804], NFKD: [0x1105, 0x1165, 0x11BF] }, +{ source: [0xB805], NFC: [0xB805], NFD: [0x1105, 0x1165, 0x11C0], NFKC: [0xB805], NFKD: [0x1105, 0x1165, 0x11C0] }, +{ source: [0xB806], NFC: [0xB806], NFD: [0x1105, 0x1165, 0x11C1], NFKC: [0xB806], NFKD: [0x1105, 0x1165, 0x11C1] }, +{ source: [0xB807], NFC: [0xB807], NFD: [0x1105, 0x1165, 0x11C2], NFKC: [0xB807], NFKD: [0x1105, 0x1165, 0x11C2] }, +{ source: [0xB808], NFC: [0xB808], NFD: [0x1105, 0x1166], NFKC: [0xB808], NFKD: [0x1105, 0x1166] }, +{ source: [0xB809], NFC: [0xB809], NFD: [0x1105, 0x1166, 0x11A8], NFKC: [0xB809], NFKD: [0x1105, 0x1166, 0x11A8] }, +{ source: [0xB80A], NFC: [0xB80A], NFD: [0x1105, 0x1166, 0x11A9], NFKC: [0xB80A], NFKD: [0x1105, 0x1166, 0x11A9] }, +{ source: [0xB80B], NFC: [0xB80B], NFD: [0x1105, 0x1166, 0x11AA], NFKC: [0xB80B], NFKD: [0x1105, 0x1166, 0x11AA] }, +{ source: [0xB80C], NFC: [0xB80C], NFD: [0x1105, 0x1166, 0x11AB], NFKC: [0xB80C], NFKD: [0x1105, 0x1166, 0x11AB] }, +{ source: [0xB80D], NFC: [0xB80D], NFD: [0x1105, 0x1166, 0x11AC], NFKC: [0xB80D], NFKD: [0x1105, 0x1166, 0x11AC] }, +{ source: [0xB80E], NFC: [0xB80E], NFD: [0x1105, 0x1166, 0x11AD], NFKC: [0xB80E], NFKD: [0x1105, 0x1166, 0x11AD] }, +{ source: [0xB80F], NFC: [0xB80F], NFD: [0x1105, 0x1166, 0x11AE], NFKC: [0xB80F], NFKD: [0x1105, 0x1166, 0x11AE] }, +{ source: [0xB810], NFC: [0xB810], NFD: [0x1105, 0x1166, 0x11AF], NFKC: [0xB810], NFKD: [0x1105, 0x1166, 0x11AF] }, +{ source: [0xB811], NFC: [0xB811], NFD: [0x1105, 0x1166, 0x11B0], NFKC: [0xB811], NFKD: [0x1105, 0x1166, 0x11B0] }, +{ source: [0xB812], NFC: [0xB812], NFD: [0x1105, 0x1166, 0x11B1], NFKC: [0xB812], NFKD: [0x1105, 0x1166, 0x11B1] }, +{ source: [0xB813], NFC: [0xB813], NFD: [0x1105, 0x1166, 0x11B2], NFKC: [0xB813], NFKD: [0x1105, 0x1166, 0x11B2] }, +{ source: [0xB814], NFC: [0xB814], NFD: [0x1105, 0x1166, 0x11B3], NFKC: [0xB814], NFKD: [0x1105, 0x1166, 0x11B3] }, +{ source: [0xB815], NFC: [0xB815], NFD: [0x1105, 0x1166, 0x11B4], NFKC: [0xB815], NFKD: [0x1105, 0x1166, 0x11B4] }, +{ source: [0xB816], NFC: [0xB816], NFD: [0x1105, 0x1166, 0x11B5], NFKC: [0xB816], NFKD: [0x1105, 0x1166, 0x11B5] }, +{ source: [0xB817], NFC: [0xB817], NFD: [0x1105, 0x1166, 0x11B6], NFKC: [0xB817], NFKD: [0x1105, 0x1166, 0x11B6] }, +{ source: [0xB818], NFC: [0xB818], NFD: [0x1105, 0x1166, 0x11B7], NFKC: [0xB818], NFKD: [0x1105, 0x1166, 0x11B7] }, +{ source: [0xB819], NFC: [0xB819], NFD: [0x1105, 0x1166, 0x11B8], NFKC: [0xB819], NFKD: [0x1105, 0x1166, 0x11B8] }, +{ source: [0xB81A], NFC: [0xB81A], NFD: [0x1105, 0x1166, 0x11B9], NFKC: [0xB81A], NFKD: [0x1105, 0x1166, 0x11B9] }, +{ source: [0xB81B], NFC: [0xB81B], NFD: [0x1105, 0x1166, 0x11BA], NFKC: [0xB81B], NFKD: [0x1105, 0x1166, 0x11BA] }, +{ source: [0xB81C], NFC: [0xB81C], NFD: [0x1105, 0x1166, 0x11BB], NFKC: [0xB81C], NFKD: [0x1105, 0x1166, 0x11BB] }, +{ source: [0xB81D], NFC: [0xB81D], NFD: [0x1105, 0x1166, 0x11BC], NFKC: [0xB81D], NFKD: [0x1105, 0x1166, 0x11BC] }, +{ source: [0xB81E], NFC: [0xB81E], NFD: [0x1105, 0x1166, 0x11BD], NFKC: [0xB81E], NFKD: [0x1105, 0x1166, 0x11BD] }, +{ source: [0xB81F], NFC: [0xB81F], NFD: [0x1105, 0x1166, 0x11BE], NFKC: [0xB81F], NFKD: [0x1105, 0x1166, 0x11BE] }, +{ source: [0xB820], NFC: [0xB820], NFD: [0x1105, 0x1166, 0x11BF], NFKC: [0xB820], NFKD: [0x1105, 0x1166, 0x11BF] }, +{ source: [0xB821], NFC: [0xB821], NFD: [0x1105, 0x1166, 0x11C0], NFKC: [0xB821], NFKD: [0x1105, 0x1166, 0x11C0] }, +{ source: [0xB822], NFC: [0xB822], NFD: [0x1105, 0x1166, 0x11C1], NFKC: [0xB822], NFKD: [0x1105, 0x1166, 0x11C1] }, +{ source: [0xB823], NFC: [0xB823], NFD: [0x1105, 0x1166, 0x11C2], NFKC: [0xB823], NFKD: [0x1105, 0x1166, 0x11C2] }, +{ source: [0xB824], NFC: [0xB824], NFD: [0x1105, 0x1167], NFKC: [0xB824], NFKD: [0x1105, 0x1167] }, +{ source: [0xB825], NFC: [0xB825], NFD: [0x1105, 0x1167, 0x11A8], NFKC: [0xB825], NFKD: [0x1105, 0x1167, 0x11A8] }, +{ source: [0xB826], NFC: [0xB826], NFD: [0x1105, 0x1167, 0x11A9], NFKC: [0xB826], NFKD: [0x1105, 0x1167, 0x11A9] }, +{ source: [0xB827], NFC: [0xB827], NFD: [0x1105, 0x1167, 0x11AA], NFKC: [0xB827], NFKD: [0x1105, 0x1167, 0x11AA] }, +{ source: [0xB828], NFC: [0xB828], NFD: [0x1105, 0x1167, 0x11AB], NFKC: [0xB828], NFKD: [0x1105, 0x1167, 0x11AB] }, +{ source: [0xB829], NFC: [0xB829], NFD: [0x1105, 0x1167, 0x11AC], NFKC: [0xB829], NFKD: [0x1105, 0x1167, 0x11AC] }, +{ source: [0xB82A], NFC: [0xB82A], NFD: [0x1105, 0x1167, 0x11AD], NFKC: [0xB82A], NFKD: [0x1105, 0x1167, 0x11AD] }, +{ source: [0xB82B], NFC: [0xB82B], NFD: [0x1105, 0x1167, 0x11AE], NFKC: [0xB82B], NFKD: [0x1105, 0x1167, 0x11AE] }, +{ source: [0xB82C], NFC: [0xB82C], NFD: [0x1105, 0x1167, 0x11AF], NFKC: [0xB82C], NFKD: [0x1105, 0x1167, 0x11AF] }, +{ source: [0xB82D], NFC: [0xB82D], NFD: [0x1105, 0x1167, 0x11B0], NFKC: [0xB82D], NFKD: [0x1105, 0x1167, 0x11B0] }, +{ source: [0xB82E], NFC: [0xB82E], NFD: [0x1105, 0x1167, 0x11B1], NFKC: [0xB82E], NFKD: [0x1105, 0x1167, 0x11B1] }, +{ source: [0xB82F], NFC: [0xB82F], NFD: [0x1105, 0x1167, 0x11B2], NFKC: [0xB82F], NFKD: [0x1105, 0x1167, 0x11B2] }, +{ source: [0xB830], NFC: [0xB830], NFD: [0x1105, 0x1167, 0x11B3], NFKC: [0xB830], NFKD: [0x1105, 0x1167, 0x11B3] }, +{ source: [0xB831], NFC: [0xB831], NFD: [0x1105, 0x1167, 0x11B4], NFKC: [0xB831], NFKD: [0x1105, 0x1167, 0x11B4] }, +{ source: [0xB832], NFC: [0xB832], NFD: [0x1105, 0x1167, 0x11B5], NFKC: [0xB832], NFKD: [0x1105, 0x1167, 0x11B5] }, +{ source: [0xB833], NFC: [0xB833], NFD: [0x1105, 0x1167, 0x11B6], NFKC: [0xB833], NFKD: [0x1105, 0x1167, 0x11B6] }, +{ source: [0xB834], NFC: [0xB834], NFD: [0x1105, 0x1167, 0x11B7], NFKC: [0xB834], NFKD: [0x1105, 0x1167, 0x11B7] }, +{ source: [0xB835], NFC: [0xB835], NFD: [0x1105, 0x1167, 0x11B8], NFKC: [0xB835], NFKD: [0x1105, 0x1167, 0x11B8] }, +{ source: [0xB836], NFC: [0xB836], NFD: [0x1105, 0x1167, 0x11B9], NFKC: [0xB836], NFKD: [0x1105, 0x1167, 0x11B9] }, +{ source: [0xB837], NFC: [0xB837], NFD: [0x1105, 0x1167, 0x11BA], NFKC: [0xB837], NFKD: [0x1105, 0x1167, 0x11BA] }, +{ source: [0xB838], NFC: [0xB838], NFD: [0x1105, 0x1167, 0x11BB], NFKC: [0xB838], NFKD: [0x1105, 0x1167, 0x11BB] }, +{ source: [0xB839], NFC: [0xB839], NFD: [0x1105, 0x1167, 0x11BC], NFKC: [0xB839], NFKD: [0x1105, 0x1167, 0x11BC] }, +{ source: [0xB83A], NFC: [0xB83A], NFD: [0x1105, 0x1167, 0x11BD], NFKC: [0xB83A], NFKD: [0x1105, 0x1167, 0x11BD] }, +{ source: [0xB83B], NFC: [0xB83B], NFD: [0x1105, 0x1167, 0x11BE], NFKC: [0xB83B], NFKD: [0x1105, 0x1167, 0x11BE] }, +{ source: [0xB83C], NFC: [0xB83C], NFD: [0x1105, 0x1167, 0x11BF], NFKC: [0xB83C], NFKD: [0x1105, 0x1167, 0x11BF] }, +{ source: [0xB83D], NFC: [0xB83D], NFD: [0x1105, 0x1167, 0x11C0], NFKC: [0xB83D], NFKD: [0x1105, 0x1167, 0x11C0] }, +{ source: [0xB83E], NFC: [0xB83E], NFD: [0x1105, 0x1167, 0x11C1], NFKC: [0xB83E], NFKD: [0x1105, 0x1167, 0x11C1] }, +{ source: [0xB83F], NFC: [0xB83F], NFD: [0x1105, 0x1167, 0x11C2], NFKC: [0xB83F], NFKD: [0x1105, 0x1167, 0x11C2] }, +{ source: [0xB840], NFC: [0xB840], NFD: [0x1105, 0x1168], NFKC: [0xB840], NFKD: [0x1105, 0x1168] }, +{ source: [0xB841], NFC: [0xB841], NFD: [0x1105, 0x1168, 0x11A8], NFKC: [0xB841], NFKD: [0x1105, 0x1168, 0x11A8] }, +{ source: [0xB842], NFC: [0xB842], NFD: [0x1105, 0x1168, 0x11A9], NFKC: [0xB842], NFKD: [0x1105, 0x1168, 0x11A9] }, +{ source: [0xB843], NFC: [0xB843], NFD: [0x1105, 0x1168, 0x11AA], NFKC: [0xB843], NFKD: [0x1105, 0x1168, 0x11AA] }, +{ source: [0xB844], NFC: [0xB844], NFD: [0x1105, 0x1168, 0x11AB], NFKC: [0xB844], NFKD: [0x1105, 0x1168, 0x11AB] }, +{ source: [0xB845], NFC: [0xB845], NFD: [0x1105, 0x1168, 0x11AC], NFKC: [0xB845], NFKD: [0x1105, 0x1168, 0x11AC] }, +{ source: [0xB846], NFC: [0xB846], NFD: [0x1105, 0x1168, 0x11AD], NFKC: [0xB846], NFKD: [0x1105, 0x1168, 0x11AD] }, +{ source: [0xB847], NFC: [0xB847], NFD: [0x1105, 0x1168, 0x11AE], NFKC: [0xB847], NFKD: [0x1105, 0x1168, 0x11AE] }, +{ source: [0xB848], NFC: [0xB848], NFD: [0x1105, 0x1168, 0x11AF], NFKC: [0xB848], NFKD: [0x1105, 0x1168, 0x11AF] }, +{ source: [0xB849], NFC: [0xB849], NFD: [0x1105, 0x1168, 0x11B0], NFKC: [0xB849], NFKD: [0x1105, 0x1168, 0x11B0] }, +{ source: [0xB84A], NFC: [0xB84A], NFD: [0x1105, 0x1168, 0x11B1], NFKC: [0xB84A], NFKD: [0x1105, 0x1168, 0x11B1] }, +{ source: [0xB84B], NFC: [0xB84B], NFD: [0x1105, 0x1168, 0x11B2], NFKC: [0xB84B], NFKD: [0x1105, 0x1168, 0x11B2] }, +{ source: [0xB84C], NFC: [0xB84C], NFD: [0x1105, 0x1168, 0x11B3], NFKC: [0xB84C], NFKD: [0x1105, 0x1168, 0x11B3] }, +{ source: [0xB84D], NFC: [0xB84D], NFD: [0x1105, 0x1168, 0x11B4], NFKC: [0xB84D], NFKD: [0x1105, 0x1168, 0x11B4] }, +{ source: [0xB84E], NFC: [0xB84E], NFD: [0x1105, 0x1168, 0x11B5], NFKC: [0xB84E], NFKD: [0x1105, 0x1168, 0x11B5] }, +{ source: [0xB84F], NFC: [0xB84F], NFD: [0x1105, 0x1168, 0x11B6], NFKC: [0xB84F], NFKD: [0x1105, 0x1168, 0x11B6] }, +{ source: [0xB850], NFC: [0xB850], NFD: [0x1105, 0x1168, 0x11B7], NFKC: [0xB850], NFKD: [0x1105, 0x1168, 0x11B7] }, +{ source: [0xB851], NFC: [0xB851], NFD: [0x1105, 0x1168, 0x11B8], NFKC: [0xB851], NFKD: [0x1105, 0x1168, 0x11B8] }, +{ source: [0xB852], NFC: [0xB852], NFD: [0x1105, 0x1168, 0x11B9], NFKC: [0xB852], NFKD: [0x1105, 0x1168, 0x11B9] }, +{ source: [0xB853], NFC: [0xB853], NFD: [0x1105, 0x1168, 0x11BA], NFKC: [0xB853], NFKD: [0x1105, 0x1168, 0x11BA] }, +{ source: [0xB854], NFC: [0xB854], NFD: [0x1105, 0x1168, 0x11BB], NFKC: [0xB854], NFKD: [0x1105, 0x1168, 0x11BB] }, +{ source: [0xB855], NFC: [0xB855], NFD: [0x1105, 0x1168, 0x11BC], NFKC: [0xB855], NFKD: [0x1105, 0x1168, 0x11BC] }, +{ source: [0xB856], NFC: [0xB856], NFD: [0x1105, 0x1168, 0x11BD], NFKC: [0xB856], NFKD: [0x1105, 0x1168, 0x11BD] }, +{ source: [0xB857], NFC: [0xB857], NFD: [0x1105, 0x1168, 0x11BE], NFKC: [0xB857], NFKD: [0x1105, 0x1168, 0x11BE] }, +{ source: [0xB858], NFC: [0xB858], NFD: [0x1105, 0x1168, 0x11BF], NFKC: [0xB858], NFKD: [0x1105, 0x1168, 0x11BF] }, +{ source: [0xB859], NFC: [0xB859], NFD: [0x1105, 0x1168, 0x11C0], NFKC: [0xB859], NFKD: [0x1105, 0x1168, 0x11C0] }, +{ source: [0xB85A], NFC: [0xB85A], NFD: [0x1105, 0x1168, 0x11C1], NFKC: [0xB85A], NFKD: [0x1105, 0x1168, 0x11C1] }, +{ source: [0xB85B], NFC: [0xB85B], NFD: [0x1105, 0x1168, 0x11C2], NFKC: [0xB85B], NFKD: [0x1105, 0x1168, 0x11C2] }, +{ source: [0xB85C], NFC: [0xB85C], NFD: [0x1105, 0x1169], NFKC: [0xB85C], NFKD: [0x1105, 0x1169] }, +{ source: [0xB85D], NFC: [0xB85D], NFD: [0x1105, 0x1169, 0x11A8], NFKC: [0xB85D], NFKD: [0x1105, 0x1169, 0x11A8] }, +{ source: [0xB85E], NFC: [0xB85E], NFD: [0x1105, 0x1169, 0x11A9], NFKC: [0xB85E], NFKD: [0x1105, 0x1169, 0x11A9] }, +{ source: [0xB85F], NFC: [0xB85F], NFD: [0x1105, 0x1169, 0x11AA], NFKC: [0xB85F], NFKD: [0x1105, 0x1169, 0x11AA] }, +{ source: [0xB860], NFC: [0xB860], NFD: [0x1105, 0x1169, 0x11AB], NFKC: [0xB860], NFKD: [0x1105, 0x1169, 0x11AB] }, +{ source: [0xB861], NFC: [0xB861], NFD: [0x1105, 0x1169, 0x11AC], NFKC: [0xB861], NFKD: [0x1105, 0x1169, 0x11AC] }, +{ source: [0xB862], NFC: [0xB862], NFD: [0x1105, 0x1169, 0x11AD], NFKC: [0xB862], NFKD: [0x1105, 0x1169, 0x11AD] }, +{ source: [0xB863], NFC: [0xB863], NFD: [0x1105, 0x1169, 0x11AE], NFKC: [0xB863], NFKD: [0x1105, 0x1169, 0x11AE] }, +{ source: [0xB864], NFC: [0xB864], NFD: [0x1105, 0x1169, 0x11AF], NFKC: [0xB864], NFKD: [0x1105, 0x1169, 0x11AF] }, +{ source: [0xB865], NFC: [0xB865], NFD: [0x1105, 0x1169, 0x11B0], NFKC: [0xB865], NFKD: [0x1105, 0x1169, 0x11B0] }, +{ source: [0xB866], NFC: [0xB866], NFD: [0x1105, 0x1169, 0x11B1], NFKC: [0xB866], NFKD: [0x1105, 0x1169, 0x11B1] }, +{ source: [0xB867], NFC: [0xB867], NFD: [0x1105, 0x1169, 0x11B2], NFKC: [0xB867], NFKD: [0x1105, 0x1169, 0x11B2] }, +{ source: [0xB868], NFC: [0xB868], NFD: [0x1105, 0x1169, 0x11B3], NFKC: [0xB868], NFKD: [0x1105, 0x1169, 0x11B3] }, +{ source: [0xB869], NFC: [0xB869], NFD: [0x1105, 0x1169, 0x11B4], NFKC: [0xB869], NFKD: [0x1105, 0x1169, 0x11B4] }, +{ source: [0xB86A], NFC: [0xB86A], NFD: [0x1105, 0x1169, 0x11B5], NFKC: [0xB86A], NFKD: [0x1105, 0x1169, 0x11B5] }, +{ source: [0xB86B], NFC: [0xB86B], NFD: [0x1105, 0x1169, 0x11B6], NFKC: [0xB86B], NFKD: [0x1105, 0x1169, 0x11B6] }, +{ source: [0xB86C], NFC: [0xB86C], NFD: [0x1105, 0x1169, 0x11B7], NFKC: [0xB86C], NFKD: [0x1105, 0x1169, 0x11B7] }, +{ source: [0xB86D], NFC: [0xB86D], NFD: [0x1105, 0x1169, 0x11B8], NFKC: [0xB86D], NFKD: [0x1105, 0x1169, 0x11B8] }, +{ source: [0xB86E], NFC: [0xB86E], NFD: [0x1105, 0x1169, 0x11B9], NFKC: [0xB86E], NFKD: [0x1105, 0x1169, 0x11B9] }, +{ source: [0xB86F], NFC: [0xB86F], NFD: [0x1105, 0x1169, 0x11BA], NFKC: [0xB86F], NFKD: [0x1105, 0x1169, 0x11BA] }, +{ source: [0xB870], NFC: [0xB870], NFD: [0x1105, 0x1169, 0x11BB], NFKC: [0xB870], NFKD: [0x1105, 0x1169, 0x11BB] }, +{ source: [0xB871], NFC: [0xB871], NFD: [0x1105, 0x1169, 0x11BC], NFKC: [0xB871], NFKD: [0x1105, 0x1169, 0x11BC] }, +{ source: [0xB872], NFC: [0xB872], NFD: [0x1105, 0x1169, 0x11BD], NFKC: [0xB872], NFKD: [0x1105, 0x1169, 0x11BD] }, +{ source: [0xB873], NFC: [0xB873], NFD: [0x1105, 0x1169, 0x11BE], NFKC: [0xB873], NFKD: [0x1105, 0x1169, 0x11BE] }, +{ source: [0xB874], NFC: [0xB874], NFD: [0x1105, 0x1169, 0x11BF], NFKC: [0xB874], NFKD: [0x1105, 0x1169, 0x11BF] }, +{ source: [0xB875], NFC: [0xB875], NFD: [0x1105, 0x1169, 0x11C0], NFKC: [0xB875], NFKD: [0x1105, 0x1169, 0x11C0] }, +{ source: [0xB876], NFC: [0xB876], NFD: [0x1105, 0x1169, 0x11C1], NFKC: [0xB876], NFKD: [0x1105, 0x1169, 0x11C1] }, +{ source: [0xB877], NFC: [0xB877], NFD: [0x1105, 0x1169, 0x11C2], NFKC: [0xB877], NFKD: [0x1105, 0x1169, 0x11C2] }, +{ source: [0xB878], NFC: [0xB878], NFD: [0x1105, 0x116A], NFKC: [0xB878], NFKD: [0x1105, 0x116A] }, +{ source: [0xB879], NFC: [0xB879], NFD: [0x1105, 0x116A, 0x11A8], NFKC: [0xB879], NFKD: [0x1105, 0x116A, 0x11A8] }, +{ source: [0xB87A], NFC: [0xB87A], NFD: [0x1105, 0x116A, 0x11A9], NFKC: [0xB87A], NFKD: [0x1105, 0x116A, 0x11A9] }, +{ source: [0xB87B], NFC: [0xB87B], NFD: [0x1105, 0x116A, 0x11AA], NFKC: [0xB87B], NFKD: [0x1105, 0x116A, 0x11AA] }, +{ source: [0xB87C], NFC: [0xB87C], NFD: [0x1105, 0x116A, 0x11AB], NFKC: [0xB87C], NFKD: [0x1105, 0x116A, 0x11AB] }, +{ source: [0xB87D], NFC: [0xB87D], NFD: [0x1105, 0x116A, 0x11AC], NFKC: [0xB87D], NFKD: [0x1105, 0x116A, 0x11AC] }, +{ source: [0xB87E], NFC: [0xB87E], NFD: [0x1105, 0x116A, 0x11AD], NFKC: [0xB87E], NFKD: [0x1105, 0x116A, 0x11AD] }, +{ source: [0xB87F], NFC: [0xB87F], NFD: [0x1105, 0x116A, 0x11AE], NFKC: [0xB87F], NFKD: [0x1105, 0x116A, 0x11AE] }, +{ source: [0xB880], NFC: [0xB880], NFD: [0x1105, 0x116A, 0x11AF], NFKC: [0xB880], NFKD: [0x1105, 0x116A, 0x11AF] }, +{ source: [0xB881], NFC: [0xB881], NFD: [0x1105, 0x116A, 0x11B0], NFKC: [0xB881], NFKD: [0x1105, 0x116A, 0x11B0] }, +{ source: [0xB882], NFC: [0xB882], NFD: [0x1105, 0x116A, 0x11B1], NFKC: [0xB882], NFKD: [0x1105, 0x116A, 0x11B1] }, +{ source: [0xB883], NFC: [0xB883], NFD: [0x1105, 0x116A, 0x11B2], NFKC: [0xB883], NFKD: [0x1105, 0x116A, 0x11B2] }, +{ source: [0xB884], NFC: [0xB884], NFD: [0x1105, 0x116A, 0x11B3], NFKC: [0xB884], NFKD: [0x1105, 0x116A, 0x11B3] }, +{ source: [0xB885], NFC: [0xB885], NFD: [0x1105, 0x116A, 0x11B4], NFKC: [0xB885], NFKD: [0x1105, 0x116A, 0x11B4] }, +{ source: [0xB886], NFC: [0xB886], NFD: [0x1105, 0x116A, 0x11B5], NFKC: [0xB886], NFKD: [0x1105, 0x116A, 0x11B5] }, +{ source: [0xB887], NFC: [0xB887], NFD: [0x1105, 0x116A, 0x11B6], NFKC: [0xB887], NFKD: [0x1105, 0x116A, 0x11B6] }, +{ source: [0xB888], NFC: [0xB888], NFD: [0x1105, 0x116A, 0x11B7], NFKC: [0xB888], NFKD: [0x1105, 0x116A, 0x11B7] }, +{ source: [0xB889], NFC: [0xB889], NFD: [0x1105, 0x116A, 0x11B8], NFKC: [0xB889], NFKD: [0x1105, 0x116A, 0x11B8] }, +{ source: [0xB88A], NFC: [0xB88A], NFD: [0x1105, 0x116A, 0x11B9], NFKC: [0xB88A], NFKD: [0x1105, 0x116A, 0x11B9] }, +{ source: [0xB88B], NFC: [0xB88B], NFD: [0x1105, 0x116A, 0x11BA], NFKC: [0xB88B], NFKD: [0x1105, 0x116A, 0x11BA] }, +{ source: [0xB88C], NFC: [0xB88C], NFD: [0x1105, 0x116A, 0x11BB], NFKC: [0xB88C], NFKD: [0x1105, 0x116A, 0x11BB] }, +{ source: [0xB88D], NFC: [0xB88D], NFD: [0x1105, 0x116A, 0x11BC], NFKC: [0xB88D], NFKD: [0x1105, 0x116A, 0x11BC] }, +{ source: [0xB88E], NFC: [0xB88E], NFD: [0x1105, 0x116A, 0x11BD], NFKC: [0xB88E], NFKD: [0x1105, 0x116A, 0x11BD] }, +{ source: [0xB88F], NFC: [0xB88F], NFD: [0x1105, 0x116A, 0x11BE], NFKC: [0xB88F], NFKD: [0x1105, 0x116A, 0x11BE] }, +{ source: [0xB890], NFC: [0xB890], NFD: [0x1105, 0x116A, 0x11BF], NFKC: [0xB890], NFKD: [0x1105, 0x116A, 0x11BF] }, +{ source: [0xB891], NFC: [0xB891], NFD: [0x1105, 0x116A, 0x11C0], NFKC: [0xB891], NFKD: [0x1105, 0x116A, 0x11C0] }, +{ source: [0xB892], NFC: [0xB892], NFD: [0x1105, 0x116A, 0x11C1], NFKC: [0xB892], NFKD: [0x1105, 0x116A, 0x11C1] }, +{ source: [0xB893], NFC: [0xB893], NFD: [0x1105, 0x116A, 0x11C2], NFKC: [0xB893], NFKD: [0x1105, 0x116A, 0x11C2] }, +{ source: [0xB894], NFC: [0xB894], NFD: [0x1105, 0x116B], NFKC: [0xB894], NFKD: [0x1105, 0x116B] }, +{ source: [0xB895], NFC: [0xB895], NFD: [0x1105, 0x116B, 0x11A8], NFKC: [0xB895], NFKD: [0x1105, 0x116B, 0x11A8] }, +{ source: [0xB896], NFC: [0xB896], NFD: [0x1105, 0x116B, 0x11A9], NFKC: [0xB896], NFKD: [0x1105, 0x116B, 0x11A9] }, +{ source: [0xB897], NFC: [0xB897], NFD: [0x1105, 0x116B, 0x11AA], NFKC: [0xB897], NFKD: [0x1105, 0x116B, 0x11AA] }, +{ source: [0xB898], NFC: [0xB898], NFD: [0x1105, 0x116B, 0x11AB], NFKC: [0xB898], NFKD: [0x1105, 0x116B, 0x11AB] }, +{ source: [0xB899], NFC: [0xB899], NFD: [0x1105, 0x116B, 0x11AC], NFKC: [0xB899], NFKD: [0x1105, 0x116B, 0x11AC] }, +{ source: [0xB89A], NFC: [0xB89A], NFD: [0x1105, 0x116B, 0x11AD], NFKC: [0xB89A], NFKD: [0x1105, 0x116B, 0x11AD] }, +{ source: [0xB89B], NFC: [0xB89B], NFD: [0x1105, 0x116B, 0x11AE], NFKC: [0xB89B], NFKD: [0x1105, 0x116B, 0x11AE] }, +{ source: [0xB89C], NFC: [0xB89C], NFD: [0x1105, 0x116B, 0x11AF], NFKC: [0xB89C], NFKD: [0x1105, 0x116B, 0x11AF] }, +{ source: [0xB89D], NFC: [0xB89D], NFD: [0x1105, 0x116B, 0x11B0], NFKC: [0xB89D], NFKD: [0x1105, 0x116B, 0x11B0] }, +{ source: [0xB89E], NFC: [0xB89E], NFD: [0x1105, 0x116B, 0x11B1], NFKC: [0xB89E], NFKD: [0x1105, 0x116B, 0x11B1] }, +{ source: [0xB89F], NFC: [0xB89F], NFD: [0x1105, 0x116B, 0x11B2], NFKC: [0xB89F], NFKD: [0x1105, 0x116B, 0x11B2] }, +{ source: [0xB8A0], NFC: [0xB8A0], NFD: [0x1105, 0x116B, 0x11B3], NFKC: [0xB8A0], NFKD: [0x1105, 0x116B, 0x11B3] }, +{ source: [0xB8A1], NFC: [0xB8A1], NFD: [0x1105, 0x116B, 0x11B4], NFKC: [0xB8A1], NFKD: [0x1105, 0x116B, 0x11B4] }, +{ source: [0xB8A2], NFC: [0xB8A2], NFD: [0x1105, 0x116B, 0x11B5], NFKC: [0xB8A2], NFKD: [0x1105, 0x116B, 0x11B5] }, +{ source: [0xB8A3], NFC: [0xB8A3], NFD: [0x1105, 0x116B, 0x11B6], NFKC: [0xB8A3], NFKD: [0x1105, 0x116B, 0x11B6] }, +{ source: [0xB8A4], NFC: [0xB8A4], NFD: [0x1105, 0x116B, 0x11B7], NFKC: [0xB8A4], NFKD: [0x1105, 0x116B, 0x11B7] }, +{ source: [0xB8A5], NFC: [0xB8A5], NFD: [0x1105, 0x116B, 0x11B8], NFKC: [0xB8A5], NFKD: [0x1105, 0x116B, 0x11B8] }, +{ source: [0xB8A6], NFC: [0xB8A6], NFD: [0x1105, 0x116B, 0x11B9], NFKC: [0xB8A6], NFKD: [0x1105, 0x116B, 0x11B9] }, +{ source: [0xB8A7], NFC: [0xB8A7], NFD: [0x1105, 0x116B, 0x11BA], NFKC: [0xB8A7], NFKD: [0x1105, 0x116B, 0x11BA] }, +{ source: [0xB8A8], NFC: [0xB8A8], NFD: [0x1105, 0x116B, 0x11BB], NFKC: [0xB8A8], NFKD: [0x1105, 0x116B, 0x11BB] }, +{ source: [0xB8A9], NFC: [0xB8A9], NFD: [0x1105, 0x116B, 0x11BC], NFKC: [0xB8A9], NFKD: [0x1105, 0x116B, 0x11BC] }, +{ source: [0xB8AA], NFC: [0xB8AA], NFD: [0x1105, 0x116B, 0x11BD], NFKC: [0xB8AA], NFKD: [0x1105, 0x116B, 0x11BD] }, +{ source: [0xB8AB], NFC: [0xB8AB], NFD: [0x1105, 0x116B, 0x11BE], NFKC: [0xB8AB], NFKD: [0x1105, 0x116B, 0x11BE] }, +{ source: [0xB8AC], NFC: [0xB8AC], NFD: [0x1105, 0x116B, 0x11BF], NFKC: [0xB8AC], NFKD: [0x1105, 0x116B, 0x11BF] }, +{ source: [0xB8AD], NFC: [0xB8AD], NFD: [0x1105, 0x116B, 0x11C0], NFKC: [0xB8AD], NFKD: [0x1105, 0x116B, 0x11C0] }, +{ source: [0xB8AE], NFC: [0xB8AE], NFD: [0x1105, 0x116B, 0x11C1], NFKC: [0xB8AE], NFKD: [0x1105, 0x116B, 0x11C1] }, +{ source: [0xB8AF], NFC: [0xB8AF], NFD: [0x1105, 0x116B, 0x11C2], NFKC: [0xB8AF], NFKD: [0x1105, 0x116B, 0x11C2] }, +{ source: [0xB8B0], NFC: [0xB8B0], NFD: [0x1105, 0x116C], NFKC: [0xB8B0], NFKD: [0x1105, 0x116C] }, +{ source: [0xB8B1], NFC: [0xB8B1], NFD: [0x1105, 0x116C, 0x11A8], NFKC: [0xB8B1], NFKD: [0x1105, 0x116C, 0x11A8] }, +{ source: [0xB8B2], NFC: [0xB8B2], NFD: [0x1105, 0x116C, 0x11A9], NFKC: [0xB8B2], NFKD: [0x1105, 0x116C, 0x11A9] }, +{ source: [0xB8B3], NFC: [0xB8B3], NFD: [0x1105, 0x116C, 0x11AA], NFKC: [0xB8B3], NFKD: [0x1105, 0x116C, 0x11AA] }, +{ source: [0xB8B4], NFC: [0xB8B4], NFD: [0x1105, 0x116C, 0x11AB], NFKC: [0xB8B4], NFKD: [0x1105, 0x116C, 0x11AB] }, +{ source: [0xB8B5], NFC: [0xB8B5], NFD: [0x1105, 0x116C, 0x11AC], NFKC: [0xB8B5], NFKD: [0x1105, 0x116C, 0x11AC] }, +{ source: [0xB8B6], NFC: [0xB8B6], NFD: [0x1105, 0x116C, 0x11AD], NFKC: [0xB8B6], NFKD: [0x1105, 0x116C, 0x11AD] }, +{ source: [0xB8B7], NFC: [0xB8B7], NFD: [0x1105, 0x116C, 0x11AE], NFKC: [0xB8B7], NFKD: [0x1105, 0x116C, 0x11AE] }, +{ source: [0xB8B8], NFC: [0xB8B8], NFD: [0x1105, 0x116C, 0x11AF], NFKC: [0xB8B8], NFKD: [0x1105, 0x116C, 0x11AF] }, +{ source: [0xB8B9], NFC: [0xB8B9], NFD: [0x1105, 0x116C, 0x11B0], NFKC: [0xB8B9], NFKD: [0x1105, 0x116C, 0x11B0] }, +{ source: [0xB8BA], NFC: [0xB8BA], NFD: [0x1105, 0x116C, 0x11B1], NFKC: [0xB8BA], NFKD: [0x1105, 0x116C, 0x11B1] }, +{ source: [0xB8BB], NFC: [0xB8BB], NFD: [0x1105, 0x116C, 0x11B2], NFKC: [0xB8BB], NFKD: [0x1105, 0x116C, 0x11B2] }, +{ source: [0xB8BC], NFC: [0xB8BC], NFD: [0x1105, 0x116C, 0x11B3], NFKC: [0xB8BC], NFKD: [0x1105, 0x116C, 0x11B3] }, +{ source: [0xB8BD], NFC: [0xB8BD], NFD: [0x1105, 0x116C, 0x11B4], NFKC: [0xB8BD], NFKD: [0x1105, 0x116C, 0x11B4] }, +{ source: [0xB8BE], NFC: [0xB8BE], NFD: [0x1105, 0x116C, 0x11B5], NFKC: [0xB8BE], NFKD: [0x1105, 0x116C, 0x11B5] }, +{ source: [0xB8BF], NFC: [0xB8BF], NFD: [0x1105, 0x116C, 0x11B6], NFKC: [0xB8BF], NFKD: [0x1105, 0x116C, 0x11B6] }, +{ source: [0xB8C0], NFC: [0xB8C0], NFD: [0x1105, 0x116C, 0x11B7], NFKC: [0xB8C0], NFKD: [0x1105, 0x116C, 0x11B7] }, +{ source: [0xB8C1], NFC: [0xB8C1], NFD: [0x1105, 0x116C, 0x11B8], NFKC: [0xB8C1], NFKD: [0x1105, 0x116C, 0x11B8] }, +{ source: [0xB8C2], NFC: [0xB8C2], NFD: [0x1105, 0x116C, 0x11B9], NFKC: [0xB8C2], NFKD: [0x1105, 0x116C, 0x11B9] }, +{ source: [0xB8C3], NFC: [0xB8C3], NFD: [0x1105, 0x116C, 0x11BA], NFKC: [0xB8C3], NFKD: [0x1105, 0x116C, 0x11BA] }, +{ source: [0xB8C4], NFC: [0xB8C4], NFD: [0x1105, 0x116C, 0x11BB], NFKC: [0xB8C4], NFKD: [0x1105, 0x116C, 0x11BB] }, +{ source: [0xB8C5], NFC: [0xB8C5], NFD: [0x1105, 0x116C, 0x11BC], NFKC: [0xB8C5], NFKD: [0x1105, 0x116C, 0x11BC] }, +{ source: [0xB8C6], NFC: [0xB8C6], NFD: [0x1105, 0x116C, 0x11BD], NFKC: [0xB8C6], NFKD: [0x1105, 0x116C, 0x11BD] }, +{ source: [0xB8C7], NFC: [0xB8C7], NFD: [0x1105, 0x116C, 0x11BE], NFKC: [0xB8C7], NFKD: [0x1105, 0x116C, 0x11BE] }, +{ source: [0xB8C8], NFC: [0xB8C8], NFD: [0x1105, 0x116C, 0x11BF], NFKC: [0xB8C8], NFKD: [0x1105, 0x116C, 0x11BF] }, +{ source: [0xB8C9], NFC: [0xB8C9], NFD: [0x1105, 0x116C, 0x11C0], NFKC: [0xB8C9], NFKD: [0x1105, 0x116C, 0x11C0] }, +{ source: [0xB8CA], NFC: [0xB8CA], NFD: [0x1105, 0x116C, 0x11C1], NFKC: [0xB8CA], NFKD: [0x1105, 0x116C, 0x11C1] }, +{ source: [0xB8CB], NFC: [0xB8CB], NFD: [0x1105, 0x116C, 0x11C2], NFKC: [0xB8CB], NFKD: [0x1105, 0x116C, 0x11C2] }, +{ source: [0xB8CC], NFC: [0xB8CC], NFD: [0x1105, 0x116D], NFKC: [0xB8CC], NFKD: [0x1105, 0x116D] }, +{ source: [0xB8CD], NFC: [0xB8CD], NFD: [0x1105, 0x116D, 0x11A8], NFKC: [0xB8CD], NFKD: [0x1105, 0x116D, 0x11A8] }, +{ source: [0xB8CE], NFC: [0xB8CE], NFD: [0x1105, 0x116D, 0x11A9], NFKC: [0xB8CE], NFKD: [0x1105, 0x116D, 0x11A9] }, +{ source: [0xB8CF], NFC: [0xB8CF], NFD: [0x1105, 0x116D, 0x11AA], NFKC: [0xB8CF], NFKD: [0x1105, 0x116D, 0x11AA] }, +{ source: [0xB8D0], NFC: [0xB8D0], NFD: [0x1105, 0x116D, 0x11AB], NFKC: [0xB8D0], NFKD: [0x1105, 0x116D, 0x11AB] }, +{ source: [0xB8D1], NFC: [0xB8D1], NFD: [0x1105, 0x116D, 0x11AC], NFKC: [0xB8D1], NFKD: [0x1105, 0x116D, 0x11AC] }, +{ source: [0xB8D2], NFC: [0xB8D2], NFD: [0x1105, 0x116D, 0x11AD], NFKC: [0xB8D2], NFKD: [0x1105, 0x116D, 0x11AD] }, +{ source: [0xB8D3], NFC: [0xB8D3], NFD: [0x1105, 0x116D, 0x11AE], NFKC: [0xB8D3], NFKD: [0x1105, 0x116D, 0x11AE] }, +{ source: [0xB8D4], NFC: [0xB8D4], NFD: [0x1105, 0x116D, 0x11AF], NFKC: [0xB8D4], NFKD: [0x1105, 0x116D, 0x11AF] }, +{ source: [0xB8D5], NFC: [0xB8D5], NFD: [0x1105, 0x116D, 0x11B0], NFKC: [0xB8D5], NFKD: [0x1105, 0x116D, 0x11B0] }, +{ source: [0xB8D6], NFC: [0xB8D6], NFD: [0x1105, 0x116D, 0x11B1], NFKC: [0xB8D6], NFKD: [0x1105, 0x116D, 0x11B1] }, +{ source: [0xB8D7], NFC: [0xB8D7], NFD: [0x1105, 0x116D, 0x11B2], NFKC: [0xB8D7], NFKD: [0x1105, 0x116D, 0x11B2] }, +{ source: [0xB8D8], NFC: [0xB8D8], NFD: [0x1105, 0x116D, 0x11B3], NFKC: [0xB8D8], NFKD: [0x1105, 0x116D, 0x11B3] }, +{ source: [0xB8D9], NFC: [0xB8D9], NFD: [0x1105, 0x116D, 0x11B4], NFKC: [0xB8D9], NFKD: [0x1105, 0x116D, 0x11B4] }, +{ source: [0xB8DA], NFC: [0xB8DA], NFD: [0x1105, 0x116D, 0x11B5], NFKC: [0xB8DA], NFKD: [0x1105, 0x116D, 0x11B5] }, +{ source: [0xB8DB], NFC: [0xB8DB], NFD: [0x1105, 0x116D, 0x11B6], NFKC: [0xB8DB], NFKD: [0x1105, 0x116D, 0x11B6] }, +{ source: [0xB8DC], NFC: [0xB8DC], NFD: [0x1105, 0x116D, 0x11B7], NFKC: [0xB8DC], NFKD: [0x1105, 0x116D, 0x11B7] }, +{ source: [0xB8DD], NFC: [0xB8DD], NFD: [0x1105, 0x116D, 0x11B8], NFKC: [0xB8DD], NFKD: [0x1105, 0x116D, 0x11B8] }, +{ source: [0xB8DE], NFC: [0xB8DE], NFD: [0x1105, 0x116D, 0x11B9], NFKC: [0xB8DE], NFKD: [0x1105, 0x116D, 0x11B9] }, +{ source: [0xB8DF], NFC: [0xB8DF], NFD: [0x1105, 0x116D, 0x11BA], NFKC: [0xB8DF], NFKD: [0x1105, 0x116D, 0x11BA] }, +{ source: [0xB8E0], NFC: [0xB8E0], NFD: [0x1105, 0x116D, 0x11BB], NFKC: [0xB8E0], NFKD: [0x1105, 0x116D, 0x11BB] }, +{ source: [0xB8E1], NFC: [0xB8E1], NFD: [0x1105, 0x116D, 0x11BC], NFKC: [0xB8E1], NFKD: [0x1105, 0x116D, 0x11BC] }, +{ source: [0xB8E2], NFC: [0xB8E2], NFD: [0x1105, 0x116D, 0x11BD], NFKC: [0xB8E2], NFKD: [0x1105, 0x116D, 0x11BD] }, +{ source: [0xB8E3], NFC: [0xB8E3], NFD: [0x1105, 0x116D, 0x11BE], NFKC: [0xB8E3], NFKD: [0x1105, 0x116D, 0x11BE] }, +{ source: [0xB8E4], NFC: [0xB8E4], NFD: [0x1105, 0x116D, 0x11BF], NFKC: [0xB8E4], NFKD: [0x1105, 0x116D, 0x11BF] }, +{ source: [0xB8E5], NFC: [0xB8E5], NFD: [0x1105, 0x116D, 0x11C0], NFKC: [0xB8E5], NFKD: [0x1105, 0x116D, 0x11C0] }, +{ source: [0xB8E6], NFC: [0xB8E6], NFD: [0x1105, 0x116D, 0x11C1], NFKC: [0xB8E6], NFKD: [0x1105, 0x116D, 0x11C1] }, +{ source: [0xB8E7], NFC: [0xB8E7], NFD: [0x1105, 0x116D, 0x11C2], NFKC: [0xB8E7], NFKD: [0x1105, 0x116D, 0x11C2] }, +{ source: [0xB8E8], NFC: [0xB8E8], NFD: [0x1105, 0x116E], NFKC: [0xB8E8], NFKD: [0x1105, 0x116E] }, +{ source: [0xB8E9], NFC: [0xB8E9], NFD: [0x1105, 0x116E, 0x11A8], NFKC: [0xB8E9], NFKD: [0x1105, 0x116E, 0x11A8] }, +{ source: [0xB8EA], NFC: [0xB8EA], NFD: [0x1105, 0x116E, 0x11A9], NFKC: [0xB8EA], NFKD: [0x1105, 0x116E, 0x11A9] }, +{ source: [0xB8EB], NFC: [0xB8EB], NFD: [0x1105, 0x116E, 0x11AA], NFKC: [0xB8EB], NFKD: [0x1105, 0x116E, 0x11AA] }, +{ source: [0xB8EC], NFC: [0xB8EC], NFD: [0x1105, 0x116E, 0x11AB], NFKC: [0xB8EC], NFKD: [0x1105, 0x116E, 0x11AB] }, +{ source: [0xB8ED], NFC: [0xB8ED], NFD: [0x1105, 0x116E, 0x11AC], NFKC: [0xB8ED], NFKD: [0x1105, 0x116E, 0x11AC] }, +{ source: [0xB8EE], NFC: [0xB8EE], NFD: [0x1105, 0x116E, 0x11AD], NFKC: [0xB8EE], NFKD: [0x1105, 0x116E, 0x11AD] }, +{ source: [0xB8EF], NFC: [0xB8EF], NFD: [0x1105, 0x116E, 0x11AE], NFKC: [0xB8EF], NFKD: [0x1105, 0x116E, 0x11AE] }, +{ source: [0xB8F0], NFC: [0xB8F0], NFD: [0x1105, 0x116E, 0x11AF], NFKC: [0xB8F0], NFKD: [0x1105, 0x116E, 0x11AF] }, +{ source: [0xB8F1], NFC: [0xB8F1], NFD: [0x1105, 0x116E, 0x11B0], NFKC: [0xB8F1], NFKD: [0x1105, 0x116E, 0x11B0] }, +{ source: [0xB8F2], NFC: [0xB8F2], NFD: [0x1105, 0x116E, 0x11B1], NFKC: [0xB8F2], NFKD: [0x1105, 0x116E, 0x11B1] }, +{ source: [0xB8F3], NFC: [0xB8F3], NFD: [0x1105, 0x116E, 0x11B2], NFKC: [0xB8F3], NFKD: [0x1105, 0x116E, 0x11B2] }, +{ source: [0xB8F4], NFC: [0xB8F4], NFD: [0x1105, 0x116E, 0x11B3], NFKC: [0xB8F4], NFKD: [0x1105, 0x116E, 0x11B3] }, +{ source: [0xB8F5], NFC: [0xB8F5], NFD: [0x1105, 0x116E, 0x11B4], NFKC: [0xB8F5], NFKD: [0x1105, 0x116E, 0x11B4] }, +{ source: [0xB8F6], NFC: [0xB8F6], NFD: [0x1105, 0x116E, 0x11B5], NFKC: [0xB8F6], NFKD: [0x1105, 0x116E, 0x11B5] }, +{ source: [0xB8F7], NFC: [0xB8F7], NFD: [0x1105, 0x116E, 0x11B6], NFKC: [0xB8F7], NFKD: [0x1105, 0x116E, 0x11B6] }, +{ source: [0xB8F8], NFC: [0xB8F8], NFD: [0x1105, 0x116E, 0x11B7], NFKC: [0xB8F8], NFKD: [0x1105, 0x116E, 0x11B7] }, +{ source: [0xB8F9], NFC: [0xB8F9], NFD: [0x1105, 0x116E, 0x11B8], NFKC: [0xB8F9], NFKD: [0x1105, 0x116E, 0x11B8] }, +{ source: [0xB8FA], NFC: [0xB8FA], NFD: [0x1105, 0x116E, 0x11B9], NFKC: [0xB8FA], NFKD: [0x1105, 0x116E, 0x11B9] }, +{ source: [0xB8FB], NFC: [0xB8FB], NFD: [0x1105, 0x116E, 0x11BA], NFKC: [0xB8FB], NFKD: [0x1105, 0x116E, 0x11BA] }, +{ source: [0xB8FC], NFC: [0xB8FC], NFD: [0x1105, 0x116E, 0x11BB], NFKC: [0xB8FC], NFKD: [0x1105, 0x116E, 0x11BB] }, +{ source: [0xB8FD], NFC: [0xB8FD], NFD: [0x1105, 0x116E, 0x11BC], NFKC: [0xB8FD], NFKD: [0x1105, 0x116E, 0x11BC] }, +{ source: [0xB8FE], NFC: [0xB8FE], NFD: [0x1105, 0x116E, 0x11BD], NFKC: [0xB8FE], NFKD: [0x1105, 0x116E, 0x11BD] }, +{ source: [0xB8FF], NFC: [0xB8FF], NFD: [0x1105, 0x116E, 0x11BE], NFKC: [0xB8FF], NFKD: [0x1105, 0x116E, 0x11BE] }, +{ source: [0xB900], NFC: [0xB900], NFD: [0x1105, 0x116E, 0x11BF], NFKC: [0xB900], NFKD: [0x1105, 0x116E, 0x11BF] }, +{ source: [0xB901], NFC: [0xB901], NFD: [0x1105, 0x116E, 0x11C0], NFKC: [0xB901], NFKD: [0x1105, 0x116E, 0x11C0] }, +{ source: [0xB902], NFC: [0xB902], NFD: [0x1105, 0x116E, 0x11C1], NFKC: [0xB902], NFKD: [0x1105, 0x116E, 0x11C1] }, +{ source: [0xB903], NFC: [0xB903], NFD: [0x1105, 0x116E, 0x11C2], NFKC: [0xB903], NFKD: [0x1105, 0x116E, 0x11C2] }, +{ source: [0xB904], NFC: [0xB904], NFD: [0x1105, 0x116F], NFKC: [0xB904], NFKD: [0x1105, 0x116F] }, +{ source: [0xB905], NFC: [0xB905], NFD: [0x1105, 0x116F, 0x11A8], NFKC: [0xB905], NFKD: [0x1105, 0x116F, 0x11A8] }, +{ source: [0xB906], NFC: [0xB906], NFD: [0x1105, 0x116F, 0x11A9], NFKC: [0xB906], NFKD: [0x1105, 0x116F, 0x11A9] }, +{ source: [0xB907], NFC: [0xB907], NFD: [0x1105, 0x116F, 0x11AA], NFKC: [0xB907], NFKD: [0x1105, 0x116F, 0x11AA] }, +{ source: [0xB908], NFC: [0xB908], NFD: [0x1105, 0x116F, 0x11AB], NFKC: [0xB908], NFKD: [0x1105, 0x116F, 0x11AB] }, +{ source: [0xB909], NFC: [0xB909], NFD: [0x1105, 0x116F, 0x11AC], NFKC: [0xB909], NFKD: [0x1105, 0x116F, 0x11AC] }, +{ source: [0xB90A], NFC: [0xB90A], NFD: [0x1105, 0x116F, 0x11AD], NFKC: [0xB90A], NFKD: [0x1105, 0x116F, 0x11AD] }, +{ source: [0xB90B], NFC: [0xB90B], NFD: [0x1105, 0x116F, 0x11AE], NFKC: [0xB90B], NFKD: [0x1105, 0x116F, 0x11AE] }, +{ source: [0xB90C], NFC: [0xB90C], NFD: [0x1105, 0x116F, 0x11AF], NFKC: [0xB90C], NFKD: [0x1105, 0x116F, 0x11AF] }, +{ source: [0xB90D], NFC: [0xB90D], NFD: [0x1105, 0x116F, 0x11B0], NFKC: [0xB90D], NFKD: [0x1105, 0x116F, 0x11B0] }, +{ source: [0xB90E], NFC: [0xB90E], NFD: [0x1105, 0x116F, 0x11B1], NFKC: [0xB90E], NFKD: [0x1105, 0x116F, 0x11B1] }, +{ source: [0xB90F], NFC: [0xB90F], NFD: [0x1105, 0x116F, 0x11B2], NFKC: [0xB90F], NFKD: [0x1105, 0x116F, 0x11B2] }, +{ source: [0xB910], NFC: [0xB910], NFD: [0x1105, 0x116F, 0x11B3], NFKC: [0xB910], NFKD: [0x1105, 0x116F, 0x11B3] }, +{ source: [0xB911], NFC: [0xB911], NFD: [0x1105, 0x116F, 0x11B4], NFKC: [0xB911], NFKD: [0x1105, 0x116F, 0x11B4] }, +{ source: [0xB912], NFC: [0xB912], NFD: [0x1105, 0x116F, 0x11B5], NFKC: [0xB912], NFKD: [0x1105, 0x116F, 0x11B5] }, +{ source: [0xB913], NFC: [0xB913], NFD: [0x1105, 0x116F, 0x11B6], NFKC: [0xB913], NFKD: [0x1105, 0x116F, 0x11B6] }, +{ source: [0xB914], NFC: [0xB914], NFD: [0x1105, 0x116F, 0x11B7], NFKC: [0xB914], NFKD: [0x1105, 0x116F, 0x11B7] }, +{ source: [0xB915], NFC: [0xB915], NFD: [0x1105, 0x116F, 0x11B8], NFKC: [0xB915], NFKD: [0x1105, 0x116F, 0x11B8] }, +{ source: [0xB916], NFC: [0xB916], NFD: [0x1105, 0x116F, 0x11B9], NFKC: [0xB916], NFKD: [0x1105, 0x116F, 0x11B9] }, +{ source: [0xB917], NFC: [0xB917], NFD: [0x1105, 0x116F, 0x11BA], NFKC: [0xB917], NFKD: [0x1105, 0x116F, 0x11BA] }, +{ source: [0xB918], NFC: [0xB918], NFD: [0x1105, 0x116F, 0x11BB], NFKC: [0xB918], NFKD: [0x1105, 0x116F, 0x11BB] }, +{ source: [0xB919], NFC: [0xB919], NFD: [0x1105, 0x116F, 0x11BC], NFKC: [0xB919], NFKD: [0x1105, 0x116F, 0x11BC] }, +{ source: [0xB91A], NFC: [0xB91A], NFD: [0x1105, 0x116F, 0x11BD], NFKC: [0xB91A], NFKD: [0x1105, 0x116F, 0x11BD] }, +{ source: [0xB91B], NFC: [0xB91B], NFD: [0x1105, 0x116F, 0x11BE], NFKC: [0xB91B], NFKD: [0x1105, 0x116F, 0x11BE] }, +{ source: [0xB91C], NFC: [0xB91C], NFD: [0x1105, 0x116F, 0x11BF], NFKC: [0xB91C], NFKD: [0x1105, 0x116F, 0x11BF] }, +{ source: [0xB91D], NFC: [0xB91D], NFD: [0x1105, 0x116F, 0x11C0], NFKC: [0xB91D], NFKD: [0x1105, 0x116F, 0x11C0] }, +{ source: [0xB91E], NFC: [0xB91E], NFD: [0x1105, 0x116F, 0x11C1], NFKC: [0xB91E], NFKD: [0x1105, 0x116F, 0x11C1] }, +{ source: [0xB91F], NFC: [0xB91F], NFD: [0x1105, 0x116F, 0x11C2], NFKC: [0xB91F], NFKD: [0x1105, 0x116F, 0x11C2] }, +{ source: [0xB920], NFC: [0xB920], NFD: [0x1105, 0x1170], NFKC: [0xB920], NFKD: [0x1105, 0x1170] }, +{ source: [0xB921], NFC: [0xB921], NFD: [0x1105, 0x1170, 0x11A8], NFKC: [0xB921], NFKD: [0x1105, 0x1170, 0x11A8] }, +{ source: [0xB922], NFC: [0xB922], NFD: [0x1105, 0x1170, 0x11A9], NFKC: [0xB922], NFKD: [0x1105, 0x1170, 0x11A9] }, +{ source: [0xB923], NFC: [0xB923], NFD: [0x1105, 0x1170, 0x11AA], NFKC: [0xB923], NFKD: [0x1105, 0x1170, 0x11AA] }, +{ source: [0xB924], NFC: [0xB924], NFD: [0x1105, 0x1170, 0x11AB], NFKC: [0xB924], NFKD: [0x1105, 0x1170, 0x11AB] }, +{ source: [0xB925], NFC: [0xB925], NFD: [0x1105, 0x1170, 0x11AC], NFKC: [0xB925], NFKD: [0x1105, 0x1170, 0x11AC] }, +{ source: [0xB926], NFC: [0xB926], NFD: [0x1105, 0x1170, 0x11AD], NFKC: [0xB926], NFKD: [0x1105, 0x1170, 0x11AD] }, +{ source: [0xB927], NFC: [0xB927], NFD: [0x1105, 0x1170, 0x11AE], NFKC: [0xB927], NFKD: [0x1105, 0x1170, 0x11AE] }, +{ source: [0xB928], NFC: [0xB928], NFD: [0x1105, 0x1170, 0x11AF], NFKC: [0xB928], NFKD: [0x1105, 0x1170, 0x11AF] }, +{ source: [0xB929], NFC: [0xB929], NFD: [0x1105, 0x1170, 0x11B0], NFKC: [0xB929], NFKD: [0x1105, 0x1170, 0x11B0] }, +{ source: [0xB92A], NFC: [0xB92A], NFD: [0x1105, 0x1170, 0x11B1], NFKC: [0xB92A], NFKD: [0x1105, 0x1170, 0x11B1] }, +{ source: [0xB92B], NFC: [0xB92B], NFD: [0x1105, 0x1170, 0x11B2], NFKC: [0xB92B], NFKD: [0x1105, 0x1170, 0x11B2] }, +{ source: [0xB92C], NFC: [0xB92C], NFD: [0x1105, 0x1170, 0x11B3], NFKC: [0xB92C], NFKD: [0x1105, 0x1170, 0x11B3] }, +{ source: [0xB92D], NFC: [0xB92D], NFD: [0x1105, 0x1170, 0x11B4], NFKC: [0xB92D], NFKD: [0x1105, 0x1170, 0x11B4] }, +{ source: [0xB92E], NFC: [0xB92E], NFD: [0x1105, 0x1170, 0x11B5], NFKC: [0xB92E], NFKD: [0x1105, 0x1170, 0x11B5] }, +{ source: [0xB92F], NFC: [0xB92F], NFD: [0x1105, 0x1170, 0x11B6], NFKC: [0xB92F], NFKD: [0x1105, 0x1170, 0x11B6] }, +{ source: [0xB930], NFC: [0xB930], NFD: [0x1105, 0x1170, 0x11B7], NFKC: [0xB930], NFKD: [0x1105, 0x1170, 0x11B7] }, +{ source: [0xB931], NFC: [0xB931], NFD: [0x1105, 0x1170, 0x11B8], NFKC: [0xB931], NFKD: [0x1105, 0x1170, 0x11B8] }, +{ source: [0xB932], NFC: [0xB932], NFD: [0x1105, 0x1170, 0x11B9], NFKC: [0xB932], NFKD: [0x1105, 0x1170, 0x11B9] }, +{ source: [0xB933], NFC: [0xB933], NFD: [0x1105, 0x1170, 0x11BA], NFKC: [0xB933], NFKD: [0x1105, 0x1170, 0x11BA] }, +{ source: [0xB934], NFC: [0xB934], NFD: [0x1105, 0x1170, 0x11BB], NFKC: [0xB934], NFKD: [0x1105, 0x1170, 0x11BB] }, +{ source: [0xB935], NFC: [0xB935], NFD: [0x1105, 0x1170, 0x11BC], NFKC: [0xB935], NFKD: [0x1105, 0x1170, 0x11BC] }, +{ source: [0xB936], NFC: [0xB936], NFD: [0x1105, 0x1170, 0x11BD], NFKC: [0xB936], NFKD: [0x1105, 0x1170, 0x11BD] }, +{ source: [0xB937], NFC: [0xB937], NFD: [0x1105, 0x1170, 0x11BE], NFKC: [0xB937], NFKD: [0x1105, 0x1170, 0x11BE] }, +{ source: [0xB938], NFC: [0xB938], NFD: [0x1105, 0x1170, 0x11BF], NFKC: [0xB938], NFKD: [0x1105, 0x1170, 0x11BF] }, +{ source: [0xB939], NFC: [0xB939], NFD: [0x1105, 0x1170, 0x11C0], NFKC: [0xB939], NFKD: [0x1105, 0x1170, 0x11C0] }, +{ source: [0xB93A], NFC: [0xB93A], NFD: [0x1105, 0x1170, 0x11C1], NFKC: [0xB93A], NFKD: [0x1105, 0x1170, 0x11C1] }, +{ source: [0xB93B], NFC: [0xB93B], NFD: [0x1105, 0x1170, 0x11C2], NFKC: [0xB93B], NFKD: [0x1105, 0x1170, 0x11C2] }, +{ source: [0xB93C], NFC: [0xB93C], NFD: [0x1105, 0x1171], NFKC: [0xB93C], NFKD: [0x1105, 0x1171] }, +{ source: [0xB93D], NFC: [0xB93D], NFD: [0x1105, 0x1171, 0x11A8], NFKC: [0xB93D], NFKD: [0x1105, 0x1171, 0x11A8] }, +{ source: [0xB93E], NFC: [0xB93E], NFD: [0x1105, 0x1171, 0x11A9], NFKC: [0xB93E], NFKD: [0x1105, 0x1171, 0x11A9] }, +{ source: [0xB93F], NFC: [0xB93F], NFD: [0x1105, 0x1171, 0x11AA], NFKC: [0xB93F], NFKD: [0x1105, 0x1171, 0x11AA] }, +{ source: [0xB940], NFC: [0xB940], NFD: [0x1105, 0x1171, 0x11AB], NFKC: [0xB940], NFKD: [0x1105, 0x1171, 0x11AB] }, +{ source: [0xB941], NFC: [0xB941], NFD: [0x1105, 0x1171, 0x11AC], NFKC: [0xB941], NFKD: [0x1105, 0x1171, 0x11AC] }, +{ source: [0xB942], NFC: [0xB942], NFD: [0x1105, 0x1171, 0x11AD], NFKC: [0xB942], NFKD: [0x1105, 0x1171, 0x11AD] }, +{ source: [0xB943], NFC: [0xB943], NFD: [0x1105, 0x1171, 0x11AE], NFKC: [0xB943], NFKD: [0x1105, 0x1171, 0x11AE] }, +{ source: [0xB944], NFC: [0xB944], NFD: [0x1105, 0x1171, 0x11AF], NFKC: [0xB944], NFKD: [0x1105, 0x1171, 0x11AF] }, +{ source: [0xB945], NFC: [0xB945], NFD: [0x1105, 0x1171, 0x11B0], NFKC: [0xB945], NFKD: [0x1105, 0x1171, 0x11B0] }, +{ source: [0xB946], NFC: [0xB946], NFD: [0x1105, 0x1171, 0x11B1], NFKC: [0xB946], NFKD: [0x1105, 0x1171, 0x11B1] }, +{ source: [0xB947], NFC: [0xB947], NFD: [0x1105, 0x1171, 0x11B2], NFKC: [0xB947], NFKD: [0x1105, 0x1171, 0x11B2] }, +{ source: [0xB948], NFC: [0xB948], NFD: [0x1105, 0x1171, 0x11B3], NFKC: [0xB948], NFKD: [0x1105, 0x1171, 0x11B3] }, +{ source: [0xB949], NFC: [0xB949], NFD: [0x1105, 0x1171, 0x11B4], NFKC: [0xB949], NFKD: [0x1105, 0x1171, 0x11B4] }, +{ source: [0xB94A], NFC: [0xB94A], NFD: [0x1105, 0x1171, 0x11B5], NFKC: [0xB94A], NFKD: [0x1105, 0x1171, 0x11B5] }, +{ source: [0xB94B], NFC: [0xB94B], NFD: [0x1105, 0x1171, 0x11B6], NFKC: [0xB94B], NFKD: [0x1105, 0x1171, 0x11B6] }, +{ source: [0xB94C], NFC: [0xB94C], NFD: [0x1105, 0x1171, 0x11B7], NFKC: [0xB94C], NFKD: [0x1105, 0x1171, 0x11B7] }, +{ source: [0xB94D], NFC: [0xB94D], NFD: [0x1105, 0x1171, 0x11B8], NFKC: [0xB94D], NFKD: [0x1105, 0x1171, 0x11B8] }, +{ source: [0xB94E], NFC: [0xB94E], NFD: [0x1105, 0x1171, 0x11B9], NFKC: [0xB94E], NFKD: [0x1105, 0x1171, 0x11B9] }, +{ source: [0xB94F], NFC: [0xB94F], NFD: [0x1105, 0x1171, 0x11BA], NFKC: [0xB94F], NFKD: [0x1105, 0x1171, 0x11BA] }, +{ source: [0xB950], NFC: [0xB950], NFD: [0x1105, 0x1171, 0x11BB], NFKC: [0xB950], NFKD: [0x1105, 0x1171, 0x11BB] }, +{ source: [0xB951], NFC: [0xB951], NFD: [0x1105, 0x1171, 0x11BC], NFKC: [0xB951], NFKD: [0x1105, 0x1171, 0x11BC] }, +{ source: [0xB952], NFC: [0xB952], NFD: [0x1105, 0x1171, 0x11BD], NFKC: [0xB952], NFKD: [0x1105, 0x1171, 0x11BD] }, +{ source: [0xB953], NFC: [0xB953], NFD: [0x1105, 0x1171, 0x11BE], NFKC: [0xB953], NFKD: [0x1105, 0x1171, 0x11BE] }, +{ source: [0xB954], NFC: [0xB954], NFD: [0x1105, 0x1171, 0x11BF], NFKC: [0xB954], NFKD: [0x1105, 0x1171, 0x11BF] }, +{ source: [0xB955], NFC: [0xB955], NFD: [0x1105, 0x1171, 0x11C0], NFKC: [0xB955], NFKD: [0x1105, 0x1171, 0x11C0] }, +{ source: [0xB956], NFC: [0xB956], NFD: [0x1105, 0x1171, 0x11C1], NFKC: [0xB956], NFKD: [0x1105, 0x1171, 0x11C1] }, +{ source: [0xB957], NFC: [0xB957], NFD: [0x1105, 0x1171, 0x11C2], NFKC: [0xB957], NFKD: [0x1105, 0x1171, 0x11C2] }, +{ source: [0xB958], NFC: [0xB958], NFD: [0x1105, 0x1172], NFKC: [0xB958], NFKD: [0x1105, 0x1172] }, +{ source: [0xB959], NFC: [0xB959], NFD: [0x1105, 0x1172, 0x11A8], NFKC: [0xB959], NFKD: [0x1105, 0x1172, 0x11A8] }, +{ source: [0xB95A], NFC: [0xB95A], NFD: [0x1105, 0x1172, 0x11A9], NFKC: [0xB95A], NFKD: [0x1105, 0x1172, 0x11A9] }, +{ source: [0xB95B], NFC: [0xB95B], NFD: [0x1105, 0x1172, 0x11AA], NFKC: [0xB95B], NFKD: [0x1105, 0x1172, 0x11AA] }, +{ source: [0xB95C], NFC: [0xB95C], NFD: [0x1105, 0x1172, 0x11AB], NFKC: [0xB95C], NFKD: [0x1105, 0x1172, 0x11AB] }, +{ source: [0xB95D], NFC: [0xB95D], NFD: [0x1105, 0x1172, 0x11AC], NFKC: [0xB95D], NFKD: [0x1105, 0x1172, 0x11AC] }, +{ source: [0xB95E], NFC: [0xB95E], NFD: [0x1105, 0x1172, 0x11AD], NFKC: [0xB95E], NFKD: [0x1105, 0x1172, 0x11AD] }, +{ source: [0xB95F], NFC: [0xB95F], NFD: [0x1105, 0x1172, 0x11AE], NFKC: [0xB95F], NFKD: [0x1105, 0x1172, 0x11AE] }, +{ source: [0xB960], NFC: [0xB960], NFD: [0x1105, 0x1172, 0x11AF], NFKC: [0xB960], NFKD: [0x1105, 0x1172, 0x11AF] }, +{ source: [0xB961], NFC: [0xB961], NFD: [0x1105, 0x1172, 0x11B0], NFKC: [0xB961], NFKD: [0x1105, 0x1172, 0x11B0] }, +{ source: [0xB962], NFC: [0xB962], NFD: [0x1105, 0x1172, 0x11B1], NFKC: [0xB962], NFKD: [0x1105, 0x1172, 0x11B1] }, +{ source: [0xB963], NFC: [0xB963], NFD: [0x1105, 0x1172, 0x11B2], NFKC: [0xB963], NFKD: [0x1105, 0x1172, 0x11B2] }, +{ source: [0xB964], NFC: [0xB964], NFD: [0x1105, 0x1172, 0x11B3], NFKC: [0xB964], NFKD: [0x1105, 0x1172, 0x11B3] }, +{ source: [0xB965], NFC: [0xB965], NFD: [0x1105, 0x1172, 0x11B4], NFKC: [0xB965], NFKD: [0x1105, 0x1172, 0x11B4] }, +{ source: [0xB966], NFC: [0xB966], NFD: [0x1105, 0x1172, 0x11B5], NFKC: [0xB966], NFKD: [0x1105, 0x1172, 0x11B5] }, +{ source: [0xB967], NFC: [0xB967], NFD: [0x1105, 0x1172, 0x11B6], NFKC: [0xB967], NFKD: [0x1105, 0x1172, 0x11B6] }, +{ source: [0xB968], NFC: [0xB968], NFD: [0x1105, 0x1172, 0x11B7], NFKC: [0xB968], NFKD: [0x1105, 0x1172, 0x11B7] }, +{ source: [0xB969], NFC: [0xB969], NFD: [0x1105, 0x1172, 0x11B8], NFKC: [0xB969], NFKD: [0x1105, 0x1172, 0x11B8] }, +{ source: [0xB96A], NFC: [0xB96A], NFD: [0x1105, 0x1172, 0x11B9], NFKC: [0xB96A], NFKD: [0x1105, 0x1172, 0x11B9] }, +{ source: [0xB96B], NFC: [0xB96B], NFD: [0x1105, 0x1172, 0x11BA], NFKC: [0xB96B], NFKD: [0x1105, 0x1172, 0x11BA] }, +{ source: [0xB96C], NFC: [0xB96C], NFD: [0x1105, 0x1172, 0x11BB], NFKC: [0xB96C], NFKD: [0x1105, 0x1172, 0x11BB] }, +{ source: [0xB96D], NFC: [0xB96D], NFD: [0x1105, 0x1172, 0x11BC], NFKC: [0xB96D], NFKD: [0x1105, 0x1172, 0x11BC] }, +{ source: [0xB96E], NFC: [0xB96E], NFD: [0x1105, 0x1172, 0x11BD], NFKC: [0xB96E], NFKD: [0x1105, 0x1172, 0x11BD] }, +{ source: [0xB96F], NFC: [0xB96F], NFD: [0x1105, 0x1172, 0x11BE], NFKC: [0xB96F], NFKD: [0x1105, 0x1172, 0x11BE] }, +{ source: [0xB970], NFC: [0xB970], NFD: [0x1105, 0x1172, 0x11BF], NFKC: [0xB970], NFKD: [0x1105, 0x1172, 0x11BF] }, +{ source: [0xB971], NFC: [0xB971], NFD: [0x1105, 0x1172, 0x11C0], NFKC: [0xB971], NFKD: [0x1105, 0x1172, 0x11C0] }, +{ source: [0xB972], NFC: [0xB972], NFD: [0x1105, 0x1172, 0x11C1], NFKC: [0xB972], NFKD: [0x1105, 0x1172, 0x11C1] }, +{ source: [0xB973], NFC: [0xB973], NFD: [0x1105, 0x1172, 0x11C2], NFKC: [0xB973], NFKD: [0x1105, 0x1172, 0x11C2] }, +{ source: [0xB974], NFC: [0xB974], NFD: [0x1105, 0x1173], NFKC: [0xB974], NFKD: [0x1105, 0x1173] }, +{ source: [0xB975], NFC: [0xB975], NFD: [0x1105, 0x1173, 0x11A8], NFKC: [0xB975], NFKD: [0x1105, 0x1173, 0x11A8] }, +{ source: [0xB976], NFC: [0xB976], NFD: [0x1105, 0x1173, 0x11A9], NFKC: [0xB976], NFKD: [0x1105, 0x1173, 0x11A9] }, +{ source: [0xB977], NFC: [0xB977], NFD: [0x1105, 0x1173, 0x11AA], NFKC: [0xB977], NFKD: [0x1105, 0x1173, 0x11AA] }, +{ source: [0xB978], NFC: [0xB978], NFD: [0x1105, 0x1173, 0x11AB], NFKC: [0xB978], NFKD: [0x1105, 0x1173, 0x11AB] }, +{ source: [0xB979], NFC: [0xB979], NFD: [0x1105, 0x1173, 0x11AC], NFKC: [0xB979], NFKD: [0x1105, 0x1173, 0x11AC] }, +{ source: [0xB97A], NFC: [0xB97A], NFD: [0x1105, 0x1173, 0x11AD], NFKC: [0xB97A], NFKD: [0x1105, 0x1173, 0x11AD] }, +{ source: [0xB97B], NFC: [0xB97B], NFD: [0x1105, 0x1173, 0x11AE], NFKC: [0xB97B], NFKD: [0x1105, 0x1173, 0x11AE] }, +{ source: [0xB97C], NFC: [0xB97C], NFD: [0x1105, 0x1173, 0x11AF], NFKC: [0xB97C], NFKD: [0x1105, 0x1173, 0x11AF] }, +{ source: [0xB97D], NFC: [0xB97D], NFD: [0x1105, 0x1173, 0x11B0], NFKC: [0xB97D], NFKD: [0x1105, 0x1173, 0x11B0] }, +{ source: [0xB97E], NFC: [0xB97E], NFD: [0x1105, 0x1173, 0x11B1], NFKC: [0xB97E], NFKD: [0x1105, 0x1173, 0x11B1] }, +{ source: [0xB97F], NFC: [0xB97F], NFD: [0x1105, 0x1173, 0x11B2], NFKC: [0xB97F], NFKD: [0x1105, 0x1173, 0x11B2] }, +{ source: [0xB980], NFC: [0xB980], NFD: [0x1105, 0x1173, 0x11B3], NFKC: [0xB980], NFKD: [0x1105, 0x1173, 0x11B3] }, +{ source: [0xB981], NFC: [0xB981], NFD: [0x1105, 0x1173, 0x11B4], NFKC: [0xB981], NFKD: [0x1105, 0x1173, 0x11B4] }, +{ source: [0xB982], NFC: [0xB982], NFD: [0x1105, 0x1173, 0x11B5], NFKC: [0xB982], NFKD: [0x1105, 0x1173, 0x11B5] }, +{ source: [0xB983], NFC: [0xB983], NFD: [0x1105, 0x1173, 0x11B6], NFKC: [0xB983], NFKD: [0x1105, 0x1173, 0x11B6] }, +{ source: [0xB984], NFC: [0xB984], NFD: [0x1105, 0x1173, 0x11B7], NFKC: [0xB984], NFKD: [0x1105, 0x1173, 0x11B7] }, +{ source: [0xB985], NFC: [0xB985], NFD: [0x1105, 0x1173, 0x11B8], NFKC: [0xB985], NFKD: [0x1105, 0x1173, 0x11B8] }, +{ source: [0xB986], NFC: [0xB986], NFD: [0x1105, 0x1173, 0x11B9], NFKC: [0xB986], NFKD: [0x1105, 0x1173, 0x11B9] }, +{ source: [0xB987], NFC: [0xB987], NFD: [0x1105, 0x1173, 0x11BA], NFKC: [0xB987], NFKD: [0x1105, 0x1173, 0x11BA] }, +{ source: [0xB988], NFC: [0xB988], NFD: [0x1105, 0x1173, 0x11BB], NFKC: [0xB988], NFKD: [0x1105, 0x1173, 0x11BB] }, +{ source: [0xB989], NFC: [0xB989], NFD: [0x1105, 0x1173, 0x11BC], NFKC: [0xB989], NFKD: [0x1105, 0x1173, 0x11BC] }, +{ source: [0xB98A], NFC: [0xB98A], NFD: [0x1105, 0x1173, 0x11BD], NFKC: [0xB98A], NFKD: [0x1105, 0x1173, 0x11BD] }, +{ source: [0xB98B], NFC: [0xB98B], NFD: [0x1105, 0x1173, 0x11BE], NFKC: [0xB98B], NFKD: [0x1105, 0x1173, 0x11BE] }, +{ source: [0xB98C], NFC: [0xB98C], NFD: [0x1105, 0x1173, 0x11BF], NFKC: [0xB98C], NFKD: [0x1105, 0x1173, 0x11BF] }, +{ source: [0xB98D], NFC: [0xB98D], NFD: [0x1105, 0x1173, 0x11C0], NFKC: [0xB98D], NFKD: [0x1105, 0x1173, 0x11C0] }, +{ source: [0xB98E], NFC: [0xB98E], NFD: [0x1105, 0x1173, 0x11C1], NFKC: [0xB98E], NFKD: [0x1105, 0x1173, 0x11C1] }, +{ source: [0xB98F], NFC: [0xB98F], NFD: [0x1105, 0x1173, 0x11C2], NFKC: [0xB98F], NFKD: [0x1105, 0x1173, 0x11C2] }, +{ source: [0xB990], NFC: [0xB990], NFD: [0x1105, 0x1174], NFKC: [0xB990], NFKD: [0x1105, 0x1174] }, +{ source: [0xB991], NFC: [0xB991], NFD: [0x1105, 0x1174, 0x11A8], NFKC: [0xB991], NFKD: [0x1105, 0x1174, 0x11A8] }, +{ source: [0xB992], NFC: [0xB992], NFD: [0x1105, 0x1174, 0x11A9], NFKC: [0xB992], NFKD: [0x1105, 0x1174, 0x11A9] }, +{ source: [0xB993], NFC: [0xB993], NFD: [0x1105, 0x1174, 0x11AA], NFKC: [0xB993], NFKD: [0x1105, 0x1174, 0x11AA] }, +{ source: [0xB994], NFC: [0xB994], NFD: [0x1105, 0x1174, 0x11AB], NFKC: [0xB994], NFKD: [0x1105, 0x1174, 0x11AB] }, +{ source: [0xB995], NFC: [0xB995], NFD: [0x1105, 0x1174, 0x11AC], NFKC: [0xB995], NFKD: [0x1105, 0x1174, 0x11AC] }, +{ source: [0xB996], NFC: [0xB996], NFD: [0x1105, 0x1174, 0x11AD], NFKC: [0xB996], NFKD: [0x1105, 0x1174, 0x11AD] }, +{ source: [0xB997], NFC: [0xB997], NFD: [0x1105, 0x1174, 0x11AE], NFKC: [0xB997], NFKD: [0x1105, 0x1174, 0x11AE] }, +{ source: [0xB998], NFC: [0xB998], NFD: [0x1105, 0x1174, 0x11AF], NFKC: [0xB998], NFKD: [0x1105, 0x1174, 0x11AF] }, +{ source: [0xB999], NFC: [0xB999], NFD: [0x1105, 0x1174, 0x11B0], NFKC: [0xB999], NFKD: [0x1105, 0x1174, 0x11B0] }, +{ source: [0xB99A], NFC: [0xB99A], NFD: [0x1105, 0x1174, 0x11B1], NFKC: [0xB99A], NFKD: [0x1105, 0x1174, 0x11B1] }, +{ source: [0xB99B], NFC: [0xB99B], NFD: [0x1105, 0x1174, 0x11B2], NFKC: [0xB99B], NFKD: [0x1105, 0x1174, 0x11B2] }, +{ source: [0xB99C], NFC: [0xB99C], NFD: [0x1105, 0x1174, 0x11B3], NFKC: [0xB99C], NFKD: [0x1105, 0x1174, 0x11B3] }, +{ source: [0xB99D], NFC: [0xB99D], NFD: [0x1105, 0x1174, 0x11B4], NFKC: [0xB99D], NFKD: [0x1105, 0x1174, 0x11B4] }, +{ source: [0xB99E], NFC: [0xB99E], NFD: [0x1105, 0x1174, 0x11B5], NFKC: [0xB99E], NFKD: [0x1105, 0x1174, 0x11B5] }, +{ source: [0xB99F], NFC: [0xB99F], NFD: [0x1105, 0x1174, 0x11B6], NFKC: [0xB99F], NFKD: [0x1105, 0x1174, 0x11B6] }, +{ source: [0xB9A0], NFC: [0xB9A0], NFD: [0x1105, 0x1174, 0x11B7], NFKC: [0xB9A0], NFKD: [0x1105, 0x1174, 0x11B7] }, +{ source: [0xB9A1], NFC: [0xB9A1], NFD: [0x1105, 0x1174, 0x11B8], NFKC: [0xB9A1], NFKD: [0x1105, 0x1174, 0x11B8] }, +{ source: [0xB9A2], NFC: [0xB9A2], NFD: [0x1105, 0x1174, 0x11B9], NFKC: [0xB9A2], NFKD: [0x1105, 0x1174, 0x11B9] }, +{ source: [0xB9A3], NFC: [0xB9A3], NFD: [0x1105, 0x1174, 0x11BA], NFKC: [0xB9A3], NFKD: [0x1105, 0x1174, 0x11BA] }, +{ source: [0xB9A4], NFC: [0xB9A4], NFD: [0x1105, 0x1174, 0x11BB], NFKC: [0xB9A4], NFKD: [0x1105, 0x1174, 0x11BB] }, +{ source: [0xB9A5], NFC: [0xB9A5], NFD: [0x1105, 0x1174, 0x11BC], NFKC: [0xB9A5], NFKD: [0x1105, 0x1174, 0x11BC] }, +{ source: [0xB9A6], NFC: [0xB9A6], NFD: [0x1105, 0x1174, 0x11BD], NFKC: [0xB9A6], NFKD: [0x1105, 0x1174, 0x11BD] }, +{ source: [0xB9A7], NFC: [0xB9A7], NFD: [0x1105, 0x1174, 0x11BE], NFKC: [0xB9A7], NFKD: [0x1105, 0x1174, 0x11BE] }, +{ source: [0xB9A8], NFC: [0xB9A8], NFD: [0x1105, 0x1174, 0x11BF], NFKC: [0xB9A8], NFKD: [0x1105, 0x1174, 0x11BF] }, +{ source: [0xB9A9], NFC: [0xB9A9], NFD: [0x1105, 0x1174, 0x11C0], NFKC: [0xB9A9], NFKD: [0x1105, 0x1174, 0x11C0] }, +{ source: [0xB9AA], NFC: [0xB9AA], NFD: [0x1105, 0x1174, 0x11C1], NFKC: [0xB9AA], NFKD: [0x1105, 0x1174, 0x11C1] }, +{ source: [0xB9AB], NFC: [0xB9AB], NFD: [0x1105, 0x1174, 0x11C2], NFKC: [0xB9AB], NFKD: [0x1105, 0x1174, 0x11C2] }, +{ source: [0xB9AC], NFC: [0xB9AC], NFD: [0x1105, 0x1175], NFKC: [0xB9AC], NFKD: [0x1105, 0x1175] }, +{ source: [0xB9AD], NFC: [0xB9AD], NFD: [0x1105, 0x1175, 0x11A8], NFKC: [0xB9AD], NFKD: [0x1105, 0x1175, 0x11A8] }, +{ source: [0xB9AE], NFC: [0xB9AE], NFD: [0x1105, 0x1175, 0x11A9], NFKC: [0xB9AE], NFKD: [0x1105, 0x1175, 0x11A9] }, +{ source: [0xB9AF], NFC: [0xB9AF], NFD: [0x1105, 0x1175, 0x11AA], NFKC: [0xB9AF], NFKD: [0x1105, 0x1175, 0x11AA] }, +{ source: [0xB9B0], NFC: [0xB9B0], NFD: [0x1105, 0x1175, 0x11AB], NFKC: [0xB9B0], NFKD: [0x1105, 0x1175, 0x11AB] }, +{ source: [0xB9B1], NFC: [0xB9B1], NFD: [0x1105, 0x1175, 0x11AC], NFKC: [0xB9B1], NFKD: [0x1105, 0x1175, 0x11AC] }, +{ source: [0xB9B2], NFC: [0xB9B2], NFD: [0x1105, 0x1175, 0x11AD], NFKC: [0xB9B2], NFKD: [0x1105, 0x1175, 0x11AD] }, +{ source: [0xB9B3], NFC: [0xB9B3], NFD: [0x1105, 0x1175, 0x11AE], NFKC: [0xB9B3], NFKD: [0x1105, 0x1175, 0x11AE] }, +{ source: [0xB9B4], NFC: [0xB9B4], NFD: [0x1105, 0x1175, 0x11AF], NFKC: [0xB9B4], NFKD: [0x1105, 0x1175, 0x11AF] }, +{ source: [0xB9B5], NFC: [0xB9B5], NFD: [0x1105, 0x1175, 0x11B0], NFKC: [0xB9B5], NFKD: [0x1105, 0x1175, 0x11B0] }, +{ source: [0xB9B6], NFC: [0xB9B6], NFD: [0x1105, 0x1175, 0x11B1], NFKC: [0xB9B6], NFKD: [0x1105, 0x1175, 0x11B1] }, +{ source: [0xB9B7], NFC: [0xB9B7], NFD: [0x1105, 0x1175, 0x11B2], NFKC: [0xB9B7], NFKD: [0x1105, 0x1175, 0x11B2] }, +{ source: [0xB9B8], NFC: [0xB9B8], NFD: [0x1105, 0x1175, 0x11B3], NFKC: [0xB9B8], NFKD: [0x1105, 0x1175, 0x11B3] }, +{ source: [0xB9B9], NFC: [0xB9B9], NFD: [0x1105, 0x1175, 0x11B4], NFKC: [0xB9B9], NFKD: [0x1105, 0x1175, 0x11B4] }, +{ source: [0xB9BA], NFC: [0xB9BA], NFD: [0x1105, 0x1175, 0x11B5], NFKC: [0xB9BA], NFKD: [0x1105, 0x1175, 0x11B5] }, +{ source: [0xB9BB], NFC: [0xB9BB], NFD: [0x1105, 0x1175, 0x11B6], NFKC: [0xB9BB], NFKD: [0x1105, 0x1175, 0x11B6] }, +{ source: [0xB9BC], NFC: [0xB9BC], NFD: [0x1105, 0x1175, 0x11B7], NFKC: [0xB9BC], NFKD: [0x1105, 0x1175, 0x11B7] }, +{ source: [0xB9BD], NFC: [0xB9BD], NFD: [0x1105, 0x1175, 0x11B8], NFKC: [0xB9BD], NFKD: [0x1105, 0x1175, 0x11B8] }, +{ source: [0xB9BE], NFC: [0xB9BE], NFD: [0x1105, 0x1175, 0x11B9], NFKC: [0xB9BE], NFKD: [0x1105, 0x1175, 0x11B9] }, +{ source: [0xB9BF], NFC: [0xB9BF], NFD: [0x1105, 0x1175, 0x11BA], NFKC: [0xB9BF], NFKD: [0x1105, 0x1175, 0x11BA] }, +{ source: [0xB9C0], NFC: [0xB9C0], NFD: [0x1105, 0x1175, 0x11BB], NFKC: [0xB9C0], NFKD: [0x1105, 0x1175, 0x11BB] }, +{ source: [0xB9C1], NFC: [0xB9C1], NFD: [0x1105, 0x1175, 0x11BC], NFKC: [0xB9C1], NFKD: [0x1105, 0x1175, 0x11BC] }, +{ source: [0xB9C2], NFC: [0xB9C2], NFD: [0x1105, 0x1175, 0x11BD], NFKC: [0xB9C2], NFKD: [0x1105, 0x1175, 0x11BD] }, +{ source: [0xB9C3], NFC: [0xB9C3], NFD: [0x1105, 0x1175, 0x11BE], NFKC: [0xB9C3], NFKD: [0x1105, 0x1175, 0x11BE] }, +{ source: [0xB9C4], NFC: [0xB9C4], NFD: [0x1105, 0x1175, 0x11BF], NFKC: [0xB9C4], NFKD: [0x1105, 0x1175, 0x11BF] }, +{ source: [0xB9C5], NFC: [0xB9C5], NFD: [0x1105, 0x1175, 0x11C0], NFKC: [0xB9C5], NFKD: [0x1105, 0x1175, 0x11C0] }, +{ source: [0xB9C6], NFC: [0xB9C6], NFD: [0x1105, 0x1175, 0x11C1], NFKC: [0xB9C6], NFKD: [0x1105, 0x1175, 0x11C1] }, +{ source: [0xB9C7], NFC: [0xB9C7], NFD: [0x1105, 0x1175, 0x11C2], NFKC: [0xB9C7], NFKD: [0x1105, 0x1175, 0x11C2] }, +{ source: [0xB9C8], NFC: [0xB9C8], NFD: [0x1106, 0x1161], NFKC: [0xB9C8], NFKD: [0x1106, 0x1161] }, +{ source: [0xB9C9], NFC: [0xB9C9], NFD: [0x1106, 0x1161, 0x11A8], NFKC: [0xB9C9], NFKD: [0x1106, 0x1161, 0x11A8] }, +{ source: [0xB9CA], NFC: [0xB9CA], NFD: [0x1106, 0x1161, 0x11A9], NFKC: [0xB9CA], NFKD: [0x1106, 0x1161, 0x11A9] }, +{ source: [0xB9CB], NFC: [0xB9CB], NFD: [0x1106, 0x1161, 0x11AA], NFKC: [0xB9CB], NFKD: [0x1106, 0x1161, 0x11AA] }, +{ source: [0xB9CC], NFC: [0xB9CC], NFD: [0x1106, 0x1161, 0x11AB], NFKC: [0xB9CC], NFKD: [0x1106, 0x1161, 0x11AB] }, +{ source: [0xB9CD], NFC: [0xB9CD], NFD: [0x1106, 0x1161, 0x11AC], NFKC: [0xB9CD], NFKD: [0x1106, 0x1161, 0x11AC] }, +{ source: [0xB9CE], NFC: [0xB9CE], NFD: [0x1106, 0x1161, 0x11AD], NFKC: [0xB9CE], NFKD: [0x1106, 0x1161, 0x11AD] }, +{ source: [0xB9CF], NFC: [0xB9CF], NFD: [0x1106, 0x1161, 0x11AE], NFKC: [0xB9CF], NFKD: [0x1106, 0x1161, 0x11AE] }, +{ source: [0xB9D0], NFC: [0xB9D0], NFD: [0x1106, 0x1161, 0x11AF], NFKC: [0xB9D0], NFKD: [0x1106, 0x1161, 0x11AF] }, +{ source: [0xB9D1], NFC: [0xB9D1], NFD: [0x1106, 0x1161, 0x11B0], NFKC: [0xB9D1], NFKD: [0x1106, 0x1161, 0x11B0] }, +{ source: [0xB9D2], NFC: [0xB9D2], NFD: [0x1106, 0x1161, 0x11B1], NFKC: [0xB9D2], NFKD: [0x1106, 0x1161, 0x11B1] }, +{ source: [0xB9D3], NFC: [0xB9D3], NFD: [0x1106, 0x1161, 0x11B2], NFKC: [0xB9D3], NFKD: [0x1106, 0x1161, 0x11B2] }, +{ source: [0xB9D4], NFC: [0xB9D4], NFD: [0x1106, 0x1161, 0x11B3], NFKC: [0xB9D4], NFKD: [0x1106, 0x1161, 0x11B3] }, +{ source: [0xB9D5], NFC: [0xB9D5], NFD: [0x1106, 0x1161, 0x11B4], NFKC: [0xB9D5], NFKD: [0x1106, 0x1161, 0x11B4] }, +{ source: [0xB9D6], NFC: [0xB9D6], NFD: [0x1106, 0x1161, 0x11B5], NFKC: [0xB9D6], NFKD: [0x1106, 0x1161, 0x11B5] }, +{ source: [0xB9D7], NFC: [0xB9D7], NFD: [0x1106, 0x1161, 0x11B6], NFKC: [0xB9D7], NFKD: [0x1106, 0x1161, 0x11B6] }, +{ source: [0xB9D8], NFC: [0xB9D8], NFD: [0x1106, 0x1161, 0x11B7], NFKC: [0xB9D8], NFKD: [0x1106, 0x1161, 0x11B7] }, +{ source: [0xB9D9], NFC: [0xB9D9], NFD: [0x1106, 0x1161, 0x11B8], NFKC: [0xB9D9], NFKD: [0x1106, 0x1161, 0x11B8] }, +{ source: [0xB9DA], NFC: [0xB9DA], NFD: [0x1106, 0x1161, 0x11B9], NFKC: [0xB9DA], NFKD: [0x1106, 0x1161, 0x11B9] }, +{ source: [0xB9DB], NFC: [0xB9DB], NFD: [0x1106, 0x1161, 0x11BA], NFKC: [0xB9DB], NFKD: [0x1106, 0x1161, 0x11BA] }, +{ source: [0xB9DC], NFC: [0xB9DC], NFD: [0x1106, 0x1161, 0x11BB], NFKC: [0xB9DC], NFKD: [0x1106, 0x1161, 0x11BB] }, +{ source: [0xB9DD], NFC: [0xB9DD], NFD: [0x1106, 0x1161, 0x11BC], NFKC: [0xB9DD], NFKD: [0x1106, 0x1161, 0x11BC] }, +{ source: [0xB9DE], NFC: [0xB9DE], NFD: [0x1106, 0x1161, 0x11BD], NFKC: [0xB9DE], NFKD: [0x1106, 0x1161, 0x11BD] }, +{ source: [0xB9DF], NFC: [0xB9DF], NFD: [0x1106, 0x1161, 0x11BE], NFKC: [0xB9DF], NFKD: [0x1106, 0x1161, 0x11BE] }, +{ source: [0xB9E0], NFC: [0xB9E0], NFD: [0x1106, 0x1161, 0x11BF], NFKC: [0xB9E0], NFKD: [0x1106, 0x1161, 0x11BF] }, +{ source: [0xB9E1], NFC: [0xB9E1], NFD: [0x1106, 0x1161, 0x11C0], NFKC: [0xB9E1], NFKD: [0x1106, 0x1161, 0x11C0] }, +{ source: [0xB9E2], NFC: [0xB9E2], NFD: [0x1106, 0x1161, 0x11C1], NFKC: [0xB9E2], NFKD: [0x1106, 0x1161, 0x11C1] }, +{ source: [0xB9E3], NFC: [0xB9E3], NFD: [0x1106, 0x1161, 0x11C2], NFKC: [0xB9E3], NFKD: [0x1106, 0x1161, 0x11C2] }, +{ source: [0xB9E4], NFC: [0xB9E4], NFD: [0x1106, 0x1162], NFKC: [0xB9E4], NFKD: [0x1106, 0x1162] }, +{ source: [0xB9E5], NFC: [0xB9E5], NFD: [0x1106, 0x1162, 0x11A8], NFKC: [0xB9E5], NFKD: [0x1106, 0x1162, 0x11A8] }, +{ source: [0xB9E6], NFC: [0xB9E6], NFD: [0x1106, 0x1162, 0x11A9], NFKC: [0xB9E6], NFKD: [0x1106, 0x1162, 0x11A9] }, +{ source: [0xB9E7], NFC: [0xB9E7], NFD: [0x1106, 0x1162, 0x11AA], NFKC: [0xB9E7], NFKD: [0x1106, 0x1162, 0x11AA] }, +{ source: [0xB9E8], NFC: [0xB9E8], NFD: [0x1106, 0x1162, 0x11AB], NFKC: [0xB9E8], NFKD: [0x1106, 0x1162, 0x11AB] }, +{ source: [0xB9E9], NFC: [0xB9E9], NFD: [0x1106, 0x1162, 0x11AC], NFKC: [0xB9E9], NFKD: [0x1106, 0x1162, 0x11AC] }, +{ source: [0xB9EA], NFC: [0xB9EA], NFD: [0x1106, 0x1162, 0x11AD], NFKC: [0xB9EA], NFKD: [0x1106, 0x1162, 0x11AD] }, +{ source: [0xB9EB], NFC: [0xB9EB], NFD: [0x1106, 0x1162, 0x11AE], NFKC: [0xB9EB], NFKD: [0x1106, 0x1162, 0x11AE] }, +{ source: [0xB9EC], NFC: [0xB9EC], NFD: [0x1106, 0x1162, 0x11AF], NFKC: [0xB9EC], NFKD: [0x1106, 0x1162, 0x11AF] }, +{ source: [0xB9ED], NFC: [0xB9ED], NFD: [0x1106, 0x1162, 0x11B0], NFKC: [0xB9ED], NFKD: [0x1106, 0x1162, 0x11B0] }, +{ source: [0xB9EE], NFC: [0xB9EE], NFD: [0x1106, 0x1162, 0x11B1], NFKC: [0xB9EE], NFKD: [0x1106, 0x1162, 0x11B1] }, +{ source: [0xB9EF], NFC: [0xB9EF], NFD: [0x1106, 0x1162, 0x11B2], NFKC: [0xB9EF], NFKD: [0x1106, 0x1162, 0x11B2] }, +{ source: [0xB9F0], NFC: [0xB9F0], NFD: [0x1106, 0x1162, 0x11B3], NFKC: [0xB9F0], NFKD: [0x1106, 0x1162, 0x11B3] }, +{ source: [0xB9F1], NFC: [0xB9F1], NFD: [0x1106, 0x1162, 0x11B4], NFKC: [0xB9F1], NFKD: [0x1106, 0x1162, 0x11B4] }, +{ source: [0xB9F2], NFC: [0xB9F2], NFD: [0x1106, 0x1162, 0x11B5], NFKC: [0xB9F2], NFKD: [0x1106, 0x1162, 0x11B5] }, +{ source: [0xB9F3], NFC: [0xB9F3], NFD: [0x1106, 0x1162, 0x11B6], NFKC: [0xB9F3], NFKD: [0x1106, 0x1162, 0x11B6] }, +{ source: [0xB9F4], NFC: [0xB9F4], NFD: [0x1106, 0x1162, 0x11B7], NFKC: [0xB9F4], NFKD: [0x1106, 0x1162, 0x11B7] }, +{ source: [0xB9F5], NFC: [0xB9F5], NFD: [0x1106, 0x1162, 0x11B8], NFKC: [0xB9F5], NFKD: [0x1106, 0x1162, 0x11B8] }, +{ source: [0xB9F6], NFC: [0xB9F6], NFD: [0x1106, 0x1162, 0x11B9], NFKC: [0xB9F6], NFKD: [0x1106, 0x1162, 0x11B9] }, +{ source: [0xB9F7], NFC: [0xB9F7], NFD: [0x1106, 0x1162, 0x11BA], NFKC: [0xB9F7], NFKD: [0x1106, 0x1162, 0x11BA] }, +{ source: [0xB9F8], NFC: [0xB9F8], NFD: [0x1106, 0x1162, 0x11BB], NFKC: [0xB9F8], NFKD: [0x1106, 0x1162, 0x11BB] }, +{ source: [0xB9F9], NFC: [0xB9F9], NFD: [0x1106, 0x1162, 0x11BC], NFKC: [0xB9F9], NFKD: [0x1106, 0x1162, 0x11BC] }, +{ source: [0xB9FA], NFC: [0xB9FA], NFD: [0x1106, 0x1162, 0x11BD], NFKC: [0xB9FA], NFKD: [0x1106, 0x1162, 0x11BD] }, +{ source: [0xB9FB], NFC: [0xB9FB], NFD: [0x1106, 0x1162, 0x11BE], NFKC: [0xB9FB], NFKD: [0x1106, 0x1162, 0x11BE] }, +{ source: [0xB9FC], NFC: [0xB9FC], NFD: [0x1106, 0x1162, 0x11BF], NFKC: [0xB9FC], NFKD: [0x1106, 0x1162, 0x11BF] }, +{ source: [0xB9FD], NFC: [0xB9FD], NFD: [0x1106, 0x1162, 0x11C0], NFKC: [0xB9FD], NFKD: [0x1106, 0x1162, 0x11C0] }, +{ source: [0xB9FE], NFC: [0xB9FE], NFD: [0x1106, 0x1162, 0x11C1], NFKC: [0xB9FE], NFKD: [0x1106, 0x1162, 0x11C1] }, +{ source: [0xB9FF], NFC: [0xB9FF], NFD: [0x1106, 0x1162, 0x11C2], NFKC: [0xB9FF], NFKD: [0x1106, 0x1162, 0x11C2] }, +{ source: [0xBA00], NFC: [0xBA00], NFD: [0x1106, 0x1163], NFKC: [0xBA00], NFKD: [0x1106, 0x1163] }, +{ source: [0xBA01], NFC: [0xBA01], NFD: [0x1106, 0x1163, 0x11A8], NFKC: [0xBA01], NFKD: [0x1106, 0x1163, 0x11A8] }, +{ source: [0xBA02], NFC: [0xBA02], NFD: [0x1106, 0x1163, 0x11A9], NFKC: [0xBA02], NFKD: [0x1106, 0x1163, 0x11A9] }, +{ source: [0xBA03], NFC: [0xBA03], NFD: [0x1106, 0x1163, 0x11AA], NFKC: [0xBA03], NFKD: [0x1106, 0x1163, 0x11AA] }, +{ source: [0xBA04], NFC: [0xBA04], NFD: [0x1106, 0x1163, 0x11AB], NFKC: [0xBA04], NFKD: [0x1106, 0x1163, 0x11AB] }, +{ source: [0xBA05], NFC: [0xBA05], NFD: [0x1106, 0x1163, 0x11AC], NFKC: [0xBA05], NFKD: [0x1106, 0x1163, 0x11AC] }, +{ source: [0xBA06], NFC: [0xBA06], NFD: [0x1106, 0x1163, 0x11AD], NFKC: [0xBA06], NFKD: [0x1106, 0x1163, 0x11AD] }, +{ source: [0xBA07], NFC: [0xBA07], NFD: [0x1106, 0x1163, 0x11AE], NFKC: [0xBA07], NFKD: [0x1106, 0x1163, 0x11AE] }, +{ source: [0xBA08], NFC: [0xBA08], NFD: [0x1106, 0x1163, 0x11AF], NFKC: [0xBA08], NFKD: [0x1106, 0x1163, 0x11AF] }, +{ source: [0xBA09], NFC: [0xBA09], NFD: [0x1106, 0x1163, 0x11B0], NFKC: [0xBA09], NFKD: [0x1106, 0x1163, 0x11B0] }, +{ source: [0xBA0A], NFC: [0xBA0A], NFD: [0x1106, 0x1163, 0x11B1], NFKC: [0xBA0A], NFKD: [0x1106, 0x1163, 0x11B1] }, +{ source: [0xBA0B], NFC: [0xBA0B], NFD: [0x1106, 0x1163, 0x11B2], NFKC: [0xBA0B], NFKD: [0x1106, 0x1163, 0x11B2] }, +{ source: [0xBA0C], NFC: [0xBA0C], NFD: [0x1106, 0x1163, 0x11B3], NFKC: [0xBA0C], NFKD: [0x1106, 0x1163, 0x11B3] }, +{ source: [0xBA0D], NFC: [0xBA0D], NFD: [0x1106, 0x1163, 0x11B4], NFKC: [0xBA0D], NFKD: [0x1106, 0x1163, 0x11B4] }, +{ source: [0xBA0E], NFC: [0xBA0E], NFD: [0x1106, 0x1163, 0x11B5], NFKC: [0xBA0E], NFKD: [0x1106, 0x1163, 0x11B5] }, +{ source: [0xBA0F], NFC: [0xBA0F], NFD: [0x1106, 0x1163, 0x11B6], NFKC: [0xBA0F], NFKD: [0x1106, 0x1163, 0x11B6] }, +{ source: [0xBA10], NFC: [0xBA10], NFD: [0x1106, 0x1163, 0x11B7], NFKC: [0xBA10], NFKD: [0x1106, 0x1163, 0x11B7] }, +{ source: [0xBA11], NFC: [0xBA11], NFD: [0x1106, 0x1163, 0x11B8], NFKC: [0xBA11], NFKD: [0x1106, 0x1163, 0x11B8] }, +{ source: [0xBA12], NFC: [0xBA12], NFD: [0x1106, 0x1163, 0x11B9], NFKC: [0xBA12], NFKD: [0x1106, 0x1163, 0x11B9] }, +{ source: [0xBA13], NFC: [0xBA13], NFD: [0x1106, 0x1163, 0x11BA], NFKC: [0xBA13], NFKD: [0x1106, 0x1163, 0x11BA] }, +{ source: [0xBA14], NFC: [0xBA14], NFD: [0x1106, 0x1163, 0x11BB], NFKC: [0xBA14], NFKD: [0x1106, 0x1163, 0x11BB] }, +{ source: [0xBA15], NFC: [0xBA15], NFD: [0x1106, 0x1163, 0x11BC], NFKC: [0xBA15], NFKD: [0x1106, 0x1163, 0x11BC] }, +{ source: [0xBA16], NFC: [0xBA16], NFD: [0x1106, 0x1163, 0x11BD], NFKC: [0xBA16], NFKD: [0x1106, 0x1163, 0x11BD] }, +{ source: [0xBA17], NFC: [0xBA17], NFD: [0x1106, 0x1163, 0x11BE], NFKC: [0xBA17], NFKD: [0x1106, 0x1163, 0x11BE] }, +{ source: [0xBA18], NFC: [0xBA18], NFD: [0x1106, 0x1163, 0x11BF], NFKC: [0xBA18], NFKD: [0x1106, 0x1163, 0x11BF] }, +{ source: [0xBA19], NFC: [0xBA19], NFD: [0x1106, 0x1163, 0x11C0], NFKC: [0xBA19], NFKD: [0x1106, 0x1163, 0x11C0] }, +{ source: [0xBA1A], NFC: [0xBA1A], NFD: [0x1106, 0x1163, 0x11C1], NFKC: [0xBA1A], NFKD: [0x1106, 0x1163, 0x11C1] }, +{ source: [0xBA1B], NFC: [0xBA1B], NFD: [0x1106, 0x1163, 0x11C2], NFKC: [0xBA1B], NFKD: [0x1106, 0x1163, 0x11C2] }, +{ source: [0xBA1C], NFC: [0xBA1C], NFD: [0x1106, 0x1164], NFKC: [0xBA1C], NFKD: [0x1106, 0x1164] }, +{ source: [0xBA1D], NFC: [0xBA1D], NFD: [0x1106, 0x1164, 0x11A8], NFKC: [0xBA1D], NFKD: [0x1106, 0x1164, 0x11A8] }, +{ source: [0xBA1E], NFC: [0xBA1E], NFD: [0x1106, 0x1164, 0x11A9], NFKC: [0xBA1E], NFKD: [0x1106, 0x1164, 0x11A9] }, +{ source: [0xBA1F], NFC: [0xBA1F], NFD: [0x1106, 0x1164, 0x11AA], NFKC: [0xBA1F], NFKD: [0x1106, 0x1164, 0x11AA] }, +{ source: [0xBA20], NFC: [0xBA20], NFD: [0x1106, 0x1164, 0x11AB], NFKC: [0xBA20], NFKD: [0x1106, 0x1164, 0x11AB] }, +{ source: [0xBA21], NFC: [0xBA21], NFD: [0x1106, 0x1164, 0x11AC], NFKC: [0xBA21], NFKD: [0x1106, 0x1164, 0x11AC] }, +{ source: [0xBA22], NFC: [0xBA22], NFD: [0x1106, 0x1164, 0x11AD], NFKC: [0xBA22], NFKD: [0x1106, 0x1164, 0x11AD] }, +{ source: [0xBA23], NFC: [0xBA23], NFD: [0x1106, 0x1164, 0x11AE], NFKC: [0xBA23], NFKD: [0x1106, 0x1164, 0x11AE] }, +{ source: [0xBA24], NFC: [0xBA24], NFD: [0x1106, 0x1164, 0x11AF], NFKC: [0xBA24], NFKD: [0x1106, 0x1164, 0x11AF] }, +{ source: [0xBA25], NFC: [0xBA25], NFD: [0x1106, 0x1164, 0x11B0], NFKC: [0xBA25], NFKD: [0x1106, 0x1164, 0x11B0] }, +{ source: [0xBA26], NFC: [0xBA26], NFD: [0x1106, 0x1164, 0x11B1], NFKC: [0xBA26], NFKD: [0x1106, 0x1164, 0x11B1] }, +{ source: [0xBA27], NFC: [0xBA27], NFD: [0x1106, 0x1164, 0x11B2], NFKC: [0xBA27], NFKD: [0x1106, 0x1164, 0x11B2] }, +{ source: [0xBA28], NFC: [0xBA28], NFD: [0x1106, 0x1164, 0x11B3], NFKC: [0xBA28], NFKD: [0x1106, 0x1164, 0x11B3] }, +{ source: [0xBA29], NFC: [0xBA29], NFD: [0x1106, 0x1164, 0x11B4], NFKC: [0xBA29], NFKD: [0x1106, 0x1164, 0x11B4] }, +{ source: [0xBA2A], NFC: [0xBA2A], NFD: [0x1106, 0x1164, 0x11B5], NFKC: [0xBA2A], NFKD: [0x1106, 0x1164, 0x11B5] }, +{ source: [0xBA2B], NFC: [0xBA2B], NFD: [0x1106, 0x1164, 0x11B6], NFKC: [0xBA2B], NFKD: [0x1106, 0x1164, 0x11B6] }, +{ source: [0xBA2C], NFC: [0xBA2C], NFD: [0x1106, 0x1164, 0x11B7], NFKC: [0xBA2C], NFKD: [0x1106, 0x1164, 0x11B7] }, +{ source: [0xBA2D], NFC: [0xBA2D], NFD: [0x1106, 0x1164, 0x11B8], NFKC: [0xBA2D], NFKD: [0x1106, 0x1164, 0x11B8] }, +{ source: [0xBA2E], NFC: [0xBA2E], NFD: [0x1106, 0x1164, 0x11B9], NFKC: [0xBA2E], NFKD: [0x1106, 0x1164, 0x11B9] }, +{ source: [0xBA2F], NFC: [0xBA2F], NFD: [0x1106, 0x1164, 0x11BA], NFKC: [0xBA2F], NFKD: [0x1106, 0x1164, 0x11BA] }, +{ source: [0xBA30], NFC: [0xBA30], NFD: [0x1106, 0x1164, 0x11BB], NFKC: [0xBA30], NFKD: [0x1106, 0x1164, 0x11BB] }, +{ source: [0xBA31], NFC: [0xBA31], NFD: [0x1106, 0x1164, 0x11BC], NFKC: [0xBA31], NFKD: [0x1106, 0x1164, 0x11BC] }, +{ source: [0xBA32], NFC: [0xBA32], NFD: [0x1106, 0x1164, 0x11BD], NFKC: [0xBA32], NFKD: [0x1106, 0x1164, 0x11BD] }, +{ source: [0xBA33], NFC: [0xBA33], NFD: [0x1106, 0x1164, 0x11BE], NFKC: [0xBA33], NFKD: [0x1106, 0x1164, 0x11BE] }, +{ source: [0xBA34], NFC: [0xBA34], NFD: [0x1106, 0x1164, 0x11BF], NFKC: [0xBA34], NFKD: [0x1106, 0x1164, 0x11BF] }, +{ source: [0xBA35], NFC: [0xBA35], NFD: [0x1106, 0x1164, 0x11C0], NFKC: [0xBA35], NFKD: [0x1106, 0x1164, 0x11C0] }, +{ source: [0xBA36], NFC: [0xBA36], NFD: [0x1106, 0x1164, 0x11C1], NFKC: [0xBA36], NFKD: [0x1106, 0x1164, 0x11C1] }, +{ source: [0xBA37], NFC: [0xBA37], NFD: [0x1106, 0x1164, 0x11C2], NFKC: [0xBA37], NFKD: [0x1106, 0x1164, 0x11C2] }, +{ source: [0xBA38], NFC: [0xBA38], NFD: [0x1106, 0x1165], NFKC: [0xBA38], NFKD: [0x1106, 0x1165] }, +{ source: [0xBA39], NFC: [0xBA39], NFD: [0x1106, 0x1165, 0x11A8], NFKC: [0xBA39], NFKD: [0x1106, 0x1165, 0x11A8] }, +{ source: [0xBA3A], NFC: [0xBA3A], NFD: [0x1106, 0x1165, 0x11A9], NFKC: [0xBA3A], NFKD: [0x1106, 0x1165, 0x11A9] }, +{ source: [0xBA3B], NFC: [0xBA3B], NFD: [0x1106, 0x1165, 0x11AA], NFKC: [0xBA3B], NFKD: [0x1106, 0x1165, 0x11AA] }, +{ source: [0xBA3C], NFC: [0xBA3C], NFD: [0x1106, 0x1165, 0x11AB], NFKC: [0xBA3C], NFKD: [0x1106, 0x1165, 0x11AB] }, +{ source: [0xBA3D], NFC: [0xBA3D], NFD: [0x1106, 0x1165, 0x11AC], NFKC: [0xBA3D], NFKD: [0x1106, 0x1165, 0x11AC] }, +{ source: [0xBA3E], NFC: [0xBA3E], NFD: [0x1106, 0x1165, 0x11AD], NFKC: [0xBA3E], NFKD: [0x1106, 0x1165, 0x11AD] }, +{ source: [0xBA3F], NFC: [0xBA3F], NFD: [0x1106, 0x1165, 0x11AE], NFKC: [0xBA3F], NFKD: [0x1106, 0x1165, 0x11AE] }, +{ source: [0xBA40], NFC: [0xBA40], NFD: [0x1106, 0x1165, 0x11AF], NFKC: [0xBA40], NFKD: [0x1106, 0x1165, 0x11AF] }, +{ source: [0xBA41], NFC: [0xBA41], NFD: [0x1106, 0x1165, 0x11B0], NFKC: [0xBA41], NFKD: [0x1106, 0x1165, 0x11B0] }, +{ source: [0xBA42], NFC: [0xBA42], NFD: [0x1106, 0x1165, 0x11B1], NFKC: [0xBA42], NFKD: [0x1106, 0x1165, 0x11B1] }, +{ source: [0xBA43], NFC: [0xBA43], NFD: [0x1106, 0x1165, 0x11B2], NFKC: [0xBA43], NFKD: [0x1106, 0x1165, 0x11B2] }, +{ source: [0xBA44], NFC: [0xBA44], NFD: [0x1106, 0x1165, 0x11B3], NFKC: [0xBA44], NFKD: [0x1106, 0x1165, 0x11B3] }, +{ source: [0xBA45], NFC: [0xBA45], NFD: [0x1106, 0x1165, 0x11B4], NFKC: [0xBA45], NFKD: [0x1106, 0x1165, 0x11B4] }, +{ source: [0xBA46], NFC: [0xBA46], NFD: [0x1106, 0x1165, 0x11B5], NFKC: [0xBA46], NFKD: [0x1106, 0x1165, 0x11B5] }, +{ source: [0xBA47], NFC: [0xBA47], NFD: [0x1106, 0x1165, 0x11B6], NFKC: [0xBA47], NFKD: [0x1106, 0x1165, 0x11B6] }, +{ source: [0xBA48], NFC: [0xBA48], NFD: [0x1106, 0x1165, 0x11B7], NFKC: [0xBA48], NFKD: [0x1106, 0x1165, 0x11B7] }, +{ source: [0xBA49], NFC: [0xBA49], NFD: [0x1106, 0x1165, 0x11B8], NFKC: [0xBA49], NFKD: [0x1106, 0x1165, 0x11B8] }, +{ source: [0xBA4A], NFC: [0xBA4A], NFD: [0x1106, 0x1165, 0x11B9], NFKC: [0xBA4A], NFKD: [0x1106, 0x1165, 0x11B9] }, +{ source: [0xBA4B], NFC: [0xBA4B], NFD: [0x1106, 0x1165, 0x11BA], NFKC: [0xBA4B], NFKD: [0x1106, 0x1165, 0x11BA] }, +{ source: [0xBA4C], NFC: [0xBA4C], NFD: [0x1106, 0x1165, 0x11BB], NFKC: [0xBA4C], NFKD: [0x1106, 0x1165, 0x11BB] }, +{ source: [0xBA4D], NFC: [0xBA4D], NFD: [0x1106, 0x1165, 0x11BC], NFKC: [0xBA4D], NFKD: [0x1106, 0x1165, 0x11BC] }, +{ source: [0xBA4E], NFC: [0xBA4E], NFD: [0x1106, 0x1165, 0x11BD], NFKC: [0xBA4E], NFKD: [0x1106, 0x1165, 0x11BD] }, +{ source: [0xBA4F], NFC: [0xBA4F], NFD: [0x1106, 0x1165, 0x11BE], NFKC: [0xBA4F], NFKD: [0x1106, 0x1165, 0x11BE] }, +{ source: [0xBA50], NFC: [0xBA50], NFD: [0x1106, 0x1165, 0x11BF], NFKC: [0xBA50], NFKD: [0x1106, 0x1165, 0x11BF] }, +{ source: [0xBA51], NFC: [0xBA51], NFD: [0x1106, 0x1165, 0x11C0], NFKC: [0xBA51], NFKD: [0x1106, 0x1165, 0x11C0] }, +{ source: [0xBA52], NFC: [0xBA52], NFD: [0x1106, 0x1165, 0x11C1], NFKC: [0xBA52], NFKD: [0x1106, 0x1165, 0x11C1] }, +{ source: [0xBA53], NFC: [0xBA53], NFD: [0x1106, 0x1165, 0x11C2], NFKC: [0xBA53], NFKD: [0x1106, 0x1165, 0x11C2] }, +{ source: [0xBA54], NFC: [0xBA54], NFD: [0x1106, 0x1166], NFKC: [0xBA54], NFKD: [0x1106, 0x1166] }, +{ source: [0xBA55], NFC: [0xBA55], NFD: [0x1106, 0x1166, 0x11A8], NFKC: [0xBA55], NFKD: [0x1106, 0x1166, 0x11A8] }, +{ source: [0xBA56], NFC: [0xBA56], NFD: [0x1106, 0x1166, 0x11A9], NFKC: [0xBA56], NFKD: [0x1106, 0x1166, 0x11A9] }, +{ source: [0xBA57], NFC: [0xBA57], NFD: [0x1106, 0x1166, 0x11AA], NFKC: [0xBA57], NFKD: [0x1106, 0x1166, 0x11AA] }, +{ source: [0xBA58], NFC: [0xBA58], NFD: [0x1106, 0x1166, 0x11AB], NFKC: [0xBA58], NFKD: [0x1106, 0x1166, 0x11AB] }, +{ source: [0xBA59], NFC: [0xBA59], NFD: [0x1106, 0x1166, 0x11AC], NFKC: [0xBA59], NFKD: [0x1106, 0x1166, 0x11AC] }, +{ source: [0xBA5A], NFC: [0xBA5A], NFD: [0x1106, 0x1166, 0x11AD], NFKC: [0xBA5A], NFKD: [0x1106, 0x1166, 0x11AD] }, +{ source: [0xBA5B], NFC: [0xBA5B], NFD: [0x1106, 0x1166, 0x11AE], NFKC: [0xBA5B], NFKD: [0x1106, 0x1166, 0x11AE] }, +{ source: [0xBA5C], NFC: [0xBA5C], NFD: [0x1106, 0x1166, 0x11AF], NFKC: [0xBA5C], NFKD: [0x1106, 0x1166, 0x11AF] }, +{ source: [0xBA5D], NFC: [0xBA5D], NFD: [0x1106, 0x1166, 0x11B0], NFKC: [0xBA5D], NFKD: [0x1106, 0x1166, 0x11B0] }, +{ source: [0xBA5E], NFC: [0xBA5E], NFD: [0x1106, 0x1166, 0x11B1], NFKC: [0xBA5E], NFKD: [0x1106, 0x1166, 0x11B1] }, +{ source: [0xBA5F], NFC: [0xBA5F], NFD: [0x1106, 0x1166, 0x11B2], NFKC: [0xBA5F], NFKD: [0x1106, 0x1166, 0x11B2] }, +{ source: [0xBA60], NFC: [0xBA60], NFD: [0x1106, 0x1166, 0x11B3], NFKC: [0xBA60], NFKD: [0x1106, 0x1166, 0x11B3] }, +{ source: [0xBA61], NFC: [0xBA61], NFD: [0x1106, 0x1166, 0x11B4], NFKC: [0xBA61], NFKD: [0x1106, 0x1166, 0x11B4] }, +{ source: [0xBA62], NFC: [0xBA62], NFD: [0x1106, 0x1166, 0x11B5], NFKC: [0xBA62], NFKD: [0x1106, 0x1166, 0x11B5] }, +{ source: [0xBA63], NFC: [0xBA63], NFD: [0x1106, 0x1166, 0x11B6], NFKC: [0xBA63], NFKD: [0x1106, 0x1166, 0x11B6] }, +{ source: [0xBA64], NFC: [0xBA64], NFD: [0x1106, 0x1166, 0x11B7], NFKC: [0xBA64], NFKD: [0x1106, 0x1166, 0x11B7] }, +{ source: [0xBA65], NFC: [0xBA65], NFD: [0x1106, 0x1166, 0x11B8], NFKC: [0xBA65], NFKD: [0x1106, 0x1166, 0x11B8] }, +{ source: [0xBA66], NFC: [0xBA66], NFD: [0x1106, 0x1166, 0x11B9], NFKC: [0xBA66], NFKD: [0x1106, 0x1166, 0x11B9] }, +{ source: [0xBA67], NFC: [0xBA67], NFD: [0x1106, 0x1166, 0x11BA], NFKC: [0xBA67], NFKD: [0x1106, 0x1166, 0x11BA] }, +{ source: [0xBA68], NFC: [0xBA68], NFD: [0x1106, 0x1166, 0x11BB], NFKC: [0xBA68], NFKD: [0x1106, 0x1166, 0x11BB] }, +{ source: [0xBA69], NFC: [0xBA69], NFD: [0x1106, 0x1166, 0x11BC], NFKC: [0xBA69], NFKD: [0x1106, 0x1166, 0x11BC] }, +{ source: [0xBA6A], NFC: [0xBA6A], NFD: [0x1106, 0x1166, 0x11BD], NFKC: [0xBA6A], NFKD: [0x1106, 0x1166, 0x11BD] }, +{ source: [0xBA6B], NFC: [0xBA6B], NFD: [0x1106, 0x1166, 0x11BE], NFKC: [0xBA6B], NFKD: [0x1106, 0x1166, 0x11BE] }, +{ source: [0xBA6C], NFC: [0xBA6C], NFD: [0x1106, 0x1166, 0x11BF], NFKC: [0xBA6C], NFKD: [0x1106, 0x1166, 0x11BF] }, +{ source: [0xBA6D], NFC: [0xBA6D], NFD: [0x1106, 0x1166, 0x11C0], NFKC: [0xBA6D], NFKD: [0x1106, 0x1166, 0x11C0] }, +{ source: [0xBA6E], NFC: [0xBA6E], NFD: [0x1106, 0x1166, 0x11C1], NFKC: [0xBA6E], NFKD: [0x1106, 0x1166, 0x11C1] }, +{ source: [0xBA6F], NFC: [0xBA6F], NFD: [0x1106, 0x1166, 0x11C2], NFKC: [0xBA6F], NFKD: [0x1106, 0x1166, 0x11C2] }, +{ source: [0xBA70], NFC: [0xBA70], NFD: [0x1106, 0x1167], NFKC: [0xBA70], NFKD: [0x1106, 0x1167] }, +{ source: [0xBA71], NFC: [0xBA71], NFD: [0x1106, 0x1167, 0x11A8], NFKC: [0xBA71], NFKD: [0x1106, 0x1167, 0x11A8] }, +{ source: [0xBA72], NFC: [0xBA72], NFD: [0x1106, 0x1167, 0x11A9], NFKC: [0xBA72], NFKD: [0x1106, 0x1167, 0x11A9] }, +{ source: [0xBA73], NFC: [0xBA73], NFD: [0x1106, 0x1167, 0x11AA], NFKC: [0xBA73], NFKD: [0x1106, 0x1167, 0x11AA] }, +{ source: [0xBA74], NFC: [0xBA74], NFD: [0x1106, 0x1167, 0x11AB], NFKC: [0xBA74], NFKD: [0x1106, 0x1167, 0x11AB] }, +{ source: [0xBA75], NFC: [0xBA75], NFD: [0x1106, 0x1167, 0x11AC], NFKC: [0xBA75], NFKD: [0x1106, 0x1167, 0x11AC] }, +{ source: [0xBA76], NFC: [0xBA76], NFD: [0x1106, 0x1167, 0x11AD], NFKC: [0xBA76], NFKD: [0x1106, 0x1167, 0x11AD] }, +{ source: [0xBA77], NFC: [0xBA77], NFD: [0x1106, 0x1167, 0x11AE], NFKC: [0xBA77], NFKD: [0x1106, 0x1167, 0x11AE] }, +{ source: [0xBA78], NFC: [0xBA78], NFD: [0x1106, 0x1167, 0x11AF], NFKC: [0xBA78], NFKD: [0x1106, 0x1167, 0x11AF] }, +{ source: [0xBA79], NFC: [0xBA79], NFD: [0x1106, 0x1167, 0x11B0], NFKC: [0xBA79], NFKD: [0x1106, 0x1167, 0x11B0] }, +{ source: [0xBA7A], NFC: [0xBA7A], NFD: [0x1106, 0x1167, 0x11B1], NFKC: [0xBA7A], NFKD: [0x1106, 0x1167, 0x11B1] }, +{ source: [0xBA7B], NFC: [0xBA7B], NFD: [0x1106, 0x1167, 0x11B2], NFKC: [0xBA7B], NFKD: [0x1106, 0x1167, 0x11B2] }, +{ source: [0xBA7C], NFC: [0xBA7C], NFD: [0x1106, 0x1167, 0x11B3], NFKC: [0xBA7C], NFKD: [0x1106, 0x1167, 0x11B3] }, +{ source: [0xBA7D], NFC: [0xBA7D], NFD: [0x1106, 0x1167, 0x11B4], NFKC: [0xBA7D], NFKD: [0x1106, 0x1167, 0x11B4] }, +{ source: [0xBA7E], NFC: [0xBA7E], NFD: [0x1106, 0x1167, 0x11B5], NFKC: [0xBA7E], NFKD: [0x1106, 0x1167, 0x11B5] }, +{ source: [0xBA7F], NFC: [0xBA7F], NFD: [0x1106, 0x1167, 0x11B6], NFKC: [0xBA7F], NFKD: [0x1106, 0x1167, 0x11B6] }, +{ source: [0xBA80], NFC: [0xBA80], NFD: [0x1106, 0x1167, 0x11B7], NFKC: [0xBA80], NFKD: [0x1106, 0x1167, 0x11B7] }, +{ source: [0xBA81], NFC: [0xBA81], NFD: [0x1106, 0x1167, 0x11B8], NFKC: [0xBA81], NFKD: [0x1106, 0x1167, 0x11B8] }, +{ source: [0xBA82], NFC: [0xBA82], NFD: [0x1106, 0x1167, 0x11B9], NFKC: [0xBA82], NFKD: [0x1106, 0x1167, 0x11B9] }, +{ source: [0xBA83], NFC: [0xBA83], NFD: [0x1106, 0x1167, 0x11BA], NFKC: [0xBA83], NFKD: [0x1106, 0x1167, 0x11BA] }, +{ source: [0xBA84], NFC: [0xBA84], NFD: [0x1106, 0x1167, 0x11BB], NFKC: [0xBA84], NFKD: [0x1106, 0x1167, 0x11BB] }, +{ source: [0xBA85], NFC: [0xBA85], NFD: [0x1106, 0x1167, 0x11BC], NFKC: [0xBA85], NFKD: [0x1106, 0x1167, 0x11BC] }, +{ source: [0xBA86], NFC: [0xBA86], NFD: [0x1106, 0x1167, 0x11BD], NFKC: [0xBA86], NFKD: [0x1106, 0x1167, 0x11BD] }, +{ source: [0xBA87], NFC: [0xBA87], NFD: [0x1106, 0x1167, 0x11BE], NFKC: [0xBA87], NFKD: [0x1106, 0x1167, 0x11BE] }, +{ source: [0xBA88], NFC: [0xBA88], NFD: [0x1106, 0x1167, 0x11BF], NFKC: [0xBA88], NFKD: [0x1106, 0x1167, 0x11BF] }, +{ source: [0xBA89], NFC: [0xBA89], NFD: [0x1106, 0x1167, 0x11C0], NFKC: [0xBA89], NFKD: [0x1106, 0x1167, 0x11C0] }, +{ source: [0xBA8A], NFC: [0xBA8A], NFD: [0x1106, 0x1167, 0x11C1], NFKC: [0xBA8A], NFKD: [0x1106, 0x1167, 0x11C1] }, +{ source: [0xBA8B], NFC: [0xBA8B], NFD: [0x1106, 0x1167, 0x11C2], NFKC: [0xBA8B], NFKD: [0x1106, 0x1167, 0x11C2] }, +{ source: [0xBA8C], NFC: [0xBA8C], NFD: [0x1106, 0x1168], NFKC: [0xBA8C], NFKD: [0x1106, 0x1168] }, +{ source: [0xBA8D], NFC: [0xBA8D], NFD: [0x1106, 0x1168, 0x11A8], NFKC: [0xBA8D], NFKD: [0x1106, 0x1168, 0x11A8] }, +{ source: [0xBA8E], NFC: [0xBA8E], NFD: [0x1106, 0x1168, 0x11A9], NFKC: [0xBA8E], NFKD: [0x1106, 0x1168, 0x11A9] }, +{ source: [0xBA8F], NFC: [0xBA8F], NFD: [0x1106, 0x1168, 0x11AA], NFKC: [0xBA8F], NFKD: [0x1106, 0x1168, 0x11AA] }, +{ source: [0xBA90], NFC: [0xBA90], NFD: [0x1106, 0x1168, 0x11AB], NFKC: [0xBA90], NFKD: [0x1106, 0x1168, 0x11AB] }, +{ source: [0xBA91], NFC: [0xBA91], NFD: [0x1106, 0x1168, 0x11AC], NFKC: [0xBA91], NFKD: [0x1106, 0x1168, 0x11AC] }, +{ source: [0xBA92], NFC: [0xBA92], NFD: [0x1106, 0x1168, 0x11AD], NFKC: [0xBA92], NFKD: [0x1106, 0x1168, 0x11AD] }, +{ source: [0xBA93], NFC: [0xBA93], NFD: [0x1106, 0x1168, 0x11AE], NFKC: [0xBA93], NFKD: [0x1106, 0x1168, 0x11AE] }, +{ source: [0xBA94], NFC: [0xBA94], NFD: [0x1106, 0x1168, 0x11AF], NFKC: [0xBA94], NFKD: [0x1106, 0x1168, 0x11AF] }, +{ source: [0xBA95], NFC: [0xBA95], NFD: [0x1106, 0x1168, 0x11B0], NFKC: [0xBA95], NFKD: [0x1106, 0x1168, 0x11B0] }, +{ source: [0xBA96], NFC: [0xBA96], NFD: [0x1106, 0x1168, 0x11B1], NFKC: [0xBA96], NFKD: [0x1106, 0x1168, 0x11B1] }, +{ source: [0xBA97], NFC: [0xBA97], NFD: [0x1106, 0x1168, 0x11B2], NFKC: [0xBA97], NFKD: [0x1106, 0x1168, 0x11B2] }, +{ source: [0xBA98], NFC: [0xBA98], NFD: [0x1106, 0x1168, 0x11B3], NFKC: [0xBA98], NFKD: [0x1106, 0x1168, 0x11B3] }, +{ source: [0xBA99], NFC: [0xBA99], NFD: [0x1106, 0x1168, 0x11B4], NFKC: [0xBA99], NFKD: [0x1106, 0x1168, 0x11B4] }, +{ source: [0xBA9A], NFC: [0xBA9A], NFD: [0x1106, 0x1168, 0x11B5], NFKC: [0xBA9A], NFKD: [0x1106, 0x1168, 0x11B5] }, +{ source: [0xBA9B], NFC: [0xBA9B], NFD: [0x1106, 0x1168, 0x11B6], NFKC: [0xBA9B], NFKD: [0x1106, 0x1168, 0x11B6] }, +{ source: [0xBA9C], NFC: [0xBA9C], NFD: [0x1106, 0x1168, 0x11B7], NFKC: [0xBA9C], NFKD: [0x1106, 0x1168, 0x11B7] }, +{ source: [0xBA9D], NFC: [0xBA9D], NFD: [0x1106, 0x1168, 0x11B8], NFKC: [0xBA9D], NFKD: [0x1106, 0x1168, 0x11B8] }, +{ source: [0xBA9E], NFC: [0xBA9E], NFD: [0x1106, 0x1168, 0x11B9], NFKC: [0xBA9E], NFKD: [0x1106, 0x1168, 0x11B9] }, +{ source: [0xBA9F], NFC: [0xBA9F], NFD: [0x1106, 0x1168, 0x11BA], NFKC: [0xBA9F], NFKD: [0x1106, 0x1168, 0x11BA] }, +{ source: [0xBAA0], NFC: [0xBAA0], NFD: [0x1106, 0x1168, 0x11BB], NFKC: [0xBAA0], NFKD: [0x1106, 0x1168, 0x11BB] }, +{ source: [0xBAA1], NFC: [0xBAA1], NFD: [0x1106, 0x1168, 0x11BC], NFKC: [0xBAA1], NFKD: [0x1106, 0x1168, 0x11BC] }, +{ source: [0xBAA2], NFC: [0xBAA2], NFD: [0x1106, 0x1168, 0x11BD], NFKC: [0xBAA2], NFKD: [0x1106, 0x1168, 0x11BD] }, +{ source: [0xBAA3], NFC: [0xBAA3], NFD: [0x1106, 0x1168, 0x11BE], NFKC: [0xBAA3], NFKD: [0x1106, 0x1168, 0x11BE] }, +{ source: [0xBAA4], NFC: [0xBAA4], NFD: [0x1106, 0x1168, 0x11BF], NFKC: [0xBAA4], NFKD: [0x1106, 0x1168, 0x11BF] }, +{ source: [0xBAA5], NFC: [0xBAA5], NFD: [0x1106, 0x1168, 0x11C0], NFKC: [0xBAA5], NFKD: [0x1106, 0x1168, 0x11C0] }, +{ source: [0xBAA6], NFC: [0xBAA6], NFD: [0x1106, 0x1168, 0x11C1], NFKC: [0xBAA6], NFKD: [0x1106, 0x1168, 0x11C1] }, +{ source: [0xBAA7], NFC: [0xBAA7], NFD: [0x1106, 0x1168, 0x11C2], NFKC: [0xBAA7], NFKD: [0x1106, 0x1168, 0x11C2] }, +{ source: [0xBAA8], NFC: [0xBAA8], NFD: [0x1106, 0x1169], NFKC: [0xBAA8], NFKD: [0x1106, 0x1169] }, +{ source: [0xBAA9], NFC: [0xBAA9], NFD: [0x1106, 0x1169, 0x11A8], NFKC: [0xBAA9], NFKD: [0x1106, 0x1169, 0x11A8] }, +{ source: [0xBAAA], NFC: [0xBAAA], NFD: [0x1106, 0x1169, 0x11A9], NFKC: [0xBAAA], NFKD: [0x1106, 0x1169, 0x11A9] }, +{ source: [0xBAAB], NFC: [0xBAAB], NFD: [0x1106, 0x1169, 0x11AA], NFKC: [0xBAAB], NFKD: [0x1106, 0x1169, 0x11AA] }, +{ source: [0xBAAC], NFC: [0xBAAC], NFD: [0x1106, 0x1169, 0x11AB], NFKC: [0xBAAC], NFKD: [0x1106, 0x1169, 0x11AB] }, +{ source: [0xBAAD], NFC: [0xBAAD], NFD: [0x1106, 0x1169, 0x11AC], NFKC: [0xBAAD], NFKD: [0x1106, 0x1169, 0x11AC] }, +{ source: [0xBAAE], NFC: [0xBAAE], NFD: [0x1106, 0x1169, 0x11AD], NFKC: [0xBAAE], NFKD: [0x1106, 0x1169, 0x11AD] }, +{ source: [0xBAAF], NFC: [0xBAAF], NFD: [0x1106, 0x1169, 0x11AE], NFKC: [0xBAAF], NFKD: [0x1106, 0x1169, 0x11AE] }, +{ source: [0xBAB0], NFC: [0xBAB0], NFD: [0x1106, 0x1169, 0x11AF], NFKC: [0xBAB0], NFKD: [0x1106, 0x1169, 0x11AF] }, +{ source: [0xBAB1], NFC: [0xBAB1], NFD: [0x1106, 0x1169, 0x11B0], NFKC: [0xBAB1], NFKD: [0x1106, 0x1169, 0x11B0] }, +{ source: [0xBAB2], NFC: [0xBAB2], NFD: [0x1106, 0x1169, 0x11B1], NFKC: [0xBAB2], NFKD: [0x1106, 0x1169, 0x11B1] }, +{ source: [0xBAB3], NFC: [0xBAB3], NFD: [0x1106, 0x1169, 0x11B2], NFKC: [0xBAB3], NFKD: [0x1106, 0x1169, 0x11B2] }, +{ source: [0xBAB4], NFC: [0xBAB4], NFD: [0x1106, 0x1169, 0x11B3], NFKC: [0xBAB4], NFKD: [0x1106, 0x1169, 0x11B3] }, +{ source: [0xBAB5], NFC: [0xBAB5], NFD: [0x1106, 0x1169, 0x11B4], NFKC: [0xBAB5], NFKD: [0x1106, 0x1169, 0x11B4] }, +{ source: [0xBAB6], NFC: [0xBAB6], NFD: [0x1106, 0x1169, 0x11B5], NFKC: [0xBAB6], NFKD: [0x1106, 0x1169, 0x11B5] }, +{ source: [0xBAB7], NFC: [0xBAB7], NFD: [0x1106, 0x1169, 0x11B6], NFKC: [0xBAB7], NFKD: [0x1106, 0x1169, 0x11B6] }, +{ source: [0xBAB8], NFC: [0xBAB8], NFD: [0x1106, 0x1169, 0x11B7], NFKC: [0xBAB8], NFKD: [0x1106, 0x1169, 0x11B7] }, +{ source: [0xBAB9], NFC: [0xBAB9], NFD: [0x1106, 0x1169, 0x11B8], NFKC: [0xBAB9], NFKD: [0x1106, 0x1169, 0x11B8] }, +{ source: [0xBABA], NFC: [0xBABA], NFD: [0x1106, 0x1169, 0x11B9], NFKC: [0xBABA], NFKD: [0x1106, 0x1169, 0x11B9] }, +{ source: [0xBABB], NFC: [0xBABB], NFD: [0x1106, 0x1169, 0x11BA], NFKC: [0xBABB], NFKD: [0x1106, 0x1169, 0x11BA] }, +{ source: [0xBABC], NFC: [0xBABC], NFD: [0x1106, 0x1169, 0x11BB], NFKC: [0xBABC], NFKD: [0x1106, 0x1169, 0x11BB] }, +{ source: [0xBABD], NFC: [0xBABD], NFD: [0x1106, 0x1169, 0x11BC], NFKC: [0xBABD], NFKD: [0x1106, 0x1169, 0x11BC] }, +{ source: [0xBABE], NFC: [0xBABE], NFD: [0x1106, 0x1169, 0x11BD], NFKC: [0xBABE], NFKD: [0x1106, 0x1169, 0x11BD] }, +{ source: [0xBABF], NFC: [0xBABF], NFD: [0x1106, 0x1169, 0x11BE], NFKC: [0xBABF], NFKD: [0x1106, 0x1169, 0x11BE] }, +{ source: [0xBAC0], NFC: [0xBAC0], NFD: [0x1106, 0x1169, 0x11BF], NFKC: [0xBAC0], NFKD: [0x1106, 0x1169, 0x11BF] }, +{ source: [0xBAC1], NFC: [0xBAC1], NFD: [0x1106, 0x1169, 0x11C0], NFKC: [0xBAC1], NFKD: [0x1106, 0x1169, 0x11C0] }, +{ source: [0xBAC2], NFC: [0xBAC2], NFD: [0x1106, 0x1169, 0x11C1], NFKC: [0xBAC2], NFKD: [0x1106, 0x1169, 0x11C1] }, +{ source: [0xBAC3], NFC: [0xBAC3], NFD: [0x1106, 0x1169, 0x11C2], NFKC: [0xBAC3], NFKD: [0x1106, 0x1169, 0x11C2] }, +{ source: [0xBAC4], NFC: [0xBAC4], NFD: [0x1106, 0x116A], NFKC: [0xBAC4], NFKD: [0x1106, 0x116A] }, +{ source: [0xBAC5], NFC: [0xBAC5], NFD: [0x1106, 0x116A, 0x11A8], NFKC: [0xBAC5], NFKD: [0x1106, 0x116A, 0x11A8] }, +{ source: [0xBAC6], NFC: [0xBAC6], NFD: [0x1106, 0x116A, 0x11A9], NFKC: [0xBAC6], NFKD: [0x1106, 0x116A, 0x11A9] }, +{ source: [0xBAC7], NFC: [0xBAC7], NFD: [0x1106, 0x116A, 0x11AA], NFKC: [0xBAC7], NFKD: [0x1106, 0x116A, 0x11AA] }, +{ source: [0xBAC8], NFC: [0xBAC8], NFD: [0x1106, 0x116A, 0x11AB], NFKC: [0xBAC8], NFKD: [0x1106, 0x116A, 0x11AB] }, +{ source: [0xBAC9], NFC: [0xBAC9], NFD: [0x1106, 0x116A, 0x11AC], NFKC: [0xBAC9], NFKD: [0x1106, 0x116A, 0x11AC] }, +{ source: [0xBACA], NFC: [0xBACA], NFD: [0x1106, 0x116A, 0x11AD], NFKC: [0xBACA], NFKD: [0x1106, 0x116A, 0x11AD] }, +{ source: [0xBACB], NFC: [0xBACB], NFD: [0x1106, 0x116A, 0x11AE], NFKC: [0xBACB], NFKD: [0x1106, 0x116A, 0x11AE] }, +{ source: [0xBACC], NFC: [0xBACC], NFD: [0x1106, 0x116A, 0x11AF], NFKC: [0xBACC], NFKD: [0x1106, 0x116A, 0x11AF] }, +{ source: [0xBACD], NFC: [0xBACD], NFD: [0x1106, 0x116A, 0x11B0], NFKC: [0xBACD], NFKD: [0x1106, 0x116A, 0x11B0] }, +{ source: [0xBACE], NFC: [0xBACE], NFD: [0x1106, 0x116A, 0x11B1], NFKC: [0xBACE], NFKD: [0x1106, 0x116A, 0x11B1] }, +{ source: [0xBACF], NFC: [0xBACF], NFD: [0x1106, 0x116A, 0x11B2], NFKC: [0xBACF], NFKD: [0x1106, 0x116A, 0x11B2] }, +{ source: [0xBAD0], NFC: [0xBAD0], NFD: [0x1106, 0x116A, 0x11B3], NFKC: [0xBAD0], NFKD: [0x1106, 0x116A, 0x11B3] }, +{ source: [0xBAD1], NFC: [0xBAD1], NFD: [0x1106, 0x116A, 0x11B4], NFKC: [0xBAD1], NFKD: [0x1106, 0x116A, 0x11B4] }, +{ source: [0xBAD2], NFC: [0xBAD2], NFD: [0x1106, 0x116A, 0x11B5], NFKC: [0xBAD2], NFKD: [0x1106, 0x116A, 0x11B5] }, +{ source: [0xBAD3], NFC: [0xBAD3], NFD: [0x1106, 0x116A, 0x11B6], NFKC: [0xBAD3], NFKD: [0x1106, 0x116A, 0x11B6] }, +{ source: [0xBAD4], NFC: [0xBAD4], NFD: [0x1106, 0x116A, 0x11B7], NFKC: [0xBAD4], NFKD: [0x1106, 0x116A, 0x11B7] }, +{ source: [0xBAD5], NFC: [0xBAD5], NFD: [0x1106, 0x116A, 0x11B8], NFKC: [0xBAD5], NFKD: [0x1106, 0x116A, 0x11B8] }, +{ source: [0xBAD6], NFC: [0xBAD6], NFD: [0x1106, 0x116A, 0x11B9], NFKC: [0xBAD6], NFKD: [0x1106, 0x116A, 0x11B9] }, +{ source: [0xBAD7], NFC: [0xBAD7], NFD: [0x1106, 0x116A, 0x11BA], NFKC: [0xBAD7], NFKD: [0x1106, 0x116A, 0x11BA] }, +{ source: [0xBAD8], NFC: [0xBAD8], NFD: [0x1106, 0x116A, 0x11BB], NFKC: [0xBAD8], NFKD: [0x1106, 0x116A, 0x11BB] }, +{ source: [0xBAD9], NFC: [0xBAD9], NFD: [0x1106, 0x116A, 0x11BC], NFKC: [0xBAD9], NFKD: [0x1106, 0x116A, 0x11BC] }, +{ source: [0xBADA], NFC: [0xBADA], NFD: [0x1106, 0x116A, 0x11BD], NFKC: [0xBADA], NFKD: [0x1106, 0x116A, 0x11BD] }, +{ source: [0xBADB], NFC: [0xBADB], NFD: [0x1106, 0x116A, 0x11BE], NFKC: [0xBADB], NFKD: [0x1106, 0x116A, 0x11BE] }, +{ source: [0xBADC], NFC: [0xBADC], NFD: [0x1106, 0x116A, 0x11BF], NFKC: [0xBADC], NFKD: [0x1106, 0x116A, 0x11BF] }, +{ source: [0xBADD], NFC: [0xBADD], NFD: [0x1106, 0x116A, 0x11C0], NFKC: [0xBADD], NFKD: [0x1106, 0x116A, 0x11C0] }, +{ source: [0xBADE], NFC: [0xBADE], NFD: [0x1106, 0x116A, 0x11C1], NFKC: [0xBADE], NFKD: [0x1106, 0x116A, 0x11C1] }, +{ source: [0xBADF], NFC: [0xBADF], NFD: [0x1106, 0x116A, 0x11C2], NFKC: [0xBADF], NFKD: [0x1106, 0x116A, 0x11C2] }, +{ source: [0xBAE0], NFC: [0xBAE0], NFD: [0x1106, 0x116B], NFKC: [0xBAE0], NFKD: [0x1106, 0x116B] }, +{ source: [0xBAE1], NFC: [0xBAE1], NFD: [0x1106, 0x116B, 0x11A8], NFKC: [0xBAE1], NFKD: [0x1106, 0x116B, 0x11A8] }, +{ source: [0xBAE2], NFC: [0xBAE2], NFD: [0x1106, 0x116B, 0x11A9], NFKC: [0xBAE2], NFKD: [0x1106, 0x116B, 0x11A9] }, +{ source: [0xBAE3], NFC: [0xBAE3], NFD: [0x1106, 0x116B, 0x11AA], NFKC: [0xBAE3], NFKD: [0x1106, 0x116B, 0x11AA] }, +{ source: [0xBAE4], NFC: [0xBAE4], NFD: [0x1106, 0x116B, 0x11AB], NFKC: [0xBAE4], NFKD: [0x1106, 0x116B, 0x11AB] }, +{ source: [0xBAE5], NFC: [0xBAE5], NFD: [0x1106, 0x116B, 0x11AC], NFKC: [0xBAE5], NFKD: [0x1106, 0x116B, 0x11AC] }, +{ source: [0xBAE6], NFC: [0xBAE6], NFD: [0x1106, 0x116B, 0x11AD], NFKC: [0xBAE6], NFKD: [0x1106, 0x116B, 0x11AD] }, +{ source: [0xBAE7], NFC: [0xBAE7], NFD: [0x1106, 0x116B, 0x11AE], NFKC: [0xBAE7], NFKD: [0x1106, 0x116B, 0x11AE] }, +{ source: [0xBAE8], NFC: [0xBAE8], NFD: [0x1106, 0x116B, 0x11AF], NFKC: [0xBAE8], NFKD: [0x1106, 0x116B, 0x11AF] }, +{ source: [0xBAE9], NFC: [0xBAE9], NFD: [0x1106, 0x116B, 0x11B0], NFKC: [0xBAE9], NFKD: [0x1106, 0x116B, 0x11B0] }, +{ source: [0xBAEA], NFC: [0xBAEA], NFD: [0x1106, 0x116B, 0x11B1], NFKC: [0xBAEA], NFKD: [0x1106, 0x116B, 0x11B1] }, +{ source: [0xBAEB], NFC: [0xBAEB], NFD: [0x1106, 0x116B, 0x11B2], NFKC: [0xBAEB], NFKD: [0x1106, 0x116B, 0x11B2] }, +{ source: [0xBAEC], NFC: [0xBAEC], NFD: [0x1106, 0x116B, 0x11B3], NFKC: [0xBAEC], NFKD: [0x1106, 0x116B, 0x11B3] }, +{ source: [0xBAED], NFC: [0xBAED], NFD: [0x1106, 0x116B, 0x11B4], NFKC: [0xBAED], NFKD: [0x1106, 0x116B, 0x11B4] }, +{ source: [0xBAEE], NFC: [0xBAEE], NFD: [0x1106, 0x116B, 0x11B5], NFKC: [0xBAEE], NFKD: [0x1106, 0x116B, 0x11B5] }, +{ source: [0xBAEF], NFC: [0xBAEF], NFD: [0x1106, 0x116B, 0x11B6], NFKC: [0xBAEF], NFKD: [0x1106, 0x116B, 0x11B6] }, +{ source: [0xBAF0], NFC: [0xBAF0], NFD: [0x1106, 0x116B, 0x11B7], NFKC: [0xBAF0], NFKD: [0x1106, 0x116B, 0x11B7] }, +{ source: [0xBAF1], NFC: [0xBAF1], NFD: [0x1106, 0x116B, 0x11B8], NFKC: [0xBAF1], NFKD: [0x1106, 0x116B, 0x11B8] }, +{ source: [0xBAF2], NFC: [0xBAF2], NFD: [0x1106, 0x116B, 0x11B9], NFKC: [0xBAF2], NFKD: [0x1106, 0x116B, 0x11B9] }, +{ source: [0xBAF3], NFC: [0xBAF3], NFD: [0x1106, 0x116B, 0x11BA], NFKC: [0xBAF3], NFKD: [0x1106, 0x116B, 0x11BA] }, +{ source: [0xBAF4], NFC: [0xBAF4], NFD: [0x1106, 0x116B, 0x11BB], NFKC: [0xBAF4], NFKD: [0x1106, 0x116B, 0x11BB] }, +{ source: [0xBAF5], NFC: [0xBAF5], NFD: [0x1106, 0x116B, 0x11BC], NFKC: [0xBAF5], NFKD: [0x1106, 0x116B, 0x11BC] }, +{ source: [0xBAF6], NFC: [0xBAF6], NFD: [0x1106, 0x116B, 0x11BD], NFKC: [0xBAF6], NFKD: [0x1106, 0x116B, 0x11BD] }, +{ source: [0xBAF7], NFC: [0xBAF7], NFD: [0x1106, 0x116B, 0x11BE], NFKC: [0xBAF7], NFKD: [0x1106, 0x116B, 0x11BE] }, +{ source: [0xBAF8], NFC: [0xBAF8], NFD: [0x1106, 0x116B, 0x11BF], NFKC: [0xBAF8], NFKD: [0x1106, 0x116B, 0x11BF] }, +{ source: [0xBAF9], NFC: [0xBAF9], NFD: [0x1106, 0x116B, 0x11C0], NFKC: [0xBAF9], NFKD: [0x1106, 0x116B, 0x11C0] }, +{ source: [0xBAFA], NFC: [0xBAFA], NFD: [0x1106, 0x116B, 0x11C1], NFKC: [0xBAFA], NFKD: [0x1106, 0x116B, 0x11C1] }, +{ source: [0xBAFB], NFC: [0xBAFB], NFD: [0x1106, 0x116B, 0x11C2], NFKC: [0xBAFB], NFKD: [0x1106, 0x116B, 0x11C2] }, +{ source: [0xBAFC], NFC: [0xBAFC], NFD: [0x1106, 0x116C], NFKC: [0xBAFC], NFKD: [0x1106, 0x116C] }, +{ source: [0xBAFD], NFC: [0xBAFD], NFD: [0x1106, 0x116C, 0x11A8], NFKC: [0xBAFD], NFKD: [0x1106, 0x116C, 0x11A8] }, +{ source: [0xBAFE], NFC: [0xBAFE], NFD: [0x1106, 0x116C, 0x11A9], NFKC: [0xBAFE], NFKD: [0x1106, 0x116C, 0x11A9] }, +{ source: [0xBAFF], NFC: [0xBAFF], NFD: [0x1106, 0x116C, 0x11AA], NFKC: [0xBAFF], NFKD: [0x1106, 0x116C, 0x11AA] }, +{ source: [0xBB00], NFC: [0xBB00], NFD: [0x1106, 0x116C, 0x11AB], NFKC: [0xBB00], NFKD: [0x1106, 0x116C, 0x11AB] }, +{ source: [0xBB01], NFC: [0xBB01], NFD: [0x1106, 0x116C, 0x11AC], NFKC: [0xBB01], NFKD: [0x1106, 0x116C, 0x11AC] }, +{ source: [0xBB02], NFC: [0xBB02], NFD: [0x1106, 0x116C, 0x11AD], NFKC: [0xBB02], NFKD: [0x1106, 0x116C, 0x11AD] }, +{ source: [0xBB03], NFC: [0xBB03], NFD: [0x1106, 0x116C, 0x11AE], NFKC: [0xBB03], NFKD: [0x1106, 0x116C, 0x11AE] }, +{ source: [0xBB04], NFC: [0xBB04], NFD: [0x1106, 0x116C, 0x11AF], NFKC: [0xBB04], NFKD: [0x1106, 0x116C, 0x11AF] }, +{ source: [0xBB05], NFC: [0xBB05], NFD: [0x1106, 0x116C, 0x11B0], NFKC: [0xBB05], NFKD: [0x1106, 0x116C, 0x11B0] }, +{ source: [0xBB06], NFC: [0xBB06], NFD: [0x1106, 0x116C, 0x11B1], NFKC: [0xBB06], NFKD: [0x1106, 0x116C, 0x11B1] }, +{ source: [0xBB07], NFC: [0xBB07], NFD: [0x1106, 0x116C, 0x11B2], NFKC: [0xBB07], NFKD: [0x1106, 0x116C, 0x11B2] }, +{ source: [0xBB08], NFC: [0xBB08], NFD: [0x1106, 0x116C, 0x11B3], NFKC: [0xBB08], NFKD: [0x1106, 0x116C, 0x11B3] }, +{ source: [0xBB09], NFC: [0xBB09], NFD: [0x1106, 0x116C, 0x11B4], NFKC: [0xBB09], NFKD: [0x1106, 0x116C, 0x11B4] }, +{ source: [0xBB0A], NFC: [0xBB0A], NFD: [0x1106, 0x116C, 0x11B5], NFKC: [0xBB0A], NFKD: [0x1106, 0x116C, 0x11B5] }, +{ source: [0xBB0B], NFC: [0xBB0B], NFD: [0x1106, 0x116C, 0x11B6], NFKC: [0xBB0B], NFKD: [0x1106, 0x116C, 0x11B6] }, +{ source: [0xBB0C], NFC: [0xBB0C], NFD: [0x1106, 0x116C, 0x11B7], NFKC: [0xBB0C], NFKD: [0x1106, 0x116C, 0x11B7] }, +{ source: [0xBB0D], NFC: [0xBB0D], NFD: [0x1106, 0x116C, 0x11B8], NFKC: [0xBB0D], NFKD: [0x1106, 0x116C, 0x11B8] }, +{ source: [0xBB0E], NFC: [0xBB0E], NFD: [0x1106, 0x116C, 0x11B9], NFKC: [0xBB0E], NFKD: [0x1106, 0x116C, 0x11B9] }, +{ source: [0xBB0F], NFC: [0xBB0F], NFD: [0x1106, 0x116C, 0x11BA], NFKC: [0xBB0F], NFKD: [0x1106, 0x116C, 0x11BA] }, +{ source: [0xBB10], NFC: [0xBB10], NFD: [0x1106, 0x116C, 0x11BB], NFKC: [0xBB10], NFKD: [0x1106, 0x116C, 0x11BB] }, +{ source: [0xBB11], NFC: [0xBB11], NFD: [0x1106, 0x116C, 0x11BC], NFKC: [0xBB11], NFKD: [0x1106, 0x116C, 0x11BC] }, +{ source: [0xBB12], NFC: [0xBB12], NFD: [0x1106, 0x116C, 0x11BD], NFKC: [0xBB12], NFKD: [0x1106, 0x116C, 0x11BD] }, +{ source: [0xBB13], NFC: [0xBB13], NFD: [0x1106, 0x116C, 0x11BE], NFKC: [0xBB13], NFKD: [0x1106, 0x116C, 0x11BE] }, +{ source: [0xBB14], NFC: [0xBB14], NFD: [0x1106, 0x116C, 0x11BF], NFKC: [0xBB14], NFKD: [0x1106, 0x116C, 0x11BF] }, +{ source: [0xBB15], NFC: [0xBB15], NFD: [0x1106, 0x116C, 0x11C0], NFKC: [0xBB15], NFKD: [0x1106, 0x116C, 0x11C0] }, +{ source: [0xBB16], NFC: [0xBB16], NFD: [0x1106, 0x116C, 0x11C1], NFKC: [0xBB16], NFKD: [0x1106, 0x116C, 0x11C1] }, +{ source: [0xBB17], NFC: [0xBB17], NFD: [0x1106, 0x116C, 0x11C2], NFKC: [0xBB17], NFKD: [0x1106, 0x116C, 0x11C2] }, +{ source: [0xBB18], NFC: [0xBB18], NFD: [0x1106, 0x116D], NFKC: [0xBB18], NFKD: [0x1106, 0x116D] }, +{ source: [0xBB19], NFC: [0xBB19], NFD: [0x1106, 0x116D, 0x11A8], NFKC: [0xBB19], NFKD: [0x1106, 0x116D, 0x11A8] }, +{ source: [0xBB1A], NFC: [0xBB1A], NFD: [0x1106, 0x116D, 0x11A9], NFKC: [0xBB1A], NFKD: [0x1106, 0x116D, 0x11A9] }, +{ source: [0xBB1B], NFC: [0xBB1B], NFD: [0x1106, 0x116D, 0x11AA], NFKC: [0xBB1B], NFKD: [0x1106, 0x116D, 0x11AA] }, +{ source: [0xBB1C], NFC: [0xBB1C], NFD: [0x1106, 0x116D, 0x11AB], NFKC: [0xBB1C], NFKD: [0x1106, 0x116D, 0x11AB] }, +{ source: [0xBB1D], NFC: [0xBB1D], NFD: [0x1106, 0x116D, 0x11AC], NFKC: [0xBB1D], NFKD: [0x1106, 0x116D, 0x11AC] }, +{ source: [0xBB1E], NFC: [0xBB1E], NFD: [0x1106, 0x116D, 0x11AD], NFKC: [0xBB1E], NFKD: [0x1106, 0x116D, 0x11AD] }, +{ source: [0xBB1F], NFC: [0xBB1F], NFD: [0x1106, 0x116D, 0x11AE], NFKC: [0xBB1F], NFKD: [0x1106, 0x116D, 0x11AE] }, +{ source: [0xBB20], NFC: [0xBB20], NFD: [0x1106, 0x116D, 0x11AF], NFKC: [0xBB20], NFKD: [0x1106, 0x116D, 0x11AF] }, +{ source: [0xBB21], NFC: [0xBB21], NFD: [0x1106, 0x116D, 0x11B0], NFKC: [0xBB21], NFKD: [0x1106, 0x116D, 0x11B0] }, +{ source: [0xBB22], NFC: [0xBB22], NFD: [0x1106, 0x116D, 0x11B1], NFKC: [0xBB22], NFKD: [0x1106, 0x116D, 0x11B1] }, +{ source: [0xBB23], NFC: [0xBB23], NFD: [0x1106, 0x116D, 0x11B2], NFKC: [0xBB23], NFKD: [0x1106, 0x116D, 0x11B2] }, +{ source: [0xBB24], NFC: [0xBB24], NFD: [0x1106, 0x116D, 0x11B3], NFKC: [0xBB24], NFKD: [0x1106, 0x116D, 0x11B3] }, +{ source: [0xBB25], NFC: [0xBB25], NFD: [0x1106, 0x116D, 0x11B4], NFKC: [0xBB25], NFKD: [0x1106, 0x116D, 0x11B4] }, +{ source: [0xBB26], NFC: [0xBB26], NFD: [0x1106, 0x116D, 0x11B5], NFKC: [0xBB26], NFKD: [0x1106, 0x116D, 0x11B5] }, +{ source: [0xBB27], NFC: [0xBB27], NFD: [0x1106, 0x116D, 0x11B6], NFKC: [0xBB27], NFKD: [0x1106, 0x116D, 0x11B6] }, +{ source: [0xBB28], NFC: [0xBB28], NFD: [0x1106, 0x116D, 0x11B7], NFKC: [0xBB28], NFKD: [0x1106, 0x116D, 0x11B7] }, +{ source: [0xBB29], NFC: [0xBB29], NFD: [0x1106, 0x116D, 0x11B8], NFKC: [0xBB29], NFKD: [0x1106, 0x116D, 0x11B8] }, +{ source: [0xBB2A], NFC: [0xBB2A], NFD: [0x1106, 0x116D, 0x11B9], NFKC: [0xBB2A], NFKD: [0x1106, 0x116D, 0x11B9] }, +{ source: [0xBB2B], NFC: [0xBB2B], NFD: [0x1106, 0x116D, 0x11BA], NFKC: [0xBB2B], NFKD: [0x1106, 0x116D, 0x11BA] }, +{ source: [0xBB2C], NFC: [0xBB2C], NFD: [0x1106, 0x116D, 0x11BB], NFKC: [0xBB2C], NFKD: [0x1106, 0x116D, 0x11BB] }, +{ source: [0xBB2D], NFC: [0xBB2D], NFD: [0x1106, 0x116D, 0x11BC], NFKC: [0xBB2D], NFKD: [0x1106, 0x116D, 0x11BC] }, +{ source: [0xBB2E], NFC: [0xBB2E], NFD: [0x1106, 0x116D, 0x11BD], NFKC: [0xBB2E], NFKD: [0x1106, 0x116D, 0x11BD] }, +{ source: [0xBB2F], NFC: [0xBB2F], NFD: [0x1106, 0x116D, 0x11BE], NFKC: [0xBB2F], NFKD: [0x1106, 0x116D, 0x11BE] }, +{ source: [0xBB30], NFC: [0xBB30], NFD: [0x1106, 0x116D, 0x11BF], NFKC: [0xBB30], NFKD: [0x1106, 0x116D, 0x11BF] }, +{ source: [0xBB31], NFC: [0xBB31], NFD: [0x1106, 0x116D, 0x11C0], NFKC: [0xBB31], NFKD: [0x1106, 0x116D, 0x11C0] }, +{ source: [0xBB32], NFC: [0xBB32], NFD: [0x1106, 0x116D, 0x11C1], NFKC: [0xBB32], NFKD: [0x1106, 0x116D, 0x11C1] }, +{ source: [0xBB33], NFC: [0xBB33], NFD: [0x1106, 0x116D, 0x11C2], NFKC: [0xBB33], NFKD: [0x1106, 0x116D, 0x11C2] }, +{ source: [0xBB34], NFC: [0xBB34], NFD: [0x1106, 0x116E], NFKC: [0xBB34], NFKD: [0x1106, 0x116E] }, +{ source: [0xBB35], NFC: [0xBB35], NFD: [0x1106, 0x116E, 0x11A8], NFKC: [0xBB35], NFKD: [0x1106, 0x116E, 0x11A8] }, +{ source: [0xBB36], NFC: [0xBB36], NFD: [0x1106, 0x116E, 0x11A9], NFKC: [0xBB36], NFKD: [0x1106, 0x116E, 0x11A9] }, +{ source: [0xBB37], NFC: [0xBB37], NFD: [0x1106, 0x116E, 0x11AA], NFKC: [0xBB37], NFKD: [0x1106, 0x116E, 0x11AA] }, +{ source: [0xBB38], NFC: [0xBB38], NFD: [0x1106, 0x116E, 0x11AB], NFKC: [0xBB38], NFKD: [0x1106, 0x116E, 0x11AB] }, +{ source: [0xBB39], NFC: [0xBB39], NFD: [0x1106, 0x116E, 0x11AC], NFKC: [0xBB39], NFKD: [0x1106, 0x116E, 0x11AC] }, +{ source: [0xBB3A], NFC: [0xBB3A], NFD: [0x1106, 0x116E, 0x11AD], NFKC: [0xBB3A], NFKD: [0x1106, 0x116E, 0x11AD] }, +{ source: [0xBB3B], NFC: [0xBB3B], NFD: [0x1106, 0x116E, 0x11AE], NFKC: [0xBB3B], NFKD: [0x1106, 0x116E, 0x11AE] }, +{ source: [0xBB3C], NFC: [0xBB3C], NFD: [0x1106, 0x116E, 0x11AF], NFKC: [0xBB3C], NFKD: [0x1106, 0x116E, 0x11AF] }, +{ source: [0xBB3D], NFC: [0xBB3D], NFD: [0x1106, 0x116E, 0x11B0], NFKC: [0xBB3D], NFKD: [0x1106, 0x116E, 0x11B0] }, +{ source: [0xBB3E], NFC: [0xBB3E], NFD: [0x1106, 0x116E, 0x11B1], NFKC: [0xBB3E], NFKD: [0x1106, 0x116E, 0x11B1] }, +{ source: [0xBB3F], NFC: [0xBB3F], NFD: [0x1106, 0x116E, 0x11B2], NFKC: [0xBB3F], NFKD: [0x1106, 0x116E, 0x11B2] }, +{ source: [0xBB40], NFC: [0xBB40], NFD: [0x1106, 0x116E, 0x11B3], NFKC: [0xBB40], NFKD: [0x1106, 0x116E, 0x11B3] }, +{ source: [0xBB41], NFC: [0xBB41], NFD: [0x1106, 0x116E, 0x11B4], NFKC: [0xBB41], NFKD: [0x1106, 0x116E, 0x11B4] }, +{ source: [0xBB42], NFC: [0xBB42], NFD: [0x1106, 0x116E, 0x11B5], NFKC: [0xBB42], NFKD: [0x1106, 0x116E, 0x11B5] }, +{ source: [0xBB43], NFC: [0xBB43], NFD: [0x1106, 0x116E, 0x11B6], NFKC: [0xBB43], NFKD: [0x1106, 0x116E, 0x11B6] }, +{ source: [0xBB44], NFC: [0xBB44], NFD: [0x1106, 0x116E, 0x11B7], NFKC: [0xBB44], NFKD: [0x1106, 0x116E, 0x11B7] }, +{ source: [0xBB45], NFC: [0xBB45], NFD: [0x1106, 0x116E, 0x11B8], NFKC: [0xBB45], NFKD: [0x1106, 0x116E, 0x11B8] }, +{ source: [0xBB46], NFC: [0xBB46], NFD: [0x1106, 0x116E, 0x11B9], NFKC: [0xBB46], NFKD: [0x1106, 0x116E, 0x11B9] }, +{ source: [0xBB47], NFC: [0xBB47], NFD: [0x1106, 0x116E, 0x11BA], NFKC: [0xBB47], NFKD: [0x1106, 0x116E, 0x11BA] }, +{ source: [0xBB48], NFC: [0xBB48], NFD: [0x1106, 0x116E, 0x11BB], NFKC: [0xBB48], NFKD: [0x1106, 0x116E, 0x11BB] }, +{ source: [0xBB49], NFC: [0xBB49], NFD: [0x1106, 0x116E, 0x11BC], NFKC: [0xBB49], NFKD: [0x1106, 0x116E, 0x11BC] }, +{ source: [0xBB4A], NFC: [0xBB4A], NFD: [0x1106, 0x116E, 0x11BD], NFKC: [0xBB4A], NFKD: [0x1106, 0x116E, 0x11BD] }, +{ source: [0xBB4B], NFC: [0xBB4B], NFD: [0x1106, 0x116E, 0x11BE], NFKC: [0xBB4B], NFKD: [0x1106, 0x116E, 0x11BE] }, +{ source: [0xBB4C], NFC: [0xBB4C], NFD: [0x1106, 0x116E, 0x11BF], NFKC: [0xBB4C], NFKD: [0x1106, 0x116E, 0x11BF] }, +{ source: [0xBB4D], NFC: [0xBB4D], NFD: [0x1106, 0x116E, 0x11C0], NFKC: [0xBB4D], NFKD: [0x1106, 0x116E, 0x11C0] }, +{ source: [0xBB4E], NFC: [0xBB4E], NFD: [0x1106, 0x116E, 0x11C1], NFKC: [0xBB4E], NFKD: [0x1106, 0x116E, 0x11C1] }, +{ source: [0xBB4F], NFC: [0xBB4F], NFD: [0x1106, 0x116E, 0x11C2], NFKC: [0xBB4F], NFKD: [0x1106, 0x116E, 0x11C2] }, +{ source: [0xBB50], NFC: [0xBB50], NFD: [0x1106, 0x116F], NFKC: [0xBB50], NFKD: [0x1106, 0x116F] }, +{ source: [0xBB51], NFC: [0xBB51], NFD: [0x1106, 0x116F, 0x11A8], NFKC: [0xBB51], NFKD: [0x1106, 0x116F, 0x11A8] }, +{ source: [0xBB52], NFC: [0xBB52], NFD: [0x1106, 0x116F, 0x11A9], NFKC: [0xBB52], NFKD: [0x1106, 0x116F, 0x11A9] }, +{ source: [0xBB53], NFC: [0xBB53], NFD: [0x1106, 0x116F, 0x11AA], NFKC: [0xBB53], NFKD: [0x1106, 0x116F, 0x11AA] }, +{ source: [0xBB54], NFC: [0xBB54], NFD: [0x1106, 0x116F, 0x11AB], NFKC: [0xBB54], NFKD: [0x1106, 0x116F, 0x11AB] }, +{ source: [0xBB55], NFC: [0xBB55], NFD: [0x1106, 0x116F, 0x11AC], NFKC: [0xBB55], NFKD: [0x1106, 0x116F, 0x11AC] }, +{ source: [0xBB56], NFC: [0xBB56], NFD: [0x1106, 0x116F, 0x11AD], NFKC: [0xBB56], NFKD: [0x1106, 0x116F, 0x11AD] }, +{ source: [0xBB57], NFC: [0xBB57], NFD: [0x1106, 0x116F, 0x11AE], NFKC: [0xBB57], NFKD: [0x1106, 0x116F, 0x11AE] }, +{ source: [0xBB58], NFC: [0xBB58], NFD: [0x1106, 0x116F, 0x11AF], NFKC: [0xBB58], NFKD: [0x1106, 0x116F, 0x11AF] }, +{ source: [0xBB59], NFC: [0xBB59], NFD: [0x1106, 0x116F, 0x11B0], NFKC: [0xBB59], NFKD: [0x1106, 0x116F, 0x11B0] }, +{ source: [0xBB5A], NFC: [0xBB5A], NFD: [0x1106, 0x116F, 0x11B1], NFKC: [0xBB5A], NFKD: [0x1106, 0x116F, 0x11B1] }, +{ source: [0xBB5B], NFC: [0xBB5B], NFD: [0x1106, 0x116F, 0x11B2], NFKC: [0xBB5B], NFKD: [0x1106, 0x116F, 0x11B2] }, +{ source: [0xBB5C], NFC: [0xBB5C], NFD: [0x1106, 0x116F, 0x11B3], NFKC: [0xBB5C], NFKD: [0x1106, 0x116F, 0x11B3] }, +{ source: [0xBB5D], NFC: [0xBB5D], NFD: [0x1106, 0x116F, 0x11B4], NFKC: [0xBB5D], NFKD: [0x1106, 0x116F, 0x11B4] }, +{ source: [0xBB5E], NFC: [0xBB5E], NFD: [0x1106, 0x116F, 0x11B5], NFKC: [0xBB5E], NFKD: [0x1106, 0x116F, 0x11B5] }, +{ source: [0xBB5F], NFC: [0xBB5F], NFD: [0x1106, 0x116F, 0x11B6], NFKC: [0xBB5F], NFKD: [0x1106, 0x116F, 0x11B6] }, +{ source: [0xBB60], NFC: [0xBB60], NFD: [0x1106, 0x116F, 0x11B7], NFKC: [0xBB60], NFKD: [0x1106, 0x116F, 0x11B7] }, +{ source: [0xBB61], NFC: [0xBB61], NFD: [0x1106, 0x116F, 0x11B8], NFKC: [0xBB61], NFKD: [0x1106, 0x116F, 0x11B8] }, +{ source: [0xBB62], NFC: [0xBB62], NFD: [0x1106, 0x116F, 0x11B9], NFKC: [0xBB62], NFKD: [0x1106, 0x116F, 0x11B9] }, +{ source: [0xBB63], NFC: [0xBB63], NFD: [0x1106, 0x116F, 0x11BA], NFKC: [0xBB63], NFKD: [0x1106, 0x116F, 0x11BA] }, +{ source: [0xBB64], NFC: [0xBB64], NFD: [0x1106, 0x116F, 0x11BB], NFKC: [0xBB64], NFKD: [0x1106, 0x116F, 0x11BB] }, +{ source: [0xBB65], NFC: [0xBB65], NFD: [0x1106, 0x116F, 0x11BC], NFKC: [0xBB65], NFKD: [0x1106, 0x116F, 0x11BC] }, +{ source: [0xBB66], NFC: [0xBB66], NFD: [0x1106, 0x116F, 0x11BD], NFKC: [0xBB66], NFKD: [0x1106, 0x116F, 0x11BD] }, +{ source: [0xBB67], NFC: [0xBB67], NFD: [0x1106, 0x116F, 0x11BE], NFKC: [0xBB67], NFKD: [0x1106, 0x116F, 0x11BE] }, +{ source: [0xBB68], NFC: [0xBB68], NFD: [0x1106, 0x116F, 0x11BF], NFKC: [0xBB68], NFKD: [0x1106, 0x116F, 0x11BF] }, +{ source: [0xBB69], NFC: [0xBB69], NFD: [0x1106, 0x116F, 0x11C0], NFKC: [0xBB69], NFKD: [0x1106, 0x116F, 0x11C0] }, +{ source: [0xBB6A], NFC: [0xBB6A], NFD: [0x1106, 0x116F, 0x11C1], NFKC: [0xBB6A], NFKD: [0x1106, 0x116F, 0x11C1] }, +{ source: [0xBB6B], NFC: [0xBB6B], NFD: [0x1106, 0x116F, 0x11C2], NFKC: [0xBB6B], NFKD: [0x1106, 0x116F, 0x11C2] }, +{ source: [0xBB6C], NFC: [0xBB6C], NFD: [0x1106, 0x1170], NFKC: [0xBB6C], NFKD: [0x1106, 0x1170] }, +{ source: [0xBB6D], NFC: [0xBB6D], NFD: [0x1106, 0x1170, 0x11A8], NFKC: [0xBB6D], NFKD: [0x1106, 0x1170, 0x11A8] }, +{ source: [0xBB6E], NFC: [0xBB6E], NFD: [0x1106, 0x1170, 0x11A9], NFKC: [0xBB6E], NFKD: [0x1106, 0x1170, 0x11A9] }, +{ source: [0xBB6F], NFC: [0xBB6F], NFD: [0x1106, 0x1170, 0x11AA], NFKC: [0xBB6F], NFKD: [0x1106, 0x1170, 0x11AA] }, +{ source: [0xBB70], NFC: [0xBB70], NFD: [0x1106, 0x1170, 0x11AB], NFKC: [0xBB70], NFKD: [0x1106, 0x1170, 0x11AB] }, +{ source: [0xBB71], NFC: [0xBB71], NFD: [0x1106, 0x1170, 0x11AC], NFKC: [0xBB71], NFKD: [0x1106, 0x1170, 0x11AC] }, +{ source: [0xBB72], NFC: [0xBB72], NFD: [0x1106, 0x1170, 0x11AD], NFKC: [0xBB72], NFKD: [0x1106, 0x1170, 0x11AD] }, +{ source: [0xBB73], NFC: [0xBB73], NFD: [0x1106, 0x1170, 0x11AE], NFKC: [0xBB73], NFKD: [0x1106, 0x1170, 0x11AE] }, +{ source: [0xBB74], NFC: [0xBB74], NFD: [0x1106, 0x1170, 0x11AF], NFKC: [0xBB74], NFKD: [0x1106, 0x1170, 0x11AF] }, +{ source: [0xBB75], NFC: [0xBB75], NFD: [0x1106, 0x1170, 0x11B0], NFKC: [0xBB75], NFKD: [0x1106, 0x1170, 0x11B0] }, +{ source: [0xBB76], NFC: [0xBB76], NFD: [0x1106, 0x1170, 0x11B1], NFKC: [0xBB76], NFKD: [0x1106, 0x1170, 0x11B1] }, +{ source: [0xBB77], NFC: [0xBB77], NFD: [0x1106, 0x1170, 0x11B2], NFKC: [0xBB77], NFKD: [0x1106, 0x1170, 0x11B2] }, +{ source: [0xBB78], NFC: [0xBB78], NFD: [0x1106, 0x1170, 0x11B3], NFKC: [0xBB78], NFKD: [0x1106, 0x1170, 0x11B3] }, +{ source: [0xBB79], NFC: [0xBB79], NFD: [0x1106, 0x1170, 0x11B4], NFKC: [0xBB79], NFKD: [0x1106, 0x1170, 0x11B4] }, +{ source: [0xBB7A], NFC: [0xBB7A], NFD: [0x1106, 0x1170, 0x11B5], NFKC: [0xBB7A], NFKD: [0x1106, 0x1170, 0x11B5] }, +{ source: [0xBB7B], NFC: [0xBB7B], NFD: [0x1106, 0x1170, 0x11B6], NFKC: [0xBB7B], NFKD: [0x1106, 0x1170, 0x11B6] }, +{ source: [0xBB7C], NFC: [0xBB7C], NFD: [0x1106, 0x1170, 0x11B7], NFKC: [0xBB7C], NFKD: [0x1106, 0x1170, 0x11B7] }, +{ source: [0xBB7D], NFC: [0xBB7D], NFD: [0x1106, 0x1170, 0x11B8], NFKC: [0xBB7D], NFKD: [0x1106, 0x1170, 0x11B8] }, +{ source: [0xBB7E], NFC: [0xBB7E], NFD: [0x1106, 0x1170, 0x11B9], NFKC: [0xBB7E], NFKD: [0x1106, 0x1170, 0x11B9] }, +{ source: [0xBB7F], NFC: [0xBB7F], NFD: [0x1106, 0x1170, 0x11BA], NFKC: [0xBB7F], NFKD: [0x1106, 0x1170, 0x11BA] }, +{ source: [0xBB80], NFC: [0xBB80], NFD: [0x1106, 0x1170, 0x11BB], NFKC: [0xBB80], NFKD: [0x1106, 0x1170, 0x11BB] }, +{ source: [0xBB81], NFC: [0xBB81], NFD: [0x1106, 0x1170, 0x11BC], NFKC: [0xBB81], NFKD: [0x1106, 0x1170, 0x11BC] }, +{ source: [0xBB82], NFC: [0xBB82], NFD: [0x1106, 0x1170, 0x11BD], NFKC: [0xBB82], NFKD: [0x1106, 0x1170, 0x11BD] }, +{ source: [0xBB83], NFC: [0xBB83], NFD: [0x1106, 0x1170, 0x11BE], NFKC: [0xBB83], NFKD: [0x1106, 0x1170, 0x11BE] }, +{ source: [0xBB84], NFC: [0xBB84], NFD: [0x1106, 0x1170, 0x11BF], NFKC: [0xBB84], NFKD: [0x1106, 0x1170, 0x11BF] }, +{ source: [0xBB85], NFC: [0xBB85], NFD: [0x1106, 0x1170, 0x11C0], NFKC: [0xBB85], NFKD: [0x1106, 0x1170, 0x11C0] }, +{ source: [0xBB86], NFC: [0xBB86], NFD: [0x1106, 0x1170, 0x11C1], NFKC: [0xBB86], NFKD: [0x1106, 0x1170, 0x11C1] }, +{ source: [0xBB87], NFC: [0xBB87], NFD: [0x1106, 0x1170, 0x11C2], NFKC: [0xBB87], NFKD: [0x1106, 0x1170, 0x11C2] }, +{ source: [0xBB88], NFC: [0xBB88], NFD: [0x1106, 0x1171], NFKC: [0xBB88], NFKD: [0x1106, 0x1171] }, +{ source: [0xBB89], NFC: [0xBB89], NFD: [0x1106, 0x1171, 0x11A8], NFKC: [0xBB89], NFKD: [0x1106, 0x1171, 0x11A8] }, +{ source: [0xBB8A], NFC: [0xBB8A], NFD: [0x1106, 0x1171, 0x11A9], NFKC: [0xBB8A], NFKD: [0x1106, 0x1171, 0x11A9] }, +{ source: [0xBB8B], NFC: [0xBB8B], NFD: [0x1106, 0x1171, 0x11AA], NFKC: [0xBB8B], NFKD: [0x1106, 0x1171, 0x11AA] }, +{ source: [0xBB8C], NFC: [0xBB8C], NFD: [0x1106, 0x1171, 0x11AB], NFKC: [0xBB8C], NFKD: [0x1106, 0x1171, 0x11AB] }, +{ source: [0xBB8D], NFC: [0xBB8D], NFD: [0x1106, 0x1171, 0x11AC], NFKC: [0xBB8D], NFKD: [0x1106, 0x1171, 0x11AC] }, +{ source: [0xBB8E], NFC: [0xBB8E], NFD: [0x1106, 0x1171, 0x11AD], NFKC: [0xBB8E], NFKD: [0x1106, 0x1171, 0x11AD] }, +{ source: [0xBB8F], NFC: [0xBB8F], NFD: [0x1106, 0x1171, 0x11AE], NFKC: [0xBB8F], NFKD: [0x1106, 0x1171, 0x11AE] }, +{ source: [0xBB90], NFC: [0xBB90], NFD: [0x1106, 0x1171, 0x11AF], NFKC: [0xBB90], NFKD: [0x1106, 0x1171, 0x11AF] }, +{ source: [0xBB91], NFC: [0xBB91], NFD: [0x1106, 0x1171, 0x11B0], NFKC: [0xBB91], NFKD: [0x1106, 0x1171, 0x11B0] }, +{ source: [0xBB92], NFC: [0xBB92], NFD: [0x1106, 0x1171, 0x11B1], NFKC: [0xBB92], NFKD: [0x1106, 0x1171, 0x11B1] }, +{ source: [0xBB93], NFC: [0xBB93], NFD: [0x1106, 0x1171, 0x11B2], NFKC: [0xBB93], NFKD: [0x1106, 0x1171, 0x11B2] }, +{ source: [0xBB94], NFC: [0xBB94], NFD: [0x1106, 0x1171, 0x11B3], NFKC: [0xBB94], NFKD: [0x1106, 0x1171, 0x11B3] }, +{ source: [0xBB95], NFC: [0xBB95], NFD: [0x1106, 0x1171, 0x11B4], NFKC: [0xBB95], NFKD: [0x1106, 0x1171, 0x11B4] }, +{ source: [0xBB96], NFC: [0xBB96], NFD: [0x1106, 0x1171, 0x11B5], NFKC: [0xBB96], NFKD: [0x1106, 0x1171, 0x11B5] }, +{ source: [0xBB97], NFC: [0xBB97], NFD: [0x1106, 0x1171, 0x11B6], NFKC: [0xBB97], NFKD: [0x1106, 0x1171, 0x11B6] }, +{ source: [0xBB98], NFC: [0xBB98], NFD: [0x1106, 0x1171, 0x11B7], NFKC: [0xBB98], NFKD: [0x1106, 0x1171, 0x11B7] }, +{ source: [0xBB99], NFC: [0xBB99], NFD: [0x1106, 0x1171, 0x11B8], NFKC: [0xBB99], NFKD: [0x1106, 0x1171, 0x11B8] }, +{ source: [0xBB9A], NFC: [0xBB9A], NFD: [0x1106, 0x1171, 0x11B9], NFKC: [0xBB9A], NFKD: [0x1106, 0x1171, 0x11B9] }, +{ source: [0xBB9B], NFC: [0xBB9B], NFD: [0x1106, 0x1171, 0x11BA], NFKC: [0xBB9B], NFKD: [0x1106, 0x1171, 0x11BA] }, +{ source: [0xBB9C], NFC: [0xBB9C], NFD: [0x1106, 0x1171, 0x11BB], NFKC: [0xBB9C], NFKD: [0x1106, 0x1171, 0x11BB] }, +{ source: [0xBB9D], NFC: [0xBB9D], NFD: [0x1106, 0x1171, 0x11BC], NFKC: [0xBB9D], NFKD: [0x1106, 0x1171, 0x11BC] }, +{ source: [0xBB9E], NFC: [0xBB9E], NFD: [0x1106, 0x1171, 0x11BD], NFKC: [0xBB9E], NFKD: [0x1106, 0x1171, 0x11BD] }, +{ source: [0xBB9F], NFC: [0xBB9F], NFD: [0x1106, 0x1171, 0x11BE], NFKC: [0xBB9F], NFKD: [0x1106, 0x1171, 0x11BE] }, +{ source: [0xBBA0], NFC: [0xBBA0], NFD: [0x1106, 0x1171, 0x11BF], NFKC: [0xBBA0], NFKD: [0x1106, 0x1171, 0x11BF] }, +{ source: [0xBBA1], NFC: [0xBBA1], NFD: [0x1106, 0x1171, 0x11C0], NFKC: [0xBBA1], NFKD: [0x1106, 0x1171, 0x11C0] }, +{ source: [0xBBA2], NFC: [0xBBA2], NFD: [0x1106, 0x1171, 0x11C1], NFKC: [0xBBA2], NFKD: [0x1106, 0x1171, 0x11C1] }, +{ source: [0xBBA3], NFC: [0xBBA3], NFD: [0x1106, 0x1171, 0x11C2], NFKC: [0xBBA3], NFKD: [0x1106, 0x1171, 0x11C2] }, +{ source: [0xBBA4], NFC: [0xBBA4], NFD: [0x1106, 0x1172], NFKC: [0xBBA4], NFKD: [0x1106, 0x1172] }, +{ source: [0xBBA5], NFC: [0xBBA5], NFD: [0x1106, 0x1172, 0x11A8], NFKC: [0xBBA5], NFKD: [0x1106, 0x1172, 0x11A8] }, +{ source: [0xBBA6], NFC: [0xBBA6], NFD: [0x1106, 0x1172, 0x11A9], NFKC: [0xBBA6], NFKD: [0x1106, 0x1172, 0x11A9] }, +{ source: [0xBBA7], NFC: [0xBBA7], NFD: [0x1106, 0x1172, 0x11AA], NFKC: [0xBBA7], NFKD: [0x1106, 0x1172, 0x11AA] }, +{ source: [0xBBA8], NFC: [0xBBA8], NFD: [0x1106, 0x1172, 0x11AB], NFKC: [0xBBA8], NFKD: [0x1106, 0x1172, 0x11AB] }, +{ source: [0xBBA9], NFC: [0xBBA9], NFD: [0x1106, 0x1172, 0x11AC], NFKC: [0xBBA9], NFKD: [0x1106, 0x1172, 0x11AC] }, +{ source: [0xBBAA], NFC: [0xBBAA], NFD: [0x1106, 0x1172, 0x11AD], NFKC: [0xBBAA], NFKD: [0x1106, 0x1172, 0x11AD] }, +{ source: [0xBBAB], NFC: [0xBBAB], NFD: [0x1106, 0x1172, 0x11AE], NFKC: [0xBBAB], NFKD: [0x1106, 0x1172, 0x11AE] }, +{ source: [0xBBAC], NFC: [0xBBAC], NFD: [0x1106, 0x1172, 0x11AF], NFKC: [0xBBAC], NFKD: [0x1106, 0x1172, 0x11AF] }, +{ source: [0xBBAD], NFC: [0xBBAD], NFD: [0x1106, 0x1172, 0x11B0], NFKC: [0xBBAD], NFKD: [0x1106, 0x1172, 0x11B0] }, +{ source: [0xBBAE], NFC: [0xBBAE], NFD: [0x1106, 0x1172, 0x11B1], NFKC: [0xBBAE], NFKD: [0x1106, 0x1172, 0x11B1] }, +{ source: [0xBBAF], NFC: [0xBBAF], NFD: [0x1106, 0x1172, 0x11B2], NFKC: [0xBBAF], NFKD: [0x1106, 0x1172, 0x11B2] }, +{ source: [0xBBB0], NFC: [0xBBB0], NFD: [0x1106, 0x1172, 0x11B3], NFKC: [0xBBB0], NFKD: [0x1106, 0x1172, 0x11B3] }, +{ source: [0xBBB1], NFC: [0xBBB1], NFD: [0x1106, 0x1172, 0x11B4], NFKC: [0xBBB1], NFKD: [0x1106, 0x1172, 0x11B4] }, +{ source: [0xBBB2], NFC: [0xBBB2], NFD: [0x1106, 0x1172, 0x11B5], NFKC: [0xBBB2], NFKD: [0x1106, 0x1172, 0x11B5] }, +{ source: [0xBBB3], NFC: [0xBBB3], NFD: [0x1106, 0x1172, 0x11B6], NFKC: [0xBBB3], NFKD: [0x1106, 0x1172, 0x11B6] }, +{ source: [0xBBB4], NFC: [0xBBB4], NFD: [0x1106, 0x1172, 0x11B7], NFKC: [0xBBB4], NFKD: [0x1106, 0x1172, 0x11B7] }, +{ source: [0xBBB5], NFC: [0xBBB5], NFD: [0x1106, 0x1172, 0x11B8], NFKC: [0xBBB5], NFKD: [0x1106, 0x1172, 0x11B8] }, +{ source: [0xBBB6], NFC: [0xBBB6], NFD: [0x1106, 0x1172, 0x11B9], NFKC: [0xBBB6], NFKD: [0x1106, 0x1172, 0x11B9] }, +{ source: [0xBBB7], NFC: [0xBBB7], NFD: [0x1106, 0x1172, 0x11BA], NFKC: [0xBBB7], NFKD: [0x1106, 0x1172, 0x11BA] }, +{ source: [0xBBB8], NFC: [0xBBB8], NFD: [0x1106, 0x1172, 0x11BB], NFKC: [0xBBB8], NFKD: [0x1106, 0x1172, 0x11BB] }, +{ source: [0xBBB9], NFC: [0xBBB9], NFD: [0x1106, 0x1172, 0x11BC], NFKC: [0xBBB9], NFKD: [0x1106, 0x1172, 0x11BC] }, +{ source: [0xBBBA], NFC: [0xBBBA], NFD: [0x1106, 0x1172, 0x11BD], NFKC: [0xBBBA], NFKD: [0x1106, 0x1172, 0x11BD] }, +{ source: [0xBBBB], NFC: [0xBBBB], NFD: [0x1106, 0x1172, 0x11BE], NFKC: [0xBBBB], NFKD: [0x1106, 0x1172, 0x11BE] }, +{ source: [0xBBBC], NFC: [0xBBBC], NFD: [0x1106, 0x1172, 0x11BF], NFKC: [0xBBBC], NFKD: [0x1106, 0x1172, 0x11BF] }, +{ source: [0xBBBD], NFC: [0xBBBD], NFD: [0x1106, 0x1172, 0x11C0], NFKC: [0xBBBD], NFKD: [0x1106, 0x1172, 0x11C0] }, +{ source: [0xBBBE], NFC: [0xBBBE], NFD: [0x1106, 0x1172, 0x11C1], NFKC: [0xBBBE], NFKD: [0x1106, 0x1172, 0x11C1] }, +{ source: [0xBBBF], NFC: [0xBBBF], NFD: [0x1106, 0x1172, 0x11C2], NFKC: [0xBBBF], NFKD: [0x1106, 0x1172, 0x11C2] }, +{ source: [0xBBC0], NFC: [0xBBC0], NFD: [0x1106, 0x1173], NFKC: [0xBBC0], NFKD: [0x1106, 0x1173] }, +{ source: [0xBBC1], NFC: [0xBBC1], NFD: [0x1106, 0x1173, 0x11A8], NFKC: [0xBBC1], NFKD: [0x1106, 0x1173, 0x11A8] }, +{ source: [0xBBC2], NFC: [0xBBC2], NFD: [0x1106, 0x1173, 0x11A9], NFKC: [0xBBC2], NFKD: [0x1106, 0x1173, 0x11A9] }, +{ source: [0xBBC3], NFC: [0xBBC3], NFD: [0x1106, 0x1173, 0x11AA], NFKC: [0xBBC3], NFKD: [0x1106, 0x1173, 0x11AA] }, +{ source: [0xBBC4], NFC: [0xBBC4], NFD: [0x1106, 0x1173, 0x11AB], NFKC: [0xBBC4], NFKD: [0x1106, 0x1173, 0x11AB] }, +{ source: [0xBBC5], NFC: [0xBBC5], NFD: [0x1106, 0x1173, 0x11AC], NFKC: [0xBBC5], NFKD: [0x1106, 0x1173, 0x11AC] }, +{ source: [0xBBC6], NFC: [0xBBC6], NFD: [0x1106, 0x1173, 0x11AD], NFKC: [0xBBC6], NFKD: [0x1106, 0x1173, 0x11AD] }, +{ source: [0xBBC7], NFC: [0xBBC7], NFD: [0x1106, 0x1173, 0x11AE], NFKC: [0xBBC7], NFKD: [0x1106, 0x1173, 0x11AE] }, +{ source: [0xBBC8], NFC: [0xBBC8], NFD: [0x1106, 0x1173, 0x11AF], NFKC: [0xBBC8], NFKD: [0x1106, 0x1173, 0x11AF] }, +{ source: [0xBBC9], NFC: [0xBBC9], NFD: [0x1106, 0x1173, 0x11B0], NFKC: [0xBBC9], NFKD: [0x1106, 0x1173, 0x11B0] }, +{ source: [0xBBCA], NFC: [0xBBCA], NFD: [0x1106, 0x1173, 0x11B1], NFKC: [0xBBCA], NFKD: [0x1106, 0x1173, 0x11B1] }, +{ source: [0xBBCB], NFC: [0xBBCB], NFD: [0x1106, 0x1173, 0x11B2], NFKC: [0xBBCB], NFKD: [0x1106, 0x1173, 0x11B2] }, +{ source: [0xBBCC], NFC: [0xBBCC], NFD: [0x1106, 0x1173, 0x11B3], NFKC: [0xBBCC], NFKD: [0x1106, 0x1173, 0x11B3] }, +{ source: [0xBBCD], NFC: [0xBBCD], NFD: [0x1106, 0x1173, 0x11B4], NFKC: [0xBBCD], NFKD: [0x1106, 0x1173, 0x11B4] }, +{ source: [0xBBCE], NFC: [0xBBCE], NFD: [0x1106, 0x1173, 0x11B5], NFKC: [0xBBCE], NFKD: [0x1106, 0x1173, 0x11B5] }, +{ source: [0xBBCF], NFC: [0xBBCF], NFD: [0x1106, 0x1173, 0x11B6], NFKC: [0xBBCF], NFKD: [0x1106, 0x1173, 0x11B6] }, +{ source: [0xBBD0], NFC: [0xBBD0], NFD: [0x1106, 0x1173, 0x11B7], NFKC: [0xBBD0], NFKD: [0x1106, 0x1173, 0x11B7] }, +{ source: [0xBBD1], NFC: [0xBBD1], NFD: [0x1106, 0x1173, 0x11B8], NFKC: [0xBBD1], NFKD: [0x1106, 0x1173, 0x11B8] }, +{ source: [0xBBD2], NFC: [0xBBD2], NFD: [0x1106, 0x1173, 0x11B9], NFKC: [0xBBD2], NFKD: [0x1106, 0x1173, 0x11B9] }, +{ source: [0xBBD3], NFC: [0xBBD3], NFD: [0x1106, 0x1173, 0x11BA], NFKC: [0xBBD3], NFKD: [0x1106, 0x1173, 0x11BA] }, +{ source: [0xBBD4], NFC: [0xBBD4], NFD: [0x1106, 0x1173, 0x11BB], NFKC: [0xBBD4], NFKD: [0x1106, 0x1173, 0x11BB] }, +{ source: [0xBBD5], NFC: [0xBBD5], NFD: [0x1106, 0x1173, 0x11BC], NFKC: [0xBBD5], NFKD: [0x1106, 0x1173, 0x11BC] }, +{ source: [0xBBD6], NFC: [0xBBD6], NFD: [0x1106, 0x1173, 0x11BD], NFKC: [0xBBD6], NFKD: [0x1106, 0x1173, 0x11BD] }, +{ source: [0xBBD7], NFC: [0xBBD7], NFD: [0x1106, 0x1173, 0x11BE], NFKC: [0xBBD7], NFKD: [0x1106, 0x1173, 0x11BE] }, +{ source: [0xBBD8], NFC: [0xBBD8], NFD: [0x1106, 0x1173, 0x11BF], NFKC: [0xBBD8], NFKD: [0x1106, 0x1173, 0x11BF] }, +{ source: [0xBBD9], NFC: [0xBBD9], NFD: [0x1106, 0x1173, 0x11C0], NFKC: [0xBBD9], NFKD: [0x1106, 0x1173, 0x11C0] }, +{ source: [0xBBDA], NFC: [0xBBDA], NFD: [0x1106, 0x1173, 0x11C1], NFKC: [0xBBDA], NFKD: [0x1106, 0x1173, 0x11C1] }, +{ source: [0xBBDB], NFC: [0xBBDB], NFD: [0x1106, 0x1173, 0x11C2], NFKC: [0xBBDB], NFKD: [0x1106, 0x1173, 0x11C2] }, +{ source: [0xBBDC], NFC: [0xBBDC], NFD: [0x1106, 0x1174], NFKC: [0xBBDC], NFKD: [0x1106, 0x1174] }, +{ source: [0xBBDD], NFC: [0xBBDD], NFD: [0x1106, 0x1174, 0x11A8], NFKC: [0xBBDD], NFKD: [0x1106, 0x1174, 0x11A8] }, +{ source: [0xBBDE], NFC: [0xBBDE], NFD: [0x1106, 0x1174, 0x11A9], NFKC: [0xBBDE], NFKD: [0x1106, 0x1174, 0x11A9] }, +{ source: [0xBBDF], NFC: [0xBBDF], NFD: [0x1106, 0x1174, 0x11AA], NFKC: [0xBBDF], NFKD: [0x1106, 0x1174, 0x11AA] }, +{ source: [0xBBE0], NFC: [0xBBE0], NFD: [0x1106, 0x1174, 0x11AB], NFKC: [0xBBE0], NFKD: [0x1106, 0x1174, 0x11AB] }, +{ source: [0xBBE1], NFC: [0xBBE1], NFD: [0x1106, 0x1174, 0x11AC], NFKC: [0xBBE1], NFKD: [0x1106, 0x1174, 0x11AC] }, +{ source: [0xBBE2], NFC: [0xBBE2], NFD: [0x1106, 0x1174, 0x11AD], NFKC: [0xBBE2], NFKD: [0x1106, 0x1174, 0x11AD] }, +{ source: [0xBBE3], NFC: [0xBBE3], NFD: [0x1106, 0x1174, 0x11AE], NFKC: [0xBBE3], NFKD: [0x1106, 0x1174, 0x11AE] }, +{ source: [0xBBE4], NFC: [0xBBE4], NFD: [0x1106, 0x1174, 0x11AF], NFKC: [0xBBE4], NFKD: [0x1106, 0x1174, 0x11AF] }, +{ source: [0xBBE5], NFC: [0xBBE5], NFD: [0x1106, 0x1174, 0x11B0], NFKC: [0xBBE5], NFKD: [0x1106, 0x1174, 0x11B0] }, +{ source: [0xBBE6], NFC: [0xBBE6], NFD: [0x1106, 0x1174, 0x11B1], NFKC: [0xBBE6], NFKD: [0x1106, 0x1174, 0x11B1] }, +{ source: [0xBBE7], NFC: [0xBBE7], NFD: [0x1106, 0x1174, 0x11B2], NFKC: [0xBBE7], NFKD: [0x1106, 0x1174, 0x11B2] }, +{ source: [0xBBE8], NFC: [0xBBE8], NFD: [0x1106, 0x1174, 0x11B3], NFKC: [0xBBE8], NFKD: [0x1106, 0x1174, 0x11B3] }, +{ source: [0xBBE9], NFC: [0xBBE9], NFD: [0x1106, 0x1174, 0x11B4], NFKC: [0xBBE9], NFKD: [0x1106, 0x1174, 0x11B4] }, +{ source: [0xBBEA], NFC: [0xBBEA], NFD: [0x1106, 0x1174, 0x11B5], NFKC: [0xBBEA], NFKD: [0x1106, 0x1174, 0x11B5] }, +{ source: [0xBBEB], NFC: [0xBBEB], NFD: [0x1106, 0x1174, 0x11B6], NFKC: [0xBBEB], NFKD: [0x1106, 0x1174, 0x11B6] }, +{ source: [0xBBEC], NFC: [0xBBEC], NFD: [0x1106, 0x1174, 0x11B7], NFKC: [0xBBEC], NFKD: [0x1106, 0x1174, 0x11B7] }, +{ source: [0xBBED], NFC: [0xBBED], NFD: [0x1106, 0x1174, 0x11B8], NFKC: [0xBBED], NFKD: [0x1106, 0x1174, 0x11B8] }, +{ source: [0xBBEE], NFC: [0xBBEE], NFD: [0x1106, 0x1174, 0x11B9], NFKC: [0xBBEE], NFKD: [0x1106, 0x1174, 0x11B9] }, +{ source: [0xBBEF], NFC: [0xBBEF], NFD: [0x1106, 0x1174, 0x11BA], NFKC: [0xBBEF], NFKD: [0x1106, 0x1174, 0x11BA] }, +{ source: [0xBBF0], NFC: [0xBBF0], NFD: [0x1106, 0x1174, 0x11BB], NFKC: [0xBBF0], NFKD: [0x1106, 0x1174, 0x11BB] }, +{ source: [0xBBF1], NFC: [0xBBF1], NFD: [0x1106, 0x1174, 0x11BC], NFKC: [0xBBF1], NFKD: [0x1106, 0x1174, 0x11BC] }, +{ source: [0xBBF2], NFC: [0xBBF2], NFD: [0x1106, 0x1174, 0x11BD], NFKC: [0xBBF2], NFKD: [0x1106, 0x1174, 0x11BD] }, +{ source: [0xBBF3], NFC: [0xBBF3], NFD: [0x1106, 0x1174, 0x11BE], NFKC: [0xBBF3], NFKD: [0x1106, 0x1174, 0x11BE] }, +{ source: [0xBBF4], NFC: [0xBBF4], NFD: [0x1106, 0x1174, 0x11BF], NFKC: [0xBBF4], NFKD: [0x1106, 0x1174, 0x11BF] }, +{ source: [0xBBF5], NFC: [0xBBF5], NFD: [0x1106, 0x1174, 0x11C0], NFKC: [0xBBF5], NFKD: [0x1106, 0x1174, 0x11C0] }, +{ source: [0xBBF6], NFC: [0xBBF6], NFD: [0x1106, 0x1174, 0x11C1], NFKC: [0xBBF6], NFKD: [0x1106, 0x1174, 0x11C1] }, +{ source: [0xBBF7], NFC: [0xBBF7], NFD: [0x1106, 0x1174, 0x11C2], NFKC: [0xBBF7], NFKD: [0x1106, 0x1174, 0x11C2] }, +{ source: [0xBBF8], NFC: [0xBBF8], NFD: [0x1106, 0x1175], NFKC: [0xBBF8], NFKD: [0x1106, 0x1175] }, +{ source: [0xBBF9], NFC: [0xBBF9], NFD: [0x1106, 0x1175, 0x11A8], NFKC: [0xBBF9], NFKD: [0x1106, 0x1175, 0x11A8] }, +{ source: [0xBBFA], NFC: [0xBBFA], NFD: [0x1106, 0x1175, 0x11A9], NFKC: [0xBBFA], NFKD: [0x1106, 0x1175, 0x11A9] }, +{ source: [0xBBFB], NFC: [0xBBFB], NFD: [0x1106, 0x1175, 0x11AA], NFKC: [0xBBFB], NFKD: [0x1106, 0x1175, 0x11AA] }, +{ source: [0xBBFC], NFC: [0xBBFC], NFD: [0x1106, 0x1175, 0x11AB], NFKC: [0xBBFC], NFKD: [0x1106, 0x1175, 0x11AB] }, +{ source: [0xBBFD], NFC: [0xBBFD], NFD: [0x1106, 0x1175, 0x11AC], NFKC: [0xBBFD], NFKD: [0x1106, 0x1175, 0x11AC] }, +{ source: [0xBBFE], NFC: [0xBBFE], NFD: [0x1106, 0x1175, 0x11AD], NFKC: [0xBBFE], NFKD: [0x1106, 0x1175, 0x11AD] }, +{ source: [0xBBFF], NFC: [0xBBFF], NFD: [0x1106, 0x1175, 0x11AE], NFKC: [0xBBFF], NFKD: [0x1106, 0x1175, 0x11AE] }, +{ source: [0xBC00], NFC: [0xBC00], NFD: [0x1106, 0x1175, 0x11AF], NFKC: [0xBC00], NFKD: [0x1106, 0x1175, 0x11AF] }, +{ source: [0xBC01], NFC: [0xBC01], NFD: [0x1106, 0x1175, 0x11B0], NFKC: [0xBC01], NFKD: [0x1106, 0x1175, 0x11B0] }, +{ source: [0xBC02], NFC: [0xBC02], NFD: [0x1106, 0x1175, 0x11B1], NFKC: [0xBC02], NFKD: [0x1106, 0x1175, 0x11B1] }, +{ source: [0xBC03], NFC: [0xBC03], NFD: [0x1106, 0x1175, 0x11B2], NFKC: [0xBC03], NFKD: [0x1106, 0x1175, 0x11B2] }, +{ source: [0xBC04], NFC: [0xBC04], NFD: [0x1106, 0x1175, 0x11B3], NFKC: [0xBC04], NFKD: [0x1106, 0x1175, 0x11B3] }, +{ source: [0xBC05], NFC: [0xBC05], NFD: [0x1106, 0x1175, 0x11B4], NFKC: [0xBC05], NFKD: [0x1106, 0x1175, 0x11B4] }, +{ source: [0xBC06], NFC: [0xBC06], NFD: [0x1106, 0x1175, 0x11B5], NFKC: [0xBC06], NFKD: [0x1106, 0x1175, 0x11B5] }, +{ source: [0xBC07], NFC: [0xBC07], NFD: [0x1106, 0x1175, 0x11B6], NFKC: [0xBC07], NFKD: [0x1106, 0x1175, 0x11B6] }, +{ source: [0xBC08], NFC: [0xBC08], NFD: [0x1106, 0x1175, 0x11B7], NFKC: [0xBC08], NFKD: [0x1106, 0x1175, 0x11B7] }, +{ source: [0xBC09], NFC: [0xBC09], NFD: [0x1106, 0x1175, 0x11B8], NFKC: [0xBC09], NFKD: [0x1106, 0x1175, 0x11B8] }, +{ source: [0xBC0A], NFC: [0xBC0A], NFD: [0x1106, 0x1175, 0x11B9], NFKC: [0xBC0A], NFKD: [0x1106, 0x1175, 0x11B9] }, +{ source: [0xBC0B], NFC: [0xBC0B], NFD: [0x1106, 0x1175, 0x11BA], NFKC: [0xBC0B], NFKD: [0x1106, 0x1175, 0x11BA] }, +{ source: [0xBC0C], NFC: [0xBC0C], NFD: [0x1106, 0x1175, 0x11BB], NFKC: [0xBC0C], NFKD: [0x1106, 0x1175, 0x11BB] }, +{ source: [0xBC0D], NFC: [0xBC0D], NFD: [0x1106, 0x1175, 0x11BC], NFKC: [0xBC0D], NFKD: [0x1106, 0x1175, 0x11BC] }, +{ source: [0xBC0E], NFC: [0xBC0E], NFD: [0x1106, 0x1175, 0x11BD], NFKC: [0xBC0E], NFKD: [0x1106, 0x1175, 0x11BD] }, +{ source: [0xBC0F], NFC: [0xBC0F], NFD: [0x1106, 0x1175, 0x11BE], NFKC: [0xBC0F], NFKD: [0x1106, 0x1175, 0x11BE] }, +{ source: [0xBC10], NFC: [0xBC10], NFD: [0x1106, 0x1175, 0x11BF], NFKC: [0xBC10], NFKD: [0x1106, 0x1175, 0x11BF] }, +{ source: [0xBC11], NFC: [0xBC11], NFD: [0x1106, 0x1175, 0x11C0], NFKC: [0xBC11], NFKD: [0x1106, 0x1175, 0x11C0] }, +{ source: [0xBC12], NFC: [0xBC12], NFD: [0x1106, 0x1175, 0x11C1], NFKC: [0xBC12], NFKD: [0x1106, 0x1175, 0x11C1] }, +{ source: [0xBC13], NFC: [0xBC13], NFD: [0x1106, 0x1175, 0x11C2], NFKC: [0xBC13], NFKD: [0x1106, 0x1175, 0x11C2] }, +{ source: [0xBC14], NFC: [0xBC14], NFD: [0x1107, 0x1161], NFKC: [0xBC14], NFKD: [0x1107, 0x1161] }, +{ source: [0xBC15], NFC: [0xBC15], NFD: [0x1107, 0x1161, 0x11A8], NFKC: [0xBC15], NFKD: [0x1107, 0x1161, 0x11A8] }, +{ source: [0xBC16], NFC: [0xBC16], NFD: [0x1107, 0x1161, 0x11A9], NFKC: [0xBC16], NFKD: [0x1107, 0x1161, 0x11A9] }, +{ source: [0xBC17], NFC: [0xBC17], NFD: [0x1107, 0x1161, 0x11AA], NFKC: [0xBC17], NFKD: [0x1107, 0x1161, 0x11AA] }, +{ source: [0xBC18], NFC: [0xBC18], NFD: [0x1107, 0x1161, 0x11AB], NFKC: [0xBC18], NFKD: [0x1107, 0x1161, 0x11AB] }, +{ source: [0xBC19], NFC: [0xBC19], NFD: [0x1107, 0x1161, 0x11AC], NFKC: [0xBC19], NFKD: [0x1107, 0x1161, 0x11AC] }, +{ source: [0xBC1A], NFC: [0xBC1A], NFD: [0x1107, 0x1161, 0x11AD], NFKC: [0xBC1A], NFKD: [0x1107, 0x1161, 0x11AD] }, +{ source: [0xBC1B], NFC: [0xBC1B], NFD: [0x1107, 0x1161, 0x11AE], NFKC: [0xBC1B], NFKD: [0x1107, 0x1161, 0x11AE] }, +{ source: [0xBC1C], NFC: [0xBC1C], NFD: [0x1107, 0x1161, 0x11AF], NFKC: [0xBC1C], NFKD: [0x1107, 0x1161, 0x11AF] }, +{ source: [0xBC1D], NFC: [0xBC1D], NFD: [0x1107, 0x1161, 0x11B0], NFKC: [0xBC1D], NFKD: [0x1107, 0x1161, 0x11B0] }, +{ source: [0xBC1E], NFC: [0xBC1E], NFD: [0x1107, 0x1161, 0x11B1], NFKC: [0xBC1E], NFKD: [0x1107, 0x1161, 0x11B1] }, +{ source: [0xBC1F], NFC: [0xBC1F], NFD: [0x1107, 0x1161, 0x11B2], NFKC: [0xBC1F], NFKD: [0x1107, 0x1161, 0x11B2] }, +{ source: [0xBC20], NFC: [0xBC20], NFD: [0x1107, 0x1161, 0x11B3], NFKC: [0xBC20], NFKD: [0x1107, 0x1161, 0x11B3] }, +{ source: [0xBC21], NFC: [0xBC21], NFD: [0x1107, 0x1161, 0x11B4], NFKC: [0xBC21], NFKD: [0x1107, 0x1161, 0x11B4] }, +{ source: [0xBC22], NFC: [0xBC22], NFD: [0x1107, 0x1161, 0x11B5], NFKC: [0xBC22], NFKD: [0x1107, 0x1161, 0x11B5] }, +{ source: [0xBC23], NFC: [0xBC23], NFD: [0x1107, 0x1161, 0x11B6], NFKC: [0xBC23], NFKD: [0x1107, 0x1161, 0x11B6] }, +{ source: [0xBC24], NFC: [0xBC24], NFD: [0x1107, 0x1161, 0x11B7], NFKC: [0xBC24], NFKD: [0x1107, 0x1161, 0x11B7] }, +{ source: [0xBC25], NFC: [0xBC25], NFD: [0x1107, 0x1161, 0x11B8], NFKC: [0xBC25], NFKD: [0x1107, 0x1161, 0x11B8] }, +{ source: [0xBC26], NFC: [0xBC26], NFD: [0x1107, 0x1161, 0x11B9], NFKC: [0xBC26], NFKD: [0x1107, 0x1161, 0x11B9] }, +{ source: [0xBC27], NFC: [0xBC27], NFD: [0x1107, 0x1161, 0x11BA], NFKC: [0xBC27], NFKD: [0x1107, 0x1161, 0x11BA] }, +{ source: [0xBC28], NFC: [0xBC28], NFD: [0x1107, 0x1161, 0x11BB], NFKC: [0xBC28], NFKD: [0x1107, 0x1161, 0x11BB] }, +{ source: [0xBC29], NFC: [0xBC29], NFD: [0x1107, 0x1161, 0x11BC], NFKC: [0xBC29], NFKD: [0x1107, 0x1161, 0x11BC] }, +{ source: [0xBC2A], NFC: [0xBC2A], NFD: [0x1107, 0x1161, 0x11BD], NFKC: [0xBC2A], NFKD: [0x1107, 0x1161, 0x11BD] }, +{ source: [0xBC2B], NFC: [0xBC2B], NFD: [0x1107, 0x1161, 0x11BE], NFKC: [0xBC2B], NFKD: [0x1107, 0x1161, 0x11BE] }, +{ source: [0xBC2C], NFC: [0xBC2C], NFD: [0x1107, 0x1161, 0x11BF], NFKC: [0xBC2C], NFKD: [0x1107, 0x1161, 0x11BF] }, +{ source: [0xBC2D], NFC: [0xBC2D], NFD: [0x1107, 0x1161, 0x11C0], NFKC: [0xBC2D], NFKD: [0x1107, 0x1161, 0x11C0] }, +{ source: [0xBC2E], NFC: [0xBC2E], NFD: [0x1107, 0x1161, 0x11C1], NFKC: [0xBC2E], NFKD: [0x1107, 0x1161, 0x11C1] }, +{ source: [0xBC2F], NFC: [0xBC2F], NFD: [0x1107, 0x1161, 0x11C2], NFKC: [0xBC2F], NFKD: [0x1107, 0x1161, 0x11C2] }, +{ source: [0xBC30], NFC: [0xBC30], NFD: [0x1107, 0x1162], NFKC: [0xBC30], NFKD: [0x1107, 0x1162] }, +{ source: [0xBC31], NFC: [0xBC31], NFD: [0x1107, 0x1162, 0x11A8], NFKC: [0xBC31], NFKD: [0x1107, 0x1162, 0x11A8] }, +{ source: [0xBC32], NFC: [0xBC32], NFD: [0x1107, 0x1162, 0x11A9], NFKC: [0xBC32], NFKD: [0x1107, 0x1162, 0x11A9] }, +{ source: [0xBC33], NFC: [0xBC33], NFD: [0x1107, 0x1162, 0x11AA], NFKC: [0xBC33], NFKD: [0x1107, 0x1162, 0x11AA] }, +{ source: [0xBC34], NFC: [0xBC34], NFD: [0x1107, 0x1162, 0x11AB], NFKC: [0xBC34], NFKD: [0x1107, 0x1162, 0x11AB] }, +{ source: [0xBC35], NFC: [0xBC35], NFD: [0x1107, 0x1162, 0x11AC], NFKC: [0xBC35], NFKD: [0x1107, 0x1162, 0x11AC] }, +{ source: [0xBC36], NFC: [0xBC36], NFD: [0x1107, 0x1162, 0x11AD], NFKC: [0xBC36], NFKD: [0x1107, 0x1162, 0x11AD] }, +{ source: [0xBC37], NFC: [0xBC37], NFD: [0x1107, 0x1162, 0x11AE], NFKC: [0xBC37], NFKD: [0x1107, 0x1162, 0x11AE] }, +{ source: [0xBC38], NFC: [0xBC38], NFD: [0x1107, 0x1162, 0x11AF], NFKC: [0xBC38], NFKD: [0x1107, 0x1162, 0x11AF] }, +{ source: [0xBC39], NFC: [0xBC39], NFD: [0x1107, 0x1162, 0x11B0], NFKC: [0xBC39], NFKD: [0x1107, 0x1162, 0x11B0] }, +{ source: [0xBC3A], NFC: [0xBC3A], NFD: [0x1107, 0x1162, 0x11B1], NFKC: [0xBC3A], NFKD: [0x1107, 0x1162, 0x11B1] }, +{ source: [0xBC3B], NFC: [0xBC3B], NFD: [0x1107, 0x1162, 0x11B2], NFKC: [0xBC3B], NFKD: [0x1107, 0x1162, 0x11B2] }, +{ source: [0xBC3C], NFC: [0xBC3C], NFD: [0x1107, 0x1162, 0x11B3], NFKC: [0xBC3C], NFKD: [0x1107, 0x1162, 0x11B3] }, +{ source: [0xBC3D], NFC: [0xBC3D], NFD: [0x1107, 0x1162, 0x11B4], NFKC: [0xBC3D], NFKD: [0x1107, 0x1162, 0x11B4] }, +{ source: [0xBC3E], NFC: [0xBC3E], NFD: [0x1107, 0x1162, 0x11B5], NFKC: [0xBC3E], NFKD: [0x1107, 0x1162, 0x11B5] }, +{ source: [0xBC3F], NFC: [0xBC3F], NFD: [0x1107, 0x1162, 0x11B6], NFKC: [0xBC3F], NFKD: [0x1107, 0x1162, 0x11B6] }, +{ source: [0xBC40], NFC: [0xBC40], NFD: [0x1107, 0x1162, 0x11B7], NFKC: [0xBC40], NFKD: [0x1107, 0x1162, 0x11B7] }, +{ source: [0xBC41], NFC: [0xBC41], NFD: [0x1107, 0x1162, 0x11B8], NFKC: [0xBC41], NFKD: [0x1107, 0x1162, 0x11B8] }, +{ source: [0xBC42], NFC: [0xBC42], NFD: [0x1107, 0x1162, 0x11B9], NFKC: [0xBC42], NFKD: [0x1107, 0x1162, 0x11B9] }, +{ source: [0xBC43], NFC: [0xBC43], NFD: [0x1107, 0x1162, 0x11BA], NFKC: [0xBC43], NFKD: [0x1107, 0x1162, 0x11BA] }, +{ source: [0xBC44], NFC: [0xBC44], NFD: [0x1107, 0x1162, 0x11BB], NFKC: [0xBC44], NFKD: [0x1107, 0x1162, 0x11BB] }, +{ source: [0xBC45], NFC: [0xBC45], NFD: [0x1107, 0x1162, 0x11BC], NFKC: [0xBC45], NFKD: [0x1107, 0x1162, 0x11BC] }, +{ source: [0xBC46], NFC: [0xBC46], NFD: [0x1107, 0x1162, 0x11BD], NFKC: [0xBC46], NFKD: [0x1107, 0x1162, 0x11BD] }, +{ source: [0xBC47], NFC: [0xBC47], NFD: [0x1107, 0x1162, 0x11BE], NFKC: [0xBC47], NFKD: [0x1107, 0x1162, 0x11BE] }, +{ source: [0xBC48], NFC: [0xBC48], NFD: [0x1107, 0x1162, 0x11BF], NFKC: [0xBC48], NFKD: [0x1107, 0x1162, 0x11BF] }, +{ source: [0xBC49], NFC: [0xBC49], NFD: [0x1107, 0x1162, 0x11C0], NFKC: [0xBC49], NFKD: [0x1107, 0x1162, 0x11C0] }, +{ source: [0xBC4A], NFC: [0xBC4A], NFD: [0x1107, 0x1162, 0x11C1], NFKC: [0xBC4A], NFKD: [0x1107, 0x1162, 0x11C1] }, +{ source: [0xBC4B], NFC: [0xBC4B], NFD: [0x1107, 0x1162, 0x11C2], NFKC: [0xBC4B], NFKD: [0x1107, 0x1162, 0x11C2] }, +{ source: [0xBC4C], NFC: [0xBC4C], NFD: [0x1107, 0x1163], NFKC: [0xBC4C], NFKD: [0x1107, 0x1163] }, +{ source: [0xBC4D], NFC: [0xBC4D], NFD: [0x1107, 0x1163, 0x11A8], NFKC: [0xBC4D], NFKD: [0x1107, 0x1163, 0x11A8] }, +{ source: [0xBC4E], NFC: [0xBC4E], NFD: [0x1107, 0x1163, 0x11A9], NFKC: [0xBC4E], NFKD: [0x1107, 0x1163, 0x11A9] }, +{ source: [0xBC4F], NFC: [0xBC4F], NFD: [0x1107, 0x1163, 0x11AA], NFKC: [0xBC4F], NFKD: [0x1107, 0x1163, 0x11AA] }, +{ source: [0xBC50], NFC: [0xBC50], NFD: [0x1107, 0x1163, 0x11AB], NFKC: [0xBC50], NFKD: [0x1107, 0x1163, 0x11AB] }, +{ source: [0xBC51], NFC: [0xBC51], NFD: [0x1107, 0x1163, 0x11AC], NFKC: [0xBC51], NFKD: [0x1107, 0x1163, 0x11AC] }, +{ source: [0xBC52], NFC: [0xBC52], NFD: [0x1107, 0x1163, 0x11AD], NFKC: [0xBC52], NFKD: [0x1107, 0x1163, 0x11AD] }, +{ source: [0xBC53], NFC: [0xBC53], NFD: [0x1107, 0x1163, 0x11AE], NFKC: [0xBC53], NFKD: [0x1107, 0x1163, 0x11AE] }, +{ source: [0xBC54], NFC: [0xBC54], NFD: [0x1107, 0x1163, 0x11AF], NFKC: [0xBC54], NFKD: [0x1107, 0x1163, 0x11AF] }, +{ source: [0xBC55], NFC: [0xBC55], NFD: [0x1107, 0x1163, 0x11B0], NFKC: [0xBC55], NFKD: [0x1107, 0x1163, 0x11B0] }, +{ source: [0xBC56], NFC: [0xBC56], NFD: [0x1107, 0x1163, 0x11B1], NFKC: [0xBC56], NFKD: [0x1107, 0x1163, 0x11B1] }, +{ source: [0xBC57], NFC: [0xBC57], NFD: [0x1107, 0x1163, 0x11B2], NFKC: [0xBC57], NFKD: [0x1107, 0x1163, 0x11B2] }, +{ source: [0xBC58], NFC: [0xBC58], NFD: [0x1107, 0x1163, 0x11B3], NFKC: [0xBC58], NFKD: [0x1107, 0x1163, 0x11B3] }, +{ source: [0xBC59], NFC: [0xBC59], NFD: [0x1107, 0x1163, 0x11B4], NFKC: [0xBC59], NFKD: [0x1107, 0x1163, 0x11B4] }, +{ source: [0xBC5A], NFC: [0xBC5A], NFD: [0x1107, 0x1163, 0x11B5], NFKC: [0xBC5A], NFKD: [0x1107, 0x1163, 0x11B5] }, +{ source: [0xBC5B], NFC: [0xBC5B], NFD: [0x1107, 0x1163, 0x11B6], NFKC: [0xBC5B], NFKD: [0x1107, 0x1163, 0x11B6] }, +{ source: [0xBC5C], NFC: [0xBC5C], NFD: [0x1107, 0x1163, 0x11B7], NFKC: [0xBC5C], NFKD: [0x1107, 0x1163, 0x11B7] }, +{ source: [0xBC5D], NFC: [0xBC5D], NFD: [0x1107, 0x1163, 0x11B8], NFKC: [0xBC5D], NFKD: [0x1107, 0x1163, 0x11B8] }, +{ source: [0xBC5E], NFC: [0xBC5E], NFD: [0x1107, 0x1163, 0x11B9], NFKC: [0xBC5E], NFKD: [0x1107, 0x1163, 0x11B9] }, +{ source: [0xBC5F], NFC: [0xBC5F], NFD: [0x1107, 0x1163, 0x11BA], NFKC: [0xBC5F], NFKD: [0x1107, 0x1163, 0x11BA] }, +{ source: [0xBC60], NFC: [0xBC60], NFD: [0x1107, 0x1163, 0x11BB], NFKC: [0xBC60], NFKD: [0x1107, 0x1163, 0x11BB] }, +{ source: [0xBC61], NFC: [0xBC61], NFD: [0x1107, 0x1163, 0x11BC], NFKC: [0xBC61], NFKD: [0x1107, 0x1163, 0x11BC] }, +{ source: [0xBC62], NFC: [0xBC62], NFD: [0x1107, 0x1163, 0x11BD], NFKC: [0xBC62], NFKD: [0x1107, 0x1163, 0x11BD] }, +{ source: [0xBC63], NFC: [0xBC63], NFD: [0x1107, 0x1163, 0x11BE], NFKC: [0xBC63], NFKD: [0x1107, 0x1163, 0x11BE] }, +{ source: [0xBC64], NFC: [0xBC64], NFD: [0x1107, 0x1163, 0x11BF], NFKC: [0xBC64], NFKD: [0x1107, 0x1163, 0x11BF] }, +{ source: [0xBC65], NFC: [0xBC65], NFD: [0x1107, 0x1163, 0x11C0], NFKC: [0xBC65], NFKD: [0x1107, 0x1163, 0x11C0] }, +{ source: [0xBC66], NFC: [0xBC66], NFD: [0x1107, 0x1163, 0x11C1], NFKC: [0xBC66], NFKD: [0x1107, 0x1163, 0x11C1] }, +{ source: [0xBC67], NFC: [0xBC67], NFD: [0x1107, 0x1163, 0x11C2], NFKC: [0xBC67], NFKD: [0x1107, 0x1163, 0x11C2] }, +{ source: [0xBC68], NFC: [0xBC68], NFD: [0x1107, 0x1164], NFKC: [0xBC68], NFKD: [0x1107, 0x1164] }, +{ source: [0xBC69], NFC: [0xBC69], NFD: [0x1107, 0x1164, 0x11A8], NFKC: [0xBC69], NFKD: [0x1107, 0x1164, 0x11A8] }, +{ source: [0xBC6A], NFC: [0xBC6A], NFD: [0x1107, 0x1164, 0x11A9], NFKC: [0xBC6A], NFKD: [0x1107, 0x1164, 0x11A9] }, +{ source: [0xBC6B], NFC: [0xBC6B], NFD: [0x1107, 0x1164, 0x11AA], NFKC: [0xBC6B], NFKD: [0x1107, 0x1164, 0x11AA] }, +{ source: [0xBC6C], NFC: [0xBC6C], NFD: [0x1107, 0x1164, 0x11AB], NFKC: [0xBC6C], NFKD: [0x1107, 0x1164, 0x11AB] }, +{ source: [0xBC6D], NFC: [0xBC6D], NFD: [0x1107, 0x1164, 0x11AC], NFKC: [0xBC6D], NFKD: [0x1107, 0x1164, 0x11AC] }, +{ source: [0xBC6E], NFC: [0xBC6E], NFD: [0x1107, 0x1164, 0x11AD], NFKC: [0xBC6E], NFKD: [0x1107, 0x1164, 0x11AD] }, +{ source: [0xBC6F], NFC: [0xBC6F], NFD: [0x1107, 0x1164, 0x11AE], NFKC: [0xBC6F], NFKD: [0x1107, 0x1164, 0x11AE] }, +{ source: [0xBC70], NFC: [0xBC70], NFD: [0x1107, 0x1164, 0x11AF], NFKC: [0xBC70], NFKD: [0x1107, 0x1164, 0x11AF] }, +{ source: [0xBC71], NFC: [0xBC71], NFD: [0x1107, 0x1164, 0x11B0], NFKC: [0xBC71], NFKD: [0x1107, 0x1164, 0x11B0] }, +{ source: [0xBC72], NFC: [0xBC72], NFD: [0x1107, 0x1164, 0x11B1], NFKC: [0xBC72], NFKD: [0x1107, 0x1164, 0x11B1] }, +{ source: [0xBC73], NFC: [0xBC73], NFD: [0x1107, 0x1164, 0x11B2], NFKC: [0xBC73], NFKD: [0x1107, 0x1164, 0x11B2] }, +{ source: [0xBC74], NFC: [0xBC74], NFD: [0x1107, 0x1164, 0x11B3], NFKC: [0xBC74], NFKD: [0x1107, 0x1164, 0x11B3] }, +{ source: [0xBC75], NFC: [0xBC75], NFD: [0x1107, 0x1164, 0x11B4], NFKC: [0xBC75], NFKD: [0x1107, 0x1164, 0x11B4] }, +{ source: [0xBC76], NFC: [0xBC76], NFD: [0x1107, 0x1164, 0x11B5], NFKC: [0xBC76], NFKD: [0x1107, 0x1164, 0x11B5] }, +{ source: [0xBC77], NFC: [0xBC77], NFD: [0x1107, 0x1164, 0x11B6], NFKC: [0xBC77], NFKD: [0x1107, 0x1164, 0x11B6] }, +{ source: [0xBC78], NFC: [0xBC78], NFD: [0x1107, 0x1164, 0x11B7], NFKC: [0xBC78], NFKD: [0x1107, 0x1164, 0x11B7] }, +{ source: [0xBC79], NFC: [0xBC79], NFD: [0x1107, 0x1164, 0x11B8], NFKC: [0xBC79], NFKD: [0x1107, 0x1164, 0x11B8] }, +{ source: [0xBC7A], NFC: [0xBC7A], NFD: [0x1107, 0x1164, 0x11B9], NFKC: [0xBC7A], NFKD: [0x1107, 0x1164, 0x11B9] }, +{ source: [0xBC7B], NFC: [0xBC7B], NFD: [0x1107, 0x1164, 0x11BA], NFKC: [0xBC7B], NFKD: [0x1107, 0x1164, 0x11BA] }, +{ source: [0xBC7C], NFC: [0xBC7C], NFD: [0x1107, 0x1164, 0x11BB], NFKC: [0xBC7C], NFKD: [0x1107, 0x1164, 0x11BB] }, +{ source: [0xBC7D], NFC: [0xBC7D], NFD: [0x1107, 0x1164, 0x11BC], NFKC: [0xBC7D], NFKD: [0x1107, 0x1164, 0x11BC] }, +{ source: [0xBC7E], NFC: [0xBC7E], NFD: [0x1107, 0x1164, 0x11BD], NFKC: [0xBC7E], NFKD: [0x1107, 0x1164, 0x11BD] }, +{ source: [0xBC7F], NFC: [0xBC7F], NFD: [0x1107, 0x1164, 0x11BE], NFKC: [0xBC7F], NFKD: [0x1107, 0x1164, 0x11BE] }, +{ source: [0xBC80], NFC: [0xBC80], NFD: [0x1107, 0x1164, 0x11BF], NFKC: [0xBC80], NFKD: [0x1107, 0x1164, 0x11BF] }, +{ source: [0xBC81], NFC: [0xBC81], NFD: [0x1107, 0x1164, 0x11C0], NFKC: [0xBC81], NFKD: [0x1107, 0x1164, 0x11C0] }, +{ source: [0xBC82], NFC: [0xBC82], NFD: [0x1107, 0x1164, 0x11C1], NFKC: [0xBC82], NFKD: [0x1107, 0x1164, 0x11C1] }, +{ source: [0xBC83], NFC: [0xBC83], NFD: [0x1107, 0x1164, 0x11C2], NFKC: [0xBC83], NFKD: [0x1107, 0x1164, 0x11C2] }, +{ source: [0xBC84], NFC: [0xBC84], NFD: [0x1107, 0x1165], NFKC: [0xBC84], NFKD: [0x1107, 0x1165] }, +{ source: [0xBC85], NFC: [0xBC85], NFD: [0x1107, 0x1165, 0x11A8], NFKC: [0xBC85], NFKD: [0x1107, 0x1165, 0x11A8] }, +{ source: [0xBC86], NFC: [0xBC86], NFD: [0x1107, 0x1165, 0x11A9], NFKC: [0xBC86], NFKD: [0x1107, 0x1165, 0x11A9] }, +{ source: [0xBC87], NFC: [0xBC87], NFD: [0x1107, 0x1165, 0x11AA], NFKC: [0xBC87], NFKD: [0x1107, 0x1165, 0x11AA] }, +{ source: [0xBC88], NFC: [0xBC88], NFD: [0x1107, 0x1165, 0x11AB], NFKC: [0xBC88], NFKD: [0x1107, 0x1165, 0x11AB] }, +{ source: [0xBC89], NFC: [0xBC89], NFD: [0x1107, 0x1165, 0x11AC], NFKC: [0xBC89], NFKD: [0x1107, 0x1165, 0x11AC] }, +{ source: [0xBC8A], NFC: [0xBC8A], NFD: [0x1107, 0x1165, 0x11AD], NFKC: [0xBC8A], NFKD: [0x1107, 0x1165, 0x11AD] }, +{ source: [0xBC8B], NFC: [0xBC8B], NFD: [0x1107, 0x1165, 0x11AE], NFKC: [0xBC8B], NFKD: [0x1107, 0x1165, 0x11AE] }, +{ source: [0xBC8C], NFC: [0xBC8C], NFD: [0x1107, 0x1165, 0x11AF], NFKC: [0xBC8C], NFKD: [0x1107, 0x1165, 0x11AF] }, +{ source: [0xBC8D], NFC: [0xBC8D], NFD: [0x1107, 0x1165, 0x11B0], NFKC: [0xBC8D], NFKD: [0x1107, 0x1165, 0x11B0] }, +{ source: [0xBC8E], NFC: [0xBC8E], NFD: [0x1107, 0x1165, 0x11B1], NFKC: [0xBC8E], NFKD: [0x1107, 0x1165, 0x11B1] }, +{ source: [0xBC8F], NFC: [0xBC8F], NFD: [0x1107, 0x1165, 0x11B2], NFKC: [0xBC8F], NFKD: [0x1107, 0x1165, 0x11B2] }, +{ source: [0xBC90], NFC: [0xBC90], NFD: [0x1107, 0x1165, 0x11B3], NFKC: [0xBC90], NFKD: [0x1107, 0x1165, 0x11B3] }, +{ source: [0xBC91], NFC: [0xBC91], NFD: [0x1107, 0x1165, 0x11B4], NFKC: [0xBC91], NFKD: [0x1107, 0x1165, 0x11B4] }, +{ source: [0xBC92], NFC: [0xBC92], NFD: [0x1107, 0x1165, 0x11B5], NFKC: [0xBC92], NFKD: [0x1107, 0x1165, 0x11B5] }, +{ source: [0xBC93], NFC: [0xBC93], NFD: [0x1107, 0x1165, 0x11B6], NFKC: [0xBC93], NFKD: [0x1107, 0x1165, 0x11B6] }, +{ source: [0xBC94], NFC: [0xBC94], NFD: [0x1107, 0x1165, 0x11B7], NFKC: [0xBC94], NFKD: [0x1107, 0x1165, 0x11B7] }, +{ source: [0xBC95], NFC: [0xBC95], NFD: [0x1107, 0x1165, 0x11B8], NFKC: [0xBC95], NFKD: [0x1107, 0x1165, 0x11B8] }, +{ source: [0xBC96], NFC: [0xBC96], NFD: [0x1107, 0x1165, 0x11B9], NFKC: [0xBC96], NFKD: [0x1107, 0x1165, 0x11B9] }, +{ source: [0xBC97], NFC: [0xBC97], NFD: [0x1107, 0x1165, 0x11BA], NFKC: [0xBC97], NFKD: [0x1107, 0x1165, 0x11BA] }, +{ source: [0xBC98], NFC: [0xBC98], NFD: [0x1107, 0x1165, 0x11BB], NFKC: [0xBC98], NFKD: [0x1107, 0x1165, 0x11BB] }, +{ source: [0xBC99], NFC: [0xBC99], NFD: [0x1107, 0x1165, 0x11BC], NFKC: [0xBC99], NFKD: [0x1107, 0x1165, 0x11BC] }, +{ source: [0xBC9A], NFC: [0xBC9A], NFD: [0x1107, 0x1165, 0x11BD], NFKC: [0xBC9A], NFKD: [0x1107, 0x1165, 0x11BD] }, +{ source: [0xBC9B], NFC: [0xBC9B], NFD: [0x1107, 0x1165, 0x11BE], NFKC: [0xBC9B], NFKD: [0x1107, 0x1165, 0x11BE] }, +{ source: [0xBC9C], NFC: [0xBC9C], NFD: [0x1107, 0x1165, 0x11BF], NFKC: [0xBC9C], NFKD: [0x1107, 0x1165, 0x11BF] }, +{ source: [0xBC9D], NFC: [0xBC9D], NFD: [0x1107, 0x1165, 0x11C0], NFKC: [0xBC9D], NFKD: [0x1107, 0x1165, 0x11C0] }, +{ source: [0xBC9E], NFC: [0xBC9E], NFD: [0x1107, 0x1165, 0x11C1], NFKC: [0xBC9E], NFKD: [0x1107, 0x1165, 0x11C1] }, +{ source: [0xBC9F], NFC: [0xBC9F], NFD: [0x1107, 0x1165, 0x11C2], NFKC: [0xBC9F], NFKD: [0x1107, 0x1165, 0x11C2] }, +{ source: [0xBCA0], NFC: [0xBCA0], NFD: [0x1107, 0x1166], NFKC: [0xBCA0], NFKD: [0x1107, 0x1166] }, +{ source: [0xBCA1], NFC: [0xBCA1], NFD: [0x1107, 0x1166, 0x11A8], NFKC: [0xBCA1], NFKD: [0x1107, 0x1166, 0x11A8] }, +{ source: [0xBCA2], NFC: [0xBCA2], NFD: [0x1107, 0x1166, 0x11A9], NFKC: [0xBCA2], NFKD: [0x1107, 0x1166, 0x11A9] }, +{ source: [0xBCA3], NFC: [0xBCA3], NFD: [0x1107, 0x1166, 0x11AA], NFKC: [0xBCA3], NFKD: [0x1107, 0x1166, 0x11AA] }, +{ source: [0xBCA4], NFC: [0xBCA4], NFD: [0x1107, 0x1166, 0x11AB], NFKC: [0xBCA4], NFKD: [0x1107, 0x1166, 0x11AB] }, +{ source: [0xBCA5], NFC: [0xBCA5], NFD: [0x1107, 0x1166, 0x11AC], NFKC: [0xBCA5], NFKD: [0x1107, 0x1166, 0x11AC] }, +{ source: [0xBCA6], NFC: [0xBCA6], NFD: [0x1107, 0x1166, 0x11AD], NFKC: [0xBCA6], NFKD: [0x1107, 0x1166, 0x11AD] }, +{ source: [0xBCA7], NFC: [0xBCA7], NFD: [0x1107, 0x1166, 0x11AE], NFKC: [0xBCA7], NFKD: [0x1107, 0x1166, 0x11AE] }, +{ source: [0xBCA8], NFC: [0xBCA8], NFD: [0x1107, 0x1166, 0x11AF], NFKC: [0xBCA8], NFKD: [0x1107, 0x1166, 0x11AF] }, +{ source: [0xBCA9], NFC: [0xBCA9], NFD: [0x1107, 0x1166, 0x11B0], NFKC: [0xBCA9], NFKD: [0x1107, 0x1166, 0x11B0] }, +{ source: [0xBCAA], NFC: [0xBCAA], NFD: [0x1107, 0x1166, 0x11B1], NFKC: [0xBCAA], NFKD: [0x1107, 0x1166, 0x11B1] }, +{ source: [0xBCAB], NFC: [0xBCAB], NFD: [0x1107, 0x1166, 0x11B2], NFKC: [0xBCAB], NFKD: [0x1107, 0x1166, 0x11B2] }, +{ source: [0xBCAC], NFC: [0xBCAC], NFD: [0x1107, 0x1166, 0x11B3], NFKC: [0xBCAC], NFKD: [0x1107, 0x1166, 0x11B3] }, +{ source: [0xBCAD], NFC: [0xBCAD], NFD: [0x1107, 0x1166, 0x11B4], NFKC: [0xBCAD], NFKD: [0x1107, 0x1166, 0x11B4] }, +{ source: [0xBCAE], NFC: [0xBCAE], NFD: [0x1107, 0x1166, 0x11B5], NFKC: [0xBCAE], NFKD: [0x1107, 0x1166, 0x11B5] }, +{ source: [0xBCAF], NFC: [0xBCAF], NFD: [0x1107, 0x1166, 0x11B6], NFKC: [0xBCAF], NFKD: [0x1107, 0x1166, 0x11B6] }, +{ source: [0xBCB0], NFC: [0xBCB0], NFD: [0x1107, 0x1166, 0x11B7], NFKC: [0xBCB0], NFKD: [0x1107, 0x1166, 0x11B7] }, +{ source: [0xBCB1], NFC: [0xBCB1], NFD: [0x1107, 0x1166, 0x11B8], NFKC: [0xBCB1], NFKD: [0x1107, 0x1166, 0x11B8] }, +{ source: [0xBCB2], NFC: [0xBCB2], NFD: [0x1107, 0x1166, 0x11B9], NFKC: [0xBCB2], NFKD: [0x1107, 0x1166, 0x11B9] }, +{ source: [0xBCB3], NFC: [0xBCB3], NFD: [0x1107, 0x1166, 0x11BA], NFKC: [0xBCB3], NFKD: [0x1107, 0x1166, 0x11BA] }, +{ source: [0xBCB4], NFC: [0xBCB4], NFD: [0x1107, 0x1166, 0x11BB], NFKC: [0xBCB4], NFKD: [0x1107, 0x1166, 0x11BB] }, +{ source: [0xBCB5], NFC: [0xBCB5], NFD: [0x1107, 0x1166, 0x11BC], NFKC: [0xBCB5], NFKD: [0x1107, 0x1166, 0x11BC] }, +{ source: [0xBCB6], NFC: [0xBCB6], NFD: [0x1107, 0x1166, 0x11BD], NFKC: [0xBCB6], NFKD: [0x1107, 0x1166, 0x11BD] }, +{ source: [0xBCB7], NFC: [0xBCB7], NFD: [0x1107, 0x1166, 0x11BE], NFKC: [0xBCB7], NFKD: [0x1107, 0x1166, 0x11BE] }, +{ source: [0xBCB8], NFC: [0xBCB8], NFD: [0x1107, 0x1166, 0x11BF], NFKC: [0xBCB8], NFKD: [0x1107, 0x1166, 0x11BF] }, +{ source: [0xBCB9], NFC: [0xBCB9], NFD: [0x1107, 0x1166, 0x11C0], NFKC: [0xBCB9], NFKD: [0x1107, 0x1166, 0x11C0] }, +{ source: [0xBCBA], NFC: [0xBCBA], NFD: [0x1107, 0x1166, 0x11C1], NFKC: [0xBCBA], NFKD: [0x1107, 0x1166, 0x11C1] }, +{ source: [0xBCBB], NFC: [0xBCBB], NFD: [0x1107, 0x1166, 0x11C2], NFKC: [0xBCBB], NFKD: [0x1107, 0x1166, 0x11C2] }, +{ source: [0xBCBC], NFC: [0xBCBC], NFD: [0x1107, 0x1167], NFKC: [0xBCBC], NFKD: [0x1107, 0x1167] }, +{ source: [0xBCBD], NFC: [0xBCBD], NFD: [0x1107, 0x1167, 0x11A8], NFKC: [0xBCBD], NFKD: [0x1107, 0x1167, 0x11A8] }, +{ source: [0xBCBE], NFC: [0xBCBE], NFD: [0x1107, 0x1167, 0x11A9], NFKC: [0xBCBE], NFKD: [0x1107, 0x1167, 0x11A9] }, +{ source: [0xBCBF], NFC: [0xBCBF], NFD: [0x1107, 0x1167, 0x11AA], NFKC: [0xBCBF], NFKD: [0x1107, 0x1167, 0x11AA] }, +{ source: [0xBCC0], NFC: [0xBCC0], NFD: [0x1107, 0x1167, 0x11AB], NFKC: [0xBCC0], NFKD: [0x1107, 0x1167, 0x11AB] }, +{ source: [0xBCC1], NFC: [0xBCC1], NFD: [0x1107, 0x1167, 0x11AC], NFKC: [0xBCC1], NFKD: [0x1107, 0x1167, 0x11AC] }, +{ source: [0xBCC2], NFC: [0xBCC2], NFD: [0x1107, 0x1167, 0x11AD], NFKC: [0xBCC2], NFKD: [0x1107, 0x1167, 0x11AD] }, +{ source: [0xBCC3], NFC: [0xBCC3], NFD: [0x1107, 0x1167, 0x11AE], NFKC: [0xBCC3], NFKD: [0x1107, 0x1167, 0x11AE] }, +{ source: [0xBCC4], NFC: [0xBCC4], NFD: [0x1107, 0x1167, 0x11AF], NFKC: [0xBCC4], NFKD: [0x1107, 0x1167, 0x11AF] }, +{ source: [0xBCC5], NFC: [0xBCC5], NFD: [0x1107, 0x1167, 0x11B0], NFKC: [0xBCC5], NFKD: [0x1107, 0x1167, 0x11B0] }, +{ source: [0xBCC6], NFC: [0xBCC6], NFD: [0x1107, 0x1167, 0x11B1], NFKC: [0xBCC6], NFKD: [0x1107, 0x1167, 0x11B1] }, +{ source: [0xBCC7], NFC: [0xBCC7], NFD: [0x1107, 0x1167, 0x11B2], NFKC: [0xBCC7], NFKD: [0x1107, 0x1167, 0x11B2] }, +{ source: [0xBCC8], NFC: [0xBCC8], NFD: [0x1107, 0x1167, 0x11B3], NFKC: [0xBCC8], NFKD: [0x1107, 0x1167, 0x11B3] }, +{ source: [0xBCC9], NFC: [0xBCC9], NFD: [0x1107, 0x1167, 0x11B4], NFKC: [0xBCC9], NFKD: [0x1107, 0x1167, 0x11B4] }, +{ source: [0xBCCA], NFC: [0xBCCA], NFD: [0x1107, 0x1167, 0x11B5], NFKC: [0xBCCA], NFKD: [0x1107, 0x1167, 0x11B5] }, +{ source: [0xBCCB], NFC: [0xBCCB], NFD: [0x1107, 0x1167, 0x11B6], NFKC: [0xBCCB], NFKD: [0x1107, 0x1167, 0x11B6] }, +{ source: [0xBCCC], NFC: [0xBCCC], NFD: [0x1107, 0x1167, 0x11B7], NFKC: [0xBCCC], NFKD: [0x1107, 0x1167, 0x11B7] }, +{ source: [0xBCCD], NFC: [0xBCCD], NFD: [0x1107, 0x1167, 0x11B8], NFKC: [0xBCCD], NFKD: [0x1107, 0x1167, 0x11B8] }, +{ source: [0xBCCE], NFC: [0xBCCE], NFD: [0x1107, 0x1167, 0x11B9], NFKC: [0xBCCE], NFKD: [0x1107, 0x1167, 0x11B9] }, +{ source: [0xBCCF], NFC: [0xBCCF], NFD: [0x1107, 0x1167, 0x11BA], NFKC: [0xBCCF], NFKD: [0x1107, 0x1167, 0x11BA] }, +{ source: [0xBCD0], NFC: [0xBCD0], NFD: [0x1107, 0x1167, 0x11BB], NFKC: [0xBCD0], NFKD: [0x1107, 0x1167, 0x11BB] }, +{ source: [0xBCD1], NFC: [0xBCD1], NFD: [0x1107, 0x1167, 0x11BC], NFKC: [0xBCD1], NFKD: [0x1107, 0x1167, 0x11BC] }, +{ source: [0xBCD2], NFC: [0xBCD2], NFD: [0x1107, 0x1167, 0x11BD], NFKC: [0xBCD2], NFKD: [0x1107, 0x1167, 0x11BD] }, +{ source: [0xBCD3], NFC: [0xBCD3], NFD: [0x1107, 0x1167, 0x11BE], NFKC: [0xBCD3], NFKD: [0x1107, 0x1167, 0x11BE] }, +{ source: [0xBCD4], NFC: [0xBCD4], NFD: [0x1107, 0x1167, 0x11BF], NFKC: [0xBCD4], NFKD: [0x1107, 0x1167, 0x11BF] }, +{ source: [0xBCD5], NFC: [0xBCD5], NFD: [0x1107, 0x1167, 0x11C0], NFKC: [0xBCD5], NFKD: [0x1107, 0x1167, 0x11C0] }, +{ source: [0xBCD6], NFC: [0xBCD6], NFD: [0x1107, 0x1167, 0x11C1], NFKC: [0xBCD6], NFKD: [0x1107, 0x1167, 0x11C1] }, +{ source: [0xBCD7], NFC: [0xBCD7], NFD: [0x1107, 0x1167, 0x11C2], NFKC: [0xBCD7], NFKD: [0x1107, 0x1167, 0x11C2] }, +{ source: [0xBCD8], NFC: [0xBCD8], NFD: [0x1107, 0x1168], NFKC: [0xBCD8], NFKD: [0x1107, 0x1168] }, +{ source: [0xBCD9], NFC: [0xBCD9], NFD: [0x1107, 0x1168, 0x11A8], NFKC: [0xBCD9], NFKD: [0x1107, 0x1168, 0x11A8] }, +{ source: [0xBCDA], NFC: [0xBCDA], NFD: [0x1107, 0x1168, 0x11A9], NFKC: [0xBCDA], NFKD: [0x1107, 0x1168, 0x11A9] }, +{ source: [0xBCDB], NFC: [0xBCDB], NFD: [0x1107, 0x1168, 0x11AA], NFKC: [0xBCDB], NFKD: [0x1107, 0x1168, 0x11AA] }, +{ source: [0xBCDC], NFC: [0xBCDC], NFD: [0x1107, 0x1168, 0x11AB], NFKC: [0xBCDC], NFKD: [0x1107, 0x1168, 0x11AB] }, +{ source: [0xBCDD], NFC: [0xBCDD], NFD: [0x1107, 0x1168, 0x11AC], NFKC: [0xBCDD], NFKD: [0x1107, 0x1168, 0x11AC] }, +{ source: [0xBCDE], NFC: [0xBCDE], NFD: [0x1107, 0x1168, 0x11AD], NFKC: [0xBCDE], NFKD: [0x1107, 0x1168, 0x11AD] }, +{ source: [0xBCDF], NFC: [0xBCDF], NFD: [0x1107, 0x1168, 0x11AE], NFKC: [0xBCDF], NFKD: [0x1107, 0x1168, 0x11AE] }, +{ source: [0xBCE0], NFC: [0xBCE0], NFD: [0x1107, 0x1168, 0x11AF], NFKC: [0xBCE0], NFKD: [0x1107, 0x1168, 0x11AF] }, +{ source: [0xBCE1], NFC: [0xBCE1], NFD: [0x1107, 0x1168, 0x11B0], NFKC: [0xBCE1], NFKD: [0x1107, 0x1168, 0x11B0] }, +{ source: [0xBCE2], NFC: [0xBCE2], NFD: [0x1107, 0x1168, 0x11B1], NFKC: [0xBCE2], NFKD: [0x1107, 0x1168, 0x11B1] }, +{ source: [0xBCE3], NFC: [0xBCE3], NFD: [0x1107, 0x1168, 0x11B2], NFKC: [0xBCE3], NFKD: [0x1107, 0x1168, 0x11B2] }, +{ source: [0xBCE4], NFC: [0xBCE4], NFD: [0x1107, 0x1168, 0x11B3], NFKC: [0xBCE4], NFKD: [0x1107, 0x1168, 0x11B3] }, +{ source: [0xBCE5], NFC: [0xBCE5], NFD: [0x1107, 0x1168, 0x11B4], NFKC: [0xBCE5], NFKD: [0x1107, 0x1168, 0x11B4] }, +{ source: [0xBCE6], NFC: [0xBCE6], NFD: [0x1107, 0x1168, 0x11B5], NFKC: [0xBCE6], NFKD: [0x1107, 0x1168, 0x11B5] }, +{ source: [0xBCE7], NFC: [0xBCE7], NFD: [0x1107, 0x1168, 0x11B6], NFKC: [0xBCE7], NFKD: [0x1107, 0x1168, 0x11B6] }, +{ source: [0xBCE8], NFC: [0xBCE8], NFD: [0x1107, 0x1168, 0x11B7], NFKC: [0xBCE8], NFKD: [0x1107, 0x1168, 0x11B7] }, +{ source: [0xBCE9], NFC: [0xBCE9], NFD: [0x1107, 0x1168, 0x11B8], NFKC: [0xBCE9], NFKD: [0x1107, 0x1168, 0x11B8] }, +{ source: [0xBCEA], NFC: [0xBCEA], NFD: [0x1107, 0x1168, 0x11B9], NFKC: [0xBCEA], NFKD: [0x1107, 0x1168, 0x11B9] }, +{ source: [0xBCEB], NFC: [0xBCEB], NFD: [0x1107, 0x1168, 0x11BA], NFKC: [0xBCEB], NFKD: [0x1107, 0x1168, 0x11BA] }, +{ source: [0xBCEC], NFC: [0xBCEC], NFD: [0x1107, 0x1168, 0x11BB], NFKC: [0xBCEC], NFKD: [0x1107, 0x1168, 0x11BB] }, +{ source: [0xBCED], NFC: [0xBCED], NFD: [0x1107, 0x1168, 0x11BC], NFKC: [0xBCED], NFKD: [0x1107, 0x1168, 0x11BC] }, +{ source: [0xBCEE], NFC: [0xBCEE], NFD: [0x1107, 0x1168, 0x11BD], NFKC: [0xBCEE], NFKD: [0x1107, 0x1168, 0x11BD] }, +{ source: [0xBCEF], NFC: [0xBCEF], NFD: [0x1107, 0x1168, 0x11BE], NFKC: [0xBCEF], NFKD: [0x1107, 0x1168, 0x11BE] }, +{ source: [0xBCF0], NFC: [0xBCF0], NFD: [0x1107, 0x1168, 0x11BF], NFKC: [0xBCF0], NFKD: [0x1107, 0x1168, 0x11BF] }, +{ source: [0xBCF1], NFC: [0xBCF1], NFD: [0x1107, 0x1168, 0x11C0], NFKC: [0xBCF1], NFKD: [0x1107, 0x1168, 0x11C0] }, +{ source: [0xBCF2], NFC: [0xBCF2], NFD: [0x1107, 0x1168, 0x11C1], NFKC: [0xBCF2], NFKD: [0x1107, 0x1168, 0x11C1] }, +{ source: [0xBCF3], NFC: [0xBCF3], NFD: [0x1107, 0x1168, 0x11C2], NFKC: [0xBCF3], NFKD: [0x1107, 0x1168, 0x11C2] }, +{ source: [0xBCF4], NFC: [0xBCF4], NFD: [0x1107, 0x1169], NFKC: [0xBCF4], NFKD: [0x1107, 0x1169] }, +{ source: [0xBCF5], NFC: [0xBCF5], NFD: [0x1107, 0x1169, 0x11A8], NFKC: [0xBCF5], NFKD: [0x1107, 0x1169, 0x11A8] }, +{ source: [0xBCF6], NFC: [0xBCF6], NFD: [0x1107, 0x1169, 0x11A9], NFKC: [0xBCF6], NFKD: [0x1107, 0x1169, 0x11A9] }, +{ source: [0xBCF7], NFC: [0xBCF7], NFD: [0x1107, 0x1169, 0x11AA], NFKC: [0xBCF7], NFKD: [0x1107, 0x1169, 0x11AA] }, +{ source: [0xBCF8], NFC: [0xBCF8], NFD: [0x1107, 0x1169, 0x11AB], NFKC: [0xBCF8], NFKD: [0x1107, 0x1169, 0x11AB] }, +{ source: [0xBCF9], NFC: [0xBCF9], NFD: [0x1107, 0x1169, 0x11AC], NFKC: [0xBCF9], NFKD: [0x1107, 0x1169, 0x11AC] }, +{ source: [0xBCFA], NFC: [0xBCFA], NFD: [0x1107, 0x1169, 0x11AD], NFKC: [0xBCFA], NFKD: [0x1107, 0x1169, 0x11AD] }, +{ source: [0xBCFB], NFC: [0xBCFB], NFD: [0x1107, 0x1169, 0x11AE], NFKC: [0xBCFB], NFKD: [0x1107, 0x1169, 0x11AE] }, +{ source: [0xBCFC], NFC: [0xBCFC], NFD: [0x1107, 0x1169, 0x11AF], NFKC: [0xBCFC], NFKD: [0x1107, 0x1169, 0x11AF] }, +{ source: [0xBCFD], NFC: [0xBCFD], NFD: [0x1107, 0x1169, 0x11B0], NFKC: [0xBCFD], NFKD: [0x1107, 0x1169, 0x11B0] }, +{ source: [0xBCFE], NFC: [0xBCFE], NFD: [0x1107, 0x1169, 0x11B1], NFKC: [0xBCFE], NFKD: [0x1107, 0x1169, 0x11B1] }, +{ source: [0xBCFF], NFC: [0xBCFF], NFD: [0x1107, 0x1169, 0x11B2], NFKC: [0xBCFF], NFKD: [0x1107, 0x1169, 0x11B2] }, +{ source: [0xBD00], NFC: [0xBD00], NFD: [0x1107, 0x1169, 0x11B3], NFKC: [0xBD00], NFKD: [0x1107, 0x1169, 0x11B3] }, +{ source: [0xBD01], NFC: [0xBD01], NFD: [0x1107, 0x1169, 0x11B4], NFKC: [0xBD01], NFKD: [0x1107, 0x1169, 0x11B4] }, +{ source: [0xBD02], NFC: [0xBD02], NFD: [0x1107, 0x1169, 0x11B5], NFKC: [0xBD02], NFKD: [0x1107, 0x1169, 0x11B5] }, +{ source: [0xBD03], NFC: [0xBD03], NFD: [0x1107, 0x1169, 0x11B6], NFKC: [0xBD03], NFKD: [0x1107, 0x1169, 0x11B6] }, +{ source: [0xBD04], NFC: [0xBD04], NFD: [0x1107, 0x1169, 0x11B7], NFKC: [0xBD04], NFKD: [0x1107, 0x1169, 0x11B7] }, +{ source: [0xBD05], NFC: [0xBD05], NFD: [0x1107, 0x1169, 0x11B8], NFKC: [0xBD05], NFKD: [0x1107, 0x1169, 0x11B8] }, +{ source: [0xBD06], NFC: [0xBD06], NFD: [0x1107, 0x1169, 0x11B9], NFKC: [0xBD06], NFKD: [0x1107, 0x1169, 0x11B9] }, +{ source: [0xBD07], NFC: [0xBD07], NFD: [0x1107, 0x1169, 0x11BA], NFKC: [0xBD07], NFKD: [0x1107, 0x1169, 0x11BA] }, +{ source: [0xBD08], NFC: [0xBD08], NFD: [0x1107, 0x1169, 0x11BB], NFKC: [0xBD08], NFKD: [0x1107, 0x1169, 0x11BB] }, +{ source: [0xBD09], NFC: [0xBD09], NFD: [0x1107, 0x1169, 0x11BC], NFKC: [0xBD09], NFKD: [0x1107, 0x1169, 0x11BC] }, +{ source: [0xBD0A], NFC: [0xBD0A], NFD: [0x1107, 0x1169, 0x11BD], NFKC: [0xBD0A], NFKD: [0x1107, 0x1169, 0x11BD] }, +{ source: [0xBD0B], NFC: [0xBD0B], NFD: [0x1107, 0x1169, 0x11BE], NFKC: [0xBD0B], NFKD: [0x1107, 0x1169, 0x11BE] }, +{ source: [0xBD0C], NFC: [0xBD0C], NFD: [0x1107, 0x1169, 0x11BF], NFKC: [0xBD0C], NFKD: [0x1107, 0x1169, 0x11BF] }, +{ source: [0xBD0D], NFC: [0xBD0D], NFD: [0x1107, 0x1169, 0x11C0], NFKC: [0xBD0D], NFKD: [0x1107, 0x1169, 0x11C0] }, +{ source: [0xBD0E], NFC: [0xBD0E], NFD: [0x1107, 0x1169, 0x11C1], NFKC: [0xBD0E], NFKD: [0x1107, 0x1169, 0x11C1] }, +{ source: [0xBD0F], NFC: [0xBD0F], NFD: [0x1107, 0x1169, 0x11C2], NFKC: [0xBD0F], NFKD: [0x1107, 0x1169, 0x11C2] }, +{ source: [0xBD10], NFC: [0xBD10], NFD: [0x1107, 0x116A], NFKC: [0xBD10], NFKD: [0x1107, 0x116A] }, +{ source: [0xBD11], NFC: [0xBD11], NFD: [0x1107, 0x116A, 0x11A8], NFKC: [0xBD11], NFKD: [0x1107, 0x116A, 0x11A8] }, +{ source: [0xBD12], NFC: [0xBD12], NFD: [0x1107, 0x116A, 0x11A9], NFKC: [0xBD12], NFKD: [0x1107, 0x116A, 0x11A9] }, +{ source: [0xBD13], NFC: [0xBD13], NFD: [0x1107, 0x116A, 0x11AA], NFKC: [0xBD13], NFKD: [0x1107, 0x116A, 0x11AA] }, +{ source: [0xBD14], NFC: [0xBD14], NFD: [0x1107, 0x116A, 0x11AB], NFKC: [0xBD14], NFKD: [0x1107, 0x116A, 0x11AB] }, +{ source: [0xBD15], NFC: [0xBD15], NFD: [0x1107, 0x116A, 0x11AC], NFKC: [0xBD15], NFKD: [0x1107, 0x116A, 0x11AC] }, +{ source: [0xBD16], NFC: [0xBD16], NFD: [0x1107, 0x116A, 0x11AD], NFKC: [0xBD16], NFKD: [0x1107, 0x116A, 0x11AD] }, +{ source: [0xBD17], NFC: [0xBD17], NFD: [0x1107, 0x116A, 0x11AE], NFKC: [0xBD17], NFKD: [0x1107, 0x116A, 0x11AE] }, +{ source: [0xBD18], NFC: [0xBD18], NFD: [0x1107, 0x116A, 0x11AF], NFKC: [0xBD18], NFKD: [0x1107, 0x116A, 0x11AF] }, +{ source: [0xBD19], NFC: [0xBD19], NFD: [0x1107, 0x116A, 0x11B0], NFKC: [0xBD19], NFKD: [0x1107, 0x116A, 0x11B0] }, +{ source: [0xBD1A], NFC: [0xBD1A], NFD: [0x1107, 0x116A, 0x11B1], NFKC: [0xBD1A], NFKD: [0x1107, 0x116A, 0x11B1] }, +{ source: [0xBD1B], NFC: [0xBD1B], NFD: [0x1107, 0x116A, 0x11B2], NFKC: [0xBD1B], NFKD: [0x1107, 0x116A, 0x11B2] }, +{ source: [0xBD1C], NFC: [0xBD1C], NFD: [0x1107, 0x116A, 0x11B3], NFKC: [0xBD1C], NFKD: [0x1107, 0x116A, 0x11B3] }, +{ source: [0xBD1D], NFC: [0xBD1D], NFD: [0x1107, 0x116A, 0x11B4], NFKC: [0xBD1D], NFKD: [0x1107, 0x116A, 0x11B4] }, +{ source: [0xBD1E], NFC: [0xBD1E], NFD: [0x1107, 0x116A, 0x11B5], NFKC: [0xBD1E], NFKD: [0x1107, 0x116A, 0x11B5] }, +{ source: [0xBD1F], NFC: [0xBD1F], NFD: [0x1107, 0x116A, 0x11B6], NFKC: [0xBD1F], NFKD: [0x1107, 0x116A, 0x11B6] }, +{ source: [0xBD20], NFC: [0xBD20], NFD: [0x1107, 0x116A, 0x11B7], NFKC: [0xBD20], NFKD: [0x1107, 0x116A, 0x11B7] }, +{ source: [0xBD21], NFC: [0xBD21], NFD: [0x1107, 0x116A, 0x11B8], NFKC: [0xBD21], NFKD: [0x1107, 0x116A, 0x11B8] }, +{ source: [0xBD22], NFC: [0xBD22], NFD: [0x1107, 0x116A, 0x11B9], NFKC: [0xBD22], NFKD: [0x1107, 0x116A, 0x11B9] }, +{ source: [0xBD23], NFC: [0xBD23], NFD: [0x1107, 0x116A, 0x11BA], NFKC: [0xBD23], NFKD: [0x1107, 0x116A, 0x11BA] }, +{ source: [0xBD24], NFC: [0xBD24], NFD: [0x1107, 0x116A, 0x11BB], NFKC: [0xBD24], NFKD: [0x1107, 0x116A, 0x11BB] }, +{ source: [0xBD25], NFC: [0xBD25], NFD: [0x1107, 0x116A, 0x11BC], NFKC: [0xBD25], NFKD: [0x1107, 0x116A, 0x11BC] }, +{ source: [0xBD26], NFC: [0xBD26], NFD: [0x1107, 0x116A, 0x11BD], NFKC: [0xBD26], NFKD: [0x1107, 0x116A, 0x11BD] }, +{ source: [0xBD27], NFC: [0xBD27], NFD: [0x1107, 0x116A, 0x11BE], NFKC: [0xBD27], NFKD: [0x1107, 0x116A, 0x11BE] }, +{ source: [0xBD28], NFC: [0xBD28], NFD: [0x1107, 0x116A, 0x11BF], NFKC: [0xBD28], NFKD: [0x1107, 0x116A, 0x11BF] }, +{ source: [0xBD29], NFC: [0xBD29], NFD: [0x1107, 0x116A, 0x11C0], NFKC: [0xBD29], NFKD: [0x1107, 0x116A, 0x11C0] }, +{ source: [0xBD2A], NFC: [0xBD2A], NFD: [0x1107, 0x116A, 0x11C1], NFKC: [0xBD2A], NFKD: [0x1107, 0x116A, 0x11C1] }, +{ source: [0xBD2B], NFC: [0xBD2B], NFD: [0x1107, 0x116A, 0x11C2], NFKC: [0xBD2B], NFKD: [0x1107, 0x116A, 0x11C2] }, +{ source: [0xBD2C], NFC: [0xBD2C], NFD: [0x1107, 0x116B], NFKC: [0xBD2C], NFKD: [0x1107, 0x116B] }, +{ source: [0xBD2D], NFC: [0xBD2D], NFD: [0x1107, 0x116B, 0x11A8], NFKC: [0xBD2D], NFKD: [0x1107, 0x116B, 0x11A8] }, +{ source: [0xBD2E], NFC: [0xBD2E], NFD: [0x1107, 0x116B, 0x11A9], NFKC: [0xBD2E], NFKD: [0x1107, 0x116B, 0x11A9] }, +{ source: [0xBD2F], NFC: [0xBD2F], NFD: [0x1107, 0x116B, 0x11AA], NFKC: [0xBD2F], NFKD: [0x1107, 0x116B, 0x11AA] }, +{ source: [0xBD30], NFC: [0xBD30], NFD: [0x1107, 0x116B, 0x11AB], NFKC: [0xBD30], NFKD: [0x1107, 0x116B, 0x11AB] }, +{ source: [0xBD31], NFC: [0xBD31], NFD: [0x1107, 0x116B, 0x11AC], NFKC: [0xBD31], NFKD: [0x1107, 0x116B, 0x11AC] }, +{ source: [0xBD32], NFC: [0xBD32], NFD: [0x1107, 0x116B, 0x11AD], NFKC: [0xBD32], NFKD: [0x1107, 0x116B, 0x11AD] }, +{ source: [0xBD33], NFC: [0xBD33], NFD: [0x1107, 0x116B, 0x11AE], NFKC: [0xBD33], NFKD: [0x1107, 0x116B, 0x11AE] }, +{ source: [0xBD34], NFC: [0xBD34], NFD: [0x1107, 0x116B, 0x11AF], NFKC: [0xBD34], NFKD: [0x1107, 0x116B, 0x11AF] }, +{ source: [0xBD35], NFC: [0xBD35], NFD: [0x1107, 0x116B, 0x11B0], NFKC: [0xBD35], NFKD: [0x1107, 0x116B, 0x11B0] }, +{ source: [0xBD36], NFC: [0xBD36], NFD: [0x1107, 0x116B, 0x11B1], NFKC: [0xBD36], NFKD: [0x1107, 0x116B, 0x11B1] }, +{ source: [0xBD37], NFC: [0xBD37], NFD: [0x1107, 0x116B, 0x11B2], NFKC: [0xBD37], NFKD: [0x1107, 0x116B, 0x11B2] }, +{ source: [0xBD38], NFC: [0xBD38], NFD: [0x1107, 0x116B, 0x11B3], NFKC: [0xBD38], NFKD: [0x1107, 0x116B, 0x11B3] }, +{ source: [0xBD39], NFC: [0xBD39], NFD: [0x1107, 0x116B, 0x11B4], NFKC: [0xBD39], NFKD: [0x1107, 0x116B, 0x11B4] }, +{ source: [0xBD3A], NFC: [0xBD3A], NFD: [0x1107, 0x116B, 0x11B5], NFKC: [0xBD3A], NFKD: [0x1107, 0x116B, 0x11B5] }, +{ source: [0xBD3B], NFC: [0xBD3B], NFD: [0x1107, 0x116B, 0x11B6], NFKC: [0xBD3B], NFKD: [0x1107, 0x116B, 0x11B6] }, +{ source: [0xBD3C], NFC: [0xBD3C], NFD: [0x1107, 0x116B, 0x11B7], NFKC: [0xBD3C], NFKD: [0x1107, 0x116B, 0x11B7] }, +{ source: [0xBD3D], NFC: [0xBD3D], NFD: [0x1107, 0x116B, 0x11B8], NFKC: [0xBD3D], NFKD: [0x1107, 0x116B, 0x11B8] }, +{ source: [0xBD3E], NFC: [0xBD3E], NFD: [0x1107, 0x116B, 0x11B9], NFKC: [0xBD3E], NFKD: [0x1107, 0x116B, 0x11B9] }, +{ source: [0xBD3F], NFC: [0xBD3F], NFD: [0x1107, 0x116B, 0x11BA], NFKC: [0xBD3F], NFKD: [0x1107, 0x116B, 0x11BA] }, +{ source: [0xBD40], NFC: [0xBD40], NFD: [0x1107, 0x116B, 0x11BB], NFKC: [0xBD40], NFKD: [0x1107, 0x116B, 0x11BB] }, +{ source: [0xBD41], NFC: [0xBD41], NFD: [0x1107, 0x116B, 0x11BC], NFKC: [0xBD41], NFKD: [0x1107, 0x116B, 0x11BC] }, +{ source: [0xBD42], NFC: [0xBD42], NFD: [0x1107, 0x116B, 0x11BD], NFKC: [0xBD42], NFKD: [0x1107, 0x116B, 0x11BD] }, +{ source: [0xBD43], NFC: [0xBD43], NFD: [0x1107, 0x116B, 0x11BE], NFKC: [0xBD43], NFKD: [0x1107, 0x116B, 0x11BE] }, +{ source: [0xBD44], NFC: [0xBD44], NFD: [0x1107, 0x116B, 0x11BF], NFKC: [0xBD44], NFKD: [0x1107, 0x116B, 0x11BF] }, +{ source: [0xBD45], NFC: [0xBD45], NFD: [0x1107, 0x116B, 0x11C0], NFKC: [0xBD45], NFKD: [0x1107, 0x116B, 0x11C0] }, +{ source: [0xBD46], NFC: [0xBD46], NFD: [0x1107, 0x116B, 0x11C1], NFKC: [0xBD46], NFKD: [0x1107, 0x116B, 0x11C1] }, +{ source: [0xBD47], NFC: [0xBD47], NFD: [0x1107, 0x116B, 0x11C2], NFKC: [0xBD47], NFKD: [0x1107, 0x116B, 0x11C2] }, +{ source: [0xBD48], NFC: [0xBD48], NFD: [0x1107, 0x116C], NFKC: [0xBD48], NFKD: [0x1107, 0x116C] }, +{ source: [0xBD49], NFC: [0xBD49], NFD: [0x1107, 0x116C, 0x11A8], NFKC: [0xBD49], NFKD: [0x1107, 0x116C, 0x11A8] }, +{ source: [0xBD4A], NFC: [0xBD4A], NFD: [0x1107, 0x116C, 0x11A9], NFKC: [0xBD4A], NFKD: [0x1107, 0x116C, 0x11A9] }, +{ source: [0xBD4B], NFC: [0xBD4B], NFD: [0x1107, 0x116C, 0x11AA], NFKC: [0xBD4B], NFKD: [0x1107, 0x116C, 0x11AA] }, +{ source: [0xBD4C], NFC: [0xBD4C], NFD: [0x1107, 0x116C, 0x11AB], NFKC: [0xBD4C], NFKD: [0x1107, 0x116C, 0x11AB] }, +{ source: [0xBD4D], NFC: [0xBD4D], NFD: [0x1107, 0x116C, 0x11AC], NFKC: [0xBD4D], NFKD: [0x1107, 0x116C, 0x11AC] }, +{ source: [0xBD4E], NFC: [0xBD4E], NFD: [0x1107, 0x116C, 0x11AD], NFKC: [0xBD4E], NFKD: [0x1107, 0x116C, 0x11AD] }, +{ source: [0xBD4F], NFC: [0xBD4F], NFD: [0x1107, 0x116C, 0x11AE], NFKC: [0xBD4F], NFKD: [0x1107, 0x116C, 0x11AE] }, +{ source: [0xBD50], NFC: [0xBD50], NFD: [0x1107, 0x116C, 0x11AF], NFKC: [0xBD50], NFKD: [0x1107, 0x116C, 0x11AF] }, +{ source: [0xBD51], NFC: [0xBD51], NFD: [0x1107, 0x116C, 0x11B0], NFKC: [0xBD51], NFKD: [0x1107, 0x116C, 0x11B0] }, +{ source: [0xBD52], NFC: [0xBD52], NFD: [0x1107, 0x116C, 0x11B1], NFKC: [0xBD52], NFKD: [0x1107, 0x116C, 0x11B1] }, +{ source: [0xBD53], NFC: [0xBD53], NFD: [0x1107, 0x116C, 0x11B2], NFKC: [0xBD53], NFKD: [0x1107, 0x116C, 0x11B2] }, +{ source: [0xBD54], NFC: [0xBD54], NFD: [0x1107, 0x116C, 0x11B3], NFKC: [0xBD54], NFKD: [0x1107, 0x116C, 0x11B3] }, +{ source: [0xBD55], NFC: [0xBD55], NFD: [0x1107, 0x116C, 0x11B4], NFKC: [0xBD55], NFKD: [0x1107, 0x116C, 0x11B4] }, +{ source: [0xBD56], NFC: [0xBD56], NFD: [0x1107, 0x116C, 0x11B5], NFKC: [0xBD56], NFKD: [0x1107, 0x116C, 0x11B5] }, +{ source: [0xBD57], NFC: [0xBD57], NFD: [0x1107, 0x116C, 0x11B6], NFKC: [0xBD57], NFKD: [0x1107, 0x116C, 0x11B6] }, +{ source: [0xBD58], NFC: [0xBD58], NFD: [0x1107, 0x116C, 0x11B7], NFKC: [0xBD58], NFKD: [0x1107, 0x116C, 0x11B7] }, +{ source: [0xBD59], NFC: [0xBD59], NFD: [0x1107, 0x116C, 0x11B8], NFKC: [0xBD59], NFKD: [0x1107, 0x116C, 0x11B8] }, +{ source: [0xBD5A], NFC: [0xBD5A], NFD: [0x1107, 0x116C, 0x11B9], NFKC: [0xBD5A], NFKD: [0x1107, 0x116C, 0x11B9] }, +{ source: [0xBD5B], NFC: [0xBD5B], NFD: [0x1107, 0x116C, 0x11BA], NFKC: [0xBD5B], NFKD: [0x1107, 0x116C, 0x11BA] }, +{ source: [0xBD5C], NFC: [0xBD5C], NFD: [0x1107, 0x116C, 0x11BB], NFKC: [0xBD5C], NFKD: [0x1107, 0x116C, 0x11BB] }, +{ source: [0xBD5D], NFC: [0xBD5D], NFD: [0x1107, 0x116C, 0x11BC], NFKC: [0xBD5D], NFKD: [0x1107, 0x116C, 0x11BC] }, +{ source: [0xBD5E], NFC: [0xBD5E], NFD: [0x1107, 0x116C, 0x11BD], NFKC: [0xBD5E], NFKD: [0x1107, 0x116C, 0x11BD] }, +{ source: [0xBD5F], NFC: [0xBD5F], NFD: [0x1107, 0x116C, 0x11BE], NFKC: [0xBD5F], NFKD: [0x1107, 0x116C, 0x11BE] }, +{ source: [0xBD60], NFC: [0xBD60], NFD: [0x1107, 0x116C, 0x11BF], NFKC: [0xBD60], NFKD: [0x1107, 0x116C, 0x11BF] }, +{ source: [0xBD61], NFC: [0xBD61], NFD: [0x1107, 0x116C, 0x11C0], NFKC: [0xBD61], NFKD: [0x1107, 0x116C, 0x11C0] }, +{ source: [0xBD62], NFC: [0xBD62], NFD: [0x1107, 0x116C, 0x11C1], NFKC: [0xBD62], NFKD: [0x1107, 0x116C, 0x11C1] }, +{ source: [0xBD63], NFC: [0xBD63], NFD: [0x1107, 0x116C, 0x11C2], NFKC: [0xBD63], NFKD: [0x1107, 0x116C, 0x11C2] }, +{ source: [0xBD64], NFC: [0xBD64], NFD: [0x1107, 0x116D], NFKC: [0xBD64], NFKD: [0x1107, 0x116D] }, +{ source: [0xBD65], NFC: [0xBD65], NFD: [0x1107, 0x116D, 0x11A8], NFKC: [0xBD65], NFKD: [0x1107, 0x116D, 0x11A8] }, +{ source: [0xBD66], NFC: [0xBD66], NFD: [0x1107, 0x116D, 0x11A9], NFKC: [0xBD66], NFKD: [0x1107, 0x116D, 0x11A9] }, +{ source: [0xBD67], NFC: [0xBD67], NFD: [0x1107, 0x116D, 0x11AA], NFKC: [0xBD67], NFKD: [0x1107, 0x116D, 0x11AA] }, +{ source: [0xBD68], NFC: [0xBD68], NFD: [0x1107, 0x116D, 0x11AB], NFKC: [0xBD68], NFKD: [0x1107, 0x116D, 0x11AB] }, +{ source: [0xBD69], NFC: [0xBD69], NFD: [0x1107, 0x116D, 0x11AC], NFKC: [0xBD69], NFKD: [0x1107, 0x116D, 0x11AC] }, +{ source: [0xBD6A], NFC: [0xBD6A], NFD: [0x1107, 0x116D, 0x11AD], NFKC: [0xBD6A], NFKD: [0x1107, 0x116D, 0x11AD] }, +{ source: [0xBD6B], NFC: [0xBD6B], NFD: [0x1107, 0x116D, 0x11AE], NFKC: [0xBD6B], NFKD: [0x1107, 0x116D, 0x11AE] }, +{ source: [0xBD6C], NFC: [0xBD6C], NFD: [0x1107, 0x116D, 0x11AF], NFKC: [0xBD6C], NFKD: [0x1107, 0x116D, 0x11AF] }, +{ source: [0xBD6D], NFC: [0xBD6D], NFD: [0x1107, 0x116D, 0x11B0], NFKC: [0xBD6D], NFKD: [0x1107, 0x116D, 0x11B0] }, +{ source: [0xBD6E], NFC: [0xBD6E], NFD: [0x1107, 0x116D, 0x11B1], NFKC: [0xBD6E], NFKD: [0x1107, 0x116D, 0x11B1] }, +{ source: [0xBD6F], NFC: [0xBD6F], NFD: [0x1107, 0x116D, 0x11B2], NFKC: [0xBD6F], NFKD: [0x1107, 0x116D, 0x11B2] }, +{ source: [0xBD70], NFC: [0xBD70], NFD: [0x1107, 0x116D, 0x11B3], NFKC: [0xBD70], NFKD: [0x1107, 0x116D, 0x11B3] }, +{ source: [0xBD71], NFC: [0xBD71], NFD: [0x1107, 0x116D, 0x11B4], NFKC: [0xBD71], NFKD: [0x1107, 0x116D, 0x11B4] }, +{ source: [0xBD72], NFC: [0xBD72], NFD: [0x1107, 0x116D, 0x11B5], NFKC: [0xBD72], NFKD: [0x1107, 0x116D, 0x11B5] }, +{ source: [0xBD73], NFC: [0xBD73], NFD: [0x1107, 0x116D, 0x11B6], NFKC: [0xBD73], NFKD: [0x1107, 0x116D, 0x11B6] }, +{ source: [0xBD74], NFC: [0xBD74], NFD: [0x1107, 0x116D, 0x11B7], NFKC: [0xBD74], NFKD: [0x1107, 0x116D, 0x11B7] }, +{ source: [0xBD75], NFC: [0xBD75], NFD: [0x1107, 0x116D, 0x11B8], NFKC: [0xBD75], NFKD: [0x1107, 0x116D, 0x11B8] }, +{ source: [0xBD76], NFC: [0xBD76], NFD: [0x1107, 0x116D, 0x11B9], NFKC: [0xBD76], NFKD: [0x1107, 0x116D, 0x11B9] }, +{ source: [0xBD77], NFC: [0xBD77], NFD: [0x1107, 0x116D, 0x11BA], NFKC: [0xBD77], NFKD: [0x1107, 0x116D, 0x11BA] }, +{ source: [0xBD78], NFC: [0xBD78], NFD: [0x1107, 0x116D, 0x11BB], NFKC: [0xBD78], NFKD: [0x1107, 0x116D, 0x11BB] }, +{ source: [0xBD79], NFC: [0xBD79], NFD: [0x1107, 0x116D, 0x11BC], NFKC: [0xBD79], NFKD: [0x1107, 0x116D, 0x11BC] }, +{ source: [0xBD7A], NFC: [0xBD7A], NFD: [0x1107, 0x116D, 0x11BD], NFKC: [0xBD7A], NFKD: [0x1107, 0x116D, 0x11BD] }, +{ source: [0xBD7B], NFC: [0xBD7B], NFD: [0x1107, 0x116D, 0x11BE], NFKC: [0xBD7B], NFKD: [0x1107, 0x116D, 0x11BE] }, +{ source: [0xBD7C], NFC: [0xBD7C], NFD: [0x1107, 0x116D, 0x11BF], NFKC: [0xBD7C], NFKD: [0x1107, 0x116D, 0x11BF] }, +{ source: [0xBD7D], NFC: [0xBD7D], NFD: [0x1107, 0x116D, 0x11C0], NFKC: [0xBD7D], NFKD: [0x1107, 0x116D, 0x11C0] }, +{ source: [0xBD7E], NFC: [0xBD7E], NFD: [0x1107, 0x116D, 0x11C1], NFKC: [0xBD7E], NFKD: [0x1107, 0x116D, 0x11C1] }, +{ source: [0xBD7F], NFC: [0xBD7F], NFD: [0x1107, 0x116D, 0x11C2], NFKC: [0xBD7F], NFKD: [0x1107, 0x116D, 0x11C2] }, +{ source: [0xBD80], NFC: [0xBD80], NFD: [0x1107, 0x116E], NFKC: [0xBD80], NFKD: [0x1107, 0x116E] }, +{ source: [0xBD81], NFC: [0xBD81], NFD: [0x1107, 0x116E, 0x11A8], NFKC: [0xBD81], NFKD: [0x1107, 0x116E, 0x11A8] }, +{ source: [0xBD82], NFC: [0xBD82], NFD: [0x1107, 0x116E, 0x11A9], NFKC: [0xBD82], NFKD: [0x1107, 0x116E, 0x11A9] }, +{ source: [0xBD83], NFC: [0xBD83], NFD: [0x1107, 0x116E, 0x11AA], NFKC: [0xBD83], NFKD: [0x1107, 0x116E, 0x11AA] }, +{ source: [0xBD84], NFC: [0xBD84], NFD: [0x1107, 0x116E, 0x11AB], NFKC: [0xBD84], NFKD: [0x1107, 0x116E, 0x11AB] }, +{ source: [0xBD85], NFC: [0xBD85], NFD: [0x1107, 0x116E, 0x11AC], NFKC: [0xBD85], NFKD: [0x1107, 0x116E, 0x11AC] }, +{ source: [0xBD86], NFC: [0xBD86], NFD: [0x1107, 0x116E, 0x11AD], NFKC: [0xBD86], NFKD: [0x1107, 0x116E, 0x11AD] }, +{ source: [0xBD87], NFC: [0xBD87], NFD: [0x1107, 0x116E, 0x11AE], NFKC: [0xBD87], NFKD: [0x1107, 0x116E, 0x11AE] }, +{ source: [0xBD88], NFC: [0xBD88], NFD: [0x1107, 0x116E, 0x11AF], NFKC: [0xBD88], NFKD: [0x1107, 0x116E, 0x11AF] }, +{ source: [0xBD89], NFC: [0xBD89], NFD: [0x1107, 0x116E, 0x11B0], NFKC: [0xBD89], NFKD: [0x1107, 0x116E, 0x11B0] }, +{ source: [0xBD8A], NFC: [0xBD8A], NFD: [0x1107, 0x116E, 0x11B1], NFKC: [0xBD8A], NFKD: [0x1107, 0x116E, 0x11B1] }, +{ source: [0xBD8B], NFC: [0xBD8B], NFD: [0x1107, 0x116E, 0x11B2], NFKC: [0xBD8B], NFKD: [0x1107, 0x116E, 0x11B2] }, +{ source: [0xBD8C], NFC: [0xBD8C], NFD: [0x1107, 0x116E, 0x11B3], NFKC: [0xBD8C], NFKD: [0x1107, 0x116E, 0x11B3] }, +{ source: [0xBD8D], NFC: [0xBD8D], NFD: [0x1107, 0x116E, 0x11B4], NFKC: [0xBD8D], NFKD: [0x1107, 0x116E, 0x11B4] }, +{ source: [0xBD8E], NFC: [0xBD8E], NFD: [0x1107, 0x116E, 0x11B5], NFKC: [0xBD8E], NFKD: [0x1107, 0x116E, 0x11B5] }, +{ source: [0xBD8F], NFC: [0xBD8F], NFD: [0x1107, 0x116E, 0x11B6], NFKC: [0xBD8F], NFKD: [0x1107, 0x116E, 0x11B6] }, +{ source: [0xBD90], NFC: [0xBD90], NFD: [0x1107, 0x116E, 0x11B7], NFKC: [0xBD90], NFKD: [0x1107, 0x116E, 0x11B7] }, +{ source: [0xBD91], NFC: [0xBD91], NFD: [0x1107, 0x116E, 0x11B8], NFKC: [0xBD91], NFKD: [0x1107, 0x116E, 0x11B8] }, +{ source: [0xBD92], NFC: [0xBD92], NFD: [0x1107, 0x116E, 0x11B9], NFKC: [0xBD92], NFKD: [0x1107, 0x116E, 0x11B9] }, +{ source: [0xBD93], NFC: [0xBD93], NFD: [0x1107, 0x116E, 0x11BA], NFKC: [0xBD93], NFKD: [0x1107, 0x116E, 0x11BA] }, +{ source: [0xBD94], NFC: [0xBD94], NFD: [0x1107, 0x116E, 0x11BB], NFKC: [0xBD94], NFKD: [0x1107, 0x116E, 0x11BB] }, +{ source: [0xBD95], NFC: [0xBD95], NFD: [0x1107, 0x116E, 0x11BC], NFKC: [0xBD95], NFKD: [0x1107, 0x116E, 0x11BC] }, +{ source: [0xBD96], NFC: [0xBD96], NFD: [0x1107, 0x116E, 0x11BD], NFKC: [0xBD96], NFKD: [0x1107, 0x116E, 0x11BD] }, +{ source: [0xBD97], NFC: [0xBD97], NFD: [0x1107, 0x116E, 0x11BE], NFKC: [0xBD97], NFKD: [0x1107, 0x116E, 0x11BE] }, +{ source: [0xBD98], NFC: [0xBD98], NFD: [0x1107, 0x116E, 0x11BF], NFKC: [0xBD98], NFKD: [0x1107, 0x116E, 0x11BF] }, +{ source: [0xBD99], NFC: [0xBD99], NFD: [0x1107, 0x116E, 0x11C0], NFKC: [0xBD99], NFKD: [0x1107, 0x116E, 0x11C0] }, +{ source: [0xBD9A], NFC: [0xBD9A], NFD: [0x1107, 0x116E, 0x11C1], NFKC: [0xBD9A], NFKD: [0x1107, 0x116E, 0x11C1] }, +{ source: [0xBD9B], NFC: [0xBD9B], NFD: [0x1107, 0x116E, 0x11C2], NFKC: [0xBD9B], NFKD: [0x1107, 0x116E, 0x11C2] }, +{ source: [0xBD9C], NFC: [0xBD9C], NFD: [0x1107, 0x116F], NFKC: [0xBD9C], NFKD: [0x1107, 0x116F] }, +{ source: [0xBD9D], NFC: [0xBD9D], NFD: [0x1107, 0x116F, 0x11A8], NFKC: [0xBD9D], NFKD: [0x1107, 0x116F, 0x11A8] }, +{ source: [0xBD9E], NFC: [0xBD9E], NFD: [0x1107, 0x116F, 0x11A9], NFKC: [0xBD9E], NFKD: [0x1107, 0x116F, 0x11A9] }, +{ source: [0xBD9F], NFC: [0xBD9F], NFD: [0x1107, 0x116F, 0x11AA], NFKC: [0xBD9F], NFKD: [0x1107, 0x116F, 0x11AA] }, +{ source: [0xBDA0], NFC: [0xBDA0], NFD: [0x1107, 0x116F, 0x11AB], NFKC: [0xBDA0], NFKD: [0x1107, 0x116F, 0x11AB] }, +{ source: [0xBDA1], NFC: [0xBDA1], NFD: [0x1107, 0x116F, 0x11AC], NFKC: [0xBDA1], NFKD: [0x1107, 0x116F, 0x11AC] }, +{ source: [0xBDA2], NFC: [0xBDA2], NFD: [0x1107, 0x116F, 0x11AD], NFKC: [0xBDA2], NFKD: [0x1107, 0x116F, 0x11AD] }, +{ source: [0xBDA3], NFC: [0xBDA3], NFD: [0x1107, 0x116F, 0x11AE], NFKC: [0xBDA3], NFKD: [0x1107, 0x116F, 0x11AE] }, +{ source: [0xBDA4], NFC: [0xBDA4], NFD: [0x1107, 0x116F, 0x11AF], NFKC: [0xBDA4], NFKD: [0x1107, 0x116F, 0x11AF] }, +{ source: [0xBDA5], NFC: [0xBDA5], NFD: [0x1107, 0x116F, 0x11B0], NFKC: [0xBDA5], NFKD: [0x1107, 0x116F, 0x11B0] }, +{ source: [0xBDA6], NFC: [0xBDA6], NFD: [0x1107, 0x116F, 0x11B1], NFKC: [0xBDA6], NFKD: [0x1107, 0x116F, 0x11B1] }, +{ source: [0xBDA7], NFC: [0xBDA7], NFD: [0x1107, 0x116F, 0x11B2], NFKC: [0xBDA7], NFKD: [0x1107, 0x116F, 0x11B2] }, +{ source: [0xBDA8], NFC: [0xBDA8], NFD: [0x1107, 0x116F, 0x11B3], NFKC: [0xBDA8], NFKD: [0x1107, 0x116F, 0x11B3] }, +{ source: [0xBDA9], NFC: [0xBDA9], NFD: [0x1107, 0x116F, 0x11B4], NFKC: [0xBDA9], NFKD: [0x1107, 0x116F, 0x11B4] }, +{ source: [0xBDAA], NFC: [0xBDAA], NFD: [0x1107, 0x116F, 0x11B5], NFKC: [0xBDAA], NFKD: [0x1107, 0x116F, 0x11B5] }, +{ source: [0xBDAB], NFC: [0xBDAB], NFD: [0x1107, 0x116F, 0x11B6], NFKC: [0xBDAB], NFKD: [0x1107, 0x116F, 0x11B6] }, +{ source: [0xBDAC], NFC: [0xBDAC], NFD: [0x1107, 0x116F, 0x11B7], NFKC: [0xBDAC], NFKD: [0x1107, 0x116F, 0x11B7] }, +{ source: [0xBDAD], NFC: [0xBDAD], NFD: [0x1107, 0x116F, 0x11B8], NFKC: [0xBDAD], NFKD: [0x1107, 0x116F, 0x11B8] }, +{ source: [0xBDAE], NFC: [0xBDAE], NFD: [0x1107, 0x116F, 0x11B9], NFKC: [0xBDAE], NFKD: [0x1107, 0x116F, 0x11B9] }, +{ source: [0xBDAF], NFC: [0xBDAF], NFD: [0x1107, 0x116F, 0x11BA], NFKC: [0xBDAF], NFKD: [0x1107, 0x116F, 0x11BA] }, +{ source: [0xBDB0], NFC: [0xBDB0], NFD: [0x1107, 0x116F, 0x11BB], NFKC: [0xBDB0], NFKD: [0x1107, 0x116F, 0x11BB] }, +{ source: [0xBDB1], NFC: [0xBDB1], NFD: [0x1107, 0x116F, 0x11BC], NFKC: [0xBDB1], NFKD: [0x1107, 0x116F, 0x11BC] }, +{ source: [0xBDB2], NFC: [0xBDB2], NFD: [0x1107, 0x116F, 0x11BD], NFKC: [0xBDB2], NFKD: [0x1107, 0x116F, 0x11BD] }, +{ source: [0xBDB3], NFC: [0xBDB3], NFD: [0x1107, 0x116F, 0x11BE], NFKC: [0xBDB3], NFKD: [0x1107, 0x116F, 0x11BE] }, +{ source: [0xBDB4], NFC: [0xBDB4], NFD: [0x1107, 0x116F, 0x11BF], NFKC: [0xBDB4], NFKD: [0x1107, 0x116F, 0x11BF] }, +{ source: [0xBDB5], NFC: [0xBDB5], NFD: [0x1107, 0x116F, 0x11C0], NFKC: [0xBDB5], NFKD: [0x1107, 0x116F, 0x11C0] }, +{ source: [0xBDB6], NFC: [0xBDB6], NFD: [0x1107, 0x116F, 0x11C1], NFKC: [0xBDB6], NFKD: [0x1107, 0x116F, 0x11C1] }, +{ source: [0xBDB7], NFC: [0xBDB7], NFD: [0x1107, 0x116F, 0x11C2], NFKC: [0xBDB7], NFKD: [0x1107, 0x116F, 0x11C2] }, +{ source: [0xBDB8], NFC: [0xBDB8], NFD: [0x1107, 0x1170], NFKC: [0xBDB8], NFKD: [0x1107, 0x1170] }, +{ source: [0xBDB9], NFC: [0xBDB9], NFD: [0x1107, 0x1170, 0x11A8], NFKC: [0xBDB9], NFKD: [0x1107, 0x1170, 0x11A8] }, +{ source: [0xBDBA], NFC: [0xBDBA], NFD: [0x1107, 0x1170, 0x11A9], NFKC: [0xBDBA], NFKD: [0x1107, 0x1170, 0x11A9] }, +{ source: [0xBDBB], NFC: [0xBDBB], NFD: [0x1107, 0x1170, 0x11AA], NFKC: [0xBDBB], NFKD: [0x1107, 0x1170, 0x11AA] }, +{ source: [0xBDBC], NFC: [0xBDBC], NFD: [0x1107, 0x1170, 0x11AB], NFKC: [0xBDBC], NFKD: [0x1107, 0x1170, 0x11AB] }, +{ source: [0xBDBD], NFC: [0xBDBD], NFD: [0x1107, 0x1170, 0x11AC], NFKC: [0xBDBD], NFKD: [0x1107, 0x1170, 0x11AC] }, +{ source: [0xBDBE], NFC: [0xBDBE], NFD: [0x1107, 0x1170, 0x11AD], NFKC: [0xBDBE], NFKD: [0x1107, 0x1170, 0x11AD] }, +{ source: [0xBDBF], NFC: [0xBDBF], NFD: [0x1107, 0x1170, 0x11AE], NFKC: [0xBDBF], NFKD: [0x1107, 0x1170, 0x11AE] }, +{ source: [0xBDC0], NFC: [0xBDC0], NFD: [0x1107, 0x1170, 0x11AF], NFKC: [0xBDC0], NFKD: [0x1107, 0x1170, 0x11AF] }, +{ source: [0xBDC1], NFC: [0xBDC1], NFD: [0x1107, 0x1170, 0x11B0], NFKC: [0xBDC1], NFKD: [0x1107, 0x1170, 0x11B0] }, +{ source: [0xBDC2], NFC: [0xBDC2], NFD: [0x1107, 0x1170, 0x11B1], NFKC: [0xBDC2], NFKD: [0x1107, 0x1170, 0x11B1] }, +{ source: [0xBDC3], NFC: [0xBDC3], NFD: [0x1107, 0x1170, 0x11B2], NFKC: [0xBDC3], NFKD: [0x1107, 0x1170, 0x11B2] }, +{ source: [0xBDC4], NFC: [0xBDC4], NFD: [0x1107, 0x1170, 0x11B3], NFKC: [0xBDC4], NFKD: [0x1107, 0x1170, 0x11B3] }, +{ source: [0xBDC5], NFC: [0xBDC5], NFD: [0x1107, 0x1170, 0x11B4], NFKC: [0xBDC5], NFKD: [0x1107, 0x1170, 0x11B4] }, +{ source: [0xBDC6], NFC: [0xBDC6], NFD: [0x1107, 0x1170, 0x11B5], NFKC: [0xBDC6], NFKD: [0x1107, 0x1170, 0x11B5] }, +{ source: [0xBDC7], NFC: [0xBDC7], NFD: [0x1107, 0x1170, 0x11B6], NFKC: [0xBDC7], NFKD: [0x1107, 0x1170, 0x11B6] }, +{ source: [0xBDC8], NFC: [0xBDC8], NFD: [0x1107, 0x1170, 0x11B7], NFKC: [0xBDC8], NFKD: [0x1107, 0x1170, 0x11B7] }, +{ source: [0xBDC9], NFC: [0xBDC9], NFD: [0x1107, 0x1170, 0x11B8], NFKC: [0xBDC9], NFKD: [0x1107, 0x1170, 0x11B8] }, +{ source: [0xBDCA], NFC: [0xBDCA], NFD: [0x1107, 0x1170, 0x11B9], NFKC: [0xBDCA], NFKD: [0x1107, 0x1170, 0x11B9] }, +{ source: [0xBDCB], NFC: [0xBDCB], NFD: [0x1107, 0x1170, 0x11BA], NFKC: [0xBDCB], NFKD: [0x1107, 0x1170, 0x11BA] }, +{ source: [0xBDCC], NFC: [0xBDCC], NFD: [0x1107, 0x1170, 0x11BB], NFKC: [0xBDCC], NFKD: [0x1107, 0x1170, 0x11BB] }, +{ source: [0xBDCD], NFC: [0xBDCD], NFD: [0x1107, 0x1170, 0x11BC], NFKC: [0xBDCD], NFKD: [0x1107, 0x1170, 0x11BC] }, +{ source: [0xBDCE], NFC: [0xBDCE], NFD: [0x1107, 0x1170, 0x11BD], NFKC: [0xBDCE], NFKD: [0x1107, 0x1170, 0x11BD] }, +{ source: [0xBDCF], NFC: [0xBDCF], NFD: [0x1107, 0x1170, 0x11BE], NFKC: [0xBDCF], NFKD: [0x1107, 0x1170, 0x11BE] }, +{ source: [0xBDD0], NFC: [0xBDD0], NFD: [0x1107, 0x1170, 0x11BF], NFKC: [0xBDD0], NFKD: [0x1107, 0x1170, 0x11BF] }, +{ source: [0xBDD1], NFC: [0xBDD1], NFD: [0x1107, 0x1170, 0x11C0], NFKC: [0xBDD1], NFKD: [0x1107, 0x1170, 0x11C0] }, +{ source: [0xBDD2], NFC: [0xBDD2], NFD: [0x1107, 0x1170, 0x11C1], NFKC: [0xBDD2], NFKD: [0x1107, 0x1170, 0x11C1] }, +{ source: [0xBDD3], NFC: [0xBDD3], NFD: [0x1107, 0x1170, 0x11C2], NFKC: [0xBDD3], NFKD: [0x1107, 0x1170, 0x11C2] }, +{ source: [0xBDD4], NFC: [0xBDD4], NFD: [0x1107, 0x1171], NFKC: [0xBDD4], NFKD: [0x1107, 0x1171] }, +{ source: [0xBDD5], NFC: [0xBDD5], NFD: [0x1107, 0x1171, 0x11A8], NFKC: [0xBDD5], NFKD: [0x1107, 0x1171, 0x11A8] }, +{ source: [0xBDD6], NFC: [0xBDD6], NFD: [0x1107, 0x1171, 0x11A9], NFKC: [0xBDD6], NFKD: [0x1107, 0x1171, 0x11A9] }, +{ source: [0xBDD7], NFC: [0xBDD7], NFD: [0x1107, 0x1171, 0x11AA], NFKC: [0xBDD7], NFKD: [0x1107, 0x1171, 0x11AA] }, +{ source: [0xBDD8], NFC: [0xBDD8], NFD: [0x1107, 0x1171, 0x11AB], NFKC: [0xBDD8], NFKD: [0x1107, 0x1171, 0x11AB] }, +{ source: [0xBDD9], NFC: [0xBDD9], NFD: [0x1107, 0x1171, 0x11AC], NFKC: [0xBDD9], NFKD: [0x1107, 0x1171, 0x11AC] }, +{ source: [0xBDDA], NFC: [0xBDDA], NFD: [0x1107, 0x1171, 0x11AD], NFKC: [0xBDDA], NFKD: [0x1107, 0x1171, 0x11AD] }, +{ source: [0xBDDB], NFC: [0xBDDB], NFD: [0x1107, 0x1171, 0x11AE], NFKC: [0xBDDB], NFKD: [0x1107, 0x1171, 0x11AE] }, +{ source: [0xBDDC], NFC: [0xBDDC], NFD: [0x1107, 0x1171, 0x11AF], NFKC: [0xBDDC], NFKD: [0x1107, 0x1171, 0x11AF] }, +{ source: [0xBDDD], NFC: [0xBDDD], NFD: [0x1107, 0x1171, 0x11B0], NFKC: [0xBDDD], NFKD: [0x1107, 0x1171, 0x11B0] }, +{ source: [0xBDDE], NFC: [0xBDDE], NFD: [0x1107, 0x1171, 0x11B1], NFKC: [0xBDDE], NFKD: [0x1107, 0x1171, 0x11B1] }, +{ source: [0xBDDF], NFC: [0xBDDF], NFD: [0x1107, 0x1171, 0x11B2], NFKC: [0xBDDF], NFKD: [0x1107, 0x1171, 0x11B2] }, +{ source: [0xBDE0], NFC: [0xBDE0], NFD: [0x1107, 0x1171, 0x11B3], NFKC: [0xBDE0], NFKD: [0x1107, 0x1171, 0x11B3] }, +{ source: [0xBDE1], NFC: [0xBDE1], NFD: [0x1107, 0x1171, 0x11B4], NFKC: [0xBDE1], NFKD: [0x1107, 0x1171, 0x11B4] }, +{ source: [0xBDE2], NFC: [0xBDE2], NFD: [0x1107, 0x1171, 0x11B5], NFKC: [0xBDE2], NFKD: [0x1107, 0x1171, 0x11B5] }, +{ source: [0xBDE3], NFC: [0xBDE3], NFD: [0x1107, 0x1171, 0x11B6], NFKC: [0xBDE3], NFKD: [0x1107, 0x1171, 0x11B6] }, +{ source: [0xBDE4], NFC: [0xBDE4], NFD: [0x1107, 0x1171, 0x11B7], NFKC: [0xBDE4], NFKD: [0x1107, 0x1171, 0x11B7] }, +{ source: [0xBDE5], NFC: [0xBDE5], NFD: [0x1107, 0x1171, 0x11B8], NFKC: [0xBDE5], NFKD: [0x1107, 0x1171, 0x11B8] }, +{ source: [0xBDE6], NFC: [0xBDE6], NFD: [0x1107, 0x1171, 0x11B9], NFKC: [0xBDE6], NFKD: [0x1107, 0x1171, 0x11B9] }, +{ source: [0xBDE7], NFC: [0xBDE7], NFD: [0x1107, 0x1171, 0x11BA], NFKC: [0xBDE7], NFKD: [0x1107, 0x1171, 0x11BA] }, +{ source: [0xBDE8], NFC: [0xBDE8], NFD: [0x1107, 0x1171, 0x11BB], NFKC: [0xBDE8], NFKD: [0x1107, 0x1171, 0x11BB] }, +{ source: [0xBDE9], NFC: [0xBDE9], NFD: [0x1107, 0x1171, 0x11BC], NFKC: [0xBDE9], NFKD: [0x1107, 0x1171, 0x11BC] }, +{ source: [0xBDEA], NFC: [0xBDEA], NFD: [0x1107, 0x1171, 0x11BD], NFKC: [0xBDEA], NFKD: [0x1107, 0x1171, 0x11BD] }, +{ source: [0xBDEB], NFC: [0xBDEB], NFD: [0x1107, 0x1171, 0x11BE], NFKC: [0xBDEB], NFKD: [0x1107, 0x1171, 0x11BE] }, +{ source: [0xBDEC], NFC: [0xBDEC], NFD: [0x1107, 0x1171, 0x11BF], NFKC: [0xBDEC], NFKD: [0x1107, 0x1171, 0x11BF] }, +{ source: [0xBDED], NFC: [0xBDED], NFD: [0x1107, 0x1171, 0x11C0], NFKC: [0xBDED], NFKD: [0x1107, 0x1171, 0x11C0] }, +{ source: [0xBDEE], NFC: [0xBDEE], NFD: [0x1107, 0x1171, 0x11C1], NFKC: [0xBDEE], NFKD: [0x1107, 0x1171, 0x11C1] }, +{ source: [0xBDEF], NFC: [0xBDEF], NFD: [0x1107, 0x1171, 0x11C2], NFKC: [0xBDEF], NFKD: [0x1107, 0x1171, 0x11C2] }, +{ source: [0xBDF0], NFC: [0xBDF0], NFD: [0x1107, 0x1172], NFKC: [0xBDF0], NFKD: [0x1107, 0x1172] }, +{ source: [0xBDF1], NFC: [0xBDF1], NFD: [0x1107, 0x1172, 0x11A8], NFKC: [0xBDF1], NFKD: [0x1107, 0x1172, 0x11A8] }, +{ source: [0xBDF2], NFC: [0xBDF2], NFD: [0x1107, 0x1172, 0x11A9], NFKC: [0xBDF2], NFKD: [0x1107, 0x1172, 0x11A9] }, +{ source: [0xBDF3], NFC: [0xBDF3], NFD: [0x1107, 0x1172, 0x11AA], NFKC: [0xBDF3], NFKD: [0x1107, 0x1172, 0x11AA] }, +{ source: [0xBDF4], NFC: [0xBDF4], NFD: [0x1107, 0x1172, 0x11AB], NFKC: [0xBDF4], NFKD: [0x1107, 0x1172, 0x11AB] }, +{ source: [0xBDF5], NFC: [0xBDF5], NFD: [0x1107, 0x1172, 0x11AC], NFKC: [0xBDF5], NFKD: [0x1107, 0x1172, 0x11AC] }, +{ source: [0xBDF6], NFC: [0xBDF6], NFD: [0x1107, 0x1172, 0x11AD], NFKC: [0xBDF6], NFKD: [0x1107, 0x1172, 0x11AD] }, +{ source: [0xBDF7], NFC: [0xBDF7], NFD: [0x1107, 0x1172, 0x11AE], NFKC: [0xBDF7], NFKD: [0x1107, 0x1172, 0x11AE] }, +{ source: [0xBDF8], NFC: [0xBDF8], NFD: [0x1107, 0x1172, 0x11AF], NFKC: [0xBDF8], NFKD: [0x1107, 0x1172, 0x11AF] }, +{ source: [0xBDF9], NFC: [0xBDF9], NFD: [0x1107, 0x1172, 0x11B0], NFKC: [0xBDF9], NFKD: [0x1107, 0x1172, 0x11B0] }, +{ source: [0xBDFA], NFC: [0xBDFA], NFD: [0x1107, 0x1172, 0x11B1], NFKC: [0xBDFA], NFKD: [0x1107, 0x1172, 0x11B1] }, +{ source: [0xBDFB], NFC: [0xBDFB], NFD: [0x1107, 0x1172, 0x11B2], NFKC: [0xBDFB], NFKD: [0x1107, 0x1172, 0x11B2] }, +{ source: [0xBDFC], NFC: [0xBDFC], NFD: [0x1107, 0x1172, 0x11B3], NFKC: [0xBDFC], NFKD: [0x1107, 0x1172, 0x11B3] }, +{ source: [0xBDFD], NFC: [0xBDFD], NFD: [0x1107, 0x1172, 0x11B4], NFKC: [0xBDFD], NFKD: [0x1107, 0x1172, 0x11B4] }, +{ source: [0xBDFE], NFC: [0xBDFE], NFD: [0x1107, 0x1172, 0x11B5], NFKC: [0xBDFE], NFKD: [0x1107, 0x1172, 0x11B5] }, +{ source: [0xBDFF], NFC: [0xBDFF], NFD: [0x1107, 0x1172, 0x11B6], NFKC: [0xBDFF], NFKD: [0x1107, 0x1172, 0x11B6] }, +{ source: [0xBE00], NFC: [0xBE00], NFD: [0x1107, 0x1172, 0x11B7], NFKC: [0xBE00], NFKD: [0x1107, 0x1172, 0x11B7] }, +{ source: [0xBE01], NFC: [0xBE01], NFD: [0x1107, 0x1172, 0x11B8], NFKC: [0xBE01], NFKD: [0x1107, 0x1172, 0x11B8] }, +{ source: [0xBE02], NFC: [0xBE02], NFD: [0x1107, 0x1172, 0x11B9], NFKC: [0xBE02], NFKD: [0x1107, 0x1172, 0x11B9] }, +{ source: [0xBE03], NFC: [0xBE03], NFD: [0x1107, 0x1172, 0x11BA], NFKC: [0xBE03], NFKD: [0x1107, 0x1172, 0x11BA] }, +{ source: [0xBE04], NFC: [0xBE04], NFD: [0x1107, 0x1172, 0x11BB], NFKC: [0xBE04], NFKD: [0x1107, 0x1172, 0x11BB] }, +{ source: [0xBE05], NFC: [0xBE05], NFD: [0x1107, 0x1172, 0x11BC], NFKC: [0xBE05], NFKD: [0x1107, 0x1172, 0x11BC] }, +{ source: [0xBE06], NFC: [0xBE06], NFD: [0x1107, 0x1172, 0x11BD], NFKC: [0xBE06], NFKD: [0x1107, 0x1172, 0x11BD] }, +{ source: [0xBE07], NFC: [0xBE07], NFD: [0x1107, 0x1172, 0x11BE], NFKC: [0xBE07], NFKD: [0x1107, 0x1172, 0x11BE] }, +{ source: [0xBE08], NFC: [0xBE08], NFD: [0x1107, 0x1172, 0x11BF], NFKC: [0xBE08], NFKD: [0x1107, 0x1172, 0x11BF] }, +{ source: [0xBE09], NFC: [0xBE09], NFD: [0x1107, 0x1172, 0x11C0], NFKC: [0xBE09], NFKD: [0x1107, 0x1172, 0x11C0] }, +{ source: [0xBE0A], NFC: [0xBE0A], NFD: [0x1107, 0x1172, 0x11C1], NFKC: [0xBE0A], NFKD: [0x1107, 0x1172, 0x11C1] }, +{ source: [0xBE0B], NFC: [0xBE0B], NFD: [0x1107, 0x1172, 0x11C2], NFKC: [0xBE0B], NFKD: [0x1107, 0x1172, 0x11C2] }, +{ source: [0xBE0C], NFC: [0xBE0C], NFD: [0x1107, 0x1173], NFKC: [0xBE0C], NFKD: [0x1107, 0x1173] }, +{ source: [0xBE0D], NFC: [0xBE0D], NFD: [0x1107, 0x1173, 0x11A8], NFKC: [0xBE0D], NFKD: [0x1107, 0x1173, 0x11A8] }, +{ source: [0xBE0E], NFC: [0xBE0E], NFD: [0x1107, 0x1173, 0x11A9], NFKC: [0xBE0E], NFKD: [0x1107, 0x1173, 0x11A9] }, +{ source: [0xBE0F], NFC: [0xBE0F], NFD: [0x1107, 0x1173, 0x11AA], NFKC: [0xBE0F], NFKD: [0x1107, 0x1173, 0x11AA] }, +{ source: [0xBE10], NFC: [0xBE10], NFD: [0x1107, 0x1173, 0x11AB], NFKC: [0xBE10], NFKD: [0x1107, 0x1173, 0x11AB] }, +{ source: [0xBE11], NFC: [0xBE11], NFD: [0x1107, 0x1173, 0x11AC], NFKC: [0xBE11], NFKD: [0x1107, 0x1173, 0x11AC] }, +{ source: [0xBE12], NFC: [0xBE12], NFD: [0x1107, 0x1173, 0x11AD], NFKC: [0xBE12], NFKD: [0x1107, 0x1173, 0x11AD] }, +{ source: [0xBE13], NFC: [0xBE13], NFD: [0x1107, 0x1173, 0x11AE], NFKC: [0xBE13], NFKD: [0x1107, 0x1173, 0x11AE] }, +{ source: [0xBE14], NFC: [0xBE14], NFD: [0x1107, 0x1173, 0x11AF], NFKC: [0xBE14], NFKD: [0x1107, 0x1173, 0x11AF] }, +{ source: [0xBE15], NFC: [0xBE15], NFD: [0x1107, 0x1173, 0x11B0], NFKC: [0xBE15], NFKD: [0x1107, 0x1173, 0x11B0] }, +{ source: [0xBE16], NFC: [0xBE16], NFD: [0x1107, 0x1173, 0x11B1], NFKC: [0xBE16], NFKD: [0x1107, 0x1173, 0x11B1] }, +{ source: [0xBE17], NFC: [0xBE17], NFD: [0x1107, 0x1173, 0x11B2], NFKC: [0xBE17], NFKD: [0x1107, 0x1173, 0x11B2] }, +{ source: [0xBE18], NFC: [0xBE18], NFD: [0x1107, 0x1173, 0x11B3], NFKC: [0xBE18], NFKD: [0x1107, 0x1173, 0x11B3] }, +{ source: [0xBE19], NFC: [0xBE19], NFD: [0x1107, 0x1173, 0x11B4], NFKC: [0xBE19], NFKD: [0x1107, 0x1173, 0x11B4] }, +{ source: [0xBE1A], NFC: [0xBE1A], NFD: [0x1107, 0x1173, 0x11B5], NFKC: [0xBE1A], NFKD: [0x1107, 0x1173, 0x11B5] }, +{ source: [0xBE1B], NFC: [0xBE1B], NFD: [0x1107, 0x1173, 0x11B6], NFKC: [0xBE1B], NFKD: [0x1107, 0x1173, 0x11B6] }, +{ source: [0xBE1C], NFC: [0xBE1C], NFD: [0x1107, 0x1173, 0x11B7], NFKC: [0xBE1C], NFKD: [0x1107, 0x1173, 0x11B7] }, +{ source: [0xBE1D], NFC: [0xBE1D], NFD: [0x1107, 0x1173, 0x11B8], NFKC: [0xBE1D], NFKD: [0x1107, 0x1173, 0x11B8] }, +{ source: [0xBE1E], NFC: [0xBE1E], NFD: [0x1107, 0x1173, 0x11B9], NFKC: [0xBE1E], NFKD: [0x1107, 0x1173, 0x11B9] }, +{ source: [0xBE1F], NFC: [0xBE1F], NFD: [0x1107, 0x1173, 0x11BA], NFKC: [0xBE1F], NFKD: [0x1107, 0x1173, 0x11BA] }, +{ source: [0xBE20], NFC: [0xBE20], NFD: [0x1107, 0x1173, 0x11BB], NFKC: [0xBE20], NFKD: [0x1107, 0x1173, 0x11BB] }, +{ source: [0xBE21], NFC: [0xBE21], NFD: [0x1107, 0x1173, 0x11BC], NFKC: [0xBE21], NFKD: [0x1107, 0x1173, 0x11BC] }, +{ source: [0xBE22], NFC: [0xBE22], NFD: [0x1107, 0x1173, 0x11BD], NFKC: [0xBE22], NFKD: [0x1107, 0x1173, 0x11BD] }, +{ source: [0xBE23], NFC: [0xBE23], NFD: [0x1107, 0x1173, 0x11BE], NFKC: [0xBE23], NFKD: [0x1107, 0x1173, 0x11BE] }, +{ source: [0xBE24], NFC: [0xBE24], NFD: [0x1107, 0x1173, 0x11BF], NFKC: [0xBE24], NFKD: [0x1107, 0x1173, 0x11BF] }, +{ source: [0xBE25], NFC: [0xBE25], NFD: [0x1107, 0x1173, 0x11C0], NFKC: [0xBE25], NFKD: [0x1107, 0x1173, 0x11C0] }, +{ source: [0xBE26], NFC: [0xBE26], NFD: [0x1107, 0x1173, 0x11C1], NFKC: [0xBE26], NFKD: [0x1107, 0x1173, 0x11C1] }, +{ source: [0xBE27], NFC: [0xBE27], NFD: [0x1107, 0x1173, 0x11C2], NFKC: [0xBE27], NFKD: [0x1107, 0x1173, 0x11C2] }, +{ source: [0xBE28], NFC: [0xBE28], NFD: [0x1107, 0x1174], NFKC: [0xBE28], NFKD: [0x1107, 0x1174] }, +{ source: [0xBE29], NFC: [0xBE29], NFD: [0x1107, 0x1174, 0x11A8], NFKC: [0xBE29], NFKD: [0x1107, 0x1174, 0x11A8] }, +{ source: [0xBE2A], NFC: [0xBE2A], NFD: [0x1107, 0x1174, 0x11A9], NFKC: [0xBE2A], NFKD: [0x1107, 0x1174, 0x11A9] }, +{ source: [0xBE2B], NFC: [0xBE2B], NFD: [0x1107, 0x1174, 0x11AA], NFKC: [0xBE2B], NFKD: [0x1107, 0x1174, 0x11AA] }, +{ source: [0xBE2C], NFC: [0xBE2C], NFD: [0x1107, 0x1174, 0x11AB], NFKC: [0xBE2C], NFKD: [0x1107, 0x1174, 0x11AB] }, +{ source: [0xBE2D], NFC: [0xBE2D], NFD: [0x1107, 0x1174, 0x11AC], NFKC: [0xBE2D], NFKD: [0x1107, 0x1174, 0x11AC] }, +{ source: [0xBE2E], NFC: [0xBE2E], NFD: [0x1107, 0x1174, 0x11AD], NFKC: [0xBE2E], NFKD: [0x1107, 0x1174, 0x11AD] }, +{ source: [0xBE2F], NFC: [0xBE2F], NFD: [0x1107, 0x1174, 0x11AE], NFKC: [0xBE2F], NFKD: [0x1107, 0x1174, 0x11AE] }, +{ source: [0xBE30], NFC: [0xBE30], NFD: [0x1107, 0x1174, 0x11AF], NFKC: [0xBE30], NFKD: [0x1107, 0x1174, 0x11AF] }, +{ source: [0xBE31], NFC: [0xBE31], NFD: [0x1107, 0x1174, 0x11B0], NFKC: [0xBE31], NFKD: [0x1107, 0x1174, 0x11B0] }, +{ source: [0xBE32], NFC: [0xBE32], NFD: [0x1107, 0x1174, 0x11B1], NFKC: [0xBE32], NFKD: [0x1107, 0x1174, 0x11B1] }, +{ source: [0xBE33], NFC: [0xBE33], NFD: [0x1107, 0x1174, 0x11B2], NFKC: [0xBE33], NFKD: [0x1107, 0x1174, 0x11B2] }, +{ source: [0xBE34], NFC: [0xBE34], NFD: [0x1107, 0x1174, 0x11B3], NFKC: [0xBE34], NFKD: [0x1107, 0x1174, 0x11B3] }, +{ source: [0xBE35], NFC: [0xBE35], NFD: [0x1107, 0x1174, 0x11B4], NFKC: [0xBE35], NFKD: [0x1107, 0x1174, 0x11B4] }, +{ source: [0xBE36], NFC: [0xBE36], NFD: [0x1107, 0x1174, 0x11B5], NFKC: [0xBE36], NFKD: [0x1107, 0x1174, 0x11B5] }, +{ source: [0xBE37], NFC: [0xBE37], NFD: [0x1107, 0x1174, 0x11B6], NFKC: [0xBE37], NFKD: [0x1107, 0x1174, 0x11B6] }, +{ source: [0xBE38], NFC: [0xBE38], NFD: [0x1107, 0x1174, 0x11B7], NFKC: [0xBE38], NFKD: [0x1107, 0x1174, 0x11B7] }, +{ source: [0xBE39], NFC: [0xBE39], NFD: [0x1107, 0x1174, 0x11B8], NFKC: [0xBE39], NFKD: [0x1107, 0x1174, 0x11B8] }, +{ source: [0xBE3A], NFC: [0xBE3A], NFD: [0x1107, 0x1174, 0x11B9], NFKC: [0xBE3A], NFKD: [0x1107, 0x1174, 0x11B9] }, +{ source: [0xBE3B], NFC: [0xBE3B], NFD: [0x1107, 0x1174, 0x11BA], NFKC: [0xBE3B], NFKD: [0x1107, 0x1174, 0x11BA] }, +{ source: [0xBE3C], NFC: [0xBE3C], NFD: [0x1107, 0x1174, 0x11BB], NFKC: [0xBE3C], NFKD: [0x1107, 0x1174, 0x11BB] }, +{ source: [0xBE3D], NFC: [0xBE3D], NFD: [0x1107, 0x1174, 0x11BC], NFKC: [0xBE3D], NFKD: [0x1107, 0x1174, 0x11BC] }, +{ source: [0xBE3E], NFC: [0xBE3E], NFD: [0x1107, 0x1174, 0x11BD], NFKC: [0xBE3E], NFKD: [0x1107, 0x1174, 0x11BD] }, +{ source: [0xBE3F], NFC: [0xBE3F], NFD: [0x1107, 0x1174, 0x11BE], NFKC: [0xBE3F], NFKD: [0x1107, 0x1174, 0x11BE] }, +{ source: [0xBE40], NFC: [0xBE40], NFD: [0x1107, 0x1174, 0x11BF], NFKC: [0xBE40], NFKD: [0x1107, 0x1174, 0x11BF] }, +{ source: [0xBE41], NFC: [0xBE41], NFD: [0x1107, 0x1174, 0x11C0], NFKC: [0xBE41], NFKD: [0x1107, 0x1174, 0x11C0] }, +{ source: [0xBE42], NFC: [0xBE42], NFD: [0x1107, 0x1174, 0x11C1], NFKC: [0xBE42], NFKD: [0x1107, 0x1174, 0x11C1] }, +{ source: [0xBE43], NFC: [0xBE43], NFD: [0x1107, 0x1174, 0x11C2], NFKC: [0xBE43], NFKD: [0x1107, 0x1174, 0x11C2] }, +{ source: [0xBE44], NFC: [0xBE44], NFD: [0x1107, 0x1175], NFKC: [0xBE44], NFKD: [0x1107, 0x1175] }, +{ source: [0xBE45], NFC: [0xBE45], NFD: [0x1107, 0x1175, 0x11A8], NFKC: [0xBE45], NFKD: [0x1107, 0x1175, 0x11A8] }, +{ source: [0xBE46], NFC: [0xBE46], NFD: [0x1107, 0x1175, 0x11A9], NFKC: [0xBE46], NFKD: [0x1107, 0x1175, 0x11A9] }, +{ source: [0xBE47], NFC: [0xBE47], NFD: [0x1107, 0x1175, 0x11AA], NFKC: [0xBE47], NFKD: [0x1107, 0x1175, 0x11AA] }, +{ source: [0xBE48], NFC: [0xBE48], NFD: [0x1107, 0x1175, 0x11AB], NFKC: [0xBE48], NFKD: [0x1107, 0x1175, 0x11AB] }, +{ source: [0xBE49], NFC: [0xBE49], NFD: [0x1107, 0x1175, 0x11AC], NFKC: [0xBE49], NFKD: [0x1107, 0x1175, 0x11AC] }, +{ source: [0xBE4A], NFC: [0xBE4A], NFD: [0x1107, 0x1175, 0x11AD], NFKC: [0xBE4A], NFKD: [0x1107, 0x1175, 0x11AD] }, +{ source: [0xBE4B], NFC: [0xBE4B], NFD: [0x1107, 0x1175, 0x11AE], NFKC: [0xBE4B], NFKD: [0x1107, 0x1175, 0x11AE] }, +{ source: [0xBE4C], NFC: [0xBE4C], NFD: [0x1107, 0x1175, 0x11AF], NFKC: [0xBE4C], NFKD: [0x1107, 0x1175, 0x11AF] }, +{ source: [0xBE4D], NFC: [0xBE4D], NFD: [0x1107, 0x1175, 0x11B0], NFKC: [0xBE4D], NFKD: [0x1107, 0x1175, 0x11B0] }, +{ source: [0xBE4E], NFC: [0xBE4E], NFD: [0x1107, 0x1175, 0x11B1], NFKC: [0xBE4E], NFKD: [0x1107, 0x1175, 0x11B1] }, +{ source: [0xBE4F], NFC: [0xBE4F], NFD: [0x1107, 0x1175, 0x11B2], NFKC: [0xBE4F], NFKD: [0x1107, 0x1175, 0x11B2] }, +{ source: [0xBE50], NFC: [0xBE50], NFD: [0x1107, 0x1175, 0x11B3], NFKC: [0xBE50], NFKD: [0x1107, 0x1175, 0x11B3] }, +{ source: [0xBE51], NFC: [0xBE51], NFD: [0x1107, 0x1175, 0x11B4], NFKC: [0xBE51], NFKD: [0x1107, 0x1175, 0x11B4] }, +{ source: [0xBE52], NFC: [0xBE52], NFD: [0x1107, 0x1175, 0x11B5], NFKC: [0xBE52], NFKD: [0x1107, 0x1175, 0x11B5] }, +{ source: [0xBE53], NFC: [0xBE53], NFD: [0x1107, 0x1175, 0x11B6], NFKC: [0xBE53], NFKD: [0x1107, 0x1175, 0x11B6] }, +{ source: [0xBE54], NFC: [0xBE54], NFD: [0x1107, 0x1175, 0x11B7], NFKC: [0xBE54], NFKD: [0x1107, 0x1175, 0x11B7] }, +{ source: [0xBE55], NFC: [0xBE55], NFD: [0x1107, 0x1175, 0x11B8], NFKC: [0xBE55], NFKD: [0x1107, 0x1175, 0x11B8] }, +{ source: [0xBE56], NFC: [0xBE56], NFD: [0x1107, 0x1175, 0x11B9], NFKC: [0xBE56], NFKD: [0x1107, 0x1175, 0x11B9] }, +{ source: [0xBE57], NFC: [0xBE57], NFD: [0x1107, 0x1175, 0x11BA], NFKC: [0xBE57], NFKD: [0x1107, 0x1175, 0x11BA] }, +{ source: [0xBE58], NFC: [0xBE58], NFD: [0x1107, 0x1175, 0x11BB], NFKC: [0xBE58], NFKD: [0x1107, 0x1175, 0x11BB] }, +{ source: [0xBE59], NFC: [0xBE59], NFD: [0x1107, 0x1175, 0x11BC], NFKC: [0xBE59], NFKD: [0x1107, 0x1175, 0x11BC] }, +{ source: [0xBE5A], NFC: [0xBE5A], NFD: [0x1107, 0x1175, 0x11BD], NFKC: [0xBE5A], NFKD: [0x1107, 0x1175, 0x11BD] }, +{ source: [0xBE5B], NFC: [0xBE5B], NFD: [0x1107, 0x1175, 0x11BE], NFKC: [0xBE5B], NFKD: [0x1107, 0x1175, 0x11BE] }, +{ source: [0xBE5C], NFC: [0xBE5C], NFD: [0x1107, 0x1175, 0x11BF], NFKC: [0xBE5C], NFKD: [0x1107, 0x1175, 0x11BF] }, +{ source: [0xBE5D], NFC: [0xBE5D], NFD: [0x1107, 0x1175, 0x11C0], NFKC: [0xBE5D], NFKD: [0x1107, 0x1175, 0x11C0] }, +{ source: [0xBE5E], NFC: [0xBE5E], NFD: [0x1107, 0x1175, 0x11C1], NFKC: [0xBE5E], NFKD: [0x1107, 0x1175, 0x11C1] }, +{ source: [0xBE5F], NFC: [0xBE5F], NFD: [0x1107, 0x1175, 0x11C2], NFKC: [0xBE5F], NFKD: [0x1107, 0x1175, 0x11C2] }, +{ source: [0xBE60], NFC: [0xBE60], NFD: [0x1108, 0x1161], NFKC: [0xBE60], NFKD: [0x1108, 0x1161] }, +{ source: [0xBE61], NFC: [0xBE61], NFD: [0x1108, 0x1161, 0x11A8], NFKC: [0xBE61], NFKD: [0x1108, 0x1161, 0x11A8] }, +{ source: [0xBE62], NFC: [0xBE62], NFD: [0x1108, 0x1161, 0x11A9], NFKC: [0xBE62], NFKD: [0x1108, 0x1161, 0x11A9] }, +{ source: [0xBE63], NFC: [0xBE63], NFD: [0x1108, 0x1161, 0x11AA], NFKC: [0xBE63], NFKD: [0x1108, 0x1161, 0x11AA] }, +{ source: [0xBE64], NFC: [0xBE64], NFD: [0x1108, 0x1161, 0x11AB], NFKC: [0xBE64], NFKD: [0x1108, 0x1161, 0x11AB] }, +{ source: [0xBE65], NFC: [0xBE65], NFD: [0x1108, 0x1161, 0x11AC], NFKC: [0xBE65], NFKD: [0x1108, 0x1161, 0x11AC] }, +{ source: [0xBE66], NFC: [0xBE66], NFD: [0x1108, 0x1161, 0x11AD], NFKC: [0xBE66], NFKD: [0x1108, 0x1161, 0x11AD] }, +{ source: [0xBE67], NFC: [0xBE67], NFD: [0x1108, 0x1161, 0x11AE], NFKC: [0xBE67], NFKD: [0x1108, 0x1161, 0x11AE] }, +{ source: [0xBE68], NFC: [0xBE68], NFD: [0x1108, 0x1161, 0x11AF], NFKC: [0xBE68], NFKD: [0x1108, 0x1161, 0x11AF] }, +{ source: [0xBE69], NFC: [0xBE69], NFD: [0x1108, 0x1161, 0x11B0], NFKC: [0xBE69], NFKD: [0x1108, 0x1161, 0x11B0] }, +{ source: [0xBE6A], NFC: [0xBE6A], NFD: [0x1108, 0x1161, 0x11B1], NFKC: [0xBE6A], NFKD: [0x1108, 0x1161, 0x11B1] }, +{ source: [0xBE6B], NFC: [0xBE6B], NFD: [0x1108, 0x1161, 0x11B2], NFKC: [0xBE6B], NFKD: [0x1108, 0x1161, 0x11B2] }, +{ source: [0xBE6C], NFC: [0xBE6C], NFD: [0x1108, 0x1161, 0x11B3], NFKC: [0xBE6C], NFKD: [0x1108, 0x1161, 0x11B3] }, +{ source: [0xBE6D], NFC: [0xBE6D], NFD: [0x1108, 0x1161, 0x11B4], NFKC: [0xBE6D], NFKD: [0x1108, 0x1161, 0x11B4] }, +{ source: [0xBE6E], NFC: [0xBE6E], NFD: [0x1108, 0x1161, 0x11B5], NFKC: [0xBE6E], NFKD: [0x1108, 0x1161, 0x11B5] }, +{ source: [0xBE6F], NFC: [0xBE6F], NFD: [0x1108, 0x1161, 0x11B6], NFKC: [0xBE6F], NFKD: [0x1108, 0x1161, 0x11B6] }, +{ source: [0xBE70], NFC: [0xBE70], NFD: [0x1108, 0x1161, 0x11B7], NFKC: [0xBE70], NFKD: [0x1108, 0x1161, 0x11B7] }, +{ source: [0xBE71], NFC: [0xBE71], NFD: [0x1108, 0x1161, 0x11B8], NFKC: [0xBE71], NFKD: [0x1108, 0x1161, 0x11B8] }, +{ source: [0xBE72], NFC: [0xBE72], NFD: [0x1108, 0x1161, 0x11B9], NFKC: [0xBE72], NFKD: [0x1108, 0x1161, 0x11B9] }, +{ source: [0xBE73], NFC: [0xBE73], NFD: [0x1108, 0x1161, 0x11BA], NFKC: [0xBE73], NFKD: [0x1108, 0x1161, 0x11BA] }, +{ source: [0xBE74], NFC: [0xBE74], NFD: [0x1108, 0x1161, 0x11BB], NFKC: [0xBE74], NFKD: [0x1108, 0x1161, 0x11BB] }, +{ source: [0xBE75], NFC: [0xBE75], NFD: [0x1108, 0x1161, 0x11BC], NFKC: [0xBE75], NFKD: [0x1108, 0x1161, 0x11BC] }, +{ source: [0xBE76], NFC: [0xBE76], NFD: [0x1108, 0x1161, 0x11BD], NFKC: [0xBE76], NFKD: [0x1108, 0x1161, 0x11BD] }, +{ source: [0xBE77], NFC: [0xBE77], NFD: [0x1108, 0x1161, 0x11BE], NFKC: [0xBE77], NFKD: [0x1108, 0x1161, 0x11BE] }, +{ source: [0xBE78], NFC: [0xBE78], NFD: [0x1108, 0x1161, 0x11BF], NFKC: [0xBE78], NFKD: [0x1108, 0x1161, 0x11BF] }, +{ source: [0xBE79], NFC: [0xBE79], NFD: [0x1108, 0x1161, 0x11C0], NFKC: [0xBE79], NFKD: [0x1108, 0x1161, 0x11C0] }, +{ source: [0xBE7A], NFC: [0xBE7A], NFD: [0x1108, 0x1161, 0x11C1], NFKC: [0xBE7A], NFKD: [0x1108, 0x1161, 0x11C1] }, +{ source: [0xBE7B], NFC: [0xBE7B], NFD: [0x1108, 0x1161, 0x11C2], NFKC: [0xBE7B], NFKD: [0x1108, 0x1161, 0x11C2] }, +{ source: [0xBE7C], NFC: [0xBE7C], NFD: [0x1108, 0x1162], NFKC: [0xBE7C], NFKD: [0x1108, 0x1162] }, +{ source: [0xBE7D], NFC: [0xBE7D], NFD: [0x1108, 0x1162, 0x11A8], NFKC: [0xBE7D], NFKD: [0x1108, 0x1162, 0x11A8] }, +{ source: [0xBE7E], NFC: [0xBE7E], NFD: [0x1108, 0x1162, 0x11A9], NFKC: [0xBE7E], NFKD: [0x1108, 0x1162, 0x11A9] }, +{ source: [0xBE7F], NFC: [0xBE7F], NFD: [0x1108, 0x1162, 0x11AA], NFKC: [0xBE7F], NFKD: [0x1108, 0x1162, 0x11AA] }, +{ source: [0xBE80], NFC: [0xBE80], NFD: [0x1108, 0x1162, 0x11AB], NFKC: [0xBE80], NFKD: [0x1108, 0x1162, 0x11AB] }, +{ source: [0xBE81], NFC: [0xBE81], NFD: [0x1108, 0x1162, 0x11AC], NFKC: [0xBE81], NFKD: [0x1108, 0x1162, 0x11AC] }, +{ source: [0xBE82], NFC: [0xBE82], NFD: [0x1108, 0x1162, 0x11AD], NFKC: [0xBE82], NFKD: [0x1108, 0x1162, 0x11AD] }, +{ source: [0xBE83], NFC: [0xBE83], NFD: [0x1108, 0x1162, 0x11AE], NFKC: [0xBE83], NFKD: [0x1108, 0x1162, 0x11AE] }, +{ source: [0xBE84], NFC: [0xBE84], NFD: [0x1108, 0x1162, 0x11AF], NFKC: [0xBE84], NFKD: [0x1108, 0x1162, 0x11AF] }, +{ source: [0xBE85], NFC: [0xBE85], NFD: [0x1108, 0x1162, 0x11B0], NFKC: [0xBE85], NFKD: [0x1108, 0x1162, 0x11B0] }, +{ source: [0xBE86], NFC: [0xBE86], NFD: [0x1108, 0x1162, 0x11B1], NFKC: [0xBE86], NFKD: [0x1108, 0x1162, 0x11B1] }, +{ source: [0xBE87], NFC: [0xBE87], NFD: [0x1108, 0x1162, 0x11B2], NFKC: [0xBE87], NFKD: [0x1108, 0x1162, 0x11B2] }, +{ source: [0xBE88], NFC: [0xBE88], NFD: [0x1108, 0x1162, 0x11B3], NFKC: [0xBE88], NFKD: [0x1108, 0x1162, 0x11B3] }, +{ source: [0xBE89], NFC: [0xBE89], NFD: [0x1108, 0x1162, 0x11B4], NFKC: [0xBE89], NFKD: [0x1108, 0x1162, 0x11B4] }, +{ source: [0xBE8A], NFC: [0xBE8A], NFD: [0x1108, 0x1162, 0x11B5], NFKC: [0xBE8A], NFKD: [0x1108, 0x1162, 0x11B5] }, +{ source: [0xBE8B], NFC: [0xBE8B], NFD: [0x1108, 0x1162, 0x11B6], NFKC: [0xBE8B], NFKD: [0x1108, 0x1162, 0x11B6] }, +{ source: [0xBE8C], NFC: [0xBE8C], NFD: [0x1108, 0x1162, 0x11B7], NFKC: [0xBE8C], NFKD: [0x1108, 0x1162, 0x11B7] }, +{ source: [0xBE8D], NFC: [0xBE8D], NFD: [0x1108, 0x1162, 0x11B8], NFKC: [0xBE8D], NFKD: [0x1108, 0x1162, 0x11B8] }, +{ source: [0xBE8E], NFC: [0xBE8E], NFD: [0x1108, 0x1162, 0x11B9], NFKC: [0xBE8E], NFKD: [0x1108, 0x1162, 0x11B9] }, +{ source: [0xBE8F], NFC: [0xBE8F], NFD: [0x1108, 0x1162, 0x11BA], NFKC: [0xBE8F], NFKD: [0x1108, 0x1162, 0x11BA] }, +{ source: [0xBE90], NFC: [0xBE90], NFD: [0x1108, 0x1162, 0x11BB], NFKC: [0xBE90], NFKD: [0x1108, 0x1162, 0x11BB] }, +{ source: [0xBE91], NFC: [0xBE91], NFD: [0x1108, 0x1162, 0x11BC], NFKC: [0xBE91], NFKD: [0x1108, 0x1162, 0x11BC] }, +{ source: [0xBE92], NFC: [0xBE92], NFD: [0x1108, 0x1162, 0x11BD], NFKC: [0xBE92], NFKD: [0x1108, 0x1162, 0x11BD] }, +{ source: [0xBE93], NFC: [0xBE93], NFD: [0x1108, 0x1162, 0x11BE], NFKC: [0xBE93], NFKD: [0x1108, 0x1162, 0x11BE] }, +{ source: [0xBE94], NFC: [0xBE94], NFD: [0x1108, 0x1162, 0x11BF], NFKC: [0xBE94], NFKD: [0x1108, 0x1162, 0x11BF] }, +{ source: [0xBE95], NFC: [0xBE95], NFD: [0x1108, 0x1162, 0x11C0], NFKC: [0xBE95], NFKD: [0x1108, 0x1162, 0x11C0] }, +{ source: [0xBE96], NFC: [0xBE96], NFD: [0x1108, 0x1162, 0x11C1], NFKC: [0xBE96], NFKD: [0x1108, 0x1162, 0x11C1] }, +{ source: [0xBE97], NFC: [0xBE97], NFD: [0x1108, 0x1162, 0x11C2], NFKC: [0xBE97], NFKD: [0x1108, 0x1162, 0x11C2] }, +{ source: [0xBE98], NFC: [0xBE98], NFD: [0x1108, 0x1163], NFKC: [0xBE98], NFKD: [0x1108, 0x1163] }, +{ source: [0xBE99], NFC: [0xBE99], NFD: [0x1108, 0x1163, 0x11A8], NFKC: [0xBE99], NFKD: [0x1108, 0x1163, 0x11A8] }, +{ source: [0xBE9A], NFC: [0xBE9A], NFD: [0x1108, 0x1163, 0x11A9], NFKC: [0xBE9A], NFKD: [0x1108, 0x1163, 0x11A9] }, +{ source: [0xBE9B], NFC: [0xBE9B], NFD: [0x1108, 0x1163, 0x11AA], NFKC: [0xBE9B], NFKD: [0x1108, 0x1163, 0x11AA] }, +{ source: [0xBE9C], NFC: [0xBE9C], NFD: [0x1108, 0x1163, 0x11AB], NFKC: [0xBE9C], NFKD: [0x1108, 0x1163, 0x11AB] }, +{ source: [0xBE9D], NFC: [0xBE9D], NFD: [0x1108, 0x1163, 0x11AC], NFKC: [0xBE9D], NFKD: [0x1108, 0x1163, 0x11AC] }, +{ source: [0xBE9E], NFC: [0xBE9E], NFD: [0x1108, 0x1163, 0x11AD], NFKC: [0xBE9E], NFKD: [0x1108, 0x1163, 0x11AD] }, +{ source: [0xBE9F], NFC: [0xBE9F], NFD: [0x1108, 0x1163, 0x11AE], NFKC: [0xBE9F], NFKD: [0x1108, 0x1163, 0x11AE] }, +{ source: [0xBEA0], NFC: [0xBEA0], NFD: [0x1108, 0x1163, 0x11AF], NFKC: [0xBEA0], NFKD: [0x1108, 0x1163, 0x11AF] }, +{ source: [0xBEA1], NFC: [0xBEA1], NFD: [0x1108, 0x1163, 0x11B0], NFKC: [0xBEA1], NFKD: [0x1108, 0x1163, 0x11B0] }, +{ source: [0xBEA2], NFC: [0xBEA2], NFD: [0x1108, 0x1163, 0x11B1], NFKC: [0xBEA2], NFKD: [0x1108, 0x1163, 0x11B1] }, +{ source: [0xBEA3], NFC: [0xBEA3], NFD: [0x1108, 0x1163, 0x11B2], NFKC: [0xBEA3], NFKD: [0x1108, 0x1163, 0x11B2] }, +{ source: [0xBEA4], NFC: [0xBEA4], NFD: [0x1108, 0x1163, 0x11B3], NFKC: [0xBEA4], NFKD: [0x1108, 0x1163, 0x11B3] }, +{ source: [0xBEA5], NFC: [0xBEA5], NFD: [0x1108, 0x1163, 0x11B4], NFKC: [0xBEA5], NFKD: [0x1108, 0x1163, 0x11B4] }, +{ source: [0xBEA6], NFC: [0xBEA6], NFD: [0x1108, 0x1163, 0x11B5], NFKC: [0xBEA6], NFKD: [0x1108, 0x1163, 0x11B5] }, +{ source: [0xBEA7], NFC: [0xBEA7], NFD: [0x1108, 0x1163, 0x11B6], NFKC: [0xBEA7], NFKD: [0x1108, 0x1163, 0x11B6] }, +{ source: [0xBEA8], NFC: [0xBEA8], NFD: [0x1108, 0x1163, 0x11B7], NFKC: [0xBEA8], NFKD: [0x1108, 0x1163, 0x11B7] }, +{ source: [0xBEA9], NFC: [0xBEA9], NFD: [0x1108, 0x1163, 0x11B8], NFKC: [0xBEA9], NFKD: [0x1108, 0x1163, 0x11B8] }, +{ source: [0xBEAA], NFC: [0xBEAA], NFD: [0x1108, 0x1163, 0x11B9], NFKC: [0xBEAA], NFKD: [0x1108, 0x1163, 0x11B9] }, +{ source: [0xBEAB], NFC: [0xBEAB], NFD: [0x1108, 0x1163, 0x11BA], NFKC: [0xBEAB], NFKD: [0x1108, 0x1163, 0x11BA] }, +{ source: [0xBEAC], NFC: [0xBEAC], NFD: [0x1108, 0x1163, 0x11BB], NFKC: [0xBEAC], NFKD: [0x1108, 0x1163, 0x11BB] }, +{ source: [0xBEAD], NFC: [0xBEAD], NFD: [0x1108, 0x1163, 0x11BC], NFKC: [0xBEAD], NFKD: [0x1108, 0x1163, 0x11BC] }, +{ source: [0xBEAE], NFC: [0xBEAE], NFD: [0x1108, 0x1163, 0x11BD], NFKC: [0xBEAE], NFKD: [0x1108, 0x1163, 0x11BD] }, +{ source: [0xBEAF], NFC: [0xBEAF], NFD: [0x1108, 0x1163, 0x11BE], NFKC: [0xBEAF], NFKD: [0x1108, 0x1163, 0x11BE] }, +{ source: [0xBEB0], NFC: [0xBEB0], NFD: [0x1108, 0x1163, 0x11BF], NFKC: [0xBEB0], NFKD: [0x1108, 0x1163, 0x11BF] }, +{ source: [0xBEB1], NFC: [0xBEB1], NFD: [0x1108, 0x1163, 0x11C0], NFKC: [0xBEB1], NFKD: [0x1108, 0x1163, 0x11C0] }, +{ source: [0xBEB2], NFC: [0xBEB2], NFD: [0x1108, 0x1163, 0x11C1], NFKC: [0xBEB2], NFKD: [0x1108, 0x1163, 0x11C1] }, +{ source: [0xBEB3], NFC: [0xBEB3], NFD: [0x1108, 0x1163, 0x11C2], NFKC: [0xBEB3], NFKD: [0x1108, 0x1163, 0x11C2] }, +{ source: [0xBEB4], NFC: [0xBEB4], NFD: [0x1108, 0x1164], NFKC: [0xBEB4], NFKD: [0x1108, 0x1164] }, +{ source: [0xBEB5], NFC: [0xBEB5], NFD: [0x1108, 0x1164, 0x11A8], NFKC: [0xBEB5], NFKD: [0x1108, 0x1164, 0x11A8] }, +{ source: [0xBEB6], NFC: [0xBEB6], NFD: [0x1108, 0x1164, 0x11A9], NFKC: [0xBEB6], NFKD: [0x1108, 0x1164, 0x11A9] }, +{ source: [0xBEB7], NFC: [0xBEB7], NFD: [0x1108, 0x1164, 0x11AA], NFKC: [0xBEB7], NFKD: [0x1108, 0x1164, 0x11AA] }, +{ source: [0xBEB8], NFC: [0xBEB8], NFD: [0x1108, 0x1164, 0x11AB], NFKC: [0xBEB8], NFKD: [0x1108, 0x1164, 0x11AB] }, +{ source: [0xBEB9], NFC: [0xBEB9], NFD: [0x1108, 0x1164, 0x11AC], NFKC: [0xBEB9], NFKD: [0x1108, 0x1164, 0x11AC] }, +{ source: [0xBEBA], NFC: [0xBEBA], NFD: [0x1108, 0x1164, 0x11AD], NFKC: [0xBEBA], NFKD: [0x1108, 0x1164, 0x11AD] }, +{ source: [0xBEBB], NFC: [0xBEBB], NFD: [0x1108, 0x1164, 0x11AE], NFKC: [0xBEBB], NFKD: [0x1108, 0x1164, 0x11AE] }, +{ source: [0xBEBC], NFC: [0xBEBC], NFD: [0x1108, 0x1164, 0x11AF], NFKC: [0xBEBC], NFKD: [0x1108, 0x1164, 0x11AF] }, +{ source: [0xBEBD], NFC: [0xBEBD], NFD: [0x1108, 0x1164, 0x11B0], NFKC: [0xBEBD], NFKD: [0x1108, 0x1164, 0x11B0] }, +{ source: [0xBEBE], NFC: [0xBEBE], NFD: [0x1108, 0x1164, 0x11B1], NFKC: [0xBEBE], NFKD: [0x1108, 0x1164, 0x11B1] }, +{ source: [0xBEBF], NFC: [0xBEBF], NFD: [0x1108, 0x1164, 0x11B2], NFKC: [0xBEBF], NFKD: [0x1108, 0x1164, 0x11B2] }, +{ source: [0xBEC0], NFC: [0xBEC0], NFD: [0x1108, 0x1164, 0x11B3], NFKC: [0xBEC0], NFKD: [0x1108, 0x1164, 0x11B3] }, +{ source: [0xBEC1], NFC: [0xBEC1], NFD: [0x1108, 0x1164, 0x11B4], NFKC: [0xBEC1], NFKD: [0x1108, 0x1164, 0x11B4] }, +{ source: [0xBEC2], NFC: [0xBEC2], NFD: [0x1108, 0x1164, 0x11B5], NFKC: [0xBEC2], NFKD: [0x1108, 0x1164, 0x11B5] }, +{ source: [0xBEC3], NFC: [0xBEC3], NFD: [0x1108, 0x1164, 0x11B6], NFKC: [0xBEC3], NFKD: [0x1108, 0x1164, 0x11B6] }, +{ source: [0xBEC4], NFC: [0xBEC4], NFD: [0x1108, 0x1164, 0x11B7], NFKC: [0xBEC4], NFKD: [0x1108, 0x1164, 0x11B7] }, +{ source: [0xBEC5], NFC: [0xBEC5], NFD: [0x1108, 0x1164, 0x11B8], NFKC: [0xBEC5], NFKD: [0x1108, 0x1164, 0x11B8] }, +{ source: [0xBEC6], NFC: [0xBEC6], NFD: [0x1108, 0x1164, 0x11B9], NFKC: [0xBEC6], NFKD: [0x1108, 0x1164, 0x11B9] }, +{ source: [0xBEC7], NFC: [0xBEC7], NFD: [0x1108, 0x1164, 0x11BA], NFKC: [0xBEC7], NFKD: [0x1108, 0x1164, 0x11BA] }, +{ source: [0xBEC8], NFC: [0xBEC8], NFD: [0x1108, 0x1164, 0x11BB], NFKC: [0xBEC8], NFKD: [0x1108, 0x1164, 0x11BB] }, +{ source: [0xBEC9], NFC: [0xBEC9], NFD: [0x1108, 0x1164, 0x11BC], NFKC: [0xBEC9], NFKD: [0x1108, 0x1164, 0x11BC] }, +{ source: [0xBECA], NFC: [0xBECA], NFD: [0x1108, 0x1164, 0x11BD], NFKC: [0xBECA], NFKD: [0x1108, 0x1164, 0x11BD] }, +{ source: [0xBECB], NFC: [0xBECB], NFD: [0x1108, 0x1164, 0x11BE], NFKC: [0xBECB], NFKD: [0x1108, 0x1164, 0x11BE] }, +{ source: [0xBECC], NFC: [0xBECC], NFD: [0x1108, 0x1164, 0x11BF], NFKC: [0xBECC], NFKD: [0x1108, 0x1164, 0x11BF] }, +{ source: [0xBECD], NFC: [0xBECD], NFD: [0x1108, 0x1164, 0x11C0], NFKC: [0xBECD], NFKD: [0x1108, 0x1164, 0x11C0] }, +{ source: [0xBECE], NFC: [0xBECE], NFD: [0x1108, 0x1164, 0x11C1], NFKC: [0xBECE], NFKD: [0x1108, 0x1164, 0x11C1] }, +{ source: [0xBECF], NFC: [0xBECF], NFD: [0x1108, 0x1164, 0x11C2], NFKC: [0xBECF], NFKD: [0x1108, 0x1164, 0x11C2] }, +{ source: [0xBED0], NFC: [0xBED0], NFD: [0x1108, 0x1165], NFKC: [0xBED0], NFKD: [0x1108, 0x1165] }, +{ source: [0xBED1], NFC: [0xBED1], NFD: [0x1108, 0x1165, 0x11A8], NFKC: [0xBED1], NFKD: [0x1108, 0x1165, 0x11A8] }, +{ source: [0xBED2], NFC: [0xBED2], NFD: [0x1108, 0x1165, 0x11A9], NFKC: [0xBED2], NFKD: [0x1108, 0x1165, 0x11A9] }, +{ source: [0xBED3], NFC: [0xBED3], NFD: [0x1108, 0x1165, 0x11AA], NFKC: [0xBED3], NFKD: [0x1108, 0x1165, 0x11AA] }, +{ source: [0xBED4], NFC: [0xBED4], NFD: [0x1108, 0x1165, 0x11AB], NFKC: [0xBED4], NFKD: [0x1108, 0x1165, 0x11AB] }, +{ source: [0xBED5], NFC: [0xBED5], NFD: [0x1108, 0x1165, 0x11AC], NFKC: [0xBED5], NFKD: [0x1108, 0x1165, 0x11AC] }, +{ source: [0xBED6], NFC: [0xBED6], NFD: [0x1108, 0x1165, 0x11AD], NFKC: [0xBED6], NFKD: [0x1108, 0x1165, 0x11AD] }, +{ source: [0xBED7], NFC: [0xBED7], NFD: [0x1108, 0x1165, 0x11AE], NFKC: [0xBED7], NFKD: [0x1108, 0x1165, 0x11AE] }, +{ source: [0xBED8], NFC: [0xBED8], NFD: [0x1108, 0x1165, 0x11AF], NFKC: [0xBED8], NFKD: [0x1108, 0x1165, 0x11AF] }, +{ source: [0xBED9], NFC: [0xBED9], NFD: [0x1108, 0x1165, 0x11B0], NFKC: [0xBED9], NFKD: [0x1108, 0x1165, 0x11B0] }, +{ source: [0xBEDA], NFC: [0xBEDA], NFD: [0x1108, 0x1165, 0x11B1], NFKC: [0xBEDA], NFKD: [0x1108, 0x1165, 0x11B1] }, +{ source: [0xBEDB], NFC: [0xBEDB], NFD: [0x1108, 0x1165, 0x11B2], NFKC: [0xBEDB], NFKD: [0x1108, 0x1165, 0x11B2] }, +{ source: [0xBEDC], NFC: [0xBEDC], NFD: [0x1108, 0x1165, 0x11B3], NFKC: [0xBEDC], NFKD: [0x1108, 0x1165, 0x11B3] }, +{ source: [0xBEDD], NFC: [0xBEDD], NFD: [0x1108, 0x1165, 0x11B4], NFKC: [0xBEDD], NFKD: [0x1108, 0x1165, 0x11B4] }, +{ source: [0xBEDE], NFC: [0xBEDE], NFD: [0x1108, 0x1165, 0x11B5], NFKC: [0xBEDE], NFKD: [0x1108, 0x1165, 0x11B5] }, +{ source: [0xBEDF], NFC: [0xBEDF], NFD: [0x1108, 0x1165, 0x11B6], NFKC: [0xBEDF], NFKD: [0x1108, 0x1165, 0x11B6] }, +{ source: [0xBEE0], NFC: [0xBEE0], NFD: [0x1108, 0x1165, 0x11B7], NFKC: [0xBEE0], NFKD: [0x1108, 0x1165, 0x11B7] }, +{ source: [0xBEE1], NFC: [0xBEE1], NFD: [0x1108, 0x1165, 0x11B8], NFKC: [0xBEE1], NFKD: [0x1108, 0x1165, 0x11B8] }, +{ source: [0xBEE2], NFC: [0xBEE2], NFD: [0x1108, 0x1165, 0x11B9], NFKC: [0xBEE2], NFKD: [0x1108, 0x1165, 0x11B9] }, +{ source: [0xBEE3], NFC: [0xBEE3], NFD: [0x1108, 0x1165, 0x11BA], NFKC: [0xBEE3], NFKD: [0x1108, 0x1165, 0x11BA] }, +{ source: [0xBEE4], NFC: [0xBEE4], NFD: [0x1108, 0x1165, 0x11BB], NFKC: [0xBEE4], NFKD: [0x1108, 0x1165, 0x11BB] }, +{ source: [0xBEE5], NFC: [0xBEE5], NFD: [0x1108, 0x1165, 0x11BC], NFKC: [0xBEE5], NFKD: [0x1108, 0x1165, 0x11BC] }, +{ source: [0xBEE6], NFC: [0xBEE6], NFD: [0x1108, 0x1165, 0x11BD], NFKC: [0xBEE6], NFKD: [0x1108, 0x1165, 0x11BD] }, +{ source: [0xBEE7], NFC: [0xBEE7], NFD: [0x1108, 0x1165, 0x11BE], NFKC: [0xBEE7], NFKD: [0x1108, 0x1165, 0x11BE] }, +{ source: [0xBEE8], NFC: [0xBEE8], NFD: [0x1108, 0x1165, 0x11BF], NFKC: [0xBEE8], NFKD: [0x1108, 0x1165, 0x11BF] }, +{ source: [0xBEE9], NFC: [0xBEE9], NFD: [0x1108, 0x1165, 0x11C0], NFKC: [0xBEE9], NFKD: [0x1108, 0x1165, 0x11C0] }, +{ source: [0xBEEA], NFC: [0xBEEA], NFD: [0x1108, 0x1165, 0x11C1], NFKC: [0xBEEA], NFKD: [0x1108, 0x1165, 0x11C1] }, +{ source: [0xBEEB], NFC: [0xBEEB], NFD: [0x1108, 0x1165, 0x11C2], NFKC: [0xBEEB], NFKD: [0x1108, 0x1165, 0x11C2] }, +{ source: [0xBEEC], NFC: [0xBEEC], NFD: [0x1108, 0x1166], NFKC: [0xBEEC], NFKD: [0x1108, 0x1166] }, +{ source: [0xBEED], NFC: [0xBEED], NFD: [0x1108, 0x1166, 0x11A8], NFKC: [0xBEED], NFKD: [0x1108, 0x1166, 0x11A8] }, +{ source: [0xBEEE], NFC: [0xBEEE], NFD: [0x1108, 0x1166, 0x11A9], NFKC: [0xBEEE], NFKD: [0x1108, 0x1166, 0x11A9] }, +{ source: [0xBEEF], NFC: [0xBEEF], NFD: [0x1108, 0x1166, 0x11AA], NFKC: [0xBEEF], NFKD: [0x1108, 0x1166, 0x11AA] }, +{ source: [0xBEF0], NFC: [0xBEF0], NFD: [0x1108, 0x1166, 0x11AB], NFKC: [0xBEF0], NFKD: [0x1108, 0x1166, 0x11AB] }, +{ source: [0xBEF1], NFC: [0xBEF1], NFD: [0x1108, 0x1166, 0x11AC], NFKC: [0xBEF1], NFKD: [0x1108, 0x1166, 0x11AC] }, +{ source: [0xBEF2], NFC: [0xBEF2], NFD: [0x1108, 0x1166, 0x11AD], NFKC: [0xBEF2], NFKD: [0x1108, 0x1166, 0x11AD] }, +{ source: [0xBEF3], NFC: [0xBEF3], NFD: [0x1108, 0x1166, 0x11AE], NFKC: [0xBEF3], NFKD: [0x1108, 0x1166, 0x11AE] }, +{ source: [0xBEF4], NFC: [0xBEF4], NFD: [0x1108, 0x1166, 0x11AF], NFKC: [0xBEF4], NFKD: [0x1108, 0x1166, 0x11AF] }, +{ source: [0xBEF5], NFC: [0xBEF5], NFD: [0x1108, 0x1166, 0x11B0], NFKC: [0xBEF5], NFKD: [0x1108, 0x1166, 0x11B0] }, +{ source: [0xBEF6], NFC: [0xBEF6], NFD: [0x1108, 0x1166, 0x11B1], NFKC: [0xBEF6], NFKD: [0x1108, 0x1166, 0x11B1] }, +{ source: [0xBEF7], NFC: [0xBEF7], NFD: [0x1108, 0x1166, 0x11B2], NFKC: [0xBEF7], NFKD: [0x1108, 0x1166, 0x11B2] }, +{ source: [0xBEF8], NFC: [0xBEF8], NFD: [0x1108, 0x1166, 0x11B3], NFKC: [0xBEF8], NFKD: [0x1108, 0x1166, 0x11B3] }, +{ source: [0xBEF9], NFC: [0xBEF9], NFD: [0x1108, 0x1166, 0x11B4], NFKC: [0xBEF9], NFKD: [0x1108, 0x1166, 0x11B4] }, +{ source: [0xBEFA], NFC: [0xBEFA], NFD: [0x1108, 0x1166, 0x11B5], NFKC: [0xBEFA], NFKD: [0x1108, 0x1166, 0x11B5] }, +{ source: [0xBEFB], NFC: [0xBEFB], NFD: [0x1108, 0x1166, 0x11B6], NFKC: [0xBEFB], NFKD: [0x1108, 0x1166, 0x11B6] }, +{ source: [0xBEFC], NFC: [0xBEFC], NFD: [0x1108, 0x1166, 0x11B7], NFKC: [0xBEFC], NFKD: [0x1108, 0x1166, 0x11B7] }, +{ source: [0xBEFD], NFC: [0xBEFD], NFD: [0x1108, 0x1166, 0x11B8], NFKC: [0xBEFD], NFKD: [0x1108, 0x1166, 0x11B8] }, +{ source: [0xBEFE], NFC: [0xBEFE], NFD: [0x1108, 0x1166, 0x11B9], NFKC: [0xBEFE], NFKD: [0x1108, 0x1166, 0x11B9] }, +{ source: [0xBEFF], NFC: [0xBEFF], NFD: [0x1108, 0x1166, 0x11BA], NFKC: [0xBEFF], NFKD: [0x1108, 0x1166, 0x11BA] }, +{ source: [0xBF00], NFC: [0xBF00], NFD: [0x1108, 0x1166, 0x11BB], NFKC: [0xBF00], NFKD: [0x1108, 0x1166, 0x11BB] }, +{ source: [0xBF01], NFC: [0xBF01], NFD: [0x1108, 0x1166, 0x11BC], NFKC: [0xBF01], NFKD: [0x1108, 0x1166, 0x11BC] }, +{ source: [0xBF02], NFC: [0xBF02], NFD: [0x1108, 0x1166, 0x11BD], NFKC: [0xBF02], NFKD: [0x1108, 0x1166, 0x11BD] }, +{ source: [0xBF03], NFC: [0xBF03], NFD: [0x1108, 0x1166, 0x11BE], NFKC: [0xBF03], NFKD: [0x1108, 0x1166, 0x11BE] }, +{ source: [0xBF04], NFC: [0xBF04], NFD: [0x1108, 0x1166, 0x11BF], NFKC: [0xBF04], NFKD: [0x1108, 0x1166, 0x11BF] }, +{ source: [0xBF05], NFC: [0xBF05], NFD: [0x1108, 0x1166, 0x11C0], NFKC: [0xBF05], NFKD: [0x1108, 0x1166, 0x11C0] }, +{ source: [0xBF06], NFC: [0xBF06], NFD: [0x1108, 0x1166, 0x11C1], NFKC: [0xBF06], NFKD: [0x1108, 0x1166, 0x11C1] }, +{ source: [0xBF07], NFC: [0xBF07], NFD: [0x1108, 0x1166, 0x11C2], NFKC: [0xBF07], NFKD: [0x1108, 0x1166, 0x11C2] }, +{ source: [0xBF08], NFC: [0xBF08], NFD: [0x1108, 0x1167], NFKC: [0xBF08], NFKD: [0x1108, 0x1167] }, +{ source: [0xBF09], NFC: [0xBF09], NFD: [0x1108, 0x1167, 0x11A8], NFKC: [0xBF09], NFKD: [0x1108, 0x1167, 0x11A8] }, +{ source: [0xBF0A], NFC: [0xBF0A], NFD: [0x1108, 0x1167, 0x11A9], NFKC: [0xBF0A], NFKD: [0x1108, 0x1167, 0x11A9] }, +{ source: [0xBF0B], NFC: [0xBF0B], NFD: [0x1108, 0x1167, 0x11AA], NFKC: [0xBF0B], NFKD: [0x1108, 0x1167, 0x11AA] }, +{ source: [0xBF0C], NFC: [0xBF0C], NFD: [0x1108, 0x1167, 0x11AB], NFKC: [0xBF0C], NFKD: [0x1108, 0x1167, 0x11AB] }, +{ source: [0xBF0D], NFC: [0xBF0D], NFD: [0x1108, 0x1167, 0x11AC], NFKC: [0xBF0D], NFKD: [0x1108, 0x1167, 0x11AC] }, +{ source: [0xBF0E], NFC: [0xBF0E], NFD: [0x1108, 0x1167, 0x11AD], NFKC: [0xBF0E], NFKD: [0x1108, 0x1167, 0x11AD] }, +{ source: [0xBF0F], NFC: [0xBF0F], NFD: [0x1108, 0x1167, 0x11AE], NFKC: [0xBF0F], NFKD: [0x1108, 0x1167, 0x11AE] }, +{ source: [0xBF10], NFC: [0xBF10], NFD: [0x1108, 0x1167, 0x11AF], NFKC: [0xBF10], NFKD: [0x1108, 0x1167, 0x11AF] }, +{ source: [0xBF11], NFC: [0xBF11], NFD: [0x1108, 0x1167, 0x11B0], NFKC: [0xBF11], NFKD: [0x1108, 0x1167, 0x11B0] }, +{ source: [0xBF12], NFC: [0xBF12], NFD: [0x1108, 0x1167, 0x11B1], NFKC: [0xBF12], NFKD: [0x1108, 0x1167, 0x11B1] }, +{ source: [0xBF13], NFC: [0xBF13], NFD: [0x1108, 0x1167, 0x11B2], NFKC: [0xBF13], NFKD: [0x1108, 0x1167, 0x11B2] }, +{ source: [0xBF14], NFC: [0xBF14], NFD: [0x1108, 0x1167, 0x11B3], NFKC: [0xBF14], NFKD: [0x1108, 0x1167, 0x11B3] }, +{ source: [0xBF15], NFC: [0xBF15], NFD: [0x1108, 0x1167, 0x11B4], NFKC: [0xBF15], NFKD: [0x1108, 0x1167, 0x11B4] }, +{ source: [0xBF16], NFC: [0xBF16], NFD: [0x1108, 0x1167, 0x11B5], NFKC: [0xBF16], NFKD: [0x1108, 0x1167, 0x11B5] }, +{ source: [0xBF17], NFC: [0xBF17], NFD: [0x1108, 0x1167, 0x11B6], NFKC: [0xBF17], NFKD: [0x1108, 0x1167, 0x11B6] }, +{ source: [0xBF18], NFC: [0xBF18], NFD: [0x1108, 0x1167, 0x11B7], NFKC: [0xBF18], NFKD: [0x1108, 0x1167, 0x11B7] }, +{ source: [0xBF19], NFC: [0xBF19], NFD: [0x1108, 0x1167, 0x11B8], NFKC: [0xBF19], NFKD: [0x1108, 0x1167, 0x11B8] }, +{ source: [0xBF1A], NFC: [0xBF1A], NFD: [0x1108, 0x1167, 0x11B9], NFKC: [0xBF1A], NFKD: [0x1108, 0x1167, 0x11B9] }, +{ source: [0xBF1B], NFC: [0xBF1B], NFD: [0x1108, 0x1167, 0x11BA], NFKC: [0xBF1B], NFKD: [0x1108, 0x1167, 0x11BA] }, +{ source: [0xBF1C], NFC: [0xBF1C], NFD: [0x1108, 0x1167, 0x11BB], NFKC: [0xBF1C], NFKD: [0x1108, 0x1167, 0x11BB] }, +{ source: [0xBF1D], NFC: [0xBF1D], NFD: [0x1108, 0x1167, 0x11BC], NFKC: [0xBF1D], NFKD: [0x1108, 0x1167, 0x11BC] }, +{ source: [0xBF1E], NFC: [0xBF1E], NFD: [0x1108, 0x1167, 0x11BD], NFKC: [0xBF1E], NFKD: [0x1108, 0x1167, 0x11BD] }, +{ source: [0xBF1F], NFC: [0xBF1F], NFD: [0x1108, 0x1167, 0x11BE], NFKC: [0xBF1F], NFKD: [0x1108, 0x1167, 0x11BE] }, +{ source: [0xBF20], NFC: [0xBF20], NFD: [0x1108, 0x1167, 0x11BF], NFKC: [0xBF20], NFKD: [0x1108, 0x1167, 0x11BF] }, +{ source: [0xBF21], NFC: [0xBF21], NFD: [0x1108, 0x1167, 0x11C0], NFKC: [0xBF21], NFKD: [0x1108, 0x1167, 0x11C0] }, +{ source: [0xBF22], NFC: [0xBF22], NFD: [0x1108, 0x1167, 0x11C1], NFKC: [0xBF22], NFKD: [0x1108, 0x1167, 0x11C1] }, +{ source: [0xBF23], NFC: [0xBF23], NFD: [0x1108, 0x1167, 0x11C2], NFKC: [0xBF23], NFKD: [0x1108, 0x1167, 0x11C2] }, +{ source: [0xBF24], NFC: [0xBF24], NFD: [0x1108, 0x1168], NFKC: [0xBF24], NFKD: [0x1108, 0x1168] }, +{ source: [0xBF25], NFC: [0xBF25], NFD: [0x1108, 0x1168, 0x11A8], NFKC: [0xBF25], NFKD: [0x1108, 0x1168, 0x11A8] }, +{ source: [0xBF26], NFC: [0xBF26], NFD: [0x1108, 0x1168, 0x11A9], NFKC: [0xBF26], NFKD: [0x1108, 0x1168, 0x11A9] }, +{ source: [0xBF27], NFC: [0xBF27], NFD: [0x1108, 0x1168, 0x11AA], NFKC: [0xBF27], NFKD: [0x1108, 0x1168, 0x11AA] }, +{ source: [0xBF28], NFC: [0xBF28], NFD: [0x1108, 0x1168, 0x11AB], NFKC: [0xBF28], NFKD: [0x1108, 0x1168, 0x11AB] }, +{ source: [0xBF29], NFC: [0xBF29], NFD: [0x1108, 0x1168, 0x11AC], NFKC: [0xBF29], NFKD: [0x1108, 0x1168, 0x11AC] }, +{ source: [0xBF2A], NFC: [0xBF2A], NFD: [0x1108, 0x1168, 0x11AD], NFKC: [0xBF2A], NFKD: [0x1108, 0x1168, 0x11AD] }, +{ source: [0xBF2B], NFC: [0xBF2B], NFD: [0x1108, 0x1168, 0x11AE], NFKC: [0xBF2B], NFKD: [0x1108, 0x1168, 0x11AE] }, +{ source: [0xBF2C], NFC: [0xBF2C], NFD: [0x1108, 0x1168, 0x11AF], NFKC: [0xBF2C], NFKD: [0x1108, 0x1168, 0x11AF] }, +{ source: [0xBF2D], NFC: [0xBF2D], NFD: [0x1108, 0x1168, 0x11B0], NFKC: [0xBF2D], NFKD: [0x1108, 0x1168, 0x11B0] }, +{ source: [0xBF2E], NFC: [0xBF2E], NFD: [0x1108, 0x1168, 0x11B1], NFKC: [0xBF2E], NFKD: [0x1108, 0x1168, 0x11B1] }, +{ source: [0xBF2F], NFC: [0xBF2F], NFD: [0x1108, 0x1168, 0x11B2], NFKC: [0xBF2F], NFKD: [0x1108, 0x1168, 0x11B2] }, +{ source: [0xBF30], NFC: [0xBF30], NFD: [0x1108, 0x1168, 0x11B3], NFKC: [0xBF30], NFKD: [0x1108, 0x1168, 0x11B3] }, +{ source: [0xBF31], NFC: [0xBF31], NFD: [0x1108, 0x1168, 0x11B4], NFKC: [0xBF31], NFKD: [0x1108, 0x1168, 0x11B4] }, +{ source: [0xBF32], NFC: [0xBF32], NFD: [0x1108, 0x1168, 0x11B5], NFKC: [0xBF32], NFKD: [0x1108, 0x1168, 0x11B5] }, +{ source: [0xBF33], NFC: [0xBF33], NFD: [0x1108, 0x1168, 0x11B6], NFKC: [0xBF33], NFKD: [0x1108, 0x1168, 0x11B6] }, +{ source: [0xBF34], NFC: [0xBF34], NFD: [0x1108, 0x1168, 0x11B7], NFKC: [0xBF34], NFKD: [0x1108, 0x1168, 0x11B7] }, +{ source: [0xBF35], NFC: [0xBF35], NFD: [0x1108, 0x1168, 0x11B8], NFKC: [0xBF35], NFKD: [0x1108, 0x1168, 0x11B8] }, +{ source: [0xBF36], NFC: [0xBF36], NFD: [0x1108, 0x1168, 0x11B9], NFKC: [0xBF36], NFKD: [0x1108, 0x1168, 0x11B9] }, +{ source: [0xBF37], NFC: [0xBF37], NFD: [0x1108, 0x1168, 0x11BA], NFKC: [0xBF37], NFKD: [0x1108, 0x1168, 0x11BA] }, +{ source: [0xBF38], NFC: [0xBF38], NFD: [0x1108, 0x1168, 0x11BB], NFKC: [0xBF38], NFKD: [0x1108, 0x1168, 0x11BB] }, +{ source: [0xBF39], NFC: [0xBF39], NFD: [0x1108, 0x1168, 0x11BC], NFKC: [0xBF39], NFKD: [0x1108, 0x1168, 0x11BC] }, +{ source: [0xBF3A], NFC: [0xBF3A], NFD: [0x1108, 0x1168, 0x11BD], NFKC: [0xBF3A], NFKD: [0x1108, 0x1168, 0x11BD] }, +{ source: [0xBF3B], NFC: [0xBF3B], NFD: [0x1108, 0x1168, 0x11BE], NFKC: [0xBF3B], NFKD: [0x1108, 0x1168, 0x11BE] }, +{ source: [0xBF3C], NFC: [0xBF3C], NFD: [0x1108, 0x1168, 0x11BF], NFKC: [0xBF3C], NFKD: [0x1108, 0x1168, 0x11BF] }, +{ source: [0xBF3D], NFC: [0xBF3D], NFD: [0x1108, 0x1168, 0x11C0], NFKC: [0xBF3D], NFKD: [0x1108, 0x1168, 0x11C0] }, +{ source: [0xBF3E], NFC: [0xBF3E], NFD: [0x1108, 0x1168, 0x11C1], NFKC: [0xBF3E], NFKD: [0x1108, 0x1168, 0x11C1] }, +{ source: [0xBF3F], NFC: [0xBF3F], NFD: [0x1108, 0x1168, 0x11C2], NFKC: [0xBF3F], NFKD: [0x1108, 0x1168, 0x11C2] }, +{ source: [0xBF40], NFC: [0xBF40], NFD: [0x1108, 0x1169], NFKC: [0xBF40], NFKD: [0x1108, 0x1169] }, +{ source: [0xBF41], NFC: [0xBF41], NFD: [0x1108, 0x1169, 0x11A8], NFKC: [0xBF41], NFKD: [0x1108, 0x1169, 0x11A8] }, +{ source: [0xBF42], NFC: [0xBF42], NFD: [0x1108, 0x1169, 0x11A9], NFKC: [0xBF42], NFKD: [0x1108, 0x1169, 0x11A9] }, +{ source: [0xBF43], NFC: [0xBF43], NFD: [0x1108, 0x1169, 0x11AA], NFKC: [0xBF43], NFKD: [0x1108, 0x1169, 0x11AA] }, +{ source: [0xBF44], NFC: [0xBF44], NFD: [0x1108, 0x1169, 0x11AB], NFKC: [0xBF44], NFKD: [0x1108, 0x1169, 0x11AB] }, +{ source: [0xBF45], NFC: [0xBF45], NFD: [0x1108, 0x1169, 0x11AC], NFKC: [0xBF45], NFKD: [0x1108, 0x1169, 0x11AC] }, +{ source: [0xBF46], NFC: [0xBF46], NFD: [0x1108, 0x1169, 0x11AD], NFKC: [0xBF46], NFKD: [0x1108, 0x1169, 0x11AD] }, +{ source: [0xBF47], NFC: [0xBF47], NFD: [0x1108, 0x1169, 0x11AE], NFKC: [0xBF47], NFKD: [0x1108, 0x1169, 0x11AE] }, +{ source: [0xBF48], NFC: [0xBF48], NFD: [0x1108, 0x1169, 0x11AF], NFKC: [0xBF48], NFKD: [0x1108, 0x1169, 0x11AF] }, +{ source: [0xBF49], NFC: [0xBF49], NFD: [0x1108, 0x1169, 0x11B0], NFKC: [0xBF49], NFKD: [0x1108, 0x1169, 0x11B0] }, +{ source: [0xBF4A], NFC: [0xBF4A], NFD: [0x1108, 0x1169, 0x11B1], NFKC: [0xBF4A], NFKD: [0x1108, 0x1169, 0x11B1] }, +{ source: [0xBF4B], NFC: [0xBF4B], NFD: [0x1108, 0x1169, 0x11B2], NFKC: [0xBF4B], NFKD: [0x1108, 0x1169, 0x11B2] }, +{ source: [0xBF4C], NFC: [0xBF4C], NFD: [0x1108, 0x1169, 0x11B3], NFKC: [0xBF4C], NFKD: [0x1108, 0x1169, 0x11B3] }, +{ source: [0xBF4D], NFC: [0xBF4D], NFD: [0x1108, 0x1169, 0x11B4], NFKC: [0xBF4D], NFKD: [0x1108, 0x1169, 0x11B4] }, +{ source: [0xBF4E], NFC: [0xBF4E], NFD: [0x1108, 0x1169, 0x11B5], NFKC: [0xBF4E], NFKD: [0x1108, 0x1169, 0x11B5] }, +{ source: [0xBF4F], NFC: [0xBF4F], NFD: [0x1108, 0x1169, 0x11B6], NFKC: [0xBF4F], NFKD: [0x1108, 0x1169, 0x11B6] }, +{ source: [0xBF50], NFC: [0xBF50], NFD: [0x1108, 0x1169, 0x11B7], NFKC: [0xBF50], NFKD: [0x1108, 0x1169, 0x11B7] }, +{ source: [0xBF51], NFC: [0xBF51], NFD: [0x1108, 0x1169, 0x11B8], NFKC: [0xBF51], NFKD: [0x1108, 0x1169, 0x11B8] }, +{ source: [0xBF52], NFC: [0xBF52], NFD: [0x1108, 0x1169, 0x11B9], NFKC: [0xBF52], NFKD: [0x1108, 0x1169, 0x11B9] }, +{ source: [0xBF53], NFC: [0xBF53], NFD: [0x1108, 0x1169, 0x11BA], NFKC: [0xBF53], NFKD: [0x1108, 0x1169, 0x11BA] }, +{ source: [0xBF54], NFC: [0xBF54], NFD: [0x1108, 0x1169, 0x11BB], NFKC: [0xBF54], NFKD: [0x1108, 0x1169, 0x11BB] }, +{ source: [0xBF55], NFC: [0xBF55], NFD: [0x1108, 0x1169, 0x11BC], NFKC: [0xBF55], NFKD: [0x1108, 0x1169, 0x11BC] }, +{ source: [0xBF56], NFC: [0xBF56], NFD: [0x1108, 0x1169, 0x11BD], NFKC: [0xBF56], NFKD: [0x1108, 0x1169, 0x11BD] }, +{ source: [0xBF57], NFC: [0xBF57], NFD: [0x1108, 0x1169, 0x11BE], NFKC: [0xBF57], NFKD: [0x1108, 0x1169, 0x11BE] }, +{ source: [0xBF58], NFC: [0xBF58], NFD: [0x1108, 0x1169, 0x11BF], NFKC: [0xBF58], NFKD: [0x1108, 0x1169, 0x11BF] }, +{ source: [0xBF59], NFC: [0xBF59], NFD: [0x1108, 0x1169, 0x11C0], NFKC: [0xBF59], NFKD: [0x1108, 0x1169, 0x11C0] }, +{ source: [0xBF5A], NFC: [0xBF5A], NFD: [0x1108, 0x1169, 0x11C1], NFKC: [0xBF5A], NFKD: [0x1108, 0x1169, 0x11C1] }, +{ source: [0xBF5B], NFC: [0xBF5B], NFD: [0x1108, 0x1169, 0x11C2], NFKC: [0xBF5B], NFKD: [0x1108, 0x1169, 0x11C2] }, +{ source: [0xBF5C], NFC: [0xBF5C], NFD: [0x1108, 0x116A], NFKC: [0xBF5C], NFKD: [0x1108, 0x116A] }, +{ source: [0xBF5D], NFC: [0xBF5D], NFD: [0x1108, 0x116A, 0x11A8], NFKC: [0xBF5D], NFKD: [0x1108, 0x116A, 0x11A8] }, +{ source: [0xBF5E], NFC: [0xBF5E], NFD: [0x1108, 0x116A, 0x11A9], NFKC: [0xBF5E], NFKD: [0x1108, 0x116A, 0x11A9] }, +{ source: [0xBF5F], NFC: [0xBF5F], NFD: [0x1108, 0x116A, 0x11AA], NFKC: [0xBF5F], NFKD: [0x1108, 0x116A, 0x11AA] }, +{ source: [0xBF60], NFC: [0xBF60], NFD: [0x1108, 0x116A, 0x11AB], NFKC: [0xBF60], NFKD: [0x1108, 0x116A, 0x11AB] }, +{ source: [0xBF61], NFC: [0xBF61], NFD: [0x1108, 0x116A, 0x11AC], NFKC: [0xBF61], NFKD: [0x1108, 0x116A, 0x11AC] }, +{ source: [0xBF62], NFC: [0xBF62], NFD: [0x1108, 0x116A, 0x11AD], NFKC: [0xBF62], NFKD: [0x1108, 0x116A, 0x11AD] }, +{ source: [0xBF63], NFC: [0xBF63], NFD: [0x1108, 0x116A, 0x11AE], NFKC: [0xBF63], NFKD: [0x1108, 0x116A, 0x11AE] }, +{ source: [0xBF64], NFC: [0xBF64], NFD: [0x1108, 0x116A, 0x11AF], NFKC: [0xBF64], NFKD: [0x1108, 0x116A, 0x11AF] }, +{ source: [0xBF65], NFC: [0xBF65], NFD: [0x1108, 0x116A, 0x11B0], NFKC: [0xBF65], NFKD: [0x1108, 0x116A, 0x11B0] }, +{ source: [0xBF66], NFC: [0xBF66], NFD: [0x1108, 0x116A, 0x11B1], NFKC: [0xBF66], NFKD: [0x1108, 0x116A, 0x11B1] }, +{ source: [0xBF67], NFC: [0xBF67], NFD: [0x1108, 0x116A, 0x11B2], NFKC: [0xBF67], NFKD: [0x1108, 0x116A, 0x11B2] }, +{ source: [0xBF68], NFC: [0xBF68], NFD: [0x1108, 0x116A, 0x11B3], NFKC: [0xBF68], NFKD: [0x1108, 0x116A, 0x11B3] }, +{ source: [0xBF69], NFC: [0xBF69], NFD: [0x1108, 0x116A, 0x11B4], NFKC: [0xBF69], NFKD: [0x1108, 0x116A, 0x11B4] }, +{ source: [0xBF6A], NFC: [0xBF6A], NFD: [0x1108, 0x116A, 0x11B5], NFKC: [0xBF6A], NFKD: [0x1108, 0x116A, 0x11B5] }, +{ source: [0xBF6B], NFC: [0xBF6B], NFD: [0x1108, 0x116A, 0x11B6], NFKC: [0xBF6B], NFKD: [0x1108, 0x116A, 0x11B6] }, +{ source: [0xBF6C], NFC: [0xBF6C], NFD: [0x1108, 0x116A, 0x11B7], NFKC: [0xBF6C], NFKD: [0x1108, 0x116A, 0x11B7] }, +{ source: [0xBF6D], NFC: [0xBF6D], NFD: [0x1108, 0x116A, 0x11B8], NFKC: [0xBF6D], NFKD: [0x1108, 0x116A, 0x11B8] }, +{ source: [0xBF6E], NFC: [0xBF6E], NFD: [0x1108, 0x116A, 0x11B9], NFKC: [0xBF6E], NFKD: [0x1108, 0x116A, 0x11B9] }, +{ source: [0xBF6F], NFC: [0xBF6F], NFD: [0x1108, 0x116A, 0x11BA], NFKC: [0xBF6F], NFKD: [0x1108, 0x116A, 0x11BA] }, +{ source: [0xBF70], NFC: [0xBF70], NFD: [0x1108, 0x116A, 0x11BB], NFKC: [0xBF70], NFKD: [0x1108, 0x116A, 0x11BB] }, +{ source: [0xBF71], NFC: [0xBF71], NFD: [0x1108, 0x116A, 0x11BC], NFKC: [0xBF71], NFKD: [0x1108, 0x116A, 0x11BC] }, +{ source: [0xBF72], NFC: [0xBF72], NFD: [0x1108, 0x116A, 0x11BD], NFKC: [0xBF72], NFKD: [0x1108, 0x116A, 0x11BD] }, +{ source: [0xBF73], NFC: [0xBF73], NFD: [0x1108, 0x116A, 0x11BE], NFKC: [0xBF73], NFKD: [0x1108, 0x116A, 0x11BE] }, +{ source: [0xBF74], NFC: [0xBF74], NFD: [0x1108, 0x116A, 0x11BF], NFKC: [0xBF74], NFKD: [0x1108, 0x116A, 0x11BF] }, +{ source: [0xBF75], NFC: [0xBF75], NFD: [0x1108, 0x116A, 0x11C0], NFKC: [0xBF75], NFKD: [0x1108, 0x116A, 0x11C0] }, +{ source: [0xBF76], NFC: [0xBF76], NFD: [0x1108, 0x116A, 0x11C1], NFKC: [0xBF76], NFKD: [0x1108, 0x116A, 0x11C1] }, +{ source: [0xBF77], NFC: [0xBF77], NFD: [0x1108, 0x116A, 0x11C2], NFKC: [0xBF77], NFKD: [0x1108, 0x116A, 0x11C2] }, +{ source: [0xBF78], NFC: [0xBF78], NFD: [0x1108, 0x116B], NFKC: [0xBF78], NFKD: [0x1108, 0x116B] }, +{ source: [0xBF79], NFC: [0xBF79], NFD: [0x1108, 0x116B, 0x11A8], NFKC: [0xBF79], NFKD: [0x1108, 0x116B, 0x11A8] }, +{ source: [0xBF7A], NFC: [0xBF7A], NFD: [0x1108, 0x116B, 0x11A9], NFKC: [0xBF7A], NFKD: [0x1108, 0x116B, 0x11A9] }, +{ source: [0xBF7B], NFC: [0xBF7B], NFD: [0x1108, 0x116B, 0x11AA], NFKC: [0xBF7B], NFKD: [0x1108, 0x116B, 0x11AA] }, +{ source: [0xBF7C], NFC: [0xBF7C], NFD: [0x1108, 0x116B, 0x11AB], NFKC: [0xBF7C], NFKD: [0x1108, 0x116B, 0x11AB] }, +{ source: [0xBF7D], NFC: [0xBF7D], NFD: [0x1108, 0x116B, 0x11AC], NFKC: [0xBF7D], NFKD: [0x1108, 0x116B, 0x11AC] }, +{ source: [0xBF7E], NFC: [0xBF7E], NFD: [0x1108, 0x116B, 0x11AD], NFKC: [0xBF7E], NFKD: [0x1108, 0x116B, 0x11AD] }, +{ source: [0xBF7F], NFC: [0xBF7F], NFD: [0x1108, 0x116B, 0x11AE], NFKC: [0xBF7F], NFKD: [0x1108, 0x116B, 0x11AE] }, +{ source: [0xBF80], NFC: [0xBF80], NFD: [0x1108, 0x116B, 0x11AF], NFKC: [0xBF80], NFKD: [0x1108, 0x116B, 0x11AF] }, +{ source: [0xBF81], NFC: [0xBF81], NFD: [0x1108, 0x116B, 0x11B0], NFKC: [0xBF81], NFKD: [0x1108, 0x116B, 0x11B0] }, +{ source: [0xBF82], NFC: [0xBF82], NFD: [0x1108, 0x116B, 0x11B1], NFKC: [0xBF82], NFKD: [0x1108, 0x116B, 0x11B1] }, +{ source: [0xBF83], NFC: [0xBF83], NFD: [0x1108, 0x116B, 0x11B2], NFKC: [0xBF83], NFKD: [0x1108, 0x116B, 0x11B2] }, +{ source: [0xBF84], NFC: [0xBF84], NFD: [0x1108, 0x116B, 0x11B3], NFKC: [0xBF84], NFKD: [0x1108, 0x116B, 0x11B3] }, +{ source: [0xBF85], NFC: [0xBF85], NFD: [0x1108, 0x116B, 0x11B4], NFKC: [0xBF85], NFKD: [0x1108, 0x116B, 0x11B4] }, +{ source: [0xBF86], NFC: [0xBF86], NFD: [0x1108, 0x116B, 0x11B5], NFKC: [0xBF86], NFKD: [0x1108, 0x116B, 0x11B5] }, +{ source: [0xBF87], NFC: [0xBF87], NFD: [0x1108, 0x116B, 0x11B6], NFKC: [0xBF87], NFKD: [0x1108, 0x116B, 0x11B6] }, +{ source: [0xBF88], NFC: [0xBF88], NFD: [0x1108, 0x116B, 0x11B7], NFKC: [0xBF88], NFKD: [0x1108, 0x116B, 0x11B7] }, +{ source: [0xBF89], NFC: [0xBF89], NFD: [0x1108, 0x116B, 0x11B8], NFKC: [0xBF89], NFKD: [0x1108, 0x116B, 0x11B8] }, +{ source: [0xBF8A], NFC: [0xBF8A], NFD: [0x1108, 0x116B, 0x11B9], NFKC: [0xBF8A], NFKD: [0x1108, 0x116B, 0x11B9] }, +{ source: [0xBF8B], NFC: [0xBF8B], NFD: [0x1108, 0x116B, 0x11BA], NFKC: [0xBF8B], NFKD: [0x1108, 0x116B, 0x11BA] }, +{ source: [0xBF8C], NFC: [0xBF8C], NFD: [0x1108, 0x116B, 0x11BB], NFKC: [0xBF8C], NFKD: [0x1108, 0x116B, 0x11BB] }, +{ source: [0xBF8D], NFC: [0xBF8D], NFD: [0x1108, 0x116B, 0x11BC], NFKC: [0xBF8D], NFKD: [0x1108, 0x116B, 0x11BC] }, +{ source: [0xBF8E], NFC: [0xBF8E], NFD: [0x1108, 0x116B, 0x11BD], NFKC: [0xBF8E], NFKD: [0x1108, 0x116B, 0x11BD] }, +{ source: [0xBF8F], NFC: [0xBF8F], NFD: [0x1108, 0x116B, 0x11BE], NFKC: [0xBF8F], NFKD: [0x1108, 0x116B, 0x11BE] }, +{ source: [0xBF90], NFC: [0xBF90], NFD: [0x1108, 0x116B, 0x11BF], NFKC: [0xBF90], NFKD: [0x1108, 0x116B, 0x11BF] }, +{ source: [0xBF91], NFC: [0xBF91], NFD: [0x1108, 0x116B, 0x11C0], NFKC: [0xBF91], NFKD: [0x1108, 0x116B, 0x11C0] }, +{ source: [0xBF92], NFC: [0xBF92], NFD: [0x1108, 0x116B, 0x11C1], NFKC: [0xBF92], NFKD: [0x1108, 0x116B, 0x11C1] }, +{ source: [0xBF93], NFC: [0xBF93], NFD: [0x1108, 0x116B, 0x11C2], NFKC: [0xBF93], NFKD: [0x1108, 0x116B, 0x11C2] }, +{ source: [0xBF94], NFC: [0xBF94], NFD: [0x1108, 0x116C], NFKC: [0xBF94], NFKD: [0x1108, 0x116C] }, +{ source: [0xBF95], NFC: [0xBF95], NFD: [0x1108, 0x116C, 0x11A8], NFKC: [0xBF95], NFKD: [0x1108, 0x116C, 0x11A8] }, +{ source: [0xBF96], NFC: [0xBF96], NFD: [0x1108, 0x116C, 0x11A9], NFKC: [0xBF96], NFKD: [0x1108, 0x116C, 0x11A9] }, +{ source: [0xBF97], NFC: [0xBF97], NFD: [0x1108, 0x116C, 0x11AA], NFKC: [0xBF97], NFKD: [0x1108, 0x116C, 0x11AA] }, +{ source: [0xBF98], NFC: [0xBF98], NFD: [0x1108, 0x116C, 0x11AB], NFKC: [0xBF98], NFKD: [0x1108, 0x116C, 0x11AB] }, +{ source: [0xBF99], NFC: [0xBF99], NFD: [0x1108, 0x116C, 0x11AC], NFKC: [0xBF99], NFKD: [0x1108, 0x116C, 0x11AC] }, +{ source: [0xBF9A], NFC: [0xBF9A], NFD: [0x1108, 0x116C, 0x11AD], NFKC: [0xBF9A], NFKD: [0x1108, 0x116C, 0x11AD] }, +{ source: [0xBF9B], NFC: [0xBF9B], NFD: [0x1108, 0x116C, 0x11AE], NFKC: [0xBF9B], NFKD: [0x1108, 0x116C, 0x11AE] }, +{ source: [0xBF9C], NFC: [0xBF9C], NFD: [0x1108, 0x116C, 0x11AF], NFKC: [0xBF9C], NFKD: [0x1108, 0x116C, 0x11AF] }, +{ source: [0xBF9D], NFC: [0xBF9D], NFD: [0x1108, 0x116C, 0x11B0], NFKC: [0xBF9D], NFKD: [0x1108, 0x116C, 0x11B0] }, +{ source: [0xBF9E], NFC: [0xBF9E], NFD: [0x1108, 0x116C, 0x11B1], NFKC: [0xBF9E], NFKD: [0x1108, 0x116C, 0x11B1] }, +{ source: [0xBF9F], NFC: [0xBF9F], NFD: [0x1108, 0x116C, 0x11B2], NFKC: [0xBF9F], NFKD: [0x1108, 0x116C, 0x11B2] }, +{ source: [0xBFA0], NFC: [0xBFA0], NFD: [0x1108, 0x116C, 0x11B3], NFKC: [0xBFA0], NFKD: [0x1108, 0x116C, 0x11B3] }, +{ source: [0xBFA1], NFC: [0xBFA1], NFD: [0x1108, 0x116C, 0x11B4], NFKC: [0xBFA1], NFKD: [0x1108, 0x116C, 0x11B4] }, +{ source: [0xBFA2], NFC: [0xBFA2], NFD: [0x1108, 0x116C, 0x11B5], NFKC: [0xBFA2], NFKD: [0x1108, 0x116C, 0x11B5] }, +{ source: [0xBFA3], NFC: [0xBFA3], NFD: [0x1108, 0x116C, 0x11B6], NFKC: [0xBFA3], NFKD: [0x1108, 0x116C, 0x11B6] }, +{ source: [0xBFA4], NFC: [0xBFA4], NFD: [0x1108, 0x116C, 0x11B7], NFKC: [0xBFA4], NFKD: [0x1108, 0x116C, 0x11B7] }, +{ source: [0xBFA5], NFC: [0xBFA5], NFD: [0x1108, 0x116C, 0x11B8], NFKC: [0xBFA5], NFKD: [0x1108, 0x116C, 0x11B8] }, +{ source: [0xBFA6], NFC: [0xBFA6], NFD: [0x1108, 0x116C, 0x11B9], NFKC: [0xBFA6], NFKD: [0x1108, 0x116C, 0x11B9] }, +{ source: [0xBFA7], NFC: [0xBFA7], NFD: [0x1108, 0x116C, 0x11BA], NFKC: [0xBFA7], NFKD: [0x1108, 0x116C, 0x11BA] }, +{ source: [0xBFA8], NFC: [0xBFA8], NFD: [0x1108, 0x116C, 0x11BB], NFKC: [0xBFA8], NFKD: [0x1108, 0x116C, 0x11BB] }, +{ source: [0xBFA9], NFC: [0xBFA9], NFD: [0x1108, 0x116C, 0x11BC], NFKC: [0xBFA9], NFKD: [0x1108, 0x116C, 0x11BC] }, +{ source: [0xBFAA], NFC: [0xBFAA], NFD: [0x1108, 0x116C, 0x11BD], NFKC: [0xBFAA], NFKD: [0x1108, 0x116C, 0x11BD] }, +{ source: [0xBFAB], NFC: [0xBFAB], NFD: [0x1108, 0x116C, 0x11BE], NFKC: [0xBFAB], NFKD: [0x1108, 0x116C, 0x11BE] }, +{ source: [0xBFAC], NFC: [0xBFAC], NFD: [0x1108, 0x116C, 0x11BF], NFKC: [0xBFAC], NFKD: [0x1108, 0x116C, 0x11BF] }, +{ source: [0xBFAD], NFC: [0xBFAD], NFD: [0x1108, 0x116C, 0x11C0], NFKC: [0xBFAD], NFKD: [0x1108, 0x116C, 0x11C0] }, +{ source: [0xBFAE], NFC: [0xBFAE], NFD: [0x1108, 0x116C, 0x11C1], NFKC: [0xBFAE], NFKD: [0x1108, 0x116C, 0x11C1] }, +{ source: [0xBFAF], NFC: [0xBFAF], NFD: [0x1108, 0x116C, 0x11C2], NFKC: [0xBFAF], NFKD: [0x1108, 0x116C, 0x11C2] }, +{ source: [0xBFB0], NFC: [0xBFB0], NFD: [0x1108, 0x116D], NFKC: [0xBFB0], NFKD: [0x1108, 0x116D] }, +{ source: [0xBFB1], NFC: [0xBFB1], NFD: [0x1108, 0x116D, 0x11A8], NFKC: [0xBFB1], NFKD: [0x1108, 0x116D, 0x11A8] }, +{ source: [0xBFB2], NFC: [0xBFB2], NFD: [0x1108, 0x116D, 0x11A9], NFKC: [0xBFB2], NFKD: [0x1108, 0x116D, 0x11A9] }, +{ source: [0xBFB3], NFC: [0xBFB3], NFD: [0x1108, 0x116D, 0x11AA], NFKC: [0xBFB3], NFKD: [0x1108, 0x116D, 0x11AA] }, +{ source: [0xBFB4], NFC: [0xBFB4], NFD: [0x1108, 0x116D, 0x11AB], NFKC: [0xBFB4], NFKD: [0x1108, 0x116D, 0x11AB] }, +{ source: [0xBFB5], NFC: [0xBFB5], NFD: [0x1108, 0x116D, 0x11AC], NFKC: [0xBFB5], NFKD: [0x1108, 0x116D, 0x11AC] }, +{ source: [0xBFB6], NFC: [0xBFB6], NFD: [0x1108, 0x116D, 0x11AD], NFKC: [0xBFB6], NFKD: [0x1108, 0x116D, 0x11AD] }, +{ source: [0xBFB7], NFC: [0xBFB7], NFD: [0x1108, 0x116D, 0x11AE], NFKC: [0xBFB7], NFKD: [0x1108, 0x116D, 0x11AE] }, +{ source: [0xBFB8], NFC: [0xBFB8], NFD: [0x1108, 0x116D, 0x11AF], NFKC: [0xBFB8], NFKD: [0x1108, 0x116D, 0x11AF] }, +{ source: [0xBFB9], NFC: [0xBFB9], NFD: [0x1108, 0x116D, 0x11B0], NFKC: [0xBFB9], NFKD: [0x1108, 0x116D, 0x11B0] }, +{ source: [0xBFBA], NFC: [0xBFBA], NFD: [0x1108, 0x116D, 0x11B1], NFKC: [0xBFBA], NFKD: [0x1108, 0x116D, 0x11B1] }, +{ source: [0xBFBB], NFC: [0xBFBB], NFD: [0x1108, 0x116D, 0x11B2], NFKC: [0xBFBB], NFKD: [0x1108, 0x116D, 0x11B2] }, +{ source: [0xBFBC], NFC: [0xBFBC], NFD: [0x1108, 0x116D, 0x11B3], NFKC: [0xBFBC], NFKD: [0x1108, 0x116D, 0x11B3] }, +{ source: [0xBFBD], NFC: [0xBFBD], NFD: [0x1108, 0x116D, 0x11B4], NFKC: [0xBFBD], NFKD: [0x1108, 0x116D, 0x11B4] }, +{ source: [0xBFBE], NFC: [0xBFBE], NFD: [0x1108, 0x116D, 0x11B5], NFKC: [0xBFBE], NFKD: [0x1108, 0x116D, 0x11B5] }, +{ source: [0xBFBF], NFC: [0xBFBF], NFD: [0x1108, 0x116D, 0x11B6], NFKC: [0xBFBF], NFKD: [0x1108, 0x116D, 0x11B6] }, +{ source: [0xBFC0], NFC: [0xBFC0], NFD: [0x1108, 0x116D, 0x11B7], NFKC: [0xBFC0], NFKD: [0x1108, 0x116D, 0x11B7] }, +{ source: [0xBFC1], NFC: [0xBFC1], NFD: [0x1108, 0x116D, 0x11B8], NFKC: [0xBFC1], NFKD: [0x1108, 0x116D, 0x11B8] }, +{ source: [0xBFC2], NFC: [0xBFC2], NFD: [0x1108, 0x116D, 0x11B9], NFKC: [0xBFC2], NFKD: [0x1108, 0x116D, 0x11B9] }, +{ source: [0xBFC3], NFC: [0xBFC3], NFD: [0x1108, 0x116D, 0x11BA], NFKC: [0xBFC3], NFKD: [0x1108, 0x116D, 0x11BA] }, +{ source: [0xBFC4], NFC: [0xBFC4], NFD: [0x1108, 0x116D, 0x11BB], NFKC: [0xBFC4], NFKD: [0x1108, 0x116D, 0x11BB] }, +{ source: [0xBFC5], NFC: [0xBFC5], NFD: [0x1108, 0x116D, 0x11BC], NFKC: [0xBFC5], NFKD: [0x1108, 0x116D, 0x11BC] }, +{ source: [0xBFC6], NFC: [0xBFC6], NFD: [0x1108, 0x116D, 0x11BD], NFKC: [0xBFC6], NFKD: [0x1108, 0x116D, 0x11BD] }, +{ source: [0xBFC7], NFC: [0xBFC7], NFD: [0x1108, 0x116D, 0x11BE], NFKC: [0xBFC7], NFKD: [0x1108, 0x116D, 0x11BE] }, +{ source: [0xBFC8], NFC: [0xBFC8], NFD: [0x1108, 0x116D, 0x11BF], NFKC: [0xBFC8], NFKD: [0x1108, 0x116D, 0x11BF] }, +{ source: [0xBFC9], NFC: [0xBFC9], NFD: [0x1108, 0x116D, 0x11C0], NFKC: [0xBFC9], NFKD: [0x1108, 0x116D, 0x11C0] }, +{ source: [0xBFCA], NFC: [0xBFCA], NFD: [0x1108, 0x116D, 0x11C1], NFKC: [0xBFCA], NFKD: [0x1108, 0x116D, 0x11C1] }, +{ source: [0xBFCB], NFC: [0xBFCB], NFD: [0x1108, 0x116D, 0x11C2], NFKC: [0xBFCB], NFKD: [0x1108, 0x116D, 0x11C2] }, +{ source: [0xBFCC], NFC: [0xBFCC], NFD: [0x1108, 0x116E], NFKC: [0xBFCC], NFKD: [0x1108, 0x116E] }, +{ source: [0xBFCD], NFC: [0xBFCD], NFD: [0x1108, 0x116E, 0x11A8], NFKC: [0xBFCD], NFKD: [0x1108, 0x116E, 0x11A8] }, +{ source: [0xBFCE], NFC: [0xBFCE], NFD: [0x1108, 0x116E, 0x11A9], NFKC: [0xBFCE], NFKD: [0x1108, 0x116E, 0x11A9] }, +{ source: [0xBFCF], NFC: [0xBFCF], NFD: [0x1108, 0x116E, 0x11AA], NFKC: [0xBFCF], NFKD: [0x1108, 0x116E, 0x11AA] }, +{ source: [0xBFD0], NFC: [0xBFD0], NFD: [0x1108, 0x116E, 0x11AB], NFKC: [0xBFD0], NFKD: [0x1108, 0x116E, 0x11AB] }, +{ source: [0xBFD1], NFC: [0xBFD1], NFD: [0x1108, 0x116E, 0x11AC], NFKC: [0xBFD1], NFKD: [0x1108, 0x116E, 0x11AC] }, +{ source: [0xBFD2], NFC: [0xBFD2], NFD: [0x1108, 0x116E, 0x11AD], NFKC: [0xBFD2], NFKD: [0x1108, 0x116E, 0x11AD] }, +{ source: [0xBFD3], NFC: [0xBFD3], NFD: [0x1108, 0x116E, 0x11AE], NFKC: [0xBFD3], NFKD: [0x1108, 0x116E, 0x11AE] }, +{ source: [0xBFD4], NFC: [0xBFD4], NFD: [0x1108, 0x116E, 0x11AF], NFKC: [0xBFD4], NFKD: [0x1108, 0x116E, 0x11AF] }, +{ source: [0xBFD5], NFC: [0xBFD5], NFD: [0x1108, 0x116E, 0x11B0], NFKC: [0xBFD5], NFKD: [0x1108, 0x116E, 0x11B0] }, +{ source: [0xBFD6], NFC: [0xBFD6], NFD: [0x1108, 0x116E, 0x11B1], NFKC: [0xBFD6], NFKD: [0x1108, 0x116E, 0x11B1] }, +{ source: [0xBFD7], NFC: [0xBFD7], NFD: [0x1108, 0x116E, 0x11B2], NFKC: [0xBFD7], NFKD: [0x1108, 0x116E, 0x11B2] }, +{ source: [0xBFD8], NFC: [0xBFD8], NFD: [0x1108, 0x116E, 0x11B3], NFKC: [0xBFD8], NFKD: [0x1108, 0x116E, 0x11B3] }, +{ source: [0xBFD9], NFC: [0xBFD9], NFD: [0x1108, 0x116E, 0x11B4], NFKC: [0xBFD9], NFKD: [0x1108, 0x116E, 0x11B4] }, +{ source: [0xBFDA], NFC: [0xBFDA], NFD: [0x1108, 0x116E, 0x11B5], NFKC: [0xBFDA], NFKD: [0x1108, 0x116E, 0x11B5] }, +{ source: [0xBFDB], NFC: [0xBFDB], NFD: [0x1108, 0x116E, 0x11B6], NFKC: [0xBFDB], NFKD: [0x1108, 0x116E, 0x11B6] }, +{ source: [0xBFDC], NFC: [0xBFDC], NFD: [0x1108, 0x116E, 0x11B7], NFKC: [0xBFDC], NFKD: [0x1108, 0x116E, 0x11B7] }, +{ source: [0xBFDD], NFC: [0xBFDD], NFD: [0x1108, 0x116E, 0x11B8], NFKC: [0xBFDD], NFKD: [0x1108, 0x116E, 0x11B8] }, +{ source: [0xBFDE], NFC: [0xBFDE], NFD: [0x1108, 0x116E, 0x11B9], NFKC: [0xBFDE], NFKD: [0x1108, 0x116E, 0x11B9] }, +{ source: [0xBFDF], NFC: [0xBFDF], NFD: [0x1108, 0x116E, 0x11BA], NFKC: [0xBFDF], NFKD: [0x1108, 0x116E, 0x11BA] }, +{ source: [0xBFE0], NFC: [0xBFE0], NFD: [0x1108, 0x116E, 0x11BB], NFKC: [0xBFE0], NFKD: [0x1108, 0x116E, 0x11BB] }, +{ source: [0xBFE1], NFC: [0xBFE1], NFD: [0x1108, 0x116E, 0x11BC], NFKC: [0xBFE1], NFKD: [0x1108, 0x116E, 0x11BC] }, +{ source: [0xBFE2], NFC: [0xBFE2], NFD: [0x1108, 0x116E, 0x11BD], NFKC: [0xBFE2], NFKD: [0x1108, 0x116E, 0x11BD] }, +{ source: [0xBFE3], NFC: [0xBFE3], NFD: [0x1108, 0x116E, 0x11BE], NFKC: [0xBFE3], NFKD: [0x1108, 0x116E, 0x11BE] }, +{ source: [0xBFE4], NFC: [0xBFE4], NFD: [0x1108, 0x116E, 0x11BF], NFKC: [0xBFE4], NFKD: [0x1108, 0x116E, 0x11BF] }, +{ source: [0xBFE5], NFC: [0xBFE5], NFD: [0x1108, 0x116E, 0x11C0], NFKC: [0xBFE5], NFKD: [0x1108, 0x116E, 0x11C0] }, +{ source: [0xBFE6], NFC: [0xBFE6], NFD: [0x1108, 0x116E, 0x11C1], NFKC: [0xBFE6], NFKD: [0x1108, 0x116E, 0x11C1] }, +{ source: [0xBFE7], NFC: [0xBFE7], NFD: [0x1108, 0x116E, 0x11C2], NFKC: [0xBFE7], NFKD: [0x1108, 0x116E, 0x11C2] }, +{ source: [0xBFE8], NFC: [0xBFE8], NFD: [0x1108, 0x116F], NFKC: [0xBFE8], NFKD: [0x1108, 0x116F] }, +{ source: [0xBFE9], NFC: [0xBFE9], NFD: [0x1108, 0x116F, 0x11A8], NFKC: [0xBFE9], NFKD: [0x1108, 0x116F, 0x11A8] }, +{ source: [0xBFEA], NFC: [0xBFEA], NFD: [0x1108, 0x116F, 0x11A9], NFKC: [0xBFEA], NFKD: [0x1108, 0x116F, 0x11A9] }, +{ source: [0xBFEB], NFC: [0xBFEB], NFD: [0x1108, 0x116F, 0x11AA], NFKC: [0xBFEB], NFKD: [0x1108, 0x116F, 0x11AA] }, +{ source: [0xBFEC], NFC: [0xBFEC], NFD: [0x1108, 0x116F, 0x11AB], NFKC: [0xBFEC], NFKD: [0x1108, 0x116F, 0x11AB] }, +{ source: [0xBFED], NFC: [0xBFED], NFD: [0x1108, 0x116F, 0x11AC], NFKC: [0xBFED], NFKD: [0x1108, 0x116F, 0x11AC] }, +{ source: [0xBFEE], NFC: [0xBFEE], NFD: [0x1108, 0x116F, 0x11AD], NFKC: [0xBFEE], NFKD: [0x1108, 0x116F, 0x11AD] }, +{ source: [0xBFEF], NFC: [0xBFEF], NFD: [0x1108, 0x116F, 0x11AE], NFKC: [0xBFEF], NFKD: [0x1108, 0x116F, 0x11AE] }, +{ source: [0xBFF0], NFC: [0xBFF0], NFD: [0x1108, 0x116F, 0x11AF], NFKC: [0xBFF0], NFKD: [0x1108, 0x116F, 0x11AF] }, +{ source: [0xBFF1], NFC: [0xBFF1], NFD: [0x1108, 0x116F, 0x11B0], NFKC: [0xBFF1], NFKD: [0x1108, 0x116F, 0x11B0] }, +{ source: [0xBFF2], NFC: [0xBFF2], NFD: [0x1108, 0x116F, 0x11B1], NFKC: [0xBFF2], NFKD: [0x1108, 0x116F, 0x11B1] }, +{ source: [0xBFF3], NFC: [0xBFF3], NFD: [0x1108, 0x116F, 0x11B2], NFKC: [0xBFF3], NFKD: [0x1108, 0x116F, 0x11B2] }, +{ source: [0xBFF4], NFC: [0xBFF4], NFD: [0x1108, 0x116F, 0x11B3], NFKC: [0xBFF4], NFKD: [0x1108, 0x116F, 0x11B3] }, +{ source: [0xBFF5], NFC: [0xBFF5], NFD: [0x1108, 0x116F, 0x11B4], NFKC: [0xBFF5], NFKD: [0x1108, 0x116F, 0x11B4] }, +{ source: [0xBFF6], NFC: [0xBFF6], NFD: [0x1108, 0x116F, 0x11B5], NFKC: [0xBFF6], NFKD: [0x1108, 0x116F, 0x11B5] }, +{ source: [0xBFF7], NFC: [0xBFF7], NFD: [0x1108, 0x116F, 0x11B6], NFKC: [0xBFF7], NFKD: [0x1108, 0x116F, 0x11B6] }, +{ source: [0xBFF8], NFC: [0xBFF8], NFD: [0x1108, 0x116F, 0x11B7], NFKC: [0xBFF8], NFKD: [0x1108, 0x116F, 0x11B7] }, +{ source: [0xBFF9], NFC: [0xBFF9], NFD: [0x1108, 0x116F, 0x11B8], NFKC: [0xBFF9], NFKD: [0x1108, 0x116F, 0x11B8] }, +{ source: [0xBFFA], NFC: [0xBFFA], NFD: [0x1108, 0x116F, 0x11B9], NFKC: [0xBFFA], NFKD: [0x1108, 0x116F, 0x11B9] }, +{ source: [0xBFFB], NFC: [0xBFFB], NFD: [0x1108, 0x116F, 0x11BA], NFKC: [0xBFFB], NFKD: [0x1108, 0x116F, 0x11BA] }, +{ source: [0xBFFC], NFC: [0xBFFC], NFD: [0x1108, 0x116F, 0x11BB], NFKC: [0xBFFC], NFKD: [0x1108, 0x116F, 0x11BB] }, +{ source: [0xBFFD], NFC: [0xBFFD], NFD: [0x1108, 0x116F, 0x11BC], NFKC: [0xBFFD], NFKD: [0x1108, 0x116F, 0x11BC] }, +{ source: [0xBFFE], NFC: [0xBFFE], NFD: [0x1108, 0x116F, 0x11BD], NFKC: [0xBFFE], NFKD: [0x1108, 0x116F, 0x11BD] }, +{ source: [0xBFFF], NFC: [0xBFFF], NFD: [0x1108, 0x116F, 0x11BE], NFKC: [0xBFFF], NFKD: [0x1108, 0x116F, 0x11BE] }, +{ source: [0xC000], NFC: [0xC000], NFD: [0x1108, 0x116F, 0x11BF], NFKC: [0xC000], NFKD: [0x1108, 0x116F, 0x11BF] }, +{ source: [0xC001], NFC: [0xC001], NFD: [0x1108, 0x116F, 0x11C0], NFKC: [0xC001], NFKD: [0x1108, 0x116F, 0x11C0] }, +{ source: [0xC002], NFC: [0xC002], NFD: [0x1108, 0x116F, 0x11C1], NFKC: [0xC002], NFKD: [0x1108, 0x116F, 0x11C1] }, +{ source: [0xC003], NFC: [0xC003], NFD: [0x1108, 0x116F, 0x11C2], NFKC: [0xC003], NFKD: [0x1108, 0x116F, 0x11C2] }, +{ source: [0xC004], NFC: [0xC004], NFD: [0x1108, 0x1170], NFKC: [0xC004], NFKD: [0x1108, 0x1170] }, +{ source: [0xC005], NFC: [0xC005], NFD: [0x1108, 0x1170, 0x11A8], NFKC: [0xC005], NFKD: [0x1108, 0x1170, 0x11A8] }, +{ source: [0xC006], NFC: [0xC006], NFD: [0x1108, 0x1170, 0x11A9], NFKC: [0xC006], NFKD: [0x1108, 0x1170, 0x11A9] }, +{ source: [0xC007], NFC: [0xC007], NFD: [0x1108, 0x1170, 0x11AA], NFKC: [0xC007], NFKD: [0x1108, 0x1170, 0x11AA] }, +{ source: [0xC008], NFC: [0xC008], NFD: [0x1108, 0x1170, 0x11AB], NFKC: [0xC008], NFKD: [0x1108, 0x1170, 0x11AB] }, +{ source: [0xC009], NFC: [0xC009], NFD: [0x1108, 0x1170, 0x11AC], NFKC: [0xC009], NFKD: [0x1108, 0x1170, 0x11AC] }, +{ source: [0xC00A], NFC: [0xC00A], NFD: [0x1108, 0x1170, 0x11AD], NFKC: [0xC00A], NFKD: [0x1108, 0x1170, 0x11AD] }, +{ source: [0xC00B], NFC: [0xC00B], NFD: [0x1108, 0x1170, 0x11AE], NFKC: [0xC00B], NFKD: [0x1108, 0x1170, 0x11AE] }, +{ source: [0xC00C], NFC: [0xC00C], NFD: [0x1108, 0x1170, 0x11AF], NFKC: [0xC00C], NFKD: [0x1108, 0x1170, 0x11AF] }, +{ source: [0xC00D], NFC: [0xC00D], NFD: [0x1108, 0x1170, 0x11B0], NFKC: [0xC00D], NFKD: [0x1108, 0x1170, 0x11B0] }, +{ source: [0xC00E], NFC: [0xC00E], NFD: [0x1108, 0x1170, 0x11B1], NFKC: [0xC00E], NFKD: [0x1108, 0x1170, 0x11B1] }, +{ source: [0xC00F], NFC: [0xC00F], NFD: [0x1108, 0x1170, 0x11B2], NFKC: [0xC00F], NFKD: [0x1108, 0x1170, 0x11B2] }, +{ source: [0xC010], NFC: [0xC010], NFD: [0x1108, 0x1170, 0x11B3], NFKC: [0xC010], NFKD: [0x1108, 0x1170, 0x11B3] }, +{ source: [0xC011], NFC: [0xC011], NFD: [0x1108, 0x1170, 0x11B4], NFKC: [0xC011], NFKD: [0x1108, 0x1170, 0x11B4] }, +{ source: [0xC012], NFC: [0xC012], NFD: [0x1108, 0x1170, 0x11B5], NFKC: [0xC012], NFKD: [0x1108, 0x1170, 0x11B5] }, +{ source: [0xC013], NFC: [0xC013], NFD: [0x1108, 0x1170, 0x11B6], NFKC: [0xC013], NFKD: [0x1108, 0x1170, 0x11B6] }, +{ source: [0xC014], NFC: [0xC014], NFD: [0x1108, 0x1170, 0x11B7], NFKC: [0xC014], NFKD: [0x1108, 0x1170, 0x11B7] }, +{ source: [0xC015], NFC: [0xC015], NFD: [0x1108, 0x1170, 0x11B8], NFKC: [0xC015], NFKD: [0x1108, 0x1170, 0x11B8] }, +{ source: [0xC016], NFC: [0xC016], NFD: [0x1108, 0x1170, 0x11B9], NFKC: [0xC016], NFKD: [0x1108, 0x1170, 0x11B9] }, +{ source: [0xC017], NFC: [0xC017], NFD: [0x1108, 0x1170, 0x11BA], NFKC: [0xC017], NFKD: [0x1108, 0x1170, 0x11BA] }, +{ source: [0xC018], NFC: [0xC018], NFD: [0x1108, 0x1170, 0x11BB], NFKC: [0xC018], NFKD: [0x1108, 0x1170, 0x11BB] }, +{ source: [0xC019], NFC: [0xC019], NFD: [0x1108, 0x1170, 0x11BC], NFKC: [0xC019], NFKD: [0x1108, 0x1170, 0x11BC] }, +{ source: [0xC01A], NFC: [0xC01A], NFD: [0x1108, 0x1170, 0x11BD], NFKC: [0xC01A], NFKD: [0x1108, 0x1170, 0x11BD] }, +{ source: [0xC01B], NFC: [0xC01B], NFD: [0x1108, 0x1170, 0x11BE], NFKC: [0xC01B], NFKD: [0x1108, 0x1170, 0x11BE] }, +{ source: [0xC01C], NFC: [0xC01C], NFD: [0x1108, 0x1170, 0x11BF], NFKC: [0xC01C], NFKD: [0x1108, 0x1170, 0x11BF] }, +{ source: [0xC01D], NFC: [0xC01D], NFD: [0x1108, 0x1170, 0x11C0], NFKC: [0xC01D], NFKD: [0x1108, 0x1170, 0x11C0] }, +{ source: [0xC01E], NFC: [0xC01E], NFD: [0x1108, 0x1170, 0x11C1], NFKC: [0xC01E], NFKD: [0x1108, 0x1170, 0x11C1] }, +{ source: [0xC01F], NFC: [0xC01F], NFD: [0x1108, 0x1170, 0x11C2], NFKC: [0xC01F], NFKD: [0x1108, 0x1170, 0x11C2] }, +{ source: [0xC020], NFC: [0xC020], NFD: [0x1108, 0x1171], NFKC: [0xC020], NFKD: [0x1108, 0x1171] }, +{ source: [0xC021], NFC: [0xC021], NFD: [0x1108, 0x1171, 0x11A8], NFKC: [0xC021], NFKD: [0x1108, 0x1171, 0x11A8] }, +{ source: [0xC022], NFC: [0xC022], NFD: [0x1108, 0x1171, 0x11A9], NFKC: [0xC022], NFKD: [0x1108, 0x1171, 0x11A9] }, +{ source: [0xC023], NFC: [0xC023], NFD: [0x1108, 0x1171, 0x11AA], NFKC: [0xC023], NFKD: [0x1108, 0x1171, 0x11AA] }, +{ source: [0xC024], NFC: [0xC024], NFD: [0x1108, 0x1171, 0x11AB], NFKC: [0xC024], NFKD: [0x1108, 0x1171, 0x11AB] }, +{ source: [0xC025], NFC: [0xC025], NFD: [0x1108, 0x1171, 0x11AC], NFKC: [0xC025], NFKD: [0x1108, 0x1171, 0x11AC] }, +{ source: [0xC026], NFC: [0xC026], NFD: [0x1108, 0x1171, 0x11AD], NFKC: [0xC026], NFKD: [0x1108, 0x1171, 0x11AD] }, +{ source: [0xC027], NFC: [0xC027], NFD: [0x1108, 0x1171, 0x11AE], NFKC: [0xC027], NFKD: [0x1108, 0x1171, 0x11AE] }, +{ source: [0xC028], NFC: [0xC028], NFD: [0x1108, 0x1171, 0x11AF], NFKC: [0xC028], NFKD: [0x1108, 0x1171, 0x11AF] }, +{ source: [0xC029], NFC: [0xC029], NFD: [0x1108, 0x1171, 0x11B0], NFKC: [0xC029], NFKD: [0x1108, 0x1171, 0x11B0] }, +{ source: [0xC02A], NFC: [0xC02A], NFD: [0x1108, 0x1171, 0x11B1], NFKC: [0xC02A], NFKD: [0x1108, 0x1171, 0x11B1] }, +{ source: [0xC02B], NFC: [0xC02B], NFD: [0x1108, 0x1171, 0x11B2], NFKC: [0xC02B], NFKD: [0x1108, 0x1171, 0x11B2] }, +{ source: [0xC02C], NFC: [0xC02C], NFD: [0x1108, 0x1171, 0x11B3], NFKC: [0xC02C], NFKD: [0x1108, 0x1171, 0x11B3] }, +{ source: [0xC02D], NFC: [0xC02D], NFD: [0x1108, 0x1171, 0x11B4], NFKC: [0xC02D], NFKD: [0x1108, 0x1171, 0x11B4] }, +{ source: [0xC02E], NFC: [0xC02E], NFD: [0x1108, 0x1171, 0x11B5], NFKC: [0xC02E], NFKD: [0x1108, 0x1171, 0x11B5] }, +{ source: [0xC02F], NFC: [0xC02F], NFD: [0x1108, 0x1171, 0x11B6], NFKC: [0xC02F], NFKD: [0x1108, 0x1171, 0x11B6] }, +{ source: [0xC030], NFC: [0xC030], NFD: [0x1108, 0x1171, 0x11B7], NFKC: [0xC030], NFKD: [0x1108, 0x1171, 0x11B7] }, +{ source: [0xC031], NFC: [0xC031], NFD: [0x1108, 0x1171, 0x11B8], NFKC: [0xC031], NFKD: [0x1108, 0x1171, 0x11B8] }, +{ source: [0xC032], NFC: [0xC032], NFD: [0x1108, 0x1171, 0x11B9], NFKC: [0xC032], NFKD: [0x1108, 0x1171, 0x11B9] }, +{ source: [0xC033], NFC: [0xC033], NFD: [0x1108, 0x1171, 0x11BA], NFKC: [0xC033], NFKD: [0x1108, 0x1171, 0x11BA] }, +{ source: [0xC034], NFC: [0xC034], NFD: [0x1108, 0x1171, 0x11BB], NFKC: [0xC034], NFKD: [0x1108, 0x1171, 0x11BB] }, +{ source: [0xC035], NFC: [0xC035], NFD: [0x1108, 0x1171, 0x11BC], NFKC: [0xC035], NFKD: [0x1108, 0x1171, 0x11BC] }, +{ source: [0xC036], NFC: [0xC036], NFD: [0x1108, 0x1171, 0x11BD], NFKC: [0xC036], NFKD: [0x1108, 0x1171, 0x11BD] }, +{ source: [0xC037], NFC: [0xC037], NFD: [0x1108, 0x1171, 0x11BE], NFKC: [0xC037], NFKD: [0x1108, 0x1171, 0x11BE] }, +{ source: [0xC038], NFC: [0xC038], NFD: [0x1108, 0x1171, 0x11BF], NFKC: [0xC038], NFKD: [0x1108, 0x1171, 0x11BF] }, +{ source: [0xC039], NFC: [0xC039], NFD: [0x1108, 0x1171, 0x11C0], NFKC: [0xC039], NFKD: [0x1108, 0x1171, 0x11C0] }, +{ source: [0xC03A], NFC: [0xC03A], NFD: [0x1108, 0x1171, 0x11C1], NFKC: [0xC03A], NFKD: [0x1108, 0x1171, 0x11C1] }, +{ source: [0xC03B], NFC: [0xC03B], NFD: [0x1108, 0x1171, 0x11C2], NFKC: [0xC03B], NFKD: [0x1108, 0x1171, 0x11C2] }, +{ source: [0xC03C], NFC: [0xC03C], NFD: [0x1108, 0x1172], NFKC: [0xC03C], NFKD: [0x1108, 0x1172] }, +{ source: [0xC03D], NFC: [0xC03D], NFD: [0x1108, 0x1172, 0x11A8], NFKC: [0xC03D], NFKD: [0x1108, 0x1172, 0x11A8] }, +{ source: [0xC03E], NFC: [0xC03E], NFD: [0x1108, 0x1172, 0x11A9], NFKC: [0xC03E], NFKD: [0x1108, 0x1172, 0x11A9] }, +{ source: [0xC03F], NFC: [0xC03F], NFD: [0x1108, 0x1172, 0x11AA], NFKC: [0xC03F], NFKD: [0x1108, 0x1172, 0x11AA] }, +{ source: [0xC040], NFC: [0xC040], NFD: [0x1108, 0x1172, 0x11AB], NFKC: [0xC040], NFKD: [0x1108, 0x1172, 0x11AB] }, +{ source: [0xC041], NFC: [0xC041], NFD: [0x1108, 0x1172, 0x11AC], NFKC: [0xC041], NFKD: [0x1108, 0x1172, 0x11AC] }, +{ source: [0xC042], NFC: [0xC042], NFD: [0x1108, 0x1172, 0x11AD], NFKC: [0xC042], NFKD: [0x1108, 0x1172, 0x11AD] }, +{ source: [0xC043], NFC: [0xC043], NFD: [0x1108, 0x1172, 0x11AE], NFKC: [0xC043], NFKD: [0x1108, 0x1172, 0x11AE] }, +{ source: [0xC044], NFC: [0xC044], NFD: [0x1108, 0x1172, 0x11AF], NFKC: [0xC044], NFKD: [0x1108, 0x1172, 0x11AF] }, +{ source: [0xC045], NFC: [0xC045], NFD: [0x1108, 0x1172, 0x11B0], NFKC: [0xC045], NFKD: [0x1108, 0x1172, 0x11B0] }, +{ source: [0xC046], NFC: [0xC046], NFD: [0x1108, 0x1172, 0x11B1], NFKC: [0xC046], NFKD: [0x1108, 0x1172, 0x11B1] }, +{ source: [0xC047], NFC: [0xC047], NFD: [0x1108, 0x1172, 0x11B2], NFKC: [0xC047], NFKD: [0x1108, 0x1172, 0x11B2] }, +{ source: [0xC048], NFC: [0xC048], NFD: [0x1108, 0x1172, 0x11B3], NFKC: [0xC048], NFKD: [0x1108, 0x1172, 0x11B3] }, +{ source: [0xC049], NFC: [0xC049], NFD: [0x1108, 0x1172, 0x11B4], NFKC: [0xC049], NFKD: [0x1108, 0x1172, 0x11B4] }, +{ source: [0xC04A], NFC: [0xC04A], NFD: [0x1108, 0x1172, 0x11B5], NFKC: [0xC04A], NFKD: [0x1108, 0x1172, 0x11B5] }, +{ source: [0xC04B], NFC: [0xC04B], NFD: [0x1108, 0x1172, 0x11B6], NFKC: [0xC04B], NFKD: [0x1108, 0x1172, 0x11B6] }, +{ source: [0xC04C], NFC: [0xC04C], NFD: [0x1108, 0x1172, 0x11B7], NFKC: [0xC04C], NFKD: [0x1108, 0x1172, 0x11B7] }, +{ source: [0xC04D], NFC: [0xC04D], NFD: [0x1108, 0x1172, 0x11B8], NFKC: [0xC04D], NFKD: [0x1108, 0x1172, 0x11B8] }, +{ source: [0xC04E], NFC: [0xC04E], NFD: [0x1108, 0x1172, 0x11B9], NFKC: [0xC04E], NFKD: [0x1108, 0x1172, 0x11B9] }, +{ source: [0xC04F], NFC: [0xC04F], NFD: [0x1108, 0x1172, 0x11BA], NFKC: [0xC04F], NFKD: [0x1108, 0x1172, 0x11BA] }, +{ source: [0xC050], NFC: [0xC050], NFD: [0x1108, 0x1172, 0x11BB], NFKC: [0xC050], NFKD: [0x1108, 0x1172, 0x11BB] }, +{ source: [0xC051], NFC: [0xC051], NFD: [0x1108, 0x1172, 0x11BC], NFKC: [0xC051], NFKD: [0x1108, 0x1172, 0x11BC] }, +{ source: [0xC052], NFC: [0xC052], NFD: [0x1108, 0x1172, 0x11BD], NFKC: [0xC052], NFKD: [0x1108, 0x1172, 0x11BD] }, +{ source: [0xC053], NFC: [0xC053], NFD: [0x1108, 0x1172, 0x11BE], NFKC: [0xC053], NFKD: [0x1108, 0x1172, 0x11BE] }, +{ source: [0xC054], NFC: [0xC054], NFD: [0x1108, 0x1172, 0x11BF], NFKC: [0xC054], NFKD: [0x1108, 0x1172, 0x11BF] }, +{ source: [0xC055], NFC: [0xC055], NFD: [0x1108, 0x1172, 0x11C0], NFKC: [0xC055], NFKD: [0x1108, 0x1172, 0x11C0] }, +{ source: [0xC056], NFC: [0xC056], NFD: [0x1108, 0x1172, 0x11C1], NFKC: [0xC056], NFKD: [0x1108, 0x1172, 0x11C1] }, +{ source: [0xC057], NFC: [0xC057], NFD: [0x1108, 0x1172, 0x11C2], NFKC: [0xC057], NFKD: [0x1108, 0x1172, 0x11C2] }, +{ source: [0xC058], NFC: [0xC058], NFD: [0x1108, 0x1173], NFKC: [0xC058], NFKD: [0x1108, 0x1173] }, +{ source: [0xC059], NFC: [0xC059], NFD: [0x1108, 0x1173, 0x11A8], NFKC: [0xC059], NFKD: [0x1108, 0x1173, 0x11A8] }, +{ source: [0xC05A], NFC: [0xC05A], NFD: [0x1108, 0x1173, 0x11A9], NFKC: [0xC05A], NFKD: [0x1108, 0x1173, 0x11A9] }, +{ source: [0xC05B], NFC: [0xC05B], NFD: [0x1108, 0x1173, 0x11AA], NFKC: [0xC05B], NFKD: [0x1108, 0x1173, 0x11AA] }, +{ source: [0xC05C], NFC: [0xC05C], NFD: [0x1108, 0x1173, 0x11AB], NFKC: [0xC05C], NFKD: [0x1108, 0x1173, 0x11AB] }, +{ source: [0xC05D], NFC: [0xC05D], NFD: [0x1108, 0x1173, 0x11AC], NFKC: [0xC05D], NFKD: [0x1108, 0x1173, 0x11AC] }, +{ source: [0xC05E], NFC: [0xC05E], NFD: [0x1108, 0x1173, 0x11AD], NFKC: [0xC05E], NFKD: [0x1108, 0x1173, 0x11AD] }, +{ source: [0xC05F], NFC: [0xC05F], NFD: [0x1108, 0x1173, 0x11AE], NFKC: [0xC05F], NFKD: [0x1108, 0x1173, 0x11AE] }, +{ source: [0xC060], NFC: [0xC060], NFD: [0x1108, 0x1173, 0x11AF], NFKC: [0xC060], NFKD: [0x1108, 0x1173, 0x11AF] }, +{ source: [0xC061], NFC: [0xC061], NFD: [0x1108, 0x1173, 0x11B0], NFKC: [0xC061], NFKD: [0x1108, 0x1173, 0x11B0] }, +{ source: [0xC062], NFC: [0xC062], NFD: [0x1108, 0x1173, 0x11B1], NFKC: [0xC062], NFKD: [0x1108, 0x1173, 0x11B1] }, +{ source: [0xC063], NFC: [0xC063], NFD: [0x1108, 0x1173, 0x11B2], NFKC: [0xC063], NFKD: [0x1108, 0x1173, 0x11B2] }, +{ source: [0xC064], NFC: [0xC064], NFD: [0x1108, 0x1173, 0x11B3], NFKC: [0xC064], NFKD: [0x1108, 0x1173, 0x11B3] }, +{ source: [0xC065], NFC: [0xC065], NFD: [0x1108, 0x1173, 0x11B4], NFKC: [0xC065], NFKD: [0x1108, 0x1173, 0x11B4] }, +{ source: [0xC066], NFC: [0xC066], NFD: [0x1108, 0x1173, 0x11B5], NFKC: [0xC066], NFKD: [0x1108, 0x1173, 0x11B5] }, +{ source: [0xC067], NFC: [0xC067], NFD: [0x1108, 0x1173, 0x11B6], NFKC: [0xC067], NFKD: [0x1108, 0x1173, 0x11B6] }, +{ source: [0xC068], NFC: [0xC068], NFD: [0x1108, 0x1173, 0x11B7], NFKC: [0xC068], NFKD: [0x1108, 0x1173, 0x11B7] }, +{ source: [0xC069], NFC: [0xC069], NFD: [0x1108, 0x1173, 0x11B8], NFKC: [0xC069], NFKD: [0x1108, 0x1173, 0x11B8] }, +{ source: [0xC06A], NFC: [0xC06A], NFD: [0x1108, 0x1173, 0x11B9], NFKC: [0xC06A], NFKD: [0x1108, 0x1173, 0x11B9] }, +{ source: [0xC06B], NFC: [0xC06B], NFD: [0x1108, 0x1173, 0x11BA], NFKC: [0xC06B], NFKD: [0x1108, 0x1173, 0x11BA] }, +{ source: [0xC06C], NFC: [0xC06C], NFD: [0x1108, 0x1173, 0x11BB], NFKC: [0xC06C], NFKD: [0x1108, 0x1173, 0x11BB] }, +{ source: [0xC06D], NFC: [0xC06D], NFD: [0x1108, 0x1173, 0x11BC], NFKC: [0xC06D], NFKD: [0x1108, 0x1173, 0x11BC] }, +{ source: [0xC06E], NFC: [0xC06E], NFD: [0x1108, 0x1173, 0x11BD], NFKC: [0xC06E], NFKD: [0x1108, 0x1173, 0x11BD] }, +{ source: [0xC06F], NFC: [0xC06F], NFD: [0x1108, 0x1173, 0x11BE], NFKC: [0xC06F], NFKD: [0x1108, 0x1173, 0x11BE] }, +{ source: [0xC070], NFC: [0xC070], NFD: [0x1108, 0x1173, 0x11BF], NFKC: [0xC070], NFKD: [0x1108, 0x1173, 0x11BF] }, +{ source: [0xC071], NFC: [0xC071], NFD: [0x1108, 0x1173, 0x11C0], NFKC: [0xC071], NFKD: [0x1108, 0x1173, 0x11C0] }, +{ source: [0xC072], NFC: [0xC072], NFD: [0x1108, 0x1173, 0x11C1], NFKC: [0xC072], NFKD: [0x1108, 0x1173, 0x11C1] }, +{ source: [0xC073], NFC: [0xC073], NFD: [0x1108, 0x1173, 0x11C2], NFKC: [0xC073], NFKD: [0x1108, 0x1173, 0x11C2] }, +{ source: [0xC074], NFC: [0xC074], NFD: [0x1108, 0x1174], NFKC: [0xC074], NFKD: [0x1108, 0x1174] }, +{ source: [0xC075], NFC: [0xC075], NFD: [0x1108, 0x1174, 0x11A8], NFKC: [0xC075], NFKD: [0x1108, 0x1174, 0x11A8] }, +{ source: [0xC076], NFC: [0xC076], NFD: [0x1108, 0x1174, 0x11A9], NFKC: [0xC076], NFKD: [0x1108, 0x1174, 0x11A9] }, +{ source: [0xC077], NFC: [0xC077], NFD: [0x1108, 0x1174, 0x11AA], NFKC: [0xC077], NFKD: [0x1108, 0x1174, 0x11AA] }, +{ source: [0xC078], NFC: [0xC078], NFD: [0x1108, 0x1174, 0x11AB], NFKC: [0xC078], NFKD: [0x1108, 0x1174, 0x11AB] }, +{ source: [0xC079], NFC: [0xC079], NFD: [0x1108, 0x1174, 0x11AC], NFKC: [0xC079], NFKD: [0x1108, 0x1174, 0x11AC] }, +{ source: [0xC07A], NFC: [0xC07A], NFD: [0x1108, 0x1174, 0x11AD], NFKC: [0xC07A], NFKD: [0x1108, 0x1174, 0x11AD] }, +{ source: [0xC07B], NFC: [0xC07B], NFD: [0x1108, 0x1174, 0x11AE], NFKC: [0xC07B], NFKD: [0x1108, 0x1174, 0x11AE] }, +{ source: [0xC07C], NFC: [0xC07C], NFD: [0x1108, 0x1174, 0x11AF], NFKC: [0xC07C], NFKD: [0x1108, 0x1174, 0x11AF] }, +{ source: [0xC07D], NFC: [0xC07D], NFD: [0x1108, 0x1174, 0x11B0], NFKC: [0xC07D], NFKD: [0x1108, 0x1174, 0x11B0] }, +{ source: [0xC07E], NFC: [0xC07E], NFD: [0x1108, 0x1174, 0x11B1], NFKC: [0xC07E], NFKD: [0x1108, 0x1174, 0x11B1] }, +{ source: [0xC07F], NFC: [0xC07F], NFD: [0x1108, 0x1174, 0x11B2], NFKC: [0xC07F], NFKD: [0x1108, 0x1174, 0x11B2] }, +{ source: [0xC080], NFC: [0xC080], NFD: [0x1108, 0x1174, 0x11B3], NFKC: [0xC080], NFKD: [0x1108, 0x1174, 0x11B3] }, +{ source: [0xC081], NFC: [0xC081], NFD: [0x1108, 0x1174, 0x11B4], NFKC: [0xC081], NFKD: [0x1108, 0x1174, 0x11B4] }, +{ source: [0xC082], NFC: [0xC082], NFD: [0x1108, 0x1174, 0x11B5], NFKC: [0xC082], NFKD: [0x1108, 0x1174, 0x11B5] }, +{ source: [0xC083], NFC: [0xC083], NFD: [0x1108, 0x1174, 0x11B6], NFKC: [0xC083], NFKD: [0x1108, 0x1174, 0x11B6] }, +{ source: [0xC084], NFC: [0xC084], NFD: [0x1108, 0x1174, 0x11B7], NFKC: [0xC084], NFKD: [0x1108, 0x1174, 0x11B7] }, +{ source: [0xC085], NFC: [0xC085], NFD: [0x1108, 0x1174, 0x11B8], NFKC: [0xC085], NFKD: [0x1108, 0x1174, 0x11B8] }, +{ source: [0xC086], NFC: [0xC086], NFD: [0x1108, 0x1174, 0x11B9], NFKC: [0xC086], NFKD: [0x1108, 0x1174, 0x11B9] }, +{ source: [0xC087], NFC: [0xC087], NFD: [0x1108, 0x1174, 0x11BA], NFKC: [0xC087], NFKD: [0x1108, 0x1174, 0x11BA] }, +{ source: [0xC088], NFC: [0xC088], NFD: [0x1108, 0x1174, 0x11BB], NFKC: [0xC088], NFKD: [0x1108, 0x1174, 0x11BB] }, +{ source: [0xC089], NFC: [0xC089], NFD: [0x1108, 0x1174, 0x11BC], NFKC: [0xC089], NFKD: [0x1108, 0x1174, 0x11BC] }, +{ source: [0xC08A], NFC: [0xC08A], NFD: [0x1108, 0x1174, 0x11BD], NFKC: [0xC08A], NFKD: [0x1108, 0x1174, 0x11BD] }, +{ source: [0xC08B], NFC: [0xC08B], NFD: [0x1108, 0x1174, 0x11BE], NFKC: [0xC08B], NFKD: [0x1108, 0x1174, 0x11BE] }, +{ source: [0xC08C], NFC: [0xC08C], NFD: [0x1108, 0x1174, 0x11BF], NFKC: [0xC08C], NFKD: [0x1108, 0x1174, 0x11BF] }, +{ source: [0xC08D], NFC: [0xC08D], NFD: [0x1108, 0x1174, 0x11C0], NFKC: [0xC08D], NFKD: [0x1108, 0x1174, 0x11C0] }, +{ source: [0xC08E], NFC: [0xC08E], NFD: [0x1108, 0x1174, 0x11C1], NFKC: [0xC08E], NFKD: [0x1108, 0x1174, 0x11C1] }, +{ source: [0xC08F], NFC: [0xC08F], NFD: [0x1108, 0x1174, 0x11C2], NFKC: [0xC08F], NFKD: [0x1108, 0x1174, 0x11C2] }, +{ source: [0xC090], NFC: [0xC090], NFD: [0x1108, 0x1175], NFKC: [0xC090], NFKD: [0x1108, 0x1175] }, +{ source: [0xC091], NFC: [0xC091], NFD: [0x1108, 0x1175, 0x11A8], NFKC: [0xC091], NFKD: [0x1108, 0x1175, 0x11A8] }, +{ source: [0xC092], NFC: [0xC092], NFD: [0x1108, 0x1175, 0x11A9], NFKC: [0xC092], NFKD: [0x1108, 0x1175, 0x11A9] }, +{ source: [0xC093], NFC: [0xC093], NFD: [0x1108, 0x1175, 0x11AA], NFKC: [0xC093], NFKD: [0x1108, 0x1175, 0x11AA] }, +{ source: [0xC094], NFC: [0xC094], NFD: [0x1108, 0x1175, 0x11AB], NFKC: [0xC094], NFKD: [0x1108, 0x1175, 0x11AB] }, +{ source: [0xC095], NFC: [0xC095], NFD: [0x1108, 0x1175, 0x11AC], NFKC: [0xC095], NFKD: [0x1108, 0x1175, 0x11AC] }, +{ source: [0xC096], NFC: [0xC096], NFD: [0x1108, 0x1175, 0x11AD], NFKC: [0xC096], NFKD: [0x1108, 0x1175, 0x11AD] }, +{ source: [0xC097], NFC: [0xC097], NFD: [0x1108, 0x1175, 0x11AE], NFKC: [0xC097], NFKD: [0x1108, 0x1175, 0x11AE] }, +{ source: [0xC098], NFC: [0xC098], NFD: [0x1108, 0x1175, 0x11AF], NFKC: [0xC098], NFKD: [0x1108, 0x1175, 0x11AF] }, +{ source: [0xC099], NFC: [0xC099], NFD: [0x1108, 0x1175, 0x11B0], NFKC: [0xC099], NFKD: [0x1108, 0x1175, 0x11B0] }, +{ source: [0xC09A], NFC: [0xC09A], NFD: [0x1108, 0x1175, 0x11B1], NFKC: [0xC09A], NFKD: [0x1108, 0x1175, 0x11B1] }, +{ source: [0xC09B], NFC: [0xC09B], NFD: [0x1108, 0x1175, 0x11B2], NFKC: [0xC09B], NFKD: [0x1108, 0x1175, 0x11B2] }, +{ source: [0xC09C], NFC: [0xC09C], NFD: [0x1108, 0x1175, 0x11B3], NFKC: [0xC09C], NFKD: [0x1108, 0x1175, 0x11B3] }, +{ source: [0xC09D], NFC: [0xC09D], NFD: [0x1108, 0x1175, 0x11B4], NFKC: [0xC09D], NFKD: [0x1108, 0x1175, 0x11B4] }, +{ source: [0xC09E], NFC: [0xC09E], NFD: [0x1108, 0x1175, 0x11B5], NFKC: [0xC09E], NFKD: [0x1108, 0x1175, 0x11B5] }, +{ source: [0xC09F], NFC: [0xC09F], NFD: [0x1108, 0x1175, 0x11B6], NFKC: [0xC09F], NFKD: [0x1108, 0x1175, 0x11B6] }, +{ source: [0xC0A0], NFC: [0xC0A0], NFD: [0x1108, 0x1175, 0x11B7], NFKC: [0xC0A0], NFKD: [0x1108, 0x1175, 0x11B7] }, +{ source: [0xC0A1], NFC: [0xC0A1], NFD: [0x1108, 0x1175, 0x11B8], NFKC: [0xC0A1], NFKD: [0x1108, 0x1175, 0x11B8] }, +{ source: [0xC0A2], NFC: [0xC0A2], NFD: [0x1108, 0x1175, 0x11B9], NFKC: [0xC0A2], NFKD: [0x1108, 0x1175, 0x11B9] }, +{ source: [0xC0A3], NFC: [0xC0A3], NFD: [0x1108, 0x1175, 0x11BA], NFKC: [0xC0A3], NFKD: [0x1108, 0x1175, 0x11BA] }, +{ source: [0xC0A4], NFC: [0xC0A4], NFD: [0x1108, 0x1175, 0x11BB], NFKC: [0xC0A4], NFKD: [0x1108, 0x1175, 0x11BB] }, +{ source: [0xC0A5], NFC: [0xC0A5], NFD: [0x1108, 0x1175, 0x11BC], NFKC: [0xC0A5], NFKD: [0x1108, 0x1175, 0x11BC] }, +{ source: [0xC0A6], NFC: [0xC0A6], NFD: [0x1108, 0x1175, 0x11BD], NFKC: [0xC0A6], NFKD: [0x1108, 0x1175, 0x11BD] }, +{ source: [0xC0A7], NFC: [0xC0A7], NFD: [0x1108, 0x1175, 0x11BE], NFKC: [0xC0A7], NFKD: [0x1108, 0x1175, 0x11BE] }, +{ source: [0xC0A8], NFC: [0xC0A8], NFD: [0x1108, 0x1175, 0x11BF], NFKC: [0xC0A8], NFKD: [0x1108, 0x1175, 0x11BF] }, +{ source: [0xC0A9], NFC: [0xC0A9], NFD: [0x1108, 0x1175, 0x11C0], NFKC: [0xC0A9], NFKD: [0x1108, 0x1175, 0x11C0] }, +{ source: [0xC0AA], NFC: [0xC0AA], NFD: [0x1108, 0x1175, 0x11C1], NFKC: [0xC0AA], NFKD: [0x1108, 0x1175, 0x11C1] }, +{ source: [0xC0AB], NFC: [0xC0AB], NFD: [0x1108, 0x1175, 0x11C2], NFKC: [0xC0AB], NFKD: [0x1108, 0x1175, 0x11C2] }, +{ source: [0xC0AC], NFC: [0xC0AC], NFD: [0x1109, 0x1161], NFKC: [0xC0AC], NFKD: [0x1109, 0x1161] }, +{ source: [0xC0AD], NFC: [0xC0AD], NFD: [0x1109, 0x1161, 0x11A8], NFKC: [0xC0AD], NFKD: [0x1109, 0x1161, 0x11A8] }, +{ source: [0xC0AE], NFC: [0xC0AE], NFD: [0x1109, 0x1161, 0x11A9], NFKC: [0xC0AE], NFKD: [0x1109, 0x1161, 0x11A9] }, +{ source: [0xC0AF], NFC: [0xC0AF], NFD: [0x1109, 0x1161, 0x11AA], NFKC: [0xC0AF], NFKD: [0x1109, 0x1161, 0x11AA] }, +{ source: [0xC0B0], NFC: [0xC0B0], NFD: [0x1109, 0x1161, 0x11AB], NFKC: [0xC0B0], NFKD: [0x1109, 0x1161, 0x11AB] }, +{ source: [0xC0B1], NFC: [0xC0B1], NFD: [0x1109, 0x1161, 0x11AC], NFKC: [0xC0B1], NFKD: [0x1109, 0x1161, 0x11AC] }, +{ source: [0xC0B2], NFC: [0xC0B2], NFD: [0x1109, 0x1161, 0x11AD], NFKC: [0xC0B2], NFKD: [0x1109, 0x1161, 0x11AD] }, +{ source: [0xC0B3], NFC: [0xC0B3], NFD: [0x1109, 0x1161, 0x11AE], NFKC: [0xC0B3], NFKD: [0x1109, 0x1161, 0x11AE] }, +{ source: [0xC0B4], NFC: [0xC0B4], NFD: [0x1109, 0x1161, 0x11AF], NFKC: [0xC0B4], NFKD: [0x1109, 0x1161, 0x11AF] }, +{ source: [0xC0B5], NFC: [0xC0B5], NFD: [0x1109, 0x1161, 0x11B0], NFKC: [0xC0B5], NFKD: [0x1109, 0x1161, 0x11B0] }, +{ source: [0xC0B6], NFC: [0xC0B6], NFD: [0x1109, 0x1161, 0x11B1], NFKC: [0xC0B6], NFKD: [0x1109, 0x1161, 0x11B1] }, +{ source: [0xC0B7], NFC: [0xC0B7], NFD: [0x1109, 0x1161, 0x11B2], NFKC: [0xC0B7], NFKD: [0x1109, 0x1161, 0x11B2] }, +{ source: [0xC0B8], NFC: [0xC0B8], NFD: [0x1109, 0x1161, 0x11B3], NFKC: [0xC0B8], NFKD: [0x1109, 0x1161, 0x11B3] }, +{ source: [0xC0B9], NFC: [0xC0B9], NFD: [0x1109, 0x1161, 0x11B4], NFKC: [0xC0B9], NFKD: [0x1109, 0x1161, 0x11B4] }, +{ source: [0xC0BA], NFC: [0xC0BA], NFD: [0x1109, 0x1161, 0x11B5], NFKC: [0xC0BA], NFKD: [0x1109, 0x1161, 0x11B5] }, +{ source: [0xC0BB], NFC: [0xC0BB], NFD: [0x1109, 0x1161, 0x11B6], NFKC: [0xC0BB], NFKD: [0x1109, 0x1161, 0x11B6] }, +{ source: [0xC0BC], NFC: [0xC0BC], NFD: [0x1109, 0x1161, 0x11B7], NFKC: [0xC0BC], NFKD: [0x1109, 0x1161, 0x11B7] }, +{ source: [0xC0BD], NFC: [0xC0BD], NFD: [0x1109, 0x1161, 0x11B8], NFKC: [0xC0BD], NFKD: [0x1109, 0x1161, 0x11B8] }, +{ source: [0xC0BE], NFC: [0xC0BE], NFD: [0x1109, 0x1161, 0x11B9], NFKC: [0xC0BE], NFKD: [0x1109, 0x1161, 0x11B9] }, +{ source: [0xC0BF], NFC: [0xC0BF], NFD: [0x1109, 0x1161, 0x11BA], NFKC: [0xC0BF], NFKD: [0x1109, 0x1161, 0x11BA] }, +{ source: [0xC0C0], NFC: [0xC0C0], NFD: [0x1109, 0x1161, 0x11BB], NFKC: [0xC0C0], NFKD: [0x1109, 0x1161, 0x11BB] }, +{ source: [0xC0C1], NFC: [0xC0C1], NFD: [0x1109, 0x1161, 0x11BC], NFKC: [0xC0C1], NFKD: [0x1109, 0x1161, 0x11BC] }, +{ source: [0xC0C2], NFC: [0xC0C2], NFD: [0x1109, 0x1161, 0x11BD], NFKC: [0xC0C2], NFKD: [0x1109, 0x1161, 0x11BD] }, +{ source: [0xC0C3], NFC: [0xC0C3], NFD: [0x1109, 0x1161, 0x11BE], NFKC: [0xC0C3], NFKD: [0x1109, 0x1161, 0x11BE] }, +{ source: [0xC0C4], NFC: [0xC0C4], NFD: [0x1109, 0x1161, 0x11BF], NFKC: [0xC0C4], NFKD: [0x1109, 0x1161, 0x11BF] }, +{ source: [0xC0C5], NFC: [0xC0C5], NFD: [0x1109, 0x1161, 0x11C0], NFKC: [0xC0C5], NFKD: [0x1109, 0x1161, 0x11C0] }, +{ source: [0xC0C6], NFC: [0xC0C6], NFD: [0x1109, 0x1161, 0x11C1], NFKC: [0xC0C6], NFKD: [0x1109, 0x1161, 0x11C1] }, +{ source: [0xC0C7], NFC: [0xC0C7], NFD: [0x1109, 0x1161, 0x11C2], NFKC: [0xC0C7], NFKD: [0x1109, 0x1161, 0x11C2] }, +{ source: [0xC0C8], NFC: [0xC0C8], NFD: [0x1109, 0x1162], NFKC: [0xC0C8], NFKD: [0x1109, 0x1162] }, +{ source: [0xC0C9], NFC: [0xC0C9], NFD: [0x1109, 0x1162, 0x11A8], NFKC: [0xC0C9], NFKD: [0x1109, 0x1162, 0x11A8] }, +{ source: [0xC0CA], NFC: [0xC0CA], NFD: [0x1109, 0x1162, 0x11A9], NFKC: [0xC0CA], NFKD: [0x1109, 0x1162, 0x11A9] }, +{ source: [0xC0CB], NFC: [0xC0CB], NFD: [0x1109, 0x1162, 0x11AA], NFKC: [0xC0CB], NFKD: [0x1109, 0x1162, 0x11AA] }, +{ source: [0xC0CC], NFC: [0xC0CC], NFD: [0x1109, 0x1162, 0x11AB], NFKC: [0xC0CC], NFKD: [0x1109, 0x1162, 0x11AB] }, +{ source: [0xC0CD], NFC: [0xC0CD], NFD: [0x1109, 0x1162, 0x11AC], NFKC: [0xC0CD], NFKD: [0x1109, 0x1162, 0x11AC] }, +{ source: [0xC0CE], NFC: [0xC0CE], NFD: [0x1109, 0x1162, 0x11AD], NFKC: [0xC0CE], NFKD: [0x1109, 0x1162, 0x11AD] }, +{ source: [0xC0CF], NFC: [0xC0CF], NFD: [0x1109, 0x1162, 0x11AE], NFKC: [0xC0CF], NFKD: [0x1109, 0x1162, 0x11AE] }, +{ source: [0xC0D0], NFC: [0xC0D0], NFD: [0x1109, 0x1162, 0x11AF], NFKC: [0xC0D0], NFKD: [0x1109, 0x1162, 0x11AF] }, +{ source: [0xC0D1], NFC: [0xC0D1], NFD: [0x1109, 0x1162, 0x11B0], NFKC: [0xC0D1], NFKD: [0x1109, 0x1162, 0x11B0] }, +{ source: [0xC0D2], NFC: [0xC0D2], NFD: [0x1109, 0x1162, 0x11B1], NFKC: [0xC0D2], NFKD: [0x1109, 0x1162, 0x11B1] }, +{ source: [0xC0D3], NFC: [0xC0D3], NFD: [0x1109, 0x1162, 0x11B2], NFKC: [0xC0D3], NFKD: [0x1109, 0x1162, 0x11B2] }, +{ source: [0xC0D4], NFC: [0xC0D4], NFD: [0x1109, 0x1162, 0x11B3], NFKC: [0xC0D4], NFKD: [0x1109, 0x1162, 0x11B3] }, +{ source: [0xC0D5], NFC: [0xC0D5], NFD: [0x1109, 0x1162, 0x11B4], NFKC: [0xC0D5], NFKD: [0x1109, 0x1162, 0x11B4] }, +{ source: [0xC0D6], NFC: [0xC0D6], NFD: [0x1109, 0x1162, 0x11B5], NFKC: [0xC0D6], NFKD: [0x1109, 0x1162, 0x11B5] }, +{ source: [0xC0D7], NFC: [0xC0D7], NFD: [0x1109, 0x1162, 0x11B6], NFKC: [0xC0D7], NFKD: [0x1109, 0x1162, 0x11B6] }, +{ source: [0xC0D8], NFC: [0xC0D8], NFD: [0x1109, 0x1162, 0x11B7], NFKC: [0xC0D8], NFKD: [0x1109, 0x1162, 0x11B7] }, +{ source: [0xC0D9], NFC: [0xC0D9], NFD: [0x1109, 0x1162, 0x11B8], NFKC: [0xC0D9], NFKD: [0x1109, 0x1162, 0x11B8] }, +{ source: [0xC0DA], NFC: [0xC0DA], NFD: [0x1109, 0x1162, 0x11B9], NFKC: [0xC0DA], NFKD: [0x1109, 0x1162, 0x11B9] }, +{ source: [0xC0DB], NFC: [0xC0DB], NFD: [0x1109, 0x1162, 0x11BA], NFKC: [0xC0DB], NFKD: [0x1109, 0x1162, 0x11BA] }, +{ source: [0xC0DC], NFC: [0xC0DC], NFD: [0x1109, 0x1162, 0x11BB], NFKC: [0xC0DC], NFKD: [0x1109, 0x1162, 0x11BB] }, +{ source: [0xC0DD], NFC: [0xC0DD], NFD: [0x1109, 0x1162, 0x11BC], NFKC: [0xC0DD], NFKD: [0x1109, 0x1162, 0x11BC] }, +{ source: [0xC0DE], NFC: [0xC0DE], NFD: [0x1109, 0x1162, 0x11BD], NFKC: [0xC0DE], NFKD: [0x1109, 0x1162, 0x11BD] }, +{ source: [0xC0DF], NFC: [0xC0DF], NFD: [0x1109, 0x1162, 0x11BE], NFKC: [0xC0DF], NFKD: [0x1109, 0x1162, 0x11BE] }, +{ source: [0xC0E0], NFC: [0xC0E0], NFD: [0x1109, 0x1162, 0x11BF], NFKC: [0xC0E0], NFKD: [0x1109, 0x1162, 0x11BF] }, +{ source: [0xC0E1], NFC: [0xC0E1], NFD: [0x1109, 0x1162, 0x11C0], NFKC: [0xC0E1], NFKD: [0x1109, 0x1162, 0x11C0] }, +{ source: [0xC0E2], NFC: [0xC0E2], NFD: [0x1109, 0x1162, 0x11C1], NFKC: [0xC0E2], NFKD: [0x1109, 0x1162, 0x11C1] }, +{ source: [0xC0E3], NFC: [0xC0E3], NFD: [0x1109, 0x1162, 0x11C2], NFKC: [0xC0E3], NFKD: [0x1109, 0x1162, 0x11C2] }, +{ source: [0xC0E4], NFC: [0xC0E4], NFD: [0x1109, 0x1163], NFKC: [0xC0E4], NFKD: [0x1109, 0x1163] }, +{ source: [0xC0E5], NFC: [0xC0E5], NFD: [0x1109, 0x1163, 0x11A8], NFKC: [0xC0E5], NFKD: [0x1109, 0x1163, 0x11A8] }, +{ source: [0xC0E6], NFC: [0xC0E6], NFD: [0x1109, 0x1163, 0x11A9], NFKC: [0xC0E6], NFKD: [0x1109, 0x1163, 0x11A9] }, +{ source: [0xC0E7], NFC: [0xC0E7], NFD: [0x1109, 0x1163, 0x11AA], NFKC: [0xC0E7], NFKD: [0x1109, 0x1163, 0x11AA] }, +{ source: [0xC0E8], NFC: [0xC0E8], NFD: [0x1109, 0x1163, 0x11AB], NFKC: [0xC0E8], NFKD: [0x1109, 0x1163, 0x11AB] }, +{ source: [0xC0E9], NFC: [0xC0E9], NFD: [0x1109, 0x1163, 0x11AC], NFKC: [0xC0E9], NFKD: [0x1109, 0x1163, 0x11AC] }, +{ source: [0xC0EA], NFC: [0xC0EA], NFD: [0x1109, 0x1163, 0x11AD], NFKC: [0xC0EA], NFKD: [0x1109, 0x1163, 0x11AD] }, +{ source: [0xC0EB], NFC: [0xC0EB], NFD: [0x1109, 0x1163, 0x11AE], NFKC: [0xC0EB], NFKD: [0x1109, 0x1163, 0x11AE] }, +{ source: [0xC0EC], NFC: [0xC0EC], NFD: [0x1109, 0x1163, 0x11AF], NFKC: [0xC0EC], NFKD: [0x1109, 0x1163, 0x11AF] }, +{ source: [0xC0ED], NFC: [0xC0ED], NFD: [0x1109, 0x1163, 0x11B0], NFKC: [0xC0ED], NFKD: [0x1109, 0x1163, 0x11B0] }, +{ source: [0xC0EE], NFC: [0xC0EE], NFD: [0x1109, 0x1163, 0x11B1], NFKC: [0xC0EE], NFKD: [0x1109, 0x1163, 0x11B1] }, +{ source: [0xC0EF], NFC: [0xC0EF], NFD: [0x1109, 0x1163, 0x11B2], NFKC: [0xC0EF], NFKD: [0x1109, 0x1163, 0x11B2] }, +{ source: [0xC0F0], NFC: [0xC0F0], NFD: [0x1109, 0x1163, 0x11B3], NFKC: [0xC0F0], NFKD: [0x1109, 0x1163, 0x11B3] }, +{ source: [0xC0F1], NFC: [0xC0F1], NFD: [0x1109, 0x1163, 0x11B4], NFKC: [0xC0F1], NFKD: [0x1109, 0x1163, 0x11B4] }, +{ source: [0xC0F2], NFC: [0xC0F2], NFD: [0x1109, 0x1163, 0x11B5], NFKC: [0xC0F2], NFKD: [0x1109, 0x1163, 0x11B5] }, +{ source: [0xC0F3], NFC: [0xC0F3], NFD: [0x1109, 0x1163, 0x11B6], NFKC: [0xC0F3], NFKD: [0x1109, 0x1163, 0x11B6] }, +{ source: [0xC0F4], NFC: [0xC0F4], NFD: [0x1109, 0x1163, 0x11B7], NFKC: [0xC0F4], NFKD: [0x1109, 0x1163, 0x11B7] }, +{ source: [0xC0F5], NFC: [0xC0F5], NFD: [0x1109, 0x1163, 0x11B8], NFKC: [0xC0F5], NFKD: [0x1109, 0x1163, 0x11B8] }, +{ source: [0xC0F6], NFC: [0xC0F6], NFD: [0x1109, 0x1163, 0x11B9], NFKC: [0xC0F6], NFKD: [0x1109, 0x1163, 0x11B9] }, +{ source: [0xC0F7], NFC: [0xC0F7], NFD: [0x1109, 0x1163, 0x11BA], NFKC: [0xC0F7], NFKD: [0x1109, 0x1163, 0x11BA] }, +{ source: [0xC0F8], NFC: [0xC0F8], NFD: [0x1109, 0x1163, 0x11BB], NFKC: [0xC0F8], NFKD: [0x1109, 0x1163, 0x11BB] }, +{ source: [0xC0F9], NFC: [0xC0F9], NFD: [0x1109, 0x1163, 0x11BC], NFKC: [0xC0F9], NFKD: [0x1109, 0x1163, 0x11BC] }, +{ source: [0xC0FA], NFC: [0xC0FA], NFD: [0x1109, 0x1163, 0x11BD], NFKC: [0xC0FA], NFKD: [0x1109, 0x1163, 0x11BD] }, +{ source: [0xC0FB], NFC: [0xC0FB], NFD: [0x1109, 0x1163, 0x11BE], NFKC: [0xC0FB], NFKD: [0x1109, 0x1163, 0x11BE] }, +{ source: [0xC0FC], NFC: [0xC0FC], NFD: [0x1109, 0x1163, 0x11BF], NFKC: [0xC0FC], NFKD: [0x1109, 0x1163, 0x11BF] }, +{ source: [0xC0FD], NFC: [0xC0FD], NFD: [0x1109, 0x1163, 0x11C0], NFKC: [0xC0FD], NFKD: [0x1109, 0x1163, 0x11C0] }, +{ source: [0xC0FE], NFC: [0xC0FE], NFD: [0x1109, 0x1163, 0x11C1], NFKC: [0xC0FE], NFKD: [0x1109, 0x1163, 0x11C1] }, +{ source: [0xC0FF], NFC: [0xC0FF], NFD: [0x1109, 0x1163, 0x11C2], NFKC: [0xC0FF], NFKD: [0x1109, 0x1163, 0x11C2] }, +{ source: [0xC100], NFC: [0xC100], NFD: [0x1109, 0x1164], NFKC: [0xC100], NFKD: [0x1109, 0x1164] }, +{ source: [0xC101], NFC: [0xC101], NFD: [0x1109, 0x1164, 0x11A8], NFKC: [0xC101], NFKD: [0x1109, 0x1164, 0x11A8] }, +{ source: [0xC102], NFC: [0xC102], NFD: [0x1109, 0x1164, 0x11A9], NFKC: [0xC102], NFKD: [0x1109, 0x1164, 0x11A9] }, +{ source: [0xC103], NFC: [0xC103], NFD: [0x1109, 0x1164, 0x11AA], NFKC: [0xC103], NFKD: [0x1109, 0x1164, 0x11AA] }, +{ source: [0xC104], NFC: [0xC104], NFD: [0x1109, 0x1164, 0x11AB], NFKC: [0xC104], NFKD: [0x1109, 0x1164, 0x11AB] }, +{ source: [0xC105], NFC: [0xC105], NFD: [0x1109, 0x1164, 0x11AC], NFKC: [0xC105], NFKD: [0x1109, 0x1164, 0x11AC] }, +{ source: [0xC106], NFC: [0xC106], NFD: [0x1109, 0x1164, 0x11AD], NFKC: [0xC106], NFKD: [0x1109, 0x1164, 0x11AD] }, +{ source: [0xC107], NFC: [0xC107], NFD: [0x1109, 0x1164, 0x11AE], NFKC: [0xC107], NFKD: [0x1109, 0x1164, 0x11AE] }, +{ source: [0xC108], NFC: [0xC108], NFD: [0x1109, 0x1164, 0x11AF], NFKC: [0xC108], NFKD: [0x1109, 0x1164, 0x11AF] }, +{ source: [0xC109], NFC: [0xC109], NFD: [0x1109, 0x1164, 0x11B0], NFKC: [0xC109], NFKD: [0x1109, 0x1164, 0x11B0] }, +{ source: [0xC10A], NFC: [0xC10A], NFD: [0x1109, 0x1164, 0x11B1], NFKC: [0xC10A], NFKD: [0x1109, 0x1164, 0x11B1] }, +{ source: [0xC10B], NFC: [0xC10B], NFD: [0x1109, 0x1164, 0x11B2], NFKC: [0xC10B], NFKD: [0x1109, 0x1164, 0x11B2] }, +{ source: [0xC10C], NFC: [0xC10C], NFD: [0x1109, 0x1164, 0x11B3], NFKC: [0xC10C], NFKD: [0x1109, 0x1164, 0x11B3] }, +{ source: [0xC10D], NFC: [0xC10D], NFD: [0x1109, 0x1164, 0x11B4], NFKC: [0xC10D], NFKD: [0x1109, 0x1164, 0x11B4] }, +{ source: [0xC10E], NFC: [0xC10E], NFD: [0x1109, 0x1164, 0x11B5], NFKC: [0xC10E], NFKD: [0x1109, 0x1164, 0x11B5] }, +{ source: [0xC10F], NFC: [0xC10F], NFD: [0x1109, 0x1164, 0x11B6], NFKC: [0xC10F], NFKD: [0x1109, 0x1164, 0x11B6] }, +{ source: [0xC110], NFC: [0xC110], NFD: [0x1109, 0x1164, 0x11B7], NFKC: [0xC110], NFKD: [0x1109, 0x1164, 0x11B7] }, +{ source: [0xC111], NFC: [0xC111], NFD: [0x1109, 0x1164, 0x11B8], NFKC: [0xC111], NFKD: [0x1109, 0x1164, 0x11B8] }, +{ source: [0xC112], NFC: [0xC112], NFD: [0x1109, 0x1164, 0x11B9], NFKC: [0xC112], NFKD: [0x1109, 0x1164, 0x11B9] }, +{ source: [0xC113], NFC: [0xC113], NFD: [0x1109, 0x1164, 0x11BA], NFKC: [0xC113], NFKD: [0x1109, 0x1164, 0x11BA] }, +{ source: [0xC114], NFC: [0xC114], NFD: [0x1109, 0x1164, 0x11BB], NFKC: [0xC114], NFKD: [0x1109, 0x1164, 0x11BB] }, +{ source: [0xC115], NFC: [0xC115], NFD: [0x1109, 0x1164, 0x11BC], NFKC: [0xC115], NFKD: [0x1109, 0x1164, 0x11BC] }, +{ source: [0xC116], NFC: [0xC116], NFD: [0x1109, 0x1164, 0x11BD], NFKC: [0xC116], NFKD: [0x1109, 0x1164, 0x11BD] }, +{ source: [0xC117], NFC: [0xC117], NFD: [0x1109, 0x1164, 0x11BE], NFKC: [0xC117], NFKD: [0x1109, 0x1164, 0x11BE] }, +{ source: [0xC118], NFC: [0xC118], NFD: [0x1109, 0x1164, 0x11BF], NFKC: [0xC118], NFKD: [0x1109, 0x1164, 0x11BF] }, +{ source: [0xC119], NFC: [0xC119], NFD: [0x1109, 0x1164, 0x11C0], NFKC: [0xC119], NFKD: [0x1109, 0x1164, 0x11C0] }, +{ source: [0xC11A], NFC: [0xC11A], NFD: [0x1109, 0x1164, 0x11C1], NFKC: [0xC11A], NFKD: [0x1109, 0x1164, 0x11C1] }, +{ source: [0xC11B], NFC: [0xC11B], NFD: [0x1109, 0x1164, 0x11C2], NFKC: [0xC11B], NFKD: [0x1109, 0x1164, 0x11C2] }, +{ source: [0xC11C], NFC: [0xC11C], NFD: [0x1109, 0x1165], NFKC: [0xC11C], NFKD: [0x1109, 0x1165] }, +{ source: [0xC11D], NFC: [0xC11D], NFD: [0x1109, 0x1165, 0x11A8], NFKC: [0xC11D], NFKD: [0x1109, 0x1165, 0x11A8] }, +{ source: [0xC11E], NFC: [0xC11E], NFD: [0x1109, 0x1165, 0x11A9], NFKC: [0xC11E], NFKD: [0x1109, 0x1165, 0x11A9] }, +{ source: [0xC11F], NFC: [0xC11F], NFD: [0x1109, 0x1165, 0x11AA], NFKC: [0xC11F], NFKD: [0x1109, 0x1165, 0x11AA] }, +{ source: [0xC120], NFC: [0xC120], NFD: [0x1109, 0x1165, 0x11AB], NFKC: [0xC120], NFKD: [0x1109, 0x1165, 0x11AB] }, +{ source: [0xC121], NFC: [0xC121], NFD: [0x1109, 0x1165, 0x11AC], NFKC: [0xC121], NFKD: [0x1109, 0x1165, 0x11AC] }, +{ source: [0xC122], NFC: [0xC122], NFD: [0x1109, 0x1165, 0x11AD], NFKC: [0xC122], NFKD: [0x1109, 0x1165, 0x11AD] }, +{ source: [0xC123], NFC: [0xC123], NFD: [0x1109, 0x1165, 0x11AE], NFKC: [0xC123], NFKD: [0x1109, 0x1165, 0x11AE] }, +{ source: [0xC124], NFC: [0xC124], NFD: [0x1109, 0x1165, 0x11AF], NFKC: [0xC124], NFKD: [0x1109, 0x1165, 0x11AF] }, +{ source: [0xC125], NFC: [0xC125], NFD: [0x1109, 0x1165, 0x11B0], NFKC: [0xC125], NFKD: [0x1109, 0x1165, 0x11B0] }, +{ source: [0xC126], NFC: [0xC126], NFD: [0x1109, 0x1165, 0x11B1], NFKC: [0xC126], NFKD: [0x1109, 0x1165, 0x11B1] }, +{ source: [0xC127], NFC: [0xC127], NFD: [0x1109, 0x1165, 0x11B2], NFKC: [0xC127], NFKD: [0x1109, 0x1165, 0x11B2] }, +{ source: [0xC128], NFC: [0xC128], NFD: [0x1109, 0x1165, 0x11B3], NFKC: [0xC128], NFKD: [0x1109, 0x1165, 0x11B3] }, +{ source: [0xC129], NFC: [0xC129], NFD: [0x1109, 0x1165, 0x11B4], NFKC: [0xC129], NFKD: [0x1109, 0x1165, 0x11B4] }, +{ source: [0xC12A], NFC: [0xC12A], NFD: [0x1109, 0x1165, 0x11B5], NFKC: [0xC12A], NFKD: [0x1109, 0x1165, 0x11B5] }, +{ source: [0xC12B], NFC: [0xC12B], NFD: [0x1109, 0x1165, 0x11B6], NFKC: [0xC12B], NFKD: [0x1109, 0x1165, 0x11B6] }, +{ source: [0xC12C], NFC: [0xC12C], NFD: [0x1109, 0x1165, 0x11B7], NFKC: [0xC12C], NFKD: [0x1109, 0x1165, 0x11B7] }, +{ source: [0xC12D], NFC: [0xC12D], NFD: [0x1109, 0x1165, 0x11B8], NFKC: [0xC12D], NFKD: [0x1109, 0x1165, 0x11B8] }, +{ source: [0xC12E], NFC: [0xC12E], NFD: [0x1109, 0x1165, 0x11B9], NFKC: [0xC12E], NFKD: [0x1109, 0x1165, 0x11B9] }, +{ source: [0xC12F], NFC: [0xC12F], NFD: [0x1109, 0x1165, 0x11BA], NFKC: [0xC12F], NFKD: [0x1109, 0x1165, 0x11BA] }, +{ source: [0xC130], NFC: [0xC130], NFD: [0x1109, 0x1165, 0x11BB], NFKC: [0xC130], NFKD: [0x1109, 0x1165, 0x11BB] }, +{ source: [0xC131], NFC: [0xC131], NFD: [0x1109, 0x1165, 0x11BC], NFKC: [0xC131], NFKD: [0x1109, 0x1165, 0x11BC] }, +{ source: [0xC132], NFC: [0xC132], NFD: [0x1109, 0x1165, 0x11BD], NFKC: [0xC132], NFKD: [0x1109, 0x1165, 0x11BD] }, +{ source: [0xC133], NFC: [0xC133], NFD: [0x1109, 0x1165, 0x11BE], NFKC: [0xC133], NFKD: [0x1109, 0x1165, 0x11BE] }, +{ source: [0xC134], NFC: [0xC134], NFD: [0x1109, 0x1165, 0x11BF], NFKC: [0xC134], NFKD: [0x1109, 0x1165, 0x11BF] }, +{ source: [0xC135], NFC: [0xC135], NFD: [0x1109, 0x1165, 0x11C0], NFKC: [0xC135], NFKD: [0x1109, 0x1165, 0x11C0] }, +{ source: [0xC136], NFC: [0xC136], NFD: [0x1109, 0x1165, 0x11C1], NFKC: [0xC136], NFKD: [0x1109, 0x1165, 0x11C1] }, +{ source: [0xC137], NFC: [0xC137], NFD: [0x1109, 0x1165, 0x11C2], NFKC: [0xC137], NFKD: [0x1109, 0x1165, 0x11C2] }, +{ source: [0xC138], NFC: [0xC138], NFD: [0x1109, 0x1166], NFKC: [0xC138], NFKD: [0x1109, 0x1166] }, +{ source: [0xC139], NFC: [0xC139], NFD: [0x1109, 0x1166, 0x11A8], NFKC: [0xC139], NFKD: [0x1109, 0x1166, 0x11A8] }, +{ source: [0xC13A], NFC: [0xC13A], NFD: [0x1109, 0x1166, 0x11A9], NFKC: [0xC13A], NFKD: [0x1109, 0x1166, 0x11A9] }, +{ source: [0xC13B], NFC: [0xC13B], NFD: [0x1109, 0x1166, 0x11AA], NFKC: [0xC13B], NFKD: [0x1109, 0x1166, 0x11AA] }, +{ source: [0xC13C], NFC: [0xC13C], NFD: [0x1109, 0x1166, 0x11AB], NFKC: [0xC13C], NFKD: [0x1109, 0x1166, 0x11AB] }, +{ source: [0xC13D], NFC: [0xC13D], NFD: [0x1109, 0x1166, 0x11AC], NFKC: [0xC13D], NFKD: [0x1109, 0x1166, 0x11AC] }, +{ source: [0xC13E], NFC: [0xC13E], NFD: [0x1109, 0x1166, 0x11AD], NFKC: [0xC13E], NFKD: [0x1109, 0x1166, 0x11AD] }, +{ source: [0xC13F], NFC: [0xC13F], NFD: [0x1109, 0x1166, 0x11AE], NFKC: [0xC13F], NFKD: [0x1109, 0x1166, 0x11AE] }, +{ source: [0xC140], NFC: [0xC140], NFD: [0x1109, 0x1166, 0x11AF], NFKC: [0xC140], NFKD: [0x1109, 0x1166, 0x11AF] }, +{ source: [0xC141], NFC: [0xC141], NFD: [0x1109, 0x1166, 0x11B0], NFKC: [0xC141], NFKD: [0x1109, 0x1166, 0x11B0] }, +{ source: [0xC142], NFC: [0xC142], NFD: [0x1109, 0x1166, 0x11B1], NFKC: [0xC142], NFKD: [0x1109, 0x1166, 0x11B1] }, +{ source: [0xC143], NFC: [0xC143], NFD: [0x1109, 0x1166, 0x11B2], NFKC: [0xC143], NFKD: [0x1109, 0x1166, 0x11B2] }, +{ source: [0xC144], NFC: [0xC144], NFD: [0x1109, 0x1166, 0x11B3], NFKC: [0xC144], NFKD: [0x1109, 0x1166, 0x11B3] }, +{ source: [0xC145], NFC: [0xC145], NFD: [0x1109, 0x1166, 0x11B4], NFKC: [0xC145], NFKD: [0x1109, 0x1166, 0x11B4] }, +{ source: [0xC146], NFC: [0xC146], NFD: [0x1109, 0x1166, 0x11B5], NFKC: [0xC146], NFKD: [0x1109, 0x1166, 0x11B5] }, +{ source: [0xC147], NFC: [0xC147], NFD: [0x1109, 0x1166, 0x11B6], NFKC: [0xC147], NFKD: [0x1109, 0x1166, 0x11B6] }, +{ source: [0xC148], NFC: [0xC148], NFD: [0x1109, 0x1166, 0x11B7], NFKC: [0xC148], NFKD: [0x1109, 0x1166, 0x11B7] }, +{ source: [0xC149], NFC: [0xC149], NFD: [0x1109, 0x1166, 0x11B8], NFKC: [0xC149], NFKD: [0x1109, 0x1166, 0x11B8] }, +{ source: [0xC14A], NFC: [0xC14A], NFD: [0x1109, 0x1166, 0x11B9], NFKC: [0xC14A], NFKD: [0x1109, 0x1166, 0x11B9] }, +{ source: [0xC14B], NFC: [0xC14B], NFD: [0x1109, 0x1166, 0x11BA], NFKC: [0xC14B], NFKD: [0x1109, 0x1166, 0x11BA] }, +{ source: [0xC14C], NFC: [0xC14C], NFD: [0x1109, 0x1166, 0x11BB], NFKC: [0xC14C], NFKD: [0x1109, 0x1166, 0x11BB] }, +{ source: [0xC14D], NFC: [0xC14D], NFD: [0x1109, 0x1166, 0x11BC], NFKC: [0xC14D], NFKD: [0x1109, 0x1166, 0x11BC] }, +{ source: [0xC14E], NFC: [0xC14E], NFD: [0x1109, 0x1166, 0x11BD], NFKC: [0xC14E], NFKD: [0x1109, 0x1166, 0x11BD] }, +{ source: [0xC14F], NFC: [0xC14F], NFD: [0x1109, 0x1166, 0x11BE], NFKC: [0xC14F], NFKD: [0x1109, 0x1166, 0x11BE] }, +{ source: [0xC150], NFC: [0xC150], NFD: [0x1109, 0x1166, 0x11BF], NFKC: [0xC150], NFKD: [0x1109, 0x1166, 0x11BF] }, +{ source: [0xC151], NFC: [0xC151], NFD: [0x1109, 0x1166, 0x11C0], NFKC: [0xC151], NFKD: [0x1109, 0x1166, 0x11C0] }, +{ source: [0xC152], NFC: [0xC152], NFD: [0x1109, 0x1166, 0x11C1], NFKC: [0xC152], NFKD: [0x1109, 0x1166, 0x11C1] }, +{ source: [0xC153], NFC: [0xC153], NFD: [0x1109, 0x1166, 0x11C2], NFKC: [0xC153], NFKD: [0x1109, 0x1166, 0x11C2] }, +{ source: [0xC154], NFC: [0xC154], NFD: [0x1109, 0x1167], NFKC: [0xC154], NFKD: [0x1109, 0x1167] }, +{ source: [0xC155], NFC: [0xC155], NFD: [0x1109, 0x1167, 0x11A8], NFKC: [0xC155], NFKD: [0x1109, 0x1167, 0x11A8] }, +{ source: [0xC156], NFC: [0xC156], NFD: [0x1109, 0x1167, 0x11A9], NFKC: [0xC156], NFKD: [0x1109, 0x1167, 0x11A9] }, +{ source: [0xC157], NFC: [0xC157], NFD: [0x1109, 0x1167, 0x11AA], NFKC: [0xC157], NFKD: [0x1109, 0x1167, 0x11AA] }, +{ source: [0xC158], NFC: [0xC158], NFD: [0x1109, 0x1167, 0x11AB], NFKC: [0xC158], NFKD: [0x1109, 0x1167, 0x11AB] }, +{ source: [0xC159], NFC: [0xC159], NFD: [0x1109, 0x1167, 0x11AC], NFKC: [0xC159], NFKD: [0x1109, 0x1167, 0x11AC] }, +{ source: [0xC15A], NFC: [0xC15A], NFD: [0x1109, 0x1167, 0x11AD], NFKC: [0xC15A], NFKD: [0x1109, 0x1167, 0x11AD] }, +{ source: [0xC15B], NFC: [0xC15B], NFD: [0x1109, 0x1167, 0x11AE], NFKC: [0xC15B], NFKD: [0x1109, 0x1167, 0x11AE] }, +{ source: [0xC15C], NFC: [0xC15C], NFD: [0x1109, 0x1167, 0x11AF], NFKC: [0xC15C], NFKD: [0x1109, 0x1167, 0x11AF] }, +{ source: [0xC15D], NFC: [0xC15D], NFD: [0x1109, 0x1167, 0x11B0], NFKC: [0xC15D], NFKD: [0x1109, 0x1167, 0x11B0] }, +{ source: [0xC15E], NFC: [0xC15E], NFD: [0x1109, 0x1167, 0x11B1], NFKC: [0xC15E], NFKD: [0x1109, 0x1167, 0x11B1] }, +{ source: [0xC15F], NFC: [0xC15F], NFD: [0x1109, 0x1167, 0x11B2], NFKC: [0xC15F], NFKD: [0x1109, 0x1167, 0x11B2] }, +{ source: [0xC160], NFC: [0xC160], NFD: [0x1109, 0x1167, 0x11B3], NFKC: [0xC160], NFKD: [0x1109, 0x1167, 0x11B3] }, +{ source: [0xC161], NFC: [0xC161], NFD: [0x1109, 0x1167, 0x11B4], NFKC: [0xC161], NFKD: [0x1109, 0x1167, 0x11B4] }, +{ source: [0xC162], NFC: [0xC162], NFD: [0x1109, 0x1167, 0x11B5], NFKC: [0xC162], NFKD: [0x1109, 0x1167, 0x11B5] }, +{ source: [0xC163], NFC: [0xC163], NFD: [0x1109, 0x1167, 0x11B6], NFKC: [0xC163], NFKD: [0x1109, 0x1167, 0x11B6] }, +{ source: [0xC164], NFC: [0xC164], NFD: [0x1109, 0x1167, 0x11B7], NFKC: [0xC164], NFKD: [0x1109, 0x1167, 0x11B7] }, +{ source: [0xC165], NFC: [0xC165], NFD: [0x1109, 0x1167, 0x11B8], NFKC: [0xC165], NFKD: [0x1109, 0x1167, 0x11B8] }, +{ source: [0xC166], NFC: [0xC166], NFD: [0x1109, 0x1167, 0x11B9], NFKC: [0xC166], NFKD: [0x1109, 0x1167, 0x11B9] }, +{ source: [0xC167], NFC: [0xC167], NFD: [0x1109, 0x1167, 0x11BA], NFKC: [0xC167], NFKD: [0x1109, 0x1167, 0x11BA] }, +{ source: [0xC168], NFC: [0xC168], NFD: [0x1109, 0x1167, 0x11BB], NFKC: [0xC168], NFKD: [0x1109, 0x1167, 0x11BB] }, +{ source: [0xC169], NFC: [0xC169], NFD: [0x1109, 0x1167, 0x11BC], NFKC: [0xC169], NFKD: [0x1109, 0x1167, 0x11BC] }, +{ source: [0xC16A], NFC: [0xC16A], NFD: [0x1109, 0x1167, 0x11BD], NFKC: [0xC16A], NFKD: [0x1109, 0x1167, 0x11BD] }, +{ source: [0xC16B], NFC: [0xC16B], NFD: [0x1109, 0x1167, 0x11BE], NFKC: [0xC16B], NFKD: [0x1109, 0x1167, 0x11BE] }, +{ source: [0xC16C], NFC: [0xC16C], NFD: [0x1109, 0x1167, 0x11BF], NFKC: [0xC16C], NFKD: [0x1109, 0x1167, 0x11BF] }, +{ source: [0xC16D], NFC: [0xC16D], NFD: [0x1109, 0x1167, 0x11C0], NFKC: [0xC16D], NFKD: [0x1109, 0x1167, 0x11C0] }, +{ source: [0xC16E], NFC: [0xC16E], NFD: [0x1109, 0x1167, 0x11C1], NFKC: [0xC16E], NFKD: [0x1109, 0x1167, 0x11C1] }, +{ source: [0xC16F], NFC: [0xC16F], NFD: [0x1109, 0x1167, 0x11C2], NFKC: [0xC16F], NFKD: [0x1109, 0x1167, 0x11C2] }, +{ source: [0xC170], NFC: [0xC170], NFD: [0x1109, 0x1168], NFKC: [0xC170], NFKD: [0x1109, 0x1168] }, +{ source: [0xC171], NFC: [0xC171], NFD: [0x1109, 0x1168, 0x11A8], NFKC: [0xC171], NFKD: [0x1109, 0x1168, 0x11A8] }, +{ source: [0xC172], NFC: [0xC172], NFD: [0x1109, 0x1168, 0x11A9], NFKC: [0xC172], NFKD: [0x1109, 0x1168, 0x11A9] }, +{ source: [0xC173], NFC: [0xC173], NFD: [0x1109, 0x1168, 0x11AA], NFKC: [0xC173], NFKD: [0x1109, 0x1168, 0x11AA] }, +{ source: [0xC174], NFC: [0xC174], NFD: [0x1109, 0x1168, 0x11AB], NFKC: [0xC174], NFKD: [0x1109, 0x1168, 0x11AB] }, +{ source: [0xC175], NFC: [0xC175], NFD: [0x1109, 0x1168, 0x11AC], NFKC: [0xC175], NFKD: [0x1109, 0x1168, 0x11AC] }, +{ source: [0xC176], NFC: [0xC176], NFD: [0x1109, 0x1168, 0x11AD], NFKC: [0xC176], NFKD: [0x1109, 0x1168, 0x11AD] }, +{ source: [0xC177], NFC: [0xC177], NFD: [0x1109, 0x1168, 0x11AE], NFKC: [0xC177], NFKD: [0x1109, 0x1168, 0x11AE] }, +{ source: [0xC178], NFC: [0xC178], NFD: [0x1109, 0x1168, 0x11AF], NFKC: [0xC178], NFKD: [0x1109, 0x1168, 0x11AF] }, +{ source: [0xC179], NFC: [0xC179], NFD: [0x1109, 0x1168, 0x11B0], NFKC: [0xC179], NFKD: [0x1109, 0x1168, 0x11B0] }, +{ source: [0xC17A], NFC: [0xC17A], NFD: [0x1109, 0x1168, 0x11B1], NFKC: [0xC17A], NFKD: [0x1109, 0x1168, 0x11B1] }, +{ source: [0xC17B], NFC: [0xC17B], NFD: [0x1109, 0x1168, 0x11B2], NFKC: [0xC17B], NFKD: [0x1109, 0x1168, 0x11B2] }, +{ source: [0xC17C], NFC: [0xC17C], NFD: [0x1109, 0x1168, 0x11B3], NFKC: [0xC17C], NFKD: [0x1109, 0x1168, 0x11B3] }, +{ source: [0xC17D], NFC: [0xC17D], NFD: [0x1109, 0x1168, 0x11B4], NFKC: [0xC17D], NFKD: [0x1109, 0x1168, 0x11B4] }, +{ source: [0xC17E], NFC: [0xC17E], NFD: [0x1109, 0x1168, 0x11B5], NFKC: [0xC17E], NFKD: [0x1109, 0x1168, 0x11B5] }, +{ source: [0xC17F], NFC: [0xC17F], NFD: [0x1109, 0x1168, 0x11B6], NFKC: [0xC17F], NFKD: [0x1109, 0x1168, 0x11B6] }, +{ source: [0xC180], NFC: [0xC180], NFD: [0x1109, 0x1168, 0x11B7], NFKC: [0xC180], NFKD: [0x1109, 0x1168, 0x11B7] }, +{ source: [0xC181], NFC: [0xC181], NFD: [0x1109, 0x1168, 0x11B8], NFKC: [0xC181], NFKD: [0x1109, 0x1168, 0x11B8] }, +{ source: [0xC182], NFC: [0xC182], NFD: [0x1109, 0x1168, 0x11B9], NFKC: [0xC182], NFKD: [0x1109, 0x1168, 0x11B9] }, +{ source: [0xC183], NFC: [0xC183], NFD: [0x1109, 0x1168, 0x11BA], NFKC: [0xC183], NFKD: [0x1109, 0x1168, 0x11BA] }, +{ source: [0xC184], NFC: [0xC184], NFD: [0x1109, 0x1168, 0x11BB], NFKC: [0xC184], NFKD: [0x1109, 0x1168, 0x11BB] }, +{ source: [0xC185], NFC: [0xC185], NFD: [0x1109, 0x1168, 0x11BC], NFKC: [0xC185], NFKD: [0x1109, 0x1168, 0x11BC] }, +{ source: [0xC186], NFC: [0xC186], NFD: [0x1109, 0x1168, 0x11BD], NFKC: [0xC186], NFKD: [0x1109, 0x1168, 0x11BD] }, +{ source: [0xC187], NFC: [0xC187], NFD: [0x1109, 0x1168, 0x11BE], NFKC: [0xC187], NFKD: [0x1109, 0x1168, 0x11BE] }, +{ source: [0xC188], NFC: [0xC188], NFD: [0x1109, 0x1168, 0x11BF], NFKC: [0xC188], NFKD: [0x1109, 0x1168, 0x11BF] }, +{ source: [0xC189], NFC: [0xC189], NFD: [0x1109, 0x1168, 0x11C0], NFKC: [0xC189], NFKD: [0x1109, 0x1168, 0x11C0] }, +{ source: [0xC18A], NFC: [0xC18A], NFD: [0x1109, 0x1168, 0x11C1], NFKC: [0xC18A], NFKD: [0x1109, 0x1168, 0x11C1] }, +{ source: [0xC18B], NFC: [0xC18B], NFD: [0x1109, 0x1168, 0x11C2], NFKC: [0xC18B], NFKD: [0x1109, 0x1168, 0x11C2] }, +{ source: [0xC18C], NFC: [0xC18C], NFD: [0x1109, 0x1169], NFKC: [0xC18C], NFKD: [0x1109, 0x1169] }, +{ source: [0xC18D], NFC: [0xC18D], NFD: [0x1109, 0x1169, 0x11A8], NFKC: [0xC18D], NFKD: [0x1109, 0x1169, 0x11A8] }, +{ source: [0xC18E], NFC: [0xC18E], NFD: [0x1109, 0x1169, 0x11A9], NFKC: [0xC18E], NFKD: [0x1109, 0x1169, 0x11A9] }, +{ source: [0xC18F], NFC: [0xC18F], NFD: [0x1109, 0x1169, 0x11AA], NFKC: [0xC18F], NFKD: [0x1109, 0x1169, 0x11AA] }, +{ source: [0xC190], NFC: [0xC190], NFD: [0x1109, 0x1169, 0x11AB], NFKC: [0xC190], NFKD: [0x1109, 0x1169, 0x11AB] }, +{ source: [0xC191], NFC: [0xC191], NFD: [0x1109, 0x1169, 0x11AC], NFKC: [0xC191], NFKD: [0x1109, 0x1169, 0x11AC] }, +{ source: [0xC192], NFC: [0xC192], NFD: [0x1109, 0x1169, 0x11AD], NFKC: [0xC192], NFKD: [0x1109, 0x1169, 0x11AD] }, +{ source: [0xC193], NFC: [0xC193], NFD: [0x1109, 0x1169, 0x11AE], NFKC: [0xC193], NFKD: [0x1109, 0x1169, 0x11AE] }, +{ source: [0xC194], NFC: [0xC194], NFD: [0x1109, 0x1169, 0x11AF], NFKC: [0xC194], NFKD: [0x1109, 0x1169, 0x11AF] }, +{ source: [0xC195], NFC: [0xC195], NFD: [0x1109, 0x1169, 0x11B0], NFKC: [0xC195], NFKD: [0x1109, 0x1169, 0x11B0] }, +{ source: [0xC196], NFC: [0xC196], NFD: [0x1109, 0x1169, 0x11B1], NFKC: [0xC196], NFKD: [0x1109, 0x1169, 0x11B1] }, +{ source: [0xC197], NFC: [0xC197], NFD: [0x1109, 0x1169, 0x11B2], NFKC: [0xC197], NFKD: [0x1109, 0x1169, 0x11B2] }, +{ source: [0xC198], NFC: [0xC198], NFD: [0x1109, 0x1169, 0x11B3], NFKC: [0xC198], NFKD: [0x1109, 0x1169, 0x11B3] }, +{ source: [0xC199], NFC: [0xC199], NFD: [0x1109, 0x1169, 0x11B4], NFKC: [0xC199], NFKD: [0x1109, 0x1169, 0x11B4] }, +{ source: [0xC19A], NFC: [0xC19A], NFD: [0x1109, 0x1169, 0x11B5], NFKC: [0xC19A], NFKD: [0x1109, 0x1169, 0x11B5] }, +{ source: [0xC19B], NFC: [0xC19B], NFD: [0x1109, 0x1169, 0x11B6], NFKC: [0xC19B], NFKD: [0x1109, 0x1169, 0x11B6] }, +{ source: [0xC19C], NFC: [0xC19C], NFD: [0x1109, 0x1169, 0x11B7], NFKC: [0xC19C], NFKD: [0x1109, 0x1169, 0x11B7] }, +{ source: [0xC19D], NFC: [0xC19D], NFD: [0x1109, 0x1169, 0x11B8], NFKC: [0xC19D], NFKD: [0x1109, 0x1169, 0x11B8] }, +{ source: [0xC19E], NFC: [0xC19E], NFD: [0x1109, 0x1169, 0x11B9], NFKC: [0xC19E], NFKD: [0x1109, 0x1169, 0x11B9] }, +{ source: [0xC19F], NFC: [0xC19F], NFD: [0x1109, 0x1169, 0x11BA], NFKC: [0xC19F], NFKD: [0x1109, 0x1169, 0x11BA] }, +{ source: [0xC1A0], NFC: [0xC1A0], NFD: [0x1109, 0x1169, 0x11BB], NFKC: [0xC1A0], NFKD: [0x1109, 0x1169, 0x11BB] }, +{ source: [0xC1A1], NFC: [0xC1A1], NFD: [0x1109, 0x1169, 0x11BC], NFKC: [0xC1A1], NFKD: [0x1109, 0x1169, 0x11BC] }, +{ source: [0xC1A2], NFC: [0xC1A2], NFD: [0x1109, 0x1169, 0x11BD], NFKC: [0xC1A2], NFKD: [0x1109, 0x1169, 0x11BD] }, +{ source: [0xC1A3], NFC: [0xC1A3], NFD: [0x1109, 0x1169, 0x11BE], NFKC: [0xC1A3], NFKD: [0x1109, 0x1169, 0x11BE] }, +{ source: [0xC1A4], NFC: [0xC1A4], NFD: [0x1109, 0x1169, 0x11BF], NFKC: [0xC1A4], NFKD: [0x1109, 0x1169, 0x11BF] }, +{ source: [0xC1A5], NFC: [0xC1A5], NFD: [0x1109, 0x1169, 0x11C0], NFKC: [0xC1A5], NFKD: [0x1109, 0x1169, 0x11C0] }, +{ source: [0xC1A6], NFC: [0xC1A6], NFD: [0x1109, 0x1169, 0x11C1], NFKC: [0xC1A6], NFKD: [0x1109, 0x1169, 0x11C1] }, +{ source: [0xC1A7], NFC: [0xC1A7], NFD: [0x1109, 0x1169, 0x11C2], NFKC: [0xC1A7], NFKD: [0x1109, 0x1169, 0x11C2] }, +{ source: [0xC1A8], NFC: [0xC1A8], NFD: [0x1109, 0x116A], NFKC: [0xC1A8], NFKD: [0x1109, 0x116A] }, +{ source: [0xC1A9], NFC: [0xC1A9], NFD: [0x1109, 0x116A, 0x11A8], NFKC: [0xC1A9], NFKD: [0x1109, 0x116A, 0x11A8] }, +{ source: [0xC1AA], NFC: [0xC1AA], NFD: [0x1109, 0x116A, 0x11A9], NFKC: [0xC1AA], NFKD: [0x1109, 0x116A, 0x11A9] }, +{ source: [0xC1AB], NFC: [0xC1AB], NFD: [0x1109, 0x116A, 0x11AA], NFKC: [0xC1AB], NFKD: [0x1109, 0x116A, 0x11AA] }, +{ source: [0xC1AC], NFC: [0xC1AC], NFD: [0x1109, 0x116A, 0x11AB], NFKC: [0xC1AC], NFKD: [0x1109, 0x116A, 0x11AB] }, +{ source: [0xC1AD], NFC: [0xC1AD], NFD: [0x1109, 0x116A, 0x11AC], NFKC: [0xC1AD], NFKD: [0x1109, 0x116A, 0x11AC] }, +{ source: [0xC1AE], NFC: [0xC1AE], NFD: [0x1109, 0x116A, 0x11AD], NFKC: [0xC1AE], NFKD: [0x1109, 0x116A, 0x11AD] }, +{ source: [0xC1AF], NFC: [0xC1AF], NFD: [0x1109, 0x116A, 0x11AE], NFKC: [0xC1AF], NFKD: [0x1109, 0x116A, 0x11AE] }, +{ source: [0xC1B0], NFC: [0xC1B0], NFD: [0x1109, 0x116A, 0x11AF], NFKC: [0xC1B0], NFKD: [0x1109, 0x116A, 0x11AF] }, +{ source: [0xC1B1], NFC: [0xC1B1], NFD: [0x1109, 0x116A, 0x11B0], NFKC: [0xC1B1], NFKD: [0x1109, 0x116A, 0x11B0] }, +{ source: [0xC1B2], NFC: [0xC1B2], NFD: [0x1109, 0x116A, 0x11B1], NFKC: [0xC1B2], NFKD: [0x1109, 0x116A, 0x11B1] }, +{ source: [0xC1B3], NFC: [0xC1B3], NFD: [0x1109, 0x116A, 0x11B2], NFKC: [0xC1B3], NFKD: [0x1109, 0x116A, 0x11B2] }, +{ source: [0xC1B4], NFC: [0xC1B4], NFD: [0x1109, 0x116A, 0x11B3], NFKC: [0xC1B4], NFKD: [0x1109, 0x116A, 0x11B3] }, +{ source: [0xC1B5], NFC: [0xC1B5], NFD: [0x1109, 0x116A, 0x11B4], NFKC: [0xC1B5], NFKD: [0x1109, 0x116A, 0x11B4] }, +{ source: [0xC1B6], NFC: [0xC1B6], NFD: [0x1109, 0x116A, 0x11B5], NFKC: [0xC1B6], NFKD: [0x1109, 0x116A, 0x11B5] }, +{ source: [0xC1B7], NFC: [0xC1B7], NFD: [0x1109, 0x116A, 0x11B6], NFKC: [0xC1B7], NFKD: [0x1109, 0x116A, 0x11B6] }, +{ source: [0xC1B8], NFC: [0xC1B8], NFD: [0x1109, 0x116A, 0x11B7], NFKC: [0xC1B8], NFKD: [0x1109, 0x116A, 0x11B7] }, +{ source: [0xC1B9], NFC: [0xC1B9], NFD: [0x1109, 0x116A, 0x11B8], NFKC: [0xC1B9], NFKD: [0x1109, 0x116A, 0x11B8] }, +{ source: [0xC1BA], NFC: [0xC1BA], NFD: [0x1109, 0x116A, 0x11B9], NFKC: [0xC1BA], NFKD: [0x1109, 0x116A, 0x11B9] }, +{ source: [0xC1BB], NFC: [0xC1BB], NFD: [0x1109, 0x116A, 0x11BA], NFKC: [0xC1BB], NFKD: [0x1109, 0x116A, 0x11BA] }, +{ source: [0xC1BC], NFC: [0xC1BC], NFD: [0x1109, 0x116A, 0x11BB], NFKC: [0xC1BC], NFKD: [0x1109, 0x116A, 0x11BB] }, +{ source: [0xC1BD], NFC: [0xC1BD], NFD: [0x1109, 0x116A, 0x11BC], NFKC: [0xC1BD], NFKD: [0x1109, 0x116A, 0x11BC] }, +{ source: [0xC1BE], NFC: [0xC1BE], NFD: [0x1109, 0x116A, 0x11BD], NFKC: [0xC1BE], NFKD: [0x1109, 0x116A, 0x11BD] }, +{ source: [0xC1BF], NFC: [0xC1BF], NFD: [0x1109, 0x116A, 0x11BE], NFKC: [0xC1BF], NFKD: [0x1109, 0x116A, 0x11BE] }, +{ source: [0xC1C0], NFC: [0xC1C0], NFD: [0x1109, 0x116A, 0x11BF], NFKC: [0xC1C0], NFKD: [0x1109, 0x116A, 0x11BF] }, +{ source: [0xC1C1], NFC: [0xC1C1], NFD: [0x1109, 0x116A, 0x11C0], NFKC: [0xC1C1], NFKD: [0x1109, 0x116A, 0x11C0] }, +{ source: [0xC1C2], NFC: [0xC1C2], NFD: [0x1109, 0x116A, 0x11C1], NFKC: [0xC1C2], NFKD: [0x1109, 0x116A, 0x11C1] }, +{ source: [0xC1C3], NFC: [0xC1C3], NFD: [0x1109, 0x116A, 0x11C2], NFKC: [0xC1C3], NFKD: [0x1109, 0x116A, 0x11C2] }, +{ source: [0xC1C4], NFC: [0xC1C4], NFD: [0x1109, 0x116B], NFKC: [0xC1C4], NFKD: [0x1109, 0x116B] }, +{ source: [0xC1C5], NFC: [0xC1C5], NFD: [0x1109, 0x116B, 0x11A8], NFKC: [0xC1C5], NFKD: [0x1109, 0x116B, 0x11A8] }, +{ source: [0xC1C6], NFC: [0xC1C6], NFD: [0x1109, 0x116B, 0x11A9], NFKC: [0xC1C6], NFKD: [0x1109, 0x116B, 0x11A9] }, +{ source: [0xC1C7], NFC: [0xC1C7], NFD: [0x1109, 0x116B, 0x11AA], NFKC: [0xC1C7], NFKD: [0x1109, 0x116B, 0x11AA] }, +{ source: [0xC1C8], NFC: [0xC1C8], NFD: [0x1109, 0x116B, 0x11AB], NFKC: [0xC1C8], NFKD: [0x1109, 0x116B, 0x11AB] }, +{ source: [0xC1C9], NFC: [0xC1C9], NFD: [0x1109, 0x116B, 0x11AC], NFKC: [0xC1C9], NFKD: [0x1109, 0x116B, 0x11AC] }, +{ source: [0xC1CA], NFC: [0xC1CA], NFD: [0x1109, 0x116B, 0x11AD], NFKC: [0xC1CA], NFKD: [0x1109, 0x116B, 0x11AD] }, +{ source: [0xC1CB], NFC: [0xC1CB], NFD: [0x1109, 0x116B, 0x11AE], NFKC: [0xC1CB], NFKD: [0x1109, 0x116B, 0x11AE] }, +{ source: [0xC1CC], NFC: [0xC1CC], NFD: [0x1109, 0x116B, 0x11AF], NFKC: [0xC1CC], NFKD: [0x1109, 0x116B, 0x11AF] }, +{ source: [0xC1CD], NFC: [0xC1CD], NFD: [0x1109, 0x116B, 0x11B0], NFKC: [0xC1CD], NFKD: [0x1109, 0x116B, 0x11B0] }, +{ source: [0xC1CE], NFC: [0xC1CE], NFD: [0x1109, 0x116B, 0x11B1], NFKC: [0xC1CE], NFKD: [0x1109, 0x116B, 0x11B1] }, +{ source: [0xC1CF], NFC: [0xC1CF], NFD: [0x1109, 0x116B, 0x11B2], NFKC: [0xC1CF], NFKD: [0x1109, 0x116B, 0x11B2] }, +{ source: [0xC1D0], NFC: [0xC1D0], NFD: [0x1109, 0x116B, 0x11B3], NFKC: [0xC1D0], NFKD: [0x1109, 0x116B, 0x11B3] }, +{ source: [0xC1D1], NFC: [0xC1D1], NFD: [0x1109, 0x116B, 0x11B4], NFKC: [0xC1D1], NFKD: [0x1109, 0x116B, 0x11B4] }, +{ source: [0xC1D2], NFC: [0xC1D2], NFD: [0x1109, 0x116B, 0x11B5], NFKC: [0xC1D2], NFKD: [0x1109, 0x116B, 0x11B5] }, +{ source: [0xC1D3], NFC: [0xC1D3], NFD: [0x1109, 0x116B, 0x11B6], NFKC: [0xC1D3], NFKD: [0x1109, 0x116B, 0x11B6] }, +{ source: [0xC1D4], NFC: [0xC1D4], NFD: [0x1109, 0x116B, 0x11B7], NFKC: [0xC1D4], NFKD: [0x1109, 0x116B, 0x11B7] }, +{ source: [0xC1D5], NFC: [0xC1D5], NFD: [0x1109, 0x116B, 0x11B8], NFKC: [0xC1D5], NFKD: [0x1109, 0x116B, 0x11B8] }, +{ source: [0xC1D6], NFC: [0xC1D6], NFD: [0x1109, 0x116B, 0x11B9], NFKC: [0xC1D6], NFKD: [0x1109, 0x116B, 0x11B9] }, +{ source: [0xC1D7], NFC: [0xC1D7], NFD: [0x1109, 0x116B, 0x11BA], NFKC: [0xC1D7], NFKD: [0x1109, 0x116B, 0x11BA] }, +{ source: [0xC1D8], NFC: [0xC1D8], NFD: [0x1109, 0x116B, 0x11BB], NFKC: [0xC1D8], NFKD: [0x1109, 0x116B, 0x11BB] }, +{ source: [0xC1D9], NFC: [0xC1D9], NFD: [0x1109, 0x116B, 0x11BC], NFKC: [0xC1D9], NFKD: [0x1109, 0x116B, 0x11BC] }, +{ source: [0xC1DA], NFC: [0xC1DA], NFD: [0x1109, 0x116B, 0x11BD], NFKC: [0xC1DA], NFKD: [0x1109, 0x116B, 0x11BD] }, +{ source: [0xC1DB], NFC: [0xC1DB], NFD: [0x1109, 0x116B, 0x11BE], NFKC: [0xC1DB], NFKD: [0x1109, 0x116B, 0x11BE] }, +{ source: [0xC1DC], NFC: [0xC1DC], NFD: [0x1109, 0x116B, 0x11BF], NFKC: [0xC1DC], NFKD: [0x1109, 0x116B, 0x11BF] }, +{ source: [0xC1DD], NFC: [0xC1DD], NFD: [0x1109, 0x116B, 0x11C0], NFKC: [0xC1DD], NFKD: [0x1109, 0x116B, 0x11C0] }, +{ source: [0xC1DE], NFC: [0xC1DE], NFD: [0x1109, 0x116B, 0x11C1], NFKC: [0xC1DE], NFKD: [0x1109, 0x116B, 0x11C1] }, +{ source: [0xC1DF], NFC: [0xC1DF], NFD: [0x1109, 0x116B, 0x11C2], NFKC: [0xC1DF], NFKD: [0x1109, 0x116B, 0x11C2] }, +{ source: [0xC1E0], NFC: [0xC1E0], NFD: [0x1109, 0x116C], NFKC: [0xC1E0], NFKD: [0x1109, 0x116C] }, +{ source: [0xC1E1], NFC: [0xC1E1], NFD: [0x1109, 0x116C, 0x11A8], NFKC: [0xC1E1], NFKD: [0x1109, 0x116C, 0x11A8] }, +{ source: [0xC1E2], NFC: [0xC1E2], NFD: [0x1109, 0x116C, 0x11A9], NFKC: [0xC1E2], NFKD: [0x1109, 0x116C, 0x11A9] }, +{ source: [0xC1E3], NFC: [0xC1E3], NFD: [0x1109, 0x116C, 0x11AA], NFKC: [0xC1E3], NFKD: [0x1109, 0x116C, 0x11AA] }, +{ source: [0xC1E4], NFC: [0xC1E4], NFD: [0x1109, 0x116C, 0x11AB], NFKC: [0xC1E4], NFKD: [0x1109, 0x116C, 0x11AB] }, +{ source: [0xC1E5], NFC: [0xC1E5], NFD: [0x1109, 0x116C, 0x11AC], NFKC: [0xC1E5], NFKD: [0x1109, 0x116C, 0x11AC] }, +{ source: [0xC1E6], NFC: [0xC1E6], NFD: [0x1109, 0x116C, 0x11AD], NFKC: [0xC1E6], NFKD: [0x1109, 0x116C, 0x11AD] }, +{ source: [0xC1E7], NFC: [0xC1E7], NFD: [0x1109, 0x116C, 0x11AE], NFKC: [0xC1E7], NFKD: [0x1109, 0x116C, 0x11AE] }, +{ source: [0xC1E8], NFC: [0xC1E8], NFD: [0x1109, 0x116C, 0x11AF], NFKC: [0xC1E8], NFKD: [0x1109, 0x116C, 0x11AF] }, +{ source: [0xC1E9], NFC: [0xC1E9], NFD: [0x1109, 0x116C, 0x11B0], NFKC: [0xC1E9], NFKD: [0x1109, 0x116C, 0x11B0] }, +{ source: [0xC1EA], NFC: [0xC1EA], NFD: [0x1109, 0x116C, 0x11B1], NFKC: [0xC1EA], NFKD: [0x1109, 0x116C, 0x11B1] }, +{ source: [0xC1EB], NFC: [0xC1EB], NFD: [0x1109, 0x116C, 0x11B2], NFKC: [0xC1EB], NFKD: [0x1109, 0x116C, 0x11B2] }, +{ source: [0xC1EC], NFC: [0xC1EC], NFD: [0x1109, 0x116C, 0x11B3], NFKC: [0xC1EC], NFKD: [0x1109, 0x116C, 0x11B3] }, +{ source: [0xC1ED], NFC: [0xC1ED], NFD: [0x1109, 0x116C, 0x11B4], NFKC: [0xC1ED], NFKD: [0x1109, 0x116C, 0x11B4] }, +{ source: [0xC1EE], NFC: [0xC1EE], NFD: [0x1109, 0x116C, 0x11B5], NFKC: [0xC1EE], NFKD: [0x1109, 0x116C, 0x11B5] }, +{ source: [0xC1EF], NFC: [0xC1EF], NFD: [0x1109, 0x116C, 0x11B6], NFKC: [0xC1EF], NFKD: [0x1109, 0x116C, 0x11B6] }, +{ source: [0xC1F0], NFC: [0xC1F0], NFD: [0x1109, 0x116C, 0x11B7], NFKC: [0xC1F0], NFKD: [0x1109, 0x116C, 0x11B7] }, +{ source: [0xC1F1], NFC: [0xC1F1], NFD: [0x1109, 0x116C, 0x11B8], NFKC: [0xC1F1], NFKD: [0x1109, 0x116C, 0x11B8] }, +{ source: [0xC1F2], NFC: [0xC1F2], NFD: [0x1109, 0x116C, 0x11B9], NFKC: [0xC1F2], NFKD: [0x1109, 0x116C, 0x11B9] }, +{ source: [0xC1F3], NFC: [0xC1F3], NFD: [0x1109, 0x116C, 0x11BA], NFKC: [0xC1F3], NFKD: [0x1109, 0x116C, 0x11BA] }, +{ source: [0xC1F4], NFC: [0xC1F4], NFD: [0x1109, 0x116C, 0x11BB], NFKC: [0xC1F4], NFKD: [0x1109, 0x116C, 0x11BB] }, +{ source: [0xC1F5], NFC: [0xC1F5], NFD: [0x1109, 0x116C, 0x11BC], NFKC: [0xC1F5], NFKD: [0x1109, 0x116C, 0x11BC] }, +{ source: [0xC1F6], NFC: [0xC1F6], NFD: [0x1109, 0x116C, 0x11BD], NFKC: [0xC1F6], NFKD: [0x1109, 0x116C, 0x11BD] }, +{ source: [0xC1F7], NFC: [0xC1F7], NFD: [0x1109, 0x116C, 0x11BE], NFKC: [0xC1F7], NFKD: [0x1109, 0x116C, 0x11BE] }, +{ source: [0xC1F8], NFC: [0xC1F8], NFD: [0x1109, 0x116C, 0x11BF], NFKC: [0xC1F8], NFKD: [0x1109, 0x116C, 0x11BF] }, +{ source: [0xC1F9], NFC: [0xC1F9], NFD: [0x1109, 0x116C, 0x11C0], NFKC: [0xC1F9], NFKD: [0x1109, 0x116C, 0x11C0] }, +{ source: [0xC1FA], NFC: [0xC1FA], NFD: [0x1109, 0x116C, 0x11C1], NFKC: [0xC1FA], NFKD: [0x1109, 0x116C, 0x11C1] }, +{ source: [0xC1FB], NFC: [0xC1FB], NFD: [0x1109, 0x116C, 0x11C2], NFKC: [0xC1FB], NFKD: [0x1109, 0x116C, 0x11C2] }, +{ source: [0xC1FC], NFC: [0xC1FC], NFD: [0x1109, 0x116D], NFKC: [0xC1FC], NFKD: [0x1109, 0x116D] }, +{ source: [0xC1FD], NFC: [0xC1FD], NFD: [0x1109, 0x116D, 0x11A8], NFKC: [0xC1FD], NFKD: [0x1109, 0x116D, 0x11A8] }, +{ source: [0xC1FE], NFC: [0xC1FE], NFD: [0x1109, 0x116D, 0x11A9], NFKC: [0xC1FE], NFKD: [0x1109, 0x116D, 0x11A9] }, +{ source: [0xC1FF], NFC: [0xC1FF], NFD: [0x1109, 0x116D, 0x11AA], NFKC: [0xC1FF], NFKD: [0x1109, 0x116D, 0x11AA] }, +{ source: [0xC200], NFC: [0xC200], NFD: [0x1109, 0x116D, 0x11AB], NFKC: [0xC200], NFKD: [0x1109, 0x116D, 0x11AB] }, +{ source: [0xC201], NFC: [0xC201], NFD: [0x1109, 0x116D, 0x11AC], NFKC: [0xC201], NFKD: [0x1109, 0x116D, 0x11AC] }, +{ source: [0xC202], NFC: [0xC202], NFD: [0x1109, 0x116D, 0x11AD], NFKC: [0xC202], NFKD: [0x1109, 0x116D, 0x11AD] }, +{ source: [0xC203], NFC: [0xC203], NFD: [0x1109, 0x116D, 0x11AE], NFKC: [0xC203], NFKD: [0x1109, 0x116D, 0x11AE] }, +{ source: [0xC204], NFC: [0xC204], NFD: [0x1109, 0x116D, 0x11AF], NFKC: [0xC204], NFKD: [0x1109, 0x116D, 0x11AF] }, +{ source: [0xC205], NFC: [0xC205], NFD: [0x1109, 0x116D, 0x11B0], NFKC: [0xC205], NFKD: [0x1109, 0x116D, 0x11B0] }, +{ source: [0xC206], NFC: [0xC206], NFD: [0x1109, 0x116D, 0x11B1], NFKC: [0xC206], NFKD: [0x1109, 0x116D, 0x11B1] }, +{ source: [0xC207], NFC: [0xC207], NFD: [0x1109, 0x116D, 0x11B2], NFKC: [0xC207], NFKD: [0x1109, 0x116D, 0x11B2] }, +{ source: [0xC208], NFC: [0xC208], NFD: [0x1109, 0x116D, 0x11B3], NFKC: [0xC208], NFKD: [0x1109, 0x116D, 0x11B3] }, +{ source: [0xC209], NFC: [0xC209], NFD: [0x1109, 0x116D, 0x11B4], NFKC: [0xC209], NFKD: [0x1109, 0x116D, 0x11B4] }, +{ source: [0xC20A], NFC: [0xC20A], NFD: [0x1109, 0x116D, 0x11B5], NFKC: [0xC20A], NFKD: [0x1109, 0x116D, 0x11B5] }, +{ source: [0xC20B], NFC: [0xC20B], NFD: [0x1109, 0x116D, 0x11B6], NFKC: [0xC20B], NFKD: [0x1109, 0x116D, 0x11B6] }, +{ source: [0xC20C], NFC: [0xC20C], NFD: [0x1109, 0x116D, 0x11B7], NFKC: [0xC20C], NFKD: [0x1109, 0x116D, 0x11B7] }, +{ source: [0xC20D], NFC: [0xC20D], NFD: [0x1109, 0x116D, 0x11B8], NFKC: [0xC20D], NFKD: [0x1109, 0x116D, 0x11B8] }, +{ source: [0xC20E], NFC: [0xC20E], NFD: [0x1109, 0x116D, 0x11B9], NFKC: [0xC20E], NFKD: [0x1109, 0x116D, 0x11B9] }, +{ source: [0xC20F], NFC: [0xC20F], NFD: [0x1109, 0x116D, 0x11BA], NFKC: [0xC20F], NFKD: [0x1109, 0x116D, 0x11BA] }, +{ source: [0xC210], NFC: [0xC210], NFD: [0x1109, 0x116D, 0x11BB], NFKC: [0xC210], NFKD: [0x1109, 0x116D, 0x11BB] }, +{ source: [0xC211], NFC: [0xC211], NFD: [0x1109, 0x116D, 0x11BC], NFKC: [0xC211], NFKD: [0x1109, 0x116D, 0x11BC] }, +{ source: [0xC212], NFC: [0xC212], NFD: [0x1109, 0x116D, 0x11BD], NFKC: [0xC212], NFKD: [0x1109, 0x116D, 0x11BD] }, +{ source: [0xC213], NFC: [0xC213], NFD: [0x1109, 0x116D, 0x11BE], NFKC: [0xC213], NFKD: [0x1109, 0x116D, 0x11BE] }, +{ source: [0xC214], NFC: [0xC214], NFD: [0x1109, 0x116D, 0x11BF], NFKC: [0xC214], NFKD: [0x1109, 0x116D, 0x11BF] }, +{ source: [0xC215], NFC: [0xC215], NFD: [0x1109, 0x116D, 0x11C0], NFKC: [0xC215], NFKD: [0x1109, 0x116D, 0x11C0] }, +{ source: [0xC216], NFC: [0xC216], NFD: [0x1109, 0x116D, 0x11C1], NFKC: [0xC216], NFKD: [0x1109, 0x116D, 0x11C1] }, +{ source: [0xC217], NFC: [0xC217], NFD: [0x1109, 0x116D, 0x11C2], NFKC: [0xC217], NFKD: [0x1109, 0x116D, 0x11C2] }, +{ source: [0xC218], NFC: [0xC218], NFD: [0x1109, 0x116E], NFKC: [0xC218], NFKD: [0x1109, 0x116E] }, +{ source: [0xC219], NFC: [0xC219], NFD: [0x1109, 0x116E, 0x11A8], NFKC: [0xC219], NFKD: [0x1109, 0x116E, 0x11A8] }, +{ source: [0xC21A], NFC: [0xC21A], NFD: [0x1109, 0x116E, 0x11A9], NFKC: [0xC21A], NFKD: [0x1109, 0x116E, 0x11A9] }, +{ source: [0xC21B], NFC: [0xC21B], NFD: [0x1109, 0x116E, 0x11AA], NFKC: [0xC21B], NFKD: [0x1109, 0x116E, 0x11AA] }, +{ source: [0xC21C], NFC: [0xC21C], NFD: [0x1109, 0x116E, 0x11AB], NFKC: [0xC21C], NFKD: [0x1109, 0x116E, 0x11AB] }, +{ source: [0xC21D], NFC: [0xC21D], NFD: [0x1109, 0x116E, 0x11AC], NFKC: [0xC21D], NFKD: [0x1109, 0x116E, 0x11AC] }, +{ source: [0xC21E], NFC: [0xC21E], NFD: [0x1109, 0x116E, 0x11AD], NFKC: [0xC21E], NFKD: [0x1109, 0x116E, 0x11AD] }, +{ source: [0xC21F], NFC: [0xC21F], NFD: [0x1109, 0x116E, 0x11AE], NFKC: [0xC21F], NFKD: [0x1109, 0x116E, 0x11AE] }, +{ source: [0xC220], NFC: [0xC220], NFD: [0x1109, 0x116E, 0x11AF], NFKC: [0xC220], NFKD: [0x1109, 0x116E, 0x11AF] }, +{ source: [0xC221], NFC: [0xC221], NFD: [0x1109, 0x116E, 0x11B0], NFKC: [0xC221], NFKD: [0x1109, 0x116E, 0x11B0] }, +{ source: [0xC222], NFC: [0xC222], NFD: [0x1109, 0x116E, 0x11B1], NFKC: [0xC222], NFKD: [0x1109, 0x116E, 0x11B1] }, +{ source: [0xC223], NFC: [0xC223], NFD: [0x1109, 0x116E, 0x11B2], NFKC: [0xC223], NFKD: [0x1109, 0x116E, 0x11B2] }, +{ source: [0xC224], NFC: [0xC224], NFD: [0x1109, 0x116E, 0x11B3], NFKC: [0xC224], NFKD: [0x1109, 0x116E, 0x11B3] }, +{ source: [0xC225], NFC: [0xC225], NFD: [0x1109, 0x116E, 0x11B4], NFKC: [0xC225], NFKD: [0x1109, 0x116E, 0x11B4] }, +{ source: [0xC226], NFC: [0xC226], NFD: [0x1109, 0x116E, 0x11B5], NFKC: [0xC226], NFKD: [0x1109, 0x116E, 0x11B5] }, +{ source: [0xC227], NFC: [0xC227], NFD: [0x1109, 0x116E, 0x11B6], NFKC: [0xC227], NFKD: [0x1109, 0x116E, 0x11B6] }, +{ source: [0xC228], NFC: [0xC228], NFD: [0x1109, 0x116E, 0x11B7], NFKC: [0xC228], NFKD: [0x1109, 0x116E, 0x11B7] }, +{ source: [0xC229], NFC: [0xC229], NFD: [0x1109, 0x116E, 0x11B8], NFKC: [0xC229], NFKD: [0x1109, 0x116E, 0x11B8] }, +{ source: [0xC22A], NFC: [0xC22A], NFD: [0x1109, 0x116E, 0x11B9], NFKC: [0xC22A], NFKD: [0x1109, 0x116E, 0x11B9] }, +{ source: [0xC22B], NFC: [0xC22B], NFD: [0x1109, 0x116E, 0x11BA], NFKC: [0xC22B], NFKD: [0x1109, 0x116E, 0x11BA] }, +{ source: [0xC22C], NFC: [0xC22C], NFD: [0x1109, 0x116E, 0x11BB], NFKC: [0xC22C], NFKD: [0x1109, 0x116E, 0x11BB] }, +{ source: [0xC22D], NFC: [0xC22D], NFD: [0x1109, 0x116E, 0x11BC], NFKC: [0xC22D], NFKD: [0x1109, 0x116E, 0x11BC] }, +{ source: [0xC22E], NFC: [0xC22E], NFD: [0x1109, 0x116E, 0x11BD], NFKC: [0xC22E], NFKD: [0x1109, 0x116E, 0x11BD] }, +{ source: [0xC22F], NFC: [0xC22F], NFD: [0x1109, 0x116E, 0x11BE], NFKC: [0xC22F], NFKD: [0x1109, 0x116E, 0x11BE] }, +{ source: [0xC230], NFC: [0xC230], NFD: [0x1109, 0x116E, 0x11BF], NFKC: [0xC230], NFKD: [0x1109, 0x116E, 0x11BF] }, +{ source: [0xC231], NFC: [0xC231], NFD: [0x1109, 0x116E, 0x11C0], NFKC: [0xC231], NFKD: [0x1109, 0x116E, 0x11C0] }, +{ source: [0xC232], NFC: [0xC232], NFD: [0x1109, 0x116E, 0x11C1], NFKC: [0xC232], NFKD: [0x1109, 0x116E, 0x11C1] }, +{ source: [0xC233], NFC: [0xC233], NFD: [0x1109, 0x116E, 0x11C2], NFKC: [0xC233], NFKD: [0x1109, 0x116E, 0x11C2] }, +{ source: [0xC234], NFC: [0xC234], NFD: [0x1109, 0x116F], NFKC: [0xC234], NFKD: [0x1109, 0x116F] }, +{ source: [0xC235], NFC: [0xC235], NFD: [0x1109, 0x116F, 0x11A8], NFKC: [0xC235], NFKD: [0x1109, 0x116F, 0x11A8] }, +{ source: [0xC236], NFC: [0xC236], NFD: [0x1109, 0x116F, 0x11A9], NFKC: [0xC236], NFKD: [0x1109, 0x116F, 0x11A9] }, +{ source: [0xC237], NFC: [0xC237], NFD: [0x1109, 0x116F, 0x11AA], NFKC: [0xC237], NFKD: [0x1109, 0x116F, 0x11AA] }, +{ source: [0xC238], NFC: [0xC238], NFD: [0x1109, 0x116F, 0x11AB], NFKC: [0xC238], NFKD: [0x1109, 0x116F, 0x11AB] }, +{ source: [0xC239], NFC: [0xC239], NFD: [0x1109, 0x116F, 0x11AC], NFKC: [0xC239], NFKD: [0x1109, 0x116F, 0x11AC] }, +{ source: [0xC23A], NFC: [0xC23A], NFD: [0x1109, 0x116F, 0x11AD], NFKC: [0xC23A], NFKD: [0x1109, 0x116F, 0x11AD] }, +{ source: [0xC23B], NFC: [0xC23B], NFD: [0x1109, 0x116F, 0x11AE], NFKC: [0xC23B], NFKD: [0x1109, 0x116F, 0x11AE] }, +{ source: [0xC23C], NFC: [0xC23C], NFD: [0x1109, 0x116F, 0x11AF], NFKC: [0xC23C], NFKD: [0x1109, 0x116F, 0x11AF] }, +{ source: [0xC23D], NFC: [0xC23D], NFD: [0x1109, 0x116F, 0x11B0], NFKC: [0xC23D], NFKD: [0x1109, 0x116F, 0x11B0] }, +{ source: [0xC23E], NFC: [0xC23E], NFD: [0x1109, 0x116F, 0x11B1], NFKC: [0xC23E], NFKD: [0x1109, 0x116F, 0x11B1] }, +{ source: [0xC23F], NFC: [0xC23F], NFD: [0x1109, 0x116F, 0x11B2], NFKC: [0xC23F], NFKD: [0x1109, 0x116F, 0x11B2] }, +{ source: [0xC240], NFC: [0xC240], NFD: [0x1109, 0x116F, 0x11B3], NFKC: [0xC240], NFKD: [0x1109, 0x116F, 0x11B3] }, +{ source: [0xC241], NFC: [0xC241], NFD: [0x1109, 0x116F, 0x11B4], NFKC: [0xC241], NFKD: [0x1109, 0x116F, 0x11B4] }, +{ source: [0xC242], NFC: [0xC242], NFD: [0x1109, 0x116F, 0x11B5], NFKC: [0xC242], NFKD: [0x1109, 0x116F, 0x11B5] }, +{ source: [0xC243], NFC: [0xC243], NFD: [0x1109, 0x116F, 0x11B6], NFKC: [0xC243], NFKD: [0x1109, 0x116F, 0x11B6] }, +{ source: [0xC244], NFC: [0xC244], NFD: [0x1109, 0x116F, 0x11B7], NFKC: [0xC244], NFKD: [0x1109, 0x116F, 0x11B7] }, +{ source: [0xC245], NFC: [0xC245], NFD: [0x1109, 0x116F, 0x11B8], NFKC: [0xC245], NFKD: [0x1109, 0x116F, 0x11B8] }, +{ source: [0xC246], NFC: [0xC246], NFD: [0x1109, 0x116F, 0x11B9], NFKC: [0xC246], NFKD: [0x1109, 0x116F, 0x11B9] }, +{ source: [0xC247], NFC: [0xC247], NFD: [0x1109, 0x116F, 0x11BA], NFKC: [0xC247], NFKD: [0x1109, 0x116F, 0x11BA] }, +{ source: [0xC248], NFC: [0xC248], NFD: [0x1109, 0x116F, 0x11BB], NFKC: [0xC248], NFKD: [0x1109, 0x116F, 0x11BB] }, +{ source: [0xC249], NFC: [0xC249], NFD: [0x1109, 0x116F, 0x11BC], NFKC: [0xC249], NFKD: [0x1109, 0x116F, 0x11BC] }, +{ source: [0xC24A], NFC: [0xC24A], NFD: [0x1109, 0x116F, 0x11BD], NFKC: [0xC24A], NFKD: [0x1109, 0x116F, 0x11BD] }, +{ source: [0xC24B], NFC: [0xC24B], NFD: [0x1109, 0x116F, 0x11BE], NFKC: [0xC24B], NFKD: [0x1109, 0x116F, 0x11BE] }, +{ source: [0xC24C], NFC: [0xC24C], NFD: [0x1109, 0x116F, 0x11BF], NFKC: [0xC24C], NFKD: [0x1109, 0x116F, 0x11BF] }, +{ source: [0xC24D], NFC: [0xC24D], NFD: [0x1109, 0x116F, 0x11C0], NFKC: [0xC24D], NFKD: [0x1109, 0x116F, 0x11C0] }, +{ source: [0xC24E], NFC: [0xC24E], NFD: [0x1109, 0x116F, 0x11C1], NFKC: [0xC24E], NFKD: [0x1109, 0x116F, 0x11C1] }, +{ source: [0xC24F], NFC: [0xC24F], NFD: [0x1109, 0x116F, 0x11C2], NFKC: [0xC24F], NFKD: [0x1109, 0x116F, 0x11C2] }, +{ source: [0xC250], NFC: [0xC250], NFD: [0x1109, 0x1170], NFKC: [0xC250], NFKD: [0x1109, 0x1170] }, +{ source: [0xC251], NFC: [0xC251], NFD: [0x1109, 0x1170, 0x11A8], NFKC: [0xC251], NFKD: [0x1109, 0x1170, 0x11A8] }, +{ source: [0xC252], NFC: [0xC252], NFD: [0x1109, 0x1170, 0x11A9], NFKC: [0xC252], NFKD: [0x1109, 0x1170, 0x11A9] }, +{ source: [0xC253], NFC: [0xC253], NFD: [0x1109, 0x1170, 0x11AA], NFKC: [0xC253], NFKD: [0x1109, 0x1170, 0x11AA] }, +{ source: [0xC254], NFC: [0xC254], NFD: [0x1109, 0x1170, 0x11AB], NFKC: [0xC254], NFKD: [0x1109, 0x1170, 0x11AB] }, +{ source: [0xC255], NFC: [0xC255], NFD: [0x1109, 0x1170, 0x11AC], NFKC: [0xC255], NFKD: [0x1109, 0x1170, 0x11AC] }, +{ source: [0xC256], NFC: [0xC256], NFD: [0x1109, 0x1170, 0x11AD], NFKC: [0xC256], NFKD: [0x1109, 0x1170, 0x11AD] }, +{ source: [0xC257], NFC: [0xC257], NFD: [0x1109, 0x1170, 0x11AE], NFKC: [0xC257], NFKD: [0x1109, 0x1170, 0x11AE] }, +{ source: [0xC258], NFC: [0xC258], NFD: [0x1109, 0x1170, 0x11AF], NFKC: [0xC258], NFKD: [0x1109, 0x1170, 0x11AF] }, +{ source: [0xC259], NFC: [0xC259], NFD: [0x1109, 0x1170, 0x11B0], NFKC: [0xC259], NFKD: [0x1109, 0x1170, 0x11B0] }, +{ source: [0xC25A], NFC: [0xC25A], NFD: [0x1109, 0x1170, 0x11B1], NFKC: [0xC25A], NFKD: [0x1109, 0x1170, 0x11B1] }, +{ source: [0xC25B], NFC: [0xC25B], NFD: [0x1109, 0x1170, 0x11B2], NFKC: [0xC25B], NFKD: [0x1109, 0x1170, 0x11B2] }, +{ source: [0xC25C], NFC: [0xC25C], NFD: [0x1109, 0x1170, 0x11B3], NFKC: [0xC25C], NFKD: [0x1109, 0x1170, 0x11B3] }, +{ source: [0xC25D], NFC: [0xC25D], NFD: [0x1109, 0x1170, 0x11B4], NFKC: [0xC25D], NFKD: [0x1109, 0x1170, 0x11B4] }, +{ source: [0xC25E], NFC: [0xC25E], NFD: [0x1109, 0x1170, 0x11B5], NFKC: [0xC25E], NFKD: [0x1109, 0x1170, 0x11B5] }, +{ source: [0xC25F], NFC: [0xC25F], NFD: [0x1109, 0x1170, 0x11B6], NFKC: [0xC25F], NFKD: [0x1109, 0x1170, 0x11B6] }, +{ source: [0xC260], NFC: [0xC260], NFD: [0x1109, 0x1170, 0x11B7], NFKC: [0xC260], NFKD: [0x1109, 0x1170, 0x11B7] }, +{ source: [0xC261], NFC: [0xC261], NFD: [0x1109, 0x1170, 0x11B8], NFKC: [0xC261], NFKD: [0x1109, 0x1170, 0x11B8] }, +{ source: [0xC262], NFC: [0xC262], NFD: [0x1109, 0x1170, 0x11B9], NFKC: [0xC262], NFKD: [0x1109, 0x1170, 0x11B9] }, +{ source: [0xC263], NFC: [0xC263], NFD: [0x1109, 0x1170, 0x11BA], NFKC: [0xC263], NFKD: [0x1109, 0x1170, 0x11BA] }, +{ source: [0xC264], NFC: [0xC264], NFD: [0x1109, 0x1170, 0x11BB], NFKC: [0xC264], NFKD: [0x1109, 0x1170, 0x11BB] }, +{ source: [0xC265], NFC: [0xC265], NFD: [0x1109, 0x1170, 0x11BC], NFKC: [0xC265], NFKD: [0x1109, 0x1170, 0x11BC] }, +{ source: [0xC266], NFC: [0xC266], NFD: [0x1109, 0x1170, 0x11BD], NFKC: [0xC266], NFKD: [0x1109, 0x1170, 0x11BD] }, +{ source: [0xC267], NFC: [0xC267], NFD: [0x1109, 0x1170, 0x11BE], NFKC: [0xC267], NFKD: [0x1109, 0x1170, 0x11BE] }, +{ source: [0xC268], NFC: [0xC268], NFD: [0x1109, 0x1170, 0x11BF], NFKC: [0xC268], NFKD: [0x1109, 0x1170, 0x11BF] }, +{ source: [0xC269], NFC: [0xC269], NFD: [0x1109, 0x1170, 0x11C0], NFKC: [0xC269], NFKD: [0x1109, 0x1170, 0x11C0] }, +{ source: [0xC26A], NFC: [0xC26A], NFD: [0x1109, 0x1170, 0x11C1], NFKC: [0xC26A], NFKD: [0x1109, 0x1170, 0x11C1] }, +{ source: [0xC26B], NFC: [0xC26B], NFD: [0x1109, 0x1170, 0x11C2], NFKC: [0xC26B], NFKD: [0x1109, 0x1170, 0x11C2] }, +{ source: [0xC26C], NFC: [0xC26C], NFD: [0x1109, 0x1171], NFKC: [0xC26C], NFKD: [0x1109, 0x1171] }, +{ source: [0xC26D], NFC: [0xC26D], NFD: [0x1109, 0x1171, 0x11A8], NFKC: [0xC26D], NFKD: [0x1109, 0x1171, 0x11A8] }, +{ source: [0xC26E], NFC: [0xC26E], NFD: [0x1109, 0x1171, 0x11A9], NFKC: [0xC26E], NFKD: [0x1109, 0x1171, 0x11A9] }, +{ source: [0xC26F], NFC: [0xC26F], NFD: [0x1109, 0x1171, 0x11AA], NFKC: [0xC26F], NFKD: [0x1109, 0x1171, 0x11AA] }, +{ source: [0xC270], NFC: [0xC270], NFD: [0x1109, 0x1171, 0x11AB], NFKC: [0xC270], NFKD: [0x1109, 0x1171, 0x11AB] }, +{ source: [0xC271], NFC: [0xC271], NFD: [0x1109, 0x1171, 0x11AC], NFKC: [0xC271], NFKD: [0x1109, 0x1171, 0x11AC] }, +{ source: [0xC272], NFC: [0xC272], NFD: [0x1109, 0x1171, 0x11AD], NFKC: [0xC272], NFKD: [0x1109, 0x1171, 0x11AD] }, +{ source: [0xC273], NFC: [0xC273], NFD: [0x1109, 0x1171, 0x11AE], NFKC: [0xC273], NFKD: [0x1109, 0x1171, 0x11AE] }, +{ source: [0xC274], NFC: [0xC274], NFD: [0x1109, 0x1171, 0x11AF], NFKC: [0xC274], NFKD: [0x1109, 0x1171, 0x11AF] }, +{ source: [0xC275], NFC: [0xC275], NFD: [0x1109, 0x1171, 0x11B0], NFKC: [0xC275], NFKD: [0x1109, 0x1171, 0x11B0] }, +{ source: [0xC276], NFC: [0xC276], NFD: [0x1109, 0x1171, 0x11B1], NFKC: [0xC276], NFKD: [0x1109, 0x1171, 0x11B1] }, +{ source: [0xC277], NFC: [0xC277], NFD: [0x1109, 0x1171, 0x11B2], NFKC: [0xC277], NFKD: [0x1109, 0x1171, 0x11B2] }, +{ source: [0xC278], NFC: [0xC278], NFD: [0x1109, 0x1171, 0x11B3], NFKC: [0xC278], NFKD: [0x1109, 0x1171, 0x11B3] }, +{ source: [0xC279], NFC: [0xC279], NFD: [0x1109, 0x1171, 0x11B4], NFKC: [0xC279], NFKD: [0x1109, 0x1171, 0x11B4] }, +{ source: [0xC27A], NFC: [0xC27A], NFD: [0x1109, 0x1171, 0x11B5], NFKC: [0xC27A], NFKD: [0x1109, 0x1171, 0x11B5] }, +{ source: [0xC27B], NFC: [0xC27B], NFD: [0x1109, 0x1171, 0x11B6], NFKC: [0xC27B], NFKD: [0x1109, 0x1171, 0x11B6] }, +{ source: [0xC27C], NFC: [0xC27C], NFD: [0x1109, 0x1171, 0x11B7], NFKC: [0xC27C], NFKD: [0x1109, 0x1171, 0x11B7] }, +{ source: [0xC27D], NFC: [0xC27D], NFD: [0x1109, 0x1171, 0x11B8], NFKC: [0xC27D], NFKD: [0x1109, 0x1171, 0x11B8] }, +{ source: [0xC27E], NFC: [0xC27E], NFD: [0x1109, 0x1171, 0x11B9], NFKC: [0xC27E], NFKD: [0x1109, 0x1171, 0x11B9] }, +{ source: [0xC27F], NFC: [0xC27F], NFD: [0x1109, 0x1171, 0x11BA], NFKC: [0xC27F], NFKD: [0x1109, 0x1171, 0x11BA] }, +{ source: [0xC280], NFC: [0xC280], NFD: [0x1109, 0x1171, 0x11BB], NFKC: [0xC280], NFKD: [0x1109, 0x1171, 0x11BB] }, +{ source: [0xC281], NFC: [0xC281], NFD: [0x1109, 0x1171, 0x11BC], NFKC: [0xC281], NFKD: [0x1109, 0x1171, 0x11BC] }, +{ source: [0xC282], NFC: [0xC282], NFD: [0x1109, 0x1171, 0x11BD], NFKC: [0xC282], NFKD: [0x1109, 0x1171, 0x11BD] }, +{ source: [0xC283], NFC: [0xC283], NFD: [0x1109, 0x1171, 0x11BE], NFKC: [0xC283], NFKD: [0x1109, 0x1171, 0x11BE] }, +{ source: [0xC284], NFC: [0xC284], NFD: [0x1109, 0x1171, 0x11BF], NFKC: [0xC284], NFKD: [0x1109, 0x1171, 0x11BF] }, +{ source: [0xC285], NFC: [0xC285], NFD: [0x1109, 0x1171, 0x11C0], NFKC: [0xC285], NFKD: [0x1109, 0x1171, 0x11C0] }, +{ source: [0xC286], NFC: [0xC286], NFD: [0x1109, 0x1171, 0x11C1], NFKC: [0xC286], NFKD: [0x1109, 0x1171, 0x11C1] }, +{ source: [0xC287], NFC: [0xC287], NFD: [0x1109, 0x1171, 0x11C2], NFKC: [0xC287], NFKD: [0x1109, 0x1171, 0x11C2] }, +{ source: [0xC288], NFC: [0xC288], NFD: [0x1109, 0x1172], NFKC: [0xC288], NFKD: [0x1109, 0x1172] }, +{ source: [0xC289], NFC: [0xC289], NFD: [0x1109, 0x1172, 0x11A8], NFKC: [0xC289], NFKD: [0x1109, 0x1172, 0x11A8] }, +{ source: [0xC28A], NFC: [0xC28A], NFD: [0x1109, 0x1172, 0x11A9], NFKC: [0xC28A], NFKD: [0x1109, 0x1172, 0x11A9] }, +{ source: [0xC28B], NFC: [0xC28B], NFD: [0x1109, 0x1172, 0x11AA], NFKC: [0xC28B], NFKD: [0x1109, 0x1172, 0x11AA] }, +{ source: [0xC28C], NFC: [0xC28C], NFD: [0x1109, 0x1172, 0x11AB], NFKC: [0xC28C], NFKD: [0x1109, 0x1172, 0x11AB] }, +{ source: [0xC28D], NFC: [0xC28D], NFD: [0x1109, 0x1172, 0x11AC], NFKC: [0xC28D], NFKD: [0x1109, 0x1172, 0x11AC] }, +{ source: [0xC28E], NFC: [0xC28E], NFD: [0x1109, 0x1172, 0x11AD], NFKC: [0xC28E], NFKD: [0x1109, 0x1172, 0x11AD] }, +{ source: [0xC28F], NFC: [0xC28F], NFD: [0x1109, 0x1172, 0x11AE], NFKC: [0xC28F], NFKD: [0x1109, 0x1172, 0x11AE] }, +{ source: [0xC290], NFC: [0xC290], NFD: [0x1109, 0x1172, 0x11AF], NFKC: [0xC290], NFKD: [0x1109, 0x1172, 0x11AF] }, +{ source: [0xC291], NFC: [0xC291], NFD: [0x1109, 0x1172, 0x11B0], NFKC: [0xC291], NFKD: [0x1109, 0x1172, 0x11B0] }, +{ source: [0xC292], NFC: [0xC292], NFD: [0x1109, 0x1172, 0x11B1], NFKC: [0xC292], NFKD: [0x1109, 0x1172, 0x11B1] }, +{ source: [0xC293], NFC: [0xC293], NFD: [0x1109, 0x1172, 0x11B2], NFKC: [0xC293], NFKD: [0x1109, 0x1172, 0x11B2] }, +{ source: [0xC294], NFC: [0xC294], NFD: [0x1109, 0x1172, 0x11B3], NFKC: [0xC294], NFKD: [0x1109, 0x1172, 0x11B3] }, +{ source: [0xC295], NFC: [0xC295], NFD: [0x1109, 0x1172, 0x11B4], NFKC: [0xC295], NFKD: [0x1109, 0x1172, 0x11B4] }, +{ source: [0xC296], NFC: [0xC296], NFD: [0x1109, 0x1172, 0x11B5], NFKC: [0xC296], NFKD: [0x1109, 0x1172, 0x11B5] }, +{ source: [0xC297], NFC: [0xC297], NFD: [0x1109, 0x1172, 0x11B6], NFKC: [0xC297], NFKD: [0x1109, 0x1172, 0x11B6] }, +{ source: [0xC298], NFC: [0xC298], NFD: [0x1109, 0x1172, 0x11B7], NFKC: [0xC298], NFKD: [0x1109, 0x1172, 0x11B7] }, +{ source: [0xC299], NFC: [0xC299], NFD: [0x1109, 0x1172, 0x11B8], NFKC: [0xC299], NFKD: [0x1109, 0x1172, 0x11B8] }, +{ source: [0xC29A], NFC: [0xC29A], NFD: [0x1109, 0x1172, 0x11B9], NFKC: [0xC29A], NFKD: [0x1109, 0x1172, 0x11B9] }, +{ source: [0xC29B], NFC: [0xC29B], NFD: [0x1109, 0x1172, 0x11BA], NFKC: [0xC29B], NFKD: [0x1109, 0x1172, 0x11BA] }, +{ source: [0xC29C], NFC: [0xC29C], NFD: [0x1109, 0x1172, 0x11BB], NFKC: [0xC29C], NFKD: [0x1109, 0x1172, 0x11BB] }, +{ source: [0xC29D], NFC: [0xC29D], NFD: [0x1109, 0x1172, 0x11BC], NFKC: [0xC29D], NFKD: [0x1109, 0x1172, 0x11BC] }, +{ source: [0xC29E], NFC: [0xC29E], NFD: [0x1109, 0x1172, 0x11BD], NFKC: [0xC29E], NFKD: [0x1109, 0x1172, 0x11BD] }, +{ source: [0xC29F], NFC: [0xC29F], NFD: [0x1109, 0x1172, 0x11BE], NFKC: [0xC29F], NFKD: [0x1109, 0x1172, 0x11BE] }, +{ source: [0xC2A0], NFC: [0xC2A0], NFD: [0x1109, 0x1172, 0x11BF], NFKC: [0xC2A0], NFKD: [0x1109, 0x1172, 0x11BF] }, +{ source: [0xC2A1], NFC: [0xC2A1], NFD: [0x1109, 0x1172, 0x11C0], NFKC: [0xC2A1], NFKD: [0x1109, 0x1172, 0x11C0] }, +{ source: [0xC2A2], NFC: [0xC2A2], NFD: [0x1109, 0x1172, 0x11C1], NFKC: [0xC2A2], NFKD: [0x1109, 0x1172, 0x11C1] }, +{ source: [0xC2A3], NFC: [0xC2A3], NFD: [0x1109, 0x1172, 0x11C2], NFKC: [0xC2A3], NFKD: [0x1109, 0x1172, 0x11C2] }, +{ source: [0xC2A4], NFC: [0xC2A4], NFD: [0x1109, 0x1173], NFKC: [0xC2A4], NFKD: [0x1109, 0x1173] }, +{ source: [0xC2A5], NFC: [0xC2A5], NFD: [0x1109, 0x1173, 0x11A8], NFKC: [0xC2A5], NFKD: [0x1109, 0x1173, 0x11A8] }, +{ source: [0xC2A6], NFC: [0xC2A6], NFD: [0x1109, 0x1173, 0x11A9], NFKC: [0xC2A6], NFKD: [0x1109, 0x1173, 0x11A9] }, +{ source: [0xC2A7], NFC: [0xC2A7], NFD: [0x1109, 0x1173, 0x11AA], NFKC: [0xC2A7], NFKD: [0x1109, 0x1173, 0x11AA] }, +{ source: [0xC2A8], NFC: [0xC2A8], NFD: [0x1109, 0x1173, 0x11AB], NFKC: [0xC2A8], NFKD: [0x1109, 0x1173, 0x11AB] }, +{ source: [0xC2A9], NFC: [0xC2A9], NFD: [0x1109, 0x1173, 0x11AC], NFKC: [0xC2A9], NFKD: [0x1109, 0x1173, 0x11AC] }, +{ source: [0xC2AA], NFC: [0xC2AA], NFD: [0x1109, 0x1173, 0x11AD], NFKC: [0xC2AA], NFKD: [0x1109, 0x1173, 0x11AD] }, +{ source: [0xC2AB], NFC: [0xC2AB], NFD: [0x1109, 0x1173, 0x11AE], NFKC: [0xC2AB], NFKD: [0x1109, 0x1173, 0x11AE] }, +{ source: [0xC2AC], NFC: [0xC2AC], NFD: [0x1109, 0x1173, 0x11AF], NFKC: [0xC2AC], NFKD: [0x1109, 0x1173, 0x11AF] }, +{ source: [0xC2AD], NFC: [0xC2AD], NFD: [0x1109, 0x1173, 0x11B0], NFKC: [0xC2AD], NFKD: [0x1109, 0x1173, 0x11B0] }, +{ source: [0xC2AE], NFC: [0xC2AE], NFD: [0x1109, 0x1173, 0x11B1], NFKC: [0xC2AE], NFKD: [0x1109, 0x1173, 0x11B1] }, +{ source: [0xC2AF], NFC: [0xC2AF], NFD: [0x1109, 0x1173, 0x11B2], NFKC: [0xC2AF], NFKD: [0x1109, 0x1173, 0x11B2] }, +{ source: [0xC2B0], NFC: [0xC2B0], NFD: [0x1109, 0x1173, 0x11B3], NFKC: [0xC2B0], NFKD: [0x1109, 0x1173, 0x11B3] }, +{ source: [0xC2B1], NFC: [0xC2B1], NFD: [0x1109, 0x1173, 0x11B4], NFKC: [0xC2B1], NFKD: [0x1109, 0x1173, 0x11B4] }, +{ source: [0xC2B2], NFC: [0xC2B2], NFD: [0x1109, 0x1173, 0x11B5], NFKC: [0xC2B2], NFKD: [0x1109, 0x1173, 0x11B5] }, +{ source: [0xC2B3], NFC: [0xC2B3], NFD: [0x1109, 0x1173, 0x11B6], NFKC: [0xC2B3], NFKD: [0x1109, 0x1173, 0x11B6] }, +{ source: [0xC2B4], NFC: [0xC2B4], NFD: [0x1109, 0x1173, 0x11B7], NFKC: [0xC2B4], NFKD: [0x1109, 0x1173, 0x11B7] }, +{ source: [0xC2B5], NFC: [0xC2B5], NFD: [0x1109, 0x1173, 0x11B8], NFKC: [0xC2B5], NFKD: [0x1109, 0x1173, 0x11B8] }, +{ source: [0xC2B6], NFC: [0xC2B6], NFD: [0x1109, 0x1173, 0x11B9], NFKC: [0xC2B6], NFKD: [0x1109, 0x1173, 0x11B9] }, +{ source: [0xC2B7], NFC: [0xC2B7], NFD: [0x1109, 0x1173, 0x11BA], NFKC: [0xC2B7], NFKD: [0x1109, 0x1173, 0x11BA] }, +{ source: [0xC2B8], NFC: [0xC2B8], NFD: [0x1109, 0x1173, 0x11BB], NFKC: [0xC2B8], NFKD: [0x1109, 0x1173, 0x11BB] }, +{ source: [0xC2B9], NFC: [0xC2B9], NFD: [0x1109, 0x1173, 0x11BC], NFKC: [0xC2B9], NFKD: [0x1109, 0x1173, 0x11BC] }, +{ source: [0xC2BA], NFC: [0xC2BA], NFD: [0x1109, 0x1173, 0x11BD], NFKC: [0xC2BA], NFKD: [0x1109, 0x1173, 0x11BD] }, +{ source: [0xC2BB], NFC: [0xC2BB], NFD: [0x1109, 0x1173, 0x11BE], NFKC: [0xC2BB], NFKD: [0x1109, 0x1173, 0x11BE] }, +{ source: [0xC2BC], NFC: [0xC2BC], NFD: [0x1109, 0x1173, 0x11BF], NFKC: [0xC2BC], NFKD: [0x1109, 0x1173, 0x11BF] }, +{ source: [0xC2BD], NFC: [0xC2BD], NFD: [0x1109, 0x1173, 0x11C0], NFKC: [0xC2BD], NFKD: [0x1109, 0x1173, 0x11C0] }, +{ source: [0xC2BE], NFC: [0xC2BE], NFD: [0x1109, 0x1173, 0x11C1], NFKC: [0xC2BE], NFKD: [0x1109, 0x1173, 0x11C1] }, +{ source: [0xC2BF], NFC: [0xC2BF], NFD: [0x1109, 0x1173, 0x11C2], NFKC: [0xC2BF], NFKD: [0x1109, 0x1173, 0x11C2] }, +{ source: [0xC2C0], NFC: [0xC2C0], NFD: [0x1109, 0x1174], NFKC: [0xC2C0], NFKD: [0x1109, 0x1174] }, +{ source: [0xC2C1], NFC: [0xC2C1], NFD: [0x1109, 0x1174, 0x11A8], NFKC: [0xC2C1], NFKD: [0x1109, 0x1174, 0x11A8] }, +{ source: [0xC2C2], NFC: [0xC2C2], NFD: [0x1109, 0x1174, 0x11A9], NFKC: [0xC2C2], NFKD: [0x1109, 0x1174, 0x11A9] }, +{ source: [0xC2C3], NFC: [0xC2C3], NFD: [0x1109, 0x1174, 0x11AA], NFKC: [0xC2C3], NFKD: [0x1109, 0x1174, 0x11AA] }, +{ source: [0xC2C4], NFC: [0xC2C4], NFD: [0x1109, 0x1174, 0x11AB], NFKC: [0xC2C4], NFKD: [0x1109, 0x1174, 0x11AB] }, +{ source: [0xC2C5], NFC: [0xC2C5], NFD: [0x1109, 0x1174, 0x11AC], NFKC: [0xC2C5], NFKD: [0x1109, 0x1174, 0x11AC] }, +{ source: [0xC2C6], NFC: [0xC2C6], NFD: [0x1109, 0x1174, 0x11AD], NFKC: [0xC2C6], NFKD: [0x1109, 0x1174, 0x11AD] }, +{ source: [0xC2C7], NFC: [0xC2C7], NFD: [0x1109, 0x1174, 0x11AE], NFKC: [0xC2C7], NFKD: [0x1109, 0x1174, 0x11AE] }, +{ source: [0xC2C8], NFC: [0xC2C8], NFD: [0x1109, 0x1174, 0x11AF], NFKC: [0xC2C8], NFKD: [0x1109, 0x1174, 0x11AF] }, +{ source: [0xC2C9], NFC: [0xC2C9], NFD: [0x1109, 0x1174, 0x11B0], NFKC: [0xC2C9], NFKD: [0x1109, 0x1174, 0x11B0] }, +{ source: [0xC2CA], NFC: [0xC2CA], NFD: [0x1109, 0x1174, 0x11B1], NFKC: [0xC2CA], NFKD: [0x1109, 0x1174, 0x11B1] }, +{ source: [0xC2CB], NFC: [0xC2CB], NFD: [0x1109, 0x1174, 0x11B2], NFKC: [0xC2CB], NFKD: [0x1109, 0x1174, 0x11B2] }, +{ source: [0xC2CC], NFC: [0xC2CC], NFD: [0x1109, 0x1174, 0x11B3], NFKC: [0xC2CC], NFKD: [0x1109, 0x1174, 0x11B3] }, +{ source: [0xC2CD], NFC: [0xC2CD], NFD: [0x1109, 0x1174, 0x11B4], NFKC: [0xC2CD], NFKD: [0x1109, 0x1174, 0x11B4] }, +{ source: [0xC2CE], NFC: [0xC2CE], NFD: [0x1109, 0x1174, 0x11B5], NFKC: [0xC2CE], NFKD: [0x1109, 0x1174, 0x11B5] }, +{ source: [0xC2CF], NFC: [0xC2CF], NFD: [0x1109, 0x1174, 0x11B6], NFKC: [0xC2CF], NFKD: [0x1109, 0x1174, 0x11B6] }, +{ source: [0xC2D0], NFC: [0xC2D0], NFD: [0x1109, 0x1174, 0x11B7], NFKC: [0xC2D0], NFKD: [0x1109, 0x1174, 0x11B7] }, +{ source: [0xC2D1], NFC: [0xC2D1], NFD: [0x1109, 0x1174, 0x11B8], NFKC: [0xC2D1], NFKD: [0x1109, 0x1174, 0x11B8] }, +{ source: [0xC2D2], NFC: [0xC2D2], NFD: [0x1109, 0x1174, 0x11B9], NFKC: [0xC2D2], NFKD: [0x1109, 0x1174, 0x11B9] }, +{ source: [0xC2D3], NFC: [0xC2D3], NFD: [0x1109, 0x1174, 0x11BA], NFKC: [0xC2D3], NFKD: [0x1109, 0x1174, 0x11BA] }, +{ source: [0xC2D4], NFC: [0xC2D4], NFD: [0x1109, 0x1174, 0x11BB], NFKC: [0xC2D4], NFKD: [0x1109, 0x1174, 0x11BB] }, +{ source: [0xC2D5], NFC: [0xC2D5], NFD: [0x1109, 0x1174, 0x11BC], NFKC: [0xC2D5], NFKD: [0x1109, 0x1174, 0x11BC] }, +{ source: [0xC2D6], NFC: [0xC2D6], NFD: [0x1109, 0x1174, 0x11BD], NFKC: [0xC2D6], NFKD: [0x1109, 0x1174, 0x11BD] }, +{ source: [0xC2D7], NFC: [0xC2D7], NFD: [0x1109, 0x1174, 0x11BE], NFKC: [0xC2D7], NFKD: [0x1109, 0x1174, 0x11BE] }, +{ source: [0xC2D8], NFC: [0xC2D8], NFD: [0x1109, 0x1174, 0x11BF], NFKC: [0xC2D8], NFKD: [0x1109, 0x1174, 0x11BF] }, +{ source: [0xC2D9], NFC: [0xC2D9], NFD: [0x1109, 0x1174, 0x11C0], NFKC: [0xC2D9], NFKD: [0x1109, 0x1174, 0x11C0] }, +{ source: [0xC2DA], NFC: [0xC2DA], NFD: [0x1109, 0x1174, 0x11C1], NFKC: [0xC2DA], NFKD: [0x1109, 0x1174, 0x11C1] }, +{ source: [0xC2DB], NFC: [0xC2DB], NFD: [0x1109, 0x1174, 0x11C2], NFKC: [0xC2DB], NFKD: [0x1109, 0x1174, 0x11C2] }, +{ source: [0xC2DC], NFC: [0xC2DC], NFD: [0x1109, 0x1175], NFKC: [0xC2DC], NFKD: [0x1109, 0x1175] }, +{ source: [0xC2DD], NFC: [0xC2DD], NFD: [0x1109, 0x1175, 0x11A8], NFKC: [0xC2DD], NFKD: [0x1109, 0x1175, 0x11A8] }, +{ source: [0xC2DE], NFC: [0xC2DE], NFD: [0x1109, 0x1175, 0x11A9], NFKC: [0xC2DE], NFKD: [0x1109, 0x1175, 0x11A9] }, +{ source: [0xC2DF], NFC: [0xC2DF], NFD: [0x1109, 0x1175, 0x11AA], NFKC: [0xC2DF], NFKD: [0x1109, 0x1175, 0x11AA] }, +{ source: [0xC2E0], NFC: [0xC2E0], NFD: [0x1109, 0x1175, 0x11AB], NFKC: [0xC2E0], NFKD: [0x1109, 0x1175, 0x11AB] }, +{ source: [0xC2E1], NFC: [0xC2E1], NFD: [0x1109, 0x1175, 0x11AC], NFKC: [0xC2E1], NFKD: [0x1109, 0x1175, 0x11AC] }, +{ source: [0xC2E2], NFC: [0xC2E2], NFD: [0x1109, 0x1175, 0x11AD], NFKC: [0xC2E2], NFKD: [0x1109, 0x1175, 0x11AD] }, +{ source: [0xC2E3], NFC: [0xC2E3], NFD: [0x1109, 0x1175, 0x11AE], NFKC: [0xC2E3], NFKD: [0x1109, 0x1175, 0x11AE] }, +{ source: [0xC2E4], NFC: [0xC2E4], NFD: [0x1109, 0x1175, 0x11AF], NFKC: [0xC2E4], NFKD: [0x1109, 0x1175, 0x11AF] }, +{ source: [0xC2E5], NFC: [0xC2E5], NFD: [0x1109, 0x1175, 0x11B0], NFKC: [0xC2E5], NFKD: [0x1109, 0x1175, 0x11B0] }, +{ source: [0xC2E6], NFC: [0xC2E6], NFD: [0x1109, 0x1175, 0x11B1], NFKC: [0xC2E6], NFKD: [0x1109, 0x1175, 0x11B1] }, +{ source: [0xC2E7], NFC: [0xC2E7], NFD: [0x1109, 0x1175, 0x11B2], NFKC: [0xC2E7], NFKD: [0x1109, 0x1175, 0x11B2] }, +{ source: [0xC2E8], NFC: [0xC2E8], NFD: [0x1109, 0x1175, 0x11B3], NFKC: [0xC2E8], NFKD: [0x1109, 0x1175, 0x11B3] }, +{ source: [0xC2E9], NFC: [0xC2E9], NFD: [0x1109, 0x1175, 0x11B4], NFKC: [0xC2E9], NFKD: [0x1109, 0x1175, 0x11B4] }, +{ source: [0xC2EA], NFC: [0xC2EA], NFD: [0x1109, 0x1175, 0x11B5], NFKC: [0xC2EA], NFKD: [0x1109, 0x1175, 0x11B5] }, +{ source: [0xC2EB], NFC: [0xC2EB], NFD: [0x1109, 0x1175, 0x11B6], NFKC: [0xC2EB], NFKD: [0x1109, 0x1175, 0x11B6] }, +{ source: [0xC2EC], NFC: [0xC2EC], NFD: [0x1109, 0x1175, 0x11B7], NFKC: [0xC2EC], NFKD: [0x1109, 0x1175, 0x11B7] }, +{ source: [0xC2ED], NFC: [0xC2ED], NFD: [0x1109, 0x1175, 0x11B8], NFKC: [0xC2ED], NFKD: [0x1109, 0x1175, 0x11B8] }, +{ source: [0xC2EE], NFC: [0xC2EE], NFD: [0x1109, 0x1175, 0x11B9], NFKC: [0xC2EE], NFKD: [0x1109, 0x1175, 0x11B9] }, +{ source: [0xC2EF], NFC: [0xC2EF], NFD: [0x1109, 0x1175, 0x11BA], NFKC: [0xC2EF], NFKD: [0x1109, 0x1175, 0x11BA] }, +{ source: [0xC2F0], NFC: [0xC2F0], NFD: [0x1109, 0x1175, 0x11BB], NFKC: [0xC2F0], NFKD: [0x1109, 0x1175, 0x11BB] }, +{ source: [0xC2F1], NFC: [0xC2F1], NFD: [0x1109, 0x1175, 0x11BC], NFKC: [0xC2F1], NFKD: [0x1109, 0x1175, 0x11BC] }, +{ source: [0xC2F2], NFC: [0xC2F2], NFD: [0x1109, 0x1175, 0x11BD], NFKC: [0xC2F2], NFKD: [0x1109, 0x1175, 0x11BD] }, +{ source: [0xC2F3], NFC: [0xC2F3], NFD: [0x1109, 0x1175, 0x11BE], NFKC: [0xC2F3], NFKD: [0x1109, 0x1175, 0x11BE] }, +{ source: [0xC2F4], NFC: [0xC2F4], NFD: [0x1109, 0x1175, 0x11BF], NFKC: [0xC2F4], NFKD: [0x1109, 0x1175, 0x11BF] }, +{ source: [0xC2F5], NFC: [0xC2F5], NFD: [0x1109, 0x1175, 0x11C0], NFKC: [0xC2F5], NFKD: [0x1109, 0x1175, 0x11C0] }, +{ source: [0xC2F6], NFC: [0xC2F6], NFD: [0x1109, 0x1175, 0x11C1], NFKC: [0xC2F6], NFKD: [0x1109, 0x1175, 0x11C1] }, +{ source: [0xC2F7], NFC: [0xC2F7], NFD: [0x1109, 0x1175, 0x11C2], NFKC: [0xC2F7], NFKD: [0x1109, 0x1175, 0x11C2] }, +{ source: [0xC2F8], NFC: [0xC2F8], NFD: [0x110A, 0x1161], NFKC: [0xC2F8], NFKD: [0x110A, 0x1161] }, +{ source: [0xC2F9], NFC: [0xC2F9], NFD: [0x110A, 0x1161, 0x11A8], NFKC: [0xC2F9], NFKD: [0x110A, 0x1161, 0x11A8] }, +{ source: [0xC2FA], NFC: [0xC2FA], NFD: [0x110A, 0x1161, 0x11A9], NFKC: [0xC2FA], NFKD: [0x110A, 0x1161, 0x11A9] }, +{ source: [0xC2FB], NFC: [0xC2FB], NFD: [0x110A, 0x1161, 0x11AA], NFKC: [0xC2FB], NFKD: [0x110A, 0x1161, 0x11AA] }, +{ source: [0xC2FC], NFC: [0xC2FC], NFD: [0x110A, 0x1161, 0x11AB], NFKC: [0xC2FC], NFKD: [0x110A, 0x1161, 0x11AB] }, +{ source: [0xC2FD], NFC: [0xC2FD], NFD: [0x110A, 0x1161, 0x11AC], NFKC: [0xC2FD], NFKD: [0x110A, 0x1161, 0x11AC] }, +{ source: [0xC2FE], NFC: [0xC2FE], NFD: [0x110A, 0x1161, 0x11AD], NFKC: [0xC2FE], NFKD: [0x110A, 0x1161, 0x11AD] }, +{ source: [0xC2FF], NFC: [0xC2FF], NFD: [0x110A, 0x1161, 0x11AE], NFKC: [0xC2FF], NFKD: [0x110A, 0x1161, 0x11AE] }, +{ source: [0xC300], NFC: [0xC300], NFD: [0x110A, 0x1161, 0x11AF], NFKC: [0xC300], NFKD: [0x110A, 0x1161, 0x11AF] }, +{ source: [0xC301], NFC: [0xC301], NFD: [0x110A, 0x1161, 0x11B0], NFKC: [0xC301], NFKD: [0x110A, 0x1161, 0x11B0] }, +{ source: [0xC302], NFC: [0xC302], NFD: [0x110A, 0x1161, 0x11B1], NFKC: [0xC302], NFKD: [0x110A, 0x1161, 0x11B1] }, +{ source: [0xC303], NFC: [0xC303], NFD: [0x110A, 0x1161, 0x11B2], NFKC: [0xC303], NFKD: [0x110A, 0x1161, 0x11B2] }, +{ source: [0xC304], NFC: [0xC304], NFD: [0x110A, 0x1161, 0x11B3], NFKC: [0xC304], NFKD: [0x110A, 0x1161, 0x11B3] }, +{ source: [0xC305], NFC: [0xC305], NFD: [0x110A, 0x1161, 0x11B4], NFKC: [0xC305], NFKD: [0x110A, 0x1161, 0x11B4] }, +{ source: [0xC306], NFC: [0xC306], NFD: [0x110A, 0x1161, 0x11B5], NFKC: [0xC306], NFKD: [0x110A, 0x1161, 0x11B5] }, +{ source: [0xC307], NFC: [0xC307], NFD: [0x110A, 0x1161, 0x11B6], NFKC: [0xC307], NFKD: [0x110A, 0x1161, 0x11B6] }, +{ source: [0xC308], NFC: [0xC308], NFD: [0x110A, 0x1161, 0x11B7], NFKC: [0xC308], NFKD: [0x110A, 0x1161, 0x11B7] }, +{ source: [0xC309], NFC: [0xC309], NFD: [0x110A, 0x1161, 0x11B8], NFKC: [0xC309], NFKD: [0x110A, 0x1161, 0x11B8] }, +{ source: [0xC30A], NFC: [0xC30A], NFD: [0x110A, 0x1161, 0x11B9], NFKC: [0xC30A], NFKD: [0x110A, 0x1161, 0x11B9] }, +{ source: [0xC30B], NFC: [0xC30B], NFD: [0x110A, 0x1161, 0x11BA], NFKC: [0xC30B], NFKD: [0x110A, 0x1161, 0x11BA] }, +{ source: [0xC30C], NFC: [0xC30C], NFD: [0x110A, 0x1161, 0x11BB], NFKC: [0xC30C], NFKD: [0x110A, 0x1161, 0x11BB] }, +{ source: [0xC30D], NFC: [0xC30D], NFD: [0x110A, 0x1161, 0x11BC], NFKC: [0xC30D], NFKD: [0x110A, 0x1161, 0x11BC] }, +{ source: [0xC30E], NFC: [0xC30E], NFD: [0x110A, 0x1161, 0x11BD], NFKC: [0xC30E], NFKD: [0x110A, 0x1161, 0x11BD] }, +{ source: [0xC30F], NFC: [0xC30F], NFD: [0x110A, 0x1161, 0x11BE], NFKC: [0xC30F], NFKD: [0x110A, 0x1161, 0x11BE] }, +{ source: [0xC310], NFC: [0xC310], NFD: [0x110A, 0x1161, 0x11BF], NFKC: [0xC310], NFKD: [0x110A, 0x1161, 0x11BF] }, +{ source: [0xC311], NFC: [0xC311], NFD: [0x110A, 0x1161, 0x11C0], NFKC: [0xC311], NFKD: [0x110A, 0x1161, 0x11C0] }, +{ source: [0xC312], NFC: [0xC312], NFD: [0x110A, 0x1161, 0x11C1], NFKC: [0xC312], NFKD: [0x110A, 0x1161, 0x11C1] }, +{ source: [0xC313], NFC: [0xC313], NFD: [0x110A, 0x1161, 0x11C2], NFKC: [0xC313], NFKD: [0x110A, 0x1161, 0x11C2] }, +{ source: [0xC314], NFC: [0xC314], NFD: [0x110A, 0x1162], NFKC: [0xC314], NFKD: [0x110A, 0x1162] }, +{ source: [0xC315], NFC: [0xC315], NFD: [0x110A, 0x1162, 0x11A8], NFKC: [0xC315], NFKD: [0x110A, 0x1162, 0x11A8] }, +{ source: [0xC316], NFC: [0xC316], NFD: [0x110A, 0x1162, 0x11A9], NFKC: [0xC316], NFKD: [0x110A, 0x1162, 0x11A9] }, +{ source: [0xC317], NFC: [0xC317], NFD: [0x110A, 0x1162, 0x11AA], NFKC: [0xC317], NFKD: [0x110A, 0x1162, 0x11AA] }, +{ source: [0xC318], NFC: [0xC318], NFD: [0x110A, 0x1162, 0x11AB], NFKC: [0xC318], NFKD: [0x110A, 0x1162, 0x11AB] }, +{ source: [0xC319], NFC: [0xC319], NFD: [0x110A, 0x1162, 0x11AC], NFKC: [0xC319], NFKD: [0x110A, 0x1162, 0x11AC] }, +{ source: [0xC31A], NFC: [0xC31A], NFD: [0x110A, 0x1162, 0x11AD], NFKC: [0xC31A], NFKD: [0x110A, 0x1162, 0x11AD] }, +{ source: [0xC31B], NFC: [0xC31B], NFD: [0x110A, 0x1162, 0x11AE], NFKC: [0xC31B], NFKD: [0x110A, 0x1162, 0x11AE] }, +{ source: [0xC31C], NFC: [0xC31C], NFD: [0x110A, 0x1162, 0x11AF], NFKC: [0xC31C], NFKD: [0x110A, 0x1162, 0x11AF] }, +{ source: [0xC31D], NFC: [0xC31D], NFD: [0x110A, 0x1162, 0x11B0], NFKC: [0xC31D], NFKD: [0x110A, 0x1162, 0x11B0] }, +{ source: [0xC31E], NFC: [0xC31E], NFD: [0x110A, 0x1162, 0x11B1], NFKC: [0xC31E], NFKD: [0x110A, 0x1162, 0x11B1] }, +{ source: [0xC31F], NFC: [0xC31F], NFD: [0x110A, 0x1162, 0x11B2], NFKC: [0xC31F], NFKD: [0x110A, 0x1162, 0x11B2] }, +{ source: [0xC320], NFC: [0xC320], NFD: [0x110A, 0x1162, 0x11B3], NFKC: [0xC320], NFKD: [0x110A, 0x1162, 0x11B3] }, +{ source: [0xC321], NFC: [0xC321], NFD: [0x110A, 0x1162, 0x11B4], NFKC: [0xC321], NFKD: [0x110A, 0x1162, 0x11B4] }, +{ source: [0xC322], NFC: [0xC322], NFD: [0x110A, 0x1162, 0x11B5], NFKC: [0xC322], NFKD: [0x110A, 0x1162, 0x11B5] }, +{ source: [0xC323], NFC: [0xC323], NFD: [0x110A, 0x1162, 0x11B6], NFKC: [0xC323], NFKD: [0x110A, 0x1162, 0x11B6] }, +{ source: [0xC324], NFC: [0xC324], NFD: [0x110A, 0x1162, 0x11B7], NFKC: [0xC324], NFKD: [0x110A, 0x1162, 0x11B7] }, +{ source: [0xC325], NFC: [0xC325], NFD: [0x110A, 0x1162, 0x11B8], NFKC: [0xC325], NFKD: [0x110A, 0x1162, 0x11B8] }, +{ source: [0xC326], NFC: [0xC326], NFD: [0x110A, 0x1162, 0x11B9], NFKC: [0xC326], NFKD: [0x110A, 0x1162, 0x11B9] }, +{ source: [0xC327], NFC: [0xC327], NFD: [0x110A, 0x1162, 0x11BA], NFKC: [0xC327], NFKD: [0x110A, 0x1162, 0x11BA] }, +{ source: [0xC328], NFC: [0xC328], NFD: [0x110A, 0x1162, 0x11BB], NFKC: [0xC328], NFKD: [0x110A, 0x1162, 0x11BB] }, +{ source: [0xC329], NFC: [0xC329], NFD: [0x110A, 0x1162, 0x11BC], NFKC: [0xC329], NFKD: [0x110A, 0x1162, 0x11BC] }, +{ source: [0xC32A], NFC: [0xC32A], NFD: [0x110A, 0x1162, 0x11BD], NFKC: [0xC32A], NFKD: [0x110A, 0x1162, 0x11BD] }, +{ source: [0xC32B], NFC: [0xC32B], NFD: [0x110A, 0x1162, 0x11BE], NFKC: [0xC32B], NFKD: [0x110A, 0x1162, 0x11BE] }, +{ source: [0xC32C], NFC: [0xC32C], NFD: [0x110A, 0x1162, 0x11BF], NFKC: [0xC32C], NFKD: [0x110A, 0x1162, 0x11BF] }, +{ source: [0xC32D], NFC: [0xC32D], NFD: [0x110A, 0x1162, 0x11C0], NFKC: [0xC32D], NFKD: [0x110A, 0x1162, 0x11C0] }, +{ source: [0xC32E], NFC: [0xC32E], NFD: [0x110A, 0x1162, 0x11C1], NFKC: [0xC32E], NFKD: [0x110A, 0x1162, 0x11C1] }, +{ source: [0xC32F], NFC: [0xC32F], NFD: [0x110A, 0x1162, 0x11C2], NFKC: [0xC32F], NFKD: [0x110A, 0x1162, 0x11C2] }, +{ source: [0xC330], NFC: [0xC330], NFD: [0x110A, 0x1163], NFKC: [0xC330], NFKD: [0x110A, 0x1163] }, +{ source: [0xC331], NFC: [0xC331], NFD: [0x110A, 0x1163, 0x11A8], NFKC: [0xC331], NFKD: [0x110A, 0x1163, 0x11A8] }, +{ source: [0xC332], NFC: [0xC332], NFD: [0x110A, 0x1163, 0x11A9], NFKC: [0xC332], NFKD: [0x110A, 0x1163, 0x11A9] }, +{ source: [0xC333], NFC: [0xC333], NFD: [0x110A, 0x1163, 0x11AA], NFKC: [0xC333], NFKD: [0x110A, 0x1163, 0x11AA] }, +{ source: [0xC334], NFC: [0xC334], NFD: [0x110A, 0x1163, 0x11AB], NFKC: [0xC334], NFKD: [0x110A, 0x1163, 0x11AB] }, +{ source: [0xC335], NFC: [0xC335], NFD: [0x110A, 0x1163, 0x11AC], NFKC: [0xC335], NFKD: [0x110A, 0x1163, 0x11AC] }, +{ source: [0xC336], NFC: [0xC336], NFD: [0x110A, 0x1163, 0x11AD], NFKC: [0xC336], NFKD: [0x110A, 0x1163, 0x11AD] }, +{ source: [0xC337], NFC: [0xC337], NFD: [0x110A, 0x1163, 0x11AE], NFKC: [0xC337], NFKD: [0x110A, 0x1163, 0x11AE] }, +{ source: [0xC338], NFC: [0xC338], NFD: [0x110A, 0x1163, 0x11AF], NFKC: [0xC338], NFKD: [0x110A, 0x1163, 0x11AF] }, +{ source: [0xC339], NFC: [0xC339], NFD: [0x110A, 0x1163, 0x11B0], NFKC: [0xC339], NFKD: [0x110A, 0x1163, 0x11B0] }, +{ source: [0xC33A], NFC: [0xC33A], NFD: [0x110A, 0x1163, 0x11B1], NFKC: [0xC33A], NFKD: [0x110A, 0x1163, 0x11B1] }, +{ source: [0xC33B], NFC: [0xC33B], NFD: [0x110A, 0x1163, 0x11B2], NFKC: [0xC33B], NFKD: [0x110A, 0x1163, 0x11B2] }, +{ source: [0xC33C], NFC: [0xC33C], NFD: [0x110A, 0x1163, 0x11B3], NFKC: [0xC33C], NFKD: [0x110A, 0x1163, 0x11B3] }, +{ source: [0xC33D], NFC: [0xC33D], NFD: [0x110A, 0x1163, 0x11B4], NFKC: [0xC33D], NFKD: [0x110A, 0x1163, 0x11B4] }, +{ source: [0xC33E], NFC: [0xC33E], NFD: [0x110A, 0x1163, 0x11B5], NFKC: [0xC33E], NFKD: [0x110A, 0x1163, 0x11B5] }, +{ source: [0xC33F], NFC: [0xC33F], NFD: [0x110A, 0x1163, 0x11B6], NFKC: [0xC33F], NFKD: [0x110A, 0x1163, 0x11B6] }, +{ source: [0xC340], NFC: [0xC340], NFD: [0x110A, 0x1163, 0x11B7], NFKC: [0xC340], NFKD: [0x110A, 0x1163, 0x11B7] }, +{ source: [0xC341], NFC: [0xC341], NFD: [0x110A, 0x1163, 0x11B8], NFKC: [0xC341], NFKD: [0x110A, 0x1163, 0x11B8] }, +{ source: [0xC342], NFC: [0xC342], NFD: [0x110A, 0x1163, 0x11B9], NFKC: [0xC342], NFKD: [0x110A, 0x1163, 0x11B9] }, +{ source: [0xC343], NFC: [0xC343], NFD: [0x110A, 0x1163, 0x11BA], NFKC: [0xC343], NFKD: [0x110A, 0x1163, 0x11BA] }, +{ source: [0xC344], NFC: [0xC344], NFD: [0x110A, 0x1163, 0x11BB], NFKC: [0xC344], NFKD: [0x110A, 0x1163, 0x11BB] }, +{ source: [0xC345], NFC: [0xC345], NFD: [0x110A, 0x1163, 0x11BC], NFKC: [0xC345], NFKD: [0x110A, 0x1163, 0x11BC] }, +{ source: [0xC346], NFC: [0xC346], NFD: [0x110A, 0x1163, 0x11BD], NFKC: [0xC346], NFKD: [0x110A, 0x1163, 0x11BD] }, +{ source: [0xC347], NFC: [0xC347], NFD: [0x110A, 0x1163, 0x11BE], NFKC: [0xC347], NFKD: [0x110A, 0x1163, 0x11BE] }, +{ source: [0xC348], NFC: [0xC348], NFD: [0x110A, 0x1163, 0x11BF], NFKC: [0xC348], NFKD: [0x110A, 0x1163, 0x11BF] }, +{ source: [0xC349], NFC: [0xC349], NFD: [0x110A, 0x1163, 0x11C0], NFKC: [0xC349], NFKD: [0x110A, 0x1163, 0x11C0] }, +{ source: [0xC34A], NFC: [0xC34A], NFD: [0x110A, 0x1163, 0x11C1], NFKC: [0xC34A], NFKD: [0x110A, 0x1163, 0x11C1] }, +{ source: [0xC34B], NFC: [0xC34B], NFD: [0x110A, 0x1163, 0x11C2], NFKC: [0xC34B], NFKD: [0x110A, 0x1163, 0x11C2] }, +{ source: [0xC34C], NFC: [0xC34C], NFD: [0x110A, 0x1164], NFKC: [0xC34C], NFKD: [0x110A, 0x1164] }, +{ source: [0xC34D], NFC: [0xC34D], NFD: [0x110A, 0x1164, 0x11A8], NFKC: [0xC34D], NFKD: [0x110A, 0x1164, 0x11A8] }, +{ source: [0xC34E], NFC: [0xC34E], NFD: [0x110A, 0x1164, 0x11A9], NFKC: [0xC34E], NFKD: [0x110A, 0x1164, 0x11A9] }, +{ source: [0xC34F], NFC: [0xC34F], NFD: [0x110A, 0x1164, 0x11AA], NFKC: [0xC34F], NFKD: [0x110A, 0x1164, 0x11AA] }, +{ source: [0xC350], NFC: [0xC350], NFD: [0x110A, 0x1164, 0x11AB], NFKC: [0xC350], NFKD: [0x110A, 0x1164, 0x11AB] }, +{ source: [0xC351], NFC: [0xC351], NFD: [0x110A, 0x1164, 0x11AC], NFKC: [0xC351], NFKD: [0x110A, 0x1164, 0x11AC] }, +{ source: [0xC352], NFC: [0xC352], NFD: [0x110A, 0x1164, 0x11AD], NFKC: [0xC352], NFKD: [0x110A, 0x1164, 0x11AD] }, +{ source: [0xC353], NFC: [0xC353], NFD: [0x110A, 0x1164, 0x11AE], NFKC: [0xC353], NFKD: [0x110A, 0x1164, 0x11AE] }, +{ source: [0xC354], NFC: [0xC354], NFD: [0x110A, 0x1164, 0x11AF], NFKC: [0xC354], NFKD: [0x110A, 0x1164, 0x11AF] }, +{ source: [0xC355], NFC: [0xC355], NFD: [0x110A, 0x1164, 0x11B0], NFKC: [0xC355], NFKD: [0x110A, 0x1164, 0x11B0] }, +{ source: [0xC356], NFC: [0xC356], NFD: [0x110A, 0x1164, 0x11B1], NFKC: [0xC356], NFKD: [0x110A, 0x1164, 0x11B1] }, +{ source: [0xC357], NFC: [0xC357], NFD: [0x110A, 0x1164, 0x11B2], NFKC: [0xC357], NFKD: [0x110A, 0x1164, 0x11B2] }, +{ source: [0xC358], NFC: [0xC358], NFD: [0x110A, 0x1164, 0x11B3], NFKC: [0xC358], NFKD: [0x110A, 0x1164, 0x11B3] }, +{ source: [0xC359], NFC: [0xC359], NFD: [0x110A, 0x1164, 0x11B4], NFKC: [0xC359], NFKD: [0x110A, 0x1164, 0x11B4] }, +{ source: [0xC35A], NFC: [0xC35A], NFD: [0x110A, 0x1164, 0x11B5], NFKC: [0xC35A], NFKD: [0x110A, 0x1164, 0x11B5] }, +{ source: [0xC35B], NFC: [0xC35B], NFD: [0x110A, 0x1164, 0x11B6], NFKC: [0xC35B], NFKD: [0x110A, 0x1164, 0x11B6] }, +{ source: [0xC35C], NFC: [0xC35C], NFD: [0x110A, 0x1164, 0x11B7], NFKC: [0xC35C], NFKD: [0x110A, 0x1164, 0x11B7] }, +{ source: [0xC35D], NFC: [0xC35D], NFD: [0x110A, 0x1164, 0x11B8], NFKC: [0xC35D], NFKD: [0x110A, 0x1164, 0x11B8] }, +{ source: [0xC35E], NFC: [0xC35E], NFD: [0x110A, 0x1164, 0x11B9], NFKC: [0xC35E], NFKD: [0x110A, 0x1164, 0x11B9] }, +{ source: [0xC35F], NFC: [0xC35F], NFD: [0x110A, 0x1164, 0x11BA], NFKC: [0xC35F], NFKD: [0x110A, 0x1164, 0x11BA] }, +{ source: [0xC360], NFC: [0xC360], NFD: [0x110A, 0x1164, 0x11BB], NFKC: [0xC360], NFKD: [0x110A, 0x1164, 0x11BB] }, +{ source: [0xC361], NFC: [0xC361], NFD: [0x110A, 0x1164, 0x11BC], NFKC: [0xC361], NFKD: [0x110A, 0x1164, 0x11BC] }, +{ source: [0xC362], NFC: [0xC362], NFD: [0x110A, 0x1164, 0x11BD], NFKC: [0xC362], NFKD: [0x110A, 0x1164, 0x11BD] }, +{ source: [0xC363], NFC: [0xC363], NFD: [0x110A, 0x1164, 0x11BE], NFKC: [0xC363], NFKD: [0x110A, 0x1164, 0x11BE] }, +{ source: [0xC364], NFC: [0xC364], NFD: [0x110A, 0x1164, 0x11BF], NFKC: [0xC364], NFKD: [0x110A, 0x1164, 0x11BF] }, +{ source: [0xC365], NFC: [0xC365], NFD: [0x110A, 0x1164, 0x11C0], NFKC: [0xC365], NFKD: [0x110A, 0x1164, 0x11C0] }, +{ source: [0xC366], NFC: [0xC366], NFD: [0x110A, 0x1164, 0x11C1], NFKC: [0xC366], NFKD: [0x110A, 0x1164, 0x11C1] }, +{ source: [0xC367], NFC: [0xC367], NFD: [0x110A, 0x1164, 0x11C2], NFKC: [0xC367], NFKD: [0x110A, 0x1164, 0x11C2] }, +{ source: [0xC368], NFC: [0xC368], NFD: [0x110A, 0x1165], NFKC: [0xC368], NFKD: [0x110A, 0x1165] }, +{ source: [0xC369], NFC: [0xC369], NFD: [0x110A, 0x1165, 0x11A8], NFKC: [0xC369], NFKD: [0x110A, 0x1165, 0x11A8] }, +{ source: [0xC36A], NFC: [0xC36A], NFD: [0x110A, 0x1165, 0x11A9], NFKC: [0xC36A], NFKD: [0x110A, 0x1165, 0x11A9] }, +{ source: [0xC36B], NFC: [0xC36B], NFD: [0x110A, 0x1165, 0x11AA], NFKC: [0xC36B], NFKD: [0x110A, 0x1165, 0x11AA] }, +{ source: [0xC36C], NFC: [0xC36C], NFD: [0x110A, 0x1165, 0x11AB], NFKC: [0xC36C], NFKD: [0x110A, 0x1165, 0x11AB] }, +{ source: [0xC36D], NFC: [0xC36D], NFD: [0x110A, 0x1165, 0x11AC], NFKC: [0xC36D], NFKD: [0x110A, 0x1165, 0x11AC] }, +{ source: [0xC36E], NFC: [0xC36E], NFD: [0x110A, 0x1165, 0x11AD], NFKC: [0xC36E], NFKD: [0x110A, 0x1165, 0x11AD] }, +{ source: [0xC36F], NFC: [0xC36F], NFD: [0x110A, 0x1165, 0x11AE], NFKC: [0xC36F], NFKD: [0x110A, 0x1165, 0x11AE] }, +{ source: [0xC370], NFC: [0xC370], NFD: [0x110A, 0x1165, 0x11AF], NFKC: [0xC370], NFKD: [0x110A, 0x1165, 0x11AF] }, +{ source: [0xC371], NFC: [0xC371], NFD: [0x110A, 0x1165, 0x11B0], NFKC: [0xC371], NFKD: [0x110A, 0x1165, 0x11B0] }, +{ source: [0xC372], NFC: [0xC372], NFD: [0x110A, 0x1165, 0x11B1], NFKC: [0xC372], NFKD: [0x110A, 0x1165, 0x11B1] }, +{ source: [0xC373], NFC: [0xC373], NFD: [0x110A, 0x1165, 0x11B2], NFKC: [0xC373], NFKD: [0x110A, 0x1165, 0x11B2] }, +{ source: [0xC374], NFC: [0xC374], NFD: [0x110A, 0x1165, 0x11B3], NFKC: [0xC374], NFKD: [0x110A, 0x1165, 0x11B3] }, +{ source: [0xC375], NFC: [0xC375], NFD: [0x110A, 0x1165, 0x11B4], NFKC: [0xC375], NFKD: [0x110A, 0x1165, 0x11B4] }, +{ source: [0xC376], NFC: [0xC376], NFD: [0x110A, 0x1165, 0x11B5], NFKC: [0xC376], NFKD: [0x110A, 0x1165, 0x11B5] }, +{ source: [0xC377], NFC: [0xC377], NFD: [0x110A, 0x1165, 0x11B6], NFKC: [0xC377], NFKD: [0x110A, 0x1165, 0x11B6] }, +{ source: [0xC378], NFC: [0xC378], NFD: [0x110A, 0x1165, 0x11B7], NFKC: [0xC378], NFKD: [0x110A, 0x1165, 0x11B7] }, +{ source: [0xC379], NFC: [0xC379], NFD: [0x110A, 0x1165, 0x11B8], NFKC: [0xC379], NFKD: [0x110A, 0x1165, 0x11B8] }, +{ source: [0xC37A], NFC: [0xC37A], NFD: [0x110A, 0x1165, 0x11B9], NFKC: [0xC37A], NFKD: [0x110A, 0x1165, 0x11B9] }, +{ source: [0xC37B], NFC: [0xC37B], NFD: [0x110A, 0x1165, 0x11BA], NFKC: [0xC37B], NFKD: [0x110A, 0x1165, 0x11BA] }, +{ source: [0xC37C], NFC: [0xC37C], NFD: [0x110A, 0x1165, 0x11BB], NFKC: [0xC37C], NFKD: [0x110A, 0x1165, 0x11BB] }, +{ source: [0xC37D], NFC: [0xC37D], NFD: [0x110A, 0x1165, 0x11BC], NFKC: [0xC37D], NFKD: [0x110A, 0x1165, 0x11BC] }, +{ source: [0xC37E], NFC: [0xC37E], NFD: [0x110A, 0x1165, 0x11BD], NFKC: [0xC37E], NFKD: [0x110A, 0x1165, 0x11BD] }, +{ source: [0xC37F], NFC: [0xC37F], NFD: [0x110A, 0x1165, 0x11BE], NFKC: [0xC37F], NFKD: [0x110A, 0x1165, 0x11BE] }, +{ source: [0xC380], NFC: [0xC380], NFD: [0x110A, 0x1165, 0x11BF], NFKC: [0xC380], NFKD: [0x110A, 0x1165, 0x11BF] }, +{ source: [0xC381], NFC: [0xC381], NFD: [0x110A, 0x1165, 0x11C0], NFKC: [0xC381], NFKD: [0x110A, 0x1165, 0x11C0] }, +{ source: [0xC382], NFC: [0xC382], NFD: [0x110A, 0x1165, 0x11C1], NFKC: [0xC382], NFKD: [0x110A, 0x1165, 0x11C1] }, +{ source: [0xC383], NFC: [0xC383], NFD: [0x110A, 0x1165, 0x11C2], NFKC: [0xC383], NFKD: [0x110A, 0x1165, 0x11C2] }, +{ source: [0xC384], NFC: [0xC384], NFD: [0x110A, 0x1166], NFKC: [0xC384], NFKD: [0x110A, 0x1166] }, +{ source: [0xC385], NFC: [0xC385], NFD: [0x110A, 0x1166, 0x11A8], NFKC: [0xC385], NFKD: [0x110A, 0x1166, 0x11A8] }, +{ source: [0xC386], NFC: [0xC386], NFD: [0x110A, 0x1166, 0x11A9], NFKC: [0xC386], NFKD: [0x110A, 0x1166, 0x11A9] }, +{ source: [0xC387], NFC: [0xC387], NFD: [0x110A, 0x1166, 0x11AA], NFKC: [0xC387], NFKD: [0x110A, 0x1166, 0x11AA] }, +{ source: [0xC388], NFC: [0xC388], NFD: [0x110A, 0x1166, 0x11AB], NFKC: [0xC388], NFKD: [0x110A, 0x1166, 0x11AB] }, +{ source: [0xC389], NFC: [0xC389], NFD: [0x110A, 0x1166, 0x11AC], NFKC: [0xC389], NFKD: [0x110A, 0x1166, 0x11AC] }, +{ source: [0xC38A], NFC: [0xC38A], NFD: [0x110A, 0x1166, 0x11AD], NFKC: [0xC38A], NFKD: [0x110A, 0x1166, 0x11AD] }, +{ source: [0xC38B], NFC: [0xC38B], NFD: [0x110A, 0x1166, 0x11AE], NFKC: [0xC38B], NFKD: [0x110A, 0x1166, 0x11AE] }, +{ source: [0xC38C], NFC: [0xC38C], NFD: [0x110A, 0x1166, 0x11AF], NFKC: [0xC38C], NFKD: [0x110A, 0x1166, 0x11AF] }, +{ source: [0xC38D], NFC: [0xC38D], NFD: [0x110A, 0x1166, 0x11B0], NFKC: [0xC38D], NFKD: [0x110A, 0x1166, 0x11B0] }, +{ source: [0xC38E], NFC: [0xC38E], NFD: [0x110A, 0x1166, 0x11B1], NFKC: [0xC38E], NFKD: [0x110A, 0x1166, 0x11B1] }, +{ source: [0xC38F], NFC: [0xC38F], NFD: [0x110A, 0x1166, 0x11B2], NFKC: [0xC38F], NFKD: [0x110A, 0x1166, 0x11B2] }, +{ source: [0xC390], NFC: [0xC390], NFD: [0x110A, 0x1166, 0x11B3], NFKC: [0xC390], NFKD: [0x110A, 0x1166, 0x11B3] }, +{ source: [0xC391], NFC: [0xC391], NFD: [0x110A, 0x1166, 0x11B4], NFKC: [0xC391], NFKD: [0x110A, 0x1166, 0x11B4] }, +{ source: [0xC392], NFC: [0xC392], NFD: [0x110A, 0x1166, 0x11B5], NFKC: [0xC392], NFKD: [0x110A, 0x1166, 0x11B5] }, +{ source: [0xC393], NFC: [0xC393], NFD: [0x110A, 0x1166, 0x11B6], NFKC: [0xC393], NFKD: [0x110A, 0x1166, 0x11B6] }, +{ source: [0xC394], NFC: [0xC394], NFD: [0x110A, 0x1166, 0x11B7], NFKC: [0xC394], NFKD: [0x110A, 0x1166, 0x11B7] }, +{ source: [0xC395], NFC: [0xC395], NFD: [0x110A, 0x1166, 0x11B8], NFKC: [0xC395], NFKD: [0x110A, 0x1166, 0x11B8] }, +{ source: [0xC396], NFC: [0xC396], NFD: [0x110A, 0x1166, 0x11B9], NFKC: [0xC396], NFKD: [0x110A, 0x1166, 0x11B9] }, +{ source: [0xC397], NFC: [0xC397], NFD: [0x110A, 0x1166, 0x11BA], NFKC: [0xC397], NFKD: [0x110A, 0x1166, 0x11BA] }, +{ source: [0xC398], NFC: [0xC398], NFD: [0x110A, 0x1166, 0x11BB], NFKC: [0xC398], NFKD: [0x110A, 0x1166, 0x11BB] }, +{ source: [0xC399], NFC: [0xC399], NFD: [0x110A, 0x1166, 0x11BC], NFKC: [0xC399], NFKD: [0x110A, 0x1166, 0x11BC] }, +{ source: [0xC39A], NFC: [0xC39A], NFD: [0x110A, 0x1166, 0x11BD], NFKC: [0xC39A], NFKD: [0x110A, 0x1166, 0x11BD] }, +{ source: [0xC39B], NFC: [0xC39B], NFD: [0x110A, 0x1166, 0x11BE], NFKC: [0xC39B], NFKD: [0x110A, 0x1166, 0x11BE] }, +{ source: [0xC39C], NFC: [0xC39C], NFD: [0x110A, 0x1166, 0x11BF], NFKC: [0xC39C], NFKD: [0x110A, 0x1166, 0x11BF] }, +{ source: [0xC39D], NFC: [0xC39D], NFD: [0x110A, 0x1166, 0x11C0], NFKC: [0xC39D], NFKD: [0x110A, 0x1166, 0x11C0] }, +{ source: [0xC39E], NFC: [0xC39E], NFD: [0x110A, 0x1166, 0x11C1], NFKC: [0xC39E], NFKD: [0x110A, 0x1166, 0x11C1] }, +{ source: [0xC39F], NFC: [0xC39F], NFD: [0x110A, 0x1166, 0x11C2], NFKC: [0xC39F], NFKD: [0x110A, 0x1166, 0x11C2] }, +{ source: [0xC3A0], NFC: [0xC3A0], NFD: [0x110A, 0x1167], NFKC: [0xC3A0], NFKD: [0x110A, 0x1167] }, +{ source: [0xC3A1], NFC: [0xC3A1], NFD: [0x110A, 0x1167, 0x11A8], NFKC: [0xC3A1], NFKD: [0x110A, 0x1167, 0x11A8] }, +{ source: [0xC3A2], NFC: [0xC3A2], NFD: [0x110A, 0x1167, 0x11A9], NFKC: [0xC3A2], NFKD: [0x110A, 0x1167, 0x11A9] }, +{ source: [0xC3A3], NFC: [0xC3A3], NFD: [0x110A, 0x1167, 0x11AA], NFKC: [0xC3A3], NFKD: [0x110A, 0x1167, 0x11AA] }, +{ source: [0xC3A4], NFC: [0xC3A4], NFD: [0x110A, 0x1167, 0x11AB], NFKC: [0xC3A4], NFKD: [0x110A, 0x1167, 0x11AB] }, +{ source: [0xC3A5], NFC: [0xC3A5], NFD: [0x110A, 0x1167, 0x11AC], NFKC: [0xC3A5], NFKD: [0x110A, 0x1167, 0x11AC] }, +{ source: [0xC3A6], NFC: [0xC3A6], NFD: [0x110A, 0x1167, 0x11AD], NFKC: [0xC3A6], NFKD: [0x110A, 0x1167, 0x11AD] }, +{ source: [0xC3A7], NFC: [0xC3A7], NFD: [0x110A, 0x1167, 0x11AE], NFKC: [0xC3A7], NFKD: [0x110A, 0x1167, 0x11AE] }, +{ source: [0xC3A8], NFC: [0xC3A8], NFD: [0x110A, 0x1167, 0x11AF], NFKC: [0xC3A8], NFKD: [0x110A, 0x1167, 0x11AF] }, +{ source: [0xC3A9], NFC: [0xC3A9], NFD: [0x110A, 0x1167, 0x11B0], NFKC: [0xC3A9], NFKD: [0x110A, 0x1167, 0x11B0] }, +{ source: [0xC3AA], NFC: [0xC3AA], NFD: [0x110A, 0x1167, 0x11B1], NFKC: [0xC3AA], NFKD: [0x110A, 0x1167, 0x11B1] }, +{ source: [0xC3AB], NFC: [0xC3AB], NFD: [0x110A, 0x1167, 0x11B2], NFKC: [0xC3AB], NFKD: [0x110A, 0x1167, 0x11B2] }, +{ source: [0xC3AC], NFC: [0xC3AC], NFD: [0x110A, 0x1167, 0x11B3], NFKC: [0xC3AC], NFKD: [0x110A, 0x1167, 0x11B3] }, +{ source: [0xC3AD], NFC: [0xC3AD], NFD: [0x110A, 0x1167, 0x11B4], NFKC: [0xC3AD], NFKD: [0x110A, 0x1167, 0x11B4] }, +{ source: [0xC3AE], NFC: [0xC3AE], NFD: [0x110A, 0x1167, 0x11B5], NFKC: [0xC3AE], NFKD: [0x110A, 0x1167, 0x11B5] }, +{ source: [0xC3AF], NFC: [0xC3AF], NFD: [0x110A, 0x1167, 0x11B6], NFKC: [0xC3AF], NFKD: [0x110A, 0x1167, 0x11B6] }, +{ source: [0xC3B0], NFC: [0xC3B0], NFD: [0x110A, 0x1167, 0x11B7], NFKC: [0xC3B0], NFKD: [0x110A, 0x1167, 0x11B7] }, +{ source: [0xC3B1], NFC: [0xC3B1], NFD: [0x110A, 0x1167, 0x11B8], NFKC: [0xC3B1], NFKD: [0x110A, 0x1167, 0x11B8] }, +{ source: [0xC3B2], NFC: [0xC3B2], NFD: [0x110A, 0x1167, 0x11B9], NFKC: [0xC3B2], NFKD: [0x110A, 0x1167, 0x11B9] }, +{ source: [0xC3B3], NFC: [0xC3B3], NFD: [0x110A, 0x1167, 0x11BA], NFKC: [0xC3B3], NFKD: [0x110A, 0x1167, 0x11BA] }, +{ source: [0xC3B4], NFC: [0xC3B4], NFD: [0x110A, 0x1167, 0x11BB], NFKC: [0xC3B4], NFKD: [0x110A, 0x1167, 0x11BB] }, +{ source: [0xC3B5], NFC: [0xC3B5], NFD: [0x110A, 0x1167, 0x11BC], NFKC: [0xC3B5], NFKD: [0x110A, 0x1167, 0x11BC] }, +{ source: [0xC3B6], NFC: [0xC3B6], NFD: [0x110A, 0x1167, 0x11BD], NFKC: [0xC3B6], NFKD: [0x110A, 0x1167, 0x11BD] }, +{ source: [0xC3B7], NFC: [0xC3B7], NFD: [0x110A, 0x1167, 0x11BE], NFKC: [0xC3B7], NFKD: [0x110A, 0x1167, 0x11BE] }, +{ source: [0xC3B8], NFC: [0xC3B8], NFD: [0x110A, 0x1167, 0x11BF], NFKC: [0xC3B8], NFKD: [0x110A, 0x1167, 0x11BF] }, +{ source: [0xC3B9], NFC: [0xC3B9], NFD: [0x110A, 0x1167, 0x11C0], NFKC: [0xC3B9], NFKD: [0x110A, 0x1167, 0x11C0] }, +{ source: [0xC3BA], NFC: [0xC3BA], NFD: [0x110A, 0x1167, 0x11C1], NFKC: [0xC3BA], NFKD: [0x110A, 0x1167, 0x11C1] }, +{ source: [0xC3BB], NFC: [0xC3BB], NFD: [0x110A, 0x1167, 0x11C2], NFKC: [0xC3BB], NFKD: [0x110A, 0x1167, 0x11C2] }, +{ source: [0xC3BC], NFC: [0xC3BC], NFD: [0x110A, 0x1168], NFKC: [0xC3BC], NFKD: [0x110A, 0x1168] }, +{ source: [0xC3BD], NFC: [0xC3BD], NFD: [0x110A, 0x1168, 0x11A8], NFKC: [0xC3BD], NFKD: [0x110A, 0x1168, 0x11A8] }, +{ source: [0xC3BE], NFC: [0xC3BE], NFD: [0x110A, 0x1168, 0x11A9], NFKC: [0xC3BE], NFKD: [0x110A, 0x1168, 0x11A9] }, +{ source: [0xC3BF], NFC: [0xC3BF], NFD: [0x110A, 0x1168, 0x11AA], NFKC: [0xC3BF], NFKD: [0x110A, 0x1168, 0x11AA] }, +{ source: [0xC3C0], NFC: [0xC3C0], NFD: [0x110A, 0x1168, 0x11AB], NFKC: [0xC3C0], NFKD: [0x110A, 0x1168, 0x11AB] }, +{ source: [0xC3C1], NFC: [0xC3C1], NFD: [0x110A, 0x1168, 0x11AC], NFKC: [0xC3C1], NFKD: [0x110A, 0x1168, 0x11AC] }, +{ source: [0xC3C2], NFC: [0xC3C2], NFD: [0x110A, 0x1168, 0x11AD], NFKC: [0xC3C2], NFKD: [0x110A, 0x1168, 0x11AD] }, +{ source: [0xC3C3], NFC: [0xC3C3], NFD: [0x110A, 0x1168, 0x11AE], NFKC: [0xC3C3], NFKD: [0x110A, 0x1168, 0x11AE] }, +{ source: [0xC3C4], NFC: [0xC3C4], NFD: [0x110A, 0x1168, 0x11AF], NFKC: [0xC3C4], NFKD: [0x110A, 0x1168, 0x11AF] }, +{ source: [0xC3C5], NFC: [0xC3C5], NFD: [0x110A, 0x1168, 0x11B0], NFKC: [0xC3C5], NFKD: [0x110A, 0x1168, 0x11B0] }, +{ source: [0xC3C6], NFC: [0xC3C6], NFD: [0x110A, 0x1168, 0x11B1], NFKC: [0xC3C6], NFKD: [0x110A, 0x1168, 0x11B1] }, +{ source: [0xC3C7], NFC: [0xC3C7], NFD: [0x110A, 0x1168, 0x11B2], NFKC: [0xC3C7], NFKD: [0x110A, 0x1168, 0x11B2] }, +{ source: [0xC3C8], NFC: [0xC3C8], NFD: [0x110A, 0x1168, 0x11B3], NFKC: [0xC3C8], NFKD: [0x110A, 0x1168, 0x11B3] }, +{ source: [0xC3C9], NFC: [0xC3C9], NFD: [0x110A, 0x1168, 0x11B4], NFKC: [0xC3C9], NFKD: [0x110A, 0x1168, 0x11B4] }, +{ source: [0xC3CA], NFC: [0xC3CA], NFD: [0x110A, 0x1168, 0x11B5], NFKC: [0xC3CA], NFKD: [0x110A, 0x1168, 0x11B5] }, +{ source: [0xC3CB], NFC: [0xC3CB], NFD: [0x110A, 0x1168, 0x11B6], NFKC: [0xC3CB], NFKD: [0x110A, 0x1168, 0x11B6] }, +{ source: [0xC3CC], NFC: [0xC3CC], NFD: [0x110A, 0x1168, 0x11B7], NFKC: [0xC3CC], NFKD: [0x110A, 0x1168, 0x11B7] }, +{ source: [0xC3CD], NFC: [0xC3CD], NFD: [0x110A, 0x1168, 0x11B8], NFKC: [0xC3CD], NFKD: [0x110A, 0x1168, 0x11B8] }, +{ source: [0xC3CE], NFC: [0xC3CE], NFD: [0x110A, 0x1168, 0x11B9], NFKC: [0xC3CE], NFKD: [0x110A, 0x1168, 0x11B9] }, +{ source: [0xC3CF], NFC: [0xC3CF], NFD: [0x110A, 0x1168, 0x11BA], NFKC: [0xC3CF], NFKD: [0x110A, 0x1168, 0x11BA] }, +{ source: [0xC3D0], NFC: [0xC3D0], NFD: [0x110A, 0x1168, 0x11BB], NFKC: [0xC3D0], NFKD: [0x110A, 0x1168, 0x11BB] }, +{ source: [0xC3D1], NFC: [0xC3D1], NFD: [0x110A, 0x1168, 0x11BC], NFKC: [0xC3D1], NFKD: [0x110A, 0x1168, 0x11BC] }, +{ source: [0xC3D2], NFC: [0xC3D2], NFD: [0x110A, 0x1168, 0x11BD], NFKC: [0xC3D2], NFKD: [0x110A, 0x1168, 0x11BD] }, +{ source: [0xC3D3], NFC: [0xC3D3], NFD: [0x110A, 0x1168, 0x11BE], NFKC: [0xC3D3], NFKD: [0x110A, 0x1168, 0x11BE] }, +{ source: [0xC3D4], NFC: [0xC3D4], NFD: [0x110A, 0x1168, 0x11BF], NFKC: [0xC3D4], NFKD: [0x110A, 0x1168, 0x11BF] }, +{ source: [0xC3D5], NFC: [0xC3D5], NFD: [0x110A, 0x1168, 0x11C0], NFKC: [0xC3D5], NFKD: [0x110A, 0x1168, 0x11C0] }, +{ source: [0xC3D6], NFC: [0xC3D6], NFD: [0x110A, 0x1168, 0x11C1], NFKC: [0xC3D6], NFKD: [0x110A, 0x1168, 0x11C1] }, +{ source: [0xC3D7], NFC: [0xC3D7], NFD: [0x110A, 0x1168, 0x11C2], NFKC: [0xC3D7], NFKD: [0x110A, 0x1168, 0x11C2] }, +{ source: [0xC3D8], NFC: [0xC3D8], NFD: [0x110A, 0x1169], NFKC: [0xC3D8], NFKD: [0x110A, 0x1169] }, +{ source: [0xC3D9], NFC: [0xC3D9], NFD: [0x110A, 0x1169, 0x11A8], NFKC: [0xC3D9], NFKD: [0x110A, 0x1169, 0x11A8] }, +{ source: [0xC3DA], NFC: [0xC3DA], NFD: [0x110A, 0x1169, 0x11A9], NFKC: [0xC3DA], NFKD: [0x110A, 0x1169, 0x11A9] }, +{ source: [0xC3DB], NFC: [0xC3DB], NFD: [0x110A, 0x1169, 0x11AA], NFKC: [0xC3DB], NFKD: [0x110A, 0x1169, 0x11AA] }, +{ source: [0xC3DC], NFC: [0xC3DC], NFD: [0x110A, 0x1169, 0x11AB], NFKC: [0xC3DC], NFKD: [0x110A, 0x1169, 0x11AB] }, +{ source: [0xC3DD], NFC: [0xC3DD], NFD: [0x110A, 0x1169, 0x11AC], NFKC: [0xC3DD], NFKD: [0x110A, 0x1169, 0x11AC] }, +{ source: [0xC3DE], NFC: [0xC3DE], NFD: [0x110A, 0x1169, 0x11AD], NFKC: [0xC3DE], NFKD: [0x110A, 0x1169, 0x11AD] }, +{ source: [0xC3DF], NFC: [0xC3DF], NFD: [0x110A, 0x1169, 0x11AE], NFKC: [0xC3DF], NFKD: [0x110A, 0x1169, 0x11AE] }, +{ source: [0xC3E0], NFC: [0xC3E0], NFD: [0x110A, 0x1169, 0x11AF], NFKC: [0xC3E0], NFKD: [0x110A, 0x1169, 0x11AF] }, +{ source: [0xC3E1], NFC: [0xC3E1], NFD: [0x110A, 0x1169, 0x11B0], NFKC: [0xC3E1], NFKD: [0x110A, 0x1169, 0x11B0] }, +{ source: [0xC3E2], NFC: [0xC3E2], NFD: [0x110A, 0x1169, 0x11B1], NFKC: [0xC3E2], NFKD: [0x110A, 0x1169, 0x11B1] }, +{ source: [0xC3E3], NFC: [0xC3E3], NFD: [0x110A, 0x1169, 0x11B2], NFKC: [0xC3E3], NFKD: [0x110A, 0x1169, 0x11B2] }, +{ source: [0xC3E4], NFC: [0xC3E4], NFD: [0x110A, 0x1169, 0x11B3], NFKC: [0xC3E4], NFKD: [0x110A, 0x1169, 0x11B3] }, +{ source: [0xC3E5], NFC: [0xC3E5], NFD: [0x110A, 0x1169, 0x11B4], NFKC: [0xC3E5], NFKD: [0x110A, 0x1169, 0x11B4] }, +{ source: [0xC3E6], NFC: [0xC3E6], NFD: [0x110A, 0x1169, 0x11B5], NFKC: [0xC3E6], NFKD: [0x110A, 0x1169, 0x11B5] }, +{ source: [0xC3E7], NFC: [0xC3E7], NFD: [0x110A, 0x1169, 0x11B6], NFKC: [0xC3E7], NFKD: [0x110A, 0x1169, 0x11B6] }, +{ source: [0xC3E8], NFC: [0xC3E8], NFD: [0x110A, 0x1169, 0x11B7], NFKC: [0xC3E8], NFKD: [0x110A, 0x1169, 0x11B7] }, +{ source: [0xC3E9], NFC: [0xC3E9], NFD: [0x110A, 0x1169, 0x11B8], NFKC: [0xC3E9], NFKD: [0x110A, 0x1169, 0x11B8] }, +{ source: [0xC3EA], NFC: [0xC3EA], NFD: [0x110A, 0x1169, 0x11B9], NFKC: [0xC3EA], NFKD: [0x110A, 0x1169, 0x11B9] }, +{ source: [0xC3EB], NFC: [0xC3EB], NFD: [0x110A, 0x1169, 0x11BA], NFKC: [0xC3EB], NFKD: [0x110A, 0x1169, 0x11BA] }, +{ source: [0xC3EC], NFC: [0xC3EC], NFD: [0x110A, 0x1169, 0x11BB], NFKC: [0xC3EC], NFKD: [0x110A, 0x1169, 0x11BB] }, +{ source: [0xC3ED], NFC: [0xC3ED], NFD: [0x110A, 0x1169, 0x11BC], NFKC: [0xC3ED], NFKD: [0x110A, 0x1169, 0x11BC] }, +{ source: [0xC3EE], NFC: [0xC3EE], NFD: [0x110A, 0x1169, 0x11BD], NFKC: [0xC3EE], NFKD: [0x110A, 0x1169, 0x11BD] }, +{ source: [0xC3EF], NFC: [0xC3EF], NFD: [0x110A, 0x1169, 0x11BE], NFKC: [0xC3EF], NFKD: [0x110A, 0x1169, 0x11BE] }, +{ source: [0xC3F0], NFC: [0xC3F0], NFD: [0x110A, 0x1169, 0x11BF], NFKC: [0xC3F0], NFKD: [0x110A, 0x1169, 0x11BF] }, +{ source: [0xC3F1], NFC: [0xC3F1], NFD: [0x110A, 0x1169, 0x11C0], NFKC: [0xC3F1], NFKD: [0x110A, 0x1169, 0x11C0] }, +{ source: [0xC3F2], NFC: [0xC3F2], NFD: [0x110A, 0x1169, 0x11C1], NFKC: [0xC3F2], NFKD: [0x110A, 0x1169, 0x11C1] }, +{ source: [0xC3F3], NFC: [0xC3F3], NFD: [0x110A, 0x1169, 0x11C2], NFKC: [0xC3F3], NFKD: [0x110A, 0x1169, 0x11C2] }, +{ source: [0xC3F4], NFC: [0xC3F4], NFD: [0x110A, 0x116A], NFKC: [0xC3F4], NFKD: [0x110A, 0x116A] }, +{ source: [0xC3F5], NFC: [0xC3F5], NFD: [0x110A, 0x116A, 0x11A8], NFKC: [0xC3F5], NFKD: [0x110A, 0x116A, 0x11A8] }, +{ source: [0xC3F6], NFC: [0xC3F6], NFD: [0x110A, 0x116A, 0x11A9], NFKC: [0xC3F6], NFKD: [0x110A, 0x116A, 0x11A9] }, +{ source: [0xC3F7], NFC: [0xC3F7], NFD: [0x110A, 0x116A, 0x11AA], NFKC: [0xC3F7], NFKD: [0x110A, 0x116A, 0x11AA] }, +{ source: [0xC3F8], NFC: [0xC3F8], NFD: [0x110A, 0x116A, 0x11AB], NFKC: [0xC3F8], NFKD: [0x110A, 0x116A, 0x11AB] }, +{ source: [0xC3F9], NFC: [0xC3F9], NFD: [0x110A, 0x116A, 0x11AC], NFKC: [0xC3F9], NFKD: [0x110A, 0x116A, 0x11AC] }, +{ source: [0xC3FA], NFC: [0xC3FA], NFD: [0x110A, 0x116A, 0x11AD], NFKC: [0xC3FA], NFKD: [0x110A, 0x116A, 0x11AD] }, +{ source: [0xC3FB], NFC: [0xC3FB], NFD: [0x110A, 0x116A, 0x11AE], NFKC: [0xC3FB], NFKD: [0x110A, 0x116A, 0x11AE] }, +{ source: [0xC3FC], NFC: [0xC3FC], NFD: [0x110A, 0x116A, 0x11AF], NFKC: [0xC3FC], NFKD: [0x110A, 0x116A, 0x11AF] }, +{ source: [0xC3FD], NFC: [0xC3FD], NFD: [0x110A, 0x116A, 0x11B0], NFKC: [0xC3FD], NFKD: [0x110A, 0x116A, 0x11B0] }, +{ source: [0xC3FE], NFC: [0xC3FE], NFD: [0x110A, 0x116A, 0x11B1], NFKC: [0xC3FE], NFKD: [0x110A, 0x116A, 0x11B1] }, +{ source: [0xC3FF], NFC: [0xC3FF], NFD: [0x110A, 0x116A, 0x11B2], NFKC: [0xC3FF], NFKD: [0x110A, 0x116A, 0x11B2] }, +{ source: [0xC400], NFC: [0xC400], NFD: [0x110A, 0x116A, 0x11B3], NFKC: [0xC400], NFKD: [0x110A, 0x116A, 0x11B3] }, +{ source: [0xC401], NFC: [0xC401], NFD: [0x110A, 0x116A, 0x11B4], NFKC: [0xC401], NFKD: [0x110A, 0x116A, 0x11B4] }, +{ source: [0xC402], NFC: [0xC402], NFD: [0x110A, 0x116A, 0x11B5], NFKC: [0xC402], NFKD: [0x110A, 0x116A, 0x11B5] }, +{ source: [0xC403], NFC: [0xC403], NFD: [0x110A, 0x116A, 0x11B6], NFKC: [0xC403], NFKD: [0x110A, 0x116A, 0x11B6] }, +{ source: [0xC404], NFC: [0xC404], NFD: [0x110A, 0x116A, 0x11B7], NFKC: [0xC404], NFKD: [0x110A, 0x116A, 0x11B7] }, +{ source: [0xC405], NFC: [0xC405], NFD: [0x110A, 0x116A, 0x11B8], NFKC: [0xC405], NFKD: [0x110A, 0x116A, 0x11B8] }, +{ source: [0xC406], NFC: [0xC406], NFD: [0x110A, 0x116A, 0x11B9], NFKC: [0xC406], NFKD: [0x110A, 0x116A, 0x11B9] }, +{ source: [0xC407], NFC: [0xC407], NFD: [0x110A, 0x116A, 0x11BA], NFKC: [0xC407], NFKD: [0x110A, 0x116A, 0x11BA] }, +{ source: [0xC408], NFC: [0xC408], NFD: [0x110A, 0x116A, 0x11BB], NFKC: [0xC408], NFKD: [0x110A, 0x116A, 0x11BB] }, +{ source: [0xC409], NFC: [0xC409], NFD: [0x110A, 0x116A, 0x11BC], NFKC: [0xC409], NFKD: [0x110A, 0x116A, 0x11BC] }, +{ source: [0xC40A], NFC: [0xC40A], NFD: [0x110A, 0x116A, 0x11BD], NFKC: [0xC40A], NFKD: [0x110A, 0x116A, 0x11BD] }, +{ source: [0xC40B], NFC: [0xC40B], NFD: [0x110A, 0x116A, 0x11BE], NFKC: [0xC40B], NFKD: [0x110A, 0x116A, 0x11BE] }, +{ source: [0xC40C], NFC: [0xC40C], NFD: [0x110A, 0x116A, 0x11BF], NFKC: [0xC40C], NFKD: [0x110A, 0x116A, 0x11BF] }, +{ source: [0xC40D], NFC: [0xC40D], NFD: [0x110A, 0x116A, 0x11C0], NFKC: [0xC40D], NFKD: [0x110A, 0x116A, 0x11C0] }, +{ source: [0xC40E], NFC: [0xC40E], NFD: [0x110A, 0x116A, 0x11C1], NFKC: [0xC40E], NFKD: [0x110A, 0x116A, 0x11C1] }, +{ source: [0xC40F], NFC: [0xC40F], NFD: [0x110A, 0x116A, 0x11C2], NFKC: [0xC40F], NFKD: [0x110A, 0x116A, 0x11C2] }, +{ source: [0xC410], NFC: [0xC410], NFD: [0x110A, 0x116B], NFKC: [0xC410], NFKD: [0x110A, 0x116B] }, +{ source: [0xC411], NFC: [0xC411], NFD: [0x110A, 0x116B, 0x11A8], NFKC: [0xC411], NFKD: [0x110A, 0x116B, 0x11A8] }, +{ source: [0xC412], NFC: [0xC412], NFD: [0x110A, 0x116B, 0x11A9], NFKC: [0xC412], NFKD: [0x110A, 0x116B, 0x11A9] }, +{ source: [0xC413], NFC: [0xC413], NFD: [0x110A, 0x116B, 0x11AA], NFKC: [0xC413], NFKD: [0x110A, 0x116B, 0x11AA] }, +{ source: [0xC414], NFC: [0xC414], NFD: [0x110A, 0x116B, 0x11AB], NFKC: [0xC414], NFKD: [0x110A, 0x116B, 0x11AB] }, +{ source: [0xC415], NFC: [0xC415], NFD: [0x110A, 0x116B, 0x11AC], NFKC: [0xC415], NFKD: [0x110A, 0x116B, 0x11AC] }, +{ source: [0xC416], NFC: [0xC416], NFD: [0x110A, 0x116B, 0x11AD], NFKC: [0xC416], NFKD: [0x110A, 0x116B, 0x11AD] }, +{ source: [0xC417], NFC: [0xC417], NFD: [0x110A, 0x116B, 0x11AE], NFKC: [0xC417], NFKD: [0x110A, 0x116B, 0x11AE] }, +{ source: [0xC418], NFC: [0xC418], NFD: [0x110A, 0x116B, 0x11AF], NFKC: [0xC418], NFKD: [0x110A, 0x116B, 0x11AF] }, +{ source: [0xC419], NFC: [0xC419], NFD: [0x110A, 0x116B, 0x11B0], NFKC: [0xC419], NFKD: [0x110A, 0x116B, 0x11B0] }, +{ source: [0xC41A], NFC: [0xC41A], NFD: [0x110A, 0x116B, 0x11B1], NFKC: [0xC41A], NFKD: [0x110A, 0x116B, 0x11B1] }, +{ source: [0xC41B], NFC: [0xC41B], NFD: [0x110A, 0x116B, 0x11B2], NFKC: [0xC41B], NFKD: [0x110A, 0x116B, 0x11B2] }, +{ source: [0xC41C], NFC: [0xC41C], NFD: [0x110A, 0x116B, 0x11B3], NFKC: [0xC41C], NFKD: [0x110A, 0x116B, 0x11B3] }, +{ source: [0xC41D], NFC: [0xC41D], NFD: [0x110A, 0x116B, 0x11B4], NFKC: [0xC41D], NFKD: [0x110A, 0x116B, 0x11B4] }, +{ source: [0xC41E], NFC: [0xC41E], NFD: [0x110A, 0x116B, 0x11B5], NFKC: [0xC41E], NFKD: [0x110A, 0x116B, 0x11B5] }, +{ source: [0xC41F], NFC: [0xC41F], NFD: [0x110A, 0x116B, 0x11B6], NFKC: [0xC41F], NFKD: [0x110A, 0x116B, 0x11B6] }, +{ source: [0xC420], NFC: [0xC420], NFD: [0x110A, 0x116B, 0x11B7], NFKC: [0xC420], NFKD: [0x110A, 0x116B, 0x11B7] }, +{ source: [0xC421], NFC: [0xC421], NFD: [0x110A, 0x116B, 0x11B8], NFKC: [0xC421], NFKD: [0x110A, 0x116B, 0x11B8] }, +{ source: [0xC422], NFC: [0xC422], NFD: [0x110A, 0x116B, 0x11B9], NFKC: [0xC422], NFKD: [0x110A, 0x116B, 0x11B9] }, +{ source: [0xC423], NFC: [0xC423], NFD: [0x110A, 0x116B, 0x11BA], NFKC: [0xC423], NFKD: [0x110A, 0x116B, 0x11BA] }, +{ source: [0xC424], NFC: [0xC424], NFD: [0x110A, 0x116B, 0x11BB], NFKC: [0xC424], NFKD: [0x110A, 0x116B, 0x11BB] }, +{ source: [0xC425], NFC: [0xC425], NFD: [0x110A, 0x116B, 0x11BC], NFKC: [0xC425], NFKD: [0x110A, 0x116B, 0x11BC] }, +{ source: [0xC426], NFC: [0xC426], NFD: [0x110A, 0x116B, 0x11BD], NFKC: [0xC426], NFKD: [0x110A, 0x116B, 0x11BD] }, +{ source: [0xC427], NFC: [0xC427], NFD: [0x110A, 0x116B, 0x11BE], NFKC: [0xC427], NFKD: [0x110A, 0x116B, 0x11BE] }, +{ source: [0xC428], NFC: [0xC428], NFD: [0x110A, 0x116B, 0x11BF], NFKC: [0xC428], NFKD: [0x110A, 0x116B, 0x11BF] }, +{ source: [0xC429], NFC: [0xC429], NFD: [0x110A, 0x116B, 0x11C0], NFKC: [0xC429], NFKD: [0x110A, 0x116B, 0x11C0] }, +{ source: [0xC42A], NFC: [0xC42A], NFD: [0x110A, 0x116B, 0x11C1], NFKC: [0xC42A], NFKD: [0x110A, 0x116B, 0x11C1] }, +{ source: [0xC42B], NFC: [0xC42B], NFD: [0x110A, 0x116B, 0x11C2], NFKC: [0xC42B], NFKD: [0x110A, 0x116B, 0x11C2] }, +{ source: [0xC42C], NFC: [0xC42C], NFD: [0x110A, 0x116C], NFKC: [0xC42C], NFKD: [0x110A, 0x116C] }, +{ source: [0xC42D], NFC: [0xC42D], NFD: [0x110A, 0x116C, 0x11A8], NFKC: [0xC42D], NFKD: [0x110A, 0x116C, 0x11A8] }, +{ source: [0xC42E], NFC: [0xC42E], NFD: [0x110A, 0x116C, 0x11A9], NFKC: [0xC42E], NFKD: [0x110A, 0x116C, 0x11A9] }, +{ source: [0xC42F], NFC: [0xC42F], NFD: [0x110A, 0x116C, 0x11AA], NFKC: [0xC42F], NFKD: [0x110A, 0x116C, 0x11AA] }, +{ source: [0xC430], NFC: [0xC430], NFD: [0x110A, 0x116C, 0x11AB], NFKC: [0xC430], NFKD: [0x110A, 0x116C, 0x11AB] }, +{ source: [0xC431], NFC: [0xC431], NFD: [0x110A, 0x116C, 0x11AC], NFKC: [0xC431], NFKD: [0x110A, 0x116C, 0x11AC] }, +{ source: [0xC432], NFC: [0xC432], NFD: [0x110A, 0x116C, 0x11AD], NFKC: [0xC432], NFKD: [0x110A, 0x116C, 0x11AD] }, +{ source: [0xC433], NFC: [0xC433], NFD: [0x110A, 0x116C, 0x11AE], NFKC: [0xC433], NFKD: [0x110A, 0x116C, 0x11AE] }, +{ source: [0xC434], NFC: [0xC434], NFD: [0x110A, 0x116C, 0x11AF], NFKC: [0xC434], NFKD: [0x110A, 0x116C, 0x11AF] }, +{ source: [0xC435], NFC: [0xC435], NFD: [0x110A, 0x116C, 0x11B0], NFKC: [0xC435], NFKD: [0x110A, 0x116C, 0x11B0] }, +{ source: [0xC436], NFC: [0xC436], NFD: [0x110A, 0x116C, 0x11B1], NFKC: [0xC436], NFKD: [0x110A, 0x116C, 0x11B1] }, +{ source: [0xC437], NFC: [0xC437], NFD: [0x110A, 0x116C, 0x11B2], NFKC: [0xC437], NFKD: [0x110A, 0x116C, 0x11B2] }, +{ source: [0xC438], NFC: [0xC438], NFD: [0x110A, 0x116C, 0x11B3], NFKC: [0xC438], NFKD: [0x110A, 0x116C, 0x11B3] }, +{ source: [0xC439], NFC: [0xC439], NFD: [0x110A, 0x116C, 0x11B4], NFKC: [0xC439], NFKD: [0x110A, 0x116C, 0x11B4] }, +{ source: [0xC43A], NFC: [0xC43A], NFD: [0x110A, 0x116C, 0x11B5], NFKC: [0xC43A], NFKD: [0x110A, 0x116C, 0x11B5] }, +{ source: [0xC43B], NFC: [0xC43B], NFD: [0x110A, 0x116C, 0x11B6], NFKC: [0xC43B], NFKD: [0x110A, 0x116C, 0x11B6] }, +{ source: [0xC43C], NFC: [0xC43C], NFD: [0x110A, 0x116C, 0x11B7], NFKC: [0xC43C], NFKD: [0x110A, 0x116C, 0x11B7] }, +{ source: [0xC43D], NFC: [0xC43D], NFD: [0x110A, 0x116C, 0x11B8], NFKC: [0xC43D], NFKD: [0x110A, 0x116C, 0x11B8] }, +{ source: [0xC43E], NFC: [0xC43E], NFD: [0x110A, 0x116C, 0x11B9], NFKC: [0xC43E], NFKD: [0x110A, 0x116C, 0x11B9] }, +{ source: [0xC43F], NFC: [0xC43F], NFD: [0x110A, 0x116C, 0x11BA], NFKC: [0xC43F], NFKD: [0x110A, 0x116C, 0x11BA] }, +{ source: [0xC440], NFC: [0xC440], NFD: [0x110A, 0x116C, 0x11BB], NFKC: [0xC440], NFKD: [0x110A, 0x116C, 0x11BB] }, +{ source: [0xC441], NFC: [0xC441], NFD: [0x110A, 0x116C, 0x11BC], NFKC: [0xC441], NFKD: [0x110A, 0x116C, 0x11BC] }, +{ source: [0xC442], NFC: [0xC442], NFD: [0x110A, 0x116C, 0x11BD], NFKC: [0xC442], NFKD: [0x110A, 0x116C, 0x11BD] }, +{ source: [0xC443], NFC: [0xC443], NFD: [0x110A, 0x116C, 0x11BE], NFKC: [0xC443], NFKD: [0x110A, 0x116C, 0x11BE] }, +{ source: [0xC444], NFC: [0xC444], NFD: [0x110A, 0x116C, 0x11BF], NFKC: [0xC444], NFKD: [0x110A, 0x116C, 0x11BF] }, +{ source: [0xC445], NFC: [0xC445], NFD: [0x110A, 0x116C, 0x11C0], NFKC: [0xC445], NFKD: [0x110A, 0x116C, 0x11C0] }, +{ source: [0xC446], NFC: [0xC446], NFD: [0x110A, 0x116C, 0x11C1], NFKC: [0xC446], NFKD: [0x110A, 0x116C, 0x11C1] }, +{ source: [0xC447], NFC: [0xC447], NFD: [0x110A, 0x116C, 0x11C2], NFKC: [0xC447], NFKD: [0x110A, 0x116C, 0x11C2] }, +{ source: [0xC448], NFC: [0xC448], NFD: [0x110A, 0x116D], NFKC: [0xC448], NFKD: [0x110A, 0x116D] }, +{ source: [0xC449], NFC: [0xC449], NFD: [0x110A, 0x116D, 0x11A8], NFKC: [0xC449], NFKD: [0x110A, 0x116D, 0x11A8] }, +{ source: [0xC44A], NFC: [0xC44A], NFD: [0x110A, 0x116D, 0x11A9], NFKC: [0xC44A], NFKD: [0x110A, 0x116D, 0x11A9] }, +{ source: [0xC44B], NFC: [0xC44B], NFD: [0x110A, 0x116D, 0x11AA], NFKC: [0xC44B], NFKD: [0x110A, 0x116D, 0x11AA] }, +{ source: [0xC44C], NFC: [0xC44C], NFD: [0x110A, 0x116D, 0x11AB], NFKC: [0xC44C], NFKD: [0x110A, 0x116D, 0x11AB] }, +{ source: [0xC44D], NFC: [0xC44D], NFD: [0x110A, 0x116D, 0x11AC], NFKC: [0xC44D], NFKD: [0x110A, 0x116D, 0x11AC] }, +{ source: [0xC44E], NFC: [0xC44E], NFD: [0x110A, 0x116D, 0x11AD], NFKC: [0xC44E], NFKD: [0x110A, 0x116D, 0x11AD] }, +{ source: [0xC44F], NFC: [0xC44F], NFD: [0x110A, 0x116D, 0x11AE], NFKC: [0xC44F], NFKD: [0x110A, 0x116D, 0x11AE] }, +{ source: [0xC450], NFC: [0xC450], NFD: [0x110A, 0x116D, 0x11AF], NFKC: [0xC450], NFKD: [0x110A, 0x116D, 0x11AF] }, +{ source: [0xC451], NFC: [0xC451], NFD: [0x110A, 0x116D, 0x11B0], NFKC: [0xC451], NFKD: [0x110A, 0x116D, 0x11B0] }, +{ source: [0xC452], NFC: [0xC452], NFD: [0x110A, 0x116D, 0x11B1], NFKC: [0xC452], NFKD: [0x110A, 0x116D, 0x11B1] }, +{ source: [0xC453], NFC: [0xC453], NFD: [0x110A, 0x116D, 0x11B2], NFKC: [0xC453], NFKD: [0x110A, 0x116D, 0x11B2] }, +{ source: [0xC454], NFC: [0xC454], NFD: [0x110A, 0x116D, 0x11B3], NFKC: [0xC454], NFKD: [0x110A, 0x116D, 0x11B3] }, +{ source: [0xC455], NFC: [0xC455], NFD: [0x110A, 0x116D, 0x11B4], NFKC: [0xC455], NFKD: [0x110A, 0x116D, 0x11B4] }, +{ source: [0xC456], NFC: [0xC456], NFD: [0x110A, 0x116D, 0x11B5], NFKC: [0xC456], NFKD: [0x110A, 0x116D, 0x11B5] }, +{ source: [0xC457], NFC: [0xC457], NFD: [0x110A, 0x116D, 0x11B6], NFKC: [0xC457], NFKD: [0x110A, 0x116D, 0x11B6] }, +{ source: [0xC458], NFC: [0xC458], NFD: [0x110A, 0x116D, 0x11B7], NFKC: [0xC458], NFKD: [0x110A, 0x116D, 0x11B7] }, +{ source: [0xC459], NFC: [0xC459], NFD: [0x110A, 0x116D, 0x11B8], NFKC: [0xC459], NFKD: [0x110A, 0x116D, 0x11B8] }, +{ source: [0xC45A], NFC: [0xC45A], NFD: [0x110A, 0x116D, 0x11B9], NFKC: [0xC45A], NFKD: [0x110A, 0x116D, 0x11B9] }, +{ source: [0xC45B], NFC: [0xC45B], NFD: [0x110A, 0x116D, 0x11BA], NFKC: [0xC45B], NFKD: [0x110A, 0x116D, 0x11BA] }, +{ source: [0xC45C], NFC: [0xC45C], NFD: [0x110A, 0x116D, 0x11BB], NFKC: [0xC45C], NFKD: [0x110A, 0x116D, 0x11BB] }, +{ source: [0xC45D], NFC: [0xC45D], NFD: [0x110A, 0x116D, 0x11BC], NFKC: [0xC45D], NFKD: [0x110A, 0x116D, 0x11BC] }, +{ source: [0xC45E], NFC: [0xC45E], NFD: [0x110A, 0x116D, 0x11BD], NFKC: [0xC45E], NFKD: [0x110A, 0x116D, 0x11BD] }, +{ source: [0xC45F], NFC: [0xC45F], NFD: [0x110A, 0x116D, 0x11BE], NFKC: [0xC45F], NFKD: [0x110A, 0x116D, 0x11BE] }, +{ source: [0xC460], NFC: [0xC460], NFD: [0x110A, 0x116D, 0x11BF], NFKC: [0xC460], NFKD: [0x110A, 0x116D, 0x11BF] }, +{ source: [0xC461], NFC: [0xC461], NFD: [0x110A, 0x116D, 0x11C0], NFKC: [0xC461], NFKD: [0x110A, 0x116D, 0x11C0] }, +{ source: [0xC462], NFC: [0xC462], NFD: [0x110A, 0x116D, 0x11C1], NFKC: [0xC462], NFKD: [0x110A, 0x116D, 0x11C1] }, +{ source: [0xC463], NFC: [0xC463], NFD: [0x110A, 0x116D, 0x11C2], NFKC: [0xC463], NFKD: [0x110A, 0x116D, 0x11C2] }, +{ source: [0xC464], NFC: [0xC464], NFD: [0x110A, 0x116E], NFKC: [0xC464], NFKD: [0x110A, 0x116E] }, +{ source: [0xC465], NFC: [0xC465], NFD: [0x110A, 0x116E, 0x11A8], NFKC: [0xC465], NFKD: [0x110A, 0x116E, 0x11A8] }, +{ source: [0xC466], NFC: [0xC466], NFD: [0x110A, 0x116E, 0x11A9], NFKC: [0xC466], NFKD: [0x110A, 0x116E, 0x11A9] }, +{ source: [0xC467], NFC: [0xC467], NFD: [0x110A, 0x116E, 0x11AA], NFKC: [0xC467], NFKD: [0x110A, 0x116E, 0x11AA] }, +{ source: [0xC468], NFC: [0xC468], NFD: [0x110A, 0x116E, 0x11AB], NFKC: [0xC468], NFKD: [0x110A, 0x116E, 0x11AB] }, +{ source: [0xC469], NFC: [0xC469], NFD: [0x110A, 0x116E, 0x11AC], NFKC: [0xC469], NFKD: [0x110A, 0x116E, 0x11AC] }, +{ source: [0xC46A], NFC: [0xC46A], NFD: [0x110A, 0x116E, 0x11AD], NFKC: [0xC46A], NFKD: [0x110A, 0x116E, 0x11AD] }, +{ source: [0xC46B], NFC: [0xC46B], NFD: [0x110A, 0x116E, 0x11AE], NFKC: [0xC46B], NFKD: [0x110A, 0x116E, 0x11AE] }, +{ source: [0xC46C], NFC: [0xC46C], NFD: [0x110A, 0x116E, 0x11AF], NFKC: [0xC46C], NFKD: [0x110A, 0x116E, 0x11AF] }, +{ source: [0xC46D], NFC: [0xC46D], NFD: [0x110A, 0x116E, 0x11B0], NFKC: [0xC46D], NFKD: [0x110A, 0x116E, 0x11B0] }, +{ source: [0xC46E], NFC: [0xC46E], NFD: [0x110A, 0x116E, 0x11B1], NFKC: [0xC46E], NFKD: [0x110A, 0x116E, 0x11B1] }, +{ source: [0xC46F], NFC: [0xC46F], NFD: [0x110A, 0x116E, 0x11B2], NFKC: [0xC46F], NFKD: [0x110A, 0x116E, 0x11B2] }, +{ source: [0xC470], NFC: [0xC470], NFD: [0x110A, 0x116E, 0x11B3], NFKC: [0xC470], NFKD: [0x110A, 0x116E, 0x11B3] }, +{ source: [0xC471], NFC: [0xC471], NFD: [0x110A, 0x116E, 0x11B4], NFKC: [0xC471], NFKD: [0x110A, 0x116E, 0x11B4] }, +{ source: [0xC472], NFC: [0xC472], NFD: [0x110A, 0x116E, 0x11B5], NFKC: [0xC472], NFKD: [0x110A, 0x116E, 0x11B5] }, +{ source: [0xC473], NFC: [0xC473], NFD: [0x110A, 0x116E, 0x11B6], NFKC: [0xC473], NFKD: [0x110A, 0x116E, 0x11B6] }, +{ source: [0xC474], NFC: [0xC474], NFD: [0x110A, 0x116E, 0x11B7], NFKC: [0xC474], NFKD: [0x110A, 0x116E, 0x11B7] }, +{ source: [0xC475], NFC: [0xC475], NFD: [0x110A, 0x116E, 0x11B8], NFKC: [0xC475], NFKD: [0x110A, 0x116E, 0x11B8] }, +{ source: [0xC476], NFC: [0xC476], NFD: [0x110A, 0x116E, 0x11B9], NFKC: [0xC476], NFKD: [0x110A, 0x116E, 0x11B9] }, +{ source: [0xC477], NFC: [0xC477], NFD: [0x110A, 0x116E, 0x11BA], NFKC: [0xC477], NFKD: [0x110A, 0x116E, 0x11BA] }, +{ source: [0xC478], NFC: [0xC478], NFD: [0x110A, 0x116E, 0x11BB], NFKC: [0xC478], NFKD: [0x110A, 0x116E, 0x11BB] }, +{ source: [0xC479], NFC: [0xC479], NFD: [0x110A, 0x116E, 0x11BC], NFKC: [0xC479], NFKD: [0x110A, 0x116E, 0x11BC] }, +{ source: [0xC47A], NFC: [0xC47A], NFD: [0x110A, 0x116E, 0x11BD], NFKC: [0xC47A], NFKD: [0x110A, 0x116E, 0x11BD] }, +{ source: [0xC47B], NFC: [0xC47B], NFD: [0x110A, 0x116E, 0x11BE], NFKC: [0xC47B], NFKD: [0x110A, 0x116E, 0x11BE] }, +{ source: [0xC47C], NFC: [0xC47C], NFD: [0x110A, 0x116E, 0x11BF], NFKC: [0xC47C], NFKD: [0x110A, 0x116E, 0x11BF] }, +{ source: [0xC47D], NFC: [0xC47D], NFD: [0x110A, 0x116E, 0x11C0], NFKC: [0xC47D], NFKD: [0x110A, 0x116E, 0x11C0] }, +{ source: [0xC47E], NFC: [0xC47E], NFD: [0x110A, 0x116E, 0x11C1], NFKC: [0xC47E], NFKD: [0x110A, 0x116E, 0x11C1] }, +{ source: [0xC47F], NFC: [0xC47F], NFD: [0x110A, 0x116E, 0x11C2], NFKC: [0xC47F], NFKD: [0x110A, 0x116E, 0x11C2] }, +{ source: [0xC480], NFC: [0xC480], NFD: [0x110A, 0x116F], NFKC: [0xC480], NFKD: [0x110A, 0x116F] }, +{ source: [0xC481], NFC: [0xC481], NFD: [0x110A, 0x116F, 0x11A8], NFKC: [0xC481], NFKD: [0x110A, 0x116F, 0x11A8] }, +{ source: [0xC482], NFC: [0xC482], NFD: [0x110A, 0x116F, 0x11A9], NFKC: [0xC482], NFKD: [0x110A, 0x116F, 0x11A9] }, +{ source: [0xC483], NFC: [0xC483], NFD: [0x110A, 0x116F, 0x11AA], NFKC: [0xC483], NFKD: [0x110A, 0x116F, 0x11AA] }, +{ source: [0xC484], NFC: [0xC484], NFD: [0x110A, 0x116F, 0x11AB], NFKC: [0xC484], NFKD: [0x110A, 0x116F, 0x11AB] }, +{ source: [0xC485], NFC: [0xC485], NFD: [0x110A, 0x116F, 0x11AC], NFKC: [0xC485], NFKD: [0x110A, 0x116F, 0x11AC] }, +{ source: [0xC486], NFC: [0xC486], NFD: [0x110A, 0x116F, 0x11AD], NFKC: [0xC486], NFKD: [0x110A, 0x116F, 0x11AD] }, +{ source: [0xC487], NFC: [0xC487], NFD: [0x110A, 0x116F, 0x11AE], NFKC: [0xC487], NFKD: [0x110A, 0x116F, 0x11AE] }, +{ source: [0xC488], NFC: [0xC488], NFD: [0x110A, 0x116F, 0x11AF], NFKC: [0xC488], NFKD: [0x110A, 0x116F, 0x11AF] }, +{ source: [0xC489], NFC: [0xC489], NFD: [0x110A, 0x116F, 0x11B0], NFKC: [0xC489], NFKD: [0x110A, 0x116F, 0x11B0] }, +{ source: [0xC48A], NFC: [0xC48A], NFD: [0x110A, 0x116F, 0x11B1], NFKC: [0xC48A], NFKD: [0x110A, 0x116F, 0x11B1] }, +{ source: [0xC48B], NFC: [0xC48B], NFD: [0x110A, 0x116F, 0x11B2], NFKC: [0xC48B], NFKD: [0x110A, 0x116F, 0x11B2] }, +{ source: [0xC48C], NFC: [0xC48C], NFD: [0x110A, 0x116F, 0x11B3], NFKC: [0xC48C], NFKD: [0x110A, 0x116F, 0x11B3] }, +{ source: [0xC48D], NFC: [0xC48D], NFD: [0x110A, 0x116F, 0x11B4], NFKC: [0xC48D], NFKD: [0x110A, 0x116F, 0x11B4] }, +{ source: [0xC48E], NFC: [0xC48E], NFD: [0x110A, 0x116F, 0x11B5], NFKC: [0xC48E], NFKD: [0x110A, 0x116F, 0x11B5] }, +{ source: [0xC48F], NFC: [0xC48F], NFD: [0x110A, 0x116F, 0x11B6], NFKC: [0xC48F], NFKD: [0x110A, 0x116F, 0x11B6] }, +{ source: [0xC490], NFC: [0xC490], NFD: [0x110A, 0x116F, 0x11B7], NFKC: [0xC490], NFKD: [0x110A, 0x116F, 0x11B7] }, +{ source: [0xC491], NFC: [0xC491], NFD: [0x110A, 0x116F, 0x11B8], NFKC: [0xC491], NFKD: [0x110A, 0x116F, 0x11B8] }, +{ source: [0xC492], NFC: [0xC492], NFD: [0x110A, 0x116F, 0x11B9], NFKC: [0xC492], NFKD: [0x110A, 0x116F, 0x11B9] }, +{ source: [0xC493], NFC: [0xC493], NFD: [0x110A, 0x116F, 0x11BA], NFKC: [0xC493], NFKD: [0x110A, 0x116F, 0x11BA] }, +{ source: [0xC494], NFC: [0xC494], NFD: [0x110A, 0x116F, 0x11BB], NFKC: [0xC494], NFKD: [0x110A, 0x116F, 0x11BB] }, +{ source: [0xC495], NFC: [0xC495], NFD: [0x110A, 0x116F, 0x11BC], NFKC: [0xC495], NFKD: [0x110A, 0x116F, 0x11BC] }, +{ source: [0xC496], NFC: [0xC496], NFD: [0x110A, 0x116F, 0x11BD], NFKC: [0xC496], NFKD: [0x110A, 0x116F, 0x11BD] }, +{ source: [0xC497], NFC: [0xC497], NFD: [0x110A, 0x116F, 0x11BE], NFKC: [0xC497], NFKD: [0x110A, 0x116F, 0x11BE] }, +{ source: [0xC498], NFC: [0xC498], NFD: [0x110A, 0x116F, 0x11BF], NFKC: [0xC498], NFKD: [0x110A, 0x116F, 0x11BF] }, +{ source: [0xC499], NFC: [0xC499], NFD: [0x110A, 0x116F, 0x11C0], NFKC: [0xC499], NFKD: [0x110A, 0x116F, 0x11C0] }, +{ source: [0xC49A], NFC: [0xC49A], NFD: [0x110A, 0x116F, 0x11C1], NFKC: [0xC49A], NFKD: [0x110A, 0x116F, 0x11C1] }, +{ source: [0xC49B], NFC: [0xC49B], NFD: [0x110A, 0x116F, 0x11C2], NFKC: [0xC49B], NFKD: [0x110A, 0x116F, 0x11C2] }, +{ source: [0xC49C], NFC: [0xC49C], NFD: [0x110A, 0x1170], NFKC: [0xC49C], NFKD: [0x110A, 0x1170] }, +{ source: [0xC49D], NFC: [0xC49D], NFD: [0x110A, 0x1170, 0x11A8], NFKC: [0xC49D], NFKD: [0x110A, 0x1170, 0x11A8] }, +{ source: [0xC49E], NFC: [0xC49E], NFD: [0x110A, 0x1170, 0x11A9], NFKC: [0xC49E], NFKD: [0x110A, 0x1170, 0x11A9] }, +{ source: [0xC49F], NFC: [0xC49F], NFD: [0x110A, 0x1170, 0x11AA], NFKC: [0xC49F], NFKD: [0x110A, 0x1170, 0x11AA] }, +{ source: [0xC4A0], NFC: [0xC4A0], NFD: [0x110A, 0x1170, 0x11AB], NFKC: [0xC4A0], NFKD: [0x110A, 0x1170, 0x11AB] }, +{ source: [0xC4A1], NFC: [0xC4A1], NFD: [0x110A, 0x1170, 0x11AC], NFKC: [0xC4A1], NFKD: [0x110A, 0x1170, 0x11AC] }, +{ source: [0xC4A2], NFC: [0xC4A2], NFD: [0x110A, 0x1170, 0x11AD], NFKC: [0xC4A2], NFKD: [0x110A, 0x1170, 0x11AD] }, +{ source: [0xC4A3], NFC: [0xC4A3], NFD: [0x110A, 0x1170, 0x11AE], NFKC: [0xC4A3], NFKD: [0x110A, 0x1170, 0x11AE] }, +{ source: [0xC4A4], NFC: [0xC4A4], NFD: [0x110A, 0x1170, 0x11AF], NFKC: [0xC4A4], NFKD: [0x110A, 0x1170, 0x11AF] }, +{ source: [0xC4A5], NFC: [0xC4A5], NFD: [0x110A, 0x1170, 0x11B0], NFKC: [0xC4A5], NFKD: [0x110A, 0x1170, 0x11B0] }, +{ source: [0xC4A6], NFC: [0xC4A6], NFD: [0x110A, 0x1170, 0x11B1], NFKC: [0xC4A6], NFKD: [0x110A, 0x1170, 0x11B1] }, +{ source: [0xC4A7], NFC: [0xC4A7], NFD: [0x110A, 0x1170, 0x11B2], NFKC: [0xC4A7], NFKD: [0x110A, 0x1170, 0x11B2] }, +{ source: [0xC4A8], NFC: [0xC4A8], NFD: [0x110A, 0x1170, 0x11B3], NFKC: [0xC4A8], NFKD: [0x110A, 0x1170, 0x11B3] }, +{ source: [0xC4A9], NFC: [0xC4A9], NFD: [0x110A, 0x1170, 0x11B4], NFKC: [0xC4A9], NFKD: [0x110A, 0x1170, 0x11B4] }, +{ source: [0xC4AA], NFC: [0xC4AA], NFD: [0x110A, 0x1170, 0x11B5], NFKC: [0xC4AA], NFKD: [0x110A, 0x1170, 0x11B5] }, +{ source: [0xC4AB], NFC: [0xC4AB], NFD: [0x110A, 0x1170, 0x11B6], NFKC: [0xC4AB], NFKD: [0x110A, 0x1170, 0x11B6] }, +{ source: [0xC4AC], NFC: [0xC4AC], NFD: [0x110A, 0x1170, 0x11B7], NFKC: [0xC4AC], NFKD: [0x110A, 0x1170, 0x11B7] }, +{ source: [0xC4AD], NFC: [0xC4AD], NFD: [0x110A, 0x1170, 0x11B8], NFKC: [0xC4AD], NFKD: [0x110A, 0x1170, 0x11B8] }, +{ source: [0xC4AE], NFC: [0xC4AE], NFD: [0x110A, 0x1170, 0x11B9], NFKC: [0xC4AE], NFKD: [0x110A, 0x1170, 0x11B9] }, +{ source: [0xC4AF], NFC: [0xC4AF], NFD: [0x110A, 0x1170, 0x11BA], NFKC: [0xC4AF], NFKD: [0x110A, 0x1170, 0x11BA] }, +{ source: [0xC4B0], NFC: [0xC4B0], NFD: [0x110A, 0x1170, 0x11BB], NFKC: [0xC4B0], NFKD: [0x110A, 0x1170, 0x11BB] }, +{ source: [0xC4B1], NFC: [0xC4B1], NFD: [0x110A, 0x1170, 0x11BC], NFKC: [0xC4B1], NFKD: [0x110A, 0x1170, 0x11BC] }, +{ source: [0xC4B2], NFC: [0xC4B2], NFD: [0x110A, 0x1170, 0x11BD], NFKC: [0xC4B2], NFKD: [0x110A, 0x1170, 0x11BD] }, +{ source: [0xC4B3], NFC: [0xC4B3], NFD: [0x110A, 0x1170, 0x11BE], NFKC: [0xC4B3], NFKD: [0x110A, 0x1170, 0x11BE] }, +{ source: [0xC4B4], NFC: [0xC4B4], NFD: [0x110A, 0x1170, 0x11BF], NFKC: [0xC4B4], NFKD: [0x110A, 0x1170, 0x11BF] }, +{ source: [0xC4B5], NFC: [0xC4B5], NFD: [0x110A, 0x1170, 0x11C0], NFKC: [0xC4B5], NFKD: [0x110A, 0x1170, 0x11C0] }, +{ source: [0xC4B6], NFC: [0xC4B6], NFD: [0x110A, 0x1170, 0x11C1], NFKC: [0xC4B6], NFKD: [0x110A, 0x1170, 0x11C1] }, +{ source: [0xC4B7], NFC: [0xC4B7], NFD: [0x110A, 0x1170, 0x11C2], NFKC: [0xC4B7], NFKD: [0x110A, 0x1170, 0x11C2] }, +{ source: [0xC4B8], NFC: [0xC4B8], NFD: [0x110A, 0x1171], NFKC: [0xC4B8], NFKD: [0x110A, 0x1171] }, +{ source: [0xC4B9], NFC: [0xC4B9], NFD: [0x110A, 0x1171, 0x11A8], NFKC: [0xC4B9], NFKD: [0x110A, 0x1171, 0x11A8] }, +{ source: [0xC4BA], NFC: [0xC4BA], NFD: [0x110A, 0x1171, 0x11A9], NFKC: [0xC4BA], NFKD: [0x110A, 0x1171, 0x11A9] }, +{ source: [0xC4BB], NFC: [0xC4BB], NFD: [0x110A, 0x1171, 0x11AA], NFKC: [0xC4BB], NFKD: [0x110A, 0x1171, 0x11AA] }, +{ source: [0xC4BC], NFC: [0xC4BC], NFD: [0x110A, 0x1171, 0x11AB], NFKC: [0xC4BC], NFKD: [0x110A, 0x1171, 0x11AB] }, +{ source: [0xC4BD], NFC: [0xC4BD], NFD: [0x110A, 0x1171, 0x11AC], NFKC: [0xC4BD], NFKD: [0x110A, 0x1171, 0x11AC] }, +{ source: [0xC4BE], NFC: [0xC4BE], NFD: [0x110A, 0x1171, 0x11AD], NFKC: [0xC4BE], NFKD: [0x110A, 0x1171, 0x11AD] }, +{ source: [0xC4BF], NFC: [0xC4BF], NFD: [0x110A, 0x1171, 0x11AE], NFKC: [0xC4BF], NFKD: [0x110A, 0x1171, 0x11AE] }, +{ source: [0xC4C0], NFC: [0xC4C0], NFD: [0x110A, 0x1171, 0x11AF], NFKC: [0xC4C0], NFKD: [0x110A, 0x1171, 0x11AF] }, +{ source: [0xC4C1], NFC: [0xC4C1], NFD: [0x110A, 0x1171, 0x11B0], NFKC: [0xC4C1], NFKD: [0x110A, 0x1171, 0x11B0] }, +{ source: [0xC4C2], NFC: [0xC4C2], NFD: [0x110A, 0x1171, 0x11B1], NFKC: [0xC4C2], NFKD: [0x110A, 0x1171, 0x11B1] }, +{ source: [0xC4C3], NFC: [0xC4C3], NFD: [0x110A, 0x1171, 0x11B2], NFKC: [0xC4C3], NFKD: [0x110A, 0x1171, 0x11B2] }, +{ source: [0xC4C4], NFC: [0xC4C4], NFD: [0x110A, 0x1171, 0x11B3], NFKC: [0xC4C4], NFKD: [0x110A, 0x1171, 0x11B3] }, +{ source: [0xC4C5], NFC: [0xC4C5], NFD: [0x110A, 0x1171, 0x11B4], NFKC: [0xC4C5], NFKD: [0x110A, 0x1171, 0x11B4] }, +{ source: [0xC4C6], NFC: [0xC4C6], NFD: [0x110A, 0x1171, 0x11B5], NFKC: [0xC4C6], NFKD: [0x110A, 0x1171, 0x11B5] }, +{ source: [0xC4C7], NFC: [0xC4C7], NFD: [0x110A, 0x1171, 0x11B6], NFKC: [0xC4C7], NFKD: [0x110A, 0x1171, 0x11B6] }, +{ source: [0xC4C8], NFC: [0xC4C8], NFD: [0x110A, 0x1171, 0x11B7], NFKC: [0xC4C8], NFKD: [0x110A, 0x1171, 0x11B7] }, +{ source: [0xC4C9], NFC: [0xC4C9], NFD: [0x110A, 0x1171, 0x11B8], NFKC: [0xC4C9], NFKD: [0x110A, 0x1171, 0x11B8] }, +{ source: [0xC4CA], NFC: [0xC4CA], NFD: [0x110A, 0x1171, 0x11B9], NFKC: [0xC4CA], NFKD: [0x110A, 0x1171, 0x11B9] }, +{ source: [0xC4CB], NFC: [0xC4CB], NFD: [0x110A, 0x1171, 0x11BA], NFKC: [0xC4CB], NFKD: [0x110A, 0x1171, 0x11BA] }, +{ source: [0xC4CC], NFC: [0xC4CC], NFD: [0x110A, 0x1171, 0x11BB], NFKC: [0xC4CC], NFKD: [0x110A, 0x1171, 0x11BB] }, +{ source: [0xC4CD], NFC: [0xC4CD], NFD: [0x110A, 0x1171, 0x11BC], NFKC: [0xC4CD], NFKD: [0x110A, 0x1171, 0x11BC] }, +{ source: [0xC4CE], NFC: [0xC4CE], NFD: [0x110A, 0x1171, 0x11BD], NFKC: [0xC4CE], NFKD: [0x110A, 0x1171, 0x11BD] }, +{ source: [0xC4CF], NFC: [0xC4CF], NFD: [0x110A, 0x1171, 0x11BE], NFKC: [0xC4CF], NFKD: [0x110A, 0x1171, 0x11BE] }, +{ source: [0xC4D0], NFC: [0xC4D0], NFD: [0x110A, 0x1171, 0x11BF], NFKC: [0xC4D0], NFKD: [0x110A, 0x1171, 0x11BF] }, +{ source: [0xC4D1], NFC: [0xC4D1], NFD: [0x110A, 0x1171, 0x11C0], NFKC: [0xC4D1], NFKD: [0x110A, 0x1171, 0x11C0] }, +{ source: [0xC4D2], NFC: [0xC4D2], NFD: [0x110A, 0x1171, 0x11C1], NFKC: [0xC4D2], NFKD: [0x110A, 0x1171, 0x11C1] }, +{ source: [0xC4D3], NFC: [0xC4D3], NFD: [0x110A, 0x1171, 0x11C2], NFKC: [0xC4D3], NFKD: [0x110A, 0x1171, 0x11C2] }, +{ source: [0xC4D4], NFC: [0xC4D4], NFD: [0x110A, 0x1172], NFKC: [0xC4D4], NFKD: [0x110A, 0x1172] }, +{ source: [0xC4D5], NFC: [0xC4D5], NFD: [0x110A, 0x1172, 0x11A8], NFKC: [0xC4D5], NFKD: [0x110A, 0x1172, 0x11A8] }, +{ source: [0xC4D6], NFC: [0xC4D6], NFD: [0x110A, 0x1172, 0x11A9], NFKC: [0xC4D6], NFKD: [0x110A, 0x1172, 0x11A9] }, +{ source: [0xC4D7], NFC: [0xC4D7], NFD: [0x110A, 0x1172, 0x11AA], NFKC: [0xC4D7], NFKD: [0x110A, 0x1172, 0x11AA] }, +{ source: [0xC4D8], NFC: [0xC4D8], NFD: [0x110A, 0x1172, 0x11AB], NFKC: [0xC4D8], NFKD: [0x110A, 0x1172, 0x11AB] }, +{ source: [0xC4D9], NFC: [0xC4D9], NFD: [0x110A, 0x1172, 0x11AC], NFKC: [0xC4D9], NFKD: [0x110A, 0x1172, 0x11AC] }, +{ source: [0xC4DA], NFC: [0xC4DA], NFD: [0x110A, 0x1172, 0x11AD], NFKC: [0xC4DA], NFKD: [0x110A, 0x1172, 0x11AD] }, +{ source: [0xC4DB], NFC: [0xC4DB], NFD: [0x110A, 0x1172, 0x11AE], NFKC: [0xC4DB], NFKD: [0x110A, 0x1172, 0x11AE] }, +{ source: [0xC4DC], NFC: [0xC4DC], NFD: [0x110A, 0x1172, 0x11AF], NFKC: [0xC4DC], NFKD: [0x110A, 0x1172, 0x11AF] }, +{ source: [0xC4DD], NFC: [0xC4DD], NFD: [0x110A, 0x1172, 0x11B0], NFKC: [0xC4DD], NFKD: [0x110A, 0x1172, 0x11B0] }, +{ source: [0xC4DE], NFC: [0xC4DE], NFD: [0x110A, 0x1172, 0x11B1], NFKC: [0xC4DE], NFKD: [0x110A, 0x1172, 0x11B1] }, +{ source: [0xC4DF], NFC: [0xC4DF], NFD: [0x110A, 0x1172, 0x11B2], NFKC: [0xC4DF], NFKD: [0x110A, 0x1172, 0x11B2] }, +{ source: [0xC4E0], NFC: [0xC4E0], NFD: [0x110A, 0x1172, 0x11B3], NFKC: [0xC4E0], NFKD: [0x110A, 0x1172, 0x11B3] }, +{ source: [0xC4E1], NFC: [0xC4E1], NFD: [0x110A, 0x1172, 0x11B4], NFKC: [0xC4E1], NFKD: [0x110A, 0x1172, 0x11B4] }, +{ source: [0xC4E2], NFC: [0xC4E2], NFD: [0x110A, 0x1172, 0x11B5], NFKC: [0xC4E2], NFKD: [0x110A, 0x1172, 0x11B5] }, +{ source: [0xC4E3], NFC: [0xC4E3], NFD: [0x110A, 0x1172, 0x11B6], NFKC: [0xC4E3], NFKD: [0x110A, 0x1172, 0x11B6] }, +{ source: [0xC4E4], NFC: [0xC4E4], NFD: [0x110A, 0x1172, 0x11B7], NFKC: [0xC4E4], NFKD: [0x110A, 0x1172, 0x11B7] }, +{ source: [0xC4E5], NFC: [0xC4E5], NFD: [0x110A, 0x1172, 0x11B8], NFKC: [0xC4E5], NFKD: [0x110A, 0x1172, 0x11B8] }, +{ source: [0xC4E6], NFC: [0xC4E6], NFD: [0x110A, 0x1172, 0x11B9], NFKC: [0xC4E6], NFKD: [0x110A, 0x1172, 0x11B9] }, +{ source: [0xC4E7], NFC: [0xC4E7], NFD: [0x110A, 0x1172, 0x11BA], NFKC: [0xC4E7], NFKD: [0x110A, 0x1172, 0x11BA] }, +{ source: [0xC4E8], NFC: [0xC4E8], NFD: [0x110A, 0x1172, 0x11BB], NFKC: [0xC4E8], NFKD: [0x110A, 0x1172, 0x11BB] }, +{ source: [0xC4E9], NFC: [0xC4E9], NFD: [0x110A, 0x1172, 0x11BC], NFKC: [0xC4E9], NFKD: [0x110A, 0x1172, 0x11BC] }, +{ source: [0xC4EA], NFC: [0xC4EA], NFD: [0x110A, 0x1172, 0x11BD], NFKC: [0xC4EA], NFKD: [0x110A, 0x1172, 0x11BD] }, +{ source: [0xC4EB], NFC: [0xC4EB], NFD: [0x110A, 0x1172, 0x11BE], NFKC: [0xC4EB], NFKD: [0x110A, 0x1172, 0x11BE] }, +{ source: [0xC4EC], NFC: [0xC4EC], NFD: [0x110A, 0x1172, 0x11BF], NFKC: [0xC4EC], NFKD: [0x110A, 0x1172, 0x11BF] }, +{ source: [0xC4ED], NFC: [0xC4ED], NFD: [0x110A, 0x1172, 0x11C0], NFKC: [0xC4ED], NFKD: [0x110A, 0x1172, 0x11C0] }, +{ source: [0xC4EE], NFC: [0xC4EE], NFD: [0x110A, 0x1172, 0x11C1], NFKC: [0xC4EE], NFKD: [0x110A, 0x1172, 0x11C1] }, +{ source: [0xC4EF], NFC: [0xC4EF], NFD: [0x110A, 0x1172, 0x11C2], NFKC: [0xC4EF], NFKD: [0x110A, 0x1172, 0x11C2] }, +{ source: [0xC4F0], NFC: [0xC4F0], NFD: [0x110A, 0x1173], NFKC: [0xC4F0], NFKD: [0x110A, 0x1173] }, +{ source: [0xC4F1], NFC: [0xC4F1], NFD: [0x110A, 0x1173, 0x11A8], NFKC: [0xC4F1], NFKD: [0x110A, 0x1173, 0x11A8] }, +{ source: [0xC4F2], NFC: [0xC4F2], NFD: [0x110A, 0x1173, 0x11A9], NFKC: [0xC4F2], NFKD: [0x110A, 0x1173, 0x11A9] }, +{ source: [0xC4F3], NFC: [0xC4F3], NFD: [0x110A, 0x1173, 0x11AA], NFKC: [0xC4F3], NFKD: [0x110A, 0x1173, 0x11AA] }, +{ source: [0xC4F4], NFC: [0xC4F4], NFD: [0x110A, 0x1173, 0x11AB], NFKC: [0xC4F4], NFKD: [0x110A, 0x1173, 0x11AB] }, +{ source: [0xC4F5], NFC: [0xC4F5], NFD: [0x110A, 0x1173, 0x11AC], NFKC: [0xC4F5], NFKD: [0x110A, 0x1173, 0x11AC] }, +{ source: [0xC4F6], NFC: [0xC4F6], NFD: [0x110A, 0x1173, 0x11AD], NFKC: [0xC4F6], NFKD: [0x110A, 0x1173, 0x11AD] }, +{ source: [0xC4F7], NFC: [0xC4F7], NFD: [0x110A, 0x1173, 0x11AE], NFKC: [0xC4F7], NFKD: [0x110A, 0x1173, 0x11AE] }, +{ source: [0xC4F8], NFC: [0xC4F8], NFD: [0x110A, 0x1173, 0x11AF], NFKC: [0xC4F8], NFKD: [0x110A, 0x1173, 0x11AF] }, +{ source: [0xC4F9], NFC: [0xC4F9], NFD: [0x110A, 0x1173, 0x11B0], NFKC: [0xC4F9], NFKD: [0x110A, 0x1173, 0x11B0] }, +{ source: [0xC4FA], NFC: [0xC4FA], NFD: [0x110A, 0x1173, 0x11B1], NFKC: [0xC4FA], NFKD: [0x110A, 0x1173, 0x11B1] }, +{ source: [0xC4FB], NFC: [0xC4FB], NFD: [0x110A, 0x1173, 0x11B2], NFKC: [0xC4FB], NFKD: [0x110A, 0x1173, 0x11B2] }, +{ source: [0xC4FC], NFC: [0xC4FC], NFD: [0x110A, 0x1173, 0x11B3], NFKC: [0xC4FC], NFKD: [0x110A, 0x1173, 0x11B3] }, +{ source: [0xC4FD], NFC: [0xC4FD], NFD: [0x110A, 0x1173, 0x11B4], NFKC: [0xC4FD], NFKD: [0x110A, 0x1173, 0x11B4] }, +{ source: [0xC4FE], NFC: [0xC4FE], NFD: [0x110A, 0x1173, 0x11B5], NFKC: [0xC4FE], NFKD: [0x110A, 0x1173, 0x11B5] }, +{ source: [0xC4FF], NFC: [0xC4FF], NFD: [0x110A, 0x1173, 0x11B6], NFKC: [0xC4FF], NFKD: [0x110A, 0x1173, 0x11B6] }, +{ source: [0xC500], NFC: [0xC500], NFD: [0x110A, 0x1173, 0x11B7], NFKC: [0xC500], NFKD: [0x110A, 0x1173, 0x11B7] }, +{ source: [0xC501], NFC: [0xC501], NFD: [0x110A, 0x1173, 0x11B8], NFKC: [0xC501], NFKD: [0x110A, 0x1173, 0x11B8] }, +{ source: [0xC502], NFC: [0xC502], NFD: [0x110A, 0x1173, 0x11B9], NFKC: [0xC502], NFKD: [0x110A, 0x1173, 0x11B9] }, +{ source: [0xC503], NFC: [0xC503], NFD: [0x110A, 0x1173, 0x11BA], NFKC: [0xC503], NFKD: [0x110A, 0x1173, 0x11BA] }, +{ source: [0xC504], NFC: [0xC504], NFD: [0x110A, 0x1173, 0x11BB], NFKC: [0xC504], NFKD: [0x110A, 0x1173, 0x11BB] }, +{ source: [0xC505], NFC: [0xC505], NFD: [0x110A, 0x1173, 0x11BC], NFKC: [0xC505], NFKD: [0x110A, 0x1173, 0x11BC] }, +{ source: [0xC506], NFC: [0xC506], NFD: [0x110A, 0x1173, 0x11BD], NFKC: [0xC506], NFKD: [0x110A, 0x1173, 0x11BD] }, +{ source: [0xC507], NFC: [0xC507], NFD: [0x110A, 0x1173, 0x11BE], NFKC: [0xC507], NFKD: [0x110A, 0x1173, 0x11BE] }, +{ source: [0xC508], NFC: [0xC508], NFD: [0x110A, 0x1173, 0x11BF], NFKC: [0xC508], NFKD: [0x110A, 0x1173, 0x11BF] }, +{ source: [0xC509], NFC: [0xC509], NFD: [0x110A, 0x1173, 0x11C0], NFKC: [0xC509], NFKD: [0x110A, 0x1173, 0x11C0] }, +{ source: [0xC50A], NFC: [0xC50A], NFD: [0x110A, 0x1173, 0x11C1], NFKC: [0xC50A], NFKD: [0x110A, 0x1173, 0x11C1] }, +{ source: [0xC50B], NFC: [0xC50B], NFD: [0x110A, 0x1173, 0x11C2], NFKC: [0xC50B], NFKD: [0x110A, 0x1173, 0x11C2] }, +{ source: [0xC50C], NFC: [0xC50C], NFD: [0x110A, 0x1174], NFKC: [0xC50C], NFKD: [0x110A, 0x1174] }, +{ source: [0xC50D], NFC: [0xC50D], NFD: [0x110A, 0x1174, 0x11A8], NFKC: [0xC50D], NFKD: [0x110A, 0x1174, 0x11A8] }, +{ source: [0xC50E], NFC: [0xC50E], NFD: [0x110A, 0x1174, 0x11A9], NFKC: [0xC50E], NFKD: [0x110A, 0x1174, 0x11A9] }, +{ source: [0xC50F], NFC: [0xC50F], NFD: [0x110A, 0x1174, 0x11AA], NFKC: [0xC50F], NFKD: [0x110A, 0x1174, 0x11AA] }, +{ source: [0xC510], NFC: [0xC510], NFD: [0x110A, 0x1174, 0x11AB], NFKC: [0xC510], NFKD: [0x110A, 0x1174, 0x11AB] }, +{ source: [0xC511], NFC: [0xC511], NFD: [0x110A, 0x1174, 0x11AC], NFKC: [0xC511], NFKD: [0x110A, 0x1174, 0x11AC] }, +{ source: [0xC512], NFC: [0xC512], NFD: [0x110A, 0x1174, 0x11AD], NFKC: [0xC512], NFKD: [0x110A, 0x1174, 0x11AD] }, +{ source: [0xC513], NFC: [0xC513], NFD: [0x110A, 0x1174, 0x11AE], NFKC: [0xC513], NFKD: [0x110A, 0x1174, 0x11AE] }, +{ source: [0xC514], NFC: [0xC514], NFD: [0x110A, 0x1174, 0x11AF], NFKC: [0xC514], NFKD: [0x110A, 0x1174, 0x11AF] }, +{ source: [0xC515], NFC: [0xC515], NFD: [0x110A, 0x1174, 0x11B0], NFKC: [0xC515], NFKD: [0x110A, 0x1174, 0x11B0] }, +{ source: [0xC516], NFC: [0xC516], NFD: [0x110A, 0x1174, 0x11B1], NFKC: [0xC516], NFKD: [0x110A, 0x1174, 0x11B1] }, +{ source: [0xC517], NFC: [0xC517], NFD: [0x110A, 0x1174, 0x11B2], NFKC: [0xC517], NFKD: [0x110A, 0x1174, 0x11B2] }, +{ source: [0xC518], NFC: [0xC518], NFD: [0x110A, 0x1174, 0x11B3], NFKC: [0xC518], NFKD: [0x110A, 0x1174, 0x11B3] }, +{ source: [0xC519], NFC: [0xC519], NFD: [0x110A, 0x1174, 0x11B4], NFKC: [0xC519], NFKD: [0x110A, 0x1174, 0x11B4] }, +{ source: [0xC51A], NFC: [0xC51A], NFD: [0x110A, 0x1174, 0x11B5], NFKC: [0xC51A], NFKD: [0x110A, 0x1174, 0x11B5] }, +{ source: [0xC51B], NFC: [0xC51B], NFD: [0x110A, 0x1174, 0x11B6], NFKC: [0xC51B], NFKD: [0x110A, 0x1174, 0x11B6] }, +{ source: [0xC51C], NFC: [0xC51C], NFD: [0x110A, 0x1174, 0x11B7], NFKC: [0xC51C], NFKD: [0x110A, 0x1174, 0x11B7] }, +{ source: [0xC51D], NFC: [0xC51D], NFD: [0x110A, 0x1174, 0x11B8], NFKC: [0xC51D], NFKD: [0x110A, 0x1174, 0x11B8] }, +{ source: [0xC51E], NFC: [0xC51E], NFD: [0x110A, 0x1174, 0x11B9], NFKC: [0xC51E], NFKD: [0x110A, 0x1174, 0x11B9] }, +{ source: [0xC51F], NFC: [0xC51F], NFD: [0x110A, 0x1174, 0x11BA], NFKC: [0xC51F], NFKD: [0x110A, 0x1174, 0x11BA] }, +{ source: [0xC520], NFC: [0xC520], NFD: [0x110A, 0x1174, 0x11BB], NFKC: [0xC520], NFKD: [0x110A, 0x1174, 0x11BB] }, +{ source: [0xC521], NFC: [0xC521], NFD: [0x110A, 0x1174, 0x11BC], NFKC: [0xC521], NFKD: [0x110A, 0x1174, 0x11BC] }, +{ source: [0xC522], NFC: [0xC522], NFD: [0x110A, 0x1174, 0x11BD], NFKC: [0xC522], NFKD: [0x110A, 0x1174, 0x11BD] }, +{ source: [0xC523], NFC: [0xC523], NFD: [0x110A, 0x1174, 0x11BE], NFKC: [0xC523], NFKD: [0x110A, 0x1174, 0x11BE] }, +{ source: [0xC524], NFC: [0xC524], NFD: [0x110A, 0x1174, 0x11BF], NFKC: [0xC524], NFKD: [0x110A, 0x1174, 0x11BF] }, +{ source: [0xC525], NFC: [0xC525], NFD: [0x110A, 0x1174, 0x11C0], NFKC: [0xC525], NFKD: [0x110A, 0x1174, 0x11C0] }, +{ source: [0xC526], NFC: [0xC526], NFD: [0x110A, 0x1174, 0x11C1], NFKC: [0xC526], NFKD: [0x110A, 0x1174, 0x11C1] }, +{ source: [0xC527], NFC: [0xC527], NFD: [0x110A, 0x1174, 0x11C2], NFKC: [0xC527], NFKD: [0x110A, 0x1174, 0x11C2] }, +{ source: [0xC528], NFC: [0xC528], NFD: [0x110A, 0x1175], NFKC: [0xC528], NFKD: [0x110A, 0x1175] }, +{ source: [0xC529], NFC: [0xC529], NFD: [0x110A, 0x1175, 0x11A8], NFKC: [0xC529], NFKD: [0x110A, 0x1175, 0x11A8] }, +{ source: [0xC52A], NFC: [0xC52A], NFD: [0x110A, 0x1175, 0x11A9], NFKC: [0xC52A], NFKD: [0x110A, 0x1175, 0x11A9] }, +{ source: [0xC52B], NFC: [0xC52B], NFD: [0x110A, 0x1175, 0x11AA], NFKC: [0xC52B], NFKD: [0x110A, 0x1175, 0x11AA] }, +{ source: [0xC52C], NFC: [0xC52C], NFD: [0x110A, 0x1175, 0x11AB], NFKC: [0xC52C], NFKD: [0x110A, 0x1175, 0x11AB] }, +{ source: [0xC52D], NFC: [0xC52D], NFD: [0x110A, 0x1175, 0x11AC], NFKC: [0xC52D], NFKD: [0x110A, 0x1175, 0x11AC] }, +{ source: [0xC52E], NFC: [0xC52E], NFD: [0x110A, 0x1175, 0x11AD], NFKC: [0xC52E], NFKD: [0x110A, 0x1175, 0x11AD] }, +{ source: [0xC52F], NFC: [0xC52F], NFD: [0x110A, 0x1175, 0x11AE], NFKC: [0xC52F], NFKD: [0x110A, 0x1175, 0x11AE] }, +{ source: [0xC530], NFC: [0xC530], NFD: [0x110A, 0x1175, 0x11AF], NFKC: [0xC530], NFKD: [0x110A, 0x1175, 0x11AF] }, +{ source: [0xC531], NFC: [0xC531], NFD: [0x110A, 0x1175, 0x11B0], NFKC: [0xC531], NFKD: [0x110A, 0x1175, 0x11B0] }, +{ source: [0xC532], NFC: [0xC532], NFD: [0x110A, 0x1175, 0x11B1], NFKC: [0xC532], NFKD: [0x110A, 0x1175, 0x11B1] }, +{ source: [0xC533], NFC: [0xC533], NFD: [0x110A, 0x1175, 0x11B2], NFKC: [0xC533], NFKD: [0x110A, 0x1175, 0x11B2] }, +{ source: [0xC534], NFC: [0xC534], NFD: [0x110A, 0x1175, 0x11B3], NFKC: [0xC534], NFKD: [0x110A, 0x1175, 0x11B3] }, +{ source: [0xC535], NFC: [0xC535], NFD: [0x110A, 0x1175, 0x11B4], NFKC: [0xC535], NFKD: [0x110A, 0x1175, 0x11B4] }, +{ source: [0xC536], NFC: [0xC536], NFD: [0x110A, 0x1175, 0x11B5], NFKC: [0xC536], NFKD: [0x110A, 0x1175, 0x11B5] }, +{ source: [0xC537], NFC: [0xC537], NFD: [0x110A, 0x1175, 0x11B6], NFKC: [0xC537], NFKD: [0x110A, 0x1175, 0x11B6] }, +{ source: [0xC538], NFC: [0xC538], NFD: [0x110A, 0x1175, 0x11B7], NFKC: [0xC538], NFKD: [0x110A, 0x1175, 0x11B7] }, +{ source: [0xC539], NFC: [0xC539], NFD: [0x110A, 0x1175, 0x11B8], NFKC: [0xC539], NFKD: [0x110A, 0x1175, 0x11B8] }, +{ source: [0xC53A], NFC: [0xC53A], NFD: [0x110A, 0x1175, 0x11B9], NFKC: [0xC53A], NFKD: [0x110A, 0x1175, 0x11B9] }, +{ source: [0xC53B], NFC: [0xC53B], NFD: [0x110A, 0x1175, 0x11BA], NFKC: [0xC53B], NFKD: [0x110A, 0x1175, 0x11BA] }, +{ source: [0xC53C], NFC: [0xC53C], NFD: [0x110A, 0x1175, 0x11BB], NFKC: [0xC53C], NFKD: [0x110A, 0x1175, 0x11BB] }, +{ source: [0xC53D], NFC: [0xC53D], NFD: [0x110A, 0x1175, 0x11BC], NFKC: [0xC53D], NFKD: [0x110A, 0x1175, 0x11BC] }, +{ source: [0xC53E], NFC: [0xC53E], NFD: [0x110A, 0x1175, 0x11BD], NFKC: [0xC53E], NFKD: [0x110A, 0x1175, 0x11BD] }, +{ source: [0xC53F], NFC: [0xC53F], NFD: [0x110A, 0x1175, 0x11BE], NFKC: [0xC53F], NFKD: [0x110A, 0x1175, 0x11BE] }, +{ source: [0xC540], NFC: [0xC540], NFD: [0x110A, 0x1175, 0x11BF], NFKC: [0xC540], NFKD: [0x110A, 0x1175, 0x11BF] }, +{ source: [0xC541], NFC: [0xC541], NFD: [0x110A, 0x1175, 0x11C0], NFKC: [0xC541], NFKD: [0x110A, 0x1175, 0x11C0] }, +{ source: [0xC542], NFC: [0xC542], NFD: [0x110A, 0x1175, 0x11C1], NFKC: [0xC542], NFKD: [0x110A, 0x1175, 0x11C1] }, +{ source: [0xC543], NFC: [0xC543], NFD: [0x110A, 0x1175, 0x11C2], NFKC: [0xC543], NFKD: [0x110A, 0x1175, 0x11C2] }, +{ source: [0xC544], NFC: [0xC544], NFD: [0x110B, 0x1161], NFKC: [0xC544], NFKD: [0x110B, 0x1161] }, +{ source: [0xC545], NFC: [0xC545], NFD: [0x110B, 0x1161, 0x11A8], NFKC: [0xC545], NFKD: [0x110B, 0x1161, 0x11A8] }, +{ source: [0xC546], NFC: [0xC546], NFD: [0x110B, 0x1161, 0x11A9], NFKC: [0xC546], NFKD: [0x110B, 0x1161, 0x11A9] }, +{ source: [0xC547], NFC: [0xC547], NFD: [0x110B, 0x1161, 0x11AA], NFKC: [0xC547], NFKD: [0x110B, 0x1161, 0x11AA] }, +{ source: [0xC548], NFC: [0xC548], NFD: [0x110B, 0x1161, 0x11AB], NFKC: [0xC548], NFKD: [0x110B, 0x1161, 0x11AB] }, +{ source: [0xC549], NFC: [0xC549], NFD: [0x110B, 0x1161, 0x11AC], NFKC: [0xC549], NFKD: [0x110B, 0x1161, 0x11AC] }, +{ source: [0xC54A], NFC: [0xC54A], NFD: [0x110B, 0x1161, 0x11AD], NFKC: [0xC54A], NFKD: [0x110B, 0x1161, 0x11AD] }, +{ source: [0xC54B], NFC: [0xC54B], NFD: [0x110B, 0x1161, 0x11AE], NFKC: [0xC54B], NFKD: [0x110B, 0x1161, 0x11AE] }, +{ source: [0xC54C], NFC: [0xC54C], NFD: [0x110B, 0x1161, 0x11AF], NFKC: [0xC54C], NFKD: [0x110B, 0x1161, 0x11AF] }, +{ source: [0xC54D], NFC: [0xC54D], NFD: [0x110B, 0x1161, 0x11B0], NFKC: [0xC54D], NFKD: [0x110B, 0x1161, 0x11B0] }, +{ source: [0xC54E], NFC: [0xC54E], NFD: [0x110B, 0x1161, 0x11B1], NFKC: [0xC54E], NFKD: [0x110B, 0x1161, 0x11B1] }, +{ source: [0xC54F], NFC: [0xC54F], NFD: [0x110B, 0x1161, 0x11B2], NFKC: [0xC54F], NFKD: [0x110B, 0x1161, 0x11B2] }, +{ source: [0xC550], NFC: [0xC550], NFD: [0x110B, 0x1161, 0x11B3], NFKC: [0xC550], NFKD: [0x110B, 0x1161, 0x11B3] }, +{ source: [0xC551], NFC: [0xC551], NFD: [0x110B, 0x1161, 0x11B4], NFKC: [0xC551], NFKD: [0x110B, 0x1161, 0x11B4] }, +{ source: [0xC552], NFC: [0xC552], NFD: [0x110B, 0x1161, 0x11B5], NFKC: [0xC552], NFKD: [0x110B, 0x1161, 0x11B5] }, +{ source: [0xC553], NFC: [0xC553], NFD: [0x110B, 0x1161, 0x11B6], NFKC: [0xC553], NFKD: [0x110B, 0x1161, 0x11B6] }, +{ source: [0xC554], NFC: [0xC554], NFD: [0x110B, 0x1161, 0x11B7], NFKC: [0xC554], NFKD: [0x110B, 0x1161, 0x11B7] }, +{ source: [0xC555], NFC: [0xC555], NFD: [0x110B, 0x1161, 0x11B8], NFKC: [0xC555], NFKD: [0x110B, 0x1161, 0x11B8] }, +{ source: [0xC556], NFC: [0xC556], NFD: [0x110B, 0x1161, 0x11B9], NFKC: [0xC556], NFKD: [0x110B, 0x1161, 0x11B9] }, +{ source: [0xC557], NFC: [0xC557], NFD: [0x110B, 0x1161, 0x11BA], NFKC: [0xC557], NFKD: [0x110B, 0x1161, 0x11BA] }, +{ source: [0xC558], NFC: [0xC558], NFD: [0x110B, 0x1161, 0x11BB], NFKC: [0xC558], NFKD: [0x110B, 0x1161, 0x11BB] }, +{ source: [0xC559], NFC: [0xC559], NFD: [0x110B, 0x1161, 0x11BC], NFKC: [0xC559], NFKD: [0x110B, 0x1161, 0x11BC] }, +{ source: [0xC55A], NFC: [0xC55A], NFD: [0x110B, 0x1161, 0x11BD], NFKC: [0xC55A], NFKD: [0x110B, 0x1161, 0x11BD] }, +{ source: [0xC55B], NFC: [0xC55B], NFD: [0x110B, 0x1161, 0x11BE], NFKC: [0xC55B], NFKD: [0x110B, 0x1161, 0x11BE] }, +{ source: [0xC55C], NFC: [0xC55C], NFD: [0x110B, 0x1161, 0x11BF], NFKC: [0xC55C], NFKD: [0x110B, 0x1161, 0x11BF] }, +{ source: [0xC55D], NFC: [0xC55D], NFD: [0x110B, 0x1161, 0x11C0], NFKC: [0xC55D], NFKD: [0x110B, 0x1161, 0x11C0] }, +{ source: [0xC55E], NFC: [0xC55E], NFD: [0x110B, 0x1161, 0x11C1], NFKC: [0xC55E], NFKD: [0x110B, 0x1161, 0x11C1] }, +{ source: [0xC55F], NFC: [0xC55F], NFD: [0x110B, 0x1161, 0x11C2], NFKC: [0xC55F], NFKD: [0x110B, 0x1161, 0x11C2] }, +{ source: [0xC560], NFC: [0xC560], NFD: [0x110B, 0x1162], NFKC: [0xC560], NFKD: [0x110B, 0x1162] }, +{ source: [0xC561], NFC: [0xC561], NFD: [0x110B, 0x1162, 0x11A8], NFKC: [0xC561], NFKD: [0x110B, 0x1162, 0x11A8] }, +{ source: [0xC562], NFC: [0xC562], NFD: [0x110B, 0x1162, 0x11A9], NFKC: [0xC562], NFKD: [0x110B, 0x1162, 0x11A9] }, +{ source: [0xC563], NFC: [0xC563], NFD: [0x110B, 0x1162, 0x11AA], NFKC: [0xC563], NFKD: [0x110B, 0x1162, 0x11AA] }, +{ source: [0xC564], NFC: [0xC564], NFD: [0x110B, 0x1162, 0x11AB], NFKC: [0xC564], NFKD: [0x110B, 0x1162, 0x11AB] }, +{ source: [0xC565], NFC: [0xC565], NFD: [0x110B, 0x1162, 0x11AC], NFKC: [0xC565], NFKD: [0x110B, 0x1162, 0x11AC] }, +{ source: [0xC566], NFC: [0xC566], NFD: [0x110B, 0x1162, 0x11AD], NFKC: [0xC566], NFKD: [0x110B, 0x1162, 0x11AD] }, +{ source: [0xC567], NFC: [0xC567], NFD: [0x110B, 0x1162, 0x11AE], NFKC: [0xC567], NFKD: [0x110B, 0x1162, 0x11AE] }, +{ source: [0xC568], NFC: [0xC568], NFD: [0x110B, 0x1162, 0x11AF], NFKC: [0xC568], NFKD: [0x110B, 0x1162, 0x11AF] }, +{ source: [0xC569], NFC: [0xC569], NFD: [0x110B, 0x1162, 0x11B0], NFKC: [0xC569], NFKD: [0x110B, 0x1162, 0x11B0] }, +{ source: [0xC56A], NFC: [0xC56A], NFD: [0x110B, 0x1162, 0x11B1], NFKC: [0xC56A], NFKD: [0x110B, 0x1162, 0x11B1] }, +{ source: [0xC56B], NFC: [0xC56B], NFD: [0x110B, 0x1162, 0x11B2], NFKC: [0xC56B], NFKD: [0x110B, 0x1162, 0x11B2] }, +{ source: [0xC56C], NFC: [0xC56C], NFD: [0x110B, 0x1162, 0x11B3], NFKC: [0xC56C], NFKD: [0x110B, 0x1162, 0x11B3] }, +{ source: [0xC56D], NFC: [0xC56D], NFD: [0x110B, 0x1162, 0x11B4], NFKC: [0xC56D], NFKD: [0x110B, 0x1162, 0x11B4] }, +{ source: [0xC56E], NFC: [0xC56E], NFD: [0x110B, 0x1162, 0x11B5], NFKC: [0xC56E], NFKD: [0x110B, 0x1162, 0x11B5] }, +{ source: [0xC56F], NFC: [0xC56F], NFD: [0x110B, 0x1162, 0x11B6], NFKC: [0xC56F], NFKD: [0x110B, 0x1162, 0x11B6] }, +{ source: [0xC570], NFC: [0xC570], NFD: [0x110B, 0x1162, 0x11B7], NFKC: [0xC570], NFKD: [0x110B, 0x1162, 0x11B7] }, +{ source: [0xC571], NFC: [0xC571], NFD: [0x110B, 0x1162, 0x11B8], NFKC: [0xC571], NFKD: [0x110B, 0x1162, 0x11B8] }, +{ source: [0xC572], NFC: [0xC572], NFD: [0x110B, 0x1162, 0x11B9], NFKC: [0xC572], NFKD: [0x110B, 0x1162, 0x11B9] }, +{ source: [0xC573], NFC: [0xC573], NFD: [0x110B, 0x1162, 0x11BA], NFKC: [0xC573], NFKD: [0x110B, 0x1162, 0x11BA] }, +{ source: [0xC574], NFC: [0xC574], NFD: [0x110B, 0x1162, 0x11BB], NFKC: [0xC574], NFKD: [0x110B, 0x1162, 0x11BB] }, +{ source: [0xC575], NFC: [0xC575], NFD: [0x110B, 0x1162, 0x11BC], NFKC: [0xC575], NFKD: [0x110B, 0x1162, 0x11BC] }, +{ source: [0xC576], NFC: [0xC576], NFD: [0x110B, 0x1162, 0x11BD], NFKC: [0xC576], NFKD: [0x110B, 0x1162, 0x11BD] }, +{ source: [0xC577], NFC: [0xC577], NFD: [0x110B, 0x1162, 0x11BE], NFKC: [0xC577], NFKD: [0x110B, 0x1162, 0x11BE] }, +{ source: [0xC578], NFC: [0xC578], NFD: [0x110B, 0x1162, 0x11BF], NFKC: [0xC578], NFKD: [0x110B, 0x1162, 0x11BF] }, +{ source: [0xC579], NFC: [0xC579], NFD: [0x110B, 0x1162, 0x11C0], NFKC: [0xC579], NFKD: [0x110B, 0x1162, 0x11C0] }, +{ source: [0xC57A], NFC: [0xC57A], NFD: [0x110B, 0x1162, 0x11C1], NFKC: [0xC57A], NFKD: [0x110B, 0x1162, 0x11C1] }, +{ source: [0xC57B], NFC: [0xC57B], NFD: [0x110B, 0x1162, 0x11C2], NFKC: [0xC57B], NFKD: [0x110B, 0x1162, 0x11C2] }, +{ source: [0xC57C], NFC: [0xC57C], NFD: [0x110B, 0x1163], NFKC: [0xC57C], NFKD: [0x110B, 0x1163] }, +{ source: [0xC57D], NFC: [0xC57D], NFD: [0x110B, 0x1163, 0x11A8], NFKC: [0xC57D], NFKD: [0x110B, 0x1163, 0x11A8] }, +{ source: [0xC57E], NFC: [0xC57E], NFD: [0x110B, 0x1163, 0x11A9], NFKC: [0xC57E], NFKD: [0x110B, 0x1163, 0x11A9] }, +{ source: [0xC57F], NFC: [0xC57F], NFD: [0x110B, 0x1163, 0x11AA], NFKC: [0xC57F], NFKD: [0x110B, 0x1163, 0x11AA] }, +{ source: [0xC580], NFC: [0xC580], NFD: [0x110B, 0x1163, 0x11AB], NFKC: [0xC580], NFKD: [0x110B, 0x1163, 0x11AB] }, +{ source: [0xC581], NFC: [0xC581], NFD: [0x110B, 0x1163, 0x11AC], NFKC: [0xC581], NFKD: [0x110B, 0x1163, 0x11AC] }, +{ source: [0xC582], NFC: [0xC582], NFD: [0x110B, 0x1163, 0x11AD], NFKC: [0xC582], NFKD: [0x110B, 0x1163, 0x11AD] }, +{ source: [0xC583], NFC: [0xC583], NFD: [0x110B, 0x1163, 0x11AE], NFKC: [0xC583], NFKD: [0x110B, 0x1163, 0x11AE] }, +{ source: [0xC584], NFC: [0xC584], NFD: [0x110B, 0x1163, 0x11AF], NFKC: [0xC584], NFKD: [0x110B, 0x1163, 0x11AF] }, +{ source: [0xC585], NFC: [0xC585], NFD: [0x110B, 0x1163, 0x11B0], NFKC: [0xC585], NFKD: [0x110B, 0x1163, 0x11B0] }, +{ source: [0xC586], NFC: [0xC586], NFD: [0x110B, 0x1163, 0x11B1], NFKC: [0xC586], NFKD: [0x110B, 0x1163, 0x11B1] }, +{ source: [0xC587], NFC: [0xC587], NFD: [0x110B, 0x1163, 0x11B2], NFKC: [0xC587], NFKD: [0x110B, 0x1163, 0x11B2] }, +{ source: [0xC588], NFC: [0xC588], NFD: [0x110B, 0x1163, 0x11B3], NFKC: [0xC588], NFKD: [0x110B, 0x1163, 0x11B3] }, +{ source: [0xC589], NFC: [0xC589], NFD: [0x110B, 0x1163, 0x11B4], NFKC: [0xC589], NFKD: [0x110B, 0x1163, 0x11B4] }, +{ source: [0xC58A], NFC: [0xC58A], NFD: [0x110B, 0x1163, 0x11B5], NFKC: [0xC58A], NFKD: [0x110B, 0x1163, 0x11B5] }, +{ source: [0xC58B], NFC: [0xC58B], NFD: [0x110B, 0x1163, 0x11B6], NFKC: [0xC58B], NFKD: [0x110B, 0x1163, 0x11B6] }, +{ source: [0xC58C], NFC: [0xC58C], NFD: [0x110B, 0x1163, 0x11B7], NFKC: [0xC58C], NFKD: [0x110B, 0x1163, 0x11B7] }, +{ source: [0xC58D], NFC: [0xC58D], NFD: [0x110B, 0x1163, 0x11B8], NFKC: [0xC58D], NFKD: [0x110B, 0x1163, 0x11B8] }, +{ source: [0xC58E], NFC: [0xC58E], NFD: [0x110B, 0x1163, 0x11B9], NFKC: [0xC58E], NFKD: [0x110B, 0x1163, 0x11B9] }, +{ source: [0xC58F], NFC: [0xC58F], NFD: [0x110B, 0x1163, 0x11BA], NFKC: [0xC58F], NFKD: [0x110B, 0x1163, 0x11BA] }, +{ source: [0xC590], NFC: [0xC590], NFD: [0x110B, 0x1163, 0x11BB], NFKC: [0xC590], NFKD: [0x110B, 0x1163, 0x11BB] }, +{ source: [0xC591], NFC: [0xC591], NFD: [0x110B, 0x1163, 0x11BC], NFKC: [0xC591], NFKD: [0x110B, 0x1163, 0x11BC] }, +{ source: [0xC592], NFC: [0xC592], NFD: [0x110B, 0x1163, 0x11BD], NFKC: [0xC592], NFKD: [0x110B, 0x1163, 0x11BD] }, +{ source: [0xC593], NFC: [0xC593], NFD: [0x110B, 0x1163, 0x11BE], NFKC: [0xC593], NFKD: [0x110B, 0x1163, 0x11BE] }, +{ source: [0xC594], NFC: [0xC594], NFD: [0x110B, 0x1163, 0x11BF], NFKC: [0xC594], NFKD: [0x110B, 0x1163, 0x11BF] }, +{ source: [0xC595], NFC: [0xC595], NFD: [0x110B, 0x1163, 0x11C0], NFKC: [0xC595], NFKD: [0x110B, 0x1163, 0x11C0] }, +{ source: [0xC596], NFC: [0xC596], NFD: [0x110B, 0x1163, 0x11C1], NFKC: [0xC596], NFKD: [0x110B, 0x1163, 0x11C1] }, +{ source: [0xC597], NFC: [0xC597], NFD: [0x110B, 0x1163, 0x11C2], NFKC: [0xC597], NFKD: [0x110B, 0x1163, 0x11C2] }, +{ source: [0xC598], NFC: [0xC598], NFD: [0x110B, 0x1164], NFKC: [0xC598], NFKD: [0x110B, 0x1164] }, +{ source: [0xC599], NFC: [0xC599], NFD: [0x110B, 0x1164, 0x11A8], NFKC: [0xC599], NFKD: [0x110B, 0x1164, 0x11A8] }, +{ source: [0xC59A], NFC: [0xC59A], NFD: [0x110B, 0x1164, 0x11A9], NFKC: [0xC59A], NFKD: [0x110B, 0x1164, 0x11A9] }, +{ source: [0xC59B], NFC: [0xC59B], NFD: [0x110B, 0x1164, 0x11AA], NFKC: [0xC59B], NFKD: [0x110B, 0x1164, 0x11AA] }, +{ source: [0xC59C], NFC: [0xC59C], NFD: [0x110B, 0x1164, 0x11AB], NFKC: [0xC59C], NFKD: [0x110B, 0x1164, 0x11AB] }, +{ source: [0xC59D], NFC: [0xC59D], NFD: [0x110B, 0x1164, 0x11AC], NFKC: [0xC59D], NFKD: [0x110B, 0x1164, 0x11AC] }, +{ source: [0xC59E], NFC: [0xC59E], NFD: [0x110B, 0x1164, 0x11AD], NFKC: [0xC59E], NFKD: [0x110B, 0x1164, 0x11AD] }, +{ source: [0xC59F], NFC: [0xC59F], NFD: [0x110B, 0x1164, 0x11AE], NFKC: [0xC59F], NFKD: [0x110B, 0x1164, 0x11AE] }, +{ source: [0xC5A0], NFC: [0xC5A0], NFD: [0x110B, 0x1164, 0x11AF], NFKC: [0xC5A0], NFKD: [0x110B, 0x1164, 0x11AF] }, +{ source: [0xC5A1], NFC: [0xC5A1], NFD: [0x110B, 0x1164, 0x11B0], NFKC: [0xC5A1], NFKD: [0x110B, 0x1164, 0x11B0] }, +{ source: [0xC5A2], NFC: [0xC5A2], NFD: [0x110B, 0x1164, 0x11B1], NFKC: [0xC5A2], NFKD: [0x110B, 0x1164, 0x11B1] }, +{ source: [0xC5A3], NFC: [0xC5A3], NFD: [0x110B, 0x1164, 0x11B2], NFKC: [0xC5A3], NFKD: [0x110B, 0x1164, 0x11B2] }, +{ source: [0xC5A4], NFC: [0xC5A4], NFD: [0x110B, 0x1164, 0x11B3], NFKC: [0xC5A4], NFKD: [0x110B, 0x1164, 0x11B3] }, +{ source: [0xC5A5], NFC: [0xC5A5], NFD: [0x110B, 0x1164, 0x11B4], NFKC: [0xC5A5], NFKD: [0x110B, 0x1164, 0x11B4] }, +{ source: [0xC5A6], NFC: [0xC5A6], NFD: [0x110B, 0x1164, 0x11B5], NFKC: [0xC5A6], NFKD: [0x110B, 0x1164, 0x11B5] }, +{ source: [0xC5A7], NFC: [0xC5A7], NFD: [0x110B, 0x1164, 0x11B6], NFKC: [0xC5A7], NFKD: [0x110B, 0x1164, 0x11B6] }, +{ source: [0xC5A8], NFC: [0xC5A8], NFD: [0x110B, 0x1164, 0x11B7], NFKC: [0xC5A8], NFKD: [0x110B, 0x1164, 0x11B7] }, +{ source: [0xC5A9], NFC: [0xC5A9], NFD: [0x110B, 0x1164, 0x11B8], NFKC: [0xC5A9], NFKD: [0x110B, 0x1164, 0x11B8] }, +{ source: [0xC5AA], NFC: [0xC5AA], NFD: [0x110B, 0x1164, 0x11B9], NFKC: [0xC5AA], NFKD: [0x110B, 0x1164, 0x11B9] }, +{ source: [0xC5AB], NFC: [0xC5AB], NFD: [0x110B, 0x1164, 0x11BA], NFKC: [0xC5AB], NFKD: [0x110B, 0x1164, 0x11BA] }, +{ source: [0xC5AC], NFC: [0xC5AC], NFD: [0x110B, 0x1164, 0x11BB], NFKC: [0xC5AC], NFKD: [0x110B, 0x1164, 0x11BB] }, +{ source: [0xC5AD], NFC: [0xC5AD], NFD: [0x110B, 0x1164, 0x11BC], NFKC: [0xC5AD], NFKD: [0x110B, 0x1164, 0x11BC] }, +{ source: [0xC5AE], NFC: [0xC5AE], NFD: [0x110B, 0x1164, 0x11BD], NFKC: [0xC5AE], NFKD: [0x110B, 0x1164, 0x11BD] }, +{ source: [0xC5AF], NFC: [0xC5AF], NFD: [0x110B, 0x1164, 0x11BE], NFKC: [0xC5AF], NFKD: [0x110B, 0x1164, 0x11BE] }, +{ source: [0xC5B0], NFC: [0xC5B0], NFD: [0x110B, 0x1164, 0x11BF], NFKC: [0xC5B0], NFKD: [0x110B, 0x1164, 0x11BF] }, +{ source: [0xC5B1], NFC: [0xC5B1], NFD: [0x110B, 0x1164, 0x11C0], NFKC: [0xC5B1], NFKD: [0x110B, 0x1164, 0x11C0] }, +{ source: [0xC5B2], NFC: [0xC5B2], NFD: [0x110B, 0x1164, 0x11C1], NFKC: [0xC5B2], NFKD: [0x110B, 0x1164, 0x11C1] }, +{ source: [0xC5B3], NFC: [0xC5B3], NFD: [0x110B, 0x1164, 0x11C2], NFKC: [0xC5B3], NFKD: [0x110B, 0x1164, 0x11C2] }, +{ source: [0xC5B4], NFC: [0xC5B4], NFD: [0x110B, 0x1165], NFKC: [0xC5B4], NFKD: [0x110B, 0x1165] }, +{ source: [0xC5B5], NFC: [0xC5B5], NFD: [0x110B, 0x1165, 0x11A8], NFKC: [0xC5B5], NFKD: [0x110B, 0x1165, 0x11A8] }, +{ source: [0xC5B6], NFC: [0xC5B6], NFD: [0x110B, 0x1165, 0x11A9], NFKC: [0xC5B6], NFKD: [0x110B, 0x1165, 0x11A9] }, +{ source: [0xC5B7], NFC: [0xC5B7], NFD: [0x110B, 0x1165, 0x11AA], NFKC: [0xC5B7], NFKD: [0x110B, 0x1165, 0x11AA] }, +{ source: [0xC5B8], NFC: [0xC5B8], NFD: [0x110B, 0x1165, 0x11AB], NFKC: [0xC5B8], NFKD: [0x110B, 0x1165, 0x11AB] }, +{ source: [0xC5B9], NFC: [0xC5B9], NFD: [0x110B, 0x1165, 0x11AC], NFKC: [0xC5B9], NFKD: [0x110B, 0x1165, 0x11AC] }, +{ source: [0xC5BA], NFC: [0xC5BA], NFD: [0x110B, 0x1165, 0x11AD], NFKC: [0xC5BA], NFKD: [0x110B, 0x1165, 0x11AD] }, +{ source: [0xC5BB], NFC: [0xC5BB], NFD: [0x110B, 0x1165, 0x11AE], NFKC: [0xC5BB], NFKD: [0x110B, 0x1165, 0x11AE] }, +{ source: [0xC5BC], NFC: [0xC5BC], NFD: [0x110B, 0x1165, 0x11AF], NFKC: [0xC5BC], NFKD: [0x110B, 0x1165, 0x11AF] }, +{ source: [0xC5BD], NFC: [0xC5BD], NFD: [0x110B, 0x1165, 0x11B0], NFKC: [0xC5BD], NFKD: [0x110B, 0x1165, 0x11B0] }, +{ source: [0xC5BE], NFC: [0xC5BE], NFD: [0x110B, 0x1165, 0x11B1], NFKC: [0xC5BE], NFKD: [0x110B, 0x1165, 0x11B1] }, +{ source: [0xC5BF], NFC: [0xC5BF], NFD: [0x110B, 0x1165, 0x11B2], NFKC: [0xC5BF], NFKD: [0x110B, 0x1165, 0x11B2] }, +{ source: [0xC5C0], NFC: [0xC5C0], NFD: [0x110B, 0x1165, 0x11B3], NFKC: [0xC5C0], NFKD: [0x110B, 0x1165, 0x11B3] }, +{ source: [0xC5C1], NFC: [0xC5C1], NFD: [0x110B, 0x1165, 0x11B4], NFKC: [0xC5C1], NFKD: [0x110B, 0x1165, 0x11B4] }, +{ source: [0xC5C2], NFC: [0xC5C2], NFD: [0x110B, 0x1165, 0x11B5], NFKC: [0xC5C2], NFKD: [0x110B, 0x1165, 0x11B5] }, +{ source: [0xC5C3], NFC: [0xC5C3], NFD: [0x110B, 0x1165, 0x11B6], NFKC: [0xC5C3], NFKD: [0x110B, 0x1165, 0x11B6] }, +{ source: [0xC5C4], NFC: [0xC5C4], NFD: [0x110B, 0x1165, 0x11B7], NFKC: [0xC5C4], NFKD: [0x110B, 0x1165, 0x11B7] }, +{ source: [0xC5C5], NFC: [0xC5C5], NFD: [0x110B, 0x1165, 0x11B8], NFKC: [0xC5C5], NFKD: [0x110B, 0x1165, 0x11B8] }, +{ source: [0xC5C6], NFC: [0xC5C6], NFD: [0x110B, 0x1165, 0x11B9], NFKC: [0xC5C6], NFKD: [0x110B, 0x1165, 0x11B9] }, +{ source: [0xC5C7], NFC: [0xC5C7], NFD: [0x110B, 0x1165, 0x11BA], NFKC: [0xC5C7], NFKD: [0x110B, 0x1165, 0x11BA] }, +{ source: [0xC5C8], NFC: [0xC5C8], NFD: [0x110B, 0x1165, 0x11BB], NFKC: [0xC5C8], NFKD: [0x110B, 0x1165, 0x11BB] }, +{ source: [0xC5C9], NFC: [0xC5C9], NFD: [0x110B, 0x1165, 0x11BC], NFKC: [0xC5C9], NFKD: [0x110B, 0x1165, 0x11BC] }, +{ source: [0xC5CA], NFC: [0xC5CA], NFD: [0x110B, 0x1165, 0x11BD], NFKC: [0xC5CA], NFKD: [0x110B, 0x1165, 0x11BD] }, +{ source: [0xC5CB], NFC: [0xC5CB], NFD: [0x110B, 0x1165, 0x11BE], NFKC: [0xC5CB], NFKD: [0x110B, 0x1165, 0x11BE] }, +{ source: [0xC5CC], NFC: [0xC5CC], NFD: [0x110B, 0x1165, 0x11BF], NFKC: [0xC5CC], NFKD: [0x110B, 0x1165, 0x11BF] }, +{ source: [0xC5CD], NFC: [0xC5CD], NFD: [0x110B, 0x1165, 0x11C0], NFKC: [0xC5CD], NFKD: [0x110B, 0x1165, 0x11C0] }, +{ source: [0xC5CE], NFC: [0xC5CE], NFD: [0x110B, 0x1165, 0x11C1], NFKC: [0xC5CE], NFKD: [0x110B, 0x1165, 0x11C1] }, +{ source: [0xC5CF], NFC: [0xC5CF], NFD: [0x110B, 0x1165, 0x11C2], NFKC: [0xC5CF], NFKD: [0x110B, 0x1165, 0x11C2] }, +{ source: [0xC5D0], NFC: [0xC5D0], NFD: [0x110B, 0x1166], NFKC: [0xC5D0], NFKD: [0x110B, 0x1166] }, +{ source: [0xC5D1], NFC: [0xC5D1], NFD: [0x110B, 0x1166, 0x11A8], NFKC: [0xC5D1], NFKD: [0x110B, 0x1166, 0x11A8] }, +{ source: [0xC5D2], NFC: [0xC5D2], NFD: [0x110B, 0x1166, 0x11A9], NFKC: [0xC5D2], NFKD: [0x110B, 0x1166, 0x11A9] }, +{ source: [0xC5D3], NFC: [0xC5D3], NFD: [0x110B, 0x1166, 0x11AA], NFKC: [0xC5D3], NFKD: [0x110B, 0x1166, 0x11AA] }, +{ source: [0xC5D4], NFC: [0xC5D4], NFD: [0x110B, 0x1166, 0x11AB], NFKC: [0xC5D4], NFKD: [0x110B, 0x1166, 0x11AB] }, +{ source: [0xC5D5], NFC: [0xC5D5], NFD: [0x110B, 0x1166, 0x11AC], NFKC: [0xC5D5], NFKD: [0x110B, 0x1166, 0x11AC] }, +{ source: [0xC5D6], NFC: [0xC5D6], NFD: [0x110B, 0x1166, 0x11AD], NFKC: [0xC5D6], NFKD: [0x110B, 0x1166, 0x11AD] }, +{ source: [0xC5D7], NFC: [0xC5D7], NFD: [0x110B, 0x1166, 0x11AE], NFKC: [0xC5D7], NFKD: [0x110B, 0x1166, 0x11AE] }, +{ source: [0xC5D8], NFC: [0xC5D8], NFD: [0x110B, 0x1166, 0x11AF], NFKC: [0xC5D8], NFKD: [0x110B, 0x1166, 0x11AF] }, +{ source: [0xC5D9], NFC: [0xC5D9], NFD: [0x110B, 0x1166, 0x11B0], NFKC: [0xC5D9], NFKD: [0x110B, 0x1166, 0x11B0] }, +{ source: [0xC5DA], NFC: [0xC5DA], NFD: [0x110B, 0x1166, 0x11B1], NFKC: [0xC5DA], NFKD: [0x110B, 0x1166, 0x11B1] }, +{ source: [0xC5DB], NFC: [0xC5DB], NFD: [0x110B, 0x1166, 0x11B2], NFKC: [0xC5DB], NFKD: [0x110B, 0x1166, 0x11B2] }, +{ source: [0xC5DC], NFC: [0xC5DC], NFD: [0x110B, 0x1166, 0x11B3], NFKC: [0xC5DC], NFKD: [0x110B, 0x1166, 0x11B3] }, +{ source: [0xC5DD], NFC: [0xC5DD], NFD: [0x110B, 0x1166, 0x11B4], NFKC: [0xC5DD], NFKD: [0x110B, 0x1166, 0x11B4] }, +{ source: [0xC5DE], NFC: [0xC5DE], NFD: [0x110B, 0x1166, 0x11B5], NFKC: [0xC5DE], NFKD: [0x110B, 0x1166, 0x11B5] }, +{ source: [0xC5DF], NFC: [0xC5DF], NFD: [0x110B, 0x1166, 0x11B6], NFKC: [0xC5DF], NFKD: [0x110B, 0x1166, 0x11B6] }, +{ source: [0xC5E0], NFC: [0xC5E0], NFD: [0x110B, 0x1166, 0x11B7], NFKC: [0xC5E0], NFKD: [0x110B, 0x1166, 0x11B7] }, +{ source: [0xC5E1], NFC: [0xC5E1], NFD: [0x110B, 0x1166, 0x11B8], NFKC: [0xC5E1], NFKD: [0x110B, 0x1166, 0x11B8] }, +{ source: [0xC5E2], NFC: [0xC5E2], NFD: [0x110B, 0x1166, 0x11B9], NFKC: [0xC5E2], NFKD: [0x110B, 0x1166, 0x11B9] }, +{ source: [0xC5E3], NFC: [0xC5E3], NFD: [0x110B, 0x1166, 0x11BA], NFKC: [0xC5E3], NFKD: [0x110B, 0x1166, 0x11BA] }, +{ source: [0xC5E4], NFC: [0xC5E4], NFD: [0x110B, 0x1166, 0x11BB], NFKC: [0xC5E4], NFKD: [0x110B, 0x1166, 0x11BB] }, +{ source: [0xC5E5], NFC: [0xC5E5], NFD: [0x110B, 0x1166, 0x11BC], NFKC: [0xC5E5], NFKD: [0x110B, 0x1166, 0x11BC] }, +{ source: [0xC5E6], NFC: [0xC5E6], NFD: [0x110B, 0x1166, 0x11BD], NFKC: [0xC5E6], NFKD: [0x110B, 0x1166, 0x11BD] }, +{ source: [0xC5E7], NFC: [0xC5E7], NFD: [0x110B, 0x1166, 0x11BE], NFKC: [0xC5E7], NFKD: [0x110B, 0x1166, 0x11BE] }, +{ source: [0xC5E8], NFC: [0xC5E8], NFD: [0x110B, 0x1166, 0x11BF], NFKC: [0xC5E8], NFKD: [0x110B, 0x1166, 0x11BF] }, +{ source: [0xC5E9], NFC: [0xC5E9], NFD: [0x110B, 0x1166, 0x11C0], NFKC: [0xC5E9], NFKD: [0x110B, 0x1166, 0x11C0] }, +{ source: [0xC5EA], NFC: [0xC5EA], NFD: [0x110B, 0x1166, 0x11C1], NFKC: [0xC5EA], NFKD: [0x110B, 0x1166, 0x11C1] }, +{ source: [0xC5EB], NFC: [0xC5EB], NFD: [0x110B, 0x1166, 0x11C2], NFKC: [0xC5EB], NFKD: [0x110B, 0x1166, 0x11C2] }, +{ source: [0xC5EC], NFC: [0xC5EC], NFD: [0x110B, 0x1167], NFKC: [0xC5EC], NFKD: [0x110B, 0x1167] }, +{ source: [0xC5ED], NFC: [0xC5ED], NFD: [0x110B, 0x1167, 0x11A8], NFKC: [0xC5ED], NFKD: [0x110B, 0x1167, 0x11A8] }, +{ source: [0xC5EE], NFC: [0xC5EE], NFD: [0x110B, 0x1167, 0x11A9], NFKC: [0xC5EE], NFKD: [0x110B, 0x1167, 0x11A9] }, +{ source: [0xC5EF], NFC: [0xC5EF], NFD: [0x110B, 0x1167, 0x11AA], NFKC: [0xC5EF], NFKD: [0x110B, 0x1167, 0x11AA] }, +{ source: [0xC5F0], NFC: [0xC5F0], NFD: [0x110B, 0x1167, 0x11AB], NFKC: [0xC5F0], NFKD: [0x110B, 0x1167, 0x11AB] }, +{ source: [0xC5F1], NFC: [0xC5F1], NFD: [0x110B, 0x1167, 0x11AC], NFKC: [0xC5F1], NFKD: [0x110B, 0x1167, 0x11AC] }, +{ source: [0xC5F2], NFC: [0xC5F2], NFD: [0x110B, 0x1167, 0x11AD], NFKC: [0xC5F2], NFKD: [0x110B, 0x1167, 0x11AD] }, +{ source: [0xC5F3], NFC: [0xC5F3], NFD: [0x110B, 0x1167, 0x11AE], NFKC: [0xC5F3], NFKD: [0x110B, 0x1167, 0x11AE] }, +{ source: [0xC5F4], NFC: [0xC5F4], NFD: [0x110B, 0x1167, 0x11AF], NFKC: [0xC5F4], NFKD: [0x110B, 0x1167, 0x11AF] }, +{ source: [0xC5F5], NFC: [0xC5F5], NFD: [0x110B, 0x1167, 0x11B0], NFKC: [0xC5F5], NFKD: [0x110B, 0x1167, 0x11B0] }, +{ source: [0xC5F6], NFC: [0xC5F6], NFD: [0x110B, 0x1167, 0x11B1], NFKC: [0xC5F6], NFKD: [0x110B, 0x1167, 0x11B1] }, +{ source: [0xC5F7], NFC: [0xC5F7], NFD: [0x110B, 0x1167, 0x11B2], NFKC: [0xC5F7], NFKD: [0x110B, 0x1167, 0x11B2] }, +{ source: [0xC5F8], NFC: [0xC5F8], NFD: [0x110B, 0x1167, 0x11B3], NFKC: [0xC5F8], NFKD: [0x110B, 0x1167, 0x11B3] }, +{ source: [0xC5F9], NFC: [0xC5F9], NFD: [0x110B, 0x1167, 0x11B4], NFKC: [0xC5F9], NFKD: [0x110B, 0x1167, 0x11B4] }, +{ source: [0xC5FA], NFC: [0xC5FA], NFD: [0x110B, 0x1167, 0x11B5], NFKC: [0xC5FA], NFKD: [0x110B, 0x1167, 0x11B5] }, +{ source: [0xC5FB], NFC: [0xC5FB], NFD: [0x110B, 0x1167, 0x11B6], NFKC: [0xC5FB], NFKD: [0x110B, 0x1167, 0x11B6] }, +{ source: [0xC5FC], NFC: [0xC5FC], NFD: [0x110B, 0x1167, 0x11B7], NFKC: [0xC5FC], NFKD: [0x110B, 0x1167, 0x11B7] }, +{ source: [0xC5FD], NFC: [0xC5FD], NFD: [0x110B, 0x1167, 0x11B8], NFKC: [0xC5FD], NFKD: [0x110B, 0x1167, 0x11B8] }, +{ source: [0xC5FE], NFC: [0xC5FE], NFD: [0x110B, 0x1167, 0x11B9], NFKC: [0xC5FE], NFKD: [0x110B, 0x1167, 0x11B9] }, +{ source: [0xC5FF], NFC: [0xC5FF], NFD: [0x110B, 0x1167, 0x11BA], NFKC: [0xC5FF], NFKD: [0x110B, 0x1167, 0x11BA] }, +{ source: [0xC600], NFC: [0xC600], NFD: [0x110B, 0x1167, 0x11BB], NFKC: [0xC600], NFKD: [0x110B, 0x1167, 0x11BB] }, +{ source: [0xC601], NFC: [0xC601], NFD: [0x110B, 0x1167, 0x11BC], NFKC: [0xC601], NFKD: [0x110B, 0x1167, 0x11BC] }, +{ source: [0xC602], NFC: [0xC602], NFD: [0x110B, 0x1167, 0x11BD], NFKC: [0xC602], NFKD: [0x110B, 0x1167, 0x11BD] }, +{ source: [0xC603], NFC: [0xC603], NFD: [0x110B, 0x1167, 0x11BE], NFKC: [0xC603], NFKD: [0x110B, 0x1167, 0x11BE] }, +{ source: [0xC604], NFC: [0xC604], NFD: [0x110B, 0x1167, 0x11BF], NFKC: [0xC604], NFKD: [0x110B, 0x1167, 0x11BF] }, +{ source: [0xC605], NFC: [0xC605], NFD: [0x110B, 0x1167, 0x11C0], NFKC: [0xC605], NFKD: [0x110B, 0x1167, 0x11C0] }, +{ source: [0xC606], NFC: [0xC606], NFD: [0x110B, 0x1167, 0x11C1], NFKC: [0xC606], NFKD: [0x110B, 0x1167, 0x11C1] }, +{ source: [0xC607], NFC: [0xC607], NFD: [0x110B, 0x1167, 0x11C2], NFKC: [0xC607], NFKD: [0x110B, 0x1167, 0x11C2] }, +{ source: [0xC608], NFC: [0xC608], NFD: [0x110B, 0x1168], NFKC: [0xC608], NFKD: [0x110B, 0x1168] }, +{ source: [0xC609], NFC: [0xC609], NFD: [0x110B, 0x1168, 0x11A8], NFKC: [0xC609], NFKD: [0x110B, 0x1168, 0x11A8] }, +{ source: [0xC60A], NFC: [0xC60A], NFD: [0x110B, 0x1168, 0x11A9], NFKC: [0xC60A], NFKD: [0x110B, 0x1168, 0x11A9] }, +{ source: [0xC60B], NFC: [0xC60B], NFD: [0x110B, 0x1168, 0x11AA], NFKC: [0xC60B], NFKD: [0x110B, 0x1168, 0x11AA] }, +{ source: [0xC60C], NFC: [0xC60C], NFD: [0x110B, 0x1168, 0x11AB], NFKC: [0xC60C], NFKD: [0x110B, 0x1168, 0x11AB] }, +{ source: [0xC60D], NFC: [0xC60D], NFD: [0x110B, 0x1168, 0x11AC], NFKC: [0xC60D], NFKD: [0x110B, 0x1168, 0x11AC] }, +{ source: [0xC60E], NFC: [0xC60E], NFD: [0x110B, 0x1168, 0x11AD], NFKC: [0xC60E], NFKD: [0x110B, 0x1168, 0x11AD] }, +{ source: [0xC60F], NFC: [0xC60F], NFD: [0x110B, 0x1168, 0x11AE], NFKC: [0xC60F], NFKD: [0x110B, 0x1168, 0x11AE] }, +{ source: [0xC610], NFC: [0xC610], NFD: [0x110B, 0x1168, 0x11AF], NFKC: [0xC610], NFKD: [0x110B, 0x1168, 0x11AF] }, +{ source: [0xC611], NFC: [0xC611], NFD: [0x110B, 0x1168, 0x11B0], NFKC: [0xC611], NFKD: [0x110B, 0x1168, 0x11B0] }, +{ source: [0xC612], NFC: [0xC612], NFD: [0x110B, 0x1168, 0x11B1], NFKC: [0xC612], NFKD: [0x110B, 0x1168, 0x11B1] }, +{ source: [0xC613], NFC: [0xC613], NFD: [0x110B, 0x1168, 0x11B2], NFKC: [0xC613], NFKD: [0x110B, 0x1168, 0x11B2] }, +{ source: [0xC614], NFC: [0xC614], NFD: [0x110B, 0x1168, 0x11B3], NFKC: [0xC614], NFKD: [0x110B, 0x1168, 0x11B3] }, +{ source: [0xC615], NFC: [0xC615], NFD: [0x110B, 0x1168, 0x11B4], NFKC: [0xC615], NFKD: [0x110B, 0x1168, 0x11B4] }, +{ source: [0xC616], NFC: [0xC616], NFD: [0x110B, 0x1168, 0x11B5], NFKC: [0xC616], NFKD: [0x110B, 0x1168, 0x11B5] }, +{ source: [0xC617], NFC: [0xC617], NFD: [0x110B, 0x1168, 0x11B6], NFKC: [0xC617], NFKD: [0x110B, 0x1168, 0x11B6] }, +{ source: [0xC618], NFC: [0xC618], NFD: [0x110B, 0x1168, 0x11B7], NFKC: [0xC618], NFKD: [0x110B, 0x1168, 0x11B7] }, +{ source: [0xC619], NFC: [0xC619], NFD: [0x110B, 0x1168, 0x11B8], NFKC: [0xC619], NFKD: [0x110B, 0x1168, 0x11B8] }, +{ source: [0xC61A], NFC: [0xC61A], NFD: [0x110B, 0x1168, 0x11B9], NFKC: [0xC61A], NFKD: [0x110B, 0x1168, 0x11B9] }, +{ source: [0xC61B], NFC: [0xC61B], NFD: [0x110B, 0x1168, 0x11BA], NFKC: [0xC61B], NFKD: [0x110B, 0x1168, 0x11BA] }, +{ source: [0xC61C], NFC: [0xC61C], NFD: [0x110B, 0x1168, 0x11BB], NFKC: [0xC61C], NFKD: [0x110B, 0x1168, 0x11BB] }, +{ source: [0xC61D], NFC: [0xC61D], NFD: [0x110B, 0x1168, 0x11BC], NFKC: [0xC61D], NFKD: [0x110B, 0x1168, 0x11BC] }, +{ source: [0xC61E], NFC: [0xC61E], NFD: [0x110B, 0x1168, 0x11BD], NFKC: [0xC61E], NFKD: [0x110B, 0x1168, 0x11BD] }, +{ source: [0xC61F], NFC: [0xC61F], NFD: [0x110B, 0x1168, 0x11BE], NFKC: [0xC61F], NFKD: [0x110B, 0x1168, 0x11BE] }, +{ source: [0xC620], NFC: [0xC620], NFD: [0x110B, 0x1168, 0x11BF], NFKC: [0xC620], NFKD: [0x110B, 0x1168, 0x11BF] }, +{ source: [0xC621], NFC: [0xC621], NFD: [0x110B, 0x1168, 0x11C0], NFKC: [0xC621], NFKD: [0x110B, 0x1168, 0x11C0] }, +{ source: [0xC622], NFC: [0xC622], NFD: [0x110B, 0x1168, 0x11C1], NFKC: [0xC622], NFKD: [0x110B, 0x1168, 0x11C1] }, +{ source: [0xC623], NFC: [0xC623], NFD: [0x110B, 0x1168, 0x11C2], NFKC: [0xC623], NFKD: [0x110B, 0x1168, 0x11C2] }, +{ source: [0xC624], NFC: [0xC624], NFD: [0x110B, 0x1169], NFKC: [0xC624], NFKD: [0x110B, 0x1169] }, +{ source: [0xC625], NFC: [0xC625], NFD: [0x110B, 0x1169, 0x11A8], NFKC: [0xC625], NFKD: [0x110B, 0x1169, 0x11A8] }, +{ source: [0xC626], NFC: [0xC626], NFD: [0x110B, 0x1169, 0x11A9], NFKC: [0xC626], NFKD: [0x110B, 0x1169, 0x11A9] }, +{ source: [0xC627], NFC: [0xC627], NFD: [0x110B, 0x1169, 0x11AA], NFKC: [0xC627], NFKD: [0x110B, 0x1169, 0x11AA] }, +{ source: [0xC628], NFC: [0xC628], NFD: [0x110B, 0x1169, 0x11AB], NFKC: [0xC628], NFKD: [0x110B, 0x1169, 0x11AB] }, +{ source: [0xC629], NFC: [0xC629], NFD: [0x110B, 0x1169, 0x11AC], NFKC: [0xC629], NFKD: [0x110B, 0x1169, 0x11AC] }, +{ source: [0xC62A], NFC: [0xC62A], NFD: [0x110B, 0x1169, 0x11AD], NFKC: [0xC62A], NFKD: [0x110B, 0x1169, 0x11AD] }, +{ source: [0xC62B], NFC: [0xC62B], NFD: [0x110B, 0x1169, 0x11AE], NFKC: [0xC62B], NFKD: [0x110B, 0x1169, 0x11AE] }, +{ source: [0xC62C], NFC: [0xC62C], NFD: [0x110B, 0x1169, 0x11AF], NFKC: [0xC62C], NFKD: [0x110B, 0x1169, 0x11AF] }, +{ source: [0xC62D], NFC: [0xC62D], NFD: [0x110B, 0x1169, 0x11B0], NFKC: [0xC62D], NFKD: [0x110B, 0x1169, 0x11B0] }, +{ source: [0xC62E], NFC: [0xC62E], NFD: [0x110B, 0x1169, 0x11B1], NFKC: [0xC62E], NFKD: [0x110B, 0x1169, 0x11B1] }, +{ source: [0xC62F], NFC: [0xC62F], NFD: [0x110B, 0x1169, 0x11B2], NFKC: [0xC62F], NFKD: [0x110B, 0x1169, 0x11B2] }, +{ source: [0xC630], NFC: [0xC630], NFD: [0x110B, 0x1169, 0x11B3], NFKC: [0xC630], NFKD: [0x110B, 0x1169, 0x11B3] }, +{ source: [0xC631], NFC: [0xC631], NFD: [0x110B, 0x1169, 0x11B4], NFKC: [0xC631], NFKD: [0x110B, 0x1169, 0x11B4] }, +{ source: [0xC632], NFC: [0xC632], NFD: [0x110B, 0x1169, 0x11B5], NFKC: [0xC632], NFKD: [0x110B, 0x1169, 0x11B5] }, +{ source: [0xC633], NFC: [0xC633], NFD: [0x110B, 0x1169, 0x11B6], NFKC: [0xC633], NFKD: [0x110B, 0x1169, 0x11B6] }, +{ source: [0xC634], NFC: [0xC634], NFD: [0x110B, 0x1169, 0x11B7], NFKC: [0xC634], NFKD: [0x110B, 0x1169, 0x11B7] }, +{ source: [0xC635], NFC: [0xC635], NFD: [0x110B, 0x1169, 0x11B8], NFKC: [0xC635], NFKD: [0x110B, 0x1169, 0x11B8] }, +{ source: [0xC636], NFC: [0xC636], NFD: [0x110B, 0x1169, 0x11B9], NFKC: [0xC636], NFKD: [0x110B, 0x1169, 0x11B9] }, +{ source: [0xC637], NFC: [0xC637], NFD: [0x110B, 0x1169, 0x11BA], NFKC: [0xC637], NFKD: [0x110B, 0x1169, 0x11BA] }, +{ source: [0xC638], NFC: [0xC638], NFD: [0x110B, 0x1169, 0x11BB], NFKC: [0xC638], NFKD: [0x110B, 0x1169, 0x11BB] }, +{ source: [0xC639], NFC: [0xC639], NFD: [0x110B, 0x1169, 0x11BC], NFKC: [0xC639], NFKD: [0x110B, 0x1169, 0x11BC] }, +{ source: [0xC63A], NFC: [0xC63A], NFD: [0x110B, 0x1169, 0x11BD], NFKC: [0xC63A], NFKD: [0x110B, 0x1169, 0x11BD] }, +{ source: [0xC63B], NFC: [0xC63B], NFD: [0x110B, 0x1169, 0x11BE], NFKC: [0xC63B], NFKD: [0x110B, 0x1169, 0x11BE] }, +{ source: [0xC63C], NFC: [0xC63C], NFD: [0x110B, 0x1169, 0x11BF], NFKC: [0xC63C], NFKD: [0x110B, 0x1169, 0x11BF] }, +{ source: [0xC63D], NFC: [0xC63D], NFD: [0x110B, 0x1169, 0x11C0], NFKC: [0xC63D], NFKD: [0x110B, 0x1169, 0x11C0] }, +{ source: [0xC63E], NFC: [0xC63E], NFD: [0x110B, 0x1169, 0x11C1], NFKC: [0xC63E], NFKD: [0x110B, 0x1169, 0x11C1] }, +{ source: [0xC63F], NFC: [0xC63F], NFD: [0x110B, 0x1169, 0x11C2], NFKC: [0xC63F], NFKD: [0x110B, 0x1169, 0x11C2] }, +{ source: [0xC640], NFC: [0xC640], NFD: [0x110B, 0x116A], NFKC: [0xC640], NFKD: [0x110B, 0x116A] }, +{ source: [0xC641], NFC: [0xC641], NFD: [0x110B, 0x116A, 0x11A8], NFKC: [0xC641], NFKD: [0x110B, 0x116A, 0x11A8] }, +{ source: [0xC642], NFC: [0xC642], NFD: [0x110B, 0x116A, 0x11A9], NFKC: [0xC642], NFKD: [0x110B, 0x116A, 0x11A9] }, +{ source: [0xC643], NFC: [0xC643], NFD: [0x110B, 0x116A, 0x11AA], NFKC: [0xC643], NFKD: [0x110B, 0x116A, 0x11AA] }, +{ source: [0xC644], NFC: [0xC644], NFD: [0x110B, 0x116A, 0x11AB], NFKC: [0xC644], NFKD: [0x110B, 0x116A, 0x11AB] }, +{ source: [0xC645], NFC: [0xC645], NFD: [0x110B, 0x116A, 0x11AC], NFKC: [0xC645], NFKD: [0x110B, 0x116A, 0x11AC] }, +{ source: [0xC646], NFC: [0xC646], NFD: [0x110B, 0x116A, 0x11AD], NFKC: [0xC646], NFKD: [0x110B, 0x116A, 0x11AD] }, +{ source: [0xC647], NFC: [0xC647], NFD: [0x110B, 0x116A, 0x11AE], NFKC: [0xC647], NFKD: [0x110B, 0x116A, 0x11AE] }, +{ source: [0xC648], NFC: [0xC648], NFD: [0x110B, 0x116A, 0x11AF], NFKC: [0xC648], NFKD: [0x110B, 0x116A, 0x11AF] }, +{ source: [0xC649], NFC: [0xC649], NFD: [0x110B, 0x116A, 0x11B0], NFKC: [0xC649], NFKD: [0x110B, 0x116A, 0x11B0] }, +{ source: [0xC64A], NFC: [0xC64A], NFD: [0x110B, 0x116A, 0x11B1], NFKC: [0xC64A], NFKD: [0x110B, 0x116A, 0x11B1] }, +{ source: [0xC64B], NFC: [0xC64B], NFD: [0x110B, 0x116A, 0x11B2], NFKC: [0xC64B], NFKD: [0x110B, 0x116A, 0x11B2] }, +{ source: [0xC64C], NFC: [0xC64C], NFD: [0x110B, 0x116A, 0x11B3], NFKC: [0xC64C], NFKD: [0x110B, 0x116A, 0x11B3] }, +{ source: [0xC64D], NFC: [0xC64D], NFD: [0x110B, 0x116A, 0x11B4], NFKC: [0xC64D], NFKD: [0x110B, 0x116A, 0x11B4] }, +{ source: [0xC64E], NFC: [0xC64E], NFD: [0x110B, 0x116A, 0x11B5], NFKC: [0xC64E], NFKD: [0x110B, 0x116A, 0x11B5] }, +{ source: [0xC64F], NFC: [0xC64F], NFD: [0x110B, 0x116A, 0x11B6], NFKC: [0xC64F], NFKD: [0x110B, 0x116A, 0x11B6] }, +{ source: [0xC650], NFC: [0xC650], NFD: [0x110B, 0x116A, 0x11B7], NFKC: [0xC650], NFKD: [0x110B, 0x116A, 0x11B7] }, +{ source: [0xC651], NFC: [0xC651], NFD: [0x110B, 0x116A, 0x11B8], NFKC: [0xC651], NFKD: [0x110B, 0x116A, 0x11B8] }, +{ source: [0xC652], NFC: [0xC652], NFD: [0x110B, 0x116A, 0x11B9], NFKC: [0xC652], NFKD: [0x110B, 0x116A, 0x11B9] }, +{ source: [0xC653], NFC: [0xC653], NFD: [0x110B, 0x116A, 0x11BA], NFKC: [0xC653], NFKD: [0x110B, 0x116A, 0x11BA] }, +{ source: [0xC654], NFC: [0xC654], NFD: [0x110B, 0x116A, 0x11BB], NFKC: [0xC654], NFKD: [0x110B, 0x116A, 0x11BB] }, +{ source: [0xC655], NFC: [0xC655], NFD: [0x110B, 0x116A, 0x11BC], NFKC: [0xC655], NFKD: [0x110B, 0x116A, 0x11BC] }, +{ source: [0xC656], NFC: [0xC656], NFD: [0x110B, 0x116A, 0x11BD], NFKC: [0xC656], NFKD: [0x110B, 0x116A, 0x11BD] }, +{ source: [0xC657], NFC: [0xC657], NFD: [0x110B, 0x116A, 0x11BE], NFKC: [0xC657], NFKD: [0x110B, 0x116A, 0x11BE] }, +{ source: [0xC658], NFC: [0xC658], NFD: [0x110B, 0x116A, 0x11BF], NFKC: [0xC658], NFKD: [0x110B, 0x116A, 0x11BF] }, +{ source: [0xC659], NFC: [0xC659], NFD: [0x110B, 0x116A, 0x11C0], NFKC: [0xC659], NFKD: [0x110B, 0x116A, 0x11C0] }, +{ source: [0xC65A], NFC: [0xC65A], NFD: [0x110B, 0x116A, 0x11C1], NFKC: [0xC65A], NFKD: [0x110B, 0x116A, 0x11C1] }, +{ source: [0xC65B], NFC: [0xC65B], NFD: [0x110B, 0x116A, 0x11C2], NFKC: [0xC65B], NFKD: [0x110B, 0x116A, 0x11C2] }, +{ source: [0xC65C], NFC: [0xC65C], NFD: [0x110B, 0x116B], NFKC: [0xC65C], NFKD: [0x110B, 0x116B] }, +{ source: [0xC65D], NFC: [0xC65D], NFD: [0x110B, 0x116B, 0x11A8], NFKC: [0xC65D], NFKD: [0x110B, 0x116B, 0x11A8] }, +{ source: [0xC65E], NFC: [0xC65E], NFD: [0x110B, 0x116B, 0x11A9], NFKC: [0xC65E], NFKD: [0x110B, 0x116B, 0x11A9] }, +{ source: [0xC65F], NFC: [0xC65F], NFD: [0x110B, 0x116B, 0x11AA], NFKC: [0xC65F], NFKD: [0x110B, 0x116B, 0x11AA] }, +{ source: [0xC660], NFC: [0xC660], NFD: [0x110B, 0x116B, 0x11AB], NFKC: [0xC660], NFKD: [0x110B, 0x116B, 0x11AB] }, +{ source: [0xC661], NFC: [0xC661], NFD: [0x110B, 0x116B, 0x11AC], NFKC: [0xC661], NFKD: [0x110B, 0x116B, 0x11AC] }, +{ source: [0xC662], NFC: [0xC662], NFD: [0x110B, 0x116B, 0x11AD], NFKC: [0xC662], NFKD: [0x110B, 0x116B, 0x11AD] }, +{ source: [0xC663], NFC: [0xC663], NFD: [0x110B, 0x116B, 0x11AE], NFKC: [0xC663], NFKD: [0x110B, 0x116B, 0x11AE] }, +{ source: [0xC664], NFC: [0xC664], NFD: [0x110B, 0x116B, 0x11AF], NFKC: [0xC664], NFKD: [0x110B, 0x116B, 0x11AF] }, +{ source: [0xC665], NFC: [0xC665], NFD: [0x110B, 0x116B, 0x11B0], NFKC: [0xC665], NFKD: [0x110B, 0x116B, 0x11B0] }, +{ source: [0xC666], NFC: [0xC666], NFD: [0x110B, 0x116B, 0x11B1], NFKC: [0xC666], NFKD: [0x110B, 0x116B, 0x11B1] }, +{ source: [0xC667], NFC: [0xC667], NFD: [0x110B, 0x116B, 0x11B2], NFKC: [0xC667], NFKD: [0x110B, 0x116B, 0x11B2] }, +{ source: [0xC668], NFC: [0xC668], NFD: [0x110B, 0x116B, 0x11B3], NFKC: [0xC668], NFKD: [0x110B, 0x116B, 0x11B3] }, +{ source: [0xC669], NFC: [0xC669], NFD: [0x110B, 0x116B, 0x11B4], NFKC: [0xC669], NFKD: [0x110B, 0x116B, 0x11B4] }, +{ source: [0xC66A], NFC: [0xC66A], NFD: [0x110B, 0x116B, 0x11B5], NFKC: [0xC66A], NFKD: [0x110B, 0x116B, 0x11B5] }, +{ source: [0xC66B], NFC: [0xC66B], NFD: [0x110B, 0x116B, 0x11B6], NFKC: [0xC66B], NFKD: [0x110B, 0x116B, 0x11B6] }, +{ source: [0xC66C], NFC: [0xC66C], NFD: [0x110B, 0x116B, 0x11B7], NFKC: [0xC66C], NFKD: [0x110B, 0x116B, 0x11B7] }, +{ source: [0xC66D], NFC: [0xC66D], NFD: [0x110B, 0x116B, 0x11B8], NFKC: [0xC66D], NFKD: [0x110B, 0x116B, 0x11B8] }, +{ source: [0xC66E], NFC: [0xC66E], NFD: [0x110B, 0x116B, 0x11B9], NFKC: [0xC66E], NFKD: [0x110B, 0x116B, 0x11B9] }, +{ source: [0xC66F], NFC: [0xC66F], NFD: [0x110B, 0x116B, 0x11BA], NFKC: [0xC66F], NFKD: [0x110B, 0x116B, 0x11BA] }, +{ source: [0xC670], NFC: [0xC670], NFD: [0x110B, 0x116B, 0x11BB], NFKC: [0xC670], NFKD: [0x110B, 0x116B, 0x11BB] }, +{ source: [0xC671], NFC: [0xC671], NFD: [0x110B, 0x116B, 0x11BC], NFKC: [0xC671], NFKD: [0x110B, 0x116B, 0x11BC] }, +{ source: [0xC672], NFC: [0xC672], NFD: [0x110B, 0x116B, 0x11BD], NFKC: [0xC672], NFKD: [0x110B, 0x116B, 0x11BD] }, +{ source: [0xC673], NFC: [0xC673], NFD: [0x110B, 0x116B, 0x11BE], NFKC: [0xC673], NFKD: [0x110B, 0x116B, 0x11BE] }, +{ source: [0xC674], NFC: [0xC674], NFD: [0x110B, 0x116B, 0x11BF], NFKC: [0xC674], NFKD: [0x110B, 0x116B, 0x11BF] }, +{ source: [0xC675], NFC: [0xC675], NFD: [0x110B, 0x116B, 0x11C0], NFKC: [0xC675], NFKD: [0x110B, 0x116B, 0x11C0] }, +{ source: [0xC676], NFC: [0xC676], NFD: [0x110B, 0x116B, 0x11C1], NFKC: [0xC676], NFKD: [0x110B, 0x116B, 0x11C1] }, +{ source: [0xC677], NFC: [0xC677], NFD: [0x110B, 0x116B, 0x11C2], NFKC: [0xC677], NFKD: [0x110B, 0x116B, 0x11C2] }, +{ source: [0xC678], NFC: [0xC678], NFD: [0x110B, 0x116C], NFKC: [0xC678], NFKD: [0x110B, 0x116C] }, +{ source: [0xC679], NFC: [0xC679], NFD: [0x110B, 0x116C, 0x11A8], NFKC: [0xC679], NFKD: [0x110B, 0x116C, 0x11A8] }, +{ source: [0xC67A], NFC: [0xC67A], NFD: [0x110B, 0x116C, 0x11A9], NFKC: [0xC67A], NFKD: [0x110B, 0x116C, 0x11A9] }, +{ source: [0xC67B], NFC: [0xC67B], NFD: [0x110B, 0x116C, 0x11AA], NFKC: [0xC67B], NFKD: [0x110B, 0x116C, 0x11AA] }, +{ source: [0xC67C], NFC: [0xC67C], NFD: [0x110B, 0x116C, 0x11AB], NFKC: [0xC67C], NFKD: [0x110B, 0x116C, 0x11AB] }, +{ source: [0xC67D], NFC: [0xC67D], NFD: [0x110B, 0x116C, 0x11AC], NFKC: [0xC67D], NFKD: [0x110B, 0x116C, 0x11AC] }, +{ source: [0xC67E], NFC: [0xC67E], NFD: [0x110B, 0x116C, 0x11AD], NFKC: [0xC67E], NFKD: [0x110B, 0x116C, 0x11AD] }, +{ source: [0xC67F], NFC: [0xC67F], NFD: [0x110B, 0x116C, 0x11AE], NFKC: [0xC67F], NFKD: [0x110B, 0x116C, 0x11AE] }, +{ source: [0xC680], NFC: [0xC680], NFD: [0x110B, 0x116C, 0x11AF], NFKC: [0xC680], NFKD: [0x110B, 0x116C, 0x11AF] }, +{ source: [0xC681], NFC: [0xC681], NFD: [0x110B, 0x116C, 0x11B0], NFKC: [0xC681], NFKD: [0x110B, 0x116C, 0x11B0] }, +{ source: [0xC682], NFC: [0xC682], NFD: [0x110B, 0x116C, 0x11B1], NFKC: [0xC682], NFKD: [0x110B, 0x116C, 0x11B1] }, +{ source: [0xC683], NFC: [0xC683], NFD: [0x110B, 0x116C, 0x11B2], NFKC: [0xC683], NFKD: [0x110B, 0x116C, 0x11B2] }, +{ source: [0xC684], NFC: [0xC684], NFD: [0x110B, 0x116C, 0x11B3], NFKC: [0xC684], NFKD: [0x110B, 0x116C, 0x11B3] }, +{ source: [0xC685], NFC: [0xC685], NFD: [0x110B, 0x116C, 0x11B4], NFKC: [0xC685], NFKD: [0x110B, 0x116C, 0x11B4] }, +{ source: [0xC686], NFC: [0xC686], NFD: [0x110B, 0x116C, 0x11B5], NFKC: [0xC686], NFKD: [0x110B, 0x116C, 0x11B5] }, +{ source: [0xC687], NFC: [0xC687], NFD: [0x110B, 0x116C, 0x11B6], NFKC: [0xC687], NFKD: [0x110B, 0x116C, 0x11B6] }, +{ source: [0xC688], NFC: [0xC688], NFD: [0x110B, 0x116C, 0x11B7], NFKC: [0xC688], NFKD: [0x110B, 0x116C, 0x11B7] }, +{ source: [0xC689], NFC: [0xC689], NFD: [0x110B, 0x116C, 0x11B8], NFKC: [0xC689], NFKD: [0x110B, 0x116C, 0x11B8] }, +{ source: [0xC68A], NFC: [0xC68A], NFD: [0x110B, 0x116C, 0x11B9], NFKC: [0xC68A], NFKD: [0x110B, 0x116C, 0x11B9] }, +{ source: [0xC68B], NFC: [0xC68B], NFD: [0x110B, 0x116C, 0x11BA], NFKC: [0xC68B], NFKD: [0x110B, 0x116C, 0x11BA] }, +{ source: [0xC68C], NFC: [0xC68C], NFD: [0x110B, 0x116C, 0x11BB], NFKC: [0xC68C], NFKD: [0x110B, 0x116C, 0x11BB] }, +{ source: [0xC68D], NFC: [0xC68D], NFD: [0x110B, 0x116C, 0x11BC], NFKC: [0xC68D], NFKD: [0x110B, 0x116C, 0x11BC] }, +{ source: [0xC68E], NFC: [0xC68E], NFD: [0x110B, 0x116C, 0x11BD], NFKC: [0xC68E], NFKD: [0x110B, 0x116C, 0x11BD] }, +{ source: [0xC68F], NFC: [0xC68F], NFD: [0x110B, 0x116C, 0x11BE], NFKC: [0xC68F], NFKD: [0x110B, 0x116C, 0x11BE] }, +{ source: [0xC690], NFC: [0xC690], NFD: [0x110B, 0x116C, 0x11BF], NFKC: [0xC690], NFKD: [0x110B, 0x116C, 0x11BF] }, +{ source: [0xC691], NFC: [0xC691], NFD: [0x110B, 0x116C, 0x11C0], NFKC: [0xC691], NFKD: [0x110B, 0x116C, 0x11C0] }, +{ source: [0xC692], NFC: [0xC692], NFD: [0x110B, 0x116C, 0x11C1], NFKC: [0xC692], NFKD: [0x110B, 0x116C, 0x11C1] }, +{ source: [0xC693], NFC: [0xC693], NFD: [0x110B, 0x116C, 0x11C2], NFKC: [0xC693], NFKD: [0x110B, 0x116C, 0x11C2] }, +{ source: [0xC694], NFC: [0xC694], NFD: [0x110B, 0x116D], NFKC: [0xC694], NFKD: [0x110B, 0x116D] }, +{ source: [0xC695], NFC: [0xC695], NFD: [0x110B, 0x116D, 0x11A8], NFKC: [0xC695], NFKD: [0x110B, 0x116D, 0x11A8] }, +{ source: [0xC696], NFC: [0xC696], NFD: [0x110B, 0x116D, 0x11A9], NFKC: [0xC696], NFKD: [0x110B, 0x116D, 0x11A9] }, +{ source: [0xC697], NFC: [0xC697], NFD: [0x110B, 0x116D, 0x11AA], NFKC: [0xC697], NFKD: [0x110B, 0x116D, 0x11AA] }, +{ source: [0xC698], NFC: [0xC698], NFD: [0x110B, 0x116D, 0x11AB], NFKC: [0xC698], NFKD: [0x110B, 0x116D, 0x11AB] }, +{ source: [0xC699], NFC: [0xC699], NFD: [0x110B, 0x116D, 0x11AC], NFKC: [0xC699], NFKD: [0x110B, 0x116D, 0x11AC] }, +{ source: [0xC69A], NFC: [0xC69A], NFD: [0x110B, 0x116D, 0x11AD], NFKC: [0xC69A], NFKD: [0x110B, 0x116D, 0x11AD] }, +{ source: [0xC69B], NFC: [0xC69B], NFD: [0x110B, 0x116D, 0x11AE], NFKC: [0xC69B], NFKD: [0x110B, 0x116D, 0x11AE] }, +{ source: [0xC69C], NFC: [0xC69C], NFD: [0x110B, 0x116D, 0x11AF], NFKC: [0xC69C], NFKD: [0x110B, 0x116D, 0x11AF] }, +{ source: [0xC69D], NFC: [0xC69D], NFD: [0x110B, 0x116D, 0x11B0], NFKC: [0xC69D], NFKD: [0x110B, 0x116D, 0x11B0] }, +{ source: [0xC69E], NFC: [0xC69E], NFD: [0x110B, 0x116D, 0x11B1], NFKC: [0xC69E], NFKD: [0x110B, 0x116D, 0x11B1] }, +{ source: [0xC69F], NFC: [0xC69F], NFD: [0x110B, 0x116D, 0x11B2], NFKC: [0xC69F], NFKD: [0x110B, 0x116D, 0x11B2] }, +{ source: [0xC6A0], NFC: [0xC6A0], NFD: [0x110B, 0x116D, 0x11B3], NFKC: [0xC6A0], NFKD: [0x110B, 0x116D, 0x11B3] }, +{ source: [0xC6A1], NFC: [0xC6A1], NFD: [0x110B, 0x116D, 0x11B4], NFKC: [0xC6A1], NFKD: [0x110B, 0x116D, 0x11B4] }, +{ source: [0xC6A2], NFC: [0xC6A2], NFD: [0x110B, 0x116D, 0x11B5], NFKC: [0xC6A2], NFKD: [0x110B, 0x116D, 0x11B5] }, +{ source: [0xC6A3], NFC: [0xC6A3], NFD: [0x110B, 0x116D, 0x11B6], NFKC: [0xC6A3], NFKD: [0x110B, 0x116D, 0x11B6] }, +{ source: [0xC6A4], NFC: [0xC6A4], NFD: [0x110B, 0x116D, 0x11B7], NFKC: [0xC6A4], NFKD: [0x110B, 0x116D, 0x11B7] }, +{ source: [0xC6A5], NFC: [0xC6A5], NFD: [0x110B, 0x116D, 0x11B8], NFKC: [0xC6A5], NFKD: [0x110B, 0x116D, 0x11B8] }, +{ source: [0xC6A6], NFC: [0xC6A6], NFD: [0x110B, 0x116D, 0x11B9], NFKC: [0xC6A6], NFKD: [0x110B, 0x116D, 0x11B9] }, +{ source: [0xC6A7], NFC: [0xC6A7], NFD: [0x110B, 0x116D, 0x11BA], NFKC: [0xC6A7], NFKD: [0x110B, 0x116D, 0x11BA] }, +{ source: [0xC6A8], NFC: [0xC6A8], NFD: [0x110B, 0x116D, 0x11BB], NFKC: [0xC6A8], NFKD: [0x110B, 0x116D, 0x11BB] }, +{ source: [0xC6A9], NFC: [0xC6A9], NFD: [0x110B, 0x116D, 0x11BC], NFKC: [0xC6A9], NFKD: [0x110B, 0x116D, 0x11BC] }, +{ source: [0xC6AA], NFC: [0xC6AA], NFD: [0x110B, 0x116D, 0x11BD], NFKC: [0xC6AA], NFKD: [0x110B, 0x116D, 0x11BD] }, +{ source: [0xC6AB], NFC: [0xC6AB], NFD: [0x110B, 0x116D, 0x11BE], NFKC: [0xC6AB], NFKD: [0x110B, 0x116D, 0x11BE] }, +{ source: [0xC6AC], NFC: [0xC6AC], NFD: [0x110B, 0x116D, 0x11BF], NFKC: [0xC6AC], NFKD: [0x110B, 0x116D, 0x11BF] }, +{ source: [0xC6AD], NFC: [0xC6AD], NFD: [0x110B, 0x116D, 0x11C0], NFKC: [0xC6AD], NFKD: [0x110B, 0x116D, 0x11C0] }, +{ source: [0xC6AE], NFC: [0xC6AE], NFD: [0x110B, 0x116D, 0x11C1], NFKC: [0xC6AE], NFKD: [0x110B, 0x116D, 0x11C1] }, +{ source: [0xC6AF], NFC: [0xC6AF], NFD: [0x110B, 0x116D, 0x11C2], NFKC: [0xC6AF], NFKD: [0x110B, 0x116D, 0x11C2] }, +{ source: [0xC6B0], NFC: [0xC6B0], NFD: [0x110B, 0x116E], NFKC: [0xC6B0], NFKD: [0x110B, 0x116E] }, +{ source: [0xC6B1], NFC: [0xC6B1], NFD: [0x110B, 0x116E, 0x11A8], NFKC: [0xC6B1], NFKD: [0x110B, 0x116E, 0x11A8] }, +{ source: [0xC6B2], NFC: [0xC6B2], NFD: [0x110B, 0x116E, 0x11A9], NFKC: [0xC6B2], NFKD: [0x110B, 0x116E, 0x11A9] }, +{ source: [0xC6B3], NFC: [0xC6B3], NFD: [0x110B, 0x116E, 0x11AA], NFKC: [0xC6B3], NFKD: [0x110B, 0x116E, 0x11AA] }, +{ source: [0xC6B4], NFC: [0xC6B4], NFD: [0x110B, 0x116E, 0x11AB], NFKC: [0xC6B4], NFKD: [0x110B, 0x116E, 0x11AB] }, +{ source: [0xC6B5], NFC: [0xC6B5], NFD: [0x110B, 0x116E, 0x11AC], NFKC: [0xC6B5], NFKD: [0x110B, 0x116E, 0x11AC] }, +{ source: [0xC6B6], NFC: [0xC6B6], NFD: [0x110B, 0x116E, 0x11AD], NFKC: [0xC6B6], NFKD: [0x110B, 0x116E, 0x11AD] }, +{ source: [0xC6B7], NFC: [0xC6B7], NFD: [0x110B, 0x116E, 0x11AE], NFKC: [0xC6B7], NFKD: [0x110B, 0x116E, 0x11AE] }, +{ source: [0xC6B8], NFC: [0xC6B8], NFD: [0x110B, 0x116E, 0x11AF], NFKC: [0xC6B8], NFKD: [0x110B, 0x116E, 0x11AF] }, +{ source: [0xC6B9], NFC: [0xC6B9], NFD: [0x110B, 0x116E, 0x11B0], NFKC: [0xC6B9], NFKD: [0x110B, 0x116E, 0x11B0] }, +{ source: [0xC6BA], NFC: [0xC6BA], NFD: [0x110B, 0x116E, 0x11B1], NFKC: [0xC6BA], NFKD: [0x110B, 0x116E, 0x11B1] }, +{ source: [0xC6BB], NFC: [0xC6BB], NFD: [0x110B, 0x116E, 0x11B2], NFKC: [0xC6BB], NFKD: [0x110B, 0x116E, 0x11B2] }, +{ source: [0xC6BC], NFC: [0xC6BC], NFD: [0x110B, 0x116E, 0x11B3], NFKC: [0xC6BC], NFKD: [0x110B, 0x116E, 0x11B3] }, +{ source: [0xC6BD], NFC: [0xC6BD], NFD: [0x110B, 0x116E, 0x11B4], NFKC: [0xC6BD], NFKD: [0x110B, 0x116E, 0x11B4] }, +{ source: [0xC6BE], NFC: [0xC6BE], NFD: [0x110B, 0x116E, 0x11B5], NFKC: [0xC6BE], NFKD: [0x110B, 0x116E, 0x11B5] }, +{ source: [0xC6BF], NFC: [0xC6BF], NFD: [0x110B, 0x116E, 0x11B6], NFKC: [0xC6BF], NFKD: [0x110B, 0x116E, 0x11B6] }, +{ source: [0xC6C0], NFC: [0xC6C0], NFD: [0x110B, 0x116E, 0x11B7], NFKC: [0xC6C0], NFKD: [0x110B, 0x116E, 0x11B7] }, +{ source: [0xC6C1], NFC: [0xC6C1], NFD: [0x110B, 0x116E, 0x11B8], NFKC: [0xC6C1], NFKD: [0x110B, 0x116E, 0x11B8] }, +{ source: [0xC6C2], NFC: [0xC6C2], NFD: [0x110B, 0x116E, 0x11B9], NFKC: [0xC6C2], NFKD: [0x110B, 0x116E, 0x11B9] }, +{ source: [0xC6C3], NFC: [0xC6C3], NFD: [0x110B, 0x116E, 0x11BA], NFKC: [0xC6C3], NFKD: [0x110B, 0x116E, 0x11BA] }, +{ source: [0xC6C4], NFC: [0xC6C4], NFD: [0x110B, 0x116E, 0x11BB], NFKC: [0xC6C4], NFKD: [0x110B, 0x116E, 0x11BB] }, +{ source: [0xC6C5], NFC: [0xC6C5], NFD: [0x110B, 0x116E, 0x11BC], NFKC: [0xC6C5], NFKD: [0x110B, 0x116E, 0x11BC] }, +{ source: [0xC6C6], NFC: [0xC6C6], NFD: [0x110B, 0x116E, 0x11BD], NFKC: [0xC6C6], NFKD: [0x110B, 0x116E, 0x11BD] }, +{ source: [0xC6C7], NFC: [0xC6C7], NFD: [0x110B, 0x116E, 0x11BE], NFKC: [0xC6C7], NFKD: [0x110B, 0x116E, 0x11BE] }, +{ source: [0xC6C8], NFC: [0xC6C8], NFD: [0x110B, 0x116E, 0x11BF], NFKC: [0xC6C8], NFKD: [0x110B, 0x116E, 0x11BF] }, +{ source: [0xC6C9], NFC: [0xC6C9], NFD: [0x110B, 0x116E, 0x11C0], NFKC: [0xC6C9], NFKD: [0x110B, 0x116E, 0x11C0] }, +{ source: [0xC6CA], NFC: [0xC6CA], NFD: [0x110B, 0x116E, 0x11C1], NFKC: [0xC6CA], NFKD: [0x110B, 0x116E, 0x11C1] }, +{ source: [0xC6CB], NFC: [0xC6CB], NFD: [0x110B, 0x116E, 0x11C2], NFKC: [0xC6CB], NFKD: [0x110B, 0x116E, 0x11C2] }, +{ source: [0xC6CC], NFC: [0xC6CC], NFD: [0x110B, 0x116F], NFKC: [0xC6CC], NFKD: [0x110B, 0x116F] }, +{ source: [0xC6CD], NFC: [0xC6CD], NFD: [0x110B, 0x116F, 0x11A8], NFKC: [0xC6CD], NFKD: [0x110B, 0x116F, 0x11A8] }, +{ source: [0xC6CE], NFC: [0xC6CE], NFD: [0x110B, 0x116F, 0x11A9], NFKC: [0xC6CE], NFKD: [0x110B, 0x116F, 0x11A9] }, +{ source: [0xC6CF], NFC: [0xC6CF], NFD: [0x110B, 0x116F, 0x11AA], NFKC: [0xC6CF], NFKD: [0x110B, 0x116F, 0x11AA] }, +{ source: [0xC6D0], NFC: [0xC6D0], NFD: [0x110B, 0x116F, 0x11AB], NFKC: [0xC6D0], NFKD: [0x110B, 0x116F, 0x11AB] }, +{ source: [0xC6D1], NFC: [0xC6D1], NFD: [0x110B, 0x116F, 0x11AC], NFKC: [0xC6D1], NFKD: [0x110B, 0x116F, 0x11AC] }, +{ source: [0xC6D2], NFC: [0xC6D2], NFD: [0x110B, 0x116F, 0x11AD], NFKC: [0xC6D2], NFKD: [0x110B, 0x116F, 0x11AD] }, +{ source: [0xC6D3], NFC: [0xC6D3], NFD: [0x110B, 0x116F, 0x11AE], NFKC: [0xC6D3], NFKD: [0x110B, 0x116F, 0x11AE] }, +{ source: [0xC6D4], NFC: [0xC6D4], NFD: [0x110B, 0x116F, 0x11AF], NFKC: [0xC6D4], NFKD: [0x110B, 0x116F, 0x11AF] }, +{ source: [0xC6D5], NFC: [0xC6D5], NFD: [0x110B, 0x116F, 0x11B0], NFKC: [0xC6D5], NFKD: [0x110B, 0x116F, 0x11B0] }, +{ source: [0xC6D6], NFC: [0xC6D6], NFD: [0x110B, 0x116F, 0x11B1], NFKC: [0xC6D6], NFKD: [0x110B, 0x116F, 0x11B1] }, +{ source: [0xC6D7], NFC: [0xC6D7], NFD: [0x110B, 0x116F, 0x11B2], NFKC: [0xC6D7], NFKD: [0x110B, 0x116F, 0x11B2] }, +{ source: [0xC6D8], NFC: [0xC6D8], NFD: [0x110B, 0x116F, 0x11B3], NFKC: [0xC6D8], NFKD: [0x110B, 0x116F, 0x11B3] }, +{ source: [0xC6D9], NFC: [0xC6D9], NFD: [0x110B, 0x116F, 0x11B4], NFKC: [0xC6D9], NFKD: [0x110B, 0x116F, 0x11B4] }, +{ source: [0xC6DA], NFC: [0xC6DA], NFD: [0x110B, 0x116F, 0x11B5], NFKC: [0xC6DA], NFKD: [0x110B, 0x116F, 0x11B5] }, +{ source: [0xC6DB], NFC: [0xC6DB], NFD: [0x110B, 0x116F, 0x11B6], NFKC: [0xC6DB], NFKD: [0x110B, 0x116F, 0x11B6] }, +{ source: [0xC6DC], NFC: [0xC6DC], NFD: [0x110B, 0x116F, 0x11B7], NFKC: [0xC6DC], NFKD: [0x110B, 0x116F, 0x11B7] }, +{ source: [0xC6DD], NFC: [0xC6DD], NFD: [0x110B, 0x116F, 0x11B8], NFKC: [0xC6DD], NFKD: [0x110B, 0x116F, 0x11B8] }, +{ source: [0xC6DE], NFC: [0xC6DE], NFD: [0x110B, 0x116F, 0x11B9], NFKC: [0xC6DE], NFKD: [0x110B, 0x116F, 0x11B9] }, +{ source: [0xC6DF], NFC: [0xC6DF], NFD: [0x110B, 0x116F, 0x11BA], NFKC: [0xC6DF], NFKD: [0x110B, 0x116F, 0x11BA] }, +{ source: [0xC6E0], NFC: [0xC6E0], NFD: [0x110B, 0x116F, 0x11BB], NFKC: [0xC6E0], NFKD: [0x110B, 0x116F, 0x11BB] }, +{ source: [0xC6E1], NFC: [0xC6E1], NFD: [0x110B, 0x116F, 0x11BC], NFKC: [0xC6E1], NFKD: [0x110B, 0x116F, 0x11BC] }, +{ source: [0xC6E2], NFC: [0xC6E2], NFD: [0x110B, 0x116F, 0x11BD], NFKC: [0xC6E2], NFKD: [0x110B, 0x116F, 0x11BD] }, +{ source: [0xC6E3], NFC: [0xC6E3], NFD: [0x110B, 0x116F, 0x11BE], NFKC: [0xC6E3], NFKD: [0x110B, 0x116F, 0x11BE] }, +{ source: [0xC6E4], NFC: [0xC6E4], NFD: [0x110B, 0x116F, 0x11BF], NFKC: [0xC6E4], NFKD: [0x110B, 0x116F, 0x11BF] }, +{ source: [0xC6E5], NFC: [0xC6E5], NFD: [0x110B, 0x116F, 0x11C0], NFKC: [0xC6E5], NFKD: [0x110B, 0x116F, 0x11C0] }, +{ source: [0xC6E6], NFC: [0xC6E6], NFD: [0x110B, 0x116F, 0x11C1], NFKC: [0xC6E6], NFKD: [0x110B, 0x116F, 0x11C1] }, +{ source: [0xC6E7], NFC: [0xC6E7], NFD: [0x110B, 0x116F, 0x11C2], NFKC: [0xC6E7], NFKD: [0x110B, 0x116F, 0x11C2] }, +{ source: [0xC6E8], NFC: [0xC6E8], NFD: [0x110B, 0x1170], NFKC: [0xC6E8], NFKD: [0x110B, 0x1170] }, +{ source: [0xC6E9], NFC: [0xC6E9], NFD: [0x110B, 0x1170, 0x11A8], NFKC: [0xC6E9], NFKD: [0x110B, 0x1170, 0x11A8] }, +{ source: [0xC6EA], NFC: [0xC6EA], NFD: [0x110B, 0x1170, 0x11A9], NFKC: [0xC6EA], NFKD: [0x110B, 0x1170, 0x11A9] }, +{ source: [0xC6EB], NFC: [0xC6EB], NFD: [0x110B, 0x1170, 0x11AA], NFKC: [0xC6EB], NFKD: [0x110B, 0x1170, 0x11AA] }, +{ source: [0xC6EC], NFC: [0xC6EC], NFD: [0x110B, 0x1170, 0x11AB], NFKC: [0xC6EC], NFKD: [0x110B, 0x1170, 0x11AB] }, +{ source: [0xC6ED], NFC: [0xC6ED], NFD: [0x110B, 0x1170, 0x11AC], NFKC: [0xC6ED], NFKD: [0x110B, 0x1170, 0x11AC] }, +{ source: [0xC6EE], NFC: [0xC6EE], NFD: [0x110B, 0x1170, 0x11AD], NFKC: [0xC6EE], NFKD: [0x110B, 0x1170, 0x11AD] }, +{ source: [0xC6EF], NFC: [0xC6EF], NFD: [0x110B, 0x1170, 0x11AE], NFKC: [0xC6EF], NFKD: [0x110B, 0x1170, 0x11AE] }, +{ source: [0xC6F0], NFC: [0xC6F0], NFD: [0x110B, 0x1170, 0x11AF], NFKC: [0xC6F0], NFKD: [0x110B, 0x1170, 0x11AF] }, +{ source: [0xC6F1], NFC: [0xC6F1], NFD: [0x110B, 0x1170, 0x11B0], NFKC: [0xC6F1], NFKD: [0x110B, 0x1170, 0x11B0] }, +{ source: [0xC6F2], NFC: [0xC6F2], NFD: [0x110B, 0x1170, 0x11B1], NFKC: [0xC6F2], NFKD: [0x110B, 0x1170, 0x11B1] }, +{ source: [0xC6F3], NFC: [0xC6F3], NFD: [0x110B, 0x1170, 0x11B2], NFKC: [0xC6F3], NFKD: [0x110B, 0x1170, 0x11B2] }, +{ source: [0xC6F4], NFC: [0xC6F4], NFD: [0x110B, 0x1170, 0x11B3], NFKC: [0xC6F4], NFKD: [0x110B, 0x1170, 0x11B3] }, +{ source: [0xC6F5], NFC: [0xC6F5], NFD: [0x110B, 0x1170, 0x11B4], NFKC: [0xC6F5], NFKD: [0x110B, 0x1170, 0x11B4] }, +{ source: [0xC6F6], NFC: [0xC6F6], NFD: [0x110B, 0x1170, 0x11B5], NFKC: [0xC6F6], NFKD: [0x110B, 0x1170, 0x11B5] }, +{ source: [0xC6F7], NFC: [0xC6F7], NFD: [0x110B, 0x1170, 0x11B6], NFKC: [0xC6F7], NFKD: [0x110B, 0x1170, 0x11B6] }, +{ source: [0xC6F8], NFC: [0xC6F8], NFD: [0x110B, 0x1170, 0x11B7], NFKC: [0xC6F8], NFKD: [0x110B, 0x1170, 0x11B7] }, +{ source: [0xC6F9], NFC: [0xC6F9], NFD: [0x110B, 0x1170, 0x11B8], NFKC: [0xC6F9], NFKD: [0x110B, 0x1170, 0x11B8] }, +{ source: [0xC6FA], NFC: [0xC6FA], NFD: [0x110B, 0x1170, 0x11B9], NFKC: [0xC6FA], NFKD: [0x110B, 0x1170, 0x11B9] }, +{ source: [0xC6FB], NFC: [0xC6FB], NFD: [0x110B, 0x1170, 0x11BA], NFKC: [0xC6FB], NFKD: [0x110B, 0x1170, 0x11BA] }, +{ source: [0xC6FC], NFC: [0xC6FC], NFD: [0x110B, 0x1170, 0x11BB], NFKC: [0xC6FC], NFKD: [0x110B, 0x1170, 0x11BB] }, +{ source: [0xC6FD], NFC: [0xC6FD], NFD: [0x110B, 0x1170, 0x11BC], NFKC: [0xC6FD], NFKD: [0x110B, 0x1170, 0x11BC] }, +{ source: [0xC6FE], NFC: [0xC6FE], NFD: [0x110B, 0x1170, 0x11BD], NFKC: [0xC6FE], NFKD: [0x110B, 0x1170, 0x11BD] }, +{ source: [0xC6FF], NFC: [0xC6FF], NFD: [0x110B, 0x1170, 0x11BE], NFKC: [0xC6FF], NFKD: [0x110B, 0x1170, 0x11BE] }, +{ source: [0xC700], NFC: [0xC700], NFD: [0x110B, 0x1170, 0x11BF], NFKC: [0xC700], NFKD: [0x110B, 0x1170, 0x11BF] }, +{ source: [0xC701], NFC: [0xC701], NFD: [0x110B, 0x1170, 0x11C0], NFKC: [0xC701], NFKD: [0x110B, 0x1170, 0x11C0] }, +{ source: [0xC702], NFC: [0xC702], NFD: [0x110B, 0x1170, 0x11C1], NFKC: [0xC702], NFKD: [0x110B, 0x1170, 0x11C1] }, +{ source: [0xC703], NFC: [0xC703], NFD: [0x110B, 0x1170, 0x11C2], NFKC: [0xC703], NFKD: [0x110B, 0x1170, 0x11C2] }, +{ source: [0xC704], NFC: [0xC704], NFD: [0x110B, 0x1171], NFKC: [0xC704], NFKD: [0x110B, 0x1171] }, +{ source: [0xC705], NFC: [0xC705], NFD: [0x110B, 0x1171, 0x11A8], NFKC: [0xC705], NFKD: [0x110B, 0x1171, 0x11A8] }, +{ source: [0xC706], NFC: [0xC706], NFD: [0x110B, 0x1171, 0x11A9], NFKC: [0xC706], NFKD: [0x110B, 0x1171, 0x11A9] }, +{ source: [0xC707], NFC: [0xC707], NFD: [0x110B, 0x1171, 0x11AA], NFKC: [0xC707], NFKD: [0x110B, 0x1171, 0x11AA] }, +{ source: [0xC708], NFC: [0xC708], NFD: [0x110B, 0x1171, 0x11AB], NFKC: [0xC708], NFKD: [0x110B, 0x1171, 0x11AB] }, +{ source: [0xC709], NFC: [0xC709], NFD: [0x110B, 0x1171, 0x11AC], NFKC: [0xC709], NFKD: [0x110B, 0x1171, 0x11AC] }, +{ source: [0xC70A], NFC: [0xC70A], NFD: [0x110B, 0x1171, 0x11AD], NFKC: [0xC70A], NFKD: [0x110B, 0x1171, 0x11AD] }, +{ source: [0xC70B], NFC: [0xC70B], NFD: [0x110B, 0x1171, 0x11AE], NFKC: [0xC70B], NFKD: [0x110B, 0x1171, 0x11AE] }, +{ source: [0xC70C], NFC: [0xC70C], NFD: [0x110B, 0x1171, 0x11AF], NFKC: [0xC70C], NFKD: [0x110B, 0x1171, 0x11AF] }, +{ source: [0xC70D], NFC: [0xC70D], NFD: [0x110B, 0x1171, 0x11B0], NFKC: [0xC70D], NFKD: [0x110B, 0x1171, 0x11B0] }, +{ source: [0xC70E], NFC: [0xC70E], NFD: [0x110B, 0x1171, 0x11B1], NFKC: [0xC70E], NFKD: [0x110B, 0x1171, 0x11B1] }, +{ source: [0xC70F], NFC: [0xC70F], NFD: [0x110B, 0x1171, 0x11B2], NFKC: [0xC70F], NFKD: [0x110B, 0x1171, 0x11B2] }, +{ source: [0xC710], NFC: [0xC710], NFD: [0x110B, 0x1171, 0x11B3], NFKC: [0xC710], NFKD: [0x110B, 0x1171, 0x11B3] }, +{ source: [0xC711], NFC: [0xC711], NFD: [0x110B, 0x1171, 0x11B4], NFKC: [0xC711], NFKD: [0x110B, 0x1171, 0x11B4] }, +{ source: [0xC712], NFC: [0xC712], NFD: [0x110B, 0x1171, 0x11B5], NFKC: [0xC712], NFKD: [0x110B, 0x1171, 0x11B5] }, +{ source: [0xC713], NFC: [0xC713], NFD: [0x110B, 0x1171, 0x11B6], NFKC: [0xC713], NFKD: [0x110B, 0x1171, 0x11B6] }, +{ source: [0xC714], NFC: [0xC714], NFD: [0x110B, 0x1171, 0x11B7], NFKC: [0xC714], NFKD: [0x110B, 0x1171, 0x11B7] }, +{ source: [0xC715], NFC: [0xC715], NFD: [0x110B, 0x1171, 0x11B8], NFKC: [0xC715], NFKD: [0x110B, 0x1171, 0x11B8] }, +{ source: [0xC716], NFC: [0xC716], NFD: [0x110B, 0x1171, 0x11B9], NFKC: [0xC716], NFKD: [0x110B, 0x1171, 0x11B9] }, +{ source: [0xC717], NFC: [0xC717], NFD: [0x110B, 0x1171, 0x11BA], NFKC: [0xC717], NFKD: [0x110B, 0x1171, 0x11BA] }, +{ source: [0xC718], NFC: [0xC718], NFD: [0x110B, 0x1171, 0x11BB], NFKC: [0xC718], NFKD: [0x110B, 0x1171, 0x11BB] }, +{ source: [0xC719], NFC: [0xC719], NFD: [0x110B, 0x1171, 0x11BC], NFKC: [0xC719], NFKD: [0x110B, 0x1171, 0x11BC] }, +{ source: [0xC71A], NFC: [0xC71A], NFD: [0x110B, 0x1171, 0x11BD], NFKC: [0xC71A], NFKD: [0x110B, 0x1171, 0x11BD] }, +{ source: [0xC71B], NFC: [0xC71B], NFD: [0x110B, 0x1171, 0x11BE], NFKC: [0xC71B], NFKD: [0x110B, 0x1171, 0x11BE] }, +{ source: [0xC71C], NFC: [0xC71C], NFD: [0x110B, 0x1171, 0x11BF], NFKC: [0xC71C], NFKD: [0x110B, 0x1171, 0x11BF] }, +{ source: [0xC71D], NFC: [0xC71D], NFD: [0x110B, 0x1171, 0x11C0], NFKC: [0xC71D], NFKD: [0x110B, 0x1171, 0x11C0] }, +{ source: [0xC71E], NFC: [0xC71E], NFD: [0x110B, 0x1171, 0x11C1], NFKC: [0xC71E], NFKD: [0x110B, 0x1171, 0x11C1] }, +{ source: [0xC71F], NFC: [0xC71F], NFD: [0x110B, 0x1171, 0x11C2], NFKC: [0xC71F], NFKD: [0x110B, 0x1171, 0x11C2] }, +{ source: [0xC720], NFC: [0xC720], NFD: [0x110B, 0x1172], NFKC: [0xC720], NFKD: [0x110B, 0x1172] }, +{ source: [0xC721], NFC: [0xC721], NFD: [0x110B, 0x1172, 0x11A8], NFKC: [0xC721], NFKD: [0x110B, 0x1172, 0x11A8] }, +{ source: [0xC722], NFC: [0xC722], NFD: [0x110B, 0x1172, 0x11A9], NFKC: [0xC722], NFKD: [0x110B, 0x1172, 0x11A9] }, +{ source: [0xC723], NFC: [0xC723], NFD: [0x110B, 0x1172, 0x11AA], NFKC: [0xC723], NFKD: [0x110B, 0x1172, 0x11AA] }, +{ source: [0xC724], NFC: [0xC724], NFD: [0x110B, 0x1172, 0x11AB], NFKC: [0xC724], NFKD: [0x110B, 0x1172, 0x11AB] }, +{ source: [0xC725], NFC: [0xC725], NFD: [0x110B, 0x1172, 0x11AC], NFKC: [0xC725], NFKD: [0x110B, 0x1172, 0x11AC] }, +{ source: [0xC726], NFC: [0xC726], NFD: [0x110B, 0x1172, 0x11AD], NFKC: [0xC726], NFKD: [0x110B, 0x1172, 0x11AD] }, +{ source: [0xC727], NFC: [0xC727], NFD: [0x110B, 0x1172, 0x11AE], NFKC: [0xC727], NFKD: [0x110B, 0x1172, 0x11AE] }, +{ source: [0xC728], NFC: [0xC728], NFD: [0x110B, 0x1172, 0x11AF], NFKC: [0xC728], NFKD: [0x110B, 0x1172, 0x11AF] }, +{ source: [0xC729], NFC: [0xC729], NFD: [0x110B, 0x1172, 0x11B0], NFKC: [0xC729], NFKD: [0x110B, 0x1172, 0x11B0] }, +{ source: [0xC72A], NFC: [0xC72A], NFD: [0x110B, 0x1172, 0x11B1], NFKC: [0xC72A], NFKD: [0x110B, 0x1172, 0x11B1] }, +{ source: [0xC72B], NFC: [0xC72B], NFD: [0x110B, 0x1172, 0x11B2], NFKC: [0xC72B], NFKD: [0x110B, 0x1172, 0x11B2] }, +{ source: [0xC72C], NFC: [0xC72C], NFD: [0x110B, 0x1172, 0x11B3], NFKC: [0xC72C], NFKD: [0x110B, 0x1172, 0x11B3] }, +{ source: [0xC72D], NFC: [0xC72D], NFD: [0x110B, 0x1172, 0x11B4], NFKC: [0xC72D], NFKD: [0x110B, 0x1172, 0x11B4] }, +{ source: [0xC72E], NFC: [0xC72E], NFD: [0x110B, 0x1172, 0x11B5], NFKC: [0xC72E], NFKD: [0x110B, 0x1172, 0x11B5] }, +{ source: [0xC72F], NFC: [0xC72F], NFD: [0x110B, 0x1172, 0x11B6], NFKC: [0xC72F], NFKD: [0x110B, 0x1172, 0x11B6] }, +{ source: [0xC730], NFC: [0xC730], NFD: [0x110B, 0x1172, 0x11B7], NFKC: [0xC730], NFKD: [0x110B, 0x1172, 0x11B7] }, +{ source: [0xC731], NFC: [0xC731], NFD: [0x110B, 0x1172, 0x11B8], NFKC: [0xC731], NFKD: [0x110B, 0x1172, 0x11B8] }, +{ source: [0xC732], NFC: [0xC732], NFD: [0x110B, 0x1172, 0x11B9], NFKC: [0xC732], NFKD: [0x110B, 0x1172, 0x11B9] }, +{ source: [0xC733], NFC: [0xC733], NFD: [0x110B, 0x1172, 0x11BA], NFKC: [0xC733], NFKD: [0x110B, 0x1172, 0x11BA] }, +{ source: [0xC734], NFC: [0xC734], NFD: [0x110B, 0x1172, 0x11BB], NFKC: [0xC734], NFKD: [0x110B, 0x1172, 0x11BB] }, +{ source: [0xC735], NFC: [0xC735], NFD: [0x110B, 0x1172, 0x11BC], NFKC: [0xC735], NFKD: [0x110B, 0x1172, 0x11BC] }, +{ source: [0xC736], NFC: [0xC736], NFD: [0x110B, 0x1172, 0x11BD], NFKC: [0xC736], NFKD: [0x110B, 0x1172, 0x11BD] }, +{ source: [0xC737], NFC: [0xC737], NFD: [0x110B, 0x1172, 0x11BE], NFKC: [0xC737], NFKD: [0x110B, 0x1172, 0x11BE] }, +{ source: [0xC738], NFC: [0xC738], NFD: [0x110B, 0x1172, 0x11BF], NFKC: [0xC738], NFKD: [0x110B, 0x1172, 0x11BF] }, +{ source: [0xC739], NFC: [0xC739], NFD: [0x110B, 0x1172, 0x11C0], NFKC: [0xC739], NFKD: [0x110B, 0x1172, 0x11C0] }, +{ source: [0xC73A], NFC: [0xC73A], NFD: [0x110B, 0x1172, 0x11C1], NFKC: [0xC73A], NFKD: [0x110B, 0x1172, 0x11C1] }, +{ source: [0xC73B], NFC: [0xC73B], NFD: [0x110B, 0x1172, 0x11C2], NFKC: [0xC73B], NFKD: [0x110B, 0x1172, 0x11C2] }, +{ source: [0xC73C], NFC: [0xC73C], NFD: [0x110B, 0x1173], NFKC: [0xC73C], NFKD: [0x110B, 0x1173] }, +{ source: [0xC73D], NFC: [0xC73D], NFD: [0x110B, 0x1173, 0x11A8], NFKC: [0xC73D], NFKD: [0x110B, 0x1173, 0x11A8] }, +{ source: [0xC73E], NFC: [0xC73E], NFD: [0x110B, 0x1173, 0x11A9], NFKC: [0xC73E], NFKD: [0x110B, 0x1173, 0x11A9] }, +{ source: [0xC73F], NFC: [0xC73F], NFD: [0x110B, 0x1173, 0x11AA], NFKC: [0xC73F], NFKD: [0x110B, 0x1173, 0x11AA] }, +{ source: [0xC740], NFC: [0xC740], NFD: [0x110B, 0x1173, 0x11AB], NFKC: [0xC740], NFKD: [0x110B, 0x1173, 0x11AB] }, +{ source: [0xC741], NFC: [0xC741], NFD: [0x110B, 0x1173, 0x11AC], NFKC: [0xC741], NFKD: [0x110B, 0x1173, 0x11AC] }, +{ source: [0xC742], NFC: [0xC742], NFD: [0x110B, 0x1173, 0x11AD], NFKC: [0xC742], NFKD: [0x110B, 0x1173, 0x11AD] }, +{ source: [0xC743], NFC: [0xC743], NFD: [0x110B, 0x1173, 0x11AE], NFKC: [0xC743], NFKD: [0x110B, 0x1173, 0x11AE] }, +{ source: [0xC744], NFC: [0xC744], NFD: [0x110B, 0x1173, 0x11AF], NFKC: [0xC744], NFKD: [0x110B, 0x1173, 0x11AF] }, +{ source: [0xC745], NFC: [0xC745], NFD: [0x110B, 0x1173, 0x11B0], NFKC: [0xC745], NFKD: [0x110B, 0x1173, 0x11B0] }, +{ source: [0xC746], NFC: [0xC746], NFD: [0x110B, 0x1173, 0x11B1], NFKC: [0xC746], NFKD: [0x110B, 0x1173, 0x11B1] }, +{ source: [0xC747], NFC: [0xC747], NFD: [0x110B, 0x1173, 0x11B2], NFKC: [0xC747], NFKD: [0x110B, 0x1173, 0x11B2] }, +{ source: [0xC748], NFC: [0xC748], NFD: [0x110B, 0x1173, 0x11B3], NFKC: [0xC748], NFKD: [0x110B, 0x1173, 0x11B3] }, +{ source: [0xC749], NFC: [0xC749], NFD: [0x110B, 0x1173, 0x11B4], NFKC: [0xC749], NFKD: [0x110B, 0x1173, 0x11B4] }, +{ source: [0xC74A], NFC: [0xC74A], NFD: [0x110B, 0x1173, 0x11B5], NFKC: [0xC74A], NFKD: [0x110B, 0x1173, 0x11B5] }, +{ source: [0xC74B], NFC: [0xC74B], NFD: [0x110B, 0x1173, 0x11B6], NFKC: [0xC74B], NFKD: [0x110B, 0x1173, 0x11B6] }, +{ source: [0xC74C], NFC: [0xC74C], NFD: [0x110B, 0x1173, 0x11B7], NFKC: [0xC74C], NFKD: [0x110B, 0x1173, 0x11B7] }, +{ source: [0xC74D], NFC: [0xC74D], NFD: [0x110B, 0x1173, 0x11B8], NFKC: [0xC74D], NFKD: [0x110B, 0x1173, 0x11B8] }, +{ source: [0xC74E], NFC: [0xC74E], NFD: [0x110B, 0x1173, 0x11B9], NFKC: [0xC74E], NFKD: [0x110B, 0x1173, 0x11B9] }, +{ source: [0xC74F], NFC: [0xC74F], NFD: [0x110B, 0x1173, 0x11BA], NFKC: [0xC74F], NFKD: [0x110B, 0x1173, 0x11BA] }, +{ source: [0xC750], NFC: [0xC750], NFD: [0x110B, 0x1173, 0x11BB], NFKC: [0xC750], NFKD: [0x110B, 0x1173, 0x11BB] }, +{ source: [0xC751], NFC: [0xC751], NFD: [0x110B, 0x1173, 0x11BC], NFKC: [0xC751], NFKD: [0x110B, 0x1173, 0x11BC] }, +{ source: [0xC752], NFC: [0xC752], NFD: [0x110B, 0x1173, 0x11BD], NFKC: [0xC752], NFKD: [0x110B, 0x1173, 0x11BD] }, +{ source: [0xC753], NFC: [0xC753], NFD: [0x110B, 0x1173, 0x11BE], NFKC: [0xC753], NFKD: [0x110B, 0x1173, 0x11BE] }, +{ source: [0xC754], NFC: [0xC754], NFD: [0x110B, 0x1173, 0x11BF], NFKC: [0xC754], NFKD: [0x110B, 0x1173, 0x11BF] }, +{ source: [0xC755], NFC: [0xC755], NFD: [0x110B, 0x1173, 0x11C0], NFKC: [0xC755], NFKD: [0x110B, 0x1173, 0x11C0] }, +{ source: [0xC756], NFC: [0xC756], NFD: [0x110B, 0x1173, 0x11C1], NFKC: [0xC756], NFKD: [0x110B, 0x1173, 0x11C1] }, +{ source: [0xC757], NFC: [0xC757], NFD: [0x110B, 0x1173, 0x11C2], NFKC: [0xC757], NFKD: [0x110B, 0x1173, 0x11C2] }, +{ source: [0xC758], NFC: [0xC758], NFD: [0x110B, 0x1174], NFKC: [0xC758], NFKD: [0x110B, 0x1174] }, +{ source: [0xC759], NFC: [0xC759], NFD: [0x110B, 0x1174, 0x11A8], NFKC: [0xC759], NFKD: [0x110B, 0x1174, 0x11A8] }, +{ source: [0xC75A], NFC: [0xC75A], NFD: [0x110B, 0x1174, 0x11A9], NFKC: [0xC75A], NFKD: [0x110B, 0x1174, 0x11A9] }, +{ source: [0xC75B], NFC: [0xC75B], NFD: [0x110B, 0x1174, 0x11AA], NFKC: [0xC75B], NFKD: [0x110B, 0x1174, 0x11AA] }, +{ source: [0xC75C], NFC: [0xC75C], NFD: [0x110B, 0x1174, 0x11AB], NFKC: [0xC75C], NFKD: [0x110B, 0x1174, 0x11AB] }, +{ source: [0xC75D], NFC: [0xC75D], NFD: [0x110B, 0x1174, 0x11AC], NFKC: [0xC75D], NFKD: [0x110B, 0x1174, 0x11AC] }, +{ source: [0xC75E], NFC: [0xC75E], NFD: [0x110B, 0x1174, 0x11AD], NFKC: [0xC75E], NFKD: [0x110B, 0x1174, 0x11AD] }, +{ source: [0xC75F], NFC: [0xC75F], NFD: [0x110B, 0x1174, 0x11AE], NFKC: [0xC75F], NFKD: [0x110B, 0x1174, 0x11AE] }, +{ source: [0xC760], NFC: [0xC760], NFD: [0x110B, 0x1174, 0x11AF], NFKC: [0xC760], NFKD: [0x110B, 0x1174, 0x11AF] }, +{ source: [0xC761], NFC: [0xC761], NFD: [0x110B, 0x1174, 0x11B0], NFKC: [0xC761], NFKD: [0x110B, 0x1174, 0x11B0] }, +{ source: [0xC762], NFC: [0xC762], NFD: [0x110B, 0x1174, 0x11B1], NFKC: [0xC762], NFKD: [0x110B, 0x1174, 0x11B1] }, +{ source: [0xC763], NFC: [0xC763], NFD: [0x110B, 0x1174, 0x11B2], NFKC: [0xC763], NFKD: [0x110B, 0x1174, 0x11B2] }, +{ source: [0xC764], NFC: [0xC764], NFD: [0x110B, 0x1174, 0x11B3], NFKC: [0xC764], NFKD: [0x110B, 0x1174, 0x11B3] }, +{ source: [0xC765], NFC: [0xC765], NFD: [0x110B, 0x1174, 0x11B4], NFKC: [0xC765], NFKD: [0x110B, 0x1174, 0x11B4] }, +{ source: [0xC766], NFC: [0xC766], NFD: [0x110B, 0x1174, 0x11B5], NFKC: [0xC766], NFKD: [0x110B, 0x1174, 0x11B5] }, +{ source: [0xC767], NFC: [0xC767], NFD: [0x110B, 0x1174, 0x11B6], NFKC: [0xC767], NFKD: [0x110B, 0x1174, 0x11B6] }, +{ source: [0xC768], NFC: [0xC768], NFD: [0x110B, 0x1174, 0x11B7], NFKC: [0xC768], NFKD: [0x110B, 0x1174, 0x11B7] }, +{ source: [0xC769], NFC: [0xC769], NFD: [0x110B, 0x1174, 0x11B8], NFKC: [0xC769], NFKD: [0x110B, 0x1174, 0x11B8] }, +{ source: [0xC76A], NFC: [0xC76A], NFD: [0x110B, 0x1174, 0x11B9], NFKC: [0xC76A], NFKD: [0x110B, 0x1174, 0x11B9] }, +{ source: [0xC76B], NFC: [0xC76B], NFD: [0x110B, 0x1174, 0x11BA], NFKC: [0xC76B], NFKD: [0x110B, 0x1174, 0x11BA] }, +{ source: [0xC76C], NFC: [0xC76C], NFD: [0x110B, 0x1174, 0x11BB], NFKC: [0xC76C], NFKD: [0x110B, 0x1174, 0x11BB] }, +{ source: [0xC76D], NFC: [0xC76D], NFD: [0x110B, 0x1174, 0x11BC], NFKC: [0xC76D], NFKD: [0x110B, 0x1174, 0x11BC] }, +{ source: [0xC76E], NFC: [0xC76E], NFD: [0x110B, 0x1174, 0x11BD], NFKC: [0xC76E], NFKD: [0x110B, 0x1174, 0x11BD] }, +{ source: [0xC76F], NFC: [0xC76F], NFD: [0x110B, 0x1174, 0x11BE], NFKC: [0xC76F], NFKD: [0x110B, 0x1174, 0x11BE] }, +{ source: [0xC770], NFC: [0xC770], NFD: [0x110B, 0x1174, 0x11BF], NFKC: [0xC770], NFKD: [0x110B, 0x1174, 0x11BF] }, +{ source: [0xC771], NFC: [0xC771], NFD: [0x110B, 0x1174, 0x11C0], NFKC: [0xC771], NFKD: [0x110B, 0x1174, 0x11C0] }, +{ source: [0xC772], NFC: [0xC772], NFD: [0x110B, 0x1174, 0x11C1], NFKC: [0xC772], NFKD: [0x110B, 0x1174, 0x11C1] }, +{ source: [0xC773], NFC: [0xC773], NFD: [0x110B, 0x1174, 0x11C2], NFKC: [0xC773], NFKD: [0x110B, 0x1174, 0x11C2] }, +{ source: [0xC774], NFC: [0xC774], NFD: [0x110B, 0x1175], NFKC: [0xC774], NFKD: [0x110B, 0x1175] }, +{ source: [0xC775], NFC: [0xC775], NFD: [0x110B, 0x1175, 0x11A8], NFKC: [0xC775], NFKD: [0x110B, 0x1175, 0x11A8] }, +{ source: [0xC776], NFC: [0xC776], NFD: [0x110B, 0x1175, 0x11A9], NFKC: [0xC776], NFKD: [0x110B, 0x1175, 0x11A9] }, +{ source: [0xC777], NFC: [0xC777], NFD: [0x110B, 0x1175, 0x11AA], NFKC: [0xC777], NFKD: [0x110B, 0x1175, 0x11AA] }, +{ source: [0xC778], NFC: [0xC778], NFD: [0x110B, 0x1175, 0x11AB], NFKC: [0xC778], NFKD: [0x110B, 0x1175, 0x11AB] }, +{ source: [0xC779], NFC: [0xC779], NFD: [0x110B, 0x1175, 0x11AC], NFKC: [0xC779], NFKD: [0x110B, 0x1175, 0x11AC] }, +{ source: [0xC77A], NFC: [0xC77A], NFD: [0x110B, 0x1175, 0x11AD], NFKC: [0xC77A], NFKD: [0x110B, 0x1175, 0x11AD] }, +{ source: [0xC77B], NFC: [0xC77B], NFD: [0x110B, 0x1175, 0x11AE], NFKC: [0xC77B], NFKD: [0x110B, 0x1175, 0x11AE] }, +{ source: [0xC77C], NFC: [0xC77C], NFD: [0x110B, 0x1175, 0x11AF], NFKC: [0xC77C], NFKD: [0x110B, 0x1175, 0x11AF] }, +{ source: [0xC77D], NFC: [0xC77D], NFD: [0x110B, 0x1175, 0x11B0], NFKC: [0xC77D], NFKD: [0x110B, 0x1175, 0x11B0] }, +{ source: [0xC77E], NFC: [0xC77E], NFD: [0x110B, 0x1175, 0x11B1], NFKC: [0xC77E], NFKD: [0x110B, 0x1175, 0x11B1] }, +{ source: [0xC77F], NFC: [0xC77F], NFD: [0x110B, 0x1175, 0x11B2], NFKC: [0xC77F], NFKD: [0x110B, 0x1175, 0x11B2] }, +{ source: [0xC780], NFC: [0xC780], NFD: [0x110B, 0x1175, 0x11B3], NFKC: [0xC780], NFKD: [0x110B, 0x1175, 0x11B3] }, +{ source: [0xC781], NFC: [0xC781], NFD: [0x110B, 0x1175, 0x11B4], NFKC: [0xC781], NFKD: [0x110B, 0x1175, 0x11B4] }, +{ source: [0xC782], NFC: [0xC782], NFD: [0x110B, 0x1175, 0x11B5], NFKC: [0xC782], NFKD: [0x110B, 0x1175, 0x11B5] }, +{ source: [0xC783], NFC: [0xC783], NFD: [0x110B, 0x1175, 0x11B6], NFKC: [0xC783], NFKD: [0x110B, 0x1175, 0x11B6] }, +{ source: [0xC784], NFC: [0xC784], NFD: [0x110B, 0x1175, 0x11B7], NFKC: [0xC784], NFKD: [0x110B, 0x1175, 0x11B7] }, +{ source: [0xC785], NFC: [0xC785], NFD: [0x110B, 0x1175, 0x11B8], NFKC: [0xC785], NFKD: [0x110B, 0x1175, 0x11B8] }, +{ source: [0xC786], NFC: [0xC786], NFD: [0x110B, 0x1175, 0x11B9], NFKC: [0xC786], NFKD: [0x110B, 0x1175, 0x11B9] }, +{ source: [0xC787], NFC: [0xC787], NFD: [0x110B, 0x1175, 0x11BA], NFKC: [0xC787], NFKD: [0x110B, 0x1175, 0x11BA] }, +{ source: [0xC788], NFC: [0xC788], NFD: [0x110B, 0x1175, 0x11BB], NFKC: [0xC788], NFKD: [0x110B, 0x1175, 0x11BB] }, +{ source: [0xC789], NFC: [0xC789], NFD: [0x110B, 0x1175, 0x11BC], NFKC: [0xC789], NFKD: [0x110B, 0x1175, 0x11BC] }, +{ source: [0xC78A], NFC: [0xC78A], NFD: [0x110B, 0x1175, 0x11BD], NFKC: [0xC78A], NFKD: [0x110B, 0x1175, 0x11BD] }, +{ source: [0xC78B], NFC: [0xC78B], NFD: [0x110B, 0x1175, 0x11BE], NFKC: [0xC78B], NFKD: [0x110B, 0x1175, 0x11BE] }, +{ source: [0xC78C], NFC: [0xC78C], NFD: [0x110B, 0x1175, 0x11BF], NFKC: [0xC78C], NFKD: [0x110B, 0x1175, 0x11BF] }, +{ source: [0xC78D], NFC: [0xC78D], NFD: [0x110B, 0x1175, 0x11C0], NFKC: [0xC78D], NFKD: [0x110B, 0x1175, 0x11C0] }, +{ source: [0xC78E], NFC: [0xC78E], NFD: [0x110B, 0x1175, 0x11C1], NFKC: [0xC78E], NFKD: [0x110B, 0x1175, 0x11C1] }, +{ source: [0xC78F], NFC: [0xC78F], NFD: [0x110B, 0x1175, 0x11C2], NFKC: [0xC78F], NFKD: [0x110B, 0x1175, 0x11C2] }, +{ source: [0xC790], NFC: [0xC790], NFD: [0x110C, 0x1161], NFKC: [0xC790], NFKD: [0x110C, 0x1161] }, +{ source: [0xC791], NFC: [0xC791], NFD: [0x110C, 0x1161, 0x11A8], NFKC: [0xC791], NFKD: [0x110C, 0x1161, 0x11A8] }, +{ source: [0xC792], NFC: [0xC792], NFD: [0x110C, 0x1161, 0x11A9], NFKC: [0xC792], NFKD: [0x110C, 0x1161, 0x11A9] }, +{ source: [0xC793], NFC: [0xC793], NFD: [0x110C, 0x1161, 0x11AA], NFKC: [0xC793], NFKD: [0x110C, 0x1161, 0x11AA] }, +{ source: [0xC794], NFC: [0xC794], NFD: [0x110C, 0x1161, 0x11AB], NFKC: [0xC794], NFKD: [0x110C, 0x1161, 0x11AB] }, +{ source: [0xC795], NFC: [0xC795], NFD: [0x110C, 0x1161, 0x11AC], NFKC: [0xC795], NFKD: [0x110C, 0x1161, 0x11AC] }, +{ source: [0xC796], NFC: [0xC796], NFD: [0x110C, 0x1161, 0x11AD], NFKC: [0xC796], NFKD: [0x110C, 0x1161, 0x11AD] }, +{ source: [0xC797], NFC: [0xC797], NFD: [0x110C, 0x1161, 0x11AE], NFKC: [0xC797], NFKD: [0x110C, 0x1161, 0x11AE] }, +{ source: [0xC798], NFC: [0xC798], NFD: [0x110C, 0x1161, 0x11AF], NFKC: [0xC798], NFKD: [0x110C, 0x1161, 0x11AF] }, +{ source: [0xC799], NFC: [0xC799], NFD: [0x110C, 0x1161, 0x11B0], NFKC: [0xC799], NFKD: [0x110C, 0x1161, 0x11B0] }, +{ source: [0xC79A], NFC: [0xC79A], NFD: [0x110C, 0x1161, 0x11B1], NFKC: [0xC79A], NFKD: [0x110C, 0x1161, 0x11B1] }, +{ source: [0xC79B], NFC: [0xC79B], NFD: [0x110C, 0x1161, 0x11B2], NFKC: [0xC79B], NFKD: [0x110C, 0x1161, 0x11B2] }, +{ source: [0xC79C], NFC: [0xC79C], NFD: [0x110C, 0x1161, 0x11B3], NFKC: [0xC79C], NFKD: [0x110C, 0x1161, 0x11B3] }, +{ source: [0xC79D], NFC: [0xC79D], NFD: [0x110C, 0x1161, 0x11B4], NFKC: [0xC79D], NFKD: [0x110C, 0x1161, 0x11B4] }, +{ source: [0xC79E], NFC: [0xC79E], NFD: [0x110C, 0x1161, 0x11B5], NFKC: [0xC79E], NFKD: [0x110C, 0x1161, 0x11B5] }, +{ source: [0xC79F], NFC: [0xC79F], NFD: [0x110C, 0x1161, 0x11B6], NFKC: [0xC79F], NFKD: [0x110C, 0x1161, 0x11B6] }, +{ source: [0xC7A0], NFC: [0xC7A0], NFD: [0x110C, 0x1161, 0x11B7], NFKC: [0xC7A0], NFKD: [0x110C, 0x1161, 0x11B7] }, +{ source: [0xC7A1], NFC: [0xC7A1], NFD: [0x110C, 0x1161, 0x11B8], NFKC: [0xC7A1], NFKD: [0x110C, 0x1161, 0x11B8] }, +{ source: [0xC7A2], NFC: [0xC7A2], NFD: [0x110C, 0x1161, 0x11B9], NFKC: [0xC7A2], NFKD: [0x110C, 0x1161, 0x11B9] }, +{ source: [0xC7A3], NFC: [0xC7A3], NFD: [0x110C, 0x1161, 0x11BA], NFKC: [0xC7A3], NFKD: [0x110C, 0x1161, 0x11BA] }, +{ source: [0xC7A4], NFC: [0xC7A4], NFD: [0x110C, 0x1161, 0x11BB], NFKC: [0xC7A4], NFKD: [0x110C, 0x1161, 0x11BB] }, +{ source: [0xC7A5], NFC: [0xC7A5], NFD: [0x110C, 0x1161, 0x11BC], NFKC: [0xC7A5], NFKD: [0x110C, 0x1161, 0x11BC] }, +{ source: [0xC7A6], NFC: [0xC7A6], NFD: [0x110C, 0x1161, 0x11BD], NFKC: [0xC7A6], NFKD: [0x110C, 0x1161, 0x11BD] }, +{ source: [0xC7A7], NFC: [0xC7A7], NFD: [0x110C, 0x1161, 0x11BE], NFKC: [0xC7A7], NFKD: [0x110C, 0x1161, 0x11BE] }, +{ source: [0xC7A8], NFC: [0xC7A8], NFD: [0x110C, 0x1161, 0x11BF], NFKC: [0xC7A8], NFKD: [0x110C, 0x1161, 0x11BF] }, +{ source: [0xC7A9], NFC: [0xC7A9], NFD: [0x110C, 0x1161, 0x11C0], NFKC: [0xC7A9], NFKD: [0x110C, 0x1161, 0x11C0] }, +{ source: [0xC7AA], NFC: [0xC7AA], NFD: [0x110C, 0x1161, 0x11C1], NFKC: [0xC7AA], NFKD: [0x110C, 0x1161, 0x11C1] }, +{ source: [0xC7AB], NFC: [0xC7AB], NFD: [0x110C, 0x1161, 0x11C2], NFKC: [0xC7AB], NFKD: [0x110C, 0x1161, 0x11C2] }, +{ source: [0xC7AC], NFC: [0xC7AC], NFD: [0x110C, 0x1162], NFKC: [0xC7AC], NFKD: [0x110C, 0x1162] }, +{ source: [0xC7AD], NFC: [0xC7AD], NFD: [0x110C, 0x1162, 0x11A8], NFKC: [0xC7AD], NFKD: [0x110C, 0x1162, 0x11A8] }, +{ source: [0xC7AE], NFC: [0xC7AE], NFD: [0x110C, 0x1162, 0x11A9], NFKC: [0xC7AE], NFKD: [0x110C, 0x1162, 0x11A9] }, +{ source: [0xC7AF], NFC: [0xC7AF], NFD: [0x110C, 0x1162, 0x11AA], NFKC: [0xC7AF], NFKD: [0x110C, 0x1162, 0x11AA] }, +{ source: [0xC7B0], NFC: [0xC7B0], NFD: [0x110C, 0x1162, 0x11AB], NFKC: [0xC7B0], NFKD: [0x110C, 0x1162, 0x11AB] }, +{ source: [0xC7B1], NFC: [0xC7B1], NFD: [0x110C, 0x1162, 0x11AC], NFKC: [0xC7B1], NFKD: [0x110C, 0x1162, 0x11AC] }, +{ source: [0xC7B2], NFC: [0xC7B2], NFD: [0x110C, 0x1162, 0x11AD], NFKC: [0xC7B2], NFKD: [0x110C, 0x1162, 0x11AD] }, +{ source: [0xC7B3], NFC: [0xC7B3], NFD: [0x110C, 0x1162, 0x11AE], NFKC: [0xC7B3], NFKD: [0x110C, 0x1162, 0x11AE] }, +{ source: [0xC7B4], NFC: [0xC7B4], NFD: [0x110C, 0x1162, 0x11AF], NFKC: [0xC7B4], NFKD: [0x110C, 0x1162, 0x11AF] }, +{ source: [0xC7B5], NFC: [0xC7B5], NFD: [0x110C, 0x1162, 0x11B0], NFKC: [0xC7B5], NFKD: [0x110C, 0x1162, 0x11B0] }, +{ source: [0xC7B6], NFC: [0xC7B6], NFD: [0x110C, 0x1162, 0x11B1], NFKC: [0xC7B6], NFKD: [0x110C, 0x1162, 0x11B1] }, +{ source: [0xC7B7], NFC: [0xC7B7], NFD: [0x110C, 0x1162, 0x11B2], NFKC: [0xC7B7], NFKD: [0x110C, 0x1162, 0x11B2] }, +{ source: [0xC7B8], NFC: [0xC7B8], NFD: [0x110C, 0x1162, 0x11B3], NFKC: [0xC7B8], NFKD: [0x110C, 0x1162, 0x11B3] }, +{ source: [0xC7B9], NFC: [0xC7B9], NFD: [0x110C, 0x1162, 0x11B4], NFKC: [0xC7B9], NFKD: [0x110C, 0x1162, 0x11B4] }, +{ source: [0xC7BA], NFC: [0xC7BA], NFD: [0x110C, 0x1162, 0x11B5], NFKC: [0xC7BA], NFKD: [0x110C, 0x1162, 0x11B5] }, +{ source: [0xC7BB], NFC: [0xC7BB], NFD: [0x110C, 0x1162, 0x11B6], NFKC: [0xC7BB], NFKD: [0x110C, 0x1162, 0x11B6] }, +{ source: [0xC7BC], NFC: [0xC7BC], NFD: [0x110C, 0x1162, 0x11B7], NFKC: [0xC7BC], NFKD: [0x110C, 0x1162, 0x11B7] }, +{ source: [0xC7BD], NFC: [0xC7BD], NFD: [0x110C, 0x1162, 0x11B8], NFKC: [0xC7BD], NFKD: [0x110C, 0x1162, 0x11B8] }, +{ source: [0xC7BE], NFC: [0xC7BE], NFD: [0x110C, 0x1162, 0x11B9], NFKC: [0xC7BE], NFKD: [0x110C, 0x1162, 0x11B9] }, +{ source: [0xC7BF], NFC: [0xC7BF], NFD: [0x110C, 0x1162, 0x11BA], NFKC: [0xC7BF], NFKD: [0x110C, 0x1162, 0x11BA] }, +{ source: [0xC7C0], NFC: [0xC7C0], NFD: [0x110C, 0x1162, 0x11BB], NFKC: [0xC7C0], NFKD: [0x110C, 0x1162, 0x11BB] }, +{ source: [0xC7C1], NFC: [0xC7C1], NFD: [0x110C, 0x1162, 0x11BC], NFKC: [0xC7C1], NFKD: [0x110C, 0x1162, 0x11BC] }, +{ source: [0xC7C2], NFC: [0xC7C2], NFD: [0x110C, 0x1162, 0x11BD], NFKC: [0xC7C2], NFKD: [0x110C, 0x1162, 0x11BD] }, +{ source: [0xC7C3], NFC: [0xC7C3], NFD: [0x110C, 0x1162, 0x11BE], NFKC: [0xC7C3], NFKD: [0x110C, 0x1162, 0x11BE] }, +{ source: [0xC7C4], NFC: [0xC7C4], NFD: [0x110C, 0x1162, 0x11BF], NFKC: [0xC7C4], NFKD: [0x110C, 0x1162, 0x11BF] }, +{ source: [0xC7C5], NFC: [0xC7C5], NFD: [0x110C, 0x1162, 0x11C0], NFKC: [0xC7C5], NFKD: [0x110C, 0x1162, 0x11C0] }, +{ source: [0xC7C6], NFC: [0xC7C6], NFD: [0x110C, 0x1162, 0x11C1], NFKC: [0xC7C6], NFKD: [0x110C, 0x1162, 0x11C1] }, +{ source: [0xC7C7], NFC: [0xC7C7], NFD: [0x110C, 0x1162, 0x11C2], NFKC: [0xC7C7], NFKD: [0x110C, 0x1162, 0x11C2] }, +{ source: [0xC7C8], NFC: [0xC7C8], NFD: [0x110C, 0x1163], NFKC: [0xC7C8], NFKD: [0x110C, 0x1163] }, +{ source: [0xC7C9], NFC: [0xC7C9], NFD: [0x110C, 0x1163, 0x11A8], NFKC: [0xC7C9], NFKD: [0x110C, 0x1163, 0x11A8] }, +{ source: [0xC7CA], NFC: [0xC7CA], NFD: [0x110C, 0x1163, 0x11A9], NFKC: [0xC7CA], NFKD: [0x110C, 0x1163, 0x11A9] }, +{ source: [0xC7CB], NFC: [0xC7CB], NFD: [0x110C, 0x1163, 0x11AA], NFKC: [0xC7CB], NFKD: [0x110C, 0x1163, 0x11AA] }, +{ source: [0xC7CC], NFC: [0xC7CC], NFD: [0x110C, 0x1163, 0x11AB], NFKC: [0xC7CC], NFKD: [0x110C, 0x1163, 0x11AB] }, +{ source: [0xC7CD], NFC: [0xC7CD], NFD: [0x110C, 0x1163, 0x11AC], NFKC: [0xC7CD], NFKD: [0x110C, 0x1163, 0x11AC] }, +{ source: [0xC7CE], NFC: [0xC7CE], NFD: [0x110C, 0x1163, 0x11AD], NFKC: [0xC7CE], NFKD: [0x110C, 0x1163, 0x11AD] }, +{ source: [0xC7CF], NFC: [0xC7CF], NFD: [0x110C, 0x1163, 0x11AE], NFKC: [0xC7CF], NFKD: [0x110C, 0x1163, 0x11AE] }, +{ source: [0xC7D0], NFC: [0xC7D0], NFD: [0x110C, 0x1163, 0x11AF], NFKC: [0xC7D0], NFKD: [0x110C, 0x1163, 0x11AF] }, +{ source: [0xC7D1], NFC: [0xC7D1], NFD: [0x110C, 0x1163, 0x11B0], NFKC: [0xC7D1], NFKD: [0x110C, 0x1163, 0x11B0] }, +{ source: [0xC7D2], NFC: [0xC7D2], NFD: [0x110C, 0x1163, 0x11B1], NFKC: [0xC7D2], NFKD: [0x110C, 0x1163, 0x11B1] }, +{ source: [0xC7D3], NFC: [0xC7D3], NFD: [0x110C, 0x1163, 0x11B2], NFKC: [0xC7D3], NFKD: [0x110C, 0x1163, 0x11B2] }, +{ source: [0xC7D4], NFC: [0xC7D4], NFD: [0x110C, 0x1163, 0x11B3], NFKC: [0xC7D4], NFKD: [0x110C, 0x1163, 0x11B3] }, +{ source: [0xC7D5], NFC: [0xC7D5], NFD: [0x110C, 0x1163, 0x11B4], NFKC: [0xC7D5], NFKD: [0x110C, 0x1163, 0x11B4] }, +{ source: [0xC7D6], NFC: [0xC7D6], NFD: [0x110C, 0x1163, 0x11B5], NFKC: [0xC7D6], NFKD: [0x110C, 0x1163, 0x11B5] }, +{ source: [0xC7D7], NFC: [0xC7D7], NFD: [0x110C, 0x1163, 0x11B6], NFKC: [0xC7D7], NFKD: [0x110C, 0x1163, 0x11B6] }, +{ source: [0xC7D8], NFC: [0xC7D8], NFD: [0x110C, 0x1163, 0x11B7], NFKC: [0xC7D8], NFKD: [0x110C, 0x1163, 0x11B7] }, +{ source: [0xC7D9], NFC: [0xC7D9], NFD: [0x110C, 0x1163, 0x11B8], NFKC: [0xC7D9], NFKD: [0x110C, 0x1163, 0x11B8] }, +{ source: [0xC7DA], NFC: [0xC7DA], NFD: [0x110C, 0x1163, 0x11B9], NFKC: [0xC7DA], NFKD: [0x110C, 0x1163, 0x11B9] }, +{ source: [0xC7DB], NFC: [0xC7DB], NFD: [0x110C, 0x1163, 0x11BA], NFKC: [0xC7DB], NFKD: [0x110C, 0x1163, 0x11BA] }, +{ source: [0xC7DC], NFC: [0xC7DC], NFD: [0x110C, 0x1163, 0x11BB], NFKC: [0xC7DC], NFKD: [0x110C, 0x1163, 0x11BB] }, +{ source: [0xC7DD], NFC: [0xC7DD], NFD: [0x110C, 0x1163, 0x11BC], NFKC: [0xC7DD], NFKD: [0x110C, 0x1163, 0x11BC] }, +{ source: [0xC7DE], NFC: [0xC7DE], NFD: [0x110C, 0x1163, 0x11BD], NFKC: [0xC7DE], NFKD: [0x110C, 0x1163, 0x11BD] }, +{ source: [0xC7DF], NFC: [0xC7DF], NFD: [0x110C, 0x1163, 0x11BE], NFKC: [0xC7DF], NFKD: [0x110C, 0x1163, 0x11BE] }, +{ source: [0xC7E0], NFC: [0xC7E0], NFD: [0x110C, 0x1163, 0x11BF], NFKC: [0xC7E0], NFKD: [0x110C, 0x1163, 0x11BF] }, +{ source: [0xC7E1], NFC: [0xC7E1], NFD: [0x110C, 0x1163, 0x11C0], NFKC: [0xC7E1], NFKD: [0x110C, 0x1163, 0x11C0] }, +{ source: [0xC7E2], NFC: [0xC7E2], NFD: [0x110C, 0x1163, 0x11C1], NFKC: [0xC7E2], NFKD: [0x110C, 0x1163, 0x11C1] }, +{ source: [0xC7E3], NFC: [0xC7E3], NFD: [0x110C, 0x1163, 0x11C2], NFKC: [0xC7E3], NFKD: [0x110C, 0x1163, 0x11C2] }, +{ source: [0xC7E4], NFC: [0xC7E4], NFD: [0x110C, 0x1164], NFKC: [0xC7E4], NFKD: [0x110C, 0x1164] }, +{ source: [0xC7E5], NFC: [0xC7E5], NFD: [0x110C, 0x1164, 0x11A8], NFKC: [0xC7E5], NFKD: [0x110C, 0x1164, 0x11A8] }, +{ source: [0xC7E6], NFC: [0xC7E6], NFD: [0x110C, 0x1164, 0x11A9], NFKC: [0xC7E6], NFKD: [0x110C, 0x1164, 0x11A9] }, +{ source: [0xC7E7], NFC: [0xC7E7], NFD: [0x110C, 0x1164, 0x11AA], NFKC: [0xC7E7], NFKD: [0x110C, 0x1164, 0x11AA] }, +{ source: [0xC7E8], NFC: [0xC7E8], NFD: [0x110C, 0x1164, 0x11AB], NFKC: [0xC7E8], NFKD: [0x110C, 0x1164, 0x11AB] }, +{ source: [0xC7E9], NFC: [0xC7E9], NFD: [0x110C, 0x1164, 0x11AC], NFKC: [0xC7E9], NFKD: [0x110C, 0x1164, 0x11AC] }, +{ source: [0xC7EA], NFC: [0xC7EA], NFD: [0x110C, 0x1164, 0x11AD], NFKC: [0xC7EA], NFKD: [0x110C, 0x1164, 0x11AD] }, +{ source: [0xC7EB], NFC: [0xC7EB], NFD: [0x110C, 0x1164, 0x11AE], NFKC: [0xC7EB], NFKD: [0x110C, 0x1164, 0x11AE] }, +{ source: [0xC7EC], NFC: [0xC7EC], NFD: [0x110C, 0x1164, 0x11AF], NFKC: [0xC7EC], NFKD: [0x110C, 0x1164, 0x11AF] }, +{ source: [0xC7ED], NFC: [0xC7ED], NFD: [0x110C, 0x1164, 0x11B0], NFKC: [0xC7ED], NFKD: [0x110C, 0x1164, 0x11B0] }, +{ source: [0xC7EE], NFC: [0xC7EE], NFD: [0x110C, 0x1164, 0x11B1], NFKC: [0xC7EE], NFKD: [0x110C, 0x1164, 0x11B1] }, +{ source: [0xC7EF], NFC: [0xC7EF], NFD: [0x110C, 0x1164, 0x11B2], NFKC: [0xC7EF], NFKD: [0x110C, 0x1164, 0x11B2] }, +{ source: [0xC7F0], NFC: [0xC7F0], NFD: [0x110C, 0x1164, 0x11B3], NFKC: [0xC7F0], NFKD: [0x110C, 0x1164, 0x11B3] }, +{ source: [0xC7F1], NFC: [0xC7F1], NFD: [0x110C, 0x1164, 0x11B4], NFKC: [0xC7F1], NFKD: [0x110C, 0x1164, 0x11B4] }, +{ source: [0xC7F2], NFC: [0xC7F2], NFD: [0x110C, 0x1164, 0x11B5], NFKC: [0xC7F2], NFKD: [0x110C, 0x1164, 0x11B5] }, +{ source: [0xC7F3], NFC: [0xC7F3], NFD: [0x110C, 0x1164, 0x11B6], NFKC: [0xC7F3], NFKD: [0x110C, 0x1164, 0x11B6] }, +{ source: [0xC7F4], NFC: [0xC7F4], NFD: [0x110C, 0x1164, 0x11B7], NFKC: [0xC7F4], NFKD: [0x110C, 0x1164, 0x11B7] }, +{ source: [0xC7F5], NFC: [0xC7F5], NFD: [0x110C, 0x1164, 0x11B8], NFKC: [0xC7F5], NFKD: [0x110C, 0x1164, 0x11B8] }, +{ source: [0xC7F6], NFC: [0xC7F6], NFD: [0x110C, 0x1164, 0x11B9], NFKC: [0xC7F6], NFKD: [0x110C, 0x1164, 0x11B9] }, +{ source: [0xC7F7], NFC: [0xC7F7], NFD: [0x110C, 0x1164, 0x11BA], NFKC: [0xC7F7], NFKD: [0x110C, 0x1164, 0x11BA] }, +{ source: [0xC7F8], NFC: [0xC7F8], NFD: [0x110C, 0x1164, 0x11BB], NFKC: [0xC7F8], NFKD: [0x110C, 0x1164, 0x11BB] }, +{ source: [0xC7F9], NFC: [0xC7F9], NFD: [0x110C, 0x1164, 0x11BC], NFKC: [0xC7F9], NFKD: [0x110C, 0x1164, 0x11BC] }, +{ source: [0xC7FA], NFC: [0xC7FA], NFD: [0x110C, 0x1164, 0x11BD], NFKC: [0xC7FA], NFKD: [0x110C, 0x1164, 0x11BD] }, +{ source: [0xC7FB], NFC: [0xC7FB], NFD: [0x110C, 0x1164, 0x11BE], NFKC: [0xC7FB], NFKD: [0x110C, 0x1164, 0x11BE] }, +{ source: [0xC7FC], NFC: [0xC7FC], NFD: [0x110C, 0x1164, 0x11BF], NFKC: [0xC7FC], NFKD: [0x110C, 0x1164, 0x11BF] }, +{ source: [0xC7FD], NFC: [0xC7FD], NFD: [0x110C, 0x1164, 0x11C0], NFKC: [0xC7FD], NFKD: [0x110C, 0x1164, 0x11C0] }, +{ source: [0xC7FE], NFC: [0xC7FE], NFD: [0x110C, 0x1164, 0x11C1], NFKC: [0xC7FE], NFKD: [0x110C, 0x1164, 0x11C1] }, +{ source: [0xC7FF], NFC: [0xC7FF], NFD: [0x110C, 0x1164, 0x11C2], NFKC: [0xC7FF], NFKD: [0x110C, 0x1164, 0x11C2] }, +{ source: [0xC800], NFC: [0xC800], NFD: [0x110C, 0x1165], NFKC: [0xC800], NFKD: [0x110C, 0x1165] }, +{ source: [0xC801], NFC: [0xC801], NFD: [0x110C, 0x1165, 0x11A8], NFKC: [0xC801], NFKD: [0x110C, 0x1165, 0x11A8] }, +{ source: [0xC802], NFC: [0xC802], NFD: [0x110C, 0x1165, 0x11A9], NFKC: [0xC802], NFKD: [0x110C, 0x1165, 0x11A9] }, +{ source: [0xC803], NFC: [0xC803], NFD: [0x110C, 0x1165, 0x11AA], NFKC: [0xC803], NFKD: [0x110C, 0x1165, 0x11AA] }, +{ source: [0xC804], NFC: [0xC804], NFD: [0x110C, 0x1165, 0x11AB], NFKC: [0xC804], NFKD: [0x110C, 0x1165, 0x11AB] }, +{ source: [0xC805], NFC: [0xC805], NFD: [0x110C, 0x1165, 0x11AC], NFKC: [0xC805], NFKD: [0x110C, 0x1165, 0x11AC] }, +{ source: [0xC806], NFC: [0xC806], NFD: [0x110C, 0x1165, 0x11AD], NFKC: [0xC806], NFKD: [0x110C, 0x1165, 0x11AD] }, +{ source: [0xC807], NFC: [0xC807], NFD: [0x110C, 0x1165, 0x11AE], NFKC: [0xC807], NFKD: [0x110C, 0x1165, 0x11AE] }, +{ source: [0xC808], NFC: [0xC808], NFD: [0x110C, 0x1165, 0x11AF], NFKC: [0xC808], NFKD: [0x110C, 0x1165, 0x11AF] }, +{ source: [0xC809], NFC: [0xC809], NFD: [0x110C, 0x1165, 0x11B0], NFKC: [0xC809], NFKD: [0x110C, 0x1165, 0x11B0] }, +{ source: [0xC80A], NFC: [0xC80A], NFD: [0x110C, 0x1165, 0x11B1], NFKC: [0xC80A], NFKD: [0x110C, 0x1165, 0x11B1] }, +{ source: [0xC80B], NFC: [0xC80B], NFD: [0x110C, 0x1165, 0x11B2], NFKC: [0xC80B], NFKD: [0x110C, 0x1165, 0x11B2] }, +{ source: [0xC80C], NFC: [0xC80C], NFD: [0x110C, 0x1165, 0x11B3], NFKC: [0xC80C], NFKD: [0x110C, 0x1165, 0x11B3] }, +{ source: [0xC80D], NFC: [0xC80D], NFD: [0x110C, 0x1165, 0x11B4], NFKC: [0xC80D], NFKD: [0x110C, 0x1165, 0x11B4] }, +{ source: [0xC80E], NFC: [0xC80E], NFD: [0x110C, 0x1165, 0x11B5], NFKC: [0xC80E], NFKD: [0x110C, 0x1165, 0x11B5] }, +{ source: [0xC80F], NFC: [0xC80F], NFD: [0x110C, 0x1165, 0x11B6], NFKC: [0xC80F], NFKD: [0x110C, 0x1165, 0x11B6] }, +{ source: [0xC810], NFC: [0xC810], NFD: [0x110C, 0x1165, 0x11B7], NFKC: [0xC810], NFKD: [0x110C, 0x1165, 0x11B7] }, +{ source: [0xC811], NFC: [0xC811], NFD: [0x110C, 0x1165, 0x11B8], NFKC: [0xC811], NFKD: [0x110C, 0x1165, 0x11B8] }, +{ source: [0xC812], NFC: [0xC812], NFD: [0x110C, 0x1165, 0x11B9], NFKC: [0xC812], NFKD: [0x110C, 0x1165, 0x11B9] }, +{ source: [0xC813], NFC: [0xC813], NFD: [0x110C, 0x1165, 0x11BA], NFKC: [0xC813], NFKD: [0x110C, 0x1165, 0x11BA] }, +{ source: [0xC814], NFC: [0xC814], NFD: [0x110C, 0x1165, 0x11BB], NFKC: [0xC814], NFKD: [0x110C, 0x1165, 0x11BB] }, +{ source: [0xC815], NFC: [0xC815], NFD: [0x110C, 0x1165, 0x11BC], NFKC: [0xC815], NFKD: [0x110C, 0x1165, 0x11BC] }, +{ source: [0xC816], NFC: [0xC816], NFD: [0x110C, 0x1165, 0x11BD], NFKC: [0xC816], NFKD: [0x110C, 0x1165, 0x11BD] }, +{ source: [0xC817], NFC: [0xC817], NFD: [0x110C, 0x1165, 0x11BE], NFKC: [0xC817], NFKD: [0x110C, 0x1165, 0x11BE] }, +{ source: [0xC818], NFC: [0xC818], NFD: [0x110C, 0x1165, 0x11BF], NFKC: [0xC818], NFKD: [0x110C, 0x1165, 0x11BF] }, +{ source: [0xC819], NFC: [0xC819], NFD: [0x110C, 0x1165, 0x11C0], NFKC: [0xC819], NFKD: [0x110C, 0x1165, 0x11C0] }, +{ source: [0xC81A], NFC: [0xC81A], NFD: [0x110C, 0x1165, 0x11C1], NFKC: [0xC81A], NFKD: [0x110C, 0x1165, 0x11C1] }, +{ source: [0xC81B], NFC: [0xC81B], NFD: [0x110C, 0x1165, 0x11C2], NFKC: [0xC81B], NFKD: [0x110C, 0x1165, 0x11C2] }, +{ source: [0xC81C], NFC: [0xC81C], NFD: [0x110C, 0x1166], NFKC: [0xC81C], NFKD: [0x110C, 0x1166] }, +{ source: [0xC81D], NFC: [0xC81D], NFD: [0x110C, 0x1166, 0x11A8], NFKC: [0xC81D], NFKD: [0x110C, 0x1166, 0x11A8] }, +{ source: [0xC81E], NFC: [0xC81E], NFD: [0x110C, 0x1166, 0x11A9], NFKC: [0xC81E], NFKD: [0x110C, 0x1166, 0x11A9] }, +{ source: [0xC81F], NFC: [0xC81F], NFD: [0x110C, 0x1166, 0x11AA], NFKC: [0xC81F], NFKD: [0x110C, 0x1166, 0x11AA] }, +{ source: [0xC820], NFC: [0xC820], NFD: [0x110C, 0x1166, 0x11AB], NFKC: [0xC820], NFKD: [0x110C, 0x1166, 0x11AB] }, +{ source: [0xC821], NFC: [0xC821], NFD: [0x110C, 0x1166, 0x11AC], NFKC: [0xC821], NFKD: [0x110C, 0x1166, 0x11AC] }, +{ source: [0xC822], NFC: [0xC822], NFD: [0x110C, 0x1166, 0x11AD], NFKC: [0xC822], NFKD: [0x110C, 0x1166, 0x11AD] }, +{ source: [0xC823], NFC: [0xC823], NFD: [0x110C, 0x1166, 0x11AE], NFKC: [0xC823], NFKD: [0x110C, 0x1166, 0x11AE] }, +{ source: [0xC824], NFC: [0xC824], NFD: [0x110C, 0x1166, 0x11AF], NFKC: [0xC824], NFKD: [0x110C, 0x1166, 0x11AF] }, +{ source: [0xC825], NFC: [0xC825], NFD: [0x110C, 0x1166, 0x11B0], NFKC: [0xC825], NFKD: [0x110C, 0x1166, 0x11B0] }, +{ source: [0xC826], NFC: [0xC826], NFD: [0x110C, 0x1166, 0x11B1], NFKC: [0xC826], NFKD: [0x110C, 0x1166, 0x11B1] }, +{ source: [0xC827], NFC: [0xC827], NFD: [0x110C, 0x1166, 0x11B2], NFKC: [0xC827], NFKD: [0x110C, 0x1166, 0x11B2] }, +{ source: [0xC828], NFC: [0xC828], NFD: [0x110C, 0x1166, 0x11B3], NFKC: [0xC828], NFKD: [0x110C, 0x1166, 0x11B3] }, +{ source: [0xC829], NFC: [0xC829], NFD: [0x110C, 0x1166, 0x11B4], NFKC: [0xC829], NFKD: [0x110C, 0x1166, 0x11B4] }, +{ source: [0xC82A], NFC: [0xC82A], NFD: [0x110C, 0x1166, 0x11B5], NFKC: [0xC82A], NFKD: [0x110C, 0x1166, 0x11B5] }, +{ source: [0xC82B], NFC: [0xC82B], NFD: [0x110C, 0x1166, 0x11B6], NFKC: [0xC82B], NFKD: [0x110C, 0x1166, 0x11B6] }, +{ source: [0xC82C], NFC: [0xC82C], NFD: [0x110C, 0x1166, 0x11B7], NFKC: [0xC82C], NFKD: [0x110C, 0x1166, 0x11B7] }, +{ source: [0xC82D], NFC: [0xC82D], NFD: [0x110C, 0x1166, 0x11B8], NFKC: [0xC82D], NFKD: [0x110C, 0x1166, 0x11B8] }, +{ source: [0xC82E], NFC: [0xC82E], NFD: [0x110C, 0x1166, 0x11B9], NFKC: [0xC82E], NFKD: [0x110C, 0x1166, 0x11B9] }, +{ source: [0xC82F], NFC: [0xC82F], NFD: [0x110C, 0x1166, 0x11BA], NFKC: [0xC82F], NFKD: [0x110C, 0x1166, 0x11BA] }, +{ source: [0xC830], NFC: [0xC830], NFD: [0x110C, 0x1166, 0x11BB], NFKC: [0xC830], NFKD: [0x110C, 0x1166, 0x11BB] }, +{ source: [0xC831], NFC: [0xC831], NFD: [0x110C, 0x1166, 0x11BC], NFKC: [0xC831], NFKD: [0x110C, 0x1166, 0x11BC] }, +{ source: [0xC832], NFC: [0xC832], NFD: [0x110C, 0x1166, 0x11BD], NFKC: [0xC832], NFKD: [0x110C, 0x1166, 0x11BD] }, +{ source: [0xC833], NFC: [0xC833], NFD: [0x110C, 0x1166, 0x11BE], NFKC: [0xC833], NFKD: [0x110C, 0x1166, 0x11BE] }, +{ source: [0xC834], NFC: [0xC834], NFD: [0x110C, 0x1166, 0x11BF], NFKC: [0xC834], NFKD: [0x110C, 0x1166, 0x11BF] }, +{ source: [0xC835], NFC: [0xC835], NFD: [0x110C, 0x1166, 0x11C0], NFKC: [0xC835], NFKD: [0x110C, 0x1166, 0x11C0] }, +{ source: [0xC836], NFC: [0xC836], NFD: [0x110C, 0x1166, 0x11C1], NFKC: [0xC836], NFKD: [0x110C, 0x1166, 0x11C1] }, +{ source: [0xC837], NFC: [0xC837], NFD: [0x110C, 0x1166, 0x11C2], NFKC: [0xC837], NFKD: [0x110C, 0x1166, 0x11C2] }, +{ source: [0xC838], NFC: [0xC838], NFD: [0x110C, 0x1167], NFKC: [0xC838], NFKD: [0x110C, 0x1167] }, +{ source: [0xC839], NFC: [0xC839], NFD: [0x110C, 0x1167, 0x11A8], NFKC: [0xC839], NFKD: [0x110C, 0x1167, 0x11A8] }, +{ source: [0xC83A], NFC: [0xC83A], NFD: [0x110C, 0x1167, 0x11A9], NFKC: [0xC83A], NFKD: [0x110C, 0x1167, 0x11A9] }, +{ source: [0xC83B], NFC: [0xC83B], NFD: [0x110C, 0x1167, 0x11AA], NFKC: [0xC83B], NFKD: [0x110C, 0x1167, 0x11AA] }, +{ source: [0xC83C], NFC: [0xC83C], NFD: [0x110C, 0x1167, 0x11AB], NFKC: [0xC83C], NFKD: [0x110C, 0x1167, 0x11AB] }, +{ source: [0xC83D], NFC: [0xC83D], NFD: [0x110C, 0x1167, 0x11AC], NFKC: [0xC83D], NFKD: [0x110C, 0x1167, 0x11AC] }, +{ source: [0xC83E], NFC: [0xC83E], NFD: [0x110C, 0x1167, 0x11AD], NFKC: [0xC83E], NFKD: [0x110C, 0x1167, 0x11AD] }, +{ source: [0xC83F], NFC: [0xC83F], NFD: [0x110C, 0x1167, 0x11AE], NFKC: [0xC83F], NFKD: [0x110C, 0x1167, 0x11AE] }, +{ source: [0xC840], NFC: [0xC840], NFD: [0x110C, 0x1167, 0x11AF], NFKC: [0xC840], NFKD: [0x110C, 0x1167, 0x11AF] }, +{ source: [0xC841], NFC: [0xC841], NFD: [0x110C, 0x1167, 0x11B0], NFKC: [0xC841], NFKD: [0x110C, 0x1167, 0x11B0] }, +{ source: [0xC842], NFC: [0xC842], NFD: [0x110C, 0x1167, 0x11B1], NFKC: [0xC842], NFKD: [0x110C, 0x1167, 0x11B1] }, +{ source: [0xC843], NFC: [0xC843], NFD: [0x110C, 0x1167, 0x11B2], NFKC: [0xC843], NFKD: [0x110C, 0x1167, 0x11B2] }, +{ source: [0xC844], NFC: [0xC844], NFD: [0x110C, 0x1167, 0x11B3], NFKC: [0xC844], NFKD: [0x110C, 0x1167, 0x11B3] }, +{ source: [0xC845], NFC: [0xC845], NFD: [0x110C, 0x1167, 0x11B4], NFKC: [0xC845], NFKD: [0x110C, 0x1167, 0x11B4] }, +{ source: [0xC846], NFC: [0xC846], NFD: [0x110C, 0x1167, 0x11B5], NFKC: [0xC846], NFKD: [0x110C, 0x1167, 0x11B5] }, +{ source: [0xC847], NFC: [0xC847], NFD: [0x110C, 0x1167, 0x11B6], NFKC: [0xC847], NFKD: [0x110C, 0x1167, 0x11B6] }, +{ source: [0xC848], NFC: [0xC848], NFD: [0x110C, 0x1167, 0x11B7], NFKC: [0xC848], NFKD: [0x110C, 0x1167, 0x11B7] }, +{ source: [0xC849], NFC: [0xC849], NFD: [0x110C, 0x1167, 0x11B8], NFKC: [0xC849], NFKD: [0x110C, 0x1167, 0x11B8] }, +{ source: [0xC84A], NFC: [0xC84A], NFD: [0x110C, 0x1167, 0x11B9], NFKC: [0xC84A], NFKD: [0x110C, 0x1167, 0x11B9] }, +{ source: [0xC84B], NFC: [0xC84B], NFD: [0x110C, 0x1167, 0x11BA], NFKC: [0xC84B], NFKD: [0x110C, 0x1167, 0x11BA] }, +{ source: [0xC84C], NFC: [0xC84C], NFD: [0x110C, 0x1167, 0x11BB], NFKC: [0xC84C], NFKD: [0x110C, 0x1167, 0x11BB] }, +{ source: [0xC84D], NFC: [0xC84D], NFD: [0x110C, 0x1167, 0x11BC], NFKC: [0xC84D], NFKD: [0x110C, 0x1167, 0x11BC] }, +{ source: [0xC84E], NFC: [0xC84E], NFD: [0x110C, 0x1167, 0x11BD], NFKC: [0xC84E], NFKD: [0x110C, 0x1167, 0x11BD] }, +{ source: [0xC84F], NFC: [0xC84F], NFD: [0x110C, 0x1167, 0x11BE], NFKC: [0xC84F], NFKD: [0x110C, 0x1167, 0x11BE] }, +{ source: [0xC850], NFC: [0xC850], NFD: [0x110C, 0x1167, 0x11BF], NFKC: [0xC850], NFKD: [0x110C, 0x1167, 0x11BF] }, +{ source: [0xC851], NFC: [0xC851], NFD: [0x110C, 0x1167, 0x11C0], NFKC: [0xC851], NFKD: [0x110C, 0x1167, 0x11C0] }, +{ source: [0xC852], NFC: [0xC852], NFD: [0x110C, 0x1167, 0x11C1], NFKC: [0xC852], NFKD: [0x110C, 0x1167, 0x11C1] }, +{ source: [0xC853], NFC: [0xC853], NFD: [0x110C, 0x1167, 0x11C2], NFKC: [0xC853], NFKD: [0x110C, 0x1167, 0x11C2] }, +{ source: [0xC854], NFC: [0xC854], NFD: [0x110C, 0x1168], NFKC: [0xC854], NFKD: [0x110C, 0x1168] }, +{ source: [0xC855], NFC: [0xC855], NFD: [0x110C, 0x1168, 0x11A8], NFKC: [0xC855], NFKD: [0x110C, 0x1168, 0x11A8] }, +{ source: [0xC856], NFC: [0xC856], NFD: [0x110C, 0x1168, 0x11A9], NFKC: [0xC856], NFKD: [0x110C, 0x1168, 0x11A9] }, +{ source: [0xC857], NFC: [0xC857], NFD: [0x110C, 0x1168, 0x11AA], NFKC: [0xC857], NFKD: [0x110C, 0x1168, 0x11AA] }, +{ source: [0xC858], NFC: [0xC858], NFD: [0x110C, 0x1168, 0x11AB], NFKC: [0xC858], NFKD: [0x110C, 0x1168, 0x11AB] }, +{ source: [0xC859], NFC: [0xC859], NFD: [0x110C, 0x1168, 0x11AC], NFKC: [0xC859], NFKD: [0x110C, 0x1168, 0x11AC] }, +{ source: [0xC85A], NFC: [0xC85A], NFD: [0x110C, 0x1168, 0x11AD], NFKC: [0xC85A], NFKD: [0x110C, 0x1168, 0x11AD] }, +{ source: [0xC85B], NFC: [0xC85B], NFD: [0x110C, 0x1168, 0x11AE], NFKC: [0xC85B], NFKD: [0x110C, 0x1168, 0x11AE] }, +{ source: [0xC85C], NFC: [0xC85C], NFD: [0x110C, 0x1168, 0x11AF], NFKC: [0xC85C], NFKD: [0x110C, 0x1168, 0x11AF] }, +{ source: [0xC85D], NFC: [0xC85D], NFD: [0x110C, 0x1168, 0x11B0], NFKC: [0xC85D], NFKD: [0x110C, 0x1168, 0x11B0] }, +{ source: [0xC85E], NFC: [0xC85E], NFD: [0x110C, 0x1168, 0x11B1], NFKC: [0xC85E], NFKD: [0x110C, 0x1168, 0x11B1] }, +{ source: [0xC85F], NFC: [0xC85F], NFD: [0x110C, 0x1168, 0x11B2], NFKC: [0xC85F], NFKD: [0x110C, 0x1168, 0x11B2] }, +{ source: [0xC860], NFC: [0xC860], NFD: [0x110C, 0x1168, 0x11B3], NFKC: [0xC860], NFKD: [0x110C, 0x1168, 0x11B3] }, +{ source: [0xC861], NFC: [0xC861], NFD: [0x110C, 0x1168, 0x11B4], NFKC: [0xC861], NFKD: [0x110C, 0x1168, 0x11B4] }, +{ source: [0xC862], NFC: [0xC862], NFD: [0x110C, 0x1168, 0x11B5], NFKC: [0xC862], NFKD: [0x110C, 0x1168, 0x11B5] }, +{ source: [0xC863], NFC: [0xC863], NFD: [0x110C, 0x1168, 0x11B6], NFKC: [0xC863], NFKD: [0x110C, 0x1168, 0x11B6] }, +{ source: [0xC864], NFC: [0xC864], NFD: [0x110C, 0x1168, 0x11B7], NFKC: [0xC864], NFKD: [0x110C, 0x1168, 0x11B7] }, +{ source: [0xC865], NFC: [0xC865], NFD: [0x110C, 0x1168, 0x11B8], NFKC: [0xC865], NFKD: [0x110C, 0x1168, 0x11B8] }, +{ source: [0xC866], NFC: [0xC866], NFD: [0x110C, 0x1168, 0x11B9], NFKC: [0xC866], NFKD: [0x110C, 0x1168, 0x11B9] }, +{ source: [0xC867], NFC: [0xC867], NFD: [0x110C, 0x1168, 0x11BA], NFKC: [0xC867], NFKD: [0x110C, 0x1168, 0x11BA] }, +{ source: [0xC868], NFC: [0xC868], NFD: [0x110C, 0x1168, 0x11BB], NFKC: [0xC868], NFKD: [0x110C, 0x1168, 0x11BB] }, +{ source: [0xC869], NFC: [0xC869], NFD: [0x110C, 0x1168, 0x11BC], NFKC: [0xC869], NFKD: [0x110C, 0x1168, 0x11BC] }, +{ source: [0xC86A], NFC: [0xC86A], NFD: [0x110C, 0x1168, 0x11BD], NFKC: [0xC86A], NFKD: [0x110C, 0x1168, 0x11BD] }, +{ source: [0xC86B], NFC: [0xC86B], NFD: [0x110C, 0x1168, 0x11BE], NFKC: [0xC86B], NFKD: [0x110C, 0x1168, 0x11BE] }, +{ source: [0xC86C], NFC: [0xC86C], NFD: [0x110C, 0x1168, 0x11BF], NFKC: [0xC86C], NFKD: [0x110C, 0x1168, 0x11BF] }, +{ source: [0xC86D], NFC: [0xC86D], NFD: [0x110C, 0x1168, 0x11C0], NFKC: [0xC86D], NFKD: [0x110C, 0x1168, 0x11C0] }, +{ source: [0xC86E], NFC: [0xC86E], NFD: [0x110C, 0x1168, 0x11C1], NFKC: [0xC86E], NFKD: [0x110C, 0x1168, 0x11C1] }, +{ source: [0xC86F], NFC: [0xC86F], NFD: [0x110C, 0x1168, 0x11C2], NFKC: [0xC86F], NFKD: [0x110C, 0x1168, 0x11C2] }, +{ source: [0xC870], NFC: [0xC870], NFD: [0x110C, 0x1169], NFKC: [0xC870], NFKD: [0x110C, 0x1169] }, +{ source: [0xC871], NFC: [0xC871], NFD: [0x110C, 0x1169, 0x11A8], NFKC: [0xC871], NFKD: [0x110C, 0x1169, 0x11A8] }, +{ source: [0xC872], NFC: [0xC872], NFD: [0x110C, 0x1169, 0x11A9], NFKC: [0xC872], NFKD: [0x110C, 0x1169, 0x11A9] }, +{ source: [0xC873], NFC: [0xC873], NFD: [0x110C, 0x1169, 0x11AA], NFKC: [0xC873], NFKD: [0x110C, 0x1169, 0x11AA] }, +{ source: [0xC874], NFC: [0xC874], NFD: [0x110C, 0x1169, 0x11AB], NFKC: [0xC874], NFKD: [0x110C, 0x1169, 0x11AB] }, +{ source: [0xC875], NFC: [0xC875], NFD: [0x110C, 0x1169, 0x11AC], NFKC: [0xC875], NFKD: [0x110C, 0x1169, 0x11AC] }, +{ source: [0xC876], NFC: [0xC876], NFD: [0x110C, 0x1169, 0x11AD], NFKC: [0xC876], NFKD: [0x110C, 0x1169, 0x11AD] }, +{ source: [0xC877], NFC: [0xC877], NFD: [0x110C, 0x1169, 0x11AE], NFKC: [0xC877], NFKD: [0x110C, 0x1169, 0x11AE] }, +{ source: [0xC878], NFC: [0xC878], NFD: [0x110C, 0x1169, 0x11AF], NFKC: [0xC878], NFKD: [0x110C, 0x1169, 0x11AF] }, +{ source: [0xC879], NFC: [0xC879], NFD: [0x110C, 0x1169, 0x11B0], NFKC: [0xC879], NFKD: [0x110C, 0x1169, 0x11B0] }, +{ source: [0xC87A], NFC: [0xC87A], NFD: [0x110C, 0x1169, 0x11B1], NFKC: [0xC87A], NFKD: [0x110C, 0x1169, 0x11B1] }, +{ source: [0xC87B], NFC: [0xC87B], NFD: [0x110C, 0x1169, 0x11B2], NFKC: [0xC87B], NFKD: [0x110C, 0x1169, 0x11B2] }, +{ source: [0xC87C], NFC: [0xC87C], NFD: [0x110C, 0x1169, 0x11B3], NFKC: [0xC87C], NFKD: [0x110C, 0x1169, 0x11B3] }, +{ source: [0xC87D], NFC: [0xC87D], NFD: [0x110C, 0x1169, 0x11B4], NFKC: [0xC87D], NFKD: [0x110C, 0x1169, 0x11B4] }, +{ source: [0xC87E], NFC: [0xC87E], NFD: [0x110C, 0x1169, 0x11B5], NFKC: [0xC87E], NFKD: [0x110C, 0x1169, 0x11B5] }, +{ source: [0xC87F], NFC: [0xC87F], NFD: [0x110C, 0x1169, 0x11B6], NFKC: [0xC87F], NFKD: [0x110C, 0x1169, 0x11B6] }, +{ source: [0xC880], NFC: [0xC880], NFD: [0x110C, 0x1169, 0x11B7], NFKC: [0xC880], NFKD: [0x110C, 0x1169, 0x11B7] }, +{ source: [0xC881], NFC: [0xC881], NFD: [0x110C, 0x1169, 0x11B8], NFKC: [0xC881], NFKD: [0x110C, 0x1169, 0x11B8] }, +{ source: [0xC882], NFC: [0xC882], NFD: [0x110C, 0x1169, 0x11B9], NFKC: [0xC882], NFKD: [0x110C, 0x1169, 0x11B9] }, +{ source: [0xC883], NFC: [0xC883], NFD: [0x110C, 0x1169, 0x11BA], NFKC: [0xC883], NFKD: [0x110C, 0x1169, 0x11BA] }, +{ source: [0xC884], NFC: [0xC884], NFD: [0x110C, 0x1169, 0x11BB], NFKC: [0xC884], NFKD: [0x110C, 0x1169, 0x11BB] }, +{ source: [0xC885], NFC: [0xC885], NFD: [0x110C, 0x1169, 0x11BC], NFKC: [0xC885], NFKD: [0x110C, 0x1169, 0x11BC] }, +{ source: [0xC886], NFC: [0xC886], NFD: [0x110C, 0x1169, 0x11BD], NFKC: [0xC886], NFKD: [0x110C, 0x1169, 0x11BD] }, +{ source: [0xC887], NFC: [0xC887], NFD: [0x110C, 0x1169, 0x11BE], NFKC: [0xC887], NFKD: [0x110C, 0x1169, 0x11BE] }, +{ source: [0xC888], NFC: [0xC888], NFD: [0x110C, 0x1169, 0x11BF], NFKC: [0xC888], NFKD: [0x110C, 0x1169, 0x11BF] }, +{ source: [0xC889], NFC: [0xC889], NFD: [0x110C, 0x1169, 0x11C0], NFKC: [0xC889], NFKD: [0x110C, 0x1169, 0x11C0] }, +{ source: [0xC88A], NFC: [0xC88A], NFD: [0x110C, 0x1169, 0x11C1], NFKC: [0xC88A], NFKD: [0x110C, 0x1169, 0x11C1] }, +{ source: [0xC88B], NFC: [0xC88B], NFD: [0x110C, 0x1169, 0x11C2], NFKC: [0xC88B], NFKD: [0x110C, 0x1169, 0x11C2] }, +{ source: [0xC88C], NFC: [0xC88C], NFD: [0x110C, 0x116A], NFKC: [0xC88C], NFKD: [0x110C, 0x116A] }, +{ source: [0xC88D], NFC: [0xC88D], NFD: [0x110C, 0x116A, 0x11A8], NFKC: [0xC88D], NFKD: [0x110C, 0x116A, 0x11A8] }, +{ source: [0xC88E], NFC: [0xC88E], NFD: [0x110C, 0x116A, 0x11A9], NFKC: [0xC88E], NFKD: [0x110C, 0x116A, 0x11A9] }, +{ source: [0xC88F], NFC: [0xC88F], NFD: [0x110C, 0x116A, 0x11AA], NFKC: [0xC88F], NFKD: [0x110C, 0x116A, 0x11AA] }, +{ source: [0xC890], NFC: [0xC890], NFD: [0x110C, 0x116A, 0x11AB], NFKC: [0xC890], NFKD: [0x110C, 0x116A, 0x11AB] }, +{ source: [0xC891], NFC: [0xC891], NFD: [0x110C, 0x116A, 0x11AC], NFKC: [0xC891], NFKD: [0x110C, 0x116A, 0x11AC] }, +{ source: [0xC892], NFC: [0xC892], NFD: [0x110C, 0x116A, 0x11AD], NFKC: [0xC892], NFKD: [0x110C, 0x116A, 0x11AD] }, +{ source: [0xC893], NFC: [0xC893], NFD: [0x110C, 0x116A, 0x11AE], NFKC: [0xC893], NFKD: [0x110C, 0x116A, 0x11AE] }, +{ source: [0xC894], NFC: [0xC894], NFD: [0x110C, 0x116A, 0x11AF], NFKC: [0xC894], NFKD: [0x110C, 0x116A, 0x11AF] }, +{ source: [0xC895], NFC: [0xC895], NFD: [0x110C, 0x116A, 0x11B0], NFKC: [0xC895], NFKD: [0x110C, 0x116A, 0x11B0] }, +{ source: [0xC896], NFC: [0xC896], NFD: [0x110C, 0x116A, 0x11B1], NFKC: [0xC896], NFKD: [0x110C, 0x116A, 0x11B1] }, +{ source: [0xC897], NFC: [0xC897], NFD: [0x110C, 0x116A, 0x11B2], NFKC: [0xC897], NFKD: [0x110C, 0x116A, 0x11B2] }, +{ source: [0xC898], NFC: [0xC898], NFD: [0x110C, 0x116A, 0x11B3], NFKC: [0xC898], NFKD: [0x110C, 0x116A, 0x11B3] }, +{ source: [0xC899], NFC: [0xC899], NFD: [0x110C, 0x116A, 0x11B4], NFKC: [0xC899], NFKD: [0x110C, 0x116A, 0x11B4] }, +{ source: [0xC89A], NFC: [0xC89A], NFD: [0x110C, 0x116A, 0x11B5], NFKC: [0xC89A], NFKD: [0x110C, 0x116A, 0x11B5] }, +{ source: [0xC89B], NFC: [0xC89B], NFD: [0x110C, 0x116A, 0x11B6], NFKC: [0xC89B], NFKD: [0x110C, 0x116A, 0x11B6] }, +{ source: [0xC89C], NFC: [0xC89C], NFD: [0x110C, 0x116A, 0x11B7], NFKC: [0xC89C], NFKD: [0x110C, 0x116A, 0x11B7] }, +{ source: [0xC89D], NFC: [0xC89D], NFD: [0x110C, 0x116A, 0x11B8], NFKC: [0xC89D], NFKD: [0x110C, 0x116A, 0x11B8] }, +{ source: [0xC89E], NFC: [0xC89E], NFD: [0x110C, 0x116A, 0x11B9], NFKC: [0xC89E], NFKD: [0x110C, 0x116A, 0x11B9] }, +{ source: [0xC89F], NFC: [0xC89F], NFD: [0x110C, 0x116A, 0x11BA], NFKC: [0xC89F], NFKD: [0x110C, 0x116A, 0x11BA] }, +{ source: [0xC8A0], NFC: [0xC8A0], NFD: [0x110C, 0x116A, 0x11BB], NFKC: [0xC8A0], NFKD: [0x110C, 0x116A, 0x11BB] }, +{ source: [0xC8A1], NFC: [0xC8A1], NFD: [0x110C, 0x116A, 0x11BC], NFKC: [0xC8A1], NFKD: [0x110C, 0x116A, 0x11BC] }, +{ source: [0xC8A2], NFC: [0xC8A2], NFD: [0x110C, 0x116A, 0x11BD], NFKC: [0xC8A2], NFKD: [0x110C, 0x116A, 0x11BD] }, +{ source: [0xC8A3], NFC: [0xC8A3], NFD: [0x110C, 0x116A, 0x11BE], NFKC: [0xC8A3], NFKD: [0x110C, 0x116A, 0x11BE] }, +{ source: [0xC8A4], NFC: [0xC8A4], NFD: [0x110C, 0x116A, 0x11BF], NFKC: [0xC8A4], NFKD: [0x110C, 0x116A, 0x11BF] }, +{ source: [0xC8A5], NFC: [0xC8A5], NFD: [0x110C, 0x116A, 0x11C0], NFKC: [0xC8A5], NFKD: [0x110C, 0x116A, 0x11C0] }, +{ source: [0xC8A6], NFC: [0xC8A6], NFD: [0x110C, 0x116A, 0x11C1], NFKC: [0xC8A6], NFKD: [0x110C, 0x116A, 0x11C1] }, +{ source: [0xC8A7], NFC: [0xC8A7], NFD: [0x110C, 0x116A, 0x11C2], NFKC: [0xC8A7], NFKD: [0x110C, 0x116A, 0x11C2] }, +{ source: [0xC8A8], NFC: [0xC8A8], NFD: [0x110C, 0x116B], NFKC: [0xC8A8], NFKD: [0x110C, 0x116B] }, +{ source: [0xC8A9], NFC: [0xC8A9], NFD: [0x110C, 0x116B, 0x11A8], NFKC: [0xC8A9], NFKD: [0x110C, 0x116B, 0x11A8] }, +{ source: [0xC8AA], NFC: [0xC8AA], NFD: [0x110C, 0x116B, 0x11A9], NFKC: [0xC8AA], NFKD: [0x110C, 0x116B, 0x11A9] }, +{ source: [0xC8AB], NFC: [0xC8AB], NFD: [0x110C, 0x116B, 0x11AA], NFKC: [0xC8AB], NFKD: [0x110C, 0x116B, 0x11AA] }, +{ source: [0xC8AC], NFC: [0xC8AC], NFD: [0x110C, 0x116B, 0x11AB], NFKC: [0xC8AC], NFKD: [0x110C, 0x116B, 0x11AB] }, +{ source: [0xC8AD], NFC: [0xC8AD], NFD: [0x110C, 0x116B, 0x11AC], NFKC: [0xC8AD], NFKD: [0x110C, 0x116B, 0x11AC] }, +{ source: [0xC8AE], NFC: [0xC8AE], NFD: [0x110C, 0x116B, 0x11AD], NFKC: [0xC8AE], NFKD: [0x110C, 0x116B, 0x11AD] }, +{ source: [0xC8AF], NFC: [0xC8AF], NFD: [0x110C, 0x116B, 0x11AE], NFKC: [0xC8AF], NFKD: [0x110C, 0x116B, 0x11AE] }, +{ source: [0xC8B0], NFC: [0xC8B0], NFD: [0x110C, 0x116B, 0x11AF], NFKC: [0xC8B0], NFKD: [0x110C, 0x116B, 0x11AF] }, +{ source: [0xC8B1], NFC: [0xC8B1], NFD: [0x110C, 0x116B, 0x11B0], NFKC: [0xC8B1], NFKD: [0x110C, 0x116B, 0x11B0] }, +{ source: [0xC8B2], NFC: [0xC8B2], NFD: [0x110C, 0x116B, 0x11B1], NFKC: [0xC8B2], NFKD: [0x110C, 0x116B, 0x11B1] }, +{ source: [0xC8B3], NFC: [0xC8B3], NFD: [0x110C, 0x116B, 0x11B2], NFKC: [0xC8B3], NFKD: [0x110C, 0x116B, 0x11B2] }, +{ source: [0xC8B4], NFC: [0xC8B4], NFD: [0x110C, 0x116B, 0x11B3], NFKC: [0xC8B4], NFKD: [0x110C, 0x116B, 0x11B3] }, +{ source: [0xC8B5], NFC: [0xC8B5], NFD: [0x110C, 0x116B, 0x11B4], NFKC: [0xC8B5], NFKD: [0x110C, 0x116B, 0x11B4] }, +{ source: [0xC8B6], NFC: [0xC8B6], NFD: [0x110C, 0x116B, 0x11B5], NFKC: [0xC8B6], NFKD: [0x110C, 0x116B, 0x11B5] }, +{ source: [0xC8B7], NFC: [0xC8B7], NFD: [0x110C, 0x116B, 0x11B6], NFKC: [0xC8B7], NFKD: [0x110C, 0x116B, 0x11B6] }, +{ source: [0xC8B8], NFC: [0xC8B8], NFD: [0x110C, 0x116B, 0x11B7], NFKC: [0xC8B8], NFKD: [0x110C, 0x116B, 0x11B7] }, +{ source: [0xC8B9], NFC: [0xC8B9], NFD: [0x110C, 0x116B, 0x11B8], NFKC: [0xC8B9], NFKD: [0x110C, 0x116B, 0x11B8] }, +{ source: [0xC8BA], NFC: [0xC8BA], NFD: [0x110C, 0x116B, 0x11B9], NFKC: [0xC8BA], NFKD: [0x110C, 0x116B, 0x11B9] }, +{ source: [0xC8BB], NFC: [0xC8BB], NFD: [0x110C, 0x116B, 0x11BA], NFKC: [0xC8BB], NFKD: [0x110C, 0x116B, 0x11BA] }, +{ source: [0xC8BC], NFC: [0xC8BC], NFD: [0x110C, 0x116B, 0x11BB], NFKC: [0xC8BC], NFKD: [0x110C, 0x116B, 0x11BB] }, +{ source: [0xC8BD], NFC: [0xC8BD], NFD: [0x110C, 0x116B, 0x11BC], NFKC: [0xC8BD], NFKD: [0x110C, 0x116B, 0x11BC] }, +{ source: [0xC8BE], NFC: [0xC8BE], NFD: [0x110C, 0x116B, 0x11BD], NFKC: [0xC8BE], NFKD: [0x110C, 0x116B, 0x11BD] }, +{ source: [0xC8BF], NFC: [0xC8BF], NFD: [0x110C, 0x116B, 0x11BE], NFKC: [0xC8BF], NFKD: [0x110C, 0x116B, 0x11BE] }, +{ source: [0xC8C0], NFC: [0xC8C0], NFD: [0x110C, 0x116B, 0x11BF], NFKC: [0xC8C0], NFKD: [0x110C, 0x116B, 0x11BF] }, +{ source: [0xC8C1], NFC: [0xC8C1], NFD: [0x110C, 0x116B, 0x11C0], NFKC: [0xC8C1], NFKD: [0x110C, 0x116B, 0x11C0] }, +{ source: [0xC8C2], NFC: [0xC8C2], NFD: [0x110C, 0x116B, 0x11C1], NFKC: [0xC8C2], NFKD: [0x110C, 0x116B, 0x11C1] }, +{ source: [0xC8C3], NFC: [0xC8C3], NFD: [0x110C, 0x116B, 0x11C2], NFKC: [0xC8C3], NFKD: [0x110C, 0x116B, 0x11C2] }, +{ source: [0xC8C4], NFC: [0xC8C4], NFD: [0x110C, 0x116C], NFKC: [0xC8C4], NFKD: [0x110C, 0x116C] }, +{ source: [0xC8C5], NFC: [0xC8C5], NFD: [0x110C, 0x116C, 0x11A8], NFKC: [0xC8C5], NFKD: [0x110C, 0x116C, 0x11A8] }, +{ source: [0xC8C6], NFC: [0xC8C6], NFD: [0x110C, 0x116C, 0x11A9], NFKC: [0xC8C6], NFKD: [0x110C, 0x116C, 0x11A9] }, +{ source: [0xC8C7], NFC: [0xC8C7], NFD: [0x110C, 0x116C, 0x11AA], NFKC: [0xC8C7], NFKD: [0x110C, 0x116C, 0x11AA] }, +{ source: [0xC8C8], NFC: [0xC8C8], NFD: [0x110C, 0x116C, 0x11AB], NFKC: [0xC8C8], NFKD: [0x110C, 0x116C, 0x11AB] }, +{ source: [0xC8C9], NFC: [0xC8C9], NFD: [0x110C, 0x116C, 0x11AC], NFKC: [0xC8C9], NFKD: [0x110C, 0x116C, 0x11AC] }, +{ source: [0xC8CA], NFC: [0xC8CA], NFD: [0x110C, 0x116C, 0x11AD], NFKC: [0xC8CA], NFKD: [0x110C, 0x116C, 0x11AD] }, +{ source: [0xC8CB], NFC: [0xC8CB], NFD: [0x110C, 0x116C, 0x11AE], NFKC: [0xC8CB], NFKD: [0x110C, 0x116C, 0x11AE] }, +{ source: [0xC8CC], NFC: [0xC8CC], NFD: [0x110C, 0x116C, 0x11AF], NFKC: [0xC8CC], NFKD: [0x110C, 0x116C, 0x11AF] }, +{ source: [0xC8CD], NFC: [0xC8CD], NFD: [0x110C, 0x116C, 0x11B0], NFKC: [0xC8CD], NFKD: [0x110C, 0x116C, 0x11B0] }, +{ source: [0xC8CE], NFC: [0xC8CE], NFD: [0x110C, 0x116C, 0x11B1], NFKC: [0xC8CE], NFKD: [0x110C, 0x116C, 0x11B1] }, +{ source: [0xC8CF], NFC: [0xC8CF], NFD: [0x110C, 0x116C, 0x11B2], NFKC: [0xC8CF], NFKD: [0x110C, 0x116C, 0x11B2] }, +{ source: [0xC8D0], NFC: [0xC8D0], NFD: [0x110C, 0x116C, 0x11B3], NFKC: [0xC8D0], NFKD: [0x110C, 0x116C, 0x11B3] }, +{ source: [0xC8D1], NFC: [0xC8D1], NFD: [0x110C, 0x116C, 0x11B4], NFKC: [0xC8D1], NFKD: [0x110C, 0x116C, 0x11B4] }, +{ source: [0xC8D2], NFC: [0xC8D2], NFD: [0x110C, 0x116C, 0x11B5], NFKC: [0xC8D2], NFKD: [0x110C, 0x116C, 0x11B5] }, +{ source: [0xC8D3], NFC: [0xC8D3], NFD: [0x110C, 0x116C, 0x11B6], NFKC: [0xC8D3], NFKD: [0x110C, 0x116C, 0x11B6] }, +{ source: [0xC8D4], NFC: [0xC8D4], NFD: [0x110C, 0x116C, 0x11B7], NFKC: [0xC8D4], NFKD: [0x110C, 0x116C, 0x11B7] }, +{ source: [0xC8D5], NFC: [0xC8D5], NFD: [0x110C, 0x116C, 0x11B8], NFKC: [0xC8D5], NFKD: [0x110C, 0x116C, 0x11B8] }, +{ source: [0xC8D6], NFC: [0xC8D6], NFD: [0x110C, 0x116C, 0x11B9], NFKC: [0xC8D6], NFKD: [0x110C, 0x116C, 0x11B9] }, +{ source: [0xC8D7], NFC: [0xC8D7], NFD: [0x110C, 0x116C, 0x11BA], NFKC: [0xC8D7], NFKD: [0x110C, 0x116C, 0x11BA] }, +{ source: [0xC8D8], NFC: [0xC8D8], NFD: [0x110C, 0x116C, 0x11BB], NFKC: [0xC8D8], NFKD: [0x110C, 0x116C, 0x11BB] }, +{ source: [0xC8D9], NFC: [0xC8D9], NFD: [0x110C, 0x116C, 0x11BC], NFKC: [0xC8D9], NFKD: [0x110C, 0x116C, 0x11BC] }, +{ source: [0xC8DA], NFC: [0xC8DA], NFD: [0x110C, 0x116C, 0x11BD], NFKC: [0xC8DA], NFKD: [0x110C, 0x116C, 0x11BD] }, +{ source: [0xC8DB], NFC: [0xC8DB], NFD: [0x110C, 0x116C, 0x11BE], NFKC: [0xC8DB], NFKD: [0x110C, 0x116C, 0x11BE] }, +{ source: [0xC8DC], NFC: [0xC8DC], NFD: [0x110C, 0x116C, 0x11BF], NFKC: [0xC8DC], NFKD: [0x110C, 0x116C, 0x11BF] }, +{ source: [0xC8DD], NFC: [0xC8DD], NFD: [0x110C, 0x116C, 0x11C0], NFKC: [0xC8DD], NFKD: [0x110C, 0x116C, 0x11C0] }, +{ source: [0xC8DE], NFC: [0xC8DE], NFD: [0x110C, 0x116C, 0x11C1], NFKC: [0xC8DE], NFKD: [0x110C, 0x116C, 0x11C1] }, +{ source: [0xC8DF], NFC: [0xC8DF], NFD: [0x110C, 0x116C, 0x11C2], NFKC: [0xC8DF], NFKD: [0x110C, 0x116C, 0x11C2] }, +{ source: [0xC8E0], NFC: [0xC8E0], NFD: [0x110C, 0x116D], NFKC: [0xC8E0], NFKD: [0x110C, 0x116D] }, +{ source: [0xC8E1], NFC: [0xC8E1], NFD: [0x110C, 0x116D, 0x11A8], NFKC: [0xC8E1], NFKD: [0x110C, 0x116D, 0x11A8] }, +{ source: [0xC8E2], NFC: [0xC8E2], NFD: [0x110C, 0x116D, 0x11A9], NFKC: [0xC8E2], NFKD: [0x110C, 0x116D, 0x11A9] }, +{ source: [0xC8E3], NFC: [0xC8E3], NFD: [0x110C, 0x116D, 0x11AA], NFKC: [0xC8E3], NFKD: [0x110C, 0x116D, 0x11AA] }, +{ source: [0xC8E4], NFC: [0xC8E4], NFD: [0x110C, 0x116D, 0x11AB], NFKC: [0xC8E4], NFKD: [0x110C, 0x116D, 0x11AB] }, +{ source: [0xC8E5], NFC: [0xC8E5], NFD: [0x110C, 0x116D, 0x11AC], NFKC: [0xC8E5], NFKD: [0x110C, 0x116D, 0x11AC] }, +{ source: [0xC8E6], NFC: [0xC8E6], NFD: [0x110C, 0x116D, 0x11AD], NFKC: [0xC8E6], NFKD: [0x110C, 0x116D, 0x11AD] }, +{ source: [0xC8E7], NFC: [0xC8E7], NFD: [0x110C, 0x116D, 0x11AE], NFKC: [0xC8E7], NFKD: [0x110C, 0x116D, 0x11AE] }, +{ source: [0xC8E8], NFC: [0xC8E8], NFD: [0x110C, 0x116D, 0x11AF], NFKC: [0xC8E8], NFKD: [0x110C, 0x116D, 0x11AF] }, +{ source: [0xC8E9], NFC: [0xC8E9], NFD: [0x110C, 0x116D, 0x11B0], NFKC: [0xC8E9], NFKD: [0x110C, 0x116D, 0x11B0] }, +{ source: [0xC8EA], NFC: [0xC8EA], NFD: [0x110C, 0x116D, 0x11B1], NFKC: [0xC8EA], NFKD: [0x110C, 0x116D, 0x11B1] }, +{ source: [0xC8EB], NFC: [0xC8EB], NFD: [0x110C, 0x116D, 0x11B2], NFKC: [0xC8EB], NFKD: [0x110C, 0x116D, 0x11B2] }, +{ source: [0xC8EC], NFC: [0xC8EC], NFD: [0x110C, 0x116D, 0x11B3], NFKC: [0xC8EC], NFKD: [0x110C, 0x116D, 0x11B3] }, +{ source: [0xC8ED], NFC: [0xC8ED], NFD: [0x110C, 0x116D, 0x11B4], NFKC: [0xC8ED], NFKD: [0x110C, 0x116D, 0x11B4] }, +{ source: [0xC8EE], NFC: [0xC8EE], NFD: [0x110C, 0x116D, 0x11B5], NFKC: [0xC8EE], NFKD: [0x110C, 0x116D, 0x11B5] }, +{ source: [0xC8EF], NFC: [0xC8EF], NFD: [0x110C, 0x116D, 0x11B6], NFKC: [0xC8EF], NFKD: [0x110C, 0x116D, 0x11B6] }, +{ source: [0xC8F0], NFC: [0xC8F0], NFD: [0x110C, 0x116D, 0x11B7], NFKC: [0xC8F0], NFKD: [0x110C, 0x116D, 0x11B7] }, +{ source: [0xC8F1], NFC: [0xC8F1], NFD: [0x110C, 0x116D, 0x11B8], NFKC: [0xC8F1], NFKD: [0x110C, 0x116D, 0x11B8] }, +{ source: [0xC8F2], NFC: [0xC8F2], NFD: [0x110C, 0x116D, 0x11B9], NFKC: [0xC8F2], NFKD: [0x110C, 0x116D, 0x11B9] }, +{ source: [0xC8F3], NFC: [0xC8F3], NFD: [0x110C, 0x116D, 0x11BA], NFKC: [0xC8F3], NFKD: [0x110C, 0x116D, 0x11BA] }, +{ source: [0xC8F4], NFC: [0xC8F4], NFD: [0x110C, 0x116D, 0x11BB], NFKC: [0xC8F4], NFKD: [0x110C, 0x116D, 0x11BB] }, +{ source: [0xC8F5], NFC: [0xC8F5], NFD: [0x110C, 0x116D, 0x11BC], NFKC: [0xC8F5], NFKD: [0x110C, 0x116D, 0x11BC] }, +{ source: [0xC8F6], NFC: [0xC8F6], NFD: [0x110C, 0x116D, 0x11BD], NFKC: [0xC8F6], NFKD: [0x110C, 0x116D, 0x11BD] }, +{ source: [0xC8F7], NFC: [0xC8F7], NFD: [0x110C, 0x116D, 0x11BE], NFKC: [0xC8F7], NFKD: [0x110C, 0x116D, 0x11BE] }, +{ source: [0xC8F8], NFC: [0xC8F8], NFD: [0x110C, 0x116D, 0x11BF], NFKC: [0xC8F8], NFKD: [0x110C, 0x116D, 0x11BF] }, +{ source: [0xC8F9], NFC: [0xC8F9], NFD: [0x110C, 0x116D, 0x11C0], NFKC: [0xC8F9], NFKD: [0x110C, 0x116D, 0x11C0] }, +{ source: [0xC8FA], NFC: [0xC8FA], NFD: [0x110C, 0x116D, 0x11C1], NFKC: [0xC8FA], NFKD: [0x110C, 0x116D, 0x11C1] }, +{ source: [0xC8FB], NFC: [0xC8FB], NFD: [0x110C, 0x116D, 0x11C2], NFKC: [0xC8FB], NFKD: [0x110C, 0x116D, 0x11C2] }, +{ source: [0xC8FC], NFC: [0xC8FC], NFD: [0x110C, 0x116E], NFKC: [0xC8FC], NFKD: [0x110C, 0x116E] }, +{ source: [0xC8FD], NFC: [0xC8FD], NFD: [0x110C, 0x116E, 0x11A8], NFKC: [0xC8FD], NFKD: [0x110C, 0x116E, 0x11A8] }, +{ source: [0xC8FE], NFC: [0xC8FE], NFD: [0x110C, 0x116E, 0x11A9], NFKC: [0xC8FE], NFKD: [0x110C, 0x116E, 0x11A9] }, +{ source: [0xC8FF], NFC: [0xC8FF], NFD: [0x110C, 0x116E, 0x11AA], NFKC: [0xC8FF], NFKD: [0x110C, 0x116E, 0x11AA] }, +{ source: [0xC900], NFC: [0xC900], NFD: [0x110C, 0x116E, 0x11AB], NFKC: [0xC900], NFKD: [0x110C, 0x116E, 0x11AB] }, +{ source: [0xC901], NFC: [0xC901], NFD: [0x110C, 0x116E, 0x11AC], NFKC: [0xC901], NFKD: [0x110C, 0x116E, 0x11AC] }, +{ source: [0xC902], NFC: [0xC902], NFD: [0x110C, 0x116E, 0x11AD], NFKC: [0xC902], NFKD: [0x110C, 0x116E, 0x11AD] }, +{ source: [0xC903], NFC: [0xC903], NFD: [0x110C, 0x116E, 0x11AE], NFKC: [0xC903], NFKD: [0x110C, 0x116E, 0x11AE] }, +{ source: [0xC904], NFC: [0xC904], NFD: [0x110C, 0x116E, 0x11AF], NFKC: [0xC904], NFKD: [0x110C, 0x116E, 0x11AF] }, +{ source: [0xC905], NFC: [0xC905], NFD: [0x110C, 0x116E, 0x11B0], NFKC: [0xC905], NFKD: [0x110C, 0x116E, 0x11B0] }, +{ source: [0xC906], NFC: [0xC906], NFD: [0x110C, 0x116E, 0x11B1], NFKC: [0xC906], NFKD: [0x110C, 0x116E, 0x11B1] }, +{ source: [0xC907], NFC: [0xC907], NFD: [0x110C, 0x116E, 0x11B2], NFKC: [0xC907], NFKD: [0x110C, 0x116E, 0x11B2] }, +{ source: [0xC908], NFC: [0xC908], NFD: [0x110C, 0x116E, 0x11B3], NFKC: [0xC908], NFKD: [0x110C, 0x116E, 0x11B3] }, +{ source: [0xC909], NFC: [0xC909], NFD: [0x110C, 0x116E, 0x11B4], NFKC: [0xC909], NFKD: [0x110C, 0x116E, 0x11B4] }, +{ source: [0xC90A], NFC: [0xC90A], NFD: [0x110C, 0x116E, 0x11B5], NFKC: [0xC90A], NFKD: [0x110C, 0x116E, 0x11B5] }, +{ source: [0xC90B], NFC: [0xC90B], NFD: [0x110C, 0x116E, 0x11B6], NFKC: [0xC90B], NFKD: [0x110C, 0x116E, 0x11B6] }, +{ source: [0xC90C], NFC: [0xC90C], NFD: [0x110C, 0x116E, 0x11B7], NFKC: [0xC90C], NFKD: [0x110C, 0x116E, 0x11B7] }, +{ source: [0xC90D], NFC: [0xC90D], NFD: [0x110C, 0x116E, 0x11B8], NFKC: [0xC90D], NFKD: [0x110C, 0x116E, 0x11B8] }, +{ source: [0xC90E], NFC: [0xC90E], NFD: [0x110C, 0x116E, 0x11B9], NFKC: [0xC90E], NFKD: [0x110C, 0x116E, 0x11B9] }, +{ source: [0xC90F], NFC: [0xC90F], NFD: [0x110C, 0x116E, 0x11BA], NFKC: [0xC90F], NFKD: [0x110C, 0x116E, 0x11BA] }, +{ source: [0xC910], NFC: [0xC910], NFD: [0x110C, 0x116E, 0x11BB], NFKC: [0xC910], NFKD: [0x110C, 0x116E, 0x11BB] }, +{ source: [0xC911], NFC: [0xC911], NFD: [0x110C, 0x116E, 0x11BC], NFKC: [0xC911], NFKD: [0x110C, 0x116E, 0x11BC] }, +{ source: [0xC912], NFC: [0xC912], NFD: [0x110C, 0x116E, 0x11BD], NFKC: [0xC912], NFKD: [0x110C, 0x116E, 0x11BD] }, +{ source: [0xC913], NFC: [0xC913], NFD: [0x110C, 0x116E, 0x11BE], NFKC: [0xC913], NFKD: [0x110C, 0x116E, 0x11BE] }, +{ source: [0xC914], NFC: [0xC914], NFD: [0x110C, 0x116E, 0x11BF], NFKC: [0xC914], NFKD: [0x110C, 0x116E, 0x11BF] }, +{ source: [0xC915], NFC: [0xC915], NFD: [0x110C, 0x116E, 0x11C0], NFKC: [0xC915], NFKD: [0x110C, 0x116E, 0x11C0] }, +{ source: [0xC916], NFC: [0xC916], NFD: [0x110C, 0x116E, 0x11C1], NFKC: [0xC916], NFKD: [0x110C, 0x116E, 0x11C1] }, +{ source: [0xC917], NFC: [0xC917], NFD: [0x110C, 0x116E, 0x11C2], NFKC: [0xC917], NFKD: [0x110C, 0x116E, 0x11C2] }, +{ source: [0xC918], NFC: [0xC918], NFD: [0x110C, 0x116F], NFKC: [0xC918], NFKD: [0x110C, 0x116F] }, +{ source: [0xC919], NFC: [0xC919], NFD: [0x110C, 0x116F, 0x11A8], NFKC: [0xC919], NFKD: [0x110C, 0x116F, 0x11A8] }, +{ source: [0xC91A], NFC: [0xC91A], NFD: [0x110C, 0x116F, 0x11A9], NFKC: [0xC91A], NFKD: [0x110C, 0x116F, 0x11A9] }, +{ source: [0xC91B], NFC: [0xC91B], NFD: [0x110C, 0x116F, 0x11AA], NFKC: [0xC91B], NFKD: [0x110C, 0x116F, 0x11AA] }, +{ source: [0xC91C], NFC: [0xC91C], NFD: [0x110C, 0x116F, 0x11AB], NFKC: [0xC91C], NFKD: [0x110C, 0x116F, 0x11AB] }, +{ source: [0xC91D], NFC: [0xC91D], NFD: [0x110C, 0x116F, 0x11AC], NFKC: [0xC91D], NFKD: [0x110C, 0x116F, 0x11AC] }, +{ source: [0xC91E], NFC: [0xC91E], NFD: [0x110C, 0x116F, 0x11AD], NFKC: [0xC91E], NFKD: [0x110C, 0x116F, 0x11AD] }, +{ source: [0xC91F], NFC: [0xC91F], NFD: [0x110C, 0x116F, 0x11AE], NFKC: [0xC91F], NFKD: [0x110C, 0x116F, 0x11AE] }, +{ source: [0xC920], NFC: [0xC920], NFD: [0x110C, 0x116F, 0x11AF], NFKC: [0xC920], NFKD: [0x110C, 0x116F, 0x11AF] }, +{ source: [0xC921], NFC: [0xC921], NFD: [0x110C, 0x116F, 0x11B0], NFKC: [0xC921], NFKD: [0x110C, 0x116F, 0x11B0] }, +{ source: [0xC922], NFC: [0xC922], NFD: [0x110C, 0x116F, 0x11B1], NFKC: [0xC922], NFKD: [0x110C, 0x116F, 0x11B1] }, +{ source: [0xC923], NFC: [0xC923], NFD: [0x110C, 0x116F, 0x11B2], NFKC: [0xC923], NFKD: [0x110C, 0x116F, 0x11B2] }, +{ source: [0xC924], NFC: [0xC924], NFD: [0x110C, 0x116F, 0x11B3], NFKC: [0xC924], NFKD: [0x110C, 0x116F, 0x11B3] }, +{ source: [0xC925], NFC: [0xC925], NFD: [0x110C, 0x116F, 0x11B4], NFKC: [0xC925], NFKD: [0x110C, 0x116F, 0x11B4] }, +{ source: [0xC926], NFC: [0xC926], NFD: [0x110C, 0x116F, 0x11B5], NFKC: [0xC926], NFKD: [0x110C, 0x116F, 0x11B5] }, +{ source: [0xC927], NFC: [0xC927], NFD: [0x110C, 0x116F, 0x11B6], NFKC: [0xC927], NFKD: [0x110C, 0x116F, 0x11B6] }, +{ source: [0xC928], NFC: [0xC928], NFD: [0x110C, 0x116F, 0x11B7], NFKC: [0xC928], NFKD: [0x110C, 0x116F, 0x11B7] }, +{ source: [0xC929], NFC: [0xC929], NFD: [0x110C, 0x116F, 0x11B8], NFKC: [0xC929], NFKD: [0x110C, 0x116F, 0x11B8] }, +{ source: [0xC92A], NFC: [0xC92A], NFD: [0x110C, 0x116F, 0x11B9], NFKC: [0xC92A], NFKD: [0x110C, 0x116F, 0x11B9] }, +{ source: [0xC92B], NFC: [0xC92B], NFD: [0x110C, 0x116F, 0x11BA], NFKC: [0xC92B], NFKD: [0x110C, 0x116F, 0x11BA] }, +{ source: [0xC92C], NFC: [0xC92C], NFD: [0x110C, 0x116F, 0x11BB], NFKC: [0xC92C], NFKD: [0x110C, 0x116F, 0x11BB] }, +{ source: [0xC92D], NFC: [0xC92D], NFD: [0x110C, 0x116F, 0x11BC], NFKC: [0xC92D], NFKD: [0x110C, 0x116F, 0x11BC] }, +{ source: [0xC92E], NFC: [0xC92E], NFD: [0x110C, 0x116F, 0x11BD], NFKC: [0xC92E], NFKD: [0x110C, 0x116F, 0x11BD] }, +{ source: [0xC92F], NFC: [0xC92F], NFD: [0x110C, 0x116F, 0x11BE], NFKC: [0xC92F], NFKD: [0x110C, 0x116F, 0x11BE] }, +{ source: [0xC930], NFC: [0xC930], NFD: [0x110C, 0x116F, 0x11BF], NFKC: [0xC930], NFKD: [0x110C, 0x116F, 0x11BF] }, +{ source: [0xC931], NFC: [0xC931], NFD: [0x110C, 0x116F, 0x11C0], NFKC: [0xC931], NFKD: [0x110C, 0x116F, 0x11C0] }, +{ source: [0xC932], NFC: [0xC932], NFD: [0x110C, 0x116F, 0x11C1], NFKC: [0xC932], NFKD: [0x110C, 0x116F, 0x11C1] }, +{ source: [0xC933], NFC: [0xC933], NFD: [0x110C, 0x116F, 0x11C2], NFKC: [0xC933], NFKD: [0x110C, 0x116F, 0x11C2] }, +{ source: [0xC934], NFC: [0xC934], NFD: [0x110C, 0x1170], NFKC: [0xC934], NFKD: [0x110C, 0x1170] }, +{ source: [0xC935], NFC: [0xC935], NFD: [0x110C, 0x1170, 0x11A8], NFKC: [0xC935], NFKD: [0x110C, 0x1170, 0x11A8] }, +{ source: [0xC936], NFC: [0xC936], NFD: [0x110C, 0x1170, 0x11A9], NFKC: [0xC936], NFKD: [0x110C, 0x1170, 0x11A9] }, +{ source: [0xC937], NFC: [0xC937], NFD: [0x110C, 0x1170, 0x11AA], NFKC: [0xC937], NFKD: [0x110C, 0x1170, 0x11AA] }, +{ source: [0xC938], NFC: [0xC938], NFD: [0x110C, 0x1170, 0x11AB], NFKC: [0xC938], NFKD: [0x110C, 0x1170, 0x11AB] }, +{ source: [0xC939], NFC: [0xC939], NFD: [0x110C, 0x1170, 0x11AC], NFKC: [0xC939], NFKD: [0x110C, 0x1170, 0x11AC] }, +{ source: [0xC93A], NFC: [0xC93A], NFD: [0x110C, 0x1170, 0x11AD], NFKC: [0xC93A], NFKD: [0x110C, 0x1170, 0x11AD] }, +{ source: [0xC93B], NFC: [0xC93B], NFD: [0x110C, 0x1170, 0x11AE], NFKC: [0xC93B], NFKD: [0x110C, 0x1170, 0x11AE] }, +{ source: [0xC93C], NFC: [0xC93C], NFD: [0x110C, 0x1170, 0x11AF], NFKC: [0xC93C], NFKD: [0x110C, 0x1170, 0x11AF] }, +{ source: [0xC93D], NFC: [0xC93D], NFD: [0x110C, 0x1170, 0x11B0], NFKC: [0xC93D], NFKD: [0x110C, 0x1170, 0x11B0] }, +{ source: [0xC93E], NFC: [0xC93E], NFD: [0x110C, 0x1170, 0x11B1], NFKC: [0xC93E], NFKD: [0x110C, 0x1170, 0x11B1] }, +{ source: [0xC93F], NFC: [0xC93F], NFD: [0x110C, 0x1170, 0x11B2], NFKC: [0xC93F], NFKD: [0x110C, 0x1170, 0x11B2] }, +{ source: [0xC940], NFC: [0xC940], NFD: [0x110C, 0x1170, 0x11B3], NFKC: [0xC940], NFKD: [0x110C, 0x1170, 0x11B3] }, +{ source: [0xC941], NFC: [0xC941], NFD: [0x110C, 0x1170, 0x11B4], NFKC: [0xC941], NFKD: [0x110C, 0x1170, 0x11B4] }, +{ source: [0xC942], NFC: [0xC942], NFD: [0x110C, 0x1170, 0x11B5], NFKC: [0xC942], NFKD: [0x110C, 0x1170, 0x11B5] }, +{ source: [0xC943], NFC: [0xC943], NFD: [0x110C, 0x1170, 0x11B6], NFKC: [0xC943], NFKD: [0x110C, 0x1170, 0x11B6] }, +{ source: [0xC944], NFC: [0xC944], NFD: [0x110C, 0x1170, 0x11B7], NFKC: [0xC944], NFKD: [0x110C, 0x1170, 0x11B7] }, +{ source: [0xC945], NFC: [0xC945], NFD: [0x110C, 0x1170, 0x11B8], NFKC: [0xC945], NFKD: [0x110C, 0x1170, 0x11B8] }, +{ source: [0xC946], NFC: [0xC946], NFD: [0x110C, 0x1170, 0x11B9], NFKC: [0xC946], NFKD: [0x110C, 0x1170, 0x11B9] }, +{ source: [0xC947], NFC: [0xC947], NFD: [0x110C, 0x1170, 0x11BA], NFKC: [0xC947], NFKD: [0x110C, 0x1170, 0x11BA] }, +{ source: [0xC948], NFC: [0xC948], NFD: [0x110C, 0x1170, 0x11BB], NFKC: [0xC948], NFKD: [0x110C, 0x1170, 0x11BB] }, +{ source: [0xC949], NFC: [0xC949], NFD: [0x110C, 0x1170, 0x11BC], NFKC: [0xC949], NFKD: [0x110C, 0x1170, 0x11BC] }, +{ source: [0xC94A], NFC: [0xC94A], NFD: [0x110C, 0x1170, 0x11BD], NFKC: [0xC94A], NFKD: [0x110C, 0x1170, 0x11BD] }, +{ source: [0xC94B], NFC: [0xC94B], NFD: [0x110C, 0x1170, 0x11BE], NFKC: [0xC94B], NFKD: [0x110C, 0x1170, 0x11BE] }, +{ source: [0xC94C], NFC: [0xC94C], NFD: [0x110C, 0x1170, 0x11BF], NFKC: [0xC94C], NFKD: [0x110C, 0x1170, 0x11BF] }, +{ source: [0xC94D], NFC: [0xC94D], NFD: [0x110C, 0x1170, 0x11C0], NFKC: [0xC94D], NFKD: [0x110C, 0x1170, 0x11C0] }, +{ source: [0xC94E], NFC: [0xC94E], NFD: [0x110C, 0x1170, 0x11C1], NFKC: [0xC94E], NFKD: [0x110C, 0x1170, 0x11C1] }, +{ source: [0xC94F], NFC: [0xC94F], NFD: [0x110C, 0x1170, 0x11C2], NFKC: [0xC94F], NFKD: [0x110C, 0x1170, 0x11C2] }, +{ source: [0xC950], NFC: [0xC950], NFD: [0x110C, 0x1171], NFKC: [0xC950], NFKD: [0x110C, 0x1171] }, +{ source: [0xC951], NFC: [0xC951], NFD: [0x110C, 0x1171, 0x11A8], NFKC: [0xC951], NFKD: [0x110C, 0x1171, 0x11A8] }, +{ source: [0xC952], NFC: [0xC952], NFD: [0x110C, 0x1171, 0x11A9], NFKC: [0xC952], NFKD: [0x110C, 0x1171, 0x11A9] }, +{ source: [0xC953], NFC: [0xC953], NFD: [0x110C, 0x1171, 0x11AA], NFKC: [0xC953], NFKD: [0x110C, 0x1171, 0x11AA] }, +{ source: [0xC954], NFC: [0xC954], NFD: [0x110C, 0x1171, 0x11AB], NFKC: [0xC954], NFKD: [0x110C, 0x1171, 0x11AB] }, +{ source: [0xC955], NFC: [0xC955], NFD: [0x110C, 0x1171, 0x11AC], NFKC: [0xC955], NFKD: [0x110C, 0x1171, 0x11AC] }, +{ source: [0xC956], NFC: [0xC956], NFD: [0x110C, 0x1171, 0x11AD], NFKC: [0xC956], NFKD: [0x110C, 0x1171, 0x11AD] }, +{ source: [0xC957], NFC: [0xC957], NFD: [0x110C, 0x1171, 0x11AE], NFKC: [0xC957], NFKD: [0x110C, 0x1171, 0x11AE] }, +{ source: [0xC958], NFC: [0xC958], NFD: [0x110C, 0x1171, 0x11AF], NFKC: [0xC958], NFKD: [0x110C, 0x1171, 0x11AF] }, +{ source: [0xC959], NFC: [0xC959], NFD: [0x110C, 0x1171, 0x11B0], NFKC: [0xC959], NFKD: [0x110C, 0x1171, 0x11B0] }, +{ source: [0xC95A], NFC: [0xC95A], NFD: [0x110C, 0x1171, 0x11B1], NFKC: [0xC95A], NFKD: [0x110C, 0x1171, 0x11B1] }, +{ source: [0xC95B], NFC: [0xC95B], NFD: [0x110C, 0x1171, 0x11B2], NFKC: [0xC95B], NFKD: [0x110C, 0x1171, 0x11B2] }, +{ source: [0xC95C], NFC: [0xC95C], NFD: [0x110C, 0x1171, 0x11B3], NFKC: [0xC95C], NFKD: [0x110C, 0x1171, 0x11B3] }, +{ source: [0xC95D], NFC: [0xC95D], NFD: [0x110C, 0x1171, 0x11B4], NFKC: [0xC95D], NFKD: [0x110C, 0x1171, 0x11B4] }, +{ source: [0xC95E], NFC: [0xC95E], NFD: [0x110C, 0x1171, 0x11B5], NFKC: [0xC95E], NFKD: [0x110C, 0x1171, 0x11B5] }, +{ source: [0xC95F], NFC: [0xC95F], NFD: [0x110C, 0x1171, 0x11B6], NFKC: [0xC95F], NFKD: [0x110C, 0x1171, 0x11B6] }, +{ source: [0xC960], NFC: [0xC960], NFD: [0x110C, 0x1171, 0x11B7], NFKC: [0xC960], NFKD: [0x110C, 0x1171, 0x11B7] }, +{ source: [0xC961], NFC: [0xC961], NFD: [0x110C, 0x1171, 0x11B8], NFKC: [0xC961], NFKD: [0x110C, 0x1171, 0x11B8] }, +{ source: [0xC962], NFC: [0xC962], NFD: [0x110C, 0x1171, 0x11B9], NFKC: [0xC962], NFKD: [0x110C, 0x1171, 0x11B9] }, +{ source: [0xC963], NFC: [0xC963], NFD: [0x110C, 0x1171, 0x11BA], NFKC: [0xC963], NFKD: [0x110C, 0x1171, 0x11BA] }, +{ source: [0xC964], NFC: [0xC964], NFD: [0x110C, 0x1171, 0x11BB], NFKC: [0xC964], NFKD: [0x110C, 0x1171, 0x11BB] }, +{ source: [0xC965], NFC: [0xC965], NFD: [0x110C, 0x1171, 0x11BC], NFKC: [0xC965], NFKD: [0x110C, 0x1171, 0x11BC] }, +{ source: [0xC966], NFC: [0xC966], NFD: [0x110C, 0x1171, 0x11BD], NFKC: [0xC966], NFKD: [0x110C, 0x1171, 0x11BD] }, +{ source: [0xC967], NFC: [0xC967], NFD: [0x110C, 0x1171, 0x11BE], NFKC: [0xC967], NFKD: [0x110C, 0x1171, 0x11BE] }, +{ source: [0xC968], NFC: [0xC968], NFD: [0x110C, 0x1171, 0x11BF], NFKC: [0xC968], NFKD: [0x110C, 0x1171, 0x11BF] }, +{ source: [0xC969], NFC: [0xC969], NFD: [0x110C, 0x1171, 0x11C0], NFKC: [0xC969], NFKD: [0x110C, 0x1171, 0x11C0] }, +{ source: [0xC96A], NFC: [0xC96A], NFD: [0x110C, 0x1171, 0x11C1], NFKC: [0xC96A], NFKD: [0x110C, 0x1171, 0x11C1] }, +{ source: [0xC96B], NFC: [0xC96B], NFD: [0x110C, 0x1171, 0x11C2], NFKC: [0xC96B], NFKD: [0x110C, 0x1171, 0x11C2] }, +{ source: [0xC96C], NFC: [0xC96C], NFD: [0x110C, 0x1172], NFKC: [0xC96C], NFKD: [0x110C, 0x1172] }, +{ source: [0xC96D], NFC: [0xC96D], NFD: [0x110C, 0x1172, 0x11A8], NFKC: [0xC96D], NFKD: [0x110C, 0x1172, 0x11A8] }, +{ source: [0xC96E], NFC: [0xC96E], NFD: [0x110C, 0x1172, 0x11A9], NFKC: [0xC96E], NFKD: [0x110C, 0x1172, 0x11A9] }, +{ source: [0xC96F], NFC: [0xC96F], NFD: [0x110C, 0x1172, 0x11AA], NFKC: [0xC96F], NFKD: [0x110C, 0x1172, 0x11AA] }, +{ source: [0xC970], NFC: [0xC970], NFD: [0x110C, 0x1172, 0x11AB], NFKC: [0xC970], NFKD: [0x110C, 0x1172, 0x11AB] }, +{ source: [0xC971], NFC: [0xC971], NFD: [0x110C, 0x1172, 0x11AC], NFKC: [0xC971], NFKD: [0x110C, 0x1172, 0x11AC] }, +{ source: [0xC972], NFC: [0xC972], NFD: [0x110C, 0x1172, 0x11AD], NFKC: [0xC972], NFKD: [0x110C, 0x1172, 0x11AD] }, +{ source: [0xC973], NFC: [0xC973], NFD: [0x110C, 0x1172, 0x11AE], NFKC: [0xC973], NFKD: [0x110C, 0x1172, 0x11AE] }, +{ source: [0xC974], NFC: [0xC974], NFD: [0x110C, 0x1172, 0x11AF], NFKC: [0xC974], NFKD: [0x110C, 0x1172, 0x11AF] }, +{ source: [0xC975], NFC: [0xC975], NFD: [0x110C, 0x1172, 0x11B0], NFKC: [0xC975], NFKD: [0x110C, 0x1172, 0x11B0] }, +{ source: [0xC976], NFC: [0xC976], NFD: [0x110C, 0x1172, 0x11B1], NFKC: [0xC976], NFKD: [0x110C, 0x1172, 0x11B1] }, +{ source: [0xC977], NFC: [0xC977], NFD: [0x110C, 0x1172, 0x11B2], NFKC: [0xC977], NFKD: [0x110C, 0x1172, 0x11B2] }, +{ source: [0xC978], NFC: [0xC978], NFD: [0x110C, 0x1172, 0x11B3], NFKC: [0xC978], NFKD: [0x110C, 0x1172, 0x11B3] }, +{ source: [0xC979], NFC: [0xC979], NFD: [0x110C, 0x1172, 0x11B4], NFKC: [0xC979], NFKD: [0x110C, 0x1172, 0x11B4] }, +{ source: [0xC97A], NFC: [0xC97A], NFD: [0x110C, 0x1172, 0x11B5], NFKC: [0xC97A], NFKD: [0x110C, 0x1172, 0x11B5] }, +{ source: [0xC97B], NFC: [0xC97B], NFD: [0x110C, 0x1172, 0x11B6], NFKC: [0xC97B], NFKD: [0x110C, 0x1172, 0x11B6] }, +{ source: [0xC97C], NFC: [0xC97C], NFD: [0x110C, 0x1172, 0x11B7], NFKC: [0xC97C], NFKD: [0x110C, 0x1172, 0x11B7] }, +{ source: [0xC97D], NFC: [0xC97D], NFD: [0x110C, 0x1172, 0x11B8], NFKC: [0xC97D], NFKD: [0x110C, 0x1172, 0x11B8] }, +{ source: [0xC97E], NFC: [0xC97E], NFD: [0x110C, 0x1172, 0x11B9], NFKC: [0xC97E], NFKD: [0x110C, 0x1172, 0x11B9] }, +{ source: [0xC97F], NFC: [0xC97F], NFD: [0x110C, 0x1172, 0x11BA], NFKC: [0xC97F], NFKD: [0x110C, 0x1172, 0x11BA] }, +{ source: [0xC980], NFC: [0xC980], NFD: [0x110C, 0x1172, 0x11BB], NFKC: [0xC980], NFKD: [0x110C, 0x1172, 0x11BB] }, +{ source: [0xC981], NFC: [0xC981], NFD: [0x110C, 0x1172, 0x11BC], NFKC: [0xC981], NFKD: [0x110C, 0x1172, 0x11BC] }, +{ source: [0xC982], NFC: [0xC982], NFD: [0x110C, 0x1172, 0x11BD], NFKC: [0xC982], NFKD: [0x110C, 0x1172, 0x11BD] }, +{ source: [0xC983], NFC: [0xC983], NFD: [0x110C, 0x1172, 0x11BE], NFKC: [0xC983], NFKD: [0x110C, 0x1172, 0x11BE] }, +{ source: [0xC984], NFC: [0xC984], NFD: [0x110C, 0x1172, 0x11BF], NFKC: [0xC984], NFKD: [0x110C, 0x1172, 0x11BF] }, +{ source: [0xC985], NFC: [0xC985], NFD: [0x110C, 0x1172, 0x11C0], NFKC: [0xC985], NFKD: [0x110C, 0x1172, 0x11C0] }, +{ source: [0xC986], NFC: [0xC986], NFD: [0x110C, 0x1172, 0x11C1], NFKC: [0xC986], NFKD: [0x110C, 0x1172, 0x11C1] }, +{ source: [0xC987], NFC: [0xC987], NFD: [0x110C, 0x1172, 0x11C2], NFKC: [0xC987], NFKD: [0x110C, 0x1172, 0x11C2] }, +{ source: [0xC988], NFC: [0xC988], NFD: [0x110C, 0x1173], NFKC: [0xC988], NFKD: [0x110C, 0x1173] }, +{ source: [0xC989], NFC: [0xC989], NFD: [0x110C, 0x1173, 0x11A8], NFKC: [0xC989], NFKD: [0x110C, 0x1173, 0x11A8] }, +{ source: [0xC98A], NFC: [0xC98A], NFD: [0x110C, 0x1173, 0x11A9], NFKC: [0xC98A], NFKD: [0x110C, 0x1173, 0x11A9] }, +{ source: [0xC98B], NFC: [0xC98B], NFD: [0x110C, 0x1173, 0x11AA], NFKC: [0xC98B], NFKD: [0x110C, 0x1173, 0x11AA] }, +{ source: [0xC98C], NFC: [0xC98C], NFD: [0x110C, 0x1173, 0x11AB], NFKC: [0xC98C], NFKD: [0x110C, 0x1173, 0x11AB] }, +{ source: [0xC98D], NFC: [0xC98D], NFD: [0x110C, 0x1173, 0x11AC], NFKC: [0xC98D], NFKD: [0x110C, 0x1173, 0x11AC] }, +{ source: [0xC98E], NFC: [0xC98E], NFD: [0x110C, 0x1173, 0x11AD], NFKC: [0xC98E], NFKD: [0x110C, 0x1173, 0x11AD] }, +{ source: [0xC98F], NFC: [0xC98F], NFD: [0x110C, 0x1173, 0x11AE], NFKC: [0xC98F], NFKD: [0x110C, 0x1173, 0x11AE] }, +{ source: [0xC990], NFC: [0xC990], NFD: [0x110C, 0x1173, 0x11AF], NFKC: [0xC990], NFKD: [0x110C, 0x1173, 0x11AF] }, +{ source: [0xC991], NFC: [0xC991], NFD: [0x110C, 0x1173, 0x11B0], NFKC: [0xC991], NFKD: [0x110C, 0x1173, 0x11B0] }, +{ source: [0xC992], NFC: [0xC992], NFD: [0x110C, 0x1173, 0x11B1], NFKC: [0xC992], NFKD: [0x110C, 0x1173, 0x11B1] }, +{ source: [0xC993], NFC: [0xC993], NFD: [0x110C, 0x1173, 0x11B2], NFKC: [0xC993], NFKD: [0x110C, 0x1173, 0x11B2] }, +{ source: [0xC994], NFC: [0xC994], NFD: [0x110C, 0x1173, 0x11B3], NFKC: [0xC994], NFKD: [0x110C, 0x1173, 0x11B3] }, +{ source: [0xC995], NFC: [0xC995], NFD: [0x110C, 0x1173, 0x11B4], NFKC: [0xC995], NFKD: [0x110C, 0x1173, 0x11B4] }, +{ source: [0xC996], NFC: [0xC996], NFD: [0x110C, 0x1173, 0x11B5], NFKC: [0xC996], NFKD: [0x110C, 0x1173, 0x11B5] }, +{ source: [0xC997], NFC: [0xC997], NFD: [0x110C, 0x1173, 0x11B6], NFKC: [0xC997], NFKD: [0x110C, 0x1173, 0x11B6] }, +{ source: [0xC998], NFC: [0xC998], NFD: [0x110C, 0x1173, 0x11B7], NFKC: [0xC998], NFKD: [0x110C, 0x1173, 0x11B7] }, +{ source: [0xC999], NFC: [0xC999], NFD: [0x110C, 0x1173, 0x11B8], NFKC: [0xC999], NFKD: [0x110C, 0x1173, 0x11B8] }, +{ source: [0xC99A], NFC: [0xC99A], NFD: [0x110C, 0x1173, 0x11B9], NFKC: [0xC99A], NFKD: [0x110C, 0x1173, 0x11B9] }, +{ source: [0xC99B], NFC: [0xC99B], NFD: [0x110C, 0x1173, 0x11BA], NFKC: [0xC99B], NFKD: [0x110C, 0x1173, 0x11BA] }, +{ source: [0xC99C], NFC: [0xC99C], NFD: [0x110C, 0x1173, 0x11BB], NFKC: [0xC99C], NFKD: [0x110C, 0x1173, 0x11BB] }, +{ source: [0xC99D], NFC: [0xC99D], NFD: [0x110C, 0x1173, 0x11BC], NFKC: [0xC99D], NFKD: [0x110C, 0x1173, 0x11BC] }, +{ source: [0xC99E], NFC: [0xC99E], NFD: [0x110C, 0x1173, 0x11BD], NFKC: [0xC99E], NFKD: [0x110C, 0x1173, 0x11BD] }, +{ source: [0xC99F], NFC: [0xC99F], NFD: [0x110C, 0x1173, 0x11BE], NFKC: [0xC99F], NFKD: [0x110C, 0x1173, 0x11BE] }, +{ source: [0xC9A0], NFC: [0xC9A0], NFD: [0x110C, 0x1173, 0x11BF], NFKC: [0xC9A0], NFKD: [0x110C, 0x1173, 0x11BF] }, +{ source: [0xC9A1], NFC: [0xC9A1], NFD: [0x110C, 0x1173, 0x11C0], NFKC: [0xC9A1], NFKD: [0x110C, 0x1173, 0x11C0] }, +{ source: [0xC9A2], NFC: [0xC9A2], NFD: [0x110C, 0x1173, 0x11C1], NFKC: [0xC9A2], NFKD: [0x110C, 0x1173, 0x11C1] }, +{ source: [0xC9A3], NFC: [0xC9A3], NFD: [0x110C, 0x1173, 0x11C2], NFKC: [0xC9A3], NFKD: [0x110C, 0x1173, 0x11C2] }, +{ source: [0xC9A4], NFC: [0xC9A4], NFD: [0x110C, 0x1174], NFKC: [0xC9A4], NFKD: [0x110C, 0x1174] }, +{ source: [0xC9A5], NFC: [0xC9A5], NFD: [0x110C, 0x1174, 0x11A8], NFKC: [0xC9A5], NFKD: [0x110C, 0x1174, 0x11A8] }, +{ source: [0xC9A6], NFC: [0xC9A6], NFD: [0x110C, 0x1174, 0x11A9], NFKC: [0xC9A6], NFKD: [0x110C, 0x1174, 0x11A9] }, +{ source: [0xC9A7], NFC: [0xC9A7], NFD: [0x110C, 0x1174, 0x11AA], NFKC: [0xC9A7], NFKD: [0x110C, 0x1174, 0x11AA] }, +{ source: [0xC9A8], NFC: [0xC9A8], NFD: [0x110C, 0x1174, 0x11AB], NFKC: [0xC9A8], NFKD: [0x110C, 0x1174, 0x11AB] }, +{ source: [0xC9A9], NFC: [0xC9A9], NFD: [0x110C, 0x1174, 0x11AC], NFKC: [0xC9A9], NFKD: [0x110C, 0x1174, 0x11AC] }, +{ source: [0xC9AA], NFC: [0xC9AA], NFD: [0x110C, 0x1174, 0x11AD], NFKC: [0xC9AA], NFKD: [0x110C, 0x1174, 0x11AD] }, +{ source: [0xC9AB], NFC: [0xC9AB], NFD: [0x110C, 0x1174, 0x11AE], NFKC: [0xC9AB], NFKD: [0x110C, 0x1174, 0x11AE] }, +{ source: [0xC9AC], NFC: [0xC9AC], NFD: [0x110C, 0x1174, 0x11AF], NFKC: [0xC9AC], NFKD: [0x110C, 0x1174, 0x11AF] }, +{ source: [0xC9AD], NFC: [0xC9AD], NFD: [0x110C, 0x1174, 0x11B0], NFKC: [0xC9AD], NFKD: [0x110C, 0x1174, 0x11B0] }, +{ source: [0xC9AE], NFC: [0xC9AE], NFD: [0x110C, 0x1174, 0x11B1], NFKC: [0xC9AE], NFKD: [0x110C, 0x1174, 0x11B1] }, +{ source: [0xC9AF], NFC: [0xC9AF], NFD: [0x110C, 0x1174, 0x11B2], NFKC: [0xC9AF], NFKD: [0x110C, 0x1174, 0x11B2] }, +{ source: [0xC9B0], NFC: [0xC9B0], NFD: [0x110C, 0x1174, 0x11B3], NFKC: [0xC9B0], NFKD: [0x110C, 0x1174, 0x11B3] }, +{ source: [0xC9B1], NFC: [0xC9B1], NFD: [0x110C, 0x1174, 0x11B4], NFKC: [0xC9B1], NFKD: [0x110C, 0x1174, 0x11B4] }, +{ source: [0xC9B2], NFC: [0xC9B2], NFD: [0x110C, 0x1174, 0x11B5], NFKC: [0xC9B2], NFKD: [0x110C, 0x1174, 0x11B5] }, +{ source: [0xC9B3], NFC: [0xC9B3], NFD: [0x110C, 0x1174, 0x11B6], NFKC: [0xC9B3], NFKD: [0x110C, 0x1174, 0x11B6] }, +{ source: [0xC9B4], NFC: [0xC9B4], NFD: [0x110C, 0x1174, 0x11B7], NFKC: [0xC9B4], NFKD: [0x110C, 0x1174, 0x11B7] }, +{ source: [0xC9B5], NFC: [0xC9B5], NFD: [0x110C, 0x1174, 0x11B8], NFKC: [0xC9B5], NFKD: [0x110C, 0x1174, 0x11B8] }, +{ source: [0xC9B6], NFC: [0xC9B6], NFD: [0x110C, 0x1174, 0x11B9], NFKC: [0xC9B6], NFKD: [0x110C, 0x1174, 0x11B9] }, +{ source: [0xC9B7], NFC: [0xC9B7], NFD: [0x110C, 0x1174, 0x11BA], NFKC: [0xC9B7], NFKD: [0x110C, 0x1174, 0x11BA] }, +{ source: [0xC9B8], NFC: [0xC9B8], NFD: [0x110C, 0x1174, 0x11BB], NFKC: [0xC9B8], NFKD: [0x110C, 0x1174, 0x11BB] }, +{ source: [0xC9B9], NFC: [0xC9B9], NFD: [0x110C, 0x1174, 0x11BC], NFKC: [0xC9B9], NFKD: [0x110C, 0x1174, 0x11BC] }, +{ source: [0xC9BA], NFC: [0xC9BA], NFD: [0x110C, 0x1174, 0x11BD], NFKC: [0xC9BA], NFKD: [0x110C, 0x1174, 0x11BD] }, +{ source: [0xC9BB], NFC: [0xC9BB], NFD: [0x110C, 0x1174, 0x11BE], NFKC: [0xC9BB], NFKD: [0x110C, 0x1174, 0x11BE] }, +{ source: [0xC9BC], NFC: [0xC9BC], NFD: [0x110C, 0x1174, 0x11BF], NFKC: [0xC9BC], NFKD: [0x110C, 0x1174, 0x11BF] }, +{ source: [0xC9BD], NFC: [0xC9BD], NFD: [0x110C, 0x1174, 0x11C0], NFKC: [0xC9BD], NFKD: [0x110C, 0x1174, 0x11C0] }, +{ source: [0xC9BE], NFC: [0xC9BE], NFD: [0x110C, 0x1174, 0x11C1], NFKC: [0xC9BE], NFKD: [0x110C, 0x1174, 0x11C1] }, +{ source: [0xC9BF], NFC: [0xC9BF], NFD: [0x110C, 0x1174, 0x11C2], NFKC: [0xC9BF], NFKD: [0x110C, 0x1174, 0x11C2] }, +{ source: [0xC9C0], NFC: [0xC9C0], NFD: [0x110C, 0x1175], NFKC: [0xC9C0], NFKD: [0x110C, 0x1175] }, +{ source: [0xC9C1], NFC: [0xC9C1], NFD: [0x110C, 0x1175, 0x11A8], NFKC: [0xC9C1], NFKD: [0x110C, 0x1175, 0x11A8] }, +{ source: [0xC9C2], NFC: [0xC9C2], NFD: [0x110C, 0x1175, 0x11A9], NFKC: [0xC9C2], NFKD: [0x110C, 0x1175, 0x11A9] }, +{ source: [0xC9C3], NFC: [0xC9C3], NFD: [0x110C, 0x1175, 0x11AA], NFKC: [0xC9C3], NFKD: [0x110C, 0x1175, 0x11AA] }, +{ source: [0xC9C4], NFC: [0xC9C4], NFD: [0x110C, 0x1175, 0x11AB], NFKC: [0xC9C4], NFKD: [0x110C, 0x1175, 0x11AB] }, +{ source: [0xC9C5], NFC: [0xC9C5], NFD: [0x110C, 0x1175, 0x11AC], NFKC: [0xC9C5], NFKD: [0x110C, 0x1175, 0x11AC] }, +{ source: [0xC9C6], NFC: [0xC9C6], NFD: [0x110C, 0x1175, 0x11AD], NFKC: [0xC9C6], NFKD: [0x110C, 0x1175, 0x11AD] }, +{ source: [0xC9C7], NFC: [0xC9C7], NFD: [0x110C, 0x1175, 0x11AE], NFKC: [0xC9C7], NFKD: [0x110C, 0x1175, 0x11AE] }, +{ source: [0xC9C8], NFC: [0xC9C8], NFD: [0x110C, 0x1175, 0x11AF], NFKC: [0xC9C8], NFKD: [0x110C, 0x1175, 0x11AF] }, +{ source: [0xC9C9], NFC: [0xC9C9], NFD: [0x110C, 0x1175, 0x11B0], NFKC: [0xC9C9], NFKD: [0x110C, 0x1175, 0x11B0] }, +{ source: [0xC9CA], NFC: [0xC9CA], NFD: [0x110C, 0x1175, 0x11B1], NFKC: [0xC9CA], NFKD: [0x110C, 0x1175, 0x11B1] }, +{ source: [0xC9CB], NFC: [0xC9CB], NFD: [0x110C, 0x1175, 0x11B2], NFKC: [0xC9CB], NFKD: [0x110C, 0x1175, 0x11B2] }, +{ source: [0xC9CC], NFC: [0xC9CC], NFD: [0x110C, 0x1175, 0x11B3], NFKC: [0xC9CC], NFKD: [0x110C, 0x1175, 0x11B3] }, +{ source: [0xC9CD], NFC: [0xC9CD], NFD: [0x110C, 0x1175, 0x11B4], NFKC: [0xC9CD], NFKD: [0x110C, 0x1175, 0x11B4] }, +{ source: [0xC9CE], NFC: [0xC9CE], NFD: [0x110C, 0x1175, 0x11B5], NFKC: [0xC9CE], NFKD: [0x110C, 0x1175, 0x11B5] }, +{ source: [0xC9CF], NFC: [0xC9CF], NFD: [0x110C, 0x1175, 0x11B6], NFKC: [0xC9CF], NFKD: [0x110C, 0x1175, 0x11B6] }, +{ source: [0xC9D0], NFC: [0xC9D0], NFD: [0x110C, 0x1175, 0x11B7], NFKC: [0xC9D0], NFKD: [0x110C, 0x1175, 0x11B7] }, +{ source: [0xC9D1], NFC: [0xC9D1], NFD: [0x110C, 0x1175, 0x11B8], NFKC: [0xC9D1], NFKD: [0x110C, 0x1175, 0x11B8] }, +{ source: [0xC9D2], NFC: [0xC9D2], NFD: [0x110C, 0x1175, 0x11B9], NFKC: [0xC9D2], NFKD: [0x110C, 0x1175, 0x11B9] }, +{ source: [0xC9D3], NFC: [0xC9D3], NFD: [0x110C, 0x1175, 0x11BA], NFKC: [0xC9D3], NFKD: [0x110C, 0x1175, 0x11BA] }, +{ source: [0xC9D4], NFC: [0xC9D4], NFD: [0x110C, 0x1175, 0x11BB], NFKC: [0xC9D4], NFKD: [0x110C, 0x1175, 0x11BB] }, +{ source: [0xC9D5], NFC: [0xC9D5], NFD: [0x110C, 0x1175, 0x11BC], NFKC: [0xC9D5], NFKD: [0x110C, 0x1175, 0x11BC] }, +{ source: [0xC9D6], NFC: [0xC9D6], NFD: [0x110C, 0x1175, 0x11BD], NFKC: [0xC9D6], NFKD: [0x110C, 0x1175, 0x11BD] }, +{ source: [0xC9D7], NFC: [0xC9D7], NFD: [0x110C, 0x1175, 0x11BE], NFKC: [0xC9D7], NFKD: [0x110C, 0x1175, 0x11BE] }, +{ source: [0xC9D8], NFC: [0xC9D8], NFD: [0x110C, 0x1175, 0x11BF], NFKC: [0xC9D8], NFKD: [0x110C, 0x1175, 0x11BF] }, +{ source: [0xC9D9], NFC: [0xC9D9], NFD: [0x110C, 0x1175, 0x11C0], NFKC: [0xC9D9], NFKD: [0x110C, 0x1175, 0x11C0] }, +{ source: [0xC9DA], NFC: [0xC9DA], NFD: [0x110C, 0x1175, 0x11C1], NFKC: [0xC9DA], NFKD: [0x110C, 0x1175, 0x11C1] }, +{ source: [0xC9DB], NFC: [0xC9DB], NFD: [0x110C, 0x1175, 0x11C2], NFKC: [0xC9DB], NFKD: [0x110C, 0x1175, 0x11C2] }, +{ source: [0xC9DC], NFC: [0xC9DC], NFD: [0x110D, 0x1161], NFKC: [0xC9DC], NFKD: [0x110D, 0x1161] }, +{ source: [0xC9DD], NFC: [0xC9DD], NFD: [0x110D, 0x1161, 0x11A8], NFKC: [0xC9DD], NFKD: [0x110D, 0x1161, 0x11A8] }, +{ source: [0xC9DE], NFC: [0xC9DE], NFD: [0x110D, 0x1161, 0x11A9], NFKC: [0xC9DE], NFKD: [0x110D, 0x1161, 0x11A9] }, +{ source: [0xC9DF], NFC: [0xC9DF], NFD: [0x110D, 0x1161, 0x11AA], NFKC: [0xC9DF], NFKD: [0x110D, 0x1161, 0x11AA] }, +{ source: [0xC9E0], NFC: [0xC9E0], NFD: [0x110D, 0x1161, 0x11AB], NFKC: [0xC9E0], NFKD: [0x110D, 0x1161, 0x11AB] }, +{ source: [0xC9E1], NFC: [0xC9E1], NFD: [0x110D, 0x1161, 0x11AC], NFKC: [0xC9E1], NFKD: [0x110D, 0x1161, 0x11AC] }, +{ source: [0xC9E2], NFC: [0xC9E2], NFD: [0x110D, 0x1161, 0x11AD], NFKC: [0xC9E2], NFKD: [0x110D, 0x1161, 0x11AD] }, +{ source: [0xC9E3], NFC: [0xC9E3], NFD: [0x110D, 0x1161, 0x11AE], NFKC: [0xC9E3], NFKD: [0x110D, 0x1161, 0x11AE] }, +{ source: [0xC9E4], NFC: [0xC9E4], NFD: [0x110D, 0x1161, 0x11AF], NFKC: [0xC9E4], NFKD: [0x110D, 0x1161, 0x11AF] }, +{ source: [0xC9E5], NFC: [0xC9E5], NFD: [0x110D, 0x1161, 0x11B0], NFKC: [0xC9E5], NFKD: [0x110D, 0x1161, 0x11B0] }, +{ source: [0xC9E6], NFC: [0xC9E6], NFD: [0x110D, 0x1161, 0x11B1], NFKC: [0xC9E6], NFKD: [0x110D, 0x1161, 0x11B1] }, +{ source: [0xC9E7], NFC: [0xC9E7], NFD: [0x110D, 0x1161, 0x11B2], NFKC: [0xC9E7], NFKD: [0x110D, 0x1161, 0x11B2] }, +{ source: [0xC9E8], NFC: [0xC9E8], NFD: [0x110D, 0x1161, 0x11B3], NFKC: [0xC9E8], NFKD: [0x110D, 0x1161, 0x11B3] }, +{ source: [0xC9E9], NFC: [0xC9E9], NFD: [0x110D, 0x1161, 0x11B4], NFKC: [0xC9E9], NFKD: [0x110D, 0x1161, 0x11B4] }, +{ source: [0xC9EA], NFC: [0xC9EA], NFD: [0x110D, 0x1161, 0x11B5], NFKC: [0xC9EA], NFKD: [0x110D, 0x1161, 0x11B5] }, +{ source: [0xC9EB], NFC: [0xC9EB], NFD: [0x110D, 0x1161, 0x11B6], NFKC: [0xC9EB], NFKD: [0x110D, 0x1161, 0x11B6] }, +{ source: [0xC9EC], NFC: [0xC9EC], NFD: [0x110D, 0x1161, 0x11B7], NFKC: [0xC9EC], NFKD: [0x110D, 0x1161, 0x11B7] }, +{ source: [0xC9ED], NFC: [0xC9ED], NFD: [0x110D, 0x1161, 0x11B8], NFKC: [0xC9ED], NFKD: [0x110D, 0x1161, 0x11B8] }, +{ source: [0xC9EE], NFC: [0xC9EE], NFD: [0x110D, 0x1161, 0x11B9], NFKC: [0xC9EE], NFKD: [0x110D, 0x1161, 0x11B9] }, +{ source: [0xC9EF], NFC: [0xC9EF], NFD: [0x110D, 0x1161, 0x11BA], NFKC: [0xC9EF], NFKD: [0x110D, 0x1161, 0x11BA] }, +{ source: [0xC9F0], NFC: [0xC9F0], NFD: [0x110D, 0x1161, 0x11BB], NFKC: [0xC9F0], NFKD: [0x110D, 0x1161, 0x11BB] }, +{ source: [0xC9F1], NFC: [0xC9F1], NFD: [0x110D, 0x1161, 0x11BC], NFKC: [0xC9F1], NFKD: [0x110D, 0x1161, 0x11BC] }, +{ source: [0xC9F2], NFC: [0xC9F2], NFD: [0x110D, 0x1161, 0x11BD], NFKC: [0xC9F2], NFKD: [0x110D, 0x1161, 0x11BD] }, +{ source: [0xC9F3], NFC: [0xC9F3], NFD: [0x110D, 0x1161, 0x11BE], NFKC: [0xC9F3], NFKD: [0x110D, 0x1161, 0x11BE] }, +{ source: [0xC9F4], NFC: [0xC9F4], NFD: [0x110D, 0x1161, 0x11BF], NFKC: [0xC9F4], NFKD: [0x110D, 0x1161, 0x11BF] }, +{ source: [0xC9F5], NFC: [0xC9F5], NFD: [0x110D, 0x1161, 0x11C0], NFKC: [0xC9F5], NFKD: [0x110D, 0x1161, 0x11C0] }, +{ source: [0xC9F6], NFC: [0xC9F6], NFD: [0x110D, 0x1161, 0x11C1], NFKC: [0xC9F6], NFKD: [0x110D, 0x1161, 0x11C1] }, +{ source: [0xC9F7], NFC: [0xC9F7], NFD: [0x110D, 0x1161, 0x11C2], NFKC: [0xC9F7], NFKD: [0x110D, 0x1161, 0x11C2] }, +{ source: [0xC9F8], NFC: [0xC9F8], NFD: [0x110D, 0x1162], NFKC: [0xC9F8], NFKD: [0x110D, 0x1162] }, +{ source: [0xC9F9], NFC: [0xC9F9], NFD: [0x110D, 0x1162, 0x11A8], NFKC: [0xC9F9], NFKD: [0x110D, 0x1162, 0x11A8] }, +{ source: [0xC9FA], NFC: [0xC9FA], NFD: [0x110D, 0x1162, 0x11A9], NFKC: [0xC9FA], NFKD: [0x110D, 0x1162, 0x11A9] }, +{ source: [0xC9FB], NFC: [0xC9FB], NFD: [0x110D, 0x1162, 0x11AA], NFKC: [0xC9FB], NFKD: [0x110D, 0x1162, 0x11AA] }, +{ source: [0xC9FC], NFC: [0xC9FC], NFD: [0x110D, 0x1162, 0x11AB], NFKC: [0xC9FC], NFKD: [0x110D, 0x1162, 0x11AB] }, +{ source: [0xC9FD], NFC: [0xC9FD], NFD: [0x110D, 0x1162, 0x11AC], NFKC: [0xC9FD], NFKD: [0x110D, 0x1162, 0x11AC] }, +{ source: [0xC9FE], NFC: [0xC9FE], NFD: [0x110D, 0x1162, 0x11AD], NFKC: [0xC9FE], NFKD: [0x110D, 0x1162, 0x11AD] }, +{ source: [0xC9FF], NFC: [0xC9FF], NFD: [0x110D, 0x1162, 0x11AE], NFKC: [0xC9FF], NFKD: [0x110D, 0x1162, 0x11AE] }, +{ source: [0xCA00], NFC: [0xCA00], NFD: [0x110D, 0x1162, 0x11AF], NFKC: [0xCA00], NFKD: [0x110D, 0x1162, 0x11AF] }, +{ source: [0xCA01], NFC: [0xCA01], NFD: [0x110D, 0x1162, 0x11B0], NFKC: [0xCA01], NFKD: [0x110D, 0x1162, 0x11B0] }, +{ source: [0xCA02], NFC: [0xCA02], NFD: [0x110D, 0x1162, 0x11B1], NFKC: [0xCA02], NFKD: [0x110D, 0x1162, 0x11B1] }, +{ source: [0xCA03], NFC: [0xCA03], NFD: [0x110D, 0x1162, 0x11B2], NFKC: [0xCA03], NFKD: [0x110D, 0x1162, 0x11B2] }, +{ source: [0xCA04], NFC: [0xCA04], NFD: [0x110D, 0x1162, 0x11B3], NFKC: [0xCA04], NFKD: [0x110D, 0x1162, 0x11B3] }, +{ source: [0xCA05], NFC: [0xCA05], NFD: [0x110D, 0x1162, 0x11B4], NFKC: [0xCA05], NFKD: [0x110D, 0x1162, 0x11B4] }, +{ source: [0xCA06], NFC: [0xCA06], NFD: [0x110D, 0x1162, 0x11B5], NFKC: [0xCA06], NFKD: [0x110D, 0x1162, 0x11B5] }, +{ source: [0xCA07], NFC: [0xCA07], NFD: [0x110D, 0x1162, 0x11B6], NFKC: [0xCA07], NFKD: [0x110D, 0x1162, 0x11B6] }, +{ source: [0xCA08], NFC: [0xCA08], NFD: [0x110D, 0x1162, 0x11B7], NFKC: [0xCA08], NFKD: [0x110D, 0x1162, 0x11B7] }, +{ source: [0xCA09], NFC: [0xCA09], NFD: [0x110D, 0x1162, 0x11B8], NFKC: [0xCA09], NFKD: [0x110D, 0x1162, 0x11B8] }, +{ source: [0xCA0A], NFC: [0xCA0A], NFD: [0x110D, 0x1162, 0x11B9], NFKC: [0xCA0A], NFKD: [0x110D, 0x1162, 0x11B9] }, +{ source: [0xCA0B], NFC: [0xCA0B], NFD: [0x110D, 0x1162, 0x11BA], NFKC: [0xCA0B], NFKD: [0x110D, 0x1162, 0x11BA] }, +{ source: [0xCA0C], NFC: [0xCA0C], NFD: [0x110D, 0x1162, 0x11BB], NFKC: [0xCA0C], NFKD: [0x110D, 0x1162, 0x11BB] }, +{ source: [0xCA0D], NFC: [0xCA0D], NFD: [0x110D, 0x1162, 0x11BC], NFKC: [0xCA0D], NFKD: [0x110D, 0x1162, 0x11BC] }, +{ source: [0xCA0E], NFC: [0xCA0E], NFD: [0x110D, 0x1162, 0x11BD], NFKC: [0xCA0E], NFKD: [0x110D, 0x1162, 0x11BD] }, +{ source: [0xCA0F], NFC: [0xCA0F], NFD: [0x110D, 0x1162, 0x11BE], NFKC: [0xCA0F], NFKD: [0x110D, 0x1162, 0x11BE] }, +{ source: [0xCA10], NFC: [0xCA10], NFD: [0x110D, 0x1162, 0x11BF], NFKC: [0xCA10], NFKD: [0x110D, 0x1162, 0x11BF] }, +{ source: [0xCA11], NFC: [0xCA11], NFD: [0x110D, 0x1162, 0x11C0], NFKC: [0xCA11], NFKD: [0x110D, 0x1162, 0x11C0] }, +{ source: [0xCA12], NFC: [0xCA12], NFD: [0x110D, 0x1162, 0x11C1], NFKC: [0xCA12], NFKD: [0x110D, 0x1162, 0x11C1] }, +{ source: [0xCA13], NFC: [0xCA13], NFD: [0x110D, 0x1162, 0x11C2], NFKC: [0xCA13], NFKD: [0x110D, 0x1162, 0x11C2] }, +{ source: [0xCA14], NFC: [0xCA14], NFD: [0x110D, 0x1163], NFKC: [0xCA14], NFKD: [0x110D, 0x1163] }, +{ source: [0xCA15], NFC: [0xCA15], NFD: [0x110D, 0x1163, 0x11A8], NFKC: [0xCA15], NFKD: [0x110D, 0x1163, 0x11A8] }, +{ source: [0xCA16], NFC: [0xCA16], NFD: [0x110D, 0x1163, 0x11A9], NFKC: [0xCA16], NFKD: [0x110D, 0x1163, 0x11A9] }, +{ source: [0xCA17], NFC: [0xCA17], NFD: [0x110D, 0x1163, 0x11AA], NFKC: [0xCA17], NFKD: [0x110D, 0x1163, 0x11AA] }, +{ source: [0xCA18], NFC: [0xCA18], NFD: [0x110D, 0x1163, 0x11AB], NFKC: [0xCA18], NFKD: [0x110D, 0x1163, 0x11AB] }, +{ source: [0xCA19], NFC: [0xCA19], NFD: [0x110D, 0x1163, 0x11AC], NFKC: [0xCA19], NFKD: [0x110D, 0x1163, 0x11AC] }, +{ source: [0xCA1A], NFC: [0xCA1A], NFD: [0x110D, 0x1163, 0x11AD], NFKC: [0xCA1A], NFKD: [0x110D, 0x1163, 0x11AD] }, +{ source: [0xCA1B], NFC: [0xCA1B], NFD: [0x110D, 0x1163, 0x11AE], NFKC: [0xCA1B], NFKD: [0x110D, 0x1163, 0x11AE] }, +{ source: [0xCA1C], NFC: [0xCA1C], NFD: [0x110D, 0x1163, 0x11AF], NFKC: [0xCA1C], NFKD: [0x110D, 0x1163, 0x11AF] }, +{ source: [0xCA1D], NFC: [0xCA1D], NFD: [0x110D, 0x1163, 0x11B0], NFKC: [0xCA1D], NFKD: [0x110D, 0x1163, 0x11B0] }, +{ source: [0xCA1E], NFC: [0xCA1E], NFD: [0x110D, 0x1163, 0x11B1], NFKC: [0xCA1E], NFKD: [0x110D, 0x1163, 0x11B1] }, +{ source: [0xCA1F], NFC: [0xCA1F], NFD: [0x110D, 0x1163, 0x11B2], NFKC: [0xCA1F], NFKD: [0x110D, 0x1163, 0x11B2] }, +{ source: [0xCA20], NFC: [0xCA20], NFD: [0x110D, 0x1163, 0x11B3], NFKC: [0xCA20], NFKD: [0x110D, 0x1163, 0x11B3] }, +{ source: [0xCA21], NFC: [0xCA21], NFD: [0x110D, 0x1163, 0x11B4], NFKC: [0xCA21], NFKD: [0x110D, 0x1163, 0x11B4] }, +{ source: [0xCA22], NFC: [0xCA22], NFD: [0x110D, 0x1163, 0x11B5], NFKC: [0xCA22], NFKD: [0x110D, 0x1163, 0x11B5] }, +{ source: [0xCA23], NFC: [0xCA23], NFD: [0x110D, 0x1163, 0x11B6], NFKC: [0xCA23], NFKD: [0x110D, 0x1163, 0x11B6] }, +{ source: [0xCA24], NFC: [0xCA24], NFD: [0x110D, 0x1163, 0x11B7], NFKC: [0xCA24], NFKD: [0x110D, 0x1163, 0x11B7] }, +{ source: [0xCA25], NFC: [0xCA25], NFD: [0x110D, 0x1163, 0x11B8], NFKC: [0xCA25], NFKD: [0x110D, 0x1163, 0x11B8] }, +{ source: [0xCA26], NFC: [0xCA26], NFD: [0x110D, 0x1163, 0x11B9], NFKC: [0xCA26], NFKD: [0x110D, 0x1163, 0x11B9] }, +{ source: [0xCA27], NFC: [0xCA27], NFD: [0x110D, 0x1163, 0x11BA], NFKC: [0xCA27], NFKD: [0x110D, 0x1163, 0x11BA] }, +{ source: [0xCA28], NFC: [0xCA28], NFD: [0x110D, 0x1163, 0x11BB], NFKC: [0xCA28], NFKD: [0x110D, 0x1163, 0x11BB] }, +{ source: [0xCA29], NFC: [0xCA29], NFD: [0x110D, 0x1163, 0x11BC], NFKC: [0xCA29], NFKD: [0x110D, 0x1163, 0x11BC] }, +{ source: [0xCA2A], NFC: [0xCA2A], NFD: [0x110D, 0x1163, 0x11BD], NFKC: [0xCA2A], NFKD: [0x110D, 0x1163, 0x11BD] }, +{ source: [0xCA2B], NFC: [0xCA2B], NFD: [0x110D, 0x1163, 0x11BE], NFKC: [0xCA2B], NFKD: [0x110D, 0x1163, 0x11BE] }, +{ source: [0xCA2C], NFC: [0xCA2C], NFD: [0x110D, 0x1163, 0x11BF], NFKC: [0xCA2C], NFKD: [0x110D, 0x1163, 0x11BF] }, +{ source: [0xCA2D], NFC: [0xCA2D], NFD: [0x110D, 0x1163, 0x11C0], NFKC: [0xCA2D], NFKD: [0x110D, 0x1163, 0x11C0] }, +{ source: [0xCA2E], NFC: [0xCA2E], NFD: [0x110D, 0x1163, 0x11C1], NFKC: [0xCA2E], NFKD: [0x110D, 0x1163, 0x11C1] }, +{ source: [0xCA2F], NFC: [0xCA2F], NFD: [0x110D, 0x1163, 0x11C2], NFKC: [0xCA2F], NFKD: [0x110D, 0x1163, 0x11C2] }, +{ source: [0xCA30], NFC: [0xCA30], NFD: [0x110D, 0x1164], NFKC: [0xCA30], NFKD: [0x110D, 0x1164] }, +{ source: [0xCA31], NFC: [0xCA31], NFD: [0x110D, 0x1164, 0x11A8], NFKC: [0xCA31], NFKD: [0x110D, 0x1164, 0x11A8] }, +{ source: [0xCA32], NFC: [0xCA32], NFD: [0x110D, 0x1164, 0x11A9], NFKC: [0xCA32], NFKD: [0x110D, 0x1164, 0x11A9] }, +{ source: [0xCA33], NFC: [0xCA33], NFD: [0x110D, 0x1164, 0x11AA], NFKC: [0xCA33], NFKD: [0x110D, 0x1164, 0x11AA] }, +{ source: [0xCA34], NFC: [0xCA34], NFD: [0x110D, 0x1164, 0x11AB], NFKC: [0xCA34], NFKD: [0x110D, 0x1164, 0x11AB] }, +{ source: [0xCA35], NFC: [0xCA35], NFD: [0x110D, 0x1164, 0x11AC], NFKC: [0xCA35], NFKD: [0x110D, 0x1164, 0x11AC] }, +{ source: [0xCA36], NFC: [0xCA36], NFD: [0x110D, 0x1164, 0x11AD], NFKC: [0xCA36], NFKD: [0x110D, 0x1164, 0x11AD] }, +{ source: [0xCA37], NFC: [0xCA37], NFD: [0x110D, 0x1164, 0x11AE], NFKC: [0xCA37], NFKD: [0x110D, 0x1164, 0x11AE] }, +{ source: [0xCA38], NFC: [0xCA38], NFD: [0x110D, 0x1164, 0x11AF], NFKC: [0xCA38], NFKD: [0x110D, 0x1164, 0x11AF] }, +{ source: [0xCA39], NFC: [0xCA39], NFD: [0x110D, 0x1164, 0x11B0], NFKC: [0xCA39], NFKD: [0x110D, 0x1164, 0x11B0] }, +{ source: [0xCA3A], NFC: [0xCA3A], NFD: [0x110D, 0x1164, 0x11B1], NFKC: [0xCA3A], NFKD: [0x110D, 0x1164, 0x11B1] }, +{ source: [0xCA3B], NFC: [0xCA3B], NFD: [0x110D, 0x1164, 0x11B2], NFKC: [0xCA3B], NFKD: [0x110D, 0x1164, 0x11B2] }, +{ source: [0xCA3C], NFC: [0xCA3C], NFD: [0x110D, 0x1164, 0x11B3], NFKC: [0xCA3C], NFKD: [0x110D, 0x1164, 0x11B3] }, +{ source: [0xCA3D], NFC: [0xCA3D], NFD: [0x110D, 0x1164, 0x11B4], NFKC: [0xCA3D], NFKD: [0x110D, 0x1164, 0x11B4] }, +{ source: [0xCA3E], NFC: [0xCA3E], NFD: [0x110D, 0x1164, 0x11B5], NFKC: [0xCA3E], NFKD: [0x110D, 0x1164, 0x11B5] }, +{ source: [0xCA3F], NFC: [0xCA3F], NFD: [0x110D, 0x1164, 0x11B6], NFKC: [0xCA3F], NFKD: [0x110D, 0x1164, 0x11B6] }, +{ source: [0xCA40], NFC: [0xCA40], NFD: [0x110D, 0x1164, 0x11B7], NFKC: [0xCA40], NFKD: [0x110D, 0x1164, 0x11B7] }, +{ source: [0xCA41], NFC: [0xCA41], NFD: [0x110D, 0x1164, 0x11B8], NFKC: [0xCA41], NFKD: [0x110D, 0x1164, 0x11B8] }, +{ source: [0xCA42], NFC: [0xCA42], NFD: [0x110D, 0x1164, 0x11B9], NFKC: [0xCA42], NFKD: [0x110D, 0x1164, 0x11B9] }, +{ source: [0xCA43], NFC: [0xCA43], NFD: [0x110D, 0x1164, 0x11BA], NFKC: [0xCA43], NFKD: [0x110D, 0x1164, 0x11BA] }, +{ source: [0xCA44], NFC: [0xCA44], NFD: [0x110D, 0x1164, 0x11BB], NFKC: [0xCA44], NFKD: [0x110D, 0x1164, 0x11BB] }, +{ source: [0xCA45], NFC: [0xCA45], NFD: [0x110D, 0x1164, 0x11BC], NFKC: [0xCA45], NFKD: [0x110D, 0x1164, 0x11BC] }, +{ source: [0xCA46], NFC: [0xCA46], NFD: [0x110D, 0x1164, 0x11BD], NFKC: [0xCA46], NFKD: [0x110D, 0x1164, 0x11BD] }, +{ source: [0xCA47], NFC: [0xCA47], NFD: [0x110D, 0x1164, 0x11BE], NFKC: [0xCA47], NFKD: [0x110D, 0x1164, 0x11BE] }, +{ source: [0xCA48], NFC: [0xCA48], NFD: [0x110D, 0x1164, 0x11BF], NFKC: [0xCA48], NFKD: [0x110D, 0x1164, 0x11BF] }, +{ source: [0xCA49], NFC: [0xCA49], NFD: [0x110D, 0x1164, 0x11C0], NFKC: [0xCA49], NFKD: [0x110D, 0x1164, 0x11C0] }, +{ source: [0xCA4A], NFC: [0xCA4A], NFD: [0x110D, 0x1164, 0x11C1], NFKC: [0xCA4A], NFKD: [0x110D, 0x1164, 0x11C1] }, +{ source: [0xCA4B], NFC: [0xCA4B], NFD: [0x110D, 0x1164, 0x11C2], NFKC: [0xCA4B], NFKD: [0x110D, 0x1164, 0x11C2] }, +{ source: [0xCA4C], NFC: [0xCA4C], NFD: [0x110D, 0x1165], NFKC: [0xCA4C], NFKD: [0x110D, 0x1165] }, +{ source: [0xCA4D], NFC: [0xCA4D], NFD: [0x110D, 0x1165, 0x11A8], NFKC: [0xCA4D], NFKD: [0x110D, 0x1165, 0x11A8] }, +{ source: [0xCA4E], NFC: [0xCA4E], NFD: [0x110D, 0x1165, 0x11A9], NFKC: [0xCA4E], NFKD: [0x110D, 0x1165, 0x11A9] }, +{ source: [0xCA4F], NFC: [0xCA4F], NFD: [0x110D, 0x1165, 0x11AA], NFKC: [0xCA4F], NFKD: [0x110D, 0x1165, 0x11AA] }, +{ source: [0xCA50], NFC: [0xCA50], NFD: [0x110D, 0x1165, 0x11AB], NFKC: [0xCA50], NFKD: [0x110D, 0x1165, 0x11AB] }, +{ source: [0xCA51], NFC: [0xCA51], NFD: [0x110D, 0x1165, 0x11AC], NFKC: [0xCA51], NFKD: [0x110D, 0x1165, 0x11AC] }, +{ source: [0xCA52], NFC: [0xCA52], NFD: [0x110D, 0x1165, 0x11AD], NFKC: [0xCA52], NFKD: [0x110D, 0x1165, 0x11AD] }, +{ source: [0xCA53], NFC: [0xCA53], NFD: [0x110D, 0x1165, 0x11AE], NFKC: [0xCA53], NFKD: [0x110D, 0x1165, 0x11AE] }, +{ source: [0xCA54], NFC: [0xCA54], NFD: [0x110D, 0x1165, 0x11AF], NFKC: [0xCA54], NFKD: [0x110D, 0x1165, 0x11AF] }, +{ source: [0xCA55], NFC: [0xCA55], NFD: [0x110D, 0x1165, 0x11B0], NFKC: [0xCA55], NFKD: [0x110D, 0x1165, 0x11B0] }, +{ source: [0xCA56], NFC: [0xCA56], NFD: [0x110D, 0x1165, 0x11B1], NFKC: [0xCA56], NFKD: [0x110D, 0x1165, 0x11B1] }, +{ source: [0xCA57], NFC: [0xCA57], NFD: [0x110D, 0x1165, 0x11B2], NFKC: [0xCA57], NFKD: [0x110D, 0x1165, 0x11B2] }, +{ source: [0xCA58], NFC: [0xCA58], NFD: [0x110D, 0x1165, 0x11B3], NFKC: [0xCA58], NFKD: [0x110D, 0x1165, 0x11B3] }, +{ source: [0xCA59], NFC: [0xCA59], NFD: [0x110D, 0x1165, 0x11B4], NFKC: [0xCA59], NFKD: [0x110D, 0x1165, 0x11B4] }, +{ source: [0xCA5A], NFC: [0xCA5A], NFD: [0x110D, 0x1165, 0x11B5], NFKC: [0xCA5A], NFKD: [0x110D, 0x1165, 0x11B5] }, +{ source: [0xCA5B], NFC: [0xCA5B], NFD: [0x110D, 0x1165, 0x11B6], NFKC: [0xCA5B], NFKD: [0x110D, 0x1165, 0x11B6] }, +{ source: [0xCA5C], NFC: [0xCA5C], NFD: [0x110D, 0x1165, 0x11B7], NFKC: [0xCA5C], NFKD: [0x110D, 0x1165, 0x11B7] }, +{ source: [0xCA5D], NFC: [0xCA5D], NFD: [0x110D, 0x1165, 0x11B8], NFKC: [0xCA5D], NFKD: [0x110D, 0x1165, 0x11B8] }, +{ source: [0xCA5E], NFC: [0xCA5E], NFD: [0x110D, 0x1165, 0x11B9], NFKC: [0xCA5E], NFKD: [0x110D, 0x1165, 0x11B9] }, +{ source: [0xCA5F], NFC: [0xCA5F], NFD: [0x110D, 0x1165, 0x11BA], NFKC: [0xCA5F], NFKD: [0x110D, 0x1165, 0x11BA] }, +{ source: [0xCA60], NFC: [0xCA60], NFD: [0x110D, 0x1165, 0x11BB], NFKC: [0xCA60], NFKD: [0x110D, 0x1165, 0x11BB] }, +{ source: [0xCA61], NFC: [0xCA61], NFD: [0x110D, 0x1165, 0x11BC], NFKC: [0xCA61], NFKD: [0x110D, 0x1165, 0x11BC] }, +{ source: [0xCA62], NFC: [0xCA62], NFD: [0x110D, 0x1165, 0x11BD], NFKC: [0xCA62], NFKD: [0x110D, 0x1165, 0x11BD] }, +{ source: [0xCA63], NFC: [0xCA63], NFD: [0x110D, 0x1165, 0x11BE], NFKC: [0xCA63], NFKD: [0x110D, 0x1165, 0x11BE] }, +{ source: [0xCA64], NFC: [0xCA64], NFD: [0x110D, 0x1165, 0x11BF], NFKC: [0xCA64], NFKD: [0x110D, 0x1165, 0x11BF] }, +{ source: [0xCA65], NFC: [0xCA65], NFD: [0x110D, 0x1165, 0x11C0], NFKC: [0xCA65], NFKD: [0x110D, 0x1165, 0x11C0] }, +{ source: [0xCA66], NFC: [0xCA66], NFD: [0x110D, 0x1165, 0x11C1], NFKC: [0xCA66], NFKD: [0x110D, 0x1165, 0x11C1] }, +{ source: [0xCA67], NFC: [0xCA67], NFD: [0x110D, 0x1165, 0x11C2], NFKC: [0xCA67], NFKD: [0x110D, 0x1165, 0x11C2] }, +{ source: [0xCA68], NFC: [0xCA68], NFD: [0x110D, 0x1166], NFKC: [0xCA68], NFKD: [0x110D, 0x1166] }, +{ source: [0xCA69], NFC: [0xCA69], NFD: [0x110D, 0x1166, 0x11A8], NFKC: [0xCA69], NFKD: [0x110D, 0x1166, 0x11A8] }, +{ source: [0xCA6A], NFC: [0xCA6A], NFD: [0x110D, 0x1166, 0x11A9], NFKC: [0xCA6A], NFKD: [0x110D, 0x1166, 0x11A9] }, +{ source: [0xCA6B], NFC: [0xCA6B], NFD: [0x110D, 0x1166, 0x11AA], NFKC: [0xCA6B], NFKD: [0x110D, 0x1166, 0x11AA] }, +{ source: [0xCA6C], NFC: [0xCA6C], NFD: [0x110D, 0x1166, 0x11AB], NFKC: [0xCA6C], NFKD: [0x110D, 0x1166, 0x11AB] }, +{ source: [0xCA6D], NFC: [0xCA6D], NFD: [0x110D, 0x1166, 0x11AC], NFKC: [0xCA6D], NFKD: [0x110D, 0x1166, 0x11AC] }, +{ source: [0xCA6E], NFC: [0xCA6E], NFD: [0x110D, 0x1166, 0x11AD], NFKC: [0xCA6E], NFKD: [0x110D, 0x1166, 0x11AD] }, +{ source: [0xCA6F], NFC: [0xCA6F], NFD: [0x110D, 0x1166, 0x11AE], NFKC: [0xCA6F], NFKD: [0x110D, 0x1166, 0x11AE] }, +{ source: [0xCA70], NFC: [0xCA70], NFD: [0x110D, 0x1166, 0x11AF], NFKC: [0xCA70], NFKD: [0x110D, 0x1166, 0x11AF] }, +{ source: [0xCA71], NFC: [0xCA71], NFD: [0x110D, 0x1166, 0x11B0], NFKC: [0xCA71], NFKD: [0x110D, 0x1166, 0x11B0] }, +{ source: [0xCA72], NFC: [0xCA72], NFD: [0x110D, 0x1166, 0x11B1], NFKC: [0xCA72], NFKD: [0x110D, 0x1166, 0x11B1] }, +{ source: [0xCA73], NFC: [0xCA73], NFD: [0x110D, 0x1166, 0x11B2], NFKC: [0xCA73], NFKD: [0x110D, 0x1166, 0x11B2] }, +{ source: [0xCA74], NFC: [0xCA74], NFD: [0x110D, 0x1166, 0x11B3], NFKC: [0xCA74], NFKD: [0x110D, 0x1166, 0x11B3] }, +{ source: [0xCA75], NFC: [0xCA75], NFD: [0x110D, 0x1166, 0x11B4], NFKC: [0xCA75], NFKD: [0x110D, 0x1166, 0x11B4] }, +{ source: [0xCA76], NFC: [0xCA76], NFD: [0x110D, 0x1166, 0x11B5], NFKC: [0xCA76], NFKD: [0x110D, 0x1166, 0x11B5] }, +{ source: [0xCA77], NFC: [0xCA77], NFD: [0x110D, 0x1166, 0x11B6], NFKC: [0xCA77], NFKD: [0x110D, 0x1166, 0x11B6] }, +{ source: [0xCA78], NFC: [0xCA78], NFD: [0x110D, 0x1166, 0x11B7], NFKC: [0xCA78], NFKD: [0x110D, 0x1166, 0x11B7] }, +{ source: [0xCA79], NFC: [0xCA79], NFD: [0x110D, 0x1166, 0x11B8], NFKC: [0xCA79], NFKD: [0x110D, 0x1166, 0x11B8] }, +{ source: [0xCA7A], NFC: [0xCA7A], NFD: [0x110D, 0x1166, 0x11B9], NFKC: [0xCA7A], NFKD: [0x110D, 0x1166, 0x11B9] }, +{ source: [0xCA7B], NFC: [0xCA7B], NFD: [0x110D, 0x1166, 0x11BA], NFKC: [0xCA7B], NFKD: [0x110D, 0x1166, 0x11BA] }, +{ source: [0xCA7C], NFC: [0xCA7C], NFD: [0x110D, 0x1166, 0x11BB], NFKC: [0xCA7C], NFKD: [0x110D, 0x1166, 0x11BB] }, +{ source: [0xCA7D], NFC: [0xCA7D], NFD: [0x110D, 0x1166, 0x11BC], NFKC: [0xCA7D], NFKD: [0x110D, 0x1166, 0x11BC] }, +{ source: [0xCA7E], NFC: [0xCA7E], NFD: [0x110D, 0x1166, 0x11BD], NFKC: [0xCA7E], NFKD: [0x110D, 0x1166, 0x11BD] }, +{ source: [0xCA7F], NFC: [0xCA7F], NFD: [0x110D, 0x1166, 0x11BE], NFKC: [0xCA7F], NFKD: [0x110D, 0x1166, 0x11BE] }, +{ source: [0xCA80], NFC: [0xCA80], NFD: [0x110D, 0x1166, 0x11BF], NFKC: [0xCA80], NFKD: [0x110D, 0x1166, 0x11BF] }, +{ source: [0xCA81], NFC: [0xCA81], NFD: [0x110D, 0x1166, 0x11C0], NFKC: [0xCA81], NFKD: [0x110D, 0x1166, 0x11C0] }, +{ source: [0xCA82], NFC: [0xCA82], NFD: [0x110D, 0x1166, 0x11C1], NFKC: [0xCA82], NFKD: [0x110D, 0x1166, 0x11C1] }, +{ source: [0xCA83], NFC: [0xCA83], NFD: [0x110D, 0x1166, 0x11C2], NFKC: [0xCA83], NFKD: [0x110D, 0x1166, 0x11C2] }, +{ source: [0xCA84], NFC: [0xCA84], NFD: [0x110D, 0x1167], NFKC: [0xCA84], NFKD: [0x110D, 0x1167] }, +{ source: [0xCA85], NFC: [0xCA85], NFD: [0x110D, 0x1167, 0x11A8], NFKC: [0xCA85], NFKD: [0x110D, 0x1167, 0x11A8] }, +{ source: [0xCA86], NFC: [0xCA86], NFD: [0x110D, 0x1167, 0x11A9], NFKC: [0xCA86], NFKD: [0x110D, 0x1167, 0x11A9] }, +{ source: [0xCA87], NFC: [0xCA87], NFD: [0x110D, 0x1167, 0x11AA], NFKC: [0xCA87], NFKD: [0x110D, 0x1167, 0x11AA] }, +{ source: [0xCA88], NFC: [0xCA88], NFD: [0x110D, 0x1167, 0x11AB], NFKC: [0xCA88], NFKD: [0x110D, 0x1167, 0x11AB] }, +{ source: [0xCA89], NFC: [0xCA89], NFD: [0x110D, 0x1167, 0x11AC], NFKC: [0xCA89], NFKD: [0x110D, 0x1167, 0x11AC] }, +{ source: [0xCA8A], NFC: [0xCA8A], NFD: [0x110D, 0x1167, 0x11AD], NFKC: [0xCA8A], NFKD: [0x110D, 0x1167, 0x11AD] }, +{ source: [0xCA8B], NFC: [0xCA8B], NFD: [0x110D, 0x1167, 0x11AE], NFKC: [0xCA8B], NFKD: [0x110D, 0x1167, 0x11AE] }, +{ source: [0xCA8C], NFC: [0xCA8C], NFD: [0x110D, 0x1167, 0x11AF], NFKC: [0xCA8C], NFKD: [0x110D, 0x1167, 0x11AF] }, +{ source: [0xCA8D], NFC: [0xCA8D], NFD: [0x110D, 0x1167, 0x11B0], NFKC: [0xCA8D], NFKD: [0x110D, 0x1167, 0x11B0] }, +{ source: [0xCA8E], NFC: [0xCA8E], NFD: [0x110D, 0x1167, 0x11B1], NFKC: [0xCA8E], NFKD: [0x110D, 0x1167, 0x11B1] }, +{ source: [0xCA8F], NFC: [0xCA8F], NFD: [0x110D, 0x1167, 0x11B2], NFKC: [0xCA8F], NFKD: [0x110D, 0x1167, 0x11B2] }, +{ source: [0xCA90], NFC: [0xCA90], NFD: [0x110D, 0x1167, 0x11B3], NFKC: [0xCA90], NFKD: [0x110D, 0x1167, 0x11B3] }, +{ source: [0xCA91], NFC: [0xCA91], NFD: [0x110D, 0x1167, 0x11B4], NFKC: [0xCA91], NFKD: [0x110D, 0x1167, 0x11B4] }, +{ source: [0xCA92], NFC: [0xCA92], NFD: [0x110D, 0x1167, 0x11B5], NFKC: [0xCA92], NFKD: [0x110D, 0x1167, 0x11B5] }, +{ source: [0xCA93], NFC: [0xCA93], NFD: [0x110D, 0x1167, 0x11B6], NFKC: [0xCA93], NFKD: [0x110D, 0x1167, 0x11B6] }, +{ source: [0xCA94], NFC: [0xCA94], NFD: [0x110D, 0x1167, 0x11B7], NFKC: [0xCA94], NFKD: [0x110D, 0x1167, 0x11B7] }, +{ source: [0xCA95], NFC: [0xCA95], NFD: [0x110D, 0x1167, 0x11B8], NFKC: [0xCA95], NFKD: [0x110D, 0x1167, 0x11B8] }, +{ source: [0xCA96], NFC: [0xCA96], NFD: [0x110D, 0x1167, 0x11B9], NFKC: [0xCA96], NFKD: [0x110D, 0x1167, 0x11B9] }, +{ source: [0xCA97], NFC: [0xCA97], NFD: [0x110D, 0x1167, 0x11BA], NFKC: [0xCA97], NFKD: [0x110D, 0x1167, 0x11BA] }, +{ source: [0xCA98], NFC: [0xCA98], NFD: [0x110D, 0x1167, 0x11BB], NFKC: [0xCA98], NFKD: [0x110D, 0x1167, 0x11BB] }, +{ source: [0xCA99], NFC: [0xCA99], NFD: [0x110D, 0x1167, 0x11BC], NFKC: [0xCA99], NFKD: [0x110D, 0x1167, 0x11BC] }, +{ source: [0xCA9A], NFC: [0xCA9A], NFD: [0x110D, 0x1167, 0x11BD], NFKC: [0xCA9A], NFKD: [0x110D, 0x1167, 0x11BD] }, +{ source: [0xCA9B], NFC: [0xCA9B], NFD: [0x110D, 0x1167, 0x11BE], NFKC: [0xCA9B], NFKD: [0x110D, 0x1167, 0x11BE] }, +{ source: [0xCA9C], NFC: [0xCA9C], NFD: [0x110D, 0x1167, 0x11BF], NFKC: [0xCA9C], NFKD: [0x110D, 0x1167, 0x11BF] }, +{ source: [0xCA9D], NFC: [0xCA9D], NFD: [0x110D, 0x1167, 0x11C0], NFKC: [0xCA9D], NFKD: [0x110D, 0x1167, 0x11C0] }, +{ source: [0xCA9E], NFC: [0xCA9E], NFD: [0x110D, 0x1167, 0x11C1], NFKC: [0xCA9E], NFKD: [0x110D, 0x1167, 0x11C1] }, +{ source: [0xCA9F], NFC: [0xCA9F], NFD: [0x110D, 0x1167, 0x11C2], NFKC: [0xCA9F], NFKD: [0x110D, 0x1167, 0x11C2] }, +{ source: [0xCAA0], NFC: [0xCAA0], NFD: [0x110D, 0x1168], NFKC: [0xCAA0], NFKD: [0x110D, 0x1168] }, +{ source: [0xCAA1], NFC: [0xCAA1], NFD: [0x110D, 0x1168, 0x11A8], NFKC: [0xCAA1], NFKD: [0x110D, 0x1168, 0x11A8] }, +{ source: [0xCAA2], NFC: [0xCAA2], NFD: [0x110D, 0x1168, 0x11A9], NFKC: [0xCAA2], NFKD: [0x110D, 0x1168, 0x11A9] }, +{ source: [0xCAA3], NFC: [0xCAA3], NFD: [0x110D, 0x1168, 0x11AA], NFKC: [0xCAA3], NFKD: [0x110D, 0x1168, 0x11AA] }, +{ source: [0xCAA4], NFC: [0xCAA4], NFD: [0x110D, 0x1168, 0x11AB], NFKC: [0xCAA4], NFKD: [0x110D, 0x1168, 0x11AB] }, +{ source: [0xCAA5], NFC: [0xCAA5], NFD: [0x110D, 0x1168, 0x11AC], NFKC: [0xCAA5], NFKD: [0x110D, 0x1168, 0x11AC] }, +{ source: [0xCAA6], NFC: [0xCAA6], NFD: [0x110D, 0x1168, 0x11AD], NFKC: [0xCAA6], NFKD: [0x110D, 0x1168, 0x11AD] }, +{ source: [0xCAA7], NFC: [0xCAA7], NFD: [0x110D, 0x1168, 0x11AE], NFKC: [0xCAA7], NFKD: [0x110D, 0x1168, 0x11AE] }, +{ source: [0xCAA8], NFC: [0xCAA8], NFD: [0x110D, 0x1168, 0x11AF], NFKC: [0xCAA8], NFKD: [0x110D, 0x1168, 0x11AF] }, +{ source: [0xCAA9], NFC: [0xCAA9], NFD: [0x110D, 0x1168, 0x11B0], NFKC: [0xCAA9], NFKD: [0x110D, 0x1168, 0x11B0] }, +{ source: [0xCAAA], NFC: [0xCAAA], NFD: [0x110D, 0x1168, 0x11B1], NFKC: [0xCAAA], NFKD: [0x110D, 0x1168, 0x11B1] }, +{ source: [0xCAAB], NFC: [0xCAAB], NFD: [0x110D, 0x1168, 0x11B2], NFKC: [0xCAAB], NFKD: [0x110D, 0x1168, 0x11B2] }, +{ source: [0xCAAC], NFC: [0xCAAC], NFD: [0x110D, 0x1168, 0x11B3], NFKC: [0xCAAC], NFKD: [0x110D, 0x1168, 0x11B3] }, +{ source: [0xCAAD], NFC: [0xCAAD], NFD: [0x110D, 0x1168, 0x11B4], NFKC: [0xCAAD], NFKD: [0x110D, 0x1168, 0x11B4] }, +{ source: [0xCAAE], NFC: [0xCAAE], NFD: [0x110D, 0x1168, 0x11B5], NFKC: [0xCAAE], NFKD: [0x110D, 0x1168, 0x11B5] }, +{ source: [0xCAAF], NFC: [0xCAAF], NFD: [0x110D, 0x1168, 0x11B6], NFKC: [0xCAAF], NFKD: [0x110D, 0x1168, 0x11B6] }, +{ source: [0xCAB0], NFC: [0xCAB0], NFD: [0x110D, 0x1168, 0x11B7], NFKC: [0xCAB0], NFKD: [0x110D, 0x1168, 0x11B7] }, +{ source: [0xCAB1], NFC: [0xCAB1], NFD: [0x110D, 0x1168, 0x11B8], NFKC: [0xCAB1], NFKD: [0x110D, 0x1168, 0x11B8] }, +{ source: [0xCAB2], NFC: [0xCAB2], NFD: [0x110D, 0x1168, 0x11B9], NFKC: [0xCAB2], NFKD: [0x110D, 0x1168, 0x11B9] }, +{ source: [0xCAB3], NFC: [0xCAB3], NFD: [0x110D, 0x1168, 0x11BA], NFKC: [0xCAB3], NFKD: [0x110D, 0x1168, 0x11BA] }, +{ source: [0xCAB4], NFC: [0xCAB4], NFD: [0x110D, 0x1168, 0x11BB], NFKC: [0xCAB4], NFKD: [0x110D, 0x1168, 0x11BB] }, +{ source: [0xCAB5], NFC: [0xCAB5], NFD: [0x110D, 0x1168, 0x11BC], NFKC: [0xCAB5], NFKD: [0x110D, 0x1168, 0x11BC] }, +{ source: [0xCAB6], NFC: [0xCAB6], NFD: [0x110D, 0x1168, 0x11BD], NFKC: [0xCAB6], NFKD: [0x110D, 0x1168, 0x11BD] }, +{ source: [0xCAB7], NFC: [0xCAB7], NFD: [0x110D, 0x1168, 0x11BE], NFKC: [0xCAB7], NFKD: [0x110D, 0x1168, 0x11BE] }, +{ source: [0xCAB8], NFC: [0xCAB8], NFD: [0x110D, 0x1168, 0x11BF], NFKC: [0xCAB8], NFKD: [0x110D, 0x1168, 0x11BF] }, +{ source: [0xCAB9], NFC: [0xCAB9], NFD: [0x110D, 0x1168, 0x11C0], NFKC: [0xCAB9], NFKD: [0x110D, 0x1168, 0x11C0] }, +{ source: [0xCABA], NFC: [0xCABA], NFD: [0x110D, 0x1168, 0x11C1], NFKC: [0xCABA], NFKD: [0x110D, 0x1168, 0x11C1] }, +{ source: [0xCABB], NFC: [0xCABB], NFD: [0x110D, 0x1168, 0x11C2], NFKC: [0xCABB], NFKD: [0x110D, 0x1168, 0x11C2] }, +{ source: [0xCABC], NFC: [0xCABC], NFD: [0x110D, 0x1169], NFKC: [0xCABC], NFKD: [0x110D, 0x1169] }, +{ source: [0xCABD], NFC: [0xCABD], NFD: [0x110D, 0x1169, 0x11A8], NFKC: [0xCABD], NFKD: [0x110D, 0x1169, 0x11A8] }, +{ source: [0xCABE], NFC: [0xCABE], NFD: [0x110D, 0x1169, 0x11A9], NFKC: [0xCABE], NFKD: [0x110D, 0x1169, 0x11A9] }, +{ source: [0xCABF], NFC: [0xCABF], NFD: [0x110D, 0x1169, 0x11AA], NFKC: [0xCABF], NFKD: [0x110D, 0x1169, 0x11AA] }, +{ source: [0xCAC0], NFC: [0xCAC0], NFD: [0x110D, 0x1169, 0x11AB], NFKC: [0xCAC0], NFKD: [0x110D, 0x1169, 0x11AB] }, +{ source: [0xCAC1], NFC: [0xCAC1], NFD: [0x110D, 0x1169, 0x11AC], NFKC: [0xCAC1], NFKD: [0x110D, 0x1169, 0x11AC] }, +{ source: [0xCAC2], NFC: [0xCAC2], NFD: [0x110D, 0x1169, 0x11AD], NFKC: [0xCAC2], NFKD: [0x110D, 0x1169, 0x11AD] }, +{ source: [0xCAC3], NFC: [0xCAC3], NFD: [0x110D, 0x1169, 0x11AE], NFKC: [0xCAC3], NFKD: [0x110D, 0x1169, 0x11AE] }, +{ source: [0xCAC4], NFC: [0xCAC4], NFD: [0x110D, 0x1169, 0x11AF], NFKC: [0xCAC4], NFKD: [0x110D, 0x1169, 0x11AF] }, +{ source: [0xCAC5], NFC: [0xCAC5], NFD: [0x110D, 0x1169, 0x11B0], NFKC: [0xCAC5], NFKD: [0x110D, 0x1169, 0x11B0] }, +{ source: [0xCAC6], NFC: [0xCAC6], NFD: [0x110D, 0x1169, 0x11B1], NFKC: [0xCAC6], NFKD: [0x110D, 0x1169, 0x11B1] }, +{ source: [0xCAC7], NFC: [0xCAC7], NFD: [0x110D, 0x1169, 0x11B2], NFKC: [0xCAC7], NFKD: [0x110D, 0x1169, 0x11B2] }, +{ source: [0xCAC8], NFC: [0xCAC8], NFD: [0x110D, 0x1169, 0x11B3], NFKC: [0xCAC8], NFKD: [0x110D, 0x1169, 0x11B3] }, +{ source: [0xCAC9], NFC: [0xCAC9], NFD: [0x110D, 0x1169, 0x11B4], NFKC: [0xCAC9], NFKD: [0x110D, 0x1169, 0x11B4] }, +{ source: [0xCACA], NFC: [0xCACA], NFD: [0x110D, 0x1169, 0x11B5], NFKC: [0xCACA], NFKD: [0x110D, 0x1169, 0x11B5] }, +{ source: [0xCACB], NFC: [0xCACB], NFD: [0x110D, 0x1169, 0x11B6], NFKC: [0xCACB], NFKD: [0x110D, 0x1169, 0x11B6] }, +{ source: [0xCACC], NFC: [0xCACC], NFD: [0x110D, 0x1169, 0x11B7], NFKC: [0xCACC], NFKD: [0x110D, 0x1169, 0x11B7] }, +{ source: [0xCACD], NFC: [0xCACD], NFD: [0x110D, 0x1169, 0x11B8], NFKC: [0xCACD], NFKD: [0x110D, 0x1169, 0x11B8] }, +{ source: [0xCACE], NFC: [0xCACE], NFD: [0x110D, 0x1169, 0x11B9], NFKC: [0xCACE], NFKD: [0x110D, 0x1169, 0x11B9] }, +{ source: [0xCACF], NFC: [0xCACF], NFD: [0x110D, 0x1169, 0x11BA], NFKC: [0xCACF], NFKD: [0x110D, 0x1169, 0x11BA] }, +{ source: [0xCAD0], NFC: [0xCAD0], NFD: [0x110D, 0x1169, 0x11BB], NFKC: [0xCAD0], NFKD: [0x110D, 0x1169, 0x11BB] }, +{ source: [0xCAD1], NFC: [0xCAD1], NFD: [0x110D, 0x1169, 0x11BC], NFKC: [0xCAD1], NFKD: [0x110D, 0x1169, 0x11BC] }, +{ source: [0xCAD2], NFC: [0xCAD2], NFD: [0x110D, 0x1169, 0x11BD], NFKC: [0xCAD2], NFKD: [0x110D, 0x1169, 0x11BD] }, +{ source: [0xCAD3], NFC: [0xCAD3], NFD: [0x110D, 0x1169, 0x11BE], NFKC: [0xCAD3], NFKD: [0x110D, 0x1169, 0x11BE] }, +{ source: [0xCAD4], NFC: [0xCAD4], NFD: [0x110D, 0x1169, 0x11BF], NFKC: [0xCAD4], NFKD: [0x110D, 0x1169, 0x11BF] }, +{ source: [0xCAD5], NFC: [0xCAD5], NFD: [0x110D, 0x1169, 0x11C0], NFKC: [0xCAD5], NFKD: [0x110D, 0x1169, 0x11C0] }, +{ source: [0xCAD6], NFC: [0xCAD6], NFD: [0x110D, 0x1169, 0x11C1], NFKC: [0xCAD6], NFKD: [0x110D, 0x1169, 0x11C1] }, +{ source: [0xCAD7], NFC: [0xCAD7], NFD: [0x110D, 0x1169, 0x11C2], NFKC: [0xCAD7], NFKD: [0x110D, 0x1169, 0x11C2] }, +{ source: [0xCAD8], NFC: [0xCAD8], NFD: [0x110D, 0x116A], NFKC: [0xCAD8], NFKD: [0x110D, 0x116A] }, +{ source: [0xCAD9], NFC: [0xCAD9], NFD: [0x110D, 0x116A, 0x11A8], NFKC: [0xCAD9], NFKD: [0x110D, 0x116A, 0x11A8] }, +{ source: [0xCADA], NFC: [0xCADA], NFD: [0x110D, 0x116A, 0x11A9], NFKC: [0xCADA], NFKD: [0x110D, 0x116A, 0x11A9] }, +{ source: [0xCADB], NFC: [0xCADB], NFD: [0x110D, 0x116A, 0x11AA], NFKC: [0xCADB], NFKD: [0x110D, 0x116A, 0x11AA] }, +{ source: [0xCADC], NFC: [0xCADC], NFD: [0x110D, 0x116A, 0x11AB], NFKC: [0xCADC], NFKD: [0x110D, 0x116A, 0x11AB] }, +{ source: [0xCADD], NFC: [0xCADD], NFD: [0x110D, 0x116A, 0x11AC], NFKC: [0xCADD], NFKD: [0x110D, 0x116A, 0x11AC] }, +{ source: [0xCADE], NFC: [0xCADE], NFD: [0x110D, 0x116A, 0x11AD], NFKC: [0xCADE], NFKD: [0x110D, 0x116A, 0x11AD] }, +{ source: [0xCADF], NFC: [0xCADF], NFD: [0x110D, 0x116A, 0x11AE], NFKC: [0xCADF], NFKD: [0x110D, 0x116A, 0x11AE] }, +{ source: [0xCAE0], NFC: [0xCAE0], NFD: [0x110D, 0x116A, 0x11AF], NFKC: [0xCAE0], NFKD: [0x110D, 0x116A, 0x11AF] }, +{ source: [0xCAE1], NFC: [0xCAE1], NFD: [0x110D, 0x116A, 0x11B0], NFKC: [0xCAE1], NFKD: [0x110D, 0x116A, 0x11B0] }, +{ source: [0xCAE2], NFC: [0xCAE2], NFD: [0x110D, 0x116A, 0x11B1], NFKC: [0xCAE2], NFKD: [0x110D, 0x116A, 0x11B1] }, +{ source: [0xCAE3], NFC: [0xCAE3], NFD: [0x110D, 0x116A, 0x11B2], NFKC: [0xCAE3], NFKD: [0x110D, 0x116A, 0x11B2] }, +{ source: [0xCAE4], NFC: [0xCAE4], NFD: [0x110D, 0x116A, 0x11B3], NFKC: [0xCAE4], NFKD: [0x110D, 0x116A, 0x11B3] }, +{ source: [0xCAE5], NFC: [0xCAE5], NFD: [0x110D, 0x116A, 0x11B4], NFKC: [0xCAE5], NFKD: [0x110D, 0x116A, 0x11B4] }, +{ source: [0xCAE6], NFC: [0xCAE6], NFD: [0x110D, 0x116A, 0x11B5], NFKC: [0xCAE6], NFKD: [0x110D, 0x116A, 0x11B5] }, +{ source: [0xCAE7], NFC: [0xCAE7], NFD: [0x110D, 0x116A, 0x11B6], NFKC: [0xCAE7], NFKD: [0x110D, 0x116A, 0x11B6] }, +{ source: [0xCAE8], NFC: [0xCAE8], NFD: [0x110D, 0x116A, 0x11B7], NFKC: [0xCAE8], NFKD: [0x110D, 0x116A, 0x11B7] }, +{ source: [0xCAE9], NFC: [0xCAE9], NFD: [0x110D, 0x116A, 0x11B8], NFKC: [0xCAE9], NFKD: [0x110D, 0x116A, 0x11B8] }, +{ source: [0xCAEA], NFC: [0xCAEA], NFD: [0x110D, 0x116A, 0x11B9], NFKC: [0xCAEA], NFKD: [0x110D, 0x116A, 0x11B9] }, +{ source: [0xCAEB], NFC: [0xCAEB], NFD: [0x110D, 0x116A, 0x11BA], NFKC: [0xCAEB], NFKD: [0x110D, 0x116A, 0x11BA] }, +{ source: [0xCAEC], NFC: [0xCAEC], NFD: [0x110D, 0x116A, 0x11BB], NFKC: [0xCAEC], NFKD: [0x110D, 0x116A, 0x11BB] }, +{ source: [0xCAED], NFC: [0xCAED], NFD: [0x110D, 0x116A, 0x11BC], NFKC: [0xCAED], NFKD: [0x110D, 0x116A, 0x11BC] }, +{ source: [0xCAEE], NFC: [0xCAEE], NFD: [0x110D, 0x116A, 0x11BD], NFKC: [0xCAEE], NFKD: [0x110D, 0x116A, 0x11BD] }, +{ source: [0xCAEF], NFC: [0xCAEF], NFD: [0x110D, 0x116A, 0x11BE], NFKC: [0xCAEF], NFKD: [0x110D, 0x116A, 0x11BE] }, +{ source: [0xCAF0], NFC: [0xCAF0], NFD: [0x110D, 0x116A, 0x11BF], NFKC: [0xCAF0], NFKD: [0x110D, 0x116A, 0x11BF] }, +{ source: [0xCAF1], NFC: [0xCAF1], NFD: [0x110D, 0x116A, 0x11C0], NFKC: [0xCAF1], NFKD: [0x110D, 0x116A, 0x11C0] }, +{ source: [0xCAF2], NFC: [0xCAF2], NFD: [0x110D, 0x116A, 0x11C1], NFKC: [0xCAF2], NFKD: [0x110D, 0x116A, 0x11C1] }, +{ source: [0xCAF3], NFC: [0xCAF3], NFD: [0x110D, 0x116A, 0x11C2], NFKC: [0xCAF3], NFKD: [0x110D, 0x116A, 0x11C2] }, +{ source: [0xCAF4], NFC: [0xCAF4], NFD: [0x110D, 0x116B], NFKC: [0xCAF4], NFKD: [0x110D, 0x116B] }, +{ source: [0xCAF5], NFC: [0xCAF5], NFD: [0x110D, 0x116B, 0x11A8], NFKC: [0xCAF5], NFKD: [0x110D, 0x116B, 0x11A8] }, +{ source: [0xCAF6], NFC: [0xCAF6], NFD: [0x110D, 0x116B, 0x11A9], NFKC: [0xCAF6], NFKD: [0x110D, 0x116B, 0x11A9] }, +{ source: [0xCAF7], NFC: [0xCAF7], NFD: [0x110D, 0x116B, 0x11AA], NFKC: [0xCAF7], NFKD: [0x110D, 0x116B, 0x11AA] }, +{ source: [0xCAF8], NFC: [0xCAF8], NFD: [0x110D, 0x116B, 0x11AB], NFKC: [0xCAF8], NFKD: [0x110D, 0x116B, 0x11AB] }, +{ source: [0xCAF9], NFC: [0xCAF9], NFD: [0x110D, 0x116B, 0x11AC], NFKC: [0xCAF9], NFKD: [0x110D, 0x116B, 0x11AC] }, +{ source: [0xCAFA], NFC: [0xCAFA], NFD: [0x110D, 0x116B, 0x11AD], NFKC: [0xCAFA], NFKD: [0x110D, 0x116B, 0x11AD] }, +{ source: [0xCAFB], NFC: [0xCAFB], NFD: [0x110D, 0x116B, 0x11AE], NFKC: [0xCAFB], NFKD: [0x110D, 0x116B, 0x11AE] }, +{ source: [0xCAFC], NFC: [0xCAFC], NFD: [0x110D, 0x116B, 0x11AF], NFKC: [0xCAFC], NFKD: [0x110D, 0x116B, 0x11AF] }, +{ source: [0xCAFD], NFC: [0xCAFD], NFD: [0x110D, 0x116B, 0x11B0], NFKC: [0xCAFD], NFKD: [0x110D, 0x116B, 0x11B0] }, +{ source: [0xCAFE], NFC: [0xCAFE], NFD: [0x110D, 0x116B, 0x11B1], NFKC: [0xCAFE], NFKD: [0x110D, 0x116B, 0x11B1] }, +{ source: [0xCAFF], NFC: [0xCAFF], NFD: [0x110D, 0x116B, 0x11B2], NFKC: [0xCAFF], NFKD: [0x110D, 0x116B, 0x11B2] }, +{ source: [0xCB00], NFC: [0xCB00], NFD: [0x110D, 0x116B, 0x11B3], NFKC: [0xCB00], NFKD: [0x110D, 0x116B, 0x11B3] }, +{ source: [0xCB01], NFC: [0xCB01], NFD: [0x110D, 0x116B, 0x11B4], NFKC: [0xCB01], NFKD: [0x110D, 0x116B, 0x11B4] }, +{ source: [0xCB02], NFC: [0xCB02], NFD: [0x110D, 0x116B, 0x11B5], NFKC: [0xCB02], NFKD: [0x110D, 0x116B, 0x11B5] }, +{ source: [0xCB03], NFC: [0xCB03], NFD: [0x110D, 0x116B, 0x11B6], NFKC: [0xCB03], NFKD: [0x110D, 0x116B, 0x11B6] }, +{ source: [0xCB04], NFC: [0xCB04], NFD: [0x110D, 0x116B, 0x11B7], NFKC: [0xCB04], NFKD: [0x110D, 0x116B, 0x11B7] }, +{ source: [0xCB05], NFC: [0xCB05], NFD: [0x110D, 0x116B, 0x11B8], NFKC: [0xCB05], NFKD: [0x110D, 0x116B, 0x11B8] }, +{ source: [0xCB06], NFC: [0xCB06], NFD: [0x110D, 0x116B, 0x11B9], NFKC: [0xCB06], NFKD: [0x110D, 0x116B, 0x11B9] }, +{ source: [0xCB07], NFC: [0xCB07], NFD: [0x110D, 0x116B, 0x11BA], NFKC: [0xCB07], NFKD: [0x110D, 0x116B, 0x11BA] }, +{ source: [0xCB08], NFC: [0xCB08], NFD: [0x110D, 0x116B, 0x11BB], NFKC: [0xCB08], NFKD: [0x110D, 0x116B, 0x11BB] }, +{ source: [0xCB09], NFC: [0xCB09], NFD: [0x110D, 0x116B, 0x11BC], NFKC: [0xCB09], NFKD: [0x110D, 0x116B, 0x11BC] }, +{ source: [0xCB0A], NFC: [0xCB0A], NFD: [0x110D, 0x116B, 0x11BD], NFKC: [0xCB0A], NFKD: [0x110D, 0x116B, 0x11BD] }, +{ source: [0xCB0B], NFC: [0xCB0B], NFD: [0x110D, 0x116B, 0x11BE], NFKC: [0xCB0B], NFKD: [0x110D, 0x116B, 0x11BE] }, +{ source: [0xCB0C], NFC: [0xCB0C], NFD: [0x110D, 0x116B, 0x11BF], NFKC: [0xCB0C], NFKD: [0x110D, 0x116B, 0x11BF] }, +{ source: [0xCB0D], NFC: [0xCB0D], NFD: [0x110D, 0x116B, 0x11C0], NFKC: [0xCB0D], NFKD: [0x110D, 0x116B, 0x11C0] }, +{ source: [0xCB0E], NFC: [0xCB0E], NFD: [0x110D, 0x116B, 0x11C1], NFKC: [0xCB0E], NFKD: [0x110D, 0x116B, 0x11C1] }, +{ source: [0xCB0F], NFC: [0xCB0F], NFD: [0x110D, 0x116B, 0x11C2], NFKC: [0xCB0F], NFKD: [0x110D, 0x116B, 0x11C2] }, +{ source: [0xCB10], NFC: [0xCB10], NFD: [0x110D, 0x116C], NFKC: [0xCB10], NFKD: [0x110D, 0x116C] }, +{ source: [0xCB11], NFC: [0xCB11], NFD: [0x110D, 0x116C, 0x11A8], NFKC: [0xCB11], NFKD: [0x110D, 0x116C, 0x11A8] }, +{ source: [0xCB12], NFC: [0xCB12], NFD: [0x110D, 0x116C, 0x11A9], NFKC: [0xCB12], NFKD: [0x110D, 0x116C, 0x11A9] }, +{ source: [0xCB13], NFC: [0xCB13], NFD: [0x110D, 0x116C, 0x11AA], NFKC: [0xCB13], NFKD: [0x110D, 0x116C, 0x11AA] }, +{ source: [0xCB14], NFC: [0xCB14], NFD: [0x110D, 0x116C, 0x11AB], NFKC: [0xCB14], NFKD: [0x110D, 0x116C, 0x11AB] }, +{ source: [0xCB15], NFC: [0xCB15], NFD: [0x110D, 0x116C, 0x11AC], NFKC: [0xCB15], NFKD: [0x110D, 0x116C, 0x11AC] }, +{ source: [0xCB16], NFC: [0xCB16], NFD: [0x110D, 0x116C, 0x11AD], NFKC: [0xCB16], NFKD: [0x110D, 0x116C, 0x11AD] }, +{ source: [0xCB17], NFC: [0xCB17], NFD: [0x110D, 0x116C, 0x11AE], NFKC: [0xCB17], NFKD: [0x110D, 0x116C, 0x11AE] }, +{ source: [0xCB18], NFC: [0xCB18], NFD: [0x110D, 0x116C, 0x11AF], NFKC: [0xCB18], NFKD: [0x110D, 0x116C, 0x11AF] }, +{ source: [0xCB19], NFC: [0xCB19], NFD: [0x110D, 0x116C, 0x11B0], NFKC: [0xCB19], NFKD: [0x110D, 0x116C, 0x11B0] }, +{ source: [0xCB1A], NFC: [0xCB1A], NFD: [0x110D, 0x116C, 0x11B1], NFKC: [0xCB1A], NFKD: [0x110D, 0x116C, 0x11B1] }, +{ source: [0xCB1B], NFC: [0xCB1B], NFD: [0x110D, 0x116C, 0x11B2], NFKC: [0xCB1B], NFKD: [0x110D, 0x116C, 0x11B2] }, +{ source: [0xCB1C], NFC: [0xCB1C], NFD: [0x110D, 0x116C, 0x11B3], NFKC: [0xCB1C], NFKD: [0x110D, 0x116C, 0x11B3] }, +{ source: [0xCB1D], NFC: [0xCB1D], NFD: [0x110D, 0x116C, 0x11B4], NFKC: [0xCB1D], NFKD: [0x110D, 0x116C, 0x11B4] }, +{ source: [0xCB1E], NFC: [0xCB1E], NFD: [0x110D, 0x116C, 0x11B5], NFKC: [0xCB1E], NFKD: [0x110D, 0x116C, 0x11B5] }, +{ source: [0xCB1F], NFC: [0xCB1F], NFD: [0x110D, 0x116C, 0x11B6], NFKC: [0xCB1F], NFKD: [0x110D, 0x116C, 0x11B6] }, +{ source: [0xCB20], NFC: [0xCB20], NFD: [0x110D, 0x116C, 0x11B7], NFKC: [0xCB20], NFKD: [0x110D, 0x116C, 0x11B7] }, +{ source: [0xCB21], NFC: [0xCB21], NFD: [0x110D, 0x116C, 0x11B8], NFKC: [0xCB21], NFKD: [0x110D, 0x116C, 0x11B8] }, +{ source: [0xCB22], NFC: [0xCB22], NFD: [0x110D, 0x116C, 0x11B9], NFKC: [0xCB22], NFKD: [0x110D, 0x116C, 0x11B9] }, +{ source: [0xCB23], NFC: [0xCB23], NFD: [0x110D, 0x116C, 0x11BA], NFKC: [0xCB23], NFKD: [0x110D, 0x116C, 0x11BA] }, +{ source: [0xCB24], NFC: [0xCB24], NFD: [0x110D, 0x116C, 0x11BB], NFKC: [0xCB24], NFKD: [0x110D, 0x116C, 0x11BB] }, +{ source: [0xCB25], NFC: [0xCB25], NFD: [0x110D, 0x116C, 0x11BC], NFKC: [0xCB25], NFKD: [0x110D, 0x116C, 0x11BC] }, +{ source: [0xCB26], NFC: [0xCB26], NFD: [0x110D, 0x116C, 0x11BD], NFKC: [0xCB26], NFKD: [0x110D, 0x116C, 0x11BD] }, +{ source: [0xCB27], NFC: [0xCB27], NFD: [0x110D, 0x116C, 0x11BE], NFKC: [0xCB27], NFKD: [0x110D, 0x116C, 0x11BE] }, +{ source: [0xCB28], NFC: [0xCB28], NFD: [0x110D, 0x116C, 0x11BF], NFKC: [0xCB28], NFKD: [0x110D, 0x116C, 0x11BF] }, +{ source: [0xCB29], NFC: [0xCB29], NFD: [0x110D, 0x116C, 0x11C0], NFKC: [0xCB29], NFKD: [0x110D, 0x116C, 0x11C0] }, +{ source: [0xCB2A], NFC: [0xCB2A], NFD: [0x110D, 0x116C, 0x11C1], NFKC: [0xCB2A], NFKD: [0x110D, 0x116C, 0x11C1] }, +{ source: [0xCB2B], NFC: [0xCB2B], NFD: [0x110D, 0x116C, 0x11C2], NFKC: [0xCB2B], NFKD: [0x110D, 0x116C, 0x11C2] }, +{ source: [0xCB2C], NFC: [0xCB2C], NFD: [0x110D, 0x116D], NFKC: [0xCB2C], NFKD: [0x110D, 0x116D] }, +{ source: [0xCB2D], NFC: [0xCB2D], NFD: [0x110D, 0x116D, 0x11A8], NFKC: [0xCB2D], NFKD: [0x110D, 0x116D, 0x11A8] }, +{ source: [0xCB2E], NFC: [0xCB2E], NFD: [0x110D, 0x116D, 0x11A9], NFKC: [0xCB2E], NFKD: [0x110D, 0x116D, 0x11A9] }, +{ source: [0xCB2F], NFC: [0xCB2F], NFD: [0x110D, 0x116D, 0x11AA], NFKC: [0xCB2F], NFKD: [0x110D, 0x116D, 0x11AA] }, +{ source: [0xCB30], NFC: [0xCB30], NFD: [0x110D, 0x116D, 0x11AB], NFKC: [0xCB30], NFKD: [0x110D, 0x116D, 0x11AB] }, +{ source: [0xCB31], NFC: [0xCB31], NFD: [0x110D, 0x116D, 0x11AC], NFKC: [0xCB31], NFKD: [0x110D, 0x116D, 0x11AC] }, +{ source: [0xCB32], NFC: [0xCB32], NFD: [0x110D, 0x116D, 0x11AD], NFKC: [0xCB32], NFKD: [0x110D, 0x116D, 0x11AD] }, +{ source: [0xCB33], NFC: [0xCB33], NFD: [0x110D, 0x116D, 0x11AE], NFKC: [0xCB33], NFKD: [0x110D, 0x116D, 0x11AE] }, +{ source: [0xCB34], NFC: [0xCB34], NFD: [0x110D, 0x116D, 0x11AF], NFKC: [0xCB34], NFKD: [0x110D, 0x116D, 0x11AF] }, +{ source: [0xCB35], NFC: [0xCB35], NFD: [0x110D, 0x116D, 0x11B0], NFKC: [0xCB35], NFKD: [0x110D, 0x116D, 0x11B0] }, +{ source: [0xCB36], NFC: [0xCB36], NFD: [0x110D, 0x116D, 0x11B1], NFKC: [0xCB36], NFKD: [0x110D, 0x116D, 0x11B1] }, +{ source: [0xCB37], NFC: [0xCB37], NFD: [0x110D, 0x116D, 0x11B2], NFKC: [0xCB37], NFKD: [0x110D, 0x116D, 0x11B2] }, +{ source: [0xCB38], NFC: [0xCB38], NFD: [0x110D, 0x116D, 0x11B3], NFKC: [0xCB38], NFKD: [0x110D, 0x116D, 0x11B3] }, +{ source: [0xCB39], NFC: [0xCB39], NFD: [0x110D, 0x116D, 0x11B4], NFKC: [0xCB39], NFKD: [0x110D, 0x116D, 0x11B4] }, +{ source: [0xCB3A], NFC: [0xCB3A], NFD: [0x110D, 0x116D, 0x11B5], NFKC: [0xCB3A], NFKD: [0x110D, 0x116D, 0x11B5] }, +{ source: [0xCB3B], NFC: [0xCB3B], NFD: [0x110D, 0x116D, 0x11B6], NFKC: [0xCB3B], NFKD: [0x110D, 0x116D, 0x11B6] }, +{ source: [0xCB3C], NFC: [0xCB3C], NFD: [0x110D, 0x116D, 0x11B7], NFKC: [0xCB3C], NFKD: [0x110D, 0x116D, 0x11B7] }, +{ source: [0xCB3D], NFC: [0xCB3D], NFD: [0x110D, 0x116D, 0x11B8], NFKC: [0xCB3D], NFKD: [0x110D, 0x116D, 0x11B8] }, +{ source: [0xCB3E], NFC: [0xCB3E], NFD: [0x110D, 0x116D, 0x11B9], NFKC: [0xCB3E], NFKD: [0x110D, 0x116D, 0x11B9] }, +{ source: [0xCB3F], NFC: [0xCB3F], NFD: [0x110D, 0x116D, 0x11BA], NFKC: [0xCB3F], NFKD: [0x110D, 0x116D, 0x11BA] }, +{ source: [0xCB40], NFC: [0xCB40], NFD: [0x110D, 0x116D, 0x11BB], NFKC: [0xCB40], NFKD: [0x110D, 0x116D, 0x11BB] }, +{ source: [0xCB41], NFC: [0xCB41], NFD: [0x110D, 0x116D, 0x11BC], NFKC: [0xCB41], NFKD: [0x110D, 0x116D, 0x11BC] }, +{ source: [0xCB42], NFC: [0xCB42], NFD: [0x110D, 0x116D, 0x11BD], NFKC: [0xCB42], NFKD: [0x110D, 0x116D, 0x11BD] }, +{ source: [0xCB43], NFC: [0xCB43], NFD: [0x110D, 0x116D, 0x11BE], NFKC: [0xCB43], NFKD: [0x110D, 0x116D, 0x11BE] }, +{ source: [0xCB44], NFC: [0xCB44], NFD: [0x110D, 0x116D, 0x11BF], NFKC: [0xCB44], NFKD: [0x110D, 0x116D, 0x11BF] }, +{ source: [0xCB45], NFC: [0xCB45], NFD: [0x110D, 0x116D, 0x11C0], NFKC: [0xCB45], NFKD: [0x110D, 0x116D, 0x11C0] }, +{ source: [0xCB46], NFC: [0xCB46], NFD: [0x110D, 0x116D, 0x11C1], NFKC: [0xCB46], NFKD: [0x110D, 0x116D, 0x11C1] }, +{ source: [0xCB47], NFC: [0xCB47], NFD: [0x110D, 0x116D, 0x11C2], NFKC: [0xCB47], NFKD: [0x110D, 0x116D, 0x11C2] }, +{ source: [0xCB48], NFC: [0xCB48], NFD: [0x110D, 0x116E], NFKC: [0xCB48], NFKD: [0x110D, 0x116E] }, +{ source: [0xCB49], NFC: [0xCB49], NFD: [0x110D, 0x116E, 0x11A8], NFKC: [0xCB49], NFKD: [0x110D, 0x116E, 0x11A8] }, +{ source: [0xCB4A], NFC: [0xCB4A], NFD: [0x110D, 0x116E, 0x11A9], NFKC: [0xCB4A], NFKD: [0x110D, 0x116E, 0x11A9] }, +{ source: [0xCB4B], NFC: [0xCB4B], NFD: [0x110D, 0x116E, 0x11AA], NFKC: [0xCB4B], NFKD: [0x110D, 0x116E, 0x11AA] }, +{ source: [0xCB4C], NFC: [0xCB4C], NFD: [0x110D, 0x116E, 0x11AB], NFKC: [0xCB4C], NFKD: [0x110D, 0x116E, 0x11AB] }, +{ source: [0xCB4D], NFC: [0xCB4D], NFD: [0x110D, 0x116E, 0x11AC], NFKC: [0xCB4D], NFKD: [0x110D, 0x116E, 0x11AC] }, +{ source: [0xCB4E], NFC: [0xCB4E], NFD: [0x110D, 0x116E, 0x11AD], NFKC: [0xCB4E], NFKD: [0x110D, 0x116E, 0x11AD] }, +{ source: [0xCB4F], NFC: [0xCB4F], NFD: [0x110D, 0x116E, 0x11AE], NFKC: [0xCB4F], NFKD: [0x110D, 0x116E, 0x11AE] }, +{ source: [0xCB50], NFC: [0xCB50], NFD: [0x110D, 0x116E, 0x11AF], NFKC: [0xCB50], NFKD: [0x110D, 0x116E, 0x11AF] }, +{ source: [0xCB51], NFC: [0xCB51], NFD: [0x110D, 0x116E, 0x11B0], NFKC: [0xCB51], NFKD: [0x110D, 0x116E, 0x11B0] }, +{ source: [0xCB52], NFC: [0xCB52], NFD: [0x110D, 0x116E, 0x11B1], NFKC: [0xCB52], NFKD: [0x110D, 0x116E, 0x11B1] }, +{ source: [0xCB53], NFC: [0xCB53], NFD: [0x110D, 0x116E, 0x11B2], NFKC: [0xCB53], NFKD: [0x110D, 0x116E, 0x11B2] }, +{ source: [0xCB54], NFC: [0xCB54], NFD: [0x110D, 0x116E, 0x11B3], NFKC: [0xCB54], NFKD: [0x110D, 0x116E, 0x11B3] }, +{ source: [0xCB55], NFC: [0xCB55], NFD: [0x110D, 0x116E, 0x11B4], NFKC: [0xCB55], NFKD: [0x110D, 0x116E, 0x11B4] }, +{ source: [0xCB56], NFC: [0xCB56], NFD: [0x110D, 0x116E, 0x11B5], NFKC: [0xCB56], NFKD: [0x110D, 0x116E, 0x11B5] }, +{ source: [0xCB57], NFC: [0xCB57], NFD: [0x110D, 0x116E, 0x11B6], NFKC: [0xCB57], NFKD: [0x110D, 0x116E, 0x11B6] }, +{ source: [0xCB58], NFC: [0xCB58], NFD: [0x110D, 0x116E, 0x11B7], NFKC: [0xCB58], NFKD: [0x110D, 0x116E, 0x11B7] }, +{ source: [0xCB59], NFC: [0xCB59], NFD: [0x110D, 0x116E, 0x11B8], NFKC: [0xCB59], NFKD: [0x110D, 0x116E, 0x11B8] }, +{ source: [0xCB5A], NFC: [0xCB5A], NFD: [0x110D, 0x116E, 0x11B9], NFKC: [0xCB5A], NFKD: [0x110D, 0x116E, 0x11B9] }, +{ source: [0xCB5B], NFC: [0xCB5B], NFD: [0x110D, 0x116E, 0x11BA], NFKC: [0xCB5B], NFKD: [0x110D, 0x116E, 0x11BA] }, +{ source: [0xCB5C], NFC: [0xCB5C], NFD: [0x110D, 0x116E, 0x11BB], NFKC: [0xCB5C], NFKD: [0x110D, 0x116E, 0x11BB] }, +{ source: [0xCB5D], NFC: [0xCB5D], NFD: [0x110D, 0x116E, 0x11BC], NFKC: [0xCB5D], NFKD: [0x110D, 0x116E, 0x11BC] }, +{ source: [0xCB5E], NFC: [0xCB5E], NFD: [0x110D, 0x116E, 0x11BD], NFKC: [0xCB5E], NFKD: [0x110D, 0x116E, 0x11BD] }, +{ source: [0xCB5F], NFC: [0xCB5F], NFD: [0x110D, 0x116E, 0x11BE], NFKC: [0xCB5F], NFKD: [0x110D, 0x116E, 0x11BE] }, +{ source: [0xCB60], NFC: [0xCB60], NFD: [0x110D, 0x116E, 0x11BF], NFKC: [0xCB60], NFKD: [0x110D, 0x116E, 0x11BF] }, +{ source: [0xCB61], NFC: [0xCB61], NFD: [0x110D, 0x116E, 0x11C0], NFKC: [0xCB61], NFKD: [0x110D, 0x116E, 0x11C0] }, +{ source: [0xCB62], NFC: [0xCB62], NFD: [0x110D, 0x116E, 0x11C1], NFKC: [0xCB62], NFKD: [0x110D, 0x116E, 0x11C1] }, +{ source: [0xCB63], NFC: [0xCB63], NFD: [0x110D, 0x116E, 0x11C2], NFKC: [0xCB63], NFKD: [0x110D, 0x116E, 0x11C2] }, +{ source: [0xCB64], NFC: [0xCB64], NFD: [0x110D, 0x116F], NFKC: [0xCB64], NFKD: [0x110D, 0x116F] }, +{ source: [0xCB65], NFC: [0xCB65], NFD: [0x110D, 0x116F, 0x11A8], NFKC: [0xCB65], NFKD: [0x110D, 0x116F, 0x11A8] }, +{ source: [0xCB66], NFC: [0xCB66], NFD: [0x110D, 0x116F, 0x11A9], NFKC: [0xCB66], NFKD: [0x110D, 0x116F, 0x11A9] }, +{ source: [0xCB67], NFC: [0xCB67], NFD: [0x110D, 0x116F, 0x11AA], NFKC: [0xCB67], NFKD: [0x110D, 0x116F, 0x11AA] }, +{ source: [0xCB68], NFC: [0xCB68], NFD: [0x110D, 0x116F, 0x11AB], NFKC: [0xCB68], NFKD: [0x110D, 0x116F, 0x11AB] }, +{ source: [0xCB69], NFC: [0xCB69], NFD: [0x110D, 0x116F, 0x11AC], NFKC: [0xCB69], NFKD: [0x110D, 0x116F, 0x11AC] }, +{ source: [0xCB6A], NFC: [0xCB6A], NFD: [0x110D, 0x116F, 0x11AD], NFKC: [0xCB6A], NFKD: [0x110D, 0x116F, 0x11AD] }, +{ source: [0xCB6B], NFC: [0xCB6B], NFD: [0x110D, 0x116F, 0x11AE], NFKC: [0xCB6B], NFKD: [0x110D, 0x116F, 0x11AE] }, +{ source: [0xCB6C], NFC: [0xCB6C], NFD: [0x110D, 0x116F, 0x11AF], NFKC: [0xCB6C], NFKD: [0x110D, 0x116F, 0x11AF] }, +{ source: [0xCB6D], NFC: [0xCB6D], NFD: [0x110D, 0x116F, 0x11B0], NFKC: [0xCB6D], NFKD: [0x110D, 0x116F, 0x11B0] }, +{ source: [0xCB6E], NFC: [0xCB6E], NFD: [0x110D, 0x116F, 0x11B1], NFKC: [0xCB6E], NFKD: [0x110D, 0x116F, 0x11B1] }, +{ source: [0xCB6F], NFC: [0xCB6F], NFD: [0x110D, 0x116F, 0x11B2], NFKC: [0xCB6F], NFKD: [0x110D, 0x116F, 0x11B2] }, +{ source: [0xCB70], NFC: [0xCB70], NFD: [0x110D, 0x116F, 0x11B3], NFKC: [0xCB70], NFKD: [0x110D, 0x116F, 0x11B3] }, +{ source: [0xCB71], NFC: [0xCB71], NFD: [0x110D, 0x116F, 0x11B4], NFKC: [0xCB71], NFKD: [0x110D, 0x116F, 0x11B4] }, +{ source: [0xCB72], NFC: [0xCB72], NFD: [0x110D, 0x116F, 0x11B5], NFKC: [0xCB72], NFKD: [0x110D, 0x116F, 0x11B5] }, +{ source: [0xCB73], NFC: [0xCB73], NFD: [0x110D, 0x116F, 0x11B6], NFKC: [0xCB73], NFKD: [0x110D, 0x116F, 0x11B6] }, +{ source: [0xCB74], NFC: [0xCB74], NFD: [0x110D, 0x116F, 0x11B7], NFKC: [0xCB74], NFKD: [0x110D, 0x116F, 0x11B7] }, +{ source: [0xCB75], NFC: [0xCB75], NFD: [0x110D, 0x116F, 0x11B8], NFKC: [0xCB75], NFKD: [0x110D, 0x116F, 0x11B8] }, +{ source: [0xCB76], NFC: [0xCB76], NFD: [0x110D, 0x116F, 0x11B9], NFKC: [0xCB76], NFKD: [0x110D, 0x116F, 0x11B9] }, +{ source: [0xCB77], NFC: [0xCB77], NFD: [0x110D, 0x116F, 0x11BA], NFKC: [0xCB77], NFKD: [0x110D, 0x116F, 0x11BA] }, +{ source: [0xCB78], NFC: [0xCB78], NFD: [0x110D, 0x116F, 0x11BB], NFKC: [0xCB78], NFKD: [0x110D, 0x116F, 0x11BB] }, +{ source: [0xCB79], NFC: [0xCB79], NFD: [0x110D, 0x116F, 0x11BC], NFKC: [0xCB79], NFKD: [0x110D, 0x116F, 0x11BC] }, +{ source: [0xCB7A], NFC: [0xCB7A], NFD: [0x110D, 0x116F, 0x11BD], NFKC: [0xCB7A], NFKD: [0x110D, 0x116F, 0x11BD] }, +{ source: [0xCB7B], NFC: [0xCB7B], NFD: [0x110D, 0x116F, 0x11BE], NFKC: [0xCB7B], NFKD: [0x110D, 0x116F, 0x11BE] }, +{ source: [0xCB7C], NFC: [0xCB7C], NFD: [0x110D, 0x116F, 0x11BF], NFKC: [0xCB7C], NFKD: [0x110D, 0x116F, 0x11BF] }, +{ source: [0xCB7D], NFC: [0xCB7D], NFD: [0x110D, 0x116F, 0x11C0], NFKC: [0xCB7D], NFKD: [0x110D, 0x116F, 0x11C0] }, +{ source: [0xCB7E], NFC: [0xCB7E], NFD: [0x110D, 0x116F, 0x11C1], NFKC: [0xCB7E], NFKD: [0x110D, 0x116F, 0x11C1] }, +{ source: [0xCB7F], NFC: [0xCB7F], NFD: [0x110D, 0x116F, 0x11C2], NFKC: [0xCB7F], NFKD: [0x110D, 0x116F, 0x11C2] }, +{ source: [0xCB80], NFC: [0xCB80], NFD: [0x110D, 0x1170], NFKC: [0xCB80], NFKD: [0x110D, 0x1170] }, +{ source: [0xCB81], NFC: [0xCB81], NFD: [0x110D, 0x1170, 0x11A8], NFKC: [0xCB81], NFKD: [0x110D, 0x1170, 0x11A8] }, +{ source: [0xCB82], NFC: [0xCB82], NFD: [0x110D, 0x1170, 0x11A9], NFKC: [0xCB82], NFKD: [0x110D, 0x1170, 0x11A9] }, +{ source: [0xCB83], NFC: [0xCB83], NFD: [0x110D, 0x1170, 0x11AA], NFKC: [0xCB83], NFKD: [0x110D, 0x1170, 0x11AA] }, +{ source: [0xCB84], NFC: [0xCB84], NFD: [0x110D, 0x1170, 0x11AB], NFKC: [0xCB84], NFKD: [0x110D, 0x1170, 0x11AB] }, +{ source: [0xCB85], NFC: [0xCB85], NFD: [0x110D, 0x1170, 0x11AC], NFKC: [0xCB85], NFKD: [0x110D, 0x1170, 0x11AC] }, +{ source: [0xCB86], NFC: [0xCB86], NFD: [0x110D, 0x1170, 0x11AD], NFKC: [0xCB86], NFKD: [0x110D, 0x1170, 0x11AD] }, +{ source: [0xCB87], NFC: [0xCB87], NFD: [0x110D, 0x1170, 0x11AE], NFKC: [0xCB87], NFKD: [0x110D, 0x1170, 0x11AE] }, +{ source: [0xCB88], NFC: [0xCB88], NFD: [0x110D, 0x1170, 0x11AF], NFKC: [0xCB88], NFKD: [0x110D, 0x1170, 0x11AF] }, +{ source: [0xCB89], NFC: [0xCB89], NFD: [0x110D, 0x1170, 0x11B0], NFKC: [0xCB89], NFKD: [0x110D, 0x1170, 0x11B0] }, +{ source: [0xCB8A], NFC: [0xCB8A], NFD: [0x110D, 0x1170, 0x11B1], NFKC: [0xCB8A], NFKD: [0x110D, 0x1170, 0x11B1] }, +{ source: [0xCB8B], NFC: [0xCB8B], NFD: [0x110D, 0x1170, 0x11B2], NFKC: [0xCB8B], NFKD: [0x110D, 0x1170, 0x11B2] }, +{ source: [0xCB8C], NFC: [0xCB8C], NFD: [0x110D, 0x1170, 0x11B3], NFKC: [0xCB8C], NFKD: [0x110D, 0x1170, 0x11B3] }, +{ source: [0xCB8D], NFC: [0xCB8D], NFD: [0x110D, 0x1170, 0x11B4], NFKC: [0xCB8D], NFKD: [0x110D, 0x1170, 0x11B4] }, +{ source: [0xCB8E], NFC: [0xCB8E], NFD: [0x110D, 0x1170, 0x11B5], NFKC: [0xCB8E], NFKD: [0x110D, 0x1170, 0x11B5] }, +{ source: [0xCB8F], NFC: [0xCB8F], NFD: [0x110D, 0x1170, 0x11B6], NFKC: [0xCB8F], NFKD: [0x110D, 0x1170, 0x11B6] }, +{ source: [0xCB90], NFC: [0xCB90], NFD: [0x110D, 0x1170, 0x11B7], NFKC: [0xCB90], NFKD: [0x110D, 0x1170, 0x11B7] }, +{ source: [0xCB91], NFC: [0xCB91], NFD: [0x110D, 0x1170, 0x11B8], NFKC: [0xCB91], NFKD: [0x110D, 0x1170, 0x11B8] }, +{ source: [0xCB92], NFC: [0xCB92], NFD: [0x110D, 0x1170, 0x11B9], NFKC: [0xCB92], NFKD: [0x110D, 0x1170, 0x11B9] }, +{ source: [0xCB93], NFC: [0xCB93], NFD: [0x110D, 0x1170, 0x11BA], NFKC: [0xCB93], NFKD: [0x110D, 0x1170, 0x11BA] }, +{ source: [0xCB94], NFC: [0xCB94], NFD: [0x110D, 0x1170, 0x11BB], NFKC: [0xCB94], NFKD: [0x110D, 0x1170, 0x11BB] }, +{ source: [0xCB95], NFC: [0xCB95], NFD: [0x110D, 0x1170, 0x11BC], NFKC: [0xCB95], NFKD: [0x110D, 0x1170, 0x11BC] }, +{ source: [0xCB96], NFC: [0xCB96], NFD: [0x110D, 0x1170, 0x11BD], NFKC: [0xCB96], NFKD: [0x110D, 0x1170, 0x11BD] }, +{ source: [0xCB97], NFC: [0xCB97], NFD: [0x110D, 0x1170, 0x11BE], NFKC: [0xCB97], NFKD: [0x110D, 0x1170, 0x11BE] }, +{ source: [0xCB98], NFC: [0xCB98], NFD: [0x110D, 0x1170, 0x11BF], NFKC: [0xCB98], NFKD: [0x110D, 0x1170, 0x11BF] }, +{ source: [0xCB99], NFC: [0xCB99], NFD: [0x110D, 0x1170, 0x11C0], NFKC: [0xCB99], NFKD: [0x110D, 0x1170, 0x11C0] }, +{ source: [0xCB9A], NFC: [0xCB9A], NFD: [0x110D, 0x1170, 0x11C1], NFKC: [0xCB9A], NFKD: [0x110D, 0x1170, 0x11C1] }, +{ source: [0xCB9B], NFC: [0xCB9B], NFD: [0x110D, 0x1170, 0x11C2], NFKC: [0xCB9B], NFKD: [0x110D, 0x1170, 0x11C2] }, +{ source: [0xCB9C], NFC: [0xCB9C], NFD: [0x110D, 0x1171], NFKC: [0xCB9C], NFKD: [0x110D, 0x1171] }, +{ source: [0xCB9D], NFC: [0xCB9D], NFD: [0x110D, 0x1171, 0x11A8], NFKC: [0xCB9D], NFKD: [0x110D, 0x1171, 0x11A8] }, +{ source: [0xCB9E], NFC: [0xCB9E], NFD: [0x110D, 0x1171, 0x11A9], NFKC: [0xCB9E], NFKD: [0x110D, 0x1171, 0x11A9] }, +{ source: [0xCB9F], NFC: [0xCB9F], NFD: [0x110D, 0x1171, 0x11AA], NFKC: [0xCB9F], NFKD: [0x110D, 0x1171, 0x11AA] }, +{ source: [0xCBA0], NFC: [0xCBA0], NFD: [0x110D, 0x1171, 0x11AB], NFKC: [0xCBA0], NFKD: [0x110D, 0x1171, 0x11AB] }, +{ source: [0xCBA1], NFC: [0xCBA1], NFD: [0x110D, 0x1171, 0x11AC], NFKC: [0xCBA1], NFKD: [0x110D, 0x1171, 0x11AC] }, +{ source: [0xCBA2], NFC: [0xCBA2], NFD: [0x110D, 0x1171, 0x11AD], NFKC: [0xCBA2], NFKD: [0x110D, 0x1171, 0x11AD] }, +{ source: [0xCBA3], NFC: [0xCBA3], NFD: [0x110D, 0x1171, 0x11AE], NFKC: [0xCBA3], NFKD: [0x110D, 0x1171, 0x11AE] }, +{ source: [0xCBA4], NFC: [0xCBA4], NFD: [0x110D, 0x1171, 0x11AF], NFKC: [0xCBA4], NFKD: [0x110D, 0x1171, 0x11AF] }, +{ source: [0xCBA5], NFC: [0xCBA5], NFD: [0x110D, 0x1171, 0x11B0], NFKC: [0xCBA5], NFKD: [0x110D, 0x1171, 0x11B0] }, +{ source: [0xCBA6], NFC: [0xCBA6], NFD: [0x110D, 0x1171, 0x11B1], NFKC: [0xCBA6], NFKD: [0x110D, 0x1171, 0x11B1] }, +{ source: [0xCBA7], NFC: [0xCBA7], NFD: [0x110D, 0x1171, 0x11B2], NFKC: [0xCBA7], NFKD: [0x110D, 0x1171, 0x11B2] }, +{ source: [0xCBA8], NFC: [0xCBA8], NFD: [0x110D, 0x1171, 0x11B3], NFKC: [0xCBA8], NFKD: [0x110D, 0x1171, 0x11B3] }, +{ source: [0xCBA9], NFC: [0xCBA9], NFD: [0x110D, 0x1171, 0x11B4], NFKC: [0xCBA9], NFKD: [0x110D, 0x1171, 0x11B4] }, +{ source: [0xCBAA], NFC: [0xCBAA], NFD: [0x110D, 0x1171, 0x11B5], NFKC: [0xCBAA], NFKD: [0x110D, 0x1171, 0x11B5] }, +{ source: [0xCBAB], NFC: [0xCBAB], NFD: [0x110D, 0x1171, 0x11B6], NFKC: [0xCBAB], NFKD: [0x110D, 0x1171, 0x11B6] }, +{ source: [0xCBAC], NFC: [0xCBAC], NFD: [0x110D, 0x1171, 0x11B7], NFKC: [0xCBAC], NFKD: [0x110D, 0x1171, 0x11B7] }, +{ source: [0xCBAD], NFC: [0xCBAD], NFD: [0x110D, 0x1171, 0x11B8], NFKC: [0xCBAD], NFKD: [0x110D, 0x1171, 0x11B8] }, +{ source: [0xCBAE], NFC: [0xCBAE], NFD: [0x110D, 0x1171, 0x11B9], NFKC: [0xCBAE], NFKD: [0x110D, 0x1171, 0x11B9] }, +{ source: [0xCBAF], NFC: [0xCBAF], NFD: [0x110D, 0x1171, 0x11BA], NFKC: [0xCBAF], NFKD: [0x110D, 0x1171, 0x11BA] }, +{ source: [0xCBB0], NFC: [0xCBB0], NFD: [0x110D, 0x1171, 0x11BB], NFKC: [0xCBB0], NFKD: [0x110D, 0x1171, 0x11BB] }, +{ source: [0xCBB1], NFC: [0xCBB1], NFD: [0x110D, 0x1171, 0x11BC], NFKC: [0xCBB1], NFKD: [0x110D, 0x1171, 0x11BC] }, +{ source: [0xCBB2], NFC: [0xCBB2], NFD: [0x110D, 0x1171, 0x11BD], NFKC: [0xCBB2], NFKD: [0x110D, 0x1171, 0x11BD] }, +{ source: [0xCBB3], NFC: [0xCBB3], NFD: [0x110D, 0x1171, 0x11BE], NFKC: [0xCBB3], NFKD: [0x110D, 0x1171, 0x11BE] }, +{ source: [0xCBB4], NFC: [0xCBB4], NFD: [0x110D, 0x1171, 0x11BF], NFKC: [0xCBB4], NFKD: [0x110D, 0x1171, 0x11BF] }, +{ source: [0xCBB5], NFC: [0xCBB5], NFD: [0x110D, 0x1171, 0x11C0], NFKC: [0xCBB5], NFKD: [0x110D, 0x1171, 0x11C0] }, +{ source: [0xCBB6], NFC: [0xCBB6], NFD: [0x110D, 0x1171, 0x11C1], NFKC: [0xCBB6], NFKD: [0x110D, 0x1171, 0x11C1] }, +{ source: [0xCBB7], NFC: [0xCBB7], NFD: [0x110D, 0x1171, 0x11C2], NFKC: [0xCBB7], NFKD: [0x110D, 0x1171, 0x11C2] }, +{ source: [0xCBB8], NFC: [0xCBB8], NFD: [0x110D, 0x1172], NFKC: [0xCBB8], NFKD: [0x110D, 0x1172] }, +{ source: [0xCBB9], NFC: [0xCBB9], NFD: [0x110D, 0x1172, 0x11A8], NFKC: [0xCBB9], NFKD: [0x110D, 0x1172, 0x11A8] }, +{ source: [0xCBBA], NFC: [0xCBBA], NFD: [0x110D, 0x1172, 0x11A9], NFKC: [0xCBBA], NFKD: [0x110D, 0x1172, 0x11A9] }, +{ source: [0xCBBB], NFC: [0xCBBB], NFD: [0x110D, 0x1172, 0x11AA], NFKC: [0xCBBB], NFKD: [0x110D, 0x1172, 0x11AA] }, +{ source: [0xCBBC], NFC: [0xCBBC], NFD: [0x110D, 0x1172, 0x11AB], NFKC: [0xCBBC], NFKD: [0x110D, 0x1172, 0x11AB] }, +{ source: [0xCBBD], NFC: [0xCBBD], NFD: [0x110D, 0x1172, 0x11AC], NFKC: [0xCBBD], NFKD: [0x110D, 0x1172, 0x11AC] }, +{ source: [0xCBBE], NFC: [0xCBBE], NFD: [0x110D, 0x1172, 0x11AD], NFKC: [0xCBBE], NFKD: [0x110D, 0x1172, 0x11AD] }, +{ source: [0xCBBF], NFC: [0xCBBF], NFD: [0x110D, 0x1172, 0x11AE], NFKC: [0xCBBF], NFKD: [0x110D, 0x1172, 0x11AE] }, +{ source: [0xCBC0], NFC: [0xCBC0], NFD: [0x110D, 0x1172, 0x11AF], NFKC: [0xCBC0], NFKD: [0x110D, 0x1172, 0x11AF] }, +{ source: [0xCBC1], NFC: [0xCBC1], NFD: [0x110D, 0x1172, 0x11B0], NFKC: [0xCBC1], NFKD: [0x110D, 0x1172, 0x11B0] }, +{ source: [0xCBC2], NFC: [0xCBC2], NFD: [0x110D, 0x1172, 0x11B1], NFKC: [0xCBC2], NFKD: [0x110D, 0x1172, 0x11B1] }, +{ source: [0xCBC3], NFC: [0xCBC3], NFD: [0x110D, 0x1172, 0x11B2], NFKC: [0xCBC3], NFKD: [0x110D, 0x1172, 0x11B2] }, +{ source: [0xCBC4], NFC: [0xCBC4], NFD: [0x110D, 0x1172, 0x11B3], NFKC: [0xCBC4], NFKD: [0x110D, 0x1172, 0x11B3] }, +{ source: [0xCBC5], NFC: [0xCBC5], NFD: [0x110D, 0x1172, 0x11B4], NFKC: [0xCBC5], NFKD: [0x110D, 0x1172, 0x11B4] }, +{ source: [0xCBC6], NFC: [0xCBC6], NFD: [0x110D, 0x1172, 0x11B5], NFKC: [0xCBC6], NFKD: [0x110D, 0x1172, 0x11B5] }, +{ source: [0xCBC7], NFC: [0xCBC7], NFD: [0x110D, 0x1172, 0x11B6], NFKC: [0xCBC7], NFKD: [0x110D, 0x1172, 0x11B6] }, +{ source: [0xCBC8], NFC: [0xCBC8], NFD: [0x110D, 0x1172, 0x11B7], NFKC: [0xCBC8], NFKD: [0x110D, 0x1172, 0x11B7] }, +{ source: [0xCBC9], NFC: [0xCBC9], NFD: [0x110D, 0x1172, 0x11B8], NFKC: [0xCBC9], NFKD: [0x110D, 0x1172, 0x11B8] }, +{ source: [0xCBCA], NFC: [0xCBCA], NFD: [0x110D, 0x1172, 0x11B9], NFKC: [0xCBCA], NFKD: [0x110D, 0x1172, 0x11B9] }, +{ source: [0xCBCB], NFC: [0xCBCB], NFD: [0x110D, 0x1172, 0x11BA], NFKC: [0xCBCB], NFKD: [0x110D, 0x1172, 0x11BA] }, +{ source: [0xCBCC], NFC: [0xCBCC], NFD: [0x110D, 0x1172, 0x11BB], NFKC: [0xCBCC], NFKD: [0x110D, 0x1172, 0x11BB] }, +{ source: [0xCBCD], NFC: [0xCBCD], NFD: [0x110D, 0x1172, 0x11BC], NFKC: [0xCBCD], NFKD: [0x110D, 0x1172, 0x11BC] }, +{ source: [0xCBCE], NFC: [0xCBCE], NFD: [0x110D, 0x1172, 0x11BD], NFKC: [0xCBCE], NFKD: [0x110D, 0x1172, 0x11BD] }, +{ source: [0xCBCF], NFC: [0xCBCF], NFD: [0x110D, 0x1172, 0x11BE], NFKC: [0xCBCF], NFKD: [0x110D, 0x1172, 0x11BE] }, +{ source: [0xCBD0], NFC: [0xCBD0], NFD: [0x110D, 0x1172, 0x11BF], NFKC: [0xCBD0], NFKD: [0x110D, 0x1172, 0x11BF] }, +{ source: [0xCBD1], NFC: [0xCBD1], NFD: [0x110D, 0x1172, 0x11C0], NFKC: [0xCBD1], NFKD: [0x110D, 0x1172, 0x11C0] }, +{ source: [0xCBD2], NFC: [0xCBD2], NFD: [0x110D, 0x1172, 0x11C1], NFKC: [0xCBD2], NFKD: [0x110D, 0x1172, 0x11C1] }, +{ source: [0xCBD3], NFC: [0xCBD3], NFD: [0x110D, 0x1172, 0x11C2], NFKC: [0xCBD3], NFKD: [0x110D, 0x1172, 0x11C2] }, +{ source: [0xCBD4], NFC: [0xCBD4], NFD: [0x110D, 0x1173], NFKC: [0xCBD4], NFKD: [0x110D, 0x1173] }, +{ source: [0xCBD5], NFC: [0xCBD5], NFD: [0x110D, 0x1173, 0x11A8], NFKC: [0xCBD5], NFKD: [0x110D, 0x1173, 0x11A8] }, +{ source: [0xCBD6], NFC: [0xCBD6], NFD: [0x110D, 0x1173, 0x11A9], NFKC: [0xCBD6], NFKD: [0x110D, 0x1173, 0x11A9] }, +{ source: [0xCBD7], NFC: [0xCBD7], NFD: [0x110D, 0x1173, 0x11AA], NFKC: [0xCBD7], NFKD: [0x110D, 0x1173, 0x11AA] }, +{ source: [0xCBD8], NFC: [0xCBD8], NFD: [0x110D, 0x1173, 0x11AB], NFKC: [0xCBD8], NFKD: [0x110D, 0x1173, 0x11AB] }, +{ source: [0xCBD9], NFC: [0xCBD9], NFD: [0x110D, 0x1173, 0x11AC], NFKC: [0xCBD9], NFKD: [0x110D, 0x1173, 0x11AC] }, +{ source: [0xCBDA], NFC: [0xCBDA], NFD: [0x110D, 0x1173, 0x11AD], NFKC: [0xCBDA], NFKD: [0x110D, 0x1173, 0x11AD] }, +{ source: [0xCBDB], NFC: [0xCBDB], NFD: [0x110D, 0x1173, 0x11AE], NFKC: [0xCBDB], NFKD: [0x110D, 0x1173, 0x11AE] }, +{ source: [0xCBDC], NFC: [0xCBDC], NFD: [0x110D, 0x1173, 0x11AF], NFKC: [0xCBDC], NFKD: [0x110D, 0x1173, 0x11AF] }, +{ source: [0xCBDD], NFC: [0xCBDD], NFD: [0x110D, 0x1173, 0x11B0], NFKC: [0xCBDD], NFKD: [0x110D, 0x1173, 0x11B0] }, +{ source: [0xCBDE], NFC: [0xCBDE], NFD: [0x110D, 0x1173, 0x11B1], NFKC: [0xCBDE], NFKD: [0x110D, 0x1173, 0x11B1] }, +{ source: [0xCBDF], NFC: [0xCBDF], NFD: [0x110D, 0x1173, 0x11B2], NFKC: [0xCBDF], NFKD: [0x110D, 0x1173, 0x11B2] }, +{ source: [0xCBE0], NFC: [0xCBE0], NFD: [0x110D, 0x1173, 0x11B3], NFKC: [0xCBE0], NFKD: [0x110D, 0x1173, 0x11B3] }, +{ source: [0xCBE1], NFC: [0xCBE1], NFD: [0x110D, 0x1173, 0x11B4], NFKC: [0xCBE1], NFKD: [0x110D, 0x1173, 0x11B4] }, +{ source: [0xCBE2], NFC: [0xCBE2], NFD: [0x110D, 0x1173, 0x11B5], NFKC: [0xCBE2], NFKD: [0x110D, 0x1173, 0x11B5] }, +{ source: [0xCBE3], NFC: [0xCBE3], NFD: [0x110D, 0x1173, 0x11B6], NFKC: [0xCBE3], NFKD: [0x110D, 0x1173, 0x11B6] }, +{ source: [0xCBE4], NFC: [0xCBE4], NFD: [0x110D, 0x1173, 0x11B7], NFKC: [0xCBE4], NFKD: [0x110D, 0x1173, 0x11B7] }, +{ source: [0xCBE5], NFC: [0xCBE5], NFD: [0x110D, 0x1173, 0x11B8], NFKC: [0xCBE5], NFKD: [0x110D, 0x1173, 0x11B8] }, +{ source: [0xCBE6], NFC: [0xCBE6], NFD: [0x110D, 0x1173, 0x11B9], NFKC: [0xCBE6], NFKD: [0x110D, 0x1173, 0x11B9] }, +{ source: [0xCBE7], NFC: [0xCBE7], NFD: [0x110D, 0x1173, 0x11BA], NFKC: [0xCBE7], NFKD: [0x110D, 0x1173, 0x11BA] }, +{ source: [0xCBE8], NFC: [0xCBE8], NFD: [0x110D, 0x1173, 0x11BB], NFKC: [0xCBE8], NFKD: [0x110D, 0x1173, 0x11BB] }, +{ source: [0xCBE9], NFC: [0xCBE9], NFD: [0x110D, 0x1173, 0x11BC], NFKC: [0xCBE9], NFKD: [0x110D, 0x1173, 0x11BC] }, +{ source: [0xCBEA], NFC: [0xCBEA], NFD: [0x110D, 0x1173, 0x11BD], NFKC: [0xCBEA], NFKD: [0x110D, 0x1173, 0x11BD] }, +{ source: [0xCBEB], NFC: [0xCBEB], NFD: [0x110D, 0x1173, 0x11BE], NFKC: [0xCBEB], NFKD: [0x110D, 0x1173, 0x11BE] }, +{ source: [0xCBEC], NFC: [0xCBEC], NFD: [0x110D, 0x1173, 0x11BF], NFKC: [0xCBEC], NFKD: [0x110D, 0x1173, 0x11BF] }, +{ source: [0xCBED], NFC: [0xCBED], NFD: [0x110D, 0x1173, 0x11C0], NFKC: [0xCBED], NFKD: [0x110D, 0x1173, 0x11C0] }, +{ source: [0xCBEE], NFC: [0xCBEE], NFD: [0x110D, 0x1173, 0x11C1], NFKC: [0xCBEE], NFKD: [0x110D, 0x1173, 0x11C1] }, +{ source: [0xCBEF], NFC: [0xCBEF], NFD: [0x110D, 0x1173, 0x11C2], NFKC: [0xCBEF], NFKD: [0x110D, 0x1173, 0x11C2] }, +{ source: [0xCBF0], NFC: [0xCBF0], NFD: [0x110D, 0x1174], NFKC: [0xCBF0], NFKD: [0x110D, 0x1174] }, +{ source: [0xCBF1], NFC: [0xCBF1], NFD: [0x110D, 0x1174, 0x11A8], NFKC: [0xCBF1], NFKD: [0x110D, 0x1174, 0x11A8] }, +{ source: [0xCBF2], NFC: [0xCBF2], NFD: [0x110D, 0x1174, 0x11A9], NFKC: [0xCBF2], NFKD: [0x110D, 0x1174, 0x11A9] }, +{ source: [0xCBF3], NFC: [0xCBF3], NFD: [0x110D, 0x1174, 0x11AA], NFKC: [0xCBF3], NFKD: [0x110D, 0x1174, 0x11AA] }, +{ source: [0xCBF4], NFC: [0xCBF4], NFD: [0x110D, 0x1174, 0x11AB], NFKC: [0xCBF4], NFKD: [0x110D, 0x1174, 0x11AB] }, +{ source: [0xCBF5], NFC: [0xCBF5], NFD: [0x110D, 0x1174, 0x11AC], NFKC: [0xCBF5], NFKD: [0x110D, 0x1174, 0x11AC] }, +{ source: [0xCBF6], NFC: [0xCBF6], NFD: [0x110D, 0x1174, 0x11AD], NFKC: [0xCBF6], NFKD: [0x110D, 0x1174, 0x11AD] }, +{ source: [0xCBF7], NFC: [0xCBF7], NFD: [0x110D, 0x1174, 0x11AE], NFKC: [0xCBF7], NFKD: [0x110D, 0x1174, 0x11AE] }, +{ source: [0xCBF8], NFC: [0xCBF8], NFD: [0x110D, 0x1174, 0x11AF], NFKC: [0xCBF8], NFKD: [0x110D, 0x1174, 0x11AF] }, +{ source: [0xCBF9], NFC: [0xCBF9], NFD: [0x110D, 0x1174, 0x11B0], NFKC: [0xCBF9], NFKD: [0x110D, 0x1174, 0x11B0] }, +{ source: [0xCBFA], NFC: [0xCBFA], NFD: [0x110D, 0x1174, 0x11B1], NFKC: [0xCBFA], NFKD: [0x110D, 0x1174, 0x11B1] }, +{ source: [0xCBFB], NFC: [0xCBFB], NFD: [0x110D, 0x1174, 0x11B2], NFKC: [0xCBFB], NFKD: [0x110D, 0x1174, 0x11B2] }, +{ source: [0xCBFC], NFC: [0xCBFC], NFD: [0x110D, 0x1174, 0x11B3], NFKC: [0xCBFC], NFKD: [0x110D, 0x1174, 0x11B3] }, +{ source: [0xCBFD], NFC: [0xCBFD], NFD: [0x110D, 0x1174, 0x11B4], NFKC: [0xCBFD], NFKD: [0x110D, 0x1174, 0x11B4] }, +{ source: [0xCBFE], NFC: [0xCBFE], NFD: [0x110D, 0x1174, 0x11B5], NFKC: [0xCBFE], NFKD: [0x110D, 0x1174, 0x11B5] }, +{ source: [0xCBFF], NFC: [0xCBFF], NFD: [0x110D, 0x1174, 0x11B6], NFKC: [0xCBFF], NFKD: [0x110D, 0x1174, 0x11B6] }, +{ source: [0xCC00], NFC: [0xCC00], NFD: [0x110D, 0x1174, 0x11B7], NFKC: [0xCC00], NFKD: [0x110D, 0x1174, 0x11B7] }, +{ source: [0xCC01], NFC: [0xCC01], NFD: [0x110D, 0x1174, 0x11B8], NFKC: [0xCC01], NFKD: [0x110D, 0x1174, 0x11B8] }, +{ source: [0xCC02], NFC: [0xCC02], NFD: [0x110D, 0x1174, 0x11B9], NFKC: [0xCC02], NFKD: [0x110D, 0x1174, 0x11B9] }, +{ source: [0xCC03], NFC: [0xCC03], NFD: [0x110D, 0x1174, 0x11BA], NFKC: [0xCC03], NFKD: [0x110D, 0x1174, 0x11BA] }, +{ source: [0xCC04], NFC: [0xCC04], NFD: [0x110D, 0x1174, 0x11BB], NFKC: [0xCC04], NFKD: [0x110D, 0x1174, 0x11BB] }, +{ source: [0xCC05], NFC: [0xCC05], NFD: [0x110D, 0x1174, 0x11BC], NFKC: [0xCC05], NFKD: [0x110D, 0x1174, 0x11BC] }, +{ source: [0xCC06], NFC: [0xCC06], NFD: [0x110D, 0x1174, 0x11BD], NFKC: [0xCC06], NFKD: [0x110D, 0x1174, 0x11BD] }, +{ source: [0xCC07], NFC: [0xCC07], NFD: [0x110D, 0x1174, 0x11BE], NFKC: [0xCC07], NFKD: [0x110D, 0x1174, 0x11BE] }, +{ source: [0xCC08], NFC: [0xCC08], NFD: [0x110D, 0x1174, 0x11BF], NFKC: [0xCC08], NFKD: [0x110D, 0x1174, 0x11BF] }, +{ source: [0xCC09], NFC: [0xCC09], NFD: [0x110D, 0x1174, 0x11C0], NFKC: [0xCC09], NFKD: [0x110D, 0x1174, 0x11C0] }, +{ source: [0xCC0A], NFC: [0xCC0A], NFD: [0x110D, 0x1174, 0x11C1], NFKC: [0xCC0A], NFKD: [0x110D, 0x1174, 0x11C1] }, +{ source: [0xCC0B], NFC: [0xCC0B], NFD: [0x110D, 0x1174, 0x11C2], NFKC: [0xCC0B], NFKD: [0x110D, 0x1174, 0x11C2] }, +{ source: [0xCC0C], NFC: [0xCC0C], NFD: [0x110D, 0x1175], NFKC: [0xCC0C], NFKD: [0x110D, 0x1175] }, +{ source: [0xCC0D], NFC: [0xCC0D], NFD: [0x110D, 0x1175, 0x11A8], NFKC: [0xCC0D], NFKD: [0x110D, 0x1175, 0x11A8] }, +{ source: [0xCC0E], NFC: [0xCC0E], NFD: [0x110D, 0x1175, 0x11A9], NFKC: [0xCC0E], NFKD: [0x110D, 0x1175, 0x11A9] }, +{ source: [0xCC0F], NFC: [0xCC0F], NFD: [0x110D, 0x1175, 0x11AA], NFKC: [0xCC0F], NFKD: [0x110D, 0x1175, 0x11AA] }, +{ source: [0xCC10], NFC: [0xCC10], NFD: [0x110D, 0x1175, 0x11AB], NFKC: [0xCC10], NFKD: [0x110D, 0x1175, 0x11AB] }, +{ source: [0xCC11], NFC: [0xCC11], NFD: [0x110D, 0x1175, 0x11AC], NFKC: [0xCC11], NFKD: [0x110D, 0x1175, 0x11AC] }, +{ source: [0xCC12], NFC: [0xCC12], NFD: [0x110D, 0x1175, 0x11AD], NFKC: [0xCC12], NFKD: [0x110D, 0x1175, 0x11AD] }, +{ source: [0xCC13], NFC: [0xCC13], NFD: [0x110D, 0x1175, 0x11AE], NFKC: [0xCC13], NFKD: [0x110D, 0x1175, 0x11AE] }, +{ source: [0xCC14], NFC: [0xCC14], NFD: [0x110D, 0x1175, 0x11AF], NFKC: [0xCC14], NFKD: [0x110D, 0x1175, 0x11AF] }, +{ source: [0xCC15], NFC: [0xCC15], NFD: [0x110D, 0x1175, 0x11B0], NFKC: [0xCC15], NFKD: [0x110D, 0x1175, 0x11B0] }, +{ source: [0xCC16], NFC: [0xCC16], NFD: [0x110D, 0x1175, 0x11B1], NFKC: [0xCC16], NFKD: [0x110D, 0x1175, 0x11B1] }, +{ source: [0xCC17], NFC: [0xCC17], NFD: [0x110D, 0x1175, 0x11B2], NFKC: [0xCC17], NFKD: [0x110D, 0x1175, 0x11B2] }, +{ source: [0xCC18], NFC: [0xCC18], NFD: [0x110D, 0x1175, 0x11B3], NFKC: [0xCC18], NFKD: [0x110D, 0x1175, 0x11B3] }, +{ source: [0xCC19], NFC: [0xCC19], NFD: [0x110D, 0x1175, 0x11B4], NFKC: [0xCC19], NFKD: [0x110D, 0x1175, 0x11B4] }, +{ source: [0xCC1A], NFC: [0xCC1A], NFD: [0x110D, 0x1175, 0x11B5], NFKC: [0xCC1A], NFKD: [0x110D, 0x1175, 0x11B5] }, +{ source: [0xCC1B], NFC: [0xCC1B], NFD: [0x110D, 0x1175, 0x11B6], NFKC: [0xCC1B], NFKD: [0x110D, 0x1175, 0x11B6] }, +{ source: [0xCC1C], NFC: [0xCC1C], NFD: [0x110D, 0x1175, 0x11B7], NFKC: [0xCC1C], NFKD: [0x110D, 0x1175, 0x11B7] }, +{ source: [0xCC1D], NFC: [0xCC1D], NFD: [0x110D, 0x1175, 0x11B8], NFKC: [0xCC1D], NFKD: [0x110D, 0x1175, 0x11B8] }, +{ source: [0xCC1E], NFC: [0xCC1E], NFD: [0x110D, 0x1175, 0x11B9], NFKC: [0xCC1E], NFKD: [0x110D, 0x1175, 0x11B9] }, +{ source: [0xCC1F], NFC: [0xCC1F], NFD: [0x110D, 0x1175, 0x11BA], NFKC: [0xCC1F], NFKD: [0x110D, 0x1175, 0x11BA] }, +{ source: [0xCC20], NFC: [0xCC20], NFD: [0x110D, 0x1175, 0x11BB], NFKC: [0xCC20], NFKD: [0x110D, 0x1175, 0x11BB] }, +{ source: [0xCC21], NFC: [0xCC21], NFD: [0x110D, 0x1175, 0x11BC], NFKC: [0xCC21], NFKD: [0x110D, 0x1175, 0x11BC] }, +{ source: [0xCC22], NFC: [0xCC22], NFD: [0x110D, 0x1175, 0x11BD], NFKC: [0xCC22], NFKD: [0x110D, 0x1175, 0x11BD] }, +{ source: [0xCC23], NFC: [0xCC23], NFD: [0x110D, 0x1175, 0x11BE], NFKC: [0xCC23], NFKD: [0x110D, 0x1175, 0x11BE] }, +{ source: [0xCC24], NFC: [0xCC24], NFD: [0x110D, 0x1175, 0x11BF], NFKC: [0xCC24], NFKD: [0x110D, 0x1175, 0x11BF] }, +{ source: [0xCC25], NFC: [0xCC25], NFD: [0x110D, 0x1175, 0x11C0], NFKC: [0xCC25], NFKD: [0x110D, 0x1175, 0x11C0] }, +{ source: [0xCC26], NFC: [0xCC26], NFD: [0x110D, 0x1175, 0x11C1], NFKC: [0xCC26], NFKD: [0x110D, 0x1175, 0x11C1] }, +{ source: [0xCC27], NFC: [0xCC27], NFD: [0x110D, 0x1175, 0x11C2], NFKC: [0xCC27], NFKD: [0x110D, 0x1175, 0x11C2] }, +{ source: [0xCC28], NFC: [0xCC28], NFD: [0x110E, 0x1161], NFKC: [0xCC28], NFKD: [0x110E, 0x1161] }, +{ source: [0xCC29], NFC: [0xCC29], NFD: [0x110E, 0x1161, 0x11A8], NFKC: [0xCC29], NFKD: [0x110E, 0x1161, 0x11A8] }, +{ source: [0xCC2A], NFC: [0xCC2A], NFD: [0x110E, 0x1161, 0x11A9], NFKC: [0xCC2A], NFKD: [0x110E, 0x1161, 0x11A9] }, +{ source: [0xCC2B], NFC: [0xCC2B], NFD: [0x110E, 0x1161, 0x11AA], NFKC: [0xCC2B], NFKD: [0x110E, 0x1161, 0x11AA] }, +{ source: [0xCC2C], NFC: [0xCC2C], NFD: [0x110E, 0x1161, 0x11AB], NFKC: [0xCC2C], NFKD: [0x110E, 0x1161, 0x11AB] }, +{ source: [0xCC2D], NFC: [0xCC2D], NFD: [0x110E, 0x1161, 0x11AC], NFKC: [0xCC2D], NFKD: [0x110E, 0x1161, 0x11AC] }, +{ source: [0xCC2E], NFC: [0xCC2E], NFD: [0x110E, 0x1161, 0x11AD], NFKC: [0xCC2E], NFKD: [0x110E, 0x1161, 0x11AD] }, +{ source: [0xCC2F], NFC: [0xCC2F], NFD: [0x110E, 0x1161, 0x11AE], NFKC: [0xCC2F], NFKD: [0x110E, 0x1161, 0x11AE] }, +{ source: [0xCC30], NFC: [0xCC30], NFD: [0x110E, 0x1161, 0x11AF], NFKC: [0xCC30], NFKD: [0x110E, 0x1161, 0x11AF] }, +{ source: [0xCC31], NFC: [0xCC31], NFD: [0x110E, 0x1161, 0x11B0], NFKC: [0xCC31], NFKD: [0x110E, 0x1161, 0x11B0] }, +{ source: [0xCC32], NFC: [0xCC32], NFD: [0x110E, 0x1161, 0x11B1], NFKC: [0xCC32], NFKD: [0x110E, 0x1161, 0x11B1] }, +{ source: [0xCC33], NFC: [0xCC33], NFD: [0x110E, 0x1161, 0x11B2], NFKC: [0xCC33], NFKD: [0x110E, 0x1161, 0x11B2] }, +{ source: [0xCC34], NFC: [0xCC34], NFD: [0x110E, 0x1161, 0x11B3], NFKC: [0xCC34], NFKD: [0x110E, 0x1161, 0x11B3] }, +{ source: [0xCC35], NFC: [0xCC35], NFD: [0x110E, 0x1161, 0x11B4], NFKC: [0xCC35], NFKD: [0x110E, 0x1161, 0x11B4] }, +{ source: [0xCC36], NFC: [0xCC36], NFD: [0x110E, 0x1161, 0x11B5], NFKC: [0xCC36], NFKD: [0x110E, 0x1161, 0x11B5] }, +{ source: [0xCC37], NFC: [0xCC37], NFD: [0x110E, 0x1161, 0x11B6], NFKC: [0xCC37], NFKD: [0x110E, 0x1161, 0x11B6] }, +{ source: [0xCC38], NFC: [0xCC38], NFD: [0x110E, 0x1161, 0x11B7], NFKC: [0xCC38], NFKD: [0x110E, 0x1161, 0x11B7] }, +{ source: [0xCC39], NFC: [0xCC39], NFD: [0x110E, 0x1161, 0x11B8], NFKC: [0xCC39], NFKD: [0x110E, 0x1161, 0x11B8] }, +{ source: [0xCC3A], NFC: [0xCC3A], NFD: [0x110E, 0x1161, 0x11B9], NFKC: [0xCC3A], NFKD: [0x110E, 0x1161, 0x11B9] }, +{ source: [0xCC3B], NFC: [0xCC3B], NFD: [0x110E, 0x1161, 0x11BA], NFKC: [0xCC3B], NFKD: [0x110E, 0x1161, 0x11BA] }, +{ source: [0xCC3C], NFC: [0xCC3C], NFD: [0x110E, 0x1161, 0x11BB], NFKC: [0xCC3C], NFKD: [0x110E, 0x1161, 0x11BB] }, +{ source: [0xCC3D], NFC: [0xCC3D], NFD: [0x110E, 0x1161, 0x11BC], NFKC: [0xCC3D], NFKD: [0x110E, 0x1161, 0x11BC] }, +{ source: [0xCC3E], NFC: [0xCC3E], NFD: [0x110E, 0x1161, 0x11BD], NFKC: [0xCC3E], NFKD: [0x110E, 0x1161, 0x11BD] }, +{ source: [0xCC3F], NFC: [0xCC3F], NFD: [0x110E, 0x1161, 0x11BE], NFKC: [0xCC3F], NFKD: [0x110E, 0x1161, 0x11BE] }, +{ source: [0xCC40], NFC: [0xCC40], NFD: [0x110E, 0x1161, 0x11BF], NFKC: [0xCC40], NFKD: [0x110E, 0x1161, 0x11BF] }, +{ source: [0xCC41], NFC: [0xCC41], NFD: [0x110E, 0x1161, 0x11C0], NFKC: [0xCC41], NFKD: [0x110E, 0x1161, 0x11C0] }, +{ source: [0xCC42], NFC: [0xCC42], NFD: [0x110E, 0x1161, 0x11C1], NFKC: [0xCC42], NFKD: [0x110E, 0x1161, 0x11C1] }, +{ source: [0xCC43], NFC: [0xCC43], NFD: [0x110E, 0x1161, 0x11C2], NFKC: [0xCC43], NFKD: [0x110E, 0x1161, 0x11C2] }, +{ source: [0xCC44], NFC: [0xCC44], NFD: [0x110E, 0x1162], NFKC: [0xCC44], NFKD: [0x110E, 0x1162] }, +{ source: [0xCC45], NFC: [0xCC45], NFD: [0x110E, 0x1162, 0x11A8], NFKC: [0xCC45], NFKD: [0x110E, 0x1162, 0x11A8] }, +{ source: [0xCC46], NFC: [0xCC46], NFD: [0x110E, 0x1162, 0x11A9], NFKC: [0xCC46], NFKD: [0x110E, 0x1162, 0x11A9] }, +{ source: [0xCC47], NFC: [0xCC47], NFD: [0x110E, 0x1162, 0x11AA], NFKC: [0xCC47], NFKD: [0x110E, 0x1162, 0x11AA] }, +{ source: [0xCC48], NFC: [0xCC48], NFD: [0x110E, 0x1162, 0x11AB], NFKC: [0xCC48], NFKD: [0x110E, 0x1162, 0x11AB] }, +{ source: [0xCC49], NFC: [0xCC49], NFD: [0x110E, 0x1162, 0x11AC], NFKC: [0xCC49], NFKD: [0x110E, 0x1162, 0x11AC] }, +{ source: [0xCC4A], NFC: [0xCC4A], NFD: [0x110E, 0x1162, 0x11AD], NFKC: [0xCC4A], NFKD: [0x110E, 0x1162, 0x11AD] }, +{ source: [0xCC4B], NFC: [0xCC4B], NFD: [0x110E, 0x1162, 0x11AE], NFKC: [0xCC4B], NFKD: [0x110E, 0x1162, 0x11AE] }, +{ source: [0xCC4C], NFC: [0xCC4C], NFD: [0x110E, 0x1162, 0x11AF], NFKC: [0xCC4C], NFKD: [0x110E, 0x1162, 0x11AF] }, +{ source: [0xCC4D], NFC: [0xCC4D], NFD: [0x110E, 0x1162, 0x11B0], NFKC: [0xCC4D], NFKD: [0x110E, 0x1162, 0x11B0] }, +{ source: [0xCC4E], NFC: [0xCC4E], NFD: [0x110E, 0x1162, 0x11B1], NFKC: [0xCC4E], NFKD: [0x110E, 0x1162, 0x11B1] }, +{ source: [0xCC4F], NFC: [0xCC4F], NFD: [0x110E, 0x1162, 0x11B2], NFKC: [0xCC4F], NFKD: [0x110E, 0x1162, 0x11B2] }, +{ source: [0xCC50], NFC: [0xCC50], NFD: [0x110E, 0x1162, 0x11B3], NFKC: [0xCC50], NFKD: [0x110E, 0x1162, 0x11B3] }, +{ source: [0xCC51], NFC: [0xCC51], NFD: [0x110E, 0x1162, 0x11B4], NFKC: [0xCC51], NFKD: [0x110E, 0x1162, 0x11B4] }, +{ source: [0xCC52], NFC: [0xCC52], NFD: [0x110E, 0x1162, 0x11B5], NFKC: [0xCC52], NFKD: [0x110E, 0x1162, 0x11B5] }, +{ source: [0xCC53], NFC: [0xCC53], NFD: [0x110E, 0x1162, 0x11B6], NFKC: [0xCC53], NFKD: [0x110E, 0x1162, 0x11B6] }, +{ source: [0xCC54], NFC: [0xCC54], NFD: [0x110E, 0x1162, 0x11B7], NFKC: [0xCC54], NFKD: [0x110E, 0x1162, 0x11B7] }, +{ source: [0xCC55], NFC: [0xCC55], NFD: [0x110E, 0x1162, 0x11B8], NFKC: [0xCC55], NFKD: [0x110E, 0x1162, 0x11B8] }, +{ source: [0xCC56], NFC: [0xCC56], NFD: [0x110E, 0x1162, 0x11B9], NFKC: [0xCC56], NFKD: [0x110E, 0x1162, 0x11B9] }, +{ source: [0xCC57], NFC: [0xCC57], NFD: [0x110E, 0x1162, 0x11BA], NFKC: [0xCC57], NFKD: [0x110E, 0x1162, 0x11BA] }, +{ source: [0xCC58], NFC: [0xCC58], NFD: [0x110E, 0x1162, 0x11BB], NFKC: [0xCC58], NFKD: [0x110E, 0x1162, 0x11BB] }, +{ source: [0xCC59], NFC: [0xCC59], NFD: [0x110E, 0x1162, 0x11BC], NFKC: [0xCC59], NFKD: [0x110E, 0x1162, 0x11BC] }, +{ source: [0xCC5A], NFC: [0xCC5A], NFD: [0x110E, 0x1162, 0x11BD], NFKC: [0xCC5A], NFKD: [0x110E, 0x1162, 0x11BD] }, +{ source: [0xCC5B], NFC: [0xCC5B], NFD: [0x110E, 0x1162, 0x11BE], NFKC: [0xCC5B], NFKD: [0x110E, 0x1162, 0x11BE] }, +{ source: [0xCC5C], NFC: [0xCC5C], NFD: [0x110E, 0x1162, 0x11BF], NFKC: [0xCC5C], NFKD: [0x110E, 0x1162, 0x11BF] }, +{ source: [0xCC5D], NFC: [0xCC5D], NFD: [0x110E, 0x1162, 0x11C0], NFKC: [0xCC5D], NFKD: [0x110E, 0x1162, 0x11C0] }, +{ source: [0xCC5E], NFC: [0xCC5E], NFD: [0x110E, 0x1162, 0x11C1], NFKC: [0xCC5E], NFKD: [0x110E, 0x1162, 0x11C1] }, +{ source: [0xCC5F], NFC: [0xCC5F], NFD: [0x110E, 0x1162, 0x11C2], NFKC: [0xCC5F], NFKD: [0x110E, 0x1162, 0x11C2] }, +{ source: [0xCC60], NFC: [0xCC60], NFD: [0x110E, 0x1163], NFKC: [0xCC60], NFKD: [0x110E, 0x1163] }, +{ source: [0xCC61], NFC: [0xCC61], NFD: [0x110E, 0x1163, 0x11A8], NFKC: [0xCC61], NFKD: [0x110E, 0x1163, 0x11A8] }, +{ source: [0xCC62], NFC: [0xCC62], NFD: [0x110E, 0x1163, 0x11A9], NFKC: [0xCC62], NFKD: [0x110E, 0x1163, 0x11A9] }, +{ source: [0xCC63], NFC: [0xCC63], NFD: [0x110E, 0x1163, 0x11AA], NFKC: [0xCC63], NFKD: [0x110E, 0x1163, 0x11AA] }, +{ source: [0xCC64], NFC: [0xCC64], NFD: [0x110E, 0x1163, 0x11AB], NFKC: [0xCC64], NFKD: [0x110E, 0x1163, 0x11AB] }, +{ source: [0xCC65], NFC: [0xCC65], NFD: [0x110E, 0x1163, 0x11AC], NFKC: [0xCC65], NFKD: [0x110E, 0x1163, 0x11AC] }, +{ source: [0xCC66], NFC: [0xCC66], NFD: [0x110E, 0x1163, 0x11AD], NFKC: [0xCC66], NFKD: [0x110E, 0x1163, 0x11AD] }, +{ source: [0xCC67], NFC: [0xCC67], NFD: [0x110E, 0x1163, 0x11AE], NFKC: [0xCC67], NFKD: [0x110E, 0x1163, 0x11AE] }, +{ source: [0xCC68], NFC: [0xCC68], NFD: [0x110E, 0x1163, 0x11AF], NFKC: [0xCC68], NFKD: [0x110E, 0x1163, 0x11AF] }, +{ source: [0xCC69], NFC: [0xCC69], NFD: [0x110E, 0x1163, 0x11B0], NFKC: [0xCC69], NFKD: [0x110E, 0x1163, 0x11B0] }, +{ source: [0xCC6A], NFC: [0xCC6A], NFD: [0x110E, 0x1163, 0x11B1], NFKC: [0xCC6A], NFKD: [0x110E, 0x1163, 0x11B1] }, +{ source: [0xCC6B], NFC: [0xCC6B], NFD: [0x110E, 0x1163, 0x11B2], NFKC: [0xCC6B], NFKD: [0x110E, 0x1163, 0x11B2] }, +{ source: [0xCC6C], NFC: [0xCC6C], NFD: [0x110E, 0x1163, 0x11B3], NFKC: [0xCC6C], NFKD: [0x110E, 0x1163, 0x11B3] }, +{ source: [0xCC6D], NFC: [0xCC6D], NFD: [0x110E, 0x1163, 0x11B4], NFKC: [0xCC6D], NFKD: [0x110E, 0x1163, 0x11B4] }, +{ source: [0xCC6E], NFC: [0xCC6E], NFD: [0x110E, 0x1163, 0x11B5], NFKC: [0xCC6E], NFKD: [0x110E, 0x1163, 0x11B5] }, +{ source: [0xCC6F], NFC: [0xCC6F], NFD: [0x110E, 0x1163, 0x11B6], NFKC: [0xCC6F], NFKD: [0x110E, 0x1163, 0x11B6] }, +{ source: [0xCC70], NFC: [0xCC70], NFD: [0x110E, 0x1163, 0x11B7], NFKC: [0xCC70], NFKD: [0x110E, 0x1163, 0x11B7] }, +{ source: [0xCC71], NFC: [0xCC71], NFD: [0x110E, 0x1163, 0x11B8], NFKC: [0xCC71], NFKD: [0x110E, 0x1163, 0x11B8] }, +{ source: [0xCC72], NFC: [0xCC72], NFD: [0x110E, 0x1163, 0x11B9], NFKC: [0xCC72], NFKD: [0x110E, 0x1163, 0x11B9] }, +{ source: [0xCC73], NFC: [0xCC73], NFD: [0x110E, 0x1163, 0x11BA], NFKC: [0xCC73], NFKD: [0x110E, 0x1163, 0x11BA] }, +{ source: [0xCC74], NFC: [0xCC74], NFD: [0x110E, 0x1163, 0x11BB], NFKC: [0xCC74], NFKD: [0x110E, 0x1163, 0x11BB] }, +{ source: [0xCC75], NFC: [0xCC75], NFD: [0x110E, 0x1163, 0x11BC], NFKC: [0xCC75], NFKD: [0x110E, 0x1163, 0x11BC] }, +{ source: [0xCC76], NFC: [0xCC76], NFD: [0x110E, 0x1163, 0x11BD], NFKC: [0xCC76], NFKD: [0x110E, 0x1163, 0x11BD] }, +{ source: [0xCC77], NFC: [0xCC77], NFD: [0x110E, 0x1163, 0x11BE], NFKC: [0xCC77], NFKD: [0x110E, 0x1163, 0x11BE] }, +{ source: [0xCC78], NFC: [0xCC78], NFD: [0x110E, 0x1163, 0x11BF], NFKC: [0xCC78], NFKD: [0x110E, 0x1163, 0x11BF] }, +{ source: [0xCC79], NFC: [0xCC79], NFD: [0x110E, 0x1163, 0x11C0], NFKC: [0xCC79], NFKD: [0x110E, 0x1163, 0x11C0] }, +{ source: [0xCC7A], NFC: [0xCC7A], NFD: [0x110E, 0x1163, 0x11C1], NFKC: [0xCC7A], NFKD: [0x110E, 0x1163, 0x11C1] }, +{ source: [0xCC7B], NFC: [0xCC7B], NFD: [0x110E, 0x1163, 0x11C2], NFKC: [0xCC7B], NFKD: [0x110E, 0x1163, 0x11C2] }, +{ source: [0xCC7C], NFC: [0xCC7C], NFD: [0x110E, 0x1164], NFKC: [0xCC7C], NFKD: [0x110E, 0x1164] }, +{ source: [0xCC7D], NFC: [0xCC7D], NFD: [0x110E, 0x1164, 0x11A8], NFKC: [0xCC7D], NFKD: [0x110E, 0x1164, 0x11A8] }, +{ source: [0xCC7E], NFC: [0xCC7E], NFD: [0x110E, 0x1164, 0x11A9], NFKC: [0xCC7E], NFKD: [0x110E, 0x1164, 0x11A9] }, +{ source: [0xCC7F], NFC: [0xCC7F], NFD: [0x110E, 0x1164, 0x11AA], NFKC: [0xCC7F], NFKD: [0x110E, 0x1164, 0x11AA] }, +{ source: [0xCC80], NFC: [0xCC80], NFD: [0x110E, 0x1164, 0x11AB], NFKC: [0xCC80], NFKD: [0x110E, 0x1164, 0x11AB] }, +{ source: [0xCC81], NFC: [0xCC81], NFD: [0x110E, 0x1164, 0x11AC], NFKC: [0xCC81], NFKD: [0x110E, 0x1164, 0x11AC] }, +{ source: [0xCC82], NFC: [0xCC82], NFD: [0x110E, 0x1164, 0x11AD], NFKC: [0xCC82], NFKD: [0x110E, 0x1164, 0x11AD] }, +{ source: [0xCC83], NFC: [0xCC83], NFD: [0x110E, 0x1164, 0x11AE], NFKC: [0xCC83], NFKD: [0x110E, 0x1164, 0x11AE] }, +{ source: [0xCC84], NFC: [0xCC84], NFD: [0x110E, 0x1164, 0x11AF], NFKC: [0xCC84], NFKD: [0x110E, 0x1164, 0x11AF] }, +{ source: [0xCC85], NFC: [0xCC85], NFD: [0x110E, 0x1164, 0x11B0], NFKC: [0xCC85], NFKD: [0x110E, 0x1164, 0x11B0] }, +{ source: [0xCC86], NFC: [0xCC86], NFD: [0x110E, 0x1164, 0x11B1], NFKC: [0xCC86], NFKD: [0x110E, 0x1164, 0x11B1] }, +{ source: [0xCC87], NFC: [0xCC87], NFD: [0x110E, 0x1164, 0x11B2], NFKC: [0xCC87], NFKD: [0x110E, 0x1164, 0x11B2] }, +{ source: [0xCC88], NFC: [0xCC88], NFD: [0x110E, 0x1164, 0x11B3], NFKC: [0xCC88], NFKD: [0x110E, 0x1164, 0x11B3] }, +{ source: [0xCC89], NFC: [0xCC89], NFD: [0x110E, 0x1164, 0x11B4], NFKC: [0xCC89], NFKD: [0x110E, 0x1164, 0x11B4] }, +{ source: [0xCC8A], NFC: [0xCC8A], NFD: [0x110E, 0x1164, 0x11B5], NFKC: [0xCC8A], NFKD: [0x110E, 0x1164, 0x11B5] }, +{ source: [0xCC8B], NFC: [0xCC8B], NFD: [0x110E, 0x1164, 0x11B6], NFKC: [0xCC8B], NFKD: [0x110E, 0x1164, 0x11B6] }, +{ source: [0xCC8C], NFC: [0xCC8C], NFD: [0x110E, 0x1164, 0x11B7], NFKC: [0xCC8C], NFKD: [0x110E, 0x1164, 0x11B7] }, +{ source: [0xCC8D], NFC: [0xCC8D], NFD: [0x110E, 0x1164, 0x11B8], NFKC: [0xCC8D], NFKD: [0x110E, 0x1164, 0x11B8] }, +{ source: [0xCC8E], NFC: [0xCC8E], NFD: [0x110E, 0x1164, 0x11B9], NFKC: [0xCC8E], NFKD: [0x110E, 0x1164, 0x11B9] }, +{ source: [0xCC8F], NFC: [0xCC8F], NFD: [0x110E, 0x1164, 0x11BA], NFKC: [0xCC8F], NFKD: [0x110E, 0x1164, 0x11BA] }, +{ source: [0xCC90], NFC: [0xCC90], NFD: [0x110E, 0x1164, 0x11BB], NFKC: [0xCC90], NFKD: [0x110E, 0x1164, 0x11BB] }, +{ source: [0xCC91], NFC: [0xCC91], NFD: [0x110E, 0x1164, 0x11BC], NFKC: [0xCC91], NFKD: [0x110E, 0x1164, 0x11BC] }, +{ source: [0xCC92], NFC: [0xCC92], NFD: [0x110E, 0x1164, 0x11BD], NFKC: [0xCC92], NFKD: [0x110E, 0x1164, 0x11BD] }, +{ source: [0xCC93], NFC: [0xCC93], NFD: [0x110E, 0x1164, 0x11BE], NFKC: [0xCC93], NFKD: [0x110E, 0x1164, 0x11BE] }, +{ source: [0xCC94], NFC: [0xCC94], NFD: [0x110E, 0x1164, 0x11BF], NFKC: [0xCC94], NFKD: [0x110E, 0x1164, 0x11BF] }, +{ source: [0xCC95], NFC: [0xCC95], NFD: [0x110E, 0x1164, 0x11C0], NFKC: [0xCC95], NFKD: [0x110E, 0x1164, 0x11C0] }, +{ source: [0xCC96], NFC: [0xCC96], NFD: [0x110E, 0x1164, 0x11C1], NFKC: [0xCC96], NFKD: [0x110E, 0x1164, 0x11C1] }, +{ source: [0xCC97], NFC: [0xCC97], NFD: [0x110E, 0x1164, 0x11C2], NFKC: [0xCC97], NFKD: [0x110E, 0x1164, 0x11C2] }, +{ source: [0xCC98], NFC: [0xCC98], NFD: [0x110E, 0x1165], NFKC: [0xCC98], NFKD: [0x110E, 0x1165] }, +{ source: [0xCC99], NFC: [0xCC99], NFD: [0x110E, 0x1165, 0x11A8], NFKC: [0xCC99], NFKD: [0x110E, 0x1165, 0x11A8] }, +{ source: [0xCC9A], NFC: [0xCC9A], NFD: [0x110E, 0x1165, 0x11A9], NFKC: [0xCC9A], NFKD: [0x110E, 0x1165, 0x11A9] }, +{ source: [0xCC9B], NFC: [0xCC9B], NFD: [0x110E, 0x1165, 0x11AA], NFKC: [0xCC9B], NFKD: [0x110E, 0x1165, 0x11AA] }, +{ source: [0xCC9C], NFC: [0xCC9C], NFD: [0x110E, 0x1165, 0x11AB], NFKC: [0xCC9C], NFKD: [0x110E, 0x1165, 0x11AB] }, +{ source: [0xCC9D], NFC: [0xCC9D], NFD: [0x110E, 0x1165, 0x11AC], NFKC: [0xCC9D], NFKD: [0x110E, 0x1165, 0x11AC] }, +{ source: [0xCC9E], NFC: [0xCC9E], NFD: [0x110E, 0x1165, 0x11AD], NFKC: [0xCC9E], NFKD: [0x110E, 0x1165, 0x11AD] }, +{ source: [0xCC9F], NFC: [0xCC9F], NFD: [0x110E, 0x1165, 0x11AE], NFKC: [0xCC9F], NFKD: [0x110E, 0x1165, 0x11AE] }, +{ source: [0xCCA0], NFC: [0xCCA0], NFD: [0x110E, 0x1165, 0x11AF], NFKC: [0xCCA0], NFKD: [0x110E, 0x1165, 0x11AF] }, +{ source: [0xCCA1], NFC: [0xCCA1], NFD: [0x110E, 0x1165, 0x11B0], NFKC: [0xCCA1], NFKD: [0x110E, 0x1165, 0x11B0] }, +{ source: [0xCCA2], NFC: [0xCCA2], NFD: [0x110E, 0x1165, 0x11B1], NFKC: [0xCCA2], NFKD: [0x110E, 0x1165, 0x11B1] }, +{ source: [0xCCA3], NFC: [0xCCA3], NFD: [0x110E, 0x1165, 0x11B2], NFKC: [0xCCA3], NFKD: [0x110E, 0x1165, 0x11B2] }, +{ source: [0xCCA4], NFC: [0xCCA4], NFD: [0x110E, 0x1165, 0x11B3], NFKC: [0xCCA4], NFKD: [0x110E, 0x1165, 0x11B3] }, +{ source: [0xCCA5], NFC: [0xCCA5], NFD: [0x110E, 0x1165, 0x11B4], NFKC: [0xCCA5], NFKD: [0x110E, 0x1165, 0x11B4] }, +{ source: [0xCCA6], NFC: [0xCCA6], NFD: [0x110E, 0x1165, 0x11B5], NFKC: [0xCCA6], NFKD: [0x110E, 0x1165, 0x11B5] }, +{ source: [0xCCA7], NFC: [0xCCA7], NFD: [0x110E, 0x1165, 0x11B6], NFKC: [0xCCA7], NFKD: [0x110E, 0x1165, 0x11B6] }, +{ source: [0xCCA8], NFC: [0xCCA8], NFD: [0x110E, 0x1165, 0x11B7], NFKC: [0xCCA8], NFKD: [0x110E, 0x1165, 0x11B7] }, +{ source: [0xCCA9], NFC: [0xCCA9], NFD: [0x110E, 0x1165, 0x11B8], NFKC: [0xCCA9], NFKD: [0x110E, 0x1165, 0x11B8] }, +{ source: [0xCCAA], NFC: [0xCCAA], NFD: [0x110E, 0x1165, 0x11B9], NFKC: [0xCCAA], NFKD: [0x110E, 0x1165, 0x11B9] }, +{ source: [0xCCAB], NFC: [0xCCAB], NFD: [0x110E, 0x1165, 0x11BA], NFKC: [0xCCAB], NFKD: [0x110E, 0x1165, 0x11BA] }, +{ source: [0xCCAC], NFC: [0xCCAC], NFD: [0x110E, 0x1165, 0x11BB], NFKC: [0xCCAC], NFKD: [0x110E, 0x1165, 0x11BB] }, +{ source: [0xCCAD], NFC: [0xCCAD], NFD: [0x110E, 0x1165, 0x11BC], NFKC: [0xCCAD], NFKD: [0x110E, 0x1165, 0x11BC] }, +{ source: [0xCCAE], NFC: [0xCCAE], NFD: [0x110E, 0x1165, 0x11BD], NFKC: [0xCCAE], NFKD: [0x110E, 0x1165, 0x11BD] }, +{ source: [0xCCAF], NFC: [0xCCAF], NFD: [0x110E, 0x1165, 0x11BE], NFKC: [0xCCAF], NFKD: [0x110E, 0x1165, 0x11BE] }, +{ source: [0xCCB0], NFC: [0xCCB0], NFD: [0x110E, 0x1165, 0x11BF], NFKC: [0xCCB0], NFKD: [0x110E, 0x1165, 0x11BF] }, +{ source: [0xCCB1], NFC: [0xCCB1], NFD: [0x110E, 0x1165, 0x11C0], NFKC: [0xCCB1], NFKD: [0x110E, 0x1165, 0x11C0] }, +{ source: [0xCCB2], NFC: [0xCCB2], NFD: [0x110E, 0x1165, 0x11C1], NFKC: [0xCCB2], NFKD: [0x110E, 0x1165, 0x11C1] }, +{ source: [0xCCB3], NFC: [0xCCB3], NFD: [0x110E, 0x1165, 0x11C2], NFKC: [0xCCB3], NFKD: [0x110E, 0x1165, 0x11C2] }, +{ source: [0xCCB4], NFC: [0xCCB4], NFD: [0x110E, 0x1166], NFKC: [0xCCB4], NFKD: [0x110E, 0x1166] }, +{ source: [0xCCB5], NFC: [0xCCB5], NFD: [0x110E, 0x1166, 0x11A8], NFKC: [0xCCB5], NFKD: [0x110E, 0x1166, 0x11A8] }, +{ source: [0xCCB6], NFC: [0xCCB6], NFD: [0x110E, 0x1166, 0x11A9], NFKC: [0xCCB6], NFKD: [0x110E, 0x1166, 0x11A9] }, +{ source: [0xCCB7], NFC: [0xCCB7], NFD: [0x110E, 0x1166, 0x11AA], NFKC: [0xCCB7], NFKD: [0x110E, 0x1166, 0x11AA] }, +{ source: [0xCCB8], NFC: [0xCCB8], NFD: [0x110E, 0x1166, 0x11AB], NFKC: [0xCCB8], NFKD: [0x110E, 0x1166, 0x11AB] }, +{ source: [0xCCB9], NFC: [0xCCB9], NFD: [0x110E, 0x1166, 0x11AC], NFKC: [0xCCB9], NFKD: [0x110E, 0x1166, 0x11AC] }, +{ source: [0xCCBA], NFC: [0xCCBA], NFD: [0x110E, 0x1166, 0x11AD], NFKC: [0xCCBA], NFKD: [0x110E, 0x1166, 0x11AD] }, +{ source: [0xCCBB], NFC: [0xCCBB], NFD: [0x110E, 0x1166, 0x11AE], NFKC: [0xCCBB], NFKD: [0x110E, 0x1166, 0x11AE] }, +{ source: [0xCCBC], NFC: [0xCCBC], NFD: [0x110E, 0x1166, 0x11AF], NFKC: [0xCCBC], NFKD: [0x110E, 0x1166, 0x11AF] }, +{ source: [0xCCBD], NFC: [0xCCBD], NFD: [0x110E, 0x1166, 0x11B0], NFKC: [0xCCBD], NFKD: [0x110E, 0x1166, 0x11B0] }, +{ source: [0xCCBE], NFC: [0xCCBE], NFD: [0x110E, 0x1166, 0x11B1], NFKC: [0xCCBE], NFKD: [0x110E, 0x1166, 0x11B1] }, +{ source: [0xCCBF], NFC: [0xCCBF], NFD: [0x110E, 0x1166, 0x11B2], NFKC: [0xCCBF], NFKD: [0x110E, 0x1166, 0x11B2] }, +{ source: [0xCCC0], NFC: [0xCCC0], NFD: [0x110E, 0x1166, 0x11B3], NFKC: [0xCCC0], NFKD: [0x110E, 0x1166, 0x11B3] }, +{ source: [0xCCC1], NFC: [0xCCC1], NFD: [0x110E, 0x1166, 0x11B4], NFKC: [0xCCC1], NFKD: [0x110E, 0x1166, 0x11B4] }, +{ source: [0xCCC2], NFC: [0xCCC2], NFD: [0x110E, 0x1166, 0x11B5], NFKC: [0xCCC2], NFKD: [0x110E, 0x1166, 0x11B5] }, +{ source: [0xCCC3], NFC: [0xCCC3], NFD: [0x110E, 0x1166, 0x11B6], NFKC: [0xCCC3], NFKD: [0x110E, 0x1166, 0x11B6] }, +{ source: [0xCCC4], NFC: [0xCCC4], NFD: [0x110E, 0x1166, 0x11B7], NFKC: [0xCCC4], NFKD: [0x110E, 0x1166, 0x11B7] }, +{ source: [0xCCC5], NFC: [0xCCC5], NFD: [0x110E, 0x1166, 0x11B8], NFKC: [0xCCC5], NFKD: [0x110E, 0x1166, 0x11B8] }, +{ source: [0xCCC6], NFC: [0xCCC6], NFD: [0x110E, 0x1166, 0x11B9], NFKC: [0xCCC6], NFKD: [0x110E, 0x1166, 0x11B9] }, +{ source: [0xCCC7], NFC: [0xCCC7], NFD: [0x110E, 0x1166, 0x11BA], NFKC: [0xCCC7], NFKD: [0x110E, 0x1166, 0x11BA] }, +{ source: [0xCCC8], NFC: [0xCCC8], NFD: [0x110E, 0x1166, 0x11BB], NFKC: [0xCCC8], NFKD: [0x110E, 0x1166, 0x11BB] }, +{ source: [0xCCC9], NFC: [0xCCC9], NFD: [0x110E, 0x1166, 0x11BC], NFKC: [0xCCC9], NFKD: [0x110E, 0x1166, 0x11BC] }, +{ source: [0xCCCA], NFC: [0xCCCA], NFD: [0x110E, 0x1166, 0x11BD], NFKC: [0xCCCA], NFKD: [0x110E, 0x1166, 0x11BD] }, +{ source: [0xCCCB], NFC: [0xCCCB], NFD: [0x110E, 0x1166, 0x11BE], NFKC: [0xCCCB], NFKD: [0x110E, 0x1166, 0x11BE] }, +{ source: [0xCCCC], NFC: [0xCCCC], NFD: [0x110E, 0x1166, 0x11BF], NFKC: [0xCCCC], NFKD: [0x110E, 0x1166, 0x11BF] }, +{ source: [0xCCCD], NFC: [0xCCCD], NFD: [0x110E, 0x1166, 0x11C0], NFKC: [0xCCCD], NFKD: [0x110E, 0x1166, 0x11C0] }, +{ source: [0xCCCE], NFC: [0xCCCE], NFD: [0x110E, 0x1166, 0x11C1], NFKC: [0xCCCE], NFKD: [0x110E, 0x1166, 0x11C1] }, +{ source: [0xCCCF], NFC: [0xCCCF], NFD: [0x110E, 0x1166, 0x11C2], NFKC: [0xCCCF], NFKD: [0x110E, 0x1166, 0x11C2] }, +{ source: [0xCCD0], NFC: [0xCCD0], NFD: [0x110E, 0x1167], NFKC: [0xCCD0], NFKD: [0x110E, 0x1167] }, +{ source: [0xCCD1], NFC: [0xCCD1], NFD: [0x110E, 0x1167, 0x11A8], NFKC: [0xCCD1], NFKD: [0x110E, 0x1167, 0x11A8] }, +{ source: [0xCCD2], NFC: [0xCCD2], NFD: [0x110E, 0x1167, 0x11A9], NFKC: [0xCCD2], NFKD: [0x110E, 0x1167, 0x11A9] }, +{ source: [0xCCD3], NFC: [0xCCD3], NFD: [0x110E, 0x1167, 0x11AA], NFKC: [0xCCD3], NFKD: [0x110E, 0x1167, 0x11AA] }, +{ source: [0xCCD4], NFC: [0xCCD4], NFD: [0x110E, 0x1167, 0x11AB], NFKC: [0xCCD4], NFKD: [0x110E, 0x1167, 0x11AB] }, +{ source: [0xCCD5], NFC: [0xCCD5], NFD: [0x110E, 0x1167, 0x11AC], NFKC: [0xCCD5], NFKD: [0x110E, 0x1167, 0x11AC] }, +{ source: [0xCCD6], NFC: [0xCCD6], NFD: [0x110E, 0x1167, 0x11AD], NFKC: [0xCCD6], NFKD: [0x110E, 0x1167, 0x11AD] }, +{ source: [0xCCD7], NFC: [0xCCD7], NFD: [0x110E, 0x1167, 0x11AE], NFKC: [0xCCD7], NFKD: [0x110E, 0x1167, 0x11AE] }, +{ source: [0xCCD8], NFC: [0xCCD8], NFD: [0x110E, 0x1167, 0x11AF], NFKC: [0xCCD8], NFKD: [0x110E, 0x1167, 0x11AF] }, +{ source: [0xCCD9], NFC: [0xCCD9], NFD: [0x110E, 0x1167, 0x11B0], NFKC: [0xCCD9], NFKD: [0x110E, 0x1167, 0x11B0] }, +{ source: [0xCCDA], NFC: [0xCCDA], NFD: [0x110E, 0x1167, 0x11B1], NFKC: [0xCCDA], NFKD: [0x110E, 0x1167, 0x11B1] }, +{ source: [0xCCDB], NFC: [0xCCDB], NFD: [0x110E, 0x1167, 0x11B2], NFKC: [0xCCDB], NFKD: [0x110E, 0x1167, 0x11B2] }, +{ source: [0xCCDC], NFC: [0xCCDC], NFD: [0x110E, 0x1167, 0x11B3], NFKC: [0xCCDC], NFKD: [0x110E, 0x1167, 0x11B3] }, +{ source: [0xCCDD], NFC: [0xCCDD], NFD: [0x110E, 0x1167, 0x11B4], NFKC: [0xCCDD], NFKD: [0x110E, 0x1167, 0x11B4] }, +{ source: [0xCCDE], NFC: [0xCCDE], NFD: [0x110E, 0x1167, 0x11B5], NFKC: [0xCCDE], NFKD: [0x110E, 0x1167, 0x11B5] }, +{ source: [0xCCDF], NFC: [0xCCDF], NFD: [0x110E, 0x1167, 0x11B6], NFKC: [0xCCDF], NFKD: [0x110E, 0x1167, 0x11B6] }, +{ source: [0xCCE0], NFC: [0xCCE0], NFD: [0x110E, 0x1167, 0x11B7], NFKC: [0xCCE0], NFKD: [0x110E, 0x1167, 0x11B7] }, +{ source: [0xCCE1], NFC: [0xCCE1], NFD: [0x110E, 0x1167, 0x11B8], NFKC: [0xCCE1], NFKD: [0x110E, 0x1167, 0x11B8] }, +{ source: [0xCCE2], NFC: [0xCCE2], NFD: [0x110E, 0x1167, 0x11B9], NFKC: [0xCCE2], NFKD: [0x110E, 0x1167, 0x11B9] }, +{ source: [0xCCE3], NFC: [0xCCE3], NFD: [0x110E, 0x1167, 0x11BA], NFKC: [0xCCE3], NFKD: [0x110E, 0x1167, 0x11BA] }, +{ source: [0xCCE4], NFC: [0xCCE4], NFD: [0x110E, 0x1167, 0x11BB], NFKC: [0xCCE4], NFKD: [0x110E, 0x1167, 0x11BB] }, +{ source: [0xCCE5], NFC: [0xCCE5], NFD: [0x110E, 0x1167, 0x11BC], NFKC: [0xCCE5], NFKD: [0x110E, 0x1167, 0x11BC] }, +{ source: [0xCCE6], NFC: [0xCCE6], NFD: [0x110E, 0x1167, 0x11BD], NFKC: [0xCCE6], NFKD: [0x110E, 0x1167, 0x11BD] }, +{ source: [0xCCE7], NFC: [0xCCE7], NFD: [0x110E, 0x1167, 0x11BE], NFKC: [0xCCE7], NFKD: [0x110E, 0x1167, 0x11BE] }, +{ source: [0xCCE8], NFC: [0xCCE8], NFD: [0x110E, 0x1167, 0x11BF], NFKC: [0xCCE8], NFKD: [0x110E, 0x1167, 0x11BF] }, +{ source: [0xCCE9], NFC: [0xCCE9], NFD: [0x110E, 0x1167, 0x11C0], NFKC: [0xCCE9], NFKD: [0x110E, 0x1167, 0x11C0] }, +{ source: [0xCCEA], NFC: [0xCCEA], NFD: [0x110E, 0x1167, 0x11C1], NFKC: [0xCCEA], NFKD: [0x110E, 0x1167, 0x11C1] }, +{ source: [0xCCEB], NFC: [0xCCEB], NFD: [0x110E, 0x1167, 0x11C2], NFKC: [0xCCEB], NFKD: [0x110E, 0x1167, 0x11C2] }, +{ source: [0xCCEC], NFC: [0xCCEC], NFD: [0x110E, 0x1168], NFKC: [0xCCEC], NFKD: [0x110E, 0x1168] }, +{ source: [0xCCED], NFC: [0xCCED], NFD: [0x110E, 0x1168, 0x11A8], NFKC: [0xCCED], NFKD: [0x110E, 0x1168, 0x11A8] }, +{ source: [0xCCEE], NFC: [0xCCEE], NFD: [0x110E, 0x1168, 0x11A9], NFKC: [0xCCEE], NFKD: [0x110E, 0x1168, 0x11A9] }, +{ source: [0xCCEF], NFC: [0xCCEF], NFD: [0x110E, 0x1168, 0x11AA], NFKC: [0xCCEF], NFKD: [0x110E, 0x1168, 0x11AA] }, +{ source: [0xCCF0], NFC: [0xCCF0], NFD: [0x110E, 0x1168, 0x11AB], NFKC: [0xCCF0], NFKD: [0x110E, 0x1168, 0x11AB] }, +{ source: [0xCCF1], NFC: [0xCCF1], NFD: [0x110E, 0x1168, 0x11AC], NFKC: [0xCCF1], NFKD: [0x110E, 0x1168, 0x11AC] }, +{ source: [0xCCF2], NFC: [0xCCF2], NFD: [0x110E, 0x1168, 0x11AD], NFKC: [0xCCF2], NFKD: [0x110E, 0x1168, 0x11AD] }, +{ source: [0xCCF3], NFC: [0xCCF3], NFD: [0x110E, 0x1168, 0x11AE], NFKC: [0xCCF3], NFKD: [0x110E, 0x1168, 0x11AE] }, +{ source: [0xCCF4], NFC: [0xCCF4], NFD: [0x110E, 0x1168, 0x11AF], NFKC: [0xCCF4], NFKD: [0x110E, 0x1168, 0x11AF] }, +{ source: [0xCCF5], NFC: [0xCCF5], NFD: [0x110E, 0x1168, 0x11B0], NFKC: [0xCCF5], NFKD: [0x110E, 0x1168, 0x11B0] }, +{ source: [0xCCF6], NFC: [0xCCF6], NFD: [0x110E, 0x1168, 0x11B1], NFKC: [0xCCF6], NFKD: [0x110E, 0x1168, 0x11B1] }, +{ source: [0xCCF7], NFC: [0xCCF7], NFD: [0x110E, 0x1168, 0x11B2], NFKC: [0xCCF7], NFKD: [0x110E, 0x1168, 0x11B2] }, +{ source: [0xCCF8], NFC: [0xCCF8], NFD: [0x110E, 0x1168, 0x11B3], NFKC: [0xCCF8], NFKD: [0x110E, 0x1168, 0x11B3] }, +{ source: [0xCCF9], NFC: [0xCCF9], NFD: [0x110E, 0x1168, 0x11B4], NFKC: [0xCCF9], NFKD: [0x110E, 0x1168, 0x11B4] }, +{ source: [0xCCFA], NFC: [0xCCFA], NFD: [0x110E, 0x1168, 0x11B5], NFKC: [0xCCFA], NFKD: [0x110E, 0x1168, 0x11B5] }, +{ source: [0xCCFB], NFC: [0xCCFB], NFD: [0x110E, 0x1168, 0x11B6], NFKC: [0xCCFB], NFKD: [0x110E, 0x1168, 0x11B6] }, +{ source: [0xCCFC], NFC: [0xCCFC], NFD: [0x110E, 0x1168, 0x11B7], NFKC: [0xCCFC], NFKD: [0x110E, 0x1168, 0x11B7] }, +{ source: [0xCCFD], NFC: [0xCCFD], NFD: [0x110E, 0x1168, 0x11B8], NFKC: [0xCCFD], NFKD: [0x110E, 0x1168, 0x11B8] }, +{ source: [0xCCFE], NFC: [0xCCFE], NFD: [0x110E, 0x1168, 0x11B9], NFKC: [0xCCFE], NFKD: [0x110E, 0x1168, 0x11B9] }, +{ source: [0xCCFF], NFC: [0xCCFF], NFD: [0x110E, 0x1168, 0x11BA], NFKC: [0xCCFF], NFKD: [0x110E, 0x1168, 0x11BA] }, +{ source: [0xCD00], NFC: [0xCD00], NFD: [0x110E, 0x1168, 0x11BB], NFKC: [0xCD00], NFKD: [0x110E, 0x1168, 0x11BB] }, +{ source: [0xCD01], NFC: [0xCD01], NFD: [0x110E, 0x1168, 0x11BC], NFKC: [0xCD01], NFKD: [0x110E, 0x1168, 0x11BC] }, +{ source: [0xCD02], NFC: [0xCD02], NFD: [0x110E, 0x1168, 0x11BD], NFKC: [0xCD02], NFKD: [0x110E, 0x1168, 0x11BD] }, +{ source: [0xCD03], NFC: [0xCD03], NFD: [0x110E, 0x1168, 0x11BE], NFKC: [0xCD03], NFKD: [0x110E, 0x1168, 0x11BE] }, +{ source: [0xCD04], NFC: [0xCD04], NFD: [0x110E, 0x1168, 0x11BF], NFKC: [0xCD04], NFKD: [0x110E, 0x1168, 0x11BF] }, +{ source: [0xCD05], NFC: [0xCD05], NFD: [0x110E, 0x1168, 0x11C0], NFKC: [0xCD05], NFKD: [0x110E, 0x1168, 0x11C0] }, +{ source: [0xCD06], NFC: [0xCD06], NFD: [0x110E, 0x1168, 0x11C1], NFKC: [0xCD06], NFKD: [0x110E, 0x1168, 0x11C1] }, +{ source: [0xCD07], NFC: [0xCD07], NFD: [0x110E, 0x1168, 0x11C2], NFKC: [0xCD07], NFKD: [0x110E, 0x1168, 0x11C2] }, +{ source: [0xCD08], NFC: [0xCD08], NFD: [0x110E, 0x1169], NFKC: [0xCD08], NFKD: [0x110E, 0x1169] }, +{ source: [0xCD09], NFC: [0xCD09], NFD: [0x110E, 0x1169, 0x11A8], NFKC: [0xCD09], NFKD: [0x110E, 0x1169, 0x11A8] }, +{ source: [0xCD0A], NFC: [0xCD0A], NFD: [0x110E, 0x1169, 0x11A9], NFKC: [0xCD0A], NFKD: [0x110E, 0x1169, 0x11A9] }, +{ source: [0xCD0B], NFC: [0xCD0B], NFD: [0x110E, 0x1169, 0x11AA], NFKC: [0xCD0B], NFKD: [0x110E, 0x1169, 0x11AA] }, +{ source: [0xCD0C], NFC: [0xCD0C], NFD: [0x110E, 0x1169, 0x11AB], NFKC: [0xCD0C], NFKD: [0x110E, 0x1169, 0x11AB] }, +{ source: [0xCD0D], NFC: [0xCD0D], NFD: [0x110E, 0x1169, 0x11AC], NFKC: [0xCD0D], NFKD: [0x110E, 0x1169, 0x11AC] }, +{ source: [0xCD0E], NFC: [0xCD0E], NFD: [0x110E, 0x1169, 0x11AD], NFKC: [0xCD0E], NFKD: [0x110E, 0x1169, 0x11AD] }, +{ source: [0xCD0F], NFC: [0xCD0F], NFD: [0x110E, 0x1169, 0x11AE], NFKC: [0xCD0F], NFKD: [0x110E, 0x1169, 0x11AE] }, +{ source: [0xCD10], NFC: [0xCD10], NFD: [0x110E, 0x1169, 0x11AF], NFKC: [0xCD10], NFKD: [0x110E, 0x1169, 0x11AF] }, +{ source: [0xCD11], NFC: [0xCD11], NFD: [0x110E, 0x1169, 0x11B0], NFKC: [0xCD11], NFKD: [0x110E, 0x1169, 0x11B0] }, +{ source: [0xCD12], NFC: [0xCD12], NFD: [0x110E, 0x1169, 0x11B1], NFKC: [0xCD12], NFKD: [0x110E, 0x1169, 0x11B1] }, +{ source: [0xCD13], NFC: [0xCD13], NFD: [0x110E, 0x1169, 0x11B2], NFKC: [0xCD13], NFKD: [0x110E, 0x1169, 0x11B2] }, +{ source: [0xCD14], NFC: [0xCD14], NFD: [0x110E, 0x1169, 0x11B3], NFKC: [0xCD14], NFKD: [0x110E, 0x1169, 0x11B3] }, +{ source: [0xCD15], NFC: [0xCD15], NFD: [0x110E, 0x1169, 0x11B4], NFKC: [0xCD15], NFKD: [0x110E, 0x1169, 0x11B4] }, +{ source: [0xCD16], NFC: [0xCD16], NFD: [0x110E, 0x1169, 0x11B5], NFKC: [0xCD16], NFKD: [0x110E, 0x1169, 0x11B5] }, +{ source: [0xCD17], NFC: [0xCD17], NFD: [0x110E, 0x1169, 0x11B6], NFKC: [0xCD17], NFKD: [0x110E, 0x1169, 0x11B6] }, +{ source: [0xCD18], NFC: [0xCD18], NFD: [0x110E, 0x1169, 0x11B7], NFKC: [0xCD18], NFKD: [0x110E, 0x1169, 0x11B7] }, +{ source: [0xCD19], NFC: [0xCD19], NFD: [0x110E, 0x1169, 0x11B8], NFKC: [0xCD19], NFKD: [0x110E, 0x1169, 0x11B8] }, +{ source: [0xCD1A], NFC: [0xCD1A], NFD: [0x110E, 0x1169, 0x11B9], NFKC: [0xCD1A], NFKD: [0x110E, 0x1169, 0x11B9] }, +{ source: [0xCD1B], NFC: [0xCD1B], NFD: [0x110E, 0x1169, 0x11BA], NFKC: [0xCD1B], NFKD: [0x110E, 0x1169, 0x11BA] }, +{ source: [0xCD1C], NFC: [0xCD1C], NFD: [0x110E, 0x1169, 0x11BB], NFKC: [0xCD1C], NFKD: [0x110E, 0x1169, 0x11BB] }, +{ source: [0xCD1D], NFC: [0xCD1D], NFD: [0x110E, 0x1169, 0x11BC], NFKC: [0xCD1D], NFKD: [0x110E, 0x1169, 0x11BC] }, +{ source: [0xCD1E], NFC: [0xCD1E], NFD: [0x110E, 0x1169, 0x11BD], NFKC: [0xCD1E], NFKD: [0x110E, 0x1169, 0x11BD] }, +{ source: [0xCD1F], NFC: [0xCD1F], NFD: [0x110E, 0x1169, 0x11BE], NFKC: [0xCD1F], NFKD: [0x110E, 0x1169, 0x11BE] }, +{ source: [0xCD20], NFC: [0xCD20], NFD: [0x110E, 0x1169, 0x11BF], NFKC: [0xCD20], NFKD: [0x110E, 0x1169, 0x11BF] }, +{ source: [0xCD21], NFC: [0xCD21], NFD: [0x110E, 0x1169, 0x11C0], NFKC: [0xCD21], NFKD: [0x110E, 0x1169, 0x11C0] }, +{ source: [0xCD22], NFC: [0xCD22], NFD: [0x110E, 0x1169, 0x11C1], NFKC: [0xCD22], NFKD: [0x110E, 0x1169, 0x11C1] }, +{ source: [0xCD23], NFC: [0xCD23], NFD: [0x110E, 0x1169, 0x11C2], NFKC: [0xCD23], NFKD: [0x110E, 0x1169, 0x11C2] }, +{ source: [0xCD24], NFC: [0xCD24], NFD: [0x110E, 0x116A], NFKC: [0xCD24], NFKD: [0x110E, 0x116A] }, +{ source: [0xCD25], NFC: [0xCD25], NFD: [0x110E, 0x116A, 0x11A8], NFKC: [0xCD25], NFKD: [0x110E, 0x116A, 0x11A8] }, +{ source: [0xCD26], NFC: [0xCD26], NFD: [0x110E, 0x116A, 0x11A9], NFKC: [0xCD26], NFKD: [0x110E, 0x116A, 0x11A9] }, +{ source: [0xCD27], NFC: [0xCD27], NFD: [0x110E, 0x116A, 0x11AA], NFKC: [0xCD27], NFKD: [0x110E, 0x116A, 0x11AA] }, +{ source: [0xCD28], NFC: [0xCD28], NFD: [0x110E, 0x116A, 0x11AB], NFKC: [0xCD28], NFKD: [0x110E, 0x116A, 0x11AB] }, +{ source: [0xCD29], NFC: [0xCD29], NFD: [0x110E, 0x116A, 0x11AC], NFKC: [0xCD29], NFKD: [0x110E, 0x116A, 0x11AC] }, +{ source: [0xCD2A], NFC: [0xCD2A], NFD: [0x110E, 0x116A, 0x11AD], NFKC: [0xCD2A], NFKD: [0x110E, 0x116A, 0x11AD] }, +{ source: [0xCD2B], NFC: [0xCD2B], NFD: [0x110E, 0x116A, 0x11AE], NFKC: [0xCD2B], NFKD: [0x110E, 0x116A, 0x11AE] }, +{ source: [0xCD2C], NFC: [0xCD2C], NFD: [0x110E, 0x116A, 0x11AF], NFKC: [0xCD2C], NFKD: [0x110E, 0x116A, 0x11AF] }, +{ source: [0xCD2D], NFC: [0xCD2D], NFD: [0x110E, 0x116A, 0x11B0], NFKC: [0xCD2D], NFKD: [0x110E, 0x116A, 0x11B0] }, +{ source: [0xCD2E], NFC: [0xCD2E], NFD: [0x110E, 0x116A, 0x11B1], NFKC: [0xCD2E], NFKD: [0x110E, 0x116A, 0x11B1] }, +{ source: [0xCD2F], NFC: [0xCD2F], NFD: [0x110E, 0x116A, 0x11B2], NFKC: [0xCD2F], NFKD: [0x110E, 0x116A, 0x11B2] }, +{ source: [0xCD30], NFC: [0xCD30], NFD: [0x110E, 0x116A, 0x11B3], NFKC: [0xCD30], NFKD: [0x110E, 0x116A, 0x11B3] }, +{ source: [0xCD31], NFC: [0xCD31], NFD: [0x110E, 0x116A, 0x11B4], NFKC: [0xCD31], NFKD: [0x110E, 0x116A, 0x11B4] }, +{ source: [0xCD32], NFC: [0xCD32], NFD: [0x110E, 0x116A, 0x11B5], NFKC: [0xCD32], NFKD: [0x110E, 0x116A, 0x11B5] }, +{ source: [0xCD33], NFC: [0xCD33], NFD: [0x110E, 0x116A, 0x11B6], NFKC: [0xCD33], NFKD: [0x110E, 0x116A, 0x11B6] }, +{ source: [0xCD34], NFC: [0xCD34], NFD: [0x110E, 0x116A, 0x11B7], NFKC: [0xCD34], NFKD: [0x110E, 0x116A, 0x11B7] }, +{ source: [0xCD35], NFC: [0xCD35], NFD: [0x110E, 0x116A, 0x11B8], NFKC: [0xCD35], NFKD: [0x110E, 0x116A, 0x11B8] }, +{ source: [0xCD36], NFC: [0xCD36], NFD: [0x110E, 0x116A, 0x11B9], NFKC: [0xCD36], NFKD: [0x110E, 0x116A, 0x11B9] }, +{ source: [0xCD37], NFC: [0xCD37], NFD: [0x110E, 0x116A, 0x11BA], NFKC: [0xCD37], NFKD: [0x110E, 0x116A, 0x11BA] }, +{ source: [0xCD38], NFC: [0xCD38], NFD: [0x110E, 0x116A, 0x11BB], NFKC: [0xCD38], NFKD: [0x110E, 0x116A, 0x11BB] }, +{ source: [0xCD39], NFC: [0xCD39], NFD: [0x110E, 0x116A, 0x11BC], NFKC: [0xCD39], NFKD: [0x110E, 0x116A, 0x11BC] }, +{ source: [0xCD3A], NFC: [0xCD3A], NFD: [0x110E, 0x116A, 0x11BD], NFKC: [0xCD3A], NFKD: [0x110E, 0x116A, 0x11BD] }, +{ source: [0xCD3B], NFC: [0xCD3B], NFD: [0x110E, 0x116A, 0x11BE], NFKC: [0xCD3B], NFKD: [0x110E, 0x116A, 0x11BE] }, +{ source: [0xCD3C], NFC: [0xCD3C], NFD: [0x110E, 0x116A, 0x11BF], NFKC: [0xCD3C], NFKD: [0x110E, 0x116A, 0x11BF] }, +{ source: [0xCD3D], NFC: [0xCD3D], NFD: [0x110E, 0x116A, 0x11C0], NFKC: [0xCD3D], NFKD: [0x110E, 0x116A, 0x11C0] }, +{ source: [0xCD3E], NFC: [0xCD3E], NFD: [0x110E, 0x116A, 0x11C1], NFKC: [0xCD3E], NFKD: [0x110E, 0x116A, 0x11C1] }, +{ source: [0xCD3F], NFC: [0xCD3F], NFD: [0x110E, 0x116A, 0x11C2], NFKC: [0xCD3F], NFKD: [0x110E, 0x116A, 0x11C2] }, +{ source: [0xCD40], NFC: [0xCD40], NFD: [0x110E, 0x116B], NFKC: [0xCD40], NFKD: [0x110E, 0x116B] }, +{ source: [0xCD41], NFC: [0xCD41], NFD: [0x110E, 0x116B, 0x11A8], NFKC: [0xCD41], NFKD: [0x110E, 0x116B, 0x11A8] }, +{ source: [0xCD42], NFC: [0xCD42], NFD: [0x110E, 0x116B, 0x11A9], NFKC: [0xCD42], NFKD: [0x110E, 0x116B, 0x11A9] }, +{ source: [0xCD43], NFC: [0xCD43], NFD: [0x110E, 0x116B, 0x11AA], NFKC: [0xCD43], NFKD: [0x110E, 0x116B, 0x11AA] }, +{ source: [0xCD44], NFC: [0xCD44], NFD: [0x110E, 0x116B, 0x11AB], NFKC: [0xCD44], NFKD: [0x110E, 0x116B, 0x11AB] }, +{ source: [0xCD45], NFC: [0xCD45], NFD: [0x110E, 0x116B, 0x11AC], NFKC: [0xCD45], NFKD: [0x110E, 0x116B, 0x11AC] }, +{ source: [0xCD46], NFC: [0xCD46], NFD: [0x110E, 0x116B, 0x11AD], NFKC: [0xCD46], NFKD: [0x110E, 0x116B, 0x11AD] }, +{ source: [0xCD47], NFC: [0xCD47], NFD: [0x110E, 0x116B, 0x11AE], NFKC: [0xCD47], NFKD: [0x110E, 0x116B, 0x11AE] }, +{ source: [0xCD48], NFC: [0xCD48], NFD: [0x110E, 0x116B, 0x11AF], NFKC: [0xCD48], NFKD: [0x110E, 0x116B, 0x11AF] }, +{ source: [0xCD49], NFC: [0xCD49], NFD: [0x110E, 0x116B, 0x11B0], NFKC: [0xCD49], NFKD: [0x110E, 0x116B, 0x11B0] }, +{ source: [0xCD4A], NFC: [0xCD4A], NFD: [0x110E, 0x116B, 0x11B1], NFKC: [0xCD4A], NFKD: [0x110E, 0x116B, 0x11B1] }, +{ source: [0xCD4B], NFC: [0xCD4B], NFD: [0x110E, 0x116B, 0x11B2], NFKC: [0xCD4B], NFKD: [0x110E, 0x116B, 0x11B2] }, +{ source: [0xCD4C], NFC: [0xCD4C], NFD: [0x110E, 0x116B, 0x11B3], NFKC: [0xCD4C], NFKD: [0x110E, 0x116B, 0x11B3] }, +{ source: [0xCD4D], NFC: [0xCD4D], NFD: [0x110E, 0x116B, 0x11B4], NFKC: [0xCD4D], NFKD: [0x110E, 0x116B, 0x11B4] }, +{ source: [0xCD4E], NFC: [0xCD4E], NFD: [0x110E, 0x116B, 0x11B5], NFKC: [0xCD4E], NFKD: [0x110E, 0x116B, 0x11B5] }, +{ source: [0xCD4F], NFC: [0xCD4F], NFD: [0x110E, 0x116B, 0x11B6], NFKC: [0xCD4F], NFKD: [0x110E, 0x116B, 0x11B6] }, +{ source: [0xCD50], NFC: [0xCD50], NFD: [0x110E, 0x116B, 0x11B7], NFKC: [0xCD50], NFKD: [0x110E, 0x116B, 0x11B7] }, +{ source: [0xCD51], NFC: [0xCD51], NFD: [0x110E, 0x116B, 0x11B8], NFKC: [0xCD51], NFKD: [0x110E, 0x116B, 0x11B8] }, +{ source: [0xCD52], NFC: [0xCD52], NFD: [0x110E, 0x116B, 0x11B9], NFKC: [0xCD52], NFKD: [0x110E, 0x116B, 0x11B9] }, +{ source: [0xCD53], NFC: [0xCD53], NFD: [0x110E, 0x116B, 0x11BA], NFKC: [0xCD53], NFKD: [0x110E, 0x116B, 0x11BA] }, +{ source: [0xCD54], NFC: [0xCD54], NFD: [0x110E, 0x116B, 0x11BB], NFKC: [0xCD54], NFKD: [0x110E, 0x116B, 0x11BB] }, +{ source: [0xCD55], NFC: [0xCD55], NFD: [0x110E, 0x116B, 0x11BC], NFKC: [0xCD55], NFKD: [0x110E, 0x116B, 0x11BC] }, +{ source: [0xCD56], NFC: [0xCD56], NFD: [0x110E, 0x116B, 0x11BD], NFKC: [0xCD56], NFKD: [0x110E, 0x116B, 0x11BD] }, +{ source: [0xCD57], NFC: [0xCD57], NFD: [0x110E, 0x116B, 0x11BE], NFKC: [0xCD57], NFKD: [0x110E, 0x116B, 0x11BE] }, +{ source: [0xCD58], NFC: [0xCD58], NFD: [0x110E, 0x116B, 0x11BF], NFKC: [0xCD58], NFKD: [0x110E, 0x116B, 0x11BF] }, +{ source: [0xCD59], NFC: [0xCD59], NFD: [0x110E, 0x116B, 0x11C0], NFKC: [0xCD59], NFKD: [0x110E, 0x116B, 0x11C0] }, +{ source: [0xCD5A], NFC: [0xCD5A], NFD: [0x110E, 0x116B, 0x11C1], NFKC: [0xCD5A], NFKD: [0x110E, 0x116B, 0x11C1] }, +{ source: [0xCD5B], NFC: [0xCD5B], NFD: [0x110E, 0x116B, 0x11C2], NFKC: [0xCD5B], NFKD: [0x110E, 0x116B, 0x11C2] }, +{ source: [0xCD5C], NFC: [0xCD5C], NFD: [0x110E, 0x116C], NFKC: [0xCD5C], NFKD: [0x110E, 0x116C] }, +{ source: [0xCD5D], NFC: [0xCD5D], NFD: [0x110E, 0x116C, 0x11A8], NFKC: [0xCD5D], NFKD: [0x110E, 0x116C, 0x11A8] }, +{ source: [0xCD5E], NFC: [0xCD5E], NFD: [0x110E, 0x116C, 0x11A9], NFKC: [0xCD5E], NFKD: [0x110E, 0x116C, 0x11A9] }, +{ source: [0xCD5F], NFC: [0xCD5F], NFD: [0x110E, 0x116C, 0x11AA], NFKC: [0xCD5F], NFKD: [0x110E, 0x116C, 0x11AA] }, +{ source: [0xCD60], NFC: [0xCD60], NFD: [0x110E, 0x116C, 0x11AB], NFKC: [0xCD60], NFKD: [0x110E, 0x116C, 0x11AB] }, +{ source: [0xCD61], NFC: [0xCD61], NFD: [0x110E, 0x116C, 0x11AC], NFKC: [0xCD61], NFKD: [0x110E, 0x116C, 0x11AC] }, +{ source: [0xCD62], NFC: [0xCD62], NFD: [0x110E, 0x116C, 0x11AD], NFKC: [0xCD62], NFKD: [0x110E, 0x116C, 0x11AD] }, +{ source: [0xCD63], NFC: [0xCD63], NFD: [0x110E, 0x116C, 0x11AE], NFKC: [0xCD63], NFKD: [0x110E, 0x116C, 0x11AE] }, +{ source: [0xCD64], NFC: [0xCD64], NFD: [0x110E, 0x116C, 0x11AF], NFKC: [0xCD64], NFKD: [0x110E, 0x116C, 0x11AF] }, +{ source: [0xCD65], NFC: [0xCD65], NFD: [0x110E, 0x116C, 0x11B0], NFKC: [0xCD65], NFKD: [0x110E, 0x116C, 0x11B0] }, +{ source: [0xCD66], NFC: [0xCD66], NFD: [0x110E, 0x116C, 0x11B1], NFKC: [0xCD66], NFKD: [0x110E, 0x116C, 0x11B1] }, +{ source: [0xCD67], NFC: [0xCD67], NFD: [0x110E, 0x116C, 0x11B2], NFKC: [0xCD67], NFKD: [0x110E, 0x116C, 0x11B2] }, +{ source: [0xCD68], NFC: [0xCD68], NFD: [0x110E, 0x116C, 0x11B3], NFKC: [0xCD68], NFKD: [0x110E, 0x116C, 0x11B3] }, +{ source: [0xCD69], NFC: [0xCD69], NFD: [0x110E, 0x116C, 0x11B4], NFKC: [0xCD69], NFKD: [0x110E, 0x116C, 0x11B4] }, +{ source: [0xCD6A], NFC: [0xCD6A], NFD: [0x110E, 0x116C, 0x11B5], NFKC: [0xCD6A], NFKD: [0x110E, 0x116C, 0x11B5] }, +{ source: [0xCD6B], NFC: [0xCD6B], NFD: [0x110E, 0x116C, 0x11B6], NFKC: [0xCD6B], NFKD: [0x110E, 0x116C, 0x11B6] }, +{ source: [0xCD6C], NFC: [0xCD6C], NFD: [0x110E, 0x116C, 0x11B7], NFKC: [0xCD6C], NFKD: [0x110E, 0x116C, 0x11B7] }, +{ source: [0xCD6D], NFC: [0xCD6D], NFD: [0x110E, 0x116C, 0x11B8], NFKC: [0xCD6D], NFKD: [0x110E, 0x116C, 0x11B8] }, +{ source: [0xCD6E], NFC: [0xCD6E], NFD: [0x110E, 0x116C, 0x11B9], NFKC: [0xCD6E], NFKD: [0x110E, 0x116C, 0x11B9] }, +{ source: [0xCD6F], NFC: [0xCD6F], NFD: [0x110E, 0x116C, 0x11BA], NFKC: [0xCD6F], NFKD: [0x110E, 0x116C, 0x11BA] }, +{ source: [0xCD70], NFC: [0xCD70], NFD: [0x110E, 0x116C, 0x11BB], NFKC: [0xCD70], NFKD: [0x110E, 0x116C, 0x11BB] }, +{ source: [0xCD71], NFC: [0xCD71], NFD: [0x110E, 0x116C, 0x11BC], NFKC: [0xCD71], NFKD: [0x110E, 0x116C, 0x11BC] }, +{ source: [0xCD72], NFC: [0xCD72], NFD: [0x110E, 0x116C, 0x11BD], NFKC: [0xCD72], NFKD: [0x110E, 0x116C, 0x11BD] }, +{ source: [0xCD73], NFC: [0xCD73], NFD: [0x110E, 0x116C, 0x11BE], NFKC: [0xCD73], NFKD: [0x110E, 0x116C, 0x11BE] }, +{ source: [0xCD74], NFC: [0xCD74], NFD: [0x110E, 0x116C, 0x11BF], NFKC: [0xCD74], NFKD: [0x110E, 0x116C, 0x11BF] }, +{ source: [0xCD75], NFC: [0xCD75], NFD: [0x110E, 0x116C, 0x11C0], NFKC: [0xCD75], NFKD: [0x110E, 0x116C, 0x11C0] }, +{ source: [0xCD76], NFC: [0xCD76], NFD: [0x110E, 0x116C, 0x11C1], NFKC: [0xCD76], NFKD: [0x110E, 0x116C, 0x11C1] }, +{ source: [0xCD77], NFC: [0xCD77], NFD: [0x110E, 0x116C, 0x11C2], NFKC: [0xCD77], NFKD: [0x110E, 0x116C, 0x11C2] }, +{ source: [0xCD78], NFC: [0xCD78], NFD: [0x110E, 0x116D], NFKC: [0xCD78], NFKD: [0x110E, 0x116D] }, +{ source: [0xCD79], NFC: [0xCD79], NFD: [0x110E, 0x116D, 0x11A8], NFKC: [0xCD79], NFKD: [0x110E, 0x116D, 0x11A8] }, +{ source: [0xCD7A], NFC: [0xCD7A], NFD: [0x110E, 0x116D, 0x11A9], NFKC: [0xCD7A], NFKD: [0x110E, 0x116D, 0x11A9] }, +{ source: [0xCD7B], NFC: [0xCD7B], NFD: [0x110E, 0x116D, 0x11AA], NFKC: [0xCD7B], NFKD: [0x110E, 0x116D, 0x11AA] }, +{ source: [0xCD7C], NFC: [0xCD7C], NFD: [0x110E, 0x116D, 0x11AB], NFKC: [0xCD7C], NFKD: [0x110E, 0x116D, 0x11AB] }, +{ source: [0xCD7D], NFC: [0xCD7D], NFD: [0x110E, 0x116D, 0x11AC], NFKC: [0xCD7D], NFKD: [0x110E, 0x116D, 0x11AC] }, +{ source: [0xCD7E], NFC: [0xCD7E], NFD: [0x110E, 0x116D, 0x11AD], NFKC: [0xCD7E], NFKD: [0x110E, 0x116D, 0x11AD] }, +{ source: [0xCD7F], NFC: [0xCD7F], NFD: [0x110E, 0x116D, 0x11AE], NFKC: [0xCD7F], NFKD: [0x110E, 0x116D, 0x11AE] }, +{ source: [0xCD80], NFC: [0xCD80], NFD: [0x110E, 0x116D, 0x11AF], NFKC: [0xCD80], NFKD: [0x110E, 0x116D, 0x11AF] }, +{ source: [0xCD81], NFC: [0xCD81], NFD: [0x110E, 0x116D, 0x11B0], NFKC: [0xCD81], NFKD: [0x110E, 0x116D, 0x11B0] }, +{ source: [0xCD82], NFC: [0xCD82], NFD: [0x110E, 0x116D, 0x11B1], NFKC: [0xCD82], NFKD: [0x110E, 0x116D, 0x11B1] }, +{ source: [0xCD83], NFC: [0xCD83], NFD: [0x110E, 0x116D, 0x11B2], NFKC: [0xCD83], NFKD: [0x110E, 0x116D, 0x11B2] }, +{ source: [0xCD84], NFC: [0xCD84], NFD: [0x110E, 0x116D, 0x11B3], NFKC: [0xCD84], NFKD: [0x110E, 0x116D, 0x11B3] }, +{ source: [0xCD85], NFC: [0xCD85], NFD: [0x110E, 0x116D, 0x11B4], NFKC: [0xCD85], NFKD: [0x110E, 0x116D, 0x11B4] }, +{ source: [0xCD86], NFC: [0xCD86], NFD: [0x110E, 0x116D, 0x11B5], NFKC: [0xCD86], NFKD: [0x110E, 0x116D, 0x11B5] }, +{ source: [0xCD87], NFC: [0xCD87], NFD: [0x110E, 0x116D, 0x11B6], NFKC: [0xCD87], NFKD: [0x110E, 0x116D, 0x11B6] }, +{ source: [0xCD88], NFC: [0xCD88], NFD: [0x110E, 0x116D, 0x11B7], NFKC: [0xCD88], NFKD: [0x110E, 0x116D, 0x11B7] }, +{ source: [0xCD89], NFC: [0xCD89], NFD: [0x110E, 0x116D, 0x11B8], NFKC: [0xCD89], NFKD: [0x110E, 0x116D, 0x11B8] }, +{ source: [0xCD8A], NFC: [0xCD8A], NFD: [0x110E, 0x116D, 0x11B9], NFKC: [0xCD8A], NFKD: [0x110E, 0x116D, 0x11B9] }, +{ source: [0xCD8B], NFC: [0xCD8B], NFD: [0x110E, 0x116D, 0x11BA], NFKC: [0xCD8B], NFKD: [0x110E, 0x116D, 0x11BA] }, +{ source: [0xCD8C], NFC: [0xCD8C], NFD: [0x110E, 0x116D, 0x11BB], NFKC: [0xCD8C], NFKD: [0x110E, 0x116D, 0x11BB] }, +{ source: [0xCD8D], NFC: [0xCD8D], NFD: [0x110E, 0x116D, 0x11BC], NFKC: [0xCD8D], NFKD: [0x110E, 0x116D, 0x11BC] }, +{ source: [0xCD8E], NFC: [0xCD8E], NFD: [0x110E, 0x116D, 0x11BD], NFKC: [0xCD8E], NFKD: [0x110E, 0x116D, 0x11BD] }, +{ source: [0xCD8F], NFC: [0xCD8F], NFD: [0x110E, 0x116D, 0x11BE], NFKC: [0xCD8F], NFKD: [0x110E, 0x116D, 0x11BE] }, +{ source: [0xCD90], NFC: [0xCD90], NFD: [0x110E, 0x116D, 0x11BF], NFKC: [0xCD90], NFKD: [0x110E, 0x116D, 0x11BF] }, +{ source: [0xCD91], NFC: [0xCD91], NFD: [0x110E, 0x116D, 0x11C0], NFKC: [0xCD91], NFKD: [0x110E, 0x116D, 0x11C0] }, +{ source: [0xCD92], NFC: [0xCD92], NFD: [0x110E, 0x116D, 0x11C1], NFKC: [0xCD92], NFKD: [0x110E, 0x116D, 0x11C1] }, +{ source: [0xCD93], NFC: [0xCD93], NFD: [0x110E, 0x116D, 0x11C2], NFKC: [0xCD93], NFKD: [0x110E, 0x116D, 0x11C2] }, +{ source: [0xCD94], NFC: [0xCD94], NFD: [0x110E, 0x116E], NFKC: [0xCD94], NFKD: [0x110E, 0x116E] }, +{ source: [0xCD95], NFC: [0xCD95], NFD: [0x110E, 0x116E, 0x11A8], NFKC: [0xCD95], NFKD: [0x110E, 0x116E, 0x11A8] }, +{ source: [0xCD96], NFC: [0xCD96], NFD: [0x110E, 0x116E, 0x11A9], NFKC: [0xCD96], NFKD: [0x110E, 0x116E, 0x11A9] }, +{ source: [0xCD97], NFC: [0xCD97], NFD: [0x110E, 0x116E, 0x11AA], NFKC: [0xCD97], NFKD: [0x110E, 0x116E, 0x11AA] }, +{ source: [0xCD98], NFC: [0xCD98], NFD: [0x110E, 0x116E, 0x11AB], NFKC: [0xCD98], NFKD: [0x110E, 0x116E, 0x11AB] }, +{ source: [0xCD99], NFC: [0xCD99], NFD: [0x110E, 0x116E, 0x11AC], NFKC: [0xCD99], NFKD: [0x110E, 0x116E, 0x11AC] }, +{ source: [0xCD9A], NFC: [0xCD9A], NFD: [0x110E, 0x116E, 0x11AD], NFKC: [0xCD9A], NFKD: [0x110E, 0x116E, 0x11AD] }, +{ source: [0xCD9B], NFC: [0xCD9B], NFD: [0x110E, 0x116E, 0x11AE], NFKC: [0xCD9B], NFKD: [0x110E, 0x116E, 0x11AE] }, +{ source: [0xCD9C], NFC: [0xCD9C], NFD: [0x110E, 0x116E, 0x11AF], NFKC: [0xCD9C], NFKD: [0x110E, 0x116E, 0x11AF] }, +{ source: [0xCD9D], NFC: [0xCD9D], NFD: [0x110E, 0x116E, 0x11B0], NFKC: [0xCD9D], NFKD: [0x110E, 0x116E, 0x11B0] }, +{ source: [0xCD9E], NFC: [0xCD9E], NFD: [0x110E, 0x116E, 0x11B1], NFKC: [0xCD9E], NFKD: [0x110E, 0x116E, 0x11B1] }, +{ source: [0xCD9F], NFC: [0xCD9F], NFD: [0x110E, 0x116E, 0x11B2], NFKC: [0xCD9F], NFKD: [0x110E, 0x116E, 0x11B2] }, +{ source: [0xCDA0], NFC: [0xCDA0], NFD: [0x110E, 0x116E, 0x11B3], NFKC: [0xCDA0], NFKD: [0x110E, 0x116E, 0x11B3] }, +{ source: [0xCDA1], NFC: [0xCDA1], NFD: [0x110E, 0x116E, 0x11B4], NFKC: [0xCDA1], NFKD: [0x110E, 0x116E, 0x11B4] }, +{ source: [0xCDA2], NFC: [0xCDA2], NFD: [0x110E, 0x116E, 0x11B5], NFKC: [0xCDA2], NFKD: [0x110E, 0x116E, 0x11B5] }, +{ source: [0xCDA3], NFC: [0xCDA3], NFD: [0x110E, 0x116E, 0x11B6], NFKC: [0xCDA3], NFKD: [0x110E, 0x116E, 0x11B6] }, +{ source: [0xCDA4], NFC: [0xCDA4], NFD: [0x110E, 0x116E, 0x11B7], NFKC: [0xCDA4], NFKD: [0x110E, 0x116E, 0x11B7] }, +{ source: [0xCDA5], NFC: [0xCDA5], NFD: [0x110E, 0x116E, 0x11B8], NFKC: [0xCDA5], NFKD: [0x110E, 0x116E, 0x11B8] }, +{ source: [0xCDA6], NFC: [0xCDA6], NFD: [0x110E, 0x116E, 0x11B9], NFKC: [0xCDA6], NFKD: [0x110E, 0x116E, 0x11B9] }, +{ source: [0xCDA7], NFC: [0xCDA7], NFD: [0x110E, 0x116E, 0x11BA], NFKC: [0xCDA7], NFKD: [0x110E, 0x116E, 0x11BA] }, +{ source: [0xCDA8], NFC: [0xCDA8], NFD: [0x110E, 0x116E, 0x11BB], NFKC: [0xCDA8], NFKD: [0x110E, 0x116E, 0x11BB] }, +{ source: [0xCDA9], NFC: [0xCDA9], NFD: [0x110E, 0x116E, 0x11BC], NFKC: [0xCDA9], NFKD: [0x110E, 0x116E, 0x11BC] }, +{ source: [0xCDAA], NFC: [0xCDAA], NFD: [0x110E, 0x116E, 0x11BD], NFKC: [0xCDAA], NFKD: [0x110E, 0x116E, 0x11BD] }, +{ source: [0xCDAB], NFC: [0xCDAB], NFD: [0x110E, 0x116E, 0x11BE], NFKC: [0xCDAB], NFKD: [0x110E, 0x116E, 0x11BE] }, +{ source: [0xCDAC], NFC: [0xCDAC], NFD: [0x110E, 0x116E, 0x11BF], NFKC: [0xCDAC], NFKD: [0x110E, 0x116E, 0x11BF] }, +{ source: [0xCDAD], NFC: [0xCDAD], NFD: [0x110E, 0x116E, 0x11C0], NFKC: [0xCDAD], NFKD: [0x110E, 0x116E, 0x11C0] }, +{ source: [0xCDAE], NFC: [0xCDAE], NFD: [0x110E, 0x116E, 0x11C1], NFKC: [0xCDAE], NFKD: [0x110E, 0x116E, 0x11C1] }, +{ source: [0xCDAF], NFC: [0xCDAF], NFD: [0x110E, 0x116E, 0x11C2], NFKC: [0xCDAF], NFKD: [0x110E, 0x116E, 0x11C2] }, +{ source: [0xCDB0], NFC: [0xCDB0], NFD: [0x110E, 0x116F], NFKC: [0xCDB0], NFKD: [0x110E, 0x116F] }, +{ source: [0xCDB1], NFC: [0xCDB1], NFD: [0x110E, 0x116F, 0x11A8], NFKC: [0xCDB1], NFKD: [0x110E, 0x116F, 0x11A8] }, +{ source: [0xCDB2], NFC: [0xCDB2], NFD: [0x110E, 0x116F, 0x11A9], NFKC: [0xCDB2], NFKD: [0x110E, 0x116F, 0x11A9] }, +{ source: [0xCDB3], NFC: [0xCDB3], NFD: [0x110E, 0x116F, 0x11AA], NFKC: [0xCDB3], NFKD: [0x110E, 0x116F, 0x11AA] }, +{ source: [0xCDB4], NFC: [0xCDB4], NFD: [0x110E, 0x116F, 0x11AB], NFKC: [0xCDB4], NFKD: [0x110E, 0x116F, 0x11AB] }, +{ source: [0xCDB5], NFC: [0xCDB5], NFD: [0x110E, 0x116F, 0x11AC], NFKC: [0xCDB5], NFKD: [0x110E, 0x116F, 0x11AC] }, +{ source: [0xCDB6], NFC: [0xCDB6], NFD: [0x110E, 0x116F, 0x11AD], NFKC: [0xCDB6], NFKD: [0x110E, 0x116F, 0x11AD] }, +{ source: [0xCDB7], NFC: [0xCDB7], NFD: [0x110E, 0x116F, 0x11AE], NFKC: [0xCDB7], NFKD: [0x110E, 0x116F, 0x11AE] }, +{ source: [0xCDB8], NFC: [0xCDB8], NFD: [0x110E, 0x116F, 0x11AF], NFKC: [0xCDB8], NFKD: [0x110E, 0x116F, 0x11AF] }, +{ source: [0xCDB9], NFC: [0xCDB9], NFD: [0x110E, 0x116F, 0x11B0], NFKC: [0xCDB9], NFKD: [0x110E, 0x116F, 0x11B0] }, +{ source: [0xCDBA], NFC: [0xCDBA], NFD: [0x110E, 0x116F, 0x11B1], NFKC: [0xCDBA], NFKD: [0x110E, 0x116F, 0x11B1] }, +{ source: [0xCDBB], NFC: [0xCDBB], NFD: [0x110E, 0x116F, 0x11B2], NFKC: [0xCDBB], NFKD: [0x110E, 0x116F, 0x11B2] }, +{ source: [0xCDBC], NFC: [0xCDBC], NFD: [0x110E, 0x116F, 0x11B3], NFKC: [0xCDBC], NFKD: [0x110E, 0x116F, 0x11B3] }, +{ source: [0xCDBD], NFC: [0xCDBD], NFD: [0x110E, 0x116F, 0x11B4], NFKC: [0xCDBD], NFKD: [0x110E, 0x116F, 0x11B4] }, +{ source: [0xCDBE], NFC: [0xCDBE], NFD: [0x110E, 0x116F, 0x11B5], NFKC: [0xCDBE], NFKD: [0x110E, 0x116F, 0x11B5] }, +{ source: [0xCDBF], NFC: [0xCDBF], NFD: [0x110E, 0x116F, 0x11B6], NFKC: [0xCDBF], NFKD: [0x110E, 0x116F, 0x11B6] }, +{ source: [0xCDC0], NFC: [0xCDC0], NFD: [0x110E, 0x116F, 0x11B7], NFKC: [0xCDC0], NFKD: [0x110E, 0x116F, 0x11B7] }, +{ source: [0xCDC1], NFC: [0xCDC1], NFD: [0x110E, 0x116F, 0x11B8], NFKC: [0xCDC1], NFKD: [0x110E, 0x116F, 0x11B8] }, +{ source: [0xCDC2], NFC: [0xCDC2], NFD: [0x110E, 0x116F, 0x11B9], NFKC: [0xCDC2], NFKD: [0x110E, 0x116F, 0x11B9] }, +{ source: [0xCDC3], NFC: [0xCDC3], NFD: [0x110E, 0x116F, 0x11BA], NFKC: [0xCDC3], NFKD: [0x110E, 0x116F, 0x11BA] }, +{ source: [0xCDC4], NFC: [0xCDC4], NFD: [0x110E, 0x116F, 0x11BB], NFKC: [0xCDC4], NFKD: [0x110E, 0x116F, 0x11BB] }, +{ source: [0xCDC5], NFC: [0xCDC5], NFD: [0x110E, 0x116F, 0x11BC], NFKC: [0xCDC5], NFKD: [0x110E, 0x116F, 0x11BC] }, +{ source: [0xCDC6], NFC: [0xCDC6], NFD: [0x110E, 0x116F, 0x11BD], NFKC: [0xCDC6], NFKD: [0x110E, 0x116F, 0x11BD] }, +{ source: [0xCDC7], NFC: [0xCDC7], NFD: [0x110E, 0x116F, 0x11BE], NFKC: [0xCDC7], NFKD: [0x110E, 0x116F, 0x11BE] }, +{ source: [0xCDC8], NFC: [0xCDC8], NFD: [0x110E, 0x116F, 0x11BF], NFKC: [0xCDC8], NFKD: [0x110E, 0x116F, 0x11BF] }, +{ source: [0xCDC9], NFC: [0xCDC9], NFD: [0x110E, 0x116F, 0x11C0], NFKC: [0xCDC9], NFKD: [0x110E, 0x116F, 0x11C0] }, +{ source: [0xCDCA], NFC: [0xCDCA], NFD: [0x110E, 0x116F, 0x11C1], NFKC: [0xCDCA], NFKD: [0x110E, 0x116F, 0x11C1] }, +{ source: [0xCDCB], NFC: [0xCDCB], NFD: [0x110E, 0x116F, 0x11C2], NFKC: [0xCDCB], NFKD: [0x110E, 0x116F, 0x11C2] }, +{ source: [0xCDCC], NFC: [0xCDCC], NFD: [0x110E, 0x1170], NFKC: [0xCDCC], NFKD: [0x110E, 0x1170] }, +{ source: [0xCDCD], NFC: [0xCDCD], NFD: [0x110E, 0x1170, 0x11A8], NFKC: [0xCDCD], NFKD: [0x110E, 0x1170, 0x11A8] }, +{ source: [0xCDCE], NFC: [0xCDCE], NFD: [0x110E, 0x1170, 0x11A9], NFKC: [0xCDCE], NFKD: [0x110E, 0x1170, 0x11A9] }, +{ source: [0xCDCF], NFC: [0xCDCF], NFD: [0x110E, 0x1170, 0x11AA], NFKC: [0xCDCF], NFKD: [0x110E, 0x1170, 0x11AA] }, +{ source: [0xCDD0], NFC: [0xCDD0], NFD: [0x110E, 0x1170, 0x11AB], NFKC: [0xCDD0], NFKD: [0x110E, 0x1170, 0x11AB] }, +{ source: [0xCDD1], NFC: [0xCDD1], NFD: [0x110E, 0x1170, 0x11AC], NFKC: [0xCDD1], NFKD: [0x110E, 0x1170, 0x11AC] }, +{ source: [0xCDD2], NFC: [0xCDD2], NFD: [0x110E, 0x1170, 0x11AD], NFKC: [0xCDD2], NFKD: [0x110E, 0x1170, 0x11AD] }, +{ source: [0xCDD3], NFC: [0xCDD3], NFD: [0x110E, 0x1170, 0x11AE], NFKC: [0xCDD3], NFKD: [0x110E, 0x1170, 0x11AE] }, +{ source: [0xCDD4], NFC: [0xCDD4], NFD: [0x110E, 0x1170, 0x11AF], NFKC: [0xCDD4], NFKD: [0x110E, 0x1170, 0x11AF] }, +{ source: [0xCDD5], NFC: [0xCDD5], NFD: [0x110E, 0x1170, 0x11B0], NFKC: [0xCDD5], NFKD: [0x110E, 0x1170, 0x11B0] }, +{ source: [0xCDD6], NFC: [0xCDD6], NFD: [0x110E, 0x1170, 0x11B1], NFKC: [0xCDD6], NFKD: [0x110E, 0x1170, 0x11B1] }, +{ source: [0xCDD7], NFC: [0xCDD7], NFD: [0x110E, 0x1170, 0x11B2], NFKC: [0xCDD7], NFKD: [0x110E, 0x1170, 0x11B2] }, +{ source: [0xCDD8], NFC: [0xCDD8], NFD: [0x110E, 0x1170, 0x11B3], NFKC: [0xCDD8], NFKD: [0x110E, 0x1170, 0x11B3] }, +{ source: [0xCDD9], NFC: [0xCDD9], NFD: [0x110E, 0x1170, 0x11B4], NFKC: [0xCDD9], NFKD: [0x110E, 0x1170, 0x11B4] }, +{ source: [0xCDDA], NFC: [0xCDDA], NFD: [0x110E, 0x1170, 0x11B5], NFKC: [0xCDDA], NFKD: [0x110E, 0x1170, 0x11B5] }, +{ source: [0xCDDB], NFC: [0xCDDB], NFD: [0x110E, 0x1170, 0x11B6], NFKC: [0xCDDB], NFKD: [0x110E, 0x1170, 0x11B6] }, +{ source: [0xCDDC], NFC: [0xCDDC], NFD: [0x110E, 0x1170, 0x11B7], NFKC: [0xCDDC], NFKD: [0x110E, 0x1170, 0x11B7] }, +{ source: [0xCDDD], NFC: [0xCDDD], NFD: [0x110E, 0x1170, 0x11B8], NFKC: [0xCDDD], NFKD: [0x110E, 0x1170, 0x11B8] }, +{ source: [0xCDDE], NFC: [0xCDDE], NFD: [0x110E, 0x1170, 0x11B9], NFKC: [0xCDDE], NFKD: [0x110E, 0x1170, 0x11B9] }, +{ source: [0xCDDF], NFC: [0xCDDF], NFD: [0x110E, 0x1170, 0x11BA], NFKC: [0xCDDF], NFKD: [0x110E, 0x1170, 0x11BA] }, +{ source: [0xCDE0], NFC: [0xCDE0], NFD: [0x110E, 0x1170, 0x11BB], NFKC: [0xCDE0], NFKD: [0x110E, 0x1170, 0x11BB] }, +{ source: [0xCDE1], NFC: [0xCDE1], NFD: [0x110E, 0x1170, 0x11BC], NFKC: [0xCDE1], NFKD: [0x110E, 0x1170, 0x11BC] }, +{ source: [0xCDE2], NFC: [0xCDE2], NFD: [0x110E, 0x1170, 0x11BD], NFKC: [0xCDE2], NFKD: [0x110E, 0x1170, 0x11BD] }, +{ source: [0xCDE3], NFC: [0xCDE3], NFD: [0x110E, 0x1170, 0x11BE], NFKC: [0xCDE3], NFKD: [0x110E, 0x1170, 0x11BE] }, +{ source: [0xCDE4], NFC: [0xCDE4], NFD: [0x110E, 0x1170, 0x11BF], NFKC: [0xCDE4], NFKD: [0x110E, 0x1170, 0x11BF] }, +{ source: [0xCDE5], NFC: [0xCDE5], NFD: [0x110E, 0x1170, 0x11C0], NFKC: [0xCDE5], NFKD: [0x110E, 0x1170, 0x11C0] }, +{ source: [0xCDE6], NFC: [0xCDE6], NFD: [0x110E, 0x1170, 0x11C1], NFKC: [0xCDE6], NFKD: [0x110E, 0x1170, 0x11C1] }, +{ source: [0xCDE7], NFC: [0xCDE7], NFD: [0x110E, 0x1170, 0x11C2], NFKC: [0xCDE7], NFKD: [0x110E, 0x1170, 0x11C2] }, +{ source: [0xCDE8], NFC: [0xCDE8], NFD: [0x110E, 0x1171], NFKC: [0xCDE8], NFKD: [0x110E, 0x1171] }, +{ source: [0xCDE9], NFC: [0xCDE9], NFD: [0x110E, 0x1171, 0x11A8], NFKC: [0xCDE9], NFKD: [0x110E, 0x1171, 0x11A8] }, +{ source: [0xCDEA], NFC: [0xCDEA], NFD: [0x110E, 0x1171, 0x11A9], NFKC: [0xCDEA], NFKD: [0x110E, 0x1171, 0x11A9] }, +{ source: [0xCDEB], NFC: [0xCDEB], NFD: [0x110E, 0x1171, 0x11AA], NFKC: [0xCDEB], NFKD: [0x110E, 0x1171, 0x11AA] }, +{ source: [0xCDEC], NFC: [0xCDEC], NFD: [0x110E, 0x1171, 0x11AB], NFKC: [0xCDEC], NFKD: [0x110E, 0x1171, 0x11AB] }, +{ source: [0xCDED], NFC: [0xCDED], NFD: [0x110E, 0x1171, 0x11AC], NFKC: [0xCDED], NFKD: [0x110E, 0x1171, 0x11AC] }, +{ source: [0xCDEE], NFC: [0xCDEE], NFD: [0x110E, 0x1171, 0x11AD], NFKC: [0xCDEE], NFKD: [0x110E, 0x1171, 0x11AD] }, +{ source: [0xCDEF], NFC: [0xCDEF], NFD: [0x110E, 0x1171, 0x11AE], NFKC: [0xCDEF], NFKD: [0x110E, 0x1171, 0x11AE] }, +{ source: [0xCDF0], NFC: [0xCDF0], NFD: [0x110E, 0x1171, 0x11AF], NFKC: [0xCDF0], NFKD: [0x110E, 0x1171, 0x11AF] }, +{ source: [0xCDF1], NFC: [0xCDF1], NFD: [0x110E, 0x1171, 0x11B0], NFKC: [0xCDF1], NFKD: [0x110E, 0x1171, 0x11B0] }, +{ source: [0xCDF2], NFC: [0xCDF2], NFD: [0x110E, 0x1171, 0x11B1], NFKC: [0xCDF2], NFKD: [0x110E, 0x1171, 0x11B1] }, +{ source: [0xCDF3], NFC: [0xCDF3], NFD: [0x110E, 0x1171, 0x11B2], NFKC: [0xCDF3], NFKD: [0x110E, 0x1171, 0x11B2] }, +{ source: [0xCDF4], NFC: [0xCDF4], NFD: [0x110E, 0x1171, 0x11B3], NFKC: [0xCDF4], NFKD: [0x110E, 0x1171, 0x11B3] }, +{ source: [0xCDF5], NFC: [0xCDF5], NFD: [0x110E, 0x1171, 0x11B4], NFKC: [0xCDF5], NFKD: [0x110E, 0x1171, 0x11B4] }, +{ source: [0xCDF6], NFC: [0xCDF6], NFD: [0x110E, 0x1171, 0x11B5], NFKC: [0xCDF6], NFKD: [0x110E, 0x1171, 0x11B5] }, +{ source: [0xCDF7], NFC: [0xCDF7], NFD: [0x110E, 0x1171, 0x11B6], NFKC: [0xCDF7], NFKD: [0x110E, 0x1171, 0x11B6] }, +{ source: [0xCDF8], NFC: [0xCDF8], NFD: [0x110E, 0x1171, 0x11B7], NFKC: [0xCDF8], NFKD: [0x110E, 0x1171, 0x11B7] }, +{ source: [0xCDF9], NFC: [0xCDF9], NFD: [0x110E, 0x1171, 0x11B8], NFKC: [0xCDF9], NFKD: [0x110E, 0x1171, 0x11B8] }, +{ source: [0xCDFA], NFC: [0xCDFA], NFD: [0x110E, 0x1171, 0x11B9], NFKC: [0xCDFA], NFKD: [0x110E, 0x1171, 0x11B9] }, +{ source: [0xCDFB], NFC: [0xCDFB], NFD: [0x110E, 0x1171, 0x11BA], NFKC: [0xCDFB], NFKD: [0x110E, 0x1171, 0x11BA] }, +{ source: [0xCDFC], NFC: [0xCDFC], NFD: [0x110E, 0x1171, 0x11BB], NFKC: [0xCDFC], NFKD: [0x110E, 0x1171, 0x11BB] }, +{ source: [0xCDFD], NFC: [0xCDFD], NFD: [0x110E, 0x1171, 0x11BC], NFKC: [0xCDFD], NFKD: [0x110E, 0x1171, 0x11BC] }, +{ source: [0xCDFE], NFC: [0xCDFE], NFD: [0x110E, 0x1171, 0x11BD], NFKC: [0xCDFE], NFKD: [0x110E, 0x1171, 0x11BD] }, +{ source: [0xCDFF], NFC: [0xCDFF], NFD: [0x110E, 0x1171, 0x11BE], NFKC: [0xCDFF], NFKD: [0x110E, 0x1171, 0x11BE] }, +{ source: [0xCE00], NFC: [0xCE00], NFD: [0x110E, 0x1171, 0x11BF], NFKC: [0xCE00], NFKD: [0x110E, 0x1171, 0x11BF] }, +{ source: [0xCE01], NFC: [0xCE01], NFD: [0x110E, 0x1171, 0x11C0], NFKC: [0xCE01], NFKD: [0x110E, 0x1171, 0x11C0] }, +{ source: [0xCE02], NFC: [0xCE02], NFD: [0x110E, 0x1171, 0x11C1], NFKC: [0xCE02], NFKD: [0x110E, 0x1171, 0x11C1] }, +{ source: [0xCE03], NFC: [0xCE03], NFD: [0x110E, 0x1171, 0x11C2], NFKC: [0xCE03], NFKD: [0x110E, 0x1171, 0x11C2] }, +{ source: [0xCE04], NFC: [0xCE04], NFD: [0x110E, 0x1172], NFKC: [0xCE04], NFKD: [0x110E, 0x1172] }, +{ source: [0xCE05], NFC: [0xCE05], NFD: [0x110E, 0x1172, 0x11A8], NFKC: [0xCE05], NFKD: [0x110E, 0x1172, 0x11A8] }, +{ source: [0xCE06], NFC: [0xCE06], NFD: [0x110E, 0x1172, 0x11A9], NFKC: [0xCE06], NFKD: [0x110E, 0x1172, 0x11A9] }, +{ source: [0xCE07], NFC: [0xCE07], NFD: [0x110E, 0x1172, 0x11AA], NFKC: [0xCE07], NFKD: [0x110E, 0x1172, 0x11AA] }, +{ source: [0xCE08], NFC: [0xCE08], NFD: [0x110E, 0x1172, 0x11AB], NFKC: [0xCE08], NFKD: [0x110E, 0x1172, 0x11AB] }, +{ source: [0xCE09], NFC: [0xCE09], NFD: [0x110E, 0x1172, 0x11AC], NFKC: [0xCE09], NFKD: [0x110E, 0x1172, 0x11AC] }, +{ source: [0xCE0A], NFC: [0xCE0A], NFD: [0x110E, 0x1172, 0x11AD], NFKC: [0xCE0A], NFKD: [0x110E, 0x1172, 0x11AD] }, +{ source: [0xCE0B], NFC: [0xCE0B], NFD: [0x110E, 0x1172, 0x11AE], NFKC: [0xCE0B], NFKD: [0x110E, 0x1172, 0x11AE] }, +{ source: [0xCE0C], NFC: [0xCE0C], NFD: [0x110E, 0x1172, 0x11AF], NFKC: [0xCE0C], NFKD: [0x110E, 0x1172, 0x11AF] }, +{ source: [0xCE0D], NFC: [0xCE0D], NFD: [0x110E, 0x1172, 0x11B0], NFKC: [0xCE0D], NFKD: [0x110E, 0x1172, 0x11B0] }, +{ source: [0xCE0E], NFC: [0xCE0E], NFD: [0x110E, 0x1172, 0x11B1], NFKC: [0xCE0E], NFKD: [0x110E, 0x1172, 0x11B1] }, +{ source: [0xCE0F], NFC: [0xCE0F], NFD: [0x110E, 0x1172, 0x11B2], NFKC: [0xCE0F], NFKD: [0x110E, 0x1172, 0x11B2] }, +{ source: [0xCE10], NFC: [0xCE10], NFD: [0x110E, 0x1172, 0x11B3], NFKC: [0xCE10], NFKD: [0x110E, 0x1172, 0x11B3] }, +{ source: [0xCE11], NFC: [0xCE11], NFD: [0x110E, 0x1172, 0x11B4], NFKC: [0xCE11], NFKD: [0x110E, 0x1172, 0x11B4] }, +{ source: [0xCE12], NFC: [0xCE12], NFD: [0x110E, 0x1172, 0x11B5], NFKC: [0xCE12], NFKD: [0x110E, 0x1172, 0x11B5] }, +{ source: [0xCE13], NFC: [0xCE13], NFD: [0x110E, 0x1172, 0x11B6], NFKC: [0xCE13], NFKD: [0x110E, 0x1172, 0x11B6] }, +{ source: [0xCE14], NFC: [0xCE14], NFD: [0x110E, 0x1172, 0x11B7], NFKC: [0xCE14], NFKD: [0x110E, 0x1172, 0x11B7] }, +{ source: [0xCE15], NFC: [0xCE15], NFD: [0x110E, 0x1172, 0x11B8], NFKC: [0xCE15], NFKD: [0x110E, 0x1172, 0x11B8] }, +{ source: [0xCE16], NFC: [0xCE16], NFD: [0x110E, 0x1172, 0x11B9], NFKC: [0xCE16], NFKD: [0x110E, 0x1172, 0x11B9] }, +{ source: [0xCE17], NFC: [0xCE17], NFD: [0x110E, 0x1172, 0x11BA], NFKC: [0xCE17], NFKD: [0x110E, 0x1172, 0x11BA] }, +{ source: [0xCE18], NFC: [0xCE18], NFD: [0x110E, 0x1172, 0x11BB], NFKC: [0xCE18], NFKD: [0x110E, 0x1172, 0x11BB] }, +{ source: [0xCE19], NFC: [0xCE19], NFD: [0x110E, 0x1172, 0x11BC], NFKC: [0xCE19], NFKD: [0x110E, 0x1172, 0x11BC] }, +{ source: [0xCE1A], NFC: [0xCE1A], NFD: [0x110E, 0x1172, 0x11BD], NFKC: [0xCE1A], NFKD: [0x110E, 0x1172, 0x11BD] }, +{ source: [0xCE1B], NFC: [0xCE1B], NFD: [0x110E, 0x1172, 0x11BE], NFKC: [0xCE1B], NFKD: [0x110E, 0x1172, 0x11BE] }, +{ source: [0xCE1C], NFC: [0xCE1C], NFD: [0x110E, 0x1172, 0x11BF], NFKC: [0xCE1C], NFKD: [0x110E, 0x1172, 0x11BF] }, +{ source: [0xCE1D], NFC: [0xCE1D], NFD: [0x110E, 0x1172, 0x11C0], NFKC: [0xCE1D], NFKD: [0x110E, 0x1172, 0x11C0] }, +{ source: [0xCE1E], NFC: [0xCE1E], NFD: [0x110E, 0x1172, 0x11C1], NFKC: [0xCE1E], NFKD: [0x110E, 0x1172, 0x11C1] }, +{ source: [0xCE1F], NFC: [0xCE1F], NFD: [0x110E, 0x1172, 0x11C2], NFKC: [0xCE1F], NFKD: [0x110E, 0x1172, 0x11C2] }, +{ source: [0xCE20], NFC: [0xCE20], NFD: [0x110E, 0x1173], NFKC: [0xCE20], NFKD: [0x110E, 0x1173] }, +{ source: [0xCE21], NFC: [0xCE21], NFD: [0x110E, 0x1173, 0x11A8], NFKC: [0xCE21], NFKD: [0x110E, 0x1173, 0x11A8] }, +{ source: [0xCE22], NFC: [0xCE22], NFD: [0x110E, 0x1173, 0x11A9], NFKC: [0xCE22], NFKD: [0x110E, 0x1173, 0x11A9] }, +{ source: [0xCE23], NFC: [0xCE23], NFD: [0x110E, 0x1173, 0x11AA], NFKC: [0xCE23], NFKD: [0x110E, 0x1173, 0x11AA] }, +{ source: [0xCE24], NFC: [0xCE24], NFD: [0x110E, 0x1173, 0x11AB], NFKC: [0xCE24], NFKD: [0x110E, 0x1173, 0x11AB] }, +{ source: [0xCE25], NFC: [0xCE25], NFD: [0x110E, 0x1173, 0x11AC], NFKC: [0xCE25], NFKD: [0x110E, 0x1173, 0x11AC] }, +{ source: [0xCE26], NFC: [0xCE26], NFD: [0x110E, 0x1173, 0x11AD], NFKC: [0xCE26], NFKD: [0x110E, 0x1173, 0x11AD] }, +{ source: [0xCE27], NFC: [0xCE27], NFD: [0x110E, 0x1173, 0x11AE], NFKC: [0xCE27], NFKD: [0x110E, 0x1173, 0x11AE] }, +{ source: [0xCE28], NFC: [0xCE28], NFD: [0x110E, 0x1173, 0x11AF], NFKC: [0xCE28], NFKD: [0x110E, 0x1173, 0x11AF] }, +{ source: [0xCE29], NFC: [0xCE29], NFD: [0x110E, 0x1173, 0x11B0], NFKC: [0xCE29], NFKD: [0x110E, 0x1173, 0x11B0] }, +{ source: [0xCE2A], NFC: [0xCE2A], NFD: [0x110E, 0x1173, 0x11B1], NFKC: [0xCE2A], NFKD: [0x110E, 0x1173, 0x11B1] }, +{ source: [0xCE2B], NFC: [0xCE2B], NFD: [0x110E, 0x1173, 0x11B2], NFKC: [0xCE2B], NFKD: [0x110E, 0x1173, 0x11B2] }, +{ source: [0xCE2C], NFC: [0xCE2C], NFD: [0x110E, 0x1173, 0x11B3], NFKC: [0xCE2C], NFKD: [0x110E, 0x1173, 0x11B3] }, +{ source: [0xCE2D], NFC: [0xCE2D], NFD: [0x110E, 0x1173, 0x11B4], NFKC: [0xCE2D], NFKD: [0x110E, 0x1173, 0x11B4] }, +{ source: [0xCE2E], NFC: [0xCE2E], NFD: [0x110E, 0x1173, 0x11B5], NFKC: [0xCE2E], NFKD: [0x110E, 0x1173, 0x11B5] }, +{ source: [0xCE2F], NFC: [0xCE2F], NFD: [0x110E, 0x1173, 0x11B6], NFKC: [0xCE2F], NFKD: [0x110E, 0x1173, 0x11B6] }, +{ source: [0xCE30], NFC: [0xCE30], NFD: [0x110E, 0x1173, 0x11B7], NFKC: [0xCE30], NFKD: [0x110E, 0x1173, 0x11B7] }, +{ source: [0xCE31], NFC: [0xCE31], NFD: [0x110E, 0x1173, 0x11B8], NFKC: [0xCE31], NFKD: [0x110E, 0x1173, 0x11B8] }, +{ source: [0xCE32], NFC: [0xCE32], NFD: [0x110E, 0x1173, 0x11B9], NFKC: [0xCE32], NFKD: [0x110E, 0x1173, 0x11B9] }, +{ source: [0xCE33], NFC: [0xCE33], NFD: [0x110E, 0x1173, 0x11BA], NFKC: [0xCE33], NFKD: [0x110E, 0x1173, 0x11BA] }, +{ source: [0xCE34], NFC: [0xCE34], NFD: [0x110E, 0x1173, 0x11BB], NFKC: [0xCE34], NFKD: [0x110E, 0x1173, 0x11BB] }, +{ source: [0xCE35], NFC: [0xCE35], NFD: [0x110E, 0x1173, 0x11BC], NFKC: [0xCE35], NFKD: [0x110E, 0x1173, 0x11BC] }, +{ source: [0xCE36], NFC: [0xCE36], NFD: [0x110E, 0x1173, 0x11BD], NFKC: [0xCE36], NFKD: [0x110E, 0x1173, 0x11BD] }, +{ source: [0xCE37], NFC: [0xCE37], NFD: [0x110E, 0x1173, 0x11BE], NFKC: [0xCE37], NFKD: [0x110E, 0x1173, 0x11BE] }, +{ source: [0xCE38], NFC: [0xCE38], NFD: [0x110E, 0x1173, 0x11BF], NFKC: [0xCE38], NFKD: [0x110E, 0x1173, 0x11BF] }, +{ source: [0xCE39], NFC: [0xCE39], NFD: [0x110E, 0x1173, 0x11C0], NFKC: [0xCE39], NFKD: [0x110E, 0x1173, 0x11C0] }, +{ source: [0xCE3A], NFC: [0xCE3A], NFD: [0x110E, 0x1173, 0x11C1], NFKC: [0xCE3A], NFKD: [0x110E, 0x1173, 0x11C1] }, +{ source: [0xCE3B], NFC: [0xCE3B], NFD: [0x110E, 0x1173, 0x11C2], NFKC: [0xCE3B], NFKD: [0x110E, 0x1173, 0x11C2] }, +{ source: [0xCE3C], NFC: [0xCE3C], NFD: [0x110E, 0x1174], NFKC: [0xCE3C], NFKD: [0x110E, 0x1174] }, +{ source: [0xCE3D], NFC: [0xCE3D], NFD: [0x110E, 0x1174, 0x11A8], NFKC: [0xCE3D], NFKD: [0x110E, 0x1174, 0x11A8] }, +{ source: [0xCE3E], NFC: [0xCE3E], NFD: [0x110E, 0x1174, 0x11A9], NFKC: [0xCE3E], NFKD: [0x110E, 0x1174, 0x11A9] }, +{ source: [0xCE3F], NFC: [0xCE3F], NFD: [0x110E, 0x1174, 0x11AA], NFKC: [0xCE3F], NFKD: [0x110E, 0x1174, 0x11AA] }, +{ source: [0xCE40], NFC: [0xCE40], NFD: [0x110E, 0x1174, 0x11AB], NFKC: [0xCE40], NFKD: [0x110E, 0x1174, 0x11AB] }, +{ source: [0xCE41], NFC: [0xCE41], NFD: [0x110E, 0x1174, 0x11AC], NFKC: [0xCE41], NFKD: [0x110E, 0x1174, 0x11AC] }, +{ source: [0xCE42], NFC: [0xCE42], NFD: [0x110E, 0x1174, 0x11AD], NFKC: [0xCE42], NFKD: [0x110E, 0x1174, 0x11AD] }, +{ source: [0xCE43], NFC: [0xCE43], NFD: [0x110E, 0x1174, 0x11AE], NFKC: [0xCE43], NFKD: [0x110E, 0x1174, 0x11AE] }, +{ source: [0xCE44], NFC: [0xCE44], NFD: [0x110E, 0x1174, 0x11AF], NFKC: [0xCE44], NFKD: [0x110E, 0x1174, 0x11AF] }, +{ source: [0xCE45], NFC: [0xCE45], NFD: [0x110E, 0x1174, 0x11B0], NFKC: [0xCE45], NFKD: [0x110E, 0x1174, 0x11B0] }, +{ source: [0xCE46], NFC: [0xCE46], NFD: [0x110E, 0x1174, 0x11B1], NFKC: [0xCE46], NFKD: [0x110E, 0x1174, 0x11B1] }, +{ source: [0xCE47], NFC: [0xCE47], NFD: [0x110E, 0x1174, 0x11B2], NFKC: [0xCE47], NFKD: [0x110E, 0x1174, 0x11B2] }, +{ source: [0xCE48], NFC: [0xCE48], NFD: [0x110E, 0x1174, 0x11B3], NFKC: [0xCE48], NFKD: [0x110E, 0x1174, 0x11B3] }, +{ source: [0xCE49], NFC: [0xCE49], NFD: [0x110E, 0x1174, 0x11B4], NFKC: [0xCE49], NFKD: [0x110E, 0x1174, 0x11B4] }, +{ source: [0xCE4A], NFC: [0xCE4A], NFD: [0x110E, 0x1174, 0x11B5], NFKC: [0xCE4A], NFKD: [0x110E, 0x1174, 0x11B5] }, +{ source: [0xCE4B], NFC: [0xCE4B], NFD: [0x110E, 0x1174, 0x11B6], NFKC: [0xCE4B], NFKD: [0x110E, 0x1174, 0x11B6] }, +{ source: [0xCE4C], NFC: [0xCE4C], NFD: [0x110E, 0x1174, 0x11B7], NFKC: [0xCE4C], NFKD: [0x110E, 0x1174, 0x11B7] }, +{ source: [0xCE4D], NFC: [0xCE4D], NFD: [0x110E, 0x1174, 0x11B8], NFKC: [0xCE4D], NFKD: [0x110E, 0x1174, 0x11B8] }, +{ source: [0xCE4E], NFC: [0xCE4E], NFD: [0x110E, 0x1174, 0x11B9], NFKC: [0xCE4E], NFKD: [0x110E, 0x1174, 0x11B9] }, +{ source: [0xCE4F], NFC: [0xCE4F], NFD: [0x110E, 0x1174, 0x11BA], NFKC: [0xCE4F], NFKD: [0x110E, 0x1174, 0x11BA] }, +{ source: [0xCE50], NFC: [0xCE50], NFD: [0x110E, 0x1174, 0x11BB], NFKC: [0xCE50], NFKD: [0x110E, 0x1174, 0x11BB] }, +{ source: [0xCE51], NFC: [0xCE51], NFD: [0x110E, 0x1174, 0x11BC], NFKC: [0xCE51], NFKD: [0x110E, 0x1174, 0x11BC] }, +{ source: [0xCE52], NFC: [0xCE52], NFD: [0x110E, 0x1174, 0x11BD], NFKC: [0xCE52], NFKD: [0x110E, 0x1174, 0x11BD] }, +{ source: [0xCE53], NFC: [0xCE53], NFD: [0x110E, 0x1174, 0x11BE], NFKC: [0xCE53], NFKD: [0x110E, 0x1174, 0x11BE] }, +{ source: [0xCE54], NFC: [0xCE54], NFD: [0x110E, 0x1174, 0x11BF], NFKC: [0xCE54], NFKD: [0x110E, 0x1174, 0x11BF] }, +{ source: [0xCE55], NFC: [0xCE55], NFD: [0x110E, 0x1174, 0x11C0], NFKC: [0xCE55], NFKD: [0x110E, 0x1174, 0x11C0] }, +{ source: [0xCE56], NFC: [0xCE56], NFD: [0x110E, 0x1174, 0x11C1], NFKC: [0xCE56], NFKD: [0x110E, 0x1174, 0x11C1] }, +{ source: [0xCE57], NFC: [0xCE57], NFD: [0x110E, 0x1174, 0x11C2], NFKC: [0xCE57], NFKD: [0x110E, 0x1174, 0x11C2] }, +{ source: [0xCE58], NFC: [0xCE58], NFD: [0x110E, 0x1175], NFKC: [0xCE58], NFKD: [0x110E, 0x1175] }, +{ source: [0xCE59], NFC: [0xCE59], NFD: [0x110E, 0x1175, 0x11A8], NFKC: [0xCE59], NFKD: [0x110E, 0x1175, 0x11A8] }, +{ source: [0xCE5A], NFC: [0xCE5A], NFD: [0x110E, 0x1175, 0x11A9], NFKC: [0xCE5A], NFKD: [0x110E, 0x1175, 0x11A9] }, +{ source: [0xCE5B], NFC: [0xCE5B], NFD: [0x110E, 0x1175, 0x11AA], NFKC: [0xCE5B], NFKD: [0x110E, 0x1175, 0x11AA] }, +{ source: [0xCE5C], NFC: [0xCE5C], NFD: [0x110E, 0x1175, 0x11AB], NFKC: [0xCE5C], NFKD: [0x110E, 0x1175, 0x11AB] }, +{ source: [0xCE5D], NFC: [0xCE5D], NFD: [0x110E, 0x1175, 0x11AC], NFKC: [0xCE5D], NFKD: [0x110E, 0x1175, 0x11AC] }, +{ source: [0xCE5E], NFC: [0xCE5E], NFD: [0x110E, 0x1175, 0x11AD], NFKC: [0xCE5E], NFKD: [0x110E, 0x1175, 0x11AD] }, +{ source: [0xCE5F], NFC: [0xCE5F], NFD: [0x110E, 0x1175, 0x11AE], NFKC: [0xCE5F], NFKD: [0x110E, 0x1175, 0x11AE] }, +{ source: [0xCE60], NFC: [0xCE60], NFD: [0x110E, 0x1175, 0x11AF], NFKC: [0xCE60], NFKD: [0x110E, 0x1175, 0x11AF] }, +{ source: [0xCE61], NFC: [0xCE61], NFD: [0x110E, 0x1175, 0x11B0], NFKC: [0xCE61], NFKD: [0x110E, 0x1175, 0x11B0] }, +{ source: [0xCE62], NFC: [0xCE62], NFD: [0x110E, 0x1175, 0x11B1], NFKC: [0xCE62], NFKD: [0x110E, 0x1175, 0x11B1] }, +{ source: [0xCE63], NFC: [0xCE63], NFD: [0x110E, 0x1175, 0x11B2], NFKC: [0xCE63], NFKD: [0x110E, 0x1175, 0x11B2] }, +{ source: [0xCE64], NFC: [0xCE64], NFD: [0x110E, 0x1175, 0x11B3], NFKC: [0xCE64], NFKD: [0x110E, 0x1175, 0x11B3] }, +{ source: [0xCE65], NFC: [0xCE65], NFD: [0x110E, 0x1175, 0x11B4], NFKC: [0xCE65], NFKD: [0x110E, 0x1175, 0x11B4] }, +{ source: [0xCE66], NFC: [0xCE66], NFD: [0x110E, 0x1175, 0x11B5], NFKC: [0xCE66], NFKD: [0x110E, 0x1175, 0x11B5] }, +{ source: [0xCE67], NFC: [0xCE67], NFD: [0x110E, 0x1175, 0x11B6], NFKC: [0xCE67], NFKD: [0x110E, 0x1175, 0x11B6] }, +{ source: [0xCE68], NFC: [0xCE68], NFD: [0x110E, 0x1175, 0x11B7], NFKC: [0xCE68], NFKD: [0x110E, 0x1175, 0x11B7] }, +{ source: [0xCE69], NFC: [0xCE69], NFD: [0x110E, 0x1175, 0x11B8], NFKC: [0xCE69], NFKD: [0x110E, 0x1175, 0x11B8] }, +{ source: [0xCE6A], NFC: [0xCE6A], NFD: [0x110E, 0x1175, 0x11B9], NFKC: [0xCE6A], NFKD: [0x110E, 0x1175, 0x11B9] }, +{ source: [0xCE6B], NFC: [0xCE6B], NFD: [0x110E, 0x1175, 0x11BA], NFKC: [0xCE6B], NFKD: [0x110E, 0x1175, 0x11BA] }, +{ source: [0xCE6C], NFC: [0xCE6C], NFD: [0x110E, 0x1175, 0x11BB], NFKC: [0xCE6C], NFKD: [0x110E, 0x1175, 0x11BB] }, +{ source: [0xCE6D], NFC: [0xCE6D], NFD: [0x110E, 0x1175, 0x11BC], NFKC: [0xCE6D], NFKD: [0x110E, 0x1175, 0x11BC] }, +{ source: [0xCE6E], NFC: [0xCE6E], NFD: [0x110E, 0x1175, 0x11BD], NFKC: [0xCE6E], NFKD: [0x110E, 0x1175, 0x11BD] }, +{ source: [0xCE6F], NFC: [0xCE6F], NFD: [0x110E, 0x1175, 0x11BE], NFKC: [0xCE6F], NFKD: [0x110E, 0x1175, 0x11BE] }, +{ source: [0xCE70], NFC: [0xCE70], NFD: [0x110E, 0x1175, 0x11BF], NFKC: [0xCE70], NFKD: [0x110E, 0x1175, 0x11BF] }, +{ source: [0xCE71], NFC: [0xCE71], NFD: [0x110E, 0x1175, 0x11C0], NFKC: [0xCE71], NFKD: [0x110E, 0x1175, 0x11C0] }, +{ source: [0xCE72], NFC: [0xCE72], NFD: [0x110E, 0x1175, 0x11C1], NFKC: [0xCE72], NFKD: [0x110E, 0x1175, 0x11C1] }, +{ source: [0xCE73], NFC: [0xCE73], NFD: [0x110E, 0x1175, 0x11C2], NFKC: [0xCE73], NFKD: [0x110E, 0x1175, 0x11C2] }, +{ source: [0xCE74], NFC: [0xCE74], NFD: [0x110F, 0x1161], NFKC: [0xCE74], NFKD: [0x110F, 0x1161] }, +{ source: [0xCE75], NFC: [0xCE75], NFD: [0x110F, 0x1161, 0x11A8], NFKC: [0xCE75], NFKD: [0x110F, 0x1161, 0x11A8] }, +{ source: [0xCE76], NFC: [0xCE76], NFD: [0x110F, 0x1161, 0x11A9], NFKC: [0xCE76], NFKD: [0x110F, 0x1161, 0x11A9] }, +{ source: [0xCE77], NFC: [0xCE77], NFD: [0x110F, 0x1161, 0x11AA], NFKC: [0xCE77], NFKD: [0x110F, 0x1161, 0x11AA] }, +{ source: [0xCE78], NFC: [0xCE78], NFD: [0x110F, 0x1161, 0x11AB], NFKC: [0xCE78], NFKD: [0x110F, 0x1161, 0x11AB] }, +{ source: [0xCE79], NFC: [0xCE79], NFD: [0x110F, 0x1161, 0x11AC], NFKC: [0xCE79], NFKD: [0x110F, 0x1161, 0x11AC] }, +{ source: [0xCE7A], NFC: [0xCE7A], NFD: [0x110F, 0x1161, 0x11AD], NFKC: [0xCE7A], NFKD: [0x110F, 0x1161, 0x11AD] }, +{ source: [0xCE7B], NFC: [0xCE7B], NFD: [0x110F, 0x1161, 0x11AE], NFKC: [0xCE7B], NFKD: [0x110F, 0x1161, 0x11AE] }, +{ source: [0xCE7C], NFC: [0xCE7C], NFD: [0x110F, 0x1161, 0x11AF], NFKC: [0xCE7C], NFKD: [0x110F, 0x1161, 0x11AF] }, +{ source: [0xCE7D], NFC: [0xCE7D], NFD: [0x110F, 0x1161, 0x11B0], NFKC: [0xCE7D], NFKD: [0x110F, 0x1161, 0x11B0] }, +{ source: [0xCE7E], NFC: [0xCE7E], NFD: [0x110F, 0x1161, 0x11B1], NFKC: [0xCE7E], NFKD: [0x110F, 0x1161, 0x11B1] }, +{ source: [0xCE7F], NFC: [0xCE7F], NFD: [0x110F, 0x1161, 0x11B2], NFKC: [0xCE7F], NFKD: [0x110F, 0x1161, 0x11B2] }, +{ source: [0xCE80], NFC: [0xCE80], NFD: [0x110F, 0x1161, 0x11B3], NFKC: [0xCE80], NFKD: [0x110F, 0x1161, 0x11B3] }, +{ source: [0xCE81], NFC: [0xCE81], NFD: [0x110F, 0x1161, 0x11B4], NFKC: [0xCE81], NFKD: [0x110F, 0x1161, 0x11B4] }, +{ source: [0xCE82], NFC: [0xCE82], NFD: [0x110F, 0x1161, 0x11B5], NFKC: [0xCE82], NFKD: [0x110F, 0x1161, 0x11B5] }, +{ source: [0xCE83], NFC: [0xCE83], NFD: [0x110F, 0x1161, 0x11B6], NFKC: [0xCE83], NFKD: [0x110F, 0x1161, 0x11B6] }, +{ source: [0xCE84], NFC: [0xCE84], NFD: [0x110F, 0x1161, 0x11B7], NFKC: [0xCE84], NFKD: [0x110F, 0x1161, 0x11B7] }, +{ source: [0xCE85], NFC: [0xCE85], NFD: [0x110F, 0x1161, 0x11B8], NFKC: [0xCE85], NFKD: [0x110F, 0x1161, 0x11B8] }, +{ source: [0xCE86], NFC: [0xCE86], NFD: [0x110F, 0x1161, 0x11B9], NFKC: [0xCE86], NFKD: [0x110F, 0x1161, 0x11B9] }, +{ source: [0xCE87], NFC: [0xCE87], NFD: [0x110F, 0x1161, 0x11BA], NFKC: [0xCE87], NFKD: [0x110F, 0x1161, 0x11BA] }, +{ source: [0xCE88], NFC: [0xCE88], NFD: [0x110F, 0x1161, 0x11BB], NFKC: [0xCE88], NFKD: [0x110F, 0x1161, 0x11BB] }, +{ source: [0xCE89], NFC: [0xCE89], NFD: [0x110F, 0x1161, 0x11BC], NFKC: [0xCE89], NFKD: [0x110F, 0x1161, 0x11BC] }, +{ source: [0xCE8A], NFC: [0xCE8A], NFD: [0x110F, 0x1161, 0x11BD], NFKC: [0xCE8A], NFKD: [0x110F, 0x1161, 0x11BD] }, +{ source: [0xCE8B], NFC: [0xCE8B], NFD: [0x110F, 0x1161, 0x11BE], NFKC: [0xCE8B], NFKD: [0x110F, 0x1161, 0x11BE] }, +{ source: [0xCE8C], NFC: [0xCE8C], NFD: [0x110F, 0x1161, 0x11BF], NFKC: [0xCE8C], NFKD: [0x110F, 0x1161, 0x11BF] }, +{ source: [0xCE8D], NFC: [0xCE8D], NFD: [0x110F, 0x1161, 0x11C0], NFKC: [0xCE8D], NFKD: [0x110F, 0x1161, 0x11C0] }, +{ source: [0xCE8E], NFC: [0xCE8E], NFD: [0x110F, 0x1161, 0x11C1], NFKC: [0xCE8E], NFKD: [0x110F, 0x1161, 0x11C1] }, +{ source: [0xCE8F], NFC: [0xCE8F], NFD: [0x110F, 0x1161, 0x11C2], NFKC: [0xCE8F], NFKD: [0x110F, 0x1161, 0x11C2] }, +{ source: [0xCE90], NFC: [0xCE90], NFD: [0x110F, 0x1162], NFKC: [0xCE90], NFKD: [0x110F, 0x1162] }, +{ source: [0xCE91], NFC: [0xCE91], NFD: [0x110F, 0x1162, 0x11A8], NFKC: [0xCE91], NFKD: [0x110F, 0x1162, 0x11A8] }, +{ source: [0xCE92], NFC: [0xCE92], NFD: [0x110F, 0x1162, 0x11A9], NFKC: [0xCE92], NFKD: [0x110F, 0x1162, 0x11A9] }, +{ source: [0xCE93], NFC: [0xCE93], NFD: [0x110F, 0x1162, 0x11AA], NFKC: [0xCE93], NFKD: [0x110F, 0x1162, 0x11AA] }, +{ source: [0xCE94], NFC: [0xCE94], NFD: [0x110F, 0x1162, 0x11AB], NFKC: [0xCE94], NFKD: [0x110F, 0x1162, 0x11AB] }, +{ source: [0xCE95], NFC: [0xCE95], NFD: [0x110F, 0x1162, 0x11AC], NFKC: [0xCE95], NFKD: [0x110F, 0x1162, 0x11AC] }, +{ source: [0xCE96], NFC: [0xCE96], NFD: [0x110F, 0x1162, 0x11AD], NFKC: [0xCE96], NFKD: [0x110F, 0x1162, 0x11AD] }, +{ source: [0xCE97], NFC: [0xCE97], NFD: [0x110F, 0x1162, 0x11AE], NFKC: [0xCE97], NFKD: [0x110F, 0x1162, 0x11AE] }, +{ source: [0xCE98], NFC: [0xCE98], NFD: [0x110F, 0x1162, 0x11AF], NFKC: [0xCE98], NFKD: [0x110F, 0x1162, 0x11AF] }, +{ source: [0xCE99], NFC: [0xCE99], NFD: [0x110F, 0x1162, 0x11B0], NFKC: [0xCE99], NFKD: [0x110F, 0x1162, 0x11B0] }, +{ source: [0xCE9A], NFC: [0xCE9A], NFD: [0x110F, 0x1162, 0x11B1], NFKC: [0xCE9A], NFKD: [0x110F, 0x1162, 0x11B1] }, +{ source: [0xCE9B], NFC: [0xCE9B], NFD: [0x110F, 0x1162, 0x11B2], NFKC: [0xCE9B], NFKD: [0x110F, 0x1162, 0x11B2] }, +{ source: [0xCE9C], NFC: [0xCE9C], NFD: [0x110F, 0x1162, 0x11B3], NFKC: [0xCE9C], NFKD: [0x110F, 0x1162, 0x11B3] }, +{ source: [0xCE9D], NFC: [0xCE9D], NFD: [0x110F, 0x1162, 0x11B4], NFKC: [0xCE9D], NFKD: [0x110F, 0x1162, 0x11B4] }, +{ source: [0xCE9E], NFC: [0xCE9E], NFD: [0x110F, 0x1162, 0x11B5], NFKC: [0xCE9E], NFKD: [0x110F, 0x1162, 0x11B5] }, +{ source: [0xCE9F], NFC: [0xCE9F], NFD: [0x110F, 0x1162, 0x11B6], NFKC: [0xCE9F], NFKD: [0x110F, 0x1162, 0x11B6] }, +{ source: [0xCEA0], NFC: [0xCEA0], NFD: [0x110F, 0x1162, 0x11B7], NFKC: [0xCEA0], NFKD: [0x110F, 0x1162, 0x11B7] }, +{ source: [0xCEA1], NFC: [0xCEA1], NFD: [0x110F, 0x1162, 0x11B8], NFKC: [0xCEA1], NFKD: [0x110F, 0x1162, 0x11B8] }, +{ source: [0xCEA2], NFC: [0xCEA2], NFD: [0x110F, 0x1162, 0x11B9], NFKC: [0xCEA2], NFKD: [0x110F, 0x1162, 0x11B9] }, +{ source: [0xCEA3], NFC: [0xCEA3], NFD: [0x110F, 0x1162, 0x11BA], NFKC: [0xCEA3], NFKD: [0x110F, 0x1162, 0x11BA] }, +{ source: [0xCEA4], NFC: [0xCEA4], NFD: [0x110F, 0x1162, 0x11BB], NFKC: [0xCEA4], NFKD: [0x110F, 0x1162, 0x11BB] }, +{ source: [0xCEA5], NFC: [0xCEA5], NFD: [0x110F, 0x1162, 0x11BC], NFKC: [0xCEA5], NFKD: [0x110F, 0x1162, 0x11BC] }, +{ source: [0xCEA6], NFC: [0xCEA6], NFD: [0x110F, 0x1162, 0x11BD], NFKC: [0xCEA6], NFKD: [0x110F, 0x1162, 0x11BD] }, +{ source: [0xCEA7], NFC: [0xCEA7], NFD: [0x110F, 0x1162, 0x11BE], NFKC: [0xCEA7], NFKD: [0x110F, 0x1162, 0x11BE] }, +{ source: [0xCEA8], NFC: [0xCEA8], NFD: [0x110F, 0x1162, 0x11BF], NFKC: [0xCEA8], NFKD: [0x110F, 0x1162, 0x11BF] }, +{ source: [0xCEA9], NFC: [0xCEA9], NFD: [0x110F, 0x1162, 0x11C0], NFKC: [0xCEA9], NFKD: [0x110F, 0x1162, 0x11C0] }, +{ source: [0xCEAA], NFC: [0xCEAA], NFD: [0x110F, 0x1162, 0x11C1], NFKC: [0xCEAA], NFKD: [0x110F, 0x1162, 0x11C1] }, +{ source: [0xCEAB], NFC: [0xCEAB], NFD: [0x110F, 0x1162, 0x11C2], NFKC: [0xCEAB], NFKD: [0x110F, 0x1162, 0x11C2] }, +{ source: [0xCEAC], NFC: [0xCEAC], NFD: [0x110F, 0x1163], NFKC: [0xCEAC], NFKD: [0x110F, 0x1163] }, +{ source: [0xCEAD], NFC: [0xCEAD], NFD: [0x110F, 0x1163, 0x11A8], NFKC: [0xCEAD], NFKD: [0x110F, 0x1163, 0x11A8] }, +{ source: [0xCEAE], NFC: [0xCEAE], NFD: [0x110F, 0x1163, 0x11A9], NFKC: [0xCEAE], NFKD: [0x110F, 0x1163, 0x11A9] }, +{ source: [0xCEAF], NFC: [0xCEAF], NFD: [0x110F, 0x1163, 0x11AA], NFKC: [0xCEAF], NFKD: [0x110F, 0x1163, 0x11AA] }, +{ source: [0xCEB0], NFC: [0xCEB0], NFD: [0x110F, 0x1163, 0x11AB], NFKC: [0xCEB0], NFKD: [0x110F, 0x1163, 0x11AB] }, +{ source: [0xCEB1], NFC: [0xCEB1], NFD: [0x110F, 0x1163, 0x11AC], NFKC: [0xCEB1], NFKD: [0x110F, 0x1163, 0x11AC] }, +{ source: [0xCEB2], NFC: [0xCEB2], NFD: [0x110F, 0x1163, 0x11AD], NFKC: [0xCEB2], NFKD: [0x110F, 0x1163, 0x11AD] }, +{ source: [0xCEB3], NFC: [0xCEB3], NFD: [0x110F, 0x1163, 0x11AE], NFKC: [0xCEB3], NFKD: [0x110F, 0x1163, 0x11AE] }, +{ source: [0xCEB4], NFC: [0xCEB4], NFD: [0x110F, 0x1163, 0x11AF], NFKC: [0xCEB4], NFKD: [0x110F, 0x1163, 0x11AF] }, +{ source: [0xCEB5], NFC: [0xCEB5], NFD: [0x110F, 0x1163, 0x11B0], NFKC: [0xCEB5], NFKD: [0x110F, 0x1163, 0x11B0] }, +{ source: [0xCEB6], NFC: [0xCEB6], NFD: [0x110F, 0x1163, 0x11B1], NFKC: [0xCEB6], NFKD: [0x110F, 0x1163, 0x11B1] }, +{ source: [0xCEB7], NFC: [0xCEB7], NFD: [0x110F, 0x1163, 0x11B2], NFKC: [0xCEB7], NFKD: [0x110F, 0x1163, 0x11B2] }, +{ source: [0xCEB8], NFC: [0xCEB8], NFD: [0x110F, 0x1163, 0x11B3], NFKC: [0xCEB8], NFKD: [0x110F, 0x1163, 0x11B3] }, +{ source: [0xCEB9], NFC: [0xCEB9], NFD: [0x110F, 0x1163, 0x11B4], NFKC: [0xCEB9], NFKD: [0x110F, 0x1163, 0x11B4] }, +{ source: [0xCEBA], NFC: [0xCEBA], NFD: [0x110F, 0x1163, 0x11B5], NFKC: [0xCEBA], NFKD: [0x110F, 0x1163, 0x11B5] }, +{ source: [0xCEBB], NFC: [0xCEBB], NFD: [0x110F, 0x1163, 0x11B6], NFKC: [0xCEBB], NFKD: [0x110F, 0x1163, 0x11B6] }, +{ source: [0xCEBC], NFC: [0xCEBC], NFD: [0x110F, 0x1163, 0x11B7], NFKC: [0xCEBC], NFKD: [0x110F, 0x1163, 0x11B7] }, +{ source: [0xCEBD], NFC: [0xCEBD], NFD: [0x110F, 0x1163, 0x11B8], NFKC: [0xCEBD], NFKD: [0x110F, 0x1163, 0x11B8] }, +{ source: [0xCEBE], NFC: [0xCEBE], NFD: [0x110F, 0x1163, 0x11B9], NFKC: [0xCEBE], NFKD: [0x110F, 0x1163, 0x11B9] }, +{ source: [0xCEBF], NFC: [0xCEBF], NFD: [0x110F, 0x1163, 0x11BA], NFKC: [0xCEBF], NFKD: [0x110F, 0x1163, 0x11BA] }, +{ source: [0xCEC0], NFC: [0xCEC0], NFD: [0x110F, 0x1163, 0x11BB], NFKC: [0xCEC0], NFKD: [0x110F, 0x1163, 0x11BB] }, +{ source: [0xCEC1], NFC: [0xCEC1], NFD: [0x110F, 0x1163, 0x11BC], NFKC: [0xCEC1], NFKD: [0x110F, 0x1163, 0x11BC] }, +{ source: [0xCEC2], NFC: [0xCEC2], NFD: [0x110F, 0x1163, 0x11BD], NFKC: [0xCEC2], NFKD: [0x110F, 0x1163, 0x11BD] }, +{ source: [0xCEC3], NFC: [0xCEC3], NFD: [0x110F, 0x1163, 0x11BE], NFKC: [0xCEC3], NFKD: [0x110F, 0x1163, 0x11BE] }, +{ source: [0xCEC4], NFC: [0xCEC4], NFD: [0x110F, 0x1163, 0x11BF], NFKC: [0xCEC4], NFKD: [0x110F, 0x1163, 0x11BF] }, +{ source: [0xCEC5], NFC: [0xCEC5], NFD: [0x110F, 0x1163, 0x11C0], NFKC: [0xCEC5], NFKD: [0x110F, 0x1163, 0x11C0] }, +{ source: [0xCEC6], NFC: [0xCEC6], NFD: [0x110F, 0x1163, 0x11C1], NFKC: [0xCEC6], NFKD: [0x110F, 0x1163, 0x11C1] }, +{ source: [0xCEC7], NFC: [0xCEC7], NFD: [0x110F, 0x1163, 0x11C2], NFKC: [0xCEC7], NFKD: [0x110F, 0x1163, 0x11C2] }, +{ source: [0xCEC8], NFC: [0xCEC8], NFD: [0x110F, 0x1164], NFKC: [0xCEC8], NFKD: [0x110F, 0x1164] }, +{ source: [0xCEC9], NFC: [0xCEC9], NFD: [0x110F, 0x1164, 0x11A8], NFKC: [0xCEC9], NFKD: [0x110F, 0x1164, 0x11A8] }, +{ source: [0xCECA], NFC: [0xCECA], NFD: [0x110F, 0x1164, 0x11A9], NFKC: [0xCECA], NFKD: [0x110F, 0x1164, 0x11A9] }, +{ source: [0xCECB], NFC: [0xCECB], NFD: [0x110F, 0x1164, 0x11AA], NFKC: [0xCECB], NFKD: [0x110F, 0x1164, 0x11AA] }, +{ source: [0xCECC], NFC: [0xCECC], NFD: [0x110F, 0x1164, 0x11AB], NFKC: [0xCECC], NFKD: [0x110F, 0x1164, 0x11AB] }, +{ source: [0xCECD], NFC: [0xCECD], NFD: [0x110F, 0x1164, 0x11AC], NFKC: [0xCECD], NFKD: [0x110F, 0x1164, 0x11AC] }, +{ source: [0xCECE], NFC: [0xCECE], NFD: [0x110F, 0x1164, 0x11AD], NFKC: [0xCECE], NFKD: [0x110F, 0x1164, 0x11AD] }, +{ source: [0xCECF], NFC: [0xCECF], NFD: [0x110F, 0x1164, 0x11AE], NFKC: [0xCECF], NFKD: [0x110F, 0x1164, 0x11AE] }, +{ source: [0xCED0], NFC: [0xCED0], NFD: [0x110F, 0x1164, 0x11AF], NFKC: [0xCED0], NFKD: [0x110F, 0x1164, 0x11AF] }, +{ source: [0xCED1], NFC: [0xCED1], NFD: [0x110F, 0x1164, 0x11B0], NFKC: [0xCED1], NFKD: [0x110F, 0x1164, 0x11B0] }, +{ source: [0xCED2], NFC: [0xCED2], NFD: [0x110F, 0x1164, 0x11B1], NFKC: [0xCED2], NFKD: [0x110F, 0x1164, 0x11B1] }, +{ source: [0xCED3], NFC: [0xCED3], NFD: [0x110F, 0x1164, 0x11B2], NFKC: [0xCED3], NFKD: [0x110F, 0x1164, 0x11B2] }, +{ source: [0xCED4], NFC: [0xCED4], NFD: [0x110F, 0x1164, 0x11B3], NFKC: [0xCED4], NFKD: [0x110F, 0x1164, 0x11B3] }, +{ source: [0xCED5], NFC: [0xCED5], NFD: [0x110F, 0x1164, 0x11B4], NFKC: [0xCED5], NFKD: [0x110F, 0x1164, 0x11B4] }, +{ source: [0xCED6], NFC: [0xCED6], NFD: [0x110F, 0x1164, 0x11B5], NFKC: [0xCED6], NFKD: [0x110F, 0x1164, 0x11B5] }, +{ source: [0xCED7], NFC: [0xCED7], NFD: [0x110F, 0x1164, 0x11B6], NFKC: [0xCED7], NFKD: [0x110F, 0x1164, 0x11B6] }, +{ source: [0xCED8], NFC: [0xCED8], NFD: [0x110F, 0x1164, 0x11B7], NFKC: [0xCED8], NFKD: [0x110F, 0x1164, 0x11B7] }, +{ source: [0xCED9], NFC: [0xCED9], NFD: [0x110F, 0x1164, 0x11B8], NFKC: [0xCED9], NFKD: [0x110F, 0x1164, 0x11B8] }, +{ source: [0xCEDA], NFC: [0xCEDA], NFD: [0x110F, 0x1164, 0x11B9], NFKC: [0xCEDA], NFKD: [0x110F, 0x1164, 0x11B9] }, +{ source: [0xCEDB], NFC: [0xCEDB], NFD: [0x110F, 0x1164, 0x11BA], NFKC: [0xCEDB], NFKD: [0x110F, 0x1164, 0x11BA] }, +{ source: [0xCEDC], NFC: [0xCEDC], NFD: [0x110F, 0x1164, 0x11BB], NFKC: [0xCEDC], NFKD: [0x110F, 0x1164, 0x11BB] }, +{ source: [0xCEDD], NFC: [0xCEDD], NFD: [0x110F, 0x1164, 0x11BC], NFKC: [0xCEDD], NFKD: [0x110F, 0x1164, 0x11BC] }, +{ source: [0xCEDE], NFC: [0xCEDE], NFD: [0x110F, 0x1164, 0x11BD], NFKC: [0xCEDE], NFKD: [0x110F, 0x1164, 0x11BD] }, +{ source: [0xCEDF], NFC: [0xCEDF], NFD: [0x110F, 0x1164, 0x11BE], NFKC: [0xCEDF], NFKD: [0x110F, 0x1164, 0x11BE] }, +{ source: [0xCEE0], NFC: [0xCEE0], NFD: [0x110F, 0x1164, 0x11BF], NFKC: [0xCEE0], NFKD: [0x110F, 0x1164, 0x11BF] }, +{ source: [0xCEE1], NFC: [0xCEE1], NFD: [0x110F, 0x1164, 0x11C0], NFKC: [0xCEE1], NFKD: [0x110F, 0x1164, 0x11C0] }, +{ source: [0xCEE2], NFC: [0xCEE2], NFD: [0x110F, 0x1164, 0x11C1], NFKC: [0xCEE2], NFKD: [0x110F, 0x1164, 0x11C1] }, +{ source: [0xCEE3], NFC: [0xCEE3], NFD: [0x110F, 0x1164, 0x11C2], NFKC: [0xCEE3], NFKD: [0x110F, 0x1164, 0x11C2] }, +{ source: [0xCEE4], NFC: [0xCEE4], NFD: [0x110F, 0x1165], NFKC: [0xCEE4], NFKD: [0x110F, 0x1165] }, +{ source: [0xCEE5], NFC: [0xCEE5], NFD: [0x110F, 0x1165, 0x11A8], NFKC: [0xCEE5], NFKD: [0x110F, 0x1165, 0x11A8] }, +{ source: [0xCEE6], NFC: [0xCEE6], NFD: [0x110F, 0x1165, 0x11A9], NFKC: [0xCEE6], NFKD: [0x110F, 0x1165, 0x11A9] }, +{ source: [0xCEE7], NFC: [0xCEE7], NFD: [0x110F, 0x1165, 0x11AA], NFKC: [0xCEE7], NFKD: [0x110F, 0x1165, 0x11AA] }, +{ source: [0xCEE8], NFC: [0xCEE8], NFD: [0x110F, 0x1165, 0x11AB], NFKC: [0xCEE8], NFKD: [0x110F, 0x1165, 0x11AB] }, +{ source: [0xCEE9], NFC: [0xCEE9], NFD: [0x110F, 0x1165, 0x11AC], NFKC: [0xCEE9], NFKD: [0x110F, 0x1165, 0x11AC] }, +{ source: [0xCEEA], NFC: [0xCEEA], NFD: [0x110F, 0x1165, 0x11AD], NFKC: [0xCEEA], NFKD: [0x110F, 0x1165, 0x11AD] }, +{ source: [0xCEEB], NFC: [0xCEEB], NFD: [0x110F, 0x1165, 0x11AE], NFKC: [0xCEEB], NFKD: [0x110F, 0x1165, 0x11AE] }, +{ source: [0xCEEC], NFC: [0xCEEC], NFD: [0x110F, 0x1165, 0x11AF], NFKC: [0xCEEC], NFKD: [0x110F, 0x1165, 0x11AF] }, +{ source: [0xCEED], NFC: [0xCEED], NFD: [0x110F, 0x1165, 0x11B0], NFKC: [0xCEED], NFKD: [0x110F, 0x1165, 0x11B0] }, +{ source: [0xCEEE], NFC: [0xCEEE], NFD: [0x110F, 0x1165, 0x11B1], NFKC: [0xCEEE], NFKD: [0x110F, 0x1165, 0x11B1] }, +{ source: [0xCEEF], NFC: [0xCEEF], NFD: [0x110F, 0x1165, 0x11B2], NFKC: [0xCEEF], NFKD: [0x110F, 0x1165, 0x11B2] }, +{ source: [0xCEF0], NFC: [0xCEF0], NFD: [0x110F, 0x1165, 0x11B3], NFKC: [0xCEF0], NFKD: [0x110F, 0x1165, 0x11B3] }, +{ source: [0xCEF1], NFC: [0xCEF1], NFD: [0x110F, 0x1165, 0x11B4], NFKC: [0xCEF1], NFKD: [0x110F, 0x1165, 0x11B4] }, +{ source: [0xCEF2], NFC: [0xCEF2], NFD: [0x110F, 0x1165, 0x11B5], NFKC: [0xCEF2], NFKD: [0x110F, 0x1165, 0x11B5] }, +{ source: [0xCEF3], NFC: [0xCEF3], NFD: [0x110F, 0x1165, 0x11B6], NFKC: [0xCEF3], NFKD: [0x110F, 0x1165, 0x11B6] }, +{ source: [0xCEF4], NFC: [0xCEF4], NFD: [0x110F, 0x1165, 0x11B7], NFKC: [0xCEF4], NFKD: [0x110F, 0x1165, 0x11B7] }, +{ source: [0xCEF5], NFC: [0xCEF5], NFD: [0x110F, 0x1165, 0x11B8], NFKC: [0xCEF5], NFKD: [0x110F, 0x1165, 0x11B8] }, +{ source: [0xCEF6], NFC: [0xCEF6], NFD: [0x110F, 0x1165, 0x11B9], NFKC: [0xCEF6], NFKD: [0x110F, 0x1165, 0x11B9] }, +{ source: [0xCEF7], NFC: [0xCEF7], NFD: [0x110F, 0x1165, 0x11BA], NFKC: [0xCEF7], NFKD: [0x110F, 0x1165, 0x11BA] }, +{ source: [0xCEF8], NFC: [0xCEF8], NFD: [0x110F, 0x1165, 0x11BB], NFKC: [0xCEF8], NFKD: [0x110F, 0x1165, 0x11BB] }, +{ source: [0xCEF9], NFC: [0xCEF9], NFD: [0x110F, 0x1165, 0x11BC], NFKC: [0xCEF9], NFKD: [0x110F, 0x1165, 0x11BC] }, +{ source: [0xCEFA], NFC: [0xCEFA], NFD: [0x110F, 0x1165, 0x11BD], NFKC: [0xCEFA], NFKD: [0x110F, 0x1165, 0x11BD] }, +{ source: [0xCEFB], NFC: [0xCEFB], NFD: [0x110F, 0x1165, 0x11BE], NFKC: [0xCEFB], NFKD: [0x110F, 0x1165, 0x11BE] }, +{ source: [0xCEFC], NFC: [0xCEFC], NFD: [0x110F, 0x1165, 0x11BF], NFKC: [0xCEFC], NFKD: [0x110F, 0x1165, 0x11BF] }, +{ source: [0xCEFD], NFC: [0xCEFD], NFD: [0x110F, 0x1165, 0x11C0], NFKC: [0xCEFD], NFKD: [0x110F, 0x1165, 0x11C0] }, +{ source: [0xCEFE], NFC: [0xCEFE], NFD: [0x110F, 0x1165, 0x11C1], NFKC: [0xCEFE], NFKD: [0x110F, 0x1165, 0x11C1] }, +{ source: [0xCEFF], NFC: [0xCEFF], NFD: [0x110F, 0x1165, 0x11C2], NFKC: [0xCEFF], NFKD: [0x110F, 0x1165, 0x11C2] }, +{ source: [0xCF00], NFC: [0xCF00], NFD: [0x110F, 0x1166], NFKC: [0xCF00], NFKD: [0x110F, 0x1166] }, +{ source: [0xCF01], NFC: [0xCF01], NFD: [0x110F, 0x1166, 0x11A8], NFKC: [0xCF01], NFKD: [0x110F, 0x1166, 0x11A8] }, +{ source: [0xCF02], NFC: [0xCF02], NFD: [0x110F, 0x1166, 0x11A9], NFKC: [0xCF02], NFKD: [0x110F, 0x1166, 0x11A9] }, +{ source: [0xCF03], NFC: [0xCF03], NFD: [0x110F, 0x1166, 0x11AA], NFKC: [0xCF03], NFKD: [0x110F, 0x1166, 0x11AA] }, +{ source: [0xCF04], NFC: [0xCF04], NFD: [0x110F, 0x1166, 0x11AB], NFKC: [0xCF04], NFKD: [0x110F, 0x1166, 0x11AB] }, +{ source: [0xCF05], NFC: [0xCF05], NFD: [0x110F, 0x1166, 0x11AC], NFKC: [0xCF05], NFKD: [0x110F, 0x1166, 0x11AC] }, +{ source: [0xCF06], NFC: [0xCF06], NFD: [0x110F, 0x1166, 0x11AD], NFKC: [0xCF06], NFKD: [0x110F, 0x1166, 0x11AD] }, +{ source: [0xCF07], NFC: [0xCF07], NFD: [0x110F, 0x1166, 0x11AE], NFKC: [0xCF07], NFKD: [0x110F, 0x1166, 0x11AE] }, +{ source: [0xCF08], NFC: [0xCF08], NFD: [0x110F, 0x1166, 0x11AF], NFKC: [0xCF08], NFKD: [0x110F, 0x1166, 0x11AF] }, +{ source: [0xCF09], NFC: [0xCF09], NFD: [0x110F, 0x1166, 0x11B0], NFKC: [0xCF09], NFKD: [0x110F, 0x1166, 0x11B0] }, +{ source: [0xCF0A], NFC: [0xCF0A], NFD: [0x110F, 0x1166, 0x11B1], NFKC: [0xCF0A], NFKD: [0x110F, 0x1166, 0x11B1] }, +{ source: [0xCF0B], NFC: [0xCF0B], NFD: [0x110F, 0x1166, 0x11B2], NFKC: [0xCF0B], NFKD: [0x110F, 0x1166, 0x11B2] }, +{ source: [0xCF0C], NFC: [0xCF0C], NFD: [0x110F, 0x1166, 0x11B3], NFKC: [0xCF0C], NFKD: [0x110F, 0x1166, 0x11B3] }, +{ source: [0xCF0D], NFC: [0xCF0D], NFD: [0x110F, 0x1166, 0x11B4], NFKC: [0xCF0D], NFKD: [0x110F, 0x1166, 0x11B4] }, +{ source: [0xCF0E], NFC: [0xCF0E], NFD: [0x110F, 0x1166, 0x11B5], NFKC: [0xCF0E], NFKD: [0x110F, 0x1166, 0x11B5] }, +{ source: [0xCF0F], NFC: [0xCF0F], NFD: [0x110F, 0x1166, 0x11B6], NFKC: [0xCF0F], NFKD: [0x110F, 0x1166, 0x11B6] }, +{ source: [0xCF10], NFC: [0xCF10], NFD: [0x110F, 0x1166, 0x11B7], NFKC: [0xCF10], NFKD: [0x110F, 0x1166, 0x11B7] }, +{ source: [0xCF11], NFC: [0xCF11], NFD: [0x110F, 0x1166, 0x11B8], NFKC: [0xCF11], NFKD: [0x110F, 0x1166, 0x11B8] }, +{ source: [0xCF12], NFC: [0xCF12], NFD: [0x110F, 0x1166, 0x11B9], NFKC: [0xCF12], NFKD: [0x110F, 0x1166, 0x11B9] }, +{ source: [0xCF13], NFC: [0xCF13], NFD: [0x110F, 0x1166, 0x11BA], NFKC: [0xCF13], NFKD: [0x110F, 0x1166, 0x11BA] }, +{ source: [0xCF14], NFC: [0xCF14], NFD: [0x110F, 0x1166, 0x11BB], NFKC: [0xCF14], NFKD: [0x110F, 0x1166, 0x11BB] }, +{ source: [0xCF15], NFC: [0xCF15], NFD: [0x110F, 0x1166, 0x11BC], NFKC: [0xCF15], NFKD: [0x110F, 0x1166, 0x11BC] }, +{ source: [0xCF16], NFC: [0xCF16], NFD: [0x110F, 0x1166, 0x11BD], NFKC: [0xCF16], NFKD: [0x110F, 0x1166, 0x11BD] }, +{ source: [0xCF17], NFC: [0xCF17], NFD: [0x110F, 0x1166, 0x11BE], NFKC: [0xCF17], NFKD: [0x110F, 0x1166, 0x11BE] }, +{ source: [0xCF18], NFC: [0xCF18], NFD: [0x110F, 0x1166, 0x11BF], NFKC: [0xCF18], NFKD: [0x110F, 0x1166, 0x11BF] }, +{ source: [0xCF19], NFC: [0xCF19], NFD: [0x110F, 0x1166, 0x11C0], NFKC: [0xCF19], NFKD: [0x110F, 0x1166, 0x11C0] }, +{ source: [0xCF1A], NFC: [0xCF1A], NFD: [0x110F, 0x1166, 0x11C1], NFKC: [0xCF1A], NFKD: [0x110F, 0x1166, 0x11C1] }, +{ source: [0xCF1B], NFC: [0xCF1B], NFD: [0x110F, 0x1166, 0x11C2], NFKC: [0xCF1B], NFKD: [0x110F, 0x1166, 0x11C2] }, +{ source: [0xCF1C], NFC: [0xCF1C], NFD: [0x110F, 0x1167], NFKC: [0xCF1C], NFKD: [0x110F, 0x1167] }, +{ source: [0xCF1D], NFC: [0xCF1D], NFD: [0x110F, 0x1167, 0x11A8], NFKC: [0xCF1D], NFKD: [0x110F, 0x1167, 0x11A8] }, +{ source: [0xCF1E], NFC: [0xCF1E], NFD: [0x110F, 0x1167, 0x11A9], NFKC: [0xCF1E], NFKD: [0x110F, 0x1167, 0x11A9] }, +{ source: [0xCF1F], NFC: [0xCF1F], NFD: [0x110F, 0x1167, 0x11AA], NFKC: [0xCF1F], NFKD: [0x110F, 0x1167, 0x11AA] }, +{ source: [0xCF20], NFC: [0xCF20], NFD: [0x110F, 0x1167, 0x11AB], NFKC: [0xCF20], NFKD: [0x110F, 0x1167, 0x11AB] }, +{ source: [0xCF21], NFC: [0xCF21], NFD: [0x110F, 0x1167, 0x11AC], NFKC: [0xCF21], NFKD: [0x110F, 0x1167, 0x11AC] }, +{ source: [0xCF22], NFC: [0xCF22], NFD: [0x110F, 0x1167, 0x11AD], NFKC: [0xCF22], NFKD: [0x110F, 0x1167, 0x11AD] }, +{ source: [0xCF23], NFC: [0xCF23], NFD: [0x110F, 0x1167, 0x11AE], NFKC: [0xCF23], NFKD: [0x110F, 0x1167, 0x11AE] }, +{ source: [0xCF24], NFC: [0xCF24], NFD: [0x110F, 0x1167, 0x11AF], NFKC: [0xCF24], NFKD: [0x110F, 0x1167, 0x11AF] }, +{ source: [0xCF25], NFC: [0xCF25], NFD: [0x110F, 0x1167, 0x11B0], NFKC: [0xCF25], NFKD: [0x110F, 0x1167, 0x11B0] }, +{ source: [0xCF26], NFC: [0xCF26], NFD: [0x110F, 0x1167, 0x11B1], NFKC: [0xCF26], NFKD: [0x110F, 0x1167, 0x11B1] }, +{ source: [0xCF27], NFC: [0xCF27], NFD: [0x110F, 0x1167, 0x11B2], NFKC: [0xCF27], NFKD: [0x110F, 0x1167, 0x11B2] }, +{ source: [0xCF28], NFC: [0xCF28], NFD: [0x110F, 0x1167, 0x11B3], NFKC: [0xCF28], NFKD: [0x110F, 0x1167, 0x11B3] }, +{ source: [0xCF29], NFC: [0xCF29], NFD: [0x110F, 0x1167, 0x11B4], NFKC: [0xCF29], NFKD: [0x110F, 0x1167, 0x11B4] }, +{ source: [0xCF2A], NFC: [0xCF2A], NFD: [0x110F, 0x1167, 0x11B5], NFKC: [0xCF2A], NFKD: [0x110F, 0x1167, 0x11B5] }, +{ source: [0xCF2B], NFC: [0xCF2B], NFD: [0x110F, 0x1167, 0x11B6], NFKC: [0xCF2B], NFKD: [0x110F, 0x1167, 0x11B6] }, +{ source: [0xCF2C], NFC: [0xCF2C], NFD: [0x110F, 0x1167, 0x11B7], NFKC: [0xCF2C], NFKD: [0x110F, 0x1167, 0x11B7] }, +{ source: [0xCF2D], NFC: [0xCF2D], NFD: [0x110F, 0x1167, 0x11B8], NFKC: [0xCF2D], NFKD: [0x110F, 0x1167, 0x11B8] }, +{ source: [0xCF2E], NFC: [0xCF2E], NFD: [0x110F, 0x1167, 0x11B9], NFKC: [0xCF2E], NFKD: [0x110F, 0x1167, 0x11B9] }, +{ source: [0xCF2F], NFC: [0xCF2F], NFD: [0x110F, 0x1167, 0x11BA], NFKC: [0xCF2F], NFKD: [0x110F, 0x1167, 0x11BA] }, +{ source: [0xCF30], NFC: [0xCF30], NFD: [0x110F, 0x1167, 0x11BB], NFKC: [0xCF30], NFKD: [0x110F, 0x1167, 0x11BB] }, +{ source: [0xCF31], NFC: [0xCF31], NFD: [0x110F, 0x1167, 0x11BC], NFKC: [0xCF31], NFKD: [0x110F, 0x1167, 0x11BC] }, +{ source: [0xCF32], NFC: [0xCF32], NFD: [0x110F, 0x1167, 0x11BD], NFKC: [0xCF32], NFKD: [0x110F, 0x1167, 0x11BD] }, +{ source: [0xCF33], NFC: [0xCF33], NFD: [0x110F, 0x1167, 0x11BE], NFKC: [0xCF33], NFKD: [0x110F, 0x1167, 0x11BE] }, +{ source: [0xCF34], NFC: [0xCF34], NFD: [0x110F, 0x1167, 0x11BF], NFKC: [0xCF34], NFKD: [0x110F, 0x1167, 0x11BF] }, +{ source: [0xCF35], NFC: [0xCF35], NFD: [0x110F, 0x1167, 0x11C0], NFKC: [0xCF35], NFKD: [0x110F, 0x1167, 0x11C0] }, +{ source: [0xCF36], NFC: [0xCF36], NFD: [0x110F, 0x1167, 0x11C1], NFKC: [0xCF36], NFKD: [0x110F, 0x1167, 0x11C1] }, +{ source: [0xCF37], NFC: [0xCF37], NFD: [0x110F, 0x1167, 0x11C2], NFKC: [0xCF37], NFKD: [0x110F, 0x1167, 0x11C2] }, +{ source: [0xCF38], NFC: [0xCF38], NFD: [0x110F, 0x1168], NFKC: [0xCF38], NFKD: [0x110F, 0x1168] }, +{ source: [0xCF39], NFC: [0xCF39], NFD: [0x110F, 0x1168, 0x11A8], NFKC: [0xCF39], NFKD: [0x110F, 0x1168, 0x11A8] }, +{ source: [0xCF3A], NFC: [0xCF3A], NFD: [0x110F, 0x1168, 0x11A9], NFKC: [0xCF3A], NFKD: [0x110F, 0x1168, 0x11A9] }, +{ source: [0xCF3B], NFC: [0xCF3B], NFD: [0x110F, 0x1168, 0x11AA], NFKC: [0xCF3B], NFKD: [0x110F, 0x1168, 0x11AA] }, +{ source: [0xCF3C], NFC: [0xCF3C], NFD: [0x110F, 0x1168, 0x11AB], NFKC: [0xCF3C], NFKD: [0x110F, 0x1168, 0x11AB] }, +{ source: [0xCF3D], NFC: [0xCF3D], NFD: [0x110F, 0x1168, 0x11AC], NFKC: [0xCF3D], NFKD: [0x110F, 0x1168, 0x11AC] }, +{ source: [0xCF3E], NFC: [0xCF3E], NFD: [0x110F, 0x1168, 0x11AD], NFKC: [0xCF3E], NFKD: [0x110F, 0x1168, 0x11AD] }, +{ source: [0xCF3F], NFC: [0xCF3F], NFD: [0x110F, 0x1168, 0x11AE], NFKC: [0xCF3F], NFKD: [0x110F, 0x1168, 0x11AE] }, +{ source: [0xCF40], NFC: [0xCF40], NFD: [0x110F, 0x1168, 0x11AF], NFKC: [0xCF40], NFKD: [0x110F, 0x1168, 0x11AF] }, +{ source: [0xCF41], NFC: [0xCF41], NFD: [0x110F, 0x1168, 0x11B0], NFKC: [0xCF41], NFKD: [0x110F, 0x1168, 0x11B0] }, +{ source: [0xCF42], NFC: [0xCF42], NFD: [0x110F, 0x1168, 0x11B1], NFKC: [0xCF42], NFKD: [0x110F, 0x1168, 0x11B1] }, +{ source: [0xCF43], NFC: [0xCF43], NFD: [0x110F, 0x1168, 0x11B2], NFKC: [0xCF43], NFKD: [0x110F, 0x1168, 0x11B2] }, +{ source: [0xCF44], NFC: [0xCF44], NFD: [0x110F, 0x1168, 0x11B3], NFKC: [0xCF44], NFKD: [0x110F, 0x1168, 0x11B3] }, +{ source: [0xCF45], NFC: [0xCF45], NFD: [0x110F, 0x1168, 0x11B4], NFKC: [0xCF45], NFKD: [0x110F, 0x1168, 0x11B4] }, +{ source: [0xCF46], NFC: [0xCF46], NFD: [0x110F, 0x1168, 0x11B5], NFKC: [0xCF46], NFKD: [0x110F, 0x1168, 0x11B5] }, +{ source: [0xCF47], NFC: [0xCF47], NFD: [0x110F, 0x1168, 0x11B6], NFKC: [0xCF47], NFKD: [0x110F, 0x1168, 0x11B6] }, +{ source: [0xCF48], NFC: [0xCF48], NFD: [0x110F, 0x1168, 0x11B7], NFKC: [0xCF48], NFKD: [0x110F, 0x1168, 0x11B7] }, +{ source: [0xCF49], NFC: [0xCF49], NFD: [0x110F, 0x1168, 0x11B8], NFKC: [0xCF49], NFKD: [0x110F, 0x1168, 0x11B8] }, +{ source: [0xCF4A], NFC: [0xCF4A], NFD: [0x110F, 0x1168, 0x11B9], NFKC: [0xCF4A], NFKD: [0x110F, 0x1168, 0x11B9] }, +{ source: [0xCF4B], NFC: [0xCF4B], NFD: [0x110F, 0x1168, 0x11BA], NFKC: [0xCF4B], NFKD: [0x110F, 0x1168, 0x11BA] }, +{ source: [0xCF4C], NFC: [0xCF4C], NFD: [0x110F, 0x1168, 0x11BB], NFKC: [0xCF4C], NFKD: [0x110F, 0x1168, 0x11BB] }, +{ source: [0xCF4D], NFC: [0xCF4D], NFD: [0x110F, 0x1168, 0x11BC], NFKC: [0xCF4D], NFKD: [0x110F, 0x1168, 0x11BC] }, +{ source: [0xCF4E], NFC: [0xCF4E], NFD: [0x110F, 0x1168, 0x11BD], NFKC: [0xCF4E], NFKD: [0x110F, 0x1168, 0x11BD] }, +{ source: [0xCF4F], NFC: [0xCF4F], NFD: [0x110F, 0x1168, 0x11BE], NFKC: [0xCF4F], NFKD: [0x110F, 0x1168, 0x11BE] }, +{ source: [0xCF50], NFC: [0xCF50], NFD: [0x110F, 0x1168, 0x11BF], NFKC: [0xCF50], NFKD: [0x110F, 0x1168, 0x11BF] }, +{ source: [0xCF51], NFC: [0xCF51], NFD: [0x110F, 0x1168, 0x11C0], NFKC: [0xCF51], NFKD: [0x110F, 0x1168, 0x11C0] }, +{ source: [0xCF52], NFC: [0xCF52], NFD: [0x110F, 0x1168, 0x11C1], NFKC: [0xCF52], NFKD: [0x110F, 0x1168, 0x11C1] }, +{ source: [0xCF53], NFC: [0xCF53], NFD: [0x110F, 0x1168, 0x11C2], NFKC: [0xCF53], NFKD: [0x110F, 0x1168, 0x11C2] }, +{ source: [0xCF54], NFC: [0xCF54], NFD: [0x110F, 0x1169], NFKC: [0xCF54], NFKD: [0x110F, 0x1169] }, +{ source: [0xCF55], NFC: [0xCF55], NFD: [0x110F, 0x1169, 0x11A8], NFKC: [0xCF55], NFKD: [0x110F, 0x1169, 0x11A8] }, +{ source: [0xCF56], NFC: [0xCF56], NFD: [0x110F, 0x1169, 0x11A9], NFKC: [0xCF56], NFKD: [0x110F, 0x1169, 0x11A9] }, +{ source: [0xCF57], NFC: [0xCF57], NFD: [0x110F, 0x1169, 0x11AA], NFKC: [0xCF57], NFKD: [0x110F, 0x1169, 0x11AA] }, +{ source: [0xCF58], NFC: [0xCF58], NFD: [0x110F, 0x1169, 0x11AB], NFKC: [0xCF58], NFKD: [0x110F, 0x1169, 0x11AB] }, +{ source: [0xCF59], NFC: [0xCF59], NFD: [0x110F, 0x1169, 0x11AC], NFKC: [0xCF59], NFKD: [0x110F, 0x1169, 0x11AC] }, +{ source: [0xCF5A], NFC: [0xCF5A], NFD: [0x110F, 0x1169, 0x11AD], NFKC: [0xCF5A], NFKD: [0x110F, 0x1169, 0x11AD] }, +{ source: [0xCF5B], NFC: [0xCF5B], NFD: [0x110F, 0x1169, 0x11AE], NFKC: [0xCF5B], NFKD: [0x110F, 0x1169, 0x11AE] }, +{ source: [0xCF5C], NFC: [0xCF5C], NFD: [0x110F, 0x1169, 0x11AF], NFKC: [0xCF5C], NFKD: [0x110F, 0x1169, 0x11AF] }, +{ source: [0xCF5D], NFC: [0xCF5D], NFD: [0x110F, 0x1169, 0x11B0], NFKC: [0xCF5D], NFKD: [0x110F, 0x1169, 0x11B0] }, +{ source: [0xCF5E], NFC: [0xCF5E], NFD: [0x110F, 0x1169, 0x11B1], NFKC: [0xCF5E], NFKD: [0x110F, 0x1169, 0x11B1] }, +{ source: [0xCF5F], NFC: [0xCF5F], NFD: [0x110F, 0x1169, 0x11B2], NFKC: [0xCF5F], NFKD: [0x110F, 0x1169, 0x11B2] }, +{ source: [0xCF60], NFC: [0xCF60], NFD: [0x110F, 0x1169, 0x11B3], NFKC: [0xCF60], NFKD: [0x110F, 0x1169, 0x11B3] }, +{ source: [0xCF61], NFC: [0xCF61], NFD: [0x110F, 0x1169, 0x11B4], NFKC: [0xCF61], NFKD: [0x110F, 0x1169, 0x11B4] }, +{ source: [0xCF62], NFC: [0xCF62], NFD: [0x110F, 0x1169, 0x11B5], NFKC: [0xCF62], NFKD: [0x110F, 0x1169, 0x11B5] }, +{ source: [0xCF63], NFC: [0xCF63], NFD: [0x110F, 0x1169, 0x11B6], NFKC: [0xCF63], NFKD: [0x110F, 0x1169, 0x11B6] }, +{ source: [0xCF64], NFC: [0xCF64], NFD: [0x110F, 0x1169, 0x11B7], NFKC: [0xCF64], NFKD: [0x110F, 0x1169, 0x11B7] }, +{ source: [0xCF65], NFC: [0xCF65], NFD: [0x110F, 0x1169, 0x11B8], NFKC: [0xCF65], NFKD: [0x110F, 0x1169, 0x11B8] }, +{ source: [0xCF66], NFC: [0xCF66], NFD: [0x110F, 0x1169, 0x11B9], NFKC: [0xCF66], NFKD: [0x110F, 0x1169, 0x11B9] }, +{ source: [0xCF67], NFC: [0xCF67], NFD: [0x110F, 0x1169, 0x11BA], NFKC: [0xCF67], NFKD: [0x110F, 0x1169, 0x11BA] }, +{ source: [0xCF68], NFC: [0xCF68], NFD: [0x110F, 0x1169, 0x11BB], NFKC: [0xCF68], NFKD: [0x110F, 0x1169, 0x11BB] }, +{ source: [0xCF69], NFC: [0xCF69], NFD: [0x110F, 0x1169, 0x11BC], NFKC: [0xCF69], NFKD: [0x110F, 0x1169, 0x11BC] }, +{ source: [0xCF6A], NFC: [0xCF6A], NFD: [0x110F, 0x1169, 0x11BD], NFKC: [0xCF6A], NFKD: [0x110F, 0x1169, 0x11BD] }, +{ source: [0xCF6B], NFC: [0xCF6B], NFD: [0x110F, 0x1169, 0x11BE], NFKC: [0xCF6B], NFKD: [0x110F, 0x1169, 0x11BE] }, +{ source: [0xCF6C], NFC: [0xCF6C], NFD: [0x110F, 0x1169, 0x11BF], NFKC: [0xCF6C], NFKD: [0x110F, 0x1169, 0x11BF] }, +{ source: [0xCF6D], NFC: [0xCF6D], NFD: [0x110F, 0x1169, 0x11C0], NFKC: [0xCF6D], NFKD: [0x110F, 0x1169, 0x11C0] }, +{ source: [0xCF6E], NFC: [0xCF6E], NFD: [0x110F, 0x1169, 0x11C1], NFKC: [0xCF6E], NFKD: [0x110F, 0x1169, 0x11C1] }, +{ source: [0xCF6F], NFC: [0xCF6F], NFD: [0x110F, 0x1169, 0x11C2], NFKC: [0xCF6F], NFKD: [0x110F, 0x1169, 0x11C2] }, +{ source: [0xCF70], NFC: [0xCF70], NFD: [0x110F, 0x116A], NFKC: [0xCF70], NFKD: [0x110F, 0x116A] }, +{ source: [0xCF71], NFC: [0xCF71], NFD: [0x110F, 0x116A, 0x11A8], NFKC: [0xCF71], NFKD: [0x110F, 0x116A, 0x11A8] }, +{ source: [0xCF72], NFC: [0xCF72], NFD: [0x110F, 0x116A, 0x11A9], NFKC: [0xCF72], NFKD: [0x110F, 0x116A, 0x11A9] }, +{ source: [0xCF73], NFC: [0xCF73], NFD: [0x110F, 0x116A, 0x11AA], NFKC: [0xCF73], NFKD: [0x110F, 0x116A, 0x11AA] }, +{ source: [0xCF74], NFC: [0xCF74], NFD: [0x110F, 0x116A, 0x11AB], NFKC: [0xCF74], NFKD: [0x110F, 0x116A, 0x11AB] }, +{ source: [0xCF75], NFC: [0xCF75], NFD: [0x110F, 0x116A, 0x11AC], NFKC: [0xCF75], NFKD: [0x110F, 0x116A, 0x11AC] }, +{ source: [0xCF76], NFC: [0xCF76], NFD: [0x110F, 0x116A, 0x11AD], NFKC: [0xCF76], NFKD: [0x110F, 0x116A, 0x11AD] }, +{ source: [0xCF77], NFC: [0xCF77], NFD: [0x110F, 0x116A, 0x11AE], NFKC: [0xCF77], NFKD: [0x110F, 0x116A, 0x11AE] }, +{ source: [0xCF78], NFC: [0xCF78], NFD: [0x110F, 0x116A, 0x11AF], NFKC: [0xCF78], NFKD: [0x110F, 0x116A, 0x11AF] }, +{ source: [0xCF79], NFC: [0xCF79], NFD: [0x110F, 0x116A, 0x11B0], NFKC: [0xCF79], NFKD: [0x110F, 0x116A, 0x11B0] }, +{ source: [0xCF7A], NFC: [0xCF7A], NFD: [0x110F, 0x116A, 0x11B1], NFKC: [0xCF7A], NFKD: [0x110F, 0x116A, 0x11B1] }, +{ source: [0xCF7B], NFC: [0xCF7B], NFD: [0x110F, 0x116A, 0x11B2], NFKC: [0xCF7B], NFKD: [0x110F, 0x116A, 0x11B2] }, +{ source: [0xCF7C], NFC: [0xCF7C], NFD: [0x110F, 0x116A, 0x11B3], NFKC: [0xCF7C], NFKD: [0x110F, 0x116A, 0x11B3] }, +{ source: [0xCF7D], NFC: [0xCF7D], NFD: [0x110F, 0x116A, 0x11B4], NFKC: [0xCF7D], NFKD: [0x110F, 0x116A, 0x11B4] }, +{ source: [0xCF7E], NFC: [0xCF7E], NFD: [0x110F, 0x116A, 0x11B5], NFKC: [0xCF7E], NFKD: [0x110F, 0x116A, 0x11B5] }, +{ source: [0xCF7F], NFC: [0xCF7F], NFD: [0x110F, 0x116A, 0x11B6], NFKC: [0xCF7F], NFKD: [0x110F, 0x116A, 0x11B6] }, +{ source: [0xCF80], NFC: [0xCF80], NFD: [0x110F, 0x116A, 0x11B7], NFKC: [0xCF80], NFKD: [0x110F, 0x116A, 0x11B7] }, +{ source: [0xCF81], NFC: [0xCF81], NFD: [0x110F, 0x116A, 0x11B8], NFKC: [0xCF81], NFKD: [0x110F, 0x116A, 0x11B8] }, +{ source: [0xCF82], NFC: [0xCF82], NFD: [0x110F, 0x116A, 0x11B9], NFKC: [0xCF82], NFKD: [0x110F, 0x116A, 0x11B9] }, +{ source: [0xCF83], NFC: [0xCF83], NFD: [0x110F, 0x116A, 0x11BA], NFKC: [0xCF83], NFKD: [0x110F, 0x116A, 0x11BA] }, +{ source: [0xCF84], NFC: [0xCF84], NFD: [0x110F, 0x116A, 0x11BB], NFKC: [0xCF84], NFKD: [0x110F, 0x116A, 0x11BB] }, +{ source: [0xCF85], NFC: [0xCF85], NFD: [0x110F, 0x116A, 0x11BC], NFKC: [0xCF85], NFKD: [0x110F, 0x116A, 0x11BC] }, +{ source: [0xCF86], NFC: [0xCF86], NFD: [0x110F, 0x116A, 0x11BD], NFKC: [0xCF86], NFKD: [0x110F, 0x116A, 0x11BD] }, +{ source: [0xCF87], NFC: [0xCF87], NFD: [0x110F, 0x116A, 0x11BE], NFKC: [0xCF87], NFKD: [0x110F, 0x116A, 0x11BE] }, +{ source: [0xCF88], NFC: [0xCF88], NFD: [0x110F, 0x116A, 0x11BF], NFKC: [0xCF88], NFKD: [0x110F, 0x116A, 0x11BF] }, +{ source: [0xCF89], NFC: [0xCF89], NFD: [0x110F, 0x116A, 0x11C0], NFKC: [0xCF89], NFKD: [0x110F, 0x116A, 0x11C0] }, +{ source: [0xCF8A], NFC: [0xCF8A], NFD: [0x110F, 0x116A, 0x11C1], NFKC: [0xCF8A], NFKD: [0x110F, 0x116A, 0x11C1] }, +{ source: [0xCF8B], NFC: [0xCF8B], NFD: [0x110F, 0x116A, 0x11C2], NFKC: [0xCF8B], NFKD: [0x110F, 0x116A, 0x11C2] }, +{ source: [0xCF8C], NFC: [0xCF8C], NFD: [0x110F, 0x116B], NFKC: [0xCF8C], NFKD: [0x110F, 0x116B] }, +{ source: [0xCF8D], NFC: [0xCF8D], NFD: [0x110F, 0x116B, 0x11A8], NFKC: [0xCF8D], NFKD: [0x110F, 0x116B, 0x11A8] }, +{ source: [0xCF8E], NFC: [0xCF8E], NFD: [0x110F, 0x116B, 0x11A9], NFKC: [0xCF8E], NFKD: [0x110F, 0x116B, 0x11A9] }, +{ source: [0xCF8F], NFC: [0xCF8F], NFD: [0x110F, 0x116B, 0x11AA], NFKC: [0xCF8F], NFKD: [0x110F, 0x116B, 0x11AA] }, +{ source: [0xCF90], NFC: [0xCF90], NFD: [0x110F, 0x116B, 0x11AB], NFKC: [0xCF90], NFKD: [0x110F, 0x116B, 0x11AB] }, +{ source: [0xCF91], NFC: [0xCF91], NFD: [0x110F, 0x116B, 0x11AC], NFKC: [0xCF91], NFKD: [0x110F, 0x116B, 0x11AC] }, +{ source: [0xCF92], NFC: [0xCF92], NFD: [0x110F, 0x116B, 0x11AD], NFKC: [0xCF92], NFKD: [0x110F, 0x116B, 0x11AD] }, +{ source: [0xCF93], NFC: [0xCF93], NFD: [0x110F, 0x116B, 0x11AE], NFKC: [0xCF93], NFKD: [0x110F, 0x116B, 0x11AE] }, +{ source: [0xCF94], NFC: [0xCF94], NFD: [0x110F, 0x116B, 0x11AF], NFKC: [0xCF94], NFKD: [0x110F, 0x116B, 0x11AF] }, +{ source: [0xCF95], NFC: [0xCF95], NFD: [0x110F, 0x116B, 0x11B0], NFKC: [0xCF95], NFKD: [0x110F, 0x116B, 0x11B0] }, +{ source: [0xCF96], NFC: [0xCF96], NFD: [0x110F, 0x116B, 0x11B1], NFKC: [0xCF96], NFKD: [0x110F, 0x116B, 0x11B1] }, +{ source: [0xCF97], NFC: [0xCF97], NFD: [0x110F, 0x116B, 0x11B2], NFKC: [0xCF97], NFKD: [0x110F, 0x116B, 0x11B2] }, +{ source: [0xCF98], NFC: [0xCF98], NFD: [0x110F, 0x116B, 0x11B3], NFKC: [0xCF98], NFKD: [0x110F, 0x116B, 0x11B3] }, +{ source: [0xCF99], NFC: [0xCF99], NFD: [0x110F, 0x116B, 0x11B4], NFKC: [0xCF99], NFKD: [0x110F, 0x116B, 0x11B4] }, +{ source: [0xCF9A], NFC: [0xCF9A], NFD: [0x110F, 0x116B, 0x11B5], NFKC: [0xCF9A], NFKD: [0x110F, 0x116B, 0x11B5] }, +{ source: [0xCF9B], NFC: [0xCF9B], NFD: [0x110F, 0x116B, 0x11B6], NFKC: [0xCF9B], NFKD: [0x110F, 0x116B, 0x11B6] }, +{ source: [0xCF9C], NFC: [0xCF9C], NFD: [0x110F, 0x116B, 0x11B7], NFKC: [0xCF9C], NFKD: [0x110F, 0x116B, 0x11B7] }, +{ source: [0xCF9D], NFC: [0xCF9D], NFD: [0x110F, 0x116B, 0x11B8], NFKC: [0xCF9D], NFKD: [0x110F, 0x116B, 0x11B8] }, +{ source: [0xCF9E], NFC: [0xCF9E], NFD: [0x110F, 0x116B, 0x11B9], NFKC: [0xCF9E], NFKD: [0x110F, 0x116B, 0x11B9] }, +{ source: [0xCF9F], NFC: [0xCF9F], NFD: [0x110F, 0x116B, 0x11BA], NFKC: [0xCF9F], NFKD: [0x110F, 0x116B, 0x11BA] }, +{ source: [0xCFA0], NFC: [0xCFA0], NFD: [0x110F, 0x116B, 0x11BB], NFKC: [0xCFA0], NFKD: [0x110F, 0x116B, 0x11BB] }, +{ source: [0xCFA1], NFC: [0xCFA1], NFD: [0x110F, 0x116B, 0x11BC], NFKC: [0xCFA1], NFKD: [0x110F, 0x116B, 0x11BC] }, +{ source: [0xCFA2], NFC: [0xCFA2], NFD: [0x110F, 0x116B, 0x11BD], NFKC: [0xCFA2], NFKD: [0x110F, 0x116B, 0x11BD] }, +{ source: [0xCFA3], NFC: [0xCFA3], NFD: [0x110F, 0x116B, 0x11BE], NFKC: [0xCFA3], NFKD: [0x110F, 0x116B, 0x11BE] }, +{ source: [0xCFA4], NFC: [0xCFA4], NFD: [0x110F, 0x116B, 0x11BF], NFKC: [0xCFA4], NFKD: [0x110F, 0x116B, 0x11BF] }, +{ source: [0xCFA5], NFC: [0xCFA5], NFD: [0x110F, 0x116B, 0x11C0], NFKC: [0xCFA5], NFKD: [0x110F, 0x116B, 0x11C0] }, +{ source: [0xCFA6], NFC: [0xCFA6], NFD: [0x110F, 0x116B, 0x11C1], NFKC: [0xCFA6], NFKD: [0x110F, 0x116B, 0x11C1] }, +{ source: [0xCFA7], NFC: [0xCFA7], NFD: [0x110F, 0x116B, 0x11C2], NFKC: [0xCFA7], NFKD: [0x110F, 0x116B, 0x11C2] }, +{ source: [0xCFA8], NFC: [0xCFA8], NFD: [0x110F, 0x116C], NFKC: [0xCFA8], NFKD: [0x110F, 0x116C] }, +{ source: [0xCFA9], NFC: [0xCFA9], NFD: [0x110F, 0x116C, 0x11A8], NFKC: [0xCFA9], NFKD: [0x110F, 0x116C, 0x11A8] }, +{ source: [0xCFAA], NFC: [0xCFAA], NFD: [0x110F, 0x116C, 0x11A9], NFKC: [0xCFAA], NFKD: [0x110F, 0x116C, 0x11A9] }, +{ source: [0xCFAB], NFC: [0xCFAB], NFD: [0x110F, 0x116C, 0x11AA], NFKC: [0xCFAB], NFKD: [0x110F, 0x116C, 0x11AA] }, +{ source: [0xCFAC], NFC: [0xCFAC], NFD: [0x110F, 0x116C, 0x11AB], NFKC: [0xCFAC], NFKD: [0x110F, 0x116C, 0x11AB] }, +{ source: [0xCFAD], NFC: [0xCFAD], NFD: [0x110F, 0x116C, 0x11AC], NFKC: [0xCFAD], NFKD: [0x110F, 0x116C, 0x11AC] }, +{ source: [0xCFAE], NFC: [0xCFAE], NFD: [0x110F, 0x116C, 0x11AD], NFKC: [0xCFAE], NFKD: [0x110F, 0x116C, 0x11AD] }, +{ source: [0xCFAF], NFC: [0xCFAF], NFD: [0x110F, 0x116C, 0x11AE], NFKC: [0xCFAF], NFKD: [0x110F, 0x116C, 0x11AE] }, +{ source: [0xCFB0], NFC: [0xCFB0], NFD: [0x110F, 0x116C, 0x11AF], NFKC: [0xCFB0], NFKD: [0x110F, 0x116C, 0x11AF] }, +{ source: [0xCFB1], NFC: [0xCFB1], NFD: [0x110F, 0x116C, 0x11B0], NFKC: [0xCFB1], NFKD: [0x110F, 0x116C, 0x11B0] }, +{ source: [0xCFB2], NFC: [0xCFB2], NFD: [0x110F, 0x116C, 0x11B1], NFKC: [0xCFB2], NFKD: [0x110F, 0x116C, 0x11B1] }, +{ source: [0xCFB3], NFC: [0xCFB3], NFD: [0x110F, 0x116C, 0x11B2], NFKC: [0xCFB3], NFKD: [0x110F, 0x116C, 0x11B2] }, +{ source: [0xCFB4], NFC: [0xCFB4], NFD: [0x110F, 0x116C, 0x11B3], NFKC: [0xCFB4], NFKD: [0x110F, 0x116C, 0x11B3] }, +{ source: [0xCFB5], NFC: [0xCFB5], NFD: [0x110F, 0x116C, 0x11B4], NFKC: [0xCFB5], NFKD: [0x110F, 0x116C, 0x11B4] }, +{ source: [0xCFB6], NFC: [0xCFB6], NFD: [0x110F, 0x116C, 0x11B5], NFKC: [0xCFB6], NFKD: [0x110F, 0x116C, 0x11B5] }, +{ source: [0xCFB7], NFC: [0xCFB7], NFD: [0x110F, 0x116C, 0x11B6], NFKC: [0xCFB7], NFKD: [0x110F, 0x116C, 0x11B6] }, +{ source: [0xCFB8], NFC: [0xCFB8], NFD: [0x110F, 0x116C, 0x11B7], NFKC: [0xCFB8], NFKD: [0x110F, 0x116C, 0x11B7] }, +{ source: [0xCFB9], NFC: [0xCFB9], NFD: [0x110F, 0x116C, 0x11B8], NFKC: [0xCFB9], NFKD: [0x110F, 0x116C, 0x11B8] }, +{ source: [0xCFBA], NFC: [0xCFBA], NFD: [0x110F, 0x116C, 0x11B9], NFKC: [0xCFBA], NFKD: [0x110F, 0x116C, 0x11B9] }, +{ source: [0xCFBB], NFC: [0xCFBB], NFD: [0x110F, 0x116C, 0x11BA], NFKC: [0xCFBB], NFKD: [0x110F, 0x116C, 0x11BA] }, +{ source: [0xCFBC], NFC: [0xCFBC], NFD: [0x110F, 0x116C, 0x11BB], NFKC: [0xCFBC], NFKD: [0x110F, 0x116C, 0x11BB] }, +{ source: [0xCFBD], NFC: [0xCFBD], NFD: [0x110F, 0x116C, 0x11BC], NFKC: [0xCFBD], NFKD: [0x110F, 0x116C, 0x11BC] }, +{ source: [0xCFBE], NFC: [0xCFBE], NFD: [0x110F, 0x116C, 0x11BD], NFKC: [0xCFBE], NFKD: [0x110F, 0x116C, 0x11BD] }, +{ source: [0xCFBF], NFC: [0xCFBF], NFD: [0x110F, 0x116C, 0x11BE], NFKC: [0xCFBF], NFKD: [0x110F, 0x116C, 0x11BE] }, +{ source: [0xCFC0], NFC: [0xCFC0], NFD: [0x110F, 0x116C, 0x11BF], NFKC: [0xCFC0], NFKD: [0x110F, 0x116C, 0x11BF] }, +{ source: [0xCFC1], NFC: [0xCFC1], NFD: [0x110F, 0x116C, 0x11C0], NFKC: [0xCFC1], NFKD: [0x110F, 0x116C, 0x11C0] }, +{ source: [0xCFC2], NFC: [0xCFC2], NFD: [0x110F, 0x116C, 0x11C1], NFKC: [0xCFC2], NFKD: [0x110F, 0x116C, 0x11C1] }, +{ source: [0xCFC3], NFC: [0xCFC3], NFD: [0x110F, 0x116C, 0x11C2], NFKC: [0xCFC3], NFKD: [0x110F, 0x116C, 0x11C2] }, +{ source: [0xCFC4], NFC: [0xCFC4], NFD: [0x110F, 0x116D], NFKC: [0xCFC4], NFKD: [0x110F, 0x116D] }, +{ source: [0xCFC5], NFC: [0xCFC5], NFD: [0x110F, 0x116D, 0x11A8], NFKC: [0xCFC5], NFKD: [0x110F, 0x116D, 0x11A8] }, +{ source: [0xCFC6], NFC: [0xCFC6], NFD: [0x110F, 0x116D, 0x11A9], NFKC: [0xCFC6], NFKD: [0x110F, 0x116D, 0x11A9] }, +{ source: [0xCFC7], NFC: [0xCFC7], NFD: [0x110F, 0x116D, 0x11AA], NFKC: [0xCFC7], NFKD: [0x110F, 0x116D, 0x11AA] }, +{ source: [0xCFC8], NFC: [0xCFC8], NFD: [0x110F, 0x116D, 0x11AB], NFKC: [0xCFC8], NFKD: [0x110F, 0x116D, 0x11AB] }, +{ source: [0xCFC9], NFC: [0xCFC9], NFD: [0x110F, 0x116D, 0x11AC], NFKC: [0xCFC9], NFKD: [0x110F, 0x116D, 0x11AC] }, +{ source: [0xCFCA], NFC: [0xCFCA], NFD: [0x110F, 0x116D, 0x11AD], NFKC: [0xCFCA], NFKD: [0x110F, 0x116D, 0x11AD] }, +{ source: [0xCFCB], NFC: [0xCFCB], NFD: [0x110F, 0x116D, 0x11AE], NFKC: [0xCFCB], NFKD: [0x110F, 0x116D, 0x11AE] }, +{ source: [0xCFCC], NFC: [0xCFCC], NFD: [0x110F, 0x116D, 0x11AF], NFKC: [0xCFCC], NFKD: [0x110F, 0x116D, 0x11AF] }, +{ source: [0xCFCD], NFC: [0xCFCD], NFD: [0x110F, 0x116D, 0x11B0], NFKC: [0xCFCD], NFKD: [0x110F, 0x116D, 0x11B0] }, +{ source: [0xCFCE], NFC: [0xCFCE], NFD: [0x110F, 0x116D, 0x11B1], NFKC: [0xCFCE], NFKD: [0x110F, 0x116D, 0x11B1] }, +{ source: [0xCFCF], NFC: [0xCFCF], NFD: [0x110F, 0x116D, 0x11B2], NFKC: [0xCFCF], NFKD: [0x110F, 0x116D, 0x11B2] }, +{ source: [0xCFD0], NFC: [0xCFD0], NFD: [0x110F, 0x116D, 0x11B3], NFKC: [0xCFD0], NFKD: [0x110F, 0x116D, 0x11B3] }, +{ source: [0xCFD1], NFC: [0xCFD1], NFD: [0x110F, 0x116D, 0x11B4], NFKC: [0xCFD1], NFKD: [0x110F, 0x116D, 0x11B4] }, +{ source: [0xCFD2], NFC: [0xCFD2], NFD: [0x110F, 0x116D, 0x11B5], NFKC: [0xCFD2], NFKD: [0x110F, 0x116D, 0x11B5] }, +{ source: [0xCFD3], NFC: [0xCFD3], NFD: [0x110F, 0x116D, 0x11B6], NFKC: [0xCFD3], NFKD: [0x110F, 0x116D, 0x11B6] }, +{ source: [0xCFD4], NFC: [0xCFD4], NFD: [0x110F, 0x116D, 0x11B7], NFKC: [0xCFD4], NFKD: [0x110F, 0x116D, 0x11B7] }, +{ source: [0xCFD5], NFC: [0xCFD5], NFD: [0x110F, 0x116D, 0x11B8], NFKC: [0xCFD5], NFKD: [0x110F, 0x116D, 0x11B8] }, +{ source: [0xCFD6], NFC: [0xCFD6], NFD: [0x110F, 0x116D, 0x11B9], NFKC: [0xCFD6], NFKD: [0x110F, 0x116D, 0x11B9] }, +{ source: [0xCFD7], NFC: [0xCFD7], NFD: [0x110F, 0x116D, 0x11BA], NFKC: [0xCFD7], NFKD: [0x110F, 0x116D, 0x11BA] }, +{ source: [0xCFD8], NFC: [0xCFD8], NFD: [0x110F, 0x116D, 0x11BB], NFKC: [0xCFD8], NFKD: [0x110F, 0x116D, 0x11BB] }, +{ source: [0xCFD9], NFC: [0xCFD9], NFD: [0x110F, 0x116D, 0x11BC], NFKC: [0xCFD9], NFKD: [0x110F, 0x116D, 0x11BC] }, +{ source: [0xCFDA], NFC: [0xCFDA], NFD: [0x110F, 0x116D, 0x11BD], NFKC: [0xCFDA], NFKD: [0x110F, 0x116D, 0x11BD] }, +{ source: [0xCFDB], NFC: [0xCFDB], NFD: [0x110F, 0x116D, 0x11BE], NFKC: [0xCFDB], NFKD: [0x110F, 0x116D, 0x11BE] }, +{ source: [0xCFDC], NFC: [0xCFDC], NFD: [0x110F, 0x116D, 0x11BF], NFKC: [0xCFDC], NFKD: [0x110F, 0x116D, 0x11BF] }, +{ source: [0xCFDD], NFC: [0xCFDD], NFD: [0x110F, 0x116D, 0x11C0], NFKC: [0xCFDD], NFKD: [0x110F, 0x116D, 0x11C0] }, +{ source: [0xCFDE], NFC: [0xCFDE], NFD: [0x110F, 0x116D, 0x11C1], NFKC: [0xCFDE], NFKD: [0x110F, 0x116D, 0x11C1] }, +{ source: [0xCFDF], NFC: [0xCFDF], NFD: [0x110F, 0x116D, 0x11C2], NFKC: [0xCFDF], NFKD: [0x110F, 0x116D, 0x11C2] }, +{ source: [0xCFE0], NFC: [0xCFE0], NFD: [0x110F, 0x116E], NFKC: [0xCFE0], NFKD: [0x110F, 0x116E] }, +{ source: [0xCFE1], NFC: [0xCFE1], NFD: [0x110F, 0x116E, 0x11A8], NFKC: [0xCFE1], NFKD: [0x110F, 0x116E, 0x11A8] }, +{ source: [0xCFE2], NFC: [0xCFE2], NFD: [0x110F, 0x116E, 0x11A9], NFKC: [0xCFE2], NFKD: [0x110F, 0x116E, 0x11A9] }, +{ source: [0xCFE3], NFC: [0xCFE3], NFD: [0x110F, 0x116E, 0x11AA], NFKC: [0xCFE3], NFKD: [0x110F, 0x116E, 0x11AA] }, +{ source: [0xCFE4], NFC: [0xCFE4], NFD: [0x110F, 0x116E, 0x11AB], NFKC: [0xCFE4], NFKD: [0x110F, 0x116E, 0x11AB] }, +{ source: [0xCFE5], NFC: [0xCFE5], NFD: [0x110F, 0x116E, 0x11AC], NFKC: [0xCFE5], NFKD: [0x110F, 0x116E, 0x11AC] }, +{ source: [0xCFE6], NFC: [0xCFE6], NFD: [0x110F, 0x116E, 0x11AD], NFKC: [0xCFE6], NFKD: [0x110F, 0x116E, 0x11AD] }, +{ source: [0xCFE7], NFC: [0xCFE7], NFD: [0x110F, 0x116E, 0x11AE], NFKC: [0xCFE7], NFKD: [0x110F, 0x116E, 0x11AE] }, +{ source: [0xCFE8], NFC: [0xCFE8], NFD: [0x110F, 0x116E, 0x11AF], NFKC: [0xCFE8], NFKD: [0x110F, 0x116E, 0x11AF] }, +{ source: [0xCFE9], NFC: [0xCFE9], NFD: [0x110F, 0x116E, 0x11B0], NFKC: [0xCFE9], NFKD: [0x110F, 0x116E, 0x11B0] }, +{ source: [0xCFEA], NFC: [0xCFEA], NFD: [0x110F, 0x116E, 0x11B1], NFKC: [0xCFEA], NFKD: [0x110F, 0x116E, 0x11B1] }, +{ source: [0xCFEB], NFC: [0xCFEB], NFD: [0x110F, 0x116E, 0x11B2], NFKC: [0xCFEB], NFKD: [0x110F, 0x116E, 0x11B2] }, +{ source: [0xCFEC], NFC: [0xCFEC], NFD: [0x110F, 0x116E, 0x11B3], NFKC: [0xCFEC], NFKD: [0x110F, 0x116E, 0x11B3] }, +{ source: [0xCFED], NFC: [0xCFED], NFD: [0x110F, 0x116E, 0x11B4], NFKC: [0xCFED], NFKD: [0x110F, 0x116E, 0x11B4] }, +{ source: [0xCFEE], NFC: [0xCFEE], NFD: [0x110F, 0x116E, 0x11B5], NFKC: [0xCFEE], NFKD: [0x110F, 0x116E, 0x11B5] }, +{ source: [0xCFEF], NFC: [0xCFEF], NFD: [0x110F, 0x116E, 0x11B6], NFKC: [0xCFEF], NFKD: [0x110F, 0x116E, 0x11B6] }, +{ source: [0xCFF0], NFC: [0xCFF0], NFD: [0x110F, 0x116E, 0x11B7], NFKC: [0xCFF0], NFKD: [0x110F, 0x116E, 0x11B7] }, +{ source: [0xCFF1], NFC: [0xCFF1], NFD: [0x110F, 0x116E, 0x11B8], NFKC: [0xCFF1], NFKD: [0x110F, 0x116E, 0x11B8] }, +{ source: [0xCFF2], NFC: [0xCFF2], NFD: [0x110F, 0x116E, 0x11B9], NFKC: [0xCFF2], NFKD: [0x110F, 0x116E, 0x11B9] }, +{ source: [0xCFF3], NFC: [0xCFF3], NFD: [0x110F, 0x116E, 0x11BA], NFKC: [0xCFF3], NFKD: [0x110F, 0x116E, 0x11BA] }, +{ source: [0xCFF4], NFC: [0xCFF4], NFD: [0x110F, 0x116E, 0x11BB], NFKC: [0xCFF4], NFKD: [0x110F, 0x116E, 0x11BB] }, +{ source: [0xCFF5], NFC: [0xCFF5], NFD: [0x110F, 0x116E, 0x11BC], NFKC: [0xCFF5], NFKD: [0x110F, 0x116E, 0x11BC] }, +{ source: [0xCFF6], NFC: [0xCFF6], NFD: [0x110F, 0x116E, 0x11BD], NFKC: [0xCFF6], NFKD: [0x110F, 0x116E, 0x11BD] }, +{ source: [0xCFF7], NFC: [0xCFF7], NFD: [0x110F, 0x116E, 0x11BE], NFKC: [0xCFF7], NFKD: [0x110F, 0x116E, 0x11BE] }, +{ source: [0xCFF8], NFC: [0xCFF8], NFD: [0x110F, 0x116E, 0x11BF], NFKC: [0xCFF8], NFKD: [0x110F, 0x116E, 0x11BF] }, +{ source: [0xCFF9], NFC: [0xCFF9], NFD: [0x110F, 0x116E, 0x11C0], NFKC: [0xCFF9], NFKD: [0x110F, 0x116E, 0x11C0] }, +{ source: [0xCFFA], NFC: [0xCFFA], NFD: [0x110F, 0x116E, 0x11C1], NFKC: [0xCFFA], NFKD: [0x110F, 0x116E, 0x11C1] }, +{ source: [0xCFFB], NFC: [0xCFFB], NFD: [0x110F, 0x116E, 0x11C2], NFKC: [0xCFFB], NFKD: [0x110F, 0x116E, 0x11C2] }, +{ source: [0xCFFC], NFC: [0xCFFC], NFD: [0x110F, 0x116F], NFKC: [0xCFFC], NFKD: [0x110F, 0x116F] }, +{ source: [0xCFFD], NFC: [0xCFFD], NFD: [0x110F, 0x116F, 0x11A8], NFKC: [0xCFFD], NFKD: [0x110F, 0x116F, 0x11A8] }, +{ source: [0xCFFE], NFC: [0xCFFE], NFD: [0x110F, 0x116F, 0x11A9], NFKC: [0xCFFE], NFKD: [0x110F, 0x116F, 0x11A9] }, +{ source: [0xCFFF], NFC: [0xCFFF], NFD: [0x110F, 0x116F, 0x11AA], NFKC: [0xCFFF], NFKD: [0x110F, 0x116F, 0x11AA] }, +{ source: [0xD000], NFC: [0xD000], NFD: [0x110F, 0x116F, 0x11AB], NFKC: [0xD000], NFKD: [0x110F, 0x116F, 0x11AB] }, +{ source: [0xD001], NFC: [0xD001], NFD: [0x110F, 0x116F, 0x11AC], NFKC: [0xD001], NFKD: [0x110F, 0x116F, 0x11AC] }, +{ source: [0xD002], NFC: [0xD002], NFD: [0x110F, 0x116F, 0x11AD], NFKC: [0xD002], NFKD: [0x110F, 0x116F, 0x11AD] }, +{ source: [0xD003], NFC: [0xD003], NFD: [0x110F, 0x116F, 0x11AE], NFKC: [0xD003], NFKD: [0x110F, 0x116F, 0x11AE] }, +{ source: [0xD004], NFC: [0xD004], NFD: [0x110F, 0x116F, 0x11AF], NFKC: [0xD004], NFKD: [0x110F, 0x116F, 0x11AF] }, +{ source: [0xD005], NFC: [0xD005], NFD: [0x110F, 0x116F, 0x11B0], NFKC: [0xD005], NFKD: [0x110F, 0x116F, 0x11B0] }, +{ source: [0xD006], NFC: [0xD006], NFD: [0x110F, 0x116F, 0x11B1], NFKC: [0xD006], NFKD: [0x110F, 0x116F, 0x11B1] }, +{ source: [0xD007], NFC: [0xD007], NFD: [0x110F, 0x116F, 0x11B2], NFKC: [0xD007], NFKD: [0x110F, 0x116F, 0x11B2] }, +{ source: [0xD008], NFC: [0xD008], NFD: [0x110F, 0x116F, 0x11B3], NFKC: [0xD008], NFKD: [0x110F, 0x116F, 0x11B3] }, +{ source: [0xD009], NFC: [0xD009], NFD: [0x110F, 0x116F, 0x11B4], NFKC: [0xD009], NFKD: [0x110F, 0x116F, 0x11B4] }, +{ source: [0xD00A], NFC: [0xD00A], NFD: [0x110F, 0x116F, 0x11B5], NFKC: [0xD00A], NFKD: [0x110F, 0x116F, 0x11B5] }, +{ source: [0xD00B], NFC: [0xD00B], NFD: [0x110F, 0x116F, 0x11B6], NFKC: [0xD00B], NFKD: [0x110F, 0x116F, 0x11B6] }, +{ source: [0xD00C], NFC: [0xD00C], NFD: [0x110F, 0x116F, 0x11B7], NFKC: [0xD00C], NFKD: [0x110F, 0x116F, 0x11B7] }, +{ source: [0xD00D], NFC: [0xD00D], NFD: [0x110F, 0x116F, 0x11B8], NFKC: [0xD00D], NFKD: [0x110F, 0x116F, 0x11B8] }, +{ source: [0xD00E], NFC: [0xD00E], NFD: [0x110F, 0x116F, 0x11B9], NFKC: [0xD00E], NFKD: [0x110F, 0x116F, 0x11B9] }, +{ source: [0xD00F], NFC: [0xD00F], NFD: [0x110F, 0x116F, 0x11BA], NFKC: [0xD00F], NFKD: [0x110F, 0x116F, 0x11BA] }, +{ source: [0xD010], NFC: [0xD010], NFD: [0x110F, 0x116F, 0x11BB], NFKC: [0xD010], NFKD: [0x110F, 0x116F, 0x11BB] }, +{ source: [0xD011], NFC: [0xD011], NFD: [0x110F, 0x116F, 0x11BC], NFKC: [0xD011], NFKD: [0x110F, 0x116F, 0x11BC] }, +{ source: [0xD012], NFC: [0xD012], NFD: [0x110F, 0x116F, 0x11BD], NFKC: [0xD012], NFKD: [0x110F, 0x116F, 0x11BD] }, +{ source: [0xD013], NFC: [0xD013], NFD: [0x110F, 0x116F, 0x11BE], NFKC: [0xD013], NFKD: [0x110F, 0x116F, 0x11BE] }, +{ source: [0xD014], NFC: [0xD014], NFD: [0x110F, 0x116F, 0x11BF], NFKC: [0xD014], NFKD: [0x110F, 0x116F, 0x11BF] }, +{ source: [0xD015], NFC: [0xD015], NFD: [0x110F, 0x116F, 0x11C0], NFKC: [0xD015], NFKD: [0x110F, 0x116F, 0x11C0] }, +{ source: [0xD016], NFC: [0xD016], NFD: [0x110F, 0x116F, 0x11C1], NFKC: [0xD016], NFKD: [0x110F, 0x116F, 0x11C1] }, +{ source: [0xD017], NFC: [0xD017], NFD: [0x110F, 0x116F, 0x11C2], NFKC: [0xD017], NFKD: [0x110F, 0x116F, 0x11C2] }, +{ source: [0xD018], NFC: [0xD018], NFD: [0x110F, 0x1170], NFKC: [0xD018], NFKD: [0x110F, 0x1170] }, +{ source: [0xD019], NFC: [0xD019], NFD: [0x110F, 0x1170, 0x11A8], NFKC: [0xD019], NFKD: [0x110F, 0x1170, 0x11A8] }, +{ source: [0xD01A], NFC: [0xD01A], NFD: [0x110F, 0x1170, 0x11A9], NFKC: [0xD01A], NFKD: [0x110F, 0x1170, 0x11A9] }, +{ source: [0xD01B], NFC: [0xD01B], NFD: [0x110F, 0x1170, 0x11AA], NFKC: [0xD01B], NFKD: [0x110F, 0x1170, 0x11AA] }, +{ source: [0xD01C], NFC: [0xD01C], NFD: [0x110F, 0x1170, 0x11AB], NFKC: [0xD01C], NFKD: [0x110F, 0x1170, 0x11AB] }, +{ source: [0xD01D], NFC: [0xD01D], NFD: [0x110F, 0x1170, 0x11AC], NFKC: [0xD01D], NFKD: [0x110F, 0x1170, 0x11AC] }, +{ source: [0xD01E], NFC: [0xD01E], NFD: [0x110F, 0x1170, 0x11AD], NFKC: [0xD01E], NFKD: [0x110F, 0x1170, 0x11AD] }, +{ source: [0xD01F], NFC: [0xD01F], NFD: [0x110F, 0x1170, 0x11AE], NFKC: [0xD01F], NFKD: [0x110F, 0x1170, 0x11AE] }, +{ source: [0xD020], NFC: [0xD020], NFD: [0x110F, 0x1170, 0x11AF], NFKC: [0xD020], NFKD: [0x110F, 0x1170, 0x11AF] }, +{ source: [0xD021], NFC: [0xD021], NFD: [0x110F, 0x1170, 0x11B0], NFKC: [0xD021], NFKD: [0x110F, 0x1170, 0x11B0] }, +{ source: [0xD022], NFC: [0xD022], NFD: [0x110F, 0x1170, 0x11B1], NFKC: [0xD022], NFKD: [0x110F, 0x1170, 0x11B1] }, +{ source: [0xD023], NFC: [0xD023], NFD: [0x110F, 0x1170, 0x11B2], NFKC: [0xD023], NFKD: [0x110F, 0x1170, 0x11B2] }, +{ source: [0xD024], NFC: [0xD024], NFD: [0x110F, 0x1170, 0x11B3], NFKC: [0xD024], NFKD: [0x110F, 0x1170, 0x11B3] }, +{ source: [0xD025], NFC: [0xD025], NFD: [0x110F, 0x1170, 0x11B4], NFKC: [0xD025], NFKD: [0x110F, 0x1170, 0x11B4] }, +{ source: [0xD026], NFC: [0xD026], NFD: [0x110F, 0x1170, 0x11B5], NFKC: [0xD026], NFKD: [0x110F, 0x1170, 0x11B5] }, +{ source: [0xD027], NFC: [0xD027], NFD: [0x110F, 0x1170, 0x11B6], NFKC: [0xD027], NFKD: [0x110F, 0x1170, 0x11B6] }, +{ source: [0xD028], NFC: [0xD028], NFD: [0x110F, 0x1170, 0x11B7], NFKC: [0xD028], NFKD: [0x110F, 0x1170, 0x11B7] }, +{ source: [0xD029], NFC: [0xD029], NFD: [0x110F, 0x1170, 0x11B8], NFKC: [0xD029], NFKD: [0x110F, 0x1170, 0x11B8] }, +{ source: [0xD02A], NFC: [0xD02A], NFD: [0x110F, 0x1170, 0x11B9], NFKC: [0xD02A], NFKD: [0x110F, 0x1170, 0x11B9] }, +{ source: [0xD02B], NFC: [0xD02B], NFD: [0x110F, 0x1170, 0x11BA], NFKC: [0xD02B], NFKD: [0x110F, 0x1170, 0x11BA] }, +{ source: [0xD02C], NFC: [0xD02C], NFD: [0x110F, 0x1170, 0x11BB], NFKC: [0xD02C], NFKD: [0x110F, 0x1170, 0x11BB] }, +{ source: [0xD02D], NFC: [0xD02D], NFD: [0x110F, 0x1170, 0x11BC], NFKC: [0xD02D], NFKD: [0x110F, 0x1170, 0x11BC] }, +{ source: [0xD02E], NFC: [0xD02E], NFD: [0x110F, 0x1170, 0x11BD], NFKC: [0xD02E], NFKD: [0x110F, 0x1170, 0x11BD] }, +{ source: [0xD02F], NFC: [0xD02F], NFD: [0x110F, 0x1170, 0x11BE], NFKC: [0xD02F], NFKD: [0x110F, 0x1170, 0x11BE] }, +{ source: [0xD030], NFC: [0xD030], NFD: [0x110F, 0x1170, 0x11BF], NFKC: [0xD030], NFKD: [0x110F, 0x1170, 0x11BF] }, +{ source: [0xD031], NFC: [0xD031], NFD: [0x110F, 0x1170, 0x11C0], NFKC: [0xD031], NFKD: [0x110F, 0x1170, 0x11C0] }, +{ source: [0xD032], NFC: [0xD032], NFD: [0x110F, 0x1170, 0x11C1], NFKC: [0xD032], NFKD: [0x110F, 0x1170, 0x11C1] }, +{ source: [0xD033], NFC: [0xD033], NFD: [0x110F, 0x1170, 0x11C2], NFKC: [0xD033], NFKD: [0x110F, 0x1170, 0x11C2] }, +{ source: [0xD034], NFC: [0xD034], NFD: [0x110F, 0x1171], NFKC: [0xD034], NFKD: [0x110F, 0x1171] }, +{ source: [0xD035], NFC: [0xD035], NFD: [0x110F, 0x1171, 0x11A8], NFKC: [0xD035], NFKD: [0x110F, 0x1171, 0x11A8] }, +{ source: [0xD036], NFC: [0xD036], NFD: [0x110F, 0x1171, 0x11A9], NFKC: [0xD036], NFKD: [0x110F, 0x1171, 0x11A9] }, +{ source: [0xD037], NFC: [0xD037], NFD: [0x110F, 0x1171, 0x11AA], NFKC: [0xD037], NFKD: [0x110F, 0x1171, 0x11AA] }, +{ source: [0xD038], NFC: [0xD038], NFD: [0x110F, 0x1171, 0x11AB], NFKC: [0xD038], NFKD: [0x110F, 0x1171, 0x11AB] }, +{ source: [0xD039], NFC: [0xD039], NFD: [0x110F, 0x1171, 0x11AC], NFKC: [0xD039], NFKD: [0x110F, 0x1171, 0x11AC] }, +{ source: [0xD03A], NFC: [0xD03A], NFD: [0x110F, 0x1171, 0x11AD], NFKC: [0xD03A], NFKD: [0x110F, 0x1171, 0x11AD] }, +{ source: [0xD03B], NFC: [0xD03B], NFD: [0x110F, 0x1171, 0x11AE], NFKC: [0xD03B], NFKD: [0x110F, 0x1171, 0x11AE] }, +{ source: [0xD03C], NFC: [0xD03C], NFD: [0x110F, 0x1171, 0x11AF], NFKC: [0xD03C], NFKD: [0x110F, 0x1171, 0x11AF] }, +{ source: [0xD03D], NFC: [0xD03D], NFD: [0x110F, 0x1171, 0x11B0], NFKC: [0xD03D], NFKD: [0x110F, 0x1171, 0x11B0] }, +{ source: [0xD03E], NFC: [0xD03E], NFD: [0x110F, 0x1171, 0x11B1], NFKC: [0xD03E], NFKD: [0x110F, 0x1171, 0x11B1] }, +{ source: [0xD03F], NFC: [0xD03F], NFD: [0x110F, 0x1171, 0x11B2], NFKC: [0xD03F], NFKD: [0x110F, 0x1171, 0x11B2] }, +{ source: [0xD040], NFC: [0xD040], NFD: [0x110F, 0x1171, 0x11B3], NFKC: [0xD040], NFKD: [0x110F, 0x1171, 0x11B3] }, +{ source: [0xD041], NFC: [0xD041], NFD: [0x110F, 0x1171, 0x11B4], NFKC: [0xD041], NFKD: [0x110F, 0x1171, 0x11B4] }, +{ source: [0xD042], NFC: [0xD042], NFD: [0x110F, 0x1171, 0x11B5], NFKC: [0xD042], NFKD: [0x110F, 0x1171, 0x11B5] }, +{ source: [0xD043], NFC: [0xD043], NFD: [0x110F, 0x1171, 0x11B6], NFKC: [0xD043], NFKD: [0x110F, 0x1171, 0x11B6] }, +{ source: [0xD044], NFC: [0xD044], NFD: [0x110F, 0x1171, 0x11B7], NFKC: [0xD044], NFKD: [0x110F, 0x1171, 0x11B7] }, +{ source: [0xD045], NFC: [0xD045], NFD: [0x110F, 0x1171, 0x11B8], NFKC: [0xD045], NFKD: [0x110F, 0x1171, 0x11B8] }, +{ source: [0xD046], NFC: [0xD046], NFD: [0x110F, 0x1171, 0x11B9], NFKC: [0xD046], NFKD: [0x110F, 0x1171, 0x11B9] }, +{ source: [0xD047], NFC: [0xD047], NFD: [0x110F, 0x1171, 0x11BA], NFKC: [0xD047], NFKD: [0x110F, 0x1171, 0x11BA] }, +{ source: [0xD048], NFC: [0xD048], NFD: [0x110F, 0x1171, 0x11BB], NFKC: [0xD048], NFKD: [0x110F, 0x1171, 0x11BB] }, +{ source: [0xD049], NFC: [0xD049], NFD: [0x110F, 0x1171, 0x11BC], NFKC: [0xD049], NFKD: [0x110F, 0x1171, 0x11BC] }, +{ source: [0xD04A], NFC: [0xD04A], NFD: [0x110F, 0x1171, 0x11BD], NFKC: [0xD04A], NFKD: [0x110F, 0x1171, 0x11BD] }, +{ source: [0xD04B], NFC: [0xD04B], NFD: [0x110F, 0x1171, 0x11BE], NFKC: [0xD04B], NFKD: [0x110F, 0x1171, 0x11BE] }, +{ source: [0xD04C], NFC: [0xD04C], NFD: [0x110F, 0x1171, 0x11BF], NFKC: [0xD04C], NFKD: [0x110F, 0x1171, 0x11BF] }, +{ source: [0xD04D], NFC: [0xD04D], NFD: [0x110F, 0x1171, 0x11C0], NFKC: [0xD04D], NFKD: [0x110F, 0x1171, 0x11C0] }, +{ source: [0xD04E], NFC: [0xD04E], NFD: [0x110F, 0x1171, 0x11C1], NFKC: [0xD04E], NFKD: [0x110F, 0x1171, 0x11C1] }, +{ source: [0xD04F], NFC: [0xD04F], NFD: [0x110F, 0x1171, 0x11C2], NFKC: [0xD04F], NFKD: [0x110F, 0x1171, 0x11C2] }, +{ source: [0xD050], NFC: [0xD050], NFD: [0x110F, 0x1172], NFKC: [0xD050], NFKD: [0x110F, 0x1172] }, +{ source: [0xD051], NFC: [0xD051], NFD: [0x110F, 0x1172, 0x11A8], NFKC: [0xD051], NFKD: [0x110F, 0x1172, 0x11A8] }, +{ source: [0xD052], NFC: [0xD052], NFD: [0x110F, 0x1172, 0x11A9], NFKC: [0xD052], NFKD: [0x110F, 0x1172, 0x11A9] }, +{ source: [0xD053], NFC: [0xD053], NFD: [0x110F, 0x1172, 0x11AA], NFKC: [0xD053], NFKD: [0x110F, 0x1172, 0x11AA] }, +{ source: [0xD054], NFC: [0xD054], NFD: [0x110F, 0x1172, 0x11AB], NFKC: [0xD054], NFKD: [0x110F, 0x1172, 0x11AB] }, +{ source: [0xD055], NFC: [0xD055], NFD: [0x110F, 0x1172, 0x11AC], NFKC: [0xD055], NFKD: [0x110F, 0x1172, 0x11AC] }, +{ source: [0xD056], NFC: [0xD056], NFD: [0x110F, 0x1172, 0x11AD], NFKC: [0xD056], NFKD: [0x110F, 0x1172, 0x11AD] }, +{ source: [0xD057], NFC: [0xD057], NFD: [0x110F, 0x1172, 0x11AE], NFKC: [0xD057], NFKD: [0x110F, 0x1172, 0x11AE] }, +{ source: [0xD058], NFC: [0xD058], NFD: [0x110F, 0x1172, 0x11AF], NFKC: [0xD058], NFKD: [0x110F, 0x1172, 0x11AF] }, +{ source: [0xD059], NFC: [0xD059], NFD: [0x110F, 0x1172, 0x11B0], NFKC: [0xD059], NFKD: [0x110F, 0x1172, 0x11B0] }, +{ source: [0xD05A], NFC: [0xD05A], NFD: [0x110F, 0x1172, 0x11B1], NFKC: [0xD05A], NFKD: [0x110F, 0x1172, 0x11B1] }, +{ source: [0xD05B], NFC: [0xD05B], NFD: [0x110F, 0x1172, 0x11B2], NFKC: [0xD05B], NFKD: [0x110F, 0x1172, 0x11B2] }, +{ source: [0xD05C], NFC: [0xD05C], NFD: [0x110F, 0x1172, 0x11B3], NFKC: [0xD05C], NFKD: [0x110F, 0x1172, 0x11B3] }, +{ source: [0xD05D], NFC: [0xD05D], NFD: [0x110F, 0x1172, 0x11B4], NFKC: [0xD05D], NFKD: [0x110F, 0x1172, 0x11B4] }, +{ source: [0xD05E], NFC: [0xD05E], NFD: [0x110F, 0x1172, 0x11B5], NFKC: [0xD05E], NFKD: [0x110F, 0x1172, 0x11B5] }, +{ source: [0xD05F], NFC: [0xD05F], NFD: [0x110F, 0x1172, 0x11B6], NFKC: [0xD05F], NFKD: [0x110F, 0x1172, 0x11B6] }, +{ source: [0xD060], NFC: [0xD060], NFD: [0x110F, 0x1172, 0x11B7], NFKC: [0xD060], NFKD: [0x110F, 0x1172, 0x11B7] }, +{ source: [0xD061], NFC: [0xD061], NFD: [0x110F, 0x1172, 0x11B8], NFKC: [0xD061], NFKD: [0x110F, 0x1172, 0x11B8] }, +{ source: [0xD062], NFC: [0xD062], NFD: [0x110F, 0x1172, 0x11B9], NFKC: [0xD062], NFKD: [0x110F, 0x1172, 0x11B9] }, +{ source: [0xD063], NFC: [0xD063], NFD: [0x110F, 0x1172, 0x11BA], NFKC: [0xD063], NFKD: [0x110F, 0x1172, 0x11BA] }, +{ source: [0xD064], NFC: [0xD064], NFD: [0x110F, 0x1172, 0x11BB], NFKC: [0xD064], NFKD: [0x110F, 0x1172, 0x11BB] }, +{ source: [0xD065], NFC: [0xD065], NFD: [0x110F, 0x1172, 0x11BC], NFKC: [0xD065], NFKD: [0x110F, 0x1172, 0x11BC] }, +{ source: [0xD066], NFC: [0xD066], NFD: [0x110F, 0x1172, 0x11BD], NFKC: [0xD066], NFKD: [0x110F, 0x1172, 0x11BD] }, +{ source: [0xD067], NFC: [0xD067], NFD: [0x110F, 0x1172, 0x11BE], NFKC: [0xD067], NFKD: [0x110F, 0x1172, 0x11BE] }, +{ source: [0xD068], NFC: [0xD068], NFD: [0x110F, 0x1172, 0x11BF], NFKC: [0xD068], NFKD: [0x110F, 0x1172, 0x11BF] }, +{ source: [0xD069], NFC: [0xD069], NFD: [0x110F, 0x1172, 0x11C0], NFKC: [0xD069], NFKD: [0x110F, 0x1172, 0x11C0] }, +{ source: [0xD06A], NFC: [0xD06A], NFD: [0x110F, 0x1172, 0x11C1], NFKC: [0xD06A], NFKD: [0x110F, 0x1172, 0x11C1] }, +{ source: [0xD06B], NFC: [0xD06B], NFD: [0x110F, 0x1172, 0x11C2], NFKC: [0xD06B], NFKD: [0x110F, 0x1172, 0x11C2] }, +{ source: [0xD06C], NFC: [0xD06C], NFD: [0x110F, 0x1173], NFKC: [0xD06C], NFKD: [0x110F, 0x1173] }, +{ source: [0xD06D], NFC: [0xD06D], NFD: [0x110F, 0x1173, 0x11A8], NFKC: [0xD06D], NFKD: [0x110F, 0x1173, 0x11A8] }, +{ source: [0xD06E], NFC: [0xD06E], NFD: [0x110F, 0x1173, 0x11A9], NFKC: [0xD06E], NFKD: [0x110F, 0x1173, 0x11A9] }, +{ source: [0xD06F], NFC: [0xD06F], NFD: [0x110F, 0x1173, 0x11AA], NFKC: [0xD06F], NFKD: [0x110F, 0x1173, 0x11AA] }, +{ source: [0xD070], NFC: [0xD070], NFD: [0x110F, 0x1173, 0x11AB], NFKC: [0xD070], NFKD: [0x110F, 0x1173, 0x11AB] }, +{ source: [0xD071], NFC: [0xD071], NFD: [0x110F, 0x1173, 0x11AC], NFKC: [0xD071], NFKD: [0x110F, 0x1173, 0x11AC] }, +{ source: [0xD072], NFC: [0xD072], NFD: [0x110F, 0x1173, 0x11AD], NFKC: [0xD072], NFKD: [0x110F, 0x1173, 0x11AD] }, +{ source: [0xD073], NFC: [0xD073], NFD: [0x110F, 0x1173, 0x11AE], NFKC: [0xD073], NFKD: [0x110F, 0x1173, 0x11AE] }, +{ source: [0xD074], NFC: [0xD074], NFD: [0x110F, 0x1173, 0x11AF], NFKC: [0xD074], NFKD: [0x110F, 0x1173, 0x11AF] }, +{ source: [0xD075], NFC: [0xD075], NFD: [0x110F, 0x1173, 0x11B0], NFKC: [0xD075], NFKD: [0x110F, 0x1173, 0x11B0] }, +{ source: [0xD076], NFC: [0xD076], NFD: [0x110F, 0x1173, 0x11B1], NFKC: [0xD076], NFKD: [0x110F, 0x1173, 0x11B1] }, +{ source: [0xD077], NFC: [0xD077], NFD: [0x110F, 0x1173, 0x11B2], NFKC: [0xD077], NFKD: [0x110F, 0x1173, 0x11B2] }, +{ source: [0xD078], NFC: [0xD078], NFD: [0x110F, 0x1173, 0x11B3], NFKC: [0xD078], NFKD: [0x110F, 0x1173, 0x11B3] }, +{ source: [0xD079], NFC: [0xD079], NFD: [0x110F, 0x1173, 0x11B4], NFKC: [0xD079], NFKD: [0x110F, 0x1173, 0x11B4] }, +{ source: [0xD07A], NFC: [0xD07A], NFD: [0x110F, 0x1173, 0x11B5], NFKC: [0xD07A], NFKD: [0x110F, 0x1173, 0x11B5] }, +{ source: [0xD07B], NFC: [0xD07B], NFD: [0x110F, 0x1173, 0x11B6], NFKC: [0xD07B], NFKD: [0x110F, 0x1173, 0x11B6] }, +{ source: [0xD07C], NFC: [0xD07C], NFD: [0x110F, 0x1173, 0x11B7], NFKC: [0xD07C], NFKD: [0x110F, 0x1173, 0x11B7] }, +{ source: [0xD07D], NFC: [0xD07D], NFD: [0x110F, 0x1173, 0x11B8], NFKC: [0xD07D], NFKD: [0x110F, 0x1173, 0x11B8] }, +{ source: [0xD07E], NFC: [0xD07E], NFD: [0x110F, 0x1173, 0x11B9], NFKC: [0xD07E], NFKD: [0x110F, 0x1173, 0x11B9] }, +{ source: [0xD07F], NFC: [0xD07F], NFD: [0x110F, 0x1173, 0x11BA], NFKC: [0xD07F], NFKD: [0x110F, 0x1173, 0x11BA] }, +{ source: [0xD080], NFC: [0xD080], NFD: [0x110F, 0x1173, 0x11BB], NFKC: [0xD080], NFKD: [0x110F, 0x1173, 0x11BB] }, +{ source: [0xD081], NFC: [0xD081], NFD: [0x110F, 0x1173, 0x11BC], NFKC: [0xD081], NFKD: [0x110F, 0x1173, 0x11BC] }, +{ source: [0xD082], NFC: [0xD082], NFD: [0x110F, 0x1173, 0x11BD], NFKC: [0xD082], NFKD: [0x110F, 0x1173, 0x11BD] }, +{ source: [0xD083], NFC: [0xD083], NFD: [0x110F, 0x1173, 0x11BE], NFKC: [0xD083], NFKD: [0x110F, 0x1173, 0x11BE] }, +{ source: [0xD084], NFC: [0xD084], NFD: [0x110F, 0x1173, 0x11BF], NFKC: [0xD084], NFKD: [0x110F, 0x1173, 0x11BF] }, +{ source: [0xD085], NFC: [0xD085], NFD: [0x110F, 0x1173, 0x11C0], NFKC: [0xD085], NFKD: [0x110F, 0x1173, 0x11C0] }, +{ source: [0xD086], NFC: [0xD086], NFD: [0x110F, 0x1173, 0x11C1], NFKC: [0xD086], NFKD: [0x110F, 0x1173, 0x11C1] }, +{ source: [0xD087], NFC: [0xD087], NFD: [0x110F, 0x1173, 0x11C2], NFKC: [0xD087], NFKD: [0x110F, 0x1173, 0x11C2] }, +{ source: [0xD088], NFC: [0xD088], NFD: [0x110F, 0x1174], NFKC: [0xD088], NFKD: [0x110F, 0x1174] }, +{ source: [0xD089], NFC: [0xD089], NFD: [0x110F, 0x1174, 0x11A8], NFKC: [0xD089], NFKD: [0x110F, 0x1174, 0x11A8] }, +{ source: [0xD08A], NFC: [0xD08A], NFD: [0x110F, 0x1174, 0x11A9], NFKC: [0xD08A], NFKD: [0x110F, 0x1174, 0x11A9] }, +{ source: [0xD08B], NFC: [0xD08B], NFD: [0x110F, 0x1174, 0x11AA], NFKC: [0xD08B], NFKD: [0x110F, 0x1174, 0x11AA] }, +{ source: [0xD08C], NFC: [0xD08C], NFD: [0x110F, 0x1174, 0x11AB], NFKC: [0xD08C], NFKD: [0x110F, 0x1174, 0x11AB] }, +{ source: [0xD08D], NFC: [0xD08D], NFD: [0x110F, 0x1174, 0x11AC], NFKC: [0xD08D], NFKD: [0x110F, 0x1174, 0x11AC] }, +{ source: [0xD08E], NFC: [0xD08E], NFD: [0x110F, 0x1174, 0x11AD], NFKC: [0xD08E], NFKD: [0x110F, 0x1174, 0x11AD] }, +{ source: [0xD08F], NFC: [0xD08F], NFD: [0x110F, 0x1174, 0x11AE], NFKC: [0xD08F], NFKD: [0x110F, 0x1174, 0x11AE] }, +{ source: [0xD090], NFC: [0xD090], NFD: [0x110F, 0x1174, 0x11AF], NFKC: [0xD090], NFKD: [0x110F, 0x1174, 0x11AF] }, +{ source: [0xD091], NFC: [0xD091], NFD: [0x110F, 0x1174, 0x11B0], NFKC: [0xD091], NFKD: [0x110F, 0x1174, 0x11B0] }, +{ source: [0xD092], NFC: [0xD092], NFD: [0x110F, 0x1174, 0x11B1], NFKC: [0xD092], NFKD: [0x110F, 0x1174, 0x11B1] }, +{ source: [0xD093], NFC: [0xD093], NFD: [0x110F, 0x1174, 0x11B2], NFKC: [0xD093], NFKD: [0x110F, 0x1174, 0x11B2] }, +{ source: [0xD094], NFC: [0xD094], NFD: [0x110F, 0x1174, 0x11B3], NFKC: [0xD094], NFKD: [0x110F, 0x1174, 0x11B3] }, +{ source: [0xD095], NFC: [0xD095], NFD: [0x110F, 0x1174, 0x11B4], NFKC: [0xD095], NFKD: [0x110F, 0x1174, 0x11B4] }, +{ source: [0xD096], NFC: [0xD096], NFD: [0x110F, 0x1174, 0x11B5], NFKC: [0xD096], NFKD: [0x110F, 0x1174, 0x11B5] }, +{ source: [0xD097], NFC: [0xD097], NFD: [0x110F, 0x1174, 0x11B6], NFKC: [0xD097], NFKD: [0x110F, 0x1174, 0x11B6] }, +{ source: [0xD098], NFC: [0xD098], NFD: [0x110F, 0x1174, 0x11B7], NFKC: [0xD098], NFKD: [0x110F, 0x1174, 0x11B7] }, +{ source: [0xD099], NFC: [0xD099], NFD: [0x110F, 0x1174, 0x11B8], NFKC: [0xD099], NFKD: [0x110F, 0x1174, 0x11B8] }, +{ source: [0xD09A], NFC: [0xD09A], NFD: [0x110F, 0x1174, 0x11B9], NFKC: [0xD09A], NFKD: [0x110F, 0x1174, 0x11B9] }, +{ source: [0xD09B], NFC: [0xD09B], NFD: [0x110F, 0x1174, 0x11BA], NFKC: [0xD09B], NFKD: [0x110F, 0x1174, 0x11BA] }, +{ source: [0xD09C], NFC: [0xD09C], NFD: [0x110F, 0x1174, 0x11BB], NFKC: [0xD09C], NFKD: [0x110F, 0x1174, 0x11BB] }, +{ source: [0xD09D], NFC: [0xD09D], NFD: [0x110F, 0x1174, 0x11BC], NFKC: [0xD09D], NFKD: [0x110F, 0x1174, 0x11BC] }, +{ source: [0xD09E], NFC: [0xD09E], NFD: [0x110F, 0x1174, 0x11BD], NFKC: [0xD09E], NFKD: [0x110F, 0x1174, 0x11BD] }, +{ source: [0xD09F], NFC: [0xD09F], NFD: [0x110F, 0x1174, 0x11BE], NFKC: [0xD09F], NFKD: [0x110F, 0x1174, 0x11BE] }, +{ source: [0xD0A0], NFC: [0xD0A0], NFD: [0x110F, 0x1174, 0x11BF], NFKC: [0xD0A0], NFKD: [0x110F, 0x1174, 0x11BF] }, +{ source: [0xD0A1], NFC: [0xD0A1], NFD: [0x110F, 0x1174, 0x11C0], NFKC: [0xD0A1], NFKD: [0x110F, 0x1174, 0x11C0] }, +{ source: [0xD0A2], NFC: [0xD0A2], NFD: [0x110F, 0x1174, 0x11C1], NFKC: [0xD0A2], NFKD: [0x110F, 0x1174, 0x11C1] }, +{ source: [0xD0A3], NFC: [0xD0A3], NFD: [0x110F, 0x1174, 0x11C2], NFKC: [0xD0A3], NFKD: [0x110F, 0x1174, 0x11C2] }, +{ source: [0xD0A4], NFC: [0xD0A4], NFD: [0x110F, 0x1175], NFKC: [0xD0A4], NFKD: [0x110F, 0x1175] }, +{ source: [0xD0A5], NFC: [0xD0A5], NFD: [0x110F, 0x1175, 0x11A8], NFKC: [0xD0A5], NFKD: [0x110F, 0x1175, 0x11A8] }, +{ source: [0xD0A6], NFC: [0xD0A6], NFD: [0x110F, 0x1175, 0x11A9], NFKC: [0xD0A6], NFKD: [0x110F, 0x1175, 0x11A9] }, +{ source: [0xD0A7], NFC: [0xD0A7], NFD: [0x110F, 0x1175, 0x11AA], NFKC: [0xD0A7], NFKD: [0x110F, 0x1175, 0x11AA] }, +{ source: [0xD0A8], NFC: [0xD0A8], NFD: [0x110F, 0x1175, 0x11AB], NFKC: [0xD0A8], NFKD: [0x110F, 0x1175, 0x11AB] }, +{ source: [0xD0A9], NFC: [0xD0A9], NFD: [0x110F, 0x1175, 0x11AC], NFKC: [0xD0A9], NFKD: [0x110F, 0x1175, 0x11AC] }, +{ source: [0xD0AA], NFC: [0xD0AA], NFD: [0x110F, 0x1175, 0x11AD], NFKC: [0xD0AA], NFKD: [0x110F, 0x1175, 0x11AD] }, +{ source: [0xD0AB], NFC: [0xD0AB], NFD: [0x110F, 0x1175, 0x11AE], NFKC: [0xD0AB], NFKD: [0x110F, 0x1175, 0x11AE] }, +{ source: [0xD0AC], NFC: [0xD0AC], NFD: [0x110F, 0x1175, 0x11AF], NFKC: [0xD0AC], NFKD: [0x110F, 0x1175, 0x11AF] }, +{ source: [0xD0AD], NFC: [0xD0AD], NFD: [0x110F, 0x1175, 0x11B0], NFKC: [0xD0AD], NFKD: [0x110F, 0x1175, 0x11B0] }, +{ source: [0xD0AE], NFC: [0xD0AE], NFD: [0x110F, 0x1175, 0x11B1], NFKC: [0xD0AE], NFKD: [0x110F, 0x1175, 0x11B1] }, +{ source: [0xD0AF], NFC: [0xD0AF], NFD: [0x110F, 0x1175, 0x11B2], NFKC: [0xD0AF], NFKD: [0x110F, 0x1175, 0x11B2] }, +{ source: [0xD0B0], NFC: [0xD0B0], NFD: [0x110F, 0x1175, 0x11B3], NFKC: [0xD0B0], NFKD: [0x110F, 0x1175, 0x11B3] }, +{ source: [0xD0B1], NFC: [0xD0B1], NFD: [0x110F, 0x1175, 0x11B4], NFKC: [0xD0B1], NFKD: [0x110F, 0x1175, 0x11B4] }, +{ source: [0xD0B2], NFC: [0xD0B2], NFD: [0x110F, 0x1175, 0x11B5], NFKC: [0xD0B2], NFKD: [0x110F, 0x1175, 0x11B5] }, +{ source: [0xD0B3], NFC: [0xD0B3], NFD: [0x110F, 0x1175, 0x11B6], NFKC: [0xD0B3], NFKD: [0x110F, 0x1175, 0x11B6] }, +{ source: [0xD0B4], NFC: [0xD0B4], NFD: [0x110F, 0x1175, 0x11B7], NFKC: [0xD0B4], NFKD: [0x110F, 0x1175, 0x11B7] }, +{ source: [0xD0B5], NFC: [0xD0B5], NFD: [0x110F, 0x1175, 0x11B8], NFKC: [0xD0B5], NFKD: [0x110F, 0x1175, 0x11B8] }, +{ source: [0xD0B6], NFC: [0xD0B6], NFD: [0x110F, 0x1175, 0x11B9], NFKC: [0xD0B6], NFKD: [0x110F, 0x1175, 0x11B9] }, +{ source: [0xD0B7], NFC: [0xD0B7], NFD: [0x110F, 0x1175, 0x11BA], NFKC: [0xD0B7], NFKD: [0x110F, 0x1175, 0x11BA] }, +{ source: [0xD0B8], NFC: [0xD0B8], NFD: [0x110F, 0x1175, 0x11BB], NFKC: [0xD0B8], NFKD: [0x110F, 0x1175, 0x11BB] }, +{ source: [0xD0B9], NFC: [0xD0B9], NFD: [0x110F, 0x1175, 0x11BC], NFKC: [0xD0B9], NFKD: [0x110F, 0x1175, 0x11BC] }, +{ source: [0xD0BA], NFC: [0xD0BA], NFD: [0x110F, 0x1175, 0x11BD], NFKC: [0xD0BA], NFKD: [0x110F, 0x1175, 0x11BD] }, +{ source: [0xD0BB], NFC: [0xD0BB], NFD: [0x110F, 0x1175, 0x11BE], NFKC: [0xD0BB], NFKD: [0x110F, 0x1175, 0x11BE] }, +{ source: [0xD0BC], NFC: [0xD0BC], NFD: [0x110F, 0x1175, 0x11BF], NFKC: [0xD0BC], NFKD: [0x110F, 0x1175, 0x11BF] }, +{ source: [0xD0BD], NFC: [0xD0BD], NFD: [0x110F, 0x1175, 0x11C0], NFKC: [0xD0BD], NFKD: [0x110F, 0x1175, 0x11C0] }, +{ source: [0xD0BE], NFC: [0xD0BE], NFD: [0x110F, 0x1175, 0x11C1], NFKC: [0xD0BE], NFKD: [0x110F, 0x1175, 0x11C1] }, +{ source: [0xD0BF], NFC: [0xD0BF], NFD: [0x110F, 0x1175, 0x11C2], NFKC: [0xD0BF], NFKD: [0x110F, 0x1175, 0x11C2] }, +{ source: [0xD0C0], NFC: [0xD0C0], NFD: [0x1110, 0x1161], NFKC: [0xD0C0], NFKD: [0x1110, 0x1161] }, +{ source: [0xD0C1], NFC: [0xD0C1], NFD: [0x1110, 0x1161, 0x11A8], NFKC: [0xD0C1], NFKD: [0x1110, 0x1161, 0x11A8] }, +{ source: [0xD0C2], NFC: [0xD0C2], NFD: [0x1110, 0x1161, 0x11A9], NFKC: [0xD0C2], NFKD: [0x1110, 0x1161, 0x11A9] }, +{ source: [0xD0C3], NFC: [0xD0C3], NFD: [0x1110, 0x1161, 0x11AA], NFKC: [0xD0C3], NFKD: [0x1110, 0x1161, 0x11AA] }, +{ source: [0xD0C4], NFC: [0xD0C4], NFD: [0x1110, 0x1161, 0x11AB], NFKC: [0xD0C4], NFKD: [0x1110, 0x1161, 0x11AB] }, +{ source: [0xD0C5], NFC: [0xD0C5], NFD: [0x1110, 0x1161, 0x11AC], NFKC: [0xD0C5], NFKD: [0x1110, 0x1161, 0x11AC] }, +{ source: [0xD0C6], NFC: [0xD0C6], NFD: [0x1110, 0x1161, 0x11AD], NFKC: [0xD0C6], NFKD: [0x1110, 0x1161, 0x11AD] }, +{ source: [0xD0C7], NFC: [0xD0C7], NFD: [0x1110, 0x1161, 0x11AE], NFKC: [0xD0C7], NFKD: [0x1110, 0x1161, 0x11AE] }, +{ source: [0xD0C8], NFC: [0xD0C8], NFD: [0x1110, 0x1161, 0x11AF], NFKC: [0xD0C8], NFKD: [0x1110, 0x1161, 0x11AF] }, +{ source: [0xD0C9], NFC: [0xD0C9], NFD: [0x1110, 0x1161, 0x11B0], NFKC: [0xD0C9], NFKD: [0x1110, 0x1161, 0x11B0] }, +{ source: [0xD0CA], NFC: [0xD0CA], NFD: [0x1110, 0x1161, 0x11B1], NFKC: [0xD0CA], NFKD: [0x1110, 0x1161, 0x11B1] }, +{ source: [0xD0CB], NFC: [0xD0CB], NFD: [0x1110, 0x1161, 0x11B2], NFKC: [0xD0CB], NFKD: [0x1110, 0x1161, 0x11B2] }, +{ source: [0xD0CC], NFC: [0xD0CC], NFD: [0x1110, 0x1161, 0x11B3], NFKC: [0xD0CC], NFKD: [0x1110, 0x1161, 0x11B3] }, +{ source: [0xD0CD], NFC: [0xD0CD], NFD: [0x1110, 0x1161, 0x11B4], NFKC: [0xD0CD], NFKD: [0x1110, 0x1161, 0x11B4] }, +{ source: [0xD0CE], NFC: [0xD0CE], NFD: [0x1110, 0x1161, 0x11B5], NFKC: [0xD0CE], NFKD: [0x1110, 0x1161, 0x11B5] }, +{ source: [0xD0CF], NFC: [0xD0CF], NFD: [0x1110, 0x1161, 0x11B6], NFKC: [0xD0CF], NFKD: [0x1110, 0x1161, 0x11B6] }, +{ source: [0xD0D0], NFC: [0xD0D0], NFD: [0x1110, 0x1161, 0x11B7], NFKC: [0xD0D0], NFKD: [0x1110, 0x1161, 0x11B7] }, +{ source: [0xD0D1], NFC: [0xD0D1], NFD: [0x1110, 0x1161, 0x11B8], NFKC: [0xD0D1], NFKD: [0x1110, 0x1161, 0x11B8] }, +{ source: [0xD0D2], NFC: [0xD0D2], NFD: [0x1110, 0x1161, 0x11B9], NFKC: [0xD0D2], NFKD: [0x1110, 0x1161, 0x11B9] }, +{ source: [0xD0D3], NFC: [0xD0D3], NFD: [0x1110, 0x1161, 0x11BA], NFKC: [0xD0D3], NFKD: [0x1110, 0x1161, 0x11BA] }, +{ source: [0xD0D4], NFC: [0xD0D4], NFD: [0x1110, 0x1161, 0x11BB], NFKC: [0xD0D4], NFKD: [0x1110, 0x1161, 0x11BB] }, +{ source: [0xD0D5], NFC: [0xD0D5], NFD: [0x1110, 0x1161, 0x11BC], NFKC: [0xD0D5], NFKD: [0x1110, 0x1161, 0x11BC] }, +{ source: [0xD0D6], NFC: [0xD0D6], NFD: [0x1110, 0x1161, 0x11BD], NFKC: [0xD0D6], NFKD: [0x1110, 0x1161, 0x11BD] }, +{ source: [0xD0D7], NFC: [0xD0D7], NFD: [0x1110, 0x1161, 0x11BE], NFKC: [0xD0D7], NFKD: [0x1110, 0x1161, 0x11BE] }, +{ source: [0xD0D8], NFC: [0xD0D8], NFD: [0x1110, 0x1161, 0x11BF], NFKC: [0xD0D8], NFKD: [0x1110, 0x1161, 0x11BF] }, +{ source: [0xD0D9], NFC: [0xD0D9], NFD: [0x1110, 0x1161, 0x11C0], NFKC: [0xD0D9], NFKD: [0x1110, 0x1161, 0x11C0] }, +{ source: [0xD0DA], NFC: [0xD0DA], NFD: [0x1110, 0x1161, 0x11C1], NFKC: [0xD0DA], NFKD: [0x1110, 0x1161, 0x11C1] }, +{ source: [0xD0DB], NFC: [0xD0DB], NFD: [0x1110, 0x1161, 0x11C2], NFKC: [0xD0DB], NFKD: [0x1110, 0x1161, 0x11C2] }, +{ source: [0xD0DC], NFC: [0xD0DC], NFD: [0x1110, 0x1162], NFKC: [0xD0DC], NFKD: [0x1110, 0x1162] }, +{ source: [0xD0DD], NFC: [0xD0DD], NFD: [0x1110, 0x1162, 0x11A8], NFKC: [0xD0DD], NFKD: [0x1110, 0x1162, 0x11A8] }, +{ source: [0xD0DE], NFC: [0xD0DE], NFD: [0x1110, 0x1162, 0x11A9], NFKC: [0xD0DE], NFKD: [0x1110, 0x1162, 0x11A9] }, +{ source: [0xD0DF], NFC: [0xD0DF], NFD: [0x1110, 0x1162, 0x11AA], NFKC: [0xD0DF], NFKD: [0x1110, 0x1162, 0x11AA] }, +{ source: [0xD0E0], NFC: [0xD0E0], NFD: [0x1110, 0x1162, 0x11AB], NFKC: [0xD0E0], NFKD: [0x1110, 0x1162, 0x11AB] }, +{ source: [0xD0E1], NFC: [0xD0E1], NFD: [0x1110, 0x1162, 0x11AC], NFKC: [0xD0E1], NFKD: [0x1110, 0x1162, 0x11AC] }, +{ source: [0xD0E2], NFC: [0xD0E2], NFD: [0x1110, 0x1162, 0x11AD], NFKC: [0xD0E2], NFKD: [0x1110, 0x1162, 0x11AD] }, +{ source: [0xD0E3], NFC: [0xD0E3], NFD: [0x1110, 0x1162, 0x11AE], NFKC: [0xD0E3], NFKD: [0x1110, 0x1162, 0x11AE] }, +{ source: [0xD0E4], NFC: [0xD0E4], NFD: [0x1110, 0x1162, 0x11AF], NFKC: [0xD0E4], NFKD: [0x1110, 0x1162, 0x11AF] }, +{ source: [0xD0E5], NFC: [0xD0E5], NFD: [0x1110, 0x1162, 0x11B0], NFKC: [0xD0E5], NFKD: [0x1110, 0x1162, 0x11B0] }, +{ source: [0xD0E6], NFC: [0xD0E6], NFD: [0x1110, 0x1162, 0x11B1], NFKC: [0xD0E6], NFKD: [0x1110, 0x1162, 0x11B1] }, +{ source: [0xD0E7], NFC: [0xD0E7], NFD: [0x1110, 0x1162, 0x11B2], NFKC: [0xD0E7], NFKD: [0x1110, 0x1162, 0x11B2] }, +{ source: [0xD0E8], NFC: [0xD0E8], NFD: [0x1110, 0x1162, 0x11B3], NFKC: [0xD0E8], NFKD: [0x1110, 0x1162, 0x11B3] }, +{ source: [0xD0E9], NFC: [0xD0E9], NFD: [0x1110, 0x1162, 0x11B4], NFKC: [0xD0E9], NFKD: [0x1110, 0x1162, 0x11B4] }, +{ source: [0xD0EA], NFC: [0xD0EA], NFD: [0x1110, 0x1162, 0x11B5], NFKC: [0xD0EA], NFKD: [0x1110, 0x1162, 0x11B5] }, +{ source: [0xD0EB], NFC: [0xD0EB], NFD: [0x1110, 0x1162, 0x11B6], NFKC: [0xD0EB], NFKD: [0x1110, 0x1162, 0x11B6] }, +{ source: [0xD0EC], NFC: [0xD0EC], NFD: [0x1110, 0x1162, 0x11B7], NFKC: [0xD0EC], NFKD: [0x1110, 0x1162, 0x11B7] }, +{ source: [0xD0ED], NFC: [0xD0ED], NFD: [0x1110, 0x1162, 0x11B8], NFKC: [0xD0ED], NFKD: [0x1110, 0x1162, 0x11B8] }, +{ source: [0xD0EE], NFC: [0xD0EE], NFD: [0x1110, 0x1162, 0x11B9], NFKC: [0xD0EE], NFKD: [0x1110, 0x1162, 0x11B9] }, +{ source: [0xD0EF], NFC: [0xD0EF], NFD: [0x1110, 0x1162, 0x11BA], NFKC: [0xD0EF], NFKD: [0x1110, 0x1162, 0x11BA] }, +{ source: [0xD0F0], NFC: [0xD0F0], NFD: [0x1110, 0x1162, 0x11BB], NFKC: [0xD0F0], NFKD: [0x1110, 0x1162, 0x11BB] }, +{ source: [0xD0F1], NFC: [0xD0F1], NFD: [0x1110, 0x1162, 0x11BC], NFKC: [0xD0F1], NFKD: [0x1110, 0x1162, 0x11BC] }, +{ source: [0xD0F2], NFC: [0xD0F2], NFD: [0x1110, 0x1162, 0x11BD], NFKC: [0xD0F2], NFKD: [0x1110, 0x1162, 0x11BD] }, +{ source: [0xD0F3], NFC: [0xD0F3], NFD: [0x1110, 0x1162, 0x11BE], NFKC: [0xD0F3], NFKD: [0x1110, 0x1162, 0x11BE] }, +{ source: [0xD0F4], NFC: [0xD0F4], NFD: [0x1110, 0x1162, 0x11BF], NFKC: [0xD0F4], NFKD: [0x1110, 0x1162, 0x11BF] }, +{ source: [0xD0F5], NFC: [0xD0F5], NFD: [0x1110, 0x1162, 0x11C0], NFKC: [0xD0F5], NFKD: [0x1110, 0x1162, 0x11C0] }, +{ source: [0xD0F6], NFC: [0xD0F6], NFD: [0x1110, 0x1162, 0x11C1], NFKC: [0xD0F6], NFKD: [0x1110, 0x1162, 0x11C1] }, +{ source: [0xD0F7], NFC: [0xD0F7], NFD: [0x1110, 0x1162, 0x11C2], NFKC: [0xD0F7], NFKD: [0x1110, 0x1162, 0x11C2] }, +{ source: [0xD0F8], NFC: [0xD0F8], NFD: [0x1110, 0x1163], NFKC: [0xD0F8], NFKD: [0x1110, 0x1163] }, +{ source: [0xD0F9], NFC: [0xD0F9], NFD: [0x1110, 0x1163, 0x11A8], NFKC: [0xD0F9], NFKD: [0x1110, 0x1163, 0x11A8] }, +{ source: [0xD0FA], NFC: [0xD0FA], NFD: [0x1110, 0x1163, 0x11A9], NFKC: [0xD0FA], NFKD: [0x1110, 0x1163, 0x11A9] }, +{ source: [0xD0FB], NFC: [0xD0FB], NFD: [0x1110, 0x1163, 0x11AA], NFKC: [0xD0FB], NFKD: [0x1110, 0x1163, 0x11AA] }, +{ source: [0xD0FC], NFC: [0xD0FC], NFD: [0x1110, 0x1163, 0x11AB], NFKC: [0xD0FC], NFKD: [0x1110, 0x1163, 0x11AB] }, +{ source: [0xD0FD], NFC: [0xD0FD], NFD: [0x1110, 0x1163, 0x11AC], NFKC: [0xD0FD], NFKD: [0x1110, 0x1163, 0x11AC] }, +{ source: [0xD0FE], NFC: [0xD0FE], NFD: [0x1110, 0x1163, 0x11AD], NFKC: [0xD0FE], NFKD: [0x1110, 0x1163, 0x11AD] }, +{ source: [0xD0FF], NFC: [0xD0FF], NFD: [0x1110, 0x1163, 0x11AE], NFKC: [0xD0FF], NFKD: [0x1110, 0x1163, 0x11AE] }, +{ source: [0xD100], NFC: [0xD100], NFD: [0x1110, 0x1163, 0x11AF], NFKC: [0xD100], NFKD: [0x1110, 0x1163, 0x11AF] }, +{ source: [0xD101], NFC: [0xD101], NFD: [0x1110, 0x1163, 0x11B0], NFKC: [0xD101], NFKD: [0x1110, 0x1163, 0x11B0] }, +{ source: [0xD102], NFC: [0xD102], NFD: [0x1110, 0x1163, 0x11B1], NFKC: [0xD102], NFKD: [0x1110, 0x1163, 0x11B1] }, +{ source: [0xD103], NFC: [0xD103], NFD: [0x1110, 0x1163, 0x11B2], NFKC: [0xD103], NFKD: [0x1110, 0x1163, 0x11B2] }, +{ source: [0xD104], NFC: [0xD104], NFD: [0x1110, 0x1163, 0x11B3], NFKC: [0xD104], NFKD: [0x1110, 0x1163, 0x11B3] }, +{ source: [0xD105], NFC: [0xD105], NFD: [0x1110, 0x1163, 0x11B4], NFKC: [0xD105], NFKD: [0x1110, 0x1163, 0x11B4] }, +{ source: [0xD106], NFC: [0xD106], NFD: [0x1110, 0x1163, 0x11B5], NFKC: [0xD106], NFKD: [0x1110, 0x1163, 0x11B5] }, +{ source: [0xD107], NFC: [0xD107], NFD: [0x1110, 0x1163, 0x11B6], NFKC: [0xD107], NFKD: [0x1110, 0x1163, 0x11B6] }, +{ source: [0xD108], NFC: [0xD108], NFD: [0x1110, 0x1163, 0x11B7], NFKC: [0xD108], NFKD: [0x1110, 0x1163, 0x11B7] }, +{ source: [0xD109], NFC: [0xD109], NFD: [0x1110, 0x1163, 0x11B8], NFKC: [0xD109], NFKD: [0x1110, 0x1163, 0x11B8] }, +{ source: [0xD10A], NFC: [0xD10A], NFD: [0x1110, 0x1163, 0x11B9], NFKC: [0xD10A], NFKD: [0x1110, 0x1163, 0x11B9] }, +{ source: [0xD10B], NFC: [0xD10B], NFD: [0x1110, 0x1163, 0x11BA], NFKC: [0xD10B], NFKD: [0x1110, 0x1163, 0x11BA] }, +{ source: [0xD10C], NFC: [0xD10C], NFD: [0x1110, 0x1163, 0x11BB], NFKC: [0xD10C], NFKD: [0x1110, 0x1163, 0x11BB] }, +{ source: [0xD10D], NFC: [0xD10D], NFD: [0x1110, 0x1163, 0x11BC], NFKC: [0xD10D], NFKD: [0x1110, 0x1163, 0x11BC] }, +{ source: [0xD10E], NFC: [0xD10E], NFD: [0x1110, 0x1163, 0x11BD], NFKC: [0xD10E], NFKD: [0x1110, 0x1163, 0x11BD] }, +{ source: [0xD10F], NFC: [0xD10F], NFD: [0x1110, 0x1163, 0x11BE], NFKC: [0xD10F], NFKD: [0x1110, 0x1163, 0x11BE] }, +{ source: [0xD110], NFC: [0xD110], NFD: [0x1110, 0x1163, 0x11BF], NFKC: [0xD110], NFKD: [0x1110, 0x1163, 0x11BF] }, +{ source: [0xD111], NFC: [0xD111], NFD: [0x1110, 0x1163, 0x11C0], NFKC: [0xD111], NFKD: [0x1110, 0x1163, 0x11C0] }, +{ source: [0xD112], NFC: [0xD112], NFD: [0x1110, 0x1163, 0x11C1], NFKC: [0xD112], NFKD: [0x1110, 0x1163, 0x11C1] }, +{ source: [0xD113], NFC: [0xD113], NFD: [0x1110, 0x1163, 0x11C2], NFKC: [0xD113], NFKD: [0x1110, 0x1163, 0x11C2] }, +{ source: [0xD114], NFC: [0xD114], NFD: [0x1110, 0x1164], NFKC: [0xD114], NFKD: [0x1110, 0x1164] }, +{ source: [0xD115], NFC: [0xD115], NFD: [0x1110, 0x1164, 0x11A8], NFKC: [0xD115], NFKD: [0x1110, 0x1164, 0x11A8] }, +{ source: [0xD116], NFC: [0xD116], NFD: [0x1110, 0x1164, 0x11A9], NFKC: [0xD116], NFKD: [0x1110, 0x1164, 0x11A9] }, +{ source: [0xD117], NFC: [0xD117], NFD: [0x1110, 0x1164, 0x11AA], NFKC: [0xD117], NFKD: [0x1110, 0x1164, 0x11AA] }, +{ source: [0xD118], NFC: [0xD118], NFD: [0x1110, 0x1164, 0x11AB], NFKC: [0xD118], NFKD: [0x1110, 0x1164, 0x11AB] }, +{ source: [0xD119], NFC: [0xD119], NFD: [0x1110, 0x1164, 0x11AC], NFKC: [0xD119], NFKD: [0x1110, 0x1164, 0x11AC] }, +{ source: [0xD11A], NFC: [0xD11A], NFD: [0x1110, 0x1164, 0x11AD], NFKC: [0xD11A], NFKD: [0x1110, 0x1164, 0x11AD] }, +{ source: [0xD11B], NFC: [0xD11B], NFD: [0x1110, 0x1164, 0x11AE], NFKC: [0xD11B], NFKD: [0x1110, 0x1164, 0x11AE] }, +{ source: [0xD11C], NFC: [0xD11C], NFD: [0x1110, 0x1164, 0x11AF], NFKC: [0xD11C], NFKD: [0x1110, 0x1164, 0x11AF] }, +{ source: [0xD11D], NFC: [0xD11D], NFD: [0x1110, 0x1164, 0x11B0], NFKC: [0xD11D], NFKD: [0x1110, 0x1164, 0x11B0] }, +{ source: [0xD11E], NFC: [0xD11E], NFD: [0x1110, 0x1164, 0x11B1], NFKC: [0xD11E], NFKD: [0x1110, 0x1164, 0x11B1] }, +{ source: [0xD11F], NFC: [0xD11F], NFD: [0x1110, 0x1164, 0x11B2], NFKC: [0xD11F], NFKD: [0x1110, 0x1164, 0x11B2] }, +{ source: [0xD120], NFC: [0xD120], NFD: [0x1110, 0x1164, 0x11B3], NFKC: [0xD120], NFKD: [0x1110, 0x1164, 0x11B3] }, +{ source: [0xD121], NFC: [0xD121], NFD: [0x1110, 0x1164, 0x11B4], NFKC: [0xD121], NFKD: [0x1110, 0x1164, 0x11B4] }, +{ source: [0xD122], NFC: [0xD122], NFD: [0x1110, 0x1164, 0x11B5], NFKC: [0xD122], NFKD: [0x1110, 0x1164, 0x11B5] }, +{ source: [0xD123], NFC: [0xD123], NFD: [0x1110, 0x1164, 0x11B6], NFKC: [0xD123], NFKD: [0x1110, 0x1164, 0x11B6] }, +{ source: [0xD124], NFC: [0xD124], NFD: [0x1110, 0x1164, 0x11B7], NFKC: [0xD124], NFKD: [0x1110, 0x1164, 0x11B7] }, +{ source: [0xD125], NFC: [0xD125], NFD: [0x1110, 0x1164, 0x11B8], NFKC: [0xD125], NFKD: [0x1110, 0x1164, 0x11B8] }, +{ source: [0xD126], NFC: [0xD126], NFD: [0x1110, 0x1164, 0x11B9], NFKC: [0xD126], NFKD: [0x1110, 0x1164, 0x11B9] }, +{ source: [0xD127], NFC: [0xD127], NFD: [0x1110, 0x1164, 0x11BA], NFKC: [0xD127], NFKD: [0x1110, 0x1164, 0x11BA] }, +{ source: [0xD128], NFC: [0xD128], NFD: [0x1110, 0x1164, 0x11BB], NFKC: [0xD128], NFKD: [0x1110, 0x1164, 0x11BB] }, +{ source: [0xD129], NFC: [0xD129], NFD: [0x1110, 0x1164, 0x11BC], NFKC: [0xD129], NFKD: [0x1110, 0x1164, 0x11BC] }, +{ source: [0xD12A], NFC: [0xD12A], NFD: [0x1110, 0x1164, 0x11BD], NFKC: [0xD12A], NFKD: [0x1110, 0x1164, 0x11BD] }, +{ source: [0xD12B], NFC: [0xD12B], NFD: [0x1110, 0x1164, 0x11BE], NFKC: [0xD12B], NFKD: [0x1110, 0x1164, 0x11BE] }, +{ source: [0xD12C], NFC: [0xD12C], NFD: [0x1110, 0x1164, 0x11BF], NFKC: [0xD12C], NFKD: [0x1110, 0x1164, 0x11BF] }, +{ source: [0xD12D], NFC: [0xD12D], NFD: [0x1110, 0x1164, 0x11C0], NFKC: [0xD12D], NFKD: [0x1110, 0x1164, 0x11C0] }, +{ source: [0xD12E], NFC: [0xD12E], NFD: [0x1110, 0x1164, 0x11C1], NFKC: [0xD12E], NFKD: [0x1110, 0x1164, 0x11C1] }, +{ source: [0xD12F], NFC: [0xD12F], NFD: [0x1110, 0x1164, 0x11C2], NFKC: [0xD12F], NFKD: [0x1110, 0x1164, 0x11C2] }, +{ source: [0xD130], NFC: [0xD130], NFD: [0x1110, 0x1165], NFKC: [0xD130], NFKD: [0x1110, 0x1165] }, +{ source: [0xD131], NFC: [0xD131], NFD: [0x1110, 0x1165, 0x11A8], NFKC: [0xD131], NFKD: [0x1110, 0x1165, 0x11A8] }, +{ source: [0xD132], NFC: [0xD132], NFD: [0x1110, 0x1165, 0x11A9], NFKC: [0xD132], NFKD: [0x1110, 0x1165, 0x11A9] }, +{ source: [0xD133], NFC: [0xD133], NFD: [0x1110, 0x1165, 0x11AA], NFKC: [0xD133], NFKD: [0x1110, 0x1165, 0x11AA] }, +{ source: [0xD134], NFC: [0xD134], NFD: [0x1110, 0x1165, 0x11AB], NFKC: [0xD134], NFKD: [0x1110, 0x1165, 0x11AB] }, +{ source: [0xD135], NFC: [0xD135], NFD: [0x1110, 0x1165, 0x11AC], NFKC: [0xD135], NFKD: [0x1110, 0x1165, 0x11AC] }, +{ source: [0xD136], NFC: [0xD136], NFD: [0x1110, 0x1165, 0x11AD], NFKC: [0xD136], NFKD: [0x1110, 0x1165, 0x11AD] }, +{ source: [0xD137], NFC: [0xD137], NFD: [0x1110, 0x1165, 0x11AE], NFKC: [0xD137], NFKD: [0x1110, 0x1165, 0x11AE] }, +{ source: [0xD138], NFC: [0xD138], NFD: [0x1110, 0x1165, 0x11AF], NFKC: [0xD138], NFKD: [0x1110, 0x1165, 0x11AF] }, +{ source: [0xD139], NFC: [0xD139], NFD: [0x1110, 0x1165, 0x11B0], NFKC: [0xD139], NFKD: [0x1110, 0x1165, 0x11B0] }, +{ source: [0xD13A], NFC: [0xD13A], NFD: [0x1110, 0x1165, 0x11B1], NFKC: [0xD13A], NFKD: [0x1110, 0x1165, 0x11B1] }, +{ source: [0xD13B], NFC: [0xD13B], NFD: [0x1110, 0x1165, 0x11B2], NFKC: [0xD13B], NFKD: [0x1110, 0x1165, 0x11B2] }, +{ source: [0xD13C], NFC: [0xD13C], NFD: [0x1110, 0x1165, 0x11B3], NFKC: [0xD13C], NFKD: [0x1110, 0x1165, 0x11B3] }, +{ source: [0xD13D], NFC: [0xD13D], NFD: [0x1110, 0x1165, 0x11B4], NFKC: [0xD13D], NFKD: [0x1110, 0x1165, 0x11B4] }, +{ source: [0xD13E], NFC: [0xD13E], NFD: [0x1110, 0x1165, 0x11B5], NFKC: [0xD13E], NFKD: [0x1110, 0x1165, 0x11B5] }, +{ source: [0xD13F], NFC: [0xD13F], NFD: [0x1110, 0x1165, 0x11B6], NFKC: [0xD13F], NFKD: [0x1110, 0x1165, 0x11B6] }, +{ source: [0xD140], NFC: [0xD140], NFD: [0x1110, 0x1165, 0x11B7], NFKC: [0xD140], NFKD: [0x1110, 0x1165, 0x11B7] }, +{ source: [0xD141], NFC: [0xD141], NFD: [0x1110, 0x1165, 0x11B8], NFKC: [0xD141], NFKD: [0x1110, 0x1165, 0x11B8] }, +{ source: [0xD142], NFC: [0xD142], NFD: [0x1110, 0x1165, 0x11B9], NFKC: [0xD142], NFKD: [0x1110, 0x1165, 0x11B9] }, +{ source: [0xD143], NFC: [0xD143], NFD: [0x1110, 0x1165, 0x11BA], NFKC: [0xD143], NFKD: [0x1110, 0x1165, 0x11BA] }, +{ source: [0xD144], NFC: [0xD144], NFD: [0x1110, 0x1165, 0x11BB], NFKC: [0xD144], NFKD: [0x1110, 0x1165, 0x11BB] }, +{ source: [0xD145], NFC: [0xD145], NFD: [0x1110, 0x1165, 0x11BC], NFKC: [0xD145], NFKD: [0x1110, 0x1165, 0x11BC] }, +{ source: [0xD146], NFC: [0xD146], NFD: [0x1110, 0x1165, 0x11BD], NFKC: [0xD146], NFKD: [0x1110, 0x1165, 0x11BD] }, +{ source: [0xD147], NFC: [0xD147], NFD: [0x1110, 0x1165, 0x11BE], NFKC: [0xD147], NFKD: [0x1110, 0x1165, 0x11BE] }, +{ source: [0xD148], NFC: [0xD148], NFD: [0x1110, 0x1165, 0x11BF], NFKC: [0xD148], NFKD: [0x1110, 0x1165, 0x11BF] }, +{ source: [0xD149], NFC: [0xD149], NFD: [0x1110, 0x1165, 0x11C0], NFKC: [0xD149], NFKD: [0x1110, 0x1165, 0x11C0] }, +{ source: [0xD14A], NFC: [0xD14A], NFD: [0x1110, 0x1165, 0x11C1], NFKC: [0xD14A], NFKD: [0x1110, 0x1165, 0x11C1] }, +{ source: [0xD14B], NFC: [0xD14B], NFD: [0x1110, 0x1165, 0x11C2], NFKC: [0xD14B], NFKD: [0x1110, 0x1165, 0x11C2] }, +{ source: [0xD14C], NFC: [0xD14C], NFD: [0x1110, 0x1166], NFKC: [0xD14C], NFKD: [0x1110, 0x1166] }, +{ source: [0xD14D], NFC: [0xD14D], NFD: [0x1110, 0x1166, 0x11A8], NFKC: [0xD14D], NFKD: [0x1110, 0x1166, 0x11A8] }, +{ source: [0xD14E], NFC: [0xD14E], NFD: [0x1110, 0x1166, 0x11A9], NFKC: [0xD14E], NFKD: [0x1110, 0x1166, 0x11A9] }, +{ source: [0xD14F], NFC: [0xD14F], NFD: [0x1110, 0x1166, 0x11AA], NFKC: [0xD14F], NFKD: [0x1110, 0x1166, 0x11AA] }, +{ source: [0xD150], NFC: [0xD150], NFD: [0x1110, 0x1166, 0x11AB], NFKC: [0xD150], NFKD: [0x1110, 0x1166, 0x11AB] }, +{ source: [0xD151], NFC: [0xD151], NFD: [0x1110, 0x1166, 0x11AC], NFKC: [0xD151], NFKD: [0x1110, 0x1166, 0x11AC] }, +{ source: [0xD152], NFC: [0xD152], NFD: [0x1110, 0x1166, 0x11AD], NFKC: [0xD152], NFKD: [0x1110, 0x1166, 0x11AD] }, +{ source: [0xD153], NFC: [0xD153], NFD: [0x1110, 0x1166, 0x11AE], NFKC: [0xD153], NFKD: [0x1110, 0x1166, 0x11AE] }, +{ source: [0xD154], NFC: [0xD154], NFD: [0x1110, 0x1166, 0x11AF], NFKC: [0xD154], NFKD: [0x1110, 0x1166, 0x11AF] }, +{ source: [0xD155], NFC: [0xD155], NFD: [0x1110, 0x1166, 0x11B0], NFKC: [0xD155], NFKD: [0x1110, 0x1166, 0x11B0] }, +{ source: [0xD156], NFC: [0xD156], NFD: [0x1110, 0x1166, 0x11B1], NFKC: [0xD156], NFKD: [0x1110, 0x1166, 0x11B1] }, +{ source: [0xD157], NFC: [0xD157], NFD: [0x1110, 0x1166, 0x11B2], NFKC: [0xD157], NFKD: [0x1110, 0x1166, 0x11B2] }, +{ source: [0xD158], NFC: [0xD158], NFD: [0x1110, 0x1166, 0x11B3], NFKC: [0xD158], NFKD: [0x1110, 0x1166, 0x11B3] }, +{ source: [0xD159], NFC: [0xD159], NFD: [0x1110, 0x1166, 0x11B4], NFKC: [0xD159], NFKD: [0x1110, 0x1166, 0x11B4] }, +{ source: [0xD15A], NFC: [0xD15A], NFD: [0x1110, 0x1166, 0x11B5], NFKC: [0xD15A], NFKD: [0x1110, 0x1166, 0x11B5] }, +{ source: [0xD15B], NFC: [0xD15B], NFD: [0x1110, 0x1166, 0x11B6], NFKC: [0xD15B], NFKD: [0x1110, 0x1166, 0x11B6] }, +{ source: [0xD15C], NFC: [0xD15C], NFD: [0x1110, 0x1166, 0x11B7], NFKC: [0xD15C], NFKD: [0x1110, 0x1166, 0x11B7] }, +{ source: [0xD15D], NFC: [0xD15D], NFD: [0x1110, 0x1166, 0x11B8], NFKC: [0xD15D], NFKD: [0x1110, 0x1166, 0x11B8] }, +{ source: [0xD15E], NFC: [0xD15E], NFD: [0x1110, 0x1166, 0x11B9], NFKC: [0xD15E], NFKD: [0x1110, 0x1166, 0x11B9] }, +{ source: [0xD15F], NFC: [0xD15F], NFD: [0x1110, 0x1166, 0x11BA], NFKC: [0xD15F], NFKD: [0x1110, 0x1166, 0x11BA] }, +{ source: [0xD160], NFC: [0xD160], NFD: [0x1110, 0x1166, 0x11BB], NFKC: [0xD160], NFKD: [0x1110, 0x1166, 0x11BB] }, +{ source: [0xD161], NFC: [0xD161], NFD: [0x1110, 0x1166, 0x11BC], NFKC: [0xD161], NFKD: [0x1110, 0x1166, 0x11BC] }, +{ source: [0xD162], NFC: [0xD162], NFD: [0x1110, 0x1166, 0x11BD], NFKC: [0xD162], NFKD: [0x1110, 0x1166, 0x11BD] }, +{ source: [0xD163], NFC: [0xD163], NFD: [0x1110, 0x1166, 0x11BE], NFKC: [0xD163], NFKD: [0x1110, 0x1166, 0x11BE] }, +{ source: [0xD164], NFC: [0xD164], NFD: [0x1110, 0x1166, 0x11BF], NFKC: [0xD164], NFKD: [0x1110, 0x1166, 0x11BF] }, +{ source: [0xD165], NFC: [0xD165], NFD: [0x1110, 0x1166, 0x11C0], NFKC: [0xD165], NFKD: [0x1110, 0x1166, 0x11C0] }, +{ source: [0xD166], NFC: [0xD166], NFD: [0x1110, 0x1166, 0x11C1], NFKC: [0xD166], NFKD: [0x1110, 0x1166, 0x11C1] }, +{ source: [0xD167], NFC: [0xD167], NFD: [0x1110, 0x1166, 0x11C2], NFKC: [0xD167], NFKD: [0x1110, 0x1166, 0x11C2] }, +{ source: [0xD168], NFC: [0xD168], NFD: [0x1110, 0x1167], NFKC: [0xD168], NFKD: [0x1110, 0x1167] }, +{ source: [0xD169], NFC: [0xD169], NFD: [0x1110, 0x1167, 0x11A8], NFKC: [0xD169], NFKD: [0x1110, 0x1167, 0x11A8] }, +{ source: [0xD16A], NFC: [0xD16A], NFD: [0x1110, 0x1167, 0x11A9], NFKC: [0xD16A], NFKD: [0x1110, 0x1167, 0x11A9] }, +{ source: [0xD16B], NFC: [0xD16B], NFD: [0x1110, 0x1167, 0x11AA], NFKC: [0xD16B], NFKD: [0x1110, 0x1167, 0x11AA] }, +{ source: [0xD16C], NFC: [0xD16C], NFD: [0x1110, 0x1167, 0x11AB], NFKC: [0xD16C], NFKD: [0x1110, 0x1167, 0x11AB] }, +{ source: [0xD16D], NFC: [0xD16D], NFD: [0x1110, 0x1167, 0x11AC], NFKC: [0xD16D], NFKD: [0x1110, 0x1167, 0x11AC] }, +{ source: [0xD16E], NFC: [0xD16E], NFD: [0x1110, 0x1167, 0x11AD], NFKC: [0xD16E], NFKD: [0x1110, 0x1167, 0x11AD] }, +{ source: [0xD16F], NFC: [0xD16F], NFD: [0x1110, 0x1167, 0x11AE], NFKC: [0xD16F], NFKD: [0x1110, 0x1167, 0x11AE] }, +{ source: [0xD170], NFC: [0xD170], NFD: [0x1110, 0x1167, 0x11AF], NFKC: [0xD170], NFKD: [0x1110, 0x1167, 0x11AF] }, +{ source: [0xD171], NFC: [0xD171], NFD: [0x1110, 0x1167, 0x11B0], NFKC: [0xD171], NFKD: [0x1110, 0x1167, 0x11B0] }, +{ source: [0xD172], NFC: [0xD172], NFD: [0x1110, 0x1167, 0x11B1], NFKC: [0xD172], NFKD: [0x1110, 0x1167, 0x11B1] }, +{ source: [0xD173], NFC: [0xD173], NFD: [0x1110, 0x1167, 0x11B2], NFKC: [0xD173], NFKD: [0x1110, 0x1167, 0x11B2] }, +{ source: [0xD174], NFC: [0xD174], NFD: [0x1110, 0x1167, 0x11B3], NFKC: [0xD174], NFKD: [0x1110, 0x1167, 0x11B3] }, +{ source: [0xD175], NFC: [0xD175], NFD: [0x1110, 0x1167, 0x11B4], NFKC: [0xD175], NFKD: [0x1110, 0x1167, 0x11B4] }, +{ source: [0xD176], NFC: [0xD176], NFD: [0x1110, 0x1167, 0x11B5], NFKC: [0xD176], NFKD: [0x1110, 0x1167, 0x11B5] }, +{ source: [0xD177], NFC: [0xD177], NFD: [0x1110, 0x1167, 0x11B6], NFKC: [0xD177], NFKD: [0x1110, 0x1167, 0x11B6] }, +{ source: [0xD178], NFC: [0xD178], NFD: [0x1110, 0x1167, 0x11B7], NFKC: [0xD178], NFKD: [0x1110, 0x1167, 0x11B7] }, +{ source: [0xD179], NFC: [0xD179], NFD: [0x1110, 0x1167, 0x11B8], NFKC: [0xD179], NFKD: [0x1110, 0x1167, 0x11B8] }, +{ source: [0xD17A], NFC: [0xD17A], NFD: [0x1110, 0x1167, 0x11B9], NFKC: [0xD17A], NFKD: [0x1110, 0x1167, 0x11B9] }, +{ source: [0xD17B], NFC: [0xD17B], NFD: [0x1110, 0x1167, 0x11BA], NFKC: [0xD17B], NFKD: [0x1110, 0x1167, 0x11BA] }, +{ source: [0xD17C], NFC: [0xD17C], NFD: [0x1110, 0x1167, 0x11BB], NFKC: [0xD17C], NFKD: [0x1110, 0x1167, 0x11BB] }, +{ source: [0xD17D], NFC: [0xD17D], NFD: [0x1110, 0x1167, 0x11BC], NFKC: [0xD17D], NFKD: [0x1110, 0x1167, 0x11BC] }, +{ source: [0xD17E], NFC: [0xD17E], NFD: [0x1110, 0x1167, 0x11BD], NFKC: [0xD17E], NFKD: [0x1110, 0x1167, 0x11BD] }, +{ source: [0xD17F], NFC: [0xD17F], NFD: [0x1110, 0x1167, 0x11BE], NFKC: [0xD17F], NFKD: [0x1110, 0x1167, 0x11BE] }, +{ source: [0xD180], NFC: [0xD180], NFD: [0x1110, 0x1167, 0x11BF], NFKC: [0xD180], NFKD: [0x1110, 0x1167, 0x11BF] }, +{ source: [0xD181], NFC: [0xD181], NFD: [0x1110, 0x1167, 0x11C0], NFKC: [0xD181], NFKD: [0x1110, 0x1167, 0x11C0] }, +{ source: [0xD182], NFC: [0xD182], NFD: [0x1110, 0x1167, 0x11C1], NFKC: [0xD182], NFKD: [0x1110, 0x1167, 0x11C1] }, +{ source: [0xD183], NFC: [0xD183], NFD: [0x1110, 0x1167, 0x11C2], NFKC: [0xD183], NFKD: [0x1110, 0x1167, 0x11C2] }, +{ source: [0xD184], NFC: [0xD184], NFD: [0x1110, 0x1168], NFKC: [0xD184], NFKD: [0x1110, 0x1168] }, +{ source: [0xD185], NFC: [0xD185], NFD: [0x1110, 0x1168, 0x11A8], NFKC: [0xD185], NFKD: [0x1110, 0x1168, 0x11A8] }, +{ source: [0xD186], NFC: [0xD186], NFD: [0x1110, 0x1168, 0x11A9], NFKC: [0xD186], NFKD: [0x1110, 0x1168, 0x11A9] }, +{ source: [0xD187], NFC: [0xD187], NFD: [0x1110, 0x1168, 0x11AA], NFKC: [0xD187], NFKD: [0x1110, 0x1168, 0x11AA] }, +{ source: [0xD188], NFC: [0xD188], NFD: [0x1110, 0x1168, 0x11AB], NFKC: [0xD188], NFKD: [0x1110, 0x1168, 0x11AB] }, +{ source: [0xD189], NFC: [0xD189], NFD: [0x1110, 0x1168, 0x11AC], NFKC: [0xD189], NFKD: [0x1110, 0x1168, 0x11AC] }, +{ source: [0xD18A], NFC: [0xD18A], NFD: [0x1110, 0x1168, 0x11AD], NFKC: [0xD18A], NFKD: [0x1110, 0x1168, 0x11AD] }, +{ source: [0xD18B], NFC: [0xD18B], NFD: [0x1110, 0x1168, 0x11AE], NFKC: [0xD18B], NFKD: [0x1110, 0x1168, 0x11AE] }, +{ source: [0xD18C], NFC: [0xD18C], NFD: [0x1110, 0x1168, 0x11AF], NFKC: [0xD18C], NFKD: [0x1110, 0x1168, 0x11AF] }, +{ source: [0xD18D], NFC: [0xD18D], NFD: [0x1110, 0x1168, 0x11B0], NFKC: [0xD18D], NFKD: [0x1110, 0x1168, 0x11B0] }, +{ source: [0xD18E], NFC: [0xD18E], NFD: [0x1110, 0x1168, 0x11B1], NFKC: [0xD18E], NFKD: [0x1110, 0x1168, 0x11B1] }, +{ source: [0xD18F], NFC: [0xD18F], NFD: [0x1110, 0x1168, 0x11B2], NFKC: [0xD18F], NFKD: [0x1110, 0x1168, 0x11B2] }, +{ source: [0xD190], NFC: [0xD190], NFD: [0x1110, 0x1168, 0x11B3], NFKC: [0xD190], NFKD: [0x1110, 0x1168, 0x11B3] }, +{ source: [0xD191], NFC: [0xD191], NFD: [0x1110, 0x1168, 0x11B4], NFKC: [0xD191], NFKD: [0x1110, 0x1168, 0x11B4] }, +{ source: [0xD192], NFC: [0xD192], NFD: [0x1110, 0x1168, 0x11B5], NFKC: [0xD192], NFKD: [0x1110, 0x1168, 0x11B5] }, +{ source: [0xD193], NFC: [0xD193], NFD: [0x1110, 0x1168, 0x11B6], NFKC: [0xD193], NFKD: [0x1110, 0x1168, 0x11B6] }, +{ source: [0xD194], NFC: [0xD194], NFD: [0x1110, 0x1168, 0x11B7], NFKC: [0xD194], NFKD: [0x1110, 0x1168, 0x11B7] }, +{ source: [0xD195], NFC: [0xD195], NFD: [0x1110, 0x1168, 0x11B8], NFKC: [0xD195], NFKD: [0x1110, 0x1168, 0x11B8] }, +{ source: [0xD196], NFC: [0xD196], NFD: [0x1110, 0x1168, 0x11B9], NFKC: [0xD196], NFKD: [0x1110, 0x1168, 0x11B9] }, +{ source: [0xD197], NFC: [0xD197], NFD: [0x1110, 0x1168, 0x11BA], NFKC: [0xD197], NFKD: [0x1110, 0x1168, 0x11BA] }, +{ source: [0xD198], NFC: [0xD198], NFD: [0x1110, 0x1168, 0x11BB], NFKC: [0xD198], NFKD: [0x1110, 0x1168, 0x11BB] }, +{ source: [0xD199], NFC: [0xD199], NFD: [0x1110, 0x1168, 0x11BC], NFKC: [0xD199], NFKD: [0x1110, 0x1168, 0x11BC] }, +{ source: [0xD19A], NFC: [0xD19A], NFD: [0x1110, 0x1168, 0x11BD], NFKC: [0xD19A], NFKD: [0x1110, 0x1168, 0x11BD] }, +{ source: [0xD19B], NFC: [0xD19B], NFD: [0x1110, 0x1168, 0x11BE], NFKC: [0xD19B], NFKD: [0x1110, 0x1168, 0x11BE] }, +{ source: [0xD19C], NFC: [0xD19C], NFD: [0x1110, 0x1168, 0x11BF], NFKC: [0xD19C], NFKD: [0x1110, 0x1168, 0x11BF] }, +{ source: [0xD19D], NFC: [0xD19D], NFD: [0x1110, 0x1168, 0x11C0], NFKC: [0xD19D], NFKD: [0x1110, 0x1168, 0x11C0] }, +{ source: [0xD19E], NFC: [0xD19E], NFD: [0x1110, 0x1168, 0x11C1], NFKC: [0xD19E], NFKD: [0x1110, 0x1168, 0x11C1] }, +{ source: [0xD19F], NFC: [0xD19F], NFD: [0x1110, 0x1168, 0x11C2], NFKC: [0xD19F], NFKD: [0x1110, 0x1168, 0x11C2] }, +{ source: [0xD1A0], NFC: [0xD1A0], NFD: [0x1110, 0x1169], NFKC: [0xD1A0], NFKD: [0x1110, 0x1169] }, +{ source: [0xD1A1], NFC: [0xD1A1], NFD: [0x1110, 0x1169, 0x11A8], NFKC: [0xD1A1], NFKD: [0x1110, 0x1169, 0x11A8] }, +{ source: [0xD1A2], NFC: [0xD1A2], NFD: [0x1110, 0x1169, 0x11A9], NFKC: [0xD1A2], NFKD: [0x1110, 0x1169, 0x11A9] }, +{ source: [0xD1A3], NFC: [0xD1A3], NFD: [0x1110, 0x1169, 0x11AA], NFKC: [0xD1A3], NFKD: [0x1110, 0x1169, 0x11AA] }, +{ source: [0xD1A4], NFC: [0xD1A4], NFD: [0x1110, 0x1169, 0x11AB], NFKC: [0xD1A4], NFKD: [0x1110, 0x1169, 0x11AB] }, +{ source: [0xD1A5], NFC: [0xD1A5], NFD: [0x1110, 0x1169, 0x11AC], NFKC: [0xD1A5], NFKD: [0x1110, 0x1169, 0x11AC] }, +{ source: [0xD1A6], NFC: [0xD1A6], NFD: [0x1110, 0x1169, 0x11AD], NFKC: [0xD1A6], NFKD: [0x1110, 0x1169, 0x11AD] }, +{ source: [0xD1A7], NFC: [0xD1A7], NFD: [0x1110, 0x1169, 0x11AE], NFKC: [0xD1A7], NFKD: [0x1110, 0x1169, 0x11AE] }, +{ source: [0xD1A8], NFC: [0xD1A8], NFD: [0x1110, 0x1169, 0x11AF], NFKC: [0xD1A8], NFKD: [0x1110, 0x1169, 0x11AF] }, +{ source: [0xD1A9], NFC: [0xD1A9], NFD: [0x1110, 0x1169, 0x11B0], NFKC: [0xD1A9], NFKD: [0x1110, 0x1169, 0x11B0] }, +{ source: [0xD1AA], NFC: [0xD1AA], NFD: [0x1110, 0x1169, 0x11B1], NFKC: [0xD1AA], NFKD: [0x1110, 0x1169, 0x11B1] }, +{ source: [0xD1AB], NFC: [0xD1AB], NFD: [0x1110, 0x1169, 0x11B2], NFKC: [0xD1AB], NFKD: [0x1110, 0x1169, 0x11B2] }, +{ source: [0xD1AC], NFC: [0xD1AC], NFD: [0x1110, 0x1169, 0x11B3], NFKC: [0xD1AC], NFKD: [0x1110, 0x1169, 0x11B3] }, +{ source: [0xD1AD], NFC: [0xD1AD], NFD: [0x1110, 0x1169, 0x11B4], NFKC: [0xD1AD], NFKD: [0x1110, 0x1169, 0x11B4] }, +{ source: [0xD1AE], NFC: [0xD1AE], NFD: [0x1110, 0x1169, 0x11B5], NFKC: [0xD1AE], NFKD: [0x1110, 0x1169, 0x11B5] }, +{ source: [0xD1AF], NFC: [0xD1AF], NFD: [0x1110, 0x1169, 0x11B6], NFKC: [0xD1AF], NFKD: [0x1110, 0x1169, 0x11B6] }, +{ source: [0xD1B0], NFC: [0xD1B0], NFD: [0x1110, 0x1169, 0x11B7], NFKC: [0xD1B0], NFKD: [0x1110, 0x1169, 0x11B7] }, +{ source: [0xD1B1], NFC: [0xD1B1], NFD: [0x1110, 0x1169, 0x11B8], NFKC: [0xD1B1], NFKD: [0x1110, 0x1169, 0x11B8] }, +{ source: [0xD1B2], NFC: [0xD1B2], NFD: [0x1110, 0x1169, 0x11B9], NFKC: [0xD1B2], NFKD: [0x1110, 0x1169, 0x11B9] }, +{ source: [0xD1B3], NFC: [0xD1B3], NFD: [0x1110, 0x1169, 0x11BA], NFKC: [0xD1B3], NFKD: [0x1110, 0x1169, 0x11BA] }, +{ source: [0xD1B4], NFC: [0xD1B4], NFD: [0x1110, 0x1169, 0x11BB], NFKC: [0xD1B4], NFKD: [0x1110, 0x1169, 0x11BB] }, +{ source: [0xD1B5], NFC: [0xD1B5], NFD: [0x1110, 0x1169, 0x11BC], NFKC: [0xD1B5], NFKD: [0x1110, 0x1169, 0x11BC] }, +{ source: [0xD1B6], NFC: [0xD1B6], NFD: [0x1110, 0x1169, 0x11BD], NFKC: [0xD1B6], NFKD: [0x1110, 0x1169, 0x11BD] }, +{ source: [0xD1B7], NFC: [0xD1B7], NFD: [0x1110, 0x1169, 0x11BE], NFKC: [0xD1B7], NFKD: [0x1110, 0x1169, 0x11BE] }, +{ source: [0xD1B8], NFC: [0xD1B8], NFD: [0x1110, 0x1169, 0x11BF], NFKC: [0xD1B8], NFKD: [0x1110, 0x1169, 0x11BF] }, +{ source: [0xD1B9], NFC: [0xD1B9], NFD: [0x1110, 0x1169, 0x11C0], NFKC: [0xD1B9], NFKD: [0x1110, 0x1169, 0x11C0] }, +{ source: [0xD1BA], NFC: [0xD1BA], NFD: [0x1110, 0x1169, 0x11C1], NFKC: [0xD1BA], NFKD: [0x1110, 0x1169, 0x11C1] }, +{ source: [0xD1BB], NFC: [0xD1BB], NFD: [0x1110, 0x1169, 0x11C2], NFKC: [0xD1BB], NFKD: [0x1110, 0x1169, 0x11C2] }, +{ source: [0xD1BC], NFC: [0xD1BC], NFD: [0x1110, 0x116A], NFKC: [0xD1BC], NFKD: [0x1110, 0x116A] }, +{ source: [0xD1BD], NFC: [0xD1BD], NFD: [0x1110, 0x116A, 0x11A8], NFKC: [0xD1BD], NFKD: [0x1110, 0x116A, 0x11A8] }, +{ source: [0xD1BE], NFC: [0xD1BE], NFD: [0x1110, 0x116A, 0x11A9], NFKC: [0xD1BE], NFKD: [0x1110, 0x116A, 0x11A9] }, +{ source: [0xD1BF], NFC: [0xD1BF], NFD: [0x1110, 0x116A, 0x11AA], NFKC: [0xD1BF], NFKD: [0x1110, 0x116A, 0x11AA] }, +{ source: [0xD1C0], NFC: [0xD1C0], NFD: [0x1110, 0x116A, 0x11AB], NFKC: [0xD1C0], NFKD: [0x1110, 0x116A, 0x11AB] }, +{ source: [0xD1C1], NFC: [0xD1C1], NFD: [0x1110, 0x116A, 0x11AC], NFKC: [0xD1C1], NFKD: [0x1110, 0x116A, 0x11AC] }, +{ source: [0xD1C2], NFC: [0xD1C2], NFD: [0x1110, 0x116A, 0x11AD], NFKC: [0xD1C2], NFKD: [0x1110, 0x116A, 0x11AD] }, +{ source: [0xD1C3], NFC: [0xD1C3], NFD: [0x1110, 0x116A, 0x11AE], NFKC: [0xD1C3], NFKD: [0x1110, 0x116A, 0x11AE] }, +{ source: [0xD1C4], NFC: [0xD1C4], NFD: [0x1110, 0x116A, 0x11AF], NFKC: [0xD1C4], NFKD: [0x1110, 0x116A, 0x11AF] }, +{ source: [0xD1C5], NFC: [0xD1C5], NFD: [0x1110, 0x116A, 0x11B0], NFKC: [0xD1C5], NFKD: [0x1110, 0x116A, 0x11B0] }, +{ source: [0xD1C6], NFC: [0xD1C6], NFD: [0x1110, 0x116A, 0x11B1], NFKC: [0xD1C6], NFKD: [0x1110, 0x116A, 0x11B1] }, +{ source: [0xD1C7], NFC: [0xD1C7], NFD: [0x1110, 0x116A, 0x11B2], NFKC: [0xD1C7], NFKD: [0x1110, 0x116A, 0x11B2] }, +{ source: [0xD1C8], NFC: [0xD1C8], NFD: [0x1110, 0x116A, 0x11B3], NFKC: [0xD1C8], NFKD: [0x1110, 0x116A, 0x11B3] }, +{ source: [0xD1C9], NFC: [0xD1C9], NFD: [0x1110, 0x116A, 0x11B4], NFKC: [0xD1C9], NFKD: [0x1110, 0x116A, 0x11B4] }, +{ source: [0xD1CA], NFC: [0xD1CA], NFD: [0x1110, 0x116A, 0x11B5], NFKC: [0xD1CA], NFKD: [0x1110, 0x116A, 0x11B5] }, +{ source: [0xD1CB], NFC: [0xD1CB], NFD: [0x1110, 0x116A, 0x11B6], NFKC: [0xD1CB], NFKD: [0x1110, 0x116A, 0x11B6] }, +{ source: [0xD1CC], NFC: [0xD1CC], NFD: [0x1110, 0x116A, 0x11B7], NFKC: [0xD1CC], NFKD: [0x1110, 0x116A, 0x11B7] }, +{ source: [0xD1CD], NFC: [0xD1CD], NFD: [0x1110, 0x116A, 0x11B8], NFKC: [0xD1CD], NFKD: [0x1110, 0x116A, 0x11B8] }, +{ source: [0xD1CE], NFC: [0xD1CE], NFD: [0x1110, 0x116A, 0x11B9], NFKC: [0xD1CE], NFKD: [0x1110, 0x116A, 0x11B9] }, +{ source: [0xD1CF], NFC: [0xD1CF], NFD: [0x1110, 0x116A, 0x11BA], NFKC: [0xD1CF], NFKD: [0x1110, 0x116A, 0x11BA] }, +{ source: [0xD1D0], NFC: [0xD1D0], NFD: [0x1110, 0x116A, 0x11BB], NFKC: [0xD1D0], NFKD: [0x1110, 0x116A, 0x11BB] }, +{ source: [0xD1D1], NFC: [0xD1D1], NFD: [0x1110, 0x116A, 0x11BC], NFKC: [0xD1D1], NFKD: [0x1110, 0x116A, 0x11BC] }, +{ source: [0xD1D2], NFC: [0xD1D2], NFD: [0x1110, 0x116A, 0x11BD], NFKC: [0xD1D2], NFKD: [0x1110, 0x116A, 0x11BD] }, +{ source: [0xD1D3], NFC: [0xD1D3], NFD: [0x1110, 0x116A, 0x11BE], NFKC: [0xD1D3], NFKD: [0x1110, 0x116A, 0x11BE] }, +{ source: [0xD1D4], NFC: [0xD1D4], NFD: [0x1110, 0x116A, 0x11BF], NFKC: [0xD1D4], NFKD: [0x1110, 0x116A, 0x11BF] }, +{ source: [0xD1D5], NFC: [0xD1D5], NFD: [0x1110, 0x116A, 0x11C0], NFKC: [0xD1D5], NFKD: [0x1110, 0x116A, 0x11C0] }, +{ source: [0xD1D6], NFC: [0xD1D6], NFD: [0x1110, 0x116A, 0x11C1], NFKC: [0xD1D6], NFKD: [0x1110, 0x116A, 0x11C1] }, +{ source: [0xD1D7], NFC: [0xD1D7], NFD: [0x1110, 0x116A, 0x11C2], NFKC: [0xD1D7], NFKD: [0x1110, 0x116A, 0x11C2] }, +{ source: [0xD1D8], NFC: [0xD1D8], NFD: [0x1110, 0x116B], NFKC: [0xD1D8], NFKD: [0x1110, 0x116B] }, +{ source: [0xD1D9], NFC: [0xD1D9], NFD: [0x1110, 0x116B, 0x11A8], NFKC: [0xD1D9], NFKD: [0x1110, 0x116B, 0x11A8] }, +{ source: [0xD1DA], NFC: [0xD1DA], NFD: [0x1110, 0x116B, 0x11A9], NFKC: [0xD1DA], NFKD: [0x1110, 0x116B, 0x11A9] }, +{ source: [0xD1DB], NFC: [0xD1DB], NFD: [0x1110, 0x116B, 0x11AA], NFKC: [0xD1DB], NFKD: [0x1110, 0x116B, 0x11AA] }, +{ source: [0xD1DC], NFC: [0xD1DC], NFD: [0x1110, 0x116B, 0x11AB], NFKC: [0xD1DC], NFKD: [0x1110, 0x116B, 0x11AB] }, +{ source: [0xD1DD], NFC: [0xD1DD], NFD: [0x1110, 0x116B, 0x11AC], NFKC: [0xD1DD], NFKD: [0x1110, 0x116B, 0x11AC] }, +{ source: [0xD1DE], NFC: [0xD1DE], NFD: [0x1110, 0x116B, 0x11AD], NFKC: [0xD1DE], NFKD: [0x1110, 0x116B, 0x11AD] }, +{ source: [0xD1DF], NFC: [0xD1DF], NFD: [0x1110, 0x116B, 0x11AE], NFKC: [0xD1DF], NFKD: [0x1110, 0x116B, 0x11AE] }, +{ source: [0xD1E0], NFC: [0xD1E0], NFD: [0x1110, 0x116B, 0x11AF], NFKC: [0xD1E0], NFKD: [0x1110, 0x116B, 0x11AF] }, +{ source: [0xD1E1], NFC: [0xD1E1], NFD: [0x1110, 0x116B, 0x11B0], NFKC: [0xD1E1], NFKD: [0x1110, 0x116B, 0x11B0] }, +{ source: [0xD1E2], NFC: [0xD1E2], NFD: [0x1110, 0x116B, 0x11B1], NFKC: [0xD1E2], NFKD: [0x1110, 0x116B, 0x11B1] }, +{ source: [0xD1E3], NFC: [0xD1E3], NFD: [0x1110, 0x116B, 0x11B2], NFKC: [0xD1E3], NFKD: [0x1110, 0x116B, 0x11B2] }, +{ source: [0xD1E4], NFC: [0xD1E4], NFD: [0x1110, 0x116B, 0x11B3], NFKC: [0xD1E4], NFKD: [0x1110, 0x116B, 0x11B3] }, +{ source: [0xD1E5], NFC: [0xD1E5], NFD: [0x1110, 0x116B, 0x11B4], NFKC: [0xD1E5], NFKD: [0x1110, 0x116B, 0x11B4] }, +{ source: [0xD1E6], NFC: [0xD1E6], NFD: [0x1110, 0x116B, 0x11B5], NFKC: [0xD1E6], NFKD: [0x1110, 0x116B, 0x11B5] }, +{ source: [0xD1E7], NFC: [0xD1E7], NFD: [0x1110, 0x116B, 0x11B6], NFKC: [0xD1E7], NFKD: [0x1110, 0x116B, 0x11B6] }, +{ source: [0xD1E8], NFC: [0xD1E8], NFD: [0x1110, 0x116B, 0x11B7], NFKC: [0xD1E8], NFKD: [0x1110, 0x116B, 0x11B7] }, +{ source: [0xD1E9], NFC: [0xD1E9], NFD: [0x1110, 0x116B, 0x11B8], NFKC: [0xD1E9], NFKD: [0x1110, 0x116B, 0x11B8] }, +{ source: [0xD1EA], NFC: [0xD1EA], NFD: [0x1110, 0x116B, 0x11B9], NFKC: [0xD1EA], NFKD: [0x1110, 0x116B, 0x11B9] }, +{ source: [0xD1EB], NFC: [0xD1EB], NFD: [0x1110, 0x116B, 0x11BA], NFKC: [0xD1EB], NFKD: [0x1110, 0x116B, 0x11BA] }, +{ source: [0xD1EC], NFC: [0xD1EC], NFD: [0x1110, 0x116B, 0x11BB], NFKC: [0xD1EC], NFKD: [0x1110, 0x116B, 0x11BB] }, +{ source: [0xD1ED], NFC: [0xD1ED], NFD: [0x1110, 0x116B, 0x11BC], NFKC: [0xD1ED], NFKD: [0x1110, 0x116B, 0x11BC] }, +{ source: [0xD1EE], NFC: [0xD1EE], NFD: [0x1110, 0x116B, 0x11BD], NFKC: [0xD1EE], NFKD: [0x1110, 0x116B, 0x11BD] }, +{ source: [0xD1EF], NFC: [0xD1EF], NFD: [0x1110, 0x116B, 0x11BE], NFKC: [0xD1EF], NFKD: [0x1110, 0x116B, 0x11BE] }, +{ source: [0xD1F0], NFC: [0xD1F0], NFD: [0x1110, 0x116B, 0x11BF], NFKC: [0xD1F0], NFKD: [0x1110, 0x116B, 0x11BF] }, +{ source: [0xD1F1], NFC: [0xD1F1], NFD: [0x1110, 0x116B, 0x11C0], NFKC: [0xD1F1], NFKD: [0x1110, 0x116B, 0x11C0] }, +{ source: [0xD1F2], NFC: [0xD1F2], NFD: [0x1110, 0x116B, 0x11C1], NFKC: [0xD1F2], NFKD: [0x1110, 0x116B, 0x11C1] }, +{ source: [0xD1F3], NFC: [0xD1F3], NFD: [0x1110, 0x116B, 0x11C2], NFKC: [0xD1F3], NFKD: [0x1110, 0x116B, 0x11C2] }, +{ source: [0xD1F4], NFC: [0xD1F4], NFD: [0x1110, 0x116C], NFKC: [0xD1F4], NFKD: [0x1110, 0x116C] }, +{ source: [0xD1F5], NFC: [0xD1F5], NFD: [0x1110, 0x116C, 0x11A8], NFKC: [0xD1F5], NFKD: [0x1110, 0x116C, 0x11A8] }, +{ source: [0xD1F6], NFC: [0xD1F6], NFD: [0x1110, 0x116C, 0x11A9], NFKC: [0xD1F6], NFKD: [0x1110, 0x116C, 0x11A9] }, +{ source: [0xD1F7], NFC: [0xD1F7], NFD: [0x1110, 0x116C, 0x11AA], NFKC: [0xD1F7], NFKD: [0x1110, 0x116C, 0x11AA] }, +{ source: [0xD1F8], NFC: [0xD1F8], NFD: [0x1110, 0x116C, 0x11AB], NFKC: [0xD1F8], NFKD: [0x1110, 0x116C, 0x11AB] }, +{ source: [0xD1F9], NFC: [0xD1F9], NFD: [0x1110, 0x116C, 0x11AC], NFKC: [0xD1F9], NFKD: [0x1110, 0x116C, 0x11AC] }, +{ source: [0xD1FA], NFC: [0xD1FA], NFD: [0x1110, 0x116C, 0x11AD], NFKC: [0xD1FA], NFKD: [0x1110, 0x116C, 0x11AD] }, +{ source: [0xD1FB], NFC: [0xD1FB], NFD: [0x1110, 0x116C, 0x11AE], NFKC: [0xD1FB], NFKD: [0x1110, 0x116C, 0x11AE] }, +{ source: [0xD1FC], NFC: [0xD1FC], NFD: [0x1110, 0x116C, 0x11AF], NFKC: [0xD1FC], NFKD: [0x1110, 0x116C, 0x11AF] }, +{ source: [0xD1FD], NFC: [0xD1FD], NFD: [0x1110, 0x116C, 0x11B0], NFKC: [0xD1FD], NFKD: [0x1110, 0x116C, 0x11B0] }, +{ source: [0xD1FE], NFC: [0xD1FE], NFD: [0x1110, 0x116C, 0x11B1], NFKC: [0xD1FE], NFKD: [0x1110, 0x116C, 0x11B1] }, +{ source: [0xD1FF], NFC: [0xD1FF], NFD: [0x1110, 0x116C, 0x11B2], NFKC: [0xD1FF], NFKD: [0x1110, 0x116C, 0x11B2] }, +{ source: [0xD200], NFC: [0xD200], NFD: [0x1110, 0x116C, 0x11B3], NFKC: [0xD200], NFKD: [0x1110, 0x116C, 0x11B3] }, +{ source: [0xD201], NFC: [0xD201], NFD: [0x1110, 0x116C, 0x11B4], NFKC: [0xD201], NFKD: [0x1110, 0x116C, 0x11B4] }, +{ source: [0xD202], NFC: [0xD202], NFD: [0x1110, 0x116C, 0x11B5], NFKC: [0xD202], NFKD: [0x1110, 0x116C, 0x11B5] }, +{ source: [0xD203], NFC: [0xD203], NFD: [0x1110, 0x116C, 0x11B6], NFKC: [0xD203], NFKD: [0x1110, 0x116C, 0x11B6] }, +{ source: [0xD204], NFC: [0xD204], NFD: [0x1110, 0x116C, 0x11B7], NFKC: [0xD204], NFKD: [0x1110, 0x116C, 0x11B7] }, +{ source: [0xD205], NFC: [0xD205], NFD: [0x1110, 0x116C, 0x11B8], NFKC: [0xD205], NFKD: [0x1110, 0x116C, 0x11B8] }, +{ source: [0xD206], NFC: [0xD206], NFD: [0x1110, 0x116C, 0x11B9], NFKC: [0xD206], NFKD: [0x1110, 0x116C, 0x11B9] }, +{ source: [0xD207], NFC: [0xD207], NFD: [0x1110, 0x116C, 0x11BA], NFKC: [0xD207], NFKD: [0x1110, 0x116C, 0x11BA] }, +{ source: [0xD208], NFC: [0xD208], NFD: [0x1110, 0x116C, 0x11BB], NFKC: [0xD208], NFKD: [0x1110, 0x116C, 0x11BB] }, +{ source: [0xD209], NFC: [0xD209], NFD: [0x1110, 0x116C, 0x11BC], NFKC: [0xD209], NFKD: [0x1110, 0x116C, 0x11BC] }, +{ source: [0xD20A], NFC: [0xD20A], NFD: [0x1110, 0x116C, 0x11BD], NFKC: [0xD20A], NFKD: [0x1110, 0x116C, 0x11BD] }, +{ source: [0xD20B], NFC: [0xD20B], NFD: [0x1110, 0x116C, 0x11BE], NFKC: [0xD20B], NFKD: [0x1110, 0x116C, 0x11BE] }, +{ source: [0xD20C], NFC: [0xD20C], NFD: [0x1110, 0x116C, 0x11BF], NFKC: [0xD20C], NFKD: [0x1110, 0x116C, 0x11BF] }, +{ source: [0xD20D], NFC: [0xD20D], NFD: [0x1110, 0x116C, 0x11C0], NFKC: [0xD20D], NFKD: [0x1110, 0x116C, 0x11C0] }, +{ source: [0xD20E], NFC: [0xD20E], NFD: [0x1110, 0x116C, 0x11C1], NFKC: [0xD20E], NFKD: [0x1110, 0x116C, 0x11C1] }, +{ source: [0xD20F], NFC: [0xD20F], NFD: [0x1110, 0x116C, 0x11C2], NFKC: [0xD20F], NFKD: [0x1110, 0x116C, 0x11C2] }, +{ source: [0xD210], NFC: [0xD210], NFD: [0x1110, 0x116D], NFKC: [0xD210], NFKD: [0x1110, 0x116D] }, +{ source: [0xD211], NFC: [0xD211], NFD: [0x1110, 0x116D, 0x11A8], NFKC: [0xD211], NFKD: [0x1110, 0x116D, 0x11A8] }, +{ source: [0xD212], NFC: [0xD212], NFD: [0x1110, 0x116D, 0x11A9], NFKC: [0xD212], NFKD: [0x1110, 0x116D, 0x11A9] }, +{ source: [0xD213], NFC: [0xD213], NFD: [0x1110, 0x116D, 0x11AA], NFKC: [0xD213], NFKD: [0x1110, 0x116D, 0x11AA] }, +{ source: [0xD214], NFC: [0xD214], NFD: [0x1110, 0x116D, 0x11AB], NFKC: [0xD214], NFKD: [0x1110, 0x116D, 0x11AB] }, +{ source: [0xD215], NFC: [0xD215], NFD: [0x1110, 0x116D, 0x11AC], NFKC: [0xD215], NFKD: [0x1110, 0x116D, 0x11AC] }, +{ source: [0xD216], NFC: [0xD216], NFD: [0x1110, 0x116D, 0x11AD], NFKC: [0xD216], NFKD: [0x1110, 0x116D, 0x11AD] }, +{ source: [0xD217], NFC: [0xD217], NFD: [0x1110, 0x116D, 0x11AE], NFKC: [0xD217], NFKD: [0x1110, 0x116D, 0x11AE] }, +{ source: [0xD218], NFC: [0xD218], NFD: [0x1110, 0x116D, 0x11AF], NFKC: [0xD218], NFKD: [0x1110, 0x116D, 0x11AF] }, +{ source: [0xD219], NFC: [0xD219], NFD: [0x1110, 0x116D, 0x11B0], NFKC: [0xD219], NFKD: [0x1110, 0x116D, 0x11B0] }, +{ source: [0xD21A], NFC: [0xD21A], NFD: [0x1110, 0x116D, 0x11B1], NFKC: [0xD21A], NFKD: [0x1110, 0x116D, 0x11B1] }, +{ source: [0xD21B], NFC: [0xD21B], NFD: [0x1110, 0x116D, 0x11B2], NFKC: [0xD21B], NFKD: [0x1110, 0x116D, 0x11B2] }, +{ source: [0xD21C], NFC: [0xD21C], NFD: [0x1110, 0x116D, 0x11B3], NFKC: [0xD21C], NFKD: [0x1110, 0x116D, 0x11B3] }, +{ source: [0xD21D], NFC: [0xD21D], NFD: [0x1110, 0x116D, 0x11B4], NFKC: [0xD21D], NFKD: [0x1110, 0x116D, 0x11B4] }, +{ source: [0xD21E], NFC: [0xD21E], NFD: [0x1110, 0x116D, 0x11B5], NFKC: [0xD21E], NFKD: [0x1110, 0x116D, 0x11B5] }, +{ source: [0xD21F], NFC: [0xD21F], NFD: [0x1110, 0x116D, 0x11B6], NFKC: [0xD21F], NFKD: [0x1110, 0x116D, 0x11B6] }, +{ source: [0xD220], NFC: [0xD220], NFD: [0x1110, 0x116D, 0x11B7], NFKC: [0xD220], NFKD: [0x1110, 0x116D, 0x11B7] }, +{ source: [0xD221], NFC: [0xD221], NFD: [0x1110, 0x116D, 0x11B8], NFKC: [0xD221], NFKD: [0x1110, 0x116D, 0x11B8] }, +{ source: [0xD222], NFC: [0xD222], NFD: [0x1110, 0x116D, 0x11B9], NFKC: [0xD222], NFKD: [0x1110, 0x116D, 0x11B9] }, +{ source: [0xD223], NFC: [0xD223], NFD: [0x1110, 0x116D, 0x11BA], NFKC: [0xD223], NFKD: [0x1110, 0x116D, 0x11BA] }, +{ source: [0xD224], NFC: [0xD224], NFD: [0x1110, 0x116D, 0x11BB], NFKC: [0xD224], NFKD: [0x1110, 0x116D, 0x11BB] }, +{ source: [0xD225], NFC: [0xD225], NFD: [0x1110, 0x116D, 0x11BC], NFKC: [0xD225], NFKD: [0x1110, 0x116D, 0x11BC] }, +{ source: [0xD226], NFC: [0xD226], NFD: [0x1110, 0x116D, 0x11BD], NFKC: [0xD226], NFKD: [0x1110, 0x116D, 0x11BD] }, +{ source: [0xD227], NFC: [0xD227], NFD: [0x1110, 0x116D, 0x11BE], NFKC: [0xD227], NFKD: [0x1110, 0x116D, 0x11BE] }, +{ source: [0xD228], NFC: [0xD228], NFD: [0x1110, 0x116D, 0x11BF], NFKC: [0xD228], NFKD: [0x1110, 0x116D, 0x11BF] }, +{ source: [0xD229], NFC: [0xD229], NFD: [0x1110, 0x116D, 0x11C0], NFKC: [0xD229], NFKD: [0x1110, 0x116D, 0x11C0] }, +{ source: [0xD22A], NFC: [0xD22A], NFD: [0x1110, 0x116D, 0x11C1], NFKC: [0xD22A], NFKD: [0x1110, 0x116D, 0x11C1] }, +{ source: [0xD22B], NFC: [0xD22B], NFD: [0x1110, 0x116D, 0x11C2], NFKC: [0xD22B], NFKD: [0x1110, 0x116D, 0x11C2] }, +{ source: [0xD22C], NFC: [0xD22C], NFD: [0x1110, 0x116E], NFKC: [0xD22C], NFKD: [0x1110, 0x116E] }, +{ source: [0xD22D], NFC: [0xD22D], NFD: [0x1110, 0x116E, 0x11A8], NFKC: [0xD22D], NFKD: [0x1110, 0x116E, 0x11A8] }, +{ source: [0xD22E], NFC: [0xD22E], NFD: [0x1110, 0x116E, 0x11A9], NFKC: [0xD22E], NFKD: [0x1110, 0x116E, 0x11A9] }, +{ source: [0xD22F], NFC: [0xD22F], NFD: [0x1110, 0x116E, 0x11AA], NFKC: [0xD22F], NFKD: [0x1110, 0x116E, 0x11AA] }, +{ source: [0xD230], NFC: [0xD230], NFD: [0x1110, 0x116E, 0x11AB], NFKC: [0xD230], NFKD: [0x1110, 0x116E, 0x11AB] }, +{ source: [0xD231], NFC: [0xD231], NFD: [0x1110, 0x116E, 0x11AC], NFKC: [0xD231], NFKD: [0x1110, 0x116E, 0x11AC] }, +{ source: [0xD232], NFC: [0xD232], NFD: [0x1110, 0x116E, 0x11AD], NFKC: [0xD232], NFKD: [0x1110, 0x116E, 0x11AD] }, +{ source: [0xD233], NFC: [0xD233], NFD: [0x1110, 0x116E, 0x11AE], NFKC: [0xD233], NFKD: [0x1110, 0x116E, 0x11AE] }, +{ source: [0xD234], NFC: [0xD234], NFD: [0x1110, 0x116E, 0x11AF], NFKC: [0xD234], NFKD: [0x1110, 0x116E, 0x11AF] }, +{ source: [0xD235], NFC: [0xD235], NFD: [0x1110, 0x116E, 0x11B0], NFKC: [0xD235], NFKD: [0x1110, 0x116E, 0x11B0] }, +{ source: [0xD236], NFC: [0xD236], NFD: [0x1110, 0x116E, 0x11B1], NFKC: [0xD236], NFKD: [0x1110, 0x116E, 0x11B1] }, +{ source: [0xD237], NFC: [0xD237], NFD: [0x1110, 0x116E, 0x11B2], NFKC: [0xD237], NFKD: [0x1110, 0x116E, 0x11B2] }, +{ source: [0xD238], NFC: [0xD238], NFD: [0x1110, 0x116E, 0x11B3], NFKC: [0xD238], NFKD: [0x1110, 0x116E, 0x11B3] }, +{ source: [0xD239], NFC: [0xD239], NFD: [0x1110, 0x116E, 0x11B4], NFKC: [0xD239], NFKD: [0x1110, 0x116E, 0x11B4] }, +{ source: [0xD23A], NFC: [0xD23A], NFD: [0x1110, 0x116E, 0x11B5], NFKC: [0xD23A], NFKD: [0x1110, 0x116E, 0x11B5] }, +{ source: [0xD23B], NFC: [0xD23B], NFD: [0x1110, 0x116E, 0x11B6], NFKC: [0xD23B], NFKD: [0x1110, 0x116E, 0x11B6] }, +{ source: [0xD23C], NFC: [0xD23C], NFD: [0x1110, 0x116E, 0x11B7], NFKC: [0xD23C], NFKD: [0x1110, 0x116E, 0x11B7] }, +{ source: [0xD23D], NFC: [0xD23D], NFD: [0x1110, 0x116E, 0x11B8], NFKC: [0xD23D], NFKD: [0x1110, 0x116E, 0x11B8] }, +{ source: [0xD23E], NFC: [0xD23E], NFD: [0x1110, 0x116E, 0x11B9], NFKC: [0xD23E], NFKD: [0x1110, 0x116E, 0x11B9] }, +{ source: [0xD23F], NFC: [0xD23F], NFD: [0x1110, 0x116E, 0x11BA], NFKC: [0xD23F], NFKD: [0x1110, 0x116E, 0x11BA] }, +{ source: [0xD240], NFC: [0xD240], NFD: [0x1110, 0x116E, 0x11BB], NFKC: [0xD240], NFKD: [0x1110, 0x116E, 0x11BB] }, +{ source: [0xD241], NFC: [0xD241], NFD: [0x1110, 0x116E, 0x11BC], NFKC: [0xD241], NFKD: [0x1110, 0x116E, 0x11BC] }, +{ source: [0xD242], NFC: [0xD242], NFD: [0x1110, 0x116E, 0x11BD], NFKC: [0xD242], NFKD: [0x1110, 0x116E, 0x11BD] }, +{ source: [0xD243], NFC: [0xD243], NFD: [0x1110, 0x116E, 0x11BE], NFKC: [0xD243], NFKD: [0x1110, 0x116E, 0x11BE] }, +{ source: [0xD244], NFC: [0xD244], NFD: [0x1110, 0x116E, 0x11BF], NFKC: [0xD244], NFKD: [0x1110, 0x116E, 0x11BF] }, +{ source: [0xD245], NFC: [0xD245], NFD: [0x1110, 0x116E, 0x11C0], NFKC: [0xD245], NFKD: [0x1110, 0x116E, 0x11C0] }, +{ source: [0xD246], NFC: [0xD246], NFD: [0x1110, 0x116E, 0x11C1], NFKC: [0xD246], NFKD: [0x1110, 0x116E, 0x11C1] }, +{ source: [0xD247], NFC: [0xD247], NFD: [0x1110, 0x116E, 0x11C2], NFKC: [0xD247], NFKD: [0x1110, 0x116E, 0x11C2] }, +{ source: [0xD248], NFC: [0xD248], NFD: [0x1110, 0x116F], NFKC: [0xD248], NFKD: [0x1110, 0x116F] }, +{ source: [0xD249], NFC: [0xD249], NFD: [0x1110, 0x116F, 0x11A8], NFKC: [0xD249], NFKD: [0x1110, 0x116F, 0x11A8] }, +{ source: [0xD24A], NFC: [0xD24A], NFD: [0x1110, 0x116F, 0x11A9], NFKC: [0xD24A], NFKD: [0x1110, 0x116F, 0x11A9] }, +{ source: [0xD24B], NFC: [0xD24B], NFD: [0x1110, 0x116F, 0x11AA], NFKC: [0xD24B], NFKD: [0x1110, 0x116F, 0x11AA] }, +{ source: [0xD24C], NFC: [0xD24C], NFD: [0x1110, 0x116F, 0x11AB], NFKC: [0xD24C], NFKD: [0x1110, 0x116F, 0x11AB] }, +{ source: [0xD24D], NFC: [0xD24D], NFD: [0x1110, 0x116F, 0x11AC], NFKC: [0xD24D], NFKD: [0x1110, 0x116F, 0x11AC] }, +{ source: [0xD24E], NFC: [0xD24E], NFD: [0x1110, 0x116F, 0x11AD], NFKC: [0xD24E], NFKD: [0x1110, 0x116F, 0x11AD] }, +{ source: [0xD24F], NFC: [0xD24F], NFD: [0x1110, 0x116F, 0x11AE], NFKC: [0xD24F], NFKD: [0x1110, 0x116F, 0x11AE] }, +{ source: [0xD250], NFC: [0xD250], NFD: [0x1110, 0x116F, 0x11AF], NFKC: [0xD250], NFKD: [0x1110, 0x116F, 0x11AF] }, +{ source: [0xD251], NFC: [0xD251], NFD: [0x1110, 0x116F, 0x11B0], NFKC: [0xD251], NFKD: [0x1110, 0x116F, 0x11B0] }, +{ source: [0xD252], NFC: [0xD252], NFD: [0x1110, 0x116F, 0x11B1], NFKC: [0xD252], NFKD: [0x1110, 0x116F, 0x11B1] }, +{ source: [0xD253], NFC: [0xD253], NFD: [0x1110, 0x116F, 0x11B2], NFKC: [0xD253], NFKD: [0x1110, 0x116F, 0x11B2] }, +{ source: [0xD254], NFC: [0xD254], NFD: [0x1110, 0x116F, 0x11B3], NFKC: [0xD254], NFKD: [0x1110, 0x116F, 0x11B3] }, +{ source: [0xD255], NFC: [0xD255], NFD: [0x1110, 0x116F, 0x11B4], NFKC: [0xD255], NFKD: [0x1110, 0x116F, 0x11B4] }, +{ source: [0xD256], NFC: [0xD256], NFD: [0x1110, 0x116F, 0x11B5], NFKC: [0xD256], NFKD: [0x1110, 0x116F, 0x11B5] }, +{ source: [0xD257], NFC: [0xD257], NFD: [0x1110, 0x116F, 0x11B6], NFKC: [0xD257], NFKD: [0x1110, 0x116F, 0x11B6] }, +{ source: [0xD258], NFC: [0xD258], NFD: [0x1110, 0x116F, 0x11B7], NFKC: [0xD258], NFKD: [0x1110, 0x116F, 0x11B7] }, +{ source: [0xD259], NFC: [0xD259], NFD: [0x1110, 0x116F, 0x11B8], NFKC: [0xD259], NFKD: [0x1110, 0x116F, 0x11B8] }, +{ source: [0xD25A], NFC: [0xD25A], NFD: [0x1110, 0x116F, 0x11B9], NFKC: [0xD25A], NFKD: [0x1110, 0x116F, 0x11B9] }, +{ source: [0xD25B], NFC: [0xD25B], NFD: [0x1110, 0x116F, 0x11BA], NFKC: [0xD25B], NFKD: [0x1110, 0x116F, 0x11BA] }, +{ source: [0xD25C], NFC: [0xD25C], NFD: [0x1110, 0x116F, 0x11BB], NFKC: [0xD25C], NFKD: [0x1110, 0x116F, 0x11BB] }, +{ source: [0xD25D], NFC: [0xD25D], NFD: [0x1110, 0x116F, 0x11BC], NFKC: [0xD25D], NFKD: [0x1110, 0x116F, 0x11BC] }, +{ source: [0xD25E], NFC: [0xD25E], NFD: [0x1110, 0x116F, 0x11BD], NFKC: [0xD25E], NFKD: [0x1110, 0x116F, 0x11BD] }, +{ source: [0xD25F], NFC: [0xD25F], NFD: [0x1110, 0x116F, 0x11BE], NFKC: [0xD25F], NFKD: [0x1110, 0x116F, 0x11BE] }, +{ source: [0xD260], NFC: [0xD260], NFD: [0x1110, 0x116F, 0x11BF], NFKC: [0xD260], NFKD: [0x1110, 0x116F, 0x11BF] }, +{ source: [0xD261], NFC: [0xD261], NFD: [0x1110, 0x116F, 0x11C0], NFKC: [0xD261], NFKD: [0x1110, 0x116F, 0x11C0] }, +{ source: [0xD262], NFC: [0xD262], NFD: [0x1110, 0x116F, 0x11C1], NFKC: [0xD262], NFKD: [0x1110, 0x116F, 0x11C1] }, +{ source: [0xD263], NFC: [0xD263], NFD: [0x1110, 0x116F, 0x11C2], NFKC: [0xD263], NFKD: [0x1110, 0x116F, 0x11C2] }, +{ source: [0xD264], NFC: [0xD264], NFD: [0x1110, 0x1170], NFKC: [0xD264], NFKD: [0x1110, 0x1170] }, +{ source: [0xD265], NFC: [0xD265], NFD: [0x1110, 0x1170, 0x11A8], NFKC: [0xD265], NFKD: [0x1110, 0x1170, 0x11A8] }, +{ source: [0xD266], NFC: [0xD266], NFD: [0x1110, 0x1170, 0x11A9], NFKC: [0xD266], NFKD: [0x1110, 0x1170, 0x11A9] }, +{ source: [0xD267], NFC: [0xD267], NFD: [0x1110, 0x1170, 0x11AA], NFKC: [0xD267], NFKD: [0x1110, 0x1170, 0x11AA] }, +{ source: [0xD268], NFC: [0xD268], NFD: [0x1110, 0x1170, 0x11AB], NFKC: [0xD268], NFKD: [0x1110, 0x1170, 0x11AB] }, +{ source: [0xD269], NFC: [0xD269], NFD: [0x1110, 0x1170, 0x11AC], NFKC: [0xD269], NFKD: [0x1110, 0x1170, 0x11AC] }, +{ source: [0xD26A], NFC: [0xD26A], NFD: [0x1110, 0x1170, 0x11AD], NFKC: [0xD26A], NFKD: [0x1110, 0x1170, 0x11AD] }, +{ source: [0xD26B], NFC: [0xD26B], NFD: [0x1110, 0x1170, 0x11AE], NFKC: [0xD26B], NFKD: [0x1110, 0x1170, 0x11AE] }, +{ source: [0xD26C], NFC: [0xD26C], NFD: [0x1110, 0x1170, 0x11AF], NFKC: [0xD26C], NFKD: [0x1110, 0x1170, 0x11AF] }, +{ source: [0xD26D], NFC: [0xD26D], NFD: [0x1110, 0x1170, 0x11B0], NFKC: [0xD26D], NFKD: [0x1110, 0x1170, 0x11B0] }, +{ source: [0xD26E], NFC: [0xD26E], NFD: [0x1110, 0x1170, 0x11B1], NFKC: [0xD26E], NFKD: [0x1110, 0x1170, 0x11B1] }, +{ source: [0xD26F], NFC: [0xD26F], NFD: [0x1110, 0x1170, 0x11B2], NFKC: [0xD26F], NFKD: [0x1110, 0x1170, 0x11B2] }, +{ source: [0xD270], NFC: [0xD270], NFD: [0x1110, 0x1170, 0x11B3], NFKC: [0xD270], NFKD: [0x1110, 0x1170, 0x11B3] }, +{ source: [0xD271], NFC: [0xD271], NFD: [0x1110, 0x1170, 0x11B4], NFKC: [0xD271], NFKD: [0x1110, 0x1170, 0x11B4] }, +{ source: [0xD272], NFC: [0xD272], NFD: [0x1110, 0x1170, 0x11B5], NFKC: [0xD272], NFKD: [0x1110, 0x1170, 0x11B5] }, +{ source: [0xD273], NFC: [0xD273], NFD: [0x1110, 0x1170, 0x11B6], NFKC: [0xD273], NFKD: [0x1110, 0x1170, 0x11B6] }, +{ source: [0xD274], NFC: [0xD274], NFD: [0x1110, 0x1170, 0x11B7], NFKC: [0xD274], NFKD: [0x1110, 0x1170, 0x11B7] }, +{ source: [0xD275], NFC: [0xD275], NFD: [0x1110, 0x1170, 0x11B8], NFKC: [0xD275], NFKD: [0x1110, 0x1170, 0x11B8] }, +{ source: [0xD276], NFC: [0xD276], NFD: [0x1110, 0x1170, 0x11B9], NFKC: [0xD276], NFKD: [0x1110, 0x1170, 0x11B9] }, +{ source: [0xD277], NFC: [0xD277], NFD: [0x1110, 0x1170, 0x11BA], NFKC: [0xD277], NFKD: [0x1110, 0x1170, 0x11BA] }, +{ source: [0xD278], NFC: [0xD278], NFD: [0x1110, 0x1170, 0x11BB], NFKC: [0xD278], NFKD: [0x1110, 0x1170, 0x11BB] }, +{ source: [0xD279], NFC: [0xD279], NFD: [0x1110, 0x1170, 0x11BC], NFKC: [0xD279], NFKD: [0x1110, 0x1170, 0x11BC] }, +{ source: [0xD27A], NFC: [0xD27A], NFD: [0x1110, 0x1170, 0x11BD], NFKC: [0xD27A], NFKD: [0x1110, 0x1170, 0x11BD] }, +{ source: [0xD27B], NFC: [0xD27B], NFD: [0x1110, 0x1170, 0x11BE], NFKC: [0xD27B], NFKD: [0x1110, 0x1170, 0x11BE] }, +{ source: [0xD27C], NFC: [0xD27C], NFD: [0x1110, 0x1170, 0x11BF], NFKC: [0xD27C], NFKD: [0x1110, 0x1170, 0x11BF] }, +{ source: [0xD27D], NFC: [0xD27D], NFD: [0x1110, 0x1170, 0x11C0], NFKC: [0xD27D], NFKD: [0x1110, 0x1170, 0x11C0] }, +{ source: [0xD27E], NFC: [0xD27E], NFD: [0x1110, 0x1170, 0x11C1], NFKC: [0xD27E], NFKD: [0x1110, 0x1170, 0x11C1] }, +{ source: [0xD27F], NFC: [0xD27F], NFD: [0x1110, 0x1170, 0x11C2], NFKC: [0xD27F], NFKD: [0x1110, 0x1170, 0x11C2] }, +{ source: [0xD280], NFC: [0xD280], NFD: [0x1110, 0x1171], NFKC: [0xD280], NFKD: [0x1110, 0x1171] }, +{ source: [0xD281], NFC: [0xD281], NFD: [0x1110, 0x1171, 0x11A8], NFKC: [0xD281], NFKD: [0x1110, 0x1171, 0x11A8] }, +{ source: [0xD282], NFC: [0xD282], NFD: [0x1110, 0x1171, 0x11A9], NFKC: [0xD282], NFKD: [0x1110, 0x1171, 0x11A9] }, +{ source: [0xD283], NFC: [0xD283], NFD: [0x1110, 0x1171, 0x11AA], NFKC: [0xD283], NFKD: [0x1110, 0x1171, 0x11AA] }, +{ source: [0xD284], NFC: [0xD284], NFD: [0x1110, 0x1171, 0x11AB], NFKC: [0xD284], NFKD: [0x1110, 0x1171, 0x11AB] }, +{ source: [0xD285], NFC: [0xD285], NFD: [0x1110, 0x1171, 0x11AC], NFKC: [0xD285], NFKD: [0x1110, 0x1171, 0x11AC] }, +{ source: [0xD286], NFC: [0xD286], NFD: [0x1110, 0x1171, 0x11AD], NFKC: [0xD286], NFKD: [0x1110, 0x1171, 0x11AD] }, +{ source: [0xD287], NFC: [0xD287], NFD: [0x1110, 0x1171, 0x11AE], NFKC: [0xD287], NFKD: [0x1110, 0x1171, 0x11AE] }, +{ source: [0xD288], NFC: [0xD288], NFD: [0x1110, 0x1171, 0x11AF], NFKC: [0xD288], NFKD: [0x1110, 0x1171, 0x11AF] }, +{ source: [0xD289], NFC: [0xD289], NFD: [0x1110, 0x1171, 0x11B0], NFKC: [0xD289], NFKD: [0x1110, 0x1171, 0x11B0] }, +{ source: [0xD28A], NFC: [0xD28A], NFD: [0x1110, 0x1171, 0x11B1], NFKC: [0xD28A], NFKD: [0x1110, 0x1171, 0x11B1] }, +{ source: [0xD28B], NFC: [0xD28B], NFD: [0x1110, 0x1171, 0x11B2], NFKC: [0xD28B], NFKD: [0x1110, 0x1171, 0x11B2] }, +{ source: [0xD28C], NFC: [0xD28C], NFD: [0x1110, 0x1171, 0x11B3], NFKC: [0xD28C], NFKD: [0x1110, 0x1171, 0x11B3] }, +{ source: [0xD28D], NFC: [0xD28D], NFD: [0x1110, 0x1171, 0x11B4], NFKC: [0xD28D], NFKD: [0x1110, 0x1171, 0x11B4] }, +{ source: [0xD28E], NFC: [0xD28E], NFD: [0x1110, 0x1171, 0x11B5], NFKC: [0xD28E], NFKD: [0x1110, 0x1171, 0x11B5] }, +{ source: [0xD28F], NFC: [0xD28F], NFD: [0x1110, 0x1171, 0x11B6], NFKC: [0xD28F], NFKD: [0x1110, 0x1171, 0x11B6] }, +{ source: [0xD290], NFC: [0xD290], NFD: [0x1110, 0x1171, 0x11B7], NFKC: [0xD290], NFKD: [0x1110, 0x1171, 0x11B7] }, +{ source: [0xD291], NFC: [0xD291], NFD: [0x1110, 0x1171, 0x11B8], NFKC: [0xD291], NFKD: [0x1110, 0x1171, 0x11B8] }, +{ source: [0xD292], NFC: [0xD292], NFD: [0x1110, 0x1171, 0x11B9], NFKC: [0xD292], NFKD: [0x1110, 0x1171, 0x11B9] }, +{ source: [0xD293], NFC: [0xD293], NFD: [0x1110, 0x1171, 0x11BA], NFKC: [0xD293], NFKD: [0x1110, 0x1171, 0x11BA] }, +{ source: [0xD294], NFC: [0xD294], NFD: [0x1110, 0x1171, 0x11BB], NFKC: [0xD294], NFKD: [0x1110, 0x1171, 0x11BB] }, +{ source: [0xD295], NFC: [0xD295], NFD: [0x1110, 0x1171, 0x11BC], NFKC: [0xD295], NFKD: [0x1110, 0x1171, 0x11BC] }, +{ source: [0xD296], NFC: [0xD296], NFD: [0x1110, 0x1171, 0x11BD], NFKC: [0xD296], NFKD: [0x1110, 0x1171, 0x11BD] }, +{ source: [0xD297], NFC: [0xD297], NFD: [0x1110, 0x1171, 0x11BE], NFKC: [0xD297], NFKD: [0x1110, 0x1171, 0x11BE] }, +{ source: [0xD298], NFC: [0xD298], NFD: [0x1110, 0x1171, 0x11BF], NFKC: [0xD298], NFKD: [0x1110, 0x1171, 0x11BF] }, +{ source: [0xD299], NFC: [0xD299], NFD: [0x1110, 0x1171, 0x11C0], NFKC: [0xD299], NFKD: [0x1110, 0x1171, 0x11C0] }, +{ source: [0xD29A], NFC: [0xD29A], NFD: [0x1110, 0x1171, 0x11C1], NFKC: [0xD29A], NFKD: [0x1110, 0x1171, 0x11C1] }, +{ source: [0xD29B], NFC: [0xD29B], NFD: [0x1110, 0x1171, 0x11C2], NFKC: [0xD29B], NFKD: [0x1110, 0x1171, 0x11C2] }, +{ source: [0xD29C], NFC: [0xD29C], NFD: [0x1110, 0x1172], NFKC: [0xD29C], NFKD: [0x1110, 0x1172] }, +{ source: [0xD29D], NFC: [0xD29D], NFD: [0x1110, 0x1172, 0x11A8], NFKC: [0xD29D], NFKD: [0x1110, 0x1172, 0x11A8] }, +{ source: [0xD29E], NFC: [0xD29E], NFD: [0x1110, 0x1172, 0x11A9], NFKC: [0xD29E], NFKD: [0x1110, 0x1172, 0x11A9] }, +{ source: [0xD29F], NFC: [0xD29F], NFD: [0x1110, 0x1172, 0x11AA], NFKC: [0xD29F], NFKD: [0x1110, 0x1172, 0x11AA] }, +{ source: [0xD2A0], NFC: [0xD2A0], NFD: [0x1110, 0x1172, 0x11AB], NFKC: [0xD2A0], NFKD: [0x1110, 0x1172, 0x11AB] }, +{ source: [0xD2A1], NFC: [0xD2A1], NFD: [0x1110, 0x1172, 0x11AC], NFKC: [0xD2A1], NFKD: [0x1110, 0x1172, 0x11AC] }, +{ source: [0xD2A2], NFC: [0xD2A2], NFD: [0x1110, 0x1172, 0x11AD], NFKC: [0xD2A2], NFKD: [0x1110, 0x1172, 0x11AD] }, +{ source: [0xD2A3], NFC: [0xD2A3], NFD: [0x1110, 0x1172, 0x11AE], NFKC: [0xD2A3], NFKD: [0x1110, 0x1172, 0x11AE] }, +{ source: [0xD2A4], NFC: [0xD2A4], NFD: [0x1110, 0x1172, 0x11AF], NFKC: [0xD2A4], NFKD: [0x1110, 0x1172, 0x11AF] }, +{ source: [0xD2A5], NFC: [0xD2A5], NFD: [0x1110, 0x1172, 0x11B0], NFKC: [0xD2A5], NFKD: [0x1110, 0x1172, 0x11B0] }, +{ source: [0xD2A6], NFC: [0xD2A6], NFD: [0x1110, 0x1172, 0x11B1], NFKC: [0xD2A6], NFKD: [0x1110, 0x1172, 0x11B1] }, +{ source: [0xD2A7], NFC: [0xD2A7], NFD: [0x1110, 0x1172, 0x11B2], NFKC: [0xD2A7], NFKD: [0x1110, 0x1172, 0x11B2] }, +{ source: [0xD2A8], NFC: [0xD2A8], NFD: [0x1110, 0x1172, 0x11B3], NFKC: [0xD2A8], NFKD: [0x1110, 0x1172, 0x11B3] }, +{ source: [0xD2A9], NFC: [0xD2A9], NFD: [0x1110, 0x1172, 0x11B4], NFKC: [0xD2A9], NFKD: [0x1110, 0x1172, 0x11B4] }, +{ source: [0xD2AA], NFC: [0xD2AA], NFD: [0x1110, 0x1172, 0x11B5], NFKC: [0xD2AA], NFKD: [0x1110, 0x1172, 0x11B5] }, +{ source: [0xD2AB], NFC: [0xD2AB], NFD: [0x1110, 0x1172, 0x11B6], NFKC: [0xD2AB], NFKD: [0x1110, 0x1172, 0x11B6] }, +{ source: [0xD2AC], NFC: [0xD2AC], NFD: [0x1110, 0x1172, 0x11B7], NFKC: [0xD2AC], NFKD: [0x1110, 0x1172, 0x11B7] }, +{ source: [0xD2AD], NFC: [0xD2AD], NFD: [0x1110, 0x1172, 0x11B8], NFKC: [0xD2AD], NFKD: [0x1110, 0x1172, 0x11B8] }, +{ source: [0xD2AE], NFC: [0xD2AE], NFD: [0x1110, 0x1172, 0x11B9], NFKC: [0xD2AE], NFKD: [0x1110, 0x1172, 0x11B9] }, +{ source: [0xD2AF], NFC: [0xD2AF], NFD: [0x1110, 0x1172, 0x11BA], NFKC: [0xD2AF], NFKD: [0x1110, 0x1172, 0x11BA] }, +{ source: [0xD2B0], NFC: [0xD2B0], NFD: [0x1110, 0x1172, 0x11BB], NFKC: [0xD2B0], NFKD: [0x1110, 0x1172, 0x11BB] }, +{ source: [0xD2B1], NFC: [0xD2B1], NFD: [0x1110, 0x1172, 0x11BC], NFKC: [0xD2B1], NFKD: [0x1110, 0x1172, 0x11BC] }, +{ source: [0xD2B2], NFC: [0xD2B2], NFD: [0x1110, 0x1172, 0x11BD], NFKC: [0xD2B2], NFKD: [0x1110, 0x1172, 0x11BD] }, +{ source: [0xD2B3], NFC: [0xD2B3], NFD: [0x1110, 0x1172, 0x11BE], NFKC: [0xD2B3], NFKD: [0x1110, 0x1172, 0x11BE] }, +{ source: [0xD2B4], NFC: [0xD2B4], NFD: [0x1110, 0x1172, 0x11BF], NFKC: [0xD2B4], NFKD: [0x1110, 0x1172, 0x11BF] }, +{ source: [0xD2B5], NFC: [0xD2B5], NFD: [0x1110, 0x1172, 0x11C0], NFKC: [0xD2B5], NFKD: [0x1110, 0x1172, 0x11C0] }, +{ source: [0xD2B6], NFC: [0xD2B6], NFD: [0x1110, 0x1172, 0x11C1], NFKC: [0xD2B6], NFKD: [0x1110, 0x1172, 0x11C1] }, +{ source: [0xD2B7], NFC: [0xD2B7], NFD: [0x1110, 0x1172, 0x11C2], NFKC: [0xD2B7], NFKD: [0x1110, 0x1172, 0x11C2] }, +{ source: [0xD2B8], NFC: [0xD2B8], NFD: [0x1110, 0x1173], NFKC: [0xD2B8], NFKD: [0x1110, 0x1173] }, +{ source: [0xD2B9], NFC: [0xD2B9], NFD: [0x1110, 0x1173, 0x11A8], NFKC: [0xD2B9], NFKD: [0x1110, 0x1173, 0x11A8] }, +{ source: [0xD2BA], NFC: [0xD2BA], NFD: [0x1110, 0x1173, 0x11A9], NFKC: [0xD2BA], NFKD: [0x1110, 0x1173, 0x11A9] }, +{ source: [0xD2BB], NFC: [0xD2BB], NFD: [0x1110, 0x1173, 0x11AA], NFKC: [0xD2BB], NFKD: [0x1110, 0x1173, 0x11AA] }, +{ source: [0xD2BC], NFC: [0xD2BC], NFD: [0x1110, 0x1173, 0x11AB], NFKC: [0xD2BC], NFKD: [0x1110, 0x1173, 0x11AB] }, +{ source: [0xD2BD], NFC: [0xD2BD], NFD: [0x1110, 0x1173, 0x11AC], NFKC: [0xD2BD], NFKD: [0x1110, 0x1173, 0x11AC] }, +{ source: [0xD2BE], NFC: [0xD2BE], NFD: [0x1110, 0x1173, 0x11AD], NFKC: [0xD2BE], NFKD: [0x1110, 0x1173, 0x11AD] }, +{ source: [0xD2BF], NFC: [0xD2BF], NFD: [0x1110, 0x1173, 0x11AE], NFKC: [0xD2BF], NFKD: [0x1110, 0x1173, 0x11AE] }, +{ source: [0xD2C0], NFC: [0xD2C0], NFD: [0x1110, 0x1173, 0x11AF], NFKC: [0xD2C0], NFKD: [0x1110, 0x1173, 0x11AF] }, +{ source: [0xD2C1], NFC: [0xD2C1], NFD: [0x1110, 0x1173, 0x11B0], NFKC: [0xD2C1], NFKD: [0x1110, 0x1173, 0x11B0] }, +{ source: [0xD2C2], NFC: [0xD2C2], NFD: [0x1110, 0x1173, 0x11B1], NFKC: [0xD2C2], NFKD: [0x1110, 0x1173, 0x11B1] }, +{ source: [0xD2C3], NFC: [0xD2C3], NFD: [0x1110, 0x1173, 0x11B2], NFKC: [0xD2C3], NFKD: [0x1110, 0x1173, 0x11B2] }, +{ source: [0xD2C4], NFC: [0xD2C4], NFD: [0x1110, 0x1173, 0x11B3], NFKC: [0xD2C4], NFKD: [0x1110, 0x1173, 0x11B3] }, +{ source: [0xD2C5], NFC: [0xD2C5], NFD: [0x1110, 0x1173, 0x11B4], NFKC: [0xD2C5], NFKD: [0x1110, 0x1173, 0x11B4] }, +{ source: [0xD2C6], NFC: [0xD2C6], NFD: [0x1110, 0x1173, 0x11B5], NFKC: [0xD2C6], NFKD: [0x1110, 0x1173, 0x11B5] }, +{ source: [0xD2C7], NFC: [0xD2C7], NFD: [0x1110, 0x1173, 0x11B6], NFKC: [0xD2C7], NFKD: [0x1110, 0x1173, 0x11B6] }, +{ source: [0xD2C8], NFC: [0xD2C8], NFD: [0x1110, 0x1173, 0x11B7], NFKC: [0xD2C8], NFKD: [0x1110, 0x1173, 0x11B7] }, +{ source: [0xD2C9], NFC: [0xD2C9], NFD: [0x1110, 0x1173, 0x11B8], NFKC: [0xD2C9], NFKD: [0x1110, 0x1173, 0x11B8] }, +{ source: [0xD2CA], NFC: [0xD2CA], NFD: [0x1110, 0x1173, 0x11B9], NFKC: [0xD2CA], NFKD: [0x1110, 0x1173, 0x11B9] }, +{ source: [0xD2CB], NFC: [0xD2CB], NFD: [0x1110, 0x1173, 0x11BA], NFKC: [0xD2CB], NFKD: [0x1110, 0x1173, 0x11BA] }, +{ source: [0xD2CC], NFC: [0xD2CC], NFD: [0x1110, 0x1173, 0x11BB], NFKC: [0xD2CC], NFKD: [0x1110, 0x1173, 0x11BB] }, +{ source: [0xD2CD], NFC: [0xD2CD], NFD: [0x1110, 0x1173, 0x11BC], NFKC: [0xD2CD], NFKD: [0x1110, 0x1173, 0x11BC] }, +{ source: [0xD2CE], NFC: [0xD2CE], NFD: [0x1110, 0x1173, 0x11BD], NFKC: [0xD2CE], NFKD: [0x1110, 0x1173, 0x11BD] }, +{ source: [0xD2CF], NFC: [0xD2CF], NFD: [0x1110, 0x1173, 0x11BE], NFKC: [0xD2CF], NFKD: [0x1110, 0x1173, 0x11BE] }, +{ source: [0xD2D0], NFC: [0xD2D0], NFD: [0x1110, 0x1173, 0x11BF], NFKC: [0xD2D0], NFKD: [0x1110, 0x1173, 0x11BF] }, +{ source: [0xD2D1], NFC: [0xD2D1], NFD: [0x1110, 0x1173, 0x11C0], NFKC: [0xD2D1], NFKD: [0x1110, 0x1173, 0x11C0] }, +{ source: [0xD2D2], NFC: [0xD2D2], NFD: [0x1110, 0x1173, 0x11C1], NFKC: [0xD2D2], NFKD: [0x1110, 0x1173, 0x11C1] }, +{ source: [0xD2D3], NFC: [0xD2D3], NFD: [0x1110, 0x1173, 0x11C2], NFKC: [0xD2D3], NFKD: [0x1110, 0x1173, 0x11C2] }, +{ source: [0xD2D4], NFC: [0xD2D4], NFD: [0x1110, 0x1174], NFKC: [0xD2D4], NFKD: [0x1110, 0x1174] }, +{ source: [0xD2D5], NFC: [0xD2D5], NFD: [0x1110, 0x1174, 0x11A8], NFKC: [0xD2D5], NFKD: [0x1110, 0x1174, 0x11A8] }, +{ source: [0xD2D6], NFC: [0xD2D6], NFD: [0x1110, 0x1174, 0x11A9], NFKC: [0xD2D6], NFKD: [0x1110, 0x1174, 0x11A9] }, +{ source: [0xD2D7], NFC: [0xD2D7], NFD: [0x1110, 0x1174, 0x11AA], NFKC: [0xD2D7], NFKD: [0x1110, 0x1174, 0x11AA] }, +{ source: [0xD2D8], NFC: [0xD2D8], NFD: [0x1110, 0x1174, 0x11AB], NFKC: [0xD2D8], NFKD: [0x1110, 0x1174, 0x11AB] }, +{ source: [0xD2D9], NFC: [0xD2D9], NFD: [0x1110, 0x1174, 0x11AC], NFKC: [0xD2D9], NFKD: [0x1110, 0x1174, 0x11AC] }, +{ source: [0xD2DA], NFC: [0xD2DA], NFD: [0x1110, 0x1174, 0x11AD], NFKC: [0xD2DA], NFKD: [0x1110, 0x1174, 0x11AD] }, +{ source: [0xD2DB], NFC: [0xD2DB], NFD: [0x1110, 0x1174, 0x11AE], NFKC: [0xD2DB], NFKD: [0x1110, 0x1174, 0x11AE] }, +{ source: [0xD2DC], NFC: [0xD2DC], NFD: [0x1110, 0x1174, 0x11AF], NFKC: [0xD2DC], NFKD: [0x1110, 0x1174, 0x11AF] }, +{ source: [0xD2DD], NFC: [0xD2DD], NFD: [0x1110, 0x1174, 0x11B0], NFKC: [0xD2DD], NFKD: [0x1110, 0x1174, 0x11B0] }, +{ source: [0xD2DE], NFC: [0xD2DE], NFD: [0x1110, 0x1174, 0x11B1], NFKC: [0xD2DE], NFKD: [0x1110, 0x1174, 0x11B1] }, +{ source: [0xD2DF], NFC: [0xD2DF], NFD: [0x1110, 0x1174, 0x11B2], NFKC: [0xD2DF], NFKD: [0x1110, 0x1174, 0x11B2] }, +{ source: [0xD2E0], NFC: [0xD2E0], NFD: [0x1110, 0x1174, 0x11B3], NFKC: [0xD2E0], NFKD: [0x1110, 0x1174, 0x11B3] }, +{ source: [0xD2E1], NFC: [0xD2E1], NFD: [0x1110, 0x1174, 0x11B4], NFKC: [0xD2E1], NFKD: [0x1110, 0x1174, 0x11B4] }, +{ source: [0xD2E2], NFC: [0xD2E2], NFD: [0x1110, 0x1174, 0x11B5], NFKC: [0xD2E2], NFKD: [0x1110, 0x1174, 0x11B5] }, +{ source: [0xD2E3], NFC: [0xD2E3], NFD: [0x1110, 0x1174, 0x11B6], NFKC: [0xD2E3], NFKD: [0x1110, 0x1174, 0x11B6] }, +{ source: [0xD2E4], NFC: [0xD2E4], NFD: [0x1110, 0x1174, 0x11B7], NFKC: [0xD2E4], NFKD: [0x1110, 0x1174, 0x11B7] }, +{ source: [0xD2E5], NFC: [0xD2E5], NFD: [0x1110, 0x1174, 0x11B8], NFKC: [0xD2E5], NFKD: [0x1110, 0x1174, 0x11B8] }, +{ source: [0xD2E6], NFC: [0xD2E6], NFD: [0x1110, 0x1174, 0x11B9], NFKC: [0xD2E6], NFKD: [0x1110, 0x1174, 0x11B9] }, +{ source: [0xD2E7], NFC: [0xD2E7], NFD: [0x1110, 0x1174, 0x11BA], NFKC: [0xD2E7], NFKD: [0x1110, 0x1174, 0x11BA] }, +{ source: [0xD2E8], NFC: [0xD2E8], NFD: [0x1110, 0x1174, 0x11BB], NFKC: [0xD2E8], NFKD: [0x1110, 0x1174, 0x11BB] }, +{ source: [0xD2E9], NFC: [0xD2E9], NFD: [0x1110, 0x1174, 0x11BC], NFKC: [0xD2E9], NFKD: [0x1110, 0x1174, 0x11BC] }, +{ source: [0xD2EA], NFC: [0xD2EA], NFD: [0x1110, 0x1174, 0x11BD], NFKC: [0xD2EA], NFKD: [0x1110, 0x1174, 0x11BD] }, +{ source: [0xD2EB], NFC: [0xD2EB], NFD: [0x1110, 0x1174, 0x11BE], NFKC: [0xD2EB], NFKD: [0x1110, 0x1174, 0x11BE] }, +{ source: [0xD2EC], NFC: [0xD2EC], NFD: [0x1110, 0x1174, 0x11BF], NFKC: [0xD2EC], NFKD: [0x1110, 0x1174, 0x11BF] }, +{ source: [0xD2ED], NFC: [0xD2ED], NFD: [0x1110, 0x1174, 0x11C0], NFKC: [0xD2ED], NFKD: [0x1110, 0x1174, 0x11C0] }, +{ source: [0xD2EE], NFC: [0xD2EE], NFD: [0x1110, 0x1174, 0x11C1], NFKC: [0xD2EE], NFKD: [0x1110, 0x1174, 0x11C1] }, +{ source: [0xD2EF], NFC: [0xD2EF], NFD: [0x1110, 0x1174, 0x11C2], NFKC: [0xD2EF], NFKD: [0x1110, 0x1174, 0x11C2] }, +{ source: [0xD2F0], NFC: [0xD2F0], NFD: [0x1110, 0x1175], NFKC: [0xD2F0], NFKD: [0x1110, 0x1175] }, +{ source: [0xD2F1], NFC: [0xD2F1], NFD: [0x1110, 0x1175, 0x11A8], NFKC: [0xD2F1], NFKD: [0x1110, 0x1175, 0x11A8] }, +{ source: [0xD2F2], NFC: [0xD2F2], NFD: [0x1110, 0x1175, 0x11A9], NFKC: [0xD2F2], NFKD: [0x1110, 0x1175, 0x11A9] }, +{ source: [0xD2F3], NFC: [0xD2F3], NFD: [0x1110, 0x1175, 0x11AA], NFKC: [0xD2F3], NFKD: [0x1110, 0x1175, 0x11AA] }, +{ source: [0xD2F4], NFC: [0xD2F4], NFD: [0x1110, 0x1175, 0x11AB], NFKC: [0xD2F4], NFKD: [0x1110, 0x1175, 0x11AB] }, +{ source: [0xD2F5], NFC: [0xD2F5], NFD: [0x1110, 0x1175, 0x11AC], NFKC: [0xD2F5], NFKD: [0x1110, 0x1175, 0x11AC] }, +{ source: [0xD2F6], NFC: [0xD2F6], NFD: [0x1110, 0x1175, 0x11AD], NFKC: [0xD2F6], NFKD: [0x1110, 0x1175, 0x11AD] }, +{ source: [0xD2F7], NFC: [0xD2F7], NFD: [0x1110, 0x1175, 0x11AE], NFKC: [0xD2F7], NFKD: [0x1110, 0x1175, 0x11AE] }, +{ source: [0xD2F8], NFC: [0xD2F8], NFD: [0x1110, 0x1175, 0x11AF], NFKC: [0xD2F8], NFKD: [0x1110, 0x1175, 0x11AF] }, +{ source: [0xD2F9], NFC: [0xD2F9], NFD: [0x1110, 0x1175, 0x11B0], NFKC: [0xD2F9], NFKD: [0x1110, 0x1175, 0x11B0] }, +{ source: [0xD2FA], NFC: [0xD2FA], NFD: [0x1110, 0x1175, 0x11B1], NFKC: [0xD2FA], NFKD: [0x1110, 0x1175, 0x11B1] }, +{ source: [0xD2FB], NFC: [0xD2FB], NFD: [0x1110, 0x1175, 0x11B2], NFKC: [0xD2FB], NFKD: [0x1110, 0x1175, 0x11B2] }, +{ source: [0xD2FC], NFC: [0xD2FC], NFD: [0x1110, 0x1175, 0x11B3], NFKC: [0xD2FC], NFKD: [0x1110, 0x1175, 0x11B3] }, +{ source: [0xD2FD], NFC: [0xD2FD], NFD: [0x1110, 0x1175, 0x11B4], NFKC: [0xD2FD], NFKD: [0x1110, 0x1175, 0x11B4] }, +{ source: [0xD2FE], NFC: [0xD2FE], NFD: [0x1110, 0x1175, 0x11B5], NFKC: [0xD2FE], NFKD: [0x1110, 0x1175, 0x11B5] }, +{ source: [0xD2FF], NFC: [0xD2FF], NFD: [0x1110, 0x1175, 0x11B6], NFKC: [0xD2FF], NFKD: [0x1110, 0x1175, 0x11B6] }, +{ source: [0xD300], NFC: [0xD300], NFD: [0x1110, 0x1175, 0x11B7], NFKC: [0xD300], NFKD: [0x1110, 0x1175, 0x11B7] }, +{ source: [0xD301], NFC: [0xD301], NFD: [0x1110, 0x1175, 0x11B8], NFKC: [0xD301], NFKD: [0x1110, 0x1175, 0x11B8] }, +{ source: [0xD302], NFC: [0xD302], NFD: [0x1110, 0x1175, 0x11B9], NFKC: [0xD302], NFKD: [0x1110, 0x1175, 0x11B9] }, +{ source: [0xD303], NFC: [0xD303], NFD: [0x1110, 0x1175, 0x11BA], NFKC: [0xD303], NFKD: [0x1110, 0x1175, 0x11BA] }, +{ source: [0xD304], NFC: [0xD304], NFD: [0x1110, 0x1175, 0x11BB], NFKC: [0xD304], NFKD: [0x1110, 0x1175, 0x11BB] }, +{ source: [0xD305], NFC: [0xD305], NFD: [0x1110, 0x1175, 0x11BC], NFKC: [0xD305], NFKD: [0x1110, 0x1175, 0x11BC] }, +{ source: [0xD306], NFC: [0xD306], NFD: [0x1110, 0x1175, 0x11BD], NFKC: [0xD306], NFKD: [0x1110, 0x1175, 0x11BD] }, +{ source: [0xD307], NFC: [0xD307], NFD: [0x1110, 0x1175, 0x11BE], NFKC: [0xD307], NFKD: [0x1110, 0x1175, 0x11BE] }, +{ source: [0xD308], NFC: [0xD308], NFD: [0x1110, 0x1175, 0x11BF], NFKC: [0xD308], NFKD: [0x1110, 0x1175, 0x11BF] }, +{ source: [0xD309], NFC: [0xD309], NFD: [0x1110, 0x1175, 0x11C0], NFKC: [0xD309], NFKD: [0x1110, 0x1175, 0x11C0] }, +{ source: [0xD30A], NFC: [0xD30A], NFD: [0x1110, 0x1175, 0x11C1], NFKC: [0xD30A], NFKD: [0x1110, 0x1175, 0x11C1] }, +{ source: [0xD30B], NFC: [0xD30B], NFD: [0x1110, 0x1175, 0x11C2], NFKC: [0xD30B], NFKD: [0x1110, 0x1175, 0x11C2] }, +{ source: [0xD30C], NFC: [0xD30C], NFD: [0x1111, 0x1161], NFKC: [0xD30C], NFKD: [0x1111, 0x1161] }, +{ source: [0xD30D], NFC: [0xD30D], NFD: [0x1111, 0x1161, 0x11A8], NFKC: [0xD30D], NFKD: [0x1111, 0x1161, 0x11A8] }, +{ source: [0xD30E], NFC: [0xD30E], NFD: [0x1111, 0x1161, 0x11A9], NFKC: [0xD30E], NFKD: [0x1111, 0x1161, 0x11A9] }, +{ source: [0xD30F], NFC: [0xD30F], NFD: [0x1111, 0x1161, 0x11AA], NFKC: [0xD30F], NFKD: [0x1111, 0x1161, 0x11AA] }, +{ source: [0xD310], NFC: [0xD310], NFD: [0x1111, 0x1161, 0x11AB], NFKC: [0xD310], NFKD: [0x1111, 0x1161, 0x11AB] }, +{ source: [0xD311], NFC: [0xD311], NFD: [0x1111, 0x1161, 0x11AC], NFKC: [0xD311], NFKD: [0x1111, 0x1161, 0x11AC] }, +{ source: [0xD312], NFC: [0xD312], NFD: [0x1111, 0x1161, 0x11AD], NFKC: [0xD312], NFKD: [0x1111, 0x1161, 0x11AD] }, +{ source: [0xD313], NFC: [0xD313], NFD: [0x1111, 0x1161, 0x11AE], NFKC: [0xD313], NFKD: [0x1111, 0x1161, 0x11AE] }, +{ source: [0xD314], NFC: [0xD314], NFD: [0x1111, 0x1161, 0x11AF], NFKC: [0xD314], NFKD: [0x1111, 0x1161, 0x11AF] }, +{ source: [0xD315], NFC: [0xD315], NFD: [0x1111, 0x1161, 0x11B0], NFKC: [0xD315], NFKD: [0x1111, 0x1161, 0x11B0] }, +{ source: [0xD316], NFC: [0xD316], NFD: [0x1111, 0x1161, 0x11B1], NFKC: [0xD316], NFKD: [0x1111, 0x1161, 0x11B1] }, +{ source: [0xD317], NFC: [0xD317], NFD: [0x1111, 0x1161, 0x11B2], NFKC: [0xD317], NFKD: [0x1111, 0x1161, 0x11B2] }, +{ source: [0xD318], NFC: [0xD318], NFD: [0x1111, 0x1161, 0x11B3], NFKC: [0xD318], NFKD: [0x1111, 0x1161, 0x11B3] }, +{ source: [0xD319], NFC: [0xD319], NFD: [0x1111, 0x1161, 0x11B4], NFKC: [0xD319], NFKD: [0x1111, 0x1161, 0x11B4] }, +{ source: [0xD31A], NFC: [0xD31A], NFD: [0x1111, 0x1161, 0x11B5], NFKC: [0xD31A], NFKD: [0x1111, 0x1161, 0x11B5] }, +{ source: [0xD31B], NFC: [0xD31B], NFD: [0x1111, 0x1161, 0x11B6], NFKC: [0xD31B], NFKD: [0x1111, 0x1161, 0x11B6] }, +{ source: [0xD31C], NFC: [0xD31C], NFD: [0x1111, 0x1161, 0x11B7], NFKC: [0xD31C], NFKD: [0x1111, 0x1161, 0x11B7] }, +{ source: [0xD31D], NFC: [0xD31D], NFD: [0x1111, 0x1161, 0x11B8], NFKC: [0xD31D], NFKD: [0x1111, 0x1161, 0x11B8] }, +{ source: [0xD31E], NFC: [0xD31E], NFD: [0x1111, 0x1161, 0x11B9], NFKC: [0xD31E], NFKD: [0x1111, 0x1161, 0x11B9] }, +{ source: [0xD31F], NFC: [0xD31F], NFD: [0x1111, 0x1161, 0x11BA], NFKC: [0xD31F], NFKD: [0x1111, 0x1161, 0x11BA] }, +{ source: [0xD320], NFC: [0xD320], NFD: [0x1111, 0x1161, 0x11BB], NFKC: [0xD320], NFKD: [0x1111, 0x1161, 0x11BB] }, +{ source: [0xD321], NFC: [0xD321], NFD: [0x1111, 0x1161, 0x11BC], NFKC: [0xD321], NFKD: [0x1111, 0x1161, 0x11BC] }, +{ source: [0xD322], NFC: [0xD322], NFD: [0x1111, 0x1161, 0x11BD], NFKC: [0xD322], NFKD: [0x1111, 0x1161, 0x11BD] }, +{ source: [0xD323], NFC: [0xD323], NFD: [0x1111, 0x1161, 0x11BE], NFKC: [0xD323], NFKD: [0x1111, 0x1161, 0x11BE] }, +{ source: [0xD324], NFC: [0xD324], NFD: [0x1111, 0x1161, 0x11BF], NFKC: [0xD324], NFKD: [0x1111, 0x1161, 0x11BF] }, +{ source: [0xD325], NFC: [0xD325], NFD: [0x1111, 0x1161, 0x11C0], NFKC: [0xD325], NFKD: [0x1111, 0x1161, 0x11C0] }, +{ source: [0xD326], NFC: [0xD326], NFD: [0x1111, 0x1161, 0x11C1], NFKC: [0xD326], NFKD: [0x1111, 0x1161, 0x11C1] }, +{ source: [0xD327], NFC: [0xD327], NFD: [0x1111, 0x1161, 0x11C2], NFKC: [0xD327], NFKD: [0x1111, 0x1161, 0x11C2] }, +{ source: [0xD328], NFC: [0xD328], NFD: [0x1111, 0x1162], NFKC: [0xD328], NFKD: [0x1111, 0x1162] }, +{ source: [0xD329], NFC: [0xD329], NFD: [0x1111, 0x1162, 0x11A8], NFKC: [0xD329], NFKD: [0x1111, 0x1162, 0x11A8] }, +{ source: [0xD32A], NFC: [0xD32A], NFD: [0x1111, 0x1162, 0x11A9], NFKC: [0xD32A], NFKD: [0x1111, 0x1162, 0x11A9] }, +{ source: [0xD32B], NFC: [0xD32B], NFD: [0x1111, 0x1162, 0x11AA], NFKC: [0xD32B], NFKD: [0x1111, 0x1162, 0x11AA] }, +{ source: [0xD32C], NFC: [0xD32C], NFD: [0x1111, 0x1162, 0x11AB], NFKC: [0xD32C], NFKD: [0x1111, 0x1162, 0x11AB] }, +{ source: [0xD32D], NFC: [0xD32D], NFD: [0x1111, 0x1162, 0x11AC], NFKC: [0xD32D], NFKD: [0x1111, 0x1162, 0x11AC] }, +{ source: [0xD32E], NFC: [0xD32E], NFD: [0x1111, 0x1162, 0x11AD], NFKC: [0xD32E], NFKD: [0x1111, 0x1162, 0x11AD] }, +{ source: [0xD32F], NFC: [0xD32F], NFD: [0x1111, 0x1162, 0x11AE], NFKC: [0xD32F], NFKD: [0x1111, 0x1162, 0x11AE] }, +{ source: [0xD330], NFC: [0xD330], NFD: [0x1111, 0x1162, 0x11AF], NFKC: [0xD330], NFKD: [0x1111, 0x1162, 0x11AF] }, +{ source: [0xD331], NFC: [0xD331], NFD: [0x1111, 0x1162, 0x11B0], NFKC: [0xD331], NFKD: [0x1111, 0x1162, 0x11B0] }, +{ source: [0xD332], NFC: [0xD332], NFD: [0x1111, 0x1162, 0x11B1], NFKC: [0xD332], NFKD: [0x1111, 0x1162, 0x11B1] }, +{ source: [0xD333], NFC: [0xD333], NFD: [0x1111, 0x1162, 0x11B2], NFKC: [0xD333], NFKD: [0x1111, 0x1162, 0x11B2] }, +{ source: [0xD334], NFC: [0xD334], NFD: [0x1111, 0x1162, 0x11B3], NFKC: [0xD334], NFKD: [0x1111, 0x1162, 0x11B3] }, +{ source: [0xD335], NFC: [0xD335], NFD: [0x1111, 0x1162, 0x11B4], NFKC: [0xD335], NFKD: [0x1111, 0x1162, 0x11B4] }, +{ source: [0xD336], NFC: [0xD336], NFD: [0x1111, 0x1162, 0x11B5], NFKC: [0xD336], NFKD: [0x1111, 0x1162, 0x11B5] }, +{ source: [0xD337], NFC: [0xD337], NFD: [0x1111, 0x1162, 0x11B6], NFKC: [0xD337], NFKD: [0x1111, 0x1162, 0x11B6] }, +{ source: [0xD338], NFC: [0xD338], NFD: [0x1111, 0x1162, 0x11B7], NFKC: [0xD338], NFKD: [0x1111, 0x1162, 0x11B7] }, +{ source: [0xD339], NFC: [0xD339], NFD: [0x1111, 0x1162, 0x11B8], NFKC: [0xD339], NFKD: [0x1111, 0x1162, 0x11B8] }, +{ source: [0xD33A], NFC: [0xD33A], NFD: [0x1111, 0x1162, 0x11B9], NFKC: [0xD33A], NFKD: [0x1111, 0x1162, 0x11B9] }, +{ source: [0xD33B], NFC: [0xD33B], NFD: [0x1111, 0x1162, 0x11BA], NFKC: [0xD33B], NFKD: [0x1111, 0x1162, 0x11BA] }, +{ source: [0xD33C], NFC: [0xD33C], NFD: [0x1111, 0x1162, 0x11BB], NFKC: [0xD33C], NFKD: [0x1111, 0x1162, 0x11BB] }, +{ source: [0xD33D], NFC: [0xD33D], NFD: [0x1111, 0x1162, 0x11BC], NFKC: [0xD33D], NFKD: [0x1111, 0x1162, 0x11BC] }, +{ source: [0xD33E], NFC: [0xD33E], NFD: [0x1111, 0x1162, 0x11BD], NFKC: [0xD33E], NFKD: [0x1111, 0x1162, 0x11BD] }, +{ source: [0xD33F], NFC: [0xD33F], NFD: [0x1111, 0x1162, 0x11BE], NFKC: [0xD33F], NFKD: [0x1111, 0x1162, 0x11BE] }, +{ source: [0xD340], NFC: [0xD340], NFD: [0x1111, 0x1162, 0x11BF], NFKC: [0xD340], NFKD: [0x1111, 0x1162, 0x11BF] }, +{ source: [0xD341], NFC: [0xD341], NFD: [0x1111, 0x1162, 0x11C0], NFKC: [0xD341], NFKD: [0x1111, 0x1162, 0x11C0] }, +{ source: [0xD342], NFC: [0xD342], NFD: [0x1111, 0x1162, 0x11C1], NFKC: [0xD342], NFKD: [0x1111, 0x1162, 0x11C1] }, +{ source: [0xD343], NFC: [0xD343], NFD: [0x1111, 0x1162, 0x11C2], NFKC: [0xD343], NFKD: [0x1111, 0x1162, 0x11C2] }, +{ source: [0xD344], NFC: [0xD344], NFD: [0x1111, 0x1163], NFKC: [0xD344], NFKD: [0x1111, 0x1163] }, +{ source: [0xD345], NFC: [0xD345], NFD: [0x1111, 0x1163, 0x11A8], NFKC: [0xD345], NFKD: [0x1111, 0x1163, 0x11A8] }, +{ source: [0xD346], NFC: [0xD346], NFD: [0x1111, 0x1163, 0x11A9], NFKC: [0xD346], NFKD: [0x1111, 0x1163, 0x11A9] }, +{ source: [0xD347], NFC: [0xD347], NFD: [0x1111, 0x1163, 0x11AA], NFKC: [0xD347], NFKD: [0x1111, 0x1163, 0x11AA] }, +{ source: [0xD348], NFC: [0xD348], NFD: [0x1111, 0x1163, 0x11AB], NFKC: [0xD348], NFKD: [0x1111, 0x1163, 0x11AB] }, +{ source: [0xD349], NFC: [0xD349], NFD: [0x1111, 0x1163, 0x11AC], NFKC: [0xD349], NFKD: [0x1111, 0x1163, 0x11AC] }, +{ source: [0xD34A], NFC: [0xD34A], NFD: [0x1111, 0x1163, 0x11AD], NFKC: [0xD34A], NFKD: [0x1111, 0x1163, 0x11AD] }, +{ source: [0xD34B], NFC: [0xD34B], NFD: [0x1111, 0x1163, 0x11AE], NFKC: [0xD34B], NFKD: [0x1111, 0x1163, 0x11AE] }, +{ source: [0xD34C], NFC: [0xD34C], NFD: [0x1111, 0x1163, 0x11AF], NFKC: [0xD34C], NFKD: [0x1111, 0x1163, 0x11AF] }, +{ source: [0xD34D], NFC: [0xD34D], NFD: [0x1111, 0x1163, 0x11B0], NFKC: [0xD34D], NFKD: [0x1111, 0x1163, 0x11B0] }, +{ source: [0xD34E], NFC: [0xD34E], NFD: [0x1111, 0x1163, 0x11B1], NFKC: [0xD34E], NFKD: [0x1111, 0x1163, 0x11B1] }, +{ source: [0xD34F], NFC: [0xD34F], NFD: [0x1111, 0x1163, 0x11B2], NFKC: [0xD34F], NFKD: [0x1111, 0x1163, 0x11B2] }, +{ source: [0xD350], NFC: [0xD350], NFD: [0x1111, 0x1163, 0x11B3], NFKC: [0xD350], NFKD: [0x1111, 0x1163, 0x11B3] }, +{ source: [0xD351], NFC: [0xD351], NFD: [0x1111, 0x1163, 0x11B4], NFKC: [0xD351], NFKD: [0x1111, 0x1163, 0x11B4] }, +{ source: [0xD352], NFC: [0xD352], NFD: [0x1111, 0x1163, 0x11B5], NFKC: [0xD352], NFKD: [0x1111, 0x1163, 0x11B5] }, +{ source: [0xD353], NFC: [0xD353], NFD: [0x1111, 0x1163, 0x11B6], NFKC: [0xD353], NFKD: [0x1111, 0x1163, 0x11B6] }, +{ source: [0xD354], NFC: [0xD354], NFD: [0x1111, 0x1163, 0x11B7], NFKC: [0xD354], NFKD: [0x1111, 0x1163, 0x11B7] }, +{ source: [0xD355], NFC: [0xD355], NFD: [0x1111, 0x1163, 0x11B8], NFKC: [0xD355], NFKD: [0x1111, 0x1163, 0x11B8] }, +{ source: [0xD356], NFC: [0xD356], NFD: [0x1111, 0x1163, 0x11B9], NFKC: [0xD356], NFKD: [0x1111, 0x1163, 0x11B9] }, +{ source: [0xD357], NFC: [0xD357], NFD: [0x1111, 0x1163, 0x11BA], NFKC: [0xD357], NFKD: [0x1111, 0x1163, 0x11BA] }, +{ source: [0xD358], NFC: [0xD358], NFD: [0x1111, 0x1163, 0x11BB], NFKC: [0xD358], NFKD: [0x1111, 0x1163, 0x11BB] }, +{ source: [0xD359], NFC: [0xD359], NFD: [0x1111, 0x1163, 0x11BC], NFKC: [0xD359], NFKD: [0x1111, 0x1163, 0x11BC] }, +{ source: [0xD35A], NFC: [0xD35A], NFD: [0x1111, 0x1163, 0x11BD], NFKC: [0xD35A], NFKD: [0x1111, 0x1163, 0x11BD] }, +{ source: [0xD35B], NFC: [0xD35B], NFD: [0x1111, 0x1163, 0x11BE], NFKC: [0xD35B], NFKD: [0x1111, 0x1163, 0x11BE] }, +{ source: [0xD35C], NFC: [0xD35C], NFD: [0x1111, 0x1163, 0x11BF], NFKC: [0xD35C], NFKD: [0x1111, 0x1163, 0x11BF] }, +{ source: [0xD35D], NFC: [0xD35D], NFD: [0x1111, 0x1163, 0x11C0], NFKC: [0xD35D], NFKD: [0x1111, 0x1163, 0x11C0] }, +{ source: [0xD35E], NFC: [0xD35E], NFD: [0x1111, 0x1163, 0x11C1], NFKC: [0xD35E], NFKD: [0x1111, 0x1163, 0x11C1] }, +{ source: [0xD35F], NFC: [0xD35F], NFD: [0x1111, 0x1163, 0x11C2], NFKC: [0xD35F], NFKD: [0x1111, 0x1163, 0x11C2] }, +{ source: [0xD360], NFC: [0xD360], NFD: [0x1111, 0x1164], NFKC: [0xD360], NFKD: [0x1111, 0x1164] }, +{ source: [0xD361], NFC: [0xD361], NFD: [0x1111, 0x1164, 0x11A8], NFKC: [0xD361], NFKD: [0x1111, 0x1164, 0x11A8] }, +{ source: [0xD362], NFC: [0xD362], NFD: [0x1111, 0x1164, 0x11A9], NFKC: [0xD362], NFKD: [0x1111, 0x1164, 0x11A9] }, +{ source: [0xD363], NFC: [0xD363], NFD: [0x1111, 0x1164, 0x11AA], NFKC: [0xD363], NFKD: [0x1111, 0x1164, 0x11AA] }, +{ source: [0xD364], NFC: [0xD364], NFD: [0x1111, 0x1164, 0x11AB], NFKC: [0xD364], NFKD: [0x1111, 0x1164, 0x11AB] }, +{ source: [0xD365], NFC: [0xD365], NFD: [0x1111, 0x1164, 0x11AC], NFKC: [0xD365], NFKD: [0x1111, 0x1164, 0x11AC] }, +{ source: [0xD366], NFC: [0xD366], NFD: [0x1111, 0x1164, 0x11AD], NFKC: [0xD366], NFKD: [0x1111, 0x1164, 0x11AD] }, +{ source: [0xD367], NFC: [0xD367], NFD: [0x1111, 0x1164, 0x11AE], NFKC: [0xD367], NFKD: [0x1111, 0x1164, 0x11AE] }, +{ source: [0xD368], NFC: [0xD368], NFD: [0x1111, 0x1164, 0x11AF], NFKC: [0xD368], NFKD: [0x1111, 0x1164, 0x11AF] }, +{ source: [0xD369], NFC: [0xD369], NFD: [0x1111, 0x1164, 0x11B0], NFKC: [0xD369], NFKD: [0x1111, 0x1164, 0x11B0] }, +{ source: [0xD36A], NFC: [0xD36A], NFD: [0x1111, 0x1164, 0x11B1], NFKC: [0xD36A], NFKD: [0x1111, 0x1164, 0x11B1] }, +{ source: [0xD36B], NFC: [0xD36B], NFD: [0x1111, 0x1164, 0x11B2], NFKC: [0xD36B], NFKD: [0x1111, 0x1164, 0x11B2] }, +{ source: [0xD36C], NFC: [0xD36C], NFD: [0x1111, 0x1164, 0x11B3], NFKC: [0xD36C], NFKD: [0x1111, 0x1164, 0x11B3] }, +{ source: [0xD36D], NFC: [0xD36D], NFD: [0x1111, 0x1164, 0x11B4], NFKC: [0xD36D], NFKD: [0x1111, 0x1164, 0x11B4] }, +{ source: [0xD36E], NFC: [0xD36E], NFD: [0x1111, 0x1164, 0x11B5], NFKC: [0xD36E], NFKD: [0x1111, 0x1164, 0x11B5] }, +{ source: [0xD36F], NFC: [0xD36F], NFD: [0x1111, 0x1164, 0x11B6], NFKC: [0xD36F], NFKD: [0x1111, 0x1164, 0x11B6] }, +{ source: [0xD370], NFC: [0xD370], NFD: [0x1111, 0x1164, 0x11B7], NFKC: [0xD370], NFKD: [0x1111, 0x1164, 0x11B7] }, +{ source: [0xD371], NFC: [0xD371], NFD: [0x1111, 0x1164, 0x11B8], NFKC: [0xD371], NFKD: [0x1111, 0x1164, 0x11B8] }, +{ source: [0xD372], NFC: [0xD372], NFD: [0x1111, 0x1164, 0x11B9], NFKC: [0xD372], NFKD: [0x1111, 0x1164, 0x11B9] }, +{ source: [0xD373], NFC: [0xD373], NFD: [0x1111, 0x1164, 0x11BA], NFKC: [0xD373], NFKD: [0x1111, 0x1164, 0x11BA] }, +{ source: [0xD374], NFC: [0xD374], NFD: [0x1111, 0x1164, 0x11BB], NFKC: [0xD374], NFKD: [0x1111, 0x1164, 0x11BB] }, +{ source: [0xD375], NFC: [0xD375], NFD: [0x1111, 0x1164, 0x11BC], NFKC: [0xD375], NFKD: [0x1111, 0x1164, 0x11BC] }, +{ source: [0xD376], NFC: [0xD376], NFD: [0x1111, 0x1164, 0x11BD], NFKC: [0xD376], NFKD: [0x1111, 0x1164, 0x11BD] }, +{ source: [0xD377], NFC: [0xD377], NFD: [0x1111, 0x1164, 0x11BE], NFKC: [0xD377], NFKD: [0x1111, 0x1164, 0x11BE] }, +{ source: [0xD378], NFC: [0xD378], NFD: [0x1111, 0x1164, 0x11BF], NFKC: [0xD378], NFKD: [0x1111, 0x1164, 0x11BF] }, +{ source: [0xD379], NFC: [0xD379], NFD: [0x1111, 0x1164, 0x11C0], NFKC: [0xD379], NFKD: [0x1111, 0x1164, 0x11C0] }, +{ source: [0xD37A], NFC: [0xD37A], NFD: [0x1111, 0x1164, 0x11C1], NFKC: [0xD37A], NFKD: [0x1111, 0x1164, 0x11C1] }, +{ source: [0xD37B], NFC: [0xD37B], NFD: [0x1111, 0x1164, 0x11C2], NFKC: [0xD37B], NFKD: [0x1111, 0x1164, 0x11C2] }, +{ source: [0xD37C], NFC: [0xD37C], NFD: [0x1111, 0x1165], NFKC: [0xD37C], NFKD: [0x1111, 0x1165] }, +{ source: [0xD37D], NFC: [0xD37D], NFD: [0x1111, 0x1165, 0x11A8], NFKC: [0xD37D], NFKD: [0x1111, 0x1165, 0x11A8] }, +{ source: [0xD37E], NFC: [0xD37E], NFD: [0x1111, 0x1165, 0x11A9], NFKC: [0xD37E], NFKD: [0x1111, 0x1165, 0x11A9] }, +{ source: [0xD37F], NFC: [0xD37F], NFD: [0x1111, 0x1165, 0x11AA], NFKC: [0xD37F], NFKD: [0x1111, 0x1165, 0x11AA] }, +{ source: [0xD380], NFC: [0xD380], NFD: [0x1111, 0x1165, 0x11AB], NFKC: [0xD380], NFKD: [0x1111, 0x1165, 0x11AB] }, +{ source: [0xD381], NFC: [0xD381], NFD: [0x1111, 0x1165, 0x11AC], NFKC: [0xD381], NFKD: [0x1111, 0x1165, 0x11AC] }, +{ source: [0xD382], NFC: [0xD382], NFD: [0x1111, 0x1165, 0x11AD], NFKC: [0xD382], NFKD: [0x1111, 0x1165, 0x11AD] }, +{ source: [0xD383], NFC: [0xD383], NFD: [0x1111, 0x1165, 0x11AE], NFKC: [0xD383], NFKD: [0x1111, 0x1165, 0x11AE] }, +{ source: [0xD384], NFC: [0xD384], NFD: [0x1111, 0x1165, 0x11AF], NFKC: [0xD384], NFKD: [0x1111, 0x1165, 0x11AF] }, +{ source: [0xD385], NFC: [0xD385], NFD: [0x1111, 0x1165, 0x11B0], NFKC: [0xD385], NFKD: [0x1111, 0x1165, 0x11B0] }, +{ source: [0xD386], NFC: [0xD386], NFD: [0x1111, 0x1165, 0x11B1], NFKC: [0xD386], NFKD: [0x1111, 0x1165, 0x11B1] }, +{ source: [0xD387], NFC: [0xD387], NFD: [0x1111, 0x1165, 0x11B2], NFKC: [0xD387], NFKD: [0x1111, 0x1165, 0x11B2] }, +{ source: [0xD388], NFC: [0xD388], NFD: [0x1111, 0x1165, 0x11B3], NFKC: [0xD388], NFKD: [0x1111, 0x1165, 0x11B3] }, +{ source: [0xD389], NFC: [0xD389], NFD: [0x1111, 0x1165, 0x11B4], NFKC: [0xD389], NFKD: [0x1111, 0x1165, 0x11B4] }, +{ source: [0xD38A], NFC: [0xD38A], NFD: [0x1111, 0x1165, 0x11B5], NFKC: [0xD38A], NFKD: [0x1111, 0x1165, 0x11B5] }, +{ source: [0xD38B], NFC: [0xD38B], NFD: [0x1111, 0x1165, 0x11B6], NFKC: [0xD38B], NFKD: [0x1111, 0x1165, 0x11B6] }, +{ source: [0xD38C], NFC: [0xD38C], NFD: [0x1111, 0x1165, 0x11B7], NFKC: [0xD38C], NFKD: [0x1111, 0x1165, 0x11B7] }, +{ source: [0xD38D], NFC: [0xD38D], NFD: [0x1111, 0x1165, 0x11B8], NFKC: [0xD38D], NFKD: [0x1111, 0x1165, 0x11B8] }, +{ source: [0xD38E], NFC: [0xD38E], NFD: [0x1111, 0x1165, 0x11B9], NFKC: [0xD38E], NFKD: [0x1111, 0x1165, 0x11B9] }, +{ source: [0xD38F], NFC: [0xD38F], NFD: [0x1111, 0x1165, 0x11BA], NFKC: [0xD38F], NFKD: [0x1111, 0x1165, 0x11BA] }, +{ source: [0xD390], NFC: [0xD390], NFD: [0x1111, 0x1165, 0x11BB], NFKC: [0xD390], NFKD: [0x1111, 0x1165, 0x11BB] }, +{ source: [0xD391], NFC: [0xD391], NFD: [0x1111, 0x1165, 0x11BC], NFKC: [0xD391], NFKD: [0x1111, 0x1165, 0x11BC] }, +{ source: [0xD392], NFC: [0xD392], NFD: [0x1111, 0x1165, 0x11BD], NFKC: [0xD392], NFKD: [0x1111, 0x1165, 0x11BD] }, +{ source: [0xD393], NFC: [0xD393], NFD: [0x1111, 0x1165, 0x11BE], NFKC: [0xD393], NFKD: [0x1111, 0x1165, 0x11BE] }, +{ source: [0xD394], NFC: [0xD394], NFD: [0x1111, 0x1165, 0x11BF], NFKC: [0xD394], NFKD: [0x1111, 0x1165, 0x11BF] }, +{ source: [0xD395], NFC: [0xD395], NFD: [0x1111, 0x1165, 0x11C0], NFKC: [0xD395], NFKD: [0x1111, 0x1165, 0x11C0] }, +{ source: [0xD396], NFC: [0xD396], NFD: [0x1111, 0x1165, 0x11C1], NFKC: [0xD396], NFKD: [0x1111, 0x1165, 0x11C1] }, +{ source: [0xD397], NFC: [0xD397], NFD: [0x1111, 0x1165, 0x11C2], NFKC: [0xD397], NFKD: [0x1111, 0x1165, 0x11C2] }, +{ source: [0xD398], NFC: [0xD398], NFD: [0x1111, 0x1166], NFKC: [0xD398], NFKD: [0x1111, 0x1166] }, +{ source: [0xD399], NFC: [0xD399], NFD: [0x1111, 0x1166, 0x11A8], NFKC: [0xD399], NFKD: [0x1111, 0x1166, 0x11A8] }, +{ source: [0xD39A], NFC: [0xD39A], NFD: [0x1111, 0x1166, 0x11A9], NFKC: [0xD39A], NFKD: [0x1111, 0x1166, 0x11A9] }, +{ source: [0xD39B], NFC: [0xD39B], NFD: [0x1111, 0x1166, 0x11AA], NFKC: [0xD39B], NFKD: [0x1111, 0x1166, 0x11AA] }, +{ source: [0xD39C], NFC: [0xD39C], NFD: [0x1111, 0x1166, 0x11AB], NFKC: [0xD39C], NFKD: [0x1111, 0x1166, 0x11AB] }, +{ source: [0xD39D], NFC: [0xD39D], NFD: [0x1111, 0x1166, 0x11AC], NFKC: [0xD39D], NFKD: [0x1111, 0x1166, 0x11AC] }, +{ source: [0xD39E], NFC: [0xD39E], NFD: [0x1111, 0x1166, 0x11AD], NFKC: [0xD39E], NFKD: [0x1111, 0x1166, 0x11AD] }, +{ source: [0xD39F], NFC: [0xD39F], NFD: [0x1111, 0x1166, 0x11AE], NFKC: [0xD39F], NFKD: [0x1111, 0x1166, 0x11AE] }, +{ source: [0xD3A0], NFC: [0xD3A0], NFD: [0x1111, 0x1166, 0x11AF], NFKC: [0xD3A0], NFKD: [0x1111, 0x1166, 0x11AF] }, +{ source: [0xD3A1], NFC: [0xD3A1], NFD: [0x1111, 0x1166, 0x11B0], NFKC: [0xD3A1], NFKD: [0x1111, 0x1166, 0x11B0] }, +{ source: [0xD3A2], NFC: [0xD3A2], NFD: [0x1111, 0x1166, 0x11B1], NFKC: [0xD3A2], NFKD: [0x1111, 0x1166, 0x11B1] }, +{ source: [0xD3A3], NFC: [0xD3A3], NFD: [0x1111, 0x1166, 0x11B2], NFKC: [0xD3A3], NFKD: [0x1111, 0x1166, 0x11B2] }, +{ source: [0xD3A4], NFC: [0xD3A4], NFD: [0x1111, 0x1166, 0x11B3], NFKC: [0xD3A4], NFKD: [0x1111, 0x1166, 0x11B3] }, +{ source: [0xD3A5], NFC: [0xD3A5], NFD: [0x1111, 0x1166, 0x11B4], NFKC: [0xD3A5], NFKD: [0x1111, 0x1166, 0x11B4] }, +{ source: [0xD3A6], NFC: [0xD3A6], NFD: [0x1111, 0x1166, 0x11B5], NFKC: [0xD3A6], NFKD: [0x1111, 0x1166, 0x11B5] }, +{ source: [0xD3A7], NFC: [0xD3A7], NFD: [0x1111, 0x1166, 0x11B6], NFKC: [0xD3A7], NFKD: [0x1111, 0x1166, 0x11B6] }, +{ source: [0xD3A8], NFC: [0xD3A8], NFD: [0x1111, 0x1166, 0x11B7], NFKC: [0xD3A8], NFKD: [0x1111, 0x1166, 0x11B7] }, +{ source: [0xD3A9], NFC: [0xD3A9], NFD: [0x1111, 0x1166, 0x11B8], NFKC: [0xD3A9], NFKD: [0x1111, 0x1166, 0x11B8] }, +{ source: [0xD3AA], NFC: [0xD3AA], NFD: [0x1111, 0x1166, 0x11B9], NFKC: [0xD3AA], NFKD: [0x1111, 0x1166, 0x11B9] }, +{ source: [0xD3AB], NFC: [0xD3AB], NFD: [0x1111, 0x1166, 0x11BA], NFKC: [0xD3AB], NFKD: [0x1111, 0x1166, 0x11BA] }, +{ source: [0xD3AC], NFC: [0xD3AC], NFD: [0x1111, 0x1166, 0x11BB], NFKC: [0xD3AC], NFKD: [0x1111, 0x1166, 0x11BB] }, +{ source: [0xD3AD], NFC: [0xD3AD], NFD: [0x1111, 0x1166, 0x11BC], NFKC: [0xD3AD], NFKD: [0x1111, 0x1166, 0x11BC] }, +{ source: [0xD3AE], NFC: [0xD3AE], NFD: [0x1111, 0x1166, 0x11BD], NFKC: [0xD3AE], NFKD: [0x1111, 0x1166, 0x11BD] }, +{ source: [0xD3AF], NFC: [0xD3AF], NFD: [0x1111, 0x1166, 0x11BE], NFKC: [0xD3AF], NFKD: [0x1111, 0x1166, 0x11BE] }, +{ source: [0xD3B0], NFC: [0xD3B0], NFD: [0x1111, 0x1166, 0x11BF], NFKC: [0xD3B0], NFKD: [0x1111, 0x1166, 0x11BF] }, +{ source: [0xD3B1], NFC: [0xD3B1], NFD: [0x1111, 0x1166, 0x11C0], NFKC: [0xD3B1], NFKD: [0x1111, 0x1166, 0x11C0] }, +{ source: [0xD3B2], NFC: [0xD3B2], NFD: [0x1111, 0x1166, 0x11C1], NFKC: [0xD3B2], NFKD: [0x1111, 0x1166, 0x11C1] }, +{ source: [0xD3B3], NFC: [0xD3B3], NFD: [0x1111, 0x1166, 0x11C2], NFKC: [0xD3B3], NFKD: [0x1111, 0x1166, 0x11C2] }, +{ source: [0xD3B4], NFC: [0xD3B4], NFD: [0x1111, 0x1167], NFKC: [0xD3B4], NFKD: [0x1111, 0x1167] }, +{ source: [0xD3B5], NFC: [0xD3B5], NFD: [0x1111, 0x1167, 0x11A8], NFKC: [0xD3B5], NFKD: [0x1111, 0x1167, 0x11A8] }, +{ source: [0xD3B6], NFC: [0xD3B6], NFD: [0x1111, 0x1167, 0x11A9], NFKC: [0xD3B6], NFKD: [0x1111, 0x1167, 0x11A9] }, +{ source: [0xD3B7], NFC: [0xD3B7], NFD: [0x1111, 0x1167, 0x11AA], NFKC: [0xD3B7], NFKD: [0x1111, 0x1167, 0x11AA] }, +{ source: [0xD3B8], NFC: [0xD3B8], NFD: [0x1111, 0x1167, 0x11AB], NFKC: [0xD3B8], NFKD: [0x1111, 0x1167, 0x11AB] }, +{ source: [0xD3B9], NFC: [0xD3B9], NFD: [0x1111, 0x1167, 0x11AC], NFKC: [0xD3B9], NFKD: [0x1111, 0x1167, 0x11AC] }, +{ source: [0xD3BA], NFC: [0xD3BA], NFD: [0x1111, 0x1167, 0x11AD], NFKC: [0xD3BA], NFKD: [0x1111, 0x1167, 0x11AD] }, +{ source: [0xD3BB], NFC: [0xD3BB], NFD: [0x1111, 0x1167, 0x11AE], NFKC: [0xD3BB], NFKD: [0x1111, 0x1167, 0x11AE] }, +{ source: [0xD3BC], NFC: [0xD3BC], NFD: [0x1111, 0x1167, 0x11AF], NFKC: [0xD3BC], NFKD: [0x1111, 0x1167, 0x11AF] }, +{ source: [0xD3BD], NFC: [0xD3BD], NFD: [0x1111, 0x1167, 0x11B0], NFKC: [0xD3BD], NFKD: [0x1111, 0x1167, 0x11B0] }, +{ source: [0xD3BE], NFC: [0xD3BE], NFD: [0x1111, 0x1167, 0x11B1], NFKC: [0xD3BE], NFKD: [0x1111, 0x1167, 0x11B1] }, +{ source: [0xD3BF], NFC: [0xD3BF], NFD: [0x1111, 0x1167, 0x11B2], NFKC: [0xD3BF], NFKD: [0x1111, 0x1167, 0x11B2] }, +{ source: [0xD3C0], NFC: [0xD3C0], NFD: [0x1111, 0x1167, 0x11B3], NFKC: [0xD3C0], NFKD: [0x1111, 0x1167, 0x11B3] }, +{ source: [0xD3C1], NFC: [0xD3C1], NFD: [0x1111, 0x1167, 0x11B4], NFKC: [0xD3C1], NFKD: [0x1111, 0x1167, 0x11B4] }, +{ source: [0xD3C2], NFC: [0xD3C2], NFD: [0x1111, 0x1167, 0x11B5], NFKC: [0xD3C2], NFKD: [0x1111, 0x1167, 0x11B5] }, +{ source: [0xD3C3], NFC: [0xD3C3], NFD: [0x1111, 0x1167, 0x11B6], NFKC: [0xD3C3], NFKD: [0x1111, 0x1167, 0x11B6] }, +{ source: [0xD3C4], NFC: [0xD3C4], NFD: [0x1111, 0x1167, 0x11B7], NFKC: [0xD3C4], NFKD: [0x1111, 0x1167, 0x11B7] }, +{ source: [0xD3C5], NFC: [0xD3C5], NFD: [0x1111, 0x1167, 0x11B8], NFKC: [0xD3C5], NFKD: [0x1111, 0x1167, 0x11B8] }, +{ source: [0xD3C6], NFC: [0xD3C6], NFD: [0x1111, 0x1167, 0x11B9], NFKC: [0xD3C6], NFKD: [0x1111, 0x1167, 0x11B9] }, +{ source: [0xD3C7], NFC: [0xD3C7], NFD: [0x1111, 0x1167, 0x11BA], NFKC: [0xD3C7], NFKD: [0x1111, 0x1167, 0x11BA] }, +{ source: [0xD3C8], NFC: [0xD3C8], NFD: [0x1111, 0x1167, 0x11BB], NFKC: [0xD3C8], NFKD: [0x1111, 0x1167, 0x11BB] }, +{ source: [0xD3C9], NFC: [0xD3C9], NFD: [0x1111, 0x1167, 0x11BC], NFKC: [0xD3C9], NFKD: [0x1111, 0x1167, 0x11BC] }, +{ source: [0xD3CA], NFC: [0xD3CA], NFD: [0x1111, 0x1167, 0x11BD], NFKC: [0xD3CA], NFKD: [0x1111, 0x1167, 0x11BD] }, +{ source: [0xD3CB], NFC: [0xD3CB], NFD: [0x1111, 0x1167, 0x11BE], NFKC: [0xD3CB], NFKD: [0x1111, 0x1167, 0x11BE] }, +{ source: [0xD3CC], NFC: [0xD3CC], NFD: [0x1111, 0x1167, 0x11BF], NFKC: [0xD3CC], NFKD: [0x1111, 0x1167, 0x11BF] }, +{ source: [0xD3CD], NFC: [0xD3CD], NFD: [0x1111, 0x1167, 0x11C0], NFKC: [0xD3CD], NFKD: [0x1111, 0x1167, 0x11C0] }, +{ source: [0xD3CE], NFC: [0xD3CE], NFD: [0x1111, 0x1167, 0x11C1], NFKC: [0xD3CE], NFKD: [0x1111, 0x1167, 0x11C1] }, +{ source: [0xD3CF], NFC: [0xD3CF], NFD: [0x1111, 0x1167, 0x11C2], NFKC: [0xD3CF], NFKD: [0x1111, 0x1167, 0x11C2] }, +{ source: [0xD3D0], NFC: [0xD3D0], NFD: [0x1111, 0x1168], NFKC: [0xD3D0], NFKD: [0x1111, 0x1168] }, +{ source: [0xD3D1], NFC: [0xD3D1], NFD: [0x1111, 0x1168, 0x11A8], NFKC: [0xD3D1], NFKD: [0x1111, 0x1168, 0x11A8] }, +{ source: [0xD3D2], NFC: [0xD3D2], NFD: [0x1111, 0x1168, 0x11A9], NFKC: [0xD3D2], NFKD: [0x1111, 0x1168, 0x11A9] }, +{ source: [0xD3D3], NFC: [0xD3D3], NFD: [0x1111, 0x1168, 0x11AA], NFKC: [0xD3D3], NFKD: [0x1111, 0x1168, 0x11AA] }, +{ source: [0xD3D4], NFC: [0xD3D4], NFD: [0x1111, 0x1168, 0x11AB], NFKC: [0xD3D4], NFKD: [0x1111, 0x1168, 0x11AB] }, +{ source: [0xD3D5], NFC: [0xD3D5], NFD: [0x1111, 0x1168, 0x11AC], NFKC: [0xD3D5], NFKD: [0x1111, 0x1168, 0x11AC] }, +{ source: [0xD3D6], NFC: [0xD3D6], NFD: [0x1111, 0x1168, 0x11AD], NFKC: [0xD3D6], NFKD: [0x1111, 0x1168, 0x11AD] }, +{ source: [0xD3D7], NFC: [0xD3D7], NFD: [0x1111, 0x1168, 0x11AE], NFKC: [0xD3D7], NFKD: [0x1111, 0x1168, 0x11AE] }, +{ source: [0xD3D8], NFC: [0xD3D8], NFD: [0x1111, 0x1168, 0x11AF], NFKC: [0xD3D8], NFKD: [0x1111, 0x1168, 0x11AF] }, +{ source: [0xD3D9], NFC: [0xD3D9], NFD: [0x1111, 0x1168, 0x11B0], NFKC: [0xD3D9], NFKD: [0x1111, 0x1168, 0x11B0] }, +{ source: [0xD3DA], NFC: [0xD3DA], NFD: [0x1111, 0x1168, 0x11B1], NFKC: [0xD3DA], NFKD: [0x1111, 0x1168, 0x11B1] }, +{ source: [0xD3DB], NFC: [0xD3DB], NFD: [0x1111, 0x1168, 0x11B2], NFKC: [0xD3DB], NFKD: [0x1111, 0x1168, 0x11B2] }, +{ source: [0xD3DC], NFC: [0xD3DC], NFD: [0x1111, 0x1168, 0x11B3], NFKC: [0xD3DC], NFKD: [0x1111, 0x1168, 0x11B3] }, +{ source: [0xD3DD], NFC: [0xD3DD], NFD: [0x1111, 0x1168, 0x11B4], NFKC: [0xD3DD], NFKD: [0x1111, 0x1168, 0x11B4] }, +{ source: [0xD3DE], NFC: [0xD3DE], NFD: [0x1111, 0x1168, 0x11B5], NFKC: [0xD3DE], NFKD: [0x1111, 0x1168, 0x11B5] }, +{ source: [0xD3DF], NFC: [0xD3DF], NFD: [0x1111, 0x1168, 0x11B6], NFKC: [0xD3DF], NFKD: [0x1111, 0x1168, 0x11B6] }, +{ source: [0xD3E0], NFC: [0xD3E0], NFD: [0x1111, 0x1168, 0x11B7], NFKC: [0xD3E0], NFKD: [0x1111, 0x1168, 0x11B7] }, +{ source: [0xD3E1], NFC: [0xD3E1], NFD: [0x1111, 0x1168, 0x11B8], NFKC: [0xD3E1], NFKD: [0x1111, 0x1168, 0x11B8] }, +{ source: [0xD3E2], NFC: [0xD3E2], NFD: [0x1111, 0x1168, 0x11B9], NFKC: [0xD3E2], NFKD: [0x1111, 0x1168, 0x11B9] }, +{ source: [0xD3E3], NFC: [0xD3E3], NFD: [0x1111, 0x1168, 0x11BA], NFKC: [0xD3E3], NFKD: [0x1111, 0x1168, 0x11BA] }, +{ source: [0xD3E4], NFC: [0xD3E4], NFD: [0x1111, 0x1168, 0x11BB], NFKC: [0xD3E4], NFKD: [0x1111, 0x1168, 0x11BB] }, +{ source: [0xD3E5], NFC: [0xD3E5], NFD: [0x1111, 0x1168, 0x11BC], NFKC: [0xD3E5], NFKD: [0x1111, 0x1168, 0x11BC] }, +{ source: [0xD3E6], NFC: [0xD3E6], NFD: [0x1111, 0x1168, 0x11BD], NFKC: [0xD3E6], NFKD: [0x1111, 0x1168, 0x11BD] }, +{ source: [0xD3E7], NFC: [0xD3E7], NFD: [0x1111, 0x1168, 0x11BE], NFKC: [0xD3E7], NFKD: [0x1111, 0x1168, 0x11BE] }, +{ source: [0xD3E8], NFC: [0xD3E8], NFD: [0x1111, 0x1168, 0x11BF], NFKC: [0xD3E8], NFKD: [0x1111, 0x1168, 0x11BF] }, +{ source: [0xD3E9], NFC: [0xD3E9], NFD: [0x1111, 0x1168, 0x11C0], NFKC: [0xD3E9], NFKD: [0x1111, 0x1168, 0x11C0] }, +{ source: [0xD3EA], NFC: [0xD3EA], NFD: [0x1111, 0x1168, 0x11C1], NFKC: [0xD3EA], NFKD: [0x1111, 0x1168, 0x11C1] }, +{ source: [0xD3EB], NFC: [0xD3EB], NFD: [0x1111, 0x1168, 0x11C2], NFKC: [0xD3EB], NFKD: [0x1111, 0x1168, 0x11C2] }, +{ source: [0xD3EC], NFC: [0xD3EC], NFD: [0x1111, 0x1169], NFKC: [0xD3EC], NFKD: [0x1111, 0x1169] }, +{ source: [0xD3ED], NFC: [0xD3ED], NFD: [0x1111, 0x1169, 0x11A8], NFKC: [0xD3ED], NFKD: [0x1111, 0x1169, 0x11A8] }, +{ source: [0xD3EE], NFC: [0xD3EE], NFD: [0x1111, 0x1169, 0x11A9], NFKC: [0xD3EE], NFKD: [0x1111, 0x1169, 0x11A9] }, +{ source: [0xD3EF], NFC: [0xD3EF], NFD: [0x1111, 0x1169, 0x11AA], NFKC: [0xD3EF], NFKD: [0x1111, 0x1169, 0x11AA] }, +{ source: [0xD3F0], NFC: [0xD3F0], NFD: [0x1111, 0x1169, 0x11AB], NFKC: [0xD3F0], NFKD: [0x1111, 0x1169, 0x11AB] }, +{ source: [0xD3F1], NFC: [0xD3F1], NFD: [0x1111, 0x1169, 0x11AC], NFKC: [0xD3F1], NFKD: [0x1111, 0x1169, 0x11AC] }, +{ source: [0xD3F2], NFC: [0xD3F2], NFD: [0x1111, 0x1169, 0x11AD], NFKC: [0xD3F2], NFKD: [0x1111, 0x1169, 0x11AD] }, +{ source: [0xD3F3], NFC: [0xD3F3], NFD: [0x1111, 0x1169, 0x11AE], NFKC: [0xD3F3], NFKD: [0x1111, 0x1169, 0x11AE] }, +{ source: [0xD3F4], NFC: [0xD3F4], NFD: [0x1111, 0x1169, 0x11AF], NFKC: [0xD3F4], NFKD: [0x1111, 0x1169, 0x11AF] }, +{ source: [0xD3F5], NFC: [0xD3F5], NFD: [0x1111, 0x1169, 0x11B0], NFKC: [0xD3F5], NFKD: [0x1111, 0x1169, 0x11B0] }, +{ source: [0xD3F6], NFC: [0xD3F6], NFD: [0x1111, 0x1169, 0x11B1], NFKC: [0xD3F6], NFKD: [0x1111, 0x1169, 0x11B1] }, +{ source: [0xD3F7], NFC: [0xD3F7], NFD: [0x1111, 0x1169, 0x11B2], NFKC: [0xD3F7], NFKD: [0x1111, 0x1169, 0x11B2] }, +{ source: [0xD3F8], NFC: [0xD3F8], NFD: [0x1111, 0x1169, 0x11B3], NFKC: [0xD3F8], NFKD: [0x1111, 0x1169, 0x11B3] }, +{ source: [0xD3F9], NFC: [0xD3F9], NFD: [0x1111, 0x1169, 0x11B4], NFKC: [0xD3F9], NFKD: [0x1111, 0x1169, 0x11B4] }, +{ source: [0xD3FA], NFC: [0xD3FA], NFD: [0x1111, 0x1169, 0x11B5], NFKC: [0xD3FA], NFKD: [0x1111, 0x1169, 0x11B5] }, +{ source: [0xD3FB], NFC: [0xD3FB], NFD: [0x1111, 0x1169, 0x11B6], NFKC: [0xD3FB], NFKD: [0x1111, 0x1169, 0x11B6] }, +{ source: [0xD3FC], NFC: [0xD3FC], NFD: [0x1111, 0x1169, 0x11B7], NFKC: [0xD3FC], NFKD: [0x1111, 0x1169, 0x11B7] }, +{ source: [0xD3FD], NFC: [0xD3FD], NFD: [0x1111, 0x1169, 0x11B8], NFKC: [0xD3FD], NFKD: [0x1111, 0x1169, 0x11B8] }, +{ source: [0xD3FE], NFC: [0xD3FE], NFD: [0x1111, 0x1169, 0x11B9], NFKC: [0xD3FE], NFKD: [0x1111, 0x1169, 0x11B9] }, +{ source: [0xD3FF], NFC: [0xD3FF], NFD: [0x1111, 0x1169, 0x11BA], NFKC: [0xD3FF], NFKD: [0x1111, 0x1169, 0x11BA] }, +{ source: [0xD400], NFC: [0xD400], NFD: [0x1111, 0x1169, 0x11BB], NFKC: [0xD400], NFKD: [0x1111, 0x1169, 0x11BB] }, +{ source: [0xD401], NFC: [0xD401], NFD: [0x1111, 0x1169, 0x11BC], NFKC: [0xD401], NFKD: [0x1111, 0x1169, 0x11BC] }, +{ source: [0xD402], NFC: [0xD402], NFD: [0x1111, 0x1169, 0x11BD], NFKC: [0xD402], NFKD: [0x1111, 0x1169, 0x11BD] }, +{ source: [0xD403], NFC: [0xD403], NFD: [0x1111, 0x1169, 0x11BE], NFKC: [0xD403], NFKD: [0x1111, 0x1169, 0x11BE] }, +{ source: [0xD404], NFC: [0xD404], NFD: [0x1111, 0x1169, 0x11BF], NFKC: [0xD404], NFKD: [0x1111, 0x1169, 0x11BF] }, +{ source: [0xD405], NFC: [0xD405], NFD: [0x1111, 0x1169, 0x11C0], NFKC: [0xD405], NFKD: [0x1111, 0x1169, 0x11C0] }, +{ source: [0xD406], NFC: [0xD406], NFD: [0x1111, 0x1169, 0x11C1], NFKC: [0xD406], NFKD: [0x1111, 0x1169, 0x11C1] }, +{ source: [0xD407], NFC: [0xD407], NFD: [0x1111, 0x1169, 0x11C2], NFKC: [0xD407], NFKD: [0x1111, 0x1169, 0x11C2] }, +{ source: [0xD408], NFC: [0xD408], NFD: [0x1111, 0x116A], NFKC: [0xD408], NFKD: [0x1111, 0x116A] }, +{ source: [0xD409], NFC: [0xD409], NFD: [0x1111, 0x116A, 0x11A8], NFKC: [0xD409], NFKD: [0x1111, 0x116A, 0x11A8] }, +{ source: [0xD40A], NFC: [0xD40A], NFD: [0x1111, 0x116A, 0x11A9], NFKC: [0xD40A], NFKD: [0x1111, 0x116A, 0x11A9] }, +{ source: [0xD40B], NFC: [0xD40B], NFD: [0x1111, 0x116A, 0x11AA], NFKC: [0xD40B], NFKD: [0x1111, 0x116A, 0x11AA] }, +{ source: [0xD40C], NFC: [0xD40C], NFD: [0x1111, 0x116A, 0x11AB], NFKC: [0xD40C], NFKD: [0x1111, 0x116A, 0x11AB] }, +{ source: [0xD40D], NFC: [0xD40D], NFD: [0x1111, 0x116A, 0x11AC], NFKC: [0xD40D], NFKD: [0x1111, 0x116A, 0x11AC] }, +{ source: [0xD40E], NFC: [0xD40E], NFD: [0x1111, 0x116A, 0x11AD], NFKC: [0xD40E], NFKD: [0x1111, 0x116A, 0x11AD] }, +{ source: [0xD40F], NFC: [0xD40F], NFD: [0x1111, 0x116A, 0x11AE], NFKC: [0xD40F], NFKD: [0x1111, 0x116A, 0x11AE] }, +{ source: [0xD410], NFC: [0xD410], NFD: [0x1111, 0x116A, 0x11AF], NFKC: [0xD410], NFKD: [0x1111, 0x116A, 0x11AF] }, +{ source: [0xD411], NFC: [0xD411], NFD: [0x1111, 0x116A, 0x11B0], NFKC: [0xD411], NFKD: [0x1111, 0x116A, 0x11B0] }, +{ source: [0xD412], NFC: [0xD412], NFD: [0x1111, 0x116A, 0x11B1], NFKC: [0xD412], NFKD: [0x1111, 0x116A, 0x11B1] }, +{ source: [0xD413], NFC: [0xD413], NFD: [0x1111, 0x116A, 0x11B2], NFKC: [0xD413], NFKD: [0x1111, 0x116A, 0x11B2] }, +{ source: [0xD414], NFC: [0xD414], NFD: [0x1111, 0x116A, 0x11B3], NFKC: [0xD414], NFKD: [0x1111, 0x116A, 0x11B3] }, +{ source: [0xD415], NFC: [0xD415], NFD: [0x1111, 0x116A, 0x11B4], NFKC: [0xD415], NFKD: [0x1111, 0x116A, 0x11B4] }, +{ source: [0xD416], NFC: [0xD416], NFD: [0x1111, 0x116A, 0x11B5], NFKC: [0xD416], NFKD: [0x1111, 0x116A, 0x11B5] }, +{ source: [0xD417], NFC: [0xD417], NFD: [0x1111, 0x116A, 0x11B6], NFKC: [0xD417], NFKD: [0x1111, 0x116A, 0x11B6] }, +{ source: [0xD418], NFC: [0xD418], NFD: [0x1111, 0x116A, 0x11B7], NFKC: [0xD418], NFKD: [0x1111, 0x116A, 0x11B7] }, +{ source: [0xD419], NFC: [0xD419], NFD: [0x1111, 0x116A, 0x11B8], NFKC: [0xD419], NFKD: [0x1111, 0x116A, 0x11B8] }, +{ source: [0xD41A], NFC: [0xD41A], NFD: [0x1111, 0x116A, 0x11B9], NFKC: [0xD41A], NFKD: [0x1111, 0x116A, 0x11B9] }, +{ source: [0xD41B], NFC: [0xD41B], NFD: [0x1111, 0x116A, 0x11BA], NFKC: [0xD41B], NFKD: [0x1111, 0x116A, 0x11BA] }, +{ source: [0xD41C], NFC: [0xD41C], NFD: [0x1111, 0x116A, 0x11BB], NFKC: [0xD41C], NFKD: [0x1111, 0x116A, 0x11BB] }, +{ source: [0xD41D], NFC: [0xD41D], NFD: [0x1111, 0x116A, 0x11BC], NFKC: [0xD41D], NFKD: [0x1111, 0x116A, 0x11BC] }, +{ source: [0xD41E], NFC: [0xD41E], NFD: [0x1111, 0x116A, 0x11BD], NFKC: [0xD41E], NFKD: [0x1111, 0x116A, 0x11BD] }, +{ source: [0xD41F], NFC: [0xD41F], NFD: [0x1111, 0x116A, 0x11BE], NFKC: [0xD41F], NFKD: [0x1111, 0x116A, 0x11BE] }, +{ source: [0xD420], NFC: [0xD420], NFD: [0x1111, 0x116A, 0x11BF], NFKC: [0xD420], NFKD: [0x1111, 0x116A, 0x11BF] }, +{ source: [0xD421], NFC: [0xD421], NFD: [0x1111, 0x116A, 0x11C0], NFKC: [0xD421], NFKD: [0x1111, 0x116A, 0x11C0] }, +{ source: [0xD422], NFC: [0xD422], NFD: [0x1111, 0x116A, 0x11C1], NFKC: [0xD422], NFKD: [0x1111, 0x116A, 0x11C1] }, +{ source: [0xD423], NFC: [0xD423], NFD: [0x1111, 0x116A, 0x11C2], NFKC: [0xD423], NFKD: [0x1111, 0x116A, 0x11C2] }, +{ source: [0xD424], NFC: [0xD424], NFD: [0x1111, 0x116B], NFKC: [0xD424], NFKD: [0x1111, 0x116B] }, +{ source: [0xD425], NFC: [0xD425], NFD: [0x1111, 0x116B, 0x11A8], NFKC: [0xD425], NFKD: [0x1111, 0x116B, 0x11A8] }, +{ source: [0xD426], NFC: [0xD426], NFD: [0x1111, 0x116B, 0x11A9], NFKC: [0xD426], NFKD: [0x1111, 0x116B, 0x11A9] }, +{ source: [0xD427], NFC: [0xD427], NFD: [0x1111, 0x116B, 0x11AA], NFKC: [0xD427], NFKD: [0x1111, 0x116B, 0x11AA] }, +{ source: [0xD428], NFC: [0xD428], NFD: [0x1111, 0x116B, 0x11AB], NFKC: [0xD428], NFKD: [0x1111, 0x116B, 0x11AB] }, +{ source: [0xD429], NFC: [0xD429], NFD: [0x1111, 0x116B, 0x11AC], NFKC: [0xD429], NFKD: [0x1111, 0x116B, 0x11AC] }, +{ source: [0xD42A], NFC: [0xD42A], NFD: [0x1111, 0x116B, 0x11AD], NFKC: [0xD42A], NFKD: [0x1111, 0x116B, 0x11AD] }, +{ source: [0xD42B], NFC: [0xD42B], NFD: [0x1111, 0x116B, 0x11AE], NFKC: [0xD42B], NFKD: [0x1111, 0x116B, 0x11AE] }, +{ source: [0xD42C], NFC: [0xD42C], NFD: [0x1111, 0x116B, 0x11AF], NFKC: [0xD42C], NFKD: [0x1111, 0x116B, 0x11AF] }, +{ source: [0xD42D], NFC: [0xD42D], NFD: [0x1111, 0x116B, 0x11B0], NFKC: [0xD42D], NFKD: [0x1111, 0x116B, 0x11B0] }, +{ source: [0xD42E], NFC: [0xD42E], NFD: [0x1111, 0x116B, 0x11B1], NFKC: [0xD42E], NFKD: [0x1111, 0x116B, 0x11B1] }, +{ source: [0xD42F], NFC: [0xD42F], NFD: [0x1111, 0x116B, 0x11B2], NFKC: [0xD42F], NFKD: [0x1111, 0x116B, 0x11B2] }, +{ source: [0xD430], NFC: [0xD430], NFD: [0x1111, 0x116B, 0x11B3], NFKC: [0xD430], NFKD: [0x1111, 0x116B, 0x11B3] }, +{ source: [0xD431], NFC: [0xD431], NFD: [0x1111, 0x116B, 0x11B4], NFKC: [0xD431], NFKD: [0x1111, 0x116B, 0x11B4] }, +{ source: [0xD432], NFC: [0xD432], NFD: [0x1111, 0x116B, 0x11B5], NFKC: [0xD432], NFKD: [0x1111, 0x116B, 0x11B5] }, +{ source: [0xD433], NFC: [0xD433], NFD: [0x1111, 0x116B, 0x11B6], NFKC: [0xD433], NFKD: [0x1111, 0x116B, 0x11B6] }, +{ source: [0xD434], NFC: [0xD434], NFD: [0x1111, 0x116B, 0x11B7], NFKC: [0xD434], NFKD: [0x1111, 0x116B, 0x11B7] }, +{ source: [0xD435], NFC: [0xD435], NFD: [0x1111, 0x116B, 0x11B8], NFKC: [0xD435], NFKD: [0x1111, 0x116B, 0x11B8] }, +{ source: [0xD436], NFC: [0xD436], NFD: [0x1111, 0x116B, 0x11B9], NFKC: [0xD436], NFKD: [0x1111, 0x116B, 0x11B9] }, +{ source: [0xD437], NFC: [0xD437], NFD: [0x1111, 0x116B, 0x11BA], NFKC: [0xD437], NFKD: [0x1111, 0x116B, 0x11BA] }, +{ source: [0xD438], NFC: [0xD438], NFD: [0x1111, 0x116B, 0x11BB], NFKC: [0xD438], NFKD: [0x1111, 0x116B, 0x11BB] }, +{ source: [0xD439], NFC: [0xD439], NFD: [0x1111, 0x116B, 0x11BC], NFKC: [0xD439], NFKD: [0x1111, 0x116B, 0x11BC] }, +{ source: [0xD43A], NFC: [0xD43A], NFD: [0x1111, 0x116B, 0x11BD], NFKC: [0xD43A], NFKD: [0x1111, 0x116B, 0x11BD] }, +{ source: [0xD43B], NFC: [0xD43B], NFD: [0x1111, 0x116B, 0x11BE], NFKC: [0xD43B], NFKD: [0x1111, 0x116B, 0x11BE] }, +{ source: [0xD43C], NFC: [0xD43C], NFD: [0x1111, 0x116B, 0x11BF], NFKC: [0xD43C], NFKD: [0x1111, 0x116B, 0x11BF] }, +{ source: [0xD43D], NFC: [0xD43D], NFD: [0x1111, 0x116B, 0x11C0], NFKC: [0xD43D], NFKD: [0x1111, 0x116B, 0x11C0] }, +{ source: [0xD43E], NFC: [0xD43E], NFD: [0x1111, 0x116B, 0x11C1], NFKC: [0xD43E], NFKD: [0x1111, 0x116B, 0x11C1] }, +{ source: [0xD43F], NFC: [0xD43F], NFD: [0x1111, 0x116B, 0x11C2], NFKC: [0xD43F], NFKD: [0x1111, 0x116B, 0x11C2] }, +{ source: [0xD440], NFC: [0xD440], NFD: [0x1111, 0x116C], NFKC: [0xD440], NFKD: [0x1111, 0x116C] }, +{ source: [0xD441], NFC: [0xD441], NFD: [0x1111, 0x116C, 0x11A8], NFKC: [0xD441], NFKD: [0x1111, 0x116C, 0x11A8] }, +{ source: [0xD442], NFC: [0xD442], NFD: [0x1111, 0x116C, 0x11A9], NFKC: [0xD442], NFKD: [0x1111, 0x116C, 0x11A9] }, +{ source: [0xD443], NFC: [0xD443], NFD: [0x1111, 0x116C, 0x11AA], NFKC: [0xD443], NFKD: [0x1111, 0x116C, 0x11AA] }, +{ source: [0xD444], NFC: [0xD444], NFD: [0x1111, 0x116C, 0x11AB], NFKC: [0xD444], NFKD: [0x1111, 0x116C, 0x11AB] }, +{ source: [0xD445], NFC: [0xD445], NFD: [0x1111, 0x116C, 0x11AC], NFKC: [0xD445], NFKD: [0x1111, 0x116C, 0x11AC] }, +{ source: [0xD446], NFC: [0xD446], NFD: [0x1111, 0x116C, 0x11AD], NFKC: [0xD446], NFKD: [0x1111, 0x116C, 0x11AD] }, +{ source: [0xD447], NFC: [0xD447], NFD: [0x1111, 0x116C, 0x11AE], NFKC: [0xD447], NFKD: [0x1111, 0x116C, 0x11AE] }, +{ source: [0xD448], NFC: [0xD448], NFD: [0x1111, 0x116C, 0x11AF], NFKC: [0xD448], NFKD: [0x1111, 0x116C, 0x11AF] }, +{ source: [0xD449], NFC: [0xD449], NFD: [0x1111, 0x116C, 0x11B0], NFKC: [0xD449], NFKD: [0x1111, 0x116C, 0x11B0] }, +{ source: [0xD44A], NFC: [0xD44A], NFD: [0x1111, 0x116C, 0x11B1], NFKC: [0xD44A], NFKD: [0x1111, 0x116C, 0x11B1] }, +{ source: [0xD44B], NFC: [0xD44B], NFD: [0x1111, 0x116C, 0x11B2], NFKC: [0xD44B], NFKD: [0x1111, 0x116C, 0x11B2] }, +{ source: [0xD44C], NFC: [0xD44C], NFD: [0x1111, 0x116C, 0x11B3], NFKC: [0xD44C], NFKD: [0x1111, 0x116C, 0x11B3] }, +{ source: [0xD44D], NFC: [0xD44D], NFD: [0x1111, 0x116C, 0x11B4], NFKC: [0xD44D], NFKD: [0x1111, 0x116C, 0x11B4] }, +{ source: [0xD44E], NFC: [0xD44E], NFD: [0x1111, 0x116C, 0x11B5], NFKC: [0xD44E], NFKD: [0x1111, 0x116C, 0x11B5] }, +{ source: [0xD44F], NFC: [0xD44F], NFD: [0x1111, 0x116C, 0x11B6], NFKC: [0xD44F], NFKD: [0x1111, 0x116C, 0x11B6] }, +{ source: [0xD450], NFC: [0xD450], NFD: [0x1111, 0x116C, 0x11B7], NFKC: [0xD450], NFKD: [0x1111, 0x116C, 0x11B7] }, +{ source: [0xD451], NFC: [0xD451], NFD: [0x1111, 0x116C, 0x11B8], NFKC: [0xD451], NFKD: [0x1111, 0x116C, 0x11B8] }, +{ source: [0xD452], NFC: [0xD452], NFD: [0x1111, 0x116C, 0x11B9], NFKC: [0xD452], NFKD: [0x1111, 0x116C, 0x11B9] }, +{ source: [0xD453], NFC: [0xD453], NFD: [0x1111, 0x116C, 0x11BA], NFKC: [0xD453], NFKD: [0x1111, 0x116C, 0x11BA] }, +{ source: [0xD454], NFC: [0xD454], NFD: [0x1111, 0x116C, 0x11BB], NFKC: [0xD454], NFKD: [0x1111, 0x116C, 0x11BB] }, +{ source: [0xD455], NFC: [0xD455], NFD: [0x1111, 0x116C, 0x11BC], NFKC: [0xD455], NFKD: [0x1111, 0x116C, 0x11BC] }, +{ source: [0xD456], NFC: [0xD456], NFD: [0x1111, 0x116C, 0x11BD], NFKC: [0xD456], NFKD: [0x1111, 0x116C, 0x11BD] }, +{ source: [0xD457], NFC: [0xD457], NFD: [0x1111, 0x116C, 0x11BE], NFKC: [0xD457], NFKD: [0x1111, 0x116C, 0x11BE] }, +{ source: [0xD458], NFC: [0xD458], NFD: [0x1111, 0x116C, 0x11BF], NFKC: [0xD458], NFKD: [0x1111, 0x116C, 0x11BF] }, +{ source: [0xD459], NFC: [0xD459], NFD: [0x1111, 0x116C, 0x11C0], NFKC: [0xD459], NFKD: [0x1111, 0x116C, 0x11C0] }, +{ source: [0xD45A], NFC: [0xD45A], NFD: [0x1111, 0x116C, 0x11C1], NFKC: [0xD45A], NFKD: [0x1111, 0x116C, 0x11C1] }, +{ source: [0xD45B], NFC: [0xD45B], NFD: [0x1111, 0x116C, 0x11C2], NFKC: [0xD45B], NFKD: [0x1111, 0x116C, 0x11C2] }, +{ source: [0xD45C], NFC: [0xD45C], NFD: [0x1111, 0x116D], NFKC: [0xD45C], NFKD: [0x1111, 0x116D] }, +{ source: [0xD45D], NFC: [0xD45D], NFD: [0x1111, 0x116D, 0x11A8], NFKC: [0xD45D], NFKD: [0x1111, 0x116D, 0x11A8] }, +{ source: [0xD45E], NFC: [0xD45E], NFD: [0x1111, 0x116D, 0x11A9], NFKC: [0xD45E], NFKD: [0x1111, 0x116D, 0x11A9] }, +{ source: [0xD45F], NFC: [0xD45F], NFD: [0x1111, 0x116D, 0x11AA], NFKC: [0xD45F], NFKD: [0x1111, 0x116D, 0x11AA] }, +{ source: [0xD460], NFC: [0xD460], NFD: [0x1111, 0x116D, 0x11AB], NFKC: [0xD460], NFKD: [0x1111, 0x116D, 0x11AB] }, +{ source: [0xD461], NFC: [0xD461], NFD: [0x1111, 0x116D, 0x11AC], NFKC: [0xD461], NFKD: [0x1111, 0x116D, 0x11AC] }, +{ source: [0xD462], NFC: [0xD462], NFD: [0x1111, 0x116D, 0x11AD], NFKC: [0xD462], NFKD: [0x1111, 0x116D, 0x11AD] }, +{ source: [0xD463], NFC: [0xD463], NFD: [0x1111, 0x116D, 0x11AE], NFKC: [0xD463], NFKD: [0x1111, 0x116D, 0x11AE] }, +{ source: [0xD464], NFC: [0xD464], NFD: [0x1111, 0x116D, 0x11AF], NFKC: [0xD464], NFKD: [0x1111, 0x116D, 0x11AF] }, +{ source: [0xD465], NFC: [0xD465], NFD: [0x1111, 0x116D, 0x11B0], NFKC: [0xD465], NFKD: [0x1111, 0x116D, 0x11B0] }, +{ source: [0xD466], NFC: [0xD466], NFD: [0x1111, 0x116D, 0x11B1], NFKC: [0xD466], NFKD: [0x1111, 0x116D, 0x11B1] }, +{ source: [0xD467], NFC: [0xD467], NFD: [0x1111, 0x116D, 0x11B2], NFKC: [0xD467], NFKD: [0x1111, 0x116D, 0x11B2] }, +{ source: [0xD468], NFC: [0xD468], NFD: [0x1111, 0x116D, 0x11B3], NFKC: [0xD468], NFKD: [0x1111, 0x116D, 0x11B3] }, +{ source: [0xD469], NFC: [0xD469], NFD: [0x1111, 0x116D, 0x11B4], NFKC: [0xD469], NFKD: [0x1111, 0x116D, 0x11B4] }, +{ source: [0xD46A], NFC: [0xD46A], NFD: [0x1111, 0x116D, 0x11B5], NFKC: [0xD46A], NFKD: [0x1111, 0x116D, 0x11B5] }, +{ source: [0xD46B], NFC: [0xD46B], NFD: [0x1111, 0x116D, 0x11B6], NFKC: [0xD46B], NFKD: [0x1111, 0x116D, 0x11B6] }, +{ source: [0xD46C], NFC: [0xD46C], NFD: [0x1111, 0x116D, 0x11B7], NFKC: [0xD46C], NFKD: [0x1111, 0x116D, 0x11B7] }, +{ source: [0xD46D], NFC: [0xD46D], NFD: [0x1111, 0x116D, 0x11B8], NFKC: [0xD46D], NFKD: [0x1111, 0x116D, 0x11B8] }, +{ source: [0xD46E], NFC: [0xD46E], NFD: [0x1111, 0x116D, 0x11B9], NFKC: [0xD46E], NFKD: [0x1111, 0x116D, 0x11B9] }, +{ source: [0xD46F], NFC: [0xD46F], NFD: [0x1111, 0x116D, 0x11BA], NFKC: [0xD46F], NFKD: [0x1111, 0x116D, 0x11BA] }, +{ source: [0xD470], NFC: [0xD470], NFD: [0x1111, 0x116D, 0x11BB], NFKC: [0xD470], NFKD: [0x1111, 0x116D, 0x11BB] }, +{ source: [0xD471], NFC: [0xD471], NFD: [0x1111, 0x116D, 0x11BC], NFKC: [0xD471], NFKD: [0x1111, 0x116D, 0x11BC] }, +{ source: [0xD472], NFC: [0xD472], NFD: [0x1111, 0x116D, 0x11BD], NFKC: [0xD472], NFKD: [0x1111, 0x116D, 0x11BD] }, +{ source: [0xD473], NFC: [0xD473], NFD: [0x1111, 0x116D, 0x11BE], NFKC: [0xD473], NFKD: [0x1111, 0x116D, 0x11BE] }, +{ source: [0xD474], NFC: [0xD474], NFD: [0x1111, 0x116D, 0x11BF], NFKC: [0xD474], NFKD: [0x1111, 0x116D, 0x11BF] }, +{ source: [0xD475], NFC: [0xD475], NFD: [0x1111, 0x116D, 0x11C0], NFKC: [0xD475], NFKD: [0x1111, 0x116D, 0x11C0] }, +{ source: [0xD476], NFC: [0xD476], NFD: [0x1111, 0x116D, 0x11C1], NFKC: [0xD476], NFKD: [0x1111, 0x116D, 0x11C1] }, +{ source: [0xD477], NFC: [0xD477], NFD: [0x1111, 0x116D, 0x11C2], NFKC: [0xD477], NFKD: [0x1111, 0x116D, 0x11C2] }, +{ source: [0xD478], NFC: [0xD478], NFD: [0x1111, 0x116E], NFKC: [0xD478], NFKD: [0x1111, 0x116E] }, +{ source: [0xD479], NFC: [0xD479], NFD: [0x1111, 0x116E, 0x11A8], NFKC: [0xD479], NFKD: [0x1111, 0x116E, 0x11A8] }, +{ source: [0xD47A], NFC: [0xD47A], NFD: [0x1111, 0x116E, 0x11A9], NFKC: [0xD47A], NFKD: [0x1111, 0x116E, 0x11A9] }, +{ source: [0xD47B], NFC: [0xD47B], NFD: [0x1111, 0x116E, 0x11AA], NFKC: [0xD47B], NFKD: [0x1111, 0x116E, 0x11AA] }, +{ source: [0xD47C], NFC: [0xD47C], NFD: [0x1111, 0x116E, 0x11AB], NFKC: [0xD47C], NFKD: [0x1111, 0x116E, 0x11AB] }, +{ source: [0xD47D], NFC: [0xD47D], NFD: [0x1111, 0x116E, 0x11AC], NFKC: [0xD47D], NFKD: [0x1111, 0x116E, 0x11AC] }, +{ source: [0xD47E], NFC: [0xD47E], NFD: [0x1111, 0x116E, 0x11AD], NFKC: [0xD47E], NFKD: [0x1111, 0x116E, 0x11AD] }, +{ source: [0xD47F], NFC: [0xD47F], NFD: [0x1111, 0x116E, 0x11AE], NFKC: [0xD47F], NFKD: [0x1111, 0x116E, 0x11AE] }, +{ source: [0xD480], NFC: [0xD480], NFD: [0x1111, 0x116E, 0x11AF], NFKC: [0xD480], NFKD: [0x1111, 0x116E, 0x11AF] }, +{ source: [0xD481], NFC: [0xD481], NFD: [0x1111, 0x116E, 0x11B0], NFKC: [0xD481], NFKD: [0x1111, 0x116E, 0x11B0] }, +{ source: [0xD482], NFC: [0xD482], NFD: [0x1111, 0x116E, 0x11B1], NFKC: [0xD482], NFKD: [0x1111, 0x116E, 0x11B1] }, +{ source: [0xD483], NFC: [0xD483], NFD: [0x1111, 0x116E, 0x11B2], NFKC: [0xD483], NFKD: [0x1111, 0x116E, 0x11B2] }, +{ source: [0xD484], NFC: [0xD484], NFD: [0x1111, 0x116E, 0x11B3], NFKC: [0xD484], NFKD: [0x1111, 0x116E, 0x11B3] }, +{ source: [0xD485], NFC: [0xD485], NFD: [0x1111, 0x116E, 0x11B4], NFKC: [0xD485], NFKD: [0x1111, 0x116E, 0x11B4] }, +{ source: [0xD486], NFC: [0xD486], NFD: [0x1111, 0x116E, 0x11B5], NFKC: [0xD486], NFKD: [0x1111, 0x116E, 0x11B5] }, +{ source: [0xD487], NFC: [0xD487], NFD: [0x1111, 0x116E, 0x11B6], NFKC: [0xD487], NFKD: [0x1111, 0x116E, 0x11B6] }, +{ source: [0xD488], NFC: [0xD488], NFD: [0x1111, 0x116E, 0x11B7], NFKC: [0xD488], NFKD: [0x1111, 0x116E, 0x11B7] }, +{ source: [0xD489], NFC: [0xD489], NFD: [0x1111, 0x116E, 0x11B8], NFKC: [0xD489], NFKD: [0x1111, 0x116E, 0x11B8] }, +{ source: [0xD48A], NFC: [0xD48A], NFD: [0x1111, 0x116E, 0x11B9], NFKC: [0xD48A], NFKD: [0x1111, 0x116E, 0x11B9] }, +{ source: [0xD48B], NFC: [0xD48B], NFD: [0x1111, 0x116E, 0x11BA], NFKC: [0xD48B], NFKD: [0x1111, 0x116E, 0x11BA] }, +{ source: [0xD48C], NFC: [0xD48C], NFD: [0x1111, 0x116E, 0x11BB], NFKC: [0xD48C], NFKD: [0x1111, 0x116E, 0x11BB] }, +{ source: [0xD48D], NFC: [0xD48D], NFD: [0x1111, 0x116E, 0x11BC], NFKC: [0xD48D], NFKD: [0x1111, 0x116E, 0x11BC] }, +{ source: [0xD48E], NFC: [0xD48E], NFD: [0x1111, 0x116E, 0x11BD], NFKC: [0xD48E], NFKD: [0x1111, 0x116E, 0x11BD] }, +{ source: [0xD48F], NFC: [0xD48F], NFD: [0x1111, 0x116E, 0x11BE], NFKC: [0xD48F], NFKD: [0x1111, 0x116E, 0x11BE] }, +{ source: [0xD490], NFC: [0xD490], NFD: [0x1111, 0x116E, 0x11BF], NFKC: [0xD490], NFKD: [0x1111, 0x116E, 0x11BF] }, +{ source: [0xD491], NFC: [0xD491], NFD: [0x1111, 0x116E, 0x11C0], NFKC: [0xD491], NFKD: [0x1111, 0x116E, 0x11C0] }, +{ source: [0xD492], NFC: [0xD492], NFD: [0x1111, 0x116E, 0x11C1], NFKC: [0xD492], NFKD: [0x1111, 0x116E, 0x11C1] }, +{ source: [0xD493], NFC: [0xD493], NFD: [0x1111, 0x116E, 0x11C2], NFKC: [0xD493], NFKD: [0x1111, 0x116E, 0x11C2] }, +{ source: [0xD494], NFC: [0xD494], NFD: [0x1111, 0x116F], NFKC: [0xD494], NFKD: [0x1111, 0x116F] }, +{ source: [0xD495], NFC: [0xD495], NFD: [0x1111, 0x116F, 0x11A8], NFKC: [0xD495], NFKD: [0x1111, 0x116F, 0x11A8] }, +{ source: [0xD496], NFC: [0xD496], NFD: [0x1111, 0x116F, 0x11A9], NFKC: [0xD496], NFKD: [0x1111, 0x116F, 0x11A9] }, +{ source: [0xD497], NFC: [0xD497], NFD: [0x1111, 0x116F, 0x11AA], NFKC: [0xD497], NFKD: [0x1111, 0x116F, 0x11AA] }, +{ source: [0xD498], NFC: [0xD498], NFD: [0x1111, 0x116F, 0x11AB], NFKC: [0xD498], NFKD: [0x1111, 0x116F, 0x11AB] }, +{ source: [0xD499], NFC: [0xD499], NFD: [0x1111, 0x116F, 0x11AC], NFKC: [0xD499], NFKD: [0x1111, 0x116F, 0x11AC] }, +{ source: [0xD49A], NFC: [0xD49A], NFD: [0x1111, 0x116F, 0x11AD], NFKC: [0xD49A], NFKD: [0x1111, 0x116F, 0x11AD] }, +{ source: [0xD49B], NFC: [0xD49B], NFD: [0x1111, 0x116F, 0x11AE], NFKC: [0xD49B], NFKD: [0x1111, 0x116F, 0x11AE] }, +{ source: [0xD49C], NFC: [0xD49C], NFD: [0x1111, 0x116F, 0x11AF], NFKC: [0xD49C], NFKD: [0x1111, 0x116F, 0x11AF] }, +{ source: [0xD49D], NFC: [0xD49D], NFD: [0x1111, 0x116F, 0x11B0], NFKC: [0xD49D], NFKD: [0x1111, 0x116F, 0x11B0] }, +{ source: [0xD49E], NFC: [0xD49E], NFD: [0x1111, 0x116F, 0x11B1], NFKC: [0xD49E], NFKD: [0x1111, 0x116F, 0x11B1] }, +{ source: [0xD49F], NFC: [0xD49F], NFD: [0x1111, 0x116F, 0x11B2], NFKC: [0xD49F], NFKD: [0x1111, 0x116F, 0x11B2] }, +{ source: [0xD4A0], NFC: [0xD4A0], NFD: [0x1111, 0x116F, 0x11B3], NFKC: [0xD4A0], NFKD: [0x1111, 0x116F, 0x11B3] }, +{ source: [0xD4A1], NFC: [0xD4A1], NFD: [0x1111, 0x116F, 0x11B4], NFKC: [0xD4A1], NFKD: [0x1111, 0x116F, 0x11B4] }, +{ source: [0xD4A2], NFC: [0xD4A2], NFD: [0x1111, 0x116F, 0x11B5], NFKC: [0xD4A2], NFKD: [0x1111, 0x116F, 0x11B5] }, +{ source: [0xD4A3], NFC: [0xD4A3], NFD: [0x1111, 0x116F, 0x11B6], NFKC: [0xD4A3], NFKD: [0x1111, 0x116F, 0x11B6] }, +{ source: [0xD4A4], NFC: [0xD4A4], NFD: [0x1111, 0x116F, 0x11B7], NFKC: [0xD4A4], NFKD: [0x1111, 0x116F, 0x11B7] }, +{ source: [0xD4A5], NFC: [0xD4A5], NFD: [0x1111, 0x116F, 0x11B8], NFKC: [0xD4A5], NFKD: [0x1111, 0x116F, 0x11B8] }, +{ source: [0xD4A6], NFC: [0xD4A6], NFD: [0x1111, 0x116F, 0x11B9], NFKC: [0xD4A6], NFKD: [0x1111, 0x116F, 0x11B9] }, +{ source: [0xD4A7], NFC: [0xD4A7], NFD: [0x1111, 0x116F, 0x11BA], NFKC: [0xD4A7], NFKD: [0x1111, 0x116F, 0x11BA] }, +{ source: [0xD4A8], NFC: [0xD4A8], NFD: [0x1111, 0x116F, 0x11BB], NFKC: [0xD4A8], NFKD: [0x1111, 0x116F, 0x11BB] }, +{ source: [0xD4A9], NFC: [0xD4A9], NFD: [0x1111, 0x116F, 0x11BC], NFKC: [0xD4A9], NFKD: [0x1111, 0x116F, 0x11BC] }, +{ source: [0xD4AA], NFC: [0xD4AA], NFD: [0x1111, 0x116F, 0x11BD], NFKC: [0xD4AA], NFKD: [0x1111, 0x116F, 0x11BD] }, +{ source: [0xD4AB], NFC: [0xD4AB], NFD: [0x1111, 0x116F, 0x11BE], NFKC: [0xD4AB], NFKD: [0x1111, 0x116F, 0x11BE] }, +{ source: [0xD4AC], NFC: [0xD4AC], NFD: [0x1111, 0x116F, 0x11BF], NFKC: [0xD4AC], NFKD: [0x1111, 0x116F, 0x11BF] }, +{ source: [0xD4AD], NFC: [0xD4AD], NFD: [0x1111, 0x116F, 0x11C0], NFKC: [0xD4AD], NFKD: [0x1111, 0x116F, 0x11C0] }, +{ source: [0xD4AE], NFC: [0xD4AE], NFD: [0x1111, 0x116F, 0x11C1], NFKC: [0xD4AE], NFKD: [0x1111, 0x116F, 0x11C1] }, +{ source: [0xD4AF], NFC: [0xD4AF], NFD: [0x1111, 0x116F, 0x11C2], NFKC: [0xD4AF], NFKD: [0x1111, 0x116F, 0x11C2] }, +{ source: [0xD4B0], NFC: [0xD4B0], NFD: [0x1111, 0x1170], NFKC: [0xD4B0], NFKD: [0x1111, 0x1170] }, +{ source: [0xD4B1], NFC: [0xD4B1], NFD: [0x1111, 0x1170, 0x11A8], NFKC: [0xD4B1], NFKD: [0x1111, 0x1170, 0x11A8] }, +{ source: [0xD4B2], NFC: [0xD4B2], NFD: [0x1111, 0x1170, 0x11A9], NFKC: [0xD4B2], NFKD: [0x1111, 0x1170, 0x11A9] }, +{ source: [0xD4B3], NFC: [0xD4B3], NFD: [0x1111, 0x1170, 0x11AA], NFKC: [0xD4B3], NFKD: [0x1111, 0x1170, 0x11AA] }, +{ source: [0xD4B4], NFC: [0xD4B4], NFD: [0x1111, 0x1170, 0x11AB], NFKC: [0xD4B4], NFKD: [0x1111, 0x1170, 0x11AB] }, +{ source: [0xD4B5], NFC: [0xD4B5], NFD: [0x1111, 0x1170, 0x11AC], NFKC: [0xD4B5], NFKD: [0x1111, 0x1170, 0x11AC] }, +{ source: [0xD4B6], NFC: [0xD4B6], NFD: [0x1111, 0x1170, 0x11AD], NFKC: [0xD4B6], NFKD: [0x1111, 0x1170, 0x11AD] }, +{ source: [0xD4B7], NFC: [0xD4B7], NFD: [0x1111, 0x1170, 0x11AE], NFKC: [0xD4B7], NFKD: [0x1111, 0x1170, 0x11AE] }, +{ source: [0xD4B8], NFC: [0xD4B8], NFD: [0x1111, 0x1170, 0x11AF], NFKC: [0xD4B8], NFKD: [0x1111, 0x1170, 0x11AF] }, +{ source: [0xD4B9], NFC: [0xD4B9], NFD: [0x1111, 0x1170, 0x11B0], NFKC: [0xD4B9], NFKD: [0x1111, 0x1170, 0x11B0] }, +{ source: [0xD4BA], NFC: [0xD4BA], NFD: [0x1111, 0x1170, 0x11B1], NFKC: [0xD4BA], NFKD: [0x1111, 0x1170, 0x11B1] }, +{ source: [0xD4BB], NFC: [0xD4BB], NFD: [0x1111, 0x1170, 0x11B2], NFKC: [0xD4BB], NFKD: [0x1111, 0x1170, 0x11B2] }, +{ source: [0xD4BC], NFC: [0xD4BC], NFD: [0x1111, 0x1170, 0x11B3], NFKC: [0xD4BC], NFKD: [0x1111, 0x1170, 0x11B3] }, +{ source: [0xD4BD], NFC: [0xD4BD], NFD: [0x1111, 0x1170, 0x11B4], NFKC: [0xD4BD], NFKD: [0x1111, 0x1170, 0x11B4] }, +{ source: [0xD4BE], NFC: [0xD4BE], NFD: [0x1111, 0x1170, 0x11B5], NFKC: [0xD4BE], NFKD: [0x1111, 0x1170, 0x11B5] }, +{ source: [0xD4BF], NFC: [0xD4BF], NFD: [0x1111, 0x1170, 0x11B6], NFKC: [0xD4BF], NFKD: [0x1111, 0x1170, 0x11B6] }, +{ source: [0xD4C0], NFC: [0xD4C0], NFD: [0x1111, 0x1170, 0x11B7], NFKC: [0xD4C0], NFKD: [0x1111, 0x1170, 0x11B7] }, +{ source: [0xD4C1], NFC: [0xD4C1], NFD: [0x1111, 0x1170, 0x11B8], NFKC: [0xD4C1], NFKD: [0x1111, 0x1170, 0x11B8] }, +{ source: [0xD4C2], NFC: [0xD4C2], NFD: [0x1111, 0x1170, 0x11B9], NFKC: [0xD4C2], NFKD: [0x1111, 0x1170, 0x11B9] }, +{ source: [0xD4C3], NFC: [0xD4C3], NFD: [0x1111, 0x1170, 0x11BA], NFKC: [0xD4C3], NFKD: [0x1111, 0x1170, 0x11BA] }, +{ source: [0xD4C4], NFC: [0xD4C4], NFD: [0x1111, 0x1170, 0x11BB], NFKC: [0xD4C4], NFKD: [0x1111, 0x1170, 0x11BB] }, +{ source: [0xD4C5], NFC: [0xD4C5], NFD: [0x1111, 0x1170, 0x11BC], NFKC: [0xD4C5], NFKD: [0x1111, 0x1170, 0x11BC] }, +{ source: [0xD4C6], NFC: [0xD4C6], NFD: [0x1111, 0x1170, 0x11BD], NFKC: [0xD4C6], NFKD: [0x1111, 0x1170, 0x11BD] }, +{ source: [0xD4C7], NFC: [0xD4C7], NFD: [0x1111, 0x1170, 0x11BE], NFKC: [0xD4C7], NFKD: [0x1111, 0x1170, 0x11BE] }, +{ source: [0xD4C8], NFC: [0xD4C8], NFD: [0x1111, 0x1170, 0x11BF], NFKC: [0xD4C8], NFKD: [0x1111, 0x1170, 0x11BF] }, +{ source: [0xD4C9], NFC: [0xD4C9], NFD: [0x1111, 0x1170, 0x11C0], NFKC: [0xD4C9], NFKD: [0x1111, 0x1170, 0x11C0] }, +{ source: [0xD4CA], NFC: [0xD4CA], NFD: [0x1111, 0x1170, 0x11C1], NFKC: [0xD4CA], NFKD: [0x1111, 0x1170, 0x11C1] }, +{ source: [0xD4CB], NFC: [0xD4CB], NFD: [0x1111, 0x1170, 0x11C2], NFKC: [0xD4CB], NFKD: [0x1111, 0x1170, 0x11C2] }, +{ source: [0xD4CC], NFC: [0xD4CC], NFD: [0x1111, 0x1171], NFKC: [0xD4CC], NFKD: [0x1111, 0x1171] }, +{ source: [0xD4CD], NFC: [0xD4CD], NFD: [0x1111, 0x1171, 0x11A8], NFKC: [0xD4CD], NFKD: [0x1111, 0x1171, 0x11A8] }, +{ source: [0xD4CE], NFC: [0xD4CE], NFD: [0x1111, 0x1171, 0x11A9], NFKC: [0xD4CE], NFKD: [0x1111, 0x1171, 0x11A9] }, +{ source: [0xD4CF], NFC: [0xD4CF], NFD: [0x1111, 0x1171, 0x11AA], NFKC: [0xD4CF], NFKD: [0x1111, 0x1171, 0x11AA] }, +{ source: [0xD4D0], NFC: [0xD4D0], NFD: [0x1111, 0x1171, 0x11AB], NFKC: [0xD4D0], NFKD: [0x1111, 0x1171, 0x11AB] }, +{ source: [0xD4D1], NFC: [0xD4D1], NFD: [0x1111, 0x1171, 0x11AC], NFKC: [0xD4D1], NFKD: [0x1111, 0x1171, 0x11AC] }, +{ source: [0xD4D2], NFC: [0xD4D2], NFD: [0x1111, 0x1171, 0x11AD], NFKC: [0xD4D2], NFKD: [0x1111, 0x1171, 0x11AD] }, +{ source: [0xD4D3], NFC: [0xD4D3], NFD: [0x1111, 0x1171, 0x11AE], NFKC: [0xD4D3], NFKD: [0x1111, 0x1171, 0x11AE] }, +{ source: [0xD4D4], NFC: [0xD4D4], NFD: [0x1111, 0x1171, 0x11AF], NFKC: [0xD4D4], NFKD: [0x1111, 0x1171, 0x11AF] }, +{ source: [0xD4D5], NFC: [0xD4D5], NFD: [0x1111, 0x1171, 0x11B0], NFKC: [0xD4D5], NFKD: [0x1111, 0x1171, 0x11B0] }, +{ source: [0xD4D6], NFC: [0xD4D6], NFD: [0x1111, 0x1171, 0x11B1], NFKC: [0xD4D6], NFKD: [0x1111, 0x1171, 0x11B1] }, +{ source: [0xD4D7], NFC: [0xD4D7], NFD: [0x1111, 0x1171, 0x11B2], NFKC: [0xD4D7], NFKD: [0x1111, 0x1171, 0x11B2] }, +{ source: [0xD4D8], NFC: [0xD4D8], NFD: [0x1111, 0x1171, 0x11B3], NFKC: [0xD4D8], NFKD: [0x1111, 0x1171, 0x11B3] }, +{ source: [0xD4D9], NFC: [0xD4D9], NFD: [0x1111, 0x1171, 0x11B4], NFKC: [0xD4D9], NFKD: [0x1111, 0x1171, 0x11B4] }, +{ source: [0xD4DA], NFC: [0xD4DA], NFD: [0x1111, 0x1171, 0x11B5], NFKC: [0xD4DA], NFKD: [0x1111, 0x1171, 0x11B5] }, +{ source: [0xD4DB], NFC: [0xD4DB], NFD: [0x1111, 0x1171, 0x11B6], NFKC: [0xD4DB], NFKD: [0x1111, 0x1171, 0x11B6] }, +{ source: [0xD4DC], NFC: [0xD4DC], NFD: [0x1111, 0x1171, 0x11B7], NFKC: [0xD4DC], NFKD: [0x1111, 0x1171, 0x11B7] }, +{ source: [0xD4DD], NFC: [0xD4DD], NFD: [0x1111, 0x1171, 0x11B8], NFKC: [0xD4DD], NFKD: [0x1111, 0x1171, 0x11B8] }, +{ source: [0xD4DE], NFC: [0xD4DE], NFD: [0x1111, 0x1171, 0x11B9], NFKC: [0xD4DE], NFKD: [0x1111, 0x1171, 0x11B9] }, +{ source: [0xD4DF], NFC: [0xD4DF], NFD: [0x1111, 0x1171, 0x11BA], NFKC: [0xD4DF], NFKD: [0x1111, 0x1171, 0x11BA] }, +{ source: [0xD4E0], NFC: [0xD4E0], NFD: [0x1111, 0x1171, 0x11BB], NFKC: [0xD4E0], NFKD: [0x1111, 0x1171, 0x11BB] }, +{ source: [0xD4E1], NFC: [0xD4E1], NFD: [0x1111, 0x1171, 0x11BC], NFKC: [0xD4E1], NFKD: [0x1111, 0x1171, 0x11BC] }, +{ source: [0xD4E2], NFC: [0xD4E2], NFD: [0x1111, 0x1171, 0x11BD], NFKC: [0xD4E2], NFKD: [0x1111, 0x1171, 0x11BD] }, +{ source: [0xD4E3], NFC: [0xD4E3], NFD: [0x1111, 0x1171, 0x11BE], NFKC: [0xD4E3], NFKD: [0x1111, 0x1171, 0x11BE] }, +{ source: [0xD4E4], NFC: [0xD4E4], NFD: [0x1111, 0x1171, 0x11BF], NFKC: [0xD4E4], NFKD: [0x1111, 0x1171, 0x11BF] }, +{ source: [0xD4E5], NFC: [0xD4E5], NFD: [0x1111, 0x1171, 0x11C0], NFKC: [0xD4E5], NFKD: [0x1111, 0x1171, 0x11C0] }, +{ source: [0xD4E6], NFC: [0xD4E6], NFD: [0x1111, 0x1171, 0x11C1], NFKC: [0xD4E6], NFKD: [0x1111, 0x1171, 0x11C1] }, +{ source: [0xD4E7], NFC: [0xD4E7], NFD: [0x1111, 0x1171, 0x11C2], NFKC: [0xD4E7], NFKD: [0x1111, 0x1171, 0x11C2] }, +{ source: [0xD4E8], NFC: [0xD4E8], NFD: [0x1111, 0x1172], NFKC: [0xD4E8], NFKD: [0x1111, 0x1172] }, +{ source: [0xD4E9], NFC: [0xD4E9], NFD: [0x1111, 0x1172, 0x11A8], NFKC: [0xD4E9], NFKD: [0x1111, 0x1172, 0x11A8] }, +{ source: [0xD4EA], NFC: [0xD4EA], NFD: [0x1111, 0x1172, 0x11A9], NFKC: [0xD4EA], NFKD: [0x1111, 0x1172, 0x11A9] }, +{ source: [0xD4EB], NFC: [0xD4EB], NFD: [0x1111, 0x1172, 0x11AA], NFKC: [0xD4EB], NFKD: [0x1111, 0x1172, 0x11AA] }, +{ source: [0xD4EC], NFC: [0xD4EC], NFD: [0x1111, 0x1172, 0x11AB], NFKC: [0xD4EC], NFKD: [0x1111, 0x1172, 0x11AB] }, +{ source: [0xD4ED], NFC: [0xD4ED], NFD: [0x1111, 0x1172, 0x11AC], NFKC: [0xD4ED], NFKD: [0x1111, 0x1172, 0x11AC] }, +{ source: [0xD4EE], NFC: [0xD4EE], NFD: [0x1111, 0x1172, 0x11AD], NFKC: [0xD4EE], NFKD: [0x1111, 0x1172, 0x11AD] }, +{ source: [0xD4EF], NFC: [0xD4EF], NFD: [0x1111, 0x1172, 0x11AE], NFKC: [0xD4EF], NFKD: [0x1111, 0x1172, 0x11AE] }, +{ source: [0xD4F0], NFC: [0xD4F0], NFD: [0x1111, 0x1172, 0x11AF], NFKC: [0xD4F0], NFKD: [0x1111, 0x1172, 0x11AF] }, +{ source: [0xD4F1], NFC: [0xD4F1], NFD: [0x1111, 0x1172, 0x11B0], NFKC: [0xD4F1], NFKD: [0x1111, 0x1172, 0x11B0] }, +{ source: [0xD4F2], NFC: [0xD4F2], NFD: [0x1111, 0x1172, 0x11B1], NFKC: [0xD4F2], NFKD: [0x1111, 0x1172, 0x11B1] }, +{ source: [0xD4F3], NFC: [0xD4F3], NFD: [0x1111, 0x1172, 0x11B2], NFKC: [0xD4F3], NFKD: [0x1111, 0x1172, 0x11B2] }, +{ source: [0xD4F4], NFC: [0xD4F4], NFD: [0x1111, 0x1172, 0x11B3], NFKC: [0xD4F4], NFKD: [0x1111, 0x1172, 0x11B3] }, +{ source: [0xD4F5], NFC: [0xD4F5], NFD: [0x1111, 0x1172, 0x11B4], NFKC: [0xD4F5], NFKD: [0x1111, 0x1172, 0x11B4] }, +{ source: [0xD4F6], NFC: [0xD4F6], NFD: [0x1111, 0x1172, 0x11B5], NFKC: [0xD4F6], NFKD: [0x1111, 0x1172, 0x11B5] }, +{ source: [0xD4F7], NFC: [0xD4F7], NFD: [0x1111, 0x1172, 0x11B6], NFKC: [0xD4F7], NFKD: [0x1111, 0x1172, 0x11B6] }, +{ source: [0xD4F8], NFC: [0xD4F8], NFD: [0x1111, 0x1172, 0x11B7], NFKC: [0xD4F8], NFKD: [0x1111, 0x1172, 0x11B7] }, +{ source: [0xD4F9], NFC: [0xD4F9], NFD: [0x1111, 0x1172, 0x11B8], NFKC: [0xD4F9], NFKD: [0x1111, 0x1172, 0x11B8] }, +{ source: [0xD4FA], NFC: [0xD4FA], NFD: [0x1111, 0x1172, 0x11B9], NFKC: [0xD4FA], NFKD: [0x1111, 0x1172, 0x11B9] }, +{ source: [0xD4FB], NFC: [0xD4FB], NFD: [0x1111, 0x1172, 0x11BA], NFKC: [0xD4FB], NFKD: [0x1111, 0x1172, 0x11BA] }, +{ source: [0xD4FC], NFC: [0xD4FC], NFD: [0x1111, 0x1172, 0x11BB], NFKC: [0xD4FC], NFKD: [0x1111, 0x1172, 0x11BB] }, +{ source: [0xD4FD], NFC: [0xD4FD], NFD: [0x1111, 0x1172, 0x11BC], NFKC: [0xD4FD], NFKD: [0x1111, 0x1172, 0x11BC] }, +{ source: [0xD4FE], NFC: [0xD4FE], NFD: [0x1111, 0x1172, 0x11BD], NFKC: [0xD4FE], NFKD: [0x1111, 0x1172, 0x11BD] }, +{ source: [0xD4FF], NFC: [0xD4FF], NFD: [0x1111, 0x1172, 0x11BE], NFKC: [0xD4FF], NFKD: [0x1111, 0x1172, 0x11BE] }, +{ source: [0xD500], NFC: [0xD500], NFD: [0x1111, 0x1172, 0x11BF], NFKC: [0xD500], NFKD: [0x1111, 0x1172, 0x11BF] }, +{ source: [0xD501], NFC: [0xD501], NFD: [0x1111, 0x1172, 0x11C0], NFKC: [0xD501], NFKD: [0x1111, 0x1172, 0x11C0] }, +{ source: [0xD502], NFC: [0xD502], NFD: [0x1111, 0x1172, 0x11C1], NFKC: [0xD502], NFKD: [0x1111, 0x1172, 0x11C1] }, +{ source: [0xD503], NFC: [0xD503], NFD: [0x1111, 0x1172, 0x11C2], NFKC: [0xD503], NFKD: [0x1111, 0x1172, 0x11C2] }, +{ source: [0xD504], NFC: [0xD504], NFD: [0x1111, 0x1173], NFKC: [0xD504], NFKD: [0x1111, 0x1173] }, +{ source: [0xD505], NFC: [0xD505], NFD: [0x1111, 0x1173, 0x11A8], NFKC: [0xD505], NFKD: [0x1111, 0x1173, 0x11A8] }, +{ source: [0xD506], NFC: [0xD506], NFD: [0x1111, 0x1173, 0x11A9], NFKC: [0xD506], NFKD: [0x1111, 0x1173, 0x11A9] }, +{ source: [0xD507], NFC: [0xD507], NFD: [0x1111, 0x1173, 0x11AA], NFKC: [0xD507], NFKD: [0x1111, 0x1173, 0x11AA] }, +{ source: [0xD508], NFC: [0xD508], NFD: [0x1111, 0x1173, 0x11AB], NFKC: [0xD508], NFKD: [0x1111, 0x1173, 0x11AB] }, +{ source: [0xD509], NFC: [0xD509], NFD: [0x1111, 0x1173, 0x11AC], NFKC: [0xD509], NFKD: [0x1111, 0x1173, 0x11AC] }, +{ source: [0xD50A], NFC: [0xD50A], NFD: [0x1111, 0x1173, 0x11AD], NFKC: [0xD50A], NFKD: [0x1111, 0x1173, 0x11AD] }, +{ source: [0xD50B], NFC: [0xD50B], NFD: [0x1111, 0x1173, 0x11AE], NFKC: [0xD50B], NFKD: [0x1111, 0x1173, 0x11AE] }, +{ source: [0xD50C], NFC: [0xD50C], NFD: [0x1111, 0x1173, 0x11AF], NFKC: [0xD50C], NFKD: [0x1111, 0x1173, 0x11AF] }, +{ source: [0xD50D], NFC: [0xD50D], NFD: [0x1111, 0x1173, 0x11B0], NFKC: [0xD50D], NFKD: [0x1111, 0x1173, 0x11B0] }, +{ source: [0xD50E], NFC: [0xD50E], NFD: [0x1111, 0x1173, 0x11B1], NFKC: [0xD50E], NFKD: [0x1111, 0x1173, 0x11B1] }, +{ source: [0xD50F], NFC: [0xD50F], NFD: [0x1111, 0x1173, 0x11B2], NFKC: [0xD50F], NFKD: [0x1111, 0x1173, 0x11B2] }, +{ source: [0xD510], NFC: [0xD510], NFD: [0x1111, 0x1173, 0x11B3], NFKC: [0xD510], NFKD: [0x1111, 0x1173, 0x11B3] }, +{ source: [0xD511], NFC: [0xD511], NFD: [0x1111, 0x1173, 0x11B4], NFKC: [0xD511], NFKD: [0x1111, 0x1173, 0x11B4] }, +{ source: [0xD512], NFC: [0xD512], NFD: [0x1111, 0x1173, 0x11B5], NFKC: [0xD512], NFKD: [0x1111, 0x1173, 0x11B5] }, +{ source: [0xD513], NFC: [0xD513], NFD: [0x1111, 0x1173, 0x11B6], NFKC: [0xD513], NFKD: [0x1111, 0x1173, 0x11B6] }, +{ source: [0xD514], NFC: [0xD514], NFD: [0x1111, 0x1173, 0x11B7], NFKC: [0xD514], NFKD: [0x1111, 0x1173, 0x11B7] }, +{ source: [0xD515], NFC: [0xD515], NFD: [0x1111, 0x1173, 0x11B8], NFKC: [0xD515], NFKD: [0x1111, 0x1173, 0x11B8] }, +{ source: [0xD516], NFC: [0xD516], NFD: [0x1111, 0x1173, 0x11B9], NFKC: [0xD516], NFKD: [0x1111, 0x1173, 0x11B9] }, +{ source: [0xD517], NFC: [0xD517], NFD: [0x1111, 0x1173, 0x11BA], NFKC: [0xD517], NFKD: [0x1111, 0x1173, 0x11BA] }, +{ source: [0xD518], NFC: [0xD518], NFD: [0x1111, 0x1173, 0x11BB], NFKC: [0xD518], NFKD: [0x1111, 0x1173, 0x11BB] }, +{ source: [0xD519], NFC: [0xD519], NFD: [0x1111, 0x1173, 0x11BC], NFKC: [0xD519], NFKD: [0x1111, 0x1173, 0x11BC] }, +{ source: [0xD51A], NFC: [0xD51A], NFD: [0x1111, 0x1173, 0x11BD], NFKC: [0xD51A], NFKD: [0x1111, 0x1173, 0x11BD] }, +{ source: [0xD51B], NFC: [0xD51B], NFD: [0x1111, 0x1173, 0x11BE], NFKC: [0xD51B], NFKD: [0x1111, 0x1173, 0x11BE] }, +{ source: [0xD51C], NFC: [0xD51C], NFD: [0x1111, 0x1173, 0x11BF], NFKC: [0xD51C], NFKD: [0x1111, 0x1173, 0x11BF] }, +{ source: [0xD51D], NFC: [0xD51D], NFD: [0x1111, 0x1173, 0x11C0], NFKC: [0xD51D], NFKD: [0x1111, 0x1173, 0x11C0] }, +{ source: [0xD51E], NFC: [0xD51E], NFD: [0x1111, 0x1173, 0x11C1], NFKC: [0xD51E], NFKD: [0x1111, 0x1173, 0x11C1] }, +{ source: [0xD51F], NFC: [0xD51F], NFD: [0x1111, 0x1173, 0x11C2], NFKC: [0xD51F], NFKD: [0x1111, 0x1173, 0x11C2] }, +{ source: [0xD520], NFC: [0xD520], NFD: [0x1111, 0x1174], NFKC: [0xD520], NFKD: [0x1111, 0x1174] }, +{ source: [0xD521], NFC: [0xD521], NFD: [0x1111, 0x1174, 0x11A8], NFKC: [0xD521], NFKD: [0x1111, 0x1174, 0x11A8] }, +{ source: [0xD522], NFC: [0xD522], NFD: [0x1111, 0x1174, 0x11A9], NFKC: [0xD522], NFKD: [0x1111, 0x1174, 0x11A9] }, +{ source: [0xD523], NFC: [0xD523], NFD: [0x1111, 0x1174, 0x11AA], NFKC: [0xD523], NFKD: [0x1111, 0x1174, 0x11AA] }, +{ source: [0xD524], NFC: [0xD524], NFD: [0x1111, 0x1174, 0x11AB], NFKC: [0xD524], NFKD: [0x1111, 0x1174, 0x11AB] }, +{ source: [0xD525], NFC: [0xD525], NFD: [0x1111, 0x1174, 0x11AC], NFKC: [0xD525], NFKD: [0x1111, 0x1174, 0x11AC] }, +{ source: [0xD526], NFC: [0xD526], NFD: [0x1111, 0x1174, 0x11AD], NFKC: [0xD526], NFKD: [0x1111, 0x1174, 0x11AD] }, +{ source: [0xD527], NFC: [0xD527], NFD: [0x1111, 0x1174, 0x11AE], NFKC: [0xD527], NFKD: [0x1111, 0x1174, 0x11AE] }, +{ source: [0xD528], NFC: [0xD528], NFD: [0x1111, 0x1174, 0x11AF], NFKC: [0xD528], NFKD: [0x1111, 0x1174, 0x11AF] }, +{ source: [0xD529], NFC: [0xD529], NFD: [0x1111, 0x1174, 0x11B0], NFKC: [0xD529], NFKD: [0x1111, 0x1174, 0x11B0] }, +{ source: [0xD52A], NFC: [0xD52A], NFD: [0x1111, 0x1174, 0x11B1], NFKC: [0xD52A], NFKD: [0x1111, 0x1174, 0x11B1] }, +{ source: [0xD52B], NFC: [0xD52B], NFD: [0x1111, 0x1174, 0x11B2], NFKC: [0xD52B], NFKD: [0x1111, 0x1174, 0x11B2] }, +{ source: [0xD52C], NFC: [0xD52C], NFD: [0x1111, 0x1174, 0x11B3], NFKC: [0xD52C], NFKD: [0x1111, 0x1174, 0x11B3] }, +{ source: [0xD52D], NFC: [0xD52D], NFD: [0x1111, 0x1174, 0x11B4], NFKC: [0xD52D], NFKD: [0x1111, 0x1174, 0x11B4] }, +{ source: [0xD52E], NFC: [0xD52E], NFD: [0x1111, 0x1174, 0x11B5], NFKC: [0xD52E], NFKD: [0x1111, 0x1174, 0x11B5] }, +{ source: [0xD52F], NFC: [0xD52F], NFD: [0x1111, 0x1174, 0x11B6], NFKC: [0xD52F], NFKD: [0x1111, 0x1174, 0x11B6] }, +{ source: [0xD530], NFC: [0xD530], NFD: [0x1111, 0x1174, 0x11B7], NFKC: [0xD530], NFKD: [0x1111, 0x1174, 0x11B7] }, +{ source: [0xD531], NFC: [0xD531], NFD: [0x1111, 0x1174, 0x11B8], NFKC: [0xD531], NFKD: [0x1111, 0x1174, 0x11B8] }, +{ source: [0xD532], NFC: [0xD532], NFD: [0x1111, 0x1174, 0x11B9], NFKC: [0xD532], NFKD: [0x1111, 0x1174, 0x11B9] }, +{ source: [0xD533], NFC: [0xD533], NFD: [0x1111, 0x1174, 0x11BA], NFKC: [0xD533], NFKD: [0x1111, 0x1174, 0x11BA] }, +{ source: [0xD534], NFC: [0xD534], NFD: [0x1111, 0x1174, 0x11BB], NFKC: [0xD534], NFKD: [0x1111, 0x1174, 0x11BB] }, +{ source: [0xD535], NFC: [0xD535], NFD: [0x1111, 0x1174, 0x11BC], NFKC: [0xD535], NFKD: [0x1111, 0x1174, 0x11BC] }, +{ source: [0xD536], NFC: [0xD536], NFD: [0x1111, 0x1174, 0x11BD], NFKC: [0xD536], NFKD: [0x1111, 0x1174, 0x11BD] }, +{ source: [0xD537], NFC: [0xD537], NFD: [0x1111, 0x1174, 0x11BE], NFKC: [0xD537], NFKD: [0x1111, 0x1174, 0x11BE] }, +{ source: [0xD538], NFC: [0xD538], NFD: [0x1111, 0x1174, 0x11BF], NFKC: [0xD538], NFKD: [0x1111, 0x1174, 0x11BF] }, +{ source: [0xD539], NFC: [0xD539], NFD: [0x1111, 0x1174, 0x11C0], NFKC: [0xD539], NFKD: [0x1111, 0x1174, 0x11C0] }, +{ source: [0xD53A], NFC: [0xD53A], NFD: [0x1111, 0x1174, 0x11C1], NFKC: [0xD53A], NFKD: [0x1111, 0x1174, 0x11C1] }, +{ source: [0xD53B], NFC: [0xD53B], NFD: [0x1111, 0x1174, 0x11C2], NFKC: [0xD53B], NFKD: [0x1111, 0x1174, 0x11C2] }, +{ source: [0xD53C], NFC: [0xD53C], NFD: [0x1111, 0x1175], NFKC: [0xD53C], NFKD: [0x1111, 0x1175] }, +{ source: [0xD53D], NFC: [0xD53D], NFD: [0x1111, 0x1175, 0x11A8], NFKC: [0xD53D], NFKD: [0x1111, 0x1175, 0x11A8] }, +{ source: [0xD53E], NFC: [0xD53E], NFD: [0x1111, 0x1175, 0x11A9], NFKC: [0xD53E], NFKD: [0x1111, 0x1175, 0x11A9] }, +{ source: [0xD53F], NFC: [0xD53F], NFD: [0x1111, 0x1175, 0x11AA], NFKC: [0xD53F], NFKD: [0x1111, 0x1175, 0x11AA] }, +{ source: [0xD540], NFC: [0xD540], NFD: [0x1111, 0x1175, 0x11AB], NFKC: [0xD540], NFKD: [0x1111, 0x1175, 0x11AB] }, +{ source: [0xD541], NFC: [0xD541], NFD: [0x1111, 0x1175, 0x11AC], NFKC: [0xD541], NFKD: [0x1111, 0x1175, 0x11AC] }, +{ source: [0xD542], NFC: [0xD542], NFD: [0x1111, 0x1175, 0x11AD], NFKC: [0xD542], NFKD: [0x1111, 0x1175, 0x11AD] }, +{ source: [0xD543], NFC: [0xD543], NFD: [0x1111, 0x1175, 0x11AE], NFKC: [0xD543], NFKD: [0x1111, 0x1175, 0x11AE] }, +{ source: [0xD544], NFC: [0xD544], NFD: [0x1111, 0x1175, 0x11AF], NFKC: [0xD544], NFKD: [0x1111, 0x1175, 0x11AF] }, +{ source: [0xD545], NFC: [0xD545], NFD: [0x1111, 0x1175, 0x11B0], NFKC: [0xD545], NFKD: [0x1111, 0x1175, 0x11B0] }, +{ source: [0xD546], NFC: [0xD546], NFD: [0x1111, 0x1175, 0x11B1], NFKC: [0xD546], NFKD: [0x1111, 0x1175, 0x11B1] }, +{ source: [0xD547], NFC: [0xD547], NFD: [0x1111, 0x1175, 0x11B2], NFKC: [0xD547], NFKD: [0x1111, 0x1175, 0x11B2] }, +{ source: [0xD548], NFC: [0xD548], NFD: [0x1111, 0x1175, 0x11B3], NFKC: [0xD548], NFKD: [0x1111, 0x1175, 0x11B3] }, +{ source: [0xD549], NFC: [0xD549], NFD: [0x1111, 0x1175, 0x11B4], NFKC: [0xD549], NFKD: [0x1111, 0x1175, 0x11B4] }, +{ source: [0xD54A], NFC: [0xD54A], NFD: [0x1111, 0x1175, 0x11B5], NFKC: [0xD54A], NFKD: [0x1111, 0x1175, 0x11B5] }, +{ source: [0xD54B], NFC: [0xD54B], NFD: [0x1111, 0x1175, 0x11B6], NFKC: [0xD54B], NFKD: [0x1111, 0x1175, 0x11B6] }, +{ source: [0xD54C], NFC: [0xD54C], NFD: [0x1111, 0x1175, 0x11B7], NFKC: [0xD54C], NFKD: [0x1111, 0x1175, 0x11B7] }, +{ source: [0xD54D], NFC: [0xD54D], NFD: [0x1111, 0x1175, 0x11B8], NFKC: [0xD54D], NFKD: [0x1111, 0x1175, 0x11B8] }, +{ source: [0xD54E], NFC: [0xD54E], NFD: [0x1111, 0x1175, 0x11B9], NFKC: [0xD54E], NFKD: [0x1111, 0x1175, 0x11B9] }, +{ source: [0xD54F], NFC: [0xD54F], NFD: [0x1111, 0x1175, 0x11BA], NFKC: [0xD54F], NFKD: [0x1111, 0x1175, 0x11BA] }, +{ source: [0xD550], NFC: [0xD550], NFD: [0x1111, 0x1175, 0x11BB], NFKC: [0xD550], NFKD: [0x1111, 0x1175, 0x11BB] }, +{ source: [0xD551], NFC: [0xD551], NFD: [0x1111, 0x1175, 0x11BC], NFKC: [0xD551], NFKD: [0x1111, 0x1175, 0x11BC] }, +{ source: [0xD552], NFC: [0xD552], NFD: [0x1111, 0x1175, 0x11BD], NFKC: [0xD552], NFKD: [0x1111, 0x1175, 0x11BD] }, +{ source: [0xD553], NFC: [0xD553], NFD: [0x1111, 0x1175, 0x11BE], NFKC: [0xD553], NFKD: [0x1111, 0x1175, 0x11BE] }, +{ source: [0xD554], NFC: [0xD554], NFD: [0x1111, 0x1175, 0x11BF], NFKC: [0xD554], NFKD: [0x1111, 0x1175, 0x11BF] }, +{ source: [0xD555], NFC: [0xD555], NFD: [0x1111, 0x1175, 0x11C0], NFKC: [0xD555], NFKD: [0x1111, 0x1175, 0x11C0] }, +{ source: [0xD556], NFC: [0xD556], NFD: [0x1111, 0x1175, 0x11C1], NFKC: [0xD556], NFKD: [0x1111, 0x1175, 0x11C1] }, +{ source: [0xD557], NFC: [0xD557], NFD: [0x1111, 0x1175, 0x11C2], NFKC: [0xD557], NFKD: [0x1111, 0x1175, 0x11C2] }, +{ source: [0xD558], NFC: [0xD558], NFD: [0x1112, 0x1161], NFKC: [0xD558], NFKD: [0x1112, 0x1161] }, +{ source: [0xD559], NFC: [0xD559], NFD: [0x1112, 0x1161, 0x11A8], NFKC: [0xD559], NFKD: [0x1112, 0x1161, 0x11A8] }, +{ source: [0xD55A], NFC: [0xD55A], NFD: [0x1112, 0x1161, 0x11A9], NFKC: [0xD55A], NFKD: [0x1112, 0x1161, 0x11A9] }, +{ source: [0xD55B], NFC: [0xD55B], NFD: [0x1112, 0x1161, 0x11AA], NFKC: [0xD55B], NFKD: [0x1112, 0x1161, 0x11AA] }, +{ source: [0xD55C], NFC: [0xD55C], NFD: [0x1112, 0x1161, 0x11AB], NFKC: [0xD55C], NFKD: [0x1112, 0x1161, 0x11AB] }, +{ source: [0xD55D], NFC: [0xD55D], NFD: [0x1112, 0x1161, 0x11AC], NFKC: [0xD55D], NFKD: [0x1112, 0x1161, 0x11AC] }, +{ source: [0xD55E], NFC: [0xD55E], NFD: [0x1112, 0x1161, 0x11AD], NFKC: [0xD55E], NFKD: [0x1112, 0x1161, 0x11AD] }, +{ source: [0xD55F], NFC: [0xD55F], NFD: [0x1112, 0x1161, 0x11AE], NFKC: [0xD55F], NFKD: [0x1112, 0x1161, 0x11AE] }, +{ source: [0xD560], NFC: [0xD560], NFD: [0x1112, 0x1161, 0x11AF], NFKC: [0xD560], NFKD: [0x1112, 0x1161, 0x11AF] }, +{ source: [0xD561], NFC: [0xD561], NFD: [0x1112, 0x1161, 0x11B0], NFKC: [0xD561], NFKD: [0x1112, 0x1161, 0x11B0] }, +{ source: [0xD562], NFC: [0xD562], NFD: [0x1112, 0x1161, 0x11B1], NFKC: [0xD562], NFKD: [0x1112, 0x1161, 0x11B1] }, +{ source: [0xD563], NFC: [0xD563], NFD: [0x1112, 0x1161, 0x11B2], NFKC: [0xD563], NFKD: [0x1112, 0x1161, 0x11B2] }, +{ source: [0xD564], NFC: [0xD564], NFD: [0x1112, 0x1161, 0x11B3], NFKC: [0xD564], NFKD: [0x1112, 0x1161, 0x11B3] }, +{ source: [0xD565], NFC: [0xD565], NFD: [0x1112, 0x1161, 0x11B4], NFKC: [0xD565], NFKD: [0x1112, 0x1161, 0x11B4] }, +{ source: [0xD566], NFC: [0xD566], NFD: [0x1112, 0x1161, 0x11B5], NFKC: [0xD566], NFKD: [0x1112, 0x1161, 0x11B5] }, +{ source: [0xD567], NFC: [0xD567], NFD: [0x1112, 0x1161, 0x11B6], NFKC: [0xD567], NFKD: [0x1112, 0x1161, 0x11B6] }, +{ source: [0xD568], NFC: [0xD568], NFD: [0x1112, 0x1161, 0x11B7], NFKC: [0xD568], NFKD: [0x1112, 0x1161, 0x11B7] }, +{ source: [0xD569], NFC: [0xD569], NFD: [0x1112, 0x1161, 0x11B8], NFKC: [0xD569], NFKD: [0x1112, 0x1161, 0x11B8] }, +{ source: [0xD56A], NFC: [0xD56A], NFD: [0x1112, 0x1161, 0x11B9], NFKC: [0xD56A], NFKD: [0x1112, 0x1161, 0x11B9] }, +{ source: [0xD56B], NFC: [0xD56B], NFD: [0x1112, 0x1161, 0x11BA], NFKC: [0xD56B], NFKD: [0x1112, 0x1161, 0x11BA] }, +{ source: [0xD56C], NFC: [0xD56C], NFD: [0x1112, 0x1161, 0x11BB], NFKC: [0xD56C], NFKD: [0x1112, 0x1161, 0x11BB] }, +{ source: [0xD56D], NFC: [0xD56D], NFD: [0x1112, 0x1161, 0x11BC], NFKC: [0xD56D], NFKD: [0x1112, 0x1161, 0x11BC] }, +{ source: [0xD56E], NFC: [0xD56E], NFD: [0x1112, 0x1161, 0x11BD], NFKC: [0xD56E], NFKD: [0x1112, 0x1161, 0x11BD] }, +{ source: [0xD56F], NFC: [0xD56F], NFD: [0x1112, 0x1161, 0x11BE], NFKC: [0xD56F], NFKD: [0x1112, 0x1161, 0x11BE] }, +{ source: [0xD570], NFC: [0xD570], NFD: [0x1112, 0x1161, 0x11BF], NFKC: [0xD570], NFKD: [0x1112, 0x1161, 0x11BF] }, +{ source: [0xD571], NFC: [0xD571], NFD: [0x1112, 0x1161, 0x11C0], NFKC: [0xD571], NFKD: [0x1112, 0x1161, 0x11C0] }, +{ source: [0xD572], NFC: [0xD572], NFD: [0x1112, 0x1161, 0x11C1], NFKC: [0xD572], NFKD: [0x1112, 0x1161, 0x11C1] }, +{ source: [0xD573], NFC: [0xD573], NFD: [0x1112, 0x1161, 0x11C2], NFKC: [0xD573], NFKD: [0x1112, 0x1161, 0x11C2] }, +{ source: [0xD574], NFC: [0xD574], NFD: [0x1112, 0x1162], NFKC: [0xD574], NFKD: [0x1112, 0x1162] }, +{ source: [0xD575], NFC: [0xD575], NFD: [0x1112, 0x1162, 0x11A8], NFKC: [0xD575], NFKD: [0x1112, 0x1162, 0x11A8] }, +{ source: [0xD576], NFC: [0xD576], NFD: [0x1112, 0x1162, 0x11A9], NFKC: [0xD576], NFKD: [0x1112, 0x1162, 0x11A9] }, +{ source: [0xD577], NFC: [0xD577], NFD: [0x1112, 0x1162, 0x11AA], NFKC: [0xD577], NFKD: [0x1112, 0x1162, 0x11AA] }, +{ source: [0xD578], NFC: [0xD578], NFD: [0x1112, 0x1162, 0x11AB], NFKC: [0xD578], NFKD: [0x1112, 0x1162, 0x11AB] }, +{ source: [0xD579], NFC: [0xD579], NFD: [0x1112, 0x1162, 0x11AC], NFKC: [0xD579], NFKD: [0x1112, 0x1162, 0x11AC] }, +{ source: [0xD57A], NFC: [0xD57A], NFD: [0x1112, 0x1162, 0x11AD], NFKC: [0xD57A], NFKD: [0x1112, 0x1162, 0x11AD] }, +{ source: [0xD57B], NFC: [0xD57B], NFD: [0x1112, 0x1162, 0x11AE], NFKC: [0xD57B], NFKD: [0x1112, 0x1162, 0x11AE] }, +{ source: [0xD57C], NFC: [0xD57C], NFD: [0x1112, 0x1162, 0x11AF], NFKC: [0xD57C], NFKD: [0x1112, 0x1162, 0x11AF] }, +{ source: [0xD57D], NFC: [0xD57D], NFD: [0x1112, 0x1162, 0x11B0], NFKC: [0xD57D], NFKD: [0x1112, 0x1162, 0x11B0] }, +{ source: [0xD57E], NFC: [0xD57E], NFD: [0x1112, 0x1162, 0x11B1], NFKC: [0xD57E], NFKD: [0x1112, 0x1162, 0x11B1] }, +{ source: [0xD57F], NFC: [0xD57F], NFD: [0x1112, 0x1162, 0x11B2], NFKC: [0xD57F], NFKD: [0x1112, 0x1162, 0x11B2] }, +{ source: [0xD580], NFC: [0xD580], NFD: [0x1112, 0x1162, 0x11B3], NFKC: [0xD580], NFKD: [0x1112, 0x1162, 0x11B3] }, +{ source: [0xD581], NFC: [0xD581], NFD: [0x1112, 0x1162, 0x11B4], NFKC: [0xD581], NFKD: [0x1112, 0x1162, 0x11B4] }, +{ source: [0xD582], NFC: [0xD582], NFD: [0x1112, 0x1162, 0x11B5], NFKC: [0xD582], NFKD: [0x1112, 0x1162, 0x11B5] }, +{ source: [0xD583], NFC: [0xD583], NFD: [0x1112, 0x1162, 0x11B6], NFKC: [0xD583], NFKD: [0x1112, 0x1162, 0x11B6] }, +{ source: [0xD584], NFC: [0xD584], NFD: [0x1112, 0x1162, 0x11B7], NFKC: [0xD584], NFKD: [0x1112, 0x1162, 0x11B7] }, +{ source: [0xD585], NFC: [0xD585], NFD: [0x1112, 0x1162, 0x11B8], NFKC: [0xD585], NFKD: [0x1112, 0x1162, 0x11B8] }, +{ source: [0xD586], NFC: [0xD586], NFD: [0x1112, 0x1162, 0x11B9], NFKC: [0xD586], NFKD: [0x1112, 0x1162, 0x11B9] }, +{ source: [0xD587], NFC: [0xD587], NFD: [0x1112, 0x1162, 0x11BA], NFKC: [0xD587], NFKD: [0x1112, 0x1162, 0x11BA] }, +{ source: [0xD588], NFC: [0xD588], NFD: [0x1112, 0x1162, 0x11BB], NFKC: [0xD588], NFKD: [0x1112, 0x1162, 0x11BB] }, +{ source: [0xD589], NFC: [0xD589], NFD: [0x1112, 0x1162, 0x11BC], NFKC: [0xD589], NFKD: [0x1112, 0x1162, 0x11BC] }, +{ source: [0xD58A], NFC: [0xD58A], NFD: [0x1112, 0x1162, 0x11BD], NFKC: [0xD58A], NFKD: [0x1112, 0x1162, 0x11BD] }, +{ source: [0xD58B], NFC: [0xD58B], NFD: [0x1112, 0x1162, 0x11BE], NFKC: [0xD58B], NFKD: [0x1112, 0x1162, 0x11BE] }, +{ source: [0xD58C], NFC: [0xD58C], NFD: [0x1112, 0x1162, 0x11BF], NFKC: [0xD58C], NFKD: [0x1112, 0x1162, 0x11BF] }, +{ source: [0xD58D], NFC: [0xD58D], NFD: [0x1112, 0x1162, 0x11C0], NFKC: [0xD58D], NFKD: [0x1112, 0x1162, 0x11C0] }, +{ source: [0xD58E], NFC: [0xD58E], NFD: [0x1112, 0x1162, 0x11C1], NFKC: [0xD58E], NFKD: [0x1112, 0x1162, 0x11C1] }, +{ source: [0xD58F], NFC: [0xD58F], NFD: [0x1112, 0x1162, 0x11C2], NFKC: [0xD58F], NFKD: [0x1112, 0x1162, 0x11C2] }, +{ source: [0xD590], NFC: [0xD590], NFD: [0x1112, 0x1163], NFKC: [0xD590], NFKD: [0x1112, 0x1163] }, +{ source: [0xD591], NFC: [0xD591], NFD: [0x1112, 0x1163, 0x11A8], NFKC: [0xD591], NFKD: [0x1112, 0x1163, 0x11A8] }, +{ source: [0xD592], NFC: [0xD592], NFD: [0x1112, 0x1163, 0x11A9], NFKC: [0xD592], NFKD: [0x1112, 0x1163, 0x11A9] }, +{ source: [0xD593], NFC: [0xD593], NFD: [0x1112, 0x1163, 0x11AA], NFKC: [0xD593], NFKD: [0x1112, 0x1163, 0x11AA] }, +{ source: [0xD594], NFC: [0xD594], NFD: [0x1112, 0x1163, 0x11AB], NFKC: [0xD594], NFKD: [0x1112, 0x1163, 0x11AB] }, +{ source: [0xD595], NFC: [0xD595], NFD: [0x1112, 0x1163, 0x11AC], NFKC: [0xD595], NFKD: [0x1112, 0x1163, 0x11AC] }, +{ source: [0xD596], NFC: [0xD596], NFD: [0x1112, 0x1163, 0x11AD], NFKC: [0xD596], NFKD: [0x1112, 0x1163, 0x11AD] }, +{ source: [0xD597], NFC: [0xD597], NFD: [0x1112, 0x1163, 0x11AE], NFKC: [0xD597], NFKD: [0x1112, 0x1163, 0x11AE] }, +{ source: [0xD598], NFC: [0xD598], NFD: [0x1112, 0x1163, 0x11AF], NFKC: [0xD598], NFKD: [0x1112, 0x1163, 0x11AF] }, +{ source: [0xD599], NFC: [0xD599], NFD: [0x1112, 0x1163, 0x11B0], NFKC: [0xD599], NFKD: [0x1112, 0x1163, 0x11B0] }, +{ source: [0xD59A], NFC: [0xD59A], NFD: [0x1112, 0x1163, 0x11B1], NFKC: [0xD59A], NFKD: [0x1112, 0x1163, 0x11B1] }, +{ source: [0xD59B], NFC: [0xD59B], NFD: [0x1112, 0x1163, 0x11B2], NFKC: [0xD59B], NFKD: [0x1112, 0x1163, 0x11B2] }, +{ source: [0xD59C], NFC: [0xD59C], NFD: [0x1112, 0x1163, 0x11B3], NFKC: [0xD59C], NFKD: [0x1112, 0x1163, 0x11B3] }, +{ source: [0xD59D], NFC: [0xD59D], NFD: [0x1112, 0x1163, 0x11B4], NFKC: [0xD59D], NFKD: [0x1112, 0x1163, 0x11B4] }, +{ source: [0xD59E], NFC: [0xD59E], NFD: [0x1112, 0x1163, 0x11B5], NFKC: [0xD59E], NFKD: [0x1112, 0x1163, 0x11B5] }, +{ source: [0xD59F], NFC: [0xD59F], NFD: [0x1112, 0x1163, 0x11B6], NFKC: [0xD59F], NFKD: [0x1112, 0x1163, 0x11B6] }, +{ source: [0xD5A0], NFC: [0xD5A0], NFD: [0x1112, 0x1163, 0x11B7], NFKC: [0xD5A0], NFKD: [0x1112, 0x1163, 0x11B7] }, +{ source: [0xD5A1], NFC: [0xD5A1], NFD: [0x1112, 0x1163, 0x11B8], NFKC: [0xD5A1], NFKD: [0x1112, 0x1163, 0x11B8] }, +{ source: [0xD5A2], NFC: [0xD5A2], NFD: [0x1112, 0x1163, 0x11B9], NFKC: [0xD5A2], NFKD: [0x1112, 0x1163, 0x11B9] }, +{ source: [0xD5A3], NFC: [0xD5A3], NFD: [0x1112, 0x1163, 0x11BA], NFKC: [0xD5A3], NFKD: [0x1112, 0x1163, 0x11BA] }, +{ source: [0xD5A4], NFC: [0xD5A4], NFD: [0x1112, 0x1163, 0x11BB], NFKC: [0xD5A4], NFKD: [0x1112, 0x1163, 0x11BB] }, +{ source: [0xD5A5], NFC: [0xD5A5], NFD: [0x1112, 0x1163, 0x11BC], NFKC: [0xD5A5], NFKD: [0x1112, 0x1163, 0x11BC] }, +{ source: [0xD5A6], NFC: [0xD5A6], NFD: [0x1112, 0x1163, 0x11BD], NFKC: [0xD5A6], NFKD: [0x1112, 0x1163, 0x11BD] }, +{ source: [0xD5A7], NFC: [0xD5A7], NFD: [0x1112, 0x1163, 0x11BE], NFKC: [0xD5A7], NFKD: [0x1112, 0x1163, 0x11BE] }, +{ source: [0xD5A8], NFC: [0xD5A8], NFD: [0x1112, 0x1163, 0x11BF], NFKC: [0xD5A8], NFKD: [0x1112, 0x1163, 0x11BF] }, +{ source: [0xD5A9], NFC: [0xD5A9], NFD: [0x1112, 0x1163, 0x11C0], NFKC: [0xD5A9], NFKD: [0x1112, 0x1163, 0x11C0] }, +{ source: [0xD5AA], NFC: [0xD5AA], NFD: [0x1112, 0x1163, 0x11C1], NFKC: [0xD5AA], NFKD: [0x1112, 0x1163, 0x11C1] }, +{ source: [0xD5AB], NFC: [0xD5AB], NFD: [0x1112, 0x1163, 0x11C2], NFKC: [0xD5AB], NFKD: [0x1112, 0x1163, 0x11C2] }, +{ source: [0xD5AC], NFC: [0xD5AC], NFD: [0x1112, 0x1164], NFKC: [0xD5AC], NFKD: [0x1112, 0x1164] }, +{ source: [0xD5AD], NFC: [0xD5AD], NFD: [0x1112, 0x1164, 0x11A8], NFKC: [0xD5AD], NFKD: [0x1112, 0x1164, 0x11A8] }, +{ source: [0xD5AE], NFC: [0xD5AE], NFD: [0x1112, 0x1164, 0x11A9], NFKC: [0xD5AE], NFKD: [0x1112, 0x1164, 0x11A9] }, +{ source: [0xD5AF], NFC: [0xD5AF], NFD: [0x1112, 0x1164, 0x11AA], NFKC: [0xD5AF], NFKD: [0x1112, 0x1164, 0x11AA] }, +{ source: [0xD5B0], NFC: [0xD5B0], NFD: [0x1112, 0x1164, 0x11AB], NFKC: [0xD5B0], NFKD: [0x1112, 0x1164, 0x11AB] }, +{ source: [0xD5B1], NFC: [0xD5B1], NFD: [0x1112, 0x1164, 0x11AC], NFKC: [0xD5B1], NFKD: [0x1112, 0x1164, 0x11AC] }, +{ source: [0xD5B2], NFC: [0xD5B2], NFD: [0x1112, 0x1164, 0x11AD], NFKC: [0xD5B2], NFKD: [0x1112, 0x1164, 0x11AD] }, +{ source: [0xD5B3], NFC: [0xD5B3], NFD: [0x1112, 0x1164, 0x11AE], NFKC: [0xD5B3], NFKD: [0x1112, 0x1164, 0x11AE] }, +{ source: [0xD5B4], NFC: [0xD5B4], NFD: [0x1112, 0x1164, 0x11AF], NFKC: [0xD5B4], NFKD: [0x1112, 0x1164, 0x11AF] }, +{ source: [0xD5B5], NFC: [0xD5B5], NFD: [0x1112, 0x1164, 0x11B0], NFKC: [0xD5B5], NFKD: [0x1112, 0x1164, 0x11B0] }, +{ source: [0xD5B6], NFC: [0xD5B6], NFD: [0x1112, 0x1164, 0x11B1], NFKC: [0xD5B6], NFKD: [0x1112, 0x1164, 0x11B1] }, +{ source: [0xD5B7], NFC: [0xD5B7], NFD: [0x1112, 0x1164, 0x11B2], NFKC: [0xD5B7], NFKD: [0x1112, 0x1164, 0x11B2] }, +{ source: [0xD5B8], NFC: [0xD5B8], NFD: [0x1112, 0x1164, 0x11B3], NFKC: [0xD5B8], NFKD: [0x1112, 0x1164, 0x11B3] }, +{ source: [0xD5B9], NFC: [0xD5B9], NFD: [0x1112, 0x1164, 0x11B4], NFKC: [0xD5B9], NFKD: [0x1112, 0x1164, 0x11B4] }, +{ source: [0xD5BA], NFC: [0xD5BA], NFD: [0x1112, 0x1164, 0x11B5], NFKC: [0xD5BA], NFKD: [0x1112, 0x1164, 0x11B5] }, +{ source: [0xD5BB], NFC: [0xD5BB], NFD: [0x1112, 0x1164, 0x11B6], NFKC: [0xD5BB], NFKD: [0x1112, 0x1164, 0x11B6] }, +{ source: [0xD5BC], NFC: [0xD5BC], NFD: [0x1112, 0x1164, 0x11B7], NFKC: [0xD5BC], NFKD: [0x1112, 0x1164, 0x11B7] }, +{ source: [0xD5BD], NFC: [0xD5BD], NFD: [0x1112, 0x1164, 0x11B8], NFKC: [0xD5BD], NFKD: [0x1112, 0x1164, 0x11B8] }, +{ source: [0xD5BE], NFC: [0xD5BE], NFD: [0x1112, 0x1164, 0x11B9], NFKC: [0xD5BE], NFKD: [0x1112, 0x1164, 0x11B9] }, +{ source: [0xD5BF], NFC: [0xD5BF], NFD: [0x1112, 0x1164, 0x11BA], NFKC: [0xD5BF], NFKD: [0x1112, 0x1164, 0x11BA] }, +{ source: [0xD5C0], NFC: [0xD5C0], NFD: [0x1112, 0x1164, 0x11BB], NFKC: [0xD5C0], NFKD: [0x1112, 0x1164, 0x11BB] }, +{ source: [0xD5C1], NFC: [0xD5C1], NFD: [0x1112, 0x1164, 0x11BC], NFKC: [0xD5C1], NFKD: [0x1112, 0x1164, 0x11BC] }, +{ source: [0xD5C2], NFC: [0xD5C2], NFD: [0x1112, 0x1164, 0x11BD], NFKC: [0xD5C2], NFKD: [0x1112, 0x1164, 0x11BD] }, +{ source: [0xD5C3], NFC: [0xD5C3], NFD: [0x1112, 0x1164, 0x11BE], NFKC: [0xD5C3], NFKD: [0x1112, 0x1164, 0x11BE] }, +{ source: [0xD5C4], NFC: [0xD5C4], NFD: [0x1112, 0x1164, 0x11BF], NFKC: [0xD5C4], NFKD: [0x1112, 0x1164, 0x11BF] }, +{ source: [0xD5C5], NFC: [0xD5C5], NFD: [0x1112, 0x1164, 0x11C0], NFKC: [0xD5C5], NFKD: [0x1112, 0x1164, 0x11C0] }, +{ source: [0xD5C6], NFC: [0xD5C6], NFD: [0x1112, 0x1164, 0x11C1], NFKC: [0xD5C6], NFKD: [0x1112, 0x1164, 0x11C1] }, +{ source: [0xD5C7], NFC: [0xD5C7], NFD: [0x1112, 0x1164, 0x11C2], NFKC: [0xD5C7], NFKD: [0x1112, 0x1164, 0x11C2] }, +{ source: [0xD5C8], NFC: [0xD5C8], NFD: [0x1112, 0x1165], NFKC: [0xD5C8], NFKD: [0x1112, 0x1165] }, +{ source: [0xD5C9], NFC: [0xD5C9], NFD: [0x1112, 0x1165, 0x11A8], NFKC: [0xD5C9], NFKD: [0x1112, 0x1165, 0x11A8] }, +{ source: [0xD5CA], NFC: [0xD5CA], NFD: [0x1112, 0x1165, 0x11A9], NFKC: [0xD5CA], NFKD: [0x1112, 0x1165, 0x11A9] }, +{ source: [0xD5CB], NFC: [0xD5CB], NFD: [0x1112, 0x1165, 0x11AA], NFKC: [0xD5CB], NFKD: [0x1112, 0x1165, 0x11AA] }, +{ source: [0xD5CC], NFC: [0xD5CC], NFD: [0x1112, 0x1165, 0x11AB], NFKC: [0xD5CC], NFKD: [0x1112, 0x1165, 0x11AB] }, +{ source: [0xD5CD], NFC: [0xD5CD], NFD: [0x1112, 0x1165, 0x11AC], NFKC: [0xD5CD], NFKD: [0x1112, 0x1165, 0x11AC] }, +{ source: [0xD5CE], NFC: [0xD5CE], NFD: [0x1112, 0x1165, 0x11AD], NFKC: [0xD5CE], NFKD: [0x1112, 0x1165, 0x11AD] }, +{ source: [0xD5CF], NFC: [0xD5CF], NFD: [0x1112, 0x1165, 0x11AE], NFKC: [0xD5CF], NFKD: [0x1112, 0x1165, 0x11AE] }, +{ source: [0xD5D0], NFC: [0xD5D0], NFD: [0x1112, 0x1165, 0x11AF], NFKC: [0xD5D0], NFKD: [0x1112, 0x1165, 0x11AF] }, +{ source: [0xD5D1], NFC: [0xD5D1], NFD: [0x1112, 0x1165, 0x11B0], NFKC: [0xD5D1], NFKD: [0x1112, 0x1165, 0x11B0] }, +{ source: [0xD5D2], NFC: [0xD5D2], NFD: [0x1112, 0x1165, 0x11B1], NFKC: [0xD5D2], NFKD: [0x1112, 0x1165, 0x11B1] }, +{ source: [0xD5D3], NFC: [0xD5D3], NFD: [0x1112, 0x1165, 0x11B2], NFKC: [0xD5D3], NFKD: [0x1112, 0x1165, 0x11B2] }, +{ source: [0xD5D4], NFC: [0xD5D4], NFD: [0x1112, 0x1165, 0x11B3], NFKC: [0xD5D4], NFKD: [0x1112, 0x1165, 0x11B3] }, +{ source: [0xD5D5], NFC: [0xD5D5], NFD: [0x1112, 0x1165, 0x11B4], NFKC: [0xD5D5], NFKD: [0x1112, 0x1165, 0x11B4] }, +{ source: [0xD5D6], NFC: [0xD5D6], NFD: [0x1112, 0x1165, 0x11B5], NFKC: [0xD5D6], NFKD: [0x1112, 0x1165, 0x11B5] }, +{ source: [0xD5D7], NFC: [0xD5D7], NFD: [0x1112, 0x1165, 0x11B6], NFKC: [0xD5D7], NFKD: [0x1112, 0x1165, 0x11B6] }, +{ source: [0xD5D8], NFC: [0xD5D8], NFD: [0x1112, 0x1165, 0x11B7], NFKC: [0xD5D8], NFKD: [0x1112, 0x1165, 0x11B7] }, +{ source: [0xD5D9], NFC: [0xD5D9], NFD: [0x1112, 0x1165, 0x11B8], NFKC: [0xD5D9], NFKD: [0x1112, 0x1165, 0x11B8] }, +{ source: [0xD5DA], NFC: [0xD5DA], NFD: [0x1112, 0x1165, 0x11B9], NFKC: [0xD5DA], NFKD: [0x1112, 0x1165, 0x11B9] }, +{ source: [0xD5DB], NFC: [0xD5DB], NFD: [0x1112, 0x1165, 0x11BA], NFKC: [0xD5DB], NFKD: [0x1112, 0x1165, 0x11BA] }, +{ source: [0xD5DC], NFC: [0xD5DC], NFD: [0x1112, 0x1165, 0x11BB], NFKC: [0xD5DC], NFKD: [0x1112, 0x1165, 0x11BB] }, +{ source: [0xD5DD], NFC: [0xD5DD], NFD: [0x1112, 0x1165, 0x11BC], NFKC: [0xD5DD], NFKD: [0x1112, 0x1165, 0x11BC] }, +{ source: [0xD5DE], NFC: [0xD5DE], NFD: [0x1112, 0x1165, 0x11BD], NFKC: [0xD5DE], NFKD: [0x1112, 0x1165, 0x11BD] }, +{ source: [0xD5DF], NFC: [0xD5DF], NFD: [0x1112, 0x1165, 0x11BE], NFKC: [0xD5DF], NFKD: [0x1112, 0x1165, 0x11BE] }, +{ source: [0xD5E0], NFC: [0xD5E0], NFD: [0x1112, 0x1165, 0x11BF], NFKC: [0xD5E0], NFKD: [0x1112, 0x1165, 0x11BF] }, +{ source: [0xD5E1], NFC: [0xD5E1], NFD: [0x1112, 0x1165, 0x11C0], NFKC: [0xD5E1], NFKD: [0x1112, 0x1165, 0x11C0] }, +{ source: [0xD5E2], NFC: [0xD5E2], NFD: [0x1112, 0x1165, 0x11C1], NFKC: [0xD5E2], NFKD: [0x1112, 0x1165, 0x11C1] }, +{ source: [0xD5E3], NFC: [0xD5E3], NFD: [0x1112, 0x1165, 0x11C2], NFKC: [0xD5E3], NFKD: [0x1112, 0x1165, 0x11C2] }, +{ source: [0xD5E4], NFC: [0xD5E4], NFD: [0x1112, 0x1166], NFKC: [0xD5E4], NFKD: [0x1112, 0x1166] }, +{ source: [0xD5E5], NFC: [0xD5E5], NFD: [0x1112, 0x1166, 0x11A8], NFKC: [0xD5E5], NFKD: [0x1112, 0x1166, 0x11A8] }, +{ source: [0xD5E6], NFC: [0xD5E6], NFD: [0x1112, 0x1166, 0x11A9], NFKC: [0xD5E6], NFKD: [0x1112, 0x1166, 0x11A9] }, +{ source: [0xD5E7], NFC: [0xD5E7], NFD: [0x1112, 0x1166, 0x11AA], NFKC: [0xD5E7], NFKD: [0x1112, 0x1166, 0x11AA] }, +{ source: [0xD5E8], NFC: [0xD5E8], NFD: [0x1112, 0x1166, 0x11AB], NFKC: [0xD5E8], NFKD: [0x1112, 0x1166, 0x11AB] }, +{ source: [0xD5E9], NFC: [0xD5E9], NFD: [0x1112, 0x1166, 0x11AC], NFKC: [0xD5E9], NFKD: [0x1112, 0x1166, 0x11AC] }, +{ source: [0xD5EA], NFC: [0xD5EA], NFD: [0x1112, 0x1166, 0x11AD], NFKC: [0xD5EA], NFKD: [0x1112, 0x1166, 0x11AD] }, +{ source: [0xD5EB], NFC: [0xD5EB], NFD: [0x1112, 0x1166, 0x11AE], NFKC: [0xD5EB], NFKD: [0x1112, 0x1166, 0x11AE] }, +{ source: [0xD5EC], NFC: [0xD5EC], NFD: [0x1112, 0x1166, 0x11AF], NFKC: [0xD5EC], NFKD: [0x1112, 0x1166, 0x11AF] }, +{ source: [0xD5ED], NFC: [0xD5ED], NFD: [0x1112, 0x1166, 0x11B0], NFKC: [0xD5ED], NFKD: [0x1112, 0x1166, 0x11B0] }, +{ source: [0xD5EE], NFC: [0xD5EE], NFD: [0x1112, 0x1166, 0x11B1], NFKC: [0xD5EE], NFKD: [0x1112, 0x1166, 0x11B1] }, +{ source: [0xD5EF], NFC: [0xD5EF], NFD: [0x1112, 0x1166, 0x11B2], NFKC: [0xD5EF], NFKD: [0x1112, 0x1166, 0x11B2] }, +{ source: [0xD5F0], NFC: [0xD5F0], NFD: [0x1112, 0x1166, 0x11B3], NFKC: [0xD5F0], NFKD: [0x1112, 0x1166, 0x11B3] }, +{ source: [0xD5F1], NFC: [0xD5F1], NFD: [0x1112, 0x1166, 0x11B4], NFKC: [0xD5F1], NFKD: [0x1112, 0x1166, 0x11B4] }, +{ source: [0xD5F2], NFC: [0xD5F2], NFD: [0x1112, 0x1166, 0x11B5], NFKC: [0xD5F2], NFKD: [0x1112, 0x1166, 0x11B5] }, +{ source: [0xD5F3], NFC: [0xD5F3], NFD: [0x1112, 0x1166, 0x11B6], NFKC: [0xD5F3], NFKD: [0x1112, 0x1166, 0x11B6] }, +{ source: [0xD5F4], NFC: [0xD5F4], NFD: [0x1112, 0x1166, 0x11B7], NFKC: [0xD5F4], NFKD: [0x1112, 0x1166, 0x11B7] }, +{ source: [0xD5F5], NFC: [0xD5F5], NFD: [0x1112, 0x1166, 0x11B8], NFKC: [0xD5F5], NFKD: [0x1112, 0x1166, 0x11B8] }, +{ source: [0xD5F6], NFC: [0xD5F6], NFD: [0x1112, 0x1166, 0x11B9], NFKC: [0xD5F6], NFKD: [0x1112, 0x1166, 0x11B9] }, +{ source: [0xD5F7], NFC: [0xD5F7], NFD: [0x1112, 0x1166, 0x11BA], NFKC: [0xD5F7], NFKD: [0x1112, 0x1166, 0x11BA] }, +{ source: [0xD5F8], NFC: [0xD5F8], NFD: [0x1112, 0x1166, 0x11BB], NFKC: [0xD5F8], NFKD: [0x1112, 0x1166, 0x11BB] }, +{ source: [0xD5F9], NFC: [0xD5F9], NFD: [0x1112, 0x1166, 0x11BC], NFKC: [0xD5F9], NFKD: [0x1112, 0x1166, 0x11BC] }, +{ source: [0xD5FA], NFC: [0xD5FA], NFD: [0x1112, 0x1166, 0x11BD], NFKC: [0xD5FA], NFKD: [0x1112, 0x1166, 0x11BD] }, +{ source: [0xD5FB], NFC: [0xD5FB], NFD: [0x1112, 0x1166, 0x11BE], NFKC: [0xD5FB], NFKD: [0x1112, 0x1166, 0x11BE] }, +{ source: [0xD5FC], NFC: [0xD5FC], NFD: [0x1112, 0x1166, 0x11BF], NFKC: [0xD5FC], NFKD: [0x1112, 0x1166, 0x11BF] }, +{ source: [0xD5FD], NFC: [0xD5FD], NFD: [0x1112, 0x1166, 0x11C0], NFKC: [0xD5FD], NFKD: [0x1112, 0x1166, 0x11C0] }, +{ source: [0xD5FE], NFC: [0xD5FE], NFD: [0x1112, 0x1166, 0x11C1], NFKC: [0xD5FE], NFKD: [0x1112, 0x1166, 0x11C1] }, +{ source: [0xD5FF], NFC: [0xD5FF], NFD: [0x1112, 0x1166, 0x11C2], NFKC: [0xD5FF], NFKD: [0x1112, 0x1166, 0x11C2] }, +{ source: [0xD600], NFC: [0xD600], NFD: [0x1112, 0x1167], NFKC: [0xD600], NFKD: [0x1112, 0x1167] }, +{ source: [0xD601], NFC: [0xD601], NFD: [0x1112, 0x1167, 0x11A8], NFKC: [0xD601], NFKD: [0x1112, 0x1167, 0x11A8] }, +{ source: [0xD602], NFC: [0xD602], NFD: [0x1112, 0x1167, 0x11A9], NFKC: [0xD602], NFKD: [0x1112, 0x1167, 0x11A9] }, +{ source: [0xD603], NFC: [0xD603], NFD: [0x1112, 0x1167, 0x11AA], NFKC: [0xD603], NFKD: [0x1112, 0x1167, 0x11AA] }, +{ source: [0xD604], NFC: [0xD604], NFD: [0x1112, 0x1167, 0x11AB], NFKC: [0xD604], NFKD: [0x1112, 0x1167, 0x11AB] }, +{ source: [0xD605], NFC: [0xD605], NFD: [0x1112, 0x1167, 0x11AC], NFKC: [0xD605], NFKD: [0x1112, 0x1167, 0x11AC] }, +{ source: [0xD606], NFC: [0xD606], NFD: [0x1112, 0x1167, 0x11AD], NFKC: [0xD606], NFKD: [0x1112, 0x1167, 0x11AD] }, +{ source: [0xD607], NFC: [0xD607], NFD: [0x1112, 0x1167, 0x11AE], NFKC: [0xD607], NFKD: [0x1112, 0x1167, 0x11AE] }, +{ source: [0xD608], NFC: [0xD608], NFD: [0x1112, 0x1167, 0x11AF], NFKC: [0xD608], NFKD: [0x1112, 0x1167, 0x11AF] }, +{ source: [0xD609], NFC: [0xD609], NFD: [0x1112, 0x1167, 0x11B0], NFKC: [0xD609], NFKD: [0x1112, 0x1167, 0x11B0] }, +{ source: [0xD60A], NFC: [0xD60A], NFD: [0x1112, 0x1167, 0x11B1], NFKC: [0xD60A], NFKD: [0x1112, 0x1167, 0x11B1] }, +{ source: [0xD60B], NFC: [0xD60B], NFD: [0x1112, 0x1167, 0x11B2], NFKC: [0xD60B], NFKD: [0x1112, 0x1167, 0x11B2] }, +{ source: [0xD60C], NFC: [0xD60C], NFD: [0x1112, 0x1167, 0x11B3], NFKC: [0xD60C], NFKD: [0x1112, 0x1167, 0x11B3] }, +{ source: [0xD60D], NFC: [0xD60D], NFD: [0x1112, 0x1167, 0x11B4], NFKC: [0xD60D], NFKD: [0x1112, 0x1167, 0x11B4] }, +{ source: [0xD60E], NFC: [0xD60E], NFD: [0x1112, 0x1167, 0x11B5], NFKC: [0xD60E], NFKD: [0x1112, 0x1167, 0x11B5] }, +{ source: [0xD60F], NFC: [0xD60F], NFD: [0x1112, 0x1167, 0x11B6], NFKC: [0xD60F], NFKD: [0x1112, 0x1167, 0x11B6] }, +{ source: [0xD610], NFC: [0xD610], NFD: [0x1112, 0x1167, 0x11B7], NFKC: [0xD610], NFKD: [0x1112, 0x1167, 0x11B7] }, +{ source: [0xD611], NFC: [0xD611], NFD: [0x1112, 0x1167, 0x11B8], NFKC: [0xD611], NFKD: [0x1112, 0x1167, 0x11B8] }, +{ source: [0xD612], NFC: [0xD612], NFD: [0x1112, 0x1167, 0x11B9], NFKC: [0xD612], NFKD: [0x1112, 0x1167, 0x11B9] }, +{ source: [0xD613], NFC: [0xD613], NFD: [0x1112, 0x1167, 0x11BA], NFKC: [0xD613], NFKD: [0x1112, 0x1167, 0x11BA] }, +{ source: [0xD614], NFC: [0xD614], NFD: [0x1112, 0x1167, 0x11BB], NFKC: [0xD614], NFKD: [0x1112, 0x1167, 0x11BB] }, +{ source: [0xD615], NFC: [0xD615], NFD: [0x1112, 0x1167, 0x11BC], NFKC: [0xD615], NFKD: [0x1112, 0x1167, 0x11BC] }, +{ source: [0xD616], NFC: [0xD616], NFD: [0x1112, 0x1167, 0x11BD], NFKC: [0xD616], NFKD: [0x1112, 0x1167, 0x11BD] }, +{ source: [0xD617], NFC: [0xD617], NFD: [0x1112, 0x1167, 0x11BE], NFKC: [0xD617], NFKD: [0x1112, 0x1167, 0x11BE] }, +{ source: [0xD618], NFC: [0xD618], NFD: [0x1112, 0x1167, 0x11BF], NFKC: [0xD618], NFKD: [0x1112, 0x1167, 0x11BF] }, +{ source: [0xD619], NFC: [0xD619], NFD: [0x1112, 0x1167, 0x11C0], NFKC: [0xD619], NFKD: [0x1112, 0x1167, 0x11C0] }, +{ source: [0xD61A], NFC: [0xD61A], NFD: [0x1112, 0x1167, 0x11C1], NFKC: [0xD61A], NFKD: [0x1112, 0x1167, 0x11C1] }, +{ source: [0xD61B], NFC: [0xD61B], NFD: [0x1112, 0x1167, 0x11C2], NFKC: [0xD61B], NFKD: [0x1112, 0x1167, 0x11C2] }, +{ source: [0xD61C], NFC: [0xD61C], NFD: [0x1112, 0x1168], NFKC: [0xD61C], NFKD: [0x1112, 0x1168] }, +{ source: [0xD61D], NFC: [0xD61D], NFD: [0x1112, 0x1168, 0x11A8], NFKC: [0xD61D], NFKD: [0x1112, 0x1168, 0x11A8] }, +{ source: [0xD61E], NFC: [0xD61E], NFD: [0x1112, 0x1168, 0x11A9], NFKC: [0xD61E], NFKD: [0x1112, 0x1168, 0x11A9] }, +{ source: [0xD61F], NFC: [0xD61F], NFD: [0x1112, 0x1168, 0x11AA], NFKC: [0xD61F], NFKD: [0x1112, 0x1168, 0x11AA] }, +{ source: [0xD620], NFC: [0xD620], NFD: [0x1112, 0x1168, 0x11AB], NFKC: [0xD620], NFKD: [0x1112, 0x1168, 0x11AB] }, +{ source: [0xD621], NFC: [0xD621], NFD: [0x1112, 0x1168, 0x11AC], NFKC: [0xD621], NFKD: [0x1112, 0x1168, 0x11AC] }, +{ source: [0xD622], NFC: [0xD622], NFD: [0x1112, 0x1168, 0x11AD], NFKC: [0xD622], NFKD: [0x1112, 0x1168, 0x11AD] }, +{ source: [0xD623], NFC: [0xD623], NFD: [0x1112, 0x1168, 0x11AE], NFKC: [0xD623], NFKD: [0x1112, 0x1168, 0x11AE] }, +{ source: [0xD624], NFC: [0xD624], NFD: [0x1112, 0x1168, 0x11AF], NFKC: [0xD624], NFKD: [0x1112, 0x1168, 0x11AF] }, +{ source: [0xD625], NFC: [0xD625], NFD: [0x1112, 0x1168, 0x11B0], NFKC: [0xD625], NFKD: [0x1112, 0x1168, 0x11B0] }, +{ source: [0xD626], NFC: [0xD626], NFD: [0x1112, 0x1168, 0x11B1], NFKC: [0xD626], NFKD: [0x1112, 0x1168, 0x11B1] }, +{ source: [0xD627], NFC: [0xD627], NFD: [0x1112, 0x1168, 0x11B2], NFKC: [0xD627], NFKD: [0x1112, 0x1168, 0x11B2] }, +{ source: [0xD628], NFC: [0xD628], NFD: [0x1112, 0x1168, 0x11B3], NFKC: [0xD628], NFKD: [0x1112, 0x1168, 0x11B3] }, +{ source: [0xD629], NFC: [0xD629], NFD: [0x1112, 0x1168, 0x11B4], NFKC: [0xD629], NFKD: [0x1112, 0x1168, 0x11B4] }, +{ source: [0xD62A], NFC: [0xD62A], NFD: [0x1112, 0x1168, 0x11B5], NFKC: [0xD62A], NFKD: [0x1112, 0x1168, 0x11B5] }, +{ source: [0xD62B], NFC: [0xD62B], NFD: [0x1112, 0x1168, 0x11B6], NFKC: [0xD62B], NFKD: [0x1112, 0x1168, 0x11B6] }, +{ source: [0xD62C], NFC: [0xD62C], NFD: [0x1112, 0x1168, 0x11B7], NFKC: [0xD62C], NFKD: [0x1112, 0x1168, 0x11B7] }, +{ source: [0xD62D], NFC: [0xD62D], NFD: [0x1112, 0x1168, 0x11B8], NFKC: [0xD62D], NFKD: [0x1112, 0x1168, 0x11B8] }, +{ source: [0xD62E], NFC: [0xD62E], NFD: [0x1112, 0x1168, 0x11B9], NFKC: [0xD62E], NFKD: [0x1112, 0x1168, 0x11B9] }, +{ source: [0xD62F], NFC: [0xD62F], NFD: [0x1112, 0x1168, 0x11BA], NFKC: [0xD62F], NFKD: [0x1112, 0x1168, 0x11BA] }, +{ source: [0xD630], NFC: [0xD630], NFD: [0x1112, 0x1168, 0x11BB], NFKC: [0xD630], NFKD: [0x1112, 0x1168, 0x11BB] }, +{ source: [0xD631], NFC: [0xD631], NFD: [0x1112, 0x1168, 0x11BC], NFKC: [0xD631], NFKD: [0x1112, 0x1168, 0x11BC] }, +{ source: [0xD632], NFC: [0xD632], NFD: [0x1112, 0x1168, 0x11BD], NFKC: [0xD632], NFKD: [0x1112, 0x1168, 0x11BD] }, +{ source: [0xD633], NFC: [0xD633], NFD: [0x1112, 0x1168, 0x11BE], NFKC: [0xD633], NFKD: [0x1112, 0x1168, 0x11BE] }, +{ source: [0xD634], NFC: [0xD634], NFD: [0x1112, 0x1168, 0x11BF], NFKC: [0xD634], NFKD: [0x1112, 0x1168, 0x11BF] }, +{ source: [0xD635], NFC: [0xD635], NFD: [0x1112, 0x1168, 0x11C0], NFKC: [0xD635], NFKD: [0x1112, 0x1168, 0x11C0] }, +{ source: [0xD636], NFC: [0xD636], NFD: [0x1112, 0x1168, 0x11C1], NFKC: [0xD636], NFKD: [0x1112, 0x1168, 0x11C1] }, +{ source: [0xD637], NFC: [0xD637], NFD: [0x1112, 0x1168, 0x11C2], NFKC: [0xD637], NFKD: [0x1112, 0x1168, 0x11C2] }, +{ source: [0xD638], NFC: [0xD638], NFD: [0x1112, 0x1169], NFKC: [0xD638], NFKD: [0x1112, 0x1169] }, +{ source: [0xD639], NFC: [0xD639], NFD: [0x1112, 0x1169, 0x11A8], NFKC: [0xD639], NFKD: [0x1112, 0x1169, 0x11A8] }, +{ source: [0xD63A], NFC: [0xD63A], NFD: [0x1112, 0x1169, 0x11A9], NFKC: [0xD63A], NFKD: [0x1112, 0x1169, 0x11A9] }, +{ source: [0xD63B], NFC: [0xD63B], NFD: [0x1112, 0x1169, 0x11AA], NFKC: [0xD63B], NFKD: [0x1112, 0x1169, 0x11AA] }, +{ source: [0xD63C], NFC: [0xD63C], NFD: [0x1112, 0x1169, 0x11AB], NFKC: [0xD63C], NFKD: [0x1112, 0x1169, 0x11AB] }, +{ source: [0xD63D], NFC: [0xD63D], NFD: [0x1112, 0x1169, 0x11AC], NFKC: [0xD63D], NFKD: [0x1112, 0x1169, 0x11AC] }, +{ source: [0xD63E], NFC: [0xD63E], NFD: [0x1112, 0x1169, 0x11AD], NFKC: [0xD63E], NFKD: [0x1112, 0x1169, 0x11AD] }, +{ source: [0xD63F], NFC: [0xD63F], NFD: [0x1112, 0x1169, 0x11AE], NFKC: [0xD63F], NFKD: [0x1112, 0x1169, 0x11AE] }, +{ source: [0xD640], NFC: [0xD640], NFD: [0x1112, 0x1169, 0x11AF], NFKC: [0xD640], NFKD: [0x1112, 0x1169, 0x11AF] }, +{ source: [0xD641], NFC: [0xD641], NFD: [0x1112, 0x1169, 0x11B0], NFKC: [0xD641], NFKD: [0x1112, 0x1169, 0x11B0] }, +{ source: [0xD642], NFC: [0xD642], NFD: [0x1112, 0x1169, 0x11B1], NFKC: [0xD642], NFKD: [0x1112, 0x1169, 0x11B1] }, +{ source: [0xD643], NFC: [0xD643], NFD: [0x1112, 0x1169, 0x11B2], NFKC: [0xD643], NFKD: [0x1112, 0x1169, 0x11B2] }, +{ source: [0xD644], NFC: [0xD644], NFD: [0x1112, 0x1169, 0x11B3], NFKC: [0xD644], NFKD: [0x1112, 0x1169, 0x11B3] }, +{ source: [0xD645], NFC: [0xD645], NFD: [0x1112, 0x1169, 0x11B4], NFKC: [0xD645], NFKD: [0x1112, 0x1169, 0x11B4] }, +{ source: [0xD646], NFC: [0xD646], NFD: [0x1112, 0x1169, 0x11B5], NFKC: [0xD646], NFKD: [0x1112, 0x1169, 0x11B5] }, +{ source: [0xD647], NFC: [0xD647], NFD: [0x1112, 0x1169, 0x11B6], NFKC: [0xD647], NFKD: [0x1112, 0x1169, 0x11B6] }, +{ source: [0xD648], NFC: [0xD648], NFD: [0x1112, 0x1169, 0x11B7], NFKC: [0xD648], NFKD: [0x1112, 0x1169, 0x11B7] }, +{ source: [0xD649], NFC: [0xD649], NFD: [0x1112, 0x1169, 0x11B8], NFKC: [0xD649], NFKD: [0x1112, 0x1169, 0x11B8] }, +{ source: [0xD64A], NFC: [0xD64A], NFD: [0x1112, 0x1169, 0x11B9], NFKC: [0xD64A], NFKD: [0x1112, 0x1169, 0x11B9] }, +{ source: [0xD64B], NFC: [0xD64B], NFD: [0x1112, 0x1169, 0x11BA], NFKC: [0xD64B], NFKD: [0x1112, 0x1169, 0x11BA] }, +{ source: [0xD64C], NFC: [0xD64C], NFD: [0x1112, 0x1169, 0x11BB], NFKC: [0xD64C], NFKD: [0x1112, 0x1169, 0x11BB] }, +{ source: [0xD64D], NFC: [0xD64D], NFD: [0x1112, 0x1169, 0x11BC], NFKC: [0xD64D], NFKD: [0x1112, 0x1169, 0x11BC] }, +{ source: [0xD64E], NFC: [0xD64E], NFD: [0x1112, 0x1169, 0x11BD], NFKC: [0xD64E], NFKD: [0x1112, 0x1169, 0x11BD] }, +{ source: [0xD64F], NFC: [0xD64F], NFD: [0x1112, 0x1169, 0x11BE], NFKC: [0xD64F], NFKD: [0x1112, 0x1169, 0x11BE] }, +{ source: [0xD650], NFC: [0xD650], NFD: [0x1112, 0x1169, 0x11BF], NFKC: [0xD650], NFKD: [0x1112, 0x1169, 0x11BF] }, +{ source: [0xD651], NFC: [0xD651], NFD: [0x1112, 0x1169, 0x11C0], NFKC: [0xD651], NFKD: [0x1112, 0x1169, 0x11C0] }, +{ source: [0xD652], NFC: [0xD652], NFD: [0x1112, 0x1169, 0x11C1], NFKC: [0xD652], NFKD: [0x1112, 0x1169, 0x11C1] }, +{ source: [0xD653], NFC: [0xD653], NFD: [0x1112, 0x1169, 0x11C2], NFKC: [0xD653], NFKD: [0x1112, 0x1169, 0x11C2] }, +{ source: [0xD654], NFC: [0xD654], NFD: [0x1112, 0x116A], NFKC: [0xD654], NFKD: [0x1112, 0x116A] }, +{ source: [0xD655], NFC: [0xD655], NFD: [0x1112, 0x116A, 0x11A8], NFKC: [0xD655], NFKD: [0x1112, 0x116A, 0x11A8] }, +{ source: [0xD656], NFC: [0xD656], NFD: [0x1112, 0x116A, 0x11A9], NFKC: [0xD656], NFKD: [0x1112, 0x116A, 0x11A9] }, +{ source: [0xD657], NFC: [0xD657], NFD: [0x1112, 0x116A, 0x11AA], NFKC: [0xD657], NFKD: [0x1112, 0x116A, 0x11AA] }, +{ source: [0xD658], NFC: [0xD658], NFD: [0x1112, 0x116A, 0x11AB], NFKC: [0xD658], NFKD: [0x1112, 0x116A, 0x11AB] }, +{ source: [0xD659], NFC: [0xD659], NFD: [0x1112, 0x116A, 0x11AC], NFKC: [0xD659], NFKD: [0x1112, 0x116A, 0x11AC] }, +{ source: [0xD65A], NFC: [0xD65A], NFD: [0x1112, 0x116A, 0x11AD], NFKC: [0xD65A], NFKD: [0x1112, 0x116A, 0x11AD] }, +{ source: [0xD65B], NFC: [0xD65B], NFD: [0x1112, 0x116A, 0x11AE], NFKC: [0xD65B], NFKD: [0x1112, 0x116A, 0x11AE] }, +{ source: [0xD65C], NFC: [0xD65C], NFD: [0x1112, 0x116A, 0x11AF], NFKC: [0xD65C], NFKD: [0x1112, 0x116A, 0x11AF] }, +{ source: [0xD65D], NFC: [0xD65D], NFD: [0x1112, 0x116A, 0x11B0], NFKC: [0xD65D], NFKD: [0x1112, 0x116A, 0x11B0] }, +{ source: [0xD65E], NFC: [0xD65E], NFD: [0x1112, 0x116A, 0x11B1], NFKC: [0xD65E], NFKD: [0x1112, 0x116A, 0x11B1] }, +{ source: [0xD65F], NFC: [0xD65F], NFD: [0x1112, 0x116A, 0x11B2], NFKC: [0xD65F], NFKD: [0x1112, 0x116A, 0x11B2] }, +{ source: [0xD660], NFC: [0xD660], NFD: [0x1112, 0x116A, 0x11B3], NFKC: [0xD660], NFKD: [0x1112, 0x116A, 0x11B3] }, +{ source: [0xD661], NFC: [0xD661], NFD: [0x1112, 0x116A, 0x11B4], NFKC: [0xD661], NFKD: [0x1112, 0x116A, 0x11B4] }, +{ source: [0xD662], NFC: [0xD662], NFD: [0x1112, 0x116A, 0x11B5], NFKC: [0xD662], NFKD: [0x1112, 0x116A, 0x11B5] }, +{ source: [0xD663], NFC: [0xD663], NFD: [0x1112, 0x116A, 0x11B6], NFKC: [0xD663], NFKD: [0x1112, 0x116A, 0x11B6] }, +{ source: [0xD664], NFC: [0xD664], NFD: [0x1112, 0x116A, 0x11B7], NFKC: [0xD664], NFKD: [0x1112, 0x116A, 0x11B7] }, +{ source: [0xD665], NFC: [0xD665], NFD: [0x1112, 0x116A, 0x11B8], NFKC: [0xD665], NFKD: [0x1112, 0x116A, 0x11B8] }, +{ source: [0xD666], NFC: [0xD666], NFD: [0x1112, 0x116A, 0x11B9], NFKC: [0xD666], NFKD: [0x1112, 0x116A, 0x11B9] }, +{ source: [0xD667], NFC: [0xD667], NFD: [0x1112, 0x116A, 0x11BA], NFKC: [0xD667], NFKD: [0x1112, 0x116A, 0x11BA] }, +{ source: [0xD668], NFC: [0xD668], NFD: [0x1112, 0x116A, 0x11BB], NFKC: [0xD668], NFKD: [0x1112, 0x116A, 0x11BB] }, +{ source: [0xD669], NFC: [0xD669], NFD: [0x1112, 0x116A, 0x11BC], NFKC: [0xD669], NFKD: [0x1112, 0x116A, 0x11BC] }, +{ source: [0xD66A], NFC: [0xD66A], NFD: [0x1112, 0x116A, 0x11BD], NFKC: [0xD66A], NFKD: [0x1112, 0x116A, 0x11BD] }, +{ source: [0xD66B], NFC: [0xD66B], NFD: [0x1112, 0x116A, 0x11BE], NFKC: [0xD66B], NFKD: [0x1112, 0x116A, 0x11BE] }, +{ source: [0xD66C], NFC: [0xD66C], NFD: [0x1112, 0x116A, 0x11BF], NFKC: [0xD66C], NFKD: [0x1112, 0x116A, 0x11BF] }, +{ source: [0xD66D], NFC: [0xD66D], NFD: [0x1112, 0x116A, 0x11C0], NFKC: [0xD66D], NFKD: [0x1112, 0x116A, 0x11C0] }, +{ source: [0xD66E], NFC: [0xD66E], NFD: [0x1112, 0x116A, 0x11C1], NFKC: [0xD66E], NFKD: [0x1112, 0x116A, 0x11C1] }, +{ source: [0xD66F], NFC: [0xD66F], NFD: [0x1112, 0x116A, 0x11C2], NFKC: [0xD66F], NFKD: [0x1112, 0x116A, 0x11C2] }, +{ source: [0xD670], NFC: [0xD670], NFD: [0x1112, 0x116B], NFKC: [0xD670], NFKD: [0x1112, 0x116B] }, +{ source: [0xD671], NFC: [0xD671], NFD: [0x1112, 0x116B, 0x11A8], NFKC: [0xD671], NFKD: [0x1112, 0x116B, 0x11A8] }, +{ source: [0xD672], NFC: [0xD672], NFD: [0x1112, 0x116B, 0x11A9], NFKC: [0xD672], NFKD: [0x1112, 0x116B, 0x11A9] }, +{ source: [0xD673], NFC: [0xD673], NFD: [0x1112, 0x116B, 0x11AA], NFKC: [0xD673], NFKD: [0x1112, 0x116B, 0x11AA] }, +{ source: [0xD674], NFC: [0xD674], NFD: [0x1112, 0x116B, 0x11AB], NFKC: [0xD674], NFKD: [0x1112, 0x116B, 0x11AB] }, +{ source: [0xD675], NFC: [0xD675], NFD: [0x1112, 0x116B, 0x11AC], NFKC: [0xD675], NFKD: [0x1112, 0x116B, 0x11AC] }, +{ source: [0xD676], NFC: [0xD676], NFD: [0x1112, 0x116B, 0x11AD], NFKC: [0xD676], NFKD: [0x1112, 0x116B, 0x11AD] }, +{ source: [0xD677], NFC: [0xD677], NFD: [0x1112, 0x116B, 0x11AE], NFKC: [0xD677], NFKD: [0x1112, 0x116B, 0x11AE] }, +{ source: [0xD678], NFC: [0xD678], NFD: [0x1112, 0x116B, 0x11AF], NFKC: [0xD678], NFKD: [0x1112, 0x116B, 0x11AF] }, +{ source: [0xD679], NFC: [0xD679], NFD: [0x1112, 0x116B, 0x11B0], NFKC: [0xD679], NFKD: [0x1112, 0x116B, 0x11B0] }, +{ source: [0xD67A], NFC: [0xD67A], NFD: [0x1112, 0x116B, 0x11B1], NFKC: [0xD67A], NFKD: [0x1112, 0x116B, 0x11B1] }, +{ source: [0xD67B], NFC: [0xD67B], NFD: [0x1112, 0x116B, 0x11B2], NFKC: [0xD67B], NFKD: [0x1112, 0x116B, 0x11B2] }, +{ source: [0xD67C], NFC: [0xD67C], NFD: [0x1112, 0x116B, 0x11B3], NFKC: [0xD67C], NFKD: [0x1112, 0x116B, 0x11B3] }, +{ source: [0xD67D], NFC: [0xD67D], NFD: [0x1112, 0x116B, 0x11B4], NFKC: [0xD67D], NFKD: [0x1112, 0x116B, 0x11B4] }, +{ source: [0xD67E], NFC: [0xD67E], NFD: [0x1112, 0x116B, 0x11B5], NFKC: [0xD67E], NFKD: [0x1112, 0x116B, 0x11B5] }, +{ source: [0xD67F], NFC: [0xD67F], NFD: [0x1112, 0x116B, 0x11B6], NFKC: [0xD67F], NFKD: [0x1112, 0x116B, 0x11B6] }, +{ source: [0xD680], NFC: [0xD680], NFD: [0x1112, 0x116B, 0x11B7], NFKC: [0xD680], NFKD: [0x1112, 0x116B, 0x11B7] }, +{ source: [0xD681], NFC: [0xD681], NFD: [0x1112, 0x116B, 0x11B8], NFKC: [0xD681], NFKD: [0x1112, 0x116B, 0x11B8] }, +{ source: [0xD682], NFC: [0xD682], NFD: [0x1112, 0x116B, 0x11B9], NFKC: [0xD682], NFKD: [0x1112, 0x116B, 0x11B9] }, +{ source: [0xD683], NFC: [0xD683], NFD: [0x1112, 0x116B, 0x11BA], NFKC: [0xD683], NFKD: [0x1112, 0x116B, 0x11BA] }, +{ source: [0xD684], NFC: [0xD684], NFD: [0x1112, 0x116B, 0x11BB], NFKC: [0xD684], NFKD: [0x1112, 0x116B, 0x11BB] }, +{ source: [0xD685], NFC: [0xD685], NFD: [0x1112, 0x116B, 0x11BC], NFKC: [0xD685], NFKD: [0x1112, 0x116B, 0x11BC] }, +{ source: [0xD686], NFC: [0xD686], NFD: [0x1112, 0x116B, 0x11BD], NFKC: [0xD686], NFKD: [0x1112, 0x116B, 0x11BD] }, +{ source: [0xD687], NFC: [0xD687], NFD: [0x1112, 0x116B, 0x11BE], NFKC: [0xD687], NFKD: [0x1112, 0x116B, 0x11BE] }, +{ source: [0xD688], NFC: [0xD688], NFD: [0x1112, 0x116B, 0x11BF], NFKC: [0xD688], NFKD: [0x1112, 0x116B, 0x11BF] }, +{ source: [0xD689], NFC: [0xD689], NFD: [0x1112, 0x116B, 0x11C0], NFKC: [0xD689], NFKD: [0x1112, 0x116B, 0x11C0] }, +{ source: [0xD68A], NFC: [0xD68A], NFD: [0x1112, 0x116B, 0x11C1], NFKC: [0xD68A], NFKD: [0x1112, 0x116B, 0x11C1] }, +{ source: [0xD68B], NFC: [0xD68B], NFD: [0x1112, 0x116B, 0x11C2], NFKC: [0xD68B], NFKD: [0x1112, 0x116B, 0x11C2] }, +{ source: [0xD68C], NFC: [0xD68C], NFD: [0x1112, 0x116C], NFKC: [0xD68C], NFKD: [0x1112, 0x116C] }, +{ source: [0xD68D], NFC: [0xD68D], NFD: [0x1112, 0x116C, 0x11A8], NFKC: [0xD68D], NFKD: [0x1112, 0x116C, 0x11A8] }, +{ source: [0xD68E], NFC: [0xD68E], NFD: [0x1112, 0x116C, 0x11A9], NFKC: [0xD68E], NFKD: [0x1112, 0x116C, 0x11A9] }, +{ source: [0xD68F], NFC: [0xD68F], NFD: [0x1112, 0x116C, 0x11AA], NFKC: [0xD68F], NFKD: [0x1112, 0x116C, 0x11AA] }, +{ source: [0xD690], NFC: [0xD690], NFD: [0x1112, 0x116C, 0x11AB], NFKC: [0xD690], NFKD: [0x1112, 0x116C, 0x11AB] }, +{ source: [0xD691], NFC: [0xD691], NFD: [0x1112, 0x116C, 0x11AC], NFKC: [0xD691], NFKD: [0x1112, 0x116C, 0x11AC] }, +{ source: [0xD692], NFC: [0xD692], NFD: [0x1112, 0x116C, 0x11AD], NFKC: [0xD692], NFKD: [0x1112, 0x116C, 0x11AD] }, +{ source: [0xD693], NFC: [0xD693], NFD: [0x1112, 0x116C, 0x11AE], NFKC: [0xD693], NFKD: [0x1112, 0x116C, 0x11AE] }, +{ source: [0xD694], NFC: [0xD694], NFD: [0x1112, 0x116C, 0x11AF], NFKC: [0xD694], NFKD: [0x1112, 0x116C, 0x11AF] }, +{ source: [0xD695], NFC: [0xD695], NFD: [0x1112, 0x116C, 0x11B0], NFKC: [0xD695], NFKD: [0x1112, 0x116C, 0x11B0] }, +{ source: [0xD696], NFC: [0xD696], NFD: [0x1112, 0x116C, 0x11B1], NFKC: [0xD696], NFKD: [0x1112, 0x116C, 0x11B1] }, +{ source: [0xD697], NFC: [0xD697], NFD: [0x1112, 0x116C, 0x11B2], NFKC: [0xD697], NFKD: [0x1112, 0x116C, 0x11B2] }, +{ source: [0xD698], NFC: [0xD698], NFD: [0x1112, 0x116C, 0x11B3], NFKC: [0xD698], NFKD: [0x1112, 0x116C, 0x11B3] }, +{ source: [0xD699], NFC: [0xD699], NFD: [0x1112, 0x116C, 0x11B4], NFKC: [0xD699], NFKD: [0x1112, 0x116C, 0x11B4] }, +{ source: [0xD69A], NFC: [0xD69A], NFD: [0x1112, 0x116C, 0x11B5], NFKC: [0xD69A], NFKD: [0x1112, 0x116C, 0x11B5] }, +{ source: [0xD69B], NFC: [0xD69B], NFD: [0x1112, 0x116C, 0x11B6], NFKC: [0xD69B], NFKD: [0x1112, 0x116C, 0x11B6] }, +{ source: [0xD69C], NFC: [0xD69C], NFD: [0x1112, 0x116C, 0x11B7], NFKC: [0xD69C], NFKD: [0x1112, 0x116C, 0x11B7] }, +{ source: [0xD69D], NFC: [0xD69D], NFD: [0x1112, 0x116C, 0x11B8], NFKC: [0xD69D], NFKD: [0x1112, 0x116C, 0x11B8] }, +{ source: [0xD69E], NFC: [0xD69E], NFD: [0x1112, 0x116C, 0x11B9], NFKC: [0xD69E], NFKD: [0x1112, 0x116C, 0x11B9] }, +{ source: [0xD69F], NFC: [0xD69F], NFD: [0x1112, 0x116C, 0x11BA], NFKC: [0xD69F], NFKD: [0x1112, 0x116C, 0x11BA] }, +{ source: [0xD6A0], NFC: [0xD6A0], NFD: [0x1112, 0x116C, 0x11BB], NFKC: [0xD6A0], NFKD: [0x1112, 0x116C, 0x11BB] }, +{ source: [0xD6A1], NFC: [0xD6A1], NFD: [0x1112, 0x116C, 0x11BC], NFKC: [0xD6A1], NFKD: [0x1112, 0x116C, 0x11BC] }, +{ source: [0xD6A2], NFC: [0xD6A2], NFD: [0x1112, 0x116C, 0x11BD], NFKC: [0xD6A2], NFKD: [0x1112, 0x116C, 0x11BD] }, +{ source: [0xD6A3], NFC: [0xD6A3], NFD: [0x1112, 0x116C, 0x11BE], NFKC: [0xD6A3], NFKD: [0x1112, 0x116C, 0x11BE] }, +{ source: [0xD6A4], NFC: [0xD6A4], NFD: [0x1112, 0x116C, 0x11BF], NFKC: [0xD6A4], NFKD: [0x1112, 0x116C, 0x11BF] }, +{ source: [0xD6A5], NFC: [0xD6A5], NFD: [0x1112, 0x116C, 0x11C0], NFKC: [0xD6A5], NFKD: [0x1112, 0x116C, 0x11C0] }, +{ source: [0xD6A6], NFC: [0xD6A6], NFD: [0x1112, 0x116C, 0x11C1], NFKC: [0xD6A6], NFKD: [0x1112, 0x116C, 0x11C1] }, +{ source: [0xD6A7], NFC: [0xD6A7], NFD: [0x1112, 0x116C, 0x11C2], NFKC: [0xD6A7], NFKD: [0x1112, 0x116C, 0x11C2] }, +{ source: [0xD6A8], NFC: [0xD6A8], NFD: [0x1112, 0x116D], NFKC: [0xD6A8], NFKD: [0x1112, 0x116D] }, +{ source: [0xD6A9], NFC: [0xD6A9], NFD: [0x1112, 0x116D, 0x11A8], NFKC: [0xD6A9], NFKD: [0x1112, 0x116D, 0x11A8] }, +{ source: [0xD6AA], NFC: [0xD6AA], NFD: [0x1112, 0x116D, 0x11A9], NFKC: [0xD6AA], NFKD: [0x1112, 0x116D, 0x11A9] }, +{ source: [0xD6AB], NFC: [0xD6AB], NFD: [0x1112, 0x116D, 0x11AA], NFKC: [0xD6AB], NFKD: [0x1112, 0x116D, 0x11AA] }, +{ source: [0xD6AC], NFC: [0xD6AC], NFD: [0x1112, 0x116D, 0x11AB], NFKC: [0xD6AC], NFKD: [0x1112, 0x116D, 0x11AB] }, +{ source: [0xD6AD], NFC: [0xD6AD], NFD: [0x1112, 0x116D, 0x11AC], NFKC: [0xD6AD], NFKD: [0x1112, 0x116D, 0x11AC] }, +{ source: [0xD6AE], NFC: [0xD6AE], NFD: [0x1112, 0x116D, 0x11AD], NFKC: [0xD6AE], NFKD: [0x1112, 0x116D, 0x11AD] }, +{ source: [0xD6AF], NFC: [0xD6AF], NFD: [0x1112, 0x116D, 0x11AE], NFKC: [0xD6AF], NFKD: [0x1112, 0x116D, 0x11AE] }, +{ source: [0xD6B0], NFC: [0xD6B0], NFD: [0x1112, 0x116D, 0x11AF], NFKC: [0xD6B0], NFKD: [0x1112, 0x116D, 0x11AF] }, +{ source: [0xD6B1], NFC: [0xD6B1], NFD: [0x1112, 0x116D, 0x11B0], NFKC: [0xD6B1], NFKD: [0x1112, 0x116D, 0x11B0] }, +{ source: [0xD6B2], NFC: [0xD6B2], NFD: [0x1112, 0x116D, 0x11B1], NFKC: [0xD6B2], NFKD: [0x1112, 0x116D, 0x11B1] }, +{ source: [0xD6B3], NFC: [0xD6B3], NFD: [0x1112, 0x116D, 0x11B2], NFKC: [0xD6B3], NFKD: [0x1112, 0x116D, 0x11B2] }, +{ source: [0xD6B4], NFC: [0xD6B4], NFD: [0x1112, 0x116D, 0x11B3], NFKC: [0xD6B4], NFKD: [0x1112, 0x116D, 0x11B3] }, +{ source: [0xD6B5], NFC: [0xD6B5], NFD: [0x1112, 0x116D, 0x11B4], NFKC: [0xD6B5], NFKD: [0x1112, 0x116D, 0x11B4] }, +{ source: [0xD6B6], NFC: [0xD6B6], NFD: [0x1112, 0x116D, 0x11B5], NFKC: [0xD6B6], NFKD: [0x1112, 0x116D, 0x11B5] }, +{ source: [0xD6B7], NFC: [0xD6B7], NFD: [0x1112, 0x116D, 0x11B6], NFKC: [0xD6B7], NFKD: [0x1112, 0x116D, 0x11B6] }, +{ source: [0xD6B8], NFC: [0xD6B8], NFD: [0x1112, 0x116D, 0x11B7], NFKC: [0xD6B8], NFKD: [0x1112, 0x116D, 0x11B7] }, +{ source: [0xD6B9], NFC: [0xD6B9], NFD: [0x1112, 0x116D, 0x11B8], NFKC: [0xD6B9], NFKD: [0x1112, 0x116D, 0x11B8] }, +{ source: [0xD6BA], NFC: [0xD6BA], NFD: [0x1112, 0x116D, 0x11B9], NFKC: [0xD6BA], NFKD: [0x1112, 0x116D, 0x11B9] }, +{ source: [0xD6BB], NFC: [0xD6BB], NFD: [0x1112, 0x116D, 0x11BA], NFKC: [0xD6BB], NFKD: [0x1112, 0x116D, 0x11BA] }, +{ source: [0xD6BC], NFC: [0xD6BC], NFD: [0x1112, 0x116D, 0x11BB], NFKC: [0xD6BC], NFKD: [0x1112, 0x116D, 0x11BB] }, +{ source: [0xD6BD], NFC: [0xD6BD], NFD: [0x1112, 0x116D, 0x11BC], NFKC: [0xD6BD], NFKD: [0x1112, 0x116D, 0x11BC] }, +{ source: [0xD6BE], NFC: [0xD6BE], NFD: [0x1112, 0x116D, 0x11BD], NFKC: [0xD6BE], NFKD: [0x1112, 0x116D, 0x11BD] }, +{ source: [0xD6BF], NFC: [0xD6BF], NFD: [0x1112, 0x116D, 0x11BE], NFKC: [0xD6BF], NFKD: [0x1112, 0x116D, 0x11BE] }, +{ source: [0xD6C0], NFC: [0xD6C0], NFD: [0x1112, 0x116D, 0x11BF], NFKC: [0xD6C0], NFKD: [0x1112, 0x116D, 0x11BF] }, +{ source: [0xD6C1], NFC: [0xD6C1], NFD: [0x1112, 0x116D, 0x11C0], NFKC: [0xD6C1], NFKD: [0x1112, 0x116D, 0x11C0] }, +{ source: [0xD6C2], NFC: [0xD6C2], NFD: [0x1112, 0x116D, 0x11C1], NFKC: [0xD6C2], NFKD: [0x1112, 0x116D, 0x11C1] }, +{ source: [0xD6C3], NFC: [0xD6C3], NFD: [0x1112, 0x116D, 0x11C2], NFKC: [0xD6C3], NFKD: [0x1112, 0x116D, 0x11C2] }, +{ source: [0xD6C4], NFC: [0xD6C4], NFD: [0x1112, 0x116E], NFKC: [0xD6C4], NFKD: [0x1112, 0x116E] }, +{ source: [0xD6C5], NFC: [0xD6C5], NFD: [0x1112, 0x116E, 0x11A8], NFKC: [0xD6C5], NFKD: [0x1112, 0x116E, 0x11A8] }, +{ source: [0xD6C6], NFC: [0xD6C6], NFD: [0x1112, 0x116E, 0x11A9], NFKC: [0xD6C6], NFKD: [0x1112, 0x116E, 0x11A9] }, +{ source: [0xD6C7], NFC: [0xD6C7], NFD: [0x1112, 0x116E, 0x11AA], NFKC: [0xD6C7], NFKD: [0x1112, 0x116E, 0x11AA] }, +{ source: [0xD6C8], NFC: [0xD6C8], NFD: [0x1112, 0x116E, 0x11AB], NFKC: [0xD6C8], NFKD: [0x1112, 0x116E, 0x11AB] }, +{ source: [0xD6C9], NFC: [0xD6C9], NFD: [0x1112, 0x116E, 0x11AC], NFKC: [0xD6C9], NFKD: [0x1112, 0x116E, 0x11AC] }, +{ source: [0xD6CA], NFC: [0xD6CA], NFD: [0x1112, 0x116E, 0x11AD], NFKC: [0xD6CA], NFKD: [0x1112, 0x116E, 0x11AD] }, +{ source: [0xD6CB], NFC: [0xD6CB], NFD: [0x1112, 0x116E, 0x11AE], NFKC: [0xD6CB], NFKD: [0x1112, 0x116E, 0x11AE] }, +{ source: [0xD6CC], NFC: [0xD6CC], NFD: [0x1112, 0x116E, 0x11AF], NFKC: [0xD6CC], NFKD: [0x1112, 0x116E, 0x11AF] }, +{ source: [0xD6CD], NFC: [0xD6CD], NFD: [0x1112, 0x116E, 0x11B0], NFKC: [0xD6CD], NFKD: [0x1112, 0x116E, 0x11B0] }, +{ source: [0xD6CE], NFC: [0xD6CE], NFD: [0x1112, 0x116E, 0x11B1], NFKC: [0xD6CE], NFKD: [0x1112, 0x116E, 0x11B1] }, +{ source: [0xD6CF], NFC: [0xD6CF], NFD: [0x1112, 0x116E, 0x11B2], NFKC: [0xD6CF], NFKD: [0x1112, 0x116E, 0x11B2] }, +{ source: [0xD6D0], NFC: [0xD6D0], NFD: [0x1112, 0x116E, 0x11B3], NFKC: [0xD6D0], NFKD: [0x1112, 0x116E, 0x11B3] }, +{ source: [0xD6D1], NFC: [0xD6D1], NFD: [0x1112, 0x116E, 0x11B4], NFKC: [0xD6D1], NFKD: [0x1112, 0x116E, 0x11B4] }, +{ source: [0xD6D2], NFC: [0xD6D2], NFD: [0x1112, 0x116E, 0x11B5], NFKC: [0xD6D2], NFKD: [0x1112, 0x116E, 0x11B5] }, +{ source: [0xD6D3], NFC: [0xD6D3], NFD: [0x1112, 0x116E, 0x11B6], NFKC: [0xD6D3], NFKD: [0x1112, 0x116E, 0x11B6] }, +{ source: [0xD6D4], NFC: [0xD6D4], NFD: [0x1112, 0x116E, 0x11B7], NFKC: [0xD6D4], NFKD: [0x1112, 0x116E, 0x11B7] }, +{ source: [0xD6D5], NFC: [0xD6D5], NFD: [0x1112, 0x116E, 0x11B8], NFKC: [0xD6D5], NFKD: [0x1112, 0x116E, 0x11B8] }, +{ source: [0xD6D6], NFC: [0xD6D6], NFD: [0x1112, 0x116E, 0x11B9], NFKC: [0xD6D6], NFKD: [0x1112, 0x116E, 0x11B9] }, +{ source: [0xD6D7], NFC: [0xD6D7], NFD: [0x1112, 0x116E, 0x11BA], NFKC: [0xD6D7], NFKD: [0x1112, 0x116E, 0x11BA] }, +{ source: [0xD6D8], NFC: [0xD6D8], NFD: [0x1112, 0x116E, 0x11BB], NFKC: [0xD6D8], NFKD: [0x1112, 0x116E, 0x11BB] }, +{ source: [0xD6D9], NFC: [0xD6D9], NFD: [0x1112, 0x116E, 0x11BC], NFKC: [0xD6D9], NFKD: [0x1112, 0x116E, 0x11BC] }, +{ source: [0xD6DA], NFC: [0xD6DA], NFD: [0x1112, 0x116E, 0x11BD], NFKC: [0xD6DA], NFKD: [0x1112, 0x116E, 0x11BD] }, +{ source: [0xD6DB], NFC: [0xD6DB], NFD: [0x1112, 0x116E, 0x11BE], NFKC: [0xD6DB], NFKD: [0x1112, 0x116E, 0x11BE] }, +{ source: [0xD6DC], NFC: [0xD6DC], NFD: [0x1112, 0x116E, 0x11BF], NFKC: [0xD6DC], NFKD: [0x1112, 0x116E, 0x11BF] }, +{ source: [0xD6DD], NFC: [0xD6DD], NFD: [0x1112, 0x116E, 0x11C0], NFKC: [0xD6DD], NFKD: [0x1112, 0x116E, 0x11C0] }, +{ source: [0xD6DE], NFC: [0xD6DE], NFD: [0x1112, 0x116E, 0x11C1], NFKC: [0xD6DE], NFKD: [0x1112, 0x116E, 0x11C1] }, +{ source: [0xD6DF], NFC: [0xD6DF], NFD: [0x1112, 0x116E, 0x11C2], NFKC: [0xD6DF], NFKD: [0x1112, 0x116E, 0x11C2] }, +{ source: [0xD6E0], NFC: [0xD6E0], NFD: [0x1112, 0x116F], NFKC: [0xD6E0], NFKD: [0x1112, 0x116F] }, +{ source: [0xD6E1], NFC: [0xD6E1], NFD: [0x1112, 0x116F, 0x11A8], NFKC: [0xD6E1], NFKD: [0x1112, 0x116F, 0x11A8] }, +{ source: [0xD6E2], NFC: [0xD6E2], NFD: [0x1112, 0x116F, 0x11A9], NFKC: [0xD6E2], NFKD: [0x1112, 0x116F, 0x11A9] }, +{ source: [0xD6E3], NFC: [0xD6E3], NFD: [0x1112, 0x116F, 0x11AA], NFKC: [0xD6E3], NFKD: [0x1112, 0x116F, 0x11AA] }, +{ source: [0xD6E4], NFC: [0xD6E4], NFD: [0x1112, 0x116F, 0x11AB], NFKC: [0xD6E4], NFKD: [0x1112, 0x116F, 0x11AB] }, +{ source: [0xD6E5], NFC: [0xD6E5], NFD: [0x1112, 0x116F, 0x11AC], NFKC: [0xD6E5], NFKD: [0x1112, 0x116F, 0x11AC] }, +{ source: [0xD6E6], NFC: [0xD6E6], NFD: [0x1112, 0x116F, 0x11AD], NFKC: [0xD6E6], NFKD: [0x1112, 0x116F, 0x11AD] }, +{ source: [0xD6E7], NFC: [0xD6E7], NFD: [0x1112, 0x116F, 0x11AE], NFKC: [0xD6E7], NFKD: [0x1112, 0x116F, 0x11AE] }, +{ source: [0xD6E8], NFC: [0xD6E8], NFD: [0x1112, 0x116F, 0x11AF], NFKC: [0xD6E8], NFKD: [0x1112, 0x116F, 0x11AF] }, +{ source: [0xD6E9], NFC: [0xD6E9], NFD: [0x1112, 0x116F, 0x11B0], NFKC: [0xD6E9], NFKD: [0x1112, 0x116F, 0x11B0] }, +{ source: [0xD6EA], NFC: [0xD6EA], NFD: [0x1112, 0x116F, 0x11B1], NFKC: [0xD6EA], NFKD: [0x1112, 0x116F, 0x11B1] }, +{ source: [0xD6EB], NFC: [0xD6EB], NFD: [0x1112, 0x116F, 0x11B2], NFKC: [0xD6EB], NFKD: [0x1112, 0x116F, 0x11B2] }, +{ source: [0xD6EC], NFC: [0xD6EC], NFD: [0x1112, 0x116F, 0x11B3], NFKC: [0xD6EC], NFKD: [0x1112, 0x116F, 0x11B3] }, +{ source: [0xD6ED], NFC: [0xD6ED], NFD: [0x1112, 0x116F, 0x11B4], NFKC: [0xD6ED], NFKD: [0x1112, 0x116F, 0x11B4] }, +{ source: [0xD6EE], NFC: [0xD6EE], NFD: [0x1112, 0x116F, 0x11B5], NFKC: [0xD6EE], NFKD: [0x1112, 0x116F, 0x11B5] }, +{ source: [0xD6EF], NFC: [0xD6EF], NFD: [0x1112, 0x116F, 0x11B6], NFKC: [0xD6EF], NFKD: [0x1112, 0x116F, 0x11B6] }, +{ source: [0xD6F0], NFC: [0xD6F0], NFD: [0x1112, 0x116F, 0x11B7], NFKC: [0xD6F0], NFKD: [0x1112, 0x116F, 0x11B7] }, +{ source: [0xD6F1], NFC: [0xD6F1], NFD: [0x1112, 0x116F, 0x11B8], NFKC: [0xD6F1], NFKD: [0x1112, 0x116F, 0x11B8] }, +{ source: [0xD6F2], NFC: [0xD6F2], NFD: [0x1112, 0x116F, 0x11B9], NFKC: [0xD6F2], NFKD: [0x1112, 0x116F, 0x11B9] }, +{ source: [0xD6F3], NFC: [0xD6F3], NFD: [0x1112, 0x116F, 0x11BA], NFKC: [0xD6F3], NFKD: [0x1112, 0x116F, 0x11BA] }, +{ source: [0xD6F4], NFC: [0xD6F4], NFD: [0x1112, 0x116F, 0x11BB], NFKC: [0xD6F4], NFKD: [0x1112, 0x116F, 0x11BB] }, +{ source: [0xD6F5], NFC: [0xD6F5], NFD: [0x1112, 0x116F, 0x11BC], NFKC: [0xD6F5], NFKD: [0x1112, 0x116F, 0x11BC] }, +{ source: [0xD6F6], NFC: [0xD6F6], NFD: [0x1112, 0x116F, 0x11BD], NFKC: [0xD6F6], NFKD: [0x1112, 0x116F, 0x11BD] }, +{ source: [0xD6F7], NFC: [0xD6F7], NFD: [0x1112, 0x116F, 0x11BE], NFKC: [0xD6F7], NFKD: [0x1112, 0x116F, 0x11BE] }, +{ source: [0xD6F8], NFC: [0xD6F8], NFD: [0x1112, 0x116F, 0x11BF], NFKC: [0xD6F8], NFKD: [0x1112, 0x116F, 0x11BF] }, +{ source: [0xD6F9], NFC: [0xD6F9], NFD: [0x1112, 0x116F, 0x11C0], NFKC: [0xD6F9], NFKD: [0x1112, 0x116F, 0x11C0] }, +{ source: [0xD6FA], NFC: [0xD6FA], NFD: [0x1112, 0x116F, 0x11C1], NFKC: [0xD6FA], NFKD: [0x1112, 0x116F, 0x11C1] }, +{ source: [0xD6FB], NFC: [0xD6FB], NFD: [0x1112, 0x116F, 0x11C2], NFKC: [0xD6FB], NFKD: [0x1112, 0x116F, 0x11C2] }, +{ source: [0xD6FC], NFC: [0xD6FC], NFD: [0x1112, 0x1170], NFKC: [0xD6FC], NFKD: [0x1112, 0x1170] }, +{ source: [0xD6FD], NFC: [0xD6FD], NFD: [0x1112, 0x1170, 0x11A8], NFKC: [0xD6FD], NFKD: [0x1112, 0x1170, 0x11A8] }, +{ source: [0xD6FE], NFC: [0xD6FE], NFD: [0x1112, 0x1170, 0x11A9], NFKC: [0xD6FE], NFKD: [0x1112, 0x1170, 0x11A9] }, +{ source: [0xD6FF], NFC: [0xD6FF], NFD: [0x1112, 0x1170, 0x11AA], NFKC: [0xD6FF], NFKD: [0x1112, 0x1170, 0x11AA] }, +{ source: [0xD700], NFC: [0xD700], NFD: [0x1112, 0x1170, 0x11AB], NFKC: [0xD700], NFKD: [0x1112, 0x1170, 0x11AB] }, +{ source: [0xD701], NFC: [0xD701], NFD: [0x1112, 0x1170, 0x11AC], NFKC: [0xD701], NFKD: [0x1112, 0x1170, 0x11AC] }, +{ source: [0xD702], NFC: [0xD702], NFD: [0x1112, 0x1170, 0x11AD], NFKC: [0xD702], NFKD: [0x1112, 0x1170, 0x11AD] }, +{ source: [0xD703], NFC: [0xD703], NFD: [0x1112, 0x1170, 0x11AE], NFKC: [0xD703], NFKD: [0x1112, 0x1170, 0x11AE] }, +{ source: [0xD704], NFC: [0xD704], NFD: [0x1112, 0x1170, 0x11AF], NFKC: [0xD704], NFKD: [0x1112, 0x1170, 0x11AF] }, +{ source: [0xD705], NFC: [0xD705], NFD: [0x1112, 0x1170, 0x11B0], NFKC: [0xD705], NFKD: [0x1112, 0x1170, 0x11B0] }, +{ source: [0xD706], NFC: [0xD706], NFD: [0x1112, 0x1170, 0x11B1], NFKC: [0xD706], NFKD: [0x1112, 0x1170, 0x11B1] }, +{ source: [0xD707], NFC: [0xD707], NFD: [0x1112, 0x1170, 0x11B2], NFKC: [0xD707], NFKD: [0x1112, 0x1170, 0x11B2] }, +{ source: [0xD708], NFC: [0xD708], NFD: [0x1112, 0x1170, 0x11B3], NFKC: [0xD708], NFKD: [0x1112, 0x1170, 0x11B3] }, +{ source: [0xD709], NFC: [0xD709], NFD: [0x1112, 0x1170, 0x11B4], NFKC: [0xD709], NFKD: [0x1112, 0x1170, 0x11B4] }, +{ source: [0xD70A], NFC: [0xD70A], NFD: [0x1112, 0x1170, 0x11B5], NFKC: [0xD70A], NFKD: [0x1112, 0x1170, 0x11B5] }, +{ source: [0xD70B], NFC: [0xD70B], NFD: [0x1112, 0x1170, 0x11B6], NFKC: [0xD70B], NFKD: [0x1112, 0x1170, 0x11B6] }, +{ source: [0xD70C], NFC: [0xD70C], NFD: [0x1112, 0x1170, 0x11B7], NFKC: [0xD70C], NFKD: [0x1112, 0x1170, 0x11B7] }, +{ source: [0xD70D], NFC: [0xD70D], NFD: [0x1112, 0x1170, 0x11B8], NFKC: [0xD70D], NFKD: [0x1112, 0x1170, 0x11B8] }, +{ source: [0xD70E], NFC: [0xD70E], NFD: [0x1112, 0x1170, 0x11B9], NFKC: [0xD70E], NFKD: [0x1112, 0x1170, 0x11B9] }, +{ source: [0xD70F], NFC: [0xD70F], NFD: [0x1112, 0x1170, 0x11BA], NFKC: [0xD70F], NFKD: [0x1112, 0x1170, 0x11BA] }, +{ source: [0xD710], NFC: [0xD710], NFD: [0x1112, 0x1170, 0x11BB], NFKC: [0xD710], NFKD: [0x1112, 0x1170, 0x11BB] }, +{ source: [0xD711], NFC: [0xD711], NFD: [0x1112, 0x1170, 0x11BC], NFKC: [0xD711], NFKD: [0x1112, 0x1170, 0x11BC] }, +{ source: [0xD712], NFC: [0xD712], NFD: [0x1112, 0x1170, 0x11BD], NFKC: [0xD712], NFKD: [0x1112, 0x1170, 0x11BD] }, +{ source: [0xD713], NFC: [0xD713], NFD: [0x1112, 0x1170, 0x11BE], NFKC: [0xD713], NFKD: [0x1112, 0x1170, 0x11BE] }, +{ source: [0xD714], NFC: [0xD714], NFD: [0x1112, 0x1170, 0x11BF], NFKC: [0xD714], NFKD: [0x1112, 0x1170, 0x11BF] }, +{ source: [0xD715], NFC: [0xD715], NFD: [0x1112, 0x1170, 0x11C0], NFKC: [0xD715], NFKD: [0x1112, 0x1170, 0x11C0] }, +{ source: [0xD716], NFC: [0xD716], NFD: [0x1112, 0x1170, 0x11C1], NFKC: [0xD716], NFKD: [0x1112, 0x1170, 0x11C1] }, +{ source: [0xD717], NFC: [0xD717], NFD: [0x1112, 0x1170, 0x11C2], NFKC: [0xD717], NFKD: [0x1112, 0x1170, 0x11C2] }, +{ source: [0xD718], NFC: [0xD718], NFD: [0x1112, 0x1171], NFKC: [0xD718], NFKD: [0x1112, 0x1171] }, +{ source: [0xD719], NFC: [0xD719], NFD: [0x1112, 0x1171, 0x11A8], NFKC: [0xD719], NFKD: [0x1112, 0x1171, 0x11A8] }, +{ source: [0xD71A], NFC: [0xD71A], NFD: [0x1112, 0x1171, 0x11A9], NFKC: [0xD71A], NFKD: [0x1112, 0x1171, 0x11A9] }, +{ source: [0xD71B], NFC: [0xD71B], NFD: [0x1112, 0x1171, 0x11AA], NFKC: [0xD71B], NFKD: [0x1112, 0x1171, 0x11AA] }, +{ source: [0xD71C], NFC: [0xD71C], NFD: [0x1112, 0x1171, 0x11AB], NFKC: [0xD71C], NFKD: [0x1112, 0x1171, 0x11AB] }, +{ source: [0xD71D], NFC: [0xD71D], NFD: [0x1112, 0x1171, 0x11AC], NFKC: [0xD71D], NFKD: [0x1112, 0x1171, 0x11AC] }, +{ source: [0xD71E], NFC: [0xD71E], NFD: [0x1112, 0x1171, 0x11AD], NFKC: [0xD71E], NFKD: [0x1112, 0x1171, 0x11AD] }, +{ source: [0xD71F], NFC: [0xD71F], NFD: [0x1112, 0x1171, 0x11AE], NFKC: [0xD71F], NFKD: [0x1112, 0x1171, 0x11AE] }, +{ source: [0xD720], NFC: [0xD720], NFD: [0x1112, 0x1171, 0x11AF], NFKC: [0xD720], NFKD: [0x1112, 0x1171, 0x11AF] }, +{ source: [0xD721], NFC: [0xD721], NFD: [0x1112, 0x1171, 0x11B0], NFKC: [0xD721], NFKD: [0x1112, 0x1171, 0x11B0] }, +{ source: [0xD722], NFC: [0xD722], NFD: [0x1112, 0x1171, 0x11B1], NFKC: [0xD722], NFKD: [0x1112, 0x1171, 0x11B1] }, +{ source: [0xD723], NFC: [0xD723], NFD: [0x1112, 0x1171, 0x11B2], NFKC: [0xD723], NFKD: [0x1112, 0x1171, 0x11B2] }, +{ source: [0xD724], NFC: [0xD724], NFD: [0x1112, 0x1171, 0x11B3], NFKC: [0xD724], NFKD: [0x1112, 0x1171, 0x11B3] }, +{ source: [0xD725], NFC: [0xD725], NFD: [0x1112, 0x1171, 0x11B4], NFKC: [0xD725], NFKD: [0x1112, 0x1171, 0x11B4] }, +{ source: [0xD726], NFC: [0xD726], NFD: [0x1112, 0x1171, 0x11B5], NFKC: [0xD726], NFKD: [0x1112, 0x1171, 0x11B5] }, +{ source: [0xD727], NFC: [0xD727], NFD: [0x1112, 0x1171, 0x11B6], NFKC: [0xD727], NFKD: [0x1112, 0x1171, 0x11B6] }, +{ source: [0xD728], NFC: [0xD728], NFD: [0x1112, 0x1171, 0x11B7], NFKC: [0xD728], NFKD: [0x1112, 0x1171, 0x11B7] }, +{ source: [0xD729], NFC: [0xD729], NFD: [0x1112, 0x1171, 0x11B8], NFKC: [0xD729], NFKD: [0x1112, 0x1171, 0x11B8] }, +{ source: [0xD72A], NFC: [0xD72A], NFD: [0x1112, 0x1171, 0x11B9], NFKC: [0xD72A], NFKD: [0x1112, 0x1171, 0x11B9] }, +{ source: [0xD72B], NFC: [0xD72B], NFD: [0x1112, 0x1171, 0x11BA], NFKC: [0xD72B], NFKD: [0x1112, 0x1171, 0x11BA] }, +{ source: [0xD72C], NFC: [0xD72C], NFD: [0x1112, 0x1171, 0x11BB], NFKC: [0xD72C], NFKD: [0x1112, 0x1171, 0x11BB] }, +{ source: [0xD72D], NFC: [0xD72D], NFD: [0x1112, 0x1171, 0x11BC], NFKC: [0xD72D], NFKD: [0x1112, 0x1171, 0x11BC] }, +{ source: [0xD72E], NFC: [0xD72E], NFD: [0x1112, 0x1171, 0x11BD], NFKC: [0xD72E], NFKD: [0x1112, 0x1171, 0x11BD] }, +{ source: [0xD72F], NFC: [0xD72F], NFD: [0x1112, 0x1171, 0x11BE], NFKC: [0xD72F], NFKD: [0x1112, 0x1171, 0x11BE] }, +{ source: [0xD730], NFC: [0xD730], NFD: [0x1112, 0x1171, 0x11BF], NFKC: [0xD730], NFKD: [0x1112, 0x1171, 0x11BF] }, +{ source: [0xD731], NFC: [0xD731], NFD: [0x1112, 0x1171, 0x11C0], NFKC: [0xD731], NFKD: [0x1112, 0x1171, 0x11C0] }, +{ source: [0xD732], NFC: [0xD732], NFD: [0x1112, 0x1171, 0x11C1], NFKC: [0xD732], NFKD: [0x1112, 0x1171, 0x11C1] }, +{ source: [0xD733], NFC: [0xD733], NFD: [0x1112, 0x1171, 0x11C2], NFKC: [0xD733], NFKD: [0x1112, 0x1171, 0x11C2] }, +{ source: [0xD734], NFC: [0xD734], NFD: [0x1112, 0x1172], NFKC: [0xD734], NFKD: [0x1112, 0x1172] }, +{ source: [0xD735], NFC: [0xD735], NFD: [0x1112, 0x1172, 0x11A8], NFKC: [0xD735], NFKD: [0x1112, 0x1172, 0x11A8] }, +{ source: [0xD736], NFC: [0xD736], NFD: [0x1112, 0x1172, 0x11A9], NFKC: [0xD736], NFKD: [0x1112, 0x1172, 0x11A9] }, +{ source: [0xD737], NFC: [0xD737], NFD: [0x1112, 0x1172, 0x11AA], NFKC: [0xD737], NFKD: [0x1112, 0x1172, 0x11AA] }, +{ source: [0xD738], NFC: [0xD738], NFD: [0x1112, 0x1172, 0x11AB], NFKC: [0xD738], NFKD: [0x1112, 0x1172, 0x11AB] }, +{ source: [0xD739], NFC: [0xD739], NFD: [0x1112, 0x1172, 0x11AC], NFKC: [0xD739], NFKD: [0x1112, 0x1172, 0x11AC] }, +{ source: [0xD73A], NFC: [0xD73A], NFD: [0x1112, 0x1172, 0x11AD], NFKC: [0xD73A], NFKD: [0x1112, 0x1172, 0x11AD] }, +{ source: [0xD73B], NFC: [0xD73B], NFD: [0x1112, 0x1172, 0x11AE], NFKC: [0xD73B], NFKD: [0x1112, 0x1172, 0x11AE] }, +{ source: [0xD73C], NFC: [0xD73C], NFD: [0x1112, 0x1172, 0x11AF], NFKC: [0xD73C], NFKD: [0x1112, 0x1172, 0x11AF] }, +{ source: [0xD73D], NFC: [0xD73D], NFD: [0x1112, 0x1172, 0x11B0], NFKC: [0xD73D], NFKD: [0x1112, 0x1172, 0x11B0] }, +{ source: [0xD73E], NFC: [0xD73E], NFD: [0x1112, 0x1172, 0x11B1], NFKC: [0xD73E], NFKD: [0x1112, 0x1172, 0x11B1] }, +{ source: [0xD73F], NFC: [0xD73F], NFD: [0x1112, 0x1172, 0x11B2], NFKC: [0xD73F], NFKD: [0x1112, 0x1172, 0x11B2] }, +{ source: [0xD740], NFC: [0xD740], NFD: [0x1112, 0x1172, 0x11B3], NFKC: [0xD740], NFKD: [0x1112, 0x1172, 0x11B3] }, +{ source: [0xD741], NFC: [0xD741], NFD: [0x1112, 0x1172, 0x11B4], NFKC: [0xD741], NFKD: [0x1112, 0x1172, 0x11B4] }, +{ source: [0xD742], NFC: [0xD742], NFD: [0x1112, 0x1172, 0x11B5], NFKC: [0xD742], NFKD: [0x1112, 0x1172, 0x11B5] }, +{ source: [0xD743], NFC: [0xD743], NFD: [0x1112, 0x1172, 0x11B6], NFKC: [0xD743], NFKD: [0x1112, 0x1172, 0x11B6] }, +{ source: [0xD744], NFC: [0xD744], NFD: [0x1112, 0x1172, 0x11B7], NFKC: [0xD744], NFKD: [0x1112, 0x1172, 0x11B7] }, +{ source: [0xD745], NFC: [0xD745], NFD: [0x1112, 0x1172, 0x11B8], NFKC: [0xD745], NFKD: [0x1112, 0x1172, 0x11B8] }, +{ source: [0xD746], NFC: [0xD746], NFD: [0x1112, 0x1172, 0x11B9], NFKC: [0xD746], NFKD: [0x1112, 0x1172, 0x11B9] }, +{ source: [0xD747], NFC: [0xD747], NFD: [0x1112, 0x1172, 0x11BA], NFKC: [0xD747], NFKD: [0x1112, 0x1172, 0x11BA] }, +{ source: [0xD748], NFC: [0xD748], NFD: [0x1112, 0x1172, 0x11BB], NFKC: [0xD748], NFKD: [0x1112, 0x1172, 0x11BB] }, +{ source: [0xD749], NFC: [0xD749], NFD: [0x1112, 0x1172, 0x11BC], NFKC: [0xD749], NFKD: [0x1112, 0x1172, 0x11BC] }, +{ source: [0xD74A], NFC: [0xD74A], NFD: [0x1112, 0x1172, 0x11BD], NFKC: [0xD74A], NFKD: [0x1112, 0x1172, 0x11BD] }, +{ source: [0xD74B], NFC: [0xD74B], NFD: [0x1112, 0x1172, 0x11BE], NFKC: [0xD74B], NFKD: [0x1112, 0x1172, 0x11BE] }, +{ source: [0xD74C], NFC: [0xD74C], NFD: [0x1112, 0x1172, 0x11BF], NFKC: [0xD74C], NFKD: [0x1112, 0x1172, 0x11BF] }, +{ source: [0xD74D], NFC: [0xD74D], NFD: [0x1112, 0x1172, 0x11C0], NFKC: [0xD74D], NFKD: [0x1112, 0x1172, 0x11C0] }, +{ source: [0xD74E], NFC: [0xD74E], NFD: [0x1112, 0x1172, 0x11C1], NFKC: [0xD74E], NFKD: [0x1112, 0x1172, 0x11C1] }, +{ source: [0xD74F], NFC: [0xD74F], NFD: [0x1112, 0x1172, 0x11C2], NFKC: [0xD74F], NFKD: [0x1112, 0x1172, 0x11C2] }, +{ source: [0xD750], NFC: [0xD750], NFD: [0x1112, 0x1173], NFKC: [0xD750], NFKD: [0x1112, 0x1173] }, +{ source: [0xD751], NFC: [0xD751], NFD: [0x1112, 0x1173, 0x11A8], NFKC: [0xD751], NFKD: [0x1112, 0x1173, 0x11A8] }, +{ source: [0xD752], NFC: [0xD752], NFD: [0x1112, 0x1173, 0x11A9], NFKC: [0xD752], NFKD: [0x1112, 0x1173, 0x11A9] }, +{ source: [0xD753], NFC: [0xD753], NFD: [0x1112, 0x1173, 0x11AA], NFKC: [0xD753], NFKD: [0x1112, 0x1173, 0x11AA] }, +{ source: [0xD754], NFC: [0xD754], NFD: [0x1112, 0x1173, 0x11AB], NFKC: [0xD754], NFKD: [0x1112, 0x1173, 0x11AB] }, +{ source: [0xD755], NFC: [0xD755], NFD: [0x1112, 0x1173, 0x11AC], NFKC: [0xD755], NFKD: [0x1112, 0x1173, 0x11AC] }, +{ source: [0xD756], NFC: [0xD756], NFD: [0x1112, 0x1173, 0x11AD], NFKC: [0xD756], NFKD: [0x1112, 0x1173, 0x11AD] }, +{ source: [0xD757], NFC: [0xD757], NFD: [0x1112, 0x1173, 0x11AE], NFKC: [0xD757], NFKD: [0x1112, 0x1173, 0x11AE] }, +{ source: [0xD758], NFC: [0xD758], NFD: [0x1112, 0x1173, 0x11AF], NFKC: [0xD758], NFKD: [0x1112, 0x1173, 0x11AF] }, +{ source: [0xD759], NFC: [0xD759], NFD: [0x1112, 0x1173, 0x11B0], NFKC: [0xD759], NFKD: [0x1112, 0x1173, 0x11B0] }, +{ source: [0xD75A], NFC: [0xD75A], NFD: [0x1112, 0x1173, 0x11B1], NFKC: [0xD75A], NFKD: [0x1112, 0x1173, 0x11B1] }, +{ source: [0xD75B], NFC: [0xD75B], NFD: [0x1112, 0x1173, 0x11B2], NFKC: [0xD75B], NFKD: [0x1112, 0x1173, 0x11B2] }, +{ source: [0xD75C], NFC: [0xD75C], NFD: [0x1112, 0x1173, 0x11B3], NFKC: [0xD75C], NFKD: [0x1112, 0x1173, 0x11B3] }, +{ source: [0xD75D], NFC: [0xD75D], NFD: [0x1112, 0x1173, 0x11B4], NFKC: [0xD75D], NFKD: [0x1112, 0x1173, 0x11B4] }, +{ source: [0xD75E], NFC: [0xD75E], NFD: [0x1112, 0x1173, 0x11B5], NFKC: [0xD75E], NFKD: [0x1112, 0x1173, 0x11B5] }, +{ source: [0xD75F], NFC: [0xD75F], NFD: [0x1112, 0x1173, 0x11B6], NFKC: [0xD75F], NFKD: [0x1112, 0x1173, 0x11B6] }, +{ source: [0xD760], NFC: [0xD760], NFD: [0x1112, 0x1173, 0x11B7], NFKC: [0xD760], NFKD: [0x1112, 0x1173, 0x11B7] }, +{ source: [0xD761], NFC: [0xD761], NFD: [0x1112, 0x1173, 0x11B8], NFKC: [0xD761], NFKD: [0x1112, 0x1173, 0x11B8] }, +{ source: [0xD762], NFC: [0xD762], NFD: [0x1112, 0x1173, 0x11B9], NFKC: [0xD762], NFKD: [0x1112, 0x1173, 0x11B9] }, +{ source: [0xD763], NFC: [0xD763], NFD: [0x1112, 0x1173, 0x11BA], NFKC: [0xD763], NFKD: [0x1112, 0x1173, 0x11BA] }, +{ source: [0xD764], NFC: [0xD764], NFD: [0x1112, 0x1173, 0x11BB], NFKC: [0xD764], NFKD: [0x1112, 0x1173, 0x11BB] }, +{ source: [0xD765], NFC: [0xD765], NFD: [0x1112, 0x1173, 0x11BC], NFKC: [0xD765], NFKD: [0x1112, 0x1173, 0x11BC] }, +{ source: [0xD766], NFC: [0xD766], NFD: [0x1112, 0x1173, 0x11BD], NFKC: [0xD766], NFKD: [0x1112, 0x1173, 0x11BD] }, +{ source: [0xD767], NFC: [0xD767], NFD: [0x1112, 0x1173, 0x11BE], NFKC: [0xD767], NFKD: [0x1112, 0x1173, 0x11BE] }, +{ source: [0xD768], NFC: [0xD768], NFD: [0x1112, 0x1173, 0x11BF], NFKC: [0xD768], NFKD: [0x1112, 0x1173, 0x11BF] }, +{ source: [0xD769], NFC: [0xD769], NFD: [0x1112, 0x1173, 0x11C0], NFKC: [0xD769], NFKD: [0x1112, 0x1173, 0x11C0] }, +{ source: [0xD76A], NFC: [0xD76A], NFD: [0x1112, 0x1173, 0x11C1], NFKC: [0xD76A], NFKD: [0x1112, 0x1173, 0x11C1] }, +{ source: [0xD76B], NFC: [0xD76B], NFD: [0x1112, 0x1173, 0x11C2], NFKC: [0xD76B], NFKD: [0x1112, 0x1173, 0x11C2] }, +{ source: [0xD76C], NFC: [0xD76C], NFD: [0x1112, 0x1174], NFKC: [0xD76C], NFKD: [0x1112, 0x1174] }, +{ source: [0xD76D], NFC: [0xD76D], NFD: [0x1112, 0x1174, 0x11A8], NFKC: [0xD76D], NFKD: [0x1112, 0x1174, 0x11A8] }, +{ source: [0xD76E], NFC: [0xD76E], NFD: [0x1112, 0x1174, 0x11A9], NFKC: [0xD76E], NFKD: [0x1112, 0x1174, 0x11A9] }, +{ source: [0xD76F], NFC: [0xD76F], NFD: [0x1112, 0x1174, 0x11AA], NFKC: [0xD76F], NFKD: [0x1112, 0x1174, 0x11AA] }, +{ source: [0xD770], NFC: [0xD770], NFD: [0x1112, 0x1174, 0x11AB], NFKC: [0xD770], NFKD: [0x1112, 0x1174, 0x11AB] }, +{ source: [0xD771], NFC: [0xD771], NFD: [0x1112, 0x1174, 0x11AC], NFKC: [0xD771], NFKD: [0x1112, 0x1174, 0x11AC] }, +{ source: [0xD772], NFC: [0xD772], NFD: [0x1112, 0x1174, 0x11AD], NFKC: [0xD772], NFKD: [0x1112, 0x1174, 0x11AD] }, +{ source: [0xD773], NFC: [0xD773], NFD: [0x1112, 0x1174, 0x11AE], NFKC: [0xD773], NFKD: [0x1112, 0x1174, 0x11AE] }, +{ source: [0xD774], NFC: [0xD774], NFD: [0x1112, 0x1174, 0x11AF], NFKC: [0xD774], NFKD: [0x1112, 0x1174, 0x11AF] }, +{ source: [0xD775], NFC: [0xD775], NFD: [0x1112, 0x1174, 0x11B0], NFKC: [0xD775], NFKD: [0x1112, 0x1174, 0x11B0] }, +{ source: [0xD776], NFC: [0xD776], NFD: [0x1112, 0x1174, 0x11B1], NFKC: [0xD776], NFKD: [0x1112, 0x1174, 0x11B1] }, +{ source: [0xD777], NFC: [0xD777], NFD: [0x1112, 0x1174, 0x11B2], NFKC: [0xD777], NFKD: [0x1112, 0x1174, 0x11B2] }, +{ source: [0xD778], NFC: [0xD778], NFD: [0x1112, 0x1174, 0x11B3], NFKC: [0xD778], NFKD: [0x1112, 0x1174, 0x11B3] }, +{ source: [0xD779], NFC: [0xD779], NFD: [0x1112, 0x1174, 0x11B4], NFKC: [0xD779], NFKD: [0x1112, 0x1174, 0x11B4] }, +{ source: [0xD77A], NFC: [0xD77A], NFD: [0x1112, 0x1174, 0x11B5], NFKC: [0xD77A], NFKD: [0x1112, 0x1174, 0x11B5] }, +{ source: [0xD77B], NFC: [0xD77B], NFD: [0x1112, 0x1174, 0x11B6], NFKC: [0xD77B], NFKD: [0x1112, 0x1174, 0x11B6] }, +{ source: [0xD77C], NFC: [0xD77C], NFD: [0x1112, 0x1174, 0x11B7], NFKC: [0xD77C], NFKD: [0x1112, 0x1174, 0x11B7] }, +{ source: [0xD77D], NFC: [0xD77D], NFD: [0x1112, 0x1174, 0x11B8], NFKC: [0xD77D], NFKD: [0x1112, 0x1174, 0x11B8] }, +{ source: [0xD77E], NFC: [0xD77E], NFD: [0x1112, 0x1174, 0x11B9], NFKC: [0xD77E], NFKD: [0x1112, 0x1174, 0x11B9] }, +{ source: [0xD77F], NFC: [0xD77F], NFD: [0x1112, 0x1174, 0x11BA], NFKC: [0xD77F], NFKD: [0x1112, 0x1174, 0x11BA] }, +{ source: [0xD780], NFC: [0xD780], NFD: [0x1112, 0x1174, 0x11BB], NFKC: [0xD780], NFKD: [0x1112, 0x1174, 0x11BB] }, +{ source: [0xD781], NFC: [0xD781], NFD: [0x1112, 0x1174, 0x11BC], NFKC: [0xD781], NFKD: [0x1112, 0x1174, 0x11BC] }, +{ source: [0xD782], NFC: [0xD782], NFD: [0x1112, 0x1174, 0x11BD], NFKC: [0xD782], NFKD: [0x1112, 0x1174, 0x11BD] }, +{ source: [0xD783], NFC: [0xD783], NFD: [0x1112, 0x1174, 0x11BE], NFKC: [0xD783], NFKD: [0x1112, 0x1174, 0x11BE] }, +{ source: [0xD784], NFC: [0xD784], NFD: [0x1112, 0x1174, 0x11BF], NFKC: [0xD784], NFKD: [0x1112, 0x1174, 0x11BF] }, +{ source: [0xD785], NFC: [0xD785], NFD: [0x1112, 0x1174, 0x11C0], NFKC: [0xD785], NFKD: [0x1112, 0x1174, 0x11C0] }, +{ source: [0xD786], NFC: [0xD786], NFD: [0x1112, 0x1174, 0x11C1], NFKC: [0xD786], NFKD: [0x1112, 0x1174, 0x11C1] }, +{ source: [0xD787], NFC: [0xD787], NFD: [0x1112, 0x1174, 0x11C2], NFKC: [0xD787], NFKD: [0x1112, 0x1174, 0x11C2] }, +{ source: [0xD788], NFC: [0xD788], NFD: [0x1112, 0x1175], NFKC: [0xD788], NFKD: [0x1112, 0x1175] }, +{ source: [0xD789], NFC: [0xD789], NFD: [0x1112, 0x1175, 0x11A8], NFKC: [0xD789], NFKD: [0x1112, 0x1175, 0x11A8] }, +{ source: [0xD78A], NFC: [0xD78A], NFD: [0x1112, 0x1175, 0x11A9], NFKC: [0xD78A], NFKD: [0x1112, 0x1175, 0x11A9] }, +{ source: [0xD78B], NFC: [0xD78B], NFD: [0x1112, 0x1175, 0x11AA], NFKC: [0xD78B], NFKD: [0x1112, 0x1175, 0x11AA] }, +{ source: [0xD78C], NFC: [0xD78C], NFD: [0x1112, 0x1175, 0x11AB], NFKC: [0xD78C], NFKD: [0x1112, 0x1175, 0x11AB] }, +{ source: [0xD78D], NFC: [0xD78D], NFD: [0x1112, 0x1175, 0x11AC], NFKC: [0xD78D], NFKD: [0x1112, 0x1175, 0x11AC] }, +{ source: [0xD78E], NFC: [0xD78E], NFD: [0x1112, 0x1175, 0x11AD], NFKC: [0xD78E], NFKD: [0x1112, 0x1175, 0x11AD] }, +{ source: [0xD78F], NFC: [0xD78F], NFD: [0x1112, 0x1175, 0x11AE], NFKC: [0xD78F], NFKD: [0x1112, 0x1175, 0x11AE] }, +{ source: [0xD790], NFC: [0xD790], NFD: [0x1112, 0x1175, 0x11AF], NFKC: [0xD790], NFKD: [0x1112, 0x1175, 0x11AF] }, +{ source: [0xD791], NFC: [0xD791], NFD: [0x1112, 0x1175, 0x11B0], NFKC: [0xD791], NFKD: [0x1112, 0x1175, 0x11B0] }, +{ source: [0xD792], NFC: [0xD792], NFD: [0x1112, 0x1175, 0x11B1], NFKC: [0xD792], NFKD: [0x1112, 0x1175, 0x11B1] }, +{ source: [0xD793], NFC: [0xD793], NFD: [0x1112, 0x1175, 0x11B2], NFKC: [0xD793], NFKD: [0x1112, 0x1175, 0x11B2] }, +{ source: [0xD794], NFC: [0xD794], NFD: [0x1112, 0x1175, 0x11B3], NFKC: [0xD794], NFKD: [0x1112, 0x1175, 0x11B3] }, +{ source: [0xD795], NFC: [0xD795], NFD: [0x1112, 0x1175, 0x11B4], NFKC: [0xD795], NFKD: [0x1112, 0x1175, 0x11B4] }, +{ source: [0xD796], NFC: [0xD796], NFD: [0x1112, 0x1175, 0x11B5], NFKC: [0xD796], NFKD: [0x1112, 0x1175, 0x11B5] }, +{ source: [0xD797], NFC: [0xD797], NFD: [0x1112, 0x1175, 0x11B6], NFKC: [0xD797], NFKD: [0x1112, 0x1175, 0x11B6] }, +{ source: [0xD798], NFC: [0xD798], NFD: [0x1112, 0x1175, 0x11B7], NFKC: [0xD798], NFKD: [0x1112, 0x1175, 0x11B7] }, +{ source: [0xD799], NFC: [0xD799], NFD: [0x1112, 0x1175, 0x11B8], NFKC: [0xD799], NFKD: [0x1112, 0x1175, 0x11B8] }, +{ source: [0xD79A], NFC: [0xD79A], NFD: [0x1112, 0x1175, 0x11B9], NFKC: [0xD79A], NFKD: [0x1112, 0x1175, 0x11B9] }, +{ source: [0xD79B], NFC: [0xD79B], NFD: [0x1112, 0x1175, 0x11BA], NFKC: [0xD79B], NFKD: [0x1112, 0x1175, 0x11BA] }, +{ source: [0xD79C], NFC: [0xD79C], NFD: [0x1112, 0x1175, 0x11BB], NFKC: [0xD79C], NFKD: [0x1112, 0x1175, 0x11BB] }, +{ source: [0xD79D], NFC: [0xD79D], NFD: [0x1112, 0x1175, 0x11BC], NFKC: [0xD79D], NFKD: [0x1112, 0x1175, 0x11BC] }, +{ source: [0xD79E], NFC: [0xD79E], NFD: [0x1112, 0x1175, 0x11BD], NFKC: [0xD79E], NFKD: [0x1112, 0x1175, 0x11BD] }, +{ source: [0xD79F], NFC: [0xD79F], NFD: [0x1112, 0x1175, 0x11BE], NFKC: [0xD79F], NFKD: [0x1112, 0x1175, 0x11BE] }, +{ source: [0xD7A0], NFC: [0xD7A0], NFD: [0x1112, 0x1175, 0x11BF], NFKC: [0xD7A0], NFKD: [0x1112, 0x1175, 0x11BF] }, +{ source: [0xD7A1], NFC: [0xD7A1], NFD: [0x1112, 0x1175, 0x11C0], NFKC: [0xD7A1], NFKD: [0x1112, 0x1175, 0x11C0] }, +{ source: [0xD7A2], NFC: [0xD7A2], NFD: [0x1112, 0x1175, 0x11C1], NFKC: [0xD7A2], NFKD: [0x1112, 0x1175, 0x11C1] }, +{ source: [0xD7A3], NFC: [0xD7A3], NFD: [0x1112, 0x1175, 0x11C2], NFKC: [0xD7A3], NFKD: [0x1112, 0x1175, 0x11C2] }, +{ source: [0xF900], NFC: [0x8C48], NFD: [0x8C48], NFKC: [0x8C48], NFKD: [0x8C48] }, +{ source: [0xF901], NFC: [0x66F4], NFD: [0x66F4], NFKC: [0x66F4], NFKD: [0x66F4] }, +{ source: [0xF902], NFC: [0x8ECA], NFD: [0x8ECA], NFKC: [0x8ECA], NFKD: [0x8ECA] }, +{ source: [0xF903], NFC: [0x8CC8], NFD: [0x8CC8], NFKC: [0x8CC8], NFKD: [0x8CC8] }, +{ source: [0xF904], NFC: [0x6ED1], NFD: [0x6ED1], NFKC: [0x6ED1], NFKD: [0x6ED1] }, +{ source: [0xF905], NFC: [0x4E32], NFD: [0x4E32], NFKC: [0x4E32], NFKD: [0x4E32] }, +{ source: [0xF906], NFC: [0x53E5], NFD: [0x53E5], NFKC: [0x53E5], NFKD: [0x53E5] }, +{ source: [0xF907], NFC: [0x9F9C], NFD: [0x9F9C], NFKC: [0x9F9C], NFKD: [0x9F9C] }, +{ source: [0xF908], NFC: [0x9F9C], NFD: [0x9F9C], NFKC: [0x9F9C], NFKD: [0x9F9C] }, +{ source: [0xF909], NFC: [0x5951], NFD: [0x5951], NFKC: [0x5951], NFKD: [0x5951] }, +{ source: [0xF90A], NFC: [0x91D1], NFD: [0x91D1], NFKC: [0x91D1], NFKD: [0x91D1] }, +{ source: [0xF90B], NFC: [0x5587], NFD: [0x5587], NFKC: [0x5587], NFKD: [0x5587] }, +{ source: [0xF90C], NFC: [0x5948], NFD: [0x5948], NFKC: [0x5948], NFKD: [0x5948] }, +{ source: [0xF90D], NFC: [0x61F6], NFD: [0x61F6], NFKC: [0x61F6], NFKD: [0x61F6] }, +{ source: [0xF90E], NFC: [0x7669], NFD: [0x7669], NFKC: [0x7669], NFKD: [0x7669] }, +{ source: [0xF90F], NFC: [0x7F85], NFD: [0x7F85], NFKC: [0x7F85], NFKD: [0x7F85] }, +{ source: [0xF910], NFC: [0x863F], NFD: [0x863F], NFKC: [0x863F], NFKD: [0x863F] }, +{ source: [0xF911], NFC: [0x87BA], NFD: [0x87BA], NFKC: [0x87BA], NFKD: [0x87BA] }, +{ source: [0xF912], NFC: [0x88F8], NFD: [0x88F8], NFKC: [0x88F8], NFKD: [0x88F8] }, +{ source: [0xF913], NFC: [0x908F], NFD: [0x908F], NFKC: [0x908F], NFKD: [0x908F] }, +{ source: [0xF914], NFC: [0x6A02], NFD: [0x6A02], NFKC: [0x6A02], NFKD: [0x6A02] }, +{ source: [0xF915], NFC: [0x6D1B], NFD: [0x6D1B], NFKC: [0x6D1B], NFKD: [0x6D1B] }, +{ source: [0xF916], NFC: [0x70D9], NFD: [0x70D9], NFKC: [0x70D9], NFKD: [0x70D9] }, +{ source: [0xF917], NFC: [0x73DE], NFD: [0x73DE], NFKC: [0x73DE], NFKD: [0x73DE] }, +{ source: [0xF918], NFC: [0x843D], NFD: [0x843D], NFKC: [0x843D], NFKD: [0x843D] }, +{ source: [0xF919], NFC: [0x916A], NFD: [0x916A], NFKC: [0x916A], NFKD: [0x916A] }, +{ source: [0xF91A], NFC: [0x99F1], NFD: [0x99F1], NFKC: [0x99F1], NFKD: [0x99F1] }, +{ source: [0xF91B], NFC: [0x4E82], NFD: [0x4E82], NFKC: [0x4E82], NFKD: [0x4E82] }, +{ source: [0xF91C], NFC: [0x5375], NFD: [0x5375], NFKC: [0x5375], NFKD: [0x5375] }, +{ source: [0xF91D], NFC: [0x6B04], NFD: [0x6B04], NFKC: [0x6B04], NFKD: [0x6B04] }, +{ source: [0xF91E], NFC: [0x721B], NFD: [0x721B], NFKC: [0x721B], NFKD: [0x721B] }, +{ source: [0xF91F], NFC: [0x862D], NFD: [0x862D], NFKC: [0x862D], NFKD: [0x862D] }, +{ source: [0xF920], NFC: [0x9E1E], NFD: [0x9E1E], NFKC: [0x9E1E], NFKD: [0x9E1E] }, +{ source: [0xF921], NFC: [0x5D50], NFD: [0x5D50], NFKC: [0x5D50], NFKD: [0x5D50] }, +{ source: [0xF922], NFC: [0x6FEB], NFD: [0x6FEB], NFKC: [0x6FEB], NFKD: [0x6FEB] }, +{ source: [0xF923], NFC: [0x85CD], NFD: [0x85CD], NFKC: [0x85CD], NFKD: [0x85CD] }, +{ source: [0xF924], NFC: [0x8964], NFD: [0x8964], NFKC: [0x8964], NFKD: [0x8964] }, +{ source: [0xF925], NFC: [0x62C9], NFD: [0x62C9], NFKC: [0x62C9], NFKD: [0x62C9] }, +{ source: [0xF926], NFC: [0x81D8], NFD: [0x81D8], NFKC: [0x81D8], NFKD: [0x81D8] }, +{ source: [0xF927], NFC: [0x881F], NFD: [0x881F], NFKC: [0x881F], NFKD: [0x881F] }, +{ source: [0xF928], NFC: [0x5ECA], NFD: [0x5ECA], NFKC: [0x5ECA], NFKD: [0x5ECA] }, +{ source: [0xF929], NFC: [0x6717], NFD: [0x6717], NFKC: [0x6717], NFKD: [0x6717] }, +{ source: [0xF92A], NFC: [0x6D6A], NFD: [0x6D6A], NFKC: [0x6D6A], NFKD: [0x6D6A] }, +{ source: [0xF92B], NFC: [0x72FC], NFD: [0x72FC], NFKC: [0x72FC], NFKD: [0x72FC] }, +{ source: [0xF92C], NFC: [0x90CE], NFD: [0x90CE], NFKC: [0x90CE], NFKD: [0x90CE] }, +{ source: [0xF92D], NFC: [0x4F86], NFD: [0x4F86], NFKC: [0x4F86], NFKD: [0x4F86] }, +{ source: [0xF92E], NFC: [0x51B7], NFD: [0x51B7], NFKC: [0x51B7], NFKD: [0x51B7] }, +{ source: [0xF92F], NFC: [0x52DE], NFD: [0x52DE], NFKC: [0x52DE], NFKD: [0x52DE] }, +{ source: [0xF930], NFC: [0x64C4], NFD: [0x64C4], NFKC: [0x64C4], NFKD: [0x64C4] }, +{ source: [0xF931], NFC: [0x6AD3], NFD: [0x6AD3], NFKC: [0x6AD3], NFKD: [0x6AD3] }, +{ source: [0xF932], NFC: [0x7210], NFD: [0x7210], NFKC: [0x7210], NFKD: [0x7210] }, +{ source: [0xF933], NFC: [0x76E7], NFD: [0x76E7], NFKC: [0x76E7], NFKD: [0x76E7] }, +{ source: [0xF934], NFC: [0x8001], NFD: [0x8001], NFKC: [0x8001], NFKD: [0x8001] }, +{ source: [0xF935], NFC: [0x8606], NFD: [0x8606], NFKC: [0x8606], NFKD: [0x8606] }, +{ source: [0xF936], NFC: [0x865C], NFD: [0x865C], NFKC: [0x865C], NFKD: [0x865C] }, +{ source: [0xF937], NFC: [0x8DEF], NFD: [0x8DEF], NFKC: [0x8DEF], NFKD: [0x8DEF] }, +{ source: [0xF938], NFC: [0x9732], NFD: [0x9732], NFKC: [0x9732], NFKD: [0x9732] }, +{ source: [0xF939], NFC: [0x9B6F], NFD: [0x9B6F], NFKC: [0x9B6F], NFKD: [0x9B6F] }, +{ source: [0xF93A], NFC: [0x9DFA], NFD: [0x9DFA], NFKC: [0x9DFA], NFKD: [0x9DFA] }, +{ source: [0xF93B], NFC: [0x788C], NFD: [0x788C], NFKC: [0x788C], NFKD: [0x788C] }, +{ source: [0xF93C], NFC: [0x797F], NFD: [0x797F], NFKC: [0x797F], NFKD: [0x797F] }, +{ source: [0xF93D], NFC: [0x7DA0], NFD: [0x7DA0], NFKC: [0x7DA0], NFKD: [0x7DA0] }, +{ source: [0xF93E], NFC: [0x83C9], NFD: [0x83C9], NFKC: [0x83C9], NFKD: [0x83C9] }, +{ source: [0xF93F], NFC: [0x9304], NFD: [0x9304], NFKC: [0x9304], NFKD: [0x9304] }, +{ source: [0xF940], NFC: [0x9E7F], NFD: [0x9E7F], NFKC: [0x9E7F], NFKD: [0x9E7F] }, +{ source: [0xF941], NFC: [0x8AD6], NFD: [0x8AD6], NFKC: [0x8AD6], NFKD: [0x8AD6] }, +{ source: [0xF942], NFC: [0x58DF], NFD: [0x58DF], NFKC: [0x58DF], NFKD: [0x58DF] }, +{ source: [0xF943], NFC: [0x5F04], NFD: [0x5F04], NFKC: [0x5F04], NFKD: [0x5F04] }, +{ source: [0xF944], NFC: [0x7C60], NFD: [0x7C60], NFKC: [0x7C60], NFKD: [0x7C60] }, +{ source: [0xF945], NFC: [0x807E], NFD: [0x807E], NFKC: [0x807E], NFKD: [0x807E] }, +{ source: [0xF946], NFC: [0x7262], NFD: [0x7262], NFKC: [0x7262], NFKD: [0x7262] }, +{ source: [0xF947], NFC: [0x78CA], NFD: [0x78CA], NFKC: [0x78CA], NFKD: [0x78CA] }, +{ source: [0xF948], NFC: [0x8CC2], NFD: [0x8CC2], NFKC: [0x8CC2], NFKD: [0x8CC2] }, +{ source: [0xF949], NFC: [0x96F7], NFD: [0x96F7], NFKC: [0x96F7], NFKD: [0x96F7] }, +{ source: [0xF94A], NFC: [0x58D8], NFD: [0x58D8], NFKC: [0x58D8], NFKD: [0x58D8] }, +{ source: [0xF94B], NFC: [0x5C62], NFD: [0x5C62], NFKC: [0x5C62], NFKD: [0x5C62] }, +{ source: [0xF94C], NFC: [0x6A13], NFD: [0x6A13], NFKC: [0x6A13], NFKD: [0x6A13] }, +{ source: [0xF94D], NFC: [0x6DDA], NFD: [0x6DDA], NFKC: [0x6DDA], NFKD: [0x6DDA] }, +{ source: [0xF94E], NFC: [0x6F0F], NFD: [0x6F0F], NFKC: [0x6F0F], NFKD: [0x6F0F] }, +{ source: [0xF94F], NFC: [0x7D2F], NFD: [0x7D2F], NFKC: [0x7D2F], NFKD: [0x7D2F] }, +{ source: [0xF950], NFC: [0x7E37], NFD: [0x7E37], NFKC: [0x7E37], NFKD: [0x7E37] }, +{ source: [0xF951], NFC: [0x964B], NFD: [0x964B], NFKC: [0x964B], NFKD: [0x964B] }, +{ source: [0xF952], NFC: [0x52D2], NFD: [0x52D2], NFKC: [0x52D2], NFKD: [0x52D2] }, +{ source: [0xF953], NFC: [0x808B], NFD: [0x808B], NFKC: [0x808B], NFKD: [0x808B] }, +{ source: [0xF954], NFC: [0x51DC], NFD: [0x51DC], NFKC: [0x51DC], NFKD: [0x51DC] }, +{ source: [0xF955], NFC: [0x51CC], NFD: [0x51CC], NFKC: [0x51CC], NFKD: [0x51CC] }, +{ source: [0xF956], NFC: [0x7A1C], NFD: [0x7A1C], NFKC: [0x7A1C], NFKD: [0x7A1C] }, +{ source: [0xF957], NFC: [0x7DBE], NFD: [0x7DBE], NFKC: [0x7DBE], NFKD: [0x7DBE] }, +{ source: [0xF958], NFC: [0x83F1], NFD: [0x83F1], NFKC: [0x83F1], NFKD: [0x83F1] }, +{ source: [0xF959], NFC: [0x9675], NFD: [0x9675], NFKC: [0x9675], NFKD: [0x9675] }, +{ source: [0xF95A], NFC: [0x8B80], NFD: [0x8B80], NFKC: [0x8B80], NFKD: [0x8B80] }, +{ source: [0xF95B], NFC: [0x62CF], NFD: [0x62CF], NFKC: [0x62CF], NFKD: [0x62CF] }, +{ source: [0xF95C], NFC: [0x6A02], NFD: [0x6A02], NFKC: [0x6A02], NFKD: [0x6A02] }, +{ source: [0xF95D], NFC: [0x8AFE], NFD: [0x8AFE], NFKC: [0x8AFE], NFKD: [0x8AFE] }, +{ source: [0xF95E], NFC: [0x4E39], NFD: [0x4E39], NFKC: [0x4E39], NFKD: [0x4E39] }, +{ source: [0xF95F], NFC: [0x5BE7], NFD: [0x5BE7], NFKC: [0x5BE7], NFKD: [0x5BE7] }, +{ source: [0xF960], NFC: [0x6012], NFD: [0x6012], NFKC: [0x6012], NFKD: [0x6012] }, +{ source: [0xF961], NFC: [0x7387], NFD: [0x7387], NFKC: [0x7387], NFKD: [0x7387] }, +{ source: [0xF962], NFC: [0x7570], NFD: [0x7570], NFKC: [0x7570], NFKD: [0x7570] }, +{ source: [0xF963], NFC: [0x5317], NFD: [0x5317], NFKC: [0x5317], NFKD: [0x5317] }, +{ source: [0xF964], NFC: [0x78FB], NFD: [0x78FB], NFKC: [0x78FB], NFKD: [0x78FB] }, +{ source: [0xF965], NFC: [0x4FBF], NFD: [0x4FBF], NFKC: [0x4FBF], NFKD: [0x4FBF] }, +{ source: [0xF966], NFC: [0x5FA9], NFD: [0x5FA9], NFKC: [0x5FA9], NFKD: [0x5FA9] }, +{ source: [0xF967], NFC: [0x4E0D], NFD: [0x4E0D], NFKC: [0x4E0D], NFKD: [0x4E0D] }, +{ source: [0xF968], NFC: [0x6CCC], NFD: [0x6CCC], NFKC: [0x6CCC], NFKD: [0x6CCC] }, +{ source: [0xF969], NFC: [0x6578], NFD: [0x6578], NFKC: [0x6578], NFKD: [0x6578] }, +{ source: [0xF96A], NFC: [0x7D22], NFD: [0x7D22], NFKC: [0x7D22], NFKD: [0x7D22] }, +{ source: [0xF96B], NFC: [0x53C3], NFD: [0x53C3], NFKC: [0x53C3], NFKD: [0x53C3] }, +{ source: [0xF96C], NFC: [0x585E], NFD: [0x585E], NFKC: [0x585E], NFKD: [0x585E] }, +{ source: [0xF96D], NFC: [0x7701], NFD: [0x7701], NFKC: [0x7701], NFKD: [0x7701] }, +{ source: [0xF96E], NFC: [0x8449], NFD: [0x8449], NFKC: [0x8449], NFKD: [0x8449] }, +{ source: [0xF96F], NFC: [0x8AAA], NFD: [0x8AAA], NFKC: [0x8AAA], NFKD: [0x8AAA] }, +{ source: [0xF970], NFC: [0x6BBA], NFD: [0x6BBA], NFKC: [0x6BBA], NFKD: [0x6BBA] }, +{ source: [0xF971], NFC: [0x8FB0], NFD: [0x8FB0], NFKC: [0x8FB0], NFKD: [0x8FB0] }, +{ source: [0xF972], NFC: [0x6C88], NFD: [0x6C88], NFKC: [0x6C88], NFKD: [0x6C88] }, +{ source: [0xF973], NFC: [0x62FE], NFD: [0x62FE], NFKC: [0x62FE], NFKD: [0x62FE] }, +{ source: [0xF974], NFC: [0x82E5], NFD: [0x82E5], NFKC: [0x82E5], NFKD: [0x82E5] }, +{ source: [0xF975], NFC: [0x63A0], NFD: [0x63A0], NFKC: [0x63A0], NFKD: [0x63A0] }, +{ source: [0xF976], NFC: [0x7565], NFD: [0x7565], NFKC: [0x7565], NFKD: [0x7565] }, +{ source: [0xF977], NFC: [0x4EAE], NFD: [0x4EAE], NFKC: [0x4EAE], NFKD: [0x4EAE] }, +{ source: [0xF978], NFC: [0x5169], NFD: [0x5169], NFKC: [0x5169], NFKD: [0x5169] }, +{ source: [0xF979], NFC: [0x51C9], NFD: [0x51C9], NFKC: [0x51C9], NFKD: [0x51C9] }, +{ source: [0xF97A], NFC: [0x6881], NFD: [0x6881], NFKC: [0x6881], NFKD: [0x6881] }, +{ source: [0xF97B], NFC: [0x7CE7], NFD: [0x7CE7], NFKC: [0x7CE7], NFKD: [0x7CE7] }, +{ source: [0xF97C], NFC: [0x826F], NFD: [0x826F], NFKC: [0x826F], NFKD: [0x826F] }, +{ source: [0xF97D], NFC: [0x8AD2], NFD: [0x8AD2], NFKC: [0x8AD2], NFKD: [0x8AD2] }, +{ source: [0xF97E], NFC: [0x91CF], NFD: [0x91CF], NFKC: [0x91CF], NFKD: [0x91CF] }, +{ source: [0xF97F], NFC: [0x52F5], NFD: [0x52F5], NFKC: [0x52F5], NFKD: [0x52F5] }, +{ source: [0xF980], NFC: [0x5442], NFD: [0x5442], NFKC: [0x5442], NFKD: [0x5442] }, +{ source: [0xF981], NFC: [0x5973], NFD: [0x5973], NFKC: [0x5973], NFKD: [0x5973] }, +{ source: [0xF982], NFC: [0x5EEC], NFD: [0x5EEC], NFKC: [0x5EEC], NFKD: [0x5EEC] }, +{ source: [0xF983], NFC: [0x65C5], NFD: [0x65C5], NFKC: [0x65C5], NFKD: [0x65C5] }, +{ source: [0xF984], NFC: [0x6FFE], NFD: [0x6FFE], NFKC: [0x6FFE], NFKD: [0x6FFE] }, +{ source: [0xF985], NFC: [0x792A], NFD: [0x792A], NFKC: [0x792A], NFKD: [0x792A] }, +{ source: [0xF986], NFC: [0x95AD], NFD: [0x95AD], NFKC: [0x95AD], NFKD: [0x95AD] }, +{ source: [0xF987], NFC: [0x9A6A], NFD: [0x9A6A], NFKC: [0x9A6A], NFKD: [0x9A6A] }, +{ source: [0xF988], NFC: [0x9E97], NFD: [0x9E97], NFKC: [0x9E97], NFKD: [0x9E97] }, +{ source: [0xF989], NFC: [0x9ECE], NFD: [0x9ECE], NFKC: [0x9ECE], NFKD: [0x9ECE] }, +{ source: [0xF98A], NFC: [0x529B], NFD: [0x529B], NFKC: [0x529B], NFKD: [0x529B] }, +{ source: [0xF98B], NFC: [0x66C6], NFD: [0x66C6], NFKC: [0x66C6], NFKD: [0x66C6] }, +{ source: [0xF98C], NFC: [0x6B77], NFD: [0x6B77], NFKC: [0x6B77], NFKD: [0x6B77] }, +{ source: [0xF98D], NFC: [0x8F62], NFD: [0x8F62], NFKC: [0x8F62], NFKD: [0x8F62] }, +{ source: [0xF98E], NFC: [0x5E74], NFD: [0x5E74], NFKC: [0x5E74], NFKD: [0x5E74] }, +{ source: [0xF98F], NFC: [0x6190], NFD: [0x6190], NFKC: [0x6190], NFKD: [0x6190] }, +{ source: [0xF990], NFC: [0x6200], NFD: [0x6200], NFKC: [0x6200], NFKD: [0x6200] }, +{ source: [0xF991], NFC: [0x649A], NFD: [0x649A], NFKC: [0x649A], NFKD: [0x649A] }, +{ source: [0xF992], NFC: [0x6F23], NFD: [0x6F23], NFKC: [0x6F23], NFKD: [0x6F23] }, +{ source: [0xF993], NFC: [0x7149], NFD: [0x7149], NFKC: [0x7149], NFKD: [0x7149] }, +{ source: [0xF994], NFC: [0x7489], NFD: [0x7489], NFKC: [0x7489], NFKD: [0x7489] }, +{ source: [0xF995], NFC: [0x79CA], NFD: [0x79CA], NFKC: [0x79CA], NFKD: [0x79CA] }, +{ source: [0xF996], NFC: [0x7DF4], NFD: [0x7DF4], NFKC: [0x7DF4], NFKD: [0x7DF4] }, +{ source: [0xF997], NFC: [0x806F], NFD: [0x806F], NFKC: [0x806F], NFKD: [0x806F] }, +{ source: [0xF998], NFC: [0x8F26], NFD: [0x8F26], NFKC: [0x8F26], NFKD: [0x8F26] }, +{ source: [0xF999], NFC: [0x84EE], NFD: [0x84EE], NFKC: [0x84EE], NFKD: [0x84EE] }, +{ source: [0xF99A], NFC: [0x9023], NFD: [0x9023], NFKC: [0x9023], NFKD: [0x9023] }, +{ source: [0xF99B], NFC: [0x934A], NFD: [0x934A], NFKC: [0x934A], NFKD: [0x934A] }, +{ source: [0xF99C], NFC: [0x5217], NFD: [0x5217], NFKC: [0x5217], NFKD: [0x5217] }, +{ source: [0xF99D], NFC: [0x52A3], NFD: [0x52A3], NFKC: [0x52A3], NFKD: [0x52A3] }, +{ source: [0xF99E], NFC: [0x54BD], NFD: [0x54BD], NFKC: [0x54BD], NFKD: [0x54BD] }, +{ source: [0xF99F], NFC: [0x70C8], NFD: [0x70C8], NFKC: [0x70C8], NFKD: [0x70C8] }, +{ source: [0xF9A0], NFC: [0x88C2], NFD: [0x88C2], NFKC: [0x88C2], NFKD: [0x88C2] }, +{ source: [0xF9A1], NFC: [0x8AAA], NFD: [0x8AAA], NFKC: [0x8AAA], NFKD: [0x8AAA] }, +{ source: [0xF9A2], NFC: [0x5EC9], NFD: [0x5EC9], NFKC: [0x5EC9], NFKD: [0x5EC9] }, +{ source: [0xF9A3], NFC: [0x5FF5], NFD: [0x5FF5], NFKC: [0x5FF5], NFKD: [0x5FF5] }, +{ source: [0xF9A4], NFC: [0x637B], NFD: [0x637B], NFKC: [0x637B], NFKD: [0x637B] }, +{ source: [0xF9A5], NFC: [0x6BAE], NFD: [0x6BAE], NFKC: [0x6BAE], NFKD: [0x6BAE] }, +{ source: [0xF9A6], NFC: [0x7C3E], NFD: [0x7C3E], NFKC: [0x7C3E], NFKD: [0x7C3E] }, +{ source: [0xF9A7], NFC: [0x7375], NFD: [0x7375], NFKC: [0x7375], NFKD: [0x7375] }, +{ source: [0xF9A8], NFC: [0x4EE4], NFD: [0x4EE4], NFKC: [0x4EE4], NFKD: [0x4EE4] }, +{ source: [0xF9A9], NFC: [0x56F9], NFD: [0x56F9], NFKC: [0x56F9], NFKD: [0x56F9] }, +{ source: [0xF9AA], NFC: [0x5BE7], NFD: [0x5BE7], NFKC: [0x5BE7], NFKD: [0x5BE7] }, +{ source: [0xF9AB], NFC: [0x5DBA], NFD: [0x5DBA], NFKC: [0x5DBA], NFKD: [0x5DBA] }, +{ source: [0xF9AC], NFC: [0x601C], NFD: [0x601C], NFKC: [0x601C], NFKD: [0x601C] }, +{ source: [0xF9AD], NFC: [0x73B2], NFD: [0x73B2], NFKC: [0x73B2], NFKD: [0x73B2] }, +{ source: [0xF9AE], NFC: [0x7469], NFD: [0x7469], NFKC: [0x7469], NFKD: [0x7469] }, +{ source: [0xF9AF], NFC: [0x7F9A], NFD: [0x7F9A], NFKC: [0x7F9A], NFKD: [0x7F9A] }, +{ source: [0xF9B0], NFC: [0x8046], NFD: [0x8046], NFKC: [0x8046], NFKD: [0x8046] }, +{ source: [0xF9B1], NFC: [0x9234], NFD: [0x9234], NFKC: [0x9234], NFKD: [0x9234] }, +{ source: [0xF9B2], NFC: [0x96F6], NFD: [0x96F6], NFKC: [0x96F6], NFKD: [0x96F6] }, +{ source: [0xF9B3], NFC: [0x9748], NFD: [0x9748], NFKC: [0x9748], NFKD: [0x9748] }, +{ source: [0xF9B4], NFC: [0x9818], NFD: [0x9818], NFKC: [0x9818], NFKD: [0x9818] }, +{ source: [0xF9B5], NFC: [0x4F8B], NFD: [0x4F8B], NFKC: [0x4F8B], NFKD: [0x4F8B] }, +{ source: [0xF9B6], NFC: [0x79AE], NFD: [0x79AE], NFKC: [0x79AE], NFKD: [0x79AE] }, +{ source: [0xF9B7], NFC: [0x91B4], NFD: [0x91B4], NFKC: [0x91B4], NFKD: [0x91B4] }, +{ source: [0xF9B8], NFC: [0x96B8], NFD: [0x96B8], NFKC: [0x96B8], NFKD: [0x96B8] }, +{ source: [0xF9B9], NFC: [0x60E1], NFD: [0x60E1], NFKC: [0x60E1], NFKD: [0x60E1] }, +{ source: [0xF9BA], NFC: [0x4E86], NFD: [0x4E86], NFKC: [0x4E86], NFKD: [0x4E86] }, +{ source: [0xF9BB], NFC: [0x50DA], NFD: [0x50DA], NFKC: [0x50DA], NFKD: [0x50DA] }, +{ source: [0xF9BC], NFC: [0x5BEE], NFD: [0x5BEE], NFKC: [0x5BEE], NFKD: [0x5BEE] }, +{ source: [0xF9BD], NFC: [0x5C3F], NFD: [0x5C3F], NFKC: [0x5C3F], NFKD: [0x5C3F] }, +{ source: [0xF9BE], NFC: [0x6599], NFD: [0x6599], NFKC: [0x6599], NFKD: [0x6599] }, +{ source: [0xF9BF], NFC: [0x6A02], NFD: [0x6A02], NFKC: [0x6A02], NFKD: [0x6A02] }, +{ source: [0xF9C0], NFC: [0x71CE], NFD: [0x71CE], NFKC: [0x71CE], NFKD: [0x71CE] }, +{ source: [0xF9C1], NFC: [0x7642], NFD: [0x7642], NFKC: [0x7642], NFKD: [0x7642] }, +{ source: [0xF9C2], NFC: [0x84FC], NFD: [0x84FC], NFKC: [0x84FC], NFKD: [0x84FC] }, +{ source: [0xF9C3], NFC: [0x907C], NFD: [0x907C], NFKC: [0x907C], NFKD: [0x907C] }, +{ source: [0xF9C4], NFC: [0x9F8D], NFD: [0x9F8D], NFKC: [0x9F8D], NFKD: [0x9F8D] }, +{ source: [0xF9C5], NFC: [0x6688], NFD: [0x6688], NFKC: [0x6688], NFKD: [0x6688] }, +{ source: [0xF9C6], NFC: [0x962E], NFD: [0x962E], NFKC: [0x962E], NFKD: [0x962E] }, +{ source: [0xF9C7], NFC: [0x5289], NFD: [0x5289], NFKC: [0x5289], NFKD: [0x5289] }, +{ source: [0xF9C8], NFC: [0x677B], NFD: [0x677B], NFKC: [0x677B], NFKD: [0x677B] }, +{ source: [0xF9C9], NFC: [0x67F3], NFD: [0x67F3], NFKC: [0x67F3], NFKD: [0x67F3] }, +{ source: [0xF9CA], NFC: [0x6D41], NFD: [0x6D41], NFKC: [0x6D41], NFKD: [0x6D41] }, +{ source: [0xF9CB], NFC: [0x6E9C], NFD: [0x6E9C], NFKC: [0x6E9C], NFKD: [0x6E9C] }, +{ source: [0xF9CC], NFC: [0x7409], NFD: [0x7409], NFKC: [0x7409], NFKD: [0x7409] }, +{ source: [0xF9CD], NFC: [0x7559], NFD: [0x7559], NFKC: [0x7559], NFKD: [0x7559] }, +{ source: [0xF9CE], NFC: [0x786B], NFD: [0x786B], NFKC: [0x786B], NFKD: [0x786B] }, +{ source: [0xF9CF], NFC: [0x7D10], NFD: [0x7D10], NFKC: [0x7D10], NFKD: [0x7D10] }, +{ source: [0xF9D0], NFC: [0x985E], NFD: [0x985E], NFKC: [0x985E], NFKD: [0x985E] }, +{ source: [0xF9D1], NFC: [0x516D], NFD: [0x516D], NFKC: [0x516D], NFKD: [0x516D] }, +{ source: [0xF9D2], NFC: [0x622E], NFD: [0x622E], NFKC: [0x622E], NFKD: [0x622E] }, +{ source: [0xF9D3], NFC: [0x9678], NFD: [0x9678], NFKC: [0x9678], NFKD: [0x9678] }, +{ source: [0xF9D4], NFC: [0x502B], NFD: [0x502B], NFKC: [0x502B], NFKD: [0x502B] }, +{ source: [0xF9D5], NFC: [0x5D19], NFD: [0x5D19], NFKC: [0x5D19], NFKD: [0x5D19] }, +{ source: [0xF9D6], NFC: [0x6DEA], NFD: [0x6DEA], NFKC: [0x6DEA], NFKD: [0x6DEA] }, +{ source: [0xF9D7], NFC: [0x8F2A], NFD: [0x8F2A], NFKC: [0x8F2A], NFKD: [0x8F2A] }, +{ source: [0xF9D8], NFC: [0x5F8B], NFD: [0x5F8B], NFKC: [0x5F8B], NFKD: [0x5F8B] }, +{ source: [0xF9D9], NFC: [0x6144], NFD: [0x6144], NFKC: [0x6144], NFKD: [0x6144] }, +{ source: [0xF9DA], NFC: [0x6817], NFD: [0x6817], NFKC: [0x6817], NFKD: [0x6817] }, +{ source: [0xF9DB], NFC: [0x7387], NFD: [0x7387], NFKC: [0x7387], NFKD: [0x7387] }, +{ source: [0xF9DC], NFC: [0x9686], NFD: [0x9686], NFKC: [0x9686], NFKD: [0x9686] }, +{ source: [0xF9DD], NFC: [0x5229], NFD: [0x5229], NFKC: [0x5229], NFKD: [0x5229] }, +{ source: [0xF9DE], NFC: [0x540F], NFD: [0x540F], NFKC: [0x540F], NFKD: [0x540F] }, +{ source: [0xF9DF], NFC: [0x5C65], NFD: [0x5C65], NFKC: [0x5C65], NFKD: [0x5C65] }, +{ source: [0xF9E0], NFC: [0x6613], NFD: [0x6613], NFKC: [0x6613], NFKD: [0x6613] }, +{ source: [0xF9E1], NFC: [0x674E], NFD: [0x674E], NFKC: [0x674E], NFKD: [0x674E] }, +{ source: [0xF9E2], NFC: [0x68A8], NFD: [0x68A8], NFKC: [0x68A8], NFKD: [0x68A8] }, +{ source: [0xF9E3], NFC: [0x6CE5], NFD: [0x6CE5], NFKC: [0x6CE5], NFKD: [0x6CE5] }, +{ source: [0xF9E4], NFC: [0x7406], NFD: [0x7406], NFKC: [0x7406], NFKD: [0x7406] }, +{ source: [0xF9E5], NFC: [0x75E2], NFD: [0x75E2], NFKC: [0x75E2], NFKD: [0x75E2] }, +{ source: [0xF9E6], NFC: [0x7F79], NFD: [0x7F79], NFKC: [0x7F79], NFKD: [0x7F79] }, +{ source: [0xF9E7], NFC: [0x88CF], NFD: [0x88CF], NFKC: [0x88CF], NFKD: [0x88CF] }, +{ source: [0xF9E8], NFC: [0x88E1], NFD: [0x88E1], NFKC: [0x88E1], NFKD: [0x88E1] }, +{ source: [0xF9E9], NFC: [0x91CC], NFD: [0x91CC], NFKC: [0x91CC], NFKD: [0x91CC] }, +{ source: [0xF9EA], NFC: [0x96E2], NFD: [0x96E2], NFKC: [0x96E2], NFKD: [0x96E2] }, +{ source: [0xF9EB], NFC: [0x533F], NFD: [0x533F], NFKC: [0x533F], NFKD: [0x533F] }, +{ source: [0xF9EC], NFC: [0x6EBA], NFD: [0x6EBA], NFKC: [0x6EBA], NFKD: [0x6EBA] }, +{ source: [0xF9ED], NFC: [0x541D], NFD: [0x541D], NFKC: [0x541D], NFKD: [0x541D] }, +{ source: [0xF9EE], NFC: [0x71D0], NFD: [0x71D0], NFKC: [0x71D0], NFKD: [0x71D0] }, +{ source: [0xF9EF], NFC: [0x7498], NFD: [0x7498], NFKC: [0x7498], NFKD: [0x7498] }, +{ source: [0xF9F0], NFC: [0x85FA], NFD: [0x85FA], NFKC: [0x85FA], NFKD: [0x85FA] }, +{ source: [0xF9F1], NFC: [0x96A3], NFD: [0x96A3], NFKC: [0x96A3], NFKD: [0x96A3] }, +{ source: [0xF9F2], NFC: [0x9C57], NFD: [0x9C57], NFKC: [0x9C57], NFKD: [0x9C57] }, +{ source: [0xF9F3], NFC: [0x9E9F], NFD: [0x9E9F], NFKC: [0x9E9F], NFKD: [0x9E9F] }, +{ source: [0xF9F4], NFC: [0x6797], NFD: [0x6797], NFKC: [0x6797], NFKD: [0x6797] }, +{ source: [0xF9F5], NFC: [0x6DCB], NFD: [0x6DCB], NFKC: [0x6DCB], NFKD: [0x6DCB] }, +{ source: [0xF9F6], NFC: [0x81E8], NFD: [0x81E8], NFKC: [0x81E8], NFKD: [0x81E8] }, +{ source: [0xF9F7], NFC: [0x7ACB], NFD: [0x7ACB], NFKC: [0x7ACB], NFKD: [0x7ACB] }, +{ source: [0xF9F8], NFC: [0x7B20], NFD: [0x7B20], NFKC: [0x7B20], NFKD: [0x7B20] }, +{ source: [0xF9F9], NFC: [0x7C92], NFD: [0x7C92], NFKC: [0x7C92], NFKD: [0x7C92] }, +{ source: [0xF9FA], NFC: [0x72C0], NFD: [0x72C0], NFKC: [0x72C0], NFKD: [0x72C0] }, +{ source: [0xF9FB], NFC: [0x7099], NFD: [0x7099], NFKC: [0x7099], NFKD: [0x7099] }, +{ source: [0xF9FC], NFC: [0x8B58], NFD: [0x8B58], NFKC: [0x8B58], NFKD: [0x8B58] }, +{ source: [0xF9FD], NFC: [0x4EC0], NFD: [0x4EC0], NFKC: [0x4EC0], NFKD: [0x4EC0] }, +{ source: [0xF9FE], NFC: [0x8336], NFD: [0x8336], NFKC: [0x8336], NFKD: [0x8336] }, +{ source: [0xF9FF], NFC: [0x523A], NFD: [0x523A], NFKC: [0x523A], NFKD: [0x523A] }, +{ source: [0xFA00], NFC: [0x5207], NFD: [0x5207], NFKC: [0x5207], NFKD: [0x5207] }, +{ source: [0xFA01], NFC: [0x5EA6], NFD: [0x5EA6], NFKC: [0x5EA6], NFKD: [0x5EA6] }, +{ source: [0xFA02], NFC: [0x62D3], NFD: [0x62D3], NFKC: [0x62D3], NFKD: [0x62D3] }, +{ source: [0xFA03], NFC: [0x7CD6], NFD: [0x7CD6], NFKC: [0x7CD6], NFKD: [0x7CD6] }, +{ source: [0xFA04], NFC: [0x5B85], NFD: [0x5B85], NFKC: [0x5B85], NFKD: [0x5B85] }, +{ source: [0xFA05], NFC: [0x6D1E], NFD: [0x6D1E], NFKC: [0x6D1E], NFKD: [0x6D1E] }, +{ source: [0xFA06], NFC: [0x66B4], NFD: [0x66B4], NFKC: [0x66B4], NFKD: [0x66B4] }, +{ source: [0xFA07], NFC: [0x8F3B], NFD: [0x8F3B], NFKC: [0x8F3B], NFKD: [0x8F3B] }, +{ source: [0xFA08], NFC: [0x884C], NFD: [0x884C], NFKC: [0x884C], NFKD: [0x884C] }, +{ source: [0xFA09], NFC: [0x964D], NFD: [0x964D], NFKC: [0x964D], NFKD: [0x964D] }, +{ source: [0xFA0A], NFC: [0x898B], NFD: [0x898B], NFKC: [0x898B], NFKD: [0x898B] }, +{ source: [0xFA0B], NFC: [0x5ED3], NFD: [0x5ED3], NFKC: [0x5ED3], NFKD: [0x5ED3] }, +{ source: [0xFA0C], NFC: [0x5140], NFD: [0x5140], NFKC: [0x5140], NFKD: [0x5140] }, +{ source: [0xFA0D], NFC: [0x55C0], NFD: [0x55C0], NFKC: [0x55C0], NFKD: [0x55C0] }, +{ source: [0xFA10], NFC: [0x585A], NFD: [0x585A], NFKC: [0x585A], NFKD: [0x585A] }, +{ source: [0xFA12], NFC: [0x6674], NFD: [0x6674], NFKC: [0x6674], NFKD: [0x6674] }, +{ source: [0xFA15], NFC: [0x51DE], NFD: [0x51DE], NFKC: [0x51DE], NFKD: [0x51DE] }, +{ source: [0xFA16], NFC: [0x732A], NFD: [0x732A], NFKC: [0x732A], NFKD: [0x732A] }, +{ source: [0xFA17], NFC: [0x76CA], NFD: [0x76CA], NFKC: [0x76CA], NFKD: [0x76CA] }, +{ source: [0xFA18], NFC: [0x793C], NFD: [0x793C], NFKC: [0x793C], NFKD: [0x793C] }, +{ source: [0xFA19], NFC: [0x795E], NFD: [0x795E], NFKC: [0x795E], NFKD: [0x795E] }, +{ source: [0xFA1A], NFC: [0x7965], NFD: [0x7965], NFKC: [0x7965], NFKD: [0x7965] }, +{ source: [0xFA1B], NFC: [0x798F], NFD: [0x798F], NFKC: [0x798F], NFKD: [0x798F] }, +{ source: [0xFA1C], NFC: [0x9756], NFD: [0x9756], NFKC: [0x9756], NFKD: [0x9756] }, +{ source: [0xFA1D], NFC: [0x7CBE], NFD: [0x7CBE], NFKC: [0x7CBE], NFKD: [0x7CBE] }, +{ source: [0xFA1E], NFC: [0x7FBD], NFD: [0x7FBD], NFKC: [0x7FBD], NFKD: [0x7FBD] }, +{ source: [0xFA20], NFC: [0x8612], NFD: [0x8612], NFKC: [0x8612], NFKD: [0x8612] }, +{ source: [0xFA22], NFC: [0x8AF8], NFD: [0x8AF8], NFKC: [0x8AF8], NFKD: [0x8AF8] }, +{ source: [0xFA25], NFC: [0x9038], NFD: [0x9038], NFKC: [0x9038], NFKD: [0x9038] }, +{ source: [0xFA26], NFC: [0x90FD], NFD: [0x90FD], NFKC: [0x90FD], NFKD: [0x90FD] }, +{ source: [0xFA2A], NFC: [0x98EF], NFD: [0x98EF], NFKC: [0x98EF], NFKD: [0x98EF] }, +{ source: [0xFA2B], NFC: [0x98FC], NFD: [0x98FC], NFKC: [0x98FC], NFKD: [0x98FC] }, +{ source: [0xFA2C], NFC: [0x9928], NFD: [0x9928], NFKC: [0x9928], NFKD: [0x9928] }, +{ source: [0xFA2D], NFC: [0x9DB4], NFD: [0x9DB4], NFKC: [0x9DB4], NFKD: [0x9DB4] }, +{ source: [0xFA2E], NFC: [0x90DE], NFD: [0x90DE], NFKC: [0x90DE], NFKD: [0x90DE] }, +{ source: [0xFA2F], NFC: [0x96B7], NFD: [0x96B7], NFKC: [0x96B7], NFKD: [0x96B7] }, +{ source: [0xFA30], NFC: [0x4FAE], NFD: [0x4FAE], NFKC: [0x4FAE], NFKD: [0x4FAE] }, +{ source: [0xFA31], NFC: [0x50E7], NFD: [0x50E7], NFKC: [0x50E7], NFKD: [0x50E7] }, +{ source: [0xFA32], NFC: [0x514D], NFD: [0x514D], NFKC: [0x514D], NFKD: [0x514D] }, +{ source: [0xFA33], NFC: [0x52C9], NFD: [0x52C9], NFKC: [0x52C9], NFKD: [0x52C9] }, +{ source: [0xFA34], NFC: [0x52E4], NFD: [0x52E4], NFKC: [0x52E4], NFKD: [0x52E4] }, +{ source: [0xFA35], NFC: [0x5351], NFD: [0x5351], NFKC: [0x5351], NFKD: [0x5351] }, +{ source: [0xFA36], NFC: [0x559D], NFD: [0x559D], NFKC: [0x559D], NFKD: [0x559D] }, +{ source: [0xFA37], NFC: [0x5606], NFD: [0x5606], NFKC: [0x5606], NFKD: [0x5606] }, +{ source: [0xFA38], NFC: [0x5668], NFD: [0x5668], NFKC: [0x5668], NFKD: [0x5668] }, +{ source: [0xFA39], NFC: [0x5840], NFD: [0x5840], NFKC: [0x5840], NFKD: [0x5840] }, +{ source: [0xFA3A], NFC: [0x58A8], NFD: [0x58A8], NFKC: [0x58A8], NFKD: [0x58A8] }, +{ source: [0xFA3B], NFC: [0x5C64], NFD: [0x5C64], NFKC: [0x5C64], NFKD: [0x5C64] }, +{ source: [0xFA3C], NFC: [0x5C6E], NFD: [0x5C6E], NFKC: [0x5C6E], NFKD: [0x5C6E] }, +{ source: [0xFA3D], NFC: [0x6094], NFD: [0x6094], NFKC: [0x6094], NFKD: [0x6094] }, +{ source: [0xFA3E], NFC: [0x6168], NFD: [0x6168], NFKC: [0x6168], NFKD: [0x6168] }, +{ source: [0xFA3F], NFC: [0x618E], NFD: [0x618E], NFKC: [0x618E], NFKD: [0x618E] }, +{ source: [0xFA40], NFC: [0x61F2], NFD: [0x61F2], NFKC: [0x61F2], NFKD: [0x61F2] }, +{ source: [0xFA41], NFC: [0x654F], NFD: [0x654F], NFKC: [0x654F], NFKD: [0x654F] }, +{ source: [0xFA42], NFC: [0x65E2], NFD: [0x65E2], NFKC: [0x65E2], NFKD: [0x65E2] }, +{ source: [0xFA43], NFC: [0x6691], NFD: [0x6691], NFKC: [0x6691], NFKD: [0x6691] }, +{ source: [0xFA44], NFC: [0x6885], NFD: [0x6885], NFKC: [0x6885], NFKD: [0x6885] }, +{ source: [0xFA45], NFC: [0x6D77], NFD: [0x6D77], NFKC: [0x6D77], NFKD: [0x6D77] }, +{ source: [0xFA46], NFC: [0x6E1A], NFD: [0x6E1A], NFKC: [0x6E1A], NFKD: [0x6E1A] }, +{ source: [0xFA47], NFC: [0x6F22], NFD: [0x6F22], NFKC: [0x6F22], NFKD: [0x6F22] }, +{ source: [0xFA48], NFC: [0x716E], NFD: [0x716E], NFKC: [0x716E], NFKD: [0x716E] }, +{ source: [0xFA49], NFC: [0x722B], NFD: [0x722B], NFKC: [0x722B], NFKD: [0x722B] }, +{ source: [0xFA4A], NFC: [0x7422], NFD: [0x7422], NFKC: [0x7422], NFKD: [0x7422] }, +{ source: [0xFA4B], NFC: [0x7891], NFD: [0x7891], NFKC: [0x7891], NFKD: [0x7891] }, +{ source: [0xFA4C], NFC: [0x793E], NFD: [0x793E], NFKC: [0x793E], NFKD: [0x793E] }, +{ source: [0xFA4D], NFC: [0x7949], NFD: [0x7949], NFKC: [0x7949], NFKD: [0x7949] }, +{ source: [0xFA4E], NFC: [0x7948], NFD: [0x7948], NFKC: [0x7948], NFKD: [0x7948] }, +{ source: [0xFA4F], NFC: [0x7950], NFD: [0x7950], NFKC: [0x7950], NFKD: [0x7950] }, +{ source: [0xFA50], NFC: [0x7956], NFD: [0x7956], NFKC: [0x7956], NFKD: [0x7956] }, +{ source: [0xFA51], NFC: [0x795D], NFD: [0x795D], NFKC: [0x795D], NFKD: [0x795D] }, +{ source: [0xFA52], NFC: [0x798D], NFD: [0x798D], NFKC: [0x798D], NFKD: [0x798D] }, +{ source: [0xFA53], NFC: [0x798E], NFD: [0x798E], NFKC: [0x798E], NFKD: [0x798E] }, +{ source: [0xFA54], NFC: [0x7A40], NFD: [0x7A40], NFKC: [0x7A40], NFKD: [0x7A40] }, +{ source: [0xFA55], NFC: [0x7A81], NFD: [0x7A81], NFKC: [0x7A81], NFKD: [0x7A81] }, +{ source: [0xFA56], NFC: [0x7BC0], NFD: [0x7BC0], NFKC: [0x7BC0], NFKD: [0x7BC0] }, +{ source: [0xFA57], NFC: [0x7DF4], NFD: [0x7DF4], NFKC: [0x7DF4], NFKD: [0x7DF4] }, +{ source: [0xFA58], NFC: [0x7E09], NFD: [0x7E09], NFKC: [0x7E09], NFKD: [0x7E09] }, +{ source: [0xFA59], NFC: [0x7E41], NFD: [0x7E41], NFKC: [0x7E41], NFKD: [0x7E41] }, +{ source: [0xFA5A], NFC: [0x7F72], NFD: [0x7F72], NFKC: [0x7F72], NFKD: [0x7F72] }, +{ source: [0xFA5B], NFC: [0x8005], NFD: [0x8005], NFKC: [0x8005], NFKD: [0x8005] }, +{ source: [0xFA5C], NFC: [0x81ED], NFD: [0x81ED], NFKC: [0x81ED], NFKD: [0x81ED] }, +{ source: [0xFA5D], NFC: [0x8279], NFD: [0x8279], NFKC: [0x8279], NFKD: [0x8279] }, +{ source: [0xFA5E], NFC: [0x8279], NFD: [0x8279], NFKC: [0x8279], NFKD: [0x8279] }, +{ source: [0xFA5F], NFC: [0x8457], NFD: [0x8457], NFKC: [0x8457], NFKD: [0x8457] }, +{ source: [0xFA60], NFC: [0x8910], NFD: [0x8910], NFKC: [0x8910], NFKD: [0x8910] }, +{ source: [0xFA61], NFC: [0x8996], NFD: [0x8996], NFKC: [0x8996], NFKD: [0x8996] }, +{ source: [0xFA62], NFC: [0x8B01], NFD: [0x8B01], NFKC: [0x8B01], NFKD: [0x8B01] }, +{ source: [0xFA63], NFC: [0x8B39], NFD: [0x8B39], NFKC: [0x8B39], NFKD: [0x8B39] }, +{ source: [0xFA64], NFC: [0x8CD3], NFD: [0x8CD3], NFKC: [0x8CD3], NFKD: [0x8CD3] }, +{ source: [0xFA65], NFC: [0x8D08], NFD: [0x8D08], NFKC: [0x8D08], NFKD: [0x8D08] }, +{ source: [0xFA66], NFC: [0x8FB6], NFD: [0x8FB6], NFKC: [0x8FB6], NFKD: [0x8FB6] }, +{ source: [0xFA67], NFC: [0x9038], NFD: [0x9038], NFKC: [0x9038], NFKD: [0x9038] }, +{ source: [0xFA68], NFC: [0x96E3], NFD: [0x96E3], NFKC: [0x96E3], NFKD: [0x96E3] }, +{ source: [0xFA69], NFC: [0x97FF], NFD: [0x97FF], NFKC: [0x97FF], NFKD: [0x97FF] }, +{ source: [0xFA6A], NFC: [0x983B], NFD: [0x983B], NFKC: [0x983B], NFKD: [0x983B] }, +{ source: [0xFA6B], NFC: [0x6075], NFD: [0x6075], NFKC: [0x6075], NFKD: [0x6075] }, +{ source: [0xFA6C], NFC: [0x242EE], NFD: [0x242EE], NFKC: [0x242EE], NFKD: [0x242EE] }, +{ source: [0xFA6D], NFC: [0x8218], NFD: [0x8218], NFKC: [0x8218], NFKD: [0x8218] }, +{ source: [0xFA70], NFC: [0x4E26], NFD: [0x4E26], NFKC: [0x4E26], NFKD: [0x4E26] }, +{ source: [0xFA71], NFC: [0x51B5], NFD: [0x51B5], NFKC: [0x51B5], NFKD: [0x51B5] }, +{ source: [0xFA72], NFC: [0x5168], NFD: [0x5168], NFKC: [0x5168], NFKD: [0x5168] }, +{ source: [0xFA73], NFC: [0x4F80], NFD: [0x4F80], NFKC: [0x4F80], NFKD: [0x4F80] }, +{ source: [0xFA74], NFC: [0x5145], NFD: [0x5145], NFKC: [0x5145], NFKD: [0x5145] }, +{ source: [0xFA75], NFC: [0x5180], NFD: [0x5180], NFKC: [0x5180], NFKD: [0x5180] }, +{ source: [0xFA76], NFC: [0x52C7], NFD: [0x52C7], NFKC: [0x52C7], NFKD: [0x52C7] }, +{ source: [0xFA77], NFC: [0x52FA], NFD: [0x52FA], NFKC: [0x52FA], NFKD: [0x52FA] }, +{ source: [0xFA78], NFC: [0x559D], NFD: [0x559D], NFKC: [0x559D], NFKD: [0x559D] }, +{ source: [0xFA79], NFC: [0x5555], NFD: [0x5555], NFKC: [0x5555], NFKD: [0x5555] }, +{ source: [0xFA7A], NFC: [0x5599], NFD: [0x5599], NFKC: [0x5599], NFKD: [0x5599] }, +{ source: [0xFA7B], NFC: [0x55E2], NFD: [0x55E2], NFKC: [0x55E2], NFKD: [0x55E2] }, +{ source: [0xFA7C], NFC: [0x585A], NFD: [0x585A], NFKC: [0x585A], NFKD: [0x585A] }, +{ source: [0xFA7D], NFC: [0x58B3], NFD: [0x58B3], NFKC: [0x58B3], NFKD: [0x58B3] }, +{ source: [0xFA7E], NFC: [0x5944], NFD: [0x5944], NFKC: [0x5944], NFKD: [0x5944] }, +{ source: [0xFA7F], NFC: [0x5954], NFD: [0x5954], NFKC: [0x5954], NFKD: [0x5954] }, +{ source: [0xFA80], NFC: [0x5A62], NFD: [0x5A62], NFKC: [0x5A62], NFKD: [0x5A62] }, +{ source: [0xFA81], NFC: [0x5B28], NFD: [0x5B28], NFKC: [0x5B28], NFKD: [0x5B28] }, +{ source: [0xFA82], NFC: [0x5ED2], NFD: [0x5ED2], NFKC: [0x5ED2], NFKD: [0x5ED2] }, +{ source: [0xFA83], NFC: [0x5ED9], NFD: [0x5ED9], NFKC: [0x5ED9], NFKD: [0x5ED9] }, +{ source: [0xFA84], NFC: [0x5F69], NFD: [0x5F69], NFKC: [0x5F69], NFKD: [0x5F69] }, +{ source: [0xFA85], NFC: [0x5FAD], NFD: [0x5FAD], NFKC: [0x5FAD], NFKD: [0x5FAD] }, +{ source: [0xFA86], NFC: [0x60D8], NFD: [0x60D8], NFKC: [0x60D8], NFKD: [0x60D8] }, +{ source: [0xFA87], NFC: [0x614E], NFD: [0x614E], NFKC: [0x614E], NFKD: [0x614E] }, +{ source: [0xFA88], NFC: [0x6108], NFD: [0x6108], NFKC: [0x6108], NFKD: [0x6108] }, +{ source: [0xFA89], NFC: [0x618E], NFD: [0x618E], NFKC: [0x618E], NFKD: [0x618E] }, +{ source: [0xFA8A], NFC: [0x6160], NFD: [0x6160], NFKC: [0x6160], NFKD: [0x6160] }, +{ source: [0xFA8B], NFC: [0x61F2], NFD: [0x61F2], NFKC: [0x61F2], NFKD: [0x61F2] }, +{ source: [0xFA8C], NFC: [0x6234], NFD: [0x6234], NFKC: [0x6234], NFKD: [0x6234] }, +{ source: [0xFA8D], NFC: [0x63C4], NFD: [0x63C4], NFKC: [0x63C4], NFKD: [0x63C4] }, +{ source: [0xFA8E], NFC: [0x641C], NFD: [0x641C], NFKC: [0x641C], NFKD: [0x641C] }, +{ source: [0xFA8F], NFC: [0x6452], NFD: [0x6452], NFKC: [0x6452], NFKD: [0x6452] }, +{ source: [0xFA90], NFC: [0x6556], NFD: [0x6556], NFKC: [0x6556], NFKD: [0x6556] }, +{ source: [0xFA91], NFC: [0x6674], NFD: [0x6674], NFKC: [0x6674], NFKD: [0x6674] }, +{ source: [0xFA92], NFC: [0x6717], NFD: [0x6717], NFKC: [0x6717], NFKD: [0x6717] }, +{ source: [0xFA93], NFC: [0x671B], NFD: [0x671B], NFKC: [0x671B], NFKD: [0x671B] }, +{ source: [0xFA94], NFC: [0x6756], NFD: [0x6756], NFKC: [0x6756], NFKD: [0x6756] }, +{ source: [0xFA95], NFC: [0x6B79], NFD: [0x6B79], NFKC: [0x6B79], NFKD: [0x6B79] }, +{ source: [0xFA96], NFC: [0x6BBA], NFD: [0x6BBA], NFKC: [0x6BBA], NFKD: [0x6BBA] }, +{ source: [0xFA97], NFC: [0x6D41], NFD: [0x6D41], NFKC: [0x6D41], NFKD: [0x6D41] }, +{ source: [0xFA98], NFC: [0x6EDB], NFD: [0x6EDB], NFKC: [0x6EDB], NFKD: [0x6EDB] }, +{ source: [0xFA99], NFC: [0x6ECB], NFD: [0x6ECB], NFKC: [0x6ECB], NFKD: [0x6ECB] }, +{ source: [0xFA9A], NFC: [0x6F22], NFD: [0x6F22], NFKC: [0x6F22], NFKD: [0x6F22] }, +{ source: [0xFA9B], NFC: [0x701E], NFD: [0x701E], NFKC: [0x701E], NFKD: [0x701E] }, +{ source: [0xFA9C], NFC: [0x716E], NFD: [0x716E], NFKC: [0x716E], NFKD: [0x716E] }, +{ source: [0xFA9D], NFC: [0x77A7], NFD: [0x77A7], NFKC: [0x77A7], NFKD: [0x77A7] }, +{ source: [0xFA9E], NFC: [0x7235], NFD: [0x7235], NFKC: [0x7235], NFKD: [0x7235] }, +{ source: [0xFA9F], NFC: [0x72AF], NFD: [0x72AF], NFKC: [0x72AF], NFKD: [0x72AF] }, +{ source: [0xFAA0], NFC: [0x732A], NFD: [0x732A], NFKC: [0x732A], NFKD: [0x732A] }, +{ source: [0xFAA1], NFC: [0x7471], NFD: [0x7471], NFKC: [0x7471], NFKD: [0x7471] }, +{ source: [0xFAA2], NFC: [0x7506], NFD: [0x7506], NFKC: [0x7506], NFKD: [0x7506] }, +{ source: [0xFAA3], NFC: [0x753B], NFD: [0x753B], NFKC: [0x753B], NFKD: [0x753B] }, +{ source: [0xFAA4], NFC: [0x761D], NFD: [0x761D], NFKC: [0x761D], NFKD: [0x761D] }, +{ source: [0xFAA5], NFC: [0x761F], NFD: [0x761F], NFKC: [0x761F], NFKD: [0x761F] }, +{ source: [0xFAA6], NFC: [0x76CA], NFD: [0x76CA], NFKC: [0x76CA], NFKD: [0x76CA] }, +{ source: [0xFAA7], NFC: [0x76DB], NFD: [0x76DB], NFKC: [0x76DB], NFKD: [0x76DB] }, +{ source: [0xFAA8], NFC: [0x76F4], NFD: [0x76F4], NFKC: [0x76F4], NFKD: [0x76F4] }, +{ source: [0xFAA9], NFC: [0x774A], NFD: [0x774A], NFKC: [0x774A], NFKD: [0x774A] }, +{ source: [0xFAAA], NFC: [0x7740], NFD: [0x7740], NFKC: [0x7740], NFKD: [0x7740] }, +{ source: [0xFAAB], NFC: [0x78CC], NFD: [0x78CC], NFKC: [0x78CC], NFKD: [0x78CC] }, +{ source: [0xFAAC], NFC: [0x7AB1], NFD: [0x7AB1], NFKC: [0x7AB1], NFKD: [0x7AB1] }, +{ source: [0xFAAD], NFC: [0x7BC0], NFD: [0x7BC0], NFKC: [0x7BC0], NFKD: [0x7BC0] }, +{ source: [0xFAAE], NFC: [0x7C7B], NFD: [0x7C7B], NFKC: [0x7C7B], NFKD: [0x7C7B] }, +{ source: [0xFAAF], NFC: [0x7D5B], NFD: [0x7D5B], NFKC: [0x7D5B], NFKD: [0x7D5B] }, +{ source: [0xFAB0], NFC: [0x7DF4], NFD: [0x7DF4], NFKC: [0x7DF4], NFKD: [0x7DF4] }, +{ source: [0xFAB1], NFC: [0x7F3E], NFD: [0x7F3E], NFKC: [0x7F3E], NFKD: [0x7F3E] }, +{ source: [0xFAB2], NFC: [0x8005], NFD: [0x8005], NFKC: [0x8005], NFKD: [0x8005] }, +{ source: [0xFAB3], NFC: [0x8352], NFD: [0x8352], NFKC: [0x8352], NFKD: [0x8352] }, +{ source: [0xFAB4], NFC: [0x83EF], NFD: [0x83EF], NFKC: [0x83EF], NFKD: [0x83EF] }, +{ source: [0xFAB5], NFC: [0x8779], NFD: [0x8779], NFKC: [0x8779], NFKD: [0x8779] }, +{ source: [0xFAB6], NFC: [0x8941], NFD: [0x8941], NFKC: [0x8941], NFKD: [0x8941] }, +{ source: [0xFAB7], NFC: [0x8986], NFD: [0x8986], NFKC: [0x8986], NFKD: [0x8986] }, +{ source: [0xFAB8], NFC: [0x8996], NFD: [0x8996], NFKC: [0x8996], NFKD: [0x8996] }, +{ source: [0xFAB9], NFC: [0x8ABF], NFD: [0x8ABF], NFKC: [0x8ABF], NFKD: [0x8ABF] }, +{ source: [0xFABA], NFC: [0x8AF8], NFD: [0x8AF8], NFKC: [0x8AF8], NFKD: [0x8AF8] }, +{ source: [0xFABB], NFC: [0x8ACB], NFD: [0x8ACB], NFKC: [0x8ACB], NFKD: [0x8ACB] }, +{ source: [0xFABC], NFC: [0x8B01], NFD: [0x8B01], NFKC: [0x8B01], NFKD: [0x8B01] }, +{ source: [0xFABD], NFC: [0x8AFE], NFD: [0x8AFE], NFKC: [0x8AFE], NFKD: [0x8AFE] }, +{ source: [0xFABE], NFC: [0x8AED], NFD: [0x8AED], NFKC: [0x8AED], NFKD: [0x8AED] }, +{ source: [0xFABF], NFC: [0x8B39], NFD: [0x8B39], NFKC: [0x8B39], NFKD: [0x8B39] }, +{ source: [0xFAC0], NFC: [0x8B8A], NFD: [0x8B8A], NFKC: [0x8B8A], NFKD: [0x8B8A] }, +{ source: [0xFAC1], NFC: [0x8D08], NFD: [0x8D08], NFKC: [0x8D08], NFKD: [0x8D08] }, +{ source: [0xFAC2], NFC: [0x8F38], NFD: [0x8F38], NFKC: [0x8F38], NFKD: [0x8F38] }, +{ source: [0xFAC3], NFC: [0x9072], NFD: [0x9072], NFKC: [0x9072], NFKD: [0x9072] }, +{ source: [0xFAC4], NFC: [0x9199], NFD: [0x9199], NFKC: [0x9199], NFKD: [0x9199] }, +{ source: [0xFAC5], NFC: [0x9276], NFD: [0x9276], NFKC: [0x9276], NFKD: [0x9276] }, +{ source: [0xFAC6], NFC: [0x967C], NFD: [0x967C], NFKC: [0x967C], NFKD: [0x967C] }, +{ source: [0xFAC7], NFC: [0x96E3], NFD: [0x96E3], NFKC: [0x96E3], NFKD: [0x96E3] }, +{ source: [0xFAC8], NFC: [0x9756], NFD: [0x9756], NFKC: [0x9756], NFKD: [0x9756] }, +{ source: [0xFAC9], NFC: [0x97DB], NFD: [0x97DB], NFKC: [0x97DB], NFKD: [0x97DB] }, +{ source: [0xFACA], NFC: [0x97FF], NFD: [0x97FF], NFKC: [0x97FF], NFKD: [0x97FF] }, +{ source: [0xFACB], NFC: [0x980B], NFD: [0x980B], NFKC: [0x980B], NFKD: [0x980B] }, +{ source: [0xFACC], NFC: [0x983B], NFD: [0x983B], NFKC: [0x983B], NFKD: [0x983B] }, +{ source: [0xFACD], NFC: [0x9B12], NFD: [0x9B12], NFKC: [0x9B12], NFKD: [0x9B12] }, +{ source: [0xFACE], NFC: [0x9F9C], NFD: [0x9F9C], NFKC: [0x9F9C], NFKD: [0x9F9C] }, +{ source: [0xFACF], NFC: [0x2284A], NFD: [0x2284A], NFKC: [0x2284A], NFKD: [0x2284A] }, +{ source: [0xFAD0], NFC: [0x22844], NFD: [0x22844], NFKC: [0x22844], NFKD: [0x22844] }, +{ source: [0xFAD1], NFC: [0x233D5], NFD: [0x233D5], NFKC: [0x233D5], NFKD: [0x233D5] }, +{ source: [0xFAD2], NFC: [0x3B9D], NFD: [0x3B9D], NFKC: [0x3B9D], NFKD: [0x3B9D] }, +{ source: [0xFAD3], NFC: [0x4018], NFD: [0x4018], NFKC: [0x4018], NFKD: [0x4018] }, +{ source: [0xFAD4], NFC: [0x4039], NFD: [0x4039], NFKC: [0x4039], NFKD: [0x4039] }, +{ source: [0xFAD5], NFC: [0x25249], NFD: [0x25249], NFKC: [0x25249], NFKD: [0x25249] }, +{ source: [0xFAD6], NFC: [0x25CD0], NFD: [0x25CD0], NFKC: [0x25CD0], NFKD: [0x25CD0] }, +{ source: [0xFAD7], NFC: [0x27ED3], NFD: [0x27ED3], NFKC: [0x27ED3], NFKD: [0x27ED3] }, +{ source: [0xFAD8], NFC: [0x9F43], NFD: [0x9F43], NFKC: [0x9F43], NFKD: [0x9F43] }, +{ source: [0xFAD9], NFC: [0x9F8E], NFD: [0x9F8E], NFKC: [0x9F8E], NFKD: [0x9F8E] }, +{ source: [0xFB00], NFC: [0xFB00], NFD: [0xFB00], NFKC: [0x0066, 0x0066], NFKD: [0x0066, 0x0066] }, +{ source: [0xFB01], NFC: [0xFB01], NFD: [0xFB01], NFKC: [0x0066, 0x0069], NFKD: [0x0066, 0x0069] }, +{ source: [0xFB02], NFC: [0xFB02], NFD: [0xFB02], NFKC: [0x0066, 0x006C], NFKD: [0x0066, 0x006C] }, +{ source: [0xFB03], NFC: [0xFB03], NFD: [0xFB03], NFKC: [0x0066, 0x0066, 0x0069], NFKD: [0x0066, 0x0066, 0x0069] }, +{ source: [0xFB04], NFC: [0xFB04], NFD: [0xFB04], NFKC: [0x0066, 0x0066, 0x006C], NFKD: [0x0066, 0x0066, 0x006C] }, +{ source: [0xFB05], NFC: [0xFB05], NFD: [0xFB05], NFKC: [0x0073, 0x0074], NFKD: [0x0073, 0x0074] }, +{ source: [0xFB06], NFC: [0xFB06], NFD: [0xFB06], NFKC: [0x0073, 0x0074], NFKD: [0x0073, 0x0074] }, +{ source: [0xFB13], NFC: [0xFB13], NFD: [0xFB13], NFKC: [0x0574, 0x0576], NFKD: [0x0574, 0x0576] }, +{ source: [0xFB14], NFC: [0xFB14], NFD: [0xFB14], NFKC: [0x0574, 0x0565], NFKD: [0x0574, 0x0565] }, +{ source: [0xFB15], NFC: [0xFB15], NFD: [0xFB15], NFKC: [0x0574, 0x056B], NFKD: [0x0574, 0x056B] }, +{ source: [0xFB16], NFC: [0xFB16], NFD: [0xFB16], NFKC: [0x057E, 0x0576], NFKD: [0x057E, 0x0576] }, +{ source: [0xFB17], NFC: [0xFB17], NFD: [0xFB17], NFKC: [0x0574, 0x056D], NFKD: [0x0574, 0x056D] }, +{ source: [0xFB1D], NFC: [0x05D9, 0x05B4], NFD: [0x05D9, 0x05B4], NFKC: [0x05D9, 0x05B4], NFKD: [0x05D9, 0x05B4] }, +{ source: [0xFB1F], NFC: [0x05F2, 0x05B7], NFD: [0x05F2, 0x05B7], NFKC: [0x05F2, 0x05B7], NFKD: [0x05F2, 0x05B7] }, +{ source: [0xFB20], NFC: [0xFB20], NFD: [0xFB20], NFKC: [0x05E2], NFKD: [0x05E2] }, +{ source: [0xFB21], NFC: [0xFB21], NFD: [0xFB21], NFKC: [0x05D0], NFKD: [0x05D0] }, +{ source: [0xFB22], NFC: [0xFB22], NFD: [0xFB22], NFKC: [0x05D3], NFKD: [0x05D3] }, +{ source: [0xFB23], NFC: [0xFB23], NFD: [0xFB23], NFKC: [0x05D4], NFKD: [0x05D4] }, +{ source: [0xFB24], NFC: [0xFB24], NFD: [0xFB24], NFKC: [0x05DB], NFKD: [0x05DB] }, +{ source: [0xFB25], NFC: [0xFB25], NFD: [0xFB25], NFKC: [0x05DC], NFKD: [0x05DC] }, +{ source: [0xFB26], NFC: [0xFB26], NFD: [0xFB26], NFKC: [0x05DD], NFKD: [0x05DD] }, +{ source: [0xFB27], NFC: [0xFB27], NFD: [0xFB27], NFKC: [0x05E8], NFKD: [0x05E8] }, +{ source: [0xFB28], NFC: [0xFB28], NFD: [0xFB28], NFKC: [0x05EA], NFKD: [0x05EA] }, +{ source: [0xFB29], NFC: [0xFB29], NFD: [0xFB29], NFKC: [0x002B], NFKD: [0x002B] }, +{ source: [0xFB2A], NFC: [0x05E9, 0x05C1], NFD: [0x05E9, 0x05C1], NFKC: [0x05E9, 0x05C1], NFKD: [0x05E9, 0x05C1] }, +{ source: [0xFB2B], NFC: [0x05E9, 0x05C2], NFD: [0x05E9, 0x05C2], NFKC: [0x05E9, 0x05C2], NFKD: [0x05E9, 0x05C2] }, +{ source: [0xFB2C], NFC: [0x05E9, 0x05BC, 0x05C1], NFD: [0x05E9, 0x05BC, 0x05C1], NFKC: [0x05E9, 0x05BC, 0x05C1], NFKD: [0x05E9, 0x05BC, 0x05C1] }, +{ source: [0xFB2D], NFC: [0x05E9, 0x05BC, 0x05C2], NFD: [0x05E9, 0x05BC, 0x05C2], NFKC: [0x05E9, 0x05BC, 0x05C2], NFKD: [0x05E9, 0x05BC, 0x05C2] }, +{ source: [0xFB2E], NFC: [0x05D0, 0x05B7], NFD: [0x05D0, 0x05B7], NFKC: [0x05D0, 0x05B7], NFKD: [0x05D0, 0x05B7] }, +{ source: [0xFB2F], NFC: [0x05D0, 0x05B8], NFD: [0x05D0, 0x05B8], NFKC: [0x05D0, 0x05B8], NFKD: [0x05D0, 0x05B8] }, +{ source: [0xFB30], NFC: [0x05D0, 0x05BC], NFD: [0x05D0, 0x05BC], NFKC: [0x05D0, 0x05BC], NFKD: [0x05D0, 0x05BC] }, +{ source: [0xFB31], NFC: [0x05D1, 0x05BC], NFD: [0x05D1, 0x05BC], NFKC: [0x05D1, 0x05BC], NFKD: [0x05D1, 0x05BC] }, +{ source: [0xFB32], NFC: [0x05D2, 0x05BC], NFD: [0x05D2, 0x05BC], NFKC: [0x05D2, 0x05BC], NFKD: [0x05D2, 0x05BC] }, +{ source: [0xFB33], NFC: [0x05D3, 0x05BC], NFD: [0x05D3, 0x05BC], NFKC: [0x05D3, 0x05BC], NFKD: [0x05D3, 0x05BC] }, +{ source: [0xFB34], NFC: [0x05D4, 0x05BC], NFD: [0x05D4, 0x05BC], NFKC: [0x05D4, 0x05BC], NFKD: [0x05D4, 0x05BC] }, +{ source: [0xFB35], NFC: [0x05D5, 0x05BC], NFD: [0x05D5, 0x05BC], NFKC: [0x05D5, 0x05BC], NFKD: [0x05D5, 0x05BC] }, +{ source: [0xFB36], NFC: [0x05D6, 0x05BC], NFD: [0x05D6, 0x05BC], NFKC: [0x05D6, 0x05BC], NFKD: [0x05D6, 0x05BC] }, +{ source: [0xFB38], NFC: [0x05D8, 0x05BC], NFD: [0x05D8, 0x05BC], NFKC: [0x05D8, 0x05BC], NFKD: [0x05D8, 0x05BC] }, +{ source: [0xFB39], NFC: [0x05D9, 0x05BC], NFD: [0x05D9, 0x05BC], NFKC: [0x05D9, 0x05BC], NFKD: [0x05D9, 0x05BC] }, +{ source: [0xFB3A], NFC: [0x05DA, 0x05BC], NFD: [0x05DA, 0x05BC], NFKC: [0x05DA, 0x05BC], NFKD: [0x05DA, 0x05BC] }, +{ source: [0xFB3B], NFC: [0x05DB, 0x05BC], NFD: [0x05DB, 0x05BC], NFKC: [0x05DB, 0x05BC], NFKD: [0x05DB, 0x05BC] }, +{ source: [0xFB3C], NFC: [0x05DC, 0x05BC], NFD: [0x05DC, 0x05BC], NFKC: [0x05DC, 0x05BC], NFKD: [0x05DC, 0x05BC] }, +{ source: [0xFB3E], NFC: [0x05DE, 0x05BC], NFD: [0x05DE, 0x05BC], NFKC: [0x05DE, 0x05BC], NFKD: [0x05DE, 0x05BC] }, +{ source: [0xFB40], NFC: [0x05E0, 0x05BC], NFD: [0x05E0, 0x05BC], NFKC: [0x05E0, 0x05BC], NFKD: [0x05E0, 0x05BC] }, +{ source: [0xFB41], NFC: [0x05E1, 0x05BC], NFD: [0x05E1, 0x05BC], NFKC: [0x05E1, 0x05BC], NFKD: [0x05E1, 0x05BC] }, +{ source: [0xFB43], NFC: [0x05E3, 0x05BC], NFD: [0x05E3, 0x05BC], NFKC: [0x05E3, 0x05BC], NFKD: [0x05E3, 0x05BC] }, +{ source: [0xFB44], NFC: [0x05E4, 0x05BC], NFD: [0x05E4, 0x05BC], NFKC: [0x05E4, 0x05BC], NFKD: [0x05E4, 0x05BC] }, +{ source: [0xFB46], NFC: [0x05E6, 0x05BC], NFD: [0x05E6, 0x05BC], NFKC: [0x05E6, 0x05BC], NFKD: [0x05E6, 0x05BC] }, +{ source: [0xFB47], NFC: [0x05E7, 0x05BC], NFD: [0x05E7, 0x05BC], NFKC: [0x05E7, 0x05BC], NFKD: [0x05E7, 0x05BC] }, +{ source: [0xFB48], NFC: [0x05E8, 0x05BC], NFD: [0x05E8, 0x05BC], NFKC: [0x05E8, 0x05BC], NFKD: [0x05E8, 0x05BC] }, +{ source: [0xFB49], NFC: [0x05E9, 0x05BC], NFD: [0x05E9, 0x05BC], NFKC: [0x05E9, 0x05BC], NFKD: [0x05E9, 0x05BC] }, +{ source: [0xFB4A], NFC: [0x05EA, 0x05BC], NFD: [0x05EA, 0x05BC], NFKC: [0x05EA, 0x05BC], NFKD: [0x05EA, 0x05BC] }, +{ source: [0xFB4B], NFC: [0x05D5, 0x05B9], NFD: [0x05D5, 0x05B9], NFKC: [0x05D5, 0x05B9], NFKD: [0x05D5, 0x05B9] }, +{ source: [0xFB4C], NFC: [0x05D1, 0x05BF], NFD: [0x05D1, 0x05BF], NFKC: [0x05D1, 0x05BF], NFKD: [0x05D1, 0x05BF] }, +{ source: [0xFB4D], NFC: [0x05DB, 0x05BF], NFD: [0x05DB, 0x05BF], NFKC: [0x05DB, 0x05BF], NFKD: [0x05DB, 0x05BF] }, +{ source: [0xFB4E], NFC: [0x05E4, 0x05BF], NFD: [0x05E4, 0x05BF], NFKC: [0x05E4, 0x05BF], NFKD: [0x05E4, 0x05BF] }, +{ source: [0xFB4F], NFC: [0xFB4F], NFD: [0xFB4F], NFKC: [0x05D0, 0x05DC], NFKD: [0x05D0, 0x05DC] }, +{ source: [0xFB50], NFC: [0xFB50], NFD: [0xFB50], NFKC: [0x0671], NFKD: [0x0671] }, +{ source: [0xFB51], NFC: [0xFB51], NFD: [0xFB51], NFKC: [0x0671], NFKD: [0x0671] }, +{ source: [0xFB52], NFC: [0xFB52], NFD: [0xFB52], NFKC: [0x067B], NFKD: [0x067B] }, +{ source: [0xFB53], NFC: [0xFB53], NFD: [0xFB53], NFKC: [0x067B], NFKD: [0x067B] }, +{ source: [0xFB54], NFC: [0xFB54], NFD: [0xFB54], NFKC: [0x067B], NFKD: [0x067B] }, +{ source: [0xFB55], NFC: [0xFB55], NFD: [0xFB55], NFKC: [0x067B], NFKD: [0x067B] }, +{ source: [0xFB56], NFC: [0xFB56], NFD: [0xFB56], NFKC: [0x067E], NFKD: [0x067E] }, +{ source: [0xFB57], NFC: [0xFB57], NFD: [0xFB57], NFKC: [0x067E], NFKD: [0x067E] }, +{ source: [0xFB58], NFC: [0xFB58], NFD: [0xFB58], NFKC: [0x067E], NFKD: [0x067E] }, +{ source: [0xFB59], NFC: [0xFB59], NFD: [0xFB59], NFKC: [0x067E], NFKD: [0x067E] }, +{ source: [0xFB5A], NFC: [0xFB5A], NFD: [0xFB5A], NFKC: [0x0680], NFKD: [0x0680] }, +{ source: [0xFB5B], NFC: [0xFB5B], NFD: [0xFB5B], NFKC: [0x0680], NFKD: [0x0680] }, +{ source: [0xFB5C], NFC: [0xFB5C], NFD: [0xFB5C], NFKC: [0x0680], NFKD: [0x0680] }, +{ source: [0xFB5D], NFC: [0xFB5D], NFD: [0xFB5D], NFKC: [0x0680], NFKD: [0x0680] }, +{ source: [0xFB5E], NFC: [0xFB5E], NFD: [0xFB5E], NFKC: [0x067A], NFKD: [0x067A] }, +{ source: [0xFB5F], NFC: [0xFB5F], NFD: [0xFB5F], NFKC: [0x067A], NFKD: [0x067A] }, +{ source: [0xFB60], NFC: [0xFB60], NFD: [0xFB60], NFKC: [0x067A], NFKD: [0x067A] }, +{ source: [0xFB61], NFC: [0xFB61], NFD: [0xFB61], NFKC: [0x067A], NFKD: [0x067A] }, +{ source: [0xFB62], NFC: [0xFB62], NFD: [0xFB62], NFKC: [0x067F], NFKD: [0x067F] }, +{ source: [0xFB63], NFC: [0xFB63], NFD: [0xFB63], NFKC: [0x067F], NFKD: [0x067F] }, +{ source: [0xFB64], NFC: [0xFB64], NFD: [0xFB64], NFKC: [0x067F], NFKD: [0x067F] }, +{ source: [0xFB65], NFC: [0xFB65], NFD: [0xFB65], NFKC: [0x067F], NFKD: [0x067F] }, +{ source: [0xFB66], NFC: [0xFB66], NFD: [0xFB66], NFKC: [0x0679], NFKD: [0x0679] }, +{ source: [0xFB67], NFC: [0xFB67], NFD: [0xFB67], NFKC: [0x0679], NFKD: [0x0679] }, +{ source: [0xFB68], NFC: [0xFB68], NFD: [0xFB68], NFKC: [0x0679], NFKD: [0x0679] }, +{ source: [0xFB69], NFC: [0xFB69], NFD: [0xFB69], NFKC: [0x0679], NFKD: [0x0679] }, +{ source: [0xFB6A], NFC: [0xFB6A], NFD: [0xFB6A], NFKC: [0x06A4], NFKD: [0x06A4] }, +{ source: [0xFB6B], NFC: [0xFB6B], NFD: [0xFB6B], NFKC: [0x06A4], NFKD: [0x06A4] }, +{ source: [0xFB6C], NFC: [0xFB6C], NFD: [0xFB6C], NFKC: [0x06A4], NFKD: [0x06A4] }, +{ source: [0xFB6D], NFC: [0xFB6D], NFD: [0xFB6D], NFKC: [0x06A4], NFKD: [0x06A4] }, +{ source: [0xFB6E], NFC: [0xFB6E], NFD: [0xFB6E], NFKC: [0x06A6], NFKD: [0x06A6] }, +{ source: [0xFB6F], NFC: [0xFB6F], NFD: [0xFB6F], NFKC: [0x06A6], NFKD: [0x06A6] }, +{ source: [0xFB70], NFC: [0xFB70], NFD: [0xFB70], NFKC: [0x06A6], NFKD: [0x06A6] }, +{ source: [0xFB71], NFC: [0xFB71], NFD: [0xFB71], NFKC: [0x06A6], NFKD: [0x06A6] }, +{ source: [0xFB72], NFC: [0xFB72], NFD: [0xFB72], NFKC: [0x0684], NFKD: [0x0684] }, +{ source: [0xFB73], NFC: [0xFB73], NFD: [0xFB73], NFKC: [0x0684], NFKD: [0x0684] }, +{ source: [0xFB74], NFC: [0xFB74], NFD: [0xFB74], NFKC: [0x0684], NFKD: [0x0684] }, +{ source: [0xFB75], NFC: [0xFB75], NFD: [0xFB75], NFKC: [0x0684], NFKD: [0x0684] }, +{ source: [0xFB76], NFC: [0xFB76], NFD: [0xFB76], NFKC: [0x0683], NFKD: [0x0683] }, +{ source: [0xFB77], NFC: [0xFB77], NFD: [0xFB77], NFKC: [0x0683], NFKD: [0x0683] }, +{ source: [0xFB78], NFC: [0xFB78], NFD: [0xFB78], NFKC: [0x0683], NFKD: [0x0683] }, +{ source: [0xFB79], NFC: [0xFB79], NFD: [0xFB79], NFKC: [0x0683], NFKD: [0x0683] }, +{ source: [0xFB7A], NFC: [0xFB7A], NFD: [0xFB7A], NFKC: [0x0686], NFKD: [0x0686] }, +{ source: [0xFB7B], NFC: [0xFB7B], NFD: [0xFB7B], NFKC: [0x0686], NFKD: [0x0686] }, +{ source: [0xFB7C], NFC: [0xFB7C], NFD: [0xFB7C], NFKC: [0x0686], NFKD: [0x0686] }, +{ source: [0xFB7D], NFC: [0xFB7D], NFD: [0xFB7D], NFKC: [0x0686], NFKD: [0x0686] }, +{ source: [0xFB7E], NFC: [0xFB7E], NFD: [0xFB7E], NFKC: [0x0687], NFKD: [0x0687] }, +{ source: [0xFB7F], NFC: [0xFB7F], NFD: [0xFB7F], NFKC: [0x0687], NFKD: [0x0687] }, +{ source: [0xFB80], NFC: [0xFB80], NFD: [0xFB80], NFKC: [0x0687], NFKD: [0x0687] }, +{ source: [0xFB81], NFC: [0xFB81], NFD: [0xFB81], NFKC: [0x0687], NFKD: [0x0687] }, +{ source: [0xFB82], NFC: [0xFB82], NFD: [0xFB82], NFKC: [0x068D], NFKD: [0x068D] }, +{ source: [0xFB83], NFC: [0xFB83], NFD: [0xFB83], NFKC: [0x068D], NFKD: [0x068D] }, +{ source: [0xFB84], NFC: [0xFB84], NFD: [0xFB84], NFKC: [0x068C], NFKD: [0x068C] }, +{ source: [0xFB85], NFC: [0xFB85], NFD: [0xFB85], NFKC: [0x068C], NFKD: [0x068C] }, +{ source: [0xFB86], NFC: [0xFB86], NFD: [0xFB86], NFKC: [0x068E], NFKD: [0x068E] }, +{ source: [0xFB87], NFC: [0xFB87], NFD: [0xFB87], NFKC: [0x068E], NFKD: [0x068E] }, +{ source: [0xFB88], NFC: [0xFB88], NFD: [0xFB88], NFKC: [0x0688], NFKD: [0x0688] }, +{ source: [0xFB89], NFC: [0xFB89], NFD: [0xFB89], NFKC: [0x0688], NFKD: [0x0688] }, +{ source: [0xFB8A], NFC: [0xFB8A], NFD: [0xFB8A], NFKC: [0x0698], NFKD: [0x0698] }, +{ source: [0xFB8B], NFC: [0xFB8B], NFD: [0xFB8B], NFKC: [0x0698], NFKD: [0x0698] }, +{ source: [0xFB8C], NFC: [0xFB8C], NFD: [0xFB8C], NFKC: [0x0691], NFKD: [0x0691] }, +{ source: [0xFB8D], NFC: [0xFB8D], NFD: [0xFB8D], NFKC: [0x0691], NFKD: [0x0691] }, +{ source: [0xFB8E], NFC: [0xFB8E], NFD: [0xFB8E], NFKC: [0x06A9], NFKD: [0x06A9] }, +{ source: [0xFB8F], NFC: [0xFB8F], NFD: [0xFB8F], NFKC: [0x06A9], NFKD: [0x06A9] }, +{ source: [0xFB90], NFC: [0xFB90], NFD: [0xFB90], NFKC: [0x06A9], NFKD: [0x06A9] }, +{ source: [0xFB91], NFC: [0xFB91], NFD: [0xFB91], NFKC: [0x06A9], NFKD: [0x06A9] }, +{ source: [0xFB92], NFC: [0xFB92], NFD: [0xFB92], NFKC: [0x06AF], NFKD: [0x06AF] }, +{ source: [0xFB93], NFC: [0xFB93], NFD: [0xFB93], NFKC: [0x06AF], NFKD: [0x06AF] }, +{ source: [0xFB94], NFC: [0xFB94], NFD: [0xFB94], NFKC: [0x06AF], NFKD: [0x06AF] }, +{ source: [0xFB95], NFC: [0xFB95], NFD: [0xFB95], NFKC: [0x06AF], NFKD: [0x06AF] }, +{ source: [0xFB96], NFC: [0xFB96], NFD: [0xFB96], NFKC: [0x06B3], NFKD: [0x06B3] }, +{ source: [0xFB97], NFC: [0xFB97], NFD: [0xFB97], NFKC: [0x06B3], NFKD: [0x06B3] }, +{ source: [0xFB98], NFC: [0xFB98], NFD: [0xFB98], NFKC: [0x06B3], NFKD: [0x06B3] }, +{ source: [0xFB99], NFC: [0xFB99], NFD: [0xFB99], NFKC: [0x06B3], NFKD: [0x06B3] }, +{ source: [0xFB9A], NFC: [0xFB9A], NFD: [0xFB9A], NFKC: [0x06B1], NFKD: [0x06B1] }, +{ source: [0xFB9B], NFC: [0xFB9B], NFD: [0xFB9B], NFKC: [0x06B1], NFKD: [0x06B1] }, +{ source: [0xFB9C], NFC: [0xFB9C], NFD: [0xFB9C], NFKC: [0x06B1], NFKD: [0x06B1] }, +{ source: [0xFB9D], NFC: [0xFB9D], NFD: [0xFB9D], NFKC: [0x06B1], NFKD: [0x06B1] }, +{ source: [0xFB9E], NFC: [0xFB9E], NFD: [0xFB9E], NFKC: [0x06BA], NFKD: [0x06BA] }, +{ source: [0xFB9F], NFC: [0xFB9F], NFD: [0xFB9F], NFKC: [0x06BA], NFKD: [0x06BA] }, +{ source: [0xFBA0], NFC: [0xFBA0], NFD: [0xFBA0], NFKC: [0x06BB], NFKD: [0x06BB] }, +{ source: [0xFBA1], NFC: [0xFBA1], NFD: [0xFBA1], NFKC: [0x06BB], NFKD: [0x06BB] }, +{ source: [0xFBA2], NFC: [0xFBA2], NFD: [0xFBA2], NFKC: [0x06BB], NFKD: [0x06BB] }, +{ source: [0xFBA3], NFC: [0xFBA3], NFD: [0xFBA3], NFKC: [0x06BB], NFKD: [0x06BB] }, +{ source: [0xFBA4], NFC: [0xFBA4], NFD: [0xFBA4], NFKC: [0x06C0], NFKD: [0x06D5, 0x0654] }, +{ source: [0xFBA5], NFC: [0xFBA5], NFD: [0xFBA5], NFKC: [0x06C0], NFKD: [0x06D5, 0x0654] }, +{ source: [0xFBA6], NFC: [0xFBA6], NFD: [0xFBA6], NFKC: [0x06C1], NFKD: [0x06C1] }, +{ source: [0xFBA7], NFC: [0xFBA7], NFD: [0xFBA7], NFKC: [0x06C1], NFKD: [0x06C1] }, +{ source: [0xFBA8], NFC: [0xFBA8], NFD: [0xFBA8], NFKC: [0x06C1], NFKD: [0x06C1] }, +{ source: [0xFBA9], NFC: [0xFBA9], NFD: [0xFBA9], NFKC: [0x06C1], NFKD: [0x06C1] }, +{ source: [0xFBAA], NFC: [0xFBAA], NFD: [0xFBAA], NFKC: [0x06BE], NFKD: [0x06BE] }, +{ source: [0xFBAB], NFC: [0xFBAB], NFD: [0xFBAB], NFKC: [0x06BE], NFKD: [0x06BE] }, +{ source: [0xFBAC], NFC: [0xFBAC], NFD: [0xFBAC], NFKC: [0x06BE], NFKD: [0x06BE] }, +{ source: [0xFBAD], NFC: [0xFBAD], NFD: [0xFBAD], NFKC: [0x06BE], NFKD: [0x06BE] }, +{ source: [0xFBAE], NFC: [0xFBAE], NFD: [0xFBAE], NFKC: [0x06D2], NFKD: [0x06D2] }, +{ source: [0xFBAF], NFC: [0xFBAF], NFD: [0xFBAF], NFKC: [0x06D2], NFKD: [0x06D2] }, +{ source: [0xFBB0], NFC: [0xFBB0], NFD: [0xFBB0], NFKC: [0x06D3], NFKD: [0x06D2, 0x0654] }, +{ source: [0xFBB1], NFC: [0xFBB1], NFD: [0xFBB1], NFKC: [0x06D3], NFKD: [0x06D2, 0x0654] }, +{ source: [0xFBD3], NFC: [0xFBD3], NFD: [0xFBD3], NFKC: [0x06AD], NFKD: [0x06AD] }, +{ source: [0xFBD4], NFC: [0xFBD4], NFD: [0xFBD4], NFKC: [0x06AD], NFKD: [0x06AD] }, +{ source: [0xFBD5], NFC: [0xFBD5], NFD: [0xFBD5], NFKC: [0x06AD], NFKD: [0x06AD] }, +{ source: [0xFBD6], NFC: [0xFBD6], NFD: [0xFBD6], NFKC: [0x06AD], NFKD: [0x06AD] }, +{ source: [0xFBD7], NFC: [0xFBD7], NFD: [0xFBD7], NFKC: [0x06C7], NFKD: [0x06C7] }, +{ source: [0xFBD8], NFC: [0xFBD8], NFD: [0xFBD8], NFKC: [0x06C7], NFKD: [0x06C7] }, +{ source: [0xFBD9], NFC: [0xFBD9], NFD: [0xFBD9], NFKC: [0x06C6], NFKD: [0x06C6] }, +{ source: [0xFBDA], NFC: [0xFBDA], NFD: [0xFBDA], NFKC: [0x06C6], NFKD: [0x06C6] }, +{ source: [0xFBDB], NFC: [0xFBDB], NFD: [0xFBDB], NFKC: [0x06C8], NFKD: [0x06C8] }, +{ source: [0xFBDC], NFC: [0xFBDC], NFD: [0xFBDC], NFKC: [0x06C8], NFKD: [0x06C8] }, +{ source: [0xFBDD], NFC: [0xFBDD], NFD: [0xFBDD], NFKC: [0x06C7, 0x0674], NFKD: [0x06C7, 0x0674] }, +{ source: [0xFBDE], NFC: [0xFBDE], NFD: [0xFBDE], NFKC: [0x06CB], NFKD: [0x06CB] }, +{ source: [0xFBDF], NFC: [0xFBDF], NFD: [0xFBDF], NFKC: [0x06CB], NFKD: [0x06CB] }, +{ source: [0xFBE0], NFC: [0xFBE0], NFD: [0xFBE0], NFKC: [0x06C5], NFKD: [0x06C5] }, +{ source: [0xFBE1], NFC: [0xFBE1], NFD: [0xFBE1], NFKC: [0x06C5], NFKD: [0x06C5] }, +{ source: [0xFBE2], NFC: [0xFBE2], NFD: [0xFBE2], NFKC: [0x06C9], NFKD: [0x06C9] }, +{ source: [0xFBE3], NFC: [0xFBE3], NFD: [0xFBE3], NFKC: [0x06C9], NFKD: [0x06C9] }, +{ source: [0xFBE4], NFC: [0xFBE4], NFD: [0xFBE4], NFKC: [0x06D0], NFKD: [0x06D0] }, +{ source: [0xFBE5], NFC: [0xFBE5], NFD: [0xFBE5], NFKC: [0x06D0], NFKD: [0x06D0] }, +{ source: [0xFBE6], NFC: [0xFBE6], NFD: [0xFBE6], NFKC: [0x06D0], NFKD: [0x06D0] }, +{ source: [0xFBE7], NFC: [0xFBE7], NFD: [0xFBE7], NFKC: [0x06D0], NFKD: [0x06D0] }, +{ source: [0xFBE8], NFC: [0xFBE8], NFD: [0xFBE8], NFKC: [0x0649], NFKD: [0x0649] }, +{ source: [0xFBE9], NFC: [0xFBE9], NFD: [0xFBE9], NFKC: [0x0649], NFKD: [0x0649] }, +{ source: [0xFBEA], NFC: [0xFBEA], NFD: [0xFBEA], NFKC: [0x0626, 0x0627], NFKD: [0x064A, 0x0654, 0x0627] }, +{ source: [0xFBEB], NFC: [0xFBEB], NFD: [0xFBEB], NFKC: [0x0626, 0x0627], NFKD: [0x064A, 0x0654, 0x0627] }, +{ source: [0xFBEC], NFC: [0xFBEC], NFD: [0xFBEC], NFKC: [0x0626, 0x06D5], NFKD: [0x064A, 0x0654, 0x06D5] }, +{ source: [0xFBED], NFC: [0xFBED], NFD: [0xFBED], NFKC: [0x0626, 0x06D5], NFKD: [0x064A, 0x0654, 0x06D5] }, +{ source: [0xFBEE], NFC: [0xFBEE], NFD: [0xFBEE], NFKC: [0x0626, 0x0648], NFKD: [0x064A, 0x0654, 0x0648] }, +{ source: [0xFBEF], NFC: [0xFBEF], NFD: [0xFBEF], NFKC: [0x0626, 0x0648], NFKD: [0x064A, 0x0654, 0x0648] }, +{ source: [0xFBF0], NFC: [0xFBF0], NFD: [0xFBF0], NFKC: [0x0626, 0x06C7], NFKD: [0x064A, 0x0654, 0x06C7] }, +{ source: [0xFBF1], NFC: [0xFBF1], NFD: [0xFBF1], NFKC: [0x0626, 0x06C7], NFKD: [0x064A, 0x0654, 0x06C7] }, +{ source: [0xFBF2], NFC: [0xFBF2], NFD: [0xFBF2], NFKC: [0x0626, 0x06C6], NFKD: [0x064A, 0x0654, 0x06C6] }, +{ source: [0xFBF3], NFC: [0xFBF3], NFD: [0xFBF3], NFKC: [0x0626, 0x06C6], NFKD: [0x064A, 0x0654, 0x06C6] }, +{ source: [0xFBF4], NFC: [0xFBF4], NFD: [0xFBF4], NFKC: [0x0626, 0x06C8], NFKD: [0x064A, 0x0654, 0x06C8] }, +{ source: [0xFBF5], NFC: [0xFBF5], NFD: [0xFBF5], NFKC: [0x0626, 0x06C8], NFKD: [0x064A, 0x0654, 0x06C8] }, +{ source: [0xFBF6], NFC: [0xFBF6], NFD: [0xFBF6], NFKC: [0x0626, 0x06D0], NFKD: [0x064A, 0x0654, 0x06D0] }, +{ source: [0xFBF7], NFC: [0xFBF7], NFD: [0xFBF7], NFKC: [0x0626, 0x06D0], NFKD: [0x064A, 0x0654, 0x06D0] }, +{ source: [0xFBF8], NFC: [0xFBF8], NFD: [0xFBF8], NFKC: [0x0626, 0x06D0], NFKD: [0x064A, 0x0654, 0x06D0] }, +{ source: [0xFBF9], NFC: [0xFBF9], NFD: [0xFBF9], NFKC: [0x0626, 0x0649], NFKD: [0x064A, 0x0654, 0x0649] }, +{ source: [0xFBFA], NFC: [0xFBFA], NFD: [0xFBFA], NFKC: [0x0626, 0x0649], NFKD: [0x064A, 0x0654, 0x0649] }, +{ source: [0xFBFB], NFC: [0xFBFB], NFD: [0xFBFB], NFKC: [0x0626, 0x0649], NFKD: [0x064A, 0x0654, 0x0649] }, +{ source: [0xFBFC], NFC: [0xFBFC], NFD: [0xFBFC], NFKC: [0x06CC], NFKD: [0x06CC] }, +{ source: [0xFBFD], NFC: [0xFBFD], NFD: [0xFBFD], NFKC: [0x06CC], NFKD: [0x06CC] }, +{ source: [0xFBFE], NFC: [0xFBFE], NFD: [0xFBFE], NFKC: [0x06CC], NFKD: [0x06CC] }, +{ source: [0xFBFF], NFC: [0xFBFF], NFD: [0xFBFF], NFKC: [0x06CC], NFKD: [0x06CC] }, +{ source: [0xFC00], NFC: [0xFC00], NFD: [0xFC00], NFKC: [0x0626, 0x062C], NFKD: [0x064A, 0x0654, 0x062C] }, +{ source: [0xFC01], NFC: [0xFC01], NFD: [0xFC01], NFKC: [0x0626, 0x062D], NFKD: [0x064A, 0x0654, 0x062D] }, +{ source: [0xFC02], NFC: [0xFC02], NFD: [0xFC02], NFKC: [0x0626, 0x0645], NFKD: [0x064A, 0x0654, 0x0645] }, +{ source: [0xFC03], NFC: [0xFC03], NFD: [0xFC03], NFKC: [0x0626, 0x0649], NFKD: [0x064A, 0x0654, 0x0649] }, +{ source: [0xFC04], NFC: [0xFC04], NFD: [0xFC04], NFKC: [0x0626, 0x064A], NFKD: [0x064A, 0x0654, 0x064A] }, +{ source: [0xFC05], NFC: [0xFC05], NFD: [0xFC05], NFKC: [0x0628, 0x062C], NFKD: [0x0628, 0x062C] }, +{ source: [0xFC06], NFC: [0xFC06], NFD: [0xFC06], NFKC: [0x0628, 0x062D], NFKD: [0x0628, 0x062D] }, +{ source: [0xFC07], NFC: [0xFC07], NFD: [0xFC07], NFKC: [0x0628, 0x062E], NFKD: [0x0628, 0x062E] }, +{ source: [0xFC08], NFC: [0xFC08], NFD: [0xFC08], NFKC: [0x0628, 0x0645], NFKD: [0x0628, 0x0645] }, +{ source: [0xFC09], NFC: [0xFC09], NFD: [0xFC09], NFKC: [0x0628, 0x0649], NFKD: [0x0628, 0x0649] }, +{ source: [0xFC0A], NFC: [0xFC0A], NFD: [0xFC0A], NFKC: [0x0628, 0x064A], NFKD: [0x0628, 0x064A] }, +{ source: [0xFC0B], NFC: [0xFC0B], NFD: [0xFC0B], NFKC: [0x062A, 0x062C], NFKD: [0x062A, 0x062C] }, +{ source: [0xFC0C], NFC: [0xFC0C], NFD: [0xFC0C], NFKC: [0x062A, 0x062D], NFKD: [0x062A, 0x062D] }, +{ source: [0xFC0D], NFC: [0xFC0D], NFD: [0xFC0D], NFKC: [0x062A, 0x062E], NFKD: [0x062A, 0x062E] }, +{ source: [0xFC0E], NFC: [0xFC0E], NFD: [0xFC0E], NFKC: [0x062A, 0x0645], NFKD: [0x062A, 0x0645] }, +{ source: [0xFC0F], NFC: [0xFC0F], NFD: [0xFC0F], NFKC: [0x062A, 0x0649], NFKD: [0x062A, 0x0649] }, +{ source: [0xFC10], NFC: [0xFC10], NFD: [0xFC10], NFKC: [0x062A, 0x064A], NFKD: [0x062A, 0x064A] }, +{ source: [0xFC11], NFC: [0xFC11], NFD: [0xFC11], NFKC: [0x062B, 0x062C], NFKD: [0x062B, 0x062C] }, +{ source: [0xFC12], NFC: [0xFC12], NFD: [0xFC12], NFKC: [0x062B, 0x0645], NFKD: [0x062B, 0x0645] }, +{ source: [0xFC13], NFC: [0xFC13], NFD: [0xFC13], NFKC: [0x062B, 0x0649], NFKD: [0x062B, 0x0649] }, +{ source: [0xFC14], NFC: [0xFC14], NFD: [0xFC14], NFKC: [0x062B, 0x064A], NFKD: [0x062B, 0x064A] }, +{ source: [0xFC15], NFC: [0xFC15], NFD: [0xFC15], NFKC: [0x062C, 0x062D], NFKD: [0x062C, 0x062D] }, +{ source: [0xFC16], NFC: [0xFC16], NFD: [0xFC16], NFKC: [0x062C, 0x0645], NFKD: [0x062C, 0x0645] }, +{ source: [0xFC17], NFC: [0xFC17], NFD: [0xFC17], NFKC: [0x062D, 0x062C], NFKD: [0x062D, 0x062C] }, +{ source: [0xFC18], NFC: [0xFC18], NFD: [0xFC18], NFKC: [0x062D, 0x0645], NFKD: [0x062D, 0x0645] }, +{ source: [0xFC19], NFC: [0xFC19], NFD: [0xFC19], NFKC: [0x062E, 0x062C], NFKD: [0x062E, 0x062C] }, +{ source: [0xFC1A], NFC: [0xFC1A], NFD: [0xFC1A], NFKC: [0x062E, 0x062D], NFKD: [0x062E, 0x062D] }, +{ source: [0xFC1B], NFC: [0xFC1B], NFD: [0xFC1B], NFKC: [0x062E, 0x0645], NFKD: [0x062E, 0x0645] }, +{ source: [0xFC1C], NFC: [0xFC1C], NFD: [0xFC1C], NFKC: [0x0633, 0x062C], NFKD: [0x0633, 0x062C] }, +{ source: [0xFC1D], NFC: [0xFC1D], NFD: [0xFC1D], NFKC: [0x0633, 0x062D], NFKD: [0x0633, 0x062D] }, +{ source: [0xFC1E], NFC: [0xFC1E], NFD: [0xFC1E], NFKC: [0x0633, 0x062E], NFKD: [0x0633, 0x062E] }, +{ source: [0xFC1F], NFC: [0xFC1F], NFD: [0xFC1F], NFKC: [0x0633, 0x0645], NFKD: [0x0633, 0x0645] }, +{ source: [0xFC20], NFC: [0xFC20], NFD: [0xFC20], NFKC: [0x0635, 0x062D], NFKD: [0x0635, 0x062D] }, +{ source: [0xFC21], NFC: [0xFC21], NFD: [0xFC21], NFKC: [0x0635, 0x0645], NFKD: [0x0635, 0x0645] }, +{ source: [0xFC22], NFC: [0xFC22], NFD: [0xFC22], NFKC: [0x0636, 0x062C], NFKD: [0x0636, 0x062C] }, +{ source: [0xFC23], NFC: [0xFC23], NFD: [0xFC23], NFKC: [0x0636, 0x062D], NFKD: [0x0636, 0x062D] }, +{ source: [0xFC24], NFC: [0xFC24], NFD: [0xFC24], NFKC: [0x0636, 0x062E], NFKD: [0x0636, 0x062E] }, +{ source: [0xFC25], NFC: [0xFC25], NFD: [0xFC25], NFKC: [0x0636, 0x0645], NFKD: [0x0636, 0x0645] }, +{ source: [0xFC26], NFC: [0xFC26], NFD: [0xFC26], NFKC: [0x0637, 0x062D], NFKD: [0x0637, 0x062D] }, +{ source: [0xFC27], NFC: [0xFC27], NFD: [0xFC27], NFKC: [0x0637, 0x0645], NFKD: [0x0637, 0x0645] }, +{ source: [0xFC28], NFC: [0xFC28], NFD: [0xFC28], NFKC: [0x0638, 0x0645], NFKD: [0x0638, 0x0645] }, +{ source: [0xFC29], NFC: [0xFC29], NFD: [0xFC29], NFKC: [0x0639, 0x062C], NFKD: [0x0639, 0x062C] }, +{ source: [0xFC2A], NFC: [0xFC2A], NFD: [0xFC2A], NFKC: [0x0639, 0x0645], NFKD: [0x0639, 0x0645] }, +{ source: [0xFC2B], NFC: [0xFC2B], NFD: [0xFC2B], NFKC: [0x063A, 0x062C], NFKD: [0x063A, 0x062C] }, +{ source: [0xFC2C], NFC: [0xFC2C], NFD: [0xFC2C], NFKC: [0x063A, 0x0645], NFKD: [0x063A, 0x0645] }, +{ source: [0xFC2D], NFC: [0xFC2D], NFD: [0xFC2D], NFKC: [0x0641, 0x062C], NFKD: [0x0641, 0x062C] }, +{ source: [0xFC2E], NFC: [0xFC2E], NFD: [0xFC2E], NFKC: [0x0641, 0x062D], NFKD: [0x0641, 0x062D] }, +{ source: [0xFC2F], NFC: [0xFC2F], NFD: [0xFC2F], NFKC: [0x0641, 0x062E], NFKD: [0x0641, 0x062E] }, +{ source: [0xFC30], NFC: [0xFC30], NFD: [0xFC30], NFKC: [0x0641, 0x0645], NFKD: [0x0641, 0x0645] }, +{ source: [0xFC31], NFC: [0xFC31], NFD: [0xFC31], NFKC: [0x0641, 0x0649], NFKD: [0x0641, 0x0649] }, +{ source: [0xFC32], NFC: [0xFC32], NFD: [0xFC32], NFKC: [0x0641, 0x064A], NFKD: [0x0641, 0x064A] }, +{ source: [0xFC33], NFC: [0xFC33], NFD: [0xFC33], NFKC: [0x0642, 0x062D], NFKD: [0x0642, 0x062D] }, +{ source: [0xFC34], NFC: [0xFC34], NFD: [0xFC34], NFKC: [0x0642, 0x0645], NFKD: [0x0642, 0x0645] }, +{ source: [0xFC35], NFC: [0xFC35], NFD: [0xFC35], NFKC: [0x0642, 0x0649], NFKD: [0x0642, 0x0649] }, +{ source: [0xFC36], NFC: [0xFC36], NFD: [0xFC36], NFKC: [0x0642, 0x064A], NFKD: [0x0642, 0x064A] }, +{ source: [0xFC37], NFC: [0xFC37], NFD: [0xFC37], NFKC: [0x0643, 0x0627], NFKD: [0x0643, 0x0627] }, +{ source: [0xFC38], NFC: [0xFC38], NFD: [0xFC38], NFKC: [0x0643, 0x062C], NFKD: [0x0643, 0x062C] }, +{ source: [0xFC39], NFC: [0xFC39], NFD: [0xFC39], NFKC: [0x0643, 0x062D], NFKD: [0x0643, 0x062D] }, +{ source: [0xFC3A], NFC: [0xFC3A], NFD: [0xFC3A], NFKC: [0x0643, 0x062E], NFKD: [0x0643, 0x062E] }, +{ source: [0xFC3B], NFC: [0xFC3B], NFD: [0xFC3B], NFKC: [0x0643, 0x0644], NFKD: [0x0643, 0x0644] }, +{ source: [0xFC3C], NFC: [0xFC3C], NFD: [0xFC3C], NFKC: [0x0643, 0x0645], NFKD: [0x0643, 0x0645] }, +{ source: [0xFC3D], NFC: [0xFC3D], NFD: [0xFC3D], NFKC: [0x0643, 0x0649], NFKD: [0x0643, 0x0649] }, +{ source: [0xFC3E], NFC: [0xFC3E], NFD: [0xFC3E], NFKC: [0x0643, 0x064A], NFKD: [0x0643, 0x064A] }, +{ source: [0xFC3F], NFC: [0xFC3F], NFD: [0xFC3F], NFKC: [0x0644, 0x062C], NFKD: [0x0644, 0x062C] }, +{ source: [0xFC40], NFC: [0xFC40], NFD: [0xFC40], NFKC: [0x0644, 0x062D], NFKD: [0x0644, 0x062D] }, +{ source: [0xFC41], NFC: [0xFC41], NFD: [0xFC41], NFKC: [0x0644, 0x062E], NFKD: [0x0644, 0x062E] }, +{ source: [0xFC42], NFC: [0xFC42], NFD: [0xFC42], NFKC: [0x0644, 0x0645], NFKD: [0x0644, 0x0645] }, +{ source: [0xFC43], NFC: [0xFC43], NFD: [0xFC43], NFKC: [0x0644, 0x0649], NFKD: [0x0644, 0x0649] }, +{ source: [0xFC44], NFC: [0xFC44], NFD: [0xFC44], NFKC: [0x0644, 0x064A], NFKD: [0x0644, 0x064A] }, +{ source: [0xFC45], NFC: [0xFC45], NFD: [0xFC45], NFKC: [0x0645, 0x062C], NFKD: [0x0645, 0x062C] }, +{ source: [0xFC46], NFC: [0xFC46], NFD: [0xFC46], NFKC: [0x0645, 0x062D], NFKD: [0x0645, 0x062D] }, +{ source: [0xFC47], NFC: [0xFC47], NFD: [0xFC47], NFKC: [0x0645, 0x062E], NFKD: [0x0645, 0x062E] }, +{ source: [0xFC48], NFC: [0xFC48], NFD: [0xFC48], NFKC: [0x0645, 0x0645], NFKD: [0x0645, 0x0645] }, +{ source: [0xFC49], NFC: [0xFC49], NFD: [0xFC49], NFKC: [0x0645, 0x0649], NFKD: [0x0645, 0x0649] }, +{ source: [0xFC4A], NFC: [0xFC4A], NFD: [0xFC4A], NFKC: [0x0645, 0x064A], NFKD: [0x0645, 0x064A] }, +{ source: [0xFC4B], NFC: [0xFC4B], NFD: [0xFC4B], NFKC: [0x0646, 0x062C], NFKD: [0x0646, 0x062C] }, +{ source: [0xFC4C], NFC: [0xFC4C], NFD: [0xFC4C], NFKC: [0x0646, 0x062D], NFKD: [0x0646, 0x062D] }, +{ source: [0xFC4D], NFC: [0xFC4D], NFD: [0xFC4D], NFKC: [0x0646, 0x062E], NFKD: [0x0646, 0x062E] }, +{ source: [0xFC4E], NFC: [0xFC4E], NFD: [0xFC4E], NFKC: [0x0646, 0x0645], NFKD: [0x0646, 0x0645] }, +{ source: [0xFC4F], NFC: [0xFC4F], NFD: [0xFC4F], NFKC: [0x0646, 0x0649], NFKD: [0x0646, 0x0649] }, +{ source: [0xFC50], NFC: [0xFC50], NFD: [0xFC50], NFKC: [0x0646, 0x064A], NFKD: [0x0646, 0x064A] }, +{ source: [0xFC51], NFC: [0xFC51], NFD: [0xFC51], NFKC: [0x0647, 0x062C], NFKD: [0x0647, 0x062C] }, +{ source: [0xFC52], NFC: [0xFC52], NFD: [0xFC52], NFKC: [0x0647, 0x0645], NFKD: [0x0647, 0x0645] }, +{ source: [0xFC53], NFC: [0xFC53], NFD: [0xFC53], NFKC: [0x0647, 0x0649], NFKD: [0x0647, 0x0649] }, +{ source: [0xFC54], NFC: [0xFC54], NFD: [0xFC54], NFKC: [0x0647, 0x064A], NFKD: [0x0647, 0x064A] }, +{ source: [0xFC55], NFC: [0xFC55], NFD: [0xFC55], NFKC: [0x064A, 0x062C], NFKD: [0x064A, 0x062C] }, +{ source: [0xFC56], NFC: [0xFC56], NFD: [0xFC56], NFKC: [0x064A, 0x062D], NFKD: [0x064A, 0x062D] }, +{ source: [0xFC57], NFC: [0xFC57], NFD: [0xFC57], NFKC: [0x064A, 0x062E], NFKD: [0x064A, 0x062E] }, +{ source: [0xFC58], NFC: [0xFC58], NFD: [0xFC58], NFKC: [0x064A, 0x0645], NFKD: [0x064A, 0x0645] }, +{ source: [0xFC59], NFC: [0xFC59], NFD: [0xFC59], NFKC: [0x064A, 0x0649], NFKD: [0x064A, 0x0649] }, +{ source: [0xFC5A], NFC: [0xFC5A], NFD: [0xFC5A], NFKC: [0x064A, 0x064A], NFKD: [0x064A, 0x064A] }, +{ source: [0xFC5B], NFC: [0xFC5B], NFD: [0xFC5B], NFKC: [0x0630, 0x0670], NFKD: [0x0630, 0x0670] }, +{ source: [0xFC5C], NFC: [0xFC5C], NFD: [0xFC5C], NFKC: [0x0631, 0x0670], NFKD: [0x0631, 0x0670] }, +{ source: [0xFC5D], NFC: [0xFC5D], NFD: [0xFC5D], NFKC: [0x0649, 0x0670], NFKD: [0x0649, 0x0670] }, +{ source: [0xFC5E], NFC: [0xFC5E], NFD: [0xFC5E], NFKC: [0x0020, 0x064C, 0x0651], NFKD: [0x0020, 0x064C, 0x0651] }, +{ source: [0xFC5F], NFC: [0xFC5F], NFD: [0xFC5F], NFKC: [0x0020, 0x064D, 0x0651], NFKD: [0x0020, 0x064D, 0x0651] }, +{ source: [0xFC60], NFC: [0xFC60], NFD: [0xFC60], NFKC: [0x0020, 0x064E, 0x0651], NFKD: [0x0020, 0x064E, 0x0651] }, +{ source: [0xFC61], NFC: [0xFC61], NFD: [0xFC61], NFKC: [0x0020, 0x064F, 0x0651], NFKD: [0x0020, 0x064F, 0x0651] }, +{ source: [0xFC62], NFC: [0xFC62], NFD: [0xFC62], NFKC: [0x0020, 0x0650, 0x0651], NFKD: [0x0020, 0x0650, 0x0651] }, +{ source: [0xFC63], NFC: [0xFC63], NFD: [0xFC63], NFKC: [0x0020, 0x0651, 0x0670], NFKD: [0x0020, 0x0651, 0x0670] }, +{ source: [0xFC64], NFC: [0xFC64], NFD: [0xFC64], NFKC: [0x0626, 0x0631], NFKD: [0x064A, 0x0654, 0x0631] }, +{ source: [0xFC65], NFC: [0xFC65], NFD: [0xFC65], NFKC: [0x0626, 0x0632], NFKD: [0x064A, 0x0654, 0x0632] }, +{ source: [0xFC66], NFC: [0xFC66], NFD: [0xFC66], NFKC: [0x0626, 0x0645], NFKD: [0x064A, 0x0654, 0x0645] }, +{ source: [0xFC67], NFC: [0xFC67], NFD: [0xFC67], NFKC: [0x0626, 0x0646], NFKD: [0x064A, 0x0654, 0x0646] }, +{ source: [0xFC68], NFC: [0xFC68], NFD: [0xFC68], NFKC: [0x0626, 0x0649], NFKD: [0x064A, 0x0654, 0x0649] }, +{ source: [0xFC69], NFC: [0xFC69], NFD: [0xFC69], NFKC: [0x0626, 0x064A], NFKD: [0x064A, 0x0654, 0x064A] }, +{ source: [0xFC6A], NFC: [0xFC6A], NFD: [0xFC6A], NFKC: [0x0628, 0x0631], NFKD: [0x0628, 0x0631] }, +{ source: [0xFC6B], NFC: [0xFC6B], NFD: [0xFC6B], NFKC: [0x0628, 0x0632], NFKD: [0x0628, 0x0632] }, +{ source: [0xFC6C], NFC: [0xFC6C], NFD: [0xFC6C], NFKC: [0x0628, 0x0645], NFKD: [0x0628, 0x0645] }, +{ source: [0xFC6D], NFC: [0xFC6D], NFD: [0xFC6D], NFKC: [0x0628, 0x0646], NFKD: [0x0628, 0x0646] }, +{ source: [0xFC6E], NFC: [0xFC6E], NFD: [0xFC6E], NFKC: [0x0628, 0x0649], NFKD: [0x0628, 0x0649] }, +{ source: [0xFC6F], NFC: [0xFC6F], NFD: [0xFC6F], NFKC: [0x0628, 0x064A], NFKD: [0x0628, 0x064A] }, +{ source: [0xFC70], NFC: [0xFC70], NFD: [0xFC70], NFKC: [0x062A, 0x0631], NFKD: [0x062A, 0x0631] }, +{ source: [0xFC71], NFC: [0xFC71], NFD: [0xFC71], NFKC: [0x062A, 0x0632], NFKD: [0x062A, 0x0632] }, +{ source: [0xFC72], NFC: [0xFC72], NFD: [0xFC72], NFKC: [0x062A, 0x0645], NFKD: [0x062A, 0x0645] }, +{ source: [0xFC73], NFC: [0xFC73], NFD: [0xFC73], NFKC: [0x062A, 0x0646], NFKD: [0x062A, 0x0646] }, +{ source: [0xFC74], NFC: [0xFC74], NFD: [0xFC74], NFKC: [0x062A, 0x0649], NFKD: [0x062A, 0x0649] }, +{ source: [0xFC75], NFC: [0xFC75], NFD: [0xFC75], NFKC: [0x062A, 0x064A], NFKD: [0x062A, 0x064A] }, +{ source: [0xFC76], NFC: [0xFC76], NFD: [0xFC76], NFKC: [0x062B, 0x0631], NFKD: [0x062B, 0x0631] }, +{ source: [0xFC77], NFC: [0xFC77], NFD: [0xFC77], NFKC: [0x062B, 0x0632], NFKD: [0x062B, 0x0632] }, +{ source: [0xFC78], NFC: [0xFC78], NFD: [0xFC78], NFKC: [0x062B, 0x0645], NFKD: [0x062B, 0x0645] }, +{ source: [0xFC79], NFC: [0xFC79], NFD: [0xFC79], NFKC: [0x062B, 0x0646], NFKD: [0x062B, 0x0646] }, +{ source: [0xFC7A], NFC: [0xFC7A], NFD: [0xFC7A], NFKC: [0x062B, 0x0649], NFKD: [0x062B, 0x0649] }, +{ source: [0xFC7B], NFC: [0xFC7B], NFD: [0xFC7B], NFKC: [0x062B, 0x064A], NFKD: [0x062B, 0x064A] }, +{ source: [0xFC7C], NFC: [0xFC7C], NFD: [0xFC7C], NFKC: [0x0641, 0x0649], NFKD: [0x0641, 0x0649] }, +{ source: [0xFC7D], NFC: [0xFC7D], NFD: [0xFC7D], NFKC: [0x0641, 0x064A], NFKD: [0x0641, 0x064A] }, +{ source: [0xFC7E], NFC: [0xFC7E], NFD: [0xFC7E], NFKC: [0x0642, 0x0649], NFKD: [0x0642, 0x0649] }, +{ source: [0xFC7F], NFC: [0xFC7F], NFD: [0xFC7F], NFKC: [0x0642, 0x064A], NFKD: [0x0642, 0x064A] }, +{ source: [0xFC80], NFC: [0xFC80], NFD: [0xFC80], NFKC: [0x0643, 0x0627], NFKD: [0x0643, 0x0627] }, +{ source: [0xFC81], NFC: [0xFC81], NFD: [0xFC81], NFKC: [0x0643, 0x0644], NFKD: [0x0643, 0x0644] }, +{ source: [0xFC82], NFC: [0xFC82], NFD: [0xFC82], NFKC: [0x0643, 0x0645], NFKD: [0x0643, 0x0645] }, +{ source: [0xFC83], NFC: [0xFC83], NFD: [0xFC83], NFKC: [0x0643, 0x0649], NFKD: [0x0643, 0x0649] }, +{ source: [0xFC84], NFC: [0xFC84], NFD: [0xFC84], NFKC: [0x0643, 0x064A], NFKD: [0x0643, 0x064A] }, +{ source: [0xFC85], NFC: [0xFC85], NFD: [0xFC85], NFKC: [0x0644, 0x0645], NFKD: [0x0644, 0x0645] }, +{ source: [0xFC86], NFC: [0xFC86], NFD: [0xFC86], NFKC: [0x0644, 0x0649], NFKD: [0x0644, 0x0649] }, +{ source: [0xFC87], NFC: [0xFC87], NFD: [0xFC87], NFKC: [0x0644, 0x064A], NFKD: [0x0644, 0x064A] }, +{ source: [0xFC88], NFC: [0xFC88], NFD: [0xFC88], NFKC: [0x0645, 0x0627], NFKD: [0x0645, 0x0627] }, +{ source: [0xFC89], NFC: [0xFC89], NFD: [0xFC89], NFKC: [0x0645, 0x0645], NFKD: [0x0645, 0x0645] }, +{ source: [0xFC8A], NFC: [0xFC8A], NFD: [0xFC8A], NFKC: [0x0646, 0x0631], NFKD: [0x0646, 0x0631] }, +{ source: [0xFC8B], NFC: [0xFC8B], NFD: [0xFC8B], NFKC: [0x0646, 0x0632], NFKD: [0x0646, 0x0632] }, +{ source: [0xFC8C], NFC: [0xFC8C], NFD: [0xFC8C], NFKC: [0x0646, 0x0645], NFKD: [0x0646, 0x0645] }, +{ source: [0xFC8D], NFC: [0xFC8D], NFD: [0xFC8D], NFKC: [0x0646, 0x0646], NFKD: [0x0646, 0x0646] }, +{ source: [0xFC8E], NFC: [0xFC8E], NFD: [0xFC8E], NFKC: [0x0646, 0x0649], NFKD: [0x0646, 0x0649] }, +{ source: [0xFC8F], NFC: [0xFC8F], NFD: [0xFC8F], NFKC: [0x0646, 0x064A], NFKD: [0x0646, 0x064A] }, +{ source: [0xFC90], NFC: [0xFC90], NFD: [0xFC90], NFKC: [0x0649, 0x0670], NFKD: [0x0649, 0x0670] }, +{ source: [0xFC91], NFC: [0xFC91], NFD: [0xFC91], NFKC: [0x064A, 0x0631], NFKD: [0x064A, 0x0631] }, +{ source: [0xFC92], NFC: [0xFC92], NFD: [0xFC92], NFKC: [0x064A, 0x0632], NFKD: [0x064A, 0x0632] }, +{ source: [0xFC93], NFC: [0xFC93], NFD: [0xFC93], NFKC: [0x064A, 0x0645], NFKD: [0x064A, 0x0645] }, +{ source: [0xFC94], NFC: [0xFC94], NFD: [0xFC94], NFKC: [0x064A, 0x0646], NFKD: [0x064A, 0x0646] }, +{ source: [0xFC95], NFC: [0xFC95], NFD: [0xFC95], NFKC: [0x064A, 0x0649], NFKD: [0x064A, 0x0649] }, +{ source: [0xFC96], NFC: [0xFC96], NFD: [0xFC96], NFKC: [0x064A, 0x064A], NFKD: [0x064A, 0x064A] }, +{ source: [0xFC97], NFC: [0xFC97], NFD: [0xFC97], NFKC: [0x0626, 0x062C], NFKD: [0x064A, 0x0654, 0x062C] }, +{ source: [0xFC98], NFC: [0xFC98], NFD: [0xFC98], NFKC: [0x0626, 0x062D], NFKD: [0x064A, 0x0654, 0x062D] }, +{ source: [0xFC99], NFC: [0xFC99], NFD: [0xFC99], NFKC: [0x0626, 0x062E], NFKD: [0x064A, 0x0654, 0x062E] }, +{ source: [0xFC9A], NFC: [0xFC9A], NFD: [0xFC9A], NFKC: [0x0626, 0x0645], NFKD: [0x064A, 0x0654, 0x0645] }, +{ source: [0xFC9B], NFC: [0xFC9B], NFD: [0xFC9B], NFKC: [0x0626, 0x0647], NFKD: [0x064A, 0x0654, 0x0647] }, +{ source: [0xFC9C], NFC: [0xFC9C], NFD: [0xFC9C], NFKC: [0x0628, 0x062C], NFKD: [0x0628, 0x062C] }, +{ source: [0xFC9D], NFC: [0xFC9D], NFD: [0xFC9D], NFKC: [0x0628, 0x062D], NFKD: [0x0628, 0x062D] }, +{ source: [0xFC9E], NFC: [0xFC9E], NFD: [0xFC9E], NFKC: [0x0628, 0x062E], NFKD: [0x0628, 0x062E] }, +{ source: [0xFC9F], NFC: [0xFC9F], NFD: [0xFC9F], NFKC: [0x0628, 0x0645], NFKD: [0x0628, 0x0645] }, +{ source: [0xFCA0], NFC: [0xFCA0], NFD: [0xFCA0], NFKC: [0x0628, 0x0647], NFKD: [0x0628, 0x0647] }, +{ source: [0xFCA1], NFC: [0xFCA1], NFD: [0xFCA1], NFKC: [0x062A, 0x062C], NFKD: [0x062A, 0x062C] }, +{ source: [0xFCA2], NFC: [0xFCA2], NFD: [0xFCA2], NFKC: [0x062A, 0x062D], NFKD: [0x062A, 0x062D] }, +{ source: [0xFCA3], NFC: [0xFCA3], NFD: [0xFCA3], NFKC: [0x062A, 0x062E], NFKD: [0x062A, 0x062E] }, +{ source: [0xFCA4], NFC: [0xFCA4], NFD: [0xFCA4], NFKC: [0x062A, 0x0645], NFKD: [0x062A, 0x0645] }, +{ source: [0xFCA5], NFC: [0xFCA5], NFD: [0xFCA5], NFKC: [0x062A, 0x0647], NFKD: [0x062A, 0x0647] }, +{ source: [0xFCA6], NFC: [0xFCA6], NFD: [0xFCA6], NFKC: [0x062B, 0x0645], NFKD: [0x062B, 0x0645] }, +{ source: [0xFCA7], NFC: [0xFCA7], NFD: [0xFCA7], NFKC: [0x062C, 0x062D], NFKD: [0x062C, 0x062D] }, +{ source: [0xFCA8], NFC: [0xFCA8], NFD: [0xFCA8], NFKC: [0x062C, 0x0645], NFKD: [0x062C, 0x0645] }, +{ source: [0xFCA9], NFC: [0xFCA9], NFD: [0xFCA9], NFKC: [0x062D, 0x062C], NFKD: [0x062D, 0x062C] }, +{ source: [0xFCAA], NFC: [0xFCAA], NFD: [0xFCAA], NFKC: [0x062D, 0x0645], NFKD: [0x062D, 0x0645] }, +{ source: [0xFCAB], NFC: [0xFCAB], NFD: [0xFCAB], NFKC: [0x062E, 0x062C], NFKD: [0x062E, 0x062C] }, +{ source: [0xFCAC], NFC: [0xFCAC], NFD: [0xFCAC], NFKC: [0x062E, 0x0645], NFKD: [0x062E, 0x0645] }, +{ source: [0xFCAD], NFC: [0xFCAD], NFD: [0xFCAD], NFKC: [0x0633, 0x062C], NFKD: [0x0633, 0x062C] }, +{ source: [0xFCAE], NFC: [0xFCAE], NFD: [0xFCAE], NFKC: [0x0633, 0x062D], NFKD: [0x0633, 0x062D] }, +{ source: [0xFCAF], NFC: [0xFCAF], NFD: [0xFCAF], NFKC: [0x0633, 0x062E], NFKD: [0x0633, 0x062E] }, +{ source: [0xFCB0], NFC: [0xFCB0], NFD: [0xFCB0], NFKC: [0x0633, 0x0645], NFKD: [0x0633, 0x0645] }, +{ source: [0xFCB1], NFC: [0xFCB1], NFD: [0xFCB1], NFKC: [0x0635, 0x062D], NFKD: [0x0635, 0x062D] }, +{ source: [0xFCB2], NFC: [0xFCB2], NFD: [0xFCB2], NFKC: [0x0635, 0x062E], NFKD: [0x0635, 0x062E] }, +{ source: [0xFCB3], NFC: [0xFCB3], NFD: [0xFCB3], NFKC: [0x0635, 0x0645], NFKD: [0x0635, 0x0645] }, +{ source: [0xFCB4], NFC: [0xFCB4], NFD: [0xFCB4], NFKC: [0x0636, 0x062C], NFKD: [0x0636, 0x062C] }, +{ source: [0xFCB5], NFC: [0xFCB5], NFD: [0xFCB5], NFKC: [0x0636, 0x062D], NFKD: [0x0636, 0x062D] }, +{ source: [0xFCB6], NFC: [0xFCB6], NFD: [0xFCB6], NFKC: [0x0636, 0x062E], NFKD: [0x0636, 0x062E] }, +{ source: [0xFCB7], NFC: [0xFCB7], NFD: [0xFCB7], NFKC: [0x0636, 0x0645], NFKD: [0x0636, 0x0645] }, +{ source: [0xFCB8], NFC: [0xFCB8], NFD: [0xFCB8], NFKC: [0x0637, 0x062D], NFKD: [0x0637, 0x062D] }, +{ source: [0xFCB9], NFC: [0xFCB9], NFD: [0xFCB9], NFKC: [0x0638, 0x0645], NFKD: [0x0638, 0x0645] }, +{ source: [0xFCBA], NFC: [0xFCBA], NFD: [0xFCBA], NFKC: [0x0639, 0x062C], NFKD: [0x0639, 0x062C] }, +{ source: [0xFCBB], NFC: [0xFCBB], NFD: [0xFCBB], NFKC: [0x0639, 0x0645], NFKD: [0x0639, 0x0645] }, +{ source: [0xFCBC], NFC: [0xFCBC], NFD: [0xFCBC], NFKC: [0x063A, 0x062C], NFKD: [0x063A, 0x062C] }, +{ source: [0xFCBD], NFC: [0xFCBD], NFD: [0xFCBD], NFKC: [0x063A, 0x0645], NFKD: [0x063A, 0x0645] }, +{ source: [0xFCBE], NFC: [0xFCBE], NFD: [0xFCBE], NFKC: [0x0641, 0x062C], NFKD: [0x0641, 0x062C] }, +{ source: [0xFCBF], NFC: [0xFCBF], NFD: [0xFCBF], NFKC: [0x0641, 0x062D], NFKD: [0x0641, 0x062D] }, +{ source: [0xFCC0], NFC: [0xFCC0], NFD: [0xFCC0], NFKC: [0x0641, 0x062E], NFKD: [0x0641, 0x062E] }, +{ source: [0xFCC1], NFC: [0xFCC1], NFD: [0xFCC1], NFKC: [0x0641, 0x0645], NFKD: [0x0641, 0x0645] }, +{ source: [0xFCC2], NFC: [0xFCC2], NFD: [0xFCC2], NFKC: [0x0642, 0x062D], NFKD: [0x0642, 0x062D] }, +{ source: [0xFCC3], NFC: [0xFCC3], NFD: [0xFCC3], NFKC: [0x0642, 0x0645], NFKD: [0x0642, 0x0645] }, +{ source: [0xFCC4], NFC: [0xFCC4], NFD: [0xFCC4], NFKC: [0x0643, 0x062C], NFKD: [0x0643, 0x062C] }, +{ source: [0xFCC5], NFC: [0xFCC5], NFD: [0xFCC5], NFKC: [0x0643, 0x062D], NFKD: [0x0643, 0x062D] }, +{ source: [0xFCC6], NFC: [0xFCC6], NFD: [0xFCC6], NFKC: [0x0643, 0x062E], NFKD: [0x0643, 0x062E] }, +{ source: [0xFCC7], NFC: [0xFCC7], NFD: [0xFCC7], NFKC: [0x0643, 0x0644], NFKD: [0x0643, 0x0644] }, +{ source: [0xFCC8], NFC: [0xFCC8], NFD: [0xFCC8], NFKC: [0x0643, 0x0645], NFKD: [0x0643, 0x0645] }, +{ source: [0xFCC9], NFC: [0xFCC9], NFD: [0xFCC9], NFKC: [0x0644, 0x062C], NFKD: [0x0644, 0x062C] }, +{ source: [0xFCCA], NFC: [0xFCCA], NFD: [0xFCCA], NFKC: [0x0644, 0x062D], NFKD: [0x0644, 0x062D] }, +{ source: [0xFCCB], NFC: [0xFCCB], NFD: [0xFCCB], NFKC: [0x0644, 0x062E], NFKD: [0x0644, 0x062E] }, +{ source: [0xFCCC], NFC: [0xFCCC], NFD: [0xFCCC], NFKC: [0x0644, 0x0645], NFKD: [0x0644, 0x0645] }, +{ source: [0xFCCD], NFC: [0xFCCD], NFD: [0xFCCD], NFKC: [0x0644, 0x0647], NFKD: [0x0644, 0x0647] }, +{ source: [0xFCCE], NFC: [0xFCCE], NFD: [0xFCCE], NFKC: [0x0645, 0x062C], NFKD: [0x0645, 0x062C] }, +{ source: [0xFCCF], NFC: [0xFCCF], NFD: [0xFCCF], NFKC: [0x0645, 0x062D], NFKD: [0x0645, 0x062D] }, +{ source: [0xFCD0], NFC: [0xFCD0], NFD: [0xFCD0], NFKC: [0x0645, 0x062E], NFKD: [0x0645, 0x062E] }, +{ source: [0xFCD1], NFC: [0xFCD1], NFD: [0xFCD1], NFKC: [0x0645, 0x0645], NFKD: [0x0645, 0x0645] }, +{ source: [0xFCD2], NFC: [0xFCD2], NFD: [0xFCD2], NFKC: [0x0646, 0x062C], NFKD: [0x0646, 0x062C] }, +{ source: [0xFCD3], NFC: [0xFCD3], NFD: [0xFCD3], NFKC: [0x0646, 0x062D], NFKD: [0x0646, 0x062D] }, +{ source: [0xFCD4], NFC: [0xFCD4], NFD: [0xFCD4], NFKC: [0x0646, 0x062E], NFKD: [0x0646, 0x062E] }, +{ source: [0xFCD5], NFC: [0xFCD5], NFD: [0xFCD5], NFKC: [0x0646, 0x0645], NFKD: [0x0646, 0x0645] }, +{ source: [0xFCD6], NFC: [0xFCD6], NFD: [0xFCD6], NFKC: [0x0646, 0x0647], NFKD: [0x0646, 0x0647] }, +{ source: [0xFCD7], NFC: [0xFCD7], NFD: [0xFCD7], NFKC: [0x0647, 0x062C], NFKD: [0x0647, 0x062C] }, +{ source: [0xFCD8], NFC: [0xFCD8], NFD: [0xFCD8], NFKC: [0x0647, 0x0645], NFKD: [0x0647, 0x0645] }, +{ source: [0xFCD9], NFC: [0xFCD9], NFD: [0xFCD9], NFKC: [0x0647, 0x0670], NFKD: [0x0647, 0x0670] }, +{ source: [0xFCDA], NFC: [0xFCDA], NFD: [0xFCDA], NFKC: [0x064A, 0x062C], NFKD: [0x064A, 0x062C] }, +{ source: [0xFCDB], NFC: [0xFCDB], NFD: [0xFCDB], NFKC: [0x064A, 0x062D], NFKD: [0x064A, 0x062D] }, +{ source: [0xFCDC], NFC: [0xFCDC], NFD: [0xFCDC], NFKC: [0x064A, 0x062E], NFKD: [0x064A, 0x062E] }, +{ source: [0xFCDD], NFC: [0xFCDD], NFD: [0xFCDD], NFKC: [0x064A, 0x0645], NFKD: [0x064A, 0x0645] }, +{ source: [0xFCDE], NFC: [0xFCDE], NFD: [0xFCDE], NFKC: [0x064A, 0x0647], NFKD: [0x064A, 0x0647] }, +{ source: [0xFCDF], NFC: [0xFCDF], NFD: [0xFCDF], NFKC: [0x0626, 0x0645], NFKD: [0x064A, 0x0654, 0x0645] }, +{ source: [0xFCE0], NFC: [0xFCE0], NFD: [0xFCE0], NFKC: [0x0626, 0x0647], NFKD: [0x064A, 0x0654, 0x0647] }, +{ source: [0xFCE1], NFC: [0xFCE1], NFD: [0xFCE1], NFKC: [0x0628, 0x0645], NFKD: [0x0628, 0x0645] }, +{ source: [0xFCE2], NFC: [0xFCE2], NFD: [0xFCE2], NFKC: [0x0628, 0x0647], NFKD: [0x0628, 0x0647] }, +{ source: [0xFCE3], NFC: [0xFCE3], NFD: [0xFCE3], NFKC: [0x062A, 0x0645], NFKD: [0x062A, 0x0645] }, +{ source: [0xFCE4], NFC: [0xFCE4], NFD: [0xFCE4], NFKC: [0x062A, 0x0647], NFKD: [0x062A, 0x0647] }, +{ source: [0xFCE5], NFC: [0xFCE5], NFD: [0xFCE5], NFKC: [0x062B, 0x0645], NFKD: [0x062B, 0x0645] }, +{ source: [0xFCE6], NFC: [0xFCE6], NFD: [0xFCE6], NFKC: [0x062B, 0x0647], NFKD: [0x062B, 0x0647] }, +{ source: [0xFCE7], NFC: [0xFCE7], NFD: [0xFCE7], NFKC: [0x0633, 0x0645], NFKD: [0x0633, 0x0645] }, +{ source: [0xFCE8], NFC: [0xFCE8], NFD: [0xFCE8], NFKC: [0x0633, 0x0647], NFKD: [0x0633, 0x0647] }, +{ source: [0xFCE9], NFC: [0xFCE9], NFD: [0xFCE9], NFKC: [0x0634, 0x0645], NFKD: [0x0634, 0x0645] }, +{ source: [0xFCEA], NFC: [0xFCEA], NFD: [0xFCEA], NFKC: [0x0634, 0x0647], NFKD: [0x0634, 0x0647] }, +{ source: [0xFCEB], NFC: [0xFCEB], NFD: [0xFCEB], NFKC: [0x0643, 0x0644], NFKD: [0x0643, 0x0644] }, +{ source: [0xFCEC], NFC: [0xFCEC], NFD: [0xFCEC], NFKC: [0x0643, 0x0645], NFKD: [0x0643, 0x0645] }, +{ source: [0xFCED], NFC: [0xFCED], NFD: [0xFCED], NFKC: [0x0644, 0x0645], NFKD: [0x0644, 0x0645] }, +{ source: [0xFCEE], NFC: [0xFCEE], NFD: [0xFCEE], NFKC: [0x0646, 0x0645], NFKD: [0x0646, 0x0645] }, +{ source: [0xFCEF], NFC: [0xFCEF], NFD: [0xFCEF], NFKC: [0x0646, 0x0647], NFKD: [0x0646, 0x0647] }, +{ source: [0xFCF0], NFC: [0xFCF0], NFD: [0xFCF0], NFKC: [0x064A, 0x0645], NFKD: [0x064A, 0x0645] }, +{ source: [0xFCF1], NFC: [0xFCF1], NFD: [0xFCF1], NFKC: [0x064A, 0x0647], NFKD: [0x064A, 0x0647] }, +{ source: [0xFCF2], NFC: [0xFCF2], NFD: [0xFCF2], NFKC: [0x0640, 0x064E, 0x0651], NFKD: [0x0640, 0x064E, 0x0651] }, +{ source: [0xFCF3], NFC: [0xFCF3], NFD: [0xFCF3], NFKC: [0x0640, 0x064F, 0x0651], NFKD: [0x0640, 0x064F, 0x0651] }, +{ source: [0xFCF4], NFC: [0xFCF4], NFD: [0xFCF4], NFKC: [0x0640, 0x0650, 0x0651], NFKD: [0x0640, 0x0650, 0x0651] }, +{ source: [0xFCF5], NFC: [0xFCF5], NFD: [0xFCF5], NFKC: [0x0637, 0x0649], NFKD: [0x0637, 0x0649] }, +{ source: [0xFCF6], NFC: [0xFCF6], NFD: [0xFCF6], NFKC: [0x0637, 0x064A], NFKD: [0x0637, 0x064A] }, +{ source: [0xFCF7], NFC: [0xFCF7], NFD: [0xFCF7], NFKC: [0x0639, 0x0649], NFKD: [0x0639, 0x0649] }, +{ source: [0xFCF8], NFC: [0xFCF8], NFD: [0xFCF8], NFKC: [0x0639, 0x064A], NFKD: [0x0639, 0x064A] }, +{ source: [0xFCF9], NFC: [0xFCF9], NFD: [0xFCF9], NFKC: [0x063A, 0x0649], NFKD: [0x063A, 0x0649] }, +{ source: [0xFCFA], NFC: [0xFCFA], NFD: [0xFCFA], NFKC: [0x063A, 0x064A], NFKD: [0x063A, 0x064A] }, +{ source: [0xFCFB], NFC: [0xFCFB], NFD: [0xFCFB], NFKC: [0x0633, 0x0649], NFKD: [0x0633, 0x0649] }, +{ source: [0xFCFC], NFC: [0xFCFC], NFD: [0xFCFC], NFKC: [0x0633, 0x064A], NFKD: [0x0633, 0x064A] }, +{ source: [0xFCFD], NFC: [0xFCFD], NFD: [0xFCFD], NFKC: [0x0634, 0x0649], NFKD: [0x0634, 0x0649] }, +{ source: [0xFCFE], NFC: [0xFCFE], NFD: [0xFCFE], NFKC: [0x0634, 0x064A], NFKD: [0x0634, 0x064A] }, +{ source: [0xFCFF], NFC: [0xFCFF], NFD: [0xFCFF], NFKC: [0x062D, 0x0649], NFKD: [0x062D, 0x0649] }, +{ source: [0xFD00], NFC: [0xFD00], NFD: [0xFD00], NFKC: [0x062D, 0x064A], NFKD: [0x062D, 0x064A] }, +{ source: [0xFD01], NFC: [0xFD01], NFD: [0xFD01], NFKC: [0x062C, 0x0649], NFKD: [0x062C, 0x0649] }, +{ source: [0xFD02], NFC: [0xFD02], NFD: [0xFD02], NFKC: [0x062C, 0x064A], NFKD: [0x062C, 0x064A] }, +{ source: [0xFD03], NFC: [0xFD03], NFD: [0xFD03], NFKC: [0x062E, 0x0649], NFKD: [0x062E, 0x0649] }, +{ source: [0xFD04], NFC: [0xFD04], NFD: [0xFD04], NFKC: [0x062E, 0x064A], NFKD: [0x062E, 0x064A] }, +{ source: [0xFD05], NFC: [0xFD05], NFD: [0xFD05], NFKC: [0x0635, 0x0649], NFKD: [0x0635, 0x0649] }, +{ source: [0xFD06], NFC: [0xFD06], NFD: [0xFD06], NFKC: [0x0635, 0x064A], NFKD: [0x0635, 0x064A] }, +{ source: [0xFD07], NFC: [0xFD07], NFD: [0xFD07], NFKC: [0x0636, 0x0649], NFKD: [0x0636, 0x0649] }, +{ source: [0xFD08], NFC: [0xFD08], NFD: [0xFD08], NFKC: [0x0636, 0x064A], NFKD: [0x0636, 0x064A] }, +{ source: [0xFD09], NFC: [0xFD09], NFD: [0xFD09], NFKC: [0x0634, 0x062C], NFKD: [0x0634, 0x062C] }, +{ source: [0xFD0A], NFC: [0xFD0A], NFD: [0xFD0A], NFKC: [0x0634, 0x062D], NFKD: [0x0634, 0x062D] }, +{ source: [0xFD0B], NFC: [0xFD0B], NFD: [0xFD0B], NFKC: [0x0634, 0x062E], NFKD: [0x0634, 0x062E] }, +{ source: [0xFD0C], NFC: [0xFD0C], NFD: [0xFD0C], NFKC: [0x0634, 0x0645], NFKD: [0x0634, 0x0645] }, +{ source: [0xFD0D], NFC: [0xFD0D], NFD: [0xFD0D], NFKC: [0x0634, 0x0631], NFKD: [0x0634, 0x0631] }, +{ source: [0xFD0E], NFC: [0xFD0E], NFD: [0xFD0E], NFKC: [0x0633, 0x0631], NFKD: [0x0633, 0x0631] }, +{ source: [0xFD0F], NFC: [0xFD0F], NFD: [0xFD0F], NFKC: [0x0635, 0x0631], NFKD: [0x0635, 0x0631] }, +{ source: [0xFD10], NFC: [0xFD10], NFD: [0xFD10], NFKC: [0x0636, 0x0631], NFKD: [0x0636, 0x0631] }, +{ source: [0xFD11], NFC: [0xFD11], NFD: [0xFD11], NFKC: [0x0637, 0x0649], NFKD: [0x0637, 0x0649] }, +{ source: [0xFD12], NFC: [0xFD12], NFD: [0xFD12], NFKC: [0x0637, 0x064A], NFKD: [0x0637, 0x064A] }, +{ source: [0xFD13], NFC: [0xFD13], NFD: [0xFD13], NFKC: [0x0639, 0x0649], NFKD: [0x0639, 0x0649] }, +{ source: [0xFD14], NFC: [0xFD14], NFD: [0xFD14], NFKC: [0x0639, 0x064A], NFKD: [0x0639, 0x064A] }, +{ source: [0xFD15], NFC: [0xFD15], NFD: [0xFD15], NFKC: [0x063A, 0x0649], NFKD: [0x063A, 0x0649] }, +{ source: [0xFD16], NFC: [0xFD16], NFD: [0xFD16], NFKC: [0x063A, 0x064A], NFKD: [0x063A, 0x064A] }, +{ source: [0xFD17], NFC: [0xFD17], NFD: [0xFD17], NFKC: [0x0633, 0x0649], NFKD: [0x0633, 0x0649] }, +{ source: [0xFD18], NFC: [0xFD18], NFD: [0xFD18], NFKC: [0x0633, 0x064A], NFKD: [0x0633, 0x064A] }, +{ source: [0xFD19], NFC: [0xFD19], NFD: [0xFD19], NFKC: [0x0634, 0x0649], NFKD: [0x0634, 0x0649] }, +{ source: [0xFD1A], NFC: [0xFD1A], NFD: [0xFD1A], NFKC: [0x0634, 0x064A], NFKD: [0x0634, 0x064A] }, +{ source: [0xFD1B], NFC: [0xFD1B], NFD: [0xFD1B], NFKC: [0x062D, 0x0649], NFKD: [0x062D, 0x0649] }, +{ source: [0xFD1C], NFC: [0xFD1C], NFD: [0xFD1C], NFKC: [0x062D, 0x064A], NFKD: [0x062D, 0x064A] }, +{ source: [0xFD1D], NFC: [0xFD1D], NFD: [0xFD1D], NFKC: [0x062C, 0x0649], NFKD: [0x062C, 0x0649] }, +{ source: [0xFD1E], NFC: [0xFD1E], NFD: [0xFD1E], NFKC: [0x062C, 0x064A], NFKD: [0x062C, 0x064A] }, +{ source: [0xFD1F], NFC: [0xFD1F], NFD: [0xFD1F], NFKC: [0x062E, 0x0649], NFKD: [0x062E, 0x0649] }, +{ source: [0xFD20], NFC: [0xFD20], NFD: [0xFD20], NFKC: [0x062E, 0x064A], NFKD: [0x062E, 0x064A] }, +{ source: [0xFD21], NFC: [0xFD21], NFD: [0xFD21], NFKC: [0x0635, 0x0649], NFKD: [0x0635, 0x0649] }, +{ source: [0xFD22], NFC: [0xFD22], NFD: [0xFD22], NFKC: [0x0635, 0x064A], NFKD: [0x0635, 0x064A] }, +{ source: [0xFD23], NFC: [0xFD23], NFD: [0xFD23], NFKC: [0x0636, 0x0649], NFKD: [0x0636, 0x0649] }, +{ source: [0xFD24], NFC: [0xFD24], NFD: [0xFD24], NFKC: [0x0636, 0x064A], NFKD: [0x0636, 0x064A] }, +{ source: [0xFD25], NFC: [0xFD25], NFD: [0xFD25], NFKC: [0x0634, 0x062C], NFKD: [0x0634, 0x062C] }, +{ source: [0xFD26], NFC: [0xFD26], NFD: [0xFD26], NFKC: [0x0634, 0x062D], NFKD: [0x0634, 0x062D] }, +{ source: [0xFD27], NFC: [0xFD27], NFD: [0xFD27], NFKC: [0x0634, 0x062E], NFKD: [0x0634, 0x062E] }, +{ source: [0xFD28], NFC: [0xFD28], NFD: [0xFD28], NFKC: [0x0634, 0x0645], NFKD: [0x0634, 0x0645] }, +{ source: [0xFD29], NFC: [0xFD29], NFD: [0xFD29], NFKC: [0x0634, 0x0631], NFKD: [0x0634, 0x0631] }, +{ source: [0xFD2A], NFC: [0xFD2A], NFD: [0xFD2A], NFKC: [0x0633, 0x0631], NFKD: [0x0633, 0x0631] }, +{ source: [0xFD2B], NFC: [0xFD2B], NFD: [0xFD2B], NFKC: [0x0635, 0x0631], NFKD: [0x0635, 0x0631] }, +{ source: [0xFD2C], NFC: [0xFD2C], NFD: [0xFD2C], NFKC: [0x0636, 0x0631], NFKD: [0x0636, 0x0631] }, +{ source: [0xFD2D], NFC: [0xFD2D], NFD: [0xFD2D], NFKC: [0x0634, 0x062C], NFKD: [0x0634, 0x062C] }, +{ source: [0xFD2E], NFC: [0xFD2E], NFD: [0xFD2E], NFKC: [0x0634, 0x062D], NFKD: [0x0634, 0x062D] }, +{ source: [0xFD2F], NFC: [0xFD2F], NFD: [0xFD2F], NFKC: [0x0634, 0x062E], NFKD: [0x0634, 0x062E] }, +{ source: [0xFD30], NFC: [0xFD30], NFD: [0xFD30], NFKC: [0x0634, 0x0645], NFKD: [0x0634, 0x0645] }, +{ source: [0xFD31], NFC: [0xFD31], NFD: [0xFD31], NFKC: [0x0633, 0x0647], NFKD: [0x0633, 0x0647] }, +{ source: [0xFD32], NFC: [0xFD32], NFD: [0xFD32], NFKC: [0x0634, 0x0647], NFKD: [0x0634, 0x0647] }, +{ source: [0xFD33], NFC: [0xFD33], NFD: [0xFD33], NFKC: [0x0637, 0x0645], NFKD: [0x0637, 0x0645] }, +{ source: [0xFD34], NFC: [0xFD34], NFD: [0xFD34], NFKC: [0x0633, 0x062C], NFKD: [0x0633, 0x062C] }, +{ source: [0xFD35], NFC: [0xFD35], NFD: [0xFD35], NFKC: [0x0633, 0x062D], NFKD: [0x0633, 0x062D] }, +{ source: [0xFD36], NFC: [0xFD36], NFD: [0xFD36], NFKC: [0x0633, 0x062E], NFKD: [0x0633, 0x062E] }, +{ source: [0xFD37], NFC: [0xFD37], NFD: [0xFD37], NFKC: [0x0634, 0x062C], NFKD: [0x0634, 0x062C] }, +{ source: [0xFD38], NFC: [0xFD38], NFD: [0xFD38], NFKC: [0x0634, 0x062D], NFKD: [0x0634, 0x062D] }, +{ source: [0xFD39], NFC: [0xFD39], NFD: [0xFD39], NFKC: [0x0634, 0x062E], NFKD: [0x0634, 0x062E] }, +{ source: [0xFD3A], NFC: [0xFD3A], NFD: [0xFD3A], NFKC: [0x0637, 0x0645], NFKD: [0x0637, 0x0645] }, +{ source: [0xFD3B], NFC: [0xFD3B], NFD: [0xFD3B], NFKC: [0x0638, 0x0645], NFKD: [0x0638, 0x0645] }, +{ source: [0xFD3C], NFC: [0xFD3C], NFD: [0xFD3C], NFKC: [0x0627, 0x064B], NFKD: [0x0627, 0x064B] }, +{ source: [0xFD3D], NFC: [0xFD3D], NFD: [0xFD3D], NFKC: [0x0627, 0x064B], NFKD: [0x0627, 0x064B] }, +{ source: [0xFD50], NFC: [0xFD50], NFD: [0xFD50], NFKC: [0x062A, 0x062C, 0x0645], NFKD: [0x062A, 0x062C, 0x0645] }, +{ source: [0xFD51], NFC: [0xFD51], NFD: [0xFD51], NFKC: [0x062A, 0x062D, 0x062C], NFKD: [0x062A, 0x062D, 0x062C] }, +{ source: [0xFD52], NFC: [0xFD52], NFD: [0xFD52], NFKC: [0x062A, 0x062D, 0x062C], NFKD: [0x062A, 0x062D, 0x062C] }, +{ source: [0xFD53], NFC: [0xFD53], NFD: [0xFD53], NFKC: [0x062A, 0x062D, 0x0645], NFKD: [0x062A, 0x062D, 0x0645] }, +{ source: [0xFD54], NFC: [0xFD54], NFD: [0xFD54], NFKC: [0x062A, 0x062E, 0x0645], NFKD: [0x062A, 0x062E, 0x0645] }, +{ source: [0xFD55], NFC: [0xFD55], NFD: [0xFD55], NFKC: [0x062A, 0x0645, 0x062C], NFKD: [0x062A, 0x0645, 0x062C] }, +{ source: [0xFD56], NFC: [0xFD56], NFD: [0xFD56], NFKC: [0x062A, 0x0645, 0x062D], NFKD: [0x062A, 0x0645, 0x062D] }, +{ source: [0xFD57], NFC: [0xFD57], NFD: [0xFD57], NFKC: [0x062A, 0x0645, 0x062E], NFKD: [0x062A, 0x0645, 0x062E] }, +{ source: [0xFD58], NFC: [0xFD58], NFD: [0xFD58], NFKC: [0x062C, 0x0645, 0x062D], NFKD: [0x062C, 0x0645, 0x062D] }, +{ source: [0xFD59], NFC: [0xFD59], NFD: [0xFD59], NFKC: [0x062C, 0x0645, 0x062D], NFKD: [0x062C, 0x0645, 0x062D] }, +{ source: [0xFD5A], NFC: [0xFD5A], NFD: [0xFD5A], NFKC: [0x062D, 0x0645, 0x064A], NFKD: [0x062D, 0x0645, 0x064A] }, +{ source: [0xFD5B], NFC: [0xFD5B], NFD: [0xFD5B], NFKC: [0x062D, 0x0645, 0x0649], NFKD: [0x062D, 0x0645, 0x0649] }, +{ source: [0xFD5C], NFC: [0xFD5C], NFD: [0xFD5C], NFKC: [0x0633, 0x062D, 0x062C], NFKD: [0x0633, 0x062D, 0x062C] }, +{ source: [0xFD5D], NFC: [0xFD5D], NFD: [0xFD5D], NFKC: [0x0633, 0x062C, 0x062D], NFKD: [0x0633, 0x062C, 0x062D] }, +{ source: [0xFD5E], NFC: [0xFD5E], NFD: [0xFD5E], NFKC: [0x0633, 0x062C, 0x0649], NFKD: [0x0633, 0x062C, 0x0649] }, +{ source: [0xFD5F], NFC: [0xFD5F], NFD: [0xFD5F], NFKC: [0x0633, 0x0645, 0x062D], NFKD: [0x0633, 0x0645, 0x062D] }, +{ source: [0xFD60], NFC: [0xFD60], NFD: [0xFD60], NFKC: [0x0633, 0x0645, 0x062D], NFKD: [0x0633, 0x0645, 0x062D] }, +{ source: [0xFD61], NFC: [0xFD61], NFD: [0xFD61], NFKC: [0x0633, 0x0645, 0x062C], NFKD: [0x0633, 0x0645, 0x062C] }, +{ source: [0xFD62], NFC: [0xFD62], NFD: [0xFD62], NFKC: [0x0633, 0x0645, 0x0645], NFKD: [0x0633, 0x0645, 0x0645] }, +{ source: [0xFD63], NFC: [0xFD63], NFD: [0xFD63], NFKC: [0x0633, 0x0645, 0x0645], NFKD: [0x0633, 0x0645, 0x0645] }, +{ source: [0xFD64], NFC: [0xFD64], NFD: [0xFD64], NFKC: [0x0635, 0x062D, 0x062D], NFKD: [0x0635, 0x062D, 0x062D] }, +{ source: [0xFD65], NFC: [0xFD65], NFD: [0xFD65], NFKC: [0x0635, 0x062D, 0x062D], NFKD: [0x0635, 0x062D, 0x062D] }, +{ source: [0xFD66], NFC: [0xFD66], NFD: [0xFD66], NFKC: [0x0635, 0x0645, 0x0645], NFKD: [0x0635, 0x0645, 0x0645] }, +{ source: [0xFD67], NFC: [0xFD67], NFD: [0xFD67], NFKC: [0x0634, 0x062D, 0x0645], NFKD: [0x0634, 0x062D, 0x0645] }, +{ source: [0xFD68], NFC: [0xFD68], NFD: [0xFD68], NFKC: [0x0634, 0x062D, 0x0645], NFKD: [0x0634, 0x062D, 0x0645] }, +{ source: [0xFD69], NFC: [0xFD69], NFD: [0xFD69], NFKC: [0x0634, 0x062C, 0x064A], NFKD: [0x0634, 0x062C, 0x064A] }, +{ source: [0xFD6A], NFC: [0xFD6A], NFD: [0xFD6A], NFKC: [0x0634, 0x0645, 0x062E], NFKD: [0x0634, 0x0645, 0x062E] }, +{ source: [0xFD6B], NFC: [0xFD6B], NFD: [0xFD6B], NFKC: [0x0634, 0x0645, 0x062E], NFKD: [0x0634, 0x0645, 0x062E] }, +{ source: [0xFD6C], NFC: [0xFD6C], NFD: [0xFD6C], NFKC: [0x0634, 0x0645, 0x0645], NFKD: [0x0634, 0x0645, 0x0645] }, +{ source: [0xFD6D], NFC: [0xFD6D], NFD: [0xFD6D], NFKC: [0x0634, 0x0645, 0x0645], NFKD: [0x0634, 0x0645, 0x0645] }, +{ source: [0xFD6E], NFC: [0xFD6E], NFD: [0xFD6E], NFKC: [0x0636, 0x062D, 0x0649], NFKD: [0x0636, 0x062D, 0x0649] }, +{ source: [0xFD6F], NFC: [0xFD6F], NFD: [0xFD6F], NFKC: [0x0636, 0x062E, 0x0645], NFKD: [0x0636, 0x062E, 0x0645] }, +{ source: [0xFD70], NFC: [0xFD70], NFD: [0xFD70], NFKC: [0x0636, 0x062E, 0x0645], NFKD: [0x0636, 0x062E, 0x0645] }, +{ source: [0xFD71], NFC: [0xFD71], NFD: [0xFD71], NFKC: [0x0637, 0x0645, 0x062D], NFKD: [0x0637, 0x0645, 0x062D] }, +{ source: [0xFD72], NFC: [0xFD72], NFD: [0xFD72], NFKC: [0x0637, 0x0645, 0x062D], NFKD: [0x0637, 0x0645, 0x062D] }, +{ source: [0xFD73], NFC: [0xFD73], NFD: [0xFD73], NFKC: [0x0637, 0x0645, 0x0645], NFKD: [0x0637, 0x0645, 0x0645] }, +{ source: [0xFD74], NFC: [0xFD74], NFD: [0xFD74], NFKC: [0x0637, 0x0645, 0x064A], NFKD: [0x0637, 0x0645, 0x064A] }, +{ source: [0xFD75], NFC: [0xFD75], NFD: [0xFD75], NFKC: [0x0639, 0x062C, 0x0645], NFKD: [0x0639, 0x062C, 0x0645] }, +{ source: [0xFD76], NFC: [0xFD76], NFD: [0xFD76], NFKC: [0x0639, 0x0645, 0x0645], NFKD: [0x0639, 0x0645, 0x0645] }, +{ source: [0xFD77], NFC: [0xFD77], NFD: [0xFD77], NFKC: [0x0639, 0x0645, 0x0645], NFKD: [0x0639, 0x0645, 0x0645] }, +{ source: [0xFD78], NFC: [0xFD78], NFD: [0xFD78], NFKC: [0x0639, 0x0645, 0x0649], NFKD: [0x0639, 0x0645, 0x0649] }, +{ source: [0xFD79], NFC: [0xFD79], NFD: [0xFD79], NFKC: [0x063A, 0x0645, 0x0645], NFKD: [0x063A, 0x0645, 0x0645] }, +{ source: [0xFD7A], NFC: [0xFD7A], NFD: [0xFD7A], NFKC: [0x063A, 0x0645, 0x064A], NFKD: [0x063A, 0x0645, 0x064A] }, +{ source: [0xFD7B], NFC: [0xFD7B], NFD: [0xFD7B], NFKC: [0x063A, 0x0645, 0x0649], NFKD: [0x063A, 0x0645, 0x0649] }, +{ source: [0xFD7C], NFC: [0xFD7C], NFD: [0xFD7C], NFKC: [0x0641, 0x062E, 0x0645], NFKD: [0x0641, 0x062E, 0x0645] }, +{ source: [0xFD7D], NFC: [0xFD7D], NFD: [0xFD7D], NFKC: [0x0641, 0x062E, 0x0645], NFKD: [0x0641, 0x062E, 0x0645] }, +{ source: [0xFD7E], NFC: [0xFD7E], NFD: [0xFD7E], NFKC: [0x0642, 0x0645, 0x062D], NFKD: [0x0642, 0x0645, 0x062D] }, +{ source: [0xFD7F], NFC: [0xFD7F], NFD: [0xFD7F], NFKC: [0x0642, 0x0645, 0x0645], NFKD: [0x0642, 0x0645, 0x0645] }, +{ source: [0xFD80], NFC: [0xFD80], NFD: [0xFD80], NFKC: [0x0644, 0x062D, 0x0645], NFKD: [0x0644, 0x062D, 0x0645] }, +{ source: [0xFD81], NFC: [0xFD81], NFD: [0xFD81], NFKC: [0x0644, 0x062D, 0x064A], NFKD: [0x0644, 0x062D, 0x064A] }, +{ source: [0xFD82], NFC: [0xFD82], NFD: [0xFD82], NFKC: [0x0644, 0x062D, 0x0649], NFKD: [0x0644, 0x062D, 0x0649] }, +{ source: [0xFD83], NFC: [0xFD83], NFD: [0xFD83], NFKC: [0x0644, 0x062C, 0x062C], NFKD: [0x0644, 0x062C, 0x062C] }, +{ source: [0xFD84], NFC: [0xFD84], NFD: [0xFD84], NFKC: [0x0644, 0x062C, 0x062C], NFKD: [0x0644, 0x062C, 0x062C] }, +{ source: [0xFD85], NFC: [0xFD85], NFD: [0xFD85], NFKC: [0x0644, 0x062E, 0x0645], NFKD: [0x0644, 0x062E, 0x0645] }, +{ source: [0xFD86], NFC: [0xFD86], NFD: [0xFD86], NFKC: [0x0644, 0x062E, 0x0645], NFKD: [0x0644, 0x062E, 0x0645] }, +{ source: [0xFD87], NFC: [0xFD87], NFD: [0xFD87], NFKC: [0x0644, 0x0645, 0x062D], NFKD: [0x0644, 0x0645, 0x062D] }, +{ source: [0xFD88], NFC: [0xFD88], NFD: [0xFD88], NFKC: [0x0644, 0x0645, 0x062D], NFKD: [0x0644, 0x0645, 0x062D] }, +{ source: [0xFD89], NFC: [0xFD89], NFD: [0xFD89], NFKC: [0x0645, 0x062D, 0x062C], NFKD: [0x0645, 0x062D, 0x062C] }, +{ source: [0xFD8A], NFC: [0xFD8A], NFD: [0xFD8A], NFKC: [0x0645, 0x062D, 0x0645], NFKD: [0x0645, 0x062D, 0x0645] }, +{ source: [0xFD8B], NFC: [0xFD8B], NFD: [0xFD8B], NFKC: [0x0645, 0x062D, 0x064A], NFKD: [0x0645, 0x062D, 0x064A] }, +{ source: [0xFD8C], NFC: [0xFD8C], NFD: [0xFD8C], NFKC: [0x0645, 0x062C, 0x062D], NFKD: [0x0645, 0x062C, 0x062D] }, +{ source: [0xFD8D], NFC: [0xFD8D], NFD: [0xFD8D], NFKC: [0x0645, 0x062C, 0x0645], NFKD: [0x0645, 0x062C, 0x0645] }, +{ source: [0xFD8E], NFC: [0xFD8E], NFD: [0xFD8E], NFKC: [0x0645, 0x062E, 0x062C], NFKD: [0x0645, 0x062E, 0x062C] }, +{ source: [0xFD8F], NFC: [0xFD8F], NFD: [0xFD8F], NFKC: [0x0645, 0x062E, 0x0645], NFKD: [0x0645, 0x062E, 0x0645] }, +{ source: [0xFD92], NFC: [0xFD92], NFD: [0xFD92], NFKC: [0x0645, 0x062C, 0x062E], NFKD: [0x0645, 0x062C, 0x062E] }, +{ source: [0xFD93], NFC: [0xFD93], NFD: [0xFD93], NFKC: [0x0647, 0x0645, 0x062C], NFKD: [0x0647, 0x0645, 0x062C] }, +{ source: [0xFD94], NFC: [0xFD94], NFD: [0xFD94], NFKC: [0x0647, 0x0645, 0x0645], NFKD: [0x0647, 0x0645, 0x0645] }, +{ source: [0xFD95], NFC: [0xFD95], NFD: [0xFD95], NFKC: [0x0646, 0x062D, 0x0645], NFKD: [0x0646, 0x062D, 0x0645] }, +{ source: [0xFD96], NFC: [0xFD96], NFD: [0xFD96], NFKC: [0x0646, 0x062D, 0x0649], NFKD: [0x0646, 0x062D, 0x0649] }, +{ source: [0xFD97], NFC: [0xFD97], NFD: [0xFD97], NFKC: [0x0646, 0x062C, 0x0645], NFKD: [0x0646, 0x062C, 0x0645] }, +{ source: [0xFD98], NFC: [0xFD98], NFD: [0xFD98], NFKC: [0x0646, 0x062C, 0x0645], NFKD: [0x0646, 0x062C, 0x0645] }, +{ source: [0xFD99], NFC: [0xFD99], NFD: [0xFD99], NFKC: [0x0646, 0x062C, 0x0649], NFKD: [0x0646, 0x062C, 0x0649] }, +{ source: [0xFD9A], NFC: [0xFD9A], NFD: [0xFD9A], NFKC: [0x0646, 0x0645, 0x064A], NFKD: [0x0646, 0x0645, 0x064A] }, +{ source: [0xFD9B], NFC: [0xFD9B], NFD: [0xFD9B], NFKC: [0x0646, 0x0645, 0x0649], NFKD: [0x0646, 0x0645, 0x0649] }, +{ source: [0xFD9C], NFC: [0xFD9C], NFD: [0xFD9C], NFKC: [0x064A, 0x0645, 0x0645], NFKD: [0x064A, 0x0645, 0x0645] }, +{ source: [0xFD9D], NFC: [0xFD9D], NFD: [0xFD9D], NFKC: [0x064A, 0x0645, 0x0645], NFKD: [0x064A, 0x0645, 0x0645] }, +{ source: [0xFD9E], NFC: [0xFD9E], NFD: [0xFD9E], NFKC: [0x0628, 0x062E, 0x064A], NFKD: [0x0628, 0x062E, 0x064A] }, +{ source: [0xFD9F], NFC: [0xFD9F], NFD: [0xFD9F], NFKC: [0x062A, 0x062C, 0x064A], NFKD: [0x062A, 0x062C, 0x064A] }, +{ source: [0xFDA0], NFC: [0xFDA0], NFD: [0xFDA0], NFKC: [0x062A, 0x062C, 0x0649], NFKD: [0x062A, 0x062C, 0x0649] }, +{ source: [0xFDA1], NFC: [0xFDA1], NFD: [0xFDA1], NFKC: [0x062A, 0x062E, 0x064A], NFKD: [0x062A, 0x062E, 0x064A] }, +{ source: [0xFDA2], NFC: [0xFDA2], NFD: [0xFDA2], NFKC: [0x062A, 0x062E, 0x0649], NFKD: [0x062A, 0x062E, 0x0649] }, +{ source: [0xFDA3], NFC: [0xFDA3], NFD: [0xFDA3], NFKC: [0x062A, 0x0645, 0x064A], NFKD: [0x062A, 0x0645, 0x064A] }, +{ source: [0xFDA4], NFC: [0xFDA4], NFD: [0xFDA4], NFKC: [0x062A, 0x0645, 0x0649], NFKD: [0x062A, 0x0645, 0x0649] }, +{ source: [0xFDA5], NFC: [0xFDA5], NFD: [0xFDA5], NFKC: [0x062C, 0x0645, 0x064A], NFKD: [0x062C, 0x0645, 0x064A] }, +{ source: [0xFDA6], NFC: [0xFDA6], NFD: [0xFDA6], NFKC: [0x062C, 0x062D, 0x0649], NFKD: [0x062C, 0x062D, 0x0649] }, +{ source: [0xFDA7], NFC: [0xFDA7], NFD: [0xFDA7], NFKC: [0x062C, 0x0645, 0x0649], NFKD: [0x062C, 0x0645, 0x0649] }, +{ source: [0xFDA8], NFC: [0xFDA8], NFD: [0xFDA8], NFKC: [0x0633, 0x062E, 0x0649], NFKD: [0x0633, 0x062E, 0x0649] }, +{ source: [0xFDA9], NFC: [0xFDA9], NFD: [0xFDA9], NFKC: [0x0635, 0x062D, 0x064A], NFKD: [0x0635, 0x062D, 0x064A] }, +{ source: [0xFDAA], NFC: [0xFDAA], NFD: [0xFDAA], NFKC: [0x0634, 0x062D, 0x064A], NFKD: [0x0634, 0x062D, 0x064A] }, +{ source: [0xFDAB], NFC: [0xFDAB], NFD: [0xFDAB], NFKC: [0x0636, 0x062D, 0x064A], NFKD: [0x0636, 0x062D, 0x064A] }, +{ source: [0xFDAC], NFC: [0xFDAC], NFD: [0xFDAC], NFKC: [0x0644, 0x062C, 0x064A], NFKD: [0x0644, 0x062C, 0x064A] }, +{ source: [0xFDAD], NFC: [0xFDAD], NFD: [0xFDAD], NFKC: [0x0644, 0x0645, 0x064A], NFKD: [0x0644, 0x0645, 0x064A] }, +{ source: [0xFDAE], NFC: [0xFDAE], NFD: [0xFDAE], NFKC: [0x064A, 0x062D, 0x064A], NFKD: [0x064A, 0x062D, 0x064A] }, +{ source: [0xFDAF], NFC: [0xFDAF], NFD: [0xFDAF], NFKC: [0x064A, 0x062C, 0x064A], NFKD: [0x064A, 0x062C, 0x064A] }, +{ source: [0xFDB0], NFC: [0xFDB0], NFD: [0xFDB0], NFKC: [0x064A, 0x0645, 0x064A], NFKD: [0x064A, 0x0645, 0x064A] }, +{ source: [0xFDB1], NFC: [0xFDB1], NFD: [0xFDB1], NFKC: [0x0645, 0x0645, 0x064A], NFKD: [0x0645, 0x0645, 0x064A] }, +{ source: [0xFDB2], NFC: [0xFDB2], NFD: [0xFDB2], NFKC: [0x0642, 0x0645, 0x064A], NFKD: [0x0642, 0x0645, 0x064A] }, +{ source: [0xFDB3], NFC: [0xFDB3], NFD: [0xFDB3], NFKC: [0x0646, 0x062D, 0x064A], NFKD: [0x0646, 0x062D, 0x064A] }, +{ source: [0xFDB4], NFC: [0xFDB4], NFD: [0xFDB4], NFKC: [0x0642, 0x0645, 0x062D], NFKD: [0x0642, 0x0645, 0x062D] }, +{ source: [0xFDB5], NFC: [0xFDB5], NFD: [0xFDB5], NFKC: [0x0644, 0x062D, 0x0645], NFKD: [0x0644, 0x062D, 0x0645] }, +{ source: [0xFDB6], NFC: [0xFDB6], NFD: [0xFDB6], NFKC: [0x0639, 0x0645, 0x064A], NFKD: [0x0639, 0x0645, 0x064A] }, +{ source: [0xFDB7], NFC: [0xFDB7], NFD: [0xFDB7], NFKC: [0x0643, 0x0645, 0x064A], NFKD: [0x0643, 0x0645, 0x064A] }, +{ source: [0xFDB8], NFC: [0xFDB8], NFD: [0xFDB8], NFKC: [0x0646, 0x062C, 0x062D], NFKD: [0x0646, 0x062C, 0x062D] }, +{ source: [0xFDB9], NFC: [0xFDB9], NFD: [0xFDB9], NFKC: [0x0645, 0x062E, 0x064A], NFKD: [0x0645, 0x062E, 0x064A] }, +{ source: [0xFDBA], NFC: [0xFDBA], NFD: [0xFDBA], NFKC: [0x0644, 0x062C, 0x0645], NFKD: [0x0644, 0x062C, 0x0645] }, +{ source: [0xFDBB], NFC: [0xFDBB], NFD: [0xFDBB], NFKC: [0x0643, 0x0645, 0x0645], NFKD: [0x0643, 0x0645, 0x0645] }, +{ source: [0xFDBC], NFC: [0xFDBC], NFD: [0xFDBC], NFKC: [0x0644, 0x062C, 0x0645], NFKD: [0x0644, 0x062C, 0x0645] }, +{ source: [0xFDBD], NFC: [0xFDBD], NFD: [0xFDBD], NFKC: [0x0646, 0x062C, 0x062D], NFKD: [0x0646, 0x062C, 0x062D] }, +{ source: [0xFDBE], NFC: [0xFDBE], NFD: [0xFDBE], NFKC: [0x062C, 0x062D, 0x064A], NFKD: [0x062C, 0x062D, 0x064A] }, +{ source: [0xFDBF], NFC: [0xFDBF], NFD: [0xFDBF], NFKC: [0x062D, 0x062C, 0x064A], NFKD: [0x062D, 0x062C, 0x064A] }, +{ source: [0xFDC0], NFC: [0xFDC0], NFD: [0xFDC0], NFKC: [0x0645, 0x062C, 0x064A], NFKD: [0x0645, 0x062C, 0x064A] }, +{ source: [0xFDC1], NFC: [0xFDC1], NFD: [0xFDC1], NFKC: [0x0641, 0x0645, 0x064A], NFKD: [0x0641, 0x0645, 0x064A] }, +{ source: [0xFDC2], NFC: [0xFDC2], NFD: [0xFDC2], NFKC: [0x0628, 0x062D, 0x064A], NFKD: [0x0628, 0x062D, 0x064A] }, +{ source: [0xFDC3], NFC: [0xFDC3], NFD: [0xFDC3], NFKC: [0x0643, 0x0645, 0x0645], NFKD: [0x0643, 0x0645, 0x0645] }, +{ source: [0xFDC4], NFC: [0xFDC4], NFD: [0xFDC4], NFKC: [0x0639, 0x062C, 0x0645], NFKD: [0x0639, 0x062C, 0x0645] }, +{ source: [0xFDC5], NFC: [0xFDC5], NFD: [0xFDC5], NFKC: [0x0635, 0x0645, 0x0645], NFKD: [0x0635, 0x0645, 0x0645] }, +{ source: [0xFDC6], NFC: [0xFDC6], NFD: [0xFDC6], NFKC: [0x0633, 0x062E, 0x064A], NFKD: [0x0633, 0x062E, 0x064A] }, +{ source: [0xFDC7], NFC: [0xFDC7], NFD: [0xFDC7], NFKC: [0x0646, 0x062C, 0x064A], NFKD: [0x0646, 0x062C, 0x064A] }, +{ source: [0xFDF0], NFC: [0xFDF0], NFD: [0xFDF0], NFKC: [0x0635, 0x0644, 0x06D2], NFKD: [0x0635, 0x0644, 0x06D2] }, +{ source: [0xFDF1], NFC: [0xFDF1], NFD: [0xFDF1], NFKC: [0x0642, 0x0644, 0x06D2], NFKD: [0x0642, 0x0644, 0x06D2] }, +{ source: [0xFDF2], NFC: [0xFDF2], NFD: [0xFDF2], NFKC: [0x0627, 0x0644, 0x0644, 0x0647], NFKD: [0x0627, 0x0644, 0x0644, 0x0647] }, +{ source: [0xFDF3], NFC: [0xFDF3], NFD: [0xFDF3], NFKC: [0x0627, 0x0643, 0x0628, 0x0631], NFKD: [0x0627, 0x0643, 0x0628, 0x0631] }, +{ source: [0xFDF4], NFC: [0xFDF4], NFD: [0xFDF4], NFKC: [0x0645, 0x062D, 0x0645, 0x062F], NFKD: [0x0645, 0x062D, 0x0645, 0x062F] }, +{ source: [0xFDF5], NFC: [0xFDF5], NFD: [0xFDF5], NFKC: [0x0635, 0x0644, 0x0639, 0x0645], NFKD: [0x0635, 0x0644, 0x0639, 0x0645] }, +{ source: [0xFDF6], NFC: [0xFDF6], NFD: [0xFDF6], NFKC: [0x0631, 0x0633, 0x0648, 0x0644], NFKD: [0x0631, 0x0633, 0x0648, 0x0644] }, +{ source: [0xFDF7], NFC: [0xFDF7], NFD: [0xFDF7], NFKC: [0x0639, 0x0644, 0x064A, 0x0647], NFKD: [0x0639, 0x0644, 0x064A, 0x0647] }, +{ source: [0xFDF8], NFC: [0xFDF8], NFD: [0xFDF8], NFKC: [0x0648, 0x0633, 0x0644, 0x0645], NFKD: [0x0648, 0x0633, 0x0644, 0x0645] }, +{ source: [0xFDF9], NFC: [0xFDF9], NFD: [0xFDF9], NFKC: [0x0635, 0x0644, 0x0649], NFKD: [0x0635, 0x0644, 0x0649] }, +{ source: [0xFDFA], NFC: [0xFDFA], NFD: [0xFDFA], NFKC: [0x0635, 0x0644, 0x0649, 0x0020, 0x0627, 0x0644, 0x0644, 0x0647, 0x0020, 0x0639, 0x0644, 0x064A, 0x0647, 0x0020, 0x0648, 0x0633, 0x0644, 0x0645], NFKD: [0x0635, 0x0644, 0x0649, 0x0020, 0x0627, 0x0644, 0x0644, 0x0647, 0x0020, 0x0639, 0x0644, 0x064A, 0x0647, 0x0020, 0x0648, 0x0633, 0x0644, 0x0645] }, +{ source: [0xFDFB], NFC: [0xFDFB], NFD: [0xFDFB], NFKC: [0x062C, 0x0644, 0x0020, 0x062C, 0x0644, 0x0627, 0x0644, 0x0647], NFKD: [0x062C, 0x0644, 0x0020, 0x062C, 0x0644, 0x0627, 0x0644, 0x0647] }, +{ source: [0xFDFC], NFC: [0xFDFC], NFD: [0xFDFC], NFKC: [0x0631, 0x06CC, 0x0627, 0x0644], NFKD: [0x0631, 0x06CC, 0x0627, 0x0644] }, +{ source: [0xFE10], NFC: [0xFE10], NFD: [0xFE10], NFKC: [0x002C], NFKD: [0x002C] }, +{ source: [0xFE11], NFC: [0xFE11], NFD: [0xFE11], NFKC: [0x3001], NFKD: [0x3001] }, +{ source: [0xFE12], NFC: [0xFE12], NFD: [0xFE12], NFKC: [0x3002], NFKD: [0x3002] }, +{ source: [0xFE13], NFC: [0xFE13], NFD: [0xFE13], NFKC: [0x003A], NFKD: [0x003A] }, +{ source: [0xFE14], NFC: [0xFE14], NFD: [0xFE14], NFKC: [0x003B], NFKD: [0x003B] }, +{ source: [0xFE15], NFC: [0xFE15], NFD: [0xFE15], NFKC: [0x0021], NFKD: [0x0021] }, +{ source: [0xFE16], NFC: [0xFE16], NFD: [0xFE16], NFKC: [0x003F], NFKD: [0x003F] }, +{ source: [0xFE17], NFC: [0xFE17], NFD: [0xFE17], NFKC: [0x3016], NFKD: [0x3016] }, +{ source: [0xFE18], NFC: [0xFE18], NFD: [0xFE18], NFKC: [0x3017], NFKD: [0x3017] }, +{ source: [0xFE19], NFC: [0xFE19], NFD: [0xFE19], NFKC: [0x002E, 0x002E, 0x002E], NFKD: [0x002E, 0x002E, 0x002E] }, +{ source: [0xFE30], NFC: [0xFE30], NFD: [0xFE30], NFKC: [0x002E, 0x002E], NFKD: [0x002E, 0x002E] }, +{ source: [0xFE31], NFC: [0xFE31], NFD: [0xFE31], NFKC: [0x2014], NFKD: [0x2014] }, +{ source: [0xFE32], NFC: [0xFE32], NFD: [0xFE32], NFKC: [0x2013], NFKD: [0x2013] }, +{ source: [0xFE33], NFC: [0xFE33], NFD: [0xFE33], NFKC: [0x005F], NFKD: [0x005F] }, +{ source: [0xFE34], NFC: [0xFE34], NFD: [0xFE34], NFKC: [0x005F], NFKD: [0x005F] }, +{ source: [0xFE35], NFC: [0xFE35], NFD: [0xFE35], NFKC: [0x0028], NFKD: [0x0028] }, +{ source: [0xFE36], NFC: [0xFE36], NFD: [0xFE36], NFKC: [0x0029], NFKD: [0x0029] }, +{ source: [0xFE37], NFC: [0xFE37], NFD: [0xFE37], NFKC: [0x007B], NFKD: [0x007B] }, +{ source: [0xFE38], NFC: [0xFE38], NFD: [0xFE38], NFKC: [0x007D], NFKD: [0x007D] }, +{ source: [0xFE39], NFC: [0xFE39], NFD: [0xFE39], NFKC: [0x3014], NFKD: [0x3014] }, +{ source: [0xFE3A], NFC: [0xFE3A], NFD: [0xFE3A], NFKC: [0x3015], NFKD: [0x3015] }, +{ source: [0xFE3B], NFC: [0xFE3B], NFD: [0xFE3B], NFKC: [0x3010], NFKD: [0x3010] }, +{ source: [0xFE3C], NFC: [0xFE3C], NFD: [0xFE3C], NFKC: [0x3011], NFKD: [0x3011] }, +{ source: [0xFE3D], NFC: [0xFE3D], NFD: [0xFE3D], NFKC: [0x300A], NFKD: [0x300A] }, +{ source: [0xFE3E], NFC: [0xFE3E], NFD: [0xFE3E], NFKC: [0x300B], NFKD: [0x300B] }, +{ source: [0xFE3F], NFC: [0xFE3F], NFD: [0xFE3F], NFKC: [0x3008], NFKD: [0x3008] }, +{ source: [0xFE40], NFC: [0xFE40], NFD: [0xFE40], NFKC: [0x3009], NFKD: [0x3009] }, +{ source: [0xFE41], NFC: [0xFE41], NFD: [0xFE41], NFKC: [0x300C], NFKD: [0x300C] }, +{ source: [0xFE42], NFC: [0xFE42], NFD: [0xFE42], NFKC: [0x300D], NFKD: [0x300D] }, +{ source: [0xFE43], NFC: [0xFE43], NFD: [0xFE43], NFKC: [0x300E], NFKD: [0x300E] }, +{ source: [0xFE44], NFC: [0xFE44], NFD: [0xFE44], NFKC: [0x300F], NFKD: [0x300F] }, +{ source: [0xFE47], NFC: [0xFE47], NFD: [0xFE47], NFKC: [0x005B], NFKD: [0x005B] }, +{ source: [0xFE48], NFC: [0xFE48], NFD: [0xFE48], NFKC: [0x005D], NFKD: [0x005D] }, +{ source: [0xFE49], NFC: [0xFE49], NFD: [0xFE49], NFKC: [0x0020, 0x0305], NFKD: [0x0020, 0x0305] }, +{ source: [0xFE4A], NFC: [0xFE4A], NFD: [0xFE4A], NFKC: [0x0020, 0x0305], NFKD: [0x0020, 0x0305] }, +{ source: [0xFE4B], NFC: [0xFE4B], NFD: [0xFE4B], NFKC: [0x0020, 0x0305], NFKD: [0x0020, 0x0305] }, +{ source: [0xFE4C], NFC: [0xFE4C], NFD: [0xFE4C], NFKC: [0x0020, 0x0305], NFKD: [0x0020, 0x0305] }, +{ source: [0xFE4D], NFC: [0xFE4D], NFD: [0xFE4D], NFKC: [0x005F], NFKD: [0x005F] }, +{ source: [0xFE4E], NFC: [0xFE4E], NFD: [0xFE4E], NFKC: [0x005F], NFKD: [0x005F] }, +{ source: [0xFE4F], NFC: [0xFE4F], NFD: [0xFE4F], NFKC: [0x005F], NFKD: [0x005F] }, +{ source: [0xFE50], NFC: [0xFE50], NFD: [0xFE50], NFKC: [0x002C], NFKD: [0x002C] }, +{ source: [0xFE51], NFC: [0xFE51], NFD: [0xFE51], NFKC: [0x3001], NFKD: [0x3001] }, +{ source: [0xFE52], NFC: [0xFE52], NFD: [0xFE52], NFKC: [0x002E], NFKD: [0x002E] }, +{ source: [0xFE54], NFC: [0xFE54], NFD: [0xFE54], NFKC: [0x003B], NFKD: [0x003B] }, +{ source: [0xFE55], NFC: [0xFE55], NFD: [0xFE55], NFKC: [0x003A], NFKD: [0x003A] }, +{ source: [0xFE56], NFC: [0xFE56], NFD: [0xFE56], NFKC: [0x003F], NFKD: [0x003F] }, +{ source: [0xFE57], NFC: [0xFE57], NFD: [0xFE57], NFKC: [0x0021], NFKD: [0x0021] }, +{ source: [0xFE58], NFC: [0xFE58], NFD: [0xFE58], NFKC: [0x2014], NFKD: [0x2014] }, +{ source: [0xFE59], NFC: [0xFE59], NFD: [0xFE59], NFKC: [0x0028], NFKD: [0x0028] }, +{ source: [0xFE5A], NFC: [0xFE5A], NFD: [0xFE5A], NFKC: [0x0029], NFKD: [0x0029] }, +{ source: [0xFE5B], NFC: [0xFE5B], NFD: [0xFE5B], NFKC: [0x007B], NFKD: [0x007B] }, +{ source: [0xFE5C], NFC: [0xFE5C], NFD: [0xFE5C], NFKC: [0x007D], NFKD: [0x007D] }, +{ source: [0xFE5D], NFC: [0xFE5D], NFD: [0xFE5D], NFKC: [0x3014], NFKD: [0x3014] }, +{ source: [0xFE5E], NFC: [0xFE5E], NFD: [0xFE5E], NFKC: [0x3015], NFKD: [0x3015] }, +{ source: [0xFE5F], NFC: [0xFE5F], NFD: [0xFE5F], NFKC: [0x0023], NFKD: [0x0023] }, +{ source: [0xFE60], NFC: [0xFE60], NFD: [0xFE60], NFKC: [0x0026], NFKD: [0x0026] }, +{ source: [0xFE61], NFC: [0xFE61], NFD: [0xFE61], NFKC: [0x002A], NFKD: [0x002A] }, +{ source: [0xFE62], NFC: [0xFE62], NFD: [0xFE62], NFKC: [0x002B], NFKD: [0x002B] }, +{ source: [0xFE63], NFC: [0xFE63], NFD: [0xFE63], NFKC: [0x002D], NFKD: [0x002D] }, +{ source: [0xFE64], NFC: [0xFE64], NFD: [0xFE64], NFKC: [0x003C], NFKD: [0x003C] }, +{ source: [0xFE65], NFC: [0xFE65], NFD: [0xFE65], NFKC: [0x003E], NFKD: [0x003E] }, +{ source: [0xFE66], NFC: [0xFE66], NFD: [0xFE66], NFKC: [0x003D], NFKD: [0x003D] }, +{ source: [0xFE68], NFC: [0xFE68], NFD: [0xFE68], NFKC: [0x005C], NFKD: [0x005C] }, +{ source: [0xFE69], NFC: [0xFE69], NFD: [0xFE69], NFKC: [0x0024], NFKD: [0x0024] }, +{ source: [0xFE6A], NFC: [0xFE6A], NFD: [0xFE6A], NFKC: [0x0025], NFKD: [0x0025] }, +{ source: [0xFE6B], NFC: [0xFE6B], NFD: [0xFE6B], NFKC: [0x0040], NFKD: [0x0040] }, +{ source: [0xFE70], NFC: [0xFE70], NFD: [0xFE70], NFKC: [0x0020, 0x064B], NFKD: [0x0020, 0x064B] }, +{ source: [0xFE71], NFC: [0xFE71], NFD: [0xFE71], NFKC: [0x0640, 0x064B], NFKD: [0x0640, 0x064B] }, +{ source: [0xFE72], NFC: [0xFE72], NFD: [0xFE72], NFKC: [0x0020, 0x064C], NFKD: [0x0020, 0x064C] }, +{ source: [0xFE74], NFC: [0xFE74], NFD: [0xFE74], NFKC: [0x0020, 0x064D], NFKD: [0x0020, 0x064D] }, +{ source: [0xFE76], NFC: [0xFE76], NFD: [0xFE76], NFKC: [0x0020, 0x064E], NFKD: [0x0020, 0x064E] }, +{ source: [0xFE77], NFC: [0xFE77], NFD: [0xFE77], NFKC: [0x0640, 0x064E], NFKD: [0x0640, 0x064E] }, +{ source: [0xFE78], NFC: [0xFE78], NFD: [0xFE78], NFKC: [0x0020, 0x064F], NFKD: [0x0020, 0x064F] }, +{ source: [0xFE79], NFC: [0xFE79], NFD: [0xFE79], NFKC: [0x0640, 0x064F], NFKD: [0x0640, 0x064F] }, +{ source: [0xFE7A], NFC: [0xFE7A], NFD: [0xFE7A], NFKC: [0x0020, 0x0650], NFKD: [0x0020, 0x0650] }, +{ source: [0xFE7B], NFC: [0xFE7B], NFD: [0xFE7B], NFKC: [0x0640, 0x0650], NFKD: [0x0640, 0x0650] }, +{ source: [0xFE7C], NFC: [0xFE7C], NFD: [0xFE7C], NFKC: [0x0020, 0x0651], NFKD: [0x0020, 0x0651] }, +{ source: [0xFE7D], NFC: [0xFE7D], NFD: [0xFE7D], NFKC: [0x0640, 0x0651], NFKD: [0x0640, 0x0651] }, +{ source: [0xFE7E], NFC: [0xFE7E], NFD: [0xFE7E], NFKC: [0x0020, 0x0652], NFKD: [0x0020, 0x0652] }, +{ source: [0xFE7F], NFC: [0xFE7F], NFD: [0xFE7F], NFKC: [0x0640, 0x0652], NFKD: [0x0640, 0x0652] }, +{ source: [0xFE80], NFC: [0xFE80], NFD: [0xFE80], NFKC: [0x0621], NFKD: [0x0621] }, +{ source: [0xFE81], NFC: [0xFE81], NFD: [0xFE81], NFKC: [0x0622], NFKD: [0x0627, 0x0653] }, +{ source: [0xFE82], NFC: [0xFE82], NFD: [0xFE82], NFKC: [0x0622], NFKD: [0x0627, 0x0653] }, +{ source: [0xFE83], NFC: [0xFE83], NFD: [0xFE83], NFKC: [0x0623], NFKD: [0x0627, 0x0654] }, +{ source: [0xFE84], NFC: [0xFE84], NFD: [0xFE84], NFKC: [0x0623], NFKD: [0x0627, 0x0654] }, +{ source: [0xFE85], NFC: [0xFE85], NFD: [0xFE85], NFKC: [0x0624], NFKD: [0x0648, 0x0654] }, +{ source: [0xFE86], NFC: [0xFE86], NFD: [0xFE86], NFKC: [0x0624], NFKD: [0x0648, 0x0654] }, +{ source: [0xFE87], NFC: [0xFE87], NFD: [0xFE87], NFKC: [0x0625], NFKD: [0x0627, 0x0655] }, +{ source: [0xFE88], NFC: [0xFE88], NFD: [0xFE88], NFKC: [0x0625], NFKD: [0x0627, 0x0655] }, +{ source: [0xFE89], NFC: [0xFE89], NFD: [0xFE89], NFKC: [0x0626], NFKD: [0x064A, 0x0654] }, +{ source: [0xFE8A], NFC: [0xFE8A], NFD: [0xFE8A], NFKC: [0x0626], NFKD: [0x064A, 0x0654] }, +{ source: [0xFE8B], NFC: [0xFE8B], NFD: [0xFE8B], NFKC: [0x0626], NFKD: [0x064A, 0x0654] }, +{ source: [0xFE8C], NFC: [0xFE8C], NFD: [0xFE8C], NFKC: [0x0626], NFKD: [0x064A, 0x0654] }, +{ source: [0xFE8D], NFC: [0xFE8D], NFD: [0xFE8D], NFKC: [0x0627], NFKD: [0x0627] }, +{ source: [0xFE8E], NFC: [0xFE8E], NFD: [0xFE8E], NFKC: [0x0627], NFKD: [0x0627] }, +{ source: [0xFE8F], NFC: [0xFE8F], NFD: [0xFE8F], NFKC: [0x0628], NFKD: [0x0628] }, +{ source: [0xFE90], NFC: [0xFE90], NFD: [0xFE90], NFKC: [0x0628], NFKD: [0x0628] }, +{ source: [0xFE91], NFC: [0xFE91], NFD: [0xFE91], NFKC: [0x0628], NFKD: [0x0628] }, +{ source: [0xFE92], NFC: [0xFE92], NFD: [0xFE92], NFKC: [0x0628], NFKD: [0x0628] }, +{ source: [0xFE93], NFC: [0xFE93], NFD: [0xFE93], NFKC: [0x0629], NFKD: [0x0629] }, +{ source: [0xFE94], NFC: [0xFE94], NFD: [0xFE94], NFKC: [0x0629], NFKD: [0x0629] }, +{ source: [0xFE95], NFC: [0xFE95], NFD: [0xFE95], NFKC: [0x062A], NFKD: [0x062A] }, +{ source: [0xFE96], NFC: [0xFE96], NFD: [0xFE96], NFKC: [0x062A], NFKD: [0x062A] }, +{ source: [0xFE97], NFC: [0xFE97], NFD: [0xFE97], NFKC: [0x062A], NFKD: [0x062A] }, +{ source: [0xFE98], NFC: [0xFE98], NFD: [0xFE98], NFKC: [0x062A], NFKD: [0x062A] }, +{ source: [0xFE99], NFC: [0xFE99], NFD: [0xFE99], NFKC: [0x062B], NFKD: [0x062B] }, +{ source: [0xFE9A], NFC: [0xFE9A], NFD: [0xFE9A], NFKC: [0x062B], NFKD: [0x062B] }, +{ source: [0xFE9B], NFC: [0xFE9B], NFD: [0xFE9B], NFKC: [0x062B], NFKD: [0x062B] }, +{ source: [0xFE9C], NFC: [0xFE9C], NFD: [0xFE9C], NFKC: [0x062B], NFKD: [0x062B] }, +{ source: [0xFE9D], NFC: [0xFE9D], NFD: [0xFE9D], NFKC: [0x062C], NFKD: [0x062C] }, +{ source: [0xFE9E], NFC: [0xFE9E], NFD: [0xFE9E], NFKC: [0x062C], NFKD: [0x062C] }, +{ source: [0xFE9F], NFC: [0xFE9F], NFD: [0xFE9F], NFKC: [0x062C], NFKD: [0x062C] }, +{ source: [0xFEA0], NFC: [0xFEA0], NFD: [0xFEA0], NFKC: [0x062C], NFKD: [0x062C] }, +{ source: [0xFEA1], NFC: [0xFEA1], NFD: [0xFEA1], NFKC: [0x062D], NFKD: [0x062D] }, +{ source: [0xFEA2], NFC: [0xFEA2], NFD: [0xFEA2], NFKC: [0x062D], NFKD: [0x062D] }, +{ source: [0xFEA3], NFC: [0xFEA3], NFD: [0xFEA3], NFKC: [0x062D], NFKD: [0x062D] }, +{ source: [0xFEA4], NFC: [0xFEA4], NFD: [0xFEA4], NFKC: [0x062D], NFKD: [0x062D] }, +{ source: [0xFEA5], NFC: [0xFEA5], NFD: [0xFEA5], NFKC: [0x062E], NFKD: [0x062E] }, +{ source: [0xFEA6], NFC: [0xFEA6], NFD: [0xFEA6], NFKC: [0x062E], NFKD: [0x062E] }, +{ source: [0xFEA7], NFC: [0xFEA7], NFD: [0xFEA7], NFKC: [0x062E], NFKD: [0x062E] }, +{ source: [0xFEA8], NFC: [0xFEA8], NFD: [0xFEA8], NFKC: [0x062E], NFKD: [0x062E] }, +{ source: [0xFEA9], NFC: [0xFEA9], NFD: [0xFEA9], NFKC: [0x062F], NFKD: [0x062F] }, +{ source: [0xFEAA], NFC: [0xFEAA], NFD: [0xFEAA], NFKC: [0x062F], NFKD: [0x062F] }, +{ source: [0xFEAB], NFC: [0xFEAB], NFD: [0xFEAB], NFKC: [0x0630], NFKD: [0x0630] }, +{ source: [0xFEAC], NFC: [0xFEAC], NFD: [0xFEAC], NFKC: [0x0630], NFKD: [0x0630] }, +{ source: [0xFEAD], NFC: [0xFEAD], NFD: [0xFEAD], NFKC: [0x0631], NFKD: [0x0631] }, +{ source: [0xFEAE], NFC: [0xFEAE], NFD: [0xFEAE], NFKC: [0x0631], NFKD: [0x0631] }, +{ source: [0xFEAF], NFC: [0xFEAF], NFD: [0xFEAF], NFKC: [0x0632], NFKD: [0x0632] }, +{ source: [0xFEB0], NFC: [0xFEB0], NFD: [0xFEB0], NFKC: [0x0632], NFKD: [0x0632] }, +{ source: [0xFEB1], NFC: [0xFEB1], NFD: [0xFEB1], NFKC: [0x0633], NFKD: [0x0633] }, +{ source: [0xFEB2], NFC: [0xFEB2], NFD: [0xFEB2], NFKC: [0x0633], NFKD: [0x0633] }, +{ source: [0xFEB3], NFC: [0xFEB3], NFD: [0xFEB3], NFKC: [0x0633], NFKD: [0x0633] }, +{ source: [0xFEB4], NFC: [0xFEB4], NFD: [0xFEB4], NFKC: [0x0633], NFKD: [0x0633] }, +{ source: [0xFEB5], NFC: [0xFEB5], NFD: [0xFEB5], NFKC: [0x0634], NFKD: [0x0634] }, +{ source: [0xFEB6], NFC: [0xFEB6], NFD: [0xFEB6], NFKC: [0x0634], NFKD: [0x0634] }, +{ source: [0xFEB7], NFC: [0xFEB7], NFD: [0xFEB7], NFKC: [0x0634], NFKD: [0x0634] }, +{ source: [0xFEB8], NFC: [0xFEB8], NFD: [0xFEB8], NFKC: [0x0634], NFKD: [0x0634] }, +{ source: [0xFEB9], NFC: [0xFEB9], NFD: [0xFEB9], NFKC: [0x0635], NFKD: [0x0635] }, +{ source: [0xFEBA], NFC: [0xFEBA], NFD: [0xFEBA], NFKC: [0x0635], NFKD: [0x0635] }, +{ source: [0xFEBB], NFC: [0xFEBB], NFD: [0xFEBB], NFKC: [0x0635], NFKD: [0x0635] }, +{ source: [0xFEBC], NFC: [0xFEBC], NFD: [0xFEBC], NFKC: [0x0635], NFKD: [0x0635] }, +{ source: [0xFEBD], NFC: [0xFEBD], NFD: [0xFEBD], NFKC: [0x0636], NFKD: [0x0636] }, +{ source: [0xFEBE], NFC: [0xFEBE], NFD: [0xFEBE], NFKC: [0x0636], NFKD: [0x0636] }, +{ source: [0xFEBF], NFC: [0xFEBF], NFD: [0xFEBF], NFKC: [0x0636], NFKD: [0x0636] }, +{ source: [0xFEC0], NFC: [0xFEC0], NFD: [0xFEC0], NFKC: [0x0636], NFKD: [0x0636] }, +{ source: [0xFEC1], NFC: [0xFEC1], NFD: [0xFEC1], NFKC: [0x0637], NFKD: [0x0637] }, +{ source: [0xFEC2], NFC: [0xFEC2], NFD: [0xFEC2], NFKC: [0x0637], NFKD: [0x0637] }, +{ source: [0xFEC3], NFC: [0xFEC3], NFD: [0xFEC3], NFKC: [0x0637], NFKD: [0x0637] }, +{ source: [0xFEC4], NFC: [0xFEC4], NFD: [0xFEC4], NFKC: [0x0637], NFKD: [0x0637] }, +{ source: [0xFEC5], NFC: [0xFEC5], NFD: [0xFEC5], NFKC: [0x0638], NFKD: [0x0638] }, +{ source: [0xFEC6], NFC: [0xFEC6], NFD: [0xFEC6], NFKC: [0x0638], NFKD: [0x0638] }, +{ source: [0xFEC7], NFC: [0xFEC7], NFD: [0xFEC7], NFKC: [0x0638], NFKD: [0x0638] }, +{ source: [0xFEC8], NFC: [0xFEC8], NFD: [0xFEC8], NFKC: [0x0638], NFKD: [0x0638] }, +{ source: [0xFEC9], NFC: [0xFEC9], NFD: [0xFEC9], NFKC: [0x0639], NFKD: [0x0639] }, +{ source: [0xFECA], NFC: [0xFECA], NFD: [0xFECA], NFKC: [0x0639], NFKD: [0x0639] }, +{ source: [0xFECB], NFC: [0xFECB], NFD: [0xFECB], NFKC: [0x0639], NFKD: [0x0639] }, +{ source: [0xFECC], NFC: [0xFECC], NFD: [0xFECC], NFKC: [0x0639], NFKD: [0x0639] }, +{ source: [0xFECD], NFC: [0xFECD], NFD: [0xFECD], NFKC: [0x063A], NFKD: [0x063A] }, +{ source: [0xFECE], NFC: [0xFECE], NFD: [0xFECE], NFKC: [0x063A], NFKD: [0x063A] }, +{ source: [0xFECF], NFC: [0xFECF], NFD: [0xFECF], NFKC: [0x063A], NFKD: [0x063A] }, +{ source: [0xFED0], NFC: [0xFED0], NFD: [0xFED0], NFKC: [0x063A], NFKD: [0x063A] }, +{ source: [0xFED1], NFC: [0xFED1], NFD: [0xFED1], NFKC: [0x0641], NFKD: [0x0641] }, +{ source: [0xFED2], NFC: [0xFED2], NFD: [0xFED2], NFKC: [0x0641], NFKD: [0x0641] }, +{ source: [0xFED3], NFC: [0xFED3], NFD: [0xFED3], NFKC: [0x0641], NFKD: [0x0641] }, +{ source: [0xFED4], NFC: [0xFED4], NFD: [0xFED4], NFKC: [0x0641], NFKD: [0x0641] }, +{ source: [0xFED5], NFC: [0xFED5], NFD: [0xFED5], NFKC: [0x0642], NFKD: [0x0642] }, +{ source: [0xFED6], NFC: [0xFED6], NFD: [0xFED6], NFKC: [0x0642], NFKD: [0x0642] }, +{ source: [0xFED7], NFC: [0xFED7], NFD: [0xFED7], NFKC: [0x0642], NFKD: [0x0642] }, +{ source: [0xFED8], NFC: [0xFED8], NFD: [0xFED8], NFKC: [0x0642], NFKD: [0x0642] }, +{ source: [0xFED9], NFC: [0xFED9], NFD: [0xFED9], NFKC: [0x0643], NFKD: [0x0643] }, +{ source: [0xFEDA], NFC: [0xFEDA], NFD: [0xFEDA], NFKC: [0x0643], NFKD: [0x0643] }, +{ source: [0xFEDB], NFC: [0xFEDB], NFD: [0xFEDB], NFKC: [0x0643], NFKD: [0x0643] }, +{ source: [0xFEDC], NFC: [0xFEDC], NFD: [0xFEDC], NFKC: [0x0643], NFKD: [0x0643] }, +{ source: [0xFEDD], NFC: [0xFEDD], NFD: [0xFEDD], NFKC: [0x0644], NFKD: [0x0644] }, +{ source: [0xFEDE], NFC: [0xFEDE], NFD: [0xFEDE], NFKC: [0x0644], NFKD: [0x0644] }, +{ source: [0xFEDF], NFC: [0xFEDF], NFD: [0xFEDF], NFKC: [0x0644], NFKD: [0x0644] }, +{ source: [0xFEE0], NFC: [0xFEE0], NFD: [0xFEE0], NFKC: [0x0644], NFKD: [0x0644] }, +{ source: [0xFEE1], NFC: [0xFEE1], NFD: [0xFEE1], NFKC: [0x0645], NFKD: [0x0645] }, +{ source: [0xFEE2], NFC: [0xFEE2], NFD: [0xFEE2], NFKC: [0x0645], NFKD: [0x0645] }, +{ source: [0xFEE3], NFC: [0xFEE3], NFD: [0xFEE3], NFKC: [0x0645], NFKD: [0x0645] }, +{ source: [0xFEE4], NFC: [0xFEE4], NFD: [0xFEE4], NFKC: [0x0645], NFKD: [0x0645] }, +{ source: [0xFEE5], NFC: [0xFEE5], NFD: [0xFEE5], NFKC: [0x0646], NFKD: [0x0646] }, +{ source: [0xFEE6], NFC: [0xFEE6], NFD: [0xFEE6], NFKC: [0x0646], NFKD: [0x0646] }, +{ source: [0xFEE7], NFC: [0xFEE7], NFD: [0xFEE7], NFKC: [0x0646], NFKD: [0x0646] }, +{ source: [0xFEE8], NFC: [0xFEE8], NFD: [0xFEE8], NFKC: [0x0646], NFKD: [0x0646] }, +{ source: [0xFEE9], NFC: [0xFEE9], NFD: [0xFEE9], NFKC: [0x0647], NFKD: [0x0647] }, +{ source: [0xFEEA], NFC: [0xFEEA], NFD: [0xFEEA], NFKC: [0x0647], NFKD: [0x0647] }, +{ source: [0xFEEB], NFC: [0xFEEB], NFD: [0xFEEB], NFKC: [0x0647], NFKD: [0x0647] }, +{ source: [0xFEEC], NFC: [0xFEEC], NFD: [0xFEEC], NFKC: [0x0647], NFKD: [0x0647] }, +{ source: [0xFEED], NFC: [0xFEED], NFD: [0xFEED], NFKC: [0x0648], NFKD: [0x0648] }, +{ source: [0xFEEE], NFC: [0xFEEE], NFD: [0xFEEE], NFKC: [0x0648], NFKD: [0x0648] }, +{ source: [0xFEEF], NFC: [0xFEEF], NFD: [0xFEEF], NFKC: [0x0649], NFKD: [0x0649] }, +{ source: [0xFEF0], NFC: [0xFEF0], NFD: [0xFEF0], NFKC: [0x0649], NFKD: [0x0649] }, +{ source: [0xFEF1], NFC: [0xFEF1], NFD: [0xFEF1], NFKC: [0x064A], NFKD: [0x064A] }, +{ source: [0xFEF2], NFC: [0xFEF2], NFD: [0xFEF2], NFKC: [0x064A], NFKD: [0x064A] }, +{ source: [0xFEF3], NFC: [0xFEF3], NFD: [0xFEF3], NFKC: [0x064A], NFKD: [0x064A] }, +{ source: [0xFEF4], NFC: [0xFEF4], NFD: [0xFEF4], NFKC: [0x064A], NFKD: [0x064A] }, +{ source: [0xFEF5], NFC: [0xFEF5], NFD: [0xFEF5], NFKC: [0x0644, 0x0622], NFKD: [0x0644, 0x0627, 0x0653] }, +{ source: [0xFEF6], NFC: [0xFEF6], NFD: [0xFEF6], NFKC: [0x0644, 0x0622], NFKD: [0x0644, 0x0627, 0x0653] }, +{ source: [0xFEF7], NFC: [0xFEF7], NFD: [0xFEF7], NFKC: [0x0644, 0x0623], NFKD: [0x0644, 0x0627, 0x0654] }, +{ source: [0xFEF8], NFC: [0xFEF8], NFD: [0xFEF8], NFKC: [0x0644, 0x0623], NFKD: [0x0644, 0x0627, 0x0654] }, +{ source: [0xFEF9], NFC: [0xFEF9], NFD: [0xFEF9], NFKC: [0x0644, 0x0625], NFKD: [0x0644, 0x0627, 0x0655] }, +{ source: [0xFEFA], NFC: [0xFEFA], NFD: [0xFEFA], NFKC: [0x0644, 0x0625], NFKD: [0x0644, 0x0627, 0x0655] }, +{ source: [0xFEFB], NFC: [0xFEFB], NFD: [0xFEFB], NFKC: [0x0644, 0x0627], NFKD: [0x0644, 0x0627] }, +{ source: [0xFEFC], NFC: [0xFEFC], NFD: [0xFEFC], NFKC: [0x0644, 0x0627], NFKD: [0x0644, 0x0627] }, +{ source: [0xFF01], NFC: [0xFF01], NFD: [0xFF01], NFKC: [0x0021], NFKD: [0x0021] }, +{ source: [0xFF02], NFC: [0xFF02], NFD: [0xFF02], NFKC: [0x0022], NFKD: [0x0022] }, +{ source: [0xFF03], NFC: [0xFF03], NFD: [0xFF03], NFKC: [0x0023], NFKD: [0x0023] }, +{ source: [0xFF04], NFC: [0xFF04], NFD: [0xFF04], NFKC: [0x0024], NFKD: [0x0024] }, +{ source: [0xFF05], NFC: [0xFF05], NFD: [0xFF05], NFKC: [0x0025], NFKD: [0x0025] }, +{ source: [0xFF06], NFC: [0xFF06], NFD: [0xFF06], NFKC: [0x0026], NFKD: [0x0026] }, +{ source: [0xFF07], NFC: [0xFF07], NFD: [0xFF07], NFKC: [0x0027], NFKD: [0x0027] }, +{ source: [0xFF08], NFC: [0xFF08], NFD: [0xFF08], NFKC: [0x0028], NFKD: [0x0028] }, +{ source: [0xFF09], NFC: [0xFF09], NFD: [0xFF09], NFKC: [0x0029], NFKD: [0x0029] }, +{ source: [0xFF0A], NFC: [0xFF0A], NFD: [0xFF0A], NFKC: [0x002A], NFKD: [0x002A] }, +{ source: [0xFF0B], NFC: [0xFF0B], NFD: [0xFF0B], NFKC: [0x002B], NFKD: [0x002B] }, +{ source: [0xFF0C], NFC: [0xFF0C], NFD: [0xFF0C], NFKC: [0x002C], NFKD: [0x002C] }, +{ source: [0xFF0D], NFC: [0xFF0D], NFD: [0xFF0D], NFKC: [0x002D], NFKD: [0x002D] }, +{ source: [0xFF0E], NFC: [0xFF0E], NFD: [0xFF0E], NFKC: [0x002E], NFKD: [0x002E] }, +{ source: [0xFF0F], NFC: [0xFF0F], NFD: [0xFF0F], NFKC: [0x002F], NFKD: [0x002F] }, +{ source: [0xFF10], NFC: [0xFF10], NFD: [0xFF10], NFKC: [0x0030], NFKD: [0x0030] }, +{ source: [0xFF11], NFC: [0xFF11], NFD: [0xFF11], NFKC: [0x0031], NFKD: [0x0031] }, +{ source: [0xFF12], NFC: [0xFF12], NFD: [0xFF12], NFKC: [0x0032], NFKD: [0x0032] }, +{ source: [0xFF13], NFC: [0xFF13], NFD: [0xFF13], NFKC: [0x0033], NFKD: [0x0033] }, +{ source: [0xFF14], NFC: [0xFF14], NFD: [0xFF14], NFKC: [0x0034], NFKD: [0x0034] }, +{ source: [0xFF15], NFC: [0xFF15], NFD: [0xFF15], NFKC: [0x0035], NFKD: [0x0035] }, +{ source: [0xFF16], NFC: [0xFF16], NFD: [0xFF16], NFKC: [0x0036], NFKD: [0x0036] }, +{ source: [0xFF17], NFC: [0xFF17], NFD: [0xFF17], NFKC: [0x0037], NFKD: [0x0037] }, +{ source: [0xFF18], NFC: [0xFF18], NFD: [0xFF18], NFKC: [0x0038], NFKD: [0x0038] }, +{ source: [0xFF19], NFC: [0xFF19], NFD: [0xFF19], NFKC: [0x0039], NFKD: [0x0039] }, +{ source: [0xFF1A], NFC: [0xFF1A], NFD: [0xFF1A], NFKC: [0x003A], NFKD: [0x003A] }, +{ source: [0xFF1B], NFC: [0xFF1B], NFD: [0xFF1B], NFKC: [0x003B], NFKD: [0x003B] }, +{ source: [0xFF1C], NFC: [0xFF1C], NFD: [0xFF1C], NFKC: [0x003C], NFKD: [0x003C] }, +{ source: [0xFF1D], NFC: [0xFF1D], NFD: [0xFF1D], NFKC: [0x003D], NFKD: [0x003D] }, +{ source: [0xFF1E], NFC: [0xFF1E], NFD: [0xFF1E], NFKC: [0x003E], NFKD: [0x003E] }, +{ source: [0xFF1F], NFC: [0xFF1F], NFD: [0xFF1F], NFKC: [0x003F], NFKD: [0x003F] }, +{ source: [0xFF20], NFC: [0xFF20], NFD: [0xFF20], NFKC: [0x0040], NFKD: [0x0040] }, +{ source: [0xFF21], NFC: [0xFF21], NFD: [0xFF21], NFKC: [0x0041], NFKD: [0x0041] }, +{ source: [0xFF22], NFC: [0xFF22], NFD: [0xFF22], NFKC: [0x0042], NFKD: [0x0042] }, +{ source: [0xFF23], NFC: [0xFF23], NFD: [0xFF23], NFKC: [0x0043], NFKD: [0x0043] }, +{ source: [0xFF24], NFC: [0xFF24], NFD: [0xFF24], NFKC: [0x0044], NFKD: [0x0044] }, +{ source: [0xFF25], NFC: [0xFF25], NFD: [0xFF25], NFKC: [0x0045], NFKD: [0x0045] }, +{ source: [0xFF26], NFC: [0xFF26], NFD: [0xFF26], NFKC: [0x0046], NFKD: [0x0046] }, +{ source: [0xFF27], NFC: [0xFF27], NFD: [0xFF27], NFKC: [0x0047], NFKD: [0x0047] }, +{ source: [0xFF28], NFC: [0xFF28], NFD: [0xFF28], NFKC: [0x0048], NFKD: [0x0048] }, +{ source: [0xFF29], NFC: [0xFF29], NFD: [0xFF29], NFKC: [0x0049], NFKD: [0x0049] }, +{ source: [0xFF2A], NFC: [0xFF2A], NFD: [0xFF2A], NFKC: [0x004A], NFKD: [0x004A] }, +{ source: [0xFF2B], NFC: [0xFF2B], NFD: [0xFF2B], NFKC: [0x004B], NFKD: [0x004B] }, +{ source: [0xFF2C], NFC: [0xFF2C], NFD: [0xFF2C], NFKC: [0x004C], NFKD: [0x004C] }, +{ source: [0xFF2D], NFC: [0xFF2D], NFD: [0xFF2D], NFKC: [0x004D], NFKD: [0x004D] }, +{ source: [0xFF2E], NFC: [0xFF2E], NFD: [0xFF2E], NFKC: [0x004E], NFKD: [0x004E] }, +{ source: [0xFF2F], NFC: [0xFF2F], NFD: [0xFF2F], NFKC: [0x004F], NFKD: [0x004F] }, +{ source: [0xFF30], NFC: [0xFF30], NFD: [0xFF30], NFKC: [0x0050], NFKD: [0x0050] }, +{ source: [0xFF31], NFC: [0xFF31], NFD: [0xFF31], NFKC: [0x0051], NFKD: [0x0051] }, +{ source: [0xFF32], NFC: [0xFF32], NFD: [0xFF32], NFKC: [0x0052], NFKD: [0x0052] }, +{ source: [0xFF33], NFC: [0xFF33], NFD: [0xFF33], NFKC: [0x0053], NFKD: [0x0053] }, +{ source: [0xFF34], NFC: [0xFF34], NFD: [0xFF34], NFKC: [0x0054], NFKD: [0x0054] }, +{ source: [0xFF35], NFC: [0xFF35], NFD: [0xFF35], NFKC: [0x0055], NFKD: [0x0055] }, +{ source: [0xFF36], NFC: [0xFF36], NFD: [0xFF36], NFKC: [0x0056], NFKD: [0x0056] }, +{ source: [0xFF37], NFC: [0xFF37], NFD: [0xFF37], NFKC: [0x0057], NFKD: [0x0057] }, +{ source: [0xFF38], NFC: [0xFF38], NFD: [0xFF38], NFKC: [0x0058], NFKD: [0x0058] }, +{ source: [0xFF39], NFC: [0xFF39], NFD: [0xFF39], NFKC: [0x0059], NFKD: [0x0059] }, +{ source: [0xFF3A], NFC: [0xFF3A], NFD: [0xFF3A], NFKC: [0x005A], NFKD: [0x005A] }, +{ source: [0xFF3B], NFC: [0xFF3B], NFD: [0xFF3B], NFKC: [0x005B], NFKD: [0x005B] }, +{ source: [0xFF3C], NFC: [0xFF3C], NFD: [0xFF3C], NFKC: [0x005C], NFKD: [0x005C] }, +{ source: [0xFF3D], NFC: [0xFF3D], NFD: [0xFF3D], NFKC: [0x005D], NFKD: [0x005D] }, +{ source: [0xFF3E], NFC: [0xFF3E], NFD: [0xFF3E], NFKC: [0x005E], NFKD: [0x005E] }, +{ source: [0xFF3F], NFC: [0xFF3F], NFD: [0xFF3F], NFKC: [0x005F], NFKD: [0x005F] }, +{ source: [0xFF40], NFC: [0xFF40], NFD: [0xFF40], NFKC: [0x0060], NFKD: [0x0060] }, +{ source: [0xFF41], NFC: [0xFF41], NFD: [0xFF41], NFKC: [0x0061], NFKD: [0x0061] }, +{ source: [0xFF42], NFC: [0xFF42], NFD: [0xFF42], NFKC: [0x0062], NFKD: [0x0062] }, +{ source: [0xFF43], NFC: [0xFF43], NFD: [0xFF43], NFKC: [0x0063], NFKD: [0x0063] }, +{ source: [0xFF44], NFC: [0xFF44], NFD: [0xFF44], NFKC: [0x0064], NFKD: [0x0064] }, +{ source: [0xFF45], NFC: [0xFF45], NFD: [0xFF45], NFKC: [0x0065], NFKD: [0x0065] }, +{ source: [0xFF46], NFC: [0xFF46], NFD: [0xFF46], NFKC: [0x0066], NFKD: [0x0066] }, +{ source: [0xFF47], NFC: [0xFF47], NFD: [0xFF47], NFKC: [0x0067], NFKD: [0x0067] }, +{ source: [0xFF48], NFC: [0xFF48], NFD: [0xFF48], NFKC: [0x0068], NFKD: [0x0068] }, +{ source: [0xFF49], NFC: [0xFF49], NFD: [0xFF49], NFKC: [0x0069], NFKD: [0x0069] }, +{ source: [0xFF4A], NFC: [0xFF4A], NFD: [0xFF4A], NFKC: [0x006A], NFKD: [0x006A] }, +{ source: [0xFF4B], NFC: [0xFF4B], NFD: [0xFF4B], NFKC: [0x006B], NFKD: [0x006B] }, +{ source: [0xFF4C], NFC: [0xFF4C], NFD: [0xFF4C], NFKC: [0x006C], NFKD: [0x006C] }, +{ source: [0xFF4D], NFC: [0xFF4D], NFD: [0xFF4D], NFKC: [0x006D], NFKD: [0x006D] }, +{ source: [0xFF4E], NFC: [0xFF4E], NFD: [0xFF4E], NFKC: [0x006E], NFKD: [0x006E] }, +{ source: [0xFF4F], NFC: [0xFF4F], NFD: [0xFF4F], NFKC: [0x006F], NFKD: [0x006F] }, +{ source: [0xFF50], NFC: [0xFF50], NFD: [0xFF50], NFKC: [0x0070], NFKD: [0x0070] }, +{ source: [0xFF51], NFC: [0xFF51], NFD: [0xFF51], NFKC: [0x0071], NFKD: [0x0071] }, +{ source: [0xFF52], NFC: [0xFF52], NFD: [0xFF52], NFKC: [0x0072], NFKD: [0x0072] }, +{ source: [0xFF53], NFC: [0xFF53], NFD: [0xFF53], NFKC: [0x0073], NFKD: [0x0073] }, +{ source: [0xFF54], NFC: [0xFF54], NFD: [0xFF54], NFKC: [0x0074], NFKD: [0x0074] }, +{ source: [0xFF55], NFC: [0xFF55], NFD: [0xFF55], NFKC: [0x0075], NFKD: [0x0075] }, +{ source: [0xFF56], NFC: [0xFF56], NFD: [0xFF56], NFKC: [0x0076], NFKD: [0x0076] }, +{ source: [0xFF57], NFC: [0xFF57], NFD: [0xFF57], NFKC: [0x0077], NFKD: [0x0077] }, +{ source: [0xFF58], NFC: [0xFF58], NFD: [0xFF58], NFKC: [0x0078], NFKD: [0x0078] }, +{ source: [0xFF59], NFC: [0xFF59], NFD: [0xFF59], NFKC: [0x0079], NFKD: [0x0079] }, +{ source: [0xFF5A], NFC: [0xFF5A], NFD: [0xFF5A], NFKC: [0x007A], NFKD: [0x007A] }, +{ source: [0xFF5B], NFC: [0xFF5B], NFD: [0xFF5B], NFKC: [0x007B], NFKD: [0x007B] }, +{ source: [0xFF5C], NFC: [0xFF5C], NFD: [0xFF5C], NFKC: [0x007C], NFKD: [0x007C] }, +{ source: [0xFF5D], NFC: [0xFF5D], NFD: [0xFF5D], NFKC: [0x007D], NFKD: [0x007D] }, +{ source: [0xFF5E], NFC: [0xFF5E], NFD: [0xFF5E], NFKC: [0x007E], NFKD: [0x007E] }, +{ source: [0xFF5F], NFC: [0xFF5F], NFD: [0xFF5F], NFKC: [0x2985], NFKD: [0x2985] }, +{ source: [0xFF60], NFC: [0xFF60], NFD: [0xFF60], NFKC: [0x2986], NFKD: [0x2986] }, +{ source: [0xFF61], NFC: [0xFF61], NFD: [0xFF61], NFKC: [0x3002], NFKD: [0x3002] }, +{ source: [0xFF62], NFC: [0xFF62], NFD: [0xFF62], NFKC: [0x300C], NFKD: [0x300C] }, +{ source: [0xFF63], NFC: [0xFF63], NFD: [0xFF63], NFKC: [0x300D], NFKD: [0x300D] }, +{ source: [0xFF64], NFC: [0xFF64], NFD: [0xFF64], NFKC: [0x3001], NFKD: [0x3001] }, +{ source: [0xFF65], NFC: [0xFF65], NFD: [0xFF65], NFKC: [0x30FB], NFKD: [0x30FB] }, +{ source: [0xFF66], NFC: [0xFF66], NFD: [0xFF66], NFKC: [0x30F2], NFKD: [0x30F2] }, +{ source: [0xFF67], NFC: [0xFF67], NFD: [0xFF67], NFKC: [0x30A1], NFKD: [0x30A1] }, +{ source: [0xFF68], NFC: [0xFF68], NFD: [0xFF68], NFKC: [0x30A3], NFKD: [0x30A3] }, +{ source: [0xFF69], NFC: [0xFF69], NFD: [0xFF69], NFKC: [0x30A5], NFKD: [0x30A5] }, +{ source: [0xFF6A], NFC: [0xFF6A], NFD: [0xFF6A], NFKC: [0x30A7], NFKD: [0x30A7] }, +{ source: [0xFF6B], NFC: [0xFF6B], NFD: [0xFF6B], NFKC: [0x30A9], NFKD: [0x30A9] }, +{ source: [0xFF6C], NFC: [0xFF6C], NFD: [0xFF6C], NFKC: [0x30E3], NFKD: [0x30E3] }, +{ source: [0xFF6D], NFC: [0xFF6D], NFD: [0xFF6D], NFKC: [0x30E5], NFKD: [0x30E5] }, +{ source: [0xFF6E], NFC: [0xFF6E], NFD: [0xFF6E], NFKC: [0x30E7], NFKD: [0x30E7] }, +{ source: [0xFF6F], NFC: [0xFF6F], NFD: [0xFF6F], NFKC: [0x30C3], NFKD: [0x30C3] }, +{ source: [0xFF70], NFC: [0xFF70], NFD: [0xFF70], NFKC: [0x30FC], NFKD: [0x30FC] }, +{ source: [0xFF71], NFC: [0xFF71], NFD: [0xFF71], NFKC: [0x30A2], NFKD: [0x30A2] }, +{ source: [0xFF72], NFC: [0xFF72], NFD: [0xFF72], NFKC: [0x30A4], NFKD: [0x30A4] }, +{ source: [0xFF73], NFC: [0xFF73], NFD: [0xFF73], NFKC: [0x30A6], NFKD: [0x30A6] }, +{ source: [0xFF74], NFC: [0xFF74], NFD: [0xFF74], NFKC: [0x30A8], NFKD: [0x30A8] }, +{ source: [0xFF75], NFC: [0xFF75], NFD: [0xFF75], NFKC: [0x30AA], NFKD: [0x30AA] }, +{ source: [0xFF76], NFC: [0xFF76], NFD: [0xFF76], NFKC: [0x30AB], NFKD: [0x30AB] }, +{ source: [0xFF77], NFC: [0xFF77], NFD: [0xFF77], NFKC: [0x30AD], NFKD: [0x30AD] }, +{ source: [0xFF78], NFC: [0xFF78], NFD: [0xFF78], NFKC: [0x30AF], NFKD: [0x30AF] }, +{ source: [0xFF79], NFC: [0xFF79], NFD: [0xFF79], NFKC: [0x30B1], NFKD: [0x30B1] }, +{ source: [0xFF7A], NFC: [0xFF7A], NFD: [0xFF7A], NFKC: [0x30B3], NFKD: [0x30B3] }, +{ source: [0xFF7B], NFC: [0xFF7B], NFD: [0xFF7B], NFKC: [0x30B5], NFKD: [0x30B5] }, +{ source: [0xFF7C], NFC: [0xFF7C], NFD: [0xFF7C], NFKC: [0x30B7], NFKD: [0x30B7] }, +{ source: [0xFF7D], NFC: [0xFF7D], NFD: [0xFF7D], NFKC: [0x30B9], NFKD: [0x30B9] }, +{ source: [0xFF7E], NFC: [0xFF7E], NFD: [0xFF7E], NFKC: [0x30BB], NFKD: [0x30BB] }, +{ source: [0xFF7F], NFC: [0xFF7F], NFD: [0xFF7F], NFKC: [0x30BD], NFKD: [0x30BD] }, +{ source: [0xFF80], NFC: [0xFF80], NFD: [0xFF80], NFKC: [0x30BF], NFKD: [0x30BF] }, +{ source: [0xFF81], NFC: [0xFF81], NFD: [0xFF81], NFKC: [0x30C1], NFKD: [0x30C1] }, +{ source: [0xFF82], NFC: [0xFF82], NFD: [0xFF82], NFKC: [0x30C4], NFKD: [0x30C4] }, +{ source: [0xFF83], NFC: [0xFF83], NFD: [0xFF83], NFKC: [0x30C6], NFKD: [0x30C6] }, +{ source: [0xFF84], NFC: [0xFF84], NFD: [0xFF84], NFKC: [0x30C8], NFKD: [0x30C8] }, +{ source: [0xFF85], NFC: [0xFF85], NFD: [0xFF85], NFKC: [0x30CA], NFKD: [0x30CA] }, +{ source: [0xFF86], NFC: [0xFF86], NFD: [0xFF86], NFKC: [0x30CB], NFKD: [0x30CB] }, +{ source: [0xFF87], NFC: [0xFF87], NFD: [0xFF87], NFKC: [0x30CC], NFKD: [0x30CC] }, +{ source: [0xFF88], NFC: [0xFF88], NFD: [0xFF88], NFKC: [0x30CD], NFKD: [0x30CD] }, +{ source: [0xFF89], NFC: [0xFF89], NFD: [0xFF89], NFKC: [0x30CE], NFKD: [0x30CE] }, +{ source: [0xFF8A], NFC: [0xFF8A], NFD: [0xFF8A], NFKC: [0x30CF], NFKD: [0x30CF] }, +{ source: [0xFF8B], NFC: [0xFF8B], NFD: [0xFF8B], NFKC: [0x30D2], NFKD: [0x30D2] }, +{ source: [0xFF8C], NFC: [0xFF8C], NFD: [0xFF8C], NFKC: [0x30D5], NFKD: [0x30D5] }, +{ source: [0xFF8D], NFC: [0xFF8D], NFD: [0xFF8D], NFKC: [0x30D8], NFKD: [0x30D8] }, +{ source: [0xFF8E], NFC: [0xFF8E], NFD: [0xFF8E], NFKC: [0x30DB], NFKD: [0x30DB] }, +{ source: [0xFF8F], NFC: [0xFF8F], NFD: [0xFF8F], NFKC: [0x30DE], NFKD: [0x30DE] }, +{ source: [0xFF90], NFC: [0xFF90], NFD: [0xFF90], NFKC: [0x30DF], NFKD: [0x30DF] }, +{ source: [0xFF91], NFC: [0xFF91], NFD: [0xFF91], NFKC: [0x30E0], NFKD: [0x30E0] }, +{ source: [0xFF92], NFC: [0xFF92], NFD: [0xFF92], NFKC: [0x30E1], NFKD: [0x30E1] }, +{ source: [0xFF93], NFC: [0xFF93], NFD: [0xFF93], NFKC: [0x30E2], NFKD: [0x30E2] }, +{ source: [0xFF94], NFC: [0xFF94], NFD: [0xFF94], NFKC: [0x30E4], NFKD: [0x30E4] }, +{ source: [0xFF95], NFC: [0xFF95], NFD: [0xFF95], NFKC: [0x30E6], NFKD: [0x30E6] }, +{ source: [0xFF96], NFC: [0xFF96], NFD: [0xFF96], NFKC: [0x30E8], NFKD: [0x30E8] }, +{ source: [0xFF97], NFC: [0xFF97], NFD: [0xFF97], NFKC: [0x30E9], NFKD: [0x30E9] }, +{ source: [0xFF98], NFC: [0xFF98], NFD: [0xFF98], NFKC: [0x30EA], NFKD: [0x30EA] }, +{ source: [0xFF99], NFC: [0xFF99], NFD: [0xFF99], NFKC: [0x30EB], NFKD: [0x30EB] }, +{ source: [0xFF9A], NFC: [0xFF9A], NFD: [0xFF9A], NFKC: [0x30EC], NFKD: [0x30EC] }, +{ source: [0xFF9B], NFC: [0xFF9B], NFD: [0xFF9B], NFKC: [0x30ED], NFKD: [0x30ED] }, +{ source: [0xFF9C], NFC: [0xFF9C], NFD: [0xFF9C], NFKC: [0x30EF], NFKD: [0x30EF] }, +{ source: [0xFF9D], NFC: [0xFF9D], NFD: [0xFF9D], NFKC: [0x30F3], NFKD: [0x30F3] }, +{ source: [0xFF9E], NFC: [0xFF9E], NFD: [0xFF9E], NFKC: [0x3099], NFKD: [0x3099] }, +{ source: [0xFF9F], NFC: [0xFF9F], NFD: [0xFF9F], NFKC: [0x309A], NFKD: [0x309A] }, +{ source: [0xFFA0], NFC: [0xFFA0], NFD: [0xFFA0], NFKC: [0x1160], NFKD: [0x1160] }, +{ source: [0xFFA1], NFC: [0xFFA1], NFD: [0xFFA1], NFKC: [0x1100], NFKD: [0x1100] }, +{ source: [0xFFA2], NFC: [0xFFA2], NFD: [0xFFA2], NFKC: [0x1101], NFKD: [0x1101] }, +{ source: [0xFFA3], NFC: [0xFFA3], NFD: [0xFFA3], NFKC: [0x11AA], NFKD: [0x11AA] }, +{ source: [0xFFA4], NFC: [0xFFA4], NFD: [0xFFA4], NFKC: [0x1102], NFKD: [0x1102] }, +{ source: [0xFFA5], NFC: [0xFFA5], NFD: [0xFFA5], NFKC: [0x11AC], NFKD: [0x11AC] }, +{ source: [0xFFA6], NFC: [0xFFA6], NFD: [0xFFA6], NFKC: [0x11AD], NFKD: [0x11AD] }, +{ source: [0xFFA7], NFC: [0xFFA7], NFD: [0xFFA7], NFKC: [0x1103], NFKD: [0x1103] }, +{ source: [0xFFA8], NFC: [0xFFA8], NFD: [0xFFA8], NFKC: [0x1104], NFKD: [0x1104] }, +{ source: [0xFFA9], NFC: [0xFFA9], NFD: [0xFFA9], NFKC: [0x1105], NFKD: [0x1105] }, +{ source: [0xFFAA], NFC: [0xFFAA], NFD: [0xFFAA], NFKC: [0x11B0], NFKD: [0x11B0] }, +{ source: [0xFFAB], NFC: [0xFFAB], NFD: [0xFFAB], NFKC: [0x11B1], NFKD: [0x11B1] }, +{ source: [0xFFAC], NFC: [0xFFAC], NFD: [0xFFAC], NFKC: [0x11B2], NFKD: [0x11B2] }, +{ source: [0xFFAD], NFC: [0xFFAD], NFD: [0xFFAD], NFKC: [0x11B3], NFKD: [0x11B3] }, +{ source: [0xFFAE], NFC: [0xFFAE], NFD: [0xFFAE], NFKC: [0x11B4], NFKD: [0x11B4] }, +{ source: [0xFFAF], NFC: [0xFFAF], NFD: [0xFFAF], NFKC: [0x11B5], NFKD: [0x11B5] }, +{ source: [0xFFB0], NFC: [0xFFB0], NFD: [0xFFB0], NFKC: [0x111A], NFKD: [0x111A] }, +{ source: [0xFFB1], NFC: [0xFFB1], NFD: [0xFFB1], NFKC: [0x1106], NFKD: [0x1106] }, +{ source: [0xFFB2], NFC: [0xFFB2], NFD: [0xFFB2], NFKC: [0x1107], NFKD: [0x1107] }, +{ source: [0xFFB3], NFC: [0xFFB3], NFD: [0xFFB3], NFKC: [0x1108], NFKD: [0x1108] }, +{ source: [0xFFB4], NFC: [0xFFB4], NFD: [0xFFB4], NFKC: [0x1121], NFKD: [0x1121] }, +{ source: [0xFFB5], NFC: [0xFFB5], NFD: [0xFFB5], NFKC: [0x1109], NFKD: [0x1109] }, +{ source: [0xFFB6], NFC: [0xFFB6], NFD: [0xFFB6], NFKC: [0x110A], NFKD: [0x110A] }, +{ source: [0xFFB7], NFC: [0xFFB7], NFD: [0xFFB7], NFKC: [0x110B], NFKD: [0x110B] }, +{ source: [0xFFB8], NFC: [0xFFB8], NFD: [0xFFB8], NFKC: [0x110C], NFKD: [0x110C] }, +{ source: [0xFFB9], NFC: [0xFFB9], NFD: [0xFFB9], NFKC: [0x110D], NFKD: [0x110D] }, +{ source: [0xFFBA], NFC: [0xFFBA], NFD: [0xFFBA], NFKC: [0x110E], NFKD: [0x110E] }, +{ source: [0xFFBB], NFC: [0xFFBB], NFD: [0xFFBB], NFKC: [0x110F], NFKD: [0x110F] }, +{ source: [0xFFBC], NFC: [0xFFBC], NFD: [0xFFBC], NFKC: [0x1110], NFKD: [0x1110] }, +{ source: [0xFFBD], NFC: [0xFFBD], NFD: [0xFFBD], NFKC: [0x1111], NFKD: [0x1111] }, +{ source: [0xFFBE], NFC: [0xFFBE], NFD: [0xFFBE], NFKC: [0x1112], NFKD: [0x1112] }, +{ source: [0xFFC2], NFC: [0xFFC2], NFD: [0xFFC2], NFKC: [0x1161], NFKD: [0x1161] }, +{ source: [0xFFC3], NFC: [0xFFC3], NFD: [0xFFC3], NFKC: [0x1162], NFKD: [0x1162] }, +{ source: [0xFFC4], NFC: [0xFFC4], NFD: [0xFFC4], NFKC: [0x1163], NFKD: [0x1163] }, +{ source: [0xFFC5], NFC: [0xFFC5], NFD: [0xFFC5], NFKC: [0x1164], NFKD: [0x1164] }, +{ source: [0xFFC6], NFC: [0xFFC6], NFD: [0xFFC6], NFKC: [0x1165], NFKD: [0x1165] }, +{ source: [0xFFC7], NFC: [0xFFC7], NFD: [0xFFC7], NFKC: [0x1166], NFKD: [0x1166] }, +{ source: [0xFFCA], NFC: [0xFFCA], NFD: [0xFFCA], NFKC: [0x1167], NFKD: [0x1167] }, +{ source: [0xFFCB], NFC: [0xFFCB], NFD: [0xFFCB], NFKC: [0x1168], NFKD: [0x1168] }, +{ source: [0xFFCC], NFC: [0xFFCC], NFD: [0xFFCC], NFKC: [0x1169], NFKD: [0x1169] }, +{ source: [0xFFCD], NFC: [0xFFCD], NFD: [0xFFCD], NFKC: [0x116A], NFKD: [0x116A] }, +{ source: [0xFFCE], NFC: [0xFFCE], NFD: [0xFFCE], NFKC: [0x116B], NFKD: [0x116B] }, +{ source: [0xFFCF], NFC: [0xFFCF], NFD: [0xFFCF], NFKC: [0x116C], NFKD: [0x116C] }, +{ source: [0xFFD2], NFC: [0xFFD2], NFD: [0xFFD2], NFKC: [0x116D], NFKD: [0x116D] }, +{ source: [0xFFD3], NFC: [0xFFD3], NFD: [0xFFD3], NFKC: [0x116E], NFKD: [0x116E] }, +{ source: [0xFFD4], NFC: [0xFFD4], NFD: [0xFFD4], NFKC: [0x116F], NFKD: [0x116F] }, +{ source: [0xFFD5], NFC: [0xFFD5], NFD: [0xFFD5], NFKC: [0x1170], NFKD: [0x1170] }, +{ source: [0xFFD6], NFC: [0xFFD6], NFD: [0xFFD6], NFKC: [0x1171], NFKD: [0x1171] }, +{ source: [0xFFD7], NFC: [0xFFD7], NFD: [0xFFD7], NFKC: [0x1172], NFKD: [0x1172] }, +{ source: [0xFFDA], NFC: [0xFFDA], NFD: [0xFFDA], NFKC: [0x1173], NFKD: [0x1173] }, +{ source: [0xFFDB], NFC: [0xFFDB], NFD: [0xFFDB], NFKC: [0x1174], NFKD: [0x1174] }, +{ source: [0xFFDC], NFC: [0xFFDC], NFD: [0xFFDC], NFKC: [0x1175], NFKD: [0x1175] }, +{ source: [0xFFE0], NFC: [0xFFE0], NFD: [0xFFE0], NFKC: [0x00A2], NFKD: [0x00A2] }, +{ source: [0xFFE1], NFC: [0xFFE1], NFD: [0xFFE1], NFKC: [0x00A3], NFKD: [0x00A3] }, +{ source: [0xFFE2], NFC: [0xFFE2], NFD: [0xFFE2], NFKC: [0x00AC], NFKD: [0x00AC] }, +{ source: [0xFFE3], NFC: [0xFFE3], NFD: [0xFFE3], NFKC: [0x0020, 0x0304], NFKD: [0x0020, 0x0304] }, +{ source: [0xFFE4], NFC: [0xFFE4], NFD: [0xFFE4], NFKC: [0x00A6], NFKD: [0x00A6] }, +{ source: [0xFFE5], NFC: [0xFFE5], NFD: [0xFFE5], NFKC: [0x00A5], NFKD: [0x00A5] }, +{ source: [0xFFE6], NFC: [0xFFE6], NFD: [0xFFE6], NFKC: [0x20A9], NFKD: [0x20A9] }, +{ source: [0xFFE8], NFC: [0xFFE8], NFD: [0xFFE8], NFKC: [0x2502], NFKD: [0x2502] }, +{ source: [0xFFE9], NFC: [0xFFE9], NFD: [0xFFE9], NFKC: [0x2190], NFKD: [0x2190] }, +{ source: [0xFFEA], NFC: [0xFFEA], NFD: [0xFFEA], NFKC: [0x2191], NFKD: [0x2191] }, +{ source: [0xFFEB], NFC: [0xFFEB], NFD: [0xFFEB], NFKC: [0x2192], NFKD: [0x2192] }, +{ source: [0xFFEC], NFC: [0xFFEC], NFD: [0xFFEC], NFKC: [0x2193], NFKD: [0x2193] }, +{ source: [0xFFED], NFC: [0xFFED], NFD: [0xFFED], NFKC: [0x25A0], NFKD: [0x25A0] }, +{ source: [0xFFEE], NFC: [0xFFEE], NFD: [0xFFEE], NFKC: [0x25CB], NFKD: [0x25CB] }, +{ source: [0x10781], NFC: [0x10781], NFD: [0x10781], NFKC: [0x02D0], NFKD: [0x02D0] }, +{ source: [0x10782], NFC: [0x10782], NFD: [0x10782], NFKC: [0x02D1], NFKD: [0x02D1] }, +{ source: [0x10783], NFC: [0x10783], NFD: [0x10783], NFKC: [0x00E6], NFKD: [0x00E6] }, +{ source: [0x10784], NFC: [0x10784], NFD: [0x10784], NFKC: [0x0299], NFKD: [0x0299] }, +{ source: [0x10785], NFC: [0x10785], NFD: [0x10785], NFKC: [0x0253], NFKD: [0x0253] }, +{ source: [0x10787], NFC: [0x10787], NFD: [0x10787], NFKC: [0x02A3], NFKD: [0x02A3] }, +{ source: [0x10788], NFC: [0x10788], NFD: [0x10788], NFKC: [0xAB66], NFKD: [0xAB66] }, +{ source: [0x10789], NFC: [0x10789], NFD: [0x10789], NFKC: [0x02A5], NFKD: [0x02A5] }, +{ source: [0x1078A], NFC: [0x1078A], NFD: [0x1078A], NFKC: [0x02A4], NFKD: [0x02A4] }, +{ source: [0x1078B], NFC: [0x1078B], NFD: [0x1078B], NFKC: [0x0256], NFKD: [0x0256] }, +{ source: [0x1078C], NFC: [0x1078C], NFD: [0x1078C], NFKC: [0x0257], NFKD: [0x0257] }, +{ source: [0x1078D], NFC: [0x1078D], NFD: [0x1078D], NFKC: [0x1D91], NFKD: [0x1D91] }, +{ source: [0x1078E], NFC: [0x1078E], NFD: [0x1078E], NFKC: [0x0258], NFKD: [0x0258] }, +{ source: [0x1078F], NFC: [0x1078F], NFD: [0x1078F], NFKC: [0x025E], NFKD: [0x025E] }, +{ source: [0x10790], NFC: [0x10790], NFD: [0x10790], NFKC: [0x02A9], NFKD: [0x02A9] }, +{ source: [0x10791], NFC: [0x10791], NFD: [0x10791], NFKC: [0x0264], NFKD: [0x0264] }, +{ source: [0x10792], NFC: [0x10792], NFD: [0x10792], NFKC: [0x0262], NFKD: [0x0262] }, +{ source: [0x10793], NFC: [0x10793], NFD: [0x10793], NFKC: [0x0260], NFKD: [0x0260] }, +{ source: [0x10794], NFC: [0x10794], NFD: [0x10794], NFKC: [0x029B], NFKD: [0x029B] }, +{ source: [0x10795], NFC: [0x10795], NFD: [0x10795], NFKC: [0x0127], NFKD: [0x0127] }, +{ source: [0x10796], NFC: [0x10796], NFD: [0x10796], NFKC: [0x029C], NFKD: [0x029C] }, +{ source: [0x10797], NFC: [0x10797], NFD: [0x10797], NFKC: [0x0267], NFKD: [0x0267] }, +{ source: [0x10798], NFC: [0x10798], NFD: [0x10798], NFKC: [0x0284], NFKD: [0x0284] }, +{ source: [0x10799], NFC: [0x10799], NFD: [0x10799], NFKC: [0x02AA], NFKD: [0x02AA] }, +{ source: [0x1079A], NFC: [0x1079A], NFD: [0x1079A], NFKC: [0x02AB], NFKD: [0x02AB] }, +{ source: [0x1079B], NFC: [0x1079B], NFD: [0x1079B], NFKC: [0x026C], NFKD: [0x026C] }, +{ source: [0x1079C], NFC: [0x1079C], NFD: [0x1079C], NFKC: [0x1DF04], NFKD: [0x1DF04] }, +{ source: [0x1079D], NFC: [0x1079D], NFD: [0x1079D], NFKC: [0xA78E], NFKD: [0xA78E] }, +{ source: [0x1079E], NFC: [0x1079E], NFD: [0x1079E], NFKC: [0x026E], NFKD: [0x026E] }, +{ source: [0x1079F], NFC: [0x1079F], NFD: [0x1079F], NFKC: [0x1DF05], NFKD: [0x1DF05] }, +{ source: [0x107A0], NFC: [0x107A0], NFD: [0x107A0], NFKC: [0x028E], NFKD: [0x028E] }, +{ source: [0x107A1], NFC: [0x107A1], NFD: [0x107A1], NFKC: [0x1DF06], NFKD: [0x1DF06] }, +{ source: [0x107A2], NFC: [0x107A2], NFD: [0x107A2], NFKC: [0x00F8], NFKD: [0x00F8] }, +{ source: [0x107A3], NFC: [0x107A3], NFD: [0x107A3], NFKC: [0x0276], NFKD: [0x0276] }, +{ source: [0x107A4], NFC: [0x107A4], NFD: [0x107A4], NFKC: [0x0277], NFKD: [0x0277] }, +{ source: [0x107A5], NFC: [0x107A5], NFD: [0x107A5], NFKC: [0x0071], NFKD: [0x0071] }, +{ source: [0x107A6], NFC: [0x107A6], NFD: [0x107A6], NFKC: [0x027A], NFKD: [0x027A] }, +{ source: [0x107A7], NFC: [0x107A7], NFD: [0x107A7], NFKC: [0x1DF08], NFKD: [0x1DF08] }, +{ source: [0x107A8], NFC: [0x107A8], NFD: [0x107A8], NFKC: [0x027D], NFKD: [0x027D] }, +{ source: [0x107A9], NFC: [0x107A9], NFD: [0x107A9], NFKC: [0x027E], NFKD: [0x027E] }, +{ source: [0x107AA], NFC: [0x107AA], NFD: [0x107AA], NFKC: [0x0280], NFKD: [0x0280] }, +{ source: [0x107AB], NFC: [0x107AB], NFD: [0x107AB], NFKC: [0x02A8], NFKD: [0x02A8] }, +{ source: [0x107AC], NFC: [0x107AC], NFD: [0x107AC], NFKC: [0x02A6], NFKD: [0x02A6] }, +{ source: [0x107AD], NFC: [0x107AD], NFD: [0x107AD], NFKC: [0xAB67], NFKD: [0xAB67] }, +{ source: [0x107AE], NFC: [0x107AE], NFD: [0x107AE], NFKC: [0x02A7], NFKD: [0x02A7] }, +{ source: [0x107AF], NFC: [0x107AF], NFD: [0x107AF], NFKC: [0x0288], NFKD: [0x0288] }, +{ source: [0x107B0], NFC: [0x107B0], NFD: [0x107B0], NFKC: [0x2C71], NFKD: [0x2C71] }, +{ source: [0x107B2], NFC: [0x107B2], NFD: [0x107B2], NFKC: [0x028F], NFKD: [0x028F] }, +{ source: [0x107B3], NFC: [0x107B3], NFD: [0x107B3], NFKC: [0x02A1], NFKD: [0x02A1] }, +{ source: [0x107B4], NFC: [0x107B4], NFD: [0x107B4], NFKC: [0x02A2], NFKD: [0x02A2] }, +{ source: [0x107B5], NFC: [0x107B5], NFD: [0x107B5], NFKC: [0x0298], NFKD: [0x0298] }, +{ source: [0x107B6], NFC: [0x107B6], NFD: [0x107B6], NFKC: [0x01C0], NFKD: [0x01C0] }, +{ source: [0x107B7], NFC: [0x107B7], NFD: [0x107B7], NFKC: [0x01C1], NFKD: [0x01C1] }, +{ source: [0x107B8], NFC: [0x107B8], NFD: [0x107B8], NFKC: [0x01C2], NFKD: [0x01C2] }, +{ source: [0x107B9], NFC: [0x107B9], NFD: [0x107B9], NFKC: [0x1DF0A], NFKD: [0x1DF0A] }, +{ source: [0x107BA], NFC: [0x107BA], NFD: [0x107BA], NFKC: [0x1DF1E], NFKD: [0x1DF1E] }, +{ source: [0x1109A], NFC: [0x1109A], NFD: [0x11099, 0x110BA], NFKC: [0x1109A], NFKD: [0x11099, 0x110BA] }, +{ source: [0x1109C], NFC: [0x1109C], NFD: [0x1109B, 0x110BA], NFKC: [0x1109C], NFKD: [0x1109B, 0x110BA] }, +{ source: [0x110AB], NFC: [0x110AB], NFD: [0x110A5, 0x110BA], NFKC: [0x110AB], NFKD: [0x110A5, 0x110BA] }, +{ source: [0x1112E], NFC: [0x1112E], NFD: [0x11131, 0x11127], NFKC: [0x1112E], NFKD: [0x11131, 0x11127] }, +{ source: [0x1112F], NFC: [0x1112F], NFD: [0x11132, 0x11127], NFKC: [0x1112F], NFKD: [0x11132, 0x11127] }, +{ source: [0x1134B], NFC: [0x1134B], NFD: [0x11347, 0x1133E], NFKC: [0x1134B], NFKD: [0x11347, 0x1133E] }, +{ source: [0x1134C], NFC: [0x1134C], NFD: [0x11347, 0x11357], NFKC: [0x1134C], NFKD: [0x11347, 0x11357] }, +{ source: [0x114BB], NFC: [0x114BB], NFD: [0x114B9, 0x114BA], NFKC: [0x114BB], NFKD: [0x114B9, 0x114BA] }, +{ source: [0x114BC], NFC: [0x114BC], NFD: [0x114B9, 0x114B0], NFKC: [0x114BC], NFKD: [0x114B9, 0x114B0] }, +{ source: [0x114BE], NFC: [0x114BE], NFD: [0x114B9, 0x114BD], NFKC: [0x114BE], NFKD: [0x114B9, 0x114BD] }, +{ source: [0x115BA], NFC: [0x115BA], NFD: [0x115B8, 0x115AF], NFKC: [0x115BA], NFKD: [0x115B8, 0x115AF] }, +{ source: [0x115BB], NFC: [0x115BB], NFD: [0x115B9, 0x115AF], NFKC: [0x115BB], NFKD: [0x115B9, 0x115AF] }, +{ source: [0x11938], NFC: [0x11938], NFD: [0x11935, 0x11930], NFKC: [0x11938], NFKD: [0x11935, 0x11930] }, +{ source: [0x1D15E], NFC: [0x1D157, 0x1D165], NFD: [0x1D157, 0x1D165], NFKC: [0x1D157, 0x1D165], NFKD: [0x1D157, 0x1D165] }, +{ source: [0x1D15F], NFC: [0x1D158, 0x1D165], NFD: [0x1D158, 0x1D165], NFKC: [0x1D158, 0x1D165], NFKD: [0x1D158, 0x1D165] }, +{ source: [0x1D160], NFC: [0x1D158, 0x1D165, 0x1D16E], NFD: [0x1D158, 0x1D165, 0x1D16E], NFKC: [0x1D158, 0x1D165, 0x1D16E], NFKD: [0x1D158, 0x1D165, 0x1D16E] }, +{ source: [0x1D161], NFC: [0x1D158, 0x1D165, 0x1D16F], NFD: [0x1D158, 0x1D165, 0x1D16F], NFKC: [0x1D158, 0x1D165, 0x1D16F], NFKD: [0x1D158, 0x1D165, 0x1D16F] }, +{ source: [0x1D162], NFC: [0x1D158, 0x1D165, 0x1D170], NFD: [0x1D158, 0x1D165, 0x1D170], NFKC: [0x1D158, 0x1D165, 0x1D170], NFKD: [0x1D158, 0x1D165, 0x1D170] }, +{ source: [0x1D163], NFC: [0x1D158, 0x1D165, 0x1D171], NFD: [0x1D158, 0x1D165, 0x1D171], NFKC: [0x1D158, 0x1D165, 0x1D171], NFKD: [0x1D158, 0x1D165, 0x1D171] }, +{ source: [0x1D164], NFC: [0x1D158, 0x1D165, 0x1D172], NFD: [0x1D158, 0x1D165, 0x1D172], NFKC: [0x1D158, 0x1D165, 0x1D172], NFKD: [0x1D158, 0x1D165, 0x1D172] }, +{ source: [0x1D1BB], NFC: [0x1D1B9, 0x1D165], NFD: [0x1D1B9, 0x1D165], NFKC: [0x1D1B9, 0x1D165], NFKD: [0x1D1B9, 0x1D165] }, +{ source: [0x1D1BC], NFC: [0x1D1BA, 0x1D165], NFD: [0x1D1BA, 0x1D165], NFKC: [0x1D1BA, 0x1D165], NFKD: [0x1D1BA, 0x1D165] }, +{ source: [0x1D1BD], NFC: [0x1D1B9, 0x1D165, 0x1D16E], NFD: [0x1D1B9, 0x1D165, 0x1D16E], NFKC: [0x1D1B9, 0x1D165, 0x1D16E], NFKD: [0x1D1B9, 0x1D165, 0x1D16E] }, +{ source: [0x1D1BE], NFC: [0x1D1BA, 0x1D165, 0x1D16E], NFD: [0x1D1BA, 0x1D165, 0x1D16E], NFKC: [0x1D1BA, 0x1D165, 0x1D16E], NFKD: [0x1D1BA, 0x1D165, 0x1D16E] }, +{ source: [0x1D1BF], NFC: [0x1D1B9, 0x1D165, 0x1D16F], NFD: [0x1D1B9, 0x1D165, 0x1D16F], NFKC: [0x1D1B9, 0x1D165, 0x1D16F], NFKD: [0x1D1B9, 0x1D165, 0x1D16F] }, +{ source: [0x1D1C0], NFC: [0x1D1BA, 0x1D165, 0x1D16F], NFD: [0x1D1BA, 0x1D165, 0x1D16F], NFKC: [0x1D1BA, 0x1D165, 0x1D16F], NFKD: [0x1D1BA, 0x1D165, 0x1D16F] }, +{ source: [0x1D400], NFC: [0x1D400], NFD: [0x1D400], NFKC: [0x0041], NFKD: [0x0041] }, +{ source: [0x1D401], NFC: [0x1D401], NFD: [0x1D401], NFKC: [0x0042], NFKD: [0x0042] }, +{ source: [0x1D402], NFC: [0x1D402], NFD: [0x1D402], NFKC: [0x0043], NFKD: [0x0043] }, +{ source: [0x1D403], NFC: [0x1D403], NFD: [0x1D403], NFKC: [0x0044], NFKD: [0x0044] }, +{ source: [0x1D404], NFC: [0x1D404], NFD: [0x1D404], NFKC: [0x0045], NFKD: [0x0045] }, +{ source: [0x1D405], NFC: [0x1D405], NFD: [0x1D405], NFKC: [0x0046], NFKD: [0x0046] }, +{ source: [0x1D406], NFC: [0x1D406], NFD: [0x1D406], NFKC: [0x0047], NFKD: [0x0047] }, +{ source: [0x1D407], NFC: [0x1D407], NFD: [0x1D407], NFKC: [0x0048], NFKD: [0x0048] }, +{ source: [0x1D408], NFC: [0x1D408], NFD: [0x1D408], NFKC: [0x0049], NFKD: [0x0049] }, +{ source: [0x1D409], NFC: [0x1D409], NFD: [0x1D409], NFKC: [0x004A], NFKD: [0x004A] }, +{ source: [0x1D40A], NFC: [0x1D40A], NFD: [0x1D40A], NFKC: [0x004B], NFKD: [0x004B] }, +{ source: [0x1D40B], NFC: [0x1D40B], NFD: [0x1D40B], NFKC: [0x004C], NFKD: [0x004C] }, +{ source: [0x1D40C], NFC: [0x1D40C], NFD: [0x1D40C], NFKC: [0x004D], NFKD: [0x004D] }, +{ source: [0x1D40D], NFC: [0x1D40D], NFD: [0x1D40D], NFKC: [0x004E], NFKD: [0x004E] }, +{ source: [0x1D40E], NFC: [0x1D40E], NFD: [0x1D40E], NFKC: [0x004F], NFKD: [0x004F] }, +{ source: [0x1D40F], NFC: [0x1D40F], NFD: [0x1D40F], NFKC: [0x0050], NFKD: [0x0050] }, +{ source: [0x1D410], NFC: [0x1D410], NFD: [0x1D410], NFKC: [0x0051], NFKD: [0x0051] }, +{ source: [0x1D411], NFC: [0x1D411], NFD: [0x1D411], NFKC: [0x0052], NFKD: [0x0052] }, +{ source: [0x1D412], NFC: [0x1D412], NFD: [0x1D412], NFKC: [0x0053], NFKD: [0x0053] }, +{ source: [0x1D413], NFC: [0x1D413], NFD: [0x1D413], NFKC: [0x0054], NFKD: [0x0054] }, +{ source: [0x1D414], NFC: [0x1D414], NFD: [0x1D414], NFKC: [0x0055], NFKD: [0x0055] }, +{ source: [0x1D415], NFC: [0x1D415], NFD: [0x1D415], NFKC: [0x0056], NFKD: [0x0056] }, +{ source: [0x1D416], NFC: [0x1D416], NFD: [0x1D416], NFKC: [0x0057], NFKD: [0x0057] }, +{ source: [0x1D417], NFC: [0x1D417], NFD: [0x1D417], NFKC: [0x0058], NFKD: [0x0058] }, +{ source: [0x1D418], NFC: [0x1D418], NFD: [0x1D418], NFKC: [0x0059], NFKD: [0x0059] }, +{ source: [0x1D419], NFC: [0x1D419], NFD: [0x1D419], NFKC: [0x005A], NFKD: [0x005A] }, +{ source: [0x1D41A], NFC: [0x1D41A], NFD: [0x1D41A], NFKC: [0x0061], NFKD: [0x0061] }, +{ source: [0x1D41B], NFC: [0x1D41B], NFD: [0x1D41B], NFKC: [0x0062], NFKD: [0x0062] }, +{ source: [0x1D41C], NFC: [0x1D41C], NFD: [0x1D41C], NFKC: [0x0063], NFKD: [0x0063] }, +{ source: [0x1D41D], NFC: [0x1D41D], NFD: [0x1D41D], NFKC: [0x0064], NFKD: [0x0064] }, +{ source: [0x1D41E], NFC: [0x1D41E], NFD: [0x1D41E], NFKC: [0x0065], NFKD: [0x0065] }, +{ source: [0x1D41F], NFC: [0x1D41F], NFD: [0x1D41F], NFKC: [0x0066], NFKD: [0x0066] }, +{ source: [0x1D420], NFC: [0x1D420], NFD: [0x1D420], NFKC: [0x0067], NFKD: [0x0067] }, +{ source: [0x1D421], NFC: [0x1D421], NFD: [0x1D421], NFKC: [0x0068], NFKD: [0x0068] }, +{ source: [0x1D422], NFC: [0x1D422], NFD: [0x1D422], NFKC: [0x0069], NFKD: [0x0069] }, +{ source: [0x1D423], NFC: [0x1D423], NFD: [0x1D423], NFKC: [0x006A], NFKD: [0x006A] }, +{ source: [0x1D424], NFC: [0x1D424], NFD: [0x1D424], NFKC: [0x006B], NFKD: [0x006B] }, +{ source: [0x1D425], NFC: [0x1D425], NFD: [0x1D425], NFKC: [0x006C], NFKD: [0x006C] }, +{ source: [0x1D426], NFC: [0x1D426], NFD: [0x1D426], NFKC: [0x006D], NFKD: [0x006D] }, +{ source: [0x1D427], NFC: [0x1D427], NFD: [0x1D427], NFKC: [0x006E], NFKD: [0x006E] }, +{ source: [0x1D428], NFC: [0x1D428], NFD: [0x1D428], NFKC: [0x006F], NFKD: [0x006F] }, +{ source: [0x1D429], NFC: [0x1D429], NFD: [0x1D429], NFKC: [0x0070], NFKD: [0x0070] }, +{ source: [0x1D42A], NFC: [0x1D42A], NFD: [0x1D42A], NFKC: [0x0071], NFKD: [0x0071] }, +{ source: [0x1D42B], NFC: [0x1D42B], NFD: [0x1D42B], NFKC: [0x0072], NFKD: [0x0072] }, +{ source: [0x1D42C], NFC: [0x1D42C], NFD: [0x1D42C], NFKC: [0x0073], NFKD: [0x0073] }, +{ source: [0x1D42D], NFC: [0x1D42D], NFD: [0x1D42D], NFKC: [0x0074], NFKD: [0x0074] }, +{ source: [0x1D42E], NFC: [0x1D42E], NFD: [0x1D42E], NFKC: [0x0075], NFKD: [0x0075] }, +{ source: [0x1D42F], NFC: [0x1D42F], NFD: [0x1D42F], NFKC: [0x0076], NFKD: [0x0076] }, +{ source: [0x1D430], NFC: [0x1D430], NFD: [0x1D430], NFKC: [0x0077], NFKD: [0x0077] }, +{ source: [0x1D431], NFC: [0x1D431], NFD: [0x1D431], NFKC: [0x0078], NFKD: [0x0078] }, +{ source: [0x1D432], NFC: [0x1D432], NFD: [0x1D432], NFKC: [0x0079], NFKD: [0x0079] }, +{ source: [0x1D433], NFC: [0x1D433], NFD: [0x1D433], NFKC: [0x007A], NFKD: [0x007A] }, +{ source: [0x1D434], NFC: [0x1D434], NFD: [0x1D434], NFKC: [0x0041], NFKD: [0x0041] }, +{ source: [0x1D435], NFC: [0x1D435], NFD: [0x1D435], NFKC: [0x0042], NFKD: [0x0042] }, +{ source: [0x1D436], NFC: [0x1D436], NFD: [0x1D436], NFKC: [0x0043], NFKD: [0x0043] }, +{ source: [0x1D437], NFC: [0x1D437], NFD: [0x1D437], NFKC: [0x0044], NFKD: [0x0044] }, +{ source: [0x1D438], NFC: [0x1D438], NFD: [0x1D438], NFKC: [0x0045], NFKD: [0x0045] }, +{ source: [0x1D439], NFC: [0x1D439], NFD: [0x1D439], NFKC: [0x0046], NFKD: [0x0046] }, +{ source: [0x1D43A], NFC: [0x1D43A], NFD: [0x1D43A], NFKC: [0x0047], NFKD: [0x0047] }, +{ source: [0x1D43B], NFC: [0x1D43B], NFD: [0x1D43B], NFKC: [0x0048], NFKD: [0x0048] }, +{ source: [0x1D43C], NFC: [0x1D43C], NFD: [0x1D43C], NFKC: [0x0049], NFKD: [0x0049] }, +{ source: [0x1D43D], NFC: [0x1D43D], NFD: [0x1D43D], NFKC: [0x004A], NFKD: [0x004A] }, +{ source: [0x1D43E], NFC: [0x1D43E], NFD: [0x1D43E], NFKC: [0x004B], NFKD: [0x004B] }, +{ source: [0x1D43F], NFC: [0x1D43F], NFD: [0x1D43F], NFKC: [0x004C], NFKD: [0x004C] }, +{ source: [0x1D440], NFC: [0x1D440], NFD: [0x1D440], NFKC: [0x004D], NFKD: [0x004D] }, +{ source: [0x1D441], NFC: [0x1D441], NFD: [0x1D441], NFKC: [0x004E], NFKD: [0x004E] }, +{ source: [0x1D442], NFC: [0x1D442], NFD: [0x1D442], NFKC: [0x004F], NFKD: [0x004F] }, +{ source: [0x1D443], NFC: [0x1D443], NFD: [0x1D443], NFKC: [0x0050], NFKD: [0x0050] }, +{ source: [0x1D444], NFC: [0x1D444], NFD: [0x1D444], NFKC: [0x0051], NFKD: [0x0051] }, +{ source: [0x1D445], NFC: [0x1D445], NFD: [0x1D445], NFKC: [0x0052], NFKD: [0x0052] }, +{ source: [0x1D446], NFC: [0x1D446], NFD: [0x1D446], NFKC: [0x0053], NFKD: [0x0053] }, +{ source: [0x1D447], NFC: [0x1D447], NFD: [0x1D447], NFKC: [0x0054], NFKD: [0x0054] }, +{ source: [0x1D448], NFC: [0x1D448], NFD: [0x1D448], NFKC: [0x0055], NFKD: [0x0055] }, +{ source: [0x1D449], NFC: [0x1D449], NFD: [0x1D449], NFKC: [0x0056], NFKD: [0x0056] }, +{ source: [0x1D44A], NFC: [0x1D44A], NFD: [0x1D44A], NFKC: [0x0057], NFKD: [0x0057] }, +{ source: [0x1D44B], NFC: [0x1D44B], NFD: [0x1D44B], NFKC: [0x0058], NFKD: [0x0058] }, +{ source: [0x1D44C], NFC: [0x1D44C], NFD: [0x1D44C], NFKC: [0x0059], NFKD: [0x0059] }, +{ source: [0x1D44D], NFC: [0x1D44D], NFD: [0x1D44D], NFKC: [0x005A], NFKD: [0x005A] }, +{ source: [0x1D44E], NFC: [0x1D44E], NFD: [0x1D44E], NFKC: [0x0061], NFKD: [0x0061] }, +{ source: [0x1D44F], NFC: [0x1D44F], NFD: [0x1D44F], NFKC: [0x0062], NFKD: [0x0062] }, +{ source: [0x1D450], NFC: [0x1D450], NFD: [0x1D450], NFKC: [0x0063], NFKD: [0x0063] }, +{ source: [0x1D451], NFC: [0x1D451], NFD: [0x1D451], NFKC: [0x0064], NFKD: [0x0064] }, +{ source: [0x1D452], NFC: [0x1D452], NFD: [0x1D452], NFKC: [0x0065], NFKD: [0x0065] }, +{ source: [0x1D453], NFC: [0x1D453], NFD: [0x1D453], NFKC: [0x0066], NFKD: [0x0066] }, +{ source: [0x1D454], NFC: [0x1D454], NFD: [0x1D454], NFKC: [0x0067], NFKD: [0x0067] }, +{ source: [0x1D456], NFC: [0x1D456], NFD: [0x1D456], NFKC: [0x0069], NFKD: [0x0069] }, +{ source: [0x1D457], NFC: [0x1D457], NFD: [0x1D457], NFKC: [0x006A], NFKD: [0x006A] }, +{ source: [0x1D458], NFC: [0x1D458], NFD: [0x1D458], NFKC: [0x006B], NFKD: [0x006B] }, +{ source: [0x1D459], NFC: [0x1D459], NFD: [0x1D459], NFKC: [0x006C], NFKD: [0x006C] }, +{ source: [0x1D45A], NFC: [0x1D45A], NFD: [0x1D45A], NFKC: [0x006D], NFKD: [0x006D] }, +{ source: [0x1D45B], NFC: [0x1D45B], NFD: [0x1D45B], NFKC: [0x006E], NFKD: [0x006E] }, +{ source: [0x1D45C], NFC: [0x1D45C], NFD: [0x1D45C], NFKC: [0x006F], NFKD: [0x006F] }, +{ source: [0x1D45D], NFC: [0x1D45D], NFD: [0x1D45D], NFKC: [0x0070], NFKD: [0x0070] }, +{ source: [0x1D45E], NFC: [0x1D45E], NFD: [0x1D45E], NFKC: [0x0071], NFKD: [0x0071] }, +{ source: [0x1D45F], NFC: [0x1D45F], NFD: [0x1D45F], NFKC: [0x0072], NFKD: [0x0072] }, +{ source: [0x1D460], NFC: [0x1D460], NFD: [0x1D460], NFKC: [0x0073], NFKD: [0x0073] }, +{ source: [0x1D461], NFC: [0x1D461], NFD: [0x1D461], NFKC: [0x0074], NFKD: [0x0074] }, +{ source: [0x1D462], NFC: [0x1D462], NFD: [0x1D462], NFKC: [0x0075], NFKD: [0x0075] }, +{ source: [0x1D463], NFC: [0x1D463], NFD: [0x1D463], NFKC: [0x0076], NFKD: [0x0076] }, +{ source: [0x1D464], NFC: [0x1D464], NFD: [0x1D464], NFKC: [0x0077], NFKD: [0x0077] }, +{ source: [0x1D465], NFC: [0x1D465], NFD: [0x1D465], NFKC: [0x0078], NFKD: [0x0078] }, +{ source: [0x1D466], NFC: [0x1D466], NFD: [0x1D466], NFKC: [0x0079], NFKD: [0x0079] }, +{ source: [0x1D467], NFC: [0x1D467], NFD: [0x1D467], NFKC: [0x007A], NFKD: [0x007A] }, +{ source: [0x1D468], NFC: [0x1D468], NFD: [0x1D468], NFKC: [0x0041], NFKD: [0x0041] }, +{ source: [0x1D469], NFC: [0x1D469], NFD: [0x1D469], NFKC: [0x0042], NFKD: [0x0042] }, +{ source: [0x1D46A], NFC: [0x1D46A], NFD: [0x1D46A], NFKC: [0x0043], NFKD: [0x0043] }, +{ source: [0x1D46B], NFC: [0x1D46B], NFD: [0x1D46B], NFKC: [0x0044], NFKD: [0x0044] }, +{ source: [0x1D46C], NFC: [0x1D46C], NFD: [0x1D46C], NFKC: [0x0045], NFKD: [0x0045] }, +{ source: [0x1D46D], NFC: [0x1D46D], NFD: [0x1D46D], NFKC: [0x0046], NFKD: [0x0046] }, +{ source: [0x1D46E], NFC: [0x1D46E], NFD: [0x1D46E], NFKC: [0x0047], NFKD: [0x0047] }, +{ source: [0x1D46F], NFC: [0x1D46F], NFD: [0x1D46F], NFKC: [0x0048], NFKD: [0x0048] }, +{ source: [0x1D470], NFC: [0x1D470], NFD: [0x1D470], NFKC: [0x0049], NFKD: [0x0049] }, +{ source: [0x1D471], NFC: [0x1D471], NFD: [0x1D471], NFKC: [0x004A], NFKD: [0x004A] }, +{ source: [0x1D472], NFC: [0x1D472], NFD: [0x1D472], NFKC: [0x004B], NFKD: [0x004B] }, +{ source: [0x1D473], NFC: [0x1D473], NFD: [0x1D473], NFKC: [0x004C], NFKD: [0x004C] }, +{ source: [0x1D474], NFC: [0x1D474], NFD: [0x1D474], NFKC: [0x004D], NFKD: [0x004D] }, +{ source: [0x1D475], NFC: [0x1D475], NFD: [0x1D475], NFKC: [0x004E], NFKD: [0x004E] }, +{ source: [0x1D476], NFC: [0x1D476], NFD: [0x1D476], NFKC: [0x004F], NFKD: [0x004F] }, +{ source: [0x1D477], NFC: [0x1D477], NFD: [0x1D477], NFKC: [0x0050], NFKD: [0x0050] }, +{ source: [0x1D478], NFC: [0x1D478], NFD: [0x1D478], NFKC: [0x0051], NFKD: [0x0051] }, +{ source: [0x1D479], NFC: [0x1D479], NFD: [0x1D479], NFKC: [0x0052], NFKD: [0x0052] }, +{ source: [0x1D47A], NFC: [0x1D47A], NFD: [0x1D47A], NFKC: [0x0053], NFKD: [0x0053] }, +{ source: [0x1D47B], NFC: [0x1D47B], NFD: [0x1D47B], NFKC: [0x0054], NFKD: [0x0054] }, +{ source: [0x1D47C], NFC: [0x1D47C], NFD: [0x1D47C], NFKC: [0x0055], NFKD: [0x0055] }, +{ source: [0x1D47D], NFC: [0x1D47D], NFD: [0x1D47D], NFKC: [0x0056], NFKD: [0x0056] }, +{ source: [0x1D47E], NFC: [0x1D47E], NFD: [0x1D47E], NFKC: [0x0057], NFKD: [0x0057] }, +{ source: [0x1D47F], NFC: [0x1D47F], NFD: [0x1D47F], NFKC: [0x0058], NFKD: [0x0058] }, +{ source: [0x1D480], NFC: [0x1D480], NFD: [0x1D480], NFKC: [0x0059], NFKD: [0x0059] }, +{ source: [0x1D481], NFC: [0x1D481], NFD: [0x1D481], NFKC: [0x005A], NFKD: [0x005A] }, +{ source: [0x1D482], NFC: [0x1D482], NFD: [0x1D482], NFKC: [0x0061], NFKD: [0x0061] }, +{ source: [0x1D483], NFC: [0x1D483], NFD: [0x1D483], NFKC: [0x0062], NFKD: [0x0062] }, +{ source: [0x1D484], NFC: [0x1D484], NFD: [0x1D484], NFKC: [0x0063], NFKD: [0x0063] }, +{ source: [0x1D485], NFC: [0x1D485], NFD: [0x1D485], NFKC: [0x0064], NFKD: [0x0064] }, +{ source: [0x1D486], NFC: [0x1D486], NFD: [0x1D486], NFKC: [0x0065], NFKD: [0x0065] }, +{ source: [0x1D487], NFC: [0x1D487], NFD: [0x1D487], NFKC: [0x0066], NFKD: [0x0066] }, +{ source: [0x1D488], NFC: [0x1D488], NFD: [0x1D488], NFKC: [0x0067], NFKD: [0x0067] }, +{ source: [0x1D489], NFC: [0x1D489], NFD: [0x1D489], NFKC: [0x0068], NFKD: [0x0068] }, +{ source: [0x1D48A], NFC: [0x1D48A], NFD: [0x1D48A], NFKC: [0x0069], NFKD: [0x0069] }, +{ source: [0x1D48B], NFC: [0x1D48B], NFD: [0x1D48B], NFKC: [0x006A], NFKD: [0x006A] }, +{ source: [0x1D48C], NFC: [0x1D48C], NFD: [0x1D48C], NFKC: [0x006B], NFKD: [0x006B] }, +{ source: [0x1D48D], NFC: [0x1D48D], NFD: [0x1D48D], NFKC: [0x006C], NFKD: [0x006C] }, +{ source: [0x1D48E], NFC: [0x1D48E], NFD: [0x1D48E], NFKC: [0x006D], NFKD: [0x006D] }, +{ source: [0x1D48F], NFC: [0x1D48F], NFD: [0x1D48F], NFKC: [0x006E], NFKD: [0x006E] }, +{ source: [0x1D490], NFC: [0x1D490], NFD: [0x1D490], NFKC: [0x006F], NFKD: [0x006F] }, +{ source: [0x1D491], NFC: [0x1D491], NFD: [0x1D491], NFKC: [0x0070], NFKD: [0x0070] }, +{ source: [0x1D492], NFC: [0x1D492], NFD: [0x1D492], NFKC: [0x0071], NFKD: [0x0071] }, +{ source: [0x1D493], NFC: [0x1D493], NFD: [0x1D493], NFKC: [0x0072], NFKD: [0x0072] }, +{ source: [0x1D494], NFC: [0x1D494], NFD: [0x1D494], NFKC: [0x0073], NFKD: [0x0073] }, +{ source: [0x1D495], NFC: [0x1D495], NFD: [0x1D495], NFKC: [0x0074], NFKD: [0x0074] }, +{ source: [0x1D496], NFC: [0x1D496], NFD: [0x1D496], NFKC: [0x0075], NFKD: [0x0075] }, +{ source: [0x1D497], NFC: [0x1D497], NFD: [0x1D497], NFKC: [0x0076], NFKD: [0x0076] }, +{ source: [0x1D498], NFC: [0x1D498], NFD: [0x1D498], NFKC: [0x0077], NFKD: [0x0077] }, +{ source: [0x1D499], NFC: [0x1D499], NFD: [0x1D499], NFKC: [0x0078], NFKD: [0x0078] }, +{ source: [0x1D49A], NFC: [0x1D49A], NFD: [0x1D49A], NFKC: [0x0079], NFKD: [0x0079] }, +{ source: [0x1D49B], NFC: [0x1D49B], NFD: [0x1D49B], NFKC: [0x007A], NFKD: [0x007A] }, +{ source: [0x1D49C], NFC: [0x1D49C], NFD: [0x1D49C], NFKC: [0x0041], NFKD: [0x0041] }, +{ source: [0x1D49E], NFC: [0x1D49E], NFD: [0x1D49E], NFKC: [0x0043], NFKD: [0x0043] }, +{ source: [0x1D49F], NFC: [0x1D49F], NFD: [0x1D49F], NFKC: [0x0044], NFKD: [0x0044] }, +{ source: [0x1D4A2], NFC: [0x1D4A2], NFD: [0x1D4A2], NFKC: [0x0047], NFKD: [0x0047] }, +{ source: [0x1D4A5], NFC: [0x1D4A5], NFD: [0x1D4A5], NFKC: [0x004A], NFKD: [0x004A] }, +{ source: [0x1D4A6], NFC: [0x1D4A6], NFD: [0x1D4A6], NFKC: [0x004B], NFKD: [0x004B] }, +{ source: [0x1D4A9], NFC: [0x1D4A9], NFD: [0x1D4A9], NFKC: [0x004E], NFKD: [0x004E] }, +{ source: [0x1D4AA], NFC: [0x1D4AA], NFD: [0x1D4AA], NFKC: [0x004F], NFKD: [0x004F] }, +{ source: [0x1D4AB], NFC: [0x1D4AB], NFD: [0x1D4AB], NFKC: [0x0050], NFKD: [0x0050] }, +{ source: [0x1D4AC], NFC: [0x1D4AC], NFD: [0x1D4AC], NFKC: [0x0051], NFKD: [0x0051] }, +{ source: [0x1D4AE], NFC: [0x1D4AE], NFD: [0x1D4AE], NFKC: [0x0053], NFKD: [0x0053] }, +{ source: [0x1D4AF], NFC: [0x1D4AF], NFD: [0x1D4AF], NFKC: [0x0054], NFKD: [0x0054] }, +{ source: [0x1D4B0], NFC: [0x1D4B0], NFD: [0x1D4B0], NFKC: [0x0055], NFKD: [0x0055] }, +{ source: [0x1D4B1], NFC: [0x1D4B1], NFD: [0x1D4B1], NFKC: [0x0056], NFKD: [0x0056] }, +{ source: [0x1D4B2], NFC: [0x1D4B2], NFD: [0x1D4B2], NFKC: [0x0057], NFKD: [0x0057] }, +{ source: [0x1D4B3], NFC: [0x1D4B3], NFD: [0x1D4B3], NFKC: [0x0058], NFKD: [0x0058] }, +{ source: [0x1D4B4], NFC: [0x1D4B4], NFD: [0x1D4B4], NFKC: [0x0059], NFKD: [0x0059] }, +{ source: [0x1D4B5], NFC: [0x1D4B5], NFD: [0x1D4B5], NFKC: [0x005A], NFKD: [0x005A] }, +{ source: [0x1D4B6], NFC: [0x1D4B6], NFD: [0x1D4B6], NFKC: [0x0061], NFKD: [0x0061] }, +{ source: [0x1D4B7], NFC: [0x1D4B7], NFD: [0x1D4B7], NFKC: [0x0062], NFKD: [0x0062] }, +{ source: [0x1D4B8], NFC: [0x1D4B8], NFD: [0x1D4B8], NFKC: [0x0063], NFKD: [0x0063] }, +{ source: [0x1D4B9], NFC: [0x1D4B9], NFD: [0x1D4B9], NFKC: [0x0064], NFKD: [0x0064] }, +{ source: [0x1D4BB], NFC: [0x1D4BB], NFD: [0x1D4BB], NFKC: [0x0066], NFKD: [0x0066] }, +{ source: [0x1D4BD], NFC: [0x1D4BD], NFD: [0x1D4BD], NFKC: [0x0068], NFKD: [0x0068] }, +{ source: [0x1D4BE], NFC: [0x1D4BE], NFD: [0x1D4BE], NFKC: [0x0069], NFKD: [0x0069] }, +{ source: [0x1D4BF], NFC: [0x1D4BF], NFD: [0x1D4BF], NFKC: [0x006A], NFKD: [0x006A] }, +{ source: [0x1D4C0], NFC: [0x1D4C0], NFD: [0x1D4C0], NFKC: [0x006B], NFKD: [0x006B] }, +{ source: [0x1D4C1], NFC: [0x1D4C1], NFD: [0x1D4C1], NFKC: [0x006C], NFKD: [0x006C] }, +{ source: [0x1D4C2], NFC: [0x1D4C2], NFD: [0x1D4C2], NFKC: [0x006D], NFKD: [0x006D] }, +{ source: [0x1D4C3], NFC: [0x1D4C3], NFD: [0x1D4C3], NFKC: [0x006E], NFKD: [0x006E] }, +{ source: [0x1D4C5], NFC: [0x1D4C5], NFD: [0x1D4C5], NFKC: [0x0070], NFKD: [0x0070] }, +{ source: [0x1D4C6], NFC: [0x1D4C6], NFD: [0x1D4C6], NFKC: [0x0071], NFKD: [0x0071] }, +{ source: [0x1D4C7], NFC: [0x1D4C7], NFD: [0x1D4C7], NFKC: [0x0072], NFKD: [0x0072] }, +{ source: [0x1D4C8], NFC: [0x1D4C8], NFD: [0x1D4C8], NFKC: [0x0073], NFKD: [0x0073] }, +{ source: [0x1D4C9], NFC: [0x1D4C9], NFD: [0x1D4C9], NFKC: [0x0074], NFKD: [0x0074] }, +{ source: [0x1D4CA], NFC: [0x1D4CA], NFD: [0x1D4CA], NFKC: [0x0075], NFKD: [0x0075] }, +{ source: [0x1D4CB], NFC: [0x1D4CB], NFD: [0x1D4CB], NFKC: [0x0076], NFKD: [0x0076] }, +{ source: [0x1D4CC], NFC: [0x1D4CC], NFD: [0x1D4CC], NFKC: [0x0077], NFKD: [0x0077] }, +{ source: [0x1D4CD], NFC: [0x1D4CD], NFD: [0x1D4CD], NFKC: [0x0078], NFKD: [0x0078] }, +{ source: [0x1D4CE], NFC: [0x1D4CE], NFD: [0x1D4CE], NFKC: [0x0079], NFKD: [0x0079] }, +{ source: [0x1D4CF], NFC: [0x1D4CF], NFD: [0x1D4CF], NFKC: [0x007A], NFKD: [0x007A] }, +{ source: [0x1D4D0], NFC: [0x1D4D0], NFD: [0x1D4D0], NFKC: [0x0041], NFKD: [0x0041] }, +{ source: [0x1D4D1], NFC: [0x1D4D1], NFD: [0x1D4D1], NFKC: [0x0042], NFKD: [0x0042] }, +{ source: [0x1D4D2], NFC: [0x1D4D2], NFD: [0x1D4D2], NFKC: [0x0043], NFKD: [0x0043] }, +{ source: [0x1D4D3], NFC: [0x1D4D3], NFD: [0x1D4D3], NFKC: [0x0044], NFKD: [0x0044] }, +{ source: [0x1D4D4], NFC: [0x1D4D4], NFD: [0x1D4D4], NFKC: [0x0045], NFKD: [0x0045] }, +{ source: [0x1D4D5], NFC: [0x1D4D5], NFD: [0x1D4D5], NFKC: [0x0046], NFKD: [0x0046] }, +{ source: [0x1D4D6], NFC: [0x1D4D6], NFD: [0x1D4D6], NFKC: [0x0047], NFKD: [0x0047] }, +{ source: [0x1D4D7], NFC: [0x1D4D7], NFD: [0x1D4D7], NFKC: [0x0048], NFKD: [0x0048] }, +{ source: [0x1D4D8], NFC: [0x1D4D8], NFD: [0x1D4D8], NFKC: [0x0049], NFKD: [0x0049] }, +{ source: [0x1D4D9], NFC: [0x1D4D9], NFD: [0x1D4D9], NFKC: [0x004A], NFKD: [0x004A] }, +{ source: [0x1D4DA], NFC: [0x1D4DA], NFD: [0x1D4DA], NFKC: [0x004B], NFKD: [0x004B] }, +{ source: [0x1D4DB], NFC: [0x1D4DB], NFD: [0x1D4DB], NFKC: [0x004C], NFKD: [0x004C] }, +{ source: [0x1D4DC], NFC: [0x1D4DC], NFD: [0x1D4DC], NFKC: [0x004D], NFKD: [0x004D] }, +{ source: [0x1D4DD], NFC: [0x1D4DD], NFD: [0x1D4DD], NFKC: [0x004E], NFKD: [0x004E] }, +{ source: [0x1D4DE], NFC: [0x1D4DE], NFD: [0x1D4DE], NFKC: [0x004F], NFKD: [0x004F] }, +{ source: [0x1D4DF], NFC: [0x1D4DF], NFD: [0x1D4DF], NFKC: [0x0050], NFKD: [0x0050] }, +{ source: [0x1D4E0], NFC: [0x1D4E0], NFD: [0x1D4E0], NFKC: [0x0051], NFKD: [0x0051] }, +{ source: [0x1D4E1], NFC: [0x1D4E1], NFD: [0x1D4E1], NFKC: [0x0052], NFKD: [0x0052] }, +{ source: [0x1D4E2], NFC: [0x1D4E2], NFD: [0x1D4E2], NFKC: [0x0053], NFKD: [0x0053] }, +{ source: [0x1D4E3], NFC: [0x1D4E3], NFD: [0x1D4E3], NFKC: [0x0054], NFKD: [0x0054] }, +{ source: [0x1D4E4], NFC: [0x1D4E4], NFD: [0x1D4E4], NFKC: [0x0055], NFKD: [0x0055] }, +{ source: [0x1D4E5], NFC: [0x1D4E5], NFD: [0x1D4E5], NFKC: [0x0056], NFKD: [0x0056] }, +{ source: [0x1D4E6], NFC: [0x1D4E6], NFD: [0x1D4E6], NFKC: [0x0057], NFKD: [0x0057] }, +{ source: [0x1D4E7], NFC: [0x1D4E7], NFD: [0x1D4E7], NFKC: [0x0058], NFKD: [0x0058] }, +{ source: [0x1D4E8], NFC: [0x1D4E8], NFD: [0x1D4E8], NFKC: [0x0059], NFKD: [0x0059] }, +{ source: [0x1D4E9], NFC: [0x1D4E9], NFD: [0x1D4E9], NFKC: [0x005A], NFKD: [0x005A] }, +{ source: [0x1D4EA], NFC: [0x1D4EA], NFD: [0x1D4EA], NFKC: [0x0061], NFKD: [0x0061] }, +{ source: [0x1D4EB], NFC: [0x1D4EB], NFD: [0x1D4EB], NFKC: [0x0062], NFKD: [0x0062] }, +{ source: [0x1D4EC], NFC: [0x1D4EC], NFD: [0x1D4EC], NFKC: [0x0063], NFKD: [0x0063] }, +{ source: [0x1D4ED], NFC: [0x1D4ED], NFD: [0x1D4ED], NFKC: [0x0064], NFKD: [0x0064] }, +{ source: [0x1D4EE], NFC: [0x1D4EE], NFD: [0x1D4EE], NFKC: [0x0065], NFKD: [0x0065] }, +{ source: [0x1D4EF], NFC: [0x1D4EF], NFD: [0x1D4EF], NFKC: [0x0066], NFKD: [0x0066] }, +{ source: [0x1D4F0], NFC: [0x1D4F0], NFD: [0x1D4F0], NFKC: [0x0067], NFKD: [0x0067] }, +{ source: [0x1D4F1], NFC: [0x1D4F1], NFD: [0x1D4F1], NFKC: [0x0068], NFKD: [0x0068] }, +{ source: [0x1D4F2], NFC: [0x1D4F2], NFD: [0x1D4F2], NFKC: [0x0069], NFKD: [0x0069] }, +{ source: [0x1D4F3], NFC: [0x1D4F3], NFD: [0x1D4F3], NFKC: [0x006A], NFKD: [0x006A] }, +{ source: [0x1D4F4], NFC: [0x1D4F4], NFD: [0x1D4F4], NFKC: [0x006B], NFKD: [0x006B] }, +{ source: [0x1D4F5], NFC: [0x1D4F5], NFD: [0x1D4F5], NFKC: [0x006C], NFKD: [0x006C] }, +{ source: [0x1D4F6], NFC: [0x1D4F6], NFD: [0x1D4F6], NFKC: [0x006D], NFKD: [0x006D] }, +{ source: [0x1D4F7], NFC: [0x1D4F7], NFD: [0x1D4F7], NFKC: [0x006E], NFKD: [0x006E] }, +{ source: [0x1D4F8], NFC: [0x1D4F8], NFD: [0x1D4F8], NFKC: [0x006F], NFKD: [0x006F] }, +{ source: [0x1D4F9], NFC: [0x1D4F9], NFD: [0x1D4F9], NFKC: [0x0070], NFKD: [0x0070] }, +{ source: [0x1D4FA], NFC: [0x1D4FA], NFD: [0x1D4FA], NFKC: [0x0071], NFKD: [0x0071] }, +{ source: [0x1D4FB], NFC: [0x1D4FB], NFD: [0x1D4FB], NFKC: [0x0072], NFKD: [0x0072] }, +{ source: [0x1D4FC], NFC: [0x1D4FC], NFD: [0x1D4FC], NFKC: [0x0073], NFKD: [0x0073] }, +{ source: [0x1D4FD], NFC: [0x1D4FD], NFD: [0x1D4FD], NFKC: [0x0074], NFKD: [0x0074] }, +{ source: [0x1D4FE], NFC: [0x1D4FE], NFD: [0x1D4FE], NFKC: [0x0075], NFKD: [0x0075] }, +{ source: [0x1D4FF], NFC: [0x1D4FF], NFD: [0x1D4FF], NFKC: [0x0076], NFKD: [0x0076] }, +{ source: [0x1D500], NFC: [0x1D500], NFD: [0x1D500], NFKC: [0x0077], NFKD: [0x0077] }, +{ source: [0x1D501], NFC: [0x1D501], NFD: [0x1D501], NFKC: [0x0078], NFKD: [0x0078] }, +{ source: [0x1D502], NFC: [0x1D502], NFD: [0x1D502], NFKC: [0x0079], NFKD: [0x0079] }, +{ source: [0x1D503], NFC: [0x1D503], NFD: [0x1D503], NFKC: [0x007A], NFKD: [0x007A] }, +{ source: [0x1D504], NFC: [0x1D504], NFD: [0x1D504], NFKC: [0x0041], NFKD: [0x0041] }, +{ source: [0x1D505], NFC: [0x1D505], NFD: [0x1D505], NFKC: [0x0042], NFKD: [0x0042] }, +{ source: [0x1D507], NFC: [0x1D507], NFD: [0x1D507], NFKC: [0x0044], NFKD: [0x0044] }, +{ source: [0x1D508], NFC: [0x1D508], NFD: [0x1D508], NFKC: [0x0045], NFKD: [0x0045] }, +{ source: [0x1D509], NFC: [0x1D509], NFD: [0x1D509], NFKC: [0x0046], NFKD: [0x0046] }, +{ source: [0x1D50A], NFC: [0x1D50A], NFD: [0x1D50A], NFKC: [0x0047], NFKD: [0x0047] }, +{ source: [0x1D50D], NFC: [0x1D50D], NFD: [0x1D50D], NFKC: [0x004A], NFKD: [0x004A] }, +{ source: [0x1D50E], NFC: [0x1D50E], NFD: [0x1D50E], NFKC: [0x004B], NFKD: [0x004B] }, +{ source: [0x1D50F], NFC: [0x1D50F], NFD: [0x1D50F], NFKC: [0x004C], NFKD: [0x004C] }, +{ source: [0x1D510], NFC: [0x1D510], NFD: [0x1D510], NFKC: [0x004D], NFKD: [0x004D] }, +{ source: [0x1D511], NFC: [0x1D511], NFD: [0x1D511], NFKC: [0x004E], NFKD: [0x004E] }, +{ source: [0x1D512], NFC: [0x1D512], NFD: [0x1D512], NFKC: [0x004F], NFKD: [0x004F] }, +{ source: [0x1D513], NFC: [0x1D513], NFD: [0x1D513], NFKC: [0x0050], NFKD: [0x0050] }, +{ source: [0x1D514], NFC: [0x1D514], NFD: [0x1D514], NFKC: [0x0051], NFKD: [0x0051] }, +{ source: [0x1D516], NFC: [0x1D516], NFD: [0x1D516], NFKC: [0x0053], NFKD: [0x0053] }, +{ source: [0x1D517], NFC: [0x1D517], NFD: [0x1D517], NFKC: [0x0054], NFKD: [0x0054] }, +{ source: [0x1D518], NFC: [0x1D518], NFD: [0x1D518], NFKC: [0x0055], NFKD: [0x0055] }, +{ source: [0x1D519], NFC: [0x1D519], NFD: [0x1D519], NFKC: [0x0056], NFKD: [0x0056] }, +{ source: [0x1D51A], NFC: [0x1D51A], NFD: [0x1D51A], NFKC: [0x0057], NFKD: [0x0057] }, +{ source: [0x1D51B], NFC: [0x1D51B], NFD: [0x1D51B], NFKC: [0x0058], NFKD: [0x0058] }, +{ source: [0x1D51C], NFC: [0x1D51C], NFD: [0x1D51C], NFKC: [0x0059], NFKD: [0x0059] }, +{ source: [0x1D51E], NFC: [0x1D51E], NFD: [0x1D51E], NFKC: [0x0061], NFKD: [0x0061] }, +{ source: [0x1D51F], NFC: [0x1D51F], NFD: [0x1D51F], NFKC: [0x0062], NFKD: [0x0062] }, +{ source: [0x1D520], NFC: [0x1D520], NFD: [0x1D520], NFKC: [0x0063], NFKD: [0x0063] }, +{ source: [0x1D521], NFC: [0x1D521], NFD: [0x1D521], NFKC: [0x0064], NFKD: [0x0064] }, +{ source: [0x1D522], NFC: [0x1D522], NFD: [0x1D522], NFKC: [0x0065], NFKD: [0x0065] }, +{ source: [0x1D523], NFC: [0x1D523], NFD: [0x1D523], NFKC: [0x0066], NFKD: [0x0066] }, +{ source: [0x1D524], NFC: [0x1D524], NFD: [0x1D524], NFKC: [0x0067], NFKD: [0x0067] }, +{ source: [0x1D525], NFC: [0x1D525], NFD: [0x1D525], NFKC: [0x0068], NFKD: [0x0068] }, +{ source: [0x1D526], NFC: [0x1D526], NFD: [0x1D526], NFKC: [0x0069], NFKD: [0x0069] }, +{ source: [0x1D527], NFC: [0x1D527], NFD: [0x1D527], NFKC: [0x006A], NFKD: [0x006A] }, +{ source: [0x1D528], NFC: [0x1D528], NFD: [0x1D528], NFKC: [0x006B], NFKD: [0x006B] }, +{ source: [0x1D529], NFC: [0x1D529], NFD: [0x1D529], NFKC: [0x006C], NFKD: [0x006C] }, +{ source: [0x1D52A], NFC: [0x1D52A], NFD: [0x1D52A], NFKC: [0x006D], NFKD: [0x006D] }, +{ source: [0x1D52B], NFC: [0x1D52B], NFD: [0x1D52B], NFKC: [0x006E], NFKD: [0x006E] }, +{ source: [0x1D52C], NFC: [0x1D52C], NFD: [0x1D52C], NFKC: [0x006F], NFKD: [0x006F] }, +{ source: [0x1D52D], NFC: [0x1D52D], NFD: [0x1D52D], NFKC: [0x0070], NFKD: [0x0070] }, +{ source: [0x1D52E], NFC: [0x1D52E], NFD: [0x1D52E], NFKC: [0x0071], NFKD: [0x0071] }, +{ source: [0x1D52F], NFC: [0x1D52F], NFD: [0x1D52F], NFKC: [0x0072], NFKD: [0x0072] }, +{ source: [0x1D530], NFC: [0x1D530], NFD: [0x1D530], NFKC: [0x0073], NFKD: [0x0073] }, +{ source: [0x1D531], NFC: [0x1D531], NFD: [0x1D531], NFKC: [0x0074], NFKD: [0x0074] }, +{ source: [0x1D532], NFC: [0x1D532], NFD: [0x1D532], NFKC: [0x0075], NFKD: [0x0075] }, +{ source: [0x1D533], NFC: [0x1D533], NFD: [0x1D533], NFKC: [0x0076], NFKD: [0x0076] }, +{ source: [0x1D534], NFC: [0x1D534], NFD: [0x1D534], NFKC: [0x0077], NFKD: [0x0077] }, +{ source: [0x1D535], NFC: [0x1D535], NFD: [0x1D535], NFKC: [0x0078], NFKD: [0x0078] }, +{ source: [0x1D536], NFC: [0x1D536], NFD: [0x1D536], NFKC: [0x0079], NFKD: [0x0079] }, +{ source: [0x1D537], NFC: [0x1D537], NFD: [0x1D537], NFKC: [0x007A], NFKD: [0x007A] }, +{ source: [0x1D538], NFC: [0x1D538], NFD: [0x1D538], NFKC: [0x0041], NFKD: [0x0041] }, +{ source: [0x1D539], NFC: [0x1D539], NFD: [0x1D539], NFKC: [0x0042], NFKD: [0x0042] }, +{ source: [0x1D53B], NFC: [0x1D53B], NFD: [0x1D53B], NFKC: [0x0044], NFKD: [0x0044] }, +{ source: [0x1D53C], NFC: [0x1D53C], NFD: [0x1D53C], NFKC: [0x0045], NFKD: [0x0045] }, +{ source: [0x1D53D], NFC: [0x1D53D], NFD: [0x1D53D], NFKC: [0x0046], NFKD: [0x0046] }, +{ source: [0x1D53E], NFC: [0x1D53E], NFD: [0x1D53E], NFKC: [0x0047], NFKD: [0x0047] }, +{ source: [0x1D540], NFC: [0x1D540], NFD: [0x1D540], NFKC: [0x0049], NFKD: [0x0049] }, +{ source: [0x1D541], NFC: [0x1D541], NFD: [0x1D541], NFKC: [0x004A], NFKD: [0x004A] }, +{ source: [0x1D542], NFC: [0x1D542], NFD: [0x1D542], NFKC: [0x004B], NFKD: [0x004B] }, +{ source: [0x1D543], NFC: [0x1D543], NFD: [0x1D543], NFKC: [0x004C], NFKD: [0x004C] }, +{ source: [0x1D544], NFC: [0x1D544], NFD: [0x1D544], NFKC: [0x004D], NFKD: [0x004D] }, +{ source: [0x1D546], NFC: [0x1D546], NFD: [0x1D546], NFKC: [0x004F], NFKD: [0x004F] }, +{ source: [0x1D54A], NFC: [0x1D54A], NFD: [0x1D54A], NFKC: [0x0053], NFKD: [0x0053] }, +{ source: [0x1D54B], NFC: [0x1D54B], NFD: [0x1D54B], NFKC: [0x0054], NFKD: [0x0054] }, +{ source: [0x1D54C], NFC: [0x1D54C], NFD: [0x1D54C], NFKC: [0x0055], NFKD: [0x0055] }, +{ source: [0x1D54D], NFC: [0x1D54D], NFD: [0x1D54D], NFKC: [0x0056], NFKD: [0x0056] }, +{ source: [0x1D54E], NFC: [0x1D54E], NFD: [0x1D54E], NFKC: [0x0057], NFKD: [0x0057] }, +{ source: [0x1D54F], NFC: [0x1D54F], NFD: [0x1D54F], NFKC: [0x0058], NFKD: [0x0058] }, +{ source: [0x1D550], NFC: [0x1D550], NFD: [0x1D550], NFKC: [0x0059], NFKD: [0x0059] }, +{ source: [0x1D552], NFC: [0x1D552], NFD: [0x1D552], NFKC: [0x0061], NFKD: [0x0061] }, +{ source: [0x1D553], NFC: [0x1D553], NFD: [0x1D553], NFKC: [0x0062], NFKD: [0x0062] }, +{ source: [0x1D554], NFC: [0x1D554], NFD: [0x1D554], NFKC: [0x0063], NFKD: [0x0063] }, +{ source: [0x1D555], NFC: [0x1D555], NFD: [0x1D555], NFKC: [0x0064], NFKD: [0x0064] }, +{ source: [0x1D556], NFC: [0x1D556], NFD: [0x1D556], NFKC: [0x0065], NFKD: [0x0065] }, +{ source: [0x1D557], NFC: [0x1D557], NFD: [0x1D557], NFKC: [0x0066], NFKD: [0x0066] }, +{ source: [0x1D558], NFC: [0x1D558], NFD: [0x1D558], NFKC: [0x0067], NFKD: [0x0067] }, +{ source: [0x1D559], NFC: [0x1D559], NFD: [0x1D559], NFKC: [0x0068], NFKD: [0x0068] }, +{ source: [0x1D55A], NFC: [0x1D55A], NFD: [0x1D55A], NFKC: [0x0069], NFKD: [0x0069] }, +{ source: [0x1D55B], NFC: [0x1D55B], NFD: [0x1D55B], NFKC: [0x006A], NFKD: [0x006A] }, +{ source: [0x1D55C], NFC: [0x1D55C], NFD: [0x1D55C], NFKC: [0x006B], NFKD: [0x006B] }, +{ source: [0x1D55D], NFC: [0x1D55D], NFD: [0x1D55D], NFKC: [0x006C], NFKD: [0x006C] }, +{ source: [0x1D55E], NFC: [0x1D55E], NFD: [0x1D55E], NFKC: [0x006D], NFKD: [0x006D] }, +{ source: [0x1D55F], NFC: [0x1D55F], NFD: [0x1D55F], NFKC: [0x006E], NFKD: [0x006E] }, +{ source: [0x1D560], NFC: [0x1D560], NFD: [0x1D560], NFKC: [0x006F], NFKD: [0x006F] }, +{ source: [0x1D561], NFC: [0x1D561], NFD: [0x1D561], NFKC: [0x0070], NFKD: [0x0070] }, +{ source: [0x1D562], NFC: [0x1D562], NFD: [0x1D562], NFKC: [0x0071], NFKD: [0x0071] }, +{ source: [0x1D563], NFC: [0x1D563], NFD: [0x1D563], NFKC: [0x0072], NFKD: [0x0072] }, +{ source: [0x1D564], NFC: [0x1D564], NFD: [0x1D564], NFKC: [0x0073], NFKD: [0x0073] }, +{ source: [0x1D565], NFC: [0x1D565], NFD: [0x1D565], NFKC: [0x0074], NFKD: [0x0074] }, +{ source: [0x1D566], NFC: [0x1D566], NFD: [0x1D566], NFKC: [0x0075], NFKD: [0x0075] }, +{ source: [0x1D567], NFC: [0x1D567], NFD: [0x1D567], NFKC: [0x0076], NFKD: [0x0076] }, +{ source: [0x1D568], NFC: [0x1D568], NFD: [0x1D568], NFKC: [0x0077], NFKD: [0x0077] }, +{ source: [0x1D569], NFC: [0x1D569], NFD: [0x1D569], NFKC: [0x0078], NFKD: [0x0078] }, +{ source: [0x1D56A], NFC: [0x1D56A], NFD: [0x1D56A], NFKC: [0x0079], NFKD: [0x0079] }, +{ source: [0x1D56B], NFC: [0x1D56B], NFD: [0x1D56B], NFKC: [0x007A], NFKD: [0x007A] }, +{ source: [0x1D56C], NFC: [0x1D56C], NFD: [0x1D56C], NFKC: [0x0041], NFKD: [0x0041] }, +{ source: [0x1D56D], NFC: [0x1D56D], NFD: [0x1D56D], NFKC: [0x0042], NFKD: [0x0042] }, +{ source: [0x1D56E], NFC: [0x1D56E], NFD: [0x1D56E], NFKC: [0x0043], NFKD: [0x0043] }, +{ source: [0x1D56F], NFC: [0x1D56F], NFD: [0x1D56F], NFKC: [0x0044], NFKD: [0x0044] }, +{ source: [0x1D570], NFC: [0x1D570], NFD: [0x1D570], NFKC: [0x0045], NFKD: [0x0045] }, +{ source: [0x1D571], NFC: [0x1D571], NFD: [0x1D571], NFKC: [0x0046], NFKD: [0x0046] }, +{ source: [0x1D572], NFC: [0x1D572], NFD: [0x1D572], NFKC: [0x0047], NFKD: [0x0047] }, +{ source: [0x1D573], NFC: [0x1D573], NFD: [0x1D573], NFKC: [0x0048], NFKD: [0x0048] }, +{ source: [0x1D574], NFC: [0x1D574], NFD: [0x1D574], NFKC: [0x0049], NFKD: [0x0049] }, +{ source: [0x1D575], NFC: [0x1D575], NFD: [0x1D575], NFKC: [0x004A], NFKD: [0x004A] }, +{ source: [0x1D576], NFC: [0x1D576], NFD: [0x1D576], NFKC: [0x004B], NFKD: [0x004B] }, +{ source: [0x1D577], NFC: [0x1D577], NFD: [0x1D577], NFKC: [0x004C], NFKD: [0x004C] }, +{ source: [0x1D578], NFC: [0x1D578], NFD: [0x1D578], NFKC: [0x004D], NFKD: [0x004D] }, +{ source: [0x1D579], NFC: [0x1D579], NFD: [0x1D579], NFKC: [0x004E], NFKD: [0x004E] }, +{ source: [0x1D57A], NFC: [0x1D57A], NFD: [0x1D57A], NFKC: [0x004F], NFKD: [0x004F] }, +{ source: [0x1D57B], NFC: [0x1D57B], NFD: [0x1D57B], NFKC: [0x0050], NFKD: [0x0050] }, +{ source: [0x1D57C], NFC: [0x1D57C], NFD: [0x1D57C], NFKC: [0x0051], NFKD: [0x0051] }, +{ source: [0x1D57D], NFC: [0x1D57D], NFD: [0x1D57D], NFKC: [0x0052], NFKD: [0x0052] }, +{ source: [0x1D57E], NFC: [0x1D57E], NFD: [0x1D57E], NFKC: [0x0053], NFKD: [0x0053] }, +{ source: [0x1D57F], NFC: [0x1D57F], NFD: [0x1D57F], NFKC: [0x0054], NFKD: [0x0054] }, +{ source: [0x1D580], NFC: [0x1D580], NFD: [0x1D580], NFKC: [0x0055], NFKD: [0x0055] }, +{ source: [0x1D581], NFC: [0x1D581], NFD: [0x1D581], NFKC: [0x0056], NFKD: [0x0056] }, +{ source: [0x1D582], NFC: [0x1D582], NFD: [0x1D582], NFKC: [0x0057], NFKD: [0x0057] }, +{ source: [0x1D583], NFC: [0x1D583], NFD: [0x1D583], NFKC: [0x0058], NFKD: [0x0058] }, +{ source: [0x1D584], NFC: [0x1D584], NFD: [0x1D584], NFKC: [0x0059], NFKD: [0x0059] }, +{ source: [0x1D585], NFC: [0x1D585], NFD: [0x1D585], NFKC: [0x005A], NFKD: [0x005A] }, +{ source: [0x1D586], NFC: [0x1D586], NFD: [0x1D586], NFKC: [0x0061], NFKD: [0x0061] }, +{ source: [0x1D587], NFC: [0x1D587], NFD: [0x1D587], NFKC: [0x0062], NFKD: [0x0062] }, +{ source: [0x1D588], NFC: [0x1D588], NFD: [0x1D588], NFKC: [0x0063], NFKD: [0x0063] }, +{ source: [0x1D589], NFC: [0x1D589], NFD: [0x1D589], NFKC: [0x0064], NFKD: [0x0064] }, +{ source: [0x1D58A], NFC: [0x1D58A], NFD: [0x1D58A], NFKC: [0x0065], NFKD: [0x0065] }, +{ source: [0x1D58B], NFC: [0x1D58B], NFD: [0x1D58B], NFKC: [0x0066], NFKD: [0x0066] }, +{ source: [0x1D58C], NFC: [0x1D58C], NFD: [0x1D58C], NFKC: [0x0067], NFKD: [0x0067] }, +{ source: [0x1D58D], NFC: [0x1D58D], NFD: [0x1D58D], NFKC: [0x0068], NFKD: [0x0068] }, +{ source: [0x1D58E], NFC: [0x1D58E], NFD: [0x1D58E], NFKC: [0x0069], NFKD: [0x0069] }, +{ source: [0x1D58F], NFC: [0x1D58F], NFD: [0x1D58F], NFKC: [0x006A], NFKD: [0x006A] }, +{ source: [0x1D590], NFC: [0x1D590], NFD: [0x1D590], NFKC: [0x006B], NFKD: [0x006B] }, +{ source: [0x1D591], NFC: [0x1D591], NFD: [0x1D591], NFKC: [0x006C], NFKD: [0x006C] }, +{ source: [0x1D592], NFC: [0x1D592], NFD: [0x1D592], NFKC: [0x006D], NFKD: [0x006D] }, +{ source: [0x1D593], NFC: [0x1D593], NFD: [0x1D593], NFKC: [0x006E], NFKD: [0x006E] }, +{ source: [0x1D594], NFC: [0x1D594], NFD: [0x1D594], NFKC: [0x006F], NFKD: [0x006F] }, +{ source: [0x1D595], NFC: [0x1D595], NFD: [0x1D595], NFKC: [0x0070], NFKD: [0x0070] }, +{ source: [0x1D596], NFC: [0x1D596], NFD: [0x1D596], NFKC: [0x0071], NFKD: [0x0071] }, +{ source: [0x1D597], NFC: [0x1D597], NFD: [0x1D597], NFKC: [0x0072], NFKD: [0x0072] }, +{ source: [0x1D598], NFC: [0x1D598], NFD: [0x1D598], NFKC: [0x0073], NFKD: [0x0073] }, +{ source: [0x1D599], NFC: [0x1D599], NFD: [0x1D599], NFKC: [0x0074], NFKD: [0x0074] }, +{ source: [0x1D59A], NFC: [0x1D59A], NFD: [0x1D59A], NFKC: [0x0075], NFKD: [0x0075] }, +{ source: [0x1D59B], NFC: [0x1D59B], NFD: [0x1D59B], NFKC: [0x0076], NFKD: [0x0076] }, +{ source: [0x1D59C], NFC: [0x1D59C], NFD: [0x1D59C], NFKC: [0x0077], NFKD: [0x0077] }, +{ source: [0x1D59D], NFC: [0x1D59D], NFD: [0x1D59D], NFKC: [0x0078], NFKD: [0x0078] }, +{ source: [0x1D59E], NFC: [0x1D59E], NFD: [0x1D59E], NFKC: [0x0079], NFKD: [0x0079] }, +{ source: [0x1D59F], NFC: [0x1D59F], NFD: [0x1D59F], NFKC: [0x007A], NFKD: [0x007A] }, +{ source: [0x1D5A0], NFC: [0x1D5A0], NFD: [0x1D5A0], NFKC: [0x0041], NFKD: [0x0041] }, +{ source: [0x1D5A1], NFC: [0x1D5A1], NFD: [0x1D5A1], NFKC: [0x0042], NFKD: [0x0042] }, +{ source: [0x1D5A2], NFC: [0x1D5A2], NFD: [0x1D5A2], NFKC: [0x0043], NFKD: [0x0043] }, +{ source: [0x1D5A3], NFC: [0x1D5A3], NFD: [0x1D5A3], NFKC: [0x0044], NFKD: [0x0044] }, +{ source: [0x1D5A4], NFC: [0x1D5A4], NFD: [0x1D5A4], NFKC: [0x0045], NFKD: [0x0045] }, +{ source: [0x1D5A5], NFC: [0x1D5A5], NFD: [0x1D5A5], NFKC: [0x0046], NFKD: [0x0046] }, +{ source: [0x1D5A6], NFC: [0x1D5A6], NFD: [0x1D5A6], NFKC: [0x0047], NFKD: [0x0047] }, +{ source: [0x1D5A7], NFC: [0x1D5A7], NFD: [0x1D5A7], NFKC: [0x0048], NFKD: [0x0048] }, +{ source: [0x1D5A8], NFC: [0x1D5A8], NFD: [0x1D5A8], NFKC: [0x0049], NFKD: [0x0049] }, +{ source: [0x1D5A9], NFC: [0x1D5A9], NFD: [0x1D5A9], NFKC: [0x004A], NFKD: [0x004A] }, +{ source: [0x1D5AA], NFC: [0x1D5AA], NFD: [0x1D5AA], NFKC: [0x004B], NFKD: [0x004B] }, +{ source: [0x1D5AB], NFC: [0x1D5AB], NFD: [0x1D5AB], NFKC: [0x004C], NFKD: [0x004C] }, +{ source: [0x1D5AC], NFC: [0x1D5AC], NFD: [0x1D5AC], NFKC: [0x004D], NFKD: [0x004D] }, +{ source: [0x1D5AD], NFC: [0x1D5AD], NFD: [0x1D5AD], NFKC: [0x004E], NFKD: [0x004E] }, +{ source: [0x1D5AE], NFC: [0x1D5AE], NFD: [0x1D5AE], NFKC: [0x004F], NFKD: [0x004F] }, +{ source: [0x1D5AF], NFC: [0x1D5AF], NFD: [0x1D5AF], NFKC: [0x0050], NFKD: [0x0050] }, +{ source: [0x1D5B0], NFC: [0x1D5B0], NFD: [0x1D5B0], NFKC: [0x0051], NFKD: [0x0051] }, +{ source: [0x1D5B1], NFC: [0x1D5B1], NFD: [0x1D5B1], NFKC: [0x0052], NFKD: [0x0052] }, +{ source: [0x1D5B2], NFC: [0x1D5B2], NFD: [0x1D5B2], NFKC: [0x0053], NFKD: [0x0053] }, +{ source: [0x1D5B3], NFC: [0x1D5B3], NFD: [0x1D5B3], NFKC: [0x0054], NFKD: [0x0054] }, +{ source: [0x1D5B4], NFC: [0x1D5B4], NFD: [0x1D5B4], NFKC: [0x0055], NFKD: [0x0055] }, +{ source: [0x1D5B5], NFC: [0x1D5B5], NFD: [0x1D5B5], NFKC: [0x0056], NFKD: [0x0056] }, +{ source: [0x1D5B6], NFC: [0x1D5B6], NFD: [0x1D5B6], NFKC: [0x0057], NFKD: [0x0057] }, +{ source: [0x1D5B7], NFC: [0x1D5B7], NFD: [0x1D5B7], NFKC: [0x0058], NFKD: [0x0058] }, +{ source: [0x1D5B8], NFC: [0x1D5B8], NFD: [0x1D5B8], NFKC: [0x0059], NFKD: [0x0059] }, +{ source: [0x1D5B9], NFC: [0x1D5B9], NFD: [0x1D5B9], NFKC: [0x005A], NFKD: [0x005A] }, +{ source: [0x1D5BA], NFC: [0x1D5BA], NFD: [0x1D5BA], NFKC: [0x0061], NFKD: [0x0061] }, +{ source: [0x1D5BB], NFC: [0x1D5BB], NFD: [0x1D5BB], NFKC: [0x0062], NFKD: [0x0062] }, +{ source: [0x1D5BC], NFC: [0x1D5BC], NFD: [0x1D5BC], NFKC: [0x0063], NFKD: [0x0063] }, +{ source: [0x1D5BD], NFC: [0x1D5BD], NFD: [0x1D5BD], NFKC: [0x0064], NFKD: [0x0064] }, +{ source: [0x1D5BE], NFC: [0x1D5BE], NFD: [0x1D5BE], NFKC: [0x0065], NFKD: [0x0065] }, +{ source: [0x1D5BF], NFC: [0x1D5BF], NFD: [0x1D5BF], NFKC: [0x0066], NFKD: [0x0066] }, +{ source: [0x1D5C0], NFC: [0x1D5C0], NFD: [0x1D5C0], NFKC: [0x0067], NFKD: [0x0067] }, +{ source: [0x1D5C1], NFC: [0x1D5C1], NFD: [0x1D5C1], NFKC: [0x0068], NFKD: [0x0068] }, +{ source: [0x1D5C2], NFC: [0x1D5C2], NFD: [0x1D5C2], NFKC: [0x0069], NFKD: [0x0069] }, +{ source: [0x1D5C3], NFC: [0x1D5C3], NFD: [0x1D5C3], NFKC: [0x006A], NFKD: [0x006A] }, +{ source: [0x1D5C4], NFC: [0x1D5C4], NFD: [0x1D5C4], NFKC: [0x006B], NFKD: [0x006B] }, +{ source: [0x1D5C5], NFC: [0x1D5C5], NFD: [0x1D5C5], NFKC: [0x006C], NFKD: [0x006C] }, +{ source: [0x1D5C6], NFC: [0x1D5C6], NFD: [0x1D5C6], NFKC: [0x006D], NFKD: [0x006D] }, +{ source: [0x1D5C7], NFC: [0x1D5C7], NFD: [0x1D5C7], NFKC: [0x006E], NFKD: [0x006E] }, +{ source: [0x1D5C8], NFC: [0x1D5C8], NFD: [0x1D5C8], NFKC: [0x006F], NFKD: [0x006F] }, +{ source: [0x1D5C9], NFC: [0x1D5C9], NFD: [0x1D5C9], NFKC: [0x0070], NFKD: [0x0070] }, +{ source: [0x1D5CA], NFC: [0x1D5CA], NFD: [0x1D5CA], NFKC: [0x0071], NFKD: [0x0071] }, +{ source: [0x1D5CB], NFC: [0x1D5CB], NFD: [0x1D5CB], NFKC: [0x0072], NFKD: [0x0072] }, +{ source: [0x1D5CC], NFC: [0x1D5CC], NFD: [0x1D5CC], NFKC: [0x0073], NFKD: [0x0073] }, +{ source: [0x1D5CD], NFC: [0x1D5CD], NFD: [0x1D5CD], NFKC: [0x0074], NFKD: [0x0074] }, +{ source: [0x1D5CE], NFC: [0x1D5CE], NFD: [0x1D5CE], NFKC: [0x0075], NFKD: [0x0075] }, +{ source: [0x1D5CF], NFC: [0x1D5CF], NFD: [0x1D5CF], NFKC: [0x0076], NFKD: [0x0076] }, +{ source: [0x1D5D0], NFC: [0x1D5D0], NFD: [0x1D5D0], NFKC: [0x0077], NFKD: [0x0077] }, +{ source: [0x1D5D1], NFC: [0x1D5D1], NFD: [0x1D5D1], NFKC: [0x0078], NFKD: [0x0078] }, +{ source: [0x1D5D2], NFC: [0x1D5D2], NFD: [0x1D5D2], NFKC: [0x0079], NFKD: [0x0079] }, +{ source: [0x1D5D3], NFC: [0x1D5D3], NFD: [0x1D5D3], NFKC: [0x007A], NFKD: [0x007A] }, +{ source: [0x1D5D4], NFC: [0x1D5D4], NFD: [0x1D5D4], NFKC: [0x0041], NFKD: [0x0041] }, +{ source: [0x1D5D5], NFC: [0x1D5D5], NFD: [0x1D5D5], NFKC: [0x0042], NFKD: [0x0042] }, +{ source: [0x1D5D6], NFC: [0x1D5D6], NFD: [0x1D5D6], NFKC: [0x0043], NFKD: [0x0043] }, +{ source: [0x1D5D7], NFC: [0x1D5D7], NFD: [0x1D5D7], NFKC: [0x0044], NFKD: [0x0044] }, +{ source: [0x1D5D8], NFC: [0x1D5D8], NFD: [0x1D5D8], NFKC: [0x0045], NFKD: [0x0045] }, +{ source: [0x1D5D9], NFC: [0x1D5D9], NFD: [0x1D5D9], NFKC: [0x0046], NFKD: [0x0046] }, +{ source: [0x1D5DA], NFC: [0x1D5DA], NFD: [0x1D5DA], NFKC: [0x0047], NFKD: [0x0047] }, +{ source: [0x1D5DB], NFC: [0x1D5DB], NFD: [0x1D5DB], NFKC: [0x0048], NFKD: [0x0048] }, +{ source: [0x1D5DC], NFC: [0x1D5DC], NFD: [0x1D5DC], NFKC: [0x0049], NFKD: [0x0049] }, +{ source: [0x1D5DD], NFC: [0x1D5DD], NFD: [0x1D5DD], NFKC: [0x004A], NFKD: [0x004A] }, +{ source: [0x1D5DE], NFC: [0x1D5DE], NFD: [0x1D5DE], NFKC: [0x004B], NFKD: [0x004B] }, +{ source: [0x1D5DF], NFC: [0x1D5DF], NFD: [0x1D5DF], NFKC: [0x004C], NFKD: [0x004C] }, +{ source: [0x1D5E0], NFC: [0x1D5E0], NFD: [0x1D5E0], NFKC: [0x004D], NFKD: [0x004D] }, +{ source: [0x1D5E1], NFC: [0x1D5E1], NFD: [0x1D5E1], NFKC: [0x004E], NFKD: [0x004E] }, +{ source: [0x1D5E2], NFC: [0x1D5E2], NFD: [0x1D5E2], NFKC: [0x004F], NFKD: [0x004F] }, +{ source: [0x1D5E3], NFC: [0x1D5E3], NFD: [0x1D5E3], NFKC: [0x0050], NFKD: [0x0050] }, +{ source: [0x1D5E4], NFC: [0x1D5E4], NFD: [0x1D5E4], NFKC: [0x0051], NFKD: [0x0051] }, +{ source: [0x1D5E5], NFC: [0x1D5E5], NFD: [0x1D5E5], NFKC: [0x0052], NFKD: [0x0052] }, +{ source: [0x1D5E6], NFC: [0x1D5E6], NFD: [0x1D5E6], NFKC: [0x0053], NFKD: [0x0053] }, +{ source: [0x1D5E7], NFC: [0x1D5E7], NFD: [0x1D5E7], NFKC: [0x0054], NFKD: [0x0054] }, +{ source: [0x1D5E8], NFC: [0x1D5E8], NFD: [0x1D5E8], NFKC: [0x0055], NFKD: [0x0055] }, +{ source: [0x1D5E9], NFC: [0x1D5E9], NFD: [0x1D5E9], NFKC: [0x0056], NFKD: [0x0056] }, +{ source: [0x1D5EA], NFC: [0x1D5EA], NFD: [0x1D5EA], NFKC: [0x0057], NFKD: [0x0057] }, +{ source: [0x1D5EB], NFC: [0x1D5EB], NFD: [0x1D5EB], NFKC: [0x0058], NFKD: [0x0058] }, +{ source: [0x1D5EC], NFC: [0x1D5EC], NFD: [0x1D5EC], NFKC: [0x0059], NFKD: [0x0059] }, +{ source: [0x1D5ED], NFC: [0x1D5ED], NFD: [0x1D5ED], NFKC: [0x005A], NFKD: [0x005A] }, +{ source: [0x1D5EE], NFC: [0x1D5EE], NFD: [0x1D5EE], NFKC: [0x0061], NFKD: [0x0061] }, +{ source: [0x1D5EF], NFC: [0x1D5EF], NFD: [0x1D5EF], NFKC: [0x0062], NFKD: [0x0062] }, +{ source: [0x1D5F0], NFC: [0x1D5F0], NFD: [0x1D5F0], NFKC: [0x0063], NFKD: [0x0063] }, +{ source: [0x1D5F1], NFC: [0x1D5F1], NFD: [0x1D5F1], NFKC: [0x0064], NFKD: [0x0064] }, +{ source: [0x1D5F2], NFC: [0x1D5F2], NFD: [0x1D5F2], NFKC: [0x0065], NFKD: [0x0065] }, +{ source: [0x1D5F3], NFC: [0x1D5F3], NFD: [0x1D5F3], NFKC: [0x0066], NFKD: [0x0066] }, +{ source: [0x1D5F4], NFC: [0x1D5F4], NFD: [0x1D5F4], NFKC: [0x0067], NFKD: [0x0067] }, +{ source: [0x1D5F5], NFC: [0x1D5F5], NFD: [0x1D5F5], NFKC: [0x0068], NFKD: [0x0068] }, +{ source: [0x1D5F6], NFC: [0x1D5F6], NFD: [0x1D5F6], NFKC: [0x0069], NFKD: [0x0069] }, +{ source: [0x1D5F7], NFC: [0x1D5F7], NFD: [0x1D5F7], NFKC: [0x006A], NFKD: [0x006A] }, +{ source: [0x1D5F8], NFC: [0x1D5F8], NFD: [0x1D5F8], NFKC: [0x006B], NFKD: [0x006B] }, +{ source: [0x1D5F9], NFC: [0x1D5F9], NFD: [0x1D5F9], NFKC: [0x006C], NFKD: [0x006C] }, +{ source: [0x1D5FA], NFC: [0x1D5FA], NFD: [0x1D5FA], NFKC: [0x006D], NFKD: [0x006D] }, +{ source: [0x1D5FB], NFC: [0x1D5FB], NFD: [0x1D5FB], NFKC: [0x006E], NFKD: [0x006E] }, +{ source: [0x1D5FC], NFC: [0x1D5FC], NFD: [0x1D5FC], NFKC: [0x006F], NFKD: [0x006F] }, +{ source: [0x1D5FD], NFC: [0x1D5FD], NFD: [0x1D5FD], NFKC: [0x0070], NFKD: [0x0070] }, +{ source: [0x1D5FE], NFC: [0x1D5FE], NFD: [0x1D5FE], NFKC: [0x0071], NFKD: [0x0071] }, +{ source: [0x1D5FF], NFC: [0x1D5FF], NFD: [0x1D5FF], NFKC: [0x0072], NFKD: [0x0072] }, +{ source: [0x1D600], NFC: [0x1D600], NFD: [0x1D600], NFKC: [0x0073], NFKD: [0x0073] }, +{ source: [0x1D601], NFC: [0x1D601], NFD: [0x1D601], NFKC: [0x0074], NFKD: [0x0074] }, +{ source: [0x1D602], NFC: [0x1D602], NFD: [0x1D602], NFKC: [0x0075], NFKD: [0x0075] }, +{ source: [0x1D603], NFC: [0x1D603], NFD: [0x1D603], NFKC: [0x0076], NFKD: [0x0076] }, +{ source: [0x1D604], NFC: [0x1D604], NFD: [0x1D604], NFKC: [0x0077], NFKD: [0x0077] }, +{ source: [0x1D605], NFC: [0x1D605], NFD: [0x1D605], NFKC: [0x0078], NFKD: [0x0078] }, +{ source: [0x1D606], NFC: [0x1D606], NFD: [0x1D606], NFKC: [0x0079], NFKD: [0x0079] }, +{ source: [0x1D607], NFC: [0x1D607], NFD: [0x1D607], NFKC: [0x007A], NFKD: [0x007A] }, +{ source: [0x1D608], NFC: [0x1D608], NFD: [0x1D608], NFKC: [0x0041], NFKD: [0x0041] }, +{ source: [0x1D609], NFC: [0x1D609], NFD: [0x1D609], NFKC: [0x0042], NFKD: [0x0042] }, +{ source: [0x1D60A], NFC: [0x1D60A], NFD: [0x1D60A], NFKC: [0x0043], NFKD: [0x0043] }, +{ source: [0x1D60B], NFC: [0x1D60B], NFD: [0x1D60B], NFKC: [0x0044], NFKD: [0x0044] }, +{ source: [0x1D60C], NFC: [0x1D60C], NFD: [0x1D60C], NFKC: [0x0045], NFKD: [0x0045] }, +{ source: [0x1D60D], NFC: [0x1D60D], NFD: [0x1D60D], NFKC: [0x0046], NFKD: [0x0046] }, +{ source: [0x1D60E], NFC: [0x1D60E], NFD: [0x1D60E], NFKC: [0x0047], NFKD: [0x0047] }, +{ source: [0x1D60F], NFC: [0x1D60F], NFD: [0x1D60F], NFKC: [0x0048], NFKD: [0x0048] }, +{ source: [0x1D610], NFC: [0x1D610], NFD: [0x1D610], NFKC: [0x0049], NFKD: [0x0049] }, +{ source: [0x1D611], NFC: [0x1D611], NFD: [0x1D611], NFKC: [0x004A], NFKD: [0x004A] }, +{ source: [0x1D612], NFC: [0x1D612], NFD: [0x1D612], NFKC: [0x004B], NFKD: [0x004B] }, +{ source: [0x1D613], NFC: [0x1D613], NFD: [0x1D613], NFKC: [0x004C], NFKD: [0x004C] }, +{ source: [0x1D614], NFC: [0x1D614], NFD: [0x1D614], NFKC: [0x004D], NFKD: [0x004D] }, +{ source: [0x1D615], NFC: [0x1D615], NFD: [0x1D615], NFKC: [0x004E], NFKD: [0x004E] }, +{ source: [0x1D616], NFC: [0x1D616], NFD: [0x1D616], NFKC: [0x004F], NFKD: [0x004F] }, +{ source: [0x1D617], NFC: [0x1D617], NFD: [0x1D617], NFKC: [0x0050], NFKD: [0x0050] }, +{ source: [0x1D618], NFC: [0x1D618], NFD: [0x1D618], NFKC: [0x0051], NFKD: [0x0051] }, +{ source: [0x1D619], NFC: [0x1D619], NFD: [0x1D619], NFKC: [0x0052], NFKD: [0x0052] }, +{ source: [0x1D61A], NFC: [0x1D61A], NFD: [0x1D61A], NFKC: [0x0053], NFKD: [0x0053] }, +{ source: [0x1D61B], NFC: [0x1D61B], NFD: [0x1D61B], NFKC: [0x0054], NFKD: [0x0054] }, +{ source: [0x1D61C], NFC: [0x1D61C], NFD: [0x1D61C], NFKC: [0x0055], NFKD: [0x0055] }, +{ source: [0x1D61D], NFC: [0x1D61D], NFD: [0x1D61D], NFKC: [0x0056], NFKD: [0x0056] }, +{ source: [0x1D61E], NFC: [0x1D61E], NFD: [0x1D61E], NFKC: [0x0057], NFKD: [0x0057] }, +{ source: [0x1D61F], NFC: [0x1D61F], NFD: [0x1D61F], NFKC: [0x0058], NFKD: [0x0058] }, +{ source: [0x1D620], NFC: [0x1D620], NFD: [0x1D620], NFKC: [0x0059], NFKD: [0x0059] }, +{ source: [0x1D621], NFC: [0x1D621], NFD: [0x1D621], NFKC: [0x005A], NFKD: [0x005A] }, +{ source: [0x1D622], NFC: [0x1D622], NFD: [0x1D622], NFKC: [0x0061], NFKD: [0x0061] }, +{ source: [0x1D623], NFC: [0x1D623], NFD: [0x1D623], NFKC: [0x0062], NFKD: [0x0062] }, +{ source: [0x1D624], NFC: [0x1D624], NFD: [0x1D624], NFKC: [0x0063], NFKD: [0x0063] }, +{ source: [0x1D625], NFC: [0x1D625], NFD: [0x1D625], NFKC: [0x0064], NFKD: [0x0064] }, +{ source: [0x1D626], NFC: [0x1D626], NFD: [0x1D626], NFKC: [0x0065], NFKD: [0x0065] }, +{ source: [0x1D627], NFC: [0x1D627], NFD: [0x1D627], NFKC: [0x0066], NFKD: [0x0066] }, +{ source: [0x1D628], NFC: [0x1D628], NFD: [0x1D628], NFKC: [0x0067], NFKD: [0x0067] }, +{ source: [0x1D629], NFC: [0x1D629], NFD: [0x1D629], NFKC: [0x0068], NFKD: [0x0068] }, +{ source: [0x1D62A], NFC: [0x1D62A], NFD: [0x1D62A], NFKC: [0x0069], NFKD: [0x0069] }, +{ source: [0x1D62B], NFC: [0x1D62B], NFD: [0x1D62B], NFKC: [0x006A], NFKD: [0x006A] }, +{ source: [0x1D62C], NFC: [0x1D62C], NFD: [0x1D62C], NFKC: [0x006B], NFKD: [0x006B] }, +{ source: [0x1D62D], NFC: [0x1D62D], NFD: [0x1D62D], NFKC: [0x006C], NFKD: [0x006C] }, +{ source: [0x1D62E], NFC: [0x1D62E], NFD: [0x1D62E], NFKC: [0x006D], NFKD: [0x006D] }, +{ source: [0x1D62F], NFC: [0x1D62F], NFD: [0x1D62F], NFKC: [0x006E], NFKD: [0x006E] }, +{ source: [0x1D630], NFC: [0x1D630], NFD: [0x1D630], NFKC: [0x006F], NFKD: [0x006F] }, +{ source: [0x1D631], NFC: [0x1D631], NFD: [0x1D631], NFKC: [0x0070], NFKD: [0x0070] }, +{ source: [0x1D632], NFC: [0x1D632], NFD: [0x1D632], NFKC: [0x0071], NFKD: [0x0071] }, +{ source: [0x1D633], NFC: [0x1D633], NFD: [0x1D633], NFKC: [0x0072], NFKD: [0x0072] }, +{ source: [0x1D634], NFC: [0x1D634], NFD: [0x1D634], NFKC: [0x0073], NFKD: [0x0073] }, +{ source: [0x1D635], NFC: [0x1D635], NFD: [0x1D635], NFKC: [0x0074], NFKD: [0x0074] }, +{ source: [0x1D636], NFC: [0x1D636], NFD: [0x1D636], NFKC: [0x0075], NFKD: [0x0075] }, +{ source: [0x1D637], NFC: [0x1D637], NFD: [0x1D637], NFKC: [0x0076], NFKD: [0x0076] }, +{ source: [0x1D638], NFC: [0x1D638], NFD: [0x1D638], NFKC: [0x0077], NFKD: [0x0077] }, +{ source: [0x1D639], NFC: [0x1D639], NFD: [0x1D639], NFKC: [0x0078], NFKD: [0x0078] }, +{ source: [0x1D63A], NFC: [0x1D63A], NFD: [0x1D63A], NFKC: [0x0079], NFKD: [0x0079] }, +{ source: [0x1D63B], NFC: [0x1D63B], NFD: [0x1D63B], NFKC: [0x007A], NFKD: [0x007A] }, +{ source: [0x1D63C], NFC: [0x1D63C], NFD: [0x1D63C], NFKC: [0x0041], NFKD: [0x0041] }, +{ source: [0x1D63D], NFC: [0x1D63D], NFD: [0x1D63D], NFKC: [0x0042], NFKD: [0x0042] }, +{ source: [0x1D63E], NFC: [0x1D63E], NFD: [0x1D63E], NFKC: [0x0043], NFKD: [0x0043] }, +{ source: [0x1D63F], NFC: [0x1D63F], NFD: [0x1D63F], NFKC: [0x0044], NFKD: [0x0044] }, +{ source: [0x1D640], NFC: [0x1D640], NFD: [0x1D640], NFKC: [0x0045], NFKD: [0x0045] }, +{ source: [0x1D641], NFC: [0x1D641], NFD: [0x1D641], NFKC: [0x0046], NFKD: [0x0046] }, +{ source: [0x1D642], NFC: [0x1D642], NFD: [0x1D642], NFKC: [0x0047], NFKD: [0x0047] }, +{ source: [0x1D643], NFC: [0x1D643], NFD: [0x1D643], NFKC: [0x0048], NFKD: [0x0048] }, +{ source: [0x1D644], NFC: [0x1D644], NFD: [0x1D644], NFKC: [0x0049], NFKD: [0x0049] }, +{ source: [0x1D645], NFC: [0x1D645], NFD: [0x1D645], NFKC: [0x004A], NFKD: [0x004A] }, +{ source: [0x1D646], NFC: [0x1D646], NFD: [0x1D646], NFKC: [0x004B], NFKD: [0x004B] }, +{ source: [0x1D647], NFC: [0x1D647], NFD: [0x1D647], NFKC: [0x004C], NFKD: [0x004C] }, +{ source: [0x1D648], NFC: [0x1D648], NFD: [0x1D648], NFKC: [0x004D], NFKD: [0x004D] }, +{ source: [0x1D649], NFC: [0x1D649], NFD: [0x1D649], NFKC: [0x004E], NFKD: [0x004E] }, +{ source: [0x1D64A], NFC: [0x1D64A], NFD: [0x1D64A], NFKC: [0x004F], NFKD: [0x004F] }, +{ source: [0x1D64B], NFC: [0x1D64B], NFD: [0x1D64B], NFKC: [0x0050], NFKD: [0x0050] }, +{ source: [0x1D64C], NFC: [0x1D64C], NFD: [0x1D64C], NFKC: [0x0051], NFKD: [0x0051] }, +{ source: [0x1D64D], NFC: [0x1D64D], NFD: [0x1D64D], NFKC: [0x0052], NFKD: [0x0052] }, +{ source: [0x1D64E], NFC: [0x1D64E], NFD: [0x1D64E], NFKC: [0x0053], NFKD: [0x0053] }, +{ source: [0x1D64F], NFC: [0x1D64F], NFD: [0x1D64F], NFKC: [0x0054], NFKD: [0x0054] }, +{ source: [0x1D650], NFC: [0x1D650], NFD: [0x1D650], NFKC: [0x0055], NFKD: [0x0055] }, +{ source: [0x1D651], NFC: [0x1D651], NFD: [0x1D651], NFKC: [0x0056], NFKD: [0x0056] }, +{ source: [0x1D652], NFC: [0x1D652], NFD: [0x1D652], NFKC: [0x0057], NFKD: [0x0057] }, +{ source: [0x1D653], NFC: [0x1D653], NFD: [0x1D653], NFKC: [0x0058], NFKD: [0x0058] }, +{ source: [0x1D654], NFC: [0x1D654], NFD: [0x1D654], NFKC: [0x0059], NFKD: [0x0059] }, +{ source: [0x1D655], NFC: [0x1D655], NFD: [0x1D655], NFKC: [0x005A], NFKD: [0x005A] }, +{ source: [0x1D656], NFC: [0x1D656], NFD: [0x1D656], NFKC: [0x0061], NFKD: [0x0061] }, +{ source: [0x1D657], NFC: [0x1D657], NFD: [0x1D657], NFKC: [0x0062], NFKD: [0x0062] }, +{ source: [0x1D658], NFC: [0x1D658], NFD: [0x1D658], NFKC: [0x0063], NFKD: [0x0063] }, +{ source: [0x1D659], NFC: [0x1D659], NFD: [0x1D659], NFKC: [0x0064], NFKD: [0x0064] }, +{ source: [0x1D65A], NFC: [0x1D65A], NFD: [0x1D65A], NFKC: [0x0065], NFKD: [0x0065] }, +{ source: [0x1D65B], NFC: [0x1D65B], NFD: [0x1D65B], NFKC: [0x0066], NFKD: [0x0066] }, +{ source: [0x1D65C], NFC: [0x1D65C], NFD: [0x1D65C], NFKC: [0x0067], NFKD: [0x0067] }, +{ source: [0x1D65D], NFC: [0x1D65D], NFD: [0x1D65D], NFKC: [0x0068], NFKD: [0x0068] }, +{ source: [0x1D65E], NFC: [0x1D65E], NFD: [0x1D65E], NFKC: [0x0069], NFKD: [0x0069] }, +{ source: [0x1D65F], NFC: [0x1D65F], NFD: [0x1D65F], NFKC: [0x006A], NFKD: [0x006A] }, +{ source: [0x1D660], NFC: [0x1D660], NFD: [0x1D660], NFKC: [0x006B], NFKD: [0x006B] }, +{ source: [0x1D661], NFC: [0x1D661], NFD: [0x1D661], NFKC: [0x006C], NFKD: [0x006C] }, +{ source: [0x1D662], NFC: [0x1D662], NFD: [0x1D662], NFKC: [0x006D], NFKD: [0x006D] }, +{ source: [0x1D663], NFC: [0x1D663], NFD: [0x1D663], NFKC: [0x006E], NFKD: [0x006E] }, +{ source: [0x1D664], NFC: [0x1D664], NFD: [0x1D664], NFKC: [0x006F], NFKD: [0x006F] }, +{ source: [0x1D665], NFC: [0x1D665], NFD: [0x1D665], NFKC: [0x0070], NFKD: [0x0070] }, +{ source: [0x1D666], NFC: [0x1D666], NFD: [0x1D666], NFKC: [0x0071], NFKD: [0x0071] }, +{ source: [0x1D667], NFC: [0x1D667], NFD: [0x1D667], NFKC: [0x0072], NFKD: [0x0072] }, +{ source: [0x1D668], NFC: [0x1D668], NFD: [0x1D668], NFKC: [0x0073], NFKD: [0x0073] }, +{ source: [0x1D669], NFC: [0x1D669], NFD: [0x1D669], NFKC: [0x0074], NFKD: [0x0074] }, +{ source: [0x1D66A], NFC: [0x1D66A], NFD: [0x1D66A], NFKC: [0x0075], NFKD: [0x0075] }, +{ source: [0x1D66B], NFC: [0x1D66B], NFD: [0x1D66B], NFKC: [0x0076], NFKD: [0x0076] }, +{ source: [0x1D66C], NFC: [0x1D66C], NFD: [0x1D66C], NFKC: [0x0077], NFKD: [0x0077] }, +{ source: [0x1D66D], NFC: [0x1D66D], NFD: [0x1D66D], NFKC: [0x0078], NFKD: [0x0078] }, +{ source: [0x1D66E], NFC: [0x1D66E], NFD: [0x1D66E], NFKC: [0x0079], NFKD: [0x0079] }, +{ source: [0x1D66F], NFC: [0x1D66F], NFD: [0x1D66F], NFKC: [0x007A], NFKD: [0x007A] }, +{ source: [0x1D670], NFC: [0x1D670], NFD: [0x1D670], NFKC: [0x0041], NFKD: [0x0041] }, +{ source: [0x1D671], NFC: [0x1D671], NFD: [0x1D671], NFKC: [0x0042], NFKD: [0x0042] }, +{ source: [0x1D672], NFC: [0x1D672], NFD: [0x1D672], NFKC: [0x0043], NFKD: [0x0043] }, +{ source: [0x1D673], NFC: [0x1D673], NFD: [0x1D673], NFKC: [0x0044], NFKD: [0x0044] }, +{ source: [0x1D674], NFC: [0x1D674], NFD: [0x1D674], NFKC: [0x0045], NFKD: [0x0045] }, +{ source: [0x1D675], NFC: [0x1D675], NFD: [0x1D675], NFKC: [0x0046], NFKD: [0x0046] }, +{ source: [0x1D676], NFC: [0x1D676], NFD: [0x1D676], NFKC: [0x0047], NFKD: [0x0047] }, +{ source: [0x1D677], NFC: [0x1D677], NFD: [0x1D677], NFKC: [0x0048], NFKD: [0x0048] }, +{ source: [0x1D678], NFC: [0x1D678], NFD: [0x1D678], NFKC: [0x0049], NFKD: [0x0049] }, +{ source: [0x1D679], NFC: [0x1D679], NFD: [0x1D679], NFKC: [0x004A], NFKD: [0x004A] }, +{ source: [0x1D67A], NFC: [0x1D67A], NFD: [0x1D67A], NFKC: [0x004B], NFKD: [0x004B] }, +{ source: [0x1D67B], NFC: [0x1D67B], NFD: [0x1D67B], NFKC: [0x004C], NFKD: [0x004C] }, +{ source: [0x1D67C], NFC: [0x1D67C], NFD: [0x1D67C], NFKC: [0x004D], NFKD: [0x004D] }, +{ source: [0x1D67D], NFC: [0x1D67D], NFD: [0x1D67D], NFKC: [0x004E], NFKD: [0x004E] }, +{ source: [0x1D67E], NFC: [0x1D67E], NFD: [0x1D67E], NFKC: [0x004F], NFKD: [0x004F] }, +{ source: [0x1D67F], NFC: [0x1D67F], NFD: [0x1D67F], NFKC: [0x0050], NFKD: [0x0050] }, +{ source: [0x1D680], NFC: [0x1D680], NFD: [0x1D680], NFKC: [0x0051], NFKD: [0x0051] }, +{ source: [0x1D681], NFC: [0x1D681], NFD: [0x1D681], NFKC: [0x0052], NFKD: [0x0052] }, +{ source: [0x1D682], NFC: [0x1D682], NFD: [0x1D682], NFKC: [0x0053], NFKD: [0x0053] }, +{ source: [0x1D683], NFC: [0x1D683], NFD: [0x1D683], NFKC: [0x0054], NFKD: [0x0054] }, +{ source: [0x1D684], NFC: [0x1D684], NFD: [0x1D684], NFKC: [0x0055], NFKD: [0x0055] }, +{ source: [0x1D685], NFC: [0x1D685], NFD: [0x1D685], NFKC: [0x0056], NFKD: [0x0056] }, +{ source: [0x1D686], NFC: [0x1D686], NFD: [0x1D686], NFKC: [0x0057], NFKD: [0x0057] }, +{ source: [0x1D687], NFC: [0x1D687], NFD: [0x1D687], NFKC: [0x0058], NFKD: [0x0058] }, +{ source: [0x1D688], NFC: [0x1D688], NFD: [0x1D688], NFKC: [0x0059], NFKD: [0x0059] }, +{ source: [0x1D689], NFC: [0x1D689], NFD: [0x1D689], NFKC: [0x005A], NFKD: [0x005A] }, +{ source: [0x1D68A], NFC: [0x1D68A], NFD: [0x1D68A], NFKC: [0x0061], NFKD: [0x0061] }, +{ source: [0x1D68B], NFC: [0x1D68B], NFD: [0x1D68B], NFKC: [0x0062], NFKD: [0x0062] }, +{ source: [0x1D68C], NFC: [0x1D68C], NFD: [0x1D68C], NFKC: [0x0063], NFKD: [0x0063] }, +{ source: [0x1D68D], NFC: [0x1D68D], NFD: [0x1D68D], NFKC: [0x0064], NFKD: [0x0064] }, +{ source: [0x1D68E], NFC: [0x1D68E], NFD: [0x1D68E], NFKC: [0x0065], NFKD: [0x0065] }, +{ source: [0x1D68F], NFC: [0x1D68F], NFD: [0x1D68F], NFKC: [0x0066], NFKD: [0x0066] }, +{ source: [0x1D690], NFC: [0x1D690], NFD: [0x1D690], NFKC: [0x0067], NFKD: [0x0067] }, +{ source: [0x1D691], NFC: [0x1D691], NFD: [0x1D691], NFKC: [0x0068], NFKD: [0x0068] }, +{ source: [0x1D692], NFC: [0x1D692], NFD: [0x1D692], NFKC: [0x0069], NFKD: [0x0069] }, +{ source: [0x1D693], NFC: [0x1D693], NFD: [0x1D693], NFKC: [0x006A], NFKD: [0x006A] }, +{ source: [0x1D694], NFC: [0x1D694], NFD: [0x1D694], NFKC: [0x006B], NFKD: [0x006B] }, +{ source: [0x1D695], NFC: [0x1D695], NFD: [0x1D695], NFKC: [0x006C], NFKD: [0x006C] }, +{ source: [0x1D696], NFC: [0x1D696], NFD: [0x1D696], NFKC: [0x006D], NFKD: [0x006D] }, +{ source: [0x1D697], NFC: [0x1D697], NFD: [0x1D697], NFKC: [0x006E], NFKD: [0x006E] }, +{ source: [0x1D698], NFC: [0x1D698], NFD: [0x1D698], NFKC: [0x006F], NFKD: [0x006F] }, +{ source: [0x1D699], NFC: [0x1D699], NFD: [0x1D699], NFKC: [0x0070], NFKD: [0x0070] }, +{ source: [0x1D69A], NFC: [0x1D69A], NFD: [0x1D69A], NFKC: [0x0071], NFKD: [0x0071] }, +{ source: [0x1D69B], NFC: [0x1D69B], NFD: [0x1D69B], NFKC: [0x0072], NFKD: [0x0072] }, +{ source: [0x1D69C], NFC: [0x1D69C], NFD: [0x1D69C], NFKC: [0x0073], NFKD: [0x0073] }, +{ source: [0x1D69D], NFC: [0x1D69D], NFD: [0x1D69D], NFKC: [0x0074], NFKD: [0x0074] }, +{ source: [0x1D69E], NFC: [0x1D69E], NFD: [0x1D69E], NFKC: [0x0075], NFKD: [0x0075] }, +{ source: [0x1D69F], NFC: [0x1D69F], NFD: [0x1D69F], NFKC: [0x0076], NFKD: [0x0076] }, +{ source: [0x1D6A0], NFC: [0x1D6A0], NFD: [0x1D6A0], NFKC: [0x0077], NFKD: [0x0077] }, +{ source: [0x1D6A1], NFC: [0x1D6A1], NFD: [0x1D6A1], NFKC: [0x0078], NFKD: [0x0078] }, +{ source: [0x1D6A2], NFC: [0x1D6A2], NFD: [0x1D6A2], NFKC: [0x0079], NFKD: [0x0079] }, +{ source: [0x1D6A3], NFC: [0x1D6A3], NFD: [0x1D6A3], NFKC: [0x007A], NFKD: [0x007A] }, +{ source: [0x1D6A4], NFC: [0x1D6A4], NFD: [0x1D6A4], NFKC: [0x0131], NFKD: [0x0131] }, +{ source: [0x1D6A5], NFC: [0x1D6A5], NFD: [0x1D6A5], NFKC: [0x0237], NFKD: [0x0237] }, +{ source: [0x1D6A8], NFC: [0x1D6A8], NFD: [0x1D6A8], NFKC: [0x0391], NFKD: [0x0391] }, +{ source: [0x1D6A9], NFC: [0x1D6A9], NFD: [0x1D6A9], NFKC: [0x0392], NFKD: [0x0392] }, +{ source: [0x1D6AA], NFC: [0x1D6AA], NFD: [0x1D6AA], NFKC: [0x0393], NFKD: [0x0393] }, +{ source: [0x1D6AB], NFC: [0x1D6AB], NFD: [0x1D6AB], NFKC: [0x0394], NFKD: [0x0394] }, +{ source: [0x1D6AC], NFC: [0x1D6AC], NFD: [0x1D6AC], NFKC: [0x0395], NFKD: [0x0395] }, +{ source: [0x1D6AD], NFC: [0x1D6AD], NFD: [0x1D6AD], NFKC: [0x0396], NFKD: [0x0396] }, +{ source: [0x1D6AE], NFC: [0x1D6AE], NFD: [0x1D6AE], NFKC: [0x0397], NFKD: [0x0397] }, +{ source: [0x1D6AF], NFC: [0x1D6AF], NFD: [0x1D6AF], NFKC: [0x0398], NFKD: [0x0398] }, +{ source: [0x1D6B0], NFC: [0x1D6B0], NFD: [0x1D6B0], NFKC: [0x0399], NFKD: [0x0399] }, +{ source: [0x1D6B1], NFC: [0x1D6B1], NFD: [0x1D6B1], NFKC: [0x039A], NFKD: [0x039A] }, +{ source: [0x1D6B2], NFC: [0x1D6B2], NFD: [0x1D6B2], NFKC: [0x039B], NFKD: [0x039B] }, +{ source: [0x1D6B3], NFC: [0x1D6B3], NFD: [0x1D6B3], NFKC: [0x039C], NFKD: [0x039C] }, +{ source: [0x1D6B4], NFC: [0x1D6B4], NFD: [0x1D6B4], NFKC: [0x039D], NFKD: [0x039D] }, +{ source: [0x1D6B5], NFC: [0x1D6B5], NFD: [0x1D6B5], NFKC: [0x039E], NFKD: [0x039E] }, +{ source: [0x1D6B6], NFC: [0x1D6B6], NFD: [0x1D6B6], NFKC: [0x039F], NFKD: [0x039F] }, +{ source: [0x1D6B7], NFC: [0x1D6B7], NFD: [0x1D6B7], NFKC: [0x03A0], NFKD: [0x03A0] }, +{ source: [0x1D6B8], NFC: [0x1D6B8], NFD: [0x1D6B8], NFKC: [0x03A1], NFKD: [0x03A1] }, +{ source: [0x1D6B9], NFC: [0x1D6B9], NFD: [0x1D6B9], NFKC: [0x0398], NFKD: [0x0398] }, +{ source: [0x1D6BA], NFC: [0x1D6BA], NFD: [0x1D6BA], NFKC: [0x03A3], NFKD: [0x03A3] }, +{ source: [0x1D6BB], NFC: [0x1D6BB], NFD: [0x1D6BB], NFKC: [0x03A4], NFKD: [0x03A4] }, +{ source: [0x1D6BC], NFC: [0x1D6BC], NFD: [0x1D6BC], NFKC: [0x03A5], NFKD: [0x03A5] }, +{ source: [0x1D6BD], NFC: [0x1D6BD], NFD: [0x1D6BD], NFKC: [0x03A6], NFKD: [0x03A6] }, +{ source: [0x1D6BE], NFC: [0x1D6BE], NFD: [0x1D6BE], NFKC: [0x03A7], NFKD: [0x03A7] }, +{ source: [0x1D6BF], NFC: [0x1D6BF], NFD: [0x1D6BF], NFKC: [0x03A8], NFKD: [0x03A8] }, +{ source: [0x1D6C0], NFC: [0x1D6C0], NFD: [0x1D6C0], NFKC: [0x03A9], NFKD: [0x03A9] }, +{ source: [0x1D6C1], NFC: [0x1D6C1], NFD: [0x1D6C1], NFKC: [0x2207], NFKD: [0x2207] }, +{ source: [0x1D6C2], NFC: [0x1D6C2], NFD: [0x1D6C2], NFKC: [0x03B1], NFKD: [0x03B1] }, +{ source: [0x1D6C3], NFC: [0x1D6C3], NFD: [0x1D6C3], NFKC: [0x03B2], NFKD: [0x03B2] }, +{ source: [0x1D6C4], NFC: [0x1D6C4], NFD: [0x1D6C4], NFKC: [0x03B3], NFKD: [0x03B3] }, +{ source: [0x1D6C5], NFC: [0x1D6C5], NFD: [0x1D6C5], NFKC: [0x03B4], NFKD: [0x03B4] }, +{ source: [0x1D6C6], NFC: [0x1D6C6], NFD: [0x1D6C6], NFKC: [0x03B5], NFKD: [0x03B5] }, +{ source: [0x1D6C7], NFC: [0x1D6C7], NFD: [0x1D6C7], NFKC: [0x03B6], NFKD: [0x03B6] }, +{ source: [0x1D6C8], NFC: [0x1D6C8], NFD: [0x1D6C8], NFKC: [0x03B7], NFKD: [0x03B7] }, +{ source: [0x1D6C9], NFC: [0x1D6C9], NFD: [0x1D6C9], NFKC: [0x03B8], NFKD: [0x03B8] }, +{ source: [0x1D6CA], NFC: [0x1D6CA], NFD: [0x1D6CA], NFKC: [0x03B9], NFKD: [0x03B9] }, +{ source: [0x1D6CB], NFC: [0x1D6CB], NFD: [0x1D6CB], NFKC: [0x03BA], NFKD: [0x03BA] }, +{ source: [0x1D6CC], NFC: [0x1D6CC], NFD: [0x1D6CC], NFKC: [0x03BB], NFKD: [0x03BB] }, +{ source: [0x1D6CD], NFC: [0x1D6CD], NFD: [0x1D6CD], NFKC: [0x03BC], NFKD: [0x03BC] }, +{ source: [0x1D6CE], NFC: [0x1D6CE], NFD: [0x1D6CE], NFKC: [0x03BD], NFKD: [0x03BD] }, +{ source: [0x1D6CF], NFC: [0x1D6CF], NFD: [0x1D6CF], NFKC: [0x03BE], NFKD: [0x03BE] }, +{ source: [0x1D6D0], NFC: [0x1D6D0], NFD: [0x1D6D0], NFKC: [0x03BF], NFKD: [0x03BF] }, +{ source: [0x1D6D1], NFC: [0x1D6D1], NFD: [0x1D6D1], NFKC: [0x03C0], NFKD: [0x03C0] }, +{ source: [0x1D6D2], NFC: [0x1D6D2], NFD: [0x1D6D2], NFKC: [0x03C1], NFKD: [0x03C1] }, +{ source: [0x1D6D3], NFC: [0x1D6D3], NFD: [0x1D6D3], NFKC: [0x03C2], NFKD: [0x03C2] }, +{ source: [0x1D6D4], NFC: [0x1D6D4], NFD: [0x1D6D4], NFKC: [0x03C3], NFKD: [0x03C3] }, +{ source: [0x1D6D5], NFC: [0x1D6D5], NFD: [0x1D6D5], NFKC: [0x03C4], NFKD: [0x03C4] }, +{ source: [0x1D6D6], NFC: [0x1D6D6], NFD: [0x1D6D6], NFKC: [0x03C5], NFKD: [0x03C5] }, +{ source: [0x1D6D7], NFC: [0x1D6D7], NFD: [0x1D6D7], NFKC: [0x03C6], NFKD: [0x03C6] }, +{ source: [0x1D6D8], NFC: [0x1D6D8], NFD: [0x1D6D8], NFKC: [0x03C7], NFKD: [0x03C7] }, +{ source: [0x1D6D9], NFC: [0x1D6D9], NFD: [0x1D6D9], NFKC: [0x03C8], NFKD: [0x03C8] }, +{ source: [0x1D6DA], NFC: [0x1D6DA], NFD: [0x1D6DA], NFKC: [0x03C9], NFKD: [0x03C9] }, +{ source: [0x1D6DB], NFC: [0x1D6DB], NFD: [0x1D6DB], NFKC: [0x2202], NFKD: [0x2202] }, +{ source: [0x1D6DC], NFC: [0x1D6DC], NFD: [0x1D6DC], NFKC: [0x03B5], NFKD: [0x03B5] }, +{ source: [0x1D6DD], NFC: [0x1D6DD], NFD: [0x1D6DD], NFKC: [0x03B8], NFKD: [0x03B8] }, +{ source: [0x1D6DE], NFC: [0x1D6DE], NFD: [0x1D6DE], NFKC: [0x03BA], NFKD: [0x03BA] }, +{ source: [0x1D6DF], NFC: [0x1D6DF], NFD: [0x1D6DF], NFKC: [0x03C6], NFKD: [0x03C6] }, +{ source: [0x1D6E0], NFC: [0x1D6E0], NFD: [0x1D6E0], NFKC: [0x03C1], NFKD: [0x03C1] }, +{ source: [0x1D6E1], NFC: [0x1D6E1], NFD: [0x1D6E1], NFKC: [0x03C0], NFKD: [0x03C0] }, +{ source: [0x1D6E2], NFC: [0x1D6E2], NFD: [0x1D6E2], NFKC: [0x0391], NFKD: [0x0391] }, +{ source: [0x1D6E3], NFC: [0x1D6E3], NFD: [0x1D6E3], NFKC: [0x0392], NFKD: [0x0392] }, +{ source: [0x1D6E4], NFC: [0x1D6E4], NFD: [0x1D6E4], NFKC: [0x0393], NFKD: [0x0393] }, +{ source: [0x1D6E5], NFC: [0x1D6E5], NFD: [0x1D6E5], NFKC: [0x0394], NFKD: [0x0394] }, +{ source: [0x1D6E6], NFC: [0x1D6E6], NFD: [0x1D6E6], NFKC: [0x0395], NFKD: [0x0395] }, +{ source: [0x1D6E7], NFC: [0x1D6E7], NFD: [0x1D6E7], NFKC: [0x0396], NFKD: [0x0396] }, +{ source: [0x1D6E8], NFC: [0x1D6E8], NFD: [0x1D6E8], NFKC: [0x0397], NFKD: [0x0397] }, +{ source: [0x1D6E9], NFC: [0x1D6E9], NFD: [0x1D6E9], NFKC: [0x0398], NFKD: [0x0398] }, +{ source: [0x1D6EA], NFC: [0x1D6EA], NFD: [0x1D6EA], NFKC: [0x0399], NFKD: [0x0399] }, +{ source: [0x1D6EB], NFC: [0x1D6EB], NFD: [0x1D6EB], NFKC: [0x039A], NFKD: [0x039A] }, +{ source: [0x1D6EC], NFC: [0x1D6EC], NFD: [0x1D6EC], NFKC: [0x039B], NFKD: [0x039B] }, +{ source: [0x1D6ED], NFC: [0x1D6ED], NFD: [0x1D6ED], NFKC: [0x039C], NFKD: [0x039C] }, +{ source: [0x1D6EE], NFC: [0x1D6EE], NFD: [0x1D6EE], NFKC: [0x039D], NFKD: [0x039D] }, +{ source: [0x1D6EF], NFC: [0x1D6EF], NFD: [0x1D6EF], NFKC: [0x039E], NFKD: [0x039E] }, +{ source: [0x1D6F0], NFC: [0x1D6F0], NFD: [0x1D6F0], NFKC: [0x039F], NFKD: [0x039F] }, +{ source: [0x1D6F1], NFC: [0x1D6F1], NFD: [0x1D6F1], NFKC: [0x03A0], NFKD: [0x03A0] }, +{ source: [0x1D6F2], NFC: [0x1D6F2], NFD: [0x1D6F2], NFKC: [0x03A1], NFKD: [0x03A1] }, +{ source: [0x1D6F3], NFC: [0x1D6F3], NFD: [0x1D6F3], NFKC: [0x0398], NFKD: [0x0398] }, +{ source: [0x1D6F4], NFC: [0x1D6F4], NFD: [0x1D6F4], NFKC: [0x03A3], NFKD: [0x03A3] }, +{ source: [0x1D6F5], NFC: [0x1D6F5], NFD: [0x1D6F5], NFKC: [0x03A4], NFKD: [0x03A4] }, +{ source: [0x1D6F6], NFC: [0x1D6F6], NFD: [0x1D6F6], NFKC: [0x03A5], NFKD: [0x03A5] }, +{ source: [0x1D6F7], NFC: [0x1D6F7], NFD: [0x1D6F7], NFKC: [0x03A6], NFKD: [0x03A6] }, +{ source: [0x1D6F8], NFC: [0x1D6F8], NFD: [0x1D6F8], NFKC: [0x03A7], NFKD: [0x03A7] }, +{ source: [0x1D6F9], NFC: [0x1D6F9], NFD: [0x1D6F9], NFKC: [0x03A8], NFKD: [0x03A8] }, +{ source: [0x1D6FA], NFC: [0x1D6FA], NFD: [0x1D6FA], NFKC: [0x03A9], NFKD: [0x03A9] }, +{ source: [0x1D6FB], NFC: [0x1D6FB], NFD: [0x1D6FB], NFKC: [0x2207], NFKD: [0x2207] }, +{ source: [0x1D6FC], NFC: [0x1D6FC], NFD: [0x1D6FC], NFKC: [0x03B1], NFKD: [0x03B1] }, +{ source: [0x1D6FD], NFC: [0x1D6FD], NFD: [0x1D6FD], NFKC: [0x03B2], NFKD: [0x03B2] }, +{ source: [0x1D6FE], NFC: [0x1D6FE], NFD: [0x1D6FE], NFKC: [0x03B3], NFKD: [0x03B3] }, +{ source: [0x1D6FF], NFC: [0x1D6FF], NFD: [0x1D6FF], NFKC: [0x03B4], NFKD: [0x03B4] }, +{ source: [0x1D700], NFC: [0x1D700], NFD: [0x1D700], NFKC: [0x03B5], NFKD: [0x03B5] }, +{ source: [0x1D701], NFC: [0x1D701], NFD: [0x1D701], NFKC: [0x03B6], NFKD: [0x03B6] }, +{ source: [0x1D702], NFC: [0x1D702], NFD: [0x1D702], NFKC: [0x03B7], NFKD: [0x03B7] }, +{ source: [0x1D703], NFC: [0x1D703], NFD: [0x1D703], NFKC: [0x03B8], NFKD: [0x03B8] }, +{ source: [0x1D704], NFC: [0x1D704], NFD: [0x1D704], NFKC: [0x03B9], NFKD: [0x03B9] }, +{ source: [0x1D705], NFC: [0x1D705], NFD: [0x1D705], NFKC: [0x03BA], NFKD: [0x03BA] }, +{ source: [0x1D706], NFC: [0x1D706], NFD: [0x1D706], NFKC: [0x03BB], NFKD: [0x03BB] }, +{ source: [0x1D707], NFC: [0x1D707], NFD: [0x1D707], NFKC: [0x03BC], NFKD: [0x03BC] }, +{ source: [0x1D708], NFC: [0x1D708], NFD: [0x1D708], NFKC: [0x03BD], NFKD: [0x03BD] }, +{ source: [0x1D709], NFC: [0x1D709], NFD: [0x1D709], NFKC: [0x03BE], NFKD: [0x03BE] }, +{ source: [0x1D70A], NFC: [0x1D70A], NFD: [0x1D70A], NFKC: [0x03BF], NFKD: [0x03BF] }, +{ source: [0x1D70B], NFC: [0x1D70B], NFD: [0x1D70B], NFKC: [0x03C0], NFKD: [0x03C0] }, +{ source: [0x1D70C], NFC: [0x1D70C], NFD: [0x1D70C], NFKC: [0x03C1], NFKD: [0x03C1] }, +{ source: [0x1D70D], NFC: [0x1D70D], NFD: [0x1D70D], NFKC: [0x03C2], NFKD: [0x03C2] }, +{ source: [0x1D70E], NFC: [0x1D70E], NFD: [0x1D70E], NFKC: [0x03C3], NFKD: [0x03C3] }, +{ source: [0x1D70F], NFC: [0x1D70F], NFD: [0x1D70F], NFKC: [0x03C4], NFKD: [0x03C4] }, +{ source: [0x1D710], NFC: [0x1D710], NFD: [0x1D710], NFKC: [0x03C5], NFKD: [0x03C5] }, +{ source: [0x1D711], NFC: [0x1D711], NFD: [0x1D711], NFKC: [0x03C6], NFKD: [0x03C6] }, +{ source: [0x1D712], NFC: [0x1D712], NFD: [0x1D712], NFKC: [0x03C7], NFKD: [0x03C7] }, +{ source: [0x1D713], NFC: [0x1D713], NFD: [0x1D713], NFKC: [0x03C8], NFKD: [0x03C8] }, +{ source: [0x1D714], NFC: [0x1D714], NFD: [0x1D714], NFKC: [0x03C9], NFKD: [0x03C9] }, +{ source: [0x1D715], NFC: [0x1D715], NFD: [0x1D715], NFKC: [0x2202], NFKD: [0x2202] }, +{ source: [0x1D716], NFC: [0x1D716], NFD: [0x1D716], NFKC: [0x03B5], NFKD: [0x03B5] }, +{ source: [0x1D717], NFC: [0x1D717], NFD: [0x1D717], NFKC: [0x03B8], NFKD: [0x03B8] }, +{ source: [0x1D718], NFC: [0x1D718], NFD: [0x1D718], NFKC: [0x03BA], NFKD: [0x03BA] }, +{ source: [0x1D719], NFC: [0x1D719], NFD: [0x1D719], NFKC: [0x03C6], NFKD: [0x03C6] }, +{ source: [0x1D71A], NFC: [0x1D71A], NFD: [0x1D71A], NFKC: [0x03C1], NFKD: [0x03C1] }, +{ source: [0x1D71B], NFC: [0x1D71B], NFD: [0x1D71B], NFKC: [0x03C0], NFKD: [0x03C0] }, +{ source: [0x1D71C], NFC: [0x1D71C], NFD: [0x1D71C], NFKC: [0x0391], NFKD: [0x0391] }, +{ source: [0x1D71D], NFC: [0x1D71D], NFD: [0x1D71D], NFKC: [0x0392], NFKD: [0x0392] }, +{ source: [0x1D71E], NFC: [0x1D71E], NFD: [0x1D71E], NFKC: [0x0393], NFKD: [0x0393] }, +{ source: [0x1D71F], NFC: [0x1D71F], NFD: [0x1D71F], NFKC: [0x0394], NFKD: [0x0394] }, +{ source: [0x1D720], NFC: [0x1D720], NFD: [0x1D720], NFKC: [0x0395], NFKD: [0x0395] }, +{ source: [0x1D721], NFC: [0x1D721], NFD: [0x1D721], NFKC: [0x0396], NFKD: [0x0396] }, +{ source: [0x1D722], NFC: [0x1D722], NFD: [0x1D722], NFKC: [0x0397], NFKD: [0x0397] }, +{ source: [0x1D723], NFC: [0x1D723], NFD: [0x1D723], NFKC: [0x0398], NFKD: [0x0398] }, +{ source: [0x1D724], NFC: [0x1D724], NFD: [0x1D724], NFKC: [0x0399], NFKD: [0x0399] }, +{ source: [0x1D725], NFC: [0x1D725], NFD: [0x1D725], NFKC: [0x039A], NFKD: [0x039A] }, +{ source: [0x1D726], NFC: [0x1D726], NFD: [0x1D726], NFKC: [0x039B], NFKD: [0x039B] }, +{ source: [0x1D727], NFC: [0x1D727], NFD: [0x1D727], NFKC: [0x039C], NFKD: [0x039C] }, +{ source: [0x1D728], NFC: [0x1D728], NFD: [0x1D728], NFKC: [0x039D], NFKD: [0x039D] }, +{ source: [0x1D729], NFC: [0x1D729], NFD: [0x1D729], NFKC: [0x039E], NFKD: [0x039E] }, +{ source: [0x1D72A], NFC: [0x1D72A], NFD: [0x1D72A], NFKC: [0x039F], NFKD: [0x039F] }, +{ source: [0x1D72B], NFC: [0x1D72B], NFD: [0x1D72B], NFKC: [0x03A0], NFKD: [0x03A0] }, +{ source: [0x1D72C], NFC: [0x1D72C], NFD: [0x1D72C], NFKC: [0x03A1], NFKD: [0x03A1] }, +{ source: [0x1D72D], NFC: [0x1D72D], NFD: [0x1D72D], NFKC: [0x0398], NFKD: [0x0398] }, +{ source: [0x1D72E], NFC: [0x1D72E], NFD: [0x1D72E], NFKC: [0x03A3], NFKD: [0x03A3] }, +{ source: [0x1D72F], NFC: [0x1D72F], NFD: [0x1D72F], NFKC: [0x03A4], NFKD: [0x03A4] }, +{ source: [0x1D730], NFC: [0x1D730], NFD: [0x1D730], NFKC: [0x03A5], NFKD: [0x03A5] }, +{ source: [0x1D731], NFC: [0x1D731], NFD: [0x1D731], NFKC: [0x03A6], NFKD: [0x03A6] }, +{ source: [0x1D732], NFC: [0x1D732], NFD: [0x1D732], NFKC: [0x03A7], NFKD: [0x03A7] }, +{ source: [0x1D733], NFC: [0x1D733], NFD: [0x1D733], NFKC: [0x03A8], NFKD: [0x03A8] }, +{ source: [0x1D734], NFC: [0x1D734], NFD: [0x1D734], NFKC: [0x03A9], NFKD: [0x03A9] }, +{ source: [0x1D735], NFC: [0x1D735], NFD: [0x1D735], NFKC: [0x2207], NFKD: [0x2207] }, +{ source: [0x1D736], NFC: [0x1D736], NFD: [0x1D736], NFKC: [0x03B1], NFKD: [0x03B1] }, +{ source: [0x1D737], NFC: [0x1D737], NFD: [0x1D737], NFKC: [0x03B2], NFKD: [0x03B2] }, +{ source: [0x1D738], NFC: [0x1D738], NFD: [0x1D738], NFKC: [0x03B3], NFKD: [0x03B3] }, +{ source: [0x1D739], NFC: [0x1D739], NFD: [0x1D739], NFKC: [0x03B4], NFKD: [0x03B4] }, +{ source: [0x1D73A], NFC: [0x1D73A], NFD: [0x1D73A], NFKC: [0x03B5], NFKD: [0x03B5] }, +{ source: [0x1D73B], NFC: [0x1D73B], NFD: [0x1D73B], NFKC: [0x03B6], NFKD: [0x03B6] }, +{ source: [0x1D73C], NFC: [0x1D73C], NFD: [0x1D73C], NFKC: [0x03B7], NFKD: [0x03B7] }, +{ source: [0x1D73D], NFC: [0x1D73D], NFD: [0x1D73D], NFKC: [0x03B8], NFKD: [0x03B8] }, +{ source: [0x1D73E], NFC: [0x1D73E], NFD: [0x1D73E], NFKC: [0x03B9], NFKD: [0x03B9] }, +{ source: [0x1D73F], NFC: [0x1D73F], NFD: [0x1D73F], NFKC: [0x03BA], NFKD: [0x03BA] }, +{ source: [0x1D740], NFC: [0x1D740], NFD: [0x1D740], NFKC: [0x03BB], NFKD: [0x03BB] }, +{ source: [0x1D741], NFC: [0x1D741], NFD: [0x1D741], NFKC: [0x03BC], NFKD: [0x03BC] }, +{ source: [0x1D742], NFC: [0x1D742], NFD: [0x1D742], NFKC: [0x03BD], NFKD: [0x03BD] }, +{ source: [0x1D743], NFC: [0x1D743], NFD: [0x1D743], NFKC: [0x03BE], NFKD: [0x03BE] }, +{ source: [0x1D744], NFC: [0x1D744], NFD: [0x1D744], NFKC: [0x03BF], NFKD: [0x03BF] }, +{ source: [0x1D745], NFC: [0x1D745], NFD: [0x1D745], NFKC: [0x03C0], NFKD: [0x03C0] }, +{ source: [0x1D746], NFC: [0x1D746], NFD: [0x1D746], NFKC: [0x03C1], NFKD: [0x03C1] }, +{ source: [0x1D747], NFC: [0x1D747], NFD: [0x1D747], NFKC: [0x03C2], NFKD: [0x03C2] }, +{ source: [0x1D748], NFC: [0x1D748], NFD: [0x1D748], NFKC: [0x03C3], NFKD: [0x03C3] }, +{ source: [0x1D749], NFC: [0x1D749], NFD: [0x1D749], NFKC: [0x03C4], NFKD: [0x03C4] }, +{ source: [0x1D74A], NFC: [0x1D74A], NFD: [0x1D74A], NFKC: [0x03C5], NFKD: [0x03C5] }, +{ source: [0x1D74B], NFC: [0x1D74B], NFD: [0x1D74B], NFKC: [0x03C6], NFKD: [0x03C6] }, +{ source: [0x1D74C], NFC: [0x1D74C], NFD: [0x1D74C], NFKC: [0x03C7], NFKD: [0x03C7] }, +{ source: [0x1D74D], NFC: [0x1D74D], NFD: [0x1D74D], NFKC: [0x03C8], NFKD: [0x03C8] }, +{ source: [0x1D74E], NFC: [0x1D74E], NFD: [0x1D74E], NFKC: [0x03C9], NFKD: [0x03C9] }, +{ source: [0x1D74F], NFC: [0x1D74F], NFD: [0x1D74F], NFKC: [0x2202], NFKD: [0x2202] }, +{ source: [0x1D750], NFC: [0x1D750], NFD: [0x1D750], NFKC: [0x03B5], NFKD: [0x03B5] }, +{ source: [0x1D751], NFC: [0x1D751], NFD: [0x1D751], NFKC: [0x03B8], NFKD: [0x03B8] }, +{ source: [0x1D752], NFC: [0x1D752], NFD: [0x1D752], NFKC: [0x03BA], NFKD: [0x03BA] }, +{ source: [0x1D753], NFC: [0x1D753], NFD: [0x1D753], NFKC: [0x03C6], NFKD: [0x03C6] }, +{ source: [0x1D754], NFC: [0x1D754], NFD: [0x1D754], NFKC: [0x03C1], NFKD: [0x03C1] }, +{ source: [0x1D755], NFC: [0x1D755], NFD: [0x1D755], NFKC: [0x03C0], NFKD: [0x03C0] }, +{ source: [0x1D756], NFC: [0x1D756], NFD: [0x1D756], NFKC: [0x0391], NFKD: [0x0391] }, +{ source: [0x1D757], NFC: [0x1D757], NFD: [0x1D757], NFKC: [0x0392], NFKD: [0x0392] }, +{ source: [0x1D758], NFC: [0x1D758], NFD: [0x1D758], NFKC: [0x0393], NFKD: [0x0393] }, +{ source: [0x1D759], NFC: [0x1D759], NFD: [0x1D759], NFKC: [0x0394], NFKD: [0x0394] }, +{ source: [0x1D75A], NFC: [0x1D75A], NFD: [0x1D75A], NFKC: [0x0395], NFKD: [0x0395] }, +{ source: [0x1D75B], NFC: [0x1D75B], NFD: [0x1D75B], NFKC: [0x0396], NFKD: [0x0396] }, +{ source: [0x1D75C], NFC: [0x1D75C], NFD: [0x1D75C], NFKC: [0x0397], NFKD: [0x0397] }, +{ source: [0x1D75D], NFC: [0x1D75D], NFD: [0x1D75D], NFKC: [0x0398], NFKD: [0x0398] }, +{ source: [0x1D75E], NFC: [0x1D75E], NFD: [0x1D75E], NFKC: [0x0399], NFKD: [0x0399] }, +{ source: [0x1D75F], NFC: [0x1D75F], NFD: [0x1D75F], NFKC: [0x039A], NFKD: [0x039A] }, +{ source: [0x1D760], NFC: [0x1D760], NFD: [0x1D760], NFKC: [0x039B], NFKD: [0x039B] }, +{ source: [0x1D761], NFC: [0x1D761], NFD: [0x1D761], NFKC: [0x039C], NFKD: [0x039C] }, +{ source: [0x1D762], NFC: [0x1D762], NFD: [0x1D762], NFKC: [0x039D], NFKD: [0x039D] }, +{ source: [0x1D763], NFC: [0x1D763], NFD: [0x1D763], NFKC: [0x039E], NFKD: [0x039E] }, +{ source: [0x1D764], NFC: [0x1D764], NFD: [0x1D764], NFKC: [0x039F], NFKD: [0x039F] }, +{ source: [0x1D765], NFC: [0x1D765], NFD: [0x1D765], NFKC: [0x03A0], NFKD: [0x03A0] }, +{ source: [0x1D766], NFC: [0x1D766], NFD: [0x1D766], NFKC: [0x03A1], NFKD: [0x03A1] }, +{ source: [0x1D767], NFC: [0x1D767], NFD: [0x1D767], NFKC: [0x0398], NFKD: [0x0398] }, +{ source: [0x1D768], NFC: [0x1D768], NFD: [0x1D768], NFKC: [0x03A3], NFKD: [0x03A3] }, +{ source: [0x1D769], NFC: [0x1D769], NFD: [0x1D769], NFKC: [0x03A4], NFKD: [0x03A4] }, +{ source: [0x1D76A], NFC: [0x1D76A], NFD: [0x1D76A], NFKC: [0x03A5], NFKD: [0x03A5] }, +{ source: [0x1D76B], NFC: [0x1D76B], NFD: [0x1D76B], NFKC: [0x03A6], NFKD: [0x03A6] }, +{ source: [0x1D76C], NFC: [0x1D76C], NFD: [0x1D76C], NFKC: [0x03A7], NFKD: [0x03A7] }, +{ source: [0x1D76D], NFC: [0x1D76D], NFD: [0x1D76D], NFKC: [0x03A8], NFKD: [0x03A8] }, +{ source: [0x1D76E], NFC: [0x1D76E], NFD: [0x1D76E], NFKC: [0x03A9], NFKD: [0x03A9] }, +{ source: [0x1D76F], NFC: [0x1D76F], NFD: [0x1D76F], NFKC: [0x2207], NFKD: [0x2207] }, +{ source: [0x1D770], NFC: [0x1D770], NFD: [0x1D770], NFKC: [0x03B1], NFKD: [0x03B1] }, +{ source: [0x1D771], NFC: [0x1D771], NFD: [0x1D771], NFKC: [0x03B2], NFKD: [0x03B2] }, +{ source: [0x1D772], NFC: [0x1D772], NFD: [0x1D772], NFKC: [0x03B3], NFKD: [0x03B3] }, +{ source: [0x1D773], NFC: [0x1D773], NFD: [0x1D773], NFKC: [0x03B4], NFKD: [0x03B4] }, +{ source: [0x1D774], NFC: [0x1D774], NFD: [0x1D774], NFKC: [0x03B5], NFKD: [0x03B5] }, +{ source: [0x1D775], NFC: [0x1D775], NFD: [0x1D775], NFKC: [0x03B6], NFKD: [0x03B6] }, +{ source: [0x1D776], NFC: [0x1D776], NFD: [0x1D776], NFKC: [0x03B7], NFKD: [0x03B7] }, +{ source: [0x1D777], NFC: [0x1D777], NFD: [0x1D777], NFKC: [0x03B8], NFKD: [0x03B8] }, +{ source: [0x1D778], NFC: [0x1D778], NFD: [0x1D778], NFKC: [0x03B9], NFKD: [0x03B9] }, +{ source: [0x1D779], NFC: [0x1D779], NFD: [0x1D779], NFKC: [0x03BA], NFKD: [0x03BA] }, +{ source: [0x1D77A], NFC: [0x1D77A], NFD: [0x1D77A], NFKC: [0x03BB], NFKD: [0x03BB] }, +{ source: [0x1D77B], NFC: [0x1D77B], NFD: [0x1D77B], NFKC: [0x03BC], NFKD: [0x03BC] }, +{ source: [0x1D77C], NFC: [0x1D77C], NFD: [0x1D77C], NFKC: [0x03BD], NFKD: [0x03BD] }, +{ source: [0x1D77D], NFC: [0x1D77D], NFD: [0x1D77D], NFKC: [0x03BE], NFKD: [0x03BE] }, +{ source: [0x1D77E], NFC: [0x1D77E], NFD: [0x1D77E], NFKC: [0x03BF], NFKD: [0x03BF] }, +{ source: [0x1D77F], NFC: [0x1D77F], NFD: [0x1D77F], NFKC: [0x03C0], NFKD: [0x03C0] }, +{ source: [0x1D780], NFC: [0x1D780], NFD: [0x1D780], NFKC: [0x03C1], NFKD: [0x03C1] }, +{ source: [0x1D781], NFC: [0x1D781], NFD: [0x1D781], NFKC: [0x03C2], NFKD: [0x03C2] }, +{ source: [0x1D782], NFC: [0x1D782], NFD: [0x1D782], NFKC: [0x03C3], NFKD: [0x03C3] }, +{ source: [0x1D783], NFC: [0x1D783], NFD: [0x1D783], NFKC: [0x03C4], NFKD: [0x03C4] }, +{ source: [0x1D784], NFC: [0x1D784], NFD: [0x1D784], NFKC: [0x03C5], NFKD: [0x03C5] }, +{ source: [0x1D785], NFC: [0x1D785], NFD: [0x1D785], NFKC: [0x03C6], NFKD: [0x03C6] }, +{ source: [0x1D786], NFC: [0x1D786], NFD: [0x1D786], NFKC: [0x03C7], NFKD: [0x03C7] }, +{ source: [0x1D787], NFC: [0x1D787], NFD: [0x1D787], NFKC: [0x03C8], NFKD: [0x03C8] }, +{ source: [0x1D788], NFC: [0x1D788], NFD: [0x1D788], NFKC: [0x03C9], NFKD: [0x03C9] }, +{ source: [0x1D789], NFC: [0x1D789], NFD: [0x1D789], NFKC: [0x2202], NFKD: [0x2202] }, +{ source: [0x1D78A], NFC: [0x1D78A], NFD: [0x1D78A], NFKC: [0x03B5], NFKD: [0x03B5] }, +{ source: [0x1D78B], NFC: [0x1D78B], NFD: [0x1D78B], NFKC: [0x03B8], NFKD: [0x03B8] }, +{ source: [0x1D78C], NFC: [0x1D78C], NFD: [0x1D78C], NFKC: [0x03BA], NFKD: [0x03BA] }, +{ source: [0x1D78D], NFC: [0x1D78D], NFD: [0x1D78D], NFKC: [0x03C6], NFKD: [0x03C6] }, +{ source: [0x1D78E], NFC: [0x1D78E], NFD: [0x1D78E], NFKC: [0x03C1], NFKD: [0x03C1] }, +{ source: [0x1D78F], NFC: [0x1D78F], NFD: [0x1D78F], NFKC: [0x03C0], NFKD: [0x03C0] }, +{ source: [0x1D790], NFC: [0x1D790], NFD: [0x1D790], NFKC: [0x0391], NFKD: [0x0391] }, +{ source: [0x1D791], NFC: [0x1D791], NFD: [0x1D791], NFKC: [0x0392], NFKD: [0x0392] }, +{ source: [0x1D792], NFC: [0x1D792], NFD: [0x1D792], NFKC: [0x0393], NFKD: [0x0393] }, +{ source: [0x1D793], NFC: [0x1D793], NFD: [0x1D793], NFKC: [0x0394], NFKD: [0x0394] }, +{ source: [0x1D794], NFC: [0x1D794], NFD: [0x1D794], NFKC: [0x0395], NFKD: [0x0395] }, +{ source: [0x1D795], NFC: [0x1D795], NFD: [0x1D795], NFKC: [0x0396], NFKD: [0x0396] }, +{ source: [0x1D796], NFC: [0x1D796], NFD: [0x1D796], NFKC: [0x0397], NFKD: [0x0397] }, +{ source: [0x1D797], NFC: [0x1D797], NFD: [0x1D797], NFKC: [0x0398], NFKD: [0x0398] }, +{ source: [0x1D798], NFC: [0x1D798], NFD: [0x1D798], NFKC: [0x0399], NFKD: [0x0399] }, +{ source: [0x1D799], NFC: [0x1D799], NFD: [0x1D799], NFKC: [0x039A], NFKD: [0x039A] }, +{ source: [0x1D79A], NFC: [0x1D79A], NFD: [0x1D79A], NFKC: [0x039B], NFKD: [0x039B] }, +{ source: [0x1D79B], NFC: [0x1D79B], NFD: [0x1D79B], NFKC: [0x039C], NFKD: [0x039C] }, +{ source: [0x1D79C], NFC: [0x1D79C], NFD: [0x1D79C], NFKC: [0x039D], NFKD: [0x039D] }, +{ source: [0x1D79D], NFC: [0x1D79D], NFD: [0x1D79D], NFKC: [0x039E], NFKD: [0x039E] }, +{ source: [0x1D79E], NFC: [0x1D79E], NFD: [0x1D79E], NFKC: [0x039F], NFKD: [0x039F] }, +{ source: [0x1D79F], NFC: [0x1D79F], NFD: [0x1D79F], NFKC: [0x03A0], NFKD: [0x03A0] }, +{ source: [0x1D7A0], NFC: [0x1D7A0], NFD: [0x1D7A0], NFKC: [0x03A1], NFKD: [0x03A1] }, +{ source: [0x1D7A1], NFC: [0x1D7A1], NFD: [0x1D7A1], NFKC: [0x0398], NFKD: [0x0398] }, +{ source: [0x1D7A2], NFC: [0x1D7A2], NFD: [0x1D7A2], NFKC: [0x03A3], NFKD: [0x03A3] }, +{ source: [0x1D7A3], NFC: [0x1D7A3], NFD: [0x1D7A3], NFKC: [0x03A4], NFKD: [0x03A4] }, +{ source: [0x1D7A4], NFC: [0x1D7A4], NFD: [0x1D7A4], NFKC: [0x03A5], NFKD: [0x03A5] }, +{ source: [0x1D7A5], NFC: [0x1D7A5], NFD: [0x1D7A5], NFKC: [0x03A6], NFKD: [0x03A6] }, +{ source: [0x1D7A6], NFC: [0x1D7A6], NFD: [0x1D7A6], NFKC: [0x03A7], NFKD: [0x03A7] }, +{ source: [0x1D7A7], NFC: [0x1D7A7], NFD: [0x1D7A7], NFKC: [0x03A8], NFKD: [0x03A8] }, +{ source: [0x1D7A8], NFC: [0x1D7A8], NFD: [0x1D7A8], NFKC: [0x03A9], NFKD: [0x03A9] }, +{ source: [0x1D7A9], NFC: [0x1D7A9], NFD: [0x1D7A9], NFKC: [0x2207], NFKD: [0x2207] }, +{ source: [0x1D7AA], NFC: [0x1D7AA], NFD: [0x1D7AA], NFKC: [0x03B1], NFKD: [0x03B1] }, +{ source: [0x1D7AB], NFC: [0x1D7AB], NFD: [0x1D7AB], NFKC: [0x03B2], NFKD: [0x03B2] }, +{ source: [0x1D7AC], NFC: [0x1D7AC], NFD: [0x1D7AC], NFKC: [0x03B3], NFKD: [0x03B3] }, +{ source: [0x1D7AD], NFC: [0x1D7AD], NFD: [0x1D7AD], NFKC: [0x03B4], NFKD: [0x03B4] }, +{ source: [0x1D7AE], NFC: [0x1D7AE], NFD: [0x1D7AE], NFKC: [0x03B5], NFKD: [0x03B5] }, +{ source: [0x1D7AF], NFC: [0x1D7AF], NFD: [0x1D7AF], NFKC: [0x03B6], NFKD: [0x03B6] }, +{ source: [0x1D7B0], NFC: [0x1D7B0], NFD: [0x1D7B0], NFKC: [0x03B7], NFKD: [0x03B7] }, +{ source: [0x1D7B1], NFC: [0x1D7B1], NFD: [0x1D7B1], NFKC: [0x03B8], NFKD: [0x03B8] }, +{ source: [0x1D7B2], NFC: [0x1D7B2], NFD: [0x1D7B2], NFKC: [0x03B9], NFKD: [0x03B9] }, +{ source: [0x1D7B3], NFC: [0x1D7B3], NFD: [0x1D7B3], NFKC: [0x03BA], NFKD: [0x03BA] }, +{ source: [0x1D7B4], NFC: [0x1D7B4], NFD: [0x1D7B4], NFKC: [0x03BB], NFKD: [0x03BB] }, +{ source: [0x1D7B5], NFC: [0x1D7B5], NFD: [0x1D7B5], NFKC: [0x03BC], NFKD: [0x03BC] }, +{ source: [0x1D7B6], NFC: [0x1D7B6], NFD: [0x1D7B6], NFKC: [0x03BD], NFKD: [0x03BD] }, +{ source: [0x1D7B7], NFC: [0x1D7B7], NFD: [0x1D7B7], NFKC: [0x03BE], NFKD: [0x03BE] }, +{ source: [0x1D7B8], NFC: [0x1D7B8], NFD: [0x1D7B8], NFKC: [0x03BF], NFKD: [0x03BF] }, +{ source: [0x1D7B9], NFC: [0x1D7B9], NFD: [0x1D7B9], NFKC: [0x03C0], NFKD: [0x03C0] }, +{ source: [0x1D7BA], NFC: [0x1D7BA], NFD: [0x1D7BA], NFKC: [0x03C1], NFKD: [0x03C1] }, +{ source: [0x1D7BB], NFC: [0x1D7BB], NFD: [0x1D7BB], NFKC: [0x03C2], NFKD: [0x03C2] }, +{ source: [0x1D7BC], NFC: [0x1D7BC], NFD: [0x1D7BC], NFKC: [0x03C3], NFKD: [0x03C3] }, +{ source: [0x1D7BD], NFC: [0x1D7BD], NFD: [0x1D7BD], NFKC: [0x03C4], NFKD: [0x03C4] }, +{ source: [0x1D7BE], NFC: [0x1D7BE], NFD: [0x1D7BE], NFKC: [0x03C5], NFKD: [0x03C5] }, +{ source: [0x1D7BF], NFC: [0x1D7BF], NFD: [0x1D7BF], NFKC: [0x03C6], NFKD: [0x03C6] }, +{ source: [0x1D7C0], NFC: [0x1D7C0], NFD: [0x1D7C0], NFKC: [0x03C7], NFKD: [0x03C7] }, +{ source: [0x1D7C1], NFC: [0x1D7C1], NFD: [0x1D7C1], NFKC: [0x03C8], NFKD: [0x03C8] }, +{ source: [0x1D7C2], NFC: [0x1D7C2], NFD: [0x1D7C2], NFKC: [0x03C9], NFKD: [0x03C9] }, +{ source: [0x1D7C3], NFC: [0x1D7C3], NFD: [0x1D7C3], NFKC: [0x2202], NFKD: [0x2202] }, +{ source: [0x1D7C4], NFC: [0x1D7C4], NFD: [0x1D7C4], NFKC: [0x03B5], NFKD: [0x03B5] }, +{ source: [0x1D7C5], NFC: [0x1D7C5], NFD: [0x1D7C5], NFKC: [0x03B8], NFKD: [0x03B8] }, +{ source: [0x1D7C6], NFC: [0x1D7C6], NFD: [0x1D7C6], NFKC: [0x03BA], NFKD: [0x03BA] }, +{ source: [0x1D7C7], NFC: [0x1D7C7], NFD: [0x1D7C7], NFKC: [0x03C6], NFKD: [0x03C6] }, +{ source: [0x1D7C8], NFC: [0x1D7C8], NFD: [0x1D7C8], NFKC: [0x03C1], NFKD: [0x03C1] }, +{ source: [0x1D7C9], NFC: [0x1D7C9], NFD: [0x1D7C9], NFKC: [0x03C0], NFKD: [0x03C0] }, +{ source: [0x1D7CA], NFC: [0x1D7CA], NFD: [0x1D7CA], NFKC: [0x03DC], NFKD: [0x03DC] }, +{ source: [0x1D7CB], NFC: [0x1D7CB], NFD: [0x1D7CB], NFKC: [0x03DD], NFKD: [0x03DD] }, +{ source: [0x1D7CE], NFC: [0x1D7CE], NFD: [0x1D7CE], NFKC: [0x0030], NFKD: [0x0030] }, +{ source: [0x1D7CF], NFC: [0x1D7CF], NFD: [0x1D7CF], NFKC: [0x0031], NFKD: [0x0031] }, +{ source: [0x1D7D0], NFC: [0x1D7D0], NFD: [0x1D7D0], NFKC: [0x0032], NFKD: [0x0032] }, +{ source: [0x1D7D1], NFC: [0x1D7D1], NFD: [0x1D7D1], NFKC: [0x0033], NFKD: [0x0033] }, +{ source: [0x1D7D2], NFC: [0x1D7D2], NFD: [0x1D7D2], NFKC: [0x0034], NFKD: [0x0034] }, +{ source: [0x1D7D3], NFC: [0x1D7D3], NFD: [0x1D7D3], NFKC: [0x0035], NFKD: [0x0035] }, +{ source: [0x1D7D4], NFC: [0x1D7D4], NFD: [0x1D7D4], NFKC: [0x0036], NFKD: [0x0036] }, +{ source: [0x1D7D5], NFC: [0x1D7D5], NFD: [0x1D7D5], NFKC: [0x0037], NFKD: [0x0037] }, +{ source: [0x1D7D6], NFC: [0x1D7D6], NFD: [0x1D7D6], NFKC: [0x0038], NFKD: [0x0038] }, +{ source: [0x1D7D7], NFC: [0x1D7D7], NFD: [0x1D7D7], NFKC: [0x0039], NFKD: [0x0039] }, +{ source: [0x1D7D8], NFC: [0x1D7D8], NFD: [0x1D7D8], NFKC: [0x0030], NFKD: [0x0030] }, +{ source: [0x1D7D9], NFC: [0x1D7D9], NFD: [0x1D7D9], NFKC: [0x0031], NFKD: [0x0031] }, +{ source: [0x1D7DA], NFC: [0x1D7DA], NFD: [0x1D7DA], NFKC: [0x0032], NFKD: [0x0032] }, +{ source: [0x1D7DB], NFC: [0x1D7DB], NFD: [0x1D7DB], NFKC: [0x0033], NFKD: [0x0033] }, +{ source: [0x1D7DC], NFC: [0x1D7DC], NFD: [0x1D7DC], NFKC: [0x0034], NFKD: [0x0034] }, +{ source: [0x1D7DD], NFC: [0x1D7DD], NFD: [0x1D7DD], NFKC: [0x0035], NFKD: [0x0035] }, +{ source: [0x1D7DE], NFC: [0x1D7DE], NFD: [0x1D7DE], NFKC: [0x0036], NFKD: [0x0036] }, +{ source: [0x1D7DF], NFC: [0x1D7DF], NFD: [0x1D7DF], NFKC: [0x0037], NFKD: [0x0037] }, +{ source: [0x1D7E0], NFC: [0x1D7E0], NFD: [0x1D7E0], NFKC: [0x0038], NFKD: [0x0038] }, +{ source: [0x1D7E1], NFC: [0x1D7E1], NFD: [0x1D7E1], NFKC: [0x0039], NFKD: [0x0039] }, +{ source: [0x1D7E2], NFC: [0x1D7E2], NFD: [0x1D7E2], NFKC: [0x0030], NFKD: [0x0030] }, +{ source: [0x1D7E3], NFC: [0x1D7E3], NFD: [0x1D7E3], NFKC: [0x0031], NFKD: [0x0031] }, +{ source: [0x1D7E4], NFC: [0x1D7E4], NFD: [0x1D7E4], NFKC: [0x0032], NFKD: [0x0032] }, +{ source: [0x1D7E5], NFC: [0x1D7E5], NFD: [0x1D7E5], NFKC: [0x0033], NFKD: [0x0033] }, +{ source: [0x1D7E6], NFC: [0x1D7E6], NFD: [0x1D7E6], NFKC: [0x0034], NFKD: [0x0034] }, +{ source: [0x1D7E7], NFC: [0x1D7E7], NFD: [0x1D7E7], NFKC: [0x0035], NFKD: [0x0035] }, +{ source: [0x1D7E8], NFC: [0x1D7E8], NFD: [0x1D7E8], NFKC: [0x0036], NFKD: [0x0036] }, +{ source: [0x1D7E9], NFC: [0x1D7E9], NFD: [0x1D7E9], NFKC: [0x0037], NFKD: [0x0037] }, +{ source: [0x1D7EA], NFC: [0x1D7EA], NFD: [0x1D7EA], NFKC: [0x0038], NFKD: [0x0038] }, +{ source: [0x1D7EB], NFC: [0x1D7EB], NFD: [0x1D7EB], NFKC: [0x0039], NFKD: [0x0039] }, +{ source: [0x1D7EC], NFC: [0x1D7EC], NFD: [0x1D7EC], NFKC: [0x0030], NFKD: [0x0030] }, +{ source: [0x1D7ED], NFC: [0x1D7ED], NFD: [0x1D7ED], NFKC: [0x0031], NFKD: [0x0031] }, +{ source: [0x1D7EE], NFC: [0x1D7EE], NFD: [0x1D7EE], NFKC: [0x0032], NFKD: [0x0032] }, +{ source: [0x1D7EF], NFC: [0x1D7EF], NFD: [0x1D7EF], NFKC: [0x0033], NFKD: [0x0033] }, +{ source: [0x1D7F0], NFC: [0x1D7F0], NFD: [0x1D7F0], NFKC: [0x0034], NFKD: [0x0034] }, +{ source: [0x1D7F1], NFC: [0x1D7F1], NFD: [0x1D7F1], NFKC: [0x0035], NFKD: [0x0035] }, +{ source: [0x1D7F2], NFC: [0x1D7F2], NFD: [0x1D7F2], NFKC: [0x0036], NFKD: [0x0036] }, +{ source: [0x1D7F3], NFC: [0x1D7F3], NFD: [0x1D7F3], NFKC: [0x0037], NFKD: [0x0037] }, +{ source: [0x1D7F4], NFC: [0x1D7F4], NFD: [0x1D7F4], NFKC: [0x0038], NFKD: [0x0038] }, +{ source: [0x1D7F5], NFC: [0x1D7F5], NFD: [0x1D7F5], NFKC: [0x0039], NFKD: [0x0039] }, +{ source: [0x1D7F6], NFC: [0x1D7F6], NFD: [0x1D7F6], NFKC: [0x0030], NFKD: [0x0030] }, +{ source: [0x1D7F7], NFC: [0x1D7F7], NFD: [0x1D7F7], NFKC: [0x0031], NFKD: [0x0031] }, +{ source: [0x1D7F8], NFC: [0x1D7F8], NFD: [0x1D7F8], NFKC: [0x0032], NFKD: [0x0032] }, +{ source: [0x1D7F9], NFC: [0x1D7F9], NFD: [0x1D7F9], NFKC: [0x0033], NFKD: [0x0033] }, +{ source: [0x1D7FA], NFC: [0x1D7FA], NFD: [0x1D7FA], NFKC: [0x0034], NFKD: [0x0034] }, +{ source: [0x1D7FB], NFC: [0x1D7FB], NFD: [0x1D7FB], NFKC: [0x0035], NFKD: [0x0035] }, +{ source: [0x1D7FC], NFC: [0x1D7FC], NFD: [0x1D7FC], NFKC: [0x0036], NFKD: [0x0036] }, +{ source: [0x1D7FD], NFC: [0x1D7FD], NFD: [0x1D7FD], NFKC: [0x0037], NFKD: [0x0037] }, +{ source: [0x1D7FE], NFC: [0x1D7FE], NFD: [0x1D7FE], NFKC: [0x0038], NFKD: [0x0038] }, +{ source: [0x1D7FF], NFC: [0x1D7FF], NFD: [0x1D7FF], NFKC: [0x0039], NFKD: [0x0039] }, +{ source: [0x1E030], NFC: [0x1E030], NFD: [0x1E030], NFKC: [0x0430], NFKD: [0x0430] }, +{ source: [0x1E031], NFC: [0x1E031], NFD: [0x1E031], NFKC: [0x0431], NFKD: [0x0431] }, +{ source: [0x1E032], NFC: [0x1E032], NFD: [0x1E032], NFKC: [0x0432], NFKD: [0x0432] }, +{ source: [0x1E033], NFC: [0x1E033], NFD: [0x1E033], NFKC: [0x0433], NFKD: [0x0433] }, +{ source: [0x1E034], NFC: [0x1E034], NFD: [0x1E034], NFKC: [0x0434], NFKD: [0x0434] }, +{ source: [0x1E035], NFC: [0x1E035], NFD: [0x1E035], NFKC: [0x0435], NFKD: [0x0435] }, +{ source: [0x1E036], NFC: [0x1E036], NFD: [0x1E036], NFKC: [0x0436], NFKD: [0x0436] }, +{ source: [0x1E037], NFC: [0x1E037], NFD: [0x1E037], NFKC: [0x0437], NFKD: [0x0437] }, +{ source: [0x1E038], NFC: [0x1E038], NFD: [0x1E038], NFKC: [0x0438], NFKD: [0x0438] }, +{ source: [0x1E039], NFC: [0x1E039], NFD: [0x1E039], NFKC: [0x043A], NFKD: [0x043A] }, +{ source: [0x1E03A], NFC: [0x1E03A], NFD: [0x1E03A], NFKC: [0x043B], NFKD: [0x043B] }, +{ source: [0x1E03B], NFC: [0x1E03B], NFD: [0x1E03B], NFKC: [0x043C], NFKD: [0x043C] }, +{ source: [0x1E03C], NFC: [0x1E03C], NFD: [0x1E03C], NFKC: [0x043E], NFKD: [0x043E] }, +{ source: [0x1E03D], NFC: [0x1E03D], NFD: [0x1E03D], NFKC: [0x043F], NFKD: [0x043F] }, +{ source: [0x1E03E], NFC: [0x1E03E], NFD: [0x1E03E], NFKC: [0x0440], NFKD: [0x0440] }, +{ source: [0x1E03F], NFC: [0x1E03F], NFD: [0x1E03F], NFKC: [0x0441], NFKD: [0x0441] }, +{ source: [0x1E040], NFC: [0x1E040], NFD: [0x1E040], NFKC: [0x0442], NFKD: [0x0442] }, +{ source: [0x1E041], NFC: [0x1E041], NFD: [0x1E041], NFKC: [0x0443], NFKD: [0x0443] }, +{ source: [0x1E042], NFC: [0x1E042], NFD: [0x1E042], NFKC: [0x0444], NFKD: [0x0444] }, +{ source: [0x1E043], NFC: [0x1E043], NFD: [0x1E043], NFKC: [0x0445], NFKD: [0x0445] }, +{ source: [0x1E044], NFC: [0x1E044], NFD: [0x1E044], NFKC: [0x0446], NFKD: [0x0446] }, +{ source: [0x1E045], NFC: [0x1E045], NFD: [0x1E045], NFKC: [0x0447], NFKD: [0x0447] }, +{ source: [0x1E046], NFC: [0x1E046], NFD: [0x1E046], NFKC: [0x0448], NFKD: [0x0448] }, +{ source: [0x1E047], NFC: [0x1E047], NFD: [0x1E047], NFKC: [0x044B], NFKD: [0x044B] }, +{ source: [0x1E048], NFC: [0x1E048], NFD: [0x1E048], NFKC: [0x044D], NFKD: [0x044D] }, +{ source: [0x1E049], NFC: [0x1E049], NFD: [0x1E049], NFKC: [0x044E], NFKD: [0x044E] }, +{ source: [0x1E04A], NFC: [0x1E04A], NFD: [0x1E04A], NFKC: [0xA689], NFKD: [0xA689] }, +{ source: [0x1E04B], NFC: [0x1E04B], NFD: [0x1E04B], NFKC: [0x04D9], NFKD: [0x04D9] }, +{ source: [0x1E04C], NFC: [0x1E04C], NFD: [0x1E04C], NFKC: [0x0456], NFKD: [0x0456] }, +{ source: [0x1E04D], NFC: [0x1E04D], NFD: [0x1E04D], NFKC: [0x0458], NFKD: [0x0458] }, +{ source: [0x1E04E], NFC: [0x1E04E], NFD: [0x1E04E], NFKC: [0x04E9], NFKD: [0x04E9] }, +{ source: [0x1E04F], NFC: [0x1E04F], NFD: [0x1E04F], NFKC: [0x04AF], NFKD: [0x04AF] }, +{ source: [0x1E050], NFC: [0x1E050], NFD: [0x1E050], NFKC: [0x04CF], NFKD: [0x04CF] }, +{ source: [0x1E051], NFC: [0x1E051], NFD: [0x1E051], NFKC: [0x0430], NFKD: [0x0430] }, +{ source: [0x1E052], NFC: [0x1E052], NFD: [0x1E052], NFKC: [0x0431], NFKD: [0x0431] }, +{ source: [0x1E053], NFC: [0x1E053], NFD: [0x1E053], NFKC: [0x0432], NFKD: [0x0432] }, +{ source: [0x1E054], NFC: [0x1E054], NFD: [0x1E054], NFKC: [0x0433], NFKD: [0x0433] }, +{ source: [0x1E055], NFC: [0x1E055], NFD: [0x1E055], NFKC: [0x0434], NFKD: [0x0434] }, +{ source: [0x1E056], NFC: [0x1E056], NFD: [0x1E056], NFKC: [0x0435], NFKD: [0x0435] }, +{ source: [0x1E057], NFC: [0x1E057], NFD: [0x1E057], NFKC: [0x0436], NFKD: [0x0436] }, +{ source: [0x1E058], NFC: [0x1E058], NFD: [0x1E058], NFKC: [0x0437], NFKD: [0x0437] }, +{ source: [0x1E059], NFC: [0x1E059], NFD: [0x1E059], NFKC: [0x0438], NFKD: [0x0438] }, +{ source: [0x1E05A], NFC: [0x1E05A], NFD: [0x1E05A], NFKC: [0x043A], NFKD: [0x043A] }, +{ source: [0x1E05B], NFC: [0x1E05B], NFD: [0x1E05B], NFKC: [0x043B], NFKD: [0x043B] }, +{ source: [0x1E05C], NFC: [0x1E05C], NFD: [0x1E05C], NFKC: [0x043E], NFKD: [0x043E] }, +{ source: [0x1E05D], NFC: [0x1E05D], NFD: [0x1E05D], NFKC: [0x043F], NFKD: [0x043F] }, +{ source: [0x1E05E], NFC: [0x1E05E], NFD: [0x1E05E], NFKC: [0x0441], NFKD: [0x0441] }, +{ source: [0x1E05F], NFC: [0x1E05F], NFD: [0x1E05F], NFKC: [0x0443], NFKD: [0x0443] }, +{ source: [0x1E060], NFC: [0x1E060], NFD: [0x1E060], NFKC: [0x0444], NFKD: [0x0444] }, +{ source: [0x1E061], NFC: [0x1E061], NFD: [0x1E061], NFKC: [0x0445], NFKD: [0x0445] }, +{ source: [0x1E062], NFC: [0x1E062], NFD: [0x1E062], NFKC: [0x0446], NFKD: [0x0446] }, +{ source: [0x1E063], NFC: [0x1E063], NFD: [0x1E063], NFKC: [0x0447], NFKD: [0x0447] }, +{ source: [0x1E064], NFC: [0x1E064], NFD: [0x1E064], NFKC: [0x0448], NFKD: [0x0448] }, +{ source: [0x1E065], NFC: [0x1E065], NFD: [0x1E065], NFKC: [0x044A], NFKD: [0x044A] }, +{ source: [0x1E066], NFC: [0x1E066], NFD: [0x1E066], NFKC: [0x044B], NFKD: [0x044B] }, +{ source: [0x1E067], NFC: [0x1E067], NFD: [0x1E067], NFKC: [0x0491], NFKD: [0x0491] }, +{ source: [0x1E068], NFC: [0x1E068], NFD: [0x1E068], NFKC: [0x0456], NFKD: [0x0456] }, +{ source: [0x1E069], NFC: [0x1E069], NFD: [0x1E069], NFKC: [0x0455], NFKD: [0x0455] }, +{ source: [0x1E06A], NFC: [0x1E06A], NFD: [0x1E06A], NFKC: [0x045F], NFKD: [0x045F] }, +{ source: [0x1E06B], NFC: [0x1E06B], NFD: [0x1E06B], NFKC: [0x04AB], NFKD: [0x04AB] }, +{ source: [0x1E06C], NFC: [0x1E06C], NFD: [0x1E06C], NFKC: [0xA651], NFKD: [0xA651] }, +{ source: [0x1E06D], NFC: [0x1E06D], NFD: [0x1E06D], NFKC: [0x04B1], NFKD: [0x04B1] }, +{ source: [0x1EE00], NFC: [0x1EE00], NFD: [0x1EE00], NFKC: [0x0627], NFKD: [0x0627] }, +{ source: [0x1EE01], NFC: [0x1EE01], NFD: [0x1EE01], NFKC: [0x0628], NFKD: [0x0628] }, +{ source: [0x1EE02], NFC: [0x1EE02], NFD: [0x1EE02], NFKC: [0x062C], NFKD: [0x062C] }, +{ source: [0x1EE03], NFC: [0x1EE03], NFD: [0x1EE03], NFKC: [0x062F], NFKD: [0x062F] }, +{ source: [0x1EE05], NFC: [0x1EE05], NFD: [0x1EE05], NFKC: [0x0648], NFKD: [0x0648] }, +{ source: [0x1EE06], NFC: [0x1EE06], NFD: [0x1EE06], NFKC: [0x0632], NFKD: [0x0632] }, +{ source: [0x1EE07], NFC: [0x1EE07], NFD: [0x1EE07], NFKC: [0x062D], NFKD: [0x062D] }, +{ source: [0x1EE08], NFC: [0x1EE08], NFD: [0x1EE08], NFKC: [0x0637], NFKD: [0x0637] }, +{ source: [0x1EE09], NFC: [0x1EE09], NFD: [0x1EE09], NFKC: [0x064A], NFKD: [0x064A] }, +{ source: [0x1EE0A], NFC: [0x1EE0A], NFD: [0x1EE0A], NFKC: [0x0643], NFKD: [0x0643] }, +{ source: [0x1EE0B], NFC: [0x1EE0B], NFD: [0x1EE0B], NFKC: [0x0644], NFKD: [0x0644] }, +{ source: [0x1EE0C], NFC: [0x1EE0C], NFD: [0x1EE0C], NFKC: [0x0645], NFKD: [0x0645] }, +{ source: [0x1EE0D], NFC: [0x1EE0D], NFD: [0x1EE0D], NFKC: [0x0646], NFKD: [0x0646] }, +{ source: [0x1EE0E], NFC: [0x1EE0E], NFD: [0x1EE0E], NFKC: [0x0633], NFKD: [0x0633] }, +{ source: [0x1EE0F], NFC: [0x1EE0F], NFD: [0x1EE0F], NFKC: [0x0639], NFKD: [0x0639] }, +{ source: [0x1EE10], NFC: [0x1EE10], NFD: [0x1EE10], NFKC: [0x0641], NFKD: [0x0641] }, +{ source: [0x1EE11], NFC: [0x1EE11], NFD: [0x1EE11], NFKC: [0x0635], NFKD: [0x0635] }, +{ source: [0x1EE12], NFC: [0x1EE12], NFD: [0x1EE12], NFKC: [0x0642], NFKD: [0x0642] }, +{ source: [0x1EE13], NFC: [0x1EE13], NFD: [0x1EE13], NFKC: [0x0631], NFKD: [0x0631] }, +{ source: [0x1EE14], NFC: [0x1EE14], NFD: [0x1EE14], NFKC: [0x0634], NFKD: [0x0634] }, +{ source: [0x1EE15], NFC: [0x1EE15], NFD: [0x1EE15], NFKC: [0x062A], NFKD: [0x062A] }, +{ source: [0x1EE16], NFC: [0x1EE16], NFD: [0x1EE16], NFKC: [0x062B], NFKD: [0x062B] }, +{ source: [0x1EE17], NFC: [0x1EE17], NFD: [0x1EE17], NFKC: [0x062E], NFKD: [0x062E] }, +{ source: [0x1EE18], NFC: [0x1EE18], NFD: [0x1EE18], NFKC: [0x0630], NFKD: [0x0630] }, +{ source: [0x1EE19], NFC: [0x1EE19], NFD: [0x1EE19], NFKC: [0x0636], NFKD: [0x0636] }, +{ source: [0x1EE1A], NFC: [0x1EE1A], NFD: [0x1EE1A], NFKC: [0x0638], NFKD: [0x0638] }, +{ source: [0x1EE1B], NFC: [0x1EE1B], NFD: [0x1EE1B], NFKC: [0x063A], NFKD: [0x063A] }, +{ source: [0x1EE1C], NFC: [0x1EE1C], NFD: [0x1EE1C], NFKC: [0x066E], NFKD: [0x066E] }, +{ source: [0x1EE1D], NFC: [0x1EE1D], NFD: [0x1EE1D], NFKC: [0x06BA], NFKD: [0x06BA] }, +{ source: [0x1EE1E], NFC: [0x1EE1E], NFD: [0x1EE1E], NFKC: [0x06A1], NFKD: [0x06A1] }, +{ source: [0x1EE1F], NFC: [0x1EE1F], NFD: [0x1EE1F], NFKC: [0x066F], NFKD: [0x066F] }, +{ source: [0x1EE21], NFC: [0x1EE21], NFD: [0x1EE21], NFKC: [0x0628], NFKD: [0x0628] }, +{ source: [0x1EE22], NFC: [0x1EE22], NFD: [0x1EE22], NFKC: [0x062C], NFKD: [0x062C] }, +{ source: [0x1EE24], NFC: [0x1EE24], NFD: [0x1EE24], NFKC: [0x0647], NFKD: [0x0647] }, +{ source: [0x1EE27], NFC: [0x1EE27], NFD: [0x1EE27], NFKC: [0x062D], NFKD: [0x062D] }, +{ source: [0x1EE29], NFC: [0x1EE29], NFD: [0x1EE29], NFKC: [0x064A], NFKD: [0x064A] }, +{ source: [0x1EE2A], NFC: [0x1EE2A], NFD: [0x1EE2A], NFKC: [0x0643], NFKD: [0x0643] }, +{ source: [0x1EE2B], NFC: [0x1EE2B], NFD: [0x1EE2B], NFKC: [0x0644], NFKD: [0x0644] }, +{ source: [0x1EE2C], NFC: [0x1EE2C], NFD: [0x1EE2C], NFKC: [0x0645], NFKD: [0x0645] }, +{ source: [0x1EE2D], NFC: [0x1EE2D], NFD: [0x1EE2D], NFKC: [0x0646], NFKD: [0x0646] }, +{ source: [0x1EE2E], NFC: [0x1EE2E], NFD: [0x1EE2E], NFKC: [0x0633], NFKD: [0x0633] }, +{ source: [0x1EE2F], NFC: [0x1EE2F], NFD: [0x1EE2F], NFKC: [0x0639], NFKD: [0x0639] }, +{ source: [0x1EE30], NFC: [0x1EE30], NFD: [0x1EE30], NFKC: [0x0641], NFKD: [0x0641] }, +{ source: [0x1EE31], NFC: [0x1EE31], NFD: [0x1EE31], NFKC: [0x0635], NFKD: [0x0635] }, +{ source: [0x1EE32], NFC: [0x1EE32], NFD: [0x1EE32], NFKC: [0x0642], NFKD: [0x0642] }, +{ source: [0x1EE34], NFC: [0x1EE34], NFD: [0x1EE34], NFKC: [0x0634], NFKD: [0x0634] }, +{ source: [0x1EE35], NFC: [0x1EE35], NFD: [0x1EE35], NFKC: [0x062A], NFKD: [0x062A] }, +{ source: [0x1EE36], NFC: [0x1EE36], NFD: [0x1EE36], NFKC: [0x062B], NFKD: [0x062B] }, +{ source: [0x1EE37], NFC: [0x1EE37], NFD: [0x1EE37], NFKC: [0x062E], NFKD: [0x062E] }, +{ source: [0x1EE39], NFC: [0x1EE39], NFD: [0x1EE39], NFKC: [0x0636], NFKD: [0x0636] }, +{ source: [0x1EE3B], NFC: [0x1EE3B], NFD: [0x1EE3B], NFKC: [0x063A], NFKD: [0x063A] }, +{ source: [0x1EE42], NFC: [0x1EE42], NFD: [0x1EE42], NFKC: [0x062C], NFKD: [0x062C] }, +{ source: [0x1EE47], NFC: [0x1EE47], NFD: [0x1EE47], NFKC: [0x062D], NFKD: [0x062D] }, +{ source: [0x1EE49], NFC: [0x1EE49], NFD: [0x1EE49], NFKC: [0x064A], NFKD: [0x064A] }, +{ source: [0x1EE4B], NFC: [0x1EE4B], NFD: [0x1EE4B], NFKC: [0x0644], NFKD: [0x0644] }, +{ source: [0x1EE4D], NFC: [0x1EE4D], NFD: [0x1EE4D], NFKC: [0x0646], NFKD: [0x0646] }, +{ source: [0x1EE4E], NFC: [0x1EE4E], NFD: [0x1EE4E], NFKC: [0x0633], NFKD: [0x0633] }, +{ source: [0x1EE4F], NFC: [0x1EE4F], NFD: [0x1EE4F], NFKC: [0x0639], NFKD: [0x0639] }, +{ source: [0x1EE51], NFC: [0x1EE51], NFD: [0x1EE51], NFKC: [0x0635], NFKD: [0x0635] }, +{ source: [0x1EE52], NFC: [0x1EE52], NFD: [0x1EE52], NFKC: [0x0642], NFKD: [0x0642] }, +{ source: [0x1EE54], NFC: [0x1EE54], NFD: [0x1EE54], NFKC: [0x0634], NFKD: [0x0634] }, +{ source: [0x1EE57], NFC: [0x1EE57], NFD: [0x1EE57], NFKC: [0x062E], NFKD: [0x062E] }, +{ source: [0x1EE59], NFC: [0x1EE59], NFD: [0x1EE59], NFKC: [0x0636], NFKD: [0x0636] }, +{ source: [0x1EE5B], NFC: [0x1EE5B], NFD: [0x1EE5B], NFKC: [0x063A], NFKD: [0x063A] }, +{ source: [0x1EE5D], NFC: [0x1EE5D], NFD: [0x1EE5D], NFKC: [0x06BA], NFKD: [0x06BA] }, +{ source: [0x1EE5F], NFC: [0x1EE5F], NFD: [0x1EE5F], NFKC: [0x066F], NFKD: [0x066F] }, +{ source: [0x1EE61], NFC: [0x1EE61], NFD: [0x1EE61], NFKC: [0x0628], NFKD: [0x0628] }, +{ source: [0x1EE62], NFC: [0x1EE62], NFD: [0x1EE62], NFKC: [0x062C], NFKD: [0x062C] }, +{ source: [0x1EE64], NFC: [0x1EE64], NFD: [0x1EE64], NFKC: [0x0647], NFKD: [0x0647] }, +{ source: [0x1EE67], NFC: [0x1EE67], NFD: [0x1EE67], NFKC: [0x062D], NFKD: [0x062D] }, +{ source: [0x1EE68], NFC: [0x1EE68], NFD: [0x1EE68], NFKC: [0x0637], NFKD: [0x0637] }, +{ source: [0x1EE69], NFC: [0x1EE69], NFD: [0x1EE69], NFKC: [0x064A], NFKD: [0x064A] }, +{ source: [0x1EE6A], NFC: [0x1EE6A], NFD: [0x1EE6A], NFKC: [0x0643], NFKD: [0x0643] }, +{ source: [0x1EE6C], NFC: [0x1EE6C], NFD: [0x1EE6C], NFKC: [0x0645], NFKD: [0x0645] }, +{ source: [0x1EE6D], NFC: [0x1EE6D], NFD: [0x1EE6D], NFKC: [0x0646], NFKD: [0x0646] }, +{ source: [0x1EE6E], NFC: [0x1EE6E], NFD: [0x1EE6E], NFKC: [0x0633], NFKD: [0x0633] }, +{ source: [0x1EE6F], NFC: [0x1EE6F], NFD: [0x1EE6F], NFKC: [0x0639], NFKD: [0x0639] }, +{ source: [0x1EE70], NFC: [0x1EE70], NFD: [0x1EE70], NFKC: [0x0641], NFKD: [0x0641] }, +{ source: [0x1EE71], NFC: [0x1EE71], NFD: [0x1EE71], NFKC: [0x0635], NFKD: [0x0635] }, +{ source: [0x1EE72], NFC: [0x1EE72], NFD: [0x1EE72], NFKC: [0x0642], NFKD: [0x0642] }, +{ source: [0x1EE74], NFC: [0x1EE74], NFD: [0x1EE74], NFKC: [0x0634], NFKD: [0x0634] }, +{ source: [0x1EE75], NFC: [0x1EE75], NFD: [0x1EE75], NFKC: [0x062A], NFKD: [0x062A] }, +{ source: [0x1EE76], NFC: [0x1EE76], NFD: [0x1EE76], NFKC: [0x062B], NFKD: [0x062B] }, +{ source: [0x1EE77], NFC: [0x1EE77], NFD: [0x1EE77], NFKC: [0x062E], NFKD: [0x062E] }, +{ source: [0x1EE79], NFC: [0x1EE79], NFD: [0x1EE79], NFKC: [0x0636], NFKD: [0x0636] }, +{ source: [0x1EE7A], NFC: [0x1EE7A], NFD: [0x1EE7A], NFKC: [0x0638], NFKD: [0x0638] }, +{ source: [0x1EE7B], NFC: [0x1EE7B], NFD: [0x1EE7B], NFKC: [0x063A], NFKD: [0x063A] }, +{ source: [0x1EE7C], NFC: [0x1EE7C], NFD: [0x1EE7C], NFKC: [0x066E], NFKD: [0x066E] }, +{ source: [0x1EE7E], NFC: [0x1EE7E], NFD: [0x1EE7E], NFKC: [0x06A1], NFKD: [0x06A1] }, +{ source: [0x1EE80], NFC: [0x1EE80], NFD: [0x1EE80], NFKC: [0x0627], NFKD: [0x0627] }, +{ source: [0x1EE81], NFC: [0x1EE81], NFD: [0x1EE81], NFKC: [0x0628], NFKD: [0x0628] }, +{ source: [0x1EE82], NFC: [0x1EE82], NFD: [0x1EE82], NFKC: [0x062C], NFKD: [0x062C] }, +{ source: [0x1EE83], NFC: [0x1EE83], NFD: [0x1EE83], NFKC: [0x062F], NFKD: [0x062F] }, +{ source: [0x1EE84], NFC: [0x1EE84], NFD: [0x1EE84], NFKC: [0x0647], NFKD: [0x0647] }, +{ source: [0x1EE85], NFC: [0x1EE85], NFD: [0x1EE85], NFKC: [0x0648], NFKD: [0x0648] }, +{ source: [0x1EE86], NFC: [0x1EE86], NFD: [0x1EE86], NFKC: [0x0632], NFKD: [0x0632] }, +{ source: [0x1EE87], NFC: [0x1EE87], NFD: [0x1EE87], NFKC: [0x062D], NFKD: [0x062D] }, +{ source: [0x1EE88], NFC: [0x1EE88], NFD: [0x1EE88], NFKC: [0x0637], NFKD: [0x0637] }, +{ source: [0x1EE89], NFC: [0x1EE89], NFD: [0x1EE89], NFKC: [0x064A], NFKD: [0x064A] }, +{ source: [0x1EE8B], NFC: [0x1EE8B], NFD: [0x1EE8B], NFKC: [0x0644], NFKD: [0x0644] }, +{ source: [0x1EE8C], NFC: [0x1EE8C], NFD: [0x1EE8C], NFKC: [0x0645], NFKD: [0x0645] }, +{ source: [0x1EE8D], NFC: [0x1EE8D], NFD: [0x1EE8D], NFKC: [0x0646], NFKD: [0x0646] }, +{ source: [0x1EE8E], NFC: [0x1EE8E], NFD: [0x1EE8E], NFKC: [0x0633], NFKD: [0x0633] }, +{ source: [0x1EE8F], NFC: [0x1EE8F], NFD: [0x1EE8F], NFKC: [0x0639], NFKD: [0x0639] }, +{ source: [0x1EE90], NFC: [0x1EE90], NFD: [0x1EE90], NFKC: [0x0641], NFKD: [0x0641] }, +{ source: [0x1EE91], NFC: [0x1EE91], NFD: [0x1EE91], NFKC: [0x0635], NFKD: [0x0635] }, +{ source: [0x1EE92], NFC: [0x1EE92], NFD: [0x1EE92], NFKC: [0x0642], NFKD: [0x0642] }, +{ source: [0x1EE93], NFC: [0x1EE93], NFD: [0x1EE93], NFKC: [0x0631], NFKD: [0x0631] }, +{ source: [0x1EE94], NFC: [0x1EE94], NFD: [0x1EE94], NFKC: [0x0634], NFKD: [0x0634] }, +{ source: [0x1EE95], NFC: [0x1EE95], NFD: [0x1EE95], NFKC: [0x062A], NFKD: [0x062A] }, +{ source: [0x1EE96], NFC: [0x1EE96], NFD: [0x1EE96], NFKC: [0x062B], NFKD: [0x062B] }, +{ source: [0x1EE97], NFC: [0x1EE97], NFD: [0x1EE97], NFKC: [0x062E], NFKD: [0x062E] }, +{ source: [0x1EE98], NFC: [0x1EE98], NFD: [0x1EE98], NFKC: [0x0630], NFKD: [0x0630] }, +{ source: [0x1EE99], NFC: [0x1EE99], NFD: [0x1EE99], NFKC: [0x0636], NFKD: [0x0636] }, +{ source: [0x1EE9A], NFC: [0x1EE9A], NFD: [0x1EE9A], NFKC: [0x0638], NFKD: [0x0638] }, +{ source: [0x1EE9B], NFC: [0x1EE9B], NFD: [0x1EE9B], NFKC: [0x063A], NFKD: [0x063A] }, +{ source: [0x1EEA1], NFC: [0x1EEA1], NFD: [0x1EEA1], NFKC: [0x0628], NFKD: [0x0628] }, +{ source: [0x1EEA2], NFC: [0x1EEA2], NFD: [0x1EEA2], NFKC: [0x062C], NFKD: [0x062C] }, +{ source: [0x1EEA3], NFC: [0x1EEA3], NFD: [0x1EEA3], NFKC: [0x062F], NFKD: [0x062F] }, +{ source: [0x1EEA5], NFC: [0x1EEA5], NFD: [0x1EEA5], NFKC: [0x0648], NFKD: [0x0648] }, +{ source: [0x1EEA6], NFC: [0x1EEA6], NFD: [0x1EEA6], NFKC: [0x0632], NFKD: [0x0632] }, +{ source: [0x1EEA7], NFC: [0x1EEA7], NFD: [0x1EEA7], NFKC: [0x062D], NFKD: [0x062D] }, +{ source: [0x1EEA8], NFC: [0x1EEA8], NFD: [0x1EEA8], NFKC: [0x0637], NFKD: [0x0637] }, +{ source: [0x1EEA9], NFC: [0x1EEA9], NFD: [0x1EEA9], NFKC: [0x064A], NFKD: [0x064A] }, +{ source: [0x1EEAB], NFC: [0x1EEAB], NFD: [0x1EEAB], NFKC: [0x0644], NFKD: [0x0644] }, +{ source: [0x1EEAC], NFC: [0x1EEAC], NFD: [0x1EEAC], NFKC: [0x0645], NFKD: [0x0645] }, +{ source: [0x1EEAD], NFC: [0x1EEAD], NFD: [0x1EEAD], NFKC: [0x0646], NFKD: [0x0646] }, +{ source: [0x1EEAE], NFC: [0x1EEAE], NFD: [0x1EEAE], NFKC: [0x0633], NFKD: [0x0633] }, +{ source: [0x1EEAF], NFC: [0x1EEAF], NFD: [0x1EEAF], NFKC: [0x0639], NFKD: [0x0639] }, +{ source: [0x1EEB0], NFC: [0x1EEB0], NFD: [0x1EEB0], NFKC: [0x0641], NFKD: [0x0641] }, +{ source: [0x1EEB1], NFC: [0x1EEB1], NFD: [0x1EEB1], NFKC: [0x0635], NFKD: [0x0635] }, +{ source: [0x1EEB2], NFC: [0x1EEB2], NFD: [0x1EEB2], NFKC: [0x0642], NFKD: [0x0642] }, +{ source: [0x1EEB3], NFC: [0x1EEB3], NFD: [0x1EEB3], NFKC: [0x0631], NFKD: [0x0631] }, +{ source: [0x1EEB4], NFC: [0x1EEB4], NFD: [0x1EEB4], NFKC: [0x0634], NFKD: [0x0634] }, +{ source: [0x1EEB5], NFC: [0x1EEB5], NFD: [0x1EEB5], NFKC: [0x062A], NFKD: [0x062A] }, +{ source: [0x1EEB6], NFC: [0x1EEB6], NFD: [0x1EEB6], NFKC: [0x062B], NFKD: [0x062B] }, +{ source: [0x1EEB7], NFC: [0x1EEB7], NFD: [0x1EEB7], NFKC: [0x062E], NFKD: [0x062E] }, +{ source: [0x1EEB8], NFC: [0x1EEB8], NFD: [0x1EEB8], NFKC: [0x0630], NFKD: [0x0630] }, +{ source: [0x1EEB9], NFC: [0x1EEB9], NFD: [0x1EEB9], NFKC: [0x0636], NFKD: [0x0636] }, +{ source: [0x1EEBA], NFC: [0x1EEBA], NFD: [0x1EEBA], NFKC: [0x0638], NFKD: [0x0638] }, +{ source: [0x1EEBB], NFC: [0x1EEBB], NFD: [0x1EEBB], NFKC: [0x063A], NFKD: [0x063A] }, +{ source: [0x1F100], NFC: [0x1F100], NFD: [0x1F100], NFKC: [0x0030, 0x002E], NFKD: [0x0030, 0x002E] }, +{ source: [0x1F101], NFC: [0x1F101], NFD: [0x1F101], NFKC: [0x0030, 0x002C], NFKD: [0x0030, 0x002C] }, +{ source: [0x1F102], NFC: [0x1F102], NFD: [0x1F102], NFKC: [0x0031, 0x002C], NFKD: [0x0031, 0x002C] }, +{ source: [0x1F103], NFC: [0x1F103], NFD: [0x1F103], NFKC: [0x0032, 0x002C], NFKD: [0x0032, 0x002C] }, +{ source: [0x1F104], NFC: [0x1F104], NFD: [0x1F104], NFKC: [0x0033, 0x002C], NFKD: [0x0033, 0x002C] }, +{ source: [0x1F105], NFC: [0x1F105], NFD: [0x1F105], NFKC: [0x0034, 0x002C], NFKD: [0x0034, 0x002C] }, +{ source: [0x1F106], NFC: [0x1F106], NFD: [0x1F106], NFKC: [0x0035, 0x002C], NFKD: [0x0035, 0x002C] }, +{ source: [0x1F107], NFC: [0x1F107], NFD: [0x1F107], NFKC: [0x0036, 0x002C], NFKD: [0x0036, 0x002C] }, +{ source: [0x1F108], NFC: [0x1F108], NFD: [0x1F108], NFKC: [0x0037, 0x002C], NFKD: [0x0037, 0x002C] }, +{ source: [0x1F109], NFC: [0x1F109], NFD: [0x1F109], NFKC: [0x0038, 0x002C], NFKD: [0x0038, 0x002C] }, +{ source: [0x1F10A], NFC: [0x1F10A], NFD: [0x1F10A], NFKC: [0x0039, 0x002C], NFKD: [0x0039, 0x002C] }, +{ source: [0x1F110], NFC: [0x1F110], NFD: [0x1F110], NFKC: [0x0028, 0x0041, 0x0029], NFKD: [0x0028, 0x0041, 0x0029] }, +{ source: [0x1F111], NFC: [0x1F111], NFD: [0x1F111], NFKC: [0x0028, 0x0042, 0x0029], NFKD: [0x0028, 0x0042, 0x0029] }, +{ source: [0x1F112], NFC: [0x1F112], NFD: [0x1F112], NFKC: [0x0028, 0x0043, 0x0029], NFKD: [0x0028, 0x0043, 0x0029] }, +{ source: [0x1F113], NFC: [0x1F113], NFD: [0x1F113], NFKC: [0x0028, 0x0044, 0x0029], NFKD: [0x0028, 0x0044, 0x0029] }, +{ source: [0x1F114], NFC: [0x1F114], NFD: [0x1F114], NFKC: [0x0028, 0x0045, 0x0029], NFKD: [0x0028, 0x0045, 0x0029] }, +{ source: [0x1F115], NFC: [0x1F115], NFD: [0x1F115], NFKC: [0x0028, 0x0046, 0x0029], NFKD: [0x0028, 0x0046, 0x0029] }, +{ source: [0x1F116], NFC: [0x1F116], NFD: [0x1F116], NFKC: [0x0028, 0x0047, 0x0029], NFKD: [0x0028, 0x0047, 0x0029] }, +{ source: [0x1F117], NFC: [0x1F117], NFD: [0x1F117], NFKC: [0x0028, 0x0048, 0x0029], NFKD: [0x0028, 0x0048, 0x0029] }, +{ source: [0x1F118], NFC: [0x1F118], NFD: [0x1F118], NFKC: [0x0028, 0x0049, 0x0029], NFKD: [0x0028, 0x0049, 0x0029] }, +{ source: [0x1F119], NFC: [0x1F119], NFD: [0x1F119], NFKC: [0x0028, 0x004A, 0x0029], NFKD: [0x0028, 0x004A, 0x0029] }, +{ source: [0x1F11A], NFC: [0x1F11A], NFD: [0x1F11A], NFKC: [0x0028, 0x004B, 0x0029], NFKD: [0x0028, 0x004B, 0x0029] }, +{ source: [0x1F11B], NFC: [0x1F11B], NFD: [0x1F11B], NFKC: [0x0028, 0x004C, 0x0029], NFKD: [0x0028, 0x004C, 0x0029] }, +{ source: [0x1F11C], NFC: [0x1F11C], NFD: [0x1F11C], NFKC: [0x0028, 0x004D, 0x0029], NFKD: [0x0028, 0x004D, 0x0029] }, +{ source: [0x1F11D], NFC: [0x1F11D], NFD: [0x1F11D], NFKC: [0x0028, 0x004E, 0x0029], NFKD: [0x0028, 0x004E, 0x0029] }, +{ source: [0x1F11E], NFC: [0x1F11E], NFD: [0x1F11E], NFKC: [0x0028, 0x004F, 0x0029], NFKD: [0x0028, 0x004F, 0x0029] }, +{ source: [0x1F11F], NFC: [0x1F11F], NFD: [0x1F11F], NFKC: [0x0028, 0x0050, 0x0029], NFKD: [0x0028, 0x0050, 0x0029] }, +{ source: [0x1F120], NFC: [0x1F120], NFD: [0x1F120], NFKC: [0x0028, 0x0051, 0x0029], NFKD: [0x0028, 0x0051, 0x0029] }, +{ source: [0x1F121], NFC: [0x1F121], NFD: [0x1F121], NFKC: [0x0028, 0x0052, 0x0029], NFKD: [0x0028, 0x0052, 0x0029] }, +{ source: [0x1F122], NFC: [0x1F122], NFD: [0x1F122], NFKC: [0x0028, 0x0053, 0x0029], NFKD: [0x0028, 0x0053, 0x0029] }, +{ source: [0x1F123], NFC: [0x1F123], NFD: [0x1F123], NFKC: [0x0028, 0x0054, 0x0029], NFKD: [0x0028, 0x0054, 0x0029] }, +{ source: [0x1F124], NFC: [0x1F124], NFD: [0x1F124], NFKC: [0x0028, 0x0055, 0x0029], NFKD: [0x0028, 0x0055, 0x0029] }, +{ source: [0x1F125], NFC: [0x1F125], NFD: [0x1F125], NFKC: [0x0028, 0x0056, 0x0029], NFKD: [0x0028, 0x0056, 0x0029] }, +{ source: [0x1F126], NFC: [0x1F126], NFD: [0x1F126], NFKC: [0x0028, 0x0057, 0x0029], NFKD: [0x0028, 0x0057, 0x0029] }, +{ source: [0x1F127], NFC: [0x1F127], NFD: [0x1F127], NFKC: [0x0028, 0x0058, 0x0029], NFKD: [0x0028, 0x0058, 0x0029] }, +{ source: [0x1F128], NFC: [0x1F128], NFD: [0x1F128], NFKC: [0x0028, 0x0059, 0x0029], NFKD: [0x0028, 0x0059, 0x0029] }, +{ source: [0x1F129], NFC: [0x1F129], NFD: [0x1F129], NFKC: [0x0028, 0x005A, 0x0029], NFKD: [0x0028, 0x005A, 0x0029] }, +{ source: [0x1F12A], NFC: [0x1F12A], NFD: [0x1F12A], NFKC: [0x3014, 0x0053, 0x3015], NFKD: [0x3014, 0x0053, 0x3015] }, +{ source: [0x1F12B], NFC: [0x1F12B], NFD: [0x1F12B], NFKC: [0x0043], NFKD: [0x0043] }, +{ source: [0x1F12C], NFC: [0x1F12C], NFD: [0x1F12C], NFKC: [0x0052], NFKD: [0x0052] }, +{ source: [0x1F12D], NFC: [0x1F12D], NFD: [0x1F12D], NFKC: [0x0043, 0x0044], NFKD: [0x0043, 0x0044] }, +{ source: [0x1F12E], NFC: [0x1F12E], NFD: [0x1F12E], NFKC: [0x0057, 0x005A], NFKD: [0x0057, 0x005A] }, +{ source: [0x1F130], NFC: [0x1F130], NFD: [0x1F130], NFKC: [0x0041], NFKD: [0x0041] }, +{ source: [0x1F131], NFC: [0x1F131], NFD: [0x1F131], NFKC: [0x0042], NFKD: [0x0042] }, +{ source: [0x1F132], NFC: [0x1F132], NFD: [0x1F132], NFKC: [0x0043], NFKD: [0x0043] }, +{ source: [0x1F133], NFC: [0x1F133], NFD: [0x1F133], NFKC: [0x0044], NFKD: [0x0044] }, +{ source: [0x1F134], NFC: [0x1F134], NFD: [0x1F134], NFKC: [0x0045], NFKD: [0x0045] }, +{ source: [0x1F135], NFC: [0x1F135], NFD: [0x1F135], NFKC: [0x0046], NFKD: [0x0046] }, +{ source: [0x1F136], NFC: [0x1F136], NFD: [0x1F136], NFKC: [0x0047], NFKD: [0x0047] }, +{ source: [0x1F137], NFC: [0x1F137], NFD: [0x1F137], NFKC: [0x0048], NFKD: [0x0048] }, +{ source: [0x1F138], NFC: [0x1F138], NFD: [0x1F138], NFKC: [0x0049], NFKD: [0x0049] }, +{ source: [0x1F139], NFC: [0x1F139], NFD: [0x1F139], NFKC: [0x004A], NFKD: [0x004A] }, +{ source: [0x1F13A], NFC: [0x1F13A], NFD: [0x1F13A], NFKC: [0x004B], NFKD: [0x004B] }, +{ source: [0x1F13B], NFC: [0x1F13B], NFD: [0x1F13B], NFKC: [0x004C], NFKD: [0x004C] }, +{ source: [0x1F13C], NFC: [0x1F13C], NFD: [0x1F13C], NFKC: [0x004D], NFKD: [0x004D] }, +{ source: [0x1F13D], NFC: [0x1F13D], NFD: [0x1F13D], NFKC: [0x004E], NFKD: [0x004E] }, +{ source: [0x1F13E], NFC: [0x1F13E], NFD: [0x1F13E], NFKC: [0x004F], NFKD: [0x004F] }, +{ source: [0x1F13F], NFC: [0x1F13F], NFD: [0x1F13F], NFKC: [0x0050], NFKD: [0x0050] }, +{ source: [0x1F140], NFC: [0x1F140], NFD: [0x1F140], NFKC: [0x0051], NFKD: [0x0051] }, +{ source: [0x1F141], NFC: [0x1F141], NFD: [0x1F141], NFKC: [0x0052], NFKD: [0x0052] }, +{ source: [0x1F142], NFC: [0x1F142], NFD: [0x1F142], NFKC: [0x0053], NFKD: [0x0053] }, +{ source: [0x1F143], NFC: [0x1F143], NFD: [0x1F143], NFKC: [0x0054], NFKD: [0x0054] }, +{ source: [0x1F144], NFC: [0x1F144], NFD: [0x1F144], NFKC: [0x0055], NFKD: [0x0055] }, +{ source: [0x1F145], NFC: [0x1F145], NFD: [0x1F145], NFKC: [0x0056], NFKD: [0x0056] }, +{ source: [0x1F146], NFC: [0x1F146], NFD: [0x1F146], NFKC: [0x0057], NFKD: [0x0057] }, +{ source: [0x1F147], NFC: [0x1F147], NFD: [0x1F147], NFKC: [0x0058], NFKD: [0x0058] }, +{ source: [0x1F148], NFC: [0x1F148], NFD: [0x1F148], NFKC: [0x0059], NFKD: [0x0059] }, +{ source: [0x1F149], NFC: [0x1F149], NFD: [0x1F149], NFKC: [0x005A], NFKD: [0x005A] }, +{ source: [0x1F14A], NFC: [0x1F14A], NFD: [0x1F14A], NFKC: [0x0048, 0x0056], NFKD: [0x0048, 0x0056] }, +{ source: [0x1F14B], NFC: [0x1F14B], NFD: [0x1F14B], NFKC: [0x004D, 0x0056], NFKD: [0x004D, 0x0056] }, +{ source: [0x1F14C], NFC: [0x1F14C], NFD: [0x1F14C], NFKC: [0x0053, 0x0044], NFKD: [0x0053, 0x0044] }, +{ source: [0x1F14D], NFC: [0x1F14D], NFD: [0x1F14D], NFKC: [0x0053, 0x0053], NFKD: [0x0053, 0x0053] }, +{ source: [0x1F14E], NFC: [0x1F14E], NFD: [0x1F14E], NFKC: [0x0050, 0x0050, 0x0056], NFKD: [0x0050, 0x0050, 0x0056] }, +{ source: [0x1F14F], NFC: [0x1F14F], NFD: [0x1F14F], NFKC: [0x0057, 0x0043], NFKD: [0x0057, 0x0043] }, +{ source: [0x1F16A], NFC: [0x1F16A], NFD: [0x1F16A], NFKC: [0x004D, 0x0043], NFKD: [0x004D, 0x0043] }, +{ source: [0x1F16B], NFC: [0x1F16B], NFD: [0x1F16B], NFKC: [0x004D, 0x0044], NFKD: [0x004D, 0x0044] }, +{ source: [0x1F16C], NFC: [0x1F16C], NFD: [0x1F16C], NFKC: [0x004D, 0x0052], NFKD: [0x004D, 0x0052] }, +{ source: [0x1F190], NFC: [0x1F190], NFD: [0x1F190], NFKC: [0x0044, 0x004A], NFKD: [0x0044, 0x004A] }, +{ source: [0x1F200], NFC: [0x1F200], NFD: [0x1F200], NFKC: [0x307B, 0x304B], NFKD: [0x307B, 0x304B] }, +{ source: [0x1F201], NFC: [0x1F201], NFD: [0x1F201], NFKC: [0x30B3, 0x30B3], NFKD: [0x30B3, 0x30B3] }, +{ source: [0x1F202], NFC: [0x1F202], NFD: [0x1F202], NFKC: [0x30B5], NFKD: [0x30B5] }, +{ source: [0x1F210], NFC: [0x1F210], NFD: [0x1F210], NFKC: [0x624B], NFKD: [0x624B] }, +{ source: [0x1F211], NFC: [0x1F211], NFD: [0x1F211], NFKC: [0x5B57], NFKD: [0x5B57] }, +{ source: [0x1F212], NFC: [0x1F212], NFD: [0x1F212], NFKC: [0x53CC], NFKD: [0x53CC] }, +{ source: [0x1F213], NFC: [0x1F213], NFD: [0x1F213], NFKC: [0x30C7], NFKD: [0x30C6, 0x3099] }, +{ source: [0x1F214], NFC: [0x1F214], NFD: [0x1F214], NFKC: [0x4E8C], NFKD: [0x4E8C] }, +{ source: [0x1F215], NFC: [0x1F215], NFD: [0x1F215], NFKC: [0x591A], NFKD: [0x591A] }, +{ source: [0x1F216], NFC: [0x1F216], NFD: [0x1F216], NFKC: [0x89E3], NFKD: [0x89E3] }, +{ source: [0x1F217], NFC: [0x1F217], NFD: [0x1F217], NFKC: [0x5929], NFKD: [0x5929] }, +{ source: [0x1F218], NFC: [0x1F218], NFD: [0x1F218], NFKC: [0x4EA4], NFKD: [0x4EA4] }, +{ source: [0x1F219], NFC: [0x1F219], NFD: [0x1F219], NFKC: [0x6620], NFKD: [0x6620] }, +{ source: [0x1F21A], NFC: [0x1F21A], NFD: [0x1F21A], NFKC: [0x7121], NFKD: [0x7121] }, +{ source: [0x1F21B], NFC: [0x1F21B], NFD: [0x1F21B], NFKC: [0x6599], NFKD: [0x6599] }, +{ source: [0x1F21C], NFC: [0x1F21C], NFD: [0x1F21C], NFKC: [0x524D], NFKD: [0x524D] }, +{ source: [0x1F21D], NFC: [0x1F21D], NFD: [0x1F21D], NFKC: [0x5F8C], NFKD: [0x5F8C] }, +{ source: [0x1F21E], NFC: [0x1F21E], NFD: [0x1F21E], NFKC: [0x518D], NFKD: [0x518D] }, +{ source: [0x1F21F], NFC: [0x1F21F], NFD: [0x1F21F], NFKC: [0x65B0], NFKD: [0x65B0] }, +{ source: [0x1F220], NFC: [0x1F220], NFD: [0x1F220], NFKC: [0x521D], NFKD: [0x521D] }, +{ source: [0x1F221], NFC: [0x1F221], NFD: [0x1F221], NFKC: [0x7D42], NFKD: [0x7D42] }, +{ source: [0x1F222], NFC: [0x1F222], NFD: [0x1F222], NFKC: [0x751F], NFKD: [0x751F] }, +{ source: [0x1F223], NFC: [0x1F223], NFD: [0x1F223], NFKC: [0x8CA9], NFKD: [0x8CA9] }, +{ source: [0x1F224], NFC: [0x1F224], NFD: [0x1F224], NFKC: [0x58F0], NFKD: [0x58F0] }, +{ source: [0x1F225], NFC: [0x1F225], NFD: [0x1F225], NFKC: [0x5439], NFKD: [0x5439] }, +{ source: [0x1F226], NFC: [0x1F226], NFD: [0x1F226], NFKC: [0x6F14], NFKD: [0x6F14] }, +{ source: [0x1F227], NFC: [0x1F227], NFD: [0x1F227], NFKC: [0x6295], NFKD: [0x6295] }, +{ source: [0x1F228], NFC: [0x1F228], NFD: [0x1F228], NFKC: [0x6355], NFKD: [0x6355] }, +{ source: [0x1F229], NFC: [0x1F229], NFD: [0x1F229], NFKC: [0x4E00], NFKD: [0x4E00] }, +{ source: [0x1F22A], NFC: [0x1F22A], NFD: [0x1F22A], NFKC: [0x4E09], NFKD: [0x4E09] }, +{ source: [0x1F22B], NFC: [0x1F22B], NFD: [0x1F22B], NFKC: [0x904A], NFKD: [0x904A] }, +{ source: [0x1F22C], NFC: [0x1F22C], NFD: [0x1F22C], NFKC: [0x5DE6], NFKD: [0x5DE6] }, +{ source: [0x1F22D], NFC: [0x1F22D], NFD: [0x1F22D], NFKC: [0x4E2D], NFKD: [0x4E2D] }, +{ source: [0x1F22E], NFC: [0x1F22E], NFD: [0x1F22E], NFKC: [0x53F3], NFKD: [0x53F3] }, +{ source: [0x1F22F], NFC: [0x1F22F], NFD: [0x1F22F], NFKC: [0x6307], NFKD: [0x6307] }, +{ source: [0x1F230], NFC: [0x1F230], NFD: [0x1F230], NFKC: [0x8D70], NFKD: [0x8D70] }, +{ source: [0x1F231], NFC: [0x1F231], NFD: [0x1F231], NFKC: [0x6253], NFKD: [0x6253] }, +{ source: [0x1F232], NFC: [0x1F232], NFD: [0x1F232], NFKC: [0x7981], NFKD: [0x7981] }, +{ source: [0x1F233], NFC: [0x1F233], NFD: [0x1F233], NFKC: [0x7A7A], NFKD: [0x7A7A] }, +{ source: [0x1F234], NFC: [0x1F234], NFD: [0x1F234], NFKC: [0x5408], NFKD: [0x5408] }, +{ source: [0x1F235], NFC: [0x1F235], NFD: [0x1F235], NFKC: [0x6E80], NFKD: [0x6E80] }, +{ source: [0x1F236], NFC: [0x1F236], NFD: [0x1F236], NFKC: [0x6709], NFKD: [0x6709] }, +{ source: [0x1F237], NFC: [0x1F237], NFD: [0x1F237], NFKC: [0x6708], NFKD: [0x6708] }, +{ source: [0x1F238], NFC: [0x1F238], NFD: [0x1F238], NFKC: [0x7533], NFKD: [0x7533] }, +{ source: [0x1F239], NFC: [0x1F239], NFD: [0x1F239], NFKC: [0x5272], NFKD: [0x5272] }, +{ source: [0x1F23A], NFC: [0x1F23A], NFD: [0x1F23A], NFKC: [0x55B6], NFKD: [0x55B6] }, +{ source: [0x1F23B], NFC: [0x1F23B], NFD: [0x1F23B], NFKC: [0x914D], NFKD: [0x914D] }, +{ source: [0x1F240], NFC: [0x1F240], NFD: [0x1F240], NFKC: [0x3014, 0x672C, 0x3015], NFKD: [0x3014, 0x672C, 0x3015] }, +{ source: [0x1F241], NFC: [0x1F241], NFD: [0x1F241], NFKC: [0x3014, 0x4E09, 0x3015], NFKD: [0x3014, 0x4E09, 0x3015] }, +{ source: [0x1F242], NFC: [0x1F242], NFD: [0x1F242], NFKC: [0x3014, 0x4E8C, 0x3015], NFKD: [0x3014, 0x4E8C, 0x3015] }, +{ source: [0x1F243], NFC: [0x1F243], NFD: [0x1F243], NFKC: [0x3014, 0x5B89, 0x3015], NFKD: [0x3014, 0x5B89, 0x3015] }, +{ source: [0x1F244], NFC: [0x1F244], NFD: [0x1F244], NFKC: [0x3014, 0x70B9, 0x3015], NFKD: [0x3014, 0x70B9, 0x3015] }, +{ source: [0x1F245], NFC: [0x1F245], NFD: [0x1F245], NFKC: [0x3014, 0x6253, 0x3015], NFKD: [0x3014, 0x6253, 0x3015] }, +{ source: [0x1F246], NFC: [0x1F246], NFD: [0x1F246], NFKC: [0x3014, 0x76D7, 0x3015], NFKD: [0x3014, 0x76D7, 0x3015] }, +{ source: [0x1F247], NFC: [0x1F247], NFD: [0x1F247], NFKC: [0x3014, 0x52DD, 0x3015], NFKD: [0x3014, 0x52DD, 0x3015] }, +{ source: [0x1F248], NFC: [0x1F248], NFD: [0x1F248], NFKC: [0x3014, 0x6557, 0x3015], NFKD: [0x3014, 0x6557, 0x3015] }, +{ source: [0x1F250], NFC: [0x1F250], NFD: [0x1F250], NFKC: [0x5F97], NFKD: [0x5F97] }, +{ source: [0x1F251], NFC: [0x1F251], NFD: [0x1F251], NFKC: [0x53EF], NFKD: [0x53EF] }, +{ source: [0x1FBF0], NFC: [0x1FBF0], NFD: [0x1FBF0], NFKC: [0x0030], NFKD: [0x0030] }, +{ source: [0x1FBF1], NFC: [0x1FBF1], NFD: [0x1FBF1], NFKC: [0x0031], NFKD: [0x0031] }, +{ source: [0x1FBF2], NFC: [0x1FBF2], NFD: [0x1FBF2], NFKC: [0x0032], NFKD: [0x0032] }, +{ source: [0x1FBF3], NFC: [0x1FBF3], NFD: [0x1FBF3], NFKC: [0x0033], NFKD: [0x0033] }, +{ source: [0x1FBF4], NFC: [0x1FBF4], NFD: [0x1FBF4], NFKC: [0x0034], NFKD: [0x0034] }, +{ source: [0x1FBF5], NFC: [0x1FBF5], NFD: [0x1FBF5], NFKC: [0x0035], NFKD: [0x0035] }, +{ source: [0x1FBF6], NFC: [0x1FBF6], NFD: [0x1FBF6], NFKC: [0x0036], NFKD: [0x0036] }, +{ source: [0x1FBF7], NFC: [0x1FBF7], NFD: [0x1FBF7], NFKC: [0x0037], NFKD: [0x0037] }, +{ source: [0x1FBF8], NFC: [0x1FBF8], NFD: [0x1FBF8], NFKC: [0x0038], NFKD: [0x0038] }, +{ source: [0x1FBF9], NFC: [0x1FBF9], NFD: [0x1FBF9], NFKC: [0x0039], NFKD: [0x0039] }, +{ source: [0x2F800], NFC: [0x4E3D], NFD: [0x4E3D], NFKC: [0x4E3D], NFKD: [0x4E3D] }, +{ source: [0x2F801], NFC: [0x4E38], NFD: [0x4E38], NFKC: [0x4E38], NFKD: [0x4E38] }, +{ source: [0x2F802], NFC: [0x4E41], NFD: [0x4E41], NFKC: [0x4E41], NFKD: [0x4E41] }, +{ source: [0x2F803], NFC: [0x20122], NFD: [0x20122], NFKC: [0x20122], NFKD: [0x20122] }, +{ source: [0x2F804], NFC: [0x4F60], NFD: [0x4F60], NFKC: [0x4F60], NFKD: [0x4F60] }, +{ source: [0x2F805], NFC: [0x4FAE], NFD: [0x4FAE], NFKC: [0x4FAE], NFKD: [0x4FAE] }, +{ source: [0x2F806], NFC: [0x4FBB], NFD: [0x4FBB], NFKC: [0x4FBB], NFKD: [0x4FBB] }, +{ source: [0x2F807], NFC: [0x5002], NFD: [0x5002], NFKC: [0x5002], NFKD: [0x5002] }, +{ source: [0x2F808], NFC: [0x507A], NFD: [0x507A], NFKC: [0x507A], NFKD: [0x507A] }, +{ source: [0x2F809], NFC: [0x5099], NFD: [0x5099], NFKC: [0x5099], NFKD: [0x5099] }, +{ source: [0x2F80A], NFC: [0x50E7], NFD: [0x50E7], NFKC: [0x50E7], NFKD: [0x50E7] }, +{ source: [0x2F80B], NFC: [0x50CF], NFD: [0x50CF], NFKC: [0x50CF], NFKD: [0x50CF] }, +{ source: [0x2F80C], NFC: [0x349E], NFD: [0x349E], NFKC: [0x349E], NFKD: [0x349E] }, +{ source: [0x2F80D], NFC: [0x2063A], NFD: [0x2063A], NFKC: [0x2063A], NFKD: [0x2063A] }, +{ source: [0x2F80E], NFC: [0x514D], NFD: [0x514D], NFKC: [0x514D], NFKD: [0x514D] }, +{ source: [0x2F80F], NFC: [0x5154], NFD: [0x5154], NFKC: [0x5154], NFKD: [0x5154] }, +{ source: [0x2F810], NFC: [0x5164], NFD: [0x5164], NFKC: [0x5164], NFKD: [0x5164] }, +{ source: [0x2F811], NFC: [0x5177], NFD: [0x5177], NFKC: [0x5177], NFKD: [0x5177] }, +{ source: [0x2F812], NFC: [0x2051C], NFD: [0x2051C], NFKC: [0x2051C], NFKD: [0x2051C] }, +{ source: [0x2F813], NFC: [0x34B9], NFD: [0x34B9], NFKC: [0x34B9], NFKD: [0x34B9] }, +{ source: [0x2F814], NFC: [0x5167], NFD: [0x5167], NFKC: [0x5167], NFKD: [0x5167] }, +{ source: [0x2F815], NFC: [0x518D], NFD: [0x518D], NFKC: [0x518D], NFKD: [0x518D] }, +{ source: [0x2F816], NFC: [0x2054B], NFD: [0x2054B], NFKC: [0x2054B], NFKD: [0x2054B] }, +{ source: [0x2F817], NFC: [0x5197], NFD: [0x5197], NFKC: [0x5197], NFKD: [0x5197] }, +{ source: [0x2F818], NFC: [0x51A4], NFD: [0x51A4], NFKC: [0x51A4], NFKD: [0x51A4] }, +{ source: [0x2F819], NFC: [0x4ECC], NFD: [0x4ECC], NFKC: [0x4ECC], NFKD: [0x4ECC] }, +{ source: [0x2F81A], NFC: [0x51AC], NFD: [0x51AC], NFKC: [0x51AC], NFKD: [0x51AC] }, +{ source: [0x2F81B], NFC: [0x51B5], NFD: [0x51B5], NFKC: [0x51B5], NFKD: [0x51B5] }, +{ source: [0x2F81C], NFC: [0x291DF], NFD: [0x291DF], NFKC: [0x291DF], NFKD: [0x291DF] }, +{ source: [0x2F81D], NFC: [0x51F5], NFD: [0x51F5], NFKC: [0x51F5], NFKD: [0x51F5] }, +{ source: [0x2F81E], NFC: [0x5203], NFD: [0x5203], NFKC: [0x5203], NFKD: [0x5203] }, +{ source: [0x2F81F], NFC: [0x34DF], NFD: [0x34DF], NFKC: [0x34DF], NFKD: [0x34DF] }, +{ source: [0x2F820], NFC: [0x523B], NFD: [0x523B], NFKC: [0x523B], NFKD: [0x523B] }, +{ source: [0x2F821], NFC: [0x5246], NFD: [0x5246], NFKC: [0x5246], NFKD: [0x5246] }, +{ source: [0x2F822], NFC: [0x5272], NFD: [0x5272], NFKC: [0x5272], NFKD: [0x5272] }, +{ source: [0x2F823], NFC: [0x5277], NFD: [0x5277], NFKC: [0x5277], NFKD: [0x5277] }, +{ source: [0x2F824], NFC: [0x3515], NFD: [0x3515], NFKC: [0x3515], NFKD: [0x3515] }, +{ source: [0x2F825], NFC: [0x52C7], NFD: [0x52C7], NFKC: [0x52C7], NFKD: [0x52C7] }, +{ source: [0x2F826], NFC: [0x52C9], NFD: [0x52C9], NFKC: [0x52C9], NFKD: [0x52C9] }, +{ source: [0x2F827], NFC: [0x52E4], NFD: [0x52E4], NFKC: [0x52E4], NFKD: [0x52E4] }, +{ source: [0x2F828], NFC: [0x52FA], NFD: [0x52FA], NFKC: [0x52FA], NFKD: [0x52FA] }, +{ source: [0x2F829], NFC: [0x5305], NFD: [0x5305], NFKC: [0x5305], NFKD: [0x5305] }, +{ source: [0x2F82A], NFC: [0x5306], NFD: [0x5306], NFKC: [0x5306], NFKD: [0x5306] }, +{ source: [0x2F82B], NFC: [0x5317], NFD: [0x5317], NFKC: [0x5317], NFKD: [0x5317] }, +{ source: [0x2F82C], NFC: [0x5349], NFD: [0x5349], NFKC: [0x5349], NFKD: [0x5349] }, +{ source: [0x2F82D], NFC: [0x5351], NFD: [0x5351], NFKC: [0x5351], NFKD: [0x5351] }, +{ source: [0x2F82E], NFC: [0x535A], NFD: [0x535A], NFKC: [0x535A], NFKD: [0x535A] }, +{ source: [0x2F82F], NFC: [0x5373], NFD: [0x5373], NFKC: [0x5373], NFKD: [0x5373] }, +{ source: [0x2F830], NFC: [0x537D], NFD: [0x537D], NFKC: [0x537D], NFKD: [0x537D] }, +{ source: [0x2F831], NFC: [0x537F], NFD: [0x537F], NFKC: [0x537F], NFKD: [0x537F] }, +{ source: [0x2F832], NFC: [0x537F], NFD: [0x537F], NFKC: [0x537F], NFKD: [0x537F] }, +{ source: [0x2F833], NFC: [0x537F], NFD: [0x537F], NFKC: [0x537F], NFKD: [0x537F] }, +{ source: [0x2F834], NFC: [0x20A2C], NFD: [0x20A2C], NFKC: [0x20A2C], NFKD: [0x20A2C] }, +{ source: [0x2F835], NFC: [0x7070], NFD: [0x7070], NFKC: [0x7070], NFKD: [0x7070] }, +{ source: [0x2F836], NFC: [0x53CA], NFD: [0x53CA], NFKC: [0x53CA], NFKD: [0x53CA] }, +{ source: [0x2F837], NFC: [0x53DF], NFD: [0x53DF], NFKC: [0x53DF], NFKD: [0x53DF] }, +{ source: [0x2F838], NFC: [0x20B63], NFD: [0x20B63], NFKC: [0x20B63], NFKD: [0x20B63] }, +{ source: [0x2F839], NFC: [0x53EB], NFD: [0x53EB], NFKC: [0x53EB], NFKD: [0x53EB] }, +{ source: [0x2F83A], NFC: [0x53F1], NFD: [0x53F1], NFKC: [0x53F1], NFKD: [0x53F1] }, +{ source: [0x2F83B], NFC: [0x5406], NFD: [0x5406], NFKC: [0x5406], NFKD: [0x5406] }, +{ source: [0x2F83C], NFC: [0x549E], NFD: [0x549E], NFKC: [0x549E], NFKD: [0x549E] }, +{ source: [0x2F83D], NFC: [0x5438], NFD: [0x5438], NFKC: [0x5438], NFKD: [0x5438] }, +{ source: [0x2F83E], NFC: [0x5448], NFD: [0x5448], NFKC: [0x5448], NFKD: [0x5448] }, +{ source: [0x2F83F], NFC: [0x5468], NFD: [0x5468], NFKC: [0x5468], NFKD: [0x5468] }, +{ source: [0x2F840], NFC: [0x54A2], NFD: [0x54A2], NFKC: [0x54A2], NFKD: [0x54A2] }, +{ source: [0x2F841], NFC: [0x54F6], NFD: [0x54F6], NFKC: [0x54F6], NFKD: [0x54F6] }, +{ source: [0x2F842], NFC: [0x5510], NFD: [0x5510], NFKC: [0x5510], NFKD: [0x5510] }, +{ source: [0x2F843], NFC: [0x5553], NFD: [0x5553], NFKC: [0x5553], NFKD: [0x5553] }, +{ source: [0x2F844], NFC: [0x5563], NFD: [0x5563], NFKC: [0x5563], NFKD: [0x5563] }, +{ source: [0x2F845], NFC: [0x5584], NFD: [0x5584], NFKC: [0x5584], NFKD: [0x5584] }, +{ source: [0x2F846], NFC: [0x5584], NFD: [0x5584], NFKC: [0x5584], NFKD: [0x5584] }, +{ source: [0x2F847], NFC: [0x5599], NFD: [0x5599], NFKC: [0x5599], NFKD: [0x5599] }, +{ source: [0x2F848], NFC: [0x55AB], NFD: [0x55AB], NFKC: [0x55AB], NFKD: [0x55AB] }, +{ source: [0x2F849], NFC: [0x55B3], NFD: [0x55B3], NFKC: [0x55B3], NFKD: [0x55B3] }, +{ source: [0x2F84A], NFC: [0x55C2], NFD: [0x55C2], NFKC: [0x55C2], NFKD: [0x55C2] }, +{ source: [0x2F84B], NFC: [0x5716], NFD: [0x5716], NFKC: [0x5716], NFKD: [0x5716] }, +{ source: [0x2F84C], NFC: [0x5606], NFD: [0x5606], NFKC: [0x5606], NFKD: [0x5606] }, +{ source: [0x2F84D], NFC: [0x5717], NFD: [0x5717], NFKC: [0x5717], NFKD: [0x5717] }, +{ source: [0x2F84E], NFC: [0x5651], NFD: [0x5651], NFKC: [0x5651], NFKD: [0x5651] }, +{ source: [0x2F84F], NFC: [0x5674], NFD: [0x5674], NFKC: [0x5674], NFKD: [0x5674] }, +{ source: [0x2F850], NFC: [0x5207], NFD: [0x5207], NFKC: [0x5207], NFKD: [0x5207] }, +{ source: [0x2F851], NFC: [0x58EE], NFD: [0x58EE], NFKC: [0x58EE], NFKD: [0x58EE] }, +{ source: [0x2F852], NFC: [0x57CE], NFD: [0x57CE], NFKC: [0x57CE], NFKD: [0x57CE] }, +{ source: [0x2F853], NFC: [0x57F4], NFD: [0x57F4], NFKC: [0x57F4], NFKD: [0x57F4] }, +{ source: [0x2F854], NFC: [0x580D], NFD: [0x580D], NFKC: [0x580D], NFKD: [0x580D] }, +{ source: [0x2F855], NFC: [0x578B], NFD: [0x578B], NFKC: [0x578B], NFKD: [0x578B] }, +{ source: [0x2F856], NFC: [0x5832], NFD: [0x5832], NFKC: [0x5832], NFKD: [0x5832] }, +{ source: [0x2F857], NFC: [0x5831], NFD: [0x5831], NFKC: [0x5831], NFKD: [0x5831] }, +{ source: [0x2F858], NFC: [0x58AC], NFD: [0x58AC], NFKC: [0x58AC], NFKD: [0x58AC] }, +{ source: [0x2F859], NFC: [0x214E4], NFD: [0x214E4], NFKC: [0x214E4], NFKD: [0x214E4] }, +{ source: [0x2F85A], NFC: [0x58F2], NFD: [0x58F2], NFKC: [0x58F2], NFKD: [0x58F2] }, +{ source: [0x2F85B], NFC: [0x58F7], NFD: [0x58F7], NFKC: [0x58F7], NFKD: [0x58F7] }, +{ source: [0x2F85C], NFC: [0x5906], NFD: [0x5906], NFKC: [0x5906], NFKD: [0x5906] }, +{ source: [0x2F85D], NFC: [0x591A], NFD: [0x591A], NFKC: [0x591A], NFKD: [0x591A] }, +{ source: [0x2F85E], NFC: [0x5922], NFD: [0x5922], NFKC: [0x5922], NFKD: [0x5922] }, +{ source: [0x2F85F], NFC: [0x5962], NFD: [0x5962], NFKC: [0x5962], NFKD: [0x5962] }, +{ source: [0x2F860], NFC: [0x216A8], NFD: [0x216A8], NFKC: [0x216A8], NFKD: [0x216A8] }, +{ source: [0x2F861], NFC: [0x216EA], NFD: [0x216EA], NFKC: [0x216EA], NFKD: [0x216EA] }, +{ source: [0x2F862], NFC: [0x59EC], NFD: [0x59EC], NFKC: [0x59EC], NFKD: [0x59EC] }, +{ source: [0x2F863], NFC: [0x5A1B], NFD: [0x5A1B], NFKC: [0x5A1B], NFKD: [0x5A1B] }, +{ source: [0x2F864], NFC: [0x5A27], NFD: [0x5A27], NFKC: [0x5A27], NFKD: [0x5A27] }, +{ source: [0x2F865], NFC: [0x59D8], NFD: [0x59D8], NFKC: [0x59D8], NFKD: [0x59D8] }, +{ source: [0x2F866], NFC: [0x5A66], NFD: [0x5A66], NFKC: [0x5A66], NFKD: [0x5A66] }, +{ source: [0x2F867], NFC: [0x36EE], NFD: [0x36EE], NFKC: [0x36EE], NFKD: [0x36EE] }, +{ source: [0x2F868], NFC: [0x36FC], NFD: [0x36FC], NFKC: [0x36FC], NFKD: [0x36FC] }, +{ source: [0x2F869], NFC: [0x5B08], NFD: [0x5B08], NFKC: [0x5B08], NFKD: [0x5B08] }, +{ source: [0x2F86A], NFC: [0x5B3E], NFD: [0x5B3E], NFKC: [0x5B3E], NFKD: [0x5B3E] }, +{ source: [0x2F86B], NFC: [0x5B3E], NFD: [0x5B3E], NFKC: [0x5B3E], NFKD: [0x5B3E] }, +{ source: [0x2F86C], NFC: [0x219C8], NFD: [0x219C8], NFKC: [0x219C8], NFKD: [0x219C8] }, +{ source: [0x2F86D], NFC: [0x5BC3], NFD: [0x5BC3], NFKC: [0x5BC3], NFKD: [0x5BC3] }, +{ source: [0x2F86E], NFC: [0x5BD8], NFD: [0x5BD8], NFKC: [0x5BD8], NFKD: [0x5BD8] }, +{ source: [0x2F86F], NFC: [0x5BE7], NFD: [0x5BE7], NFKC: [0x5BE7], NFKD: [0x5BE7] }, +{ source: [0x2F870], NFC: [0x5BF3], NFD: [0x5BF3], NFKC: [0x5BF3], NFKD: [0x5BF3] }, +{ source: [0x2F871], NFC: [0x21B18], NFD: [0x21B18], NFKC: [0x21B18], NFKD: [0x21B18] }, +{ source: [0x2F872], NFC: [0x5BFF], NFD: [0x5BFF], NFKC: [0x5BFF], NFKD: [0x5BFF] }, +{ source: [0x2F873], NFC: [0x5C06], NFD: [0x5C06], NFKC: [0x5C06], NFKD: [0x5C06] }, +{ source: [0x2F874], NFC: [0x5F53], NFD: [0x5F53], NFKC: [0x5F53], NFKD: [0x5F53] }, +{ source: [0x2F875], NFC: [0x5C22], NFD: [0x5C22], NFKC: [0x5C22], NFKD: [0x5C22] }, +{ source: [0x2F876], NFC: [0x3781], NFD: [0x3781], NFKC: [0x3781], NFKD: [0x3781] }, +{ source: [0x2F877], NFC: [0x5C60], NFD: [0x5C60], NFKC: [0x5C60], NFKD: [0x5C60] }, +{ source: [0x2F878], NFC: [0x5C6E], NFD: [0x5C6E], NFKC: [0x5C6E], NFKD: [0x5C6E] }, +{ source: [0x2F879], NFC: [0x5CC0], NFD: [0x5CC0], NFKC: [0x5CC0], NFKD: [0x5CC0] }, +{ source: [0x2F87A], NFC: [0x5C8D], NFD: [0x5C8D], NFKC: [0x5C8D], NFKD: [0x5C8D] }, +{ source: [0x2F87B], NFC: [0x21DE4], NFD: [0x21DE4], NFKC: [0x21DE4], NFKD: [0x21DE4] }, +{ source: [0x2F87C], NFC: [0x5D43], NFD: [0x5D43], NFKC: [0x5D43], NFKD: [0x5D43] }, +{ source: [0x2F87D], NFC: [0x21DE6], NFD: [0x21DE6], NFKC: [0x21DE6], NFKD: [0x21DE6] }, +{ source: [0x2F87E], NFC: [0x5D6E], NFD: [0x5D6E], NFKC: [0x5D6E], NFKD: [0x5D6E] }, +{ source: [0x2F87F], NFC: [0x5D6B], NFD: [0x5D6B], NFKC: [0x5D6B], NFKD: [0x5D6B] }, +{ source: [0x2F880], NFC: [0x5D7C], NFD: [0x5D7C], NFKC: [0x5D7C], NFKD: [0x5D7C] }, +{ source: [0x2F881], NFC: [0x5DE1], NFD: [0x5DE1], NFKC: [0x5DE1], NFKD: [0x5DE1] }, +{ source: [0x2F882], NFC: [0x5DE2], NFD: [0x5DE2], NFKC: [0x5DE2], NFKD: [0x5DE2] }, +{ source: [0x2F883], NFC: [0x382F], NFD: [0x382F], NFKC: [0x382F], NFKD: [0x382F] }, +{ source: [0x2F884], NFC: [0x5DFD], NFD: [0x5DFD], NFKC: [0x5DFD], NFKD: [0x5DFD] }, +{ source: [0x2F885], NFC: [0x5E28], NFD: [0x5E28], NFKC: [0x5E28], NFKD: [0x5E28] }, +{ source: [0x2F886], NFC: [0x5E3D], NFD: [0x5E3D], NFKC: [0x5E3D], NFKD: [0x5E3D] }, +{ source: [0x2F887], NFC: [0x5E69], NFD: [0x5E69], NFKC: [0x5E69], NFKD: [0x5E69] }, +{ source: [0x2F888], NFC: [0x3862], NFD: [0x3862], NFKC: [0x3862], NFKD: [0x3862] }, +{ source: [0x2F889], NFC: [0x22183], NFD: [0x22183], NFKC: [0x22183], NFKD: [0x22183] }, +{ source: [0x2F88A], NFC: [0x387C], NFD: [0x387C], NFKC: [0x387C], NFKD: [0x387C] }, +{ source: [0x2F88B], NFC: [0x5EB0], NFD: [0x5EB0], NFKC: [0x5EB0], NFKD: [0x5EB0] }, +{ source: [0x2F88C], NFC: [0x5EB3], NFD: [0x5EB3], NFKC: [0x5EB3], NFKD: [0x5EB3] }, +{ source: [0x2F88D], NFC: [0x5EB6], NFD: [0x5EB6], NFKC: [0x5EB6], NFKD: [0x5EB6] }, +{ source: [0x2F88E], NFC: [0x5ECA], NFD: [0x5ECA], NFKC: [0x5ECA], NFKD: [0x5ECA] }, +{ source: [0x2F88F], NFC: [0x2A392], NFD: [0x2A392], NFKC: [0x2A392], NFKD: [0x2A392] }, +{ source: [0x2F890], NFC: [0x5EFE], NFD: [0x5EFE], NFKC: [0x5EFE], NFKD: [0x5EFE] }, +{ source: [0x2F891], NFC: [0x22331], NFD: [0x22331], NFKC: [0x22331], NFKD: [0x22331] }, +{ source: [0x2F892], NFC: [0x22331], NFD: [0x22331], NFKC: [0x22331], NFKD: [0x22331] }, +{ source: [0x2F893], NFC: [0x8201], NFD: [0x8201], NFKC: [0x8201], NFKD: [0x8201] }, +{ source: [0x2F894], NFC: [0x5F22], NFD: [0x5F22], NFKC: [0x5F22], NFKD: [0x5F22] }, +{ source: [0x2F895], NFC: [0x5F22], NFD: [0x5F22], NFKC: [0x5F22], NFKD: [0x5F22] }, +{ source: [0x2F896], NFC: [0x38C7], NFD: [0x38C7], NFKC: [0x38C7], NFKD: [0x38C7] }, +{ source: [0x2F897], NFC: [0x232B8], NFD: [0x232B8], NFKC: [0x232B8], NFKD: [0x232B8] }, +{ source: [0x2F898], NFC: [0x261DA], NFD: [0x261DA], NFKC: [0x261DA], NFKD: [0x261DA] }, +{ source: [0x2F899], NFC: [0x5F62], NFD: [0x5F62], NFKC: [0x5F62], NFKD: [0x5F62] }, +{ source: [0x2F89A], NFC: [0x5F6B], NFD: [0x5F6B], NFKC: [0x5F6B], NFKD: [0x5F6B] }, +{ source: [0x2F89B], NFC: [0x38E3], NFD: [0x38E3], NFKC: [0x38E3], NFKD: [0x38E3] }, +{ source: [0x2F89C], NFC: [0x5F9A], NFD: [0x5F9A], NFKC: [0x5F9A], NFKD: [0x5F9A] }, +{ source: [0x2F89D], NFC: [0x5FCD], NFD: [0x5FCD], NFKC: [0x5FCD], NFKD: [0x5FCD] }, +{ source: [0x2F89E], NFC: [0x5FD7], NFD: [0x5FD7], NFKC: [0x5FD7], NFKD: [0x5FD7] }, +{ source: [0x2F89F], NFC: [0x5FF9], NFD: [0x5FF9], NFKC: [0x5FF9], NFKD: [0x5FF9] }, +{ source: [0x2F8A0], NFC: [0x6081], NFD: [0x6081], NFKC: [0x6081], NFKD: [0x6081] }, +{ source: [0x2F8A1], NFC: [0x393A], NFD: [0x393A], NFKC: [0x393A], NFKD: [0x393A] }, +{ source: [0x2F8A2], NFC: [0x391C], NFD: [0x391C], NFKC: [0x391C], NFKD: [0x391C] }, +{ source: [0x2F8A3], NFC: [0x6094], NFD: [0x6094], NFKC: [0x6094], NFKD: [0x6094] }, +{ source: [0x2F8A4], NFC: [0x226D4], NFD: [0x226D4], NFKC: [0x226D4], NFKD: [0x226D4] }, +{ source: [0x2F8A5], NFC: [0x60C7], NFD: [0x60C7], NFKC: [0x60C7], NFKD: [0x60C7] }, +{ source: [0x2F8A6], NFC: [0x6148], NFD: [0x6148], NFKC: [0x6148], NFKD: [0x6148] }, +{ source: [0x2F8A7], NFC: [0x614C], NFD: [0x614C], NFKC: [0x614C], NFKD: [0x614C] }, +{ source: [0x2F8A8], NFC: [0x614E], NFD: [0x614E], NFKC: [0x614E], NFKD: [0x614E] }, +{ source: [0x2F8A9], NFC: [0x614C], NFD: [0x614C], NFKC: [0x614C], NFKD: [0x614C] }, +{ source: [0x2F8AA], NFC: [0x617A], NFD: [0x617A], NFKC: [0x617A], NFKD: [0x617A] }, +{ source: [0x2F8AB], NFC: [0x618E], NFD: [0x618E], NFKC: [0x618E], NFKD: [0x618E] }, +{ source: [0x2F8AC], NFC: [0x61B2], NFD: [0x61B2], NFKC: [0x61B2], NFKD: [0x61B2] }, +{ source: [0x2F8AD], NFC: [0x61A4], NFD: [0x61A4], NFKC: [0x61A4], NFKD: [0x61A4] }, +{ source: [0x2F8AE], NFC: [0x61AF], NFD: [0x61AF], NFKC: [0x61AF], NFKD: [0x61AF] }, +{ source: [0x2F8AF], NFC: [0x61DE], NFD: [0x61DE], NFKC: [0x61DE], NFKD: [0x61DE] }, +{ source: [0x2F8B0], NFC: [0x61F2], NFD: [0x61F2], NFKC: [0x61F2], NFKD: [0x61F2] }, +{ source: [0x2F8B1], NFC: [0x61F6], NFD: [0x61F6], NFKC: [0x61F6], NFKD: [0x61F6] }, +{ source: [0x2F8B2], NFC: [0x6210], NFD: [0x6210], NFKC: [0x6210], NFKD: [0x6210] }, +{ source: [0x2F8B3], NFC: [0x621B], NFD: [0x621B], NFKC: [0x621B], NFKD: [0x621B] }, +{ source: [0x2F8B4], NFC: [0x625D], NFD: [0x625D], NFKC: [0x625D], NFKD: [0x625D] }, +{ source: [0x2F8B5], NFC: [0x62B1], NFD: [0x62B1], NFKC: [0x62B1], NFKD: [0x62B1] }, +{ source: [0x2F8B6], NFC: [0x62D4], NFD: [0x62D4], NFKC: [0x62D4], NFKD: [0x62D4] }, +{ source: [0x2F8B7], NFC: [0x6350], NFD: [0x6350], NFKC: [0x6350], NFKD: [0x6350] }, +{ source: [0x2F8B8], NFC: [0x22B0C], NFD: [0x22B0C], NFKC: [0x22B0C], NFKD: [0x22B0C] }, +{ source: [0x2F8B9], NFC: [0x633D], NFD: [0x633D], NFKC: [0x633D], NFKD: [0x633D] }, +{ source: [0x2F8BA], NFC: [0x62FC], NFD: [0x62FC], NFKC: [0x62FC], NFKD: [0x62FC] }, +{ source: [0x2F8BB], NFC: [0x6368], NFD: [0x6368], NFKC: [0x6368], NFKD: [0x6368] }, +{ source: [0x2F8BC], NFC: [0x6383], NFD: [0x6383], NFKC: [0x6383], NFKD: [0x6383] }, +{ source: [0x2F8BD], NFC: [0x63E4], NFD: [0x63E4], NFKC: [0x63E4], NFKD: [0x63E4] }, +{ source: [0x2F8BE], NFC: [0x22BF1], NFD: [0x22BF1], NFKC: [0x22BF1], NFKD: [0x22BF1] }, +{ source: [0x2F8BF], NFC: [0x6422], NFD: [0x6422], NFKC: [0x6422], NFKD: [0x6422] }, +{ source: [0x2F8C0], NFC: [0x63C5], NFD: [0x63C5], NFKC: [0x63C5], NFKD: [0x63C5] }, +{ source: [0x2F8C1], NFC: [0x63A9], NFD: [0x63A9], NFKC: [0x63A9], NFKD: [0x63A9] }, +{ source: [0x2F8C2], NFC: [0x3A2E], NFD: [0x3A2E], NFKC: [0x3A2E], NFKD: [0x3A2E] }, +{ source: [0x2F8C3], NFC: [0x6469], NFD: [0x6469], NFKC: [0x6469], NFKD: [0x6469] }, +{ source: [0x2F8C4], NFC: [0x647E], NFD: [0x647E], NFKC: [0x647E], NFKD: [0x647E] }, +{ source: [0x2F8C5], NFC: [0x649D], NFD: [0x649D], NFKC: [0x649D], NFKD: [0x649D] }, +{ source: [0x2F8C6], NFC: [0x6477], NFD: [0x6477], NFKC: [0x6477], NFKD: [0x6477] }, +{ source: [0x2F8C7], NFC: [0x3A6C], NFD: [0x3A6C], NFKC: [0x3A6C], NFKD: [0x3A6C] }, +{ source: [0x2F8C8], NFC: [0x654F], NFD: [0x654F], NFKC: [0x654F], NFKD: [0x654F] }, +{ source: [0x2F8C9], NFC: [0x656C], NFD: [0x656C], NFKC: [0x656C], NFKD: [0x656C] }, +{ source: [0x2F8CA], NFC: [0x2300A], NFD: [0x2300A], NFKC: [0x2300A], NFKD: [0x2300A] }, +{ source: [0x2F8CB], NFC: [0x65E3], NFD: [0x65E3], NFKC: [0x65E3], NFKD: [0x65E3] }, +{ source: [0x2F8CC], NFC: [0x66F8], NFD: [0x66F8], NFKC: [0x66F8], NFKD: [0x66F8] }, +{ source: [0x2F8CD], NFC: [0x6649], NFD: [0x6649], NFKC: [0x6649], NFKD: [0x6649] }, +{ source: [0x2F8CE], NFC: [0x3B19], NFD: [0x3B19], NFKC: [0x3B19], NFKD: [0x3B19] }, +{ source: [0x2F8CF], NFC: [0x6691], NFD: [0x6691], NFKC: [0x6691], NFKD: [0x6691] }, +{ source: [0x2F8D0], NFC: [0x3B08], NFD: [0x3B08], NFKC: [0x3B08], NFKD: [0x3B08] }, +{ source: [0x2F8D1], NFC: [0x3AE4], NFD: [0x3AE4], NFKC: [0x3AE4], NFKD: [0x3AE4] }, +{ source: [0x2F8D2], NFC: [0x5192], NFD: [0x5192], NFKC: [0x5192], NFKD: [0x5192] }, +{ source: [0x2F8D3], NFC: [0x5195], NFD: [0x5195], NFKC: [0x5195], NFKD: [0x5195] }, +{ source: [0x2F8D4], NFC: [0x6700], NFD: [0x6700], NFKC: [0x6700], NFKD: [0x6700] }, +{ source: [0x2F8D5], NFC: [0x669C], NFD: [0x669C], NFKC: [0x669C], NFKD: [0x669C] }, +{ source: [0x2F8D6], NFC: [0x80AD], NFD: [0x80AD], NFKC: [0x80AD], NFKD: [0x80AD] }, +{ source: [0x2F8D7], NFC: [0x43D9], NFD: [0x43D9], NFKC: [0x43D9], NFKD: [0x43D9] }, +{ source: [0x2F8D8], NFC: [0x6717], NFD: [0x6717], NFKC: [0x6717], NFKD: [0x6717] }, +{ source: [0x2F8D9], NFC: [0x671B], NFD: [0x671B], NFKC: [0x671B], NFKD: [0x671B] }, +{ source: [0x2F8DA], NFC: [0x6721], NFD: [0x6721], NFKC: [0x6721], NFKD: [0x6721] }, +{ source: [0x2F8DB], NFC: [0x675E], NFD: [0x675E], NFKC: [0x675E], NFKD: [0x675E] }, +{ source: [0x2F8DC], NFC: [0x6753], NFD: [0x6753], NFKC: [0x6753], NFKD: [0x6753] }, +{ source: [0x2F8DD], NFC: [0x233C3], NFD: [0x233C3], NFKC: [0x233C3], NFKD: [0x233C3] }, +{ source: [0x2F8DE], NFC: [0x3B49], NFD: [0x3B49], NFKC: [0x3B49], NFKD: [0x3B49] }, +{ source: [0x2F8DF], NFC: [0x67FA], NFD: [0x67FA], NFKC: [0x67FA], NFKD: [0x67FA] }, +{ source: [0x2F8E0], NFC: [0x6785], NFD: [0x6785], NFKC: [0x6785], NFKD: [0x6785] }, +{ source: [0x2F8E1], NFC: [0x6852], NFD: [0x6852], NFKC: [0x6852], NFKD: [0x6852] }, +{ source: [0x2F8E2], NFC: [0x6885], NFD: [0x6885], NFKC: [0x6885], NFKD: [0x6885] }, +{ source: [0x2F8E3], NFC: [0x2346D], NFD: [0x2346D], NFKC: [0x2346D], NFKD: [0x2346D] }, +{ source: [0x2F8E4], NFC: [0x688E], NFD: [0x688E], NFKC: [0x688E], NFKD: [0x688E] }, +{ source: [0x2F8E5], NFC: [0x681F], NFD: [0x681F], NFKC: [0x681F], NFKD: [0x681F] }, +{ source: [0x2F8E6], NFC: [0x6914], NFD: [0x6914], NFKC: [0x6914], NFKD: [0x6914] }, +{ source: [0x2F8E7], NFC: [0x3B9D], NFD: [0x3B9D], NFKC: [0x3B9D], NFKD: [0x3B9D] }, +{ source: [0x2F8E8], NFC: [0x6942], NFD: [0x6942], NFKC: [0x6942], NFKD: [0x6942] }, +{ source: [0x2F8E9], NFC: [0x69A3], NFD: [0x69A3], NFKC: [0x69A3], NFKD: [0x69A3] }, +{ source: [0x2F8EA], NFC: [0x69EA], NFD: [0x69EA], NFKC: [0x69EA], NFKD: [0x69EA] }, +{ source: [0x2F8EB], NFC: [0x6AA8], NFD: [0x6AA8], NFKC: [0x6AA8], NFKD: [0x6AA8] }, +{ source: [0x2F8EC], NFC: [0x236A3], NFD: [0x236A3], NFKC: [0x236A3], NFKD: [0x236A3] }, +{ source: [0x2F8ED], NFC: [0x6ADB], NFD: [0x6ADB], NFKC: [0x6ADB], NFKD: [0x6ADB] }, +{ source: [0x2F8EE], NFC: [0x3C18], NFD: [0x3C18], NFKC: [0x3C18], NFKD: [0x3C18] }, +{ source: [0x2F8EF], NFC: [0x6B21], NFD: [0x6B21], NFKC: [0x6B21], NFKD: [0x6B21] }, +{ source: [0x2F8F0], NFC: [0x238A7], NFD: [0x238A7], NFKC: [0x238A7], NFKD: [0x238A7] }, +{ source: [0x2F8F1], NFC: [0x6B54], NFD: [0x6B54], NFKC: [0x6B54], NFKD: [0x6B54] }, +{ source: [0x2F8F2], NFC: [0x3C4E], NFD: [0x3C4E], NFKC: [0x3C4E], NFKD: [0x3C4E] }, +{ source: [0x2F8F3], NFC: [0x6B72], NFD: [0x6B72], NFKC: [0x6B72], NFKD: [0x6B72] }, +{ source: [0x2F8F4], NFC: [0x6B9F], NFD: [0x6B9F], NFKC: [0x6B9F], NFKD: [0x6B9F] }, +{ source: [0x2F8F5], NFC: [0x6BBA], NFD: [0x6BBA], NFKC: [0x6BBA], NFKD: [0x6BBA] }, +{ source: [0x2F8F6], NFC: [0x6BBB], NFD: [0x6BBB], NFKC: [0x6BBB], NFKD: [0x6BBB] }, +{ source: [0x2F8F7], NFC: [0x23A8D], NFD: [0x23A8D], NFKC: [0x23A8D], NFKD: [0x23A8D] }, +{ source: [0x2F8F8], NFC: [0x21D0B], NFD: [0x21D0B], NFKC: [0x21D0B], NFKD: [0x21D0B] }, +{ source: [0x2F8F9], NFC: [0x23AFA], NFD: [0x23AFA], NFKC: [0x23AFA], NFKD: [0x23AFA] }, +{ source: [0x2F8FA], NFC: [0x6C4E], NFD: [0x6C4E], NFKC: [0x6C4E], NFKD: [0x6C4E] }, +{ source: [0x2F8FB], NFC: [0x23CBC], NFD: [0x23CBC], NFKC: [0x23CBC], NFKD: [0x23CBC] }, +{ source: [0x2F8FC], NFC: [0x6CBF], NFD: [0x6CBF], NFKC: [0x6CBF], NFKD: [0x6CBF] }, +{ source: [0x2F8FD], NFC: [0x6CCD], NFD: [0x6CCD], NFKC: [0x6CCD], NFKD: [0x6CCD] }, +{ source: [0x2F8FE], NFC: [0x6C67], NFD: [0x6C67], NFKC: [0x6C67], NFKD: [0x6C67] }, +{ source: [0x2F8FF], NFC: [0x6D16], NFD: [0x6D16], NFKC: [0x6D16], NFKD: [0x6D16] }, +{ source: [0x2F900], NFC: [0x6D3E], NFD: [0x6D3E], NFKC: [0x6D3E], NFKD: [0x6D3E] }, +{ source: [0x2F901], NFC: [0x6D77], NFD: [0x6D77], NFKC: [0x6D77], NFKD: [0x6D77] }, +{ source: [0x2F902], NFC: [0x6D41], NFD: [0x6D41], NFKC: [0x6D41], NFKD: [0x6D41] }, +{ source: [0x2F903], NFC: [0x6D69], NFD: [0x6D69], NFKC: [0x6D69], NFKD: [0x6D69] }, +{ source: [0x2F904], NFC: [0x6D78], NFD: [0x6D78], NFKC: [0x6D78], NFKD: [0x6D78] }, +{ source: [0x2F905], NFC: [0x6D85], NFD: [0x6D85], NFKC: [0x6D85], NFKD: [0x6D85] }, +{ source: [0x2F906], NFC: [0x23D1E], NFD: [0x23D1E], NFKC: [0x23D1E], NFKD: [0x23D1E] }, +{ source: [0x2F907], NFC: [0x6D34], NFD: [0x6D34], NFKC: [0x6D34], NFKD: [0x6D34] }, +{ source: [0x2F908], NFC: [0x6E2F], NFD: [0x6E2F], NFKC: [0x6E2F], NFKD: [0x6E2F] }, +{ source: [0x2F909], NFC: [0x6E6E], NFD: [0x6E6E], NFKC: [0x6E6E], NFKD: [0x6E6E] }, +{ source: [0x2F90A], NFC: [0x3D33], NFD: [0x3D33], NFKC: [0x3D33], NFKD: [0x3D33] }, +{ source: [0x2F90B], NFC: [0x6ECB], NFD: [0x6ECB], NFKC: [0x6ECB], NFKD: [0x6ECB] }, +{ source: [0x2F90C], NFC: [0x6EC7], NFD: [0x6EC7], NFKC: [0x6EC7], NFKD: [0x6EC7] }, +{ source: [0x2F90D], NFC: [0x23ED1], NFD: [0x23ED1], NFKC: [0x23ED1], NFKD: [0x23ED1] }, +{ source: [0x2F90E], NFC: [0x6DF9], NFD: [0x6DF9], NFKC: [0x6DF9], NFKD: [0x6DF9] }, +{ source: [0x2F90F], NFC: [0x6F6E], NFD: [0x6F6E], NFKC: [0x6F6E], NFKD: [0x6F6E] }, +{ source: [0x2F910], NFC: [0x23F5E], NFD: [0x23F5E], NFKC: [0x23F5E], NFKD: [0x23F5E] }, +{ source: [0x2F911], NFC: [0x23F8E], NFD: [0x23F8E], NFKC: [0x23F8E], NFKD: [0x23F8E] }, +{ source: [0x2F912], NFC: [0x6FC6], NFD: [0x6FC6], NFKC: [0x6FC6], NFKD: [0x6FC6] }, +{ source: [0x2F913], NFC: [0x7039], NFD: [0x7039], NFKC: [0x7039], NFKD: [0x7039] }, +{ source: [0x2F914], NFC: [0x701E], NFD: [0x701E], NFKC: [0x701E], NFKD: [0x701E] }, +{ source: [0x2F915], NFC: [0x701B], NFD: [0x701B], NFKC: [0x701B], NFKD: [0x701B] }, +{ source: [0x2F916], NFC: [0x3D96], NFD: [0x3D96], NFKC: [0x3D96], NFKD: [0x3D96] }, +{ source: [0x2F917], NFC: [0x704A], NFD: [0x704A], NFKC: [0x704A], NFKD: [0x704A] }, +{ source: [0x2F918], NFC: [0x707D], NFD: [0x707D], NFKC: [0x707D], NFKD: [0x707D] }, +{ source: [0x2F919], NFC: [0x7077], NFD: [0x7077], NFKC: [0x7077], NFKD: [0x7077] }, +{ source: [0x2F91A], NFC: [0x70AD], NFD: [0x70AD], NFKC: [0x70AD], NFKD: [0x70AD] }, +{ source: [0x2F91B], NFC: [0x20525], NFD: [0x20525], NFKC: [0x20525], NFKD: [0x20525] }, +{ source: [0x2F91C], NFC: [0x7145], NFD: [0x7145], NFKC: [0x7145], NFKD: [0x7145] }, +{ source: [0x2F91D], NFC: [0x24263], NFD: [0x24263], NFKC: [0x24263], NFKD: [0x24263] }, +{ source: [0x2F91E], NFC: [0x719C], NFD: [0x719C], NFKC: [0x719C], NFKD: [0x719C] }, +{ source: [0x2F91F], NFC: [0x243AB], NFD: [0x243AB], NFKC: [0x243AB], NFKD: [0x243AB] }, +{ source: [0x2F920], NFC: [0x7228], NFD: [0x7228], NFKC: [0x7228], NFKD: [0x7228] }, +{ source: [0x2F921], NFC: [0x7235], NFD: [0x7235], NFKC: [0x7235], NFKD: [0x7235] }, +{ source: [0x2F922], NFC: [0x7250], NFD: [0x7250], NFKC: [0x7250], NFKD: [0x7250] }, +{ source: [0x2F923], NFC: [0x24608], NFD: [0x24608], NFKC: [0x24608], NFKD: [0x24608] }, +{ source: [0x2F924], NFC: [0x7280], NFD: [0x7280], NFKC: [0x7280], NFKD: [0x7280] }, +{ source: [0x2F925], NFC: [0x7295], NFD: [0x7295], NFKC: [0x7295], NFKD: [0x7295] }, +{ source: [0x2F926], NFC: [0x24735], NFD: [0x24735], NFKC: [0x24735], NFKD: [0x24735] }, +{ source: [0x2F927], NFC: [0x24814], NFD: [0x24814], NFKC: [0x24814], NFKD: [0x24814] }, +{ source: [0x2F928], NFC: [0x737A], NFD: [0x737A], NFKC: [0x737A], NFKD: [0x737A] }, +{ source: [0x2F929], NFC: [0x738B], NFD: [0x738B], NFKC: [0x738B], NFKD: [0x738B] }, +{ source: [0x2F92A], NFC: [0x3EAC], NFD: [0x3EAC], NFKC: [0x3EAC], NFKD: [0x3EAC] }, +{ source: [0x2F92B], NFC: [0x73A5], NFD: [0x73A5], NFKC: [0x73A5], NFKD: [0x73A5] }, +{ source: [0x2F92C], NFC: [0x3EB8], NFD: [0x3EB8], NFKC: [0x3EB8], NFKD: [0x3EB8] }, +{ source: [0x2F92D], NFC: [0x3EB8], NFD: [0x3EB8], NFKC: [0x3EB8], NFKD: [0x3EB8] }, +{ source: [0x2F92E], NFC: [0x7447], NFD: [0x7447], NFKC: [0x7447], NFKD: [0x7447] }, +{ source: [0x2F92F], NFC: [0x745C], NFD: [0x745C], NFKC: [0x745C], NFKD: [0x745C] }, +{ source: [0x2F930], NFC: [0x7471], NFD: [0x7471], NFKC: [0x7471], NFKD: [0x7471] }, +{ source: [0x2F931], NFC: [0x7485], NFD: [0x7485], NFKC: [0x7485], NFKD: [0x7485] }, +{ source: [0x2F932], NFC: [0x74CA], NFD: [0x74CA], NFKC: [0x74CA], NFKD: [0x74CA] }, +{ source: [0x2F933], NFC: [0x3F1B], NFD: [0x3F1B], NFKC: [0x3F1B], NFKD: [0x3F1B] }, +{ source: [0x2F934], NFC: [0x7524], NFD: [0x7524], NFKC: [0x7524], NFKD: [0x7524] }, +{ source: [0x2F935], NFC: [0x24C36], NFD: [0x24C36], NFKC: [0x24C36], NFKD: [0x24C36] }, +{ source: [0x2F936], NFC: [0x753E], NFD: [0x753E], NFKC: [0x753E], NFKD: [0x753E] }, +{ source: [0x2F937], NFC: [0x24C92], NFD: [0x24C92], NFKC: [0x24C92], NFKD: [0x24C92] }, +{ source: [0x2F938], NFC: [0x7570], NFD: [0x7570], NFKC: [0x7570], NFKD: [0x7570] }, +{ source: [0x2F939], NFC: [0x2219F], NFD: [0x2219F], NFKC: [0x2219F], NFKD: [0x2219F] }, +{ source: [0x2F93A], NFC: [0x7610], NFD: [0x7610], NFKC: [0x7610], NFKD: [0x7610] }, +{ source: [0x2F93B], NFC: [0x24FA1], NFD: [0x24FA1], NFKC: [0x24FA1], NFKD: [0x24FA1] }, +{ source: [0x2F93C], NFC: [0x24FB8], NFD: [0x24FB8], NFKC: [0x24FB8], NFKD: [0x24FB8] }, +{ source: [0x2F93D], NFC: [0x25044], NFD: [0x25044], NFKC: [0x25044], NFKD: [0x25044] }, +{ source: [0x2F93E], NFC: [0x3FFC], NFD: [0x3FFC], NFKC: [0x3FFC], NFKD: [0x3FFC] }, +{ source: [0x2F93F], NFC: [0x4008], NFD: [0x4008], NFKC: [0x4008], NFKD: [0x4008] }, +{ source: [0x2F940], NFC: [0x76F4], NFD: [0x76F4], NFKC: [0x76F4], NFKD: [0x76F4] }, +{ source: [0x2F941], NFC: [0x250F3], NFD: [0x250F3], NFKC: [0x250F3], NFKD: [0x250F3] }, +{ source: [0x2F942], NFC: [0x250F2], NFD: [0x250F2], NFKC: [0x250F2], NFKD: [0x250F2] }, +{ source: [0x2F943], NFC: [0x25119], NFD: [0x25119], NFKC: [0x25119], NFKD: [0x25119] }, +{ source: [0x2F944], NFC: [0x25133], NFD: [0x25133], NFKC: [0x25133], NFKD: [0x25133] }, +{ source: [0x2F945], NFC: [0x771E], NFD: [0x771E], NFKC: [0x771E], NFKD: [0x771E] }, +{ source: [0x2F946], NFC: [0x771F], NFD: [0x771F], NFKC: [0x771F], NFKD: [0x771F] }, +{ source: [0x2F947], NFC: [0x771F], NFD: [0x771F], NFKC: [0x771F], NFKD: [0x771F] }, +{ source: [0x2F948], NFC: [0x774A], NFD: [0x774A], NFKC: [0x774A], NFKD: [0x774A] }, +{ source: [0x2F949], NFC: [0x4039], NFD: [0x4039], NFKC: [0x4039], NFKD: [0x4039] }, +{ source: [0x2F94A], NFC: [0x778B], NFD: [0x778B], NFKC: [0x778B], NFKD: [0x778B] }, +{ source: [0x2F94B], NFC: [0x4046], NFD: [0x4046], NFKC: [0x4046], NFKD: [0x4046] }, +{ source: [0x2F94C], NFC: [0x4096], NFD: [0x4096], NFKC: [0x4096], NFKD: [0x4096] }, +{ source: [0x2F94D], NFC: [0x2541D], NFD: [0x2541D], NFKC: [0x2541D], NFKD: [0x2541D] }, +{ source: [0x2F94E], NFC: [0x784E], NFD: [0x784E], NFKC: [0x784E], NFKD: [0x784E] }, +{ source: [0x2F94F], NFC: [0x788C], NFD: [0x788C], NFKC: [0x788C], NFKD: [0x788C] }, +{ source: [0x2F950], NFC: [0x78CC], NFD: [0x78CC], NFKC: [0x78CC], NFKD: [0x78CC] }, +{ source: [0x2F951], NFC: [0x40E3], NFD: [0x40E3], NFKC: [0x40E3], NFKD: [0x40E3] }, +{ source: [0x2F952], NFC: [0x25626], NFD: [0x25626], NFKC: [0x25626], NFKD: [0x25626] }, +{ source: [0x2F953], NFC: [0x7956], NFD: [0x7956], NFKC: [0x7956], NFKD: [0x7956] }, +{ source: [0x2F954], NFC: [0x2569A], NFD: [0x2569A], NFKC: [0x2569A], NFKD: [0x2569A] }, +{ source: [0x2F955], NFC: [0x256C5], NFD: [0x256C5], NFKC: [0x256C5], NFKD: [0x256C5] }, +{ source: [0x2F956], NFC: [0x798F], NFD: [0x798F], NFKC: [0x798F], NFKD: [0x798F] }, +{ source: [0x2F957], NFC: [0x79EB], NFD: [0x79EB], NFKC: [0x79EB], NFKD: [0x79EB] }, +{ source: [0x2F958], NFC: [0x412F], NFD: [0x412F], NFKC: [0x412F], NFKD: [0x412F] }, +{ source: [0x2F959], NFC: [0x7A40], NFD: [0x7A40], NFKC: [0x7A40], NFKD: [0x7A40] }, +{ source: [0x2F95A], NFC: [0x7A4A], NFD: [0x7A4A], NFKC: [0x7A4A], NFKD: [0x7A4A] }, +{ source: [0x2F95B], NFC: [0x7A4F], NFD: [0x7A4F], NFKC: [0x7A4F], NFKD: [0x7A4F] }, +{ source: [0x2F95C], NFC: [0x2597C], NFD: [0x2597C], NFKC: [0x2597C], NFKD: [0x2597C] }, +{ source: [0x2F95D], NFC: [0x25AA7], NFD: [0x25AA7], NFKC: [0x25AA7], NFKD: [0x25AA7] }, +{ source: [0x2F95E], NFC: [0x25AA7], NFD: [0x25AA7], NFKC: [0x25AA7], NFKD: [0x25AA7] }, +{ source: [0x2F95F], NFC: [0x7AEE], NFD: [0x7AEE], NFKC: [0x7AEE], NFKD: [0x7AEE] }, +{ source: [0x2F960], NFC: [0x4202], NFD: [0x4202], NFKC: [0x4202], NFKD: [0x4202] }, +{ source: [0x2F961], NFC: [0x25BAB], NFD: [0x25BAB], NFKC: [0x25BAB], NFKD: [0x25BAB] }, +{ source: [0x2F962], NFC: [0x7BC6], NFD: [0x7BC6], NFKC: [0x7BC6], NFKD: [0x7BC6] }, +{ source: [0x2F963], NFC: [0x7BC9], NFD: [0x7BC9], NFKC: [0x7BC9], NFKD: [0x7BC9] }, +{ source: [0x2F964], NFC: [0x4227], NFD: [0x4227], NFKC: [0x4227], NFKD: [0x4227] }, +{ source: [0x2F965], NFC: [0x25C80], NFD: [0x25C80], NFKC: [0x25C80], NFKD: [0x25C80] }, +{ source: [0x2F966], NFC: [0x7CD2], NFD: [0x7CD2], NFKC: [0x7CD2], NFKD: [0x7CD2] }, +{ source: [0x2F967], NFC: [0x42A0], NFD: [0x42A0], NFKC: [0x42A0], NFKD: [0x42A0] }, +{ source: [0x2F968], NFC: [0x7CE8], NFD: [0x7CE8], NFKC: [0x7CE8], NFKD: [0x7CE8] }, +{ source: [0x2F969], NFC: [0x7CE3], NFD: [0x7CE3], NFKC: [0x7CE3], NFKD: [0x7CE3] }, +{ source: [0x2F96A], NFC: [0x7D00], NFD: [0x7D00], NFKC: [0x7D00], NFKD: [0x7D00] }, +{ source: [0x2F96B], NFC: [0x25F86], NFD: [0x25F86], NFKC: [0x25F86], NFKD: [0x25F86] }, +{ source: [0x2F96C], NFC: [0x7D63], NFD: [0x7D63], NFKC: [0x7D63], NFKD: [0x7D63] }, +{ source: [0x2F96D], NFC: [0x4301], NFD: [0x4301], NFKC: [0x4301], NFKD: [0x4301] }, +{ source: [0x2F96E], NFC: [0x7DC7], NFD: [0x7DC7], NFKC: [0x7DC7], NFKD: [0x7DC7] }, +{ source: [0x2F96F], NFC: [0x7E02], NFD: [0x7E02], NFKC: [0x7E02], NFKD: [0x7E02] }, +{ source: [0x2F970], NFC: [0x7E45], NFD: [0x7E45], NFKC: [0x7E45], NFKD: [0x7E45] }, +{ source: [0x2F971], NFC: [0x4334], NFD: [0x4334], NFKC: [0x4334], NFKD: [0x4334] }, +{ source: [0x2F972], NFC: [0x26228], NFD: [0x26228], NFKC: [0x26228], NFKD: [0x26228] }, +{ source: [0x2F973], NFC: [0x26247], NFD: [0x26247], NFKC: [0x26247], NFKD: [0x26247] }, +{ source: [0x2F974], NFC: [0x4359], NFD: [0x4359], NFKC: [0x4359], NFKD: [0x4359] }, +{ source: [0x2F975], NFC: [0x262D9], NFD: [0x262D9], NFKC: [0x262D9], NFKD: [0x262D9] }, +{ source: [0x2F976], NFC: [0x7F7A], NFD: [0x7F7A], NFKC: [0x7F7A], NFKD: [0x7F7A] }, +{ source: [0x2F977], NFC: [0x2633E], NFD: [0x2633E], NFKC: [0x2633E], NFKD: [0x2633E] }, +{ source: [0x2F978], NFC: [0x7F95], NFD: [0x7F95], NFKC: [0x7F95], NFKD: [0x7F95] }, +{ source: [0x2F979], NFC: [0x7FFA], NFD: [0x7FFA], NFKC: [0x7FFA], NFKD: [0x7FFA] }, +{ source: [0x2F97A], NFC: [0x8005], NFD: [0x8005], NFKC: [0x8005], NFKD: [0x8005] }, +{ source: [0x2F97B], NFC: [0x264DA], NFD: [0x264DA], NFKC: [0x264DA], NFKD: [0x264DA] }, +{ source: [0x2F97C], NFC: [0x26523], NFD: [0x26523], NFKC: [0x26523], NFKD: [0x26523] }, +{ source: [0x2F97D], NFC: [0x8060], NFD: [0x8060], NFKC: [0x8060], NFKD: [0x8060] }, +{ source: [0x2F97E], NFC: [0x265A8], NFD: [0x265A8], NFKC: [0x265A8], NFKD: [0x265A8] }, +{ source: [0x2F97F], NFC: [0x8070], NFD: [0x8070], NFKC: [0x8070], NFKD: [0x8070] }, +{ source: [0x2F980], NFC: [0x2335F], NFD: [0x2335F], NFKC: [0x2335F], NFKD: [0x2335F] }, +{ source: [0x2F981], NFC: [0x43D5], NFD: [0x43D5], NFKC: [0x43D5], NFKD: [0x43D5] }, +{ source: [0x2F982], NFC: [0x80B2], NFD: [0x80B2], NFKC: [0x80B2], NFKD: [0x80B2] }, +{ source: [0x2F983], NFC: [0x8103], NFD: [0x8103], NFKC: [0x8103], NFKD: [0x8103] }, +{ source: [0x2F984], NFC: [0x440B], NFD: [0x440B], NFKC: [0x440B], NFKD: [0x440B] }, +{ source: [0x2F985], NFC: [0x813E], NFD: [0x813E], NFKC: [0x813E], NFKD: [0x813E] }, +{ source: [0x2F986], NFC: [0x5AB5], NFD: [0x5AB5], NFKC: [0x5AB5], NFKD: [0x5AB5] }, +{ source: [0x2F987], NFC: [0x267A7], NFD: [0x267A7], NFKC: [0x267A7], NFKD: [0x267A7] }, +{ source: [0x2F988], NFC: [0x267B5], NFD: [0x267B5], NFKC: [0x267B5], NFKD: [0x267B5] }, +{ source: [0x2F989], NFC: [0x23393], NFD: [0x23393], NFKC: [0x23393], NFKD: [0x23393] }, +{ source: [0x2F98A], NFC: [0x2339C], NFD: [0x2339C], NFKC: [0x2339C], NFKD: [0x2339C] }, +{ source: [0x2F98B], NFC: [0x8201], NFD: [0x8201], NFKC: [0x8201], NFKD: [0x8201] }, +{ source: [0x2F98C], NFC: [0x8204], NFD: [0x8204], NFKC: [0x8204], NFKD: [0x8204] }, +{ source: [0x2F98D], NFC: [0x8F9E], NFD: [0x8F9E], NFKC: [0x8F9E], NFKD: [0x8F9E] }, +{ source: [0x2F98E], NFC: [0x446B], NFD: [0x446B], NFKC: [0x446B], NFKD: [0x446B] }, +{ source: [0x2F98F], NFC: [0x8291], NFD: [0x8291], NFKC: [0x8291], NFKD: [0x8291] }, +{ source: [0x2F990], NFC: [0x828B], NFD: [0x828B], NFKC: [0x828B], NFKD: [0x828B] }, +{ source: [0x2F991], NFC: [0x829D], NFD: [0x829D], NFKC: [0x829D], NFKD: [0x829D] }, +{ source: [0x2F992], NFC: [0x52B3], NFD: [0x52B3], NFKC: [0x52B3], NFKD: [0x52B3] }, +{ source: [0x2F993], NFC: [0x82B1], NFD: [0x82B1], NFKC: [0x82B1], NFKD: [0x82B1] }, +{ source: [0x2F994], NFC: [0x82B3], NFD: [0x82B3], NFKC: [0x82B3], NFKD: [0x82B3] }, +{ source: [0x2F995], NFC: [0x82BD], NFD: [0x82BD], NFKC: [0x82BD], NFKD: [0x82BD] }, +{ source: [0x2F996], NFC: [0x82E6], NFD: [0x82E6], NFKC: [0x82E6], NFKD: [0x82E6] }, +{ source: [0x2F997], NFC: [0x26B3C], NFD: [0x26B3C], NFKC: [0x26B3C], NFKD: [0x26B3C] }, +{ source: [0x2F998], NFC: [0x82E5], NFD: [0x82E5], NFKC: [0x82E5], NFKD: [0x82E5] }, +{ source: [0x2F999], NFC: [0x831D], NFD: [0x831D], NFKC: [0x831D], NFKD: [0x831D] }, +{ source: [0x2F99A], NFC: [0x8363], NFD: [0x8363], NFKC: [0x8363], NFKD: [0x8363] }, +{ source: [0x2F99B], NFC: [0x83AD], NFD: [0x83AD], NFKC: [0x83AD], NFKD: [0x83AD] }, +{ source: [0x2F99C], NFC: [0x8323], NFD: [0x8323], NFKC: [0x8323], NFKD: [0x8323] }, +{ source: [0x2F99D], NFC: [0x83BD], NFD: [0x83BD], NFKC: [0x83BD], NFKD: [0x83BD] }, +{ source: [0x2F99E], NFC: [0x83E7], NFD: [0x83E7], NFKC: [0x83E7], NFKD: [0x83E7] }, +{ source: [0x2F99F], NFC: [0x8457], NFD: [0x8457], NFKC: [0x8457], NFKD: [0x8457] }, +{ source: [0x2F9A0], NFC: [0x8353], NFD: [0x8353], NFKC: [0x8353], NFKD: [0x8353] }, +{ source: [0x2F9A1], NFC: [0x83CA], NFD: [0x83CA], NFKC: [0x83CA], NFKD: [0x83CA] }, +{ source: [0x2F9A2], NFC: [0x83CC], NFD: [0x83CC], NFKC: [0x83CC], NFKD: [0x83CC] }, +{ source: [0x2F9A3], NFC: [0x83DC], NFD: [0x83DC], NFKC: [0x83DC], NFKD: [0x83DC] }, +{ source: [0x2F9A4], NFC: [0x26C36], NFD: [0x26C36], NFKC: [0x26C36], NFKD: [0x26C36] }, +{ source: [0x2F9A5], NFC: [0x26D6B], NFD: [0x26D6B], NFKC: [0x26D6B], NFKD: [0x26D6B] }, +{ source: [0x2F9A6], NFC: [0x26CD5], NFD: [0x26CD5], NFKC: [0x26CD5], NFKD: [0x26CD5] }, +{ source: [0x2F9A7], NFC: [0x452B], NFD: [0x452B], NFKC: [0x452B], NFKD: [0x452B] }, +{ source: [0x2F9A8], NFC: [0x84F1], NFD: [0x84F1], NFKC: [0x84F1], NFKD: [0x84F1] }, +{ source: [0x2F9A9], NFC: [0x84F3], NFD: [0x84F3], NFKC: [0x84F3], NFKD: [0x84F3] }, +{ source: [0x2F9AA], NFC: [0x8516], NFD: [0x8516], NFKC: [0x8516], NFKD: [0x8516] }, +{ source: [0x2F9AB], NFC: [0x273CA], NFD: [0x273CA], NFKC: [0x273CA], NFKD: [0x273CA] }, +{ source: [0x2F9AC], NFC: [0x8564], NFD: [0x8564], NFKC: [0x8564], NFKD: [0x8564] }, +{ source: [0x2F9AD], NFC: [0x26F2C], NFD: [0x26F2C], NFKC: [0x26F2C], NFKD: [0x26F2C] }, +{ source: [0x2F9AE], NFC: [0x455D], NFD: [0x455D], NFKC: [0x455D], NFKD: [0x455D] }, +{ source: [0x2F9AF], NFC: [0x4561], NFD: [0x4561], NFKC: [0x4561], NFKD: [0x4561] }, +{ source: [0x2F9B0], NFC: [0x26FB1], NFD: [0x26FB1], NFKC: [0x26FB1], NFKD: [0x26FB1] }, +{ source: [0x2F9B1], NFC: [0x270D2], NFD: [0x270D2], NFKC: [0x270D2], NFKD: [0x270D2] }, +{ source: [0x2F9B2], NFC: [0x456B], NFD: [0x456B], NFKC: [0x456B], NFKD: [0x456B] }, +{ source: [0x2F9B3], NFC: [0x8650], NFD: [0x8650], NFKC: [0x8650], NFKD: [0x8650] }, +{ source: [0x2F9B4], NFC: [0x865C], NFD: [0x865C], NFKC: [0x865C], NFKD: [0x865C] }, +{ source: [0x2F9B5], NFC: [0x8667], NFD: [0x8667], NFKC: [0x8667], NFKD: [0x8667] }, +{ source: [0x2F9B6], NFC: [0x8669], NFD: [0x8669], NFKC: [0x8669], NFKD: [0x8669] }, +{ source: [0x2F9B7], NFC: [0x86A9], NFD: [0x86A9], NFKC: [0x86A9], NFKD: [0x86A9] }, +{ source: [0x2F9B8], NFC: [0x8688], NFD: [0x8688], NFKC: [0x8688], NFKD: [0x8688] }, +{ source: [0x2F9B9], NFC: [0x870E], NFD: [0x870E], NFKC: [0x870E], NFKD: [0x870E] }, +{ source: [0x2F9BA], NFC: [0x86E2], NFD: [0x86E2], NFKC: [0x86E2], NFKD: [0x86E2] }, +{ source: [0x2F9BB], NFC: [0x8779], NFD: [0x8779], NFKC: [0x8779], NFKD: [0x8779] }, +{ source: [0x2F9BC], NFC: [0x8728], NFD: [0x8728], NFKC: [0x8728], NFKD: [0x8728] }, +{ source: [0x2F9BD], NFC: [0x876B], NFD: [0x876B], NFKC: [0x876B], NFKD: [0x876B] }, +{ source: [0x2F9BE], NFC: [0x8786], NFD: [0x8786], NFKC: [0x8786], NFKD: [0x8786] }, +{ source: [0x2F9BF], NFC: [0x45D7], NFD: [0x45D7], NFKC: [0x45D7], NFKD: [0x45D7] }, +{ source: [0x2F9C0], NFC: [0x87E1], NFD: [0x87E1], NFKC: [0x87E1], NFKD: [0x87E1] }, +{ source: [0x2F9C1], NFC: [0x8801], NFD: [0x8801], NFKC: [0x8801], NFKD: [0x8801] }, +{ source: [0x2F9C2], NFC: [0x45F9], NFD: [0x45F9], NFKC: [0x45F9], NFKD: [0x45F9] }, +{ source: [0x2F9C3], NFC: [0x8860], NFD: [0x8860], NFKC: [0x8860], NFKD: [0x8860] }, +{ source: [0x2F9C4], NFC: [0x8863], NFD: [0x8863], NFKC: [0x8863], NFKD: [0x8863] }, +{ source: [0x2F9C5], NFC: [0x27667], NFD: [0x27667], NFKC: [0x27667], NFKD: [0x27667] }, +{ source: [0x2F9C6], NFC: [0x88D7], NFD: [0x88D7], NFKC: [0x88D7], NFKD: [0x88D7] }, +{ source: [0x2F9C7], NFC: [0x88DE], NFD: [0x88DE], NFKC: [0x88DE], NFKD: [0x88DE] }, +{ source: [0x2F9C8], NFC: [0x4635], NFD: [0x4635], NFKC: [0x4635], NFKD: [0x4635] }, +{ source: [0x2F9C9], NFC: [0x88FA], NFD: [0x88FA], NFKC: [0x88FA], NFKD: [0x88FA] }, +{ source: [0x2F9CA], NFC: [0x34BB], NFD: [0x34BB], NFKC: [0x34BB], NFKD: [0x34BB] }, +{ source: [0x2F9CB], NFC: [0x278AE], NFD: [0x278AE], NFKC: [0x278AE], NFKD: [0x278AE] }, +{ source: [0x2F9CC], NFC: [0x27966], NFD: [0x27966], NFKC: [0x27966], NFKD: [0x27966] }, +{ source: [0x2F9CD], NFC: [0x46BE], NFD: [0x46BE], NFKC: [0x46BE], NFKD: [0x46BE] }, +{ source: [0x2F9CE], NFC: [0x46C7], NFD: [0x46C7], NFKC: [0x46C7], NFKD: [0x46C7] }, +{ source: [0x2F9CF], NFC: [0x8AA0], NFD: [0x8AA0], NFKC: [0x8AA0], NFKD: [0x8AA0] }, +{ source: [0x2F9D0], NFC: [0x8AED], NFD: [0x8AED], NFKC: [0x8AED], NFKD: [0x8AED] }, +{ source: [0x2F9D1], NFC: [0x8B8A], NFD: [0x8B8A], NFKC: [0x8B8A], NFKD: [0x8B8A] }, +{ source: [0x2F9D2], NFC: [0x8C55], NFD: [0x8C55], NFKC: [0x8C55], NFKD: [0x8C55] }, +{ source: [0x2F9D3], NFC: [0x27CA8], NFD: [0x27CA8], NFKC: [0x27CA8], NFKD: [0x27CA8] }, +{ source: [0x2F9D4], NFC: [0x8CAB], NFD: [0x8CAB], NFKC: [0x8CAB], NFKD: [0x8CAB] }, +{ source: [0x2F9D5], NFC: [0x8CC1], NFD: [0x8CC1], NFKC: [0x8CC1], NFKD: [0x8CC1] }, +{ source: [0x2F9D6], NFC: [0x8D1B], NFD: [0x8D1B], NFKC: [0x8D1B], NFKD: [0x8D1B] }, +{ source: [0x2F9D7], NFC: [0x8D77], NFD: [0x8D77], NFKC: [0x8D77], NFKD: [0x8D77] }, +{ source: [0x2F9D8], NFC: [0x27F2F], NFD: [0x27F2F], NFKC: [0x27F2F], NFKD: [0x27F2F] }, +{ source: [0x2F9D9], NFC: [0x20804], NFD: [0x20804], NFKC: [0x20804], NFKD: [0x20804] }, +{ source: [0x2F9DA], NFC: [0x8DCB], NFD: [0x8DCB], NFKC: [0x8DCB], NFKD: [0x8DCB] }, +{ source: [0x2F9DB], NFC: [0x8DBC], NFD: [0x8DBC], NFKC: [0x8DBC], NFKD: [0x8DBC] }, +{ source: [0x2F9DC], NFC: [0x8DF0], NFD: [0x8DF0], NFKC: [0x8DF0], NFKD: [0x8DF0] }, +{ source: [0x2F9DD], NFC: [0x208DE], NFD: [0x208DE], NFKC: [0x208DE], NFKD: [0x208DE] }, +{ source: [0x2F9DE], NFC: [0x8ED4], NFD: [0x8ED4], NFKC: [0x8ED4], NFKD: [0x8ED4] }, +{ source: [0x2F9DF], NFC: [0x8F38], NFD: [0x8F38], NFKC: [0x8F38], NFKD: [0x8F38] }, +{ source: [0x2F9E0], NFC: [0x285D2], NFD: [0x285D2], NFKC: [0x285D2], NFKD: [0x285D2] }, +{ source: [0x2F9E1], NFC: [0x285ED], NFD: [0x285ED], NFKC: [0x285ED], NFKD: [0x285ED] }, +{ source: [0x2F9E2], NFC: [0x9094], NFD: [0x9094], NFKC: [0x9094], NFKD: [0x9094] }, +{ source: [0x2F9E3], NFC: [0x90F1], NFD: [0x90F1], NFKC: [0x90F1], NFKD: [0x90F1] }, +{ source: [0x2F9E4], NFC: [0x9111], NFD: [0x9111], NFKC: [0x9111], NFKD: [0x9111] }, +{ source: [0x2F9E5], NFC: [0x2872E], NFD: [0x2872E], NFKC: [0x2872E], NFKD: [0x2872E] }, +{ source: [0x2F9E6], NFC: [0x911B], NFD: [0x911B], NFKC: [0x911B], NFKD: [0x911B] }, +{ source: [0x2F9E7], NFC: [0x9238], NFD: [0x9238], NFKC: [0x9238], NFKD: [0x9238] }, +{ source: [0x2F9E8], NFC: [0x92D7], NFD: [0x92D7], NFKC: [0x92D7], NFKD: [0x92D7] }, +{ source: [0x2F9E9], NFC: [0x92D8], NFD: [0x92D8], NFKC: [0x92D8], NFKD: [0x92D8] }, +{ source: [0x2F9EA], NFC: [0x927C], NFD: [0x927C], NFKC: [0x927C], NFKD: [0x927C] }, +{ source: [0x2F9EB], NFC: [0x93F9], NFD: [0x93F9], NFKC: [0x93F9], NFKD: [0x93F9] }, +{ source: [0x2F9EC], NFC: [0x9415], NFD: [0x9415], NFKC: [0x9415], NFKD: [0x9415] }, +{ source: [0x2F9ED], NFC: [0x28BFA], NFD: [0x28BFA], NFKC: [0x28BFA], NFKD: [0x28BFA] }, +{ source: [0x2F9EE], NFC: [0x958B], NFD: [0x958B], NFKC: [0x958B], NFKD: [0x958B] }, +{ source: [0x2F9EF], NFC: [0x4995], NFD: [0x4995], NFKC: [0x4995], NFKD: [0x4995] }, +{ source: [0x2F9F0], NFC: [0x95B7], NFD: [0x95B7], NFKC: [0x95B7], NFKD: [0x95B7] }, +{ source: [0x2F9F1], NFC: [0x28D77], NFD: [0x28D77], NFKC: [0x28D77], NFKD: [0x28D77] }, +{ source: [0x2F9F2], NFC: [0x49E6], NFD: [0x49E6], NFKC: [0x49E6], NFKD: [0x49E6] }, +{ source: [0x2F9F3], NFC: [0x96C3], NFD: [0x96C3], NFKC: [0x96C3], NFKD: [0x96C3] }, +{ source: [0x2F9F4], NFC: [0x5DB2], NFD: [0x5DB2], NFKC: [0x5DB2], NFKD: [0x5DB2] }, +{ source: [0x2F9F5], NFC: [0x9723], NFD: [0x9723], NFKC: [0x9723], NFKD: [0x9723] }, +{ source: [0x2F9F6], NFC: [0x29145], NFD: [0x29145], NFKC: [0x29145], NFKD: [0x29145] }, +{ source: [0x2F9F7], NFC: [0x2921A], NFD: [0x2921A], NFKC: [0x2921A], NFKD: [0x2921A] }, +{ source: [0x2F9F8], NFC: [0x4A6E], NFD: [0x4A6E], NFKC: [0x4A6E], NFKD: [0x4A6E] }, +{ source: [0x2F9F9], NFC: [0x4A76], NFD: [0x4A76], NFKC: [0x4A76], NFKD: [0x4A76] }, +{ source: [0x2F9FA], NFC: [0x97E0], NFD: [0x97E0], NFKC: [0x97E0], NFKD: [0x97E0] }, +{ source: [0x2F9FB], NFC: [0x2940A], NFD: [0x2940A], NFKC: [0x2940A], NFKD: [0x2940A] }, +{ source: [0x2F9FC], NFC: [0x4AB2], NFD: [0x4AB2], NFKC: [0x4AB2], NFKD: [0x4AB2] }, +{ source: [0x2F9FD], NFC: [0x29496], NFD: [0x29496], NFKC: [0x29496], NFKD: [0x29496] }, +{ source: [0x2F9FE], NFC: [0x980B], NFD: [0x980B], NFKC: [0x980B], NFKD: [0x980B] }, +{ source: [0x2F9FF], NFC: [0x980B], NFD: [0x980B], NFKC: [0x980B], NFKD: [0x980B] }, +{ source: [0x2FA00], NFC: [0x9829], NFD: [0x9829], NFKC: [0x9829], NFKD: [0x9829] }, +{ source: [0x2FA01], NFC: [0x295B6], NFD: [0x295B6], NFKC: [0x295B6], NFKD: [0x295B6] }, +{ source: [0x2FA02], NFC: [0x98E2], NFD: [0x98E2], NFKC: [0x98E2], NFKD: [0x98E2] }, +{ source: [0x2FA03], NFC: [0x4B33], NFD: [0x4B33], NFKC: [0x4B33], NFKD: [0x4B33] }, +{ source: [0x2FA04], NFC: [0x9929], NFD: [0x9929], NFKC: [0x9929], NFKD: [0x9929] }, +{ source: [0x2FA05], NFC: [0x99A7], NFD: [0x99A7], NFKC: [0x99A7], NFKD: [0x99A7] }, +{ source: [0x2FA06], NFC: [0x99C2], NFD: [0x99C2], NFKC: [0x99C2], NFKD: [0x99C2] }, +{ source: [0x2FA07], NFC: [0x99FE], NFD: [0x99FE], NFKC: [0x99FE], NFKD: [0x99FE] }, +{ source: [0x2FA08], NFC: [0x4BCE], NFD: [0x4BCE], NFKC: [0x4BCE], NFKD: [0x4BCE] }, +{ source: [0x2FA09], NFC: [0x29B30], NFD: [0x29B30], NFKC: [0x29B30], NFKD: [0x29B30] }, +{ source: [0x2FA0A], NFC: [0x9B12], NFD: [0x9B12], NFKC: [0x9B12], NFKD: [0x9B12] }, +{ source: [0x2FA0B], NFC: [0x9C40], NFD: [0x9C40], NFKC: [0x9C40], NFKD: [0x9C40] }, +{ source: [0x2FA0C], NFC: [0x9CFD], NFD: [0x9CFD], NFKC: [0x9CFD], NFKD: [0x9CFD] }, +{ source: [0x2FA0D], NFC: [0x4CCE], NFD: [0x4CCE], NFKC: [0x4CCE], NFKD: [0x4CCE] }, +{ source: [0x2FA0E], NFC: [0x4CED], NFD: [0x4CED], NFKC: [0x4CED], NFKD: [0x4CED] }, +{ source: [0x2FA0F], NFC: [0x9D67], NFD: [0x9D67], NFKC: [0x9D67], NFKD: [0x9D67] }, +{ source: [0x2FA10], NFC: [0x2A0CE], NFD: [0x2A0CE], NFKC: [0x2A0CE], NFKD: [0x2A0CE] }, +{ source: [0x2FA11], NFC: [0x4CF8], NFD: [0x4CF8], NFKC: [0x4CF8], NFKD: [0x4CF8] }, +{ source: [0x2FA12], NFC: [0x2A105], NFD: [0x2A105], NFKC: [0x2A105], NFKD: [0x2A105] }, +{ source: [0x2FA13], NFC: [0x2A20E], NFD: [0x2A20E], NFKC: [0x2A20E], NFKD: [0x2A20E] }, +{ source: [0x2FA14], NFC: [0x2A291], NFD: [0x2A291], NFKC: [0x2A291], NFKD: [0x2A291] }, +{ source: [0x2FA15], NFC: [0x9EBB], NFD: [0x9EBB], NFKC: [0x9EBB], NFKD: [0x9EBB] }, +{ source: [0x2FA16], NFC: [0x4D56], NFD: [0x4D56], NFKC: [0x4D56], NFKD: [0x4D56] }, +{ source: [0x2FA17], NFC: [0x9EF9], NFD: [0x9EF9], NFKC: [0x9EF9], NFKD: [0x9EF9] }, +{ source: [0x2FA18], NFC: [0x9EFE], NFD: [0x9EFE], NFKC: [0x9EFE], NFKD: [0x9EFE] }, +{ source: [0x2FA19], NFC: [0x9F05], NFD: [0x9F05], NFKC: [0x9F05], NFKD: [0x9F05] }, +{ source: [0x2FA1A], NFC: [0x9F0F], NFD: [0x9F0F], NFKC: [0x9F0F], NFKD: [0x9F0F] }, +{ source: [0x2FA1B], NFC: [0x9F16], NFD: [0x9F16], NFKC: [0x9F16], NFKD: [0x9F16] }, +{ source: [0x2FA1C], NFC: [0x9F3B], NFD: [0x9F3B], NFKC: [0x9F3B], NFKD: [0x9F3B] }, +{ source: [0x2FA1D], NFC: [0x2A600], NFD: [0x2A600], NFKC: [0x2A600], NFKD: [0x2A600] } +]; +/* Part2 # Canonical Order Test */ +var tests_part2 = [ +{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x0300, 0x0062], NFC: [0x00E0, 0x05AE, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x0300, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x0300, 0x0315, 0x0062] }, +{ source: [0x0061, 0x0300, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x00E0, 0x05AE, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x0300, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x0300, 0x0315, 0x0062] }, +{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x0301, 0x0062], NFC: [0x00E0, 0x05AE, 0x0301, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x0301, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x0301, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x0301, 0x0315, 0x0062] }, +{ source: [0x0061, 0x0301, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x00E1, 0x05AE, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0301, 0x0300, 0x0315, 0x0062], NFKC: [0x00E1, 0x05AE, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0301, 0x0300, 0x0315, 0x0062] }, +{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x0302, 0x0062], NFC: [0x00E0, 0x05AE, 0x0302, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x0302, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x0302, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x0302, 0x0315, 0x0062] }, +{ source: [0x0061, 0x0302, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x1EA7, 0x05AE, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0302, 0x0300, 0x0315, 0x0062], NFKC: [0x1EA7, 0x05AE, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0302, 0x0300, 0x0315, 0x0062] }, +{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x0303, 0x0062], NFC: [0x00E0, 0x05AE, 0x0303, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x0303, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x0303, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x0303, 0x0315, 0x0062] }, +{ source: [0x0061, 0x0303, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x00E3, 0x05AE, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0303, 0x0300, 0x0315, 0x0062], NFKC: [0x00E3, 0x05AE, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0303, 0x0300, 0x0315, 0x0062] }, +{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x0304, 0x0062], NFC: [0x00E0, 0x05AE, 0x0304, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x0304, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x0304, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x0304, 0x0315, 0x0062] }, +{ source: [0x0061, 0x0304, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0101, 0x05AE, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0304, 0x0300, 0x0315, 0x0062], NFKC: [0x0101, 0x05AE, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0304, 0x0300, 0x0315, 0x0062] }, +{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x0305, 0x0062], NFC: [0x00E0, 0x05AE, 0x0305, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x0305, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x0305, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x0305, 0x0315, 0x0062] }, +{ source: [0x0061, 0x0305, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x0305, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0305, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x0305, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0305, 0x0300, 0x0315, 0x0062] }, +{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x0306, 0x0062], NFC: [0x00E0, 0x05AE, 0x0306, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x0306, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x0306, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x0306, 0x0315, 0x0062] }, +{ source: [0x0061, 0x0306, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x1EB1, 0x05AE, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0306, 0x0300, 0x0315, 0x0062], NFKC: [0x1EB1, 0x05AE, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0306, 0x0300, 0x0315, 0x0062] }, +{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x0307, 0x0062], NFC: [0x00E0, 0x05AE, 0x0307, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x0307, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x0307, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x0307, 0x0315, 0x0062] }, +{ source: [0x0061, 0x0307, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0227, 0x05AE, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0307, 0x0300, 0x0315, 0x0062], NFKC: [0x0227, 0x05AE, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0307, 0x0300, 0x0315, 0x0062] }, +{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x0308, 0x0062], NFC: [0x00E0, 0x05AE, 0x0308, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x0308, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x0308, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x0308, 0x0315, 0x0062] }, +{ source: [0x0061, 0x0308, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x00E4, 0x05AE, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0308, 0x0300, 0x0315, 0x0062], NFKC: [0x00E4, 0x05AE, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0308, 0x0300, 0x0315, 0x0062] }, +{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x0309, 0x0062], NFC: [0x00E0, 0x05AE, 0x0309, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x0309, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x0309, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x0309, 0x0315, 0x0062] }, +{ source: [0x0061, 0x0309, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x1EA3, 0x05AE, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0309, 0x0300, 0x0315, 0x0062], NFKC: [0x1EA3, 0x05AE, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0309, 0x0300, 0x0315, 0x0062] }, +{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x030A, 0x0062], NFC: [0x00E0, 0x05AE, 0x030A, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x030A, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x030A, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x030A, 0x0315, 0x0062] }, +{ source: [0x0061, 0x030A, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x00E5, 0x05AE, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x030A, 0x0300, 0x0315, 0x0062], NFKC: [0x00E5, 0x05AE, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x030A, 0x0300, 0x0315, 0x0062] }, +{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x030B, 0x0062], NFC: [0x00E0, 0x05AE, 0x030B, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x030B, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x030B, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x030B, 0x0315, 0x0062] }, +{ source: [0x0061, 0x030B, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x030B, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x030B, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x030B, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x030B, 0x0300, 0x0315, 0x0062] }, +{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x030C, 0x0062], NFC: [0x00E0, 0x05AE, 0x030C, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x030C, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x030C, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x030C, 0x0315, 0x0062] }, +{ source: [0x0061, 0x030C, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x01CE, 0x05AE, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x030C, 0x0300, 0x0315, 0x0062], NFKC: [0x01CE, 0x05AE, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x030C, 0x0300, 0x0315, 0x0062] }, +{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x030D, 0x0062], NFC: [0x00E0, 0x05AE, 0x030D, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x030D, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x030D, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x030D, 0x0315, 0x0062] }, +{ source: [0x0061, 0x030D, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x030D, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x030D, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x030D, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x030D, 0x0300, 0x0315, 0x0062] }, +{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x030E, 0x0062], NFC: [0x00E0, 0x05AE, 0x030E, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x030E, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x030E, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x030E, 0x0315, 0x0062] }, +{ source: [0x0061, 0x030E, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x030E, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x030E, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x030E, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x030E, 0x0300, 0x0315, 0x0062] }, +{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x030F, 0x0062], NFC: [0x00E0, 0x05AE, 0x030F, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x030F, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x030F, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x030F, 0x0315, 0x0062] }, +{ source: [0x0061, 0x030F, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0201, 0x05AE, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x030F, 0x0300, 0x0315, 0x0062], NFKC: [0x0201, 0x05AE, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x030F, 0x0300, 0x0315, 0x0062] }, +{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x0310, 0x0062], NFC: [0x00E0, 0x05AE, 0x0310, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x0310, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x0310, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x0310, 0x0315, 0x0062] }, +{ source: [0x0061, 0x0310, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x0310, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0310, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x0310, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0310, 0x0300, 0x0315, 0x0062] }, +{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x0311, 0x0062], NFC: [0x00E0, 0x05AE, 0x0311, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x0311, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x0311, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x0311, 0x0315, 0x0062] }, +{ source: [0x0061, 0x0311, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0203, 0x05AE, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0311, 0x0300, 0x0315, 0x0062], NFKC: [0x0203, 0x05AE, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0311, 0x0300, 0x0315, 0x0062] }, +{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x0312, 0x0062], NFC: [0x00E0, 0x05AE, 0x0312, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x0312, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x0312, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x0312, 0x0315, 0x0062] }, +{ source: [0x0061, 0x0312, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x0312, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0312, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x0312, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0312, 0x0300, 0x0315, 0x0062] }, +{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x0313, 0x0062], NFC: [0x00E0, 0x05AE, 0x0313, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x0313, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x0313, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x0313, 0x0315, 0x0062] }, +{ source: [0x0061, 0x0313, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x0313, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0313, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x0313, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0313, 0x0300, 0x0315, 0x0062] }, +{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x0314, 0x0062], NFC: [0x00E0, 0x05AE, 0x0314, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x0314, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x0314, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x0314, 0x0315, 0x0062] }, +{ source: [0x0061, 0x0314, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x0314, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0314, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x0314, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0314, 0x0300, 0x0315, 0x0062] }, +{ source: [0x0061, 0x035C, 0x0315, 0x0300, 0x0315, 0x0062], NFC: [0x00E0, 0x0315, 0x0315, 0x035C, 0x0062], NFD: [0x0061, 0x0300, 0x0315, 0x0315, 0x035C, 0x0062], NFKC: [0x00E0, 0x0315, 0x0315, 0x035C, 0x0062], NFKD: [0x0061, 0x0300, 0x0315, 0x0315, 0x035C, 0x0062] }, +{ source: [0x0061, 0x0315, 0x035C, 0x0315, 0x0300, 0x0062], NFC: [0x00E0, 0x0315, 0x0315, 0x035C, 0x0062], NFD: [0x0061, 0x0300, 0x0315, 0x0315, 0x035C, 0x0062], NFKC: [0x00E0, 0x0315, 0x0315, 0x035C, 0x0062], NFKD: [0x0061, 0x0300, 0x0315, 0x0315, 0x035C, 0x0062] }, +{ source: [0x0061, 0x059A, 0x0316, 0x1DFA, 0x0316, 0x0062], NFC: [0x0061, 0x1DFA, 0x0316, 0x0316, 0x059A, 0x0062], NFD: [0x0061, 0x1DFA, 0x0316, 0x0316, 0x059A, 0x0062], NFKC: [0x0061, 0x1DFA, 0x0316, 0x0316, 0x059A, 0x0062], NFKD: [0x0061, 0x1DFA, 0x0316, 0x0316, 0x059A, 0x0062] }, +{ source: [0x0061, 0x0316, 0x059A, 0x0316, 0x1DFA, 0x0062], NFC: [0x0061, 0x1DFA, 0x0316, 0x0316, 0x059A, 0x0062], NFD: [0x0061, 0x1DFA, 0x0316, 0x0316, 0x059A, 0x0062], NFKC: [0x0061, 0x1DFA, 0x0316, 0x0316, 0x059A, 0x0062], NFKD: [0x0061, 0x1DFA, 0x0316, 0x0316, 0x059A, 0x0062] }, +{ source: [0x0061, 0x059A, 0x0316, 0x1DFA, 0x0317, 0x0062], NFC: [0x0061, 0x1DFA, 0x0316, 0x0317, 0x059A, 0x0062], NFD: [0x0061, 0x1DFA, 0x0316, 0x0317, 0x059A, 0x0062], NFKC: [0x0061, 0x1DFA, 0x0316, 0x0317, 0x059A, 0x0062], NFKD: [0x0061, 0x1DFA, 0x0316, 0x0317, 0x059A, 0x0062] }, +{ source: [0x0061, 0x0317, 0x059A, 0x0316, 0x1DFA, 0x0062], NFC: [0x0061, 0x1DFA, 0x0317, 0x0316, 0x059A, 0x0062], NFD: [0x0061, 0x1DFA, 0x0317, 0x0316, 0x059A, 0x0062], NFKC: [0x0061, 0x1DFA, 0x0317, 0x0316, 0x059A, 0x0062], NFKD: [0x0061, 0x1DFA, 0x0317, 0x0316, 0x059A, 0x0062] }, +{ source: [0x0061, 0x059A, 0x0316, 0x1DFA, 0x0318, 0x0062], NFC: [0x0061, 0x1DFA, 0x0316, 0x0318, 0x059A, 0x0062], NFD: [0x0061, 0x1DFA, 0x0316, 0x0318, 0x059A, 0x0062], NFKC: [0x0061, 0x1DFA, 0x0316, 0x0318, 0x059A, 0x0062], NFKD: [0x0061, 0x1DFA, 0x0316, 0x0318, 0x059A, 0x0062] }, +{ source: [0x0061, 0x0318, 0x059A, 0x0316, 0x1DFA, 0x0062], NFC: [0x0061, 0x1DFA, 0x0318, 0x0316, 0x059A, 0x0062], NFD: [0x0061, 0x1DFA, 0x0318, 0x0316, 0x059A, 0x0062], NFKC: [0x0061, 0x1DFA, 0x0318, 0x0316, 0x059A, 0x0062], NFKD: [0x0061, 0x1DFA, 0x0318, 0x0316, 0x059A, 0x0062] }, +{ source: [0x0061, 0x059A, 0x0316, 0x1DFA, 0x0319, 0x0062], NFC: [0x0061, 0x1DFA, 0x0316, 0x0319, 0x059A, 0x0062], NFD: [0x0061, 0x1DFA, 0x0316, 0x0319, 0x059A, 0x0062], NFKC: [0x0061, 0x1DFA, 0x0316, 0x0319, 0x059A, 0x0062], NFKD: [0x0061, 0x1DFA, 0x0316, 0x0319, 0x059A, 0x0062] }, +{ source: [0x0061, 0x0319, 0x059A, 0x0316, 0x1DFA, 0x0062], NFC: [0x0061, 0x1DFA, 0x0319, 0x0316, 0x059A, 0x0062], NFD: [0x0061, 0x1DFA, 0x0319, 0x0316, 0x059A, 0x0062], NFKC: [0x0061, 0x1DFA, 0x0319, 0x0316, 0x059A, 0x0062], NFKD: [0x0061, 0x1DFA, 0x0319, 0x0316, 0x059A, 0x0062] }, +{ source: [0x0061, 0x035C, 0x0315, 0x0300, 0x031A, 0x0062], NFC: [0x00E0, 0x0315, 0x031A, 0x035C, 0x0062], NFD: [0x0061, 0x0300, 0x0315, 0x031A, 0x035C, 0x0062], NFKC: [0x00E0, 0x0315, 0x031A, 0x035C, 0x0062], NFKD: [0x0061, 0x0300, 0x0315, 0x031A, 0x035C, 0x0062] }, +{ source: [0x0061, 0x031A, 0x035C, 0x0315, 0x0300, 0x0062], NFC: [0x00E0, 0x031A, 0x0315, 0x035C, 0x0062], NFD: [0x0061, 0x0300, 0x031A, 0x0315, 0x035C, 0x0062], NFKC: [0x00E0, 0x031A, 0x0315, 0x035C, 0x0062], NFKD: [0x0061, 0x0300, 0x031A, 0x0315, 0x035C, 0x0062] }, +{ source: [0x0061, 0x1DFA, 0x031B, 0x1DCE, 0x031B, 0x0062], NFC: [0x0061, 0x1DCE, 0x031B, 0x031B, 0x1DFA, 0x0062], NFD: [0x0061, 0x1DCE, 0x031B, 0x031B, 0x1DFA, 0x0062], NFKC: [0x0061, 0x1DCE, 0x031B, 0x031B, 0x1DFA, 0x0062], NFKD: [0x0061, 0x1DCE, 0x031B, 0x031B, 0x1DFA, 0x0062] }, +{ source: [0x0061, 0x031B, 0x1DFA, 0x031B, 0x1DCE, 0x0062], NFC: [0x0061, 0x1DCE, 0x031B, 0x031B, 0x1DFA, 0x0062], NFD: [0x0061, 0x1DCE, 0x031B, 0x031B, 0x1DFA, 0x0062], NFKC: [0x0061, 0x1DCE, 0x031B, 0x031B, 0x1DFA, 0x0062], NFKD: [0x0061, 0x1DCE, 0x031B, 0x031B, 0x1DFA, 0x0062] }, +{ source: [0x0061, 0x059A, 0x0316, 0x1DFA, 0x031C, 0x0062], NFC: [0x0061, 0x1DFA, 0x0316, 0x031C, 0x059A, 0x0062], NFD: [0x0061, 0x1DFA, 0x0316, 0x031C, 0x059A, 0x0062], NFKC: [0x0061, 0x1DFA, 0x0316, 0x031C, 0x059A, 0x0062], NFKD: [0x0061, 0x1DFA, 0x0316, 0x031C, 0x059A, 0x0062] }, +{ source: [0x0061, 0x031C, 0x059A, 0x0316, 0x1DFA, 0x0062], NFC: [0x0061, 0x1DFA, 0x031C, 0x0316, 0x059A, 0x0062], NFD: [0x0061, 0x1DFA, 0x031C, 0x0316, 0x059A, 0x0062], NFKC: [0x0061, 0x1DFA, 0x031C, 0x0316, 0x059A, 0x0062], NFKD: [0x0061, 0x1DFA, 0x031C, 0x0316, 0x059A, 0x0062] }, +{ source: [0x0061, 0x059A, 0x0316, 0x1DFA, 0x031D, 0x0062], NFC: [0x0061, 0x1DFA, 0x0316, 0x031D, 0x059A, 0x0062], NFD: [0x0061, 0x1DFA, 0x0316, 0x031D, 0x059A, 0x0062], NFKC: [0x0061, 0x1DFA, 0x0316, 0x031D, 0x059A, 0x0062], NFKD: [0x0061, 0x1DFA, 0x0316, 0x031D, 0x059A, 0x0062] }, +{ source: [0x0061, 0x031D, 0x059A, 0x0316, 0x1DFA, 0x0062], NFC: [0x0061, 0x1DFA, 0x031D, 0x0316, 0x059A, 0x0062], NFD: [0x0061, 0x1DFA, 0x031D, 0x0316, 0x059A, 0x0062], NFKC: [0x0061, 0x1DFA, 0x031D, 0x0316, 0x059A, 0x0062], NFKD: [0x0061, 0x1DFA, 0x031D, 0x0316, 0x059A, 0x0062] }, +{ source: [0x0061, 0x059A, 0x0316, 0x1DFA, 0x031E, 0x0062], NFC: [0x0061, 0x1DFA, 0x0316, 0x031E, 0x059A, 0x0062], NFD: [0x0061, 0x1DFA, 0x0316, 0x031E, 0x059A, 0x0062], NFKC: [0x0061, 0x1DFA, 0x0316, 0x031E, 0x059A, 0x0062], NFKD: [0x0061, 0x1DFA, 0x0316, 0x031E, 0x059A, 0x0062] }, +{ source: [0x0061, 0x031E, 0x059A, 0x0316, 0x1DFA, 0x0062], NFC: [0x0061, 0x1DFA, 0x031E, 0x0316, 0x059A, 0x0062], NFD: [0x0061, 0x1DFA, 0x031E, 0x0316, 0x059A, 0x0062], NFKC: [0x0061, 0x1DFA, 0x031E, 0x0316, 0x059A, 0x0062], NFKD: [0x0061, 0x1DFA, 0x031E, 0x0316, 0x059A, 0x0062] }, +{ source: [0x0061, 0x059A, 0x0316, 0x1DFA, 0x031F, 0x0062], NFC: [0x0061, 0x1DFA, 0x0316, 0x031F, 0x059A, 0x0062], NFD: [0x0061, 0x1DFA, 0x0316, 0x031F, 0x059A, 0x0062], NFKC: [0x0061, 0x1DFA, 0x0316, 0x031F, 0x059A, 0x0062], NFKD: [0x0061, 0x1DFA, 0x0316, 0x031F, 0x059A, 0x0062] }, +{ source: [0x0061, 0x031F, 0x059A, 0x0316, 0x1DFA, 0x0062], NFC: [0x0061, 0x1DFA, 0x031F, 0x0316, 0x059A, 0x0062], NFD: [0x0061, 0x1DFA, 0x031F, 0x0316, 0x059A, 0x0062], NFKC: [0x0061, 0x1DFA, 0x031F, 0x0316, 0x059A, 0x0062], NFKD: [0x0061, 0x1DFA, 0x031F, 0x0316, 0x059A, 0x0062] }, +{ source: [0x0061, 0x059A, 0x0316, 0x1DFA, 0x0320, 0x0062], NFC: [0x0061, 0x1DFA, 0x0316, 0x0320, 0x059A, 0x0062], NFD: [0x0061, 0x1DFA, 0x0316, 0x0320, 0x059A, 0x0062], NFKC: [0x0061, 0x1DFA, 0x0316, 0x0320, 0x059A, 0x0062], NFKD: [0x0061, 0x1DFA, 0x0316, 0x0320, 0x059A, 0x0062] }, +{ source: [0x0061, 0x0320, 0x059A, 0x0316, 0x1DFA, 0x0062], NFC: [0x0061, 0x1DFA, 0x0320, 0x0316, 0x059A, 0x0062], NFD: [0x0061, 0x1DFA, 0x0320, 0x0316, 0x059A, 0x0062], NFKC: [0x0061, 0x1DFA, 0x0320, 0x0316, 0x059A, 0x0062], NFKD: [0x0061, 0x1DFA, 0x0320, 0x0316, 0x059A, 0x0062] }, +{ source: [0x0061, 0x1DCE, 0x0321, 0x0F74, 0x0321, 0x0062], NFC: [0x0061, 0x0F74, 0x0321, 0x0321, 0x1DCE, 0x0062], NFD: [0x0061, 0x0F74, 0x0321, 0x0321, 0x1DCE, 0x0062], NFKC: [0x0061, 0x0F74, 0x0321, 0x0321, 0x1DCE, 0x0062], NFKD: [0x0061, 0x0F74, 0x0321, 0x0321, 0x1DCE, 0x0062] }, +{ source: [0x0061, 0x0321, 0x1DCE, 0x0321, 0x0F74, 0x0062], NFC: [0x0061, 0x0F74, 0x0321, 0x0321, 0x1DCE, 0x0062], NFD: [0x0061, 0x0F74, 0x0321, 0x0321, 0x1DCE, 0x0062], NFKC: [0x0061, 0x0F74, 0x0321, 0x0321, 0x1DCE, 0x0062], NFKD: [0x0061, 0x0F74, 0x0321, 0x0321, 0x1DCE, 0x0062] }, +{ source: [0x0061, 0x1DCE, 0x0321, 0x0F74, 0x0322, 0x0062], NFC: [0x0061, 0x0F74, 0x0321, 0x0322, 0x1DCE, 0x0062], NFD: [0x0061, 0x0F74, 0x0321, 0x0322, 0x1DCE, 0x0062], NFKC: [0x0061, 0x0F74, 0x0321, 0x0322, 0x1DCE, 0x0062], NFKD: [0x0061, 0x0F74, 0x0321, 0x0322, 0x1DCE, 0x0062] }, +{ source: [0x0061, 0x0322, 0x1DCE, 0x0321, 0x0F74, 0x0062], NFC: [0x0061, 0x0F74, 0x0322, 0x0321, 0x1DCE, 0x0062], NFD: [0x0061, 0x0F74, 0x0322, 0x0321, 0x1DCE, 0x0062], NFKC: [0x0061, 0x0F74, 0x0322, 0x0321, 0x1DCE, 0x0062], NFKD: [0x0061, 0x0F74, 0x0322, 0x0321, 0x1DCE, 0x0062] }, +{ source: [0x0061, 0x059A, 0x0316, 0x1DFA, 0x0323, 0x0062], NFC: [0x0061, 0x1DFA, 0x0316, 0x0323, 0x059A, 0x0062], NFD: [0x0061, 0x1DFA, 0x0316, 0x0323, 0x059A, 0x0062], NFKC: [0x0061, 0x1DFA, 0x0316, 0x0323, 0x059A, 0x0062], NFKD: [0x0061, 0x1DFA, 0x0316, 0x0323, 0x059A, 0x0062] }, +{ source: [0x0061, 0x0323, 0x059A, 0x0316, 0x1DFA, 0x0062], NFC: [0x1EA1, 0x1DFA, 0x0316, 0x059A, 0x0062], NFD: [0x0061, 0x1DFA, 0x0323, 0x0316, 0x059A, 0x0062], NFKC: [0x1EA1, 0x1DFA, 0x0316, 0x059A, 0x0062], NFKD: [0x0061, 0x1DFA, 0x0323, 0x0316, 0x059A, 0x0062] }, +{ source: [0x0061, 0x059A, 0x0316, 0x1DFA, 0x0324, 0x0062], NFC: [0x0061, 0x1DFA, 0x0316, 0x0324, 0x059A, 0x0062], NFD: [0x0061, 0x1DFA, 0x0316, 0x0324, 0x059A, 0x0062], NFKC: [0x0061, 0x1DFA, 0x0316, 0x0324, 0x059A, 0x0062], NFKD: [0x0061, 0x1DFA, 0x0316, 0x0324, 0x059A, 0x0062] }, +{ source: [0x0061, 0x0324, 0x059A, 0x0316, 0x1DFA, 0x0062], NFC: [0x0061, 0x1DFA, 0x0324, 0x0316, 0x059A, 0x0062], NFD: [0x0061, 0x1DFA, 0x0324, 0x0316, 0x059A, 0x0062], NFKC: [0x0061, 0x1DFA, 0x0324, 0x0316, 0x059A, 0x0062], NFKD: [0x0061, 0x1DFA, 0x0324, 0x0316, 0x059A, 0x0062] }, +{ source: [0x0061, 0x059A, 0x0316, 0x1DFA, 0x0325, 0x0062], NFC: [0x0061, 0x1DFA, 0x0316, 0x0325, 0x059A, 0x0062], NFD: [0x0061, 0x1DFA, 0x0316, 0x0325, 0x059A, 0x0062], NFKC: [0x0061, 0x1DFA, 0x0316, 0x0325, 0x059A, 0x0062], NFKD: [0x0061, 0x1DFA, 0x0316, 0x0325, 0x059A, 0x0062] }, +{ source: [0x0061, 0x0325, 0x059A, 0x0316, 0x1DFA, 0x0062], NFC: [0x1E01, 0x1DFA, 0x0316, 0x059A, 0x0062], NFD: [0x0061, 0x1DFA, 0x0325, 0x0316, 0x059A, 0x0062], NFKC: [0x1E01, 0x1DFA, 0x0316, 0x059A, 0x0062], NFKD: [0x0061, 0x1DFA, 0x0325, 0x0316, 0x059A, 0x0062] }, +{ source: [0x0061, 0x059A, 0x0316, 0x1DFA, 0x0326, 0x0062], NFC: [0x0061, 0x1DFA, 0x0316, 0x0326, 0x059A, 0x0062], NFD: [0x0061, 0x1DFA, 0x0316, 0x0326, 0x059A, 0x0062], NFKC: [0x0061, 0x1DFA, 0x0316, 0x0326, 0x059A, 0x0062], NFKD: [0x0061, 0x1DFA, 0x0316, 0x0326, 0x059A, 0x0062] }, +{ source: [0x0061, 0x0326, 0x059A, 0x0316, 0x1DFA, 0x0062], NFC: [0x0061, 0x1DFA, 0x0326, 0x0316, 0x059A, 0x0062], NFD: [0x0061, 0x1DFA, 0x0326, 0x0316, 0x059A, 0x0062], NFKC: [0x0061, 0x1DFA, 0x0326, 0x0316, 0x059A, 0x0062], NFKD: [0x0061, 0x1DFA, 0x0326, 0x0316, 0x059A, 0x0062] }, +{ source: [0x0061, 0x1DCE, 0x0321, 0x0F74, 0x0327, 0x0062], NFC: [0x0061, 0x0F74, 0x0321, 0x0327, 0x1DCE, 0x0062], NFD: [0x0061, 0x0F74, 0x0321, 0x0327, 0x1DCE, 0x0062], NFKC: [0x0061, 0x0F74, 0x0321, 0x0327, 0x1DCE, 0x0062], NFKD: [0x0061, 0x0F74, 0x0321, 0x0327, 0x1DCE, 0x0062] }, +{ source: [0x0061, 0x0327, 0x1DCE, 0x0321, 0x0F74, 0x0062], NFC: [0x0061, 0x0F74, 0x0327, 0x0321, 0x1DCE, 0x0062], NFD: [0x0061, 0x0F74, 0x0327, 0x0321, 0x1DCE, 0x0062], NFKC: [0x0061, 0x0F74, 0x0327, 0x0321, 0x1DCE, 0x0062], NFKD: [0x0061, 0x0F74, 0x0327, 0x0321, 0x1DCE, 0x0062] }, +{ source: [0x0061, 0x1DCE, 0x0321, 0x0F74, 0x0328, 0x0062], NFC: [0x0061, 0x0F74, 0x0321, 0x0328, 0x1DCE, 0x0062], NFD: [0x0061, 0x0F74, 0x0321, 0x0328, 0x1DCE, 0x0062], NFKC: [0x0061, 0x0F74, 0x0321, 0x0328, 0x1DCE, 0x0062], NFKD: [0x0061, 0x0F74, 0x0321, 0x0328, 0x1DCE, 0x0062] }, +{ source: [0x0061, 0x0328, 0x1DCE, 0x0321, 0x0F74, 0x0062], NFC: [0x0105, 0x0F74, 0x0321, 0x1DCE, 0x0062], NFD: [0x0061, 0x0F74, 0x0328, 0x0321, 0x1DCE, 0x0062], NFKC: [0x0105, 0x0F74, 0x0321, 0x1DCE, 0x0062], NFKD: [0x0061, 0x0F74, 0x0328, 0x0321, 0x1DCE, 0x0062] }, +{ source: [0x0061, 0x059A, 0x0316, 0x1DFA, 0x0329, 0x0062], NFC: [0x0061, 0x1DFA, 0x0316, 0x0329, 0x059A, 0x0062], NFD: [0x0061, 0x1DFA, 0x0316, 0x0329, 0x059A, 0x0062], NFKC: [0x0061, 0x1DFA, 0x0316, 0x0329, 0x059A, 0x0062], NFKD: [0x0061, 0x1DFA, 0x0316, 0x0329, 0x059A, 0x0062] }, +{ source: [0x0061, 0x0329, 0x059A, 0x0316, 0x1DFA, 0x0062], NFC: [0x0061, 0x1DFA, 0x0329, 0x0316, 0x059A, 0x0062], NFD: [0x0061, 0x1DFA, 0x0329, 0x0316, 0x059A, 0x0062], NFKC: [0x0061, 0x1DFA, 0x0329, 0x0316, 0x059A, 0x0062], NFKD: [0x0061, 0x1DFA, 0x0329, 0x0316, 0x059A, 0x0062] }, +{ source: [0x0061, 0x059A, 0x0316, 0x1DFA, 0x032A, 0x0062], NFC: [0x0061, 0x1DFA, 0x0316, 0x032A, 0x059A, 0x0062], NFD: [0x0061, 0x1DFA, 0x0316, 0x032A, 0x059A, 0x0062], NFKC: [0x0061, 0x1DFA, 0x0316, 0x032A, 0x059A, 0x0062], NFKD: [0x0061, 0x1DFA, 0x0316, 0x032A, 0x059A, 0x0062] }, +{ source: [0x0061, 0x032A, 0x059A, 0x0316, 0x1DFA, 0x0062], NFC: [0x0061, 0x1DFA, 0x032A, 0x0316, 0x059A, 0x0062], NFD: [0x0061, 0x1DFA, 0x032A, 0x0316, 0x059A, 0x0062], NFKC: [0x0061, 0x1DFA, 0x032A, 0x0316, 0x059A, 0x0062], NFKD: [0x0061, 0x1DFA, 0x032A, 0x0316, 0x059A, 0x0062] }, +{ source: [0x0061, 0x059A, 0x0316, 0x1DFA, 0x032B, 0x0062], NFC: [0x0061, 0x1DFA, 0x0316, 0x032B, 0x059A, 0x0062], NFD: [0x0061, 0x1DFA, 0x0316, 0x032B, 0x059A, 0x0062], NFKC: [0x0061, 0x1DFA, 0x0316, 0x032B, 0x059A, 0x0062], NFKD: [0x0061, 0x1DFA, 0x0316, 0x032B, 0x059A, 0x0062] }, +{ source: [0x0061, 0x032B, 0x059A, 0x0316, 0x1DFA, 0x0062], NFC: [0x0061, 0x1DFA, 0x032B, 0x0316, 0x059A, 0x0062], NFD: [0x0061, 0x1DFA, 0x032B, 0x0316, 0x059A, 0x0062], NFKC: [0x0061, 0x1DFA, 0x032B, 0x0316, 0x059A, 0x0062], NFKD: [0x0061, 0x1DFA, 0x032B, 0x0316, 0x059A, 0x0062] }, +{ source: [0x0061, 0x059A, 0x0316, 0x1DFA, 0x032C, 0x0062], NFC: [0x0061, 0x1DFA, 0x0316, 0x032C, 0x059A, 0x0062], NFD: [0x0061, 0x1DFA, 0x0316, 0x032C, 0x059A, 0x0062], NFKC: [0x0061, 0x1DFA, 0x0316, 0x032C, 0x059A, 0x0062], NFKD: [0x0061, 0x1DFA, 0x0316, 0x032C, 0x059A, 0x0062] }, +{ source: [0x0061, 0x032C, 0x059A, 0x0316, 0x1DFA, 0x0062], NFC: [0x0061, 0x1DFA, 0x032C, 0x0316, 0x059A, 0x0062], NFD: [0x0061, 0x1DFA, 0x032C, 0x0316, 0x059A, 0x0062], NFKC: [0x0061, 0x1DFA, 0x032C, 0x0316, 0x059A, 0x0062], NFKD: [0x0061, 0x1DFA, 0x032C, 0x0316, 0x059A, 0x0062] }, +{ source: [0x0061, 0x059A, 0x0316, 0x1DFA, 0x032D, 0x0062], NFC: [0x0061, 0x1DFA, 0x0316, 0x032D, 0x059A, 0x0062], NFD: [0x0061, 0x1DFA, 0x0316, 0x032D, 0x059A, 0x0062], NFKC: [0x0061, 0x1DFA, 0x0316, 0x032D, 0x059A, 0x0062], NFKD: [0x0061, 0x1DFA, 0x0316, 0x032D, 0x059A, 0x0062] }, +{ source: [0x0061, 0x032D, 0x059A, 0x0316, 0x1DFA, 0x0062], NFC: [0x0061, 0x1DFA, 0x032D, 0x0316, 0x059A, 0x0062], NFD: [0x0061, 0x1DFA, 0x032D, 0x0316, 0x059A, 0x0062], NFKC: [0x0061, 0x1DFA, 0x032D, 0x0316, 0x059A, 0x0062], NFKD: [0x0061, 0x1DFA, 0x032D, 0x0316, 0x059A, 0x0062] }, +{ source: [0x0061, 0x059A, 0x0316, 0x1DFA, 0x032E, 0x0062], NFC: [0x0061, 0x1DFA, 0x0316, 0x032E, 0x059A, 0x0062], NFD: [0x0061, 0x1DFA, 0x0316, 0x032E, 0x059A, 0x0062], NFKC: [0x0061, 0x1DFA, 0x0316, 0x032E, 0x059A, 0x0062], NFKD: [0x0061, 0x1DFA, 0x0316, 0x032E, 0x059A, 0x0062] }, +{ source: [0x0061, 0x032E, 0x059A, 0x0316, 0x1DFA, 0x0062], NFC: [0x0061, 0x1DFA, 0x032E, 0x0316, 0x059A, 0x0062], NFD: [0x0061, 0x1DFA, 0x032E, 0x0316, 0x059A, 0x0062], NFKC: [0x0061, 0x1DFA, 0x032E, 0x0316, 0x059A, 0x0062], NFKD: [0x0061, 0x1DFA, 0x032E, 0x0316, 0x059A, 0x0062] }, +{ source: [0x0061, 0x059A, 0x0316, 0x1DFA, 0x032F, 0x0062], NFC: [0x0061, 0x1DFA, 0x0316, 0x032F, 0x059A, 0x0062], NFD: [0x0061, 0x1DFA, 0x0316, 0x032F, 0x059A, 0x0062], NFKC: [0x0061, 0x1DFA, 0x0316, 0x032F, 0x059A, 0x0062], NFKD: [0x0061, 0x1DFA, 0x0316, 0x032F, 0x059A, 0x0062] }, +{ source: [0x0061, 0x032F, 0x059A, 0x0316, 0x1DFA, 0x0062], NFC: [0x0061, 0x1DFA, 0x032F, 0x0316, 0x059A, 0x0062], NFD: [0x0061, 0x1DFA, 0x032F, 0x0316, 0x059A, 0x0062], NFKC: [0x0061, 0x1DFA, 0x032F, 0x0316, 0x059A, 0x0062], NFKD: [0x0061, 0x1DFA, 0x032F, 0x0316, 0x059A, 0x0062] }, +{ source: [0x0061, 0x059A, 0x0316, 0x1DFA, 0x0330, 0x0062], NFC: [0x0061, 0x1DFA, 0x0316, 0x0330, 0x059A, 0x0062], NFD: [0x0061, 0x1DFA, 0x0316, 0x0330, 0x059A, 0x0062], NFKC: [0x0061, 0x1DFA, 0x0316, 0x0330, 0x059A, 0x0062], NFKD: [0x0061, 0x1DFA, 0x0316, 0x0330, 0x059A, 0x0062] }, +{ source: [0x0061, 0x0330, 0x059A, 0x0316, 0x1DFA, 0x0062], NFC: [0x0061, 0x1DFA, 0x0330, 0x0316, 0x059A, 0x0062], NFD: [0x0061, 0x1DFA, 0x0330, 0x0316, 0x059A, 0x0062], NFKC: [0x0061, 0x1DFA, 0x0330, 0x0316, 0x059A, 0x0062], NFKD: [0x0061, 0x1DFA, 0x0330, 0x0316, 0x059A, 0x0062] }, +{ source: [0x0061, 0x059A, 0x0316, 0x1DFA, 0x0331, 0x0062], NFC: [0x0061, 0x1DFA, 0x0316, 0x0331, 0x059A, 0x0062], NFD: [0x0061, 0x1DFA, 0x0316, 0x0331, 0x059A, 0x0062], NFKC: [0x0061, 0x1DFA, 0x0316, 0x0331, 0x059A, 0x0062], NFKD: [0x0061, 0x1DFA, 0x0316, 0x0331, 0x059A, 0x0062] }, +{ source: [0x0061, 0x0331, 0x059A, 0x0316, 0x1DFA, 0x0062], NFC: [0x0061, 0x1DFA, 0x0331, 0x0316, 0x059A, 0x0062], NFD: [0x0061, 0x1DFA, 0x0331, 0x0316, 0x059A, 0x0062], NFKC: [0x0061, 0x1DFA, 0x0331, 0x0316, 0x059A, 0x0062], NFKD: [0x0061, 0x1DFA, 0x0331, 0x0316, 0x059A, 0x0062] }, +{ source: [0x0061, 0x059A, 0x0316, 0x1DFA, 0x0332, 0x0062], NFC: [0x0061, 0x1DFA, 0x0316, 0x0332, 0x059A, 0x0062], NFD: [0x0061, 0x1DFA, 0x0316, 0x0332, 0x059A, 0x0062], NFKC: [0x0061, 0x1DFA, 0x0316, 0x0332, 0x059A, 0x0062], NFKD: [0x0061, 0x1DFA, 0x0316, 0x0332, 0x059A, 0x0062] }, +{ source: [0x0061, 0x0332, 0x059A, 0x0316, 0x1DFA, 0x0062], NFC: [0x0061, 0x1DFA, 0x0332, 0x0316, 0x059A, 0x0062], NFD: [0x0061, 0x1DFA, 0x0332, 0x0316, 0x059A, 0x0062], NFKC: [0x0061, 0x1DFA, 0x0332, 0x0316, 0x059A, 0x0062], NFKD: [0x0061, 0x1DFA, 0x0332, 0x0316, 0x059A, 0x0062] }, +{ source: [0x0061, 0x059A, 0x0316, 0x1DFA, 0x0333, 0x0062], NFC: [0x0061, 0x1DFA, 0x0316, 0x0333, 0x059A, 0x0062], NFD: [0x0061, 0x1DFA, 0x0316, 0x0333, 0x059A, 0x0062], NFKC: [0x0061, 0x1DFA, 0x0316, 0x0333, 0x059A, 0x0062], NFKD: [0x0061, 0x1DFA, 0x0316, 0x0333, 0x059A, 0x0062] }, +{ source: [0x0061, 0x0333, 0x059A, 0x0316, 0x1DFA, 0x0062], NFC: [0x0061, 0x1DFA, 0x0333, 0x0316, 0x059A, 0x0062], NFD: [0x0061, 0x1DFA, 0x0333, 0x0316, 0x059A, 0x0062], NFKC: [0x0061, 0x1DFA, 0x0333, 0x0316, 0x059A, 0x0062], NFKD: [0x0061, 0x1DFA, 0x0333, 0x0316, 0x059A, 0x0062] }, +{ source: [0x0061, 0x16FF0, 0x0334, 0x0334, 0x0062], NFC: [0x0061, 0x0334, 0x0334, 0x16FF0, 0x0062], NFD: [0x0061, 0x0334, 0x0334, 0x16FF0, 0x0062], NFKC: [0x0061, 0x0334, 0x0334, 0x16FF0, 0x0062], NFKD: [0x0061, 0x0334, 0x0334, 0x16FF0, 0x0062] }, +{ source: [0x0061, 0x0334, 0x16FF0, 0x0334, 0x0062], NFC: [0x0061, 0x0334, 0x0334, 0x16FF0, 0x0062], NFD: [0x0061, 0x0334, 0x0334, 0x16FF0, 0x0062], NFKC: [0x0061, 0x0334, 0x0334, 0x16FF0, 0x0062], NFKD: [0x0061, 0x0334, 0x0334, 0x16FF0, 0x0062] }, +{ source: [0x0061, 0x16FF0, 0x0334, 0x0335, 0x0062], NFC: [0x0061, 0x0334, 0x0335, 0x16FF0, 0x0062], NFD: [0x0061, 0x0334, 0x0335, 0x16FF0, 0x0062], NFKC: [0x0061, 0x0334, 0x0335, 0x16FF0, 0x0062], NFKD: [0x0061, 0x0334, 0x0335, 0x16FF0, 0x0062] }, +{ source: [0x0061, 0x0335, 0x16FF0, 0x0334, 0x0062], NFC: [0x0061, 0x0335, 0x0334, 0x16FF0, 0x0062], NFD: [0x0061, 0x0335, 0x0334, 0x16FF0, 0x0062], NFKC: [0x0061, 0x0335, 0x0334, 0x16FF0, 0x0062], NFKD: [0x0061, 0x0335, 0x0334, 0x16FF0, 0x0062] }, +{ source: [0x0061, 0x16FF0, 0x0334, 0x0336, 0x0062], NFC: [0x0061, 0x0334, 0x0336, 0x16FF0, 0x0062], NFD: [0x0061, 0x0334, 0x0336, 0x16FF0, 0x0062], NFKC: [0x0061, 0x0334, 0x0336, 0x16FF0, 0x0062], NFKD: [0x0061, 0x0334, 0x0336, 0x16FF0, 0x0062] }, +{ source: [0x0061, 0x0336, 0x16FF0, 0x0334, 0x0062], NFC: [0x0061, 0x0336, 0x0334, 0x16FF0, 0x0062], NFD: [0x0061, 0x0336, 0x0334, 0x16FF0, 0x0062], NFKC: [0x0061, 0x0336, 0x0334, 0x16FF0, 0x0062], NFKD: [0x0061, 0x0336, 0x0334, 0x16FF0, 0x0062] }, +{ source: [0x0061, 0x16FF0, 0x0334, 0x0337, 0x0062], NFC: [0x0061, 0x0334, 0x0337, 0x16FF0, 0x0062], NFD: [0x0061, 0x0334, 0x0337, 0x16FF0, 0x0062], NFKC: [0x0061, 0x0334, 0x0337, 0x16FF0, 0x0062], NFKD: [0x0061, 0x0334, 0x0337, 0x16FF0, 0x0062] }, +{ source: [0x0061, 0x0337, 0x16FF0, 0x0334, 0x0062], NFC: [0x0061, 0x0337, 0x0334, 0x16FF0, 0x0062], NFD: [0x0061, 0x0337, 0x0334, 0x16FF0, 0x0062], NFKC: [0x0061, 0x0337, 0x0334, 0x16FF0, 0x0062], NFKD: [0x0061, 0x0337, 0x0334, 0x16FF0, 0x0062] }, +{ source: [0x0061, 0x16FF0, 0x0334, 0x0338, 0x0062], NFC: [0x0061, 0x0334, 0x0338, 0x16FF0, 0x0062], NFD: [0x0061, 0x0334, 0x0338, 0x16FF0, 0x0062], NFKC: [0x0061, 0x0334, 0x0338, 0x16FF0, 0x0062], NFKD: [0x0061, 0x0334, 0x0338, 0x16FF0, 0x0062] }, +{ source: [0x0061, 0x0338, 0x16FF0, 0x0334, 0x0062], NFC: [0x0061, 0x0338, 0x0334, 0x16FF0, 0x0062], NFD: [0x0061, 0x0338, 0x0334, 0x16FF0, 0x0062], NFKC: [0x0061, 0x0338, 0x0334, 0x16FF0, 0x0062], NFKD: [0x0061, 0x0338, 0x0334, 0x16FF0, 0x0062] }, +{ source: [0x0061, 0x059A, 0x0316, 0x1DFA, 0x0339, 0x0062], NFC: [0x0061, 0x1DFA, 0x0316, 0x0339, 0x059A, 0x0062], NFD: [0x0061, 0x1DFA, 0x0316, 0x0339, 0x059A, 0x0062], NFKC: [0x0061, 0x1DFA, 0x0316, 0x0339, 0x059A, 0x0062], NFKD: [0x0061, 0x1DFA, 0x0316, 0x0339, 0x059A, 0x0062] }, +{ source: [0x0061, 0x0339, 0x059A, 0x0316, 0x1DFA, 0x0062], NFC: [0x0061, 0x1DFA, 0x0339, 0x0316, 0x059A, 0x0062], NFD: [0x0061, 0x1DFA, 0x0339, 0x0316, 0x059A, 0x0062], NFKC: [0x0061, 0x1DFA, 0x0339, 0x0316, 0x059A, 0x0062], NFKD: [0x0061, 0x1DFA, 0x0339, 0x0316, 0x059A, 0x0062] }, +{ source: [0x0061, 0x059A, 0x0316, 0x1DFA, 0x033A, 0x0062], NFC: [0x0061, 0x1DFA, 0x0316, 0x033A, 0x059A, 0x0062], NFD: [0x0061, 0x1DFA, 0x0316, 0x033A, 0x059A, 0x0062], NFKC: [0x0061, 0x1DFA, 0x0316, 0x033A, 0x059A, 0x0062], NFKD: [0x0061, 0x1DFA, 0x0316, 0x033A, 0x059A, 0x0062] }, +{ source: [0x0061, 0x033A, 0x059A, 0x0316, 0x1DFA, 0x0062], NFC: [0x0061, 0x1DFA, 0x033A, 0x0316, 0x059A, 0x0062], NFD: [0x0061, 0x1DFA, 0x033A, 0x0316, 0x059A, 0x0062], NFKC: [0x0061, 0x1DFA, 0x033A, 0x0316, 0x059A, 0x0062], NFKD: [0x0061, 0x1DFA, 0x033A, 0x0316, 0x059A, 0x0062] }, +{ source: [0x0061, 0x059A, 0x0316, 0x1DFA, 0x033B, 0x0062], NFC: [0x0061, 0x1DFA, 0x0316, 0x033B, 0x059A, 0x0062], NFD: [0x0061, 0x1DFA, 0x0316, 0x033B, 0x059A, 0x0062], NFKC: [0x0061, 0x1DFA, 0x0316, 0x033B, 0x059A, 0x0062], NFKD: [0x0061, 0x1DFA, 0x0316, 0x033B, 0x059A, 0x0062] }, +{ source: [0x0061, 0x033B, 0x059A, 0x0316, 0x1DFA, 0x0062], NFC: [0x0061, 0x1DFA, 0x033B, 0x0316, 0x059A, 0x0062], NFD: [0x0061, 0x1DFA, 0x033B, 0x0316, 0x059A, 0x0062], NFKC: [0x0061, 0x1DFA, 0x033B, 0x0316, 0x059A, 0x0062], NFKD: [0x0061, 0x1DFA, 0x033B, 0x0316, 0x059A, 0x0062] }, +{ source: [0x0061, 0x059A, 0x0316, 0x1DFA, 0x033C, 0x0062], NFC: [0x0061, 0x1DFA, 0x0316, 0x033C, 0x059A, 0x0062], NFD: [0x0061, 0x1DFA, 0x0316, 0x033C, 0x059A, 0x0062], NFKC: [0x0061, 0x1DFA, 0x0316, 0x033C, 0x059A, 0x0062], NFKD: [0x0061, 0x1DFA, 0x0316, 0x033C, 0x059A, 0x0062] }, +{ source: [0x0061, 0x033C, 0x059A, 0x0316, 0x1DFA, 0x0062], NFC: [0x0061, 0x1DFA, 0x033C, 0x0316, 0x059A, 0x0062], NFD: [0x0061, 0x1DFA, 0x033C, 0x0316, 0x059A, 0x0062], NFKC: [0x0061, 0x1DFA, 0x033C, 0x0316, 0x059A, 0x0062], NFKD: [0x0061, 0x1DFA, 0x033C, 0x0316, 0x059A, 0x0062] }, +{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x033D, 0x0062], NFC: [0x00E0, 0x05AE, 0x033D, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x033D, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x033D, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x033D, 0x0315, 0x0062] }, +{ source: [0x0061, 0x033D, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x033D, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x033D, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x033D, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x033D, 0x0300, 0x0315, 0x0062] }, +{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x033E, 0x0062], NFC: [0x00E0, 0x05AE, 0x033E, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x033E, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x033E, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x033E, 0x0315, 0x0062] }, +{ source: [0x0061, 0x033E, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x033E, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x033E, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x033E, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x033E, 0x0300, 0x0315, 0x0062] }, +{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x033F, 0x0062], NFC: [0x00E0, 0x05AE, 0x033F, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x033F, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x033F, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x033F, 0x0315, 0x0062] }, +{ source: [0x0061, 0x033F, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x033F, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x033F, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x033F, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x033F, 0x0300, 0x0315, 0x0062] }, +{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x0340, 0x0062], NFC: [0x00E0, 0x05AE, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x0300, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x0300, 0x0315, 0x0062] }, +{ source: [0x0061, 0x0340, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x00E0, 0x05AE, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x0300, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x0300, 0x0315, 0x0062] }, +{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x0341, 0x0062], NFC: [0x00E0, 0x05AE, 0x0301, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x0301, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x0301, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x0301, 0x0315, 0x0062] }, +{ source: [0x0061, 0x0341, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x00E1, 0x05AE, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0301, 0x0300, 0x0315, 0x0062], NFKC: [0x00E1, 0x05AE, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0301, 0x0300, 0x0315, 0x0062] }, +{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x0342, 0x0062], NFC: [0x00E0, 0x05AE, 0x0342, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x0342, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x0342, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x0342, 0x0315, 0x0062] }, +{ source: [0x0061, 0x0342, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x0342, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0342, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x0342, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0342, 0x0300, 0x0315, 0x0062] }, +{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x0343, 0x0062], NFC: [0x00E0, 0x05AE, 0x0313, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x0313, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x0313, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x0313, 0x0315, 0x0062] }, +{ source: [0x0061, 0x0343, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x0313, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0313, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x0313, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0313, 0x0300, 0x0315, 0x0062] }, +{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x0344, 0x0062], NFC: [0x00E0, 0x05AE, 0x0308, 0x0301, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x0308, 0x0301, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x0308, 0x0301, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x0308, 0x0301, 0x0315, 0x0062] }, +{ source: [0x0061, 0x0344, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x00E4, 0x05AE, 0x0301, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0308, 0x0301, 0x0300, 0x0315, 0x0062], NFKC: [0x00E4, 0x05AE, 0x0301, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0308, 0x0301, 0x0300, 0x0315, 0x0062] }, +{ source: [0x0061, 0x0345, 0x035D, 0x0345, 0x0062], NFC: [0x0061, 0x035D, 0x0345, 0x0345, 0x0062], NFD: [0x0061, 0x035D, 0x0345, 0x0345, 0x0062], NFKC: [0x0061, 0x035D, 0x0345, 0x0345, 0x0062], NFKD: [0x0061, 0x035D, 0x0345, 0x0345, 0x0062] }, +{ source: [0x0061, 0x0345, 0x0345, 0x035D, 0x0062], NFC: [0x0061, 0x035D, 0x0345, 0x0345, 0x0062], NFD: [0x0061, 0x035D, 0x0345, 0x0345, 0x0062], NFKC: [0x0061, 0x035D, 0x0345, 0x0345, 0x0062], NFKD: [0x0061, 0x035D, 0x0345, 0x0345, 0x0062] }, +{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x0346, 0x0062], NFC: [0x00E0, 0x05AE, 0x0346, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x0346, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x0346, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x0346, 0x0315, 0x0062] }, +{ source: [0x0061, 0x0346, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x0346, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0346, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x0346, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0346, 0x0300, 0x0315, 0x0062] }, +{ source: [0x0061, 0x059A, 0x0316, 0x1DFA, 0x0347, 0x0062], NFC: [0x0061, 0x1DFA, 0x0316, 0x0347, 0x059A, 0x0062], NFD: [0x0061, 0x1DFA, 0x0316, 0x0347, 0x059A, 0x0062], NFKC: [0x0061, 0x1DFA, 0x0316, 0x0347, 0x059A, 0x0062], NFKD: [0x0061, 0x1DFA, 0x0316, 0x0347, 0x059A, 0x0062] }, +{ source: [0x0061, 0x0347, 0x059A, 0x0316, 0x1DFA, 0x0062], NFC: [0x0061, 0x1DFA, 0x0347, 0x0316, 0x059A, 0x0062], NFD: [0x0061, 0x1DFA, 0x0347, 0x0316, 0x059A, 0x0062], NFKC: [0x0061, 0x1DFA, 0x0347, 0x0316, 0x059A, 0x0062], NFKD: [0x0061, 0x1DFA, 0x0347, 0x0316, 0x059A, 0x0062] }, +{ source: [0x0061, 0x059A, 0x0316, 0x1DFA, 0x0348, 0x0062], NFC: [0x0061, 0x1DFA, 0x0316, 0x0348, 0x059A, 0x0062], NFD: [0x0061, 0x1DFA, 0x0316, 0x0348, 0x059A, 0x0062], NFKC: [0x0061, 0x1DFA, 0x0316, 0x0348, 0x059A, 0x0062], NFKD: [0x0061, 0x1DFA, 0x0316, 0x0348, 0x059A, 0x0062] }, +{ source: [0x0061, 0x0348, 0x059A, 0x0316, 0x1DFA, 0x0062], NFC: [0x0061, 0x1DFA, 0x0348, 0x0316, 0x059A, 0x0062], NFD: [0x0061, 0x1DFA, 0x0348, 0x0316, 0x059A, 0x0062], NFKC: [0x0061, 0x1DFA, 0x0348, 0x0316, 0x059A, 0x0062], NFKD: [0x0061, 0x1DFA, 0x0348, 0x0316, 0x059A, 0x0062] }, +{ source: [0x0061, 0x059A, 0x0316, 0x1DFA, 0x0349, 0x0062], NFC: [0x0061, 0x1DFA, 0x0316, 0x0349, 0x059A, 0x0062], NFD: [0x0061, 0x1DFA, 0x0316, 0x0349, 0x059A, 0x0062], NFKC: [0x0061, 0x1DFA, 0x0316, 0x0349, 0x059A, 0x0062], NFKD: [0x0061, 0x1DFA, 0x0316, 0x0349, 0x059A, 0x0062] }, +{ source: [0x0061, 0x0349, 0x059A, 0x0316, 0x1DFA, 0x0062], NFC: [0x0061, 0x1DFA, 0x0349, 0x0316, 0x059A, 0x0062], NFD: [0x0061, 0x1DFA, 0x0349, 0x0316, 0x059A, 0x0062], NFKC: [0x0061, 0x1DFA, 0x0349, 0x0316, 0x059A, 0x0062], NFKD: [0x0061, 0x1DFA, 0x0349, 0x0316, 0x059A, 0x0062] }, +{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x034A, 0x0062], NFC: [0x00E0, 0x05AE, 0x034A, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x034A, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x034A, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x034A, 0x0315, 0x0062] }, +{ source: [0x0061, 0x034A, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x034A, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x034A, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x034A, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x034A, 0x0300, 0x0315, 0x0062] }, +{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x034B, 0x0062], NFC: [0x00E0, 0x05AE, 0x034B, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x034B, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x034B, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x034B, 0x0315, 0x0062] }, +{ source: [0x0061, 0x034B, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x034B, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x034B, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x034B, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x034B, 0x0300, 0x0315, 0x0062] }, +{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x034C, 0x0062], NFC: [0x00E0, 0x05AE, 0x034C, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x034C, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x034C, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x034C, 0x0315, 0x0062] }, +{ source: [0x0061, 0x034C, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x034C, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x034C, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x034C, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x034C, 0x0300, 0x0315, 0x0062] }, +{ source: [0x0061, 0x059A, 0x0316, 0x1DFA, 0x034D, 0x0062], NFC: [0x0061, 0x1DFA, 0x0316, 0x034D, 0x059A, 0x0062], NFD: [0x0061, 0x1DFA, 0x0316, 0x034D, 0x059A, 0x0062], NFKC: [0x0061, 0x1DFA, 0x0316, 0x034D, 0x059A, 0x0062], NFKD: [0x0061, 0x1DFA, 0x0316, 0x034D, 0x059A, 0x0062] }, +{ source: [0x0061, 0x034D, 0x059A, 0x0316, 0x1DFA, 0x0062], NFC: [0x0061, 0x1DFA, 0x034D, 0x0316, 0x059A, 0x0062], NFD: [0x0061, 0x1DFA, 0x034D, 0x0316, 0x059A, 0x0062], NFKC: [0x0061, 0x1DFA, 0x034D, 0x0316, 0x059A, 0x0062], NFKD: [0x0061, 0x1DFA, 0x034D, 0x0316, 0x059A, 0x0062] }, +{ source: [0x0061, 0x059A, 0x0316, 0x1DFA, 0x034E, 0x0062], NFC: [0x0061, 0x1DFA, 0x0316, 0x034E, 0x059A, 0x0062], NFD: [0x0061, 0x1DFA, 0x0316, 0x034E, 0x059A, 0x0062], NFKC: [0x0061, 0x1DFA, 0x0316, 0x034E, 0x059A, 0x0062], NFKD: [0x0061, 0x1DFA, 0x0316, 0x034E, 0x059A, 0x0062] }, +{ source: [0x0061, 0x034E, 0x059A, 0x0316, 0x1DFA, 0x0062], NFC: [0x0061, 0x1DFA, 0x034E, 0x0316, 0x059A, 0x0062], NFD: [0x0061, 0x1DFA, 0x034E, 0x0316, 0x059A, 0x0062], NFKC: [0x0061, 0x1DFA, 0x034E, 0x0316, 0x059A, 0x0062], NFKD: [0x0061, 0x1DFA, 0x034E, 0x0316, 0x059A, 0x0062] }, +{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x0350, 0x0062], NFC: [0x00E0, 0x05AE, 0x0350, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x0350, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x0350, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x0350, 0x0315, 0x0062] }, +{ source: [0x0061, 0x0350, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x0350, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0350, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x0350, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0350, 0x0300, 0x0315, 0x0062] }, +{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x0351, 0x0062], NFC: [0x00E0, 0x05AE, 0x0351, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x0351, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x0351, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x0351, 0x0315, 0x0062] }, +{ source: [0x0061, 0x0351, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x0351, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0351, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x0351, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0351, 0x0300, 0x0315, 0x0062] }, +{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x0352, 0x0062], NFC: [0x00E0, 0x05AE, 0x0352, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x0352, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x0352, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x0352, 0x0315, 0x0062] }, +{ source: [0x0061, 0x0352, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x0352, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0352, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x0352, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0352, 0x0300, 0x0315, 0x0062] }, +{ source: [0x0061, 0x059A, 0x0316, 0x1DFA, 0x0353, 0x0062], NFC: [0x0061, 0x1DFA, 0x0316, 0x0353, 0x059A, 0x0062], NFD: [0x0061, 0x1DFA, 0x0316, 0x0353, 0x059A, 0x0062], NFKC: [0x0061, 0x1DFA, 0x0316, 0x0353, 0x059A, 0x0062], NFKD: [0x0061, 0x1DFA, 0x0316, 0x0353, 0x059A, 0x0062] }, +{ source: [0x0061, 0x0353, 0x059A, 0x0316, 0x1DFA, 0x0062], NFC: [0x0061, 0x1DFA, 0x0353, 0x0316, 0x059A, 0x0062], NFD: [0x0061, 0x1DFA, 0x0353, 0x0316, 0x059A, 0x0062], NFKC: [0x0061, 0x1DFA, 0x0353, 0x0316, 0x059A, 0x0062], NFKD: [0x0061, 0x1DFA, 0x0353, 0x0316, 0x059A, 0x0062] }, +{ source: [0x0061, 0x059A, 0x0316, 0x1DFA, 0x0354, 0x0062], NFC: [0x0061, 0x1DFA, 0x0316, 0x0354, 0x059A, 0x0062], NFD: [0x0061, 0x1DFA, 0x0316, 0x0354, 0x059A, 0x0062], NFKC: [0x0061, 0x1DFA, 0x0316, 0x0354, 0x059A, 0x0062], NFKD: [0x0061, 0x1DFA, 0x0316, 0x0354, 0x059A, 0x0062] }, +{ source: [0x0061, 0x0354, 0x059A, 0x0316, 0x1DFA, 0x0062], NFC: [0x0061, 0x1DFA, 0x0354, 0x0316, 0x059A, 0x0062], NFD: [0x0061, 0x1DFA, 0x0354, 0x0316, 0x059A, 0x0062], NFKC: [0x0061, 0x1DFA, 0x0354, 0x0316, 0x059A, 0x0062], NFKD: [0x0061, 0x1DFA, 0x0354, 0x0316, 0x059A, 0x0062] }, +{ source: [0x0061, 0x059A, 0x0316, 0x1DFA, 0x0355, 0x0062], NFC: [0x0061, 0x1DFA, 0x0316, 0x0355, 0x059A, 0x0062], NFD: [0x0061, 0x1DFA, 0x0316, 0x0355, 0x059A, 0x0062], NFKC: [0x0061, 0x1DFA, 0x0316, 0x0355, 0x059A, 0x0062], NFKD: [0x0061, 0x1DFA, 0x0316, 0x0355, 0x059A, 0x0062] }, +{ source: [0x0061, 0x0355, 0x059A, 0x0316, 0x1DFA, 0x0062], NFC: [0x0061, 0x1DFA, 0x0355, 0x0316, 0x059A, 0x0062], NFD: [0x0061, 0x1DFA, 0x0355, 0x0316, 0x059A, 0x0062], NFKC: [0x0061, 0x1DFA, 0x0355, 0x0316, 0x059A, 0x0062], NFKD: [0x0061, 0x1DFA, 0x0355, 0x0316, 0x059A, 0x0062] }, +{ source: [0x0061, 0x059A, 0x0316, 0x1DFA, 0x0356, 0x0062], NFC: [0x0061, 0x1DFA, 0x0316, 0x0356, 0x059A, 0x0062], NFD: [0x0061, 0x1DFA, 0x0316, 0x0356, 0x059A, 0x0062], NFKC: [0x0061, 0x1DFA, 0x0316, 0x0356, 0x059A, 0x0062], NFKD: [0x0061, 0x1DFA, 0x0316, 0x0356, 0x059A, 0x0062] }, +{ source: [0x0061, 0x0356, 0x059A, 0x0316, 0x1DFA, 0x0062], NFC: [0x0061, 0x1DFA, 0x0356, 0x0316, 0x059A, 0x0062], NFD: [0x0061, 0x1DFA, 0x0356, 0x0316, 0x059A, 0x0062], NFKC: [0x0061, 0x1DFA, 0x0356, 0x0316, 0x059A, 0x0062], NFKD: [0x0061, 0x1DFA, 0x0356, 0x0316, 0x059A, 0x0062] }, +{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x0357, 0x0062], NFC: [0x00E0, 0x05AE, 0x0357, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x0357, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x0357, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x0357, 0x0315, 0x0062] }, +{ source: [0x0061, 0x0357, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x0357, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0357, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x0357, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0357, 0x0300, 0x0315, 0x0062] }, +{ source: [0x0061, 0x035C, 0x0315, 0x0300, 0x0358, 0x0062], NFC: [0x00E0, 0x0315, 0x0358, 0x035C, 0x0062], NFD: [0x0061, 0x0300, 0x0315, 0x0358, 0x035C, 0x0062], NFKC: [0x00E0, 0x0315, 0x0358, 0x035C, 0x0062], NFKD: [0x0061, 0x0300, 0x0315, 0x0358, 0x035C, 0x0062] }, +{ source: [0x0061, 0x0358, 0x035C, 0x0315, 0x0300, 0x0062], NFC: [0x00E0, 0x0358, 0x0315, 0x035C, 0x0062], NFD: [0x0061, 0x0300, 0x0358, 0x0315, 0x035C, 0x0062], NFKC: [0x00E0, 0x0358, 0x0315, 0x035C, 0x0062], NFKD: [0x0061, 0x0300, 0x0358, 0x0315, 0x035C, 0x0062] }, +{ source: [0x0061, 0x059A, 0x0316, 0x1DFA, 0x0359, 0x0062], NFC: [0x0061, 0x1DFA, 0x0316, 0x0359, 0x059A, 0x0062], NFD: [0x0061, 0x1DFA, 0x0316, 0x0359, 0x059A, 0x0062], NFKC: [0x0061, 0x1DFA, 0x0316, 0x0359, 0x059A, 0x0062], NFKD: [0x0061, 0x1DFA, 0x0316, 0x0359, 0x059A, 0x0062] }, +{ source: [0x0061, 0x0359, 0x059A, 0x0316, 0x1DFA, 0x0062], NFC: [0x0061, 0x1DFA, 0x0359, 0x0316, 0x059A, 0x0062], NFD: [0x0061, 0x1DFA, 0x0359, 0x0316, 0x059A, 0x0062], NFKC: [0x0061, 0x1DFA, 0x0359, 0x0316, 0x059A, 0x0062], NFKD: [0x0061, 0x1DFA, 0x0359, 0x0316, 0x059A, 0x0062] }, +{ source: [0x0061, 0x059A, 0x0316, 0x1DFA, 0x035A, 0x0062], NFC: [0x0061, 0x1DFA, 0x0316, 0x035A, 0x059A, 0x0062], NFD: [0x0061, 0x1DFA, 0x0316, 0x035A, 0x059A, 0x0062], NFKC: [0x0061, 0x1DFA, 0x0316, 0x035A, 0x059A, 0x0062], NFKD: [0x0061, 0x1DFA, 0x0316, 0x035A, 0x059A, 0x0062] }, +{ source: [0x0061, 0x035A, 0x059A, 0x0316, 0x1DFA, 0x0062], NFC: [0x0061, 0x1DFA, 0x035A, 0x0316, 0x059A, 0x0062], NFD: [0x0061, 0x1DFA, 0x035A, 0x0316, 0x059A, 0x0062], NFKC: [0x0061, 0x1DFA, 0x035A, 0x0316, 0x059A, 0x0062], NFKD: [0x0061, 0x1DFA, 0x035A, 0x0316, 0x059A, 0x0062] }, +{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x035B, 0x0062], NFC: [0x00E0, 0x05AE, 0x035B, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x035B, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x035B, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x035B, 0x0315, 0x0062] }, +{ source: [0x0061, 0x035B, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x035B, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x035B, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x035B, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x035B, 0x0300, 0x0315, 0x0062] }, +{ source: [0x0061, 0x035D, 0x035C, 0x0315, 0x035C, 0x0062], NFC: [0x0061, 0x0315, 0x035C, 0x035C, 0x035D, 0x0062], NFD: [0x0061, 0x0315, 0x035C, 0x035C, 0x035D, 0x0062], NFKC: [0x0061, 0x0315, 0x035C, 0x035C, 0x035D, 0x0062], NFKD: [0x0061, 0x0315, 0x035C, 0x035C, 0x035D, 0x0062] }, +{ source: [0x0061, 0x035C, 0x035D, 0x035C, 0x0315, 0x0062], NFC: [0x0061, 0x0315, 0x035C, 0x035C, 0x035D, 0x0062], NFD: [0x0061, 0x0315, 0x035C, 0x035C, 0x035D, 0x0062], NFKC: [0x0061, 0x0315, 0x035C, 0x035C, 0x035D, 0x0062], NFKD: [0x0061, 0x0315, 0x035C, 0x035C, 0x035D, 0x0062] }, +{ source: [0x0061, 0x0345, 0x035D, 0x035C, 0x035D, 0x0062], NFC: [0x0061, 0x035C, 0x035D, 0x035D, 0x0345, 0x0062], NFD: [0x0061, 0x035C, 0x035D, 0x035D, 0x0345, 0x0062], NFKC: [0x0061, 0x035C, 0x035D, 0x035D, 0x0345, 0x0062], NFKD: [0x0061, 0x035C, 0x035D, 0x035D, 0x0345, 0x0062] }, +{ source: [0x0061, 0x035D, 0x0345, 0x035D, 0x035C, 0x0062], NFC: [0x0061, 0x035C, 0x035D, 0x035D, 0x0345, 0x0062], NFD: [0x0061, 0x035C, 0x035D, 0x035D, 0x0345, 0x0062], NFKC: [0x0061, 0x035C, 0x035D, 0x035D, 0x0345, 0x0062], NFKD: [0x0061, 0x035C, 0x035D, 0x035D, 0x0345, 0x0062] }, +{ source: [0x0061, 0x0345, 0x035D, 0x035C, 0x035E, 0x0062], NFC: [0x0061, 0x035C, 0x035D, 0x035E, 0x0345, 0x0062], NFD: [0x0061, 0x035C, 0x035D, 0x035E, 0x0345, 0x0062], NFKC: [0x0061, 0x035C, 0x035D, 0x035E, 0x0345, 0x0062], NFKD: [0x0061, 0x035C, 0x035D, 0x035E, 0x0345, 0x0062] }, +{ source: [0x0061, 0x035E, 0x0345, 0x035D, 0x035C, 0x0062], NFC: [0x0061, 0x035C, 0x035E, 0x035D, 0x0345, 0x0062], NFD: [0x0061, 0x035C, 0x035E, 0x035D, 0x0345, 0x0062], NFKC: [0x0061, 0x035C, 0x035E, 0x035D, 0x0345, 0x0062], NFKD: [0x0061, 0x035C, 0x035E, 0x035D, 0x0345, 0x0062] }, +{ source: [0x0061, 0x035D, 0x035C, 0x0315, 0x035F, 0x0062], NFC: [0x0061, 0x0315, 0x035C, 0x035F, 0x035D, 0x0062], NFD: [0x0061, 0x0315, 0x035C, 0x035F, 0x035D, 0x0062], NFKC: [0x0061, 0x0315, 0x035C, 0x035F, 0x035D, 0x0062], NFKD: [0x0061, 0x0315, 0x035C, 0x035F, 0x035D, 0x0062] }, +{ source: [0x0061, 0x035F, 0x035D, 0x035C, 0x0315, 0x0062], NFC: [0x0061, 0x0315, 0x035F, 0x035C, 0x035D, 0x0062], NFD: [0x0061, 0x0315, 0x035F, 0x035C, 0x035D, 0x0062], NFKC: [0x0061, 0x0315, 0x035F, 0x035C, 0x035D, 0x0062], NFKD: [0x0061, 0x0315, 0x035F, 0x035C, 0x035D, 0x0062] }, +{ source: [0x0061, 0x0345, 0x035D, 0x035C, 0x0360, 0x0062], NFC: [0x0061, 0x035C, 0x035D, 0x0360, 0x0345, 0x0062], NFD: [0x0061, 0x035C, 0x035D, 0x0360, 0x0345, 0x0062], NFKC: [0x0061, 0x035C, 0x035D, 0x0360, 0x0345, 0x0062], NFKD: [0x0061, 0x035C, 0x035D, 0x0360, 0x0345, 0x0062] }, +{ source: [0x0061, 0x0360, 0x0345, 0x035D, 0x035C, 0x0062], NFC: [0x0061, 0x035C, 0x0360, 0x035D, 0x0345, 0x0062], NFD: [0x0061, 0x035C, 0x0360, 0x035D, 0x0345, 0x0062], NFKC: [0x0061, 0x035C, 0x0360, 0x035D, 0x0345, 0x0062], NFKD: [0x0061, 0x035C, 0x0360, 0x035D, 0x0345, 0x0062] }, +{ source: [0x0061, 0x0345, 0x035D, 0x035C, 0x0361, 0x0062], NFC: [0x0061, 0x035C, 0x035D, 0x0361, 0x0345, 0x0062], NFD: [0x0061, 0x035C, 0x035D, 0x0361, 0x0345, 0x0062], NFKC: [0x0061, 0x035C, 0x035D, 0x0361, 0x0345, 0x0062], NFKD: [0x0061, 0x035C, 0x035D, 0x0361, 0x0345, 0x0062] }, +{ source: [0x0061, 0x0361, 0x0345, 0x035D, 0x035C, 0x0062], NFC: [0x0061, 0x035C, 0x0361, 0x035D, 0x0345, 0x0062], NFD: [0x0061, 0x035C, 0x0361, 0x035D, 0x0345, 0x0062], NFKC: [0x0061, 0x035C, 0x0361, 0x035D, 0x0345, 0x0062], NFKD: [0x0061, 0x035C, 0x0361, 0x035D, 0x0345, 0x0062] }, +{ source: [0x0061, 0x035D, 0x035C, 0x0315, 0x0362, 0x0062], NFC: [0x0061, 0x0315, 0x035C, 0x0362, 0x035D, 0x0062], NFD: [0x0061, 0x0315, 0x035C, 0x0362, 0x035D, 0x0062], NFKC: [0x0061, 0x0315, 0x035C, 0x0362, 0x035D, 0x0062], NFKD: [0x0061, 0x0315, 0x035C, 0x0362, 0x035D, 0x0062] }, +{ source: [0x0061, 0x0362, 0x035D, 0x035C, 0x0315, 0x0062], NFC: [0x0061, 0x0315, 0x0362, 0x035C, 0x035D, 0x0062], NFD: [0x0061, 0x0315, 0x0362, 0x035C, 0x035D, 0x0062], NFKC: [0x0061, 0x0315, 0x0362, 0x035C, 0x035D, 0x0062], NFKD: [0x0061, 0x0315, 0x0362, 0x035C, 0x035D, 0x0062] }, +{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x0363, 0x0062], NFC: [0x00E0, 0x05AE, 0x0363, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x0363, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x0363, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x0363, 0x0315, 0x0062] }, +{ source: [0x0061, 0x0363, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x0363, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0363, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x0363, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0363, 0x0300, 0x0315, 0x0062] }, +{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x0364, 0x0062], NFC: [0x00E0, 0x05AE, 0x0364, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x0364, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x0364, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x0364, 0x0315, 0x0062] }, +{ source: [0x0061, 0x0364, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x0364, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0364, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x0364, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0364, 0x0300, 0x0315, 0x0062] }, +{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x0365, 0x0062], NFC: [0x00E0, 0x05AE, 0x0365, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x0365, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x0365, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x0365, 0x0315, 0x0062] }, +{ source: [0x0061, 0x0365, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x0365, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0365, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x0365, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0365, 0x0300, 0x0315, 0x0062] }, +{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x0366, 0x0062], NFC: [0x00E0, 0x05AE, 0x0366, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x0366, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x0366, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x0366, 0x0315, 0x0062] }, +{ source: [0x0061, 0x0366, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x0366, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0366, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x0366, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0366, 0x0300, 0x0315, 0x0062] }, +{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x0367, 0x0062], NFC: [0x00E0, 0x05AE, 0x0367, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x0367, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x0367, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x0367, 0x0315, 0x0062] }, +{ source: [0x0061, 0x0367, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x0367, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0367, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x0367, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0367, 0x0300, 0x0315, 0x0062] }, +{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x0368, 0x0062], NFC: [0x00E0, 0x05AE, 0x0368, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x0368, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x0368, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x0368, 0x0315, 0x0062] }, +{ source: [0x0061, 0x0368, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x0368, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0368, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x0368, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0368, 0x0300, 0x0315, 0x0062] }, +{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x0369, 0x0062], NFC: [0x00E0, 0x05AE, 0x0369, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x0369, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x0369, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x0369, 0x0315, 0x0062] }, +{ source: [0x0061, 0x0369, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x0369, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0369, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x0369, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0369, 0x0300, 0x0315, 0x0062] }, +{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x036A, 0x0062], NFC: [0x00E0, 0x05AE, 0x036A, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x036A, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x036A, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x036A, 0x0315, 0x0062] }, +{ source: [0x0061, 0x036A, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x036A, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x036A, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x036A, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x036A, 0x0300, 0x0315, 0x0062] }, +{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x036B, 0x0062], NFC: [0x00E0, 0x05AE, 0x036B, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x036B, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x036B, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x036B, 0x0315, 0x0062] }, +{ source: [0x0061, 0x036B, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x036B, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x036B, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x036B, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x036B, 0x0300, 0x0315, 0x0062] }, +{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x036C, 0x0062], NFC: [0x00E0, 0x05AE, 0x036C, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x036C, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x036C, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x036C, 0x0315, 0x0062] }, +{ source: [0x0061, 0x036C, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x036C, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x036C, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x036C, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x036C, 0x0300, 0x0315, 0x0062] }, +{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x036D, 0x0062], NFC: [0x00E0, 0x05AE, 0x036D, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x036D, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x036D, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x036D, 0x0315, 0x0062] }, +{ source: [0x0061, 0x036D, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x036D, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x036D, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x036D, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x036D, 0x0300, 0x0315, 0x0062] }, +{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x036E, 0x0062], NFC: [0x00E0, 0x05AE, 0x036E, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x036E, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x036E, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x036E, 0x0315, 0x0062] }, +{ source: [0x0061, 0x036E, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x036E, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x036E, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x036E, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x036E, 0x0300, 0x0315, 0x0062] }, +{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x036F, 0x0062], NFC: [0x00E0, 0x05AE, 0x036F, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x036F, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x036F, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x036F, 0x0315, 0x0062] }, +{ source: [0x0061, 0x036F, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x036F, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x036F, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x036F, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x036F, 0x0300, 0x0315, 0x0062] }, +{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x0483, 0x0062], NFC: [0x00E0, 0x05AE, 0x0483, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x0483, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x0483, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x0483, 0x0315, 0x0062] }, +{ source: [0x0061, 0x0483, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x0483, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0483, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x0483, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0483, 0x0300, 0x0315, 0x0062] }, +{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x0484, 0x0062], NFC: [0x00E0, 0x05AE, 0x0484, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x0484, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x0484, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x0484, 0x0315, 0x0062] }, +{ source: [0x0061, 0x0484, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x0484, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0484, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x0484, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0484, 0x0300, 0x0315, 0x0062] }, +{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x0485, 0x0062], NFC: [0x00E0, 0x05AE, 0x0485, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x0485, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x0485, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x0485, 0x0315, 0x0062] }, +{ source: [0x0061, 0x0485, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x0485, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0485, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x0485, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0485, 0x0300, 0x0315, 0x0062] }, +{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x0486, 0x0062], NFC: [0x00E0, 0x05AE, 0x0486, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x0486, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x0486, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x0486, 0x0315, 0x0062] }, +{ source: [0x0061, 0x0486, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x0486, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0486, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x0486, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0486, 0x0300, 0x0315, 0x0062] }, +{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x0487, 0x0062], NFC: [0x00E0, 0x05AE, 0x0487, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x0487, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x0487, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x0487, 0x0315, 0x0062] }, +{ source: [0x0061, 0x0487, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x0487, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0487, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x0487, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0487, 0x0300, 0x0315, 0x0062] }, +{ source: [0x0061, 0x059A, 0x0316, 0x1DFA, 0x0591, 0x0062], NFC: [0x0061, 0x1DFA, 0x0316, 0x0591, 0x059A, 0x0062], NFD: [0x0061, 0x1DFA, 0x0316, 0x0591, 0x059A, 0x0062], NFKC: [0x0061, 0x1DFA, 0x0316, 0x0591, 0x059A, 0x0062], NFKD: [0x0061, 0x1DFA, 0x0316, 0x0591, 0x059A, 0x0062] }, +{ source: [0x0061, 0x0591, 0x059A, 0x0316, 0x1DFA, 0x0062], NFC: [0x0061, 0x1DFA, 0x0591, 0x0316, 0x059A, 0x0062], NFD: [0x0061, 0x1DFA, 0x0591, 0x0316, 0x059A, 0x0062], NFKC: [0x0061, 0x1DFA, 0x0591, 0x0316, 0x059A, 0x0062], NFKD: [0x0061, 0x1DFA, 0x0591, 0x0316, 0x059A, 0x0062] }, +{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x0592, 0x0062], NFC: [0x00E0, 0x05AE, 0x0592, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x0592, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x0592, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x0592, 0x0315, 0x0062] }, +{ source: [0x0061, 0x0592, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x0592, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0592, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x0592, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0592, 0x0300, 0x0315, 0x0062] }, +{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x0593, 0x0062], NFC: [0x00E0, 0x05AE, 0x0593, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x0593, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x0593, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x0593, 0x0315, 0x0062] }, +{ source: [0x0061, 0x0593, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x0593, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0593, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x0593, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0593, 0x0300, 0x0315, 0x0062] }, +{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x0594, 0x0062], NFC: [0x00E0, 0x05AE, 0x0594, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x0594, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x0594, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x0594, 0x0315, 0x0062] }, +{ source: [0x0061, 0x0594, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x0594, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0594, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x0594, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0594, 0x0300, 0x0315, 0x0062] }, +{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x0595, 0x0062], NFC: [0x00E0, 0x05AE, 0x0595, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x0595, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x0595, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x0595, 0x0315, 0x0062] }, +{ source: [0x0061, 0x0595, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x0595, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0595, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x0595, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0595, 0x0300, 0x0315, 0x0062] }, +{ source: [0x0061, 0x059A, 0x0316, 0x1DFA, 0x0596, 0x0062], NFC: [0x0061, 0x1DFA, 0x0316, 0x0596, 0x059A, 0x0062], NFD: [0x0061, 0x1DFA, 0x0316, 0x0596, 0x059A, 0x0062], NFKC: [0x0061, 0x1DFA, 0x0316, 0x0596, 0x059A, 0x0062], NFKD: [0x0061, 0x1DFA, 0x0316, 0x0596, 0x059A, 0x0062] }, +{ source: [0x0061, 0x0596, 0x059A, 0x0316, 0x1DFA, 0x0062], NFC: [0x0061, 0x1DFA, 0x0596, 0x0316, 0x059A, 0x0062], NFD: [0x0061, 0x1DFA, 0x0596, 0x0316, 0x059A, 0x0062], NFKC: [0x0061, 0x1DFA, 0x0596, 0x0316, 0x059A, 0x0062], NFKD: [0x0061, 0x1DFA, 0x0596, 0x0316, 0x059A, 0x0062] }, +{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x0597, 0x0062], NFC: [0x00E0, 0x05AE, 0x0597, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x0597, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x0597, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x0597, 0x0315, 0x0062] }, +{ source: [0x0061, 0x0597, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x0597, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0597, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x0597, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0597, 0x0300, 0x0315, 0x0062] }, +{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x0598, 0x0062], NFC: [0x00E0, 0x05AE, 0x0598, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x0598, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x0598, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x0598, 0x0315, 0x0062] }, +{ source: [0x0061, 0x0598, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x0598, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0598, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x0598, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0598, 0x0300, 0x0315, 0x0062] }, +{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x0599, 0x0062], NFC: [0x00E0, 0x05AE, 0x0599, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x0599, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x0599, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x0599, 0x0315, 0x0062] }, +{ source: [0x0061, 0x0599, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x0599, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0599, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x0599, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0599, 0x0300, 0x0315, 0x0062] }, +{ source: [0x0061, 0x302E, 0x059A, 0x0316, 0x059A, 0x0062], NFC: [0x0061, 0x0316, 0x059A, 0x059A, 0x302E, 0x0062], NFD: [0x0061, 0x0316, 0x059A, 0x059A, 0x302E, 0x0062], NFKC: [0x0061, 0x0316, 0x059A, 0x059A, 0x302E, 0x0062], NFKD: [0x0061, 0x0316, 0x059A, 0x059A, 0x302E, 0x0062] }, +{ source: [0x0061, 0x059A, 0x302E, 0x059A, 0x0316, 0x0062], NFC: [0x0061, 0x0316, 0x059A, 0x059A, 0x302E, 0x0062], NFD: [0x0061, 0x0316, 0x059A, 0x059A, 0x302E, 0x0062], NFKC: [0x0061, 0x0316, 0x059A, 0x059A, 0x302E, 0x0062], NFKD: [0x0061, 0x0316, 0x059A, 0x059A, 0x302E, 0x0062] }, +{ source: [0x0061, 0x059A, 0x0316, 0x1DFA, 0x059B, 0x0062], NFC: [0x0061, 0x1DFA, 0x0316, 0x059B, 0x059A, 0x0062], NFD: [0x0061, 0x1DFA, 0x0316, 0x059B, 0x059A, 0x0062], NFKC: [0x0061, 0x1DFA, 0x0316, 0x059B, 0x059A, 0x0062], NFKD: [0x0061, 0x1DFA, 0x0316, 0x059B, 0x059A, 0x0062] }, +{ source: [0x0061, 0x059B, 0x059A, 0x0316, 0x1DFA, 0x0062], NFC: [0x0061, 0x1DFA, 0x059B, 0x0316, 0x059A, 0x0062], NFD: [0x0061, 0x1DFA, 0x059B, 0x0316, 0x059A, 0x0062], NFKC: [0x0061, 0x1DFA, 0x059B, 0x0316, 0x059A, 0x0062], NFKD: [0x0061, 0x1DFA, 0x059B, 0x0316, 0x059A, 0x0062] }, +{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x059C, 0x0062], NFC: [0x00E0, 0x05AE, 0x059C, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x059C, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x059C, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x059C, 0x0315, 0x0062] }, +{ source: [0x0061, 0x059C, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x059C, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x059C, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x059C, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x059C, 0x0300, 0x0315, 0x0062] }, +{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x059D, 0x0062], NFC: [0x00E0, 0x05AE, 0x059D, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x059D, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x059D, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x059D, 0x0315, 0x0062] }, +{ source: [0x0061, 0x059D, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x059D, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x059D, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x059D, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x059D, 0x0300, 0x0315, 0x0062] }, +{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x059E, 0x0062], NFC: [0x00E0, 0x05AE, 0x059E, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x059E, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x059E, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x059E, 0x0315, 0x0062] }, +{ source: [0x0061, 0x059E, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x059E, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x059E, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x059E, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x059E, 0x0300, 0x0315, 0x0062] }, +{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x059F, 0x0062], NFC: [0x00E0, 0x05AE, 0x059F, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x059F, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x059F, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x059F, 0x0315, 0x0062] }, +{ source: [0x0061, 0x059F, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x059F, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x059F, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x059F, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x059F, 0x0300, 0x0315, 0x0062] }, +{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x05A0, 0x0062], NFC: [0x00E0, 0x05AE, 0x05A0, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x05A0, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x05A0, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x05A0, 0x0315, 0x0062] }, +{ source: [0x0061, 0x05A0, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x05A0, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x05A0, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x05A0, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x05A0, 0x0300, 0x0315, 0x0062] }, +{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x05A1, 0x0062], NFC: [0x00E0, 0x05AE, 0x05A1, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x05A1, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x05A1, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x05A1, 0x0315, 0x0062] }, +{ source: [0x0061, 0x05A1, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x05A1, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x05A1, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x05A1, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x05A1, 0x0300, 0x0315, 0x0062] }, +{ source: [0x0061, 0x059A, 0x0316, 0x1DFA, 0x05A2, 0x0062], NFC: [0x0061, 0x1DFA, 0x0316, 0x05A2, 0x059A, 0x0062], NFD: [0x0061, 0x1DFA, 0x0316, 0x05A2, 0x059A, 0x0062], NFKC: [0x0061, 0x1DFA, 0x0316, 0x05A2, 0x059A, 0x0062], NFKD: [0x0061, 0x1DFA, 0x0316, 0x05A2, 0x059A, 0x0062] }, +{ source: [0x0061, 0x05A2, 0x059A, 0x0316, 0x1DFA, 0x0062], NFC: [0x0061, 0x1DFA, 0x05A2, 0x0316, 0x059A, 0x0062], NFD: [0x0061, 0x1DFA, 0x05A2, 0x0316, 0x059A, 0x0062], NFKC: [0x0061, 0x1DFA, 0x05A2, 0x0316, 0x059A, 0x0062], NFKD: [0x0061, 0x1DFA, 0x05A2, 0x0316, 0x059A, 0x0062] }, +{ source: [0x0061, 0x059A, 0x0316, 0x1DFA, 0x05A3, 0x0062], NFC: [0x0061, 0x1DFA, 0x0316, 0x05A3, 0x059A, 0x0062], NFD: [0x0061, 0x1DFA, 0x0316, 0x05A3, 0x059A, 0x0062], NFKC: [0x0061, 0x1DFA, 0x0316, 0x05A3, 0x059A, 0x0062], NFKD: [0x0061, 0x1DFA, 0x0316, 0x05A3, 0x059A, 0x0062] }, +{ source: [0x0061, 0x05A3, 0x059A, 0x0316, 0x1DFA, 0x0062], NFC: [0x0061, 0x1DFA, 0x05A3, 0x0316, 0x059A, 0x0062], NFD: [0x0061, 0x1DFA, 0x05A3, 0x0316, 0x059A, 0x0062], NFKC: [0x0061, 0x1DFA, 0x05A3, 0x0316, 0x059A, 0x0062], NFKD: [0x0061, 0x1DFA, 0x05A3, 0x0316, 0x059A, 0x0062] }, +{ source: [0x0061, 0x059A, 0x0316, 0x1DFA, 0x05A4, 0x0062], NFC: [0x0061, 0x1DFA, 0x0316, 0x05A4, 0x059A, 0x0062], NFD: [0x0061, 0x1DFA, 0x0316, 0x05A4, 0x059A, 0x0062], NFKC: [0x0061, 0x1DFA, 0x0316, 0x05A4, 0x059A, 0x0062], NFKD: [0x0061, 0x1DFA, 0x0316, 0x05A4, 0x059A, 0x0062] }, +{ source: [0x0061, 0x05A4, 0x059A, 0x0316, 0x1DFA, 0x0062], NFC: [0x0061, 0x1DFA, 0x05A4, 0x0316, 0x059A, 0x0062], NFD: [0x0061, 0x1DFA, 0x05A4, 0x0316, 0x059A, 0x0062], NFKC: [0x0061, 0x1DFA, 0x05A4, 0x0316, 0x059A, 0x0062], NFKD: [0x0061, 0x1DFA, 0x05A4, 0x0316, 0x059A, 0x0062] }, +{ source: [0x0061, 0x059A, 0x0316, 0x1DFA, 0x05A5, 0x0062], NFC: [0x0061, 0x1DFA, 0x0316, 0x05A5, 0x059A, 0x0062], NFD: [0x0061, 0x1DFA, 0x0316, 0x05A5, 0x059A, 0x0062], NFKC: [0x0061, 0x1DFA, 0x0316, 0x05A5, 0x059A, 0x0062], NFKD: [0x0061, 0x1DFA, 0x0316, 0x05A5, 0x059A, 0x0062] }, +{ source: [0x0061, 0x05A5, 0x059A, 0x0316, 0x1DFA, 0x0062], NFC: [0x0061, 0x1DFA, 0x05A5, 0x0316, 0x059A, 0x0062], NFD: [0x0061, 0x1DFA, 0x05A5, 0x0316, 0x059A, 0x0062], NFKC: [0x0061, 0x1DFA, 0x05A5, 0x0316, 0x059A, 0x0062], NFKD: [0x0061, 0x1DFA, 0x05A5, 0x0316, 0x059A, 0x0062] }, +{ source: [0x0061, 0x059A, 0x0316, 0x1DFA, 0x05A6, 0x0062], NFC: [0x0061, 0x1DFA, 0x0316, 0x05A6, 0x059A, 0x0062], NFD: [0x0061, 0x1DFA, 0x0316, 0x05A6, 0x059A, 0x0062], NFKC: [0x0061, 0x1DFA, 0x0316, 0x05A6, 0x059A, 0x0062], NFKD: [0x0061, 0x1DFA, 0x0316, 0x05A6, 0x059A, 0x0062] }, +{ source: [0x0061, 0x05A6, 0x059A, 0x0316, 0x1DFA, 0x0062], NFC: [0x0061, 0x1DFA, 0x05A6, 0x0316, 0x059A, 0x0062], NFD: [0x0061, 0x1DFA, 0x05A6, 0x0316, 0x059A, 0x0062], NFKC: [0x0061, 0x1DFA, 0x05A6, 0x0316, 0x059A, 0x0062], NFKD: [0x0061, 0x1DFA, 0x05A6, 0x0316, 0x059A, 0x0062] }, +{ source: [0x0061, 0x059A, 0x0316, 0x1DFA, 0x05A7, 0x0062], NFC: [0x0061, 0x1DFA, 0x0316, 0x05A7, 0x059A, 0x0062], NFD: [0x0061, 0x1DFA, 0x0316, 0x05A7, 0x059A, 0x0062], NFKC: [0x0061, 0x1DFA, 0x0316, 0x05A7, 0x059A, 0x0062], NFKD: [0x0061, 0x1DFA, 0x0316, 0x05A7, 0x059A, 0x0062] }, +{ source: [0x0061, 0x05A7, 0x059A, 0x0316, 0x1DFA, 0x0062], NFC: [0x0061, 0x1DFA, 0x05A7, 0x0316, 0x059A, 0x0062], NFD: [0x0061, 0x1DFA, 0x05A7, 0x0316, 0x059A, 0x0062], NFKC: [0x0061, 0x1DFA, 0x05A7, 0x0316, 0x059A, 0x0062], NFKD: [0x0061, 0x1DFA, 0x05A7, 0x0316, 0x059A, 0x0062] }, +{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x05A8, 0x0062], NFC: [0x00E0, 0x05AE, 0x05A8, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x05A8, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x05A8, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x05A8, 0x0315, 0x0062] }, +{ source: [0x0061, 0x05A8, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x05A8, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x05A8, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x05A8, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x05A8, 0x0300, 0x0315, 0x0062] }, +{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x05A9, 0x0062], NFC: [0x00E0, 0x05AE, 0x05A9, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x05A9, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x05A9, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x05A9, 0x0315, 0x0062] }, +{ source: [0x0061, 0x05A9, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x05A9, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x05A9, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x05A9, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x05A9, 0x0300, 0x0315, 0x0062] }, +{ source: [0x0061, 0x059A, 0x0316, 0x1DFA, 0x05AA, 0x0062], NFC: [0x0061, 0x1DFA, 0x0316, 0x05AA, 0x059A, 0x0062], NFD: [0x0061, 0x1DFA, 0x0316, 0x05AA, 0x059A, 0x0062], NFKC: [0x0061, 0x1DFA, 0x0316, 0x05AA, 0x059A, 0x0062], NFKD: [0x0061, 0x1DFA, 0x0316, 0x05AA, 0x059A, 0x0062] }, +{ source: [0x0061, 0x05AA, 0x059A, 0x0316, 0x1DFA, 0x0062], NFC: [0x0061, 0x1DFA, 0x05AA, 0x0316, 0x059A, 0x0062], NFD: [0x0061, 0x1DFA, 0x05AA, 0x0316, 0x059A, 0x0062], NFKC: [0x0061, 0x1DFA, 0x05AA, 0x0316, 0x059A, 0x0062], NFKD: [0x0061, 0x1DFA, 0x05AA, 0x0316, 0x059A, 0x0062] }, +{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x05AB, 0x0062], NFC: [0x00E0, 0x05AE, 0x05AB, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x05AB, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x05AB, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x05AB, 0x0315, 0x0062] }, +{ source: [0x0061, 0x05AB, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x05AB, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x05AB, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x05AB, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x05AB, 0x0300, 0x0315, 0x0062] }, +{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x05AC, 0x0062], NFC: [0x00E0, 0x05AE, 0x05AC, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x05AC, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x05AC, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x05AC, 0x0315, 0x0062] }, +{ source: [0x0061, 0x05AC, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x05AC, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x05AC, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x05AC, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x05AC, 0x0300, 0x0315, 0x0062] }, +{ source: [0x0061, 0x302E, 0x059A, 0x0316, 0x05AD, 0x0062], NFC: [0x0061, 0x0316, 0x059A, 0x05AD, 0x302E, 0x0062], NFD: [0x0061, 0x0316, 0x059A, 0x05AD, 0x302E, 0x0062], NFKC: [0x0061, 0x0316, 0x059A, 0x05AD, 0x302E, 0x0062], NFKD: [0x0061, 0x0316, 0x059A, 0x05AD, 0x302E, 0x0062] }, +{ source: [0x0061, 0x05AD, 0x302E, 0x059A, 0x0316, 0x0062], NFC: [0x0061, 0x0316, 0x05AD, 0x059A, 0x302E, 0x0062], NFD: [0x0061, 0x0316, 0x05AD, 0x059A, 0x302E, 0x0062], NFKC: [0x0061, 0x0316, 0x05AD, 0x059A, 0x302E, 0x0062], NFKD: [0x0061, 0x0316, 0x05AD, 0x059A, 0x302E, 0x0062] }, +{ source: [0x0061, 0x0300, 0x05AE, 0x1D16D, 0x05AE, 0x0062], NFC: [0x00E0, 0x1D16D, 0x05AE, 0x05AE, 0x0062], NFD: [0x0061, 0x1D16D, 0x05AE, 0x05AE, 0x0300, 0x0062], NFKC: [0x00E0, 0x1D16D, 0x05AE, 0x05AE, 0x0062], NFKD: [0x0061, 0x1D16D, 0x05AE, 0x05AE, 0x0300, 0x0062] }, +{ source: [0x0061, 0x05AE, 0x0300, 0x05AE, 0x1D16D, 0x0062], NFC: [0x00E0, 0x1D16D, 0x05AE, 0x05AE, 0x0062], NFD: [0x0061, 0x1D16D, 0x05AE, 0x05AE, 0x0300, 0x0062], NFKC: [0x00E0, 0x1D16D, 0x05AE, 0x05AE, 0x0062], NFKD: [0x0061, 0x1D16D, 0x05AE, 0x05AE, 0x0300, 0x0062] }, +{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x05AF, 0x0062], NFC: [0x00E0, 0x05AE, 0x05AF, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x05AF, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x05AF, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x05AF, 0x0315, 0x0062] }, +{ source: [0x0061, 0x05AF, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x05AF, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x05AF, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x05AF, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x05AF, 0x0300, 0x0315, 0x0062] }, +{ source: [0x0061, 0x05B1, 0x05B0, 0x094D, 0x05B0, 0x0062], NFC: [0x0061, 0x094D, 0x05B0, 0x05B0, 0x05B1, 0x0062], NFD: [0x0061, 0x094D, 0x05B0, 0x05B0, 0x05B1, 0x0062], NFKC: [0x0061, 0x094D, 0x05B0, 0x05B0, 0x05B1, 0x0062], NFKD: [0x0061, 0x094D, 0x05B0, 0x05B0, 0x05B1, 0x0062] }, +{ source: [0x0061, 0x05B0, 0x05B1, 0x05B0, 0x094D, 0x0062], NFC: [0x0061, 0x094D, 0x05B0, 0x05B0, 0x05B1, 0x0062], NFD: [0x0061, 0x094D, 0x05B0, 0x05B0, 0x05B1, 0x0062], NFKC: [0x0061, 0x094D, 0x05B0, 0x05B0, 0x05B1, 0x0062], NFKD: [0x0061, 0x094D, 0x05B0, 0x05B0, 0x05B1, 0x0062] }, +{ source: [0x0061, 0x05B2, 0x05B1, 0x05B0, 0x05B1, 0x0062], NFC: [0x0061, 0x05B0, 0x05B1, 0x05B1, 0x05B2, 0x0062], NFD: [0x0061, 0x05B0, 0x05B1, 0x05B1, 0x05B2, 0x0062], NFKC: [0x0061, 0x05B0, 0x05B1, 0x05B1, 0x05B2, 0x0062], NFKD: [0x0061, 0x05B0, 0x05B1, 0x05B1, 0x05B2, 0x0062] }, +{ source: [0x0061, 0x05B1, 0x05B2, 0x05B1, 0x05B0, 0x0062], NFC: [0x0061, 0x05B0, 0x05B1, 0x05B1, 0x05B2, 0x0062], NFD: [0x0061, 0x05B0, 0x05B1, 0x05B1, 0x05B2, 0x0062], NFKC: [0x0061, 0x05B0, 0x05B1, 0x05B1, 0x05B2, 0x0062], NFKD: [0x0061, 0x05B0, 0x05B1, 0x05B1, 0x05B2, 0x0062] }, +{ source: [0x0061, 0x05B3, 0x05B2, 0x05B1, 0x05B2, 0x0062], NFC: [0x0061, 0x05B1, 0x05B2, 0x05B2, 0x05B3, 0x0062], NFD: [0x0061, 0x05B1, 0x05B2, 0x05B2, 0x05B3, 0x0062], NFKC: [0x0061, 0x05B1, 0x05B2, 0x05B2, 0x05B3, 0x0062], NFKD: [0x0061, 0x05B1, 0x05B2, 0x05B2, 0x05B3, 0x0062] }, +{ source: [0x0061, 0x05B2, 0x05B3, 0x05B2, 0x05B1, 0x0062], NFC: [0x0061, 0x05B1, 0x05B2, 0x05B2, 0x05B3, 0x0062], NFD: [0x0061, 0x05B1, 0x05B2, 0x05B2, 0x05B3, 0x0062], NFKC: [0x0061, 0x05B1, 0x05B2, 0x05B2, 0x05B3, 0x0062], NFKD: [0x0061, 0x05B1, 0x05B2, 0x05B2, 0x05B3, 0x0062] }, +{ source: [0x0061, 0x05B4, 0x05B3, 0x05B2, 0x05B3, 0x0062], NFC: [0x0061, 0x05B2, 0x05B3, 0x05B3, 0x05B4, 0x0062], NFD: [0x0061, 0x05B2, 0x05B3, 0x05B3, 0x05B4, 0x0062], NFKC: [0x0061, 0x05B2, 0x05B3, 0x05B3, 0x05B4, 0x0062], NFKD: [0x0061, 0x05B2, 0x05B3, 0x05B3, 0x05B4, 0x0062] }, +{ source: [0x0061, 0x05B3, 0x05B4, 0x05B3, 0x05B2, 0x0062], NFC: [0x0061, 0x05B2, 0x05B3, 0x05B3, 0x05B4, 0x0062], NFD: [0x0061, 0x05B2, 0x05B3, 0x05B3, 0x05B4, 0x0062], NFKC: [0x0061, 0x05B2, 0x05B3, 0x05B3, 0x05B4, 0x0062], NFKD: [0x0061, 0x05B2, 0x05B3, 0x05B3, 0x05B4, 0x0062] }, +{ source: [0x0061, 0x05B5, 0x05B4, 0x05B3, 0x05B4, 0x0062], NFC: [0x0061, 0x05B3, 0x05B4, 0x05B4, 0x05B5, 0x0062], NFD: [0x0061, 0x05B3, 0x05B4, 0x05B4, 0x05B5, 0x0062], NFKC: [0x0061, 0x05B3, 0x05B4, 0x05B4, 0x05B5, 0x0062], NFKD: [0x0061, 0x05B3, 0x05B4, 0x05B4, 0x05B5, 0x0062] }, +{ source: [0x0061, 0x05B4, 0x05B5, 0x05B4, 0x05B3, 0x0062], NFC: [0x0061, 0x05B3, 0x05B4, 0x05B4, 0x05B5, 0x0062], NFD: [0x0061, 0x05B3, 0x05B4, 0x05B4, 0x05B5, 0x0062], NFKC: [0x0061, 0x05B3, 0x05B4, 0x05B4, 0x05B5, 0x0062], NFKD: [0x0061, 0x05B3, 0x05B4, 0x05B4, 0x05B5, 0x0062] }, +{ source: [0x0061, 0x05B6, 0x05B5, 0x05B4, 0x05B5, 0x0062], NFC: [0x0061, 0x05B4, 0x05B5, 0x05B5, 0x05B6, 0x0062], NFD: [0x0061, 0x05B4, 0x05B5, 0x05B5, 0x05B6, 0x0062], NFKC: [0x0061, 0x05B4, 0x05B5, 0x05B5, 0x05B6, 0x0062], NFKD: [0x0061, 0x05B4, 0x05B5, 0x05B5, 0x05B6, 0x0062] }, +{ source: [0x0061, 0x05B5, 0x05B6, 0x05B5, 0x05B4, 0x0062], NFC: [0x0061, 0x05B4, 0x05B5, 0x05B5, 0x05B6, 0x0062], NFD: [0x0061, 0x05B4, 0x05B5, 0x05B5, 0x05B6, 0x0062], NFKC: [0x0061, 0x05B4, 0x05B5, 0x05B5, 0x05B6, 0x0062], NFKD: [0x0061, 0x05B4, 0x05B5, 0x05B5, 0x05B6, 0x0062] }, +{ source: [0x0061, 0x05B7, 0x05B6, 0x05B5, 0x05B6, 0x0062], NFC: [0x0061, 0x05B5, 0x05B6, 0x05B6, 0x05B7, 0x0062], NFD: [0x0061, 0x05B5, 0x05B6, 0x05B6, 0x05B7, 0x0062], NFKC: [0x0061, 0x05B5, 0x05B6, 0x05B6, 0x05B7, 0x0062], NFKD: [0x0061, 0x05B5, 0x05B6, 0x05B6, 0x05B7, 0x0062] }, +{ source: [0x0061, 0x05B6, 0x05B7, 0x05B6, 0x05B5, 0x0062], NFC: [0x0061, 0x05B5, 0x05B6, 0x05B6, 0x05B7, 0x0062], NFD: [0x0061, 0x05B5, 0x05B6, 0x05B6, 0x05B7, 0x0062], NFKC: [0x0061, 0x05B5, 0x05B6, 0x05B6, 0x05B7, 0x0062], NFKD: [0x0061, 0x05B5, 0x05B6, 0x05B6, 0x05B7, 0x0062] }, +{ source: [0x0061, 0x05B8, 0x05B7, 0x05B6, 0x05B7, 0x0062], NFC: [0x0061, 0x05B6, 0x05B7, 0x05B7, 0x05B8, 0x0062], NFD: [0x0061, 0x05B6, 0x05B7, 0x05B7, 0x05B8, 0x0062], NFKC: [0x0061, 0x05B6, 0x05B7, 0x05B7, 0x05B8, 0x0062], NFKD: [0x0061, 0x05B6, 0x05B7, 0x05B7, 0x05B8, 0x0062] }, +{ source: [0x0061, 0x05B7, 0x05B8, 0x05B7, 0x05B6, 0x0062], NFC: [0x0061, 0x05B6, 0x05B7, 0x05B7, 0x05B8, 0x0062], NFD: [0x0061, 0x05B6, 0x05B7, 0x05B7, 0x05B8, 0x0062], NFKC: [0x0061, 0x05B6, 0x05B7, 0x05B7, 0x05B8, 0x0062], NFKD: [0x0061, 0x05B6, 0x05B7, 0x05B7, 0x05B8, 0x0062] }, +{ source: [0x0061, 0x05B9, 0x05B8, 0x05B7, 0x05B8, 0x0062], NFC: [0x0061, 0x05B7, 0x05B8, 0x05B8, 0x05B9, 0x0062], NFD: [0x0061, 0x05B7, 0x05B8, 0x05B8, 0x05B9, 0x0062], NFKC: [0x0061, 0x05B7, 0x05B8, 0x05B8, 0x05B9, 0x0062], NFKD: [0x0061, 0x05B7, 0x05B8, 0x05B8, 0x05B9, 0x0062] }, +{ source: [0x0061, 0x05B8, 0x05B9, 0x05B8, 0x05B7, 0x0062], NFC: [0x0061, 0x05B7, 0x05B8, 0x05B8, 0x05B9, 0x0062], NFD: [0x0061, 0x05B7, 0x05B8, 0x05B8, 0x05B9, 0x0062], NFKC: [0x0061, 0x05B7, 0x05B8, 0x05B8, 0x05B9, 0x0062], NFKD: [0x0061, 0x05B7, 0x05B8, 0x05B8, 0x05B9, 0x0062] }, +{ source: [0x0061, 0x05BB, 0x05B9, 0x05B8, 0x05B9, 0x0062], NFC: [0x0061, 0x05B8, 0x05B9, 0x05B9, 0x05BB, 0x0062], NFD: [0x0061, 0x05B8, 0x05B9, 0x05B9, 0x05BB, 0x0062], NFKC: [0x0061, 0x05B8, 0x05B9, 0x05B9, 0x05BB, 0x0062], NFKD: [0x0061, 0x05B8, 0x05B9, 0x05B9, 0x05BB, 0x0062] }, +{ source: [0x0061, 0x05B9, 0x05BB, 0x05B9, 0x05B8, 0x0062], NFC: [0x0061, 0x05B8, 0x05B9, 0x05B9, 0x05BB, 0x0062], NFD: [0x0061, 0x05B8, 0x05B9, 0x05B9, 0x05BB, 0x0062], NFKC: [0x0061, 0x05B8, 0x05B9, 0x05B9, 0x05BB, 0x0062], NFKD: [0x0061, 0x05B8, 0x05B9, 0x05B9, 0x05BB, 0x0062] }, +{ source: [0x0061, 0x05BB, 0x05B9, 0x05B8, 0x05BA, 0x0062], NFC: [0x0061, 0x05B8, 0x05B9, 0x05BA, 0x05BB, 0x0062], NFD: [0x0061, 0x05B8, 0x05B9, 0x05BA, 0x05BB, 0x0062], NFKC: [0x0061, 0x05B8, 0x05B9, 0x05BA, 0x05BB, 0x0062], NFKD: [0x0061, 0x05B8, 0x05B9, 0x05BA, 0x05BB, 0x0062] }, +{ source: [0x0061, 0x05BA, 0x05BB, 0x05B9, 0x05B8, 0x0062], NFC: [0x0061, 0x05B8, 0x05BA, 0x05B9, 0x05BB, 0x0062], NFD: [0x0061, 0x05B8, 0x05BA, 0x05B9, 0x05BB, 0x0062], NFKC: [0x0061, 0x05B8, 0x05BA, 0x05B9, 0x05BB, 0x0062], NFKD: [0x0061, 0x05B8, 0x05BA, 0x05B9, 0x05BB, 0x0062] }, +{ source: [0x0061, 0x05BC, 0x05BB, 0x05B9, 0x05BB, 0x0062], NFC: [0x0061, 0x05B9, 0x05BB, 0x05BB, 0x05BC, 0x0062], NFD: [0x0061, 0x05B9, 0x05BB, 0x05BB, 0x05BC, 0x0062], NFKC: [0x0061, 0x05B9, 0x05BB, 0x05BB, 0x05BC, 0x0062], NFKD: [0x0061, 0x05B9, 0x05BB, 0x05BB, 0x05BC, 0x0062] }, +{ source: [0x0061, 0x05BB, 0x05BC, 0x05BB, 0x05B9, 0x0062], NFC: [0x0061, 0x05B9, 0x05BB, 0x05BB, 0x05BC, 0x0062], NFD: [0x0061, 0x05B9, 0x05BB, 0x05BB, 0x05BC, 0x0062], NFKC: [0x0061, 0x05B9, 0x05BB, 0x05BB, 0x05BC, 0x0062], NFKD: [0x0061, 0x05B9, 0x05BB, 0x05BB, 0x05BC, 0x0062] }, +{ source: [0x0061, 0x05BD, 0x05BC, 0x05BB, 0x05BC, 0x0062], NFC: [0x0061, 0x05BB, 0x05BC, 0x05BC, 0x05BD, 0x0062], NFD: [0x0061, 0x05BB, 0x05BC, 0x05BC, 0x05BD, 0x0062], NFKC: [0x0061, 0x05BB, 0x05BC, 0x05BC, 0x05BD, 0x0062], NFKD: [0x0061, 0x05BB, 0x05BC, 0x05BC, 0x05BD, 0x0062] }, +{ source: [0x0061, 0x05BC, 0x05BD, 0x05BC, 0x05BB, 0x0062], NFC: [0x0061, 0x05BB, 0x05BC, 0x05BC, 0x05BD, 0x0062], NFD: [0x0061, 0x05BB, 0x05BC, 0x05BC, 0x05BD, 0x0062], NFKC: [0x0061, 0x05BB, 0x05BC, 0x05BC, 0x05BD, 0x0062], NFKD: [0x0061, 0x05BB, 0x05BC, 0x05BC, 0x05BD, 0x0062] }, +{ source: [0x0061, 0x05BF, 0x05BD, 0x05BC, 0x05BD, 0x0062], NFC: [0x0061, 0x05BC, 0x05BD, 0x05BD, 0x05BF, 0x0062], NFD: [0x0061, 0x05BC, 0x05BD, 0x05BD, 0x05BF, 0x0062], NFKC: [0x0061, 0x05BC, 0x05BD, 0x05BD, 0x05BF, 0x0062], NFKD: [0x0061, 0x05BC, 0x05BD, 0x05BD, 0x05BF, 0x0062] }, +{ source: [0x0061, 0x05BD, 0x05BF, 0x05BD, 0x05BC, 0x0062], NFC: [0x0061, 0x05BC, 0x05BD, 0x05BD, 0x05BF, 0x0062], NFD: [0x0061, 0x05BC, 0x05BD, 0x05BD, 0x05BF, 0x0062], NFKC: [0x0061, 0x05BC, 0x05BD, 0x05BD, 0x05BF, 0x0062], NFKD: [0x0061, 0x05BC, 0x05BD, 0x05BD, 0x05BF, 0x0062] }, +{ source: [0x0061, 0x05C1, 0x05BF, 0x05BD, 0x05BF, 0x0062], NFC: [0x0061, 0x05BD, 0x05BF, 0x05BF, 0x05C1, 0x0062], NFD: [0x0061, 0x05BD, 0x05BF, 0x05BF, 0x05C1, 0x0062], NFKC: [0x0061, 0x05BD, 0x05BF, 0x05BF, 0x05C1, 0x0062], NFKD: [0x0061, 0x05BD, 0x05BF, 0x05BF, 0x05C1, 0x0062] }, +{ source: [0x0061, 0x05BF, 0x05C1, 0x05BF, 0x05BD, 0x0062], NFC: [0x0061, 0x05BD, 0x05BF, 0x05BF, 0x05C1, 0x0062], NFD: [0x0061, 0x05BD, 0x05BF, 0x05BF, 0x05C1, 0x0062], NFKC: [0x0061, 0x05BD, 0x05BF, 0x05BF, 0x05C1, 0x0062], NFKD: [0x0061, 0x05BD, 0x05BF, 0x05BF, 0x05C1, 0x0062] }, +{ source: [0x0061, 0x05C2, 0x05C1, 0x05BF, 0x05C1, 0x0062], NFC: [0x0061, 0x05BF, 0x05C1, 0x05C1, 0x05C2, 0x0062], NFD: [0x0061, 0x05BF, 0x05C1, 0x05C1, 0x05C2, 0x0062], NFKC: [0x0061, 0x05BF, 0x05C1, 0x05C1, 0x05C2, 0x0062], NFKD: [0x0061, 0x05BF, 0x05C1, 0x05C1, 0x05C2, 0x0062] }, +{ source: [0x0061, 0x05C1, 0x05C2, 0x05C1, 0x05BF, 0x0062], NFC: [0x0061, 0x05BF, 0x05C1, 0x05C1, 0x05C2, 0x0062], NFD: [0x0061, 0x05BF, 0x05C1, 0x05C1, 0x05C2, 0x0062], NFKC: [0x0061, 0x05BF, 0x05C1, 0x05C1, 0x05C2, 0x0062], NFKD: [0x0061, 0x05BF, 0x05C1, 0x05C1, 0x05C2, 0x0062] }, +{ source: [0x0061, 0xFB1E, 0x05C2, 0x05C1, 0x05C2, 0x0062], NFC: [0x0061, 0x05C1, 0x05C2, 0x05C2, 0xFB1E, 0x0062], NFD: [0x0061, 0x05C1, 0x05C2, 0x05C2, 0xFB1E, 0x0062], NFKC: [0x0061, 0x05C1, 0x05C2, 0x05C2, 0xFB1E, 0x0062], NFKD: [0x0061, 0x05C1, 0x05C2, 0x05C2, 0xFB1E, 0x0062] }, +{ source: [0x0061, 0x05C2, 0xFB1E, 0x05C2, 0x05C1, 0x0062], NFC: [0x0061, 0x05C1, 0x05C2, 0x05C2, 0xFB1E, 0x0062], NFD: [0x0061, 0x05C1, 0x05C2, 0x05C2, 0xFB1E, 0x0062], NFKC: [0x0061, 0x05C1, 0x05C2, 0x05C2, 0xFB1E, 0x0062], NFKD: [0x0061, 0x05C1, 0x05C2, 0x05C2, 0xFB1E, 0x0062] }, +{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x05C4, 0x0062], NFC: [0x00E0, 0x05AE, 0x05C4, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x05C4, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x05C4, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x05C4, 0x0315, 0x0062] }, +{ source: [0x0061, 0x05C4, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x05C4, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x05C4, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x05C4, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x05C4, 0x0300, 0x0315, 0x0062] }, +{ source: [0x0061, 0x059A, 0x0316, 0x1DFA, 0x05C5, 0x0062], NFC: [0x0061, 0x1DFA, 0x0316, 0x05C5, 0x059A, 0x0062], NFD: [0x0061, 0x1DFA, 0x0316, 0x05C5, 0x059A, 0x0062], NFKC: [0x0061, 0x1DFA, 0x0316, 0x05C5, 0x059A, 0x0062], NFKD: [0x0061, 0x1DFA, 0x0316, 0x05C5, 0x059A, 0x0062] }, +{ source: [0x0061, 0x05C5, 0x059A, 0x0316, 0x1DFA, 0x0062], NFC: [0x0061, 0x1DFA, 0x05C5, 0x0316, 0x059A, 0x0062], NFD: [0x0061, 0x1DFA, 0x05C5, 0x0316, 0x059A, 0x0062], NFKC: [0x0061, 0x1DFA, 0x05C5, 0x0316, 0x059A, 0x0062], NFKD: [0x0061, 0x1DFA, 0x05C5, 0x0316, 0x059A, 0x0062] }, +{ source: [0x0061, 0x05B9, 0x05B8, 0x05B7, 0x05C7, 0x0062], NFC: [0x0061, 0x05B7, 0x05B8, 0x05C7, 0x05B9, 0x0062], NFD: [0x0061, 0x05B7, 0x05B8, 0x05C7, 0x05B9, 0x0062], NFKC: [0x0061, 0x05B7, 0x05B8, 0x05C7, 0x05B9, 0x0062], NFKD: [0x0061, 0x05B7, 0x05B8, 0x05C7, 0x05B9, 0x0062] }, +{ source: [0x0061, 0x05C7, 0x05B9, 0x05B8, 0x05B7, 0x0062], NFC: [0x0061, 0x05B7, 0x05C7, 0x05B8, 0x05B9, 0x0062], NFD: [0x0061, 0x05B7, 0x05C7, 0x05B8, 0x05B9, 0x0062], NFKC: [0x0061, 0x05B7, 0x05C7, 0x05B8, 0x05B9, 0x0062], NFKD: [0x0061, 0x05B7, 0x05C7, 0x05B8, 0x05B9, 0x0062] }, +{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x0610, 0x0062], NFC: [0x00E0, 0x05AE, 0x0610, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x0610, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x0610, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x0610, 0x0315, 0x0062] }, +{ source: [0x0061, 0x0610, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x0610, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0610, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x0610, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0610, 0x0300, 0x0315, 0x0062] }, +{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x0611, 0x0062], NFC: [0x00E0, 0x05AE, 0x0611, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x0611, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x0611, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x0611, 0x0315, 0x0062] }, +{ source: [0x0061, 0x0611, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x0611, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0611, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x0611, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0611, 0x0300, 0x0315, 0x0062] }, +{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x0612, 0x0062], NFC: [0x00E0, 0x05AE, 0x0612, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x0612, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x0612, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x0612, 0x0315, 0x0062] }, +{ source: [0x0061, 0x0612, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x0612, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0612, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x0612, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0612, 0x0300, 0x0315, 0x0062] }, +{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x0613, 0x0062], NFC: [0x00E0, 0x05AE, 0x0613, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x0613, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x0613, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x0613, 0x0315, 0x0062] }, +{ source: [0x0061, 0x0613, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x0613, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0613, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x0613, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0613, 0x0300, 0x0315, 0x0062] }, +{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x0614, 0x0062], NFC: [0x00E0, 0x05AE, 0x0614, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x0614, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x0614, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x0614, 0x0315, 0x0062] }, +{ source: [0x0061, 0x0614, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x0614, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0614, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x0614, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0614, 0x0300, 0x0315, 0x0062] }, +{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x0615, 0x0062], NFC: [0x00E0, 0x05AE, 0x0615, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x0615, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x0615, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x0615, 0x0315, 0x0062] }, +{ source: [0x0061, 0x0615, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x0615, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0615, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x0615, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0615, 0x0300, 0x0315, 0x0062] }, +{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x0616, 0x0062], NFC: [0x00E0, 0x05AE, 0x0616, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x0616, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x0616, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x0616, 0x0315, 0x0062] }, +{ source: [0x0061, 0x0616, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x0616, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0616, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x0616, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0616, 0x0300, 0x0315, 0x0062] }, +{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x0617, 0x0062], NFC: [0x00E0, 0x05AE, 0x0617, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x0617, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x0617, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x0617, 0x0315, 0x0062] }, +{ source: [0x0061, 0x0617, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x0617, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0617, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x0617, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0617, 0x0300, 0x0315, 0x0062] }, +{ source: [0x0061, 0x0619, 0x0618, 0x064D, 0x0618, 0x0062], NFC: [0x0061, 0x064D, 0x0618, 0x0618, 0x0619, 0x0062], NFD: [0x0061, 0x064D, 0x0618, 0x0618, 0x0619, 0x0062], NFKC: [0x0061, 0x064D, 0x0618, 0x0618, 0x0619, 0x0062], NFKD: [0x0061, 0x064D, 0x0618, 0x0618, 0x0619, 0x0062] }, +{ source: [0x0061, 0x0618, 0x0619, 0x0618, 0x064D, 0x0062], NFC: [0x0061, 0x064D, 0x0618, 0x0618, 0x0619, 0x0062], NFD: [0x0061, 0x064D, 0x0618, 0x0618, 0x0619, 0x0062], NFKC: [0x0061, 0x064D, 0x0618, 0x0618, 0x0619, 0x0062], NFKD: [0x0061, 0x064D, 0x0618, 0x0618, 0x0619, 0x0062] }, +{ source: [0x0061, 0x061A, 0x0619, 0x0618, 0x0619, 0x0062], NFC: [0x0061, 0x0618, 0x0619, 0x0619, 0x061A, 0x0062], NFD: [0x0061, 0x0618, 0x0619, 0x0619, 0x061A, 0x0062], NFKC: [0x0061, 0x0618, 0x0619, 0x0619, 0x061A, 0x0062], NFKD: [0x0061, 0x0618, 0x0619, 0x0619, 0x061A, 0x0062] }, +{ source: [0x0061, 0x0619, 0x061A, 0x0619, 0x0618, 0x0062], NFC: [0x0061, 0x0618, 0x0619, 0x0619, 0x061A, 0x0062], NFD: [0x0061, 0x0618, 0x0619, 0x0619, 0x061A, 0x0062], NFKC: [0x0061, 0x0618, 0x0619, 0x0619, 0x061A, 0x0062], NFKD: [0x0061, 0x0618, 0x0619, 0x0619, 0x061A, 0x0062] }, +{ source: [0x0061, 0x0651, 0x061A, 0x0619, 0x061A, 0x0062], NFC: [0x0061, 0x0619, 0x061A, 0x061A, 0x0651, 0x0062], NFD: [0x0061, 0x0619, 0x061A, 0x061A, 0x0651, 0x0062], NFKC: [0x0061, 0x0619, 0x061A, 0x061A, 0x0651, 0x0062], NFKD: [0x0061, 0x0619, 0x061A, 0x061A, 0x0651, 0x0062] }, +{ source: [0x0061, 0x061A, 0x0651, 0x061A, 0x0619, 0x0062], NFC: [0x0061, 0x0619, 0x061A, 0x061A, 0x0651, 0x0062], NFD: [0x0061, 0x0619, 0x061A, 0x061A, 0x0651, 0x0062], NFKC: [0x0061, 0x0619, 0x061A, 0x061A, 0x0651, 0x0062], NFKD: [0x0061, 0x0619, 0x061A, 0x061A, 0x0651, 0x0062] }, +{ source: [0x0061, 0x064C, 0x064B, 0xFB1E, 0x064B, 0x0062], NFC: [0x0061, 0xFB1E, 0x064B, 0x064B, 0x064C, 0x0062], NFD: [0x0061, 0xFB1E, 0x064B, 0x064B, 0x064C, 0x0062], NFKC: [0x0061, 0xFB1E, 0x064B, 0x064B, 0x064C, 0x0062], NFKD: [0x0061, 0xFB1E, 0x064B, 0x064B, 0x064C, 0x0062] }, +{ source: [0x0061, 0x064B, 0x064C, 0x064B, 0xFB1E, 0x0062], NFC: [0x0061, 0xFB1E, 0x064B, 0x064B, 0x064C, 0x0062], NFD: [0x0061, 0xFB1E, 0x064B, 0x064B, 0x064C, 0x0062], NFKC: [0x0061, 0xFB1E, 0x064B, 0x064B, 0x064C, 0x0062], NFKD: [0x0061, 0xFB1E, 0x064B, 0x064B, 0x064C, 0x0062] }, +{ source: [0x0061, 0x064D, 0x064C, 0x064B, 0x064C, 0x0062], NFC: [0x0061, 0x064B, 0x064C, 0x064C, 0x064D, 0x0062], NFD: [0x0061, 0x064B, 0x064C, 0x064C, 0x064D, 0x0062], NFKC: [0x0061, 0x064B, 0x064C, 0x064C, 0x064D, 0x0062], NFKD: [0x0061, 0x064B, 0x064C, 0x064C, 0x064D, 0x0062] }, +{ source: [0x0061, 0x064C, 0x064D, 0x064C, 0x064B, 0x0062], NFC: [0x0061, 0x064B, 0x064C, 0x064C, 0x064D, 0x0062], NFD: [0x0061, 0x064B, 0x064C, 0x064C, 0x064D, 0x0062], NFKC: [0x0061, 0x064B, 0x064C, 0x064C, 0x064D, 0x0062], NFKD: [0x0061, 0x064B, 0x064C, 0x064C, 0x064D, 0x0062] }, +{ source: [0x0061, 0x0618, 0x064D, 0x064C, 0x064D, 0x0062], NFC: [0x0061, 0x064C, 0x064D, 0x064D, 0x0618, 0x0062], NFD: [0x0061, 0x064C, 0x064D, 0x064D, 0x0618, 0x0062], NFKC: [0x0061, 0x064C, 0x064D, 0x064D, 0x0618, 0x0062], NFKD: [0x0061, 0x064C, 0x064D, 0x064D, 0x0618, 0x0062] }, +{ source: [0x0061, 0x064D, 0x0618, 0x064D, 0x064C, 0x0062], NFC: [0x0061, 0x064C, 0x064D, 0x064D, 0x0618, 0x0062], NFD: [0x0061, 0x064C, 0x064D, 0x064D, 0x0618, 0x0062], NFKC: [0x0061, 0x064C, 0x064D, 0x064D, 0x0618, 0x0062], NFKD: [0x0061, 0x064C, 0x064D, 0x064D, 0x0618, 0x0062] }, +{ source: [0x0061, 0x0619, 0x0618, 0x064D, 0x064E, 0x0062], NFC: [0x0061, 0x064D, 0x0618, 0x064E, 0x0619, 0x0062], NFD: [0x0061, 0x064D, 0x0618, 0x064E, 0x0619, 0x0062], NFKC: [0x0061, 0x064D, 0x0618, 0x064E, 0x0619, 0x0062], NFKD: [0x0061, 0x064D, 0x0618, 0x064E, 0x0619, 0x0062] }, +{ source: [0x0061, 0x064E, 0x0619, 0x0618, 0x064D, 0x0062], NFC: [0x0061, 0x064D, 0x064E, 0x0618, 0x0619, 0x0062], NFD: [0x0061, 0x064D, 0x064E, 0x0618, 0x0619, 0x0062], NFKC: [0x0061, 0x064D, 0x064E, 0x0618, 0x0619, 0x0062], NFKD: [0x0061, 0x064D, 0x064E, 0x0618, 0x0619, 0x0062] }, +{ source: [0x0061, 0x061A, 0x0619, 0x0618, 0x064F, 0x0062], NFC: [0x0061, 0x0618, 0x0619, 0x064F, 0x061A, 0x0062], NFD: [0x0061, 0x0618, 0x0619, 0x064F, 0x061A, 0x0062], NFKC: [0x0061, 0x0618, 0x0619, 0x064F, 0x061A, 0x0062], NFKD: [0x0061, 0x0618, 0x0619, 0x064F, 0x061A, 0x0062] }, +{ source: [0x0061, 0x064F, 0x061A, 0x0619, 0x0618, 0x0062], NFC: [0x0061, 0x0618, 0x064F, 0x0619, 0x061A, 0x0062], NFD: [0x0061, 0x0618, 0x064F, 0x0619, 0x061A, 0x0062], NFKC: [0x0061, 0x0618, 0x064F, 0x0619, 0x061A, 0x0062], NFKD: [0x0061, 0x0618, 0x064F, 0x0619, 0x061A, 0x0062] }, +{ source: [0x0061, 0x0651, 0x061A, 0x0619, 0x0650, 0x0062], NFC: [0x0061, 0x0619, 0x061A, 0x0650, 0x0651, 0x0062], NFD: [0x0061, 0x0619, 0x061A, 0x0650, 0x0651, 0x0062], NFKC: [0x0061, 0x0619, 0x061A, 0x0650, 0x0651, 0x0062], NFKD: [0x0061, 0x0619, 0x061A, 0x0650, 0x0651, 0x0062] }, +{ source: [0x0061, 0x0650, 0x0651, 0x061A, 0x0619, 0x0062], NFC: [0x0061, 0x0619, 0x0650, 0x061A, 0x0651, 0x0062], NFD: [0x0061, 0x0619, 0x0650, 0x061A, 0x0651, 0x0062], NFKC: [0x0061, 0x0619, 0x0650, 0x061A, 0x0651, 0x0062], NFKD: [0x0061, 0x0619, 0x0650, 0x061A, 0x0651, 0x0062] }, +{ source: [0x0061, 0x0652, 0x0651, 0x061A, 0x0651, 0x0062], NFC: [0x0061, 0x061A, 0x0651, 0x0651, 0x0652, 0x0062], NFD: [0x0061, 0x061A, 0x0651, 0x0651, 0x0652, 0x0062], NFKC: [0x0061, 0x061A, 0x0651, 0x0651, 0x0652, 0x0062], NFKD: [0x0061, 0x061A, 0x0651, 0x0651, 0x0652, 0x0062] }, +{ source: [0x0061, 0x0651, 0x0652, 0x0651, 0x061A, 0x0062], NFC: [0x0061, 0x061A, 0x0651, 0x0651, 0x0652, 0x0062], NFD: [0x0061, 0x061A, 0x0651, 0x0651, 0x0652, 0x0062], NFKC: [0x0061, 0x061A, 0x0651, 0x0651, 0x0652, 0x0062], NFKD: [0x0061, 0x061A, 0x0651, 0x0651, 0x0652, 0x0062] }, +{ source: [0x0061, 0x0670, 0x0652, 0x0651, 0x0652, 0x0062], NFC: [0x0061, 0x0651, 0x0652, 0x0652, 0x0670, 0x0062], NFD: [0x0061, 0x0651, 0x0652, 0x0652, 0x0670, 0x0062], NFKC: [0x0061, 0x0651, 0x0652, 0x0652, 0x0670, 0x0062], NFKD: [0x0061, 0x0651, 0x0652, 0x0652, 0x0670, 0x0062] }, +{ source: [0x0061, 0x0652, 0x0670, 0x0652, 0x0651, 0x0062], NFC: [0x0061, 0x0651, 0x0652, 0x0652, 0x0670, 0x0062], NFD: [0x0061, 0x0651, 0x0652, 0x0652, 0x0670, 0x0062], NFKC: [0x0061, 0x0651, 0x0652, 0x0652, 0x0670, 0x0062], NFKD: [0x0061, 0x0651, 0x0652, 0x0652, 0x0670, 0x0062] }, +{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x0653, 0x0062], NFC: [0x00E0, 0x05AE, 0x0653, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x0653, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x0653, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x0653, 0x0315, 0x0062] }, +{ source: [0x0061, 0x0653, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x0653, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0653, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x0653, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0653, 0x0300, 0x0315, 0x0062] }, +{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x0654, 0x0062], NFC: [0x00E0, 0x05AE, 0x0654, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x0654, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x0654, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x0654, 0x0315, 0x0062] }, +{ source: [0x0061, 0x0654, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x0654, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0654, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x0654, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0654, 0x0300, 0x0315, 0x0062] }, +{ source: [0x0061, 0x059A, 0x0316, 0x1DFA, 0x0655, 0x0062], NFC: [0x0061, 0x1DFA, 0x0316, 0x0655, 0x059A, 0x0062], NFD: [0x0061, 0x1DFA, 0x0316, 0x0655, 0x059A, 0x0062], NFKC: [0x0061, 0x1DFA, 0x0316, 0x0655, 0x059A, 0x0062], NFKD: [0x0061, 0x1DFA, 0x0316, 0x0655, 0x059A, 0x0062] }, +{ source: [0x0061, 0x0655, 0x059A, 0x0316, 0x1DFA, 0x0062], NFC: [0x0061, 0x1DFA, 0x0655, 0x0316, 0x059A, 0x0062], NFD: [0x0061, 0x1DFA, 0x0655, 0x0316, 0x059A, 0x0062], NFKC: [0x0061, 0x1DFA, 0x0655, 0x0316, 0x059A, 0x0062], NFKD: [0x0061, 0x1DFA, 0x0655, 0x0316, 0x059A, 0x0062] }, +{ source: [0x0061, 0x059A, 0x0316, 0x1DFA, 0x0656, 0x0062], NFC: [0x0061, 0x1DFA, 0x0316, 0x0656, 0x059A, 0x0062], NFD: [0x0061, 0x1DFA, 0x0316, 0x0656, 0x059A, 0x0062], NFKC: [0x0061, 0x1DFA, 0x0316, 0x0656, 0x059A, 0x0062], NFKD: [0x0061, 0x1DFA, 0x0316, 0x0656, 0x059A, 0x0062] }, +{ source: [0x0061, 0x0656, 0x059A, 0x0316, 0x1DFA, 0x0062], NFC: [0x0061, 0x1DFA, 0x0656, 0x0316, 0x059A, 0x0062], NFD: [0x0061, 0x1DFA, 0x0656, 0x0316, 0x059A, 0x0062], NFKC: [0x0061, 0x1DFA, 0x0656, 0x0316, 0x059A, 0x0062], NFKD: [0x0061, 0x1DFA, 0x0656, 0x0316, 0x059A, 0x0062] }, +{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x0657, 0x0062], NFC: [0x00E0, 0x05AE, 0x0657, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x0657, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x0657, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x0657, 0x0315, 0x0062] }, +{ source: [0x0061, 0x0657, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x0657, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0657, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x0657, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0657, 0x0300, 0x0315, 0x0062] }, +{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x0658, 0x0062], NFC: [0x00E0, 0x05AE, 0x0658, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x0658, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x0658, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x0658, 0x0315, 0x0062] }, +{ source: [0x0061, 0x0658, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x0658, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0658, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x0658, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0658, 0x0300, 0x0315, 0x0062] }, +{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x0659, 0x0062], NFC: [0x00E0, 0x05AE, 0x0659, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x0659, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x0659, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x0659, 0x0315, 0x0062] }, +{ source: [0x0061, 0x0659, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x0659, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0659, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x0659, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0659, 0x0300, 0x0315, 0x0062] }, +{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x065A, 0x0062], NFC: [0x00E0, 0x05AE, 0x065A, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x065A, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x065A, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x065A, 0x0315, 0x0062] }, +{ source: [0x0061, 0x065A, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x065A, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x065A, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x065A, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x065A, 0x0300, 0x0315, 0x0062] }, +{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x065B, 0x0062], NFC: [0x00E0, 0x05AE, 0x065B, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x065B, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x065B, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x065B, 0x0315, 0x0062] }, +{ source: [0x0061, 0x065B, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x065B, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x065B, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x065B, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x065B, 0x0300, 0x0315, 0x0062] }, +{ source: [0x0061, 0x059A, 0x0316, 0x1DFA, 0x065C, 0x0062], NFC: [0x0061, 0x1DFA, 0x0316, 0x065C, 0x059A, 0x0062], NFD: [0x0061, 0x1DFA, 0x0316, 0x065C, 0x059A, 0x0062], NFKC: [0x0061, 0x1DFA, 0x0316, 0x065C, 0x059A, 0x0062], NFKD: [0x0061, 0x1DFA, 0x0316, 0x065C, 0x059A, 0x0062] }, +{ source: [0x0061, 0x065C, 0x059A, 0x0316, 0x1DFA, 0x0062], NFC: [0x0061, 0x1DFA, 0x065C, 0x0316, 0x059A, 0x0062], NFD: [0x0061, 0x1DFA, 0x065C, 0x0316, 0x059A, 0x0062], NFKC: [0x0061, 0x1DFA, 0x065C, 0x0316, 0x059A, 0x0062], NFKD: [0x0061, 0x1DFA, 0x065C, 0x0316, 0x059A, 0x0062] }, +{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x065D, 0x0062], NFC: [0x00E0, 0x05AE, 0x065D, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x065D, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x065D, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x065D, 0x0315, 0x0062] }, +{ source: [0x0061, 0x065D, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x065D, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x065D, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x065D, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x065D, 0x0300, 0x0315, 0x0062] }, +{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x065E, 0x0062], NFC: [0x00E0, 0x05AE, 0x065E, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x065E, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x065E, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x065E, 0x0315, 0x0062] }, +{ source: [0x0061, 0x065E, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x065E, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x065E, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x065E, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x065E, 0x0300, 0x0315, 0x0062] }, +{ source: [0x0061, 0x059A, 0x0316, 0x1DFA, 0x065F, 0x0062], NFC: [0x0061, 0x1DFA, 0x0316, 0x065F, 0x059A, 0x0062], NFD: [0x0061, 0x1DFA, 0x0316, 0x065F, 0x059A, 0x0062], NFKC: [0x0061, 0x1DFA, 0x0316, 0x065F, 0x059A, 0x0062], NFKD: [0x0061, 0x1DFA, 0x0316, 0x065F, 0x059A, 0x0062] }, +{ source: [0x0061, 0x065F, 0x059A, 0x0316, 0x1DFA, 0x0062], NFC: [0x0061, 0x1DFA, 0x065F, 0x0316, 0x059A, 0x0062], NFD: [0x0061, 0x1DFA, 0x065F, 0x0316, 0x059A, 0x0062], NFKC: [0x0061, 0x1DFA, 0x065F, 0x0316, 0x059A, 0x0062], NFKD: [0x0061, 0x1DFA, 0x065F, 0x0316, 0x059A, 0x0062] }, +{ source: [0x0061, 0x0711, 0x0670, 0x0652, 0x0670, 0x0062], NFC: [0x0061, 0x0652, 0x0670, 0x0670, 0x0711, 0x0062], NFD: [0x0061, 0x0652, 0x0670, 0x0670, 0x0711, 0x0062], NFKC: [0x0061, 0x0652, 0x0670, 0x0670, 0x0711, 0x0062], NFKD: [0x0061, 0x0652, 0x0670, 0x0670, 0x0711, 0x0062] }, +{ source: [0x0061, 0x0670, 0x0711, 0x0670, 0x0652, 0x0062], NFC: [0x0061, 0x0652, 0x0670, 0x0670, 0x0711, 0x0062], NFD: [0x0061, 0x0652, 0x0670, 0x0670, 0x0711, 0x0062], NFKC: [0x0061, 0x0652, 0x0670, 0x0670, 0x0711, 0x0062], NFKD: [0x0061, 0x0652, 0x0670, 0x0670, 0x0711, 0x0062] }, +{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x06D6, 0x0062], NFC: [0x00E0, 0x05AE, 0x06D6, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x06D6, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x06D6, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x06D6, 0x0315, 0x0062] }, +{ source: [0x0061, 0x06D6, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x06D6, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x06D6, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x06D6, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x06D6, 0x0300, 0x0315, 0x0062] }, +{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x06D7, 0x0062], NFC: [0x00E0, 0x05AE, 0x06D7, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x06D7, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x06D7, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x06D7, 0x0315, 0x0062] }, +{ source: [0x0061, 0x06D7, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x06D7, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x06D7, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x06D7, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x06D7, 0x0300, 0x0315, 0x0062] }, +{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x06D8, 0x0062], NFC: [0x00E0, 0x05AE, 0x06D8, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x06D8, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x06D8, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x06D8, 0x0315, 0x0062] }, +{ source: [0x0061, 0x06D8, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x06D8, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x06D8, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x06D8, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x06D8, 0x0300, 0x0315, 0x0062] }, +{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x06D9, 0x0062], NFC: [0x00E0, 0x05AE, 0x06D9, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x06D9, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x06D9, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x06D9, 0x0315, 0x0062] }, +{ source: [0x0061, 0x06D9, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x06D9, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x06D9, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x06D9, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x06D9, 0x0300, 0x0315, 0x0062] }, +{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x06DA, 0x0062], NFC: [0x00E0, 0x05AE, 0x06DA, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x06DA, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x06DA, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x06DA, 0x0315, 0x0062] }, +{ source: [0x0061, 0x06DA, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x06DA, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x06DA, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x06DA, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x06DA, 0x0300, 0x0315, 0x0062] }, +{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x06DB, 0x0062], NFC: [0x00E0, 0x05AE, 0x06DB, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x06DB, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x06DB, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x06DB, 0x0315, 0x0062] }, +{ source: [0x0061, 0x06DB, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x06DB, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x06DB, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x06DB, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x06DB, 0x0300, 0x0315, 0x0062] }, +{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x06DC, 0x0062], NFC: [0x00E0, 0x05AE, 0x06DC, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x06DC, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x06DC, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x06DC, 0x0315, 0x0062] }, +{ source: [0x0061, 0x06DC, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x06DC, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x06DC, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x06DC, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x06DC, 0x0300, 0x0315, 0x0062] }, +{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x06DF, 0x0062], NFC: [0x00E0, 0x05AE, 0x06DF, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x06DF, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x06DF, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x06DF, 0x0315, 0x0062] }, +{ source: [0x0061, 0x06DF, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x06DF, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x06DF, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x06DF, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x06DF, 0x0300, 0x0315, 0x0062] }, +{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x06E0, 0x0062], NFC: [0x00E0, 0x05AE, 0x06E0, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x06E0, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x06E0, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x06E0, 0x0315, 0x0062] }, +{ source: [0x0061, 0x06E0, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x06E0, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x06E0, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x06E0, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x06E0, 0x0300, 0x0315, 0x0062] }, +{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x06E1, 0x0062], NFC: [0x00E0, 0x05AE, 0x06E1, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x06E1, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x06E1, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x06E1, 0x0315, 0x0062] }, +{ source: [0x0061, 0x06E1, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x06E1, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x06E1, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x06E1, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x06E1, 0x0300, 0x0315, 0x0062] }, +{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x06E2, 0x0062], NFC: [0x00E0, 0x05AE, 0x06E2, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x06E2, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x06E2, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x06E2, 0x0315, 0x0062] }, +{ source: [0x0061, 0x06E2, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x06E2, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x06E2, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x06E2, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x06E2, 0x0300, 0x0315, 0x0062] }, +{ source: [0x0061, 0x059A, 0x0316, 0x1DFA, 0x06E3, 0x0062], NFC: [0x0061, 0x1DFA, 0x0316, 0x06E3, 0x059A, 0x0062], NFD: [0x0061, 0x1DFA, 0x0316, 0x06E3, 0x059A, 0x0062], NFKC: [0x0061, 0x1DFA, 0x0316, 0x06E3, 0x059A, 0x0062], NFKD: [0x0061, 0x1DFA, 0x0316, 0x06E3, 0x059A, 0x0062] }, +{ source: [0x0061, 0x06E3, 0x059A, 0x0316, 0x1DFA, 0x0062], NFC: [0x0061, 0x1DFA, 0x06E3, 0x0316, 0x059A, 0x0062], NFD: [0x0061, 0x1DFA, 0x06E3, 0x0316, 0x059A, 0x0062], NFKC: [0x0061, 0x1DFA, 0x06E3, 0x0316, 0x059A, 0x0062], NFKD: [0x0061, 0x1DFA, 0x06E3, 0x0316, 0x059A, 0x0062] }, +{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x06E4, 0x0062], NFC: [0x00E0, 0x05AE, 0x06E4, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x06E4, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x06E4, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x06E4, 0x0315, 0x0062] }, +{ source: [0x0061, 0x06E4, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x06E4, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x06E4, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x06E4, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x06E4, 0x0300, 0x0315, 0x0062] }, +{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x06E7, 0x0062], NFC: [0x00E0, 0x05AE, 0x06E7, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x06E7, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x06E7, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x06E7, 0x0315, 0x0062] }, +{ source: [0x0061, 0x06E7, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x06E7, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x06E7, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x06E7, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x06E7, 0x0300, 0x0315, 0x0062] }, +{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x06E8, 0x0062], NFC: [0x00E0, 0x05AE, 0x06E8, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x06E8, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x06E8, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x06E8, 0x0315, 0x0062] }, +{ source: [0x0061, 0x06E8, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x06E8, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x06E8, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x06E8, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x06E8, 0x0300, 0x0315, 0x0062] }, +{ source: [0x0061, 0x059A, 0x0316, 0x1DFA, 0x06EA, 0x0062], NFC: [0x0061, 0x1DFA, 0x0316, 0x06EA, 0x059A, 0x0062], NFD: [0x0061, 0x1DFA, 0x0316, 0x06EA, 0x059A, 0x0062], NFKC: [0x0061, 0x1DFA, 0x0316, 0x06EA, 0x059A, 0x0062], NFKD: [0x0061, 0x1DFA, 0x0316, 0x06EA, 0x059A, 0x0062] }, +{ source: [0x0061, 0x06EA, 0x059A, 0x0316, 0x1DFA, 0x0062], NFC: [0x0061, 0x1DFA, 0x06EA, 0x0316, 0x059A, 0x0062], NFD: [0x0061, 0x1DFA, 0x06EA, 0x0316, 0x059A, 0x0062], NFKC: [0x0061, 0x1DFA, 0x06EA, 0x0316, 0x059A, 0x0062], NFKD: [0x0061, 0x1DFA, 0x06EA, 0x0316, 0x059A, 0x0062] }, +{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x06EB, 0x0062], NFC: [0x00E0, 0x05AE, 0x06EB, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x06EB, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x06EB, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x06EB, 0x0315, 0x0062] }, +{ source: [0x0061, 0x06EB, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x06EB, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x06EB, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x06EB, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x06EB, 0x0300, 0x0315, 0x0062] }, +{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x06EC, 0x0062], NFC: [0x00E0, 0x05AE, 0x06EC, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x06EC, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x06EC, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x06EC, 0x0315, 0x0062] }, +{ source: [0x0061, 0x06EC, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x06EC, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x06EC, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x06EC, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x06EC, 0x0300, 0x0315, 0x0062] }, +{ source: [0x0061, 0x059A, 0x0316, 0x1DFA, 0x06ED, 0x0062], NFC: [0x0061, 0x1DFA, 0x0316, 0x06ED, 0x059A, 0x0062], NFD: [0x0061, 0x1DFA, 0x0316, 0x06ED, 0x059A, 0x0062], NFKC: [0x0061, 0x1DFA, 0x0316, 0x06ED, 0x059A, 0x0062], NFKD: [0x0061, 0x1DFA, 0x0316, 0x06ED, 0x059A, 0x0062] }, +{ source: [0x0061, 0x06ED, 0x059A, 0x0316, 0x1DFA, 0x0062], NFC: [0x0061, 0x1DFA, 0x06ED, 0x0316, 0x059A, 0x0062], NFD: [0x0061, 0x1DFA, 0x06ED, 0x0316, 0x059A, 0x0062], NFKC: [0x0061, 0x1DFA, 0x06ED, 0x0316, 0x059A, 0x0062], NFKD: [0x0061, 0x1DFA, 0x06ED, 0x0316, 0x059A, 0x0062] }, +{ source: [0x0061, 0x0C55, 0x0711, 0x0670, 0x0711, 0x0062], NFC: [0x0061, 0x0670, 0x0711, 0x0711, 0x0C55, 0x0062], NFD: [0x0061, 0x0670, 0x0711, 0x0711, 0x0C55, 0x0062], NFKC: [0x0061, 0x0670, 0x0711, 0x0711, 0x0C55, 0x0062], NFKD: [0x0061, 0x0670, 0x0711, 0x0711, 0x0C55, 0x0062] }, +{ source: [0x0061, 0x0711, 0x0C55, 0x0711, 0x0670, 0x0062], NFC: [0x0061, 0x0670, 0x0711, 0x0711, 0x0C55, 0x0062], NFD: [0x0061, 0x0670, 0x0711, 0x0711, 0x0C55, 0x0062], NFKC: [0x0061, 0x0670, 0x0711, 0x0711, 0x0C55, 0x0062], NFKD: [0x0061, 0x0670, 0x0711, 0x0711, 0x0C55, 0x0062] }, +{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x0730, 0x0062], NFC: [0x00E0, 0x05AE, 0x0730, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x0730, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x0730, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x0730, 0x0315, 0x0062] }, +{ source: [0x0061, 0x0730, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x0730, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0730, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x0730, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0730, 0x0300, 0x0315, 0x0062] }, +{ source: [0x0061, 0x059A, 0x0316, 0x1DFA, 0x0731, 0x0062], NFC: [0x0061, 0x1DFA, 0x0316, 0x0731, 0x059A, 0x0062], NFD: [0x0061, 0x1DFA, 0x0316, 0x0731, 0x059A, 0x0062], NFKC: [0x0061, 0x1DFA, 0x0316, 0x0731, 0x059A, 0x0062], NFKD: [0x0061, 0x1DFA, 0x0316, 0x0731, 0x059A, 0x0062] }, +{ source: [0x0061, 0x0731, 0x059A, 0x0316, 0x1DFA, 0x0062], NFC: [0x0061, 0x1DFA, 0x0731, 0x0316, 0x059A, 0x0062], NFD: [0x0061, 0x1DFA, 0x0731, 0x0316, 0x059A, 0x0062], NFKC: [0x0061, 0x1DFA, 0x0731, 0x0316, 0x059A, 0x0062], NFKD: [0x0061, 0x1DFA, 0x0731, 0x0316, 0x059A, 0x0062] }, +{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x0732, 0x0062], NFC: [0x00E0, 0x05AE, 0x0732, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x0732, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x0732, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x0732, 0x0315, 0x0062] }, +{ source: [0x0061, 0x0732, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x0732, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0732, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x0732, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0732, 0x0300, 0x0315, 0x0062] }, +{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x0733, 0x0062], NFC: [0x00E0, 0x05AE, 0x0733, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x0733, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x0733, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x0733, 0x0315, 0x0062] }, +{ source: [0x0061, 0x0733, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x0733, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0733, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x0733, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0733, 0x0300, 0x0315, 0x0062] }, +{ source: [0x0061, 0x059A, 0x0316, 0x1DFA, 0x0734, 0x0062], NFC: [0x0061, 0x1DFA, 0x0316, 0x0734, 0x059A, 0x0062], NFD: [0x0061, 0x1DFA, 0x0316, 0x0734, 0x059A, 0x0062], NFKC: [0x0061, 0x1DFA, 0x0316, 0x0734, 0x059A, 0x0062], NFKD: [0x0061, 0x1DFA, 0x0316, 0x0734, 0x059A, 0x0062] }, +{ source: [0x0061, 0x0734, 0x059A, 0x0316, 0x1DFA, 0x0062], NFC: [0x0061, 0x1DFA, 0x0734, 0x0316, 0x059A, 0x0062], NFD: [0x0061, 0x1DFA, 0x0734, 0x0316, 0x059A, 0x0062], NFKC: [0x0061, 0x1DFA, 0x0734, 0x0316, 0x059A, 0x0062], NFKD: [0x0061, 0x1DFA, 0x0734, 0x0316, 0x059A, 0x0062] }, +{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x0735, 0x0062], NFC: [0x00E0, 0x05AE, 0x0735, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x0735, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x0735, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x0735, 0x0315, 0x0062] }, +{ source: [0x0061, 0x0735, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x0735, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0735, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x0735, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0735, 0x0300, 0x0315, 0x0062] }, +{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x0736, 0x0062], NFC: [0x00E0, 0x05AE, 0x0736, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x0736, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x0736, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x0736, 0x0315, 0x0062] }, +{ source: [0x0061, 0x0736, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x0736, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0736, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x0736, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0736, 0x0300, 0x0315, 0x0062] }, +{ source: [0x0061, 0x059A, 0x0316, 0x1DFA, 0x0737, 0x0062], NFC: [0x0061, 0x1DFA, 0x0316, 0x0737, 0x059A, 0x0062], NFD: [0x0061, 0x1DFA, 0x0316, 0x0737, 0x059A, 0x0062], NFKC: [0x0061, 0x1DFA, 0x0316, 0x0737, 0x059A, 0x0062], NFKD: [0x0061, 0x1DFA, 0x0316, 0x0737, 0x059A, 0x0062] }, +{ source: [0x0061, 0x0737, 0x059A, 0x0316, 0x1DFA, 0x0062], NFC: [0x0061, 0x1DFA, 0x0737, 0x0316, 0x059A, 0x0062], NFD: [0x0061, 0x1DFA, 0x0737, 0x0316, 0x059A, 0x0062], NFKC: [0x0061, 0x1DFA, 0x0737, 0x0316, 0x059A, 0x0062], NFKD: [0x0061, 0x1DFA, 0x0737, 0x0316, 0x059A, 0x0062] }, +{ source: [0x0061, 0x059A, 0x0316, 0x1DFA, 0x0738, 0x0062], NFC: [0x0061, 0x1DFA, 0x0316, 0x0738, 0x059A, 0x0062], NFD: [0x0061, 0x1DFA, 0x0316, 0x0738, 0x059A, 0x0062], NFKC: [0x0061, 0x1DFA, 0x0316, 0x0738, 0x059A, 0x0062], NFKD: [0x0061, 0x1DFA, 0x0316, 0x0738, 0x059A, 0x0062] }, +{ source: [0x0061, 0x0738, 0x059A, 0x0316, 0x1DFA, 0x0062], NFC: [0x0061, 0x1DFA, 0x0738, 0x0316, 0x059A, 0x0062], NFD: [0x0061, 0x1DFA, 0x0738, 0x0316, 0x059A, 0x0062], NFKC: [0x0061, 0x1DFA, 0x0738, 0x0316, 0x059A, 0x0062], NFKD: [0x0061, 0x1DFA, 0x0738, 0x0316, 0x059A, 0x0062] }, +{ source: [0x0061, 0x059A, 0x0316, 0x1DFA, 0x0739, 0x0062], NFC: [0x0061, 0x1DFA, 0x0316, 0x0739, 0x059A, 0x0062], NFD: [0x0061, 0x1DFA, 0x0316, 0x0739, 0x059A, 0x0062], NFKC: [0x0061, 0x1DFA, 0x0316, 0x0739, 0x059A, 0x0062], NFKD: [0x0061, 0x1DFA, 0x0316, 0x0739, 0x059A, 0x0062] }, +{ source: [0x0061, 0x0739, 0x059A, 0x0316, 0x1DFA, 0x0062], NFC: [0x0061, 0x1DFA, 0x0739, 0x0316, 0x059A, 0x0062], NFD: [0x0061, 0x1DFA, 0x0739, 0x0316, 0x059A, 0x0062], NFKC: [0x0061, 0x1DFA, 0x0739, 0x0316, 0x059A, 0x0062], NFKD: [0x0061, 0x1DFA, 0x0739, 0x0316, 0x059A, 0x0062] }, +{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x073A, 0x0062], NFC: [0x00E0, 0x05AE, 0x073A, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x073A, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x073A, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x073A, 0x0315, 0x0062] }, +{ source: [0x0061, 0x073A, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x073A, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x073A, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x073A, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x073A, 0x0300, 0x0315, 0x0062] }, +{ source: [0x0061, 0x059A, 0x0316, 0x1DFA, 0x073B, 0x0062], NFC: [0x0061, 0x1DFA, 0x0316, 0x073B, 0x059A, 0x0062], NFD: [0x0061, 0x1DFA, 0x0316, 0x073B, 0x059A, 0x0062], NFKC: [0x0061, 0x1DFA, 0x0316, 0x073B, 0x059A, 0x0062], NFKD: [0x0061, 0x1DFA, 0x0316, 0x073B, 0x059A, 0x0062] }, +{ source: [0x0061, 0x073B, 0x059A, 0x0316, 0x1DFA, 0x0062], NFC: [0x0061, 0x1DFA, 0x073B, 0x0316, 0x059A, 0x0062], NFD: [0x0061, 0x1DFA, 0x073B, 0x0316, 0x059A, 0x0062], NFKC: [0x0061, 0x1DFA, 0x073B, 0x0316, 0x059A, 0x0062], NFKD: [0x0061, 0x1DFA, 0x073B, 0x0316, 0x059A, 0x0062] }, +{ source: [0x0061, 0x059A, 0x0316, 0x1DFA, 0x073C, 0x0062], NFC: [0x0061, 0x1DFA, 0x0316, 0x073C, 0x059A, 0x0062], NFD: [0x0061, 0x1DFA, 0x0316, 0x073C, 0x059A, 0x0062], NFKC: [0x0061, 0x1DFA, 0x0316, 0x073C, 0x059A, 0x0062], NFKD: [0x0061, 0x1DFA, 0x0316, 0x073C, 0x059A, 0x0062] }, +{ source: [0x0061, 0x073C, 0x059A, 0x0316, 0x1DFA, 0x0062], NFC: [0x0061, 0x1DFA, 0x073C, 0x0316, 0x059A, 0x0062], NFD: [0x0061, 0x1DFA, 0x073C, 0x0316, 0x059A, 0x0062], NFKC: [0x0061, 0x1DFA, 0x073C, 0x0316, 0x059A, 0x0062], NFKD: [0x0061, 0x1DFA, 0x073C, 0x0316, 0x059A, 0x0062] }, +{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x073D, 0x0062], NFC: [0x00E0, 0x05AE, 0x073D, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x073D, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x073D, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x073D, 0x0315, 0x0062] }, +{ source: [0x0061, 0x073D, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x073D, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x073D, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x073D, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x073D, 0x0300, 0x0315, 0x0062] }, +{ source: [0x0061, 0x059A, 0x0316, 0x1DFA, 0x073E, 0x0062], NFC: [0x0061, 0x1DFA, 0x0316, 0x073E, 0x059A, 0x0062], NFD: [0x0061, 0x1DFA, 0x0316, 0x073E, 0x059A, 0x0062], NFKC: [0x0061, 0x1DFA, 0x0316, 0x073E, 0x059A, 0x0062], NFKD: [0x0061, 0x1DFA, 0x0316, 0x073E, 0x059A, 0x0062] }, +{ source: [0x0061, 0x073E, 0x059A, 0x0316, 0x1DFA, 0x0062], NFC: [0x0061, 0x1DFA, 0x073E, 0x0316, 0x059A, 0x0062], NFD: [0x0061, 0x1DFA, 0x073E, 0x0316, 0x059A, 0x0062], NFKC: [0x0061, 0x1DFA, 0x073E, 0x0316, 0x059A, 0x0062], NFKD: [0x0061, 0x1DFA, 0x073E, 0x0316, 0x059A, 0x0062] }, +{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x073F, 0x0062], NFC: [0x00E0, 0x05AE, 0x073F, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x073F, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x073F, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x073F, 0x0315, 0x0062] }, +{ source: [0x0061, 0x073F, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x073F, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x073F, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x073F, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x073F, 0x0300, 0x0315, 0x0062] }, +{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x0740, 0x0062], NFC: [0x00E0, 0x05AE, 0x0740, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x0740, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x0740, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x0740, 0x0315, 0x0062] }, +{ source: [0x0061, 0x0740, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x0740, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0740, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x0740, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0740, 0x0300, 0x0315, 0x0062] }, +{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x0741, 0x0062], NFC: [0x00E0, 0x05AE, 0x0741, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x0741, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x0741, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x0741, 0x0315, 0x0062] }, +{ source: [0x0061, 0x0741, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x0741, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0741, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x0741, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0741, 0x0300, 0x0315, 0x0062] }, +{ source: [0x0061, 0x059A, 0x0316, 0x1DFA, 0x0742, 0x0062], NFC: [0x0061, 0x1DFA, 0x0316, 0x0742, 0x059A, 0x0062], NFD: [0x0061, 0x1DFA, 0x0316, 0x0742, 0x059A, 0x0062], NFKC: [0x0061, 0x1DFA, 0x0316, 0x0742, 0x059A, 0x0062], NFKD: [0x0061, 0x1DFA, 0x0316, 0x0742, 0x059A, 0x0062] }, +{ source: [0x0061, 0x0742, 0x059A, 0x0316, 0x1DFA, 0x0062], NFC: [0x0061, 0x1DFA, 0x0742, 0x0316, 0x059A, 0x0062], NFD: [0x0061, 0x1DFA, 0x0742, 0x0316, 0x059A, 0x0062], NFKC: [0x0061, 0x1DFA, 0x0742, 0x0316, 0x059A, 0x0062], NFKD: [0x0061, 0x1DFA, 0x0742, 0x0316, 0x059A, 0x0062] }, +{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x0743, 0x0062], NFC: [0x00E0, 0x05AE, 0x0743, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x0743, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x0743, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x0743, 0x0315, 0x0062] }, +{ source: [0x0061, 0x0743, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x0743, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0743, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x0743, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0743, 0x0300, 0x0315, 0x0062] }, +{ source: [0x0061, 0x059A, 0x0316, 0x1DFA, 0x0744, 0x0062], NFC: [0x0061, 0x1DFA, 0x0316, 0x0744, 0x059A, 0x0062], NFD: [0x0061, 0x1DFA, 0x0316, 0x0744, 0x059A, 0x0062], NFKC: [0x0061, 0x1DFA, 0x0316, 0x0744, 0x059A, 0x0062], NFKD: [0x0061, 0x1DFA, 0x0316, 0x0744, 0x059A, 0x0062] }, +{ source: [0x0061, 0x0744, 0x059A, 0x0316, 0x1DFA, 0x0062], NFC: [0x0061, 0x1DFA, 0x0744, 0x0316, 0x059A, 0x0062], NFD: [0x0061, 0x1DFA, 0x0744, 0x0316, 0x059A, 0x0062], NFKC: [0x0061, 0x1DFA, 0x0744, 0x0316, 0x059A, 0x0062], NFKD: [0x0061, 0x1DFA, 0x0744, 0x0316, 0x059A, 0x0062] }, +{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x0745, 0x0062], NFC: [0x00E0, 0x05AE, 0x0745, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x0745, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x0745, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x0745, 0x0315, 0x0062] }, +{ source: [0x0061, 0x0745, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x0745, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0745, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x0745, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0745, 0x0300, 0x0315, 0x0062] }, +{ source: [0x0061, 0x059A, 0x0316, 0x1DFA, 0x0746, 0x0062], NFC: [0x0061, 0x1DFA, 0x0316, 0x0746, 0x059A, 0x0062], NFD: [0x0061, 0x1DFA, 0x0316, 0x0746, 0x059A, 0x0062], NFKC: [0x0061, 0x1DFA, 0x0316, 0x0746, 0x059A, 0x0062], NFKD: [0x0061, 0x1DFA, 0x0316, 0x0746, 0x059A, 0x0062] }, +{ source: [0x0061, 0x0746, 0x059A, 0x0316, 0x1DFA, 0x0062], NFC: [0x0061, 0x1DFA, 0x0746, 0x0316, 0x059A, 0x0062], NFD: [0x0061, 0x1DFA, 0x0746, 0x0316, 0x059A, 0x0062], NFKC: [0x0061, 0x1DFA, 0x0746, 0x0316, 0x059A, 0x0062], NFKD: [0x0061, 0x1DFA, 0x0746, 0x0316, 0x059A, 0x0062] }, +{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x0747, 0x0062], NFC: [0x00E0, 0x05AE, 0x0747, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x0747, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x0747, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x0747, 0x0315, 0x0062] }, +{ source: [0x0061, 0x0747, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x0747, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0747, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x0747, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0747, 0x0300, 0x0315, 0x0062] }, +{ source: [0x0061, 0x059A, 0x0316, 0x1DFA, 0x0748, 0x0062], NFC: [0x0061, 0x1DFA, 0x0316, 0x0748, 0x059A, 0x0062], NFD: [0x0061, 0x1DFA, 0x0316, 0x0748, 0x059A, 0x0062], NFKC: [0x0061, 0x1DFA, 0x0316, 0x0748, 0x059A, 0x0062], NFKD: [0x0061, 0x1DFA, 0x0316, 0x0748, 0x059A, 0x0062] }, +{ source: [0x0061, 0x0748, 0x059A, 0x0316, 0x1DFA, 0x0062], NFC: [0x0061, 0x1DFA, 0x0748, 0x0316, 0x059A, 0x0062], NFD: [0x0061, 0x1DFA, 0x0748, 0x0316, 0x059A, 0x0062], NFKC: [0x0061, 0x1DFA, 0x0748, 0x0316, 0x059A, 0x0062], NFKD: [0x0061, 0x1DFA, 0x0748, 0x0316, 0x059A, 0x0062] }, +{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x0749, 0x0062], NFC: [0x00E0, 0x05AE, 0x0749, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x0749, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x0749, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x0749, 0x0315, 0x0062] }, +{ source: [0x0061, 0x0749, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x0749, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0749, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x0749, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0749, 0x0300, 0x0315, 0x0062] }, +{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x074A, 0x0062], NFC: [0x00E0, 0x05AE, 0x074A, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x074A, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x074A, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x074A, 0x0315, 0x0062] }, +{ source: [0x0061, 0x074A, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x074A, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x074A, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x074A, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x074A, 0x0300, 0x0315, 0x0062] }, +{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x07EB, 0x0062], NFC: [0x00E0, 0x05AE, 0x07EB, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x07EB, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x07EB, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x07EB, 0x0315, 0x0062] }, +{ source: [0x0061, 0x07EB, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x07EB, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x07EB, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x07EB, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x07EB, 0x0300, 0x0315, 0x0062] }, +{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x07EC, 0x0062], NFC: [0x00E0, 0x05AE, 0x07EC, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x07EC, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x07EC, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x07EC, 0x0315, 0x0062] }, +{ source: [0x0061, 0x07EC, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x07EC, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x07EC, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x07EC, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x07EC, 0x0300, 0x0315, 0x0062] }, +{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x07ED, 0x0062], NFC: [0x00E0, 0x05AE, 0x07ED, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x07ED, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x07ED, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x07ED, 0x0315, 0x0062] }, +{ source: [0x0061, 0x07ED, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x07ED, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x07ED, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x07ED, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x07ED, 0x0300, 0x0315, 0x0062] }, +{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x07EE, 0x0062], NFC: [0x00E0, 0x05AE, 0x07EE, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x07EE, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x07EE, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x07EE, 0x0315, 0x0062] }, +{ source: [0x0061, 0x07EE, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x07EE, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x07EE, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x07EE, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x07EE, 0x0300, 0x0315, 0x0062] }, +{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x07EF, 0x0062], NFC: [0x00E0, 0x05AE, 0x07EF, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x07EF, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x07EF, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x07EF, 0x0315, 0x0062] }, +{ source: [0x0061, 0x07EF, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x07EF, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x07EF, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x07EF, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x07EF, 0x0300, 0x0315, 0x0062] }, +{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x07F0, 0x0062], NFC: [0x00E0, 0x05AE, 0x07F0, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x07F0, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x07F0, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x07F0, 0x0315, 0x0062] }, +{ source: [0x0061, 0x07F0, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x07F0, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x07F0, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x07F0, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x07F0, 0x0300, 0x0315, 0x0062] }, +{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x07F1, 0x0062], NFC: [0x00E0, 0x05AE, 0x07F1, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x07F1, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x07F1, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x07F1, 0x0315, 0x0062] }, +{ source: [0x0061, 0x07F1, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x07F1, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x07F1, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x07F1, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x07F1, 0x0300, 0x0315, 0x0062] }, +{ source: [0x0061, 0x059A, 0x0316, 0x1DFA, 0x07F2, 0x0062], NFC: [0x0061, 0x1DFA, 0x0316, 0x07F2, 0x059A, 0x0062], NFD: [0x0061, 0x1DFA, 0x0316, 0x07F2, 0x059A, 0x0062], NFKC: [0x0061, 0x1DFA, 0x0316, 0x07F2, 0x059A, 0x0062], NFKD: [0x0061, 0x1DFA, 0x0316, 0x07F2, 0x059A, 0x0062] }, +{ source: [0x0061, 0x07F2, 0x059A, 0x0316, 0x1DFA, 0x0062], NFC: [0x0061, 0x1DFA, 0x07F2, 0x0316, 0x059A, 0x0062], NFD: [0x0061, 0x1DFA, 0x07F2, 0x0316, 0x059A, 0x0062], NFKC: [0x0061, 0x1DFA, 0x07F2, 0x0316, 0x059A, 0x0062], NFKD: [0x0061, 0x1DFA, 0x07F2, 0x0316, 0x059A, 0x0062] }, +{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x07F3, 0x0062], NFC: [0x00E0, 0x05AE, 0x07F3, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x07F3, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x07F3, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x07F3, 0x0315, 0x0062] }, +{ source: [0x0061, 0x07F3, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x07F3, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x07F3, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x07F3, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x07F3, 0x0300, 0x0315, 0x0062] }, +{ source: [0x0061, 0x059A, 0x0316, 0x1DFA, 0x07FD, 0x0062], NFC: [0x0061, 0x1DFA, 0x0316, 0x07FD, 0x059A, 0x0062], NFD: [0x0061, 0x1DFA, 0x0316, 0x07FD, 0x059A, 0x0062], NFKC: [0x0061, 0x1DFA, 0x0316, 0x07FD, 0x059A, 0x0062], NFKD: [0x0061, 0x1DFA, 0x0316, 0x07FD, 0x059A, 0x0062] }, +{ source: [0x0061, 0x07FD, 0x059A, 0x0316, 0x1DFA, 0x0062], NFC: [0x0061, 0x1DFA, 0x07FD, 0x0316, 0x059A, 0x0062], NFD: [0x0061, 0x1DFA, 0x07FD, 0x0316, 0x059A, 0x0062], NFKC: [0x0061, 0x1DFA, 0x07FD, 0x0316, 0x059A, 0x0062], NFKD: [0x0061, 0x1DFA, 0x07FD, 0x0316, 0x059A, 0x0062] }, +{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x0816, 0x0062], NFC: [0x00E0, 0x05AE, 0x0816, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x0816, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x0816, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x0816, 0x0315, 0x0062] }, +{ source: [0x0061, 0x0816, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x0816, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0816, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x0816, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0816, 0x0300, 0x0315, 0x0062] }, +{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x0817, 0x0062], NFC: [0x00E0, 0x05AE, 0x0817, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x0817, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x0817, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x0817, 0x0315, 0x0062] }, +{ source: [0x0061, 0x0817, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x0817, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0817, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x0817, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0817, 0x0300, 0x0315, 0x0062] }, +{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x0818, 0x0062], NFC: [0x00E0, 0x05AE, 0x0818, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x0818, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x0818, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x0818, 0x0315, 0x0062] }, +{ source: [0x0061, 0x0818, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x0818, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0818, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x0818, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0818, 0x0300, 0x0315, 0x0062] }, +{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x0819, 0x0062], NFC: [0x00E0, 0x05AE, 0x0819, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x0819, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x0819, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x0819, 0x0315, 0x0062] }, +{ source: [0x0061, 0x0819, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x0819, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0819, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x0819, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0819, 0x0300, 0x0315, 0x0062] }, +{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x081B, 0x0062], NFC: [0x00E0, 0x05AE, 0x081B, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x081B, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x081B, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x081B, 0x0315, 0x0062] }, +{ source: [0x0061, 0x081B, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x081B, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x081B, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x081B, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x081B, 0x0300, 0x0315, 0x0062] }, +{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x081C, 0x0062], NFC: [0x00E0, 0x05AE, 0x081C, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x081C, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x081C, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x081C, 0x0315, 0x0062] }, +{ source: [0x0061, 0x081C, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x081C, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x081C, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x081C, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x081C, 0x0300, 0x0315, 0x0062] }, +{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x081D, 0x0062], NFC: [0x00E0, 0x05AE, 0x081D, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x081D, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x081D, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x081D, 0x0315, 0x0062] }, +{ source: [0x0061, 0x081D, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x081D, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x081D, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x081D, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x081D, 0x0300, 0x0315, 0x0062] }, +{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x081E, 0x0062], NFC: [0x00E0, 0x05AE, 0x081E, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x081E, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x081E, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x081E, 0x0315, 0x0062] }, +{ source: [0x0061, 0x081E, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x081E, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x081E, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x081E, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x081E, 0x0300, 0x0315, 0x0062] }, +{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x081F, 0x0062], NFC: [0x00E0, 0x05AE, 0x081F, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x081F, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x081F, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x081F, 0x0315, 0x0062] }, +{ source: [0x0061, 0x081F, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x081F, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x081F, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x081F, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x081F, 0x0300, 0x0315, 0x0062] }, +{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x0820, 0x0062], NFC: [0x00E0, 0x05AE, 0x0820, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x0820, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x0820, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x0820, 0x0315, 0x0062] }, +{ source: [0x0061, 0x0820, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x0820, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0820, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x0820, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0820, 0x0300, 0x0315, 0x0062] }, +{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x0821, 0x0062], NFC: [0x00E0, 0x05AE, 0x0821, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x0821, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x0821, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x0821, 0x0315, 0x0062] }, +{ source: [0x0061, 0x0821, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x0821, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0821, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x0821, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0821, 0x0300, 0x0315, 0x0062] }, +{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x0822, 0x0062], NFC: [0x00E0, 0x05AE, 0x0822, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x0822, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x0822, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x0822, 0x0315, 0x0062] }, +{ source: [0x0061, 0x0822, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x0822, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0822, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x0822, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0822, 0x0300, 0x0315, 0x0062] }, +{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x0823, 0x0062], NFC: [0x00E0, 0x05AE, 0x0823, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x0823, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x0823, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x0823, 0x0315, 0x0062] }, +{ source: [0x0061, 0x0823, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x0823, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0823, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x0823, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0823, 0x0300, 0x0315, 0x0062] }, +{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x0825, 0x0062], NFC: [0x00E0, 0x05AE, 0x0825, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x0825, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x0825, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x0825, 0x0315, 0x0062] }, +{ source: [0x0061, 0x0825, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x0825, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0825, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x0825, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0825, 0x0300, 0x0315, 0x0062] }, +{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x0826, 0x0062], NFC: [0x00E0, 0x05AE, 0x0826, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x0826, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x0826, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x0826, 0x0315, 0x0062] }, +{ source: [0x0061, 0x0826, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x0826, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0826, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x0826, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0826, 0x0300, 0x0315, 0x0062] }, +{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x0827, 0x0062], NFC: [0x00E0, 0x05AE, 0x0827, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x0827, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x0827, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x0827, 0x0315, 0x0062] }, +{ source: [0x0061, 0x0827, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x0827, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0827, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x0827, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0827, 0x0300, 0x0315, 0x0062] }, +{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x0829, 0x0062], NFC: [0x00E0, 0x05AE, 0x0829, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x0829, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x0829, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x0829, 0x0315, 0x0062] }, +{ source: [0x0061, 0x0829, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x0829, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0829, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x0829, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0829, 0x0300, 0x0315, 0x0062] }, +{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x082A, 0x0062], NFC: [0x00E0, 0x05AE, 0x082A, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x082A, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x082A, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x082A, 0x0315, 0x0062] }, +{ source: [0x0061, 0x082A, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x082A, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x082A, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x082A, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x082A, 0x0300, 0x0315, 0x0062] }, +{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x082B, 0x0062], NFC: [0x00E0, 0x05AE, 0x082B, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x082B, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x082B, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x082B, 0x0315, 0x0062] }, +{ source: [0x0061, 0x082B, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x082B, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x082B, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x082B, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x082B, 0x0300, 0x0315, 0x0062] }, +{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x082C, 0x0062], NFC: [0x00E0, 0x05AE, 0x082C, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x082C, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x082C, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x082C, 0x0315, 0x0062] }, +{ source: [0x0061, 0x082C, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x082C, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x082C, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x082C, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x082C, 0x0300, 0x0315, 0x0062] }, +{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x082D, 0x0062], NFC: [0x00E0, 0x05AE, 0x082D, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x082D, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x082D, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x082D, 0x0315, 0x0062] }, +{ source: [0x0061, 0x082D, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x082D, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x082D, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x082D, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x082D, 0x0300, 0x0315, 0x0062] }, +{ source: [0x0061, 0x059A, 0x0316, 0x1DFA, 0x0859, 0x0062], NFC: [0x0061, 0x1DFA, 0x0316, 0x0859, 0x059A, 0x0062], NFD: [0x0061, 0x1DFA, 0x0316, 0x0859, 0x059A, 0x0062], NFKC: [0x0061, 0x1DFA, 0x0316, 0x0859, 0x059A, 0x0062], NFKD: [0x0061, 0x1DFA, 0x0316, 0x0859, 0x059A, 0x0062] }, +{ source: [0x0061, 0x0859, 0x059A, 0x0316, 0x1DFA, 0x0062], NFC: [0x0061, 0x1DFA, 0x0859, 0x0316, 0x059A, 0x0062], NFD: [0x0061, 0x1DFA, 0x0859, 0x0316, 0x059A, 0x0062], NFKC: [0x0061, 0x1DFA, 0x0859, 0x0316, 0x059A, 0x0062], NFKD: [0x0061, 0x1DFA, 0x0859, 0x0316, 0x059A, 0x0062] }, +{ source: [0x0061, 0x059A, 0x0316, 0x1DFA, 0x085A, 0x0062], NFC: [0x0061, 0x1DFA, 0x0316, 0x085A, 0x059A, 0x0062], NFD: [0x0061, 0x1DFA, 0x0316, 0x085A, 0x059A, 0x0062], NFKC: [0x0061, 0x1DFA, 0x0316, 0x085A, 0x059A, 0x0062], NFKD: [0x0061, 0x1DFA, 0x0316, 0x085A, 0x059A, 0x0062] }, +{ source: [0x0061, 0x085A, 0x059A, 0x0316, 0x1DFA, 0x0062], NFC: [0x0061, 0x1DFA, 0x085A, 0x0316, 0x059A, 0x0062], NFD: [0x0061, 0x1DFA, 0x085A, 0x0316, 0x059A, 0x0062], NFKC: [0x0061, 0x1DFA, 0x085A, 0x0316, 0x059A, 0x0062], NFKD: [0x0061, 0x1DFA, 0x085A, 0x0316, 0x059A, 0x0062] }, +{ source: [0x0061, 0x059A, 0x0316, 0x1DFA, 0x085B, 0x0062], NFC: [0x0061, 0x1DFA, 0x0316, 0x085B, 0x059A, 0x0062], NFD: [0x0061, 0x1DFA, 0x0316, 0x085B, 0x059A, 0x0062], NFKC: [0x0061, 0x1DFA, 0x0316, 0x085B, 0x059A, 0x0062], NFKD: [0x0061, 0x1DFA, 0x0316, 0x085B, 0x059A, 0x0062] }, +{ source: [0x0061, 0x085B, 0x059A, 0x0316, 0x1DFA, 0x0062], NFC: [0x0061, 0x1DFA, 0x085B, 0x0316, 0x059A, 0x0062], NFD: [0x0061, 0x1DFA, 0x085B, 0x0316, 0x059A, 0x0062], NFKC: [0x0061, 0x1DFA, 0x085B, 0x0316, 0x059A, 0x0062], NFKD: [0x0061, 0x1DFA, 0x085B, 0x0316, 0x059A, 0x0062] }, +{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x0898, 0x0062], NFC: [0x00E0, 0x05AE, 0x0898, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x0898, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x0898, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x0898, 0x0315, 0x0062] }, +{ source: [0x0061, 0x0898, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x0898, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0898, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x0898, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0898, 0x0300, 0x0315, 0x0062] }, +{ source: [0x0061, 0x059A, 0x0316, 0x1DFA, 0x0899, 0x0062], NFC: [0x0061, 0x1DFA, 0x0316, 0x0899, 0x059A, 0x0062], NFD: [0x0061, 0x1DFA, 0x0316, 0x0899, 0x059A, 0x0062], NFKC: [0x0061, 0x1DFA, 0x0316, 0x0899, 0x059A, 0x0062], NFKD: [0x0061, 0x1DFA, 0x0316, 0x0899, 0x059A, 0x0062] }, +{ source: [0x0061, 0x0899, 0x059A, 0x0316, 0x1DFA, 0x0062], NFC: [0x0061, 0x1DFA, 0x0899, 0x0316, 0x059A, 0x0062], NFD: [0x0061, 0x1DFA, 0x0899, 0x0316, 0x059A, 0x0062], NFKC: [0x0061, 0x1DFA, 0x0899, 0x0316, 0x059A, 0x0062], NFKD: [0x0061, 0x1DFA, 0x0899, 0x0316, 0x059A, 0x0062] }, +{ source: [0x0061, 0x059A, 0x0316, 0x1DFA, 0x089A, 0x0062], NFC: [0x0061, 0x1DFA, 0x0316, 0x089A, 0x059A, 0x0062], NFD: [0x0061, 0x1DFA, 0x0316, 0x089A, 0x059A, 0x0062], NFKC: [0x0061, 0x1DFA, 0x0316, 0x089A, 0x059A, 0x0062], NFKD: [0x0061, 0x1DFA, 0x0316, 0x089A, 0x059A, 0x0062] }, +{ source: [0x0061, 0x089A, 0x059A, 0x0316, 0x1DFA, 0x0062], NFC: [0x0061, 0x1DFA, 0x089A, 0x0316, 0x059A, 0x0062], NFD: [0x0061, 0x1DFA, 0x089A, 0x0316, 0x059A, 0x0062], NFKC: [0x0061, 0x1DFA, 0x089A, 0x0316, 0x059A, 0x0062], NFKD: [0x0061, 0x1DFA, 0x089A, 0x0316, 0x059A, 0x0062] }, +{ source: [0x0061, 0x059A, 0x0316, 0x1DFA, 0x089B, 0x0062], NFC: [0x0061, 0x1DFA, 0x0316, 0x089B, 0x059A, 0x0062], NFD: [0x0061, 0x1DFA, 0x0316, 0x089B, 0x059A, 0x0062], NFKC: [0x0061, 0x1DFA, 0x0316, 0x089B, 0x059A, 0x0062], NFKD: [0x0061, 0x1DFA, 0x0316, 0x089B, 0x059A, 0x0062] }, +{ source: [0x0061, 0x089B, 0x059A, 0x0316, 0x1DFA, 0x0062], NFC: [0x0061, 0x1DFA, 0x089B, 0x0316, 0x059A, 0x0062], NFD: [0x0061, 0x1DFA, 0x089B, 0x0316, 0x059A, 0x0062], NFKC: [0x0061, 0x1DFA, 0x089B, 0x0316, 0x059A, 0x0062], NFKD: [0x0061, 0x1DFA, 0x089B, 0x0316, 0x059A, 0x0062] }, +{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x089C, 0x0062], NFC: [0x00E0, 0x05AE, 0x089C, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x089C, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x089C, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x089C, 0x0315, 0x0062] }, +{ source: [0x0061, 0x089C, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x089C, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x089C, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x089C, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x089C, 0x0300, 0x0315, 0x0062] }, +{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x089D, 0x0062], NFC: [0x00E0, 0x05AE, 0x089D, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x089D, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x089D, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x089D, 0x0315, 0x0062] }, +{ source: [0x0061, 0x089D, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x089D, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x089D, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x089D, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x089D, 0x0300, 0x0315, 0x0062] }, +{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x089E, 0x0062], NFC: [0x00E0, 0x05AE, 0x089E, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x089E, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x089E, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x089E, 0x0315, 0x0062] }, +{ source: [0x0061, 0x089E, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x089E, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x089E, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x089E, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x089E, 0x0300, 0x0315, 0x0062] }, +{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x089F, 0x0062], NFC: [0x00E0, 0x05AE, 0x089F, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x089F, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x089F, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x089F, 0x0315, 0x0062] }, +{ source: [0x0061, 0x089F, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x089F, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x089F, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x089F, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x089F, 0x0300, 0x0315, 0x0062] }, +{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x08CA, 0x0062], NFC: [0x00E0, 0x05AE, 0x08CA, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x08CA, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x08CA, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x08CA, 0x0315, 0x0062] }, +{ source: [0x0061, 0x08CA, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x08CA, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x08CA, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x08CA, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x08CA, 0x0300, 0x0315, 0x0062] }, +{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x08CB, 0x0062], NFC: [0x00E0, 0x05AE, 0x08CB, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x08CB, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x08CB, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x08CB, 0x0315, 0x0062] }, +{ source: [0x0061, 0x08CB, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x08CB, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x08CB, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x08CB, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x08CB, 0x0300, 0x0315, 0x0062] }, +{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x08CC, 0x0062], NFC: [0x00E0, 0x05AE, 0x08CC, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x08CC, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x08CC, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x08CC, 0x0315, 0x0062] }, +{ source: [0x0061, 0x08CC, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x08CC, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x08CC, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x08CC, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x08CC, 0x0300, 0x0315, 0x0062] }, +{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x08CD, 0x0062], NFC: [0x00E0, 0x05AE, 0x08CD, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x08CD, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x08CD, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x08CD, 0x0315, 0x0062] }, +{ source: [0x0061, 0x08CD, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x08CD, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x08CD, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x08CD, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x08CD, 0x0300, 0x0315, 0x0062] }, +{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x08CE, 0x0062], NFC: [0x00E0, 0x05AE, 0x08CE, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x08CE, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x08CE, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x08CE, 0x0315, 0x0062] }, +{ source: [0x0061, 0x08CE, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x08CE, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x08CE, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x08CE, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x08CE, 0x0300, 0x0315, 0x0062] }, +{ source: [0x0061, 0x059A, 0x0316, 0x1DFA, 0x08CF, 0x0062], NFC: [0x0061, 0x1DFA, 0x0316, 0x08CF, 0x059A, 0x0062], NFD: [0x0061, 0x1DFA, 0x0316, 0x08CF, 0x059A, 0x0062], NFKC: [0x0061, 0x1DFA, 0x0316, 0x08CF, 0x059A, 0x0062], NFKD: [0x0061, 0x1DFA, 0x0316, 0x08CF, 0x059A, 0x0062] }, +{ source: [0x0061, 0x08CF, 0x059A, 0x0316, 0x1DFA, 0x0062], NFC: [0x0061, 0x1DFA, 0x08CF, 0x0316, 0x059A, 0x0062], NFD: [0x0061, 0x1DFA, 0x08CF, 0x0316, 0x059A, 0x0062], NFKC: [0x0061, 0x1DFA, 0x08CF, 0x0316, 0x059A, 0x0062], NFKD: [0x0061, 0x1DFA, 0x08CF, 0x0316, 0x059A, 0x0062] }, +{ source: [0x0061, 0x059A, 0x0316, 0x1DFA, 0x08D0, 0x0062], NFC: [0x0061, 0x1DFA, 0x0316, 0x08D0, 0x059A, 0x0062], NFD: [0x0061, 0x1DFA, 0x0316, 0x08D0, 0x059A, 0x0062], NFKC: [0x0061, 0x1DFA, 0x0316, 0x08D0, 0x059A, 0x0062], NFKD: [0x0061, 0x1DFA, 0x0316, 0x08D0, 0x059A, 0x0062] }, +{ source: [0x0061, 0x08D0, 0x059A, 0x0316, 0x1DFA, 0x0062], NFC: [0x0061, 0x1DFA, 0x08D0, 0x0316, 0x059A, 0x0062], NFD: [0x0061, 0x1DFA, 0x08D0, 0x0316, 0x059A, 0x0062], NFKC: [0x0061, 0x1DFA, 0x08D0, 0x0316, 0x059A, 0x0062], NFKD: [0x0061, 0x1DFA, 0x08D0, 0x0316, 0x059A, 0x0062] }, +{ source: [0x0061, 0x059A, 0x0316, 0x1DFA, 0x08D1, 0x0062], NFC: [0x0061, 0x1DFA, 0x0316, 0x08D1, 0x059A, 0x0062], NFD: [0x0061, 0x1DFA, 0x0316, 0x08D1, 0x059A, 0x0062], NFKC: [0x0061, 0x1DFA, 0x0316, 0x08D1, 0x059A, 0x0062], NFKD: [0x0061, 0x1DFA, 0x0316, 0x08D1, 0x059A, 0x0062] }, +{ source: [0x0061, 0x08D1, 0x059A, 0x0316, 0x1DFA, 0x0062], NFC: [0x0061, 0x1DFA, 0x08D1, 0x0316, 0x059A, 0x0062], NFD: [0x0061, 0x1DFA, 0x08D1, 0x0316, 0x059A, 0x0062], NFKC: [0x0061, 0x1DFA, 0x08D1, 0x0316, 0x059A, 0x0062], NFKD: [0x0061, 0x1DFA, 0x08D1, 0x0316, 0x059A, 0x0062] }, +{ source: [0x0061, 0x059A, 0x0316, 0x1DFA, 0x08D2, 0x0062], NFC: [0x0061, 0x1DFA, 0x0316, 0x08D2, 0x059A, 0x0062], NFD: [0x0061, 0x1DFA, 0x0316, 0x08D2, 0x059A, 0x0062], NFKC: [0x0061, 0x1DFA, 0x0316, 0x08D2, 0x059A, 0x0062], NFKD: [0x0061, 0x1DFA, 0x0316, 0x08D2, 0x059A, 0x0062] }, +{ source: [0x0061, 0x08D2, 0x059A, 0x0316, 0x1DFA, 0x0062], NFC: [0x0061, 0x1DFA, 0x08D2, 0x0316, 0x059A, 0x0062], NFD: [0x0061, 0x1DFA, 0x08D2, 0x0316, 0x059A, 0x0062], NFKC: [0x0061, 0x1DFA, 0x08D2, 0x0316, 0x059A, 0x0062], NFKD: [0x0061, 0x1DFA, 0x08D2, 0x0316, 0x059A, 0x0062] }, +{ source: [0x0061, 0x059A, 0x0316, 0x1DFA, 0x08D3, 0x0062], NFC: [0x0061, 0x1DFA, 0x0316, 0x08D3, 0x059A, 0x0062], NFD: [0x0061, 0x1DFA, 0x0316, 0x08D3, 0x059A, 0x0062], NFKC: [0x0061, 0x1DFA, 0x0316, 0x08D3, 0x059A, 0x0062], NFKD: [0x0061, 0x1DFA, 0x0316, 0x08D3, 0x059A, 0x0062] }, +{ source: [0x0061, 0x08D3, 0x059A, 0x0316, 0x1DFA, 0x0062], NFC: [0x0061, 0x1DFA, 0x08D3, 0x0316, 0x059A, 0x0062], NFD: [0x0061, 0x1DFA, 0x08D3, 0x0316, 0x059A, 0x0062], NFKC: [0x0061, 0x1DFA, 0x08D3, 0x0316, 0x059A, 0x0062], NFKD: [0x0061, 0x1DFA, 0x08D3, 0x0316, 0x059A, 0x0062] }, +{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x08D4, 0x0062], NFC: [0x00E0, 0x05AE, 0x08D4, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x08D4, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x08D4, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x08D4, 0x0315, 0x0062] }, +{ source: [0x0061, 0x08D4, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x08D4, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x08D4, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x08D4, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x08D4, 0x0300, 0x0315, 0x0062] }, +{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x08D5, 0x0062], NFC: [0x00E0, 0x05AE, 0x08D5, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x08D5, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x08D5, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x08D5, 0x0315, 0x0062] }, +{ source: [0x0061, 0x08D5, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x08D5, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x08D5, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x08D5, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x08D5, 0x0300, 0x0315, 0x0062] }, +{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x08D6, 0x0062], NFC: [0x00E0, 0x05AE, 0x08D6, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x08D6, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x08D6, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x08D6, 0x0315, 0x0062] }, +{ source: [0x0061, 0x08D6, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x08D6, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x08D6, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x08D6, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x08D6, 0x0300, 0x0315, 0x0062] }, +{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x08D7, 0x0062], NFC: [0x00E0, 0x05AE, 0x08D7, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x08D7, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x08D7, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x08D7, 0x0315, 0x0062] }, +{ source: [0x0061, 0x08D7, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x08D7, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x08D7, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x08D7, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x08D7, 0x0300, 0x0315, 0x0062] }, +{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x08D8, 0x0062], NFC: [0x00E0, 0x05AE, 0x08D8, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x08D8, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x08D8, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x08D8, 0x0315, 0x0062] }, +{ source: [0x0061, 0x08D8, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x08D8, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x08D8, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x08D8, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x08D8, 0x0300, 0x0315, 0x0062] }, +{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x08D9, 0x0062], NFC: [0x00E0, 0x05AE, 0x08D9, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x08D9, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x08D9, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x08D9, 0x0315, 0x0062] }, +{ source: [0x0061, 0x08D9, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x08D9, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x08D9, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x08D9, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x08D9, 0x0300, 0x0315, 0x0062] }, +{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x08DA, 0x0062], NFC: [0x00E0, 0x05AE, 0x08DA, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x08DA, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x08DA, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x08DA, 0x0315, 0x0062] }, +{ source: [0x0061, 0x08DA, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x08DA, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x08DA, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x08DA, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x08DA, 0x0300, 0x0315, 0x0062] }, +{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x08DB, 0x0062], NFC: [0x00E0, 0x05AE, 0x08DB, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x08DB, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x08DB, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x08DB, 0x0315, 0x0062] }, +{ source: [0x0061, 0x08DB, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x08DB, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x08DB, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x08DB, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x08DB, 0x0300, 0x0315, 0x0062] }, +{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x08DC, 0x0062], NFC: [0x00E0, 0x05AE, 0x08DC, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x08DC, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x08DC, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x08DC, 0x0315, 0x0062] }, +{ source: [0x0061, 0x08DC, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x08DC, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x08DC, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x08DC, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x08DC, 0x0300, 0x0315, 0x0062] }, +{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x08DD, 0x0062], NFC: [0x00E0, 0x05AE, 0x08DD, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x08DD, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x08DD, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x08DD, 0x0315, 0x0062] }, +{ source: [0x0061, 0x08DD, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x08DD, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x08DD, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x08DD, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x08DD, 0x0300, 0x0315, 0x0062] }, +{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x08DE, 0x0062], NFC: [0x00E0, 0x05AE, 0x08DE, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x08DE, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x08DE, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x08DE, 0x0315, 0x0062] }, +{ source: [0x0061, 0x08DE, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x08DE, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x08DE, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x08DE, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x08DE, 0x0300, 0x0315, 0x0062] }, +{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x08DF, 0x0062], NFC: [0x00E0, 0x05AE, 0x08DF, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x08DF, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x08DF, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x08DF, 0x0315, 0x0062] }, +{ source: [0x0061, 0x08DF, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x08DF, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x08DF, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x08DF, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x08DF, 0x0300, 0x0315, 0x0062] }, +{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x08E0, 0x0062], NFC: [0x00E0, 0x05AE, 0x08E0, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x08E0, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x08E0, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x08E0, 0x0315, 0x0062] }, +{ source: [0x0061, 0x08E0, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x08E0, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x08E0, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x08E0, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x08E0, 0x0300, 0x0315, 0x0062] }, +{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x08E1, 0x0062], NFC: [0x00E0, 0x05AE, 0x08E1, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x08E1, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x08E1, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x08E1, 0x0315, 0x0062] }, +{ source: [0x0061, 0x08E1, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x08E1, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x08E1, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x08E1, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x08E1, 0x0300, 0x0315, 0x0062] }, +{ source: [0x0061, 0x059A, 0x0316, 0x1DFA, 0x08E3, 0x0062], NFC: [0x0061, 0x1DFA, 0x0316, 0x08E3, 0x059A, 0x0062], NFD: [0x0061, 0x1DFA, 0x0316, 0x08E3, 0x059A, 0x0062], NFKC: [0x0061, 0x1DFA, 0x0316, 0x08E3, 0x059A, 0x0062], NFKD: [0x0061, 0x1DFA, 0x0316, 0x08E3, 0x059A, 0x0062] }, +{ source: [0x0061, 0x08E3, 0x059A, 0x0316, 0x1DFA, 0x0062], NFC: [0x0061, 0x1DFA, 0x08E3, 0x0316, 0x059A, 0x0062], NFD: [0x0061, 0x1DFA, 0x08E3, 0x0316, 0x059A, 0x0062], NFKC: [0x0061, 0x1DFA, 0x08E3, 0x0316, 0x059A, 0x0062], NFKD: [0x0061, 0x1DFA, 0x08E3, 0x0316, 0x059A, 0x0062] }, +{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x08E4, 0x0062], NFC: [0x00E0, 0x05AE, 0x08E4, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x08E4, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x08E4, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x08E4, 0x0315, 0x0062] }, +{ source: [0x0061, 0x08E4, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x08E4, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x08E4, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x08E4, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x08E4, 0x0300, 0x0315, 0x0062] }, +{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x08E5, 0x0062], NFC: [0x00E0, 0x05AE, 0x08E5, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x08E5, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x08E5, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x08E5, 0x0315, 0x0062] }, +{ source: [0x0061, 0x08E5, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x08E5, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x08E5, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x08E5, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x08E5, 0x0300, 0x0315, 0x0062] }, +{ source: [0x0061, 0x059A, 0x0316, 0x1DFA, 0x08E6, 0x0062], NFC: [0x0061, 0x1DFA, 0x0316, 0x08E6, 0x059A, 0x0062], NFD: [0x0061, 0x1DFA, 0x0316, 0x08E6, 0x059A, 0x0062], NFKC: [0x0061, 0x1DFA, 0x0316, 0x08E6, 0x059A, 0x0062], NFKD: [0x0061, 0x1DFA, 0x0316, 0x08E6, 0x059A, 0x0062] }, +{ source: [0x0061, 0x08E6, 0x059A, 0x0316, 0x1DFA, 0x0062], NFC: [0x0061, 0x1DFA, 0x08E6, 0x0316, 0x059A, 0x0062], NFD: [0x0061, 0x1DFA, 0x08E6, 0x0316, 0x059A, 0x0062], NFKC: [0x0061, 0x1DFA, 0x08E6, 0x0316, 0x059A, 0x0062], NFKD: [0x0061, 0x1DFA, 0x08E6, 0x0316, 0x059A, 0x0062] }, +{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x08E7, 0x0062], NFC: [0x00E0, 0x05AE, 0x08E7, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x08E7, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x08E7, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x08E7, 0x0315, 0x0062] }, +{ source: [0x0061, 0x08E7, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x08E7, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x08E7, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x08E7, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x08E7, 0x0300, 0x0315, 0x0062] }, +{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x08E8, 0x0062], NFC: [0x00E0, 0x05AE, 0x08E8, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x08E8, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x08E8, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x08E8, 0x0315, 0x0062] }, +{ source: [0x0061, 0x08E8, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x08E8, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x08E8, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x08E8, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x08E8, 0x0300, 0x0315, 0x0062] }, +{ source: [0x0061, 0x059A, 0x0316, 0x1DFA, 0x08E9, 0x0062], NFC: [0x0061, 0x1DFA, 0x0316, 0x08E9, 0x059A, 0x0062], NFD: [0x0061, 0x1DFA, 0x0316, 0x08E9, 0x059A, 0x0062], NFKC: [0x0061, 0x1DFA, 0x0316, 0x08E9, 0x059A, 0x0062], NFKD: [0x0061, 0x1DFA, 0x0316, 0x08E9, 0x059A, 0x0062] }, +{ source: [0x0061, 0x08E9, 0x059A, 0x0316, 0x1DFA, 0x0062], NFC: [0x0061, 0x1DFA, 0x08E9, 0x0316, 0x059A, 0x0062], NFD: [0x0061, 0x1DFA, 0x08E9, 0x0316, 0x059A, 0x0062], NFKC: [0x0061, 0x1DFA, 0x08E9, 0x0316, 0x059A, 0x0062], NFKD: [0x0061, 0x1DFA, 0x08E9, 0x0316, 0x059A, 0x0062] }, +{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x08EA, 0x0062], NFC: [0x00E0, 0x05AE, 0x08EA, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x08EA, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x08EA, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x08EA, 0x0315, 0x0062] }, +{ source: [0x0061, 0x08EA, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x08EA, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x08EA, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x08EA, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x08EA, 0x0300, 0x0315, 0x0062] }, +{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x08EB, 0x0062], NFC: [0x00E0, 0x05AE, 0x08EB, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x08EB, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x08EB, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x08EB, 0x0315, 0x0062] }, +{ source: [0x0061, 0x08EB, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x08EB, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x08EB, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x08EB, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x08EB, 0x0300, 0x0315, 0x0062] }, +{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x08EC, 0x0062], NFC: [0x00E0, 0x05AE, 0x08EC, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x08EC, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x08EC, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x08EC, 0x0315, 0x0062] }, +{ source: [0x0061, 0x08EC, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x08EC, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x08EC, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x08EC, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x08EC, 0x0300, 0x0315, 0x0062] }, +{ source: [0x0061, 0x059A, 0x0316, 0x1DFA, 0x08ED, 0x0062], NFC: [0x0061, 0x1DFA, 0x0316, 0x08ED, 0x059A, 0x0062], NFD: [0x0061, 0x1DFA, 0x0316, 0x08ED, 0x059A, 0x0062], NFKC: [0x0061, 0x1DFA, 0x0316, 0x08ED, 0x059A, 0x0062], NFKD: [0x0061, 0x1DFA, 0x0316, 0x08ED, 0x059A, 0x0062] }, +{ source: [0x0061, 0x08ED, 0x059A, 0x0316, 0x1DFA, 0x0062], NFC: [0x0061, 0x1DFA, 0x08ED, 0x0316, 0x059A, 0x0062], NFD: [0x0061, 0x1DFA, 0x08ED, 0x0316, 0x059A, 0x0062], NFKC: [0x0061, 0x1DFA, 0x08ED, 0x0316, 0x059A, 0x0062], NFKD: [0x0061, 0x1DFA, 0x08ED, 0x0316, 0x059A, 0x0062] }, +{ source: [0x0061, 0x059A, 0x0316, 0x1DFA, 0x08EE, 0x0062], NFC: [0x0061, 0x1DFA, 0x0316, 0x08EE, 0x059A, 0x0062], NFD: [0x0061, 0x1DFA, 0x0316, 0x08EE, 0x059A, 0x0062], NFKC: [0x0061, 0x1DFA, 0x0316, 0x08EE, 0x059A, 0x0062], NFKD: [0x0061, 0x1DFA, 0x0316, 0x08EE, 0x059A, 0x0062] }, +{ source: [0x0061, 0x08EE, 0x059A, 0x0316, 0x1DFA, 0x0062], NFC: [0x0061, 0x1DFA, 0x08EE, 0x0316, 0x059A, 0x0062], NFD: [0x0061, 0x1DFA, 0x08EE, 0x0316, 0x059A, 0x0062], NFKC: [0x0061, 0x1DFA, 0x08EE, 0x0316, 0x059A, 0x0062], NFKD: [0x0061, 0x1DFA, 0x08EE, 0x0316, 0x059A, 0x0062] }, +{ source: [0x0061, 0x059A, 0x0316, 0x1DFA, 0x08EF, 0x0062], NFC: [0x0061, 0x1DFA, 0x0316, 0x08EF, 0x059A, 0x0062], NFD: [0x0061, 0x1DFA, 0x0316, 0x08EF, 0x059A, 0x0062], NFKC: [0x0061, 0x1DFA, 0x0316, 0x08EF, 0x059A, 0x0062], NFKD: [0x0061, 0x1DFA, 0x0316, 0x08EF, 0x059A, 0x0062] }, +{ source: [0x0061, 0x08EF, 0x059A, 0x0316, 0x1DFA, 0x0062], NFC: [0x0061, 0x1DFA, 0x08EF, 0x0316, 0x059A, 0x0062], NFD: [0x0061, 0x1DFA, 0x08EF, 0x0316, 0x059A, 0x0062], NFKC: [0x0061, 0x1DFA, 0x08EF, 0x0316, 0x059A, 0x0062], NFKD: [0x0061, 0x1DFA, 0x08EF, 0x0316, 0x059A, 0x0062] }, +{ source: [0x0061, 0x064C, 0x064B, 0xFB1E, 0x08F0, 0x0062], NFC: [0x0061, 0xFB1E, 0x064B, 0x08F0, 0x064C, 0x0062], NFD: [0x0061, 0xFB1E, 0x064B, 0x08F0, 0x064C, 0x0062], NFKC: [0x0061, 0xFB1E, 0x064B, 0x08F0, 0x064C, 0x0062], NFKD: [0x0061, 0xFB1E, 0x064B, 0x08F0, 0x064C, 0x0062] }, +{ source: [0x0061, 0x08F0, 0x064C, 0x064B, 0xFB1E, 0x0062], NFC: [0x0061, 0xFB1E, 0x08F0, 0x064B, 0x064C, 0x0062], NFD: [0x0061, 0xFB1E, 0x08F0, 0x064B, 0x064C, 0x0062], NFKC: [0x0061, 0xFB1E, 0x08F0, 0x064B, 0x064C, 0x0062], NFKD: [0x0061, 0xFB1E, 0x08F0, 0x064B, 0x064C, 0x0062] }, +{ source: [0x0061, 0x064D, 0x064C, 0x064B, 0x08F1, 0x0062], NFC: [0x0061, 0x064B, 0x064C, 0x08F1, 0x064D, 0x0062], NFD: [0x0061, 0x064B, 0x064C, 0x08F1, 0x064D, 0x0062], NFKC: [0x0061, 0x064B, 0x064C, 0x08F1, 0x064D, 0x0062], NFKD: [0x0061, 0x064B, 0x064C, 0x08F1, 0x064D, 0x0062] }, +{ source: [0x0061, 0x08F1, 0x064D, 0x064C, 0x064B, 0x0062], NFC: [0x0061, 0x064B, 0x08F1, 0x064C, 0x064D, 0x0062], NFD: [0x0061, 0x064B, 0x08F1, 0x064C, 0x064D, 0x0062], NFKC: [0x0061, 0x064B, 0x08F1, 0x064C, 0x064D, 0x0062], NFKD: [0x0061, 0x064B, 0x08F1, 0x064C, 0x064D, 0x0062] }, +{ source: [0x0061, 0x0618, 0x064D, 0x064C, 0x08F2, 0x0062], NFC: [0x0061, 0x064C, 0x064D, 0x08F2, 0x0618, 0x0062], NFD: [0x0061, 0x064C, 0x064D, 0x08F2, 0x0618, 0x0062], NFKC: [0x0061, 0x064C, 0x064D, 0x08F2, 0x0618, 0x0062], NFKD: [0x0061, 0x064C, 0x064D, 0x08F2, 0x0618, 0x0062] }, +{ source: [0x0061, 0x08F2, 0x0618, 0x064D, 0x064C, 0x0062], NFC: [0x0061, 0x064C, 0x08F2, 0x064D, 0x0618, 0x0062], NFD: [0x0061, 0x064C, 0x08F2, 0x064D, 0x0618, 0x0062], NFKC: [0x0061, 0x064C, 0x08F2, 0x064D, 0x0618, 0x0062], NFKD: [0x0061, 0x064C, 0x08F2, 0x064D, 0x0618, 0x0062] }, +{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x08F3, 0x0062], NFC: [0x00E0, 0x05AE, 0x08F3, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x08F3, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x08F3, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x08F3, 0x0315, 0x0062] }, +{ source: [0x0061, 0x08F3, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x08F3, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x08F3, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x08F3, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x08F3, 0x0300, 0x0315, 0x0062] }, +{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x08F4, 0x0062], NFC: [0x00E0, 0x05AE, 0x08F4, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x08F4, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x08F4, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x08F4, 0x0315, 0x0062] }, +{ source: [0x0061, 0x08F4, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x08F4, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x08F4, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x08F4, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x08F4, 0x0300, 0x0315, 0x0062] }, +{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x08F5, 0x0062], NFC: [0x00E0, 0x05AE, 0x08F5, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x08F5, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x08F5, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x08F5, 0x0315, 0x0062] }, +{ source: [0x0061, 0x08F5, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x08F5, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x08F5, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x08F5, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x08F5, 0x0300, 0x0315, 0x0062] }, +{ source: [0x0061, 0x059A, 0x0316, 0x1DFA, 0x08F6, 0x0062], NFC: [0x0061, 0x1DFA, 0x0316, 0x08F6, 0x059A, 0x0062], NFD: [0x0061, 0x1DFA, 0x0316, 0x08F6, 0x059A, 0x0062], NFKC: [0x0061, 0x1DFA, 0x0316, 0x08F6, 0x059A, 0x0062], NFKD: [0x0061, 0x1DFA, 0x0316, 0x08F6, 0x059A, 0x0062] }, +{ source: [0x0061, 0x08F6, 0x059A, 0x0316, 0x1DFA, 0x0062], NFC: [0x0061, 0x1DFA, 0x08F6, 0x0316, 0x059A, 0x0062], NFD: [0x0061, 0x1DFA, 0x08F6, 0x0316, 0x059A, 0x0062], NFKC: [0x0061, 0x1DFA, 0x08F6, 0x0316, 0x059A, 0x0062], NFKD: [0x0061, 0x1DFA, 0x08F6, 0x0316, 0x059A, 0x0062] }, +{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x08F7, 0x0062], NFC: [0x00E0, 0x05AE, 0x08F7, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x08F7, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x08F7, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x08F7, 0x0315, 0x0062] }, +{ source: [0x0061, 0x08F7, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x08F7, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x08F7, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x08F7, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x08F7, 0x0300, 0x0315, 0x0062] }, +{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x08F8, 0x0062], NFC: [0x00E0, 0x05AE, 0x08F8, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x08F8, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x08F8, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x08F8, 0x0315, 0x0062] }, +{ source: [0x0061, 0x08F8, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x08F8, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x08F8, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x08F8, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x08F8, 0x0300, 0x0315, 0x0062] }, +{ source: [0x0061, 0x059A, 0x0316, 0x1DFA, 0x08F9, 0x0062], NFC: [0x0061, 0x1DFA, 0x0316, 0x08F9, 0x059A, 0x0062], NFD: [0x0061, 0x1DFA, 0x0316, 0x08F9, 0x059A, 0x0062], NFKC: [0x0061, 0x1DFA, 0x0316, 0x08F9, 0x059A, 0x0062], NFKD: [0x0061, 0x1DFA, 0x0316, 0x08F9, 0x059A, 0x0062] }, +{ source: [0x0061, 0x08F9, 0x059A, 0x0316, 0x1DFA, 0x0062], NFC: [0x0061, 0x1DFA, 0x08F9, 0x0316, 0x059A, 0x0062], NFD: [0x0061, 0x1DFA, 0x08F9, 0x0316, 0x059A, 0x0062], NFKC: [0x0061, 0x1DFA, 0x08F9, 0x0316, 0x059A, 0x0062], NFKD: [0x0061, 0x1DFA, 0x08F9, 0x0316, 0x059A, 0x0062] }, +{ source: [0x0061, 0x059A, 0x0316, 0x1DFA, 0x08FA, 0x0062], NFC: [0x0061, 0x1DFA, 0x0316, 0x08FA, 0x059A, 0x0062], NFD: [0x0061, 0x1DFA, 0x0316, 0x08FA, 0x059A, 0x0062], NFKC: [0x0061, 0x1DFA, 0x0316, 0x08FA, 0x059A, 0x0062], NFKD: [0x0061, 0x1DFA, 0x0316, 0x08FA, 0x059A, 0x0062] }, +{ source: [0x0061, 0x08FA, 0x059A, 0x0316, 0x1DFA, 0x0062], NFC: [0x0061, 0x1DFA, 0x08FA, 0x0316, 0x059A, 0x0062], NFD: [0x0061, 0x1DFA, 0x08FA, 0x0316, 0x059A, 0x0062], NFKC: [0x0061, 0x1DFA, 0x08FA, 0x0316, 0x059A, 0x0062], NFKD: [0x0061, 0x1DFA, 0x08FA, 0x0316, 0x059A, 0x0062] }, +{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x08FB, 0x0062], NFC: [0x00E0, 0x05AE, 0x08FB, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x08FB, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x08FB, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x08FB, 0x0315, 0x0062] }, +{ source: [0x0061, 0x08FB, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x08FB, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x08FB, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x08FB, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x08FB, 0x0300, 0x0315, 0x0062] }, +{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x08FC, 0x0062], NFC: [0x00E0, 0x05AE, 0x08FC, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x08FC, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x08FC, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x08FC, 0x0315, 0x0062] }, +{ source: [0x0061, 0x08FC, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x08FC, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x08FC, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x08FC, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x08FC, 0x0300, 0x0315, 0x0062] }, +{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x08FD, 0x0062], NFC: [0x00E0, 0x05AE, 0x08FD, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x08FD, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x08FD, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x08FD, 0x0315, 0x0062] }, +{ source: [0x0061, 0x08FD, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x08FD, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x08FD, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x08FD, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x08FD, 0x0300, 0x0315, 0x0062] }, +{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x08FE, 0x0062], NFC: [0x00E0, 0x05AE, 0x08FE, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x08FE, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x08FE, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x08FE, 0x0315, 0x0062] }, +{ source: [0x0061, 0x08FE, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x08FE, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x08FE, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x08FE, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x08FE, 0x0300, 0x0315, 0x0062] }, +{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x08FF, 0x0062], NFC: [0x00E0, 0x05AE, 0x08FF, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x08FF, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x08FF, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x08FF, 0x0315, 0x0062] }, +{ source: [0x0061, 0x08FF, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x08FF, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x08FF, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x08FF, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x08FF, 0x0300, 0x0315, 0x0062] }, +{ source: [0x0061, 0x3099, 0x093C, 0x16FF0, 0x093C, 0x0062], NFC: [0x0061, 0x16FF0, 0x093C, 0x093C, 0x3099, 0x0062], NFD: [0x0061, 0x16FF0, 0x093C, 0x093C, 0x3099, 0x0062], NFKC: [0x0061, 0x16FF0, 0x093C, 0x093C, 0x3099, 0x0062], NFKD: [0x0061, 0x16FF0, 0x093C, 0x093C, 0x3099, 0x0062] }, +{ source: [0x0061, 0x093C, 0x3099, 0x093C, 0x16FF0, 0x0062], NFC: [0x0061, 0x16FF0, 0x093C, 0x093C, 0x3099, 0x0062], NFD: [0x0061, 0x16FF0, 0x093C, 0x093C, 0x3099, 0x0062], NFKC: [0x0061, 0x16FF0, 0x093C, 0x093C, 0x3099, 0x0062], NFKD: [0x0061, 0x16FF0, 0x093C, 0x093C, 0x3099, 0x0062] }, +{ source: [0x0061, 0x05B0, 0x094D, 0x3099, 0x094D, 0x0062], NFC: [0x0061, 0x3099, 0x094D, 0x094D, 0x05B0, 0x0062], NFD: [0x0061, 0x3099, 0x094D, 0x094D, 0x05B0, 0x0062], NFKC: [0x0061, 0x3099, 0x094D, 0x094D, 0x05B0, 0x0062], NFKD: [0x0061, 0x3099, 0x094D, 0x094D, 0x05B0, 0x0062] }, +{ source: [0x0061, 0x094D, 0x05B0, 0x094D, 0x3099, 0x0062], NFC: [0x0061, 0x3099, 0x094D, 0x094D, 0x05B0, 0x0062], NFD: [0x0061, 0x3099, 0x094D, 0x094D, 0x05B0, 0x0062], NFKC: [0x0061, 0x3099, 0x094D, 0x094D, 0x05B0, 0x0062], NFKD: [0x0061, 0x3099, 0x094D, 0x094D, 0x05B0, 0x0062] }, +{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x0951, 0x0062], NFC: [0x00E0, 0x05AE, 0x0951, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x0951, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x0951, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x0951, 0x0315, 0x0062] }, +{ source: [0x0061, 0x0951, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x0951, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0951, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x0951, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0951, 0x0300, 0x0315, 0x0062] }, +{ source: [0x0061, 0x059A, 0x0316, 0x1DFA, 0x0952, 0x0062], NFC: [0x0061, 0x1DFA, 0x0316, 0x0952, 0x059A, 0x0062], NFD: [0x0061, 0x1DFA, 0x0316, 0x0952, 0x059A, 0x0062], NFKC: [0x0061, 0x1DFA, 0x0316, 0x0952, 0x059A, 0x0062], NFKD: [0x0061, 0x1DFA, 0x0316, 0x0952, 0x059A, 0x0062] }, +{ source: [0x0061, 0x0952, 0x059A, 0x0316, 0x1DFA, 0x0062], NFC: [0x0061, 0x1DFA, 0x0952, 0x0316, 0x059A, 0x0062], NFD: [0x0061, 0x1DFA, 0x0952, 0x0316, 0x059A, 0x0062], NFKC: [0x0061, 0x1DFA, 0x0952, 0x0316, 0x059A, 0x0062], NFKD: [0x0061, 0x1DFA, 0x0952, 0x0316, 0x059A, 0x0062] }, +{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x0953, 0x0062], NFC: [0x00E0, 0x05AE, 0x0953, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x0953, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x0953, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x0953, 0x0315, 0x0062] }, +{ source: [0x0061, 0x0953, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x0953, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0953, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x0953, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0953, 0x0300, 0x0315, 0x0062] }, +{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x0954, 0x0062], NFC: [0x00E0, 0x05AE, 0x0954, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x0954, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x0954, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x0954, 0x0315, 0x0062] }, +{ source: [0x0061, 0x0954, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x0954, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0954, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x0954, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0954, 0x0300, 0x0315, 0x0062] }, +{ source: [0x0061, 0x3099, 0x093C, 0x16FF0, 0x09BC, 0x0062], NFC: [0x0061, 0x16FF0, 0x093C, 0x09BC, 0x3099, 0x0062], NFD: [0x0061, 0x16FF0, 0x093C, 0x09BC, 0x3099, 0x0062], NFKC: [0x0061, 0x16FF0, 0x093C, 0x09BC, 0x3099, 0x0062], NFKD: [0x0061, 0x16FF0, 0x093C, 0x09BC, 0x3099, 0x0062] }, +{ source: [0x0061, 0x09BC, 0x3099, 0x093C, 0x16FF0, 0x0062], NFC: [0x0061, 0x16FF0, 0x09BC, 0x093C, 0x3099, 0x0062], NFD: [0x0061, 0x16FF0, 0x09BC, 0x093C, 0x3099, 0x0062], NFKC: [0x0061, 0x16FF0, 0x09BC, 0x093C, 0x3099, 0x0062], NFKD: [0x0061, 0x16FF0, 0x09BC, 0x093C, 0x3099, 0x0062] }, +{ source: [0x0061, 0x05B0, 0x094D, 0x3099, 0x09CD, 0x0062], NFC: [0x0061, 0x3099, 0x094D, 0x09CD, 0x05B0, 0x0062], NFD: [0x0061, 0x3099, 0x094D, 0x09CD, 0x05B0, 0x0062], NFKC: [0x0061, 0x3099, 0x094D, 0x09CD, 0x05B0, 0x0062], NFKD: [0x0061, 0x3099, 0x094D, 0x09CD, 0x05B0, 0x0062] }, +{ source: [0x0061, 0x09CD, 0x05B0, 0x094D, 0x3099, 0x0062], NFC: [0x0061, 0x3099, 0x09CD, 0x094D, 0x05B0, 0x0062], NFD: [0x0061, 0x3099, 0x09CD, 0x094D, 0x05B0, 0x0062], NFKC: [0x0061, 0x3099, 0x09CD, 0x094D, 0x05B0, 0x0062], NFKD: [0x0061, 0x3099, 0x09CD, 0x094D, 0x05B0, 0x0062] }, +{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x09FE, 0x0062], NFC: [0x00E0, 0x05AE, 0x09FE, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x09FE, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x09FE, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x09FE, 0x0315, 0x0062] }, +{ source: [0x0061, 0x09FE, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x09FE, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x09FE, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x09FE, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x09FE, 0x0300, 0x0315, 0x0062] }, +{ source: [0x0061, 0x3099, 0x093C, 0x16FF0, 0x0A3C, 0x0062], NFC: [0x0061, 0x16FF0, 0x093C, 0x0A3C, 0x3099, 0x0062], NFD: [0x0061, 0x16FF0, 0x093C, 0x0A3C, 0x3099, 0x0062], NFKC: [0x0061, 0x16FF0, 0x093C, 0x0A3C, 0x3099, 0x0062], NFKD: [0x0061, 0x16FF0, 0x093C, 0x0A3C, 0x3099, 0x0062] }, +{ source: [0x0061, 0x0A3C, 0x3099, 0x093C, 0x16FF0, 0x0062], NFC: [0x0061, 0x16FF0, 0x0A3C, 0x093C, 0x3099, 0x0062], NFD: [0x0061, 0x16FF0, 0x0A3C, 0x093C, 0x3099, 0x0062], NFKC: [0x0061, 0x16FF0, 0x0A3C, 0x093C, 0x3099, 0x0062], NFKD: [0x0061, 0x16FF0, 0x0A3C, 0x093C, 0x3099, 0x0062] }, +{ source: [0x0061, 0x05B0, 0x094D, 0x3099, 0x0A4D, 0x0062], NFC: [0x0061, 0x3099, 0x094D, 0x0A4D, 0x05B0, 0x0062], NFD: [0x0061, 0x3099, 0x094D, 0x0A4D, 0x05B0, 0x0062], NFKC: [0x0061, 0x3099, 0x094D, 0x0A4D, 0x05B0, 0x0062], NFKD: [0x0061, 0x3099, 0x094D, 0x0A4D, 0x05B0, 0x0062] }, +{ source: [0x0061, 0x0A4D, 0x05B0, 0x094D, 0x3099, 0x0062], NFC: [0x0061, 0x3099, 0x0A4D, 0x094D, 0x05B0, 0x0062], NFD: [0x0061, 0x3099, 0x0A4D, 0x094D, 0x05B0, 0x0062], NFKC: [0x0061, 0x3099, 0x0A4D, 0x094D, 0x05B0, 0x0062], NFKD: [0x0061, 0x3099, 0x0A4D, 0x094D, 0x05B0, 0x0062] }, +{ source: [0x0061, 0x3099, 0x093C, 0x16FF0, 0x0ABC, 0x0062], NFC: [0x0061, 0x16FF0, 0x093C, 0x0ABC, 0x3099, 0x0062], NFD: [0x0061, 0x16FF0, 0x093C, 0x0ABC, 0x3099, 0x0062], NFKC: [0x0061, 0x16FF0, 0x093C, 0x0ABC, 0x3099, 0x0062], NFKD: [0x0061, 0x16FF0, 0x093C, 0x0ABC, 0x3099, 0x0062] }, +{ source: [0x0061, 0x0ABC, 0x3099, 0x093C, 0x16FF0, 0x0062], NFC: [0x0061, 0x16FF0, 0x0ABC, 0x093C, 0x3099, 0x0062], NFD: [0x0061, 0x16FF0, 0x0ABC, 0x093C, 0x3099, 0x0062], NFKC: [0x0061, 0x16FF0, 0x0ABC, 0x093C, 0x3099, 0x0062], NFKD: [0x0061, 0x16FF0, 0x0ABC, 0x093C, 0x3099, 0x0062] }, +{ source: [0x0061, 0x05B0, 0x094D, 0x3099, 0x0ACD, 0x0062], NFC: [0x0061, 0x3099, 0x094D, 0x0ACD, 0x05B0, 0x0062], NFD: [0x0061, 0x3099, 0x094D, 0x0ACD, 0x05B0, 0x0062], NFKC: [0x0061, 0x3099, 0x094D, 0x0ACD, 0x05B0, 0x0062], NFKD: [0x0061, 0x3099, 0x094D, 0x0ACD, 0x05B0, 0x0062] }, +{ source: [0x0061, 0x0ACD, 0x05B0, 0x094D, 0x3099, 0x0062], NFC: [0x0061, 0x3099, 0x0ACD, 0x094D, 0x05B0, 0x0062], NFD: [0x0061, 0x3099, 0x0ACD, 0x094D, 0x05B0, 0x0062], NFKC: [0x0061, 0x3099, 0x0ACD, 0x094D, 0x05B0, 0x0062], NFKD: [0x0061, 0x3099, 0x0ACD, 0x094D, 0x05B0, 0x0062] }, +{ source: [0x0061, 0x3099, 0x093C, 0x16FF0, 0x0B3C, 0x0062], NFC: [0x0061, 0x16FF0, 0x093C, 0x0B3C, 0x3099, 0x0062], NFD: [0x0061, 0x16FF0, 0x093C, 0x0B3C, 0x3099, 0x0062], NFKC: [0x0061, 0x16FF0, 0x093C, 0x0B3C, 0x3099, 0x0062], NFKD: [0x0061, 0x16FF0, 0x093C, 0x0B3C, 0x3099, 0x0062] }, +{ source: [0x0061, 0x0B3C, 0x3099, 0x093C, 0x16FF0, 0x0062], NFC: [0x0061, 0x16FF0, 0x0B3C, 0x093C, 0x3099, 0x0062], NFD: [0x0061, 0x16FF0, 0x0B3C, 0x093C, 0x3099, 0x0062], NFKC: [0x0061, 0x16FF0, 0x0B3C, 0x093C, 0x3099, 0x0062], NFKD: [0x0061, 0x16FF0, 0x0B3C, 0x093C, 0x3099, 0x0062] }, +{ source: [0x0061, 0x05B0, 0x094D, 0x3099, 0x0B4D, 0x0062], NFC: [0x0061, 0x3099, 0x094D, 0x0B4D, 0x05B0, 0x0062], NFD: [0x0061, 0x3099, 0x094D, 0x0B4D, 0x05B0, 0x0062], NFKC: [0x0061, 0x3099, 0x094D, 0x0B4D, 0x05B0, 0x0062], NFKD: [0x0061, 0x3099, 0x094D, 0x0B4D, 0x05B0, 0x0062] }, +{ source: [0x0061, 0x0B4D, 0x05B0, 0x094D, 0x3099, 0x0062], NFC: [0x0061, 0x3099, 0x0B4D, 0x094D, 0x05B0, 0x0062], NFD: [0x0061, 0x3099, 0x0B4D, 0x094D, 0x05B0, 0x0062], NFKC: [0x0061, 0x3099, 0x0B4D, 0x094D, 0x05B0, 0x0062], NFKD: [0x0061, 0x3099, 0x0B4D, 0x094D, 0x05B0, 0x0062] }, +{ source: [0x0061, 0x05B0, 0x094D, 0x3099, 0x0BCD, 0x0062], NFC: [0x0061, 0x3099, 0x094D, 0x0BCD, 0x05B0, 0x0062], NFD: [0x0061, 0x3099, 0x094D, 0x0BCD, 0x05B0, 0x0062], NFKC: [0x0061, 0x3099, 0x094D, 0x0BCD, 0x05B0, 0x0062], NFKD: [0x0061, 0x3099, 0x094D, 0x0BCD, 0x05B0, 0x0062] }, +{ source: [0x0061, 0x0BCD, 0x05B0, 0x094D, 0x3099, 0x0062], NFC: [0x0061, 0x3099, 0x0BCD, 0x094D, 0x05B0, 0x0062], NFD: [0x0061, 0x3099, 0x0BCD, 0x094D, 0x05B0, 0x0062], NFKC: [0x0061, 0x3099, 0x0BCD, 0x094D, 0x05B0, 0x0062], NFKD: [0x0061, 0x3099, 0x0BCD, 0x094D, 0x05B0, 0x0062] }, +{ source: [0x0061, 0x3099, 0x093C, 0x16FF0, 0x0C3C, 0x0062], NFC: [0x0061, 0x16FF0, 0x093C, 0x0C3C, 0x3099, 0x0062], NFD: [0x0061, 0x16FF0, 0x093C, 0x0C3C, 0x3099, 0x0062], NFKC: [0x0061, 0x16FF0, 0x093C, 0x0C3C, 0x3099, 0x0062], NFKD: [0x0061, 0x16FF0, 0x093C, 0x0C3C, 0x3099, 0x0062] }, +{ source: [0x0061, 0x0C3C, 0x3099, 0x093C, 0x16FF0, 0x0062], NFC: [0x0061, 0x16FF0, 0x0C3C, 0x093C, 0x3099, 0x0062], NFD: [0x0061, 0x16FF0, 0x0C3C, 0x093C, 0x3099, 0x0062], NFKC: [0x0061, 0x16FF0, 0x0C3C, 0x093C, 0x3099, 0x0062], NFKD: [0x0061, 0x16FF0, 0x0C3C, 0x093C, 0x3099, 0x0062] }, +{ source: [0x0061, 0x05B0, 0x094D, 0x3099, 0x0C4D, 0x0062], NFC: [0x0061, 0x3099, 0x094D, 0x0C4D, 0x05B0, 0x0062], NFD: [0x0061, 0x3099, 0x094D, 0x0C4D, 0x05B0, 0x0062], NFKC: [0x0061, 0x3099, 0x094D, 0x0C4D, 0x05B0, 0x0062], NFKD: [0x0061, 0x3099, 0x094D, 0x0C4D, 0x05B0, 0x0062] }, +{ source: [0x0061, 0x0C4D, 0x05B0, 0x094D, 0x3099, 0x0062], NFC: [0x0061, 0x3099, 0x0C4D, 0x094D, 0x05B0, 0x0062], NFD: [0x0061, 0x3099, 0x0C4D, 0x094D, 0x05B0, 0x0062], NFKC: [0x0061, 0x3099, 0x0C4D, 0x094D, 0x05B0, 0x0062], NFKD: [0x0061, 0x3099, 0x0C4D, 0x094D, 0x05B0, 0x0062] }, +{ source: [0x0061, 0x0C56, 0x0C55, 0x0711, 0x0C55, 0x0062], NFC: [0x0061, 0x0711, 0x0C55, 0x0C55, 0x0C56, 0x0062], NFD: [0x0061, 0x0711, 0x0C55, 0x0C55, 0x0C56, 0x0062], NFKC: [0x0061, 0x0711, 0x0C55, 0x0C55, 0x0C56, 0x0062], NFKD: [0x0061, 0x0711, 0x0C55, 0x0C55, 0x0C56, 0x0062] }, +{ source: [0x0061, 0x0C55, 0x0C56, 0x0C55, 0x0711, 0x0062], NFC: [0x0061, 0x0711, 0x0C55, 0x0C55, 0x0C56, 0x0062], NFD: [0x0061, 0x0711, 0x0C55, 0x0C55, 0x0C56, 0x0062], NFKC: [0x0061, 0x0711, 0x0C55, 0x0C55, 0x0C56, 0x0062], NFKD: [0x0061, 0x0711, 0x0C55, 0x0C55, 0x0C56, 0x0062] }, +{ source: [0x0061, 0x0E38, 0x0C56, 0x0C55, 0x0C56, 0x0062], NFC: [0x0061, 0x0C55, 0x0C56, 0x0C56, 0x0E38, 0x0062], NFD: [0x0061, 0x0C55, 0x0C56, 0x0C56, 0x0E38, 0x0062], NFKC: [0x0061, 0x0C55, 0x0C56, 0x0C56, 0x0E38, 0x0062], NFKD: [0x0061, 0x0C55, 0x0C56, 0x0C56, 0x0E38, 0x0062] }, +{ source: [0x0061, 0x0C56, 0x0E38, 0x0C56, 0x0C55, 0x0062], NFC: [0x0061, 0x0C55, 0x0C56, 0x0C56, 0x0E38, 0x0062], NFD: [0x0061, 0x0C55, 0x0C56, 0x0C56, 0x0E38, 0x0062], NFKC: [0x0061, 0x0C55, 0x0C56, 0x0C56, 0x0E38, 0x0062], NFKD: [0x0061, 0x0C55, 0x0C56, 0x0C56, 0x0E38, 0x0062] }, +{ source: [0x0061, 0x3099, 0x093C, 0x16FF0, 0x0CBC, 0x0062], NFC: [0x0061, 0x16FF0, 0x093C, 0x0CBC, 0x3099, 0x0062], NFD: [0x0061, 0x16FF0, 0x093C, 0x0CBC, 0x3099, 0x0062], NFKC: [0x0061, 0x16FF0, 0x093C, 0x0CBC, 0x3099, 0x0062], NFKD: [0x0061, 0x16FF0, 0x093C, 0x0CBC, 0x3099, 0x0062] }, +{ source: [0x0061, 0x0CBC, 0x3099, 0x093C, 0x16FF0, 0x0062], NFC: [0x0061, 0x16FF0, 0x0CBC, 0x093C, 0x3099, 0x0062], NFD: [0x0061, 0x16FF0, 0x0CBC, 0x093C, 0x3099, 0x0062], NFKC: [0x0061, 0x16FF0, 0x0CBC, 0x093C, 0x3099, 0x0062], NFKD: [0x0061, 0x16FF0, 0x0CBC, 0x093C, 0x3099, 0x0062] }, +{ source: [0x0061, 0x05B0, 0x094D, 0x3099, 0x0CCD, 0x0062], NFC: [0x0061, 0x3099, 0x094D, 0x0CCD, 0x05B0, 0x0062], NFD: [0x0061, 0x3099, 0x094D, 0x0CCD, 0x05B0, 0x0062], NFKC: [0x0061, 0x3099, 0x094D, 0x0CCD, 0x05B0, 0x0062], NFKD: [0x0061, 0x3099, 0x094D, 0x0CCD, 0x05B0, 0x0062] }, +{ source: [0x0061, 0x0CCD, 0x05B0, 0x094D, 0x3099, 0x0062], NFC: [0x0061, 0x3099, 0x0CCD, 0x094D, 0x05B0, 0x0062], NFD: [0x0061, 0x3099, 0x0CCD, 0x094D, 0x05B0, 0x0062], NFKC: [0x0061, 0x3099, 0x0CCD, 0x094D, 0x05B0, 0x0062], NFKD: [0x0061, 0x3099, 0x0CCD, 0x094D, 0x05B0, 0x0062] }, +{ source: [0x0061, 0x05B0, 0x094D, 0x3099, 0x0D3B, 0x0062], NFC: [0x0061, 0x3099, 0x094D, 0x0D3B, 0x05B0, 0x0062], NFD: [0x0061, 0x3099, 0x094D, 0x0D3B, 0x05B0, 0x0062], NFKC: [0x0061, 0x3099, 0x094D, 0x0D3B, 0x05B0, 0x0062], NFKD: [0x0061, 0x3099, 0x094D, 0x0D3B, 0x05B0, 0x0062] }, +{ source: [0x0061, 0x0D3B, 0x05B0, 0x094D, 0x3099, 0x0062], NFC: [0x0061, 0x3099, 0x0D3B, 0x094D, 0x05B0, 0x0062], NFD: [0x0061, 0x3099, 0x0D3B, 0x094D, 0x05B0, 0x0062], NFKC: [0x0061, 0x3099, 0x0D3B, 0x094D, 0x05B0, 0x0062], NFKD: [0x0061, 0x3099, 0x0D3B, 0x094D, 0x05B0, 0x0062] }, +{ source: [0x0061, 0x05B0, 0x094D, 0x3099, 0x0D3C, 0x0062], NFC: [0x0061, 0x3099, 0x094D, 0x0D3C, 0x05B0, 0x0062], NFD: [0x0061, 0x3099, 0x094D, 0x0D3C, 0x05B0, 0x0062], NFKC: [0x0061, 0x3099, 0x094D, 0x0D3C, 0x05B0, 0x0062], NFKD: [0x0061, 0x3099, 0x094D, 0x0D3C, 0x05B0, 0x0062] }, +{ source: [0x0061, 0x0D3C, 0x05B0, 0x094D, 0x3099, 0x0062], NFC: [0x0061, 0x3099, 0x0D3C, 0x094D, 0x05B0, 0x0062], NFD: [0x0061, 0x3099, 0x0D3C, 0x094D, 0x05B0, 0x0062], NFKC: [0x0061, 0x3099, 0x0D3C, 0x094D, 0x05B0, 0x0062], NFKD: [0x0061, 0x3099, 0x0D3C, 0x094D, 0x05B0, 0x0062] }, +{ source: [0x0061, 0x05B0, 0x094D, 0x3099, 0x0D4D, 0x0062], NFC: [0x0061, 0x3099, 0x094D, 0x0D4D, 0x05B0, 0x0062], NFD: [0x0061, 0x3099, 0x094D, 0x0D4D, 0x05B0, 0x0062], NFKC: [0x0061, 0x3099, 0x094D, 0x0D4D, 0x05B0, 0x0062], NFKD: [0x0061, 0x3099, 0x094D, 0x0D4D, 0x05B0, 0x0062] }, +{ source: [0x0061, 0x0D4D, 0x05B0, 0x094D, 0x3099, 0x0062], NFC: [0x0061, 0x3099, 0x0D4D, 0x094D, 0x05B0, 0x0062], NFD: [0x0061, 0x3099, 0x0D4D, 0x094D, 0x05B0, 0x0062], NFKC: [0x0061, 0x3099, 0x0D4D, 0x094D, 0x05B0, 0x0062], NFKD: [0x0061, 0x3099, 0x0D4D, 0x094D, 0x05B0, 0x0062] }, +{ source: [0x0061, 0x05B0, 0x094D, 0x3099, 0x0DCA, 0x0062], NFC: [0x0061, 0x3099, 0x094D, 0x0DCA, 0x05B0, 0x0062], NFD: [0x0061, 0x3099, 0x094D, 0x0DCA, 0x05B0, 0x0062], NFKC: [0x0061, 0x3099, 0x094D, 0x0DCA, 0x05B0, 0x0062], NFKD: [0x0061, 0x3099, 0x094D, 0x0DCA, 0x05B0, 0x0062] }, +{ source: [0x0061, 0x0DCA, 0x05B0, 0x094D, 0x3099, 0x0062], NFC: [0x0061, 0x3099, 0x0DCA, 0x094D, 0x05B0, 0x0062], NFD: [0x0061, 0x3099, 0x0DCA, 0x094D, 0x05B0, 0x0062], NFKC: [0x0061, 0x3099, 0x0DCA, 0x094D, 0x05B0, 0x0062], NFKD: [0x0061, 0x3099, 0x0DCA, 0x094D, 0x05B0, 0x0062] }, +{ source: [0x0061, 0x0E48, 0x0E38, 0x0C56, 0x0E38, 0x0062], NFC: [0x0061, 0x0C56, 0x0E38, 0x0E38, 0x0E48, 0x0062], NFD: [0x0061, 0x0C56, 0x0E38, 0x0E38, 0x0E48, 0x0062], NFKC: [0x0061, 0x0C56, 0x0E38, 0x0E38, 0x0E48, 0x0062], NFKD: [0x0061, 0x0C56, 0x0E38, 0x0E38, 0x0E48, 0x0062] }, +{ source: [0x0061, 0x0E38, 0x0E48, 0x0E38, 0x0C56, 0x0062], NFC: [0x0061, 0x0C56, 0x0E38, 0x0E38, 0x0E48, 0x0062], NFD: [0x0061, 0x0C56, 0x0E38, 0x0E38, 0x0E48, 0x0062], NFKC: [0x0061, 0x0C56, 0x0E38, 0x0E38, 0x0E48, 0x0062], NFKD: [0x0061, 0x0C56, 0x0E38, 0x0E38, 0x0E48, 0x0062] }, +{ source: [0x0061, 0x0E48, 0x0E38, 0x0C56, 0x0E39, 0x0062], NFC: [0x0061, 0x0C56, 0x0E38, 0x0E39, 0x0E48, 0x0062], NFD: [0x0061, 0x0C56, 0x0E38, 0x0E39, 0x0E48, 0x0062], NFKC: [0x0061, 0x0C56, 0x0E38, 0x0E39, 0x0E48, 0x0062], NFKD: [0x0061, 0x0C56, 0x0E38, 0x0E39, 0x0E48, 0x0062] }, +{ source: [0x0061, 0x0E39, 0x0E48, 0x0E38, 0x0C56, 0x0062], NFC: [0x0061, 0x0C56, 0x0E39, 0x0E38, 0x0E48, 0x0062], NFD: [0x0061, 0x0C56, 0x0E39, 0x0E38, 0x0E48, 0x0062], NFKC: [0x0061, 0x0C56, 0x0E39, 0x0E38, 0x0E48, 0x0062], NFKD: [0x0061, 0x0C56, 0x0E39, 0x0E38, 0x0E48, 0x0062] }, +{ source: [0x0061, 0x05B0, 0x094D, 0x3099, 0x0E3A, 0x0062], NFC: [0x0061, 0x3099, 0x094D, 0x0E3A, 0x05B0, 0x0062], NFD: [0x0061, 0x3099, 0x094D, 0x0E3A, 0x05B0, 0x0062], NFKC: [0x0061, 0x3099, 0x094D, 0x0E3A, 0x05B0, 0x0062], NFKD: [0x0061, 0x3099, 0x094D, 0x0E3A, 0x05B0, 0x0062] }, +{ source: [0x0061, 0x0E3A, 0x05B0, 0x094D, 0x3099, 0x0062], NFC: [0x0061, 0x3099, 0x0E3A, 0x094D, 0x05B0, 0x0062], NFD: [0x0061, 0x3099, 0x0E3A, 0x094D, 0x05B0, 0x0062], NFKC: [0x0061, 0x3099, 0x0E3A, 0x094D, 0x05B0, 0x0062], NFKD: [0x0061, 0x3099, 0x0E3A, 0x094D, 0x05B0, 0x0062] }, +{ source: [0x0061, 0x0EB8, 0x0E48, 0x0E38, 0x0E48, 0x0062], NFC: [0x0061, 0x0E38, 0x0E48, 0x0E48, 0x0EB8, 0x0062], NFD: [0x0061, 0x0E38, 0x0E48, 0x0E48, 0x0EB8, 0x0062], NFKC: [0x0061, 0x0E38, 0x0E48, 0x0E48, 0x0EB8, 0x0062], NFKD: [0x0061, 0x0E38, 0x0E48, 0x0E48, 0x0EB8, 0x0062] }, +{ source: [0x0061, 0x0E48, 0x0EB8, 0x0E48, 0x0E38, 0x0062], NFC: [0x0061, 0x0E38, 0x0E48, 0x0E48, 0x0EB8, 0x0062], NFD: [0x0061, 0x0E38, 0x0E48, 0x0E48, 0x0EB8, 0x0062], NFKC: [0x0061, 0x0E38, 0x0E48, 0x0E48, 0x0EB8, 0x0062], NFKD: [0x0061, 0x0E38, 0x0E48, 0x0E48, 0x0EB8, 0x0062] }, +{ source: [0x0061, 0x0EB8, 0x0E48, 0x0E38, 0x0E49, 0x0062], NFC: [0x0061, 0x0E38, 0x0E48, 0x0E49, 0x0EB8, 0x0062], NFD: [0x0061, 0x0E38, 0x0E48, 0x0E49, 0x0EB8, 0x0062], NFKC: [0x0061, 0x0E38, 0x0E48, 0x0E49, 0x0EB8, 0x0062], NFKD: [0x0061, 0x0E38, 0x0E48, 0x0E49, 0x0EB8, 0x0062] }, +{ source: [0x0061, 0x0E49, 0x0EB8, 0x0E48, 0x0E38, 0x0062], NFC: [0x0061, 0x0E38, 0x0E49, 0x0E48, 0x0EB8, 0x0062], NFD: [0x0061, 0x0E38, 0x0E49, 0x0E48, 0x0EB8, 0x0062], NFKC: [0x0061, 0x0E38, 0x0E49, 0x0E48, 0x0EB8, 0x0062], NFKD: [0x0061, 0x0E38, 0x0E49, 0x0E48, 0x0EB8, 0x0062] }, +{ source: [0x0061, 0x0EB8, 0x0E48, 0x0E38, 0x0E4A, 0x0062], NFC: [0x0061, 0x0E38, 0x0E48, 0x0E4A, 0x0EB8, 0x0062], NFD: [0x0061, 0x0E38, 0x0E48, 0x0E4A, 0x0EB8, 0x0062], NFKC: [0x0061, 0x0E38, 0x0E48, 0x0E4A, 0x0EB8, 0x0062], NFKD: [0x0061, 0x0E38, 0x0E48, 0x0E4A, 0x0EB8, 0x0062] }, +{ source: [0x0061, 0x0E4A, 0x0EB8, 0x0E48, 0x0E38, 0x0062], NFC: [0x0061, 0x0E38, 0x0E4A, 0x0E48, 0x0EB8, 0x0062], NFD: [0x0061, 0x0E38, 0x0E4A, 0x0E48, 0x0EB8, 0x0062], NFKC: [0x0061, 0x0E38, 0x0E4A, 0x0E48, 0x0EB8, 0x0062], NFKD: [0x0061, 0x0E38, 0x0E4A, 0x0E48, 0x0EB8, 0x0062] }, +{ source: [0x0061, 0x0EB8, 0x0E48, 0x0E38, 0x0E4B, 0x0062], NFC: [0x0061, 0x0E38, 0x0E48, 0x0E4B, 0x0EB8, 0x0062], NFD: [0x0061, 0x0E38, 0x0E48, 0x0E4B, 0x0EB8, 0x0062], NFKC: [0x0061, 0x0E38, 0x0E48, 0x0E4B, 0x0EB8, 0x0062], NFKD: [0x0061, 0x0E38, 0x0E48, 0x0E4B, 0x0EB8, 0x0062] }, +{ source: [0x0061, 0x0E4B, 0x0EB8, 0x0E48, 0x0E38, 0x0062], NFC: [0x0061, 0x0E38, 0x0E4B, 0x0E48, 0x0EB8, 0x0062], NFD: [0x0061, 0x0E38, 0x0E4B, 0x0E48, 0x0EB8, 0x0062], NFKC: [0x0061, 0x0E38, 0x0E4B, 0x0E48, 0x0EB8, 0x0062], NFKD: [0x0061, 0x0E38, 0x0E4B, 0x0E48, 0x0EB8, 0x0062] }, +{ source: [0x0061, 0x0EC8, 0x0EB8, 0x0E48, 0x0EB8, 0x0062], NFC: [0x0061, 0x0E48, 0x0EB8, 0x0EB8, 0x0EC8, 0x0062], NFD: [0x0061, 0x0E48, 0x0EB8, 0x0EB8, 0x0EC8, 0x0062], NFKC: [0x0061, 0x0E48, 0x0EB8, 0x0EB8, 0x0EC8, 0x0062], NFKD: [0x0061, 0x0E48, 0x0EB8, 0x0EB8, 0x0EC8, 0x0062] }, +{ source: [0x0061, 0x0EB8, 0x0EC8, 0x0EB8, 0x0E48, 0x0062], NFC: [0x0061, 0x0E48, 0x0EB8, 0x0EB8, 0x0EC8, 0x0062], NFD: [0x0061, 0x0E48, 0x0EB8, 0x0EB8, 0x0EC8, 0x0062], NFKC: [0x0061, 0x0E48, 0x0EB8, 0x0EB8, 0x0EC8, 0x0062], NFKD: [0x0061, 0x0E48, 0x0EB8, 0x0EB8, 0x0EC8, 0x0062] }, +{ source: [0x0061, 0x0EC8, 0x0EB8, 0x0E48, 0x0EB9, 0x0062], NFC: [0x0061, 0x0E48, 0x0EB8, 0x0EB9, 0x0EC8, 0x0062], NFD: [0x0061, 0x0E48, 0x0EB8, 0x0EB9, 0x0EC8, 0x0062], NFKC: [0x0061, 0x0E48, 0x0EB8, 0x0EB9, 0x0EC8, 0x0062], NFKD: [0x0061, 0x0E48, 0x0EB8, 0x0EB9, 0x0EC8, 0x0062] }, +{ source: [0x0061, 0x0EB9, 0x0EC8, 0x0EB8, 0x0E48, 0x0062], NFC: [0x0061, 0x0E48, 0x0EB9, 0x0EB8, 0x0EC8, 0x0062], NFD: [0x0061, 0x0E48, 0x0EB9, 0x0EB8, 0x0EC8, 0x0062], NFKC: [0x0061, 0x0E48, 0x0EB9, 0x0EB8, 0x0EC8, 0x0062], NFKD: [0x0061, 0x0E48, 0x0EB9, 0x0EB8, 0x0EC8, 0x0062] }, +{ source: [0x0061, 0x05B0, 0x094D, 0x3099, 0x0EBA, 0x0062], NFC: [0x0061, 0x3099, 0x094D, 0x0EBA, 0x05B0, 0x0062], NFD: [0x0061, 0x3099, 0x094D, 0x0EBA, 0x05B0, 0x0062], NFKC: [0x0061, 0x3099, 0x094D, 0x0EBA, 0x05B0, 0x0062], NFKD: [0x0061, 0x3099, 0x094D, 0x0EBA, 0x05B0, 0x0062] }, +{ source: [0x0061, 0x0EBA, 0x05B0, 0x094D, 0x3099, 0x0062], NFC: [0x0061, 0x3099, 0x0EBA, 0x094D, 0x05B0, 0x0062], NFD: [0x0061, 0x3099, 0x0EBA, 0x094D, 0x05B0, 0x0062], NFKC: [0x0061, 0x3099, 0x0EBA, 0x094D, 0x05B0, 0x0062], NFKD: [0x0061, 0x3099, 0x0EBA, 0x094D, 0x05B0, 0x0062] }, +{ source: [0x0061, 0x0F71, 0x0EC8, 0x0EB8, 0x0EC8, 0x0062], NFC: [0x0061, 0x0EB8, 0x0EC8, 0x0EC8, 0x0F71, 0x0062], NFD: [0x0061, 0x0EB8, 0x0EC8, 0x0EC8, 0x0F71, 0x0062], NFKC: [0x0061, 0x0EB8, 0x0EC8, 0x0EC8, 0x0F71, 0x0062], NFKD: [0x0061, 0x0EB8, 0x0EC8, 0x0EC8, 0x0F71, 0x0062] }, +{ source: [0x0061, 0x0EC8, 0x0F71, 0x0EC8, 0x0EB8, 0x0062], NFC: [0x0061, 0x0EB8, 0x0EC8, 0x0EC8, 0x0F71, 0x0062], NFD: [0x0061, 0x0EB8, 0x0EC8, 0x0EC8, 0x0F71, 0x0062], NFKC: [0x0061, 0x0EB8, 0x0EC8, 0x0EC8, 0x0F71, 0x0062], NFKD: [0x0061, 0x0EB8, 0x0EC8, 0x0EC8, 0x0F71, 0x0062] }, +{ source: [0x0061, 0x0F71, 0x0EC8, 0x0EB8, 0x0EC9, 0x0062], NFC: [0x0061, 0x0EB8, 0x0EC8, 0x0EC9, 0x0F71, 0x0062], NFD: [0x0061, 0x0EB8, 0x0EC8, 0x0EC9, 0x0F71, 0x0062], NFKC: [0x0061, 0x0EB8, 0x0EC8, 0x0EC9, 0x0F71, 0x0062], NFKD: [0x0061, 0x0EB8, 0x0EC8, 0x0EC9, 0x0F71, 0x0062] }, +{ source: [0x0061, 0x0EC9, 0x0F71, 0x0EC8, 0x0EB8, 0x0062], NFC: [0x0061, 0x0EB8, 0x0EC9, 0x0EC8, 0x0F71, 0x0062], NFD: [0x0061, 0x0EB8, 0x0EC9, 0x0EC8, 0x0F71, 0x0062], NFKC: [0x0061, 0x0EB8, 0x0EC9, 0x0EC8, 0x0F71, 0x0062], NFKD: [0x0061, 0x0EB8, 0x0EC9, 0x0EC8, 0x0F71, 0x0062] }, +{ source: [0x0061, 0x0F71, 0x0EC8, 0x0EB8, 0x0ECA, 0x0062], NFC: [0x0061, 0x0EB8, 0x0EC8, 0x0ECA, 0x0F71, 0x0062], NFD: [0x0061, 0x0EB8, 0x0EC8, 0x0ECA, 0x0F71, 0x0062], NFKC: [0x0061, 0x0EB8, 0x0EC8, 0x0ECA, 0x0F71, 0x0062], NFKD: [0x0061, 0x0EB8, 0x0EC8, 0x0ECA, 0x0F71, 0x0062] }, +{ source: [0x0061, 0x0ECA, 0x0F71, 0x0EC8, 0x0EB8, 0x0062], NFC: [0x0061, 0x0EB8, 0x0ECA, 0x0EC8, 0x0F71, 0x0062], NFD: [0x0061, 0x0EB8, 0x0ECA, 0x0EC8, 0x0F71, 0x0062], NFKC: [0x0061, 0x0EB8, 0x0ECA, 0x0EC8, 0x0F71, 0x0062], NFKD: [0x0061, 0x0EB8, 0x0ECA, 0x0EC8, 0x0F71, 0x0062] }, +{ source: [0x0061, 0x0F71, 0x0EC8, 0x0EB8, 0x0ECB, 0x0062], NFC: [0x0061, 0x0EB8, 0x0EC8, 0x0ECB, 0x0F71, 0x0062], NFD: [0x0061, 0x0EB8, 0x0EC8, 0x0ECB, 0x0F71, 0x0062], NFKC: [0x0061, 0x0EB8, 0x0EC8, 0x0ECB, 0x0F71, 0x0062], NFKD: [0x0061, 0x0EB8, 0x0EC8, 0x0ECB, 0x0F71, 0x0062] }, +{ source: [0x0061, 0x0ECB, 0x0F71, 0x0EC8, 0x0EB8, 0x0062], NFC: [0x0061, 0x0EB8, 0x0ECB, 0x0EC8, 0x0F71, 0x0062], NFD: [0x0061, 0x0EB8, 0x0ECB, 0x0EC8, 0x0F71, 0x0062], NFKC: [0x0061, 0x0EB8, 0x0ECB, 0x0EC8, 0x0F71, 0x0062], NFKD: [0x0061, 0x0EB8, 0x0ECB, 0x0EC8, 0x0F71, 0x0062] }, +{ source: [0x0061, 0x059A, 0x0316, 0x1DFA, 0x0F18, 0x0062], NFC: [0x0061, 0x1DFA, 0x0316, 0x0F18, 0x059A, 0x0062], NFD: [0x0061, 0x1DFA, 0x0316, 0x0F18, 0x059A, 0x0062], NFKC: [0x0061, 0x1DFA, 0x0316, 0x0F18, 0x059A, 0x0062], NFKD: [0x0061, 0x1DFA, 0x0316, 0x0F18, 0x059A, 0x0062] }, +{ source: [0x0061, 0x0F18, 0x059A, 0x0316, 0x1DFA, 0x0062], NFC: [0x0061, 0x1DFA, 0x0F18, 0x0316, 0x059A, 0x0062], NFD: [0x0061, 0x1DFA, 0x0F18, 0x0316, 0x059A, 0x0062], NFKC: [0x0061, 0x1DFA, 0x0F18, 0x0316, 0x059A, 0x0062], NFKD: [0x0061, 0x1DFA, 0x0F18, 0x0316, 0x059A, 0x0062] }, +{ source: [0x0061, 0x059A, 0x0316, 0x1DFA, 0x0F19, 0x0062], NFC: [0x0061, 0x1DFA, 0x0316, 0x0F19, 0x059A, 0x0062], NFD: [0x0061, 0x1DFA, 0x0316, 0x0F19, 0x059A, 0x0062], NFKC: [0x0061, 0x1DFA, 0x0316, 0x0F19, 0x059A, 0x0062], NFKD: [0x0061, 0x1DFA, 0x0316, 0x0F19, 0x059A, 0x0062] }, +{ source: [0x0061, 0x0F19, 0x059A, 0x0316, 0x1DFA, 0x0062], NFC: [0x0061, 0x1DFA, 0x0F19, 0x0316, 0x059A, 0x0062], NFD: [0x0061, 0x1DFA, 0x0F19, 0x0316, 0x059A, 0x0062], NFKC: [0x0061, 0x1DFA, 0x0F19, 0x0316, 0x059A, 0x0062], NFKD: [0x0061, 0x1DFA, 0x0F19, 0x0316, 0x059A, 0x0062] }, +{ source: [0x0061, 0x059A, 0x0316, 0x1DFA, 0x0F35, 0x0062], NFC: [0x0061, 0x1DFA, 0x0316, 0x0F35, 0x059A, 0x0062], NFD: [0x0061, 0x1DFA, 0x0316, 0x0F35, 0x059A, 0x0062], NFKC: [0x0061, 0x1DFA, 0x0316, 0x0F35, 0x059A, 0x0062], NFKD: [0x0061, 0x1DFA, 0x0316, 0x0F35, 0x059A, 0x0062] }, +{ source: [0x0061, 0x0F35, 0x059A, 0x0316, 0x1DFA, 0x0062], NFC: [0x0061, 0x1DFA, 0x0F35, 0x0316, 0x059A, 0x0062], NFD: [0x0061, 0x1DFA, 0x0F35, 0x0316, 0x059A, 0x0062], NFKC: [0x0061, 0x1DFA, 0x0F35, 0x0316, 0x059A, 0x0062], NFKD: [0x0061, 0x1DFA, 0x0F35, 0x0316, 0x059A, 0x0062] }, +{ source: [0x0061, 0x059A, 0x0316, 0x1DFA, 0x0F37, 0x0062], NFC: [0x0061, 0x1DFA, 0x0316, 0x0F37, 0x059A, 0x0062], NFD: [0x0061, 0x1DFA, 0x0316, 0x0F37, 0x059A, 0x0062], NFKC: [0x0061, 0x1DFA, 0x0316, 0x0F37, 0x059A, 0x0062], NFKD: [0x0061, 0x1DFA, 0x0316, 0x0F37, 0x059A, 0x0062] }, +{ source: [0x0061, 0x0F37, 0x059A, 0x0316, 0x1DFA, 0x0062], NFC: [0x0061, 0x1DFA, 0x0F37, 0x0316, 0x059A, 0x0062], NFD: [0x0061, 0x1DFA, 0x0F37, 0x0316, 0x059A, 0x0062], NFKC: [0x0061, 0x1DFA, 0x0F37, 0x0316, 0x059A, 0x0062], NFKD: [0x0061, 0x1DFA, 0x0F37, 0x0316, 0x059A, 0x0062] }, +{ source: [0x0061, 0x1DFA, 0x031B, 0x1DCE, 0x0F39, 0x0062], NFC: [0x0061, 0x1DCE, 0x031B, 0x0F39, 0x1DFA, 0x0062], NFD: [0x0061, 0x1DCE, 0x031B, 0x0F39, 0x1DFA, 0x0062], NFKC: [0x0061, 0x1DCE, 0x031B, 0x0F39, 0x1DFA, 0x0062], NFKD: [0x0061, 0x1DCE, 0x031B, 0x0F39, 0x1DFA, 0x0062] }, +{ source: [0x0061, 0x0F39, 0x1DFA, 0x031B, 0x1DCE, 0x0062], NFC: [0x0061, 0x1DCE, 0x0F39, 0x031B, 0x1DFA, 0x0062], NFD: [0x0061, 0x1DCE, 0x0F39, 0x031B, 0x1DFA, 0x0062], NFKC: [0x0061, 0x1DCE, 0x0F39, 0x031B, 0x1DFA, 0x0062], NFKD: [0x0061, 0x1DCE, 0x0F39, 0x031B, 0x1DFA, 0x0062] }, +{ source: [0x0061, 0x0F72, 0x0F71, 0x0EC8, 0x0F71, 0x0062], NFC: [0x0061, 0x0EC8, 0x0F71, 0x0F71, 0x0F72, 0x0062], NFD: [0x0061, 0x0EC8, 0x0F71, 0x0F71, 0x0F72, 0x0062], NFKC: [0x0061, 0x0EC8, 0x0F71, 0x0F71, 0x0F72, 0x0062], NFKD: [0x0061, 0x0EC8, 0x0F71, 0x0F71, 0x0F72, 0x0062] }, +{ source: [0x0061, 0x0F71, 0x0F72, 0x0F71, 0x0EC8, 0x0062], NFC: [0x0061, 0x0EC8, 0x0F71, 0x0F71, 0x0F72, 0x0062], NFD: [0x0061, 0x0EC8, 0x0F71, 0x0F71, 0x0F72, 0x0062], NFKC: [0x0061, 0x0EC8, 0x0F71, 0x0F71, 0x0F72, 0x0062], NFKD: [0x0061, 0x0EC8, 0x0F71, 0x0F71, 0x0F72, 0x0062] }, +{ source: [0x0061, 0x0F74, 0x0F72, 0x0F71, 0x0F72, 0x0062], NFC: [0x0061, 0x0F71, 0x0F72, 0x0F72, 0x0F74, 0x0062], NFD: [0x0061, 0x0F71, 0x0F72, 0x0F72, 0x0F74, 0x0062], NFKC: [0x0061, 0x0F71, 0x0F72, 0x0F72, 0x0F74, 0x0062], NFKD: [0x0061, 0x0F71, 0x0F72, 0x0F72, 0x0F74, 0x0062] }, +{ source: [0x0061, 0x0F72, 0x0F74, 0x0F72, 0x0F71, 0x0062], NFC: [0x0061, 0x0F71, 0x0F72, 0x0F72, 0x0F74, 0x0062], NFD: [0x0061, 0x0F71, 0x0F72, 0x0F72, 0x0F74, 0x0062], NFKC: [0x0061, 0x0F71, 0x0F72, 0x0F72, 0x0F74, 0x0062], NFKD: [0x0061, 0x0F71, 0x0F72, 0x0F72, 0x0F74, 0x0062] }, +{ source: [0x0061, 0x0321, 0x0F74, 0x0F72, 0x0F74, 0x0062], NFC: [0x0061, 0x0F72, 0x0F74, 0x0F74, 0x0321, 0x0062], NFD: [0x0061, 0x0F72, 0x0F74, 0x0F74, 0x0321, 0x0062], NFKC: [0x0061, 0x0F72, 0x0F74, 0x0F74, 0x0321, 0x0062], NFKD: [0x0061, 0x0F72, 0x0F74, 0x0F74, 0x0321, 0x0062] }, +{ source: [0x0061, 0x0F74, 0x0321, 0x0F74, 0x0F72, 0x0062], NFC: [0x0061, 0x0F72, 0x0F74, 0x0F74, 0x0321, 0x0062], NFD: [0x0061, 0x0F72, 0x0F74, 0x0F74, 0x0321, 0x0062], NFKC: [0x0061, 0x0F72, 0x0F74, 0x0F74, 0x0321, 0x0062], NFKD: [0x0061, 0x0F72, 0x0F74, 0x0F74, 0x0321, 0x0062] }, +{ source: [0x0061, 0x0F74, 0x0F72, 0x0F71, 0x0F7A, 0x0062], NFC: [0x0061, 0x0F71, 0x0F72, 0x0F7A, 0x0F74, 0x0062], NFD: [0x0061, 0x0F71, 0x0F72, 0x0F7A, 0x0F74, 0x0062], NFKC: [0x0061, 0x0F71, 0x0F72, 0x0F7A, 0x0F74, 0x0062], NFKD: [0x0061, 0x0F71, 0x0F72, 0x0F7A, 0x0F74, 0x0062] }, +{ source: [0x0061, 0x0F7A, 0x0F74, 0x0F72, 0x0F71, 0x0062], NFC: [0x0061, 0x0F71, 0x0F7A, 0x0F72, 0x0F74, 0x0062], NFD: [0x0061, 0x0F71, 0x0F7A, 0x0F72, 0x0F74, 0x0062], NFKC: [0x0061, 0x0F71, 0x0F7A, 0x0F72, 0x0F74, 0x0062], NFKD: [0x0061, 0x0F71, 0x0F7A, 0x0F72, 0x0F74, 0x0062] }, +{ source: [0x0061, 0x0F74, 0x0F72, 0x0F71, 0x0F7B, 0x0062], NFC: [0x0061, 0x0F71, 0x0F72, 0x0F7B, 0x0F74, 0x0062], NFD: [0x0061, 0x0F71, 0x0F72, 0x0F7B, 0x0F74, 0x0062], NFKC: [0x0061, 0x0F71, 0x0F72, 0x0F7B, 0x0F74, 0x0062], NFKD: [0x0061, 0x0F71, 0x0F72, 0x0F7B, 0x0F74, 0x0062] }, +{ source: [0x0061, 0x0F7B, 0x0F74, 0x0F72, 0x0F71, 0x0062], NFC: [0x0061, 0x0F71, 0x0F7B, 0x0F72, 0x0F74, 0x0062], NFD: [0x0061, 0x0F71, 0x0F7B, 0x0F72, 0x0F74, 0x0062], NFKC: [0x0061, 0x0F71, 0x0F7B, 0x0F72, 0x0F74, 0x0062], NFKD: [0x0061, 0x0F71, 0x0F7B, 0x0F72, 0x0F74, 0x0062] }, +{ source: [0x0061, 0x0F74, 0x0F72, 0x0F71, 0x0F7C, 0x0062], NFC: [0x0061, 0x0F71, 0x0F72, 0x0F7C, 0x0F74, 0x0062], NFD: [0x0061, 0x0F71, 0x0F72, 0x0F7C, 0x0F74, 0x0062], NFKC: [0x0061, 0x0F71, 0x0F72, 0x0F7C, 0x0F74, 0x0062], NFKD: [0x0061, 0x0F71, 0x0F72, 0x0F7C, 0x0F74, 0x0062] }, +{ source: [0x0061, 0x0F7C, 0x0F74, 0x0F72, 0x0F71, 0x0062], NFC: [0x0061, 0x0F71, 0x0F7C, 0x0F72, 0x0F74, 0x0062], NFD: [0x0061, 0x0F71, 0x0F7C, 0x0F72, 0x0F74, 0x0062], NFKC: [0x0061, 0x0F71, 0x0F7C, 0x0F72, 0x0F74, 0x0062], NFKD: [0x0061, 0x0F71, 0x0F7C, 0x0F72, 0x0F74, 0x0062] }, +{ source: [0x0061, 0x0F74, 0x0F72, 0x0F71, 0x0F7D, 0x0062], NFC: [0x0061, 0x0F71, 0x0F72, 0x0F7D, 0x0F74, 0x0062], NFD: [0x0061, 0x0F71, 0x0F72, 0x0F7D, 0x0F74, 0x0062], NFKC: [0x0061, 0x0F71, 0x0F72, 0x0F7D, 0x0F74, 0x0062], NFKD: [0x0061, 0x0F71, 0x0F72, 0x0F7D, 0x0F74, 0x0062] }, +{ source: [0x0061, 0x0F7D, 0x0F74, 0x0F72, 0x0F71, 0x0062], NFC: [0x0061, 0x0F71, 0x0F7D, 0x0F72, 0x0F74, 0x0062], NFD: [0x0061, 0x0F71, 0x0F7D, 0x0F72, 0x0F74, 0x0062], NFKC: [0x0061, 0x0F71, 0x0F7D, 0x0F72, 0x0F74, 0x0062], NFKD: [0x0061, 0x0F71, 0x0F7D, 0x0F72, 0x0F74, 0x0062] }, +{ source: [0x0061, 0x0F74, 0x0F72, 0x0F71, 0x0F80, 0x0062], NFC: [0x0061, 0x0F71, 0x0F72, 0x0F80, 0x0F74, 0x0062], NFD: [0x0061, 0x0F71, 0x0F72, 0x0F80, 0x0F74, 0x0062], NFKC: [0x0061, 0x0F71, 0x0F72, 0x0F80, 0x0F74, 0x0062], NFKD: [0x0061, 0x0F71, 0x0F72, 0x0F80, 0x0F74, 0x0062] }, +{ source: [0x0061, 0x0F80, 0x0F74, 0x0F72, 0x0F71, 0x0062], NFC: [0x0061, 0x0F71, 0x0F80, 0x0F72, 0x0F74, 0x0062], NFD: [0x0061, 0x0F71, 0x0F80, 0x0F72, 0x0F74, 0x0062], NFKC: [0x0061, 0x0F71, 0x0F80, 0x0F72, 0x0F74, 0x0062], NFKD: [0x0061, 0x0F71, 0x0F80, 0x0F72, 0x0F74, 0x0062] }, +{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x0F82, 0x0062], NFC: [0x00E0, 0x05AE, 0x0F82, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x0F82, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x0F82, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x0F82, 0x0315, 0x0062] }, +{ source: [0x0061, 0x0F82, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x0F82, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0F82, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x0F82, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0F82, 0x0300, 0x0315, 0x0062] }, +{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x0F83, 0x0062], NFC: [0x00E0, 0x05AE, 0x0F83, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x0F83, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x0F83, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x0F83, 0x0315, 0x0062] }, +{ source: [0x0061, 0x0F83, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x0F83, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0F83, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x0F83, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0F83, 0x0300, 0x0315, 0x0062] }, +{ source: [0x0061, 0x05B0, 0x094D, 0x3099, 0x0F84, 0x0062], NFC: [0x0061, 0x3099, 0x094D, 0x0F84, 0x05B0, 0x0062], NFD: [0x0061, 0x3099, 0x094D, 0x0F84, 0x05B0, 0x0062], NFKC: [0x0061, 0x3099, 0x094D, 0x0F84, 0x05B0, 0x0062], NFKD: [0x0061, 0x3099, 0x094D, 0x0F84, 0x05B0, 0x0062] }, +{ source: [0x0061, 0x0F84, 0x05B0, 0x094D, 0x3099, 0x0062], NFC: [0x0061, 0x3099, 0x0F84, 0x094D, 0x05B0, 0x0062], NFD: [0x0061, 0x3099, 0x0F84, 0x094D, 0x05B0, 0x0062], NFKC: [0x0061, 0x3099, 0x0F84, 0x094D, 0x05B0, 0x0062], NFKD: [0x0061, 0x3099, 0x0F84, 0x094D, 0x05B0, 0x0062] }, +{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x0F86, 0x0062], NFC: [0x00E0, 0x05AE, 0x0F86, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x0F86, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x0F86, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x0F86, 0x0315, 0x0062] }, +{ source: [0x0061, 0x0F86, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x0F86, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0F86, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x0F86, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0F86, 0x0300, 0x0315, 0x0062] }, +{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x0F87, 0x0062], NFC: [0x00E0, 0x05AE, 0x0F87, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x0F87, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x0F87, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x0F87, 0x0315, 0x0062] }, +{ source: [0x0061, 0x0F87, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x0F87, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0F87, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x0F87, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0F87, 0x0300, 0x0315, 0x0062] }, +{ source: [0x0061, 0x059A, 0x0316, 0x1DFA, 0x0FC6, 0x0062], NFC: [0x0061, 0x1DFA, 0x0316, 0x0FC6, 0x059A, 0x0062], NFD: [0x0061, 0x1DFA, 0x0316, 0x0FC6, 0x059A, 0x0062], NFKC: [0x0061, 0x1DFA, 0x0316, 0x0FC6, 0x059A, 0x0062], NFKD: [0x0061, 0x1DFA, 0x0316, 0x0FC6, 0x059A, 0x0062] }, +{ source: [0x0061, 0x0FC6, 0x059A, 0x0316, 0x1DFA, 0x0062], NFC: [0x0061, 0x1DFA, 0x0FC6, 0x0316, 0x059A, 0x0062], NFD: [0x0061, 0x1DFA, 0x0FC6, 0x0316, 0x059A, 0x0062], NFKC: [0x0061, 0x1DFA, 0x0FC6, 0x0316, 0x059A, 0x0062], NFKD: [0x0061, 0x1DFA, 0x0FC6, 0x0316, 0x059A, 0x0062] }, +{ source: [0x0061, 0x3099, 0x093C, 0x16FF0, 0x1037, 0x0062], NFC: [0x0061, 0x16FF0, 0x093C, 0x1037, 0x3099, 0x0062], NFD: [0x0061, 0x16FF0, 0x093C, 0x1037, 0x3099, 0x0062], NFKC: [0x0061, 0x16FF0, 0x093C, 0x1037, 0x3099, 0x0062], NFKD: [0x0061, 0x16FF0, 0x093C, 0x1037, 0x3099, 0x0062] }, +{ source: [0x0061, 0x1037, 0x3099, 0x093C, 0x16FF0, 0x0062], NFC: [0x0061, 0x16FF0, 0x1037, 0x093C, 0x3099, 0x0062], NFD: [0x0061, 0x16FF0, 0x1037, 0x093C, 0x3099, 0x0062], NFKC: [0x0061, 0x16FF0, 0x1037, 0x093C, 0x3099, 0x0062], NFKD: [0x0061, 0x16FF0, 0x1037, 0x093C, 0x3099, 0x0062] }, +{ source: [0x0061, 0x05B0, 0x094D, 0x3099, 0x1039, 0x0062], NFC: [0x0061, 0x3099, 0x094D, 0x1039, 0x05B0, 0x0062], NFD: [0x0061, 0x3099, 0x094D, 0x1039, 0x05B0, 0x0062], NFKC: [0x0061, 0x3099, 0x094D, 0x1039, 0x05B0, 0x0062], NFKD: [0x0061, 0x3099, 0x094D, 0x1039, 0x05B0, 0x0062] }, +{ source: [0x0061, 0x1039, 0x05B0, 0x094D, 0x3099, 0x0062], NFC: [0x0061, 0x3099, 0x1039, 0x094D, 0x05B0, 0x0062], NFD: [0x0061, 0x3099, 0x1039, 0x094D, 0x05B0, 0x0062], NFKC: [0x0061, 0x3099, 0x1039, 0x094D, 0x05B0, 0x0062], NFKD: [0x0061, 0x3099, 0x1039, 0x094D, 0x05B0, 0x0062] }, +{ source: [0x0061, 0x05B0, 0x094D, 0x3099, 0x103A, 0x0062], NFC: [0x0061, 0x3099, 0x094D, 0x103A, 0x05B0, 0x0062], NFD: [0x0061, 0x3099, 0x094D, 0x103A, 0x05B0, 0x0062], NFKC: [0x0061, 0x3099, 0x094D, 0x103A, 0x05B0, 0x0062], NFKD: [0x0061, 0x3099, 0x094D, 0x103A, 0x05B0, 0x0062] }, +{ source: [0x0061, 0x103A, 0x05B0, 0x094D, 0x3099, 0x0062], NFC: [0x0061, 0x3099, 0x103A, 0x094D, 0x05B0, 0x0062], NFD: [0x0061, 0x3099, 0x103A, 0x094D, 0x05B0, 0x0062], NFKC: [0x0061, 0x3099, 0x103A, 0x094D, 0x05B0, 0x0062], NFKD: [0x0061, 0x3099, 0x103A, 0x094D, 0x05B0, 0x0062] }, +{ source: [0x0061, 0x059A, 0x0316, 0x1DFA, 0x108D, 0x0062], NFC: [0x0061, 0x1DFA, 0x0316, 0x108D, 0x059A, 0x0062], NFD: [0x0061, 0x1DFA, 0x0316, 0x108D, 0x059A, 0x0062], NFKC: [0x0061, 0x1DFA, 0x0316, 0x108D, 0x059A, 0x0062], NFKD: [0x0061, 0x1DFA, 0x0316, 0x108D, 0x059A, 0x0062] }, +{ source: [0x0061, 0x108D, 0x059A, 0x0316, 0x1DFA, 0x0062], NFC: [0x0061, 0x1DFA, 0x108D, 0x0316, 0x059A, 0x0062], NFD: [0x0061, 0x1DFA, 0x108D, 0x0316, 0x059A, 0x0062], NFKC: [0x0061, 0x1DFA, 0x108D, 0x0316, 0x059A, 0x0062], NFKD: [0x0061, 0x1DFA, 0x108D, 0x0316, 0x059A, 0x0062] }, +{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x135D, 0x0062], NFC: [0x00E0, 0x05AE, 0x135D, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x135D, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x135D, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x135D, 0x0315, 0x0062] }, +{ source: [0x0061, 0x135D, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x135D, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x135D, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x135D, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x135D, 0x0300, 0x0315, 0x0062] }, +{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x135E, 0x0062], NFC: [0x00E0, 0x05AE, 0x135E, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x135E, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x135E, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x135E, 0x0315, 0x0062] }, +{ source: [0x0061, 0x135E, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x135E, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x135E, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x135E, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x135E, 0x0300, 0x0315, 0x0062] }, +{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x135F, 0x0062], NFC: [0x00E0, 0x05AE, 0x135F, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x135F, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x135F, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x135F, 0x0315, 0x0062] }, +{ source: [0x0061, 0x135F, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x135F, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x135F, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x135F, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x135F, 0x0300, 0x0315, 0x0062] }, +{ source: [0x0061, 0x05B0, 0x094D, 0x3099, 0x1714, 0x0062], NFC: [0x0061, 0x3099, 0x094D, 0x1714, 0x05B0, 0x0062], NFD: [0x0061, 0x3099, 0x094D, 0x1714, 0x05B0, 0x0062], NFKC: [0x0061, 0x3099, 0x094D, 0x1714, 0x05B0, 0x0062], NFKD: [0x0061, 0x3099, 0x094D, 0x1714, 0x05B0, 0x0062] }, +{ source: [0x0061, 0x1714, 0x05B0, 0x094D, 0x3099, 0x0062], NFC: [0x0061, 0x3099, 0x1714, 0x094D, 0x05B0, 0x0062], NFD: [0x0061, 0x3099, 0x1714, 0x094D, 0x05B0, 0x0062], NFKC: [0x0061, 0x3099, 0x1714, 0x094D, 0x05B0, 0x0062], NFKD: [0x0061, 0x3099, 0x1714, 0x094D, 0x05B0, 0x0062] }, +{ source: [0x0061, 0x05B0, 0x094D, 0x3099, 0x1715, 0x0062], NFC: [0x0061, 0x3099, 0x094D, 0x1715, 0x05B0, 0x0062], NFD: [0x0061, 0x3099, 0x094D, 0x1715, 0x05B0, 0x0062], NFKC: [0x0061, 0x3099, 0x094D, 0x1715, 0x05B0, 0x0062], NFKD: [0x0061, 0x3099, 0x094D, 0x1715, 0x05B0, 0x0062] }, +{ source: [0x0061, 0x1715, 0x05B0, 0x094D, 0x3099, 0x0062], NFC: [0x0061, 0x3099, 0x1715, 0x094D, 0x05B0, 0x0062], NFD: [0x0061, 0x3099, 0x1715, 0x094D, 0x05B0, 0x0062], NFKC: [0x0061, 0x3099, 0x1715, 0x094D, 0x05B0, 0x0062], NFKD: [0x0061, 0x3099, 0x1715, 0x094D, 0x05B0, 0x0062] }, +{ source: [0x0061, 0x05B0, 0x094D, 0x3099, 0x1734, 0x0062], NFC: [0x0061, 0x3099, 0x094D, 0x1734, 0x05B0, 0x0062], NFD: [0x0061, 0x3099, 0x094D, 0x1734, 0x05B0, 0x0062], NFKC: [0x0061, 0x3099, 0x094D, 0x1734, 0x05B0, 0x0062], NFKD: [0x0061, 0x3099, 0x094D, 0x1734, 0x05B0, 0x0062] }, +{ source: [0x0061, 0x1734, 0x05B0, 0x094D, 0x3099, 0x0062], NFC: [0x0061, 0x3099, 0x1734, 0x094D, 0x05B0, 0x0062], NFD: [0x0061, 0x3099, 0x1734, 0x094D, 0x05B0, 0x0062], NFKC: [0x0061, 0x3099, 0x1734, 0x094D, 0x05B0, 0x0062], NFKD: [0x0061, 0x3099, 0x1734, 0x094D, 0x05B0, 0x0062] }, +{ source: [0x0061, 0x05B0, 0x094D, 0x3099, 0x17D2, 0x0062], NFC: [0x0061, 0x3099, 0x094D, 0x17D2, 0x05B0, 0x0062], NFD: [0x0061, 0x3099, 0x094D, 0x17D2, 0x05B0, 0x0062], NFKC: [0x0061, 0x3099, 0x094D, 0x17D2, 0x05B0, 0x0062], NFKD: [0x0061, 0x3099, 0x094D, 0x17D2, 0x05B0, 0x0062] }, +{ source: [0x0061, 0x17D2, 0x05B0, 0x094D, 0x3099, 0x0062], NFC: [0x0061, 0x3099, 0x17D2, 0x094D, 0x05B0, 0x0062], NFD: [0x0061, 0x3099, 0x17D2, 0x094D, 0x05B0, 0x0062], NFKC: [0x0061, 0x3099, 0x17D2, 0x094D, 0x05B0, 0x0062], NFKD: [0x0061, 0x3099, 0x17D2, 0x094D, 0x05B0, 0x0062] }, +{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x17DD, 0x0062], NFC: [0x00E0, 0x05AE, 0x17DD, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x17DD, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x17DD, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x17DD, 0x0315, 0x0062] }, +{ source: [0x0061, 0x17DD, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x17DD, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x17DD, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x17DD, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x17DD, 0x0300, 0x0315, 0x0062] }, +{ source: [0x0061, 0x0300, 0x05AE, 0x1D16D, 0x18A9, 0x0062], NFC: [0x00E0, 0x1D16D, 0x05AE, 0x18A9, 0x0062], NFD: [0x0061, 0x1D16D, 0x05AE, 0x18A9, 0x0300, 0x0062], NFKC: [0x00E0, 0x1D16D, 0x05AE, 0x18A9, 0x0062], NFKD: [0x0061, 0x1D16D, 0x05AE, 0x18A9, 0x0300, 0x0062] }, +{ source: [0x0061, 0x18A9, 0x0300, 0x05AE, 0x1D16D, 0x0062], NFC: [0x00E0, 0x1D16D, 0x18A9, 0x05AE, 0x0062], NFD: [0x0061, 0x1D16D, 0x18A9, 0x05AE, 0x0300, 0x0062], NFKC: [0x00E0, 0x1D16D, 0x18A9, 0x05AE, 0x0062], NFKD: [0x0061, 0x1D16D, 0x18A9, 0x05AE, 0x0300, 0x0062] }, +{ source: [0x0061, 0x302E, 0x059A, 0x0316, 0x1939, 0x0062], NFC: [0x0061, 0x0316, 0x059A, 0x1939, 0x302E, 0x0062], NFD: [0x0061, 0x0316, 0x059A, 0x1939, 0x302E, 0x0062], NFKC: [0x0061, 0x0316, 0x059A, 0x1939, 0x302E, 0x0062], NFKD: [0x0061, 0x0316, 0x059A, 0x1939, 0x302E, 0x0062] }, +{ source: [0x0061, 0x1939, 0x302E, 0x059A, 0x0316, 0x0062], NFC: [0x0061, 0x0316, 0x1939, 0x059A, 0x302E, 0x0062], NFD: [0x0061, 0x0316, 0x1939, 0x059A, 0x302E, 0x0062], NFKC: [0x0061, 0x0316, 0x1939, 0x059A, 0x302E, 0x0062], NFKD: [0x0061, 0x0316, 0x1939, 0x059A, 0x302E, 0x0062] }, +{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x193A, 0x0062], NFC: [0x00E0, 0x05AE, 0x193A, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x193A, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x193A, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x193A, 0x0315, 0x0062] }, +{ source: [0x0061, 0x193A, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x193A, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x193A, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x193A, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x193A, 0x0300, 0x0315, 0x0062] }, +{ source: [0x0061, 0x059A, 0x0316, 0x1DFA, 0x193B, 0x0062], NFC: [0x0061, 0x1DFA, 0x0316, 0x193B, 0x059A, 0x0062], NFD: [0x0061, 0x1DFA, 0x0316, 0x193B, 0x059A, 0x0062], NFKC: [0x0061, 0x1DFA, 0x0316, 0x193B, 0x059A, 0x0062], NFKD: [0x0061, 0x1DFA, 0x0316, 0x193B, 0x059A, 0x0062] }, +{ source: [0x0061, 0x193B, 0x059A, 0x0316, 0x1DFA, 0x0062], NFC: [0x0061, 0x1DFA, 0x193B, 0x0316, 0x059A, 0x0062], NFD: [0x0061, 0x1DFA, 0x193B, 0x0316, 0x059A, 0x0062], NFKC: [0x0061, 0x1DFA, 0x193B, 0x0316, 0x059A, 0x0062], NFKD: [0x0061, 0x1DFA, 0x193B, 0x0316, 0x059A, 0x0062] }, +{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x1A17, 0x0062], NFC: [0x00E0, 0x05AE, 0x1A17, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x1A17, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x1A17, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x1A17, 0x0315, 0x0062] }, +{ source: [0x0061, 0x1A17, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x1A17, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x1A17, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x1A17, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x1A17, 0x0300, 0x0315, 0x0062] }, +{ source: [0x0061, 0x059A, 0x0316, 0x1DFA, 0x1A18, 0x0062], NFC: [0x0061, 0x1DFA, 0x0316, 0x1A18, 0x059A, 0x0062], NFD: [0x0061, 0x1DFA, 0x0316, 0x1A18, 0x059A, 0x0062], NFKC: [0x0061, 0x1DFA, 0x0316, 0x1A18, 0x059A, 0x0062], NFKD: [0x0061, 0x1DFA, 0x0316, 0x1A18, 0x059A, 0x0062] }, +{ source: [0x0061, 0x1A18, 0x059A, 0x0316, 0x1DFA, 0x0062], NFC: [0x0061, 0x1DFA, 0x1A18, 0x0316, 0x059A, 0x0062], NFD: [0x0061, 0x1DFA, 0x1A18, 0x0316, 0x059A, 0x0062], NFKC: [0x0061, 0x1DFA, 0x1A18, 0x0316, 0x059A, 0x0062], NFKD: [0x0061, 0x1DFA, 0x1A18, 0x0316, 0x059A, 0x0062] }, +{ source: [0x0061, 0x05B0, 0x094D, 0x3099, 0x1A60, 0x0062], NFC: [0x0061, 0x3099, 0x094D, 0x1A60, 0x05B0, 0x0062], NFD: [0x0061, 0x3099, 0x094D, 0x1A60, 0x05B0, 0x0062], NFKC: [0x0061, 0x3099, 0x094D, 0x1A60, 0x05B0, 0x0062], NFKD: [0x0061, 0x3099, 0x094D, 0x1A60, 0x05B0, 0x0062] }, +{ source: [0x0061, 0x1A60, 0x05B0, 0x094D, 0x3099, 0x0062], NFC: [0x0061, 0x3099, 0x1A60, 0x094D, 0x05B0, 0x0062], NFD: [0x0061, 0x3099, 0x1A60, 0x094D, 0x05B0, 0x0062], NFKC: [0x0061, 0x3099, 0x1A60, 0x094D, 0x05B0, 0x0062], NFKD: [0x0061, 0x3099, 0x1A60, 0x094D, 0x05B0, 0x0062] }, +{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x1A75, 0x0062], NFC: [0x00E0, 0x05AE, 0x1A75, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x1A75, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x1A75, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x1A75, 0x0315, 0x0062] }, +{ source: [0x0061, 0x1A75, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x1A75, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x1A75, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x1A75, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x1A75, 0x0300, 0x0315, 0x0062] }, +{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x1A76, 0x0062], NFC: [0x00E0, 0x05AE, 0x1A76, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x1A76, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x1A76, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x1A76, 0x0315, 0x0062] }, +{ source: [0x0061, 0x1A76, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x1A76, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x1A76, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x1A76, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x1A76, 0x0300, 0x0315, 0x0062] }, +{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x1A77, 0x0062], NFC: [0x00E0, 0x05AE, 0x1A77, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x1A77, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x1A77, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x1A77, 0x0315, 0x0062] }, +{ source: [0x0061, 0x1A77, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x1A77, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x1A77, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x1A77, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x1A77, 0x0300, 0x0315, 0x0062] }, +{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x1A78, 0x0062], NFC: [0x00E0, 0x05AE, 0x1A78, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x1A78, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x1A78, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x1A78, 0x0315, 0x0062] }, +{ source: [0x0061, 0x1A78, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x1A78, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x1A78, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x1A78, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x1A78, 0x0300, 0x0315, 0x0062] }, +{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x1A79, 0x0062], NFC: [0x00E0, 0x05AE, 0x1A79, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x1A79, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x1A79, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x1A79, 0x0315, 0x0062] }, +{ source: [0x0061, 0x1A79, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x1A79, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x1A79, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x1A79, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x1A79, 0x0300, 0x0315, 0x0062] }, +{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x1A7A, 0x0062], NFC: [0x00E0, 0x05AE, 0x1A7A, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x1A7A, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x1A7A, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x1A7A, 0x0315, 0x0062] }, +{ source: [0x0061, 0x1A7A, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x1A7A, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x1A7A, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x1A7A, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x1A7A, 0x0300, 0x0315, 0x0062] }, +{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x1A7B, 0x0062], NFC: [0x00E0, 0x05AE, 0x1A7B, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x1A7B, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x1A7B, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x1A7B, 0x0315, 0x0062] }, +{ source: [0x0061, 0x1A7B, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x1A7B, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x1A7B, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x1A7B, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x1A7B, 0x0300, 0x0315, 0x0062] }, +{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x1A7C, 0x0062], NFC: [0x00E0, 0x05AE, 0x1A7C, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x1A7C, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x1A7C, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x1A7C, 0x0315, 0x0062] }, +{ source: [0x0061, 0x1A7C, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x1A7C, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x1A7C, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x1A7C, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x1A7C, 0x0300, 0x0315, 0x0062] }, +{ source: [0x0061, 0x059A, 0x0316, 0x1DFA, 0x1A7F, 0x0062], NFC: [0x0061, 0x1DFA, 0x0316, 0x1A7F, 0x059A, 0x0062], NFD: [0x0061, 0x1DFA, 0x0316, 0x1A7F, 0x059A, 0x0062], NFKC: [0x0061, 0x1DFA, 0x0316, 0x1A7F, 0x059A, 0x0062], NFKD: [0x0061, 0x1DFA, 0x0316, 0x1A7F, 0x059A, 0x0062] }, +{ source: [0x0061, 0x1A7F, 0x059A, 0x0316, 0x1DFA, 0x0062], NFC: [0x0061, 0x1DFA, 0x1A7F, 0x0316, 0x059A, 0x0062], NFD: [0x0061, 0x1DFA, 0x1A7F, 0x0316, 0x059A, 0x0062], NFKC: [0x0061, 0x1DFA, 0x1A7F, 0x0316, 0x059A, 0x0062], NFKD: [0x0061, 0x1DFA, 0x1A7F, 0x0316, 0x059A, 0x0062] }, +{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x1AB0, 0x0062], NFC: [0x00E0, 0x05AE, 0x1AB0, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x1AB0, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x1AB0, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x1AB0, 0x0315, 0x0062] }, +{ source: [0x0061, 0x1AB0, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x1AB0, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x1AB0, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x1AB0, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x1AB0, 0x0300, 0x0315, 0x0062] }, +{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x1AB1, 0x0062], NFC: [0x00E0, 0x05AE, 0x1AB1, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x1AB1, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x1AB1, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x1AB1, 0x0315, 0x0062] }, +{ source: [0x0061, 0x1AB1, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x1AB1, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x1AB1, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x1AB1, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x1AB1, 0x0300, 0x0315, 0x0062] }, +{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x1AB2, 0x0062], NFC: [0x00E0, 0x05AE, 0x1AB2, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x1AB2, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x1AB2, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x1AB2, 0x0315, 0x0062] }, +{ source: [0x0061, 0x1AB2, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x1AB2, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x1AB2, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x1AB2, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x1AB2, 0x0300, 0x0315, 0x0062] }, +{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x1AB3, 0x0062], NFC: [0x00E0, 0x05AE, 0x1AB3, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x1AB3, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x1AB3, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x1AB3, 0x0315, 0x0062] }, +{ source: [0x0061, 0x1AB3, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x1AB3, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x1AB3, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x1AB3, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x1AB3, 0x0300, 0x0315, 0x0062] }, +{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x1AB4, 0x0062], NFC: [0x00E0, 0x05AE, 0x1AB4, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x1AB4, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x1AB4, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x1AB4, 0x0315, 0x0062] }, +{ source: [0x0061, 0x1AB4, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x1AB4, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x1AB4, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x1AB4, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x1AB4, 0x0300, 0x0315, 0x0062] }, +{ source: [0x0061, 0x059A, 0x0316, 0x1DFA, 0x1AB5, 0x0062], NFC: [0x0061, 0x1DFA, 0x0316, 0x1AB5, 0x059A, 0x0062], NFD: [0x0061, 0x1DFA, 0x0316, 0x1AB5, 0x059A, 0x0062], NFKC: [0x0061, 0x1DFA, 0x0316, 0x1AB5, 0x059A, 0x0062], NFKD: [0x0061, 0x1DFA, 0x0316, 0x1AB5, 0x059A, 0x0062] }, +{ source: [0x0061, 0x1AB5, 0x059A, 0x0316, 0x1DFA, 0x0062], NFC: [0x0061, 0x1DFA, 0x1AB5, 0x0316, 0x059A, 0x0062], NFD: [0x0061, 0x1DFA, 0x1AB5, 0x0316, 0x059A, 0x0062], NFKC: [0x0061, 0x1DFA, 0x1AB5, 0x0316, 0x059A, 0x0062], NFKD: [0x0061, 0x1DFA, 0x1AB5, 0x0316, 0x059A, 0x0062] }, +{ source: [0x0061, 0x059A, 0x0316, 0x1DFA, 0x1AB6, 0x0062], NFC: [0x0061, 0x1DFA, 0x0316, 0x1AB6, 0x059A, 0x0062], NFD: [0x0061, 0x1DFA, 0x0316, 0x1AB6, 0x059A, 0x0062], NFKC: [0x0061, 0x1DFA, 0x0316, 0x1AB6, 0x059A, 0x0062], NFKD: [0x0061, 0x1DFA, 0x0316, 0x1AB6, 0x059A, 0x0062] }, +{ source: [0x0061, 0x1AB6, 0x059A, 0x0316, 0x1DFA, 0x0062], NFC: [0x0061, 0x1DFA, 0x1AB6, 0x0316, 0x059A, 0x0062], NFD: [0x0061, 0x1DFA, 0x1AB6, 0x0316, 0x059A, 0x0062], NFKC: [0x0061, 0x1DFA, 0x1AB6, 0x0316, 0x059A, 0x0062], NFKD: [0x0061, 0x1DFA, 0x1AB6, 0x0316, 0x059A, 0x0062] }, +{ source: [0x0061, 0x059A, 0x0316, 0x1DFA, 0x1AB7, 0x0062], NFC: [0x0061, 0x1DFA, 0x0316, 0x1AB7, 0x059A, 0x0062], NFD: [0x0061, 0x1DFA, 0x0316, 0x1AB7, 0x059A, 0x0062], NFKC: [0x0061, 0x1DFA, 0x0316, 0x1AB7, 0x059A, 0x0062], NFKD: [0x0061, 0x1DFA, 0x0316, 0x1AB7, 0x059A, 0x0062] }, +{ source: [0x0061, 0x1AB7, 0x059A, 0x0316, 0x1DFA, 0x0062], NFC: [0x0061, 0x1DFA, 0x1AB7, 0x0316, 0x059A, 0x0062], NFD: [0x0061, 0x1DFA, 0x1AB7, 0x0316, 0x059A, 0x0062], NFKC: [0x0061, 0x1DFA, 0x1AB7, 0x0316, 0x059A, 0x0062], NFKD: [0x0061, 0x1DFA, 0x1AB7, 0x0316, 0x059A, 0x0062] }, +{ source: [0x0061, 0x059A, 0x0316, 0x1DFA, 0x1AB8, 0x0062], NFC: [0x0061, 0x1DFA, 0x0316, 0x1AB8, 0x059A, 0x0062], NFD: [0x0061, 0x1DFA, 0x0316, 0x1AB8, 0x059A, 0x0062], NFKC: [0x0061, 0x1DFA, 0x0316, 0x1AB8, 0x059A, 0x0062], NFKD: [0x0061, 0x1DFA, 0x0316, 0x1AB8, 0x059A, 0x0062] }, +{ source: [0x0061, 0x1AB8, 0x059A, 0x0316, 0x1DFA, 0x0062], NFC: [0x0061, 0x1DFA, 0x1AB8, 0x0316, 0x059A, 0x0062], NFD: [0x0061, 0x1DFA, 0x1AB8, 0x0316, 0x059A, 0x0062], NFKC: [0x0061, 0x1DFA, 0x1AB8, 0x0316, 0x059A, 0x0062], NFKD: [0x0061, 0x1DFA, 0x1AB8, 0x0316, 0x059A, 0x0062] }, +{ source: [0x0061, 0x059A, 0x0316, 0x1DFA, 0x1AB9, 0x0062], NFC: [0x0061, 0x1DFA, 0x0316, 0x1AB9, 0x059A, 0x0062], NFD: [0x0061, 0x1DFA, 0x0316, 0x1AB9, 0x059A, 0x0062], NFKC: [0x0061, 0x1DFA, 0x0316, 0x1AB9, 0x059A, 0x0062], NFKD: [0x0061, 0x1DFA, 0x0316, 0x1AB9, 0x059A, 0x0062] }, +{ source: [0x0061, 0x1AB9, 0x059A, 0x0316, 0x1DFA, 0x0062], NFC: [0x0061, 0x1DFA, 0x1AB9, 0x0316, 0x059A, 0x0062], NFD: [0x0061, 0x1DFA, 0x1AB9, 0x0316, 0x059A, 0x0062], NFKC: [0x0061, 0x1DFA, 0x1AB9, 0x0316, 0x059A, 0x0062], NFKD: [0x0061, 0x1DFA, 0x1AB9, 0x0316, 0x059A, 0x0062] }, +{ source: [0x0061, 0x059A, 0x0316, 0x1DFA, 0x1ABA, 0x0062], NFC: [0x0061, 0x1DFA, 0x0316, 0x1ABA, 0x059A, 0x0062], NFD: [0x0061, 0x1DFA, 0x0316, 0x1ABA, 0x059A, 0x0062], NFKC: [0x0061, 0x1DFA, 0x0316, 0x1ABA, 0x059A, 0x0062], NFKD: [0x0061, 0x1DFA, 0x0316, 0x1ABA, 0x059A, 0x0062] }, +{ source: [0x0061, 0x1ABA, 0x059A, 0x0316, 0x1DFA, 0x0062], NFC: [0x0061, 0x1DFA, 0x1ABA, 0x0316, 0x059A, 0x0062], NFD: [0x0061, 0x1DFA, 0x1ABA, 0x0316, 0x059A, 0x0062], NFKC: [0x0061, 0x1DFA, 0x1ABA, 0x0316, 0x059A, 0x0062], NFKD: [0x0061, 0x1DFA, 0x1ABA, 0x0316, 0x059A, 0x0062] }, +{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x1ABB, 0x0062], NFC: [0x00E0, 0x05AE, 0x1ABB, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x1ABB, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x1ABB, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x1ABB, 0x0315, 0x0062] }, +{ source: [0x0061, 0x1ABB, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x1ABB, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x1ABB, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x1ABB, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x1ABB, 0x0300, 0x0315, 0x0062] }, +{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x1ABC, 0x0062], NFC: [0x00E0, 0x05AE, 0x1ABC, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x1ABC, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x1ABC, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x1ABC, 0x0315, 0x0062] }, +{ source: [0x0061, 0x1ABC, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x1ABC, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x1ABC, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x1ABC, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x1ABC, 0x0300, 0x0315, 0x0062] }, +{ source: [0x0061, 0x059A, 0x0316, 0x1DFA, 0x1ABD, 0x0062], NFC: [0x0061, 0x1DFA, 0x0316, 0x1ABD, 0x059A, 0x0062], NFD: [0x0061, 0x1DFA, 0x0316, 0x1ABD, 0x059A, 0x0062], NFKC: [0x0061, 0x1DFA, 0x0316, 0x1ABD, 0x059A, 0x0062], NFKD: [0x0061, 0x1DFA, 0x0316, 0x1ABD, 0x059A, 0x0062] }, +{ source: [0x0061, 0x1ABD, 0x059A, 0x0316, 0x1DFA, 0x0062], NFC: [0x0061, 0x1DFA, 0x1ABD, 0x0316, 0x059A, 0x0062], NFD: [0x0061, 0x1DFA, 0x1ABD, 0x0316, 0x059A, 0x0062], NFKC: [0x0061, 0x1DFA, 0x1ABD, 0x0316, 0x059A, 0x0062], NFKD: [0x0061, 0x1DFA, 0x1ABD, 0x0316, 0x059A, 0x0062] }, +{ source: [0x0061, 0x059A, 0x0316, 0x1DFA, 0x1ABF, 0x0062], NFC: [0x0061, 0x1DFA, 0x0316, 0x1ABF, 0x059A, 0x0062], NFD: [0x0061, 0x1DFA, 0x0316, 0x1ABF, 0x059A, 0x0062], NFKC: [0x0061, 0x1DFA, 0x0316, 0x1ABF, 0x059A, 0x0062], NFKD: [0x0061, 0x1DFA, 0x0316, 0x1ABF, 0x059A, 0x0062] }, +{ source: [0x0061, 0x1ABF, 0x059A, 0x0316, 0x1DFA, 0x0062], NFC: [0x0061, 0x1DFA, 0x1ABF, 0x0316, 0x059A, 0x0062], NFD: [0x0061, 0x1DFA, 0x1ABF, 0x0316, 0x059A, 0x0062], NFKC: [0x0061, 0x1DFA, 0x1ABF, 0x0316, 0x059A, 0x0062], NFKD: [0x0061, 0x1DFA, 0x1ABF, 0x0316, 0x059A, 0x0062] }, +{ source: [0x0061, 0x059A, 0x0316, 0x1DFA, 0x1AC0, 0x0062], NFC: [0x0061, 0x1DFA, 0x0316, 0x1AC0, 0x059A, 0x0062], NFD: [0x0061, 0x1DFA, 0x0316, 0x1AC0, 0x059A, 0x0062], NFKC: [0x0061, 0x1DFA, 0x0316, 0x1AC0, 0x059A, 0x0062], NFKD: [0x0061, 0x1DFA, 0x0316, 0x1AC0, 0x059A, 0x0062] }, +{ source: [0x0061, 0x1AC0, 0x059A, 0x0316, 0x1DFA, 0x0062], NFC: [0x0061, 0x1DFA, 0x1AC0, 0x0316, 0x059A, 0x0062], NFD: [0x0061, 0x1DFA, 0x1AC0, 0x0316, 0x059A, 0x0062], NFKC: [0x0061, 0x1DFA, 0x1AC0, 0x0316, 0x059A, 0x0062], NFKD: [0x0061, 0x1DFA, 0x1AC0, 0x0316, 0x059A, 0x0062] }, +{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x1AC1, 0x0062], NFC: [0x00E0, 0x05AE, 0x1AC1, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x1AC1, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x1AC1, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x1AC1, 0x0315, 0x0062] }, +{ source: [0x0061, 0x1AC1, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x1AC1, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x1AC1, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x1AC1, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x1AC1, 0x0300, 0x0315, 0x0062] }, +{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x1AC2, 0x0062], NFC: [0x00E0, 0x05AE, 0x1AC2, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x1AC2, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x1AC2, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x1AC2, 0x0315, 0x0062] }, +{ source: [0x0061, 0x1AC2, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x1AC2, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x1AC2, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x1AC2, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x1AC2, 0x0300, 0x0315, 0x0062] }, +{ source: [0x0061, 0x059A, 0x0316, 0x1DFA, 0x1AC3, 0x0062], NFC: [0x0061, 0x1DFA, 0x0316, 0x1AC3, 0x059A, 0x0062], NFD: [0x0061, 0x1DFA, 0x0316, 0x1AC3, 0x059A, 0x0062], NFKC: [0x0061, 0x1DFA, 0x0316, 0x1AC3, 0x059A, 0x0062], NFKD: [0x0061, 0x1DFA, 0x0316, 0x1AC3, 0x059A, 0x0062] }, +{ source: [0x0061, 0x1AC3, 0x059A, 0x0316, 0x1DFA, 0x0062], NFC: [0x0061, 0x1DFA, 0x1AC3, 0x0316, 0x059A, 0x0062], NFD: [0x0061, 0x1DFA, 0x1AC3, 0x0316, 0x059A, 0x0062], NFKC: [0x0061, 0x1DFA, 0x1AC3, 0x0316, 0x059A, 0x0062], NFKD: [0x0061, 0x1DFA, 0x1AC3, 0x0316, 0x059A, 0x0062] }, +{ source: [0x0061, 0x059A, 0x0316, 0x1DFA, 0x1AC4, 0x0062], NFC: [0x0061, 0x1DFA, 0x0316, 0x1AC4, 0x059A, 0x0062], NFD: [0x0061, 0x1DFA, 0x0316, 0x1AC4, 0x059A, 0x0062], NFKC: [0x0061, 0x1DFA, 0x0316, 0x1AC4, 0x059A, 0x0062], NFKD: [0x0061, 0x1DFA, 0x0316, 0x1AC4, 0x059A, 0x0062] }, +{ source: [0x0061, 0x1AC4, 0x059A, 0x0316, 0x1DFA, 0x0062], NFC: [0x0061, 0x1DFA, 0x1AC4, 0x0316, 0x059A, 0x0062], NFD: [0x0061, 0x1DFA, 0x1AC4, 0x0316, 0x059A, 0x0062], NFKC: [0x0061, 0x1DFA, 0x1AC4, 0x0316, 0x059A, 0x0062], NFKD: [0x0061, 0x1DFA, 0x1AC4, 0x0316, 0x059A, 0x0062] }, +{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x1AC5, 0x0062], NFC: [0x00E0, 0x05AE, 0x1AC5, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x1AC5, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x1AC5, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x1AC5, 0x0315, 0x0062] }, +{ source: [0x0061, 0x1AC5, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x1AC5, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x1AC5, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x1AC5, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x1AC5, 0x0300, 0x0315, 0x0062] }, +{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x1AC6, 0x0062], NFC: [0x00E0, 0x05AE, 0x1AC6, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x1AC6, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x1AC6, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x1AC6, 0x0315, 0x0062] }, +{ source: [0x0061, 0x1AC6, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x1AC6, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x1AC6, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x1AC6, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x1AC6, 0x0300, 0x0315, 0x0062] }, +{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x1AC7, 0x0062], NFC: [0x00E0, 0x05AE, 0x1AC7, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x1AC7, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x1AC7, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x1AC7, 0x0315, 0x0062] }, +{ source: [0x0061, 0x1AC7, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x1AC7, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x1AC7, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x1AC7, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x1AC7, 0x0300, 0x0315, 0x0062] }, +{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x1AC8, 0x0062], NFC: [0x00E0, 0x05AE, 0x1AC8, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x1AC8, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x1AC8, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x1AC8, 0x0315, 0x0062] }, +{ source: [0x0061, 0x1AC8, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x1AC8, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x1AC8, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x1AC8, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x1AC8, 0x0300, 0x0315, 0x0062] }, +{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x1AC9, 0x0062], NFC: [0x00E0, 0x05AE, 0x1AC9, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x1AC9, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x1AC9, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x1AC9, 0x0315, 0x0062] }, +{ source: [0x0061, 0x1AC9, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x1AC9, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x1AC9, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x1AC9, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x1AC9, 0x0300, 0x0315, 0x0062] }, +{ source: [0x0061, 0x059A, 0x0316, 0x1DFA, 0x1ACA, 0x0062], NFC: [0x0061, 0x1DFA, 0x0316, 0x1ACA, 0x059A, 0x0062], NFD: [0x0061, 0x1DFA, 0x0316, 0x1ACA, 0x059A, 0x0062], NFKC: [0x0061, 0x1DFA, 0x0316, 0x1ACA, 0x059A, 0x0062], NFKD: [0x0061, 0x1DFA, 0x0316, 0x1ACA, 0x059A, 0x0062] }, +{ source: [0x0061, 0x1ACA, 0x059A, 0x0316, 0x1DFA, 0x0062], NFC: [0x0061, 0x1DFA, 0x1ACA, 0x0316, 0x059A, 0x0062], NFD: [0x0061, 0x1DFA, 0x1ACA, 0x0316, 0x059A, 0x0062], NFKC: [0x0061, 0x1DFA, 0x1ACA, 0x0316, 0x059A, 0x0062], NFKD: [0x0061, 0x1DFA, 0x1ACA, 0x0316, 0x059A, 0x0062] }, +{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x1ACB, 0x0062], NFC: [0x00E0, 0x05AE, 0x1ACB, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x1ACB, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x1ACB, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x1ACB, 0x0315, 0x0062] }, +{ source: [0x0061, 0x1ACB, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x1ACB, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x1ACB, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x1ACB, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x1ACB, 0x0300, 0x0315, 0x0062] }, +{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x1ACC, 0x0062], NFC: [0x00E0, 0x05AE, 0x1ACC, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x1ACC, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x1ACC, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x1ACC, 0x0315, 0x0062] }, +{ source: [0x0061, 0x1ACC, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x1ACC, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x1ACC, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x1ACC, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x1ACC, 0x0300, 0x0315, 0x0062] }, +{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x1ACD, 0x0062], NFC: [0x00E0, 0x05AE, 0x1ACD, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x1ACD, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x1ACD, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x1ACD, 0x0315, 0x0062] }, +{ source: [0x0061, 0x1ACD, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x1ACD, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x1ACD, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x1ACD, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x1ACD, 0x0300, 0x0315, 0x0062] }, +{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x1ACE, 0x0062], NFC: [0x00E0, 0x05AE, 0x1ACE, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x1ACE, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x1ACE, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x1ACE, 0x0315, 0x0062] }, +{ source: [0x0061, 0x1ACE, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x1ACE, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x1ACE, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x1ACE, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x1ACE, 0x0300, 0x0315, 0x0062] }, +{ source: [0x0061, 0x3099, 0x093C, 0x16FF0, 0x1B34, 0x0062], NFC: [0x0061, 0x16FF0, 0x093C, 0x1B34, 0x3099, 0x0062], NFD: [0x0061, 0x16FF0, 0x093C, 0x1B34, 0x3099, 0x0062], NFKC: [0x0061, 0x16FF0, 0x093C, 0x1B34, 0x3099, 0x0062], NFKD: [0x0061, 0x16FF0, 0x093C, 0x1B34, 0x3099, 0x0062] }, +{ source: [0x0061, 0x1B34, 0x3099, 0x093C, 0x16FF0, 0x0062], NFC: [0x0061, 0x16FF0, 0x1B34, 0x093C, 0x3099, 0x0062], NFD: [0x0061, 0x16FF0, 0x1B34, 0x093C, 0x3099, 0x0062], NFKC: [0x0061, 0x16FF0, 0x1B34, 0x093C, 0x3099, 0x0062], NFKD: [0x0061, 0x16FF0, 0x1B34, 0x093C, 0x3099, 0x0062] }, +{ source: [0x0061, 0x05B0, 0x094D, 0x3099, 0x1B44, 0x0062], NFC: [0x0061, 0x3099, 0x094D, 0x1B44, 0x05B0, 0x0062], NFD: [0x0061, 0x3099, 0x094D, 0x1B44, 0x05B0, 0x0062], NFKC: [0x0061, 0x3099, 0x094D, 0x1B44, 0x05B0, 0x0062], NFKD: [0x0061, 0x3099, 0x094D, 0x1B44, 0x05B0, 0x0062] }, +{ source: [0x0061, 0x1B44, 0x05B0, 0x094D, 0x3099, 0x0062], NFC: [0x0061, 0x3099, 0x1B44, 0x094D, 0x05B0, 0x0062], NFD: [0x0061, 0x3099, 0x1B44, 0x094D, 0x05B0, 0x0062], NFKC: [0x0061, 0x3099, 0x1B44, 0x094D, 0x05B0, 0x0062], NFKD: [0x0061, 0x3099, 0x1B44, 0x094D, 0x05B0, 0x0062] }, +{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x1B6B, 0x0062], NFC: [0x00E0, 0x05AE, 0x1B6B, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x1B6B, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x1B6B, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x1B6B, 0x0315, 0x0062] }, +{ source: [0x0061, 0x1B6B, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x1B6B, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x1B6B, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x1B6B, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x1B6B, 0x0300, 0x0315, 0x0062] }, +{ source: [0x0061, 0x059A, 0x0316, 0x1DFA, 0x1B6C, 0x0062], NFC: [0x0061, 0x1DFA, 0x0316, 0x1B6C, 0x059A, 0x0062], NFD: [0x0061, 0x1DFA, 0x0316, 0x1B6C, 0x059A, 0x0062], NFKC: [0x0061, 0x1DFA, 0x0316, 0x1B6C, 0x059A, 0x0062], NFKD: [0x0061, 0x1DFA, 0x0316, 0x1B6C, 0x059A, 0x0062] }, +{ source: [0x0061, 0x1B6C, 0x059A, 0x0316, 0x1DFA, 0x0062], NFC: [0x0061, 0x1DFA, 0x1B6C, 0x0316, 0x059A, 0x0062], NFD: [0x0061, 0x1DFA, 0x1B6C, 0x0316, 0x059A, 0x0062], NFKC: [0x0061, 0x1DFA, 0x1B6C, 0x0316, 0x059A, 0x0062], NFKD: [0x0061, 0x1DFA, 0x1B6C, 0x0316, 0x059A, 0x0062] }, +{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x1B6D, 0x0062], NFC: [0x00E0, 0x05AE, 0x1B6D, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x1B6D, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x1B6D, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x1B6D, 0x0315, 0x0062] }, +{ source: [0x0061, 0x1B6D, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x1B6D, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x1B6D, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x1B6D, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x1B6D, 0x0300, 0x0315, 0x0062] }, +{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x1B6E, 0x0062], NFC: [0x00E0, 0x05AE, 0x1B6E, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x1B6E, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x1B6E, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x1B6E, 0x0315, 0x0062] }, +{ source: [0x0061, 0x1B6E, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x1B6E, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x1B6E, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x1B6E, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x1B6E, 0x0300, 0x0315, 0x0062] }, +{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x1B6F, 0x0062], NFC: [0x00E0, 0x05AE, 0x1B6F, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x1B6F, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x1B6F, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x1B6F, 0x0315, 0x0062] }, +{ source: [0x0061, 0x1B6F, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x1B6F, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x1B6F, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x1B6F, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x1B6F, 0x0300, 0x0315, 0x0062] }, +{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x1B70, 0x0062], NFC: [0x00E0, 0x05AE, 0x1B70, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x1B70, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x1B70, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x1B70, 0x0315, 0x0062] }, +{ source: [0x0061, 0x1B70, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x1B70, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x1B70, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x1B70, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x1B70, 0x0300, 0x0315, 0x0062] }, +{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x1B71, 0x0062], NFC: [0x00E0, 0x05AE, 0x1B71, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x1B71, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x1B71, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x1B71, 0x0315, 0x0062] }, +{ source: [0x0061, 0x1B71, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x1B71, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x1B71, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x1B71, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x1B71, 0x0300, 0x0315, 0x0062] }, +{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x1B72, 0x0062], NFC: [0x00E0, 0x05AE, 0x1B72, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x1B72, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x1B72, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x1B72, 0x0315, 0x0062] }, +{ source: [0x0061, 0x1B72, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x1B72, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x1B72, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x1B72, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x1B72, 0x0300, 0x0315, 0x0062] }, +{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x1B73, 0x0062], NFC: [0x00E0, 0x05AE, 0x1B73, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x1B73, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x1B73, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x1B73, 0x0315, 0x0062] }, +{ source: [0x0061, 0x1B73, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x1B73, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x1B73, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x1B73, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x1B73, 0x0300, 0x0315, 0x0062] }, +{ source: [0x0061, 0x05B0, 0x094D, 0x3099, 0x1BAA, 0x0062], NFC: [0x0061, 0x3099, 0x094D, 0x1BAA, 0x05B0, 0x0062], NFD: [0x0061, 0x3099, 0x094D, 0x1BAA, 0x05B0, 0x0062], NFKC: [0x0061, 0x3099, 0x094D, 0x1BAA, 0x05B0, 0x0062], NFKD: [0x0061, 0x3099, 0x094D, 0x1BAA, 0x05B0, 0x0062] }, +{ source: [0x0061, 0x1BAA, 0x05B0, 0x094D, 0x3099, 0x0062], NFC: [0x0061, 0x3099, 0x1BAA, 0x094D, 0x05B0, 0x0062], NFD: [0x0061, 0x3099, 0x1BAA, 0x094D, 0x05B0, 0x0062], NFKC: [0x0061, 0x3099, 0x1BAA, 0x094D, 0x05B0, 0x0062], NFKD: [0x0061, 0x3099, 0x1BAA, 0x094D, 0x05B0, 0x0062] }, +{ source: [0x0061, 0x05B0, 0x094D, 0x3099, 0x1BAB, 0x0062], NFC: [0x0061, 0x3099, 0x094D, 0x1BAB, 0x05B0, 0x0062], NFD: [0x0061, 0x3099, 0x094D, 0x1BAB, 0x05B0, 0x0062], NFKC: [0x0061, 0x3099, 0x094D, 0x1BAB, 0x05B0, 0x0062], NFKD: [0x0061, 0x3099, 0x094D, 0x1BAB, 0x05B0, 0x0062] }, +{ source: [0x0061, 0x1BAB, 0x05B0, 0x094D, 0x3099, 0x0062], NFC: [0x0061, 0x3099, 0x1BAB, 0x094D, 0x05B0, 0x0062], NFD: [0x0061, 0x3099, 0x1BAB, 0x094D, 0x05B0, 0x0062], NFKC: [0x0061, 0x3099, 0x1BAB, 0x094D, 0x05B0, 0x0062], NFKD: [0x0061, 0x3099, 0x1BAB, 0x094D, 0x05B0, 0x0062] }, +{ source: [0x0061, 0x3099, 0x093C, 0x16FF0, 0x1BE6, 0x0062], NFC: [0x0061, 0x16FF0, 0x093C, 0x1BE6, 0x3099, 0x0062], NFD: [0x0061, 0x16FF0, 0x093C, 0x1BE6, 0x3099, 0x0062], NFKC: [0x0061, 0x16FF0, 0x093C, 0x1BE6, 0x3099, 0x0062], NFKD: [0x0061, 0x16FF0, 0x093C, 0x1BE6, 0x3099, 0x0062] }, +{ source: [0x0061, 0x1BE6, 0x3099, 0x093C, 0x16FF0, 0x0062], NFC: [0x0061, 0x16FF0, 0x1BE6, 0x093C, 0x3099, 0x0062], NFD: [0x0061, 0x16FF0, 0x1BE6, 0x093C, 0x3099, 0x0062], NFKC: [0x0061, 0x16FF0, 0x1BE6, 0x093C, 0x3099, 0x0062], NFKD: [0x0061, 0x16FF0, 0x1BE6, 0x093C, 0x3099, 0x0062] }, +{ source: [0x0061, 0x05B0, 0x094D, 0x3099, 0x1BF2, 0x0062], NFC: [0x0061, 0x3099, 0x094D, 0x1BF2, 0x05B0, 0x0062], NFD: [0x0061, 0x3099, 0x094D, 0x1BF2, 0x05B0, 0x0062], NFKC: [0x0061, 0x3099, 0x094D, 0x1BF2, 0x05B0, 0x0062], NFKD: [0x0061, 0x3099, 0x094D, 0x1BF2, 0x05B0, 0x0062] }, +{ source: [0x0061, 0x1BF2, 0x05B0, 0x094D, 0x3099, 0x0062], NFC: [0x0061, 0x3099, 0x1BF2, 0x094D, 0x05B0, 0x0062], NFD: [0x0061, 0x3099, 0x1BF2, 0x094D, 0x05B0, 0x0062], NFKC: [0x0061, 0x3099, 0x1BF2, 0x094D, 0x05B0, 0x0062], NFKD: [0x0061, 0x3099, 0x1BF2, 0x094D, 0x05B0, 0x0062] }, +{ source: [0x0061, 0x05B0, 0x094D, 0x3099, 0x1BF3, 0x0062], NFC: [0x0061, 0x3099, 0x094D, 0x1BF3, 0x05B0, 0x0062], NFD: [0x0061, 0x3099, 0x094D, 0x1BF3, 0x05B0, 0x0062], NFKC: [0x0061, 0x3099, 0x094D, 0x1BF3, 0x05B0, 0x0062], NFKD: [0x0061, 0x3099, 0x094D, 0x1BF3, 0x05B0, 0x0062] }, +{ source: [0x0061, 0x1BF3, 0x05B0, 0x094D, 0x3099, 0x0062], NFC: [0x0061, 0x3099, 0x1BF3, 0x094D, 0x05B0, 0x0062], NFD: [0x0061, 0x3099, 0x1BF3, 0x094D, 0x05B0, 0x0062], NFKC: [0x0061, 0x3099, 0x1BF3, 0x094D, 0x05B0, 0x0062], NFKD: [0x0061, 0x3099, 0x1BF3, 0x094D, 0x05B0, 0x0062] }, +{ source: [0x0061, 0x3099, 0x093C, 0x16FF0, 0x1C37, 0x0062], NFC: [0x0061, 0x16FF0, 0x093C, 0x1C37, 0x3099, 0x0062], NFD: [0x0061, 0x16FF0, 0x093C, 0x1C37, 0x3099, 0x0062], NFKC: [0x0061, 0x16FF0, 0x093C, 0x1C37, 0x3099, 0x0062], NFKD: [0x0061, 0x16FF0, 0x093C, 0x1C37, 0x3099, 0x0062] }, +{ source: [0x0061, 0x1C37, 0x3099, 0x093C, 0x16FF0, 0x0062], NFC: [0x0061, 0x16FF0, 0x1C37, 0x093C, 0x3099, 0x0062], NFD: [0x0061, 0x16FF0, 0x1C37, 0x093C, 0x3099, 0x0062], NFKC: [0x0061, 0x16FF0, 0x1C37, 0x093C, 0x3099, 0x0062], NFKD: [0x0061, 0x16FF0, 0x1C37, 0x093C, 0x3099, 0x0062] }, +{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x1CD0, 0x0062], NFC: [0x00E0, 0x05AE, 0x1CD0, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x1CD0, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x1CD0, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x1CD0, 0x0315, 0x0062] }, +{ source: [0x0061, 0x1CD0, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x1CD0, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x1CD0, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x1CD0, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x1CD0, 0x0300, 0x0315, 0x0062] }, +{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x1CD1, 0x0062], NFC: [0x00E0, 0x05AE, 0x1CD1, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x1CD1, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x1CD1, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x1CD1, 0x0315, 0x0062] }, +{ source: [0x0061, 0x1CD1, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x1CD1, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x1CD1, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x1CD1, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x1CD1, 0x0300, 0x0315, 0x0062] }, +{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x1CD2, 0x0062], NFC: [0x00E0, 0x05AE, 0x1CD2, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x1CD2, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x1CD2, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x1CD2, 0x0315, 0x0062] }, +{ source: [0x0061, 0x1CD2, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x1CD2, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x1CD2, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x1CD2, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x1CD2, 0x0300, 0x0315, 0x0062] }, +{ source: [0x0061, 0x16FF0, 0x0334, 0x1CD4, 0x0062], NFC: [0x0061, 0x0334, 0x1CD4, 0x16FF0, 0x0062], NFD: [0x0061, 0x0334, 0x1CD4, 0x16FF0, 0x0062], NFKC: [0x0061, 0x0334, 0x1CD4, 0x16FF0, 0x0062], NFKD: [0x0061, 0x0334, 0x1CD4, 0x16FF0, 0x0062] }, +{ source: [0x0061, 0x1CD4, 0x16FF0, 0x0334, 0x0062], NFC: [0x0061, 0x1CD4, 0x0334, 0x16FF0, 0x0062], NFD: [0x0061, 0x1CD4, 0x0334, 0x16FF0, 0x0062], NFKC: [0x0061, 0x1CD4, 0x0334, 0x16FF0, 0x0062], NFKD: [0x0061, 0x1CD4, 0x0334, 0x16FF0, 0x0062] }, +{ source: [0x0061, 0x059A, 0x0316, 0x1DFA, 0x1CD5, 0x0062], NFC: [0x0061, 0x1DFA, 0x0316, 0x1CD5, 0x059A, 0x0062], NFD: [0x0061, 0x1DFA, 0x0316, 0x1CD5, 0x059A, 0x0062], NFKC: [0x0061, 0x1DFA, 0x0316, 0x1CD5, 0x059A, 0x0062], NFKD: [0x0061, 0x1DFA, 0x0316, 0x1CD5, 0x059A, 0x0062] }, +{ source: [0x0061, 0x1CD5, 0x059A, 0x0316, 0x1DFA, 0x0062], NFC: [0x0061, 0x1DFA, 0x1CD5, 0x0316, 0x059A, 0x0062], NFD: [0x0061, 0x1DFA, 0x1CD5, 0x0316, 0x059A, 0x0062], NFKC: [0x0061, 0x1DFA, 0x1CD5, 0x0316, 0x059A, 0x0062], NFKD: [0x0061, 0x1DFA, 0x1CD5, 0x0316, 0x059A, 0x0062] }, +{ source: [0x0061, 0x059A, 0x0316, 0x1DFA, 0x1CD6, 0x0062], NFC: [0x0061, 0x1DFA, 0x0316, 0x1CD6, 0x059A, 0x0062], NFD: [0x0061, 0x1DFA, 0x0316, 0x1CD6, 0x059A, 0x0062], NFKC: [0x0061, 0x1DFA, 0x0316, 0x1CD6, 0x059A, 0x0062], NFKD: [0x0061, 0x1DFA, 0x0316, 0x1CD6, 0x059A, 0x0062] }, +{ source: [0x0061, 0x1CD6, 0x059A, 0x0316, 0x1DFA, 0x0062], NFC: [0x0061, 0x1DFA, 0x1CD6, 0x0316, 0x059A, 0x0062], NFD: [0x0061, 0x1DFA, 0x1CD6, 0x0316, 0x059A, 0x0062], NFKC: [0x0061, 0x1DFA, 0x1CD6, 0x0316, 0x059A, 0x0062], NFKD: [0x0061, 0x1DFA, 0x1CD6, 0x0316, 0x059A, 0x0062] }, +{ source: [0x0061, 0x059A, 0x0316, 0x1DFA, 0x1CD7, 0x0062], NFC: [0x0061, 0x1DFA, 0x0316, 0x1CD7, 0x059A, 0x0062], NFD: [0x0061, 0x1DFA, 0x0316, 0x1CD7, 0x059A, 0x0062], NFKC: [0x0061, 0x1DFA, 0x0316, 0x1CD7, 0x059A, 0x0062], NFKD: [0x0061, 0x1DFA, 0x0316, 0x1CD7, 0x059A, 0x0062] }, +{ source: [0x0061, 0x1CD7, 0x059A, 0x0316, 0x1DFA, 0x0062], NFC: [0x0061, 0x1DFA, 0x1CD7, 0x0316, 0x059A, 0x0062], NFD: [0x0061, 0x1DFA, 0x1CD7, 0x0316, 0x059A, 0x0062], NFKC: [0x0061, 0x1DFA, 0x1CD7, 0x0316, 0x059A, 0x0062], NFKD: [0x0061, 0x1DFA, 0x1CD7, 0x0316, 0x059A, 0x0062] }, +{ source: [0x0061, 0x059A, 0x0316, 0x1DFA, 0x1CD8, 0x0062], NFC: [0x0061, 0x1DFA, 0x0316, 0x1CD8, 0x059A, 0x0062], NFD: [0x0061, 0x1DFA, 0x0316, 0x1CD8, 0x059A, 0x0062], NFKC: [0x0061, 0x1DFA, 0x0316, 0x1CD8, 0x059A, 0x0062], NFKD: [0x0061, 0x1DFA, 0x0316, 0x1CD8, 0x059A, 0x0062] }, +{ source: [0x0061, 0x1CD8, 0x059A, 0x0316, 0x1DFA, 0x0062], NFC: [0x0061, 0x1DFA, 0x1CD8, 0x0316, 0x059A, 0x0062], NFD: [0x0061, 0x1DFA, 0x1CD8, 0x0316, 0x059A, 0x0062], NFKC: [0x0061, 0x1DFA, 0x1CD8, 0x0316, 0x059A, 0x0062], NFKD: [0x0061, 0x1DFA, 0x1CD8, 0x0316, 0x059A, 0x0062] }, +{ source: [0x0061, 0x059A, 0x0316, 0x1DFA, 0x1CD9, 0x0062], NFC: [0x0061, 0x1DFA, 0x0316, 0x1CD9, 0x059A, 0x0062], NFD: [0x0061, 0x1DFA, 0x0316, 0x1CD9, 0x059A, 0x0062], NFKC: [0x0061, 0x1DFA, 0x0316, 0x1CD9, 0x059A, 0x0062], NFKD: [0x0061, 0x1DFA, 0x0316, 0x1CD9, 0x059A, 0x0062] }, +{ source: [0x0061, 0x1CD9, 0x059A, 0x0316, 0x1DFA, 0x0062], NFC: [0x0061, 0x1DFA, 0x1CD9, 0x0316, 0x059A, 0x0062], NFD: [0x0061, 0x1DFA, 0x1CD9, 0x0316, 0x059A, 0x0062], NFKC: [0x0061, 0x1DFA, 0x1CD9, 0x0316, 0x059A, 0x0062], NFKD: [0x0061, 0x1DFA, 0x1CD9, 0x0316, 0x059A, 0x0062] }, +{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x1CDA, 0x0062], NFC: [0x00E0, 0x05AE, 0x1CDA, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x1CDA, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x1CDA, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x1CDA, 0x0315, 0x0062] }, +{ source: [0x0061, 0x1CDA, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x1CDA, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x1CDA, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x1CDA, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x1CDA, 0x0300, 0x0315, 0x0062] }, +{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x1CDB, 0x0062], NFC: [0x00E0, 0x05AE, 0x1CDB, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x1CDB, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x1CDB, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x1CDB, 0x0315, 0x0062] }, +{ source: [0x0061, 0x1CDB, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x1CDB, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x1CDB, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x1CDB, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x1CDB, 0x0300, 0x0315, 0x0062] }, +{ source: [0x0061, 0x059A, 0x0316, 0x1DFA, 0x1CDC, 0x0062], NFC: [0x0061, 0x1DFA, 0x0316, 0x1CDC, 0x059A, 0x0062], NFD: [0x0061, 0x1DFA, 0x0316, 0x1CDC, 0x059A, 0x0062], NFKC: [0x0061, 0x1DFA, 0x0316, 0x1CDC, 0x059A, 0x0062], NFKD: [0x0061, 0x1DFA, 0x0316, 0x1CDC, 0x059A, 0x0062] }, +{ source: [0x0061, 0x1CDC, 0x059A, 0x0316, 0x1DFA, 0x0062], NFC: [0x0061, 0x1DFA, 0x1CDC, 0x0316, 0x059A, 0x0062], NFD: [0x0061, 0x1DFA, 0x1CDC, 0x0316, 0x059A, 0x0062], NFKC: [0x0061, 0x1DFA, 0x1CDC, 0x0316, 0x059A, 0x0062], NFKD: [0x0061, 0x1DFA, 0x1CDC, 0x0316, 0x059A, 0x0062] }, +{ source: [0x0061, 0x059A, 0x0316, 0x1DFA, 0x1CDD, 0x0062], NFC: [0x0061, 0x1DFA, 0x0316, 0x1CDD, 0x059A, 0x0062], NFD: [0x0061, 0x1DFA, 0x0316, 0x1CDD, 0x059A, 0x0062], NFKC: [0x0061, 0x1DFA, 0x0316, 0x1CDD, 0x059A, 0x0062], NFKD: [0x0061, 0x1DFA, 0x0316, 0x1CDD, 0x059A, 0x0062] }, +{ source: [0x0061, 0x1CDD, 0x059A, 0x0316, 0x1DFA, 0x0062], NFC: [0x0061, 0x1DFA, 0x1CDD, 0x0316, 0x059A, 0x0062], NFD: [0x0061, 0x1DFA, 0x1CDD, 0x0316, 0x059A, 0x0062], NFKC: [0x0061, 0x1DFA, 0x1CDD, 0x0316, 0x059A, 0x0062], NFKD: [0x0061, 0x1DFA, 0x1CDD, 0x0316, 0x059A, 0x0062] }, +{ source: [0x0061, 0x059A, 0x0316, 0x1DFA, 0x1CDE, 0x0062], NFC: [0x0061, 0x1DFA, 0x0316, 0x1CDE, 0x059A, 0x0062], NFD: [0x0061, 0x1DFA, 0x0316, 0x1CDE, 0x059A, 0x0062], NFKC: [0x0061, 0x1DFA, 0x0316, 0x1CDE, 0x059A, 0x0062], NFKD: [0x0061, 0x1DFA, 0x0316, 0x1CDE, 0x059A, 0x0062] }, +{ source: [0x0061, 0x1CDE, 0x059A, 0x0316, 0x1DFA, 0x0062], NFC: [0x0061, 0x1DFA, 0x1CDE, 0x0316, 0x059A, 0x0062], NFD: [0x0061, 0x1DFA, 0x1CDE, 0x0316, 0x059A, 0x0062], NFKC: [0x0061, 0x1DFA, 0x1CDE, 0x0316, 0x059A, 0x0062], NFKD: [0x0061, 0x1DFA, 0x1CDE, 0x0316, 0x059A, 0x0062] }, +{ source: [0x0061, 0x059A, 0x0316, 0x1DFA, 0x1CDF, 0x0062], NFC: [0x0061, 0x1DFA, 0x0316, 0x1CDF, 0x059A, 0x0062], NFD: [0x0061, 0x1DFA, 0x0316, 0x1CDF, 0x059A, 0x0062], NFKC: [0x0061, 0x1DFA, 0x0316, 0x1CDF, 0x059A, 0x0062], NFKD: [0x0061, 0x1DFA, 0x0316, 0x1CDF, 0x059A, 0x0062] }, +{ source: [0x0061, 0x1CDF, 0x059A, 0x0316, 0x1DFA, 0x0062], NFC: [0x0061, 0x1DFA, 0x1CDF, 0x0316, 0x059A, 0x0062], NFD: [0x0061, 0x1DFA, 0x1CDF, 0x0316, 0x059A, 0x0062], NFKC: [0x0061, 0x1DFA, 0x1CDF, 0x0316, 0x059A, 0x0062], NFKD: [0x0061, 0x1DFA, 0x1CDF, 0x0316, 0x059A, 0x0062] }, +{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x1CE0, 0x0062], NFC: [0x00E0, 0x05AE, 0x1CE0, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x1CE0, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x1CE0, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x1CE0, 0x0315, 0x0062] }, +{ source: [0x0061, 0x1CE0, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x1CE0, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x1CE0, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x1CE0, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x1CE0, 0x0300, 0x0315, 0x0062] }, +{ source: [0x0061, 0x16FF0, 0x0334, 0x1CE2, 0x0062], NFC: [0x0061, 0x0334, 0x1CE2, 0x16FF0, 0x0062], NFD: [0x0061, 0x0334, 0x1CE2, 0x16FF0, 0x0062], NFKC: [0x0061, 0x0334, 0x1CE2, 0x16FF0, 0x0062], NFKD: [0x0061, 0x0334, 0x1CE2, 0x16FF0, 0x0062] }, +{ source: [0x0061, 0x1CE2, 0x16FF0, 0x0334, 0x0062], NFC: [0x0061, 0x1CE2, 0x0334, 0x16FF0, 0x0062], NFD: [0x0061, 0x1CE2, 0x0334, 0x16FF0, 0x0062], NFKC: [0x0061, 0x1CE2, 0x0334, 0x16FF0, 0x0062], NFKD: [0x0061, 0x1CE2, 0x0334, 0x16FF0, 0x0062] }, +{ source: [0x0061, 0x16FF0, 0x0334, 0x1CE3, 0x0062], NFC: [0x0061, 0x0334, 0x1CE3, 0x16FF0, 0x0062], NFD: [0x0061, 0x0334, 0x1CE3, 0x16FF0, 0x0062], NFKC: [0x0061, 0x0334, 0x1CE3, 0x16FF0, 0x0062], NFKD: [0x0061, 0x0334, 0x1CE3, 0x16FF0, 0x0062] }, +{ source: [0x0061, 0x1CE3, 0x16FF0, 0x0334, 0x0062], NFC: [0x0061, 0x1CE3, 0x0334, 0x16FF0, 0x0062], NFD: [0x0061, 0x1CE3, 0x0334, 0x16FF0, 0x0062], NFKC: [0x0061, 0x1CE3, 0x0334, 0x16FF0, 0x0062], NFKD: [0x0061, 0x1CE3, 0x0334, 0x16FF0, 0x0062] }, +{ source: [0x0061, 0x16FF0, 0x0334, 0x1CE4, 0x0062], NFC: [0x0061, 0x0334, 0x1CE4, 0x16FF0, 0x0062], NFD: [0x0061, 0x0334, 0x1CE4, 0x16FF0, 0x0062], NFKC: [0x0061, 0x0334, 0x1CE4, 0x16FF0, 0x0062], NFKD: [0x0061, 0x0334, 0x1CE4, 0x16FF0, 0x0062] }, +{ source: [0x0061, 0x1CE4, 0x16FF0, 0x0334, 0x0062], NFC: [0x0061, 0x1CE4, 0x0334, 0x16FF0, 0x0062], NFD: [0x0061, 0x1CE4, 0x0334, 0x16FF0, 0x0062], NFKC: [0x0061, 0x1CE4, 0x0334, 0x16FF0, 0x0062], NFKD: [0x0061, 0x1CE4, 0x0334, 0x16FF0, 0x0062] }, +{ source: [0x0061, 0x16FF0, 0x0334, 0x1CE5, 0x0062], NFC: [0x0061, 0x0334, 0x1CE5, 0x16FF0, 0x0062], NFD: [0x0061, 0x0334, 0x1CE5, 0x16FF0, 0x0062], NFKC: [0x0061, 0x0334, 0x1CE5, 0x16FF0, 0x0062], NFKD: [0x0061, 0x0334, 0x1CE5, 0x16FF0, 0x0062] }, +{ source: [0x0061, 0x1CE5, 0x16FF0, 0x0334, 0x0062], NFC: [0x0061, 0x1CE5, 0x0334, 0x16FF0, 0x0062], NFD: [0x0061, 0x1CE5, 0x0334, 0x16FF0, 0x0062], NFKC: [0x0061, 0x1CE5, 0x0334, 0x16FF0, 0x0062], NFKD: [0x0061, 0x1CE5, 0x0334, 0x16FF0, 0x0062] }, +{ source: [0x0061, 0x16FF0, 0x0334, 0x1CE6, 0x0062], NFC: [0x0061, 0x0334, 0x1CE6, 0x16FF0, 0x0062], NFD: [0x0061, 0x0334, 0x1CE6, 0x16FF0, 0x0062], NFKC: [0x0061, 0x0334, 0x1CE6, 0x16FF0, 0x0062], NFKD: [0x0061, 0x0334, 0x1CE6, 0x16FF0, 0x0062] }, +{ source: [0x0061, 0x1CE6, 0x16FF0, 0x0334, 0x0062], NFC: [0x0061, 0x1CE6, 0x0334, 0x16FF0, 0x0062], NFD: [0x0061, 0x1CE6, 0x0334, 0x16FF0, 0x0062], NFKC: [0x0061, 0x1CE6, 0x0334, 0x16FF0, 0x0062], NFKD: [0x0061, 0x1CE6, 0x0334, 0x16FF0, 0x0062] }, +{ source: [0x0061, 0x16FF0, 0x0334, 0x1CE7, 0x0062], NFC: [0x0061, 0x0334, 0x1CE7, 0x16FF0, 0x0062], NFD: [0x0061, 0x0334, 0x1CE7, 0x16FF0, 0x0062], NFKC: [0x0061, 0x0334, 0x1CE7, 0x16FF0, 0x0062], NFKD: [0x0061, 0x0334, 0x1CE7, 0x16FF0, 0x0062] }, +{ source: [0x0061, 0x1CE7, 0x16FF0, 0x0334, 0x0062], NFC: [0x0061, 0x1CE7, 0x0334, 0x16FF0, 0x0062], NFD: [0x0061, 0x1CE7, 0x0334, 0x16FF0, 0x0062], NFKC: [0x0061, 0x1CE7, 0x0334, 0x16FF0, 0x0062], NFKD: [0x0061, 0x1CE7, 0x0334, 0x16FF0, 0x0062] }, +{ source: [0x0061, 0x16FF0, 0x0334, 0x1CE8, 0x0062], NFC: [0x0061, 0x0334, 0x1CE8, 0x16FF0, 0x0062], NFD: [0x0061, 0x0334, 0x1CE8, 0x16FF0, 0x0062], NFKC: [0x0061, 0x0334, 0x1CE8, 0x16FF0, 0x0062], NFKD: [0x0061, 0x0334, 0x1CE8, 0x16FF0, 0x0062] }, +{ source: [0x0061, 0x1CE8, 0x16FF0, 0x0334, 0x0062], NFC: [0x0061, 0x1CE8, 0x0334, 0x16FF0, 0x0062], NFD: [0x0061, 0x1CE8, 0x0334, 0x16FF0, 0x0062], NFKC: [0x0061, 0x1CE8, 0x0334, 0x16FF0, 0x0062], NFKD: [0x0061, 0x1CE8, 0x0334, 0x16FF0, 0x0062] }, +{ source: [0x0061, 0x059A, 0x0316, 0x1DFA, 0x1CED, 0x0062], NFC: [0x0061, 0x1DFA, 0x0316, 0x1CED, 0x059A, 0x0062], NFD: [0x0061, 0x1DFA, 0x0316, 0x1CED, 0x059A, 0x0062], NFKC: [0x0061, 0x1DFA, 0x0316, 0x1CED, 0x059A, 0x0062], NFKD: [0x0061, 0x1DFA, 0x0316, 0x1CED, 0x059A, 0x0062] }, +{ source: [0x0061, 0x1CED, 0x059A, 0x0316, 0x1DFA, 0x0062], NFC: [0x0061, 0x1DFA, 0x1CED, 0x0316, 0x059A, 0x0062], NFD: [0x0061, 0x1DFA, 0x1CED, 0x0316, 0x059A, 0x0062], NFKC: [0x0061, 0x1DFA, 0x1CED, 0x0316, 0x059A, 0x0062], NFKD: [0x0061, 0x1DFA, 0x1CED, 0x0316, 0x059A, 0x0062] }, +{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x1CF4, 0x0062], NFC: [0x00E0, 0x05AE, 0x1CF4, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x1CF4, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x1CF4, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x1CF4, 0x0315, 0x0062] }, +{ source: [0x0061, 0x1CF4, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x1CF4, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x1CF4, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x1CF4, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x1CF4, 0x0300, 0x0315, 0x0062] }, +{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x1CF8, 0x0062], NFC: [0x00E0, 0x05AE, 0x1CF8, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x1CF8, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x1CF8, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x1CF8, 0x0315, 0x0062] }, +{ source: [0x0061, 0x1CF8, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x1CF8, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x1CF8, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x1CF8, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x1CF8, 0x0300, 0x0315, 0x0062] }, +{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x1CF9, 0x0062], NFC: [0x00E0, 0x05AE, 0x1CF9, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x1CF9, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x1CF9, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x1CF9, 0x0315, 0x0062] }, +{ source: [0x0061, 0x1CF9, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x1CF9, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x1CF9, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x1CF9, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x1CF9, 0x0300, 0x0315, 0x0062] }, +{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x1DC0, 0x0062], NFC: [0x00E0, 0x05AE, 0x1DC0, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x1DC0, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x1DC0, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x1DC0, 0x0315, 0x0062] }, +{ source: [0x0061, 0x1DC0, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x1DC0, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x1DC0, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x1DC0, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x1DC0, 0x0300, 0x0315, 0x0062] }, +{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x1DC1, 0x0062], NFC: [0x00E0, 0x05AE, 0x1DC1, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x1DC1, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x1DC1, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x1DC1, 0x0315, 0x0062] }, +{ source: [0x0061, 0x1DC1, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x1DC1, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x1DC1, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x1DC1, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x1DC1, 0x0300, 0x0315, 0x0062] }, +{ source: [0x0061, 0x059A, 0x0316, 0x1DFA, 0x1DC2, 0x0062], NFC: [0x0061, 0x1DFA, 0x0316, 0x1DC2, 0x059A, 0x0062], NFD: [0x0061, 0x1DFA, 0x0316, 0x1DC2, 0x059A, 0x0062], NFKC: [0x0061, 0x1DFA, 0x0316, 0x1DC2, 0x059A, 0x0062], NFKD: [0x0061, 0x1DFA, 0x0316, 0x1DC2, 0x059A, 0x0062] }, +{ source: [0x0061, 0x1DC2, 0x059A, 0x0316, 0x1DFA, 0x0062], NFC: [0x0061, 0x1DFA, 0x1DC2, 0x0316, 0x059A, 0x0062], NFD: [0x0061, 0x1DFA, 0x1DC2, 0x0316, 0x059A, 0x0062], NFKC: [0x0061, 0x1DFA, 0x1DC2, 0x0316, 0x059A, 0x0062], NFKD: [0x0061, 0x1DFA, 0x1DC2, 0x0316, 0x059A, 0x0062] }, +{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x1DC3, 0x0062], NFC: [0x00E0, 0x05AE, 0x1DC3, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x1DC3, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x1DC3, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x1DC3, 0x0315, 0x0062] }, +{ source: [0x0061, 0x1DC3, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x1DC3, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x1DC3, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x1DC3, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x1DC3, 0x0300, 0x0315, 0x0062] }, +{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x1DC4, 0x0062], NFC: [0x00E0, 0x05AE, 0x1DC4, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x1DC4, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x1DC4, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x1DC4, 0x0315, 0x0062] }, +{ source: [0x0061, 0x1DC4, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x1DC4, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x1DC4, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x1DC4, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x1DC4, 0x0300, 0x0315, 0x0062] }, +{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x1DC5, 0x0062], NFC: [0x00E0, 0x05AE, 0x1DC5, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x1DC5, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x1DC5, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x1DC5, 0x0315, 0x0062] }, +{ source: [0x0061, 0x1DC5, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x1DC5, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x1DC5, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x1DC5, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x1DC5, 0x0300, 0x0315, 0x0062] }, +{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x1DC6, 0x0062], NFC: [0x00E0, 0x05AE, 0x1DC6, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x1DC6, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x1DC6, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x1DC6, 0x0315, 0x0062] }, +{ source: [0x0061, 0x1DC6, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x1DC6, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x1DC6, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x1DC6, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x1DC6, 0x0300, 0x0315, 0x0062] }, +{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x1DC7, 0x0062], NFC: [0x00E0, 0x05AE, 0x1DC7, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x1DC7, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x1DC7, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x1DC7, 0x0315, 0x0062] }, +{ source: [0x0061, 0x1DC7, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x1DC7, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x1DC7, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x1DC7, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x1DC7, 0x0300, 0x0315, 0x0062] }, +{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x1DC8, 0x0062], NFC: [0x00E0, 0x05AE, 0x1DC8, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x1DC8, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x1DC8, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x1DC8, 0x0315, 0x0062] }, +{ source: [0x0061, 0x1DC8, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x1DC8, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x1DC8, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x1DC8, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x1DC8, 0x0300, 0x0315, 0x0062] }, +{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x1DC9, 0x0062], NFC: [0x00E0, 0x05AE, 0x1DC9, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x1DC9, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x1DC9, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x1DC9, 0x0315, 0x0062] }, +{ source: [0x0061, 0x1DC9, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x1DC9, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x1DC9, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x1DC9, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x1DC9, 0x0300, 0x0315, 0x0062] }, +{ source: [0x0061, 0x059A, 0x0316, 0x1DFA, 0x1DCA, 0x0062], NFC: [0x0061, 0x1DFA, 0x0316, 0x1DCA, 0x059A, 0x0062], NFD: [0x0061, 0x1DFA, 0x0316, 0x1DCA, 0x059A, 0x0062], NFKC: [0x0061, 0x1DFA, 0x0316, 0x1DCA, 0x059A, 0x0062], NFKD: [0x0061, 0x1DFA, 0x0316, 0x1DCA, 0x059A, 0x0062] }, +{ source: [0x0061, 0x1DCA, 0x059A, 0x0316, 0x1DFA, 0x0062], NFC: [0x0061, 0x1DFA, 0x1DCA, 0x0316, 0x059A, 0x0062], NFD: [0x0061, 0x1DFA, 0x1DCA, 0x0316, 0x059A, 0x0062], NFKC: [0x0061, 0x1DFA, 0x1DCA, 0x0316, 0x059A, 0x0062], NFKD: [0x0061, 0x1DFA, 0x1DCA, 0x0316, 0x059A, 0x0062] }, +{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x1DCB, 0x0062], NFC: [0x00E0, 0x05AE, 0x1DCB, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x1DCB, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x1DCB, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x1DCB, 0x0315, 0x0062] }, +{ source: [0x0061, 0x1DCB, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x1DCB, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x1DCB, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x1DCB, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x1DCB, 0x0300, 0x0315, 0x0062] }, +{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x1DCC, 0x0062], NFC: [0x00E0, 0x05AE, 0x1DCC, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x1DCC, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x1DCC, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x1DCC, 0x0315, 0x0062] }, +{ source: [0x0061, 0x1DCC, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x1DCC, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x1DCC, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x1DCC, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x1DCC, 0x0300, 0x0315, 0x0062] }, +{ source: [0x0061, 0x0345, 0x035D, 0x035C, 0x1DCD, 0x0062], NFC: [0x0061, 0x035C, 0x035D, 0x1DCD, 0x0345, 0x0062], NFD: [0x0061, 0x035C, 0x035D, 0x1DCD, 0x0345, 0x0062], NFKC: [0x0061, 0x035C, 0x035D, 0x1DCD, 0x0345, 0x0062], NFKD: [0x0061, 0x035C, 0x035D, 0x1DCD, 0x0345, 0x0062] }, +{ source: [0x0061, 0x1DCD, 0x0345, 0x035D, 0x035C, 0x0062], NFC: [0x0061, 0x035C, 0x1DCD, 0x035D, 0x0345, 0x0062], NFD: [0x0061, 0x035C, 0x1DCD, 0x035D, 0x0345, 0x0062], NFKC: [0x0061, 0x035C, 0x1DCD, 0x035D, 0x0345, 0x0062], NFKD: [0x0061, 0x035C, 0x1DCD, 0x035D, 0x0345, 0x0062] }, +{ source: [0x0061, 0x031B, 0x1DCE, 0x0321, 0x1DCE, 0x0062], NFC: [0x0061, 0x0321, 0x1DCE, 0x1DCE, 0x031B, 0x0062], NFD: [0x0061, 0x0321, 0x1DCE, 0x1DCE, 0x031B, 0x0062], NFKC: [0x0061, 0x0321, 0x1DCE, 0x1DCE, 0x031B, 0x0062], NFKD: [0x0061, 0x0321, 0x1DCE, 0x1DCE, 0x031B, 0x0062] }, +{ source: [0x0061, 0x1DCE, 0x031B, 0x1DCE, 0x0321, 0x0062], NFC: [0x0061, 0x0321, 0x1DCE, 0x1DCE, 0x031B, 0x0062], NFD: [0x0061, 0x0321, 0x1DCE, 0x1DCE, 0x031B, 0x0062], NFKC: [0x0061, 0x0321, 0x1DCE, 0x1DCE, 0x031B, 0x0062], NFKD: [0x0061, 0x0321, 0x1DCE, 0x1DCE, 0x031B, 0x0062] }, +{ source: [0x0061, 0x059A, 0x0316, 0x1DFA, 0x1DCF, 0x0062], NFC: [0x0061, 0x1DFA, 0x0316, 0x1DCF, 0x059A, 0x0062], NFD: [0x0061, 0x1DFA, 0x0316, 0x1DCF, 0x059A, 0x0062], NFKC: [0x0061, 0x1DFA, 0x0316, 0x1DCF, 0x059A, 0x0062], NFKD: [0x0061, 0x1DFA, 0x0316, 0x1DCF, 0x059A, 0x0062] }, +{ source: [0x0061, 0x1DCF, 0x059A, 0x0316, 0x1DFA, 0x0062], NFC: [0x0061, 0x1DFA, 0x1DCF, 0x0316, 0x059A, 0x0062], NFD: [0x0061, 0x1DFA, 0x1DCF, 0x0316, 0x059A, 0x0062], NFKC: [0x0061, 0x1DFA, 0x1DCF, 0x0316, 0x059A, 0x0062], NFKD: [0x0061, 0x1DFA, 0x1DCF, 0x0316, 0x059A, 0x0062] }, +{ source: [0x0061, 0x1DCE, 0x0321, 0x0F74, 0x1DD0, 0x0062], NFC: [0x0061, 0x0F74, 0x0321, 0x1DD0, 0x1DCE, 0x0062], NFD: [0x0061, 0x0F74, 0x0321, 0x1DD0, 0x1DCE, 0x0062], NFKC: [0x0061, 0x0F74, 0x0321, 0x1DD0, 0x1DCE, 0x0062], NFKD: [0x0061, 0x0F74, 0x0321, 0x1DD0, 0x1DCE, 0x0062] }, +{ source: [0x0061, 0x1DD0, 0x1DCE, 0x0321, 0x0F74, 0x0062], NFC: [0x0061, 0x0F74, 0x1DD0, 0x0321, 0x1DCE, 0x0062], NFD: [0x0061, 0x0F74, 0x1DD0, 0x0321, 0x1DCE, 0x0062], NFKC: [0x0061, 0x0F74, 0x1DD0, 0x0321, 0x1DCE, 0x0062], NFKD: [0x0061, 0x0F74, 0x1DD0, 0x0321, 0x1DCE, 0x0062] }, +{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x1DD1, 0x0062], NFC: [0x00E0, 0x05AE, 0x1DD1, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x1DD1, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x1DD1, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x1DD1, 0x0315, 0x0062] }, +{ source: [0x0061, 0x1DD1, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x1DD1, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x1DD1, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x1DD1, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x1DD1, 0x0300, 0x0315, 0x0062] }, +{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x1DD2, 0x0062], NFC: [0x00E0, 0x05AE, 0x1DD2, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x1DD2, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x1DD2, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x1DD2, 0x0315, 0x0062] }, +{ source: [0x0061, 0x1DD2, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x1DD2, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x1DD2, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x1DD2, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x1DD2, 0x0300, 0x0315, 0x0062] }, +{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x1DD3, 0x0062], NFC: [0x00E0, 0x05AE, 0x1DD3, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x1DD3, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x1DD3, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x1DD3, 0x0315, 0x0062] }, +{ source: [0x0061, 0x1DD3, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x1DD3, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x1DD3, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x1DD3, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x1DD3, 0x0300, 0x0315, 0x0062] }, +{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x1DD4, 0x0062], NFC: [0x00E0, 0x05AE, 0x1DD4, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x1DD4, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x1DD4, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x1DD4, 0x0315, 0x0062] }, +{ source: [0x0061, 0x1DD4, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x1DD4, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x1DD4, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x1DD4, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x1DD4, 0x0300, 0x0315, 0x0062] }, +{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x1DD5, 0x0062], NFC: [0x00E0, 0x05AE, 0x1DD5, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x1DD5, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x1DD5, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x1DD5, 0x0315, 0x0062] }, +{ source: [0x0061, 0x1DD5, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x1DD5, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x1DD5, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x1DD5, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x1DD5, 0x0300, 0x0315, 0x0062] }, +{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x1DD6, 0x0062], NFC: [0x00E0, 0x05AE, 0x1DD6, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x1DD6, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x1DD6, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x1DD6, 0x0315, 0x0062] }, +{ source: [0x0061, 0x1DD6, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x1DD6, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x1DD6, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x1DD6, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x1DD6, 0x0300, 0x0315, 0x0062] }, +{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x1DD7, 0x0062], NFC: [0x00E0, 0x05AE, 0x1DD7, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x1DD7, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x1DD7, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x1DD7, 0x0315, 0x0062] }, +{ source: [0x0061, 0x1DD7, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x1DD7, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x1DD7, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x1DD7, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x1DD7, 0x0300, 0x0315, 0x0062] }, +{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x1DD8, 0x0062], NFC: [0x00E0, 0x05AE, 0x1DD8, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x1DD8, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x1DD8, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x1DD8, 0x0315, 0x0062] }, +{ source: [0x0061, 0x1DD8, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x1DD8, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x1DD8, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x1DD8, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x1DD8, 0x0300, 0x0315, 0x0062] }, +{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x1DD9, 0x0062], NFC: [0x00E0, 0x05AE, 0x1DD9, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x1DD9, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x1DD9, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x1DD9, 0x0315, 0x0062] }, +{ source: [0x0061, 0x1DD9, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x1DD9, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x1DD9, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x1DD9, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x1DD9, 0x0300, 0x0315, 0x0062] }, +{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x1DDA, 0x0062], NFC: [0x00E0, 0x05AE, 0x1DDA, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x1DDA, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x1DDA, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x1DDA, 0x0315, 0x0062] }, +{ source: [0x0061, 0x1DDA, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x1DDA, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x1DDA, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x1DDA, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x1DDA, 0x0300, 0x0315, 0x0062] }, +{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x1DDB, 0x0062], NFC: [0x00E0, 0x05AE, 0x1DDB, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x1DDB, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x1DDB, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x1DDB, 0x0315, 0x0062] }, +{ source: [0x0061, 0x1DDB, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x1DDB, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x1DDB, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x1DDB, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x1DDB, 0x0300, 0x0315, 0x0062] }, +{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x1DDC, 0x0062], NFC: [0x00E0, 0x05AE, 0x1DDC, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x1DDC, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x1DDC, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x1DDC, 0x0315, 0x0062] }, +{ source: [0x0061, 0x1DDC, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x1DDC, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x1DDC, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x1DDC, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x1DDC, 0x0300, 0x0315, 0x0062] }, +{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x1DDD, 0x0062], NFC: [0x00E0, 0x05AE, 0x1DDD, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x1DDD, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x1DDD, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x1DDD, 0x0315, 0x0062] }, +{ source: [0x0061, 0x1DDD, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x1DDD, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x1DDD, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x1DDD, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x1DDD, 0x0300, 0x0315, 0x0062] }, +{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x1DDE, 0x0062], NFC: [0x00E0, 0x05AE, 0x1DDE, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x1DDE, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x1DDE, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x1DDE, 0x0315, 0x0062] }, +{ source: [0x0061, 0x1DDE, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x1DDE, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x1DDE, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x1DDE, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x1DDE, 0x0300, 0x0315, 0x0062] }, +{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x1DDF, 0x0062], NFC: [0x00E0, 0x05AE, 0x1DDF, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x1DDF, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x1DDF, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x1DDF, 0x0315, 0x0062] }, +{ source: [0x0061, 0x1DDF, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x1DDF, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x1DDF, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x1DDF, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x1DDF, 0x0300, 0x0315, 0x0062] }, +{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x1DE0, 0x0062], NFC: [0x00E0, 0x05AE, 0x1DE0, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x1DE0, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x1DE0, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x1DE0, 0x0315, 0x0062] }, +{ source: [0x0061, 0x1DE0, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x1DE0, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x1DE0, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x1DE0, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x1DE0, 0x0300, 0x0315, 0x0062] }, +{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x1DE1, 0x0062], NFC: [0x00E0, 0x05AE, 0x1DE1, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x1DE1, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x1DE1, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x1DE1, 0x0315, 0x0062] }, +{ source: [0x0061, 0x1DE1, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x1DE1, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x1DE1, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x1DE1, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x1DE1, 0x0300, 0x0315, 0x0062] }, +{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x1DE2, 0x0062], NFC: [0x00E0, 0x05AE, 0x1DE2, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x1DE2, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x1DE2, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x1DE2, 0x0315, 0x0062] }, +{ source: [0x0061, 0x1DE2, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x1DE2, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x1DE2, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x1DE2, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x1DE2, 0x0300, 0x0315, 0x0062] }, +{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x1DE3, 0x0062], NFC: [0x00E0, 0x05AE, 0x1DE3, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x1DE3, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x1DE3, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x1DE3, 0x0315, 0x0062] }, +{ source: [0x0061, 0x1DE3, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x1DE3, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x1DE3, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x1DE3, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x1DE3, 0x0300, 0x0315, 0x0062] }, +{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x1DE4, 0x0062], NFC: [0x00E0, 0x05AE, 0x1DE4, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x1DE4, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x1DE4, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x1DE4, 0x0315, 0x0062] }, +{ source: [0x0061, 0x1DE4, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x1DE4, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x1DE4, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x1DE4, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x1DE4, 0x0300, 0x0315, 0x0062] }, +{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x1DE5, 0x0062], NFC: [0x00E0, 0x05AE, 0x1DE5, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x1DE5, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x1DE5, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x1DE5, 0x0315, 0x0062] }, +{ source: [0x0061, 0x1DE5, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x1DE5, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x1DE5, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x1DE5, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x1DE5, 0x0300, 0x0315, 0x0062] }, +{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x1DE6, 0x0062], NFC: [0x00E0, 0x05AE, 0x1DE6, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x1DE6, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x1DE6, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x1DE6, 0x0315, 0x0062] }, +{ source: [0x0061, 0x1DE6, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x1DE6, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x1DE6, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x1DE6, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x1DE6, 0x0300, 0x0315, 0x0062] }, +{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x1DE7, 0x0062], NFC: [0x00E0, 0x05AE, 0x1DE7, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x1DE7, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x1DE7, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x1DE7, 0x0315, 0x0062] }, +{ source: [0x0061, 0x1DE7, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x1DE7, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x1DE7, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x1DE7, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x1DE7, 0x0300, 0x0315, 0x0062] }, +{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x1DE8, 0x0062], NFC: [0x00E0, 0x05AE, 0x1DE8, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x1DE8, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x1DE8, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x1DE8, 0x0315, 0x0062] }, +{ source: [0x0061, 0x1DE8, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x1DE8, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x1DE8, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x1DE8, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x1DE8, 0x0300, 0x0315, 0x0062] }, +{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x1DE9, 0x0062], NFC: [0x00E0, 0x05AE, 0x1DE9, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x1DE9, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x1DE9, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x1DE9, 0x0315, 0x0062] }, +{ source: [0x0061, 0x1DE9, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x1DE9, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x1DE9, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x1DE9, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x1DE9, 0x0300, 0x0315, 0x0062] }, +{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x1DEA, 0x0062], NFC: [0x00E0, 0x05AE, 0x1DEA, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x1DEA, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x1DEA, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x1DEA, 0x0315, 0x0062] }, +{ source: [0x0061, 0x1DEA, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x1DEA, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x1DEA, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x1DEA, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x1DEA, 0x0300, 0x0315, 0x0062] }, +{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x1DEB, 0x0062], NFC: [0x00E0, 0x05AE, 0x1DEB, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x1DEB, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x1DEB, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x1DEB, 0x0315, 0x0062] }, +{ source: [0x0061, 0x1DEB, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x1DEB, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x1DEB, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x1DEB, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x1DEB, 0x0300, 0x0315, 0x0062] }, +{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x1DEC, 0x0062], NFC: [0x00E0, 0x05AE, 0x1DEC, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x1DEC, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x1DEC, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x1DEC, 0x0315, 0x0062] }, +{ source: [0x0061, 0x1DEC, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x1DEC, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x1DEC, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x1DEC, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x1DEC, 0x0300, 0x0315, 0x0062] }, +{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x1DED, 0x0062], NFC: [0x00E0, 0x05AE, 0x1DED, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x1DED, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x1DED, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x1DED, 0x0315, 0x0062] }, +{ source: [0x0061, 0x1DED, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x1DED, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x1DED, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x1DED, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x1DED, 0x0300, 0x0315, 0x0062] }, +{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x1DEE, 0x0062], NFC: [0x00E0, 0x05AE, 0x1DEE, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x1DEE, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x1DEE, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x1DEE, 0x0315, 0x0062] }, +{ source: [0x0061, 0x1DEE, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x1DEE, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x1DEE, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x1DEE, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x1DEE, 0x0300, 0x0315, 0x0062] }, +{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x1DEF, 0x0062], NFC: [0x00E0, 0x05AE, 0x1DEF, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x1DEF, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x1DEF, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x1DEF, 0x0315, 0x0062] }, +{ source: [0x0061, 0x1DEF, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x1DEF, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x1DEF, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x1DEF, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x1DEF, 0x0300, 0x0315, 0x0062] }, +{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x1DF0, 0x0062], NFC: [0x00E0, 0x05AE, 0x1DF0, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x1DF0, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x1DF0, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x1DF0, 0x0315, 0x0062] }, +{ source: [0x0061, 0x1DF0, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x1DF0, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x1DF0, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x1DF0, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x1DF0, 0x0300, 0x0315, 0x0062] }, +{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x1DF1, 0x0062], NFC: [0x00E0, 0x05AE, 0x1DF1, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x1DF1, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x1DF1, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x1DF1, 0x0315, 0x0062] }, +{ source: [0x0061, 0x1DF1, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x1DF1, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x1DF1, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x1DF1, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x1DF1, 0x0300, 0x0315, 0x0062] }, +{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x1DF2, 0x0062], NFC: [0x00E0, 0x05AE, 0x1DF2, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x1DF2, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x1DF2, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x1DF2, 0x0315, 0x0062] }, +{ source: [0x0061, 0x1DF2, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x1DF2, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x1DF2, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x1DF2, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x1DF2, 0x0300, 0x0315, 0x0062] }, +{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x1DF3, 0x0062], NFC: [0x00E0, 0x05AE, 0x1DF3, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x1DF3, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x1DF3, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x1DF3, 0x0315, 0x0062] }, +{ source: [0x0061, 0x1DF3, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x1DF3, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x1DF3, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x1DF3, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x1DF3, 0x0300, 0x0315, 0x0062] }, +{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x1DF4, 0x0062], NFC: [0x00E0, 0x05AE, 0x1DF4, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x1DF4, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x1DF4, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x1DF4, 0x0315, 0x0062] }, +{ source: [0x0061, 0x1DF4, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x1DF4, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x1DF4, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x1DF4, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x1DF4, 0x0300, 0x0315, 0x0062] }, +{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x1DF5, 0x0062], NFC: [0x00E0, 0x05AE, 0x1DF5, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x1DF5, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x1DF5, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x1DF5, 0x0315, 0x0062] }, +{ source: [0x0061, 0x1DF5, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x1DF5, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x1DF5, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x1DF5, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x1DF5, 0x0300, 0x0315, 0x0062] }, +{ source: [0x0061, 0x035C, 0x0315, 0x0300, 0x1DF6, 0x0062], NFC: [0x00E0, 0x0315, 0x1DF6, 0x035C, 0x0062], NFD: [0x0061, 0x0300, 0x0315, 0x1DF6, 0x035C, 0x0062], NFKC: [0x00E0, 0x0315, 0x1DF6, 0x035C, 0x0062], NFKD: [0x0061, 0x0300, 0x0315, 0x1DF6, 0x035C, 0x0062] }, +{ source: [0x0061, 0x1DF6, 0x035C, 0x0315, 0x0300, 0x0062], NFC: [0x00E0, 0x1DF6, 0x0315, 0x035C, 0x0062], NFD: [0x0061, 0x0300, 0x1DF6, 0x0315, 0x035C, 0x0062], NFKC: [0x00E0, 0x1DF6, 0x0315, 0x035C, 0x0062], NFKD: [0x0061, 0x0300, 0x1DF6, 0x0315, 0x035C, 0x0062] }, +{ source: [0x0061, 0x0300, 0x05AE, 0x1D16D, 0x1DF7, 0x0062], NFC: [0x00E0, 0x1D16D, 0x05AE, 0x1DF7, 0x0062], NFD: [0x0061, 0x1D16D, 0x05AE, 0x1DF7, 0x0300, 0x0062], NFKC: [0x00E0, 0x1D16D, 0x05AE, 0x1DF7, 0x0062], NFKD: [0x0061, 0x1D16D, 0x05AE, 0x1DF7, 0x0300, 0x0062] }, +{ source: [0x0061, 0x1DF7, 0x0300, 0x05AE, 0x1D16D, 0x0062], NFC: [0x00E0, 0x1D16D, 0x1DF7, 0x05AE, 0x0062], NFD: [0x0061, 0x1D16D, 0x1DF7, 0x05AE, 0x0300, 0x0062], NFKC: [0x00E0, 0x1D16D, 0x1DF7, 0x05AE, 0x0062], NFKD: [0x0061, 0x1D16D, 0x1DF7, 0x05AE, 0x0300, 0x0062] }, +{ source: [0x0061, 0x0300, 0x05AE, 0x1D16D, 0x1DF8, 0x0062], NFC: [0x00E0, 0x1D16D, 0x05AE, 0x1DF8, 0x0062], NFD: [0x0061, 0x1D16D, 0x05AE, 0x1DF8, 0x0300, 0x0062], NFKC: [0x00E0, 0x1D16D, 0x05AE, 0x1DF8, 0x0062], NFKD: [0x0061, 0x1D16D, 0x05AE, 0x1DF8, 0x0300, 0x0062] }, +{ source: [0x0061, 0x1DF8, 0x0300, 0x05AE, 0x1D16D, 0x0062], NFC: [0x00E0, 0x1D16D, 0x1DF8, 0x05AE, 0x0062], NFD: [0x0061, 0x1D16D, 0x1DF8, 0x05AE, 0x0300, 0x0062], NFKC: [0x00E0, 0x1D16D, 0x1DF8, 0x05AE, 0x0062], NFKD: [0x0061, 0x1D16D, 0x1DF8, 0x05AE, 0x0300, 0x0062] }, +{ source: [0x0061, 0x059A, 0x0316, 0x1DFA, 0x1DF9, 0x0062], NFC: [0x0061, 0x1DFA, 0x0316, 0x1DF9, 0x059A, 0x0062], NFD: [0x0061, 0x1DFA, 0x0316, 0x1DF9, 0x059A, 0x0062], NFKC: [0x0061, 0x1DFA, 0x0316, 0x1DF9, 0x059A, 0x0062], NFKD: [0x0061, 0x1DFA, 0x0316, 0x1DF9, 0x059A, 0x0062] }, +{ source: [0x0061, 0x1DF9, 0x059A, 0x0316, 0x1DFA, 0x0062], NFC: [0x0061, 0x1DFA, 0x1DF9, 0x0316, 0x059A, 0x0062], NFD: [0x0061, 0x1DFA, 0x1DF9, 0x0316, 0x059A, 0x0062], NFKC: [0x0061, 0x1DFA, 0x1DF9, 0x0316, 0x059A, 0x0062], NFKD: [0x0061, 0x1DFA, 0x1DF9, 0x0316, 0x059A, 0x0062] }, +{ source: [0x0061, 0x0316, 0x1DFA, 0x031B, 0x1DFA, 0x0062], NFC: [0x0061, 0x031B, 0x1DFA, 0x1DFA, 0x0316, 0x0062], NFD: [0x0061, 0x031B, 0x1DFA, 0x1DFA, 0x0316, 0x0062], NFKC: [0x0061, 0x031B, 0x1DFA, 0x1DFA, 0x0316, 0x0062], NFKD: [0x0061, 0x031B, 0x1DFA, 0x1DFA, 0x0316, 0x0062] }, +{ source: [0x0061, 0x1DFA, 0x0316, 0x1DFA, 0x031B, 0x0062], NFC: [0x0061, 0x031B, 0x1DFA, 0x1DFA, 0x0316, 0x0062], NFD: [0x0061, 0x031B, 0x1DFA, 0x1DFA, 0x0316, 0x0062], NFKC: [0x0061, 0x031B, 0x1DFA, 0x1DFA, 0x0316, 0x0062], NFKD: [0x0061, 0x031B, 0x1DFA, 0x1DFA, 0x0316, 0x0062] }, +{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x1DFB, 0x0062], NFC: [0x00E0, 0x05AE, 0x1DFB, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x1DFB, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x1DFB, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x1DFB, 0x0315, 0x0062] }, +{ source: [0x0061, 0x1DFB, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x1DFB, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x1DFB, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x1DFB, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x1DFB, 0x0300, 0x0315, 0x0062] }, +{ source: [0x0061, 0x035D, 0x035C, 0x0315, 0x1DFC, 0x0062], NFC: [0x0061, 0x0315, 0x035C, 0x1DFC, 0x035D, 0x0062], NFD: [0x0061, 0x0315, 0x035C, 0x1DFC, 0x035D, 0x0062], NFKC: [0x0061, 0x0315, 0x035C, 0x1DFC, 0x035D, 0x0062], NFKD: [0x0061, 0x0315, 0x035C, 0x1DFC, 0x035D, 0x0062] }, +{ source: [0x0061, 0x1DFC, 0x035D, 0x035C, 0x0315, 0x0062], NFC: [0x0061, 0x0315, 0x1DFC, 0x035C, 0x035D, 0x0062], NFD: [0x0061, 0x0315, 0x1DFC, 0x035C, 0x035D, 0x0062], NFKC: [0x0061, 0x0315, 0x1DFC, 0x035C, 0x035D, 0x0062], NFKD: [0x0061, 0x0315, 0x1DFC, 0x035C, 0x035D, 0x0062] }, +{ source: [0x0061, 0x059A, 0x0316, 0x1DFA, 0x1DFD, 0x0062], NFC: [0x0061, 0x1DFA, 0x0316, 0x1DFD, 0x059A, 0x0062], NFD: [0x0061, 0x1DFA, 0x0316, 0x1DFD, 0x059A, 0x0062], NFKC: [0x0061, 0x1DFA, 0x0316, 0x1DFD, 0x059A, 0x0062], NFKD: [0x0061, 0x1DFA, 0x0316, 0x1DFD, 0x059A, 0x0062] }, +{ source: [0x0061, 0x1DFD, 0x059A, 0x0316, 0x1DFA, 0x0062], NFC: [0x0061, 0x1DFA, 0x1DFD, 0x0316, 0x059A, 0x0062], NFD: [0x0061, 0x1DFA, 0x1DFD, 0x0316, 0x059A, 0x0062], NFKC: [0x0061, 0x1DFA, 0x1DFD, 0x0316, 0x059A, 0x0062], NFKD: [0x0061, 0x1DFA, 0x1DFD, 0x0316, 0x059A, 0x0062] }, +{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x1DFE, 0x0062], NFC: [0x00E0, 0x05AE, 0x1DFE, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x1DFE, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x1DFE, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x1DFE, 0x0315, 0x0062] }, +{ source: [0x0061, 0x1DFE, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x1DFE, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x1DFE, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x1DFE, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x1DFE, 0x0300, 0x0315, 0x0062] }, +{ source: [0x0061, 0x059A, 0x0316, 0x1DFA, 0x1DFF, 0x0062], NFC: [0x0061, 0x1DFA, 0x0316, 0x1DFF, 0x059A, 0x0062], NFD: [0x0061, 0x1DFA, 0x0316, 0x1DFF, 0x059A, 0x0062], NFKC: [0x0061, 0x1DFA, 0x0316, 0x1DFF, 0x059A, 0x0062], NFKD: [0x0061, 0x1DFA, 0x0316, 0x1DFF, 0x059A, 0x0062] }, +{ source: [0x0061, 0x1DFF, 0x059A, 0x0316, 0x1DFA, 0x0062], NFC: [0x0061, 0x1DFA, 0x1DFF, 0x0316, 0x059A, 0x0062], NFD: [0x0061, 0x1DFA, 0x1DFF, 0x0316, 0x059A, 0x0062], NFKC: [0x0061, 0x1DFA, 0x1DFF, 0x0316, 0x059A, 0x0062], NFKD: [0x0061, 0x1DFA, 0x1DFF, 0x0316, 0x059A, 0x0062] }, +{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x20D0, 0x0062], NFC: [0x00E0, 0x05AE, 0x20D0, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x20D0, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x20D0, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x20D0, 0x0315, 0x0062] }, +{ source: [0x0061, 0x20D0, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x20D0, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x20D0, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x20D0, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x20D0, 0x0300, 0x0315, 0x0062] }, +{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x20D1, 0x0062], NFC: [0x00E0, 0x05AE, 0x20D1, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x20D1, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x20D1, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x20D1, 0x0315, 0x0062] }, +{ source: [0x0061, 0x20D1, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x20D1, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x20D1, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x20D1, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x20D1, 0x0300, 0x0315, 0x0062] }, +{ source: [0x0061, 0x16FF0, 0x0334, 0x20D2, 0x0062], NFC: [0x0061, 0x0334, 0x20D2, 0x16FF0, 0x0062], NFD: [0x0061, 0x0334, 0x20D2, 0x16FF0, 0x0062], NFKC: [0x0061, 0x0334, 0x20D2, 0x16FF0, 0x0062], NFKD: [0x0061, 0x0334, 0x20D2, 0x16FF0, 0x0062] }, +{ source: [0x0061, 0x20D2, 0x16FF0, 0x0334, 0x0062], NFC: [0x0061, 0x20D2, 0x0334, 0x16FF0, 0x0062], NFD: [0x0061, 0x20D2, 0x0334, 0x16FF0, 0x0062], NFKC: [0x0061, 0x20D2, 0x0334, 0x16FF0, 0x0062], NFKD: [0x0061, 0x20D2, 0x0334, 0x16FF0, 0x0062] }, +{ source: [0x0061, 0x16FF0, 0x0334, 0x20D3, 0x0062], NFC: [0x0061, 0x0334, 0x20D3, 0x16FF0, 0x0062], NFD: [0x0061, 0x0334, 0x20D3, 0x16FF0, 0x0062], NFKC: [0x0061, 0x0334, 0x20D3, 0x16FF0, 0x0062], NFKD: [0x0061, 0x0334, 0x20D3, 0x16FF0, 0x0062] }, +{ source: [0x0061, 0x20D3, 0x16FF0, 0x0334, 0x0062], NFC: [0x0061, 0x20D3, 0x0334, 0x16FF0, 0x0062], NFD: [0x0061, 0x20D3, 0x0334, 0x16FF0, 0x0062], NFKC: [0x0061, 0x20D3, 0x0334, 0x16FF0, 0x0062], NFKD: [0x0061, 0x20D3, 0x0334, 0x16FF0, 0x0062] }, +{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x20D4, 0x0062], NFC: [0x00E0, 0x05AE, 0x20D4, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x20D4, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x20D4, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x20D4, 0x0315, 0x0062] }, +{ source: [0x0061, 0x20D4, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x20D4, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x20D4, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x20D4, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x20D4, 0x0300, 0x0315, 0x0062] }, +{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x20D5, 0x0062], NFC: [0x00E0, 0x05AE, 0x20D5, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x20D5, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x20D5, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x20D5, 0x0315, 0x0062] }, +{ source: [0x0061, 0x20D5, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x20D5, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x20D5, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x20D5, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x20D5, 0x0300, 0x0315, 0x0062] }, +{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x20D6, 0x0062], NFC: [0x00E0, 0x05AE, 0x20D6, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x20D6, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x20D6, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x20D6, 0x0315, 0x0062] }, +{ source: [0x0061, 0x20D6, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x20D6, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x20D6, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x20D6, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x20D6, 0x0300, 0x0315, 0x0062] }, +{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x20D7, 0x0062], NFC: [0x00E0, 0x05AE, 0x20D7, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x20D7, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x20D7, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x20D7, 0x0315, 0x0062] }, +{ source: [0x0061, 0x20D7, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x20D7, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x20D7, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x20D7, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x20D7, 0x0300, 0x0315, 0x0062] }, +{ source: [0x0061, 0x16FF0, 0x0334, 0x20D8, 0x0062], NFC: [0x0061, 0x0334, 0x20D8, 0x16FF0, 0x0062], NFD: [0x0061, 0x0334, 0x20D8, 0x16FF0, 0x0062], NFKC: [0x0061, 0x0334, 0x20D8, 0x16FF0, 0x0062], NFKD: [0x0061, 0x0334, 0x20D8, 0x16FF0, 0x0062] }, +{ source: [0x0061, 0x20D8, 0x16FF0, 0x0334, 0x0062], NFC: [0x0061, 0x20D8, 0x0334, 0x16FF0, 0x0062], NFD: [0x0061, 0x20D8, 0x0334, 0x16FF0, 0x0062], NFKC: [0x0061, 0x20D8, 0x0334, 0x16FF0, 0x0062], NFKD: [0x0061, 0x20D8, 0x0334, 0x16FF0, 0x0062] }, +{ source: [0x0061, 0x16FF0, 0x0334, 0x20D9, 0x0062], NFC: [0x0061, 0x0334, 0x20D9, 0x16FF0, 0x0062], NFD: [0x0061, 0x0334, 0x20D9, 0x16FF0, 0x0062], NFKC: [0x0061, 0x0334, 0x20D9, 0x16FF0, 0x0062], NFKD: [0x0061, 0x0334, 0x20D9, 0x16FF0, 0x0062] }, +{ source: [0x0061, 0x20D9, 0x16FF0, 0x0334, 0x0062], NFC: [0x0061, 0x20D9, 0x0334, 0x16FF0, 0x0062], NFD: [0x0061, 0x20D9, 0x0334, 0x16FF0, 0x0062], NFKC: [0x0061, 0x20D9, 0x0334, 0x16FF0, 0x0062], NFKD: [0x0061, 0x20D9, 0x0334, 0x16FF0, 0x0062] }, +{ source: [0x0061, 0x16FF0, 0x0334, 0x20DA, 0x0062], NFC: [0x0061, 0x0334, 0x20DA, 0x16FF0, 0x0062], NFD: [0x0061, 0x0334, 0x20DA, 0x16FF0, 0x0062], NFKC: [0x0061, 0x0334, 0x20DA, 0x16FF0, 0x0062], NFKD: [0x0061, 0x0334, 0x20DA, 0x16FF0, 0x0062] }, +{ source: [0x0061, 0x20DA, 0x16FF0, 0x0334, 0x0062], NFC: [0x0061, 0x20DA, 0x0334, 0x16FF0, 0x0062], NFD: [0x0061, 0x20DA, 0x0334, 0x16FF0, 0x0062], NFKC: [0x0061, 0x20DA, 0x0334, 0x16FF0, 0x0062], NFKD: [0x0061, 0x20DA, 0x0334, 0x16FF0, 0x0062] }, +{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x20DB, 0x0062], NFC: [0x00E0, 0x05AE, 0x20DB, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x20DB, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x20DB, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x20DB, 0x0315, 0x0062] }, +{ source: [0x0061, 0x20DB, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x20DB, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x20DB, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x20DB, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x20DB, 0x0300, 0x0315, 0x0062] }, +{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x20DC, 0x0062], NFC: [0x00E0, 0x05AE, 0x20DC, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x20DC, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x20DC, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x20DC, 0x0315, 0x0062] }, +{ source: [0x0061, 0x20DC, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x20DC, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x20DC, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x20DC, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x20DC, 0x0300, 0x0315, 0x0062] }, +{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x20E1, 0x0062], NFC: [0x00E0, 0x05AE, 0x20E1, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x20E1, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x20E1, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x20E1, 0x0315, 0x0062] }, +{ source: [0x0061, 0x20E1, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x20E1, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x20E1, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x20E1, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x20E1, 0x0300, 0x0315, 0x0062] }, +{ source: [0x0061, 0x16FF0, 0x0334, 0x20E5, 0x0062], NFC: [0x0061, 0x0334, 0x20E5, 0x16FF0, 0x0062], NFD: [0x0061, 0x0334, 0x20E5, 0x16FF0, 0x0062], NFKC: [0x0061, 0x0334, 0x20E5, 0x16FF0, 0x0062], NFKD: [0x0061, 0x0334, 0x20E5, 0x16FF0, 0x0062] }, +{ source: [0x0061, 0x20E5, 0x16FF0, 0x0334, 0x0062], NFC: [0x0061, 0x20E5, 0x0334, 0x16FF0, 0x0062], NFD: [0x0061, 0x20E5, 0x0334, 0x16FF0, 0x0062], NFKC: [0x0061, 0x20E5, 0x0334, 0x16FF0, 0x0062], NFKD: [0x0061, 0x20E5, 0x0334, 0x16FF0, 0x0062] }, +{ source: [0x0061, 0x16FF0, 0x0334, 0x20E6, 0x0062], NFC: [0x0061, 0x0334, 0x20E6, 0x16FF0, 0x0062], NFD: [0x0061, 0x0334, 0x20E6, 0x16FF0, 0x0062], NFKC: [0x0061, 0x0334, 0x20E6, 0x16FF0, 0x0062], NFKD: [0x0061, 0x0334, 0x20E6, 0x16FF0, 0x0062] }, +{ source: [0x0061, 0x20E6, 0x16FF0, 0x0334, 0x0062], NFC: [0x0061, 0x20E6, 0x0334, 0x16FF0, 0x0062], NFD: [0x0061, 0x20E6, 0x0334, 0x16FF0, 0x0062], NFKC: [0x0061, 0x20E6, 0x0334, 0x16FF0, 0x0062], NFKD: [0x0061, 0x20E6, 0x0334, 0x16FF0, 0x0062] }, +{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x20E7, 0x0062], NFC: [0x00E0, 0x05AE, 0x20E7, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x20E7, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x20E7, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x20E7, 0x0315, 0x0062] }, +{ source: [0x0061, 0x20E7, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x20E7, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x20E7, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x20E7, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x20E7, 0x0300, 0x0315, 0x0062] }, +{ source: [0x0061, 0x059A, 0x0316, 0x1DFA, 0x20E8, 0x0062], NFC: [0x0061, 0x1DFA, 0x0316, 0x20E8, 0x059A, 0x0062], NFD: [0x0061, 0x1DFA, 0x0316, 0x20E8, 0x059A, 0x0062], NFKC: [0x0061, 0x1DFA, 0x0316, 0x20E8, 0x059A, 0x0062], NFKD: [0x0061, 0x1DFA, 0x0316, 0x20E8, 0x059A, 0x0062] }, +{ source: [0x0061, 0x20E8, 0x059A, 0x0316, 0x1DFA, 0x0062], NFC: [0x0061, 0x1DFA, 0x20E8, 0x0316, 0x059A, 0x0062], NFD: [0x0061, 0x1DFA, 0x20E8, 0x0316, 0x059A, 0x0062], NFKC: [0x0061, 0x1DFA, 0x20E8, 0x0316, 0x059A, 0x0062], NFKD: [0x0061, 0x1DFA, 0x20E8, 0x0316, 0x059A, 0x0062] }, +{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x20E9, 0x0062], NFC: [0x00E0, 0x05AE, 0x20E9, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x20E9, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x20E9, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x20E9, 0x0315, 0x0062] }, +{ source: [0x0061, 0x20E9, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x20E9, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x20E9, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x20E9, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x20E9, 0x0300, 0x0315, 0x0062] }, +{ source: [0x0061, 0x16FF0, 0x0334, 0x20EA, 0x0062], NFC: [0x0061, 0x0334, 0x20EA, 0x16FF0, 0x0062], NFD: [0x0061, 0x0334, 0x20EA, 0x16FF0, 0x0062], NFKC: [0x0061, 0x0334, 0x20EA, 0x16FF0, 0x0062], NFKD: [0x0061, 0x0334, 0x20EA, 0x16FF0, 0x0062] }, +{ source: [0x0061, 0x20EA, 0x16FF0, 0x0334, 0x0062], NFC: [0x0061, 0x20EA, 0x0334, 0x16FF0, 0x0062], NFD: [0x0061, 0x20EA, 0x0334, 0x16FF0, 0x0062], NFKC: [0x0061, 0x20EA, 0x0334, 0x16FF0, 0x0062], NFKD: [0x0061, 0x20EA, 0x0334, 0x16FF0, 0x0062] }, +{ source: [0x0061, 0x16FF0, 0x0334, 0x20EB, 0x0062], NFC: [0x0061, 0x0334, 0x20EB, 0x16FF0, 0x0062], NFD: [0x0061, 0x0334, 0x20EB, 0x16FF0, 0x0062], NFKC: [0x0061, 0x0334, 0x20EB, 0x16FF0, 0x0062], NFKD: [0x0061, 0x0334, 0x20EB, 0x16FF0, 0x0062] }, +{ source: [0x0061, 0x20EB, 0x16FF0, 0x0334, 0x0062], NFC: [0x0061, 0x20EB, 0x0334, 0x16FF0, 0x0062], NFD: [0x0061, 0x20EB, 0x0334, 0x16FF0, 0x0062], NFKC: [0x0061, 0x20EB, 0x0334, 0x16FF0, 0x0062], NFKD: [0x0061, 0x20EB, 0x0334, 0x16FF0, 0x0062] }, +{ source: [0x0061, 0x059A, 0x0316, 0x1DFA, 0x20EC, 0x0062], NFC: [0x0061, 0x1DFA, 0x0316, 0x20EC, 0x059A, 0x0062], NFD: [0x0061, 0x1DFA, 0x0316, 0x20EC, 0x059A, 0x0062], NFKC: [0x0061, 0x1DFA, 0x0316, 0x20EC, 0x059A, 0x0062], NFKD: [0x0061, 0x1DFA, 0x0316, 0x20EC, 0x059A, 0x0062] }, +{ source: [0x0061, 0x20EC, 0x059A, 0x0316, 0x1DFA, 0x0062], NFC: [0x0061, 0x1DFA, 0x20EC, 0x0316, 0x059A, 0x0062], NFD: [0x0061, 0x1DFA, 0x20EC, 0x0316, 0x059A, 0x0062], NFKC: [0x0061, 0x1DFA, 0x20EC, 0x0316, 0x059A, 0x0062], NFKD: [0x0061, 0x1DFA, 0x20EC, 0x0316, 0x059A, 0x0062] }, +{ source: [0x0061, 0x059A, 0x0316, 0x1DFA, 0x20ED, 0x0062], NFC: [0x0061, 0x1DFA, 0x0316, 0x20ED, 0x059A, 0x0062], NFD: [0x0061, 0x1DFA, 0x0316, 0x20ED, 0x059A, 0x0062], NFKC: [0x0061, 0x1DFA, 0x0316, 0x20ED, 0x059A, 0x0062], NFKD: [0x0061, 0x1DFA, 0x0316, 0x20ED, 0x059A, 0x0062] }, +{ source: [0x0061, 0x20ED, 0x059A, 0x0316, 0x1DFA, 0x0062], NFC: [0x0061, 0x1DFA, 0x20ED, 0x0316, 0x059A, 0x0062], NFD: [0x0061, 0x1DFA, 0x20ED, 0x0316, 0x059A, 0x0062], NFKC: [0x0061, 0x1DFA, 0x20ED, 0x0316, 0x059A, 0x0062], NFKD: [0x0061, 0x1DFA, 0x20ED, 0x0316, 0x059A, 0x0062] }, +{ source: [0x0061, 0x059A, 0x0316, 0x1DFA, 0x20EE, 0x0062], NFC: [0x0061, 0x1DFA, 0x0316, 0x20EE, 0x059A, 0x0062], NFD: [0x0061, 0x1DFA, 0x0316, 0x20EE, 0x059A, 0x0062], NFKC: [0x0061, 0x1DFA, 0x0316, 0x20EE, 0x059A, 0x0062], NFKD: [0x0061, 0x1DFA, 0x0316, 0x20EE, 0x059A, 0x0062] }, +{ source: [0x0061, 0x20EE, 0x059A, 0x0316, 0x1DFA, 0x0062], NFC: [0x0061, 0x1DFA, 0x20EE, 0x0316, 0x059A, 0x0062], NFD: [0x0061, 0x1DFA, 0x20EE, 0x0316, 0x059A, 0x0062], NFKC: [0x0061, 0x1DFA, 0x20EE, 0x0316, 0x059A, 0x0062], NFKD: [0x0061, 0x1DFA, 0x20EE, 0x0316, 0x059A, 0x0062] }, +{ source: [0x0061, 0x059A, 0x0316, 0x1DFA, 0x20EF, 0x0062], NFC: [0x0061, 0x1DFA, 0x0316, 0x20EF, 0x059A, 0x0062], NFD: [0x0061, 0x1DFA, 0x0316, 0x20EF, 0x059A, 0x0062], NFKC: [0x0061, 0x1DFA, 0x0316, 0x20EF, 0x059A, 0x0062], NFKD: [0x0061, 0x1DFA, 0x0316, 0x20EF, 0x059A, 0x0062] }, +{ source: [0x0061, 0x20EF, 0x059A, 0x0316, 0x1DFA, 0x0062], NFC: [0x0061, 0x1DFA, 0x20EF, 0x0316, 0x059A, 0x0062], NFD: [0x0061, 0x1DFA, 0x20EF, 0x0316, 0x059A, 0x0062], NFKC: [0x0061, 0x1DFA, 0x20EF, 0x0316, 0x059A, 0x0062], NFKD: [0x0061, 0x1DFA, 0x20EF, 0x0316, 0x059A, 0x0062] }, +{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x20F0, 0x0062], NFC: [0x00E0, 0x05AE, 0x20F0, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x20F0, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x20F0, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x20F0, 0x0315, 0x0062] }, +{ source: [0x0061, 0x20F0, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x20F0, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x20F0, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x20F0, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x20F0, 0x0300, 0x0315, 0x0062] }, +{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x2CEF, 0x0062], NFC: [0x00E0, 0x05AE, 0x2CEF, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x2CEF, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x2CEF, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x2CEF, 0x0315, 0x0062] }, +{ source: [0x0061, 0x2CEF, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x2CEF, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x2CEF, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x2CEF, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x2CEF, 0x0300, 0x0315, 0x0062] }, +{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x2CF0, 0x0062], NFC: [0x00E0, 0x05AE, 0x2CF0, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x2CF0, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x2CF0, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x2CF0, 0x0315, 0x0062] }, +{ source: [0x0061, 0x2CF0, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x2CF0, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x2CF0, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x2CF0, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x2CF0, 0x0300, 0x0315, 0x0062] }, +{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x2CF1, 0x0062], NFC: [0x00E0, 0x05AE, 0x2CF1, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x2CF1, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x2CF1, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x2CF1, 0x0315, 0x0062] }, +{ source: [0x0061, 0x2CF1, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x2CF1, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x2CF1, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x2CF1, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x2CF1, 0x0300, 0x0315, 0x0062] }, +{ source: [0x0061, 0x05B0, 0x094D, 0x3099, 0x2D7F, 0x0062], NFC: [0x0061, 0x3099, 0x094D, 0x2D7F, 0x05B0, 0x0062], NFD: [0x0061, 0x3099, 0x094D, 0x2D7F, 0x05B0, 0x0062], NFKC: [0x0061, 0x3099, 0x094D, 0x2D7F, 0x05B0, 0x0062], NFKD: [0x0061, 0x3099, 0x094D, 0x2D7F, 0x05B0, 0x0062] }, +{ source: [0x0061, 0x2D7F, 0x05B0, 0x094D, 0x3099, 0x0062], NFC: [0x0061, 0x3099, 0x2D7F, 0x094D, 0x05B0, 0x0062], NFD: [0x0061, 0x3099, 0x2D7F, 0x094D, 0x05B0, 0x0062], NFKC: [0x0061, 0x3099, 0x2D7F, 0x094D, 0x05B0, 0x0062], NFKD: [0x0061, 0x3099, 0x2D7F, 0x094D, 0x05B0, 0x0062] }, +{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x2DE0, 0x0062], NFC: [0x00E0, 0x05AE, 0x2DE0, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x2DE0, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x2DE0, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x2DE0, 0x0315, 0x0062] }, +{ source: [0x0061, 0x2DE0, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x2DE0, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x2DE0, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x2DE0, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x2DE0, 0x0300, 0x0315, 0x0062] }, +{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x2DE1, 0x0062], NFC: [0x00E0, 0x05AE, 0x2DE1, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x2DE1, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x2DE1, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x2DE1, 0x0315, 0x0062] }, +{ source: [0x0061, 0x2DE1, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x2DE1, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x2DE1, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x2DE1, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x2DE1, 0x0300, 0x0315, 0x0062] }, +{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x2DE2, 0x0062], NFC: [0x00E0, 0x05AE, 0x2DE2, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x2DE2, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x2DE2, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x2DE2, 0x0315, 0x0062] }, +{ source: [0x0061, 0x2DE2, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x2DE2, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x2DE2, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x2DE2, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x2DE2, 0x0300, 0x0315, 0x0062] }, +{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x2DE3, 0x0062], NFC: [0x00E0, 0x05AE, 0x2DE3, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x2DE3, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x2DE3, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x2DE3, 0x0315, 0x0062] }, +{ source: [0x0061, 0x2DE3, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x2DE3, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x2DE3, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x2DE3, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x2DE3, 0x0300, 0x0315, 0x0062] }, +{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x2DE4, 0x0062], NFC: [0x00E0, 0x05AE, 0x2DE4, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x2DE4, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x2DE4, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x2DE4, 0x0315, 0x0062] }, +{ source: [0x0061, 0x2DE4, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x2DE4, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x2DE4, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x2DE4, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x2DE4, 0x0300, 0x0315, 0x0062] }, +{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x2DE5, 0x0062], NFC: [0x00E0, 0x05AE, 0x2DE5, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x2DE5, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x2DE5, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x2DE5, 0x0315, 0x0062] }, +{ source: [0x0061, 0x2DE5, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x2DE5, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x2DE5, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x2DE5, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x2DE5, 0x0300, 0x0315, 0x0062] }, +{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x2DE6, 0x0062], NFC: [0x00E0, 0x05AE, 0x2DE6, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x2DE6, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x2DE6, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x2DE6, 0x0315, 0x0062] }, +{ source: [0x0061, 0x2DE6, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x2DE6, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x2DE6, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x2DE6, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x2DE6, 0x0300, 0x0315, 0x0062] }, +{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x2DE7, 0x0062], NFC: [0x00E0, 0x05AE, 0x2DE7, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x2DE7, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x2DE7, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x2DE7, 0x0315, 0x0062] }, +{ source: [0x0061, 0x2DE7, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x2DE7, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x2DE7, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x2DE7, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x2DE7, 0x0300, 0x0315, 0x0062] }, +{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x2DE8, 0x0062], NFC: [0x00E0, 0x05AE, 0x2DE8, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x2DE8, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x2DE8, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x2DE8, 0x0315, 0x0062] }, +{ source: [0x0061, 0x2DE8, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x2DE8, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x2DE8, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x2DE8, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x2DE8, 0x0300, 0x0315, 0x0062] }, +{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x2DE9, 0x0062], NFC: [0x00E0, 0x05AE, 0x2DE9, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x2DE9, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x2DE9, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x2DE9, 0x0315, 0x0062] }, +{ source: [0x0061, 0x2DE9, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x2DE9, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x2DE9, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x2DE9, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x2DE9, 0x0300, 0x0315, 0x0062] }, +{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x2DEA, 0x0062], NFC: [0x00E0, 0x05AE, 0x2DEA, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x2DEA, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x2DEA, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x2DEA, 0x0315, 0x0062] }, +{ source: [0x0061, 0x2DEA, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x2DEA, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x2DEA, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x2DEA, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x2DEA, 0x0300, 0x0315, 0x0062] }, +{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x2DEB, 0x0062], NFC: [0x00E0, 0x05AE, 0x2DEB, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x2DEB, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x2DEB, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x2DEB, 0x0315, 0x0062] }, +{ source: [0x0061, 0x2DEB, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x2DEB, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x2DEB, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x2DEB, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x2DEB, 0x0300, 0x0315, 0x0062] }, +{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x2DEC, 0x0062], NFC: [0x00E0, 0x05AE, 0x2DEC, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x2DEC, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x2DEC, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x2DEC, 0x0315, 0x0062] }, +{ source: [0x0061, 0x2DEC, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x2DEC, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x2DEC, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x2DEC, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x2DEC, 0x0300, 0x0315, 0x0062] }, +{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x2DED, 0x0062], NFC: [0x00E0, 0x05AE, 0x2DED, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x2DED, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x2DED, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x2DED, 0x0315, 0x0062] }, +{ source: [0x0061, 0x2DED, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x2DED, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x2DED, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x2DED, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x2DED, 0x0300, 0x0315, 0x0062] }, +{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x2DEE, 0x0062], NFC: [0x00E0, 0x05AE, 0x2DEE, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x2DEE, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x2DEE, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x2DEE, 0x0315, 0x0062] }, +{ source: [0x0061, 0x2DEE, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x2DEE, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x2DEE, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x2DEE, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x2DEE, 0x0300, 0x0315, 0x0062] }, +{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x2DEF, 0x0062], NFC: [0x00E0, 0x05AE, 0x2DEF, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x2DEF, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x2DEF, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x2DEF, 0x0315, 0x0062] }, +{ source: [0x0061, 0x2DEF, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x2DEF, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x2DEF, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x2DEF, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x2DEF, 0x0300, 0x0315, 0x0062] }, +{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x2DF0, 0x0062], NFC: [0x00E0, 0x05AE, 0x2DF0, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x2DF0, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x2DF0, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x2DF0, 0x0315, 0x0062] }, +{ source: [0x0061, 0x2DF0, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x2DF0, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x2DF0, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x2DF0, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x2DF0, 0x0300, 0x0315, 0x0062] }, +{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x2DF1, 0x0062], NFC: [0x00E0, 0x05AE, 0x2DF1, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x2DF1, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x2DF1, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x2DF1, 0x0315, 0x0062] }, +{ source: [0x0061, 0x2DF1, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x2DF1, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x2DF1, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x2DF1, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x2DF1, 0x0300, 0x0315, 0x0062] }, +{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x2DF2, 0x0062], NFC: [0x00E0, 0x05AE, 0x2DF2, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x2DF2, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x2DF2, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x2DF2, 0x0315, 0x0062] }, +{ source: [0x0061, 0x2DF2, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x2DF2, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x2DF2, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x2DF2, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x2DF2, 0x0300, 0x0315, 0x0062] }, +{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x2DF3, 0x0062], NFC: [0x00E0, 0x05AE, 0x2DF3, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x2DF3, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x2DF3, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x2DF3, 0x0315, 0x0062] }, +{ source: [0x0061, 0x2DF3, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x2DF3, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x2DF3, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x2DF3, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x2DF3, 0x0300, 0x0315, 0x0062] }, +{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x2DF4, 0x0062], NFC: [0x00E0, 0x05AE, 0x2DF4, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x2DF4, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x2DF4, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x2DF4, 0x0315, 0x0062] }, +{ source: [0x0061, 0x2DF4, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x2DF4, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x2DF4, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x2DF4, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x2DF4, 0x0300, 0x0315, 0x0062] }, +{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x2DF5, 0x0062], NFC: [0x00E0, 0x05AE, 0x2DF5, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x2DF5, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x2DF5, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x2DF5, 0x0315, 0x0062] }, +{ source: [0x0061, 0x2DF5, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x2DF5, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x2DF5, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x2DF5, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x2DF5, 0x0300, 0x0315, 0x0062] }, +{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x2DF6, 0x0062], NFC: [0x00E0, 0x05AE, 0x2DF6, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x2DF6, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x2DF6, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x2DF6, 0x0315, 0x0062] }, +{ source: [0x0061, 0x2DF6, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x2DF6, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x2DF6, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x2DF6, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x2DF6, 0x0300, 0x0315, 0x0062] }, +{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x2DF7, 0x0062], NFC: [0x00E0, 0x05AE, 0x2DF7, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x2DF7, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x2DF7, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x2DF7, 0x0315, 0x0062] }, +{ source: [0x0061, 0x2DF7, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x2DF7, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x2DF7, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x2DF7, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x2DF7, 0x0300, 0x0315, 0x0062] }, +{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x2DF8, 0x0062], NFC: [0x00E0, 0x05AE, 0x2DF8, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x2DF8, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x2DF8, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x2DF8, 0x0315, 0x0062] }, +{ source: [0x0061, 0x2DF8, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x2DF8, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x2DF8, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x2DF8, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x2DF8, 0x0300, 0x0315, 0x0062] }, +{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x2DF9, 0x0062], NFC: [0x00E0, 0x05AE, 0x2DF9, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x2DF9, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x2DF9, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x2DF9, 0x0315, 0x0062] }, +{ source: [0x0061, 0x2DF9, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x2DF9, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x2DF9, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x2DF9, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x2DF9, 0x0300, 0x0315, 0x0062] }, +{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x2DFA, 0x0062], NFC: [0x00E0, 0x05AE, 0x2DFA, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x2DFA, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x2DFA, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x2DFA, 0x0315, 0x0062] }, +{ source: [0x0061, 0x2DFA, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x2DFA, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x2DFA, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x2DFA, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x2DFA, 0x0300, 0x0315, 0x0062] }, +{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x2DFB, 0x0062], NFC: [0x00E0, 0x05AE, 0x2DFB, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x2DFB, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x2DFB, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x2DFB, 0x0315, 0x0062] }, +{ source: [0x0061, 0x2DFB, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x2DFB, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x2DFB, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x2DFB, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x2DFB, 0x0300, 0x0315, 0x0062] }, +{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x2DFC, 0x0062], NFC: [0x00E0, 0x05AE, 0x2DFC, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x2DFC, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x2DFC, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x2DFC, 0x0315, 0x0062] }, +{ source: [0x0061, 0x2DFC, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x2DFC, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x2DFC, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x2DFC, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x2DFC, 0x0300, 0x0315, 0x0062] }, +{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x2DFD, 0x0062], NFC: [0x00E0, 0x05AE, 0x2DFD, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x2DFD, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x2DFD, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x2DFD, 0x0315, 0x0062] }, +{ source: [0x0061, 0x2DFD, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x2DFD, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x2DFD, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x2DFD, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x2DFD, 0x0300, 0x0315, 0x0062] }, +{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x2DFE, 0x0062], NFC: [0x00E0, 0x05AE, 0x2DFE, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x2DFE, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x2DFE, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x2DFE, 0x0315, 0x0062] }, +{ source: [0x0061, 0x2DFE, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x2DFE, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x2DFE, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x2DFE, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x2DFE, 0x0300, 0x0315, 0x0062] }, +{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x2DFF, 0x0062], NFC: [0x00E0, 0x05AE, 0x2DFF, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x2DFF, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x2DFF, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x2DFF, 0x0315, 0x0062] }, +{ source: [0x0061, 0x2DFF, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x2DFF, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x2DFF, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x2DFF, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x2DFF, 0x0300, 0x0315, 0x0062] }, +{ source: [0x0061, 0x0316, 0x1DFA, 0x031B, 0x302A, 0x0062], NFC: [0x0061, 0x031B, 0x1DFA, 0x302A, 0x0316, 0x0062], NFD: [0x0061, 0x031B, 0x1DFA, 0x302A, 0x0316, 0x0062], NFKC: [0x0061, 0x031B, 0x1DFA, 0x302A, 0x0316, 0x0062], NFKD: [0x0061, 0x031B, 0x1DFA, 0x302A, 0x0316, 0x0062] }, +{ source: [0x0061, 0x302A, 0x0316, 0x1DFA, 0x031B, 0x0062], NFC: [0x0061, 0x031B, 0x302A, 0x1DFA, 0x0316, 0x0062], NFD: [0x0061, 0x031B, 0x302A, 0x1DFA, 0x0316, 0x0062], NFKC: [0x0061, 0x031B, 0x302A, 0x1DFA, 0x0316, 0x0062], NFKD: [0x0061, 0x031B, 0x302A, 0x1DFA, 0x0316, 0x0062] }, +{ source: [0x0061, 0x0300, 0x05AE, 0x1D16D, 0x302B, 0x0062], NFC: [0x00E0, 0x1D16D, 0x05AE, 0x302B, 0x0062], NFD: [0x0061, 0x1D16D, 0x05AE, 0x302B, 0x0300, 0x0062], NFKC: [0x00E0, 0x1D16D, 0x05AE, 0x302B, 0x0062], NFKD: [0x0061, 0x1D16D, 0x05AE, 0x302B, 0x0300, 0x0062] }, +{ source: [0x0061, 0x302B, 0x0300, 0x05AE, 0x1D16D, 0x0062], NFC: [0x00E0, 0x1D16D, 0x302B, 0x05AE, 0x0062], NFD: [0x0061, 0x1D16D, 0x302B, 0x05AE, 0x0300, 0x0062], NFKC: [0x00E0, 0x1D16D, 0x302B, 0x05AE, 0x0062], NFKD: [0x0061, 0x1D16D, 0x302B, 0x05AE, 0x0300, 0x0062] }, +{ source: [0x0061, 0x035C, 0x0315, 0x0300, 0x302C, 0x0062], NFC: [0x00E0, 0x0315, 0x302C, 0x035C, 0x0062], NFD: [0x0061, 0x0300, 0x0315, 0x302C, 0x035C, 0x0062], NFKC: [0x00E0, 0x0315, 0x302C, 0x035C, 0x0062], NFKD: [0x0061, 0x0300, 0x0315, 0x302C, 0x035C, 0x0062] }, +{ source: [0x0061, 0x302C, 0x035C, 0x0315, 0x0300, 0x0062], NFC: [0x00E0, 0x302C, 0x0315, 0x035C, 0x0062], NFD: [0x0061, 0x0300, 0x302C, 0x0315, 0x035C, 0x0062], NFKC: [0x00E0, 0x302C, 0x0315, 0x035C, 0x0062], NFKD: [0x0061, 0x0300, 0x302C, 0x0315, 0x035C, 0x0062] }, +{ source: [0x0061, 0x302E, 0x059A, 0x0316, 0x302D, 0x0062], NFC: [0x0061, 0x0316, 0x059A, 0x302D, 0x302E, 0x0062], NFD: [0x0061, 0x0316, 0x059A, 0x302D, 0x302E, 0x0062], NFKC: [0x0061, 0x0316, 0x059A, 0x302D, 0x302E, 0x0062], NFKD: [0x0061, 0x0316, 0x059A, 0x302D, 0x302E, 0x0062] }, +{ source: [0x0061, 0x302D, 0x302E, 0x059A, 0x0316, 0x0062], NFC: [0x0061, 0x0316, 0x302D, 0x059A, 0x302E, 0x0062], NFD: [0x0061, 0x0316, 0x302D, 0x059A, 0x302E, 0x0062], NFKC: [0x0061, 0x0316, 0x302D, 0x059A, 0x302E, 0x0062], NFKD: [0x0061, 0x0316, 0x302D, 0x059A, 0x302E, 0x0062] }, +{ source: [0x0061, 0x1D16D, 0x302E, 0x059A, 0x302E, 0x0062], NFC: [0x0061, 0x059A, 0x302E, 0x302E, 0x1D16D, 0x0062], NFD: [0x0061, 0x059A, 0x302E, 0x302E, 0x1D16D, 0x0062], NFKC: [0x0061, 0x059A, 0x302E, 0x302E, 0x1D16D, 0x0062], NFKD: [0x0061, 0x059A, 0x302E, 0x302E, 0x1D16D, 0x0062] }, +{ source: [0x0061, 0x302E, 0x1D16D, 0x302E, 0x059A, 0x0062], NFC: [0x0061, 0x059A, 0x302E, 0x302E, 0x1D16D, 0x0062], NFD: [0x0061, 0x059A, 0x302E, 0x302E, 0x1D16D, 0x0062], NFKC: [0x0061, 0x059A, 0x302E, 0x302E, 0x1D16D, 0x0062], NFKD: [0x0061, 0x059A, 0x302E, 0x302E, 0x1D16D, 0x0062] }, +{ source: [0x0061, 0x1D16D, 0x302E, 0x059A, 0x302F, 0x0062], NFC: [0x0061, 0x059A, 0x302E, 0x302F, 0x1D16D, 0x0062], NFD: [0x0061, 0x059A, 0x302E, 0x302F, 0x1D16D, 0x0062], NFKC: [0x0061, 0x059A, 0x302E, 0x302F, 0x1D16D, 0x0062], NFKD: [0x0061, 0x059A, 0x302E, 0x302F, 0x1D16D, 0x0062] }, +{ source: [0x0061, 0x302F, 0x1D16D, 0x302E, 0x059A, 0x0062], NFC: [0x0061, 0x059A, 0x302F, 0x302E, 0x1D16D, 0x0062], NFD: [0x0061, 0x059A, 0x302F, 0x302E, 0x1D16D, 0x0062], NFKC: [0x0061, 0x059A, 0x302F, 0x302E, 0x1D16D, 0x0062], NFKD: [0x0061, 0x059A, 0x302F, 0x302E, 0x1D16D, 0x0062] }, +{ source: [0x0061, 0x094D, 0x3099, 0x093C, 0x3099, 0x0062], NFC: [0x0061, 0x093C, 0x3099, 0x3099, 0x094D, 0x0062], NFD: [0x0061, 0x093C, 0x3099, 0x3099, 0x094D, 0x0062], NFKC: [0x0061, 0x093C, 0x3099, 0x3099, 0x094D, 0x0062], NFKD: [0x0061, 0x093C, 0x3099, 0x3099, 0x094D, 0x0062] }, +{ source: [0x0061, 0x3099, 0x094D, 0x3099, 0x093C, 0x0062], NFC: [0x0061, 0x093C, 0x3099, 0x3099, 0x094D, 0x0062], NFD: [0x0061, 0x093C, 0x3099, 0x3099, 0x094D, 0x0062], NFKC: [0x0061, 0x093C, 0x3099, 0x3099, 0x094D, 0x0062], NFKD: [0x0061, 0x093C, 0x3099, 0x3099, 0x094D, 0x0062] }, +{ source: [0x0061, 0x094D, 0x3099, 0x093C, 0x309A, 0x0062], NFC: [0x0061, 0x093C, 0x3099, 0x309A, 0x094D, 0x0062], NFD: [0x0061, 0x093C, 0x3099, 0x309A, 0x094D, 0x0062], NFKC: [0x0061, 0x093C, 0x3099, 0x309A, 0x094D, 0x0062], NFKD: [0x0061, 0x093C, 0x3099, 0x309A, 0x094D, 0x0062] }, +{ source: [0x0061, 0x309A, 0x094D, 0x3099, 0x093C, 0x0062], NFC: [0x0061, 0x093C, 0x309A, 0x3099, 0x094D, 0x0062], NFD: [0x0061, 0x093C, 0x309A, 0x3099, 0x094D, 0x0062], NFKC: [0x0061, 0x093C, 0x309A, 0x3099, 0x094D, 0x0062], NFKD: [0x0061, 0x093C, 0x309A, 0x3099, 0x094D, 0x0062] }, +{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0xA66F, 0x0062], NFC: [0x00E0, 0x05AE, 0xA66F, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0xA66F, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0xA66F, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0xA66F, 0x0315, 0x0062] }, +{ source: [0x0061, 0xA66F, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0xA66F, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0xA66F, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0xA66F, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0xA66F, 0x0300, 0x0315, 0x0062] }, +{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0xA674, 0x0062], NFC: [0x00E0, 0x05AE, 0xA674, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0xA674, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0xA674, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0xA674, 0x0315, 0x0062] }, +{ source: [0x0061, 0xA674, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0xA674, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0xA674, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0xA674, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0xA674, 0x0300, 0x0315, 0x0062] }, +{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0xA675, 0x0062], NFC: [0x00E0, 0x05AE, 0xA675, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0xA675, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0xA675, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0xA675, 0x0315, 0x0062] }, +{ source: [0x0061, 0xA675, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0xA675, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0xA675, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0xA675, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0xA675, 0x0300, 0x0315, 0x0062] }, +{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0xA676, 0x0062], NFC: [0x00E0, 0x05AE, 0xA676, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0xA676, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0xA676, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0xA676, 0x0315, 0x0062] }, +{ source: [0x0061, 0xA676, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0xA676, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0xA676, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0xA676, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0xA676, 0x0300, 0x0315, 0x0062] }, +{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0xA677, 0x0062], NFC: [0x00E0, 0x05AE, 0xA677, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0xA677, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0xA677, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0xA677, 0x0315, 0x0062] }, +{ source: [0x0061, 0xA677, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0xA677, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0xA677, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0xA677, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0xA677, 0x0300, 0x0315, 0x0062] }, +{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0xA678, 0x0062], NFC: [0x00E0, 0x05AE, 0xA678, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0xA678, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0xA678, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0xA678, 0x0315, 0x0062] }, +{ source: [0x0061, 0xA678, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0xA678, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0xA678, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0xA678, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0xA678, 0x0300, 0x0315, 0x0062] }, +{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0xA679, 0x0062], NFC: [0x00E0, 0x05AE, 0xA679, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0xA679, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0xA679, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0xA679, 0x0315, 0x0062] }, +{ source: [0x0061, 0xA679, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0xA679, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0xA679, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0xA679, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0xA679, 0x0300, 0x0315, 0x0062] }, +{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0xA67A, 0x0062], NFC: [0x00E0, 0x05AE, 0xA67A, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0xA67A, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0xA67A, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0xA67A, 0x0315, 0x0062] }, +{ source: [0x0061, 0xA67A, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0xA67A, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0xA67A, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0xA67A, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0xA67A, 0x0300, 0x0315, 0x0062] }, +{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0xA67B, 0x0062], NFC: [0x00E0, 0x05AE, 0xA67B, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0xA67B, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0xA67B, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0xA67B, 0x0315, 0x0062] }, +{ source: [0x0061, 0xA67B, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0xA67B, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0xA67B, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0xA67B, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0xA67B, 0x0300, 0x0315, 0x0062] }, +{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0xA67C, 0x0062], NFC: [0x00E0, 0x05AE, 0xA67C, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0xA67C, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0xA67C, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0xA67C, 0x0315, 0x0062] }, +{ source: [0x0061, 0xA67C, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0xA67C, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0xA67C, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0xA67C, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0xA67C, 0x0300, 0x0315, 0x0062] }, +{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0xA67D, 0x0062], NFC: [0x00E0, 0x05AE, 0xA67D, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0xA67D, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0xA67D, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0xA67D, 0x0315, 0x0062] }, +{ source: [0x0061, 0xA67D, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0xA67D, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0xA67D, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0xA67D, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0xA67D, 0x0300, 0x0315, 0x0062] }, +{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0xA69E, 0x0062], NFC: [0x00E0, 0x05AE, 0xA69E, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0xA69E, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0xA69E, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0xA69E, 0x0315, 0x0062] }, +{ source: [0x0061, 0xA69E, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0xA69E, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0xA69E, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0xA69E, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0xA69E, 0x0300, 0x0315, 0x0062] }, +{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0xA69F, 0x0062], NFC: [0x00E0, 0x05AE, 0xA69F, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0xA69F, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0xA69F, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0xA69F, 0x0315, 0x0062] }, +{ source: [0x0061, 0xA69F, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0xA69F, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0xA69F, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0xA69F, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0xA69F, 0x0300, 0x0315, 0x0062] }, +{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0xA6F0, 0x0062], NFC: [0x00E0, 0x05AE, 0xA6F0, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0xA6F0, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0xA6F0, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0xA6F0, 0x0315, 0x0062] }, +{ source: [0x0061, 0xA6F0, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0xA6F0, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0xA6F0, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0xA6F0, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0xA6F0, 0x0300, 0x0315, 0x0062] }, +{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0xA6F1, 0x0062], NFC: [0x00E0, 0x05AE, 0xA6F1, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0xA6F1, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0xA6F1, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0xA6F1, 0x0315, 0x0062] }, +{ source: [0x0061, 0xA6F1, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0xA6F1, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0xA6F1, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0xA6F1, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0xA6F1, 0x0300, 0x0315, 0x0062] }, +{ source: [0x0061, 0x05B0, 0x094D, 0x3099, 0xA806, 0x0062], NFC: [0x0061, 0x3099, 0x094D, 0xA806, 0x05B0, 0x0062], NFD: [0x0061, 0x3099, 0x094D, 0xA806, 0x05B0, 0x0062], NFKC: [0x0061, 0x3099, 0x094D, 0xA806, 0x05B0, 0x0062], NFKD: [0x0061, 0x3099, 0x094D, 0xA806, 0x05B0, 0x0062] }, +{ source: [0x0061, 0xA806, 0x05B0, 0x094D, 0x3099, 0x0062], NFC: [0x0061, 0x3099, 0xA806, 0x094D, 0x05B0, 0x0062], NFD: [0x0061, 0x3099, 0xA806, 0x094D, 0x05B0, 0x0062], NFKC: [0x0061, 0x3099, 0xA806, 0x094D, 0x05B0, 0x0062], NFKD: [0x0061, 0x3099, 0xA806, 0x094D, 0x05B0, 0x0062] }, +{ source: [0x0061, 0x05B0, 0x094D, 0x3099, 0xA82C, 0x0062], NFC: [0x0061, 0x3099, 0x094D, 0xA82C, 0x05B0, 0x0062], NFD: [0x0061, 0x3099, 0x094D, 0xA82C, 0x05B0, 0x0062], NFKC: [0x0061, 0x3099, 0x094D, 0xA82C, 0x05B0, 0x0062], NFKD: [0x0061, 0x3099, 0x094D, 0xA82C, 0x05B0, 0x0062] }, +{ source: [0x0061, 0xA82C, 0x05B0, 0x094D, 0x3099, 0x0062], NFC: [0x0061, 0x3099, 0xA82C, 0x094D, 0x05B0, 0x0062], NFD: [0x0061, 0x3099, 0xA82C, 0x094D, 0x05B0, 0x0062], NFKC: [0x0061, 0x3099, 0xA82C, 0x094D, 0x05B0, 0x0062], NFKD: [0x0061, 0x3099, 0xA82C, 0x094D, 0x05B0, 0x0062] }, +{ source: [0x0061, 0x05B0, 0x094D, 0x3099, 0xA8C4, 0x0062], NFC: [0x0061, 0x3099, 0x094D, 0xA8C4, 0x05B0, 0x0062], NFD: [0x0061, 0x3099, 0x094D, 0xA8C4, 0x05B0, 0x0062], NFKC: [0x0061, 0x3099, 0x094D, 0xA8C4, 0x05B0, 0x0062], NFKD: [0x0061, 0x3099, 0x094D, 0xA8C4, 0x05B0, 0x0062] }, +{ source: [0x0061, 0xA8C4, 0x05B0, 0x094D, 0x3099, 0x0062], NFC: [0x0061, 0x3099, 0xA8C4, 0x094D, 0x05B0, 0x0062], NFD: [0x0061, 0x3099, 0xA8C4, 0x094D, 0x05B0, 0x0062], NFKC: [0x0061, 0x3099, 0xA8C4, 0x094D, 0x05B0, 0x0062], NFKD: [0x0061, 0x3099, 0xA8C4, 0x094D, 0x05B0, 0x0062] }, +{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0xA8E0, 0x0062], NFC: [0x00E0, 0x05AE, 0xA8E0, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0xA8E0, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0xA8E0, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0xA8E0, 0x0315, 0x0062] }, +{ source: [0x0061, 0xA8E0, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0xA8E0, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0xA8E0, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0xA8E0, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0xA8E0, 0x0300, 0x0315, 0x0062] }, +{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0xA8E1, 0x0062], NFC: [0x00E0, 0x05AE, 0xA8E1, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0xA8E1, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0xA8E1, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0xA8E1, 0x0315, 0x0062] }, +{ source: [0x0061, 0xA8E1, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0xA8E1, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0xA8E1, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0xA8E1, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0xA8E1, 0x0300, 0x0315, 0x0062] }, +{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0xA8E2, 0x0062], NFC: [0x00E0, 0x05AE, 0xA8E2, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0xA8E2, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0xA8E2, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0xA8E2, 0x0315, 0x0062] }, +{ source: [0x0061, 0xA8E2, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0xA8E2, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0xA8E2, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0xA8E2, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0xA8E2, 0x0300, 0x0315, 0x0062] }, +{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0xA8E3, 0x0062], NFC: [0x00E0, 0x05AE, 0xA8E3, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0xA8E3, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0xA8E3, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0xA8E3, 0x0315, 0x0062] }, +{ source: [0x0061, 0xA8E3, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0xA8E3, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0xA8E3, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0xA8E3, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0xA8E3, 0x0300, 0x0315, 0x0062] }, +{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0xA8E4, 0x0062], NFC: [0x00E0, 0x05AE, 0xA8E4, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0xA8E4, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0xA8E4, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0xA8E4, 0x0315, 0x0062] }, +{ source: [0x0061, 0xA8E4, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0xA8E4, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0xA8E4, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0xA8E4, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0xA8E4, 0x0300, 0x0315, 0x0062] }, +{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0xA8E5, 0x0062], NFC: [0x00E0, 0x05AE, 0xA8E5, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0xA8E5, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0xA8E5, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0xA8E5, 0x0315, 0x0062] }, +{ source: [0x0061, 0xA8E5, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0xA8E5, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0xA8E5, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0xA8E5, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0xA8E5, 0x0300, 0x0315, 0x0062] }, +{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0xA8E6, 0x0062], NFC: [0x00E0, 0x05AE, 0xA8E6, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0xA8E6, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0xA8E6, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0xA8E6, 0x0315, 0x0062] }, +{ source: [0x0061, 0xA8E6, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0xA8E6, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0xA8E6, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0xA8E6, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0xA8E6, 0x0300, 0x0315, 0x0062] }, +{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0xA8E7, 0x0062], NFC: [0x00E0, 0x05AE, 0xA8E7, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0xA8E7, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0xA8E7, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0xA8E7, 0x0315, 0x0062] }, +{ source: [0x0061, 0xA8E7, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0xA8E7, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0xA8E7, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0xA8E7, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0xA8E7, 0x0300, 0x0315, 0x0062] }, +{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0xA8E8, 0x0062], NFC: [0x00E0, 0x05AE, 0xA8E8, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0xA8E8, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0xA8E8, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0xA8E8, 0x0315, 0x0062] }, +{ source: [0x0061, 0xA8E8, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0xA8E8, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0xA8E8, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0xA8E8, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0xA8E8, 0x0300, 0x0315, 0x0062] }, +{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0xA8E9, 0x0062], NFC: [0x00E0, 0x05AE, 0xA8E9, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0xA8E9, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0xA8E9, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0xA8E9, 0x0315, 0x0062] }, +{ source: [0x0061, 0xA8E9, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0xA8E9, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0xA8E9, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0xA8E9, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0xA8E9, 0x0300, 0x0315, 0x0062] }, +{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0xA8EA, 0x0062], NFC: [0x00E0, 0x05AE, 0xA8EA, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0xA8EA, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0xA8EA, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0xA8EA, 0x0315, 0x0062] }, +{ source: [0x0061, 0xA8EA, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0xA8EA, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0xA8EA, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0xA8EA, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0xA8EA, 0x0300, 0x0315, 0x0062] }, +{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0xA8EB, 0x0062], NFC: [0x00E0, 0x05AE, 0xA8EB, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0xA8EB, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0xA8EB, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0xA8EB, 0x0315, 0x0062] }, +{ source: [0x0061, 0xA8EB, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0xA8EB, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0xA8EB, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0xA8EB, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0xA8EB, 0x0300, 0x0315, 0x0062] }, +{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0xA8EC, 0x0062], NFC: [0x00E0, 0x05AE, 0xA8EC, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0xA8EC, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0xA8EC, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0xA8EC, 0x0315, 0x0062] }, +{ source: [0x0061, 0xA8EC, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0xA8EC, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0xA8EC, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0xA8EC, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0xA8EC, 0x0300, 0x0315, 0x0062] }, +{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0xA8ED, 0x0062], NFC: [0x00E0, 0x05AE, 0xA8ED, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0xA8ED, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0xA8ED, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0xA8ED, 0x0315, 0x0062] }, +{ source: [0x0061, 0xA8ED, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0xA8ED, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0xA8ED, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0xA8ED, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0xA8ED, 0x0300, 0x0315, 0x0062] }, +{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0xA8EE, 0x0062], NFC: [0x00E0, 0x05AE, 0xA8EE, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0xA8EE, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0xA8EE, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0xA8EE, 0x0315, 0x0062] }, +{ source: [0x0061, 0xA8EE, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0xA8EE, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0xA8EE, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0xA8EE, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0xA8EE, 0x0300, 0x0315, 0x0062] }, +{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0xA8EF, 0x0062], NFC: [0x00E0, 0x05AE, 0xA8EF, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0xA8EF, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0xA8EF, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0xA8EF, 0x0315, 0x0062] }, +{ source: [0x0061, 0xA8EF, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0xA8EF, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0xA8EF, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0xA8EF, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0xA8EF, 0x0300, 0x0315, 0x0062] }, +{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0xA8F0, 0x0062], NFC: [0x00E0, 0x05AE, 0xA8F0, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0xA8F0, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0xA8F0, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0xA8F0, 0x0315, 0x0062] }, +{ source: [0x0061, 0xA8F0, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0xA8F0, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0xA8F0, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0xA8F0, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0xA8F0, 0x0300, 0x0315, 0x0062] }, +{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0xA8F1, 0x0062], NFC: [0x00E0, 0x05AE, 0xA8F1, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0xA8F1, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0xA8F1, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0xA8F1, 0x0315, 0x0062] }, +{ source: [0x0061, 0xA8F1, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0xA8F1, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0xA8F1, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0xA8F1, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0xA8F1, 0x0300, 0x0315, 0x0062] }, +{ source: [0x0061, 0x059A, 0x0316, 0x1DFA, 0xA92B, 0x0062], NFC: [0x0061, 0x1DFA, 0x0316, 0xA92B, 0x059A, 0x0062], NFD: [0x0061, 0x1DFA, 0x0316, 0xA92B, 0x059A, 0x0062], NFKC: [0x0061, 0x1DFA, 0x0316, 0xA92B, 0x059A, 0x0062], NFKD: [0x0061, 0x1DFA, 0x0316, 0xA92B, 0x059A, 0x0062] }, +{ source: [0x0061, 0xA92B, 0x059A, 0x0316, 0x1DFA, 0x0062], NFC: [0x0061, 0x1DFA, 0xA92B, 0x0316, 0x059A, 0x0062], NFD: [0x0061, 0x1DFA, 0xA92B, 0x0316, 0x059A, 0x0062], NFKC: [0x0061, 0x1DFA, 0xA92B, 0x0316, 0x059A, 0x0062], NFKD: [0x0061, 0x1DFA, 0xA92B, 0x0316, 0x059A, 0x0062] }, +{ source: [0x0061, 0x059A, 0x0316, 0x1DFA, 0xA92C, 0x0062], NFC: [0x0061, 0x1DFA, 0x0316, 0xA92C, 0x059A, 0x0062], NFD: [0x0061, 0x1DFA, 0x0316, 0xA92C, 0x059A, 0x0062], NFKC: [0x0061, 0x1DFA, 0x0316, 0xA92C, 0x059A, 0x0062], NFKD: [0x0061, 0x1DFA, 0x0316, 0xA92C, 0x059A, 0x0062] }, +{ source: [0x0061, 0xA92C, 0x059A, 0x0316, 0x1DFA, 0x0062], NFC: [0x0061, 0x1DFA, 0xA92C, 0x0316, 0x059A, 0x0062], NFD: [0x0061, 0x1DFA, 0xA92C, 0x0316, 0x059A, 0x0062], NFKC: [0x0061, 0x1DFA, 0xA92C, 0x0316, 0x059A, 0x0062], NFKD: [0x0061, 0x1DFA, 0xA92C, 0x0316, 0x059A, 0x0062] }, +{ source: [0x0061, 0x059A, 0x0316, 0x1DFA, 0xA92D, 0x0062], NFC: [0x0061, 0x1DFA, 0x0316, 0xA92D, 0x059A, 0x0062], NFD: [0x0061, 0x1DFA, 0x0316, 0xA92D, 0x059A, 0x0062], NFKC: [0x0061, 0x1DFA, 0x0316, 0xA92D, 0x059A, 0x0062], NFKD: [0x0061, 0x1DFA, 0x0316, 0xA92D, 0x059A, 0x0062] }, +{ source: [0x0061, 0xA92D, 0x059A, 0x0316, 0x1DFA, 0x0062], NFC: [0x0061, 0x1DFA, 0xA92D, 0x0316, 0x059A, 0x0062], NFD: [0x0061, 0x1DFA, 0xA92D, 0x0316, 0x059A, 0x0062], NFKC: [0x0061, 0x1DFA, 0xA92D, 0x0316, 0x059A, 0x0062], NFKD: [0x0061, 0x1DFA, 0xA92D, 0x0316, 0x059A, 0x0062] }, +{ source: [0x0061, 0x05B0, 0x094D, 0x3099, 0xA953, 0x0062], NFC: [0x0061, 0x3099, 0x094D, 0xA953, 0x05B0, 0x0062], NFD: [0x0061, 0x3099, 0x094D, 0xA953, 0x05B0, 0x0062], NFKC: [0x0061, 0x3099, 0x094D, 0xA953, 0x05B0, 0x0062], NFKD: [0x0061, 0x3099, 0x094D, 0xA953, 0x05B0, 0x0062] }, +{ source: [0x0061, 0xA953, 0x05B0, 0x094D, 0x3099, 0x0062], NFC: [0x0061, 0x3099, 0xA953, 0x094D, 0x05B0, 0x0062], NFD: [0x0061, 0x3099, 0xA953, 0x094D, 0x05B0, 0x0062], NFKC: [0x0061, 0x3099, 0xA953, 0x094D, 0x05B0, 0x0062], NFKD: [0x0061, 0x3099, 0xA953, 0x094D, 0x05B0, 0x0062] }, +{ source: [0x0061, 0x3099, 0x093C, 0x16FF0, 0xA9B3, 0x0062], NFC: [0x0061, 0x16FF0, 0x093C, 0xA9B3, 0x3099, 0x0062], NFD: [0x0061, 0x16FF0, 0x093C, 0xA9B3, 0x3099, 0x0062], NFKC: [0x0061, 0x16FF0, 0x093C, 0xA9B3, 0x3099, 0x0062], NFKD: [0x0061, 0x16FF0, 0x093C, 0xA9B3, 0x3099, 0x0062] }, +{ source: [0x0061, 0xA9B3, 0x3099, 0x093C, 0x16FF0, 0x0062], NFC: [0x0061, 0x16FF0, 0xA9B3, 0x093C, 0x3099, 0x0062], NFD: [0x0061, 0x16FF0, 0xA9B3, 0x093C, 0x3099, 0x0062], NFKC: [0x0061, 0x16FF0, 0xA9B3, 0x093C, 0x3099, 0x0062], NFKD: [0x0061, 0x16FF0, 0xA9B3, 0x093C, 0x3099, 0x0062] }, +{ source: [0x0061, 0x05B0, 0x094D, 0x3099, 0xA9C0, 0x0062], NFC: [0x0061, 0x3099, 0x094D, 0xA9C0, 0x05B0, 0x0062], NFD: [0x0061, 0x3099, 0x094D, 0xA9C0, 0x05B0, 0x0062], NFKC: [0x0061, 0x3099, 0x094D, 0xA9C0, 0x05B0, 0x0062], NFKD: [0x0061, 0x3099, 0x094D, 0xA9C0, 0x05B0, 0x0062] }, +{ source: [0x0061, 0xA9C0, 0x05B0, 0x094D, 0x3099, 0x0062], NFC: [0x0061, 0x3099, 0xA9C0, 0x094D, 0x05B0, 0x0062], NFD: [0x0061, 0x3099, 0xA9C0, 0x094D, 0x05B0, 0x0062], NFKC: [0x0061, 0x3099, 0xA9C0, 0x094D, 0x05B0, 0x0062], NFKD: [0x0061, 0x3099, 0xA9C0, 0x094D, 0x05B0, 0x0062] }, +{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0xAAB0, 0x0062], NFC: [0x00E0, 0x05AE, 0xAAB0, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0xAAB0, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0xAAB0, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0xAAB0, 0x0315, 0x0062] }, +{ source: [0x0061, 0xAAB0, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0xAAB0, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0xAAB0, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0xAAB0, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0xAAB0, 0x0300, 0x0315, 0x0062] }, +{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0xAAB2, 0x0062], NFC: [0x00E0, 0x05AE, 0xAAB2, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0xAAB2, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0xAAB2, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0xAAB2, 0x0315, 0x0062] }, +{ source: [0x0061, 0xAAB2, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0xAAB2, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0xAAB2, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0xAAB2, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0xAAB2, 0x0300, 0x0315, 0x0062] }, +{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0xAAB3, 0x0062], NFC: [0x00E0, 0x05AE, 0xAAB3, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0xAAB3, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0xAAB3, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0xAAB3, 0x0315, 0x0062] }, +{ source: [0x0061, 0xAAB3, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0xAAB3, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0xAAB3, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0xAAB3, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0xAAB3, 0x0300, 0x0315, 0x0062] }, +{ source: [0x0061, 0x059A, 0x0316, 0x1DFA, 0xAAB4, 0x0062], NFC: [0x0061, 0x1DFA, 0x0316, 0xAAB4, 0x059A, 0x0062], NFD: [0x0061, 0x1DFA, 0x0316, 0xAAB4, 0x059A, 0x0062], NFKC: [0x0061, 0x1DFA, 0x0316, 0xAAB4, 0x059A, 0x0062], NFKD: [0x0061, 0x1DFA, 0x0316, 0xAAB4, 0x059A, 0x0062] }, +{ source: [0x0061, 0xAAB4, 0x059A, 0x0316, 0x1DFA, 0x0062], NFC: [0x0061, 0x1DFA, 0xAAB4, 0x0316, 0x059A, 0x0062], NFD: [0x0061, 0x1DFA, 0xAAB4, 0x0316, 0x059A, 0x0062], NFKC: [0x0061, 0x1DFA, 0xAAB4, 0x0316, 0x059A, 0x0062], NFKD: [0x0061, 0x1DFA, 0xAAB4, 0x0316, 0x059A, 0x0062] }, +{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0xAAB7, 0x0062], NFC: [0x00E0, 0x05AE, 0xAAB7, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0xAAB7, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0xAAB7, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0xAAB7, 0x0315, 0x0062] }, +{ source: [0x0061, 0xAAB7, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0xAAB7, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0xAAB7, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0xAAB7, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0xAAB7, 0x0300, 0x0315, 0x0062] }, +{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0xAAB8, 0x0062], NFC: [0x00E0, 0x05AE, 0xAAB8, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0xAAB8, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0xAAB8, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0xAAB8, 0x0315, 0x0062] }, +{ source: [0x0061, 0xAAB8, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0xAAB8, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0xAAB8, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0xAAB8, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0xAAB8, 0x0300, 0x0315, 0x0062] }, +{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0xAABE, 0x0062], NFC: [0x00E0, 0x05AE, 0xAABE, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0xAABE, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0xAABE, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0xAABE, 0x0315, 0x0062] }, +{ source: [0x0061, 0xAABE, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0xAABE, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0xAABE, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0xAABE, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0xAABE, 0x0300, 0x0315, 0x0062] }, +{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0xAABF, 0x0062], NFC: [0x00E0, 0x05AE, 0xAABF, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0xAABF, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0xAABF, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0xAABF, 0x0315, 0x0062] }, +{ source: [0x0061, 0xAABF, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0xAABF, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0xAABF, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0xAABF, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0xAABF, 0x0300, 0x0315, 0x0062] }, +{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0xAAC1, 0x0062], NFC: [0x00E0, 0x05AE, 0xAAC1, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0xAAC1, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0xAAC1, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0xAAC1, 0x0315, 0x0062] }, +{ source: [0x0061, 0xAAC1, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0xAAC1, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0xAAC1, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0xAAC1, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0xAAC1, 0x0300, 0x0315, 0x0062] }, +{ source: [0x0061, 0x05B0, 0x094D, 0x3099, 0xAAF6, 0x0062], NFC: [0x0061, 0x3099, 0x094D, 0xAAF6, 0x05B0, 0x0062], NFD: [0x0061, 0x3099, 0x094D, 0xAAF6, 0x05B0, 0x0062], NFKC: [0x0061, 0x3099, 0x094D, 0xAAF6, 0x05B0, 0x0062], NFKD: [0x0061, 0x3099, 0x094D, 0xAAF6, 0x05B0, 0x0062] }, +{ source: [0x0061, 0xAAF6, 0x05B0, 0x094D, 0x3099, 0x0062], NFC: [0x0061, 0x3099, 0xAAF6, 0x094D, 0x05B0, 0x0062], NFD: [0x0061, 0x3099, 0xAAF6, 0x094D, 0x05B0, 0x0062], NFKC: [0x0061, 0x3099, 0xAAF6, 0x094D, 0x05B0, 0x0062], NFKD: [0x0061, 0x3099, 0xAAF6, 0x094D, 0x05B0, 0x0062] }, +{ source: [0x0061, 0x05B0, 0x094D, 0x3099, 0xABED, 0x0062], NFC: [0x0061, 0x3099, 0x094D, 0xABED, 0x05B0, 0x0062], NFD: [0x0061, 0x3099, 0x094D, 0xABED, 0x05B0, 0x0062], NFKC: [0x0061, 0x3099, 0x094D, 0xABED, 0x05B0, 0x0062], NFKD: [0x0061, 0x3099, 0x094D, 0xABED, 0x05B0, 0x0062] }, +{ source: [0x0061, 0xABED, 0x05B0, 0x094D, 0x3099, 0x0062], NFC: [0x0061, 0x3099, 0xABED, 0x094D, 0x05B0, 0x0062], NFD: [0x0061, 0x3099, 0xABED, 0x094D, 0x05B0, 0x0062], NFKC: [0x0061, 0x3099, 0xABED, 0x094D, 0x05B0, 0x0062], NFKD: [0x0061, 0x3099, 0xABED, 0x094D, 0x05B0, 0x0062] }, +{ source: [0x0061, 0x064B, 0xFB1E, 0x05C2, 0xFB1E, 0x0062], NFC: [0x0061, 0x05C2, 0xFB1E, 0xFB1E, 0x064B, 0x0062], NFD: [0x0061, 0x05C2, 0xFB1E, 0xFB1E, 0x064B, 0x0062], NFKC: [0x0061, 0x05C2, 0xFB1E, 0xFB1E, 0x064B, 0x0062], NFKD: [0x0061, 0x05C2, 0xFB1E, 0xFB1E, 0x064B, 0x0062] }, +{ source: [0x0061, 0xFB1E, 0x064B, 0xFB1E, 0x05C2, 0x0062], NFC: [0x0061, 0x05C2, 0xFB1E, 0xFB1E, 0x064B, 0x0062], NFD: [0x0061, 0x05C2, 0xFB1E, 0xFB1E, 0x064B, 0x0062], NFKC: [0x0061, 0x05C2, 0xFB1E, 0xFB1E, 0x064B, 0x0062], NFKD: [0x0061, 0x05C2, 0xFB1E, 0xFB1E, 0x064B, 0x0062] }, +{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0xFE20, 0x0062], NFC: [0x00E0, 0x05AE, 0xFE20, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0xFE20, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0xFE20, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0xFE20, 0x0315, 0x0062] }, +{ source: [0x0061, 0xFE20, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0xFE20, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0xFE20, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0xFE20, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0xFE20, 0x0300, 0x0315, 0x0062] }, +{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0xFE21, 0x0062], NFC: [0x00E0, 0x05AE, 0xFE21, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0xFE21, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0xFE21, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0xFE21, 0x0315, 0x0062] }, +{ source: [0x0061, 0xFE21, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0xFE21, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0xFE21, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0xFE21, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0xFE21, 0x0300, 0x0315, 0x0062] }, +{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0xFE22, 0x0062], NFC: [0x00E0, 0x05AE, 0xFE22, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0xFE22, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0xFE22, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0xFE22, 0x0315, 0x0062] }, +{ source: [0x0061, 0xFE22, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0xFE22, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0xFE22, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0xFE22, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0xFE22, 0x0300, 0x0315, 0x0062] }, +{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0xFE23, 0x0062], NFC: [0x00E0, 0x05AE, 0xFE23, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0xFE23, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0xFE23, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0xFE23, 0x0315, 0x0062] }, +{ source: [0x0061, 0xFE23, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0xFE23, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0xFE23, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0xFE23, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0xFE23, 0x0300, 0x0315, 0x0062] }, +{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0xFE24, 0x0062], NFC: [0x00E0, 0x05AE, 0xFE24, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0xFE24, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0xFE24, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0xFE24, 0x0315, 0x0062] }, +{ source: [0x0061, 0xFE24, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0xFE24, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0xFE24, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0xFE24, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0xFE24, 0x0300, 0x0315, 0x0062] }, +{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0xFE25, 0x0062], NFC: [0x00E0, 0x05AE, 0xFE25, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0xFE25, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0xFE25, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0xFE25, 0x0315, 0x0062] }, +{ source: [0x0061, 0xFE25, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0xFE25, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0xFE25, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0xFE25, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0xFE25, 0x0300, 0x0315, 0x0062] }, +{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0xFE26, 0x0062], NFC: [0x00E0, 0x05AE, 0xFE26, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0xFE26, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0xFE26, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0xFE26, 0x0315, 0x0062] }, +{ source: [0x0061, 0xFE26, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0xFE26, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0xFE26, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0xFE26, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0xFE26, 0x0300, 0x0315, 0x0062] }, +{ source: [0x0061, 0x059A, 0x0316, 0x1DFA, 0xFE27, 0x0062], NFC: [0x0061, 0x1DFA, 0x0316, 0xFE27, 0x059A, 0x0062], NFD: [0x0061, 0x1DFA, 0x0316, 0xFE27, 0x059A, 0x0062], NFKC: [0x0061, 0x1DFA, 0x0316, 0xFE27, 0x059A, 0x0062], NFKD: [0x0061, 0x1DFA, 0x0316, 0xFE27, 0x059A, 0x0062] }, +{ source: [0x0061, 0xFE27, 0x059A, 0x0316, 0x1DFA, 0x0062], NFC: [0x0061, 0x1DFA, 0xFE27, 0x0316, 0x059A, 0x0062], NFD: [0x0061, 0x1DFA, 0xFE27, 0x0316, 0x059A, 0x0062], NFKC: [0x0061, 0x1DFA, 0xFE27, 0x0316, 0x059A, 0x0062], NFKD: [0x0061, 0x1DFA, 0xFE27, 0x0316, 0x059A, 0x0062] }, +{ source: [0x0061, 0x059A, 0x0316, 0x1DFA, 0xFE28, 0x0062], NFC: [0x0061, 0x1DFA, 0x0316, 0xFE28, 0x059A, 0x0062], NFD: [0x0061, 0x1DFA, 0x0316, 0xFE28, 0x059A, 0x0062], NFKC: [0x0061, 0x1DFA, 0x0316, 0xFE28, 0x059A, 0x0062], NFKD: [0x0061, 0x1DFA, 0x0316, 0xFE28, 0x059A, 0x0062] }, +{ source: [0x0061, 0xFE28, 0x059A, 0x0316, 0x1DFA, 0x0062], NFC: [0x0061, 0x1DFA, 0xFE28, 0x0316, 0x059A, 0x0062], NFD: [0x0061, 0x1DFA, 0xFE28, 0x0316, 0x059A, 0x0062], NFKC: [0x0061, 0x1DFA, 0xFE28, 0x0316, 0x059A, 0x0062], NFKD: [0x0061, 0x1DFA, 0xFE28, 0x0316, 0x059A, 0x0062] }, +{ source: [0x0061, 0x059A, 0x0316, 0x1DFA, 0xFE29, 0x0062], NFC: [0x0061, 0x1DFA, 0x0316, 0xFE29, 0x059A, 0x0062], NFD: [0x0061, 0x1DFA, 0x0316, 0xFE29, 0x059A, 0x0062], NFKC: [0x0061, 0x1DFA, 0x0316, 0xFE29, 0x059A, 0x0062], NFKD: [0x0061, 0x1DFA, 0x0316, 0xFE29, 0x059A, 0x0062] }, +{ source: [0x0061, 0xFE29, 0x059A, 0x0316, 0x1DFA, 0x0062], NFC: [0x0061, 0x1DFA, 0xFE29, 0x0316, 0x059A, 0x0062], NFD: [0x0061, 0x1DFA, 0xFE29, 0x0316, 0x059A, 0x0062], NFKC: [0x0061, 0x1DFA, 0xFE29, 0x0316, 0x059A, 0x0062], NFKD: [0x0061, 0x1DFA, 0xFE29, 0x0316, 0x059A, 0x0062] }, +{ source: [0x0061, 0x059A, 0x0316, 0x1DFA, 0xFE2A, 0x0062], NFC: [0x0061, 0x1DFA, 0x0316, 0xFE2A, 0x059A, 0x0062], NFD: [0x0061, 0x1DFA, 0x0316, 0xFE2A, 0x059A, 0x0062], NFKC: [0x0061, 0x1DFA, 0x0316, 0xFE2A, 0x059A, 0x0062], NFKD: [0x0061, 0x1DFA, 0x0316, 0xFE2A, 0x059A, 0x0062] }, +{ source: [0x0061, 0xFE2A, 0x059A, 0x0316, 0x1DFA, 0x0062], NFC: [0x0061, 0x1DFA, 0xFE2A, 0x0316, 0x059A, 0x0062], NFD: [0x0061, 0x1DFA, 0xFE2A, 0x0316, 0x059A, 0x0062], NFKC: [0x0061, 0x1DFA, 0xFE2A, 0x0316, 0x059A, 0x0062], NFKD: [0x0061, 0x1DFA, 0xFE2A, 0x0316, 0x059A, 0x0062] }, +{ source: [0x0061, 0x059A, 0x0316, 0x1DFA, 0xFE2B, 0x0062], NFC: [0x0061, 0x1DFA, 0x0316, 0xFE2B, 0x059A, 0x0062], NFD: [0x0061, 0x1DFA, 0x0316, 0xFE2B, 0x059A, 0x0062], NFKC: [0x0061, 0x1DFA, 0x0316, 0xFE2B, 0x059A, 0x0062], NFKD: [0x0061, 0x1DFA, 0x0316, 0xFE2B, 0x059A, 0x0062] }, +{ source: [0x0061, 0xFE2B, 0x059A, 0x0316, 0x1DFA, 0x0062], NFC: [0x0061, 0x1DFA, 0xFE2B, 0x0316, 0x059A, 0x0062], NFD: [0x0061, 0x1DFA, 0xFE2B, 0x0316, 0x059A, 0x0062], NFKC: [0x0061, 0x1DFA, 0xFE2B, 0x0316, 0x059A, 0x0062], NFKD: [0x0061, 0x1DFA, 0xFE2B, 0x0316, 0x059A, 0x0062] }, +{ source: [0x0061, 0x059A, 0x0316, 0x1DFA, 0xFE2C, 0x0062], NFC: [0x0061, 0x1DFA, 0x0316, 0xFE2C, 0x059A, 0x0062], NFD: [0x0061, 0x1DFA, 0x0316, 0xFE2C, 0x059A, 0x0062], NFKC: [0x0061, 0x1DFA, 0x0316, 0xFE2C, 0x059A, 0x0062], NFKD: [0x0061, 0x1DFA, 0x0316, 0xFE2C, 0x059A, 0x0062] }, +{ source: [0x0061, 0xFE2C, 0x059A, 0x0316, 0x1DFA, 0x0062], NFC: [0x0061, 0x1DFA, 0xFE2C, 0x0316, 0x059A, 0x0062], NFD: [0x0061, 0x1DFA, 0xFE2C, 0x0316, 0x059A, 0x0062], NFKC: [0x0061, 0x1DFA, 0xFE2C, 0x0316, 0x059A, 0x0062], NFKD: [0x0061, 0x1DFA, 0xFE2C, 0x0316, 0x059A, 0x0062] }, +{ source: [0x0061, 0x059A, 0x0316, 0x1DFA, 0xFE2D, 0x0062], NFC: [0x0061, 0x1DFA, 0x0316, 0xFE2D, 0x059A, 0x0062], NFD: [0x0061, 0x1DFA, 0x0316, 0xFE2D, 0x059A, 0x0062], NFKC: [0x0061, 0x1DFA, 0x0316, 0xFE2D, 0x059A, 0x0062], NFKD: [0x0061, 0x1DFA, 0x0316, 0xFE2D, 0x059A, 0x0062] }, +{ source: [0x0061, 0xFE2D, 0x059A, 0x0316, 0x1DFA, 0x0062], NFC: [0x0061, 0x1DFA, 0xFE2D, 0x0316, 0x059A, 0x0062], NFD: [0x0061, 0x1DFA, 0xFE2D, 0x0316, 0x059A, 0x0062], NFKC: [0x0061, 0x1DFA, 0xFE2D, 0x0316, 0x059A, 0x0062], NFKD: [0x0061, 0x1DFA, 0xFE2D, 0x0316, 0x059A, 0x0062] }, +{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0xFE2E, 0x0062], NFC: [0x00E0, 0x05AE, 0xFE2E, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0xFE2E, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0xFE2E, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0xFE2E, 0x0315, 0x0062] }, +{ source: [0x0061, 0xFE2E, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0xFE2E, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0xFE2E, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0xFE2E, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0xFE2E, 0x0300, 0x0315, 0x0062] }, +{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0xFE2F, 0x0062], NFC: [0x00E0, 0x05AE, 0xFE2F, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0xFE2F, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0xFE2F, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0xFE2F, 0x0315, 0x0062] }, +{ source: [0x0061, 0xFE2F, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0xFE2F, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0xFE2F, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0xFE2F, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0xFE2F, 0x0300, 0x0315, 0x0062] }, +{ source: [0x0061, 0x059A, 0x0316, 0x1DFA, 0x101FD, 0x0062], NFC: [0x0061, 0x1DFA, 0x0316, 0x101FD, 0x059A, 0x0062], NFD: [0x0061, 0x1DFA, 0x0316, 0x101FD, 0x059A, 0x0062], NFKC: [0x0061, 0x1DFA, 0x0316, 0x101FD, 0x059A, 0x0062], NFKD: [0x0061, 0x1DFA, 0x0316, 0x101FD, 0x059A, 0x0062] }, +{ source: [0x0061, 0x101FD, 0x059A, 0x0316, 0x1DFA, 0x0062], NFC: [0x0061, 0x1DFA, 0x101FD, 0x0316, 0x059A, 0x0062], NFD: [0x0061, 0x1DFA, 0x101FD, 0x0316, 0x059A, 0x0062], NFKC: [0x0061, 0x1DFA, 0x101FD, 0x0316, 0x059A, 0x0062], NFKD: [0x0061, 0x1DFA, 0x101FD, 0x0316, 0x059A, 0x0062] }, +{ source: [0x0061, 0x059A, 0x0316, 0x1DFA, 0x102E0, 0x0062], NFC: [0x0061, 0x1DFA, 0x0316, 0x102E0, 0x059A, 0x0062], NFD: [0x0061, 0x1DFA, 0x0316, 0x102E0, 0x059A, 0x0062], NFKC: [0x0061, 0x1DFA, 0x0316, 0x102E0, 0x059A, 0x0062], NFKD: [0x0061, 0x1DFA, 0x0316, 0x102E0, 0x059A, 0x0062] }, +{ source: [0x0061, 0x102E0, 0x059A, 0x0316, 0x1DFA, 0x0062], NFC: [0x0061, 0x1DFA, 0x102E0, 0x0316, 0x059A, 0x0062], NFD: [0x0061, 0x1DFA, 0x102E0, 0x0316, 0x059A, 0x0062], NFKC: [0x0061, 0x1DFA, 0x102E0, 0x0316, 0x059A, 0x0062], NFKD: [0x0061, 0x1DFA, 0x102E0, 0x0316, 0x059A, 0x0062] }, +{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x10376, 0x0062], NFC: [0x00E0, 0x05AE, 0x10376, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x10376, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x10376, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x10376, 0x0315, 0x0062] }, +{ source: [0x0061, 0x10376, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x10376, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x10376, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x10376, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x10376, 0x0300, 0x0315, 0x0062] }, +{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x10377, 0x0062], NFC: [0x00E0, 0x05AE, 0x10377, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x10377, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x10377, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x10377, 0x0315, 0x0062] }, +{ source: [0x0061, 0x10377, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x10377, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x10377, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x10377, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x10377, 0x0300, 0x0315, 0x0062] }, +{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x10378, 0x0062], NFC: [0x00E0, 0x05AE, 0x10378, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x10378, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x10378, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x10378, 0x0315, 0x0062] }, +{ source: [0x0061, 0x10378, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x10378, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x10378, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x10378, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x10378, 0x0300, 0x0315, 0x0062] }, +{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x10379, 0x0062], NFC: [0x00E0, 0x05AE, 0x10379, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x10379, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x10379, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x10379, 0x0315, 0x0062] }, +{ source: [0x0061, 0x10379, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x10379, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x10379, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x10379, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x10379, 0x0300, 0x0315, 0x0062] }, +{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x1037A, 0x0062], NFC: [0x00E0, 0x05AE, 0x1037A, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x1037A, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x1037A, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x1037A, 0x0315, 0x0062] }, +{ source: [0x0061, 0x1037A, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x1037A, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x1037A, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x1037A, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x1037A, 0x0300, 0x0315, 0x0062] }, +{ source: [0x0061, 0x059A, 0x0316, 0x1DFA, 0x10A0D, 0x0062], NFC: [0x0061, 0x1DFA, 0x0316, 0x10A0D, 0x059A, 0x0062], NFD: [0x0061, 0x1DFA, 0x0316, 0x10A0D, 0x059A, 0x0062], NFKC: [0x0061, 0x1DFA, 0x0316, 0x10A0D, 0x059A, 0x0062], NFKD: [0x0061, 0x1DFA, 0x0316, 0x10A0D, 0x059A, 0x0062] }, +{ source: [0x0061, 0x10A0D, 0x059A, 0x0316, 0x1DFA, 0x0062], NFC: [0x0061, 0x1DFA, 0x10A0D, 0x0316, 0x059A, 0x0062], NFD: [0x0061, 0x1DFA, 0x10A0D, 0x0316, 0x059A, 0x0062], NFKC: [0x0061, 0x1DFA, 0x10A0D, 0x0316, 0x059A, 0x0062], NFKD: [0x0061, 0x1DFA, 0x10A0D, 0x0316, 0x059A, 0x0062] }, +{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x10A0F, 0x0062], NFC: [0x00E0, 0x05AE, 0x10A0F, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x10A0F, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x10A0F, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x10A0F, 0x0315, 0x0062] }, +{ source: [0x0061, 0x10A0F, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x10A0F, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x10A0F, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x10A0F, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x10A0F, 0x0300, 0x0315, 0x0062] }, +{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x10A38, 0x0062], NFC: [0x00E0, 0x05AE, 0x10A38, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x10A38, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x10A38, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x10A38, 0x0315, 0x0062] }, +{ source: [0x0061, 0x10A38, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x10A38, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x10A38, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x10A38, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x10A38, 0x0300, 0x0315, 0x0062] }, +{ source: [0x0061, 0x16FF0, 0x0334, 0x10A39, 0x0062], NFC: [0x0061, 0x0334, 0x10A39, 0x16FF0, 0x0062], NFD: [0x0061, 0x0334, 0x10A39, 0x16FF0, 0x0062], NFKC: [0x0061, 0x0334, 0x10A39, 0x16FF0, 0x0062], NFKD: [0x0061, 0x0334, 0x10A39, 0x16FF0, 0x0062] }, +{ source: [0x0061, 0x10A39, 0x16FF0, 0x0334, 0x0062], NFC: [0x0061, 0x10A39, 0x0334, 0x16FF0, 0x0062], NFD: [0x0061, 0x10A39, 0x0334, 0x16FF0, 0x0062], NFKC: [0x0061, 0x10A39, 0x0334, 0x16FF0, 0x0062], NFKD: [0x0061, 0x10A39, 0x0334, 0x16FF0, 0x0062] }, +{ source: [0x0061, 0x059A, 0x0316, 0x1DFA, 0x10A3A, 0x0062], NFC: [0x0061, 0x1DFA, 0x0316, 0x10A3A, 0x059A, 0x0062], NFD: [0x0061, 0x1DFA, 0x0316, 0x10A3A, 0x059A, 0x0062], NFKC: [0x0061, 0x1DFA, 0x0316, 0x10A3A, 0x059A, 0x0062], NFKD: [0x0061, 0x1DFA, 0x0316, 0x10A3A, 0x059A, 0x0062] }, +{ source: [0x0061, 0x10A3A, 0x059A, 0x0316, 0x1DFA, 0x0062], NFC: [0x0061, 0x1DFA, 0x10A3A, 0x0316, 0x059A, 0x0062], NFD: [0x0061, 0x1DFA, 0x10A3A, 0x0316, 0x059A, 0x0062], NFKC: [0x0061, 0x1DFA, 0x10A3A, 0x0316, 0x059A, 0x0062], NFKD: [0x0061, 0x1DFA, 0x10A3A, 0x0316, 0x059A, 0x0062] }, +{ source: [0x0061, 0x05B0, 0x094D, 0x3099, 0x10A3F, 0x0062], NFC: [0x0061, 0x3099, 0x094D, 0x10A3F, 0x05B0, 0x0062], NFD: [0x0061, 0x3099, 0x094D, 0x10A3F, 0x05B0, 0x0062], NFKC: [0x0061, 0x3099, 0x094D, 0x10A3F, 0x05B0, 0x0062], NFKD: [0x0061, 0x3099, 0x094D, 0x10A3F, 0x05B0, 0x0062] }, +{ source: [0x0061, 0x10A3F, 0x05B0, 0x094D, 0x3099, 0x0062], NFC: [0x0061, 0x3099, 0x10A3F, 0x094D, 0x05B0, 0x0062], NFD: [0x0061, 0x3099, 0x10A3F, 0x094D, 0x05B0, 0x0062], NFKC: [0x0061, 0x3099, 0x10A3F, 0x094D, 0x05B0, 0x0062], NFKD: [0x0061, 0x3099, 0x10A3F, 0x094D, 0x05B0, 0x0062] }, +{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x10AE5, 0x0062], NFC: [0x00E0, 0x05AE, 0x10AE5, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x10AE5, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x10AE5, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x10AE5, 0x0315, 0x0062] }, +{ source: [0x0061, 0x10AE5, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x10AE5, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x10AE5, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x10AE5, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x10AE5, 0x0300, 0x0315, 0x0062] }, +{ source: [0x0061, 0x059A, 0x0316, 0x1DFA, 0x10AE6, 0x0062], NFC: [0x0061, 0x1DFA, 0x0316, 0x10AE6, 0x059A, 0x0062], NFD: [0x0061, 0x1DFA, 0x0316, 0x10AE6, 0x059A, 0x0062], NFKC: [0x0061, 0x1DFA, 0x0316, 0x10AE6, 0x059A, 0x0062], NFKD: [0x0061, 0x1DFA, 0x0316, 0x10AE6, 0x059A, 0x0062] }, +{ source: [0x0061, 0x10AE6, 0x059A, 0x0316, 0x1DFA, 0x0062], NFC: [0x0061, 0x1DFA, 0x10AE6, 0x0316, 0x059A, 0x0062], NFD: [0x0061, 0x1DFA, 0x10AE6, 0x0316, 0x059A, 0x0062], NFKC: [0x0061, 0x1DFA, 0x10AE6, 0x0316, 0x059A, 0x0062], NFKD: [0x0061, 0x1DFA, 0x10AE6, 0x0316, 0x059A, 0x0062] }, +{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x10D24, 0x0062], NFC: [0x00E0, 0x05AE, 0x10D24, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x10D24, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x10D24, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x10D24, 0x0315, 0x0062] }, +{ source: [0x0061, 0x10D24, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x10D24, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x10D24, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x10D24, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x10D24, 0x0300, 0x0315, 0x0062] }, +{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x10D25, 0x0062], NFC: [0x00E0, 0x05AE, 0x10D25, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x10D25, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x10D25, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x10D25, 0x0315, 0x0062] }, +{ source: [0x0061, 0x10D25, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x10D25, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x10D25, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x10D25, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x10D25, 0x0300, 0x0315, 0x0062] }, +{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x10D26, 0x0062], NFC: [0x00E0, 0x05AE, 0x10D26, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x10D26, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x10D26, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x10D26, 0x0315, 0x0062] }, +{ source: [0x0061, 0x10D26, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x10D26, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x10D26, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x10D26, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x10D26, 0x0300, 0x0315, 0x0062] }, +{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x10D27, 0x0062], NFC: [0x00E0, 0x05AE, 0x10D27, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x10D27, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x10D27, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x10D27, 0x0315, 0x0062] }, +{ source: [0x0061, 0x10D27, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x10D27, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x10D27, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x10D27, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x10D27, 0x0300, 0x0315, 0x0062] }, +{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x10EAB, 0x0062], NFC: [0x00E0, 0x05AE, 0x10EAB, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x10EAB, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x10EAB, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x10EAB, 0x0315, 0x0062] }, +{ source: [0x0061, 0x10EAB, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x10EAB, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x10EAB, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x10EAB, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x10EAB, 0x0300, 0x0315, 0x0062] }, +{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x10EAC, 0x0062], NFC: [0x00E0, 0x05AE, 0x10EAC, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x10EAC, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x10EAC, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x10EAC, 0x0315, 0x0062] }, +{ source: [0x0061, 0x10EAC, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x10EAC, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x10EAC, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x10EAC, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x10EAC, 0x0300, 0x0315, 0x0062] }, +{ source: [0x0061, 0x059A, 0x0316, 0x1DFA, 0x10EFD, 0x0062], NFC: [0x0061, 0x1DFA, 0x0316, 0x10EFD, 0x059A, 0x0062], NFD: [0x0061, 0x1DFA, 0x0316, 0x10EFD, 0x059A, 0x0062], NFKC: [0x0061, 0x1DFA, 0x0316, 0x10EFD, 0x059A, 0x0062], NFKD: [0x0061, 0x1DFA, 0x0316, 0x10EFD, 0x059A, 0x0062] }, +{ source: [0x0061, 0x10EFD, 0x059A, 0x0316, 0x1DFA, 0x0062], NFC: [0x0061, 0x1DFA, 0x10EFD, 0x0316, 0x059A, 0x0062], NFD: [0x0061, 0x1DFA, 0x10EFD, 0x0316, 0x059A, 0x0062], NFKC: [0x0061, 0x1DFA, 0x10EFD, 0x0316, 0x059A, 0x0062], NFKD: [0x0061, 0x1DFA, 0x10EFD, 0x0316, 0x059A, 0x0062] }, +{ source: [0x0061, 0x059A, 0x0316, 0x1DFA, 0x10EFE, 0x0062], NFC: [0x0061, 0x1DFA, 0x0316, 0x10EFE, 0x059A, 0x0062], NFD: [0x0061, 0x1DFA, 0x0316, 0x10EFE, 0x059A, 0x0062], NFKC: [0x0061, 0x1DFA, 0x0316, 0x10EFE, 0x059A, 0x0062], NFKD: [0x0061, 0x1DFA, 0x0316, 0x10EFE, 0x059A, 0x0062] }, +{ source: [0x0061, 0x10EFE, 0x059A, 0x0316, 0x1DFA, 0x0062], NFC: [0x0061, 0x1DFA, 0x10EFE, 0x0316, 0x059A, 0x0062], NFD: [0x0061, 0x1DFA, 0x10EFE, 0x0316, 0x059A, 0x0062], NFKC: [0x0061, 0x1DFA, 0x10EFE, 0x0316, 0x059A, 0x0062], NFKD: [0x0061, 0x1DFA, 0x10EFE, 0x0316, 0x059A, 0x0062] }, +{ source: [0x0061, 0x059A, 0x0316, 0x1DFA, 0x10EFF, 0x0062], NFC: [0x0061, 0x1DFA, 0x0316, 0x10EFF, 0x059A, 0x0062], NFD: [0x0061, 0x1DFA, 0x0316, 0x10EFF, 0x059A, 0x0062], NFKC: [0x0061, 0x1DFA, 0x0316, 0x10EFF, 0x059A, 0x0062], NFKD: [0x0061, 0x1DFA, 0x0316, 0x10EFF, 0x059A, 0x0062] }, +{ source: [0x0061, 0x10EFF, 0x059A, 0x0316, 0x1DFA, 0x0062], NFC: [0x0061, 0x1DFA, 0x10EFF, 0x0316, 0x059A, 0x0062], NFD: [0x0061, 0x1DFA, 0x10EFF, 0x0316, 0x059A, 0x0062], NFKC: [0x0061, 0x1DFA, 0x10EFF, 0x0316, 0x059A, 0x0062], NFKD: [0x0061, 0x1DFA, 0x10EFF, 0x0316, 0x059A, 0x0062] }, +{ source: [0x0061, 0x059A, 0x0316, 0x1DFA, 0x10F46, 0x0062], NFC: [0x0061, 0x1DFA, 0x0316, 0x10F46, 0x059A, 0x0062], NFD: [0x0061, 0x1DFA, 0x0316, 0x10F46, 0x059A, 0x0062], NFKC: [0x0061, 0x1DFA, 0x0316, 0x10F46, 0x059A, 0x0062], NFKD: [0x0061, 0x1DFA, 0x0316, 0x10F46, 0x059A, 0x0062] }, +{ source: [0x0061, 0x10F46, 0x059A, 0x0316, 0x1DFA, 0x0062], NFC: [0x0061, 0x1DFA, 0x10F46, 0x0316, 0x059A, 0x0062], NFD: [0x0061, 0x1DFA, 0x10F46, 0x0316, 0x059A, 0x0062], NFKC: [0x0061, 0x1DFA, 0x10F46, 0x0316, 0x059A, 0x0062], NFKD: [0x0061, 0x1DFA, 0x10F46, 0x0316, 0x059A, 0x0062] }, +{ source: [0x0061, 0x059A, 0x0316, 0x1DFA, 0x10F47, 0x0062], NFC: [0x0061, 0x1DFA, 0x0316, 0x10F47, 0x059A, 0x0062], NFD: [0x0061, 0x1DFA, 0x0316, 0x10F47, 0x059A, 0x0062], NFKC: [0x0061, 0x1DFA, 0x0316, 0x10F47, 0x059A, 0x0062], NFKD: [0x0061, 0x1DFA, 0x0316, 0x10F47, 0x059A, 0x0062] }, +{ source: [0x0061, 0x10F47, 0x059A, 0x0316, 0x1DFA, 0x0062], NFC: [0x0061, 0x1DFA, 0x10F47, 0x0316, 0x059A, 0x0062], NFD: [0x0061, 0x1DFA, 0x10F47, 0x0316, 0x059A, 0x0062], NFKC: [0x0061, 0x1DFA, 0x10F47, 0x0316, 0x059A, 0x0062], NFKD: [0x0061, 0x1DFA, 0x10F47, 0x0316, 0x059A, 0x0062] }, +{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x10F48, 0x0062], NFC: [0x00E0, 0x05AE, 0x10F48, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x10F48, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x10F48, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x10F48, 0x0315, 0x0062] }, +{ source: [0x0061, 0x10F48, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x10F48, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x10F48, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x10F48, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x10F48, 0x0300, 0x0315, 0x0062] }, +{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x10F49, 0x0062], NFC: [0x00E0, 0x05AE, 0x10F49, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x10F49, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x10F49, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x10F49, 0x0315, 0x0062] }, +{ source: [0x0061, 0x10F49, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x10F49, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x10F49, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x10F49, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x10F49, 0x0300, 0x0315, 0x0062] }, +{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x10F4A, 0x0062], NFC: [0x00E0, 0x05AE, 0x10F4A, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x10F4A, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x10F4A, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x10F4A, 0x0315, 0x0062] }, +{ source: [0x0061, 0x10F4A, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x10F4A, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x10F4A, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x10F4A, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x10F4A, 0x0300, 0x0315, 0x0062] }, +{ source: [0x0061, 0x059A, 0x0316, 0x1DFA, 0x10F4B, 0x0062], NFC: [0x0061, 0x1DFA, 0x0316, 0x10F4B, 0x059A, 0x0062], NFD: [0x0061, 0x1DFA, 0x0316, 0x10F4B, 0x059A, 0x0062], NFKC: [0x0061, 0x1DFA, 0x0316, 0x10F4B, 0x059A, 0x0062], NFKD: [0x0061, 0x1DFA, 0x0316, 0x10F4B, 0x059A, 0x0062] }, +{ source: [0x0061, 0x10F4B, 0x059A, 0x0316, 0x1DFA, 0x0062], NFC: [0x0061, 0x1DFA, 0x10F4B, 0x0316, 0x059A, 0x0062], NFD: [0x0061, 0x1DFA, 0x10F4B, 0x0316, 0x059A, 0x0062], NFKC: [0x0061, 0x1DFA, 0x10F4B, 0x0316, 0x059A, 0x0062], NFKD: [0x0061, 0x1DFA, 0x10F4B, 0x0316, 0x059A, 0x0062] }, +{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x10F4C, 0x0062], NFC: [0x00E0, 0x05AE, 0x10F4C, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x10F4C, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x10F4C, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x10F4C, 0x0315, 0x0062] }, +{ source: [0x0061, 0x10F4C, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x10F4C, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x10F4C, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x10F4C, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x10F4C, 0x0300, 0x0315, 0x0062] }, +{ source: [0x0061, 0x059A, 0x0316, 0x1DFA, 0x10F4D, 0x0062], NFC: [0x0061, 0x1DFA, 0x0316, 0x10F4D, 0x059A, 0x0062], NFD: [0x0061, 0x1DFA, 0x0316, 0x10F4D, 0x059A, 0x0062], NFKC: [0x0061, 0x1DFA, 0x0316, 0x10F4D, 0x059A, 0x0062], NFKD: [0x0061, 0x1DFA, 0x0316, 0x10F4D, 0x059A, 0x0062] }, +{ source: [0x0061, 0x10F4D, 0x059A, 0x0316, 0x1DFA, 0x0062], NFC: [0x0061, 0x1DFA, 0x10F4D, 0x0316, 0x059A, 0x0062], NFD: [0x0061, 0x1DFA, 0x10F4D, 0x0316, 0x059A, 0x0062], NFKC: [0x0061, 0x1DFA, 0x10F4D, 0x0316, 0x059A, 0x0062], NFKD: [0x0061, 0x1DFA, 0x10F4D, 0x0316, 0x059A, 0x0062] }, +{ source: [0x0061, 0x059A, 0x0316, 0x1DFA, 0x10F4E, 0x0062], NFC: [0x0061, 0x1DFA, 0x0316, 0x10F4E, 0x059A, 0x0062], NFD: [0x0061, 0x1DFA, 0x0316, 0x10F4E, 0x059A, 0x0062], NFKC: [0x0061, 0x1DFA, 0x0316, 0x10F4E, 0x059A, 0x0062], NFKD: [0x0061, 0x1DFA, 0x0316, 0x10F4E, 0x059A, 0x0062] }, +{ source: [0x0061, 0x10F4E, 0x059A, 0x0316, 0x1DFA, 0x0062], NFC: [0x0061, 0x1DFA, 0x10F4E, 0x0316, 0x059A, 0x0062], NFD: [0x0061, 0x1DFA, 0x10F4E, 0x0316, 0x059A, 0x0062], NFKC: [0x0061, 0x1DFA, 0x10F4E, 0x0316, 0x059A, 0x0062], NFKD: [0x0061, 0x1DFA, 0x10F4E, 0x0316, 0x059A, 0x0062] }, +{ source: [0x0061, 0x059A, 0x0316, 0x1DFA, 0x10F4F, 0x0062], NFC: [0x0061, 0x1DFA, 0x0316, 0x10F4F, 0x059A, 0x0062], NFD: [0x0061, 0x1DFA, 0x0316, 0x10F4F, 0x059A, 0x0062], NFKC: [0x0061, 0x1DFA, 0x0316, 0x10F4F, 0x059A, 0x0062], NFKD: [0x0061, 0x1DFA, 0x0316, 0x10F4F, 0x059A, 0x0062] }, +{ source: [0x0061, 0x10F4F, 0x059A, 0x0316, 0x1DFA, 0x0062], NFC: [0x0061, 0x1DFA, 0x10F4F, 0x0316, 0x059A, 0x0062], NFD: [0x0061, 0x1DFA, 0x10F4F, 0x0316, 0x059A, 0x0062], NFKC: [0x0061, 0x1DFA, 0x10F4F, 0x0316, 0x059A, 0x0062], NFKD: [0x0061, 0x1DFA, 0x10F4F, 0x0316, 0x059A, 0x0062] }, +{ source: [0x0061, 0x059A, 0x0316, 0x1DFA, 0x10F50, 0x0062], NFC: [0x0061, 0x1DFA, 0x0316, 0x10F50, 0x059A, 0x0062], NFD: [0x0061, 0x1DFA, 0x0316, 0x10F50, 0x059A, 0x0062], NFKC: [0x0061, 0x1DFA, 0x0316, 0x10F50, 0x059A, 0x0062], NFKD: [0x0061, 0x1DFA, 0x0316, 0x10F50, 0x059A, 0x0062] }, +{ source: [0x0061, 0x10F50, 0x059A, 0x0316, 0x1DFA, 0x0062], NFC: [0x0061, 0x1DFA, 0x10F50, 0x0316, 0x059A, 0x0062], NFD: [0x0061, 0x1DFA, 0x10F50, 0x0316, 0x059A, 0x0062], NFKC: [0x0061, 0x1DFA, 0x10F50, 0x0316, 0x059A, 0x0062], NFKD: [0x0061, 0x1DFA, 0x10F50, 0x0316, 0x059A, 0x0062] }, +{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x10F82, 0x0062], NFC: [0x00E0, 0x05AE, 0x10F82, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x10F82, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x10F82, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x10F82, 0x0315, 0x0062] }, +{ source: [0x0061, 0x10F82, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x10F82, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x10F82, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x10F82, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x10F82, 0x0300, 0x0315, 0x0062] }, +{ source: [0x0061, 0x059A, 0x0316, 0x1DFA, 0x10F83, 0x0062], NFC: [0x0061, 0x1DFA, 0x0316, 0x10F83, 0x059A, 0x0062], NFD: [0x0061, 0x1DFA, 0x0316, 0x10F83, 0x059A, 0x0062], NFKC: [0x0061, 0x1DFA, 0x0316, 0x10F83, 0x059A, 0x0062], NFKD: [0x0061, 0x1DFA, 0x0316, 0x10F83, 0x059A, 0x0062] }, +{ source: [0x0061, 0x10F83, 0x059A, 0x0316, 0x1DFA, 0x0062], NFC: [0x0061, 0x1DFA, 0x10F83, 0x0316, 0x059A, 0x0062], NFD: [0x0061, 0x1DFA, 0x10F83, 0x0316, 0x059A, 0x0062], NFKC: [0x0061, 0x1DFA, 0x10F83, 0x0316, 0x059A, 0x0062], NFKD: [0x0061, 0x1DFA, 0x10F83, 0x0316, 0x059A, 0x0062] }, +{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x10F84, 0x0062], NFC: [0x00E0, 0x05AE, 0x10F84, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x10F84, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x10F84, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x10F84, 0x0315, 0x0062] }, +{ source: [0x0061, 0x10F84, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x10F84, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x10F84, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x10F84, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x10F84, 0x0300, 0x0315, 0x0062] }, +{ source: [0x0061, 0x059A, 0x0316, 0x1DFA, 0x10F85, 0x0062], NFC: [0x0061, 0x1DFA, 0x0316, 0x10F85, 0x059A, 0x0062], NFD: [0x0061, 0x1DFA, 0x0316, 0x10F85, 0x059A, 0x0062], NFKC: [0x0061, 0x1DFA, 0x0316, 0x10F85, 0x059A, 0x0062], NFKD: [0x0061, 0x1DFA, 0x0316, 0x10F85, 0x059A, 0x0062] }, +{ source: [0x0061, 0x10F85, 0x059A, 0x0316, 0x1DFA, 0x0062], NFC: [0x0061, 0x1DFA, 0x10F85, 0x0316, 0x059A, 0x0062], NFD: [0x0061, 0x1DFA, 0x10F85, 0x0316, 0x059A, 0x0062], NFKC: [0x0061, 0x1DFA, 0x10F85, 0x0316, 0x059A, 0x0062], NFKD: [0x0061, 0x1DFA, 0x10F85, 0x0316, 0x059A, 0x0062] }, +{ source: [0x0061, 0x05B0, 0x094D, 0x3099, 0x11046, 0x0062], NFC: [0x0061, 0x3099, 0x094D, 0x11046, 0x05B0, 0x0062], NFD: [0x0061, 0x3099, 0x094D, 0x11046, 0x05B0, 0x0062], NFKC: [0x0061, 0x3099, 0x094D, 0x11046, 0x05B0, 0x0062], NFKD: [0x0061, 0x3099, 0x094D, 0x11046, 0x05B0, 0x0062] }, +{ source: [0x0061, 0x11046, 0x05B0, 0x094D, 0x3099, 0x0062], NFC: [0x0061, 0x3099, 0x11046, 0x094D, 0x05B0, 0x0062], NFD: [0x0061, 0x3099, 0x11046, 0x094D, 0x05B0, 0x0062], NFKC: [0x0061, 0x3099, 0x11046, 0x094D, 0x05B0, 0x0062], NFKD: [0x0061, 0x3099, 0x11046, 0x094D, 0x05B0, 0x0062] }, +{ source: [0x0061, 0x05B0, 0x094D, 0x3099, 0x11070, 0x0062], NFC: [0x0061, 0x3099, 0x094D, 0x11070, 0x05B0, 0x0062], NFD: [0x0061, 0x3099, 0x094D, 0x11070, 0x05B0, 0x0062], NFKC: [0x0061, 0x3099, 0x094D, 0x11070, 0x05B0, 0x0062], NFKD: [0x0061, 0x3099, 0x094D, 0x11070, 0x05B0, 0x0062] }, +{ source: [0x0061, 0x11070, 0x05B0, 0x094D, 0x3099, 0x0062], NFC: [0x0061, 0x3099, 0x11070, 0x094D, 0x05B0, 0x0062], NFD: [0x0061, 0x3099, 0x11070, 0x094D, 0x05B0, 0x0062], NFKC: [0x0061, 0x3099, 0x11070, 0x094D, 0x05B0, 0x0062], NFKD: [0x0061, 0x3099, 0x11070, 0x094D, 0x05B0, 0x0062] }, +{ source: [0x0061, 0x05B0, 0x094D, 0x3099, 0x1107F, 0x0062], NFC: [0x0061, 0x3099, 0x094D, 0x1107F, 0x05B0, 0x0062], NFD: [0x0061, 0x3099, 0x094D, 0x1107F, 0x05B0, 0x0062], NFKC: [0x0061, 0x3099, 0x094D, 0x1107F, 0x05B0, 0x0062], NFKD: [0x0061, 0x3099, 0x094D, 0x1107F, 0x05B0, 0x0062] }, +{ source: [0x0061, 0x1107F, 0x05B0, 0x094D, 0x3099, 0x0062], NFC: [0x0061, 0x3099, 0x1107F, 0x094D, 0x05B0, 0x0062], NFD: [0x0061, 0x3099, 0x1107F, 0x094D, 0x05B0, 0x0062], NFKC: [0x0061, 0x3099, 0x1107F, 0x094D, 0x05B0, 0x0062], NFKD: [0x0061, 0x3099, 0x1107F, 0x094D, 0x05B0, 0x0062] }, +{ source: [0x0061, 0x05B0, 0x094D, 0x3099, 0x110B9, 0x0062], NFC: [0x0061, 0x3099, 0x094D, 0x110B9, 0x05B0, 0x0062], NFD: [0x0061, 0x3099, 0x094D, 0x110B9, 0x05B0, 0x0062], NFKC: [0x0061, 0x3099, 0x094D, 0x110B9, 0x05B0, 0x0062], NFKD: [0x0061, 0x3099, 0x094D, 0x110B9, 0x05B0, 0x0062] }, +{ source: [0x0061, 0x110B9, 0x05B0, 0x094D, 0x3099, 0x0062], NFC: [0x0061, 0x3099, 0x110B9, 0x094D, 0x05B0, 0x0062], NFD: [0x0061, 0x3099, 0x110B9, 0x094D, 0x05B0, 0x0062], NFKC: [0x0061, 0x3099, 0x110B9, 0x094D, 0x05B0, 0x0062], NFKD: [0x0061, 0x3099, 0x110B9, 0x094D, 0x05B0, 0x0062] }, +{ source: [0x0061, 0x3099, 0x093C, 0x16FF0, 0x110BA, 0x0062], NFC: [0x0061, 0x16FF0, 0x093C, 0x110BA, 0x3099, 0x0062], NFD: [0x0061, 0x16FF0, 0x093C, 0x110BA, 0x3099, 0x0062], NFKC: [0x0061, 0x16FF0, 0x093C, 0x110BA, 0x3099, 0x0062], NFKD: [0x0061, 0x16FF0, 0x093C, 0x110BA, 0x3099, 0x0062] }, +{ source: [0x0061, 0x110BA, 0x3099, 0x093C, 0x16FF0, 0x0062], NFC: [0x0061, 0x16FF0, 0x110BA, 0x093C, 0x3099, 0x0062], NFD: [0x0061, 0x16FF0, 0x110BA, 0x093C, 0x3099, 0x0062], NFKC: [0x0061, 0x16FF0, 0x110BA, 0x093C, 0x3099, 0x0062], NFKD: [0x0061, 0x16FF0, 0x110BA, 0x093C, 0x3099, 0x0062] }, +{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x11100, 0x0062], NFC: [0x00E0, 0x05AE, 0x11100, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x11100, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x11100, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x11100, 0x0315, 0x0062] }, +{ source: [0x0061, 0x11100, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x11100, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x11100, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x11100, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x11100, 0x0300, 0x0315, 0x0062] }, +{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x11101, 0x0062], NFC: [0x00E0, 0x05AE, 0x11101, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x11101, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x11101, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x11101, 0x0315, 0x0062] }, +{ source: [0x0061, 0x11101, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x11101, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x11101, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x11101, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x11101, 0x0300, 0x0315, 0x0062] }, +{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x11102, 0x0062], NFC: [0x00E0, 0x05AE, 0x11102, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x11102, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x11102, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x11102, 0x0315, 0x0062] }, +{ source: [0x0061, 0x11102, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x11102, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x11102, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x11102, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x11102, 0x0300, 0x0315, 0x0062] }, +{ source: [0x0061, 0x05B0, 0x094D, 0x3099, 0x11133, 0x0062], NFC: [0x0061, 0x3099, 0x094D, 0x11133, 0x05B0, 0x0062], NFD: [0x0061, 0x3099, 0x094D, 0x11133, 0x05B0, 0x0062], NFKC: [0x0061, 0x3099, 0x094D, 0x11133, 0x05B0, 0x0062], NFKD: [0x0061, 0x3099, 0x094D, 0x11133, 0x05B0, 0x0062] }, +{ source: [0x0061, 0x11133, 0x05B0, 0x094D, 0x3099, 0x0062], NFC: [0x0061, 0x3099, 0x11133, 0x094D, 0x05B0, 0x0062], NFD: [0x0061, 0x3099, 0x11133, 0x094D, 0x05B0, 0x0062], NFKC: [0x0061, 0x3099, 0x11133, 0x094D, 0x05B0, 0x0062], NFKD: [0x0061, 0x3099, 0x11133, 0x094D, 0x05B0, 0x0062] }, +{ source: [0x0061, 0x05B0, 0x094D, 0x3099, 0x11134, 0x0062], NFC: [0x0061, 0x3099, 0x094D, 0x11134, 0x05B0, 0x0062], NFD: [0x0061, 0x3099, 0x094D, 0x11134, 0x05B0, 0x0062], NFKC: [0x0061, 0x3099, 0x094D, 0x11134, 0x05B0, 0x0062], NFKD: [0x0061, 0x3099, 0x094D, 0x11134, 0x05B0, 0x0062] }, +{ source: [0x0061, 0x11134, 0x05B0, 0x094D, 0x3099, 0x0062], NFC: [0x0061, 0x3099, 0x11134, 0x094D, 0x05B0, 0x0062], NFD: [0x0061, 0x3099, 0x11134, 0x094D, 0x05B0, 0x0062], NFKC: [0x0061, 0x3099, 0x11134, 0x094D, 0x05B0, 0x0062], NFKD: [0x0061, 0x3099, 0x11134, 0x094D, 0x05B0, 0x0062] }, +{ source: [0x0061, 0x3099, 0x093C, 0x16FF0, 0x11173, 0x0062], NFC: [0x0061, 0x16FF0, 0x093C, 0x11173, 0x3099, 0x0062], NFD: [0x0061, 0x16FF0, 0x093C, 0x11173, 0x3099, 0x0062], NFKC: [0x0061, 0x16FF0, 0x093C, 0x11173, 0x3099, 0x0062], NFKD: [0x0061, 0x16FF0, 0x093C, 0x11173, 0x3099, 0x0062] }, +{ source: [0x0061, 0x11173, 0x3099, 0x093C, 0x16FF0, 0x0062], NFC: [0x0061, 0x16FF0, 0x11173, 0x093C, 0x3099, 0x0062], NFD: [0x0061, 0x16FF0, 0x11173, 0x093C, 0x3099, 0x0062], NFKC: [0x0061, 0x16FF0, 0x11173, 0x093C, 0x3099, 0x0062], NFKD: [0x0061, 0x16FF0, 0x11173, 0x093C, 0x3099, 0x0062] }, +{ source: [0x0061, 0x05B0, 0x094D, 0x3099, 0x111C0, 0x0062], NFC: [0x0061, 0x3099, 0x094D, 0x111C0, 0x05B0, 0x0062], NFD: [0x0061, 0x3099, 0x094D, 0x111C0, 0x05B0, 0x0062], NFKC: [0x0061, 0x3099, 0x094D, 0x111C0, 0x05B0, 0x0062], NFKD: [0x0061, 0x3099, 0x094D, 0x111C0, 0x05B0, 0x0062] }, +{ source: [0x0061, 0x111C0, 0x05B0, 0x094D, 0x3099, 0x0062], NFC: [0x0061, 0x3099, 0x111C0, 0x094D, 0x05B0, 0x0062], NFD: [0x0061, 0x3099, 0x111C0, 0x094D, 0x05B0, 0x0062], NFKC: [0x0061, 0x3099, 0x111C0, 0x094D, 0x05B0, 0x0062], NFKD: [0x0061, 0x3099, 0x111C0, 0x094D, 0x05B0, 0x0062] }, +{ source: [0x0061, 0x3099, 0x093C, 0x16FF0, 0x111CA, 0x0062], NFC: [0x0061, 0x16FF0, 0x093C, 0x111CA, 0x3099, 0x0062], NFD: [0x0061, 0x16FF0, 0x093C, 0x111CA, 0x3099, 0x0062], NFKC: [0x0061, 0x16FF0, 0x093C, 0x111CA, 0x3099, 0x0062], NFKD: [0x0061, 0x16FF0, 0x093C, 0x111CA, 0x3099, 0x0062] }, +{ source: [0x0061, 0x111CA, 0x3099, 0x093C, 0x16FF0, 0x0062], NFC: [0x0061, 0x16FF0, 0x111CA, 0x093C, 0x3099, 0x0062], NFD: [0x0061, 0x16FF0, 0x111CA, 0x093C, 0x3099, 0x0062], NFKC: [0x0061, 0x16FF0, 0x111CA, 0x093C, 0x3099, 0x0062], NFKD: [0x0061, 0x16FF0, 0x111CA, 0x093C, 0x3099, 0x0062] }, +{ source: [0x0061, 0x05B0, 0x094D, 0x3099, 0x11235, 0x0062], NFC: [0x0061, 0x3099, 0x094D, 0x11235, 0x05B0, 0x0062], NFD: [0x0061, 0x3099, 0x094D, 0x11235, 0x05B0, 0x0062], NFKC: [0x0061, 0x3099, 0x094D, 0x11235, 0x05B0, 0x0062], NFKD: [0x0061, 0x3099, 0x094D, 0x11235, 0x05B0, 0x0062] }, +{ source: [0x0061, 0x11235, 0x05B0, 0x094D, 0x3099, 0x0062], NFC: [0x0061, 0x3099, 0x11235, 0x094D, 0x05B0, 0x0062], NFD: [0x0061, 0x3099, 0x11235, 0x094D, 0x05B0, 0x0062], NFKC: [0x0061, 0x3099, 0x11235, 0x094D, 0x05B0, 0x0062], NFKD: [0x0061, 0x3099, 0x11235, 0x094D, 0x05B0, 0x0062] }, +{ source: [0x0061, 0x3099, 0x093C, 0x16FF0, 0x11236, 0x0062], NFC: [0x0061, 0x16FF0, 0x093C, 0x11236, 0x3099, 0x0062], NFD: [0x0061, 0x16FF0, 0x093C, 0x11236, 0x3099, 0x0062], NFKC: [0x0061, 0x16FF0, 0x093C, 0x11236, 0x3099, 0x0062], NFKD: [0x0061, 0x16FF0, 0x093C, 0x11236, 0x3099, 0x0062] }, +{ source: [0x0061, 0x11236, 0x3099, 0x093C, 0x16FF0, 0x0062], NFC: [0x0061, 0x16FF0, 0x11236, 0x093C, 0x3099, 0x0062], NFD: [0x0061, 0x16FF0, 0x11236, 0x093C, 0x3099, 0x0062], NFKC: [0x0061, 0x16FF0, 0x11236, 0x093C, 0x3099, 0x0062], NFKD: [0x0061, 0x16FF0, 0x11236, 0x093C, 0x3099, 0x0062] }, +{ source: [0x0061, 0x3099, 0x093C, 0x16FF0, 0x112E9, 0x0062], NFC: [0x0061, 0x16FF0, 0x093C, 0x112E9, 0x3099, 0x0062], NFD: [0x0061, 0x16FF0, 0x093C, 0x112E9, 0x3099, 0x0062], NFKC: [0x0061, 0x16FF0, 0x093C, 0x112E9, 0x3099, 0x0062], NFKD: [0x0061, 0x16FF0, 0x093C, 0x112E9, 0x3099, 0x0062] }, +{ source: [0x0061, 0x112E9, 0x3099, 0x093C, 0x16FF0, 0x0062], NFC: [0x0061, 0x16FF0, 0x112E9, 0x093C, 0x3099, 0x0062], NFD: [0x0061, 0x16FF0, 0x112E9, 0x093C, 0x3099, 0x0062], NFKC: [0x0061, 0x16FF0, 0x112E9, 0x093C, 0x3099, 0x0062], NFKD: [0x0061, 0x16FF0, 0x112E9, 0x093C, 0x3099, 0x0062] }, +{ source: [0x0061, 0x05B0, 0x094D, 0x3099, 0x112EA, 0x0062], NFC: [0x0061, 0x3099, 0x094D, 0x112EA, 0x05B0, 0x0062], NFD: [0x0061, 0x3099, 0x094D, 0x112EA, 0x05B0, 0x0062], NFKC: [0x0061, 0x3099, 0x094D, 0x112EA, 0x05B0, 0x0062], NFKD: [0x0061, 0x3099, 0x094D, 0x112EA, 0x05B0, 0x0062] }, +{ source: [0x0061, 0x112EA, 0x05B0, 0x094D, 0x3099, 0x0062], NFC: [0x0061, 0x3099, 0x112EA, 0x094D, 0x05B0, 0x0062], NFD: [0x0061, 0x3099, 0x112EA, 0x094D, 0x05B0, 0x0062], NFKC: [0x0061, 0x3099, 0x112EA, 0x094D, 0x05B0, 0x0062], NFKD: [0x0061, 0x3099, 0x112EA, 0x094D, 0x05B0, 0x0062] }, +{ source: [0x0061, 0x3099, 0x093C, 0x16FF0, 0x1133B, 0x0062], NFC: [0x0061, 0x16FF0, 0x093C, 0x1133B, 0x3099, 0x0062], NFD: [0x0061, 0x16FF0, 0x093C, 0x1133B, 0x3099, 0x0062], NFKC: [0x0061, 0x16FF0, 0x093C, 0x1133B, 0x3099, 0x0062], NFKD: [0x0061, 0x16FF0, 0x093C, 0x1133B, 0x3099, 0x0062] }, +{ source: [0x0061, 0x1133B, 0x3099, 0x093C, 0x16FF0, 0x0062], NFC: [0x0061, 0x16FF0, 0x1133B, 0x093C, 0x3099, 0x0062], NFD: [0x0061, 0x16FF0, 0x1133B, 0x093C, 0x3099, 0x0062], NFKC: [0x0061, 0x16FF0, 0x1133B, 0x093C, 0x3099, 0x0062], NFKD: [0x0061, 0x16FF0, 0x1133B, 0x093C, 0x3099, 0x0062] }, +{ source: [0x0061, 0x3099, 0x093C, 0x16FF0, 0x1133C, 0x0062], NFC: [0x0061, 0x16FF0, 0x093C, 0x1133C, 0x3099, 0x0062], NFD: [0x0061, 0x16FF0, 0x093C, 0x1133C, 0x3099, 0x0062], NFKC: [0x0061, 0x16FF0, 0x093C, 0x1133C, 0x3099, 0x0062], NFKD: [0x0061, 0x16FF0, 0x093C, 0x1133C, 0x3099, 0x0062] }, +{ source: [0x0061, 0x1133C, 0x3099, 0x093C, 0x16FF0, 0x0062], NFC: [0x0061, 0x16FF0, 0x1133C, 0x093C, 0x3099, 0x0062], NFD: [0x0061, 0x16FF0, 0x1133C, 0x093C, 0x3099, 0x0062], NFKC: [0x0061, 0x16FF0, 0x1133C, 0x093C, 0x3099, 0x0062], NFKD: [0x0061, 0x16FF0, 0x1133C, 0x093C, 0x3099, 0x0062] }, +{ source: [0x0061, 0x05B0, 0x094D, 0x3099, 0x1134D, 0x0062], NFC: [0x0061, 0x3099, 0x094D, 0x1134D, 0x05B0, 0x0062], NFD: [0x0061, 0x3099, 0x094D, 0x1134D, 0x05B0, 0x0062], NFKC: [0x0061, 0x3099, 0x094D, 0x1134D, 0x05B0, 0x0062], NFKD: [0x0061, 0x3099, 0x094D, 0x1134D, 0x05B0, 0x0062] }, +{ source: [0x0061, 0x1134D, 0x05B0, 0x094D, 0x3099, 0x0062], NFC: [0x0061, 0x3099, 0x1134D, 0x094D, 0x05B0, 0x0062], NFD: [0x0061, 0x3099, 0x1134D, 0x094D, 0x05B0, 0x0062], NFKC: [0x0061, 0x3099, 0x1134D, 0x094D, 0x05B0, 0x0062], NFKD: [0x0061, 0x3099, 0x1134D, 0x094D, 0x05B0, 0x0062] }, +{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x11366, 0x0062], NFC: [0x00E0, 0x05AE, 0x11366, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x11366, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x11366, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x11366, 0x0315, 0x0062] }, +{ source: [0x0061, 0x11366, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x11366, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x11366, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x11366, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x11366, 0x0300, 0x0315, 0x0062] }, +{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x11367, 0x0062], NFC: [0x00E0, 0x05AE, 0x11367, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x11367, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x11367, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x11367, 0x0315, 0x0062] }, +{ source: [0x0061, 0x11367, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x11367, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x11367, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x11367, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x11367, 0x0300, 0x0315, 0x0062] }, +{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x11368, 0x0062], NFC: [0x00E0, 0x05AE, 0x11368, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x11368, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x11368, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x11368, 0x0315, 0x0062] }, +{ source: [0x0061, 0x11368, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x11368, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x11368, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x11368, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x11368, 0x0300, 0x0315, 0x0062] }, +{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x11369, 0x0062], NFC: [0x00E0, 0x05AE, 0x11369, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x11369, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x11369, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x11369, 0x0315, 0x0062] }, +{ source: [0x0061, 0x11369, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x11369, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x11369, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x11369, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x11369, 0x0300, 0x0315, 0x0062] }, +{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x1136A, 0x0062], NFC: [0x00E0, 0x05AE, 0x1136A, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x1136A, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x1136A, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x1136A, 0x0315, 0x0062] }, +{ source: [0x0061, 0x1136A, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x1136A, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x1136A, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x1136A, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x1136A, 0x0300, 0x0315, 0x0062] }, +{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x1136B, 0x0062], NFC: [0x00E0, 0x05AE, 0x1136B, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x1136B, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x1136B, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x1136B, 0x0315, 0x0062] }, +{ source: [0x0061, 0x1136B, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x1136B, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x1136B, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x1136B, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x1136B, 0x0300, 0x0315, 0x0062] }, +{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x1136C, 0x0062], NFC: [0x00E0, 0x05AE, 0x1136C, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x1136C, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x1136C, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x1136C, 0x0315, 0x0062] }, +{ source: [0x0061, 0x1136C, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x1136C, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x1136C, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x1136C, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x1136C, 0x0300, 0x0315, 0x0062] }, +{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x11370, 0x0062], NFC: [0x00E0, 0x05AE, 0x11370, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x11370, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x11370, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x11370, 0x0315, 0x0062] }, +{ source: [0x0061, 0x11370, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x11370, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x11370, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x11370, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x11370, 0x0300, 0x0315, 0x0062] }, +{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x11371, 0x0062], NFC: [0x00E0, 0x05AE, 0x11371, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x11371, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x11371, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x11371, 0x0315, 0x0062] }, +{ source: [0x0061, 0x11371, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x11371, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x11371, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x11371, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x11371, 0x0300, 0x0315, 0x0062] }, +{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x11372, 0x0062], NFC: [0x00E0, 0x05AE, 0x11372, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x11372, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x11372, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x11372, 0x0315, 0x0062] }, +{ source: [0x0061, 0x11372, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x11372, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x11372, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x11372, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x11372, 0x0300, 0x0315, 0x0062] }, +{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x11373, 0x0062], NFC: [0x00E0, 0x05AE, 0x11373, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x11373, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x11373, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x11373, 0x0315, 0x0062] }, +{ source: [0x0061, 0x11373, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x11373, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x11373, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x11373, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x11373, 0x0300, 0x0315, 0x0062] }, +{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x11374, 0x0062], NFC: [0x00E0, 0x05AE, 0x11374, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x11374, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x11374, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x11374, 0x0315, 0x0062] }, +{ source: [0x0061, 0x11374, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x11374, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x11374, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x11374, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x11374, 0x0300, 0x0315, 0x0062] }, +{ source: [0x0061, 0x05B0, 0x094D, 0x3099, 0x11442, 0x0062], NFC: [0x0061, 0x3099, 0x094D, 0x11442, 0x05B0, 0x0062], NFD: [0x0061, 0x3099, 0x094D, 0x11442, 0x05B0, 0x0062], NFKC: [0x0061, 0x3099, 0x094D, 0x11442, 0x05B0, 0x0062], NFKD: [0x0061, 0x3099, 0x094D, 0x11442, 0x05B0, 0x0062] }, +{ source: [0x0061, 0x11442, 0x05B0, 0x094D, 0x3099, 0x0062], NFC: [0x0061, 0x3099, 0x11442, 0x094D, 0x05B0, 0x0062], NFD: [0x0061, 0x3099, 0x11442, 0x094D, 0x05B0, 0x0062], NFKC: [0x0061, 0x3099, 0x11442, 0x094D, 0x05B0, 0x0062], NFKD: [0x0061, 0x3099, 0x11442, 0x094D, 0x05B0, 0x0062] }, +{ source: [0x0061, 0x3099, 0x093C, 0x16FF0, 0x11446, 0x0062], NFC: [0x0061, 0x16FF0, 0x093C, 0x11446, 0x3099, 0x0062], NFD: [0x0061, 0x16FF0, 0x093C, 0x11446, 0x3099, 0x0062], NFKC: [0x0061, 0x16FF0, 0x093C, 0x11446, 0x3099, 0x0062], NFKD: [0x0061, 0x16FF0, 0x093C, 0x11446, 0x3099, 0x0062] }, +{ source: [0x0061, 0x11446, 0x3099, 0x093C, 0x16FF0, 0x0062], NFC: [0x0061, 0x16FF0, 0x11446, 0x093C, 0x3099, 0x0062], NFD: [0x0061, 0x16FF0, 0x11446, 0x093C, 0x3099, 0x0062], NFKC: [0x0061, 0x16FF0, 0x11446, 0x093C, 0x3099, 0x0062], NFKD: [0x0061, 0x16FF0, 0x11446, 0x093C, 0x3099, 0x0062] }, +{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x1145E, 0x0062], NFC: [0x00E0, 0x05AE, 0x1145E, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x1145E, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x1145E, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x1145E, 0x0315, 0x0062] }, +{ source: [0x0061, 0x1145E, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x1145E, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x1145E, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x1145E, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x1145E, 0x0300, 0x0315, 0x0062] }, +{ source: [0x0061, 0x05B0, 0x094D, 0x3099, 0x114C2, 0x0062], NFC: [0x0061, 0x3099, 0x094D, 0x114C2, 0x05B0, 0x0062], NFD: [0x0061, 0x3099, 0x094D, 0x114C2, 0x05B0, 0x0062], NFKC: [0x0061, 0x3099, 0x094D, 0x114C2, 0x05B0, 0x0062], NFKD: [0x0061, 0x3099, 0x094D, 0x114C2, 0x05B0, 0x0062] }, +{ source: [0x0061, 0x114C2, 0x05B0, 0x094D, 0x3099, 0x0062], NFC: [0x0061, 0x3099, 0x114C2, 0x094D, 0x05B0, 0x0062], NFD: [0x0061, 0x3099, 0x114C2, 0x094D, 0x05B0, 0x0062], NFKC: [0x0061, 0x3099, 0x114C2, 0x094D, 0x05B0, 0x0062], NFKD: [0x0061, 0x3099, 0x114C2, 0x094D, 0x05B0, 0x0062] }, +{ source: [0x0061, 0x3099, 0x093C, 0x16FF0, 0x114C3, 0x0062], NFC: [0x0061, 0x16FF0, 0x093C, 0x114C3, 0x3099, 0x0062], NFD: [0x0061, 0x16FF0, 0x093C, 0x114C3, 0x3099, 0x0062], NFKC: [0x0061, 0x16FF0, 0x093C, 0x114C3, 0x3099, 0x0062], NFKD: [0x0061, 0x16FF0, 0x093C, 0x114C3, 0x3099, 0x0062] }, +{ source: [0x0061, 0x114C3, 0x3099, 0x093C, 0x16FF0, 0x0062], NFC: [0x0061, 0x16FF0, 0x114C3, 0x093C, 0x3099, 0x0062], NFD: [0x0061, 0x16FF0, 0x114C3, 0x093C, 0x3099, 0x0062], NFKC: [0x0061, 0x16FF0, 0x114C3, 0x093C, 0x3099, 0x0062], NFKD: [0x0061, 0x16FF0, 0x114C3, 0x093C, 0x3099, 0x0062] }, +{ source: [0x0061, 0x05B0, 0x094D, 0x3099, 0x115BF, 0x0062], NFC: [0x0061, 0x3099, 0x094D, 0x115BF, 0x05B0, 0x0062], NFD: [0x0061, 0x3099, 0x094D, 0x115BF, 0x05B0, 0x0062], NFKC: [0x0061, 0x3099, 0x094D, 0x115BF, 0x05B0, 0x0062], NFKD: [0x0061, 0x3099, 0x094D, 0x115BF, 0x05B0, 0x0062] }, +{ source: [0x0061, 0x115BF, 0x05B0, 0x094D, 0x3099, 0x0062], NFC: [0x0061, 0x3099, 0x115BF, 0x094D, 0x05B0, 0x0062], NFD: [0x0061, 0x3099, 0x115BF, 0x094D, 0x05B0, 0x0062], NFKC: [0x0061, 0x3099, 0x115BF, 0x094D, 0x05B0, 0x0062], NFKD: [0x0061, 0x3099, 0x115BF, 0x094D, 0x05B0, 0x0062] }, +{ source: [0x0061, 0x3099, 0x093C, 0x16FF0, 0x115C0, 0x0062], NFC: [0x0061, 0x16FF0, 0x093C, 0x115C0, 0x3099, 0x0062], NFD: [0x0061, 0x16FF0, 0x093C, 0x115C0, 0x3099, 0x0062], NFKC: [0x0061, 0x16FF0, 0x093C, 0x115C0, 0x3099, 0x0062], NFKD: [0x0061, 0x16FF0, 0x093C, 0x115C0, 0x3099, 0x0062] }, +{ source: [0x0061, 0x115C0, 0x3099, 0x093C, 0x16FF0, 0x0062], NFC: [0x0061, 0x16FF0, 0x115C0, 0x093C, 0x3099, 0x0062], NFD: [0x0061, 0x16FF0, 0x115C0, 0x093C, 0x3099, 0x0062], NFKC: [0x0061, 0x16FF0, 0x115C0, 0x093C, 0x3099, 0x0062], NFKD: [0x0061, 0x16FF0, 0x115C0, 0x093C, 0x3099, 0x0062] }, +{ source: [0x0061, 0x05B0, 0x094D, 0x3099, 0x1163F, 0x0062], NFC: [0x0061, 0x3099, 0x094D, 0x1163F, 0x05B0, 0x0062], NFD: [0x0061, 0x3099, 0x094D, 0x1163F, 0x05B0, 0x0062], NFKC: [0x0061, 0x3099, 0x094D, 0x1163F, 0x05B0, 0x0062], NFKD: [0x0061, 0x3099, 0x094D, 0x1163F, 0x05B0, 0x0062] }, +{ source: [0x0061, 0x1163F, 0x05B0, 0x094D, 0x3099, 0x0062], NFC: [0x0061, 0x3099, 0x1163F, 0x094D, 0x05B0, 0x0062], NFD: [0x0061, 0x3099, 0x1163F, 0x094D, 0x05B0, 0x0062], NFKC: [0x0061, 0x3099, 0x1163F, 0x094D, 0x05B0, 0x0062], NFKD: [0x0061, 0x3099, 0x1163F, 0x094D, 0x05B0, 0x0062] }, +{ source: [0x0061, 0x05B0, 0x094D, 0x3099, 0x116B6, 0x0062], NFC: [0x0061, 0x3099, 0x094D, 0x116B6, 0x05B0, 0x0062], NFD: [0x0061, 0x3099, 0x094D, 0x116B6, 0x05B0, 0x0062], NFKC: [0x0061, 0x3099, 0x094D, 0x116B6, 0x05B0, 0x0062], NFKD: [0x0061, 0x3099, 0x094D, 0x116B6, 0x05B0, 0x0062] }, +{ source: [0x0061, 0x116B6, 0x05B0, 0x094D, 0x3099, 0x0062], NFC: [0x0061, 0x3099, 0x116B6, 0x094D, 0x05B0, 0x0062], NFD: [0x0061, 0x3099, 0x116B6, 0x094D, 0x05B0, 0x0062], NFKC: [0x0061, 0x3099, 0x116B6, 0x094D, 0x05B0, 0x0062], NFKD: [0x0061, 0x3099, 0x116B6, 0x094D, 0x05B0, 0x0062] }, +{ source: [0x0061, 0x3099, 0x093C, 0x16FF0, 0x116B7, 0x0062], NFC: [0x0061, 0x16FF0, 0x093C, 0x116B7, 0x3099, 0x0062], NFD: [0x0061, 0x16FF0, 0x093C, 0x116B7, 0x3099, 0x0062], NFKC: [0x0061, 0x16FF0, 0x093C, 0x116B7, 0x3099, 0x0062], NFKD: [0x0061, 0x16FF0, 0x093C, 0x116B7, 0x3099, 0x0062] }, +{ source: [0x0061, 0x116B7, 0x3099, 0x093C, 0x16FF0, 0x0062], NFC: [0x0061, 0x16FF0, 0x116B7, 0x093C, 0x3099, 0x0062], NFD: [0x0061, 0x16FF0, 0x116B7, 0x093C, 0x3099, 0x0062], NFKC: [0x0061, 0x16FF0, 0x116B7, 0x093C, 0x3099, 0x0062], NFKD: [0x0061, 0x16FF0, 0x116B7, 0x093C, 0x3099, 0x0062] }, +{ source: [0x0061, 0x05B0, 0x094D, 0x3099, 0x1172B, 0x0062], NFC: [0x0061, 0x3099, 0x094D, 0x1172B, 0x05B0, 0x0062], NFD: [0x0061, 0x3099, 0x094D, 0x1172B, 0x05B0, 0x0062], NFKC: [0x0061, 0x3099, 0x094D, 0x1172B, 0x05B0, 0x0062], NFKD: [0x0061, 0x3099, 0x094D, 0x1172B, 0x05B0, 0x0062] }, +{ source: [0x0061, 0x1172B, 0x05B0, 0x094D, 0x3099, 0x0062], NFC: [0x0061, 0x3099, 0x1172B, 0x094D, 0x05B0, 0x0062], NFD: [0x0061, 0x3099, 0x1172B, 0x094D, 0x05B0, 0x0062], NFKC: [0x0061, 0x3099, 0x1172B, 0x094D, 0x05B0, 0x0062], NFKD: [0x0061, 0x3099, 0x1172B, 0x094D, 0x05B0, 0x0062] }, +{ source: [0x0061, 0x05B0, 0x094D, 0x3099, 0x11839, 0x0062], NFC: [0x0061, 0x3099, 0x094D, 0x11839, 0x05B0, 0x0062], NFD: [0x0061, 0x3099, 0x094D, 0x11839, 0x05B0, 0x0062], NFKC: [0x0061, 0x3099, 0x094D, 0x11839, 0x05B0, 0x0062], NFKD: [0x0061, 0x3099, 0x094D, 0x11839, 0x05B0, 0x0062] }, +{ source: [0x0061, 0x11839, 0x05B0, 0x094D, 0x3099, 0x0062], NFC: [0x0061, 0x3099, 0x11839, 0x094D, 0x05B0, 0x0062], NFD: [0x0061, 0x3099, 0x11839, 0x094D, 0x05B0, 0x0062], NFKC: [0x0061, 0x3099, 0x11839, 0x094D, 0x05B0, 0x0062], NFKD: [0x0061, 0x3099, 0x11839, 0x094D, 0x05B0, 0x0062] }, +{ source: [0x0061, 0x3099, 0x093C, 0x16FF0, 0x1183A, 0x0062], NFC: [0x0061, 0x16FF0, 0x093C, 0x1183A, 0x3099, 0x0062], NFD: [0x0061, 0x16FF0, 0x093C, 0x1183A, 0x3099, 0x0062], NFKC: [0x0061, 0x16FF0, 0x093C, 0x1183A, 0x3099, 0x0062], NFKD: [0x0061, 0x16FF0, 0x093C, 0x1183A, 0x3099, 0x0062] }, +{ source: [0x0061, 0x1183A, 0x3099, 0x093C, 0x16FF0, 0x0062], NFC: [0x0061, 0x16FF0, 0x1183A, 0x093C, 0x3099, 0x0062], NFD: [0x0061, 0x16FF0, 0x1183A, 0x093C, 0x3099, 0x0062], NFKC: [0x0061, 0x16FF0, 0x1183A, 0x093C, 0x3099, 0x0062], NFKD: [0x0061, 0x16FF0, 0x1183A, 0x093C, 0x3099, 0x0062] }, +{ source: [0x0061, 0x05B0, 0x094D, 0x3099, 0x1193D, 0x0062], NFC: [0x0061, 0x3099, 0x094D, 0x1193D, 0x05B0, 0x0062], NFD: [0x0061, 0x3099, 0x094D, 0x1193D, 0x05B0, 0x0062], NFKC: [0x0061, 0x3099, 0x094D, 0x1193D, 0x05B0, 0x0062], NFKD: [0x0061, 0x3099, 0x094D, 0x1193D, 0x05B0, 0x0062] }, +{ source: [0x0061, 0x1193D, 0x05B0, 0x094D, 0x3099, 0x0062], NFC: [0x0061, 0x3099, 0x1193D, 0x094D, 0x05B0, 0x0062], NFD: [0x0061, 0x3099, 0x1193D, 0x094D, 0x05B0, 0x0062], NFKC: [0x0061, 0x3099, 0x1193D, 0x094D, 0x05B0, 0x0062], NFKD: [0x0061, 0x3099, 0x1193D, 0x094D, 0x05B0, 0x0062] }, +{ source: [0x0061, 0x05B0, 0x094D, 0x3099, 0x1193E, 0x0062], NFC: [0x0061, 0x3099, 0x094D, 0x1193E, 0x05B0, 0x0062], NFD: [0x0061, 0x3099, 0x094D, 0x1193E, 0x05B0, 0x0062], NFKC: [0x0061, 0x3099, 0x094D, 0x1193E, 0x05B0, 0x0062], NFKD: [0x0061, 0x3099, 0x094D, 0x1193E, 0x05B0, 0x0062] }, +{ source: [0x0061, 0x1193E, 0x05B0, 0x094D, 0x3099, 0x0062], NFC: [0x0061, 0x3099, 0x1193E, 0x094D, 0x05B0, 0x0062], NFD: [0x0061, 0x3099, 0x1193E, 0x094D, 0x05B0, 0x0062], NFKC: [0x0061, 0x3099, 0x1193E, 0x094D, 0x05B0, 0x0062], NFKD: [0x0061, 0x3099, 0x1193E, 0x094D, 0x05B0, 0x0062] }, +{ source: [0x0061, 0x3099, 0x093C, 0x16FF0, 0x11943, 0x0062], NFC: [0x0061, 0x16FF0, 0x093C, 0x11943, 0x3099, 0x0062], NFD: [0x0061, 0x16FF0, 0x093C, 0x11943, 0x3099, 0x0062], NFKC: [0x0061, 0x16FF0, 0x093C, 0x11943, 0x3099, 0x0062], NFKD: [0x0061, 0x16FF0, 0x093C, 0x11943, 0x3099, 0x0062] }, +{ source: [0x0061, 0x11943, 0x3099, 0x093C, 0x16FF0, 0x0062], NFC: [0x0061, 0x16FF0, 0x11943, 0x093C, 0x3099, 0x0062], NFD: [0x0061, 0x16FF0, 0x11943, 0x093C, 0x3099, 0x0062], NFKC: [0x0061, 0x16FF0, 0x11943, 0x093C, 0x3099, 0x0062], NFKD: [0x0061, 0x16FF0, 0x11943, 0x093C, 0x3099, 0x0062] }, +{ source: [0x0061, 0x05B0, 0x094D, 0x3099, 0x119E0, 0x0062], NFC: [0x0061, 0x3099, 0x094D, 0x119E0, 0x05B0, 0x0062], NFD: [0x0061, 0x3099, 0x094D, 0x119E0, 0x05B0, 0x0062], NFKC: [0x0061, 0x3099, 0x094D, 0x119E0, 0x05B0, 0x0062], NFKD: [0x0061, 0x3099, 0x094D, 0x119E0, 0x05B0, 0x0062] }, +{ source: [0x0061, 0x119E0, 0x05B0, 0x094D, 0x3099, 0x0062], NFC: [0x0061, 0x3099, 0x119E0, 0x094D, 0x05B0, 0x0062], NFD: [0x0061, 0x3099, 0x119E0, 0x094D, 0x05B0, 0x0062], NFKC: [0x0061, 0x3099, 0x119E0, 0x094D, 0x05B0, 0x0062], NFKD: [0x0061, 0x3099, 0x119E0, 0x094D, 0x05B0, 0x0062] }, +{ source: [0x0061, 0x05B0, 0x094D, 0x3099, 0x11A34, 0x0062], NFC: [0x0061, 0x3099, 0x094D, 0x11A34, 0x05B0, 0x0062], NFD: [0x0061, 0x3099, 0x094D, 0x11A34, 0x05B0, 0x0062], NFKC: [0x0061, 0x3099, 0x094D, 0x11A34, 0x05B0, 0x0062], NFKD: [0x0061, 0x3099, 0x094D, 0x11A34, 0x05B0, 0x0062] }, +{ source: [0x0061, 0x11A34, 0x05B0, 0x094D, 0x3099, 0x0062], NFC: [0x0061, 0x3099, 0x11A34, 0x094D, 0x05B0, 0x0062], NFD: [0x0061, 0x3099, 0x11A34, 0x094D, 0x05B0, 0x0062], NFKC: [0x0061, 0x3099, 0x11A34, 0x094D, 0x05B0, 0x0062], NFKD: [0x0061, 0x3099, 0x11A34, 0x094D, 0x05B0, 0x0062] }, +{ source: [0x0061, 0x05B0, 0x094D, 0x3099, 0x11A47, 0x0062], NFC: [0x0061, 0x3099, 0x094D, 0x11A47, 0x05B0, 0x0062], NFD: [0x0061, 0x3099, 0x094D, 0x11A47, 0x05B0, 0x0062], NFKC: [0x0061, 0x3099, 0x094D, 0x11A47, 0x05B0, 0x0062], NFKD: [0x0061, 0x3099, 0x094D, 0x11A47, 0x05B0, 0x0062] }, +{ source: [0x0061, 0x11A47, 0x05B0, 0x094D, 0x3099, 0x0062], NFC: [0x0061, 0x3099, 0x11A47, 0x094D, 0x05B0, 0x0062], NFD: [0x0061, 0x3099, 0x11A47, 0x094D, 0x05B0, 0x0062], NFKC: [0x0061, 0x3099, 0x11A47, 0x094D, 0x05B0, 0x0062], NFKD: [0x0061, 0x3099, 0x11A47, 0x094D, 0x05B0, 0x0062] }, +{ source: [0x0061, 0x05B0, 0x094D, 0x3099, 0x11A99, 0x0062], NFC: [0x0061, 0x3099, 0x094D, 0x11A99, 0x05B0, 0x0062], NFD: [0x0061, 0x3099, 0x094D, 0x11A99, 0x05B0, 0x0062], NFKC: [0x0061, 0x3099, 0x094D, 0x11A99, 0x05B0, 0x0062], NFKD: [0x0061, 0x3099, 0x094D, 0x11A99, 0x05B0, 0x0062] }, +{ source: [0x0061, 0x11A99, 0x05B0, 0x094D, 0x3099, 0x0062], NFC: [0x0061, 0x3099, 0x11A99, 0x094D, 0x05B0, 0x0062], NFD: [0x0061, 0x3099, 0x11A99, 0x094D, 0x05B0, 0x0062], NFKC: [0x0061, 0x3099, 0x11A99, 0x094D, 0x05B0, 0x0062], NFKD: [0x0061, 0x3099, 0x11A99, 0x094D, 0x05B0, 0x0062] }, +{ source: [0x0061, 0x05B0, 0x094D, 0x3099, 0x11C3F, 0x0062], NFC: [0x0061, 0x3099, 0x094D, 0x11C3F, 0x05B0, 0x0062], NFD: [0x0061, 0x3099, 0x094D, 0x11C3F, 0x05B0, 0x0062], NFKC: [0x0061, 0x3099, 0x094D, 0x11C3F, 0x05B0, 0x0062], NFKD: [0x0061, 0x3099, 0x094D, 0x11C3F, 0x05B0, 0x0062] }, +{ source: [0x0061, 0x11C3F, 0x05B0, 0x094D, 0x3099, 0x0062], NFC: [0x0061, 0x3099, 0x11C3F, 0x094D, 0x05B0, 0x0062], NFD: [0x0061, 0x3099, 0x11C3F, 0x094D, 0x05B0, 0x0062], NFKC: [0x0061, 0x3099, 0x11C3F, 0x094D, 0x05B0, 0x0062], NFKD: [0x0061, 0x3099, 0x11C3F, 0x094D, 0x05B0, 0x0062] }, +{ source: [0x0061, 0x3099, 0x093C, 0x16FF0, 0x11D42, 0x0062], NFC: [0x0061, 0x16FF0, 0x093C, 0x11D42, 0x3099, 0x0062], NFD: [0x0061, 0x16FF0, 0x093C, 0x11D42, 0x3099, 0x0062], NFKC: [0x0061, 0x16FF0, 0x093C, 0x11D42, 0x3099, 0x0062], NFKD: [0x0061, 0x16FF0, 0x093C, 0x11D42, 0x3099, 0x0062] }, +{ source: [0x0061, 0x11D42, 0x3099, 0x093C, 0x16FF0, 0x0062], NFC: [0x0061, 0x16FF0, 0x11D42, 0x093C, 0x3099, 0x0062], NFD: [0x0061, 0x16FF0, 0x11D42, 0x093C, 0x3099, 0x0062], NFKC: [0x0061, 0x16FF0, 0x11D42, 0x093C, 0x3099, 0x0062], NFKD: [0x0061, 0x16FF0, 0x11D42, 0x093C, 0x3099, 0x0062] }, +{ source: [0x0061, 0x05B0, 0x094D, 0x3099, 0x11D44, 0x0062], NFC: [0x0061, 0x3099, 0x094D, 0x11D44, 0x05B0, 0x0062], NFD: [0x0061, 0x3099, 0x094D, 0x11D44, 0x05B0, 0x0062], NFKC: [0x0061, 0x3099, 0x094D, 0x11D44, 0x05B0, 0x0062], NFKD: [0x0061, 0x3099, 0x094D, 0x11D44, 0x05B0, 0x0062] }, +{ source: [0x0061, 0x11D44, 0x05B0, 0x094D, 0x3099, 0x0062], NFC: [0x0061, 0x3099, 0x11D44, 0x094D, 0x05B0, 0x0062], NFD: [0x0061, 0x3099, 0x11D44, 0x094D, 0x05B0, 0x0062], NFKC: [0x0061, 0x3099, 0x11D44, 0x094D, 0x05B0, 0x0062], NFKD: [0x0061, 0x3099, 0x11D44, 0x094D, 0x05B0, 0x0062] }, +{ source: [0x0061, 0x05B0, 0x094D, 0x3099, 0x11D45, 0x0062], NFC: [0x0061, 0x3099, 0x094D, 0x11D45, 0x05B0, 0x0062], NFD: [0x0061, 0x3099, 0x094D, 0x11D45, 0x05B0, 0x0062], NFKC: [0x0061, 0x3099, 0x094D, 0x11D45, 0x05B0, 0x0062], NFKD: [0x0061, 0x3099, 0x094D, 0x11D45, 0x05B0, 0x0062] }, +{ source: [0x0061, 0x11D45, 0x05B0, 0x094D, 0x3099, 0x0062], NFC: [0x0061, 0x3099, 0x11D45, 0x094D, 0x05B0, 0x0062], NFD: [0x0061, 0x3099, 0x11D45, 0x094D, 0x05B0, 0x0062], NFKC: [0x0061, 0x3099, 0x11D45, 0x094D, 0x05B0, 0x0062], NFKD: [0x0061, 0x3099, 0x11D45, 0x094D, 0x05B0, 0x0062] }, +{ source: [0x0061, 0x05B0, 0x094D, 0x3099, 0x11D97, 0x0062], NFC: [0x0061, 0x3099, 0x094D, 0x11D97, 0x05B0, 0x0062], NFD: [0x0061, 0x3099, 0x094D, 0x11D97, 0x05B0, 0x0062], NFKC: [0x0061, 0x3099, 0x094D, 0x11D97, 0x05B0, 0x0062], NFKD: [0x0061, 0x3099, 0x094D, 0x11D97, 0x05B0, 0x0062] }, +{ source: [0x0061, 0x11D97, 0x05B0, 0x094D, 0x3099, 0x0062], NFC: [0x0061, 0x3099, 0x11D97, 0x094D, 0x05B0, 0x0062], NFD: [0x0061, 0x3099, 0x11D97, 0x094D, 0x05B0, 0x0062], NFKC: [0x0061, 0x3099, 0x11D97, 0x094D, 0x05B0, 0x0062], NFKD: [0x0061, 0x3099, 0x11D97, 0x094D, 0x05B0, 0x0062] }, +{ source: [0x0061, 0x05B0, 0x094D, 0x3099, 0x11F41, 0x0062], NFC: [0x0061, 0x3099, 0x094D, 0x11F41, 0x05B0, 0x0062], NFD: [0x0061, 0x3099, 0x094D, 0x11F41, 0x05B0, 0x0062], NFKC: [0x0061, 0x3099, 0x094D, 0x11F41, 0x05B0, 0x0062], NFKD: [0x0061, 0x3099, 0x094D, 0x11F41, 0x05B0, 0x0062] }, +{ source: [0x0061, 0x11F41, 0x05B0, 0x094D, 0x3099, 0x0062], NFC: [0x0061, 0x3099, 0x11F41, 0x094D, 0x05B0, 0x0062], NFD: [0x0061, 0x3099, 0x11F41, 0x094D, 0x05B0, 0x0062], NFKC: [0x0061, 0x3099, 0x11F41, 0x094D, 0x05B0, 0x0062], NFKD: [0x0061, 0x3099, 0x11F41, 0x094D, 0x05B0, 0x0062] }, +{ source: [0x0061, 0x05B0, 0x094D, 0x3099, 0x11F42, 0x0062], NFC: [0x0061, 0x3099, 0x094D, 0x11F42, 0x05B0, 0x0062], NFD: [0x0061, 0x3099, 0x094D, 0x11F42, 0x05B0, 0x0062], NFKC: [0x0061, 0x3099, 0x094D, 0x11F42, 0x05B0, 0x0062], NFKD: [0x0061, 0x3099, 0x094D, 0x11F42, 0x05B0, 0x0062] }, +{ source: [0x0061, 0x11F42, 0x05B0, 0x094D, 0x3099, 0x0062], NFC: [0x0061, 0x3099, 0x11F42, 0x094D, 0x05B0, 0x0062], NFD: [0x0061, 0x3099, 0x11F42, 0x094D, 0x05B0, 0x0062], NFKC: [0x0061, 0x3099, 0x11F42, 0x094D, 0x05B0, 0x0062], NFKD: [0x0061, 0x3099, 0x11F42, 0x094D, 0x05B0, 0x0062] }, +{ source: [0x0061, 0x16FF0, 0x0334, 0x16AF0, 0x0062], NFC: [0x0061, 0x0334, 0x16AF0, 0x16FF0, 0x0062], NFD: [0x0061, 0x0334, 0x16AF0, 0x16FF0, 0x0062], NFKC: [0x0061, 0x0334, 0x16AF0, 0x16FF0, 0x0062], NFKD: [0x0061, 0x0334, 0x16AF0, 0x16FF0, 0x0062] }, +{ source: [0x0061, 0x16AF0, 0x16FF0, 0x0334, 0x0062], NFC: [0x0061, 0x16AF0, 0x0334, 0x16FF0, 0x0062], NFD: [0x0061, 0x16AF0, 0x0334, 0x16FF0, 0x0062], NFKC: [0x0061, 0x16AF0, 0x0334, 0x16FF0, 0x0062], NFKD: [0x0061, 0x16AF0, 0x0334, 0x16FF0, 0x0062] }, +{ source: [0x0061, 0x16FF0, 0x0334, 0x16AF1, 0x0062], NFC: [0x0061, 0x0334, 0x16AF1, 0x16FF0, 0x0062], NFD: [0x0061, 0x0334, 0x16AF1, 0x16FF0, 0x0062], NFKC: [0x0061, 0x0334, 0x16AF1, 0x16FF0, 0x0062], NFKD: [0x0061, 0x0334, 0x16AF1, 0x16FF0, 0x0062] }, +{ source: [0x0061, 0x16AF1, 0x16FF0, 0x0334, 0x0062], NFC: [0x0061, 0x16AF1, 0x0334, 0x16FF0, 0x0062], NFD: [0x0061, 0x16AF1, 0x0334, 0x16FF0, 0x0062], NFKC: [0x0061, 0x16AF1, 0x0334, 0x16FF0, 0x0062], NFKD: [0x0061, 0x16AF1, 0x0334, 0x16FF0, 0x0062] }, +{ source: [0x0061, 0x16FF0, 0x0334, 0x16AF2, 0x0062], NFC: [0x0061, 0x0334, 0x16AF2, 0x16FF0, 0x0062], NFD: [0x0061, 0x0334, 0x16AF2, 0x16FF0, 0x0062], NFKC: [0x0061, 0x0334, 0x16AF2, 0x16FF0, 0x0062], NFKD: [0x0061, 0x0334, 0x16AF2, 0x16FF0, 0x0062] }, +{ source: [0x0061, 0x16AF2, 0x16FF0, 0x0334, 0x0062], NFC: [0x0061, 0x16AF2, 0x0334, 0x16FF0, 0x0062], NFD: [0x0061, 0x16AF2, 0x0334, 0x16FF0, 0x0062], NFKC: [0x0061, 0x16AF2, 0x0334, 0x16FF0, 0x0062], NFKD: [0x0061, 0x16AF2, 0x0334, 0x16FF0, 0x0062] }, +{ source: [0x0061, 0x16FF0, 0x0334, 0x16AF3, 0x0062], NFC: [0x0061, 0x0334, 0x16AF3, 0x16FF0, 0x0062], NFD: [0x0061, 0x0334, 0x16AF3, 0x16FF0, 0x0062], NFKC: [0x0061, 0x0334, 0x16AF3, 0x16FF0, 0x0062], NFKD: [0x0061, 0x0334, 0x16AF3, 0x16FF0, 0x0062] }, +{ source: [0x0061, 0x16AF3, 0x16FF0, 0x0334, 0x0062], NFC: [0x0061, 0x16AF3, 0x0334, 0x16FF0, 0x0062], NFD: [0x0061, 0x16AF3, 0x0334, 0x16FF0, 0x0062], NFKC: [0x0061, 0x16AF3, 0x0334, 0x16FF0, 0x0062], NFKD: [0x0061, 0x16AF3, 0x0334, 0x16FF0, 0x0062] }, +{ source: [0x0061, 0x16FF0, 0x0334, 0x16AF4, 0x0062], NFC: [0x0061, 0x0334, 0x16AF4, 0x16FF0, 0x0062], NFD: [0x0061, 0x0334, 0x16AF4, 0x16FF0, 0x0062], NFKC: [0x0061, 0x0334, 0x16AF4, 0x16FF0, 0x0062], NFKD: [0x0061, 0x0334, 0x16AF4, 0x16FF0, 0x0062] }, +{ source: [0x0061, 0x16AF4, 0x16FF0, 0x0334, 0x0062], NFC: [0x0061, 0x16AF4, 0x0334, 0x16FF0, 0x0062], NFD: [0x0061, 0x16AF4, 0x0334, 0x16FF0, 0x0062], NFKC: [0x0061, 0x16AF4, 0x0334, 0x16FF0, 0x0062], NFKD: [0x0061, 0x16AF4, 0x0334, 0x16FF0, 0x0062] }, +{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x16B30, 0x0062], NFC: [0x00E0, 0x05AE, 0x16B30, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x16B30, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x16B30, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x16B30, 0x0315, 0x0062] }, +{ source: [0x0061, 0x16B30, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x16B30, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x16B30, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x16B30, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x16B30, 0x0300, 0x0315, 0x0062] }, +{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x16B31, 0x0062], NFC: [0x00E0, 0x05AE, 0x16B31, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x16B31, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x16B31, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x16B31, 0x0315, 0x0062] }, +{ source: [0x0061, 0x16B31, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x16B31, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x16B31, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x16B31, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x16B31, 0x0300, 0x0315, 0x0062] }, +{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x16B32, 0x0062], NFC: [0x00E0, 0x05AE, 0x16B32, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x16B32, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x16B32, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x16B32, 0x0315, 0x0062] }, +{ source: [0x0061, 0x16B32, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x16B32, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x16B32, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x16B32, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x16B32, 0x0300, 0x0315, 0x0062] }, +{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x16B33, 0x0062], NFC: [0x00E0, 0x05AE, 0x16B33, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x16B33, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x16B33, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x16B33, 0x0315, 0x0062] }, +{ source: [0x0061, 0x16B33, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x16B33, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x16B33, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x16B33, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x16B33, 0x0300, 0x0315, 0x0062] }, +{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x16B34, 0x0062], NFC: [0x00E0, 0x05AE, 0x16B34, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x16B34, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x16B34, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x16B34, 0x0315, 0x0062] }, +{ source: [0x0061, 0x16B34, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x16B34, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x16B34, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x16B34, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x16B34, 0x0300, 0x0315, 0x0062] }, +{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x16B35, 0x0062], NFC: [0x00E0, 0x05AE, 0x16B35, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x16B35, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x16B35, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x16B35, 0x0315, 0x0062] }, +{ source: [0x0061, 0x16B35, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x16B35, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x16B35, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x16B35, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x16B35, 0x0300, 0x0315, 0x0062] }, +{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x16B36, 0x0062], NFC: [0x00E0, 0x05AE, 0x16B36, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x16B36, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x16B36, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x16B36, 0x0315, 0x0062] }, +{ source: [0x0061, 0x16B36, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x16B36, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x16B36, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x16B36, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x16B36, 0x0300, 0x0315, 0x0062] }, +{ source: [0x0061, 0x093C, 0x16FF0, 0x0334, 0x16FF0, 0x0062], NFC: [0x0061, 0x0334, 0x16FF0, 0x16FF0, 0x093C, 0x0062], NFD: [0x0061, 0x0334, 0x16FF0, 0x16FF0, 0x093C, 0x0062], NFKC: [0x0061, 0x0334, 0x16FF0, 0x16FF0, 0x093C, 0x0062], NFKD: [0x0061, 0x0334, 0x16FF0, 0x16FF0, 0x093C, 0x0062] }, +{ source: [0x0061, 0x16FF0, 0x093C, 0x16FF0, 0x0334, 0x0062], NFC: [0x0061, 0x0334, 0x16FF0, 0x16FF0, 0x093C, 0x0062], NFD: [0x0061, 0x0334, 0x16FF0, 0x16FF0, 0x093C, 0x0062], NFKC: [0x0061, 0x0334, 0x16FF0, 0x16FF0, 0x093C, 0x0062], NFKD: [0x0061, 0x0334, 0x16FF0, 0x16FF0, 0x093C, 0x0062] }, +{ source: [0x0061, 0x093C, 0x16FF0, 0x0334, 0x16FF1, 0x0062], NFC: [0x0061, 0x0334, 0x16FF0, 0x16FF1, 0x093C, 0x0062], NFD: [0x0061, 0x0334, 0x16FF0, 0x16FF1, 0x093C, 0x0062], NFKC: [0x0061, 0x0334, 0x16FF0, 0x16FF1, 0x093C, 0x0062], NFKD: [0x0061, 0x0334, 0x16FF0, 0x16FF1, 0x093C, 0x0062] }, +{ source: [0x0061, 0x16FF1, 0x093C, 0x16FF0, 0x0334, 0x0062], NFC: [0x0061, 0x0334, 0x16FF1, 0x16FF0, 0x093C, 0x0062], NFD: [0x0061, 0x0334, 0x16FF1, 0x16FF0, 0x093C, 0x0062], NFKC: [0x0061, 0x0334, 0x16FF1, 0x16FF0, 0x093C, 0x0062], NFKD: [0x0061, 0x0334, 0x16FF1, 0x16FF0, 0x093C, 0x0062] }, +{ source: [0x0061, 0x16FF0, 0x0334, 0x1BC9E, 0x0062], NFC: [0x0061, 0x0334, 0x1BC9E, 0x16FF0, 0x0062], NFD: [0x0061, 0x0334, 0x1BC9E, 0x16FF0, 0x0062], NFKC: [0x0061, 0x0334, 0x1BC9E, 0x16FF0, 0x0062], NFKD: [0x0061, 0x0334, 0x1BC9E, 0x16FF0, 0x0062] }, +{ source: [0x0061, 0x1BC9E, 0x16FF0, 0x0334, 0x0062], NFC: [0x0061, 0x1BC9E, 0x0334, 0x16FF0, 0x0062], NFD: [0x0061, 0x1BC9E, 0x0334, 0x16FF0, 0x0062], NFKC: [0x0061, 0x1BC9E, 0x0334, 0x16FF0, 0x0062], NFKD: [0x0061, 0x1BC9E, 0x0334, 0x16FF0, 0x0062] }, +{ source: [0x0061, 0x1DFA, 0x031B, 0x1DCE, 0x1D165, 0x0062], NFC: [0x0061, 0x1DCE, 0x031B, 0x1D165, 0x1DFA, 0x0062], NFD: [0x0061, 0x1DCE, 0x031B, 0x1D165, 0x1DFA, 0x0062], NFKC: [0x0061, 0x1DCE, 0x031B, 0x1D165, 0x1DFA, 0x0062], NFKD: [0x0061, 0x1DCE, 0x031B, 0x1D165, 0x1DFA, 0x0062] }, +{ source: [0x0061, 0x1D165, 0x1DFA, 0x031B, 0x1DCE, 0x0062], NFC: [0x0061, 0x1DCE, 0x1D165, 0x031B, 0x1DFA, 0x0062], NFD: [0x0061, 0x1DCE, 0x1D165, 0x031B, 0x1DFA, 0x0062], NFKC: [0x0061, 0x1DCE, 0x1D165, 0x031B, 0x1DFA, 0x0062], NFKD: [0x0061, 0x1DCE, 0x1D165, 0x031B, 0x1DFA, 0x0062] }, +{ source: [0x0061, 0x1DFA, 0x031B, 0x1DCE, 0x1D166, 0x0062], NFC: [0x0061, 0x1DCE, 0x031B, 0x1D166, 0x1DFA, 0x0062], NFD: [0x0061, 0x1DCE, 0x031B, 0x1D166, 0x1DFA, 0x0062], NFKC: [0x0061, 0x1DCE, 0x031B, 0x1D166, 0x1DFA, 0x0062], NFKD: [0x0061, 0x1DCE, 0x031B, 0x1D166, 0x1DFA, 0x0062] }, +{ source: [0x0061, 0x1D166, 0x1DFA, 0x031B, 0x1DCE, 0x0062], NFC: [0x0061, 0x1DCE, 0x1D166, 0x031B, 0x1DFA, 0x0062], NFD: [0x0061, 0x1DCE, 0x1D166, 0x031B, 0x1DFA, 0x0062], NFKC: [0x0061, 0x1DCE, 0x1D166, 0x031B, 0x1DFA, 0x0062], NFKD: [0x0061, 0x1DCE, 0x1D166, 0x031B, 0x1DFA, 0x0062] }, +{ source: [0x0061, 0x16FF0, 0x0334, 0x1D167, 0x0062], NFC: [0x0061, 0x0334, 0x1D167, 0x16FF0, 0x0062], NFD: [0x0061, 0x0334, 0x1D167, 0x16FF0, 0x0062], NFKC: [0x0061, 0x0334, 0x1D167, 0x16FF0, 0x0062], NFKD: [0x0061, 0x0334, 0x1D167, 0x16FF0, 0x0062] }, +{ source: [0x0061, 0x1D167, 0x16FF0, 0x0334, 0x0062], NFC: [0x0061, 0x1D167, 0x0334, 0x16FF0, 0x0062], NFD: [0x0061, 0x1D167, 0x0334, 0x16FF0, 0x0062], NFKC: [0x0061, 0x1D167, 0x0334, 0x16FF0, 0x0062], NFKD: [0x0061, 0x1D167, 0x0334, 0x16FF0, 0x0062] }, +{ source: [0x0061, 0x16FF0, 0x0334, 0x1D168, 0x0062], NFC: [0x0061, 0x0334, 0x1D168, 0x16FF0, 0x0062], NFD: [0x0061, 0x0334, 0x1D168, 0x16FF0, 0x0062], NFKC: [0x0061, 0x0334, 0x1D168, 0x16FF0, 0x0062], NFKD: [0x0061, 0x0334, 0x1D168, 0x16FF0, 0x0062] }, +{ source: [0x0061, 0x1D168, 0x16FF0, 0x0334, 0x0062], NFC: [0x0061, 0x1D168, 0x0334, 0x16FF0, 0x0062], NFD: [0x0061, 0x1D168, 0x0334, 0x16FF0, 0x0062], NFKC: [0x0061, 0x1D168, 0x0334, 0x16FF0, 0x0062], NFKD: [0x0061, 0x1D168, 0x0334, 0x16FF0, 0x0062] }, +{ source: [0x0061, 0x16FF0, 0x0334, 0x1D169, 0x0062], NFC: [0x0061, 0x0334, 0x1D169, 0x16FF0, 0x0062], NFD: [0x0061, 0x0334, 0x1D169, 0x16FF0, 0x0062], NFKC: [0x0061, 0x0334, 0x1D169, 0x16FF0, 0x0062], NFKD: [0x0061, 0x0334, 0x1D169, 0x16FF0, 0x0062] }, +{ source: [0x0061, 0x1D169, 0x16FF0, 0x0334, 0x0062], NFC: [0x0061, 0x1D169, 0x0334, 0x16FF0, 0x0062], NFD: [0x0061, 0x1D169, 0x0334, 0x16FF0, 0x0062], NFKC: [0x0061, 0x1D169, 0x0334, 0x16FF0, 0x0062], NFKD: [0x0061, 0x1D169, 0x0334, 0x16FF0, 0x0062] }, +{ source: [0x0061, 0x05AE, 0x1D16D, 0x302E, 0x1D16D, 0x0062], NFC: [0x0061, 0x302E, 0x1D16D, 0x1D16D, 0x05AE, 0x0062], NFD: [0x0061, 0x302E, 0x1D16D, 0x1D16D, 0x05AE, 0x0062], NFKC: [0x0061, 0x302E, 0x1D16D, 0x1D16D, 0x05AE, 0x0062], NFKD: [0x0061, 0x302E, 0x1D16D, 0x1D16D, 0x05AE, 0x0062] }, +{ source: [0x0061, 0x1D16D, 0x05AE, 0x1D16D, 0x302E, 0x0062], NFC: [0x0061, 0x302E, 0x1D16D, 0x1D16D, 0x05AE, 0x0062], NFD: [0x0061, 0x302E, 0x1D16D, 0x1D16D, 0x05AE, 0x0062], NFKC: [0x0061, 0x302E, 0x1D16D, 0x1D16D, 0x05AE, 0x0062], NFKD: [0x0061, 0x302E, 0x1D16D, 0x1D16D, 0x05AE, 0x0062] }, +{ source: [0x0061, 0x1DFA, 0x031B, 0x1DCE, 0x1D16E, 0x0062], NFC: [0x0061, 0x1DCE, 0x031B, 0x1D16E, 0x1DFA, 0x0062], NFD: [0x0061, 0x1DCE, 0x031B, 0x1D16E, 0x1DFA, 0x0062], NFKC: [0x0061, 0x1DCE, 0x031B, 0x1D16E, 0x1DFA, 0x0062], NFKD: [0x0061, 0x1DCE, 0x031B, 0x1D16E, 0x1DFA, 0x0062] }, +{ source: [0x0061, 0x1D16E, 0x1DFA, 0x031B, 0x1DCE, 0x0062], NFC: [0x0061, 0x1DCE, 0x1D16E, 0x031B, 0x1DFA, 0x0062], NFD: [0x0061, 0x1DCE, 0x1D16E, 0x031B, 0x1DFA, 0x0062], NFKC: [0x0061, 0x1DCE, 0x1D16E, 0x031B, 0x1DFA, 0x0062], NFKD: [0x0061, 0x1DCE, 0x1D16E, 0x031B, 0x1DFA, 0x0062] }, +{ source: [0x0061, 0x1DFA, 0x031B, 0x1DCE, 0x1D16F, 0x0062], NFC: [0x0061, 0x1DCE, 0x031B, 0x1D16F, 0x1DFA, 0x0062], NFD: [0x0061, 0x1DCE, 0x031B, 0x1D16F, 0x1DFA, 0x0062], NFKC: [0x0061, 0x1DCE, 0x031B, 0x1D16F, 0x1DFA, 0x0062], NFKD: [0x0061, 0x1DCE, 0x031B, 0x1D16F, 0x1DFA, 0x0062] }, +{ source: [0x0061, 0x1D16F, 0x1DFA, 0x031B, 0x1DCE, 0x0062], NFC: [0x0061, 0x1DCE, 0x1D16F, 0x031B, 0x1DFA, 0x0062], NFD: [0x0061, 0x1DCE, 0x1D16F, 0x031B, 0x1DFA, 0x0062], NFKC: [0x0061, 0x1DCE, 0x1D16F, 0x031B, 0x1DFA, 0x0062], NFKD: [0x0061, 0x1DCE, 0x1D16F, 0x031B, 0x1DFA, 0x0062] }, +{ source: [0x0061, 0x1DFA, 0x031B, 0x1DCE, 0x1D170, 0x0062], NFC: [0x0061, 0x1DCE, 0x031B, 0x1D170, 0x1DFA, 0x0062], NFD: [0x0061, 0x1DCE, 0x031B, 0x1D170, 0x1DFA, 0x0062], NFKC: [0x0061, 0x1DCE, 0x031B, 0x1D170, 0x1DFA, 0x0062], NFKD: [0x0061, 0x1DCE, 0x031B, 0x1D170, 0x1DFA, 0x0062] }, +{ source: [0x0061, 0x1D170, 0x1DFA, 0x031B, 0x1DCE, 0x0062], NFC: [0x0061, 0x1DCE, 0x1D170, 0x031B, 0x1DFA, 0x0062], NFD: [0x0061, 0x1DCE, 0x1D170, 0x031B, 0x1DFA, 0x0062], NFKC: [0x0061, 0x1DCE, 0x1D170, 0x031B, 0x1DFA, 0x0062], NFKD: [0x0061, 0x1DCE, 0x1D170, 0x031B, 0x1DFA, 0x0062] }, +{ source: [0x0061, 0x1DFA, 0x031B, 0x1DCE, 0x1D171, 0x0062], NFC: [0x0061, 0x1DCE, 0x031B, 0x1D171, 0x1DFA, 0x0062], NFD: [0x0061, 0x1DCE, 0x031B, 0x1D171, 0x1DFA, 0x0062], NFKC: [0x0061, 0x1DCE, 0x031B, 0x1D171, 0x1DFA, 0x0062], NFKD: [0x0061, 0x1DCE, 0x031B, 0x1D171, 0x1DFA, 0x0062] }, +{ source: [0x0061, 0x1D171, 0x1DFA, 0x031B, 0x1DCE, 0x0062], NFC: [0x0061, 0x1DCE, 0x1D171, 0x031B, 0x1DFA, 0x0062], NFD: [0x0061, 0x1DCE, 0x1D171, 0x031B, 0x1DFA, 0x0062], NFKC: [0x0061, 0x1DCE, 0x1D171, 0x031B, 0x1DFA, 0x0062], NFKD: [0x0061, 0x1DCE, 0x1D171, 0x031B, 0x1DFA, 0x0062] }, +{ source: [0x0061, 0x1DFA, 0x031B, 0x1DCE, 0x1D172, 0x0062], NFC: [0x0061, 0x1DCE, 0x031B, 0x1D172, 0x1DFA, 0x0062], NFD: [0x0061, 0x1DCE, 0x031B, 0x1D172, 0x1DFA, 0x0062], NFKC: [0x0061, 0x1DCE, 0x031B, 0x1D172, 0x1DFA, 0x0062], NFKD: [0x0061, 0x1DCE, 0x031B, 0x1D172, 0x1DFA, 0x0062] }, +{ source: [0x0061, 0x1D172, 0x1DFA, 0x031B, 0x1DCE, 0x0062], NFC: [0x0061, 0x1DCE, 0x1D172, 0x031B, 0x1DFA, 0x0062], NFD: [0x0061, 0x1DCE, 0x1D172, 0x031B, 0x1DFA, 0x0062], NFKC: [0x0061, 0x1DCE, 0x1D172, 0x031B, 0x1DFA, 0x0062], NFKD: [0x0061, 0x1DCE, 0x1D172, 0x031B, 0x1DFA, 0x0062] }, +{ source: [0x0061, 0x059A, 0x0316, 0x1DFA, 0x1D17B, 0x0062], NFC: [0x0061, 0x1DFA, 0x0316, 0x1D17B, 0x059A, 0x0062], NFD: [0x0061, 0x1DFA, 0x0316, 0x1D17B, 0x059A, 0x0062], NFKC: [0x0061, 0x1DFA, 0x0316, 0x1D17B, 0x059A, 0x0062], NFKD: [0x0061, 0x1DFA, 0x0316, 0x1D17B, 0x059A, 0x0062] }, +{ source: [0x0061, 0x1D17B, 0x059A, 0x0316, 0x1DFA, 0x0062], NFC: [0x0061, 0x1DFA, 0x1D17B, 0x0316, 0x059A, 0x0062], NFD: [0x0061, 0x1DFA, 0x1D17B, 0x0316, 0x059A, 0x0062], NFKC: [0x0061, 0x1DFA, 0x1D17B, 0x0316, 0x059A, 0x0062], NFKD: [0x0061, 0x1DFA, 0x1D17B, 0x0316, 0x059A, 0x0062] }, +{ source: [0x0061, 0x059A, 0x0316, 0x1DFA, 0x1D17C, 0x0062], NFC: [0x0061, 0x1DFA, 0x0316, 0x1D17C, 0x059A, 0x0062], NFD: [0x0061, 0x1DFA, 0x0316, 0x1D17C, 0x059A, 0x0062], NFKC: [0x0061, 0x1DFA, 0x0316, 0x1D17C, 0x059A, 0x0062], NFKD: [0x0061, 0x1DFA, 0x0316, 0x1D17C, 0x059A, 0x0062] }, +{ source: [0x0061, 0x1D17C, 0x059A, 0x0316, 0x1DFA, 0x0062], NFC: [0x0061, 0x1DFA, 0x1D17C, 0x0316, 0x059A, 0x0062], NFD: [0x0061, 0x1DFA, 0x1D17C, 0x0316, 0x059A, 0x0062], NFKC: [0x0061, 0x1DFA, 0x1D17C, 0x0316, 0x059A, 0x0062], NFKD: [0x0061, 0x1DFA, 0x1D17C, 0x0316, 0x059A, 0x0062] }, +{ source: [0x0061, 0x059A, 0x0316, 0x1DFA, 0x1D17D, 0x0062], NFC: [0x0061, 0x1DFA, 0x0316, 0x1D17D, 0x059A, 0x0062], NFD: [0x0061, 0x1DFA, 0x0316, 0x1D17D, 0x059A, 0x0062], NFKC: [0x0061, 0x1DFA, 0x0316, 0x1D17D, 0x059A, 0x0062], NFKD: [0x0061, 0x1DFA, 0x0316, 0x1D17D, 0x059A, 0x0062] }, +{ source: [0x0061, 0x1D17D, 0x059A, 0x0316, 0x1DFA, 0x0062], NFC: [0x0061, 0x1DFA, 0x1D17D, 0x0316, 0x059A, 0x0062], NFD: [0x0061, 0x1DFA, 0x1D17D, 0x0316, 0x059A, 0x0062], NFKC: [0x0061, 0x1DFA, 0x1D17D, 0x0316, 0x059A, 0x0062], NFKD: [0x0061, 0x1DFA, 0x1D17D, 0x0316, 0x059A, 0x0062] }, +{ source: [0x0061, 0x059A, 0x0316, 0x1DFA, 0x1D17E, 0x0062], NFC: [0x0061, 0x1DFA, 0x0316, 0x1D17E, 0x059A, 0x0062], NFD: [0x0061, 0x1DFA, 0x0316, 0x1D17E, 0x059A, 0x0062], NFKC: [0x0061, 0x1DFA, 0x0316, 0x1D17E, 0x059A, 0x0062], NFKD: [0x0061, 0x1DFA, 0x0316, 0x1D17E, 0x059A, 0x0062] }, +{ source: [0x0061, 0x1D17E, 0x059A, 0x0316, 0x1DFA, 0x0062], NFC: [0x0061, 0x1DFA, 0x1D17E, 0x0316, 0x059A, 0x0062], NFD: [0x0061, 0x1DFA, 0x1D17E, 0x0316, 0x059A, 0x0062], NFKC: [0x0061, 0x1DFA, 0x1D17E, 0x0316, 0x059A, 0x0062], NFKD: [0x0061, 0x1DFA, 0x1D17E, 0x0316, 0x059A, 0x0062] }, +{ source: [0x0061, 0x059A, 0x0316, 0x1DFA, 0x1D17F, 0x0062], NFC: [0x0061, 0x1DFA, 0x0316, 0x1D17F, 0x059A, 0x0062], NFD: [0x0061, 0x1DFA, 0x0316, 0x1D17F, 0x059A, 0x0062], NFKC: [0x0061, 0x1DFA, 0x0316, 0x1D17F, 0x059A, 0x0062], NFKD: [0x0061, 0x1DFA, 0x0316, 0x1D17F, 0x059A, 0x0062] }, +{ source: [0x0061, 0x1D17F, 0x059A, 0x0316, 0x1DFA, 0x0062], NFC: [0x0061, 0x1DFA, 0x1D17F, 0x0316, 0x059A, 0x0062], NFD: [0x0061, 0x1DFA, 0x1D17F, 0x0316, 0x059A, 0x0062], NFKC: [0x0061, 0x1DFA, 0x1D17F, 0x0316, 0x059A, 0x0062], NFKD: [0x0061, 0x1DFA, 0x1D17F, 0x0316, 0x059A, 0x0062] }, +{ source: [0x0061, 0x059A, 0x0316, 0x1DFA, 0x1D180, 0x0062], NFC: [0x0061, 0x1DFA, 0x0316, 0x1D180, 0x059A, 0x0062], NFD: [0x0061, 0x1DFA, 0x0316, 0x1D180, 0x059A, 0x0062], NFKC: [0x0061, 0x1DFA, 0x0316, 0x1D180, 0x059A, 0x0062], NFKD: [0x0061, 0x1DFA, 0x0316, 0x1D180, 0x059A, 0x0062] }, +{ source: [0x0061, 0x1D180, 0x059A, 0x0316, 0x1DFA, 0x0062], NFC: [0x0061, 0x1DFA, 0x1D180, 0x0316, 0x059A, 0x0062], NFD: [0x0061, 0x1DFA, 0x1D180, 0x0316, 0x059A, 0x0062], NFKC: [0x0061, 0x1DFA, 0x1D180, 0x0316, 0x059A, 0x0062], NFKD: [0x0061, 0x1DFA, 0x1D180, 0x0316, 0x059A, 0x0062] }, +{ source: [0x0061, 0x059A, 0x0316, 0x1DFA, 0x1D181, 0x0062], NFC: [0x0061, 0x1DFA, 0x0316, 0x1D181, 0x059A, 0x0062], NFD: [0x0061, 0x1DFA, 0x0316, 0x1D181, 0x059A, 0x0062], NFKC: [0x0061, 0x1DFA, 0x0316, 0x1D181, 0x059A, 0x0062], NFKD: [0x0061, 0x1DFA, 0x0316, 0x1D181, 0x059A, 0x0062] }, +{ source: [0x0061, 0x1D181, 0x059A, 0x0316, 0x1DFA, 0x0062], NFC: [0x0061, 0x1DFA, 0x1D181, 0x0316, 0x059A, 0x0062], NFD: [0x0061, 0x1DFA, 0x1D181, 0x0316, 0x059A, 0x0062], NFKC: [0x0061, 0x1DFA, 0x1D181, 0x0316, 0x059A, 0x0062], NFKD: [0x0061, 0x1DFA, 0x1D181, 0x0316, 0x059A, 0x0062] }, +{ source: [0x0061, 0x059A, 0x0316, 0x1DFA, 0x1D182, 0x0062], NFC: [0x0061, 0x1DFA, 0x0316, 0x1D182, 0x059A, 0x0062], NFD: [0x0061, 0x1DFA, 0x0316, 0x1D182, 0x059A, 0x0062], NFKC: [0x0061, 0x1DFA, 0x0316, 0x1D182, 0x059A, 0x0062], NFKD: [0x0061, 0x1DFA, 0x0316, 0x1D182, 0x059A, 0x0062] }, +{ source: [0x0061, 0x1D182, 0x059A, 0x0316, 0x1DFA, 0x0062], NFC: [0x0061, 0x1DFA, 0x1D182, 0x0316, 0x059A, 0x0062], NFD: [0x0061, 0x1DFA, 0x1D182, 0x0316, 0x059A, 0x0062], NFKC: [0x0061, 0x1DFA, 0x1D182, 0x0316, 0x059A, 0x0062], NFKD: [0x0061, 0x1DFA, 0x1D182, 0x0316, 0x059A, 0x0062] }, +{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x1D185, 0x0062], NFC: [0x00E0, 0x05AE, 0x1D185, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x1D185, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x1D185, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x1D185, 0x0315, 0x0062] }, +{ source: [0x0061, 0x1D185, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x1D185, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x1D185, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x1D185, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x1D185, 0x0300, 0x0315, 0x0062] }, +{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x1D186, 0x0062], NFC: [0x00E0, 0x05AE, 0x1D186, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x1D186, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x1D186, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x1D186, 0x0315, 0x0062] }, +{ source: [0x0061, 0x1D186, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x1D186, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x1D186, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x1D186, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x1D186, 0x0300, 0x0315, 0x0062] }, +{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x1D187, 0x0062], NFC: [0x00E0, 0x05AE, 0x1D187, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x1D187, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x1D187, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x1D187, 0x0315, 0x0062] }, +{ source: [0x0061, 0x1D187, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x1D187, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x1D187, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x1D187, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x1D187, 0x0300, 0x0315, 0x0062] }, +{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x1D188, 0x0062], NFC: [0x00E0, 0x05AE, 0x1D188, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x1D188, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x1D188, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x1D188, 0x0315, 0x0062] }, +{ source: [0x0061, 0x1D188, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x1D188, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x1D188, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x1D188, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x1D188, 0x0300, 0x0315, 0x0062] }, +{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x1D189, 0x0062], NFC: [0x00E0, 0x05AE, 0x1D189, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x1D189, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x1D189, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x1D189, 0x0315, 0x0062] }, +{ source: [0x0061, 0x1D189, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x1D189, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x1D189, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x1D189, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x1D189, 0x0300, 0x0315, 0x0062] }, +{ source: [0x0061, 0x059A, 0x0316, 0x1DFA, 0x1D18A, 0x0062], NFC: [0x0061, 0x1DFA, 0x0316, 0x1D18A, 0x059A, 0x0062], NFD: [0x0061, 0x1DFA, 0x0316, 0x1D18A, 0x059A, 0x0062], NFKC: [0x0061, 0x1DFA, 0x0316, 0x1D18A, 0x059A, 0x0062], NFKD: [0x0061, 0x1DFA, 0x0316, 0x1D18A, 0x059A, 0x0062] }, +{ source: [0x0061, 0x1D18A, 0x059A, 0x0316, 0x1DFA, 0x0062], NFC: [0x0061, 0x1DFA, 0x1D18A, 0x0316, 0x059A, 0x0062], NFD: [0x0061, 0x1DFA, 0x1D18A, 0x0316, 0x059A, 0x0062], NFKC: [0x0061, 0x1DFA, 0x1D18A, 0x0316, 0x059A, 0x0062], NFKD: [0x0061, 0x1DFA, 0x1D18A, 0x0316, 0x059A, 0x0062] }, +{ source: [0x0061, 0x059A, 0x0316, 0x1DFA, 0x1D18B, 0x0062], NFC: [0x0061, 0x1DFA, 0x0316, 0x1D18B, 0x059A, 0x0062], NFD: [0x0061, 0x1DFA, 0x0316, 0x1D18B, 0x059A, 0x0062], NFKC: [0x0061, 0x1DFA, 0x0316, 0x1D18B, 0x059A, 0x0062], NFKD: [0x0061, 0x1DFA, 0x0316, 0x1D18B, 0x059A, 0x0062] }, +{ source: [0x0061, 0x1D18B, 0x059A, 0x0316, 0x1DFA, 0x0062], NFC: [0x0061, 0x1DFA, 0x1D18B, 0x0316, 0x059A, 0x0062], NFD: [0x0061, 0x1DFA, 0x1D18B, 0x0316, 0x059A, 0x0062], NFKC: [0x0061, 0x1DFA, 0x1D18B, 0x0316, 0x059A, 0x0062], NFKD: [0x0061, 0x1DFA, 0x1D18B, 0x0316, 0x059A, 0x0062] }, +{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x1D1AA, 0x0062], NFC: [0x00E0, 0x05AE, 0x1D1AA, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x1D1AA, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x1D1AA, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x1D1AA, 0x0315, 0x0062] }, +{ source: [0x0061, 0x1D1AA, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x1D1AA, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x1D1AA, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x1D1AA, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x1D1AA, 0x0300, 0x0315, 0x0062] }, +{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x1D1AB, 0x0062], NFC: [0x00E0, 0x05AE, 0x1D1AB, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x1D1AB, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x1D1AB, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x1D1AB, 0x0315, 0x0062] }, +{ source: [0x0061, 0x1D1AB, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x1D1AB, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x1D1AB, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x1D1AB, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x1D1AB, 0x0300, 0x0315, 0x0062] }, +{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x1D1AC, 0x0062], NFC: [0x00E0, 0x05AE, 0x1D1AC, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x1D1AC, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x1D1AC, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x1D1AC, 0x0315, 0x0062] }, +{ source: [0x0061, 0x1D1AC, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x1D1AC, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x1D1AC, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x1D1AC, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x1D1AC, 0x0300, 0x0315, 0x0062] }, +{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x1D1AD, 0x0062], NFC: [0x00E0, 0x05AE, 0x1D1AD, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x1D1AD, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x1D1AD, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x1D1AD, 0x0315, 0x0062] }, +{ source: [0x0061, 0x1D1AD, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x1D1AD, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x1D1AD, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x1D1AD, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x1D1AD, 0x0300, 0x0315, 0x0062] }, +{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x1D242, 0x0062], NFC: [0x00E0, 0x05AE, 0x1D242, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x1D242, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x1D242, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x1D242, 0x0315, 0x0062] }, +{ source: [0x0061, 0x1D242, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x1D242, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x1D242, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x1D242, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x1D242, 0x0300, 0x0315, 0x0062] }, +{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x1D243, 0x0062], NFC: [0x00E0, 0x05AE, 0x1D243, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x1D243, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x1D243, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x1D243, 0x0315, 0x0062] }, +{ source: [0x0061, 0x1D243, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x1D243, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x1D243, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x1D243, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x1D243, 0x0300, 0x0315, 0x0062] }, +{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x1D244, 0x0062], NFC: [0x00E0, 0x05AE, 0x1D244, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x1D244, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x1D244, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x1D244, 0x0315, 0x0062] }, +{ source: [0x0061, 0x1D244, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x1D244, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x1D244, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x1D244, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x1D244, 0x0300, 0x0315, 0x0062] }, +{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x1E000, 0x0062], NFC: [0x00E0, 0x05AE, 0x1E000, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x1E000, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x1E000, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x1E000, 0x0315, 0x0062] }, +{ source: [0x0061, 0x1E000, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x1E000, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x1E000, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x1E000, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x1E000, 0x0300, 0x0315, 0x0062] }, +{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x1E001, 0x0062], NFC: [0x00E0, 0x05AE, 0x1E001, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x1E001, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x1E001, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x1E001, 0x0315, 0x0062] }, +{ source: [0x0061, 0x1E001, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x1E001, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x1E001, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x1E001, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x1E001, 0x0300, 0x0315, 0x0062] }, +{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x1E002, 0x0062], NFC: [0x00E0, 0x05AE, 0x1E002, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x1E002, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x1E002, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x1E002, 0x0315, 0x0062] }, +{ source: [0x0061, 0x1E002, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x1E002, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x1E002, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x1E002, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x1E002, 0x0300, 0x0315, 0x0062] }, +{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x1E003, 0x0062], NFC: [0x00E0, 0x05AE, 0x1E003, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x1E003, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x1E003, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x1E003, 0x0315, 0x0062] }, +{ source: [0x0061, 0x1E003, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x1E003, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x1E003, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x1E003, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x1E003, 0x0300, 0x0315, 0x0062] }, +{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x1E004, 0x0062], NFC: [0x00E0, 0x05AE, 0x1E004, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x1E004, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x1E004, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x1E004, 0x0315, 0x0062] }, +{ source: [0x0061, 0x1E004, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x1E004, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x1E004, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x1E004, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x1E004, 0x0300, 0x0315, 0x0062] }, +{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x1E005, 0x0062], NFC: [0x00E0, 0x05AE, 0x1E005, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x1E005, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x1E005, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x1E005, 0x0315, 0x0062] }, +{ source: [0x0061, 0x1E005, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x1E005, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x1E005, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x1E005, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x1E005, 0x0300, 0x0315, 0x0062] }, +{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x1E006, 0x0062], NFC: [0x00E0, 0x05AE, 0x1E006, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x1E006, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x1E006, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x1E006, 0x0315, 0x0062] }, +{ source: [0x0061, 0x1E006, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x1E006, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x1E006, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x1E006, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x1E006, 0x0300, 0x0315, 0x0062] }, +{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x1E008, 0x0062], NFC: [0x00E0, 0x05AE, 0x1E008, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x1E008, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x1E008, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x1E008, 0x0315, 0x0062] }, +{ source: [0x0061, 0x1E008, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x1E008, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x1E008, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x1E008, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x1E008, 0x0300, 0x0315, 0x0062] }, +{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x1E009, 0x0062], NFC: [0x00E0, 0x05AE, 0x1E009, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x1E009, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x1E009, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x1E009, 0x0315, 0x0062] }, +{ source: [0x0061, 0x1E009, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x1E009, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x1E009, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x1E009, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x1E009, 0x0300, 0x0315, 0x0062] }, +{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x1E00A, 0x0062], NFC: [0x00E0, 0x05AE, 0x1E00A, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x1E00A, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x1E00A, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x1E00A, 0x0315, 0x0062] }, +{ source: [0x0061, 0x1E00A, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x1E00A, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x1E00A, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x1E00A, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x1E00A, 0x0300, 0x0315, 0x0062] }, +{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x1E00B, 0x0062], NFC: [0x00E0, 0x05AE, 0x1E00B, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x1E00B, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x1E00B, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x1E00B, 0x0315, 0x0062] }, +{ source: [0x0061, 0x1E00B, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x1E00B, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x1E00B, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x1E00B, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x1E00B, 0x0300, 0x0315, 0x0062] }, +{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x1E00C, 0x0062], NFC: [0x00E0, 0x05AE, 0x1E00C, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x1E00C, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x1E00C, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x1E00C, 0x0315, 0x0062] }, +{ source: [0x0061, 0x1E00C, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x1E00C, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x1E00C, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x1E00C, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x1E00C, 0x0300, 0x0315, 0x0062] }, +{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x1E00D, 0x0062], NFC: [0x00E0, 0x05AE, 0x1E00D, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x1E00D, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x1E00D, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x1E00D, 0x0315, 0x0062] }, +{ source: [0x0061, 0x1E00D, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x1E00D, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x1E00D, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x1E00D, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x1E00D, 0x0300, 0x0315, 0x0062] }, +{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x1E00E, 0x0062], NFC: [0x00E0, 0x05AE, 0x1E00E, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x1E00E, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x1E00E, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x1E00E, 0x0315, 0x0062] }, +{ source: [0x0061, 0x1E00E, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x1E00E, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x1E00E, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x1E00E, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x1E00E, 0x0300, 0x0315, 0x0062] }, +{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x1E00F, 0x0062], NFC: [0x00E0, 0x05AE, 0x1E00F, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x1E00F, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x1E00F, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x1E00F, 0x0315, 0x0062] }, +{ source: [0x0061, 0x1E00F, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x1E00F, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x1E00F, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x1E00F, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x1E00F, 0x0300, 0x0315, 0x0062] }, +{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x1E010, 0x0062], NFC: [0x00E0, 0x05AE, 0x1E010, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x1E010, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x1E010, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x1E010, 0x0315, 0x0062] }, +{ source: [0x0061, 0x1E010, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x1E010, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x1E010, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x1E010, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x1E010, 0x0300, 0x0315, 0x0062] }, +{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x1E011, 0x0062], NFC: [0x00E0, 0x05AE, 0x1E011, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x1E011, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x1E011, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x1E011, 0x0315, 0x0062] }, +{ source: [0x0061, 0x1E011, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x1E011, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x1E011, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x1E011, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x1E011, 0x0300, 0x0315, 0x0062] }, +{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x1E012, 0x0062], NFC: [0x00E0, 0x05AE, 0x1E012, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x1E012, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x1E012, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x1E012, 0x0315, 0x0062] }, +{ source: [0x0061, 0x1E012, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x1E012, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x1E012, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x1E012, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x1E012, 0x0300, 0x0315, 0x0062] }, +{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x1E013, 0x0062], NFC: [0x00E0, 0x05AE, 0x1E013, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x1E013, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x1E013, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x1E013, 0x0315, 0x0062] }, +{ source: [0x0061, 0x1E013, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x1E013, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x1E013, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x1E013, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x1E013, 0x0300, 0x0315, 0x0062] }, +{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x1E014, 0x0062], NFC: [0x00E0, 0x05AE, 0x1E014, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x1E014, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x1E014, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x1E014, 0x0315, 0x0062] }, +{ source: [0x0061, 0x1E014, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x1E014, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x1E014, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x1E014, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x1E014, 0x0300, 0x0315, 0x0062] }, +{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x1E015, 0x0062], NFC: [0x00E0, 0x05AE, 0x1E015, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x1E015, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x1E015, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x1E015, 0x0315, 0x0062] }, +{ source: [0x0061, 0x1E015, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x1E015, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x1E015, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x1E015, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x1E015, 0x0300, 0x0315, 0x0062] }, +{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x1E016, 0x0062], NFC: [0x00E0, 0x05AE, 0x1E016, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x1E016, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x1E016, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x1E016, 0x0315, 0x0062] }, +{ source: [0x0061, 0x1E016, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x1E016, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x1E016, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x1E016, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x1E016, 0x0300, 0x0315, 0x0062] }, +{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x1E017, 0x0062], NFC: [0x00E0, 0x05AE, 0x1E017, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x1E017, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x1E017, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x1E017, 0x0315, 0x0062] }, +{ source: [0x0061, 0x1E017, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x1E017, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x1E017, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x1E017, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x1E017, 0x0300, 0x0315, 0x0062] }, +{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x1E018, 0x0062], NFC: [0x00E0, 0x05AE, 0x1E018, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x1E018, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x1E018, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x1E018, 0x0315, 0x0062] }, +{ source: [0x0061, 0x1E018, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x1E018, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x1E018, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x1E018, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x1E018, 0x0300, 0x0315, 0x0062] }, +{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x1E01B, 0x0062], NFC: [0x00E0, 0x05AE, 0x1E01B, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x1E01B, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x1E01B, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x1E01B, 0x0315, 0x0062] }, +{ source: [0x0061, 0x1E01B, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x1E01B, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x1E01B, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x1E01B, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x1E01B, 0x0300, 0x0315, 0x0062] }, +{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x1E01C, 0x0062], NFC: [0x00E0, 0x05AE, 0x1E01C, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x1E01C, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x1E01C, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x1E01C, 0x0315, 0x0062] }, +{ source: [0x0061, 0x1E01C, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x1E01C, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x1E01C, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x1E01C, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x1E01C, 0x0300, 0x0315, 0x0062] }, +{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x1E01D, 0x0062], NFC: [0x00E0, 0x05AE, 0x1E01D, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x1E01D, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x1E01D, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x1E01D, 0x0315, 0x0062] }, +{ source: [0x0061, 0x1E01D, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x1E01D, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x1E01D, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x1E01D, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x1E01D, 0x0300, 0x0315, 0x0062] }, +{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x1E01E, 0x0062], NFC: [0x00E0, 0x05AE, 0x1E01E, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x1E01E, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x1E01E, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x1E01E, 0x0315, 0x0062] }, +{ source: [0x0061, 0x1E01E, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x1E01E, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x1E01E, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x1E01E, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x1E01E, 0x0300, 0x0315, 0x0062] }, +{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x1E01F, 0x0062], NFC: [0x00E0, 0x05AE, 0x1E01F, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x1E01F, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x1E01F, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x1E01F, 0x0315, 0x0062] }, +{ source: [0x0061, 0x1E01F, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x1E01F, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x1E01F, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x1E01F, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x1E01F, 0x0300, 0x0315, 0x0062] }, +{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x1E020, 0x0062], NFC: [0x00E0, 0x05AE, 0x1E020, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x1E020, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x1E020, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x1E020, 0x0315, 0x0062] }, +{ source: [0x0061, 0x1E020, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x1E020, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x1E020, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x1E020, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x1E020, 0x0300, 0x0315, 0x0062] }, +{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x1E021, 0x0062], NFC: [0x00E0, 0x05AE, 0x1E021, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x1E021, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x1E021, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x1E021, 0x0315, 0x0062] }, +{ source: [0x0061, 0x1E021, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x1E021, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x1E021, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x1E021, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x1E021, 0x0300, 0x0315, 0x0062] }, +{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x1E023, 0x0062], NFC: [0x00E0, 0x05AE, 0x1E023, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x1E023, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x1E023, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x1E023, 0x0315, 0x0062] }, +{ source: [0x0061, 0x1E023, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x1E023, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x1E023, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x1E023, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x1E023, 0x0300, 0x0315, 0x0062] }, +{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x1E024, 0x0062], NFC: [0x00E0, 0x05AE, 0x1E024, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x1E024, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x1E024, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x1E024, 0x0315, 0x0062] }, +{ source: [0x0061, 0x1E024, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x1E024, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x1E024, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x1E024, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x1E024, 0x0300, 0x0315, 0x0062] }, +{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x1E026, 0x0062], NFC: [0x00E0, 0x05AE, 0x1E026, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x1E026, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x1E026, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x1E026, 0x0315, 0x0062] }, +{ source: [0x0061, 0x1E026, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x1E026, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x1E026, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x1E026, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x1E026, 0x0300, 0x0315, 0x0062] }, +{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x1E027, 0x0062], NFC: [0x00E0, 0x05AE, 0x1E027, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x1E027, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x1E027, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x1E027, 0x0315, 0x0062] }, +{ source: [0x0061, 0x1E027, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x1E027, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x1E027, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x1E027, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x1E027, 0x0300, 0x0315, 0x0062] }, +{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x1E028, 0x0062], NFC: [0x00E0, 0x05AE, 0x1E028, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x1E028, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x1E028, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x1E028, 0x0315, 0x0062] }, +{ source: [0x0061, 0x1E028, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x1E028, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x1E028, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x1E028, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x1E028, 0x0300, 0x0315, 0x0062] }, +{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x1E029, 0x0062], NFC: [0x00E0, 0x05AE, 0x1E029, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x1E029, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x1E029, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x1E029, 0x0315, 0x0062] }, +{ source: [0x0061, 0x1E029, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x1E029, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x1E029, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x1E029, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x1E029, 0x0300, 0x0315, 0x0062] }, +{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x1E02A, 0x0062], NFC: [0x00E0, 0x05AE, 0x1E02A, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x1E02A, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x1E02A, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x1E02A, 0x0315, 0x0062] }, +{ source: [0x0061, 0x1E02A, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x1E02A, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x1E02A, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x1E02A, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x1E02A, 0x0300, 0x0315, 0x0062] }, +{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x1E08F, 0x0062], NFC: [0x00E0, 0x05AE, 0x1E08F, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x1E08F, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x1E08F, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x1E08F, 0x0315, 0x0062] }, +{ source: [0x0061, 0x1E08F, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x1E08F, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x1E08F, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x1E08F, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x1E08F, 0x0300, 0x0315, 0x0062] }, +{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x1E130, 0x0062], NFC: [0x00E0, 0x05AE, 0x1E130, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x1E130, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x1E130, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x1E130, 0x0315, 0x0062] }, +{ source: [0x0061, 0x1E130, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x1E130, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x1E130, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x1E130, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x1E130, 0x0300, 0x0315, 0x0062] }, +{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x1E131, 0x0062], NFC: [0x00E0, 0x05AE, 0x1E131, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x1E131, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x1E131, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x1E131, 0x0315, 0x0062] }, +{ source: [0x0061, 0x1E131, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x1E131, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x1E131, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x1E131, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x1E131, 0x0300, 0x0315, 0x0062] }, +{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x1E132, 0x0062], NFC: [0x00E0, 0x05AE, 0x1E132, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x1E132, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x1E132, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x1E132, 0x0315, 0x0062] }, +{ source: [0x0061, 0x1E132, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x1E132, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x1E132, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x1E132, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x1E132, 0x0300, 0x0315, 0x0062] }, +{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x1E133, 0x0062], NFC: [0x00E0, 0x05AE, 0x1E133, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x1E133, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x1E133, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x1E133, 0x0315, 0x0062] }, +{ source: [0x0061, 0x1E133, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x1E133, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x1E133, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x1E133, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x1E133, 0x0300, 0x0315, 0x0062] }, +{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x1E134, 0x0062], NFC: [0x00E0, 0x05AE, 0x1E134, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x1E134, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x1E134, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x1E134, 0x0315, 0x0062] }, +{ source: [0x0061, 0x1E134, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x1E134, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x1E134, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x1E134, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x1E134, 0x0300, 0x0315, 0x0062] }, +{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x1E135, 0x0062], NFC: [0x00E0, 0x05AE, 0x1E135, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x1E135, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x1E135, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x1E135, 0x0315, 0x0062] }, +{ source: [0x0061, 0x1E135, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x1E135, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x1E135, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x1E135, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x1E135, 0x0300, 0x0315, 0x0062] }, +{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x1E136, 0x0062], NFC: [0x00E0, 0x05AE, 0x1E136, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x1E136, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x1E136, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x1E136, 0x0315, 0x0062] }, +{ source: [0x0061, 0x1E136, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x1E136, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x1E136, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x1E136, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x1E136, 0x0300, 0x0315, 0x0062] }, +{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x1E2AE, 0x0062], NFC: [0x00E0, 0x05AE, 0x1E2AE, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x1E2AE, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x1E2AE, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x1E2AE, 0x0315, 0x0062] }, +{ source: [0x0061, 0x1E2AE, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x1E2AE, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x1E2AE, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x1E2AE, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x1E2AE, 0x0300, 0x0315, 0x0062] }, +{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x1E2EC, 0x0062], NFC: [0x00E0, 0x05AE, 0x1E2EC, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x1E2EC, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x1E2EC, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x1E2EC, 0x0315, 0x0062] }, +{ source: [0x0061, 0x1E2EC, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x1E2EC, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x1E2EC, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x1E2EC, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x1E2EC, 0x0300, 0x0315, 0x0062] }, +{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x1E2ED, 0x0062], NFC: [0x00E0, 0x05AE, 0x1E2ED, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x1E2ED, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x1E2ED, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x1E2ED, 0x0315, 0x0062] }, +{ source: [0x0061, 0x1E2ED, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x1E2ED, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x1E2ED, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x1E2ED, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x1E2ED, 0x0300, 0x0315, 0x0062] }, +{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x1E2EE, 0x0062], NFC: [0x00E0, 0x05AE, 0x1E2EE, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x1E2EE, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x1E2EE, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x1E2EE, 0x0315, 0x0062] }, +{ source: [0x0061, 0x1E2EE, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x1E2EE, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x1E2EE, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x1E2EE, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x1E2EE, 0x0300, 0x0315, 0x0062] }, +{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x1E2EF, 0x0062], NFC: [0x00E0, 0x05AE, 0x1E2EF, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x1E2EF, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x1E2EF, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x1E2EF, 0x0315, 0x0062] }, +{ source: [0x0061, 0x1E2EF, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x1E2EF, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x1E2EF, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x1E2EF, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x1E2EF, 0x0300, 0x0315, 0x0062] }, +{ source: [0x0061, 0x035C, 0x0315, 0x0300, 0x1E4EC, 0x0062], NFC: [0x00E0, 0x0315, 0x1E4EC, 0x035C, 0x0062], NFD: [0x0061, 0x0300, 0x0315, 0x1E4EC, 0x035C, 0x0062], NFKC: [0x00E0, 0x0315, 0x1E4EC, 0x035C, 0x0062], NFKD: [0x0061, 0x0300, 0x0315, 0x1E4EC, 0x035C, 0x0062] }, +{ source: [0x0061, 0x1E4EC, 0x035C, 0x0315, 0x0300, 0x0062], NFC: [0x00E0, 0x1E4EC, 0x0315, 0x035C, 0x0062], NFD: [0x0061, 0x0300, 0x1E4EC, 0x0315, 0x035C, 0x0062], NFKC: [0x00E0, 0x1E4EC, 0x0315, 0x035C, 0x0062], NFKD: [0x0061, 0x0300, 0x1E4EC, 0x0315, 0x035C, 0x0062] }, +{ source: [0x0061, 0x035C, 0x0315, 0x0300, 0x1E4ED, 0x0062], NFC: [0x00E0, 0x0315, 0x1E4ED, 0x035C, 0x0062], NFD: [0x0061, 0x0300, 0x0315, 0x1E4ED, 0x035C, 0x0062], NFKC: [0x00E0, 0x0315, 0x1E4ED, 0x035C, 0x0062], NFKD: [0x0061, 0x0300, 0x0315, 0x1E4ED, 0x035C, 0x0062] }, +{ source: [0x0061, 0x1E4ED, 0x035C, 0x0315, 0x0300, 0x0062], NFC: [0x00E0, 0x1E4ED, 0x0315, 0x035C, 0x0062], NFD: [0x0061, 0x0300, 0x1E4ED, 0x0315, 0x035C, 0x0062], NFKC: [0x00E0, 0x1E4ED, 0x0315, 0x035C, 0x0062], NFKD: [0x0061, 0x0300, 0x1E4ED, 0x0315, 0x035C, 0x0062] }, +{ source: [0x0061, 0x059A, 0x0316, 0x1DFA, 0x1E4EE, 0x0062], NFC: [0x0061, 0x1DFA, 0x0316, 0x1E4EE, 0x059A, 0x0062], NFD: [0x0061, 0x1DFA, 0x0316, 0x1E4EE, 0x059A, 0x0062], NFKC: [0x0061, 0x1DFA, 0x0316, 0x1E4EE, 0x059A, 0x0062], NFKD: [0x0061, 0x1DFA, 0x0316, 0x1E4EE, 0x059A, 0x0062] }, +{ source: [0x0061, 0x1E4EE, 0x059A, 0x0316, 0x1DFA, 0x0062], NFC: [0x0061, 0x1DFA, 0x1E4EE, 0x0316, 0x059A, 0x0062], NFD: [0x0061, 0x1DFA, 0x1E4EE, 0x0316, 0x059A, 0x0062], NFKC: [0x0061, 0x1DFA, 0x1E4EE, 0x0316, 0x059A, 0x0062], NFKD: [0x0061, 0x1DFA, 0x1E4EE, 0x0316, 0x059A, 0x0062] }, +{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x1E4EF, 0x0062], NFC: [0x00E0, 0x05AE, 0x1E4EF, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x1E4EF, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x1E4EF, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x1E4EF, 0x0315, 0x0062] }, +{ source: [0x0061, 0x1E4EF, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x1E4EF, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x1E4EF, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x1E4EF, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x1E4EF, 0x0300, 0x0315, 0x0062] }, +{ source: [0x0061, 0x059A, 0x0316, 0x1DFA, 0x1E8D0, 0x0062], NFC: [0x0061, 0x1DFA, 0x0316, 0x1E8D0, 0x059A, 0x0062], NFD: [0x0061, 0x1DFA, 0x0316, 0x1E8D0, 0x059A, 0x0062], NFKC: [0x0061, 0x1DFA, 0x0316, 0x1E8D0, 0x059A, 0x0062], NFKD: [0x0061, 0x1DFA, 0x0316, 0x1E8D0, 0x059A, 0x0062] }, +{ source: [0x0061, 0x1E8D0, 0x059A, 0x0316, 0x1DFA, 0x0062], NFC: [0x0061, 0x1DFA, 0x1E8D0, 0x0316, 0x059A, 0x0062], NFD: [0x0061, 0x1DFA, 0x1E8D0, 0x0316, 0x059A, 0x0062], NFKC: [0x0061, 0x1DFA, 0x1E8D0, 0x0316, 0x059A, 0x0062], NFKD: [0x0061, 0x1DFA, 0x1E8D0, 0x0316, 0x059A, 0x0062] }, +{ source: [0x0061, 0x059A, 0x0316, 0x1DFA, 0x1E8D1, 0x0062], NFC: [0x0061, 0x1DFA, 0x0316, 0x1E8D1, 0x059A, 0x0062], NFD: [0x0061, 0x1DFA, 0x0316, 0x1E8D1, 0x059A, 0x0062], NFKC: [0x0061, 0x1DFA, 0x0316, 0x1E8D1, 0x059A, 0x0062], NFKD: [0x0061, 0x1DFA, 0x0316, 0x1E8D1, 0x059A, 0x0062] }, +{ source: [0x0061, 0x1E8D1, 0x059A, 0x0316, 0x1DFA, 0x0062], NFC: [0x0061, 0x1DFA, 0x1E8D1, 0x0316, 0x059A, 0x0062], NFD: [0x0061, 0x1DFA, 0x1E8D1, 0x0316, 0x059A, 0x0062], NFKC: [0x0061, 0x1DFA, 0x1E8D1, 0x0316, 0x059A, 0x0062], NFKD: [0x0061, 0x1DFA, 0x1E8D1, 0x0316, 0x059A, 0x0062] }, +{ source: [0x0061, 0x059A, 0x0316, 0x1DFA, 0x1E8D2, 0x0062], NFC: [0x0061, 0x1DFA, 0x0316, 0x1E8D2, 0x059A, 0x0062], NFD: [0x0061, 0x1DFA, 0x0316, 0x1E8D2, 0x059A, 0x0062], NFKC: [0x0061, 0x1DFA, 0x0316, 0x1E8D2, 0x059A, 0x0062], NFKD: [0x0061, 0x1DFA, 0x0316, 0x1E8D2, 0x059A, 0x0062] }, +{ source: [0x0061, 0x1E8D2, 0x059A, 0x0316, 0x1DFA, 0x0062], NFC: [0x0061, 0x1DFA, 0x1E8D2, 0x0316, 0x059A, 0x0062], NFD: [0x0061, 0x1DFA, 0x1E8D2, 0x0316, 0x059A, 0x0062], NFKC: [0x0061, 0x1DFA, 0x1E8D2, 0x0316, 0x059A, 0x0062], NFKD: [0x0061, 0x1DFA, 0x1E8D2, 0x0316, 0x059A, 0x0062] }, +{ source: [0x0061, 0x059A, 0x0316, 0x1DFA, 0x1E8D3, 0x0062], NFC: [0x0061, 0x1DFA, 0x0316, 0x1E8D3, 0x059A, 0x0062], NFD: [0x0061, 0x1DFA, 0x0316, 0x1E8D3, 0x059A, 0x0062], NFKC: [0x0061, 0x1DFA, 0x0316, 0x1E8D3, 0x059A, 0x0062], NFKD: [0x0061, 0x1DFA, 0x0316, 0x1E8D3, 0x059A, 0x0062] }, +{ source: [0x0061, 0x1E8D3, 0x059A, 0x0316, 0x1DFA, 0x0062], NFC: [0x0061, 0x1DFA, 0x1E8D3, 0x0316, 0x059A, 0x0062], NFD: [0x0061, 0x1DFA, 0x1E8D3, 0x0316, 0x059A, 0x0062], NFKC: [0x0061, 0x1DFA, 0x1E8D3, 0x0316, 0x059A, 0x0062], NFKD: [0x0061, 0x1DFA, 0x1E8D3, 0x0316, 0x059A, 0x0062] }, +{ source: [0x0061, 0x059A, 0x0316, 0x1DFA, 0x1E8D4, 0x0062], NFC: [0x0061, 0x1DFA, 0x0316, 0x1E8D4, 0x059A, 0x0062], NFD: [0x0061, 0x1DFA, 0x0316, 0x1E8D4, 0x059A, 0x0062], NFKC: [0x0061, 0x1DFA, 0x0316, 0x1E8D4, 0x059A, 0x0062], NFKD: [0x0061, 0x1DFA, 0x0316, 0x1E8D4, 0x059A, 0x0062] }, +{ source: [0x0061, 0x1E8D4, 0x059A, 0x0316, 0x1DFA, 0x0062], NFC: [0x0061, 0x1DFA, 0x1E8D4, 0x0316, 0x059A, 0x0062], NFD: [0x0061, 0x1DFA, 0x1E8D4, 0x0316, 0x059A, 0x0062], NFKC: [0x0061, 0x1DFA, 0x1E8D4, 0x0316, 0x059A, 0x0062], NFKD: [0x0061, 0x1DFA, 0x1E8D4, 0x0316, 0x059A, 0x0062] }, +{ source: [0x0061, 0x059A, 0x0316, 0x1DFA, 0x1E8D5, 0x0062], NFC: [0x0061, 0x1DFA, 0x0316, 0x1E8D5, 0x059A, 0x0062], NFD: [0x0061, 0x1DFA, 0x0316, 0x1E8D5, 0x059A, 0x0062], NFKC: [0x0061, 0x1DFA, 0x0316, 0x1E8D5, 0x059A, 0x0062], NFKD: [0x0061, 0x1DFA, 0x0316, 0x1E8D5, 0x059A, 0x0062] }, +{ source: [0x0061, 0x1E8D5, 0x059A, 0x0316, 0x1DFA, 0x0062], NFC: [0x0061, 0x1DFA, 0x1E8D5, 0x0316, 0x059A, 0x0062], NFD: [0x0061, 0x1DFA, 0x1E8D5, 0x0316, 0x059A, 0x0062], NFKC: [0x0061, 0x1DFA, 0x1E8D5, 0x0316, 0x059A, 0x0062], NFKD: [0x0061, 0x1DFA, 0x1E8D5, 0x0316, 0x059A, 0x0062] }, +{ source: [0x0061, 0x059A, 0x0316, 0x1DFA, 0x1E8D6, 0x0062], NFC: [0x0061, 0x1DFA, 0x0316, 0x1E8D6, 0x059A, 0x0062], NFD: [0x0061, 0x1DFA, 0x0316, 0x1E8D6, 0x059A, 0x0062], NFKC: [0x0061, 0x1DFA, 0x0316, 0x1E8D6, 0x059A, 0x0062], NFKD: [0x0061, 0x1DFA, 0x0316, 0x1E8D6, 0x059A, 0x0062] }, +{ source: [0x0061, 0x1E8D6, 0x059A, 0x0316, 0x1DFA, 0x0062], NFC: [0x0061, 0x1DFA, 0x1E8D6, 0x0316, 0x059A, 0x0062], NFD: [0x0061, 0x1DFA, 0x1E8D6, 0x0316, 0x059A, 0x0062], NFKC: [0x0061, 0x1DFA, 0x1E8D6, 0x0316, 0x059A, 0x0062], NFKD: [0x0061, 0x1DFA, 0x1E8D6, 0x0316, 0x059A, 0x0062] }, +{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x1E944, 0x0062], NFC: [0x00E0, 0x05AE, 0x1E944, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x1E944, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x1E944, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x1E944, 0x0315, 0x0062] }, +{ source: [0x0061, 0x1E944, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x1E944, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x1E944, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x1E944, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x1E944, 0x0300, 0x0315, 0x0062] }, +{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x1E945, 0x0062], NFC: [0x00E0, 0x05AE, 0x1E945, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x1E945, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x1E945, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x1E945, 0x0315, 0x0062] }, +{ source: [0x0061, 0x1E945, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x1E945, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x1E945, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x1E945, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x1E945, 0x0300, 0x0315, 0x0062] }, +{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x1E946, 0x0062], NFC: [0x00E0, 0x05AE, 0x1E946, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x1E946, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x1E946, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x1E946, 0x0315, 0x0062] }, +{ source: [0x0061, 0x1E946, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x1E946, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x1E946, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x1E946, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x1E946, 0x0300, 0x0315, 0x0062] }, +{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x1E947, 0x0062], NFC: [0x00E0, 0x05AE, 0x1E947, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x1E947, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x1E947, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x1E947, 0x0315, 0x0062] }, +{ source: [0x0061, 0x1E947, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x1E947, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x1E947, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x1E947, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x1E947, 0x0300, 0x0315, 0x0062] }, +{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x1E948, 0x0062], NFC: [0x00E0, 0x05AE, 0x1E948, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x1E948, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x1E948, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x1E948, 0x0315, 0x0062] }, +{ source: [0x0061, 0x1E948, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x1E948, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x1E948, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x1E948, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x1E948, 0x0300, 0x0315, 0x0062] }, +{ source: [0x0061, 0x0315, 0x0300, 0x05AE, 0x1E949, 0x0062], NFC: [0x00E0, 0x05AE, 0x1E949, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x0300, 0x1E949, 0x0315, 0x0062], NFKC: [0x00E0, 0x05AE, 0x1E949, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x0300, 0x1E949, 0x0315, 0x0062] }, +{ source: [0x0061, 0x1E949, 0x0315, 0x0300, 0x05AE, 0x0062], NFC: [0x0061, 0x05AE, 0x1E949, 0x0300, 0x0315, 0x0062], NFD: [0x0061, 0x05AE, 0x1E949, 0x0300, 0x0315, 0x0062], NFKC: [0x0061, 0x05AE, 0x1E949, 0x0300, 0x0315, 0x0062], NFKD: [0x0061, 0x05AE, 0x1E949, 0x0300, 0x0315, 0x0062] }, +{ source: [0x0061, 0x3099, 0x093C, 0x16FF0, 0x1E94A, 0x0062], NFC: [0x0061, 0x16FF0, 0x093C, 0x1E94A, 0x3099, 0x0062], NFD: [0x0061, 0x16FF0, 0x093C, 0x1E94A, 0x3099, 0x0062], NFKC: [0x0061, 0x16FF0, 0x093C, 0x1E94A, 0x3099, 0x0062], NFKD: [0x0061, 0x16FF0, 0x093C, 0x1E94A, 0x3099, 0x0062] }, +{ source: [0x0061, 0x1E94A, 0x3099, 0x093C, 0x16FF0, 0x0062], NFC: [0x0061, 0x16FF0, 0x1E94A, 0x093C, 0x3099, 0x0062], NFD: [0x0061, 0x16FF0, 0x1E94A, 0x093C, 0x3099, 0x0062], NFKC: [0x0061, 0x16FF0, 0x1E94A, 0x093C, 0x3099, 0x0062], NFKD: [0x0061, 0x16FF0, 0x1E94A, 0x093C, 0x3099, 0x0062] } +]; +/* Part3 # PRI #29 Test */ +var tests_part3 = [ +{ source: [0x09C7, 0x0334, 0x09BE], NFC: [0x09C7, 0x0334, 0x09BE], NFD: [0x09C7, 0x0334, 0x09BE], NFKC: [0x09C7, 0x0334, 0x09BE], NFKD: [0x09C7, 0x0334, 0x09BE] }, +{ source: [0x09C7, 0x0334, 0x09D7], NFC: [0x09C7, 0x0334, 0x09D7], NFD: [0x09C7, 0x0334, 0x09D7], NFKC: [0x09C7, 0x0334, 0x09D7], NFKD: [0x09C7, 0x0334, 0x09D7] }, +{ source: [0x0B47, 0x0334, 0x0B3E], NFC: [0x0B47, 0x0334, 0x0B3E], NFD: [0x0B47, 0x0334, 0x0B3E], NFKC: [0x0B47, 0x0334, 0x0B3E], NFKD: [0x0B47, 0x0334, 0x0B3E] }, +{ source: [0x0B47, 0x0334, 0x0B56], NFC: [0x0B47, 0x0334, 0x0B56], NFD: [0x0B47, 0x0334, 0x0B56], NFKC: [0x0B47, 0x0334, 0x0B56], NFKD: [0x0B47, 0x0334, 0x0B56] }, +{ source: [0x0B47, 0x0334, 0x0B57], NFC: [0x0B47, 0x0334, 0x0B57], NFD: [0x0B47, 0x0334, 0x0B57], NFKC: [0x0B47, 0x0334, 0x0B57], NFKD: [0x0B47, 0x0334, 0x0B57] }, +{ source: [0x0B92, 0x0334, 0x0BD7], NFC: [0x0B92, 0x0334, 0x0BD7], NFD: [0x0B92, 0x0334, 0x0BD7], NFKC: [0x0B92, 0x0334, 0x0BD7], NFKD: [0x0B92, 0x0334, 0x0BD7] }, +{ source: [0x0BC6, 0x0334, 0x0BBE], NFC: [0x0BC6, 0x0334, 0x0BBE], NFD: [0x0BC6, 0x0334, 0x0BBE], NFKC: [0x0BC6, 0x0334, 0x0BBE], NFKD: [0x0BC6, 0x0334, 0x0BBE] }, +{ source: [0x0BC6, 0x0334, 0x0BD7], NFC: [0x0BC6, 0x0334, 0x0BD7], NFD: [0x0BC6, 0x0334, 0x0BD7], NFKC: [0x0BC6, 0x0334, 0x0BD7], NFKD: [0x0BC6, 0x0334, 0x0BD7] }, +{ source: [0x0BC7, 0x0334, 0x0BBE], NFC: [0x0BC7, 0x0334, 0x0BBE], NFD: [0x0BC7, 0x0334, 0x0BBE], NFKC: [0x0BC7, 0x0334, 0x0BBE], NFKD: [0x0BC7, 0x0334, 0x0BBE] }, +{ source: [0x0CBF, 0x0334, 0x0CD5], NFC: [0x0CBF, 0x0334, 0x0CD5], NFD: [0x0CBF, 0x0334, 0x0CD5], NFKC: [0x0CBF, 0x0334, 0x0CD5], NFKD: [0x0CBF, 0x0334, 0x0CD5] }, +{ source: [0x0CC6, 0x0334, 0x0CC2], NFC: [0x0CC6, 0x0334, 0x0CC2], NFD: [0x0CC6, 0x0334, 0x0CC2], NFKC: [0x0CC6, 0x0334, 0x0CC2], NFKD: [0x0CC6, 0x0334, 0x0CC2] }, +{ source: [0x0CC6, 0x0334, 0x0CD5], NFC: [0x0CC6, 0x0334, 0x0CD5], NFD: [0x0CC6, 0x0334, 0x0CD5], NFKC: [0x0CC6, 0x0334, 0x0CD5], NFKD: [0x0CC6, 0x0334, 0x0CD5] }, +{ source: [0x0CC6, 0x0334, 0x0CD6], NFC: [0x0CC6, 0x0334, 0x0CD6], NFD: [0x0CC6, 0x0334, 0x0CD6], NFKC: [0x0CC6, 0x0334, 0x0CD6], NFKD: [0x0CC6, 0x0334, 0x0CD6] }, +{ source: [0x0CCA, 0x0334, 0x0CD5], NFC: [0x0CCA, 0x0334, 0x0CD5], NFD: [0x0CC6, 0x0CC2, 0x0334, 0x0CD5], NFKC: [0x0CCA, 0x0334, 0x0CD5], NFKD: [0x0CC6, 0x0CC2, 0x0334, 0x0CD5] }, +{ source: [0x0D46, 0x0334, 0x0D3E], NFC: [0x0D46, 0x0334, 0x0D3E], NFD: [0x0D46, 0x0334, 0x0D3E], NFKC: [0x0D46, 0x0334, 0x0D3E], NFKD: [0x0D46, 0x0334, 0x0D3E] }, +{ source: [0x0D46, 0x0334, 0x0D57], NFC: [0x0D46, 0x0334, 0x0D57], NFD: [0x0D46, 0x0334, 0x0D57], NFKC: [0x0D46, 0x0334, 0x0D57], NFKD: [0x0D46, 0x0334, 0x0D57] }, +{ source: [0x0D47, 0x0334, 0x0D3E], NFC: [0x0D47, 0x0334, 0x0D3E], NFD: [0x0D47, 0x0334, 0x0D3E], NFKC: [0x0D47, 0x0334, 0x0D3E], NFKD: [0x0D47, 0x0334, 0x0D3E] }, +{ source: [0x0DD9, 0x0334, 0x0DCF], NFC: [0x0DD9, 0x0334, 0x0DCF], NFD: [0x0DD9, 0x0334, 0x0DCF], NFKC: [0x0DD9, 0x0334, 0x0DCF], NFKD: [0x0DD9, 0x0334, 0x0DCF] }, +{ source: [0x0DD9, 0x0334, 0x0DDF], NFC: [0x0DD9, 0x0334, 0x0DDF], NFD: [0x0DD9, 0x0334, 0x0DDF], NFKC: [0x0DD9, 0x0334, 0x0DDF], NFKD: [0x0DD9, 0x0334, 0x0DDF] }, +{ source: [0x0F40, 0x0334, 0x0FB5], NFC: [0x0F40, 0x0334, 0x0FB5], NFD: [0x0F40, 0x0334, 0x0FB5], NFKC: [0x0F40, 0x0334, 0x0FB5], NFKD: [0x0F40, 0x0334, 0x0FB5] }, +{ source: [0x0F42, 0x0334, 0x0FB7], NFC: [0x0F42, 0x0334, 0x0FB7], NFD: [0x0F42, 0x0334, 0x0FB7], NFKC: [0x0F42, 0x0334, 0x0FB7], NFKD: [0x0F42, 0x0334, 0x0FB7] }, +{ source: [0x0F4C, 0x0334, 0x0FB7], NFC: [0x0F4C, 0x0334, 0x0FB7], NFD: [0x0F4C, 0x0334, 0x0FB7], NFKC: [0x0F4C, 0x0334, 0x0FB7], NFKD: [0x0F4C, 0x0334, 0x0FB7] }, +{ source: [0x0F51, 0x0334, 0x0FB7], NFC: [0x0F51, 0x0334, 0x0FB7], NFD: [0x0F51, 0x0334, 0x0FB7], NFKC: [0x0F51, 0x0334, 0x0FB7], NFKD: [0x0F51, 0x0334, 0x0FB7] }, +{ source: [0x0F56, 0x0334, 0x0FB7], NFC: [0x0F56, 0x0334, 0x0FB7], NFD: [0x0F56, 0x0334, 0x0FB7], NFKC: [0x0F56, 0x0334, 0x0FB7], NFKD: [0x0F56, 0x0334, 0x0FB7] }, +{ source: [0x0F5B, 0x0334, 0x0FB7], NFC: [0x0F5B, 0x0334, 0x0FB7], NFD: [0x0F5B, 0x0334, 0x0FB7], NFKC: [0x0F5B, 0x0334, 0x0FB7], NFKD: [0x0F5B, 0x0334, 0x0FB7] }, +{ source: [0x0F90, 0x0334, 0x0FB5], NFC: [0x0F90, 0x0334, 0x0FB5], NFD: [0x0F90, 0x0334, 0x0FB5], NFKC: [0x0F90, 0x0334, 0x0FB5], NFKD: [0x0F90, 0x0334, 0x0FB5] }, +{ source: [0x0F92, 0x0334, 0x0FB7], NFC: [0x0F92, 0x0334, 0x0FB7], NFD: [0x0F92, 0x0334, 0x0FB7], NFKC: [0x0F92, 0x0334, 0x0FB7], NFKD: [0x0F92, 0x0334, 0x0FB7] }, +{ source: [0x0F9C, 0x0334, 0x0FB7], NFC: [0x0F9C, 0x0334, 0x0FB7], NFD: [0x0F9C, 0x0334, 0x0FB7], NFKC: [0x0F9C, 0x0334, 0x0FB7], NFKD: [0x0F9C, 0x0334, 0x0FB7] }, +{ source: [0x0FA1, 0x0334, 0x0FB7], NFC: [0x0FA1, 0x0334, 0x0FB7], NFD: [0x0FA1, 0x0334, 0x0FB7], NFKC: [0x0FA1, 0x0334, 0x0FB7], NFKD: [0x0FA1, 0x0334, 0x0FB7] }, +{ source: [0x0FA6, 0x0334, 0x0FB7], NFC: [0x0FA6, 0x0334, 0x0FB7], NFD: [0x0FA6, 0x0334, 0x0FB7], NFKC: [0x0FA6, 0x0334, 0x0FB7], NFKD: [0x0FA6, 0x0334, 0x0FB7] }, +{ source: [0x0FAB, 0x0334, 0x0FB7], NFC: [0x0FAB, 0x0334, 0x0FB7], NFD: [0x0FAB, 0x0334, 0x0FB7], NFKC: [0x0FAB, 0x0334, 0x0FB7], NFKD: [0x0FAB, 0x0334, 0x0FB7] }, +{ source: [0x1025, 0x0334, 0x102E], NFC: [0x1025, 0x0334, 0x102E], NFD: [0x1025, 0x0334, 0x102E], NFKC: [0x1025, 0x0334, 0x102E], NFKD: [0x1025, 0x0334, 0x102E] }, +{ source: [0x1100, 0x0334, 0x1161], NFC: [0x1100, 0x0334, 0x1161], NFD: [0x1100, 0x0334, 0x1161], NFKC: [0x1100, 0x0334, 0x1161], NFKD: [0x1100, 0x0334, 0x1161] }, +{ source: [0x1100, 0x0334, 0x116E], NFC: [0x1100, 0x0334, 0x116E], NFD: [0x1100, 0x0334, 0x116E], NFKC: [0x1100, 0x0334, 0x116E], NFKD: [0x1100, 0x0334, 0x116E] }, +{ source: [0x1101, 0x0334, 0x1166], NFC: [0x1101, 0x0334, 0x1166], NFD: [0x1101, 0x0334, 0x1166], NFKC: [0x1101, 0x0334, 0x1166], NFKD: [0x1101, 0x0334, 0x1166] }, +{ source: [0x1101, 0x0334, 0x1173], NFC: [0x1101, 0x0334, 0x1173], NFD: [0x1101, 0x0334, 0x1173], NFKC: [0x1101, 0x0334, 0x1173], NFKD: [0x1101, 0x0334, 0x1173] }, +{ source: [0x1102, 0x0334, 0x116B], NFC: [0x1102, 0x0334, 0x116B], NFD: [0x1102, 0x0334, 0x116B], NFKC: [0x1102, 0x0334, 0x116B], NFKD: [0x1102, 0x0334, 0x116B] }, +{ source: [0x1103, 0x0334, 0x1163], NFC: [0x1103, 0x0334, 0x1163], NFD: [0x1103, 0x0334, 0x1163], NFKC: [0x1103, 0x0334, 0x1163], NFKD: [0x1103, 0x0334, 0x1163] }, +{ source: [0x1103, 0x0334, 0x1170], NFC: [0x1103, 0x0334, 0x1170], NFD: [0x1103, 0x0334, 0x1170], NFKC: [0x1103, 0x0334, 0x1170], NFKD: [0x1103, 0x0334, 0x1170] }, +{ source: [0x1104, 0x0334, 0x1168], NFC: [0x1104, 0x0334, 0x1168], NFD: [0x1104, 0x0334, 0x1168], NFKC: [0x1104, 0x0334, 0x1168], NFKD: [0x1104, 0x0334, 0x1168] }, +{ source: [0x1104, 0x0334, 0x1175], NFC: [0x1104, 0x0334, 0x1175], NFD: [0x1104, 0x0334, 0x1175], NFKC: [0x1104, 0x0334, 0x1175], NFKD: [0x1104, 0x0334, 0x1175] }, +{ source: [0x1105, 0x0334, 0x116D], NFC: [0x1105, 0x0334, 0x116D], NFD: [0x1105, 0x0334, 0x116D], NFKC: [0x1105, 0x0334, 0x116D], NFKD: [0x1105, 0x0334, 0x116D] }, +{ source: [0x1106, 0x0334, 0x1165], NFC: [0x1106, 0x0334, 0x1165], NFD: [0x1106, 0x0334, 0x1165], NFKC: [0x1106, 0x0334, 0x1165], NFKD: [0x1106, 0x0334, 0x1165] }, +{ source: [0x1106, 0x0334, 0x1172], NFC: [0x1106, 0x0334, 0x1172], NFD: [0x1106, 0x0334, 0x1172], NFKC: [0x1106, 0x0334, 0x1172], NFKD: [0x1106, 0x0334, 0x1172] }, +{ source: [0x1107, 0x0334, 0x116A], NFC: [0x1107, 0x0334, 0x116A], NFD: [0x1107, 0x0334, 0x116A], NFKC: [0x1107, 0x0334, 0x116A], NFKD: [0x1107, 0x0334, 0x116A] }, +{ source: [0x1108, 0x0334, 0x1162], NFC: [0x1108, 0x0334, 0x1162], NFD: [0x1108, 0x0334, 0x1162], NFKC: [0x1108, 0x0334, 0x1162], NFKD: [0x1108, 0x0334, 0x1162] }, +{ source: [0x1108, 0x0334, 0x116F], NFC: [0x1108, 0x0334, 0x116F], NFD: [0x1108, 0x0334, 0x116F], NFKC: [0x1108, 0x0334, 0x116F], NFKD: [0x1108, 0x0334, 0x116F] }, +{ source: [0x1109, 0x0334, 0x1167], NFC: [0x1109, 0x0334, 0x1167], NFD: [0x1109, 0x0334, 0x1167], NFKC: [0x1109, 0x0334, 0x1167], NFKD: [0x1109, 0x0334, 0x1167] }, +{ source: [0x1109, 0x0334, 0x1174], NFC: [0x1109, 0x0334, 0x1174], NFD: [0x1109, 0x0334, 0x1174], NFKC: [0x1109, 0x0334, 0x1174], NFKD: [0x1109, 0x0334, 0x1174] }, +{ source: [0x110A, 0x0334, 0x116C], NFC: [0x110A, 0x0334, 0x116C], NFD: [0x110A, 0x0334, 0x116C], NFKC: [0x110A, 0x0334, 0x116C], NFKD: [0x110A, 0x0334, 0x116C] }, +{ source: [0x110B, 0x0334, 0x1164], NFC: [0x110B, 0x0334, 0x1164], NFD: [0x110B, 0x0334, 0x1164], NFKC: [0x110B, 0x0334, 0x1164], NFKD: [0x110B, 0x0334, 0x1164] }, +{ source: [0x110B, 0x0334, 0x1171], NFC: [0x110B, 0x0334, 0x1171], NFD: [0x110B, 0x0334, 0x1171], NFKC: [0x110B, 0x0334, 0x1171], NFKD: [0x110B, 0x0334, 0x1171] }, +{ source: [0x110C, 0x0334, 0x1169], NFC: [0x110C, 0x0334, 0x1169], NFD: [0x110C, 0x0334, 0x1169], NFKC: [0x110C, 0x0334, 0x1169], NFKD: [0x110C, 0x0334, 0x1169] }, +{ source: [0x110D, 0x0334, 0x1161], NFC: [0x110D, 0x0334, 0x1161], NFD: [0x110D, 0x0334, 0x1161], NFKC: [0x110D, 0x0334, 0x1161], NFKD: [0x110D, 0x0334, 0x1161] }, +{ source: [0x110D, 0x0334, 0x116E], NFC: [0x110D, 0x0334, 0x116E], NFD: [0x110D, 0x0334, 0x116E], NFKC: [0x110D, 0x0334, 0x116E], NFKD: [0x110D, 0x0334, 0x116E] }, +{ source: [0x110E, 0x0334, 0x1166], NFC: [0x110E, 0x0334, 0x1166], NFD: [0x110E, 0x0334, 0x1166], NFKC: [0x110E, 0x0334, 0x1166], NFKD: [0x110E, 0x0334, 0x1166] }, +{ source: [0x110E, 0x0334, 0x1173], NFC: [0x110E, 0x0334, 0x1173], NFD: [0x110E, 0x0334, 0x1173], NFKC: [0x110E, 0x0334, 0x1173], NFKD: [0x110E, 0x0334, 0x1173] }, +{ source: [0x110F, 0x0334, 0x116B], NFC: [0x110F, 0x0334, 0x116B], NFD: [0x110F, 0x0334, 0x116B], NFKC: [0x110F, 0x0334, 0x116B], NFKD: [0x110F, 0x0334, 0x116B] }, +{ source: [0x1110, 0x0334, 0x1163], NFC: [0x1110, 0x0334, 0x1163], NFD: [0x1110, 0x0334, 0x1163], NFKC: [0x1110, 0x0334, 0x1163], NFKD: [0x1110, 0x0334, 0x1163] }, +{ source: [0x1110, 0x0334, 0x1170], NFC: [0x1110, 0x0334, 0x1170], NFD: [0x1110, 0x0334, 0x1170], NFKC: [0x1110, 0x0334, 0x1170], NFKD: [0x1110, 0x0334, 0x1170] }, +{ source: [0x1111, 0x0334, 0x1168], NFC: [0x1111, 0x0334, 0x1168], NFD: [0x1111, 0x0334, 0x1168], NFKC: [0x1111, 0x0334, 0x1168], NFKD: [0x1111, 0x0334, 0x1168] }, +{ source: [0x1111, 0x0334, 0x1175], NFC: [0x1111, 0x0334, 0x1175], NFD: [0x1111, 0x0334, 0x1175], NFKC: [0x1111, 0x0334, 0x1175], NFKD: [0x1111, 0x0334, 0x1175] }, +{ source: [0x1112, 0x0334, 0x116D], NFC: [0x1112, 0x0334, 0x116D], NFD: [0x1112, 0x0334, 0x116D], NFKC: [0x1112, 0x0334, 0x116D], NFKD: [0x1112, 0x0334, 0x116D] }, +{ source: [0x1B05, 0x0334, 0x1B35], NFC: [0x1B05, 0x0334, 0x1B35], NFD: [0x1B05, 0x0334, 0x1B35], NFKC: [0x1B05, 0x0334, 0x1B35], NFKD: [0x1B05, 0x0334, 0x1B35] }, +{ source: [0x1B07, 0x0334, 0x1B35], NFC: [0x1B07, 0x0334, 0x1B35], NFD: [0x1B07, 0x0334, 0x1B35], NFKC: [0x1B07, 0x0334, 0x1B35], NFKD: [0x1B07, 0x0334, 0x1B35] }, +{ source: [0x1B09, 0x0334, 0x1B35], NFC: [0x1B09, 0x0334, 0x1B35], NFD: [0x1B09, 0x0334, 0x1B35], NFKC: [0x1B09, 0x0334, 0x1B35], NFKD: [0x1B09, 0x0334, 0x1B35] }, +{ source: [0x1B0B, 0x0334, 0x1B35], NFC: [0x1B0B, 0x0334, 0x1B35], NFD: [0x1B0B, 0x0334, 0x1B35], NFKC: [0x1B0B, 0x0334, 0x1B35], NFKD: [0x1B0B, 0x0334, 0x1B35] }, +{ source: [0x1B0D, 0x0334, 0x1B35], NFC: [0x1B0D, 0x0334, 0x1B35], NFD: [0x1B0D, 0x0334, 0x1B35], NFKC: [0x1B0D, 0x0334, 0x1B35], NFKD: [0x1B0D, 0x0334, 0x1B35] }, +{ source: [0x1B11, 0x0334, 0x1B35], NFC: [0x1B11, 0x0334, 0x1B35], NFD: [0x1B11, 0x0334, 0x1B35], NFKC: [0x1B11, 0x0334, 0x1B35], NFKD: [0x1B11, 0x0334, 0x1B35] }, +{ source: [0x1B3A, 0x0334, 0x1B35], NFC: [0x1B3A, 0x0334, 0x1B35], NFD: [0x1B3A, 0x0334, 0x1B35], NFKC: [0x1B3A, 0x0334, 0x1B35], NFKD: [0x1B3A, 0x0334, 0x1B35] }, +{ source: [0x1B3C, 0x0334, 0x1B35], NFC: [0x1B3C, 0x0334, 0x1B35], NFD: [0x1B3C, 0x0334, 0x1B35], NFKC: [0x1B3C, 0x0334, 0x1B35], NFKD: [0x1B3C, 0x0334, 0x1B35] }, +{ source: [0x1B3E, 0x0334, 0x1B35], NFC: [0x1B3E, 0x0334, 0x1B35], NFD: [0x1B3E, 0x0334, 0x1B35], NFKC: [0x1B3E, 0x0334, 0x1B35], NFKD: [0x1B3E, 0x0334, 0x1B35] }, +{ source: [0x1B3F, 0x0334, 0x1B35], NFC: [0x1B3F, 0x0334, 0x1B35], NFD: [0x1B3F, 0x0334, 0x1B35], NFKC: [0x1B3F, 0x0334, 0x1B35], NFKD: [0x1B3F, 0x0334, 0x1B35] }, +{ source: [0x1B42, 0x0334, 0x1B35], NFC: [0x1B42, 0x0334, 0x1B35], NFD: [0x1B42, 0x0334, 0x1B35], NFKC: [0x1B42, 0x0334, 0x1B35], NFKD: [0x1B42, 0x0334, 0x1B35] }, +{ source: [0xAC54, 0x0334, 0x11AE], NFC: [0xAC54, 0x0334, 0x11AE], NFD: [0x1100, 0x1164, 0x0334, 0x11AE], NFKC: [0xAC54, 0x0334, 0x11AE], NFKD: [0x1100, 0x1164, 0x0334, 0x11AE] }, +{ source: [0xACA8, 0x0334, 0x11B5], NFC: [0xACA8, 0x0334, 0x11B5], NFD: [0x1100, 0x1167, 0x0334, 0x11B5], NFKC: [0xACA8, 0x0334, 0x11B5], NFKD: [0x1100, 0x1167, 0x0334, 0x11B5] }, +{ source: [0xACFC, 0x0334, 0x11BC], NFC: [0xACFC, 0x0334, 0x11BC], NFD: [0x1100, 0x116A, 0x0334, 0x11BC], NFKC: [0xACFC, 0x0334, 0x11BC], NFKD: [0x1100, 0x116A, 0x0334, 0x11BC] }, +{ source: [0xADC0, 0x0334, 0x11AE], NFC: [0xADC0, 0x0334, 0x11AE], NFD: [0x1100, 0x1171, 0x0334, 0x11AE], NFKC: [0xADC0, 0x0334, 0x11AE], NFKD: [0x1100, 0x1171, 0x0334, 0x11AE] }, +{ source: [0xAE14, 0x0334, 0x11B5], NFC: [0xAE14, 0x0334, 0x11B5], NFD: [0x1100, 0x1174, 0x0334, 0x11B5], NFKC: [0xAE14, 0x0334, 0x11B5], NFKD: [0x1100, 0x1174, 0x0334, 0x11B5] }, +{ source: [0xAE68, 0x0334, 0x11BC], NFC: [0xAE68, 0x0334, 0x11BC], NFD: [0x1101, 0x1162, 0x0334, 0x11BC], NFKC: [0xAE68, 0x0334, 0x11BC], NFKD: [0x1101, 0x1162, 0x0334, 0x11BC] }, +{ source: [0xAF2C, 0x0334, 0x11AE], NFC: [0xAF2C, 0x0334, 0x11AE], NFD: [0x1101, 0x1169, 0x0334, 0x11AE], NFKC: [0xAF2C, 0x0334, 0x11AE], NFKD: [0x1101, 0x1169, 0x0334, 0x11AE] }, +{ source: [0xAF80, 0x0334, 0x11B5], NFC: [0xAF80, 0x0334, 0x11B5], NFD: [0x1101, 0x116C, 0x0334, 0x11B5], NFKC: [0xAF80, 0x0334, 0x11B5], NFKD: [0x1101, 0x116C, 0x0334, 0x11B5] }, +{ source: [0xAFD4, 0x0334, 0x11BC], NFC: [0xAFD4, 0x0334, 0x11BC], NFD: [0x1101, 0x116F, 0x0334, 0x11BC], NFKC: [0xAFD4, 0x0334, 0x11BC], NFKD: [0x1101, 0x116F, 0x0334, 0x11BC] }, +{ source: [0xB098, 0x0334, 0x11AE], NFC: [0xB098, 0x0334, 0x11AE], NFD: [0x1102, 0x1161, 0x0334, 0x11AE], NFKC: [0xB098, 0x0334, 0x11AE], NFKD: [0x1102, 0x1161, 0x0334, 0x11AE] }, +{ source: [0xB0EC, 0x0334, 0x11B5], NFC: [0xB0EC, 0x0334, 0x11B5], NFD: [0x1102, 0x1164, 0x0334, 0x11B5], NFKC: [0xB0EC, 0x0334, 0x11B5], NFKD: [0x1102, 0x1164, 0x0334, 0x11B5] }, +{ source: [0xB140, 0x0334, 0x11BC], NFC: [0xB140, 0x0334, 0x11BC], NFD: [0x1102, 0x1167, 0x0334, 0x11BC], NFKC: [0xB140, 0x0334, 0x11BC], NFKD: [0x1102, 0x1167, 0x0334, 0x11BC] }, +{ source: [0xB204, 0x0334, 0x11AE], NFC: [0xB204, 0x0334, 0x11AE], NFD: [0x1102, 0x116E, 0x0334, 0x11AE], NFKC: [0xB204, 0x0334, 0x11AE], NFKD: [0x1102, 0x116E, 0x0334, 0x11AE] }, +{ source: [0xB258, 0x0334, 0x11B5], NFC: [0xB258, 0x0334, 0x11B5], NFD: [0x1102, 0x1171, 0x0334, 0x11B5], NFKC: [0xB258, 0x0334, 0x11B5], NFKD: [0x1102, 0x1171, 0x0334, 0x11B5] }, +{ source: [0xB2AC, 0x0334, 0x11BC], NFC: [0xB2AC, 0x0334, 0x11BC], NFD: [0x1102, 0x1174, 0x0334, 0x11BC], NFKC: [0xB2AC, 0x0334, 0x11BC], NFKD: [0x1102, 0x1174, 0x0334, 0x11BC] }, +{ source: [0xB370, 0x0334, 0x11AE], NFC: [0xB370, 0x0334, 0x11AE], NFD: [0x1103, 0x1166, 0x0334, 0x11AE], NFKC: [0xB370, 0x0334, 0x11AE], NFKD: [0x1103, 0x1166, 0x0334, 0x11AE] }, +{ source: [0xB3C4, 0x0334, 0x11B5], NFC: [0xB3C4, 0x0334, 0x11B5], NFD: [0x1103, 0x1169, 0x0334, 0x11B5], NFKC: [0xB3C4, 0x0334, 0x11B5], NFKD: [0x1103, 0x1169, 0x0334, 0x11B5] }, +{ source: [0xB418, 0x0334, 0x11BC], NFC: [0xB418, 0x0334, 0x11BC], NFD: [0x1103, 0x116C, 0x0334, 0x11BC], NFKC: [0xB418, 0x0334, 0x11BC], NFKD: [0x1103, 0x116C, 0x0334, 0x11BC] }, +{ source: [0xB4DC, 0x0334, 0x11AE], NFC: [0xB4DC, 0x0334, 0x11AE], NFD: [0x1103, 0x1173, 0x0334, 0x11AE], NFKC: [0xB4DC, 0x0334, 0x11AE], NFKD: [0x1103, 0x1173, 0x0334, 0x11AE] }, +{ source: [0xB530, 0x0334, 0x11B5], NFC: [0xB530, 0x0334, 0x11B5], NFD: [0x1104, 0x1161, 0x0334, 0x11B5], NFKC: [0xB530, 0x0334, 0x11B5], NFKD: [0x1104, 0x1161, 0x0334, 0x11B5] }, +{ source: [0xB584, 0x0334, 0x11BC], NFC: [0xB584, 0x0334, 0x11BC], NFD: [0x1104, 0x1164, 0x0334, 0x11BC], NFKC: [0xB584, 0x0334, 0x11BC], NFKD: [0x1104, 0x1164, 0x0334, 0x11BC] }, +{ source: [0xB648, 0x0334, 0x11AE], NFC: [0xB648, 0x0334, 0x11AE], NFD: [0x1104, 0x116B, 0x0334, 0x11AE], NFKC: [0xB648, 0x0334, 0x11AE], NFKD: [0x1104, 0x116B, 0x0334, 0x11AE] }, +{ source: [0xB69C, 0x0334, 0x11B5], NFC: [0xB69C, 0x0334, 0x11B5], NFD: [0x1104, 0x116E, 0x0334, 0x11B5], NFKC: [0xB69C, 0x0334, 0x11B5], NFKD: [0x1104, 0x116E, 0x0334, 0x11B5] }, +{ source: [0xB6F0, 0x0334, 0x11BC], NFC: [0xB6F0, 0x0334, 0x11BC], NFD: [0x1104, 0x1171, 0x0334, 0x11BC], NFKC: [0xB6F0, 0x0334, 0x11BC], NFKD: [0x1104, 0x1171, 0x0334, 0x11BC] }, +{ source: [0xB7B4, 0x0334, 0x11AE], NFC: [0xB7B4, 0x0334, 0x11AE], NFD: [0x1105, 0x1163, 0x0334, 0x11AE], NFKC: [0xB7B4, 0x0334, 0x11AE], NFKD: [0x1105, 0x1163, 0x0334, 0x11AE] }, +{ source: [0xB808, 0x0334, 0x11B5], NFC: [0xB808, 0x0334, 0x11B5], NFD: [0x1105, 0x1166, 0x0334, 0x11B5], NFKC: [0xB808, 0x0334, 0x11B5], NFKD: [0x1105, 0x1166, 0x0334, 0x11B5] }, +{ source: [0xB85C, 0x0334, 0x11BC], NFC: [0xB85C, 0x0334, 0x11BC], NFD: [0x1105, 0x1169, 0x0334, 0x11BC], NFKC: [0xB85C, 0x0334, 0x11BC], NFKD: [0x1105, 0x1169, 0x0334, 0x11BC] }, +{ source: [0xB920, 0x0334, 0x11AE], NFC: [0xB920, 0x0334, 0x11AE], NFD: [0x1105, 0x1170, 0x0334, 0x11AE], NFKC: [0xB920, 0x0334, 0x11AE], NFKD: [0x1105, 0x1170, 0x0334, 0x11AE] }, +{ source: [0xB974, 0x0334, 0x11B5], NFC: [0xB974, 0x0334, 0x11B5], NFD: [0x1105, 0x1173, 0x0334, 0x11B5], NFKC: [0xB974, 0x0334, 0x11B5], NFKD: [0x1105, 0x1173, 0x0334, 0x11B5] }, +{ source: [0xB9C8, 0x0334, 0x11BC], NFC: [0xB9C8, 0x0334, 0x11BC], NFD: [0x1106, 0x1161, 0x0334, 0x11BC], NFKC: [0xB9C8, 0x0334, 0x11BC], NFKD: [0x1106, 0x1161, 0x0334, 0x11BC] }, +{ source: [0xBA8C, 0x0334, 0x11AE], NFC: [0xBA8C, 0x0334, 0x11AE], NFD: [0x1106, 0x1168, 0x0334, 0x11AE], NFKC: [0xBA8C, 0x0334, 0x11AE], NFKD: [0x1106, 0x1168, 0x0334, 0x11AE] }, +{ source: [0xBAE0, 0x0334, 0x11B5], NFC: [0xBAE0, 0x0334, 0x11B5], NFD: [0x1106, 0x116B, 0x0334, 0x11B5], NFKC: [0xBAE0, 0x0334, 0x11B5], NFKD: [0x1106, 0x116B, 0x0334, 0x11B5] }, +{ source: [0xBB34, 0x0334, 0x11BC], NFC: [0xBB34, 0x0334, 0x11BC], NFD: [0x1106, 0x116E, 0x0334, 0x11BC], NFKC: [0xBB34, 0x0334, 0x11BC], NFKD: [0x1106, 0x116E, 0x0334, 0x11BC] }, +{ source: [0xBBF8, 0x0334, 0x11AE], NFC: [0xBBF8, 0x0334, 0x11AE], NFD: [0x1106, 0x1175, 0x0334, 0x11AE], NFKC: [0xBBF8, 0x0334, 0x11AE], NFKD: [0x1106, 0x1175, 0x0334, 0x11AE] }, +{ source: [0xBC4C, 0x0334, 0x11B5], NFC: [0xBC4C, 0x0334, 0x11B5], NFD: [0x1107, 0x1163, 0x0334, 0x11B5], NFKC: [0xBC4C, 0x0334, 0x11B5], NFKD: [0x1107, 0x1163, 0x0334, 0x11B5] }, +{ source: [0xBCA0, 0x0334, 0x11BC], NFC: [0xBCA0, 0x0334, 0x11BC], NFD: [0x1107, 0x1166, 0x0334, 0x11BC], NFKC: [0xBCA0, 0x0334, 0x11BC], NFKD: [0x1107, 0x1166, 0x0334, 0x11BC] }, +{ source: [0xBD64, 0x0334, 0x11AE], NFC: [0xBD64, 0x0334, 0x11AE], NFD: [0x1107, 0x116D, 0x0334, 0x11AE], NFKC: [0xBD64, 0x0334, 0x11AE], NFKD: [0x1107, 0x116D, 0x0334, 0x11AE] }, +{ source: [0xBDB8, 0x0334, 0x11B5], NFC: [0xBDB8, 0x0334, 0x11B5], NFD: [0x1107, 0x1170, 0x0334, 0x11B5], NFKC: [0xBDB8, 0x0334, 0x11B5], NFKD: [0x1107, 0x1170, 0x0334, 0x11B5] }, +{ source: [0xBE0C, 0x0334, 0x11BC], NFC: [0xBE0C, 0x0334, 0x11BC], NFD: [0x1107, 0x1173, 0x0334, 0x11BC], NFKC: [0xBE0C, 0x0334, 0x11BC], NFKD: [0x1107, 0x1173, 0x0334, 0x11BC] }, +{ source: [0xBED0, 0x0334, 0x11AE], NFC: [0xBED0, 0x0334, 0x11AE], NFD: [0x1108, 0x1165, 0x0334, 0x11AE], NFKC: [0xBED0, 0x0334, 0x11AE], NFKD: [0x1108, 0x1165, 0x0334, 0x11AE] }, +{ source: [0xBF24, 0x0334, 0x11B5], NFC: [0xBF24, 0x0334, 0x11B5], NFD: [0x1108, 0x1168, 0x0334, 0x11B5], NFKC: [0xBF24, 0x0334, 0x11B5], NFKD: [0x1108, 0x1168, 0x0334, 0x11B5] }, +{ source: [0xBF78, 0x0334, 0x11BC], NFC: [0xBF78, 0x0334, 0x11BC], NFD: [0x1108, 0x116B, 0x0334, 0x11BC], NFKC: [0xBF78, 0x0334, 0x11BC], NFKD: [0x1108, 0x116B, 0x0334, 0x11BC] }, +{ source: [0xC03C, 0x0334, 0x11AE], NFC: [0xC03C, 0x0334, 0x11AE], NFD: [0x1108, 0x1172, 0x0334, 0x11AE], NFKC: [0xC03C, 0x0334, 0x11AE], NFKD: [0x1108, 0x1172, 0x0334, 0x11AE] }, +{ source: [0xC090, 0x0334, 0x11B5], NFC: [0xC090, 0x0334, 0x11B5], NFD: [0x1108, 0x1175, 0x0334, 0x11B5], NFKC: [0xC090, 0x0334, 0x11B5], NFKD: [0x1108, 0x1175, 0x0334, 0x11B5] }, +{ source: [0xC0E4, 0x0334, 0x11BC], NFC: [0xC0E4, 0x0334, 0x11BC], NFD: [0x1109, 0x1163, 0x0334, 0x11BC], NFKC: [0xC0E4, 0x0334, 0x11BC], NFKD: [0x1109, 0x1163, 0x0334, 0x11BC] }, +{ source: [0xC1A8, 0x0334, 0x11AE], NFC: [0xC1A8, 0x0334, 0x11AE], NFD: [0x1109, 0x116A, 0x0334, 0x11AE], NFKC: [0xC1A8, 0x0334, 0x11AE], NFKD: [0x1109, 0x116A, 0x0334, 0x11AE] }, +{ source: [0xC1FC, 0x0334, 0x11B5], NFC: [0xC1FC, 0x0334, 0x11B5], NFD: [0x1109, 0x116D, 0x0334, 0x11B5], NFKC: [0xC1FC, 0x0334, 0x11B5], NFKD: [0x1109, 0x116D, 0x0334, 0x11B5] }, +{ source: [0xC250, 0x0334, 0x11BC], NFC: [0xC250, 0x0334, 0x11BC], NFD: [0x1109, 0x1170, 0x0334, 0x11BC], NFKC: [0xC250, 0x0334, 0x11BC], NFKD: [0x1109, 0x1170, 0x0334, 0x11BC] }, +{ source: [0xC314, 0x0334, 0x11AE], NFC: [0xC314, 0x0334, 0x11AE], NFD: [0x110A, 0x1162, 0x0334, 0x11AE], NFKC: [0xC314, 0x0334, 0x11AE], NFKD: [0x110A, 0x1162, 0x0334, 0x11AE] }, +{ source: [0xC368, 0x0334, 0x11B5], NFC: [0xC368, 0x0334, 0x11B5], NFD: [0x110A, 0x1165, 0x0334, 0x11B5], NFKC: [0xC368, 0x0334, 0x11B5], NFKD: [0x110A, 0x1165, 0x0334, 0x11B5] }, +{ source: [0xC3BC, 0x0334, 0x11BC], NFC: [0xC3BC, 0x0334, 0x11BC], NFD: [0x110A, 0x1168, 0x0334, 0x11BC], NFKC: [0xC3BC, 0x0334, 0x11BC], NFKD: [0x110A, 0x1168, 0x0334, 0x11BC] }, +{ source: [0xC480, 0x0334, 0x11AE], NFC: [0xC480, 0x0334, 0x11AE], NFD: [0x110A, 0x116F, 0x0334, 0x11AE], NFKC: [0xC480, 0x0334, 0x11AE], NFKD: [0x110A, 0x116F, 0x0334, 0x11AE] }, +{ source: [0xC4D4, 0x0334, 0x11B5], NFC: [0xC4D4, 0x0334, 0x11B5], NFD: [0x110A, 0x1172, 0x0334, 0x11B5], NFKC: [0xC4D4, 0x0334, 0x11B5], NFKD: [0x110A, 0x1172, 0x0334, 0x11B5] }, +{ source: [0xC528, 0x0334, 0x11BC], NFC: [0xC528, 0x0334, 0x11BC], NFD: [0x110A, 0x1175, 0x0334, 0x11BC], NFKC: [0xC528, 0x0334, 0x11BC], NFKD: [0x110A, 0x1175, 0x0334, 0x11BC] }, +{ source: [0xC5EC, 0x0334, 0x11AE], NFC: [0xC5EC, 0x0334, 0x11AE], NFD: [0x110B, 0x1167, 0x0334, 0x11AE], NFKC: [0xC5EC, 0x0334, 0x11AE], NFKD: [0x110B, 0x1167, 0x0334, 0x11AE] }, +{ source: [0xC640, 0x0334, 0x11B5], NFC: [0xC640, 0x0334, 0x11B5], NFD: [0x110B, 0x116A, 0x0334, 0x11B5], NFKC: [0xC640, 0x0334, 0x11B5], NFKD: [0x110B, 0x116A, 0x0334, 0x11B5] }, +{ source: [0xC694, 0x0334, 0x11BC], NFC: [0xC694, 0x0334, 0x11BC], NFD: [0x110B, 0x116D, 0x0334, 0x11BC], NFKC: [0xC694, 0x0334, 0x11BC], NFKD: [0x110B, 0x116D, 0x0334, 0x11BC] }, +{ source: [0xC758, 0x0334, 0x11AE], NFC: [0xC758, 0x0334, 0x11AE], NFD: [0x110B, 0x1174, 0x0334, 0x11AE], NFKC: [0xC758, 0x0334, 0x11AE], NFKD: [0x110B, 0x1174, 0x0334, 0x11AE] }, +{ source: [0xC7AC, 0x0334, 0x11B5], NFC: [0xC7AC, 0x0334, 0x11B5], NFD: [0x110C, 0x1162, 0x0334, 0x11B5], NFKC: [0xC7AC, 0x0334, 0x11B5], NFKD: [0x110C, 0x1162, 0x0334, 0x11B5] }, +{ source: [0xC800, 0x0334, 0x11BC], NFC: [0xC800, 0x0334, 0x11BC], NFD: [0x110C, 0x1165, 0x0334, 0x11BC], NFKC: [0xC800, 0x0334, 0x11BC], NFKD: [0x110C, 0x1165, 0x0334, 0x11BC] }, +{ source: [0xC8C4, 0x0334, 0x11AE], NFC: [0xC8C4, 0x0334, 0x11AE], NFD: [0x110C, 0x116C, 0x0334, 0x11AE], NFKC: [0xC8C4, 0x0334, 0x11AE], NFKD: [0x110C, 0x116C, 0x0334, 0x11AE] }, +{ source: [0xC918, 0x0334, 0x11B5], NFC: [0xC918, 0x0334, 0x11B5], NFD: [0x110C, 0x116F, 0x0334, 0x11B5], NFKC: [0xC918, 0x0334, 0x11B5], NFKD: [0x110C, 0x116F, 0x0334, 0x11B5] }, +{ source: [0xC96C, 0x0334, 0x11BC], NFC: [0xC96C, 0x0334, 0x11BC], NFD: [0x110C, 0x1172, 0x0334, 0x11BC], NFKC: [0xC96C, 0x0334, 0x11BC], NFKD: [0x110C, 0x1172, 0x0334, 0x11BC] }, +{ source: [0xCA30, 0x0334, 0x11AE], NFC: [0xCA30, 0x0334, 0x11AE], NFD: [0x110D, 0x1164, 0x0334, 0x11AE], NFKC: [0xCA30, 0x0334, 0x11AE], NFKD: [0x110D, 0x1164, 0x0334, 0x11AE] }, +{ source: [0xCA84, 0x0334, 0x11B5], NFC: [0xCA84, 0x0334, 0x11B5], NFD: [0x110D, 0x1167, 0x0334, 0x11B5], NFKC: [0xCA84, 0x0334, 0x11B5], NFKD: [0x110D, 0x1167, 0x0334, 0x11B5] }, +{ source: [0xCAD8, 0x0334, 0x11BC], NFC: [0xCAD8, 0x0334, 0x11BC], NFD: [0x110D, 0x116A, 0x0334, 0x11BC], NFKC: [0xCAD8, 0x0334, 0x11BC], NFKD: [0x110D, 0x116A, 0x0334, 0x11BC] }, +{ source: [0xCB9C, 0x0334, 0x11AE], NFC: [0xCB9C, 0x0334, 0x11AE], NFD: [0x110D, 0x1171, 0x0334, 0x11AE], NFKC: [0xCB9C, 0x0334, 0x11AE], NFKD: [0x110D, 0x1171, 0x0334, 0x11AE] }, +{ source: [0xCBF0, 0x0334, 0x11B5], NFC: [0xCBF0, 0x0334, 0x11B5], NFD: [0x110D, 0x1174, 0x0334, 0x11B5], NFKC: [0xCBF0, 0x0334, 0x11B5], NFKD: [0x110D, 0x1174, 0x0334, 0x11B5] }, +{ source: [0xCC44, 0x0334, 0x11BC], NFC: [0xCC44, 0x0334, 0x11BC], NFD: [0x110E, 0x1162, 0x0334, 0x11BC], NFKC: [0xCC44, 0x0334, 0x11BC], NFKD: [0x110E, 0x1162, 0x0334, 0x11BC] }, +{ source: [0xCD08, 0x0334, 0x11AE], NFC: [0xCD08, 0x0334, 0x11AE], NFD: [0x110E, 0x1169, 0x0334, 0x11AE], NFKC: [0xCD08, 0x0334, 0x11AE], NFKD: [0x110E, 0x1169, 0x0334, 0x11AE] }, +{ source: [0xCD5C, 0x0334, 0x11B5], NFC: [0xCD5C, 0x0334, 0x11B5], NFD: [0x110E, 0x116C, 0x0334, 0x11B5], NFKC: [0xCD5C, 0x0334, 0x11B5], NFKD: [0x110E, 0x116C, 0x0334, 0x11B5] }, +{ source: [0xCDB0, 0x0334, 0x11BC], NFC: [0xCDB0, 0x0334, 0x11BC], NFD: [0x110E, 0x116F, 0x0334, 0x11BC], NFKC: [0xCDB0, 0x0334, 0x11BC], NFKD: [0x110E, 0x116F, 0x0334, 0x11BC] }, +{ source: [0xCE74, 0x0334, 0x11AE], NFC: [0xCE74, 0x0334, 0x11AE], NFD: [0x110F, 0x1161, 0x0334, 0x11AE], NFKC: [0xCE74, 0x0334, 0x11AE], NFKD: [0x110F, 0x1161, 0x0334, 0x11AE] }, +{ source: [0xCEC8, 0x0334, 0x11B5], NFC: [0xCEC8, 0x0334, 0x11B5], NFD: [0x110F, 0x1164, 0x0334, 0x11B5], NFKC: [0xCEC8, 0x0334, 0x11B5], NFKD: [0x110F, 0x1164, 0x0334, 0x11B5] }, +{ source: [0xCF1C, 0x0334, 0x11BC], NFC: [0xCF1C, 0x0334, 0x11BC], NFD: [0x110F, 0x1167, 0x0334, 0x11BC], NFKC: [0xCF1C, 0x0334, 0x11BC], NFKD: [0x110F, 0x1167, 0x0334, 0x11BC] }, +{ source: [0xCFE0, 0x0334, 0x11AE], NFC: [0xCFE0, 0x0334, 0x11AE], NFD: [0x110F, 0x116E, 0x0334, 0x11AE], NFKC: [0xCFE0, 0x0334, 0x11AE], NFKD: [0x110F, 0x116E, 0x0334, 0x11AE] }, +{ source: [0xD034, 0x0334, 0x11B5], NFC: [0xD034, 0x0334, 0x11B5], NFD: [0x110F, 0x1171, 0x0334, 0x11B5], NFKC: [0xD034, 0x0334, 0x11B5], NFKD: [0x110F, 0x1171, 0x0334, 0x11B5] }, +{ source: [0xD088, 0x0334, 0x11BC], NFC: [0xD088, 0x0334, 0x11BC], NFD: [0x110F, 0x1174, 0x0334, 0x11BC], NFKC: [0xD088, 0x0334, 0x11BC], NFKD: [0x110F, 0x1174, 0x0334, 0x11BC] }, +{ source: [0xD14C, 0x0334, 0x11AE], NFC: [0xD14C, 0x0334, 0x11AE], NFD: [0x1110, 0x1166, 0x0334, 0x11AE], NFKC: [0xD14C, 0x0334, 0x11AE], NFKD: [0x1110, 0x1166, 0x0334, 0x11AE] }, +{ source: [0xD1A0, 0x0334, 0x11B5], NFC: [0xD1A0, 0x0334, 0x11B5], NFD: [0x1110, 0x1169, 0x0334, 0x11B5], NFKC: [0xD1A0, 0x0334, 0x11B5], NFKD: [0x1110, 0x1169, 0x0334, 0x11B5] }, +{ source: [0xD1F4, 0x0334, 0x11BC], NFC: [0xD1F4, 0x0334, 0x11BC], NFD: [0x1110, 0x116C, 0x0334, 0x11BC], NFKC: [0xD1F4, 0x0334, 0x11BC], NFKD: [0x1110, 0x116C, 0x0334, 0x11BC] }, +{ source: [0xD2B8, 0x0334, 0x11AE], NFC: [0xD2B8, 0x0334, 0x11AE], NFD: [0x1110, 0x1173, 0x0334, 0x11AE], NFKC: [0xD2B8, 0x0334, 0x11AE], NFKD: [0x1110, 0x1173, 0x0334, 0x11AE] }, +{ source: [0xD30C, 0x0334, 0x11B5], NFC: [0xD30C, 0x0334, 0x11B5], NFD: [0x1111, 0x1161, 0x0334, 0x11B5], NFKC: [0xD30C, 0x0334, 0x11B5], NFKD: [0x1111, 0x1161, 0x0334, 0x11B5] }, +{ source: [0xD360, 0x0334, 0x11BC], NFC: [0xD360, 0x0334, 0x11BC], NFD: [0x1111, 0x1164, 0x0334, 0x11BC], NFKC: [0xD360, 0x0334, 0x11BC], NFKD: [0x1111, 0x1164, 0x0334, 0x11BC] }, +{ source: [0xD424, 0x0334, 0x11AE], NFC: [0xD424, 0x0334, 0x11AE], NFD: [0x1111, 0x116B, 0x0334, 0x11AE], NFKC: [0xD424, 0x0334, 0x11AE], NFKD: [0x1111, 0x116B, 0x0334, 0x11AE] }, +{ source: [0xD478, 0x0334, 0x11B5], NFC: [0xD478, 0x0334, 0x11B5], NFD: [0x1111, 0x116E, 0x0334, 0x11B5], NFKC: [0xD478, 0x0334, 0x11B5], NFKD: [0x1111, 0x116E, 0x0334, 0x11B5] }, +{ source: [0xD4CC, 0x0334, 0x11BC], NFC: [0xD4CC, 0x0334, 0x11BC], NFD: [0x1111, 0x1171, 0x0334, 0x11BC], NFKC: [0xD4CC, 0x0334, 0x11BC], NFKD: [0x1111, 0x1171, 0x0334, 0x11BC] }, +{ source: [0xD590, 0x0334, 0x11AE], NFC: [0xD590, 0x0334, 0x11AE], NFD: [0x1112, 0x1163, 0x0334, 0x11AE], NFKC: [0xD590, 0x0334, 0x11AE], NFKD: [0x1112, 0x1163, 0x0334, 0x11AE] }, +{ source: [0xD5E4, 0x0334, 0x11B5], NFC: [0xD5E4, 0x0334, 0x11B5], NFD: [0x1112, 0x1166, 0x0334, 0x11B5], NFKC: [0xD5E4, 0x0334, 0x11B5], NFKD: [0x1112, 0x1166, 0x0334, 0x11B5] }, +{ source: [0xD638, 0x0334, 0x11BC], NFC: [0xD638, 0x0334, 0x11BC], NFD: [0x1112, 0x1169, 0x0334, 0x11BC], NFKC: [0xD638, 0x0334, 0x11BC], NFKD: [0x1112, 0x1169, 0x0334, 0x11BC] }, +{ source: [0xD6FC, 0x0334, 0x11AE], NFC: [0xD6FC, 0x0334, 0x11AE], NFD: [0x1112, 0x1170, 0x0334, 0x11AE], NFKC: [0xD6FC, 0x0334, 0x11AE], NFKD: [0x1112, 0x1170, 0x0334, 0x11AE] }, +{ source: [0xD750, 0x0334, 0x11B5], NFC: [0xD750, 0x0334, 0x11B5], NFD: [0x1112, 0x1173, 0x0334, 0x11B5], NFKC: [0xD750, 0x0334, 0x11B5], NFKD: [0x1112, 0x1173, 0x0334, 0x11B5] }, +{ source: [0x11131, 0x0334, 0x11127], NFC: [0x11131, 0x0334, 0x11127], NFD: [0x11131, 0x0334, 0x11127], NFKC: [0x11131, 0x0334, 0x11127], NFKD: [0x11131, 0x0334, 0x11127] }, +{ source: [0x11132, 0x0334, 0x11127], NFC: [0x11132, 0x0334, 0x11127], NFD: [0x11132, 0x0334, 0x11127], NFKC: [0x11132, 0x0334, 0x11127], NFKD: [0x11132, 0x0334, 0x11127] }, +{ source: [0x11347, 0x0334, 0x1133E], NFC: [0x11347, 0x0334, 0x1133E], NFD: [0x11347, 0x0334, 0x1133E], NFKC: [0x11347, 0x0334, 0x1133E], NFKD: [0x11347, 0x0334, 0x1133E] }, +{ source: [0x11347, 0x0334, 0x11357], NFC: [0x11347, 0x0334, 0x11357], NFD: [0x11347, 0x0334, 0x11357], NFKC: [0x11347, 0x0334, 0x11357], NFKD: [0x11347, 0x0334, 0x11357] }, +{ source: [0x114B9, 0x0334, 0x114B0], NFC: [0x114B9, 0x0334, 0x114B0], NFD: [0x114B9, 0x0334, 0x114B0], NFKC: [0x114B9, 0x0334, 0x114B0], NFKD: [0x114B9, 0x0334, 0x114B0] }, +{ source: [0x114B9, 0x0334, 0x114BA], NFC: [0x114B9, 0x0334, 0x114BA], NFD: [0x114B9, 0x0334, 0x114BA], NFKC: [0x114B9, 0x0334, 0x114BA], NFKD: [0x114B9, 0x0334, 0x114BA] }, +{ source: [0x114B9, 0x0334, 0x114BD], NFC: [0x114B9, 0x0334, 0x114BD], NFD: [0x114B9, 0x0334, 0x114BD], NFKC: [0x114B9, 0x0334, 0x114BD], NFKD: [0x114B9, 0x0334, 0x114BD] }, +{ source: [0x115B8, 0x0334, 0x115AF], NFC: [0x115B8, 0x0334, 0x115AF], NFD: [0x115B8, 0x0334, 0x115AF], NFKC: [0x115B8, 0x0334, 0x115AF], NFKD: [0x115B8, 0x0334, 0x115AF] }, +{ source: [0x115B9, 0x0334, 0x115AF], NFC: [0x115B9, 0x0334, 0x115AF], NFD: [0x115B9, 0x0334, 0x115AF], NFKC: [0x115B9, 0x0334, 0x115AF], NFKD: [0x115B9, 0x0334, 0x115AF] }, +{ source: [0x11935, 0x0334, 0x11930], NFC: [0x11935, 0x0334, 0x11930], NFD: [0x11935, 0x0334, 0x11930], NFKC: [0x11935, 0x0334, 0x11930], NFKD: [0x11935, 0x0334, 0x11930] } +]; diff --git a/test/staging/sm/String/normalize-generic.js b/test/staging/sm/String/normalize-generic.js new file mode 100644 index 0000000000..fe3d458cc8 --- /dev/null +++ b/test/staging/sm/String/normalize-generic.js @@ -0,0 +1,29 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-String-shell.js, sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +var BUGNUMBER = 918987; +var summary = 'String.prototype.normalize - normalize no String object'; + +print(BUGNUMBER + ": " + summary); + +function test() { + var myobj = { + toString: () => "a\u0301", + normalize: String.prototype.normalize + }; + assert.sameValue(myobj.normalize(), "\u00E1"); +} + +if ("normalize" in String.prototype) { + // String.prototype.normalize is not enabled in all builds. + test(); +} + diff --git a/test/staging/sm/String/normalize-parameter.js b/test/staging/sm/String/normalize-parameter.js new file mode 100644 index 0000000000..141d2f4e2a --- /dev/null +++ b/test/staging/sm/String/normalize-parameter.js @@ -0,0 +1,28 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-String-shell.js, sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +var BUGNUMBER = 918987; +var summary = 'String.prototype.normalize - passing wrong parameter'; + +print(BUGNUMBER + ": " + summary); + +function test() { + assertThrowsInstanceOf(() => "abc".normalize("NFE"), RangeError, + "String.prototype.normalize should raise RangeError on invalid form"); + + assert.sameValue("".normalize(), ""); +} + +if ("normalize" in String.prototype) { + // String.prototype.normalize is not enabled in all builds. + test(); +} + diff --git a/test/staging/sm/String/normalize-rope.js b/test/staging/sm/String/normalize-rope.js new file mode 100644 index 0000000000..31529d423f --- /dev/null +++ b/test/staging/sm/String/normalize-rope.js @@ -0,0 +1,32 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-String-shell.js, sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +var BUGNUMBER = 918987; +var summary = 'String.prototype.normalize - normalize rope string'; + +print(BUGNUMBER + ": " + summary); + +function test() { + /* JSRope test */ + var a = ""; + var b = ""; + for (var i = 0; i < 100; i++) { + a += "\u0100"; + b += "\u0041\u0304"; + } + assert.sameValue(a.normalize("NFD"), b); +} + +if ("normalize" in String.prototype) { + // String.prototype.normalize is not enabled in all builds. + test(); +} + diff --git a/test/staging/sm/String/raw.js b/test/staging/sm/String/raw.js new file mode 100644 index 0000000000..e1df924a39 --- /dev/null +++ b/test/staging/sm/String/raw.js @@ -0,0 +1,65 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-String-shell.js, sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +var BUGNUMBER = 1039774; +var summary = 'String.raw'; + +print(BUGNUMBER + ": " + summary); + +assertThrowsInstanceOf(function() { String.raw(); }, TypeError); + +assert.sameValue(String.raw.length, 1); + +var cooked = []; +assertThrowsInstanceOf(function() { String.raw(cooked); }, TypeError); + +cooked.raw = {}; +assert.sameValue(String.raw(cooked), ""); + +cooked.raw = {lengt: 0}; +assert.sameValue(String.raw(cooked), ""); + +cooked.raw = {length: 0}; +assert.sameValue(String.raw(cooked), ""); + +cooked.raw = {length: -1}; +assert.sameValue(String.raw(cooked), ""); + +cooked.raw = []; +assert.sameValue(String.raw(cooked), ""); + +cooked.raw = ["a"]; +assert.sameValue(String.raw(cooked), "a"); + +cooked.raw = ["a", "b"]; +assert.sameValue(String.raw(cooked, "x"), "axb"); + +cooked.raw = ["a", "b"]; +assert.sameValue(String.raw(cooked, "x", "y"), "axb"); + +cooked.raw = ["a", "b", "c"]; +assert.sameValue(String.raw(cooked, "x"), "axbc"); + +cooked.raw = ["a", "b", "c"]; +assert.sameValue(String.raw(cooked, "x", "y"), "axbyc"); + +cooked.raw = ["\n", "\r\n", "\r"]; +assert.sameValue(String.raw(cooked, "x", "y"), "\nx\r\ny\r"); + +cooked.raw = ["\n", "\r\n", "\r"]; +assert.sameValue(String.raw(cooked, "\r\r", "\n"), "\n\r\r\r\n\n\r"); + +cooked.raw = {length: 2, '0':"a", '1':"b", '2':"c"}; +assert.sameValue(String.raw(cooked, "x", "y"), "axb"); + +cooked.raw = {length: 4, '0':"a", '1':"b", '2':"c"}; +assert.sameValue(String.raw(cooked, "x", "y"), "axbycundefined"); + diff --git a/test/staging/sm/String/regress-369778.js b/test/staging/sm/String/regress-369778.js new file mode 100644 index 0000000000..92400e31df --- /dev/null +++ b/test/staging/sm/String/regress-369778.js @@ -0,0 +1,37 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-String-shell.js, sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +/* Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/publicdomain/zero/1.0/ */ + +var BUGNUMBER = 369778; +var summary = + "RegExpStatics::makeMatch should make an undefined value when the last " + + "match had an undefined capture."; + +print(BUGNUMBER + ": " + summary); + +/************** + * BEGIN TEST * + **************/ + +var expected = undefined; +var actual; + +'x'.replace(/x(.)?/g, function(m, group) { actual = group; }) + +print("expected: " + expected) +print("actual: " + actual) + +assert.sameValue(expected, actual) + +/******************************************************************************/ + diff --git a/test/staging/sm/String/replace-GetMethod.js b/test/staging/sm/String/replace-GetMethod.js new file mode 100644 index 0000000000..09b1195792 --- /dev/null +++ b/test/staging/sm/String/replace-GetMethod.js @@ -0,0 +1,33 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-String-shell.js, sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +var BUGNUMBER = 1290655; +var summary = "String.prototype.replace should call GetMethod."; + +print(BUGNUMBER + ": " + summary); + +function create(value) { + return { + [Symbol.replace]: value, + toString() { + return "-"; + } + }; +} + +for (let v of [null, undefined]) { + assert.sameValue("a-a".replace(create(v), "+"), "a+a"); +} + +for (let v of [1, true, Symbol.iterator, "", {}, []]) { + assertThrowsInstanceOf(() => "a-a".replace(create(v)), TypeError); +} + diff --git a/test/staging/sm/String/replace-bad-dollar-single-quote.js b/test/staging/sm/String/replace-bad-dollar-single-quote.js new file mode 100644 index 0000000000..2b76da1c31 --- /dev/null +++ b/test/staging/sm/String/replace-bad-dollar-single-quote.js @@ -0,0 +1,70 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-String-shell.js, sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +let evil = new RegExp(); + +// https://tc39.es/ecma262/#sec-getsubstitution + +// Input: position = 0 +// Step 2: matchLength = 7 +// Step 4: stringLength = 3 +// Step 8: tailPos = position + matchLength = 7 +// +// tailPos ≥ stringLength, so $' is replaced with the empty string. + +evil.exec = () => ({ 0: "1234567", length: 1, index: 0 }); +assert.sameValue("abc".replace(evil, "$'"), ""); + + +// Input: position = 3 +// Step 2: matchLength = 1 +// Step 4: stringLength = 3 +// Step 8: tailPos = position + matchLength = 4 +// +// tailPos ≥ stringLength, so $' is replaced with the empty string. + +evil.exec = () => ({ 0: "x", length: 1, index: 3 }); +assert.sameValue("abc".replace(evil, "$'"), "abc"); + + +// Input: position = 2 +// Step 2: matchLength = 1 +// Step 4: stringLength = 3 +// Step 8: tailPos = position + matchLength = 3 +// +// tailPos ≥ stringLength, so $' is replaced with the empty string. + +evil.exec = () => ({ 0: "x", length: 1, index: 2 }); +assert.sameValue("abc".replace(evil, "$'"), "ab"); + + +// Input: position = 2 +// Step 2: matchLength = 1 +// Step 4: stringLength = 4 +// Step 8: tailPos = position + matchLength = 3 +// +// tailPos < stringLength, so $' is replaced with |"abcd".sustring(tailPos)| = "d". + +evil.exec = () => ({ 0: "x", length: 1, index: 2 }); +assert.sameValue("abcd".replace(evil, "$'"), "abdd"); + + +// Input: position = 2 +// Step 2: matchLength = 1 +// Step 4: stringLength = 5 +// Step 8: tailPos = position + matchLength = 3 +// +// tailPos < stringLength, so $' is replaced with |"abcd".sustring(tailPos)| = "de". + +evil.exec = () => ({ 0: "x", length: 1, index: 2 }); +assert.sameValue("abcde".replace(evil, "$'"), "abdede"); + + diff --git a/test/staging/sm/String/replace-flags.js b/test/staging/sm/String/replace-flags.js new file mode 100644 index 0000000000..a2743672dc --- /dev/null +++ b/test/staging/sm/String/replace-flags.js @@ -0,0 +1,34 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-String-shell.js, sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +var BUGNUMBER = 1108382; +var summary = 'Remove non-standard flag argument from String.prototype.{search,match,replace}.'; + +printBugNumber(BUGNUMBER); +printStatus (summary); + +var result = "bbbAa".match("a", "i"); +assert.sameValue(result.index, 4); +assert.sameValue(result.length, 1); +assert.sameValue(result[0], "a"); + +result = "bbbA".match("a", "i"); +assert.sameValue(result, null); + +result = "bbbAa".search("a", "i"); +assert.sameValue(result, 4); + +result = "bbbA".search("a", "i"); +assert.sameValue(result, -1); + +result = "bbbAaa".replace("a", "b", "g"); +assert.sameValue(result, "bbbAba"); + diff --git a/test/staging/sm/String/replace-math.js b/test/staging/sm/String/replace-math.js new file mode 100644 index 0000000000..6b1ef0c9c6 --- /dev/null +++ b/test/staging/sm/String/replace-math.js @@ -0,0 +1,43 @@ +/* + * Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/licenses/publicdomain/ + */ + +/*--- +includes: [sm/non262-String-shell.js, sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +var BUGNUMBER = 805121; +var summary = "Be more careful with string math to avoid wrong results"; + +print(BUGNUMBER + ": " + summary); + +/******************************************************************************/ + +function puff(x, n) +{ + while(x.length < n) + x += x; + return x.substring(0, n); +} + +var x = puff("1", 1 << 20); +var rep = puff("$1", 1 << 16); + +try +{ + var y = x.replace(/(.+)/g, rep); + assert.sameValue(y.length, Math.pow(2, 36)); +} +catch (e) +{ + // OOM also acceptable +} + +/******************************************************************************/ + +print("Tests complete"); diff --git a/test/staging/sm/String/replace-throws-nonwritable-lastIndex-global.js b/test/staging/sm/String/replace-throws-nonwritable-lastIndex-global.js new file mode 100644 index 0000000000..073a0011b4 --- /dev/null +++ b/test/staging/sm/String/replace-throws-nonwritable-lastIndex-global.js @@ -0,0 +1,131 @@ +/* + * Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/licenses/publicdomain/ + */ + +/*--- +includes: [sm/non262-String-shell.js, sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +var BUGNUMBER = 501739; +var summary = + "String.prototype.replace should throw when called with a global RegExp " + + "whose .lastIndex is non-writable"; + +print(BUGNUMBER + ": " + summary); + +/************** + * BEGIN TEST * + **************/ + +var s = '0x2x4x6x8'; + +// First time with .lastIndex === 0, replacing to '' + +var p1 = /x/g; +Object.defineProperty(p1, "lastIndex", { writable: false }); + +try +{ + s.replace(p1, ''); + throw "didn't throw"; +} +catch (e) +{ + assert.sameValue(e instanceof TypeError, true, + "should have thrown a TypeError, instead got: " + e); + assert.sameValue(p1.lastIndex, 0); +} + +// Second time with .lastIndex !== 0, replacing to '' + +var p2 = /x/g; +Object.defineProperty(p2, "lastIndex", { writable: false, value: 3 }); + +try +{ + s.replace(p2, ''); + throw "didn't throw"; +} +catch (e) +{ + assert.sameValue(e instanceof TypeError, true, + "should have thrown a TypeError, instead got: " + e); + assert.sameValue(p2.lastIndex, 3); +} + +// Third time with .lastIndex === 0, replacing to 'y' + +var p3 = /x/g; +Object.defineProperty(p3, "lastIndex", { writable: false }); + +try +{ + s.replace(p3, 'y'); + throw "didn't throw"; +} +catch (e) +{ + assert.sameValue(e instanceof TypeError, true, + "should have thrown a TypeError, instead got: " + e); + assert.sameValue(p3.lastIndex, 0); +} + +// Fourth time with .lastIndex !== 0, replacing to 'y' + +var p4 = /x/g; +Object.defineProperty(p4, "lastIndex", { writable: false, value: 3 }); + +try +{ + s.replace(p4, ''); + throw "didn't throw"; +} +catch (e) +{ + assert.sameValue(e instanceof TypeError, true, + "should have thrown a TypeError, instead got: " + e); + assert.sameValue(p4.lastIndex, 3); +} + +// Fifth time with .lastIndex === 0, replacing to 'y', but no match + +var p5 = /q/g; +Object.defineProperty(p5, "lastIndex", { writable: false }); + +try +{ + s.replace(p5, 'y'); + throw "didn't throw"; +} +catch (e) +{ + assert.sameValue(e instanceof TypeError, true, + "should have thrown a TypeError, instead got: " + e); + assert.sameValue(p5.lastIndex, 0); +} + +// Sixth time with .lastIndex !== 0, replacing to 'y', but no match + +var p6 = /q/g; +Object.defineProperty(p6, "lastIndex", { writable: false, value: 3 }); + +try +{ + s.replace(p6, ''); + throw "didn't throw"; +} +catch (e) +{ + assert.sameValue(e instanceof TypeError, true, + "should have thrown a TypeError, instead got: " + e); + assert.sameValue(p6.lastIndex, 3); +} + +/******************************************************************************/ + +print("Tests complete"); diff --git a/test/staging/sm/String/replace-updates-global-lastIndex.js b/test/staging/sm/String/replace-updates-global-lastIndex.js new file mode 100644 index 0000000000..290b78c3fe --- /dev/null +++ b/test/staging/sm/String/replace-updates-global-lastIndex.js @@ -0,0 +1,43 @@ +/* + * Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/licenses/publicdomain/ + */ + +/*--- +includes: [sm/non262-String-shell.js, sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +var BUGNUMBER = 501739; +var summary = + "String.prototype.relace should zero the .lastIndex when called with a " + + "global RegExp"; + +print(BUGNUMBER + ": " + summary); + +/************** + * BEGIN TEST * + **************/ + +var s = '0x2x4x6x8'; + +var p1 = /x/g; +p1.lastIndex = 3; +s.replace(p1, ''); +assert.sameValue(p1.lastIndex, 0); + +var p2 = /x/g; +p2.lastIndex = 3; +var c = 0; +s.replace(p2, function(s) { + assert.sameValue(p2.lastIndex++, c++); + return 'y'; +}); +assert.sameValue(p2.lastIndex, 4); + +/******************************************************************************/ + +print("Tests complete"); diff --git a/test/staging/sm/String/replace.js b/test/staging/sm/String/replace.js new file mode 100644 index 0000000000..a5510159b6 --- /dev/null +++ b/test/staging/sm/String/replace.js @@ -0,0 +1,28 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-String-shell.js, sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +var BUGNUMBER = 887016; +var summary = "Call RegExp.prototype[@@replace] from String.prototype.replace."; + +print(BUGNUMBER + ": " + summary); + +var called = 0; +var myRegExp = { + [Symbol.replace](S, R) { + assert.sameValue(S, "abcAbcABC"); + assert.sameValue(R, "foo"); + called++; + return 42; + } +}; +assert.sameValue("abcAbcABC".replace(myRegExp, "foo"), 42); +assert.sameValue(called, 1); + diff --git a/test/staging/sm/String/replaceAll.js b/test/staging/sm/String/replaceAll.js new file mode 100644 index 0000000000..df91f2ac37 --- /dev/null +++ b/test/staging/sm/String/replaceAll.js @@ -0,0 +1,224 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-String-shell.js, sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +function neverCalled() { + assert.sameValue(true, false, "unexpected call"); +} + +const g = createNewGlobal(); + +assert.sameValue(typeof String.prototype.replaceAll, "function"); +assert.sameValue(String.prototype.replaceAll.length, 2); +assert.sameValue(String.prototype.replaceAll.name, "replaceAll"); + +// Throws if called with undefined or null. +assertThrowsInstanceOf(() => String.prototype.replaceAll.call(undefined), TypeError); +assertThrowsInstanceOf(() => String.prototype.replaceAll.call(null), TypeError); + +// Throws if called with a non-global RegExp. +assertThrowsInstanceOf(() => "".replaceAll(/a/, ""), TypeError); +assertThrowsInstanceOf(() => "".replaceAll(g.RegExp(""), ""), TypeError); + +// Also throws with RegExp-like objects. +assertThrowsInstanceOf(() => { + "".replaceAll({[Symbol.match]: neverCalled, flags: ""}, ""); +}, TypeError); + +// |flags| property mustn't be undefined or null. +assertThrowsInstanceOf(() => { + "".replaceAll({[Symbol.match]: neverCalled, flags: undefined}, ""); +}, TypeError); +assertThrowsInstanceOf(() => { + "".replaceAll({[Symbol.match]: neverCalled, flags: null}, ""); +}, TypeError); + +// Global RegExp (or RegExp-like) simply redirect to @@replace. +assert.sameValue("aba".replace(/a/g, "c"), "cbc"); +assert.sameValue("aba".replace(g.RegExp("a", "g"), "c"), "cbc"); +assert.sameValue("aba".replace({ + [Symbol.match]: true, + [Symbol.replace]: () => "ok", + flags: "flags has 'g' character", +}, ""), "ok"); + +// Applies ToString on the replace-function return value. +assert.sameValue("aa".replaceAll("a", () => ({toString(){ return 1; }})), "11"); +assert.sameValue("aa".replaceAll("a", () => ({valueOf(){ return 1; }})), "[object Object][object Object]"); + +const replacer = { + "$$": function(searchString, position, string) { + "use strict"; + assert.sameValue(this, undefined); + + return "$"; + }, + "$$-$$": function(searchString, position, string) { + "use strict"; + assert.sameValue(this, undefined); + + return "$-$"; + }, + "$&": function(searchString, position, string) { + "use strict"; + assert.sameValue(this, undefined); + + return string.substring(position, position + searchString.length); + }, + "$&-$&": function(searchString, position, string) { + "use strict"; + assert.sameValue(this, undefined); + + var s = string.substring(position, position + searchString.length); + return `${s}-${s}`; + }, + "$`": function(searchString, position, string) { + "use strict"; + assert.sameValue(this, undefined); + + return string.substring(0, position); + }, + "$`-$`": function(searchString, position, string) { + "use strict"; + assert.sameValue(this, undefined); + + var s = string.substring(0, position); + return `${s}-${s}`; + }, + "$'": function(searchString, position, string) { + "use strict"; + assert.sameValue(this, undefined); + + return string.substring(position + searchString.length); + }, + "$'-$'": function(searchString, position, string) { + "use strict"; + assert.sameValue(this, undefined); + + var s = string.substring(position + searchString.length); + return `${s}-${s}`; + }, + "A": function(searchString, position, string) { + "use strict"; + assert.sameValue(this, undefined); + + return "A"; + }, + "A-B": function(searchString, position, string) { + "use strict"; + assert.sameValue(this, undefined); + + return "A-B"; + }, + "": function(searchString, position, string) { + "use strict"; + assert.sameValue(this, undefined); + + return ""; + }, +}; + +// Tests when |pattern| is longer than |string|. +{ + const tests = [ + { string: "", pattern: "a" }, + { string: "a", pattern: "ab" }, + { string: "", pattern: "α" }, + { string: "α", pattern: "αβ" }, + ]; + + for (let [replacementString, replacementFunction] of Object.entries(replacer)) { + for (let {string, pattern} of tests) { + let a = string.replaceAll(pattern, replacementString); + let b = string.replaceAll(pattern, replacementFunction); + let expected = string.replace(RegExp(pattern, "g"), replacementString); + assert.sameValue(a, expected); + assert.sameValue(b, expected); + assert.sameValue(expected, string); + } + } +} + +// Tests when |pattern| doesn't match once. + { + const tests = [ + { string: "a", pattern: "A" }, + { string: "ab", pattern: "A" }, + { string: "ab", pattern: "AB" }, + + { string: "α", pattern: "Γ" }, + { string: "αβ", pattern: "Γ" }, + { string: "αβ", pattern: "ΓΔ" }, + ]; + + for (let [replacementString, replacementFunction] of Object.entries(replacer)) { + for (let {string, pattern} of tests) { + let a = string.replaceAll(pattern, replacementString); + let b = string.replaceAll(pattern, replacementFunction); + let expected = string.replace(RegExp(pattern, "g"), replacementString); + assert.sameValue(a, expected); + assert.sameValue(b, expected); + assert.sameValue(expected, string); + } + } +} + +// Tests when |pattern| is the empty string. +{ + const strings = ["", "a", "ab", "α", "αβ"]; + const pattern = ""; + const re = /(?:)/g; + + for (let [replacementString, replacementFunction] of Object.entries(replacer)) { + for (let string of strings) { + let a = string.replaceAll(pattern, replacementString); + let b = string.replaceAll(pattern, replacementFunction); + let expected = string.replace(re, replacementString); + assert.sameValue(a, expected); + assert.sameValue(b, expected); + } + } +} + +// Tests when |pattern| isn't the empty string. +{ + const tests = [ + { + strings: [ + "a", "b", + "aa", "ab", "ba", "bb", + "aaa", "aab", "aba", "abb", "baa", "bab", "bba", "bbb", + ], + pattern: "a", + }, + { + strings: [ + "α", "β", + "αα", "αβ", "βα", "ββ", + "ααα", "ααβ", "αβα", "αββ", "βαα", "βαβ", "ββα", "βββ", + ], + pattern: "α", + }, + ]; + + for (let {strings, pattern} of tests) { + let re = RegExp(pattern, "g"); + for (let [replacementString, replacementFunction] of Object.entries(replacer)) { + for (let string of strings) { + let a = string.replaceAll(pattern, replacementString); + let b = string.replaceAll(pattern, replacementFunction); + let expected = string.replace(re, replacementString); + assert.sameValue(a, expected); + assert.sameValue(b, expected); + } + } + } +} + diff --git a/test/staging/sm/String/search-GetMethod.js b/test/staging/sm/String/search-GetMethod.js new file mode 100644 index 0000000000..e393ce2c98 --- /dev/null +++ b/test/staging/sm/String/search-GetMethod.js @@ -0,0 +1,33 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-String-shell.js, sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +var BUGNUMBER = 1290655; +var summary = "String.prototype.search should call GetMethod."; + +print(BUGNUMBER + ": " + summary); + +function create(value) { + return { + [Symbol.search]: value, + toString() { + return "-"; + } + }; +} + +for (let v of [null, undefined]) { + assert.sameValue("a-a".search(create(v)), 1); +} + +for (let v of [1, true, Symbol.iterator, "", {}, []]) { + assertThrowsInstanceOf(() => "a-a".search(create(v)), TypeError); +} + diff --git a/test/staging/sm/String/search.js b/test/staging/sm/String/search.js new file mode 100644 index 0000000000..e13d1f0da1 --- /dev/null +++ b/test/staging/sm/String/search.js @@ -0,0 +1,36 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-String-shell.js, sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +var BUGNUMBER = 887016; +var summary = "Call RegExp.prototype[@@search] from String.prototype.search."; + +print(BUGNUMBER + ": " + summary); + +var called = 0; +var myRegExp = { + [Symbol.search](S) { + assert.sameValue(S, "abcAbcABC"); + called++; + return 42; + } +}; +assert.sameValue("abcAbcABC".search(myRegExp), 42); +assert.sameValue(called, 1); + +called = 0; +RegExp.prototype[Symbol.search] = function(S) { + assert.sameValue(S, "abcAbcABC"); + called++; + return 43; +}; +assert.sameValue("abcAbcABC".search("abc"), 43); +assert.sameValue(called, 1); + diff --git a/test/staging/sm/String/split-01.js b/test/staging/sm/String/split-01.js new file mode 100644 index 0000000000..f413f84db4 --- /dev/null +++ b/test/staging/sm/String/split-01.js @@ -0,0 +1,52 @@ +/* + * Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/licenses/publicdomain/ + */ + +/*--- +includes: [sm/non262-String-shell.js, sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +var BUGNUMBER = 614608; +var summary = "String.prototype.split tests"; + +print(BUGNUMBER + ": " + summary); + +/************** + * BEGIN TEST * + **************/ + +function assertEqArr(a1, a2) { + assert.sameValue(a1.length, a2.length); + + for(var i=0; iboldandcoded".split(/<(\/)?([^<>]+)>/), + ["A", undefined, "B", "bold", "/", "B", "and", undefined, + "CODE", "coded", "/", "CODE", ""]); + +print("All tests passed!"); diff --git a/test/staging/sm/String/split-GetMethod.js b/test/staging/sm/String/split-GetMethod.js new file mode 100644 index 0000000000..6a5abd7e48 --- /dev/null +++ b/test/staging/sm/String/split-GetMethod.js @@ -0,0 +1,33 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [deepEqual.js, sm/non262-String-shell.js, sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +var BUGNUMBER = 1290655; +var summary = "String.prototype.split should call GetMethod."; + +print(BUGNUMBER + ": " + summary); + +function create(value) { + return { + [Symbol.split]: value, + toString() { + return "-"; + } + }; +} + +for (let v of [null, undefined]) { + assert.deepEqual("a-a".split(create(v)), ["a", "a"]); +} + +for (let v of [1, true, Symbol.iterator, "", {}, []]) { + assertThrowsInstanceOf(() => "a-a".split(create(v)), TypeError); +} + diff --git a/test/staging/sm/String/split-order.js b/test/staging/sm/String/split-order.js new file mode 100644 index 0000000000..eca5b59402 --- /dev/null +++ b/test/staging/sm/String/split-order.js @@ -0,0 +1,31 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-String-shell.js, sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +var BUGNUMBER = 1287521; +var summary = 'String.prototype.split should call ToUint32(limit) before ToString(separator).'; + +print(BUGNUMBER + ": " + summary); + +var log = []; +"abba".split({ + toString() { + log.push("separator-tostring"); + return "b"; + } +}, { + valueOf() { + log.push("limit-valueOf"); + return 0; + } +}); + +assert.sameValue(log.join(","), "limit-valueOf,separator-tostring"); + diff --git a/test/staging/sm/String/split-undefined-separator.js b/test/staging/sm/String/split-undefined-separator.js new file mode 100644 index 0000000000..d77d093cc5 --- /dev/null +++ b/test/staging/sm/String/split-undefined-separator.js @@ -0,0 +1,42 @@ +/* + * Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/licenses/publicdomain/ + */ + +/*--- +includes: [sm/non262-String-shell.js, sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +var BUGNUMBER = 614608; +var summary = "String.prototype.split with undefined separator"; + +print(BUGNUMBER + ": " + summary); + +/************** + * BEGIN TEST * + **************/ + +function assertEqArr(a1, a2) { + assert.sameValue(a1.length, a2.length); + + for(var i=0; i + * + * Distributed under the terms of the MIT license. + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ +var BUGNUMBER = 614608; +var summary = "String.prototype.split with regexp separator"; + +print(BUGNUMBER + ": " + summary); + +/************** + * BEGIN TEST * + **************/ + +var ecmaSampleRe = /<(\/)?([^<>]+)>/; + +var testCode = [ + ["''.split()", [""]], + ["''.split(/./)", [""]], + ["''.split(/.?/)", []], + ["''.split(/.??/)", []], + ["'ab'.split(/a*/)", ["", "b"]], + ["'ab'.split(/a*?/)", ["a", "b"]], + ["'ab'.split(/(?:ab)/)", ["", ""]], + ["'ab'.split(/(?:ab)*/)", ["", ""]], + ["'ab'.split(/(?:ab)*?/)", ["a", "b"]], + ["'test'.split('')", ["t", "e", "s", "t"]], + ["'test'.split()", ["test"]], + ["'111'.split(1)", ["", "", "", ""]], + ["'test'.split(/(?:)/, 2)", ["t", "e"]], + ["'test'.split(/(?:)/, -1)", ["t", "e", "s", "t"]], + ["'test'.split(/(?:)/, undefined)", ["t", "e", "s", "t"]], + ["'test'.split(/(?:)/, null)", []], + ["'test'.split(/(?:)/, NaN)", []], + ["'test'.split(/(?:)/, true)", ["t"]], + ["'test'.split(/(?:)/, '2')", ["t", "e"]], + ["'test'.split(/(?:)/, 'two')", []], + ["'a'.split(/-/)", ["a"]], + ["'a'.split(/-?/)", ["a"]], + ["'a'.split(/-??/)", ["a"]], + ["'a'.split(/a/)", ["", ""]], + ["'a'.split(/a?/)", ["", ""]], + ["'a'.split(/a??/)", ["a"]], + ["'ab'.split(/-/)", ["ab"]], + ["'ab'.split(/-?/)", ["a", "b"]], + ["'ab'.split(/-??/)", ["a", "b"]], + ["'a-b'.split(/-/)", ["a", "b"]], + ["'a-b'.split(/-?/)", ["a", "b"]], + ["'a-b'.split(/-??/)", ["a", "-", "b"]], + ["'a--b'.split(/-/)", ["a", "", "b"]], + ["'a--b'.split(/-?/)", ["a", "", "b"]], + ["'a--b'.split(/-??/)", ["a", "-", "-", "b"]], + ["''.split(/()()/)", []], + ["'.'.split(/()()/)", ["."]], + ["'.'.split(/(.?)(.?)/)", ["", ".", "", ""]], + ["'.'.split(/(.??)(.??)/)", ["."]], + ["'.'.split(/(.)?(.)?/)", ["", ".", undefined, ""]], + ["'Aboldandcoded'.split(ecmaSampleRe)", + ["A", undefined, "B", "bold", "/", "B", + "and", undefined, "CODE", "coded", "/", + "CODE", ""]], + ["'tesst'.split(/(s)*/)", ["t", undefined, "e", "s", "t"]], + ["'tesst'.split(/(s)*?/)", ["t", undefined, "e", undefined, "s", + undefined, "s", undefined, "t"]], + ["'tesst'.split(/(s*)/)", ["t", "", "e", "ss", "t"]], + ["'tesst'.split(/(s*?)/)", ["t", "", "e", "", "s", "", "s", "", "t"]], + ["'tesst'.split(/(?:s)*/)", ["t", "e", "t"]], + ["'tesst'.split(/(?=s+)/)", ["te", "s", "st"]], + ["'test'.split('t')", ["", "es", ""]], + ["'test'.split('es')", ["t", "t"]], + ["'test'.split(/t/)", ["", "es", ""]], + ["'test'.split(/es/)", ["t", "t"]], + ["'test'.split(/(t)/)", ["", "t", "es", "t", ""]], + ["'test'.split(/(es)/)", ["t", "es", "t"]], + ["'test'.split(/(t)(e)(s)(t)/)", ["", "t", "e", "s", "t", ""]], + ["'.'.split(/(((.((.??)))))/)", ["", ".", ".", ".", "", "", ""]], + ["'.'.split(/(((((.??)))))/)", ["."]] +]; + +function testSplit() { + for (var i = 0; i < testCode.length; i++) { + var actual = eval(testCode[i][0]); + var expected = testCode[i][1]; + + assert.sameValue(actual.length, expected.length); + + for(var j=0; j { + String.prototype.padStart.call(badThis, 42, "oups"); + }, TypeError); + + assertThrowsInstanceOf(() => { + String.prototype.padEnd.call(badThis, 42, "oups"); + }, TypeError); +} + +let proxy = new Proxy({}, { +get(t, name) { + if (name === Symbol.toPrimitive || name === "toString") return; + if (name === "valueOf") return () => 42; + throw "This should not be reachable"; +} +}); + +assert.sameValue("42bloop", String.prototype.padEnd.call(proxy, 7, "bloopie")); + +// maxLength must convert to an integer + +assert.sameValue("lame", "lame".padStart(0, "foo")); +assert.sameValue("lame", "lame".padStart(0.1119, "foo")); +assert.sameValue("lame", "lame".padStart(-0, "foo")); +assert.sameValue("lame", "lame".padStart(NaN, "foo")); +assert.sameValue("lame", "lame".padStart(-1, "foo")); +assert.sameValue("lame", "lame".padStart({toString: () => 0}, "foo")); + +assert.sameValue("lame", "lame".padEnd(0, "foo")); +assert.sameValue("lame", "lame".padEnd(0.1119, "foo")); +assert.sameValue("lame", "lame".padEnd(-0, "foo")); +assert.sameValue("lame", "lame".padEnd(NaN, "foo")); +assert.sameValue("lame", "lame".padEnd(-1, "foo")); +assert.sameValue("lame", "lame".padEnd({toString: () => 0}, "foo")); + +assertThrowsInstanceOf(() => { + "lame".padStart(Symbol("9900"), 0); +}, TypeError); + +assertThrowsInstanceOf(() => { + "lame".padEnd(Symbol("9900"), 0); +}, TypeError); + +// The fill argument must be string coercable. + +assert.sameValue("nulln.", ".".padStart(6, null)); +assert.sameValue(".nulln", ".".padEnd(6, null)); + +assert.sameValue("[obje.", ".".padStart(6, {})); +assert.sameValue(".[obje", ".".padEnd(6, {})); + +assert.sameValue("1,2,3.", ".".padStart(6, [1, 2, 3])); +assert.sameValue(".1,2,3", ".".padEnd(6, [1, 2, 3])); + +assert.sameValue("aaaaa.", ".".padStart(6, {toString: () => "a"})); +assert.sameValue(".aaaaa", ".".padEnd(6, {toString: () => "a"})); + +// undefined is converted to " " + +assert.sameValue(" .", ".".padStart(6, undefined)); +assert.sameValue(". ", ".".padEnd(6, undefined)); + +assert.sameValue(" .", ".".padStart(6)); +assert.sameValue(". ", ".".padEnd(6)); + +// The empty string has no effect + +assert.sameValue("Tilda", "Tilda".padStart(100000, "")); +assert.sameValue("Tilda", "Tilda".padEnd(100000, "")); + +assert.sameValue("Tilda", "Tilda".padStart(100000, {toString: () => ""})); +assert.sameValue("Tilda", "Tilda".padEnd(100000, {toString: () => ""})); + +// Test repetition against a bruteforce implementation + +let filler = "space"; +let truncatedFiller = ""; +for (let i = 0; i < 2500; i++) { + truncatedFiller += filler[i % filler.length]; + assert.sameValue(truncatedFiller + "goto", "goto".padStart(5 + i, filler)); + assert.sameValue("goto" + truncatedFiller, "goto".padEnd(5 + i, filler)); +} + +// [Argument] Length + +assert.sameValue(1, String.prototype.padStart.length) +assert.sameValue(1, String.prototype.padEnd.length) + diff --git a/test/staging/sm/String/string-space-trim.js b/test/staging/sm/String/string-space-trim.js new file mode 100644 index 0000000000..78086fd937 --- /dev/null +++ b/test/staging/sm/String/string-space-trim.js @@ -0,0 +1,49 @@ +/* + * Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/licenses/publicdomain/ + */ + +/*--- +includes: [sm/non262-String-shell.js, sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +/* Generated by make_unicode.py DO NOT MODIFY */ +/* Unicode version: 15.0.0 */ + +var onlySpace = String.fromCharCode( + 0x0009 /* (CHARACTER TABULATION) */, + 0x000A /* (LINE FEED (LF)) */, + 0x000B /* (LINE TABULATION) */, + 0x000C /* (FORM FEED (FF)) */, + 0x000D /* (CARRIAGE RETURN (CR)) */, + 0x0020 /* SPACE */, + 0x00A0 /* NO-BREAK SPACE (NON-BREAKING SPACE) */, + 0x1680 /* OGHAM SPACE MARK */, + 0x2000 /* EN QUAD */, + 0x2001 /* EM QUAD */, + 0x2002 /* EN SPACE */, + 0x2003 /* EM SPACE */, + 0x2004 /* THREE-PER-EM SPACE */, + 0x2005 /* FOUR-PER-EM SPACE */, + 0x2006 /* SIX-PER-EM SPACE */, + 0x2007 /* FIGURE SPACE */, + 0x2008 /* PUNCTUATION SPACE */, + 0x2009 /* THIN SPACE */, + 0x200A /* HAIR SPACE */, + 0x2028 /* LINE SEPARATOR */, + 0x2029 /* PARAGRAPH SEPARATOR */, + 0x202F /* NARROW NO-BREAK SPACE */, + 0x205F /* MEDIUM MATHEMATICAL SPACE */, + 0x3000 /* IDEOGRAPHIC SPACE */, + 0xFEFF /* ZERO WIDTH NO-BREAK SPACE (BYTE ORDER MARK) */ +); + +assert.sameValue(onlySpace.trim(), ""); +assert.sameValue((onlySpace + 'aaaa').trim(), 'aaaa'); +assert.sameValue(('aaaa' + onlySpace).trim(), 'aaaa'); +assert.sameValue((onlySpace + 'aaaa' + onlySpace).trim(), 'aaaa'); + diff --git a/test/staging/sm/String/string-upper-lower-mapping.js b/test/staging/sm/String/string-upper-lower-mapping.js new file mode 100644 index 0000000000..2eb443407a --- /dev/null +++ b/test/staging/sm/String/string-upper-lower-mapping.js @@ -0,0 +1,65564 @@ +/* + * Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/licenses/publicdomain/ + */ + +/*--- +includes: [sm/non262-String-shell.js, sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +/* Generated by make_unicode.py DO NOT MODIFY */ +/* Unicode version: 15.0.0 */ + +var mapping = [ + ["\u0000", "\u0000"], /* (NULL) */ + ["\u0001", "\u0001"], /* (START OF HEADING) */ + ["\u0002", "\u0002"], /* (START OF TEXT) */ + ["\u0003", "\u0003"], /* (END OF TEXT) */ + ["\u0004", "\u0004"], /* (END OF TRANSMISSION) */ + ["\u0005", "\u0005"], /* (ENQUIRY) */ + ["\u0006", "\u0006"], /* (ACKNOWLEDGE) */ + ["\u0007", "\u0007"], /* (BELL) */ + ["\u0008", "\u0008"], /* (BACKSPACE) */ + ["\u0009", "\u0009"], /* (CHARACTER TABULATION) */ + ["\u000A", "\u000A"], /* (LINE FEED (LF)) */ + ["\u000B", "\u000B"], /* (LINE TABULATION) */ + ["\u000C", "\u000C"], /* (FORM FEED (FF)) */ + ["\u000D", "\u000D"], /* (CARRIAGE RETURN (CR)) */ + ["\u000E", "\u000E"], /* (SHIFT OUT) */ + ["\u000F", "\u000F"], /* (SHIFT IN) */ + ["\u0010", "\u0010"], /* (DATA LINK ESCAPE) */ + ["\u0011", "\u0011"], /* (DEVICE CONTROL ONE) */ + ["\u0012", "\u0012"], /* (DEVICE CONTROL TWO) */ + ["\u0013", "\u0013"], /* (DEVICE CONTROL THREE) */ + ["\u0014", "\u0014"], /* (DEVICE CONTROL FOUR) */ + ["\u0015", "\u0015"], /* (NEGATIVE ACKNOWLEDGE) */ + ["\u0016", "\u0016"], /* (SYNCHRONOUS IDLE) */ + ["\u0017", "\u0017"], /* (END OF TRANSMISSION BLOCK) */ + ["\u0018", "\u0018"], /* (CANCEL) */ + ["\u0019", "\u0019"], /* (END OF MEDIUM) */ + ["\u001A", "\u001A"], /* (SUBSTITUTE) */ + ["\u001B", "\u001B"], /* (ESCAPE) */ + ["\u001C", "\u001C"], /* (INFORMATION SEPARATOR FOUR) */ + ["\u001D", "\u001D"], /* (INFORMATION SEPARATOR THREE) */ + ["\u001E", "\u001E"], /* (INFORMATION SEPARATOR TWO) */ + ["\u001F", "\u001F"], /* (INFORMATION SEPARATOR ONE) */ + ["\u0020", "\u0020"], /* SPACE */ + ["\u0021", "\u0021"], /* EXCLAMATION MARK */ + ["\u0022", "\u0022"], /* QUOTATION MARK */ + ["\u0023", "\u0023"], /* NUMBER SIGN */ + ["\u0024", "\u0024"], /* DOLLAR SIGN */ + ["\u0025", "\u0025"], /* PERCENT SIGN */ + ["\u0026", "\u0026"], /* AMPERSAND */ + ["\u0027", "\u0027"], /* APOSTROPHE (APOSTROPHE-QUOTE) */ + ["\u0028", "\u0028"], /* LEFT PARENTHESIS (OPENING PARENTHESIS) */ + ["\u0029", "\u0029"], /* RIGHT PARENTHESIS (CLOSING PARENTHESIS) */ + ["\u002A", "\u002A"], /* ASTERISK */ + ["\u002B", "\u002B"], /* PLUS SIGN */ + ["\u002C", "\u002C"], /* COMMA */ + ["\u002D", "\u002D"], /* HYPHEN-MINUS */ + ["\u002E", "\u002E"], /* FULL STOP (PERIOD) */ + ["\u002F", "\u002F"], /* SOLIDUS (SLASH) */ + ["\u0030", "\u0030"], /* DIGIT ZERO */ + ["\u0031", "\u0031"], /* DIGIT ONE */ + ["\u0032", "\u0032"], /* DIGIT TWO */ + ["\u0033", "\u0033"], /* DIGIT THREE */ + ["\u0034", "\u0034"], /* DIGIT FOUR */ + ["\u0035", "\u0035"], /* DIGIT FIVE */ + ["\u0036", "\u0036"], /* DIGIT SIX */ + ["\u0037", "\u0037"], /* DIGIT SEVEN */ + ["\u0038", "\u0038"], /* DIGIT EIGHT */ + ["\u0039", "\u0039"], /* DIGIT NINE */ + ["\u003A", "\u003A"], /* COLON */ + ["\u003B", "\u003B"], /* SEMICOLON */ + ["\u003C", "\u003C"], /* LESS-THAN SIGN */ + ["\u003D", "\u003D"], /* EQUALS SIGN */ + ["\u003E", "\u003E"], /* GREATER-THAN SIGN */ + ["\u003F", "\u003F"], /* QUESTION MARK */ + ["\u0040", "\u0040"], /* COMMERCIAL AT */ + ["\u0041", "\u0061"], /* LATIN CAPITAL LETTER A */ + ["\u0042", "\u0062"], /* LATIN CAPITAL LETTER B */ + ["\u0043", "\u0063"], /* LATIN CAPITAL LETTER C */ + ["\u0044", "\u0064"], /* LATIN CAPITAL LETTER D */ + ["\u0045", "\u0065"], /* LATIN CAPITAL LETTER E */ + ["\u0046", "\u0066"], /* LATIN CAPITAL LETTER F */ + ["\u0047", "\u0067"], /* LATIN CAPITAL LETTER G */ + ["\u0048", "\u0068"], /* LATIN CAPITAL LETTER H */ + ["\u0049", "\u0069"], /* LATIN CAPITAL LETTER I */ + ["\u004A", "\u006A"], /* LATIN CAPITAL LETTER J */ + ["\u004B", "\u006B"], /* LATIN CAPITAL LETTER K */ + ["\u004C", "\u006C"], /* LATIN CAPITAL LETTER L */ + ["\u004D", "\u006D"], /* LATIN CAPITAL LETTER M */ + ["\u004E", "\u006E"], /* LATIN CAPITAL LETTER N */ + ["\u004F", "\u006F"], /* LATIN CAPITAL LETTER O */ + ["\u0050", "\u0070"], /* LATIN CAPITAL LETTER P */ + ["\u0051", "\u0071"], /* LATIN CAPITAL LETTER Q */ + ["\u0052", "\u0072"], /* LATIN CAPITAL LETTER R */ + ["\u0053", "\u0073"], /* LATIN CAPITAL LETTER S */ + ["\u0054", "\u0074"], /* LATIN CAPITAL LETTER T */ + ["\u0055", "\u0075"], /* LATIN CAPITAL LETTER U */ + ["\u0056", "\u0076"], /* LATIN CAPITAL LETTER V */ + ["\u0057", "\u0077"], /* LATIN CAPITAL LETTER W */ + ["\u0058", "\u0078"], /* LATIN CAPITAL LETTER X */ + ["\u0059", "\u0079"], /* LATIN CAPITAL LETTER Y */ + ["\u005A", "\u007A"], /* LATIN CAPITAL LETTER Z */ + ["\u005B", "\u005B"], /* LEFT SQUARE BRACKET (OPENING SQUARE BRACKET) */ + ["\u005C", "\u005C"], /* REVERSE SOLIDUS (BACKSLASH) */ + ["\u005D", "\u005D"], /* RIGHT SQUARE BRACKET (CLOSING SQUARE BRACKET) */ + ["\u005E", "\u005E"], /* CIRCUMFLEX ACCENT (SPACING CIRCUMFLEX) */ + ["\u005F", "\u005F"], /* LOW LINE (SPACING UNDERSCORE) */ + ["\u0060", "\u0060"], /* GRAVE ACCENT (SPACING GRAVE) */ + ["\u0041", "\u0061"], /* LATIN SMALL LETTER A */ + ["\u0042", "\u0062"], /* LATIN SMALL LETTER B */ + ["\u0043", "\u0063"], /* LATIN SMALL LETTER C */ + ["\u0044", "\u0064"], /* LATIN SMALL LETTER D */ + ["\u0045", "\u0065"], /* LATIN SMALL LETTER E */ + ["\u0046", "\u0066"], /* LATIN SMALL LETTER F */ + ["\u0047", "\u0067"], /* LATIN SMALL LETTER G */ + ["\u0048", "\u0068"], /* LATIN SMALL LETTER H */ + ["\u0049", "\u0069"], /* LATIN SMALL LETTER I */ + ["\u004A", "\u006A"], /* LATIN SMALL LETTER J */ + ["\u004B", "\u006B"], /* LATIN SMALL LETTER K */ + ["\u004C", "\u006C"], /* LATIN SMALL LETTER L */ + ["\u004D", "\u006D"], /* LATIN SMALL LETTER M */ + ["\u004E", "\u006E"], /* LATIN SMALL LETTER N */ + ["\u004F", "\u006F"], /* LATIN SMALL LETTER O */ + ["\u0050", "\u0070"], /* LATIN SMALL LETTER P */ + ["\u0051", "\u0071"], /* LATIN SMALL LETTER Q */ + ["\u0052", "\u0072"], /* LATIN SMALL LETTER R */ + ["\u0053", "\u0073"], /* LATIN SMALL LETTER S */ + ["\u0054", "\u0074"], /* LATIN SMALL LETTER T */ + ["\u0055", "\u0075"], /* LATIN SMALL LETTER U */ + ["\u0056", "\u0076"], /* LATIN SMALL LETTER V */ + ["\u0057", "\u0077"], /* LATIN SMALL LETTER W */ + ["\u0058", "\u0078"], /* LATIN SMALL LETTER X */ + ["\u0059", "\u0079"], /* LATIN SMALL LETTER Y */ + ["\u005A", "\u007A"], /* LATIN SMALL LETTER Z */ + ["\u007B", "\u007B"], /* LEFT CURLY BRACKET (OPENING CURLY BRACKET) */ + ["\u007C", "\u007C"], /* VERTICAL LINE (VERTICAL BAR) */ + ["\u007D", "\u007D"], /* RIGHT CURLY BRACKET (CLOSING CURLY BRACKET) */ + ["\u007E", "\u007E"], /* TILDE */ + ["\u007F", "\u007F"], /* (DELETE) */ + ["\u0080", "\u0080"], /* */ + ["\u0081", "\u0081"], /* */ + ["\u0082", "\u0082"], /* (BREAK PERMITTED HERE) */ + ["\u0083", "\u0083"], /* (NO BREAK HERE) */ + ["\u0084", "\u0084"], /* */ + ["\u0085", "\u0085"], /* (NEXT LINE (NEL)) */ + ["\u0086", "\u0086"], /* (START OF SELECTED AREA) */ + ["\u0087", "\u0087"], /* (END OF SELECTED AREA) */ + ["\u0088", "\u0088"], /* (CHARACTER TABULATION SET) */ + ["\u0089", "\u0089"], /* (CHARACTER TABULATION WITH JUSTIFICATION) */ + ["\u008A", "\u008A"], /* (LINE TABULATION SET) */ + ["\u008B", "\u008B"], /* (PARTIAL LINE FORWARD) */ + ["\u008C", "\u008C"], /* (PARTIAL LINE BACKWARD) */ + ["\u008D", "\u008D"], /* (REVERSE LINE FEED) */ + ["\u008E", "\u008E"], /* (SINGLE SHIFT TWO) */ + ["\u008F", "\u008F"], /* (SINGLE SHIFT THREE) */ + ["\u0090", "\u0090"], /* (DEVICE CONTROL STRING) */ + ["\u0091", "\u0091"], /* (PRIVATE USE ONE) */ + ["\u0092", "\u0092"], /* (PRIVATE USE TWO) */ + ["\u0093", "\u0093"], /* (SET TRANSMIT STATE) */ + ["\u0094", "\u0094"], /* (CANCEL CHARACTER) */ + ["\u0095", "\u0095"], /* (MESSAGE WAITING) */ + ["\u0096", "\u0096"], /* (START OF GUARDED AREA) */ + ["\u0097", "\u0097"], /* (END OF GUARDED AREA) */ + ["\u0098", "\u0098"], /* (START OF STRING) */ + ["\u0099", "\u0099"], /* */ + ["\u009A", "\u009A"], /* (SINGLE CHARACTER INTRODUCER) */ + ["\u009B", "\u009B"], /* (CONTROL SEQUENCE INTRODUCER) */ + ["\u009C", "\u009C"], /* (STRING TERMINATOR) */ + ["\u009D", "\u009D"], /* (OPERATING SYSTEM COMMAND) */ + ["\u009E", "\u009E"], /* (PRIVACY MESSAGE) */ + ["\u009F", "\u009F"], /* (APPLICATION PROGRAM COMMAND) */ + ["\u00A0", "\u00A0"], /* NO-BREAK SPACE (NON-BREAKING SPACE) */ + ["\u00A1", "\u00A1"], /* INVERTED EXCLAMATION MARK */ + ["\u00A2", "\u00A2"], /* CENT SIGN */ + ["\u00A3", "\u00A3"], /* POUND SIGN */ + ["\u00A4", "\u00A4"], /* CURRENCY SIGN */ + ["\u00A5", "\u00A5"], /* YEN SIGN */ + ["\u00A6", "\u00A6"], /* BROKEN BAR (BROKEN VERTICAL BAR) */ + ["\u00A7", "\u00A7"], /* SECTION SIGN */ + ["\u00A8", "\u00A8"], /* DIAERESIS (SPACING DIAERESIS) */ + ["\u00A9", "\u00A9"], /* COPYRIGHT SIGN */ + ["\u00AA", "\u00AA"], /* FEMININE ORDINAL INDICATOR */ + ["\u00AB", "\u00AB"], /* LEFT-POINTING DOUBLE ANGLE QUOTATION MARK (LEFT POINTING GUILLEMET) */ + ["\u00AC", "\u00AC"], /* NOT SIGN */ + ["\u00AD", "\u00AD"], /* SOFT HYPHEN */ + ["\u00AE", "\u00AE"], /* REGISTERED SIGN (REGISTERED TRADE MARK SIGN) */ + ["\u00AF", "\u00AF"], /* MACRON (SPACING MACRON) */ + ["\u00B0", "\u00B0"], /* DEGREE SIGN */ + ["\u00B1", "\u00B1"], /* PLUS-MINUS SIGN (PLUS-OR-MINUS SIGN) */ + ["\u00B2", "\u00B2"], /* SUPERSCRIPT TWO (SUPERSCRIPT DIGIT TWO) */ + ["\u00B3", "\u00B3"], /* SUPERSCRIPT THREE (SUPERSCRIPT DIGIT THREE) */ + ["\u00B4", "\u00B4"], /* ACUTE ACCENT (SPACING ACUTE) */ + ["\u039C", "\u00B5"], /* MICRO SIGN */ + ["\u00B6", "\u00B6"], /* PILCROW SIGN (PARAGRAPH SIGN) */ + ["\u00B7", "\u00B7"], /* MIDDLE DOT */ + ["\u00B8", "\u00B8"], /* CEDILLA (SPACING CEDILLA) */ + ["\u00B9", "\u00B9"], /* SUPERSCRIPT ONE (SUPERSCRIPT DIGIT ONE) */ + ["\u00BA", "\u00BA"], /* MASCULINE ORDINAL INDICATOR */ + ["\u00BB", "\u00BB"], /* RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK (RIGHT POINTING GUILLEMET) */ + ["\u00BC", "\u00BC"], /* VULGAR FRACTION ONE QUARTER (FRACTION ONE QUARTER) */ + ["\u00BD", "\u00BD"], /* VULGAR FRACTION ONE HALF (FRACTION ONE HALF) */ + ["\u00BE", "\u00BE"], /* VULGAR FRACTION THREE QUARTERS (FRACTION THREE QUARTERS) */ + ["\u00BF", "\u00BF"], /* INVERTED QUESTION MARK */ + ["\u00C0", "\u00E0"], /* LATIN CAPITAL LETTER A WITH GRAVE (LATIN CAPITAL LETTER A GRAVE) */ + ["\u00C1", "\u00E1"], /* LATIN CAPITAL LETTER A WITH ACUTE (LATIN CAPITAL LETTER A ACUTE) */ + ["\u00C2", "\u00E2"], /* LATIN CAPITAL LETTER A WITH CIRCUMFLEX (LATIN CAPITAL LETTER A CIRCUMFLEX) */ + ["\u00C3", "\u00E3"], /* LATIN CAPITAL LETTER A WITH TILDE (LATIN CAPITAL LETTER A TILDE) */ + ["\u00C4", "\u00E4"], /* LATIN CAPITAL LETTER A WITH DIAERESIS (LATIN CAPITAL LETTER A DIAERESIS) */ + ["\u00C5", "\u00E5"], /* LATIN CAPITAL LETTER A WITH RING ABOVE (LATIN CAPITAL LETTER A RING) */ + ["\u00C6", "\u00E6"], /* LATIN CAPITAL LETTER AE (LATIN CAPITAL LETTER A E) */ + ["\u00C7", "\u00E7"], /* LATIN CAPITAL LETTER C WITH CEDILLA (LATIN CAPITAL LETTER C CEDILLA) */ + ["\u00C8", "\u00E8"], /* LATIN CAPITAL LETTER E WITH GRAVE (LATIN CAPITAL LETTER E GRAVE) */ + ["\u00C9", "\u00E9"], /* LATIN CAPITAL LETTER E WITH ACUTE (LATIN CAPITAL LETTER E ACUTE) */ + ["\u00CA", "\u00EA"], /* LATIN CAPITAL LETTER E WITH CIRCUMFLEX (LATIN CAPITAL LETTER E CIRCUMFLEX) */ + ["\u00CB", "\u00EB"], /* LATIN CAPITAL LETTER E WITH DIAERESIS (LATIN CAPITAL LETTER E DIAERESIS) */ + ["\u00CC", "\u00EC"], /* LATIN CAPITAL LETTER I WITH GRAVE (LATIN CAPITAL LETTER I GRAVE) */ + ["\u00CD", "\u00ED"], /* LATIN CAPITAL LETTER I WITH ACUTE (LATIN CAPITAL LETTER I ACUTE) */ + ["\u00CE", "\u00EE"], /* LATIN CAPITAL LETTER I WITH CIRCUMFLEX (LATIN CAPITAL LETTER I CIRCUMFLEX) */ + ["\u00CF", "\u00EF"], /* LATIN CAPITAL LETTER I WITH DIAERESIS (LATIN CAPITAL LETTER I DIAERESIS) */ + ["\u00D0", "\u00F0"], /* LATIN CAPITAL LETTER ETH */ + ["\u00D1", "\u00F1"], /* LATIN CAPITAL LETTER N WITH TILDE (LATIN CAPITAL LETTER N TILDE) */ + ["\u00D2", "\u00F2"], /* LATIN CAPITAL LETTER O WITH GRAVE (LATIN CAPITAL LETTER O GRAVE) */ + ["\u00D3", "\u00F3"], /* LATIN CAPITAL LETTER O WITH ACUTE (LATIN CAPITAL LETTER O ACUTE) */ + ["\u00D4", "\u00F4"], /* LATIN CAPITAL LETTER O WITH CIRCUMFLEX (LATIN CAPITAL LETTER O CIRCUMFLEX) */ + ["\u00D5", "\u00F5"], /* LATIN CAPITAL LETTER O WITH TILDE (LATIN CAPITAL LETTER O TILDE) */ + ["\u00D6", "\u00F6"], /* LATIN CAPITAL LETTER O WITH DIAERESIS (LATIN CAPITAL LETTER O DIAERESIS) */ + ["\u00D7", "\u00D7"], /* MULTIPLICATION SIGN */ + ["\u00D8", "\u00F8"], /* LATIN CAPITAL LETTER O WITH STROKE (LATIN CAPITAL LETTER O SLASH) */ + ["\u00D9", "\u00F9"], /* LATIN CAPITAL LETTER U WITH GRAVE (LATIN CAPITAL LETTER U GRAVE) */ + ["\u00DA", "\u00FA"], /* LATIN CAPITAL LETTER U WITH ACUTE (LATIN CAPITAL LETTER U ACUTE) */ + ["\u00DB", "\u00FB"], /* LATIN CAPITAL LETTER U WITH CIRCUMFLEX (LATIN CAPITAL LETTER U CIRCUMFLEX) */ + ["\u00DC", "\u00FC"], /* LATIN CAPITAL LETTER U WITH DIAERESIS (LATIN CAPITAL LETTER U DIAERESIS) */ + ["\u00DD", "\u00FD"], /* LATIN CAPITAL LETTER Y WITH ACUTE (LATIN CAPITAL LETTER Y ACUTE) */ + ["\u00DE", "\u00FE"], /* LATIN CAPITAL LETTER THORN */ + ["\u0053\u0053", "\u00DF"], /* LATIN SMALL LETTER SHARP S */ + ["\u00C0", "\u00E0"], /* LATIN SMALL LETTER A WITH GRAVE (LATIN SMALL LETTER A GRAVE) */ + ["\u00C1", "\u00E1"], /* LATIN SMALL LETTER A WITH ACUTE (LATIN SMALL LETTER A ACUTE) */ + ["\u00C2", "\u00E2"], /* LATIN SMALL LETTER A WITH CIRCUMFLEX (LATIN SMALL LETTER A CIRCUMFLEX) */ + ["\u00C3", "\u00E3"], /* LATIN SMALL LETTER A WITH TILDE (LATIN SMALL LETTER A TILDE) */ + ["\u00C4", "\u00E4"], /* LATIN SMALL LETTER A WITH DIAERESIS (LATIN SMALL LETTER A DIAERESIS) */ + ["\u00C5", "\u00E5"], /* LATIN SMALL LETTER A WITH RING ABOVE (LATIN SMALL LETTER A RING) */ + ["\u00C6", "\u00E6"], /* LATIN SMALL LETTER AE (LATIN SMALL LETTER A E) */ + ["\u00C7", "\u00E7"], /* LATIN SMALL LETTER C WITH CEDILLA (LATIN SMALL LETTER C CEDILLA) */ + ["\u00C8", "\u00E8"], /* LATIN SMALL LETTER E WITH GRAVE (LATIN SMALL LETTER E GRAVE) */ + ["\u00C9", "\u00E9"], /* LATIN SMALL LETTER E WITH ACUTE (LATIN SMALL LETTER E ACUTE) */ + ["\u00CA", "\u00EA"], /* LATIN SMALL LETTER E WITH CIRCUMFLEX (LATIN SMALL LETTER E CIRCUMFLEX) */ + ["\u00CB", "\u00EB"], /* LATIN SMALL LETTER E WITH DIAERESIS (LATIN SMALL LETTER E DIAERESIS) */ + ["\u00CC", "\u00EC"], /* LATIN SMALL LETTER I WITH GRAVE (LATIN SMALL LETTER I GRAVE) */ + ["\u00CD", "\u00ED"], /* LATIN SMALL LETTER I WITH ACUTE (LATIN SMALL LETTER I ACUTE) */ + ["\u00CE", "\u00EE"], /* LATIN SMALL LETTER I WITH CIRCUMFLEX (LATIN SMALL LETTER I CIRCUMFLEX) */ + ["\u00CF", "\u00EF"], /* LATIN SMALL LETTER I WITH DIAERESIS (LATIN SMALL LETTER I DIAERESIS) */ + ["\u00D0", "\u00F0"], /* LATIN SMALL LETTER ETH */ + ["\u00D1", "\u00F1"], /* LATIN SMALL LETTER N WITH TILDE (LATIN SMALL LETTER N TILDE) */ + ["\u00D2", "\u00F2"], /* LATIN SMALL LETTER O WITH GRAVE (LATIN SMALL LETTER O GRAVE) */ + ["\u00D3", "\u00F3"], /* LATIN SMALL LETTER O WITH ACUTE (LATIN SMALL LETTER O ACUTE) */ + ["\u00D4", "\u00F4"], /* LATIN SMALL LETTER O WITH CIRCUMFLEX (LATIN SMALL LETTER O CIRCUMFLEX) */ + ["\u00D5", "\u00F5"], /* LATIN SMALL LETTER O WITH TILDE (LATIN SMALL LETTER O TILDE) */ + ["\u00D6", "\u00F6"], /* LATIN SMALL LETTER O WITH DIAERESIS (LATIN SMALL LETTER O DIAERESIS) */ + ["\u00F7", "\u00F7"], /* DIVISION SIGN */ + ["\u00D8", "\u00F8"], /* LATIN SMALL LETTER O WITH STROKE (LATIN SMALL LETTER O SLASH) */ + ["\u00D9", "\u00F9"], /* LATIN SMALL LETTER U WITH GRAVE (LATIN SMALL LETTER U GRAVE) */ + ["\u00DA", "\u00FA"], /* LATIN SMALL LETTER U WITH ACUTE (LATIN SMALL LETTER U ACUTE) */ + ["\u00DB", "\u00FB"], /* LATIN SMALL LETTER U WITH CIRCUMFLEX (LATIN SMALL LETTER U CIRCUMFLEX) */ + ["\u00DC", "\u00FC"], /* LATIN SMALL LETTER U WITH DIAERESIS (LATIN SMALL LETTER U DIAERESIS) */ + ["\u00DD", "\u00FD"], /* LATIN SMALL LETTER Y WITH ACUTE (LATIN SMALL LETTER Y ACUTE) */ + ["\u00DE", "\u00FE"], /* LATIN SMALL LETTER THORN */ + ["\u0178", "\u00FF"], /* LATIN SMALL LETTER Y WITH DIAERESIS (LATIN SMALL LETTER Y DIAERESIS) */ + ["\u0100", "\u0101"], /* LATIN CAPITAL LETTER A WITH MACRON (LATIN CAPITAL LETTER A MACRON) */ + ["\u0100", "\u0101"], /* LATIN SMALL LETTER A WITH MACRON (LATIN SMALL LETTER A MACRON) */ + ["\u0102", "\u0103"], /* LATIN CAPITAL LETTER A WITH BREVE (LATIN CAPITAL LETTER A BREVE) */ + ["\u0102", "\u0103"], /* LATIN SMALL LETTER A WITH BREVE (LATIN SMALL LETTER A BREVE) */ + ["\u0104", "\u0105"], /* LATIN CAPITAL LETTER A WITH OGONEK (LATIN CAPITAL LETTER A OGONEK) */ + ["\u0104", "\u0105"], /* LATIN SMALL LETTER A WITH OGONEK (LATIN SMALL LETTER A OGONEK) */ + ["\u0106", "\u0107"], /* LATIN CAPITAL LETTER C WITH ACUTE (LATIN CAPITAL LETTER C ACUTE) */ + ["\u0106", "\u0107"], /* LATIN SMALL LETTER C WITH ACUTE (LATIN SMALL LETTER C ACUTE) */ + ["\u0108", "\u0109"], /* LATIN CAPITAL LETTER C WITH CIRCUMFLEX (LATIN CAPITAL LETTER C CIRCUMFLEX) */ + ["\u0108", "\u0109"], /* LATIN SMALL LETTER C WITH CIRCUMFLEX (LATIN SMALL LETTER C CIRCUMFLEX) */ + ["\u010A", "\u010B"], /* LATIN CAPITAL LETTER C WITH DOT ABOVE (LATIN CAPITAL LETTER C DOT) */ + ["\u010A", "\u010B"], /* LATIN SMALL LETTER C WITH DOT ABOVE (LATIN SMALL LETTER C DOT) */ + ["\u010C", "\u010D"], /* LATIN CAPITAL LETTER C WITH CARON (LATIN CAPITAL LETTER C HACEK) */ + ["\u010C", "\u010D"], /* LATIN SMALL LETTER C WITH CARON (LATIN SMALL LETTER C HACEK) */ + ["\u010E", "\u010F"], /* LATIN CAPITAL LETTER D WITH CARON (LATIN CAPITAL LETTER D HACEK) */ + ["\u010E", "\u010F"], /* LATIN SMALL LETTER D WITH CARON (LATIN SMALL LETTER D HACEK) */ + ["\u0110", "\u0111"], /* LATIN CAPITAL LETTER D WITH STROKE (LATIN CAPITAL LETTER D BAR) */ + ["\u0110", "\u0111"], /* LATIN SMALL LETTER D WITH STROKE (LATIN SMALL LETTER D BAR) */ + ["\u0112", "\u0113"], /* LATIN CAPITAL LETTER E WITH MACRON (LATIN CAPITAL LETTER E MACRON) */ + ["\u0112", "\u0113"], /* LATIN SMALL LETTER E WITH MACRON (LATIN SMALL LETTER E MACRON) */ + ["\u0114", "\u0115"], /* LATIN CAPITAL LETTER E WITH BREVE (LATIN CAPITAL LETTER E BREVE) */ + ["\u0114", "\u0115"], /* LATIN SMALL LETTER E WITH BREVE (LATIN SMALL LETTER E BREVE) */ + ["\u0116", "\u0117"], /* LATIN CAPITAL LETTER E WITH DOT ABOVE (LATIN CAPITAL LETTER E DOT) */ + ["\u0116", "\u0117"], /* LATIN SMALL LETTER E WITH DOT ABOVE (LATIN SMALL LETTER E DOT) */ + ["\u0118", "\u0119"], /* LATIN CAPITAL LETTER E WITH OGONEK (LATIN CAPITAL LETTER E OGONEK) */ + ["\u0118", "\u0119"], /* LATIN SMALL LETTER E WITH OGONEK (LATIN SMALL LETTER E OGONEK) */ + ["\u011A", "\u011B"], /* LATIN CAPITAL LETTER E WITH CARON (LATIN CAPITAL LETTER E HACEK) */ + ["\u011A", "\u011B"], /* LATIN SMALL LETTER E WITH CARON (LATIN SMALL LETTER E HACEK) */ + ["\u011C", "\u011D"], /* LATIN CAPITAL LETTER G WITH CIRCUMFLEX (LATIN CAPITAL LETTER G CIRCUMFLEX) */ + ["\u011C", "\u011D"], /* LATIN SMALL LETTER G WITH CIRCUMFLEX (LATIN SMALL LETTER G CIRCUMFLEX) */ + ["\u011E", "\u011F"], /* LATIN CAPITAL LETTER G WITH BREVE (LATIN CAPITAL LETTER G BREVE) */ + ["\u011E", "\u011F"], /* LATIN SMALL LETTER G WITH BREVE (LATIN SMALL LETTER G BREVE) */ + ["\u0120", "\u0121"], /* LATIN CAPITAL LETTER G WITH DOT ABOVE (LATIN CAPITAL LETTER G DOT) */ + ["\u0120", "\u0121"], /* LATIN SMALL LETTER G WITH DOT ABOVE (LATIN SMALL LETTER G DOT) */ + ["\u0122", "\u0123"], /* LATIN CAPITAL LETTER G WITH CEDILLA (LATIN CAPITAL LETTER G CEDILLA) */ + ["\u0122", "\u0123"], /* LATIN SMALL LETTER G WITH CEDILLA (LATIN SMALL LETTER G CEDILLA) */ + ["\u0124", "\u0125"], /* LATIN CAPITAL LETTER H WITH CIRCUMFLEX (LATIN CAPITAL LETTER H CIRCUMFLEX) */ + ["\u0124", "\u0125"], /* LATIN SMALL LETTER H WITH CIRCUMFLEX (LATIN SMALL LETTER H CIRCUMFLEX) */ + ["\u0126", "\u0127"], /* LATIN CAPITAL LETTER H WITH STROKE (LATIN CAPITAL LETTER H BAR) */ + ["\u0126", "\u0127"], /* LATIN SMALL LETTER H WITH STROKE (LATIN SMALL LETTER H BAR) */ + ["\u0128", "\u0129"], /* LATIN CAPITAL LETTER I WITH TILDE (LATIN CAPITAL LETTER I TILDE) */ + ["\u0128", "\u0129"], /* LATIN SMALL LETTER I WITH TILDE (LATIN SMALL LETTER I TILDE) */ + ["\u012A", "\u012B"], /* LATIN CAPITAL LETTER I WITH MACRON (LATIN CAPITAL LETTER I MACRON) */ + ["\u012A", "\u012B"], /* LATIN SMALL LETTER I WITH MACRON (LATIN SMALL LETTER I MACRON) */ + ["\u012C", "\u012D"], /* LATIN CAPITAL LETTER I WITH BREVE (LATIN CAPITAL LETTER I BREVE) */ + ["\u012C", "\u012D"], /* LATIN SMALL LETTER I WITH BREVE (LATIN SMALL LETTER I BREVE) */ + ["\u012E", "\u012F"], /* LATIN CAPITAL LETTER I WITH OGONEK (LATIN CAPITAL LETTER I OGONEK) */ + ["\u012E", "\u012F"], /* LATIN SMALL LETTER I WITH OGONEK (LATIN SMALL LETTER I OGONEK) */ + ["\u0130", "\u0069\u0307"], /* LATIN CAPITAL LETTER I WITH DOT ABOVE (LATIN CAPITAL LETTER I DOT) */ + ["\u0049", "\u0131"], /* LATIN SMALL LETTER DOTLESS I */ + ["\u0132", "\u0133"], /* LATIN CAPITAL LIGATURE IJ (LATIN CAPITAL LETTER I J) */ + ["\u0132", "\u0133"], /* LATIN SMALL LIGATURE IJ (LATIN SMALL LETTER I J) */ + ["\u0134", "\u0135"], /* LATIN CAPITAL LETTER J WITH CIRCUMFLEX (LATIN CAPITAL LETTER J CIRCUMFLEX) */ + ["\u0134", "\u0135"], /* LATIN SMALL LETTER J WITH CIRCUMFLEX (LATIN SMALL LETTER J CIRCUMFLEX) */ + ["\u0136", "\u0137"], /* LATIN CAPITAL LETTER K WITH CEDILLA (LATIN CAPITAL LETTER K CEDILLA) */ + ["\u0136", "\u0137"], /* LATIN SMALL LETTER K WITH CEDILLA (LATIN SMALL LETTER K CEDILLA) */ + ["\u0138", "\u0138"], /* LATIN SMALL LETTER KRA */ + ["\u0139", "\u013A"], /* LATIN CAPITAL LETTER L WITH ACUTE (LATIN CAPITAL LETTER L ACUTE) */ + ["\u0139", "\u013A"], /* LATIN SMALL LETTER L WITH ACUTE (LATIN SMALL LETTER L ACUTE) */ + ["\u013B", "\u013C"], /* LATIN CAPITAL LETTER L WITH CEDILLA (LATIN CAPITAL LETTER L CEDILLA) */ + ["\u013B", "\u013C"], /* LATIN SMALL LETTER L WITH CEDILLA (LATIN SMALL LETTER L CEDILLA) */ + ["\u013D", "\u013E"], /* LATIN CAPITAL LETTER L WITH CARON (LATIN CAPITAL LETTER L HACEK) */ + ["\u013D", "\u013E"], /* LATIN SMALL LETTER L WITH CARON (LATIN SMALL LETTER L HACEK) */ + ["\u013F", "\u0140"], /* LATIN CAPITAL LETTER L WITH MIDDLE DOT */ + ["\u013F", "\u0140"], /* LATIN SMALL LETTER L WITH MIDDLE DOT */ + ["\u0141", "\u0142"], /* LATIN CAPITAL LETTER L WITH STROKE (LATIN CAPITAL LETTER L SLASH) */ + ["\u0141", "\u0142"], /* LATIN SMALL LETTER L WITH STROKE (LATIN SMALL LETTER L SLASH) */ + ["\u0143", "\u0144"], /* LATIN CAPITAL LETTER N WITH ACUTE (LATIN CAPITAL LETTER N ACUTE) */ + ["\u0143", "\u0144"], /* LATIN SMALL LETTER N WITH ACUTE (LATIN SMALL LETTER N ACUTE) */ + ["\u0145", "\u0146"], /* LATIN CAPITAL LETTER N WITH CEDILLA (LATIN CAPITAL LETTER N CEDILLA) */ + ["\u0145", "\u0146"], /* LATIN SMALL LETTER N WITH CEDILLA (LATIN SMALL LETTER N CEDILLA) */ + ["\u0147", "\u0148"], /* LATIN CAPITAL LETTER N WITH CARON (LATIN CAPITAL LETTER N HACEK) */ + ["\u0147", "\u0148"], /* LATIN SMALL LETTER N WITH CARON (LATIN SMALL LETTER N HACEK) */ + ["\u02BC\u004E", "\u0149"], /* LATIN SMALL LETTER N PRECEDED BY APOSTROPHE (LATIN SMALL LETTER APOSTROPHE N) */ + ["\u014A", "\u014B"], /* LATIN CAPITAL LETTER ENG */ + ["\u014A", "\u014B"], /* LATIN SMALL LETTER ENG */ + ["\u014C", "\u014D"], /* LATIN CAPITAL LETTER O WITH MACRON (LATIN CAPITAL LETTER O MACRON) */ + ["\u014C", "\u014D"], /* LATIN SMALL LETTER O WITH MACRON (LATIN SMALL LETTER O MACRON) */ + ["\u014E", "\u014F"], /* LATIN CAPITAL LETTER O WITH BREVE (LATIN CAPITAL LETTER O BREVE) */ + ["\u014E", "\u014F"], /* LATIN SMALL LETTER O WITH BREVE (LATIN SMALL LETTER O BREVE) */ + ["\u0150", "\u0151"], /* LATIN CAPITAL LETTER O WITH DOUBLE ACUTE (LATIN CAPITAL LETTER O DOUBLE ACUTE) */ + ["\u0150", "\u0151"], /* LATIN SMALL LETTER O WITH DOUBLE ACUTE (LATIN SMALL LETTER O DOUBLE ACUTE) */ + ["\u0152", "\u0153"], /* LATIN CAPITAL LIGATURE OE (LATIN CAPITAL LETTER O E) */ + ["\u0152", "\u0153"], /* LATIN SMALL LIGATURE OE (LATIN SMALL LETTER O E) */ + ["\u0154", "\u0155"], /* LATIN CAPITAL LETTER R WITH ACUTE (LATIN CAPITAL LETTER R ACUTE) */ + ["\u0154", "\u0155"], /* LATIN SMALL LETTER R WITH ACUTE (LATIN SMALL LETTER R ACUTE) */ + ["\u0156", "\u0157"], /* LATIN CAPITAL LETTER R WITH CEDILLA (LATIN CAPITAL LETTER R CEDILLA) */ + ["\u0156", "\u0157"], /* LATIN SMALL LETTER R WITH CEDILLA (LATIN SMALL LETTER R CEDILLA) */ + ["\u0158", "\u0159"], /* LATIN CAPITAL LETTER R WITH CARON (LATIN CAPITAL LETTER R HACEK) */ + ["\u0158", "\u0159"], /* LATIN SMALL LETTER R WITH CARON (LATIN SMALL LETTER R HACEK) */ + ["\u015A", "\u015B"], /* LATIN CAPITAL LETTER S WITH ACUTE (LATIN CAPITAL LETTER S ACUTE) */ + ["\u015A", "\u015B"], /* LATIN SMALL LETTER S WITH ACUTE (LATIN SMALL LETTER S ACUTE) */ + ["\u015C", "\u015D"], /* LATIN CAPITAL LETTER S WITH CIRCUMFLEX (LATIN CAPITAL LETTER S CIRCUMFLEX) */ + ["\u015C", "\u015D"], /* LATIN SMALL LETTER S WITH CIRCUMFLEX (LATIN SMALL LETTER S CIRCUMFLEX) */ + ["\u015E", "\u015F"], /* LATIN CAPITAL LETTER S WITH CEDILLA (LATIN CAPITAL LETTER S CEDILLA) */ + ["\u015E", "\u015F"], /* LATIN SMALL LETTER S WITH CEDILLA (LATIN SMALL LETTER S CEDILLA) */ + ["\u0160", "\u0161"], /* LATIN CAPITAL LETTER S WITH CARON (LATIN CAPITAL LETTER S HACEK) */ + ["\u0160", "\u0161"], /* LATIN SMALL LETTER S WITH CARON (LATIN SMALL LETTER S HACEK) */ + ["\u0162", "\u0163"], /* LATIN CAPITAL LETTER T WITH CEDILLA (LATIN CAPITAL LETTER T CEDILLA) */ + ["\u0162", "\u0163"], /* LATIN SMALL LETTER T WITH CEDILLA (LATIN SMALL LETTER T CEDILLA) */ + ["\u0164", "\u0165"], /* LATIN CAPITAL LETTER T WITH CARON (LATIN CAPITAL LETTER T HACEK) */ + ["\u0164", "\u0165"], /* LATIN SMALL LETTER T WITH CARON (LATIN SMALL LETTER T HACEK) */ + ["\u0166", "\u0167"], /* LATIN CAPITAL LETTER T WITH STROKE (LATIN CAPITAL LETTER T BAR) */ + ["\u0166", "\u0167"], /* LATIN SMALL LETTER T WITH STROKE (LATIN SMALL LETTER T BAR) */ + ["\u0168", "\u0169"], /* LATIN CAPITAL LETTER U WITH TILDE (LATIN CAPITAL LETTER U TILDE) */ + ["\u0168", "\u0169"], /* LATIN SMALL LETTER U WITH TILDE (LATIN SMALL LETTER U TILDE) */ + ["\u016A", "\u016B"], /* LATIN CAPITAL LETTER U WITH MACRON (LATIN CAPITAL LETTER U MACRON) */ + ["\u016A", "\u016B"], /* LATIN SMALL LETTER U WITH MACRON (LATIN SMALL LETTER U MACRON) */ + ["\u016C", "\u016D"], /* LATIN CAPITAL LETTER U WITH BREVE (LATIN CAPITAL LETTER U BREVE) */ + ["\u016C", "\u016D"], /* LATIN SMALL LETTER U WITH BREVE (LATIN SMALL LETTER U BREVE) */ + ["\u016E", "\u016F"], /* LATIN CAPITAL LETTER U WITH RING ABOVE (LATIN CAPITAL LETTER U RING) */ + ["\u016E", "\u016F"], /* LATIN SMALL LETTER U WITH RING ABOVE (LATIN SMALL LETTER U RING) */ + ["\u0170", "\u0171"], /* LATIN CAPITAL LETTER U WITH DOUBLE ACUTE (LATIN CAPITAL LETTER U DOUBLE ACUTE) */ + ["\u0170", "\u0171"], /* LATIN SMALL LETTER U WITH DOUBLE ACUTE (LATIN SMALL LETTER U DOUBLE ACUTE) */ + ["\u0172", "\u0173"], /* LATIN CAPITAL LETTER U WITH OGONEK (LATIN CAPITAL LETTER U OGONEK) */ + ["\u0172", "\u0173"], /* LATIN SMALL LETTER U WITH OGONEK (LATIN SMALL LETTER U OGONEK) */ + ["\u0174", "\u0175"], /* LATIN CAPITAL LETTER W WITH CIRCUMFLEX (LATIN CAPITAL LETTER W CIRCUMFLEX) */ + ["\u0174", "\u0175"], /* LATIN SMALL LETTER W WITH CIRCUMFLEX (LATIN SMALL LETTER W CIRCUMFLEX) */ + ["\u0176", "\u0177"], /* LATIN CAPITAL LETTER Y WITH CIRCUMFLEX (LATIN CAPITAL LETTER Y CIRCUMFLEX) */ + ["\u0176", "\u0177"], /* LATIN SMALL LETTER Y WITH CIRCUMFLEX (LATIN SMALL LETTER Y CIRCUMFLEX) */ + ["\u0178", "\u00FF"], /* LATIN CAPITAL LETTER Y WITH DIAERESIS (LATIN CAPITAL LETTER Y DIAERESIS) */ + ["\u0179", "\u017A"], /* LATIN CAPITAL LETTER Z WITH ACUTE (LATIN CAPITAL LETTER Z ACUTE) */ + ["\u0179", "\u017A"], /* LATIN SMALL LETTER Z WITH ACUTE (LATIN SMALL LETTER Z ACUTE) */ + ["\u017B", "\u017C"], /* LATIN CAPITAL LETTER Z WITH DOT ABOVE (LATIN CAPITAL LETTER Z DOT) */ + ["\u017B", "\u017C"], /* LATIN SMALL LETTER Z WITH DOT ABOVE (LATIN SMALL LETTER Z DOT) */ + ["\u017D", "\u017E"], /* LATIN CAPITAL LETTER Z WITH CARON (LATIN CAPITAL LETTER Z HACEK) */ + ["\u017D", "\u017E"], /* LATIN SMALL LETTER Z WITH CARON (LATIN SMALL LETTER Z HACEK) */ + ["\u0053", "\u017F"], /* LATIN SMALL LETTER LONG S */ + ["\u0243", "\u0180"], /* LATIN SMALL LETTER B WITH STROKE (LATIN SMALL LETTER B BAR) */ + ["\u0181", "\u0253"], /* LATIN CAPITAL LETTER B WITH HOOK (LATIN CAPITAL LETTER B HOOK) */ + ["\u0182", "\u0183"], /* LATIN CAPITAL LETTER B WITH TOPBAR (LATIN CAPITAL LETTER B TOPBAR) */ + ["\u0182", "\u0183"], /* LATIN SMALL LETTER B WITH TOPBAR (LATIN SMALL LETTER B TOPBAR) */ + ["\u0184", "\u0185"], /* LATIN CAPITAL LETTER TONE SIX */ + ["\u0184", "\u0185"], /* LATIN SMALL LETTER TONE SIX */ + ["\u0186", "\u0254"], /* LATIN CAPITAL LETTER OPEN O */ + ["\u0187", "\u0188"], /* LATIN CAPITAL LETTER C WITH HOOK (LATIN CAPITAL LETTER C HOOK) */ + ["\u0187", "\u0188"], /* LATIN SMALL LETTER C WITH HOOK (LATIN SMALL LETTER C HOOK) */ + ["\u0189", "\u0256"], /* LATIN CAPITAL LETTER AFRICAN D */ + ["\u018A", "\u0257"], /* LATIN CAPITAL LETTER D WITH HOOK (LATIN CAPITAL LETTER D HOOK) */ + ["\u018B", "\u018C"], /* LATIN CAPITAL LETTER D WITH TOPBAR (LATIN CAPITAL LETTER D TOPBAR) */ + ["\u018B", "\u018C"], /* LATIN SMALL LETTER D WITH TOPBAR (LATIN SMALL LETTER D TOPBAR) */ + ["\u018D", "\u018D"], /* LATIN SMALL LETTER TURNED DELTA */ + ["\u018E", "\u01DD"], /* LATIN CAPITAL LETTER REVERSED E (LATIN CAPITAL LETTER TURNED E) */ + ["\u018F", "\u0259"], /* LATIN CAPITAL LETTER SCHWA */ + ["\u0190", "\u025B"], /* LATIN CAPITAL LETTER OPEN E (LATIN CAPITAL LETTER EPSILON) */ + ["\u0191", "\u0192"], /* LATIN CAPITAL LETTER F WITH HOOK (LATIN CAPITAL LETTER F HOOK) */ + ["\u0191", "\u0192"], /* LATIN SMALL LETTER F WITH HOOK (LATIN SMALL LETTER SCRIPT F) */ + ["\u0193", "\u0260"], /* LATIN CAPITAL LETTER G WITH HOOK (LATIN CAPITAL LETTER G HOOK) */ + ["\u0194", "\u0263"], /* LATIN CAPITAL LETTER GAMMA */ + ["\u01F6", "\u0195"], /* LATIN SMALL LETTER HV (LATIN SMALL LETTER H V) */ + ["\u0196", "\u0269"], /* LATIN CAPITAL LETTER IOTA */ + ["\u0197", "\u0268"], /* LATIN CAPITAL LETTER I WITH STROKE (LATIN CAPITAL LETTER BARRED I) */ + ["\u0198", "\u0199"], /* LATIN CAPITAL LETTER K WITH HOOK (LATIN CAPITAL LETTER K HOOK) */ + ["\u0198", "\u0199"], /* LATIN SMALL LETTER K WITH HOOK (LATIN SMALL LETTER K HOOK) */ + ["\u023D", "\u019A"], /* LATIN SMALL LETTER L WITH BAR (LATIN SMALL LETTER BARRED L) */ + ["\u019B", "\u019B"], /* LATIN SMALL LETTER LAMBDA WITH STROKE (LATIN SMALL LETTER BARRED LAMBDA) */ + ["\u019C", "\u026F"], /* LATIN CAPITAL LETTER TURNED M */ + ["\u019D", "\u0272"], /* LATIN CAPITAL LETTER N WITH LEFT HOOK (LATIN CAPITAL LETTER N HOOK) */ + ["\u0220", "\u019E"], /* LATIN SMALL LETTER N WITH LONG RIGHT LEG */ + ["\u019F", "\u0275"], /* LATIN CAPITAL LETTER O WITH MIDDLE TILDE (LATIN CAPITAL LETTER BARRED O) */ + ["\u01A0", "\u01A1"], /* LATIN CAPITAL LETTER O WITH HORN (LATIN CAPITAL LETTER O HORN) */ + ["\u01A0", "\u01A1"], /* LATIN SMALL LETTER O WITH HORN (LATIN SMALL LETTER O HORN) */ + ["\u01A2", "\u01A3"], /* LATIN CAPITAL LETTER OI (LATIN CAPITAL LETTER O I) */ + ["\u01A2", "\u01A3"], /* LATIN SMALL LETTER OI (LATIN SMALL LETTER O I) */ + ["\u01A4", "\u01A5"], /* LATIN CAPITAL LETTER P WITH HOOK (LATIN CAPITAL LETTER P HOOK) */ + ["\u01A4", "\u01A5"], /* LATIN SMALL LETTER P WITH HOOK (LATIN SMALL LETTER P HOOK) */ + ["\u01A6", "\u0280"], /* LATIN LETTER YR (LATIN LETTER Y R) */ + ["\u01A7", "\u01A8"], /* LATIN CAPITAL LETTER TONE TWO */ + ["\u01A7", "\u01A8"], /* LATIN SMALL LETTER TONE TWO */ + ["\u01A9", "\u0283"], /* LATIN CAPITAL LETTER ESH */ + ["\u01AA", "\u01AA"], /* LATIN LETTER REVERSED ESH LOOP */ + ["\u01AB", "\u01AB"], /* LATIN SMALL LETTER T WITH PALATAL HOOK (LATIN SMALL LETTER T PALATAL HOOK) */ + ["\u01AC", "\u01AD"], /* LATIN CAPITAL LETTER T WITH HOOK (LATIN CAPITAL LETTER T HOOK) */ + ["\u01AC", "\u01AD"], /* LATIN SMALL LETTER T WITH HOOK (LATIN SMALL LETTER T HOOK) */ + ["\u01AE", "\u0288"], /* LATIN CAPITAL LETTER T WITH RETROFLEX HOOK (LATIN CAPITAL LETTER T RETROFLEX HOOK) */ + ["\u01AF", "\u01B0"], /* LATIN CAPITAL LETTER U WITH HORN (LATIN CAPITAL LETTER U HORN) */ + ["\u01AF", "\u01B0"], /* LATIN SMALL LETTER U WITH HORN (LATIN SMALL LETTER U HORN) */ + ["\u01B1", "\u028A"], /* LATIN CAPITAL LETTER UPSILON */ + ["\u01B2", "\u028B"], /* LATIN CAPITAL LETTER V WITH HOOK (LATIN CAPITAL LETTER SCRIPT V) */ + ["\u01B3", "\u01B4"], /* LATIN CAPITAL LETTER Y WITH HOOK (LATIN CAPITAL LETTER Y HOOK) */ + ["\u01B3", "\u01B4"], /* LATIN SMALL LETTER Y WITH HOOK (LATIN SMALL LETTER Y HOOK) */ + ["\u01B5", "\u01B6"], /* LATIN CAPITAL LETTER Z WITH STROKE (LATIN CAPITAL LETTER Z BAR) */ + ["\u01B5", "\u01B6"], /* LATIN SMALL LETTER Z WITH STROKE (LATIN SMALL LETTER Z BAR) */ + ["\u01B7", "\u0292"], /* LATIN CAPITAL LETTER EZH (LATIN CAPITAL LETTER YOGH) */ + ["\u01B8", "\u01B9"], /* LATIN CAPITAL LETTER EZH REVERSED (LATIN CAPITAL LETTER REVERSED YOGH) */ + ["\u01B8", "\u01B9"], /* LATIN SMALL LETTER EZH REVERSED (LATIN SMALL LETTER REVERSED YOGH) */ + ["\u01BA", "\u01BA"], /* LATIN SMALL LETTER EZH WITH TAIL (LATIN SMALL LETTER YOGH WITH TAIL) */ + ["\u01BB", "\u01BB"], /* LATIN LETTER TWO WITH STROKE (LATIN LETTER TWO BAR) */ + ["\u01BC", "\u01BD"], /* LATIN CAPITAL LETTER TONE FIVE */ + ["\u01BC", "\u01BD"], /* LATIN SMALL LETTER TONE FIVE */ + ["\u01BE", "\u01BE"], /* LATIN LETTER INVERTED GLOTTAL STOP WITH STROKE (LATIN LETTER INVERTED GLOTTAL STOP BAR) */ + ["\u01F7", "\u01BF"], /* LATIN LETTER WYNN */ + ["\u01C0", "\u01C0"], /* LATIN LETTER DENTAL CLICK (LATIN LETTER PIPE) */ + ["\u01C1", "\u01C1"], /* LATIN LETTER LATERAL CLICK (LATIN LETTER DOUBLE PIPE) */ + ["\u01C2", "\u01C2"], /* LATIN LETTER ALVEOLAR CLICK (LATIN LETTER PIPE DOUBLE BAR) */ + ["\u01C3", "\u01C3"], /* LATIN LETTER RETROFLEX CLICK (LATIN LETTER EXCLAMATION MARK) */ + ["\u01C4", "\u01C6"], /* LATIN CAPITAL LETTER DZ WITH CARON (LATIN CAPITAL LETTER D Z HACEK) */ + ["\u01C4", "\u01C6"], /* LATIN CAPITAL LETTER D WITH SMALL LETTER Z WITH CARON (LATIN LETTER CAPITAL D SMALL Z HACEK) */ + ["\u01C4", "\u01C6"], /* LATIN SMALL LETTER DZ WITH CARON (LATIN SMALL LETTER D Z HACEK) */ + ["\u01C7", "\u01C9"], /* LATIN CAPITAL LETTER LJ (LATIN CAPITAL LETTER L J) */ + ["\u01C7", "\u01C9"], /* LATIN CAPITAL LETTER L WITH SMALL LETTER J (LATIN LETTER CAPITAL L SMALL J) */ + ["\u01C7", "\u01C9"], /* LATIN SMALL LETTER LJ (LATIN SMALL LETTER L J) */ + ["\u01CA", "\u01CC"], /* LATIN CAPITAL LETTER NJ (LATIN CAPITAL LETTER N J) */ + ["\u01CA", "\u01CC"], /* LATIN CAPITAL LETTER N WITH SMALL LETTER J (LATIN LETTER CAPITAL N SMALL J) */ + ["\u01CA", "\u01CC"], /* LATIN SMALL LETTER NJ (LATIN SMALL LETTER N J) */ + ["\u01CD", "\u01CE"], /* LATIN CAPITAL LETTER A WITH CARON (LATIN CAPITAL LETTER A HACEK) */ + ["\u01CD", "\u01CE"], /* LATIN SMALL LETTER A WITH CARON (LATIN SMALL LETTER A HACEK) */ + ["\u01CF", "\u01D0"], /* LATIN CAPITAL LETTER I WITH CARON (LATIN CAPITAL LETTER I HACEK) */ + ["\u01CF", "\u01D0"], /* LATIN SMALL LETTER I WITH CARON (LATIN SMALL LETTER I HACEK) */ + ["\u01D1", "\u01D2"], /* LATIN CAPITAL LETTER O WITH CARON (LATIN CAPITAL LETTER O HACEK) */ + ["\u01D1", "\u01D2"], /* LATIN SMALL LETTER O WITH CARON (LATIN SMALL LETTER O HACEK) */ + ["\u01D3", "\u01D4"], /* LATIN CAPITAL LETTER U WITH CARON (LATIN CAPITAL LETTER U HACEK) */ + ["\u01D3", "\u01D4"], /* LATIN SMALL LETTER U WITH CARON (LATIN SMALL LETTER U HACEK) */ + ["\u01D5", "\u01D6"], /* LATIN CAPITAL LETTER U WITH DIAERESIS AND MACRON (LATIN CAPITAL LETTER U DIAERESIS MACRON) */ + ["\u01D5", "\u01D6"], /* LATIN SMALL LETTER U WITH DIAERESIS AND MACRON (LATIN SMALL LETTER U DIAERESIS MACRON) */ + ["\u01D7", "\u01D8"], /* LATIN CAPITAL LETTER U WITH DIAERESIS AND ACUTE (LATIN CAPITAL LETTER U DIAERESIS ACUTE) */ + ["\u01D7", "\u01D8"], /* LATIN SMALL LETTER U WITH DIAERESIS AND ACUTE (LATIN SMALL LETTER U DIAERESIS ACUTE) */ + ["\u01D9", "\u01DA"], /* LATIN CAPITAL LETTER U WITH DIAERESIS AND CARON (LATIN CAPITAL LETTER U DIAERESIS HACEK) */ + ["\u01D9", "\u01DA"], /* LATIN SMALL LETTER U WITH DIAERESIS AND CARON (LATIN SMALL LETTER U DIAERESIS HACEK) */ + ["\u01DB", "\u01DC"], /* LATIN CAPITAL LETTER U WITH DIAERESIS AND GRAVE (LATIN CAPITAL LETTER U DIAERESIS GRAVE) */ + ["\u01DB", "\u01DC"], /* LATIN SMALL LETTER U WITH DIAERESIS AND GRAVE (LATIN SMALL LETTER U DIAERESIS GRAVE) */ + ["\u018E", "\u01DD"], /* LATIN SMALL LETTER TURNED E */ + ["\u01DE", "\u01DF"], /* LATIN CAPITAL LETTER A WITH DIAERESIS AND MACRON (LATIN CAPITAL LETTER A DIAERESIS MACRON) */ + ["\u01DE", "\u01DF"], /* LATIN SMALL LETTER A WITH DIAERESIS AND MACRON (LATIN SMALL LETTER A DIAERESIS MACRON) */ + ["\u01E0", "\u01E1"], /* LATIN CAPITAL LETTER A WITH DOT ABOVE AND MACRON (LATIN CAPITAL LETTER A DOT MACRON) */ + ["\u01E0", "\u01E1"], /* LATIN SMALL LETTER A WITH DOT ABOVE AND MACRON (LATIN SMALL LETTER A DOT MACRON) */ + ["\u01E2", "\u01E3"], /* LATIN CAPITAL LETTER AE WITH MACRON (LATIN CAPITAL LETTER A E MACRON) */ + ["\u01E2", "\u01E3"], /* LATIN SMALL LETTER AE WITH MACRON (LATIN SMALL LETTER A E MACRON) */ + ["\u01E4", "\u01E5"], /* LATIN CAPITAL LETTER G WITH STROKE (LATIN CAPITAL LETTER G BAR) */ + ["\u01E4", "\u01E5"], /* LATIN SMALL LETTER G WITH STROKE (LATIN SMALL LETTER G BAR) */ + ["\u01E6", "\u01E7"], /* LATIN CAPITAL LETTER G WITH CARON (LATIN CAPITAL LETTER G HACEK) */ + ["\u01E6", "\u01E7"], /* LATIN SMALL LETTER G WITH CARON (LATIN SMALL LETTER G HACEK) */ + ["\u01E8", "\u01E9"], /* LATIN CAPITAL LETTER K WITH CARON (LATIN CAPITAL LETTER K HACEK) */ + ["\u01E8", "\u01E9"], /* LATIN SMALL LETTER K WITH CARON (LATIN SMALL LETTER K HACEK) */ + ["\u01EA", "\u01EB"], /* LATIN CAPITAL LETTER O WITH OGONEK (LATIN CAPITAL LETTER O OGONEK) */ + ["\u01EA", "\u01EB"], /* LATIN SMALL LETTER O WITH OGONEK (LATIN SMALL LETTER O OGONEK) */ + ["\u01EC", "\u01ED"], /* LATIN CAPITAL LETTER O WITH OGONEK AND MACRON (LATIN CAPITAL LETTER O OGONEK MACRON) */ + ["\u01EC", "\u01ED"], /* LATIN SMALL LETTER O WITH OGONEK AND MACRON (LATIN SMALL LETTER O OGONEK MACRON) */ + ["\u01EE", "\u01EF"], /* LATIN CAPITAL LETTER EZH WITH CARON (LATIN CAPITAL LETTER YOGH HACEK) */ + ["\u01EE", "\u01EF"], /* LATIN SMALL LETTER EZH WITH CARON (LATIN SMALL LETTER YOGH HACEK) */ + ["\u004A\u030C", "\u01F0"], /* LATIN SMALL LETTER J WITH CARON (LATIN SMALL LETTER J HACEK) */ + ["\u01F1", "\u01F3"], /* LATIN CAPITAL LETTER DZ */ + ["\u01F1", "\u01F3"], /* LATIN CAPITAL LETTER D WITH SMALL LETTER Z */ + ["\u01F1", "\u01F3"], /* LATIN SMALL LETTER DZ */ + ["\u01F4", "\u01F5"], /* LATIN CAPITAL LETTER G WITH ACUTE */ + ["\u01F4", "\u01F5"], /* LATIN SMALL LETTER G WITH ACUTE */ + ["\u01F6", "\u0195"], /* LATIN CAPITAL LETTER HWAIR */ + ["\u01F7", "\u01BF"], /* LATIN CAPITAL LETTER WYNN */ + ["\u01F8", "\u01F9"], /* LATIN CAPITAL LETTER N WITH GRAVE */ + ["\u01F8", "\u01F9"], /* LATIN SMALL LETTER N WITH GRAVE */ + ["\u01FA", "\u01FB"], /* LATIN CAPITAL LETTER A WITH RING ABOVE AND ACUTE */ + ["\u01FA", "\u01FB"], /* LATIN SMALL LETTER A WITH RING ABOVE AND ACUTE */ + ["\u01FC", "\u01FD"], /* LATIN CAPITAL LETTER AE WITH ACUTE */ + ["\u01FC", "\u01FD"], /* LATIN SMALL LETTER AE WITH ACUTE */ + ["\u01FE", "\u01FF"], /* LATIN CAPITAL LETTER O WITH STROKE AND ACUTE */ + ["\u01FE", "\u01FF"], /* LATIN SMALL LETTER O WITH STROKE AND ACUTE */ + ["\u0200", "\u0201"], /* LATIN CAPITAL LETTER A WITH DOUBLE GRAVE */ + ["\u0200", "\u0201"], /* LATIN SMALL LETTER A WITH DOUBLE GRAVE */ + ["\u0202", "\u0203"], /* LATIN CAPITAL LETTER A WITH INVERTED BREVE */ + ["\u0202", "\u0203"], /* LATIN SMALL LETTER A WITH INVERTED BREVE */ + ["\u0204", "\u0205"], /* LATIN CAPITAL LETTER E WITH DOUBLE GRAVE */ + ["\u0204", "\u0205"], /* LATIN SMALL LETTER E WITH DOUBLE GRAVE */ + ["\u0206", "\u0207"], /* LATIN CAPITAL LETTER E WITH INVERTED BREVE */ + ["\u0206", "\u0207"], /* LATIN SMALL LETTER E WITH INVERTED BREVE */ + ["\u0208", "\u0209"], /* LATIN CAPITAL LETTER I WITH DOUBLE GRAVE */ + ["\u0208", "\u0209"], /* LATIN SMALL LETTER I WITH DOUBLE GRAVE */ + ["\u020A", "\u020B"], /* LATIN CAPITAL LETTER I WITH INVERTED BREVE */ + ["\u020A", "\u020B"], /* LATIN SMALL LETTER I WITH INVERTED BREVE */ + ["\u020C", "\u020D"], /* LATIN CAPITAL LETTER O WITH DOUBLE GRAVE */ + ["\u020C", "\u020D"], /* LATIN SMALL LETTER O WITH DOUBLE GRAVE */ + ["\u020E", "\u020F"], /* LATIN CAPITAL LETTER O WITH INVERTED BREVE */ + ["\u020E", "\u020F"], /* LATIN SMALL LETTER O WITH INVERTED BREVE */ + ["\u0210", "\u0211"], /* LATIN CAPITAL LETTER R WITH DOUBLE GRAVE */ + ["\u0210", "\u0211"], /* LATIN SMALL LETTER R WITH DOUBLE GRAVE */ + ["\u0212", "\u0213"], /* LATIN CAPITAL LETTER R WITH INVERTED BREVE */ + ["\u0212", "\u0213"], /* LATIN SMALL LETTER R WITH INVERTED BREVE */ + ["\u0214", "\u0215"], /* LATIN CAPITAL LETTER U WITH DOUBLE GRAVE */ + ["\u0214", "\u0215"], /* LATIN SMALL LETTER U WITH DOUBLE GRAVE */ + ["\u0216", "\u0217"], /* LATIN CAPITAL LETTER U WITH INVERTED BREVE */ + ["\u0216", "\u0217"], /* LATIN SMALL LETTER U WITH INVERTED BREVE */ + ["\u0218", "\u0219"], /* LATIN CAPITAL LETTER S WITH COMMA BELOW */ + ["\u0218", "\u0219"], /* LATIN SMALL LETTER S WITH COMMA BELOW */ + ["\u021A", "\u021B"], /* LATIN CAPITAL LETTER T WITH COMMA BELOW */ + ["\u021A", "\u021B"], /* LATIN SMALL LETTER T WITH COMMA BELOW */ + ["\u021C", "\u021D"], /* LATIN CAPITAL LETTER YOGH */ + ["\u021C", "\u021D"], /* LATIN SMALL LETTER YOGH */ + ["\u021E", "\u021F"], /* LATIN CAPITAL LETTER H WITH CARON */ + ["\u021E", "\u021F"], /* LATIN SMALL LETTER H WITH CARON */ + ["\u0220", "\u019E"], /* LATIN CAPITAL LETTER N WITH LONG RIGHT LEG */ + ["\u0221", "\u0221"], /* LATIN SMALL LETTER D WITH CURL */ + ["\u0222", "\u0223"], /* LATIN CAPITAL LETTER OU */ + ["\u0222", "\u0223"], /* LATIN SMALL LETTER OU */ + ["\u0224", "\u0225"], /* LATIN CAPITAL LETTER Z WITH HOOK */ + ["\u0224", "\u0225"], /* LATIN SMALL LETTER Z WITH HOOK */ + ["\u0226", "\u0227"], /* LATIN CAPITAL LETTER A WITH DOT ABOVE */ + ["\u0226", "\u0227"], /* LATIN SMALL LETTER A WITH DOT ABOVE */ + ["\u0228", "\u0229"], /* LATIN CAPITAL LETTER E WITH CEDILLA */ + ["\u0228", "\u0229"], /* LATIN SMALL LETTER E WITH CEDILLA */ + ["\u022A", "\u022B"], /* LATIN CAPITAL LETTER O WITH DIAERESIS AND MACRON */ + ["\u022A", "\u022B"], /* LATIN SMALL LETTER O WITH DIAERESIS AND MACRON */ + ["\u022C", "\u022D"], /* LATIN CAPITAL LETTER O WITH TILDE AND MACRON */ + ["\u022C", "\u022D"], /* LATIN SMALL LETTER O WITH TILDE AND MACRON */ + ["\u022E", "\u022F"], /* LATIN CAPITAL LETTER O WITH DOT ABOVE */ + ["\u022E", "\u022F"], /* LATIN SMALL LETTER O WITH DOT ABOVE */ + ["\u0230", "\u0231"], /* LATIN CAPITAL LETTER O WITH DOT ABOVE AND MACRON */ + ["\u0230", "\u0231"], /* LATIN SMALL LETTER O WITH DOT ABOVE AND MACRON */ + ["\u0232", "\u0233"], /* LATIN CAPITAL LETTER Y WITH MACRON */ + ["\u0232", "\u0233"], /* LATIN SMALL LETTER Y WITH MACRON */ + ["\u0234", "\u0234"], /* LATIN SMALL LETTER L WITH CURL */ + ["\u0235", "\u0235"], /* LATIN SMALL LETTER N WITH CURL */ + ["\u0236", "\u0236"], /* LATIN SMALL LETTER T WITH CURL */ + ["\u0237", "\u0237"], /* LATIN SMALL LETTER DOTLESS J */ + ["\u0238", "\u0238"], /* LATIN SMALL LETTER DB DIGRAPH */ + ["\u0239", "\u0239"], /* LATIN SMALL LETTER QP DIGRAPH */ + ["\u023A", "\u2C65"], /* LATIN CAPITAL LETTER A WITH STROKE */ + ["\u023B", "\u023C"], /* LATIN CAPITAL LETTER C WITH STROKE */ + ["\u023B", "\u023C"], /* LATIN SMALL LETTER C WITH STROKE */ + ["\u023D", "\u019A"], /* LATIN CAPITAL LETTER L WITH BAR */ + ["\u023E", "\u2C66"], /* LATIN CAPITAL LETTER T WITH DIAGONAL STROKE */ + ["\u2C7E", "\u023F"], /* LATIN SMALL LETTER S WITH SWASH TAIL */ + ["\u2C7F", "\u0240"], /* LATIN SMALL LETTER Z WITH SWASH TAIL */ + ["\u0241", "\u0242"], /* LATIN CAPITAL LETTER GLOTTAL STOP */ + ["\u0241", "\u0242"], /* LATIN SMALL LETTER GLOTTAL STOP */ + ["\u0243", "\u0180"], /* LATIN CAPITAL LETTER B WITH STROKE */ + ["\u0244", "\u0289"], /* LATIN CAPITAL LETTER U BAR */ + ["\u0245", "\u028C"], /* LATIN CAPITAL LETTER TURNED V */ + ["\u0246", "\u0247"], /* LATIN CAPITAL LETTER E WITH STROKE */ + ["\u0246", "\u0247"], /* LATIN SMALL LETTER E WITH STROKE */ + ["\u0248", "\u0249"], /* LATIN CAPITAL LETTER J WITH STROKE */ + ["\u0248", "\u0249"], /* LATIN SMALL LETTER J WITH STROKE */ + ["\u024A", "\u024B"], /* LATIN CAPITAL LETTER SMALL Q WITH HOOK TAIL */ + ["\u024A", "\u024B"], /* LATIN SMALL LETTER Q WITH HOOK TAIL */ + ["\u024C", "\u024D"], /* LATIN CAPITAL LETTER R WITH STROKE */ + ["\u024C", "\u024D"], /* LATIN SMALL LETTER R WITH STROKE */ + ["\u024E", "\u024F"], /* LATIN CAPITAL LETTER Y WITH STROKE */ + ["\u024E", "\u024F"], /* LATIN SMALL LETTER Y WITH STROKE */ + ["\u2C6F", "\u0250"], /* LATIN SMALL LETTER TURNED A */ + ["\u2C6D", "\u0251"], /* LATIN SMALL LETTER ALPHA (LATIN SMALL LETTER SCRIPT A) */ + ["\u2C70", "\u0252"], /* LATIN SMALL LETTER TURNED ALPHA (LATIN SMALL LETTER TURNED SCRIPT A) */ + ["\u0181", "\u0253"], /* LATIN SMALL LETTER B WITH HOOK (LATIN SMALL LETTER B HOOK) */ + ["\u0186", "\u0254"], /* LATIN SMALL LETTER OPEN O */ + ["\u0255", "\u0255"], /* LATIN SMALL LETTER C WITH CURL (LATIN SMALL LETTER C CURL) */ + ["\u0189", "\u0256"], /* LATIN SMALL LETTER D WITH TAIL (LATIN SMALL LETTER D RETROFLEX HOOK) */ + ["\u018A", "\u0257"], /* LATIN SMALL LETTER D WITH HOOK (LATIN SMALL LETTER D HOOK) */ + ["\u0258", "\u0258"], /* LATIN SMALL LETTER REVERSED E */ + ["\u018F", "\u0259"], /* LATIN SMALL LETTER SCHWA */ + ["\u025A", "\u025A"], /* LATIN SMALL LETTER SCHWA WITH HOOK (LATIN SMALL LETTER SCHWA HOOK) */ + ["\u0190", "\u025B"], /* LATIN SMALL LETTER OPEN E (LATIN SMALL LETTER EPSILON) */ + ["\uA7AB", "\u025C"], /* LATIN SMALL LETTER REVERSED OPEN E (LATIN SMALL LETTER REVERSED EPSILON) */ + ["\u025D", "\u025D"], /* LATIN SMALL LETTER REVERSED OPEN E WITH HOOK (LATIN SMALL LETTER REVERSED EPSILON HOOK) */ + ["\u025E", "\u025E"], /* LATIN SMALL LETTER CLOSED REVERSED OPEN E (LATIN SMALL LETTER CLOSED REVERSED EPSILON) */ + ["\u025F", "\u025F"], /* LATIN SMALL LETTER DOTLESS J WITH STROKE (LATIN SMALL LETTER DOTLESS J BAR) */ + ["\u0193", "\u0260"], /* LATIN SMALL LETTER G WITH HOOK (LATIN SMALL LETTER G HOOK) */ + ["\uA7AC", "\u0261"], /* LATIN SMALL LETTER SCRIPT G */ + ["\u0262", "\u0262"], /* LATIN LETTER SMALL CAPITAL G */ + ["\u0194", "\u0263"], /* LATIN SMALL LETTER GAMMA */ + ["\u0264", "\u0264"], /* LATIN SMALL LETTER RAMS HORN (LATIN SMALL LETTER BABY GAMMA) */ + ["\uA78D", "\u0265"], /* LATIN SMALL LETTER TURNED H */ + ["\uA7AA", "\u0266"], /* LATIN SMALL LETTER H WITH HOOK (LATIN SMALL LETTER H HOOK) */ + ["\u0267", "\u0267"], /* LATIN SMALL LETTER HENG WITH HOOK (LATIN SMALL LETTER HENG HOOK) */ + ["\u0197", "\u0268"], /* LATIN SMALL LETTER I WITH STROKE (LATIN SMALL LETTER BARRED I) */ + ["\u0196", "\u0269"], /* LATIN SMALL LETTER IOTA */ + ["\uA7AE", "\u026A"], /* LATIN LETTER SMALL CAPITAL I */ + ["\u2C62", "\u026B"], /* LATIN SMALL LETTER L WITH MIDDLE TILDE */ + ["\uA7AD", "\u026C"], /* LATIN SMALL LETTER L WITH BELT (LATIN SMALL LETTER L BELT) */ + ["\u026D", "\u026D"], /* LATIN SMALL LETTER L WITH RETROFLEX HOOK (LATIN SMALL LETTER L RETROFLEX HOOK) */ + ["\u026E", "\u026E"], /* LATIN SMALL LETTER LEZH (LATIN SMALL LETTER L YOGH) */ + ["\u019C", "\u026F"], /* LATIN SMALL LETTER TURNED M */ + ["\u0270", "\u0270"], /* LATIN SMALL LETTER TURNED M WITH LONG LEG */ + ["\u2C6E", "\u0271"], /* LATIN SMALL LETTER M WITH HOOK (LATIN SMALL LETTER M HOOK) */ + ["\u019D", "\u0272"], /* LATIN SMALL LETTER N WITH LEFT HOOK (LATIN SMALL LETTER N HOOK) */ + ["\u0273", "\u0273"], /* LATIN SMALL LETTER N WITH RETROFLEX HOOK (LATIN SMALL LETTER N RETROFLEX HOOK) */ + ["\u0274", "\u0274"], /* LATIN LETTER SMALL CAPITAL N */ + ["\u019F", "\u0275"], /* LATIN SMALL LETTER BARRED O */ + ["\u0276", "\u0276"], /* LATIN LETTER SMALL CAPITAL OE (LATIN LETTER SMALL CAPITAL O E) */ + ["\u0277", "\u0277"], /* LATIN SMALL LETTER CLOSED OMEGA */ + ["\u0278", "\u0278"], /* LATIN SMALL LETTER PHI */ + ["\u0279", "\u0279"], /* LATIN SMALL LETTER TURNED R */ + ["\u027A", "\u027A"], /* LATIN SMALL LETTER TURNED R WITH LONG LEG */ + ["\u027B", "\u027B"], /* LATIN SMALL LETTER TURNED R WITH HOOK (LATIN SMALL LETTER TURNED R HOOK) */ + ["\u027C", "\u027C"], /* LATIN SMALL LETTER R WITH LONG LEG */ + ["\u2C64", "\u027D"], /* LATIN SMALL LETTER R WITH TAIL (LATIN SMALL LETTER R HOOK) */ + ["\u027E", "\u027E"], /* LATIN SMALL LETTER R WITH FISHHOOK (LATIN SMALL LETTER FISHHOOK R) */ + ["\u027F", "\u027F"], /* LATIN SMALL LETTER REVERSED R WITH FISHHOOK (LATIN SMALL LETTER REVERSED FISHHOOK R) */ + ["\u01A6", "\u0280"], /* LATIN LETTER SMALL CAPITAL R */ + ["\u0281", "\u0281"], /* LATIN LETTER SMALL CAPITAL INVERTED R */ + ["\uA7C5", "\u0282"], /* LATIN SMALL LETTER S WITH HOOK (LATIN SMALL LETTER S HOOK) */ + ["\u01A9", "\u0283"], /* LATIN SMALL LETTER ESH */ + ["\u0284", "\u0284"], /* LATIN SMALL LETTER DOTLESS J WITH STROKE AND HOOK (LATIN SMALL LETTER DOTLESS J BAR HOOK) */ + ["\u0285", "\u0285"], /* LATIN SMALL LETTER SQUAT REVERSED ESH */ + ["\u0286", "\u0286"], /* LATIN SMALL LETTER ESH WITH CURL (LATIN SMALL LETTER ESH CURL) */ + ["\uA7B1", "\u0287"], /* LATIN SMALL LETTER TURNED T */ + ["\u01AE", "\u0288"], /* LATIN SMALL LETTER T WITH RETROFLEX HOOK (LATIN SMALL LETTER T RETROFLEX HOOK) */ + ["\u0244", "\u0289"], /* LATIN SMALL LETTER U BAR */ + ["\u01B1", "\u028A"], /* LATIN SMALL LETTER UPSILON */ + ["\u01B2", "\u028B"], /* LATIN SMALL LETTER V WITH HOOK (LATIN SMALL LETTER SCRIPT V) */ + ["\u0245", "\u028C"], /* LATIN SMALL LETTER TURNED V */ + ["\u028D", "\u028D"], /* LATIN SMALL LETTER TURNED W */ + ["\u028E", "\u028E"], /* LATIN SMALL LETTER TURNED Y */ + ["\u028F", "\u028F"], /* LATIN LETTER SMALL CAPITAL Y */ + ["\u0290", "\u0290"], /* LATIN SMALL LETTER Z WITH RETROFLEX HOOK (LATIN SMALL LETTER Z RETROFLEX HOOK) */ + ["\u0291", "\u0291"], /* LATIN SMALL LETTER Z WITH CURL (LATIN SMALL LETTER Z CURL) */ + ["\u01B7", "\u0292"], /* LATIN SMALL LETTER EZH (LATIN SMALL LETTER YOGH) */ + ["\u0293", "\u0293"], /* LATIN SMALL LETTER EZH WITH CURL (LATIN SMALL LETTER YOGH CURL) */ + ["\u0294", "\u0294"], /* LATIN LETTER GLOTTAL STOP */ + ["\u0295", "\u0295"], /* LATIN LETTER PHARYNGEAL VOICED FRICATIVE (LATIN LETTER REVERSED GLOTTAL STOP) */ + ["\u0296", "\u0296"], /* LATIN LETTER INVERTED GLOTTAL STOP */ + ["\u0297", "\u0297"], /* LATIN LETTER STRETCHED C */ + ["\u0298", "\u0298"], /* LATIN LETTER BILABIAL CLICK (LATIN LETTER BULLSEYE) */ + ["\u0299", "\u0299"], /* LATIN LETTER SMALL CAPITAL B */ + ["\u029A", "\u029A"], /* LATIN SMALL LETTER CLOSED OPEN E (LATIN SMALL LETTER CLOSED EPSILON) */ + ["\u029B", "\u029B"], /* LATIN LETTER SMALL CAPITAL G WITH HOOK (LATIN LETTER SMALL CAPITAL G HOOK) */ + ["\u029C", "\u029C"], /* LATIN LETTER SMALL CAPITAL H */ + ["\uA7B2", "\u029D"], /* LATIN SMALL LETTER J WITH CROSSED-TAIL (LATIN SMALL LETTER CROSSED-TAIL J) */ + ["\uA7B0", "\u029E"], /* LATIN SMALL LETTER TURNED K */ + ["\u029F", "\u029F"], /* LATIN LETTER SMALL CAPITAL L */ + ["\u02A0", "\u02A0"], /* LATIN SMALL LETTER Q WITH HOOK (LATIN SMALL LETTER Q HOOK) */ + ["\u02A1", "\u02A1"], /* LATIN LETTER GLOTTAL STOP WITH STROKE (LATIN LETTER GLOTTAL STOP BAR) */ + ["\u02A2", "\u02A2"], /* LATIN LETTER REVERSED GLOTTAL STOP WITH STROKE (LATIN LETTER REVERSED GLOTTAL STOP BAR) */ + ["\u02A3", "\u02A3"], /* LATIN SMALL LETTER DZ DIGRAPH (LATIN SMALL LETTER D Z) */ + ["\u02A4", "\u02A4"], /* LATIN SMALL LETTER DEZH DIGRAPH (LATIN SMALL LETTER D YOGH) */ + ["\u02A5", "\u02A5"], /* LATIN SMALL LETTER DZ DIGRAPH WITH CURL (LATIN SMALL LETTER D Z CURL) */ + ["\u02A6", "\u02A6"], /* LATIN SMALL LETTER TS DIGRAPH (LATIN SMALL LETTER T S) */ + ["\u02A7", "\u02A7"], /* LATIN SMALL LETTER TESH DIGRAPH (LATIN SMALL LETTER T ESH) */ + ["\u02A8", "\u02A8"], /* LATIN SMALL LETTER TC DIGRAPH WITH CURL (LATIN SMALL LETTER T C CURL) */ + ["\u02A9", "\u02A9"], /* LATIN SMALL LETTER FENG DIGRAPH */ + ["\u02AA", "\u02AA"], /* LATIN SMALL LETTER LS DIGRAPH */ + ["\u02AB", "\u02AB"], /* LATIN SMALL LETTER LZ DIGRAPH */ + ["\u02AC", "\u02AC"], /* LATIN LETTER BILABIAL PERCUSSIVE */ + ["\u02AD", "\u02AD"], /* LATIN LETTER BIDENTAL PERCUSSIVE */ + ["\u02AE", "\u02AE"], /* LATIN SMALL LETTER TURNED H WITH FISHHOOK */ + ["\u02AF", "\u02AF"], /* LATIN SMALL LETTER TURNED H WITH FISHHOOK AND TAIL */ + ["\u02B0", "\u02B0"], /* MODIFIER LETTER SMALL H */ + ["\u02B1", "\u02B1"], /* MODIFIER LETTER SMALL H WITH HOOK (MODIFIER LETTER SMALL H HOOK) */ + ["\u02B2", "\u02B2"], /* MODIFIER LETTER SMALL J */ + ["\u02B3", "\u02B3"], /* MODIFIER LETTER SMALL R */ + ["\u02B4", "\u02B4"], /* MODIFIER LETTER SMALL TURNED R */ + ["\u02B5", "\u02B5"], /* MODIFIER LETTER SMALL TURNED R WITH HOOK (MODIFIER LETTER SMALL TURNED R HOOK) */ + ["\u02B6", "\u02B6"], /* MODIFIER LETTER SMALL CAPITAL INVERTED R */ + ["\u02B7", "\u02B7"], /* MODIFIER LETTER SMALL W */ + ["\u02B8", "\u02B8"], /* MODIFIER LETTER SMALL Y */ + ["\u02B9", "\u02B9"], /* MODIFIER LETTER PRIME */ + ["\u02BA", "\u02BA"], /* MODIFIER LETTER DOUBLE PRIME */ + ["\u02BB", "\u02BB"], /* MODIFIER LETTER TURNED COMMA */ + ["\u02BC", "\u02BC"], /* MODIFIER LETTER APOSTROPHE */ + ["\u02BD", "\u02BD"], /* MODIFIER LETTER REVERSED COMMA */ + ["\u02BE", "\u02BE"], /* MODIFIER LETTER RIGHT HALF RING */ + ["\u02BF", "\u02BF"], /* MODIFIER LETTER LEFT HALF RING */ + ["\u02C0", "\u02C0"], /* MODIFIER LETTER GLOTTAL STOP */ + ["\u02C1", "\u02C1"], /* MODIFIER LETTER REVERSED GLOTTAL STOP */ + ["\u02C2", "\u02C2"], /* MODIFIER LETTER LEFT ARROWHEAD */ + ["\u02C3", "\u02C3"], /* MODIFIER LETTER RIGHT ARROWHEAD */ + ["\u02C4", "\u02C4"], /* MODIFIER LETTER UP ARROWHEAD */ + ["\u02C5", "\u02C5"], /* MODIFIER LETTER DOWN ARROWHEAD */ + ["\u02C6", "\u02C6"], /* MODIFIER LETTER CIRCUMFLEX ACCENT (MODIFIER LETTER CIRCUMFLEX) */ + ["\u02C7", "\u02C7"], /* CARON (MODIFIER LETTER HACEK) */ + ["\u02C8", "\u02C8"], /* MODIFIER LETTER VERTICAL LINE */ + ["\u02C9", "\u02C9"], /* MODIFIER LETTER MACRON */ + ["\u02CA", "\u02CA"], /* MODIFIER LETTER ACUTE ACCENT (MODIFIER LETTER ACUTE) */ + ["\u02CB", "\u02CB"], /* MODIFIER LETTER GRAVE ACCENT (MODIFIER LETTER GRAVE) */ + ["\u02CC", "\u02CC"], /* MODIFIER LETTER LOW VERTICAL LINE */ + ["\u02CD", "\u02CD"], /* MODIFIER LETTER LOW MACRON */ + ["\u02CE", "\u02CE"], /* MODIFIER LETTER LOW GRAVE ACCENT (MODIFIER LETTER LOW GRAVE) */ + ["\u02CF", "\u02CF"], /* MODIFIER LETTER LOW ACUTE ACCENT (MODIFIER LETTER LOW ACUTE) */ + ["\u02D0", "\u02D0"], /* MODIFIER LETTER TRIANGULAR COLON */ + ["\u02D1", "\u02D1"], /* MODIFIER LETTER HALF TRIANGULAR COLON */ + ["\u02D2", "\u02D2"], /* MODIFIER LETTER CENTRED RIGHT HALF RING (MODIFIER LETTER CENTERED RIGHT HALF RING) */ + ["\u02D3", "\u02D3"], /* MODIFIER LETTER CENTRED LEFT HALF RING (MODIFIER LETTER CENTERED LEFT HALF RING) */ + ["\u02D4", "\u02D4"], /* MODIFIER LETTER UP TACK */ + ["\u02D5", "\u02D5"], /* MODIFIER LETTER DOWN TACK */ + ["\u02D6", "\u02D6"], /* MODIFIER LETTER PLUS SIGN */ + ["\u02D7", "\u02D7"], /* MODIFIER LETTER MINUS SIGN */ + ["\u02D8", "\u02D8"], /* BREVE (SPACING BREVE) */ + ["\u02D9", "\u02D9"], /* DOT ABOVE (SPACING DOT ABOVE) */ + ["\u02DA", "\u02DA"], /* RING ABOVE (SPACING RING ABOVE) */ + ["\u02DB", "\u02DB"], /* OGONEK (SPACING OGONEK) */ + ["\u02DC", "\u02DC"], /* SMALL TILDE (SPACING TILDE) */ + ["\u02DD", "\u02DD"], /* DOUBLE ACUTE ACCENT (SPACING DOUBLE ACUTE) */ + ["\u02DE", "\u02DE"], /* MODIFIER LETTER RHOTIC HOOK */ + ["\u02DF", "\u02DF"], /* MODIFIER LETTER CROSS ACCENT */ + ["\u02E0", "\u02E0"], /* MODIFIER LETTER SMALL GAMMA */ + ["\u02E1", "\u02E1"], /* MODIFIER LETTER SMALL L */ + ["\u02E2", "\u02E2"], /* MODIFIER LETTER SMALL S */ + ["\u02E3", "\u02E3"], /* MODIFIER LETTER SMALL X */ + ["\u02E4", "\u02E4"], /* MODIFIER LETTER SMALL REVERSED GLOTTAL STOP */ + ["\u02E5", "\u02E5"], /* MODIFIER LETTER EXTRA-HIGH TONE BAR */ + ["\u02E6", "\u02E6"], /* MODIFIER LETTER HIGH TONE BAR */ + ["\u02E7", "\u02E7"], /* MODIFIER LETTER MID TONE BAR */ + ["\u02E8", "\u02E8"], /* MODIFIER LETTER LOW TONE BAR */ + ["\u02E9", "\u02E9"], /* MODIFIER LETTER EXTRA-LOW TONE BAR */ + ["\u02EA", "\u02EA"], /* MODIFIER LETTER YIN DEPARTING TONE MARK */ + ["\u02EB", "\u02EB"], /* MODIFIER LETTER YANG DEPARTING TONE MARK */ + ["\u02EC", "\u02EC"], /* MODIFIER LETTER VOICING */ + ["\u02ED", "\u02ED"], /* MODIFIER LETTER UNASPIRATED */ + ["\u02EE", "\u02EE"], /* MODIFIER LETTER DOUBLE APOSTROPHE */ + ["\u02EF", "\u02EF"], /* MODIFIER LETTER LOW DOWN ARROWHEAD */ + ["\u02F0", "\u02F0"], /* MODIFIER LETTER LOW UP ARROWHEAD */ + ["\u02F1", "\u02F1"], /* MODIFIER LETTER LOW LEFT ARROWHEAD */ + ["\u02F2", "\u02F2"], /* MODIFIER LETTER LOW RIGHT ARROWHEAD */ + ["\u02F3", "\u02F3"], /* MODIFIER LETTER LOW RING */ + ["\u02F4", "\u02F4"], /* MODIFIER LETTER MIDDLE GRAVE ACCENT */ + ["\u02F5", "\u02F5"], /* MODIFIER LETTER MIDDLE DOUBLE GRAVE ACCENT */ + ["\u02F6", "\u02F6"], /* MODIFIER LETTER MIDDLE DOUBLE ACUTE ACCENT */ + ["\u02F7", "\u02F7"], /* MODIFIER LETTER LOW TILDE */ + ["\u02F8", "\u02F8"], /* MODIFIER LETTER RAISED COLON */ + ["\u02F9", "\u02F9"], /* MODIFIER LETTER BEGIN HIGH TONE */ + ["\u02FA", "\u02FA"], /* MODIFIER LETTER END HIGH TONE */ + ["\u02FB", "\u02FB"], /* MODIFIER LETTER BEGIN LOW TONE */ + ["\u02FC", "\u02FC"], /* MODIFIER LETTER END LOW TONE */ + ["\u02FD", "\u02FD"], /* MODIFIER LETTER SHELF */ + ["\u02FE", "\u02FE"], /* MODIFIER LETTER OPEN SHELF */ + ["\u02FF", "\u02FF"], /* MODIFIER LETTER LOW LEFT ARROW */ + ["\u0300", "\u0300"], /* COMBINING GRAVE ACCENT (NON-SPACING GRAVE) */ + ["\u0301", "\u0301"], /* COMBINING ACUTE ACCENT (NON-SPACING ACUTE) */ + ["\u0302", "\u0302"], /* COMBINING CIRCUMFLEX ACCENT (NON-SPACING CIRCUMFLEX) */ + ["\u0303", "\u0303"], /* COMBINING TILDE (NON-SPACING TILDE) */ + ["\u0304", "\u0304"], /* COMBINING MACRON (NON-SPACING MACRON) */ + ["\u0305", "\u0305"], /* COMBINING OVERLINE (NON-SPACING OVERSCORE) */ + ["\u0306", "\u0306"], /* COMBINING BREVE (NON-SPACING BREVE) */ + ["\u0307", "\u0307"], /* COMBINING DOT ABOVE (NON-SPACING DOT ABOVE) */ + ["\u0308", "\u0308"], /* COMBINING DIAERESIS (NON-SPACING DIAERESIS) */ + ["\u0309", "\u0309"], /* COMBINING HOOK ABOVE (NON-SPACING HOOK ABOVE) */ + ["\u030A", "\u030A"], /* COMBINING RING ABOVE (NON-SPACING RING ABOVE) */ + ["\u030B", "\u030B"], /* COMBINING DOUBLE ACUTE ACCENT (NON-SPACING DOUBLE ACUTE) */ + ["\u030C", "\u030C"], /* COMBINING CARON (NON-SPACING HACEK) */ + ["\u030D", "\u030D"], /* COMBINING VERTICAL LINE ABOVE (NON-SPACING VERTICAL LINE ABOVE) */ + ["\u030E", "\u030E"], /* COMBINING DOUBLE VERTICAL LINE ABOVE (NON-SPACING DOUBLE VERTICAL LINE ABOVE) */ + ["\u030F", "\u030F"], /* COMBINING DOUBLE GRAVE ACCENT (NON-SPACING DOUBLE GRAVE) */ + ["\u0310", "\u0310"], /* COMBINING CANDRABINDU (NON-SPACING CANDRABINDU) */ + ["\u0311", "\u0311"], /* COMBINING INVERTED BREVE (NON-SPACING INVERTED BREVE) */ + ["\u0312", "\u0312"], /* COMBINING TURNED COMMA ABOVE (NON-SPACING TURNED COMMA ABOVE) */ + ["\u0313", "\u0313"], /* COMBINING COMMA ABOVE (NON-SPACING COMMA ABOVE) */ + ["\u0314", "\u0314"], /* COMBINING REVERSED COMMA ABOVE (NON-SPACING REVERSED COMMA ABOVE) */ + ["\u0315", "\u0315"], /* COMBINING COMMA ABOVE RIGHT (NON-SPACING COMMA ABOVE RIGHT) */ + ["\u0316", "\u0316"], /* COMBINING GRAVE ACCENT BELOW (NON-SPACING GRAVE BELOW) */ + ["\u0317", "\u0317"], /* COMBINING ACUTE ACCENT BELOW (NON-SPACING ACUTE BELOW) */ + ["\u0318", "\u0318"], /* COMBINING LEFT TACK BELOW (NON-SPACING LEFT TACK BELOW) */ + ["\u0319", "\u0319"], /* COMBINING RIGHT TACK BELOW (NON-SPACING RIGHT TACK BELOW) */ + ["\u031A", "\u031A"], /* COMBINING LEFT ANGLE ABOVE (NON-SPACING LEFT ANGLE ABOVE) */ + ["\u031B", "\u031B"], /* COMBINING HORN (NON-SPACING HORN) */ + ["\u031C", "\u031C"], /* COMBINING LEFT HALF RING BELOW (NON-SPACING LEFT HALF RING BELOW) */ + ["\u031D", "\u031D"], /* COMBINING UP TACK BELOW (NON-SPACING UP TACK BELOW) */ + ["\u031E", "\u031E"], /* COMBINING DOWN TACK BELOW (NON-SPACING DOWN TACK BELOW) */ + ["\u031F", "\u031F"], /* COMBINING PLUS SIGN BELOW (NON-SPACING PLUS SIGN BELOW) */ + ["\u0320", "\u0320"], /* COMBINING MINUS SIGN BELOW (NON-SPACING MINUS SIGN BELOW) */ + ["\u0321", "\u0321"], /* COMBINING PALATALIZED HOOK BELOW (NON-SPACING PALATALIZED HOOK BELOW) */ + ["\u0322", "\u0322"], /* COMBINING RETROFLEX HOOK BELOW (NON-SPACING RETROFLEX HOOK BELOW) */ + ["\u0323", "\u0323"], /* COMBINING DOT BELOW (NON-SPACING DOT BELOW) */ + ["\u0324", "\u0324"], /* COMBINING DIAERESIS BELOW (NON-SPACING DOUBLE DOT BELOW) */ + ["\u0325", "\u0325"], /* COMBINING RING BELOW (NON-SPACING RING BELOW) */ + ["\u0326", "\u0326"], /* COMBINING COMMA BELOW (NON-SPACING COMMA BELOW) */ + ["\u0327", "\u0327"], /* COMBINING CEDILLA (NON-SPACING CEDILLA) */ + ["\u0328", "\u0328"], /* COMBINING OGONEK (NON-SPACING OGONEK) */ + ["\u0329", "\u0329"], /* COMBINING VERTICAL LINE BELOW (NON-SPACING VERTICAL LINE BELOW) */ + ["\u032A", "\u032A"], /* COMBINING BRIDGE BELOW (NON-SPACING BRIDGE BELOW) */ + ["\u032B", "\u032B"], /* COMBINING INVERTED DOUBLE ARCH BELOW (NON-SPACING INVERTED DOUBLE ARCH BELOW) */ + ["\u032C", "\u032C"], /* COMBINING CARON BELOW (NON-SPACING HACEK BELOW) */ + ["\u032D", "\u032D"], /* COMBINING CIRCUMFLEX ACCENT BELOW (NON-SPACING CIRCUMFLEX BELOW) */ + ["\u032E", "\u032E"], /* COMBINING BREVE BELOW (NON-SPACING BREVE BELOW) */ + ["\u032F", "\u032F"], /* COMBINING INVERTED BREVE BELOW (NON-SPACING INVERTED BREVE BELOW) */ + ["\u0330", "\u0330"], /* COMBINING TILDE BELOW (NON-SPACING TILDE BELOW) */ + ["\u0331", "\u0331"], /* COMBINING MACRON BELOW (NON-SPACING MACRON BELOW) */ + ["\u0332", "\u0332"], /* COMBINING LOW LINE (NON-SPACING UNDERSCORE) */ + ["\u0333", "\u0333"], /* COMBINING DOUBLE LOW LINE (NON-SPACING DOUBLE UNDERSCORE) */ + ["\u0334", "\u0334"], /* COMBINING TILDE OVERLAY (NON-SPACING TILDE OVERLAY) */ + ["\u0335", "\u0335"], /* COMBINING SHORT STROKE OVERLAY (NON-SPACING SHORT BAR OVERLAY) */ + ["\u0336", "\u0336"], /* COMBINING LONG STROKE OVERLAY (NON-SPACING LONG BAR OVERLAY) */ + ["\u0337", "\u0337"], /* COMBINING SHORT SOLIDUS OVERLAY (NON-SPACING SHORT SLASH OVERLAY) */ + ["\u0338", "\u0338"], /* COMBINING LONG SOLIDUS OVERLAY (NON-SPACING LONG SLASH OVERLAY) */ + ["\u0339", "\u0339"], /* COMBINING RIGHT HALF RING BELOW (NON-SPACING RIGHT HALF RING BELOW) */ + ["\u033A", "\u033A"], /* COMBINING INVERTED BRIDGE BELOW (NON-SPACING INVERTED BRIDGE BELOW) */ + ["\u033B", "\u033B"], /* COMBINING SQUARE BELOW (NON-SPACING SQUARE BELOW) */ + ["\u033C", "\u033C"], /* COMBINING SEAGULL BELOW (NON-SPACING SEAGULL BELOW) */ + ["\u033D", "\u033D"], /* COMBINING X ABOVE (NON-SPACING X ABOVE) */ + ["\u033E", "\u033E"], /* COMBINING VERTICAL TILDE (NON-SPACING VERTICAL TILDE) */ + ["\u033F", "\u033F"], /* COMBINING DOUBLE OVERLINE (NON-SPACING DOUBLE OVERSCORE) */ + ["\u0340", "\u0340"], /* COMBINING GRAVE TONE MARK (NON-SPACING GRAVE TONE MARK) */ + ["\u0341", "\u0341"], /* COMBINING ACUTE TONE MARK (NON-SPACING ACUTE TONE MARK) */ + ["\u0342", "\u0342"], /* COMBINING GREEK PERISPOMENI */ + ["\u0343", "\u0343"], /* COMBINING GREEK KORONIS */ + ["\u0344", "\u0344"], /* COMBINING GREEK DIALYTIKA TONOS (GREEK NON-SPACING DIAERESIS TONOS) */ + ["\u0399", "\u0345"], /* COMBINING GREEK YPOGEGRAMMENI (GREEK NON-SPACING IOTA BELOW) */ + ["\u0346", "\u0346"], /* COMBINING BRIDGE ABOVE */ + ["\u0347", "\u0347"], /* COMBINING EQUALS SIGN BELOW */ + ["\u0348", "\u0348"], /* COMBINING DOUBLE VERTICAL LINE BELOW */ + ["\u0349", "\u0349"], /* COMBINING LEFT ANGLE BELOW */ + ["\u034A", "\u034A"], /* COMBINING NOT TILDE ABOVE */ + ["\u034B", "\u034B"], /* COMBINING HOMOTHETIC ABOVE */ + ["\u034C", "\u034C"], /* COMBINING ALMOST EQUAL TO ABOVE */ + ["\u034D", "\u034D"], /* COMBINING LEFT RIGHT ARROW BELOW */ + ["\u034E", "\u034E"], /* COMBINING UPWARDS ARROW BELOW */ + ["\u034F", "\u034F"], /* COMBINING GRAPHEME JOINER */ + ["\u0350", "\u0350"], /* COMBINING RIGHT ARROWHEAD ABOVE */ + ["\u0351", "\u0351"], /* COMBINING LEFT HALF RING ABOVE */ + ["\u0352", "\u0352"], /* COMBINING FERMATA */ + ["\u0353", "\u0353"], /* COMBINING X BELOW */ + ["\u0354", "\u0354"], /* COMBINING LEFT ARROWHEAD BELOW */ + ["\u0355", "\u0355"], /* COMBINING RIGHT ARROWHEAD BELOW */ + ["\u0356", "\u0356"], /* COMBINING RIGHT ARROWHEAD AND UP ARROWHEAD BELOW */ + ["\u0357", "\u0357"], /* COMBINING RIGHT HALF RING ABOVE */ + ["\u0358", "\u0358"], /* COMBINING DOT ABOVE RIGHT */ + ["\u0359", "\u0359"], /* COMBINING ASTERISK BELOW */ + ["\u035A", "\u035A"], /* COMBINING DOUBLE RING BELOW */ + ["\u035B", "\u035B"], /* COMBINING ZIGZAG ABOVE */ + ["\u035C", "\u035C"], /* COMBINING DOUBLE BREVE BELOW */ + ["\u035D", "\u035D"], /* COMBINING DOUBLE BREVE */ + ["\u035E", "\u035E"], /* COMBINING DOUBLE MACRON */ + ["\u035F", "\u035F"], /* COMBINING DOUBLE MACRON BELOW */ + ["\u0360", "\u0360"], /* COMBINING DOUBLE TILDE */ + ["\u0361", "\u0361"], /* COMBINING DOUBLE INVERTED BREVE */ + ["\u0362", "\u0362"], /* COMBINING DOUBLE RIGHTWARDS ARROW BELOW */ + ["\u0363", "\u0363"], /* COMBINING LATIN SMALL LETTER A */ + ["\u0364", "\u0364"], /* COMBINING LATIN SMALL LETTER E */ + ["\u0365", "\u0365"], /* COMBINING LATIN SMALL LETTER I */ + ["\u0366", "\u0366"], /* COMBINING LATIN SMALL LETTER O */ + ["\u0367", "\u0367"], /* COMBINING LATIN SMALL LETTER U */ + ["\u0368", "\u0368"], /* COMBINING LATIN SMALL LETTER C */ + ["\u0369", "\u0369"], /* COMBINING LATIN SMALL LETTER D */ + ["\u036A", "\u036A"], /* COMBINING LATIN SMALL LETTER H */ + ["\u036B", "\u036B"], /* COMBINING LATIN SMALL LETTER M */ + ["\u036C", "\u036C"], /* COMBINING LATIN SMALL LETTER R */ + ["\u036D", "\u036D"], /* COMBINING LATIN SMALL LETTER T */ + ["\u036E", "\u036E"], /* COMBINING LATIN SMALL LETTER V */ + ["\u036F", "\u036F"], /* COMBINING LATIN SMALL LETTER X */ + ["\u0370", "\u0371"], /* GREEK CAPITAL LETTER HETA */ + ["\u0370", "\u0371"], /* GREEK SMALL LETTER HETA */ + ["\u0372", "\u0373"], /* GREEK CAPITAL LETTER ARCHAIC SAMPI */ + ["\u0372", "\u0373"], /* GREEK SMALL LETTER ARCHAIC SAMPI */ + ["\u0374", "\u0374"], /* GREEK NUMERAL SIGN (GREEK UPPER NUMERAL SIGN) */ + ["\u0375", "\u0375"], /* GREEK LOWER NUMERAL SIGN */ + ["\u0376", "\u0377"], /* GREEK CAPITAL LETTER PAMPHYLIAN DIGAMMA */ + ["\u0376", "\u0377"], /* GREEK SMALL LETTER PAMPHYLIAN DIGAMMA */ + ["\u0378", "\u0378"], + ["\u0379", "\u0379"], + ["\u037A", "\u037A"], /* GREEK YPOGEGRAMMENI (GREEK SPACING IOTA BELOW) */ + ["\u03FD", "\u037B"], /* GREEK SMALL REVERSED LUNATE SIGMA SYMBOL */ + ["\u03FE", "\u037C"], /* GREEK SMALL DOTTED LUNATE SIGMA SYMBOL */ + ["\u03FF", "\u037D"], /* GREEK SMALL REVERSED DOTTED LUNATE SIGMA SYMBOL */ + ["\u037E", "\u037E"], /* GREEK QUESTION MARK */ + ["\u037F", "\u03F3"], /* GREEK CAPITAL LETTER YOT */ + ["\u0380", "\u0380"], + ["\u0381", "\u0381"], + ["\u0382", "\u0382"], + ["\u0383", "\u0383"], + ["\u0384", "\u0384"], /* GREEK TONOS (GREEK SPACING TONOS) */ + ["\u0385", "\u0385"], /* GREEK DIALYTIKA TONOS (GREEK SPACING DIAERESIS TONOS) */ + ["\u0386", "\u03AC"], /* GREEK CAPITAL LETTER ALPHA WITH TONOS (GREEK CAPITAL LETTER ALPHA TONOS) */ + ["\u0387", "\u0387"], /* GREEK ANO TELEIA */ + ["\u0388", "\u03AD"], /* GREEK CAPITAL LETTER EPSILON WITH TONOS (GREEK CAPITAL LETTER EPSILON TONOS) */ + ["\u0389", "\u03AE"], /* GREEK CAPITAL LETTER ETA WITH TONOS (GREEK CAPITAL LETTER ETA TONOS) */ + ["\u038A", "\u03AF"], /* GREEK CAPITAL LETTER IOTA WITH TONOS (GREEK CAPITAL LETTER IOTA TONOS) */ + ["\u038B", "\u038B"], + ["\u038C", "\u03CC"], /* GREEK CAPITAL LETTER OMICRON WITH TONOS (GREEK CAPITAL LETTER OMICRON TONOS) */ + ["\u038D", "\u038D"], + ["\u038E", "\u03CD"], /* GREEK CAPITAL LETTER UPSILON WITH TONOS (GREEK CAPITAL LETTER UPSILON TONOS) */ + ["\u038F", "\u03CE"], /* GREEK CAPITAL LETTER OMEGA WITH TONOS (GREEK CAPITAL LETTER OMEGA TONOS) */ + ["\u0399\u0308\u0301", "\u0390"], /* GREEK SMALL LETTER IOTA WITH DIALYTIKA AND TONOS (GREEK SMALL LETTER IOTA DIAERESIS TONOS) */ + ["\u0391", "\u03B1"], /* GREEK CAPITAL LETTER ALPHA */ + ["\u0392", "\u03B2"], /* GREEK CAPITAL LETTER BETA */ + ["\u0393", "\u03B3"], /* GREEK CAPITAL LETTER GAMMA */ + ["\u0394", "\u03B4"], /* GREEK CAPITAL LETTER DELTA */ + ["\u0395", "\u03B5"], /* GREEK CAPITAL LETTER EPSILON */ + ["\u0396", "\u03B6"], /* GREEK CAPITAL LETTER ZETA */ + ["\u0397", "\u03B7"], /* GREEK CAPITAL LETTER ETA */ + ["\u0398", "\u03B8"], /* GREEK CAPITAL LETTER THETA */ + ["\u0399", "\u03B9"], /* GREEK CAPITAL LETTER IOTA */ + ["\u039A", "\u03BA"], /* GREEK CAPITAL LETTER KAPPA */ + ["\u039B", "\u03BB"], /* GREEK CAPITAL LETTER LAMDA (GREEK CAPITAL LETTER LAMBDA) */ + ["\u039C", "\u03BC"], /* GREEK CAPITAL LETTER MU */ + ["\u039D", "\u03BD"], /* GREEK CAPITAL LETTER NU */ + ["\u039E", "\u03BE"], /* GREEK CAPITAL LETTER XI */ + ["\u039F", "\u03BF"], /* GREEK CAPITAL LETTER OMICRON */ + ["\u03A0", "\u03C0"], /* GREEK CAPITAL LETTER PI */ + ["\u03A1", "\u03C1"], /* GREEK CAPITAL LETTER RHO */ + ["\u03A2", "\u03A2"], + ["\u03A3", "\u03C3"], /* GREEK CAPITAL LETTER SIGMA */ + ["\u03A4", "\u03C4"], /* GREEK CAPITAL LETTER TAU */ + ["\u03A5", "\u03C5"], /* GREEK CAPITAL LETTER UPSILON */ + ["\u03A6", "\u03C6"], /* GREEK CAPITAL LETTER PHI */ + ["\u03A7", "\u03C7"], /* GREEK CAPITAL LETTER CHI */ + ["\u03A8", "\u03C8"], /* GREEK CAPITAL LETTER PSI */ + ["\u03A9", "\u03C9"], /* GREEK CAPITAL LETTER OMEGA */ + ["\u03AA", "\u03CA"], /* GREEK CAPITAL LETTER IOTA WITH DIALYTIKA (GREEK CAPITAL LETTER IOTA DIAERESIS) */ + ["\u03AB", "\u03CB"], /* GREEK CAPITAL LETTER UPSILON WITH DIALYTIKA (GREEK CAPITAL LETTER UPSILON DIAERESIS) */ + ["\u0386", "\u03AC"], /* GREEK SMALL LETTER ALPHA WITH TONOS (GREEK SMALL LETTER ALPHA TONOS) */ + ["\u0388", "\u03AD"], /* GREEK SMALL LETTER EPSILON WITH TONOS (GREEK SMALL LETTER EPSILON TONOS) */ + ["\u0389", "\u03AE"], /* GREEK SMALL LETTER ETA WITH TONOS (GREEK SMALL LETTER ETA TONOS) */ + ["\u038A", "\u03AF"], /* GREEK SMALL LETTER IOTA WITH TONOS (GREEK SMALL LETTER IOTA TONOS) */ + ["\u03A5\u0308\u0301", "\u03B0"], /* GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND TONOS (GREEK SMALL LETTER UPSILON DIAERESIS TONOS) */ + ["\u0391", "\u03B1"], /* GREEK SMALL LETTER ALPHA */ + ["\u0392", "\u03B2"], /* GREEK SMALL LETTER BETA */ + ["\u0393", "\u03B3"], /* GREEK SMALL LETTER GAMMA */ + ["\u0394", "\u03B4"], /* GREEK SMALL LETTER DELTA */ + ["\u0395", "\u03B5"], /* GREEK SMALL LETTER EPSILON */ + ["\u0396", "\u03B6"], /* GREEK SMALL LETTER ZETA */ + ["\u0397", "\u03B7"], /* GREEK SMALL LETTER ETA */ + ["\u0398", "\u03B8"], /* GREEK SMALL LETTER THETA */ + ["\u0399", "\u03B9"], /* GREEK SMALL LETTER IOTA */ + ["\u039A", "\u03BA"], /* GREEK SMALL LETTER KAPPA */ + ["\u039B", "\u03BB"], /* GREEK SMALL LETTER LAMDA (GREEK SMALL LETTER LAMBDA) */ + ["\u039C", "\u03BC"], /* GREEK SMALL LETTER MU */ + ["\u039D", "\u03BD"], /* GREEK SMALL LETTER NU */ + ["\u039E", "\u03BE"], /* GREEK SMALL LETTER XI */ + ["\u039F", "\u03BF"], /* GREEK SMALL LETTER OMICRON */ + ["\u03A0", "\u03C0"], /* GREEK SMALL LETTER PI */ + ["\u03A1", "\u03C1"], /* GREEK SMALL LETTER RHO */ + ["\u03A3", "\u03C2"], /* GREEK SMALL LETTER FINAL SIGMA */ + ["\u03A3", "\u03C3"], /* GREEK SMALL LETTER SIGMA */ + ["\u03A4", "\u03C4"], /* GREEK SMALL LETTER TAU */ + ["\u03A5", "\u03C5"], /* GREEK SMALL LETTER UPSILON */ + ["\u03A6", "\u03C6"], /* GREEK SMALL LETTER PHI */ + ["\u03A7", "\u03C7"], /* GREEK SMALL LETTER CHI */ + ["\u03A8", "\u03C8"], /* GREEK SMALL LETTER PSI */ + ["\u03A9", "\u03C9"], /* GREEK SMALL LETTER OMEGA */ + ["\u03AA", "\u03CA"], /* GREEK SMALL LETTER IOTA WITH DIALYTIKA (GREEK SMALL LETTER IOTA DIAERESIS) */ + ["\u03AB", "\u03CB"], /* GREEK SMALL LETTER UPSILON WITH DIALYTIKA (GREEK SMALL LETTER UPSILON DIAERESIS) */ + ["\u038C", "\u03CC"], /* GREEK SMALL LETTER OMICRON WITH TONOS (GREEK SMALL LETTER OMICRON TONOS) */ + ["\u038E", "\u03CD"], /* GREEK SMALL LETTER UPSILON WITH TONOS (GREEK SMALL LETTER UPSILON TONOS) */ + ["\u038F", "\u03CE"], /* GREEK SMALL LETTER OMEGA WITH TONOS (GREEK SMALL LETTER OMEGA TONOS) */ + ["\u03CF", "\u03D7"], /* GREEK CAPITAL KAI SYMBOL */ + ["\u0392", "\u03D0"], /* GREEK BETA SYMBOL (GREEK SMALL LETTER CURLED BETA) */ + ["\u0398", "\u03D1"], /* GREEK THETA SYMBOL (GREEK SMALL LETTER SCRIPT THETA) */ + ["\u03D2", "\u03D2"], /* GREEK UPSILON WITH HOOK SYMBOL (GREEK CAPITAL LETTER UPSILON HOOK) */ + ["\u03D3", "\u03D3"], /* GREEK UPSILON WITH ACUTE AND HOOK SYMBOL (GREEK CAPITAL LETTER UPSILON HOOK TONOS) */ + ["\u03D4", "\u03D4"], /* GREEK UPSILON WITH DIAERESIS AND HOOK SYMBOL (GREEK CAPITAL LETTER UPSILON HOOK DIAERESIS) */ + ["\u03A6", "\u03D5"], /* GREEK PHI SYMBOL (GREEK SMALL LETTER SCRIPT PHI) */ + ["\u03A0", "\u03D6"], /* GREEK PI SYMBOL (GREEK SMALL LETTER OMEGA PI) */ + ["\u03CF", "\u03D7"], /* GREEK KAI SYMBOL */ + ["\u03D8", "\u03D9"], /* GREEK LETTER ARCHAIC KOPPA */ + ["\u03D8", "\u03D9"], /* GREEK SMALL LETTER ARCHAIC KOPPA */ + ["\u03DA", "\u03DB"], /* GREEK LETTER STIGMA (GREEK CAPITAL LETTER STIGMA) */ + ["\u03DA", "\u03DB"], /* GREEK SMALL LETTER STIGMA */ + ["\u03DC", "\u03DD"], /* GREEK LETTER DIGAMMA (GREEK CAPITAL LETTER DIGAMMA) */ + ["\u03DC", "\u03DD"], /* GREEK SMALL LETTER DIGAMMA */ + ["\u03DE", "\u03DF"], /* GREEK LETTER KOPPA (GREEK CAPITAL LETTER KOPPA) */ + ["\u03DE", "\u03DF"], /* GREEK SMALL LETTER KOPPA */ + ["\u03E0", "\u03E1"], /* GREEK LETTER SAMPI (GREEK CAPITAL LETTER SAMPI) */ + ["\u03E0", "\u03E1"], /* GREEK SMALL LETTER SAMPI */ + ["\u03E2", "\u03E3"], /* COPTIC CAPITAL LETTER SHEI (GREEK CAPITAL LETTER SHEI) */ + ["\u03E2", "\u03E3"], /* COPTIC SMALL LETTER SHEI (GREEK SMALL LETTER SHEI) */ + ["\u03E4", "\u03E5"], /* COPTIC CAPITAL LETTER FEI (GREEK CAPITAL LETTER FEI) */ + ["\u03E4", "\u03E5"], /* COPTIC SMALL LETTER FEI (GREEK SMALL LETTER FEI) */ + ["\u03E6", "\u03E7"], /* COPTIC CAPITAL LETTER KHEI (GREEK CAPITAL LETTER KHEI) */ + ["\u03E6", "\u03E7"], /* COPTIC SMALL LETTER KHEI (GREEK SMALL LETTER KHEI) */ + ["\u03E8", "\u03E9"], /* COPTIC CAPITAL LETTER HORI (GREEK CAPITAL LETTER HORI) */ + ["\u03E8", "\u03E9"], /* COPTIC SMALL LETTER HORI (GREEK SMALL LETTER HORI) */ + ["\u03EA", "\u03EB"], /* COPTIC CAPITAL LETTER GANGIA (GREEK CAPITAL LETTER GANGIA) */ + ["\u03EA", "\u03EB"], /* COPTIC SMALL LETTER GANGIA (GREEK SMALL LETTER GANGIA) */ + ["\u03EC", "\u03ED"], /* COPTIC CAPITAL LETTER SHIMA (GREEK CAPITAL LETTER SHIMA) */ + ["\u03EC", "\u03ED"], /* COPTIC SMALL LETTER SHIMA (GREEK SMALL LETTER SHIMA) */ + ["\u03EE", "\u03EF"], /* COPTIC CAPITAL LETTER DEI (GREEK CAPITAL LETTER DEI) */ + ["\u03EE", "\u03EF"], /* COPTIC SMALL LETTER DEI (GREEK SMALL LETTER DEI) */ + ["\u039A", "\u03F0"], /* GREEK KAPPA SYMBOL (GREEK SMALL LETTER SCRIPT KAPPA) */ + ["\u03A1", "\u03F1"], /* GREEK RHO SYMBOL (GREEK SMALL LETTER TAILED RHO) */ + ["\u03F9", "\u03F2"], /* GREEK LUNATE SIGMA SYMBOL (GREEK SMALL LETTER LUNATE SIGMA) */ + ["\u037F", "\u03F3"], /* GREEK LETTER YOT */ + ["\u03F4", "\u03B8"], /* GREEK CAPITAL THETA SYMBOL */ + ["\u0395", "\u03F5"], /* GREEK LUNATE EPSILON SYMBOL */ + ["\u03F6", "\u03F6"], /* GREEK REVERSED LUNATE EPSILON SYMBOL */ + ["\u03F7", "\u03F8"], /* GREEK CAPITAL LETTER SHO */ + ["\u03F7", "\u03F8"], /* GREEK SMALL LETTER SHO */ + ["\u03F9", "\u03F2"], /* GREEK CAPITAL LUNATE SIGMA SYMBOL */ + ["\u03FA", "\u03FB"], /* GREEK CAPITAL LETTER SAN */ + ["\u03FA", "\u03FB"], /* GREEK SMALL LETTER SAN */ + ["\u03FC", "\u03FC"], /* GREEK RHO WITH STROKE SYMBOL */ + ["\u03FD", "\u037B"], /* GREEK CAPITAL REVERSED LUNATE SIGMA SYMBOL */ + ["\u03FE", "\u037C"], /* GREEK CAPITAL DOTTED LUNATE SIGMA SYMBOL */ + ["\u03FF", "\u037D"], /* GREEK CAPITAL REVERSED DOTTED LUNATE SIGMA SYMBOL */ + ["\u0400", "\u0450"], /* CYRILLIC CAPITAL LETTER IE WITH GRAVE */ + ["\u0401", "\u0451"], /* CYRILLIC CAPITAL LETTER IO */ + ["\u0402", "\u0452"], /* CYRILLIC CAPITAL LETTER DJE */ + ["\u0403", "\u0453"], /* CYRILLIC CAPITAL LETTER GJE */ + ["\u0404", "\u0454"], /* CYRILLIC CAPITAL LETTER UKRAINIAN IE (CYRILLIC CAPITAL LETTER E) */ + ["\u0405", "\u0455"], /* CYRILLIC CAPITAL LETTER DZE */ + ["\u0406", "\u0456"], /* CYRILLIC CAPITAL LETTER BYELORUSSIAN-UKRAINIAN I (CYRILLIC CAPITAL LETTER I) */ + ["\u0407", "\u0457"], /* CYRILLIC CAPITAL LETTER YI */ + ["\u0408", "\u0458"], /* CYRILLIC CAPITAL LETTER JE */ + ["\u0409", "\u0459"], /* CYRILLIC CAPITAL LETTER LJE */ + ["\u040A", "\u045A"], /* CYRILLIC CAPITAL LETTER NJE */ + ["\u040B", "\u045B"], /* CYRILLIC CAPITAL LETTER TSHE */ + ["\u040C", "\u045C"], /* CYRILLIC CAPITAL LETTER KJE */ + ["\u040D", "\u045D"], /* CYRILLIC CAPITAL LETTER I WITH GRAVE */ + ["\u040E", "\u045E"], /* CYRILLIC CAPITAL LETTER SHORT U */ + ["\u040F", "\u045F"], /* CYRILLIC CAPITAL LETTER DZHE */ + ["\u0410", "\u0430"], /* CYRILLIC CAPITAL LETTER A */ + ["\u0411", "\u0431"], /* CYRILLIC CAPITAL LETTER BE */ + ["\u0412", "\u0432"], /* CYRILLIC CAPITAL LETTER VE */ + ["\u0413", "\u0433"], /* CYRILLIC CAPITAL LETTER GHE (CYRILLIC CAPITAL LETTER GE) */ + ["\u0414", "\u0434"], /* CYRILLIC CAPITAL LETTER DE */ + ["\u0415", "\u0435"], /* CYRILLIC CAPITAL LETTER IE */ + ["\u0416", "\u0436"], /* CYRILLIC CAPITAL LETTER ZHE */ + ["\u0417", "\u0437"], /* CYRILLIC CAPITAL LETTER ZE */ + ["\u0418", "\u0438"], /* CYRILLIC CAPITAL LETTER I (CYRILLIC CAPITAL LETTER II) */ + ["\u0419", "\u0439"], /* CYRILLIC CAPITAL LETTER SHORT I (CYRILLIC CAPITAL LETTER SHORT II) */ + ["\u041A", "\u043A"], /* CYRILLIC CAPITAL LETTER KA */ + ["\u041B", "\u043B"], /* CYRILLIC CAPITAL LETTER EL */ + ["\u041C", "\u043C"], /* CYRILLIC CAPITAL LETTER EM */ + ["\u041D", "\u043D"], /* CYRILLIC CAPITAL LETTER EN */ + ["\u041E", "\u043E"], /* CYRILLIC CAPITAL LETTER O */ + ["\u041F", "\u043F"], /* CYRILLIC CAPITAL LETTER PE */ + ["\u0420", "\u0440"], /* CYRILLIC CAPITAL LETTER ER */ + ["\u0421", "\u0441"], /* CYRILLIC CAPITAL LETTER ES */ + ["\u0422", "\u0442"], /* CYRILLIC CAPITAL LETTER TE */ + ["\u0423", "\u0443"], /* CYRILLIC CAPITAL LETTER U */ + ["\u0424", "\u0444"], /* CYRILLIC CAPITAL LETTER EF */ + ["\u0425", "\u0445"], /* CYRILLIC CAPITAL LETTER HA (CYRILLIC CAPITAL LETTER KHA) */ + ["\u0426", "\u0446"], /* CYRILLIC CAPITAL LETTER TSE */ + ["\u0427", "\u0447"], /* CYRILLIC CAPITAL LETTER CHE */ + ["\u0428", "\u0448"], /* CYRILLIC CAPITAL LETTER SHA */ + ["\u0429", "\u0449"], /* CYRILLIC CAPITAL LETTER SHCHA */ + ["\u042A", "\u044A"], /* CYRILLIC CAPITAL LETTER HARD SIGN */ + ["\u042B", "\u044B"], /* CYRILLIC CAPITAL LETTER YERU (CYRILLIC CAPITAL LETTER YERI) */ + ["\u042C", "\u044C"], /* CYRILLIC CAPITAL LETTER SOFT SIGN */ + ["\u042D", "\u044D"], /* CYRILLIC CAPITAL LETTER E (CYRILLIC CAPITAL LETTER REVERSED E) */ + ["\u042E", "\u044E"], /* CYRILLIC CAPITAL LETTER YU (CYRILLIC CAPITAL LETTER IU) */ + ["\u042F", "\u044F"], /* CYRILLIC CAPITAL LETTER YA (CYRILLIC CAPITAL LETTER IA) */ + ["\u0410", "\u0430"], /* CYRILLIC SMALL LETTER A */ + ["\u0411", "\u0431"], /* CYRILLIC SMALL LETTER BE */ + ["\u0412", "\u0432"], /* CYRILLIC SMALL LETTER VE */ + ["\u0413", "\u0433"], /* CYRILLIC SMALL LETTER GHE (CYRILLIC SMALL LETTER GE) */ + ["\u0414", "\u0434"], /* CYRILLIC SMALL LETTER DE */ + ["\u0415", "\u0435"], /* CYRILLIC SMALL LETTER IE */ + ["\u0416", "\u0436"], /* CYRILLIC SMALL LETTER ZHE */ + ["\u0417", "\u0437"], /* CYRILLIC SMALL LETTER ZE */ + ["\u0418", "\u0438"], /* CYRILLIC SMALL LETTER I (CYRILLIC SMALL LETTER II) */ + ["\u0419", "\u0439"], /* CYRILLIC SMALL LETTER SHORT I (CYRILLIC SMALL LETTER SHORT II) */ + ["\u041A", "\u043A"], /* CYRILLIC SMALL LETTER KA */ + ["\u041B", "\u043B"], /* CYRILLIC SMALL LETTER EL */ + ["\u041C", "\u043C"], /* CYRILLIC SMALL LETTER EM */ + ["\u041D", "\u043D"], /* CYRILLIC SMALL LETTER EN */ + ["\u041E", "\u043E"], /* CYRILLIC SMALL LETTER O */ + ["\u041F", "\u043F"], /* CYRILLIC SMALL LETTER PE */ + ["\u0420", "\u0440"], /* CYRILLIC SMALL LETTER ER */ + ["\u0421", "\u0441"], /* CYRILLIC SMALL LETTER ES */ + ["\u0422", "\u0442"], /* CYRILLIC SMALL LETTER TE */ + ["\u0423", "\u0443"], /* CYRILLIC SMALL LETTER U */ + ["\u0424", "\u0444"], /* CYRILLIC SMALL LETTER EF */ + ["\u0425", "\u0445"], /* CYRILLIC SMALL LETTER HA (CYRILLIC SMALL LETTER KHA) */ + ["\u0426", "\u0446"], /* CYRILLIC SMALL LETTER TSE */ + ["\u0427", "\u0447"], /* CYRILLIC SMALL LETTER CHE */ + ["\u0428", "\u0448"], /* CYRILLIC SMALL LETTER SHA */ + ["\u0429", "\u0449"], /* CYRILLIC SMALL LETTER SHCHA */ + ["\u042A", "\u044A"], /* CYRILLIC SMALL LETTER HARD SIGN */ + ["\u042B", "\u044B"], /* CYRILLIC SMALL LETTER YERU (CYRILLIC SMALL LETTER YERI) */ + ["\u042C", "\u044C"], /* CYRILLIC SMALL LETTER SOFT SIGN */ + ["\u042D", "\u044D"], /* CYRILLIC SMALL LETTER E (CYRILLIC SMALL LETTER REVERSED E) */ + ["\u042E", "\u044E"], /* CYRILLIC SMALL LETTER YU (CYRILLIC SMALL LETTER IU) */ + ["\u042F", "\u044F"], /* CYRILLIC SMALL LETTER YA (CYRILLIC SMALL LETTER IA) */ + ["\u0400", "\u0450"], /* CYRILLIC SMALL LETTER IE WITH GRAVE */ + ["\u0401", "\u0451"], /* CYRILLIC SMALL LETTER IO */ + ["\u0402", "\u0452"], /* CYRILLIC SMALL LETTER DJE */ + ["\u0403", "\u0453"], /* CYRILLIC SMALL LETTER GJE */ + ["\u0404", "\u0454"], /* CYRILLIC SMALL LETTER UKRAINIAN IE (CYRILLIC SMALL LETTER E) */ + ["\u0405", "\u0455"], /* CYRILLIC SMALL LETTER DZE */ + ["\u0406", "\u0456"], /* CYRILLIC SMALL LETTER BYELORUSSIAN-UKRAINIAN I (CYRILLIC SMALL LETTER I) */ + ["\u0407", "\u0457"], /* CYRILLIC SMALL LETTER YI */ + ["\u0408", "\u0458"], /* CYRILLIC SMALL LETTER JE */ + ["\u0409", "\u0459"], /* CYRILLIC SMALL LETTER LJE */ + ["\u040A", "\u045A"], /* CYRILLIC SMALL LETTER NJE */ + ["\u040B", "\u045B"], /* CYRILLIC SMALL LETTER TSHE */ + ["\u040C", "\u045C"], /* CYRILLIC SMALL LETTER KJE */ + ["\u040D", "\u045D"], /* CYRILLIC SMALL LETTER I WITH GRAVE */ + ["\u040E", "\u045E"], /* CYRILLIC SMALL LETTER SHORT U */ + ["\u040F", "\u045F"], /* CYRILLIC SMALL LETTER DZHE */ + ["\u0460", "\u0461"], /* CYRILLIC CAPITAL LETTER OMEGA */ + ["\u0460", "\u0461"], /* CYRILLIC SMALL LETTER OMEGA */ + ["\u0462", "\u0463"], /* CYRILLIC CAPITAL LETTER YAT */ + ["\u0462", "\u0463"], /* CYRILLIC SMALL LETTER YAT */ + ["\u0464", "\u0465"], /* CYRILLIC CAPITAL LETTER IOTIFIED E */ + ["\u0464", "\u0465"], /* CYRILLIC SMALL LETTER IOTIFIED E */ + ["\u0466", "\u0467"], /* CYRILLIC CAPITAL LETTER LITTLE YUS */ + ["\u0466", "\u0467"], /* CYRILLIC SMALL LETTER LITTLE YUS */ + ["\u0468", "\u0469"], /* CYRILLIC CAPITAL LETTER IOTIFIED LITTLE YUS */ + ["\u0468", "\u0469"], /* CYRILLIC SMALL LETTER IOTIFIED LITTLE YUS */ + ["\u046A", "\u046B"], /* CYRILLIC CAPITAL LETTER BIG YUS */ + ["\u046A", "\u046B"], /* CYRILLIC SMALL LETTER BIG YUS */ + ["\u046C", "\u046D"], /* CYRILLIC CAPITAL LETTER IOTIFIED BIG YUS */ + ["\u046C", "\u046D"], /* CYRILLIC SMALL LETTER IOTIFIED BIG YUS */ + ["\u046E", "\u046F"], /* CYRILLIC CAPITAL LETTER KSI */ + ["\u046E", "\u046F"], /* CYRILLIC SMALL LETTER KSI */ + ["\u0470", "\u0471"], /* CYRILLIC CAPITAL LETTER PSI */ + ["\u0470", "\u0471"], /* CYRILLIC SMALL LETTER PSI */ + ["\u0472", "\u0473"], /* CYRILLIC CAPITAL LETTER FITA */ + ["\u0472", "\u0473"], /* CYRILLIC SMALL LETTER FITA */ + ["\u0474", "\u0475"], /* CYRILLIC CAPITAL LETTER IZHITSA */ + ["\u0474", "\u0475"], /* CYRILLIC SMALL LETTER IZHITSA */ + ["\u0476", "\u0477"], /* CYRILLIC CAPITAL LETTER IZHITSA WITH DOUBLE GRAVE ACCENT (CYRILLIC CAPITAL LETTER IZHITSA DOUBLE GRAVE) */ + ["\u0476", "\u0477"], /* CYRILLIC SMALL LETTER IZHITSA WITH DOUBLE GRAVE ACCENT (CYRILLIC SMALL LETTER IZHITSA DOUBLE GRAVE) */ + ["\u0478", "\u0479"], /* CYRILLIC CAPITAL LETTER UK (CYRILLIC CAPITAL LETTER UK DIGRAPH) */ + ["\u0478", "\u0479"], /* CYRILLIC SMALL LETTER UK (CYRILLIC SMALL LETTER UK DIGRAPH) */ + ["\u047A", "\u047B"], /* CYRILLIC CAPITAL LETTER ROUND OMEGA */ + ["\u047A", "\u047B"], /* CYRILLIC SMALL LETTER ROUND OMEGA */ + ["\u047C", "\u047D"], /* CYRILLIC CAPITAL LETTER OMEGA WITH TITLO (CYRILLIC CAPITAL LETTER OMEGA TITLO) */ + ["\u047C", "\u047D"], /* CYRILLIC SMALL LETTER OMEGA WITH TITLO (CYRILLIC SMALL LETTER OMEGA TITLO) */ + ["\u047E", "\u047F"], /* CYRILLIC CAPITAL LETTER OT */ + ["\u047E", "\u047F"], /* CYRILLIC SMALL LETTER OT */ + ["\u0480", "\u0481"], /* CYRILLIC CAPITAL LETTER KOPPA */ + ["\u0480", "\u0481"], /* CYRILLIC SMALL LETTER KOPPA */ + ["\u0482", "\u0482"], /* CYRILLIC THOUSANDS SIGN */ + ["\u0483", "\u0483"], /* COMBINING CYRILLIC TITLO (CYRILLIC NON-SPACING TITLO) */ + ["\u0484", "\u0484"], /* COMBINING CYRILLIC PALATALIZATION (CYRILLIC NON-SPACING PALATALIZATION) */ + ["\u0485", "\u0485"], /* COMBINING CYRILLIC DASIA PNEUMATA (CYRILLIC NON-SPACING DASIA PNEUMATA) */ + ["\u0486", "\u0486"], /* COMBINING CYRILLIC PSILI PNEUMATA (CYRILLIC NON-SPACING PSILI PNEUMATA) */ + ["\u0487", "\u0487"], /* COMBINING CYRILLIC POKRYTIE */ + ["\u0488", "\u0488"], /* COMBINING CYRILLIC HUNDRED THOUSANDS SIGN */ + ["\u0489", "\u0489"], /* COMBINING CYRILLIC MILLIONS SIGN */ + ["\u048A", "\u048B"], /* CYRILLIC CAPITAL LETTER SHORT I WITH TAIL */ + ["\u048A", "\u048B"], /* CYRILLIC SMALL LETTER SHORT I WITH TAIL */ + ["\u048C", "\u048D"], /* CYRILLIC CAPITAL LETTER SEMISOFT SIGN */ + ["\u048C", "\u048D"], /* CYRILLIC SMALL LETTER SEMISOFT SIGN */ + ["\u048E", "\u048F"], /* CYRILLIC CAPITAL LETTER ER WITH TICK */ + ["\u048E", "\u048F"], /* CYRILLIC SMALL LETTER ER WITH TICK */ + ["\u0490", "\u0491"], /* CYRILLIC CAPITAL LETTER GHE WITH UPTURN (CYRILLIC CAPITAL LETTER GE WITH UPTURN) */ + ["\u0490", "\u0491"], /* CYRILLIC SMALL LETTER GHE WITH UPTURN (CYRILLIC SMALL LETTER GE WITH UPTURN) */ + ["\u0492", "\u0493"], /* CYRILLIC CAPITAL LETTER GHE WITH STROKE (CYRILLIC CAPITAL LETTER GE BAR) */ + ["\u0492", "\u0493"], /* CYRILLIC SMALL LETTER GHE WITH STROKE (CYRILLIC SMALL LETTER GE BAR) */ + ["\u0494", "\u0495"], /* CYRILLIC CAPITAL LETTER GHE WITH MIDDLE HOOK (CYRILLIC CAPITAL LETTER GE HOOK) */ + ["\u0494", "\u0495"], /* CYRILLIC SMALL LETTER GHE WITH MIDDLE HOOK (CYRILLIC SMALL LETTER GE HOOK) */ + ["\u0496", "\u0497"], /* CYRILLIC CAPITAL LETTER ZHE WITH DESCENDER (CYRILLIC CAPITAL LETTER ZHE WITH RIGHT DESCENDER) */ + ["\u0496", "\u0497"], /* CYRILLIC SMALL LETTER ZHE WITH DESCENDER (CYRILLIC SMALL LETTER ZHE WITH RIGHT DESCENDER) */ + ["\u0498", "\u0499"], /* CYRILLIC CAPITAL LETTER ZE WITH DESCENDER (CYRILLIC CAPITAL LETTER ZE CEDILLA) */ + ["\u0498", "\u0499"], /* CYRILLIC SMALL LETTER ZE WITH DESCENDER (CYRILLIC SMALL LETTER ZE CEDILLA) */ + ["\u049A", "\u049B"], /* CYRILLIC CAPITAL LETTER KA WITH DESCENDER (CYRILLIC CAPITAL LETTER KA WITH RIGHT DESCENDER) */ + ["\u049A", "\u049B"], /* CYRILLIC SMALL LETTER KA WITH DESCENDER (CYRILLIC SMALL LETTER KA WITH RIGHT DESCENDER) */ + ["\u049C", "\u049D"], /* CYRILLIC CAPITAL LETTER KA WITH VERTICAL STROKE (CYRILLIC CAPITAL LETTER KA VERTICAL BAR) */ + ["\u049C", "\u049D"], /* CYRILLIC SMALL LETTER KA WITH VERTICAL STROKE (CYRILLIC SMALL LETTER KA VERTICAL BAR) */ + ["\u049E", "\u049F"], /* CYRILLIC CAPITAL LETTER KA WITH STROKE (CYRILLIC CAPITAL LETTER KA BAR) */ + ["\u049E", "\u049F"], /* CYRILLIC SMALL LETTER KA WITH STROKE (CYRILLIC SMALL LETTER KA BAR) */ + ["\u04A0", "\u04A1"], /* CYRILLIC CAPITAL LETTER BASHKIR KA (CYRILLIC CAPITAL LETTER REVERSED GE KA) */ + ["\u04A0", "\u04A1"], /* CYRILLIC SMALL LETTER BASHKIR KA (CYRILLIC SMALL LETTER REVERSED GE KA) */ + ["\u04A2", "\u04A3"], /* CYRILLIC CAPITAL LETTER EN WITH DESCENDER (CYRILLIC CAPITAL LETTER EN WITH RIGHT DESCENDER) */ + ["\u04A2", "\u04A3"], /* CYRILLIC SMALL LETTER EN WITH DESCENDER (CYRILLIC SMALL LETTER EN WITH RIGHT DESCENDER) */ + ["\u04A4", "\u04A5"], /* CYRILLIC CAPITAL LIGATURE EN GHE (CYRILLIC CAPITAL LETTER EN GE) */ + ["\u04A4", "\u04A5"], /* CYRILLIC SMALL LIGATURE EN GHE (CYRILLIC SMALL LETTER EN GE) */ + ["\u04A6", "\u04A7"], /* CYRILLIC CAPITAL LETTER PE WITH MIDDLE HOOK (CYRILLIC CAPITAL LETTER PE HOOK) */ + ["\u04A6", "\u04A7"], /* CYRILLIC SMALL LETTER PE WITH MIDDLE HOOK (CYRILLIC SMALL LETTER PE HOOK) */ + ["\u04A8", "\u04A9"], /* CYRILLIC CAPITAL LETTER ABKHASIAN HA (CYRILLIC CAPITAL LETTER O HOOK) */ + ["\u04A8", "\u04A9"], /* CYRILLIC SMALL LETTER ABKHASIAN HA (CYRILLIC SMALL LETTER O HOOK) */ + ["\u04AA", "\u04AB"], /* CYRILLIC CAPITAL LETTER ES WITH DESCENDER (CYRILLIC CAPITAL LETTER ES CEDILLA) */ + ["\u04AA", "\u04AB"], /* CYRILLIC SMALL LETTER ES WITH DESCENDER (CYRILLIC SMALL LETTER ES CEDILLA) */ + ["\u04AC", "\u04AD"], /* CYRILLIC CAPITAL LETTER TE WITH DESCENDER (CYRILLIC CAPITAL LETTER TE WITH RIGHT DESCENDER) */ + ["\u04AC", "\u04AD"], /* CYRILLIC SMALL LETTER TE WITH DESCENDER (CYRILLIC SMALL LETTER TE WITH RIGHT DESCENDER) */ + ["\u04AE", "\u04AF"], /* CYRILLIC CAPITAL LETTER STRAIGHT U */ + ["\u04AE", "\u04AF"], /* CYRILLIC SMALL LETTER STRAIGHT U */ + ["\u04B0", "\u04B1"], /* CYRILLIC CAPITAL LETTER STRAIGHT U WITH STROKE (CYRILLIC CAPITAL LETTER STRAIGHT U BAR) */ + ["\u04B0", "\u04B1"], /* CYRILLIC SMALL LETTER STRAIGHT U WITH STROKE (CYRILLIC SMALL LETTER STRAIGHT U BAR) */ + ["\u04B2", "\u04B3"], /* CYRILLIC CAPITAL LETTER HA WITH DESCENDER (CYRILLIC CAPITAL LETTER KHA WITH RIGHT DESCENDER) */ + ["\u04B2", "\u04B3"], /* CYRILLIC SMALL LETTER HA WITH DESCENDER (CYRILLIC SMALL LETTER KHA WITH RIGHT DESCENDER) */ + ["\u04B4", "\u04B5"], /* CYRILLIC CAPITAL LIGATURE TE TSE (CYRILLIC CAPITAL LETTER TE TSE) */ + ["\u04B4", "\u04B5"], /* CYRILLIC SMALL LIGATURE TE TSE (CYRILLIC SMALL LETTER TE TSE) */ + ["\u04B6", "\u04B7"], /* CYRILLIC CAPITAL LETTER CHE WITH DESCENDER (CYRILLIC CAPITAL LETTER CHE WITH RIGHT DESCENDER) */ + ["\u04B6", "\u04B7"], /* CYRILLIC SMALL LETTER CHE WITH DESCENDER (CYRILLIC SMALL LETTER CHE WITH RIGHT DESCENDER) */ + ["\u04B8", "\u04B9"], /* CYRILLIC CAPITAL LETTER CHE WITH VERTICAL STROKE (CYRILLIC CAPITAL LETTER CHE VERTICAL BAR) */ + ["\u04B8", "\u04B9"], /* CYRILLIC SMALL LETTER CHE WITH VERTICAL STROKE (CYRILLIC SMALL LETTER CHE VERTICAL BAR) */ + ["\u04BA", "\u04BB"], /* CYRILLIC CAPITAL LETTER SHHA (CYRILLIC CAPITAL LETTER H) */ + ["\u04BA", "\u04BB"], /* CYRILLIC SMALL LETTER SHHA (CYRILLIC SMALL LETTER H) */ + ["\u04BC", "\u04BD"], /* CYRILLIC CAPITAL LETTER ABKHASIAN CHE (CYRILLIC CAPITAL LETTER IE HOOK) */ + ["\u04BC", "\u04BD"], /* CYRILLIC SMALL LETTER ABKHASIAN CHE (CYRILLIC SMALL LETTER IE HOOK) */ + ["\u04BE", "\u04BF"], /* CYRILLIC CAPITAL LETTER ABKHASIAN CHE WITH DESCENDER (CYRILLIC CAPITAL LETTER IE HOOK OGONEK) */ + ["\u04BE", "\u04BF"], /* CYRILLIC SMALL LETTER ABKHASIAN CHE WITH DESCENDER (CYRILLIC SMALL LETTER IE HOOK OGONEK) */ + ["\u04C0", "\u04CF"], /* CYRILLIC LETTER PALOCHKA (CYRILLIC LETTER I) */ + ["\u04C1", "\u04C2"], /* CYRILLIC CAPITAL LETTER ZHE WITH BREVE (CYRILLIC CAPITAL LETTER SHORT ZHE) */ + ["\u04C1", "\u04C2"], /* CYRILLIC SMALL LETTER ZHE WITH BREVE (CYRILLIC SMALL LETTER SHORT ZHE) */ + ["\u04C3", "\u04C4"], /* CYRILLIC CAPITAL LETTER KA WITH HOOK (CYRILLIC CAPITAL LETTER KA HOOK) */ + ["\u04C3", "\u04C4"], /* CYRILLIC SMALL LETTER KA WITH HOOK (CYRILLIC SMALL LETTER KA HOOK) */ + ["\u04C5", "\u04C6"], /* CYRILLIC CAPITAL LETTER EL WITH TAIL */ + ["\u04C5", "\u04C6"], /* CYRILLIC SMALL LETTER EL WITH TAIL */ + ["\u04C7", "\u04C8"], /* CYRILLIC CAPITAL LETTER EN WITH HOOK (CYRILLIC CAPITAL LETTER EN HOOK) */ + ["\u04C7", "\u04C8"], /* CYRILLIC SMALL LETTER EN WITH HOOK (CYRILLIC SMALL LETTER EN HOOK) */ + ["\u04C9", "\u04CA"], /* CYRILLIC CAPITAL LETTER EN WITH TAIL */ + ["\u04C9", "\u04CA"], /* CYRILLIC SMALL LETTER EN WITH TAIL */ + ["\u04CB", "\u04CC"], /* CYRILLIC CAPITAL LETTER KHAKASSIAN CHE (CYRILLIC CAPITAL LETTER CHE WITH LEFT DESCENDER) */ + ["\u04CB", "\u04CC"], /* CYRILLIC SMALL LETTER KHAKASSIAN CHE (CYRILLIC SMALL LETTER CHE WITH LEFT DESCENDER) */ + ["\u04CD", "\u04CE"], /* CYRILLIC CAPITAL LETTER EM WITH TAIL */ + ["\u04CD", "\u04CE"], /* CYRILLIC SMALL LETTER EM WITH TAIL */ + ["\u04C0", "\u04CF"], /* CYRILLIC SMALL LETTER PALOCHKA */ + ["\u04D0", "\u04D1"], /* CYRILLIC CAPITAL LETTER A WITH BREVE */ + ["\u04D0", "\u04D1"], /* CYRILLIC SMALL LETTER A WITH BREVE */ + ["\u04D2", "\u04D3"], /* CYRILLIC CAPITAL LETTER A WITH DIAERESIS */ + ["\u04D2", "\u04D3"], /* CYRILLIC SMALL LETTER A WITH DIAERESIS */ + ["\u04D4", "\u04D5"], /* CYRILLIC CAPITAL LIGATURE A IE */ + ["\u04D4", "\u04D5"], /* CYRILLIC SMALL LIGATURE A IE */ + ["\u04D6", "\u04D7"], /* CYRILLIC CAPITAL LETTER IE WITH BREVE */ + ["\u04D6", "\u04D7"], /* CYRILLIC SMALL LETTER IE WITH BREVE */ + ["\u04D8", "\u04D9"], /* CYRILLIC CAPITAL LETTER SCHWA */ + ["\u04D8", "\u04D9"], /* CYRILLIC SMALL LETTER SCHWA */ + ["\u04DA", "\u04DB"], /* CYRILLIC CAPITAL LETTER SCHWA WITH DIAERESIS */ + ["\u04DA", "\u04DB"], /* CYRILLIC SMALL LETTER SCHWA WITH DIAERESIS */ + ["\u04DC", "\u04DD"], /* CYRILLIC CAPITAL LETTER ZHE WITH DIAERESIS */ + ["\u04DC", "\u04DD"], /* CYRILLIC SMALL LETTER ZHE WITH DIAERESIS */ + ["\u04DE", "\u04DF"], /* CYRILLIC CAPITAL LETTER ZE WITH DIAERESIS */ + ["\u04DE", "\u04DF"], /* CYRILLIC SMALL LETTER ZE WITH DIAERESIS */ + ["\u04E0", "\u04E1"], /* CYRILLIC CAPITAL LETTER ABKHASIAN DZE */ + ["\u04E0", "\u04E1"], /* CYRILLIC SMALL LETTER ABKHASIAN DZE */ + ["\u04E2", "\u04E3"], /* CYRILLIC CAPITAL LETTER I WITH MACRON */ + ["\u04E2", "\u04E3"], /* CYRILLIC SMALL LETTER I WITH MACRON */ + ["\u04E4", "\u04E5"], /* CYRILLIC CAPITAL LETTER I WITH DIAERESIS */ + ["\u04E4", "\u04E5"], /* CYRILLIC SMALL LETTER I WITH DIAERESIS */ + ["\u04E6", "\u04E7"], /* CYRILLIC CAPITAL LETTER O WITH DIAERESIS */ + ["\u04E6", "\u04E7"], /* CYRILLIC SMALL LETTER O WITH DIAERESIS */ + ["\u04E8", "\u04E9"], /* CYRILLIC CAPITAL LETTER BARRED O */ + ["\u04E8", "\u04E9"], /* CYRILLIC SMALL LETTER BARRED O */ + ["\u04EA", "\u04EB"], /* CYRILLIC CAPITAL LETTER BARRED O WITH DIAERESIS */ + ["\u04EA", "\u04EB"], /* CYRILLIC SMALL LETTER BARRED O WITH DIAERESIS */ + ["\u04EC", "\u04ED"], /* CYRILLIC CAPITAL LETTER E WITH DIAERESIS */ + ["\u04EC", "\u04ED"], /* CYRILLIC SMALL LETTER E WITH DIAERESIS */ + ["\u04EE", "\u04EF"], /* CYRILLIC CAPITAL LETTER U WITH MACRON */ + ["\u04EE", "\u04EF"], /* CYRILLIC SMALL LETTER U WITH MACRON */ + ["\u04F0", "\u04F1"], /* CYRILLIC CAPITAL LETTER U WITH DIAERESIS */ + ["\u04F0", "\u04F1"], /* CYRILLIC SMALL LETTER U WITH DIAERESIS */ + ["\u04F2", "\u04F3"], /* CYRILLIC CAPITAL LETTER U WITH DOUBLE ACUTE */ + ["\u04F2", "\u04F3"], /* CYRILLIC SMALL LETTER U WITH DOUBLE ACUTE */ + ["\u04F4", "\u04F5"], /* CYRILLIC CAPITAL LETTER CHE WITH DIAERESIS */ + ["\u04F4", "\u04F5"], /* CYRILLIC SMALL LETTER CHE WITH DIAERESIS */ + ["\u04F6", "\u04F7"], /* CYRILLIC CAPITAL LETTER GHE WITH DESCENDER */ + ["\u04F6", "\u04F7"], /* CYRILLIC SMALL LETTER GHE WITH DESCENDER */ + ["\u04F8", "\u04F9"], /* CYRILLIC CAPITAL LETTER YERU WITH DIAERESIS */ + ["\u04F8", "\u04F9"], /* CYRILLIC SMALL LETTER YERU WITH DIAERESIS */ + ["\u04FA", "\u04FB"], /* CYRILLIC CAPITAL LETTER GHE WITH STROKE AND HOOK */ + ["\u04FA", "\u04FB"], /* CYRILLIC SMALL LETTER GHE WITH STROKE AND HOOK */ + ["\u04FC", "\u04FD"], /* CYRILLIC CAPITAL LETTER HA WITH HOOK */ + ["\u04FC", "\u04FD"], /* CYRILLIC SMALL LETTER HA WITH HOOK */ + ["\u04FE", "\u04FF"], /* CYRILLIC CAPITAL LETTER HA WITH STROKE */ + ["\u04FE", "\u04FF"], /* CYRILLIC SMALL LETTER HA WITH STROKE */ + ["\u0500", "\u0501"], /* CYRILLIC CAPITAL LETTER KOMI DE */ + ["\u0500", "\u0501"], /* CYRILLIC SMALL LETTER KOMI DE */ + ["\u0502", "\u0503"], /* CYRILLIC CAPITAL LETTER KOMI DJE */ + ["\u0502", "\u0503"], /* CYRILLIC SMALL LETTER KOMI DJE */ + ["\u0504", "\u0505"], /* CYRILLIC CAPITAL LETTER KOMI ZJE */ + ["\u0504", "\u0505"], /* CYRILLIC SMALL LETTER KOMI ZJE */ + ["\u0506", "\u0507"], /* CYRILLIC CAPITAL LETTER KOMI DZJE */ + ["\u0506", "\u0507"], /* CYRILLIC SMALL LETTER KOMI DZJE */ + ["\u0508", "\u0509"], /* CYRILLIC CAPITAL LETTER KOMI LJE */ + ["\u0508", "\u0509"], /* CYRILLIC SMALL LETTER KOMI LJE */ + ["\u050A", "\u050B"], /* CYRILLIC CAPITAL LETTER KOMI NJE */ + ["\u050A", "\u050B"], /* CYRILLIC SMALL LETTER KOMI NJE */ + ["\u050C", "\u050D"], /* CYRILLIC CAPITAL LETTER KOMI SJE */ + ["\u050C", "\u050D"], /* CYRILLIC SMALL LETTER KOMI SJE */ + ["\u050E", "\u050F"], /* CYRILLIC CAPITAL LETTER KOMI TJE */ + ["\u050E", "\u050F"], /* CYRILLIC SMALL LETTER KOMI TJE */ + ["\u0510", "\u0511"], /* CYRILLIC CAPITAL LETTER REVERSED ZE */ + ["\u0510", "\u0511"], /* CYRILLIC SMALL LETTER REVERSED ZE */ + ["\u0512", "\u0513"], /* CYRILLIC CAPITAL LETTER EL WITH HOOK */ + ["\u0512", "\u0513"], /* CYRILLIC SMALL LETTER EL WITH HOOK */ + ["\u0514", "\u0515"], /* CYRILLIC CAPITAL LETTER LHA */ + ["\u0514", "\u0515"], /* CYRILLIC SMALL LETTER LHA */ + ["\u0516", "\u0517"], /* CYRILLIC CAPITAL LETTER RHA */ + ["\u0516", "\u0517"], /* CYRILLIC SMALL LETTER RHA */ + ["\u0518", "\u0519"], /* CYRILLIC CAPITAL LETTER YAE */ + ["\u0518", "\u0519"], /* CYRILLIC SMALL LETTER YAE */ + ["\u051A", "\u051B"], /* CYRILLIC CAPITAL LETTER QA */ + ["\u051A", "\u051B"], /* CYRILLIC SMALL LETTER QA */ + ["\u051C", "\u051D"], /* CYRILLIC CAPITAL LETTER WE */ + ["\u051C", "\u051D"], /* CYRILLIC SMALL LETTER WE */ + ["\u051E", "\u051F"], /* CYRILLIC CAPITAL LETTER ALEUT KA */ + ["\u051E", "\u051F"], /* CYRILLIC SMALL LETTER ALEUT KA */ + ["\u0520", "\u0521"], /* CYRILLIC CAPITAL LETTER EL WITH MIDDLE HOOK */ + ["\u0520", "\u0521"], /* CYRILLIC SMALL LETTER EL WITH MIDDLE HOOK */ + ["\u0522", "\u0523"], /* CYRILLIC CAPITAL LETTER EN WITH MIDDLE HOOK */ + ["\u0522", "\u0523"], /* CYRILLIC SMALL LETTER EN WITH MIDDLE HOOK */ + ["\u0524", "\u0525"], /* CYRILLIC CAPITAL LETTER PE WITH DESCENDER */ + ["\u0524", "\u0525"], /* CYRILLIC SMALL LETTER PE WITH DESCENDER */ + ["\u0526", "\u0527"], /* CYRILLIC CAPITAL LETTER SHHA WITH DESCENDER */ + ["\u0526", "\u0527"], /* CYRILLIC SMALL LETTER SHHA WITH DESCENDER */ + ["\u0528", "\u0529"], /* CYRILLIC CAPITAL LETTER EN WITH LEFT HOOK */ + ["\u0528", "\u0529"], /* CYRILLIC SMALL LETTER EN WITH LEFT HOOK */ + ["\u052A", "\u052B"], /* CYRILLIC CAPITAL LETTER DZZHE */ + ["\u052A", "\u052B"], /* CYRILLIC SMALL LETTER DZZHE */ + ["\u052C", "\u052D"], /* CYRILLIC CAPITAL LETTER DCHE */ + ["\u052C", "\u052D"], /* CYRILLIC SMALL LETTER DCHE */ + ["\u052E", "\u052F"], /* CYRILLIC CAPITAL LETTER EL WITH DESCENDER */ + ["\u052E", "\u052F"], /* CYRILLIC SMALL LETTER EL WITH DESCENDER */ + ["\u0530", "\u0530"], + ["\u0531", "\u0561"], /* ARMENIAN CAPITAL LETTER AYB */ + ["\u0532", "\u0562"], /* ARMENIAN CAPITAL LETTER BEN */ + ["\u0533", "\u0563"], /* ARMENIAN CAPITAL LETTER GIM */ + ["\u0534", "\u0564"], /* ARMENIAN CAPITAL LETTER DA */ + ["\u0535", "\u0565"], /* ARMENIAN CAPITAL LETTER ECH */ + ["\u0536", "\u0566"], /* ARMENIAN CAPITAL LETTER ZA */ + ["\u0537", "\u0567"], /* ARMENIAN CAPITAL LETTER EH */ + ["\u0538", "\u0568"], /* ARMENIAN CAPITAL LETTER ET */ + ["\u0539", "\u0569"], /* ARMENIAN CAPITAL LETTER TO */ + ["\u053A", "\u056A"], /* ARMENIAN CAPITAL LETTER ZHE */ + ["\u053B", "\u056B"], /* ARMENIAN CAPITAL LETTER INI */ + ["\u053C", "\u056C"], /* ARMENIAN CAPITAL LETTER LIWN */ + ["\u053D", "\u056D"], /* ARMENIAN CAPITAL LETTER XEH */ + ["\u053E", "\u056E"], /* ARMENIAN CAPITAL LETTER CA */ + ["\u053F", "\u056F"], /* ARMENIAN CAPITAL LETTER KEN */ + ["\u0540", "\u0570"], /* ARMENIAN CAPITAL LETTER HO */ + ["\u0541", "\u0571"], /* ARMENIAN CAPITAL LETTER JA */ + ["\u0542", "\u0572"], /* ARMENIAN CAPITAL LETTER GHAD (ARMENIAN CAPITAL LETTER LAD) */ + ["\u0543", "\u0573"], /* ARMENIAN CAPITAL LETTER CHEH */ + ["\u0544", "\u0574"], /* ARMENIAN CAPITAL LETTER MEN */ + ["\u0545", "\u0575"], /* ARMENIAN CAPITAL LETTER YI */ + ["\u0546", "\u0576"], /* ARMENIAN CAPITAL LETTER NOW */ + ["\u0547", "\u0577"], /* ARMENIAN CAPITAL LETTER SHA */ + ["\u0548", "\u0578"], /* ARMENIAN CAPITAL LETTER VO */ + ["\u0549", "\u0579"], /* ARMENIAN CAPITAL LETTER CHA */ + ["\u054A", "\u057A"], /* ARMENIAN CAPITAL LETTER PEH */ + ["\u054B", "\u057B"], /* ARMENIAN CAPITAL LETTER JHEH */ + ["\u054C", "\u057C"], /* ARMENIAN CAPITAL LETTER RA */ + ["\u054D", "\u057D"], /* ARMENIAN CAPITAL LETTER SEH */ + ["\u054E", "\u057E"], /* ARMENIAN CAPITAL LETTER VEW */ + ["\u054F", "\u057F"], /* ARMENIAN CAPITAL LETTER TIWN */ + ["\u0550", "\u0580"], /* ARMENIAN CAPITAL LETTER REH */ + ["\u0551", "\u0581"], /* ARMENIAN CAPITAL LETTER CO */ + ["\u0552", "\u0582"], /* ARMENIAN CAPITAL LETTER YIWN */ + ["\u0553", "\u0583"], /* ARMENIAN CAPITAL LETTER PIWR */ + ["\u0554", "\u0584"], /* ARMENIAN CAPITAL LETTER KEH */ + ["\u0555", "\u0585"], /* ARMENIAN CAPITAL LETTER OH */ + ["\u0556", "\u0586"], /* ARMENIAN CAPITAL LETTER FEH */ + ["\u0557", "\u0557"], + ["\u0558", "\u0558"], + ["\u0559", "\u0559"], /* ARMENIAN MODIFIER LETTER LEFT HALF RING */ + ["\u055A", "\u055A"], /* ARMENIAN APOSTROPHE (ARMENIAN MODIFIER LETTER RIGHT HALF RING) */ + ["\u055B", "\u055B"], /* ARMENIAN EMPHASIS MARK */ + ["\u055C", "\u055C"], /* ARMENIAN EXCLAMATION MARK */ + ["\u055D", "\u055D"], /* ARMENIAN COMMA */ + ["\u055E", "\u055E"], /* ARMENIAN QUESTION MARK */ + ["\u055F", "\u055F"], /* ARMENIAN ABBREVIATION MARK */ + ["\u0560", "\u0560"], /* ARMENIAN SMALL LETTER TURNED AYB */ + ["\u0531", "\u0561"], /* ARMENIAN SMALL LETTER AYB */ + ["\u0532", "\u0562"], /* ARMENIAN SMALL LETTER BEN */ + ["\u0533", "\u0563"], /* ARMENIAN SMALL LETTER GIM */ + ["\u0534", "\u0564"], /* ARMENIAN SMALL LETTER DA */ + ["\u0535", "\u0565"], /* ARMENIAN SMALL LETTER ECH */ + ["\u0536", "\u0566"], /* ARMENIAN SMALL LETTER ZA */ + ["\u0537", "\u0567"], /* ARMENIAN SMALL LETTER EH */ + ["\u0538", "\u0568"], /* ARMENIAN SMALL LETTER ET */ + ["\u0539", "\u0569"], /* ARMENIAN SMALL LETTER TO */ + ["\u053A", "\u056A"], /* ARMENIAN SMALL LETTER ZHE */ + ["\u053B", "\u056B"], /* ARMENIAN SMALL LETTER INI */ + ["\u053C", "\u056C"], /* ARMENIAN SMALL LETTER LIWN */ + ["\u053D", "\u056D"], /* ARMENIAN SMALL LETTER XEH */ + ["\u053E", "\u056E"], /* ARMENIAN SMALL LETTER CA */ + ["\u053F", "\u056F"], /* ARMENIAN SMALL LETTER KEN */ + ["\u0540", "\u0570"], /* ARMENIAN SMALL LETTER HO */ + ["\u0541", "\u0571"], /* ARMENIAN SMALL LETTER JA */ + ["\u0542", "\u0572"], /* ARMENIAN SMALL LETTER GHAD (ARMENIAN SMALL LETTER LAD) */ + ["\u0543", "\u0573"], /* ARMENIAN SMALL LETTER CHEH */ + ["\u0544", "\u0574"], /* ARMENIAN SMALL LETTER MEN */ + ["\u0545", "\u0575"], /* ARMENIAN SMALL LETTER YI */ + ["\u0546", "\u0576"], /* ARMENIAN SMALL LETTER NOW */ + ["\u0547", "\u0577"], /* ARMENIAN SMALL LETTER SHA */ + ["\u0548", "\u0578"], /* ARMENIAN SMALL LETTER VO */ + ["\u0549", "\u0579"], /* ARMENIAN SMALL LETTER CHA */ + ["\u054A", "\u057A"], /* ARMENIAN SMALL LETTER PEH */ + ["\u054B", "\u057B"], /* ARMENIAN SMALL LETTER JHEH */ + ["\u054C", "\u057C"], /* ARMENIAN SMALL LETTER RA */ + ["\u054D", "\u057D"], /* ARMENIAN SMALL LETTER SEH */ + ["\u054E", "\u057E"], /* ARMENIAN SMALL LETTER VEW */ + ["\u054F", "\u057F"], /* ARMENIAN SMALL LETTER TIWN */ + ["\u0550", "\u0580"], /* ARMENIAN SMALL LETTER REH */ + ["\u0551", "\u0581"], /* ARMENIAN SMALL LETTER CO */ + ["\u0552", "\u0582"], /* ARMENIAN SMALL LETTER YIWN */ + ["\u0553", "\u0583"], /* ARMENIAN SMALL LETTER PIWR */ + ["\u0554", "\u0584"], /* ARMENIAN SMALL LETTER KEH */ + ["\u0555", "\u0585"], /* ARMENIAN SMALL LETTER OH */ + ["\u0556", "\u0586"], /* ARMENIAN SMALL LETTER FEH */ + ["\u0535\u0552", "\u0587"], /* ARMENIAN SMALL LIGATURE ECH YIWN */ + ["\u0588", "\u0588"], /* ARMENIAN SMALL LETTER YI WITH STROKE */ + ["\u0589", "\u0589"], /* ARMENIAN FULL STOP (ARMENIAN PERIOD) */ + ["\u058A", "\u058A"], /* ARMENIAN HYPHEN */ + ["\u058B", "\u058B"], + ["\u058C", "\u058C"], + ["\u058D", "\u058D"], /* RIGHT-FACING ARMENIAN ETERNITY SIGN */ + ["\u058E", "\u058E"], /* LEFT-FACING ARMENIAN ETERNITY SIGN */ + ["\u058F", "\u058F"], /* ARMENIAN DRAM SIGN */ + ["\u0590", "\u0590"], + ["\u0591", "\u0591"], /* HEBREW ACCENT ETNAHTA */ + ["\u0592", "\u0592"], /* HEBREW ACCENT SEGOL */ + ["\u0593", "\u0593"], /* HEBREW ACCENT SHALSHELET */ + ["\u0594", "\u0594"], /* HEBREW ACCENT ZAQEF QATAN */ + ["\u0595", "\u0595"], /* HEBREW ACCENT ZAQEF GADOL */ + ["\u0596", "\u0596"], /* HEBREW ACCENT TIPEHA */ + ["\u0597", "\u0597"], /* HEBREW ACCENT REVIA */ + ["\u0598", "\u0598"], /* HEBREW ACCENT ZARQA */ + ["\u0599", "\u0599"], /* HEBREW ACCENT PASHTA */ + ["\u059A", "\u059A"], /* HEBREW ACCENT YETIV */ + ["\u059B", "\u059B"], /* HEBREW ACCENT TEVIR */ + ["\u059C", "\u059C"], /* HEBREW ACCENT GERESH */ + ["\u059D", "\u059D"], /* HEBREW ACCENT GERESH MUQDAM */ + ["\u059E", "\u059E"], /* HEBREW ACCENT GERSHAYIM */ + ["\u059F", "\u059F"], /* HEBREW ACCENT QARNEY PARA */ + ["\u05A0", "\u05A0"], /* HEBREW ACCENT TELISHA GEDOLA */ + ["\u05A1", "\u05A1"], /* HEBREW ACCENT PAZER */ + ["\u05A2", "\u05A2"], /* HEBREW ACCENT ATNAH HAFUKH */ + ["\u05A3", "\u05A3"], /* HEBREW ACCENT MUNAH */ + ["\u05A4", "\u05A4"], /* HEBREW ACCENT MAHAPAKH */ + ["\u05A5", "\u05A5"], /* HEBREW ACCENT MERKHA */ + ["\u05A6", "\u05A6"], /* HEBREW ACCENT MERKHA KEFULA */ + ["\u05A7", "\u05A7"], /* HEBREW ACCENT DARGA */ + ["\u05A8", "\u05A8"], /* HEBREW ACCENT QADMA */ + ["\u05A9", "\u05A9"], /* HEBREW ACCENT TELISHA QETANA */ + ["\u05AA", "\u05AA"], /* HEBREW ACCENT YERAH BEN YOMO */ + ["\u05AB", "\u05AB"], /* HEBREW ACCENT OLE */ + ["\u05AC", "\u05AC"], /* HEBREW ACCENT ILUY */ + ["\u05AD", "\u05AD"], /* HEBREW ACCENT DEHI */ + ["\u05AE", "\u05AE"], /* HEBREW ACCENT ZINOR */ + ["\u05AF", "\u05AF"], /* HEBREW MARK MASORA CIRCLE */ + ["\u05B0", "\u05B0"], /* HEBREW POINT SHEVA */ + ["\u05B1", "\u05B1"], /* HEBREW POINT HATAF SEGOL */ + ["\u05B2", "\u05B2"], /* HEBREW POINT HATAF PATAH */ + ["\u05B3", "\u05B3"], /* HEBREW POINT HATAF QAMATS */ + ["\u05B4", "\u05B4"], /* HEBREW POINT HIRIQ */ + ["\u05B5", "\u05B5"], /* HEBREW POINT TSERE */ + ["\u05B6", "\u05B6"], /* HEBREW POINT SEGOL */ + ["\u05B7", "\u05B7"], /* HEBREW POINT PATAH */ + ["\u05B8", "\u05B8"], /* HEBREW POINT QAMATS */ + ["\u05B9", "\u05B9"], /* HEBREW POINT HOLAM */ + ["\u05BA", "\u05BA"], /* HEBREW POINT HOLAM HASER FOR VAV */ + ["\u05BB", "\u05BB"], /* HEBREW POINT QUBUTS */ + ["\u05BC", "\u05BC"], /* HEBREW POINT DAGESH OR MAPIQ (HEBREW POINT DAGESH) */ + ["\u05BD", "\u05BD"], /* HEBREW POINT METEG */ + ["\u05BE", "\u05BE"], /* HEBREW PUNCTUATION MAQAF */ + ["\u05BF", "\u05BF"], /* HEBREW POINT RAFE */ + ["\u05C0", "\u05C0"], /* HEBREW PUNCTUATION PASEQ (HEBREW POINT PASEQ) */ + ["\u05C1", "\u05C1"], /* HEBREW POINT SHIN DOT */ + ["\u05C2", "\u05C2"], /* HEBREW POINT SIN DOT */ + ["\u05C3", "\u05C3"], /* HEBREW PUNCTUATION SOF PASUQ */ + ["\u05C4", "\u05C4"], /* HEBREW MARK UPPER DOT */ + ["\u05C5", "\u05C5"], /* HEBREW MARK LOWER DOT */ + ["\u05C6", "\u05C6"], /* HEBREW PUNCTUATION NUN HAFUKHA */ + ["\u05C7", "\u05C7"], /* HEBREW POINT QAMATS QATAN */ + ["\u05C8", "\u05C8"], + ["\u05C9", "\u05C9"], + ["\u05CA", "\u05CA"], + ["\u05CB", "\u05CB"], + ["\u05CC", "\u05CC"], + ["\u05CD", "\u05CD"], + ["\u05CE", "\u05CE"], + ["\u05CF", "\u05CF"], + ["\u05D0", "\u05D0"], /* HEBREW LETTER ALEF */ + ["\u05D1", "\u05D1"], /* HEBREW LETTER BET */ + ["\u05D2", "\u05D2"], /* HEBREW LETTER GIMEL */ + ["\u05D3", "\u05D3"], /* HEBREW LETTER DALET */ + ["\u05D4", "\u05D4"], /* HEBREW LETTER HE */ + ["\u05D5", "\u05D5"], /* HEBREW LETTER VAV */ + ["\u05D6", "\u05D6"], /* HEBREW LETTER ZAYIN */ + ["\u05D7", "\u05D7"], /* HEBREW LETTER HET */ + ["\u05D8", "\u05D8"], /* HEBREW LETTER TET */ + ["\u05D9", "\u05D9"], /* HEBREW LETTER YOD */ + ["\u05DA", "\u05DA"], /* HEBREW LETTER FINAL KAF */ + ["\u05DB", "\u05DB"], /* HEBREW LETTER KAF */ + ["\u05DC", "\u05DC"], /* HEBREW LETTER LAMED */ + ["\u05DD", "\u05DD"], /* HEBREW LETTER FINAL MEM */ + ["\u05DE", "\u05DE"], /* HEBREW LETTER MEM */ + ["\u05DF", "\u05DF"], /* HEBREW LETTER FINAL NUN */ + ["\u05E0", "\u05E0"], /* HEBREW LETTER NUN */ + ["\u05E1", "\u05E1"], /* HEBREW LETTER SAMEKH */ + ["\u05E2", "\u05E2"], /* HEBREW LETTER AYIN */ + ["\u05E3", "\u05E3"], /* HEBREW LETTER FINAL PE */ + ["\u05E4", "\u05E4"], /* HEBREW LETTER PE */ + ["\u05E5", "\u05E5"], /* HEBREW LETTER FINAL TSADI */ + ["\u05E6", "\u05E6"], /* HEBREW LETTER TSADI */ + ["\u05E7", "\u05E7"], /* HEBREW LETTER QOF */ + ["\u05E8", "\u05E8"], /* HEBREW LETTER RESH */ + ["\u05E9", "\u05E9"], /* HEBREW LETTER SHIN */ + ["\u05EA", "\u05EA"], /* HEBREW LETTER TAV */ + ["\u05EB", "\u05EB"], + ["\u05EC", "\u05EC"], + ["\u05ED", "\u05ED"], + ["\u05EE", "\u05EE"], + ["\u05EF", "\u05EF"], /* HEBREW YOD TRIANGLE */ + ["\u05F0", "\u05F0"], /* HEBREW LIGATURE YIDDISH DOUBLE VAV (HEBREW LETTER DOUBLE VAV) */ + ["\u05F1", "\u05F1"], /* HEBREW LIGATURE YIDDISH VAV YOD (HEBREW LETTER VAV YOD) */ + ["\u05F2", "\u05F2"], /* HEBREW LIGATURE YIDDISH DOUBLE YOD (HEBREW LETTER DOUBLE YOD) */ + ["\u05F3", "\u05F3"], /* HEBREW PUNCTUATION GERESH */ + ["\u05F4", "\u05F4"], /* HEBREW PUNCTUATION GERSHAYIM */ + ["\u05F5", "\u05F5"], + ["\u05F6", "\u05F6"], + ["\u05F7", "\u05F7"], + ["\u05F8", "\u05F8"], + ["\u05F9", "\u05F9"], + ["\u05FA", "\u05FA"], + ["\u05FB", "\u05FB"], + ["\u05FC", "\u05FC"], + ["\u05FD", "\u05FD"], + ["\u05FE", "\u05FE"], + ["\u05FF", "\u05FF"], + ["\u0600", "\u0600"], /* ARABIC NUMBER SIGN */ + ["\u0601", "\u0601"], /* ARABIC SIGN SANAH */ + ["\u0602", "\u0602"], /* ARABIC FOOTNOTE MARKER */ + ["\u0603", "\u0603"], /* ARABIC SIGN SAFHA */ + ["\u0604", "\u0604"], /* ARABIC SIGN SAMVAT */ + ["\u0605", "\u0605"], /* ARABIC NUMBER MARK ABOVE */ + ["\u0606", "\u0606"], /* ARABIC-INDIC CUBE ROOT */ + ["\u0607", "\u0607"], /* ARABIC-INDIC FOURTH ROOT */ + ["\u0608", "\u0608"], /* ARABIC RAY */ + ["\u0609", "\u0609"], /* ARABIC-INDIC PER MILLE SIGN */ + ["\u060A", "\u060A"], /* ARABIC-INDIC PER TEN THOUSAND SIGN */ + ["\u060B", "\u060B"], /* AFGHANI SIGN */ + ["\u060C", "\u060C"], /* ARABIC COMMA */ + ["\u060D", "\u060D"], /* ARABIC DATE SEPARATOR */ + ["\u060E", "\u060E"], /* ARABIC POETIC VERSE SIGN */ + ["\u060F", "\u060F"], /* ARABIC SIGN MISRA */ + ["\u0610", "\u0610"], /* ARABIC SIGN SALLALLAHOU ALAYHE WASSALLAM */ + ["\u0611", "\u0611"], /* ARABIC SIGN ALAYHE ASSALLAM */ + ["\u0612", "\u0612"], /* ARABIC SIGN RAHMATULLAH ALAYHE */ + ["\u0613", "\u0613"], /* ARABIC SIGN RADI ALLAHOU ANHU */ + ["\u0614", "\u0614"], /* ARABIC SIGN TAKHALLUS */ + ["\u0615", "\u0615"], /* ARABIC SMALL HIGH TAH */ + ["\u0616", "\u0616"], /* ARABIC SMALL HIGH LIGATURE ALEF WITH LAM WITH YEH */ + ["\u0617", "\u0617"], /* ARABIC SMALL HIGH ZAIN */ + ["\u0618", "\u0618"], /* ARABIC SMALL FATHA */ + ["\u0619", "\u0619"], /* ARABIC SMALL DAMMA */ + ["\u061A", "\u061A"], /* ARABIC SMALL KASRA */ + ["\u061B", "\u061B"], /* ARABIC SEMICOLON */ + ["\u061C", "\u061C"], /* ARABIC LETTER MARK */ + ["\u061D", "\u061D"], /* ARABIC END OF TEXT MARK */ + ["\u061E", "\u061E"], /* ARABIC TRIPLE DOT PUNCTUATION MARK */ + ["\u061F", "\u061F"], /* ARABIC QUESTION MARK */ + ["\u0620", "\u0620"], /* ARABIC LETTER KASHMIRI YEH */ + ["\u0621", "\u0621"], /* ARABIC LETTER HAMZA (ARABIC LETTER HAMZAH) */ + ["\u0622", "\u0622"], /* ARABIC LETTER ALEF WITH MADDA ABOVE (ARABIC LETTER MADDAH ON ALEF) */ + ["\u0623", "\u0623"], /* ARABIC LETTER ALEF WITH HAMZA ABOVE (ARABIC LETTER HAMZAH ON ALEF) */ + ["\u0624", "\u0624"], /* ARABIC LETTER WAW WITH HAMZA ABOVE (ARABIC LETTER HAMZAH ON WAW) */ + ["\u0625", "\u0625"], /* ARABIC LETTER ALEF WITH HAMZA BELOW (ARABIC LETTER HAMZAH UNDER ALEF) */ + ["\u0626", "\u0626"], /* ARABIC LETTER YEH WITH HAMZA ABOVE (ARABIC LETTER HAMZAH ON YA) */ + ["\u0627", "\u0627"], /* ARABIC LETTER ALEF */ + ["\u0628", "\u0628"], /* ARABIC LETTER BEH (ARABIC LETTER BAA) */ + ["\u0629", "\u0629"], /* ARABIC LETTER TEH MARBUTA (ARABIC LETTER TAA MARBUTAH) */ + ["\u062A", "\u062A"], /* ARABIC LETTER TEH (ARABIC LETTER TAA) */ + ["\u062B", "\u062B"], /* ARABIC LETTER THEH (ARABIC LETTER THAA) */ + ["\u062C", "\u062C"], /* ARABIC LETTER JEEM */ + ["\u062D", "\u062D"], /* ARABIC LETTER HAH (ARABIC LETTER HAA) */ + ["\u062E", "\u062E"], /* ARABIC LETTER KHAH (ARABIC LETTER KHAA) */ + ["\u062F", "\u062F"], /* ARABIC LETTER DAL */ + ["\u0630", "\u0630"], /* ARABIC LETTER THAL */ + ["\u0631", "\u0631"], /* ARABIC LETTER REH (ARABIC LETTER RA) */ + ["\u0632", "\u0632"], /* ARABIC LETTER ZAIN */ + ["\u0633", "\u0633"], /* ARABIC LETTER SEEN */ + ["\u0634", "\u0634"], /* ARABIC LETTER SHEEN */ + ["\u0635", "\u0635"], /* ARABIC LETTER SAD */ + ["\u0636", "\u0636"], /* ARABIC LETTER DAD */ + ["\u0637", "\u0637"], /* ARABIC LETTER TAH */ + ["\u0638", "\u0638"], /* ARABIC LETTER ZAH (ARABIC LETTER DHAH) */ + ["\u0639", "\u0639"], /* ARABIC LETTER AIN */ + ["\u063A", "\u063A"], /* ARABIC LETTER GHAIN */ + ["\u063B", "\u063B"], /* ARABIC LETTER KEHEH WITH TWO DOTS ABOVE */ + ["\u063C", "\u063C"], /* ARABIC LETTER KEHEH WITH THREE DOTS BELOW */ + ["\u063D", "\u063D"], /* ARABIC LETTER FARSI YEH WITH INVERTED V */ + ["\u063E", "\u063E"], /* ARABIC LETTER FARSI YEH WITH TWO DOTS ABOVE */ + ["\u063F", "\u063F"], /* ARABIC LETTER FARSI YEH WITH THREE DOTS ABOVE */ + ["\u0640", "\u0640"], /* ARABIC TATWEEL */ + ["\u0641", "\u0641"], /* ARABIC LETTER FEH (ARABIC LETTER FA) */ + ["\u0642", "\u0642"], /* ARABIC LETTER QAF */ + ["\u0643", "\u0643"], /* ARABIC LETTER KAF (ARABIC LETTER CAF) */ + ["\u0644", "\u0644"], /* ARABIC LETTER LAM */ + ["\u0645", "\u0645"], /* ARABIC LETTER MEEM */ + ["\u0646", "\u0646"], /* ARABIC LETTER NOON */ + ["\u0647", "\u0647"], /* ARABIC LETTER HEH (ARABIC LETTER HA) */ + ["\u0648", "\u0648"], /* ARABIC LETTER WAW */ + ["\u0649", "\u0649"], /* ARABIC LETTER ALEF MAKSURA (ARABIC LETTER ALEF MAQSURAH) */ + ["\u064A", "\u064A"], /* ARABIC LETTER YEH (ARABIC LETTER YA) */ + ["\u064B", "\u064B"], /* ARABIC FATHATAN */ + ["\u064C", "\u064C"], /* ARABIC DAMMATAN */ + ["\u064D", "\u064D"], /* ARABIC KASRATAN */ + ["\u064E", "\u064E"], /* ARABIC FATHA (ARABIC FATHAH) */ + ["\u064F", "\u064F"], /* ARABIC DAMMA (ARABIC DAMMAH) */ + ["\u0650", "\u0650"], /* ARABIC KASRA (ARABIC KASRAH) */ + ["\u0651", "\u0651"], /* ARABIC SHADDA (ARABIC SHADDAH) */ + ["\u0652", "\u0652"], /* ARABIC SUKUN */ + ["\u0653", "\u0653"], /* ARABIC MADDAH ABOVE */ + ["\u0654", "\u0654"], /* ARABIC HAMZA ABOVE */ + ["\u0655", "\u0655"], /* ARABIC HAMZA BELOW */ + ["\u0656", "\u0656"], /* ARABIC SUBSCRIPT ALEF */ + ["\u0657", "\u0657"], /* ARABIC INVERTED DAMMA */ + ["\u0658", "\u0658"], /* ARABIC MARK NOON GHUNNA */ + ["\u0659", "\u0659"], /* ARABIC ZWARAKAY */ + ["\u065A", "\u065A"], /* ARABIC VOWEL SIGN SMALL V ABOVE */ + ["\u065B", "\u065B"], /* ARABIC VOWEL SIGN INVERTED SMALL V ABOVE */ + ["\u065C", "\u065C"], /* ARABIC VOWEL SIGN DOT BELOW */ + ["\u065D", "\u065D"], /* ARABIC REVERSED DAMMA */ + ["\u065E", "\u065E"], /* ARABIC FATHA WITH TWO DOTS */ + ["\u065F", "\u065F"], /* ARABIC WAVY HAMZA BELOW */ + ["\u0660", "\u0660"], /* ARABIC-INDIC DIGIT ZERO */ + ["\u0661", "\u0661"], /* ARABIC-INDIC DIGIT ONE */ + ["\u0662", "\u0662"], /* ARABIC-INDIC DIGIT TWO */ + ["\u0663", "\u0663"], /* ARABIC-INDIC DIGIT THREE */ + ["\u0664", "\u0664"], /* ARABIC-INDIC DIGIT FOUR */ + ["\u0665", "\u0665"], /* ARABIC-INDIC DIGIT FIVE */ + ["\u0666", "\u0666"], /* ARABIC-INDIC DIGIT SIX */ + ["\u0667", "\u0667"], /* ARABIC-INDIC DIGIT SEVEN */ + ["\u0668", "\u0668"], /* ARABIC-INDIC DIGIT EIGHT */ + ["\u0669", "\u0669"], /* ARABIC-INDIC DIGIT NINE */ + ["\u066A", "\u066A"], /* ARABIC PERCENT SIGN */ + ["\u066B", "\u066B"], /* ARABIC DECIMAL SEPARATOR */ + ["\u066C", "\u066C"], /* ARABIC THOUSANDS SEPARATOR */ + ["\u066D", "\u066D"], /* ARABIC FIVE POINTED STAR */ + ["\u066E", "\u066E"], /* ARABIC LETTER DOTLESS BEH */ + ["\u066F", "\u066F"], /* ARABIC LETTER DOTLESS QAF */ + ["\u0670", "\u0670"], /* ARABIC LETTER SUPERSCRIPT ALEF (ARABIC ALEF ABOVE) */ + ["\u0671", "\u0671"], /* ARABIC LETTER ALEF WASLA (ARABIC LETTER HAMZAT WASL ON ALEF) */ + ["\u0672", "\u0672"], /* ARABIC LETTER ALEF WITH WAVY HAMZA ABOVE (ARABIC LETTER WAVY HAMZAH ON ALEF) */ + ["\u0673", "\u0673"], /* ARABIC LETTER ALEF WITH WAVY HAMZA BELOW (ARABIC LETTER WAVY HAMZAH UNDER ALEF) */ + ["\u0674", "\u0674"], /* ARABIC LETTER HIGH HAMZA (ARABIC LETTER HIGH HAMZAH) */ + ["\u0675", "\u0675"], /* ARABIC LETTER HIGH HAMZA ALEF (ARABIC LETTER HIGH HAMZAH ALEF) */ + ["\u0676", "\u0676"], /* ARABIC LETTER HIGH HAMZA WAW (ARABIC LETTER HIGH HAMZAH WAW) */ + ["\u0677", "\u0677"], /* ARABIC LETTER U WITH HAMZA ABOVE (ARABIC LETTER HIGH HAMZAH WAW WITH DAMMAH) */ + ["\u0678", "\u0678"], /* ARABIC LETTER HIGH HAMZA YEH (ARABIC LETTER HIGH HAMZAH YA) */ + ["\u0679", "\u0679"], /* ARABIC LETTER TTEH (ARABIC LETTER TAA WITH SMALL TAH) */ + ["\u067A", "\u067A"], /* ARABIC LETTER TTEHEH (ARABIC LETTER TAA WITH TWO DOTS VERTICAL ABOVE) */ + ["\u067B", "\u067B"], /* ARABIC LETTER BEEH (ARABIC LETTER BAA WITH TWO DOTS VERTICAL BELOW) */ + ["\u067C", "\u067C"], /* ARABIC LETTER TEH WITH RING (ARABIC LETTER TAA WITH RING) */ + ["\u067D", "\u067D"], /* ARABIC LETTER TEH WITH THREE DOTS ABOVE DOWNWARDS (ARABIC LETTER TAA WITH THREE DOTS ABOVE DOWNWARD) */ + ["\u067E", "\u067E"], /* ARABIC LETTER PEH (ARABIC LETTER TAA WITH THREE DOTS BELOW) */ + ["\u067F", "\u067F"], /* ARABIC LETTER TEHEH (ARABIC LETTER TAA WITH FOUR DOTS ABOVE) */ + ["\u0680", "\u0680"], /* ARABIC LETTER BEHEH (ARABIC LETTER BAA WITH FOUR DOTS BELOW) */ + ["\u0681", "\u0681"], /* ARABIC LETTER HAH WITH HAMZA ABOVE (ARABIC LETTER HAMZAH ON HAA) */ + ["\u0682", "\u0682"], /* ARABIC LETTER HAH WITH TWO DOTS VERTICAL ABOVE (ARABIC LETTER HAA WITH TWO DOTS VERTICAL ABOVE) */ + ["\u0683", "\u0683"], /* ARABIC LETTER NYEH (ARABIC LETTER HAA WITH MIDDLE TWO DOTS) */ + ["\u0684", "\u0684"], /* ARABIC LETTER DYEH (ARABIC LETTER HAA WITH MIDDLE TWO DOTS VERTICAL) */ + ["\u0685", "\u0685"], /* ARABIC LETTER HAH WITH THREE DOTS ABOVE (ARABIC LETTER HAA WITH THREE DOTS ABOVE) */ + ["\u0686", "\u0686"], /* ARABIC LETTER TCHEH (ARABIC LETTER HAA WITH MIDDLE THREE DOTS DOWNWARD) */ + ["\u0687", "\u0687"], /* ARABIC LETTER TCHEHEH (ARABIC LETTER HAA WITH MIDDLE FOUR DOTS) */ + ["\u0688", "\u0688"], /* ARABIC LETTER DDAL (ARABIC LETTER DAL WITH SMALL TAH) */ + ["\u0689", "\u0689"], /* ARABIC LETTER DAL WITH RING */ + ["\u068A", "\u068A"], /* ARABIC LETTER DAL WITH DOT BELOW */ + ["\u068B", "\u068B"], /* ARABIC LETTER DAL WITH DOT BELOW AND SMALL TAH */ + ["\u068C", "\u068C"], /* ARABIC LETTER DAHAL (ARABIC LETTER DAL WITH TWO DOTS ABOVE) */ + ["\u068D", "\u068D"], /* ARABIC LETTER DDAHAL (ARABIC LETTER DAL WITH TWO DOTS BELOW) */ + ["\u068E", "\u068E"], /* ARABIC LETTER DUL (ARABIC LETTER DAL WITH THREE DOTS ABOVE) */ + ["\u068F", "\u068F"], /* ARABIC LETTER DAL WITH THREE DOTS ABOVE DOWNWARDS (ARABIC LETTER DAL WITH THREE DOTS ABOVE DOWNWARD) */ + ["\u0690", "\u0690"], /* ARABIC LETTER DAL WITH FOUR DOTS ABOVE */ + ["\u0691", "\u0691"], /* ARABIC LETTER RREH (ARABIC LETTER RA WITH SMALL TAH) */ + ["\u0692", "\u0692"], /* ARABIC LETTER REH WITH SMALL V (ARABIC LETTER RA WITH SMALL V) */ + ["\u0693", "\u0693"], /* ARABIC LETTER REH WITH RING (ARABIC LETTER RA WITH RING) */ + ["\u0694", "\u0694"], /* ARABIC LETTER REH WITH DOT BELOW (ARABIC LETTER RA WITH DOT BELOW) */ + ["\u0695", "\u0695"], /* ARABIC LETTER REH WITH SMALL V BELOW (ARABIC LETTER RA WITH SMALL V BELOW) */ + ["\u0696", "\u0696"], /* ARABIC LETTER REH WITH DOT BELOW AND DOT ABOVE (ARABIC LETTER RA WITH DOT BELOW AND DOT ABOVE) */ + ["\u0697", "\u0697"], /* ARABIC LETTER REH WITH TWO DOTS ABOVE (ARABIC LETTER RA WITH TWO DOTS ABOVE) */ + ["\u0698", "\u0698"], /* ARABIC LETTER JEH (ARABIC LETTER RA WITH THREE DOTS ABOVE) */ + ["\u0699", "\u0699"], /* ARABIC LETTER REH WITH FOUR DOTS ABOVE (ARABIC LETTER RA WITH FOUR DOTS ABOVE) */ + ["\u069A", "\u069A"], /* ARABIC LETTER SEEN WITH DOT BELOW AND DOT ABOVE */ + ["\u069B", "\u069B"], /* ARABIC LETTER SEEN WITH THREE DOTS BELOW */ + ["\u069C", "\u069C"], /* ARABIC LETTER SEEN WITH THREE DOTS BELOW AND THREE DOTS ABOVE */ + ["\u069D", "\u069D"], /* ARABIC LETTER SAD WITH TWO DOTS BELOW */ + ["\u069E", "\u069E"], /* ARABIC LETTER SAD WITH THREE DOTS ABOVE */ + ["\u069F", "\u069F"], /* ARABIC LETTER TAH WITH THREE DOTS ABOVE */ + ["\u06A0", "\u06A0"], /* ARABIC LETTER AIN WITH THREE DOTS ABOVE */ + ["\u06A1", "\u06A1"], /* ARABIC LETTER DOTLESS FEH (ARABIC LETTER DOTLESS FA) */ + ["\u06A2", "\u06A2"], /* ARABIC LETTER FEH WITH DOT MOVED BELOW (ARABIC LETTER FA WITH DOT MOVED BELOW) */ + ["\u06A3", "\u06A3"], /* ARABIC LETTER FEH WITH DOT BELOW (ARABIC LETTER FA WITH DOT BELOW) */ + ["\u06A4", "\u06A4"], /* ARABIC LETTER VEH (ARABIC LETTER FA WITH THREE DOTS ABOVE) */ + ["\u06A5", "\u06A5"], /* ARABIC LETTER FEH WITH THREE DOTS BELOW (ARABIC LETTER FA WITH THREE DOTS BELOW) */ + ["\u06A6", "\u06A6"], /* ARABIC LETTER PEHEH (ARABIC LETTER FA WITH FOUR DOTS ABOVE) */ + ["\u06A7", "\u06A7"], /* ARABIC LETTER QAF WITH DOT ABOVE */ + ["\u06A8", "\u06A8"], /* ARABIC LETTER QAF WITH THREE DOTS ABOVE */ + ["\u06A9", "\u06A9"], /* ARABIC LETTER KEHEH (ARABIC LETTER OPEN CAF) */ + ["\u06AA", "\u06AA"], /* ARABIC LETTER SWASH KAF (ARABIC LETTER SWASH CAF) */ + ["\u06AB", "\u06AB"], /* ARABIC LETTER KAF WITH RING (ARABIC LETTER CAF WITH RING) */ + ["\u06AC", "\u06AC"], /* ARABIC LETTER KAF WITH DOT ABOVE (ARABIC LETTER CAF WITH DOT ABOVE) */ + ["\u06AD", "\u06AD"], /* ARABIC LETTER NG (ARABIC LETTER CAF WITH THREE DOTS ABOVE) */ + ["\u06AE", "\u06AE"], /* ARABIC LETTER KAF WITH THREE DOTS BELOW (ARABIC LETTER CAF WITH THREE DOTS BELOW) */ + ["\u06AF", "\u06AF"], /* ARABIC LETTER GAF */ + ["\u06B0", "\u06B0"], /* ARABIC LETTER GAF WITH RING */ + ["\u06B1", "\u06B1"], /* ARABIC LETTER NGOEH (ARABIC LETTER GAF WITH TWO DOTS ABOVE) */ + ["\u06B2", "\u06B2"], /* ARABIC LETTER GAF WITH TWO DOTS BELOW */ + ["\u06B3", "\u06B3"], /* ARABIC LETTER GUEH (ARABIC LETTER GAF WITH TWO DOTS VERTICAL BELOW) */ + ["\u06B4", "\u06B4"], /* ARABIC LETTER GAF WITH THREE DOTS ABOVE */ + ["\u06B5", "\u06B5"], /* ARABIC LETTER LAM WITH SMALL V */ + ["\u06B6", "\u06B6"], /* ARABIC LETTER LAM WITH DOT ABOVE */ + ["\u06B7", "\u06B7"], /* ARABIC LETTER LAM WITH THREE DOTS ABOVE */ + ["\u06B8", "\u06B8"], /* ARABIC LETTER LAM WITH THREE DOTS BELOW */ + ["\u06B9", "\u06B9"], /* ARABIC LETTER NOON WITH DOT BELOW */ + ["\u06BA", "\u06BA"], /* ARABIC LETTER NOON GHUNNA (ARABIC LETTER DOTLESS NOON) */ + ["\u06BB", "\u06BB"], /* ARABIC LETTER RNOON (ARABIC LETTER DOTLESS NOON WITH SMALL TAH) */ + ["\u06BC", "\u06BC"], /* ARABIC LETTER NOON WITH RING */ + ["\u06BD", "\u06BD"], /* ARABIC LETTER NOON WITH THREE DOTS ABOVE */ + ["\u06BE", "\u06BE"], /* ARABIC LETTER HEH DOACHASHMEE (ARABIC LETTER KNOTTED HA) */ + ["\u06BF", "\u06BF"], /* ARABIC LETTER TCHEH WITH DOT ABOVE */ + ["\u06C0", "\u06C0"], /* ARABIC LETTER HEH WITH YEH ABOVE (ARABIC LETTER HAMZAH ON HA) */ + ["\u06C1", "\u06C1"], /* ARABIC LETTER HEH GOAL (ARABIC LETTER HA GOAL) */ + ["\u06C2", "\u06C2"], /* ARABIC LETTER HEH GOAL WITH HAMZA ABOVE (ARABIC LETTER HAMZAH ON HA GOAL) */ + ["\u06C3", "\u06C3"], /* ARABIC LETTER TEH MARBUTA GOAL (ARABIC LETTER TAA MARBUTAH GOAL) */ + ["\u06C4", "\u06C4"], /* ARABIC LETTER WAW WITH RING */ + ["\u06C5", "\u06C5"], /* ARABIC LETTER KIRGHIZ OE (ARABIC LETTER WAW WITH BAR) */ + ["\u06C6", "\u06C6"], /* ARABIC LETTER OE (ARABIC LETTER WAW WITH SMALL V) */ + ["\u06C7", "\u06C7"], /* ARABIC LETTER U (ARABIC LETTER WAW WITH DAMMAH) */ + ["\u06C8", "\u06C8"], /* ARABIC LETTER YU (ARABIC LETTER WAW WITH ALEF ABOVE) */ + ["\u06C9", "\u06C9"], /* ARABIC LETTER KIRGHIZ YU (ARABIC LETTER WAW WITH INVERTED SMALL V) */ + ["\u06CA", "\u06CA"], /* ARABIC LETTER WAW WITH TWO DOTS ABOVE */ + ["\u06CB", "\u06CB"], /* ARABIC LETTER VE (ARABIC LETTER WAW WITH THREE DOTS ABOVE) */ + ["\u06CC", "\u06CC"], /* ARABIC LETTER FARSI YEH (ARABIC LETTER DOTLESS YA) */ + ["\u06CD", "\u06CD"], /* ARABIC LETTER YEH WITH TAIL (ARABIC LETTER YA WITH TAIL) */ + ["\u06CE", "\u06CE"], /* ARABIC LETTER YEH WITH SMALL V (ARABIC LETTER YA WITH SMALL V) */ + ["\u06CF", "\u06CF"], /* ARABIC LETTER WAW WITH DOT ABOVE */ + ["\u06D0", "\u06D0"], /* ARABIC LETTER E (ARABIC LETTER YA WITH TWO DOTS VERTICAL BELOW) */ + ["\u06D1", "\u06D1"], /* ARABIC LETTER YEH WITH THREE DOTS BELOW (ARABIC LETTER YA WITH THREE DOTS BELOW) */ + ["\u06D2", "\u06D2"], /* ARABIC LETTER YEH BARREE (ARABIC LETTER YA BARREE) */ + ["\u06D3", "\u06D3"], /* ARABIC LETTER YEH BARREE WITH HAMZA ABOVE (ARABIC LETTER HAMZAH ON YA BARREE) */ + ["\u06D4", "\u06D4"], /* ARABIC FULL STOP (ARABIC PERIOD) */ + ["\u06D5", "\u06D5"], /* ARABIC LETTER AE */ + ["\u06D6", "\u06D6"], /* ARABIC SMALL HIGH LIGATURE SAD WITH LAM WITH ALEF MAKSURA */ + ["\u06D7", "\u06D7"], /* ARABIC SMALL HIGH LIGATURE QAF WITH LAM WITH ALEF MAKSURA */ + ["\u06D8", "\u06D8"], /* ARABIC SMALL HIGH MEEM INITIAL FORM */ + ["\u06D9", "\u06D9"], /* ARABIC SMALL HIGH LAM ALEF */ + ["\u06DA", "\u06DA"], /* ARABIC SMALL HIGH JEEM */ + ["\u06DB", "\u06DB"], /* ARABIC SMALL HIGH THREE DOTS */ + ["\u06DC", "\u06DC"], /* ARABIC SMALL HIGH SEEN */ + ["\u06DD", "\u06DD"], /* ARABIC END OF AYAH */ + ["\u06DE", "\u06DE"], /* ARABIC START OF RUB EL HIZB */ + ["\u06DF", "\u06DF"], /* ARABIC SMALL HIGH ROUNDED ZERO */ + ["\u06E0", "\u06E0"], /* ARABIC SMALL HIGH UPRIGHT RECTANGULAR ZERO */ + ["\u06E1", "\u06E1"], /* ARABIC SMALL HIGH DOTLESS HEAD OF KHAH */ + ["\u06E2", "\u06E2"], /* ARABIC SMALL HIGH MEEM ISOLATED FORM */ + ["\u06E3", "\u06E3"], /* ARABIC SMALL LOW SEEN */ + ["\u06E4", "\u06E4"], /* ARABIC SMALL HIGH MADDA */ + ["\u06E5", "\u06E5"], /* ARABIC SMALL WAW */ + ["\u06E6", "\u06E6"], /* ARABIC SMALL YEH */ + ["\u06E7", "\u06E7"], /* ARABIC SMALL HIGH YEH */ + ["\u06E8", "\u06E8"], /* ARABIC SMALL HIGH NOON */ + ["\u06E9", "\u06E9"], /* ARABIC PLACE OF SAJDAH */ + ["\u06EA", "\u06EA"], /* ARABIC EMPTY CENTRE LOW STOP */ + ["\u06EB", "\u06EB"], /* ARABIC EMPTY CENTRE HIGH STOP */ + ["\u06EC", "\u06EC"], /* ARABIC ROUNDED HIGH STOP WITH FILLED CENTRE */ + ["\u06ED", "\u06ED"], /* ARABIC SMALL LOW MEEM */ + ["\u06EE", "\u06EE"], /* ARABIC LETTER DAL WITH INVERTED V */ + ["\u06EF", "\u06EF"], /* ARABIC LETTER REH WITH INVERTED V */ + ["\u06F0", "\u06F0"], /* EXTENDED ARABIC-INDIC DIGIT ZERO (EASTERN ARABIC-INDIC DIGIT ZERO) */ + ["\u06F1", "\u06F1"], /* EXTENDED ARABIC-INDIC DIGIT ONE (EASTERN ARABIC-INDIC DIGIT ONE) */ + ["\u06F2", "\u06F2"], /* EXTENDED ARABIC-INDIC DIGIT TWO (EASTERN ARABIC-INDIC DIGIT TWO) */ + ["\u06F3", "\u06F3"], /* EXTENDED ARABIC-INDIC DIGIT THREE (EASTERN ARABIC-INDIC DIGIT THREE) */ + ["\u06F4", "\u06F4"], /* EXTENDED ARABIC-INDIC DIGIT FOUR (EASTERN ARABIC-INDIC DIGIT FOUR) */ + ["\u06F5", "\u06F5"], /* EXTENDED ARABIC-INDIC DIGIT FIVE (EASTERN ARABIC-INDIC DIGIT FIVE) */ + ["\u06F6", "\u06F6"], /* EXTENDED ARABIC-INDIC DIGIT SIX (EASTERN ARABIC-INDIC DIGIT SIX) */ + ["\u06F7", "\u06F7"], /* EXTENDED ARABIC-INDIC DIGIT SEVEN (EASTERN ARABIC-INDIC DIGIT SEVEN) */ + ["\u06F8", "\u06F8"], /* EXTENDED ARABIC-INDIC DIGIT EIGHT (EASTERN ARABIC-INDIC DIGIT EIGHT) */ + ["\u06F9", "\u06F9"], /* EXTENDED ARABIC-INDIC DIGIT NINE (EASTERN ARABIC-INDIC DIGIT NINE) */ + ["\u06FA", "\u06FA"], /* ARABIC LETTER SHEEN WITH DOT BELOW */ + ["\u06FB", "\u06FB"], /* ARABIC LETTER DAD WITH DOT BELOW */ + ["\u06FC", "\u06FC"], /* ARABIC LETTER GHAIN WITH DOT BELOW */ + ["\u06FD", "\u06FD"], /* ARABIC SIGN SINDHI AMPERSAND */ + ["\u06FE", "\u06FE"], /* ARABIC SIGN SINDHI POSTPOSITION MEN */ + ["\u06FF", "\u06FF"], /* ARABIC LETTER HEH WITH INVERTED V */ + ["\u0700", "\u0700"], /* SYRIAC END OF PARAGRAPH */ + ["\u0701", "\u0701"], /* SYRIAC SUPRALINEAR FULL STOP */ + ["\u0702", "\u0702"], /* SYRIAC SUBLINEAR FULL STOP */ + ["\u0703", "\u0703"], /* SYRIAC SUPRALINEAR COLON */ + ["\u0704", "\u0704"], /* SYRIAC SUBLINEAR COLON */ + ["\u0705", "\u0705"], /* SYRIAC HORIZONTAL COLON */ + ["\u0706", "\u0706"], /* SYRIAC COLON SKEWED LEFT */ + ["\u0707", "\u0707"], /* SYRIAC COLON SKEWED RIGHT */ + ["\u0708", "\u0708"], /* SYRIAC SUPRALINEAR COLON SKEWED LEFT */ + ["\u0709", "\u0709"], /* SYRIAC SUBLINEAR COLON SKEWED RIGHT */ + ["\u070A", "\u070A"], /* SYRIAC CONTRACTION */ + ["\u070B", "\u070B"], /* SYRIAC HARKLEAN OBELUS */ + ["\u070C", "\u070C"], /* SYRIAC HARKLEAN METOBELUS */ + ["\u070D", "\u070D"], /* SYRIAC HARKLEAN ASTERISCUS */ + ["\u070E", "\u070E"], + ["\u070F", "\u070F"], /* SYRIAC ABBREVIATION MARK */ + ["\u0710", "\u0710"], /* SYRIAC LETTER ALAPH */ + ["\u0711", "\u0711"], /* SYRIAC LETTER SUPERSCRIPT ALAPH */ + ["\u0712", "\u0712"], /* SYRIAC LETTER BETH */ + ["\u0713", "\u0713"], /* SYRIAC LETTER GAMAL */ + ["\u0714", "\u0714"], /* SYRIAC LETTER GAMAL GARSHUNI */ + ["\u0715", "\u0715"], /* SYRIAC LETTER DALATH */ + ["\u0716", "\u0716"], /* SYRIAC LETTER DOTLESS DALATH RISH */ + ["\u0717", "\u0717"], /* SYRIAC LETTER HE */ + ["\u0718", "\u0718"], /* SYRIAC LETTER WAW */ + ["\u0719", "\u0719"], /* SYRIAC LETTER ZAIN */ + ["\u071A", "\u071A"], /* SYRIAC LETTER HETH */ + ["\u071B", "\u071B"], /* SYRIAC LETTER TETH */ + ["\u071C", "\u071C"], /* SYRIAC LETTER TETH GARSHUNI */ + ["\u071D", "\u071D"], /* SYRIAC LETTER YUDH */ + ["\u071E", "\u071E"], /* SYRIAC LETTER YUDH HE */ + ["\u071F", "\u071F"], /* SYRIAC LETTER KAPH */ + ["\u0720", "\u0720"], /* SYRIAC LETTER LAMADH */ + ["\u0721", "\u0721"], /* SYRIAC LETTER MIM */ + ["\u0722", "\u0722"], /* SYRIAC LETTER NUN */ + ["\u0723", "\u0723"], /* SYRIAC LETTER SEMKATH */ + ["\u0724", "\u0724"], /* SYRIAC LETTER FINAL SEMKATH */ + ["\u0725", "\u0725"], /* SYRIAC LETTER E */ + ["\u0726", "\u0726"], /* SYRIAC LETTER PE */ + ["\u0727", "\u0727"], /* SYRIAC LETTER REVERSED PE */ + ["\u0728", "\u0728"], /* SYRIAC LETTER SADHE */ + ["\u0729", "\u0729"], /* SYRIAC LETTER QAPH */ + ["\u072A", "\u072A"], /* SYRIAC LETTER RISH */ + ["\u072B", "\u072B"], /* SYRIAC LETTER SHIN */ + ["\u072C", "\u072C"], /* SYRIAC LETTER TAW */ + ["\u072D", "\u072D"], /* SYRIAC LETTER PERSIAN BHETH */ + ["\u072E", "\u072E"], /* SYRIAC LETTER PERSIAN GHAMAL */ + ["\u072F", "\u072F"], /* SYRIAC LETTER PERSIAN DHALATH */ + ["\u0730", "\u0730"], /* SYRIAC PTHAHA ABOVE */ + ["\u0731", "\u0731"], /* SYRIAC PTHAHA BELOW */ + ["\u0732", "\u0732"], /* SYRIAC PTHAHA DOTTED */ + ["\u0733", "\u0733"], /* SYRIAC ZQAPHA ABOVE */ + ["\u0734", "\u0734"], /* SYRIAC ZQAPHA BELOW */ + ["\u0735", "\u0735"], /* SYRIAC ZQAPHA DOTTED */ + ["\u0736", "\u0736"], /* SYRIAC RBASA ABOVE */ + ["\u0737", "\u0737"], /* SYRIAC RBASA BELOW */ + ["\u0738", "\u0738"], /* SYRIAC DOTTED ZLAMA HORIZONTAL */ + ["\u0739", "\u0739"], /* SYRIAC DOTTED ZLAMA ANGULAR */ + ["\u073A", "\u073A"], /* SYRIAC HBASA ABOVE */ + ["\u073B", "\u073B"], /* SYRIAC HBASA BELOW */ + ["\u073C", "\u073C"], /* SYRIAC HBASA-ESASA DOTTED */ + ["\u073D", "\u073D"], /* SYRIAC ESASA ABOVE */ + ["\u073E", "\u073E"], /* SYRIAC ESASA BELOW */ + ["\u073F", "\u073F"], /* SYRIAC RWAHA */ + ["\u0740", "\u0740"], /* SYRIAC FEMININE DOT */ + ["\u0741", "\u0741"], /* SYRIAC QUSHSHAYA */ + ["\u0742", "\u0742"], /* SYRIAC RUKKAKHA */ + ["\u0743", "\u0743"], /* SYRIAC TWO VERTICAL DOTS ABOVE */ + ["\u0744", "\u0744"], /* SYRIAC TWO VERTICAL DOTS BELOW */ + ["\u0745", "\u0745"], /* SYRIAC THREE DOTS ABOVE */ + ["\u0746", "\u0746"], /* SYRIAC THREE DOTS BELOW */ + ["\u0747", "\u0747"], /* SYRIAC OBLIQUE LINE ABOVE */ + ["\u0748", "\u0748"], /* SYRIAC OBLIQUE LINE BELOW */ + ["\u0749", "\u0749"], /* SYRIAC MUSIC */ + ["\u074A", "\u074A"], /* SYRIAC BARREKH */ + ["\u074B", "\u074B"], + ["\u074C", "\u074C"], + ["\u074D", "\u074D"], /* SYRIAC LETTER SOGDIAN ZHAIN */ + ["\u074E", "\u074E"], /* SYRIAC LETTER SOGDIAN KHAPH */ + ["\u074F", "\u074F"], /* SYRIAC LETTER SOGDIAN FE */ + ["\u0750", "\u0750"], /* ARABIC LETTER BEH WITH THREE DOTS HORIZONTALLY BELOW */ + ["\u0751", "\u0751"], /* ARABIC LETTER BEH WITH DOT BELOW AND THREE DOTS ABOVE */ + ["\u0752", "\u0752"], /* ARABIC LETTER BEH WITH THREE DOTS POINTING UPWARDS BELOW */ + ["\u0753", "\u0753"], /* ARABIC LETTER BEH WITH THREE DOTS POINTING UPWARDS BELOW AND TWO DOTS ABOVE */ + ["\u0754", "\u0754"], /* ARABIC LETTER BEH WITH TWO DOTS BELOW AND DOT ABOVE */ + ["\u0755", "\u0755"], /* ARABIC LETTER BEH WITH INVERTED SMALL V BELOW */ + ["\u0756", "\u0756"], /* ARABIC LETTER BEH WITH SMALL V */ + ["\u0757", "\u0757"], /* ARABIC LETTER HAH WITH TWO DOTS ABOVE */ + ["\u0758", "\u0758"], /* ARABIC LETTER HAH WITH THREE DOTS POINTING UPWARDS BELOW */ + ["\u0759", "\u0759"], /* ARABIC LETTER DAL WITH TWO DOTS VERTICALLY BELOW AND SMALL TAH */ + ["\u075A", "\u075A"], /* ARABIC LETTER DAL WITH INVERTED SMALL V BELOW */ + ["\u075B", "\u075B"], /* ARABIC LETTER REH WITH STROKE */ + ["\u075C", "\u075C"], /* ARABIC LETTER SEEN WITH FOUR DOTS ABOVE */ + ["\u075D", "\u075D"], /* ARABIC LETTER AIN WITH TWO DOTS ABOVE */ + ["\u075E", "\u075E"], /* ARABIC LETTER AIN WITH THREE DOTS POINTING DOWNWARDS ABOVE */ + ["\u075F", "\u075F"], /* ARABIC LETTER AIN WITH TWO DOTS VERTICALLY ABOVE */ + ["\u0760", "\u0760"], /* ARABIC LETTER FEH WITH TWO DOTS BELOW */ + ["\u0761", "\u0761"], /* ARABIC LETTER FEH WITH THREE DOTS POINTING UPWARDS BELOW */ + ["\u0762", "\u0762"], /* ARABIC LETTER KEHEH WITH DOT ABOVE */ + ["\u0763", "\u0763"], /* ARABIC LETTER KEHEH WITH THREE DOTS ABOVE */ + ["\u0764", "\u0764"], /* ARABIC LETTER KEHEH WITH THREE DOTS POINTING UPWARDS BELOW */ + ["\u0765", "\u0765"], /* ARABIC LETTER MEEM WITH DOT ABOVE */ + ["\u0766", "\u0766"], /* ARABIC LETTER MEEM WITH DOT BELOW */ + ["\u0767", "\u0767"], /* ARABIC LETTER NOON WITH TWO DOTS BELOW */ + ["\u0768", "\u0768"], /* ARABIC LETTER NOON WITH SMALL TAH */ + ["\u0769", "\u0769"], /* ARABIC LETTER NOON WITH SMALL V */ + ["\u076A", "\u076A"], /* ARABIC LETTER LAM WITH BAR */ + ["\u076B", "\u076B"], /* ARABIC LETTER REH WITH TWO DOTS VERTICALLY ABOVE */ + ["\u076C", "\u076C"], /* ARABIC LETTER REH WITH HAMZA ABOVE */ + ["\u076D", "\u076D"], /* ARABIC LETTER SEEN WITH TWO DOTS VERTICALLY ABOVE */ + ["\u076E", "\u076E"], /* ARABIC LETTER HAH WITH SMALL ARABIC LETTER TAH BELOW */ + ["\u076F", "\u076F"], /* ARABIC LETTER HAH WITH SMALL ARABIC LETTER TAH AND TWO DOTS */ + ["\u0770", "\u0770"], /* ARABIC LETTER SEEN WITH SMALL ARABIC LETTER TAH AND TWO DOTS */ + ["\u0771", "\u0771"], /* ARABIC LETTER REH WITH SMALL ARABIC LETTER TAH AND TWO DOTS */ + ["\u0772", "\u0772"], /* ARABIC LETTER HAH WITH SMALL ARABIC LETTER TAH ABOVE */ + ["\u0773", "\u0773"], /* ARABIC LETTER ALEF WITH EXTENDED ARABIC-INDIC DIGIT TWO ABOVE */ + ["\u0774", "\u0774"], /* ARABIC LETTER ALEF WITH EXTENDED ARABIC-INDIC DIGIT THREE ABOVE */ + ["\u0775", "\u0775"], /* ARABIC LETTER FARSI YEH WITH EXTENDED ARABIC-INDIC DIGIT TWO ABOVE */ + ["\u0776", "\u0776"], /* ARABIC LETTER FARSI YEH WITH EXTENDED ARABIC-INDIC DIGIT THREE ABOVE */ + ["\u0777", "\u0777"], /* ARABIC LETTER FARSI YEH WITH EXTENDED ARABIC-INDIC DIGIT FOUR BELOW */ + ["\u0778", "\u0778"], /* ARABIC LETTER WAW WITH EXTENDED ARABIC-INDIC DIGIT TWO ABOVE */ + ["\u0779", "\u0779"], /* ARABIC LETTER WAW WITH EXTENDED ARABIC-INDIC DIGIT THREE ABOVE */ + ["\u077A", "\u077A"], /* ARABIC LETTER YEH BARREE WITH EXTENDED ARABIC-INDIC DIGIT TWO ABOVE */ + ["\u077B", "\u077B"], /* ARABIC LETTER YEH BARREE WITH EXTENDED ARABIC-INDIC DIGIT THREE ABOVE */ + ["\u077C", "\u077C"], /* ARABIC LETTER HAH WITH EXTENDED ARABIC-INDIC DIGIT FOUR BELOW */ + ["\u077D", "\u077D"], /* ARABIC LETTER SEEN WITH EXTENDED ARABIC-INDIC DIGIT FOUR ABOVE */ + ["\u077E", "\u077E"], /* ARABIC LETTER SEEN WITH INVERTED V */ + ["\u077F", "\u077F"], /* ARABIC LETTER KAF WITH TWO DOTS ABOVE */ + ["\u0780", "\u0780"], /* THAANA LETTER HAA */ + ["\u0781", "\u0781"], /* THAANA LETTER SHAVIYANI */ + ["\u0782", "\u0782"], /* THAANA LETTER NOONU */ + ["\u0783", "\u0783"], /* THAANA LETTER RAA */ + ["\u0784", "\u0784"], /* THAANA LETTER BAA */ + ["\u0785", "\u0785"], /* THAANA LETTER LHAVIYANI */ + ["\u0786", "\u0786"], /* THAANA LETTER KAAFU */ + ["\u0787", "\u0787"], /* THAANA LETTER ALIFU */ + ["\u0788", "\u0788"], /* THAANA LETTER VAAVU */ + ["\u0789", "\u0789"], /* THAANA LETTER MEEMU */ + ["\u078A", "\u078A"], /* THAANA LETTER FAAFU */ + ["\u078B", "\u078B"], /* THAANA LETTER DHAALU */ + ["\u078C", "\u078C"], /* THAANA LETTER THAA */ + ["\u078D", "\u078D"], /* THAANA LETTER LAAMU */ + ["\u078E", "\u078E"], /* THAANA LETTER GAAFU */ + ["\u078F", "\u078F"], /* THAANA LETTER GNAVIYANI */ + ["\u0790", "\u0790"], /* THAANA LETTER SEENU */ + ["\u0791", "\u0791"], /* THAANA LETTER DAVIYANI */ + ["\u0792", "\u0792"], /* THAANA LETTER ZAVIYANI */ + ["\u0793", "\u0793"], /* THAANA LETTER TAVIYANI */ + ["\u0794", "\u0794"], /* THAANA LETTER YAA */ + ["\u0795", "\u0795"], /* THAANA LETTER PAVIYANI */ + ["\u0796", "\u0796"], /* THAANA LETTER JAVIYANI */ + ["\u0797", "\u0797"], /* THAANA LETTER CHAVIYANI */ + ["\u0798", "\u0798"], /* THAANA LETTER TTAA */ + ["\u0799", "\u0799"], /* THAANA LETTER HHAA */ + ["\u079A", "\u079A"], /* THAANA LETTER KHAA */ + ["\u079B", "\u079B"], /* THAANA LETTER THAALU */ + ["\u079C", "\u079C"], /* THAANA LETTER ZAA */ + ["\u079D", "\u079D"], /* THAANA LETTER SHEENU */ + ["\u079E", "\u079E"], /* THAANA LETTER SAADHU */ + ["\u079F", "\u079F"], /* THAANA LETTER DAADHU */ + ["\u07A0", "\u07A0"], /* THAANA LETTER TO */ + ["\u07A1", "\u07A1"], /* THAANA LETTER ZO */ + ["\u07A2", "\u07A2"], /* THAANA LETTER AINU */ + ["\u07A3", "\u07A3"], /* THAANA LETTER GHAINU */ + ["\u07A4", "\u07A4"], /* THAANA LETTER QAAFU */ + ["\u07A5", "\u07A5"], /* THAANA LETTER WAAVU */ + ["\u07A6", "\u07A6"], /* THAANA ABAFILI */ + ["\u07A7", "\u07A7"], /* THAANA AABAAFILI */ + ["\u07A8", "\u07A8"], /* THAANA IBIFILI */ + ["\u07A9", "\u07A9"], /* THAANA EEBEEFILI */ + ["\u07AA", "\u07AA"], /* THAANA UBUFILI */ + ["\u07AB", "\u07AB"], /* THAANA OOBOOFILI */ + ["\u07AC", "\u07AC"], /* THAANA EBEFILI */ + ["\u07AD", "\u07AD"], /* THAANA EYBEYFILI */ + ["\u07AE", "\u07AE"], /* THAANA OBOFILI */ + ["\u07AF", "\u07AF"], /* THAANA OABOAFILI */ + ["\u07B0", "\u07B0"], /* THAANA SUKUN */ + ["\u07B1", "\u07B1"], /* THAANA LETTER NAA */ + ["\u07B2", "\u07B2"], + ["\u07B3", "\u07B3"], + ["\u07B4", "\u07B4"], + ["\u07B5", "\u07B5"], + ["\u07B6", "\u07B6"], + ["\u07B7", "\u07B7"], + ["\u07B8", "\u07B8"], + ["\u07B9", "\u07B9"], + ["\u07BA", "\u07BA"], + ["\u07BB", "\u07BB"], + ["\u07BC", "\u07BC"], + ["\u07BD", "\u07BD"], + ["\u07BE", "\u07BE"], + ["\u07BF", "\u07BF"], + ["\u07C0", "\u07C0"], /* NKO DIGIT ZERO */ + ["\u07C1", "\u07C1"], /* NKO DIGIT ONE */ + ["\u07C2", "\u07C2"], /* NKO DIGIT TWO */ + ["\u07C3", "\u07C3"], /* NKO DIGIT THREE */ + ["\u07C4", "\u07C4"], /* NKO DIGIT FOUR */ + ["\u07C5", "\u07C5"], /* NKO DIGIT FIVE */ + ["\u07C6", "\u07C6"], /* NKO DIGIT SIX */ + ["\u07C7", "\u07C7"], /* NKO DIGIT SEVEN */ + ["\u07C8", "\u07C8"], /* NKO DIGIT EIGHT */ + ["\u07C9", "\u07C9"], /* NKO DIGIT NINE */ + ["\u07CA", "\u07CA"], /* NKO LETTER A */ + ["\u07CB", "\u07CB"], /* NKO LETTER EE */ + ["\u07CC", "\u07CC"], /* NKO LETTER I */ + ["\u07CD", "\u07CD"], /* NKO LETTER E */ + ["\u07CE", "\u07CE"], /* NKO LETTER U */ + ["\u07CF", "\u07CF"], /* NKO LETTER OO */ + ["\u07D0", "\u07D0"], /* NKO LETTER O */ + ["\u07D1", "\u07D1"], /* NKO LETTER DAGBASINNA */ + ["\u07D2", "\u07D2"], /* NKO LETTER N */ + ["\u07D3", "\u07D3"], /* NKO LETTER BA */ + ["\u07D4", "\u07D4"], /* NKO LETTER PA */ + ["\u07D5", "\u07D5"], /* NKO LETTER TA */ + ["\u07D6", "\u07D6"], /* NKO LETTER JA */ + ["\u07D7", "\u07D7"], /* NKO LETTER CHA */ + ["\u07D8", "\u07D8"], /* NKO LETTER DA */ + ["\u07D9", "\u07D9"], /* NKO LETTER RA */ + ["\u07DA", "\u07DA"], /* NKO LETTER RRA */ + ["\u07DB", "\u07DB"], /* NKO LETTER SA */ + ["\u07DC", "\u07DC"], /* NKO LETTER GBA */ + ["\u07DD", "\u07DD"], /* NKO LETTER FA */ + ["\u07DE", "\u07DE"], /* NKO LETTER KA */ + ["\u07DF", "\u07DF"], /* NKO LETTER LA */ + ["\u07E0", "\u07E0"], /* NKO LETTER NA WOLOSO */ + ["\u07E1", "\u07E1"], /* NKO LETTER MA */ + ["\u07E2", "\u07E2"], /* NKO LETTER NYA */ + ["\u07E3", "\u07E3"], /* NKO LETTER NA */ + ["\u07E4", "\u07E4"], /* NKO LETTER HA */ + ["\u07E5", "\u07E5"], /* NKO LETTER WA */ + ["\u07E6", "\u07E6"], /* NKO LETTER YA */ + ["\u07E7", "\u07E7"], /* NKO LETTER NYA WOLOSO */ + ["\u07E8", "\u07E8"], /* NKO LETTER JONA JA */ + ["\u07E9", "\u07E9"], /* NKO LETTER JONA CHA */ + ["\u07EA", "\u07EA"], /* NKO LETTER JONA RA */ + ["\u07EB", "\u07EB"], /* NKO COMBINING SHORT HIGH TONE */ + ["\u07EC", "\u07EC"], /* NKO COMBINING SHORT LOW TONE */ + ["\u07ED", "\u07ED"], /* NKO COMBINING SHORT RISING TONE */ + ["\u07EE", "\u07EE"], /* NKO COMBINING LONG DESCENDING TONE */ + ["\u07EF", "\u07EF"], /* NKO COMBINING LONG HIGH TONE */ + ["\u07F0", "\u07F0"], /* NKO COMBINING LONG LOW TONE */ + ["\u07F1", "\u07F1"], /* NKO COMBINING LONG RISING TONE */ + ["\u07F2", "\u07F2"], /* NKO COMBINING NASALIZATION MARK */ + ["\u07F3", "\u07F3"], /* NKO COMBINING DOUBLE DOT ABOVE */ + ["\u07F4", "\u07F4"], /* NKO HIGH TONE APOSTROPHE */ + ["\u07F5", "\u07F5"], /* NKO LOW TONE APOSTROPHE */ + ["\u07F6", "\u07F6"], /* NKO SYMBOL OO DENNEN */ + ["\u07F7", "\u07F7"], /* NKO SYMBOL GBAKURUNEN */ + ["\u07F8", "\u07F8"], /* NKO COMMA */ + ["\u07F9", "\u07F9"], /* NKO EXCLAMATION MARK */ + ["\u07FA", "\u07FA"], /* NKO LAJANYALAN */ + ["\u07FB", "\u07FB"], + ["\u07FC", "\u07FC"], + ["\u07FD", "\u07FD"], /* NKO DANTAYALAN */ + ["\u07FE", "\u07FE"], /* NKO DOROME SIGN */ + ["\u07FF", "\u07FF"], /* NKO TAMAN SIGN */ + ["\u0800", "\u0800"], /* SAMARITAN LETTER ALAF */ + ["\u0801", "\u0801"], /* SAMARITAN LETTER BIT */ + ["\u0802", "\u0802"], /* SAMARITAN LETTER GAMAN */ + ["\u0803", "\u0803"], /* SAMARITAN LETTER DALAT */ + ["\u0804", "\u0804"], /* SAMARITAN LETTER IY */ + ["\u0805", "\u0805"], /* SAMARITAN LETTER BAA */ + ["\u0806", "\u0806"], /* SAMARITAN LETTER ZEN */ + ["\u0807", "\u0807"], /* SAMARITAN LETTER IT */ + ["\u0808", "\u0808"], /* SAMARITAN LETTER TIT */ + ["\u0809", "\u0809"], /* SAMARITAN LETTER YUT */ + ["\u080A", "\u080A"], /* SAMARITAN LETTER KAAF */ + ["\u080B", "\u080B"], /* SAMARITAN LETTER LABAT */ + ["\u080C", "\u080C"], /* SAMARITAN LETTER MIM */ + ["\u080D", "\u080D"], /* SAMARITAN LETTER NUN */ + ["\u080E", "\u080E"], /* SAMARITAN LETTER SINGAAT */ + ["\u080F", "\u080F"], /* SAMARITAN LETTER IN */ + ["\u0810", "\u0810"], /* SAMARITAN LETTER FI */ + ["\u0811", "\u0811"], /* SAMARITAN LETTER TSAADIY */ + ["\u0812", "\u0812"], /* SAMARITAN LETTER QUF */ + ["\u0813", "\u0813"], /* SAMARITAN LETTER RISH */ + ["\u0814", "\u0814"], /* SAMARITAN LETTER SHAN */ + ["\u0815", "\u0815"], /* SAMARITAN LETTER TAAF */ + ["\u0816", "\u0816"], /* SAMARITAN MARK IN */ + ["\u0817", "\u0817"], /* SAMARITAN MARK IN-ALAF */ + ["\u0818", "\u0818"], /* SAMARITAN MARK OCCLUSION */ + ["\u0819", "\u0819"], /* SAMARITAN MARK DAGESH */ + ["\u081A", "\u081A"], /* SAMARITAN MODIFIER LETTER EPENTHETIC YUT */ + ["\u081B", "\u081B"], /* SAMARITAN MARK EPENTHETIC YUT */ + ["\u081C", "\u081C"], /* SAMARITAN VOWEL SIGN LONG E */ + ["\u081D", "\u081D"], /* SAMARITAN VOWEL SIGN E */ + ["\u081E", "\u081E"], /* SAMARITAN VOWEL SIGN OVERLONG AA */ + ["\u081F", "\u081F"], /* SAMARITAN VOWEL SIGN LONG AA */ + ["\u0820", "\u0820"], /* SAMARITAN VOWEL SIGN AA */ + ["\u0821", "\u0821"], /* SAMARITAN VOWEL SIGN OVERLONG A */ + ["\u0822", "\u0822"], /* SAMARITAN VOWEL SIGN LONG A */ + ["\u0823", "\u0823"], /* SAMARITAN VOWEL SIGN A */ + ["\u0824", "\u0824"], /* SAMARITAN MODIFIER LETTER SHORT A */ + ["\u0825", "\u0825"], /* SAMARITAN VOWEL SIGN SHORT A */ + ["\u0826", "\u0826"], /* SAMARITAN VOWEL SIGN LONG U */ + ["\u0827", "\u0827"], /* SAMARITAN VOWEL SIGN U */ + ["\u0828", "\u0828"], /* SAMARITAN MODIFIER LETTER I */ + ["\u0829", "\u0829"], /* SAMARITAN VOWEL SIGN LONG I */ + ["\u082A", "\u082A"], /* SAMARITAN VOWEL SIGN I */ + ["\u082B", "\u082B"], /* SAMARITAN VOWEL SIGN O */ + ["\u082C", "\u082C"], /* SAMARITAN VOWEL SIGN SUKUN */ + ["\u082D", "\u082D"], /* SAMARITAN MARK NEQUDAA */ + ["\u082E", "\u082E"], + ["\u082F", "\u082F"], + ["\u0830", "\u0830"], /* SAMARITAN PUNCTUATION NEQUDAA */ + ["\u0831", "\u0831"], /* SAMARITAN PUNCTUATION AFSAAQ */ + ["\u0832", "\u0832"], /* SAMARITAN PUNCTUATION ANGED */ + ["\u0833", "\u0833"], /* SAMARITAN PUNCTUATION BAU */ + ["\u0834", "\u0834"], /* SAMARITAN PUNCTUATION ATMAAU */ + ["\u0835", "\u0835"], /* SAMARITAN PUNCTUATION SHIYYAALAA */ + ["\u0836", "\u0836"], /* SAMARITAN ABBREVIATION MARK */ + ["\u0837", "\u0837"], /* SAMARITAN PUNCTUATION MELODIC QITSA */ + ["\u0838", "\u0838"], /* SAMARITAN PUNCTUATION ZIQAA */ + ["\u0839", "\u0839"], /* SAMARITAN PUNCTUATION QITSA */ + ["\u083A", "\u083A"], /* SAMARITAN PUNCTUATION ZAEF */ + ["\u083B", "\u083B"], /* SAMARITAN PUNCTUATION TURU */ + ["\u083C", "\u083C"], /* SAMARITAN PUNCTUATION ARKAANU */ + ["\u083D", "\u083D"], /* SAMARITAN PUNCTUATION SOF MASHFAAT */ + ["\u083E", "\u083E"], /* SAMARITAN PUNCTUATION ANNAAU */ + ["\u083F", "\u083F"], + ["\u0840", "\u0840"], /* MANDAIC LETTER HALQA */ + ["\u0841", "\u0841"], /* MANDAIC LETTER AB */ + ["\u0842", "\u0842"], /* MANDAIC LETTER AG */ + ["\u0843", "\u0843"], /* MANDAIC LETTER AD */ + ["\u0844", "\u0844"], /* MANDAIC LETTER AH */ + ["\u0845", "\u0845"], /* MANDAIC LETTER USHENNA */ + ["\u0846", "\u0846"], /* MANDAIC LETTER AZ */ + ["\u0847", "\u0847"], /* MANDAIC LETTER IT */ + ["\u0848", "\u0848"], /* MANDAIC LETTER ATT */ + ["\u0849", "\u0849"], /* MANDAIC LETTER AKSA */ + ["\u084A", "\u084A"], /* MANDAIC LETTER AK */ + ["\u084B", "\u084B"], /* MANDAIC LETTER AL */ + ["\u084C", "\u084C"], /* MANDAIC LETTER AM */ + ["\u084D", "\u084D"], /* MANDAIC LETTER AN */ + ["\u084E", "\u084E"], /* MANDAIC LETTER AS */ + ["\u084F", "\u084F"], /* MANDAIC LETTER IN */ + ["\u0850", "\u0850"], /* MANDAIC LETTER AP */ + ["\u0851", "\u0851"], /* MANDAIC LETTER ASZ */ + ["\u0852", "\u0852"], /* MANDAIC LETTER AQ */ + ["\u0853", "\u0853"], /* MANDAIC LETTER AR */ + ["\u0854", "\u0854"], /* MANDAIC LETTER ASH */ + ["\u0855", "\u0855"], /* MANDAIC LETTER AT */ + ["\u0856", "\u0856"], /* MANDAIC LETTER DUSHENNA */ + ["\u0857", "\u0857"], /* MANDAIC LETTER KAD */ + ["\u0858", "\u0858"], /* MANDAIC LETTER AIN */ + ["\u0859", "\u0859"], /* MANDAIC AFFRICATION MARK */ + ["\u085A", "\u085A"], /* MANDAIC VOCALIZATION MARK */ + ["\u085B", "\u085B"], /* MANDAIC GEMINATION MARK */ + ["\u085C", "\u085C"], + ["\u085D", "\u085D"], + ["\u085E", "\u085E"], /* MANDAIC PUNCTUATION */ + ["\u085F", "\u085F"], + ["\u0860", "\u0860"], /* SYRIAC LETTER MALAYALAM NGA */ + ["\u0861", "\u0861"], /* SYRIAC LETTER MALAYALAM JA */ + ["\u0862", "\u0862"], /* SYRIAC LETTER MALAYALAM NYA */ + ["\u0863", "\u0863"], /* SYRIAC LETTER MALAYALAM TTA */ + ["\u0864", "\u0864"], /* SYRIAC LETTER MALAYALAM NNA */ + ["\u0865", "\u0865"], /* SYRIAC LETTER MALAYALAM NNNA */ + ["\u0866", "\u0866"], /* SYRIAC LETTER MALAYALAM BHA */ + ["\u0867", "\u0867"], /* SYRIAC LETTER MALAYALAM RA */ + ["\u0868", "\u0868"], /* SYRIAC LETTER MALAYALAM LLA */ + ["\u0869", "\u0869"], /* SYRIAC LETTER MALAYALAM LLLA */ + ["\u086A", "\u086A"], /* SYRIAC LETTER MALAYALAM SSA */ + ["\u086B", "\u086B"], + ["\u086C", "\u086C"], + ["\u086D", "\u086D"], + ["\u086E", "\u086E"], + ["\u086F", "\u086F"], + ["\u0870", "\u0870"], /* ARABIC LETTER ALEF WITH ATTACHED FATHA */ + ["\u0871", "\u0871"], /* ARABIC LETTER ALEF WITH ATTACHED TOP RIGHT FATHA */ + ["\u0872", "\u0872"], /* ARABIC LETTER ALEF WITH RIGHT MIDDLE STROKE */ + ["\u0873", "\u0873"], /* ARABIC LETTER ALEF WITH LEFT MIDDLE STROKE */ + ["\u0874", "\u0874"], /* ARABIC LETTER ALEF WITH ATTACHED KASRA */ + ["\u0875", "\u0875"], /* ARABIC LETTER ALEF WITH ATTACHED BOTTOM RIGHT KASRA */ + ["\u0876", "\u0876"], /* ARABIC LETTER ALEF WITH ATTACHED ROUND DOT ABOVE */ + ["\u0877", "\u0877"], /* ARABIC LETTER ALEF WITH ATTACHED RIGHT ROUND DOT */ + ["\u0878", "\u0878"], /* ARABIC LETTER ALEF WITH ATTACHED LEFT ROUND DOT */ + ["\u0879", "\u0879"], /* ARABIC LETTER ALEF WITH ATTACHED ROUND DOT BELOW */ + ["\u087A", "\u087A"], /* ARABIC LETTER ALEF WITH DOT ABOVE */ + ["\u087B", "\u087B"], /* ARABIC LETTER ALEF WITH ATTACHED TOP RIGHT FATHA AND DOT ABOVE */ + ["\u087C", "\u087C"], /* ARABIC LETTER ALEF WITH RIGHT MIDDLE STROKE AND DOT ABOVE */ + ["\u087D", "\u087D"], /* ARABIC LETTER ALEF WITH ATTACHED BOTTOM RIGHT KASRA AND DOT ABOVE */ + ["\u087E", "\u087E"], /* ARABIC LETTER ALEF WITH ATTACHED TOP RIGHT FATHA AND LEFT RING */ + ["\u087F", "\u087F"], /* ARABIC LETTER ALEF WITH RIGHT MIDDLE STROKE AND LEFT RING */ + ["\u0880", "\u0880"], /* ARABIC LETTER ALEF WITH ATTACHED BOTTOM RIGHT KASRA AND LEFT RING */ + ["\u0881", "\u0881"], /* ARABIC LETTER ALEF WITH ATTACHED RIGHT HAMZA */ + ["\u0882", "\u0882"], /* ARABIC LETTER ALEF WITH ATTACHED LEFT HAMZA */ + ["\u0883", "\u0883"], /* ARABIC TATWEEL WITH OVERSTRUCK HAMZA */ + ["\u0884", "\u0884"], /* ARABIC TATWEEL WITH OVERSTRUCK WAW */ + ["\u0885", "\u0885"], /* ARABIC TATWEEL WITH TWO DOTS BELOW */ + ["\u0886", "\u0886"], /* ARABIC LETTER THIN YEH */ + ["\u0887", "\u0887"], /* ARABIC BASELINE ROUND DOT */ + ["\u0888", "\u0888"], /* ARABIC RAISED ROUND DOT */ + ["\u0889", "\u0889"], /* ARABIC LETTER NOON WITH INVERTED SMALL V */ + ["\u088A", "\u088A"], /* ARABIC LETTER HAH WITH INVERTED SMALL V BELOW */ + ["\u088B", "\u088B"], /* ARABIC LETTER TAH WITH DOT BELOW */ + ["\u088C", "\u088C"], /* ARABIC LETTER TAH WITH THREE DOTS BELOW */ + ["\u088D", "\u088D"], /* ARABIC LETTER KEHEH WITH TWO DOTS VERTICALLY BELOW */ + ["\u088E", "\u088E"], /* ARABIC VERTICAL TAIL */ + ["\u088F", "\u088F"], + ["\u0890", "\u0890"], /* ARABIC POUND MARK ABOVE */ + ["\u0891", "\u0891"], /* ARABIC PIASTRE MARK ABOVE */ + ["\u0892", "\u0892"], + ["\u0893", "\u0893"], + ["\u0894", "\u0894"], + ["\u0895", "\u0895"], + ["\u0896", "\u0896"], + ["\u0897", "\u0897"], + ["\u0898", "\u0898"], /* ARABIC SMALL HIGH WORD AL-JUZ */ + ["\u0899", "\u0899"], /* ARABIC SMALL LOW WORD ISHMAAM */ + ["\u089A", "\u089A"], /* ARABIC SMALL LOW WORD IMAALA */ + ["\u089B", "\u089B"], /* ARABIC SMALL LOW WORD TASHEEL */ + ["\u089C", "\u089C"], /* ARABIC MADDA WAAJIB */ + ["\u089D", "\u089D"], /* ARABIC SUPERSCRIPT ALEF MOKHASSAS */ + ["\u089E", "\u089E"], /* ARABIC DOUBLED MADDA */ + ["\u089F", "\u089F"], /* ARABIC HALF MADDA OVER MADDA */ + ["\u08A0", "\u08A0"], /* ARABIC LETTER BEH WITH SMALL V BELOW */ + ["\u08A1", "\u08A1"], /* ARABIC LETTER BEH WITH HAMZA ABOVE */ + ["\u08A2", "\u08A2"], /* ARABIC LETTER JEEM WITH TWO DOTS ABOVE */ + ["\u08A3", "\u08A3"], /* ARABIC LETTER TAH WITH TWO DOTS ABOVE */ + ["\u08A4", "\u08A4"], /* ARABIC LETTER FEH WITH DOT BELOW AND THREE DOTS ABOVE */ + ["\u08A5", "\u08A5"], /* ARABIC LETTER QAF WITH DOT BELOW */ + ["\u08A6", "\u08A6"], /* ARABIC LETTER LAM WITH DOUBLE BAR */ + ["\u08A7", "\u08A7"], /* ARABIC LETTER MEEM WITH THREE DOTS ABOVE */ + ["\u08A8", "\u08A8"], /* ARABIC LETTER YEH WITH TWO DOTS BELOW AND HAMZA ABOVE */ + ["\u08A9", "\u08A9"], /* ARABIC LETTER YEH WITH TWO DOTS BELOW AND DOT ABOVE */ + ["\u08AA", "\u08AA"], /* ARABIC LETTER REH WITH LOOP */ + ["\u08AB", "\u08AB"], /* ARABIC LETTER WAW WITH DOT WITHIN */ + ["\u08AC", "\u08AC"], /* ARABIC LETTER ROHINGYA YEH */ + ["\u08AD", "\u08AD"], /* ARABIC LETTER LOW ALEF */ + ["\u08AE", "\u08AE"], /* ARABIC LETTER DAL WITH THREE DOTS BELOW */ + ["\u08AF", "\u08AF"], /* ARABIC LETTER SAD WITH THREE DOTS BELOW */ + ["\u08B0", "\u08B0"], /* ARABIC LETTER GAF WITH INVERTED STROKE */ + ["\u08B1", "\u08B1"], /* ARABIC LETTER STRAIGHT WAW */ + ["\u08B2", "\u08B2"], /* ARABIC LETTER ZAIN WITH INVERTED V ABOVE */ + ["\u08B3", "\u08B3"], /* ARABIC LETTER AIN WITH THREE DOTS BELOW */ + ["\u08B4", "\u08B4"], /* ARABIC LETTER KAF WITH DOT BELOW */ + ["\u08B5", "\u08B5"], /* ARABIC LETTER QAF WITH DOT BELOW AND NO DOTS ABOVE */ + ["\u08B6", "\u08B6"], /* ARABIC LETTER BEH WITH SMALL MEEM ABOVE */ + ["\u08B7", "\u08B7"], /* ARABIC LETTER PEH WITH SMALL MEEM ABOVE */ + ["\u08B8", "\u08B8"], /* ARABIC LETTER TEH WITH SMALL TEH ABOVE */ + ["\u08B9", "\u08B9"], /* ARABIC LETTER REH WITH SMALL NOON ABOVE */ + ["\u08BA", "\u08BA"], /* ARABIC LETTER YEH WITH TWO DOTS BELOW AND SMALL NOON ABOVE */ + ["\u08BB", "\u08BB"], /* ARABIC LETTER AFRICAN FEH */ + ["\u08BC", "\u08BC"], /* ARABIC LETTER AFRICAN QAF */ + ["\u08BD", "\u08BD"], /* ARABIC LETTER AFRICAN NOON */ + ["\u08BE", "\u08BE"], /* ARABIC LETTER PEH WITH SMALL V */ + ["\u08BF", "\u08BF"], /* ARABIC LETTER TEH WITH SMALL V */ + ["\u08C0", "\u08C0"], /* ARABIC LETTER TTEH WITH SMALL V */ + ["\u08C1", "\u08C1"], /* ARABIC LETTER TCHEH WITH SMALL V */ + ["\u08C2", "\u08C2"], /* ARABIC LETTER KEHEH WITH SMALL V */ + ["\u08C3", "\u08C3"], /* ARABIC LETTER GHAIN WITH THREE DOTS ABOVE */ + ["\u08C4", "\u08C4"], /* ARABIC LETTER AFRICAN QAF WITH THREE DOTS ABOVE */ + ["\u08C5", "\u08C5"], /* ARABIC LETTER JEEM WITH THREE DOTS ABOVE */ + ["\u08C6", "\u08C6"], /* ARABIC LETTER JEEM WITH THREE DOTS BELOW */ + ["\u08C7", "\u08C7"], /* ARABIC LETTER LAM WITH SMALL ARABIC LETTER TAH ABOVE */ + ["\u08C8", "\u08C8"], /* ARABIC LETTER GRAF */ + ["\u08C9", "\u08C9"], /* ARABIC SMALL FARSI YEH */ + ["\u08CA", "\u08CA"], /* ARABIC SMALL HIGH FARSI YEH */ + ["\u08CB", "\u08CB"], /* ARABIC SMALL HIGH YEH BARREE WITH TWO DOTS BELOW */ + ["\u08CC", "\u08CC"], /* ARABIC SMALL HIGH WORD SAH */ + ["\u08CD", "\u08CD"], /* ARABIC SMALL HIGH ZAH */ + ["\u08CE", "\u08CE"], /* ARABIC LARGE ROUND DOT ABOVE */ + ["\u08CF", "\u08CF"], /* ARABIC LARGE ROUND DOT BELOW */ + ["\u08D0", "\u08D0"], /* ARABIC SUKUN BELOW */ + ["\u08D1", "\u08D1"], /* ARABIC LARGE CIRCLE BELOW */ + ["\u08D2", "\u08D2"], /* ARABIC LARGE ROUND DOT INSIDE CIRCLE BELOW */ + ["\u08D3", "\u08D3"], /* ARABIC SMALL LOW WAW */ + ["\u08D4", "\u08D4"], /* ARABIC SMALL HIGH WORD AR-RUB */ + ["\u08D5", "\u08D5"], /* ARABIC SMALL HIGH SAD */ + ["\u08D6", "\u08D6"], /* ARABIC SMALL HIGH AIN */ + ["\u08D7", "\u08D7"], /* ARABIC SMALL HIGH QAF */ + ["\u08D8", "\u08D8"], /* ARABIC SMALL HIGH NOON WITH KASRA */ + ["\u08D9", "\u08D9"], /* ARABIC SMALL LOW NOON WITH KASRA */ + ["\u08DA", "\u08DA"], /* ARABIC SMALL HIGH WORD ATH-THALATHA */ + ["\u08DB", "\u08DB"], /* ARABIC SMALL HIGH WORD AS-SAJDA */ + ["\u08DC", "\u08DC"], /* ARABIC SMALL HIGH WORD AN-NISF */ + ["\u08DD", "\u08DD"], /* ARABIC SMALL HIGH WORD SAKTA */ + ["\u08DE", "\u08DE"], /* ARABIC SMALL HIGH WORD QIF */ + ["\u08DF", "\u08DF"], /* ARABIC SMALL HIGH WORD WAQFA */ + ["\u08E0", "\u08E0"], /* ARABIC SMALL HIGH FOOTNOTE MARKER */ + ["\u08E1", "\u08E1"], /* ARABIC SMALL HIGH SIGN SAFHA */ + ["\u08E2", "\u08E2"], /* ARABIC DISPUTED END OF AYAH */ + ["\u08E3", "\u08E3"], /* ARABIC TURNED DAMMA BELOW */ + ["\u08E4", "\u08E4"], /* ARABIC CURLY FATHA */ + ["\u08E5", "\u08E5"], /* ARABIC CURLY DAMMA */ + ["\u08E6", "\u08E6"], /* ARABIC CURLY KASRA */ + ["\u08E7", "\u08E7"], /* ARABIC CURLY FATHATAN */ + ["\u08E8", "\u08E8"], /* ARABIC CURLY DAMMATAN */ + ["\u08E9", "\u08E9"], /* ARABIC CURLY KASRATAN */ + ["\u08EA", "\u08EA"], /* ARABIC TONE ONE DOT ABOVE */ + ["\u08EB", "\u08EB"], /* ARABIC TONE TWO DOTS ABOVE */ + ["\u08EC", "\u08EC"], /* ARABIC TONE LOOP ABOVE */ + ["\u08ED", "\u08ED"], /* ARABIC TONE ONE DOT BELOW */ + ["\u08EE", "\u08EE"], /* ARABIC TONE TWO DOTS BELOW */ + ["\u08EF", "\u08EF"], /* ARABIC TONE LOOP BELOW */ + ["\u08F0", "\u08F0"], /* ARABIC OPEN FATHATAN */ + ["\u08F1", "\u08F1"], /* ARABIC OPEN DAMMATAN */ + ["\u08F2", "\u08F2"], /* ARABIC OPEN KASRATAN */ + ["\u08F3", "\u08F3"], /* ARABIC SMALL HIGH WAW */ + ["\u08F4", "\u08F4"], /* ARABIC FATHA WITH RING */ + ["\u08F5", "\u08F5"], /* ARABIC FATHA WITH DOT ABOVE */ + ["\u08F6", "\u08F6"], /* ARABIC KASRA WITH DOT BELOW */ + ["\u08F7", "\u08F7"], /* ARABIC LEFT ARROWHEAD ABOVE */ + ["\u08F8", "\u08F8"], /* ARABIC RIGHT ARROWHEAD ABOVE */ + ["\u08F9", "\u08F9"], /* ARABIC LEFT ARROWHEAD BELOW */ + ["\u08FA", "\u08FA"], /* ARABIC RIGHT ARROWHEAD BELOW */ + ["\u08FB", "\u08FB"], /* ARABIC DOUBLE RIGHT ARROWHEAD ABOVE */ + ["\u08FC", "\u08FC"], /* ARABIC DOUBLE RIGHT ARROWHEAD ABOVE WITH DOT */ + ["\u08FD", "\u08FD"], /* ARABIC RIGHT ARROWHEAD ABOVE WITH DOT */ + ["\u08FE", "\u08FE"], /* ARABIC DAMMA WITH DOT */ + ["\u08FF", "\u08FF"], /* ARABIC MARK SIDEWAYS NOON GHUNNA */ + ["\u0900", "\u0900"], /* DEVANAGARI SIGN INVERTED CANDRABINDU */ + ["\u0901", "\u0901"], /* DEVANAGARI SIGN CANDRABINDU */ + ["\u0902", "\u0902"], /* DEVANAGARI SIGN ANUSVARA */ + ["\u0903", "\u0903"], /* DEVANAGARI SIGN VISARGA */ + ["\u0904", "\u0904"], /* DEVANAGARI LETTER SHORT A */ + ["\u0905", "\u0905"], /* DEVANAGARI LETTER A */ + ["\u0906", "\u0906"], /* DEVANAGARI LETTER AA */ + ["\u0907", "\u0907"], /* DEVANAGARI LETTER I */ + ["\u0908", "\u0908"], /* DEVANAGARI LETTER II */ + ["\u0909", "\u0909"], /* DEVANAGARI LETTER U */ + ["\u090A", "\u090A"], /* DEVANAGARI LETTER UU */ + ["\u090B", "\u090B"], /* DEVANAGARI LETTER VOCALIC R */ + ["\u090C", "\u090C"], /* DEVANAGARI LETTER VOCALIC L */ + ["\u090D", "\u090D"], /* DEVANAGARI LETTER CANDRA E */ + ["\u090E", "\u090E"], /* DEVANAGARI LETTER SHORT E */ + ["\u090F", "\u090F"], /* DEVANAGARI LETTER E */ + ["\u0910", "\u0910"], /* DEVANAGARI LETTER AI */ + ["\u0911", "\u0911"], /* DEVANAGARI LETTER CANDRA O */ + ["\u0912", "\u0912"], /* DEVANAGARI LETTER SHORT O */ + ["\u0913", "\u0913"], /* DEVANAGARI LETTER O */ + ["\u0914", "\u0914"], /* DEVANAGARI LETTER AU */ + ["\u0915", "\u0915"], /* DEVANAGARI LETTER KA */ + ["\u0916", "\u0916"], /* DEVANAGARI LETTER KHA */ + ["\u0917", "\u0917"], /* DEVANAGARI LETTER GA */ + ["\u0918", "\u0918"], /* DEVANAGARI LETTER GHA */ + ["\u0919", "\u0919"], /* DEVANAGARI LETTER NGA */ + ["\u091A", "\u091A"], /* DEVANAGARI LETTER CA */ + ["\u091B", "\u091B"], /* DEVANAGARI LETTER CHA */ + ["\u091C", "\u091C"], /* DEVANAGARI LETTER JA */ + ["\u091D", "\u091D"], /* DEVANAGARI LETTER JHA */ + ["\u091E", "\u091E"], /* DEVANAGARI LETTER NYA */ + ["\u091F", "\u091F"], /* DEVANAGARI LETTER TTA */ + ["\u0920", "\u0920"], /* DEVANAGARI LETTER TTHA */ + ["\u0921", "\u0921"], /* DEVANAGARI LETTER DDA */ + ["\u0922", "\u0922"], /* DEVANAGARI LETTER DDHA */ + ["\u0923", "\u0923"], /* DEVANAGARI LETTER NNA */ + ["\u0924", "\u0924"], /* DEVANAGARI LETTER TA */ + ["\u0925", "\u0925"], /* DEVANAGARI LETTER THA */ + ["\u0926", "\u0926"], /* DEVANAGARI LETTER DA */ + ["\u0927", "\u0927"], /* DEVANAGARI LETTER DHA */ + ["\u0928", "\u0928"], /* DEVANAGARI LETTER NA */ + ["\u0929", "\u0929"], /* DEVANAGARI LETTER NNNA */ + ["\u092A", "\u092A"], /* DEVANAGARI LETTER PA */ + ["\u092B", "\u092B"], /* DEVANAGARI LETTER PHA */ + ["\u092C", "\u092C"], /* DEVANAGARI LETTER BA */ + ["\u092D", "\u092D"], /* DEVANAGARI LETTER BHA */ + ["\u092E", "\u092E"], /* DEVANAGARI LETTER MA */ + ["\u092F", "\u092F"], /* DEVANAGARI LETTER YA */ + ["\u0930", "\u0930"], /* DEVANAGARI LETTER RA */ + ["\u0931", "\u0931"], /* DEVANAGARI LETTER RRA */ + ["\u0932", "\u0932"], /* DEVANAGARI LETTER LA */ + ["\u0933", "\u0933"], /* DEVANAGARI LETTER LLA */ + ["\u0934", "\u0934"], /* DEVANAGARI LETTER LLLA */ + ["\u0935", "\u0935"], /* DEVANAGARI LETTER VA */ + ["\u0936", "\u0936"], /* DEVANAGARI LETTER SHA */ + ["\u0937", "\u0937"], /* DEVANAGARI LETTER SSA */ + ["\u0938", "\u0938"], /* DEVANAGARI LETTER SA */ + ["\u0939", "\u0939"], /* DEVANAGARI LETTER HA */ + ["\u093A", "\u093A"], /* DEVANAGARI VOWEL SIGN OE */ + ["\u093B", "\u093B"], /* DEVANAGARI VOWEL SIGN OOE */ + ["\u093C", "\u093C"], /* DEVANAGARI SIGN NUKTA */ + ["\u093D", "\u093D"], /* DEVANAGARI SIGN AVAGRAHA */ + ["\u093E", "\u093E"], /* DEVANAGARI VOWEL SIGN AA */ + ["\u093F", "\u093F"], /* DEVANAGARI VOWEL SIGN I */ + ["\u0940", "\u0940"], /* DEVANAGARI VOWEL SIGN II */ + ["\u0941", "\u0941"], /* DEVANAGARI VOWEL SIGN U */ + ["\u0942", "\u0942"], /* DEVANAGARI VOWEL SIGN UU */ + ["\u0943", "\u0943"], /* DEVANAGARI VOWEL SIGN VOCALIC R */ + ["\u0944", "\u0944"], /* DEVANAGARI VOWEL SIGN VOCALIC RR */ + ["\u0945", "\u0945"], /* DEVANAGARI VOWEL SIGN CANDRA E */ + ["\u0946", "\u0946"], /* DEVANAGARI VOWEL SIGN SHORT E */ + ["\u0947", "\u0947"], /* DEVANAGARI VOWEL SIGN E */ + ["\u0948", "\u0948"], /* DEVANAGARI VOWEL SIGN AI */ + ["\u0949", "\u0949"], /* DEVANAGARI VOWEL SIGN CANDRA O */ + ["\u094A", "\u094A"], /* DEVANAGARI VOWEL SIGN SHORT O */ + ["\u094B", "\u094B"], /* DEVANAGARI VOWEL SIGN O */ + ["\u094C", "\u094C"], /* DEVANAGARI VOWEL SIGN AU */ + ["\u094D", "\u094D"], /* DEVANAGARI SIGN VIRAMA */ + ["\u094E", "\u094E"], /* DEVANAGARI VOWEL SIGN PRISHTHAMATRA E */ + ["\u094F", "\u094F"], /* DEVANAGARI VOWEL SIGN AW */ + ["\u0950", "\u0950"], /* DEVANAGARI OM */ + ["\u0951", "\u0951"], /* DEVANAGARI STRESS SIGN UDATTA */ + ["\u0952", "\u0952"], /* DEVANAGARI STRESS SIGN ANUDATTA */ + ["\u0953", "\u0953"], /* DEVANAGARI GRAVE ACCENT */ + ["\u0954", "\u0954"], /* DEVANAGARI ACUTE ACCENT */ + ["\u0955", "\u0955"], /* DEVANAGARI VOWEL SIGN CANDRA LONG E */ + ["\u0956", "\u0956"], /* DEVANAGARI VOWEL SIGN UE */ + ["\u0957", "\u0957"], /* DEVANAGARI VOWEL SIGN UUE */ + ["\u0958", "\u0958"], /* DEVANAGARI LETTER QA */ + ["\u0959", "\u0959"], /* DEVANAGARI LETTER KHHA */ + ["\u095A", "\u095A"], /* DEVANAGARI LETTER GHHA */ + ["\u095B", "\u095B"], /* DEVANAGARI LETTER ZA */ + ["\u095C", "\u095C"], /* DEVANAGARI LETTER DDDHA */ + ["\u095D", "\u095D"], /* DEVANAGARI LETTER RHA */ + ["\u095E", "\u095E"], /* DEVANAGARI LETTER FA */ + ["\u095F", "\u095F"], /* DEVANAGARI LETTER YYA */ + ["\u0960", "\u0960"], /* DEVANAGARI LETTER VOCALIC RR */ + ["\u0961", "\u0961"], /* DEVANAGARI LETTER VOCALIC LL */ + ["\u0962", "\u0962"], /* DEVANAGARI VOWEL SIGN VOCALIC L */ + ["\u0963", "\u0963"], /* DEVANAGARI VOWEL SIGN VOCALIC LL */ + ["\u0964", "\u0964"], /* DEVANAGARI DANDA */ + ["\u0965", "\u0965"], /* DEVANAGARI DOUBLE DANDA */ + ["\u0966", "\u0966"], /* DEVANAGARI DIGIT ZERO */ + ["\u0967", "\u0967"], /* DEVANAGARI DIGIT ONE */ + ["\u0968", "\u0968"], /* DEVANAGARI DIGIT TWO */ + ["\u0969", "\u0969"], /* DEVANAGARI DIGIT THREE */ + ["\u096A", "\u096A"], /* DEVANAGARI DIGIT FOUR */ + ["\u096B", "\u096B"], /* DEVANAGARI DIGIT FIVE */ + ["\u096C", "\u096C"], /* DEVANAGARI DIGIT SIX */ + ["\u096D", "\u096D"], /* DEVANAGARI DIGIT SEVEN */ + ["\u096E", "\u096E"], /* DEVANAGARI DIGIT EIGHT */ + ["\u096F", "\u096F"], /* DEVANAGARI DIGIT NINE */ + ["\u0970", "\u0970"], /* DEVANAGARI ABBREVIATION SIGN */ + ["\u0971", "\u0971"], /* DEVANAGARI SIGN HIGH SPACING DOT */ + ["\u0972", "\u0972"], /* DEVANAGARI LETTER CANDRA A */ + ["\u0973", "\u0973"], /* DEVANAGARI LETTER OE */ + ["\u0974", "\u0974"], /* DEVANAGARI LETTER OOE */ + ["\u0975", "\u0975"], /* DEVANAGARI LETTER AW */ + ["\u0976", "\u0976"], /* DEVANAGARI LETTER UE */ + ["\u0977", "\u0977"], /* DEVANAGARI LETTER UUE */ + ["\u0978", "\u0978"], /* DEVANAGARI LETTER MARWARI DDA */ + ["\u0979", "\u0979"], /* DEVANAGARI LETTER ZHA */ + ["\u097A", "\u097A"], /* DEVANAGARI LETTER HEAVY YA */ + ["\u097B", "\u097B"], /* DEVANAGARI LETTER GGA */ + ["\u097C", "\u097C"], /* DEVANAGARI LETTER JJA */ + ["\u097D", "\u097D"], /* DEVANAGARI LETTER GLOTTAL STOP */ + ["\u097E", "\u097E"], /* DEVANAGARI LETTER DDDA */ + ["\u097F", "\u097F"], /* DEVANAGARI LETTER BBA */ + ["\u0980", "\u0980"], /* BENGALI ANJI */ + ["\u0981", "\u0981"], /* BENGALI SIGN CANDRABINDU */ + ["\u0982", "\u0982"], /* BENGALI SIGN ANUSVARA */ + ["\u0983", "\u0983"], /* BENGALI SIGN VISARGA */ + ["\u0984", "\u0984"], + ["\u0985", "\u0985"], /* BENGALI LETTER A */ + ["\u0986", "\u0986"], /* BENGALI LETTER AA */ + ["\u0987", "\u0987"], /* BENGALI LETTER I */ + ["\u0988", "\u0988"], /* BENGALI LETTER II */ + ["\u0989", "\u0989"], /* BENGALI LETTER U */ + ["\u098A", "\u098A"], /* BENGALI LETTER UU */ + ["\u098B", "\u098B"], /* BENGALI LETTER VOCALIC R */ + ["\u098C", "\u098C"], /* BENGALI LETTER VOCALIC L */ + ["\u098D", "\u098D"], + ["\u098E", "\u098E"], + ["\u098F", "\u098F"], /* BENGALI LETTER E */ + ["\u0990", "\u0990"], /* BENGALI LETTER AI */ + ["\u0991", "\u0991"], + ["\u0992", "\u0992"], + ["\u0993", "\u0993"], /* BENGALI LETTER O */ + ["\u0994", "\u0994"], /* BENGALI LETTER AU */ + ["\u0995", "\u0995"], /* BENGALI LETTER KA */ + ["\u0996", "\u0996"], /* BENGALI LETTER KHA */ + ["\u0997", "\u0997"], /* BENGALI LETTER GA */ + ["\u0998", "\u0998"], /* BENGALI LETTER GHA */ + ["\u0999", "\u0999"], /* BENGALI LETTER NGA */ + ["\u099A", "\u099A"], /* BENGALI LETTER CA */ + ["\u099B", "\u099B"], /* BENGALI LETTER CHA */ + ["\u099C", "\u099C"], /* BENGALI LETTER JA */ + ["\u099D", "\u099D"], /* BENGALI LETTER JHA */ + ["\u099E", "\u099E"], /* BENGALI LETTER NYA */ + ["\u099F", "\u099F"], /* BENGALI LETTER TTA */ + ["\u09A0", "\u09A0"], /* BENGALI LETTER TTHA */ + ["\u09A1", "\u09A1"], /* BENGALI LETTER DDA */ + ["\u09A2", "\u09A2"], /* BENGALI LETTER DDHA */ + ["\u09A3", "\u09A3"], /* BENGALI LETTER NNA */ + ["\u09A4", "\u09A4"], /* BENGALI LETTER TA */ + ["\u09A5", "\u09A5"], /* BENGALI LETTER THA */ + ["\u09A6", "\u09A6"], /* BENGALI LETTER DA */ + ["\u09A7", "\u09A7"], /* BENGALI LETTER DHA */ + ["\u09A8", "\u09A8"], /* BENGALI LETTER NA */ + ["\u09A9", "\u09A9"], + ["\u09AA", "\u09AA"], /* BENGALI LETTER PA */ + ["\u09AB", "\u09AB"], /* BENGALI LETTER PHA */ + ["\u09AC", "\u09AC"], /* BENGALI LETTER BA */ + ["\u09AD", "\u09AD"], /* BENGALI LETTER BHA */ + ["\u09AE", "\u09AE"], /* BENGALI LETTER MA */ + ["\u09AF", "\u09AF"], /* BENGALI LETTER YA */ + ["\u09B0", "\u09B0"], /* BENGALI LETTER RA */ + ["\u09B1", "\u09B1"], + ["\u09B2", "\u09B2"], /* BENGALI LETTER LA */ + ["\u09B3", "\u09B3"], + ["\u09B4", "\u09B4"], + ["\u09B5", "\u09B5"], + ["\u09B6", "\u09B6"], /* BENGALI LETTER SHA */ + ["\u09B7", "\u09B7"], /* BENGALI LETTER SSA */ + ["\u09B8", "\u09B8"], /* BENGALI LETTER SA */ + ["\u09B9", "\u09B9"], /* BENGALI LETTER HA */ + ["\u09BA", "\u09BA"], + ["\u09BB", "\u09BB"], + ["\u09BC", "\u09BC"], /* BENGALI SIGN NUKTA */ + ["\u09BD", "\u09BD"], /* BENGALI SIGN AVAGRAHA */ + ["\u09BE", "\u09BE"], /* BENGALI VOWEL SIGN AA */ + ["\u09BF", "\u09BF"], /* BENGALI VOWEL SIGN I */ + ["\u09C0", "\u09C0"], /* BENGALI VOWEL SIGN II */ + ["\u09C1", "\u09C1"], /* BENGALI VOWEL SIGN U */ + ["\u09C2", "\u09C2"], /* BENGALI VOWEL SIGN UU */ + ["\u09C3", "\u09C3"], /* BENGALI VOWEL SIGN VOCALIC R */ + ["\u09C4", "\u09C4"], /* BENGALI VOWEL SIGN VOCALIC RR */ + ["\u09C5", "\u09C5"], + ["\u09C6", "\u09C6"], + ["\u09C7", "\u09C7"], /* BENGALI VOWEL SIGN E */ + ["\u09C8", "\u09C8"], /* BENGALI VOWEL SIGN AI */ + ["\u09C9", "\u09C9"], + ["\u09CA", "\u09CA"], + ["\u09CB", "\u09CB"], /* BENGALI VOWEL SIGN O */ + ["\u09CC", "\u09CC"], /* BENGALI VOWEL SIGN AU */ + ["\u09CD", "\u09CD"], /* BENGALI SIGN VIRAMA */ + ["\u09CE", "\u09CE"], /* BENGALI LETTER KHANDA TA */ + ["\u09CF", "\u09CF"], + ["\u09D0", "\u09D0"], + ["\u09D1", "\u09D1"], + ["\u09D2", "\u09D2"], + ["\u09D3", "\u09D3"], + ["\u09D4", "\u09D4"], + ["\u09D5", "\u09D5"], + ["\u09D6", "\u09D6"], + ["\u09D7", "\u09D7"], /* BENGALI AU LENGTH MARK */ + ["\u09D8", "\u09D8"], + ["\u09D9", "\u09D9"], + ["\u09DA", "\u09DA"], + ["\u09DB", "\u09DB"], + ["\u09DC", "\u09DC"], /* BENGALI LETTER RRA */ + ["\u09DD", "\u09DD"], /* BENGALI LETTER RHA */ + ["\u09DE", "\u09DE"], + ["\u09DF", "\u09DF"], /* BENGALI LETTER YYA */ + ["\u09E0", "\u09E0"], /* BENGALI LETTER VOCALIC RR */ + ["\u09E1", "\u09E1"], /* BENGALI LETTER VOCALIC LL */ + ["\u09E2", "\u09E2"], /* BENGALI VOWEL SIGN VOCALIC L */ + ["\u09E3", "\u09E3"], /* BENGALI VOWEL SIGN VOCALIC LL */ + ["\u09E4", "\u09E4"], + ["\u09E5", "\u09E5"], + ["\u09E6", "\u09E6"], /* BENGALI DIGIT ZERO */ + ["\u09E7", "\u09E7"], /* BENGALI DIGIT ONE */ + ["\u09E8", "\u09E8"], /* BENGALI DIGIT TWO */ + ["\u09E9", "\u09E9"], /* BENGALI DIGIT THREE */ + ["\u09EA", "\u09EA"], /* BENGALI DIGIT FOUR */ + ["\u09EB", "\u09EB"], /* BENGALI DIGIT FIVE */ + ["\u09EC", "\u09EC"], /* BENGALI DIGIT SIX */ + ["\u09ED", "\u09ED"], /* BENGALI DIGIT SEVEN */ + ["\u09EE", "\u09EE"], /* BENGALI DIGIT EIGHT */ + ["\u09EF", "\u09EF"], /* BENGALI DIGIT NINE */ + ["\u09F0", "\u09F0"], /* BENGALI LETTER RA WITH MIDDLE DIAGONAL */ + ["\u09F1", "\u09F1"], /* BENGALI LETTER RA WITH LOWER DIAGONAL (BENGALI LETTER VA WITH LOWER DIAGONAL) */ + ["\u09F2", "\u09F2"], /* BENGALI RUPEE MARK */ + ["\u09F3", "\u09F3"], /* BENGALI RUPEE SIGN */ + ["\u09F4", "\u09F4"], /* BENGALI CURRENCY NUMERATOR ONE */ + ["\u09F5", "\u09F5"], /* BENGALI CURRENCY NUMERATOR TWO */ + ["\u09F6", "\u09F6"], /* BENGALI CURRENCY NUMERATOR THREE */ + ["\u09F7", "\u09F7"], /* BENGALI CURRENCY NUMERATOR FOUR */ + ["\u09F8", "\u09F8"], /* BENGALI CURRENCY NUMERATOR ONE LESS THAN THE DENOMINATOR */ + ["\u09F9", "\u09F9"], /* BENGALI CURRENCY DENOMINATOR SIXTEEN */ + ["\u09FA", "\u09FA"], /* BENGALI ISSHAR */ + ["\u09FB", "\u09FB"], /* BENGALI GANDA MARK */ + ["\u09FC", "\u09FC"], /* BENGALI LETTER VEDIC ANUSVARA */ + ["\u09FD", "\u09FD"], /* BENGALI ABBREVIATION SIGN */ + ["\u09FE", "\u09FE"], /* BENGALI SANDHI MARK */ + ["\u09FF", "\u09FF"], + ["\u0A00", "\u0A00"], + ["\u0A01", "\u0A01"], /* GURMUKHI SIGN ADAK BINDI */ + ["\u0A02", "\u0A02"], /* GURMUKHI SIGN BINDI */ + ["\u0A03", "\u0A03"], /* GURMUKHI SIGN VISARGA */ + ["\u0A04", "\u0A04"], + ["\u0A05", "\u0A05"], /* GURMUKHI LETTER A */ + ["\u0A06", "\u0A06"], /* GURMUKHI LETTER AA */ + ["\u0A07", "\u0A07"], /* GURMUKHI LETTER I */ + ["\u0A08", "\u0A08"], /* GURMUKHI LETTER II */ + ["\u0A09", "\u0A09"], /* GURMUKHI LETTER U */ + ["\u0A0A", "\u0A0A"], /* GURMUKHI LETTER UU */ + ["\u0A0B", "\u0A0B"], + ["\u0A0C", "\u0A0C"], + ["\u0A0D", "\u0A0D"], + ["\u0A0E", "\u0A0E"], + ["\u0A0F", "\u0A0F"], /* GURMUKHI LETTER EE */ + ["\u0A10", "\u0A10"], /* GURMUKHI LETTER AI */ + ["\u0A11", "\u0A11"], + ["\u0A12", "\u0A12"], + ["\u0A13", "\u0A13"], /* GURMUKHI LETTER OO */ + ["\u0A14", "\u0A14"], /* GURMUKHI LETTER AU */ + ["\u0A15", "\u0A15"], /* GURMUKHI LETTER KA */ + ["\u0A16", "\u0A16"], /* GURMUKHI LETTER KHA */ + ["\u0A17", "\u0A17"], /* GURMUKHI LETTER GA */ + ["\u0A18", "\u0A18"], /* GURMUKHI LETTER GHA */ + ["\u0A19", "\u0A19"], /* GURMUKHI LETTER NGA */ + ["\u0A1A", "\u0A1A"], /* GURMUKHI LETTER CA */ + ["\u0A1B", "\u0A1B"], /* GURMUKHI LETTER CHA */ + ["\u0A1C", "\u0A1C"], /* GURMUKHI LETTER JA */ + ["\u0A1D", "\u0A1D"], /* GURMUKHI LETTER JHA */ + ["\u0A1E", "\u0A1E"], /* GURMUKHI LETTER NYA */ + ["\u0A1F", "\u0A1F"], /* GURMUKHI LETTER TTA */ + ["\u0A20", "\u0A20"], /* GURMUKHI LETTER TTHA */ + ["\u0A21", "\u0A21"], /* GURMUKHI LETTER DDA */ + ["\u0A22", "\u0A22"], /* GURMUKHI LETTER DDHA */ + ["\u0A23", "\u0A23"], /* GURMUKHI LETTER NNA */ + ["\u0A24", "\u0A24"], /* GURMUKHI LETTER TA */ + ["\u0A25", "\u0A25"], /* GURMUKHI LETTER THA */ + ["\u0A26", "\u0A26"], /* GURMUKHI LETTER DA */ + ["\u0A27", "\u0A27"], /* GURMUKHI LETTER DHA */ + ["\u0A28", "\u0A28"], /* GURMUKHI LETTER NA */ + ["\u0A29", "\u0A29"], + ["\u0A2A", "\u0A2A"], /* GURMUKHI LETTER PA */ + ["\u0A2B", "\u0A2B"], /* GURMUKHI LETTER PHA */ + ["\u0A2C", "\u0A2C"], /* GURMUKHI LETTER BA */ + ["\u0A2D", "\u0A2D"], /* GURMUKHI LETTER BHA */ + ["\u0A2E", "\u0A2E"], /* GURMUKHI LETTER MA */ + ["\u0A2F", "\u0A2F"], /* GURMUKHI LETTER YA */ + ["\u0A30", "\u0A30"], /* GURMUKHI LETTER RA */ + ["\u0A31", "\u0A31"], + ["\u0A32", "\u0A32"], /* GURMUKHI LETTER LA */ + ["\u0A33", "\u0A33"], /* GURMUKHI LETTER LLA */ + ["\u0A34", "\u0A34"], + ["\u0A35", "\u0A35"], /* GURMUKHI LETTER VA */ + ["\u0A36", "\u0A36"], /* GURMUKHI LETTER SHA */ + ["\u0A37", "\u0A37"], + ["\u0A38", "\u0A38"], /* GURMUKHI LETTER SA */ + ["\u0A39", "\u0A39"], /* GURMUKHI LETTER HA */ + ["\u0A3A", "\u0A3A"], + ["\u0A3B", "\u0A3B"], + ["\u0A3C", "\u0A3C"], /* GURMUKHI SIGN NUKTA */ + ["\u0A3D", "\u0A3D"], + ["\u0A3E", "\u0A3E"], /* GURMUKHI VOWEL SIGN AA */ + ["\u0A3F", "\u0A3F"], /* GURMUKHI VOWEL SIGN I */ + ["\u0A40", "\u0A40"], /* GURMUKHI VOWEL SIGN II */ + ["\u0A41", "\u0A41"], /* GURMUKHI VOWEL SIGN U */ + ["\u0A42", "\u0A42"], /* GURMUKHI VOWEL SIGN UU */ + ["\u0A43", "\u0A43"], + ["\u0A44", "\u0A44"], + ["\u0A45", "\u0A45"], + ["\u0A46", "\u0A46"], + ["\u0A47", "\u0A47"], /* GURMUKHI VOWEL SIGN EE */ + ["\u0A48", "\u0A48"], /* GURMUKHI VOWEL SIGN AI */ + ["\u0A49", "\u0A49"], + ["\u0A4A", "\u0A4A"], + ["\u0A4B", "\u0A4B"], /* GURMUKHI VOWEL SIGN OO */ + ["\u0A4C", "\u0A4C"], /* GURMUKHI VOWEL SIGN AU */ + ["\u0A4D", "\u0A4D"], /* GURMUKHI SIGN VIRAMA */ + ["\u0A4E", "\u0A4E"], + ["\u0A4F", "\u0A4F"], + ["\u0A50", "\u0A50"], + ["\u0A51", "\u0A51"], /* GURMUKHI SIGN UDAAT */ + ["\u0A52", "\u0A52"], + ["\u0A53", "\u0A53"], + ["\u0A54", "\u0A54"], + ["\u0A55", "\u0A55"], + ["\u0A56", "\u0A56"], + ["\u0A57", "\u0A57"], + ["\u0A58", "\u0A58"], + ["\u0A59", "\u0A59"], /* GURMUKHI LETTER KHHA */ + ["\u0A5A", "\u0A5A"], /* GURMUKHI LETTER GHHA */ + ["\u0A5B", "\u0A5B"], /* GURMUKHI LETTER ZA */ + ["\u0A5C", "\u0A5C"], /* GURMUKHI LETTER RRA */ + ["\u0A5D", "\u0A5D"], + ["\u0A5E", "\u0A5E"], /* GURMUKHI LETTER FA */ + ["\u0A5F", "\u0A5F"], + ["\u0A60", "\u0A60"], + ["\u0A61", "\u0A61"], + ["\u0A62", "\u0A62"], + ["\u0A63", "\u0A63"], + ["\u0A64", "\u0A64"], + ["\u0A65", "\u0A65"], + ["\u0A66", "\u0A66"], /* GURMUKHI DIGIT ZERO */ + ["\u0A67", "\u0A67"], /* GURMUKHI DIGIT ONE */ + ["\u0A68", "\u0A68"], /* GURMUKHI DIGIT TWO */ + ["\u0A69", "\u0A69"], /* GURMUKHI DIGIT THREE */ + ["\u0A6A", "\u0A6A"], /* GURMUKHI DIGIT FOUR */ + ["\u0A6B", "\u0A6B"], /* GURMUKHI DIGIT FIVE */ + ["\u0A6C", "\u0A6C"], /* GURMUKHI DIGIT SIX */ + ["\u0A6D", "\u0A6D"], /* GURMUKHI DIGIT SEVEN */ + ["\u0A6E", "\u0A6E"], /* GURMUKHI DIGIT EIGHT */ + ["\u0A6F", "\u0A6F"], /* GURMUKHI DIGIT NINE */ + ["\u0A70", "\u0A70"], /* GURMUKHI TIPPI */ + ["\u0A71", "\u0A71"], /* GURMUKHI ADDAK */ + ["\u0A72", "\u0A72"], /* GURMUKHI IRI */ + ["\u0A73", "\u0A73"], /* GURMUKHI URA */ + ["\u0A74", "\u0A74"], /* GURMUKHI EK ONKAR */ + ["\u0A75", "\u0A75"], /* GURMUKHI SIGN YAKASH */ + ["\u0A76", "\u0A76"], /* GURMUKHI ABBREVIATION SIGN */ + ["\u0A77", "\u0A77"], + ["\u0A78", "\u0A78"], + ["\u0A79", "\u0A79"], + ["\u0A7A", "\u0A7A"], + ["\u0A7B", "\u0A7B"], + ["\u0A7C", "\u0A7C"], + ["\u0A7D", "\u0A7D"], + ["\u0A7E", "\u0A7E"], + ["\u0A7F", "\u0A7F"], + ["\u0A80", "\u0A80"], + ["\u0A81", "\u0A81"], /* GUJARATI SIGN CANDRABINDU */ + ["\u0A82", "\u0A82"], /* GUJARATI SIGN ANUSVARA */ + ["\u0A83", "\u0A83"], /* GUJARATI SIGN VISARGA */ + ["\u0A84", "\u0A84"], + ["\u0A85", "\u0A85"], /* GUJARATI LETTER A */ + ["\u0A86", "\u0A86"], /* GUJARATI LETTER AA */ + ["\u0A87", "\u0A87"], /* GUJARATI LETTER I */ + ["\u0A88", "\u0A88"], /* GUJARATI LETTER II */ + ["\u0A89", "\u0A89"], /* GUJARATI LETTER U */ + ["\u0A8A", "\u0A8A"], /* GUJARATI LETTER UU */ + ["\u0A8B", "\u0A8B"], /* GUJARATI LETTER VOCALIC R */ + ["\u0A8C", "\u0A8C"], /* GUJARATI LETTER VOCALIC L */ + ["\u0A8D", "\u0A8D"], /* GUJARATI VOWEL CANDRA E */ + ["\u0A8E", "\u0A8E"], + ["\u0A8F", "\u0A8F"], /* GUJARATI LETTER E */ + ["\u0A90", "\u0A90"], /* GUJARATI LETTER AI */ + ["\u0A91", "\u0A91"], /* GUJARATI VOWEL CANDRA O */ + ["\u0A92", "\u0A92"], + ["\u0A93", "\u0A93"], /* GUJARATI LETTER O */ + ["\u0A94", "\u0A94"], /* GUJARATI LETTER AU */ + ["\u0A95", "\u0A95"], /* GUJARATI LETTER KA */ + ["\u0A96", "\u0A96"], /* GUJARATI LETTER KHA */ + ["\u0A97", "\u0A97"], /* GUJARATI LETTER GA */ + ["\u0A98", "\u0A98"], /* GUJARATI LETTER GHA */ + ["\u0A99", "\u0A99"], /* GUJARATI LETTER NGA */ + ["\u0A9A", "\u0A9A"], /* GUJARATI LETTER CA */ + ["\u0A9B", "\u0A9B"], /* GUJARATI LETTER CHA */ + ["\u0A9C", "\u0A9C"], /* GUJARATI LETTER JA */ + ["\u0A9D", "\u0A9D"], /* GUJARATI LETTER JHA */ + ["\u0A9E", "\u0A9E"], /* GUJARATI LETTER NYA */ + ["\u0A9F", "\u0A9F"], /* GUJARATI LETTER TTA */ + ["\u0AA0", "\u0AA0"], /* GUJARATI LETTER TTHA */ + ["\u0AA1", "\u0AA1"], /* GUJARATI LETTER DDA */ + ["\u0AA2", "\u0AA2"], /* GUJARATI LETTER DDHA */ + ["\u0AA3", "\u0AA3"], /* GUJARATI LETTER NNA */ + ["\u0AA4", "\u0AA4"], /* GUJARATI LETTER TA */ + ["\u0AA5", "\u0AA5"], /* GUJARATI LETTER THA */ + ["\u0AA6", "\u0AA6"], /* GUJARATI LETTER DA */ + ["\u0AA7", "\u0AA7"], /* GUJARATI LETTER DHA */ + ["\u0AA8", "\u0AA8"], /* GUJARATI LETTER NA */ + ["\u0AA9", "\u0AA9"], + ["\u0AAA", "\u0AAA"], /* GUJARATI LETTER PA */ + ["\u0AAB", "\u0AAB"], /* GUJARATI LETTER PHA */ + ["\u0AAC", "\u0AAC"], /* GUJARATI LETTER BA */ + ["\u0AAD", "\u0AAD"], /* GUJARATI LETTER BHA */ + ["\u0AAE", "\u0AAE"], /* GUJARATI LETTER MA */ + ["\u0AAF", "\u0AAF"], /* GUJARATI LETTER YA */ + ["\u0AB0", "\u0AB0"], /* GUJARATI LETTER RA */ + ["\u0AB1", "\u0AB1"], + ["\u0AB2", "\u0AB2"], /* GUJARATI LETTER LA */ + ["\u0AB3", "\u0AB3"], /* GUJARATI LETTER LLA */ + ["\u0AB4", "\u0AB4"], + ["\u0AB5", "\u0AB5"], /* GUJARATI LETTER VA */ + ["\u0AB6", "\u0AB6"], /* GUJARATI LETTER SHA */ + ["\u0AB7", "\u0AB7"], /* GUJARATI LETTER SSA */ + ["\u0AB8", "\u0AB8"], /* GUJARATI LETTER SA */ + ["\u0AB9", "\u0AB9"], /* GUJARATI LETTER HA */ + ["\u0ABA", "\u0ABA"], + ["\u0ABB", "\u0ABB"], + ["\u0ABC", "\u0ABC"], /* GUJARATI SIGN NUKTA */ + ["\u0ABD", "\u0ABD"], /* GUJARATI SIGN AVAGRAHA */ + ["\u0ABE", "\u0ABE"], /* GUJARATI VOWEL SIGN AA */ + ["\u0ABF", "\u0ABF"], /* GUJARATI VOWEL SIGN I */ + ["\u0AC0", "\u0AC0"], /* GUJARATI VOWEL SIGN II */ + ["\u0AC1", "\u0AC1"], /* GUJARATI VOWEL SIGN U */ + ["\u0AC2", "\u0AC2"], /* GUJARATI VOWEL SIGN UU */ + ["\u0AC3", "\u0AC3"], /* GUJARATI VOWEL SIGN VOCALIC R */ + ["\u0AC4", "\u0AC4"], /* GUJARATI VOWEL SIGN VOCALIC RR */ + ["\u0AC5", "\u0AC5"], /* GUJARATI VOWEL SIGN CANDRA E */ + ["\u0AC6", "\u0AC6"], + ["\u0AC7", "\u0AC7"], /* GUJARATI VOWEL SIGN E */ + ["\u0AC8", "\u0AC8"], /* GUJARATI VOWEL SIGN AI */ + ["\u0AC9", "\u0AC9"], /* GUJARATI VOWEL SIGN CANDRA O */ + ["\u0ACA", "\u0ACA"], + ["\u0ACB", "\u0ACB"], /* GUJARATI VOWEL SIGN O */ + ["\u0ACC", "\u0ACC"], /* GUJARATI VOWEL SIGN AU */ + ["\u0ACD", "\u0ACD"], /* GUJARATI SIGN VIRAMA */ + ["\u0ACE", "\u0ACE"], + ["\u0ACF", "\u0ACF"], + ["\u0AD0", "\u0AD0"], /* GUJARATI OM */ + ["\u0AD1", "\u0AD1"], + ["\u0AD2", "\u0AD2"], + ["\u0AD3", "\u0AD3"], + ["\u0AD4", "\u0AD4"], + ["\u0AD5", "\u0AD5"], + ["\u0AD6", "\u0AD6"], + ["\u0AD7", "\u0AD7"], + ["\u0AD8", "\u0AD8"], + ["\u0AD9", "\u0AD9"], + ["\u0ADA", "\u0ADA"], + ["\u0ADB", "\u0ADB"], + ["\u0ADC", "\u0ADC"], + ["\u0ADD", "\u0ADD"], + ["\u0ADE", "\u0ADE"], + ["\u0ADF", "\u0ADF"], + ["\u0AE0", "\u0AE0"], /* GUJARATI LETTER VOCALIC RR */ + ["\u0AE1", "\u0AE1"], /* GUJARATI LETTER VOCALIC LL */ + ["\u0AE2", "\u0AE2"], /* GUJARATI VOWEL SIGN VOCALIC L */ + ["\u0AE3", "\u0AE3"], /* GUJARATI VOWEL SIGN VOCALIC LL */ + ["\u0AE4", "\u0AE4"], + ["\u0AE5", "\u0AE5"], + ["\u0AE6", "\u0AE6"], /* GUJARATI DIGIT ZERO */ + ["\u0AE7", "\u0AE7"], /* GUJARATI DIGIT ONE */ + ["\u0AE8", "\u0AE8"], /* GUJARATI DIGIT TWO */ + ["\u0AE9", "\u0AE9"], /* GUJARATI DIGIT THREE */ + ["\u0AEA", "\u0AEA"], /* GUJARATI DIGIT FOUR */ + ["\u0AEB", "\u0AEB"], /* GUJARATI DIGIT FIVE */ + ["\u0AEC", "\u0AEC"], /* GUJARATI DIGIT SIX */ + ["\u0AED", "\u0AED"], /* GUJARATI DIGIT SEVEN */ + ["\u0AEE", "\u0AEE"], /* GUJARATI DIGIT EIGHT */ + ["\u0AEF", "\u0AEF"], /* GUJARATI DIGIT NINE */ + ["\u0AF0", "\u0AF0"], /* GUJARATI ABBREVIATION SIGN */ + ["\u0AF1", "\u0AF1"], /* GUJARATI RUPEE SIGN */ + ["\u0AF2", "\u0AF2"], + ["\u0AF3", "\u0AF3"], + ["\u0AF4", "\u0AF4"], + ["\u0AF5", "\u0AF5"], + ["\u0AF6", "\u0AF6"], + ["\u0AF7", "\u0AF7"], + ["\u0AF8", "\u0AF8"], + ["\u0AF9", "\u0AF9"], /* GUJARATI LETTER ZHA */ + ["\u0AFA", "\u0AFA"], /* GUJARATI SIGN SUKUN */ + ["\u0AFB", "\u0AFB"], /* GUJARATI SIGN SHADDA */ + ["\u0AFC", "\u0AFC"], /* GUJARATI SIGN MADDAH */ + ["\u0AFD", "\u0AFD"], /* GUJARATI SIGN THREE-DOT NUKTA ABOVE */ + ["\u0AFE", "\u0AFE"], /* GUJARATI SIGN CIRCLE NUKTA ABOVE */ + ["\u0AFF", "\u0AFF"], /* GUJARATI SIGN TWO-CIRCLE NUKTA ABOVE */ + ["\u0B00", "\u0B00"], + ["\u0B01", "\u0B01"], /* ORIYA SIGN CANDRABINDU */ + ["\u0B02", "\u0B02"], /* ORIYA SIGN ANUSVARA */ + ["\u0B03", "\u0B03"], /* ORIYA SIGN VISARGA */ + ["\u0B04", "\u0B04"], + ["\u0B05", "\u0B05"], /* ORIYA LETTER A */ + ["\u0B06", "\u0B06"], /* ORIYA LETTER AA */ + ["\u0B07", "\u0B07"], /* ORIYA LETTER I */ + ["\u0B08", "\u0B08"], /* ORIYA LETTER II */ + ["\u0B09", "\u0B09"], /* ORIYA LETTER U */ + ["\u0B0A", "\u0B0A"], /* ORIYA LETTER UU */ + ["\u0B0B", "\u0B0B"], /* ORIYA LETTER VOCALIC R */ + ["\u0B0C", "\u0B0C"], /* ORIYA LETTER VOCALIC L */ + ["\u0B0D", "\u0B0D"], + ["\u0B0E", "\u0B0E"], + ["\u0B0F", "\u0B0F"], /* ORIYA LETTER E */ + ["\u0B10", "\u0B10"], /* ORIYA LETTER AI */ + ["\u0B11", "\u0B11"], + ["\u0B12", "\u0B12"], + ["\u0B13", "\u0B13"], /* ORIYA LETTER O */ + ["\u0B14", "\u0B14"], /* ORIYA LETTER AU */ + ["\u0B15", "\u0B15"], /* ORIYA LETTER KA */ + ["\u0B16", "\u0B16"], /* ORIYA LETTER KHA */ + ["\u0B17", "\u0B17"], /* ORIYA LETTER GA */ + ["\u0B18", "\u0B18"], /* ORIYA LETTER GHA */ + ["\u0B19", "\u0B19"], /* ORIYA LETTER NGA */ + ["\u0B1A", "\u0B1A"], /* ORIYA LETTER CA */ + ["\u0B1B", "\u0B1B"], /* ORIYA LETTER CHA */ + ["\u0B1C", "\u0B1C"], /* ORIYA LETTER JA */ + ["\u0B1D", "\u0B1D"], /* ORIYA LETTER JHA */ + ["\u0B1E", "\u0B1E"], /* ORIYA LETTER NYA */ + ["\u0B1F", "\u0B1F"], /* ORIYA LETTER TTA */ + ["\u0B20", "\u0B20"], /* ORIYA LETTER TTHA */ + ["\u0B21", "\u0B21"], /* ORIYA LETTER DDA */ + ["\u0B22", "\u0B22"], /* ORIYA LETTER DDHA */ + ["\u0B23", "\u0B23"], /* ORIYA LETTER NNA */ + ["\u0B24", "\u0B24"], /* ORIYA LETTER TA */ + ["\u0B25", "\u0B25"], /* ORIYA LETTER THA */ + ["\u0B26", "\u0B26"], /* ORIYA LETTER DA */ + ["\u0B27", "\u0B27"], /* ORIYA LETTER DHA */ + ["\u0B28", "\u0B28"], /* ORIYA LETTER NA */ + ["\u0B29", "\u0B29"], + ["\u0B2A", "\u0B2A"], /* ORIYA LETTER PA */ + ["\u0B2B", "\u0B2B"], /* ORIYA LETTER PHA */ + ["\u0B2C", "\u0B2C"], /* ORIYA LETTER BA */ + ["\u0B2D", "\u0B2D"], /* ORIYA LETTER BHA */ + ["\u0B2E", "\u0B2E"], /* ORIYA LETTER MA */ + ["\u0B2F", "\u0B2F"], /* ORIYA LETTER YA */ + ["\u0B30", "\u0B30"], /* ORIYA LETTER RA */ + ["\u0B31", "\u0B31"], + ["\u0B32", "\u0B32"], /* ORIYA LETTER LA */ + ["\u0B33", "\u0B33"], /* ORIYA LETTER LLA */ + ["\u0B34", "\u0B34"], + ["\u0B35", "\u0B35"], /* ORIYA LETTER VA */ + ["\u0B36", "\u0B36"], /* ORIYA LETTER SHA */ + ["\u0B37", "\u0B37"], /* ORIYA LETTER SSA */ + ["\u0B38", "\u0B38"], /* ORIYA LETTER SA */ + ["\u0B39", "\u0B39"], /* ORIYA LETTER HA */ + ["\u0B3A", "\u0B3A"], + ["\u0B3B", "\u0B3B"], + ["\u0B3C", "\u0B3C"], /* ORIYA SIGN NUKTA */ + ["\u0B3D", "\u0B3D"], /* ORIYA SIGN AVAGRAHA */ + ["\u0B3E", "\u0B3E"], /* ORIYA VOWEL SIGN AA */ + ["\u0B3F", "\u0B3F"], /* ORIYA VOWEL SIGN I */ + ["\u0B40", "\u0B40"], /* ORIYA VOWEL SIGN II */ + ["\u0B41", "\u0B41"], /* ORIYA VOWEL SIGN U */ + ["\u0B42", "\u0B42"], /* ORIYA VOWEL SIGN UU */ + ["\u0B43", "\u0B43"], /* ORIYA VOWEL SIGN VOCALIC R */ + ["\u0B44", "\u0B44"], /* ORIYA VOWEL SIGN VOCALIC RR */ + ["\u0B45", "\u0B45"], + ["\u0B46", "\u0B46"], + ["\u0B47", "\u0B47"], /* ORIYA VOWEL SIGN E */ + ["\u0B48", "\u0B48"], /* ORIYA VOWEL SIGN AI */ + ["\u0B49", "\u0B49"], + ["\u0B4A", "\u0B4A"], + ["\u0B4B", "\u0B4B"], /* ORIYA VOWEL SIGN O */ + ["\u0B4C", "\u0B4C"], /* ORIYA VOWEL SIGN AU */ + ["\u0B4D", "\u0B4D"], /* ORIYA SIGN VIRAMA */ + ["\u0B4E", "\u0B4E"], + ["\u0B4F", "\u0B4F"], + ["\u0B50", "\u0B50"], + ["\u0B51", "\u0B51"], + ["\u0B52", "\u0B52"], + ["\u0B53", "\u0B53"], + ["\u0B54", "\u0B54"], + ["\u0B55", "\u0B55"], /* ORIYA SIGN OVERLINE */ + ["\u0B56", "\u0B56"], /* ORIYA AI LENGTH MARK */ + ["\u0B57", "\u0B57"], /* ORIYA AU LENGTH MARK */ + ["\u0B58", "\u0B58"], + ["\u0B59", "\u0B59"], + ["\u0B5A", "\u0B5A"], + ["\u0B5B", "\u0B5B"], + ["\u0B5C", "\u0B5C"], /* ORIYA LETTER RRA */ + ["\u0B5D", "\u0B5D"], /* ORIYA LETTER RHA */ + ["\u0B5E", "\u0B5E"], + ["\u0B5F", "\u0B5F"], /* ORIYA LETTER YYA */ + ["\u0B60", "\u0B60"], /* ORIYA LETTER VOCALIC RR */ + ["\u0B61", "\u0B61"], /* ORIYA LETTER VOCALIC LL */ + ["\u0B62", "\u0B62"], /* ORIYA VOWEL SIGN VOCALIC L */ + ["\u0B63", "\u0B63"], /* ORIYA VOWEL SIGN VOCALIC LL */ + ["\u0B64", "\u0B64"], + ["\u0B65", "\u0B65"], + ["\u0B66", "\u0B66"], /* ORIYA DIGIT ZERO */ + ["\u0B67", "\u0B67"], /* ORIYA DIGIT ONE */ + ["\u0B68", "\u0B68"], /* ORIYA DIGIT TWO */ + ["\u0B69", "\u0B69"], /* ORIYA DIGIT THREE */ + ["\u0B6A", "\u0B6A"], /* ORIYA DIGIT FOUR */ + ["\u0B6B", "\u0B6B"], /* ORIYA DIGIT FIVE */ + ["\u0B6C", "\u0B6C"], /* ORIYA DIGIT SIX */ + ["\u0B6D", "\u0B6D"], /* ORIYA DIGIT SEVEN */ + ["\u0B6E", "\u0B6E"], /* ORIYA DIGIT EIGHT */ + ["\u0B6F", "\u0B6F"], /* ORIYA DIGIT NINE */ + ["\u0B70", "\u0B70"], /* ORIYA ISSHAR */ + ["\u0B71", "\u0B71"], /* ORIYA LETTER WA */ + ["\u0B72", "\u0B72"], /* ORIYA FRACTION ONE QUARTER */ + ["\u0B73", "\u0B73"], /* ORIYA FRACTION ONE HALF */ + ["\u0B74", "\u0B74"], /* ORIYA FRACTION THREE QUARTERS */ + ["\u0B75", "\u0B75"], /* ORIYA FRACTION ONE SIXTEENTH */ + ["\u0B76", "\u0B76"], /* ORIYA FRACTION ONE EIGHTH */ + ["\u0B77", "\u0B77"], /* ORIYA FRACTION THREE SIXTEENTHS */ + ["\u0B78", "\u0B78"], + ["\u0B79", "\u0B79"], + ["\u0B7A", "\u0B7A"], + ["\u0B7B", "\u0B7B"], + ["\u0B7C", "\u0B7C"], + ["\u0B7D", "\u0B7D"], + ["\u0B7E", "\u0B7E"], + ["\u0B7F", "\u0B7F"], + ["\u0B80", "\u0B80"], + ["\u0B81", "\u0B81"], + ["\u0B82", "\u0B82"], /* TAMIL SIGN ANUSVARA */ + ["\u0B83", "\u0B83"], /* TAMIL SIGN VISARGA */ + ["\u0B84", "\u0B84"], + ["\u0B85", "\u0B85"], /* TAMIL LETTER A */ + ["\u0B86", "\u0B86"], /* TAMIL LETTER AA */ + ["\u0B87", "\u0B87"], /* TAMIL LETTER I */ + ["\u0B88", "\u0B88"], /* TAMIL LETTER II */ + ["\u0B89", "\u0B89"], /* TAMIL LETTER U */ + ["\u0B8A", "\u0B8A"], /* TAMIL LETTER UU */ + ["\u0B8B", "\u0B8B"], + ["\u0B8C", "\u0B8C"], + ["\u0B8D", "\u0B8D"], + ["\u0B8E", "\u0B8E"], /* TAMIL LETTER E */ + ["\u0B8F", "\u0B8F"], /* TAMIL LETTER EE */ + ["\u0B90", "\u0B90"], /* TAMIL LETTER AI */ + ["\u0B91", "\u0B91"], + ["\u0B92", "\u0B92"], /* TAMIL LETTER O */ + ["\u0B93", "\u0B93"], /* TAMIL LETTER OO */ + ["\u0B94", "\u0B94"], /* TAMIL LETTER AU */ + ["\u0B95", "\u0B95"], /* TAMIL LETTER KA */ + ["\u0B96", "\u0B96"], + ["\u0B97", "\u0B97"], + ["\u0B98", "\u0B98"], + ["\u0B99", "\u0B99"], /* TAMIL LETTER NGA */ + ["\u0B9A", "\u0B9A"], /* TAMIL LETTER CA */ + ["\u0B9B", "\u0B9B"], + ["\u0B9C", "\u0B9C"], /* TAMIL LETTER JA */ + ["\u0B9D", "\u0B9D"], + ["\u0B9E", "\u0B9E"], /* TAMIL LETTER NYA */ + ["\u0B9F", "\u0B9F"], /* TAMIL LETTER TTA */ + ["\u0BA0", "\u0BA0"], + ["\u0BA1", "\u0BA1"], + ["\u0BA2", "\u0BA2"], + ["\u0BA3", "\u0BA3"], /* TAMIL LETTER NNA */ + ["\u0BA4", "\u0BA4"], /* TAMIL LETTER TA */ + ["\u0BA5", "\u0BA5"], + ["\u0BA6", "\u0BA6"], + ["\u0BA7", "\u0BA7"], + ["\u0BA8", "\u0BA8"], /* TAMIL LETTER NA */ + ["\u0BA9", "\u0BA9"], /* TAMIL LETTER NNNA */ + ["\u0BAA", "\u0BAA"], /* TAMIL LETTER PA */ + ["\u0BAB", "\u0BAB"], + ["\u0BAC", "\u0BAC"], + ["\u0BAD", "\u0BAD"], + ["\u0BAE", "\u0BAE"], /* TAMIL LETTER MA */ + ["\u0BAF", "\u0BAF"], /* TAMIL LETTER YA */ + ["\u0BB0", "\u0BB0"], /* TAMIL LETTER RA */ + ["\u0BB1", "\u0BB1"], /* TAMIL LETTER RRA */ + ["\u0BB2", "\u0BB2"], /* TAMIL LETTER LA */ + ["\u0BB3", "\u0BB3"], /* TAMIL LETTER LLA */ + ["\u0BB4", "\u0BB4"], /* TAMIL LETTER LLLA */ + ["\u0BB5", "\u0BB5"], /* TAMIL LETTER VA */ + ["\u0BB6", "\u0BB6"], /* TAMIL LETTER SHA */ + ["\u0BB7", "\u0BB7"], /* TAMIL LETTER SSA */ + ["\u0BB8", "\u0BB8"], /* TAMIL LETTER SA */ + ["\u0BB9", "\u0BB9"], /* TAMIL LETTER HA */ + ["\u0BBA", "\u0BBA"], + ["\u0BBB", "\u0BBB"], + ["\u0BBC", "\u0BBC"], + ["\u0BBD", "\u0BBD"], + ["\u0BBE", "\u0BBE"], /* TAMIL VOWEL SIGN AA */ + ["\u0BBF", "\u0BBF"], /* TAMIL VOWEL SIGN I */ + ["\u0BC0", "\u0BC0"], /* TAMIL VOWEL SIGN II */ + ["\u0BC1", "\u0BC1"], /* TAMIL VOWEL SIGN U */ + ["\u0BC2", "\u0BC2"], /* TAMIL VOWEL SIGN UU */ + ["\u0BC3", "\u0BC3"], + ["\u0BC4", "\u0BC4"], + ["\u0BC5", "\u0BC5"], + ["\u0BC6", "\u0BC6"], /* TAMIL VOWEL SIGN E */ + ["\u0BC7", "\u0BC7"], /* TAMIL VOWEL SIGN EE */ + ["\u0BC8", "\u0BC8"], /* TAMIL VOWEL SIGN AI */ + ["\u0BC9", "\u0BC9"], + ["\u0BCA", "\u0BCA"], /* TAMIL VOWEL SIGN O */ + ["\u0BCB", "\u0BCB"], /* TAMIL VOWEL SIGN OO */ + ["\u0BCC", "\u0BCC"], /* TAMIL VOWEL SIGN AU */ + ["\u0BCD", "\u0BCD"], /* TAMIL SIGN VIRAMA */ + ["\u0BCE", "\u0BCE"], + ["\u0BCF", "\u0BCF"], + ["\u0BD0", "\u0BD0"], /* TAMIL OM */ + ["\u0BD1", "\u0BD1"], + ["\u0BD2", "\u0BD2"], + ["\u0BD3", "\u0BD3"], + ["\u0BD4", "\u0BD4"], + ["\u0BD5", "\u0BD5"], + ["\u0BD6", "\u0BD6"], + ["\u0BD7", "\u0BD7"], /* TAMIL AU LENGTH MARK */ + ["\u0BD8", "\u0BD8"], + ["\u0BD9", "\u0BD9"], + ["\u0BDA", "\u0BDA"], + ["\u0BDB", "\u0BDB"], + ["\u0BDC", "\u0BDC"], + ["\u0BDD", "\u0BDD"], + ["\u0BDE", "\u0BDE"], + ["\u0BDF", "\u0BDF"], + ["\u0BE0", "\u0BE0"], + ["\u0BE1", "\u0BE1"], + ["\u0BE2", "\u0BE2"], + ["\u0BE3", "\u0BE3"], + ["\u0BE4", "\u0BE4"], + ["\u0BE5", "\u0BE5"], + ["\u0BE6", "\u0BE6"], /* TAMIL DIGIT ZERO */ + ["\u0BE7", "\u0BE7"], /* TAMIL DIGIT ONE */ + ["\u0BE8", "\u0BE8"], /* TAMIL DIGIT TWO */ + ["\u0BE9", "\u0BE9"], /* TAMIL DIGIT THREE */ + ["\u0BEA", "\u0BEA"], /* TAMIL DIGIT FOUR */ + ["\u0BEB", "\u0BEB"], /* TAMIL DIGIT FIVE */ + ["\u0BEC", "\u0BEC"], /* TAMIL DIGIT SIX */ + ["\u0BED", "\u0BED"], /* TAMIL DIGIT SEVEN */ + ["\u0BEE", "\u0BEE"], /* TAMIL DIGIT EIGHT */ + ["\u0BEF", "\u0BEF"], /* TAMIL DIGIT NINE */ + ["\u0BF0", "\u0BF0"], /* TAMIL NUMBER TEN */ + ["\u0BF1", "\u0BF1"], /* TAMIL NUMBER ONE HUNDRED */ + ["\u0BF2", "\u0BF2"], /* TAMIL NUMBER ONE THOUSAND */ + ["\u0BF3", "\u0BF3"], /* TAMIL DAY SIGN */ + ["\u0BF4", "\u0BF4"], /* TAMIL MONTH SIGN */ + ["\u0BF5", "\u0BF5"], /* TAMIL YEAR SIGN */ + ["\u0BF6", "\u0BF6"], /* TAMIL DEBIT SIGN */ + ["\u0BF7", "\u0BF7"], /* TAMIL CREDIT SIGN */ + ["\u0BF8", "\u0BF8"], /* TAMIL AS ABOVE SIGN */ + ["\u0BF9", "\u0BF9"], /* TAMIL RUPEE SIGN */ + ["\u0BFA", "\u0BFA"], /* TAMIL NUMBER SIGN */ + ["\u0BFB", "\u0BFB"], + ["\u0BFC", "\u0BFC"], + ["\u0BFD", "\u0BFD"], + ["\u0BFE", "\u0BFE"], + ["\u0BFF", "\u0BFF"], + ["\u0C00", "\u0C00"], /* TELUGU SIGN COMBINING CANDRABINDU ABOVE */ + ["\u0C01", "\u0C01"], /* TELUGU SIGN CANDRABINDU */ + ["\u0C02", "\u0C02"], /* TELUGU SIGN ANUSVARA */ + ["\u0C03", "\u0C03"], /* TELUGU SIGN VISARGA */ + ["\u0C04", "\u0C04"], /* TELUGU SIGN COMBINING ANUSVARA ABOVE */ + ["\u0C05", "\u0C05"], /* TELUGU LETTER A */ + ["\u0C06", "\u0C06"], /* TELUGU LETTER AA */ + ["\u0C07", "\u0C07"], /* TELUGU LETTER I */ + ["\u0C08", "\u0C08"], /* TELUGU LETTER II */ + ["\u0C09", "\u0C09"], /* TELUGU LETTER U */ + ["\u0C0A", "\u0C0A"], /* TELUGU LETTER UU */ + ["\u0C0B", "\u0C0B"], /* TELUGU LETTER VOCALIC R */ + ["\u0C0C", "\u0C0C"], /* TELUGU LETTER VOCALIC L */ + ["\u0C0D", "\u0C0D"], + ["\u0C0E", "\u0C0E"], /* TELUGU LETTER E */ + ["\u0C0F", "\u0C0F"], /* TELUGU LETTER EE */ + ["\u0C10", "\u0C10"], /* TELUGU LETTER AI */ + ["\u0C11", "\u0C11"], + ["\u0C12", "\u0C12"], /* TELUGU LETTER O */ + ["\u0C13", "\u0C13"], /* TELUGU LETTER OO */ + ["\u0C14", "\u0C14"], /* TELUGU LETTER AU */ + ["\u0C15", "\u0C15"], /* TELUGU LETTER KA */ + ["\u0C16", "\u0C16"], /* TELUGU LETTER KHA */ + ["\u0C17", "\u0C17"], /* TELUGU LETTER GA */ + ["\u0C18", "\u0C18"], /* TELUGU LETTER GHA */ + ["\u0C19", "\u0C19"], /* TELUGU LETTER NGA */ + ["\u0C1A", "\u0C1A"], /* TELUGU LETTER CA */ + ["\u0C1B", "\u0C1B"], /* TELUGU LETTER CHA */ + ["\u0C1C", "\u0C1C"], /* TELUGU LETTER JA */ + ["\u0C1D", "\u0C1D"], /* TELUGU LETTER JHA */ + ["\u0C1E", "\u0C1E"], /* TELUGU LETTER NYA */ + ["\u0C1F", "\u0C1F"], /* TELUGU LETTER TTA */ + ["\u0C20", "\u0C20"], /* TELUGU LETTER TTHA */ + ["\u0C21", "\u0C21"], /* TELUGU LETTER DDA */ + ["\u0C22", "\u0C22"], /* TELUGU LETTER DDHA */ + ["\u0C23", "\u0C23"], /* TELUGU LETTER NNA */ + ["\u0C24", "\u0C24"], /* TELUGU LETTER TA */ + ["\u0C25", "\u0C25"], /* TELUGU LETTER THA */ + ["\u0C26", "\u0C26"], /* TELUGU LETTER DA */ + ["\u0C27", "\u0C27"], /* TELUGU LETTER DHA */ + ["\u0C28", "\u0C28"], /* TELUGU LETTER NA */ + ["\u0C29", "\u0C29"], + ["\u0C2A", "\u0C2A"], /* TELUGU LETTER PA */ + ["\u0C2B", "\u0C2B"], /* TELUGU LETTER PHA */ + ["\u0C2C", "\u0C2C"], /* TELUGU LETTER BA */ + ["\u0C2D", "\u0C2D"], /* TELUGU LETTER BHA */ + ["\u0C2E", "\u0C2E"], /* TELUGU LETTER MA */ + ["\u0C2F", "\u0C2F"], /* TELUGU LETTER YA */ + ["\u0C30", "\u0C30"], /* TELUGU LETTER RA */ + ["\u0C31", "\u0C31"], /* TELUGU LETTER RRA */ + ["\u0C32", "\u0C32"], /* TELUGU LETTER LA */ + ["\u0C33", "\u0C33"], /* TELUGU LETTER LLA */ + ["\u0C34", "\u0C34"], /* TELUGU LETTER LLLA */ + ["\u0C35", "\u0C35"], /* TELUGU LETTER VA */ + ["\u0C36", "\u0C36"], /* TELUGU LETTER SHA */ + ["\u0C37", "\u0C37"], /* TELUGU LETTER SSA */ + ["\u0C38", "\u0C38"], /* TELUGU LETTER SA */ + ["\u0C39", "\u0C39"], /* TELUGU LETTER HA */ + ["\u0C3A", "\u0C3A"], + ["\u0C3B", "\u0C3B"], + ["\u0C3C", "\u0C3C"], /* TELUGU SIGN NUKTA */ + ["\u0C3D", "\u0C3D"], /* TELUGU SIGN AVAGRAHA */ + ["\u0C3E", "\u0C3E"], /* TELUGU VOWEL SIGN AA */ + ["\u0C3F", "\u0C3F"], /* TELUGU VOWEL SIGN I */ + ["\u0C40", "\u0C40"], /* TELUGU VOWEL SIGN II */ + ["\u0C41", "\u0C41"], /* TELUGU VOWEL SIGN U */ + ["\u0C42", "\u0C42"], /* TELUGU VOWEL SIGN UU */ + ["\u0C43", "\u0C43"], /* TELUGU VOWEL SIGN VOCALIC R */ + ["\u0C44", "\u0C44"], /* TELUGU VOWEL SIGN VOCALIC RR */ + ["\u0C45", "\u0C45"], + ["\u0C46", "\u0C46"], /* TELUGU VOWEL SIGN E */ + ["\u0C47", "\u0C47"], /* TELUGU VOWEL SIGN EE */ + ["\u0C48", "\u0C48"], /* TELUGU VOWEL SIGN AI */ + ["\u0C49", "\u0C49"], + ["\u0C4A", "\u0C4A"], /* TELUGU VOWEL SIGN O */ + ["\u0C4B", "\u0C4B"], /* TELUGU VOWEL SIGN OO */ + ["\u0C4C", "\u0C4C"], /* TELUGU VOWEL SIGN AU */ + ["\u0C4D", "\u0C4D"], /* TELUGU SIGN VIRAMA */ + ["\u0C4E", "\u0C4E"], + ["\u0C4F", "\u0C4F"], + ["\u0C50", "\u0C50"], + ["\u0C51", "\u0C51"], + ["\u0C52", "\u0C52"], + ["\u0C53", "\u0C53"], + ["\u0C54", "\u0C54"], + ["\u0C55", "\u0C55"], /* TELUGU LENGTH MARK */ + ["\u0C56", "\u0C56"], /* TELUGU AI LENGTH MARK */ + ["\u0C57", "\u0C57"], + ["\u0C58", "\u0C58"], /* TELUGU LETTER TSA */ + ["\u0C59", "\u0C59"], /* TELUGU LETTER DZA */ + ["\u0C5A", "\u0C5A"], /* TELUGU LETTER RRRA */ + ["\u0C5B", "\u0C5B"], + ["\u0C5C", "\u0C5C"], + ["\u0C5D", "\u0C5D"], /* TELUGU LETTER NAKAARA POLLU */ + ["\u0C5E", "\u0C5E"], + ["\u0C5F", "\u0C5F"], + ["\u0C60", "\u0C60"], /* TELUGU LETTER VOCALIC RR */ + ["\u0C61", "\u0C61"], /* TELUGU LETTER VOCALIC LL */ + ["\u0C62", "\u0C62"], /* TELUGU VOWEL SIGN VOCALIC L */ + ["\u0C63", "\u0C63"], /* TELUGU VOWEL SIGN VOCALIC LL */ + ["\u0C64", "\u0C64"], + ["\u0C65", "\u0C65"], + ["\u0C66", "\u0C66"], /* TELUGU DIGIT ZERO */ + ["\u0C67", "\u0C67"], /* TELUGU DIGIT ONE */ + ["\u0C68", "\u0C68"], /* TELUGU DIGIT TWO */ + ["\u0C69", "\u0C69"], /* TELUGU DIGIT THREE */ + ["\u0C6A", "\u0C6A"], /* TELUGU DIGIT FOUR */ + ["\u0C6B", "\u0C6B"], /* TELUGU DIGIT FIVE */ + ["\u0C6C", "\u0C6C"], /* TELUGU DIGIT SIX */ + ["\u0C6D", "\u0C6D"], /* TELUGU DIGIT SEVEN */ + ["\u0C6E", "\u0C6E"], /* TELUGU DIGIT EIGHT */ + ["\u0C6F", "\u0C6F"], /* TELUGU DIGIT NINE */ + ["\u0C70", "\u0C70"], + ["\u0C71", "\u0C71"], + ["\u0C72", "\u0C72"], + ["\u0C73", "\u0C73"], + ["\u0C74", "\u0C74"], + ["\u0C75", "\u0C75"], + ["\u0C76", "\u0C76"], + ["\u0C77", "\u0C77"], /* TELUGU SIGN SIDDHAM */ + ["\u0C78", "\u0C78"], /* TELUGU FRACTION DIGIT ZERO FOR ODD POWERS OF FOUR */ + ["\u0C79", "\u0C79"], /* TELUGU FRACTION DIGIT ONE FOR ODD POWERS OF FOUR */ + ["\u0C7A", "\u0C7A"], /* TELUGU FRACTION DIGIT TWO FOR ODD POWERS OF FOUR */ + ["\u0C7B", "\u0C7B"], /* TELUGU FRACTION DIGIT THREE FOR ODD POWERS OF FOUR */ + ["\u0C7C", "\u0C7C"], /* TELUGU FRACTION DIGIT ONE FOR EVEN POWERS OF FOUR */ + ["\u0C7D", "\u0C7D"], /* TELUGU FRACTION DIGIT TWO FOR EVEN POWERS OF FOUR */ + ["\u0C7E", "\u0C7E"], /* TELUGU FRACTION DIGIT THREE FOR EVEN POWERS OF FOUR */ + ["\u0C7F", "\u0C7F"], /* TELUGU SIGN TUUMU */ + ["\u0C80", "\u0C80"], /* KANNADA SIGN SPACING CANDRABINDU */ + ["\u0C81", "\u0C81"], /* KANNADA SIGN CANDRABINDU */ + ["\u0C82", "\u0C82"], /* KANNADA SIGN ANUSVARA */ + ["\u0C83", "\u0C83"], /* KANNADA SIGN VISARGA */ + ["\u0C84", "\u0C84"], /* KANNADA SIGN SIDDHAM */ + ["\u0C85", "\u0C85"], /* KANNADA LETTER A */ + ["\u0C86", "\u0C86"], /* KANNADA LETTER AA */ + ["\u0C87", "\u0C87"], /* KANNADA LETTER I */ + ["\u0C88", "\u0C88"], /* KANNADA LETTER II */ + ["\u0C89", "\u0C89"], /* KANNADA LETTER U */ + ["\u0C8A", "\u0C8A"], /* KANNADA LETTER UU */ + ["\u0C8B", "\u0C8B"], /* KANNADA LETTER VOCALIC R */ + ["\u0C8C", "\u0C8C"], /* KANNADA LETTER VOCALIC L */ + ["\u0C8D", "\u0C8D"], + ["\u0C8E", "\u0C8E"], /* KANNADA LETTER E */ + ["\u0C8F", "\u0C8F"], /* KANNADA LETTER EE */ + ["\u0C90", "\u0C90"], /* KANNADA LETTER AI */ + ["\u0C91", "\u0C91"], + ["\u0C92", "\u0C92"], /* KANNADA LETTER O */ + ["\u0C93", "\u0C93"], /* KANNADA LETTER OO */ + ["\u0C94", "\u0C94"], /* KANNADA LETTER AU */ + ["\u0C95", "\u0C95"], /* KANNADA LETTER KA */ + ["\u0C96", "\u0C96"], /* KANNADA LETTER KHA */ + ["\u0C97", "\u0C97"], /* KANNADA LETTER GA */ + ["\u0C98", "\u0C98"], /* KANNADA LETTER GHA */ + ["\u0C99", "\u0C99"], /* KANNADA LETTER NGA */ + ["\u0C9A", "\u0C9A"], /* KANNADA LETTER CA */ + ["\u0C9B", "\u0C9B"], /* KANNADA LETTER CHA */ + ["\u0C9C", "\u0C9C"], /* KANNADA LETTER JA */ + ["\u0C9D", "\u0C9D"], /* KANNADA LETTER JHA */ + ["\u0C9E", "\u0C9E"], /* KANNADA LETTER NYA */ + ["\u0C9F", "\u0C9F"], /* KANNADA LETTER TTA */ + ["\u0CA0", "\u0CA0"], /* KANNADA LETTER TTHA */ + ["\u0CA1", "\u0CA1"], /* KANNADA LETTER DDA */ + ["\u0CA2", "\u0CA2"], /* KANNADA LETTER DDHA */ + ["\u0CA3", "\u0CA3"], /* KANNADA LETTER NNA */ + ["\u0CA4", "\u0CA4"], /* KANNADA LETTER TA */ + ["\u0CA5", "\u0CA5"], /* KANNADA LETTER THA */ + ["\u0CA6", "\u0CA6"], /* KANNADA LETTER DA */ + ["\u0CA7", "\u0CA7"], /* KANNADA LETTER DHA */ + ["\u0CA8", "\u0CA8"], /* KANNADA LETTER NA */ + ["\u0CA9", "\u0CA9"], + ["\u0CAA", "\u0CAA"], /* KANNADA LETTER PA */ + ["\u0CAB", "\u0CAB"], /* KANNADA LETTER PHA */ + ["\u0CAC", "\u0CAC"], /* KANNADA LETTER BA */ + ["\u0CAD", "\u0CAD"], /* KANNADA LETTER BHA */ + ["\u0CAE", "\u0CAE"], /* KANNADA LETTER MA */ + ["\u0CAF", "\u0CAF"], /* KANNADA LETTER YA */ + ["\u0CB0", "\u0CB0"], /* KANNADA LETTER RA */ + ["\u0CB1", "\u0CB1"], /* KANNADA LETTER RRA */ + ["\u0CB2", "\u0CB2"], /* KANNADA LETTER LA */ + ["\u0CB3", "\u0CB3"], /* KANNADA LETTER LLA */ + ["\u0CB4", "\u0CB4"], + ["\u0CB5", "\u0CB5"], /* KANNADA LETTER VA */ + ["\u0CB6", "\u0CB6"], /* KANNADA LETTER SHA */ + ["\u0CB7", "\u0CB7"], /* KANNADA LETTER SSA */ + ["\u0CB8", "\u0CB8"], /* KANNADA LETTER SA */ + ["\u0CB9", "\u0CB9"], /* KANNADA LETTER HA */ + ["\u0CBA", "\u0CBA"], + ["\u0CBB", "\u0CBB"], + ["\u0CBC", "\u0CBC"], /* KANNADA SIGN NUKTA */ + ["\u0CBD", "\u0CBD"], /* KANNADA SIGN AVAGRAHA */ + ["\u0CBE", "\u0CBE"], /* KANNADA VOWEL SIGN AA */ + ["\u0CBF", "\u0CBF"], /* KANNADA VOWEL SIGN I */ + ["\u0CC0", "\u0CC0"], /* KANNADA VOWEL SIGN II */ + ["\u0CC1", "\u0CC1"], /* KANNADA VOWEL SIGN U */ + ["\u0CC2", "\u0CC2"], /* KANNADA VOWEL SIGN UU */ + ["\u0CC3", "\u0CC3"], /* KANNADA VOWEL SIGN VOCALIC R */ + ["\u0CC4", "\u0CC4"], /* KANNADA VOWEL SIGN VOCALIC RR */ + ["\u0CC5", "\u0CC5"], + ["\u0CC6", "\u0CC6"], /* KANNADA VOWEL SIGN E */ + ["\u0CC7", "\u0CC7"], /* KANNADA VOWEL SIGN EE */ + ["\u0CC8", "\u0CC8"], /* KANNADA VOWEL SIGN AI */ + ["\u0CC9", "\u0CC9"], + ["\u0CCA", "\u0CCA"], /* KANNADA VOWEL SIGN O */ + ["\u0CCB", "\u0CCB"], /* KANNADA VOWEL SIGN OO */ + ["\u0CCC", "\u0CCC"], /* KANNADA VOWEL SIGN AU */ + ["\u0CCD", "\u0CCD"], /* KANNADA SIGN VIRAMA */ + ["\u0CCE", "\u0CCE"], + ["\u0CCF", "\u0CCF"], + ["\u0CD0", "\u0CD0"], + ["\u0CD1", "\u0CD1"], + ["\u0CD2", "\u0CD2"], + ["\u0CD3", "\u0CD3"], + ["\u0CD4", "\u0CD4"], + ["\u0CD5", "\u0CD5"], /* KANNADA LENGTH MARK */ + ["\u0CD6", "\u0CD6"], /* KANNADA AI LENGTH MARK */ + ["\u0CD7", "\u0CD7"], + ["\u0CD8", "\u0CD8"], + ["\u0CD9", "\u0CD9"], + ["\u0CDA", "\u0CDA"], + ["\u0CDB", "\u0CDB"], + ["\u0CDC", "\u0CDC"], + ["\u0CDD", "\u0CDD"], /* KANNADA LETTER NAKAARA POLLU */ + ["\u0CDE", "\u0CDE"], /* KANNADA LETTER FA */ + ["\u0CDF", "\u0CDF"], + ["\u0CE0", "\u0CE0"], /* KANNADA LETTER VOCALIC RR */ + ["\u0CE1", "\u0CE1"], /* KANNADA LETTER VOCALIC LL */ + ["\u0CE2", "\u0CE2"], /* KANNADA VOWEL SIGN VOCALIC L */ + ["\u0CE3", "\u0CE3"], /* KANNADA VOWEL SIGN VOCALIC LL */ + ["\u0CE4", "\u0CE4"], + ["\u0CE5", "\u0CE5"], + ["\u0CE6", "\u0CE6"], /* KANNADA DIGIT ZERO */ + ["\u0CE7", "\u0CE7"], /* KANNADA DIGIT ONE */ + ["\u0CE8", "\u0CE8"], /* KANNADA DIGIT TWO */ + ["\u0CE9", "\u0CE9"], /* KANNADA DIGIT THREE */ + ["\u0CEA", "\u0CEA"], /* KANNADA DIGIT FOUR */ + ["\u0CEB", "\u0CEB"], /* KANNADA DIGIT FIVE */ + ["\u0CEC", "\u0CEC"], /* KANNADA DIGIT SIX */ + ["\u0CED", "\u0CED"], /* KANNADA DIGIT SEVEN */ + ["\u0CEE", "\u0CEE"], /* KANNADA DIGIT EIGHT */ + ["\u0CEF", "\u0CEF"], /* KANNADA DIGIT NINE */ + ["\u0CF0", "\u0CF0"], + ["\u0CF1", "\u0CF1"], /* KANNADA SIGN JIHVAMULIYA */ + ["\u0CF2", "\u0CF2"], /* KANNADA SIGN UPADHMANIYA */ + ["\u0CF3", "\u0CF3"], /* KANNADA SIGN COMBINING ANUSVARA ABOVE RIGHT */ + ["\u0CF4", "\u0CF4"], + ["\u0CF5", "\u0CF5"], + ["\u0CF6", "\u0CF6"], + ["\u0CF7", "\u0CF7"], + ["\u0CF8", "\u0CF8"], + ["\u0CF9", "\u0CF9"], + ["\u0CFA", "\u0CFA"], + ["\u0CFB", "\u0CFB"], + ["\u0CFC", "\u0CFC"], + ["\u0CFD", "\u0CFD"], + ["\u0CFE", "\u0CFE"], + ["\u0CFF", "\u0CFF"], + ["\u0D00", "\u0D00"], /* MALAYALAM SIGN COMBINING ANUSVARA ABOVE */ + ["\u0D01", "\u0D01"], /* MALAYALAM SIGN CANDRABINDU */ + ["\u0D02", "\u0D02"], /* MALAYALAM SIGN ANUSVARA */ + ["\u0D03", "\u0D03"], /* MALAYALAM SIGN VISARGA */ + ["\u0D04", "\u0D04"], /* MALAYALAM LETTER VEDIC ANUSVARA */ + ["\u0D05", "\u0D05"], /* MALAYALAM LETTER A */ + ["\u0D06", "\u0D06"], /* MALAYALAM LETTER AA */ + ["\u0D07", "\u0D07"], /* MALAYALAM LETTER I */ + ["\u0D08", "\u0D08"], /* MALAYALAM LETTER II */ + ["\u0D09", "\u0D09"], /* MALAYALAM LETTER U */ + ["\u0D0A", "\u0D0A"], /* MALAYALAM LETTER UU */ + ["\u0D0B", "\u0D0B"], /* MALAYALAM LETTER VOCALIC R */ + ["\u0D0C", "\u0D0C"], /* MALAYALAM LETTER VOCALIC L */ + ["\u0D0D", "\u0D0D"], + ["\u0D0E", "\u0D0E"], /* MALAYALAM LETTER E */ + ["\u0D0F", "\u0D0F"], /* MALAYALAM LETTER EE */ + ["\u0D10", "\u0D10"], /* MALAYALAM LETTER AI */ + ["\u0D11", "\u0D11"], + ["\u0D12", "\u0D12"], /* MALAYALAM LETTER O */ + ["\u0D13", "\u0D13"], /* MALAYALAM LETTER OO */ + ["\u0D14", "\u0D14"], /* MALAYALAM LETTER AU */ + ["\u0D15", "\u0D15"], /* MALAYALAM LETTER KA */ + ["\u0D16", "\u0D16"], /* MALAYALAM LETTER KHA */ + ["\u0D17", "\u0D17"], /* MALAYALAM LETTER GA */ + ["\u0D18", "\u0D18"], /* MALAYALAM LETTER GHA */ + ["\u0D19", "\u0D19"], /* MALAYALAM LETTER NGA */ + ["\u0D1A", "\u0D1A"], /* MALAYALAM LETTER CA */ + ["\u0D1B", "\u0D1B"], /* MALAYALAM LETTER CHA */ + ["\u0D1C", "\u0D1C"], /* MALAYALAM LETTER JA */ + ["\u0D1D", "\u0D1D"], /* MALAYALAM LETTER JHA */ + ["\u0D1E", "\u0D1E"], /* MALAYALAM LETTER NYA */ + ["\u0D1F", "\u0D1F"], /* MALAYALAM LETTER TTA */ + ["\u0D20", "\u0D20"], /* MALAYALAM LETTER TTHA */ + ["\u0D21", "\u0D21"], /* MALAYALAM LETTER DDA */ + ["\u0D22", "\u0D22"], /* MALAYALAM LETTER DDHA */ + ["\u0D23", "\u0D23"], /* MALAYALAM LETTER NNA */ + ["\u0D24", "\u0D24"], /* MALAYALAM LETTER TA */ + ["\u0D25", "\u0D25"], /* MALAYALAM LETTER THA */ + ["\u0D26", "\u0D26"], /* MALAYALAM LETTER DA */ + ["\u0D27", "\u0D27"], /* MALAYALAM LETTER DHA */ + ["\u0D28", "\u0D28"], /* MALAYALAM LETTER NA */ + ["\u0D29", "\u0D29"], /* MALAYALAM LETTER NNNA */ + ["\u0D2A", "\u0D2A"], /* MALAYALAM LETTER PA */ + ["\u0D2B", "\u0D2B"], /* MALAYALAM LETTER PHA */ + ["\u0D2C", "\u0D2C"], /* MALAYALAM LETTER BA */ + ["\u0D2D", "\u0D2D"], /* MALAYALAM LETTER BHA */ + ["\u0D2E", "\u0D2E"], /* MALAYALAM LETTER MA */ + ["\u0D2F", "\u0D2F"], /* MALAYALAM LETTER YA */ + ["\u0D30", "\u0D30"], /* MALAYALAM LETTER RA */ + ["\u0D31", "\u0D31"], /* MALAYALAM LETTER RRA */ + ["\u0D32", "\u0D32"], /* MALAYALAM LETTER LA */ + ["\u0D33", "\u0D33"], /* MALAYALAM LETTER LLA */ + ["\u0D34", "\u0D34"], /* MALAYALAM LETTER LLLA */ + ["\u0D35", "\u0D35"], /* MALAYALAM LETTER VA */ + ["\u0D36", "\u0D36"], /* MALAYALAM LETTER SHA */ + ["\u0D37", "\u0D37"], /* MALAYALAM LETTER SSA */ + ["\u0D38", "\u0D38"], /* MALAYALAM LETTER SA */ + ["\u0D39", "\u0D39"], /* MALAYALAM LETTER HA */ + ["\u0D3A", "\u0D3A"], /* MALAYALAM LETTER TTTA */ + ["\u0D3B", "\u0D3B"], /* MALAYALAM SIGN VERTICAL BAR VIRAMA */ + ["\u0D3C", "\u0D3C"], /* MALAYALAM SIGN CIRCULAR VIRAMA */ + ["\u0D3D", "\u0D3D"], /* MALAYALAM SIGN AVAGRAHA */ + ["\u0D3E", "\u0D3E"], /* MALAYALAM VOWEL SIGN AA */ + ["\u0D3F", "\u0D3F"], /* MALAYALAM VOWEL SIGN I */ + ["\u0D40", "\u0D40"], /* MALAYALAM VOWEL SIGN II */ + ["\u0D41", "\u0D41"], /* MALAYALAM VOWEL SIGN U */ + ["\u0D42", "\u0D42"], /* MALAYALAM VOWEL SIGN UU */ + ["\u0D43", "\u0D43"], /* MALAYALAM VOWEL SIGN VOCALIC R */ + ["\u0D44", "\u0D44"], /* MALAYALAM VOWEL SIGN VOCALIC RR */ + ["\u0D45", "\u0D45"], + ["\u0D46", "\u0D46"], /* MALAYALAM VOWEL SIGN E */ + ["\u0D47", "\u0D47"], /* MALAYALAM VOWEL SIGN EE */ + ["\u0D48", "\u0D48"], /* MALAYALAM VOWEL SIGN AI */ + ["\u0D49", "\u0D49"], + ["\u0D4A", "\u0D4A"], /* MALAYALAM VOWEL SIGN O */ + ["\u0D4B", "\u0D4B"], /* MALAYALAM VOWEL SIGN OO */ + ["\u0D4C", "\u0D4C"], /* MALAYALAM VOWEL SIGN AU */ + ["\u0D4D", "\u0D4D"], /* MALAYALAM SIGN VIRAMA */ + ["\u0D4E", "\u0D4E"], /* MALAYALAM LETTER DOT REPH */ + ["\u0D4F", "\u0D4F"], /* MALAYALAM SIGN PARA */ + ["\u0D50", "\u0D50"], + ["\u0D51", "\u0D51"], + ["\u0D52", "\u0D52"], + ["\u0D53", "\u0D53"], + ["\u0D54", "\u0D54"], /* MALAYALAM LETTER CHILLU M */ + ["\u0D55", "\u0D55"], /* MALAYALAM LETTER CHILLU Y */ + ["\u0D56", "\u0D56"], /* MALAYALAM LETTER CHILLU LLL */ + ["\u0D57", "\u0D57"], /* MALAYALAM AU LENGTH MARK */ + ["\u0D58", "\u0D58"], /* MALAYALAM FRACTION ONE ONE-HUNDRED-AND-SIXTIETH */ + ["\u0D59", "\u0D59"], /* MALAYALAM FRACTION ONE FORTIETH */ + ["\u0D5A", "\u0D5A"], /* MALAYALAM FRACTION THREE EIGHTIETHS */ + ["\u0D5B", "\u0D5B"], /* MALAYALAM FRACTION ONE TWENTIETH */ + ["\u0D5C", "\u0D5C"], /* MALAYALAM FRACTION ONE TENTH */ + ["\u0D5D", "\u0D5D"], /* MALAYALAM FRACTION THREE TWENTIETHS */ + ["\u0D5E", "\u0D5E"], /* MALAYALAM FRACTION ONE FIFTH */ + ["\u0D5F", "\u0D5F"], /* MALAYALAM LETTER ARCHAIC II */ + ["\u0D60", "\u0D60"], /* MALAYALAM LETTER VOCALIC RR */ + ["\u0D61", "\u0D61"], /* MALAYALAM LETTER VOCALIC LL */ + ["\u0D62", "\u0D62"], /* MALAYALAM VOWEL SIGN VOCALIC L */ + ["\u0D63", "\u0D63"], /* MALAYALAM VOWEL SIGN VOCALIC LL */ + ["\u0D64", "\u0D64"], + ["\u0D65", "\u0D65"], + ["\u0D66", "\u0D66"], /* MALAYALAM DIGIT ZERO */ + ["\u0D67", "\u0D67"], /* MALAYALAM DIGIT ONE */ + ["\u0D68", "\u0D68"], /* MALAYALAM DIGIT TWO */ + ["\u0D69", "\u0D69"], /* MALAYALAM DIGIT THREE */ + ["\u0D6A", "\u0D6A"], /* MALAYALAM DIGIT FOUR */ + ["\u0D6B", "\u0D6B"], /* MALAYALAM DIGIT FIVE */ + ["\u0D6C", "\u0D6C"], /* MALAYALAM DIGIT SIX */ + ["\u0D6D", "\u0D6D"], /* MALAYALAM DIGIT SEVEN */ + ["\u0D6E", "\u0D6E"], /* MALAYALAM DIGIT EIGHT */ + ["\u0D6F", "\u0D6F"], /* MALAYALAM DIGIT NINE */ + ["\u0D70", "\u0D70"], /* MALAYALAM NUMBER TEN */ + ["\u0D71", "\u0D71"], /* MALAYALAM NUMBER ONE HUNDRED */ + ["\u0D72", "\u0D72"], /* MALAYALAM NUMBER ONE THOUSAND */ + ["\u0D73", "\u0D73"], /* MALAYALAM FRACTION ONE QUARTER */ + ["\u0D74", "\u0D74"], /* MALAYALAM FRACTION ONE HALF */ + ["\u0D75", "\u0D75"], /* MALAYALAM FRACTION THREE QUARTERS */ + ["\u0D76", "\u0D76"], /* MALAYALAM FRACTION ONE SIXTEENTH */ + ["\u0D77", "\u0D77"], /* MALAYALAM FRACTION ONE EIGHTH */ + ["\u0D78", "\u0D78"], /* MALAYALAM FRACTION THREE SIXTEENTHS */ + ["\u0D79", "\u0D79"], /* MALAYALAM DATE MARK */ + ["\u0D7A", "\u0D7A"], /* MALAYALAM LETTER CHILLU NN */ + ["\u0D7B", "\u0D7B"], /* MALAYALAM LETTER CHILLU N */ + ["\u0D7C", "\u0D7C"], /* MALAYALAM LETTER CHILLU RR */ + ["\u0D7D", "\u0D7D"], /* MALAYALAM LETTER CHILLU L */ + ["\u0D7E", "\u0D7E"], /* MALAYALAM LETTER CHILLU LL */ + ["\u0D7F", "\u0D7F"], /* MALAYALAM LETTER CHILLU K */ + ["\u0D80", "\u0D80"], + ["\u0D81", "\u0D81"], /* SINHALA SIGN CANDRABINDU */ + ["\u0D82", "\u0D82"], /* SINHALA SIGN ANUSVARAYA */ + ["\u0D83", "\u0D83"], /* SINHALA SIGN VISARGAYA */ + ["\u0D84", "\u0D84"], + ["\u0D85", "\u0D85"], /* SINHALA LETTER AYANNA */ + ["\u0D86", "\u0D86"], /* SINHALA LETTER AAYANNA */ + ["\u0D87", "\u0D87"], /* SINHALA LETTER AEYANNA */ + ["\u0D88", "\u0D88"], /* SINHALA LETTER AEEYANNA */ + ["\u0D89", "\u0D89"], /* SINHALA LETTER IYANNA */ + ["\u0D8A", "\u0D8A"], /* SINHALA LETTER IIYANNA */ + ["\u0D8B", "\u0D8B"], /* SINHALA LETTER UYANNA */ + ["\u0D8C", "\u0D8C"], /* SINHALA LETTER UUYANNA */ + ["\u0D8D", "\u0D8D"], /* SINHALA LETTER IRUYANNA */ + ["\u0D8E", "\u0D8E"], /* SINHALA LETTER IRUUYANNA */ + ["\u0D8F", "\u0D8F"], /* SINHALA LETTER ILUYANNA */ + ["\u0D90", "\u0D90"], /* SINHALA LETTER ILUUYANNA */ + ["\u0D91", "\u0D91"], /* SINHALA LETTER EYANNA */ + ["\u0D92", "\u0D92"], /* SINHALA LETTER EEYANNA */ + ["\u0D93", "\u0D93"], /* SINHALA LETTER AIYANNA */ + ["\u0D94", "\u0D94"], /* SINHALA LETTER OYANNA */ + ["\u0D95", "\u0D95"], /* SINHALA LETTER OOYANNA */ + ["\u0D96", "\u0D96"], /* SINHALA LETTER AUYANNA */ + ["\u0D97", "\u0D97"], + ["\u0D98", "\u0D98"], + ["\u0D99", "\u0D99"], + ["\u0D9A", "\u0D9A"], /* SINHALA LETTER ALPAPRAANA KAYANNA */ + ["\u0D9B", "\u0D9B"], /* SINHALA LETTER MAHAAPRAANA KAYANNA */ + ["\u0D9C", "\u0D9C"], /* SINHALA LETTER ALPAPRAANA GAYANNA */ + ["\u0D9D", "\u0D9D"], /* SINHALA LETTER MAHAAPRAANA GAYANNA */ + ["\u0D9E", "\u0D9E"], /* SINHALA LETTER KANTAJA NAASIKYAYA */ + ["\u0D9F", "\u0D9F"], /* SINHALA LETTER SANYAKA GAYANNA */ + ["\u0DA0", "\u0DA0"], /* SINHALA LETTER ALPAPRAANA CAYANNA */ + ["\u0DA1", "\u0DA1"], /* SINHALA LETTER MAHAAPRAANA CAYANNA */ + ["\u0DA2", "\u0DA2"], /* SINHALA LETTER ALPAPRAANA JAYANNA */ + ["\u0DA3", "\u0DA3"], /* SINHALA LETTER MAHAAPRAANA JAYANNA */ + ["\u0DA4", "\u0DA4"], /* SINHALA LETTER TAALUJA NAASIKYAYA */ + ["\u0DA5", "\u0DA5"], /* SINHALA LETTER TAALUJA SANYOOGA NAAKSIKYAYA */ + ["\u0DA6", "\u0DA6"], /* SINHALA LETTER SANYAKA JAYANNA */ + ["\u0DA7", "\u0DA7"], /* SINHALA LETTER ALPAPRAANA TTAYANNA */ + ["\u0DA8", "\u0DA8"], /* SINHALA LETTER MAHAAPRAANA TTAYANNA */ + ["\u0DA9", "\u0DA9"], /* SINHALA LETTER ALPAPRAANA DDAYANNA */ + ["\u0DAA", "\u0DAA"], /* SINHALA LETTER MAHAAPRAANA DDAYANNA */ + ["\u0DAB", "\u0DAB"], /* SINHALA LETTER MUURDHAJA NAYANNA */ + ["\u0DAC", "\u0DAC"], /* SINHALA LETTER SANYAKA DDAYANNA */ + ["\u0DAD", "\u0DAD"], /* SINHALA LETTER ALPAPRAANA TAYANNA */ + ["\u0DAE", "\u0DAE"], /* SINHALA LETTER MAHAAPRAANA TAYANNA */ + ["\u0DAF", "\u0DAF"], /* SINHALA LETTER ALPAPRAANA DAYANNA */ + ["\u0DB0", "\u0DB0"], /* SINHALA LETTER MAHAAPRAANA DAYANNA */ + ["\u0DB1", "\u0DB1"], /* SINHALA LETTER DANTAJA NAYANNA */ + ["\u0DB2", "\u0DB2"], + ["\u0DB3", "\u0DB3"], /* SINHALA LETTER SANYAKA DAYANNA */ + ["\u0DB4", "\u0DB4"], /* SINHALA LETTER ALPAPRAANA PAYANNA */ + ["\u0DB5", "\u0DB5"], /* SINHALA LETTER MAHAAPRAANA PAYANNA */ + ["\u0DB6", "\u0DB6"], /* SINHALA LETTER ALPAPRAANA BAYANNA */ + ["\u0DB7", "\u0DB7"], /* SINHALA LETTER MAHAAPRAANA BAYANNA */ + ["\u0DB8", "\u0DB8"], /* SINHALA LETTER MAYANNA */ + ["\u0DB9", "\u0DB9"], /* SINHALA LETTER AMBA BAYANNA */ + ["\u0DBA", "\u0DBA"], /* SINHALA LETTER YAYANNA */ + ["\u0DBB", "\u0DBB"], /* SINHALA LETTER RAYANNA */ + ["\u0DBC", "\u0DBC"], + ["\u0DBD", "\u0DBD"], /* SINHALA LETTER DANTAJA LAYANNA */ + ["\u0DBE", "\u0DBE"], + ["\u0DBF", "\u0DBF"], + ["\u0DC0", "\u0DC0"], /* SINHALA LETTER VAYANNA */ + ["\u0DC1", "\u0DC1"], /* SINHALA LETTER TAALUJA SAYANNA */ + ["\u0DC2", "\u0DC2"], /* SINHALA LETTER MUURDHAJA SAYANNA */ + ["\u0DC3", "\u0DC3"], /* SINHALA LETTER DANTAJA SAYANNA */ + ["\u0DC4", "\u0DC4"], /* SINHALA LETTER HAYANNA */ + ["\u0DC5", "\u0DC5"], /* SINHALA LETTER MUURDHAJA LAYANNA */ + ["\u0DC6", "\u0DC6"], /* SINHALA LETTER FAYANNA */ + ["\u0DC7", "\u0DC7"], + ["\u0DC8", "\u0DC8"], + ["\u0DC9", "\u0DC9"], + ["\u0DCA", "\u0DCA"], /* SINHALA SIGN AL-LAKUNA */ + ["\u0DCB", "\u0DCB"], + ["\u0DCC", "\u0DCC"], + ["\u0DCD", "\u0DCD"], + ["\u0DCE", "\u0DCE"], + ["\u0DCF", "\u0DCF"], /* SINHALA VOWEL SIGN AELA-PILLA */ + ["\u0DD0", "\u0DD0"], /* SINHALA VOWEL SIGN KETTI AEDA-PILLA */ + ["\u0DD1", "\u0DD1"], /* SINHALA VOWEL SIGN DIGA AEDA-PILLA */ + ["\u0DD2", "\u0DD2"], /* SINHALA VOWEL SIGN KETTI IS-PILLA */ + ["\u0DD3", "\u0DD3"], /* SINHALA VOWEL SIGN DIGA IS-PILLA */ + ["\u0DD4", "\u0DD4"], /* SINHALA VOWEL SIGN KETTI PAA-PILLA */ + ["\u0DD5", "\u0DD5"], + ["\u0DD6", "\u0DD6"], /* SINHALA VOWEL SIGN DIGA PAA-PILLA */ + ["\u0DD7", "\u0DD7"], + ["\u0DD8", "\u0DD8"], /* SINHALA VOWEL SIGN GAETTA-PILLA */ + ["\u0DD9", "\u0DD9"], /* SINHALA VOWEL SIGN KOMBUVA */ + ["\u0DDA", "\u0DDA"], /* SINHALA VOWEL SIGN DIGA KOMBUVA */ + ["\u0DDB", "\u0DDB"], /* SINHALA VOWEL SIGN KOMBU DEKA */ + ["\u0DDC", "\u0DDC"], /* SINHALA VOWEL SIGN KOMBUVA HAA AELA-PILLA */ + ["\u0DDD", "\u0DDD"], /* SINHALA VOWEL SIGN KOMBUVA HAA DIGA AELA-PILLA */ + ["\u0DDE", "\u0DDE"], /* SINHALA VOWEL SIGN KOMBUVA HAA GAYANUKITTA */ + ["\u0DDF", "\u0DDF"], /* SINHALA VOWEL SIGN GAYANUKITTA */ + ["\u0DE0", "\u0DE0"], + ["\u0DE1", "\u0DE1"], + ["\u0DE2", "\u0DE2"], + ["\u0DE3", "\u0DE3"], + ["\u0DE4", "\u0DE4"], + ["\u0DE5", "\u0DE5"], + ["\u0DE6", "\u0DE6"], /* SINHALA LITH DIGIT ZERO */ + ["\u0DE7", "\u0DE7"], /* SINHALA LITH DIGIT ONE */ + ["\u0DE8", "\u0DE8"], /* SINHALA LITH DIGIT TWO */ + ["\u0DE9", "\u0DE9"], /* SINHALA LITH DIGIT THREE */ + ["\u0DEA", "\u0DEA"], /* SINHALA LITH DIGIT FOUR */ + ["\u0DEB", "\u0DEB"], /* SINHALA LITH DIGIT FIVE */ + ["\u0DEC", "\u0DEC"], /* SINHALA LITH DIGIT SIX */ + ["\u0DED", "\u0DED"], /* SINHALA LITH DIGIT SEVEN */ + ["\u0DEE", "\u0DEE"], /* SINHALA LITH DIGIT EIGHT */ + ["\u0DEF", "\u0DEF"], /* SINHALA LITH DIGIT NINE */ + ["\u0DF0", "\u0DF0"], + ["\u0DF1", "\u0DF1"], + ["\u0DF2", "\u0DF2"], /* SINHALA VOWEL SIGN DIGA GAETTA-PILLA */ + ["\u0DF3", "\u0DF3"], /* SINHALA VOWEL SIGN DIGA GAYANUKITTA */ + ["\u0DF4", "\u0DF4"], /* SINHALA PUNCTUATION KUNDDALIYA */ + ["\u0DF5", "\u0DF5"], + ["\u0DF6", "\u0DF6"], + ["\u0DF7", "\u0DF7"], + ["\u0DF8", "\u0DF8"], + ["\u0DF9", "\u0DF9"], + ["\u0DFA", "\u0DFA"], + ["\u0DFB", "\u0DFB"], + ["\u0DFC", "\u0DFC"], + ["\u0DFD", "\u0DFD"], + ["\u0DFE", "\u0DFE"], + ["\u0DFF", "\u0DFF"], + ["\u0E00", "\u0E00"], + ["\u0E01", "\u0E01"], /* THAI CHARACTER KO KAI (THAI LETTER KO KAI) */ + ["\u0E02", "\u0E02"], /* THAI CHARACTER KHO KHAI (THAI LETTER KHO KHAI) */ + ["\u0E03", "\u0E03"], /* THAI CHARACTER KHO KHUAT (THAI LETTER KHO KHUAT) */ + ["\u0E04", "\u0E04"], /* THAI CHARACTER KHO KHWAI (THAI LETTER KHO KHWAI) */ + ["\u0E05", "\u0E05"], /* THAI CHARACTER KHO KHON (THAI LETTER KHO KHON) */ + ["\u0E06", "\u0E06"], /* THAI CHARACTER KHO RAKHANG (THAI LETTER KHO RAKHANG) */ + ["\u0E07", "\u0E07"], /* THAI CHARACTER NGO NGU (THAI LETTER NGO NGU) */ + ["\u0E08", "\u0E08"], /* THAI CHARACTER CHO CHAN (THAI LETTER CHO CHAN) */ + ["\u0E09", "\u0E09"], /* THAI CHARACTER CHO CHING (THAI LETTER CHO CHING) */ + ["\u0E0A", "\u0E0A"], /* THAI CHARACTER CHO CHANG (THAI LETTER CHO CHANG) */ + ["\u0E0B", "\u0E0B"], /* THAI CHARACTER SO SO (THAI LETTER SO SO) */ + ["\u0E0C", "\u0E0C"], /* THAI CHARACTER CHO CHOE (THAI LETTER CHO CHOE) */ + ["\u0E0D", "\u0E0D"], /* THAI CHARACTER YO YING (THAI LETTER YO YING) */ + ["\u0E0E", "\u0E0E"], /* THAI CHARACTER DO CHADA (THAI LETTER DO CHADA) */ + ["\u0E0F", "\u0E0F"], /* THAI CHARACTER TO PATAK (THAI LETTER TO PATAK) */ + ["\u0E10", "\u0E10"], /* THAI CHARACTER THO THAN (THAI LETTER THO THAN) */ + ["\u0E11", "\u0E11"], /* THAI CHARACTER THO NANGMONTHO (THAI LETTER THO NANGMONTHO) */ + ["\u0E12", "\u0E12"], /* THAI CHARACTER THO PHUTHAO (THAI LETTER THO PHUTHAO) */ + ["\u0E13", "\u0E13"], /* THAI CHARACTER NO NEN (THAI LETTER NO NEN) */ + ["\u0E14", "\u0E14"], /* THAI CHARACTER DO DEK (THAI LETTER DO DEK) */ + ["\u0E15", "\u0E15"], /* THAI CHARACTER TO TAO (THAI LETTER TO TAO) */ + ["\u0E16", "\u0E16"], /* THAI CHARACTER THO THUNG (THAI LETTER THO THUNG) */ + ["\u0E17", "\u0E17"], /* THAI CHARACTER THO THAHAN (THAI LETTER THO THAHAN) */ + ["\u0E18", "\u0E18"], /* THAI CHARACTER THO THONG (THAI LETTER THO THONG) */ + ["\u0E19", "\u0E19"], /* THAI CHARACTER NO NU (THAI LETTER NO NU) */ + ["\u0E1A", "\u0E1A"], /* THAI CHARACTER BO BAIMAI (THAI LETTER BO BAIMAI) */ + ["\u0E1B", "\u0E1B"], /* THAI CHARACTER PO PLA (THAI LETTER PO PLA) */ + ["\u0E1C", "\u0E1C"], /* THAI CHARACTER PHO PHUNG (THAI LETTER PHO PHUNG) */ + ["\u0E1D", "\u0E1D"], /* THAI CHARACTER FO FA (THAI LETTER FO FA) */ + ["\u0E1E", "\u0E1E"], /* THAI CHARACTER PHO PHAN (THAI LETTER PHO PHAN) */ + ["\u0E1F", "\u0E1F"], /* THAI CHARACTER FO FAN (THAI LETTER FO FAN) */ + ["\u0E20", "\u0E20"], /* THAI CHARACTER PHO SAMPHAO (THAI LETTER PHO SAMPHAO) */ + ["\u0E21", "\u0E21"], /* THAI CHARACTER MO MA (THAI LETTER MO MA) */ + ["\u0E22", "\u0E22"], /* THAI CHARACTER YO YAK (THAI LETTER YO YAK) */ + ["\u0E23", "\u0E23"], /* THAI CHARACTER RO RUA (THAI LETTER RO RUA) */ + ["\u0E24", "\u0E24"], /* THAI CHARACTER RU (THAI LETTER RU) */ + ["\u0E25", "\u0E25"], /* THAI CHARACTER LO LING (THAI LETTER LO LING) */ + ["\u0E26", "\u0E26"], /* THAI CHARACTER LU (THAI LETTER LU) */ + ["\u0E27", "\u0E27"], /* THAI CHARACTER WO WAEN (THAI LETTER WO WAEN) */ + ["\u0E28", "\u0E28"], /* THAI CHARACTER SO SALA (THAI LETTER SO SALA) */ + ["\u0E29", "\u0E29"], /* THAI CHARACTER SO RUSI (THAI LETTER SO RUSI) */ + ["\u0E2A", "\u0E2A"], /* THAI CHARACTER SO SUA (THAI LETTER SO SUA) */ + ["\u0E2B", "\u0E2B"], /* THAI CHARACTER HO HIP (THAI LETTER HO HIP) */ + ["\u0E2C", "\u0E2C"], /* THAI CHARACTER LO CHULA (THAI LETTER LO CHULA) */ + ["\u0E2D", "\u0E2D"], /* THAI CHARACTER O ANG (THAI LETTER O ANG) */ + ["\u0E2E", "\u0E2E"], /* THAI CHARACTER HO NOKHUK (THAI LETTER HO NOK HUK) */ + ["\u0E2F", "\u0E2F"], /* THAI CHARACTER PAIYANNOI (THAI PAI YAN NOI) */ + ["\u0E30", "\u0E30"], /* THAI CHARACTER SARA A (THAI VOWEL SIGN SARA A) */ + ["\u0E31", "\u0E31"], /* THAI CHARACTER MAI HAN-AKAT (THAI VOWEL SIGN MAI HAN-AKAT) */ + ["\u0E32", "\u0E32"], /* THAI CHARACTER SARA AA (THAI VOWEL SIGN SARA AA) */ + ["\u0E33", "\u0E33"], /* THAI CHARACTER SARA AM (THAI VOWEL SIGN SARA AM) */ + ["\u0E34", "\u0E34"], /* THAI CHARACTER SARA I (THAI VOWEL SIGN SARA I) */ + ["\u0E35", "\u0E35"], /* THAI CHARACTER SARA II (THAI VOWEL SIGN SARA II) */ + ["\u0E36", "\u0E36"], /* THAI CHARACTER SARA UE (THAI VOWEL SIGN SARA UE) */ + ["\u0E37", "\u0E37"], /* THAI CHARACTER SARA UEE (THAI VOWEL SIGN SARA UEE) */ + ["\u0E38", "\u0E38"], /* THAI CHARACTER SARA U (THAI VOWEL SIGN SARA U) */ + ["\u0E39", "\u0E39"], /* THAI CHARACTER SARA UU (THAI VOWEL SIGN SARA UU) */ + ["\u0E3A", "\u0E3A"], /* THAI CHARACTER PHINTHU (THAI VOWEL SIGN PHINTHU) */ + ["\u0E3B", "\u0E3B"], + ["\u0E3C", "\u0E3C"], + ["\u0E3D", "\u0E3D"], + ["\u0E3E", "\u0E3E"], + ["\u0E3F", "\u0E3F"], /* THAI CURRENCY SYMBOL BAHT (THAI BAHT SIGN) */ + ["\u0E40", "\u0E40"], /* THAI CHARACTER SARA E (THAI VOWEL SIGN SARA E) */ + ["\u0E41", "\u0E41"], /* THAI CHARACTER SARA AE (THAI VOWEL SIGN SARA AE) */ + ["\u0E42", "\u0E42"], /* THAI CHARACTER SARA O (THAI VOWEL SIGN SARA O) */ + ["\u0E43", "\u0E43"], /* THAI CHARACTER SARA AI MAIMUAN (THAI VOWEL SIGN SARA MAI MUAN) */ + ["\u0E44", "\u0E44"], /* THAI CHARACTER SARA AI MAIMALAI (THAI VOWEL SIGN SARA MAI MALAI) */ + ["\u0E45", "\u0E45"], /* THAI CHARACTER LAKKHANGYAO (THAI LAK KHANG YAO) */ + ["\u0E46", "\u0E46"], /* THAI CHARACTER MAIYAMOK (THAI MAI YAMOK) */ + ["\u0E47", "\u0E47"], /* THAI CHARACTER MAITAIKHU (THAI VOWEL SIGN MAI TAI KHU) */ + ["\u0E48", "\u0E48"], /* THAI CHARACTER MAI EK (THAI TONE MAI EK) */ + ["\u0E49", "\u0E49"], /* THAI CHARACTER MAI THO (THAI TONE MAI THO) */ + ["\u0E4A", "\u0E4A"], /* THAI CHARACTER MAI TRI (THAI TONE MAI TRI) */ + ["\u0E4B", "\u0E4B"], /* THAI CHARACTER MAI CHATTAWA (THAI TONE MAI CHATTAWA) */ + ["\u0E4C", "\u0E4C"], /* THAI CHARACTER THANTHAKHAT (THAI THANTHAKHAT) */ + ["\u0E4D", "\u0E4D"], /* THAI CHARACTER NIKHAHIT (THAI NIKKHAHIT) */ + ["\u0E4E", "\u0E4E"], /* THAI CHARACTER YAMAKKAN (THAI YAMAKKAN) */ + ["\u0E4F", "\u0E4F"], /* THAI CHARACTER FONGMAN (THAI FONGMAN) */ + ["\u0E50", "\u0E50"], /* THAI DIGIT ZERO */ + ["\u0E51", "\u0E51"], /* THAI DIGIT ONE */ + ["\u0E52", "\u0E52"], /* THAI DIGIT TWO */ + ["\u0E53", "\u0E53"], /* THAI DIGIT THREE */ + ["\u0E54", "\u0E54"], /* THAI DIGIT FOUR */ + ["\u0E55", "\u0E55"], /* THAI DIGIT FIVE */ + ["\u0E56", "\u0E56"], /* THAI DIGIT SIX */ + ["\u0E57", "\u0E57"], /* THAI DIGIT SEVEN */ + ["\u0E58", "\u0E58"], /* THAI DIGIT EIGHT */ + ["\u0E59", "\u0E59"], /* THAI DIGIT NINE */ + ["\u0E5A", "\u0E5A"], /* THAI CHARACTER ANGKHANKHU (THAI ANGKHANKHU) */ + ["\u0E5B", "\u0E5B"], /* THAI CHARACTER KHOMUT (THAI KHOMUT) */ + ["\u0E5C", "\u0E5C"], + ["\u0E5D", "\u0E5D"], + ["\u0E5E", "\u0E5E"], + ["\u0E5F", "\u0E5F"], + ["\u0E60", "\u0E60"], + ["\u0E61", "\u0E61"], + ["\u0E62", "\u0E62"], + ["\u0E63", "\u0E63"], + ["\u0E64", "\u0E64"], + ["\u0E65", "\u0E65"], + ["\u0E66", "\u0E66"], + ["\u0E67", "\u0E67"], + ["\u0E68", "\u0E68"], + ["\u0E69", "\u0E69"], + ["\u0E6A", "\u0E6A"], + ["\u0E6B", "\u0E6B"], + ["\u0E6C", "\u0E6C"], + ["\u0E6D", "\u0E6D"], + ["\u0E6E", "\u0E6E"], + ["\u0E6F", "\u0E6F"], + ["\u0E70", "\u0E70"], + ["\u0E71", "\u0E71"], + ["\u0E72", "\u0E72"], + ["\u0E73", "\u0E73"], + ["\u0E74", "\u0E74"], + ["\u0E75", "\u0E75"], + ["\u0E76", "\u0E76"], + ["\u0E77", "\u0E77"], + ["\u0E78", "\u0E78"], + ["\u0E79", "\u0E79"], + ["\u0E7A", "\u0E7A"], + ["\u0E7B", "\u0E7B"], + ["\u0E7C", "\u0E7C"], + ["\u0E7D", "\u0E7D"], + ["\u0E7E", "\u0E7E"], + ["\u0E7F", "\u0E7F"], + ["\u0E80", "\u0E80"], + ["\u0E81", "\u0E81"], /* LAO LETTER KO */ + ["\u0E82", "\u0E82"], /* LAO LETTER KHO SUNG */ + ["\u0E83", "\u0E83"], + ["\u0E84", "\u0E84"], /* LAO LETTER KHO TAM */ + ["\u0E85", "\u0E85"], + ["\u0E86", "\u0E86"], /* LAO LETTER PALI GHA */ + ["\u0E87", "\u0E87"], /* LAO LETTER NGO */ + ["\u0E88", "\u0E88"], /* LAO LETTER CO */ + ["\u0E89", "\u0E89"], /* LAO LETTER PALI CHA */ + ["\u0E8A", "\u0E8A"], /* LAO LETTER SO TAM */ + ["\u0E8B", "\u0E8B"], + ["\u0E8C", "\u0E8C"], /* LAO LETTER PALI JHA */ + ["\u0E8D", "\u0E8D"], /* LAO LETTER NYO */ + ["\u0E8E", "\u0E8E"], /* LAO LETTER PALI NYA */ + ["\u0E8F", "\u0E8F"], /* LAO LETTER PALI TTA */ + ["\u0E90", "\u0E90"], /* LAO LETTER PALI TTHA */ + ["\u0E91", "\u0E91"], /* LAO LETTER PALI DDA */ + ["\u0E92", "\u0E92"], /* LAO LETTER PALI DDHA */ + ["\u0E93", "\u0E93"], /* LAO LETTER PALI NNA */ + ["\u0E94", "\u0E94"], /* LAO LETTER DO */ + ["\u0E95", "\u0E95"], /* LAO LETTER TO */ + ["\u0E96", "\u0E96"], /* LAO LETTER THO SUNG */ + ["\u0E97", "\u0E97"], /* LAO LETTER THO TAM */ + ["\u0E98", "\u0E98"], /* LAO LETTER PALI DHA */ + ["\u0E99", "\u0E99"], /* LAO LETTER NO */ + ["\u0E9A", "\u0E9A"], /* LAO LETTER BO */ + ["\u0E9B", "\u0E9B"], /* LAO LETTER PO */ + ["\u0E9C", "\u0E9C"], /* LAO LETTER PHO SUNG */ + ["\u0E9D", "\u0E9D"], /* LAO LETTER FO TAM */ + ["\u0E9E", "\u0E9E"], /* LAO LETTER PHO TAM */ + ["\u0E9F", "\u0E9F"], /* LAO LETTER FO SUNG */ + ["\u0EA0", "\u0EA0"], /* LAO LETTER PALI BHA */ + ["\u0EA1", "\u0EA1"], /* LAO LETTER MO */ + ["\u0EA2", "\u0EA2"], /* LAO LETTER YO */ + ["\u0EA3", "\u0EA3"], /* LAO LETTER LO LING */ + ["\u0EA4", "\u0EA4"], + ["\u0EA5", "\u0EA5"], /* LAO LETTER LO LOOT */ + ["\u0EA6", "\u0EA6"], + ["\u0EA7", "\u0EA7"], /* LAO LETTER WO */ + ["\u0EA8", "\u0EA8"], /* LAO LETTER SANSKRIT SHA */ + ["\u0EA9", "\u0EA9"], /* LAO LETTER SANSKRIT SSA */ + ["\u0EAA", "\u0EAA"], /* LAO LETTER SO SUNG */ + ["\u0EAB", "\u0EAB"], /* LAO LETTER HO SUNG */ + ["\u0EAC", "\u0EAC"], /* LAO LETTER PALI LLA */ + ["\u0EAD", "\u0EAD"], /* LAO LETTER O */ + ["\u0EAE", "\u0EAE"], /* LAO LETTER HO TAM */ + ["\u0EAF", "\u0EAF"], /* LAO ELLIPSIS */ + ["\u0EB0", "\u0EB0"], /* LAO VOWEL SIGN A */ + ["\u0EB1", "\u0EB1"], /* LAO VOWEL SIGN MAI KAN */ + ["\u0EB2", "\u0EB2"], /* LAO VOWEL SIGN AA */ + ["\u0EB3", "\u0EB3"], /* LAO VOWEL SIGN AM */ + ["\u0EB4", "\u0EB4"], /* LAO VOWEL SIGN I */ + ["\u0EB5", "\u0EB5"], /* LAO VOWEL SIGN II */ + ["\u0EB6", "\u0EB6"], /* LAO VOWEL SIGN Y */ + ["\u0EB7", "\u0EB7"], /* LAO VOWEL SIGN YY */ + ["\u0EB8", "\u0EB8"], /* LAO VOWEL SIGN U */ + ["\u0EB9", "\u0EB9"], /* LAO VOWEL SIGN UU */ + ["\u0EBA", "\u0EBA"], /* LAO SIGN PALI VIRAMA */ + ["\u0EBB", "\u0EBB"], /* LAO VOWEL SIGN MAI KON */ + ["\u0EBC", "\u0EBC"], /* LAO SEMIVOWEL SIGN LO */ + ["\u0EBD", "\u0EBD"], /* LAO SEMIVOWEL SIGN NYO */ + ["\u0EBE", "\u0EBE"], + ["\u0EBF", "\u0EBF"], + ["\u0EC0", "\u0EC0"], /* LAO VOWEL SIGN E */ + ["\u0EC1", "\u0EC1"], /* LAO VOWEL SIGN EI */ + ["\u0EC2", "\u0EC2"], /* LAO VOWEL SIGN O */ + ["\u0EC3", "\u0EC3"], /* LAO VOWEL SIGN AY */ + ["\u0EC4", "\u0EC4"], /* LAO VOWEL SIGN AI */ + ["\u0EC5", "\u0EC5"], + ["\u0EC6", "\u0EC6"], /* LAO KO LA */ + ["\u0EC7", "\u0EC7"], + ["\u0EC8", "\u0EC8"], /* LAO TONE MAI EK */ + ["\u0EC9", "\u0EC9"], /* LAO TONE MAI THO */ + ["\u0ECA", "\u0ECA"], /* LAO TONE MAI TI */ + ["\u0ECB", "\u0ECB"], /* LAO TONE MAI CATAWA */ + ["\u0ECC", "\u0ECC"], /* LAO CANCELLATION MARK */ + ["\u0ECD", "\u0ECD"], /* LAO NIGGAHITA */ + ["\u0ECE", "\u0ECE"], /* LAO YAMAKKAN */ + ["\u0ECF", "\u0ECF"], + ["\u0ED0", "\u0ED0"], /* LAO DIGIT ZERO */ + ["\u0ED1", "\u0ED1"], /* LAO DIGIT ONE */ + ["\u0ED2", "\u0ED2"], /* LAO DIGIT TWO */ + ["\u0ED3", "\u0ED3"], /* LAO DIGIT THREE */ + ["\u0ED4", "\u0ED4"], /* LAO DIGIT FOUR */ + ["\u0ED5", "\u0ED5"], /* LAO DIGIT FIVE */ + ["\u0ED6", "\u0ED6"], /* LAO DIGIT SIX */ + ["\u0ED7", "\u0ED7"], /* LAO DIGIT SEVEN */ + ["\u0ED8", "\u0ED8"], /* LAO DIGIT EIGHT */ + ["\u0ED9", "\u0ED9"], /* LAO DIGIT NINE */ + ["\u0EDA", "\u0EDA"], + ["\u0EDB", "\u0EDB"], + ["\u0EDC", "\u0EDC"], /* LAO HO NO */ + ["\u0EDD", "\u0EDD"], /* LAO HO MO */ + ["\u0EDE", "\u0EDE"], /* LAO LETTER KHMU GO */ + ["\u0EDF", "\u0EDF"], /* LAO LETTER KHMU NYO */ + ["\u0EE0", "\u0EE0"], + ["\u0EE1", "\u0EE1"], + ["\u0EE2", "\u0EE2"], + ["\u0EE3", "\u0EE3"], + ["\u0EE4", "\u0EE4"], + ["\u0EE5", "\u0EE5"], + ["\u0EE6", "\u0EE6"], + ["\u0EE7", "\u0EE7"], + ["\u0EE8", "\u0EE8"], + ["\u0EE9", "\u0EE9"], + ["\u0EEA", "\u0EEA"], + ["\u0EEB", "\u0EEB"], + ["\u0EEC", "\u0EEC"], + ["\u0EED", "\u0EED"], + ["\u0EEE", "\u0EEE"], + ["\u0EEF", "\u0EEF"], + ["\u0EF0", "\u0EF0"], + ["\u0EF1", "\u0EF1"], + ["\u0EF2", "\u0EF2"], + ["\u0EF3", "\u0EF3"], + ["\u0EF4", "\u0EF4"], + ["\u0EF5", "\u0EF5"], + ["\u0EF6", "\u0EF6"], + ["\u0EF7", "\u0EF7"], + ["\u0EF8", "\u0EF8"], + ["\u0EF9", "\u0EF9"], + ["\u0EFA", "\u0EFA"], + ["\u0EFB", "\u0EFB"], + ["\u0EFC", "\u0EFC"], + ["\u0EFD", "\u0EFD"], + ["\u0EFE", "\u0EFE"], + ["\u0EFF", "\u0EFF"], + ["\u0F00", "\u0F00"], /* TIBETAN SYLLABLE OM */ + ["\u0F01", "\u0F01"], /* TIBETAN MARK GTER YIG MGO TRUNCATED A */ + ["\u0F02", "\u0F02"], /* TIBETAN MARK GTER YIG MGO -UM RNAM BCAD MA */ + ["\u0F03", "\u0F03"], /* TIBETAN MARK GTER YIG MGO -UM GTER TSHEG MA */ + ["\u0F04", "\u0F04"], /* TIBETAN MARK INITIAL YIG MGO MDUN MA (TIBETAN SINGLE ORNAMENT) */ + ["\u0F05", "\u0F05"], /* TIBETAN MARK CLOSING YIG MGO SGAB MA */ + ["\u0F06", "\u0F06"], /* TIBETAN MARK CARET YIG MGO PHUR SHAD MA */ + ["\u0F07", "\u0F07"], /* TIBETAN MARK YIG MGO TSHEG SHAD MA */ + ["\u0F08", "\u0F08"], /* TIBETAN MARK SBRUL SHAD (TIBETAN RGYANSHAD) */ + ["\u0F09", "\u0F09"], /* TIBETAN MARK BSKUR YIG MGO */ + ["\u0F0A", "\u0F0A"], /* TIBETAN MARK BKA- SHOG YIG MGO */ + ["\u0F0B", "\u0F0B"], /* TIBETAN MARK INTERSYLLABIC TSHEG (TIBETAN TSEG) */ + ["\u0F0C", "\u0F0C"], /* TIBETAN MARK DELIMITER TSHEG BSTAR */ + ["\u0F0D", "\u0F0D"], /* TIBETAN MARK SHAD (TIBETAN SHAD) */ + ["\u0F0E", "\u0F0E"], /* TIBETAN MARK NYIS SHAD (TIBETAN DOUBLE SHAD) */ + ["\u0F0F", "\u0F0F"], /* TIBETAN MARK TSHEG SHAD */ + ["\u0F10", "\u0F10"], /* TIBETAN MARK NYIS TSHEG SHAD */ + ["\u0F11", "\u0F11"], /* TIBETAN MARK RIN CHEN SPUNGS SHAD (TIBETAN RINCHANPHUNGSHAD) */ + ["\u0F12", "\u0F12"], /* TIBETAN MARK RGYA GRAM SHAD */ + ["\u0F13", "\u0F13"], /* TIBETAN MARK CARET -DZUD RTAGS ME LONG CAN */ + ["\u0F14", "\u0F14"], /* TIBETAN MARK GTER TSHEG (TIBETAN COMMA) */ + ["\u0F15", "\u0F15"], /* TIBETAN LOGOTYPE SIGN CHAD RTAGS */ + ["\u0F16", "\u0F16"], /* TIBETAN LOGOTYPE SIGN LHAG RTAGS */ + ["\u0F17", "\u0F17"], /* TIBETAN ASTROLOGICAL SIGN SGRA GCAN -CHAR RTAGS */ + ["\u0F18", "\u0F18"], /* TIBETAN ASTROLOGICAL SIGN -KHYUD PA */ + ["\u0F19", "\u0F19"], /* TIBETAN ASTROLOGICAL SIGN SDONG TSHUGS */ + ["\u0F1A", "\u0F1A"], /* TIBETAN SIGN RDEL DKAR GCIG */ + ["\u0F1B", "\u0F1B"], /* TIBETAN SIGN RDEL DKAR GNYIS */ + ["\u0F1C", "\u0F1C"], /* TIBETAN SIGN RDEL DKAR GSUM */ + ["\u0F1D", "\u0F1D"], /* TIBETAN SIGN RDEL NAG GCIG */ + ["\u0F1E", "\u0F1E"], /* TIBETAN SIGN RDEL NAG GNYIS */ + ["\u0F1F", "\u0F1F"], /* TIBETAN SIGN RDEL DKAR RDEL NAG */ + ["\u0F20", "\u0F20"], /* TIBETAN DIGIT ZERO */ + ["\u0F21", "\u0F21"], /* TIBETAN DIGIT ONE */ + ["\u0F22", "\u0F22"], /* TIBETAN DIGIT TWO */ + ["\u0F23", "\u0F23"], /* TIBETAN DIGIT THREE */ + ["\u0F24", "\u0F24"], /* TIBETAN DIGIT FOUR */ + ["\u0F25", "\u0F25"], /* TIBETAN DIGIT FIVE */ + ["\u0F26", "\u0F26"], /* TIBETAN DIGIT SIX */ + ["\u0F27", "\u0F27"], /* TIBETAN DIGIT SEVEN */ + ["\u0F28", "\u0F28"], /* TIBETAN DIGIT EIGHT */ + ["\u0F29", "\u0F29"], /* TIBETAN DIGIT NINE */ + ["\u0F2A", "\u0F2A"], /* TIBETAN DIGIT HALF ONE */ + ["\u0F2B", "\u0F2B"], /* TIBETAN DIGIT HALF TWO */ + ["\u0F2C", "\u0F2C"], /* TIBETAN DIGIT HALF THREE */ + ["\u0F2D", "\u0F2D"], /* TIBETAN DIGIT HALF FOUR */ + ["\u0F2E", "\u0F2E"], /* TIBETAN DIGIT HALF FIVE */ + ["\u0F2F", "\u0F2F"], /* TIBETAN DIGIT HALF SIX */ + ["\u0F30", "\u0F30"], /* TIBETAN DIGIT HALF SEVEN */ + ["\u0F31", "\u0F31"], /* TIBETAN DIGIT HALF EIGHT */ + ["\u0F32", "\u0F32"], /* TIBETAN DIGIT HALF NINE */ + ["\u0F33", "\u0F33"], /* TIBETAN DIGIT HALF ZERO */ + ["\u0F34", "\u0F34"], /* TIBETAN MARK BSDUS RTAGS */ + ["\u0F35", "\u0F35"], /* TIBETAN MARK NGAS BZUNG NYI ZLA (TIBETAN HONORIFIC UNDER RING) */ + ["\u0F36", "\u0F36"], /* TIBETAN MARK CARET -DZUD RTAGS BZHI MIG CAN */ + ["\u0F37", "\u0F37"], /* TIBETAN MARK NGAS BZUNG SGOR RTAGS (TIBETAN UNDER RING) */ + ["\u0F38", "\u0F38"], /* TIBETAN MARK CHE MGO */ + ["\u0F39", "\u0F39"], /* TIBETAN MARK TSA -PHRU (TIBETAN LENITION MARK) */ + ["\u0F3A", "\u0F3A"], /* TIBETAN MARK GUG RTAGS GYON */ + ["\u0F3B", "\u0F3B"], /* TIBETAN MARK GUG RTAGS GYAS */ + ["\u0F3C", "\u0F3C"], /* TIBETAN MARK ANG KHANG GYON (TIBETAN LEFT BRACE) */ + ["\u0F3D", "\u0F3D"], /* TIBETAN MARK ANG KHANG GYAS (TIBETAN RIGHT BRACE) */ + ["\u0F3E", "\u0F3E"], /* TIBETAN SIGN YAR TSHES */ + ["\u0F3F", "\u0F3F"], /* TIBETAN SIGN MAR TSHES */ + ["\u0F40", "\u0F40"], /* TIBETAN LETTER KA */ + ["\u0F41", "\u0F41"], /* TIBETAN LETTER KHA */ + ["\u0F42", "\u0F42"], /* TIBETAN LETTER GA */ + ["\u0F43", "\u0F43"], /* TIBETAN LETTER GHA */ + ["\u0F44", "\u0F44"], /* TIBETAN LETTER NGA */ + ["\u0F45", "\u0F45"], /* TIBETAN LETTER CA */ + ["\u0F46", "\u0F46"], /* TIBETAN LETTER CHA */ + ["\u0F47", "\u0F47"], /* TIBETAN LETTER JA */ + ["\u0F48", "\u0F48"], + ["\u0F49", "\u0F49"], /* TIBETAN LETTER NYA */ + ["\u0F4A", "\u0F4A"], /* TIBETAN LETTER TTA (TIBETAN LETTER REVERSED TA) */ + ["\u0F4B", "\u0F4B"], /* TIBETAN LETTER TTHA (TIBETAN LETTER REVERSED THA) */ + ["\u0F4C", "\u0F4C"], /* TIBETAN LETTER DDA (TIBETAN LETTER REVERSED DA) */ + ["\u0F4D", "\u0F4D"], /* TIBETAN LETTER DDHA */ + ["\u0F4E", "\u0F4E"], /* TIBETAN LETTER NNA (TIBETAN LETTER REVERSED NA) */ + ["\u0F4F", "\u0F4F"], /* TIBETAN LETTER TA */ + ["\u0F50", "\u0F50"], /* TIBETAN LETTER THA */ + ["\u0F51", "\u0F51"], /* TIBETAN LETTER DA */ + ["\u0F52", "\u0F52"], /* TIBETAN LETTER DHA */ + ["\u0F53", "\u0F53"], /* TIBETAN LETTER NA */ + ["\u0F54", "\u0F54"], /* TIBETAN LETTER PA */ + ["\u0F55", "\u0F55"], /* TIBETAN LETTER PHA */ + ["\u0F56", "\u0F56"], /* TIBETAN LETTER BA */ + ["\u0F57", "\u0F57"], /* TIBETAN LETTER BHA */ + ["\u0F58", "\u0F58"], /* TIBETAN LETTER MA */ + ["\u0F59", "\u0F59"], /* TIBETAN LETTER TSA */ + ["\u0F5A", "\u0F5A"], /* TIBETAN LETTER TSHA */ + ["\u0F5B", "\u0F5B"], /* TIBETAN LETTER DZA */ + ["\u0F5C", "\u0F5C"], /* TIBETAN LETTER DZHA */ + ["\u0F5D", "\u0F5D"], /* TIBETAN LETTER WA */ + ["\u0F5E", "\u0F5E"], /* TIBETAN LETTER ZHA */ + ["\u0F5F", "\u0F5F"], /* TIBETAN LETTER ZA */ + ["\u0F60", "\u0F60"], /* TIBETAN LETTER -A (TIBETAN LETTER AA) */ + ["\u0F61", "\u0F61"], /* TIBETAN LETTER YA */ + ["\u0F62", "\u0F62"], /* TIBETAN LETTER RA */ + ["\u0F63", "\u0F63"], /* TIBETAN LETTER LA */ + ["\u0F64", "\u0F64"], /* TIBETAN LETTER SHA */ + ["\u0F65", "\u0F65"], /* TIBETAN LETTER SSA (TIBETAN LETTER REVERSED SHA) */ + ["\u0F66", "\u0F66"], /* TIBETAN LETTER SA */ + ["\u0F67", "\u0F67"], /* TIBETAN LETTER HA */ + ["\u0F68", "\u0F68"], /* TIBETAN LETTER A */ + ["\u0F69", "\u0F69"], /* TIBETAN LETTER KSSA */ + ["\u0F6A", "\u0F6A"], /* TIBETAN LETTER FIXED-FORM RA */ + ["\u0F6B", "\u0F6B"], /* TIBETAN LETTER KKA */ + ["\u0F6C", "\u0F6C"], /* TIBETAN LETTER RRA */ + ["\u0F6D", "\u0F6D"], + ["\u0F6E", "\u0F6E"], + ["\u0F6F", "\u0F6F"], + ["\u0F70", "\u0F70"], + ["\u0F71", "\u0F71"], /* TIBETAN VOWEL SIGN AA */ + ["\u0F72", "\u0F72"], /* TIBETAN VOWEL SIGN I */ + ["\u0F73", "\u0F73"], /* TIBETAN VOWEL SIGN II */ + ["\u0F74", "\u0F74"], /* TIBETAN VOWEL SIGN U */ + ["\u0F75", "\u0F75"], /* TIBETAN VOWEL SIGN UU */ + ["\u0F76", "\u0F76"], /* TIBETAN VOWEL SIGN VOCALIC R */ + ["\u0F77", "\u0F77"], /* TIBETAN VOWEL SIGN VOCALIC RR */ + ["\u0F78", "\u0F78"], /* TIBETAN VOWEL SIGN VOCALIC L */ + ["\u0F79", "\u0F79"], /* TIBETAN VOWEL SIGN VOCALIC LL */ + ["\u0F7A", "\u0F7A"], /* TIBETAN VOWEL SIGN E */ + ["\u0F7B", "\u0F7B"], /* TIBETAN VOWEL SIGN EE (TIBETAN VOWEL SIGN AI) */ + ["\u0F7C", "\u0F7C"], /* TIBETAN VOWEL SIGN O */ + ["\u0F7D", "\u0F7D"], /* TIBETAN VOWEL SIGN OO (TIBETAN VOWEL SIGN AU) */ + ["\u0F7E", "\u0F7E"], /* TIBETAN SIGN RJES SU NGA RO (TIBETAN ANUSVARA) */ + ["\u0F7F", "\u0F7F"], /* TIBETAN SIGN RNAM BCAD (TIBETAN VISARGA) */ + ["\u0F80", "\u0F80"], /* TIBETAN VOWEL SIGN REVERSED I (TIBETAN VOWEL SIGN SHORT I) */ + ["\u0F81", "\u0F81"], /* TIBETAN VOWEL SIGN REVERSED II */ + ["\u0F82", "\u0F82"], /* TIBETAN SIGN NYI ZLA NAA DA (TIBETAN CANDRABINDU WITH ORNAMENT) */ + ["\u0F83", "\u0F83"], /* TIBETAN SIGN SNA LDAN (TIBETAN CANDRABINDU) */ + ["\u0F84", "\u0F84"], /* TIBETAN MARK HALANTA (TIBETAN VIRAMA) */ + ["\u0F85", "\u0F85"], /* TIBETAN MARK PALUTA (TIBETAN CHUCHENYIGE) */ + ["\u0F86", "\u0F86"], /* TIBETAN SIGN LCI RTAGS */ + ["\u0F87", "\u0F87"], /* TIBETAN SIGN YANG RTAGS */ + ["\u0F88", "\u0F88"], /* TIBETAN SIGN LCE TSA CAN */ + ["\u0F89", "\u0F89"], /* TIBETAN SIGN MCHU CAN */ + ["\u0F8A", "\u0F8A"], /* TIBETAN SIGN GRU CAN RGYINGS */ + ["\u0F8B", "\u0F8B"], /* TIBETAN SIGN GRU MED RGYINGS */ + ["\u0F8C", "\u0F8C"], /* TIBETAN SIGN INVERTED MCHU CAN */ + ["\u0F8D", "\u0F8D"], /* TIBETAN SUBJOINED SIGN LCE TSA CAN */ + ["\u0F8E", "\u0F8E"], /* TIBETAN SUBJOINED SIGN MCHU CAN */ + ["\u0F8F", "\u0F8F"], /* TIBETAN SUBJOINED SIGN INVERTED MCHU CAN */ + ["\u0F90", "\u0F90"], /* TIBETAN SUBJOINED LETTER KA */ + ["\u0F91", "\u0F91"], /* TIBETAN SUBJOINED LETTER KHA */ + ["\u0F92", "\u0F92"], /* TIBETAN SUBJOINED LETTER GA */ + ["\u0F93", "\u0F93"], /* TIBETAN SUBJOINED LETTER GHA */ + ["\u0F94", "\u0F94"], /* TIBETAN SUBJOINED LETTER NGA */ + ["\u0F95", "\u0F95"], /* TIBETAN SUBJOINED LETTER CA */ + ["\u0F96", "\u0F96"], /* TIBETAN SUBJOINED LETTER CHA */ + ["\u0F97", "\u0F97"], /* TIBETAN SUBJOINED LETTER JA */ + ["\u0F98", "\u0F98"], + ["\u0F99", "\u0F99"], /* TIBETAN SUBJOINED LETTER NYA */ + ["\u0F9A", "\u0F9A"], /* TIBETAN SUBJOINED LETTER TTA */ + ["\u0F9B", "\u0F9B"], /* TIBETAN SUBJOINED LETTER TTHA */ + ["\u0F9C", "\u0F9C"], /* TIBETAN SUBJOINED LETTER DDA */ + ["\u0F9D", "\u0F9D"], /* TIBETAN SUBJOINED LETTER DDHA */ + ["\u0F9E", "\u0F9E"], /* TIBETAN SUBJOINED LETTER NNA */ + ["\u0F9F", "\u0F9F"], /* TIBETAN SUBJOINED LETTER TA */ + ["\u0FA0", "\u0FA0"], /* TIBETAN SUBJOINED LETTER THA */ + ["\u0FA1", "\u0FA1"], /* TIBETAN SUBJOINED LETTER DA */ + ["\u0FA2", "\u0FA2"], /* TIBETAN SUBJOINED LETTER DHA */ + ["\u0FA3", "\u0FA3"], /* TIBETAN SUBJOINED LETTER NA */ + ["\u0FA4", "\u0FA4"], /* TIBETAN SUBJOINED LETTER PA */ + ["\u0FA5", "\u0FA5"], /* TIBETAN SUBJOINED LETTER PHA */ + ["\u0FA6", "\u0FA6"], /* TIBETAN SUBJOINED LETTER BA */ + ["\u0FA7", "\u0FA7"], /* TIBETAN SUBJOINED LETTER BHA */ + ["\u0FA8", "\u0FA8"], /* TIBETAN SUBJOINED LETTER MA */ + ["\u0FA9", "\u0FA9"], /* TIBETAN SUBJOINED LETTER TSA */ + ["\u0FAA", "\u0FAA"], /* TIBETAN SUBJOINED LETTER TSHA */ + ["\u0FAB", "\u0FAB"], /* TIBETAN SUBJOINED LETTER DZA */ + ["\u0FAC", "\u0FAC"], /* TIBETAN SUBJOINED LETTER DZHA */ + ["\u0FAD", "\u0FAD"], /* TIBETAN SUBJOINED LETTER WA */ + ["\u0FAE", "\u0FAE"], /* TIBETAN SUBJOINED LETTER ZHA */ + ["\u0FAF", "\u0FAF"], /* TIBETAN SUBJOINED LETTER ZA */ + ["\u0FB0", "\u0FB0"], /* TIBETAN SUBJOINED LETTER -A */ + ["\u0FB1", "\u0FB1"], /* TIBETAN SUBJOINED LETTER YA */ + ["\u0FB2", "\u0FB2"], /* TIBETAN SUBJOINED LETTER RA */ + ["\u0FB3", "\u0FB3"], /* TIBETAN SUBJOINED LETTER LA */ + ["\u0FB4", "\u0FB4"], /* TIBETAN SUBJOINED LETTER SHA */ + ["\u0FB5", "\u0FB5"], /* TIBETAN SUBJOINED LETTER SSA */ + ["\u0FB6", "\u0FB6"], /* TIBETAN SUBJOINED LETTER SA */ + ["\u0FB7", "\u0FB7"], /* TIBETAN SUBJOINED LETTER HA */ + ["\u0FB8", "\u0FB8"], /* TIBETAN SUBJOINED LETTER A */ + ["\u0FB9", "\u0FB9"], /* TIBETAN SUBJOINED LETTER KSSA */ + ["\u0FBA", "\u0FBA"], /* TIBETAN SUBJOINED LETTER FIXED-FORM WA */ + ["\u0FBB", "\u0FBB"], /* TIBETAN SUBJOINED LETTER FIXED-FORM YA */ + ["\u0FBC", "\u0FBC"], /* TIBETAN SUBJOINED LETTER FIXED-FORM RA */ + ["\u0FBD", "\u0FBD"], + ["\u0FBE", "\u0FBE"], /* TIBETAN KU RU KHA */ + ["\u0FBF", "\u0FBF"], /* TIBETAN KU RU KHA BZHI MIG CAN */ + ["\u0FC0", "\u0FC0"], /* TIBETAN CANTILLATION SIGN HEAVY BEAT */ + ["\u0FC1", "\u0FC1"], /* TIBETAN CANTILLATION SIGN LIGHT BEAT */ + ["\u0FC2", "\u0FC2"], /* TIBETAN CANTILLATION SIGN CANG TE-U */ + ["\u0FC3", "\u0FC3"], /* TIBETAN CANTILLATION SIGN SBUB -CHAL */ + ["\u0FC4", "\u0FC4"], /* TIBETAN SYMBOL DRIL BU */ + ["\u0FC5", "\u0FC5"], /* TIBETAN SYMBOL RDO RJE */ + ["\u0FC6", "\u0FC6"], /* TIBETAN SYMBOL PADMA GDAN */ + ["\u0FC7", "\u0FC7"], /* TIBETAN SYMBOL RDO RJE RGYA GRAM */ + ["\u0FC8", "\u0FC8"], /* TIBETAN SYMBOL PHUR PA */ + ["\u0FC9", "\u0FC9"], /* TIBETAN SYMBOL NOR BU */ + ["\u0FCA", "\u0FCA"], /* TIBETAN SYMBOL NOR BU NYIS -KHYIL */ + ["\u0FCB", "\u0FCB"], /* TIBETAN SYMBOL NOR BU GSUM -KHYIL */ + ["\u0FCC", "\u0FCC"], /* TIBETAN SYMBOL NOR BU BZHI -KHYIL */ + ["\u0FCD", "\u0FCD"], + ["\u0FCE", "\u0FCE"], /* TIBETAN SIGN RDEL NAG RDEL DKAR */ + ["\u0FCF", "\u0FCF"], /* TIBETAN SIGN RDEL NAG GSUM */ + ["\u0FD0", "\u0FD0"], /* TIBETAN MARK BSKA- SHOG GI MGO RGYAN */ + ["\u0FD1", "\u0FD1"], /* TIBETAN MARK MNYAM YIG GI MGO RGYAN */ + ["\u0FD2", "\u0FD2"], /* TIBETAN MARK NYIS TSHEG */ + ["\u0FD3", "\u0FD3"], /* TIBETAN MARK INITIAL BRDA RNYING YIG MGO MDUN MA */ + ["\u0FD4", "\u0FD4"], /* TIBETAN MARK CLOSING BRDA RNYING YIG MGO SGAB MA */ + ["\u0FD5", "\u0FD5"], /* RIGHT-FACING SVASTI SIGN */ + ["\u0FD6", "\u0FD6"], /* LEFT-FACING SVASTI SIGN */ + ["\u0FD7", "\u0FD7"], /* RIGHT-FACING SVASTI SIGN WITH DOTS */ + ["\u0FD8", "\u0FD8"], /* LEFT-FACING SVASTI SIGN WITH DOTS */ + ["\u0FD9", "\u0FD9"], /* TIBETAN MARK LEADING MCHAN RTAGS */ + ["\u0FDA", "\u0FDA"], /* TIBETAN MARK TRAILING MCHAN RTAGS */ + ["\u0FDB", "\u0FDB"], + ["\u0FDC", "\u0FDC"], + ["\u0FDD", "\u0FDD"], + ["\u0FDE", "\u0FDE"], + ["\u0FDF", "\u0FDF"], + ["\u0FE0", "\u0FE0"], + ["\u0FE1", "\u0FE1"], + ["\u0FE2", "\u0FE2"], + ["\u0FE3", "\u0FE3"], + ["\u0FE4", "\u0FE4"], + ["\u0FE5", "\u0FE5"], + ["\u0FE6", "\u0FE6"], + ["\u0FE7", "\u0FE7"], + ["\u0FE8", "\u0FE8"], + ["\u0FE9", "\u0FE9"], + ["\u0FEA", "\u0FEA"], + ["\u0FEB", "\u0FEB"], + ["\u0FEC", "\u0FEC"], + ["\u0FED", "\u0FED"], + ["\u0FEE", "\u0FEE"], + ["\u0FEF", "\u0FEF"], + ["\u0FF0", "\u0FF0"], + ["\u0FF1", "\u0FF1"], + ["\u0FF2", "\u0FF2"], + ["\u0FF3", "\u0FF3"], + ["\u0FF4", "\u0FF4"], + ["\u0FF5", "\u0FF5"], + ["\u0FF6", "\u0FF6"], + ["\u0FF7", "\u0FF7"], + ["\u0FF8", "\u0FF8"], + ["\u0FF9", "\u0FF9"], + ["\u0FFA", "\u0FFA"], + ["\u0FFB", "\u0FFB"], + ["\u0FFC", "\u0FFC"], + ["\u0FFD", "\u0FFD"], + ["\u0FFE", "\u0FFE"], + ["\u0FFF", "\u0FFF"], + ["\u1000", "\u1000"], /* MYANMAR LETTER KA */ + ["\u1001", "\u1001"], /* MYANMAR LETTER KHA */ + ["\u1002", "\u1002"], /* MYANMAR LETTER GA */ + ["\u1003", "\u1003"], /* MYANMAR LETTER GHA */ + ["\u1004", "\u1004"], /* MYANMAR LETTER NGA */ + ["\u1005", "\u1005"], /* MYANMAR LETTER CA */ + ["\u1006", "\u1006"], /* MYANMAR LETTER CHA */ + ["\u1007", "\u1007"], /* MYANMAR LETTER JA */ + ["\u1008", "\u1008"], /* MYANMAR LETTER JHA */ + ["\u1009", "\u1009"], /* MYANMAR LETTER NYA */ + ["\u100A", "\u100A"], /* MYANMAR LETTER NNYA */ + ["\u100B", "\u100B"], /* MYANMAR LETTER TTA */ + ["\u100C", "\u100C"], /* MYANMAR LETTER TTHA */ + ["\u100D", "\u100D"], /* MYANMAR LETTER DDA */ + ["\u100E", "\u100E"], /* MYANMAR LETTER DDHA */ + ["\u100F", "\u100F"], /* MYANMAR LETTER NNA */ + ["\u1010", "\u1010"], /* MYANMAR LETTER TA */ + ["\u1011", "\u1011"], /* MYANMAR LETTER THA */ + ["\u1012", "\u1012"], /* MYANMAR LETTER DA */ + ["\u1013", "\u1013"], /* MYANMAR LETTER DHA */ + ["\u1014", "\u1014"], /* MYANMAR LETTER NA */ + ["\u1015", "\u1015"], /* MYANMAR LETTER PA */ + ["\u1016", "\u1016"], /* MYANMAR LETTER PHA */ + ["\u1017", "\u1017"], /* MYANMAR LETTER BA */ + ["\u1018", "\u1018"], /* MYANMAR LETTER BHA */ + ["\u1019", "\u1019"], /* MYANMAR LETTER MA */ + ["\u101A", "\u101A"], /* MYANMAR LETTER YA */ + ["\u101B", "\u101B"], /* MYANMAR LETTER RA */ + ["\u101C", "\u101C"], /* MYANMAR LETTER LA */ + ["\u101D", "\u101D"], /* MYANMAR LETTER WA */ + ["\u101E", "\u101E"], /* MYANMAR LETTER SA */ + ["\u101F", "\u101F"], /* MYANMAR LETTER HA */ + ["\u1020", "\u1020"], /* MYANMAR LETTER LLA */ + ["\u1021", "\u1021"], /* MYANMAR LETTER A */ + ["\u1022", "\u1022"], /* MYANMAR LETTER SHAN A */ + ["\u1023", "\u1023"], /* MYANMAR LETTER I */ + ["\u1024", "\u1024"], /* MYANMAR LETTER II */ + ["\u1025", "\u1025"], /* MYANMAR LETTER U */ + ["\u1026", "\u1026"], /* MYANMAR LETTER UU */ + ["\u1027", "\u1027"], /* MYANMAR LETTER E */ + ["\u1028", "\u1028"], /* MYANMAR LETTER MON E */ + ["\u1029", "\u1029"], /* MYANMAR LETTER O */ + ["\u102A", "\u102A"], /* MYANMAR LETTER AU */ + ["\u102B", "\u102B"], /* MYANMAR VOWEL SIGN TALL AA */ + ["\u102C", "\u102C"], /* MYANMAR VOWEL SIGN AA */ + ["\u102D", "\u102D"], /* MYANMAR VOWEL SIGN I */ + ["\u102E", "\u102E"], /* MYANMAR VOWEL SIGN II */ + ["\u102F", "\u102F"], /* MYANMAR VOWEL SIGN U */ + ["\u1030", "\u1030"], /* MYANMAR VOWEL SIGN UU */ + ["\u1031", "\u1031"], /* MYANMAR VOWEL SIGN E */ + ["\u1032", "\u1032"], /* MYANMAR VOWEL SIGN AI */ + ["\u1033", "\u1033"], /* MYANMAR VOWEL SIGN MON II */ + ["\u1034", "\u1034"], /* MYANMAR VOWEL SIGN MON O */ + ["\u1035", "\u1035"], /* MYANMAR VOWEL SIGN E ABOVE */ + ["\u1036", "\u1036"], /* MYANMAR SIGN ANUSVARA */ + ["\u1037", "\u1037"], /* MYANMAR SIGN DOT BELOW */ + ["\u1038", "\u1038"], /* MYANMAR SIGN VISARGA */ + ["\u1039", "\u1039"], /* MYANMAR SIGN VIRAMA */ + ["\u103A", "\u103A"], /* MYANMAR SIGN ASAT */ + ["\u103B", "\u103B"], /* MYANMAR CONSONANT SIGN MEDIAL YA */ + ["\u103C", "\u103C"], /* MYANMAR CONSONANT SIGN MEDIAL RA */ + ["\u103D", "\u103D"], /* MYANMAR CONSONANT SIGN MEDIAL WA */ + ["\u103E", "\u103E"], /* MYANMAR CONSONANT SIGN MEDIAL HA */ + ["\u103F", "\u103F"], /* MYANMAR LETTER GREAT SA */ + ["\u1040", "\u1040"], /* MYANMAR DIGIT ZERO */ + ["\u1041", "\u1041"], /* MYANMAR DIGIT ONE */ + ["\u1042", "\u1042"], /* MYANMAR DIGIT TWO */ + ["\u1043", "\u1043"], /* MYANMAR DIGIT THREE */ + ["\u1044", "\u1044"], /* MYANMAR DIGIT FOUR */ + ["\u1045", "\u1045"], /* MYANMAR DIGIT FIVE */ + ["\u1046", "\u1046"], /* MYANMAR DIGIT SIX */ + ["\u1047", "\u1047"], /* MYANMAR DIGIT SEVEN */ + ["\u1048", "\u1048"], /* MYANMAR DIGIT EIGHT */ + ["\u1049", "\u1049"], /* MYANMAR DIGIT NINE */ + ["\u104A", "\u104A"], /* MYANMAR SIGN LITTLE SECTION */ + ["\u104B", "\u104B"], /* MYANMAR SIGN SECTION */ + ["\u104C", "\u104C"], /* MYANMAR SYMBOL LOCATIVE */ + ["\u104D", "\u104D"], /* MYANMAR SYMBOL COMPLETED */ + ["\u104E", "\u104E"], /* MYANMAR SYMBOL AFOREMENTIONED */ + ["\u104F", "\u104F"], /* MYANMAR SYMBOL GENITIVE */ + ["\u1050", "\u1050"], /* MYANMAR LETTER SHA */ + ["\u1051", "\u1051"], /* MYANMAR LETTER SSA */ + ["\u1052", "\u1052"], /* MYANMAR LETTER VOCALIC R */ + ["\u1053", "\u1053"], /* MYANMAR LETTER VOCALIC RR */ + ["\u1054", "\u1054"], /* MYANMAR LETTER VOCALIC L */ + ["\u1055", "\u1055"], /* MYANMAR LETTER VOCALIC LL */ + ["\u1056", "\u1056"], /* MYANMAR VOWEL SIGN VOCALIC R */ + ["\u1057", "\u1057"], /* MYANMAR VOWEL SIGN VOCALIC RR */ + ["\u1058", "\u1058"], /* MYANMAR VOWEL SIGN VOCALIC L */ + ["\u1059", "\u1059"], /* MYANMAR VOWEL SIGN VOCALIC LL */ + ["\u105A", "\u105A"], /* MYANMAR LETTER MON NGA */ + ["\u105B", "\u105B"], /* MYANMAR LETTER MON JHA */ + ["\u105C", "\u105C"], /* MYANMAR LETTER MON BBA */ + ["\u105D", "\u105D"], /* MYANMAR LETTER MON BBE */ + ["\u105E", "\u105E"], /* MYANMAR CONSONANT SIGN MON MEDIAL NA */ + ["\u105F", "\u105F"], /* MYANMAR CONSONANT SIGN MON MEDIAL MA */ + ["\u1060", "\u1060"], /* MYANMAR CONSONANT SIGN MON MEDIAL LA */ + ["\u1061", "\u1061"], /* MYANMAR LETTER SGAW KAREN SHA */ + ["\u1062", "\u1062"], /* MYANMAR VOWEL SIGN SGAW KAREN EU */ + ["\u1063", "\u1063"], /* MYANMAR TONE MARK SGAW KAREN HATHI */ + ["\u1064", "\u1064"], /* MYANMAR TONE MARK SGAW KAREN KE PHO */ + ["\u1065", "\u1065"], /* MYANMAR LETTER WESTERN PWO KAREN THA */ + ["\u1066", "\u1066"], /* MYANMAR LETTER WESTERN PWO KAREN PWA */ + ["\u1067", "\u1067"], /* MYANMAR VOWEL SIGN WESTERN PWO KAREN EU */ + ["\u1068", "\u1068"], /* MYANMAR VOWEL SIGN WESTERN PWO KAREN UE */ + ["\u1069", "\u1069"], /* MYANMAR SIGN WESTERN PWO KAREN TONE-1 */ + ["\u106A", "\u106A"], /* MYANMAR SIGN WESTERN PWO KAREN TONE-2 */ + ["\u106B", "\u106B"], /* MYANMAR SIGN WESTERN PWO KAREN TONE-3 */ + ["\u106C", "\u106C"], /* MYANMAR SIGN WESTERN PWO KAREN TONE-4 */ + ["\u106D", "\u106D"], /* MYANMAR SIGN WESTERN PWO KAREN TONE-5 */ + ["\u106E", "\u106E"], /* MYANMAR LETTER EASTERN PWO KAREN NNA */ + ["\u106F", "\u106F"], /* MYANMAR LETTER EASTERN PWO KAREN YWA */ + ["\u1070", "\u1070"], /* MYANMAR LETTER EASTERN PWO KAREN GHWA */ + ["\u1071", "\u1071"], /* MYANMAR VOWEL SIGN GEBA KAREN I */ + ["\u1072", "\u1072"], /* MYANMAR VOWEL SIGN KAYAH OE */ + ["\u1073", "\u1073"], /* MYANMAR VOWEL SIGN KAYAH U */ + ["\u1074", "\u1074"], /* MYANMAR VOWEL SIGN KAYAH EE */ + ["\u1075", "\u1075"], /* MYANMAR LETTER SHAN KA */ + ["\u1076", "\u1076"], /* MYANMAR LETTER SHAN KHA */ + ["\u1077", "\u1077"], /* MYANMAR LETTER SHAN GA */ + ["\u1078", "\u1078"], /* MYANMAR LETTER SHAN CA */ + ["\u1079", "\u1079"], /* MYANMAR LETTER SHAN ZA */ + ["\u107A", "\u107A"], /* MYANMAR LETTER SHAN NYA */ + ["\u107B", "\u107B"], /* MYANMAR LETTER SHAN DA */ + ["\u107C", "\u107C"], /* MYANMAR LETTER SHAN NA */ + ["\u107D", "\u107D"], /* MYANMAR LETTER SHAN PHA */ + ["\u107E", "\u107E"], /* MYANMAR LETTER SHAN FA */ + ["\u107F", "\u107F"], /* MYANMAR LETTER SHAN BA */ + ["\u1080", "\u1080"], /* MYANMAR LETTER SHAN THA */ + ["\u1081", "\u1081"], /* MYANMAR LETTER SHAN HA */ + ["\u1082", "\u1082"], /* MYANMAR CONSONANT SIGN SHAN MEDIAL WA */ + ["\u1083", "\u1083"], /* MYANMAR VOWEL SIGN SHAN AA */ + ["\u1084", "\u1084"], /* MYANMAR VOWEL SIGN SHAN E */ + ["\u1085", "\u1085"], /* MYANMAR VOWEL SIGN SHAN E ABOVE */ + ["\u1086", "\u1086"], /* MYANMAR VOWEL SIGN SHAN FINAL Y */ + ["\u1087", "\u1087"], /* MYANMAR SIGN SHAN TONE-2 */ + ["\u1088", "\u1088"], /* MYANMAR SIGN SHAN TONE-3 */ + ["\u1089", "\u1089"], /* MYANMAR SIGN SHAN TONE-5 */ + ["\u108A", "\u108A"], /* MYANMAR SIGN SHAN TONE-6 */ + ["\u108B", "\u108B"], /* MYANMAR SIGN SHAN COUNCIL TONE-2 */ + ["\u108C", "\u108C"], /* MYANMAR SIGN SHAN COUNCIL TONE-3 */ + ["\u108D", "\u108D"], /* MYANMAR SIGN SHAN COUNCIL EMPHATIC TONE */ + ["\u108E", "\u108E"], /* MYANMAR LETTER RUMAI PALAUNG FA */ + ["\u108F", "\u108F"], /* MYANMAR SIGN RUMAI PALAUNG TONE-5 */ + ["\u1090", "\u1090"], /* MYANMAR SHAN DIGIT ZERO */ + ["\u1091", "\u1091"], /* MYANMAR SHAN DIGIT ONE */ + ["\u1092", "\u1092"], /* MYANMAR SHAN DIGIT TWO */ + ["\u1093", "\u1093"], /* MYANMAR SHAN DIGIT THREE */ + ["\u1094", "\u1094"], /* MYANMAR SHAN DIGIT FOUR */ + ["\u1095", "\u1095"], /* MYANMAR SHAN DIGIT FIVE */ + ["\u1096", "\u1096"], /* MYANMAR SHAN DIGIT SIX */ + ["\u1097", "\u1097"], /* MYANMAR SHAN DIGIT SEVEN */ + ["\u1098", "\u1098"], /* MYANMAR SHAN DIGIT EIGHT */ + ["\u1099", "\u1099"], /* MYANMAR SHAN DIGIT NINE */ + ["\u109A", "\u109A"], /* MYANMAR SIGN KHAMTI TONE-1 */ + ["\u109B", "\u109B"], /* MYANMAR SIGN KHAMTI TONE-3 */ + ["\u109C", "\u109C"], /* MYANMAR VOWEL SIGN AITON A */ + ["\u109D", "\u109D"], /* MYANMAR VOWEL SIGN AITON AI */ + ["\u109E", "\u109E"], /* MYANMAR SYMBOL SHAN ONE */ + ["\u109F", "\u109F"], /* MYANMAR SYMBOL SHAN EXCLAMATION */ + ["\u10A0", "\u2D00"], /* GEORGIAN CAPITAL LETTER AN */ + ["\u10A1", "\u2D01"], /* GEORGIAN CAPITAL LETTER BAN */ + ["\u10A2", "\u2D02"], /* GEORGIAN CAPITAL LETTER GAN */ + ["\u10A3", "\u2D03"], /* GEORGIAN CAPITAL LETTER DON */ + ["\u10A4", "\u2D04"], /* GEORGIAN CAPITAL LETTER EN */ + ["\u10A5", "\u2D05"], /* GEORGIAN CAPITAL LETTER VIN */ + ["\u10A6", "\u2D06"], /* GEORGIAN CAPITAL LETTER ZEN */ + ["\u10A7", "\u2D07"], /* GEORGIAN CAPITAL LETTER TAN */ + ["\u10A8", "\u2D08"], /* GEORGIAN CAPITAL LETTER IN */ + ["\u10A9", "\u2D09"], /* GEORGIAN CAPITAL LETTER KAN */ + ["\u10AA", "\u2D0A"], /* GEORGIAN CAPITAL LETTER LAS */ + ["\u10AB", "\u2D0B"], /* GEORGIAN CAPITAL LETTER MAN */ + ["\u10AC", "\u2D0C"], /* GEORGIAN CAPITAL LETTER NAR */ + ["\u10AD", "\u2D0D"], /* GEORGIAN CAPITAL LETTER ON */ + ["\u10AE", "\u2D0E"], /* GEORGIAN CAPITAL LETTER PAR */ + ["\u10AF", "\u2D0F"], /* GEORGIAN CAPITAL LETTER ZHAR */ + ["\u10B0", "\u2D10"], /* GEORGIAN CAPITAL LETTER RAE */ + ["\u10B1", "\u2D11"], /* GEORGIAN CAPITAL LETTER SAN */ + ["\u10B2", "\u2D12"], /* GEORGIAN CAPITAL LETTER TAR */ + ["\u10B3", "\u2D13"], /* GEORGIAN CAPITAL LETTER UN */ + ["\u10B4", "\u2D14"], /* GEORGIAN CAPITAL LETTER PHAR */ + ["\u10B5", "\u2D15"], /* GEORGIAN CAPITAL LETTER KHAR */ + ["\u10B6", "\u2D16"], /* GEORGIAN CAPITAL LETTER GHAN */ + ["\u10B7", "\u2D17"], /* GEORGIAN CAPITAL LETTER QAR */ + ["\u10B8", "\u2D18"], /* GEORGIAN CAPITAL LETTER SHIN */ + ["\u10B9", "\u2D19"], /* GEORGIAN CAPITAL LETTER CHIN */ + ["\u10BA", "\u2D1A"], /* GEORGIAN CAPITAL LETTER CAN */ + ["\u10BB", "\u2D1B"], /* GEORGIAN CAPITAL LETTER JIL */ + ["\u10BC", "\u2D1C"], /* GEORGIAN CAPITAL LETTER CIL */ + ["\u10BD", "\u2D1D"], /* GEORGIAN CAPITAL LETTER CHAR */ + ["\u10BE", "\u2D1E"], /* GEORGIAN CAPITAL LETTER XAN */ + ["\u10BF", "\u2D1F"], /* GEORGIAN CAPITAL LETTER JHAN */ + ["\u10C0", "\u2D20"], /* GEORGIAN CAPITAL LETTER HAE */ + ["\u10C1", "\u2D21"], /* GEORGIAN CAPITAL LETTER HE */ + ["\u10C2", "\u2D22"], /* GEORGIAN CAPITAL LETTER HIE */ + ["\u10C3", "\u2D23"], /* GEORGIAN CAPITAL LETTER WE */ + ["\u10C4", "\u2D24"], /* GEORGIAN CAPITAL LETTER HAR */ + ["\u10C5", "\u2D25"], /* GEORGIAN CAPITAL LETTER HOE */ + ["\u10C6", "\u10C6"], + ["\u10C7", "\u2D27"], /* GEORGIAN CAPITAL LETTER YN */ + ["\u10C8", "\u10C8"], + ["\u10C9", "\u10C9"], + ["\u10CA", "\u10CA"], + ["\u10CB", "\u10CB"], + ["\u10CC", "\u10CC"], + ["\u10CD", "\u2D2D"], /* GEORGIAN CAPITAL LETTER AEN */ + ["\u10CE", "\u10CE"], + ["\u10CF", "\u10CF"], + ["\u1C90", "\u10D0"], /* GEORGIAN LETTER AN (GEORGIAN SMALL LETTER AN) */ + ["\u1C91", "\u10D1"], /* GEORGIAN LETTER BAN (GEORGIAN SMALL LETTER BAN) */ + ["\u1C92", "\u10D2"], /* GEORGIAN LETTER GAN (GEORGIAN SMALL LETTER GAN) */ + ["\u1C93", "\u10D3"], /* GEORGIAN LETTER DON (GEORGIAN SMALL LETTER DON) */ + ["\u1C94", "\u10D4"], /* GEORGIAN LETTER EN (GEORGIAN SMALL LETTER EN) */ + ["\u1C95", "\u10D5"], /* GEORGIAN LETTER VIN (GEORGIAN SMALL LETTER VIN) */ + ["\u1C96", "\u10D6"], /* GEORGIAN LETTER ZEN (GEORGIAN SMALL LETTER ZEN) */ + ["\u1C97", "\u10D7"], /* GEORGIAN LETTER TAN (GEORGIAN SMALL LETTER TAN) */ + ["\u1C98", "\u10D8"], /* GEORGIAN LETTER IN (GEORGIAN SMALL LETTER IN) */ + ["\u1C99", "\u10D9"], /* GEORGIAN LETTER KAN (GEORGIAN SMALL LETTER KAN) */ + ["\u1C9A", "\u10DA"], /* GEORGIAN LETTER LAS (GEORGIAN SMALL LETTER LAS) */ + ["\u1C9B", "\u10DB"], /* GEORGIAN LETTER MAN (GEORGIAN SMALL LETTER MAN) */ + ["\u1C9C", "\u10DC"], /* GEORGIAN LETTER NAR (GEORGIAN SMALL LETTER NAR) */ + ["\u1C9D", "\u10DD"], /* GEORGIAN LETTER ON (GEORGIAN SMALL LETTER ON) */ + ["\u1C9E", "\u10DE"], /* GEORGIAN LETTER PAR (GEORGIAN SMALL LETTER PAR) */ + ["\u1C9F", "\u10DF"], /* GEORGIAN LETTER ZHAR (GEORGIAN SMALL LETTER ZHAR) */ + ["\u1CA0", "\u10E0"], /* GEORGIAN LETTER RAE (GEORGIAN SMALL LETTER RAE) */ + ["\u1CA1", "\u10E1"], /* GEORGIAN LETTER SAN (GEORGIAN SMALL LETTER SAN) */ + ["\u1CA2", "\u10E2"], /* GEORGIAN LETTER TAR (GEORGIAN SMALL LETTER TAR) */ + ["\u1CA3", "\u10E3"], /* GEORGIAN LETTER UN (GEORGIAN SMALL LETTER UN) */ + ["\u1CA4", "\u10E4"], /* GEORGIAN LETTER PHAR (GEORGIAN SMALL LETTER PHAR) */ + ["\u1CA5", "\u10E5"], /* GEORGIAN LETTER KHAR (GEORGIAN SMALL LETTER KHAR) */ + ["\u1CA6", "\u10E6"], /* GEORGIAN LETTER GHAN (GEORGIAN SMALL LETTER GHAN) */ + ["\u1CA7", "\u10E7"], /* GEORGIAN LETTER QAR (GEORGIAN SMALL LETTER QAR) */ + ["\u1CA8", "\u10E8"], /* GEORGIAN LETTER SHIN (GEORGIAN SMALL LETTER SHIN) */ + ["\u1CA9", "\u10E9"], /* GEORGIAN LETTER CHIN (GEORGIAN SMALL LETTER CHIN) */ + ["\u1CAA", "\u10EA"], /* GEORGIAN LETTER CAN (GEORGIAN SMALL LETTER CAN) */ + ["\u1CAB", "\u10EB"], /* GEORGIAN LETTER JIL (GEORGIAN SMALL LETTER JIL) */ + ["\u1CAC", "\u10EC"], /* GEORGIAN LETTER CIL (GEORGIAN SMALL LETTER CIL) */ + ["\u1CAD", "\u10ED"], /* GEORGIAN LETTER CHAR (GEORGIAN SMALL LETTER CHAR) */ + ["\u1CAE", "\u10EE"], /* GEORGIAN LETTER XAN (GEORGIAN SMALL LETTER XAN) */ + ["\u1CAF", "\u10EF"], /* GEORGIAN LETTER JHAN (GEORGIAN SMALL LETTER JHAN) */ + ["\u1CB0", "\u10F0"], /* GEORGIAN LETTER HAE (GEORGIAN SMALL LETTER HAE) */ + ["\u1CB1", "\u10F1"], /* GEORGIAN LETTER HE (GEORGIAN SMALL LETTER HE) */ + ["\u1CB2", "\u10F2"], /* GEORGIAN LETTER HIE (GEORGIAN SMALL LETTER HIE) */ + ["\u1CB3", "\u10F3"], /* GEORGIAN LETTER WE (GEORGIAN SMALL LETTER WE) */ + ["\u1CB4", "\u10F4"], /* GEORGIAN LETTER HAR (GEORGIAN SMALL LETTER HAR) */ + ["\u1CB5", "\u10F5"], /* GEORGIAN LETTER HOE (GEORGIAN SMALL LETTER HOE) */ + ["\u1CB6", "\u10F6"], /* GEORGIAN LETTER FI (GEORGIAN SMALL LETTER FI) */ + ["\u1CB7", "\u10F7"], /* GEORGIAN LETTER YN */ + ["\u1CB8", "\u10F8"], /* GEORGIAN LETTER ELIFI */ + ["\u1CB9", "\u10F9"], /* GEORGIAN LETTER TURNED GAN */ + ["\u1CBA", "\u10FA"], /* GEORGIAN LETTER AIN */ + ["\u10FB", "\u10FB"], /* GEORGIAN PARAGRAPH SEPARATOR */ + ["\u10FC", "\u10FC"], /* MODIFIER LETTER GEORGIAN NAR */ + ["\u1CBD", "\u10FD"], /* GEORGIAN LETTER AEN */ + ["\u1CBE", "\u10FE"], /* GEORGIAN LETTER HARD SIGN */ + ["\u1CBF", "\u10FF"], /* GEORGIAN LETTER LABIAL SIGN */ + ["\u1100", "\u1100"], /* HANGUL CHOSEONG KIYEOK */ + ["\u1101", "\u1101"], /* HANGUL CHOSEONG SSANGKIYEOK */ + ["\u1102", "\u1102"], /* HANGUL CHOSEONG NIEUN */ + ["\u1103", "\u1103"], /* HANGUL CHOSEONG TIKEUT */ + ["\u1104", "\u1104"], /* HANGUL CHOSEONG SSANGTIKEUT */ + ["\u1105", "\u1105"], /* HANGUL CHOSEONG RIEUL */ + ["\u1106", "\u1106"], /* HANGUL CHOSEONG MIEUM */ + ["\u1107", "\u1107"], /* HANGUL CHOSEONG PIEUP */ + ["\u1108", "\u1108"], /* HANGUL CHOSEONG SSANGPIEUP */ + ["\u1109", "\u1109"], /* HANGUL CHOSEONG SIOS */ + ["\u110A", "\u110A"], /* HANGUL CHOSEONG SSANGSIOS */ + ["\u110B", "\u110B"], /* HANGUL CHOSEONG IEUNG */ + ["\u110C", "\u110C"], /* HANGUL CHOSEONG CIEUC */ + ["\u110D", "\u110D"], /* HANGUL CHOSEONG SSANGCIEUC */ + ["\u110E", "\u110E"], /* HANGUL CHOSEONG CHIEUCH */ + ["\u110F", "\u110F"], /* HANGUL CHOSEONG KHIEUKH */ + ["\u1110", "\u1110"], /* HANGUL CHOSEONG THIEUTH */ + ["\u1111", "\u1111"], /* HANGUL CHOSEONG PHIEUPH */ + ["\u1112", "\u1112"], /* HANGUL CHOSEONG HIEUH */ + ["\u1113", "\u1113"], /* HANGUL CHOSEONG NIEUN-KIYEOK */ + ["\u1114", "\u1114"], /* HANGUL CHOSEONG SSANGNIEUN */ + ["\u1115", "\u1115"], /* HANGUL CHOSEONG NIEUN-TIKEUT */ + ["\u1116", "\u1116"], /* HANGUL CHOSEONG NIEUN-PIEUP */ + ["\u1117", "\u1117"], /* HANGUL CHOSEONG TIKEUT-KIYEOK */ + ["\u1118", "\u1118"], /* HANGUL CHOSEONG RIEUL-NIEUN */ + ["\u1119", "\u1119"], /* HANGUL CHOSEONG SSANGRIEUL */ + ["\u111A", "\u111A"], /* HANGUL CHOSEONG RIEUL-HIEUH */ + ["\u111B", "\u111B"], /* HANGUL CHOSEONG KAPYEOUNRIEUL */ + ["\u111C", "\u111C"], /* HANGUL CHOSEONG MIEUM-PIEUP */ + ["\u111D", "\u111D"], /* HANGUL CHOSEONG KAPYEOUNMIEUM */ + ["\u111E", "\u111E"], /* HANGUL CHOSEONG PIEUP-KIYEOK */ + ["\u111F", "\u111F"], /* HANGUL CHOSEONG PIEUP-NIEUN */ + ["\u1120", "\u1120"], /* HANGUL CHOSEONG PIEUP-TIKEUT */ + ["\u1121", "\u1121"], /* HANGUL CHOSEONG PIEUP-SIOS */ + ["\u1122", "\u1122"], /* HANGUL CHOSEONG PIEUP-SIOS-KIYEOK */ + ["\u1123", "\u1123"], /* HANGUL CHOSEONG PIEUP-SIOS-TIKEUT */ + ["\u1124", "\u1124"], /* HANGUL CHOSEONG PIEUP-SIOS-PIEUP */ + ["\u1125", "\u1125"], /* HANGUL CHOSEONG PIEUP-SSANGSIOS */ + ["\u1126", "\u1126"], /* HANGUL CHOSEONG PIEUP-SIOS-CIEUC */ + ["\u1127", "\u1127"], /* HANGUL CHOSEONG PIEUP-CIEUC */ + ["\u1128", "\u1128"], /* HANGUL CHOSEONG PIEUP-CHIEUCH */ + ["\u1129", "\u1129"], /* HANGUL CHOSEONG PIEUP-THIEUTH */ + ["\u112A", "\u112A"], /* HANGUL CHOSEONG PIEUP-PHIEUPH */ + ["\u112B", "\u112B"], /* HANGUL CHOSEONG KAPYEOUNPIEUP */ + ["\u112C", "\u112C"], /* HANGUL CHOSEONG KAPYEOUNSSANGPIEUP */ + ["\u112D", "\u112D"], /* HANGUL CHOSEONG SIOS-KIYEOK */ + ["\u112E", "\u112E"], /* HANGUL CHOSEONG SIOS-NIEUN */ + ["\u112F", "\u112F"], /* HANGUL CHOSEONG SIOS-TIKEUT */ + ["\u1130", "\u1130"], /* HANGUL CHOSEONG SIOS-RIEUL */ + ["\u1131", "\u1131"], /* HANGUL CHOSEONG SIOS-MIEUM */ + ["\u1132", "\u1132"], /* HANGUL CHOSEONG SIOS-PIEUP */ + ["\u1133", "\u1133"], /* HANGUL CHOSEONG SIOS-PIEUP-KIYEOK */ + ["\u1134", "\u1134"], /* HANGUL CHOSEONG SIOS-SSANGSIOS */ + ["\u1135", "\u1135"], /* HANGUL CHOSEONG SIOS-IEUNG */ + ["\u1136", "\u1136"], /* HANGUL CHOSEONG SIOS-CIEUC */ + ["\u1137", "\u1137"], /* HANGUL CHOSEONG SIOS-CHIEUCH */ + ["\u1138", "\u1138"], /* HANGUL CHOSEONG SIOS-KHIEUKH */ + ["\u1139", "\u1139"], /* HANGUL CHOSEONG SIOS-THIEUTH */ + ["\u113A", "\u113A"], /* HANGUL CHOSEONG SIOS-PHIEUPH */ + ["\u113B", "\u113B"], /* HANGUL CHOSEONG SIOS-HIEUH */ + ["\u113C", "\u113C"], /* HANGUL CHOSEONG CHITUEUMSIOS */ + ["\u113D", "\u113D"], /* HANGUL CHOSEONG CHITUEUMSSANGSIOS */ + ["\u113E", "\u113E"], /* HANGUL CHOSEONG CEONGCHIEUMSIOS */ + ["\u113F", "\u113F"], /* HANGUL CHOSEONG CEONGCHIEUMSSANGSIOS */ + ["\u1140", "\u1140"], /* HANGUL CHOSEONG PANSIOS */ + ["\u1141", "\u1141"], /* HANGUL CHOSEONG IEUNG-KIYEOK */ + ["\u1142", "\u1142"], /* HANGUL CHOSEONG IEUNG-TIKEUT */ + ["\u1143", "\u1143"], /* HANGUL CHOSEONG IEUNG-MIEUM */ + ["\u1144", "\u1144"], /* HANGUL CHOSEONG IEUNG-PIEUP */ + ["\u1145", "\u1145"], /* HANGUL CHOSEONG IEUNG-SIOS */ + ["\u1146", "\u1146"], /* HANGUL CHOSEONG IEUNG-PANSIOS */ + ["\u1147", "\u1147"], /* HANGUL CHOSEONG SSANGIEUNG */ + ["\u1148", "\u1148"], /* HANGUL CHOSEONG IEUNG-CIEUC */ + ["\u1149", "\u1149"], /* HANGUL CHOSEONG IEUNG-CHIEUCH */ + ["\u114A", "\u114A"], /* HANGUL CHOSEONG IEUNG-THIEUTH */ + ["\u114B", "\u114B"], /* HANGUL CHOSEONG IEUNG-PHIEUPH */ + ["\u114C", "\u114C"], /* HANGUL CHOSEONG YESIEUNG */ + ["\u114D", "\u114D"], /* HANGUL CHOSEONG CIEUC-IEUNG */ + ["\u114E", "\u114E"], /* HANGUL CHOSEONG CHITUEUMCIEUC */ + ["\u114F", "\u114F"], /* HANGUL CHOSEONG CHITUEUMSSANGCIEUC */ + ["\u1150", "\u1150"], /* HANGUL CHOSEONG CEONGCHIEUMCIEUC */ + ["\u1151", "\u1151"], /* HANGUL CHOSEONG CEONGCHIEUMSSANGCIEUC */ + ["\u1152", "\u1152"], /* HANGUL CHOSEONG CHIEUCH-KHIEUKH */ + ["\u1153", "\u1153"], /* HANGUL CHOSEONG CHIEUCH-HIEUH */ + ["\u1154", "\u1154"], /* HANGUL CHOSEONG CHITUEUMCHIEUCH */ + ["\u1155", "\u1155"], /* HANGUL CHOSEONG CEONGCHIEUMCHIEUCH */ + ["\u1156", "\u1156"], /* HANGUL CHOSEONG PHIEUPH-PIEUP */ + ["\u1157", "\u1157"], /* HANGUL CHOSEONG KAPYEOUNPHIEUPH */ + ["\u1158", "\u1158"], /* HANGUL CHOSEONG SSANGHIEUH */ + ["\u1159", "\u1159"], /* HANGUL CHOSEONG YEORINHIEUH */ + ["\u115A", "\u115A"], /* HANGUL CHOSEONG KIYEOK-TIKEUT */ + ["\u115B", "\u115B"], /* HANGUL CHOSEONG NIEUN-SIOS */ + ["\u115C", "\u115C"], /* HANGUL CHOSEONG NIEUN-CIEUC */ + ["\u115D", "\u115D"], /* HANGUL CHOSEONG NIEUN-HIEUH */ + ["\u115E", "\u115E"], /* HANGUL CHOSEONG TIKEUT-RIEUL */ + ["\u115F", "\u115F"], /* HANGUL CHOSEONG FILLER */ + ["\u1160", "\u1160"], /* HANGUL JUNGSEONG FILLER */ + ["\u1161", "\u1161"], /* HANGUL JUNGSEONG A */ + ["\u1162", "\u1162"], /* HANGUL JUNGSEONG AE */ + ["\u1163", "\u1163"], /* HANGUL JUNGSEONG YA */ + ["\u1164", "\u1164"], /* HANGUL JUNGSEONG YAE */ + ["\u1165", "\u1165"], /* HANGUL JUNGSEONG EO */ + ["\u1166", "\u1166"], /* HANGUL JUNGSEONG E */ + ["\u1167", "\u1167"], /* HANGUL JUNGSEONG YEO */ + ["\u1168", "\u1168"], /* HANGUL JUNGSEONG YE */ + ["\u1169", "\u1169"], /* HANGUL JUNGSEONG O */ + ["\u116A", "\u116A"], /* HANGUL JUNGSEONG WA */ + ["\u116B", "\u116B"], /* HANGUL JUNGSEONG WAE */ + ["\u116C", "\u116C"], /* HANGUL JUNGSEONG OE */ + ["\u116D", "\u116D"], /* HANGUL JUNGSEONG YO */ + ["\u116E", "\u116E"], /* HANGUL JUNGSEONG U */ + ["\u116F", "\u116F"], /* HANGUL JUNGSEONG WEO */ + ["\u1170", "\u1170"], /* HANGUL JUNGSEONG WE */ + ["\u1171", "\u1171"], /* HANGUL JUNGSEONG WI */ + ["\u1172", "\u1172"], /* HANGUL JUNGSEONG YU */ + ["\u1173", "\u1173"], /* HANGUL JUNGSEONG EU */ + ["\u1174", "\u1174"], /* HANGUL JUNGSEONG YI */ + ["\u1175", "\u1175"], /* HANGUL JUNGSEONG I */ + ["\u1176", "\u1176"], /* HANGUL JUNGSEONG A-O */ + ["\u1177", "\u1177"], /* HANGUL JUNGSEONG A-U */ + ["\u1178", "\u1178"], /* HANGUL JUNGSEONG YA-O */ + ["\u1179", "\u1179"], /* HANGUL JUNGSEONG YA-YO */ + ["\u117A", "\u117A"], /* HANGUL JUNGSEONG EO-O */ + ["\u117B", "\u117B"], /* HANGUL JUNGSEONG EO-U */ + ["\u117C", "\u117C"], /* HANGUL JUNGSEONG EO-EU */ + ["\u117D", "\u117D"], /* HANGUL JUNGSEONG YEO-O */ + ["\u117E", "\u117E"], /* HANGUL JUNGSEONG YEO-U */ + ["\u117F", "\u117F"], /* HANGUL JUNGSEONG O-EO */ + ["\u1180", "\u1180"], /* HANGUL JUNGSEONG O-E */ + ["\u1181", "\u1181"], /* HANGUL JUNGSEONG O-YE */ + ["\u1182", "\u1182"], /* HANGUL JUNGSEONG O-O */ + ["\u1183", "\u1183"], /* HANGUL JUNGSEONG O-U */ + ["\u1184", "\u1184"], /* HANGUL JUNGSEONG YO-YA */ + ["\u1185", "\u1185"], /* HANGUL JUNGSEONG YO-YAE */ + ["\u1186", "\u1186"], /* HANGUL JUNGSEONG YO-YEO */ + ["\u1187", "\u1187"], /* HANGUL JUNGSEONG YO-O */ + ["\u1188", "\u1188"], /* HANGUL JUNGSEONG YO-I */ + ["\u1189", "\u1189"], /* HANGUL JUNGSEONG U-A */ + ["\u118A", "\u118A"], /* HANGUL JUNGSEONG U-AE */ + ["\u118B", "\u118B"], /* HANGUL JUNGSEONG U-EO-EU */ + ["\u118C", "\u118C"], /* HANGUL JUNGSEONG U-YE */ + ["\u118D", "\u118D"], /* HANGUL JUNGSEONG U-U */ + ["\u118E", "\u118E"], /* HANGUL JUNGSEONG YU-A */ + ["\u118F", "\u118F"], /* HANGUL JUNGSEONG YU-EO */ + ["\u1190", "\u1190"], /* HANGUL JUNGSEONG YU-E */ + ["\u1191", "\u1191"], /* HANGUL JUNGSEONG YU-YEO */ + ["\u1192", "\u1192"], /* HANGUL JUNGSEONG YU-YE */ + ["\u1193", "\u1193"], /* HANGUL JUNGSEONG YU-U */ + ["\u1194", "\u1194"], /* HANGUL JUNGSEONG YU-I */ + ["\u1195", "\u1195"], /* HANGUL JUNGSEONG EU-U */ + ["\u1196", "\u1196"], /* HANGUL JUNGSEONG EU-EU */ + ["\u1197", "\u1197"], /* HANGUL JUNGSEONG YI-U */ + ["\u1198", "\u1198"], /* HANGUL JUNGSEONG I-A */ + ["\u1199", "\u1199"], /* HANGUL JUNGSEONG I-YA */ + ["\u119A", "\u119A"], /* HANGUL JUNGSEONG I-O */ + ["\u119B", "\u119B"], /* HANGUL JUNGSEONG I-U */ + ["\u119C", "\u119C"], /* HANGUL JUNGSEONG I-EU */ + ["\u119D", "\u119D"], /* HANGUL JUNGSEONG I-ARAEA */ + ["\u119E", "\u119E"], /* HANGUL JUNGSEONG ARAEA */ + ["\u119F", "\u119F"], /* HANGUL JUNGSEONG ARAEA-EO */ + ["\u11A0", "\u11A0"], /* HANGUL JUNGSEONG ARAEA-U */ + ["\u11A1", "\u11A1"], /* HANGUL JUNGSEONG ARAEA-I */ + ["\u11A2", "\u11A2"], /* HANGUL JUNGSEONG SSANGARAEA */ + ["\u11A3", "\u11A3"], /* HANGUL JUNGSEONG A-EU */ + ["\u11A4", "\u11A4"], /* HANGUL JUNGSEONG YA-U */ + ["\u11A5", "\u11A5"], /* HANGUL JUNGSEONG YEO-YA */ + ["\u11A6", "\u11A6"], /* HANGUL JUNGSEONG O-YA */ + ["\u11A7", "\u11A7"], /* HANGUL JUNGSEONG O-YAE */ + ["\u11A8", "\u11A8"], /* HANGUL JONGSEONG KIYEOK */ + ["\u11A9", "\u11A9"], /* HANGUL JONGSEONG SSANGKIYEOK */ + ["\u11AA", "\u11AA"], /* HANGUL JONGSEONG KIYEOK-SIOS */ + ["\u11AB", "\u11AB"], /* HANGUL JONGSEONG NIEUN */ + ["\u11AC", "\u11AC"], /* HANGUL JONGSEONG NIEUN-CIEUC */ + ["\u11AD", "\u11AD"], /* HANGUL JONGSEONG NIEUN-HIEUH */ + ["\u11AE", "\u11AE"], /* HANGUL JONGSEONG TIKEUT */ + ["\u11AF", "\u11AF"], /* HANGUL JONGSEONG RIEUL */ + ["\u11B0", "\u11B0"], /* HANGUL JONGSEONG RIEUL-KIYEOK */ + ["\u11B1", "\u11B1"], /* HANGUL JONGSEONG RIEUL-MIEUM */ + ["\u11B2", "\u11B2"], /* HANGUL JONGSEONG RIEUL-PIEUP */ + ["\u11B3", "\u11B3"], /* HANGUL JONGSEONG RIEUL-SIOS */ + ["\u11B4", "\u11B4"], /* HANGUL JONGSEONG RIEUL-THIEUTH */ + ["\u11B5", "\u11B5"], /* HANGUL JONGSEONG RIEUL-PHIEUPH */ + ["\u11B6", "\u11B6"], /* HANGUL JONGSEONG RIEUL-HIEUH */ + ["\u11B7", "\u11B7"], /* HANGUL JONGSEONG MIEUM */ + ["\u11B8", "\u11B8"], /* HANGUL JONGSEONG PIEUP */ + ["\u11B9", "\u11B9"], /* HANGUL JONGSEONG PIEUP-SIOS */ + ["\u11BA", "\u11BA"], /* HANGUL JONGSEONG SIOS */ + ["\u11BB", "\u11BB"], /* HANGUL JONGSEONG SSANGSIOS */ + ["\u11BC", "\u11BC"], /* HANGUL JONGSEONG IEUNG */ + ["\u11BD", "\u11BD"], /* HANGUL JONGSEONG CIEUC */ + ["\u11BE", "\u11BE"], /* HANGUL JONGSEONG CHIEUCH */ + ["\u11BF", "\u11BF"], /* HANGUL JONGSEONG KHIEUKH */ + ["\u11C0", "\u11C0"], /* HANGUL JONGSEONG THIEUTH */ + ["\u11C1", "\u11C1"], /* HANGUL JONGSEONG PHIEUPH */ + ["\u11C2", "\u11C2"], /* HANGUL JONGSEONG HIEUH */ + ["\u11C3", "\u11C3"], /* HANGUL JONGSEONG KIYEOK-RIEUL */ + ["\u11C4", "\u11C4"], /* HANGUL JONGSEONG KIYEOK-SIOS-KIYEOK */ + ["\u11C5", "\u11C5"], /* HANGUL JONGSEONG NIEUN-KIYEOK */ + ["\u11C6", "\u11C6"], /* HANGUL JONGSEONG NIEUN-TIKEUT */ + ["\u11C7", "\u11C7"], /* HANGUL JONGSEONG NIEUN-SIOS */ + ["\u11C8", "\u11C8"], /* HANGUL JONGSEONG NIEUN-PANSIOS */ + ["\u11C9", "\u11C9"], /* HANGUL JONGSEONG NIEUN-THIEUTH */ + ["\u11CA", "\u11CA"], /* HANGUL JONGSEONG TIKEUT-KIYEOK */ + ["\u11CB", "\u11CB"], /* HANGUL JONGSEONG TIKEUT-RIEUL */ + ["\u11CC", "\u11CC"], /* HANGUL JONGSEONG RIEUL-KIYEOK-SIOS */ + ["\u11CD", "\u11CD"], /* HANGUL JONGSEONG RIEUL-NIEUN */ + ["\u11CE", "\u11CE"], /* HANGUL JONGSEONG RIEUL-TIKEUT */ + ["\u11CF", "\u11CF"], /* HANGUL JONGSEONG RIEUL-TIKEUT-HIEUH */ + ["\u11D0", "\u11D0"], /* HANGUL JONGSEONG SSANGRIEUL */ + ["\u11D1", "\u11D1"], /* HANGUL JONGSEONG RIEUL-MIEUM-KIYEOK */ + ["\u11D2", "\u11D2"], /* HANGUL JONGSEONG RIEUL-MIEUM-SIOS */ + ["\u11D3", "\u11D3"], /* HANGUL JONGSEONG RIEUL-PIEUP-SIOS */ + ["\u11D4", "\u11D4"], /* HANGUL JONGSEONG RIEUL-PIEUP-HIEUH */ + ["\u11D5", "\u11D5"], /* HANGUL JONGSEONG RIEUL-KAPYEOUNPIEUP */ + ["\u11D6", "\u11D6"], /* HANGUL JONGSEONG RIEUL-SSANGSIOS */ + ["\u11D7", "\u11D7"], /* HANGUL JONGSEONG RIEUL-PANSIOS */ + ["\u11D8", "\u11D8"], /* HANGUL JONGSEONG RIEUL-KHIEUKH */ + ["\u11D9", "\u11D9"], /* HANGUL JONGSEONG RIEUL-YEORINHIEUH */ + ["\u11DA", "\u11DA"], /* HANGUL JONGSEONG MIEUM-KIYEOK */ + ["\u11DB", "\u11DB"], /* HANGUL JONGSEONG MIEUM-RIEUL */ + ["\u11DC", "\u11DC"], /* HANGUL JONGSEONG MIEUM-PIEUP */ + ["\u11DD", "\u11DD"], /* HANGUL JONGSEONG MIEUM-SIOS */ + ["\u11DE", "\u11DE"], /* HANGUL JONGSEONG MIEUM-SSANGSIOS */ + ["\u11DF", "\u11DF"], /* HANGUL JONGSEONG MIEUM-PANSIOS */ + ["\u11E0", "\u11E0"], /* HANGUL JONGSEONG MIEUM-CHIEUCH */ + ["\u11E1", "\u11E1"], /* HANGUL JONGSEONG MIEUM-HIEUH */ + ["\u11E2", "\u11E2"], /* HANGUL JONGSEONG KAPYEOUNMIEUM */ + ["\u11E3", "\u11E3"], /* HANGUL JONGSEONG PIEUP-RIEUL */ + ["\u11E4", "\u11E4"], /* HANGUL JONGSEONG PIEUP-PHIEUPH */ + ["\u11E5", "\u11E5"], /* HANGUL JONGSEONG PIEUP-HIEUH */ + ["\u11E6", "\u11E6"], /* HANGUL JONGSEONG KAPYEOUNPIEUP */ + ["\u11E7", "\u11E7"], /* HANGUL JONGSEONG SIOS-KIYEOK */ + ["\u11E8", "\u11E8"], /* HANGUL JONGSEONG SIOS-TIKEUT */ + ["\u11E9", "\u11E9"], /* HANGUL JONGSEONG SIOS-RIEUL */ + ["\u11EA", "\u11EA"], /* HANGUL JONGSEONG SIOS-PIEUP */ + ["\u11EB", "\u11EB"], /* HANGUL JONGSEONG PANSIOS */ + ["\u11EC", "\u11EC"], /* HANGUL JONGSEONG IEUNG-KIYEOK */ + ["\u11ED", "\u11ED"], /* HANGUL JONGSEONG IEUNG-SSANGKIYEOK */ + ["\u11EE", "\u11EE"], /* HANGUL JONGSEONG SSANGIEUNG */ + ["\u11EF", "\u11EF"], /* HANGUL JONGSEONG IEUNG-KHIEUKH */ + ["\u11F0", "\u11F0"], /* HANGUL JONGSEONG YESIEUNG */ + ["\u11F1", "\u11F1"], /* HANGUL JONGSEONG YESIEUNG-SIOS */ + ["\u11F2", "\u11F2"], /* HANGUL JONGSEONG YESIEUNG-PANSIOS */ + ["\u11F3", "\u11F3"], /* HANGUL JONGSEONG PHIEUPH-PIEUP */ + ["\u11F4", "\u11F4"], /* HANGUL JONGSEONG KAPYEOUNPHIEUPH */ + ["\u11F5", "\u11F5"], /* HANGUL JONGSEONG HIEUH-NIEUN */ + ["\u11F6", "\u11F6"], /* HANGUL JONGSEONG HIEUH-RIEUL */ + ["\u11F7", "\u11F7"], /* HANGUL JONGSEONG HIEUH-MIEUM */ + ["\u11F8", "\u11F8"], /* HANGUL JONGSEONG HIEUH-PIEUP */ + ["\u11F9", "\u11F9"], /* HANGUL JONGSEONG YEORINHIEUH */ + ["\u11FA", "\u11FA"], /* HANGUL JONGSEONG KIYEOK-NIEUN */ + ["\u11FB", "\u11FB"], /* HANGUL JONGSEONG KIYEOK-PIEUP */ + ["\u11FC", "\u11FC"], /* HANGUL JONGSEONG KIYEOK-CHIEUCH */ + ["\u11FD", "\u11FD"], /* HANGUL JONGSEONG KIYEOK-KHIEUKH */ + ["\u11FE", "\u11FE"], /* HANGUL JONGSEONG KIYEOK-HIEUH */ + ["\u11FF", "\u11FF"], /* HANGUL JONGSEONG SSANGNIEUN */ + ["\u1200", "\u1200"], /* ETHIOPIC SYLLABLE HA */ + ["\u1201", "\u1201"], /* ETHIOPIC SYLLABLE HU */ + ["\u1202", "\u1202"], /* ETHIOPIC SYLLABLE HI */ + ["\u1203", "\u1203"], /* ETHIOPIC SYLLABLE HAA */ + ["\u1204", "\u1204"], /* ETHIOPIC SYLLABLE HEE */ + ["\u1205", "\u1205"], /* ETHIOPIC SYLLABLE HE */ + ["\u1206", "\u1206"], /* ETHIOPIC SYLLABLE HO */ + ["\u1207", "\u1207"], /* ETHIOPIC SYLLABLE HOA */ + ["\u1208", "\u1208"], /* ETHIOPIC SYLLABLE LA */ + ["\u1209", "\u1209"], /* ETHIOPIC SYLLABLE LU */ + ["\u120A", "\u120A"], /* ETHIOPIC SYLLABLE LI */ + ["\u120B", "\u120B"], /* ETHIOPIC SYLLABLE LAA */ + ["\u120C", "\u120C"], /* ETHIOPIC SYLLABLE LEE */ + ["\u120D", "\u120D"], /* ETHIOPIC SYLLABLE LE */ + ["\u120E", "\u120E"], /* ETHIOPIC SYLLABLE LO */ + ["\u120F", "\u120F"], /* ETHIOPIC SYLLABLE LWA */ + ["\u1210", "\u1210"], /* ETHIOPIC SYLLABLE HHA */ + ["\u1211", "\u1211"], /* ETHIOPIC SYLLABLE HHU */ + ["\u1212", "\u1212"], /* ETHIOPIC SYLLABLE HHI */ + ["\u1213", "\u1213"], /* ETHIOPIC SYLLABLE HHAA */ + ["\u1214", "\u1214"], /* ETHIOPIC SYLLABLE HHEE */ + ["\u1215", "\u1215"], /* ETHIOPIC SYLLABLE HHE */ + ["\u1216", "\u1216"], /* ETHIOPIC SYLLABLE HHO */ + ["\u1217", "\u1217"], /* ETHIOPIC SYLLABLE HHWA */ + ["\u1218", "\u1218"], /* ETHIOPIC SYLLABLE MA */ + ["\u1219", "\u1219"], /* ETHIOPIC SYLLABLE MU */ + ["\u121A", "\u121A"], /* ETHIOPIC SYLLABLE MI */ + ["\u121B", "\u121B"], /* ETHIOPIC SYLLABLE MAA */ + ["\u121C", "\u121C"], /* ETHIOPIC SYLLABLE MEE */ + ["\u121D", "\u121D"], /* ETHIOPIC SYLLABLE ME */ + ["\u121E", "\u121E"], /* ETHIOPIC SYLLABLE MO */ + ["\u121F", "\u121F"], /* ETHIOPIC SYLLABLE MWA */ + ["\u1220", "\u1220"], /* ETHIOPIC SYLLABLE SZA */ + ["\u1221", "\u1221"], /* ETHIOPIC SYLLABLE SZU */ + ["\u1222", "\u1222"], /* ETHIOPIC SYLLABLE SZI */ + ["\u1223", "\u1223"], /* ETHIOPIC SYLLABLE SZAA */ + ["\u1224", "\u1224"], /* ETHIOPIC SYLLABLE SZEE */ + ["\u1225", "\u1225"], /* ETHIOPIC SYLLABLE SZE */ + ["\u1226", "\u1226"], /* ETHIOPIC SYLLABLE SZO */ + ["\u1227", "\u1227"], /* ETHIOPIC SYLLABLE SZWA */ + ["\u1228", "\u1228"], /* ETHIOPIC SYLLABLE RA */ + ["\u1229", "\u1229"], /* ETHIOPIC SYLLABLE RU */ + ["\u122A", "\u122A"], /* ETHIOPIC SYLLABLE RI */ + ["\u122B", "\u122B"], /* ETHIOPIC SYLLABLE RAA */ + ["\u122C", "\u122C"], /* ETHIOPIC SYLLABLE REE */ + ["\u122D", "\u122D"], /* ETHIOPIC SYLLABLE RE */ + ["\u122E", "\u122E"], /* ETHIOPIC SYLLABLE RO */ + ["\u122F", "\u122F"], /* ETHIOPIC SYLLABLE RWA */ + ["\u1230", "\u1230"], /* ETHIOPIC SYLLABLE SA */ + ["\u1231", "\u1231"], /* ETHIOPIC SYLLABLE SU */ + ["\u1232", "\u1232"], /* ETHIOPIC SYLLABLE SI */ + ["\u1233", "\u1233"], /* ETHIOPIC SYLLABLE SAA */ + ["\u1234", "\u1234"], /* ETHIOPIC SYLLABLE SEE */ + ["\u1235", "\u1235"], /* ETHIOPIC SYLLABLE SE */ + ["\u1236", "\u1236"], /* ETHIOPIC SYLLABLE SO */ + ["\u1237", "\u1237"], /* ETHIOPIC SYLLABLE SWA */ + ["\u1238", "\u1238"], /* ETHIOPIC SYLLABLE SHA */ + ["\u1239", "\u1239"], /* ETHIOPIC SYLLABLE SHU */ + ["\u123A", "\u123A"], /* ETHIOPIC SYLLABLE SHI */ + ["\u123B", "\u123B"], /* ETHIOPIC SYLLABLE SHAA */ + ["\u123C", "\u123C"], /* ETHIOPIC SYLLABLE SHEE */ + ["\u123D", "\u123D"], /* ETHIOPIC SYLLABLE SHE */ + ["\u123E", "\u123E"], /* ETHIOPIC SYLLABLE SHO */ + ["\u123F", "\u123F"], /* ETHIOPIC SYLLABLE SHWA */ + ["\u1240", "\u1240"], /* ETHIOPIC SYLLABLE QA */ + ["\u1241", "\u1241"], /* ETHIOPIC SYLLABLE QU */ + ["\u1242", "\u1242"], /* ETHIOPIC SYLLABLE QI */ + ["\u1243", "\u1243"], /* ETHIOPIC SYLLABLE QAA */ + ["\u1244", "\u1244"], /* ETHIOPIC SYLLABLE QEE */ + ["\u1245", "\u1245"], /* ETHIOPIC SYLLABLE QE */ + ["\u1246", "\u1246"], /* ETHIOPIC SYLLABLE QO */ + ["\u1247", "\u1247"], /* ETHIOPIC SYLLABLE QOA */ + ["\u1248", "\u1248"], /* ETHIOPIC SYLLABLE QWA */ + ["\u1249", "\u1249"], + ["\u124A", "\u124A"], /* ETHIOPIC SYLLABLE QWI */ + ["\u124B", "\u124B"], /* ETHIOPIC SYLLABLE QWAA */ + ["\u124C", "\u124C"], /* ETHIOPIC SYLLABLE QWEE */ + ["\u124D", "\u124D"], /* ETHIOPIC SYLLABLE QWE */ + ["\u124E", "\u124E"], + ["\u124F", "\u124F"], + ["\u1250", "\u1250"], /* ETHIOPIC SYLLABLE QHA */ + ["\u1251", "\u1251"], /* ETHIOPIC SYLLABLE QHU */ + ["\u1252", "\u1252"], /* ETHIOPIC SYLLABLE QHI */ + ["\u1253", "\u1253"], /* ETHIOPIC SYLLABLE QHAA */ + ["\u1254", "\u1254"], /* ETHIOPIC SYLLABLE QHEE */ + ["\u1255", "\u1255"], /* ETHIOPIC SYLLABLE QHE */ + ["\u1256", "\u1256"], /* ETHIOPIC SYLLABLE QHO */ + ["\u1257", "\u1257"], + ["\u1258", "\u1258"], /* ETHIOPIC SYLLABLE QHWA */ + ["\u1259", "\u1259"], + ["\u125A", "\u125A"], /* ETHIOPIC SYLLABLE QHWI */ + ["\u125B", "\u125B"], /* ETHIOPIC SYLLABLE QHWAA */ + ["\u125C", "\u125C"], /* ETHIOPIC SYLLABLE QHWEE */ + ["\u125D", "\u125D"], /* ETHIOPIC SYLLABLE QHWE */ + ["\u125E", "\u125E"], + ["\u125F", "\u125F"], + ["\u1260", "\u1260"], /* ETHIOPIC SYLLABLE BA */ + ["\u1261", "\u1261"], /* ETHIOPIC SYLLABLE BU */ + ["\u1262", "\u1262"], /* ETHIOPIC SYLLABLE BI */ + ["\u1263", "\u1263"], /* ETHIOPIC SYLLABLE BAA */ + ["\u1264", "\u1264"], /* ETHIOPIC SYLLABLE BEE */ + ["\u1265", "\u1265"], /* ETHIOPIC SYLLABLE BE */ + ["\u1266", "\u1266"], /* ETHIOPIC SYLLABLE BO */ + ["\u1267", "\u1267"], /* ETHIOPIC SYLLABLE BWA */ + ["\u1268", "\u1268"], /* ETHIOPIC SYLLABLE VA */ + ["\u1269", "\u1269"], /* ETHIOPIC SYLLABLE VU */ + ["\u126A", "\u126A"], /* ETHIOPIC SYLLABLE VI */ + ["\u126B", "\u126B"], /* ETHIOPIC SYLLABLE VAA */ + ["\u126C", "\u126C"], /* ETHIOPIC SYLLABLE VEE */ + ["\u126D", "\u126D"], /* ETHIOPIC SYLLABLE VE */ + ["\u126E", "\u126E"], /* ETHIOPIC SYLLABLE VO */ + ["\u126F", "\u126F"], /* ETHIOPIC SYLLABLE VWA */ + ["\u1270", "\u1270"], /* ETHIOPIC SYLLABLE TA */ + ["\u1271", "\u1271"], /* ETHIOPIC SYLLABLE TU */ + ["\u1272", "\u1272"], /* ETHIOPIC SYLLABLE TI */ + ["\u1273", "\u1273"], /* ETHIOPIC SYLLABLE TAA */ + ["\u1274", "\u1274"], /* ETHIOPIC SYLLABLE TEE */ + ["\u1275", "\u1275"], /* ETHIOPIC SYLLABLE TE */ + ["\u1276", "\u1276"], /* ETHIOPIC SYLLABLE TO */ + ["\u1277", "\u1277"], /* ETHIOPIC SYLLABLE TWA */ + ["\u1278", "\u1278"], /* ETHIOPIC SYLLABLE CA */ + ["\u1279", "\u1279"], /* ETHIOPIC SYLLABLE CU */ + ["\u127A", "\u127A"], /* ETHIOPIC SYLLABLE CI */ + ["\u127B", "\u127B"], /* ETHIOPIC SYLLABLE CAA */ + ["\u127C", "\u127C"], /* ETHIOPIC SYLLABLE CEE */ + ["\u127D", "\u127D"], /* ETHIOPIC SYLLABLE CE */ + ["\u127E", "\u127E"], /* ETHIOPIC SYLLABLE CO */ + ["\u127F", "\u127F"], /* ETHIOPIC SYLLABLE CWA */ + ["\u1280", "\u1280"], /* ETHIOPIC SYLLABLE XA */ + ["\u1281", "\u1281"], /* ETHIOPIC SYLLABLE XU */ + ["\u1282", "\u1282"], /* ETHIOPIC SYLLABLE XI */ + ["\u1283", "\u1283"], /* ETHIOPIC SYLLABLE XAA */ + ["\u1284", "\u1284"], /* ETHIOPIC SYLLABLE XEE */ + ["\u1285", "\u1285"], /* ETHIOPIC SYLLABLE XE */ + ["\u1286", "\u1286"], /* ETHIOPIC SYLLABLE XO */ + ["\u1287", "\u1287"], /* ETHIOPIC SYLLABLE XOA */ + ["\u1288", "\u1288"], /* ETHIOPIC SYLLABLE XWA */ + ["\u1289", "\u1289"], + ["\u128A", "\u128A"], /* ETHIOPIC SYLLABLE XWI */ + ["\u128B", "\u128B"], /* ETHIOPIC SYLLABLE XWAA */ + ["\u128C", "\u128C"], /* ETHIOPIC SYLLABLE XWEE */ + ["\u128D", "\u128D"], /* ETHIOPIC SYLLABLE XWE */ + ["\u128E", "\u128E"], + ["\u128F", "\u128F"], + ["\u1290", "\u1290"], /* ETHIOPIC SYLLABLE NA */ + ["\u1291", "\u1291"], /* ETHIOPIC SYLLABLE NU */ + ["\u1292", "\u1292"], /* ETHIOPIC SYLLABLE NI */ + ["\u1293", "\u1293"], /* ETHIOPIC SYLLABLE NAA */ + ["\u1294", "\u1294"], /* ETHIOPIC SYLLABLE NEE */ + ["\u1295", "\u1295"], /* ETHIOPIC SYLLABLE NE */ + ["\u1296", "\u1296"], /* ETHIOPIC SYLLABLE NO */ + ["\u1297", "\u1297"], /* ETHIOPIC SYLLABLE NWA */ + ["\u1298", "\u1298"], /* ETHIOPIC SYLLABLE NYA */ + ["\u1299", "\u1299"], /* ETHIOPIC SYLLABLE NYU */ + ["\u129A", "\u129A"], /* ETHIOPIC SYLLABLE NYI */ + ["\u129B", "\u129B"], /* ETHIOPIC SYLLABLE NYAA */ + ["\u129C", "\u129C"], /* ETHIOPIC SYLLABLE NYEE */ + ["\u129D", "\u129D"], /* ETHIOPIC SYLLABLE NYE */ + ["\u129E", "\u129E"], /* ETHIOPIC SYLLABLE NYO */ + ["\u129F", "\u129F"], /* ETHIOPIC SYLLABLE NYWA */ + ["\u12A0", "\u12A0"], /* ETHIOPIC SYLLABLE GLOTTAL A */ + ["\u12A1", "\u12A1"], /* ETHIOPIC SYLLABLE GLOTTAL U */ + ["\u12A2", "\u12A2"], /* ETHIOPIC SYLLABLE GLOTTAL I */ + ["\u12A3", "\u12A3"], /* ETHIOPIC SYLLABLE GLOTTAL AA */ + ["\u12A4", "\u12A4"], /* ETHIOPIC SYLLABLE GLOTTAL EE */ + ["\u12A5", "\u12A5"], /* ETHIOPIC SYLLABLE GLOTTAL E */ + ["\u12A6", "\u12A6"], /* ETHIOPIC SYLLABLE GLOTTAL O */ + ["\u12A7", "\u12A7"], /* ETHIOPIC SYLLABLE GLOTTAL WA */ + ["\u12A8", "\u12A8"], /* ETHIOPIC SYLLABLE KA */ + ["\u12A9", "\u12A9"], /* ETHIOPIC SYLLABLE KU */ + ["\u12AA", "\u12AA"], /* ETHIOPIC SYLLABLE KI */ + ["\u12AB", "\u12AB"], /* ETHIOPIC SYLLABLE KAA */ + ["\u12AC", "\u12AC"], /* ETHIOPIC SYLLABLE KEE */ + ["\u12AD", "\u12AD"], /* ETHIOPIC SYLLABLE KE */ + ["\u12AE", "\u12AE"], /* ETHIOPIC SYLLABLE KO */ + ["\u12AF", "\u12AF"], /* ETHIOPIC SYLLABLE KOA */ + ["\u12B0", "\u12B0"], /* ETHIOPIC SYLLABLE KWA */ + ["\u12B1", "\u12B1"], + ["\u12B2", "\u12B2"], /* ETHIOPIC SYLLABLE KWI */ + ["\u12B3", "\u12B3"], /* ETHIOPIC SYLLABLE KWAA */ + ["\u12B4", "\u12B4"], /* ETHIOPIC SYLLABLE KWEE */ + ["\u12B5", "\u12B5"], /* ETHIOPIC SYLLABLE KWE */ + ["\u12B6", "\u12B6"], + ["\u12B7", "\u12B7"], + ["\u12B8", "\u12B8"], /* ETHIOPIC SYLLABLE KXA */ + ["\u12B9", "\u12B9"], /* ETHIOPIC SYLLABLE KXU */ + ["\u12BA", "\u12BA"], /* ETHIOPIC SYLLABLE KXI */ + ["\u12BB", "\u12BB"], /* ETHIOPIC SYLLABLE KXAA */ + ["\u12BC", "\u12BC"], /* ETHIOPIC SYLLABLE KXEE */ + ["\u12BD", "\u12BD"], /* ETHIOPIC SYLLABLE KXE */ + ["\u12BE", "\u12BE"], /* ETHIOPIC SYLLABLE KXO */ + ["\u12BF", "\u12BF"], + ["\u12C0", "\u12C0"], /* ETHIOPIC SYLLABLE KXWA */ + ["\u12C1", "\u12C1"], + ["\u12C2", "\u12C2"], /* ETHIOPIC SYLLABLE KXWI */ + ["\u12C3", "\u12C3"], /* ETHIOPIC SYLLABLE KXWAA */ + ["\u12C4", "\u12C4"], /* ETHIOPIC SYLLABLE KXWEE */ + ["\u12C5", "\u12C5"], /* ETHIOPIC SYLLABLE KXWE */ + ["\u12C6", "\u12C6"], + ["\u12C7", "\u12C7"], + ["\u12C8", "\u12C8"], /* ETHIOPIC SYLLABLE WA */ + ["\u12C9", "\u12C9"], /* ETHIOPIC SYLLABLE WU */ + ["\u12CA", "\u12CA"], /* ETHIOPIC SYLLABLE WI */ + ["\u12CB", "\u12CB"], /* ETHIOPIC SYLLABLE WAA */ + ["\u12CC", "\u12CC"], /* ETHIOPIC SYLLABLE WEE */ + ["\u12CD", "\u12CD"], /* ETHIOPIC SYLLABLE WE */ + ["\u12CE", "\u12CE"], /* ETHIOPIC SYLLABLE WO */ + ["\u12CF", "\u12CF"], /* ETHIOPIC SYLLABLE WOA */ + ["\u12D0", "\u12D0"], /* ETHIOPIC SYLLABLE PHARYNGEAL A */ + ["\u12D1", "\u12D1"], /* ETHIOPIC SYLLABLE PHARYNGEAL U */ + ["\u12D2", "\u12D2"], /* ETHIOPIC SYLLABLE PHARYNGEAL I */ + ["\u12D3", "\u12D3"], /* ETHIOPIC SYLLABLE PHARYNGEAL AA */ + ["\u12D4", "\u12D4"], /* ETHIOPIC SYLLABLE PHARYNGEAL EE */ + ["\u12D5", "\u12D5"], /* ETHIOPIC SYLLABLE PHARYNGEAL E */ + ["\u12D6", "\u12D6"], /* ETHIOPIC SYLLABLE PHARYNGEAL O */ + ["\u12D7", "\u12D7"], + ["\u12D8", "\u12D8"], /* ETHIOPIC SYLLABLE ZA */ + ["\u12D9", "\u12D9"], /* ETHIOPIC SYLLABLE ZU */ + ["\u12DA", "\u12DA"], /* ETHIOPIC SYLLABLE ZI */ + ["\u12DB", "\u12DB"], /* ETHIOPIC SYLLABLE ZAA */ + ["\u12DC", "\u12DC"], /* ETHIOPIC SYLLABLE ZEE */ + ["\u12DD", "\u12DD"], /* ETHIOPIC SYLLABLE ZE */ + ["\u12DE", "\u12DE"], /* ETHIOPIC SYLLABLE ZO */ + ["\u12DF", "\u12DF"], /* ETHIOPIC SYLLABLE ZWA */ + ["\u12E0", "\u12E0"], /* ETHIOPIC SYLLABLE ZHA */ + ["\u12E1", "\u12E1"], /* ETHIOPIC SYLLABLE ZHU */ + ["\u12E2", "\u12E2"], /* ETHIOPIC SYLLABLE ZHI */ + ["\u12E3", "\u12E3"], /* ETHIOPIC SYLLABLE ZHAA */ + ["\u12E4", "\u12E4"], /* ETHIOPIC SYLLABLE ZHEE */ + ["\u12E5", "\u12E5"], /* ETHIOPIC SYLLABLE ZHE */ + ["\u12E6", "\u12E6"], /* ETHIOPIC SYLLABLE ZHO */ + ["\u12E7", "\u12E7"], /* ETHIOPIC SYLLABLE ZHWA */ + ["\u12E8", "\u12E8"], /* ETHIOPIC SYLLABLE YA */ + ["\u12E9", "\u12E9"], /* ETHIOPIC SYLLABLE YU */ + ["\u12EA", "\u12EA"], /* ETHIOPIC SYLLABLE YI */ + ["\u12EB", "\u12EB"], /* ETHIOPIC SYLLABLE YAA */ + ["\u12EC", "\u12EC"], /* ETHIOPIC SYLLABLE YEE */ + ["\u12ED", "\u12ED"], /* ETHIOPIC SYLLABLE YE */ + ["\u12EE", "\u12EE"], /* ETHIOPIC SYLLABLE YO */ + ["\u12EF", "\u12EF"], /* ETHIOPIC SYLLABLE YOA */ + ["\u12F0", "\u12F0"], /* ETHIOPIC SYLLABLE DA */ + ["\u12F1", "\u12F1"], /* ETHIOPIC SYLLABLE DU */ + ["\u12F2", "\u12F2"], /* ETHIOPIC SYLLABLE DI */ + ["\u12F3", "\u12F3"], /* ETHIOPIC SYLLABLE DAA */ + ["\u12F4", "\u12F4"], /* ETHIOPIC SYLLABLE DEE */ + ["\u12F5", "\u12F5"], /* ETHIOPIC SYLLABLE DE */ + ["\u12F6", "\u12F6"], /* ETHIOPIC SYLLABLE DO */ + ["\u12F7", "\u12F7"], /* ETHIOPIC SYLLABLE DWA */ + ["\u12F8", "\u12F8"], /* ETHIOPIC SYLLABLE DDA */ + ["\u12F9", "\u12F9"], /* ETHIOPIC SYLLABLE DDU */ + ["\u12FA", "\u12FA"], /* ETHIOPIC SYLLABLE DDI */ + ["\u12FB", "\u12FB"], /* ETHIOPIC SYLLABLE DDAA */ + ["\u12FC", "\u12FC"], /* ETHIOPIC SYLLABLE DDEE */ + ["\u12FD", "\u12FD"], /* ETHIOPIC SYLLABLE DDE */ + ["\u12FE", "\u12FE"], /* ETHIOPIC SYLLABLE DDO */ + ["\u12FF", "\u12FF"], /* ETHIOPIC SYLLABLE DDWA */ + ["\u1300", "\u1300"], /* ETHIOPIC SYLLABLE JA */ + ["\u1301", "\u1301"], /* ETHIOPIC SYLLABLE JU */ + ["\u1302", "\u1302"], /* ETHIOPIC SYLLABLE JI */ + ["\u1303", "\u1303"], /* ETHIOPIC SYLLABLE JAA */ + ["\u1304", "\u1304"], /* ETHIOPIC SYLLABLE JEE */ + ["\u1305", "\u1305"], /* ETHIOPIC SYLLABLE JE */ + ["\u1306", "\u1306"], /* ETHIOPIC SYLLABLE JO */ + ["\u1307", "\u1307"], /* ETHIOPIC SYLLABLE JWA */ + ["\u1308", "\u1308"], /* ETHIOPIC SYLLABLE GA */ + ["\u1309", "\u1309"], /* ETHIOPIC SYLLABLE GU */ + ["\u130A", "\u130A"], /* ETHIOPIC SYLLABLE GI */ + ["\u130B", "\u130B"], /* ETHIOPIC SYLLABLE GAA */ + ["\u130C", "\u130C"], /* ETHIOPIC SYLLABLE GEE */ + ["\u130D", "\u130D"], /* ETHIOPIC SYLLABLE GE */ + ["\u130E", "\u130E"], /* ETHIOPIC SYLLABLE GO */ + ["\u130F", "\u130F"], /* ETHIOPIC SYLLABLE GOA */ + ["\u1310", "\u1310"], /* ETHIOPIC SYLLABLE GWA */ + ["\u1311", "\u1311"], + ["\u1312", "\u1312"], /* ETHIOPIC SYLLABLE GWI */ + ["\u1313", "\u1313"], /* ETHIOPIC SYLLABLE GWAA */ + ["\u1314", "\u1314"], /* ETHIOPIC SYLLABLE GWEE */ + ["\u1315", "\u1315"], /* ETHIOPIC SYLLABLE GWE */ + ["\u1316", "\u1316"], + ["\u1317", "\u1317"], + ["\u1318", "\u1318"], /* ETHIOPIC SYLLABLE GGA */ + ["\u1319", "\u1319"], /* ETHIOPIC SYLLABLE GGU */ + ["\u131A", "\u131A"], /* ETHIOPIC SYLLABLE GGI */ + ["\u131B", "\u131B"], /* ETHIOPIC SYLLABLE GGAA */ + ["\u131C", "\u131C"], /* ETHIOPIC SYLLABLE GGEE */ + ["\u131D", "\u131D"], /* ETHIOPIC SYLLABLE GGE */ + ["\u131E", "\u131E"], /* ETHIOPIC SYLLABLE GGO */ + ["\u131F", "\u131F"], /* ETHIOPIC SYLLABLE GGWAA */ + ["\u1320", "\u1320"], /* ETHIOPIC SYLLABLE THA */ + ["\u1321", "\u1321"], /* ETHIOPIC SYLLABLE THU */ + ["\u1322", "\u1322"], /* ETHIOPIC SYLLABLE THI */ + ["\u1323", "\u1323"], /* ETHIOPIC SYLLABLE THAA */ + ["\u1324", "\u1324"], /* ETHIOPIC SYLLABLE THEE */ + ["\u1325", "\u1325"], /* ETHIOPIC SYLLABLE THE */ + ["\u1326", "\u1326"], /* ETHIOPIC SYLLABLE THO */ + ["\u1327", "\u1327"], /* ETHIOPIC SYLLABLE THWA */ + ["\u1328", "\u1328"], /* ETHIOPIC SYLLABLE CHA */ + ["\u1329", "\u1329"], /* ETHIOPIC SYLLABLE CHU */ + ["\u132A", "\u132A"], /* ETHIOPIC SYLLABLE CHI */ + ["\u132B", "\u132B"], /* ETHIOPIC SYLLABLE CHAA */ + ["\u132C", "\u132C"], /* ETHIOPIC SYLLABLE CHEE */ + ["\u132D", "\u132D"], /* ETHIOPIC SYLLABLE CHE */ + ["\u132E", "\u132E"], /* ETHIOPIC SYLLABLE CHO */ + ["\u132F", "\u132F"], /* ETHIOPIC SYLLABLE CHWA */ + ["\u1330", "\u1330"], /* ETHIOPIC SYLLABLE PHA */ + ["\u1331", "\u1331"], /* ETHIOPIC SYLLABLE PHU */ + ["\u1332", "\u1332"], /* ETHIOPIC SYLLABLE PHI */ + ["\u1333", "\u1333"], /* ETHIOPIC SYLLABLE PHAA */ + ["\u1334", "\u1334"], /* ETHIOPIC SYLLABLE PHEE */ + ["\u1335", "\u1335"], /* ETHIOPIC SYLLABLE PHE */ + ["\u1336", "\u1336"], /* ETHIOPIC SYLLABLE PHO */ + ["\u1337", "\u1337"], /* ETHIOPIC SYLLABLE PHWA */ + ["\u1338", "\u1338"], /* ETHIOPIC SYLLABLE TSA */ + ["\u1339", "\u1339"], /* ETHIOPIC SYLLABLE TSU */ + ["\u133A", "\u133A"], /* ETHIOPIC SYLLABLE TSI */ + ["\u133B", "\u133B"], /* ETHIOPIC SYLLABLE TSAA */ + ["\u133C", "\u133C"], /* ETHIOPIC SYLLABLE TSEE */ + ["\u133D", "\u133D"], /* ETHIOPIC SYLLABLE TSE */ + ["\u133E", "\u133E"], /* ETHIOPIC SYLLABLE TSO */ + ["\u133F", "\u133F"], /* ETHIOPIC SYLLABLE TSWA */ + ["\u1340", "\u1340"], /* ETHIOPIC SYLLABLE TZA */ + ["\u1341", "\u1341"], /* ETHIOPIC SYLLABLE TZU */ + ["\u1342", "\u1342"], /* ETHIOPIC SYLLABLE TZI */ + ["\u1343", "\u1343"], /* ETHIOPIC SYLLABLE TZAA */ + ["\u1344", "\u1344"], /* ETHIOPIC SYLLABLE TZEE */ + ["\u1345", "\u1345"], /* ETHIOPIC SYLLABLE TZE */ + ["\u1346", "\u1346"], /* ETHIOPIC SYLLABLE TZO */ + ["\u1347", "\u1347"], /* ETHIOPIC SYLLABLE TZOA */ + ["\u1348", "\u1348"], /* ETHIOPIC SYLLABLE FA */ + ["\u1349", "\u1349"], /* ETHIOPIC SYLLABLE FU */ + ["\u134A", "\u134A"], /* ETHIOPIC SYLLABLE FI */ + ["\u134B", "\u134B"], /* ETHIOPIC SYLLABLE FAA */ + ["\u134C", "\u134C"], /* ETHIOPIC SYLLABLE FEE */ + ["\u134D", "\u134D"], /* ETHIOPIC SYLLABLE FE */ + ["\u134E", "\u134E"], /* ETHIOPIC SYLLABLE FO */ + ["\u134F", "\u134F"], /* ETHIOPIC SYLLABLE FWA */ + ["\u1350", "\u1350"], /* ETHIOPIC SYLLABLE PA */ + ["\u1351", "\u1351"], /* ETHIOPIC SYLLABLE PU */ + ["\u1352", "\u1352"], /* ETHIOPIC SYLLABLE PI */ + ["\u1353", "\u1353"], /* ETHIOPIC SYLLABLE PAA */ + ["\u1354", "\u1354"], /* ETHIOPIC SYLLABLE PEE */ + ["\u1355", "\u1355"], /* ETHIOPIC SYLLABLE PE */ + ["\u1356", "\u1356"], /* ETHIOPIC SYLLABLE PO */ + ["\u1357", "\u1357"], /* ETHIOPIC SYLLABLE PWA */ + ["\u1358", "\u1358"], /* ETHIOPIC SYLLABLE RYA */ + ["\u1359", "\u1359"], /* ETHIOPIC SYLLABLE MYA */ + ["\u135A", "\u135A"], /* ETHIOPIC SYLLABLE FYA */ + ["\u135B", "\u135B"], + ["\u135C", "\u135C"], + ["\u135D", "\u135D"], /* ETHIOPIC COMBINING GEMINATION AND VOWEL LENGTH MARK */ + ["\u135E", "\u135E"], /* ETHIOPIC COMBINING VOWEL LENGTH MARK */ + ["\u135F", "\u135F"], /* ETHIOPIC COMBINING GEMINATION MARK */ + ["\u1360", "\u1360"], /* ETHIOPIC SECTION MARK */ + ["\u1361", "\u1361"], /* ETHIOPIC WORDSPACE */ + ["\u1362", "\u1362"], /* ETHIOPIC FULL STOP */ + ["\u1363", "\u1363"], /* ETHIOPIC COMMA */ + ["\u1364", "\u1364"], /* ETHIOPIC SEMICOLON */ + ["\u1365", "\u1365"], /* ETHIOPIC COLON */ + ["\u1366", "\u1366"], /* ETHIOPIC PREFACE COLON */ + ["\u1367", "\u1367"], /* ETHIOPIC QUESTION MARK */ + ["\u1368", "\u1368"], /* ETHIOPIC PARAGRAPH SEPARATOR */ + ["\u1369", "\u1369"], /* ETHIOPIC DIGIT ONE */ + ["\u136A", "\u136A"], /* ETHIOPIC DIGIT TWO */ + ["\u136B", "\u136B"], /* ETHIOPIC DIGIT THREE */ + ["\u136C", "\u136C"], /* ETHIOPIC DIGIT FOUR */ + ["\u136D", "\u136D"], /* ETHIOPIC DIGIT FIVE */ + ["\u136E", "\u136E"], /* ETHIOPIC DIGIT SIX */ + ["\u136F", "\u136F"], /* ETHIOPIC DIGIT SEVEN */ + ["\u1370", "\u1370"], /* ETHIOPIC DIGIT EIGHT */ + ["\u1371", "\u1371"], /* ETHIOPIC DIGIT NINE */ + ["\u1372", "\u1372"], /* ETHIOPIC NUMBER TEN */ + ["\u1373", "\u1373"], /* ETHIOPIC NUMBER TWENTY */ + ["\u1374", "\u1374"], /* ETHIOPIC NUMBER THIRTY */ + ["\u1375", "\u1375"], /* ETHIOPIC NUMBER FORTY */ + ["\u1376", "\u1376"], /* ETHIOPIC NUMBER FIFTY */ + ["\u1377", "\u1377"], /* ETHIOPIC NUMBER SIXTY */ + ["\u1378", "\u1378"], /* ETHIOPIC NUMBER SEVENTY */ + ["\u1379", "\u1379"], /* ETHIOPIC NUMBER EIGHTY */ + ["\u137A", "\u137A"], /* ETHIOPIC NUMBER NINETY */ + ["\u137B", "\u137B"], /* ETHIOPIC NUMBER HUNDRED */ + ["\u137C", "\u137C"], /* ETHIOPIC NUMBER TEN THOUSAND */ + ["\u137D", "\u137D"], + ["\u137E", "\u137E"], + ["\u137F", "\u137F"], + ["\u1380", "\u1380"], /* ETHIOPIC SYLLABLE SEBATBEIT MWA */ + ["\u1381", "\u1381"], /* ETHIOPIC SYLLABLE MWI */ + ["\u1382", "\u1382"], /* ETHIOPIC SYLLABLE MWEE */ + ["\u1383", "\u1383"], /* ETHIOPIC SYLLABLE MWE */ + ["\u1384", "\u1384"], /* ETHIOPIC SYLLABLE SEBATBEIT BWA */ + ["\u1385", "\u1385"], /* ETHIOPIC SYLLABLE BWI */ + ["\u1386", "\u1386"], /* ETHIOPIC SYLLABLE BWEE */ + ["\u1387", "\u1387"], /* ETHIOPIC SYLLABLE BWE */ + ["\u1388", "\u1388"], /* ETHIOPIC SYLLABLE SEBATBEIT FWA */ + ["\u1389", "\u1389"], /* ETHIOPIC SYLLABLE FWI */ + ["\u138A", "\u138A"], /* ETHIOPIC SYLLABLE FWEE */ + ["\u138B", "\u138B"], /* ETHIOPIC SYLLABLE FWE */ + ["\u138C", "\u138C"], /* ETHIOPIC SYLLABLE SEBATBEIT PWA */ + ["\u138D", "\u138D"], /* ETHIOPIC SYLLABLE PWI */ + ["\u138E", "\u138E"], /* ETHIOPIC SYLLABLE PWEE */ + ["\u138F", "\u138F"], /* ETHIOPIC SYLLABLE PWE */ + ["\u1390", "\u1390"], /* ETHIOPIC TONAL MARK YIZET */ + ["\u1391", "\u1391"], /* ETHIOPIC TONAL MARK DERET */ + ["\u1392", "\u1392"], /* ETHIOPIC TONAL MARK RIKRIK */ + ["\u1393", "\u1393"], /* ETHIOPIC TONAL MARK SHORT RIKRIK */ + ["\u1394", "\u1394"], /* ETHIOPIC TONAL MARK DIFAT */ + ["\u1395", "\u1395"], /* ETHIOPIC TONAL MARK KENAT */ + ["\u1396", "\u1396"], /* ETHIOPIC TONAL MARK CHIRET */ + ["\u1397", "\u1397"], /* ETHIOPIC TONAL MARK HIDET */ + ["\u1398", "\u1398"], /* ETHIOPIC TONAL MARK DERET-HIDET */ + ["\u1399", "\u1399"], /* ETHIOPIC TONAL MARK KURT */ + ["\u139A", "\u139A"], + ["\u139B", "\u139B"], + ["\u139C", "\u139C"], + ["\u139D", "\u139D"], + ["\u139E", "\u139E"], + ["\u139F", "\u139F"], + ["\u13A0", "\uAB70"], /* CHEROKEE LETTER A */ + ["\u13A1", "\uAB71"], /* CHEROKEE LETTER E */ + ["\u13A2", "\uAB72"], /* CHEROKEE LETTER I */ + ["\u13A3", "\uAB73"], /* CHEROKEE LETTER O */ + ["\u13A4", "\uAB74"], /* CHEROKEE LETTER U */ + ["\u13A5", "\uAB75"], /* CHEROKEE LETTER V */ + ["\u13A6", "\uAB76"], /* CHEROKEE LETTER GA */ + ["\u13A7", "\uAB77"], /* CHEROKEE LETTER KA */ + ["\u13A8", "\uAB78"], /* CHEROKEE LETTER GE */ + ["\u13A9", "\uAB79"], /* CHEROKEE LETTER GI */ + ["\u13AA", "\uAB7A"], /* CHEROKEE LETTER GO */ + ["\u13AB", "\uAB7B"], /* CHEROKEE LETTER GU */ + ["\u13AC", "\uAB7C"], /* CHEROKEE LETTER GV */ + ["\u13AD", "\uAB7D"], /* CHEROKEE LETTER HA */ + ["\u13AE", "\uAB7E"], /* CHEROKEE LETTER HE */ + ["\u13AF", "\uAB7F"], /* CHEROKEE LETTER HI */ + ["\u13B0", "\uAB80"], /* CHEROKEE LETTER HO */ + ["\u13B1", "\uAB81"], /* CHEROKEE LETTER HU */ + ["\u13B2", "\uAB82"], /* CHEROKEE LETTER HV */ + ["\u13B3", "\uAB83"], /* CHEROKEE LETTER LA */ + ["\u13B4", "\uAB84"], /* CHEROKEE LETTER LE */ + ["\u13B5", "\uAB85"], /* CHEROKEE LETTER LI */ + ["\u13B6", "\uAB86"], /* CHEROKEE LETTER LO */ + ["\u13B7", "\uAB87"], /* CHEROKEE LETTER LU */ + ["\u13B8", "\uAB88"], /* CHEROKEE LETTER LV */ + ["\u13B9", "\uAB89"], /* CHEROKEE LETTER MA */ + ["\u13BA", "\uAB8A"], /* CHEROKEE LETTER ME */ + ["\u13BB", "\uAB8B"], /* CHEROKEE LETTER MI */ + ["\u13BC", "\uAB8C"], /* CHEROKEE LETTER MO */ + ["\u13BD", "\uAB8D"], /* CHEROKEE LETTER MU */ + ["\u13BE", "\uAB8E"], /* CHEROKEE LETTER NA */ + ["\u13BF", "\uAB8F"], /* CHEROKEE LETTER HNA */ + ["\u13C0", "\uAB90"], /* CHEROKEE LETTER NAH */ + ["\u13C1", "\uAB91"], /* CHEROKEE LETTER NE */ + ["\u13C2", "\uAB92"], /* CHEROKEE LETTER NI */ + ["\u13C3", "\uAB93"], /* CHEROKEE LETTER NO */ + ["\u13C4", "\uAB94"], /* CHEROKEE LETTER NU */ + ["\u13C5", "\uAB95"], /* CHEROKEE LETTER NV */ + ["\u13C6", "\uAB96"], /* CHEROKEE LETTER QUA */ + ["\u13C7", "\uAB97"], /* CHEROKEE LETTER QUE */ + ["\u13C8", "\uAB98"], /* CHEROKEE LETTER QUI */ + ["\u13C9", "\uAB99"], /* CHEROKEE LETTER QUO */ + ["\u13CA", "\uAB9A"], /* CHEROKEE LETTER QUU */ + ["\u13CB", "\uAB9B"], /* CHEROKEE LETTER QUV */ + ["\u13CC", "\uAB9C"], /* CHEROKEE LETTER SA */ + ["\u13CD", "\uAB9D"], /* CHEROKEE LETTER S */ + ["\u13CE", "\uAB9E"], /* CHEROKEE LETTER SE */ + ["\u13CF", "\uAB9F"], /* CHEROKEE LETTER SI */ + ["\u13D0", "\uABA0"], /* CHEROKEE LETTER SO */ + ["\u13D1", "\uABA1"], /* CHEROKEE LETTER SU */ + ["\u13D2", "\uABA2"], /* CHEROKEE LETTER SV */ + ["\u13D3", "\uABA3"], /* CHEROKEE LETTER DA */ + ["\u13D4", "\uABA4"], /* CHEROKEE LETTER TA */ + ["\u13D5", "\uABA5"], /* CHEROKEE LETTER DE */ + ["\u13D6", "\uABA6"], /* CHEROKEE LETTER TE */ + ["\u13D7", "\uABA7"], /* CHEROKEE LETTER DI */ + ["\u13D8", "\uABA8"], /* CHEROKEE LETTER TI */ + ["\u13D9", "\uABA9"], /* CHEROKEE LETTER DO */ + ["\u13DA", "\uABAA"], /* CHEROKEE LETTER DU */ + ["\u13DB", "\uABAB"], /* CHEROKEE LETTER DV */ + ["\u13DC", "\uABAC"], /* CHEROKEE LETTER DLA */ + ["\u13DD", "\uABAD"], /* CHEROKEE LETTER TLA */ + ["\u13DE", "\uABAE"], /* CHEROKEE LETTER TLE */ + ["\u13DF", "\uABAF"], /* CHEROKEE LETTER TLI */ + ["\u13E0", "\uABB0"], /* CHEROKEE LETTER TLO */ + ["\u13E1", "\uABB1"], /* CHEROKEE LETTER TLU */ + ["\u13E2", "\uABB2"], /* CHEROKEE LETTER TLV */ + ["\u13E3", "\uABB3"], /* CHEROKEE LETTER TSA */ + ["\u13E4", "\uABB4"], /* CHEROKEE LETTER TSE */ + ["\u13E5", "\uABB5"], /* CHEROKEE LETTER TSI */ + ["\u13E6", "\uABB6"], /* CHEROKEE LETTER TSO */ + ["\u13E7", "\uABB7"], /* CHEROKEE LETTER TSU */ + ["\u13E8", "\uABB8"], /* CHEROKEE LETTER TSV */ + ["\u13E9", "\uABB9"], /* CHEROKEE LETTER WA */ + ["\u13EA", "\uABBA"], /* CHEROKEE LETTER WE */ + ["\u13EB", "\uABBB"], /* CHEROKEE LETTER WI */ + ["\u13EC", "\uABBC"], /* CHEROKEE LETTER WO */ + ["\u13ED", "\uABBD"], /* CHEROKEE LETTER WU */ + ["\u13EE", "\uABBE"], /* CHEROKEE LETTER WV */ + ["\u13EF", "\uABBF"], /* CHEROKEE LETTER YA */ + ["\u13F0", "\u13F8"], /* CHEROKEE LETTER YE */ + ["\u13F1", "\u13F9"], /* CHEROKEE LETTER YI */ + ["\u13F2", "\u13FA"], /* CHEROKEE LETTER YO */ + ["\u13F3", "\u13FB"], /* CHEROKEE LETTER YU */ + ["\u13F4", "\u13FC"], /* CHEROKEE LETTER YV */ + ["\u13F5", "\u13FD"], /* CHEROKEE LETTER MV */ + ["\u13F6", "\u13F6"], + ["\u13F7", "\u13F7"], + ["\u13F0", "\u13F8"], /* CHEROKEE SMALL LETTER YE */ + ["\u13F1", "\u13F9"], /* CHEROKEE SMALL LETTER YI */ + ["\u13F2", "\u13FA"], /* CHEROKEE SMALL LETTER YO */ + ["\u13F3", "\u13FB"], /* CHEROKEE SMALL LETTER YU */ + ["\u13F4", "\u13FC"], /* CHEROKEE SMALL LETTER YV */ + ["\u13F5", "\u13FD"], /* CHEROKEE SMALL LETTER MV */ + ["\u13FE", "\u13FE"], + ["\u13FF", "\u13FF"], + ["\u1400", "\u1400"], /* CANADIAN SYLLABICS HYPHEN */ + ["\u1401", "\u1401"], /* CANADIAN SYLLABICS E */ + ["\u1402", "\u1402"], /* CANADIAN SYLLABICS AAI */ + ["\u1403", "\u1403"], /* CANADIAN SYLLABICS I */ + ["\u1404", "\u1404"], /* CANADIAN SYLLABICS II */ + ["\u1405", "\u1405"], /* CANADIAN SYLLABICS O */ + ["\u1406", "\u1406"], /* CANADIAN SYLLABICS OO */ + ["\u1407", "\u1407"], /* CANADIAN SYLLABICS Y-CREE OO */ + ["\u1408", "\u1408"], /* CANADIAN SYLLABICS CARRIER EE */ + ["\u1409", "\u1409"], /* CANADIAN SYLLABICS CARRIER I */ + ["\u140A", "\u140A"], /* CANADIAN SYLLABICS A */ + ["\u140B", "\u140B"], /* CANADIAN SYLLABICS AA */ + ["\u140C", "\u140C"], /* CANADIAN SYLLABICS WE */ + ["\u140D", "\u140D"], /* CANADIAN SYLLABICS WEST-CREE WE */ + ["\u140E", "\u140E"], /* CANADIAN SYLLABICS WI */ + ["\u140F", "\u140F"], /* CANADIAN SYLLABICS WEST-CREE WI */ + ["\u1410", "\u1410"], /* CANADIAN SYLLABICS WII */ + ["\u1411", "\u1411"], /* CANADIAN SYLLABICS WEST-CREE WII */ + ["\u1412", "\u1412"], /* CANADIAN SYLLABICS WO */ + ["\u1413", "\u1413"], /* CANADIAN SYLLABICS WEST-CREE WO */ + ["\u1414", "\u1414"], /* CANADIAN SYLLABICS WOO */ + ["\u1415", "\u1415"], /* CANADIAN SYLLABICS WEST-CREE WOO */ + ["\u1416", "\u1416"], /* CANADIAN SYLLABICS NASKAPI WOO */ + ["\u1417", "\u1417"], /* CANADIAN SYLLABICS WA */ + ["\u1418", "\u1418"], /* CANADIAN SYLLABICS WEST-CREE WA */ + ["\u1419", "\u1419"], /* CANADIAN SYLLABICS WAA */ + ["\u141A", "\u141A"], /* CANADIAN SYLLABICS WEST-CREE WAA */ + ["\u141B", "\u141B"], /* CANADIAN SYLLABICS NASKAPI WAA */ + ["\u141C", "\u141C"], /* CANADIAN SYLLABICS AI */ + ["\u141D", "\u141D"], /* CANADIAN SYLLABICS Y-CREE W */ + ["\u141E", "\u141E"], /* CANADIAN SYLLABICS GLOTTAL STOP */ + ["\u141F", "\u141F"], /* CANADIAN SYLLABICS FINAL ACUTE */ + ["\u1420", "\u1420"], /* CANADIAN SYLLABICS FINAL GRAVE */ + ["\u1421", "\u1421"], /* CANADIAN SYLLABICS FINAL BOTTOM HALF RING */ + ["\u1422", "\u1422"], /* CANADIAN SYLLABICS FINAL TOP HALF RING */ + ["\u1423", "\u1423"], /* CANADIAN SYLLABICS FINAL RIGHT HALF RING */ + ["\u1424", "\u1424"], /* CANADIAN SYLLABICS FINAL RING */ + ["\u1425", "\u1425"], /* CANADIAN SYLLABICS FINAL DOUBLE ACUTE */ + ["\u1426", "\u1426"], /* CANADIAN SYLLABICS FINAL DOUBLE SHORT VERTICAL STROKES */ + ["\u1427", "\u1427"], /* CANADIAN SYLLABICS FINAL MIDDLE DOT */ + ["\u1428", "\u1428"], /* CANADIAN SYLLABICS FINAL SHORT HORIZONTAL STROKE */ + ["\u1429", "\u1429"], /* CANADIAN SYLLABICS FINAL PLUS */ + ["\u142A", "\u142A"], /* CANADIAN SYLLABICS FINAL DOWN TACK */ + ["\u142B", "\u142B"], /* CANADIAN SYLLABICS EN */ + ["\u142C", "\u142C"], /* CANADIAN SYLLABICS IN */ + ["\u142D", "\u142D"], /* CANADIAN SYLLABICS ON */ + ["\u142E", "\u142E"], /* CANADIAN SYLLABICS AN */ + ["\u142F", "\u142F"], /* CANADIAN SYLLABICS PE */ + ["\u1430", "\u1430"], /* CANADIAN SYLLABICS PAAI */ + ["\u1431", "\u1431"], /* CANADIAN SYLLABICS PI */ + ["\u1432", "\u1432"], /* CANADIAN SYLLABICS PII */ + ["\u1433", "\u1433"], /* CANADIAN SYLLABICS PO */ + ["\u1434", "\u1434"], /* CANADIAN SYLLABICS POO */ + ["\u1435", "\u1435"], /* CANADIAN SYLLABICS Y-CREE POO */ + ["\u1436", "\u1436"], /* CANADIAN SYLLABICS CARRIER HEE */ + ["\u1437", "\u1437"], /* CANADIAN SYLLABICS CARRIER HI */ + ["\u1438", "\u1438"], /* CANADIAN SYLLABICS PA */ + ["\u1439", "\u1439"], /* CANADIAN SYLLABICS PAA */ + ["\u143A", "\u143A"], /* CANADIAN SYLLABICS PWE */ + ["\u143B", "\u143B"], /* CANADIAN SYLLABICS WEST-CREE PWE */ + ["\u143C", "\u143C"], /* CANADIAN SYLLABICS PWI */ + ["\u143D", "\u143D"], /* CANADIAN SYLLABICS WEST-CREE PWI */ + ["\u143E", "\u143E"], /* CANADIAN SYLLABICS PWII */ + ["\u143F", "\u143F"], /* CANADIAN SYLLABICS WEST-CREE PWII */ + ["\u1440", "\u1440"], /* CANADIAN SYLLABICS PWO */ + ["\u1441", "\u1441"], /* CANADIAN SYLLABICS WEST-CREE PWO */ + ["\u1442", "\u1442"], /* CANADIAN SYLLABICS PWOO */ + ["\u1443", "\u1443"], /* CANADIAN SYLLABICS WEST-CREE PWOO */ + ["\u1444", "\u1444"], /* CANADIAN SYLLABICS PWA */ + ["\u1445", "\u1445"], /* CANADIAN SYLLABICS WEST-CREE PWA */ + ["\u1446", "\u1446"], /* CANADIAN SYLLABICS PWAA */ + ["\u1447", "\u1447"], /* CANADIAN SYLLABICS WEST-CREE PWAA */ + ["\u1448", "\u1448"], /* CANADIAN SYLLABICS Y-CREE PWAA */ + ["\u1449", "\u1449"], /* CANADIAN SYLLABICS P */ + ["\u144A", "\u144A"], /* CANADIAN SYLLABICS WEST-CREE P */ + ["\u144B", "\u144B"], /* CANADIAN SYLLABICS CARRIER H */ + ["\u144C", "\u144C"], /* CANADIAN SYLLABICS TE */ + ["\u144D", "\u144D"], /* CANADIAN SYLLABICS TAAI */ + ["\u144E", "\u144E"], /* CANADIAN SYLLABICS TI */ + ["\u144F", "\u144F"], /* CANADIAN SYLLABICS TII */ + ["\u1450", "\u1450"], /* CANADIAN SYLLABICS TO */ + ["\u1451", "\u1451"], /* CANADIAN SYLLABICS TOO */ + ["\u1452", "\u1452"], /* CANADIAN SYLLABICS Y-CREE TOO */ + ["\u1453", "\u1453"], /* CANADIAN SYLLABICS CARRIER DEE */ + ["\u1454", "\u1454"], /* CANADIAN SYLLABICS CARRIER DI */ + ["\u1455", "\u1455"], /* CANADIAN SYLLABICS TA */ + ["\u1456", "\u1456"], /* CANADIAN SYLLABICS TAA */ + ["\u1457", "\u1457"], /* CANADIAN SYLLABICS TWE */ + ["\u1458", "\u1458"], /* CANADIAN SYLLABICS WEST-CREE TWE */ + ["\u1459", "\u1459"], /* CANADIAN SYLLABICS TWI */ + ["\u145A", "\u145A"], /* CANADIAN SYLLABICS WEST-CREE TWI */ + ["\u145B", "\u145B"], /* CANADIAN SYLLABICS TWII */ + ["\u145C", "\u145C"], /* CANADIAN SYLLABICS WEST-CREE TWII */ + ["\u145D", "\u145D"], /* CANADIAN SYLLABICS TWO */ + ["\u145E", "\u145E"], /* CANADIAN SYLLABICS WEST-CREE TWO */ + ["\u145F", "\u145F"], /* CANADIAN SYLLABICS TWOO */ + ["\u1460", "\u1460"], /* CANADIAN SYLLABICS WEST-CREE TWOO */ + ["\u1461", "\u1461"], /* CANADIAN SYLLABICS TWA */ + ["\u1462", "\u1462"], /* CANADIAN SYLLABICS WEST-CREE TWA */ + ["\u1463", "\u1463"], /* CANADIAN SYLLABICS TWAA */ + ["\u1464", "\u1464"], /* CANADIAN SYLLABICS WEST-CREE TWAA */ + ["\u1465", "\u1465"], /* CANADIAN SYLLABICS NASKAPI TWAA */ + ["\u1466", "\u1466"], /* CANADIAN SYLLABICS T */ + ["\u1467", "\u1467"], /* CANADIAN SYLLABICS TTE */ + ["\u1468", "\u1468"], /* CANADIAN SYLLABICS TTI */ + ["\u1469", "\u1469"], /* CANADIAN SYLLABICS TTO */ + ["\u146A", "\u146A"], /* CANADIAN SYLLABICS TTA */ + ["\u146B", "\u146B"], /* CANADIAN SYLLABICS KE */ + ["\u146C", "\u146C"], /* CANADIAN SYLLABICS KAAI */ + ["\u146D", "\u146D"], /* CANADIAN SYLLABICS KI */ + ["\u146E", "\u146E"], /* CANADIAN SYLLABICS KII */ + ["\u146F", "\u146F"], /* CANADIAN SYLLABICS KO */ + ["\u1470", "\u1470"], /* CANADIAN SYLLABICS KOO */ + ["\u1471", "\u1471"], /* CANADIAN SYLLABICS Y-CREE KOO */ + ["\u1472", "\u1472"], /* CANADIAN SYLLABICS KA */ + ["\u1473", "\u1473"], /* CANADIAN SYLLABICS KAA */ + ["\u1474", "\u1474"], /* CANADIAN SYLLABICS KWE */ + ["\u1475", "\u1475"], /* CANADIAN SYLLABICS WEST-CREE KWE */ + ["\u1476", "\u1476"], /* CANADIAN SYLLABICS KWI */ + ["\u1477", "\u1477"], /* CANADIAN SYLLABICS WEST-CREE KWI */ + ["\u1478", "\u1478"], /* CANADIAN SYLLABICS KWII */ + ["\u1479", "\u1479"], /* CANADIAN SYLLABICS WEST-CREE KWII */ + ["\u147A", "\u147A"], /* CANADIAN SYLLABICS KWO */ + ["\u147B", "\u147B"], /* CANADIAN SYLLABICS WEST-CREE KWO */ + ["\u147C", "\u147C"], /* CANADIAN SYLLABICS KWOO */ + ["\u147D", "\u147D"], /* CANADIAN SYLLABICS WEST-CREE KWOO */ + ["\u147E", "\u147E"], /* CANADIAN SYLLABICS KWA */ + ["\u147F", "\u147F"], /* CANADIAN SYLLABICS WEST-CREE KWA */ + ["\u1480", "\u1480"], /* CANADIAN SYLLABICS KWAA */ + ["\u1481", "\u1481"], /* CANADIAN SYLLABICS WEST-CREE KWAA */ + ["\u1482", "\u1482"], /* CANADIAN SYLLABICS NASKAPI KWAA */ + ["\u1483", "\u1483"], /* CANADIAN SYLLABICS K */ + ["\u1484", "\u1484"], /* CANADIAN SYLLABICS KW */ + ["\u1485", "\u1485"], /* CANADIAN SYLLABICS SOUTH-SLAVEY KEH */ + ["\u1486", "\u1486"], /* CANADIAN SYLLABICS SOUTH-SLAVEY KIH */ + ["\u1487", "\u1487"], /* CANADIAN SYLLABICS SOUTH-SLAVEY KOH */ + ["\u1488", "\u1488"], /* CANADIAN SYLLABICS SOUTH-SLAVEY KAH */ + ["\u1489", "\u1489"], /* CANADIAN SYLLABICS CE */ + ["\u148A", "\u148A"], /* CANADIAN SYLLABICS CAAI */ + ["\u148B", "\u148B"], /* CANADIAN SYLLABICS CI */ + ["\u148C", "\u148C"], /* CANADIAN SYLLABICS CII */ + ["\u148D", "\u148D"], /* CANADIAN SYLLABICS CO */ + ["\u148E", "\u148E"], /* CANADIAN SYLLABICS COO */ + ["\u148F", "\u148F"], /* CANADIAN SYLLABICS Y-CREE COO */ + ["\u1490", "\u1490"], /* CANADIAN SYLLABICS CA */ + ["\u1491", "\u1491"], /* CANADIAN SYLLABICS CAA */ + ["\u1492", "\u1492"], /* CANADIAN SYLLABICS CWE */ + ["\u1493", "\u1493"], /* CANADIAN SYLLABICS WEST-CREE CWE */ + ["\u1494", "\u1494"], /* CANADIAN SYLLABICS CWI */ + ["\u1495", "\u1495"], /* CANADIAN SYLLABICS WEST-CREE CWI */ + ["\u1496", "\u1496"], /* CANADIAN SYLLABICS CWII */ + ["\u1497", "\u1497"], /* CANADIAN SYLLABICS WEST-CREE CWII */ + ["\u1498", "\u1498"], /* CANADIAN SYLLABICS CWO */ + ["\u1499", "\u1499"], /* CANADIAN SYLLABICS WEST-CREE CWO */ + ["\u149A", "\u149A"], /* CANADIAN SYLLABICS CWOO */ + ["\u149B", "\u149B"], /* CANADIAN SYLLABICS WEST-CREE CWOO */ + ["\u149C", "\u149C"], /* CANADIAN SYLLABICS CWA */ + ["\u149D", "\u149D"], /* CANADIAN SYLLABICS WEST-CREE CWA */ + ["\u149E", "\u149E"], /* CANADIAN SYLLABICS CWAA */ + ["\u149F", "\u149F"], /* CANADIAN SYLLABICS WEST-CREE CWAA */ + ["\u14A0", "\u14A0"], /* CANADIAN SYLLABICS NASKAPI CWAA */ + ["\u14A1", "\u14A1"], /* CANADIAN SYLLABICS C */ + ["\u14A2", "\u14A2"], /* CANADIAN SYLLABICS SAYISI TH */ + ["\u14A3", "\u14A3"], /* CANADIAN SYLLABICS ME */ + ["\u14A4", "\u14A4"], /* CANADIAN SYLLABICS MAAI */ + ["\u14A5", "\u14A5"], /* CANADIAN SYLLABICS MI */ + ["\u14A6", "\u14A6"], /* CANADIAN SYLLABICS MII */ + ["\u14A7", "\u14A7"], /* CANADIAN SYLLABICS MO */ + ["\u14A8", "\u14A8"], /* CANADIAN SYLLABICS MOO */ + ["\u14A9", "\u14A9"], /* CANADIAN SYLLABICS Y-CREE MOO */ + ["\u14AA", "\u14AA"], /* CANADIAN SYLLABICS MA */ + ["\u14AB", "\u14AB"], /* CANADIAN SYLLABICS MAA */ + ["\u14AC", "\u14AC"], /* CANADIAN SYLLABICS MWE */ + ["\u14AD", "\u14AD"], /* CANADIAN SYLLABICS WEST-CREE MWE */ + ["\u14AE", "\u14AE"], /* CANADIAN SYLLABICS MWI */ + ["\u14AF", "\u14AF"], /* CANADIAN SYLLABICS WEST-CREE MWI */ + ["\u14B0", "\u14B0"], /* CANADIAN SYLLABICS MWII */ + ["\u14B1", "\u14B1"], /* CANADIAN SYLLABICS WEST-CREE MWII */ + ["\u14B2", "\u14B2"], /* CANADIAN SYLLABICS MWO */ + ["\u14B3", "\u14B3"], /* CANADIAN SYLLABICS WEST-CREE MWO */ + ["\u14B4", "\u14B4"], /* CANADIAN SYLLABICS MWOO */ + ["\u14B5", "\u14B5"], /* CANADIAN SYLLABICS WEST-CREE MWOO */ + ["\u14B6", "\u14B6"], /* CANADIAN SYLLABICS MWA */ + ["\u14B7", "\u14B7"], /* CANADIAN SYLLABICS WEST-CREE MWA */ + ["\u14B8", "\u14B8"], /* CANADIAN SYLLABICS MWAA */ + ["\u14B9", "\u14B9"], /* CANADIAN SYLLABICS WEST-CREE MWAA */ + ["\u14BA", "\u14BA"], /* CANADIAN SYLLABICS NASKAPI MWAA */ + ["\u14BB", "\u14BB"], /* CANADIAN SYLLABICS M */ + ["\u14BC", "\u14BC"], /* CANADIAN SYLLABICS WEST-CREE M */ + ["\u14BD", "\u14BD"], /* CANADIAN SYLLABICS MH */ + ["\u14BE", "\u14BE"], /* CANADIAN SYLLABICS ATHAPASCAN M */ + ["\u14BF", "\u14BF"], /* CANADIAN SYLLABICS SAYISI M */ + ["\u14C0", "\u14C0"], /* CANADIAN SYLLABICS NE */ + ["\u14C1", "\u14C1"], /* CANADIAN SYLLABICS NAAI */ + ["\u14C2", "\u14C2"], /* CANADIAN SYLLABICS NI */ + ["\u14C3", "\u14C3"], /* CANADIAN SYLLABICS NII */ + ["\u14C4", "\u14C4"], /* CANADIAN SYLLABICS NO */ + ["\u14C5", "\u14C5"], /* CANADIAN SYLLABICS NOO */ + ["\u14C6", "\u14C6"], /* CANADIAN SYLLABICS Y-CREE NOO */ + ["\u14C7", "\u14C7"], /* CANADIAN SYLLABICS NA */ + ["\u14C8", "\u14C8"], /* CANADIAN SYLLABICS NAA */ + ["\u14C9", "\u14C9"], /* CANADIAN SYLLABICS NWE */ + ["\u14CA", "\u14CA"], /* CANADIAN SYLLABICS WEST-CREE NWE */ + ["\u14CB", "\u14CB"], /* CANADIAN SYLLABICS NWA */ + ["\u14CC", "\u14CC"], /* CANADIAN SYLLABICS WEST-CREE NWA */ + ["\u14CD", "\u14CD"], /* CANADIAN SYLLABICS NWAA */ + ["\u14CE", "\u14CE"], /* CANADIAN SYLLABICS WEST-CREE NWAA */ + ["\u14CF", "\u14CF"], /* CANADIAN SYLLABICS NASKAPI NWAA */ + ["\u14D0", "\u14D0"], /* CANADIAN SYLLABICS N */ + ["\u14D1", "\u14D1"], /* CANADIAN SYLLABICS CARRIER NG */ + ["\u14D2", "\u14D2"], /* CANADIAN SYLLABICS NH */ + ["\u14D3", "\u14D3"], /* CANADIAN SYLLABICS LE */ + ["\u14D4", "\u14D4"], /* CANADIAN SYLLABICS LAAI */ + ["\u14D5", "\u14D5"], /* CANADIAN SYLLABICS LI */ + ["\u14D6", "\u14D6"], /* CANADIAN SYLLABICS LII */ + ["\u14D7", "\u14D7"], /* CANADIAN SYLLABICS LO */ + ["\u14D8", "\u14D8"], /* CANADIAN SYLLABICS LOO */ + ["\u14D9", "\u14D9"], /* CANADIAN SYLLABICS Y-CREE LOO */ + ["\u14DA", "\u14DA"], /* CANADIAN SYLLABICS LA */ + ["\u14DB", "\u14DB"], /* CANADIAN SYLLABICS LAA */ + ["\u14DC", "\u14DC"], /* CANADIAN SYLLABICS LWE */ + ["\u14DD", "\u14DD"], /* CANADIAN SYLLABICS WEST-CREE LWE */ + ["\u14DE", "\u14DE"], /* CANADIAN SYLLABICS LWI */ + ["\u14DF", "\u14DF"], /* CANADIAN SYLLABICS WEST-CREE LWI */ + ["\u14E0", "\u14E0"], /* CANADIAN SYLLABICS LWII */ + ["\u14E1", "\u14E1"], /* CANADIAN SYLLABICS WEST-CREE LWII */ + ["\u14E2", "\u14E2"], /* CANADIAN SYLLABICS LWO */ + ["\u14E3", "\u14E3"], /* CANADIAN SYLLABICS WEST-CREE LWO */ + ["\u14E4", "\u14E4"], /* CANADIAN SYLLABICS LWOO */ + ["\u14E5", "\u14E5"], /* CANADIAN SYLLABICS WEST-CREE LWOO */ + ["\u14E6", "\u14E6"], /* CANADIAN SYLLABICS LWA */ + ["\u14E7", "\u14E7"], /* CANADIAN SYLLABICS WEST-CREE LWA */ + ["\u14E8", "\u14E8"], /* CANADIAN SYLLABICS LWAA */ + ["\u14E9", "\u14E9"], /* CANADIAN SYLLABICS WEST-CREE LWAA */ + ["\u14EA", "\u14EA"], /* CANADIAN SYLLABICS L */ + ["\u14EB", "\u14EB"], /* CANADIAN SYLLABICS WEST-CREE L */ + ["\u14EC", "\u14EC"], /* CANADIAN SYLLABICS MEDIAL L */ + ["\u14ED", "\u14ED"], /* CANADIAN SYLLABICS SE */ + ["\u14EE", "\u14EE"], /* CANADIAN SYLLABICS SAAI */ + ["\u14EF", "\u14EF"], /* CANADIAN SYLLABICS SI */ + ["\u14F0", "\u14F0"], /* CANADIAN SYLLABICS SII */ + ["\u14F1", "\u14F1"], /* CANADIAN SYLLABICS SO */ + ["\u14F2", "\u14F2"], /* CANADIAN SYLLABICS SOO */ + ["\u14F3", "\u14F3"], /* CANADIAN SYLLABICS Y-CREE SOO */ + ["\u14F4", "\u14F4"], /* CANADIAN SYLLABICS SA */ + ["\u14F5", "\u14F5"], /* CANADIAN SYLLABICS SAA */ + ["\u14F6", "\u14F6"], /* CANADIAN SYLLABICS SWE */ + ["\u14F7", "\u14F7"], /* CANADIAN SYLLABICS WEST-CREE SWE */ + ["\u14F8", "\u14F8"], /* CANADIAN SYLLABICS SWI */ + ["\u14F9", "\u14F9"], /* CANADIAN SYLLABICS WEST-CREE SWI */ + ["\u14FA", "\u14FA"], /* CANADIAN SYLLABICS SWII */ + ["\u14FB", "\u14FB"], /* CANADIAN SYLLABICS WEST-CREE SWII */ + ["\u14FC", "\u14FC"], /* CANADIAN SYLLABICS SWO */ + ["\u14FD", "\u14FD"], /* CANADIAN SYLLABICS WEST-CREE SWO */ + ["\u14FE", "\u14FE"], /* CANADIAN SYLLABICS SWOO */ + ["\u14FF", "\u14FF"], /* CANADIAN SYLLABICS WEST-CREE SWOO */ + ["\u1500", "\u1500"], /* CANADIAN SYLLABICS SWA */ + ["\u1501", "\u1501"], /* CANADIAN SYLLABICS WEST-CREE SWA */ + ["\u1502", "\u1502"], /* CANADIAN SYLLABICS SWAA */ + ["\u1503", "\u1503"], /* CANADIAN SYLLABICS WEST-CREE SWAA */ + ["\u1504", "\u1504"], /* CANADIAN SYLLABICS NASKAPI SWAA */ + ["\u1505", "\u1505"], /* CANADIAN SYLLABICS S */ + ["\u1506", "\u1506"], /* CANADIAN SYLLABICS ATHAPASCAN S */ + ["\u1507", "\u1507"], /* CANADIAN SYLLABICS SW */ + ["\u1508", "\u1508"], /* CANADIAN SYLLABICS BLACKFOOT S */ + ["\u1509", "\u1509"], /* CANADIAN SYLLABICS MOOSE-CREE SK */ + ["\u150A", "\u150A"], /* CANADIAN SYLLABICS NASKAPI SKW */ + ["\u150B", "\u150B"], /* CANADIAN SYLLABICS NASKAPI S-W */ + ["\u150C", "\u150C"], /* CANADIAN SYLLABICS NASKAPI SPWA */ + ["\u150D", "\u150D"], /* CANADIAN SYLLABICS NASKAPI STWA */ + ["\u150E", "\u150E"], /* CANADIAN SYLLABICS NASKAPI SKWA */ + ["\u150F", "\u150F"], /* CANADIAN SYLLABICS NASKAPI SCWA */ + ["\u1510", "\u1510"], /* CANADIAN SYLLABICS SHE */ + ["\u1511", "\u1511"], /* CANADIAN SYLLABICS SHI */ + ["\u1512", "\u1512"], /* CANADIAN SYLLABICS SHII */ + ["\u1513", "\u1513"], /* CANADIAN SYLLABICS SHO */ + ["\u1514", "\u1514"], /* CANADIAN SYLLABICS SHOO */ + ["\u1515", "\u1515"], /* CANADIAN SYLLABICS SHA */ + ["\u1516", "\u1516"], /* CANADIAN SYLLABICS SHAA */ + ["\u1517", "\u1517"], /* CANADIAN SYLLABICS SHWE */ + ["\u1518", "\u1518"], /* CANADIAN SYLLABICS WEST-CREE SHWE */ + ["\u1519", "\u1519"], /* CANADIAN SYLLABICS SHWI */ + ["\u151A", "\u151A"], /* CANADIAN SYLLABICS WEST-CREE SHWI */ + ["\u151B", "\u151B"], /* CANADIAN SYLLABICS SHWII */ + ["\u151C", "\u151C"], /* CANADIAN SYLLABICS WEST-CREE SHWII */ + ["\u151D", "\u151D"], /* CANADIAN SYLLABICS SHWO */ + ["\u151E", "\u151E"], /* CANADIAN SYLLABICS WEST-CREE SHWO */ + ["\u151F", "\u151F"], /* CANADIAN SYLLABICS SHWOO */ + ["\u1520", "\u1520"], /* CANADIAN SYLLABICS WEST-CREE SHWOO */ + ["\u1521", "\u1521"], /* CANADIAN SYLLABICS SHWA */ + ["\u1522", "\u1522"], /* CANADIAN SYLLABICS WEST-CREE SHWA */ + ["\u1523", "\u1523"], /* CANADIAN SYLLABICS SHWAA */ + ["\u1524", "\u1524"], /* CANADIAN SYLLABICS WEST-CREE SHWAA */ + ["\u1525", "\u1525"], /* CANADIAN SYLLABICS SH */ + ["\u1526", "\u1526"], /* CANADIAN SYLLABICS YE */ + ["\u1527", "\u1527"], /* CANADIAN SYLLABICS YAAI */ + ["\u1528", "\u1528"], /* CANADIAN SYLLABICS YI */ + ["\u1529", "\u1529"], /* CANADIAN SYLLABICS YII */ + ["\u152A", "\u152A"], /* CANADIAN SYLLABICS YO */ + ["\u152B", "\u152B"], /* CANADIAN SYLLABICS YOO */ + ["\u152C", "\u152C"], /* CANADIAN SYLLABICS Y-CREE YOO */ + ["\u152D", "\u152D"], /* CANADIAN SYLLABICS YA */ + ["\u152E", "\u152E"], /* CANADIAN SYLLABICS YAA */ + ["\u152F", "\u152F"], /* CANADIAN SYLLABICS YWE */ + ["\u1530", "\u1530"], /* CANADIAN SYLLABICS WEST-CREE YWE */ + ["\u1531", "\u1531"], /* CANADIAN SYLLABICS YWI */ + ["\u1532", "\u1532"], /* CANADIAN SYLLABICS WEST-CREE YWI */ + ["\u1533", "\u1533"], /* CANADIAN SYLLABICS YWII */ + ["\u1534", "\u1534"], /* CANADIAN SYLLABICS WEST-CREE YWII */ + ["\u1535", "\u1535"], /* CANADIAN SYLLABICS YWO */ + ["\u1536", "\u1536"], /* CANADIAN SYLLABICS WEST-CREE YWO */ + ["\u1537", "\u1537"], /* CANADIAN SYLLABICS YWOO */ + ["\u1538", "\u1538"], /* CANADIAN SYLLABICS WEST-CREE YWOO */ + ["\u1539", "\u1539"], /* CANADIAN SYLLABICS YWA */ + ["\u153A", "\u153A"], /* CANADIAN SYLLABICS WEST-CREE YWA */ + ["\u153B", "\u153B"], /* CANADIAN SYLLABICS YWAA */ + ["\u153C", "\u153C"], /* CANADIAN SYLLABICS WEST-CREE YWAA */ + ["\u153D", "\u153D"], /* CANADIAN SYLLABICS NASKAPI YWAA */ + ["\u153E", "\u153E"], /* CANADIAN SYLLABICS Y */ + ["\u153F", "\u153F"], /* CANADIAN SYLLABICS BIBLE-CREE Y */ + ["\u1540", "\u1540"], /* CANADIAN SYLLABICS WEST-CREE Y */ + ["\u1541", "\u1541"], /* CANADIAN SYLLABICS SAYISI YI */ + ["\u1542", "\u1542"], /* CANADIAN SYLLABICS RE */ + ["\u1543", "\u1543"], /* CANADIAN SYLLABICS R-CREE RE */ + ["\u1544", "\u1544"], /* CANADIAN SYLLABICS WEST-CREE LE */ + ["\u1545", "\u1545"], /* CANADIAN SYLLABICS RAAI */ + ["\u1546", "\u1546"], /* CANADIAN SYLLABICS RI */ + ["\u1547", "\u1547"], /* CANADIAN SYLLABICS RII */ + ["\u1548", "\u1548"], /* CANADIAN SYLLABICS RO */ + ["\u1549", "\u1549"], /* CANADIAN SYLLABICS ROO */ + ["\u154A", "\u154A"], /* CANADIAN SYLLABICS WEST-CREE LO */ + ["\u154B", "\u154B"], /* CANADIAN SYLLABICS RA */ + ["\u154C", "\u154C"], /* CANADIAN SYLLABICS RAA */ + ["\u154D", "\u154D"], /* CANADIAN SYLLABICS WEST-CREE LA */ + ["\u154E", "\u154E"], /* CANADIAN SYLLABICS RWAA */ + ["\u154F", "\u154F"], /* CANADIAN SYLLABICS WEST-CREE RWAA */ + ["\u1550", "\u1550"], /* CANADIAN SYLLABICS R */ + ["\u1551", "\u1551"], /* CANADIAN SYLLABICS WEST-CREE R */ + ["\u1552", "\u1552"], /* CANADIAN SYLLABICS MEDIAL R */ + ["\u1553", "\u1553"], /* CANADIAN SYLLABICS FE */ + ["\u1554", "\u1554"], /* CANADIAN SYLLABICS FAAI */ + ["\u1555", "\u1555"], /* CANADIAN SYLLABICS FI */ + ["\u1556", "\u1556"], /* CANADIAN SYLLABICS FII */ + ["\u1557", "\u1557"], /* CANADIAN SYLLABICS FO */ + ["\u1558", "\u1558"], /* CANADIAN SYLLABICS FOO */ + ["\u1559", "\u1559"], /* CANADIAN SYLLABICS FA */ + ["\u155A", "\u155A"], /* CANADIAN SYLLABICS FAA */ + ["\u155B", "\u155B"], /* CANADIAN SYLLABICS FWAA */ + ["\u155C", "\u155C"], /* CANADIAN SYLLABICS WEST-CREE FWAA */ + ["\u155D", "\u155D"], /* CANADIAN SYLLABICS F */ + ["\u155E", "\u155E"], /* CANADIAN SYLLABICS THE */ + ["\u155F", "\u155F"], /* CANADIAN SYLLABICS N-CREE THE */ + ["\u1560", "\u1560"], /* CANADIAN SYLLABICS THI */ + ["\u1561", "\u1561"], /* CANADIAN SYLLABICS N-CREE THI */ + ["\u1562", "\u1562"], /* CANADIAN SYLLABICS THII */ + ["\u1563", "\u1563"], /* CANADIAN SYLLABICS N-CREE THII */ + ["\u1564", "\u1564"], /* CANADIAN SYLLABICS THO */ + ["\u1565", "\u1565"], /* CANADIAN SYLLABICS THOO */ + ["\u1566", "\u1566"], /* CANADIAN SYLLABICS THA */ + ["\u1567", "\u1567"], /* CANADIAN SYLLABICS THAA */ + ["\u1568", "\u1568"], /* CANADIAN SYLLABICS THWAA */ + ["\u1569", "\u1569"], /* CANADIAN SYLLABICS WEST-CREE THWAA */ + ["\u156A", "\u156A"], /* CANADIAN SYLLABICS TH */ + ["\u156B", "\u156B"], /* CANADIAN SYLLABICS TTHE */ + ["\u156C", "\u156C"], /* CANADIAN SYLLABICS TTHI */ + ["\u156D", "\u156D"], /* CANADIAN SYLLABICS TTHO */ + ["\u156E", "\u156E"], /* CANADIAN SYLLABICS TTHA */ + ["\u156F", "\u156F"], /* CANADIAN SYLLABICS TTH */ + ["\u1570", "\u1570"], /* CANADIAN SYLLABICS TYE */ + ["\u1571", "\u1571"], /* CANADIAN SYLLABICS TYI */ + ["\u1572", "\u1572"], /* CANADIAN SYLLABICS TYO */ + ["\u1573", "\u1573"], /* CANADIAN SYLLABICS TYA */ + ["\u1574", "\u1574"], /* CANADIAN SYLLABICS NUNAVIK HE */ + ["\u1575", "\u1575"], /* CANADIAN SYLLABICS NUNAVIK HI */ + ["\u1576", "\u1576"], /* CANADIAN SYLLABICS NUNAVIK HII */ + ["\u1577", "\u1577"], /* CANADIAN SYLLABICS NUNAVIK HO */ + ["\u1578", "\u1578"], /* CANADIAN SYLLABICS NUNAVIK HOO */ + ["\u1579", "\u1579"], /* CANADIAN SYLLABICS NUNAVIK HA */ + ["\u157A", "\u157A"], /* CANADIAN SYLLABICS NUNAVIK HAA */ + ["\u157B", "\u157B"], /* CANADIAN SYLLABICS NUNAVIK H */ + ["\u157C", "\u157C"], /* CANADIAN SYLLABICS NUNAVUT H */ + ["\u157D", "\u157D"], /* CANADIAN SYLLABICS HK */ + ["\u157E", "\u157E"], /* CANADIAN SYLLABICS QAAI */ + ["\u157F", "\u157F"], /* CANADIAN SYLLABICS QI */ + ["\u1580", "\u1580"], /* CANADIAN SYLLABICS QII */ + ["\u1581", "\u1581"], /* CANADIAN SYLLABICS QO */ + ["\u1582", "\u1582"], /* CANADIAN SYLLABICS QOO */ + ["\u1583", "\u1583"], /* CANADIAN SYLLABICS QA */ + ["\u1584", "\u1584"], /* CANADIAN SYLLABICS QAA */ + ["\u1585", "\u1585"], /* CANADIAN SYLLABICS Q */ + ["\u1586", "\u1586"], /* CANADIAN SYLLABICS TLHE */ + ["\u1587", "\u1587"], /* CANADIAN SYLLABICS TLHI */ + ["\u1588", "\u1588"], /* CANADIAN SYLLABICS TLHO */ + ["\u1589", "\u1589"], /* CANADIAN SYLLABICS TLHA */ + ["\u158A", "\u158A"], /* CANADIAN SYLLABICS WEST-CREE RE */ + ["\u158B", "\u158B"], /* CANADIAN SYLLABICS WEST-CREE RI */ + ["\u158C", "\u158C"], /* CANADIAN SYLLABICS WEST-CREE RO */ + ["\u158D", "\u158D"], /* CANADIAN SYLLABICS WEST-CREE RA */ + ["\u158E", "\u158E"], /* CANADIAN SYLLABICS NGAAI */ + ["\u158F", "\u158F"], /* CANADIAN SYLLABICS NGI */ + ["\u1590", "\u1590"], /* CANADIAN SYLLABICS NGII */ + ["\u1591", "\u1591"], /* CANADIAN SYLLABICS NGO */ + ["\u1592", "\u1592"], /* CANADIAN SYLLABICS NGOO */ + ["\u1593", "\u1593"], /* CANADIAN SYLLABICS NGA */ + ["\u1594", "\u1594"], /* CANADIAN SYLLABICS NGAA */ + ["\u1595", "\u1595"], /* CANADIAN SYLLABICS NG */ + ["\u1596", "\u1596"], /* CANADIAN SYLLABICS NNG */ + ["\u1597", "\u1597"], /* CANADIAN SYLLABICS SAYISI SHE */ + ["\u1598", "\u1598"], /* CANADIAN SYLLABICS SAYISI SHI */ + ["\u1599", "\u1599"], /* CANADIAN SYLLABICS SAYISI SHO */ + ["\u159A", "\u159A"], /* CANADIAN SYLLABICS SAYISI SHA */ + ["\u159B", "\u159B"], /* CANADIAN SYLLABICS WOODS-CREE THE */ + ["\u159C", "\u159C"], /* CANADIAN SYLLABICS WOODS-CREE THI */ + ["\u159D", "\u159D"], /* CANADIAN SYLLABICS WOODS-CREE THO */ + ["\u159E", "\u159E"], /* CANADIAN SYLLABICS WOODS-CREE THA */ + ["\u159F", "\u159F"], /* CANADIAN SYLLABICS WOODS-CREE TH */ + ["\u15A0", "\u15A0"], /* CANADIAN SYLLABICS LHI */ + ["\u15A1", "\u15A1"], /* CANADIAN SYLLABICS LHII */ + ["\u15A2", "\u15A2"], /* CANADIAN SYLLABICS LHO */ + ["\u15A3", "\u15A3"], /* CANADIAN SYLLABICS LHOO */ + ["\u15A4", "\u15A4"], /* CANADIAN SYLLABICS LHA */ + ["\u15A5", "\u15A5"], /* CANADIAN SYLLABICS LHAA */ + ["\u15A6", "\u15A6"], /* CANADIAN SYLLABICS LH */ + ["\u15A7", "\u15A7"], /* CANADIAN SYLLABICS TH-CREE THE */ + ["\u15A8", "\u15A8"], /* CANADIAN SYLLABICS TH-CREE THI */ + ["\u15A9", "\u15A9"], /* CANADIAN SYLLABICS TH-CREE THII */ + ["\u15AA", "\u15AA"], /* CANADIAN SYLLABICS TH-CREE THO */ + ["\u15AB", "\u15AB"], /* CANADIAN SYLLABICS TH-CREE THOO */ + ["\u15AC", "\u15AC"], /* CANADIAN SYLLABICS TH-CREE THA */ + ["\u15AD", "\u15AD"], /* CANADIAN SYLLABICS TH-CREE THAA */ + ["\u15AE", "\u15AE"], /* CANADIAN SYLLABICS TH-CREE TH */ + ["\u15AF", "\u15AF"], /* CANADIAN SYLLABICS AIVILIK B */ + ["\u15B0", "\u15B0"], /* CANADIAN SYLLABICS BLACKFOOT E */ + ["\u15B1", "\u15B1"], /* CANADIAN SYLLABICS BLACKFOOT I */ + ["\u15B2", "\u15B2"], /* CANADIAN SYLLABICS BLACKFOOT O */ + ["\u15B3", "\u15B3"], /* CANADIAN SYLLABICS BLACKFOOT A */ + ["\u15B4", "\u15B4"], /* CANADIAN SYLLABICS BLACKFOOT WE */ + ["\u15B5", "\u15B5"], /* CANADIAN SYLLABICS BLACKFOOT WI */ + ["\u15B6", "\u15B6"], /* CANADIAN SYLLABICS BLACKFOOT WO */ + ["\u15B7", "\u15B7"], /* CANADIAN SYLLABICS BLACKFOOT WA */ + ["\u15B8", "\u15B8"], /* CANADIAN SYLLABICS BLACKFOOT NE */ + ["\u15B9", "\u15B9"], /* CANADIAN SYLLABICS BLACKFOOT NI */ + ["\u15BA", "\u15BA"], /* CANADIAN SYLLABICS BLACKFOOT NO */ + ["\u15BB", "\u15BB"], /* CANADIAN SYLLABICS BLACKFOOT NA */ + ["\u15BC", "\u15BC"], /* CANADIAN SYLLABICS BLACKFOOT KE */ + ["\u15BD", "\u15BD"], /* CANADIAN SYLLABICS BLACKFOOT KI */ + ["\u15BE", "\u15BE"], /* CANADIAN SYLLABICS BLACKFOOT KO */ + ["\u15BF", "\u15BF"], /* CANADIAN SYLLABICS BLACKFOOT KA */ + ["\u15C0", "\u15C0"], /* CANADIAN SYLLABICS SAYISI HE */ + ["\u15C1", "\u15C1"], /* CANADIAN SYLLABICS SAYISI HI */ + ["\u15C2", "\u15C2"], /* CANADIAN SYLLABICS SAYISI HO */ + ["\u15C3", "\u15C3"], /* CANADIAN SYLLABICS SAYISI HA */ + ["\u15C4", "\u15C4"], /* CANADIAN SYLLABICS CARRIER GHU */ + ["\u15C5", "\u15C5"], /* CANADIAN SYLLABICS CARRIER GHO */ + ["\u15C6", "\u15C6"], /* CANADIAN SYLLABICS CARRIER GHE */ + ["\u15C7", "\u15C7"], /* CANADIAN SYLLABICS CARRIER GHEE */ + ["\u15C8", "\u15C8"], /* CANADIAN SYLLABICS CARRIER GHI */ + ["\u15C9", "\u15C9"], /* CANADIAN SYLLABICS CARRIER GHA */ + ["\u15CA", "\u15CA"], /* CANADIAN SYLLABICS CARRIER RU */ + ["\u15CB", "\u15CB"], /* CANADIAN SYLLABICS CARRIER RO */ + ["\u15CC", "\u15CC"], /* CANADIAN SYLLABICS CARRIER RE */ + ["\u15CD", "\u15CD"], /* CANADIAN SYLLABICS CARRIER REE */ + ["\u15CE", "\u15CE"], /* CANADIAN SYLLABICS CARRIER RI */ + ["\u15CF", "\u15CF"], /* CANADIAN SYLLABICS CARRIER RA */ + ["\u15D0", "\u15D0"], /* CANADIAN SYLLABICS CARRIER WU */ + ["\u15D1", "\u15D1"], /* CANADIAN SYLLABICS CARRIER WO */ + ["\u15D2", "\u15D2"], /* CANADIAN SYLLABICS CARRIER WE */ + ["\u15D3", "\u15D3"], /* CANADIAN SYLLABICS CARRIER WEE */ + ["\u15D4", "\u15D4"], /* CANADIAN SYLLABICS CARRIER WI */ + ["\u15D5", "\u15D5"], /* CANADIAN SYLLABICS CARRIER WA */ + ["\u15D6", "\u15D6"], /* CANADIAN SYLLABICS CARRIER HWU */ + ["\u15D7", "\u15D7"], /* CANADIAN SYLLABICS CARRIER HWO */ + ["\u15D8", "\u15D8"], /* CANADIAN SYLLABICS CARRIER HWE */ + ["\u15D9", "\u15D9"], /* CANADIAN SYLLABICS CARRIER HWEE */ + ["\u15DA", "\u15DA"], /* CANADIAN SYLLABICS CARRIER HWI */ + ["\u15DB", "\u15DB"], /* CANADIAN SYLLABICS CARRIER HWA */ + ["\u15DC", "\u15DC"], /* CANADIAN SYLLABICS CARRIER THU */ + ["\u15DD", "\u15DD"], /* CANADIAN SYLLABICS CARRIER THO */ + ["\u15DE", "\u15DE"], /* CANADIAN SYLLABICS CARRIER THE */ + ["\u15DF", "\u15DF"], /* CANADIAN SYLLABICS CARRIER THEE */ + ["\u15E0", "\u15E0"], /* CANADIAN SYLLABICS CARRIER THI */ + ["\u15E1", "\u15E1"], /* CANADIAN SYLLABICS CARRIER THA */ + ["\u15E2", "\u15E2"], /* CANADIAN SYLLABICS CARRIER TTU */ + ["\u15E3", "\u15E3"], /* CANADIAN SYLLABICS CARRIER TTO */ + ["\u15E4", "\u15E4"], /* CANADIAN SYLLABICS CARRIER TTE */ + ["\u15E5", "\u15E5"], /* CANADIAN SYLLABICS CARRIER TTEE */ + ["\u15E6", "\u15E6"], /* CANADIAN SYLLABICS CARRIER TTI */ + ["\u15E7", "\u15E7"], /* CANADIAN SYLLABICS CARRIER TTA */ + ["\u15E8", "\u15E8"], /* CANADIAN SYLLABICS CARRIER PU */ + ["\u15E9", "\u15E9"], /* CANADIAN SYLLABICS CARRIER PO */ + ["\u15EA", "\u15EA"], /* CANADIAN SYLLABICS CARRIER PE */ + ["\u15EB", "\u15EB"], /* CANADIAN SYLLABICS CARRIER PEE */ + ["\u15EC", "\u15EC"], /* CANADIAN SYLLABICS CARRIER PI */ + ["\u15ED", "\u15ED"], /* CANADIAN SYLLABICS CARRIER PA */ + ["\u15EE", "\u15EE"], /* CANADIAN SYLLABICS CARRIER P */ + ["\u15EF", "\u15EF"], /* CANADIAN SYLLABICS CARRIER GU */ + ["\u15F0", "\u15F0"], /* CANADIAN SYLLABICS CARRIER GO */ + ["\u15F1", "\u15F1"], /* CANADIAN SYLLABICS CARRIER GE */ + ["\u15F2", "\u15F2"], /* CANADIAN SYLLABICS CARRIER GEE */ + ["\u15F3", "\u15F3"], /* CANADIAN SYLLABICS CARRIER GI */ + ["\u15F4", "\u15F4"], /* CANADIAN SYLLABICS CARRIER GA */ + ["\u15F5", "\u15F5"], /* CANADIAN SYLLABICS CARRIER KHU */ + ["\u15F6", "\u15F6"], /* CANADIAN SYLLABICS CARRIER KHO */ + ["\u15F7", "\u15F7"], /* CANADIAN SYLLABICS CARRIER KHE */ + ["\u15F8", "\u15F8"], /* CANADIAN SYLLABICS CARRIER KHEE */ + ["\u15F9", "\u15F9"], /* CANADIAN SYLLABICS CARRIER KHI */ + ["\u15FA", "\u15FA"], /* CANADIAN SYLLABICS CARRIER KHA */ + ["\u15FB", "\u15FB"], /* CANADIAN SYLLABICS CARRIER KKU */ + ["\u15FC", "\u15FC"], /* CANADIAN SYLLABICS CARRIER KKO */ + ["\u15FD", "\u15FD"], /* CANADIAN SYLLABICS CARRIER KKE */ + ["\u15FE", "\u15FE"], /* CANADIAN SYLLABICS CARRIER KKEE */ + ["\u15FF", "\u15FF"], /* CANADIAN SYLLABICS CARRIER KKI */ + ["\u1600", "\u1600"], /* CANADIAN SYLLABICS CARRIER KKA */ + ["\u1601", "\u1601"], /* CANADIAN SYLLABICS CARRIER KK */ + ["\u1602", "\u1602"], /* CANADIAN SYLLABICS CARRIER NU */ + ["\u1603", "\u1603"], /* CANADIAN SYLLABICS CARRIER NO */ + ["\u1604", "\u1604"], /* CANADIAN SYLLABICS CARRIER NE */ + ["\u1605", "\u1605"], /* CANADIAN SYLLABICS CARRIER NEE */ + ["\u1606", "\u1606"], /* CANADIAN SYLLABICS CARRIER NI */ + ["\u1607", "\u1607"], /* CANADIAN SYLLABICS CARRIER NA */ + ["\u1608", "\u1608"], /* CANADIAN SYLLABICS CARRIER MU */ + ["\u1609", "\u1609"], /* CANADIAN SYLLABICS CARRIER MO */ + ["\u160A", "\u160A"], /* CANADIAN SYLLABICS CARRIER ME */ + ["\u160B", "\u160B"], /* CANADIAN SYLLABICS CARRIER MEE */ + ["\u160C", "\u160C"], /* CANADIAN SYLLABICS CARRIER MI */ + ["\u160D", "\u160D"], /* CANADIAN SYLLABICS CARRIER MA */ + ["\u160E", "\u160E"], /* CANADIAN SYLLABICS CARRIER YU */ + ["\u160F", "\u160F"], /* CANADIAN SYLLABICS CARRIER YO */ + ["\u1610", "\u1610"], /* CANADIAN SYLLABICS CARRIER YE */ + ["\u1611", "\u1611"], /* CANADIAN SYLLABICS CARRIER YEE */ + ["\u1612", "\u1612"], /* CANADIAN SYLLABICS CARRIER YI */ + ["\u1613", "\u1613"], /* CANADIAN SYLLABICS CARRIER YA */ + ["\u1614", "\u1614"], /* CANADIAN SYLLABICS CARRIER JU */ + ["\u1615", "\u1615"], /* CANADIAN SYLLABICS SAYISI JU */ + ["\u1616", "\u1616"], /* CANADIAN SYLLABICS CARRIER JO */ + ["\u1617", "\u1617"], /* CANADIAN SYLLABICS CARRIER JE */ + ["\u1618", "\u1618"], /* CANADIAN SYLLABICS CARRIER JEE */ + ["\u1619", "\u1619"], /* CANADIAN SYLLABICS CARRIER JI */ + ["\u161A", "\u161A"], /* CANADIAN SYLLABICS SAYISI JI */ + ["\u161B", "\u161B"], /* CANADIAN SYLLABICS CARRIER JA */ + ["\u161C", "\u161C"], /* CANADIAN SYLLABICS CARRIER JJU */ + ["\u161D", "\u161D"], /* CANADIAN SYLLABICS CARRIER JJO */ + ["\u161E", "\u161E"], /* CANADIAN SYLLABICS CARRIER JJE */ + ["\u161F", "\u161F"], /* CANADIAN SYLLABICS CARRIER JJEE */ + ["\u1620", "\u1620"], /* CANADIAN SYLLABICS CARRIER JJI */ + ["\u1621", "\u1621"], /* CANADIAN SYLLABICS CARRIER JJA */ + ["\u1622", "\u1622"], /* CANADIAN SYLLABICS CARRIER LU */ + ["\u1623", "\u1623"], /* CANADIAN SYLLABICS CARRIER LO */ + ["\u1624", "\u1624"], /* CANADIAN SYLLABICS CARRIER LE */ + ["\u1625", "\u1625"], /* CANADIAN SYLLABICS CARRIER LEE */ + ["\u1626", "\u1626"], /* CANADIAN SYLLABICS CARRIER LI */ + ["\u1627", "\u1627"], /* CANADIAN SYLLABICS CARRIER LA */ + ["\u1628", "\u1628"], /* CANADIAN SYLLABICS CARRIER DLU */ + ["\u1629", "\u1629"], /* CANADIAN SYLLABICS CARRIER DLO */ + ["\u162A", "\u162A"], /* CANADIAN SYLLABICS CARRIER DLE */ + ["\u162B", "\u162B"], /* CANADIAN SYLLABICS CARRIER DLEE */ + ["\u162C", "\u162C"], /* CANADIAN SYLLABICS CARRIER DLI */ + ["\u162D", "\u162D"], /* CANADIAN SYLLABICS CARRIER DLA */ + ["\u162E", "\u162E"], /* CANADIAN SYLLABICS CARRIER LHU */ + ["\u162F", "\u162F"], /* CANADIAN SYLLABICS CARRIER LHO */ + ["\u1630", "\u1630"], /* CANADIAN SYLLABICS CARRIER LHE */ + ["\u1631", "\u1631"], /* CANADIAN SYLLABICS CARRIER LHEE */ + ["\u1632", "\u1632"], /* CANADIAN SYLLABICS CARRIER LHI */ + ["\u1633", "\u1633"], /* CANADIAN SYLLABICS CARRIER LHA */ + ["\u1634", "\u1634"], /* CANADIAN SYLLABICS CARRIER TLHU */ + ["\u1635", "\u1635"], /* CANADIAN SYLLABICS CARRIER TLHO */ + ["\u1636", "\u1636"], /* CANADIAN SYLLABICS CARRIER TLHE */ + ["\u1637", "\u1637"], /* CANADIAN SYLLABICS CARRIER TLHEE */ + ["\u1638", "\u1638"], /* CANADIAN SYLLABICS CARRIER TLHI */ + ["\u1639", "\u1639"], /* CANADIAN SYLLABICS CARRIER TLHA */ + ["\u163A", "\u163A"], /* CANADIAN SYLLABICS CARRIER TLU */ + ["\u163B", "\u163B"], /* CANADIAN SYLLABICS CARRIER TLO */ + ["\u163C", "\u163C"], /* CANADIAN SYLLABICS CARRIER TLE */ + ["\u163D", "\u163D"], /* CANADIAN SYLLABICS CARRIER TLEE */ + ["\u163E", "\u163E"], /* CANADIAN SYLLABICS CARRIER TLI */ + ["\u163F", "\u163F"], /* CANADIAN SYLLABICS CARRIER TLA */ + ["\u1640", "\u1640"], /* CANADIAN SYLLABICS CARRIER ZU */ + ["\u1641", "\u1641"], /* CANADIAN SYLLABICS CARRIER ZO */ + ["\u1642", "\u1642"], /* CANADIAN SYLLABICS CARRIER ZE */ + ["\u1643", "\u1643"], /* CANADIAN SYLLABICS CARRIER ZEE */ + ["\u1644", "\u1644"], /* CANADIAN SYLLABICS CARRIER ZI */ + ["\u1645", "\u1645"], /* CANADIAN SYLLABICS CARRIER ZA */ + ["\u1646", "\u1646"], /* CANADIAN SYLLABICS CARRIER Z */ + ["\u1647", "\u1647"], /* CANADIAN SYLLABICS CARRIER INITIAL Z */ + ["\u1648", "\u1648"], /* CANADIAN SYLLABICS CARRIER DZU */ + ["\u1649", "\u1649"], /* CANADIAN SYLLABICS CARRIER DZO */ + ["\u164A", "\u164A"], /* CANADIAN SYLLABICS CARRIER DZE */ + ["\u164B", "\u164B"], /* CANADIAN SYLLABICS CARRIER DZEE */ + ["\u164C", "\u164C"], /* CANADIAN SYLLABICS CARRIER DZI */ + ["\u164D", "\u164D"], /* CANADIAN SYLLABICS CARRIER DZA */ + ["\u164E", "\u164E"], /* CANADIAN SYLLABICS CARRIER SU */ + ["\u164F", "\u164F"], /* CANADIAN SYLLABICS CARRIER SO */ + ["\u1650", "\u1650"], /* CANADIAN SYLLABICS CARRIER SE */ + ["\u1651", "\u1651"], /* CANADIAN SYLLABICS CARRIER SEE */ + ["\u1652", "\u1652"], /* CANADIAN SYLLABICS CARRIER SI */ + ["\u1653", "\u1653"], /* CANADIAN SYLLABICS CARRIER SA */ + ["\u1654", "\u1654"], /* CANADIAN SYLLABICS CARRIER SHU */ + ["\u1655", "\u1655"], /* CANADIAN SYLLABICS CARRIER SHO */ + ["\u1656", "\u1656"], /* CANADIAN SYLLABICS CARRIER SHE */ + ["\u1657", "\u1657"], /* CANADIAN SYLLABICS CARRIER SHEE */ + ["\u1658", "\u1658"], /* CANADIAN SYLLABICS CARRIER SHI */ + ["\u1659", "\u1659"], /* CANADIAN SYLLABICS CARRIER SHA */ + ["\u165A", "\u165A"], /* CANADIAN SYLLABICS CARRIER SH */ + ["\u165B", "\u165B"], /* CANADIAN SYLLABICS CARRIER TSU */ + ["\u165C", "\u165C"], /* CANADIAN SYLLABICS CARRIER TSO */ + ["\u165D", "\u165D"], /* CANADIAN SYLLABICS CARRIER TSE */ + ["\u165E", "\u165E"], /* CANADIAN SYLLABICS CARRIER TSEE */ + ["\u165F", "\u165F"], /* CANADIAN SYLLABICS CARRIER TSI */ + ["\u1660", "\u1660"], /* CANADIAN SYLLABICS CARRIER TSA */ + ["\u1661", "\u1661"], /* CANADIAN SYLLABICS CARRIER CHU */ + ["\u1662", "\u1662"], /* CANADIAN SYLLABICS CARRIER CHO */ + ["\u1663", "\u1663"], /* CANADIAN SYLLABICS CARRIER CHE */ + ["\u1664", "\u1664"], /* CANADIAN SYLLABICS CARRIER CHEE */ + ["\u1665", "\u1665"], /* CANADIAN SYLLABICS CARRIER CHI */ + ["\u1666", "\u1666"], /* CANADIAN SYLLABICS CARRIER CHA */ + ["\u1667", "\u1667"], /* CANADIAN SYLLABICS CARRIER TTSU */ + ["\u1668", "\u1668"], /* CANADIAN SYLLABICS CARRIER TTSO */ + ["\u1669", "\u1669"], /* CANADIAN SYLLABICS CARRIER TTSE */ + ["\u166A", "\u166A"], /* CANADIAN SYLLABICS CARRIER TTSEE */ + ["\u166B", "\u166B"], /* CANADIAN SYLLABICS CARRIER TTSI */ + ["\u166C", "\u166C"], /* CANADIAN SYLLABICS CARRIER TTSA */ + ["\u166D", "\u166D"], /* CANADIAN SYLLABICS CHI SIGN */ + ["\u166E", "\u166E"], /* CANADIAN SYLLABICS FULL STOP */ + ["\u166F", "\u166F"], /* CANADIAN SYLLABICS QAI */ + ["\u1670", "\u1670"], /* CANADIAN SYLLABICS NGAI */ + ["\u1671", "\u1671"], /* CANADIAN SYLLABICS NNGI */ + ["\u1672", "\u1672"], /* CANADIAN SYLLABICS NNGII */ + ["\u1673", "\u1673"], /* CANADIAN SYLLABICS NNGO */ + ["\u1674", "\u1674"], /* CANADIAN SYLLABICS NNGOO */ + ["\u1675", "\u1675"], /* CANADIAN SYLLABICS NNGA */ + ["\u1676", "\u1676"], /* CANADIAN SYLLABICS NNGAA */ + ["\u1677", "\u1677"], /* CANADIAN SYLLABICS WOODS-CREE THWEE */ + ["\u1678", "\u1678"], /* CANADIAN SYLLABICS WOODS-CREE THWI */ + ["\u1679", "\u1679"], /* CANADIAN SYLLABICS WOODS-CREE THWII */ + ["\u167A", "\u167A"], /* CANADIAN SYLLABICS WOODS-CREE THWO */ + ["\u167B", "\u167B"], /* CANADIAN SYLLABICS WOODS-CREE THWOO */ + ["\u167C", "\u167C"], /* CANADIAN SYLLABICS WOODS-CREE THWA */ + ["\u167D", "\u167D"], /* CANADIAN SYLLABICS WOODS-CREE THWAA */ + ["\u167E", "\u167E"], /* CANADIAN SYLLABICS WOODS-CREE FINAL TH */ + ["\u167F", "\u167F"], /* CANADIAN SYLLABICS BLACKFOOT W */ + ["\u1680", "\u1680"], /* OGHAM SPACE MARK */ + ["\u1681", "\u1681"], /* OGHAM LETTER BEITH */ + ["\u1682", "\u1682"], /* OGHAM LETTER LUIS */ + ["\u1683", "\u1683"], /* OGHAM LETTER FEARN */ + ["\u1684", "\u1684"], /* OGHAM LETTER SAIL */ + ["\u1685", "\u1685"], /* OGHAM LETTER NION */ + ["\u1686", "\u1686"], /* OGHAM LETTER UATH */ + ["\u1687", "\u1687"], /* OGHAM LETTER DAIR */ + ["\u1688", "\u1688"], /* OGHAM LETTER TINNE */ + ["\u1689", "\u1689"], /* OGHAM LETTER COLL */ + ["\u168A", "\u168A"], /* OGHAM LETTER CEIRT */ + ["\u168B", "\u168B"], /* OGHAM LETTER MUIN */ + ["\u168C", "\u168C"], /* OGHAM LETTER GORT */ + ["\u168D", "\u168D"], /* OGHAM LETTER NGEADAL */ + ["\u168E", "\u168E"], /* OGHAM LETTER STRAIF */ + ["\u168F", "\u168F"], /* OGHAM LETTER RUIS */ + ["\u1690", "\u1690"], /* OGHAM LETTER AILM */ + ["\u1691", "\u1691"], /* OGHAM LETTER ONN */ + ["\u1692", "\u1692"], /* OGHAM LETTER UR */ + ["\u1693", "\u1693"], /* OGHAM LETTER EADHADH */ + ["\u1694", "\u1694"], /* OGHAM LETTER IODHADH */ + ["\u1695", "\u1695"], /* OGHAM LETTER EABHADH */ + ["\u1696", "\u1696"], /* OGHAM LETTER OR */ + ["\u1697", "\u1697"], /* OGHAM LETTER UILLEANN */ + ["\u1698", "\u1698"], /* OGHAM LETTER IFIN */ + ["\u1699", "\u1699"], /* OGHAM LETTER EAMHANCHOLL */ + ["\u169A", "\u169A"], /* OGHAM LETTER PEITH */ + ["\u169B", "\u169B"], /* OGHAM FEATHER MARK */ + ["\u169C", "\u169C"], /* OGHAM REVERSED FEATHER MARK */ + ["\u169D", "\u169D"], + ["\u169E", "\u169E"], + ["\u169F", "\u169F"], + ["\u16A0", "\u16A0"], /* RUNIC LETTER FEHU FEOH FE F */ + ["\u16A1", "\u16A1"], /* RUNIC LETTER V */ + ["\u16A2", "\u16A2"], /* RUNIC LETTER URUZ UR U */ + ["\u16A3", "\u16A3"], /* RUNIC LETTER YR */ + ["\u16A4", "\u16A4"], /* RUNIC LETTER Y */ + ["\u16A5", "\u16A5"], /* RUNIC LETTER W */ + ["\u16A6", "\u16A6"], /* RUNIC LETTER THURISAZ THURS THORN */ + ["\u16A7", "\u16A7"], /* RUNIC LETTER ETH */ + ["\u16A8", "\u16A8"], /* RUNIC LETTER ANSUZ A */ + ["\u16A9", "\u16A9"], /* RUNIC LETTER OS O */ + ["\u16AA", "\u16AA"], /* RUNIC LETTER AC A */ + ["\u16AB", "\u16AB"], /* RUNIC LETTER AESC */ + ["\u16AC", "\u16AC"], /* RUNIC LETTER LONG-BRANCH-OSS O */ + ["\u16AD", "\u16AD"], /* RUNIC LETTER SHORT-TWIG-OSS O */ + ["\u16AE", "\u16AE"], /* RUNIC LETTER O */ + ["\u16AF", "\u16AF"], /* RUNIC LETTER OE */ + ["\u16B0", "\u16B0"], /* RUNIC LETTER ON */ + ["\u16B1", "\u16B1"], /* RUNIC LETTER RAIDO RAD REID R */ + ["\u16B2", "\u16B2"], /* RUNIC LETTER KAUNA */ + ["\u16B3", "\u16B3"], /* RUNIC LETTER CEN */ + ["\u16B4", "\u16B4"], /* RUNIC LETTER KAUN K */ + ["\u16B5", "\u16B5"], /* RUNIC LETTER G */ + ["\u16B6", "\u16B6"], /* RUNIC LETTER ENG */ + ["\u16B7", "\u16B7"], /* RUNIC LETTER GEBO GYFU G */ + ["\u16B8", "\u16B8"], /* RUNIC LETTER GAR */ + ["\u16B9", "\u16B9"], /* RUNIC LETTER WUNJO WYNN W */ + ["\u16BA", "\u16BA"], /* RUNIC LETTER HAGLAZ H */ + ["\u16BB", "\u16BB"], /* RUNIC LETTER HAEGL H */ + ["\u16BC", "\u16BC"], /* RUNIC LETTER LONG-BRANCH-HAGALL H */ + ["\u16BD", "\u16BD"], /* RUNIC LETTER SHORT-TWIG-HAGALL H */ + ["\u16BE", "\u16BE"], /* RUNIC LETTER NAUDIZ NYD NAUD N */ + ["\u16BF", "\u16BF"], /* RUNIC LETTER SHORT-TWIG-NAUD N */ + ["\u16C0", "\u16C0"], /* RUNIC LETTER DOTTED-N */ + ["\u16C1", "\u16C1"], /* RUNIC LETTER ISAZ IS ISS I */ + ["\u16C2", "\u16C2"], /* RUNIC LETTER E */ + ["\u16C3", "\u16C3"], /* RUNIC LETTER JERAN J */ + ["\u16C4", "\u16C4"], /* RUNIC LETTER GER */ + ["\u16C5", "\u16C5"], /* RUNIC LETTER LONG-BRANCH-AR AE */ + ["\u16C6", "\u16C6"], /* RUNIC LETTER SHORT-TWIG-AR A */ + ["\u16C7", "\u16C7"], /* RUNIC LETTER IWAZ EOH */ + ["\u16C8", "\u16C8"], /* RUNIC LETTER PERTHO PEORTH P */ + ["\u16C9", "\u16C9"], /* RUNIC LETTER ALGIZ EOLHX */ + ["\u16CA", "\u16CA"], /* RUNIC LETTER SOWILO S */ + ["\u16CB", "\u16CB"], /* RUNIC LETTER SIGEL LONG-BRANCH-SOL S */ + ["\u16CC", "\u16CC"], /* RUNIC LETTER SHORT-TWIG-SOL S */ + ["\u16CD", "\u16CD"], /* RUNIC LETTER C */ + ["\u16CE", "\u16CE"], /* RUNIC LETTER Z */ + ["\u16CF", "\u16CF"], /* RUNIC LETTER TIWAZ TIR TYR T */ + ["\u16D0", "\u16D0"], /* RUNIC LETTER SHORT-TWIG-TYR T */ + ["\u16D1", "\u16D1"], /* RUNIC LETTER D */ + ["\u16D2", "\u16D2"], /* RUNIC LETTER BERKANAN BEORC BJARKAN B */ + ["\u16D3", "\u16D3"], /* RUNIC LETTER SHORT-TWIG-BJARKAN B */ + ["\u16D4", "\u16D4"], /* RUNIC LETTER DOTTED-P */ + ["\u16D5", "\u16D5"], /* RUNIC LETTER OPEN-P */ + ["\u16D6", "\u16D6"], /* RUNIC LETTER EHWAZ EH E */ + ["\u16D7", "\u16D7"], /* RUNIC LETTER MANNAZ MAN M */ + ["\u16D8", "\u16D8"], /* RUNIC LETTER LONG-BRANCH-MADR M */ + ["\u16D9", "\u16D9"], /* RUNIC LETTER SHORT-TWIG-MADR M */ + ["\u16DA", "\u16DA"], /* RUNIC LETTER LAUKAZ LAGU LOGR L */ + ["\u16DB", "\u16DB"], /* RUNIC LETTER DOTTED-L */ + ["\u16DC", "\u16DC"], /* RUNIC LETTER INGWAZ */ + ["\u16DD", "\u16DD"], /* RUNIC LETTER ING */ + ["\u16DE", "\u16DE"], /* RUNIC LETTER DAGAZ DAEG D */ + ["\u16DF", "\u16DF"], /* RUNIC LETTER OTHALAN ETHEL O */ + ["\u16E0", "\u16E0"], /* RUNIC LETTER EAR */ + ["\u16E1", "\u16E1"], /* RUNIC LETTER IOR */ + ["\u16E2", "\u16E2"], /* RUNIC LETTER CWEORTH */ + ["\u16E3", "\u16E3"], /* RUNIC LETTER CALC */ + ["\u16E4", "\u16E4"], /* RUNIC LETTER CEALC */ + ["\u16E5", "\u16E5"], /* RUNIC LETTER STAN */ + ["\u16E6", "\u16E6"], /* RUNIC LETTER LONG-BRANCH-YR */ + ["\u16E7", "\u16E7"], /* RUNIC LETTER SHORT-TWIG-YR */ + ["\u16E8", "\u16E8"], /* RUNIC LETTER ICELANDIC-YR */ + ["\u16E9", "\u16E9"], /* RUNIC LETTER Q */ + ["\u16EA", "\u16EA"], /* RUNIC LETTER X */ + ["\u16EB", "\u16EB"], /* RUNIC SINGLE PUNCTUATION */ + ["\u16EC", "\u16EC"], /* RUNIC MULTIPLE PUNCTUATION */ + ["\u16ED", "\u16ED"], /* RUNIC CROSS PUNCTUATION */ + ["\u16EE", "\u16EE"], /* RUNIC ARLAUG SYMBOL */ + ["\u16EF", "\u16EF"], /* RUNIC TVIMADUR SYMBOL */ + ["\u16F0", "\u16F0"], /* RUNIC BELGTHOR SYMBOL */ + ["\u16F1", "\u16F1"], /* RUNIC LETTER K */ + ["\u16F2", "\u16F2"], /* RUNIC LETTER SH */ + ["\u16F3", "\u16F3"], /* RUNIC LETTER OO */ + ["\u16F4", "\u16F4"], /* RUNIC LETTER FRANKS CASKET OS */ + ["\u16F5", "\u16F5"], /* RUNIC LETTER FRANKS CASKET IS */ + ["\u16F6", "\u16F6"], /* RUNIC LETTER FRANKS CASKET EH */ + ["\u16F7", "\u16F7"], /* RUNIC LETTER FRANKS CASKET AC */ + ["\u16F8", "\u16F8"], /* RUNIC LETTER FRANKS CASKET AESC */ + ["\u16F9", "\u16F9"], + ["\u16FA", "\u16FA"], + ["\u16FB", "\u16FB"], + ["\u16FC", "\u16FC"], + ["\u16FD", "\u16FD"], + ["\u16FE", "\u16FE"], + ["\u16FF", "\u16FF"], + ["\u1700", "\u1700"], /* TAGALOG LETTER A */ + ["\u1701", "\u1701"], /* TAGALOG LETTER I */ + ["\u1702", "\u1702"], /* TAGALOG LETTER U */ + ["\u1703", "\u1703"], /* TAGALOG LETTER KA */ + ["\u1704", "\u1704"], /* TAGALOG LETTER GA */ + ["\u1705", "\u1705"], /* TAGALOG LETTER NGA */ + ["\u1706", "\u1706"], /* TAGALOG LETTER TA */ + ["\u1707", "\u1707"], /* TAGALOG LETTER DA */ + ["\u1708", "\u1708"], /* TAGALOG LETTER NA */ + ["\u1709", "\u1709"], /* TAGALOG LETTER PA */ + ["\u170A", "\u170A"], /* TAGALOG LETTER BA */ + ["\u170B", "\u170B"], /* TAGALOG LETTER MA */ + ["\u170C", "\u170C"], /* TAGALOG LETTER YA */ + ["\u170D", "\u170D"], /* TAGALOG LETTER RA */ + ["\u170E", "\u170E"], /* TAGALOG LETTER LA */ + ["\u170F", "\u170F"], /* TAGALOG LETTER WA */ + ["\u1710", "\u1710"], /* TAGALOG LETTER SA */ + ["\u1711", "\u1711"], /* TAGALOG LETTER HA */ + ["\u1712", "\u1712"], /* TAGALOG VOWEL SIGN I */ + ["\u1713", "\u1713"], /* TAGALOG VOWEL SIGN U */ + ["\u1714", "\u1714"], /* TAGALOG SIGN VIRAMA */ + ["\u1715", "\u1715"], /* TAGALOG SIGN PAMUDPOD */ + ["\u1716", "\u1716"], + ["\u1717", "\u1717"], + ["\u1718", "\u1718"], + ["\u1719", "\u1719"], + ["\u171A", "\u171A"], + ["\u171B", "\u171B"], + ["\u171C", "\u171C"], + ["\u171D", "\u171D"], + ["\u171E", "\u171E"], + ["\u171F", "\u171F"], /* TAGALOG LETTER ARCHAIC RA */ + ["\u1720", "\u1720"], /* HANUNOO LETTER A */ + ["\u1721", "\u1721"], /* HANUNOO LETTER I */ + ["\u1722", "\u1722"], /* HANUNOO LETTER U */ + ["\u1723", "\u1723"], /* HANUNOO LETTER KA */ + ["\u1724", "\u1724"], /* HANUNOO LETTER GA */ + ["\u1725", "\u1725"], /* HANUNOO LETTER NGA */ + ["\u1726", "\u1726"], /* HANUNOO LETTER TA */ + ["\u1727", "\u1727"], /* HANUNOO LETTER DA */ + ["\u1728", "\u1728"], /* HANUNOO LETTER NA */ + ["\u1729", "\u1729"], /* HANUNOO LETTER PA */ + ["\u172A", "\u172A"], /* HANUNOO LETTER BA */ + ["\u172B", "\u172B"], /* HANUNOO LETTER MA */ + ["\u172C", "\u172C"], /* HANUNOO LETTER YA */ + ["\u172D", "\u172D"], /* HANUNOO LETTER RA */ + ["\u172E", "\u172E"], /* HANUNOO LETTER LA */ + ["\u172F", "\u172F"], /* HANUNOO LETTER WA */ + ["\u1730", "\u1730"], /* HANUNOO LETTER SA */ + ["\u1731", "\u1731"], /* HANUNOO LETTER HA */ + ["\u1732", "\u1732"], /* HANUNOO VOWEL SIGN I */ + ["\u1733", "\u1733"], /* HANUNOO VOWEL SIGN U */ + ["\u1734", "\u1734"], /* HANUNOO SIGN PAMUDPOD */ + ["\u1735", "\u1735"], /* PHILIPPINE SINGLE PUNCTUATION */ + ["\u1736", "\u1736"], /* PHILIPPINE DOUBLE PUNCTUATION */ + ["\u1737", "\u1737"], + ["\u1738", "\u1738"], + ["\u1739", "\u1739"], + ["\u173A", "\u173A"], + ["\u173B", "\u173B"], + ["\u173C", "\u173C"], + ["\u173D", "\u173D"], + ["\u173E", "\u173E"], + ["\u173F", "\u173F"], + ["\u1740", "\u1740"], /* BUHID LETTER A */ + ["\u1741", "\u1741"], /* BUHID LETTER I */ + ["\u1742", "\u1742"], /* BUHID LETTER U */ + ["\u1743", "\u1743"], /* BUHID LETTER KA */ + ["\u1744", "\u1744"], /* BUHID LETTER GA */ + ["\u1745", "\u1745"], /* BUHID LETTER NGA */ + ["\u1746", "\u1746"], /* BUHID LETTER TA */ + ["\u1747", "\u1747"], /* BUHID LETTER DA */ + ["\u1748", "\u1748"], /* BUHID LETTER NA */ + ["\u1749", "\u1749"], /* BUHID LETTER PA */ + ["\u174A", "\u174A"], /* BUHID LETTER BA */ + ["\u174B", "\u174B"], /* BUHID LETTER MA */ + ["\u174C", "\u174C"], /* BUHID LETTER YA */ + ["\u174D", "\u174D"], /* BUHID LETTER RA */ + ["\u174E", "\u174E"], /* BUHID LETTER LA */ + ["\u174F", "\u174F"], /* BUHID LETTER WA */ + ["\u1750", "\u1750"], /* BUHID LETTER SA */ + ["\u1751", "\u1751"], /* BUHID LETTER HA */ + ["\u1752", "\u1752"], /* BUHID VOWEL SIGN I */ + ["\u1753", "\u1753"], /* BUHID VOWEL SIGN U */ + ["\u1754", "\u1754"], + ["\u1755", "\u1755"], + ["\u1756", "\u1756"], + ["\u1757", "\u1757"], + ["\u1758", "\u1758"], + ["\u1759", "\u1759"], + ["\u175A", "\u175A"], + ["\u175B", "\u175B"], + ["\u175C", "\u175C"], + ["\u175D", "\u175D"], + ["\u175E", "\u175E"], + ["\u175F", "\u175F"], + ["\u1760", "\u1760"], /* TAGBANWA LETTER A */ + ["\u1761", "\u1761"], /* TAGBANWA LETTER I */ + ["\u1762", "\u1762"], /* TAGBANWA LETTER U */ + ["\u1763", "\u1763"], /* TAGBANWA LETTER KA */ + ["\u1764", "\u1764"], /* TAGBANWA LETTER GA */ + ["\u1765", "\u1765"], /* TAGBANWA LETTER NGA */ + ["\u1766", "\u1766"], /* TAGBANWA LETTER TA */ + ["\u1767", "\u1767"], /* TAGBANWA LETTER DA */ + ["\u1768", "\u1768"], /* TAGBANWA LETTER NA */ + ["\u1769", "\u1769"], /* TAGBANWA LETTER PA */ + ["\u176A", "\u176A"], /* TAGBANWA LETTER BA */ + ["\u176B", "\u176B"], /* TAGBANWA LETTER MA */ + ["\u176C", "\u176C"], /* TAGBANWA LETTER YA */ + ["\u176D", "\u176D"], + ["\u176E", "\u176E"], /* TAGBANWA LETTER LA */ + ["\u176F", "\u176F"], /* TAGBANWA LETTER WA */ + ["\u1770", "\u1770"], /* TAGBANWA LETTER SA */ + ["\u1771", "\u1771"], + ["\u1772", "\u1772"], /* TAGBANWA VOWEL SIGN I */ + ["\u1773", "\u1773"], /* TAGBANWA VOWEL SIGN U */ + ["\u1774", "\u1774"], + ["\u1775", "\u1775"], + ["\u1776", "\u1776"], + ["\u1777", "\u1777"], + ["\u1778", "\u1778"], + ["\u1779", "\u1779"], + ["\u177A", "\u177A"], + ["\u177B", "\u177B"], + ["\u177C", "\u177C"], + ["\u177D", "\u177D"], + ["\u177E", "\u177E"], + ["\u177F", "\u177F"], + ["\u1780", "\u1780"], /* KHMER LETTER KA */ + ["\u1781", "\u1781"], /* KHMER LETTER KHA */ + ["\u1782", "\u1782"], /* KHMER LETTER KO */ + ["\u1783", "\u1783"], /* KHMER LETTER KHO */ + ["\u1784", "\u1784"], /* KHMER LETTER NGO */ + ["\u1785", "\u1785"], /* KHMER LETTER CA */ + ["\u1786", "\u1786"], /* KHMER LETTER CHA */ + ["\u1787", "\u1787"], /* KHMER LETTER CO */ + ["\u1788", "\u1788"], /* KHMER LETTER CHO */ + ["\u1789", "\u1789"], /* KHMER LETTER NYO */ + ["\u178A", "\u178A"], /* KHMER LETTER DA */ + ["\u178B", "\u178B"], /* KHMER LETTER TTHA */ + ["\u178C", "\u178C"], /* KHMER LETTER DO */ + ["\u178D", "\u178D"], /* KHMER LETTER TTHO */ + ["\u178E", "\u178E"], /* KHMER LETTER NNO */ + ["\u178F", "\u178F"], /* KHMER LETTER TA */ + ["\u1790", "\u1790"], /* KHMER LETTER THA */ + ["\u1791", "\u1791"], /* KHMER LETTER TO */ + ["\u1792", "\u1792"], /* KHMER LETTER THO */ + ["\u1793", "\u1793"], /* KHMER LETTER NO */ + ["\u1794", "\u1794"], /* KHMER LETTER BA */ + ["\u1795", "\u1795"], /* KHMER LETTER PHA */ + ["\u1796", "\u1796"], /* KHMER LETTER PO */ + ["\u1797", "\u1797"], /* KHMER LETTER PHO */ + ["\u1798", "\u1798"], /* KHMER LETTER MO */ + ["\u1799", "\u1799"], /* KHMER LETTER YO */ + ["\u179A", "\u179A"], /* KHMER LETTER RO */ + ["\u179B", "\u179B"], /* KHMER LETTER LO */ + ["\u179C", "\u179C"], /* KHMER LETTER VO */ + ["\u179D", "\u179D"], /* KHMER LETTER SHA */ + ["\u179E", "\u179E"], /* KHMER LETTER SSO */ + ["\u179F", "\u179F"], /* KHMER LETTER SA */ + ["\u17A0", "\u17A0"], /* KHMER LETTER HA */ + ["\u17A1", "\u17A1"], /* KHMER LETTER LA */ + ["\u17A2", "\u17A2"], /* KHMER LETTER QA */ + ["\u17A3", "\u17A3"], /* KHMER INDEPENDENT VOWEL QAQ */ + ["\u17A4", "\u17A4"], /* KHMER INDEPENDENT VOWEL QAA */ + ["\u17A5", "\u17A5"], /* KHMER INDEPENDENT VOWEL QI */ + ["\u17A6", "\u17A6"], /* KHMER INDEPENDENT VOWEL QII */ + ["\u17A7", "\u17A7"], /* KHMER INDEPENDENT VOWEL QU */ + ["\u17A8", "\u17A8"], /* KHMER INDEPENDENT VOWEL QUK */ + ["\u17A9", "\u17A9"], /* KHMER INDEPENDENT VOWEL QUU */ + ["\u17AA", "\u17AA"], /* KHMER INDEPENDENT VOWEL QUUV */ + ["\u17AB", "\u17AB"], /* KHMER INDEPENDENT VOWEL RY */ + ["\u17AC", "\u17AC"], /* KHMER INDEPENDENT VOWEL RYY */ + ["\u17AD", "\u17AD"], /* KHMER INDEPENDENT VOWEL LY */ + ["\u17AE", "\u17AE"], /* KHMER INDEPENDENT VOWEL LYY */ + ["\u17AF", "\u17AF"], /* KHMER INDEPENDENT VOWEL QE */ + ["\u17B0", "\u17B0"], /* KHMER INDEPENDENT VOWEL QAI */ + ["\u17B1", "\u17B1"], /* KHMER INDEPENDENT VOWEL QOO TYPE ONE */ + ["\u17B2", "\u17B2"], /* KHMER INDEPENDENT VOWEL QOO TYPE TWO */ + ["\u17B3", "\u17B3"], /* KHMER INDEPENDENT VOWEL QAU */ + ["\u17B4", "\u17B4"], /* KHMER VOWEL INHERENT AQ */ + ["\u17B5", "\u17B5"], /* KHMER VOWEL INHERENT AA */ + ["\u17B6", "\u17B6"], /* KHMER VOWEL SIGN AA */ + ["\u17B7", "\u17B7"], /* KHMER VOWEL SIGN I */ + ["\u17B8", "\u17B8"], /* KHMER VOWEL SIGN II */ + ["\u17B9", "\u17B9"], /* KHMER VOWEL SIGN Y */ + ["\u17BA", "\u17BA"], /* KHMER VOWEL SIGN YY */ + ["\u17BB", "\u17BB"], /* KHMER VOWEL SIGN U */ + ["\u17BC", "\u17BC"], /* KHMER VOWEL SIGN UU */ + ["\u17BD", "\u17BD"], /* KHMER VOWEL SIGN UA */ + ["\u17BE", "\u17BE"], /* KHMER VOWEL SIGN OE */ + ["\u17BF", "\u17BF"], /* KHMER VOWEL SIGN YA */ + ["\u17C0", "\u17C0"], /* KHMER VOWEL SIGN IE */ + ["\u17C1", "\u17C1"], /* KHMER VOWEL SIGN E */ + ["\u17C2", "\u17C2"], /* KHMER VOWEL SIGN AE */ + ["\u17C3", "\u17C3"], /* KHMER VOWEL SIGN AI */ + ["\u17C4", "\u17C4"], /* KHMER VOWEL SIGN OO */ + ["\u17C5", "\u17C5"], /* KHMER VOWEL SIGN AU */ + ["\u17C6", "\u17C6"], /* KHMER SIGN NIKAHIT */ + ["\u17C7", "\u17C7"], /* KHMER SIGN REAHMUK */ + ["\u17C8", "\u17C8"], /* KHMER SIGN YUUKALEAPINTU */ + ["\u17C9", "\u17C9"], /* KHMER SIGN MUUSIKATOAN */ + ["\u17CA", "\u17CA"], /* KHMER SIGN TRIISAP */ + ["\u17CB", "\u17CB"], /* KHMER SIGN BANTOC */ + ["\u17CC", "\u17CC"], /* KHMER SIGN ROBAT */ + ["\u17CD", "\u17CD"], /* KHMER SIGN TOANDAKHIAT */ + ["\u17CE", "\u17CE"], /* KHMER SIGN KAKABAT */ + ["\u17CF", "\u17CF"], /* KHMER SIGN AHSDA */ + ["\u17D0", "\u17D0"], /* KHMER SIGN SAMYOK SANNYA */ + ["\u17D1", "\u17D1"], /* KHMER SIGN VIRIAM */ + ["\u17D2", "\u17D2"], /* KHMER SIGN COENG */ + ["\u17D3", "\u17D3"], /* KHMER SIGN BATHAMASAT */ + ["\u17D4", "\u17D4"], /* KHMER SIGN KHAN */ + ["\u17D5", "\u17D5"], /* KHMER SIGN BARIYOOSAN */ + ["\u17D6", "\u17D6"], /* KHMER SIGN CAMNUC PII KUUH */ + ["\u17D7", "\u17D7"], /* KHMER SIGN LEK TOO */ + ["\u17D8", "\u17D8"], /* KHMER SIGN BEYYAL */ + ["\u17D9", "\u17D9"], /* KHMER SIGN PHNAEK MUAN */ + ["\u17DA", "\u17DA"], /* KHMER SIGN KOOMUUT */ + ["\u17DB", "\u17DB"], /* KHMER CURRENCY SYMBOL RIEL */ + ["\u17DC", "\u17DC"], /* KHMER SIGN AVAKRAHASANYA */ + ["\u17DD", "\u17DD"], /* KHMER SIGN ATTHACAN */ + ["\u17DE", "\u17DE"], + ["\u17DF", "\u17DF"], + ["\u17E0", "\u17E0"], /* KHMER DIGIT ZERO */ + ["\u17E1", "\u17E1"], /* KHMER DIGIT ONE */ + ["\u17E2", "\u17E2"], /* KHMER DIGIT TWO */ + ["\u17E3", "\u17E3"], /* KHMER DIGIT THREE */ + ["\u17E4", "\u17E4"], /* KHMER DIGIT FOUR */ + ["\u17E5", "\u17E5"], /* KHMER DIGIT FIVE */ + ["\u17E6", "\u17E6"], /* KHMER DIGIT SIX */ + ["\u17E7", "\u17E7"], /* KHMER DIGIT SEVEN */ + ["\u17E8", "\u17E8"], /* KHMER DIGIT EIGHT */ + ["\u17E9", "\u17E9"], /* KHMER DIGIT NINE */ + ["\u17EA", "\u17EA"], + ["\u17EB", "\u17EB"], + ["\u17EC", "\u17EC"], + ["\u17ED", "\u17ED"], + ["\u17EE", "\u17EE"], + ["\u17EF", "\u17EF"], + ["\u17F0", "\u17F0"], /* KHMER SYMBOL LEK ATTAK SON */ + ["\u17F1", "\u17F1"], /* KHMER SYMBOL LEK ATTAK MUOY */ + ["\u17F2", "\u17F2"], /* KHMER SYMBOL LEK ATTAK PII */ + ["\u17F3", "\u17F3"], /* KHMER SYMBOL LEK ATTAK BEI */ + ["\u17F4", "\u17F4"], /* KHMER SYMBOL LEK ATTAK BUON */ + ["\u17F5", "\u17F5"], /* KHMER SYMBOL LEK ATTAK PRAM */ + ["\u17F6", "\u17F6"], /* KHMER SYMBOL LEK ATTAK PRAM-MUOY */ + ["\u17F7", "\u17F7"], /* KHMER SYMBOL LEK ATTAK PRAM-PII */ + ["\u17F8", "\u17F8"], /* KHMER SYMBOL LEK ATTAK PRAM-BEI */ + ["\u17F9", "\u17F9"], /* KHMER SYMBOL LEK ATTAK PRAM-BUON */ + ["\u17FA", "\u17FA"], + ["\u17FB", "\u17FB"], + ["\u17FC", "\u17FC"], + ["\u17FD", "\u17FD"], + ["\u17FE", "\u17FE"], + ["\u17FF", "\u17FF"], + ["\u1800", "\u1800"], /* MONGOLIAN BIRGA */ + ["\u1801", "\u1801"], /* MONGOLIAN ELLIPSIS */ + ["\u1802", "\u1802"], /* MONGOLIAN COMMA */ + ["\u1803", "\u1803"], /* MONGOLIAN FULL STOP */ + ["\u1804", "\u1804"], /* MONGOLIAN COLON */ + ["\u1805", "\u1805"], /* MONGOLIAN FOUR DOTS */ + ["\u1806", "\u1806"], /* MONGOLIAN TODO SOFT HYPHEN */ + ["\u1807", "\u1807"], /* MONGOLIAN SIBE SYLLABLE BOUNDARY MARKER */ + ["\u1808", "\u1808"], /* MONGOLIAN MANCHU COMMA */ + ["\u1809", "\u1809"], /* MONGOLIAN MANCHU FULL STOP */ + ["\u180A", "\u180A"], /* MONGOLIAN NIRUGU */ + ["\u180B", "\u180B"], /* MONGOLIAN FREE VARIATION SELECTOR ONE */ + ["\u180C", "\u180C"], /* MONGOLIAN FREE VARIATION SELECTOR TWO */ + ["\u180D", "\u180D"], /* MONGOLIAN FREE VARIATION SELECTOR THREE */ + ["\u180E", "\u180E"], /* MONGOLIAN VOWEL SEPARATOR */ + ["\u180F", "\u180F"], /* MONGOLIAN FREE VARIATION SELECTOR FOUR */ + ["\u1810", "\u1810"], /* MONGOLIAN DIGIT ZERO */ + ["\u1811", "\u1811"], /* MONGOLIAN DIGIT ONE */ + ["\u1812", "\u1812"], /* MONGOLIAN DIGIT TWO */ + ["\u1813", "\u1813"], /* MONGOLIAN DIGIT THREE */ + ["\u1814", "\u1814"], /* MONGOLIAN DIGIT FOUR */ + ["\u1815", "\u1815"], /* MONGOLIAN DIGIT FIVE */ + ["\u1816", "\u1816"], /* MONGOLIAN DIGIT SIX */ + ["\u1817", "\u1817"], /* MONGOLIAN DIGIT SEVEN */ + ["\u1818", "\u1818"], /* MONGOLIAN DIGIT EIGHT */ + ["\u1819", "\u1819"], /* MONGOLIAN DIGIT NINE */ + ["\u181A", "\u181A"], + ["\u181B", "\u181B"], + ["\u181C", "\u181C"], + ["\u181D", "\u181D"], + ["\u181E", "\u181E"], + ["\u181F", "\u181F"], + ["\u1820", "\u1820"], /* MONGOLIAN LETTER A */ + ["\u1821", "\u1821"], /* MONGOLIAN LETTER E */ + ["\u1822", "\u1822"], /* MONGOLIAN LETTER I */ + ["\u1823", "\u1823"], /* MONGOLIAN LETTER O */ + ["\u1824", "\u1824"], /* MONGOLIAN LETTER U */ + ["\u1825", "\u1825"], /* MONGOLIAN LETTER OE */ + ["\u1826", "\u1826"], /* MONGOLIAN LETTER UE */ + ["\u1827", "\u1827"], /* MONGOLIAN LETTER EE */ + ["\u1828", "\u1828"], /* MONGOLIAN LETTER NA */ + ["\u1829", "\u1829"], /* MONGOLIAN LETTER ANG */ + ["\u182A", "\u182A"], /* MONGOLIAN LETTER BA */ + ["\u182B", "\u182B"], /* MONGOLIAN LETTER PA */ + ["\u182C", "\u182C"], /* MONGOLIAN LETTER QA */ + ["\u182D", "\u182D"], /* MONGOLIAN LETTER GA */ + ["\u182E", "\u182E"], /* MONGOLIAN LETTER MA */ + ["\u182F", "\u182F"], /* MONGOLIAN LETTER LA */ + ["\u1830", "\u1830"], /* MONGOLIAN LETTER SA */ + ["\u1831", "\u1831"], /* MONGOLIAN LETTER SHA */ + ["\u1832", "\u1832"], /* MONGOLIAN LETTER TA */ + ["\u1833", "\u1833"], /* MONGOLIAN LETTER DA */ + ["\u1834", "\u1834"], /* MONGOLIAN LETTER CHA */ + ["\u1835", "\u1835"], /* MONGOLIAN LETTER JA */ + ["\u1836", "\u1836"], /* MONGOLIAN LETTER YA */ + ["\u1837", "\u1837"], /* MONGOLIAN LETTER RA */ + ["\u1838", "\u1838"], /* MONGOLIAN LETTER WA */ + ["\u1839", "\u1839"], /* MONGOLIAN LETTER FA */ + ["\u183A", "\u183A"], /* MONGOLIAN LETTER KA */ + ["\u183B", "\u183B"], /* MONGOLIAN LETTER KHA */ + ["\u183C", "\u183C"], /* MONGOLIAN LETTER TSA */ + ["\u183D", "\u183D"], /* MONGOLIAN LETTER ZA */ + ["\u183E", "\u183E"], /* MONGOLIAN LETTER HAA */ + ["\u183F", "\u183F"], /* MONGOLIAN LETTER ZRA */ + ["\u1840", "\u1840"], /* MONGOLIAN LETTER LHA */ + ["\u1841", "\u1841"], /* MONGOLIAN LETTER ZHI */ + ["\u1842", "\u1842"], /* MONGOLIAN LETTER CHI */ + ["\u1843", "\u1843"], /* MONGOLIAN LETTER TODO LONG VOWEL SIGN */ + ["\u1844", "\u1844"], /* MONGOLIAN LETTER TODO E */ + ["\u1845", "\u1845"], /* MONGOLIAN LETTER TODO I */ + ["\u1846", "\u1846"], /* MONGOLIAN LETTER TODO O */ + ["\u1847", "\u1847"], /* MONGOLIAN LETTER TODO U */ + ["\u1848", "\u1848"], /* MONGOLIAN LETTER TODO OE */ + ["\u1849", "\u1849"], /* MONGOLIAN LETTER TODO UE */ + ["\u184A", "\u184A"], /* MONGOLIAN LETTER TODO ANG */ + ["\u184B", "\u184B"], /* MONGOLIAN LETTER TODO BA */ + ["\u184C", "\u184C"], /* MONGOLIAN LETTER TODO PA */ + ["\u184D", "\u184D"], /* MONGOLIAN LETTER TODO QA */ + ["\u184E", "\u184E"], /* MONGOLIAN LETTER TODO GA */ + ["\u184F", "\u184F"], /* MONGOLIAN LETTER TODO MA */ + ["\u1850", "\u1850"], /* MONGOLIAN LETTER TODO TA */ + ["\u1851", "\u1851"], /* MONGOLIAN LETTER TODO DA */ + ["\u1852", "\u1852"], /* MONGOLIAN LETTER TODO CHA */ + ["\u1853", "\u1853"], /* MONGOLIAN LETTER TODO JA */ + ["\u1854", "\u1854"], /* MONGOLIAN LETTER TODO TSA */ + ["\u1855", "\u1855"], /* MONGOLIAN LETTER TODO YA */ + ["\u1856", "\u1856"], /* MONGOLIAN LETTER TODO WA */ + ["\u1857", "\u1857"], /* MONGOLIAN LETTER TODO KA */ + ["\u1858", "\u1858"], /* MONGOLIAN LETTER TODO GAA */ + ["\u1859", "\u1859"], /* MONGOLIAN LETTER TODO HAA */ + ["\u185A", "\u185A"], /* MONGOLIAN LETTER TODO JIA */ + ["\u185B", "\u185B"], /* MONGOLIAN LETTER TODO NIA */ + ["\u185C", "\u185C"], /* MONGOLIAN LETTER TODO DZA */ + ["\u185D", "\u185D"], /* MONGOLIAN LETTER SIBE E */ + ["\u185E", "\u185E"], /* MONGOLIAN LETTER SIBE I */ + ["\u185F", "\u185F"], /* MONGOLIAN LETTER SIBE IY */ + ["\u1860", "\u1860"], /* MONGOLIAN LETTER SIBE UE */ + ["\u1861", "\u1861"], /* MONGOLIAN LETTER SIBE U */ + ["\u1862", "\u1862"], /* MONGOLIAN LETTER SIBE ANG */ + ["\u1863", "\u1863"], /* MONGOLIAN LETTER SIBE KA */ + ["\u1864", "\u1864"], /* MONGOLIAN LETTER SIBE GA */ + ["\u1865", "\u1865"], /* MONGOLIAN LETTER SIBE HA */ + ["\u1866", "\u1866"], /* MONGOLIAN LETTER SIBE PA */ + ["\u1867", "\u1867"], /* MONGOLIAN LETTER SIBE SHA */ + ["\u1868", "\u1868"], /* MONGOLIAN LETTER SIBE TA */ + ["\u1869", "\u1869"], /* MONGOLIAN LETTER SIBE DA */ + ["\u186A", "\u186A"], /* MONGOLIAN LETTER SIBE JA */ + ["\u186B", "\u186B"], /* MONGOLIAN LETTER SIBE FA */ + ["\u186C", "\u186C"], /* MONGOLIAN LETTER SIBE GAA */ + ["\u186D", "\u186D"], /* MONGOLIAN LETTER SIBE HAA */ + ["\u186E", "\u186E"], /* MONGOLIAN LETTER SIBE TSA */ + ["\u186F", "\u186F"], /* MONGOLIAN LETTER SIBE ZA */ + ["\u1870", "\u1870"], /* MONGOLIAN LETTER SIBE RAA */ + ["\u1871", "\u1871"], /* MONGOLIAN LETTER SIBE CHA */ + ["\u1872", "\u1872"], /* MONGOLIAN LETTER SIBE ZHA */ + ["\u1873", "\u1873"], /* MONGOLIAN LETTER MANCHU I */ + ["\u1874", "\u1874"], /* MONGOLIAN LETTER MANCHU KA */ + ["\u1875", "\u1875"], /* MONGOLIAN LETTER MANCHU RA */ + ["\u1876", "\u1876"], /* MONGOLIAN LETTER MANCHU FA */ + ["\u1877", "\u1877"], /* MONGOLIAN LETTER MANCHU ZHA */ + ["\u1878", "\u1878"], /* MONGOLIAN LETTER CHA WITH TWO DOTS */ + ["\u1879", "\u1879"], + ["\u187A", "\u187A"], + ["\u187B", "\u187B"], + ["\u187C", "\u187C"], + ["\u187D", "\u187D"], + ["\u187E", "\u187E"], + ["\u187F", "\u187F"], + ["\u1880", "\u1880"], /* MONGOLIAN LETTER ALI GALI ANUSVARA ONE */ + ["\u1881", "\u1881"], /* MONGOLIAN LETTER ALI GALI VISARGA ONE */ + ["\u1882", "\u1882"], /* MONGOLIAN LETTER ALI GALI DAMARU */ + ["\u1883", "\u1883"], /* MONGOLIAN LETTER ALI GALI UBADAMA */ + ["\u1884", "\u1884"], /* MONGOLIAN LETTER ALI GALI INVERTED UBADAMA */ + ["\u1885", "\u1885"], /* MONGOLIAN LETTER ALI GALI BALUDA */ + ["\u1886", "\u1886"], /* MONGOLIAN LETTER ALI GALI THREE BALUDA */ + ["\u1887", "\u1887"], /* MONGOLIAN LETTER ALI GALI A */ + ["\u1888", "\u1888"], /* MONGOLIAN LETTER ALI GALI I */ + ["\u1889", "\u1889"], /* MONGOLIAN LETTER ALI GALI KA */ + ["\u188A", "\u188A"], /* MONGOLIAN LETTER ALI GALI NGA */ + ["\u188B", "\u188B"], /* MONGOLIAN LETTER ALI GALI CA */ + ["\u188C", "\u188C"], /* MONGOLIAN LETTER ALI GALI TTA */ + ["\u188D", "\u188D"], /* MONGOLIAN LETTER ALI GALI TTHA */ + ["\u188E", "\u188E"], /* MONGOLIAN LETTER ALI GALI DDA */ + ["\u188F", "\u188F"], /* MONGOLIAN LETTER ALI GALI NNA */ + ["\u1890", "\u1890"], /* MONGOLIAN LETTER ALI GALI TA */ + ["\u1891", "\u1891"], /* MONGOLIAN LETTER ALI GALI DA */ + ["\u1892", "\u1892"], /* MONGOLIAN LETTER ALI GALI PA */ + ["\u1893", "\u1893"], /* MONGOLIAN LETTER ALI GALI PHA */ + ["\u1894", "\u1894"], /* MONGOLIAN LETTER ALI GALI SSA */ + ["\u1895", "\u1895"], /* MONGOLIAN LETTER ALI GALI ZHA */ + ["\u1896", "\u1896"], /* MONGOLIAN LETTER ALI GALI ZA */ + ["\u1897", "\u1897"], /* MONGOLIAN LETTER ALI GALI AH */ + ["\u1898", "\u1898"], /* MONGOLIAN LETTER TODO ALI GALI TA */ + ["\u1899", "\u1899"], /* MONGOLIAN LETTER TODO ALI GALI ZHA */ + ["\u189A", "\u189A"], /* MONGOLIAN LETTER MANCHU ALI GALI GHA */ + ["\u189B", "\u189B"], /* MONGOLIAN LETTER MANCHU ALI GALI NGA */ + ["\u189C", "\u189C"], /* MONGOLIAN LETTER MANCHU ALI GALI CA */ + ["\u189D", "\u189D"], /* MONGOLIAN LETTER MANCHU ALI GALI JHA */ + ["\u189E", "\u189E"], /* MONGOLIAN LETTER MANCHU ALI GALI TTA */ + ["\u189F", "\u189F"], /* MONGOLIAN LETTER MANCHU ALI GALI DDHA */ + ["\u18A0", "\u18A0"], /* MONGOLIAN LETTER MANCHU ALI GALI TA */ + ["\u18A1", "\u18A1"], /* MONGOLIAN LETTER MANCHU ALI GALI DHA */ + ["\u18A2", "\u18A2"], /* MONGOLIAN LETTER MANCHU ALI GALI SSA */ + ["\u18A3", "\u18A3"], /* MONGOLIAN LETTER MANCHU ALI GALI CYA */ + ["\u18A4", "\u18A4"], /* MONGOLIAN LETTER MANCHU ALI GALI ZHA */ + ["\u18A5", "\u18A5"], /* MONGOLIAN LETTER MANCHU ALI GALI ZA */ + ["\u18A6", "\u18A6"], /* MONGOLIAN LETTER ALI GALI HALF U */ + ["\u18A7", "\u18A7"], /* MONGOLIAN LETTER ALI GALI HALF YA */ + ["\u18A8", "\u18A8"], /* MONGOLIAN LETTER MANCHU ALI GALI BHA */ + ["\u18A9", "\u18A9"], /* MONGOLIAN LETTER ALI GALI DAGALGA */ + ["\u18AA", "\u18AA"], /* MONGOLIAN LETTER MANCHU ALI GALI LHA */ + ["\u18AB", "\u18AB"], + ["\u18AC", "\u18AC"], + ["\u18AD", "\u18AD"], + ["\u18AE", "\u18AE"], + ["\u18AF", "\u18AF"], + ["\u18B0", "\u18B0"], /* CANADIAN SYLLABICS OY */ + ["\u18B1", "\u18B1"], /* CANADIAN SYLLABICS AY */ + ["\u18B2", "\u18B2"], /* CANADIAN SYLLABICS AAY */ + ["\u18B3", "\u18B3"], /* CANADIAN SYLLABICS WAY */ + ["\u18B4", "\u18B4"], /* CANADIAN SYLLABICS POY */ + ["\u18B5", "\u18B5"], /* CANADIAN SYLLABICS PAY */ + ["\u18B6", "\u18B6"], /* CANADIAN SYLLABICS PWOY */ + ["\u18B7", "\u18B7"], /* CANADIAN SYLLABICS TAY */ + ["\u18B8", "\u18B8"], /* CANADIAN SYLLABICS KAY */ + ["\u18B9", "\u18B9"], /* CANADIAN SYLLABICS KWAY */ + ["\u18BA", "\u18BA"], /* CANADIAN SYLLABICS MAY */ + ["\u18BB", "\u18BB"], /* CANADIAN SYLLABICS NOY */ + ["\u18BC", "\u18BC"], /* CANADIAN SYLLABICS NAY */ + ["\u18BD", "\u18BD"], /* CANADIAN SYLLABICS LAY */ + ["\u18BE", "\u18BE"], /* CANADIAN SYLLABICS SOY */ + ["\u18BF", "\u18BF"], /* CANADIAN SYLLABICS SAY */ + ["\u18C0", "\u18C0"], /* CANADIAN SYLLABICS SHOY */ + ["\u18C1", "\u18C1"], /* CANADIAN SYLLABICS SHAY */ + ["\u18C2", "\u18C2"], /* CANADIAN SYLLABICS SHWOY */ + ["\u18C3", "\u18C3"], /* CANADIAN SYLLABICS YOY */ + ["\u18C4", "\u18C4"], /* CANADIAN SYLLABICS YAY */ + ["\u18C5", "\u18C5"], /* CANADIAN SYLLABICS RAY */ + ["\u18C6", "\u18C6"], /* CANADIAN SYLLABICS NWI */ + ["\u18C7", "\u18C7"], /* CANADIAN SYLLABICS OJIBWAY NWI */ + ["\u18C8", "\u18C8"], /* CANADIAN SYLLABICS NWII */ + ["\u18C9", "\u18C9"], /* CANADIAN SYLLABICS OJIBWAY NWII */ + ["\u18CA", "\u18CA"], /* CANADIAN SYLLABICS NWO */ + ["\u18CB", "\u18CB"], /* CANADIAN SYLLABICS OJIBWAY NWO */ + ["\u18CC", "\u18CC"], /* CANADIAN SYLLABICS NWOO */ + ["\u18CD", "\u18CD"], /* CANADIAN SYLLABICS OJIBWAY NWOO */ + ["\u18CE", "\u18CE"], /* CANADIAN SYLLABICS RWEE */ + ["\u18CF", "\u18CF"], /* CANADIAN SYLLABICS RWI */ + ["\u18D0", "\u18D0"], /* CANADIAN SYLLABICS RWII */ + ["\u18D1", "\u18D1"], /* CANADIAN SYLLABICS RWO */ + ["\u18D2", "\u18D2"], /* CANADIAN SYLLABICS RWOO */ + ["\u18D3", "\u18D3"], /* CANADIAN SYLLABICS RWA */ + ["\u18D4", "\u18D4"], /* CANADIAN SYLLABICS OJIBWAY P */ + ["\u18D5", "\u18D5"], /* CANADIAN SYLLABICS OJIBWAY T */ + ["\u18D6", "\u18D6"], /* CANADIAN SYLLABICS OJIBWAY K */ + ["\u18D7", "\u18D7"], /* CANADIAN SYLLABICS OJIBWAY C */ + ["\u18D8", "\u18D8"], /* CANADIAN SYLLABICS OJIBWAY M */ + ["\u18D9", "\u18D9"], /* CANADIAN SYLLABICS OJIBWAY N */ + ["\u18DA", "\u18DA"], /* CANADIAN SYLLABICS OJIBWAY S */ + ["\u18DB", "\u18DB"], /* CANADIAN SYLLABICS OJIBWAY SH */ + ["\u18DC", "\u18DC"], /* CANADIAN SYLLABICS EASTERN W */ + ["\u18DD", "\u18DD"], /* CANADIAN SYLLABICS WESTERN W */ + ["\u18DE", "\u18DE"], /* CANADIAN SYLLABICS FINAL SMALL RING */ + ["\u18DF", "\u18DF"], /* CANADIAN SYLLABICS FINAL RAISED DOT */ + ["\u18E0", "\u18E0"], /* CANADIAN SYLLABICS R-CREE RWE */ + ["\u18E1", "\u18E1"], /* CANADIAN SYLLABICS WEST-CREE LOO */ + ["\u18E2", "\u18E2"], /* CANADIAN SYLLABICS WEST-CREE LAA */ + ["\u18E3", "\u18E3"], /* CANADIAN SYLLABICS THWE */ + ["\u18E4", "\u18E4"], /* CANADIAN SYLLABICS THWA */ + ["\u18E5", "\u18E5"], /* CANADIAN SYLLABICS TTHWE */ + ["\u18E6", "\u18E6"], /* CANADIAN SYLLABICS TTHOO */ + ["\u18E7", "\u18E7"], /* CANADIAN SYLLABICS TTHAA */ + ["\u18E8", "\u18E8"], /* CANADIAN SYLLABICS TLHWE */ + ["\u18E9", "\u18E9"], /* CANADIAN SYLLABICS TLHOO */ + ["\u18EA", "\u18EA"], /* CANADIAN SYLLABICS SAYISI SHWE */ + ["\u18EB", "\u18EB"], /* CANADIAN SYLLABICS SAYISI SHOO */ + ["\u18EC", "\u18EC"], /* CANADIAN SYLLABICS SAYISI HOO */ + ["\u18ED", "\u18ED"], /* CANADIAN SYLLABICS CARRIER GWU */ + ["\u18EE", "\u18EE"], /* CANADIAN SYLLABICS CARRIER DENE GEE */ + ["\u18EF", "\u18EF"], /* CANADIAN SYLLABICS CARRIER GAA */ + ["\u18F0", "\u18F0"], /* CANADIAN SYLLABICS CARRIER GWA */ + ["\u18F1", "\u18F1"], /* CANADIAN SYLLABICS SAYISI JUU */ + ["\u18F2", "\u18F2"], /* CANADIAN SYLLABICS CARRIER JWA */ + ["\u18F3", "\u18F3"], /* CANADIAN SYLLABICS BEAVER DENE L */ + ["\u18F4", "\u18F4"], /* CANADIAN SYLLABICS BEAVER DENE R */ + ["\u18F5", "\u18F5"], /* CANADIAN SYLLABICS CARRIER DENTAL S */ + ["\u18F6", "\u18F6"], + ["\u18F7", "\u18F7"], + ["\u18F8", "\u18F8"], + ["\u18F9", "\u18F9"], + ["\u18FA", "\u18FA"], + ["\u18FB", "\u18FB"], + ["\u18FC", "\u18FC"], + ["\u18FD", "\u18FD"], + ["\u18FE", "\u18FE"], + ["\u18FF", "\u18FF"], + ["\u1900", "\u1900"], /* LIMBU VOWEL-CARRIER LETTER */ + ["\u1901", "\u1901"], /* LIMBU LETTER KA */ + ["\u1902", "\u1902"], /* LIMBU LETTER KHA */ + ["\u1903", "\u1903"], /* LIMBU LETTER GA */ + ["\u1904", "\u1904"], /* LIMBU LETTER GHA */ + ["\u1905", "\u1905"], /* LIMBU LETTER NGA */ + ["\u1906", "\u1906"], /* LIMBU LETTER CA */ + ["\u1907", "\u1907"], /* LIMBU LETTER CHA */ + ["\u1908", "\u1908"], /* LIMBU LETTER JA */ + ["\u1909", "\u1909"], /* LIMBU LETTER JHA */ + ["\u190A", "\u190A"], /* LIMBU LETTER YAN */ + ["\u190B", "\u190B"], /* LIMBU LETTER TA */ + ["\u190C", "\u190C"], /* LIMBU LETTER THA */ + ["\u190D", "\u190D"], /* LIMBU LETTER DA */ + ["\u190E", "\u190E"], /* LIMBU LETTER DHA */ + ["\u190F", "\u190F"], /* LIMBU LETTER NA */ + ["\u1910", "\u1910"], /* LIMBU LETTER PA */ + ["\u1911", "\u1911"], /* LIMBU LETTER PHA */ + ["\u1912", "\u1912"], /* LIMBU LETTER BA */ + ["\u1913", "\u1913"], /* LIMBU LETTER BHA */ + ["\u1914", "\u1914"], /* LIMBU LETTER MA */ + ["\u1915", "\u1915"], /* LIMBU LETTER YA */ + ["\u1916", "\u1916"], /* LIMBU LETTER RA */ + ["\u1917", "\u1917"], /* LIMBU LETTER LA */ + ["\u1918", "\u1918"], /* LIMBU LETTER WA */ + ["\u1919", "\u1919"], /* LIMBU LETTER SHA */ + ["\u191A", "\u191A"], /* LIMBU LETTER SSA */ + ["\u191B", "\u191B"], /* LIMBU LETTER SA */ + ["\u191C", "\u191C"], /* LIMBU LETTER HA */ + ["\u191D", "\u191D"], /* LIMBU LETTER GYAN */ + ["\u191E", "\u191E"], /* LIMBU LETTER TRA */ + ["\u191F", "\u191F"], + ["\u1920", "\u1920"], /* LIMBU VOWEL SIGN A */ + ["\u1921", "\u1921"], /* LIMBU VOWEL SIGN I */ + ["\u1922", "\u1922"], /* LIMBU VOWEL SIGN U */ + ["\u1923", "\u1923"], /* LIMBU VOWEL SIGN EE */ + ["\u1924", "\u1924"], /* LIMBU VOWEL SIGN AI */ + ["\u1925", "\u1925"], /* LIMBU VOWEL SIGN OO */ + ["\u1926", "\u1926"], /* LIMBU VOWEL SIGN AU */ + ["\u1927", "\u1927"], /* LIMBU VOWEL SIGN E */ + ["\u1928", "\u1928"], /* LIMBU VOWEL SIGN O */ + ["\u1929", "\u1929"], /* LIMBU SUBJOINED LETTER YA */ + ["\u192A", "\u192A"], /* LIMBU SUBJOINED LETTER RA */ + ["\u192B", "\u192B"], /* LIMBU SUBJOINED LETTER WA */ + ["\u192C", "\u192C"], + ["\u192D", "\u192D"], + ["\u192E", "\u192E"], + ["\u192F", "\u192F"], + ["\u1930", "\u1930"], /* LIMBU SMALL LETTER KA */ + ["\u1931", "\u1931"], /* LIMBU SMALL LETTER NGA */ + ["\u1932", "\u1932"], /* LIMBU SMALL LETTER ANUSVARA */ + ["\u1933", "\u1933"], /* LIMBU SMALL LETTER TA */ + ["\u1934", "\u1934"], /* LIMBU SMALL LETTER NA */ + ["\u1935", "\u1935"], /* LIMBU SMALL LETTER PA */ + ["\u1936", "\u1936"], /* LIMBU SMALL LETTER MA */ + ["\u1937", "\u1937"], /* LIMBU SMALL LETTER RA */ + ["\u1938", "\u1938"], /* LIMBU SMALL LETTER LA */ + ["\u1939", "\u1939"], /* LIMBU SIGN MUKPHRENG */ + ["\u193A", "\u193A"], /* LIMBU SIGN KEMPHRENG */ + ["\u193B", "\u193B"], /* LIMBU SIGN SA-I */ + ["\u193C", "\u193C"], + ["\u193D", "\u193D"], + ["\u193E", "\u193E"], + ["\u193F", "\u193F"], + ["\u1940", "\u1940"], /* LIMBU SIGN LOO */ + ["\u1941", "\u1941"], + ["\u1942", "\u1942"], + ["\u1943", "\u1943"], + ["\u1944", "\u1944"], /* LIMBU EXCLAMATION MARK */ + ["\u1945", "\u1945"], /* LIMBU QUESTION MARK */ + ["\u1946", "\u1946"], /* LIMBU DIGIT ZERO */ + ["\u1947", "\u1947"], /* LIMBU DIGIT ONE */ + ["\u1948", "\u1948"], /* LIMBU DIGIT TWO */ + ["\u1949", "\u1949"], /* LIMBU DIGIT THREE */ + ["\u194A", "\u194A"], /* LIMBU DIGIT FOUR */ + ["\u194B", "\u194B"], /* LIMBU DIGIT FIVE */ + ["\u194C", "\u194C"], /* LIMBU DIGIT SIX */ + ["\u194D", "\u194D"], /* LIMBU DIGIT SEVEN */ + ["\u194E", "\u194E"], /* LIMBU DIGIT EIGHT */ + ["\u194F", "\u194F"], /* LIMBU DIGIT NINE */ + ["\u1950", "\u1950"], /* TAI LE LETTER KA */ + ["\u1951", "\u1951"], /* TAI LE LETTER XA */ + ["\u1952", "\u1952"], /* TAI LE LETTER NGA */ + ["\u1953", "\u1953"], /* TAI LE LETTER TSA */ + ["\u1954", "\u1954"], /* TAI LE LETTER SA */ + ["\u1955", "\u1955"], /* TAI LE LETTER YA */ + ["\u1956", "\u1956"], /* TAI LE LETTER TA */ + ["\u1957", "\u1957"], /* TAI LE LETTER THA */ + ["\u1958", "\u1958"], /* TAI LE LETTER LA */ + ["\u1959", "\u1959"], /* TAI LE LETTER PA */ + ["\u195A", "\u195A"], /* TAI LE LETTER PHA */ + ["\u195B", "\u195B"], /* TAI LE LETTER MA */ + ["\u195C", "\u195C"], /* TAI LE LETTER FA */ + ["\u195D", "\u195D"], /* TAI LE LETTER VA */ + ["\u195E", "\u195E"], /* TAI LE LETTER HA */ + ["\u195F", "\u195F"], /* TAI LE LETTER QA */ + ["\u1960", "\u1960"], /* TAI LE LETTER KHA */ + ["\u1961", "\u1961"], /* TAI LE LETTER TSHA */ + ["\u1962", "\u1962"], /* TAI LE LETTER NA */ + ["\u1963", "\u1963"], /* TAI LE LETTER A */ + ["\u1964", "\u1964"], /* TAI LE LETTER I */ + ["\u1965", "\u1965"], /* TAI LE LETTER EE */ + ["\u1966", "\u1966"], /* TAI LE LETTER EH */ + ["\u1967", "\u1967"], /* TAI LE LETTER U */ + ["\u1968", "\u1968"], /* TAI LE LETTER OO */ + ["\u1969", "\u1969"], /* TAI LE LETTER O */ + ["\u196A", "\u196A"], /* TAI LE LETTER UE */ + ["\u196B", "\u196B"], /* TAI LE LETTER E */ + ["\u196C", "\u196C"], /* TAI LE LETTER AUE */ + ["\u196D", "\u196D"], /* TAI LE LETTER AI */ + ["\u196E", "\u196E"], + ["\u196F", "\u196F"], + ["\u1970", "\u1970"], /* TAI LE LETTER TONE-2 */ + ["\u1971", "\u1971"], /* TAI LE LETTER TONE-3 */ + ["\u1972", "\u1972"], /* TAI LE LETTER TONE-4 */ + ["\u1973", "\u1973"], /* TAI LE LETTER TONE-5 */ + ["\u1974", "\u1974"], /* TAI LE LETTER TONE-6 */ + ["\u1975", "\u1975"], + ["\u1976", "\u1976"], + ["\u1977", "\u1977"], + ["\u1978", "\u1978"], + ["\u1979", "\u1979"], + ["\u197A", "\u197A"], + ["\u197B", "\u197B"], + ["\u197C", "\u197C"], + ["\u197D", "\u197D"], + ["\u197E", "\u197E"], + ["\u197F", "\u197F"], + ["\u1980", "\u1980"], /* NEW TAI LUE LETTER HIGH QA */ + ["\u1981", "\u1981"], /* NEW TAI LUE LETTER LOW QA */ + ["\u1982", "\u1982"], /* NEW TAI LUE LETTER HIGH KA */ + ["\u1983", "\u1983"], /* NEW TAI LUE LETTER HIGH XA */ + ["\u1984", "\u1984"], /* NEW TAI LUE LETTER HIGH NGA */ + ["\u1985", "\u1985"], /* NEW TAI LUE LETTER LOW KA */ + ["\u1986", "\u1986"], /* NEW TAI LUE LETTER LOW XA */ + ["\u1987", "\u1987"], /* NEW TAI LUE LETTER LOW NGA */ + ["\u1988", "\u1988"], /* NEW TAI LUE LETTER HIGH TSA */ + ["\u1989", "\u1989"], /* NEW TAI LUE LETTER HIGH SA */ + ["\u198A", "\u198A"], /* NEW TAI LUE LETTER HIGH YA */ + ["\u198B", "\u198B"], /* NEW TAI LUE LETTER LOW TSA */ + ["\u198C", "\u198C"], /* NEW TAI LUE LETTER LOW SA */ + ["\u198D", "\u198D"], /* NEW TAI LUE LETTER LOW YA */ + ["\u198E", "\u198E"], /* NEW TAI LUE LETTER HIGH TA */ + ["\u198F", "\u198F"], /* NEW TAI LUE LETTER HIGH THA */ + ["\u1990", "\u1990"], /* NEW TAI LUE LETTER HIGH NA */ + ["\u1991", "\u1991"], /* NEW TAI LUE LETTER LOW TA */ + ["\u1992", "\u1992"], /* NEW TAI LUE LETTER LOW THA */ + ["\u1993", "\u1993"], /* NEW TAI LUE LETTER LOW NA */ + ["\u1994", "\u1994"], /* NEW TAI LUE LETTER HIGH PA */ + ["\u1995", "\u1995"], /* NEW TAI LUE LETTER HIGH PHA */ + ["\u1996", "\u1996"], /* NEW TAI LUE LETTER HIGH MA */ + ["\u1997", "\u1997"], /* NEW TAI LUE LETTER LOW PA */ + ["\u1998", "\u1998"], /* NEW TAI LUE LETTER LOW PHA */ + ["\u1999", "\u1999"], /* NEW TAI LUE LETTER LOW MA */ + ["\u199A", "\u199A"], /* NEW TAI LUE LETTER HIGH FA */ + ["\u199B", "\u199B"], /* NEW TAI LUE LETTER HIGH VA */ + ["\u199C", "\u199C"], /* NEW TAI LUE LETTER HIGH LA */ + ["\u199D", "\u199D"], /* NEW TAI LUE LETTER LOW FA */ + ["\u199E", "\u199E"], /* NEW TAI LUE LETTER LOW VA */ + ["\u199F", "\u199F"], /* NEW TAI LUE LETTER LOW LA */ + ["\u19A0", "\u19A0"], /* NEW TAI LUE LETTER HIGH HA */ + ["\u19A1", "\u19A1"], /* NEW TAI LUE LETTER HIGH DA */ + ["\u19A2", "\u19A2"], /* NEW TAI LUE LETTER HIGH BA */ + ["\u19A3", "\u19A3"], /* NEW TAI LUE LETTER LOW HA */ + ["\u19A4", "\u19A4"], /* NEW TAI LUE LETTER LOW DA */ + ["\u19A5", "\u19A5"], /* NEW TAI LUE LETTER LOW BA */ + ["\u19A6", "\u19A6"], /* NEW TAI LUE LETTER HIGH KVA */ + ["\u19A7", "\u19A7"], /* NEW TAI LUE LETTER HIGH XVA */ + ["\u19A8", "\u19A8"], /* NEW TAI LUE LETTER LOW KVA */ + ["\u19A9", "\u19A9"], /* NEW TAI LUE LETTER LOW XVA */ + ["\u19AA", "\u19AA"], /* NEW TAI LUE LETTER HIGH SUA */ + ["\u19AB", "\u19AB"], /* NEW TAI LUE LETTER LOW SUA */ + ["\u19AC", "\u19AC"], + ["\u19AD", "\u19AD"], + ["\u19AE", "\u19AE"], + ["\u19AF", "\u19AF"], + ["\u19B0", "\u19B0"], /* NEW TAI LUE VOWEL SIGN VOWEL SHORTENER */ + ["\u19B1", "\u19B1"], /* NEW TAI LUE VOWEL SIGN AA */ + ["\u19B2", "\u19B2"], /* NEW TAI LUE VOWEL SIGN II */ + ["\u19B3", "\u19B3"], /* NEW TAI LUE VOWEL SIGN U */ + ["\u19B4", "\u19B4"], /* NEW TAI LUE VOWEL SIGN UU */ + ["\u19B5", "\u19B5"], /* NEW TAI LUE VOWEL SIGN E */ + ["\u19B6", "\u19B6"], /* NEW TAI LUE VOWEL SIGN AE */ + ["\u19B7", "\u19B7"], /* NEW TAI LUE VOWEL SIGN O */ + ["\u19B8", "\u19B8"], /* NEW TAI LUE VOWEL SIGN OA */ + ["\u19B9", "\u19B9"], /* NEW TAI LUE VOWEL SIGN UE */ + ["\u19BA", "\u19BA"], /* NEW TAI LUE VOWEL SIGN AY */ + ["\u19BB", "\u19BB"], /* NEW TAI LUE VOWEL SIGN AAY */ + ["\u19BC", "\u19BC"], /* NEW TAI LUE VOWEL SIGN UY */ + ["\u19BD", "\u19BD"], /* NEW TAI LUE VOWEL SIGN OY */ + ["\u19BE", "\u19BE"], /* NEW TAI LUE VOWEL SIGN OAY */ + ["\u19BF", "\u19BF"], /* NEW TAI LUE VOWEL SIGN UEY */ + ["\u19C0", "\u19C0"], /* NEW TAI LUE VOWEL SIGN IY */ + ["\u19C1", "\u19C1"], /* NEW TAI LUE LETTER FINAL V */ + ["\u19C2", "\u19C2"], /* NEW TAI LUE LETTER FINAL NG */ + ["\u19C3", "\u19C3"], /* NEW TAI LUE LETTER FINAL N */ + ["\u19C4", "\u19C4"], /* NEW TAI LUE LETTER FINAL M */ + ["\u19C5", "\u19C5"], /* NEW TAI LUE LETTER FINAL K */ + ["\u19C6", "\u19C6"], /* NEW TAI LUE LETTER FINAL D */ + ["\u19C7", "\u19C7"], /* NEW TAI LUE LETTER FINAL B */ + ["\u19C8", "\u19C8"], /* NEW TAI LUE TONE MARK-1 */ + ["\u19C9", "\u19C9"], /* NEW TAI LUE TONE MARK-2 */ + ["\u19CA", "\u19CA"], + ["\u19CB", "\u19CB"], + ["\u19CC", "\u19CC"], + ["\u19CD", "\u19CD"], + ["\u19CE", "\u19CE"], + ["\u19CF", "\u19CF"], + ["\u19D0", "\u19D0"], /* NEW TAI LUE DIGIT ZERO */ + ["\u19D1", "\u19D1"], /* NEW TAI LUE DIGIT ONE */ + ["\u19D2", "\u19D2"], /* NEW TAI LUE DIGIT TWO */ + ["\u19D3", "\u19D3"], /* NEW TAI LUE DIGIT THREE */ + ["\u19D4", "\u19D4"], /* NEW TAI LUE DIGIT FOUR */ + ["\u19D5", "\u19D5"], /* NEW TAI LUE DIGIT FIVE */ + ["\u19D6", "\u19D6"], /* NEW TAI LUE DIGIT SIX */ + ["\u19D7", "\u19D7"], /* NEW TAI LUE DIGIT SEVEN */ + ["\u19D8", "\u19D8"], /* NEW TAI LUE DIGIT EIGHT */ + ["\u19D9", "\u19D9"], /* NEW TAI LUE DIGIT NINE */ + ["\u19DA", "\u19DA"], /* NEW TAI LUE THAM DIGIT ONE */ + ["\u19DB", "\u19DB"], + ["\u19DC", "\u19DC"], + ["\u19DD", "\u19DD"], + ["\u19DE", "\u19DE"], /* NEW TAI LUE SIGN LAE */ + ["\u19DF", "\u19DF"], /* NEW TAI LUE SIGN LAEV */ + ["\u19E0", "\u19E0"], /* KHMER SYMBOL PATHAMASAT */ + ["\u19E1", "\u19E1"], /* KHMER SYMBOL MUOY KOET */ + ["\u19E2", "\u19E2"], /* KHMER SYMBOL PII KOET */ + ["\u19E3", "\u19E3"], /* KHMER SYMBOL BEI KOET */ + ["\u19E4", "\u19E4"], /* KHMER SYMBOL BUON KOET */ + ["\u19E5", "\u19E5"], /* KHMER SYMBOL PRAM KOET */ + ["\u19E6", "\u19E6"], /* KHMER SYMBOL PRAM-MUOY KOET */ + ["\u19E7", "\u19E7"], /* KHMER SYMBOL PRAM-PII KOET */ + ["\u19E8", "\u19E8"], /* KHMER SYMBOL PRAM-BEI KOET */ + ["\u19E9", "\u19E9"], /* KHMER SYMBOL PRAM-BUON KOET */ + ["\u19EA", "\u19EA"], /* KHMER SYMBOL DAP KOET */ + ["\u19EB", "\u19EB"], /* KHMER SYMBOL DAP-MUOY KOET */ + ["\u19EC", "\u19EC"], /* KHMER SYMBOL DAP-PII KOET */ + ["\u19ED", "\u19ED"], /* KHMER SYMBOL DAP-BEI KOET */ + ["\u19EE", "\u19EE"], /* KHMER SYMBOL DAP-BUON KOET */ + ["\u19EF", "\u19EF"], /* KHMER SYMBOL DAP-PRAM KOET */ + ["\u19F0", "\u19F0"], /* KHMER SYMBOL TUTEYASAT */ + ["\u19F1", "\u19F1"], /* KHMER SYMBOL MUOY ROC */ + ["\u19F2", "\u19F2"], /* KHMER SYMBOL PII ROC */ + ["\u19F3", "\u19F3"], /* KHMER SYMBOL BEI ROC */ + ["\u19F4", "\u19F4"], /* KHMER SYMBOL BUON ROC */ + ["\u19F5", "\u19F5"], /* KHMER SYMBOL PRAM ROC */ + ["\u19F6", "\u19F6"], /* KHMER SYMBOL PRAM-MUOY ROC */ + ["\u19F7", "\u19F7"], /* KHMER SYMBOL PRAM-PII ROC */ + ["\u19F8", "\u19F8"], /* KHMER SYMBOL PRAM-BEI ROC */ + ["\u19F9", "\u19F9"], /* KHMER SYMBOL PRAM-BUON ROC */ + ["\u19FA", "\u19FA"], /* KHMER SYMBOL DAP ROC */ + ["\u19FB", "\u19FB"], /* KHMER SYMBOL DAP-MUOY ROC */ + ["\u19FC", "\u19FC"], /* KHMER SYMBOL DAP-PII ROC */ + ["\u19FD", "\u19FD"], /* KHMER SYMBOL DAP-BEI ROC */ + ["\u19FE", "\u19FE"], /* KHMER SYMBOL DAP-BUON ROC */ + ["\u19FF", "\u19FF"], /* KHMER SYMBOL DAP-PRAM ROC */ + ["\u1A00", "\u1A00"], /* BUGINESE LETTER KA */ + ["\u1A01", "\u1A01"], /* BUGINESE LETTER GA */ + ["\u1A02", "\u1A02"], /* BUGINESE LETTER NGA */ + ["\u1A03", "\u1A03"], /* BUGINESE LETTER NGKA */ + ["\u1A04", "\u1A04"], /* BUGINESE LETTER PA */ + ["\u1A05", "\u1A05"], /* BUGINESE LETTER BA */ + ["\u1A06", "\u1A06"], /* BUGINESE LETTER MA */ + ["\u1A07", "\u1A07"], /* BUGINESE LETTER MPA */ + ["\u1A08", "\u1A08"], /* BUGINESE LETTER TA */ + ["\u1A09", "\u1A09"], /* BUGINESE LETTER DA */ + ["\u1A0A", "\u1A0A"], /* BUGINESE LETTER NA */ + ["\u1A0B", "\u1A0B"], /* BUGINESE LETTER NRA */ + ["\u1A0C", "\u1A0C"], /* BUGINESE LETTER CA */ + ["\u1A0D", "\u1A0D"], /* BUGINESE LETTER JA */ + ["\u1A0E", "\u1A0E"], /* BUGINESE LETTER NYA */ + ["\u1A0F", "\u1A0F"], /* BUGINESE LETTER NYCA */ + ["\u1A10", "\u1A10"], /* BUGINESE LETTER YA */ + ["\u1A11", "\u1A11"], /* BUGINESE LETTER RA */ + ["\u1A12", "\u1A12"], /* BUGINESE LETTER LA */ + ["\u1A13", "\u1A13"], /* BUGINESE LETTER VA */ + ["\u1A14", "\u1A14"], /* BUGINESE LETTER SA */ + ["\u1A15", "\u1A15"], /* BUGINESE LETTER A */ + ["\u1A16", "\u1A16"], /* BUGINESE LETTER HA */ + ["\u1A17", "\u1A17"], /* BUGINESE VOWEL SIGN I */ + ["\u1A18", "\u1A18"], /* BUGINESE VOWEL SIGN U */ + ["\u1A19", "\u1A19"], /* BUGINESE VOWEL SIGN E */ + ["\u1A1A", "\u1A1A"], /* BUGINESE VOWEL SIGN O */ + ["\u1A1B", "\u1A1B"], /* BUGINESE VOWEL SIGN AE */ + ["\u1A1C", "\u1A1C"], + ["\u1A1D", "\u1A1D"], + ["\u1A1E", "\u1A1E"], /* BUGINESE PALLAWA */ + ["\u1A1F", "\u1A1F"], /* BUGINESE END OF SECTION */ + ["\u1A20", "\u1A20"], /* TAI THAM LETTER HIGH KA */ + ["\u1A21", "\u1A21"], /* TAI THAM LETTER HIGH KHA */ + ["\u1A22", "\u1A22"], /* TAI THAM LETTER HIGH KXA */ + ["\u1A23", "\u1A23"], /* TAI THAM LETTER LOW KA */ + ["\u1A24", "\u1A24"], /* TAI THAM LETTER LOW KXA */ + ["\u1A25", "\u1A25"], /* TAI THAM LETTER LOW KHA */ + ["\u1A26", "\u1A26"], /* TAI THAM LETTER NGA */ + ["\u1A27", "\u1A27"], /* TAI THAM LETTER HIGH CA */ + ["\u1A28", "\u1A28"], /* TAI THAM LETTER HIGH CHA */ + ["\u1A29", "\u1A29"], /* TAI THAM LETTER LOW CA */ + ["\u1A2A", "\u1A2A"], /* TAI THAM LETTER LOW SA */ + ["\u1A2B", "\u1A2B"], /* TAI THAM LETTER LOW CHA */ + ["\u1A2C", "\u1A2C"], /* TAI THAM LETTER NYA */ + ["\u1A2D", "\u1A2D"], /* TAI THAM LETTER RATA */ + ["\u1A2E", "\u1A2E"], /* TAI THAM LETTER HIGH RATHA */ + ["\u1A2F", "\u1A2F"], /* TAI THAM LETTER DA */ + ["\u1A30", "\u1A30"], /* TAI THAM LETTER LOW RATHA */ + ["\u1A31", "\u1A31"], /* TAI THAM LETTER RANA */ + ["\u1A32", "\u1A32"], /* TAI THAM LETTER HIGH TA */ + ["\u1A33", "\u1A33"], /* TAI THAM LETTER HIGH THA */ + ["\u1A34", "\u1A34"], /* TAI THAM LETTER LOW TA */ + ["\u1A35", "\u1A35"], /* TAI THAM LETTER LOW THA */ + ["\u1A36", "\u1A36"], /* TAI THAM LETTER NA */ + ["\u1A37", "\u1A37"], /* TAI THAM LETTER BA */ + ["\u1A38", "\u1A38"], /* TAI THAM LETTER HIGH PA */ + ["\u1A39", "\u1A39"], /* TAI THAM LETTER HIGH PHA */ + ["\u1A3A", "\u1A3A"], /* TAI THAM LETTER HIGH FA */ + ["\u1A3B", "\u1A3B"], /* TAI THAM LETTER LOW PA */ + ["\u1A3C", "\u1A3C"], /* TAI THAM LETTER LOW FA */ + ["\u1A3D", "\u1A3D"], /* TAI THAM LETTER LOW PHA */ + ["\u1A3E", "\u1A3E"], /* TAI THAM LETTER MA */ + ["\u1A3F", "\u1A3F"], /* TAI THAM LETTER LOW YA */ + ["\u1A40", "\u1A40"], /* TAI THAM LETTER HIGH YA */ + ["\u1A41", "\u1A41"], /* TAI THAM LETTER RA */ + ["\u1A42", "\u1A42"], /* TAI THAM LETTER RUE */ + ["\u1A43", "\u1A43"], /* TAI THAM LETTER LA */ + ["\u1A44", "\u1A44"], /* TAI THAM LETTER LUE */ + ["\u1A45", "\u1A45"], /* TAI THAM LETTER WA */ + ["\u1A46", "\u1A46"], /* TAI THAM LETTER HIGH SHA */ + ["\u1A47", "\u1A47"], /* TAI THAM LETTER HIGH SSA */ + ["\u1A48", "\u1A48"], /* TAI THAM LETTER HIGH SA */ + ["\u1A49", "\u1A49"], /* TAI THAM LETTER HIGH HA */ + ["\u1A4A", "\u1A4A"], /* TAI THAM LETTER LLA */ + ["\u1A4B", "\u1A4B"], /* TAI THAM LETTER A */ + ["\u1A4C", "\u1A4C"], /* TAI THAM LETTER LOW HA */ + ["\u1A4D", "\u1A4D"], /* TAI THAM LETTER I */ + ["\u1A4E", "\u1A4E"], /* TAI THAM LETTER II */ + ["\u1A4F", "\u1A4F"], /* TAI THAM LETTER U */ + ["\u1A50", "\u1A50"], /* TAI THAM LETTER UU */ + ["\u1A51", "\u1A51"], /* TAI THAM LETTER EE */ + ["\u1A52", "\u1A52"], /* TAI THAM LETTER OO */ + ["\u1A53", "\u1A53"], /* TAI THAM LETTER LAE */ + ["\u1A54", "\u1A54"], /* TAI THAM LETTER GREAT SA */ + ["\u1A55", "\u1A55"], /* TAI THAM CONSONANT SIGN MEDIAL RA */ + ["\u1A56", "\u1A56"], /* TAI THAM CONSONANT SIGN MEDIAL LA */ + ["\u1A57", "\u1A57"], /* TAI THAM CONSONANT SIGN LA TANG LAI */ + ["\u1A58", "\u1A58"], /* TAI THAM SIGN MAI KANG LAI */ + ["\u1A59", "\u1A59"], /* TAI THAM CONSONANT SIGN FINAL NGA */ + ["\u1A5A", "\u1A5A"], /* TAI THAM CONSONANT SIGN LOW PA */ + ["\u1A5B", "\u1A5B"], /* TAI THAM CONSONANT SIGN HIGH RATHA OR LOW PA */ + ["\u1A5C", "\u1A5C"], /* TAI THAM CONSONANT SIGN MA */ + ["\u1A5D", "\u1A5D"], /* TAI THAM CONSONANT SIGN BA */ + ["\u1A5E", "\u1A5E"], /* TAI THAM CONSONANT SIGN SA */ + ["\u1A5F", "\u1A5F"], + ["\u1A60", "\u1A60"], /* TAI THAM SIGN SAKOT */ + ["\u1A61", "\u1A61"], /* TAI THAM VOWEL SIGN A */ + ["\u1A62", "\u1A62"], /* TAI THAM VOWEL SIGN MAI SAT */ + ["\u1A63", "\u1A63"], /* TAI THAM VOWEL SIGN AA */ + ["\u1A64", "\u1A64"], /* TAI THAM VOWEL SIGN TALL AA */ + ["\u1A65", "\u1A65"], /* TAI THAM VOWEL SIGN I */ + ["\u1A66", "\u1A66"], /* TAI THAM VOWEL SIGN II */ + ["\u1A67", "\u1A67"], /* TAI THAM VOWEL SIGN UE */ + ["\u1A68", "\u1A68"], /* TAI THAM VOWEL SIGN UUE */ + ["\u1A69", "\u1A69"], /* TAI THAM VOWEL SIGN U */ + ["\u1A6A", "\u1A6A"], /* TAI THAM VOWEL SIGN UU */ + ["\u1A6B", "\u1A6B"], /* TAI THAM VOWEL SIGN O */ + ["\u1A6C", "\u1A6C"], /* TAI THAM VOWEL SIGN OA BELOW */ + ["\u1A6D", "\u1A6D"], /* TAI THAM VOWEL SIGN OY */ + ["\u1A6E", "\u1A6E"], /* TAI THAM VOWEL SIGN E */ + ["\u1A6F", "\u1A6F"], /* TAI THAM VOWEL SIGN AE */ + ["\u1A70", "\u1A70"], /* TAI THAM VOWEL SIGN OO */ + ["\u1A71", "\u1A71"], /* TAI THAM VOWEL SIGN AI */ + ["\u1A72", "\u1A72"], /* TAI THAM VOWEL SIGN THAM AI */ + ["\u1A73", "\u1A73"], /* TAI THAM VOWEL SIGN OA ABOVE */ + ["\u1A74", "\u1A74"], /* TAI THAM SIGN MAI KANG */ + ["\u1A75", "\u1A75"], /* TAI THAM SIGN TONE-1 */ + ["\u1A76", "\u1A76"], /* TAI THAM SIGN TONE-2 */ + ["\u1A77", "\u1A77"], /* TAI THAM SIGN KHUEN TONE-3 */ + ["\u1A78", "\u1A78"], /* TAI THAM SIGN KHUEN TONE-4 */ + ["\u1A79", "\u1A79"], /* TAI THAM SIGN KHUEN TONE-5 */ + ["\u1A7A", "\u1A7A"], /* TAI THAM SIGN RA HAAM */ + ["\u1A7B", "\u1A7B"], /* TAI THAM SIGN MAI SAM */ + ["\u1A7C", "\u1A7C"], /* TAI THAM SIGN KHUEN-LUE KARAN */ + ["\u1A7D", "\u1A7D"], + ["\u1A7E", "\u1A7E"], + ["\u1A7F", "\u1A7F"], /* TAI THAM COMBINING CRYPTOGRAMMIC DOT */ + ["\u1A80", "\u1A80"], /* TAI THAM HORA DIGIT ZERO */ + ["\u1A81", "\u1A81"], /* TAI THAM HORA DIGIT ONE */ + ["\u1A82", "\u1A82"], /* TAI THAM HORA DIGIT TWO */ + ["\u1A83", "\u1A83"], /* TAI THAM HORA DIGIT THREE */ + ["\u1A84", "\u1A84"], /* TAI THAM HORA DIGIT FOUR */ + ["\u1A85", "\u1A85"], /* TAI THAM HORA DIGIT FIVE */ + ["\u1A86", "\u1A86"], /* TAI THAM HORA DIGIT SIX */ + ["\u1A87", "\u1A87"], /* TAI THAM HORA DIGIT SEVEN */ + ["\u1A88", "\u1A88"], /* TAI THAM HORA DIGIT EIGHT */ + ["\u1A89", "\u1A89"], /* TAI THAM HORA DIGIT NINE */ + ["\u1A8A", "\u1A8A"], + ["\u1A8B", "\u1A8B"], + ["\u1A8C", "\u1A8C"], + ["\u1A8D", "\u1A8D"], + ["\u1A8E", "\u1A8E"], + ["\u1A8F", "\u1A8F"], + ["\u1A90", "\u1A90"], /* TAI THAM THAM DIGIT ZERO */ + ["\u1A91", "\u1A91"], /* TAI THAM THAM DIGIT ONE */ + ["\u1A92", "\u1A92"], /* TAI THAM THAM DIGIT TWO */ + ["\u1A93", "\u1A93"], /* TAI THAM THAM DIGIT THREE */ + ["\u1A94", "\u1A94"], /* TAI THAM THAM DIGIT FOUR */ + ["\u1A95", "\u1A95"], /* TAI THAM THAM DIGIT FIVE */ + ["\u1A96", "\u1A96"], /* TAI THAM THAM DIGIT SIX */ + ["\u1A97", "\u1A97"], /* TAI THAM THAM DIGIT SEVEN */ + ["\u1A98", "\u1A98"], /* TAI THAM THAM DIGIT EIGHT */ + ["\u1A99", "\u1A99"], /* TAI THAM THAM DIGIT NINE */ + ["\u1A9A", "\u1A9A"], + ["\u1A9B", "\u1A9B"], + ["\u1A9C", "\u1A9C"], + ["\u1A9D", "\u1A9D"], + ["\u1A9E", "\u1A9E"], + ["\u1A9F", "\u1A9F"], + ["\u1AA0", "\u1AA0"], /* TAI THAM SIGN WIANG */ + ["\u1AA1", "\u1AA1"], /* TAI THAM SIGN WIANGWAAK */ + ["\u1AA2", "\u1AA2"], /* TAI THAM SIGN SAWAN */ + ["\u1AA3", "\u1AA3"], /* TAI THAM SIGN KEOW */ + ["\u1AA4", "\u1AA4"], /* TAI THAM SIGN HOY */ + ["\u1AA5", "\u1AA5"], /* TAI THAM SIGN DOKMAI */ + ["\u1AA6", "\u1AA6"], /* TAI THAM SIGN REVERSED ROTATED RANA */ + ["\u1AA7", "\u1AA7"], /* TAI THAM SIGN MAI YAMOK */ + ["\u1AA8", "\u1AA8"], /* TAI THAM SIGN KAAN */ + ["\u1AA9", "\u1AA9"], /* TAI THAM SIGN KAANKUU */ + ["\u1AAA", "\u1AAA"], /* TAI THAM SIGN SATKAAN */ + ["\u1AAB", "\u1AAB"], /* TAI THAM SIGN SATKAANKUU */ + ["\u1AAC", "\u1AAC"], /* TAI THAM SIGN HANG */ + ["\u1AAD", "\u1AAD"], /* TAI THAM SIGN CAANG */ + ["\u1AAE", "\u1AAE"], + ["\u1AAF", "\u1AAF"], + ["\u1AB0", "\u1AB0"], /* COMBINING DOUBLED CIRCUMFLEX ACCENT */ + ["\u1AB1", "\u1AB1"], /* COMBINING DIAERESIS-RING */ + ["\u1AB2", "\u1AB2"], /* COMBINING INFINITY */ + ["\u1AB3", "\u1AB3"], /* COMBINING DOWNWARDS ARROW */ + ["\u1AB4", "\u1AB4"], /* COMBINING TRIPLE DOT */ + ["\u1AB5", "\u1AB5"], /* COMBINING X-X BELOW */ + ["\u1AB6", "\u1AB6"], /* COMBINING WIGGLY LINE BELOW */ + ["\u1AB7", "\u1AB7"], /* COMBINING OPEN MARK BELOW */ + ["\u1AB8", "\u1AB8"], /* COMBINING DOUBLE OPEN MARK BELOW */ + ["\u1AB9", "\u1AB9"], /* COMBINING LIGHT CENTRALIZATION STROKE BELOW */ + ["\u1ABA", "\u1ABA"], /* COMBINING STRONG CENTRALIZATION STROKE BELOW */ + ["\u1ABB", "\u1ABB"], /* COMBINING PARENTHESES ABOVE */ + ["\u1ABC", "\u1ABC"], /* COMBINING DOUBLE PARENTHESES ABOVE */ + ["\u1ABD", "\u1ABD"], /* COMBINING PARENTHESES BELOW */ + ["\u1ABE", "\u1ABE"], /* COMBINING PARENTHESES OVERLAY */ + ["\u1ABF", "\u1ABF"], /* COMBINING LATIN SMALL LETTER W BELOW */ + ["\u1AC0", "\u1AC0"], /* COMBINING LATIN SMALL LETTER TURNED W BELOW */ + ["\u1AC1", "\u1AC1"], /* COMBINING LEFT PARENTHESIS ABOVE LEFT */ + ["\u1AC2", "\u1AC2"], /* COMBINING RIGHT PARENTHESIS ABOVE RIGHT */ + ["\u1AC3", "\u1AC3"], /* COMBINING LEFT PARENTHESIS BELOW LEFT */ + ["\u1AC4", "\u1AC4"], /* COMBINING RIGHT PARENTHESIS BELOW RIGHT */ + ["\u1AC5", "\u1AC5"], /* COMBINING SQUARE BRACKETS ABOVE */ + ["\u1AC6", "\u1AC6"], /* COMBINING NUMBER SIGN ABOVE */ + ["\u1AC7", "\u1AC7"], /* COMBINING INVERTED DOUBLE ARCH ABOVE */ + ["\u1AC8", "\u1AC8"], /* COMBINING PLUS SIGN ABOVE */ + ["\u1AC9", "\u1AC9"], /* COMBINING DOUBLE PLUS SIGN ABOVE */ + ["\u1ACA", "\u1ACA"], /* COMBINING DOUBLE PLUS SIGN BELOW */ + ["\u1ACB", "\u1ACB"], /* COMBINING TRIPLE ACUTE ACCENT */ + ["\u1ACC", "\u1ACC"], /* COMBINING LATIN SMALL LETTER INSULAR G */ + ["\u1ACD", "\u1ACD"], /* COMBINING LATIN SMALL LETTER INSULAR R */ + ["\u1ACE", "\u1ACE"], /* COMBINING LATIN SMALL LETTER INSULAR T */ + ["\u1ACF", "\u1ACF"], + ["\u1AD0", "\u1AD0"], + ["\u1AD1", "\u1AD1"], + ["\u1AD2", "\u1AD2"], + ["\u1AD3", "\u1AD3"], + ["\u1AD4", "\u1AD4"], + ["\u1AD5", "\u1AD5"], + ["\u1AD6", "\u1AD6"], + ["\u1AD7", "\u1AD7"], + ["\u1AD8", "\u1AD8"], + ["\u1AD9", "\u1AD9"], + ["\u1ADA", "\u1ADA"], + ["\u1ADB", "\u1ADB"], + ["\u1ADC", "\u1ADC"], + ["\u1ADD", "\u1ADD"], + ["\u1ADE", "\u1ADE"], + ["\u1ADF", "\u1ADF"], + ["\u1AE0", "\u1AE0"], + ["\u1AE1", "\u1AE1"], + ["\u1AE2", "\u1AE2"], + ["\u1AE3", "\u1AE3"], + ["\u1AE4", "\u1AE4"], + ["\u1AE5", "\u1AE5"], + ["\u1AE6", "\u1AE6"], + ["\u1AE7", "\u1AE7"], + ["\u1AE8", "\u1AE8"], + ["\u1AE9", "\u1AE9"], + ["\u1AEA", "\u1AEA"], + ["\u1AEB", "\u1AEB"], + ["\u1AEC", "\u1AEC"], + ["\u1AED", "\u1AED"], + ["\u1AEE", "\u1AEE"], + ["\u1AEF", "\u1AEF"], + ["\u1AF0", "\u1AF0"], + ["\u1AF1", "\u1AF1"], + ["\u1AF2", "\u1AF2"], + ["\u1AF3", "\u1AF3"], + ["\u1AF4", "\u1AF4"], + ["\u1AF5", "\u1AF5"], + ["\u1AF6", "\u1AF6"], + ["\u1AF7", "\u1AF7"], + ["\u1AF8", "\u1AF8"], + ["\u1AF9", "\u1AF9"], + ["\u1AFA", "\u1AFA"], + ["\u1AFB", "\u1AFB"], + ["\u1AFC", "\u1AFC"], + ["\u1AFD", "\u1AFD"], + ["\u1AFE", "\u1AFE"], + ["\u1AFF", "\u1AFF"], + ["\u1B00", "\u1B00"], /* BALINESE SIGN ULU RICEM */ + ["\u1B01", "\u1B01"], /* BALINESE SIGN ULU CANDRA */ + ["\u1B02", "\u1B02"], /* BALINESE SIGN CECEK */ + ["\u1B03", "\u1B03"], /* BALINESE SIGN SURANG */ + ["\u1B04", "\u1B04"], /* BALINESE SIGN BISAH */ + ["\u1B05", "\u1B05"], /* BALINESE LETTER AKARA */ + ["\u1B06", "\u1B06"], /* BALINESE LETTER AKARA TEDUNG */ + ["\u1B07", "\u1B07"], /* BALINESE LETTER IKARA */ + ["\u1B08", "\u1B08"], /* BALINESE LETTER IKARA TEDUNG */ + ["\u1B09", "\u1B09"], /* BALINESE LETTER UKARA */ + ["\u1B0A", "\u1B0A"], /* BALINESE LETTER UKARA TEDUNG */ + ["\u1B0B", "\u1B0B"], /* BALINESE LETTER RA REPA */ + ["\u1B0C", "\u1B0C"], /* BALINESE LETTER RA REPA TEDUNG */ + ["\u1B0D", "\u1B0D"], /* BALINESE LETTER LA LENGA */ + ["\u1B0E", "\u1B0E"], /* BALINESE LETTER LA LENGA TEDUNG */ + ["\u1B0F", "\u1B0F"], /* BALINESE LETTER EKARA */ + ["\u1B10", "\u1B10"], /* BALINESE LETTER AIKARA */ + ["\u1B11", "\u1B11"], /* BALINESE LETTER OKARA */ + ["\u1B12", "\u1B12"], /* BALINESE LETTER OKARA TEDUNG */ + ["\u1B13", "\u1B13"], /* BALINESE LETTER KA */ + ["\u1B14", "\u1B14"], /* BALINESE LETTER KA MAHAPRANA */ + ["\u1B15", "\u1B15"], /* BALINESE LETTER GA */ + ["\u1B16", "\u1B16"], /* BALINESE LETTER GA GORA */ + ["\u1B17", "\u1B17"], /* BALINESE LETTER NGA */ + ["\u1B18", "\u1B18"], /* BALINESE LETTER CA */ + ["\u1B19", "\u1B19"], /* BALINESE LETTER CA LACA */ + ["\u1B1A", "\u1B1A"], /* BALINESE LETTER JA */ + ["\u1B1B", "\u1B1B"], /* BALINESE LETTER JA JERA */ + ["\u1B1C", "\u1B1C"], /* BALINESE LETTER NYA */ + ["\u1B1D", "\u1B1D"], /* BALINESE LETTER TA LATIK */ + ["\u1B1E", "\u1B1E"], /* BALINESE LETTER TA MURDA MAHAPRANA */ + ["\u1B1F", "\u1B1F"], /* BALINESE LETTER DA MURDA ALPAPRANA */ + ["\u1B20", "\u1B20"], /* BALINESE LETTER DA MURDA MAHAPRANA */ + ["\u1B21", "\u1B21"], /* BALINESE LETTER NA RAMBAT */ + ["\u1B22", "\u1B22"], /* BALINESE LETTER TA */ + ["\u1B23", "\u1B23"], /* BALINESE LETTER TA TAWA */ + ["\u1B24", "\u1B24"], /* BALINESE LETTER DA */ + ["\u1B25", "\u1B25"], /* BALINESE LETTER DA MADU */ + ["\u1B26", "\u1B26"], /* BALINESE LETTER NA */ + ["\u1B27", "\u1B27"], /* BALINESE LETTER PA */ + ["\u1B28", "\u1B28"], /* BALINESE LETTER PA KAPAL */ + ["\u1B29", "\u1B29"], /* BALINESE LETTER BA */ + ["\u1B2A", "\u1B2A"], /* BALINESE LETTER BA KEMBANG */ + ["\u1B2B", "\u1B2B"], /* BALINESE LETTER MA */ + ["\u1B2C", "\u1B2C"], /* BALINESE LETTER YA */ + ["\u1B2D", "\u1B2D"], /* BALINESE LETTER RA */ + ["\u1B2E", "\u1B2E"], /* BALINESE LETTER LA */ + ["\u1B2F", "\u1B2F"], /* BALINESE LETTER WA */ + ["\u1B30", "\u1B30"], /* BALINESE LETTER SA SAGA */ + ["\u1B31", "\u1B31"], /* BALINESE LETTER SA SAPA */ + ["\u1B32", "\u1B32"], /* BALINESE LETTER SA */ + ["\u1B33", "\u1B33"], /* BALINESE LETTER HA */ + ["\u1B34", "\u1B34"], /* BALINESE SIGN REREKAN */ + ["\u1B35", "\u1B35"], /* BALINESE VOWEL SIGN TEDUNG */ + ["\u1B36", "\u1B36"], /* BALINESE VOWEL SIGN ULU */ + ["\u1B37", "\u1B37"], /* BALINESE VOWEL SIGN ULU SARI */ + ["\u1B38", "\u1B38"], /* BALINESE VOWEL SIGN SUKU */ + ["\u1B39", "\u1B39"], /* BALINESE VOWEL SIGN SUKU ILUT */ + ["\u1B3A", "\u1B3A"], /* BALINESE VOWEL SIGN RA REPA */ + ["\u1B3B", "\u1B3B"], /* BALINESE VOWEL SIGN RA REPA TEDUNG */ + ["\u1B3C", "\u1B3C"], /* BALINESE VOWEL SIGN LA LENGA */ + ["\u1B3D", "\u1B3D"], /* BALINESE VOWEL SIGN LA LENGA TEDUNG */ + ["\u1B3E", "\u1B3E"], /* BALINESE VOWEL SIGN TALING */ + ["\u1B3F", "\u1B3F"], /* BALINESE VOWEL SIGN TALING REPA */ + ["\u1B40", "\u1B40"], /* BALINESE VOWEL SIGN TALING TEDUNG */ + ["\u1B41", "\u1B41"], /* BALINESE VOWEL SIGN TALING REPA TEDUNG */ + ["\u1B42", "\u1B42"], /* BALINESE VOWEL SIGN PEPET */ + ["\u1B43", "\u1B43"], /* BALINESE VOWEL SIGN PEPET TEDUNG */ + ["\u1B44", "\u1B44"], /* BALINESE ADEG ADEG */ + ["\u1B45", "\u1B45"], /* BALINESE LETTER KAF SASAK */ + ["\u1B46", "\u1B46"], /* BALINESE LETTER KHOT SASAK */ + ["\u1B47", "\u1B47"], /* BALINESE LETTER TZIR SASAK */ + ["\u1B48", "\u1B48"], /* BALINESE LETTER EF SASAK */ + ["\u1B49", "\u1B49"], /* BALINESE LETTER VE SASAK */ + ["\u1B4A", "\u1B4A"], /* BALINESE LETTER ZAL SASAK */ + ["\u1B4B", "\u1B4B"], /* BALINESE LETTER ASYURA SASAK */ + ["\u1B4C", "\u1B4C"], /* BALINESE LETTER ARCHAIC JNYA */ + ["\u1B4D", "\u1B4D"], + ["\u1B4E", "\u1B4E"], + ["\u1B4F", "\u1B4F"], + ["\u1B50", "\u1B50"], /* BALINESE DIGIT ZERO */ + ["\u1B51", "\u1B51"], /* BALINESE DIGIT ONE */ + ["\u1B52", "\u1B52"], /* BALINESE DIGIT TWO */ + ["\u1B53", "\u1B53"], /* BALINESE DIGIT THREE */ + ["\u1B54", "\u1B54"], /* BALINESE DIGIT FOUR */ + ["\u1B55", "\u1B55"], /* BALINESE DIGIT FIVE */ + ["\u1B56", "\u1B56"], /* BALINESE DIGIT SIX */ + ["\u1B57", "\u1B57"], /* BALINESE DIGIT SEVEN */ + ["\u1B58", "\u1B58"], /* BALINESE DIGIT EIGHT */ + ["\u1B59", "\u1B59"], /* BALINESE DIGIT NINE */ + ["\u1B5A", "\u1B5A"], /* BALINESE PANTI */ + ["\u1B5B", "\u1B5B"], /* BALINESE PAMADA */ + ["\u1B5C", "\u1B5C"], /* BALINESE WINDU */ + ["\u1B5D", "\u1B5D"], /* BALINESE CARIK PAMUNGKAH */ + ["\u1B5E", "\u1B5E"], /* BALINESE CARIK SIKI */ + ["\u1B5F", "\u1B5F"], /* BALINESE CARIK PAREREN */ + ["\u1B60", "\u1B60"], /* BALINESE PAMENENG */ + ["\u1B61", "\u1B61"], /* BALINESE MUSICAL SYMBOL DONG */ + ["\u1B62", "\u1B62"], /* BALINESE MUSICAL SYMBOL DENG */ + ["\u1B63", "\u1B63"], /* BALINESE MUSICAL SYMBOL DUNG */ + ["\u1B64", "\u1B64"], /* BALINESE MUSICAL SYMBOL DANG */ + ["\u1B65", "\u1B65"], /* BALINESE MUSICAL SYMBOL DANG SURANG */ + ["\u1B66", "\u1B66"], /* BALINESE MUSICAL SYMBOL DING */ + ["\u1B67", "\u1B67"], /* BALINESE MUSICAL SYMBOL DAENG */ + ["\u1B68", "\u1B68"], /* BALINESE MUSICAL SYMBOL DEUNG */ + ["\u1B69", "\u1B69"], /* BALINESE MUSICAL SYMBOL DAING */ + ["\u1B6A", "\u1B6A"], /* BALINESE MUSICAL SYMBOL DANG GEDE */ + ["\u1B6B", "\u1B6B"], /* BALINESE MUSICAL SYMBOL COMBINING TEGEH */ + ["\u1B6C", "\u1B6C"], /* BALINESE MUSICAL SYMBOL COMBINING ENDEP */ + ["\u1B6D", "\u1B6D"], /* BALINESE MUSICAL SYMBOL COMBINING KEMPUL */ + ["\u1B6E", "\u1B6E"], /* BALINESE MUSICAL SYMBOL COMBINING KEMPLI */ + ["\u1B6F", "\u1B6F"], /* BALINESE MUSICAL SYMBOL COMBINING JEGOGAN */ + ["\u1B70", "\u1B70"], /* BALINESE MUSICAL SYMBOL COMBINING KEMPUL WITH JEGOGAN */ + ["\u1B71", "\u1B71"], /* BALINESE MUSICAL SYMBOL COMBINING KEMPLI WITH JEGOGAN */ + ["\u1B72", "\u1B72"], /* BALINESE MUSICAL SYMBOL COMBINING BENDE */ + ["\u1B73", "\u1B73"], /* BALINESE MUSICAL SYMBOL COMBINING GONG */ + ["\u1B74", "\u1B74"], /* BALINESE MUSICAL SYMBOL RIGHT-HAND OPEN DUG */ + ["\u1B75", "\u1B75"], /* BALINESE MUSICAL SYMBOL RIGHT-HAND OPEN DAG */ + ["\u1B76", "\u1B76"], /* BALINESE MUSICAL SYMBOL RIGHT-HAND CLOSED TUK */ + ["\u1B77", "\u1B77"], /* BALINESE MUSICAL SYMBOL RIGHT-HAND CLOSED TAK */ + ["\u1B78", "\u1B78"], /* BALINESE MUSICAL SYMBOL LEFT-HAND OPEN PANG */ + ["\u1B79", "\u1B79"], /* BALINESE MUSICAL SYMBOL LEFT-HAND OPEN PUNG */ + ["\u1B7A", "\u1B7A"], /* BALINESE MUSICAL SYMBOL LEFT-HAND CLOSED PLAK */ + ["\u1B7B", "\u1B7B"], /* BALINESE MUSICAL SYMBOL LEFT-HAND CLOSED PLUK */ + ["\u1B7C", "\u1B7C"], /* BALINESE MUSICAL SYMBOL LEFT-HAND OPEN PING */ + ["\u1B7D", "\u1B7D"], /* BALINESE PANTI LANTANG */ + ["\u1B7E", "\u1B7E"], /* BALINESE PAMADA LANTANG */ + ["\u1B7F", "\u1B7F"], + ["\u1B80", "\u1B80"], /* SUNDANESE SIGN PANYECEK */ + ["\u1B81", "\u1B81"], /* SUNDANESE SIGN PANGLAYAR */ + ["\u1B82", "\u1B82"], /* SUNDANESE SIGN PANGWISAD */ + ["\u1B83", "\u1B83"], /* SUNDANESE LETTER A */ + ["\u1B84", "\u1B84"], /* SUNDANESE LETTER I */ + ["\u1B85", "\u1B85"], /* SUNDANESE LETTER U */ + ["\u1B86", "\u1B86"], /* SUNDANESE LETTER AE */ + ["\u1B87", "\u1B87"], /* SUNDANESE LETTER O */ + ["\u1B88", "\u1B88"], /* SUNDANESE LETTER E */ + ["\u1B89", "\u1B89"], /* SUNDANESE LETTER EU */ + ["\u1B8A", "\u1B8A"], /* SUNDANESE LETTER KA */ + ["\u1B8B", "\u1B8B"], /* SUNDANESE LETTER QA */ + ["\u1B8C", "\u1B8C"], /* SUNDANESE LETTER GA */ + ["\u1B8D", "\u1B8D"], /* SUNDANESE LETTER NGA */ + ["\u1B8E", "\u1B8E"], /* SUNDANESE LETTER CA */ + ["\u1B8F", "\u1B8F"], /* SUNDANESE LETTER JA */ + ["\u1B90", "\u1B90"], /* SUNDANESE LETTER ZA */ + ["\u1B91", "\u1B91"], /* SUNDANESE LETTER NYA */ + ["\u1B92", "\u1B92"], /* SUNDANESE LETTER TA */ + ["\u1B93", "\u1B93"], /* SUNDANESE LETTER DA */ + ["\u1B94", "\u1B94"], /* SUNDANESE LETTER NA */ + ["\u1B95", "\u1B95"], /* SUNDANESE LETTER PA */ + ["\u1B96", "\u1B96"], /* SUNDANESE LETTER FA */ + ["\u1B97", "\u1B97"], /* SUNDANESE LETTER VA */ + ["\u1B98", "\u1B98"], /* SUNDANESE LETTER BA */ + ["\u1B99", "\u1B99"], /* SUNDANESE LETTER MA */ + ["\u1B9A", "\u1B9A"], /* SUNDANESE LETTER YA */ + ["\u1B9B", "\u1B9B"], /* SUNDANESE LETTER RA */ + ["\u1B9C", "\u1B9C"], /* SUNDANESE LETTER LA */ + ["\u1B9D", "\u1B9D"], /* SUNDANESE LETTER WA */ + ["\u1B9E", "\u1B9E"], /* SUNDANESE LETTER SA */ + ["\u1B9F", "\u1B9F"], /* SUNDANESE LETTER XA */ + ["\u1BA0", "\u1BA0"], /* SUNDANESE LETTER HA */ + ["\u1BA1", "\u1BA1"], /* SUNDANESE CONSONANT SIGN PAMINGKAL */ + ["\u1BA2", "\u1BA2"], /* SUNDANESE CONSONANT SIGN PANYAKRA */ + ["\u1BA3", "\u1BA3"], /* SUNDANESE CONSONANT SIGN PANYIKU */ + ["\u1BA4", "\u1BA4"], /* SUNDANESE VOWEL SIGN PANGHULU */ + ["\u1BA5", "\u1BA5"], /* SUNDANESE VOWEL SIGN PANYUKU */ + ["\u1BA6", "\u1BA6"], /* SUNDANESE VOWEL SIGN PANAELAENG */ + ["\u1BA7", "\u1BA7"], /* SUNDANESE VOWEL SIGN PANOLONG */ + ["\u1BA8", "\u1BA8"], /* SUNDANESE VOWEL SIGN PAMEPET */ + ["\u1BA9", "\u1BA9"], /* SUNDANESE VOWEL SIGN PANEULEUNG */ + ["\u1BAA", "\u1BAA"], /* SUNDANESE SIGN PAMAAEH */ + ["\u1BAB", "\u1BAB"], /* SUNDANESE SIGN VIRAMA */ + ["\u1BAC", "\u1BAC"], /* SUNDANESE CONSONANT SIGN PASANGAN MA */ + ["\u1BAD", "\u1BAD"], /* SUNDANESE CONSONANT SIGN PASANGAN WA */ + ["\u1BAE", "\u1BAE"], /* SUNDANESE LETTER KHA */ + ["\u1BAF", "\u1BAF"], /* SUNDANESE LETTER SYA */ + ["\u1BB0", "\u1BB0"], /* SUNDANESE DIGIT ZERO */ + ["\u1BB1", "\u1BB1"], /* SUNDANESE DIGIT ONE */ + ["\u1BB2", "\u1BB2"], /* SUNDANESE DIGIT TWO */ + ["\u1BB3", "\u1BB3"], /* SUNDANESE DIGIT THREE */ + ["\u1BB4", "\u1BB4"], /* SUNDANESE DIGIT FOUR */ + ["\u1BB5", "\u1BB5"], /* SUNDANESE DIGIT FIVE */ + ["\u1BB6", "\u1BB6"], /* SUNDANESE DIGIT SIX */ + ["\u1BB7", "\u1BB7"], /* SUNDANESE DIGIT SEVEN */ + ["\u1BB8", "\u1BB8"], /* SUNDANESE DIGIT EIGHT */ + ["\u1BB9", "\u1BB9"], /* SUNDANESE DIGIT NINE */ + ["\u1BBA", "\u1BBA"], /* SUNDANESE AVAGRAHA */ + ["\u1BBB", "\u1BBB"], /* SUNDANESE LETTER REU */ + ["\u1BBC", "\u1BBC"], /* SUNDANESE LETTER LEU */ + ["\u1BBD", "\u1BBD"], /* SUNDANESE LETTER BHA */ + ["\u1BBE", "\u1BBE"], /* SUNDANESE LETTER FINAL K */ + ["\u1BBF", "\u1BBF"], /* SUNDANESE LETTER FINAL M */ + ["\u1BC0", "\u1BC0"], /* BATAK LETTER A */ + ["\u1BC1", "\u1BC1"], /* BATAK LETTER SIMALUNGUN A */ + ["\u1BC2", "\u1BC2"], /* BATAK LETTER HA */ + ["\u1BC3", "\u1BC3"], /* BATAK LETTER SIMALUNGUN HA */ + ["\u1BC4", "\u1BC4"], /* BATAK LETTER MANDAILING HA */ + ["\u1BC5", "\u1BC5"], /* BATAK LETTER BA */ + ["\u1BC6", "\u1BC6"], /* BATAK LETTER KARO BA */ + ["\u1BC7", "\u1BC7"], /* BATAK LETTER PA */ + ["\u1BC8", "\u1BC8"], /* BATAK LETTER SIMALUNGUN PA */ + ["\u1BC9", "\u1BC9"], /* BATAK LETTER NA */ + ["\u1BCA", "\u1BCA"], /* BATAK LETTER MANDAILING NA */ + ["\u1BCB", "\u1BCB"], /* BATAK LETTER WA */ + ["\u1BCC", "\u1BCC"], /* BATAK LETTER SIMALUNGUN WA */ + ["\u1BCD", "\u1BCD"], /* BATAK LETTER PAKPAK WA */ + ["\u1BCE", "\u1BCE"], /* BATAK LETTER GA */ + ["\u1BCF", "\u1BCF"], /* BATAK LETTER SIMALUNGUN GA */ + ["\u1BD0", "\u1BD0"], /* BATAK LETTER JA */ + ["\u1BD1", "\u1BD1"], /* BATAK LETTER DA */ + ["\u1BD2", "\u1BD2"], /* BATAK LETTER RA */ + ["\u1BD3", "\u1BD3"], /* BATAK LETTER SIMALUNGUN RA */ + ["\u1BD4", "\u1BD4"], /* BATAK LETTER MA */ + ["\u1BD5", "\u1BD5"], /* BATAK LETTER SIMALUNGUN MA */ + ["\u1BD6", "\u1BD6"], /* BATAK LETTER SOUTHERN TA */ + ["\u1BD7", "\u1BD7"], /* BATAK LETTER NORTHERN TA */ + ["\u1BD8", "\u1BD8"], /* BATAK LETTER SA */ + ["\u1BD9", "\u1BD9"], /* BATAK LETTER SIMALUNGUN SA */ + ["\u1BDA", "\u1BDA"], /* BATAK LETTER MANDAILING SA */ + ["\u1BDB", "\u1BDB"], /* BATAK LETTER YA */ + ["\u1BDC", "\u1BDC"], /* BATAK LETTER SIMALUNGUN YA */ + ["\u1BDD", "\u1BDD"], /* BATAK LETTER NGA */ + ["\u1BDE", "\u1BDE"], /* BATAK LETTER LA */ + ["\u1BDF", "\u1BDF"], /* BATAK LETTER SIMALUNGUN LA */ + ["\u1BE0", "\u1BE0"], /* BATAK LETTER NYA */ + ["\u1BE1", "\u1BE1"], /* BATAK LETTER CA */ + ["\u1BE2", "\u1BE2"], /* BATAK LETTER NDA */ + ["\u1BE3", "\u1BE3"], /* BATAK LETTER MBA */ + ["\u1BE4", "\u1BE4"], /* BATAK LETTER I */ + ["\u1BE5", "\u1BE5"], /* BATAK LETTER U */ + ["\u1BE6", "\u1BE6"], /* BATAK SIGN TOMPI */ + ["\u1BE7", "\u1BE7"], /* BATAK VOWEL SIGN E */ + ["\u1BE8", "\u1BE8"], /* BATAK VOWEL SIGN PAKPAK E */ + ["\u1BE9", "\u1BE9"], /* BATAK VOWEL SIGN EE */ + ["\u1BEA", "\u1BEA"], /* BATAK VOWEL SIGN I */ + ["\u1BEB", "\u1BEB"], /* BATAK VOWEL SIGN KARO I */ + ["\u1BEC", "\u1BEC"], /* BATAK VOWEL SIGN O */ + ["\u1BED", "\u1BED"], /* BATAK VOWEL SIGN KARO O */ + ["\u1BEE", "\u1BEE"], /* BATAK VOWEL SIGN U */ + ["\u1BEF", "\u1BEF"], /* BATAK VOWEL SIGN U FOR SIMALUNGUN SA */ + ["\u1BF0", "\u1BF0"], /* BATAK CONSONANT SIGN NG */ + ["\u1BF1", "\u1BF1"], /* BATAK CONSONANT SIGN H */ + ["\u1BF2", "\u1BF2"], /* BATAK PANGOLAT */ + ["\u1BF3", "\u1BF3"], /* BATAK PANONGONAN */ + ["\u1BF4", "\u1BF4"], + ["\u1BF5", "\u1BF5"], + ["\u1BF6", "\u1BF6"], + ["\u1BF7", "\u1BF7"], + ["\u1BF8", "\u1BF8"], + ["\u1BF9", "\u1BF9"], + ["\u1BFA", "\u1BFA"], + ["\u1BFB", "\u1BFB"], + ["\u1BFC", "\u1BFC"], /* BATAK SYMBOL BINDU NA METEK */ + ["\u1BFD", "\u1BFD"], /* BATAK SYMBOL BINDU PINARBORAS */ + ["\u1BFE", "\u1BFE"], /* BATAK SYMBOL BINDU JUDUL */ + ["\u1BFF", "\u1BFF"], /* BATAK SYMBOL BINDU PANGOLAT */ + ["\u1C00", "\u1C00"], /* LEPCHA LETTER KA */ + ["\u1C01", "\u1C01"], /* LEPCHA LETTER KLA */ + ["\u1C02", "\u1C02"], /* LEPCHA LETTER KHA */ + ["\u1C03", "\u1C03"], /* LEPCHA LETTER GA */ + ["\u1C04", "\u1C04"], /* LEPCHA LETTER GLA */ + ["\u1C05", "\u1C05"], /* LEPCHA LETTER NGA */ + ["\u1C06", "\u1C06"], /* LEPCHA LETTER CA */ + ["\u1C07", "\u1C07"], /* LEPCHA LETTER CHA */ + ["\u1C08", "\u1C08"], /* LEPCHA LETTER JA */ + ["\u1C09", "\u1C09"], /* LEPCHA LETTER NYA */ + ["\u1C0A", "\u1C0A"], /* LEPCHA LETTER TA */ + ["\u1C0B", "\u1C0B"], /* LEPCHA LETTER THA */ + ["\u1C0C", "\u1C0C"], /* LEPCHA LETTER DA */ + ["\u1C0D", "\u1C0D"], /* LEPCHA LETTER NA */ + ["\u1C0E", "\u1C0E"], /* LEPCHA LETTER PA */ + ["\u1C0F", "\u1C0F"], /* LEPCHA LETTER PLA */ + ["\u1C10", "\u1C10"], /* LEPCHA LETTER PHA */ + ["\u1C11", "\u1C11"], /* LEPCHA LETTER FA */ + ["\u1C12", "\u1C12"], /* LEPCHA LETTER FLA */ + ["\u1C13", "\u1C13"], /* LEPCHA LETTER BA */ + ["\u1C14", "\u1C14"], /* LEPCHA LETTER BLA */ + ["\u1C15", "\u1C15"], /* LEPCHA LETTER MA */ + ["\u1C16", "\u1C16"], /* LEPCHA LETTER MLA */ + ["\u1C17", "\u1C17"], /* LEPCHA LETTER TSA */ + ["\u1C18", "\u1C18"], /* LEPCHA LETTER TSHA */ + ["\u1C19", "\u1C19"], /* LEPCHA LETTER DZA */ + ["\u1C1A", "\u1C1A"], /* LEPCHA LETTER YA */ + ["\u1C1B", "\u1C1B"], /* LEPCHA LETTER RA */ + ["\u1C1C", "\u1C1C"], /* LEPCHA LETTER LA */ + ["\u1C1D", "\u1C1D"], /* LEPCHA LETTER HA */ + ["\u1C1E", "\u1C1E"], /* LEPCHA LETTER HLA */ + ["\u1C1F", "\u1C1F"], /* LEPCHA LETTER VA */ + ["\u1C20", "\u1C20"], /* LEPCHA LETTER SA */ + ["\u1C21", "\u1C21"], /* LEPCHA LETTER SHA */ + ["\u1C22", "\u1C22"], /* LEPCHA LETTER WA */ + ["\u1C23", "\u1C23"], /* LEPCHA LETTER A */ + ["\u1C24", "\u1C24"], /* LEPCHA SUBJOINED LETTER YA */ + ["\u1C25", "\u1C25"], /* LEPCHA SUBJOINED LETTER RA */ + ["\u1C26", "\u1C26"], /* LEPCHA VOWEL SIGN AA */ + ["\u1C27", "\u1C27"], /* LEPCHA VOWEL SIGN I */ + ["\u1C28", "\u1C28"], /* LEPCHA VOWEL SIGN O */ + ["\u1C29", "\u1C29"], /* LEPCHA VOWEL SIGN OO */ + ["\u1C2A", "\u1C2A"], /* LEPCHA VOWEL SIGN U */ + ["\u1C2B", "\u1C2B"], /* LEPCHA VOWEL SIGN UU */ + ["\u1C2C", "\u1C2C"], /* LEPCHA VOWEL SIGN E */ + ["\u1C2D", "\u1C2D"], /* LEPCHA CONSONANT SIGN K */ + ["\u1C2E", "\u1C2E"], /* LEPCHA CONSONANT SIGN M */ + ["\u1C2F", "\u1C2F"], /* LEPCHA CONSONANT SIGN L */ + ["\u1C30", "\u1C30"], /* LEPCHA CONSONANT SIGN N */ + ["\u1C31", "\u1C31"], /* LEPCHA CONSONANT SIGN P */ + ["\u1C32", "\u1C32"], /* LEPCHA CONSONANT SIGN R */ + ["\u1C33", "\u1C33"], /* LEPCHA CONSONANT SIGN T */ + ["\u1C34", "\u1C34"], /* LEPCHA CONSONANT SIGN NYIN-DO */ + ["\u1C35", "\u1C35"], /* LEPCHA CONSONANT SIGN KANG */ + ["\u1C36", "\u1C36"], /* LEPCHA SIGN RAN */ + ["\u1C37", "\u1C37"], /* LEPCHA SIGN NUKTA */ + ["\u1C38", "\u1C38"], + ["\u1C39", "\u1C39"], + ["\u1C3A", "\u1C3A"], + ["\u1C3B", "\u1C3B"], /* LEPCHA PUNCTUATION TA-ROL */ + ["\u1C3C", "\u1C3C"], /* LEPCHA PUNCTUATION NYET THYOOM TA-ROL */ + ["\u1C3D", "\u1C3D"], /* LEPCHA PUNCTUATION CER-WA */ + ["\u1C3E", "\u1C3E"], /* LEPCHA PUNCTUATION TSHOOK CER-WA */ + ["\u1C3F", "\u1C3F"], /* LEPCHA PUNCTUATION TSHOOK */ + ["\u1C40", "\u1C40"], /* LEPCHA DIGIT ZERO */ + ["\u1C41", "\u1C41"], /* LEPCHA DIGIT ONE */ + ["\u1C42", "\u1C42"], /* LEPCHA DIGIT TWO */ + ["\u1C43", "\u1C43"], /* LEPCHA DIGIT THREE */ + ["\u1C44", "\u1C44"], /* LEPCHA DIGIT FOUR */ + ["\u1C45", "\u1C45"], /* LEPCHA DIGIT FIVE */ + ["\u1C46", "\u1C46"], /* LEPCHA DIGIT SIX */ + ["\u1C47", "\u1C47"], /* LEPCHA DIGIT SEVEN */ + ["\u1C48", "\u1C48"], /* LEPCHA DIGIT EIGHT */ + ["\u1C49", "\u1C49"], /* LEPCHA DIGIT NINE */ + ["\u1C4A", "\u1C4A"], + ["\u1C4B", "\u1C4B"], + ["\u1C4C", "\u1C4C"], + ["\u1C4D", "\u1C4D"], /* LEPCHA LETTER TTA */ + ["\u1C4E", "\u1C4E"], /* LEPCHA LETTER TTHA */ + ["\u1C4F", "\u1C4F"], /* LEPCHA LETTER DDA */ + ["\u1C50", "\u1C50"], /* OL CHIKI DIGIT ZERO */ + ["\u1C51", "\u1C51"], /* OL CHIKI DIGIT ONE */ + ["\u1C52", "\u1C52"], /* OL CHIKI DIGIT TWO */ + ["\u1C53", "\u1C53"], /* OL CHIKI DIGIT THREE */ + ["\u1C54", "\u1C54"], /* OL CHIKI DIGIT FOUR */ + ["\u1C55", "\u1C55"], /* OL CHIKI DIGIT FIVE */ + ["\u1C56", "\u1C56"], /* OL CHIKI DIGIT SIX */ + ["\u1C57", "\u1C57"], /* OL CHIKI DIGIT SEVEN */ + ["\u1C58", "\u1C58"], /* OL CHIKI DIGIT EIGHT */ + ["\u1C59", "\u1C59"], /* OL CHIKI DIGIT NINE */ + ["\u1C5A", "\u1C5A"], /* OL CHIKI LETTER LA */ + ["\u1C5B", "\u1C5B"], /* OL CHIKI LETTER AT */ + ["\u1C5C", "\u1C5C"], /* OL CHIKI LETTER AG */ + ["\u1C5D", "\u1C5D"], /* OL CHIKI LETTER ANG */ + ["\u1C5E", "\u1C5E"], /* OL CHIKI LETTER AL */ + ["\u1C5F", "\u1C5F"], /* OL CHIKI LETTER LAA */ + ["\u1C60", "\u1C60"], /* OL CHIKI LETTER AAK */ + ["\u1C61", "\u1C61"], /* OL CHIKI LETTER AAJ */ + ["\u1C62", "\u1C62"], /* OL CHIKI LETTER AAM */ + ["\u1C63", "\u1C63"], /* OL CHIKI LETTER AAW */ + ["\u1C64", "\u1C64"], /* OL CHIKI LETTER LI */ + ["\u1C65", "\u1C65"], /* OL CHIKI LETTER IS */ + ["\u1C66", "\u1C66"], /* OL CHIKI LETTER IH */ + ["\u1C67", "\u1C67"], /* OL CHIKI LETTER INY */ + ["\u1C68", "\u1C68"], /* OL CHIKI LETTER IR */ + ["\u1C69", "\u1C69"], /* OL CHIKI LETTER LU */ + ["\u1C6A", "\u1C6A"], /* OL CHIKI LETTER UC */ + ["\u1C6B", "\u1C6B"], /* OL CHIKI LETTER UD */ + ["\u1C6C", "\u1C6C"], /* OL CHIKI LETTER UNN */ + ["\u1C6D", "\u1C6D"], /* OL CHIKI LETTER UY */ + ["\u1C6E", "\u1C6E"], /* OL CHIKI LETTER LE */ + ["\u1C6F", "\u1C6F"], /* OL CHIKI LETTER EP */ + ["\u1C70", "\u1C70"], /* OL CHIKI LETTER EDD */ + ["\u1C71", "\u1C71"], /* OL CHIKI LETTER EN */ + ["\u1C72", "\u1C72"], /* OL CHIKI LETTER ERR */ + ["\u1C73", "\u1C73"], /* OL CHIKI LETTER LO */ + ["\u1C74", "\u1C74"], /* OL CHIKI LETTER OTT */ + ["\u1C75", "\u1C75"], /* OL CHIKI LETTER OB */ + ["\u1C76", "\u1C76"], /* OL CHIKI LETTER OV */ + ["\u1C77", "\u1C77"], /* OL CHIKI LETTER OH */ + ["\u1C78", "\u1C78"], /* OL CHIKI MU TTUDDAG */ + ["\u1C79", "\u1C79"], /* OL CHIKI GAAHLAA TTUDDAAG */ + ["\u1C7A", "\u1C7A"], /* OL CHIKI MU-GAAHLAA TTUDDAAG */ + ["\u1C7B", "\u1C7B"], /* OL CHIKI RELAA */ + ["\u1C7C", "\u1C7C"], /* OL CHIKI PHAARKAA */ + ["\u1C7D", "\u1C7D"], /* OL CHIKI AHAD */ + ["\u1C7E", "\u1C7E"], /* OL CHIKI PUNCTUATION MUCAAD */ + ["\u1C7F", "\u1C7F"], /* OL CHIKI PUNCTUATION DOUBLE MUCAAD */ + ["\u0412", "\u1C80"], /* CYRILLIC SMALL LETTER ROUNDED VE */ + ["\u0414", "\u1C81"], /* CYRILLIC SMALL LETTER LONG-LEGGED DE */ + ["\u041E", "\u1C82"], /* CYRILLIC SMALL LETTER NARROW O */ + ["\u0421", "\u1C83"], /* CYRILLIC SMALL LETTER WIDE ES */ + ["\u0422", "\u1C84"], /* CYRILLIC SMALL LETTER TALL TE */ + ["\u0422", "\u1C85"], /* CYRILLIC SMALL LETTER THREE-LEGGED TE */ + ["\u042A", "\u1C86"], /* CYRILLIC SMALL LETTER TALL HARD SIGN */ + ["\u0462", "\u1C87"], /* CYRILLIC SMALL LETTER TALL YAT */ + ["\uA64A", "\u1C88"], /* CYRILLIC SMALL LETTER UNBLENDED UK */ + ["\u1C89", "\u1C89"], + ["\u1C8A", "\u1C8A"], + ["\u1C8B", "\u1C8B"], + ["\u1C8C", "\u1C8C"], + ["\u1C8D", "\u1C8D"], + ["\u1C8E", "\u1C8E"], + ["\u1C8F", "\u1C8F"], + ["\u1C90", "\u10D0"], /* GEORGIAN MTAVRULI CAPITAL LETTER AN */ + ["\u1C91", "\u10D1"], /* GEORGIAN MTAVRULI CAPITAL LETTER BAN */ + ["\u1C92", "\u10D2"], /* GEORGIAN MTAVRULI CAPITAL LETTER GAN */ + ["\u1C93", "\u10D3"], /* GEORGIAN MTAVRULI CAPITAL LETTER DON */ + ["\u1C94", "\u10D4"], /* GEORGIAN MTAVRULI CAPITAL LETTER EN */ + ["\u1C95", "\u10D5"], /* GEORGIAN MTAVRULI CAPITAL LETTER VIN */ + ["\u1C96", "\u10D6"], /* GEORGIAN MTAVRULI CAPITAL LETTER ZEN */ + ["\u1C97", "\u10D7"], /* GEORGIAN MTAVRULI CAPITAL LETTER TAN */ + ["\u1C98", "\u10D8"], /* GEORGIAN MTAVRULI CAPITAL LETTER IN */ + ["\u1C99", "\u10D9"], /* GEORGIAN MTAVRULI CAPITAL LETTER KAN */ + ["\u1C9A", "\u10DA"], /* GEORGIAN MTAVRULI CAPITAL LETTER LAS */ + ["\u1C9B", "\u10DB"], /* GEORGIAN MTAVRULI CAPITAL LETTER MAN */ + ["\u1C9C", "\u10DC"], /* GEORGIAN MTAVRULI CAPITAL LETTER NAR */ + ["\u1C9D", "\u10DD"], /* GEORGIAN MTAVRULI CAPITAL LETTER ON */ + ["\u1C9E", "\u10DE"], /* GEORGIAN MTAVRULI CAPITAL LETTER PAR */ + ["\u1C9F", "\u10DF"], /* GEORGIAN MTAVRULI CAPITAL LETTER ZHAR */ + ["\u1CA0", "\u10E0"], /* GEORGIAN MTAVRULI CAPITAL LETTER RAE */ + ["\u1CA1", "\u10E1"], /* GEORGIAN MTAVRULI CAPITAL LETTER SAN */ + ["\u1CA2", "\u10E2"], /* GEORGIAN MTAVRULI CAPITAL LETTER TAR */ + ["\u1CA3", "\u10E3"], /* GEORGIAN MTAVRULI CAPITAL LETTER UN */ + ["\u1CA4", "\u10E4"], /* GEORGIAN MTAVRULI CAPITAL LETTER PHAR */ + ["\u1CA5", "\u10E5"], /* GEORGIAN MTAVRULI CAPITAL LETTER KHAR */ + ["\u1CA6", "\u10E6"], /* GEORGIAN MTAVRULI CAPITAL LETTER GHAN */ + ["\u1CA7", "\u10E7"], /* GEORGIAN MTAVRULI CAPITAL LETTER QAR */ + ["\u1CA8", "\u10E8"], /* GEORGIAN MTAVRULI CAPITAL LETTER SHIN */ + ["\u1CA9", "\u10E9"], /* GEORGIAN MTAVRULI CAPITAL LETTER CHIN */ + ["\u1CAA", "\u10EA"], /* GEORGIAN MTAVRULI CAPITAL LETTER CAN */ + ["\u1CAB", "\u10EB"], /* GEORGIAN MTAVRULI CAPITAL LETTER JIL */ + ["\u1CAC", "\u10EC"], /* GEORGIAN MTAVRULI CAPITAL LETTER CIL */ + ["\u1CAD", "\u10ED"], /* GEORGIAN MTAVRULI CAPITAL LETTER CHAR */ + ["\u1CAE", "\u10EE"], /* GEORGIAN MTAVRULI CAPITAL LETTER XAN */ + ["\u1CAF", "\u10EF"], /* GEORGIAN MTAVRULI CAPITAL LETTER JHAN */ + ["\u1CB0", "\u10F0"], /* GEORGIAN MTAVRULI CAPITAL LETTER HAE */ + ["\u1CB1", "\u10F1"], /* GEORGIAN MTAVRULI CAPITAL LETTER HE */ + ["\u1CB2", "\u10F2"], /* GEORGIAN MTAVRULI CAPITAL LETTER HIE */ + ["\u1CB3", "\u10F3"], /* GEORGIAN MTAVRULI CAPITAL LETTER WE */ + ["\u1CB4", "\u10F4"], /* GEORGIAN MTAVRULI CAPITAL LETTER HAR */ + ["\u1CB5", "\u10F5"], /* GEORGIAN MTAVRULI CAPITAL LETTER HOE */ + ["\u1CB6", "\u10F6"], /* GEORGIAN MTAVRULI CAPITAL LETTER FI */ + ["\u1CB7", "\u10F7"], /* GEORGIAN MTAVRULI CAPITAL LETTER YN */ + ["\u1CB8", "\u10F8"], /* GEORGIAN MTAVRULI CAPITAL LETTER ELIFI */ + ["\u1CB9", "\u10F9"], /* GEORGIAN MTAVRULI CAPITAL LETTER TURNED GAN */ + ["\u1CBA", "\u10FA"], /* GEORGIAN MTAVRULI CAPITAL LETTER AIN */ + ["\u1CBB", "\u1CBB"], + ["\u1CBC", "\u1CBC"], + ["\u1CBD", "\u10FD"], /* GEORGIAN MTAVRULI CAPITAL LETTER AEN */ + ["\u1CBE", "\u10FE"], /* GEORGIAN MTAVRULI CAPITAL LETTER HARD SIGN */ + ["\u1CBF", "\u10FF"], /* GEORGIAN MTAVRULI CAPITAL LETTER LABIAL SIGN */ + ["\u1CC0", "\u1CC0"], /* SUNDANESE PUNCTUATION BINDU SURYA */ + ["\u1CC1", "\u1CC1"], /* SUNDANESE PUNCTUATION BINDU PANGLONG */ + ["\u1CC2", "\u1CC2"], /* SUNDANESE PUNCTUATION BINDU PURNAMA */ + ["\u1CC3", "\u1CC3"], /* SUNDANESE PUNCTUATION BINDU CAKRA */ + ["\u1CC4", "\u1CC4"], /* SUNDANESE PUNCTUATION BINDU LEU SATANGA */ + ["\u1CC5", "\u1CC5"], /* SUNDANESE PUNCTUATION BINDU KA SATANGA */ + ["\u1CC6", "\u1CC6"], /* SUNDANESE PUNCTUATION BINDU DA SATANGA */ + ["\u1CC7", "\u1CC7"], /* SUNDANESE PUNCTUATION BINDU BA SATANGA */ + ["\u1CC8", "\u1CC8"], + ["\u1CC9", "\u1CC9"], + ["\u1CCA", "\u1CCA"], + ["\u1CCB", "\u1CCB"], + ["\u1CCC", "\u1CCC"], + ["\u1CCD", "\u1CCD"], + ["\u1CCE", "\u1CCE"], + ["\u1CCF", "\u1CCF"], + ["\u1CD0", "\u1CD0"], /* VEDIC TONE KARSHANA */ + ["\u1CD1", "\u1CD1"], /* VEDIC TONE SHARA */ + ["\u1CD2", "\u1CD2"], /* VEDIC TONE PRENKHA */ + ["\u1CD3", "\u1CD3"], /* VEDIC SIGN NIHSHVASA */ + ["\u1CD4", "\u1CD4"], /* VEDIC SIGN YAJURVEDIC MIDLINE SVARITA */ + ["\u1CD5", "\u1CD5"], /* VEDIC TONE YAJURVEDIC AGGRAVATED INDEPENDENT SVARITA */ + ["\u1CD6", "\u1CD6"], /* VEDIC TONE YAJURVEDIC INDEPENDENT SVARITA */ + ["\u1CD7", "\u1CD7"], /* VEDIC TONE YAJURVEDIC KATHAKA INDEPENDENT SVARITA */ + ["\u1CD8", "\u1CD8"], /* VEDIC TONE CANDRA BELOW */ + ["\u1CD9", "\u1CD9"], /* VEDIC TONE YAJURVEDIC KATHAKA INDEPENDENT SVARITA SCHROEDER */ + ["\u1CDA", "\u1CDA"], /* VEDIC TONE DOUBLE SVARITA */ + ["\u1CDB", "\u1CDB"], /* VEDIC TONE TRIPLE SVARITA */ + ["\u1CDC", "\u1CDC"], /* VEDIC TONE KATHAKA ANUDATTA */ + ["\u1CDD", "\u1CDD"], /* VEDIC TONE DOT BELOW */ + ["\u1CDE", "\u1CDE"], /* VEDIC TONE TWO DOTS BELOW */ + ["\u1CDF", "\u1CDF"], /* VEDIC TONE THREE DOTS BELOW */ + ["\u1CE0", "\u1CE0"], /* VEDIC TONE RIGVEDIC KASHMIRI INDEPENDENT SVARITA */ + ["\u1CE1", "\u1CE1"], /* VEDIC TONE ATHARVAVEDIC INDEPENDENT SVARITA */ + ["\u1CE2", "\u1CE2"], /* VEDIC SIGN VISARGA SVARITA */ + ["\u1CE3", "\u1CE3"], /* VEDIC SIGN VISARGA UDATTA */ + ["\u1CE4", "\u1CE4"], /* VEDIC SIGN REVERSED VISARGA UDATTA */ + ["\u1CE5", "\u1CE5"], /* VEDIC SIGN VISARGA ANUDATTA */ + ["\u1CE6", "\u1CE6"], /* VEDIC SIGN REVERSED VISARGA ANUDATTA */ + ["\u1CE7", "\u1CE7"], /* VEDIC SIGN VISARGA UDATTA WITH TAIL */ + ["\u1CE8", "\u1CE8"], /* VEDIC SIGN VISARGA ANUDATTA WITH TAIL */ + ["\u1CE9", "\u1CE9"], /* VEDIC SIGN ANUSVARA ANTARGOMUKHA */ + ["\u1CEA", "\u1CEA"], /* VEDIC SIGN ANUSVARA BAHIRGOMUKHA */ + ["\u1CEB", "\u1CEB"], /* VEDIC SIGN ANUSVARA VAMAGOMUKHA */ + ["\u1CEC", "\u1CEC"], /* VEDIC SIGN ANUSVARA VAMAGOMUKHA WITH TAIL */ + ["\u1CED", "\u1CED"], /* VEDIC SIGN TIRYAK */ + ["\u1CEE", "\u1CEE"], /* VEDIC SIGN HEXIFORM LONG ANUSVARA */ + ["\u1CEF", "\u1CEF"], /* VEDIC SIGN LONG ANUSVARA */ + ["\u1CF0", "\u1CF0"], /* VEDIC SIGN RTHANG LONG ANUSVARA */ + ["\u1CF1", "\u1CF1"], /* VEDIC SIGN ANUSVARA UBHAYATO MUKHA */ + ["\u1CF2", "\u1CF2"], /* VEDIC SIGN ARDHAVISARGA */ + ["\u1CF3", "\u1CF3"], /* VEDIC SIGN ROTATED ARDHAVISARGA */ + ["\u1CF4", "\u1CF4"], /* VEDIC TONE CANDRA ABOVE */ + ["\u1CF5", "\u1CF5"], /* VEDIC SIGN JIHVAMULIYA */ + ["\u1CF6", "\u1CF6"], /* VEDIC SIGN UPADHMANIYA */ + ["\u1CF7", "\u1CF7"], /* VEDIC SIGN ATIKRAMA */ + ["\u1CF8", "\u1CF8"], /* VEDIC TONE RING ABOVE */ + ["\u1CF9", "\u1CF9"], /* VEDIC TONE DOUBLE RING ABOVE */ + ["\u1CFA", "\u1CFA"], /* VEDIC SIGN DOUBLE ANUSVARA ANTARGOMUKHA */ + ["\u1CFB", "\u1CFB"], + ["\u1CFC", "\u1CFC"], + ["\u1CFD", "\u1CFD"], + ["\u1CFE", "\u1CFE"], + ["\u1CFF", "\u1CFF"], + ["\u1D00", "\u1D00"], /* LATIN LETTER SMALL CAPITAL A */ + ["\u1D01", "\u1D01"], /* LATIN LETTER SMALL CAPITAL AE */ + ["\u1D02", "\u1D02"], /* LATIN SMALL LETTER TURNED AE */ + ["\u1D03", "\u1D03"], /* LATIN LETTER SMALL CAPITAL BARRED B */ + ["\u1D04", "\u1D04"], /* LATIN LETTER SMALL CAPITAL C */ + ["\u1D05", "\u1D05"], /* LATIN LETTER SMALL CAPITAL D */ + ["\u1D06", "\u1D06"], /* LATIN LETTER SMALL CAPITAL ETH */ + ["\u1D07", "\u1D07"], /* LATIN LETTER SMALL CAPITAL E */ + ["\u1D08", "\u1D08"], /* LATIN SMALL LETTER TURNED OPEN E */ + ["\u1D09", "\u1D09"], /* LATIN SMALL LETTER TURNED I */ + ["\u1D0A", "\u1D0A"], /* LATIN LETTER SMALL CAPITAL J */ + ["\u1D0B", "\u1D0B"], /* LATIN LETTER SMALL CAPITAL K */ + ["\u1D0C", "\u1D0C"], /* LATIN LETTER SMALL CAPITAL L WITH STROKE */ + ["\u1D0D", "\u1D0D"], /* LATIN LETTER SMALL CAPITAL M */ + ["\u1D0E", "\u1D0E"], /* LATIN LETTER SMALL CAPITAL REVERSED N */ + ["\u1D0F", "\u1D0F"], /* LATIN LETTER SMALL CAPITAL O */ + ["\u1D10", "\u1D10"], /* LATIN LETTER SMALL CAPITAL OPEN O */ + ["\u1D11", "\u1D11"], /* LATIN SMALL LETTER SIDEWAYS O */ + ["\u1D12", "\u1D12"], /* LATIN SMALL LETTER SIDEWAYS OPEN O */ + ["\u1D13", "\u1D13"], /* LATIN SMALL LETTER SIDEWAYS O WITH STROKE */ + ["\u1D14", "\u1D14"], /* LATIN SMALL LETTER TURNED OE */ + ["\u1D15", "\u1D15"], /* LATIN LETTER SMALL CAPITAL OU */ + ["\u1D16", "\u1D16"], /* LATIN SMALL LETTER TOP HALF O */ + ["\u1D17", "\u1D17"], /* LATIN SMALL LETTER BOTTOM HALF O */ + ["\u1D18", "\u1D18"], /* LATIN LETTER SMALL CAPITAL P */ + ["\u1D19", "\u1D19"], /* LATIN LETTER SMALL CAPITAL REVERSED R */ + ["\u1D1A", "\u1D1A"], /* LATIN LETTER SMALL CAPITAL TURNED R */ + ["\u1D1B", "\u1D1B"], /* LATIN LETTER SMALL CAPITAL T */ + ["\u1D1C", "\u1D1C"], /* LATIN LETTER SMALL CAPITAL U */ + ["\u1D1D", "\u1D1D"], /* LATIN SMALL LETTER SIDEWAYS U */ + ["\u1D1E", "\u1D1E"], /* LATIN SMALL LETTER SIDEWAYS DIAERESIZED U */ + ["\u1D1F", "\u1D1F"], /* LATIN SMALL LETTER SIDEWAYS TURNED M */ + ["\u1D20", "\u1D20"], /* LATIN LETTER SMALL CAPITAL V */ + ["\u1D21", "\u1D21"], /* LATIN LETTER SMALL CAPITAL W */ + ["\u1D22", "\u1D22"], /* LATIN LETTER SMALL CAPITAL Z */ + ["\u1D23", "\u1D23"], /* LATIN LETTER SMALL CAPITAL EZH */ + ["\u1D24", "\u1D24"], /* LATIN LETTER VOICED LARYNGEAL SPIRANT */ + ["\u1D25", "\u1D25"], /* LATIN LETTER AIN */ + ["\u1D26", "\u1D26"], /* GREEK LETTER SMALL CAPITAL GAMMA */ + ["\u1D27", "\u1D27"], /* GREEK LETTER SMALL CAPITAL LAMDA */ + ["\u1D28", "\u1D28"], /* GREEK LETTER SMALL CAPITAL PI */ + ["\u1D29", "\u1D29"], /* GREEK LETTER SMALL CAPITAL RHO */ + ["\u1D2A", "\u1D2A"], /* GREEK LETTER SMALL CAPITAL PSI */ + ["\u1D2B", "\u1D2B"], /* CYRILLIC LETTER SMALL CAPITAL EL */ + ["\u1D2C", "\u1D2C"], /* MODIFIER LETTER CAPITAL A */ + ["\u1D2D", "\u1D2D"], /* MODIFIER LETTER CAPITAL AE */ + ["\u1D2E", "\u1D2E"], /* MODIFIER LETTER CAPITAL B */ + ["\u1D2F", "\u1D2F"], /* MODIFIER LETTER CAPITAL BARRED B */ + ["\u1D30", "\u1D30"], /* MODIFIER LETTER CAPITAL D */ + ["\u1D31", "\u1D31"], /* MODIFIER LETTER CAPITAL E */ + ["\u1D32", "\u1D32"], /* MODIFIER LETTER CAPITAL REVERSED E */ + ["\u1D33", "\u1D33"], /* MODIFIER LETTER CAPITAL G */ + ["\u1D34", "\u1D34"], /* MODIFIER LETTER CAPITAL H */ + ["\u1D35", "\u1D35"], /* MODIFIER LETTER CAPITAL I */ + ["\u1D36", "\u1D36"], /* MODIFIER LETTER CAPITAL J */ + ["\u1D37", "\u1D37"], /* MODIFIER LETTER CAPITAL K */ + ["\u1D38", "\u1D38"], /* MODIFIER LETTER CAPITAL L */ + ["\u1D39", "\u1D39"], /* MODIFIER LETTER CAPITAL M */ + ["\u1D3A", "\u1D3A"], /* MODIFIER LETTER CAPITAL N */ + ["\u1D3B", "\u1D3B"], /* MODIFIER LETTER CAPITAL REVERSED N */ + ["\u1D3C", "\u1D3C"], /* MODIFIER LETTER CAPITAL O */ + ["\u1D3D", "\u1D3D"], /* MODIFIER LETTER CAPITAL OU */ + ["\u1D3E", "\u1D3E"], /* MODIFIER LETTER CAPITAL P */ + ["\u1D3F", "\u1D3F"], /* MODIFIER LETTER CAPITAL R */ + ["\u1D40", "\u1D40"], /* MODIFIER LETTER CAPITAL T */ + ["\u1D41", "\u1D41"], /* MODIFIER LETTER CAPITAL U */ + ["\u1D42", "\u1D42"], /* MODIFIER LETTER CAPITAL W */ + ["\u1D43", "\u1D43"], /* MODIFIER LETTER SMALL A */ + ["\u1D44", "\u1D44"], /* MODIFIER LETTER SMALL TURNED A */ + ["\u1D45", "\u1D45"], /* MODIFIER LETTER SMALL ALPHA */ + ["\u1D46", "\u1D46"], /* MODIFIER LETTER SMALL TURNED AE */ + ["\u1D47", "\u1D47"], /* MODIFIER LETTER SMALL B */ + ["\u1D48", "\u1D48"], /* MODIFIER LETTER SMALL D */ + ["\u1D49", "\u1D49"], /* MODIFIER LETTER SMALL E */ + ["\u1D4A", "\u1D4A"], /* MODIFIER LETTER SMALL SCHWA */ + ["\u1D4B", "\u1D4B"], /* MODIFIER LETTER SMALL OPEN E */ + ["\u1D4C", "\u1D4C"], /* MODIFIER LETTER SMALL TURNED OPEN E */ + ["\u1D4D", "\u1D4D"], /* MODIFIER LETTER SMALL G */ + ["\u1D4E", "\u1D4E"], /* MODIFIER LETTER SMALL TURNED I */ + ["\u1D4F", "\u1D4F"], /* MODIFIER LETTER SMALL K */ + ["\u1D50", "\u1D50"], /* MODIFIER LETTER SMALL M */ + ["\u1D51", "\u1D51"], /* MODIFIER LETTER SMALL ENG */ + ["\u1D52", "\u1D52"], /* MODIFIER LETTER SMALL O */ + ["\u1D53", "\u1D53"], /* MODIFIER LETTER SMALL OPEN O */ + ["\u1D54", "\u1D54"], /* MODIFIER LETTER SMALL TOP HALF O */ + ["\u1D55", "\u1D55"], /* MODIFIER LETTER SMALL BOTTOM HALF O */ + ["\u1D56", "\u1D56"], /* MODIFIER LETTER SMALL P */ + ["\u1D57", "\u1D57"], /* MODIFIER LETTER SMALL T */ + ["\u1D58", "\u1D58"], /* MODIFIER LETTER SMALL U */ + ["\u1D59", "\u1D59"], /* MODIFIER LETTER SMALL SIDEWAYS U */ + ["\u1D5A", "\u1D5A"], /* MODIFIER LETTER SMALL TURNED M */ + ["\u1D5B", "\u1D5B"], /* MODIFIER LETTER SMALL V */ + ["\u1D5C", "\u1D5C"], /* MODIFIER LETTER SMALL AIN */ + ["\u1D5D", "\u1D5D"], /* MODIFIER LETTER SMALL BETA */ + ["\u1D5E", "\u1D5E"], /* MODIFIER LETTER SMALL GREEK GAMMA */ + ["\u1D5F", "\u1D5F"], /* MODIFIER LETTER SMALL DELTA */ + ["\u1D60", "\u1D60"], /* MODIFIER LETTER SMALL GREEK PHI */ + ["\u1D61", "\u1D61"], /* MODIFIER LETTER SMALL CHI */ + ["\u1D62", "\u1D62"], /* LATIN SUBSCRIPT SMALL LETTER I */ + ["\u1D63", "\u1D63"], /* LATIN SUBSCRIPT SMALL LETTER R */ + ["\u1D64", "\u1D64"], /* LATIN SUBSCRIPT SMALL LETTER U */ + ["\u1D65", "\u1D65"], /* LATIN SUBSCRIPT SMALL LETTER V */ + ["\u1D66", "\u1D66"], /* GREEK SUBSCRIPT SMALL LETTER BETA */ + ["\u1D67", "\u1D67"], /* GREEK SUBSCRIPT SMALL LETTER GAMMA */ + ["\u1D68", "\u1D68"], /* GREEK SUBSCRIPT SMALL LETTER RHO */ + ["\u1D69", "\u1D69"], /* GREEK SUBSCRIPT SMALL LETTER PHI */ + ["\u1D6A", "\u1D6A"], /* GREEK SUBSCRIPT SMALL LETTER CHI */ + ["\u1D6B", "\u1D6B"], /* LATIN SMALL LETTER UE */ + ["\u1D6C", "\u1D6C"], /* LATIN SMALL LETTER B WITH MIDDLE TILDE */ + ["\u1D6D", "\u1D6D"], /* LATIN SMALL LETTER D WITH MIDDLE TILDE */ + ["\u1D6E", "\u1D6E"], /* LATIN SMALL LETTER F WITH MIDDLE TILDE */ + ["\u1D6F", "\u1D6F"], /* LATIN SMALL LETTER M WITH MIDDLE TILDE */ + ["\u1D70", "\u1D70"], /* LATIN SMALL LETTER N WITH MIDDLE TILDE */ + ["\u1D71", "\u1D71"], /* LATIN SMALL LETTER P WITH MIDDLE TILDE */ + ["\u1D72", "\u1D72"], /* LATIN SMALL LETTER R WITH MIDDLE TILDE */ + ["\u1D73", "\u1D73"], /* LATIN SMALL LETTER R WITH FISHHOOK AND MIDDLE TILDE */ + ["\u1D74", "\u1D74"], /* LATIN SMALL LETTER S WITH MIDDLE TILDE */ + ["\u1D75", "\u1D75"], /* LATIN SMALL LETTER T WITH MIDDLE TILDE */ + ["\u1D76", "\u1D76"], /* LATIN SMALL LETTER Z WITH MIDDLE TILDE */ + ["\u1D77", "\u1D77"], /* LATIN SMALL LETTER TURNED G */ + ["\u1D78", "\u1D78"], /* MODIFIER LETTER CYRILLIC EN */ + ["\uA77D", "\u1D79"], /* LATIN SMALL LETTER INSULAR G */ + ["\u1D7A", "\u1D7A"], /* LATIN SMALL LETTER TH WITH STRIKETHROUGH */ + ["\u1D7B", "\u1D7B"], /* LATIN SMALL CAPITAL LETTER I WITH STROKE */ + ["\u1D7C", "\u1D7C"], /* LATIN SMALL LETTER IOTA WITH STROKE */ + ["\u2C63", "\u1D7D"], /* LATIN SMALL LETTER P WITH STROKE */ + ["\u1D7E", "\u1D7E"], /* LATIN SMALL CAPITAL LETTER U WITH STROKE */ + ["\u1D7F", "\u1D7F"], /* LATIN SMALL LETTER UPSILON WITH STROKE */ + ["\u1D80", "\u1D80"], /* LATIN SMALL LETTER B WITH PALATAL HOOK */ + ["\u1D81", "\u1D81"], /* LATIN SMALL LETTER D WITH PALATAL HOOK */ + ["\u1D82", "\u1D82"], /* LATIN SMALL LETTER F WITH PALATAL HOOK */ + ["\u1D83", "\u1D83"], /* LATIN SMALL LETTER G WITH PALATAL HOOK */ + ["\u1D84", "\u1D84"], /* LATIN SMALL LETTER K WITH PALATAL HOOK */ + ["\u1D85", "\u1D85"], /* LATIN SMALL LETTER L WITH PALATAL HOOK */ + ["\u1D86", "\u1D86"], /* LATIN SMALL LETTER M WITH PALATAL HOOK */ + ["\u1D87", "\u1D87"], /* LATIN SMALL LETTER N WITH PALATAL HOOK */ + ["\u1D88", "\u1D88"], /* LATIN SMALL LETTER P WITH PALATAL HOOK */ + ["\u1D89", "\u1D89"], /* LATIN SMALL LETTER R WITH PALATAL HOOK */ + ["\u1D8A", "\u1D8A"], /* LATIN SMALL LETTER S WITH PALATAL HOOK */ + ["\u1D8B", "\u1D8B"], /* LATIN SMALL LETTER ESH WITH PALATAL HOOK */ + ["\u1D8C", "\u1D8C"], /* LATIN SMALL LETTER V WITH PALATAL HOOK */ + ["\u1D8D", "\u1D8D"], /* LATIN SMALL LETTER X WITH PALATAL HOOK */ + ["\uA7C6", "\u1D8E"], /* LATIN SMALL LETTER Z WITH PALATAL HOOK */ + ["\u1D8F", "\u1D8F"], /* LATIN SMALL LETTER A WITH RETROFLEX HOOK */ + ["\u1D90", "\u1D90"], /* LATIN SMALL LETTER ALPHA WITH RETROFLEX HOOK */ + ["\u1D91", "\u1D91"], /* LATIN SMALL LETTER D WITH HOOK AND TAIL */ + ["\u1D92", "\u1D92"], /* LATIN SMALL LETTER E WITH RETROFLEX HOOK */ + ["\u1D93", "\u1D93"], /* LATIN SMALL LETTER OPEN E WITH RETROFLEX HOOK */ + ["\u1D94", "\u1D94"], /* LATIN SMALL LETTER REVERSED OPEN E WITH RETROFLEX HOOK */ + ["\u1D95", "\u1D95"], /* LATIN SMALL LETTER SCHWA WITH RETROFLEX HOOK */ + ["\u1D96", "\u1D96"], /* LATIN SMALL LETTER I WITH RETROFLEX HOOK */ + ["\u1D97", "\u1D97"], /* LATIN SMALL LETTER OPEN O WITH RETROFLEX HOOK */ + ["\u1D98", "\u1D98"], /* LATIN SMALL LETTER ESH WITH RETROFLEX HOOK */ + ["\u1D99", "\u1D99"], /* LATIN SMALL LETTER U WITH RETROFLEX HOOK */ + ["\u1D9A", "\u1D9A"], /* LATIN SMALL LETTER EZH WITH RETROFLEX HOOK */ + ["\u1D9B", "\u1D9B"], /* MODIFIER LETTER SMALL TURNED ALPHA */ + ["\u1D9C", "\u1D9C"], /* MODIFIER LETTER SMALL C */ + ["\u1D9D", "\u1D9D"], /* MODIFIER LETTER SMALL C WITH CURL */ + ["\u1D9E", "\u1D9E"], /* MODIFIER LETTER SMALL ETH */ + ["\u1D9F", "\u1D9F"], /* MODIFIER LETTER SMALL REVERSED OPEN E */ + ["\u1DA0", "\u1DA0"], /* MODIFIER LETTER SMALL F */ + ["\u1DA1", "\u1DA1"], /* MODIFIER LETTER SMALL DOTLESS J WITH STROKE */ + ["\u1DA2", "\u1DA2"], /* MODIFIER LETTER SMALL SCRIPT G */ + ["\u1DA3", "\u1DA3"], /* MODIFIER LETTER SMALL TURNED H */ + ["\u1DA4", "\u1DA4"], /* MODIFIER LETTER SMALL I WITH STROKE */ + ["\u1DA5", "\u1DA5"], /* MODIFIER LETTER SMALL IOTA */ + ["\u1DA6", "\u1DA6"], /* MODIFIER LETTER SMALL CAPITAL I */ + ["\u1DA7", "\u1DA7"], /* MODIFIER LETTER SMALL CAPITAL I WITH STROKE */ + ["\u1DA8", "\u1DA8"], /* MODIFIER LETTER SMALL J WITH CROSSED-TAIL */ + ["\u1DA9", "\u1DA9"], /* MODIFIER LETTER SMALL L WITH RETROFLEX HOOK */ + ["\u1DAA", "\u1DAA"], /* MODIFIER LETTER SMALL L WITH PALATAL HOOK */ + ["\u1DAB", "\u1DAB"], /* MODIFIER LETTER SMALL CAPITAL L */ + ["\u1DAC", "\u1DAC"], /* MODIFIER LETTER SMALL M WITH HOOK */ + ["\u1DAD", "\u1DAD"], /* MODIFIER LETTER SMALL TURNED M WITH LONG LEG */ + ["\u1DAE", "\u1DAE"], /* MODIFIER LETTER SMALL N WITH LEFT HOOK */ + ["\u1DAF", "\u1DAF"], /* MODIFIER LETTER SMALL N WITH RETROFLEX HOOK */ + ["\u1DB0", "\u1DB0"], /* MODIFIER LETTER SMALL CAPITAL N */ + ["\u1DB1", "\u1DB1"], /* MODIFIER LETTER SMALL BARRED O */ + ["\u1DB2", "\u1DB2"], /* MODIFIER LETTER SMALL PHI */ + ["\u1DB3", "\u1DB3"], /* MODIFIER LETTER SMALL S WITH HOOK */ + ["\u1DB4", "\u1DB4"], /* MODIFIER LETTER SMALL ESH */ + ["\u1DB5", "\u1DB5"], /* MODIFIER LETTER SMALL T WITH PALATAL HOOK */ + ["\u1DB6", "\u1DB6"], /* MODIFIER LETTER SMALL U BAR */ + ["\u1DB7", "\u1DB7"], /* MODIFIER LETTER SMALL UPSILON */ + ["\u1DB8", "\u1DB8"], /* MODIFIER LETTER SMALL CAPITAL U */ + ["\u1DB9", "\u1DB9"], /* MODIFIER LETTER SMALL V WITH HOOK */ + ["\u1DBA", "\u1DBA"], /* MODIFIER LETTER SMALL TURNED V */ + ["\u1DBB", "\u1DBB"], /* MODIFIER LETTER SMALL Z */ + ["\u1DBC", "\u1DBC"], /* MODIFIER LETTER SMALL Z WITH RETROFLEX HOOK */ + ["\u1DBD", "\u1DBD"], /* MODIFIER LETTER SMALL Z WITH CURL */ + ["\u1DBE", "\u1DBE"], /* MODIFIER LETTER SMALL EZH */ + ["\u1DBF", "\u1DBF"], /* MODIFIER LETTER SMALL THETA */ + ["\u1DC0", "\u1DC0"], /* COMBINING DOTTED GRAVE ACCENT */ + ["\u1DC1", "\u1DC1"], /* COMBINING DOTTED ACUTE ACCENT */ + ["\u1DC2", "\u1DC2"], /* COMBINING SNAKE BELOW */ + ["\u1DC3", "\u1DC3"], /* COMBINING SUSPENSION MARK */ + ["\u1DC4", "\u1DC4"], /* COMBINING MACRON-ACUTE */ + ["\u1DC5", "\u1DC5"], /* COMBINING GRAVE-MACRON */ + ["\u1DC6", "\u1DC6"], /* COMBINING MACRON-GRAVE */ + ["\u1DC7", "\u1DC7"], /* COMBINING ACUTE-MACRON */ + ["\u1DC8", "\u1DC8"], /* COMBINING GRAVE-ACUTE-GRAVE */ + ["\u1DC9", "\u1DC9"], /* COMBINING ACUTE-GRAVE-ACUTE */ + ["\u1DCA", "\u1DCA"], /* COMBINING LATIN SMALL LETTER R BELOW */ + ["\u1DCB", "\u1DCB"], /* COMBINING BREVE-MACRON */ + ["\u1DCC", "\u1DCC"], /* COMBINING MACRON-BREVE */ + ["\u1DCD", "\u1DCD"], /* COMBINING DOUBLE CIRCUMFLEX ABOVE */ + ["\u1DCE", "\u1DCE"], /* COMBINING OGONEK ABOVE */ + ["\u1DCF", "\u1DCF"], /* COMBINING ZIGZAG BELOW */ + ["\u1DD0", "\u1DD0"], /* COMBINING IS BELOW */ + ["\u1DD1", "\u1DD1"], /* COMBINING UR ABOVE */ + ["\u1DD2", "\u1DD2"], /* COMBINING US ABOVE */ + ["\u1DD3", "\u1DD3"], /* COMBINING LATIN SMALL LETTER FLATTENED OPEN A ABOVE */ + ["\u1DD4", "\u1DD4"], /* COMBINING LATIN SMALL LETTER AE */ + ["\u1DD5", "\u1DD5"], /* COMBINING LATIN SMALL LETTER AO */ + ["\u1DD6", "\u1DD6"], /* COMBINING LATIN SMALL LETTER AV */ + ["\u1DD7", "\u1DD7"], /* COMBINING LATIN SMALL LETTER C CEDILLA */ + ["\u1DD8", "\u1DD8"], /* COMBINING LATIN SMALL LETTER INSULAR D */ + ["\u1DD9", "\u1DD9"], /* COMBINING LATIN SMALL LETTER ETH */ + ["\u1DDA", "\u1DDA"], /* COMBINING LATIN SMALL LETTER G */ + ["\u1DDB", "\u1DDB"], /* COMBINING LATIN LETTER SMALL CAPITAL G */ + ["\u1DDC", "\u1DDC"], /* COMBINING LATIN SMALL LETTER K */ + ["\u1DDD", "\u1DDD"], /* COMBINING LATIN SMALL LETTER L */ + ["\u1DDE", "\u1DDE"], /* COMBINING LATIN LETTER SMALL CAPITAL L */ + ["\u1DDF", "\u1DDF"], /* COMBINING LATIN LETTER SMALL CAPITAL M */ + ["\u1DE0", "\u1DE0"], /* COMBINING LATIN SMALL LETTER N */ + ["\u1DE1", "\u1DE1"], /* COMBINING LATIN LETTER SMALL CAPITAL N */ + ["\u1DE2", "\u1DE2"], /* COMBINING LATIN LETTER SMALL CAPITAL R */ + ["\u1DE3", "\u1DE3"], /* COMBINING LATIN SMALL LETTER R ROTUNDA */ + ["\u1DE4", "\u1DE4"], /* COMBINING LATIN SMALL LETTER S */ + ["\u1DE5", "\u1DE5"], /* COMBINING LATIN SMALL LETTER LONG S */ + ["\u1DE6", "\u1DE6"], /* COMBINING LATIN SMALL LETTER Z */ + ["\u1DE7", "\u1DE7"], /* COMBINING LATIN SMALL LETTER ALPHA */ + ["\u1DE8", "\u1DE8"], /* COMBINING LATIN SMALL LETTER B */ + ["\u1DE9", "\u1DE9"], /* COMBINING LATIN SMALL LETTER BETA */ + ["\u1DEA", "\u1DEA"], /* COMBINING LATIN SMALL LETTER SCHWA */ + ["\u1DEB", "\u1DEB"], /* COMBINING LATIN SMALL LETTER F */ + ["\u1DEC", "\u1DEC"], /* COMBINING LATIN SMALL LETTER L WITH DOUBLE MIDDLE TILDE */ + ["\u1DED", "\u1DED"], /* COMBINING LATIN SMALL LETTER O WITH LIGHT CENTRALIZATION STROKE */ + ["\u1DEE", "\u1DEE"], /* COMBINING LATIN SMALL LETTER P */ + ["\u1DEF", "\u1DEF"], /* COMBINING LATIN SMALL LETTER ESH */ + ["\u1DF0", "\u1DF0"], /* COMBINING LATIN SMALL LETTER U WITH LIGHT CENTRALIZATION STROKE */ + ["\u1DF1", "\u1DF1"], /* COMBINING LATIN SMALL LETTER W */ + ["\u1DF2", "\u1DF2"], /* COMBINING LATIN SMALL LETTER A WITH DIAERESIS */ + ["\u1DF3", "\u1DF3"], /* COMBINING LATIN SMALL LETTER O WITH DIAERESIS */ + ["\u1DF4", "\u1DF4"], /* COMBINING LATIN SMALL LETTER U WITH DIAERESIS */ + ["\u1DF5", "\u1DF5"], /* COMBINING UP TACK ABOVE */ + ["\u1DF6", "\u1DF6"], /* COMBINING KAVYKA ABOVE RIGHT */ + ["\u1DF7", "\u1DF7"], /* COMBINING KAVYKA ABOVE LEFT */ + ["\u1DF8", "\u1DF8"], /* COMBINING DOT ABOVE LEFT */ + ["\u1DF9", "\u1DF9"], /* COMBINING WIDE INVERTED BRIDGE BELOW */ + ["\u1DFA", "\u1DFA"], /* COMBINING DOT BELOW LEFT */ + ["\u1DFB", "\u1DFB"], /* COMBINING DELETION MARK */ + ["\u1DFC", "\u1DFC"], /* COMBINING DOUBLE INVERTED BREVE BELOW */ + ["\u1DFD", "\u1DFD"], /* COMBINING ALMOST EQUAL TO BELOW */ + ["\u1DFE", "\u1DFE"], /* COMBINING LEFT ARROWHEAD ABOVE */ + ["\u1DFF", "\u1DFF"], /* COMBINING RIGHT ARROWHEAD AND DOWN ARROWHEAD BELOW */ + ["\u1E00", "\u1E01"], /* LATIN CAPITAL LETTER A WITH RING BELOW */ + ["\u1E00", "\u1E01"], /* LATIN SMALL LETTER A WITH RING BELOW */ + ["\u1E02", "\u1E03"], /* LATIN CAPITAL LETTER B WITH DOT ABOVE */ + ["\u1E02", "\u1E03"], /* LATIN SMALL LETTER B WITH DOT ABOVE */ + ["\u1E04", "\u1E05"], /* LATIN CAPITAL LETTER B WITH DOT BELOW */ + ["\u1E04", "\u1E05"], /* LATIN SMALL LETTER B WITH DOT BELOW */ + ["\u1E06", "\u1E07"], /* LATIN CAPITAL LETTER B WITH LINE BELOW */ + ["\u1E06", "\u1E07"], /* LATIN SMALL LETTER B WITH LINE BELOW */ + ["\u1E08", "\u1E09"], /* LATIN CAPITAL LETTER C WITH CEDILLA AND ACUTE */ + ["\u1E08", "\u1E09"], /* LATIN SMALL LETTER C WITH CEDILLA AND ACUTE */ + ["\u1E0A", "\u1E0B"], /* LATIN CAPITAL LETTER D WITH DOT ABOVE */ + ["\u1E0A", "\u1E0B"], /* LATIN SMALL LETTER D WITH DOT ABOVE */ + ["\u1E0C", "\u1E0D"], /* LATIN CAPITAL LETTER D WITH DOT BELOW */ + ["\u1E0C", "\u1E0D"], /* LATIN SMALL LETTER D WITH DOT BELOW */ + ["\u1E0E", "\u1E0F"], /* LATIN CAPITAL LETTER D WITH LINE BELOW */ + ["\u1E0E", "\u1E0F"], /* LATIN SMALL LETTER D WITH LINE BELOW */ + ["\u1E10", "\u1E11"], /* LATIN CAPITAL LETTER D WITH CEDILLA */ + ["\u1E10", "\u1E11"], /* LATIN SMALL LETTER D WITH CEDILLA */ + ["\u1E12", "\u1E13"], /* LATIN CAPITAL LETTER D WITH CIRCUMFLEX BELOW */ + ["\u1E12", "\u1E13"], /* LATIN SMALL LETTER D WITH CIRCUMFLEX BELOW */ + ["\u1E14", "\u1E15"], /* LATIN CAPITAL LETTER E WITH MACRON AND GRAVE */ + ["\u1E14", "\u1E15"], /* LATIN SMALL LETTER E WITH MACRON AND GRAVE */ + ["\u1E16", "\u1E17"], /* LATIN CAPITAL LETTER E WITH MACRON AND ACUTE */ + ["\u1E16", "\u1E17"], /* LATIN SMALL LETTER E WITH MACRON AND ACUTE */ + ["\u1E18", "\u1E19"], /* LATIN CAPITAL LETTER E WITH CIRCUMFLEX BELOW */ + ["\u1E18", "\u1E19"], /* LATIN SMALL LETTER E WITH CIRCUMFLEX BELOW */ + ["\u1E1A", "\u1E1B"], /* LATIN CAPITAL LETTER E WITH TILDE BELOW */ + ["\u1E1A", "\u1E1B"], /* LATIN SMALL LETTER E WITH TILDE BELOW */ + ["\u1E1C", "\u1E1D"], /* LATIN CAPITAL LETTER E WITH CEDILLA AND BREVE */ + ["\u1E1C", "\u1E1D"], /* LATIN SMALL LETTER E WITH CEDILLA AND BREVE */ + ["\u1E1E", "\u1E1F"], /* LATIN CAPITAL LETTER F WITH DOT ABOVE */ + ["\u1E1E", "\u1E1F"], /* LATIN SMALL LETTER F WITH DOT ABOVE */ + ["\u1E20", "\u1E21"], /* LATIN CAPITAL LETTER G WITH MACRON */ + ["\u1E20", "\u1E21"], /* LATIN SMALL LETTER G WITH MACRON */ + ["\u1E22", "\u1E23"], /* LATIN CAPITAL LETTER H WITH DOT ABOVE */ + ["\u1E22", "\u1E23"], /* LATIN SMALL LETTER H WITH DOT ABOVE */ + ["\u1E24", "\u1E25"], /* LATIN CAPITAL LETTER H WITH DOT BELOW */ + ["\u1E24", "\u1E25"], /* LATIN SMALL LETTER H WITH DOT BELOW */ + ["\u1E26", "\u1E27"], /* LATIN CAPITAL LETTER H WITH DIAERESIS */ + ["\u1E26", "\u1E27"], /* LATIN SMALL LETTER H WITH DIAERESIS */ + ["\u1E28", "\u1E29"], /* LATIN CAPITAL LETTER H WITH CEDILLA */ + ["\u1E28", "\u1E29"], /* LATIN SMALL LETTER H WITH CEDILLA */ + ["\u1E2A", "\u1E2B"], /* LATIN CAPITAL LETTER H WITH BREVE BELOW */ + ["\u1E2A", "\u1E2B"], /* LATIN SMALL LETTER H WITH BREVE BELOW */ + ["\u1E2C", "\u1E2D"], /* LATIN CAPITAL LETTER I WITH TILDE BELOW */ + ["\u1E2C", "\u1E2D"], /* LATIN SMALL LETTER I WITH TILDE BELOW */ + ["\u1E2E", "\u1E2F"], /* LATIN CAPITAL LETTER I WITH DIAERESIS AND ACUTE */ + ["\u1E2E", "\u1E2F"], /* LATIN SMALL LETTER I WITH DIAERESIS AND ACUTE */ + ["\u1E30", "\u1E31"], /* LATIN CAPITAL LETTER K WITH ACUTE */ + ["\u1E30", "\u1E31"], /* LATIN SMALL LETTER K WITH ACUTE */ + ["\u1E32", "\u1E33"], /* LATIN CAPITAL LETTER K WITH DOT BELOW */ + ["\u1E32", "\u1E33"], /* LATIN SMALL LETTER K WITH DOT BELOW */ + ["\u1E34", "\u1E35"], /* LATIN CAPITAL LETTER K WITH LINE BELOW */ + ["\u1E34", "\u1E35"], /* LATIN SMALL LETTER K WITH LINE BELOW */ + ["\u1E36", "\u1E37"], /* LATIN CAPITAL LETTER L WITH DOT BELOW */ + ["\u1E36", "\u1E37"], /* LATIN SMALL LETTER L WITH DOT BELOW */ + ["\u1E38", "\u1E39"], /* LATIN CAPITAL LETTER L WITH DOT BELOW AND MACRON */ + ["\u1E38", "\u1E39"], /* LATIN SMALL LETTER L WITH DOT BELOW AND MACRON */ + ["\u1E3A", "\u1E3B"], /* LATIN CAPITAL LETTER L WITH LINE BELOW */ + ["\u1E3A", "\u1E3B"], /* LATIN SMALL LETTER L WITH LINE BELOW */ + ["\u1E3C", "\u1E3D"], /* LATIN CAPITAL LETTER L WITH CIRCUMFLEX BELOW */ + ["\u1E3C", "\u1E3D"], /* LATIN SMALL LETTER L WITH CIRCUMFLEX BELOW */ + ["\u1E3E", "\u1E3F"], /* LATIN CAPITAL LETTER M WITH ACUTE */ + ["\u1E3E", "\u1E3F"], /* LATIN SMALL LETTER M WITH ACUTE */ + ["\u1E40", "\u1E41"], /* LATIN CAPITAL LETTER M WITH DOT ABOVE */ + ["\u1E40", "\u1E41"], /* LATIN SMALL LETTER M WITH DOT ABOVE */ + ["\u1E42", "\u1E43"], /* LATIN CAPITAL LETTER M WITH DOT BELOW */ + ["\u1E42", "\u1E43"], /* LATIN SMALL LETTER M WITH DOT BELOW */ + ["\u1E44", "\u1E45"], /* LATIN CAPITAL LETTER N WITH DOT ABOVE */ + ["\u1E44", "\u1E45"], /* LATIN SMALL LETTER N WITH DOT ABOVE */ + ["\u1E46", "\u1E47"], /* LATIN CAPITAL LETTER N WITH DOT BELOW */ + ["\u1E46", "\u1E47"], /* LATIN SMALL LETTER N WITH DOT BELOW */ + ["\u1E48", "\u1E49"], /* LATIN CAPITAL LETTER N WITH LINE BELOW */ + ["\u1E48", "\u1E49"], /* LATIN SMALL LETTER N WITH LINE BELOW */ + ["\u1E4A", "\u1E4B"], /* LATIN CAPITAL LETTER N WITH CIRCUMFLEX BELOW */ + ["\u1E4A", "\u1E4B"], /* LATIN SMALL LETTER N WITH CIRCUMFLEX BELOW */ + ["\u1E4C", "\u1E4D"], /* LATIN CAPITAL LETTER O WITH TILDE AND ACUTE */ + ["\u1E4C", "\u1E4D"], /* LATIN SMALL LETTER O WITH TILDE AND ACUTE */ + ["\u1E4E", "\u1E4F"], /* LATIN CAPITAL LETTER O WITH TILDE AND DIAERESIS */ + ["\u1E4E", "\u1E4F"], /* LATIN SMALL LETTER O WITH TILDE AND DIAERESIS */ + ["\u1E50", "\u1E51"], /* LATIN CAPITAL LETTER O WITH MACRON AND GRAVE */ + ["\u1E50", "\u1E51"], /* LATIN SMALL LETTER O WITH MACRON AND GRAVE */ + ["\u1E52", "\u1E53"], /* LATIN CAPITAL LETTER O WITH MACRON AND ACUTE */ + ["\u1E52", "\u1E53"], /* LATIN SMALL LETTER O WITH MACRON AND ACUTE */ + ["\u1E54", "\u1E55"], /* LATIN CAPITAL LETTER P WITH ACUTE */ + ["\u1E54", "\u1E55"], /* LATIN SMALL LETTER P WITH ACUTE */ + ["\u1E56", "\u1E57"], /* LATIN CAPITAL LETTER P WITH DOT ABOVE */ + ["\u1E56", "\u1E57"], /* LATIN SMALL LETTER P WITH DOT ABOVE */ + ["\u1E58", "\u1E59"], /* LATIN CAPITAL LETTER R WITH DOT ABOVE */ + ["\u1E58", "\u1E59"], /* LATIN SMALL LETTER R WITH DOT ABOVE */ + ["\u1E5A", "\u1E5B"], /* LATIN CAPITAL LETTER R WITH DOT BELOW */ + ["\u1E5A", "\u1E5B"], /* LATIN SMALL LETTER R WITH DOT BELOW */ + ["\u1E5C", "\u1E5D"], /* LATIN CAPITAL LETTER R WITH DOT BELOW AND MACRON */ + ["\u1E5C", "\u1E5D"], /* LATIN SMALL LETTER R WITH DOT BELOW AND MACRON */ + ["\u1E5E", "\u1E5F"], /* LATIN CAPITAL LETTER R WITH LINE BELOW */ + ["\u1E5E", "\u1E5F"], /* LATIN SMALL LETTER R WITH LINE BELOW */ + ["\u1E60", "\u1E61"], /* LATIN CAPITAL LETTER S WITH DOT ABOVE */ + ["\u1E60", "\u1E61"], /* LATIN SMALL LETTER S WITH DOT ABOVE */ + ["\u1E62", "\u1E63"], /* LATIN CAPITAL LETTER S WITH DOT BELOW */ + ["\u1E62", "\u1E63"], /* LATIN SMALL LETTER S WITH DOT BELOW */ + ["\u1E64", "\u1E65"], /* LATIN CAPITAL LETTER S WITH ACUTE AND DOT ABOVE */ + ["\u1E64", "\u1E65"], /* LATIN SMALL LETTER S WITH ACUTE AND DOT ABOVE */ + ["\u1E66", "\u1E67"], /* LATIN CAPITAL LETTER S WITH CARON AND DOT ABOVE */ + ["\u1E66", "\u1E67"], /* LATIN SMALL LETTER S WITH CARON AND DOT ABOVE */ + ["\u1E68", "\u1E69"], /* LATIN CAPITAL LETTER S WITH DOT BELOW AND DOT ABOVE */ + ["\u1E68", "\u1E69"], /* LATIN SMALL LETTER S WITH DOT BELOW AND DOT ABOVE */ + ["\u1E6A", "\u1E6B"], /* LATIN CAPITAL LETTER T WITH DOT ABOVE */ + ["\u1E6A", "\u1E6B"], /* LATIN SMALL LETTER T WITH DOT ABOVE */ + ["\u1E6C", "\u1E6D"], /* LATIN CAPITAL LETTER T WITH DOT BELOW */ + ["\u1E6C", "\u1E6D"], /* LATIN SMALL LETTER T WITH DOT BELOW */ + ["\u1E6E", "\u1E6F"], /* LATIN CAPITAL LETTER T WITH LINE BELOW */ + ["\u1E6E", "\u1E6F"], /* LATIN SMALL LETTER T WITH LINE BELOW */ + ["\u1E70", "\u1E71"], /* LATIN CAPITAL LETTER T WITH CIRCUMFLEX BELOW */ + ["\u1E70", "\u1E71"], /* LATIN SMALL LETTER T WITH CIRCUMFLEX BELOW */ + ["\u1E72", "\u1E73"], /* LATIN CAPITAL LETTER U WITH DIAERESIS BELOW */ + ["\u1E72", "\u1E73"], /* LATIN SMALL LETTER U WITH DIAERESIS BELOW */ + ["\u1E74", "\u1E75"], /* LATIN CAPITAL LETTER U WITH TILDE BELOW */ + ["\u1E74", "\u1E75"], /* LATIN SMALL LETTER U WITH TILDE BELOW */ + ["\u1E76", "\u1E77"], /* LATIN CAPITAL LETTER U WITH CIRCUMFLEX BELOW */ + ["\u1E76", "\u1E77"], /* LATIN SMALL LETTER U WITH CIRCUMFLEX BELOW */ + ["\u1E78", "\u1E79"], /* LATIN CAPITAL LETTER U WITH TILDE AND ACUTE */ + ["\u1E78", "\u1E79"], /* LATIN SMALL LETTER U WITH TILDE AND ACUTE */ + ["\u1E7A", "\u1E7B"], /* LATIN CAPITAL LETTER U WITH MACRON AND DIAERESIS */ + ["\u1E7A", "\u1E7B"], /* LATIN SMALL LETTER U WITH MACRON AND DIAERESIS */ + ["\u1E7C", "\u1E7D"], /* LATIN CAPITAL LETTER V WITH TILDE */ + ["\u1E7C", "\u1E7D"], /* LATIN SMALL LETTER V WITH TILDE */ + ["\u1E7E", "\u1E7F"], /* LATIN CAPITAL LETTER V WITH DOT BELOW */ + ["\u1E7E", "\u1E7F"], /* LATIN SMALL LETTER V WITH DOT BELOW */ + ["\u1E80", "\u1E81"], /* LATIN CAPITAL LETTER W WITH GRAVE */ + ["\u1E80", "\u1E81"], /* LATIN SMALL LETTER W WITH GRAVE */ + ["\u1E82", "\u1E83"], /* LATIN CAPITAL LETTER W WITH ACUTE */ + ["\u1E82", "\u1E83"], /* LATIN SMALL LETTER W WITH ACUTE */ + ["\u1E84", "\u1E85"], /* LATIN CAPITAL LETTER W WITH DIAERESIS */ + ["\u1E84", "\u1E85"], /* LATIN SMALL LETTER W WITH DIAERESIS */ + ["\u1E86", "\u1E87"], /* LATIN CAPITAL LETTER W WITH DOT ABOVE */ + ["\u1E86", "\u1E87"], /* LATIN SMALL LETTER W WITH DOT ABOVE */ + ["\u1E88", "\u1E89"], /* LATIN CAPITAL LETTER W WITH DOT BELOW */ + ["\u1E88", "\u1E89"], /* LATIN SMALL LETTER W WITH DOT BELOW */ + ["\u1E8A", "\u1E8B"], /* LATIN CAPITAL LETTER X WITH DOT ABOVE */ + ["\u1E8A", "\u1E8B"], /* LATIN SMALL LETTER X WITH DOT ABOVE */ + ["\u1E8C", "\u1E8D"], /* LATIN CAPITAL LETTER X WITH DIAERESIS */ + ["\u1E8C", "\u1E8D"], /* LATIN SMALL LETTER X WITH DIAERESIS */ + ["\u1E8E", "\u1E8F"], /* LATIN CAPITAL LETTER Y WITH DOT ABOVE */ + ["\u1E8E", "\u1E8F"], /* LATIN SMALL LETTER Y WITH DOT ABOVE */ + ["\u1E90", "\u1E91"], /* LATIN CAPITAL LETTER Z WITH CIRCUMFLEX */ + ["\u1E90", "\u1E91"], /* LATIN SMALL LETTER Z WITH CIRCUMFLEX */ + ["\u1E92", "\u1E93"], /* LATIN CAPITAL LETTER Z WITH DOT BELOW */ + ["\u1E92", "\u1E93"], /* LATIN SMALL LETTER Z WITH DOT BELOW */ + ["\u1E94", "\u1E95"], /* LATIN CAPITAL LETTER Z WITH LINE BELOW */ + ["\u1E94", "\u1E95"], /* LATIN SMALL LETTER Z WITH LINE BELOW */ + ["\u0048\u0331", "\u1E96"], /* LATIN SMALL LETTER H WITH LINE BELOW */ + ["\u0054\u0308", "\u1E97"], /* LATIN SMALL LETTER T WITH DIAERESIS */ + ["\u0057\u030A", "\u1E98"], /* LATIN SMALL LETTER W WITH RING ABOVE */ + ["\u0059\u030A", "\u1E99"], /* LATIN SMALL LETTER Y WITH RING ABOVE */ + ["\u0041\u02BE", "\u1E9A"], /* LATIN SMALL LETTER A WITH RIGHT HALF RING */ + ["\u1E60", "\u1E9B"], /* LATIN SMALL LETTER LONG S WITH DOT ABOVE */ + ["\u1E9C", "\u1E9C"], /* LATIN SMALL LETTER LONG S WITH DIAGONAL STROKE */ + ["\u1E9D", "\u1E9D"], /* LATIN SMALL LETTER LONG S WITH HIGH STROKE */ + ["\u1E9E", "\u00DF"], /* LATIN CAPITAL LETTER SHARP S */ + ["\u1E9F", "\u1E9F"], /* LATIN SMALL LETTER DELTA */ + ["\u1EA0", "\u1EA1"], /* LATIN CAPITAL LETTER A WITH DOT BELOW */ + ["\u1EA0", "\u1EA1"], /* LATIN SMALL LETTER A WITH DOT BELOW */ + ["\u1EA2", "\u1EA3"], /* LATIN CAPITAL LETTER A WITH HOOK ABOVE */ + ["\u1EA2", "\u1EA3"], /* LATIN SMALL LETTER A WITH HOOK ABOVE */ + ["\u1EA4", "\u1EA5"], /* LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND ACUTE */ + ["\u1EA4", "\u1EA5"], /* LATIN SMALL LETTER A WITH CIRCUMFLEX AND ACUTE */ + ["\u1EA6", "\u1EA7"], /* LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND GRAVE */ + ["\u1EA6", "\u1EA7"], /* LATIN SMALL LETTER A WITH CIRCUMFLEX AND GRAVE */ + ["\u1EA8", "\u1EA9"], /* LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND HOOK ABOVE */ + ["\u1EA8", "\u1EA9"], /* LATIN SMALL LETTER A WITH CIRCUMFLEX AND HOOK ABOVE */ + ["\u1EAA", "\u1EAB"], /* LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND TILDE */ + ["\u1EAA", "\u1EAB"], /* LATIN SMALL LETTER A WITH CIRCUMFLEX AND TILDE */ + ["\u1EAC", "\u1EAD"], /* LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND DOT BELOW */ + ["\u1EAC", "\u1EAD"], /* LATIN SMALL LETTER A WITH CIRCUMFLEX AND DOT BELOW */ + ["\u1EAE", "\u1EAF"], /* LATIN CAPITAL LETTER A WITH BREVE AND ACUTE */ + ["\u1EAE", "\u1EAF"], /* LATIN SMALL LETTER A WITH BREVE AND ACUTE */ + ["\u1EB0", "\u1EB1"], /* LATIN CAPITAL LETTER A WITH BREVE AND GRAVE */ + ["\u1EB0", "\u1EB1"], /* LATIN SMALL LETTER A WITH BREVE AND GRAVE */ + ["\u1EB2", "\u1EB3"], /* LATIN CAPITAL LETTER A WITH BREVE AND HOOK ABOVE */ + ["\u1EB2", "\u1EB3"], /* LATIN SMALL LETTER A WITH BREVE AND HOOK ABOVE */ + ["\u1EB4", "\u1EB5"], /* LATIN CAPITAL LETTER A WITH BREVE AND TILDE */ + ["\u1EB4", "\u1EB5"], /* LATIN SMALL LETTER A WITH BREVE AND TILDE */ + ["\u1EB6", "\u1EB7"], /* LATIN CAPITAL LETTER A WITH BREVE AND DOT BELOW */ + ["\u1EB6", "\u1EB7"], /* LATIN SMALL LETTER A WITH BREVE AND DOT BELOW */ + ["\u1EB8", "\u1EB9"], /* LATIN CAPITAL LETTER E WITH DOT BELOW */ + ["\u1EB8", "\u1EB9"], /* LATIN SMALL LETTER E WITH DOT BELOW */ + ["\u1EBA", "\u1EBB"], /* LATIN CAPITAL LETTER E WITH HOOK ABOVE */ + ["\u1EBA", "\u1EBB"], /* LATIN SMALL LETTER E WITH HOOK ABOVE */ + ["\u1EBC", "\u1EBD"], /* LATIN CAPITAL LETTER E WITH TILDE */ + ["\u1EBC", "\u1EBD"], /* LATIN SMALL LETTER E WITH TILDE */ + ["\u1EBE", "\u1EBF"], /* LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND ACUTE */ + ["\u1EBE", "\u1EBF"], /* LATIN SMALL LETTER E WITH CIRCUMFLEX AND ACUTE */ + ["\u1EC0", "\u1EC1"], /* LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND GRAVE */ + ["\u1EC0", "\u1EC1"], /* LATIN SMALL LETTER E WITH CIRCUMFLEX AND GRAVE */ + ["\u1EC2", "\u1EC3"], /* LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND HOOK ABOVE */ + ["\u1EC2", "\u1EC3"], /* LATIN SMALL LETTER E WITH CIRCUMFLEX AND HOOK ABOVE */ + ["\u1EC4", "\u1EC5"], /* LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND TILDE */ + ["\u1EC4", "\u1EC5"], /* LATIN SMALL LETTER E WITH CIRCUMFLEX AND TILDE */ + ["\u1EC6", "\u1EC7"], /* LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND DOT BELOW */ + ["\u1EC6", "\u1EC7"], /* LATIN SMALL LETTER E WITH CIRCUMFLEX AND DOT BELOW */ + ["\u1EC8", "\u1EC9"], /* LATIN CAPITAL LETTER I WITH HOOK ABOVE */ + ["\u1EC8", "\u1EC9"], /* LATIN SMALL LETTER I WITH HOOK ABOVE */ + ["\u1ECA", "\u1ECB"], /* LATIN CAPITAL LETTER I WITH DOT BELOW */ + ["\u1ECA", "\u1ECB"], /* LATIN SMALL LETTER I WITH DOT BELOW */ + ["\u1ECC", "\u1ECD"], /* LATIN CAPITAL LETTER O WITH DOT BELOW */ + ["\u1ECC", "\u1ECD"], /* LATIN SMALL LETTER O WITH DOT BELOW */ + ["\u1ECE", "\u1ECF"], /* LATIN CAPITAL LETTER O WITH HOOK ABOVE */ + ["\u1ECE", "\u1ECF"], /* LATIN SMALL LETTER O WITH HOOK ABOVE */ + ["\u1ED0", "\u1ED1"], /* LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND ACUTE */ + ["\u1ED0", "\u1ED1"], /* LATIN SMALL LETTER O WITH CIRCUMFLEX AND ACUTE */ + ["\u1ED2", "\u1ED3"], /* LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND GRAVE */ + ["\u1ED2", "\u1ED3"], /* LATIN SMALL LETTER O WITH CIRCUMFLEX AND GRAVE */ + ["\u1ED4", "\u1ED5"], /* LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND HOOK ABOVE */ + ["\u1ED4", "\u1ED5"], /* LATIN SMALL LETTER O WITH CIRCUMFLEX AND HOOK ABOVE */ + ["\u1ED6", "\u1ED7"], /* LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND TILDE */ + ["\u1ED6", "\u1ED7"], /* LATIN SMALL LETTER O WITH CIRCUMFLEX AND TILDE */ + ["\u1ED8", "\u1ED9"], /* LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND DOT BELOW */ + ["\u1ED8", "\u1ED9"], /* LATIN SMALL LETTER O WITH CIRCUMFLEX AND DOT BELOW */ + ["\u1EDA", "\u1EDB"], /* LATIN CAPITAL LETTER O WITH HORN AND ACUTE */ + ["\u1EDA", "\u1EDB"], /* LATIN SMALL LETTER O WITH HORN AND ACUTE */ + ["\u1EDC", "\u1EDD"], /* LATIN CAPITAL LETTER O WITH HORN AND GRAVE */ + ["\u1EDC", "\u1EDD"], /* LATIN SMALL LETTER O WITH HORN AND GRAVE */ + ["\u1EDE", "\u1EDF"], /* LATIN CAPITAL LETTER O WITH HORN AND HOOK ABOVE */ + ["\u1EDE", "\u1EDF"], /* LATIN SMALL LETTER O WITH HORN AND HOOK ABOVE */ + ["\u1EE0", "\u1EE1"], /* LATIN CAPITAL LETTER O WITH HORN AND TILDE */ + ["\u1EE0", "\u1EE1"], /* LATIN SMALL LETTER O WITH HORN AND TILDE */ + ["\u1EE2", "\u1EE3"], /* LATIN CAPITAL LETTER O WITH HORN AND DOT BELOW */ + ["\u1EE2", "\u1EE3"], /* LATIN SMALL LETTER O WITH HORN AND DOT BELOW */ + ["\u1EE4", "\u1EE5"], /* LATIN CAPITAL LETTER U WITH DOT BELOW */ + ["\u1EE4", "\u1EE5"], /* LATIN SMALL LETTER U WITH DOT BELOW */ + ["\u1EE6", "\u1EE7"], /* LATIN CAPITAL LETTER U WITH HOOK ABOVE */ + ["\u1EE6", "\u1EE7"], /* LATIN SMALL LETTER U WITH HOOK ABOVE */ + ["\u1EE8", "\u1EE9"], /* LATIN CAPITAL LETTER U WITH HORN AND ACUTE */ + ["\u1EE8", "\u1EE9"], /* LATIN SMALL LETTER U WITH HORN AND ACUTE */ + ["\u1EEA", "\u1EEB"], /* LATIN CAPITAL LETTER U WITH HORN AND GRAVE */ + ["\u1EEA", "\u1EEB"], /* LATIN SMALL LETTER U WITH HORN AND GRAVE */ + ["\u1EEC", "\u1EED"], /* LATIN CAPITAL LETTER U WITH HORN AND HOOK ABOVE */ + ["\u1EEC", "\u1EED"], /* LATIN SMALL LETTER U WITH HORN AND HOOK ABOVE */ + ["\u1EEE", "\u1EEF"], /* LATIN CAPITAL LETTER U WITH HORN AND TILDE */ + ["\u1EEE", "\u1EEF"], /* LATIN SMALL LETTER U WITH HORN AND TILDE */ + ["\u1EF0", "\u1EF1"], /* LATIN CAPITAL LETTER U WITH HORN AND DOT BELOW */ + ["\u1EF0", "\u1EF1"], /* LATIN SMALL LETTER U WITH HORN AND DOT BELOW */ + ["\u1EF2", "\u1EF3"], /* LATIN CAPITAL LETTER Y WITH GRAVE */ + ["\u1EF2", "\u1EF3"], /* LATIN SMALL LETTER Y WITH GRAVE */ + ["\u1EF4", "\u1EF5"], /* LATIN CAPITAL LETTER Y WITH DOT BELOW */ + ["\u1EF4", "\u1EF5"], /* LATIN SMALL LETTER Y WITH DOT BELOW */ + ["\u1EF6", "\u1EF7"], /* LATIN CAPITAL LETTER Y WITH HOOK ABOVE */ + ["\u1EF6", "\u1EF7"], /* LATIN SMALL LETTER Y WITH HOOK ABOVE */ + ["\u1EF8", "\u1EF9"], /* LATIN CAPITAL LETTER Y WITH TILDE */ + ["\u1EF8", "\u1EF9"], /* LATIN SMALL LETTER Y WITH TILDE */ + ["\u1EFA", "\u1EFB"], /* LATIN CAPITAL LETTER MIDDLE-WELSH LL */ + ["\u1EFA", "\u1EFB"], /* LATIN SMALL LETTER MIDDLE-WELSH LL */ + ["\u1EFC", "\u1EFD"], /* LATIN CAPITAL LETTER MIDDLE-WELSH V */ + ["\u1EFC", "\u1EFD"], /* LATIN SMALL LETTER MIDDLE-WELSH V */ + ["\u1EFE", "\u1EFF"], /* LATIN CAPITAL LETTER Y WITH LOOP */ + ["\u1EFE", "\u1EFF"], /* LATIN SMALL LETTER Y WITH LOOP */ + ["\u1F08", "\u1F00"], /* GREEK SMALL LETTER ALPHA WITH PSILI */ + ["\u1F09", "\u1F01"], /* GREEK SMALL LETTER ALPHA WITH DASIA */ + ["\u1F0A", "\u1F02"], /* GREEK SMALL LETTER ALPHA WITH PSILI AND VARIA */ + ["\u1F0B", "\u1F03"], /* GREEK SMALL LETTER ALPHA WITH DASIA AND VARIA */ + ["\u1F0C", "\u1F04"], /* GREEK SMALL LETTER ALPHA WITH PSILI AND OXIA */ + ["\u1F0D", "\u1F05"], /* GREEK SMALL LETTER ALPHA WITH DASIA AND OXIA */ + ["\u1F0E", "\u1F06"], /* GREEK SMALL LETTER ALPHA WITH PSILI AND PERISPOMENI */ + ["\u1F0F", "\u1F07"], /* GREEK SMALL LETTER ALPHA WITH DASIA AND PERISPOMENI */ + ["\u1F08", "\u1F00"], /* GREEK CAPITAL LETTER ALPHA WITH PSILI */ + ["\u1F09", "\u1F01"], /* GREEK CAPITAL LETTER ALPHA WITH DASIA */ + ["\u1F0A", "\u1F02"], /* GREEK CAPITAL LETTER ALPHA WITH PSILI AND VARIA */ + ["\u1F0B", "\u1F03"], /* GREEK CAPITAL LETTER ALPHA WITH DASIA AND VARIA */ + ["\u1F0C", "\u1F04"], /* GREEK CAPITAL LETTER ALPHA WITH PSILI AND OXIA */ + ["\u1F0D", "\u1F05"], /* GREEK CAPITAL LETTER ALPHA WITH DASIA AND OXIA */ + ["\u1F0E", "\u1F06"], /* GREEK CAPITAL LETTER ALPHA WITH PSILI AND PERISPOMENI */ + ["\u1F0F", "\u1F07"], /* GREEK CAPITAL LETTER ALPHA WITH DASIA AND PERISPOMENI */ + ["\u1F18", "\u1F10"], /* GREEK SMALL LETTER EPSILON WITH PSILI */ + ["\u1F19", "\u1F11"], /* GREEK SMALL LETTER EPSILON WITH DASIA */ + ["\u1F1A", "\u1F12"], /* GREEK SMALL LETTER EPSILON WITH PSILI AND VARIA */ + ["\u1F1B", "\u1F13"], /* GREEK SMALL LETTER EPSILON WITH DASIA AND VARIA */ + ["\u1F1C", "\u1F14"], /* GREEK SMALL LETTER EPSILON WITH PSILI AND OXIA */ + ["\u1F1D", "\u1F15"], /* GREEK SMALL LETTER EPSILON WITH DASIA AND OXIA */ + ["\u1F16", "\u1F16"], + ["\u1F17", "\u1F17"], + ["\u1F18", "\u1F10"], /* GREEK CAPITAL LETTER EPSILON WITH PSILI */ + ["\u1F19", "\u1F11"], /* GREEK CAPITAL LETTER EPSILON WITH DASIA */ + ["\u1F1A", "\u1F12"], /* GREEK CAPITAL LETTER EPSILON WITH PSILI AND VARIA */ + ["\u1F1B", "\u1F13"], /* GREEK CAPITAL LETTER EPSILON WITH DASIA AND VARIA */ + ["\u1F1C", "\u1F14"], /* GREEK CAPITAL LETTER EPSILON WITH PSILI AND OXIA */ + ["\u1F1D", "\u1F15"], /* GREEK CAPITAL LETTER EPSILON WITH DASIA AND OXIA */ + ["\u1F1E", "\u1F1E"], + ["\u1F1F", "\u1F1F"], + ["\u1F28", "\u1F20"], /* GREEK SMALL LETTER ETA WITH PSILI */ + ["\u1F29", "\u1F21"], /* GREEK SMALL LETTER ETA WITH DASIA */ + ["\u1F2A", "\u1F22"], /* GREEK SMALL LETTER ETA WITH PSILI AND VARIA */ + ["\u1F2B", "\u1F23"], /* GREEK SMALL LETTER ETA WITH DASIA AND VARIA */ + ["\u1F2C", "\u1F24"], /* GREEK SMALL LETTER ETA WITH PSILI AND OXIA */ + ["\u1F2D", "\u1F25"], /* GREEK SMALL LETTER ETA WITH DASIA AND OXIA */ + ["\u1F2E", "\u1F26"], /* GREEK SMALL LETTER ETA WITH PSILI AND PERISPOMENI */ + ["\u1F2F", "\u1F27"], /* GREEK SMALL LETTER ETA WITH DASIA AND PERISPOMENI */ + ["\u1F28", "\u1F20"], /* GREEK CAPITAL LETTER ETA WITH PSILI */ + ["\u1F29", "\u1F21"], /* GREEK CAPITAL LETTER ETA WITH DASIA */ + ["\u1F2A", "\u1F22"], /* GREEK CAPITAL LETTER ETA WITH PSILI AND VARIA */ + ["\u1F2B", "\u1F23"], /* GREEK CAPITAL LETTER ETA WITH DASIA AND VARIA */ + ["\u1F2C", "\u1F24"], /* GREEK CAPITAL LETTER ETA WITH PSILI AND OXIA */ + ["\u1F2D", "\u1F25"], /* GREEK CAPITAL LETTER ETA WITH DASIA AND OXIA */ + ["\u1F2E", "\u1F26"], /* GREEK CAPITAL LETTER ETA WITH PSILI AND PERISPOMENI */ + ["\u1F2F", "\u1F27"], /* GREEK CAPITAL LETTER ETA WITH DASIA AND PERISPOMENI */ + ["\u1F38", "\u1F30"], /* GREEK SMALL LETTER IOTA WITH PSILI */ + ["\u1F39", "\u1F31"], /* GREEK SMALL LETTER IOTA WITH DASIA */ + ["\u1F3A", "\u1F32"], /* GREEK SMALL LETTER IOTA WITH PSILI AND VARIA */ + ["\u1F3B", "\u1F33"], /* GREEK SMALL LETTER IOTA WITH DASIA AND VARIA */ + ["\u1F3C", "\u1F34"], /* GREEK SMALL LETTER IOTA WITH PSILI AND OXIA */ + ["\u1F3D", "\u1F35"], /* GREEK SMALL LETTER IOTA WITH DASIA AND OXIA */ + ["\u1F3E", "\u1F36"], /* GREEK SMALL LETTER IOTA WITH PSILI AND PERISPOMENI */ + ["\u1F3F", "\u1F37"], /* GREEK SMALL LETTER IOTA WITH DASIA AND PERISPOMENI */ + ["\u1F38", "\u1F30"], /* GREEK CAPITAL LETTER IOTA WITH PSILI */ + ["\u1F39", "\u1F31"], /* GREEK CAPITAL LETTER IOTA WITH DASIA */ + ["\u1F3A", "\u1F32"], /* GREEK CAPITAL LETTER IOTA WITH PSILI AND VARIA */ + ["\u1F3B", "\u1F33"], /* GREEK CAPITAL LETTER IOTA WITH DASIA AND VARIA */ + ["\u1F3C", "\u1F34"], /* GREEK CAPITAL LETTER IOTA WITH PSILI AND OXIA */ + ["\u1F3D", "\u1F35"], /* GREEK CAPITAL LETTER IOTA WITH DASIA AND OXIA */ + ["\u1F3E", "\u1F36"], /* GREEK CAPITAL LETTER IOTA WITH PSILI AND PERISPOMENI */ + ["\u1F3F", "\u1F37"], /* GREEK CAPITAL LETTER IOTA WITH DASIA AND PERISPOMENI */ + ["\u1F48", "\u1F40"], /* GREEK SMALL LETTER OMICRON WITH PSILI */ + ["\u1F49", "\u1F41"], /* GREEK SMALL LETTER OMICRON WITH DASIA */ + ["\u1F4A", "\u1F42"], /* GREEK SMALL LETTER OMICRON WITH PSILI AND VARIA */ + ["\u1F4B", "\u1F43"], /* GREEK SMALL LETTER OMICRON WITH DASIA AND VARIA */ + ["\u1F4C", "\u1F44"], /* GREEK SMALL LETTER OMICRON WITH PSILI AND OXIA */ + ["\u1F4D", "\u1F45"], /* GREEK SMALL LETTER OMICRON WITH DASIA AND OXIA */ + ["\u1F46", "\u1F46"], + ["\u1F47", "\u1F47"], + ["\u1F48", "\u1F40"], /* GREEK CAPITAL LETTER OMICRON WITH PSILI */ + ["\u1F49", "\u1F41"], /* GREEK CAPITAL LETTER OMICRON WITH DASIA */ + ["\u1F4A", "\u1F42"], /* GREEK CAPITAL LETTER OMICRON WITH PSILI AND VARIA */ + ["\u1F4B", "\u1F43"], /* GREEK CAPITAL LETTER OMICRON WITH DASIA AND VARIA */ + ["\u1F4C", "\u1F44"], /* GREEK CAPITAL LETTER OMICRON WITH PSILI AND OXIA */ + ["\u1F4D", "\u1F45"], /* GREEK CAPITAL LETTER OMICRON WITH DASIA AND OXIA */ + ["\u1F4E", "\u1F4E"], + ["\u1F4F", "\u1F4F"], + ["\u03A5\u0313", "\u1F50"], /* GREEK SMALL LETTER UPSILON WITH PSILI */ + ["\u1F59", "\u1F51"], /* GREEK SMALL LETTER UPSILON WITH DASIA */ + ["\u03A5\u0313\u0300", "\u1F52"], /* GREEK SMALL LETTER UPSILON WITH PSILI AND VARIA */ + ["\u1F5B", "\u1F53"], /* GREEK SMALL LETTER UPSILON WITH DASIA AND VARIA */ + ["\u03A5\u0313\u0301", "\u1F54"], /* GREEK SMALL LETTER UPSILON WITH PSILI AND OXIA */ + ["\u1F5D", "\u1F55"], /* GREEK SMALL LETTER UPSILON WITH DASIA AND OXIA */ + ["\u03A5\u0313\u0342", "\u1F56"], /* GREEK SMALL LETTER UPSILON WITH PSILI AND PERISPOMENI */ + ["\u1F5F", "\u1F57"], /* GREEK SMALL LETTER UPSILON WITH DASIA AND PERISPOMENI */ + ["\u1F58", "\u1F58"], + ["\u1F59", "\u1F51"], /* GREEK CAPITAL LETTER UPSILON WITH DASIA */ + ["\u1F5A", "\u1F5A"], + ["\u1F5B", "\u1F53"], /* GREEK CAPITAL LETTER UPSILON WITH DASIA AND VARIA */ + ["\u1F5C", "\u1F5C"], + ["\u1F5D", "\u1F55"], /* GREEK CAPITAL LETTER UPSILON WITH DASIA AND OXIA */ + ["\u1F5E", "\u1F5E"], + ["\u1F5F", "\u1F57"], /* GREEK CAPITAL LETTER UPSILON WITH DASIA AND PERISPOMENI */ + ["\u1F68", "\u1F60"], /* GREEK SMALL LETTER OMEGA WITH PSILI */ + ["\u1F69", "\u1F61"], /* GREEK SMALL LETTER OMEGA WITH DASIA */ + ["\u1F6A", "\u1F62"], /* GREEK SMALL LETTER OMEGA WITH PSILI AND VARIA */ + ["\u1F6B", "\u1F63"], /* GREEK SMALL LETTER OMEGA WITH DASIA AND VARIA */ + ["\u1F6C", "\u1F64"], /* GREEK SMALL LETTER OMEGA WITH PSILI AND OXIA */ + ["\u1F6D", "\u1F65"], /* GREEK SMALL LETTER OMEGA WITH DASIA AND OXIA */ + ["\u1F6E", "\u1F66"], /* GREEK SMALL LETTER OMEGA WITH PSILI AND PERISPOMENI */ + ["\u1F6F", "\u1F67"], /* GREEK SMALL LETTER OMEGA WITH DASIA AND PERISPOMENI */ + ["\u1F68", "\u1F60"], /* GREEK CAPITAL LETTER OMEGA WITH PSILI */ + ["\u1F69", "\u1F61"], /* GREEK CAPITAL LETTER OMEGA WITH DASIA */ + ["\u1F6A", "\u1F62"], /* GREEK CAPITAL LETTER OMEGA WITH PSILI AND VARIA */ + ["\u1F6B", "\u1F63"], /* GREEK CAPITAL LETTER OMEGA WITH DASIA AND VARIA */ + ["\u1F6C", "\u1F64"], /* GREEK CAPITAL LETTER OMEGA WITH PSILI AND OXIA */ + ["\u1F6D", "\u1F65"], /* GREEK CAPITAL LETTER OMEGA WITH DASIA AND OXIA */ + ["\u1F6E", "\u1F66"], /* GREEK CAPITAL LETTER OMEGA WITH PSILI AND PERISPOMENI */ + ["\u1F6F", "\u1F67"], /* GREEK CAPITAL LETTER OMEGA WITH DASIA AND PERISPOMENI */ + ["\u1FBA", "\u1F70"], /* GREEK SMALL LETTER ALPHA WITH VARIA */ + ["\u1FBB", "\u1F71"], /* GREEK SMALL LETTER ALPHA WITH OXIA */ + ["\u1FC8", "\u1F72"], /* GREEK SMALL LETTER EPSILON WITH VARIA */ + ["\u1FC9", "\u1F73"], /* GREEK SMALL LETTER EPSILON WITH OXIA */ + ["\u1FCA", "\u1F74"], /* GREEK SMALL LETTER ETA WITH VARIA */ + ["\u1FCB", "\u1F75"], /* GREEK SMALL LETTER ETA WITH OXIA */ + ["\u1FDA", "\u1F76"], /* GREEK SMALL LETTER IOTA WITH VARIA */ + ["\u1FDB", "\u1F77"], /* GREEK SMALL LETTER IOTA WITH OXIA */ + ["\u1FF8", "\u1F78"], /* GREEK SMALL LETTER OMICRON WITH VARIA */ + ["\u1FF9", "\u1F79"], /* GREEK SMALL LETTER OMICRON WITH OXIA */ + ["\u1FEA", "\u1F7A"], /* GREEK SMALL LETTER UPSILON WITH VARIA */ + ["\u1FEB", "\u1F7B"], /* GREEK SMALL LETTER UPSILON WITH OXIA */ + ["\u1FFA", "\u1F7C"], /* GREEK SMALL LETTER OMEGA WITH VARIA */ + ["\u1FFB", "\u1F7D"], /* GREEK SMALL LETTER OMEGA WITH OXIA */ + ["\u1F7E", "\u1F7E"], + ["\u1F7F", "\u1F7F"], + ["\u1F08\u0399", "\u1F80"], /* GREEK SMALL LETTER ALPHA WITH PSILI AND YPOGEGRAMMENI */ + ["\u1F09\u0399", "\u1F81"], /* GREEK SMALL LETTER ALPHA WITH DASIA AND YPOGEGRAMMENI */ + ["\u1F0A\u0399", "\u1F82"], /* GREEK SMALL LETTER ALPHA WITH PSILI AND VARIA AND YPOGEGRAMMENI */ + ["\u1F0B\u0399", "\u1F83"], /* GREEK SMALL LETTER ALPHA WITH DASIA AND VARIA AND YPOGEGRAMMENI */ + ["\u1F0C\u0399", "\u1F84"], /* GREEK SMALL LETTER ALPHA WITH PSILI AND OXIA AND YPOGEGRAMMENI */ + ["\u1F0D\u0399", "\u1F85"], /* GREEK SMALL LETTER ALPHA WITH DASIA AND OXIA AND YPOGEGRAMMENI */ + ["\u1F0E\u0399", "\u1F86"], /* GREEK SMALL LETTER ALPHA WITH PSILI AND PERISPOMENI AND YPOGEGRAMMENI */ + ["\u1F0F\u0399", "\u1F87"], /* GREEK SMALL LETTER ALPHA WITH DASIA AND PERISPOMENI AND YPOGEGRAMMENI */ + ["\u1F08\u0399", "\u1F80"], /* GREEK CAPITAL LETTER ALPHA WITH PSILI AND PROSGEGRAMMENI */ + ["\u1F09\u0399", "\u1F81"], /* GREEK CAPITAL LETTER ALPHA WITH DASIA AND PROSGEGRAMMENI */ + ["\u1F0A\u0399", "\u1F82"], /* GREEK CAPITAL LETTER ALPHA WITH PSILI AND VARIA AND PROSGEGRAMMENI */ + ["\u1F0B\u0399", "\u1F83"], /* GREEK CAPITAL LETTER ALPHA WITH DASIA AND VARIA AND PROSGEGRAMMENI */ + ["\u1F0C\u0399", "\u1F84"], /* GREEK CAPITAL LETTER ALPHA WITH PSILI AND OXIA AND PROSGEGRAMMENI */ + ["\u1F0D\u0399", "\u1F85"], /* GREEK CAPITAL LETTER ALPHA WITH DASIA AND OXIA AND PROSGEGRAMMENI */ + ["\u1F0E\u0399", "\u1F86"], /* GREEK CAPITAL LETTER ALPHA WITH PSILI AND PERISPOMENI AND PROSGEGRAMMENI */ + ["\u1F0F\u0399", "\u1F87"], /* GREEK CAPITAL LETTER ALPHA WITH DASIA AND PERISPOMENI AND PROSGEGRAMMENI */ + ["\u1F28\u0399", "\u1F90"], /* GREEK SMALL LETTER ETA WITH PSILI AND YPOGEGRAMMENI */ + ["\u1F29\u0399", "\u1F91"], /* GREEK SMALL LETTER ETA WITH DASIA AND YPOGEGRAMMENI */ + ["\u1F2A\u0399", "\u1F92"], /* GREEK SMALL LETTER ETA WITH PSILI AND VARIA AND YPOGEGRAMMENI */ + ["\u1F2B\u0399", "\u1F93"], /* GREEK SMALL LETTER ETA WITH DASIA AND VARIA AND YPOGEGRAMMENI */ + ["\u1F2C\u0399", "\u1F94"], /* GREEK SMALL LETTER ETA WITH PSILI AND OXIA AND YPOGEGRAMMENI */ + ["\u1F2D\u0399", "\u1F95"], /* GREEK SMALL LETTER ETA WITH DASIA AND OXIA AND YPOGEGRAMMENI */ + ["\u1F2E\u0399", "\u1F96"], /* GREEK SMALL LETTER ETA WITH PSILI AND PERISPOMENI AND YPOGEGRAMMENI */ + ["\u1F2F\u0399", "\u1F97"], /* GREEK SMALL LETTER ETA WITH DASIA AND PERISPOMENI AND YPOGEGRAMMENI */ + ["\u1F28\u0399", "\u1F90"], /* GREEK CAPITAL LETTER ETA WITH PSILI AND PROSGEGRAMMENI */ + ["\u1F29\u0399", "\u1F91"], /* GREEK CAPITAL LETTER ETA WITH DASIA AND PROSGEGRAMMENI */ + ["\u1F2A\u0399", "\u1F92"], /* GREEK CAPITAL LETTER ETA WITH PSILI AND VARIA AND PROSGEGRAMMENI */ + ["\u1F2B\u0399", "\u1F93"], /* GREEK CAPITAL LETTER ETA WITH DASIA AND VARIA AND PROSGEGRAMMENI */ + ["\u1F2C\u0399", "\u1F94"], /* GREEK CAPITAL LETTER ETA WITH PSILI AND OXIA AND PROSGEGRAMMENI */ + ["\u1F2D\u0399", "\u1F95"], /* GREEK CAPITAL LETTER ETA WITH DASIA AND OXIA AND PROSGEGRAMMENI */ + ["\u1F2E\u0399", "\u1F96"], /* GREEK CAPITAL LETTER ETA WITH PSILI AND PERISPOMENI AND PROSGEGRAMMENI */ + ["\u1F2F\u0399", "\u1F97"], /* GREEK CAPITAL LETTER ETA WITH DASIA AND PERISPOMENI AND PROSGEGRAMMENI */ + ["\u1F68\u0399", "\u1FA0"], /* GREEK SMALL LETTER OMEGA WITH PSILI AND YPOGEGRAMMENI */ + ["\u1F69\u0399", "\u1FA1"], /* GREEK SMALL LETTER OMEGA WITH DASIA AND YPOGEGRAMMENI */ + ["\u1F6A\u0399", "\u1FA2"], /* GREEK SMALL LETTER OMEGA WITH PSILI AND VARIA AND YPOGEGRAMMENI */ + ["\u1F6B\u0399", "\u1FA3"], /* GREEK SMALL LETTER OMEGA WITH DASIA AND VARIA AND YPOGEGRAMMENI */ + ["\u1F6C\u0399", "\u1FA4"], /* GREEK SMALL LETTER OMEGA WITH PSILI AND OXIA AND YPOGEGRAMMENI */ + ["\u1F6D\u0399", "\u1FA5"], /* GREEK SMALL LETTER OMEGA WITH DASIA AND OXIA AND YPOGEGRAMMENI */ + ["\u1F6E\u0399", "\u1FA6"], /* GREEK SMALL LETTER OMEGA WITH PSILI AND PERISPOMENI AND YPOGEGRAMMENI */ + ["\u1F6F\u0399", "\u1FA7"], /* GREEK SMALL LETTER OMEGA WITH DASIA AND PERISPOMENI AND YPOGEGRAMMENI */ + ["\u1F68\u0399", "\u1FA0"], /* GREEK CAPITAL LETTER OMEGA WITH PSILI AND PROSGEGRAMMENI */ + ["\u1F69\u0399", "\u1FA1"], /* GREEK CAPITAL LETTER OMEGA WITH DASIA AND PROSGEGRAMMENI */ + ["\u1F6A\u0399", "\u1FA2"], /* GREEK CAPITAL LETTER OMEGA WITH PSILI AND VARIA AND PROSGEGRAMMENI */ + ["\u1F6B\u0399", "\u1FA3"], /* GREEK CAPITAL LETTER OMEGA WITH DASIA AND VARIA AND PROSGEGRAMMENI */ + ["\u1F6C\u0399", "\u1FA4"], /* GREEK CAPITAL LETTER OMEGA WITH PSILI AND OXIA AND PROSGEGRAMMENI */ + ["\u1F6D\u0399", "\u1FA5"], /* GREEK CAPITAL LETTER OMEGA WITH DASIA AND OXIA AND PROSGEGRAMMENI */ + ["\u1F6E\u0399", "\u1FA6"], /* GREEK CAPITAL LETTER OMEGA WITH PSILI AND PERISPOMENI AND PROSGEGRAMMENI */ + ["\u1F6F\u0399", "\u1FA7"], /* GREEK CAPITAL LETTER OMEGA WITH DASIA AND PERISPOMENI AND PROSGEGRAMMENI */ + ["\u1FB8", "\u1FB0"], /* GREEK SMALL LETTER ALPHA WITH VRACHY */ + ["\u1FB9", "\u1FB1"], /* GREEK SMALL LETTER ALPHA WITH MACRON */ + ["\u1FBA\u0399", "\u1FB2"], /* GREEK SMALL LETTER ALPHA WITH VARIA AND YPOGEGRAMMENI */ + ["\u0391\u0399", "\u1FB3"], /* GREEK SMALL LETTER ALPHA WITH YPOGEGRAMMENI */ + ["\u0386\u0399", "\u1FB4"], /* GREEK SMALL LETTER ALPHA WITH OXIA AND YPOGEGRAMMENI */ + ["\u1FB5", "\u1FB5"], + ["\u0391\u0342", "\u1FB6"], /* GREEK SMALL LETTER ALPHA WITH PERISPOMENI */ + ["\u0391\u0342\u0399", "\u1FB7"], /* GREEK SMALL LETTER ALPHA WITH PERISPOMENI AND YPOGEGRAMMENI */ + ["\u1FB8", "\u1FB0"], /* GREEK CAPITAL LETTER ALPHA WITH VRACHY */ + ["\u1FB9", "\u1FB1"], /* GREEK CAPITAL LETTER ALPHA WITH MACRON */ + ["\u1FBA", "\u1F70"], /* GREEK CAPITAL LETTER ALPHA WITH VARIA */ + ["\u1FBB", "\u1F71"], /* GREEK CAPITAL LETTER ALPHA WITH OXIA */ + ["\u0391\u0399", "\u1FB3"], /* GREEK CAPITAL LETTER ALPHA WITH PROSGEGRAMMENI */ + ["\u1FBD", "\u1FBD"], /* GREEK KORONIS */ + ["\u0399", "\u1FBE"], /* GREEK PROSGEGRAMMENI */ + ["\u1FBF", "\u1FBF"], /* GREEK PSILI */ + ["\u1FC0", "\u1FC0"], /* GREEK PERISPOMENI */ + ["\u1FC1", "\u1FC1"], /* GREEK DIALYTIKA AND PERISPOMENI */ + ["\u1FCA\u0399", "\u1FC2"], /* GREEK SMALL LETTER ETA WITH VARIA AND YPOGEGRAMMENI */ + ["\u0397\u0399", "\u1FC3"], /* GREEK SMALL LETTER ETA WITH YPOGEGRAMMENI */ + ["\u0389\u0399", "\u1FC4"], /* GREEK SMALL LETTER ETA WITH OXIA AND YPOGEGRAMMENI */ + ["\u1FC5", "\u1FC5"], + ["\u0397\u0342", "\u1FC6"], /* GREEK SMALL LETTER ETA WITH PERISPOMENI */ + ["\u0397\u0342\u0399", "\u1FC7"], /* GREEK SMALL LETTER ETA WITH PERISPOMENI AND YPOGEGRAMMENI */ + ["\u1FC8", "\u1F72"], /* GREEK CAPITAL LETTER EPSILON WITH VARIA */ + ["\u1FC9", "\u1F73"], /* GREEK CAPITAL LETTER EPSILON WITH OXIA */ + ["\u1FCA", "\u1F74"], /* GREEK CAPITAL LETTER ETA WITH VARIA */ + ["\u1FCB", "\u1F75"], /* GREEK CAPITAL LETTER ETA WITH OXIA */ + ["\u0397\u0399", "\u1FC3"], /* GREEK CAPITAL LETTER ETA WITH PROSGEGRAMMENI */ + ["\u1FCD", "\u1FCD"], /* GREEK PSILI AND VARIA */ + ["\u1FCE", "\u1FCE"], /* GREEK PSILI AND OXIA */ + ["\u1FCF", "\u1FCF"], /* GREEK PSILI AND PERISPOMENI */ + ["\u1FD8", "\u1FD0"], /* GREEK SMALL LETTER IOTA WITH VRACHY */ + ["\u1FD9", "\u1FD1"], /* GREEK SMALL LETTER IOTA WITH MACRON */ + ["\u0399\u0308\u0300", "\u1FD2"], /* GREEK SMALL LETTER IOTA WITH DIALYTIKA AND VARIA */ + ["\u0399\u0308\u0301", "\u1FD3"], /* GREEK SMALL LETTER IOTA WITH DIALYTIKA AND OXIA */ + ["\u1FD4", "\u1FD4"], + ["\u1FD5", "\u1FD5"], + ["\u0399\u0342", "\u1FD6"], /* GREEK SMALL LETTER IOTA WITH PERISPOMENI */ + ["\u0399\u0308\u0342", "\u1FD7"], /* GREEK SMALL LETTER IOTA WITH DIALYTIKA AND PERISPOMENI */ + ["\u1FD8", "\u1FD0"], /* GREEK CAPITAL LETTER IOTA WITH VRACHY */ + ["\u1FD9", "\u1FD1"], /* GREEK CAPITAL LETTER IOTA WITH MACRON */ + ["\u1FDA", "\u1F76"], /* GREEK CAPITAL LETTER IOTA WITH VARIA */ + ["\u1FDB", "\u1F77"], /* GREEK CAPITAL LETTER IOTA WITH OXIA */ + ["\u1FDC", "\u1FDC"], + ["\u1FDD", "\u1FDD"], /* GREEK DASIA AND VARIA */ + ["\u1FDE", "\u1FDE"], /* GREEK DASIA AND OXIA */ + ["\u1FDF", "\u1FDF"], /* GREEK DASIA AND PERISPOMENI */ + ["\u1FE8", "\u1FE0"], /* GREEK SMALL LETTER UPSILON WITH VRACHY */ + ["\u1FE9", "\u1FE1"], /* GREEK SMALL LETTER UPSILON WITH MACRON */ + ["\u03A5\u0308\u0300", "\u1FE2"], /* GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND VARIA */ + ["\u03A5\u0308\u0301", "\u1FE3"], /* GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND OXIA */ + ["\u03A1\u0313", "\u1FE4"], /* GREEK SMALL LETTER RHO WITH PSILI */ + ["\u1FEC", "\u1FE5"], /* GREEK SMALL LETTER RHO WITH DASIA */ + ["\u03A5\u0342", "\u1FE6"], /* GREEK SMALL LETTER UPSILON WITH PERISPOMENI */ + ["\u03A5\u0308\u0342", "\u1FE7"], /* GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND PERISPOMENI */ + ["\u1FE8", "\u1FE0"], /* GREEK CAPITAL LETTER UPSILON WITH VRACHY */ + ["\u1FE9", "\u1FE1"], /* GREEK CAPITAL LETTER UPSILON WITH MACRON */ + ["\u1FEA", "\u1F7A"], /* GREEK CAPITAL LETTER UPSILON WITH VARIA */ + ["\u1FEB", "\u1F7B"], /* GREEK CAPITAL LETTER UPSILON WITH OXIA */ + ["\u1FEC", "\u1FE5"], /* GREEK CAPITAL LETTER RHO WITH DASIA */ + ["\u1FED", "\u1FED"], /* GREEK DIALYTIKA AND VARIA */ + ["\u1FEE", "\u1FEE"], /* GREEK DIALYTIKA AND OXIA */ + ["\u1FEF", "\u1FEF"], /* GREEK VARIA */ + ["\u1FF0", "\u1FF0"], + ["\u1FF1", "\u1FF1"], + ["\u1FFA\u0399", "\u1FF2"], /* GREEK SMALL LETTER OMEGA WITH VARIA AND YPOGEGRAMMENI */ + ["\u03A9\u0399", "\u1FF3"], /* GREEK SMALL LETTER OMEGA WITH YPOGEGRAMMENI */ + ["\u038F\u0399", "\u1FF4"], /* GREEK SMALL LETTER OMEGA WITH OXIA AND YPOGEGRAMMENI */ + ["\u1FF5", "\u1FF5"], + ["\u03A9\u0342", "\u1FF6"], /* GREEK SMALL LETTER OMEGA WITH PERISPOMENI */ + ["\u03A9\u0342\u0399", "\u1FF7"], /* GREEK SMALL LETTER OMEGA WITH PERISPOMENI AND YPOGEGRAMMENI */ + ["\u1FF8", "\u1F78"], /* GREEK CAPITAL LETTER OMICRON WITH VARIA */ + ["\u1FF9", "\u1F79"], /* GREEK CAPITAL LETTER OMICRON WITH OXIA */ + ["\u1FFA", "\u1F7C"], /* GREEK CAPITAL LETTER OMEGA WITH VARIA */ + ["\u1FFB", "\u1F7D"], /* GREEK CAPITAL LETTER OMEGA WITH OXIA */ + ["\u03A9\u0399", "\u1FF3"], /* GREEK CAPITAL LETTER OMEGA WITH PROSGEGRAMMENI */ + ["\u1FFD", "\u1FFD"], /* GREEK OXIA */ + ["\u1FFE", "\u1FFE"], /* GREEK DASIA */ + ["\u1FFF", "\u1FFF"], + ["\u2000", "\u2000"], /* EN QUAD */ + ["\u2001", "\u2001"], /* EM QUAD */ + ["\u2002", "\u2002"], /* EN SPACE */ + ["\u2003", "\u2003"], /* EM SPACE */ + ["\u2004", "\u2004"], /* THREE-PER-EM SPACE */ + ["\u2005", "\u2005"], /* FOUR-PER-EM SPACE */ + ["\u2006", "\u2006"], /* SIX-PER-EM SPACE */ + ["\u2007", "\u2007"], /* FIGURE SPACE */ + ["\u2008", "\u2008"], /* PUNCTUATION SPACE */ + ["\u2009", "\u2009"], /* THIN SPACE */ + ["\u200A", "\u200A"], /* HAIR SPACE */ + ["\u200B", "\u200B"], /* ZERO WIDTH SPACE */ + ["\u200C", "\u200C"], /* ZERO WIDTH NON-JOINER */ + ["\u200D", "\u200D"], /* ZERO WIDTH JOINER */ + ["\u200E", "\u200E"], /* LEFT-TO-RIGHT MARK */ + ["\u200F", "\u200F"], /* RIGHT-TO-LEFT MARK */ + ["\u2010", "\u2010"], /* HYPHEN */ + ["\u2011", "\u2011"], /* NON-BREAKING HYPHEN */ + ["\u2012", "\u2012"], /* FIGURE DASH */ + ["\u2013", "\u2013"], /* EN DASH */ + ["\u2014", "\u2014"], /* EM DASH */ + ["\u2015", "\u2015"], /* HORIZONTAL BAR (QUOTATION DASH) */ + ["\u2016", "\u2016"], /* DOUBLE VERTICAL LINE (DOUBLE VERTICAL BAR) */ + ["\u2017", "\u2017"], /* DOUBLE LOW LINE (SPACING DOUBLE UNDERSCORE) */ + ["\u2018", "\u2018"], /* LEFT SINGLE QUOTATION MARK (SINGLE TURNED COMMA QUOTATION MARK) */ + ["\u2019", "\u2019"], /* RIGHT SINGLE QUOTATION MARK (SINGLE COMMA QUOTATION MARK) */ + ["\u201A", "\u201A"], /* SINGLE LOW-9 QUOTATION MARK (LOW SINGLE COMMA QUOTATION MARK) */ + ["\u201B", "\u201B"], /* SINGLE HIGH-REVERSED-9 QUOTATION MARK (SINGLE REVERSED COMMA QUOTATION MARK) */ + ["\u201C", "\u201C"], /* LEFT DOUBLE QUOTATION MARK (DOUBLE TURNED COMMA QUOTATION MARK) */ + ["\u201D", "\u201D"], /* RIGHT DOUBLE QUOTATION MARK (DOUBLE COMMA QUOTATION MARK) */ + ["\u201E", "\u201E"], /* DOUBLE LOW-9 QUOTATION MARK (LOW DOUBLE COMMA QUOTATION MARK) */ + ["\u201F", "\u201F"], /* DOUBLE HIGH-REVERSED-9 QUOTATION MARK (DOUBLE REVERSED COMMA QUOTATION MARK) */ + ["\u2020", "\u2020"], /* DAGGER */ + ["\u2021", "\u2021"], /* DOUBLE DAGGER */ + ["\u2022", "\u2022"], /* BULLET */ + ["\u2023", "\u2023"], /* TRIANGULAR BULLET */ + ["\u2024", "\u2024"], /* ONE DOT LEADER */ + ["\u2025", "\u2025"], /* TWO DOT LEADER */ + ["\u2026", "\u2026"], /* HORIZONTAL ELLIPSIS */ + ["\u2027", "\u2027"], /* HYPHENATION POINT */ + ["\u2028", "\u2028"], /* LINE SEPARATOR */ + ["\u2029", "\u2029"], /* PARAGRAPH SEPARATOR */ + ["\u202A", "\u202A"], /* LEFT-TO-RIGHT EMBEDDING */ + ["\u202B", "\u202B"], /* RIGHT-TO-LEFT EMBEDDING */ + ["\u202C", "\u202C"], /* POP DIRECTIONAL FORMATTING */ + ["\u202D", "\u202D"], /* LEFT-TO-RIGHT OVERRIDE */ + ["\u202E", "\u202E"], /* RIGHT-TO-LEFT OVERRIDE */ + ["\u202F", "\u202F"], /* NARROW NO-BREAK SPACE */ + ["\u2030", "\u2030"], /* PER MILLE SIGN */ + ["\u2031", "\u2031"], /* PER TEN THOUSAND SIGN */ + ["\u2032", "\u2032"], /* PRIME */ + ["\u2033", "\u2033"], /* DOUBLE PRIME */ + ["\u2034", "\u2034"], /* TRIPLE PRIME */ + ["\u2035", "\u2035"], /* REVERSED PRIME */ + ["\u2036", "\u2036"], /* REVERSED DOUBLE PRIME */ + ["\u2037", "\u2037"], /* REVERSED TRIPLE PRIME */ + ["\u2038", "\u2038"], /* CARET */ + ["\u2039", "\u2039"], /* SINGLE LEFT-POINTING ANGLE QUOTATION MARK (LEFT POINTING SINGLE GUILLEMET) */ + ["\u203A", "\u203A"], /* SINGLE RIGHT-POINTING ANGLE QUOTATION MARK (RIGHT POINTING SINGLE GUILLEMET) */ + ["\u203B", "\u203B"], /* REFERENCE MARK */ + ["\u203C", "\u203C"], /* DOUBLE EXCLAMATION MARK */ + ["\u203D", "\u203D"], /* INTERROBANG */ + ["\u203E", "\u203E"], /* OVERLINE (SPACING OVERSCORE) */ + ["\u203F", "\u203F"], /* UNDERTIE */ + ["\u2040", "\u2040"], /* CHARACTER TIE */ + ["\u2041", "\u2041"], /* CARET INSERTION POINT */ + ["\u2042", "\u2042"], /* ASTERISM */ + ["\u2043", "\u2043"], /* HYPHEN BULLET */ + ["\u2044", "\u2044"], /* FRACTION SLASH */ + ["\u2045", "\u2045"], /* LEFT SQUARE BRACKET WITH QUILL */ + ["\u2046", "\u2046"], /* RIGHT SQUARE BRACKET WITH QUILL */ + ["\u2047", "\u2047"], /* DOUBLE QUESTION MARK */ + ["\u2048", "\u2048"], /* QUESTION EXCLAMATION MARK */ + ["\u2049", "\u2049"], /* EXCLAMATION QUESTION MARK */ + ["\u204A", "\u204A"], /* TIRONIAN SIGN ET */ + ["\u204B", "\u204B"], /* REVERSED PILCROW SIGN */ + ["\u204C", "\u204C"], /* BLACK LEFTWARDS BULLET */ + ["\u204D", "\u204D"], /* BLACK RIGHTWARDS BULLET */ + ["\u204E", "\u204E"], /* LOW ASTERISK */ + ["\u204F", "\u204F"], /* REVERSED SEMICOLON */ + ["\u2050", "\u2050"], /* CLOSE UP */ + ["\u2051", "\u2051"], /* TWO ASTERISKS ALIGNED VERTICALLY */ + ["\u2052", "\u2052"], /* COMMERCIAL MINUS SIGN */ + ["\u2053", "\u2053"], /* SWUNG DASH */ + ["\u2054", "\u2054"], /* INVERTED UNDERTIE */ + ["\u2055", "\u2055"], /* FLOWER PUNCTUATION MARK */ + ["\u2056", "\u2056"], /* THREE DOT PUNCTUATION */ + ["\u2057", "\u2057"], /* QUADRUPLE PRIME */ + ["\u2058", "\u2058"], /* FOUR DOT PUNCTUATION */ + ["\u2059", "\u2059"], /* FIVE DOT PUNCTUATION */ + ["\u205A", "\u205A"], /* TWO DOT PUNCTUATION */ + ["\u205B", "\u205B"], /* FOUR DOT MARK */ + ["\u205C", "\u205C"], /* DOTTED CROSS */ + ["\u205D", "\u205D"], /* TRICOLON */ + ["\u205E", "\u205E"], /* VERTICAL FOUR DOTS */ + ["\u205F", "\u205F"], /* MEDIUM MATHEMATICAL SPACE */ + ["\u2060", "\u2060"], /* WORD JOINER */ + ["\u2061", "\u2061"], /* FUNCTION APPLICATION */ + ["\u2062", "\u2062"], /* INVISIBLE TIMES */ + ["\u2063", "\u2063"], /* INVISIBLE SEPARATOR */ + ["\u2064", "\u2064"], /* INVISIBLE PLUS */ + ["\u2065", "\u2065"], + ["\u2066", "\u2066"], /* LEFT-TO-RIGHT ISOLATE */ + ["\u2067", "\u2067"], /* RIGHT-TO-LEFT ISOLATE */ + ["\u2068", "\u2068"], /* FIRST STRONG ISOLATE */ + ["\u2069", "\u2069"], /* POP DIRECTIONAL ISOLATE */ + ["\u206A", "\u206A"], /* INHIBIT SYMMETRIC SWAPPING */ + ["\u206B", "\u206B"], /* ACTIVATE SYMMETRIC SWAPPING */ + ["\u206C", "\u206C"], /* INHIBIT ARABIC FORM SHAPING */ + ["\u206D", "\u206D"], /* ACTIVATE ARABIC FORM SHAPING */ + ["\u206E", "\u206E"], /* NATIONAL DIGIT SHAPES */ + ["\u206F", "\u206F"], /* NOMINAL DIGIT SHAPES */ + ["\u2070", "\u2070"], /* SUPERSCRIPT ZERO (SUPERSCRIPT DIGIT ZERO) */ + ["\u2071", "\u2071"], /* SUPERSCRIPT LATIN SMALL LETTER I */ + ["\u2072", "\u2072"], + ["\u2073", "\u2073"], + ["\u2074", "\u2074"], /* SUPERSCRIPT FOUR (SUPERSCRIPT DIGIT FOUR) */ + ["\u2075", "\u2075"], /* SUPERSCRIPT FIVE (SUPERSCRIPT DIGIT FIVE) */ + ["\u2076", "\u2076"], /* SUPERSCRIPT SIX (SUPERSCRIPT DIGIT SIX) */ + ["\u2077", "\u2077"], /* SUPERSCRIPT SEVEN (SUPERSCRIPT DIGIT SEVEN) */ + ["\u2078", "\u2078"], /* SUPERSCRIPT EIGHT (SUPERSCRIPT DIGIT EIGHT) */ + ["\u2079", "\u2079"], /* SUPERSCRIPT NINE (SUPERSCRIPT DIGIT NINE) */ + ["\u207A", "\u207A"], /* SUPERSCRIPT PLUS SIGN */ + ["\u207B", "\u207B"], /* SUPERSCRIPT MINUS (SUPERSCRIPT HYPHEN-MINUS) */ + ["\u207C", "\u207C"], /* SUPERSCRIPT EQUALS SIGN */ + ["\u207D", "\u207D"], /* SUPERSCRIPT LEFT PARENTHESIS (SUPERSCRIPT OPENING PARENTHESIS) */ + ["\u207E", "\u207E"], /* SUPERSCRIPT RIGHT PARENTHESIS (SUPERSCRIPT CLOSING PARENTHESIS) */ + ["\u207F", "\u207F"], /* SUPERSCRIPT LATIN SMALL LETTER N */ + ["\u2080", "\u2080"], /* SUBSCRIPT ZERO (SUBSCRIPT DIGIT ZERO) */ + ["\u2081", "\u2081"], /* SUBSCRIPT ONE (SUBSCRIPT DIGIT ONE) */ + ["\u2082", "\u2082"], /* SUBSCRIPT TWO (SUBSCRIPT DIGIT TWO) */ + ["\u2083", "\u2083"], /* SUBSCRIPT THREE (SUBSCRIPT DIGIT THREE) */ + ["\u2084", "\u2084"], /* SUBSCRIPT FOUR (SUBSCRIPT DIGIT FOUR) */ + ["\u2085", "\u2085"], /* SUBSCRIPT FIVE (SUBSCRIPT DIGIT FIVE) */ + ["\u2086", "\u2086"], /* SUBSCRIPT SIX (SUBSCRIPT DIGIT SIX) */ + ["\u2087", "\u2087"], /* SUBSCRIPT SEVEN (SUBSCRIPT DIGIT SEVEN) */ + ["\u2088", "\u2088"], /* SUBSCRIPT EIGHT (SUBSCRIPT DIGIT EIGHT) */ + ["\u2089", "\u2089"], /* SUBSCRIPT NINE (SUBSCRIPT DIGIT NINE) */ + ["\u208A", "\u208A"], /* SUBSCRIPT PLUS SIGN */ + ["\u208B", "\u208B"], /* SUBSCRIPT MINUS (SUBSCRIPT HYPHEN-MINUS) */ + ["\u208C", "\u208C"], /* SUBSCRIPT EQUALS SIGN */ + ["\u208D", "\u208D"], /* SUBSCRIPT LEFT PARENTHESIS (SUBSCRIPT OPENING PARENTHESIS) */ + ["\u208E", "\u208E"], /* SUBSCRIPT RIGHT PARENTHESIS (SUBSCRIPT CLOSING PARENTHESIS) */ + ["\u208F", "\u208F"], + ["\u2090", "\u2090"], /* LATIN SUBSCRIPT SMALL LETTER A */ + ["\u2091", "\u2091"], /* LATIN SUBSCRIPT SMALL LETTER E */ + ["\u2092", "\u2092"], /* LATIN SUBSCRIPT SMALL LETTER O */ + ["\u2093", "\u2093"], /* LATIN SUBSCRIPT SMALL LETTER X */ + ["\u2094", "\u2094"], /* LATIN SUBSCRIPT SMALL LETTER SCHWA */ + ["\u2095", "\u2095"], /* LATIN SUBSCRIPT SMALL LETTER H */ + ["\u2096", "\u2096"], /* LATIN SUBSCRIPT SMALL LETTER K */ + ["\u2097", "\u2097"], /* LATIN SUBSCRIPT SMALL LETTER L */ + ["\u2098", "\u2098"], /* LATIN SUBSCRIPT SMALL LETTER M */ + ["\u2099", "\u2099"], /* LATIN SUBSCRIPT SMALL LETTER N */ + ["\u209A", "\u209A"], /* LATIN SUBSCRIPT SMALL LETTER P */ + ["\u209B", "\u209B"], /* LATIN SUBSCRIPT SMALL LETTER S */ + ["\u209C", "\u209C"], /* LATIN SUBSCRIPT SMALL LETTER T */ + ["\u209D", "\u209D"], + ["\u209E", "\u209E"], + ["\u209F", "\u209F"], + ["\u20A0", "\u20A0"], /* EURO-CURRENCY SIGN */ + ["\u20A1", "\u20A1"], /* COLON SIGN */ + ["\u20A2", "\u20A2"], /* CRUZEIRO SIGN */ + ["\u20A3", "\u20A3"], /* FRENCH FRANC SIGN */ + ["\u20A4", "\u20A4"], /* LIRA SIGN */ + ["\u20A5", "\u20A5"], /* MILL SIGN */ + ["\u20A6", "\u20A6"], /* NAIRA SIGN */ + ["\u20A7", "\u20A7"], /* PESETA SIGN */ + ["\u20A8", "\u20A8"], /* RUPEE SIGN */ + ["\u20A9", "\u20A9"], /* WON SIGN */ + ["\u20AA", "\u20AA"], /* NEW SHEQEL SIGN */ + ["\u20AB", "\u20AB"], /* DONG SIGN */ + ["\u20AC", "\u20AC"], /* EURO SIGN */ + ["\u20AD", "\u20AD"], /* KIP SIGN */ + ["\u20AE", "\u20AE"], /* TUGRIK SIGN */ + ["\u20AF", "\u20AF"], /* DRACHMA SIGN */ + ["\u20B0", "\u20B0"], /* GERMAN PENNY SIGN */ + ["\u20B1", "\u20B1"], /* PESO SIGN */ + ["\u20B2", "\u20B2"], /* GUARANI SIGN */ + ["\u20B3", "\u20B3"], /* AUSTRAL SIGN */ + ["\u20B4", "\u20B4"], /* HRYVNIA SIGN */ + ["\u20B5", "\u20B5"], /* CEDI SIGN */ + ["\u20B6", "\u20B6"], /* LIVRE TOURNOIS SIGN */ + ["\u20B7", "\u20B7"], /* SPESMILO SIGN */ + ["\u20B8", "\u20B8"], /* TENGE SIGN */ + ["\u20B9", "\u20B9"], /* INDIAN RUPEE SIGN */ + ["\u20BA", "\u20BA"], /* TURKISH LIRA SIGN */ + ["\u20BB", "\u20BB"], /* NORDIC MARK SIGN */ + ["\u20BC", "\u20BC"], /* MANAT SIGN */ + ["\u20BD", "\u20BD"], /* RUBLE SIGN */ + ["\u20BE", "\u20BE"], /* LARI SIGN */ + ["\u20BF", "\u20BF"], /* BITCOIN SIGN */ + ["\u20C0", "\u20C0"], /* SOM SIGN */ + ["\u20C1", "\u20C1"], + ["\u20C2", "\u20C2"], + ["\u20C3", "\u20C3"], + ["\u20C4", "\u20C4"], + ["\u20C5", "\u20C5"], + ["\u20C6", "\u20C6"], + ["\u20C7", "\u20C7"], + ["\u20C8", "\u20C8"], + ["\u20C9", "\u20C9"], + ["\u20CA", "\u20CA"], + ["\u20CB", "\u20CB"], + ["\u20CC", "\u20CC"], + ["\u20CD", "\u20CD"], + ["\u20CE", "\u20CE"], + ["\u20CF", "\u20CF"], + ["\u20D0", "\u20D0"], /* COMBINING LEFT HARPOON ABOVE (NON-SPACING LEFT HARPOON ABOVE) */ + ["\u20D1", "\u20D1"], /* COMBINING RIGHT HARPOON ABOVE (NON-SPACING RIGHT HARPOON ABOVE) */ + ["\u20D2", "\u20D2"], /* COMBINING LONG VERTICAL LINE OVERLAY (NON-SPACING LONG VERTICAL BAR OVERLAY) */ + ["\u20D3", "\u20D3"], /* COMBINING SHORT VERTICAL LINE OVERLAY (NON-SPACING SHORT VERTICAL BAR OVERLAY) */ + ["\u20D4", "\u20D4"], /* COMBINING ANTICLOCKWISE ARROW ABOVE (NON-SPACING ANTICLOCKWISE ARROW ABOVE) */ + ["\u20D5", "\u20D5"], /* COMBINING CLOCKWISE ARROW ABOVE (NON-SPACING CLOCKWISE ARROW ABOVE) */ + ["\u20D6", "\u20D6"], /* COMBINING LEFT ARROW ABOVE (NON-SPACING LEFT ARROW ABOVE) */ + ["\u20D7", "\u20D7"], /* COMBINING RIGHT ARROW ABOVE (NON-SPACING RIGHT ARROW ABOVE) */ + ["\u20D8", "\u20D8"], /* COMBINING RING OVERLAY (NON-SPACING RING OVERLAY) */ + ["\u20D9", "\u20D9"], /* COMBINING CLOCKWISE RING OVERLAY (NON-SPACING CLOCKWISE RING OVERLAY) */ + ["\u20DA", "\u20DA"], /* COMBINING ANTICLOCKWISE RING OVERLAY (NON-SPACING ANTICLOCKWISE RING OVERLAY) */ + ["\u20DB", "\u20DB"], /* COMBINING THREE DOTS ABOVE (NON-SPACING THREE DOTS ABOVE) */ + ["\u20DC", "\u20DC"], /* COMBINING FOUR DOTS ABOVE (NON-SPACING FOUR DOTS ABOVE) */ + ["\u20DD", "\u20DD"], /* COMBINING ENCLOSING CIRCLE (ENCLOSING CIRCLE) */ + ["\u20DE", "\u20DE"], /* COMBINING ENCLOSING SQUARE (ENCLOSING SQUARE) */ + ["\u20DF", "\u20DF"], /* COMBINING ENCLOSING DIAMOND (ENCLOSING DIAMOND) */ + ["\u20E0", "\u20E0"], /* COMBINING ENCLOSING CIRCLE BACKSLASH (ENCLOSING CIRCLE SLASH) */ + ["\u20E1", "\u20E1"], /* COMBINING LEFT RIGHT ARROW ABOVE (NON-SPACING LEFT RIGHT ARROW ABOVE) */ + ["\u20E2", "\u20E2"], /* COMBINING ENCLOSING SCREEN */ + ["\u20E3", "\u20E3"], /* COMBINING ENCLOSING KEYCAP */ + ["\u20E4", "\u20E4"], /* COMBINING ENCLOSING UPWARD POINTING TRIANGLE */ + ["\u20E5", "\u20E5"], /* COMBINING REVERSE SOLIDUS OVERLAY */ + ["\u20E6", "\u20E6"], /* COMBINING DOUBLE VERTICAL STROKE OVERLAY */ + ["\u20E7", "\u20E7"], /* COMBINING ANNUITY SYMBOL */ + ["\u20E8", "\u20E8"], /* COMBINING TRIPLE UNDERDOT */ + ["\u20E9", "\u20E9"], /* COMBINING WIDE BRIDGE ABOVE */ + ["\u20EA", "\u20EA"], /* COMBINING LEFTWARDS ARROW OVERLAY */ + ["\u20EB", "\u20EB"], /* COMBINING LONG DOUBLE SOLIDUS OVERLAY */ + ["\u20EC", "\u20EC"], /* COMBINING RIGHTWARDS HARPOON WITH BARB DOWNWARDS */ + ["\u20ED", "\u20ED"], /* COMBINING LEFTWARDS HARPOON WITH BARB DOWNWARDS */ + ["\u20EE", "\u20EE"], /* COMBINING LEFT ARROW BELOW */ + ["\u20EF", "\u20EF"], /* COMBINING RIGHT ARROW BELOW */ + ["\u20F0", "\u20F0"], /* COMBINING ASTERISK ABOVE */ + ["\u20F1", "\u20F1"], + ["\u20F2", "\u20F2"], + ["\u20F3", "\u20F3"], + ["\u20F4", "\u20F4"], + ["\u20F5", "\u20F5"], + ["\u20F6", "\u20F6"], + ["\u20F7", "\u20F7"], + ["\u20F8", "\u20F8"], + ["\u20F9", "\u20F9"], + ["\u20FA", "\u20FA"], + ["\u20FB", "\u20FB"], + ["\u20FC", "\u20FC"], + ["\u20FD", "\u20FD"], + ["\u20FE", "\u20FE"], + ["\u20FF", "\u20FF"], + ["\u2100", "\u2100"], /* ACCOUNT OF */ + ["\u2101", "\u2101"], /* ADDRESSED TO THE SUBJECT */ + ["\u2102", "\u2102"], /* DOUBLE-STRUCK CAPITAL C (DOUBLE-STRUCK C) */ + ["\u2103", "\u2103"], /* DEGREE CELSIUS (DEGREES CENTIGRADE) */ + ["\u2104", "\u2104"], /* CENTRE LINE SYMBOL (C L SYMBOL) */ + ["\u2105", "\u2105"], /* CARE OF */ + ["\u2106", "\u2106"], /* CADA UNA */ + ["\u2107", "\u2107"], /* EULER CONSTANT (EULERS) */ + ["\u2108", "\u2108"], /* SCRUPLE */ + ["\u2109", "\u2109"], /* DEGREE FAHRENHEIT (DEGREES FAHRENHEIT) */ + ["\u210A", "\u210A"], /* SCRIPT SMALL G */ + ["\u210B", "\u210B"], /* SCRIPT CAPITAL H (SCRIPT H) */ + ["\u210C", "\u210C"], /* BLACK-LETTER CAPITAL H (BLACK-LETTER H) */ + ["\u210D", "\u210D"], /* DOUBLE-STRUCK CAPITAL H (DOUBLE-STRUCK H) */ + ["\u210E", "\u210E"], /* PLANCK CONSTANT */ + ["\u210F", "\u210F"], /* PLANCK CONSTANT OVER TWO PI (PLANCK CONSTANT OVER 2 PI) */ + ["\u2110", "\u2110"], /* SCRIPT CAPITAL I (SCRIPT I) */ + ["\u2111", "\u2111"], /* BLACK-LETTER CAPITAL I (BLACK-LETTER I) */ + ["\u2112", "\u2112"], /* SCRIPT CAPITAL L (SCRIPT L) */ + ["\u2113", "\u2113"], /* SCRIPT SMALL L */ + ["\u2114", "\u2114"], /* L B BAR SYMBOL */ + ["\u2115", "\u2115"], /* DOUBLE-STRUCK CAPITAL N (DOUBLE-STRUCK N) */ + ["\u2116", "\u2116"], /* NUMERO SIGN (NUMERO) */ + ["\u2117", "\u2117"], /* SOUND RECORDING COPYRIGHT */ + ["\u2118", "\u2118"], /* SCRIPT CAPITAL P (SCRIPT P) */ + ["\u2119", "\u2119"], /* DOUBLE-STRUCK CAPITAL P (DOUBLE-STRUCK P) */ + ["\u211A", "\u211A"], /* DOUBLE-STRUCK CAPITAL Q (DOUBLE-STRUCK Q) */ + ["\u211B", "\u211B"], /* SCRIPT CAPITAL R (SCRIPT R) */ + ["\u211C", "\u211C"], /* BLACK-LETTER CAPITAL R (BLACK-LETTER R) */ + ["\u211D", "\u211D"], /* DOUBLE-STRUCK CAPITAL R (DOUBLE-STRUCK R) */ + ["\u211E", "\u211E"], /* PRESCRIPTION TAKE */ + ["\u211F", "\u211F"], /* RESPONSE */ + ["\u2120", "\u2120"], /* SERVICE MARK */ + ["\u2121", "\u2121"], /* TELEPHONE SIGN (T E L SYMBOL) */ + ["\u2122", "\u2122"], /* TRADE MARK SIGN (TRADEMARK) */ + ["\u2123", "\u2123"], /* VERSICLE */ + ["\u2124", "\u2124"], /* DOUBLE-STRUCK CAPITAL Z (DOUBLE-STRUCK Z) */ + ["\u2125", "\u2125"], /* OUNCE SIGN (OUNCE) */ + ["\u2126", "\u03C9"], /* OHM SIGN (OHM) */ + ["\u2127", "\u2127"], /* INVERTED OHM SIGN (MHO) */ + ["\u2128", "\u2128"], /* BLACK-LETTER CAPITAL Z (BLACK-LETTER Z) */ + ["\u2129", "\u2129"], /* TURNED GREEK SMALL LETTER IOTA */ + ["\u212A", "\u006B"], /* KELVIN SIGN (DEGREES KELVIN) */ + ["\u212B", "\u00E5"], /* ANGSTROM SIGN (ANGSTROM UNIT) */ + ["\u212C", "\u212C"], /* SCRIPT CAPITAL B (SCRIPT B) */ + ["\u212D", "\u212D"], /* BLACK-LETTER CAPITAL C (BLACK-LETTER C) */ + ["\u212E", "\u212E"], /* ESTIMATED SYMBOL */ + ["\u212F", "\u212F"], /* SCRIPT SMALL E */ + ["\u2130", "\u2130"], /* SCRIPT CAPITAL E (SCRIPT E) */ + ["\u2131", "\u2131"], /* SCRIPT CAPITAL F (SCRIPT F) */ + ["\u2132", "\u214E"], /* TURNED CAPITAL F (TURNED F) */ + ["\u2133", "\u2133"], /* SCRIPT CAPITAL M (SCRIPT M) */ + ["\u2134", "\u2134"], /* SCRIPT SMALL O */ + ["\u2135", "\u2135"], /* ALEF SYMBOL (FIRST TRANSFINITE CARDINAL) */ + ["\u2136", "\u2136"], /* BET SYMBOL (SECOND TRANSFINITE CARDINAL) */ + ["\u2137", "\u2137"], /* GIMEL SYMBOL (THIRD TRANSFINITE CARDINAL) */ + ["\u2138", "\u2138"], /* DALET SYMBOL (FOURTH TRANSFINITE CARDINAL) */ + ["\u2139", "\u2139"], /* INFORMATION SOURCE */ + ["\u213A", "\u213A"], /* ROTATED CAPITAL Q */ + ["\u213B", "\u213B"], /* FACSIMILE SIGN */ + ["\u213C", "\u213C"], /* DOUBLE-STRUCK SMALL PI */ + ["\u213D", "\u213D"], /* DOUBLE-STRUCK SMALL GAMMA */ + ["\u213E", "\u213E"], /* DOUBLE-STRUCK CAPITAL GAMMA */ + ["\u213F", "\u213F"], /* DOUBLE-STRUCK CAPITAL PI */ + ["\u2140", "\u2140"], /* DOUBLE-STRUCK N-ARY SUMMATION */ + ["\u2141", "\u2141"], /* TURNED SANS-SERIF CAPITAL G */ + ["\u2142", "\u2142"], /* TURNED SANS-SERIF CAPITAL L */ + ["\u2143", "\u2143"], /* REVERSED SANS-SERIF CAPITAL L */ + ["\u2144", "\u2144"], /* TURNED SANS-SERIF CAPITAL Y */ + ["\u2145", "\u2145"], /* DOUBLE-STRUCK ITALIC CAPITAL D */ + ["\u2146", "\u2146"], /* DOUBLE-STRUCK ITALIC SMALL D */ + ["\u2147", "\u2147"], /* DOUBLE-STRUCK ITALIC SMALL E */ + ["\u2148", "\u2148"], /* DOUBLE-STRUCK ITALIC SMALL I */ + ["\u2149", "\u2149"], /* DOUBLE-STRUCK ITALIC SMALL J */ + ["\u214A", "\u214A"], /* PROPERTY LINE */ + ["\u214B", "\u214B"], /* TURNED AMPERSAND */ + ["\u214C", "\u214C"], /* PER SIGN */ + ["\u214D", "\u214D"], /* AKTIESELSKAB */ + ["\u2132", "\u214E"], /* TURNED SMALL F */ + ["\u214F", "\u214F"], /* SYMBOL FOR SAMARITAN SOURCE */ + ["\u2150", "\u2150"], /* VULGAR FRACTION ONE SEVENTH */ + ["\u2151", "\u2151"], /* VULGAR FRACTION ONE NINTH */ + ["\u2152", "\u2152"], /* VULGAR FRACTION ONE TENTH */ + ["\u2153", "\u2153"], /* VULGAR FRACTION ONE THIRD (FRACTION ONE THIRD) */ + ["\u2154", "\u2154"], /* VULGAR FRACTION TWO THIRDS (FRACTION TWO THIRDS) */ + ["\u2155", "\u2155"], /* VULGAR FRACTION ONE FIFTH (FRACTION ONE FIFTH) */ + ["\u2156", "\u2156"], /* VULGAR FRACTION TWO FIFTHS (FRACTION TWO FIFTHS) */ + ["\u2157", "\u2157"], /* VULGAR FRACTION THREE FIFTHS (FRACTION THREE FIFTHS) */ + ["\u2158", "\u2158"], /* VULGAR FRACTION FOUR FIFTHS (FRACTION FOUR FIFTHS) */ + ["\u2159", "\u2159"], /* VULGAR FRACTION ONE SIXTH (FRACTION ONE SIXTH) */ + ["\u215A", "\u215A"], /* VULGAR FRACTION FIVE SIXTHS (FRACTION FIVE SIXTHS) */ + ["\u215B", "\u215B"], /* VULGAR FRACTION ONE EIGHTH (FRACTION ONE EIGHTH) */ + ["\u215C", "\u215C"], /* VULGAR FRACTION THREE EIGHTHS (FRACTION THREE EIGHTHS) */ + ["\u215D", "\u215D"], /* VULGAR FRACTION FIVE EIGHTHS (FRACTION FIVE EIGHTHS) */ + ["\u215E", "\u215E"], /* VULGAR FRACTION SEVEN EIGHTHS (FRACTION SEVEN EIGHTHS) */ + ["\u215F", "\u215F"], /* FRACTION NUMERATOR ONE */ + ["\u2160", "\u2170"], /* ROMAN NUMERAL ONE */ + ["\u2161", "\u2171"], /* ROMAN NUMERAL TWO */ + ["\u2162", "\u2172"], /* ROMAN NUMERAL THREE */ + ["\u2163", "\u2173"], /* ROMAN NUMERAL FOUR */ + ["\u2164", "\u2174"], /* ROMAN NUMERAL FIVE */ + ["\u2165", "\u2175"], /* ROMAN NUMERAL SIX */ + ["\u2166", "\u2176"], /* ROMAN NUMERAL SEVEN */ + ["\u2167", "\u2177"], /* ROMAN NUMERAL EIGHT */ + ["\u2168", "\u2178"], /* ROMAN NUMERAL NINE */ + ["\u2169", "\u2179"], /* ROMAN NUMERAL TEN */ + ["\u216A", "\u217A"], /* ROMAN NUMERAL ELEVEN */ + ["\u216B", "\u217B"], /* ROMAN NUMERAL TWELVE */ + ["\u216C", "\u217C"], /* ROMAN NUMERAL FIFTY */ + ["\u216D", "\u217D"], /* ROMAN NUMERAL ONE HUNDRED */ + ["\u216E", "\u217E"], /* ROMAN NUMERAL FIVE HUNDRED */ + ["\u216F", "\u217F"], /* ROMAN NUMERAL ONE THOUSAND */ + ["\u2160", "\u2170"], /* SMALL ROMAN NUMERAL ONE */ + ["\u2161", "\u2171"], /* SMALL ROMAN NUMERAL TWO */ + ["\u2162", "\u2172"], /* SMALL ROMAN NUMERAL THREE */ + ["\u2163", "\u2173"], /* SMALL ROMAN NUMERAL FOUR */ + ["\u2164", "\u2174"], /* SMALL ROMAN NUMERAL FIVE */ + ["\u2165", "\u2175"], /* SMALL ROMAN NUMERAL SIX */ + ["\u2166", "\u2176"], /* SMALL ROMAN NUMERAL SEVEN */ + ["\u2167", "\u2177"], /* SMALL ROMAN NUMERAL EIGHT */ + ["\u2168", "\u2178"], /* SMALL ROMAN NUMERAL NINE */ + ["\u2169", "\u2179"], /* SMALL ROMAN NUMERAL TEN */ + ["\u216A", "\u217A"], /* SMALL ROMAN NUMERAL ELEVEN */ + ["\u216B", "\u217B"], /* SMALL ROMAN NUMERAL TWELVE */ + ["\u216C", "\u217C"], /* SMALL ROMAN NUMERAL FIFTY */ + ["\u216D", "\u217D"], /* SMALL ROMAN NUMERAL ONE HUNDRED */ + ["\u216E", "\u217E"], /* SMALL ROMAN NUMERAL FIVE HUNDRED */ + ["\u216F", "\u217F"], /* SMALL ROMAN NUMERAL ONE THOUSAND */ + ["\u2180", "\u2180"], /* ROMAN NUMERAL ONE THOUSAND C D */ + ["\u2181", "\u2181"], /* ROMAN NUMERAL FIVE THOUSAND */ + ["\u2182", "\u2182"], /* ROMAN NUMERAL TEN THOUSAND */ + ["\u2183", "\u2184"], /* ROMAN NUMERAL REVERSED ONE HUNDRED */ + ["\u2183", "\u2184"], /* LATIN SMALL LETTER REVERSED C */ + ["\u2185", "\u2185"], /* ROMAN NUMERAL SIX LATE FORM */ + ["\u2186", "\u2186"], /* ROMAN NUMERAL FIFTY EARLY FORM */ + ["\u2187", "\u2187"], /* ROMAN NUMERAL FIFTY THOUSAND */ + ["\u2188", "\u2188"], /* ROMAN NUMERAL ONE HUNDRED THOUSAND */ + ["\u2189", "\u2189"], /* VULGAR FRACTION ZERO THIRDS */ + ["\u218A", "\u218A"], /* TURNED DIGIT TWO */ + ["\u218B", "\u218B"], /* TURNED DIGIT THREE */ + ["\u218C", "\u218C"], + ["\u218D", "\u218D"], + ["\u218E", "\u218E"], + ["\u218F", "\u218F"], + ["\u2190", "\u2190"], /* LEFTWARDS ARROW (LEFT ARROW) */ + ["\u2191", "\u2191"], /* UPWARDS ARROW (UP ARROW) */ + ["\u2192", "\u2192"], /* RIGHTWARDS ARROW (RIGHT ARROW) */ + ["\u2193", "\u2193"], /* DOWNWARDS ARROW (DOWN ARROW) */ + ["\u2194", "\u2194"], /* LEFT RIGHT ARROW */ + ["\u2195", "\u2195"], /* UP DOWN ARROW */ + ["\u2196", "\u2196"], /* NORTH WEST ARROW (UPPER LEFT ARROW) */ + ["\u2197", "\u2197"], /* NORTH EAST ARROW (UPPER RIGHT ARROW) */ + ["\u2198", "\u2198"], /* SOUTH EAST ARROW (LOWER RIGHT ARROW) */ + ["\u2199", "\u2199"], /* SOUTH WEST ARROW (LOWER LEFT ARROW) */ + ["\u219A", "\u219A"], /* LEFTWARDS ARROW WITH STROKE (LEFT ARROW WITH STROKE) */ + ["\u219B", "\u219B"], /* RIGHTWARDS ARROW WITH STROKE (RIGHT ARROW WITH STROKE) */ + ["\u219C", "\u219C"], /* LEFTWARDS WAVE ARROW (LEFT WAVE ARROW) */ + ["\u219D", "\u219D"], /* RIGHTWARDS WAVE ARROW (RIGHT WAVE ARROW) */ + ["\u219E", "\u219E"], /* LEFTWARDS TWO HEADED ARROW (LEFT TWO HEADED ARROW) */ + ["\u219F", "\u219F"], /* UPWARDS TWO HEADED ARROW (UP TWO HEADED ARROW) */ + ["\u21A0", "\u21A0"], /* RIGHTWARDS TWO HEADED ARROW (RIGHT TWO HEADED ARROW) */ + ["\u21A1", "\u21A1"], /* DOWNWARDS TWO HEADED ARROW (DOWN TWO HEADED ARROW) */ + ["\u21A2", "\u21A2"], /* LEFTWARDS ARROW WITH TAIL (LEFT ARROW WITH TAIL) */ + ["\u21A3", "\u21A3"], /* RIGHTWARDS ARROW WITH TAIL (RIGHT ARROW WITH TAIL) */ + ["\u21A4", "\u21A4"], /* LEFTWARDS ARROW FROM BAR (LEFT ARROW FROM BAR) */ + ["\u21A5", "\u21A5"], /* UPWARDS ARROW FROM BAR (UP ARROW FROM BAR) */ + ["\u21A6", "\u21A6"], /* RIGHTWARDS ARROW FROM BAR (RIGHT ARROW FROM BAR) */ + ["\u21A7", "\u21A7"], /* DOWNWARDS ARROW FROM BAR (DOWN ARROW FROM BAR) */ + ["\u21A8", "\u21A8"], /* UP DOWN ARROW WITH BASE */ + ["\u21A9", "\u21A9"], /* LEFTWARDS ARROW WITH HOOK (LEFT ARROW WITH HOOK) */ + ["\u21AA", "\u21AA"], /* RIGHTWARDS ARROW WITH HOOK (RIGHT ARROW WITH HOOK) */ + ["\u21AB", "\u21AB"], /* LEFTWARDS ARROW WITH LOOP (LEFT ARROW WITH LOOP) */ + ["\u21AC", "\u21AC"], /* RIGHTWARDS ARROW WITH LOOP (RIGHT ARROW WITH LOOP) */ + ["\u21AD", "\u21AD"], /* LEFT RIGHT WAVE ARROW */ + ["\u21AE", "\u21AE"], /* LEFT RIGHT ARROW WITH STROKE */ + ["\u21AF", "\u21AF"], /* DOWNWARDS ZIGZAG ARROW (DOWN ZIGZAG ARROW) */ + ["\u21B0", "\u21B0"], /* UPWARDS ARROW WITH TIP LEFTWARDS (UP ARROW WITH TIP LEFT) */ + ["\u21B1", "\u21B1"], /* UPWARDS ARROW WITH TIP RIGHTWARDS (UP ARROW WITH TIP RIGHT) */ + ["\u21B2", "\u21B2"], /* DOWNWARDS ARROW WITH TIP LEFTWARDS (DOWN ARROW WITH TIP LEFT) */ + ["\u21B3", "\u21B3"], /* DOWNWARDS ARROW WITH TIP RIGHTWARDS (DOWN ARROW WITH TIP RIGHT) */ + ["\u21B4", "\u21B4"], /* RIGHTWARDS ARROW WITH CORNER DOWNWARDS (RIGHT ARROW WITH CORNER DOWN) */ + ["\u21B5", "\u21B5"], /* DOWNWARDS ARROW WITH CORNER LEFTWARDS (DOWN ARROW WITH CORNER LEFT) */ + ["\u21B6", "\u21B6"], /* ANTICLOCKWISE TOP SEMICIRCLE ARROW */ + ["\u21B7", "\u21B7"], /* CLOCKWISE TOP SEMICIRCLE ARROW */ + ["\u21B8", "\u21B8"], /* NORTH WEST ARROW TO LONG BAR (UPPER LEFT ARROW TO LONG BAR) */ + ["\u21B9", "\u21B9"], /* LEFTWARDS ARROW TO BAR OVER RIGHTWARDS ARROW TO BAR (LEFT ARROW TO BAR OVER RIGHT ARROW TO BAR) */ + ["\u21BA", "\u21BA"], /* ANTICLOCKWISE OPEN CIRCLE ARROW */ + ["\u21BB", "\u21BB"], /* CLOCKWISE OPEN CIRCLE ARROW */ + ["\u21BC", "\u21BC"], /* LEFTWARDS HARPOON WITH BARB UPWARDS (LEFT HARPOON WITH BARB UP) */ + ["\u21BD", "\u21BD"], /* LEFTWARDS HARPOON WITH BARB DOWNWARDS (LEFT HARPOON WITH BARB DOWN) */ + ["\u21BE", "\u21BE"], /* UPWARDS HARPOON WITH BARB RIGHTWARDS (UP HARPOON WITH BARB RIGHT) */ + ["\u21BF", "\u21BF"], /* UPWARDS HARPOON WITH BARB LEFTWARDS (UP HARPOON WITH BARB LEFT) */ + ["\u21C0", "\u21C0"], /* RIGHTWARDS HARPOON WITH BARB UPWARDS (RIGHT HARPOON WITH BARB UP) */ + ["\u21C1", "\u21C1"], /* RIGHTWARDS HARPOON WITH BARB DOWNWARDS (RIGHT HARPOON WITH BARB DOWN) */ + ["\u21C2", "\u21C2"], /* DOWNWARDS HARPOON WITH BARB RIGHTWARDS (DOWN HARPOON WITH BARB RIGHT) */ + ["\u21C3", "\u21C3"], /* DOWNWARDS HARPOON WITH BARB LEFTWARDS (DOWN HARPOON WITH BARB LEFT) */ + ["\u21C4", "\u21C4"], /* RIGHTWARDS ARROW OVER LEFTWARDS ARROW (RIGHT ARROW OVER LEFT ARROW) */ + ["\u21C5", "\u21C5"], /* UPWARDS ARROW LEFTWARDS OF DOWNWARDS ARROW (UP ARROW LEFT OF DOWN ARROW) */ + ["\u21C6", "\u21C6"], /* LEFTWARDS ARROW OVER RIGHTWARDS ARROW (LEFT ARROW OVER RIGHT ARROW) */ + ["\u21C7", "\u21C7"], /* LEFTWARDS PAIRED ARROWS (LEFT PAIRED ARROWS) */ + ["\u21C8", "\u21C8"], /* UPWARDS PAIRED ARROWS (UP PAIRED ARROWS) */ + ["\u21C9", "\u21C9"], /* RIGHTWARDS PAIRED ARROWS (RIGHT PAIRED ARROWS) */ + ["\u21CA", "\u21CA"], /* DOWNWARDS PAIRED ARROWS (DOWN PAIRED ARROWS) */ + ["\u21CB", "\u21CB"], /* LEFTWARDS HARPOON OVER RIGHTWARDS HARPOON (LEFT HARPOON OVER RIGHT HARPOON) */ + ["\u21CC", "\u21CC"], /* RIGHTWARDS HARPOON OVER LEFTWARDS HARPOON (RIGHT HARPOON OVER LEFT HARPOON) */ + ["\u21CD", "\u21CD"], /* LEFTWARDS DOUBLE ARROW WITH STROKE (LEFT DOUBLE ARROW WITH STROKE) */ + ["\u21CE", "\u21CE"], /* LEFT RIGHT DOUBLE ARROW WITH STROKE */ + ["\u21CF", "\u21CF"], /* RIGHTWARDS DOUBLE ARROW WITH STROKE (RIGHT DOUBLE ARROW WITH STROKE) */ + ["\u21D0", "\u21D0"], /* LEFTWARDS DOUBLE ARROW (LEFT DOUBLE ARROW) */ + ["\u21D1", "\u21D1"], /* UPWARDS DOUBLE ARROW (UP DOUBLE ARROW) */ + ["\u21D2", "\u21D2"], /* RIGHTWARDS DOUBLE ARROW (RIGHT DOUBLE ARROW) */ + ["\u21D3", "\u21D3"], /* DOWNWARDS DOUBLE ARROW (DOWN DOUBLE ARROW) */ + ["\u21D4", "\u21D4"], /* LEFT RIGHT DOUBLE ARROW */ + ["\u21D5", "\u21D5"], /* UP DOWN DOUBLE ARROW */ + ["\u21D6", "\u21D6"], /* NORTH WEST DOUBLE ARROW (UPPER LEFT DOUBLE ARROW) */ + ["\u21D7", "\u21D7"], /* NORTH EAST DOUBLE ARROW (UPPER RIGHT DOUBLE ARROW) */ + ["\u21D8", "\u21D8"], /* SOUTH EAST DOUBLE ARROW (LOWER RIGHT DOUBLE ARROW) */ + ["\u21D9", "\u21D9"], /* SOUTH WEST DOUBLE ARROW (LOWER LEFT DOUBLE ARROW) */ + ["\u21DA", "\u21DA"], /* LEFTWARDS TRIPLE ARROW (LEFT TRIPLE ARROW) */ + ["\u21DB", "\u21DB"], /* RIGHTWARDS TRIPLE ARROW (RIGHT TRIPLE ARROW) */ + ["\u21DC", "\u21DC"], /* LEFTWARDS SQUIGGLE ARROW (LEFT SQUIGGLE ARROW) */ + ["\u21DD", "\u21DD"], /* RIGHTWARDS SQUIGGLE ARROW (RIGHT SQUIGGLE ARROW) */ + ["\u21DE", "\u21DE"], /* UPWARDS ARROW WITH DOUBLE STROKE (UP ARROW WITH DOUBLE STROKE) */ + ["\u21DF", "\u21DF"], /* DOWNWARDS ARROW WITH DOUBLE STROKE (DOWN ARROW WITH DOUBLE STROKE) */ + ["\u21E0", "\u21E0"], /* LEFTWARDS DASHED ARROW (LEFT DASHED ARROW) */ + ["\u21E1", "\u21E1"], /* UPWARDS DASHED ARROW (UP DASHED ARROW) */ + ["\u21E2", "\u21E2"], /* RIGHTWARDS DASHED ARROW (RIGHT DASHED ARROW) */ + ["\u21E3", "\u21E3"], /* DOWNWARDS DASHED ARROW (DOWN DASHED ARROW) */ + ["\u21E4", "\u21E4"], /* LEFTWARDS ARROW TO BAR (LEFT ARROW TO BAR) */ + ["\u21E5", "\u21E5"], /* RIGHTWARDS ARROW TO BAR (RIGHT ARROW TO BAR) */ + ["\u21E6", "\u21E6"], /* LEFTWARDS WHITE ARROW (WHITE LEFT ARROW) */ + ["\u21E7", "\u21E7"], /* UPWARDS WHITE ARROW (WHITE UP ARROW) */ + ["\u21E8", "\u21E8"], /* RIGHTWARDS WHITE ARROW (WHITE RIGHT ARROW) */ + ["\u21E9", "\u21E9"], /* DOWNWARDS WHITE ARROW (WHITE DOWN ARROW) */ + ["\u21EA", "\u21EA"], /* UPWARDS WHITE ARROW FROM BAR (WHITE UP ARROW FROM BAR) */ + ["\u21EB", "\u21EB"], /* UPWARDS WHITE ARROW ON PEDESTAL */ + ["\u21EC", "\u21EC"], /* UPWARDS WHITE ARROW ON PEDESTAL WITH HORIZONTAL BAR */ + ["\u21ED", "\u21ED"], /* UPWARDS WHITE ARROW ON PEDESTAL WITH VERTICAL BAR */ + ["\u21EE", "\u21EE"], /* UPWARDS WHITE DOUBLE ARROW */ + ["\u21EF", "\u21EF"], /* UPWARDS WHITE DOUBLE ARROW ON PEDESTAL */ + ["\u21F0", "\u21F0"], /* RIGHTWARDS WHITE ARROW FROM WALL */ + ["\u21F1", "\u21F1"], /* NORTH WEST ARROW TO CORNER */ + ["\u21F2", "\u21F2"], /* SOUTH EAST ARROW TO CORNER */ + ["\u21F3", "\u21F3"], /* UP DOWN WHITE ARROW */ + ["\u21F4", "\u21F4"], /* RIGHT ARROW WITH SMALL CIRCLE */ + ["\u21F5", "\u21F5"], /* DOWNWARDS ARROW LEFTWARDS OF UPWARDS ARROW */ + ["\u21F6", "\u21F6"], /* THREE RIGHTWARDS ARROWS */ + ["\u21F7", "\u21F7"], /* LEFTWARDS ARROW WITH VERTICAL STROKE */ + ["\u21F8", "\u21F8"], /* RIGHTWARDS ARROW WITH VERTICAL STROKE */ + ["\u21F9", "\u21F9"], /* LEFT RIGHT ARROW WITH VERTICAL STROKE */ + ["\u21FA", "\u21FA"], /* LEFTWARDS ARROW WITH DOUBLE VERTICAL STROKE */ + ["\u21FB", "\u21FB"], /* RIGHTWARDS ARROW WITH DOUBLE VERTICAL STROKE */ + ["\u21FC", "\u21FC"], /* LEFT RIGHT ARROW WITH DOUBLE VERTICAL STROKE */ + ["\u21FD", "\u21FD"], /* LEFTWARDS OPEN-HEADED ARROW */ + ["\u21FE", "\u21FE"], /* RIGHTWARDS OPEN-HEADED ARROW */ + ["\u21FF", "\u21FF"], /* LEFT RIGHT OPEN-HEADED ARROW */ + ["\u2200", "\u2200"], /* FOR ALL */ + ["\u2201", "\u2201"], /* COMPLEMENT */ + ["\u2202", "\u2202"], /* PARTIAL DIFFERENTIAL */ + ["\u2203", "\u2203"], /* THERE EXISTS */ + ["\u2204", "\u2204"], /* THERE DOES NOT EXIST */ + ["\u2205", "\u2205"], /* EMPTY SET */ + ["\u2206", "\u2206"], /* INCREMENT */ + ["\u2207", "\u2207"], /* NABLA */ + ["\u2208", "\u2208"], /* ELEMENT OF */ + ["\u2209", "\u2209"], /* NOT AN ELEMENT OF */ + ["\u220A", "\u220A"], /* SMALL ELEMENT OF */ + ["\u220B", "\u220B"], /* CONTAINS AS MEMBER */ + ["\u220C", "\u220C"], /* DOES NOT CONTAIN AS MEMBER */ + ["\u220D", "\u220D"], /* SMALL CONTAINS AS MEMBER */ + ["\u220E", "\u220E"], /* END OF PROOF */ + ["\u220F", "\u220F"], /* N-ARY PRODUCT */ + ["\u2210", "\u2210"], /* N-ARY COPRODUCT */ + ["\u2211", "\u2211"], /* N-ARY SUMMATION */ + ["\u2212", "\u2212"], /* MINUS SIGN */ + ["\u2213", "\u2213"], /* MINUS-OR-PLUS SIGN */ + ["\u2214", "\u2214"], /* DOT PLUS */ + ["\u2215", "\u2215"], /* DIVISION SLASH */ + ["\u2216", "\u2216"], /* SET MINUS */ + ["\u2217", "\u2217"], /* ASTERISK OPERATOR */ + ["\u2218", "\u2218"], /* RING OPERATOR */ + ["\u2219", "\u2219"], /* BULLET OPERATOR */ + ["\u221A", "\u221A"], /* SQUARE ROOT */ + ["\u221B", "\u221B"], /* CUBE ROOT */ + ["\u221C", "\u221C"], /* FOURTH ROOT */ + ["\u221D", "\u221D"], /* PROPORTIONAL TO */ + ["\u221E", "\u221E"], /* INFINITY */ + ["\u221F", "\u221F"], /* RIGHT ANGLE */ + ["\u2220", "\u2220"], /* ANGLE */ + ["\u2221", "\u2221"], /* MEASURED ANGLE */ + ["\u2222", "\u2222"], /* SPHERICAL ANGLE */ + ["\u2223", "\u2223"], /* DIVIDES */ + ["\u2224", "\u2224"], /* DOES NOT DIVIDE */ + ["\u2225", "\u2225"], /* PARALLEL TO */ + ["\u2226", "\u2226"], /* NOT PARALLEL TO */ + ["\u2227", "\u2227"], /* LOGICAL AND */ + ["\u2228", "\u2228"], /* LOGICAL OR */ + ["\u2229", "\u2229"], /* INTERSECTION */ + ["\u222A", "\u222A"], /* UNION */ + ["\u222B", "\u222B"], /* INTEGRAL */ + ["\u222C", "\u222C"], /* DOUBLE INTEGRAL */ + ["\u222D", "\u222D"], /* TRIPLE INTEGRAL */ + ["\u222E", "\u222E"], /* CONTOUR INTEGRAL */ + ["\u222F", "\u222F"], /* SURFACE INTEGRAL */ + ["\u2230", "\u2230"], /* VOLUME INTEGRAL */ + ["\u2231", "\u2231"], /* CLOCKWISE INTEGRAL */ + ["\u2232", "\u2232"], /* CLOCKWISE CONTOUR INTEGRAL */ + ["\u2233", "\u2233"], /* ANTICLOCKWISE CONTOUR INTEGRAL */ + ["\u2234", "\u2234"], /* THEREFORE */ + ["\u2235", "\u2235"], /* BECAUSE */ + ["\u2236", "\u2236"], /* RATIO */ + ["\u2237", "\u2237"], /* PROPORTION */ + ["\u2238", "\u2238"], /* DOT MINUS */ + ["\u2239", "\u2239"], /* EXCESS */ + ["\u223A", "\u223A"], /* GEOMETRIC PROPORTION */ + ["\u223B", "\u223B"], /* HOMOTHETIC */ + ["\u223C", "\u223C"], /* TILDE OPERATOR */ + ["\u223D", "\u223D"], /* REVERSED TILDE */ + ["\u223E", "\u223E"], /* INVERTED LAZY S */ + ["\u223F", "\u223F"], /* SINE WAVE */ + ["\u2240", "\u2240"], /* WREATH PRODUCT */ + ["\u2241", "\u2241"], /* NOT TILDE */ + ["\u2242", "\u2242"], /* MINUS TILDE */ + ["\u2243", "\u2243"], /* ASYMPTOTICALLY EQUAL TO */ + ["\u2244", "\u2244"], /* NOT ASYMPTOTICALLY EQUAL TO */ + ["\u2245", "\u2245"], /* APPROXIMATELY EQUAL TO */ + ["\u2246", "\u2246"], /* APPROXIMATELY BUT NOT ACTUALLY EQUAL TO */ + ["\u2247", "\u2247"], /* NEITHER APPROXIMATELY NOR ACTUALLY EQUAL TO */ + ["\u2248", "\u2248"], /* ALMOST EQUAL TO */ + ["\u2249", "\u2249"], /* NOT ALMOST EQUAL TO */ + ["\u224A", "\u224A"], /* ALMOST EQUAL OR EQUAL TO */ + ["\u224B", "\u224B"], /* TRIPLE TILDE */ + ["\u224C", "\u224C"], /* ALL EQUAL TO */ + ["\u224D", "\u224D"], /* EQUIVALENT TO */ + ["\u224E", "\u224E"], /* GEOMETRICALLY EQUIVALENT TO */ + ["\u224F", "\u224F"], /* DIFFERENCE BETWEEN */ + ["\u2250", "\u2250"], /* APPROACHES THE LIMIT */ + ["\u2251", "\u2251"], /* GEOMETRICALLY EQUAL TO */ + ["\u2252", "\u2252"], /* APPROXIMATELY EQUAL TO OR THE IMAGE OF */ + ["\u2253", "\u2253"], /* IMAGE OF OR APPROXIMATELY EQUAL TO */ + ["\u2254", "\u2254"], /* COLON EQUALS (COLON EQUAL) */ + ["\u2255", "\u2255"], /* EQUALS COLON (EQUAL COLON) */ + ["\u2256", "\u2256"], /* RING IN EQUAL TO */ + ["\u2257", "\u2257"], /* RING EQUAL TO */ + ["\u2258", "\u2258"], /* CORRESPONDS TO */ + ["\u2259", "\u2259"], /* ESTIMATES */ + ["\u225A", "\u225A"], /* EQUIANGULAR TO */ + ["\u225B", "\u225B"], /* STAR EQUALS */ + ["\u225C", "\u225C"], /* DELTA EQUAL TO */ + ["\u225D", "\u225D"], /* EQUAL TO BY DEFINITION */ + ["\u225E", "\u225E"], /* MEASURED BY */ + ["\u225F", "\u225F"], /* QUESTIONED EQUAL TO */ + ["\u2260", "\u2260"], /* NOT EQUAL TO */ + ["\u2261", "\u2261"], /* IDENTICAL TO */ + ["\u2262", "\u2262"], /* NOT IDENTICAL TO */ + ["\u2263", "\u2263"], /* STRICTLY EQUIVALENT TO */ + ["\u2264", "\u2264"], /* LESS-THAN OR EQUAL TO (LESS THAN OR EQUAL TO) */ + ["\u2265", "\u2265"], /* GREATER-THAN OR EQUAL TO (GREATER THAN OR EQUAL TO) */ + ["\u2266", "\u2266"], /* LESS-THAN OVER EQUAL TO (LESS THAN OVER EQUAL TO) */ + ["\u2267", "\u2267"], /* GREATER-THAN OVER EQUAL TO (GREATER THAN OVER EQUAL TO) */ + ["\u2268", "\u2268"], /* LESS-THAN BUT NOT EQUAL TO (LESS THAN BUT NOT EQUAL TO) */ + ["\u2269", "\u2269"], /* GREATER-THAN BUT NOT EQUAL TO (GREATER THAN BUT NOT EQUAL TO) */ + ["\u226A", "\u226A"], /* MUCH LESS-THAN (MUCH LESS THAN) */ + ["\u226B", "\u226B"], /* MUCH GREATER-THAN (MUCH GREATER THAN) */ + ["\u226C", "\u226C"], /* BETWEEN */ + ["\u226D", "\u226D"], /* NOT EQUIVALENT TO */ + ["\u226E", "\u226E"], /* NOT LESS-THAN (NOT LESS THAN) */ + ["\u226F", "\u226F"], /* NOT GREATER-THAN (NOT GREATER THAN) */ + ["\u2270", "\u2270"], /* NEITHER LESS-THAN NOR EQUAL TO (NEITHER LESS THAN NOR EQUAL TO) */ + ["\u2271", "\u2271"], /* NEITHER GREATER-THAN NOR EQUAL TO (NEITHER GREATER THAN NOR EQUAL TO) */ + ["\u2272", "\u2272"], /* LESS-THAN OR EQUIVALENT TO (LESS THAN OR EQUIVALENT TO) */ + ["\u2273", "\u2273"], /* GREATER-THAN OR EQUIVALENT TO (GREATER THAN OR EQUIVALENT TO) */ + ["\u2274", "\u2274"], /* NEITHER LESS-THAN NOR EQUIVALENT TO (NEITHER LESS THAN NOR EQUIVALENT TO) */ + ["\u2275", "\u2275"], /* NEITHER GREATER-THAN NOR EQUIVALENT TO (NEITHER GREATER THAN NOR EQUIVALENT TO) */ + ["\u2276", "\u2276"], /* LESS-THAN OR GREATER-THAN (LESS THAN OR GREATER THAN) */ + ["\u2277", "\u2277"], /* GREATER-THAN OR LESS-THAN (GREATER THAN OR LESS THAN) */ + ["\u2278", "\u2278"], /* NEITHER LESS-THAN NOR GREATER-THAN (NEITHER LESS THAN NOR GREATER THAN) */ + ["\u2279", "\u2279"], /* NEITHER GREATER-THAN NOR LESS-THAN (NEITHER GREATER THAN NOR LESS THAN) */ + ["\u227A", "\u227A"], /* PRECEDES */ + ["\u227B", "\u227B"], /* SUCCEEDS */ + ["\u227C", "\u227C"], /* PRECEDES OR EQUAL TO */ + ["\u227D", "\u227D"], /* SUCCEEDS OR EQUAL TO */ + ["\u227E", "\u227E"], /* PRECEDES OR EQUIVALENT TO */ + ["\u227F", "\u227F"], /* SUCCEEDS OR EQUIVALENT TO */ + ["\u2280", "\u2280"], /* DOES NOT PRECEDE */ + ["\u2281", "\u2281"], /* DOES NOT SUCCEED */ + ["\u2282", "\u2282"], /* SUBSET OF */ + ["\u2283", "\u2283"], /* SUPERSET OF */ + ["\u2284", "\u2284"], /* NOT A SUBSET OF */ + ["\u2285", "\u2285"], /* NOT A SUPERSET OF */ + ["\u2286", "\u2286"], /* SUBSET OF OR EQUAL TO */ + ["\u2287", "\u2287"], /* SUPERSET OF OR EQUAL TO */ + ["\u2288", "\u2288"], /* NEITHER A SUBSET OF NOR EQUAL TO */ + ["\u2289", "\u2289"], /* NEITHER A SUPERSET OF NOR EQUAL TO */ + ["\u228A", "\u228A"], /* SUBSET OF WITH NOT EQUAL TO (SUBSET OF OR NOT EQUAL TO) */ + ["\u228B", "\u228B"], /* SUPERSET OF WITH NOT EQUAL TO (SUPERSET OF OR NOT EQUAL TO) */ + ["\u228C", "\u228C"], /* MULTISET */ + ["\u228D", "\u228D"], /* MULTISET MULTIPLICATION */ + ["\u228E", "\u228E"], /* MULTISET UNION */ + ["\u228F", "\u228F"], /* SQUARE IMAGE OF */ + ["\u2290", "\u2290"], /* SQUARE ORIGINAL OF */ + ["\u2291", "\u2291"], /* SQUARE IMAGE OF OR EQUAL TO */ + ["\u2292", "\u2292"], /* SQUARE ORIGINAL OF OR EQUAL TO */ + ["\u2293", "\u2293"], /* SQUARE CAP */ + ["\u2294", "\u2294"], /* SQUARE CUP */ + ["\u2295", "\u2295"], /* CIRCLED PLUS */ + ["\u2296", "\u2296"], /* CIRCLED MINUS */ + ["\u2297", "\u2297"], /* CIRCLED TIMES */ + ["\u2298", "\u2298"], /* CIRCLED DIVISION SLASH */ + ["\u2299", "\u2299"], /* CIRCLED DOT OPERATOR */ + ["\u229A", "\u229A"], /* CIRCLED RING OPERATOR */ + ["\u229B", "\u229B"], /* CIRCLED ASTERISK OPERATOR */ + ["\u229C", "\u229C"], /* CIRCLED EQUALS */ + ["\u229D", "\u229D"], /* CIRCLED DASH */ + ["\u229E", "\u229E"], /* SQUARED PLUS */ + ["\u229F", "\u229F"], /* SQUARED MINUS */ + ["\u22A0", "\u22A0"], /* SQUARED TIMES */ + ["\u22A1", "\u22A1"], /* SQUARED DOT OPERATOR */ + ["\u22A2", "\u22A2"], /* RIGHT TACK */ + ["\u22A3", "\u22A3"], /* LEFT TACK */ + ["\u22A4", "\u22A4"], /* DOWN TACK */ + ["\u22A5", "\u22A5"], /* UP TACK */ + ["\u22A6", "\u22A6"], /* ASSERTION */ + ["\u22A7", "\u22A7"], /* MODELS */ + ["\u22A8", "\u22A8"], /* TRUE */ + ["\u22A9", "\u22A9"], /* FORCES */ + ["\u22AA", "\u22AA"], /* TRIPLE VERTICAL BAR RIGHT TURNSTILE */ + ["\u22AB", "\u22AB"], /* DOUBLE VERTICAL BAR DOUBLE RIGHT TURNSTILE */ + ["\u22AC", "\u22AC"], /* DOES NOT PROVE */ + ["\u22AD", "\u22AD"], /* NOT TRUE */ + ["\u22AE", "\u22AE"], /* DOES NOT FORCE */ + ["\u22AF", "\u22AF"], /* NEGATED DOUBLE VERTICAL BAR DOUBLE RIGHT TURNSTILE */ + ["\u22B0", "\u22B0"], /* PRECEDES UNDER RELATION */ + ["\u22B1", "\u22B1"], /* SUCCEEDS UNDER RELATION */ + ["\u22B2", "\u22B2"], /* NORMAL SUBGROUP OF */ + ["\u22B3", "\u22B3"], /* CONTAINS AS NORMAL SUBGROUP */ + ["\u22B4", "\u22B4"], /* NORMAL SUBGROUP OF OR EQUAL TO */ + ["\u22B5", "\u22B5"], /* CONTAINS AS NORMAL SUBGROUP OR EQUAL TO */ + ["\u22B6", "\u22B6"], /* ORIGINAL OF */ + ["\u22B7", "\u22B7"], /* IMAGE OF */ + ["\u22B8", "\u22B8"], /* MULTIMAP */ + ["\u22B9", "\u22B9"], /* HERMITIAN CONJUGATE MATRIX */ + ["\u22BA", "\u22BA"], /* INTERCALATE */ + ["\u22BB", "\u22BB"], /* XOR */ + ["\u22BC", "\u22BC"], /* NAND */ + ["\u22BD", "\u22BD"], /* NOR */ + ["\u22BE", "\u22BE"], /* RIGHT ANGLE WITH ARC */ + ["\u22BF", "\u22BF"], /* RIGHT TRIANGLE */ + ["\u22C0", "\u22C0"], /* N-ARY LOGICAL AND */ + ["\u22C1", "\u22C1"], /* N-ARY LOGICAL OR */ + ["\u22C2", "\u22C2"], /* N-ARY INTERSECTION */ + ["\u22C3", "\u22C3"], /* N-ARY UNION */ + ["\u22C4", "\u22C4"], /* DIAMOND OPERATOR */ + ["\u22C5", "\u22C5"], /* DOT OPERATOR */ + ["\u22C6", "\u22C6"], /* STAR OPERATOR */ + ["\u22C7", "\u22C7"], /* DIVISION TIMES */ + ["\u22C8", "\u22C8"], /* BOWTIE */ + ["\u22C9", "\u22C9"], /* LEFT NORMAL FACTOR SEMIDIRECT PRODUCT */ + ["\u22CA", "\u22CA"], /* RIGHT NORMAL FACTOR SEMIDIRECT PRODUCT */ + ["\u22CB", "\u22CB"], /* LEFT SEMIDIRECT PRODUCT */ + ["\u22CC", "\u22CC"], /* RIGHT SEMIDIRECT PRODUCT */ + ["\u22CD", "\u22CD"], /* REVERSED TILDE EQUALS */ + ["\u22CE", "\u22CE"], /* CURLY LOGICAL OR */ + ["\u22CF", "\u22CF"], /* CURLY LOGICAL AND */ + ["\u22D0", "\u22D0"], /* DOUBLE SUBSET */ + ["\u22D1", "\u22D1"], /* DOUBLE SUPERSET */ + ["\u22D2", "\u22D2"], /* DOUBLE INTERSECTION */ + ["\u22D3", "\u22D3"], /* DOUBLE UNION */ + ["\u22D4", "\u22D4"], /* PITCHFORK */ + ["\u22D5", "\u22D5"], /* EQUAL AND PARALLEL TO */ + ["\u22D6", "\u22D6"], /* LESS-THAN WITH DOT (LESS THAN WITH DOT) */ + ["\u22D7", "\u22D7"], /* GREATER-THAN WITH DOT (GREATER THAN WITH DOT) */ + ["\u22D8", "\u22D8"], /* VERY MUCH LESS-THAN (VERY MUCH LESS THAN) */ + ["\u22D9", "\u22D9"], /* VERY MUCH GREATER-THAN (VERY MUCH GREATER THAN) */ + ["\u22DA", "\u22DA"], /* LESS-THAN EQUAL TO OR GREATER-THAN (LESS THAN EQUAL TO OR GREATER THAN) */ + ["\u22DB", "\u22DB"], /* GREATER-THAN EQUAL TO OR LESS-THAN (GREATER THAN EQUAL TO OR LESS THAN) */ + ["\u22DC", "\u22DC"], /* EQUAL TO OR LESS-THAN (EQUAL TO OR LESS THAN) */ + ["\u22DD", "\u22DD"], /* EQUAL TO OR GREATER-THAN (EQUAL TO OR GREATER THAN) */ + ["\u22DE", "\u22DE"], /* EQUAL TO OR PRECEDES */ + ["\u22DF", "\u22DF"], /* EQUAL TO OR SUCCEEDS */ + ["\u22E0", "\u22E0"], /* DOES NOT PRECEDE OR EQUAL */ + ["\u22E1", "\u22E1"], /* DOES NOT SUCCEED OR EQUAL */ + ["\u22E2", "\u22E2"], /* NOT SQUARE IMAGE OF OR EQUAL TO */ + ["\u22E3", "\u22E3"], /* NOT SQUARE ORIGINAL OF OR EQUAL TO */ + ["\u22E4", "\u22E4"], /* SQUARE IMAGE OF OR NOT EQUAL TO */ + ["\u22E5", "\u22E5"], /* SQUARE ORIGINAL OF OR NOT EQUAL TO */ + ["\u22E6", "\u22E6"], /* LESS-THAN BUT NOT EQUIVALENT TO (LESS THAN BUT NOT EQUIVALENT TO) */ + ["\u22E7", "\u22E7"], /* GREATER-THAN BUT NOT EQUIVALENT TO (GREATER THAN BUT NOT EQUIVALENT TO) */ + ["\u22E8", "\u22E8"], /* PRECEDES BUT NOT EQUIVALENT TO */ + ["\u22E9", "\u22E9"], /* SUCCEEDS BUT NOT EQUIVALENT TO */ + ["\u22EA", "\u22EA"], /* NOT NORMAL SUBGROUP OF */ + ["\u22EB", "\u22EB"], /* DOES NOT CONTAIN AS NORMAL SUBGROUP */ + ["\u22EC", "\u22EC"], /* NOT NORMAL SUBGROUP OF OR EQUAL TO */ + ["\u22ED", "\u22ED"], /* DOES NOT CONTAIN AS NORMAL SUBGROUP OR EQUAL */ + ["\u22EE", "\u22EE"], /* VERTICAL ELLIPSIS */ + ["\u22EF", "\u22EF"], /* MIDLINE HORIZONTAL ELLIPSIS */ + ["\u22F0", "\u22F0"], /* UP RIGHT DIAGONAL ELLIPSIS */ + ["\u22F1", "\u22F1"], /* DOWN RIGHT DIAGONAL ELLIPSIS */ + ["\u22F2", "\u22F2"], /* ELEMENT OF WITH LONG HORIZONTAL STROKE */ + ["\u22F3", "\u22F3"], /* ELEMENT OF WITH VERTICAL BAR AT END OF HORIZONTAL STROKE */ + ["\u22F4", "\u22F4"], /* SMALL ELEMENT OF WITH VERTICAL BAR AT END OF HORIZONTAL STROKE */ + ["\u22F5", "\u22F5"], /* ELEMENT OF WITH DOT ABOVE */ + ["\u22F6", "\u22F6"], /* ELEMENT OF WITH OVERBAR */ + ["\u22F7", "\u22F7"], /* SMALL ELEMENT OF WITH OVERBAR */ + ["\u22F8", "\u22F8"], /* ELEMENT OF WITH UNDERBAR */ + ["\u22F9", "\u22F9"], /* ELEMENT OF WITH TWO HORIZONTAL STROKES */ + ["\u22FA", "\u22FA"], /* CONTAINS WITH LONG HORIZONTAL STROKE */ + ["\u22FB", "\u22FB"], /* CONTAINS WITH VERTICAL BAR AT END OF HORIZONTAL STROKE */ + ["\u22FC", "\u22FC"], /* SMALL CONTAINS WITH VERTICAL BAR AT END OF HORIZONTAL STROKE */ + ["\u22FD", "\u22FD"], /* CONTAINS WITH OVERBAR */ + ["\u22FE", "\u22FE"], /* SMALL CONTAINS WITH OVERBAR */ + ["\u22FF", "\u22FF"], /* Z NOTATION BAG MEMBERSHIP */ + ["\u2300", "\u2300"], /* DIAMETER SIGN */ + ["\u2301", "\u2301"], /* ELECTRIC ARROW */ + ["\u2302", "\u2302"], /* HOUSE */ + ["\u2303", "\u2303"], /* UP ARROWHEAD */ + ["\u2304", "\u2304"], /* DOWN ARROWHEAD */ + ["\u2305", "\u2305"], /* PROJECTIVE */ + ["\u2306", "\u2306"], /* PERSPECTIVE */ + ["\u2307", "\u2307"], /* WAVY LINE */ + ["\u2308", "\u2308"], /* LEFT CEILING */ + ["\u2309", "\u2309"], /* RIGHT CEILING */ + ["\u230A", "\u230A"], /* LEFT FLOOR */ + ["\u230B", "\u230B"], /* RIGHT FLOOR */ + ["\u230C", "\u230C"], /* BOTTOM RIGHT CROP */ + ["\u230D", "\u230D"], /* BOTTOM LEFT CROP */ + ["\u230E", "\u230E"], /* TOP RIGHT CROP */ + ["\u230F", "\u230F"], /* TOP LEFT CROP */ + ["\u2310", "\u2310"], /* REVERSED NOT SIGN */ + ["\u2311", "\u2311"], /* SQUARE LOZENGE */ + ["\u2312", "\u2312"], /* ARC */ + ["\u2313", "\u2313"], /* SEGMENT */ + ["\u2314", "\u2314"], /* SECTOR */ + ["\u2315", "\u2315"], /* TELEPHONE RECORDER */ + ["\u2316", "\u2316"], /* POSITION INDICATOR */ + ["\u2317", "\u2317"], /* VIEWDATA SQUARE */ + ["\u2318", "\u2318"], /* PLACE OF INTEREST SIGN (COMMAND KEY) */ + ["\u2319", "\u2319"], /* TURNED NOT SIGN */ + ["\u231A", "\u231A"], /* WATCH */ + ["\u231B", "\u231B"], /* HOURGLASS */ + ["\u231C", "\u231C"], /* TOP LEFT CORNER */ + ["\u231D", "\u231D"], /* TOP RIGHT CORNER */ + ["\u231E", "\u231E"], /* BOTTOM LEFT CORNER */ + ["\u231F", "\u231F"], /* BOTTOM RIGHT CORNER */ + ["\u2320", "\u2320"], /* TOP HALF INTEGRAL */ + ["\u2321", "\u2321"], /* BOTTOM HALF INTEGRAL */ + ["\u2322", "\u2322"], /* FROWN */ + ["\u2323", "\u2323"], /* SMILE */ + ["\u2324", "\u2324"], /* UP ARROWHEAD BETWEEN TWO HORIZONTAL BARS (ENTER KEY) */ + ["\u2325", "\u2325"], /* OPTION KEY */ + ["\u2326", "\u2326"], /* ERASE TO THE RIGHT (DELETE TO THE RIGHT KEY) */ + ["\u2327", "\u2327"], /* X IN A RECTANGLE BOX (CLEAR KEY) */ + ["\u2328", "\u2328"], /* KEYBOARD */ + ["\u2329", "\u2329"], /* LEFT-POINTING ANGLE BRACKET (BRA) */ + ["\u232A", "\u232A"], /* RIGHT-POINTING ANGLE BRACKET (KET) */ + ["\u232B", "\u232B"], /* ERASE TO THE LEFT (DELETE TO THE LEFT KEY) */ + ["\u232C", "\u232C"], /* BENZENE RING */ + ["\u232D", "\u232D"], /* CYLINDRICITY */ + ["\u232E", "\u232E"], /* ALL AROUND-PROFILE */ + ["\u232F", "\u232F"], /* SYMMETRY */ + ["\u2330", "\u2330"], /* TOTAL RUNOUT */ + ["\u2331", "\u2331"], /* DIMENSION ORIGIN */ + ["\u2332", "\u2332"], /* CONICAL TAPER */ + ["\u2333", "\u2333"], /* SLOPE */ + ["\u2334", "\u2334"], /* COUNTERBORE */ + ["\u2335", "\u2335"], /* COUNTERSINK */ + ["\u2336", "\u2336"], /* APL FUNCTIONAL SYMBOL I-BEAM */ + ["\u2337", "\u2337"], /* APL FUNCTIONAL SYMBOL SQUISH QUAD */ + ["\u2338", "\u2338"], /* APL FUNCTIONAL SYMBOL QUAD EQUAL */ + ["\u2339", "\u2339"], /* APL FUNCTIONAL SYMBOL QUAD DIVIDE */ + ["\u233A", "\u233A"], /* APL FUNCTIONAL SYMBOL QUAD DIAMOND */ + ["\u233B", "\u233B"], /* APL FUNCTIONAL SYMBOL QUAD JOT */ + ["\u233C", "\u233C"], /* APL FUNCTIONAL SYMBOL QUAD CIRCLE */ + ["\u233D", "\u233D"], /* APL FUNCTIONAL SYMBOL CIRCLE STILE */ + ["\u233E", "\u233E"], /* APL FUNCTIONAL SYMBOL CIRCLE JOT */ + ["\u233F", "\u233F"], /* APL FUNCTIONAL SYMBOL SLASH BAR */ + ["\u2340", "\u2340"], /* APL FUNCTIONAL SYMBOL BACKSLASH BAR */ + ["\u2341", "\u2341"], /* APL FUNCTIONAL SYMBOL QUAD SLASH */ + ["\u2342", "\u2342"], /* APL FUNCTIONAL SYMBOL QUAD BACKSLASH */ + ["\u2343", "\u2343"], /* APL FUNCTIONAL SYMBOL QUAD LESS-THAN */ + ["\u2344", "\u2344"], /* APL FUNCTIONAL SYMBOL QUAD GREATER-THAN */ + ["\u2345", "\u2345"], /* APL FUNCTIONAL SYMBOL LEFTWARDS VANE */ + ["\u2346", "\u2346"], /* APL FUNCTIONAL SYMBOL RIGHTWARDS VANE */ + ["\u2347", "\u2347"], /* APL FUNCTIONAL SYMBOL QUAD LEFTWARDS ARROW */ + ["\u2348", "\u2348"], /* APL FUNCTIONAL SYMBOL QUAD RIGHTWARDS ARROW */ + ["\u2349", "\u2349"], /* APL FUNCTIONAL SYMBOL CIRCLE BACKSLASH */ + ["\u234A", "\u234A"], /* APL FUNCTIONAL SYMBOL DOWN TACK UNDERBAR */ + ["\u234B", "\u234B"], /* APL FUNCTIONAL SYMBOL DELTA STILE */ + ["\u234C", "\u234C"], /* APL FUNCTIONAL SYMBOL QUAD DOWN CARET */ + ["\u234D", "\u234D"], /* APL FUNCTIONAL SYMBOL QUAD DELTA */ + ["\u234E", "\u234E"], /* APL FUNCTIONAL SYMBOL DOWN TACK JOT */ + ["\u234F", "\u234F"], /* APL FUNCTIONAL SYMBOL UPWARDS VANE */ + ["\u2350", "\u2350"], /* APL FUNCTIONAL SYMBOL QUAD UPWARDS ARROW */ + ["\u2351", "\u2351"], /* APL FUNCTIONAL SYMBOL UP TACK OVERBAR */ + ["\u2352", "\u2352"], /* APL FUNCTIONAL SYMBOL DEL STILE */ + ["\u2353", "\u2353"], /* APL FUNCTIONAL SYMBOL QUAD UP CARET */ + ["\u2354", "\u2354"], /* APL FUNCTIONAL SYMBOL QUAD DEL */ + ["\u2355", "\u2355"], /* APL FUNCTIONAL SYMBOL UP TACK JOT */ + ["\u2356", "\u2356"], /* APL FUNCTIONAL SYMBOL DOWNWARDS VANE */ + ["\u2357", "\u2357"], /* APL FUNCTIONAL SYMBOL QUAD DOWNWARDS ARROW */ + ["\u2358", "\u2358"], /* APL FUNCTIONAL SYMBOL QUOTE UNDERBAR */ + ["\u2359", "\u2359"], /* APL FUNCTIONAL SYMBOL DELTA UNDERBAR */ + ["\u235A", "\u235A"], /* APL FUNCTIONAL SYMBOL DIAMOND UNDERBAR */ + ["\u235B", "\u235B"], /* APL FUNCTIONAL SYMBOL JOT UNDERBAR */ + ["\u235C", "\u235C"], /* APL FUNCTIONAL SYMBOL CIRCLE UNDERBAR */ + ["\u235D", "\u235D"], /* APL FUNCTIONAL SYMBOL UP SHOE JOT */ + ["\u235E", "\u235E"], /* APL FUNCTIONAL SYMBOL QUOTE QUAD */ + ["\u235F", "\u235F"], /* APL FUNCTIONAL SYMBOL CIRCLE STAR */ + ["\u2360", "\u2360"], /* APL FUNCTIONAL SYMBOL QUAD COLON */ + ["\u2361", "\u2361"], /* APL FUNCTIONAL SYMBOL UP TACK DIAERESIS */ + ["\u2362", "\u2362"], /* APL FUNCTIONAL SYMBOL DEL DIAERESIS */ + ["\u2363", "\u2363"], /* APL FUNCTIONAL SYMBOL STAR DIAERESIS */ + ["\u2364", "\u2364"], /* APL FUNCTIONAL SYMBOL JOT DIAERESIS */ + ["\u2365", "\u2365"], /* APL FUNCTIONAL SYMBOL CIRCLE DIAERESIS */ + ["\u2366", "\u2366"], /* APL FUNCTIONAL SYMBOL DOWN SHOE STILE */ + ["\u2367", "\u2367"], /* APL FUNCTIONAL SYMBOL LEFT SHOE STILE */ + ["\u2368", "\u2368"], /* APL FUNCTIONAL SYMBOL TILDE DIAERESIS */ + ["\u2369", "\u2369"], /* APL FUNCTIONAL SYMBOL GREATER-THAN DIAERESIS */ + ["\u236A", "\u236A"], /* APL FUNCTIONAL SYMBOL COMMA BAR */ + ["\u236B", "\u236B"], /* APL FUNCTIONAL SYMBOL DEL TILDE */ + ["\u236C", "\u236C"], /* APL FUNCTIONAL SYMBOL ZILDE */ + ["\u236D", "\u236D"], /* APL FUNCTIONAL SYMBOL STILE TILDE */ + ["\u236E", "\u236E"], /* APL FUNCTIONAL SYMBOL SEMICOLON UNDERBAR */ + ["\u236F", "\u236F"], /* APL FUNCTIONAL SYMBOL QUAD NOT EQUAL */ + ["\u2370", "\u2370"], /* APL FUNCTIONAL SYMBOL QUAD QUESTION */ + ["\u2371", "\u2371"], /* APL FUNCTIONAL SYMBOL DOWN CARET TILDE */ + ["\u2372", "\u2372"], /* APL FUNCTIONAL SYMBOL UP CARET TILDE */ + ["\u2373", "\u2373"], /* APL FUNCTIONAL SYMBOL IOTA */ + ["\u2374", "\u2374"], /* APL FUNCTIONAL SYMBOL RHO */ + ["\u2375", "\u2375"], /* APL FUNCTIONAL SYMBOL OMEGA */ + ["\u2376", "\u2376"], /* APL FUNCTIONAL SYMBOL ALPHA UNDERBAR */ + ["\u2377", "\u2377"], /* APL FUNCTIONAL SYMBOL EPSILON UNDERBAR */ + ["\u2378", "\u2378"], /* APL FUNCTIONAL SYMBOL IOTA UNDERBAR */ + ["\u2379", "\u2379"], /* APL FUNCTIONAL SYMBOL OMEGA UNDERBAR */ + ["\u237A", "\u237A"], /* APL FUNCTIONAL SYMBOL ALPHA */ + ["\u237B", "\u237B"], /* NOT CHECK MARK */ + ["\u237C", "\u237C"], /* RIGHT ANGLE WITH DOWNWARDS ZIGZAG ARROW */ + ["\u237D", "\u237D"], /* SHOULDERED OPEN BOX */ + ["\u237E", "\u237E"], /* BELL SYMBOL */ + ["\u237F", "\u237F"], /* VERTICAL LINE WITH MIDDLE DOT */ + ["\u2380", "\u2380"], /* INSERTION SYMBOL */ + ["\u2381", "\u2381"], /* CONTINUOUS UNDERLINE SYMBOL */ + ["\u2382", "\u2382"], /* DISCONTINUOUS UNDERLINE SYMBOL */ + ["\u2383", "\u2383"], /* EMPHASIS SYMBOL */ + ["\u2384", "\u2384"], /* COMPOSITION SYMBOL */ + ["\u2385", "\u2385"], /* WHITE SQUARE WITH CENTRE VERTICAL LINE */ + ["\u2386", "\u2386"], /* ENTER SYMBOL */ + ["\u2387", "\u2387"], /* ALTERNATIVE KEY SYMBOL */ + ["\u2388", "\u2388"], /* HELM SYMBOL */ + ["\u2389", "\u2389"], /* CIRCLED HORIZONTAL BAR WITH NOTCH */ + ["\u238A", "\u238A"], /* CIRCLED TRIANGLE DOWN */ + ["\u238B", "\u238B"], /* BROKEN CIRCLE WITH NORTHWEST ARROW */ + ["\u238C", "\u238C"], /* UNDO SYMBOL */ + ["\u238D", "\u238D"], /* MONOSTABLE SYMBOL */ + ["\u238E", "\u238E"], /* HYSTERESIS SYMBOL */ + ["\u238F", "\u238F"], /* OPEN-CIRCUIT-OUTPUT H-TYPE SYMBOL */ + ["\u2390", "\u2390"], /* OPEN-CIRCUIT-OUTPUT L-TYPE SYMBOL */ + ["\u2391", "\u2391"], /* PASSIVE-PULL-DOWN-OUTPUT SYMBOL */ + ["\u2392", "\u2392"], /* PASSIVE-PULL-UP-OUTPUT SYMBOL */ + ["\u2393", "\u2393"], /* DIRECT CURRENT SYMBOL FORM TWO */ + ["\u2394", "\u2394"], /* SOFTWARE-FUNCTION SYMBOL */ + ["\u2395", "\u2395"], /* APL FUNCTIONAL SYMBOL QUAD */ + ["\u2396", "\u2396"], /* DECIMAL SEPARATOR KEY SYMBOL */ + ["\u2397", "\u2397"], /* PREVIOUS PAGE */ + ["\u2398", "\u2398"], /* NEXT PAGE */ + ["\u2399", "\u2399"], /* PRINT SCREEN SYMBOL */ + ["\u239A", "\u239A"], /* CLEAR SCREEN SYMBOL */ + ["\u239B", "\u239B"], /* LEFT PARENTHESIS UPPER HOOK */ + ["\u239C", "\u239C"], /* LEFT PARENTHESIS EXTENSION */ + ["\u239D", "\u239D"], /* LEFT PARENTHESIS LOWER HOOK */ + ["\u239E", "\u239E"], /* RIGHT PARENTHESIS UPPER HOOK */ + ["\u239F", "\u239F"], /* RIGHT PARENTHESIS EXTENSION */ + ["\u23A0", "\u23A0"], /* RIGHT PARENTHESIS LOWER HOOK */ + ["\u23A1", "\u23A1"], /* LEFT SQUARE BRACKET UPPER CORNER */ + ["\u23A2", "\u23A2"], /* LEFT SQUARE BRACKET EXTENSION */ + ["\u23A3", "\u23A3"], /* LEFT SQUARE BRACKET LOWER CORNER */ + ["\u23A4", "\u23A4"], /* RIGHT SQUARE BRACKET UPPER CORNER */ + ["\u23A5", "\u23A5"], /* RIGHT SQUARE BRACKET EXTENSION */ + ["\u23A6", "\u23A6"], /* RIGHT SQUARE BRACKET LOWER CORNER */ + ["\u23A7", "\u23A7"], /* LEFT CURLY BRACKET UPPER HOOK */ + ["\u23A8", "\u23A8"], /* LEFT CURLY BRACKET MIDDLE PIECE */ + ["\u23A9", "\u23A9"], /* LEFT CURLY BRACKET LOWER HOOK */ + ["\u23AA", "\u23AA"], /* CURLY BRACKET EXTENSION */ + ["\u23AB", "\u23AB"], /* RIGHT CURLY BRACKET UPPER HOOK */ + ["\u23AC", "\u23AC"], /* RIGHT CURLY BRACKET MIDDLE PIECE */ + ["\u23AD", "\u23AD"], /* RIGHT CURLY BRACKET LOWER HOOK */ + ["\u23AE", "\u23AE"], /* INTEGRAL EXTENSION */ + ["\u23AF", "\u23AF"], /* HORIZONTAL LINE EXTENSION */ + ["\u23B0", "\u23B0"], /* UPPER LEFT OR LOWER RIGHT CURLY BRACKET SECTION */ + ["\u23B1", "\u23B1"], /* UPPER RIGHT OR LOWER LEFT CURLY BRACKET SECTION */ + ["\u23B2", "\u23B2"], /* SUMMATION TOP */ + ["\u23B3", "\u23B3"], /* SUMMATION BOTTOM */ + ["\u23B4", "\u23B4"], /* TOP SQUARE BRACKET */ + ["\u23B5", "\u23B5"], /* BOTTOM SQUARE BRACKET */ + ["\u23B6", "\u23B6"], /* BOTTOM SQUARE BRACKET OVER TOP SQUARE BRACKET */ + ["\u23B7", "\u23B7"], /* RADICAL SYMBOL BOTTOM */ + ["\u23B8", "\u23B8"], /* LEFT VERTICAL BOX LINE */ + ["\u23B9", "\u23B9"], /* RIGHT VERTICAL BOX LINE */ + ["\u23BA", "\u23BA"], /* HORIZONTAL SCAN LINE-1 */ + ["\u23BB", "\u23BB"], /* HORIZONTAL SCAN LINE-3 */ + ["\u23BC", "\u23BC"], /* HORIZONTAL SCAN LINE-7 */ + ["\u23BD", "\u23BD"], /* HORIZONTAL SCAN LINE-9 */ + ["\u23BE", "\u23BE"], /* DENTISTRY SYMBOL LIGHT VERTICAL AND TOP RIGHT */ + ["\u23BF", "\u23BF"], /* DENTISTRY SYMBOL LIGHT VERTICAL AND BOTTOM RIGHT */ + ["\u23C0", "\u23C0"], /* DENTISTRY SYMBOL LIGHT VERTICAL WITH CIRCLE */ + ["\u23C1", "\u23C1"], /* DENTISTRY SYMBOL LIGHT DOWN AND HORIZONTAL WITH CIRCLE */ + ["\u23C2", "\u23C2"], /* DENTISTRY SYMBOL LIGHT UP AND HORIZONTAL WITH CIRCLE */ + ["\u23C3", "\u23C3"], /* DENTISTRY SYMBOL LIGHT VERTICAL WITH TRIANGLE */ + ["\u23C4", "\u23C4"], /* DENTISTRY SYMBOL LIGHT DOWN AND HORIZONTAL WITH TRIANGLE */ + ["\u23C5", "\u23C5"], /* DENTISTRY SYMBOL LIGHT UP AND HORIZONTAL WITH TRIANGLE */ + ["\u23C6", "\u23C6"], /* DENTISTRY SYMBOL LIGHT VERTICAL AND WAVE */ + ["\u23C7", "\u23C7"], /* DENTISTRY SYMBOL LIGHT DOWN AND HORIZONTAL WITH WAVE */ + ["\u23C8", "\u23C8"], /* DENTISTRY SYMBOL LIGHT UP AND HORIZONTAL WITH WAVE */ + ["\u23C9", "\u23C9"], /* DENTISTRY SYMBOL LIGHT DOWN AND HORIZONTAL */ + ["\u23CA", "\u23CA"], /* DENTISTRY SYMBOL LIGHT UP AND HORIZONTAL */ + ["\u23CB", "\u23CB"], /* DENTISTRY SYMBOL LIGHT VERTICAL AND TOP LEFT */ + ["\u23CC", "\u23CC"], /* DENTISTRY SYMBOL LIGHT VERTICAL AND BOTTOM LEFT */ + ["\u23CD", "\u23CD"], /* SQUARE FOOT */ + ["\u23CE", "\u23CE"], /* RETURN SYMBOL */ + ["\u23CF", "\u23CF"], /* EJECT SYMBOL */ + ["\u23D0", "\u23D0"], /* VERTICAL LINE EXTENSION */ + ["\u23D1", "\u23D1"], /* METRICAL BREVE */ + ["\u23D2", "\u23D2"], /* METRICAL LONG OVER SHORT */ + ["\u23D3", "\u23D3"], /* METRICAL SHORT OVER LONG */ + ["\u23D4", "\u23D4"], /* METRICAL LONG OVER TWO SHORTS */ + ["\u23D5", "\u23D5"], /* METRICAL TWO SHORTS OVER LONG */ + ["\u23D6", "\u23D6"], /* METRICAL TWO SHORTS JOINED */ + ["\u23D7", "\u23D7"], /* METRICAL TRISEME */ + ["\u23D8", "\u23D8"], /* METRICAL TETRASEME */ + ["\u23D9", "\u23D9"], /* METRICAL PENTASEME */ + ["\u23DA", "\u23DA"], /* EARTH GROUND */ + ["\u23DB", "\u23DB"], /* FUSE */ + ["\u23DC", "\u23DC"], /* TOP PARENTHESIS */ + ["\u23DD", "\u23DD"], /* BOTTOM PARENTHESIS */ + ["\u23DE", "\u23DE"], /* TOP CURLY BRACKET */ + ["\u23DF", "\u23DF"], /* BOTTOM CURLY BRACKET */ + ["\u23E0", "\u23E0"], /* TOP TORTOISE SHELL BRACKET */ + ["\u23E1", "\u23E1"], /* BOTTOM TORTOISE SHELL BRACKET */ + ["\u23E2", "\u23E2"], /* WHITE TRAPEZIUM */ + ["\u23E3", "\u23E3"], /* BENZENE RING WITH CIRCLE */ + ["\u23E4", "\u23E4"], /* STRAIGHTNESS */ + ["\u23E5", "\u23E5"], /* FLATNESS */ + ["\u23E6", "\u23E6"], /* AC CURRENT */ + ["\u23E7", "\u23E7"], /* ELECTRICAL INTERSECTION */ + ["\u23E8", "\u23E8"], /* DECIMAL EXPONENT SYMBOL */ + ["\u23E9", "\u23E9"], /* BLACK RIGHT-POINTING DOUBLE TRIANGLE */ + ["\u23EA", "\u23EA"], /* BLACK LEFT-POINTING DOUBLE TRIANGLE */ + ["\u23EB", "\u23EB"], /* BLACK UP-POINTING DOUBLE TRIANGLE */ + ["\u23EC", "\u23EC"], /* BLACK DOWN-POINTING DOUBLE TRIANGLE */ + ["\u23ED", "\u23ED"], /* BLACK RIGHT-POINTING DOUBLE TRIANGLE WITH VERTICAL BAR */ + ["\u23EE", "\u23EE"], /* BLACK LEFT-POINTING DOUBLE TRIANGLE WITH VERTICAL BAR */ + ["\u23EF", "\u23EF"], /* BLACK RIGHT-POINTING TRIANGLE WITH DOUBLE VERTICAL BAR */ + ["\u23F0", "\u23F0"], /* ALARM CLOCK */ + ["\u23F1", "\u23F1"], /* STOPWATCH */ + ["\u23F2", "\u23F2"], /* TIMER CLOCK */ + ["\u23F3", "\u23F3"], /* HOURGLASS WITH FLOWING SAND */ + ["\u23F4", "\u23F4"], /* BLACK MEDIUM LEFT-POINTING TRIANGLE */ + ["\u23F5", "\u23F5"], /* BLACK MEDIUM RIGHT-POINTING TRIANGLE */ + ["\u23F6", "\u23F6"], /* BLACK MEDIUM UP-POINTING TRIANGLE */ + ["\u23F7", "\u23F7"], /* BLACK MEDIUM DOWN-POINTING TRIANGLE */ + ["\u23F8", "\u23F8"], /* DOUBLE VERTICAL BAR */ + ["\u23F9", "\u23F9"], /* BLACK SQUARE FOR STOP */ + ["\u23FA", "\u23FA"], /* BLACK CIRCLE FOR RECORD */ + ["\u23FB", "\u23FB"], /* POWER SYMBOL */ + ["\u23FC", "\u23FC"], /* POWER ON-OFF SYMBOL */ + ["\u23FD", "\u23FD"], /* POWER ON SYMBOL */ + ["\u23FE", "\u23FE"], /* POWER SLEEP SYMBOL */ + ["\u23FF", "\u23FF"], /* OBSERVER EYE SYMBOL */ + ["\u2400", "\u2400"], /* SYMBOL FOR NULL (GRAPHIC FOR NULL) */ + ["\u2401", "\u2401"], /* SYMBOL FOR START OF HEADING (GRAPHIC FOR START OF HEADING) */ + ["\u2402", "\u2402"], /* SYMBOL FOR START OF TEXT (GRAPHIC FOR START OF TEXT) */ + ["\u2403", "\u2403"], /* SYMBOL FOR END OF TEXT (GRAPHIC FOR END OF TEXT) */ + ["\u2404", "\u2404"], /* SYMBOL FOR END OF TRANSMISSION (GRAPHIC FOR END OF TRANSMISSION) */ + ["\u2405", "\u2405"], /* SYMBOL FOR ENQUIRY (GRAPHIC FOR ENQUIRY) */ + ["\u2406", "\u2406"], /* SYMBOL FOR ACKNOWLEDGE (GRAPHIC FOR ACKNOWLEDGE) */ + ["\u2407", "\u2407"], /* SYMBOL FOR BELL (GRAPHIC FOR BELL) */ + ["\u2408", "\u2408"], /* SYMBOL FOR BACKSPACE (GRAPHIC FOR BACKSPACE) */ + ["\u2409", "\u2409"], /* SYMBOL FOR HORIZONTAL TABULATION (GRAPHIC FOR HORIZONTAL TABULATION) */ + ["\u240A", "\u240A"], /* SYMBOL FOR LINE FEED (GRAPHIC FOR LINE FEED) */ + ["\u240B", "\u240B"], /* SYMBOL FOR VERTICAL TABULATION (GRAPHIC FOR VERTICAL TABULATION) */ + ["\u240C", "\u240C"], /* SYMBOL FOR FORM FEED (GRAPHIC FOR FORM FEED) */ + ["\u240D", "\u240D"], /* SYMBOL FOR CARRIAGE RETURN (GRAPHIC FOR CARRIAGE RETURN) */ + ["\u240E", "\u240E"], /* SYMBOL FOR SHIFT OUT (GRAPHIC FOR SHIFT OUT) */ + ["\u240F", "\u240F"], /* SYMBOL FOR SHIFT IN (GRAPHIC FOR SHIFT IN) */ + ["\u2410", "\u2410"], /* SYMBOL FOR DATA LINK ESCAPE (GRAPHIC FOR DATA LINK ESCAPE) */ + ["\u2411", "\u2411"], /* SYMBOL FOR DEVICE CONTROL ONE (GRAPHIC FOR DEVICE CONTROL ONE) */ + ["\u2412", "\u2412"], /* SYMBOL FOR DEVICE CONTROL TWO (GRAPHIC FOR DEVICE CONTROL TWO) */ + ["\u2413", "\u2413"], /* SYMBOL FOR DEVICE CONTROL THREE (GRAPHIC FOR DEVICE CONTROL THREE) */ + ["\u2414", "\u2414"], /* SYMBOL FOR DEVICE CONTROL FOUR (GRAPHIC FOR DEVICE CONTROL FOUR) */ + ["\u2415", "\u2415"], /* SYMBOL FOR NEGATIVE ACKNOWLEDGE (GRAPHIC FOR NEGATIVE ACKNOWLEDGE) */ + ["\u2416", "\u2416"], /* SYMBOL FOR SYNCHRONOUS IDLE (GRAPHIC FOR SYNCHRONOUS IDLE) */ + ["\u2417", "\u2417"], /* SYMBOL FOR END OF TRANSMISSION BLOCK (GRAPHIC FOR END OF TRANSMISSION BLOCK) */ + ["\u2418", "\u2418"], /* SYMBOL FOR CANCEL (GRAPHIC FOR CANCEL) */ + ["\u2419", "\u2419"], /* SYMBOL FOR END OF MEDIUM (GRAPHIC FOR END OF MEDIUM) */ + ["\u241A", "\u241A"], /* SYMBOL FOR SUBSTITUTE (GRAPHIC FOR SUBSTITUTE) */ + ["\u241B", "\u241B"], /* SYMBOL FOR ESCAPE (GRAPHIC FOR ESCAPE) */ + ["\u241C", "\u241C"], /* SYMBOL FOR FILE SEPARATOR (GRAPHIC FOR FILE SEPARATOR) */ + ["\u241D", "\u241D"], /* SYMBOL FOR GROUP SEPARATOR (GRAPHIC FOR GROUP SEPARATOR) */ + ["\u241E", "\u241E"], /* SYMBOL FOR RECORD SEPARATOR (GRAPHIC FOR RECORD SEPARATOR) */ + ["\u241F", "\u241F"], /* SYMBOL FOR UNIT SEPARATOR (GRAPHIC FOR UNIT SEPARATOR) */ + ["\u2420", "\u2420"], /* SYMBOL FOR SPACE (GRAPHIC FOR SPACE) */ + ["\u2421", "\u2421"], /* SYMBOL FOR DELETE (GRAPHIC FOR DELETE) */ + ["\u2422", "\u2422"], /* BLANK SYMBOL (BLANK) */ + ["\u2423", "\u2423"], /* OPEN BOX */ + ["\u2424", "\u2424"], /* SYMBOL FOR NEWLINE (GRAPHIC FOR NEWLINE) */ + ["\u2425", "\u2425"], /* SYMBOL FOR DELETE FORM TWO */ + ["\u2426", "\u2426"], /* SYMBOL FOR SUBSTITUTE FORM TWO */ + ["\u2427", "\u2427"], + ["\u2428", "\u2428"], + ["\u2429", "\u2429"], + ["\u242A", "\u242A"], + ["\u242B", "\u242B"], + ["\u242C", "\u242C"], + ["\u242D", "\u242D"], + ["\u242E", "\u242E"], + ["\u242F", "\u242F"], + ["\u2430", "\u2430"], + ["\u2431", "\u2431"], + ["\u2432", "\u2432"], + ["\u2433", "\u2433"], + ["\u2434", "\u2434"], + ["\u2435", "\u2435"], + ["\u2436", "\u2436"], + ["\u2437", "\u2437"], + ["\u2438", "\u2438"], + ["\u2439", "\u2439"], + ["\u243A", "\u243A"], + ["\u243B", "\u243B"], + ["\u243C", "\u243C"], + ["\u243D", "\u243D"], + ["\u243E", "\u243E"], + ["\u243F", "\u243F"], + ["\u2440", "\u2440"], /* OCR HOOK */ + ["\u2441", "\u2441"], /* OCR CHAIR */ + ["\u2442", "\u2442"], /* OCR FORK */ + ["\u2443", "\u2443"], /* OCR INVERTED FORK */ + ["\u2444", "\u2444"], /* OCR BELT BUCKLE */ + ["\u2445", "\u2445"], /* OCR BOW TIE */ + ["\u2446", "\u2446"], /* OCR BRANCH BANK IDENTIFICATION */ + ["\u2447", "\u2447"], /* OCR AMOUNT OF CHECK */ + ["\u2448", "\u2448"], /* OCR DASH */ + ["\u2449", "\u2449"], /* OCR CUSTOMER ACCOUNT NUMBER */ + ["\u244A", "\u244A"], /* OCR DOUBLE BACKSLASH */ + ["\u244B", "\u244B"], + ["\u244C", "\u244C"], + ["\u244D", "\u244D"], + ["\u244E", "\u244E"], + ["\u244F", "\u244F"], + ["\u2450", "\u2450"], + ["\u2451", "\u2451"], + ["\u2452", "\u2452"], + ["\u2453", "\u2453"], + ["\u2454", "\u2454"], + ["\u2455", "\u2455"], + ["\u2456", "\u2456"], + ["\u2457", "\u2457"], + ["\u2458", "\u2458"], + ["\u2459", "\u2459"], + ["\u245A", "\u245A"], + ["\u245B", "\u245B"], + ["\u245C", "\u245C"], + ["\u245D", "\u245D"], + ["\u245E", "\u245E"], + ["\u245F", "\u245F"], + ["\u2460", "\u2460"], /* CIRCLED DIGIT ONE */ + ["\u2461", "\u2461"], /* CIRCLED DIGIT TWO */ + ["\u2462", "\u2462"], /* CIRCLED DIGIT THREE */ + ["\u2463", "\u2463"], /* CIRCLED DIGIT FOUR */ + ["\u2464", "\u2464"], /* CIRCLED DIGIT FIVE */ + ["\u2465", "\u2465"], /* CIRCLED DIGIT SIX */ + ["\u2466", "\u2466"], /* CIRCLED DIGIT SEVEN */ + ["\u2467", "\u2467"], /* CIRCLED DIGIT EIGHT */ + ["\u2468", "\u2468"], /* CIRCLED DIGIT NINE */ + ["\u2469", "\u2469"], /* CIRCLED NUMBER TEN */ + ["\u246A", "\u246A"], /* CIRCLED NUMBER ELEVEN */ + ["\u246B", "\u246B"], /* CIRCLED NUMBER TWELVE */ + ["\u246C", "\u246C"], /* CIRCLED NUMBER THIRTEEN */ + ["\u246D", "\u246D"], /* CIRCLED NUMBER FOURTEEN */ + ["\u246E", "\u246E"], /* CIRCLED NUMBER FIFTEEN */ + ["\u246F", "\u246F"], /* CIRCLED NUMBER SIXTEEN */ + ["\u2470", "\u2470"], /* CIRCLED NUMBER SEVENTEEN */ + ["\u2471", "\u2471"], /* CIRCLED NUMBER EIGHTEEN */ + ["\u2472", "\u2472"], /* CIRCLED NUMBER NINETEEN */ + ["\u2473", "\u2473"], /* CIRCLED NUMBER TWENTY */ + ["\u2474", "\u2474"], /* PARENTHESIZED DIGIT ONE */ + ["\u2475", "\u2475"], /* PARENTHESIZED DIGIT TWO */ + ["\u2476", "\u2476"], /* PARENTHESIZED DIGIT THREE */ + ["\u2477", "\u2477"], /* PARENTHESIZED DIGIT FOUR */ + ["\u2478", "\u2478"], /* PARENTHESIZED DIGIT FIVE */ + ["\u2479", "\u2479"], /* PARENTHESIZED DIGIT SIX */ + ["\u247A", "\u247A"], /* PARENTHESIZED DIGIT SEVEN */ + ["\u247B", "\u247B"], /* PARENTHESIZED DIGIT EIGHT */ + ["\u247C", "\u247C"], /* PARENTHESIZED DIGIT NINE */ + ["\u247D", "\u247D"], /* PARENTHESIZED NUMBER TEN */ + ["\u247E", "\u247E"], /* PARENTHESIZED NUMBER ELEVEN */ + ["\u247F", "\u247F"], /* PARENTHESIZED NUMBER TWELVE */ + ["\u2480", "\u2480"], /* PARENTHESIZED NUMBER THIRTEEN */ + ["\u2481", "\u2481"], /* PARENTHESIZED NUMBER FOURTEEN */ + ["\u2482", "\u2482"], /* PARENTHESIZED NUMBER FIFTEEN */ + ["\u2483", "\u2483"], /* PARENTHESIZED NUMBER SIXTEEN */ + ["\u2484", "\u2484"], /* PARENTHESIZED NUMBER SEVENTEEN */ + ["\u2485", "\u2485"], /* PARENTHESIZED NUMBER EIGHTEEN */ + ["\u2486", "\u2486"], /* PARENTHESIZED NUMBER NINETEEN */ + ["\u2487", "\u2487"], /* PARENTHESIZED NUMBER TWENTY */ + ["\u2488", "\u2488"], /* DIGIT ONE FULL STOP (DIGIT ONE PERIOD) */ + ["\u2489", "\u2489"], /* DIGIT TWO FULL STOP (DIGIT TWO PERIOD) */ + ["\u248A", "\u248A"], /* DIGIT THREE FULL STOP (DIGIT THREE PERIOD) */ + ["\u248B", "\u248B"], /* DIGIT FOUR FULL STOP (DIGIT FOUR PERIOD) */ + ["\u248C", "\u248C"], /* DIGIT FIVE FULL STOP (DIGIT FIVE PERIOD) */ + ["\u248D", "\u248D"], /* DIGIT SIX FULL STOP (DIGIT SIX PERIOD) */ + ["\u248E", "\u248E"], /* DIGIT SEVEN FULL STOP (DIGIT SEVEN PERIOD) */ + ["\u248F", "\u248F"], /* DIGIT EIGHT FULL STOP (DIGIT EIGHT PERIOD) */ + ["\u2490", "\u2490"], /* DIGIT NINE FULL STOP (DIGIT NINE PERIOD) */ + ["\u2491", "\u2491"], /* NUMBER TEN FULL STOP (NUMBER TEN PERIOD) */ + ["\u2492", "\u2492"], /* NUMBER ELEVEN FULL STOP (NUMBER ELEVEN PERIOD) */ + ["\u2493", "\u2493"], /* NUMBER TWELVE FULL STOP (NUMBER TWELVE PERIOD) */ + ["\u2494", "\u2494"], /* NUMBER THIRTEEN FULL STOP (NUMBER THIRTEEN PERIOD) */ + ["\u2495", "\u2495"], /* NUMBER FOURTEEN FULL STOP (NUMBER FOURTEEN PERIOD) */ + ["\u2496", "\u2496"], /* NUMBER FIFTEEN FULL STOP (NUMBER FIFTEEN PERIOD) */ + ["\u2497", "\u2497"], /* NUMBER SIXTEEN FULL STOP (NUMBER SIXTEEN PERIOD) */ + ["\u2498", "\u2498"], /* NUMBER SEVENTEEN FULL STOP (NUMBER SEVENTEEN PERIOD) */ + ["\u2499", "\u2499"], /* NUMBER EIGHTEEN FULL STOP (NUMBER EIGHTEEN PERIOD) */ + ["\u249A", "\u249A"], /* NUMBER NINETEEN FULL STOP (NUMBER NINETEEN PERIOD) */ + ["\u249B", "\u249B"], /* NUMBER TWENTY FULL STOP (NUMBER TWENTY PERIOD) */ + ["\u249C", "\u249C"], /* PARENTHESIZED LATIN SMALL LETTER A */ + ["\u249D", "\u249D"], /* PARENTHESIZED LATIN SMALL LETTER B */ + ["\u249E", "\u249E"], /* PARENTHESIZED LATIN SMALL LETTER C */ + ["\u249F", "\u249F"], /* PARENTHESIZED LATIN SMALL LETTER D */ + ["\u24A0", "\u24A0"], /* PARENTHESIZED LATIN SMALL LETTER E */ + ["\u24A1", "\u24A1"], /* PARENTHESIZED LATIN SMALL LETTER F */ + ["\u24A2", "\u24A2"], /* PARENTHESIZED LATIN SMALL LETTER G */ + ["\u24A3", "\u24A3"], /* PARENTHESIZED LATIN SMALL LETTER H */ + ["\u24A4", "\u24A4"], /* PARENTHESIZED LATIN SMALL LETTER I */ + ["\u24A5", "\u24A5"], /* PARENTHESIZED LATIN SMALL LETTER J */ + ["\u24A6", "\u24A6"], /* PARENTHESIZED LATIN SMALL LETTER K */ + ["\u24A7", "\u24A7"], /* PARENTHESIZED LATIN SMALL LETTER L */ + ["\u24A8", "\u24A8"], /* PARENTHESIZED LATIN SMALL LETTER M */ + ["\u24A9", "\u24A9"], /* PARENTHESIZED LATIN SMALL LETTER N */ + ["\u24AA", "\u24AA"], /* PARENTHESIZED LATIN SMALL LETTER O */ + ["\u24AB", "\u24AB"], /* PARENTHESIZED LATIN SMALL LETTER P */ + ["\u24AC", "\u24AC"], /* PARENTHESIZED LATIN SMALL LETTER Q */ + ["\u24AD", "\u24AD"], /* PARENTHESIZED LATIN SMALL LETTER R */ + ["\u24AE", "\u24AE"], /* PARENTHESIZED LATIN SMALL LETTER S */ + ["\u24AF", "\u24AF"], /* PARENTHESIZED LATIN SMALL LETTER T */ + ["\u24B0", "\u24B0"], /* PARENTHESIZED LATIN SMALL LETTER U */ + ["\u24B1", "\u24B1"], /* PARENTHESIZED LATIN SMALL LETTER V */ + ["\u24B2", "\u24B2"], /* PARENTHESIZED LATIN SMALL LETTER W */ + ["\u24B3", "\u24B3"], /* PARENTHESIZED LATIN SMALL LETTER X */ + ["\u24B4", "\u24B4"], /* PARENTHESIZED LATIN SMALL LETTER Y */ + ["\u24B5", "\u24B5"], /* PARENTHESIZED LATIN SMALL LETTER Z */ + ["\u24B6", "\u24D0"], /* CIRCLED LATIN CAPITAL LETTER A */ + ["\u24B7", "\u24D1"], /* CIRCLED LATIN CAPITAL LETTER B */ + ["\u24B8", "\u24D2"], /* CIRCLED LATIN CAPITAL LETTER C */ + ["\u24B9", "\u24D3"], /* CIRCLED LATIN CAPITAL LETTER D */ + ["\u24BA", "\u24D4"], /* CIRCLED LATIN CAPITAL LETTER E */ + ["\u24BB", "\u24D5"], /* CIRCLED LATIN CAPITAL LETTER F */ + ["\u24BC", "\u24D6"], /* CIRCLED LATIN CAPITAL LETTER G */ + ["\u24BD", "\u24D7"], /* CIRCLED LATIN CAPITAL LETTER H */ + ["\u24BE", "\u24D8"], /* CIRCLED LATIN CAPITAL LETTER I */ + ["\u24BF", "\u24D9"], /* CIRCLED LATIN CAPITAL LETTER J */ + ["\u24C0", "\u24DA"], /* CIRCLED LATIN CAPITAL LETTER K */ + ["\u24C1", "\u24DB"], /* CIRCLED LATIN CAPITAL LETTER L */ + ["\u24C2", "\u24DC"], /* CIRCLED LATIN CAPITAL LETTER M */ + ["\u24C3", "\u24DD"], /* CIRCLED LATIN CAPITAL LETTER N */ + ["\u24C4", "\u24DE"], /* CIRCLED LATIN CAPITAL LETTER O */ + ["\u24C5", "\u24DF"], /* CIRCLED LATIN CAPITAL LETTER P */ + ["\u24C6", "\u24E0"], /* CIRCLED LATIN CAPITAL LETTER Q */ + ["\u24C7", "\u24E1"], /* CIRCLED LATIN CAPITAL LETTER R */ + ["\u24C8", "\u24E2"], /* CIRCLED LATIN CAPITAL LETTER S */ + ["\u24C9", "\u24E3"], /* CIRCLED LATIN CAPITAL LETTER T */ + ["\u24CA", "\u24E4"], /* CIRCLED LATIN CAPITAL LETTER U */ + ["\u24CB", "\u24E5"], /* CIRCLED LATIN CAPITAL LETTER V */ + ["\u24CC", "\u24E6"], /* CIRCLED LATIN CAPITAL LETTER W */ + ["\u24CD", "\u24E7"], /* CIRCLED LATIN CAPITAL LETTER X */ + ["\u24CE", "\u24E8"], /* CIRCLED LATIN CAPITAL LETTER Y */ + ["\u24CF", "\u24E9"], /* CIRCLED LATIN CAPITAL LETTER Z */ + ["\u24B6", "\u24D0"], /* CIRCLED LATIN SMALL LETTER A */ + ["\u24B7", "\u24D1"], /* CIRCLED LATIN SMALL LETTER B */ + ["\u24B8", "\u24D2"], /* CIRCLED LATIN SMALL LETTER C */ + ["\u24B9", "\u24D3"], /* CIRCLED LATIN SMALL LETTER D */ + ["\u24BA", "\u24D4"], /* CIRCLED LATIN SMALL LETTER E */ + ["\u24BB", "\u24D5"], /* CIRCLED LATIN SMALL LETTER F */ + ["\u24BC", "\u24D6"], /* CIRCLED LATIN SMALL LETTER G */ + ["\u24BD", "\u24D7"], /* CIRCLED LATIN SMALL LETTER H */ + ["\u24BE", "\u24D8"], /* CIRCLED LATIN SMALL LETTER I */ + ["\u24BF", "\u24D9"], /* CIRCLED LATIN SMALL LETTER J */ + ["\u24C0", "\u24DA"], /* CIRCLED LATIN SMALL LETTER K */ + ["\u24C1", "\u24DB"], /* CIRCLED LATIN SMALL LETTER L */ + ["\u24C2", "\u24DC"], /* CIRCLED LATIN SMALL LETTER M */ + ["\u24C3", "\u24DD"], /* CIRCLED LATIN SMALL LETTER N */ + ["\u24C4", "\u24DE"], /* CIRCLED LATIN SMALL LETTER O */ + ["\u24C5", "\u24DF"], /* CIRCLED LATIN SMALL LETTER P */ + ["\u24C6", "\u24E0"], /* CIRCLED LATIN SMALL LETTER Q */ + ["\u24C7", "\u24E1"], /* CIRCLED LATIN SMALL LETTER R */ + ["\u24C8", "\u24E2"], /* CIRCLED LATIN SMALL LETTER S */ + ["\u24C9", "\u24E3"], /* CIRCLED LATIN SMALL LETTER T */ + ["\u24CA", "\u24E4"], /* CIRCLED LATIN SMALL LETTER U */ + ["\u24CB", "\u24E5"], /* CIRCLED LATIN SMALL LETTER V */ + ["\u24CC", "\u24E6"], /* CIRCLED LATIN SMALL LETTER W */ + ["\u24CD", "\u24E7"], /* CIRCLED LATIN SMALL LETTER X */ + ["\u24CE", "\u24E8"], /* CIRCLED LATIN SMALL LETTER Y */ + ["\u24CF", "\u24E9"], /* CIRCLED LATIN SMALL LETTER Z */ + ["\u24EA", "\u24EA"], /* CIRCLED DIGIT ZERO */ + ["\u24EB", "\u24EB"], /* NEGATIVE CIRCLED NUMBER ELEVEN */ + ["\u24EC", "\u24EC"], /* NEGATIVE CIRCLED NUMBER TWELVE */ + ["\u24ED", "\u24ED"], /* NEGATIVE CIRCLED NUMBER THIRTEEN */ + ["\u24EE", "\u24EE"], /* NEGATIVE CIRCLED NUMBER FOURTEEN */ + ["\u24EF", "\u24EF"], /* NEGATIVE CIRCLED NUMBER FIFTEEN */ + ["\u24F0", "\u24F0"], /* NEGATIVE CIRCLED NUMBER SIXTEEN */ + ["\u24F1", "\u24F1"], /* NEGATIVE CIRCLED NUMBER SEVENTEEN */ + ["\u24F2", "\u24F2"], /* NEGATIVE CIRCLED NUMBER EIGHTEEN */ + ["\u24F3", "\u24F3"], /* NEGATIVE CIRCLED NUMBER NINETEEN */ + ["\u24F4", "\u24F4"], /* NEGATIVE CIRCLED NUMBER TWENTY */ + ["\u24F5", "\u24F5"], /* DOUBLE CIRCLED DIGIT ONE */ + ["\u24F6", "\u24F6"], /* DOUBLE CIRCLED DIGIT TWO */ + ["\u24F7", "\u24F7"], /* DOUBLE CIRCLED DIGIT THREE */ + ["\u24F8", "\u24F8"], /* DOUBLE CIRCLED DIGIT FOUR */ + ["\u24F9", "\u24F9"], /* DOUBLE CIRCLED DIGIT FIVE */ + ["\u24FA", "\u24FA"], /* DOUBLE CIRCLED DIGIT SIX */ + ["\u24FB", "\u24FB"], /* DOUBLE CIRCLED DIGIT SEVEN */ + ["\u24FC", "\u24FC"], /* DOUBLE CIRCLED DIGIT EIGHT */ + ["\u24FD", "\u24FD"], /* DOUBLE CIRCLED DIGIT NINE */ + ["\u24FE", "\u24FE"], /* DOUBLE CIRCLED NUMBER TEN */ + ["\u24FF", "\u24FF"], /* NEGATIVE CIRCLED DIGIT ZERO */ + ["\u2500", "\u2500"], /* BOX DRAWINGS LIGHT HORIZONTAL (FORMS LIGHT HORIZONTAL) */ + ["\u2501", "\u2501"], /* BOX DRAWINGS HEAVY HORIZONTAL (FORMS HEAVY HORIZONTAL) */ + ["\u2502", "\u2502"], /* BOX DRAWINGS LIGHT VERTICAL (FORMS LIGHT VERTICAL) */ + ["\u2503", "\u2503"], /* BOX DRAWINGS HEAVY VERTICAL (FORMS HEAVY VERTICAL) */ + ["\u2504", "\u2504"], /* BOX DRAWINGS LIGHT TRIPLE DASH HORIZONTAL (FORMS LIGHT TRIPLE DASH HORIZONTAL) */ + ["\u2505", "\u2505"], /* BOX DRAWINGS HEAVY TRIPLE DASH HORIZONTAL (FORMS HEAVY TRIPLE DASH HORIZONTAL) */ + ["\u2506", "\u2506"], /* BOX DRAWINGS LIGHT TRIPLE DASH VERTICAL (FORMS LIGHT TRIPLE DASH VERTICAL) */ + ["\u2507", "\u2507"], /* BOX DRAWINGS HEAVY TRIPLE DASH VERTICAL (FORMS HEAVY TRIPLE DASH VERTICAL) */ + ["\u2508", "\u2508"], /* BOX DRAWINGS LIGHT QUADRUPLE DASH HORIZONTAL (FORMS LIGHT QUADRUPLE DASH HORIZONTAL) */ + ["\u2509", "\u2509"], /* BOX DRAWINGS HEAVY QUADRUPLE DASH HORIZONTAL (FORMS HEAVY QUADRUPLE DASH HORIZONTAL) */ + ["\u250A", "\u250A"], /* BOX DRAWINGS LIGHT QUADRUPLE DASH VERTICAL (FORMS LIGHT QUADRUPLE DASH VERTICAL) */ + ["\u250B", "\u250B"], /* BOX DRAWINGS HEAVY QUADRUPLE DASH VERTICAL (FORMS HEAVY QUADRUPLE DASH VERTICAL) */ + ["\u250C", "\u250C"], /* BOX DRAWINGS LIGHT DOWN AND RIGHT (FORMS LIGHT DOWN AND RIGHT) */ + ["\u250D", "\u250D"], /* BOX DRAWINGS DOWN LIGHT AND RIGHT HEAVY (FORMS DOWN LIGHT AND RIGHT HEAVY) */ + ["\u250E", "\u250E"], /* BOX DRAWINGS DOWN HEAVY AND RIGHT LIGHT (FORMS DOWN HEAVY AND RIGHT LIGHT) */ + ["\u250F", "\u250F"], /* BOX DRAWINGS HEAVY DOWN AND RIGHT (FORMS HEAVY DOWN AND RIGHT) */ + ["\u2510", "\u2510"], /* BOX DRAWINGS LIGHT DOWN AND LEFT (FORMS LIGHT DOWN AND LEFT) */ + ["\u2511", "\u2511"], /* BOX DRAWINGS DOWN LIGHT AND LEFT HEAVY (FORMS DOWN LIGHT AND LEFT HEAVY) */ + ["\u2512", "\u2512"], /* BOX DRAWINGS DOWN HEAVY AND LEFT LIGHT (FORMS DOWN HEAVY AND LEFT LIGHT) */ + ["\u2513", "\u2513"], /* BOX DRAWINGS HEAVY DOWN AND LEFT (FORMS HEAVY DOWN AND LEFT) */ + ["\u2514", "\u2514"], /* BOX DRAWINGS LIGHT UP AND RIGHT (FORMS LIGHT UP AND RIGHT) */ + ["\u2515", "\u2515"], /* BOX DRAWINGS UP LIGHT AND RIGHT HEAVY (FORMS UP LIGHT AND RIGHT HEAVY) */ + ["\u2516", "\u2516"], /* BOX DRAWINGS UP HEAVY AND RIGHT LIGHT (FORMS UP HEAVY AND RIGHT LIGHT) */ + ["\u2517", "\u2517"], /* BOX DRAWINGS HEAVY UP AND RIGHT (FORMS HEAVY UP AND RIGHT) */ + ["\u2518", "\u2518"], /* BOX DRAWINGS LIGHT UP AND LEFT (FORMS LIGHT UP AND LEFT) */ + ["\u2519", "\u2519"], /* BOX DRAWINGS UP LIGHT AND LEFT HEAVY (FORMS UP LIGHT AND LEFT HEAVY) */ + ["\u251A", "\u251A"], /* BOX DRAWINGS UP HEAVY AND LEFT LIGHT (FORMS UP HEAVY AND LEFT LIGHT) */ + ["\u251B", "\u251B"], /* BOX DRAWINGS HEAVY UP AND LEFT (FORMS HEAVY UP AND LEFT) */ + ["\u251C", "\u251C"], /* BOX DRAWINGS LIGHT VERTICAL AND RIGHT (FORMS LIGHT VERTICAL AND RIGHT) */ + ["\u251D", "\u251D"], /* BOX DRAWINGS VERTICAL LIGHT AND RIGHT HEAVY (FORMS VERTICAL LIGHT AND RIGHT HEAVY) */ + ["\u251E", "\u251E"], /* BOX DRAWINGS UP HEAVY AND RIGHT DOWN LIGHT (FORMS UP HEAVY AND RIGHT DOWN LIGHT) */ + ["\u251F", "\u251F"], /* BOX DRAWINGS DOWN HEAVY AND RIGHT UP LIGHT (FORMS DOWN HEAVY AND RIGHT UP LIGHT) */ + ["\u2520", "\u2520"], /* BOX DRAWINGS VERTICAL HEAVY AND RIGHT LIGHT (FORMS VERTICAL HEAVY AND RIGHT LIGHT) */ + ["\u2521", "\u2521"], /* BOX DRAWINGS DOWN LIGHT AND RIGHT UP HEAVY (FORMS DOWN LIGHT AND RIGHT UP HEAVY) */ + ["\u2522", "\u2522"], /* BOX DRAWINGS UP LIGHT AND RIGHT DOWN HEAVY (FORMS UP LIGHT AND RIGHT DOWN HEAVY) */ + ["\u2523", "\u2523"], /* BOX DRAWINGS HEAVY VERTICAL AND RIGHT (FORMS HEAVY VERTICAL AND RIGHT) */ + ["\u2524", "\u2524"], /* BOX DRAWINGS LIGHT VERTICAL AND LEFT (FORMS LIGHT VERTICAL AND LEFT) */ + ["\u2525", "\u2525"], /* BOX DRAWINGS VERTICAL LIGHT AND LEFT HEAVY (FORMS VERTICAL LIGHT AND LEFT HEAVY) */ + ["\u2526", "\u2526"], /* BOX DRAWINGS UP HEAVY AND LEFT DOWN LIGHT (FORMS UP HEAVY AND LEFT DOWN LIGHT) */ + ["\u2527", "\u2527"], /* BOX DRAWINGS DOWN HEAVY AND LEFT UP LIGHT (FORMS DOWN HEAVY AND LEFT UP LIGHT) */ + ["\u2528", "\u2528"], /* BOX DRAWINGS VERTICAL HEAVY AND LEFT LIGHT (FORMS VERTICAL HEAVY AND LEFT LIGHT) */ + ["\u2529", "\u2529"], /* BOX DRAWINGS DOWN LIGHT AND LEFT UP HEAVY (FORMS DOWN LIGHT AND LEFT UP HEAVY) */ + ["\u252A", "\u252A"], /* BOX DRAWINGS UP LIGHT AND LEFT DOWN HEAVY (FORMS UP LIGHT AND LEFT DOWN HEAVY) */ + ["\u252B", "\u252B"], /* BOX DRAWINGS HEAVY VERTICAL AND LEFT (FORMS HEAVY VERTICAL AND LEFT) */ + ["\u252C", "\u252C"], /* BOX DRAWINGS LIGHT DOWN AND HORIZONTAL (FORMS LIGHT DOWN AND HORIZONTAL) */ + ["\u252D", "\u252D"], /* BOX DRAWINGS LEFT HEAVY AND RIGHT DOWN LIGHT (FORMS LEFT HEAVY AND RIGHT DOWN LIGHT) */ + ["\u252E", "\u252E"], /* BOX DRAWINGS RIGHT HEAVY AND LEFT DOWN LIGHT (FORMS RIGHT HEAVY AND LEFT DOWN LIGHT) */ + ["\u252F", "\u252F"], /* BOX DRAWINGS DOWN LIGHT AND HORIZONTAL HEAVY (FORMS DOWN LIGHT AND HORIZONTAL HEAVY) */ + ["\u2530", "\u2530"], /* BOX DRAWINGS DOWN HEAVY AND HORIZONTAL LIGHT (FORMS DOWN HEAVY AND HORIZONTAL LIGHT) */ + ["\u2531", "\u2531"], /* BOX DRAWINGS RIGHT LIGHT AND LEFT DOWN HEAVY (FORMS RIGHT LIGHT AND LEFT DOWN HEAVY) */ + ["\u2532", "\u2532"], /* BOX DRAWINGS LEFT LIGHT AND RIGHT DOWN HEAVY (FORMS LEFT LIGHT AND RIGHT DOWN HEAVY) */ + ["\u2533", "\u2533"], /* BOX DRAWINGS HEAVY DOWN AND HORIZONTAL (FORMS HEAVY DOWN AND HORIZONTAL) */ + ["\u2534", "\u2534"], /* BOX DRAWINGS LIGHT UP AND HORIZONTAL (FORMS LIGHT UP AND HORIZONTAL) */ + ["\u2535", "\u2535"], /* BOX DRAWINGS LEFT HEAVY AND RIGHT UP LIGHT (FORMS LEFT HEAVY AND RIGHT UP LIGHT) */ + ["\u2536", "\u2536"], /* BOX DRAWINGS RIGHT HEAVY AND LEFT UP LIGHT (FORMS RIGHT HEAVY AND LEFT UP LIGHT) */ + ["\u2537", "\u2537"], /* BOX DRAWINGS UP LIGHT AND HORIZONTAL HEAVY (FORMS UP LIGHT AND HORIZONTAL HEAVY) */ + ["\u2538", "\u2538"], /* BOX DRAWINGS UP HEAVY AND HORIZONTAL LIGHT (FORMS UP HEAVY AND HORIZONTAL LIGHT) */ + ["\u2539", "\u2539"], /* BOX DRAWINGS RIGHT LIGHT AND LEFT UP HEAVY (FORMS RIGHT LIGHT AND LEFT UP HEAVY) */ + ["\u253A", "\u253A"], /* BOX DRAWINGS LEFT LIGHT AND RIGHT UP HEAVY (FORMS LEFT LIGHT AND RIGHT UP HEAVY) */ + ["\u253B", "\u253B"], /* BOX DRAWINGS HEAVY UP AND HORIZONTAL (FORMS HEAVY UP AND HORIZONTAL) */ + ["\u253C", "\u253C"], /* BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL (FORMS LIGHT VERTICAL AND HORIZONTAL) */ + ["\u253D", "\u253D"], /* BOX DRAWINGS LEFT HEAVY AND RIGHT VERTICAL LIGHT (FORMS LEFT HEAVY AND RIGHT VERTICAL LIGHT) */ + ["\u253E", "\u253E"], /* BOX DRAWINGS RIGHT HEAVY AND LEFT VERTICAL LIGHT (FORMS RIGHT HEAVY AND LEFT VERTICAL LIGHT) */ + ["\u253F", "\u253F"], /* BOX DRAWINGS VERTICAL LIGHT AND HORIZONTAL HEAVY (FORMS VERTICAL LIGHT AND HORIZONTAL HEAVY) */ + ["\u2540", "\u2540"], /* BOX DRAWINGS UP HEAVY AND DOWN HORIZONTAL LIGHT (FORMS UP HEAVY AND DOWN HORIZONTAL LIGHT) */ + ["\u2541", "\u2541"], /* BOX DRAWINGS DOWN HEAVY AND UP HORIZONTAL LIGHT (FORMS DOWN HEAVY AND UP HORIZONTAL LIGHT) */ + ["\u2542", "\u2542"], /* BOX DRAWINGS VERTICAL HEAVY AND HORIZONTAL LIGHT (FORMS VERTICAL HEAVY AND HORIZONTAL LIGHT) */ + ["\u2543", "\u2543"], /* BOX DRAWINGS LEFT UP HEAVY AND RIGHT DOWN LIGHT (FORMS LEFT UP HEAVY AND RIGHT DOWN LIGHT) */ + ["\u2544", "\u2544"], /* BOX DRAWINGS RIGHT UP HEAVY AND LEFT DOWN LIGHT (FORMS RIGHT UP HEAVY AND LEFT DOWN LIGHT) */ + ["\u2545", "\u2545"], /* BOX DRAWINGS LEFT DOWN HEAVY AND RIGHT UP LIGHT (FORMS LEFT DOWN HEAVY AND RIGHT UP LIGHT) */ + ["\u2546", "\u2546"], /* BOX DRAWINGS RIGHT DOWN HEAVY AND LEFT UP LIGHT (FORMS RIGHT DOWN HEAVY AND LEFT UP LIGHT) */ + ["\u2547", "\u2547"], /* BOX DRAWINGS DOWN LIGHT AND UP HORIZONTAL HEAVY (FORMS DOWN LIGHT AND UP HORIZONTAL HEAVY) */ + ["\u2548", "\u2548"], /* BOX DRAWINGS UP LIGHT AND DOWN HORIZONTAL HEAVY (FORMS UP LIGHT AND DOWN HORIZONTAL HEAVY) */ + ["\u2549", "\u2549"], /* BOX DRAWINGS RIGHT LIGHT AND LEFT VERTICAL HEAVY (FORMS RIGHT LIGHT AND LEFT VERTICAL HEAVY) */ + ["\u254A", "\u254A"], /* BOX DRAWINGS LEFT LIGHT AND RIGHT VERTICAL HEAVY (FORMS LEFT LIGHT AND RIGHT VERTICAL HEAVY) */ + ["\u254B", "\u254B"], /* BOX DRAWINGS HEAVY VERTICAL AND HORIZONTAL (FORMS HEAVY VERTICAL AND HORIZONTAL) */ + ["\u254C", "\u254C"], /* BOX DRAWINGS LIGHT DOUBLE DASH HORIZONTAL (FORMS LIGHT DOUBLE DASH HORIZONTAL) */ + ["\u254D", "\u254D"], /* BOX DRAWINGS HEAVY DOUBLE DASH HORIZONTAL (FORMS HEAVY DOUBLE DASH HORIZONTAL) */ + ["\u254E", "\u254E"], /* BOX DRAWINGS LIGHT DOUBLE DASH VERTICAL (FORMS LIGHT DOUBLE DASH VERTICAL) */ + ["\u254F", "\u254F"], /* BOX DRAWINGS HEAVY DOUBLE DASH VERTICAL (FORMS HEAVY DOUBLE DASH VERTICAL) */ + ["\u2550", "\u2550"], /* BOX DRAWINGS DOUBLE HORIZONTAL (FORMS DOUBLE HORIZONTAL) */ + ["\u2551", "\u2551"], /* BOX DRAWINGS DOUBLE VERTICAL (FORMS DOUBLE VERTICAL) */ + ["\u2552", "\u2552"], /* BOX DRAWINGS DOWN SINGLE AND RIGHT DOUBLE (FORMS DOWN SINGLE AND RIGHT DOUBLE) */ + ["\u2553", "\u2553"], /* BOX DRAWINGS DOWN DOUBLE AND RIGHT SINGLE (FORMS DOWN DOUBLE AND RIGHT SINGLE) */ + ["\u2554", "\u2554"], /* BOX DRAWINGS DOUBLE DOWN AND RIGHT (FORMS DOUBLE DOWN AND RIGHT) */ + ["\u2555", "\u2555"], /* BOX DRAWINGS DOWN SINGLE AND LEFT DOUBLE (FORMS DOWN SINGLE AND LEFT DOUBLE) */ + ["\u2556", "\u2556"], /* BOX DRAWINGS DOWN DOUBLE AND LEFT SINGLE (FORMS DOWN DOUBLE AND LEFT SINGLE) */ + ["\u2557", "\u2557"], /* BOX DRAWINGS DOUBLE DOWN AND LEFT (FORMS DOUBLE DOWN AND LEFT) */ + ["\u2558", "\u2558"], /* BOX DRAWINGS UP SINGLE AND RIGHT DOUBLE (FORMS UP SINGLE AND RIGHT DOUBLE) */ + ["\u2559", "\u2559"], /* BOX DRAWINGS UP DOUBLE AND RIGHT SINGLE (FORMS UP DOUBLE AND RIGHT SINGLE) */ + ["\u255A", "\u255A"], /* BOX DRAWINGS DOUBLE UP AND RIGHT (FORMS DOUBLE UP AND RIGHT) */ + ["\u255B", "\u255B"], /* BOX DRAWINGS UP SINGLE AND LEFT DOUBLE (FORMS UP SINGLE AND LEFT DOUBLE) */ + ["\u255C", "\u255C"], /* BOX DRAWINGS UP DOUBLE AND LEFT SINGLE (FORMS UP DOUBLE AND LEFT SINGLE) */ + ["\u255D", "\u255D"], /* BOX DRAWINGS DOUBLE UP AND LEFT (FORMS DOUBLE UP AND LEFT) */ + ["\u255E", "\u255E"], /* BOX DRAWINGS VERTICAL SINGLE AND RIGHT DOUBLE (FORMS VERTICAL SINGLE AND RIGHT DOUBLE) */ + ["\u255F", "\u255F"], /* BOX DRAWINGS VERTICAL DOUBLE AND RIGHT SINGLE (FORMS VERTICAL DOUBLE AND RIGHT SINGLE) */ + ["\u2560", "\u2560"], /* BOX DRAWINGS DOUBLE VERTICAL AND RIGHT (FORMS DOUBLE VERTICAL AND RIGHT) */ + ["\u2561", "\u2561"], /* BOX DRAWINGS VERTICAL SINGLE AND LEFT DOUBLE (FORMS VERTICAL SINGLE AND LEFT DOUBLE) */ + ["\u2562", "\u2562"], /* BOX DRAWINGS VERTICAL DOUBLE AND LEFT SINGLE (FORMS VERTICAL DOUBLE AND LEFT SINGLE) */ + ["\u2563", "\u2563"], /* BOX DRAWINGS DOUBLE VERTICAL AND LEFT (FORMS DOUBLE VERTICAL AND LEFT) */ + ["\u2564", "\u2564"], /* BOX DRAWINGS DOWN SINGLE AND HORIZONTAL DOUBLE (FORMS DOWN SINGLE AND HORIZONTAL DOUBLE) */ + ["\u2565", "\u2565"], /* BOX DRAWINGS DOWN DOUBLE AND HORIZONTAL SINGLE (FORMS DOWN DOUBLE AND HORIZONTAL SINGLE) */ + ["\u2566", "\u2566"], /* BOX DRAWINGS DOUBLE DOWN AND HORIZONTAL (FORMS DOUBLE DOWN AND HORIZONTAL) */ + ["\u2567", "\u2567"], /* BOX DRAWINGS UP SINGLE AND HORIZONTAL DOUBLE (FORMS UP SINGLE AND HORIZONTAL DOUBLE) */ + ["\u2568", "\u2568"], /* BOX DRAWINGS UP DOUBLE AND HORIZONTAL SINGLE (FORMS UP DOUBLE AND HORIZONTAL SINGLE) */ + ["\u2569", "\u2569"], /* BOX DRAWINGS DOUBLE UP AND HORIZONTAL (FORMS DOUBLE UP AND HORIZONTAL) */ + ["\u256A", "\u256A"], /* BOX DRAWINGS VERTICAL SINGLE AND HORIZONTAL DOUBLE (FORMS VERTICAL SINGLE AND HORIZONTAL DOUBLE) */ + ["\u256B", "\u256B"], /* BOX DRAWINGS VERTICAL DOUBLE AND HORIZONTAL SINGLE (FORMS VERTICAL DOUBLE AND HORIZONTAL SINGLE) */ + ["\u256C", "\u256C"], /* BOX DRAWINGS DOUBLE VERTICAL AND HORIZONTAL (FORMS DOUBLE VERTICAL AND HORIZONTAL) */ + ["\u256D", "\u256D"], /* BOX DRAWINGS LIGHT ARC DOWN AND RIGHT (FORMS LIGHT ARC DOWN AND RIGHT) */ + ["\u256E", "\u256E"], /* BOX DRAWINGS LIGHT ARC DOWN AND LEFT (FORMS LIGHT ARC DOWN AND LEFT) */ + ["\u256F", "\u256F"], /* BOX DRAWINGS LIGHT ARC UP AND LEFT (FORMS LIGHT ARC UP AND LEFT) */ + ["\u2570", "\u2570"], /* BOX DRAWINGS LIGHT ARC UP AND RIGHT (FORMS LIGHT ARC UP AND RIGHT) */ + ["\u2571", "\u2571"], /* BOX DRAWINGS LIGHT DIAGONAL UPPER RIGHT TO LOWER LEFT (FORMS LIGHT DIAGONAL UPPER RIGHT TO LOWER LEFT) */ + ["\u2572", "\u2572"], /* BOX DRAWINGS LIGHT DIAGONAL UPPER LEFT TO LOWER RIGHT (FORMS LIGHT DIAGONAL UPPER LEFT TO LOWER RIGHT) */ + ["\u2573", "\u2573"], /* BOX DRAWINGS LIGHT DIAGONAL CROSS (FORMS LIGHT DIAGONAL CROSS) */ + ["\u2574", "\u2574"], /* BOX DRAWINGS LIGHT LEFT (FORMS LIGHT LEFT) */ + ["\u2575", "\u2575"], /* BOX DRAWINGS LIGHT UP (FORMS LIGHT UP) */ + ["\u2576", "\u2576"], /* BOX DRAWINGS LIGHT RIGHT (FORMS LIGHT RIGHT) */ + ["\u2577", "\u2577"], /* BOX DRAWINGS LIGHT DOWN (FORMS LIGHT DOWN) */ + ["\u2578", "\u2578"], /* BOX DRAWINGS HEAVY LEFT (FORMS HEAVY LEFT) */ + ["\u2579", "\u2579"], /* BOX DRAWINGS HEAVY UP (FORMS HEAVY UP) */ + ["\u257A", "\u257A"], /* BOX DRAWINGS HEAVY RIGHT (FORMS HEAVY RIGHT) */ + ["\u257B", "\u257B"], /* BOX DRAWINGS HEAVY DOWN (FORMS HEAVY DOWN) */ + ["\u257C", "\u257C"], /* BOX DRAWINGS LIGHT LEFT AND HEAVY RIGHT (FORMS LIGHT LEFT AND HEAVY RIGHT) */ + ["\u257D", "\u257D"], /* BOX DRAWINGS LIGHT UP AND HEAVY DOWN (FORMS LIGHT UP AND HEAVY DOWN) */ + ["\u257E", "\u257E"], /* BOX DRAWINGS HEAVY LEFT AND LIGHT RIGHT (FORMS HEAVY LEFT AND LIGHT RIGHT) */ + ["\u257F", "\u257F"], /* BOX DRAWINGS HEAVY UP AND LIGHT DOWN (FORMS HEAVY UP AND LIGHT DOWN) */ + ["\u2580", "\u2580"], /* UPPER HALF BLOCK */ + ["\u2581", "\u2581"], /* LOWER ONE EIGHTH BLOCK */ + ["\u2582", "\u2582"], /* LOWER ONE QUARTER BLOCK */ + ["\u2583", "\u2583"], /* LOWER THREE EIGHTHS BLOCK */ + ["\u2584", "\u2584"], /* LOWER HALF BLOCK */ + ["\u2585", "\u2585"], /* LOWER FIVE EIGHTHS BLOCK */ + ["\u2586", "\u2586"], /* LOWER THREE QUARTERS BLOCK (LOWER THREE QUARTER BLOCK) */ + ["\u2587", "\u2587"], /* LOWER SEVEN EIGHTHS BLOCK */ + ["\u2588", "\u2588"], /* FULL BLOCK */ + ["\u2589", "\u2589"], /* LEFT SEVEN EIGHTHS BLOCK */ + ["\u258A", "\u258A"], /* LEFT THREE QUARTERS BLOCK (LEFT THREE QUARTER BLOCK) */ + ["\u258B", "\u258B"], /* LEFT FIVE EIGHTHS BLOCK */ + ["\u258C", "\u258C"], /* LEFT HALF BLOCK */ + ["\u258D", "\u258D"], /* LEFT THREE EIGHTHS BLOCK */ + ["\u258E", "\u258E"], /* LEFT ONE QUARTER BLOCK */ + ["\u258F", "\u258F"], /* LEFT ONE EIGHTH BLOCK */ + ["\u2590", "\u2590"], /* RIGHT HALF BLOCK */ + ["\u2591", "\u2591"], /* LIGHT SHADE */ + ["\u2592", "\u2592"], /* MEDIUM SHADE */ + ["\u2593", "\u2593"], /* DARK SHADE */ + ["\u2594", "\u2594"], /* UPPER ONE EIGHTH BLOCK */ + ["\u2595", "\u2595"], /* RIGHT ONE EIGHTH BLOCK */ + ["\u2596", "\u2596"], /* QUADRANT LOWER LEFT */ + ["\u2597", "\u2597"], /* QUADRANT LOWER RIGHT */ + ["\u2598", "\u2598"], /* QUADRANT UPPER LEFT */ + ["\u2599", "\u2599"], /* QUADRANT UPPER LEFT AND LOWER LEFT AND LOWER RIGHT */ + ["\u259A", "\u259A"], /* QUADRANT UPPER LEFT AND LOWER RIGHT */ + ["\u259B", "\u259B"], /* QUADRANT UPPER LEFT AND UPPER RIGHT AND LOWER LEFT */ + ["\u259C", "\u259C"], /* QUADRANT UPPER LEFT AND UPPER RIGHT AND LOWER RIGHT */ + ["\u259D", "\u259D"], /* QUADRANT UPPER RIGHT */ + ["\u259E", "\u259E"], /* QUADRANT UPPER RIGHT AND LOWER LEFT */ + ["\u259F", "\u259F"], /* QUADRANT UPPER RIGHT AND LOWER LEFT AND LOWER RIGHT */ + ["\u25A0", "\u25A0"], /* BLACK SQUARE */ + ["\u25A1", "\u25A1"], /* WHITE SQUARE */ + ["\u25A2", "\u25A2"], /* WHITE SQUARE WITH ROUNDED CORNERS */ + ["\u25A3", "\u25A3"], /* WHITE SQUARE CONTAINING BLACK SMALL SQUARE */ + ["\u25A4", "\u25A4"], /* SQUARE WITH HORIZONTAL FILL */ + ["\u25A5", "\u25A5"], /* SQUARE WITH VERTICAL FILL */ + ["\u25A6", "\u25A6"], /* SQUARE WITH ORTHOGONAL CROSSHATCH FILL */ + ["\u25A7", "\u25A7"], /* SQUARE WITH UPPER LEFT TO LOWER RIGHT FILL */ + ["\u25A8", "\u25A8"], /* SQUARE WITH UPPER RIGHT TO LOWER LEFT FILL */ + ["\u25A9", "\u25A9"], /* SQUARE WITH DIAGONAL CROSSHATCH FILL */ + ["\u25AA", "\u25AA"], /* BLACK SMALL SQUARE */ + ["\u25AB", "\u25AB"], /* WHITE SMALL SQUARE */ + ["\u25AC", "\u25AC"], /* BLACK RECTANGLE */ + ["\u25AD", "\u25AD"], /* WHITE RECTANGLE */ + ["\u25AE", "\u25AE"], /* BLACK VERTICAL RECTANGLE */ + ["\u25AF", "\u25AF"], /* WHITE VERTICAL RECTANGLE */ + ["\u25B0", "\u25B0"], /* BLACK PARALLELOGRAM */ + ["\u25B1", "\u25B1"], /* WHITE PARALLELOGRAM */ + ["\u25B2", "\u25B2"], /* BLACK UP-POINTING TRIANGLE (BLACK UP POINTING TRIANGLE) */ + ["\u25B3", "\u25B3"], /* WHITE UP-POINTING TRIANGLE (WHITE UP POINTING TRIANGLE) */ + ["\u25B4", "\u25B4"], /* BLACK UP-POINTING SMALL TRIANGLE (BLACK UP POINTING SMALL TRIANGLE) */ + ["\u25B5", "\u25B5"], /* WHITE UP-POINTING SMALL TRIANGLE (WHITE UP POINTING SMALL TRIANGLE) */ + ["\u25B6", "\u25B6"], /* BLACK RIGHT-POINTING TRIANGLE (BLACK RIGHT POINTING TRIANGLE) */ + ["\u25B7", "\u25B7"], /* WHITE RIGHT-POINTING TRIANGLE (WHITE RIGHT POINTING TRIANGLE) */ + ["\u25B8", "\u25B8"], /* BLACK RIGHT-POINTING SMALL TRIANGLE (BLACK RIGHT POINTING SMALL TRIANGLE) */ + ["\u25B9", "\u25B9"], /* WHITE RIGHT-POINTING SMALL TRIANGLE (WHITE RIGHT POINTING SMALL TRIANGLE) */ + ["\u25BA", "\u25BA"], /* BLACK RIGHT-POINTING POINTER (BLACK RIGHT POINTING POINTER) */ + ["\u25BB", "\u25BB"], /* WHITE RIGHT-POINTING POINTER (WHITE RIGHT POINTING POINTER) */ + ["\u25BC", "\u25BC"], /* BLACK DOWN-POINTING TRIANGLE (BLACK DOWN POINTING TRIANGLE) */ + ["\u25BD", "\u25BD"], /* WHITE DOWN-POINTING TRIANGLE (WHITE DOWN POINTING TRIANGLE) */ + ["\u25BE", "\u25BE"], /* BLACK DOWN-POINTING SMALL TRIANGLE (BLACK DOWN POINTING SMALL TRIANGLE) */ + ["\u25BF", "\u25BF"], /* WHITE DOWN-POINTING SMALL TRIANGLE (WHITE DOWN POINTING SMALL TRIANGLE) */ + ["\u25C0", "\u25C0"], /* BLACK LEFT-POINTING TRIANGLE (BLACK LEFT POINTING TRIANGLE) */ + ["\u25C1", "\u25C1"], /* WHITE LEFT-POINTING TRIANGLE (WHITE LEFT POINTING TRIANGLE) */ + ["\u25C2", "\u25C2"], /* BLACK LEFT-POINTING SMALL TRIANGLE (BLACK LEFT POINTING SMALL TRIANGLE) */ + ["\u25C3", "\u25C3"], /* WHITE LEFT-POINTING SMALL TRIANGLE (WHITE LEFT POINTING SMALL TRIANGLE) */ + ["\u25C4", "\u25C4"], /* BLACK LEFT-POINTING POINTER (BLACK LEFT POINTING POINTER) */ + ["\u25C5", "\u25C5"], /* WHITE LEFT-POINTING POINTER (WHITE LEFT POINTING POINTER) */ + ["\u25C6", "\u25C6"], /* BLACK DIAMOND */ + ["\u25C7", "\u25C7"], /* WHITE DIAMOND */ + ["\u25C8", "\u25C8"], /* WHITE DIAMOND CONTAINING BLACK SMALL DIAMOND */ + ["\u25C9", "\u25C9"], /* FISHEYE */ + ["\u25CA", "\u25CA"], /* LOZENGE */ + ["\u25CB", "\u25CB"], /* WHITE CIRCLE */ + ["\u25CC", "\u25CC"], /* DOTTED CIRCLE */ + ["\u25CD", "\u25CD"], /* CIRCLE WITH VERTICAL FILL */ + ["\u25CE", "\u25CE"], /* BULLSEYE */ + ["\u25CF", "\u25CF"], /* BLACK CIRCLE */ + ["\u25D0", "\u25D0"], /* CIRCLE WITH LEFT HALF BLACK */ + ["\u25D1", "\u25D1"], /* CIRCLE WITH RIGHT HALF BLACK */ + ["\u25D2", "\u25D2"], /* CIRCLE WITH LOWER HALF BLACK */ + ["\u25D3", "\u25D3"], /* CIRCLE WITH UPPER HALF BLACK */ + ["\u25D4", "\u25D4"], /* CIRCLE WITH UPPER RIGHT QUADRANT BLACK */ + ["\u25D5", "\u25D5"], /* CIRCLE WITH ALL BUT UPPER LEFT QUADRANT BLACK */ + ["\u25D6", "\u25D6"], /* LEFT HALF BLACK CIRCLE */ + ["\u25D7", "\u25D7"], /* RIGHT HALF BLACK CIRCLE */ + ["\u25D8", "\u25D8"], /* INVERSE BULLET */ + ["\u25D9", "\u25D9"], /* INVERSE WHITE CIRCLE */ + ["\u25DA", "\u25DA"], /* UPPER HALF INVERSE WHITE CIRCLE */ + ["\u25DB", "\u25DB"], /* LOWER HALF INVERSE WHITE CIRCLE */ + ["\u25DC", "\u25DC"], /* UPPER LEFT QUADRANT CIRCULAR ARC */ + ["\u25DD", "\u25DD"], /* UPPER RIGHT QUADRANT CIRCULAR ARC */ + ["\u25DE", "\u25DE"], /* LOWER RIGHT QUADRANT CIRCULAR ARC */ + ["\u25DF", "\u25DF"], /* LOWER LEFT QUADRANT CIRCULAR ARC */ + ["\u25E0", "\u25E0"], /* UPPER HALF CIRCLE */ + ["\u25E1", "\u25E1"], /* LOWER HALF CIRCLE */ + ["\u25E2", "\u25E2"], /* BLACK LOWER RIGHT TRIANGLE */ + ["\u25E3", "\u25E3"], /* BLACK LOWER LEFT TRIANGLE */ + ["\u25E4", "\u25E4"], /* BLACK UPPER LEFT TRIANGLE */ + ["\u25E5", "\u25E5"], /* BLACK UPPER RIGHT TRIANGLE */ + ["\u25E6", "\u25E6"], /* WHITE BULLET */ + ["\u25E7", "\u25E7"], /* SQUARE WITH LEFT HALF BLACK */ + ["\u25E8", "\u25E8"], /* SQUARE WITH RIGHT HALF BLACK */ + ["\u25E9", "\u25E9"], /* SQUARE WITH UPPER LEFT DIAGONAL HALF BLACK */ + ["\u25EA", "\u25EA"], /* SQUARE WITH LOWER RIGHT DIAGONAL HALF BLACK */ + ["\u25EB", "\u25EB"], /* WHITE SQUARE WITH VERTICAL BISECTING LINE */ + ["\u25EC", "\u25EC"], /* WHITE UP-POINTING TRIANGLE WITH DOT (WHITE UP POINTING TRIANGLE WITH DOT) */ + ["\u25ED", "\u25ED"], /* UP-POINTING TRIANGLE WITH LEFT HALF BLACK (UP POINTING TRIANGLE WITH LEFT HALF BLACK) */ + ["\u25EE", "\u25EE"], /* UP-POINTING TRIANGLE WITH RIGHT HALF BLACK (UP POINTING TRIANGLE WITH RIGHT HALF BLACK) */ + ["\u25EF", "\u25EF"], /* LARGE CIRCLE */ + ["\u25F0", "\u25F0"], /* WHITE SQUARE WITH UPPER LEFT QUADRANT */ + ["\u25F1", "\u25F1"], /* WHITE SQUARE WITH LOWER LEFT QUADRANT */ + ["\u25F2", "\u25F2"], /* WHITE SQUARE WITH LOWER RIGHT QUADRANT */ + ["\u25F3", "\u25F3"], /* WHITE SQUARE WITH UPPER RIGHT QUADRANT */ + ["\u25F4", "\u25F4"], /* WHITE CIRCLE WITH UPPER LEFT QUADRANT */ + ["\u25F5", "\u25F5"], /* WHITE CIRCLE WITH LOWER LEFT QUADRANT */ + ["\u25F6", "\u25F6"], /* WHITE CIRCLE WITH LOWER RIGHT QUADRANT */ + ["\u25F7", "\u25F7"], /* WHITE CIRCLE WITH UPPER RIGHT QUADRANT */ + ["\u25F8", "\u25F8"], /* UPPER LEFT TRIANGLE */ + ["\u25F9", "\u25F9"], /* UPPER RIGHT TRIANGLE */ + ["\u25FA", "\u25FA"], /* LOWER LEFT TRIANGLE */ + ["\u25FB", "\u25FB"], /* WHITE MEDIUM SQUARE */ + ["\u25FC", "\u25FC"], /* BLACK MEDIUM SQUARE */ + ["\u25FD", "\u25FD"], /* WHITE MEDIUM SMALL SQUARE */ + ["\u25FE", "\u25FE"], /* BLACK MEDIUM SMALL SQUARE */ + ["\u25FF", "\u25FF"], /* LOWER RIGHT TRIANGLE */ + ["\u2600", "\u2600"], /* BLACK SUN WITH RAYS */ + ["\u2601", "\u2601"], /* CLOUD */ + ["\u2602", "\u2602"], /* UMBRELLA */ + ["\u2603", "\u2603"], /* SNOWMAN */ + ["\u2604", "\u2604"], /* COMET */ + ["\u2605", "\u2605"], /* BLACK STAR */ + ["\u2606", "\u2606"], /* WHITE STAR */ + ["\u2607", "\u2607"], /* LIGHTNING */ + ["\u2608", "\u2608"], /* THUNDERSTORM */ + ["\u2609", "\u2609"], /* SUN */ + ["\u260A", "\u260A"], /* ASCENDING NODE */ + ["\u260B", "\u260B"], /* DESCENDING NODE */ + ["\u260C", "\u260C"], /* CONJUNCTION */ + ["\u260D", "\u260D"], /* OPPOSITION */ + ["\u260E", "\u260E"], /* BLACK TELEPHONE */ + ["\u260F", "\u260F"], /* WHITE TELEPHONE */ + ["\u2610", "\u2610"], /* BALLOT BOX */ + ["\u2611", "\u2611"], /* BALLOT BOX WITH CHECK */ + ["\u2612", "\u2612"], /* BALLOT BOX WITH X */ + ["\u2613", "\u2613"], /* SALTIRE */ + ["\u2614", "\u2614"], /* UMBRELLA WITH RAIN DROPS */ + ["\u2615", "\u2615"], /* HOT BEVERAGE */ + ["\u2616", "\u2616"], /* WHITE SHOGI PIECE */ + ["\u2617", "\u2617"], /* BLACK SHOGI PIECE */ + ["\u2618", "\u2618"], /* SHAMROCK */ + ["\u2619", "\u2619"], /* REVERSED ROTATED FLORAL HEART BULLET */ + ["\u261A", "\u261A"], /* BLACK LEFT POINTING INDEX */ + ["\u261B", "\u261B"], /* BLACK RIGHT POINTING INDEX */ + ["\u261C", "\u261C"], /* WHITE LEFT POINTING INDEX */ + ["\u261D", "\u261D"], /* WHITE UP POINTING INDEX */ + ["\u261E", "\u261E"], /* WHITE RIGHT POINTING INDEX */ + ["\u261F", "\u261F"], /* WHITE DOWN POINTING INDEX */ + ["\u2620", "\u2620"], /* SKULL AND CROSSBONES */ + ["\u2621", "\u2621"], /* CAUTION SIGN */ + ["\u2622", "\u2622"], /* RADIOACTIVE SIGN */ + ["\u2623", "\u2623"], /* BIOHAZARD SIGN */ + ["\u2624", "\u2624"], /* CADUCEUS */ + ["\u2625", "\u2625"], /* ANKH */ + ["\u2626", "\u2626"], /* ORTHODOX CROSS */ + ["\u2627", "\u2627"], /* CHI RHO */ + ["\u2628", "\u2628"], /* CROSS OF LORRAINE */ + ["\u2629", "\u2629"], /* CROSS OF JERUSALEM */ + ["\u262A", "\u262A"], /* STAR AND CRESCENT */ + ["\u262B", "\u262B"], /* FARSI SYMBOL (SYMBOL OF IRAN) */ + ["\u262C", "\u262C"], /* ADI SHAKTI */ + ["\u262D", "\u262D"], /* HAMMER AND SICKLE */ + ["\u262E", "\u262E"], /* PEACE SYMBOL */ + ["\u262F", "\u262F"], /* YIN YANG */ + ["\u2630", "\u2630"], /* TRIGRAM FOR HEAVEN */ + ["\u2631", "\u2631"], /* TRIGRAM FOR LAKE */ + ["\u2632", "\u2632"], /* TRIGRAM FOR FIRE */ + ["\u2633", "\u2633"], /* TRIGRAM FOR THUNDER */ + ["\u2634", "\u2634"], /* TRIGRAM FOR WIND */ + ["\u2635", "\u2635"], /* TRIGRAM FOR WATER */ + ["\u2636", "\u2636"], /* TRIGRAM FOR MOUNTAIN */ + ["\u2637", "\u2637"], /* TRIGRAM FOR EARTH */ + ["\u2638", "\u2638"], /* WHEEL OF DHARMA */ + ["\u2639", "\u2639"], /* WHITE FROWNING FACE */ + ["\u263A", "\u263A"], /* WHITE SMILING FACE */ + ["\u263B", "\u263B"], /* BLACK SMILING FACE */ + ["\u263C", "\u263C"], /* WHITE SUN WITH RAYS */ + ["\u263D", "\u263D"], /* FIRST QUARTER MOON */ + ["\u263E", "\u263E"], /* LAST QUARTER MOON */ + ["\u263F", "\u263F"], /* MERCURY */ + ["\u2640", "\u2640"], /* FEMALE SIGN */ + ["\u2641", "\u2641"], /* EARTH */ + ["\u2642", "\u2642"], /* MALE SIGN */ + ["\u2643", "\u2643"], /* JUPITER */ + ["\u2644", "\u2644"], /* SATURN */ + ["\u2645", "\u2645"], /* URANUS */ + ["\u2646", "\u2646"], /* NEPTUNE */ + ["\u2647", "\u2647"], /* PLUTO */ + ["\u2648", "\u2648"], /* ARIES */ + ["\u2649", "\u2649"], /* TAURUS */ + ["\u264A", "\u264A"], /* GEMINI */ + ["\u264B", "\u264B"], /* CANCER */ + ["\u264C", "\u264C"], /* LEO */ + ["\u264D", "\u264D"], /* VIRGO */ + ["\u264E", "\u264E"], /* LIBRA */ + ["\u264F", "\u264F"], /* SCORPIUS */ + ["\u2650", "\u2650"], /* SAGITTARIUS */ + ["\u2651", "\u2651"], /* CAPRICORN */ + ["\u2652", "\u2652"], /* AQUARIUS */ + ["\u2653", "\u2653"], /* PISCES */ + ["\u2654", "\u2654"], /* WHITE CHESS KING */ + ["\u2655", "\u2655"], /* WHITE CHESS QUEEN */ + ["\u2656", "\u2656"], /* WHITE CHESS ROOK */ + ["\u2657", "\u2657"], /* WHITE CHESS BISHOP */ + ["\u2658", "\u2658"], /* WHITE CHESS KNIGHT */ + ["\u2659", "\u2659"], /* WHITE CHESS PAWN */ + ["\u265A", "\u265A"], /* BLACK CHESS KING */ + ["\u265B", "\u265B"], /* BLACK CHESS QUEEN */ + ["\u265C", "\u265C"], /* BLACK CHESS ROOK */ + ["\u265D", "\u265D"], /* BLACK CHESS BISHOP */ + ["\u265E", "\u265E"], /* BLACK CHESS KNIGHT */ + ["\u265F", "\u265F"], /* BLACK CHESS PAWN */ + ["\u2660", "\u2660"], /* BLACK SPADE SUIT */ + ["\u2661", "\u2661"], /* WHITE HEART SUIT */ + ["\u2662", "\u2662"], /* WHITE DIAMOND SUIT */ + ["\u2663", "\u2663"], /* BLACK CLUB SUIT */ + ["\u2664", "\u2664"], /* WHITE SPADE SUIT */ + ["\u2665", "\u2665"], /* BLACK HEART SUIT */ + ["\u2666", "\u2666"], /* BLACK DIAMOND SUIT */ + ["\u2667", "\u2667"], /* WHITE CLUB SUIT */ + ["\u2668", "\u2668"], /* HOT SPRINGS */ + ["\u2669", "\u2669"], /* QUARTER NOTE */ + ["\u266A", "\u266A"], /* EIGHTH NOTE */ + ["\u266B", "\u266B"], /* BEAMED EIGHTH NOTES (BARRED EIGHTH NOTES) */ + ["\u266C", "\u266C"], /* BEAMED SIXTEENTH NOTES (BARRED SIXTEENTH NOTES) */ + ["\u266D", "\u266D"], /* MUSIC FLAT SIGN (FLAT) */ + ["\u266E", "\u266E"], /* MUSIC NATURAL SIGN (NATURAL) */ + ["\u266F", "\u266F"], /* MUSIC SHARP SIGN (SHARP) */ + ["\u2670", "\u2670"], /* WEST SYRIAC CROSS */ + ["\u2671", "\u2671"], /* EAST SYRIAC CROSS */ + ["\u2672", "\u2672"], /* UNIVERSAL RECYCLING SYMBOL */ + ["\u2673", "\u2673"], /* RECYCLING SYMBOL FOR TYPE-1 PLASTICS */ + ["\u2674", "\u2674"], /* RECYCLING SYMBOL FOR TYPE-2 PLASTICS */ + ["\u2675", "\u2675"], /* RECYCLING SYMBOL FOR TYPE-3 PLASTICS */ + ["\u2676", "\u2676"], /* RECYCLING SYMBOL FOR TYPE-4 PLASTICS */ + ["\u2677", "\u2677"], /* RECYCLING SYMBOL FOR TYPE-5 PLASTICS */ + ["\u2678", "\u2678"], /* RECYCLING SYMBOL FOR TYPE-6 PLASTICS */ + ["\u2679", "\u2679"], /* RECYCLING SYMBOL FOR TYPE-7 PLASTICS */ + ["\u267A", "\u267A"], /* RECYCLING SYMBOL FOR GENERIC MATERIALS */ + ["\u267B", "\u267B"], /* BLACK UNIVERSAL RECYCLING SYMBOL */ + ["\u267C", "\u267C"], /* RECYCLED PAPER SYMBOL */ + ["\u267D", "\u267D"], /* PARTIALLY-RECYCLED PAPER SYMBOL */ + ["\u267E", "\u267E"], /* PERMANENT PAPER SIGN */ + ["\u267F", "\u267F"], /* WHEELCHAIR SYMBOL */ + ["\u2680", "\u2680"], /* DIE FACE-1 */ + ["\u2681", "\u2681"], /* DIE FACE-2 */ + ["\u2682", "\u2682"], /* DIE FACE-3 */ + ["\u2683", "\u2683"], /* DIE FACE-4 */ + ["\u2684", "\u2684"], /* DIE FACE-5 */ + ["\u2685", "\u2685"], /* DIE FACE-6 */ + ["\u2686", "\u2686"], /* WHITE CIRCLE WITH DOT RIGHT */ + ["\u2687", "\u2687"], /* WHITE CIRCLE WITH TWO DOTS */ + ["\u2688", "\u2688"], /* BLACK CIRCLE WITH WHITE DOT RIGHT */ + ["\u2689", "\u2689"], /* BLACK CIRCLE WITH TWO WHITE DOTS */ + ["\u268A", "\u268A"], /* MONOGRAM FOR YANG */ + ["\u268B", "\u268B"], /* MONOGRAM FOR YIN */ + ["\u268C", "\u268C"], /* DIGRAM FOR GREATER YANG */ + ["\u268D", "\u268D"], /* DIGRAM FOR LESSER YIN */ + ["\u268E", "\u268E"], /* DIGRAM FOR LESSER YANG */ + ["\u268F", "\u268F"], /* DIGRAM FOR GREATER YIN */ + ["\u2690", "\u2690"], /* WHITE FLAG */ + ["\u2691", "\u2691"], /* BLACK FLAG */ + ["\u2692", "\u2692"], /* HAMMER AND PICK */ + ["\u2693", "\u2693"], /* ANCHOR */ + ["\u2694", "\u2694"], /* CROSSED SWORDS */ + ["\u2695", "\u2695"], /* STAFF OF AESCULAPIUS */ + ["\u2696", "\u2696"], /* SCALES */ + ["\u2697", "\u2697"], /* ALEMBIC */ + ["\u2698", "\u2698"], /* FLOWER */ + ["\u2699", "\u2699"], /* GEAR */ + ["\u269A", "\u269A"], /* STAFF OF HERMES */ + ["\u269B", "\u269B"], /* ATOM SYMBOL */ + ["\u269C", "\u269C"], /* FLEUR-DE-LIS */ + ["\u269D", "\u269D"], /* OUTLINED WHITE STAR */ + ["\u269E", "\u269E"], /* THREE LINES CONVERGING RIGHT */ + ["\u269F", "\u269F"], /* THREE LINES CONVERGING LEFT */ + ["\u26A0", "\u26A0"], /* WARNING SIGN */ + ["\u26A1", "\u26A1"], /* HIGH VOLTAGE SIGN */ + ["\u26A2", "\u26A2"], /* DOUBLED FEMALE SIGN */ + ["\u26A3", "\u26A3"], /* DOUBLED MALE SIGN */ + ["\u26A4", "\u26A4"], /* INTERLOCKED FEMALE AND MALE SIGN */ + ["\u26A5", "\u26A5"], /* MALE AND FEMALE SIGN */ + ["\u26A6", "\u26A6"], /* MALE WITH STROKE SIGN */ + ["\u26A7", "\u26A7"], /* MALE WITH STROKE AND MALE AND FEMALE SIGN */ + ["\u26A8", "\u26A8"], /* VERTICAL MALE WITH STROKE SIGN */ + ["\u26A9", "\u26A9"], /* HORIZONTAL MALE WITH STROKE SIGN */ + ["\u26AA", "\u26AA"], /* MEDIUM WHITE CIRCLE */ + ["\u26AB", "\u26AB"], /* MEDIUM BLACK CIRCLE */ + ["\u26AC", "\u26AC"], /* MEDIUM SMALL WHITE CIRCLE */ + ["\u26AD", "\u26AD"], /* MARRIAGE SYMBOL */ + ["\u26AE", "\u26AE"], /* DIVORCE SYMBOL */ + ["\u26AF", "\u26AF"], /* UNMARRIED PARTNERSHIP SYMBOL */ + ["\u26B0", "\u26B0"], /* COFFIN */ + ["\u26B1", "\u26B1"], /* FUNERAL URN */ + ["\u26B2", "\u26B2"], /* NEUTER */ + ["\u26B3", "\u26B3"], /* CERES */ + ["\u26B4", "\u26B4"], /* PALLAS */ + ["\u26B5", "\u26B5"], /* JUNO */ + ["\u26B6", "\u26B6"], /* VESTA */ + ["\u26B7", "\u26B7"], /* CHIRON */ + ["\u26B8", "\u26B8"], /* BLACK MOON LILITH */ + ["\u26B9", "\u26B9"], /* SEXTILE */ + ["\u26BA", "\u26BA"], /* SEMISEXTILE */ + ["\u26BB", "\u26BB"], /* QUINCUNX */ + ["\u26BC", "\u26BC"], /* SESQUIQUADRATE */ + ["\u26BD", "\u26BD"], /* SOCCER BALL */ + ["\u26BE", "\u26BE"], /* BASEBALL */ + ["\u26BF", "\u26BF"], /* SQUARED KEY */ + ["\u26C0", "\u26C0"], /* WHITE DRAUGHTS MAN */ + ["\u26C1", "\u26C1"], /* WHITE DRAUGHTS KING */ + ["\u26C2", "\u26C2"], /* BLACK DRAUGHTS MAN */ + ["\u26C3", "\u26C3"], /* BLACK DRAUGHTS KING */ + ["\u26C4", "\u26C4"], /* SNOWMAN WITHOUT SNOW */ + ["\u26C5", "\u26C5"], /* SUN BEHIND CLOUD */ + ["\u26C6", "\u26C6"], /* RAIN */ + ["\u26C7", "\u26C7"], /* BLACK SNOWMAN */ + ["\u26C8", "\u26C8"], /* THUNDER CLOUD AND RAIN */ + ["\u26C9", "\u26C9"], /* TURNED WHITE SHOGI PIECE */ + ["\u26CA", "\u26CA"], /* TURNED BLACK SHOGI PIECE */ + ["\u26CB", "\u26CB"], /* WHITE DIAMOND IN SQUARE */ + ["\u26CC", "\u26CC"], /* CROSSING LANES */ + ["\u26CD", "\u26CD"], /* DISABLED CAR */ + ["\u26CE", "\u26CE"], /* OPHIUCHUS */ + ["\u26CF", "\u26CF"], /* PICK */ + ["\u26D0", "\u26D0"], /* CAR SLIDING */ + ["\u26D1", "\u26D1"], /* HELMET WITH WHITE CROSS */ + ["\u26D2", "\u26D2"], /* CIRCLED CROSSING LANES */ + ["\u26D3", "\u26D3"], /* CHAINS */ + ["\u26D4", "\u26D4"], /* NO ENTRY */ + ["\u26D5", "\u26D5"], /* ALTERNATE ONE-WAY LEFT WAY TRAFFIC */ + ["\u26D6", "\u26D6"], /* BLACK TWO-WAY LEFT WAY TRAFFIC */ + ["\u26D7", "\u26D7"], /* WHITE TWO-WAY LEFT WAY TRAFFIC */ + ["\u26D8", "\u26D8"], /* BLACK LEFT LANE MERGE */ + ["\u26D9", "\u26D9"], /* WHITE LEFT LANE MERGE */ + ["\u26DA", "\u26DA"], /* DRIVE SLOW SIGN */ + ["\u26DB", "\u26DB"], /* HEAVY WHITE DOWN-POINTING TRIANGLE */ + ["\u26DC", "\u26DC"], /* LEFT CLOSED ENTRY */ + ["\u26DD", "\u26DD"], /* SQUARED SALTIRE */ + ["\u26DE", "\u26DE"], /* FALLING DIAGONAL IN WHITE CIRCLE IN BLACK SQUARE */ + ["\u26DF", "\u26DF"], /* BLACK TRUCK */ + ["\u26E0", "\u26E0"], /* RESTRICTED LEFT ENTRY-1 */ + ["\u26E1", "\u26E1"], /* RESTRICTED LEFT ENTRY-2 */ + ["\u26E2", "\u26E2"], /* ASTRONOMICAL SYMBOL FOR URANUS */ + ["\u26E3", "\u26E3"], /* HEAVY CIRCLE WITH STROKE AND TWO DOTS ABOVE */ + ["\u26E4", "\u26E4"], /* PENTAGRAM */ + ["\u26E5", "\u26E5"], /* RIGHT-HANDED INTERLACED PENTAGRAM */ + ["\u26E6", "\u26E6"], /* LEFT-HANDED INTERLACED PENTAGRAM */ + ["\u26E7", "\u26E7"], /* INVERTED PENTAGRAM */ + ["\u26E8", "\u26E8"], /* BLACK CROSS ON SHIELD */ + ["\u26E9", "\u26E9"], /* SHINTO SHRINE */ + ["\u26EA", "\u26EA"], /* CHURCH */ + ["\u26EB", "\u26EB"], /* CASTLE */ + ["\u26EC", "\u26EC"], /* HISTORIC SITE */ + ["\u26ED", "\u26ED"], /* GEAR WITHOUT HUB */ + ["\u26EE", "\u26EE"], /* GEAR WITH HANDLES */ + ["\u26EF", "\u26EF"], /* MAP SYMBOL FOR LIGHTHOUSE */ + ["\u26F0", "\u26F0"], /* MOUNTAIN */ + ["\u26F1", "\u26F1"], /* UMBRELLA ON GROUND */ + ["\u26F2", "\u26F2"], /* FOUNTAIN */ + ["\u26F3", "\u26F3"], /* FLAG IN HOLE */ + ["\u26F4", "\u26F4"], /* FERRY */ + ["\u26F5", "\u26F5"], /* SAILBOAT */ + ["\u26F6", "\u26F6"], /* SQUARE FOUR CORNERS */ + ["\u26F7", "\u26F7"], /* SKIER */ + ["\u26F8", "\u26F8"], /* ICE SKATE */ + ["\u26F9", "\u26F9"], /* PERSON WITH BALL */ + ["\u26FA", "\u26FA"], /* TENT */ + ["\u26FB", "\u26FB"], /* JAPANESE BANK SYMBOL */ + ["\u26FC", "\u26FC"], /* HEADSTONE GRAVEYARD SYMBOL */ + ["\u26FD", "\u26FD"], /* FUEL PUMP */ + ["\u26FE", "\u26FE"], /* CUP ON BLACK SQUARE */ + ["\u26FF", "\u26FF"], /* WHITE FLAG WITH HORIZONTAL MIDDLE BLACK STRIPE */ + ["\u2700", "\u2700"], /* BLACK SAFETY SCISSORS */ + ["\u2701", "\u2701"], /* UPPER BLADE SCISSORS */ + ["\u2702", "\u2702"], /* BLACK SCISSORS */ + ["\u2703", "\u2703"], /* LOWER BLADE SCISSORS */ + ["\u2704", "\u2704"], /* WHITE SCISSORS */ + ["\u2705", "\u2705"], /* WHITE HEAVY CHECK MARK */ + ["\u2706", "\u2706"], /* TELEPHONE LOCATION SIGN */ + ["\u2707", "\u2707"], /* TAPE DRIVE */ + ["\u2708", "\u2708"], /* AIRPLANE */ + ["\u2709", "\u2709"], /* ENVELOPE */ + ["\u270A", "\u270A"], /* RAISED FIST */ + ["\u270B", "\u270B"], /* RAISED HAND */ + ["\u270C", "\u270C"], /* VICTORY HAND */ + ["\u270D", "\u270D"], /* WRITING HAND */ + ["\u270E", "\u270E"], /* LOWER RIGHT PENCIL */ + ["\u270F", "\u270F"], /* PENCIL */ + ["\u2710", "\u2710"], /* UPPER RIGHT PENCIL */ + ["\u2711", "\u2711"], /* WHITE NIB */ + ["\u2712", "\u2712"], /* BLACK NIB */ + ["\u2713", "\u2713"], /* CHECK MARK */ + ["\u2714", "\u2714"], /* HEAVY CHECK MARK */ + ["\u2715", "\u2715"], /* MULTIPLICATION X */ + ["\u2716", "\u2716"], /* HEAVY MULTIPLICATION X */ + ["\u2717", "\u2717"], /* BALLOT X */ + ["\u2718", "\u2718"], /* HEAVY BALLOT X */ + ["\u2719", "\u2719"], /* OUTLINED GREEK CROSS */ + ["\u271A", "\u271A"], /* HEAVY GREEK CROSS */ + ["\u271B", "\u271B"], /* OPEN CENTRE CROSS (OPEN CENTER CROSS) */ + ["\u271C", "\u271C"], /* HEAVY OPEN CENTRE CROSS (HEAVY OPEN CENTER CROSS) */ + ["\u271D", "\u271D"], /* LATIN CROSS */ + ["\u271E", "\u271E"], /* SHADOWED WHITE LATIN CROSS */ + ["\u271F", "\u271F"], /* OUTLINED LATIN CROSS */ + ["\u2720", "\u2720"], /* MALTESE CROSS */ + ["\u2721", "\u2721"], /* STAR OF DAVID */ + ["\u2722", "\u2722"], /* FOUR TEARDROP-SPOKED ASTERISK */ + ["\u2723", "\u2723"], /* FOUR BALLOON-SPOKED ASTERISK */ + ["\u2724", "\u2724"], /* HEAVY FOUR BALLOON-SPOKED ASTERISK */ + ["\u2725", "\u2725"], /* FOUR CLUB-SPOKED ASTERISK */ + ["\u2726", "\u2726"], /* BLACK FOUR POINTED STAR */ + ["\u2727", "\u2727"], /* WHITE FOUR POINTED STAR */ + ["\u2728", "\u2728"], /* SPARKLES */ + ["\u2729", "\u2729"], /* STRESS OUTLINED WHITE STAR */ + ["\u272A", "\u272A"], /* CIRCLED WHITE STAR */ + ["\u272B", "\u272B"], /* OPEN CENTRE BLACK STAR (OPEN CENTER BLACK STAR) */ + ["\u272C", "\u272C"], /* BLACK CENTRE WHITE STAR (BLACK CENTER WHITE STAR) */ + ["\u272D", "\u272D"], /* OUTLINED BLACK STAR */ + ["\u272E", "\u272E"], /* HEAVY OUTLINED BLACK STAR */ + ["\u272F", "\u272F"], /* PINWHEEL STAR */ + ["\u2730", "\u2730"], /* SHADOWED WHITE STAR */ + ["\u2731", "\u2731"], /* HEAVY ASTERISK */ + ["\u2732", "\u2732"], /* OPEN CENTRE ASTERISK (OPEN CENTER ASTERISK) */ + ["\u2733", "\u2733"], /* EIGHT SPOKED ASTERISK */ + ["\u2734", "\u2734"], /* EIGHT POINTED BLACK STAR */ + ["\u2735", "\u2735"], /* EIGHT POINTED PINWHEEL STAR */ + ["\u2736", "\u2736"], /* SIX POINTED BLACK STAR */ + ["\u2737", "\u2737"], /* EIGHT POINTED RECTILINEAR BLACK STAR */ + ["\u2738", "\u2738"], /* HEAVY EIGHT POINTED RECTILINEAR BLACK STAR */ + ["\u2739", "\u2739"], /* TWELVE POINTED BLACK STAR */ + ["\u273A", "\u273A"], /* SIXTEEN POINTED ASTERISK */ + ["\u273B", "\u273B"], /* TEARDROP-SPOKED ASTERISK */ + ["\u273C", "\u273C"], /* OPEN CENTRE TEARDROP-SPOKED ASTERISK (OPEN CENTER TEARDROP-SPOKED ASTERISK) */ + ["\u273D", "\u273D"], /* HEAVY TEARDROP-SPOKED ASTERISK */ + ["\u273E", "\u273E"], /* SIX PETALLED BLACK AND WHITE FLORETTE */ + ["\u273F", "\u273F"], /* BLACK FLORETTE */ + ["\u2740", "\u2740"], /* WHITE FLORETTE */ + ["\u2741", "\u2741"], /* EIGHT PETALLED OUTLINED BLACK FLORETTE */ + ["\u2742", "\u2742"], /* CIRCLED OPEN CENTRE EIGHT POINTED STAR (CIRCLED OPEN CENTER EIGHT POINTED STAR) */ + ["\u2743", "\u2743"], /* HEAVY TEARDROP-SPOKED PINWHEEL ASTERISK */ + ["\u2744", "\u2744"], /* SNOWFLAKE */ + ["\u2745", "\u2745"], /* TIGHT TRIFOLIATE SNOWFLAKE */ + ["\u2746", "\u2746"], /* HEAVY CHEVRON SNOWFLAKE */ + ["\u2747", "\u2747"], /* SPARKLE */ + ["\u2748", "\u2748"], /* HEAVY SPARKLE */ + ["\u2749", "\u2749"], /* BALLOON-SPOKED ASTERISK */ + ["\u274A", "\u274A"], /* EIGHT TEARDROP-SPOKED PROPELLER ASTERISK */ + ["\u274B", "\u274B"], /* HEAVY EIGHT TEARDROP-SPOKED PROPELLER ASTERISK */ + ["\u274C", "\u274C"], /* CROSS MARK */ + ["\u274D", "\u274D"], /* SHADOWED WHITE CIRCLE */ + ["\u274E", "\u274E"], /* NEGATIVE SQUARED CROSS MARK */ + ["\u274F", "\u274F"], /* LOWER RIGHT DROP-SHADOWED WHITE SQUARE */ + ["\u2750", "\u2750"], /* UPPER RIGHT DROP-SHADOWED WHITE SQUARE */ + ["\u2751", "\u2751"], /* LOWER RIGHT SHADOWED WHITE SQUARE */ + ["\u2752", "\u2752"], /* UPPER RIGHT SHADOWED WHITE SQUARE */ + ["\u2753", "\u2753"], /* BLACK QUESTION MARK ORNAMENT */ + ["\u2754", "\u2754"], /* WHITE QUESTION MARK ORNAMENT */ + ["\u2755", "\u2755"], /* WHITE EXCLAMATION MARK ORNAMENT */ + ["\u2756", "\u2756"], /* BLACK DIAMOND MINUS WHITE X */ + ["\u2757", "\u2757"], /* HEAVY EXCLAMATION MARK SYMBOL */ + ["\u2758", "\u2758"], /* LIGHT VERTICAL BAR */ + ["\u2759", "\u2759"], /* MEDIUM VERTICAL BAR */ + ["\u275A", "\u275A"], /* HEAVY VERTICAL BAR */ + ["\u275B", "\u275B"], /* HEAVY SINGLE TURNED COMMA QUOTATION MARK ORNAMENT */ + ["\u275C", "\u275C"], /* HEAVY SINGLE COMMA QUOTATION MARK ORNAMENT */ + ["\u275D", "\u275D"], /* HEAVY DOUBLE TURNED COMMA QUOTATION MARK ORNAMENT */ + ["\u275E", "\u275E"], /* HEAVY DOUBLE COMMA QUOTATION MARK ORNAMENT */ + ["\u275F", "\u275F"], /* HEAVY LOW SINGLE COMMA QUOTATION MARK ORNAMENT */ + ["\u2760", "\u2760"], /* HEAVY LOW DOUBLE COMMA QUOTATION MARK ORNAMENT */ + ["\u2761", "\u2761"], /* CURVED STEM PARAGRAPH SIGN ORNAMENT */ + ["\u2762", "\u2762"], /* HEAVY EXCLAMATION MARK ORNAMENT */ + ["\u2763", "\u2763"], /* HEAVY HEART EXCLAMATION MARK ORNAMENT */ + ["\u2764", "\u2764"], /* HEAVY BLACK HEART */ + ["\u2765", "\u2765"], /* ROTATED HEAVY BLACK HEART BULLET */ + ["\u2766", "\u2766"], /* FLORAL HEART */ + ["\u2767", "\u2767"], /* ROTATED FLORAL HEART BULLET */ + ["\u2768", "\u2768"], /* MEDIUM LEFT PARENTHESIS ORNAMENT */ + ["\u2769", "\u2769"], /* MEDIUM RIGHT PARENTHESIS ORNAMENT */ + ["\u276A", "\u276A"], /* MEDIUM FLATTENED LEFT PARENTHESIS ORNAMENT */ + ["\u276B", "\u276B"], /* MEDIUM FLATTENED RIGHT PARENTHESIS ORNAMENT */ + ["\u276C", "\u276C"], /* MEDIUM LEFT-POINTING ANGLE BRACKET ORNAMENT */ + ["\u276D", "\u276D"], /* MEDIUM RIGHT-POINTING ANGLE BRACKET ORNAMENT */ + ["\u276E", "\u276E"], /* HEAVY LEFT-POINTING ANGLE QUOTATION MARK ORNAMENT */ + ["\u276F", "\u276F"], /* HEAVY RIGHT-POINTING ANGLE QUOTATION MARK ORNAMENT */ + ["\u2770", "\u2770"], /* HEAVY LEFT-POINTING ANGLE BRACKET ORNAMENT */ + ["\u2771", "\u2771"], /* HEAVY RIGHT-POINTING ANGLE BRACKET ORNAMENT */ + ["\u2772", "\u2772"], /* LIGHT LEFT TORTOISE SHELL BRACKET ORNAMENT */ + ["\u2773", "\u2773"], /* LIGHT RIGHT TORTOISE SHELL BRACKET ORNAMENT */ + ["\u2774", "\u2774"], /* MEDIUM LEFT CURLY BRACKET ORNAMENT */ + ["\u2775", "\u2775"], /* MEDIUM RIGHT CURLY BRACKET ORNAMENT */ + ["\u2776", "\u2776"], /* DINGBAT NEGATIVE CIRCLED DIGIT ONE (INVERSE CIRCLED DIGIT ONE) */ + ["\u2777", "\u2777"], /* DINGBAT NEGATIVE CIRCLED DIGIT TWO (INVERSE CIRCLED DIGIT TWO) */ + ["\u2778", "\u2778"], /* DINGBAT NEGATIVE CIRCLED DIGIT THREE (INVERSE CIRCLED DIGIT THREE) */ + ["\u2779", "\u2779"], /* DINGBAT NEGATIVE CIRCLED DIGIT FOUR (INVERSE CIRCLED DIGIT FOUR) */ + ["\u277A", "\u277A"], /* DINGBAT NEGATIVE CIRCLED DIGIT FIVE (INVERSE CIRCLED DIGIT FIVE) */ + ["\u277B", "\u277B"], /* DINGBAT NEGATIVE CIRCLED DIGIT SIX (INVERSE CIRCLED DIGIT SIX) */ + ["\u277C", "\u277C"], /* DINGBAT NEGATIVE CIRCLED DIGIT SEVEN (INVERSE CIRCLED DIGIT SEVEN) */ + ["\u277D", "\u277D"], /* DINGBAT NEGATIVE CIRCLED DIGIT EIGHT (INVERSE CIRCLED DIGIT EIGHT) */ + ["\u277E", "\u277E"], /* DINGBAT NEGATIVE CIRCLED DIGIT NINE (INVERSE CIRCLED DIGIT NINE) */ + ["\u277F", "\u277F"], /* DINGBAT NEGATIVE CIRCLED NUMBER TEN (INVERSE CIRCLED NUMBER TEN) */ + ["\u2780", "\u2780"], /* DINGBAT CIRCLED SANS-SERIF DIGIT ONE (CIRCLED SANS-SERIF DIGIT ONE) */ + ["\u2781", "\u2781"], /* DINGBAT CIRCLED SANS-SERIF DIGIT TWO (CIRCLED SANS-SERIF DIGIT TWO) */ + ["\u2782", "\u2782"], /* DINGBAT CIRCLED SANS-SERIF DIGIT THREE (CIRCLED SANS-SERIF DIGIT THREE) */ + ["\u2783", "\u2783"], /* DINGBAT CIRCLED SANS-SERIF DIGIT FOUR (CIRCLED SANS-SERIF DIGIT FOUR) */ + ["\u2784", "\u2784"], /* DINGBAT CIRCLED SANS-SERIF DIGIT FIVE (CIRCLED SANS-SERIF DIGIT FIVE) */ + ["\u2785", "\u2785"], /* DINGBAT CIRCLED SANS-SERIF DIGIT SIX (CIRCLED SANS-SERIF DIGIT SIX) */ + ["\u2786", "\u2786"], /* DINGBAT CIRCLED SANS-SERIF DIGIT SEVEN (CIRCLED SANS-SERIF DIGIT SEVEN) */ + ["\u2787", "\u2787"], /* DINGBAT CIRCLED SANS-SERIF DIGIT EIGHT (CIRCLED SANS-SERIF DIGIT EIGHT) */ + ["\u2788", "\u2788"], /* DINGBAT CIRCLED SANS-SERIF DIGIT NINE (CIRCLED SANS-SERIF DIGIT NINE) */ + ["\u2789", "\u2789"], /* DINGBAT CIRCLED SANS-SERIF NUMBER TEN (CIRCLED SANS-SERIF NUMBER TEN) */ + ["\u278A", "\u278A"], /* DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT ONE (INVERSE CIRCLED SANS-SERIF DIGIT ONE) */ + ["\u278B", "\u278B"], /* DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT TWO (INVERSE CIRCLED SANS-SERIF DIGIT TWO) */ + ["\u278C", "\u278C"], /* DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT THREE (INVERSE CIRCLED SANS-SERIF DIGIT THREE) */ + ["\u278D", "\u278D"], /* DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT FOUR (INVERSE CIRCLED SANS-SERIF DIGIT FOUR) */ + ["\u278E", "\u278E"], /* DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT FIVE (INVERSE CIRCLED SANS-SERIF DIGIT FIVE) */ + ["\u278F", "\u278F"], /* DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT SIX (INVERSE CIRCLED SANS-SERIF DIGIT SIX) */ + ["\u2790", "\u2790"], /* DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT SEVEN (INVERSE CIRCLED SANS-SERIF DIGIT SEVEN) */ + ["\u2791", "\u2791"], /* DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT EIGHT (INVERSE CIRCLED SANS-SERIF DIGIT EIGHT) */ + ["\u2792", "\u2792"], /* DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT NINE (INVERSE CIRCLED SANS-SERIF DIGIT NINE) */ + ["\u2793", "\u2793"], /* DINGBAT NEGATIVE CIRCLED SANS-SERIF NUMBER TEN (INVERSE CIRCLED SANS-SERIF NUMBER TEN) */ + ["\u2794", "\u2794"], /* HEAVY WIDE-HEADED RIGHTWARDS ARROW (HEAVY WIDE-HEADED RIGHT ARROW) */ + ["\u2795", "\u2795"], /* HEAVY PLUS SIGN */ + ["\u2796", "\u2796"], /* HEAVY MINUS SIGN */ + ["\u2797", "\u2797"], /* HEAVY DIVISION SIGN */ + ["\u2798", "\u2798"], /* HEAVY SOUTH EAST ARROW (HEAVY LOWER RIGHT ARROW) */ + ["\u2799", "\u2799"], /* HEAVY RIGHTWARDS ARROW (HEAVY RIGHT ARROW) */ + ["\u279A", "\u279A"], /* HEAVY NORTH EAST ARROW (HEAVY UPPER RIGHT ARROW) */ + ["\u279B", "\u279B"], /* DRAFTING POINT RIGHTWARDS ARROW (DRAFTING POINT RIGHT ARROW) */ + ["\u279C", "\u279C"], /* HEAVY ROUND-TIPPED RIGHTWARDS ARROW (HEAVY ROUND-TIPPED RIGHT ARROW) */ + ["\u279D", "\u279D"], /* TRIANGLE-HEADED RIGHTWARDS ARROW (TRIANGLE-HEADED RIGHT ARROW) */ + ["\u279E", "\u279E"], /* HEAVY TRIANGLE-HEADED RIGHTWARDS ARROW (HEAVY TRIANGLE-HEADED RIGHT ARROW) */ + ["\u279F", "\u279F"], /* DASHED TRIANGLE-HEADED RIGHTWARDS ARROW (DASHED TRIANGLE-HEADED RIGHT ARROW) */ + ["\u27A0", "\u27A0"], /* HEAVY DASHED TRIANGLE-HEADED RIGHTWARDS ARROW (HEAVY DASHED TRIANGLE-HEADED RIGHT ARROW) */ + ["\u27A1", "\u27A1"], /* BLACK RIGHTWARDS ARROW (BLACK RIGHT ARROW) */ + ["\u27A2", "\u27A2"], /* THREE-D TOP-LIGHTED RIGHTWARDS ARROWHEAD (THREE-D TOP-LIGHTED RIGHT ARROWHEAD) */ + ["\u27A3", "\u27A3"], /* THREE-D BOTTOM-LIGHTED RIGHTWARDS ARROWHEAD (THREE-D BOTTOM-LIGHTED RIGHT ARROWHEAD) */ + ["\u27A4", "\u27A4"], /* BLACK RIGHTWARDS ARROWHEAD (BLACK RIGHT ARROWHEAD) */ + ["\u27A5", "\u27A5"], /* HEAVY BLACK CURVED DOWNWARDS AND RIGHTWARDS ARROW (HEAVY BLACK CURVED DOWN AND RIGHT ARROW) */ + ["\u27A6", "\u27A6"], /* HEAVY BLACK CURVED UPWARDS AND RIGHTWARDS ARROW (HEAVY BLACK CURVED UP AND RIGHT ARROW) */ + ["\u27A7", "\u27A7"], /* SQUAT BLACK RIGHTWARDS ARROW (SQUAT BLACK RIGHT ARROW) */ + ["\u27A8", "\u27A8"], /* HEAVY CONCAVE-POINTED BLACK RIGHTWARDS ARROW (HEAVY CONCAVE-POINTED BLACK RIGHT ARROW) */ + ["\u27A9", "\u27A9"], /* RIGHT-SHADED WHITE RIGHTWARDS ARROW (RIGHT-SHADED WHITE RIGHT ARROW) */ + ["\u27AA", "\u27AA"], /* LEFT-SHADED WHITE RIGHTWARDS ARROW (LEFT-SHADED WHITE RIGHT ARROW) */ + ["\u27AB", "\u27AB"], /* BACK-TILTED SHADOWED WHITE RIGHTWARDS ARROW (BACK-TILTED SHADOWED WHITE RIGHT ARROW) */ + ["\u27AC", "\u27AC"], /* FRONT-TILTED SHADOWED WHITE RIGHTWARDS ARROW (FRONT-TILTED SHADOWED WHITE RIGHT ARROW) */ + ["\u27AD", "\u27AD"], /* HEAVY LOWER RIGHT-SHADOWED WHITE RIGHTWARDS ARROW (HEAVY LOWER RIGHT-SHADOWED WHITE RIGHT ARROW) */ + ["\u27AE", "\u27AE"], /* HEAVY UPPER RIGHT-SHADOWED WHITE RIGHTWARDS ARROW (HEAVY UPPER RIGHT-SHADOWED WHITE RIGHT ARROW) */ + ["\u27AF", "\u27AF"], /* NOTCHED LOWER RIGHT-SHADOWED WHITE RIGHTWARDS ARROW (NOTCHED LOWER RIGHT-SHADOWED WHITE RIGHT ARROW) */ + ["\u27B0", "\u27B0"], /* CURLY LOOP */ + ["\u27B1", "\u27B1"], /* NOTCHED UPPER RIGHT-SHADOWED WHITE RIGHTWARDS ARROW (NOTCHED UPPER RIGHT-SHADOWED WHITE RIGHT ARROW) */ + ["\u27B2", "\u27B2"], /* CIRCLED HEAVY WHITE RIGHTWARDS ARROW (CIRCLED HEAVY WHITE RIGHT ARROW) */ + ["\u27B3", "\u27B3"], /* WHITE-FEATHERED RIGHTWARDS ARROW (WHITE-FEATHERED RIGHT ARROW) */ + ["\u27B4", "\u27B4"], /* BLACK-FEATHERED SOUTH EAST ARROW (BLACK-FEATHERED LOWER RIGHT ARROW) */ + ["\u27B5", "\u27B5"], /* BLACK-FEATHERED RIGHTWARDS ARROW (BLACK-FEATHERED RIGHT ARROW) */ + ["\u27B6", "\u27B6"], /* BLACK-FEATHERED NORTH EAST ARROW (BLACK-FEATHERED UPPER RIGHT ARROW) */ + ["\u27B7", "\u27B7"], /* HEAVY BLACK-FEATHERED SOUTH EAST ARROW (HEAVY BLACK-FEATHERED LOWER RIGHT ARROW) */ + ["\u27B8", "\u27B8"], /* HEAVY BLACK-FEATHERED RIGHTWARDS ARROW (HEAVY BLACK-FEATHERED RIGHT ARROW) */ + ["\u27B9", "\u27B9"], /* HEAVY BLACK-FEATHERED NORTH EAST ARROW (HEAVY BLACK-FEATHERED UPPER RIGHT ARROW) */ + ["\u27BA", "\u27BA"], /* TEARDROP-BARBED RIGHTWARDS ARROW (TEARDROP-BARBED RIGHT ARROW) */ + ["\u27BB", "\u27BB"], /* HEAVY TEARDROP-SHANKED RIGHTWARDS ARROW (HEAVY TEARDROP-SHANKED RIGHT ARROW) */ + ["\u27BC", "\u27BC"], /* WEDGE-TAILED RIGHTWARDS ARROW (WEDGE-TAILED RIGHT ARROW) */ + ["\u27BD", "\u27BD"], /* HEAVY WEDGE-TAILED RIGHTWARDS ARROW (HEAVY WEDGE-TAILED RIGHT ARROW) */ + ["\u27BE", "\u27BE"], /* OPEN-OUTLINED RIGHTWARDS ARROW (OPEN-OUTLINED RIGHT ARROW) */ + ["\u27BF", "\u27BF"], /* DOUBLE CURLY LOOP */ + ["\u27C0", "\u27C0"], /* THREE DIMENSIONAL ANGLE */ + ["\u27C1", "\u27C1"], /* WHITE TRIANGLE CONTAINING SMALL WHITE TRIANGLE */ + ["\u27C2", "\u27C2"], /* PERPENDICULAR */ + ["\u27C3", "\u27C3"], /* OPEN SUBSET */ + ["\u27C4", "\u27C4"], /* OPEN SUPERSET */ + ["\u27C5", "\u27C5"], /* LEFT S-SHAPED BAG DELIMITER */ + ["\u27C6", "\u27C6"], /* RIGHT S-SHAPED BAG DELIMITER */ + ["\u27C7", "\u27C7"], /* OR WITH DOT INSIDE */ + ["\u27C8", "\u27C8"], /* REVERSE SOLIDUS PRECEDING SUBSET */ + ["\u27C9", "\u27C9"], /* SUPERSET PRECEDING SOLIDUS */ + ["\u27CA", "\u27CA"], /* VERTICAL BAR WITH HORIZONTAL STROKE */ + ["\u27CB", "\u27CB"], /* MATHEMATICAL RISING DIAGONAL */ + ["\u27CC", "\u27CC"], /* LONG DIVISION */ + ["\u27CD", "\u27CD"], /* MATHEMATICAL FALLING DIAGONAL */ + ["\u27CE", "\u27CE"], /* SQUARED LOGICAL AND */ + ["\u27CF", "\u27CF"], /* SQUARED LOGICAL OR */ + ["\u27D0", "\u27D0"], /* WHITE DIAMOND WITH CENTRED DOT */ + ["\u27D1", "\u27D1"], /* AND WITH DOT */ + ["\u27D2", "\u27D2"], /* ELEMENT OF OPENING UPWARDS */ + ["\u27D3", "\u27D3"], /* LOWER RIGHT CORNER WITH DOT */ + ["\u27D4", "\u27D4"], /* UPPER LEFT CORNER WITH DOT */ + ["\u27D5", "\u27D5"], /* LEFT OUTER JOIN */ + ["\u27D6", "\u27D6"], /* RIGHT OUTER JOIN */ + ["\u27D7", "\u27D7"], /* FULL OUTER JOIN */ + ["\u27D8", "\u27D8"], /* LARGE UP TACK */ + ["\u27D9", "\u27D9"], /* LARGE DOWN TACK */ + ["\u27DA", "\u27DA"], /* LEFT AND RIGHT DOUBLE TURNSTILE */ + ["\u27DB", "\u27DB"], /* LEFT AND RIGHT TACK */ + ["\u27DC", "\u27DC"], /* LEFT MULTIMAP */ + ["\u27DD", "\u27DD"], /* LONG RIGHT TACK */ + ["\u27DE", "\u27DE"], /* LONG LEFT TACK */ + ["\u27DF", "\u27DF"], /* UP TACK WITH CIRCLE ABOVE */ + ["\u27E0", "\u27E0"], /* LOZENGE DIVIDED BY HORIZONTAL RULE */ + ["\u27E1", "\u27E1"], /* WHITE CONCAVE-SIDED DIAMOND */ + ["\u27E2", "\u27E2"], /* WHITE CONCAVE-SIDED DIAMOND WITH LEFTWARDS TICK */ + ["\u27E3", "\u27E3"], /* WHITE CONCAVE-SIDED DIAMOND WITH RIGHTWARDS TICK */ + ["\u27E4", "\u27E4"], /* WHITE SQUARE WITH LEFTWARDS TICK */ + ["\u27E5", "\u27E5"], /* WHITE SQUARE WITH RIGHTWARDS TICK */ + ["\u27E6", "\u27E6"], /* MATHEMATICAL LEFT WHITE SQUARE BRACKET */ + ["\u27E7", "\u27E7"], /* MATHEMATICAL RIGHT WHITE SQUARE BRACKET */ + ["\u27E8", "\u27E8"], /* MATHEMATICAL LEFT ANGLE BRACKET */ + ["\u27E9", "\u27E9"], /* MATHEMATICAL RIGHT ANGLE BRACKET */ + ["\u27EA", "\u27EA"], /* MATHEMATICAL LEFT DOUBLE ANGLE BRACKET */ + ["\u27EB", "\u27EB"], /* MATHEMATICAL RIGHT DOUBLE ANGLE BRACKET */ + ["\u27EC", "\u27EC"], /* MATHEMATICAL LEFT WHITE TORTOISE SHELL BRACKET */ + ["\u27ED", "\u27ED"], /* MATHEMATICAL RIGHT WHITE TORTOISE SHELL BRACKET */ + ["\u27EE", "\u27EE"], /* MATHEMATICAL LEFT FLATTENED PARENTHESIS */ + ["\u27EF", "\u27EF"], /* MATHEMATICAL RIGHT FLATTENED PARENTHESIS */ + ["\u27F0", "\u27F0"], /* UPWARDS QUADRUPLE ARROW */ + ["\u27F1", "\u27F1"], /* DOWNWARDS QUADRUPLE ARROW */ + ["\u27F2", "\u27F2"], /* ANTICLOCKWISE GAPPED CIRCLE ARROW */ + ["\u27F3", "\u27F3"], /* CLOCKWISE GAPPED CIRCLE ARROW */ + ["\u27F4", "\u27F4"], /* RIGHT ARROW WITH CIRCLED PLUS */ + ["\u27F5", "\u27F5"], /* LONG LEFTWARDS ARROW */ + ["\u27F6", "\u27F6"], /* LONG RIGHTWARDS ARROW */ + ["\u27F7", "\u27F7"], /* LONG LEFT RIGHT ARROW */ + ["\u27F8", "\u27F8"], /* LONG LEFTWARDS DOUBLE ARROW */ + ["\u27F9", "\u27F9"], /* LONG RIGHTWARDS DOUBLE ARROW */ + ["\u27FA", "\u27FA"], /* LONG LEFT RIGHT DOUBLE ARROW */ + ["\u27FB", "\u27FB"], /* LONG LEFTWARDS ARROW FROM BAR */ + ["\u27FC", "\u27FC"], /* LONG RIGHTWARDS ARROW FROM BAR */ + ["\u27FD", "\u27FD"], /* LONG LEFTWARDS DOUBLE ARROW FROM BAR */ + ["\u27FE", "\u27FE"], /* LONG RIGHTWARDS DOUBLE ARROW FROM BAR */ + ["\u27FF", "\u27FF"], /* LONG RIGHTWARDS SQUIGGLE ARROW */ + ["\u2800", "\u2800"], /* BRAILLE PATTERN BLANK */ + ["\u2801", "\u2801"], /* BRAILLE PATTERN DOTS-1 */ + ["\u2802", "\u2802"], /* BRAILLE PATTERN DOTS-2 */ + ["\u2803", "\u2803"], /* BRAILLE PATTERN DOTS-12 */ + ["\u2804", "\u2804"], /* BRAILLE PATTERN DOTS-3 */ + ["\u2805", "\u2805"], /* BRAILLE PATTERN DOTS-13 */ + ["\u2806", "\u2806"], /* BRAILLE PATTERN DOTS-23 */ + ["\u2807", "\u2807"], /* BRAILLE PATTERN DOTS-123 */ + ["\u2808", "\u2808"], /* BRAILLE PATTERN DOTS-4 */ + ["\u2809", "\u2809"], /* BRAILLE PATTERN DOTS-14 */ + ["\u280A", "\u280A"], /* BRAILLE PATTERN DOTS-24 */ + ["\u280B", "\u280B"], /* BRAILLE PATTERN DOTS-124 */ + ["\u280C", "\u280C"], /* BRAILLE PATTERN DOTS-34 */ + ["\u280D", "\u280D"], /* BRAILLE PATTERN DOTS-134 */ + ["\u280E", "\u280E"], /* BRAILLE PATTERN DOTS-234 */ + ["\u280F", "\u280F"], /* BRAILLE PATTERN DOTS-1234 */ + ["\u2810", "\u2810"], /* BRAILLE PATTERN DOTS-5 */ + ["\u2811", "\u2811"], /* BRAILLE PATTERN DOTS-15 */ + ["\u2812", "\u2812"], /* BRAILLE PATTERN DOTS-25 */ + ["\u2813", "\u2813"], /* BRAILLE PATTERN DOTS-125 */ + ["\u2814", "\u2814"], /* BRAILLE PATTERN DOTS-35 */ + ["\u2815", "\u2815"], /* BRAILLE PATTERN DOTS-135 */ + ["\u2816", "\u2816"], /* BRAILLE PATTERN DOTS-235 */ + ["\u2817", "\u2817"], /* BRAILLE PATTERN DOTS-1235 */ + ["\u2818", "\u2818"], /* BRAILLE PATTERN DOTS-45 */ + ["\u2819", "\u2819"], /* BRAILLE PATTERN DOTS-145 */ + ["\u281A", "\u281A"], /* BRAILLE PATTERN DOTS-245 */ + ["\u281B", "\u281B"], /* BRAILLE PATTERN DOTS-1245 */ + ["\u281C", "\u281C"], /* BRAILLE PATTERN DOTS-345 */ + ["\u281D", "\u281D"], /* BRAILLE PATTERN DOTS-1345 */ + ["\u281E", "\u281E"], /* BRAILLE PATTERN DOTS-2345 */ + ["\u281F", "\u281F"], /* BRAILLE PATTERN DOTS-12345 */ + ["\u2820", "\u2820"], /* BRAILLE PATTERN DOTS-6 */ + ["\u2821", "\u2821"], /* BRAILLE PATTERN DOTS-16 */ + ["\u2822", "\u2822"], /* BRAILLE PATTERN DOTS-26 */ + ["\u2823", "\u2823"], /* BRAILLE PATTERN DOTS-126 */ + ["\u2824", "\u2824"], /* BRAILLE PATTERN DOTS-36 */ + ["\u2825", "\u2825"], /* BRAILLE PATTERN DOTS-136 */ + ["\u2826", "\u2826"], /* BRAILLE PATTERN DOTS-236 */ + ["\u2827", "\u2827"], /* BRAILLE PATTERN DOTS-1236 */ + ["\u2828", "\u2828"], /* BRAILLE PATTERN DOTS-46 */ + ["\u2829", "\u2829"], /* BRAILLE PATTERN DOTS-146 */ + ["\u282A", "\u282A"], /* BRAILLE PATTERN DOTS-246 */ + ["\u282B", "\u282B"], /* BRAILLE PATTERN DOTS-1246 */ + ["\u282C", "\u282C"], /* BRAILLE PATTERN DOTS-346 */ + ["\u282D", "\u282D"], /* BRAILLE PATTERN DOTS-1346 */ + ["\u282E", "\u282E"], /* BRAILLE PATTERN DOTS-2346 */ + ["\u282F", "\u282F"], /* BRAILLE PATTERN DOTS-12346 */ + ["\u2830", "\u2830"], /* BRAILLE PATTERN DOTS-56 */ + ["\u2831", "\u2831"], /* BRAILLE PATTERN DOTS-156 */ + ["\u2832", "\u2832"], /* BRAILLE PATTERN DOTS-256 */ + ["\u2833", "\u2833"], /* BRAILLE PATTERN DOTS-1256 */ + ["\u2834", "\u2834"], /* BRAILLE PATTERN DOTS-356 */ + ["\u2835", "\u2835"], /* BRAILLE PATTERN DOTS-1356 */ + ["\u2836", "\u2836"], /* BRAILLE PATTERN DOTS-2356 */ + ["\u2837", "\u2837"], /* BRAILLE PATTERN DOTS-12356 */ + ["\u2838", "\u2838"], /* BRAILLE PATTERN DOTS-456 */ + ["\u2839", "\u2839"], /* BRAILLE PATTERN DOTS-1456 */ + ["\u283A", "\u283A"], /* BRAILLE PATTERN DOTS-2456 */ + ["\u283B", "\u283B"], /* BRAILLE PATTERN DOTS-12456 */ + ["\u283C", "\u283C"], /* BRAILLE PATTERN DOTS-3456 */ + ["\u283D", "\u283D"], /* BRAILLE PATTERN DOTS-13456 */ + ["\u283E", "\u283E"], /* BRAILLE PATTERN DOTS-23456 */ + ["\u283F", "\u283F"], /* BRAILLE PATTERN DOTS-123456 */ + ["\u2840", "\u2840"], /* BRAILLE PATTERN DOTS-7 */ + ["\u2841", "\u2841"], /* BRAILLE PATTERN DOTS-17 */ + ["\u2842", "\u2842"], /* BRAILLE PATTERN DOTS-27 */ + ["\u2843", "\u2843"], /* BRAILLE PATTERN DOTS-127 */ + ["\u2844", "\u2844"], /* BRAILLE PATTERN DOTS-37 */ + ["\u2845", "\u2845"], /* BRAILLE PATTERN DOTS-137 */ + ["\u2846", "\u2846"], /* BRAILLE PATTERN DOTS-237 */ + ["\u2847", "\u2847"], /* BRAILLE PATTERN DOTS-1237 */ + ["\u2848", "\u2848"], /* BRAILLE PATTERN DOTS-47 */ + ["\u2849", "\u2849"], /* BRAILLE PATTERN DOTS-147 */ + ["\u284A", "\u284A"], /* BRAILLE PATTERN DOTS-247 */ + ["\u284B", "\u284B"], /* BRAILLE PATTERN DOTS-1247 */ + ["\u284C", "\u284C"], /* BRAILLE PATTERN DOTS-347 */ + ["\u284D", "\u284D"], /* BRAILLE PATTERN DOTS-1347 */ + ["\u284E", "\u284E"], /* BRAILLE PATTERN DOTS-2347 */ + ["\u284F", "\u284F"], /* BRAILLE PATTERN DOTS-12347 */ + ["\u2850", "\u2850"], /* BRAILLE PATTERN DOTS-57 */ + ["\u2851", "\u2851"], /* BRAILLE PATTERN DOTS-157 */ + ["\u2852", "\u2852"], /* BRAILLE PATTERN DOTS-257 */ + ["\u2853", "\u2853"], /* BRAILLE PATTERN DOTS-1257 */ + ["\u2854", "\u2854"], /* BRAILLE PATTERN DOTS-357 */ + ["\u2855", "\u2855"], /* BRAILLE PATTERN DOTS-1357 */ + ["\u2856", "\u2856"], /* BRAILLE PATTERN DOTS-2357 */ + ["\u2857", "\u2857"], /* BRAILLE PATTERN DOTS-12357 */ + ["\u2858", "\u2858"], /* BRAILLE PATTERN DOTS-457 */ + ["\u2859", "\u2859"], /* BRAILLE PATTERN DOTS-1457 */ + ["\u285A", "\u285A"], /* BRAILLE PATTERN DOTS-2457 */ + ["\u285B", "\u285B"], /* BRAILLE PATTERN DOTS-12457 */ + ["\u285C", "\u285C"], /* BRAILLE PATTERN DOTS-3457 */ + ["\u285D", "\u285D"], /* BRAILLE PATTERN DOTS-13457 */ + ["\u285E", "\u285E"], /* BRAILLE PATTERN DOTS-23457 */ + ["\u285F", "\u285F"], /* BRAILLE PATTERN DOTS-123457 */ + ["\u2860", "\u2860"], /* BRAILLE PATTERN DOTS-67 */ + ["\u2861", "\u2861"], /* BRAILLE PATTERN DOTS-167 */ + ["\u2862", "\u2862"], /* BRAILLE PATTERN DOTS-267 */ + ["\u2863", "\u2863"], /* BRAILLE PATTERN DOTS-1267 */ + ["\u2864", "\u2864"], /* BRAILLE PATTERN DOTS-367 */ + ["\u2865", "\u2865"], /* BRAILLE PATTERN DOTS-1367 */ + ["\u2866", "\u2866"], /* BRAILLE PATTERN DOTS-2367 */ + ["\u2867", "\u2867"], /* BRAILLE PATTERN DOTS-12367 */ + ["\u2868", "\u2868"], /* BRAILLE PATTERN DOTS-467 */ + ["\u2869", "\u2869"], /* BRAILLE PATTERN DOTS-1467 */ + ["\u286A", "\u286A"], /* BRAILLE PATTERN DOTS-2467 */ + ["\u286B", "\u286B"], /* BRAILLE PATTERN DOTS-12467 */ + ["\u286C", "\u286C"], /* BRAILLE PATTERN DOTS-3467 */ + ["\u286D", "\u286D"], /* BRAILLE PATTERN DOTS-13467 */ + ["\u286E", "\u286E"], /* BRAILLE PATTERN DOTS-23467 */ + ["\u286F", "\u286F"], /* BRAILLE PATTERN DOTS-123467 */ + ["\u2870", "\u2870"], /* BRAILLE PATTERN DOTS-567 */ + ["\u2871", "\u2871"], /* BRAILLE PATTERN DOTS-1567 */ + ["\u2872", "\u2872"], /* BRAILLE PATTERN DOTS-2567 */ + ["\u2873", "\u2873"], /* BRAILLE PATTERN DOTS-12567 */ + ["\u2874", "\u2874"], /* BRAILLE PATTERN DOTS-3567 */ + ["\u2875", "\u2875"], /* BRAILLE PATTERN DOTS-13567 */ + ["\u2876", "\u2876"], /* BRAILLE PATTERN DOTS-23567 */ + ["\u2877", "\u2877"], /* BRAILLE PATTERN DOTS-123567 */ + ["\u2878", "\u2878"], /* BRAILLE PATTERN DOTS-4567 */ + ["\u2879", "\u2879"], /* BRAILLE PATTERN DOTS-14567 */ + ["\u287A", "\u287A"], /* BRAILLE PATTERN DOTS-24567 */ + ["\u287B", "\u287B"], /* BRAILLE PATTERN DOTS-124567 */ + ["\u287C", "\u287C"], /* BRAILLE PATTERN DOTS-34567 */ + ["\u287D", "\u287D"], /* BRAILLE PATTERN DOTS-134567 */ + ["\u287E", "\u287E"], /* BRAILLE PATTERN DOTS-234567 */ + ["\u287F", "\u287F"], /* BRAILLE PATTERN DOTS-1234567 */ + ["\u2880", "\u2880"], /* BRAILLE PATTERN DOTS-8 */ + ["\u2881", "\u2881"], /* BRAILLE PATTERN DOTS-18 */ + ["\u2882", "\u2882"], /* BRAILLE PATTERN DOTS-28 */ + ["\u2883", "\u2883"], /* BRAILLE PATTERN DOTS-128 */ + ["\u2884", "\u2884"], /* BRAILLE PATTERN DOTS-38 */ + ["\u2885", "\u2885"], /* BRAILLE PATTERN DOTS-138 */ + ["\u2886", "\u2886"], /* BRAILLE PATTERN DOTS-238 */ + ["\u2887", "\u2887"], /* BRAILLE PATTERN DOTS-1238 */ + ["\u2888", "\u2888"], /* BRAILLE PATTERN DOTS-48 */ + ["\u2889", "\u2889"], /* BRAILLE PATTERN DOTS-148 */ + ["\u288A", "\u288A"], /* BRAILLE PATTERN DOTS-248 */ + ["\u288B", "\u288B"], /* BRAILLE PATTERN DOTS-1248 */ + ["\u288C", "\u288C"], /* BRAILLE PATTERN DOTS-348 */ + ["\u288D", "\u288D"], /* BRAILLE PATTERN DOTS-1348 */ + ["\u288E", "\u288E"], /* BRAILLE PATTERN DOTS-2348 */ + ["\u288F", "\u288F"], /* BRAILLE PATTERN DOTS-12348 */ + ["\u2890", "\u2890"], /* BRAILLE PATTERN DOTS-58 */ + ["\u2891", "\u2891"], /* BRAILLE PATTERN DOTS-158 */ + ["\u2892", "\u2892"], /* BRAILLE PATTERN DOTS-258 */ + ["\u2893", "\u2893"], /* BRAILLE PATTERN DOTS-1258 */ + ["\u2894", "\u2894"], /* BRAILLE PATTERN DOTS-358 */ + ["\u2895", "\u2895"], /* BRAILLE PATTERN DOTS-1358 */ + ["\u2896", "\u2896"], /* BRAILLE PATTERN DOTS-2358 */ + ["\u2897", "\u2897"], /* BRAILLE PATTERN DOTS-12358 */ + ["\u2898", "\u2898"], /* BRAILLE PATTERN DOTS-458 */ + ["\u2899", "\u2899"], /* BRAILLE PATTERN DOTS-1458 */ + ["\u289A", "\u289A"], /* BRAILLE PATTERN DOTS-2458 */ + ["\u289B", "\u289B"], /* BRAILLE PATTERN DOTS-12458 */ + ["\u289C", "\u289C"], /* BRAILLE PATTERN DOTS-3458 */ + ["\u289D", "\u289D"], /* BRAILLE PATTERN DOTS-13458 */ + ["\u289E", "\u289E"], /* BRAILLE PATTERN DOTS-23458 */ + ["\u289F", "\u289F"], /* BRAILLE PATTERN DOTS-123458 */ + ["\u28A0", "\u28A0"], /* BRAILLE PATTERN DOTS-68 */ + ["\u28A1", "\u28A1"], /* BRAILLE PATTERN DOTS-168 */ + ["\u28A2", "\u28A2"], /* BRAILLE PATTERN DOTS-268 */ + ["\u28A3", "\u28A3"], /* BRAILLE PATTERN DOTS-1268 */ + ["\u28A4", "\u28A4"], /* BRAILLE PATTERN DOTS-368 */ + ["\u28A5", "\u28A5"], /* BRAILLE PATTERN DOTS-1368 */ + ["\u28A6", "\u28A6"], /* BRAILLE PATTERN DOTS-2368 */ + ["\u28A7", "\u28A7"], /* BRAILLE PATTERN DOTS-12368 */ + ["\u28A8", "\u28A8"], /* BRAILLE PATTERN DOTS-468 */ + ["\u28A9", "\u28A9"], /* BRAILLE PATTERN DOTS-1468 */ + ["\u28AA", "\u28AA"], /* BRAILLE PATTERN DOTS-2468 */ + ["\u28AB", "\u28AB"], /* BRAILLE PATTERN DOTS-12468 */ + ["\u28AC", "\u28AC"], /* BRAILLE PATTERN DOTS-3468 */ + ["\u28AD", "\u28AD"], /* BRAILLE PATTERN DOTS-13468 */ + ["\u28AE", "\u28AE"], /* BRAILLE PATTERN DOTS-23468 */ + ["\u28AF", "\u28AF"], /* BRAILLE PATTERN DOTS-123468 */ + ["\u28B0", "\u28B0"], /* BRAILLE PATTERN DOTS-568 */ + ["\u28B1", "\u28B1"], /* BRAILLE PATTERN DOTS-1568 */ + ["\u28B2", "\u28B2"], /* BRAILLE PATTERN DOTS-2568 */ + ["\u28B3", "\u28B3"], /* BRAILLE PATTERN DOTS-12568 */ + ["\u28B4", "\u28B4"], /* BRAILLE PATTERN DOTS-3568 */ + ["\u28B5", "\u28B5"], /* BRAILLE PATTERN DOTS-13568 */ + ["\u28B6", "\u28B6"], /* BRAILLE PATTERN DOTS-23568 */ + ["\u28B7", "\u28B7"], /* BRAILLE PATTERN DOTS-123568 */ + ["\u28B8", "\u28B8"], /* BRAILLE PATTERN DOTS-4568 */ + ["\u28B9", "\u28B9"], /* BRAILLE PATTERN DOTS-14568 */ + ["\u28BA", "\u28BA"], /* BRAILLE PATTERN DOTS-24568 */ + ["\u28BB", "\u28BB"], /* BRAILLE PATTERN DOTS-124568 */ + ["\u28BC", "\u28BC"], /* BRAILLE PATTERN DOTS-34568 */ + ["\u28BD", "\u28BD"], /* BRAILLE PATTERN DOTS-134568 */ + ["\u28BE", "\u28BE"], /* BRAILLE PATTERN DOTS-234568 */ + ["\u28BF", "\u28BF"], /* BRAILLE PATTERN DOTS-1234568 */ + ["\u28C0", "\u28C0"], /* BRAILLE PATTERN DOTS-78 */ + ["\u28C1", "\u28C1"], /* BRAILLE PATTERN DOTS-178 */ + ["\u28C2", "\u28C2"], /* BRAILLE PATTERN DOTS-278 */ + ["\u28C3", "\u28C3"], /* BRAILLE PATTERN DOTS-1278 */ + ["\u28C4", "\u28C4"], /* BRAILLE PATTERN DOTS-378 */ + ["\u28C5", "\u28C5"], /* BRAILLE PATTERN DOTS-1378 */ + ["\u28C6", "\u28C6"], /* BRAILLE PATTERN DOTS-2378 */ + ["\u28C7", "\u28C7"], /* BRAILLE PATTERN DOTS-12378 */ + ["\u28C8", "\u28C8"], /* BRAILLE PATTERN DOTS-478 */ + ["\u28C9", "\u28C9"], /* BRAILLE PATTERN DOTS-1478 */ + ["\u28CA", "\u28CA"], /* BRAILLE PATTERN DOTS-2478 */ + ["\u28CB", "\u28CB"], /* BRAILLE PATTERN DOTS-12478 */ + ["\u28CC", "\u28CC"], /* BRAILLE PATTERN DOTS-3478 */ + ["\u28CD", "\u28CD"], /* BRAILLE PATTERN DOTS-13478 */ + ["\u28CE", "\u28CE"], /* BRAILLE PATTERN DOTS-23478 */ + ["\u28CF", "\u28CF"], /* BRAILLE PATTERN DOTS-123478 */ + ["\u28D0", "\u28D0"], /* BRAILLE PATTERN DOTS-578 */ + ["\u28D1", "\u28D1"], /* BRAILLE PATTERN DOTS-1578 */ + ["\u28D2", "\u28D2"], /* BRAILLE PATTERN DOTS-2578 */ + ["\u28D3", "\u28D3"], /* BRAILLE PATTERN DOTS-12578 */ + ["\u28D4", "\u28D4"], /* BRAILLE PATTERN DOTS-3578 */ + ["\u28D5", "\u28D5"], /* BRAILLE PATTERN DOTS-13578 */ + ["\u28D6", "\u28D6"], /* BRAILLE PATTERN DOTS-23578 */ + ["\u28D7", "\u28D7"], /* BRAILLE PATTERN DOTS-123578 */ + ["\u28D8", "\u28D8"], /* BRAILLE PATTERN DOTS-4578 */ + ["\u28D9", "\u28D9"], /* BRAILLE PATTERN DOTS-14578 */ + ["\u28DA", "\u28DA"], /* BRAILLE PATTERN DOTS-24578 */ + ["\u28DB", "\u28DB"], /* BRAILLE PATTERN DOTS-124578 */ + ["\u28DC", "\u28DC"], /* BRAILLE PATTERN DOTS-34578 */ + ["\u28DD", "\u28DD"], /* BRAILLE PATTERN DOTS-134578 */ + ["\u28DE", "\u28DE"], /* BRAILLE PATTERN DOTS-234578 */ + ["\u28DF", "\u28DF"], /* BRAILLE PATTERN DOTS-1234578 */ + ["\u28E0", "\u28E0"], /* BRAILLE PATTERN DOTS-678 */ + ["\u28E1", "\u28E1"], /* BRAILLE PATTERN DOTS-1678 */ + ["\u28E2", "\u28E2"], /* BRAILLE PATTERN DOTS-2678 */ + ["\u28E3", "\u28E3"], /* BRAILLE PATTERN DOTS-12678 */ + ["\u28E4", "\u28E4"], /* BRAILLE PATTERN DOTS-3678 */ + ["\u28E5", "\u28E5"], /* BRAILLE PATTERN DOTS-13678 */ + ["\u28E6", "\u28E6"], /* BRAILLE PATTERN DOTS-23678 */ + ["\u28E7", "\u28E7"], /* BRAILLE PATTERN DOTS-123678 */ + ["\u28E8", "\u28E8"], /* BRAILLE PATTERN DOTS-4678 */ + ["\u28E9", "\u28E9"], /* BRAILLE PATTERN DOTS-14678 */ + ["\u28EA", "\u28EA"], /* BRAILLE PATTERN DOTS-24678 */ + ["\u28EB", "\u28EB"], /* BRAILLE PATTERN DOTS-124678 */ + ["\u28EC", "\u28EC"], /* BRAILLE PATTERN DOTS-34678 */ + ["\u28ED", "\u28ED"], /* BRAILLE PATTERN DOTS-134678 */ + ["\u28EE", "\u28EE"], /* BRAILLE PATTERN DOTS-234678 */ + ["\u28EF", "\u28EF"], /* BRAILLE PATTERN DOTS-1234678 */ + ["\u28F0", "\u28F0"], /* BRAILLE PATTERN DOTS-5678 */ + ["\u28F1", "\u28F1"], /* BRAILLE PATTERN DOTS-15678 */ + ["\u28F2", "\u28F2"], /* BRAILLE PATTERN DOTS-25678 */ + ["\u28F3", "\u28F3"], /* BRAILLE PATTERN DOTS-125678 */ + ["\u28F4", "\u28F4"], /* BRAILLE PATTERN DOTS-35678 */ + ["\u28F5", "\u28F5"], /* BRAILLE PATTERN DOTS-135678 */ + ["\u28F6", "\u28F6"], /* BRAILLE PATTERN DOTS-235678 */ + ["\u28F7", "\u28F7"], /* BRAILLE PATTERN DOTS-1235678 */ + ["\u28F8", "\u28F8"], /* BRAILLE PATTERN DOTS-45678 */ + ["\u28F9", "\u28F9"], /* BRAILLE PATTERN DOTS-145678 */ + ["\u28FA", "\u28FA"], /* BRAILLE PATTERN DOTS-245678 */ + ["\u28FB", "\u28FB"], /* BRAILLE PATTERN DOTS-1245678 */ + ["\u28FC", "\u28FC"], /* BRAILLE PATTERN DOTS-345678 */ + ["\u28FD", "\u28FD"], /* BRAILLE PATTERN DOTS-1345678 */ + ["\u28FE", "\u28FE"], /* BRAILLE PATTERN DOTS-2345678 */ + ["\u28FF", "\u28FF"], /* BRAILLE PATTERN DOTS-12345678 */ + ["\u2900", "\u2900"], /* RIGHTWARDS TWO-HEADED ARROW WITH VERTICAL STROKE */ + ["\u2901", "\u2901"], /* RIGHTWARDS TWO-HEADED ARROW WITH DOUBLE VERTICAL STROKE */ + ["\u2902", "\u2902"], /* LEFTWARDS DOUBLE ARROW WITH VERTICAL STROKE */ + ["\u2903", "\u2903"], /* RIGHTWARDS DOUBLE ARROW WITH VERTICAL STROKE */ + ["\u2904", "\u2904"], /* LEFT RIGHT DOUBLE ARROW WITH VERTICAL STROKE */ + ["\u2905", "\u2905"], /* RIGHTWARDS TWO-HEADED ARROW FROM BAR */ + ["\u2906", "\u2906"], /* LEFTWARDS DOUBLE ARROW FROM BAR */ + ["\u2907", "\u2907"], /* RIGHTWARDS DOUBLE ARROW FROM BAR */ + ["\u2908", "\u2908"], /* DOWNWARDS ARROW WITH HORIZONTAL STROKE */ + ["\u2909", "\u2909"], /* UPWARDS ARROW WITH HORIZONTAL STROKE */ + ["\u290A", "\u290A"], /* UPWARDS TRIPLE ARROW */ + ["\u290B", "\u290B"], /* DOWNWARDS TRIPLE ARROW */ + ["\u290C", "\u290C"], /* LEFTWARDS DOUBLE DASH ARROW */ + ["\u290D", "\u290D"], /* RIGHTWARDS DOUBLE DASH ARROW */ + ["\u290E", "\u290E"], /* LEFTWARDS TRIPLE DASH ARROW */ + ["\u290F", "\u290F"], /* RIGHTWARDS TRIPLE DASH ARROW */ + ["\u2910", "\u2910"], /* RIGHTWARDS TWO-HEADED TRIPLE DASH ARROW */ + ["\u2911", "\u2911"], /* RIGHTWARDS ARROW WITH DOTTED STEM */ + ["\u2912", "\u2912"], /* UPWARDS ARROW TO BAR */ + ["\u2913", "\u2913"], /* DOWNWARDS ARROW TO BAR */ + ["\u2914", "\u2914"], /* RIGHTWARDS ARROW WITH TAIL WITH VERTICAL STROKE */ + ["\u2915", "\u2915"], /* RIGHTWARDS ARROW WITH TAIL WITH DOUBLE VERTICAL STROKE */ + ["\u2916", "\u2916"], /* RIGHTWARDS TWO-HEADED ARROW WITH TAIL */ + ["\u2917", "\u2917"], /* RIGHTWARDS TWO-HEADED ARROW WITH TAIL WITH VERTICAL STROKE */ + ["\u2918", "\u2918"], /* RIGHTWARDS TWO-HEADED ARROW WITH TAIL WITH DOUBLE VERTICAL STROKE */ + ["\u2919", "\u2919"], /* LEFTWARDS ARROW-TAIL */ + ["\u291A", "\u291A"], /* RIGHTWARDS ARROW-TAIL */ + ["\u291B", "\u291B"], /* LEFTWARDS DOUBLE ARROW-TAIL */ + ["\u291C", "\u291C"], /* RIGHTWARDS DOUBLE ARROW-TAIL */ + ["\u291D", "\u291D"], /* LEFTWARDS ARROW TO BLACK DIAMOND */ + ["\u291E", "\u291E"], /* RIGHTWARDS ARROW TO BLACK DIAMOND */ + ["\u291F", "\u291F"], /* LEFTWARDS ARROW FROM BAR TO BLACK DIAMOND */ + ["\u2920", "\u2920"], /* RIGHTWARDS ARROW FROM BAR TO BLACK DIAMOND */ + ["\u2921", "\u2921"], /* NORTH WEST AND SOUTH EAST ARROW */ + ["\u2922", "\u2922"], /* NORTH EAST AND SOUTH WEST ARROW */ + ["\u2923", "\u2923"], /* NORTH WEST ARROW WITH HOOK */ + ["\u2924", "\u2924"], /* NORTH EAST ARROW WITH HOOK */ + ["\u2925", "\u2925"], /* SOUTH EAST ARROW WITH HOOK */ + ["\u2926", "\u2926"], /* SOUTH WEST ARROW WITH HOOK */ + ["\u2927", "\u2927"], /* NORTH WEST ARROW AND NORTH EAST ARROW */ + ["\u2928", "\u2928"], /* NORTH EAST ARROW AND SOUTH EAST ARROW */ + ["\u2929", "\u2929"], /* SOUTH EAST ARROW AND SOUTH WEST ARROW */ + ["\u292A", "\u292A"], /* SOUTH WEST ARROW AND NORTH WEST ARROW */ + ["\u292B", "\u292B"], /* RISING DIAGONAL CROSSING FALLING DIAGONAL */ + ["\u292C", "\u292C"], /* FALLING DIAGONAL CROSSING RISING DIAGONAL */ + ["\u292D", "\u292D"], /* SOUTH EAST ARROW CROSSING NORTH EAST ARROW */ + ["\u292E", "\u292E"], /* NORTH EAST ARROW CROSSING SOUTH EAST ARROW */ + ["\u292F", "\u292F"], /* FALLING DIAGONAL CROSSING NORTH EAST ARROW */ + ["\u2930", "\u2930"], /* RISING DIAGONAL CROSSING SOUTH EAST ARROW */ + ["\u2931", "\u2931"], /* NORTH EAST ARROW CROSSING NORTH WEST ARROW */ + ["\u2932", "\u2932"], /* NORTH WEST ARROW CROSSING NORTH EAST ARROW */ + ["\u2933", "\u2933"], /* WAVE ARROW POINTING DIRECTLY RIGHT */ + ["\u2934", "\u2934"], /* ARROW POINTING RIGHTWARDS THEN CURVING UPWARDS */ + ["\u2935", "\u2935"], /* ARROW POINTING RIGHTWARDS THEN CURVING DOWNWARDS */ + ["\u2936", "\u2936"], /* ARROW POINTING DOWNWARDS THEN CURVING LEFTWARDS */ + ["\u2937", "\u2937"], /* ARROW POINTING DOWNWARDS THEN CURVING RIGHTWARDS */ + ["\u2938", "\u2938"], /* RIGHT-SIDE ARC CLOCKWISE ARROW */ + ["\u2939", "\u2939"], /* LEFT-SIDE ARC ANTICLOCKWISE ARROW */ + ["\u293A", "\u293A"], /* TOP ARC ANTICLOCKWISE ARROW */ + ["\u293B", "\u293B"], /* BOTTOM ARC ANTICLOCKWISE ARROW */ + ["\u293C", "\u293C"], /* TOP ARC CLOCKWISE ARROW WITH MINUS */ + ["\u293D", "\u293D"], /* TOP ARC ANTICLOCKWISE ARROW WITH PLUS */ + ["\u293E", "\u293E"], /* LOWER RIGHT SEMICIRCULAR CLOCKWISE ARROW */ + ["\u293F", "\u293F"], /* LOWER LEFT SEMICIRCULAR ANTICLOCKWISE ARROW */ + ["\u2940", "\u2940"], /* ANTICLOCKWISE CLOSED CIRCLE ARROW */ + ["\u2941", "\u2941"], /* CLOCKWISE CLOSED CIRCLE ARROW */ + ["\u2942", "\u2942"], /* RIGHTWARDS ARROW ABOVE SHORT LEFTWARDS ARROW */ + ["\u2943", "\u2943"], /* LEFTWARDS ARROW ABOVE SHORT RIGHTWARDS ARROW */ + ["\u2944", "\u2944"], /* SHORT RIGHTWARDS ARROW ABOVE LEFTWARDS ARROW */ + ["\u2945", "\u2945"], /* RIGHTWARDS ARROW WITH PLUS BELOW */ + ["\u2946", "\u2946"], /* LEFTWARDS ARROW WITH PLUS BELOW */ + ["\u2947", "\u2947"], /* RIGHTWARDS ARROW THROUGH X */ + ["\u2948", "\u2948"], /* LEFT RIGHT ARROW THROUGH SMALL CIRCLE */ + ["\u2949", "\u2949"], /* UPWARDS TWO-HEADED ARROW FROM SMALL CIRCLE */ + ["\u294A", "\u294A"], /* LEFT BARB UP RIGHT BARB DOWN HARPOON */ + ["\u294B", "\u294B"], /* LEFT BARB DOWN RIGHT BARB UP HARPOON */ + ["\u294C", "\u294C"], /* UP BARB RIGHT DOWN BARB LEFT HARPOON */ + ["\u294D", "\u294D"], /* UP BARB LEFT DOWN BARB RIGHT HARPOON */ + ["\u294E", "\u294E"], /* LEFT BARB UP RIGHT BARB UP HARPOON */ + ["\u294F", "\u294F"], /* UP BARB RIGHT DOWN BARB RIGHT HARPOON */ + ["\u2950", "\u2950"], /* LEFT BARB DOWN RIGHT BARB DOWN HARPOON */ + ["\u2951", "\u2951"], /* UP BARB LEFT DOWN BARB LEFT HARPOON */ + ["\u2952", "\u2952"], /* LEFTWARDS HARPOON WITH BARB UP TO BAR */ + ["\u2953", "\u2953"], /* RIGHTWARDS HARPOON WITH BARB UP TO BAR */ + ["\u2954", "\u2954"], /* UPWARDS HARPOON WITH BARB RIGHT TO BAR */ + ["\u2955", "\u2955"], /* DOWNWARDS HARPOON WITH BARB RIGHT TO BAR */ + ["\u2956", "\u2956"], /* LEFTWARDS HARPOON WITH BARB DOWN TO BAR */ + ["\u2957", "\u2957"], /* RIGHTWARDS HARPOON WITH BARB DOWN TO BAR */ + ["\u2958", "\u2958"], /* UPWARDS HARPOON WITH BARB LEFT TO BAR */ + ["\u2959", "\u2959"], /* DOWNWARDS HARPOON WITH BARB LEFT TO BAR */ + ["\u295A", "\u295A"], /* LEFTWARDS HARPOON WITH BARB UP FROM BAR */ + ["\u295B", "\u295B"], /* RIGHTWARDS HARPOON WITH BARB UP FROM BAR */ + ["\u295C", "\u295C"], /* UPWARDS HARPOON WITH BARB RIGHT FROM BAR */ + ["\u295D", "\u295D"], /* DOWNWARDS HARPOON WITH BARB RIGHT FROM BAR */ + ["\u295E", "\u295E"], /* LEFTWARDS HARPOON WITH BARB DOWN FROM BAR */ + ["\u295F", "\u295F"], /* RIGHTWARDS HARPOON WITH BARB DOWN FROM BAR */ + ["\u2960", "\u2960"], /* UPWARDS HARPOON WITH BARB LEFT FROM BAR */ + ["\u2961", "\u2961"], /* DOWNWARDS HARPOON WITH BARB LEFT FROM BAR */ + ["\u2962", "\u2962"], /* LEFTWARDS HARPOON WITH BARB UP ABOVE LEFTWARDS HARPOON WITH BARB DOWN */ + ["\u2963", "\u2963"], /* UPWARDS HARPOON WITH BARB LEFT BESIDE UPWARDS HARPOON WITH BARB RIGHT */ + ["\u2964", "\u2964"], /* RIGHTWARDS HARPOON WITH BARB UP ABOVE RIGHTWARDS HARPOON WITH BARB DOWN */ + ["\u2965", "\u2965"], /* DOWNWARDS HARPOON WITH BARB LEFT BESIDE DOWNWARDS HARPOON WITH BARB RIGHT */ + ["\u2966", "\u2966"], /* LEFTWARDS HARPOON WITH BARB UP ABOVE RIGHTWARDS HARPOON WITH BARB UP */ + ["\u2967", "\u2967"], /* LEFTWARDS HARPOON WITH BARB DOWN ABOVE RIGHTWARDS HARPOON WITH BARB DOWN */ + ["\u2968", "\u2968"], /* RIGHTWARDS HARPOON WITH BARB UP ABOVE LEFTWARDS HARPOON WITH BARB UP */ + ["\u2969", "\u2969"], /* RIGHTWARDS HARPOON WITH BARB DOWN ABOVE LEFTWARDS HARPOON WITH BARB DOWN */ + ["\u296A", "\u296A"], /* LEFTWARDS HARPOON WITH BARB UP ABOVE LONG DASH */ + ["\u296B", "\u296B"], /* LEFTWARDS HARPOON WITH BARB DOWN BELOW LONG DASH */ + ["\u296C", "\u296C"], /* RIGHTWARDS HARPOON WITH BARB UP ABOVE LONG DASH */ + ["\u296D", "\u296D"], /* RIGHTWARDS HARPOON WITH BARB DOWN BELOW LONG DASH */ + ["\u296E", "\u296E"], /* UPWARDS HARPOON WITH BARB LEFT BESIDE DOWNWARDS HARPOON WITH BARB RIGHT */ + ["\u296F", "\u296F"], /* DOWNWARDS HARPOON WITH BARB LEFT BESIDE UPWARDS HARPOON WITH BARB RIGHT */ + ["\u2970", "\u2970"], /* RIGHT DOUBLE ARROW WITH ROUNDED HEAD */ + ["\u2971", "\u2971"], /* EQUALS SIGN ABOVE RIGHTWARDS ARROW */ + ["\u2972", "\u2972"], /* TILDE OPERATOR ABOVE RIGHTWARDS ARROW */ + ["\u2973", "\u2973"], /* LEFTWARDS ARROW ABOVE TILDE OPERATOR */ + ["\u2974", "\u2974"], /* RIGHTWARDS ARROW ABOVE TILDE OPERATOR */ + ["\u2975", "\u2975"], /* RIGHTWARDS ARROW ABOVE ALMOST EQUAL TO */ + ["\u2976", "\u2976"], /* LESS-THAN ABOVE LEFTWARDS ARROW */ + ["\u2977", "\u2977"], /* LEFTWARDS ARROW THROUGH LESS-THAN */ + ["\u2978", "\u2978"], /* GREATER-THAN ABOVE RIGHTWARDS ARROW */ + ["\u2979", "\u2979"], /* SUBSET ABOVE RIGHTWARDS ARROW */ + ["\u297A", "\u297A"], /* LEFTWARDS ARROW THROUGH SUBSET */ + ["\u297B", "\u297B"], /* SUPERSET ABOVE LEFTWARDS ARROW */ + ["\u297C", "\u297C"], /* LEFT FISH TAIL */ + ["\u297D", "\u297D"], /* RIGHT FISH TAIL */ + ["\u297E", "\u297E"], /* UP FISH TAIL */ + ["\u297F", "\u297F"], /* DOWN FISH TAIL */ + ["\u2980", "\u2980"], /* TRIPLE VERTICAL BAR DELIMITER */ + ["\u2981", "\u2981"], /* Z NOTATION SPOT */ + ["\u2982", "\u2982"], /* Z NOTATION TYPE COLON */ + ["\u2983", "\u2983"], /* LEFT WHITE CURLY BRACKET */ + ["\u2984", "\u2984"], /* RIGHT WHITE CURLY BRACKET */ + ["\u2985", "\u2985"], /* LEFT WHITE PARENTHESIS */ + ["\u2986", "\u2986"], /* RIGHT WHITE PARENTHESIS */ + ["\u2987", "\u2987"], /* Z NOTATION LEFT IMAGE BRACKET */ + ["\u2988", "\u2988"], /* Z NOTATION RIGHT IMAGE BRACKET */ + ["\u2989", "\u2989"], /* Z NOTATION LEFT BINDING BRACKET */ + ["\u298A", "\u298A"], /* Z NOTATION RIGHT BINDING BRACKET */ + ["\u298B", "\u298B"], /* LEFT SQUARE BRACKET WITH UNDERBAR */ + ["\u298C", "\u298C"], /* RIGHT SQUARE BRACKET WITH UNDERBAR */ + ["\u298D", "\u298D"], /* LEFT SQUARE BRACKET WITH TICK IN TOP CORNER */ + ["\u298E", "\u298E"], /* RIGHT SQUARE BRACKET WITH TICK IN BOTTOM CORNER */ + ["\u298F", "\u298F"], /* LEFT SQUARE BRACKET WITH TICK IN BOTTOM CORNER */ + ["\u2990", "\u2990"], /* RIGHT SQUARE BRACKET WITH TICK IN TOP CORNER */ + ["\u2991", "\u2991"], /* LEFT ANGLE BRACKET WITH DOT */ + ["\u2992", "\u2992"], /* RIGHT ANGLE BRACKET WITH DOT */ + ["\u2993", "\u2993"], /* LEFT ARC LESS-THAN BRACKET */ + ["\u2994", "\u2994"], /* RIGHT ARC GREATER-THAN BRACKET */ + ["\u2995", "\u2995"], /* DOUBLE LEFT ARC GREATER-THAN BRACKET */ + ["\u2996", "\u2996"], /* DOUBLE RIGHT ARC LESS-THAN BRACKET */ + ["\u2997", "\u2997"], /* LEFT BLACK TORTOISE SHELL BRACKET */ + ["\u2998", "\u2998"], /* RIGHT BLACK TORTOISE SHELL BRACKET */ + ["\u2999", "\u2999"], /* DOTTED FENCE */ + ["\u299A", "\u299A"], /* VERTICAL ZIGZAG LINE */ + ["\u299B", "\u299B"], /* MEASURED ANGLE OPENING LEFT */ + ["\u299C", "\u299C"], /* RIGHT ANGLE VARIANT WITH SQUARE */ + ["\u299D", "\u299D"], /* MEASURED RIGHT ANGLE WITH DOT */ + ["\u299E", "\u299E"], /* ANGLE WITH S INSIDE */ + ["\u299F", "\u299F"], /* ACUTE ANGLE */ + ["\u29A0", "\u29A0"], /* SPHERICAL ANGLE OPENING LEFT */ + ["\u29A1", "\u29A1"], /* SPHERICAL ANGLE OPENING UP */ + ["\u29A2", "\u29A2"], /* TURNED ANGLE */ + ["\u29A3", "\u29A3"], /* REVERSED ANGLE */ + ["\u29A4", "\u29A4"], /* ANGLE WITH UNDERBAR */ + ["\u29A5", "\u29A5"], /* REVERSED ANGLE WITH UNDERBAR */ + ["\u29A6", "\u29A6"], /* OBLIQUE ANGLE OPENING UP */ + ["\u29A7", "\u29A7"], /* OBLIQUE ANGLE OPENING DOWN */ + ["\u29A8", "\u29A8"], /* MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING UP AND RIGHT */ + ["\u29A9", "\u29A9"], /* MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING UP AND LEFT */ + ["\u29AA", "\u29AA"], /* MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING DOWN AND RIGHT */ + ["\u29AB", "\u29AB"], /* MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING DOWN AND LEFT */ + ["\u29AC", "\u29AC"], /* MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING RIGHT AND UP */ + ["\u29AD", "\u29AD"], /* MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING LEFT AND UP */ + ["\u29AE", "\u29AE"], /* MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING RIGHT AND DOWN */ + ["\u29AF", "\u29AF"], /* MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING LEFT AND DOWN */ + ["\u29B0", "\u29B0"], /* REVERSED EMPTY SET */ + ["\u29B1", "\u29B1"], /* EMPTY SET WITH OVERBAR */ + ["\u29B2", "\u29B2"], /* EMPTY SET WITH SMALL CIRCLE ABOVE */ + ["\u29B3", "\u29B3"], /* EMPTY SET WITH RIGHT ARROW ABOVE */ + ["\u29B4", "\u29B4"], /* EMPTY SET WITH LEFT ARROW ABOVE */ + ["\u29B5", "\u29B5"], /* CIRCLE WITH HORIZONTAL BAR */ + ["\u29B6", "\u29B6"], /* CIRCLED VERTICAL BAR */ + ["\u29B7", "\u29B7"], /* CIRCLED PARALLEL */ + ["\u29B8", "\u29B8"], /* CIRCLED REVERSE SOLIDUS */ + ["\u29B9", "\u29B9"], /* CIRCLED PERPENDICULAR */ + ["\u29BA", "\u29BA"], /* CIRCLE DIVIDED BY HORIZONTAL BAR AND TOP HALF DIVIDED BY VERTICAL BAR */ + ["\u29BB", "\u29BB"], /* CIRCLE WITH SUPERIMPOSED X */ + ["\u29BC", "\u29BC"], /* CIRCLED ANTICLOCKWISE-ROTATED DIVISION SIGN */ + ["\u29BD", "\u29BD"], /* UP ARROW THROUGH CIRCLE */ + ["\u29BE", "\u29BE"], /* CIRCLED WHITE BULLET */ + ["\u29BF", "\u29BF"], /* CIRCLED BULLET */ + ["\u29C0", "\u29C0"], /* CIRCLED LESS-THAN */ + ["\u29C1", "\u29C1"], /* CIRCLED GREATER-THAN */ + ["\u29C2", "\u29C2"], /* CIRCLE WITH SMALL CIRCLE TO THE RIGHT */ + ["\u29C3", "\u29C3"], /* CIRCLE WITH TWO HORIZONTAL STROKES TO THE RIGHT */ + ["\u29C4", "\u29C4"], /* SQUARED RISING DIAGONAL SLASH */ + ["\u29C5", "\u29C5"], /* SQUARED FALLING DIAGONAL SLASH */ + ["\u29C6", "\u29C6"], /* SQUARED ASTERISK */ + ["\u29C7", "\u29C7"], /* SQUARED SMALL CIRCLE */ + ["\u29C8", "\u29C8"], /* SQUARED SQUARE */ + ["\u29C9", "\u29C9"], /* TWO JOINED SQUARES */ + ["\u29CA", "\u29CA"], /* TRIANGLE WITH DOT ABOVE */ + ["\u29CB", "\u29CB"], /* TRIANGLE WITH UNDERBAR */ + ["\u29CC", "\u29CC"], /* S IN TRIANGLE */ + ["\u29CD", "\u29CD"], /* TRIANGLE WITH SERIFS AT BOTTOM */ + ["\u29CE", "\u29CE"], /* RIGHT TRIANGLE ABOVE LEFT TRIANGLE */ + ["\u29CF", "\u29CF"], /* LEFT TRIANGLE BESIDE VERTICAL BAR */ + ["\u29D0", "\u29D0"], /* VERTICAL BAR BESIDE RIGHT TRIANGLE */ + ["\u29D1", "\u29D1"], /* BOWTIE WITH LEFT HALF BLACK */ + ["\u29D2", "\u29D2"], /* BOWTIE WITH RIGHT HALF BLACK */ + ["\u29D3", "\u29D3"], /* BLACK BOWTIE */ + ["\u29D4", "\u29D4"], /* TIMES WITH LEFT HALF BLACK */ + ["\u29D5", "\u29D5"], /* TIMES WITH RIGHT HALF BLACK */ + ["\u29D6", "\u29D6"], /* WHITE HOURGLASS */ + ["\u29D7", "\u29D7"], /* BLACK HOURGLASS */ + ["\u29D8", "\u29D8"], /* LEFT WIGGLY FENCE */ + ["\u29D9", "\u29D9"], /* RIGHT WIGGLY FENCE */ + ["\u29DA", "\u29DA"], /* LEFT DOUBLE WIGGLY FENCE */ + ["\u29DB", "\u29DB"], /* RIGHT DOUBLE WIGGLY FENCE */ + ["\u29DC", "\u29DC"], /* INCOMPLETE INFINITY */ + ["\u29DD", "\u29DD"], /* TIE OVER INFINITY */ + ["\u29DE", "\u29DE"], /* INFINITY NEGATED WITH VERTICAL BAR */ + ["\u29DF", "\u29DF"], /* DOUBLE-ENDED MULTIMAP */ + ["\u29E0", "\u29E0"], /* SQUARE WITH CONTOURED OUTLINE */ + ["\u29E1", "\u29E1"], /* INCREASES AS */ + ["\u29E2", "\u29E2"], /* SHUFFLE PRODUCT */ + ["\u29E3", "\u29E3"], /* EQUALS SIGN AND SLANTED PARALLEL */ + ["\u29E4", "\u29E4"], /* EQUALS SIGN AND SLANTED PARALLEL WITH TILDE ABOVE */ + ["\u29E5", "\u29E5"], /* IDENTICAL TO AND SLANTED PARALLEL */ + ["\u29E6", "\u29E6"], /* GLEICH STARK */ + ["\u29E7", "\u29E7"], /* THERMODYNAMIC */ + ["\u29E8", "\u29E8"], /* DOWN-POINTING TRIANGLE WITH LEFT HALF BLACK */ + ["\u29E9", "\u29E9"], /* DOWN-POINTING TRIANGLE WITH RIGHT HALF BLACK */ + ["\u29EA", "\u29EA"], /* BLACK DIAMOND WITH DOWN ARROW */ + ["\u29EB", "\u29EB"], /* BLACK LOZENGE */ + ["\u29EC", "\u29EC"], /* WHITE CIRCLE WITH DOWN ARROW */ + ["\u29ED", "\u29ED"], /* BLACK CIRCLE WITH DOWN ARROW */ + ["\u29EE", "\u29EE"], /* ERROR-BARRED WHITE SQUARE */ + ["\u29EF", "\u29EF"], /* ERROR-BARRED BLACK SQUARE */ + ["\u29F0", "\u29F0"], /* ERROR-BARRED WHITE DIAMOND */ + ["\u29F1", "\u29F1"], /* ERROR-BARRED BLACK DIAMOND */ + ["\u29F2", "\u29F2"], /* ERROR-BARRED WHITE CIRCLE */ + ["\u29F3", "\u29F3"], /* ERROR-BARRED BLACK CIRCLE */ + ["\u29F4", "\u29F4"], /* RULE-DELAYED */ + ["\u29F5", "\u29F5"], /* REVERSE SOLIDUS OPERATOR */ + ["\u29F6", "\u29F6"], /* SOLIDUS WITH OVERBAR */ + ["\u29F7", "\u29F7"], /* REVERSE SOLIDUS WITH HORIZONTAL STROKE */ + ["\u29F8", "\u29F8"], /* BIG SOLIDUS */ + ["\u29F9", "\u29F9"], /* BIG REVERSE SOLIDUS */ + ["\u29FA", "\u29FA"], /* DOUBLE PLUS */ + ["\u29FB", "\u29FB"], /* TRIPLE PLUS */ + ["\u29FC", "\u29FC"], /* LEFT-POINTING CURVED ANGLE BRACKET */ + ["\u29FD", "\u29FD"], /* RIGHT-POINTING CURVED ANGLE BRACKET */ + ["\u29FE", "\u29FE"], /* TINY */ + ["\u29FF", "\u29FF"], /* MINY */ + ["\u2A00", "\u2A00"], /* N-ARY CIRCLED DOT OPERATOR */ + ["\u2A01", "\u2A01"], /* N-ARY CIRCLED PLUS OPERATOR */ + ["\u2A02", "\u2A02"], /* N-ARY CIRCLED TIMES OPERATOR */ + ["\u2A03", "\u2A03"], /* N-ARY UNION OPERATOR WITH DOT */ + ["\u2A04", "\u2A04"], /* N-ARY UNION OPERATOR WITH PLUS */ + ["\u2A05", "\u2A05"], /* N-ARY SQUARE INTERSECTION OPERATOR */ + ["\u2A06", "\u2A06"], /* N-ARY SQUARE UNION OPERATOR */ + ["\u2A07", "\u2A07"], /* TWO LOGICAL AND OPERATOR */ + ["\u2A08", "\u2A08"], /* TWO LOGICAL OR OPERATOR */ + ["\u2A09", "\u2A09"], /* N-ARY TIMES OPERATOR */ + ["\u2A0A", "\u2A0A"], /* MODULO TWO SUM */ + ["\u2A0B", "\u2A0B"], /* SUMMATION WITH INTEGRAL */ + ["\u2A0C", "\u2A0C"], /* QUADRUPLE INTEGRAL OPERATOR */ + ["\u2A0D", "\u2A0D"], /* FINITE PART INTEGRAL */ + ["\u2A0E", "\u2A0E"], /* INTEGRAL WITH DOUBLE STROKE */ + ["\u2A0F", "\u2A0F"], /* INTEGRAL AVERAGE WITH SLASH */ + ["\u2A10", "\u2A10"], /* CIRCULATION FUNCTION */ + ["\u2A11", "\u2A11"], /* ANTICLOCKWISE INTEGRATION */ + ["\u2A12", "\u2A12"], /* LINE INTEGRATION WITH RECTANGULAR PATH AROUND POLE */ + ["\u2A13", "\u2A13"], /* LINE INTEGRATION WITH SEMICIRCULAR PATH AROUND POLE */ + ["\u2A14", "\u2A14"], /* LINE INTEGRATION NOT INCLUDING THE POLE */ + ["\u2A15", "\u2A15"], /* INTEGRAL AROUND A POINT OPERATOR */ + ["\u2A16", "\u2A16"], /* QUATERNION INTEGRAL OPERATOR */ + ["\u2A17", "\u2A17"], /* INTEGRAL WITH LEFTWARDS ARROW WITH HOOK */ + ["\u2A18", "\u2A18"], /* INTEGRAL WITH TIMES SIGN */ + ["\u2A19", "\u2A19"], /* INTEGRAL WITH INTERSECTION */ + ["\u2A1A", "\u2A1A"], /* INTEGRAL WITH UNION */ + ["\u2A1B", "\u2A1B"], /* INTEGRAL WITH OVERBAR */ + ["\u2A1C", "\u2A1C"], /* INTEGRAL WITH UNDERBAR */ + ["\u2A1D", "\u2A1D"], /* JOIN */ + ["\u2A1E", "\u2A1E"], /* LARGE LEFT TRIANGLE OPERATOR */ + ["\u2A1F", "\u2A1F"], /* Z NOTATION SCHEMA COMPOSITION */ + ["\u2A20", "\u2A20"], /* Z NOTATION SCHEMA PIPING */ + ["\u2A21", "\u2A21"], /* Z NOTATION SCHEMA PROJECTION */ + ["\u2A22", "\u2A22"], /* PLUS SIGN WITH SMALL CIRCLE ABOVE */ + ["\u2A23", "\u2A23"], /* PLUS SIGN WITH CIRCUMFLEX ACCENT ABOVE */ + ["\u2A24", "\u2A24"], /* PLUS SIGN WITH TILDE ABOVE */ + ["\u2A25", "\u2A25"], /* PLUS SIGN WITH DOT BELOW */ + ["\u2A26", "\u2A26"], /* PLUS SIGN WITH TILDE BELOW */ + ["\u2A27", "\u2A27"], /* PLUS SIGN WITH SUBSCRIPT TWO */ + ["\u2A28", "\u2A28"], /* PLUS SIGN WITH BLACK TRIANGLE */ + ["\u2A29", "\u2A29"], /* MINUS SIGN WITH COMMA ABOVE */ + ["\u2A2A", "\u2A2A"], /* MINUS SIGN WITH DOT BELOW */ + ["\u2A2B", "\u2A2B"], /* MINUS SIGN WITH FALLING DOTS */ + ["\u2A2C", "\u2A2C"], /* MINUS SIGN WITH RISING DOTS */ + ["\u2A2D", "\u2A2D"], /* PLUS SIGN IN LEFT HALF CIRCLE */ + ["\u2A2E", "\u2A2E"], /* PLUS SIGN IN RIGHT HALF CIRCLE */ + ["\u2A2F", "\u2A2F"], /* VECTOR OR CROSS PRODUCT */ + ["\u2A30", "\u2A30"], /* MULTIPLICATION SIGN WITH DOT ABOVE */ + ["\u2A31", "\u2A31"], /* MULTIPLICATION SIGN WITH UNDERBAR */ + ["\u2A32", "\u2A32"], /* SEMIDIRECT PRODUCT WITH BOTTOM CLOSED */ + ["\u2A33", "\u2A33"], /* SMASH PRODUCT */ + ["\u2A34", "\u2A34"], /* MULTIPLICATION SIGN IN LEFT HALF CIRCLE */ + ["\u2A35", "\u2A35"], /* MULTIPLICATION SIGN IN RIGHT HALF CIRCLE */ + ["\u2A36", "\u2A36"], /* CIRCLED MULTIPLICATION SIGN WITH CIRCUMFLEX ACCENT */ + ["\u2A37", "\u2A37"], /* MULTIPLICATION SIGN IN DOUBLE CIRCLE */ + ["\u2A38", "\u2A38"], /* CIRCLED DIVISION SIGN */ + ["\u2A39", "\u2A39"], /* PLUS SIGN IN TRIANGLE */ + ["\u2A3A", "\u2A3A"], /* MINUS SIGN IN TRIANGLE */ + ["\u2A3B", "\u2A3B"], /* MULTIPLICATION SIGN IN TRIANGLE */ + ["\u2A3C", "\u2A3C"], /* INTERIOR PRODUCT */ + ["\u2A3D", "\u2A3D"], /* RIGHTHAND INTERIOR PRODUCT */ + ["\u2A3E", "\u2A3E"], /* Z NOTATION RELATIONAL COMPOSITION */ + ["\u2A3F", "\u2A3F"], /* AMALGAMATION OR COPRODUCT */ + ["\u2A40", "\u2A40"], /* INTERSECTION WITH DOT */ + ["\u2A41", "\u2A41"], /* UNION WITH MINUS SIGN */ + ["\u2A42", "\u2A42"], /* UNION WITH OVERBAR */ + ["\u2A43", "\u2A43"], /* INTERSECTION WITH OVERBAR */ + ["\u2A44", "\u2A44"], /* INTERSECTION WITH LOGICAL AND */ + ["\u2A45", "\u2A45"], /* UNION WITH LOGICAL OR */ + ["\u2A46", "\u2A46"], /* UNION ABOVE INTERSECTION */ + ["\u2A47", "\u2A47"], /* INTERSECTION ABOVE UNION */ + ["\u2A48", "\u2A48"], /* UNION ABOVE BAR ABOVE INTERSECTION */ + ["\u2A49", "\u2A49"], /* INTERSECTION ABOVE BAR ABOVE UNION */ + ["\u2A4A", "\u2A4A"], /* UNION BESIDE AND JOINED WITH UNION */ + ["\u2A4B", "\u2A4B"], /* INTERSECTION BESIDE AND JOINED WITH INTERSECTION */ + ["\u2A4C", "\u2A4C"], /* CLOSED UNION WITH SERIFS */ + ["\u2A4D", "\u2A4D"], /* CLOSED INTERSECTION WITH SERIFS */ + ["\u2A4E", "\u2A4E"], /* DOUBLE SQUARE INTERSECTION */ + ["\u2A4F", "\u2A4F"], /* DOUBLE SQUARE UNION */ + ["\u2A50", "\u2A50"], /* CLOSED UNION WITH SERIFS AND SMASH PRODUCT */ + ["\u2A51", "\u2A51"], /* LOGICAL AND WITH DOT ABOVE */ + ["\u2A52", "\u2A52"], /* LOGICAL OR WITH DOT ABOVE */ + ["\u2A53", "\u2A53"], /* DOUBLE LOGICAL AND */ + ["\u2A54", "\u2A54"], /* DOUBLE LOGICAL OR */ + ["\u2A55", "\u2A55"], /* TWO INTERSECTING LOGICAL AND */ + ["\u2A56", "\u2A56"], /* TWO INTERSECTING LOGICAL OR */ + ["\u2A57", "\u2A57"], /* SLOPING LARGE OR */ + ["\u2A58", "\u2A58"], /* SLOPING LARGE AND */ + ["\u2A59", "\u2A59"], /* LOGICAL OR OVERLAPPING LOGICAL AND */ + ["\u2A5A", "\u2A5A"], /* LOGICAL AND WITH MIDDLE STEM */ + ["\u2A5B", "\u2A5B"], /* LOGICAL OR WITH MIDDLE STEM */ + ["\u2A5C", "\u2A5C"], /* LOGICAL AND WITH HORIZONTAL DASH */ + ["\u2A5D", "\u2A5D"], /* LOGICAL OR WITH HORIZONTAL DASH */ + ["\u2A5E", "\u2A5E"], /* LOGICAL AND WITH DOUBLE OVERBAR */ + ["\u2A5F", "\u2A5F"], /* LOGICAL AND WITH UNDERBAR */ + ["\u2A60", "\u2A60"], /* LOGICAL AND WITH DOUBLE UNDERBAR */ + ["\u2A61", "\u2A61"], /* SMALL VEE WITH UNDERBAR */ + ["\u2A62", "\u2A62"], /* LOGICAL OR WITH DOUBLE OVERBAR */ + ["\u2A63", "\u2A63"], /* LOGICAL OR WITH DOUBLE UNDERBAR */ + ["\u2A64", "\u2A64"], /* Z NOTATION DOMAIN ANTIRESTRICTION */ + ["\u2A65", "\u2A65"], /* Z NOTATION RANGE ANTIRESTRICTION */ + ["\u2A66", "\u2A66"], /* EQUALS SIGN WITH DOT BELOW */ + ["\u2A67", "\u2A67"], /* IDENTICAL WITH DOT ABOVE */ + ["\u2A68", "\u2A68"], /* TRIPLE HORIZONTAL BAR WITH DOUBLE VERTICAL STROKE */ + ["\u2A69", "\u2A69"], /* TRIPLE HORIZONTAL BAR WITH TRIPLE VERTICAL STROKE */ + ["\u2A6A", "\u2A6A"], /* TILDE OPERATOR WITH DOT ABOVE */ + ["\u2A6B", "\u2A6B"], /* TILDE OPERATOR WITH RISING DOTS */ + ["\u2A6C", "\u2A6C"], /* SIMILAR MINUS SIMILAR */ + ["\u2A6D", "\u2A6D"], /* CONGRUENT WITH DOT ABOVE */ + ["\u2A6E", "\u2A6E"], /* EQUALS WITH ASTERISK */ + ["\u2A6F", "\u2A6F"], /* ALMOST EQUAL TO WITH CIRCUMFLEX ACCENT */ + ["\u2A70", "\u2A70"], /* APPROXIMATELY EQUAL OR EQUAL TO */ + ["\u2A71", "\u2A71"], /* EQUALS SIGN ABOVE PLUS SIGN */ + ["\u2A72", "\u2A72"], /* PLUS SIGN ABOVE EQUALS SIGN */ + ["\u2A73", "\u2A73"], /* EQUALS SIGN ABOVE TILDE OPERATOR */ + ["\u2A74", "\u2A74"], /* DOUBLE COLON EQUAL */ + ["\u2A75", "\u2A75"], /* TWO CONSECUTIVE EQUALS SIGNS */ + ["\u2A76", "\u2A76"], /* THREE CONSECUTIVE EQUALS SIGNS */ + ["\u2A77", "\u2A77"], /* EQUALS SIGN WITH TWO DOTS ABOVE AND TWO DOTS BELOW */ + ["\u2A78", "\u2A78"], /* EQUIVALENT WITH FOUR DOTS ABOVE */ + ["\u2A79", "\u2A79"], /* LESS-THAN WITH CIRCLE INSIDE */ + ["\u2A7A", "\u2A7A"], /* GREATER-THAN WITH CIRCLE INSIDE */ + ["\u2A7B", "\u2A7B"], /* LESS-THAN WITH QUESTION MARK ABOVE */ + ["\u2A7C", "\u2A7C"], /* GREATER-THAN WITH QUESTION MARK ABOVE */ + ["\u2A7D", "\u2A7D"], /* LESS-THAN OR SLANTED EQUAL TO */ + ["\u2A7E", "\u2A7E"], /* GREATER-THAN OR SLANTED EQUAL TO */ + ["\u2A7F", "\u2A7F"], /* LESS-THAN OR SLANTED EQUAL TO WITH DOT INSIDE */ + ["\u2A80", "\u2A80"], /* GREATER-THAN OR SLANTED EQUAL TO WITH DOT INSIDE */ + ["\u2A81", "\u2A81"], /* LESS-THAN OR SLANTED EQUAL TO WITH DOT ABOVE */ + ["\u2A82", "\u2A82"], /* GREATER-THAN OR SLANTED EQUAL TO WITH DOT ABOVE */ + ["\u2A83", "\u2A83"], /* LESS-THAN OR SLANTED EQUAL TO WITH DOT ABOVE RIGHT */ + ["\u2A84", "\u2A84"], /* GREATER-THAN OR SLANTED EQUAL TO WITH DOT ABOVE LEFT */ + ["\u2A85", "\u2A85"], /* LESS-THAN OR APPROXIMATE */ + ["\u2A86", "\u2A86"], /* GREATER-THAN OR APPROXIMATE */ + ["\u2A87", "\u2A87"], /* LESS-THAN AND SINGLE-LINE NOT EQUAL TO */ + ["\u2A88", "\u2A88"], /* GREATER-THAN AND SINGLE-LINE NOT EQUAL TO */ + ["\u2A89", "\u2A89"], /* LESS-THAN AND NOT APPROXIMATE */ + ["\u2A8A", "\u2A8A"], /* GREATER-THAN AND NOT APPROXIMATE */ + ["\u2A8B", "\u2A8B"], /* LESS-THAN ABOVE DOUBLE-LINE EQUAL ABOVE GREATER-THAN */ + ["\u2A8C", "\u2A8C"], /* GREATER-THAN ABOVE DOUBLE-LINE EQUAL ABOVE LESS-THAN */ + ["\u2A8D", "\u2A8D"], /* LESS-THAN ABOVE SIMILAR OR EQUAL */ + ["\u2A8E", "\u2A8E"], /* GREATER-THAN ABOVE SIMILAR OR EQUAL */ + ["\u2A8F", "\u2A8F"], /* LESS-THAN ABOVE SIMILAR ABOVE GREATER-THAN */ + ["\u2A90", "\u2A90"], /* GREATER-THAN ABOVE SIMILAR ABOVE LESS-THAN */ + ["\u2A91", "\u2A91"], /* LESS-THAN ABOVE GREATER-THAN ABOVE DOUBLE-LINE EQUAL */ + ["\u2A92", "\u2A92"], /* GREATER-THAN ABOVE LESS-THAN ABOVE DOUBLE-LINE EQUAL */ + ["\u2A93", "\u2A93"], /* LESS-THAN ABOVE SLANTED EQUAL ABOVE GREATER-THAN ABOVE SLANTED EQUAL */ + ["\u2A94", "\u2A94"], /* GREATER-THAN ABOVE SLANTED EQUAL ABOVE LESS-THAN ABOVE SLANTED EQUAL */ + ["\u2A95", "\u2A95"], /* SLANTED EQUAL TO OR LESS-THAN */ + ["\u2A96", "\u2A96"], /* SLANTED EQUAL TO OR GREATER-THAN */ + ["\u2A97", "\u2A97"], /* SLANTED EQUAL TO OR LESS-THAN WITH DOT INSIDE */ + ["\u2A98", "\u2A98"], /* SLANTED EQUAL TO OR GREATER-THAN WITH DOT INSIDE */ + ["\u2A99", "\u2A99"], /* DOUBLE-LINE EQUAL TO OR LESS-THAN */ + ["\u2A9A", "\u2A9A"], /* DOUBLE-LINE EQUAL TO OR GREATER-THAN */ + ["\u2A9B", "\u2A9B"], /* DOUBLE-LINE SLANTED EQUAL TO OR LESS-THAN */ + ["\u2A9C", "\u2A9C"], /* DOUBLE-LINE SLANTED EQUAL TO OR GREATER-THAN */ + ["\u2A9D", "\u2A9D"], /* SIMILAR OR LESS-THAN */ + ["\u2A9E", "\u2A9E"], /* SIMILAR OR GREATER-THAN */ + ["\u2A9F", "\u2A9F"], /* SIMILAR ABOVE LESS-THAN ABOVE EQUALS SIGN */ + ["\u2AA0", "\u2AA0"], /* SIMILAR ABOVE GREATER-THAN ABOVE EQUALS SIGN */ + ["\u2AA1", "\u2AA1"], /* DOUBLE NESTED LESS-THAN */ + ["\u2AA2", "\u2AA2"], /* DOUBLE NESTED GREATER-THAN */ + ["\u2AA3", "\u2AA3"], /* DOUBLE NESTED LESS-THAN WITH UNDERBAR */ + ["\u2AA4", "\u2AA4"], /* GREATER-THAN OVERLAPPING LESS-THAN */ + ["\u2AA5", "\u2AA5"], /* GREATER-THAN BESIDE LESS-THAN */ + ["\u2AA6", "\u2AA6"], /* LESS-THAN CLOSED BY CURVE */ + ["\u2AA7", "\u2AA7"], /* GREATER-THAN CLOSED BY CURVE */ + ["\u2AA8", "\u2AA8"], /* LESS-THAN CLOSED BY CURVE ABOVE SLANTED EQUAL */ + ["\u2AA9", "\u2AA9"], /* GREATER-THAN CLOSED BY CURVE ABOVE SLANTED EQUAL */ + ["\u2AAA", "\u2AAA"], /* SMALLER THAN */ + ["\u2AAB", "\u2AAB"], /* LARGER THAN */ + ["\u2AAC", "\u2AAC"], /* SMALLER THAN OR EQUAL TO */ + ["\u2AAD", "\u2AAD"], /* LARGER THAN OR EQUAL TO */ + ["\u2AAE", "\u2AAE"], /* EQUALS SIGN WITH BUMPY ABOVE */ + ["\u2AAF", "\u2AAF"], /* PRECEDES ABOVE SINGLE-LINE EQUALS SIGN */ + ["\u2AB0", "\u2AB0"], /* SUCCEEDS ABOVE SINGLE-LINE EQUALS SIGN */ + ["\u2AB1", "\u2AB1"], /* PRECEDES ABOVE SINGLE-LINE NOT EQUAL TO */ + ["\u2AB2", "\u2AB2"], /* SUCCEEDS ABOVE SINGLE-LINE NOT EQUAL TO */ + ["\u2AB3", "\u2AB3"], /* PRECEDES ABOVE EQUALS SIGN */ + ["\u2AB4", "\u2AB4"], /* SUCCEEDS ABOVE EQUALS SIGN */ + ["\u2AB5", "\u2AB5"], /* PRECEDES ABOVE NOT EQUAL TO */ + ["\u2AB6", "\u2AB6"], /* SUCCEEDS ABOVE NOT EQUAL TO */ + ["\u2AB7", "\u2AB7"], /* PRECEDES ABOVE ALMOST EQUAL TO */ + ["\u2AB8", "\u2AB8"], /* SUCCEEDS ABOVE ALMOST EQUAL TO */ + ["\u2AB9", "\u2AB9"], /* PRECEDES ABOVE NOT ALMOST EQUAL TO */ + ["\u2ABA", "\u2ABA"], /* SUCCEEDS ABOVE NOT ALMOST EQUAL TO */ + ["\u2ABB", "\u2ABB"], /* DOUBLE PRECEDES */ + ["\u2ABC", "\u2ABC"], /* DOUBLE SUCCEEDS */ + ["\u2ABD", "\u2ABD"], /* SUBSET WITH DOT */ + ["\u2ABE", "\u2ABE"], /* SUPERSET WITH DOT */ + ["\u2ABF", "\u2ABF"], /* SUBSET WITH PLUS SIGN BELOW */ + ["\u2AC0", "\u2AC0"], /* SUPERSET WITH PLUS SIGN BELOW */ + ["\u2AC1", "\u2AC1"], /* SUBSET WITH MULTIPLICATION SIGN BELOW */ + ["\u2AC2", "\u2AC2"], /* SUPERSET WITH MULTIPLICATION SIGN BELOW */ + ["\u2AC3", "\u2AC3"], /* SUBSET OF OR EQUAL TO WITH DOT ABOVE */ + ["\u2AC4", "\u2AC4"], /* SUPERSET OF OR EQUAL TO WITH DOT ABOVE */ + ["\u2AC5", "\u2AC5"], /* SUBSET OF ABOVE EQUALS SIGN */ + ["\u2AC6", "\u2AC6"], /* SUPERSET OF ABOVE EQUALS SIGN */ + ["\u2AC7", "\u2AC7"], /* SUBSET OF ABOVE TILDE OPERATOR */ + ["\u2AC8", "\u2AC8"], /* SUPERSET OF ABOVE TILDE OPERATOR */ + ["\u2AC9", "\u2AC9"], /* SUBSET OF ABOVE ALMOST EQUAL TO */ + ["\u2ACA", "\u2ACA"], /* SUPERSET OF ABOVE ALMOST EQUAL TO */ + ["\u2ACB", "\u2ACB"], /* SUBSET OF ABOVE NOT EQUAL TO */ + ["\u2ACC", "\u2ACC"], /* SUPERSET OF ABOVE NOT EQUAL TO */ + ["\u2ACD", "\u2ACD"], /* SQUARE LEFT OPEN BOX OPERATOR */ + ["\u2ACE", "\u2ACE"], /* SQUARE RIGHT OPEN BOX OPERATOR */ + ["\u2ACF", "\u2ACF"], /* CLOSED SUBSET */ + ["\u2AD0", "\u2AD0"], /* CLOSED SUPERSET */ + ["\u2AD1", "\u2AD1"], /* CLOSED SUBSET OR EQUAL TO */ + ["\u2AD2", "\u2AD2"], /* CLOSED SUPERSET OR EQUAL TO */ + ["\u2AD3", "\u2AD3"], /* SUBSET ABOVE SUPERSET */ + ["\u2AD4", "\u2AD4"], /* SUPERSET ABOVE SUBSET */ + ["\u2AD5", "\u2AD5"], /* SUBSET ABOVE SUBSET */ + ["\u2AD6", "\u2AD6"], /* SUPERSET ABOVE SUPERSET */ + ["\u2AD7", "\u2AD7"], /* SUPERSET BESIDE SUBSET */ + ["\u2AD8", "\u2AD8"], /* SUPERSET BESIDE AND JOINED BY DASH WITH SUBSET */ + ["\u2AD9", "\u2AD9"], /* ELEMENT OF OPENING DOWNWARDS */ + ["\u2ADA", "\u2ADA"], /* PITCHFORK WITH TEE TOP */ + ["\u2ADB", "\u2ADB"], /* TRANSVERSAL INTERSECTION */ + ["\u2ADC", "\u2ADC"], /* FORKING */ + ["\u2ADD", "\u2ADD"], /* NONFORKING */ + ["\u2ADE", "\u2ADE"], /* SHORT LEFT TACK */ + ["\u2ADF", "\u2ADF"], /* SHORT DOWN TACK */ + ["\u2AE0", "\u2AE0"], /* SHORT UP TACK */ + ["\u2AE1", "\u2AE1"], /* PERPENDICULAR WITH S */ + ["\u2AE2", "\u2AE2"], /* VERTICAL BAR TRIPLE RIGHT TURNSTILE */ + ["\u2AE3", "\u2AE3"], /* DOUBLE VERTICAL BAR LEFT TURNSTILE */ + ["\u2AE4", "\u2AE4"], /* VERTICAL BAR DOUBLE LEFT TURNSTILE */ + ["\u2AE5", "\u2AE5"], /* DOUBLE VERTICAL BAR DOUBLE LEFT TURNSTILE */ + ["\u2AE6", "\u2AE6"], /* LONG DASH FROM LEFT MEMBER OF DOUBLE VERTICAL */ + ["\u2AE7", "\u2AE7"], /* SHORT DOWN TACK WITH OVERBAR */ + ["\u2AE8", "\u2AE8"], /* SHORT UP TACK WITH UNDERBAR */ + ["\u2AE9", "\u2AE9"], /* SHORT UP TACK ABOVE SHORT DOWN TACK */ + ["\u2AEA", "\u2AEA"], /* DOUBLE DOWN TACK */ + ["\u2AEB", "\u2AEB"], /* DOUBLE UP TACK */ + ["\u2AEC", "\u2AEC"], /* DOUBLE STROKE NOT SIGN */ + ["\u2AED", "\u2AED"], /* REVERSED DOUBLE STROKE NOT SIGN */ + ["\u2AEE", "\u2AEE"], /* DOES NOT DIVIDE WITH REVERSED NEGATION SLASH */ + ["\u2AEF", "\u2AEF"], /* VERTICAL LINE WITH CIRCLE ABOVE */ + ["\u2AF0", "\u2AF0"], /* VERTICAL LINE WITH CIRCLE BELOW */ + ["\u2AF1", "\u2AF1"], /* DOWN TACK WITH CIRCLE BELOW */ + ["\u2AF2", "\u2AF2"], /* PARALLEL WITH HORIZONTAL STROKE */ + ["\u2AF3", "\u2AF3"], /* PARALLEL WITH TILDE OPERATOR */ + ["\u2AF4", "\u2AF4"], /* TRIPLE VERTICAL BAR BINARY RELATION */ + ["\u2AF5", "\u2AF5"], /* TRIPLE VERTICAL BAR WITH HORIZONTAL STROKE */ + ["\u2AF6", "\u2AF6"], /* TRIPLE COLON OPERATOR */ + ["\u2AF7", "\u2AF7"], /* TRIPLE NESTED LESS-THAN */ + ["\u2AF8", "\u2AF8"], /* TRIPLE NESTED GREATER-THAN */ + ["\u2AF9", "\u2AF9"], /* DOUBLE-LINE SLANTED LESS-THAN OR EQUAL TO */ + ["\u2AFA", "\u2AFA"], /* DOUBLE-LINE SLANTED GREATER-THAN OR EQUAL TO */ + ["\u2AFB", "\u2AFB"], /* TRIPLE SOLIDUS BINARY RELATION */ + ["\u2AFC", "\u2AFC"], /* LARGE TRIPLE VERTICAL BAR OPERATOR */ + ["\u2AFD", "\u2AFD"], /* DOUBLE SOLIDUS OPERATOR */ + ["\u2AFE", "\u2AFE"], /* WHITE VERTICAL BAR */ + ["\u2AFF", "\u2AFF"], /* N-ARY WHITE VERTICAL BAR */ + ["\u2B00", "\u2B00"], /* NORTH EAST WHITE ARROW */ + ["\u2B01", "\u2B01"], /* NORTH WEST WHITE ARROW */ + ["\u2B02", "\u2B02"], /* SOUTH EAST WHITE ARROW */ + ["\u2B03", "\u2B03"], /* SOUTH WEST WHITE ARROW */ + ["\u2B04", "\u2B04"], /* LEFT RIGHT WHITE ARROW */ + ["\u2B05", "\u2B05"], /* LEFTWARDS BLACK ARROW */ + ["\u2B06", "\u2B06"], /* UPWARDS BLACK ARROW */ + ["\u2B07", "\u2B07"], /* DOWNWARDS BLACK ARROW */ + ["\u2B08", "\u2B08"], /* NORTH EAST BLACK ARROW */ + ["\u2B09", "\u2B09"], /* NORTH WEST BLACK ARROW */ + ["\u2B0A", "\u2B0A"], /* SOUTH EAST BLACK ARROW */ + ["\u2B0B", "\u2B0B"], /* SOUTH WEST BLACK ARROW */ + ["\u2B0C", "\u2B0C"], /* LEFT RIGHT BLACK ARROW */ + ["\u2B0D", "\u2B0D"], /* UP DOWN BLACK ARROW */ + ["\u2B0E", "\u2B0E"], /* RIGHTWARDS ARROW WITH TIP DOWNWARDS */ + ["\u2B0F", "\u2B0F"], /* RIGHTWARDS ARROW WITH TIP UPWARDS */ + ["\u2B10", "\u2B10"], /* LEFTWARDS ARROW WITH TIP DOWNWARDS */ + ["\u2B11", "\u2B11"], /* LEFTWARDS ARROW WITH TIP UPWARDS */ + ["\u2B12", "\u2B12"], /* SQUARE WITH TOP HALF BLACK */ + ["\u2B13", "\u2B13"], /* SQUARE WITH BOTTOM HALF BLACK */ + ["\u2B14", "\u2B14"], /* SQUARE WITH UPPER RIGHT DIAGONAL HALF BLACK */ + ["\u2B15", "\u2B15"], /* SQUARE WITH LOWER LEFT DIAGONAL HALF BLACK */ + ["\u2B16", "\u2B16"], /* DIAMOND WITH LEFT HALF BLACK */ + ["\u2B17", "\u2B17"], /* DIAMOND WITH RIGHT HALF BLACK */ + ["\u2B18", "\u2B18"], /* DIAMOND WITH TOP HALF BLACK */ + ["\u2B19", "\u2B19"], /* DIAMOND WITH BOTTOM HALF BLACK */ + ["\u2B1A", "\u2B1A"], /* DOTTED SQUARE */ + ["\u2B1B", "\u2B1B"], /* BLACK LARGE SQUARE */ + ["\u2B1C", "\u2B1C"], /* WHITE LARGE SQUARE */ + ["\u2B1D", "\u2B1D"], /* BLACK VERY SMALL SQUARE */ + ["\u2B1E", "\u2B1E"], /* WHITE VERY SMALL SQUARE */ + ["\u2B1F", "\u2B1F"], /* BLACK PENTAGON */ + ["\u2B20", "\u2B20"], /* WHITE PENTAGON */ + ["\u2B21", "\u2B21"], /* WHITE HEXAGON */ + ["\u2B22", "\u2B22"], /* BLACK HEXAGON */ + ["\u2B23", "\u2B23"], /* HORIZONTAL BLACK HEXAGON */ + ["\u2B24", "\u2B24"], /* BLACK LARGE CIRCLE */ + ["\u2B25", "\u2B25"], /* BLACK MEDIUM DIAMOND */ + ["\u2B26", "\u2B26"], /* WHITE MEDIUM DIAMOND */ + ["\u2B27", "\u2B27"], /* BLACK MEDIUM LOZENGE */ + ["\u2B28", "\u2B28"], /* WHITE MEDIUM LOZENGE */ + ["\u2B29", "\u2B29"], /* BLACK SMALL DIAMOND */ + ["\u2B2A", "\u2B2A"], /* BLACK SMALL LOZENGE */ + ["\u2B2B", "\u2B2B"], /* WHITE SMALL LOZENGE */ + ["\u2B2C", "\u2B2C"], /* BLACK HORIZONTAL ELLIPSE */ + ["\u2B2D", "\u2B2D"], /* WHITE HORIZONTAL ELLIPSE */ + ["\u2B2E", "\u2B2E"], /* BLACK VERTICAL ELLIPSE */ + ["\u2B2F", "\u2B2F"], /* WHITE VERTICAL ELLIPSE */ + ["\u2B30", "\u2B30"], /* LEFT ARROW WITH SMALL CIRCLE */ + ["\u2B31", "\u2B31"], /* THREE LEFTWARDS ARROWS */ + ["\u2B32", "\u2B32"], /* LEFT ARROW WITH CIRCLED PLUS */ + ["\u2B33", "\u2B33"], /* LONG LEFTWARDS SQUIGGLE ARROW */ + ["\u2B34", "\u2B34"], /* LEFTWARDS TWO-HEADED ARROW WITH VERTICAL STROKE */ + ["\u2B35", "\u2B35"], /* LEFTWARDS TWO-HEADED ARROW WITH DOUBLE VERTICAL STROKE */ + ["\u2B36", "\u2B36"], /* LEFTWARDS TWO-HEADED ARROW FROM BAR */ + ["\u2B37", "\u2B37"], /* LEFTWARDS TWO-HEADED TRIPLE DASH ARROW */ + ["\u2B38", "\u2B38"], /* LEFTWARDS ARROW WITH DOTTED STEM */ + ["\u2B39", "\u2B39"], /* LEFTWARDS ARROW WITH TAIL WITH VERTICAL STROKE */ + ["\u2B3A", "\u2B3A"], /* LEFTWARDS ARROW WITH TAIL WITH DOUBLE VERTICAL STROKE */ + ["\u2B3B", "\u2B3B"], /* LEFTWARDS TWO-HEADED ARROW WITH TAIL */ + ["\u2B3C", "\u2B3C"], /* LEFTWARDS TWO-HEADED ARROW WITH TAIL WITH VERTICAL STROKE */ + ["\u2B3D", "\u2B3D"], /* LEFTWARDS TWO-HEADED ARROW WITH TAIL WITH DOUBLE VERTICAL STROKE */ + ["\u2B3E", "\u2B3E"], /* LEFTWARDS ARROW THROUGH X */ + ["\u2B3F", "\u2B3F"], /* WAVE ARROW POINTING DIRECTLY LEFT */ + ["\u2B40", "\u2B40"], /* EQUALS SIGN ABOVE LEFTWARDS ARROW */ + ["\u2B41", "\u2B41"], /* REVERSE TILDE OPERATOR ABOVE LEFTWARDS ARROW */ + ["\u2B42", "\u2B42"], /* LEFTWARDS ARROW ABOVE REVERSE ALMOST EQUAL TO */ + ["\u2B43", "\u2B43"], /* RIGHTWARDS ARROW THROUGH GREATER-THAN */ + ["\u2B44", "\u2B44"], /* RIGHTWARDS ARROW THROUGH SUPERSET */ + ["\u2B45", "\u2B45"], /* LEFTWARDS QUADRUPLE ARROW */ + ["\u2B46", "\u2B46"], /* RIGHTWARDS QUADRUPLE ARROW */ + ["\u2B47", "\u2B47"], /* REVERSE TILDE OPERATOR ABOVE RIGHTWARDS ARROW */ + ["\u2B48", "\u2B48"], /* RIGHTWARDS ARROW ABOVE REVERSE ALMOST EQUAL TO */ + ["\u2B49", "\u2B49"], /* TILDE OPERATOR ABOVE LEFTWARDS ARROW */ + ["\u2B4A", "\u2B4A"], /* LEFTWARDS ARROW ABOVE ALMOST EQUAL TO */ + ["\u2B4B", "\u2B4B"], /* LEFTWARDS ARROW ABOVE REVERSE TILDE OPERATOR */ + ["\u2B4C", "\u2B4C"], /* RIGHTWARDS ARROW ABOVE REVERSE TILDE OPERATOR */ + ["\u2B4D", "\u2B4D"], /* DOWNWARDS TRIANGLE-HEADED ZIGZAG ARROW */ + ["\u2B4E", "\u2B4E"], /* SHORT SLANTED NORTH ARROW */ + ["\u2B4F", "\u2B4F"], /* SHORT BACKSLANTED SOUTH ARROW */ + ["\u2B50", "\u2B50"], /* WHITE MEDIUM STAR */ + ["\u2B51", "\u2B51"], /* BLACK SMALL STAR */ + ["\u2B52", "\u2B52"], /* WHITE SMALL STAR */ + ["\u2B53", "\u2B53"], /* BLACK RIGHT-POINTING PENTAGON */ + ["\u2B54", "\u2B54"], /* WHITE RIGHT-POINTING PENTAGON */ + ["\u2B55", "\u2B55"], /* HEAVY LARGE CIRCLE */ + ["\u2B56", "\u2B56"], /* HEAVY OVAL WITH OVAL INSIDE */ + ["\u2B57", "\u2B57"], /* HEAVY CIRCLE WITH CIRCLE INSIDE */ + ["\u2B58", "\u2B58"], /* HEAVY CIRCLE */ + ["\u2B59", "\u2B59"], /* HEAVY CIRCLED SALTIRE */ + ["\u2B5A", "\u2B5A"], /* SLANTED NORTH ARROW WITH HOOKED HEAD */ + ["\u2B5B", "\u2B5B"], /* BACKSLANTED SOUTH ARROW WITH HOOKED TAIL */ + ["\u2B5C", "\u2B5C"], /* SLANTED NORTH ARROW WITH HORIZONTAL TAIL */ + ["\u2B5D", "\u2B5D"], /* BACKSLANTED SOUTH ARROW WITH HORIZONTAL TAIL */ + ["\u2B5E", "\u2B5E"], /* BENT ARROW POINTING DOWNWARDS THEN NORTH EAST */ + ["\u2B5F", "\u2B5F"], /* SHORT BENT ARROW POINTING DOWNWARDS THEN NORTH EAST */ + ["\u2B60", "\u2B60"], /* LEFTWARDS TRIANGLE-HEADED ARROW */ + ["\u2B61", "\u2B61"], /* UPWARDS TRIANGLE-HEADED ARROW */ + ["\u2B62", "\u2B62"], /* RIGHTWARDS TRIANGLE-HEADED ARROW */ + ["\u2B63", "\u2B63"], /* DOWNWARDS TRIANGLE-HEADED ARROW */ + ["\u2B64", "\u2B64"], /* LEFT RIGHT TRIANGLE-HEADED ARROW */ + ["\u2B65", "\u2B65"], /* UP DOWN TRIANGLE-HEADED ARROW */ + ["\u2B66", "\u2B66"], /* NORTH WEST TRIANGLE-HEADED ARROW */ + ["\u2B67", "\u2B67"], /* NORTH EAST TRIANGLE-HEADED ARROW */ + ["\u2B68", "\u2B68"], /* SOUTH EAST TRIANGLE-HEADED ARROW */ + ["\u2B69", "\u2B69"], /* SOUTH WEST TRIANGLE-HEADED ARROW */ + ["\u2B6A", "\u2B6A"], /* LEFTWARDS TRIANGLE-HEADED DASHED ARROW */ + ["\u2B6B", "\u2B6B"], /* UPWARDS TRIANGLE-HEADED DASHED ARROW */ + ["\u2B6C", "\u2B6C"], /* RIGHTWARDS TRIANGLE-HEADED DASHED ARROW */ + ["\u2B6D", "\u2B6D"], /* DOWNWARDS TRIANGLE-HEADED DASHED ARROW */ + ["\u2B6E", "\u2B6E"], /* CLOCKWISE TRIANGLE-HEADED OPEN CIRCLE ARROW */ + ["\u2B6F", "\u2B6F"], /* ANTICLOCKWISE TRIANGLE-HEADED OPEN CIRCLE ARROW */ + ["\u2B70", "\u2B70"], /* LEFTWARDS TRIANGLE-HEADED ARROW TO BAR */ + ["\u2B71", "\u2B71"], /* UPWARDS TRIANGLE-HEADED ARROW TO BAR */ + ["\u2B72", "\u2B72"], /* RIGHTWARDS TRIANGLE-HEADED ARROW TO BAR */ + ["\u2B73", "\u2B73"], /* DOWNWARDS TRIANGLE-HEADED ARROW TO BAR */ + ["\u2B74", "\u2B74"], + ["\u2B75", "\u2B75"], + ["\u2B76", "\u2B76"], /* NORTH WEST TRIANGLE-HEADED ARROW TO BAR */ + ["\u2B77", "\u2B77"], /* NORTH EAST TRIANGLE-HEADED ARROW TO BAR */ + ["\u2B78", "\u2B78"], /* SOUTH EAST TRIANGLE-HEADED ARROW TO BAR */ + ["\u2B79", "\u2B79"], /* SOUTH WEST TRIANGLE-HEADED ARROW TO BAR */ + ["\u2B7A", "\u2B7A"], /* LEFTWARDS TRIANGLE-HEADED ARROW WITH DOUBLE HORIZONTAL STROKE */ + ["\u2B7B", "\u2B7B"], /* UPWARDS TRIANGLE-HEADED ARROW WITH DOUBLE HORIZONTAL STROKE */ + ["\u2B7C", "\u2B7C"], /* RIGHTWARDS TRIANGLE-HEADED ARROW WITH DOUBLE HORIZONTAL STROKE */ + ["\u2B7D", "\u2B7D"], /* DOWNWARDS TRIANGLE-HEADED ARROW WITH DOUBLE HORIZONTAL STROKE */ + ["\u2B7E", "\u2B7E"], /* HORIZONTAL TAB KEY */ + ["\u2B7F", "\u2B7F"], /* VERTICAL TAB KEY */ + ["\u2B80", "\u2B80"], /* LEFTWARDS TRIANGLE-HEADED ARROW OVER RIGHTWARDS TRIANGLE-HEADED ARROW */ + ["\u2B81", "\u2B81"], /* UPWARDS TRIANGLE-HEADED ARROW LEFTWARDS OF DOWNWARDS TRIANGLE-HEADED ARROW */ + ["\u2B82", "\u2B82"], /* RIGHTWARDS TRIANGLE-HEADED ARROW OVER LEFTWARDS TRIANGLE-HEADED ARROW */ + ["\u2B83", "\u2B83"], /* DOWNWARDS TRIANGLE-HEADED ARROW LEFTWARDS OF UPWARDS TRIANGLE-HEADED ARROW */ + ["\u2B84", "\u2B84"], /* LEFTWARDS TRIANGLE-HEADED PAIRED ARROWS */ + ["\u2B85", "\u2B85"], /* UPWARDS TRIANGLE-HEADED PAIRED ARROWS */ + ["\u2B86", "\u2B86"], /* RIGHTWARDS TRIANGLE-HEADED PAIRED ARROWS */ + ["\u2B87", "\u2B87"], /* DOWNWARDS TRIANGLE-HEADED PAIRED ARROWS */ + ["\u2B88", "\u2B88"], /* LEFTWARDS BLACK CIRCLED WHITE ARROW */ + ["\u2B89", "\u2B89"], /* UPWARDS BLACK CIRCLED WHITE ARROW */ + ["\u2B8A", "\u2B8A"], /* RIGHTWARDS BLACK CIRCLED WHITE ARROW */ + ["\u2B8B", "\u2B8B"], /* DOWNWARDS BLACK CIRCLED WHITE ARROW */ + ["\u2B8C", "\u2B8C"], /* ANTICLOCKWISE TRIANGLE-HEADED RIGHT U-SHAPED ARROW */ + ["\u2B8D", "\u2B8D"], /* ANTICLOCKWISE TRIANGLE-HEADED BOTTOM U-SHAPED ARROW */ + ["\u2B8E", "\u2B8E"], /* ANTICLOCKWISE TRIANGLE-HEADED LEFT U-SHAPED ARROW */ + ["\u2B8F", "\u2B8F"], /* ANTICLOCKWISE TRIANGLE-HEADED TOP U-SHAPED ARROW */ + ["\u2B90", "\u2B90"], /* RETURN LEFT */ + ["\u2B91", "\u2B91"], /* RETURN RIGHT */ + ["\u2B92", "\u2B92"], /* NEWLINE LEFT */ + ["\u2B93", "\u2B93"], /* NEWLINE RIGHT */ + ["\u2B94", "\u2B94"], /* FOUR CORNER ARROWS CIRCLING ANTICLOCKWISE */ + ["\u2B95", "\u2B95"], /* RIGHTWARDS BLACK ARROW */ + ["\u2B96", "\u2B96"], + ["\u2B97", "\u2B97"], /* SYMBOL FOR TYPE A ELECTRONICS */ + ["\u2B98", "\u2B98"], /* THREE-D TOP-LIGHTED LEFTWARDS EQUILATERAL ARROWHEAD */ + ["\u2B99", "\u2B99"], /* THREE-D RIGHT-LIGHTED UPWARDS EQUILATERAL ARROWHEAD */ + ["\u2B9A", "\u2B9A"], /* THREE-D TOP-LIGHTED RIGHTWARDS EQUILATERAL ARROWHEAD */ + ["\u2B9B", "\u2B9B"], /* THREE-D LEFT-LIGHTED DOWNWARDS EQUILATERAL ARROWHEAD */ + ["\u2B9C", "\u2B9C"], /* BLACK LEFTWARDS EQUILATERAL ARROWHEAD */ + ["\u2B9D", "\u2B9D"], /* BLACK UPWARDS EQUILATERAL ARROWHEAD */ + ["\u2B9E", "\u2B9E"], /* BLACK RIGHTWARDS EQUILATERAL ARROWHEAD */ + ["\u2B9F", "\u2B9F"], /* BLACK DOWNWARDS EQUILATERAL ARROWHEAD */ + ["\u2BA0", "\u2BA0"], /* DOWNWARDS TRIANGLE-HEADED ARROW WITH LONG TIP LEFTWARDS */ + ["\u2BA1", "\u2BA1"], /* DOWNWARDS TRIANGLE-HEADED ARROW WITH LONG TIP RIGHTWARDS */ + ["\u2BA2", "\u2BA2"], /* UPWARDS TRIANGLE-HEADED ARROW WITH LONG TIP LEFTWARDS */ + ["\u2BA3", "\u2BA3"], /* UPWARDS TRIANGLE-HEADED ARROW WITH LONG TIP RIGHTWARDS */ + ["\u2BA4", "\u2BA4"], /* LEFTWARDS TRIANGLE-HEADED ARROW WITH LONG TIP UPWARDS */ + ["\u2BA5", "\u2BA5"], /* RIGHTWARDS TRIANGLE-HEADED ARROW WITH LONG TIP UPWARDS */ + ["\u2BA6", "\u2BA6"], /* LEFTWARDS TRIANGLE-HEADED ARROW WITH LONG TIP DOWNWARDS */ + ["\u2BA7", "\u2BA7"], /* RIGHTWARDS TRIANGLE-HEADED ARROW WITH LONG TIP DOWNWARDS */ + ["\u2BA8", "\u2BA8"], /* BLACK CURVED DOWNWARDS AND LEFTWARDS ARROW */ + ["\u2BA9", "\u2BA9"], /* BLACK CURVED DOWNWARDS AND RIGHTWARDS ARROW */ + ["\u2BAA", "\u2BAA"], /* BLACK CURVED UPWARDS AND LEFTWARDS ARROW */ + ["\u2BAB", "\u2BAB"], /* BLACK CURVED UPWARDS AND RIGHTWARDS ARROW */ + ["\u2BAC", "\u2BAC"], /* BLACK CURVED LEFTWARDS AND UPWARDS ARROW */ + ["\u2BAD", "\u2BAD"], /* BLACK CURVED RIGHTWARDS AND UPWARDS ARROW */ + ["\u2BAE", "\u2BAE"], /* BLACK CURVED LEFTWARDS AND DOWNWARDS ARROW */ + ["\u2BAF", "\u2BAF"], /* BLACK CURVED RIGHTWARDS AND DOWNWARDS ARROW */ + ["\u2BB0", "\u2BB0"], /* RIBBON ARROW DOWN LEFT */ + ["\u2BB1", "\u2BB1"], /* RIBBON ARROW DOWN RIGHT */ + ["\u2BB2", "\u2BB2"], /* RIBBON ARROW UP LEFT */ + ["\u2BB3", "\u2BB3"], /* RIBBON ARROW UP RIGHT */ + ["\u2BB4", "\u2BB4"], /* RIBBON ARROW LEFT UP */ + ["\u2BB5", "\u2BB5"], /* RIBBON ARROW RIGHT UP */ + ["\u2BB6", "\u2BB6"], /* RIBBON ARROW LEFT DOWN */ + ["\u2BB7", "\u2BB7"], /* RIBBON ARROW RIGHT DOWN */ + ["\u2BB8", "\u2BB8"], /* UPWARDS WHITE ARROW FROM BAR WITH HORIZONTAL BAR */ + ["\u2BB9", "\u2BB9"], /* UP ARROWHEAD IN A RECTANGLE BOX */ + ["\u2BBA", "\u2BBA"], /* OVERLAPPING WHITE SQUARES */ + ["\u2BBB", "\u2BBB"], /* OVERLAPPING WHITE AND BLACK SQUARES */ + ["\u2BBC", "\u2BBC"], /* OVERLAPPING BLACK SQUARES */ + ["\u2BBD", "\u2BBD"], /* BALLOT BOX WITH LIGHT X */ + ["\u2BBE", "\u2BBE"], /* CIRCLED X */ + ["\u2BBF", "\u2BBF"], /* CIRCLED BOLD X */ + ["\u2BC0", "\u2BC0"], /* BLACK SQUARE CENTRED */ + ["\u2BC1", "\u2BC1"], /* BLACK DIAMOND CENTRED */ + ["\u2BC2", "\u2BC2"], /* TURNED BLACK PENTAGON */ + ["\u2BC3", "\u2BC3"], /* HORIZONTAL BLACK OCTAGON */ + ["\u2BC4", "\u2BC4"], /* BLACK OCTAGON */ + ["\u2BC5", "\u2BC5"], /* BLACK MEDIUM UP-POINTING TRIANGLE CENTRED */ + ["\u2BC6", "\u2BC6"], /* BLACK MEDIUM DOWN-POINTING TRIANGLE CENTRED */ + ["\u2BC7", "\u2BC7"], /* BLACK MEDIUM LEFT-POINTING TRIANGLE CENTRED */ + ["\u2BC8", "\u2BC8"], /* BLACK MEDIUM RIGHT-POINTING TRIANGLE CENTRED */ + ["\u2BC9", "\u2BC9"], /* NEPTUNE FORM TWO */ + ["\u2BCA", "\u2BCA"], /* TOP HALF BLACK CIRCLE */ + ["\u2BCB", "\u2BCB"], /* BOTTOM HALF BLACK CIRCLE */ + ["\u2BCC", "\u2BCC"], /* LIGHT FOUR POINTED BLACK CUSP */ + ["\u2BCD", "\u2BCD"], /* ROTATED LIGHT FOUR POINTED BLACK CUSP */ + ["\u2BCE", "\u2BCE"], /* WHITE FOUR POINTED CUSP */ + ["\u2BCF", "\u2BCF"], /* ROTATED WHITE FOUR POINTED CUSP */ + ["\u2BD0", "\u2BD0"], /* SQUARE POSITION INDICATOR */ + ["\u2BD1", "\u2BD1"], /* UNCERTAINTY SIGN */ + ["\u2BD2", "\u2BD2"], /* GROUP MARK */ + ["\u2BD3", "\u2BD3"], /* PLUTO FORM TWO */ + ["\u2BD4", "\u2BD4"], /* PLUTO FORM THREE */ + ["\u2BD5", "\u2BD5"], /* PLUTO FORM FOUR */ + ["\u2BD6", "\u2BD6"], /* PLUTO FORM FIVE */ + ["\u2BD7", "\u2BD7"], /* TRANSPLUTO */ + ["\u2BD8", "\u2BD8"], /* PROSERPINA */ + ["\u2BD9", "\u2BD9"], /* ASTRAEA */ + ["\u2BDA", "\u2BDA"], /* HYGIEA */ + ["\u2BDB", "\u2BDB"], /* PHOLUS */ + ["\u2BDC", "\u2BDC"], /* NESSUS */ + ["\u2BDD", "\u2BDD"], /* WHITE MOON SELENA */ + ["\u2BDE", "\u2BDE"], /* BLACK DIAMOND ON CROSS */ + ["\u2BDF", "\u2BDF"], /* TRUE LIGHT MOON ARTA */ + ["\u2BE0", "\u2BE0"], /* CUPIDO */ + ["\u2BE1", "\u2BE1"], /* HADES */ + ["\u2BE2", "\u2BE2"], /* ZEUS */ + ["\u2BE3", "\u2BE3"], /* KRONOS */ + ["\u2BE4", "\u2BE4"], /* APOLLON */ + ["\u2BE5", "\u2BE5"], /* ADMETOS */ + ["\u2BE6", "\u2BE6"], /* VULCANUS */ + ["\u2BE7", "\u2BE7"], /* POSEIDON */ + ["\u2BE8", "\u2BE8"], /* LEFT HALF BLACK STAR */ + ["\u2BE9", "\u2BE9"], /* RIGHT HALF BLACK STAR */ + ["\u2BEA", "\u2BEA"], /* STAR WITH LEFT HALF BLACK */ + ["\u2BEB", "\u2BEB"], /* STAR WITH RIGHT HALF BLACK */ + ["\u2BEC", "\u2BEC"], /* LEFTWARDS TWO-HEADED ARROW WITH TRIANGLE ARROWHEADS */ + ["\u2BED", "\u2BED"], /* UPWARDS TWO-HEADED ARROW WITH TRIANGLE ARROWHEADS */ + ["\u2BEE", "\u2BEE"], /* RIGHTWARDS TWO-HEADED ARROW WITH TRIANGLE ARROWHEADS */ + ["\u2BEF", "\u2BEF"], /* DOWNWARDS TWO-HEADED ARROW WITH TRIANGLE ARROWHEADS */ + ["\u2BF0", "\u2BF0"], /* ERIS FORM ONE */ + ["\u2BF1", "\u2BF1"], /* ERIS FORM TWO */ + ["\u2BF2", "\u2BF2"], /* SEDNA */ + ["\u2BF3", "\u2BF3"], /* RUSSIAN ASTROLOGICAL SYMBOL VIGINTILE */ + ["\u2BF4", "\u2BF4"], /* RUSSIAN ASTROLOGICAL SYMBOL NOVILE */ + ["\u2BF5", "\u2BF5"], /* RUSSIAN ASTROLOGICAL SYMBOL QUINTILE */ + ["\u2BF6", "\u2BF6"], /* RUSSIAN ASTROLOGICAL SYMBOL BINOVILE */ + ["\u2BF7", "\u2BF7"], /* RUSSIAN ASTROLOGICAL SYMBOL SENTAGON */ + ["\u2BF8", "\u2BF8"], /* RUSSIAN ASTROLOGICAL SYMBOL TREDECILE */ + ["\u2BF9", "\u2BF9"], /* EQUALS SIGN WITH INFINITY BELOW */ + ["\u2BFA", "\u2BFA"], /* UNITED SYMBOL */ + ["\u2BFB", "\u2BFB"], /* SEPARATED SYMBOL */ + ["\u2BFC", "\u2BFC"], /* DOUBLED SYMBOL */ + ["\u2BFD", "\u2BFD"], /* PASSED SYMBOL */ + ["\u2BFE", "\u2BFE"], /* REVERSED RIGHT ANGLE */ + ["\u2BFF", "\u2BFF"], /* HELLSCHREIBER PAUSE SYMBOL */ + ["\u2C00", "\u2C30"], /* GLAGOLITIC CAPITAL LETTER AZU */ + ["\u2C01", "\u2C31"], /* GLAGOLITIC CAPITAL LETTER BUKY */ + ["\u2C02", "\u2C32"], /* GLAGOLITIC CAPITAL LETTER VEDE */ + ["\u2C03", "\u2C33"], /* GLAGOLITIC CAPITAL LETTER GLAGOLI */ + ["\u2C04", "\u2C34"], /* GLAGOLITIC CAPITAL LETTER DOBRO */ + ["\u2C05", "\u2C35"], /* GLAGOLITIC CAPITAL LETTER YESTU */ + ["\u2C06", "\u2C36"], /* GLAGOLITIC CAPITAL LETTER ZHIVETE */ + ["\u2C07", "\u2C37"], /* GLAGOLITIC CAPITAL LETTER DZELO */ + ["\u2C08", "\u2C38"], /* GLAGOLITIC CAPITAL LETTER ZEMLJA */ + ["\u2C09", "\u2C39"], /* GLAGOLITIC CAPITAL LETTER IZHE */ + ["\u2C0A", "\u2C3A"], /* GLAGOLITIC CAPITAL LETTER INITIAL IZHE */ + ["\u2C0B", "\u2C3B"], /* GLAGOLITIC CAPITAL LETTER I */ + ["\u2C0C", "\u2C3C"], /* GLAGOLITIC CAPITAL LETTER DJERVI */ + ["\u2C0D", "\u2C3D"], /* GLAGOLITIC CAPITAL LETTER KAKO */ + ["\u2C0E", "\u2C3E"], /* GLAGOLITIC CAPITAL LETTER LJUDIJE */ + ["\u2C0F", "\u2C3F"], /* GLAGOLITIC CAPITAL LETTER MYSLITE */ + ["\u2C10", "\u2C40"], /* GLAGOLITIC CAPITAL LETTER NASHI */ + ["\u2C11", "\u2C41"], /* GLAGOLITIC CAPITAL LETTER ONU */ + ["\u2C12", "\u2C42"], /* GLAGOLITIC CAPITAL LETTER POKOJI */ + ["\u2C13", "\u2C43"], /* GLAGOLITIC CAPITAL LETTER RITSI */ + ["\u2C14", "\u2C44"], /* GLAGOLITIC CAPITAL LETTER SLOVO */ + ["\u2C15", "\u2C45"], /* GLAGOLITIC CAPITAL LETTER TVRIDO */ + ["\u2C16", "\u2C46"], /* GLAGOLITIC CAPITAL LETTER UKU */ + ["\u2C17", "\u2C47"], /* GLAGOLITIC CAPITAL LETTER FRITU */ + ["\u2C18", "\u2C48"], /* GLAGOLITIC CAPITAL LETTER HERU */ + ["\u2C19", "\u2C49"], /* GLAGOLITIC CAPITAL LETTER OTU */ + ["\u2C1A", "\u2C4A"], /* GLAGOLITIC CAPITAL LETTER PE */ + ["\u2C1B", "\u2C4B"], /* GLAGOLITIC CAPITAL LETTER SHTA */ + ["\u2C1C", "\u2C4C"], /* GLAGOLITIC CAPITAL LETTER TSI */ + ["\u2C1D", "\u2C4D"], /* GLAGOLITIC CAPITAL LETTER CHRIVI */ + ["\u2C1E", "\u2C4E"], /* GLAGOLITIC CAPITAL LETTER SHA */ + ["\u2C1F", "\u2C4F"], /* GLAGOLITIC CAPITAL LETTER YERU */ + ["\u2C20", "\u2C50"], /* GLAGOLITIC CAPITAL LETTER YERI */ + ["\u2C21", "\u2C51"], /* GLAGOLITIC CAPITAL LETTER YATI */ + ["\u2C22", "\u2C52"], /* GLAGOLITIC CAPITAL LETTER SPIDERY HA */ + ["\u2C23", "\u2C53"], /* GLAGOLITIC CAPITAL LETTER YU */ + ["\u2C24", "\u2C54"], /* GLAGOLITIC CAPITAL LETTER SMALL YUS */ + ["\u2C25", "\u2C55"], /* GLAGOLITIC CAPITAL LETTER SMALL YUS WITH TAIL */ + ["\u2C26", "\u2C56"], /* GLAGOLITIC CAPITAL LETTER YO */ + ["\u2C27", "\u2C57"], /* GLAGOLITIC CAPITAL LETTER IOTATED SMALL YUS */ + ["\u2C28", "\u2C58"], /* GLAGOLITIC CAPITAL LETTER BIG YUS */ + ["\u2C29", "\u2C59"], /* GLAGOLITIC CAPITAL LETTER IOTATED BIG YUS */ + ["\u2C2A", "\u2C5A"], /* GLAGOLITIC CAPITAL LETTER FITA */ + ["\u2C2B", "\u2C5B"], /* GLAGOLITIC CAPITAL LETTER IZHITSA */ + ["\u2C2C", "\u2C5C"], /* GLAGOLITIC CAPITAL LETTER SHTAPIC */ + ["\u2C2D", "\u2C5D"], /* GLAGOLITIC CAPITAL LETTER TROKUTASTI A */ + ["\u2C2E", "\u2C5E"], /* GLAGOLITIC CAPITAL LETTER LATINATE MYSLITE */ + ["\u2C2F", "\u2C5F"], /* GLAGOLITIC CAPITAL LETTER CAUDATE CHRIVI */ + ["\u2C00", "\u2C30"], /* GLAGOLITIC SMALL LETTER AZU */ + ["\u2C01", "\u2C31"], /* GLAGOLITIC SMALL LETTER BUKY */ + ["\u2C02", "\u2C32"], /* GLAGOLITIC SMALL LETTER VEDE */ + ["\u2C03", "\u2C33"], /* GLAGOLITIC SMALL LETTER GLAGOLI */ + ["\u2C04", "\u2C34"], /* GLAGOLITIC SMALL LETTER DOBRO */ + ["\u2C05", "\u2C35"], /* GLAGOLITIC SMALL LETTER YESTU */ + ["\u2C06", "\u2C36"], /* GLAGOLITIC SMALL LETTER ZHIVETE */ + ["\u2C07", "\u2C37"], /* GLAGOLITIC SMALL LETTER DZELO */ + ["\u2C08", "\u2C38"], /* GLAGOLITIC SMALL LETTER ZEMLJA */ + ["\u2C09", "\u2C39"], /* GLAGOLITIC SMALL LETTER IZHE */ + ["\u2C0A", "\u2C3A"], /* GLAGOLITIC SMALL LETTER INITIAL IZHE */ + ["\u2C0B", "\u2C3B"], /* GLAGOLITIC SMALL LETTER I */ + ["\u2C0C", "\u2C3C"], /* GLAGOLITIC SMALL LETTER DJERVI */ + ["\u2C0D", "\u2C3D"], /* GLAGOLITIC SMALL LETTER KAKO */ + ["\u2C0E", "\u2C3E"], /* GLAGOLITIC SMALL LETTER LJUDIJE */ + ["\u2C0F", "\u2C3F"], /* GLAGOLITIC SMALL LETTER MYSLITE */ + ["\u2C10", "\u2C40"], /* GLAGOLITIC SMALL LETTER NASHI */ + ["\u2C11", "\u2C41"], /* GLAGOLITIC SMALL LETTER ONU */ + ["\u2C12", "\u2C42"], /* GLAGOLITIC SMALL LETTER POKOJI */ + ["\u2C13", "\u2C43"], /* GLAGOLITIC SMALL LETTER RITSI */ + ["\u2C14", "\u2C44"], /* GLAGOLITIC SMALL LETTER SLOVO */ + ["\u2C15", "\u2C45"], /* GLAGOLITIC SMALL LETTER TVRIDO */ + ["\u2C16", "\u2C46"], /* GLAGOLITIC SMALL LETTER UKU */ + ["\u2C17", "\u2C47"], /* GLAGOLITIC SMALL LETTER FRITU */ + ["\u2C18", "\u2C48"], /* GLAGOLITIC SMALL LETTER HERU */ + ["\u2C19", "\u2C49"], /* GLAGOLITIC SMALL LETTER OTU */ + ["\u2C1A", "\u2C4A"], /* GLAGOLITIC SMALL LETTER PE */ + ["\u2C1B", "\u2C4B"], /* GLAGOLITIC SMALL LETTER SHTA */ + ["\u2C1C", "\u2C4C"], /* GLAGOLITIC SMALL LETTER TSI */ + ["\u2C1D", "\u2C4D"], /* GLAGOLITIC SMALL LETTER CHRIVI */ + ["\u2C1E", "\u2C4E"], /* GLAGOLITIC SMALL LETTER SHA */ + ["\u2C1F", "\u2C4F"], /* GLAGOLITIC SMALL LETTER YERU */ + ["\u2C20", "\u2C50"], /* GLAGOLITIC SMALL LETTER YERI */ + ["\u2C21", "\u2C51"], /* GLAGOLITIC SMALL LETTER YATI */ + ["\u2C22", "\u2C52"], /* GLAGOLITIC SMALL LETTER SPIDERY HA */ + ["\u2C23", "\u2C53"], /* GLAGOLITIC SMALL LETTER YU */ + ["\u2C24", "\u2C54"], /* GLAGOLITIC SMALL LETTER SMALL YUS */ + ["\u2C25", "\u2C55"], /* GLAGOLITIC SMALL LETTER SMALL YUS WITH TAIL */ + ["\u2C26", "\u2C56"], /* GLAGOLITIC SMALL LETTER YO */ + ["\u2C27", "\u2C57"], /* GLAGOLITIC SMALL LETTER IOTATED SMALL YUS */ + ["\u2C28", "\u2C58"], /* GLAGOLITIC SMALL LETTER BIG YUS */ + ["\u2C29", "\u2C59"], /* GLAGOLITIC SMALL LETTER IOTATED BIG YUS */ + ["\u2C2A", "\u2C5A"], /* GLAGOLITIC SMALL LETTER FITA */ + ["\u2C2B", "\u2C5B"], /* GLAGOLITIC SMALL LETTER IZHITSA */ + ["\u2C2C", "\u2C5C"], /* GLAGOLITIC SMALL LETTER SHTAPIC */ + ["\u2C2D", "\u2C5D"], /* GLAGOLITIC SMALL LETTER TROKUTASTI A */ + ["\u2C2E", "\u2C5E"], /* GLAGOLITIC SMALL LETTER LATINATE MYSLITE */ + ["\u2C2F", "\u2C5F"], /* GLAGOLITIC SMALL LETTER CAUDATE CHRIVI */ + ["\u2C60", "\u2C61"], /* LATIN CAPITAL LETTER L WITH DOUBLE BAR */ + ["\u2C60", "\u2C61"], /* LATIN SMALL LETTER L WITH DOUBLE BAR */ + ["\u2C62", "\u026B"], /* LATIN CAPITAL LETTER L WITH MIDDLE TILDE */ + ["\u2C63", "\u1D7D"], /* LATIN CAPITAL LETTER P WITH STROKE */ + ["\u2C64", "\u027D"], /* LATIN CAPITAL LETTER R WITH TAIL */ + ["\u023A", "\u2C65"], /* LATIN SMALL LETTER A WITH STROKE */ + ["\u023E", "\u2C66"], /* LATIN SMALL LETTER T WITH DIAGONAL STROKE */ + ["\u2C67", "\u2C68"], /* LATIN CAPITAL LETTER H WITH DESCENDER */ + ["\u2C67", "\u2C68"], /* LATIN SMALL LETTER H WITH DESCENDER */ + ["\u2C69", "\u2C6A"], /* LATIN CAPITAL LETTER K WITH DESCENDER */ + ["\u2C69", "\u2C6A"], /* LATIN SMALL LETTER K WITH DESCENDER */ + ["\u2C6B", "\u2C6C"], /* LATIN CAPITAL LETTER Z WITH DESCENDER */ + ["\u2C6B", "\u2C6C"], /* LATIN SMALL LETTER Z WITH DESCENDER */ + ["\u2C6D", "\u0251"], /* LATIN CAPITAL LETTER ALPHA */ + ["\u2C6E", "\u0271"], /* LATIN CAPITAL LETTER M WITH HOOK */ + ["\u2C6F", "\u0250"], /* LATIN CAPITAL LETTER TURNED A */ + ["\u2C70", "\u0252"], /* LATIN CAPITAL LETTER TURNED ALPHA */ + ["\u2C71", "\u2C71"], /* LATIN SMALL LETTER V WITH RIGHT HOOK */ + ["\u2C72", "\u2C73"], /* LATIN CAPITAL LETTER W WITH HOOK */ + ["\u2C72", "\u2C73"], /* LATIN SMALL LETTER W WITH HOOK */ + ["\u2C74", "\u2C74"], /* LATIN SMALL LETTER V WITH CURL */ + ["\u2C75", "\u2C76"], /* LATIN CAPITAL LETTER HALF H */ + ["\u2C75", "\u2C76"], /* LATIN SMALL LETTER HALF H */ + ["\u2C77", "\u2C77"], /* LATIN SMALL LETTER TAILLESS PHI */ + ["\u2C78", "\u2C78"], /* LATIN SMALL LETTER E WITH NOTCH */ + ["\u2C79", "\u2C79"], /* LATIN SMALL LETTER TURNED R WITH TAIL */ + ["\u2C7A", "\u2C7A"], /* LATIN SMALL LETTER O WITH LOW RING INSIDE */ + ["\u2C7B", "\u2C7B"], /* LATIN LETTER SMALL CAPITAL TURNED E */ + ["\u2C7C", "\u2C7C"], /* LATIN SUBSCRIPT SMALL LETTER J */ + ["\u2C7D", "\u2C7D"], /* MODIFIER LETTER CAPITAL V */ + ["\u2C7E", "\u023F"], /* LATIN CAPITAL LETTER S WITH SWASH TAIL */ + ["\u2C7F", "\u0240"], /* LATIN CAPITAL LETTER Z WITH SWASH TAIL */ + ["\u2C80", "\u2C81"], /* COPTIC CAPITAL LETTER ALFA */ + ["\u2C80", "\u2C81"], /* COPTIC SMALL LETTER ALFA */ + ["\u2C82", "\u2C83"], /* COPTIC CAPITAL LETTER VIDA */ + ["\u2C82", "\u2C83"], /* COPTIC SMALL LETTER VIDA */ + ["\u2C84", "\u2C85"], /* COPTIC CAPITAL LETTER GAMMA */ + ["\u2C84", "\u2C85"], /* COPTIC SMALL LETTER GAMMA */ + ["\u2C86", "\u2C87"], /* COPTIC CAPITAL LETTER DALDA */ + ["\u2C86", "\u2C87"], /* COPTIC SMALL LETTER DALDA */ + ["\u2C88", "\u2C89"], /* COPTIC CAPITAL LETTER EIE */ + ["\u2C88", "\u2C89"], /* COPTIC SMALL LETTER EIE */ + ["\u2C8A", "\u2C8B"], /* COPTIC CAPITAL LETTER SOU */ + ["\u2C8A", "\u2C8B"], /* COPTIC SMALL LETTER SOU */ + ["\u2C8C", "\u2C8D"], /* COPTIC CAPITAL LETTER ZATA */ + ["\u2C8C", "\u2C8D"], /* COPTIC SMALL LETTER ZATA */ + ["\u2C8E", "\u2C8F"], /* COPTIC CAPITAL LETTER HATE */ + ["\u2C8E", "\u2C8F"], /* COPTIC SMALL LETTER HATE */ + ["\u2C90", "\u2C91"], /* COPTIC CAPITAL LETTER THETHE */ + ["\u2C90", "\u2C91"], /* COPTIC SMALL LETTER THETHE */ + ["\u2C92", "\u2C93"], /* COPTIC CAPITAL LETTER IAUDA */ + ["\u2C92", "\u2C93"], /* COPTIC SMALL LETTER IAUDA */ + ["\u2C94", "\u2C95"], /* COPTIC CAPITAL LETTER KAPA */ + ["\u2C94", "\u2C95"], /* COPTIC SMALL LETTER KAPA */ + ["\u2C96", "\u2C97"], /* COPTIC CAPITAL LETTER LAULA */ + ["\u2C96", "\u2C97"], /* COPTIC SMALL LETTER LAULA */ + ["\u2C98", "\u2C99"], /* COPTIC CAPITAL LETTER MI */ + ["\u2C98", "\u2C99"], /* COPTIC SMALL LETTER MI */ + ["\u2C9A", "\u2C9B"], /* COPTIC CAPITAL LETTER NI */ + ["\u2C9A", "\u2C9B"], /* COPTIC SMALL LETTER NI */ + ["\u2C9C", "\u2C9D"], /* COPTIC CAPITAL LETTER KSI */ + ["\u2C9C", "\u2C9D"], /* COPTIC SMALL LETTER KSI */ + ["\u2C9E", "\u2C9F"], /* COPTIC CAPITAL LETTER O */ + ["\u2C9E", "\u2C9F"], /* COPTIC SMALL LETTER O */ + ["\u2CA0", "\u2CA1"], /* COPTIC CAPITAL LETTER PI */ + ["\u2CA0", "\u2CA1"], /* COPTIC SMALL LETTER PI */ + ["\u2CA2", "\u2CA3"], /* COPTIC CAPITAL LETTER RO */ + ["\u2CA2", "\u2CA3"], /* COPTIC SMALL LETTER RO */ + ["\u2CA4", "\u2CA5"], /* COPTIC CAPITAL LETTER SIMA */ + ["\u2CA4", "\u2CA5"], /* COPTIC SMALL LETTER SIMA */ + ["\u2CA6", "\u2CA7"], /* COPTIC CAPITAL LETTER TAU */ + ["\u2CA6", "\u2CA7"], /* COPTIC SMALL LETTER TAU */ + ["\u2CA8", "\u2CA9"], /* COPTIC CAPITAL LETTER UA */ + ["\u2CA8", "\u2CA9"], /* COPTIC SMALL LETTER UA */ + ["\u2CAA", "\u2CAB"], /* COPTIC CAPITAL LETTER FI */ + ["\u2CAA", "\u2CAB"], /* COPTIC SMALL LETTER FI */ + ["\u2CAC", "\u2CAD"], /* COPTIC CAPITAL LETTER KHI */ + ["\u2CAC", "\u2CAD"], /* COPTIC SMALL LETTER KHI */ + ["\u2CAE", "\u2CAF"], /* COPTIC CAPITAL LETTER PSI */ + ["\u2CAE", "\u2CAF"], /* COPTIC SMALL LETTER PSI */ + ["\u2CB0", "\u2CB1"], /* COPTIC CAPITAL LETTER OOU */ + ["\u2CB0", "\u2CB1"], /* COPTIC SMALL LETTER OOU */ + ["\u2CB2", "\u2CB3"], /* COPTIC CAPITAL LETTER DIALECT-P ALEF */ + ["\u2CB2", "\u2CB3"], /* COPTIC SMALL LETTER DIALECT-P ALEF */ + ["\u2CB4", "\u2CB5"], /* COPTIC CAPITAL LETTER OLD COPTIC AIN */ + ["\u2CB4", "\u2CB5"], /* COPTIC SMALL LETTER OLD COPTIC AIN */ + ["\u2CB6", "\u2CB7"], /* COPTIC CAPITAL LETTER CRYPTOGRAMMIC EIE */ + ["\u2CB6", "\u2CB7"], /* COPTIC SMALL LETTER CRYPTOGRAMMIC EIE */ + ["\u2CB8", "\u2CB9"], /* COPTIC CAPITAL LETTER DIALECT-P KAPA */ + ["\u2CB8", "\u2CB9"], /* COPTIC SMALL LETTER DIALECT-P KAPA */ + ["\u2CBA", "\u2CBB"], /* COPTIC CAPITAL LETTER DIALECT-P NI */ + ["\u2CBA", "\u2CBB"], /* COPTIC SMALL LETTER DIALECT-P NI */ + ["\u2CBC", "\u2CBD"], /* COPTIC CAPITAL LETTER CRYPTOGRAMMIC NI */ + ["\u2CBC", "\u2CBD"], /* COPTIC SMALL LETTER CRYPTOGRAMMIC NI */ + ["\u2CBE", "\u2CBF"], /* COPTIC CAPITAL LETTER OLD COPTIC OOU */ + ["\u2CBE", "\u2CBF"], /* COPTIC SMALL LETTER OLD COPTIC OOU */ + ["\u2CC0", "\u2CC1"], /* COPTIC CAPITAL LETTER SAMPI */ + ["\u2CC0", "\u2CC1"], /* COPTIC SMALL LETTER SAMPI */ + ["\u2CC2", "\u2CC3"], /* COPTIC CAPITAL LETTER CROSSED SHEI */ + ["\u2CC2", "\u2CC3"], /* COPTIC SMALL LETTER CROSSED SHEI */ + ["\u2CC4", "\u2CC5"], /* COPTIC CAPITAL LETTER OLD COPTIC SHEI */ + ["\u2CC4", "\u2CC5"], /* COPTIC SMALL LETTER OLD COPTIC SHEI */ + ["\u2CC6", "\u2CC7"], /* COPTIC CAPITAL LETTER OLD COPTIC ESH */ + ["\u2CC6", "\u2CC7"], /* COPTIC SMALL LETTER OLD COPTIC ESH */ + ["\u2CC8", "\u2CC9"], /* COPTIC CAPITAL LETTER AKHMIMIC KHEI */ + ["\u2CC8", "\u2CC9"], /* COPTIC SMALL LETTER AKHMIMIC KHEI */ + ["\u2CCA", "\u2CCB"], /* COPTIC CAPITAL LETTER DIALECT-P HORI */ + ["\u2CCA", "\u2CCB"], /* COPTIC SMALL LETTER DIALECT-P HORI */ + ["\u2CCC", "\u2CCD"], /* COPTIC CAPITAL LETTER OLD COPTIC HORI */ + ["\u2CCC", "\u2CCD"], /* COPTIC SMALL LETTER OLD COPTIC HORI */ + ["\u2CCE", "\u2CCF"], /* COPTIC CAPITAL LETTER OLD COPTIC HA */ + ["\u2CCE", "\u2CCF"], /* COPTIC SMALL LETTER OLD COPTIC HA */ + ["\u2CD0", "\u2CD1"], /* COPTIC CAPITAL LETTER L-SHAPED HA */ + ["\u2CD0", "\u2CD1"], /* COPTIC SMALL LETTER L-SHAPED HA */ + ["\u2CD2", "\u2CD3"], /* COPTIC CAPITAL LETTER OLD COPTIC HEI */ + ["\u2CD2", "\u2CD3"], /* COPTIC SMALL LETTER OLD COPTIC HEI */ + ["\u2CD4", "\u2CD5"], /* COPTIC CAPITAL LETTER OLD COPTIC HAT */ + ["\u2CD4", "\u2CD5"], /* COPTIC SMALL LETTER OLD COPTIC HAT */ + ["\u2CD6", "\u2CD7"], /* COPTIC CAPITAL LETTER OLD COPTIC GANGIA */ + ["\u2CD6", "\u2CD7"], /* COPTIC SMALL LETTER OLD COPTIC GANGIA */ + ["\u2CD8", "\u2CD9"], /* COPTIC CAPITAL LETTER OLD COPTIC DJA */ + ["\u2CD8", "\u2CD9"], /* COPTIC SMALL LETTER OLD COPTIC DJA */ + ["\u2CDA", "\u2CDB"], /* COPTIC CAPITAL LETTER OLD COPTIC SHIMA */ + ["\u2CDA", "\u2CDB"], /* COPTIC SMALL LETTER OLD COPTIC SHIMA */ + ["\u2CDC", "\u2CDD"], /* COPTIC CAPITAL LETTER OLD NUBIAN SHIMA */ + ["\u2CDC", "\u2CDD"], /* COPTIC SMALL LETTER OLD NUBIAN SHIMA */ + ["\u2CDE", "\u2CDF"], /* COPTIC CAPITAL LETTER OLD NUBIAN NGI */ + ["\u2CDE", "\u2CDF"], /* COPTIC SMALL LETTER OLD NUBIAN NGI */ + ["\u2CE0", "\u2CE1"], /* COPTIC CAPITAL LETTER OLD NUBIAN NYI */ + ["\u2CE0", "\u2CE1"], /* COPTIC SMALL LETTER OLD NUBIAN NYI */ + ["\u2CE2", "\u2CE3"], /* COPTIC CAPITAL LETTER OLD NUBIAN WAU */ + ["\u2CE2", "\u2CE3"], /* COPTIC SMALL LETTER OLD NUBIAN WAU */ + ["\u2CE4", "\u2CE4"], /* COPTIC SYMBOL KAI */ + ["\u2CE5", "\u2CE5"], /* COPTIC SYMBOL MI RO */ + ["\u2CE6", "\u2CE6"], /* COPTIC SYMBOL PI RO */ + ["\u2CE7", "\u2CE7"], /* COPTIC SYMBOL STAUROS */ + ["\u2CE8", "\u2CE8"], /* COPTIC SYMBOL TAU RO */ + ["\u2CE9", "\u2CE9"], /* COPTIC SYMBOL KHI RO */ + ["\u2CEA", "\u2CEA"], /* COPTIC SYMBOL SHIMA SIMA */ + ["\u2CEB", "\u2CEC"], /* COPTIC CAPITAL LETTER CRYPTOGRAMMIC SHEI */ + ["\u2CEB", "\u2CEC"], /* COPTIC SMALL LETTER CRYPTOGRAMMIC SHEI */ + ["\u2CED", "\u2CEE"], /* COPTIC CAPITAL LETTER CRYPTOGRAMMIC GANGIA */ + ["\u2CED", "\u2CEE"], /* COPTIC SMALL LETTER CRYPTOGRAMMIC GANGIA */ + ["\u2CEF", "\u2CEF"], /* COPTIC COMBINING NI ABOVE */ + ["\u2CF0", "\u2CF0"], /* COPTIC COMBINING SPIRITUS ASPER */ + ["\u2CF1", "\u2CF1"], /* COPTIC COMBINING SPIRITUS LENIS */ + ["\u2CF2", "\u2CF3"], /* COPTIC CAPITAL LETTER BOHAIRIC KHEI */ + ["\u2CF2", "\u2CF3"], /* COPTIC SMALL LETTER BOHAIRIC KHEI */ + ["\u2CF4", "\u2CF4"], + ["\u2CF5", "\u2CF5"], + ["\u2CF6", "\u2CF6"], + ["\u2CF7", "\u2CF7"], + ["\u2CF8", "\u2CF8"], + ["\u2CF9", "\u2CF9"], /* COPTIC OLD NUBIAN FULL STOP */ + ["\u2CFA", "\u2CFA"], /* COPTIC OLD NUBIAN DIRECT QUESTION MARK */ + ["\u2CFB", "\u2CFB"], /* COPTIC OLD NUBIAN INDIRECT QUESTION MARK */ + ["\u2CFC", "\u2CFC"], /* COPTIC OLD NUBIAN VERSE DIVIDER */ + ["\u2CFD", "\u2CFD"], /* COPTIC FRACTION ONE HALF */ + ["\u2CFE", "\u2CFE"], /* COPTIC FULL STOP */ + ["\u2CFF", "\u2CFF"], /* COPTIC MORPHOLOGICAL DIVIDER */ + ["\u10A0", "\u2D00"], /* GEORGIAN SMALL LETTER AN */ + ["\u10A1", "\u2D01"], /* GEORGIAN SMALL LETTER BAN */ + ["\u10A2", "\u2D02"], /* GEORGIAN SMALL LETTER GAN */ + ["\u10A3", "\u2D03"], /* GEORGIAN SMALL LETTER DON */ + ["\u10A4", "\u2D04"], /* GEORGIAN SMALL LETTER EN */ + ["\u10A5", "\u2D05"], /* GEORGIAN SMALL LETTER VIN */ + ["\u10A6", "\u2D06"], /* GEORGIAN SMALL LETTER ZEN */ + ["\u10A7", "\u2D07"], /* GEORGIAN SMALL LETTER TAN */ + ["\u10A8", "\u2D08"], /* GEORGIAN SMALL LETTER IN */ + ["\u10A9", "\u2D09"], /* GEORGIAN SMALL LETTER KAN */ + ["\u10AA", "\u2D0A"], /* GEORGIAN SMALL LETTER LAS */ + ["\u10AB", "\u2D0B"], /* GEORGIAN SMALL LETTER MAN */ + ["\u10AC", "\u2D0C"], /* GEORGIAN SMALL LETTER NAR */ + ["\u10AD", "\u2D0D"], /* GEORGIAN SMALL LETTER ON */ + ["\u10AE", "\u2D0E"], /* GEORGIAN SMALL LETTER PAR */ + ["\u10AF", "\u2D0F"], /* GEORGIAN SMALL LETTER ZHAR */ + ["\u10B0", "\u2D10"], /* GEORGIAN SMALL LETTER RAE */ + ["\u10B1", "\u2D11"], /* GEORGIAN SMALL LETTER SAN */ + ["\u10B2", "\u2D12"], /* GEORGIAN SMALL LETTER TAR */ + ["\u10B3", "\u2D13"], /* GEORGIAN SMALL LETTER UN */ + ["\u10B4", "\u2D14"], /* GEORGIAN SMALL LETTER PHAR */ + ["\u10B5", "\u2D15"], /* GEORGIAN SMALL LETTER KHAR */ + ["\u10B6", "\u2D16"], /* GEORGIAN SMALL LETTER GHAN */ + ["\u10B7", "\u2D17"], /* GEORGIAN SMALL LETTER QAR */ + ["\u10B8", "\u2D18"], /* GEORGIAN SMALL LETTER SHIN */ + ["\u10B9", "\u2D19"], /* GEORGIAN SMALL LETTER CHIN */ + ["\u10BA", "\u2D1A"], /* GEORGIAN SMALL LETTER CAN */ + ["\u10BB", "\u2D1B"], /* GEORGIAN SMALL LETTER JIL */ + ["\u10BC", "\u2D1C"], /* GEORGIAN SMALL LETTER CIL */ + ["\u10BD", "\u2D1D"], /* GEORGIAN SMALL LETTER CHAR */ + ["\u10BE", "\u2D1E"], /* GEORGIAN SMALL LETTER XAN */ + ["\u10BF", "\u2D1F"], /* GEORGIAN SMALL LETTER JHAN */ + ["\u10C0", "\u2D20"], /* GEORGIAN SMALL LETTER HAE */ + ["\u10C1", "\u2D21"], /* GEORGIAN SMALL LETTER HE */ + ["\u10C2", "\u2D22"], /* GEORGIAN SMALL LETTER HIE */ + ["\u10C3", "\u2D23"], /* GEORGIAN SMALL LETTER WE */ + ["\u10C4", "\u2D24"], /* GEORGIAN SMALL LETTER HAR */ + ["\u10C5", "\u2D25"], /* GEORGIAN SMALL LETTER HOE */ + ["\u2D26", "\u2D26"], + ["\u10C7", "\u2D27"], /* GEORGIAN SMALL LETTER YN */ + ["\u2D28", "\u2D28"], + ["\u2D29", "\u2D29"], + ["\u2D2A", "\u2D2A"], + ["\u2D2B", "\u2D2B"], + ["\u2D2C", "\u2D2C"], + ["\u10CD", "\u2D2D"], /* GEORGIAN SMALL LETTER AEN */ + ["\u2D2E", "\u2D2E"], + ["\u2D2F", "\u2D2F"], + ["\u2D30", "\u2D30"], /* TIFINAGH LETTER YA */ + ["\u2D31", "\u2D31"], /* TIFINAGH LETTER YAB */ + ["\u2D32", "\u2D32"], /* TIFINAGH LETTER YABH */ + ["\u2D33", "\u2D33"], /* TIFINAGH LETTER YAG */ + ["\u2D34", "\u2D34"], /* TIFINAGH LETTER YAGHH */ + ["\u2D35", "\u2D35"], /* TIFINAGH LETTER BERBER ACADEMY YAJ */ + ["\u2D36", "\u2D36"], /* TIFINAGH LETTER YAJ */ + ["\u2D37", "\u2D37"], /* TIFINAGH LETTER YAD */ + ["\u2D38", "\u2D38"], /* TIFINAGH LETTER YADH */ + ["\u2D39", "\u2D39"], /* TIFINAGH LETTER YADD */ + ["\u2D3A", "\u2D3A"], /* TIFINAGH LETTER YADDH */ + ["\u2D3B", "\u2D3B"], /* TIFINAGH LETTER YEY */ + ["\u2D3C", "\u2D3C"], /* TIFINAGH LETTER YAF */ + ["\u2D3D", "\u2D3D"], /* TIFINAGH LETTER YAK */ + ["\u2D3E", "\u2D3E"], /* TIFINAGH LETTER TUAREG YAK */ + ["\u2D3F", "\u2D3F"], /* TIFINAGH LETTER YAKHH */ + ["\u2D40", "\u2D40"], /* TIFINAGH LETTER YAH */ + ["\u2D41", "\u2D41"], /* TIFINAGH LETTER BERBER ACADEMY YAH */ + ["\u2D42", "\u2D42"], /* TIFINAGH LETTER TUAREG YAH */ + ["\u2D43", "\u2D43"], /* TIFINAGH LETTER YAHH */ + ["\u2D44", "\u2D44"], /* TIFINAGH LETTER YAA */ + ["\u2D45", "\u2D45"], /* TIFINAGH LETTER YAKH */ + ["\u2D46", "\u2D46"], /* TIFINAGH LETTER TUAREG YAKH */ + ["\u2D47", "\u2D47"], /* TIFINAGH LETTER YAQ */ + ["\u2D48", "\u2D48"], /* TIFINAGH LETTER TUAREG YAQ */ + ["\u2D49", "\u2D49"], /* TIFINAGH LETTER YI */ + ["\u2D4A", "\u2D4A"], /* TIFINAGH LETTER YAZH */ + ["\u2D4B", "\u2D4B"], /* TIFINAGH LETTER AHAGGAR YAZH */ + ["\u2D4C", "\u2D4C"], /* TIFINAGH LETTER TUAREG YAZH */ + ["\u2D4D", "\u2D4D"], /* TIFINAGH LETTER YAL */ + ["\u2D4E", "\u2D4E"], /* TIFINAGH LETTER YAM */ + ["\u2D4F", "\u2D4F"], /* TIFINAGH LETTER YAN */ + ["\u2D50", "\u2D50"], /* TIFINAGH LETTER TUAREG YAGN */ + ["\u2D51", "\u2D51"], /* TIFINAGH LETTER TUAREG YANG */ + ["\u2D52", "\u2D52"], /* TIFINAGH LETTER YAP */ + ["\u2D53", "\u2D53"], /* TIFINAGH LETTER YU */ + ["\u2D54", "\u2D54"], /* TIFINAGH LETTER YAR */ + ["\u2D55", "\u2D55"], /* TIFINAGH LETTER YARR */ + ["\u2D56", "\u2D56"], /* TIFINAGH LETTER YAGH */ + ["\u2D57", "\u2D57"], /* TIFINAGH LETTER TUAREG YAGH */ + ["\u2D58", "\u2D58"], /* TIFINAGH LETTER AYER YAGH */ + ["\u2D59", "\u2D59"], /* TIFINAGH LETTER YAS */ + ["\u2D5A", "\u2D5A"], /* TIFINAGH LETTER YASS */ + ["\u2D5B", "\u2D5B"], /* TIFINAGH LETTER YASH */ + ["\u2D5C", "\u2D5C"], /* TIFINAGH LETTER YAT */ + ["\u2D5D", "\u2D5D"], /* TIFINAGH LETTER YATH */ + ["\u2D5E", "\u2D5E"], /* TIFINAGH LETTER YACH */ + ["\u2D5F", "\u2D5F"], /* TIFINAGH LETTER YATT */ + ["\u2D60", "\u2D60"], /* TIFINAGH LETTER YAV */ + ["\u2D61", "\u2D61"], /* TIFINAGH LETTER YAW */ + ["\u2D62", "\u2D62"], /* TIFINAGH LETTER YAY */ + ["\u2D63", "\u2D63"], /* TIFINAGH LETTER YAZ */ + ["\u2D64", "\u2D64"], /* TIFINAGH LETTER TAWELLEMET YAZ */ + ["\u2D65", "\u2D65"], /* TIFINAGH LETTER YAZZ */ + ["\u2D66", "\u2D66"], /* TIFINAGH LETTER YE */ + ["\u2D67", "\u2D67"], /* TIFINAGH LETTER YO */ + ["\u2D68", "\u2D68"], + ["\u2D69", "\u2D69"], + ["\u2D6A", "\u2D6A"], + ["\u2D6B", "\u2D6B"], + ["\u2D6C", "\u2D6C"], + ["\u2D6D", "\u2D6D"], + ["\u2D6E", "\u2D6E"], + ["\u2D6F", "\u2D6F"], /* TIFINAGH MODIFIER LETTER LABIALIZATION MARK */ + ["\u2D70", "\u2D70"], /* TIFINAGH SEPARATOR MARK */ + ["\u2D71", "\u2D71"], + ["\u2D72", "\u2D72"], + ["\u2D73", "\u2D73"], + ["\u2D74", "\u2D74"], + ["\u2D75", "\u2D75"], + ["\u2D76", "\u2D76"], + ["\u2D77", "\u2D77"], + ["\u2D78", "\u2D78"], + ["\u2D79", "\u2D79"], + ["\u2D7A", "\u2D7A"], + ["\u2D7B", "\u2D7B"], + ["\u2D7C", "\u2D7C"], + ["\u2D7D", "\u2D7D"], + ["\u2D7E", "\u2D7E"], + ["\u2D7F", "\u2D7F"], /* TIFINAGH CONSONANT JOINER */ + ["\u2D80", "\u2D80"], /* ETHIOPIC SYLLABLE LOA */ + ["\u2D81", "\u2D81"], /* ETHIOPIC SYLLABLE MOA */ + ["\u2D82", "\u2D82"], /* ETHIOPIC SYLLABLE ROA */ + ["\u2D83", "\u2D83"], /* ETHIOPIC SYLLABLE SOA */ + ["\u2D84", "\u2D84"], /* ETHIOPIC SYLLABLE SHOA */ + ["\u2D85", "\u2D85"], /* ETHIOPIC SYLLABLE BOA */ + ["\u2D86", "\u2D86"], /* ETHIOPIC SYLLABLE TOA */ + ["\u2D87", "\u2D87"], /* ETHIOPIC SYLLABLE COA */ + ["\u2D88", "\u2D88"], /* ETHIOPIC SYLLABLE NOA */ + ["\u2D89", "\u2D89"], /* ETHIOPIC SYLLABLE NYOA */ + ["\u2D8A", "\u2D8A"], /* ETHIOPIC SYLLABLE GLOTTAL OA */ + ["\u2D8B", "\u2D8B"], /* ETHIOPIC SYLLABLE ZOA */ + ["\u2D8C", "\u2D8C"], /* ETHIOPIC SYLLABLE DOA */ + ["\u2D8D", "\u2D8D"], /* ETHIOPIC SYLLABLE DDOA */ + ["\u2D8E", "\u2D8E"], /* ETHIOPIC SYLLABLE JOA */ + ["\u2D8F", "\u2D8F"], /* ETHIOPIC SYLLABLE THOA */ + ["\u2D90", "\u2D90"], /* ETHIOPIC SYLLABLE CHOA */ + ["\u2D91", "\u2D91"], /* ETHIOPIC SYLLABLE PHOA */ + ["\u2D92", "\u2D92"], /* ETHIOPIC SYLLABLE POA */ + ["\u2D93", "\u2D93"], /* ETHIOPIC SYLLABLE GGWA */ + ["\u2D94", "\u2D94"], /* ETHIOPIC SYLLABLE GGWI */ + ["\u2D95", "\u2D95"], /* ETHIOPIC SYLLABLE GGWEE */ + ["\u2D96", "\u2D96"], /* ETHIOPIC SYLLABLE GGWE */ + ["\u2D97", "\u2D97"], + ["\u2D98", "\u2D98"], + ["\u2D99", "\u2D99"], + ["\u2D9A", "\u2D9A"], + ["\u2D9B", "\u2D9B"], + ["\u2D9C", "\u2D9C"], + ["\u2D9D", "\u2D9D"], + ["\u2D9E", "\u2D9E"], + ["\u2D9F", "\u2D9F"], + ["\u2DA0", "\u2DA0"], /* ETHIOPIC SYLLABLE SSA */ + ["\u2DA1", "\u2DA1"], /* ETHIOPIC SYLLABLE SSU */ + ["\u2DA2", "\u2DA2"], /* ETHIOPIC SYLLABLE SSI */ + ["\u2DA3", "\u2DA3"], /* ETHIOPIC SYLLABLE SSAA */ + ["\u2DA4", "\u2DA4"], /* ETHIOPIC SYLLABLE SSEE */ + ["\u2DA5", "\u2DA5"], /* ETHIOPIC SYLLABLE SSE */ + ["\u2DA6", "\u2DA6"], /* ETHIOPIC SYLLABLE SSO */ + ["\u2DA7", "\u2DA7"], + ["\u2DA8", "\u2DA8"], /* ETHIOPIC SYLLABLE CCA */ + ["\u2DA9", "\u2DA9"], /* ETHIOPIC SYLLABLE CCU */ + ["\u2DAA", "\u2DAA"], /* ETHIOPIC SYLLABLE CCI */ + ["\u2DAB", "\u2DAB"], /* ETHIOPIC SYLLABLE CCAA */ + ["\u2DAC", "\u2DAC"], /* ETHIOPIC SYLLABLE CCEE */ + ["\u2DAD", "\u2DAD"], /* ETHIOPIC SYLLABLE CCE */ + ["\u2DAE", "\u2DAE"], /* ETHIOPIC SYLLABLE CCO */ + ["\u2DAF", "\u2DAF"], + ["\u2DB0", "\u2DB0"], /* ETHIOPIC SYLLABLE ZZA */ + ["\u2DB1", "\u2DB1"], /* ETHIOPIC SYLLABLE ZZU */ + ["\u2DB2", "\u2DB2"], /* ETHIOPIC SYLLABLE ZZI */ + ["\u2DB3", "\u2DB3"], /* ETHIOPIC SYLLABLE ZZAA */ + ["\u2DB4", "\u2DB4"], /* ETHIOPIC SYLLABLE ZZEE */ + ["\u2DB5", "\u2DB5"], /* ETHIOPIC SYLLABLE ZZE */ + ["\u2DB6", "\u2DB6"], /* ETHIOPIC SYLLABLE ZZO */ + ["\u2DB7", "\u2DB7"], + ["\u2DB8", "\u2DB8"], /* ETHIOPIC SYLLABLE CCHA */ + ["\u2DB9", "\u2DB9"], /* ETHIOPIC SYLLABLE CCHU */ + ["\u2DBA", "\u2DBA"], /* ETHIOPIC SYLLABLE CCHI */ + ["\u2DBB", "\u2DBB"], /* ETHIOPIC SYLLABLE CCHAA */ + ["\u2DBC", "\u2DBC"], /* ETHIOPIC SYLLABLE CCHEE */ + ["\u2DBD", "\u2DBD"], /* ETHIOPIC SYLLABLE CCHE */ + ["\u2DBE", "\u2DBE"], /* ETHIOPIC SYLLABLE CCHO */ + ["\u2DBF", "\u2DBF"], + ["\u2DC0", "\u2DC0"], /* ETHIOPIC SYLLABLE QYA */ + ["\u2DC1", "\u2DC1"], /* ETHIOPIC SYLLABLE QYU */ + ["\u2DC2", "\u2DC2"], /* ETHIOPIC SYLLABLE QYI */ + ["\u2DC3", "\u2DC3"], /* ETHIOPIC SYLLABLE QYAA */ + ["\u2DC4", "\u2DC4"], /* ETHIOPIC SYLLABLE QYEE */ + ["\u2DC5", "\u2DC5"], /* ETHIOPIC SYLLABLE QYE */ + ["\u2DC6", "\u2DC6"], /* ETHIOPIC SYLLABLE QYO */ + ["\u2DC7", "\u2DC7"], + ["\u2DC8", "\u2DC8"], /* ETHIOPIC SYLLABLE KYA */ + ["\u2DC9", "\u2DC9"], /* ETHIOPIC SYLLABLE KYU */ + ["\u2DCA", "\u2DCA"], /* ETHIOPIC SYLLABLE KYI */ + ["\u2DCB", "\u2DCB"], /* ETHIOPIC SYLLABLE KYAA */ + ["\u2DCC", "\u2DCC"], /* ETHIOPIC SYLLABLE KYEE */ + ["\u2DCD", "\u2DCD"], /* ETHIOPIC SYLLABLE KYE */ + ["\u2DCE", "\u2DCE"], /* ETHIOPIC SYLLABLE KYO */ + ["\u2DCF", "\u2DCF"], + ["\u2DD0", "\u2DD0"], /* ETHIOPIC SYLLABLE XYA */ + ["\u2DD1", "\u2DD1"], /* ETHIOPIC SYLLABLE XYU */ + ["\u2DD2", "\u2DD2"], /* ETHIOPIC SYLLABLE XYI */ + ["\u2DD3", "\u2DD3"], /* ETHIOPIC SYLLABLE XYAA */ + ["\u2DD4", "\u2DD4"], /* ETHIOPIC SYLLABLE XYEE */ + ["\u2DD5", "\u2DD5"], /* ETHIOPIC SYLLABLE XYE */ + ["\u2DD6", "\u2DD6"], /* ETHIOPIC SYLLABLE XYO */ + ["\u2DD7", "\u2DD7"], + ["\u2DD8", "\u2DD8"], /* ETHIOPIC SYLLABLE GYA */ + ["\u2DD9", "\u2DD9"], /* ETHIOPIC SYLLABLE GYU */ + ["\u2DDA", "\u2DDA"], /* ETHIOPIC SYLLABLE GYI */ + ["\u2DDB", "\u2DDB"], /* ETHIOPIC SYLLABLE GYAA */ + ["\u2DDC", "\u2DDC"], /* ETHIOPIC SYLLABLE GYEE */ + ["\u2DDD", "\u2DDD"], /* ETHIOPIC SYLLABLE GYE */ + ["\u2DDE", "\u2DDE"], /* ETHIOPIC SYLLABLE GYO */ + ["\u2DDF", "\u2DDF"], + ["\u2DE0", "\u2DE0"], /* COMBINING CYRILLIC LETTER BE */ + ["\u2DE1", "\u2DE1"], /* COMBINING CYRILLIC LETTER VE */ + ["\u2DE2", "\u2DE2"], /* COMBINING CYRILLIC LETTER GHE */ + ["\u2DE3", "\u2DE3"], /* COMBINING CYRILLIC LETTER DE */ + ["\u2DE4", "\u2DE4"], /* COMBINING CYRILLIC LETTER ZHE */ + ["\u2DE5", "\u2DE5"], /* COMBINING CYRILLIC LETTER ZE */ + ["\u2DE6", "\u2DE6"], /* COMBINING CYRILLIC LETTER KA */ + ["\u2DE7", "\u2DE7"], /* COMBINING CYRILLIC LETTER EL */ + ["\u2DE8", "\u2DE8"], /* COMBINING CYRILLIC LETTER EM */ + ["\u2DE9", "\u2DE9"], /* COMBINING CYRILLIC LETTER EN */ + ["\u2DEA", "\u2DEA"], /* COMBINING CYRILLIC LETTER O */ + ["\u2DEB", "\u2DEB"], /* COMBINING CYRILLIC LETTER PE */ + ["\u2DEC", "\u2DEC"], /* COMBINING CYRILLIC LETTER ER */ + ["\u2DED", "\u2DED"], /* COMBINING CYRILLIC LETTER ES */ + ["\u2DEE", "\u2DEE"], /* COMBINING CYRILLIC LETTER TE */ + ["\u2DEF", "\u2DEF"], /* COMBINING CYRILLIC LETTER HA */ + ["\u2DF0", "\u2DF0"], /* COMBINING CYRILLIC LETTER TSE */ + ["\u2DF1", "\u2DF1"], /* COMBINING CYRILLIC LETTER CHE */ + ["\u2DF2", "\u2DF2"], /* COMBINING CYRILLIC LETTER SHA */ + ["\u2DF3", "\u2DF3"], /* COMBINING CYRILLIC LETTER SHCHA */ + ["\u2DF4", "\u2DF4"], /* COMBINING CYRILLIC LETTER FITA */ + ["\u2DF5", "\u2DF5"], /* COMBINING CYRILLIC LETTER ES-TE */ + ["\u2DF6", "\u2DF6"], /* COMBINING CYRILLIC LETTER A */ + ["\u2DF7", "\u2DF7"], /* COMBINING CYRILLIC LETTER IE */ + ["\u2DF8", "\u2DF8"], /* COMBINING CYRILLIC LETTER DJERV */ + ["\u2DF9", "\u2DF9"], /* COMBINING CYRILLIC LETTER MONOGRAPH UK */ + ["\u2DFA", "\u2DFA"], /* COMBINING CYRILLIC LETTER YAT */ + ["\u2DFB", "\u2DFB"], /* COMBINING CYRILLIC LETTER YU */ + ["\u2DFC", "\u2DFC"], /* COMBINING CYRILLIC LETTER IOTIFIED A */ + ["\u2DFD", "\u2DFD"], /* COMBINING CYRILLIC LETTER LITTLE YUS */ + ["\u2DFE", "\u2DFE"], /* COMBINING CYRILLIC LETTER BIG YUS */ + ["\u2DFF", "\u2DFF"], /* COMBINING CYRILLIC LETTER IOTIFIED BIG YUS */ + ["\u2E00", "\u2E00"], /* RIGHT ANGLE SUBSTITUTION MARKER */ + ["\u2E01", "\u2E01"], /* RIGHT ANGLE DOTTED SUBSTITUTION MARKER */ + ["\u2E02", "\u2E02"], /* LEFT SUBSTITUTION BRACKET */ + ["\u2E03", "\u2E03"], /* RIGHT SUBSTITUTION BRACKET */ + ["\u2E04", "\u2E04"], /* LEFT DOTTED SUBSTITUTION BRACKET */ + ["\u2E05", "\u2E05"], /* RIGHT DOTTED SUBSTITUTION BRACKET */ + ["\u2E06", "\u2E06"], /* RAISED INTERPOLATION MARKER */ + ["\u2E07", "\u2E07"], /* RAISED DOTTED INTERPOLATION MARKER */ + ["\u2E08", "\u2E08"], /* DOTTED TRANSPOSITION MARKER */ + ["\u2E09", "\u2E09"], /* LEFT TRANSPOSITION BRACKET */ + ["\u2E0A", "\u2E0A"], /* RIGHT TRANSPOSITION BRACKET */ + ["\u2E0B", "\u2E0B"], /* RAISED SQUARE */ + ["\u2E0C", "\u2E0C"], /* LEFT RAISED OMISSION BRACKET */ + ["\u2E0D", "\u2E0D"], /* RIGHT RAISED OMISSION BRACKET */ + ["\u2E0E", "\u2E0E"], /* EDITORIAL CORONIS */ + ["\u2E0F", "\u2E0F"], /* PARAGRAPHOS */ + ["\u2E10", "\u2E10"], /* FORKED PARAGRAPHOS */ + ["\u2E11", "\u2E11"], /* REVERSED FORKED PARAGRAPHOS */ + ["\u2E12", "\u2E12"], /* HYPODIASTOLE */ + ["\u2E13", "\u2E13"], /* DOTTED OBELOS */ + ["\u2E14", "\u2E14"], /* DOWNWARDS ANCORA */ + ["\u2E15", "\u2E15"], /* UPWARDS ANCORA */ + ["\u2E16", "\u2E16"], /* DOTTED RIGHT-POINTING ANGLE */ + ["\u2E17", "\u2E17"], /* DOUBLE OBLIQUE HYPHEN */ + ["\u2E18", "\u2E18"], /* INVERTED INTERROBANG */ + ["\u2E19", "\u2E19"], /* PALM BRANCH */ + ["\u2E1A", "\u2E1A"], /* HYPHEN WITH DIAERESIS */ + ["\u2E1B", "\u2E1B"], /* TILDE WITH RING ABOVE */ + ["\u2E1C", "\u2E1C"], /* LEFT LOW PARAPHRASE BRACKET */ + ["\u2E1D", "\u2E1D"], /* RIGHT LOW PARAPHRASE BRACKET */ + ["\u2E1E", "\u2E1E"], /* TILDE WITH DOT ABOVE */ + ["\u2E1F", "\u2E1F"], /* TILDE WITH DOT BELOW */ + ["\u2E20", "\u2E20"], /* LEFT VERTICAL BAR WITH QUILL */ + ["\u2E21", "\u2E21"], /* RIGHT VERTICAL BAR WITH QUILL */ + ["\u2E22", "\u2E22"], /* TOP LEFT HALF BRACKET */ + ["\u2E23", "\u2E23"], /* TOP RIGHT HALF BRACKET */ + ["\u2E24", "\u2E24"], /* BOTTOM LEFT HALF BRACKET */ + ["\u2E25", "\u2E25"], /* BOTTOM RIGHT HALF BRACKET */ + ["\u2E26", "\u2E26"], /* LEFT SIDEWAYS U BRACKET */ + ["\u2E27", "\u2E27"], /* RIGHT SIDEWAYS U BRACKET */ + ["\u2E28", "\u2E28"], /* LEFT DOUBLE PARENTHESIS */ + ["\u2E29", "\u2E29"], /* RIGHT DOUBLE PARENTHESIS */ + ["\u2E2A", "\u2E2A"], /* TWO DOTS OVER ONE DOT PUNCTUATION */ + ["\u2E2B", "\u2E2B"], /* ONE DOT OVER TWO DOTS PUNCTUATION */ + ["\u2E2C", "\u2E2C"], /* SQUARED FOUR DOT PUNCTUATION */ + ["\u2E2D", "\u2E2D"], /* FIVE DOT MARK */ + ["\u2E2E", "\u2E2E"], /* REVERSED QUESTION MARK */ + ["\u2E2F", "\u2E2F"], /* VERTICAL TILDE */ + ["\u2E30", "\u2E30"], /* RING POINT */ + ["\u2E31", "\u2E31"], /* WORD SEPARATOR MIDDLE DOT */ + ["\u2E32", "\u2E32"], /* TURNED COMMA */ + ["\u2E33", "\u2E33"], /* RAISED DOT */ + ["\u2E34", "\u2E34"], /* RAISED COMMA */ + ["\u2E35", "\u2E35"], /* TURNED SEMICOLON */ + ["\u2E36", "\u2E36"], /* DAGGER WITH LEFT GUARD */ + ["\u2E37", "\u2E37"], /* DAGGER WITH RIGHT GUARD */ + ["\u2E38", "\u2E38"], /* TURNED DAGGER */ + ["\u2E39", "\u2E39"], /* TOP HALF SECTION SIGN */ + ["\u2E3A", "\u2E3A"], /* TWO-EM DASH */ + ["\u2E3B", "\u2E3B"], /* THREE-EM DASH */ + ["\u2E3C", "\u2E3C"], /* STENOGRAPHIC FULL STOP */ + ["\u2E3D", "\u2E3D"], /* VERTICAL SIX DOTS */ + ["\u2E3E", "\u2E3E"], /* WIGGLY VERTICAL LINE */ + ["\u2E3F", "\u2E3F"], /* CAPITULUM */ + ["\u2E40", "\u2E40"], /* DOUBLE HYPHEN */ + ["\u2E41", "\u2E41"], /* REVERSED COMMA */ + ["\u2E42", "\u2E42"], /* DOUBLE LOW-REVERSED-9 QUOTATION MARK */ + ["\u2E43", "\u2E43"], /* DASH WITH LEFT UPTURN */ + ["\u2E44", "\u2E44"], /* DOUBLE SUSPENSION MARK */ + ["\u2E45", "\u2E45"], /* INVERTED LOW KAVYKA */ + ["\u2E46", "\u2E46"], /* INVERTED LOW KAVYKA WITH KAVYKA ABOVE */ + ["\u2E47", "\u2E47"], /* LOW KAVYKA */ + ["\u2E48", "\u2E48"], /* LOW KAVYKA WITH DOT */ + ["\u2E49", "\u2E49"], /* DOUBLE STACKED COMMA */ + ["\u2E4A", "\u2E4A"], /* DOTTED SOLIDUS */ + ["\u2E4B", "\u2E4B"], /* TRIPLE DAGGER */ + ["\u2E4C", "\u2E4C"], /* MEDIEVAL COMMA */ + ["\u2E4D", "\u2E4D"], /* PARAGRAPHUS MARK */ + ["\u2E4E", "\u2E4E"], /* PUNCTUS ELEVATUS MARK */ + ["\u2E4F", "\u2E4F"], /* CORNISH VERSE DIVIDER */ + ["\u2E50", "\u2E50"], /* CROSS PATTY WITH RIGHT CROSSBAR */ + ["\u2E51", "\u2E51"], /* CROSS PATTY WITH LEFT CROSSBAR */ + ["\u2E52", "\u2E52"], /* TIRONIAN SIGN CAPITAL ET */ + ["\u2E53", "\u2E53"], /* MEDIEVAL EXCLAMATION MARK */ + ["\u2E54", "\u2E54"], /* MEDIEVAL QUESTION MARK */ + ["\u2E55", "\u2E55"], /* LEFT SQUARE BRACKET WITH STROKE */ + ["\u2E56", "\u2E56"], /* RIGHT SQUARE BRACKET WITH STROKE */ + ["\u2E57", "\u2E57"], /* LEFT SQUARE BRACKET WITH DOUBLE STROKE */ + ["\u2E58", "\u2E58"], /* RIGHT SQUARE BRACKET WITH DOUBLE STROKE */ + ["\u2E59", "\u2E59"], /* TOP HALF LEFT PARENTHESIS */ + ["\u2E5A", "\u2E5A"], /* TOP HALF RIGHT PARENTHESIS */ + ["\u2E5B", "\u2E5B"], /* BOTTOM HALF LEFT PARENTHESIS */ + ["\u2E5C", "\u2E5C"], /* BOTTOM HALF RIGHT PARENTHESIS */ + ["\u2E5D", "\u2E5D"], /* OBLIQUE HYPHEN */ + ["\u2E5E", "\u2E5E"], + ["\u2E5F", "\u2E5F"], + ["\u2E60", "\u2E60"], + ["\u2E61", "\u2E61"], + ["\u2E62", "\u2E62"], + ["\u2E63", "\u2E63"], + ["\u2E64", "\u2E64"], + ["\u2E65", "\u2E65"], + ["\u2E66", "\u2E66"], + ["\u2E67", "\u2E67"], + ["\u2E68", "\u2E68"], + ["\u2E69", "\u2E69"], + ["\u2E6A", "\u2E6A"], + ["\u2E6B", "\u2E6B"], + ["\u2E6C", "\u2E6C"], + ["\u2E6D", "\u2E6D"], + ["\u2E6E", "\u2E6E"], + ["\u2E6F", "\u2E6F"], + ["\u2E70", "\u2E70"], + ["\u2E71", "\u2E71"], + ["\u2E72", "\u2E72"], + ["\u2E73", "\u2E73"], + ["\u2E74", "\u2E74"], + ["\u2E75", "\u2E75"], + ["\u2E76", "\u2E76"], + ["\u2E77", "\u2E77"], + ["\u2E78", "\u2E78"], + ["\u2E79", "\u2E79"], + ["\u2E7A", "\u2E7A"], + ["\u2E7B", "\u2E7B"], + ["\u2E7C", "\u2E7C"], + ["\u2E7D", "\u2E7D"], + ["\u2E7E", "\u2E7E"], + ["\u2E7F", "\u2E7F"], + ["\u2E80", "\u2E80"], /* CJK RADICAL REPEAT */ + ["\u2E81", "\u2E81"], /* CJK RADICAL CLIFF */ + ["\u2E82", "\u2E82"], /* CJK RADICAL SECOND ONE */ + ["\u2E83", "\u2E83"], /* CJK RADICAL SECOND TWO */ + ["\u2E84", "\u2E84"], /* CJK RADICAL SECOND THREE */ + ["\u2E85", "\u2E85"], /* CJK RADICAL PERSON */ + ["\u2E86", "\u2E86"], /* CJK RADICAL BOX */ + ["\u2E87", "\u2E87"], /* CJK RADICAL TABLE */ + ["\u2E88", "\u2E88"], /* CJK RADICAL KNIFE ONE */ + ["\u2E89", "\u2E89"], /* CJK RADICAL KNIFE TWO */ + ["\u2E8A", "\u2E8A"], /* CJK RADICAL DIVINATION */ + ["\u2E8B", "\u2E8B"], /* CJK RADICAL SEAL */ + ["\u2E8C", "\u2E8C"], /* CJK RADICAL SMALL ONE */ + ["\u2E8D", "\u2E8D"], /* CJK RADICAL SMALL TWO */ + ["\u2E8E", "\u2E8E"], /* CJK RADICAL LAME ONE */ + ["\u2E8F", "\u2E8F"], /* CJK RADICAL LAME TWO */ + ["\u2E90", "\u2E90"], /* CJK RADICAL LAME THREE */ + ["\u2E91", "\u2E91"], /* CJK RADICAL LAME FOUR */ + ["\u2E92", "\u2E92"], /* CJK RADICAL SNAKE */ + ["\u2E93", "\u2E93"], /* CJK RADICAL THREAD */ + ["\u2E94", "\u2E94"], /* CJK RADICAL SNOUT ONE */ + ["\u2E95", "\u2E95"], /* CJK RADICAL SNOUT TWO */ + ["\u2E96", "\u2E96"], /* CJK RADICAL HEART ONE */ + ["\u2E97", "\u2E97"], /* CJK RADICAL HEART TWO */ + ["\u2E98", "\u2E98"], /* CJK RADICAL HAND */ + ["\u2E99", "\u2E99"], /* CJK RADICAL RAP */ + ["\u2E9A", "\u2E9A"], + ["\u2E9B", "\u2E9B"], /* CJK RADICAL CHOKE */ + ["\u2E9C", "\u2E9C"], /* CJK RADICAL SUN */ + ["\u2E9D", "\u2E9D"], /* CJK RADICAL MOON */ + ["\u2E9E", "\u2E9E"], /* CJK RADICAL DEATH */ + ["\u2E9F", "\u2E9F"], /* CJK RADICAL MOTHER */ + ["\u2EA0", "\u2EA0"], /* CJK RADICAL CIVILIAN */ + ["\u2EA1", "\u2EA1"], /* CJK RADICAL WATER ONE */ + ["\u2EA2", "\u2EA2"], /* CJK RADICAL WATER TWO */ + ["\u2EA3", "\u2EA3"], /* CJK RADICAL FIRE */ + ["\u2EA4", "\u2EA4"], /* CJK RADICAL PAW ONE */ + ["\u2EA5", "\u2EA5"], /* CJK RADICAL PAW TWO */ + ["\u2EA6", "\u2EA6"], /* CJK RADICAL SIMPLIFIED HALF TREE TRUNK */ + ["\u2EA7", "\u2EA7"], /* CJK RADICAL COW */ + ["\u2EA8", "\u2EA8"], /* CJK RADICAL DOG */ + ["\u2EA9", "\u2EA9"], /* CJK RADICAL JADE */ + ["\u2EAA", "\u2EAA"], /* CJK RADICAL BOLT OF CLOTH */ + ["\u2EAB", "\u2EAB"], /* CJK RADICAL EYE */ + ["\u2EAC", "\u2EAC"], /* CJK RADICAL SPIRIT ONE */ + ["\u2EAD", "\u2EAD"], /* CJK RADICAL SPIRIT TWO */ + ["\u2EAE", "\u2EAE"], /* CJK RADICAL BAMBOO */ + ["\u2EAF", "\u2EAF"], /* CJK RADICAL SILK */ + ["\u2EB0", "\u2EB0"], /* CJK RADICAL C-SIMPLIFIED SILK */ + ["\u2EB1", "\u2EB1"], /* CJK RADICAL NET ONE */ + ["\u2EB2", "\u2EB2"], /* CJK RADICAL NET TWO */ + ["\u2EB3", "\u2EB3"], /* CJK RADICAL NET THREE */ + ["\u2EB4", "\u2EB4"], /* CJK RADICAL NET FOUR */ + ["\u2EB5", "\u2EB5"], /* CJK RADICAL MESH */ + ["\u2EB6", "\u2EB6"], /* CJK RADICAL SHEEP */ + ["\u2EB7", "\u2EB7"], /* CJK RADICAL RAM */ + ["\u2EB8", "\u2EB8"], /* CJK RADICAL EWE */ + ["\u2EB9", "\u2EB9"], /* CJK RADICAL OLD */ + ["\u2EBA", "\u2EBA"], /* CJK RADICAL BRUSH ONE */ + ["\u2EBB", "\u2EBB"], /* CJK RADICAL BRUSH TWO */ + ["\u2EBC", "\u2EBC"], /* CJK RADICAL MEAT */ + ["\u2EBD", "\u2EBD"], /* CJK RADICAL MORTAR */ + ["\u2EBE", "\u2EBE"], /* CJK RADICAL GRASS ONE */ + ["\u2EBF", "\u2EBF"], /* CJK RADICAL GRASS TWO */ + ["\u2EC0", "\u2EC0"], /* CJK RADICAL GRASS THREE */ + ["\u2EC1", "\u2EC1"], /* CJK RADICAL TIGER */ + ["\u2EC2", "\u2EC2"], /* CJK RADICAL CLOTHES */ + ["\u2EC3", "\u2EC3"], /* CJK RADICAL WEST ONE */ + ["\u2EC4", "\u2EC4"], /* CJK RADICAL WEST TWO */ + ["\u2EC5", "\u2EC5"], /* CJK RADICAL C-SIMPLIFIED SEE */ + ["\u2EC6", "\u2EC6"], /* CJK RADICAL SIMPLIFIED HORN */ + ["\u2EC7", "\u2EC7"], /* CJK RADICAL HORN */ + ["\u2EC8", "\u2EC8"], /* CJK RADICAL C-SIMPLIFIED SPEECH */ + ["\u2EC9", "\u2EC9"], /* CJK RADICAL C-SIMPLIFIED SHELL */ + ["\u2ECA", "\u2ECA"], /* CJK RADICAL FOOT */ + ["\u2ECB", "\u2ECB"], /* CJK RADICAL C-SIMPLIFIED CART */ + ["\u2ECC", "\u2ECC"], /* CJK RADICAL SIMPLIFIED WALK */ + ["\u2ECD", "\u2ECD"], /* CJK RADICAL WALK ONE */ + ["\u2ECE", "\u2ECE"], /* CJK RADICAL WALK TWO */ + ["\u2ECF", "\u2ECF"], /* CJK RADICAL CITY */ + ["\u2ED0", "\u2ED0"], /* CJK RADICAL C-SIMPLIFIED GOLD */ + ["\u2ED1", "\u2ED1"], /* CJK RADICAL LONG ONE */ + ["\u2ED2", "\u2ED2"], /* CJK RADICAL LONG TWO */ + ["\u2ED3", "\u2ED3"], /* CJK RADICAL C-SIMPLIFIED LONG */ + ["\u2ED4", "\u2ED4"], /* CJK RADICAL C-SIMPLIFIED GATE */ + ["\u2ED5", "\u2ED5"], /* CJK RADICAL MOUND ONE */ + ["\u2ED6", "\u2ED6"], /* CJK RADICAL MOUND TWO */ + ["\u2ED7", "\u2ED7"], /* CJK RADICAL RAIN */ + ["\u2ED8", "\u2ED8"], /* CJK RADICAL BLUE */ + ["\u2ED9", "\u2ED9"], /* CJK RADICAL C-SIMPLIFIED TANNED LEATHER */ + ["\u2EDA", "\u2EDA"], /* CJK RADICAL C-SIMPLIFIED LEAF */ + ["\u2EDB", "\u2EDB"], /* CJK RADICAL C-SIMPLIFIED WIND */ + ["\u2EDC", "\u2EDC"], /* CJK RADICAL C-SIMPLIFIED FLY */ + ["\u2EDD", "\u2EDD"], /* CJK RADICAL EAT ONE */ + ["\u2EDE", "\u2EDE"], /* CJK RADICAL EAT TWO */ + ["\u2EDF", "\u2EDF"], /* CJK RADICAL EAT THREE */ + ["\u2EE0", "\u2EE0"], /* CJK RADICAL C-SIMPLIFIED EAT */ + ["\u2EE1", "\u2EE1"], /* CJK RADICAL HEAD */ + ["\u2EE2", "\u2EE2"], /* CJK RADICAL C-SIMPLIFIED HORSE */ + ["\u2EE3", "\u2EE3"], /* CJK RADICAL BONE */ + ["\u2EE4", "\u2EE4"], /* CJK RADICAL GHOST */ + ["\u2EE5", "\u2EE5"], /* CJK RADICAL C-SIMPLIFIED FISH */ + ["\u2EE6", "\u2EE6"], /* CJK RADICAL C-SIMPLIFIED BIRD */ + ["\u2EE7", "\u2EE7"], /* CJK RADICAL C-SIMPLIFIED SALT */ + ["\u2EE8", "\u2EE8"], /* CJK RADICAL SIMPLIFIED WHEAT */ + ["\u2EE9", "\u2EE9"], /* CJK RADICAL SIMPLIFIED YELLOW */ + ["\u2EEA", "\u2EEA"], /* CJK RADICAL C-SIMPLIFIED FROG */ + ["\u2EEB", "\u2EEB"], /* CJK RADICAL J-SIMPLIFIED EVEN */ + ["\u2EEC", "\u2EEC"], /* CJK RADICAL C-SIMPLIFIED EVEN */ + ["\u2EED", "\u2EED"], /* CJK RADICAL J-SIMPLIFIED TOOTH */ + ["\u2EEE", "\u2EEE"], /* CJK RADICAL C-SIMPLIFIED TOOTH */ + ["\u2EEF", "\u2EEF"], /* CJK RADICAL J-SIMPLIFIED DRAGON */ + ["\u2EF0", "\u2EF0"], /* CJK RADICAL C-SIMPLIFIED DRAGON */ + ["\u2EF1", "\u2EF1"], /* CJK RADICAL TURTLE */ + ["\u2EF2", "\u2EF2"], /* CJK RADICAL J-SIMPLIFIED TURTLE */ + ["\u2EF3", "\u2EF3"], /* CJK RADICAL C-SIMPLIFIED TURTLE */ + ["\u2EF4", "\u2EF4"], + ["\u2EF5", "\u2EF5"], + ["\u2EF6", "\u2EF6"], + ["\u2EF7", "\u2EF7"], + ["\u2EF8", "\u2EF8"], + ["\u2EF9", "\u2EF9"], + ["\u2EFA", "\u2EFA"], + ["\u2EFB", "\u2EFB"], + ["\u2EFC", "\u2EFC"], + ["\u2EFD", "\u2EFD"], + ["\u2EFE", "\u2EFE"], + ["\u2EFF", "\u2EFF"], + ["\u2F00", "\u2F00"], /* KANGXI RADICAL ONE */ + ["\u2F01", "\u2F01"], /* KANGXI RADICAL LINE */ + ["\u2F02", "\u2F02"], /* KANGXI RADICAL DOT */ + ["\u2F03", "\u2F03"], /* KANGXI RADICAL SLASH */ + ["\u2F04", "\u2F04"], /* KANGXI RADICAL SECOND */ + ["\u2F05", "\u2F05"], /* KANGXI RADICAL HOOK */ + ["\u2F06", "\u2F06"], /* KANGXI RADICAL TWO */ + ["\u2F07", "\u2F07"], /* KANGXI RADICAL LID */ + ["\u2F08", "\u2F08"], /* KANGXI RADICAL MAN */ + ["\u2F09", "\u2F09"], /* KANGXI RADICAL LEGS */ + ["\u2F0A", "\u2F0A"], /* KANGXI RADICAL ENTER */ + ["\u2F0B", "\u2F0B"], /* KANGXI RADICAL EIGHT */ + ["\u2F0C", "\u2F0C"], /* KANGXI RADICAL DOWN BOX */ + ["\u2F0D", "\u2F0D"], /* KANGXI RADICAL COVER */ + ["\u2F0E", "\u2F0E"], /* KANGXI RADICAL ICE */ + ["\u2F0F", "\u2F0F"], /* KANGXI RADICAL TABLE */ + ["\u2F10", "\u2F10"], /* KANGXI RADICAL OPEN BOX */ + ["\u2F11", "\u2F11"], /* KANGXI RADICAL KNIFE */ + ["\u2F12", "\u2F12"], /* KANGXI RADICAL POWER */ + ["\u2F13", "\u2F13"], /* KANGXI RADICAL WRAP */ + ["\u2F14", "\u2F14"], /* KANGXI RADICAL SPOON */ + ["\u2F15", "\u2F15"], /* KANGXI RADICAL RIGHT OPEN BOX */ + ["\u2F16", "\u2F16"], /* KANGXI RADICAL HIDING ENCLOSURE */ + ["\u2F17", "\u2F17"], /* KANGXI RADICAL TEN */ + ["\u2F18", "\u2F18"], /* KANGXI RADICAL DIVINATION */ + ["\u2F19", "\u2F19"], /* KANGXI RADICAL SEAL */ + ["\u2F1A", "\u2F1A"], /* KANGXI RADICAL CLIFF */ + ["\u2F1B", "\u2F1B"], /* KANGXI RADICAL PRIVATE */ + ["\u2F1C", "\u2F1C"], /* KANGXI RADICAL AGAIN */ + ["\u2F1D", "\u2F1D"], /* KANGXI RADICAL MOUTH */ + ["\u2F1E", "\u2F1E"], /* KANGXI RADICAL ENCLOSURE */ + ["\u2F1F", "\u2F1F"], /* KANGXI RADICAL EARTH */ + ["\u2F20", "\u2F20"], /* KANGXI RADICAL SCHOLAR */ + ["\u2F21", "\u2F21"], /* KANGXI RADICAL GO */ + ["\u2F22", "\u2F22"], /* KANGXI RADICAL GO SLOWLY */ + ["\u2F23", "\u2F23"], /* KANGXI RADICAL EVENING */ + ["\u2F24", "\u2F24"], /* KANGXI RADICAL BIG */ + ["\u2F25", "\u2F25"], /* KANGXI RADICAL WOMAN */ + ["\u2F26", "\u2F26"], /* KANGXI RADICAL CHILD */ + ["\u2F27", "\u2F27"], /* KANGXI RADICAL ROOF */ + ["\u2F28", "\u2F28"], /* KANGXI RADICAL INCH */ + ["\u2F29", "\u2F29"], /* KANGXI RADICAL SMALL */ + ["\u2F2A", "\u2F2A"], /* KANGXI RADICAL LAME */ + ["\u2F2B", "\u2F2B"], /* KANGXI RADICAL CORPSE */ + ["\u2F2C", "\u2F2C"], /* KANGXI RADICAL SPROUT */ + ["\u2F2D", "\u2F2D"], /* KANGXI RADICAL MOUNTAIN */ + ["\u2F2E", "\u2F2E"], /* KANGXI RADICAL RIVER */ + ["\u2F2F", "\u2F2F"], /* KANGXI RADICAL WORK */ + ["\u2F30", "\u2F30"], /* KANGXI RADICAL ONESELF */ + ["\u2F31", "\u2F31"], /* KANGXI RADICAL TURBAN */ + ["\u2F32", "\u2F32"], /* KANGXI RADICAL DRY */ + ["\u2F33", "\u2F33"], /* KANGXI RADICAL SHORT THREAD */ + ["\u2F34", "\u2F34"], /* KANGXI RADICAL DOTTED CLIFF */ + ["\u2F35", "\u2F35"], /* KANGXI RADICAL LONG STRIDE */ + ["\u2F36", "\u2F36"], /* KANGXI RADICAL TWO HANDS */ + ["\u2F37", "\u2F37"], /* KANGXI RADICAL SHOOT */ + ["\u2F38", "\u2F38"], /* KANGXI RADICAL BOW */ + ["\u2F39", "\u2F39"], /* KANGXI RADICAL SNOUT */ + ["\u2F3A", "\u2F3A"], /* KANGXI RADICAL BRISTLE */ + ["\u2F3B", "\u2F3B"], /* KANGXI RADICAL STEP */ + ["\u2F3C", "\u2F3C"], /* KANGXI RADICAL HEART */ + ["\u2F3D", "\u2F3D"], /* KANGXI RADICAL HALBERD */ + ["\u2F3E", "\u2F3E"], /* KANGXI RADICAL DOOR */ + ["\u2F3F", "\u2F3F"], /* KANGXI RADICAL HAND */ + ["\u2F40", "\u2F40"], /* KANGXI RADICAL BRANCH */ + ["\u2F41", "\u2F41"], /* KANGXI RADICAL RAP */ + ["\u2F42", "\u2F42"], /* KANGXI RADICAL SCRIPT */ + ["\u2F43", "\u2F43"], /* KANGXI RADICAL DIPPER */ + ["\u2F44", "\u2F44"], /* KANGXI RADICAL AXE */ + ["\u2F45", "\u2F45"], /* KANGXI RADICAL SQUARE */ + ["\u2F46", "\u2F46"], /* KANGXI RADICAL NOT */ + ["\u2F47", "\u2F47"], /* KANGXI RADICAL SUN */ + ["\u2F48", "\u2F48"], /* KANGXI RADICAL SAY */ + ["\u2F49", "\u2F49"], /* KANGXI RADICAL MOON */ + ["\u2F4A", "\u2F4A"], /* KANGXI RADICAL TREE */ + ["\u2F4B", "\u2F4B"], /* KANGXI RADICAL LACK */ + ["\u2F4C", "\u2F4C"], /* KANGXI RADICAL STOP */ + ["\u2F4D", "\u2F4D"], /* KANGXI RADICAL DEATH */ + ["\u2F4E", "\u2F4E"], /* KANGXI RADICAL WEAPON */ + ["\u2F4F", "\u2F4F"], /* KANGXI RADICAL DO NOT */ + ["\u2F50", "\u2F50"], /* KANGXI RADICAL COMPARE */ + ["\u2F51", "\u2F51"], /* KANGXI RADICAL FUR */ + ["\u2F52", "\u2F52"], /* KANGXI RADICAL CLAN */ + ["\u2F53", "\u2F53"], /* KANGXI RADICAL STEAM */ + ["\u2F54", "\u2F54"], /* KANGXI RADICAL WATER */ + ["\u2F55", "\u2F55"], /* KANGXI RADICAL FIRE */ + ["\u2F56", "\u2F56"], /* KANGXI RADICAL CLAW */ + ["\u2F57", "\u2F57"], /* KANGXI RADICAL FATHER */ + ["\u2F58", "\u2F58"], /* KANGXI RADICAL DOUBLE X */ + ["\u2F59", "\u2F59"], /* KANGXI RADICAL HALF TREE TRUNK */ + ["\u2F5A", "\u2F5A"], /* KANGXI RADICAL SLICE */ + ["\u2F5B", "\u2F5B"], /* KANGXI RADICAL FANG */ + ["\u2F5C", "\u2F5C"], /* KANGXI RADICAL COW */ + ["\u2F5D", "\u2F5D"], /* KANGXI RADICAL DOG */ + ["\u2F5E", "\u2F5E"], /* KANGXI RADICAL PROFOUND */ + ["\u2F5F", "\u2F5F"], /* KANGXI RADICAL JADE */ + ["\u2F60", "\u2F60"], /* KANGXI RADICAL MELON */ + ["\u2F61", "\u2F61"], /* KANGXI RADICAL TILE */ + ["\u2F62", "\u2F62"], /* KANGXI RADICAL SWEET */ + ["\u2F63", "\u2F63"], /* KANGXI RADICAL LIFE */ + ["\u2F64", "\u2F64"], /* KANGXI RADICAL USE */ + ["\u2F65", "\u2F65"], /* KANGXI RADICAL FIELD */ + ["\u2F66", "\u2F66"], /* KANGXI RADICAL BOLT OF CLOTH */ + ["\u2F67", "\u2F67"], /* KANGXI RADICAL SICKNESS */ + ["\u2F68", "\u2F68"], /* KANGXI RADICAL DOTTED TENT */ + ["\u2F69", "\u2F69"], /* KANGXI RADICAL WHITE */ + ["\u2F6A", "\u2F6A"], /* KANGXI RADICAL SKIN */ + ["\u2F6B", "\u2F6B"], /* KANGXI RADICAL DISH */ + ["\u2F6C", "\u2F6C"], /* KANGXI RADICAL EYE */ + ["\u2F6D", "\u2F6D"], /* KANGXI RADICAL SPEAR */ + ["\u2F6E", "\u2F6E"], /* KANGXI RADICAL ARROW */ + ["\u2F6F", "\u2F6F"], /* KANGXI RADICAL STONE */ + ["\u2F70", "\u2F70"], /* KANGXI RADICAL SPIRIT */ + ["\u2F71", "\u2F71"], /* KANGXI RADICAL TRACK */ + ["\u2F72", "\u2F72"], /* KANGXI RADICAL GRAIN */ + ["\u2F73", "\u2F73"], /* KANGXI RADICAL CAVE */ + ["\u2F74", "\u2F74"], /* KANGXI RADICAL STAND */ + ["\u2F75", "\u2F75"], /* KANGXI RADICAL BAMBOO */ + ["\u2F76", "\u2F76"], /* KANGXI RADICAL RICE */ + ["\u2F77", "\u2F77"], /* KANGXI RADICAL SILK */ + ["\u2F78", "\u2F78"], /* KANGXI RADICAL JAR */ + ["\u2F79", "\u2F79"], /* KANGXI RADICAL NET */ + ["\u2F7A", "\u2F7A"], /* KANGXI RADICAL SHEEP */ + ["\u2F7B", "\u2F7B"], /* KANGXI RADICAL FEATHER */ + ["\u2F7C", "\u2F7C"], /* KANGXI RADICAL OLD */ + ["\u2F7D", "\u2F7D"], /* KANGXI RADICAL AND */ + ["\u2F7E", "\u2F7E"], /* KANGXI RADICAL PLOW */ + ["\u2F7F", "\u2F7F"], /* KANGXI RADICAL EAR */ + ["\u2F80", "\u2F80"], /* KANGXI RADICAL BRUSH */ + ["\u2F81", "\u2F81"], /* KANGXI RADICAL MEAT */ + ["\u2F82", "\u2F82"], /* KANGXI RADICAL MINISTER */ + ["\u2F83", "\u2F83"], /* KANGXI RADICAL SELF */ + ["\u2F84", "\u2F84"], /* KANGXI RADICAL ARRIVE */ + ["\u2F85", "\u2F85"], /* KANGXI RADICAL MORTAR */ + ["\u2F86", "\u2F86"], /* KANGXI RADICAL TONGUE */ + ["\u2F87", "\u2F87"], /* KANGXI RADICAL OPPOSE */ + ["\u2F88", "\u2F88"], /* KANGXI RADICAL BOAT */ + ["\u2F89", "\u2F89"], /* KANGXI RADICAL STOPPING */ + ["\u2F8A", "\u2F8A"], /* KANGXI RADICAL COLOR */ + ["\u2F8B", "\u2F8B"], /* KANGXI RADICAL GRASS */ + ["\u2F8C", "\u2F8C"], /* KANGXI RADICAL TIGER */ + ["\u2F8D", "\u2F8D"], /* KANGXI RADICAL INSECT */ + ["\u2F8E", "\u2F8E"], /* KANGXI RADICAL BLOOD */ + ["\u2F8F", "\u2F8F"], /* KANGXI RADICAL WALK ENCLOSURE */ + ["\u2F90", "\u2F90"], /* KANGXI RADICAL CLOTHES */ + ["\u2F91", "\u2F91"], /* KANGXI RADICAL WEST */ + ["\u2F92", "\u2F92"], /* KANGXI RADICAL SEE */ + ["\u2F93", "\u2F93"], /* KANGXI RADICAL HORN */ + ["\u2F94", "\u2F94"], /* KANGXI RADICAL SPEECH */ + ["\u2F95", "\u2F95"], /* KANGXI RADICAL VALLEY */ + ["\u2F96", "\u2F96"], /* KANGXI RADICAL BEAN */ + ["\u2F97", "\u2F97"], /* KANGXI RADICAL PIG */ + ["\u2F98", "\u2F98"], /* KANGXI RADICAL BADGER */ + ["\u2F99", "\u2F99"], /* KANGXI RADICAL SHELL */ + ["\u2F9A", "\u2F9A"], /* KANGXI RADICAL RED */ + ["\u2F9B", "\u2F9B"], /* KANGXI RADICAL RUN */ + ["\u2F9C", "\u2F9C"], /* KANGXI RADICAL FOOT */ + ["\u2F9D", "\u2F9D"], /* KANGXI RADICAL BODY */ + ["\u2F9E", "\u2F9E"], /* KANGXI RADICAL CART */ + ["\u2F9F", "\u2F9F"], /* KANGXI RADICAL BITTER */ + ["\u2FA0", "\u2FA0"], /* KANGXI RADICAL MORNING */ + ["\u2FA1", "\u2FA1"], /* KANGXI RADICAL WALK */ + ["\u2FA2", "\u2FA2"], /* KANGXI RADICAL CITY */ + ["\u2FA3", "\u2FA3"], /* KANGXI RADICAL WINE */ + ["\u2FA4", "\u2FA4"], /* KANGXI RADICAL DISTINGUISH */ + ["\u2FA5", "\u2FA5"], /* KANGXI RADICAL VILLAGE */ + ["\u2FA6", "\u2FA6"], /* KANGXI RADICAL GOLD */ + ["\u2FA7", "\u2FA7"], /* KANGXI RADICAL LONG */ + ["\u2FA8", "\u2FA8"], /* KANGXI RADICAL GATE */ + ["\u2FA9", "\u2FA9"], /* KANGXI RADICAL MOUND */ + ["\u2FAA", "\u2FAA"], /* KANGXI RADICAL SLAVE */ + ["\u2FAB", "\u2FAB"], /* KANGXI RADICAL SHORT TAILED BIRD */ + ["\u2FAC", "\u2FAC"], /* KANGXI RADICAL RAIN */ + ["\u2FAD", "\u2FAD"], /* KANGXI RADICAL BLUE */ + ["\u2FAE", "\u2FAE"], /* KANGXI RADICAL WRONG */ + ["\u2FAF", "\u2FAF"], /* KANGXI RADICAL FACE */ + ["\u2FB0", "\u2FB0"], /* KANGXI RADICAL LEATHER */ + ["\u2FB1", "\u2FB1"], /* KANGXI RADICAL TANNED LEATHER */ + ["\u2FB2", "\u2FB2"], /* KANGXI RADICAL LEEK */ + ["\u2FB3", "\u2FB3"], /* KANGXI RADICAL SOUND */ + ["\u2FB4", "\u2FB4"], /* KANGXI RADICAL LEAF */ + ["\u2FB5", "\u2FB5"], /* KANGXI RADICAL WIND */ + ["\u2FB6", "\u2FB6"], /* KANGXI RADICAL FLY */ + ["\u2FB7", "\u2FB7"], /* KANGXI RADICAL EAT */ + ["\u2FB8", "\u2FB8"], /* KANGXI RADICAL HEAD */ + ["\u2FB9", "\u2FB9"], /* KANGXI RADICAL FRAGRANT */ + ["\u2FBA", "\u2FBA"], /* KANGXI RADICAL HORSE */ + ["\u2FBB", "\u2FBB"], /* KANGXI RADICAL BONE */ + ["\u2FBC", "\u2FBC"], /* KANGXI RADICAL TALL */ + ["\u2FBD", "\u2FBD"], /* KANGXI RADICAL HAIR */ + ["\u2FBE", "\u2FBE"], /* KANGXI RADICAL FIGHT */ + ["\u2FBF", "\u2FBF"], /* KANGXI RADICAL SACRIFICIAL WINE */ + ["\u2FC0", "\u2FC0"], /* KANGXI RADICAL CAULDRON */ + ["\u2FC1", "\u2FC1"], /* KANGXI RADICAL GHOST */ + ["\u2FC2", "\u2FC2"], /* KANGXI RADICAL FISH */ + ["\u2FC3", "\u2FC3"], /* KANGXI RADICAL BIRD */ + ["\u2FC4", "\u2FC4"], /* KANGXI RADICAL SALT */ + ["\u2FC5", "\u2FC5"], /* KANGXI RADICAL DEER */ + ["\u2FC6", "\u2FC6"], /* KANGXI RADICAL WHEAT */ + ["\u2FC7", "\u2FC7"], /* KANGXI RADICAL HEMP */ + ["\u2FC8", "\u2FC8"], /* KANGXI RADICAL YELLOW */ + ["\u2FC9", "\u2FC9"], /* KANGXI RADICAL MILLET */ + ["\u2FCA", "\u2FCA"], /* KANGXI RADICAL BLACK */ + ["\u2FCB", "\u2FCB"], /* KANGXI RADICAL EMBROIDERY */ + ["\u2FCC", "\u2FCC"], /* KANGXI RADICAL FROG */ + ["\u2FCD", "\u2FCD"], /* KANGXI RADICAL TRIPOD */ + ["\u2FCE", "\u2FCE"], /* KANGXI RADICAL DRUM */ + ["\u2FCF", "\u2FCF"], /* KANGXI RADICAL RAT */ + ["\u2FD0", "\u2FD0"], /* KANGXI RADICAL NOSE */ + ["\u2FD1", "\u2FD1"], /* KANGXI RADICAL EVEN */ + ["\u2FD2", "\u2FD2"], /* KANGXI RADICAL TOOTH */ + ["\u2FD3", "\u2FD3"], /* KANGXI RADICAL DRAGON */ + ["\u2FD4", "\u2FD4"], /* KANGXI RADICAL TURTLE */ + ["\u2FD5", "\u2FD5"], /* KANGXI RADICAL FLUTE */ + ["\u2FD6", "\u2FD6"], + ["\u2FD7", "\u2FD7"], + ["\u2FD8", "\u2FD8"], + ["\u2FD9", "\u2FD9"], + ["\u2FDA", "\u2FDA"], + ["\u2FDB", "\u2FDB"], + ["\u2FDC", "\u2FDC"], + ["\u2FDD", "\u2FDD"], + ["\u2FDE", "\u2FDE"], + ["\u2FDF", "\u2FDF"], + ["\u2FE0", "\u2FE0"], + ["\u2FE1", "\u2FE1"], + ["\u2FE2", "\u2FE2"], + ["\u2FE3", "\u2FE3"], + ["\u2FE4", "\u2FE4"], + ["\u2FE5", "\u2FE5"], + ["\u2FE6", "\u2FE6"], + ["\u2FE7", "\u2FE7"], + ["\u2FE8", "\u2FE8"], + ["\u2FE9", "\u2FE9"], + ["\u2FEA", "\u2FEA"], + ["\u2FEB", "\u2FEB"], + ["\u2FEC", "\u2FEC"], + ["\u2FED", "\u2FED"], + ["\u2FEE", "\u2FEE"], + ["\u2FEF", "\u2FEF"], + ["\u2FF0", "\u2FF0"], /* IDEOGRAPHIC DESCRIPTION CHARACTER LEFT TO RIGHT */ + ["\u2FF1", "\u2FF1"], /* IDEOGRAPHIC DESCRIPTION CHARACTER ABOVE TO BELOW */ + ["\u2FF2", "\u2FF2"], /* IDEOGRAPHIC DESCRIPTION CHARACTER LEFT TO MIDDLE AND RIGHT */ + ["\u2FF3", "\u2FF3"], /* IDEOGRAPHIC DESCRIPTION CHARACTER ABOVE TO MIDDLE AND BELOW */ + ["\u2FF4", "\u2FF4"], /* IDEOGRAPHIC DESCRIPTION CHARACTER FULL SURROUND */ + ["\u2FF5", "\u2FF5"], /* IDEOGRAPHIC DESCRIPTION CHARACTER SURROUND FROM ABOVE */ + ["\u2FF6", "\u2FF6"], /* IDEOGRAPHIC DESCRIPTION CHARACTER SURROUND FROM BELOW */ + ["\u2FF7", "\u2FF7"], /* IDEOGRAPHIC DESCRIPTION CHARACTER SURROUND FROM LEFT */ + ["\u2FF8", "\u2FF8"], /* IDEOGRAPHIC DESCRIPTION CHARACTER SURROUND FROM UPPER LEFT */ + ["\u2FF9", "\u2FF9"], /* IDEOGRAPHIC DESCRIPTION CHARACTER SURROUND FROM UPPER RIGHT */ + ["\u2FFA", "\u2FFA"], /* IDEOGRAPHIC DESCRIPTION CHARACTER SURROUND FROM LOWER LEFT */ + ["\u2FFB", "\u2FFB"], /* IDEOGRAPHIC DESCRIPTION CHARACTER OVERLAID */ + ["\u2FFC", "\u2FFC"], + ["\u2FFD", "\u2FFD"], + ["\u2FFE", "\u2FFE"], + ["\u2FFF", "\u2FFF"], + ["\u3000", "\u3000"], /* IDEOGRAPHIC SPACE */ + ["\u3001", "\u3001"], /* IDEOGRAPHIC COMMA */ + ["\u3002", "\u3002"], /* IDEOGRAPHIC FULL STOP (IDEOGRAPHIC PERIOD) */ + ["\u3003", "\u3003"], /* DITTO MARK */ + ["\u3004", "\u3004"], /* JAPANESE INDUSTRIAL STANDARD SYMBOL */ + ["\u3005", "\u3005"], /* IDEOGRAPHIC ITERATION MARK */ + ["\u3006", "\u3006"], /* IDEOGRAPHIC CLOSING MARK */ + ["\u3007", "\u3007"], /* IDEOGRAPHIC NUMBER ZERO */ + ["\u3008", "\u3008"], /* LEFT ANGLE BRACKET (OPENING ANGLE BRACKET) */ + ["\u3009", "\u3009"], /* RIGHT ANGLE BRACKET (CLOSING ANGLE BRACKET) */ + ["\u300A", "\u300A"], /* LEFT DOUBLE ANGLE BRACKET (OPENING DOUBLE ANGLE BRACKET) */ + ["\u300B", "\u300B"], /* RIGHT DOUBLE ANGLE BRACKET (CLOSING DOUBLE ANGLE BRACKET) */ + ["\u300C", "\u300C"], /* LEFT CORNER BRACKET (OPENING CORNER BRACKET) */ + ["\u300D", "\u300D"], /* RIGHT CORNER BRACKET (CLOSING CORNER BRACKET) */ + ["\u300E", "\u300E"], /* LEFT WHITE CORNER BRACKET (OPENING WHITE CORNER BRACKET) */ + ["\u300F", "\u300F"], /* RIGHT WHITE CORNER BRACKET (CLOSING WHITE CORNER BRACKET) */ + ["\u3010", "\u3010"], /* LEFT BLACK LENTICULAR BRACKET (OPENING BLACK LENTICULAR BRACKET) */ + ["\u3011", "\u3011"], /* RIGHT BLACK LENTICULAR BRACKET (CLOSING BLACK LENTICULAR BRACKET) */ + ["\u3012", "\u3012"], /* POSTAL MARK */ + ["\u3013", "\u3013"], /* GETA MARK */ + ["\u3014", "\u3014"], /* LEFT TORTOISE SHELL BRACKET (OPENING TORTOISE SHELL BRACKET) */ + ["\u3015", "\u3015"], /* RIGHT TORTOISE SHELL BRACKET (CLOSING TORTOISE SHELL BRACKET) */ + ["\u3016", "\u3016"], /* LEFT WHITE LENTICULAR BRACKET (OPENING WHITE LENTICULAR BRACKET) */ + ["\u3017", "\u3017"], /* RIGHT WHITE LENTICULAR BRACKET (CLOSING WHITE LENTICULAR BRACKET) */ + ["\u3018", "\u3018"], /* LEFT WHITE TORTOISE SHELL BRACKET (OPENING WHITE TORTOISE SHELL BRACKET) */ + ["\u3019", "\u3019"], /* RIGHT WHITE TORTOISE SHELL BRACKET (CLOSING WHITE TORTOISE SHELL BRACKET) */ + ["\u301A", "\u301A"], /* LEFT WHITE SQUARE BRACKET (OPENING WHITE SQUARE BRACKET) */ + ["\u301B", "\u301B"], /* RIGHT WHITE SQUARE BRACKET (CLOSING WHITE SQUARE BRACKET) */ + ["\u301C", "\u301C"], /* WAVE DASH */ + ["\u301D", "\u301D"], /* REVERSED DOUBLE PRIME QUOTATION MARK */ + ["\u301E", "\u301E"], /* DOUBLE PRIME QUOTATION MARK */ + ["\u301F", "\u301F"], /* LOW DOUBLE PRIME QUOTATION MARK */ + ["\u3020", "\u3020"], /* POSTAL MARK FACE */ + ["\u3021", "\u3021"], /* HANGZHOU NUMERAL ONE */ + ["\u3022", "\u3022"], /* HANGZHOU NUMERAL TWO */ + ["\u3023", "\u3023"], /* HANGZHOU NUMERAL THREE */ + ["\u3024", "\u3024"], /* HANGZHOU NUMERAL FOUR */ + ["\u3025", "\u3025"], /* HANGZHOU NUMERAL FIVE */ + ["\u3026", "\u3026"], /* HANGZHOU NUMERAL SIX */ + ["\u3027", "\u3027"], /* HANGZHOU NUMERAL SEVEN */ + ["\u3028", "\u3028"], /* HANGZHOU NUMERAL EIGHT */ + ["\u3029", "\u3029"], /* HANGZHOU NUMERAL NINE */ + ["\u302A", "\u302A"], /* IDEOGRAPHIC LEVEL TONE MARK */ + ["\u302B", "\u302B"], /* IDEOGRAPHIC RISING TONE MARK */ + ["\u302C", "\u302C"], /* IDEOGRAPHIC DEPARTING TONE MARK */ + ["\u302D", "\u302D"], /* IDEOGRAPHIC ENTERING TONE MARK */ + ["\u302E", "\u302E"], /* HANGUL SINGLE DOT TONE MARK */ + ["\u302F", "\u302F"], /* HANGUL DOUBLE DOT TONE MARK */ + ["\u3030", "\u3030"], /* WAVY DASH */ + ["\u3031", "\u3031"], /* VERTICAL KANA REPEAT MARK */ + ["\u3032", "\u3032"], /* VERTICAL KANA REPEAT WITH VOICED SOUND MARK */ + ["\u3033", "\u3033"], /* VERTICAL KANA REPEAT MARK UPPER HALF */ + ["\u3034", "\u3034"], /* VERTICAL KANA REPEAT WITH VOICED SOUND MARK UPPER HALF */ + ["\u3035", "\u3035"], /* VERTICAL KANA REPEAT MARK LOWER HALF */ + ["\u3036", "\u3036"], /* CIRCLED POSTAL MARK */ + ["\u3037", "\u3037"], /* IDEOGRAPHIC TELEGRAPH LINE FEED SEPARATOR SYMBOL */ + ["\u3038", "\u3038"], /* HANGZHOU NUMERAL TEN */ + ["\u3039", "\u3039"], /* HANGZHOU NUMERAL TWENTY */ + ["\u303A", "\u303A"], /* HANGZHOU NUMERAL THIRTY */ + ["\u303B", "\u303B"], /* VERTICAL IDEOGRAPHIC ITERATION MARK */ + ["\u303C", "\u303C"], /* MASU MARK */ + ["\u303D", "\u303D"], /* PART ALTERNATION MARK */ + ["\u303E", "\u303E"], /* IDEOGRAPHIC VARIATION INDICATOR */ + ["\u303F", "\u303F"], /* IDEOGRAPHIC HALF FILL SPACE */ + ["\u3040", "\u3040"], + ["\u3041", "\u3041"], /* HIRAGANA LETTER SMALL A */ + ["\u3042", "\u3042"], /* HIRAGANA LETTER A */ + ["\u3043", "\u3043"], /* HIRAGANA LETTER SMALL I */ + ["\u3044", "\u3044"], /* HIRAGANA LETTER I */ + ["\u3045", "\u3045"], /* HIRAGANA LETTER SMALL U */ + ["\u3046", "\u3046"], /* HIRAGANA LETTER U */ + ["\u3047", "\u3047"], /* HIRAGANA LETTER SMALL E */ + ["\u3048", "\u3048"], /* HIRAGANA LETTER E */ + ["\u3049", "\u3049"], /* HIRAGANA LETTER SMALL O */ + ["\u304A", "\u304A"], /* HIRAGANA LETTER O */ + ["\u304B", "\u304B"], /* HIRAGANA LETTER KA */ + ["\u304C", "\u304C"], /* HIRAGANA LETTER GA */ + ["\u304D", "\u304D"], /* HIRAGANA LETTER KI */ + ["\u304E", "\u304E"], /* HIRAGANA LETTER GI */ + ["\u304F", "\u304F"], /* HIRAGANA LETTER KU */ + ["\u3050", "\u3050"], /* HIRAGANA LETTER GU */ + ["\u3051", "\u3051"], /* HIRAGANA LETTER KE */ + ["\u3052", "\u3052"], /* HIRAGANA LETTER GE */ + ["\u3053", "\u3053"], /* HIRAGANA LETTER KO */ + ["\u3054", "\u3054"], /* HIRAGANA LETTER GO */ + ["\u3055", "\u3055"], /* HIRAGANA LETTER SA */ + ["\u3056", "\u3056"], /* HIRAGANA LETTER ZA */ + ["\u3057", "\u3057"], /* HIRAGANA LETTER SI */ + ["\u3058", "\u3058"], /* HIRAGANA LETTER ZI */ + ["\u3059", "\u3059"], /* HIRAGANA LETTER SU */ + ["\u305A", "\u305A"], /* HIRAGANA LETTER ZU */ + ["\u305B", "\u305B"], /* HIRAGANA LETTER SE */ + ["\u305C", "\u305C"], /* HIRAGANA LETTER ZE */ + ["\u305D", "\u305D"], /* HIRAGANA LETTER SO */ + ["\u305E", "\u305E"], /* HIRAGANA LETTER ZO */ + ["\u305F", "\u305F"], /* HIRAGANA LETTER TA */ + ["\u3060", "\u3060"], /* HIRAGANA LETTER DA */ + ["\u3061", "\u3061"], /* HIRAGANA LETTER TI */ + ["\u3062", "\u3062"], /* HIRAGANA LETTER DI */ + ["\u3063", "\u3063"], /* HIRAGANA LETTER SMALL TU */ + ["\u3064", "\u3064"], /* HIRAGANA LETTER TU */ + ["\u3065", "\u3065"], /* HIRAGANA LETTER DU */ + ["\u3066", "\u3066"], /* HIRAGANA LETTER TE */ + ["\u3067", "\u3067"], /* HIRAGANA LETTER DE */ + ["\u3068", "\u3068"], /* HIRAGANA LETTER TO */ + ["\u3069", "\u3069"], /* HIRAGANA LETTER DO */ + ["\u306A", "\u306A"], /* HIRAGANA LETTER NA */ + ["\u306B", "\u306B"], /* HIRAGANA LETTER NI */ + ["\u306C", "\u306C"], /* HIRAGANA LETTER NU */ + ["\u306D", "\u306D"], /* HIRAGANA LETTER NE */ + ["\u306E", "\u306E"], /* HIRAGANA LETTER NO */ + ["\u306F", "\u306F"], /* HIRAGANA LETTER HA */ + ["\u3070", "\u3070"], /* HIRAGANA LETTER BA */ + ["\u3071", "\u3071"], /* HIRAGANA LETTER PA */ + ["\u3072", "\u3072"], /* HIRAGANA LETTER HI */ + ["\u3073", "\u3073"], /* HIRAGANA LETTER BI */ + ["\u3074", "\u3074"], /* HIRAGANA LETTER PI */ + ["\u3075", "\u3075"], /* HIRAGANA LETTER HU */ + ["\u3076", "\u3076"], /* HIRAGANA LETTER BU */ + ["\u3077", "\u3077"], /* HIRAGANA LETTER PU */ + ["\u3078", "\u3078"], /* HIRAGANA LETTER HE */ + ["\u3079", "\u3079"], /* HIRAGANA LETTER BE */ + ["\u307A", "\u307A"], /* HIRAGANA LETTER PE */ + ["\u307B", "\u307B"], /* HIRAGANA LETTER HO */ + ["\u307C", "\u307C"], /* HIRAGANA LETTER BO */ + ["\u307D", "\u307D"], /* HIRAGANA LETTER PO */ + ["\u307E", "\u307E"], /* HIRAGANA LETTER MA */ + ["\u307F", "\u307F"], /* HIRAGANA LETTER MI */ + ["\u3080", "\u3080"], /* HIRAGANA LETTER MU */ + ["\u3081", "\u3081"], /* HIRAGANA LETTER ME */ + ["\u3082", "\u3082"], /* HIRAGANA LETTER MO */ + ["\u3083", "\u3083"], /* HIRAGANA LETTER SMALL YA */ + ["\u3084", "\u3084"], /* HIRAGANA LETTER YA */ + ["\u3085", "\u3085"], /* HIRAGANA LETTER SMALL YU */ + ["\u3086", "\u3086"], /* HIRAGANA LETTER YU */ + ["\u3087", "\u3087"], /* HIRAGANA LETTER SMALL YO */ + ["\u3088", "\u3088"], /* HIRAGANA LETTER YO */ + ["\u3089", "\u3089"], /* HIRAGANA LETTER RA */ + ["\u308A", "\u308A"], /* HIRAGANA LETTER RI */ + ["\u308B", "\u308B"], /* HIRAGANA LETTER RU */ + ["\u308C", "\u308C"], /* HIRAGANA LETTER RE */ + ["\u308D", "\u308D"], /* HIRAGANA LETTER RO */ + ["\u308E", "\u308E"], /* HIRAGANA LETTER SMALL WA */ + ["\u308F", "\u308F"], /* HIRAGANA LETTER WA */ + ["\u3090", "\u3090"], /* HIRAGANA LETTER WI */ + ["\u3091", "\u3091"], /* HIRAGANA LETTER WE */ + ["\u3092", "\u3092"], /* HIRAGANA LETTER WO */ + ["\u3093", "\u3093"], /* HIRAGANA LETTER N */ + ["\u3094", "\u3094"], /* HIRAGANA LETTER VU */ + ["\u3095", "\u3095"], /* HIRAGANA LETTER SMALL KA */ + ["\u3096", "\u3096"], /* HIRAGANA LETTER SMALL KE */ + ["\u3097", "\u3097"], + ["\u3098", "\u3098"], + ["\u3099", "\u3099"], /* COMBINING KATAKANA-HIRAGANA VOICED SOUND MARK (NON-SPACING KATAKANA-HIRAGANA VOICED SOUND MARK) */ + ["\u309A", "\u309A"], /* COMBINING KATAKANA-HIRAGANA SEMI-VOICED SOUND MARK (NON-SPACING KATAKANA-HIRAGANA SEMI-VOICED SOUND MARK) */ + ["\u309B", "\u309B"], /* KATAKANA-HIRAGANA VOICED SOUND MARK */ + ["\u309C", "\u309C"], /* KATAKANA-HIRAGANA SEMI-VOICED SOUND MARK */ + ["\u309D", "\u309D"], /* HIRAGANA ITERATION MARK */ + ["\u309E", "\u309E"], /* HIRAGANA VOICED ITERATION MARK */ + ["\u309F", "\u309F"], /* HIRAGANA DIGRAPH YORI */ + ["\u30A0", "\u30A0"], /* KATAKANA-HIRAGANA DOUBLE HYPHEN */ + ["\u30A1", "\u30A1"], /* KATAKANA LETTER SMALL A */ + ["\u30A2", "\u30A2"], /* KATAKANA LETTER A */ + ["\u30A3", "\u30A3"], /* KATAKANA LETTER SMALL I */ + ["\u30A4", "\u30A4"], /* KATAKANA LETTER I */ + ["\u30A5", "\u30A5"], /* KATAKANA LETTER SMALL U */ + ["\u30A6", "\u30A6"], /* KATAKANA LETTER U */ + ["\u30A7", "\u30A7"], /* KATAKANA LETTER SMALL E */ + ["\u30A8", "\u30A8"], /* KATAKANA LETTER E */ + ["\u30A9", "\u30A9"], /* KATAKANA LETTER SMALL O */ + ["\u30AA", "\u30AA"], /* KATAKANA LETTER O */ + ["\u30AB", "\u30AB"], /* KATAKANA LETTER KA */ + ["\u30AC", "\u30AC"], /* KATAKANA LETTER GA */ + ["\u30AD", "\u30AD"], /* KATAKANA LETTER KI */ + ["\u30AE", "\u30AE"], /* KATAKANA LETTER GI */ + ["\u30AF", "\u30AF"], /* KATAKANA LETTER KU */ + ["\u30B0", "\u30B0"], /* KATAKANA LETTER GU */ + ["\u30B1", "\u30B1"], /* KATAKANA LETTER KE */ + ["\u30B2", "\u30B2"], /* KATAKANA LETTER GE */ + ["\u30B3", "\u30B3"], /* KATAKANA LETTER KO */ + ["\u30B4", "\u30B4"], /* KATAKANA LETTER GO */ + ["\u30B5", "\u30B5"], /* KATAKANA LETTER SA */ + ["\u30B6", "\u30B6"], /* KATAKANA LETTER ZA */ + ["\u30B7", "\u30B7"], /* KATAKANA LETTER SI */ + ["\u30B8", "\u30B8"], /* KATAKANA LETTER ZI */ + ["\u30B9", "\u30B9"], /* KATAKANA LETTER SU */ + ["\u30BA", "\u30BA"], /* KATAKANA LETTER ZU */ + ["\u30BB", "\u30BB"], /* KATAKANA LETTER SE */ + ["\u30BC", "\u30BC"], /* KATAKANA LETTER ZE */ + ["\u30BD", "\u30BD"], /* KATAKANA LETTER SO */ + ["\u30BE", "\u30BE"], /* KATAKANA LETTER ZO */ + ["\u30BF", "\u30BF"], /* KATAKANA LETTER TA */ + ["\u30C0", "\u30C0"], /* KATAKANA LETTER DA */ + ["\u30C1", "\u30C1"], /* KATAKANA LETTER TI */ + ["\u30C2", "\u30C2"], /* KATAKANA LETTER DI */ + ["\u30C3", "\u30C3"], /* KATAKANA LETTER SMALL TU */ + ["\u30C4", "\u30C4"], /* KATAKANA LETTER TU */ + ["\u30C5", "\u30C5"], /* KATAKANA LETTER DU */ + ["\u30C6", "\u30C6"], /* KATAKANA LETTER TE */ + ["\u30C7", "\u30C7"], /* KATAKANA LETTER DE */ + ["\u30C8", "\u30C8"], /* KATAKANA LETTER TO */ + ["\u30C9", "\u30C9"], /* KATAKANA LETTER DO */ + ["\u30CA", "\u30CA"], /* KATAKANA LETTER NA */ + ["\u30CB", "\u30CB"], /* KATAKANA LETTER NI */ + ["\u30CC", "\u30CC"], /* KATAKANA LETTER NU */ + ["\u30CD", "\u30CD"], /* KATAKANA LETTER NE */ + ["\u30CE", "\u30CE"], /* KATAKANA LETTER NO */ + ["\u30CF", "\u30CF"], /* KATAKANA LETTER HA */ + ["\u30D0", "\u30D0"], /* KATAKANA LETTER BA */ + ["\u30D1", "\u30D1"], /* KATAKANA LETTER PA */ + ["\u30D2", "\u30D2"], /* KATAKANA LETTER HI */ + ["\u30D3", "\u30D3"], /* KATAKANA LETTER BI */ + ["\u30D4", "\u30D4"], /* KATAKANA LETTER PI */ + ["\u30D5", "\u30D5"], /* KATAKANA LETTER HU */ + ["\u30D6", "\u30D6"], /* KATAKANA LETTER BU */ + ["\u30D7", "\u30D7"], /* KATAKANA LETTER PU */ + ["\u30D8", "\u30D8"], /* KATAKANA LETTER HE */ + ["\u30D9", "\u30D9"], /* KATAKANA LETTER BE */ + ["\u30DA", "\u30DA"], /* KATAKANA LETTER PE */ + ["\u30DB", "\u30DB"], /* KATAKANA LETTER HO */ + ["\u30DC", "\u30DC"], /* KATAKANA LETTER BO */ + ["\u30DD", "\u30DD"], /* KATAKANA LETTER PO */ + ["\u30DE", "\u30DE"], /* KATAKANA LETTER MA */ + ["\u30DF", "\u30DF"], /* KATAKANA LETTER MI */ + ["\u30E0", "\u30E0"], /* KATAKANA LETTER MU */ + ["\u30E1", "\u30E1"], /* KATAKANA LETTER ME */ + ["\u30E2", "\u30E2"], /* KATAKANA LETTER MO */ + ["\u30E3", "\u30E3"], /* KATAKANA LETTER SMALL YA */ + ["\u30E4", "\u30E4"], /* KATAKANA LETTER YA */ + ["\u30E5", "\u30E5"], /* KATAKANA LETTER SMALL YU */ + ["\u30E6", "\u30E6"], /* KATAKANA LETTER YU */ + ["\u30E7", "\u30E7"], /* KATAKANA LETTER SMALL YO */ + ["\u30E8", "\u30E8"], /* KATAKANA LETTER YO */ + ["\u30E9", "\u30E9"], /* KATAKANA LETTER RA */ + ["\u30EA", "\u30EA"], /* KATAKANA LETTER RI */ + ["\u30EB", "\u30EB"], /* KATAKANA LETTER RU */ + ["\u30EC", "\u30EC"], /* KATAKANA LETTER RE */ + ["\u30ED", "\u30ED"], /* KATAKANA LETTER RO */ + ["\u30EE", "\u30EE"], /* KATAKANA LETTER SMALL WA */ + ["\u30EF", "\u30EF"], /* KATAKANA LETTER WA */ + ["\u30F0", "\u30F0"], /* KATAKANA LETTER WI */ + ["\u30F1", "\u30F1"], /* KATAKANA LETTER WE */ + ["\u30F2", "\u30F2"], /* KATAKANA LETTER WO */ + ["\u30F3", "\u30F3"], /* KATAKANA LETTER N */ + ["\u30F4", "\u30F4"], /* KATAKANA LETTER VU */ + ["\u30F5", "\u30F5"], /* KATAKANA LETTER SMALL KA */ + ["\u30F6", "\u30F6"], /* KATAKANA LETTER SMALL KE */ + ["\u30F7", "\u30F7"], /* KATAKANA LETTER VA */ + ["\u30F8", "\u30F8"], /* KATAKANA LETTER VI */ + ["\u30F9", "\u30F9"], /* KATAKANA LETTER VE */ + ["\u30FA", "\u30FA"], /* KATAKANA LETTER VO */ + ["\u30FB", "\u30FB"], /* KATAKANA MIDDLE DOT */ + ["\u30FC", "\u30FC"], /* KATAKANA-HIRAGANA PROLONGED SOUND MARK */ + ["\u30FD", "\u30FD"], /* KATAKANA ITERATION MARK */ + ["\u30FE", "\u30FE"], /* KATAKANA VOICED ITERATION MARK */ + ["\u30FF", "\u30FF"], /* KATAKANA DIGRAPH KOTO */ + ["\u3100", "\u3100"], + ["\u3101", "\u3101"], + ["\u3102", "\u3102"], + ["\u3103", "\u3103"], + ["\u3104", "\u3104"], + ["\u3105", "\u3105"], /* BOPOMOFO LETTER B */ + ["\u3106", "\u3106"], /* BOPOMOFO LETTER P */ + ["\u3107", "\u3107"], /* BOPOMOFO LETTER M */ + ["\u3108", "\u3108"], /* BOPOMOFO LETTER F */ + ["\u3109", "\u3109"], /* BOPOMOFO LETTER D */ + ["\u310A", "\u310A"], /* BOPOMOFO LETTER T */ + ["\u310B", "\u310B"], /* BOPOMOFO LETTER N */ + ["\u310C", "\u310C"], /* BOPOMOFO LETTER L */ + ["\u310D", "\u310D"], /* BOPOMOFO LETTER G */ + ["\u310E", "\u310E"], /* BOPOMOFO LETTER K */ + ["\u310F", "\u310F"], /* BOPOMOFO LETTER H */ + ["\u3110", "\u3110"], /* BOPOMOFO LETTER J */ + ["\u3111", "\u3111"], /* BOPOMOFO LETTER Q */ + ["\u3112", "\u3112"], /* BOPOMOFO LETTER X */ + ["\u3113", "\u3113"], /* BOPOMOFO LETTER ZH */ + ["\u3114", "\u3114"], /* BOPOMOFO LETTER CH */ + ["\u3115", "\u3115"], /* BOPOMOFO LETTER SH */ + ["\u3116", "\u3116"], /* BOPOMOFO LETTER R */ + ["\u3117", "\u3117"], /* BOPOMOFO LETTER Z */ + ["\u3118", "\u3118"], /* BOPOMOFO LETTER C */ + ["\u3119", "\u3119"], /* BOPOMOFO LETTER S */ + ["\u311A", "\u311A"], /* BOPOMOFO LETTER A */ + ["\u311B", "\u311B"], /* BOPOMOFO LETTER O */ + ["\u311C", "\u311C"], /* BOPOMOFO LETTER E */ + ["\u311D", "\u311D"], /* BOPOMOFO LETTER EH */ + ["\u311E", "\u311E"], /* BOPOMOFO LETTER AI */ + ["\u311F", "\u311F"], /* BOPOMOFO LETTER EI */ + ["\u3120", "\u3120"], /* BOPOMOFO LETTER AU */ + ["\u3121", "\u3121"], /* BOPOMOFO LETTER OU */ + ["\u3122", "\u3122"], /* BOPOMOFO LETTER AN */ + ["\u3123", "\u3123"], /* BOPOMOFO LETTER EN */ + ["\u3124", "\u3124"], /* BOPOMOFO LETTER ANG */ + ["\u3125", "\u3125"], /* BOPOMOFO LETTER ENG */ + ["\u3126", "\u3126"], /* BOPOMOFO LETTER ER */ + ["\u3127", "\u3127"], /* BOPOMOFO LETTER I */ + ["\u3128", "\u3128"], /* BOPOMOFO LETTER U */ + ["\u3129", "\u3129"], /* BOPOMOFO LETTER IU */ + ["\u312A", "\u312A"], /* BOPOMOFO LETTER V */ + ["\u312B", "\u312B"], /* BOPOMOFO LETTER NG */ + ["\u312C", "\u312C"], /* BOPOMOFO LETTER GN */ + ["\u312D", "\u312D"], /* BOPOMOFO LETTER IH */ + ["\u312E", "\u312E"], /* BOPOMOFO LETTER O WITH DOT ABOVE */ + ["\u312F", "\u312F"], /* BOPOMOFO LETTER NN */ + ["\u3130", "\u3130"], + ["\u3131", "\u3131"], /* HANGUL LETTER KIYEOK (HANGUL LETTER GIYEOG) */ + ["\u3132", "\u3132"], /* HANGUL LETTER SSANGKIYEOK (HANGUL LETTER SSANG GIYEOG) */ + ["\u3133", "\u3133"], /* HANGUL LETTER KIYEOK-SIOS (HANGUL LETTER GIYEOG SIOS) */ + ["\u3134", "\u3134"], /* HANGUL LETTER NIEUN */ + ["\u3135", "\u3135"], /* HANGUL LETTER NIEUN-CIEUC (HANGUL LETTER NIEUN JIEUJ) */ + ["\u3136", "\u3136"], /* HANGUL LETTER NIEUN-HIEUH (HANGUL LETTER NIEUN HIEUH) */ + ["\u3137", "\u3137"], /* HANGUL LETTER TIKEUT (HANGUL LETTER DIGEUD) */ + ["\u3138", "\u3138"], /* HANGUL LETTER SSANGTIKEUT (HANGUL LETTER SSANG DIGEUD) */ + ["\u3139", "\u3139"], /* HANGUL LETTER RIEUL (HANGUL LETTER LIEUL) */ + ["\u313A", "\u313A"], /* HANGUL LETTER RIEUL-KIYEOK (HANGUL LETTER LIEUL GIYEOG) */ + ["\u313B", "\u313B"], /* HANGUL LETTER RIEUL-MIEUM (HANGUL LETTER LIEUL MIEUM) */ + ["\u313C", "\u313C"], /* HANGUL LETTER RIEUL-PIEUP (HANGUL LETTER LIEUL BIEUB) */ + ["\u313D", "\u313D"], /* HANGUL LETTER RIEUL-SIOS (HANGUL LETTER LIEUL SIOS) */ + ["\u313E", "\u313E"], /* HANGUL LETTER RIEUL-THIEUTH (HANGUL LETTER LIEUL TIEUT) */ + ["\u313F", "\u313F"], /* HANGUL LETTER RIEUL-PHIEUPH (HANGUL LETTER LIEUL PIEUP) */ + ["\u3140", "\u3140"], /* HANGUL LETTER RIEUL-HIEUH (HANGUL LETTER LIEUL HIEUH) */ + ["\u3141", "\u3141"], /* HANGUL LETTER MIEUM */ + ["\u3142", "\u3142"], /* HANGUL LETTER PIEUP (HANGUL LETTER BIEUB) */ + ["\u3143", "\u3143"], /* HANGUL LETTER SSANGPIEUP (HANGUL LETTER SSANG BIEUB) */ + ["\u3144", "\u3144"], /* HANGUL LETTER PIEUP-SIOS (HANGUL LETTER BIEUB SIOS) */ + ["\u3145", "\u3145"], /* HANGUL LETTER SIOS */ + ["\u3146", "\u3146"], /* HANGUL LETTER SSANGSIOS (HANGUL LETTER SSANG SIOS) */ + ["\u3147", "\u3147"], /* HANGUL LETTER IEUNG */ + ["\u3148", "\u3148"], /* HANGUL LETTER CIEUC (HANGUL LETTER JIEUJ) */ + ["\u3149", "\u3149"], /* HANGUL LETTER SSANGCIEUC (HANGUL LETTER SSANG JIEUJ) */ + ["\u314A", "\u314A"], /* HANGUL LETTER CHIEUCH (HANGUL LETTER CIEUC) */ + ["\u314B", "\u314B"], /* HANGUL LETTER KHIEUKH (HANGUL LETTER KIYEOK) */ + ["\u314C", "\u314C"], /* HANGUL LETTER THIEUTH (HANGUL LETTER TIEUT) */ + ["\u314D", "\u314D"], /* HANGUL LETTER PHIEUPH (HANGUL LETTER PIEUP) */ + ["\u314E", "\u314E"], /* HANGUL LETTER HIEUH */ + ["\u314F", "\u314F"], /* HANGUL LETTER A */ + ["\u3150", "\u3150"], /* HANGUL LETTER AE */ + ["\u3151", "\u3151"], /* HANGUL LETTER YA */ + ["\u3152", "\u3152"], /* HANGUL LETTER YAE */ + ["\u3153", "\u3153"], /* HANGUL LETTER EO */ + ["\u3154", "\u3154"], /* HANGUL LETTER E */ + ["\u3155", "\u3155"], /* HANGUL LETTER YEO */ + ["\u3156", "\u3156"], /* HANGUL LETTER YE */ + ["\u3157", "\u3157"], /* HANGUL LETTER O */ + ["\u3158", "\u3158"], /* HANGUL LETTER WA */ + ["\u3159", "\u3159"], /* HANGUL LETTER WAE */ + ["\u315A", "\u315A"], /* HANGUL LETTER OE */ + ["\u315B", "\u315B"], /* HANGUL LETTER YO */ + ["\u315C", "\u315C"], /* HANGUL LETTER U */ + ["\u315D", "\u315D"], /* HANGUL LETTER WEO */ + ["\u315E", "\u315E"], /* HANGUL LETTER WE */ + ["\u315F", "\u315F"], /* HANGUL LETTER WI */ + ["\u3160", "\u3160"], /* HANGUL LETTER YU */ + ["\u3161", "\u3161"], /* HANGUL LETTER EU */ + ["\u3162", "\u3162"], /* HANGUL LETTER YI */ + ["\u3163", "\u3163"], /* HANGUL LETTER I */ + ["\u3164", "\u3164"], /* HANGUL FILLER (HANGUL CAE OM) */ + ["\u3165", "\u3165"], /* HANGUL LETTER SSANGNIEUN (HANGUL LETTER SSANG NIEUN) */ + ["\u3166", "\u3166"], /* HANGUL LETTER NIEUN-TIKEUT (HANGUL LETTER NIEUN DIGEUD) */ + ["\u3167", "\u3167"], /* HANGUL LETTER NIEUN-SIOS (HANGUL LETTER NIEUN SIOS) */ + ["\u3168", "\u3168"], /* HANGUL LETTER NIEUN-PANSIOS (HANGUL LETTER NIEUN BAN CHI EUM) */ + ["\u3169", "\u3169"], /* HANGUL LETTER RIEUL-KIYEOK-SIOS (HANGUL LETTER LIEUL GIYEOG SIOS) */ + ["\u316A", "\u316A"], /* HANGUL LETTER RIEUL-TIKEUT (HANGUL LETTER LIEUL DIGEUD) */ + ["\u316B", "\u316B"], /* HANGUL LETTER RIEUL-PIEUP-SIOS (HANGUL LETTER LIEUL BIEUB SIOS) */ + ["\u316C", "\u316C"], /* HANGUL LETTER RIEUL-PANSIOS (HANGUL LETTER LIEUL BAN CHI EUM) */ + ["\u316D", "\u316D"], /* HANGUL LETTER RIEUL-YEORINHIEUH (HANGUL LETTER LIEUL YEOLIN HIEUH) */ + ["\u316E", "\u316E"], /* HANGUL LETTER MIEUM-PIEUP (HANGUL LETTER MIEUM BIEUB) */ + ["\u316F", "\u316F"], /* HANGUL LETTER MIEUM-SIOS (HANGUL LETTER MIEUM SIOS) */ + ["\u3170", "\u3170"], /* HANGUL LETTER MIEUM-PANSIOS (HANGUL LETTER BIEUB BAN CHI EUM) */ + ["\u3171", "\u3171"], /* HANGUL LETTER KAPYEOUNMIEUM (HANGUL LETTER MIEUM SUN GYEONG EUM) */ + ["\u3172", "\u3172"], /* HANGUL LETTER PIEUP-KIYEOK (HANGUL LETTER BIEUB GIYEOG) */ + ["\u3173", "\u3173"], /* HANGUL LETTER PIEUP-TIKEUT (HANGUL LETTER BIEUB DIGEUD) */ + ["\u3174", "\u3174"], /* HANGUL LETTER PIEUP-SIOS-KIYEOK (HANGUL LETTER BIEUB SIOS GIYEOG) */ + ["\u3175", "\u3175"], /* HANGUL LETTER PIEUP-SIOS-TIKEUT (HANGUL LETTER BIEUB SIOS DIGEUD) */ + ["\u3176", "\u3176"], /* HANGUL LETTER PIEUP-CIEUC (HANGUL LETTER BIEUB JIEUJ) */ + ["\u3177", "\u3177"], /* HANGUL LETTER PIEUP-THIEUTH (HANGUL LETTER BIEUB TIEUT) */ + ["\u3178", "\u3178"], /* HANGUL LETTER KAPYEOUNPIEUP (HANGUL LETTER BIEUB SUN GYEONG EUM) */ + ["\u3179", "\u3179"], /* HANGUL LETTER KAPYEOUNSSANGPIEUP (HANGUL LETTER SSANG BIEUB SUN GYEONG EUM) */ + ["\u317A", "\u317A"], /* HANGUL LETTER SIOS-KIYEOK (HANGUL LETTER SIOS GIYEOG) */ + ["\u317B", "\u317B"], /* HANGUL LETTER SIOS-NIEUN (HANGUL LETTER SIOS NIEUN) */ + ["\u317C", "\u317C"], /* HANGUL LETTER SIOS-TIKEUT (HANGUL LETTER SIOS DIGEUD) */ + ["\u317D", "\u317D"], /* HANGUL LETTER SIOS-PIEUP (HANGUL LETTER SIOS BIEUB) */ + ["\u317E", "\u317E"], /* HANGUL LETTER SIOS-CIEUC (HANGUL LETTER SIOS JIEUJ) */ + ["\u317F", "\u317F"], /* HANGUL LETTER PANSIOS (HANGUL LETTER BAN CHI EUM) */ + ["\u3180", "\u3180"], /* HANGUL LETTER SSANGIEUNG (HANGUL LETTER SSANG IEUNG) */ + ["\u3181", "\u3181"], /* HANGUL LETTER YESIEUNG (HANGUL LETTER NGIEUNG) */ + ["\u3182", "\u3182"], /* HANGUL LETTER YESIEUNG-SIOS (HANGUL LETTER NGIEUNG SIOS) */ + ["\u3183", "\u3183"], /* HANGUL LETTER YESIEUNG-PANSIOS (HANGUL LETTER NGIEUNG BAN CHI EUM) */ + ["\u3184", "\u3184"], /* HANGUL LETTER KAPYEOUNPHIEUPH (HANGUL LETTER PIEUP SUN GYEONG EUM) */ + ["\u3185", "\u3185"], /* HANGUL LETTER SSANGHIEUH (HANGUL LETTER SSANG HIEUH) */ + ["\u3186", "\u3186"], /* HANGUL LETTER YEORINHIEUH (HANGUL LETTER YEOLIN HIEUH) */ + ["\u3187", "\u3187"], /* HANGUL LETTER YO-YA (HANGUL LETTER YOYA) */ + ["\u3188", "\u3188"], /* HANGUL LETTER YO-YAE (HANGUL LETTER YOYAE) */ + ["\u3189", "\u3189"], /* HANGUL LETTER YO-I (HANGUL LETTER YOI) */ + ["\u318A", "\u318A"], /* HANGUL LETTER YU-YEO (HANGUL LETTER YUYEO) */ + ["\u318B", "\u318B"], /* HANGUL LETTER YU-YE (HANGUL LETTER YUYE) */ + ["\u318C", "\u318C"], /* HANGUL LETTER YU-I (HANGUL LETTER YUI) */ + ["\u318D", "\u318D"], /* HANGUL LETTER ARAEA (HANGUL LETTER ALAE A) */ + ["\u318E", "\u318E"], /* HANGUL LETTER ARAEAE (HANGUL LETTER ALAE AE) */ + ["\u318F", "\u318F"], + ["\u3190", "\u3190"], /* IDEOGRAPHIC ANNOTATION LINKING MARK (KANBUN TATETEN) */ + ["\u3191", "\u3191"], /* IDEOGRAPHIC ANNOTATION REVERSE MARK (KAERITEN RE) */ + ["\u3192", "\u3192"], /* IDEOGRAPHIC ANNOTATION ONE MARK (KAERITEN ITI) */ + ["\u3193", "\u3193"], /* IDEOGRAPHIC ANNOTATION TWO MARK (KAERITEN NI) */ + ["\u3194", "\u3194"], /* IDEOGRAPHIC ANNOTATION THREE MARK (KAERITEN SAN) */ + ["\u3195", "\u3195"], /* IDEOGRAPHIC ANNOTATION FOUR MARK (KAERITEN SI) */ + ["\u3196", "\u3196"], /* IDEOGRAPHIC ANNOTATION TOP MARK (KAERITEN ZYOU) */ + ["\u3197", "\u3197"], /* IDEOGRAPHIC ANNOTATION MIDDLE MARK (KAERITEN TYUU) */ + ["\u3198", "\u3198"], /* IDEOGRAPHIC ANNOTATION BOTTOM MARK (KAERITEN GE) */ + ["\u3199", "\u3199"], /* IDEOGRAPHIC ANNOTATION FIRST MARK (KAERITEN KOU) */ + ["\u319A", "\u319A"], /* IDEOGRAPHIC ANNOTATION SECOND MARK (KAERITEN OTU) */ + ["\u319B", "\u319B"], /* IDEOGRAPHIC ANNOTATION THIRD MARK (KAERITEN HEI) */ + ["\u319C", "\u319C"], /* IDEOGRAPHIC ANNOTATION FOURTH MARK (KAERITEN TEI) */ + ["\u319D", "\u319D"], /* IDEOGRAPHIC ANNOTATION HEAVEN MARK (KAERITEN TEN) */ + ["\u319E", "\u319E"], /* IDEOGRAPHIC ANNOTATION EARTH MARK (KAERITEN TI) */ + ["\u319F", "\u319F"], /* IDEOGRAPHIC ANNOTATION MAN MARK (KAERITEN ZIN) */ + ["\u31A0", "\u31A0"], /* BOPOMOFO LETTER BU */ + ["\u31A1", "\u31A1"], /* BOPOMOFO LETTER ZI */ + ["\u31A2", "\u31A2"], /* BOPOMOFO LETTER JI */ + ["\u31A3", "\u31A3"], /* BOPOMOFO LETTER GU */ + ["\u31A4", "\u31A4"], /* BOPOMOFO LETTER EE */ + ["\u31A5", "\u31A5"], /* BOPOMOFO LETTER ENN */ + ["\u31A6", "\u31A6"], /* BOPOMOFO LETTER OO */ + ["\u31A7", "\u31A7"], /* BOPOMOFO LETTER ONN */ + ["\u31A8", "\u31A8"], /* BOPOMOFO LETTER IR */ + ["\u31A9", "\u31A9"], /* BOPOMOFO LETTER ANN */ + ["\u31AA", "\u31AA"], /* BOPOMOFO LETTER INN */ + ["\u31AB", "\u31AB"], /* BOPOMOFO LETTER UNN */ + ["\u31AC", "\u31AC"], /* BOPOMOFO LETTER IM */ + ["\u31AD", "\u31AD"], /* BOPOMOFO LETTER NGG */ + ["\u31AE", "\u31AE"], /* BOPOMOFO LETTER AINN */ + ["\u31AF", "\u31AF"], /* BOPOMOFO LETTER AUNN */ + ["\u31B0", "\u31B0"], /* BOPOMOFO LETTER AM */ + ["\u31B1", "\u31B1"], /* BOPOMOFO LETTER OM */ + ["\u31B2", "\u31B2"], /* BOPOMOFO LETTER ONG */ + ["\u31B3", "\u31B3"], /* BOPOMOFO LETTER INNN */ + ["\u31B4", "\u31B4"], /* BOPOMOFO FINAL LETTER P */ + ["\u31B5", "\u31B5"], /* BOPOMOFO FINAL LETTER T */ + ["\u31B6", "\u31B6"], /* BOPOMOFO FINAL LETTER K */ + ["\u31B7", "\u31B7"], /* BOPOMOFO FINAL LETTER H */ + ["\u31B8", "\u31B8"], /* BOPOMOFO LETTER GH */ + ["\u31B9", "\u31B9"], /* BOPOMOFO LETTER LH */ + ["\u31BA", "\u31BA"], /* BOPOMOFO LETTER ZY */ + ["\u31BB", "\u31BB"], /* BOPOMOFO FINAL LETTER G */ + ["\u31BC", "\u31BC"], /* BOPOMOFO LETTER GW */ + ["\u31BD", "\u31BD"], /* BOPOMOFO LETTER KW */ + ["\u31BE", "\u31BE"], /* BOPOMOFO LETTER OE */ + ["\u31BF", "\u31BF"], /* BOPOMOFO LETTER AH */ + ["\u31C0", "\u31C0"], /* CJK STROKE T */ + ["\u31C1", "\u31C1"], /* CJK STROKE WG */ + ["\u31C2", "\u31C2"], /* CJK STROKE XG */ + ["\u31C3", "\u31C3"], /* CJK STROKE BXG */ + ["\u31C4", "\u31C4"], /* CJK STROKE SW */ + ["\u31C5", "\u31C5"], /* CJK STROKE HZZ */ + ["\u31C6", "\u31C6"], /* CJK STROKE HZG */ + ["\u31C7", "\u31C7"], /* CJK STROKE HP */ + ["\u31C8", "\u31C8"], /* CJK STROKE HZWG */ + ["\u31C9", "\u31C9"], /* CJK STROKE SZWG */ + ["\u31CA", "\u31CA"], /* CJK STROKE HZT */ + ["\u31CB", "\u31CB"], /* CJK STROKE HZZP */ + ["\u31CC", "\u31CC"], /* CJK STROKE HPWG */ + ["\u31CD", "\u31CD"], /* CJK STROKE HZW */ + ["\u31CE", "\u31CE"], /* CJK STROKE HZZZ */ + ["\u31CF", "\u31CF"], /* CJK STROKE N */ + ["\u31D0", "\u31D0"], /* CJK STROKE H */ + ["\u31D1", "\u31D1"], /* CJK STROKE S */ + ["\u31D2", "\u31D2"], /* CJK STROKE P */ + ["\u31D3", "\u31D3"], /* CJK STROKE SP */ + ["\u31D4", "\u31D4"], /* CJK STROKE D */ + ["\u31D5", "\u31D5"], /* CJK STROKE HZ */ + ["\u31D6", "\u31D6"], /* CJK STROKE HG */ + ["\u31D7", "\u31D7"], /* CJK STROKE SZ */ + ["\u31D8", "\u31D8"], /* CJK STROKE SWZ */ + ["\u31D9", "\u31D9"], /* CJK STROKE ST */ + ["\u31DA", "\u31DA"], /* CJK STROKE SG */ + ["\u31DB", "\u31DB"], /* CJK STROKE PD */ + ["\u31DC", "\u31DC"], /* CJK STROKE PZ */ + ["\u31DD", "\u31DD"], /* CJK STROKE TN */ + ["\u31DE", "\u31DE"], /* CJK STROKE SZZ */ + ["\u31DF", "\u31DF"], /* CJK STROKE SWG */ + ["\u31E0", "\u31E0"], /* CJK STROKE HXWG */ + ["\u31E1", "\u31E1"], /* CJK STROKE HZZZG */ + ["\u31E2", "\u31E2"], /* CJK STROKE PG */ + ["\u31E3", "\u31E3"], /* CJK STROKE Q */ + ["\u31E4", "\u31E4"], + ["\u31E5", "\u31E5"], + ["\u31E6", "\u31E6"], + ["\u31E7", "\u31E7"], + ["\u31E8", "\u31E8"], + ["\u31E9", "\u31E9"], + ["\u31EA", "\u31EA"], + ["\u31EB", "\u31EB"], + ["\u31EC", "\u31EC"], + ["\u31ED", "\u31ED"], + ["\u31EE", "\u31EE"], + ["\u31EF", "\u31EF"], + ["\u31F0", "\u31F0"], /* KATAKANA LETTER SMALL KU */ + ["\u31F1", "\u31F1"], /* KATAKANA LETTER SMALL SI */ + ["\u31F2", "\u31F2"], /* KATAKANA LETTER SMALL SU */ + ["\u31F3", "\u31F3"], /* KATAKANA LETTER SMALL TO */ + ["\u31F4", "\u31F4"], /* KATAKANA LETTER SMALL NU */ + ["\u31F5", "\u31F5"], /* KATAKANA LETTER SMALL HA */ + ["\u31F6", "\u31F6"], /* KATAKANA LETTER SMALL HI */ + ["\u31F7", "\u31F7"], /* KATAKANA LETTER SMALL HU */ + ["\u31F8", "\u31F8"], /* KATAKANA LETTER SMALL HE */ + ["\u31F9", "\u31F9"], /* KATAKANA LETTER SMALL HO */ + ["\u31FA", "\u31FA"], /* KATAKANA LETTER SMALL MU */ + ["\u31FB", "\u31FB"], /* KATAKANA LETTER SMALL RA */ + ["\u31FC", "\u31FC"], /* KATAKANA LETTER SMALL RI */ + ["\u31FD", "\u31FD"], /* KATAKANA LETTER SMALL RU */ + ["\u31FE", "\u31FE"], /* KATAKANA LETTER SMALL RE */ + ["\u31FF", "\u31FF"], /* KATAKANA LETTER SMALL RO */ + ["\u3200", "\u3200"], /* PARENTHESIZED HANGUL KIYEOK (PARENTHESIZED HANGUL GIYEOG) */ + ["\u3201", "\u3201"], /* PARENTHESIZED HANGUL NIEUN */ + ["\u3202", "\u3202"], /* PARENTHESIZED HANGUL TIKEUT (PARENTHESIZED HANGUL DIGEUD) */ + ["\u3203", "\u3203"], /* PARENTHESIZED HANGUL RIEUL (PARENTHESIZED HANGUL LIEUL) */ + ["\u3204", "\u3204"], /* PARENTHESIZED HANGUL MIEUM */ + ["\u3205", "\u3205"], /* PARENTHESIZED HANGUL PIEUP (PARENTHESIZED HANGUL BIEUB) */ + ["\u3206", "\u3206"], /* PARENTHESIZED HANGUL SIOS */ + ["\u3207", "\u3207"], /* PARENTHESIZED HANGUL IEUNG */ + ["\u3208", "\u3208"], /* PARENTHESIZED HANGUL CIEUC (PARENTHESIZED HANGUL JIEUJ) */ + ["\u3209", "\u3209"], /* PARENTHESIZED HANGUL CHIEUCH (PARENTHESIZED HANGUL CIEUC) */ + ["\u320A", "\u320A"], /* PARENTHESIZED HANGUL KHIEUKH (PARENTHESIZED HANGUL KIYEOK) */ + ["\u320B", "\u320B"], /* PARENTHESIZED HANGUL THIEUTH (PARENTHESIZED HANGUL TIEUT) */ + ["\u320C", "\u320C"], /* PARENTHESIZED HANGUL PHIEUPH (PARENTHESIZED HANGUL PIEUP) */ + ["\u320D", "\u320D"], /* PARENTHESIZED HANGUL HIEUH */ + ["\u320E", "\u320E"], /* PARENTHESIZED HANGUL KIYEOK A (PARENTHESIZED HANGUL GA) */ + ["\u320F", "\u320F"], /* PARENTHESIZED HANGUL NIEUN A (PARENTHESIZED HANGUL NA) */ + ["\u3210", "\u3210"], /* PARENTHESIZED HANGUL TIKEUT A (PARENTHESIZED HANGUL DA) */ + ["\u3211", "\u3211"], /* PARENTHESIZED HANGUL RIEUL A (PARENTHESIZED HANGUL LA) */ + ["\u3212", "\u3212"], /* PARENTHESIZED HANGUL MIEUM A (PARENTHESIZED HANGUL MA) */ + ["\u3213", "\u3213"], /* PARENTHESIZED HANGUL PIEUP A (PARENTHESIZED HANGUL BA) */ + ["\u3214", "\u3214"], /* PARENTHESIZED HANGUL SIOS A (PARENTHESIZED HANGUL SA) */ + ["\u3215", "\u3215"], /* PARENTHESIZED HANGUL IEUNG A (PARENTHESIZED HANGUL A) */ + ["\u3216", "\u3216"], /* PARENTHESIZED HANGUL CIEUC A (PARENTHESIZED HANGUL JA) */ + ["\u3217", "\u3217"], /* PARENTHESIZED HANGUL CHIEUCH A (PARENTHESIZED HANGUL CA) */ + ["\u3218", "\u3218"], /* PARENTHESIZED HANGUL KHIEUKH A (PARENTHESIZED HANGUL KA) */ + ["\u3219", "\u3219"], /* PARENTHESIZED HANGUL THIEUTH A (PARENTHESIZED HANGUL TA) */ + ["\u321A", "\u321A"], /* PARENTHESIZED HANGUL PHIEUPH A (PARENTHESIZED HANGUL PA) */ + ["\u321B", "\u321B"], /* PARENTHESIZED HANGUL HIEUH A (PARENTHESIZED HANGUL HA) */ + ["\u321C", "\u321C"], /* PARENTHESIZED HANGUL CIEUC U (PARENTHESIZED HANGUL JU) */ + ["\u321D", "\u321D"], /* PARENTHESIZED KOREAN CHARACTER OJEON */ + ["\u321E", "\u321E"], /* PARENTHESIZED KOREAN CHARACTER O HU */ + ["\u321F", "\u321F"], + ["\u3220", "\u3220"], /* PARENTHESIZED IDEOGRAPH ONE */ + ["\u3221", "\u3221"], /* PARENTHESIZED IDEOGRAPH TWO */ + ["\u3222", "\u3222"], /* PARENTHESIZED IDEOGRAPH THREE */ + ["\u3223", "\u3223"], /* PARENTHESIZED IDEOGRAPH FOUR */ + ["\u3224", "\u3224"], /* PARENTHESIZED IDEOGRAPH FIVE */ + ["\u3225", "\u3225"], /* PARENTHESIZED IDEOGRAPH SIX */ + ["\u3226", "\u3226"], /* PARENTHESIZED IDEOGRAPH SEVEN */ + ["\u3227", "\u3227"], /* PARENTHESIZED IDEOGRAPH EIGHT */ + ["\u3228", "\u3228"], /* PARENTHESIZED IDEOGRAPH NINE */ + ["\u3229", "\u3229"], /* PARENTHESIZED IDEOGRAPH TEN */ + ["\u322A", "\u322A"], /* PARENTHESIZED IDEOGRAPH MOON */ + ["\u322B", "\u322B"], /* PARENTHESIZED IDEOGRAPH FIRE */ + ["\u322C", "\u322C"], /* PARENTHESIZED IDEOGRAPH WATER */ + ["\u322D", "\u322D"], /* PARENTHESIZED IDEOGRAPH WOOD */ + ["\u322E", "\u322E"], /* PARENTHESIZED IDEOGRAPH METAL */ + ["\u322F", "\u322F"], /* PARENTHESIZED IDEOGRAPH EARTH */ + ["\u3230", "\u3230"], /* PARENTHESIZED IDEOGRAPH SUN */ + ["\u3231", "\u3231"], /* PARENTHESIZED IDEOGRAPH STOCK */ + ["\u3232", "\u3232"], /* PARENTHESIZED IDEOGRAPH HAVE */ + ["\u3233", "\u3233"], /* PARENTHESIZED IDEOGRAPH SOCIETY */ + ["\u3234", "\u3234"], /* PARENTHESIZED IDEOGRAPH NAME */ + ["\u3235", "\u3235"], /* PARENTHESIZED IDEOGRAPH SPECIAL */ + ["\u3236", "\u3236"], /* PARENTHESIZED IDEOGRAPH FINANCIAL */ + ["\u3237", "\u3237"], /* PARENTHESIZED IDEOGRAPH CONGRATULATION */ + ["\u3238", "\u3238"], /* PARENTHESIZED IDEOGRAPH LABOR */ + ["\u3239", "\u3239"], /* PARENTHESIZED IDEOGRAPH REPRESENT */ + ["\u323A", "\u323A"], /* PARENTHESIZED IDEOGRAPH CALL */ + ["\u323B", "\u323B"], /* PARENTHESIZED IDEOGRAPH STUDY */ + ["\u323C", "\u323C"], /* PARENTHESIZED IDEOGRAPH SUPERVISE */ + ["\u323D", "\u323D"], /* PARENTHESIZED IDEOGRAPH ENTERPRISE */ + ["\u323E", "\u323E"], /* PARENTHESIZED IDEOGRAPH RESOURCE */ + ["\u323F", "\u323F"], /* PARENTHESIZED IDEOGRAPH ALLIANCE */ + ["\u3240", "\u3240"], /* PARENTHESIZED IDEOGRAPH FESTIVAL */ + ["\u3241", "\u3241"], /* PARENTHESIZED IDEOGRAPH REST */ + ["\u3242", "\u3242"], /* PARENTHESIZED IDEOGRAPH SELF */ + ["\u3243", "\u3243"], /* PARENTHESIZED IDEOGRAPH REACH */ + ["\u3244", "\u3244"], /* CIRCLED IDEOGRAPH QUESTION */ + ["\u3245", "\u3245"], /* CIRCLED IDEOGRAPH KINDERGARTEN */ + ["\u3246", "\u3246"], /* CIRCLED IDEOGRAPH SCHOOL */ + ["\u3247", "\u3247"], /* CIRCLED IDEOGRAPH KOTO */ + ["\u3248", "\u3248"], /* CIRCLED NUMBER TEN ON BLACK SQUARE */ + ["\u3249", "\u3249"], /* CIRCLED NUMBER TWENTY ON BLACK SQUARE */ + ["\u324A", "\u324A"], /* CIRCLED NUMBER THIRTY ON BLACK SQUARE */ + ["\u324B", "\u324B"], /* CIRCLED NUMBER FORTY ON BLACK SQUARE */ + ["\u324C", "\u324C"], /* CIRCLED NUMBER FIFTY ON BLACK SQUARE */ + ["\u324D", "\u324D"], /* CIRCLED NUMBER SIXTY ON BLACK SQUARE */ + ["\u324E", "\u324E"], /* CIRCLED NUMBER SEVENTY ON BLACK SQUARE */ + ["\u324F", "\u324F"], /* CIRCLED NUMBER EIGHTY ON BLACK SQUARE */ + ["\u3250", "\u3250"], /* PARTNERSHIP SIGN */ + ["\u3251", "\u3251"], /* CIRCLED NUMBER TWENTY ONE */ + ["\u3252", "\u3252"], /* CIRCLED NUMBER TWENTY TWO */ + ["\u3253", "\u3253"], /* CIRCLED NUMBER TWENTY THREE */ + ["\u3254", "\u3254"], /* CIRCLED NUMBER TWENTY FOUR */ + ["\u3255", "\u3255"], /* CIRCLED NUMBER TWENTY FIVE */ + ["\u3256", "\u3256"], /* CIRCLED NUMBER TWENTY SIX */ + ["\u3257", "\u3257"], /* CIRCLED NUMBER TWENTY SEVEN */ + ["\u3258", "\u3258"], /* CIRCLED NUMBER TWENTY EIGHT */ + ["\u3259", "\u3259"], /* CIRCLED NUMBER TWENTY NINE */ + ["\u325A", "\u325A"], /* CIRCLED NUMBER THIRTY */ + ["\u325B", "\u325B"], /* CIRCLED NUMBER THIRTY ONE */ + ["\u325C", "\u325C"], /* CIRCLED NUMBER THIRTY TWO */ + ["\u325D", "\u325D"], /* CIRCLED NUMBER THIRTY THREE */ + ["\u325E", "\u325E"], /* CIRCLED NUMBER THIRTY FOUR */ + ["\u325F", "\u325F"], /* CIRCLED NUMBER THIRTY FIVE */ + ["\u3260", "\u3260"], /* CIRCLED HANGUL KIYEOK (CIRCLED HANGUL GIYEOG) */ + ["\u3261", "\u3261"], /* CIRCLED HANGUL NIEUN */ + ["\u3262", "\u3262"], /* CIRCLED HANGUL TIKEUT (CIRCLED HANGUL DIGEUD) */ + ["\u3263", "\u3263"], /* CIRCLED HANGUL RIEUL (CIRCLED HANGUL LIEUL) */ + ["\u3264", "\u3264"], /* CIRCLED HANGUL MIEUM */ + ["\u3265", "\u3265"], /* CIRCLED HANGUL PIEUP (CIRCLED HANGUL BIEUB) */ + ["\u3266", "\u3266"], /* CIRCLED HANGUL SIOS */ + ["\u3267", "\u3267"], /* CIRCLED HANGUL IEUNG */ + ["\u3268", "\u3268"], /* CIRCLED HANGUL CIEUC (CIRCLED HANGUL JIEUJ) */ + ["\u3269", "\u3269"], /* CIRCLED HANGUL CHIEUCH (CIRCLED HANGUL CIEUC) */ + ["\u326A", "\u326A"], /* CIRCLED HANGUL KHIEUKH (CIRCLED HANGUL KIYEOK) */ + ["\u326B", "\u326B"], /* CIRCLED HANGUL THIEUTH (CIRCLED HANGUL TIEUT) */ + ["\u326C", "\u326C"], /* CIRCLED HANGUL PHIEUPH (CIRCLED HANGUL PIEUP) */ + ["\u326D", "\u326D"], /* CIRCLED HANGUL HIEUH */ + ["\u326E", "\u326E"], /* CIRCLED HANGUL KIYEOK A (CIRCLED HANGUL GA) */ + ["\u326F", "\u326F"], /* CIRCLED HANGUL NIEUN A (CIRCLED HANGUL NA) */ + ["\u3270", "\u3270"], /* CIRCLED HANGUL TIKEUT A (CIRCLED HANGUL DA) */ + ["\u3271", "\u3271"], /* CIRCLED HANGUL RIEUL A (CIRCLED HANGUL LA) */ + ["\u3272", "\u3272"], /* CIRCLED HANGUL MIEUM A (CIRCLED HANGUL MA) */ + ["\u3273", "\u3273"], /* CIRCLED HANGUL PIEUP A (CIRCLED HANGUL BA) */ + ["\u3274", "\u3274"], /* CIRCLED HANGUL SIOS A (CIRCLED HANGUL SA) */ + ["\u3275", "\u3275"], /* CIRCLED HANGUL IEUNG A (CIRCLED HANGUL A) */ + ["\u3276", "\u3276"], /* CIRCLED HANGUL CIEUC A (CIRCLED HANGUL JA) */ + ["\u3277", "\u3277"], /* CIRCLED HANGUL CHIEUCH A (CIRCLED HANGUL CA) */ + ["\u3278", "\u3278"], /* CIRCLED HANGUL KHIEUKH A (CIRCLED HANGUL KA) */ + ["\u3279", "\u3279"], /* CIRCLED HANGUL THIEUTH A (CIRCLED HANGUL TA) */ + ["\u327A", "\u327A"], /* CIRCLED HANGUL PHIEUPH A (CIRCLED HANGUL PA) */ + ["\u327B", "\u327B"], /* CIRCLED HANGUL HIEUH A (CIRCLED HANGUL HA) */ + ["\u327C", "\u327C"], /* CIRCLED KOREAN CHARACTER CHAMKO */ + ["\u327D", "\u327D"], /* CIRCLED KOREAN CHARACTER JUEUI */ + ["\u327E", "\u327E"], /* CIRCLED HANGUL IEUNG U */ + ["\u327F", "\u327F"], /* KOREAN STANDARD SYMBOL */ + ["\u3280", "\u3280"], /* CIRCLED IDEOGRAPH ONE */ + ["\u3281", "\u3281"], /* CIRCLED IDEOGRAPH TWO */ + ["\u3282", "\u3282"], /* CIRCLED IDEOGRAPH THREE */ + ["\u3283", "\u3283"], /* CIRCLED IDEOGRAPH FOUR */ + ["\u3284", "\u3284"], /* CIRCLED IDEOGRAPH FIVE */ + ["\u3285", "\u3285"], /* CIRCLED IDEOGRAPH SIX */ + ["\u3286", "\u3286"], /* CIRCLED IDEOGRAPH SEVEN */ + ["\u3287", "\u3287"], /* CIRCLED IDEOGRAPH EIGHT */ + ["\u3288", "\u3288"], /* CIRCLED IDEOGRAPH NINE */ + ["\u3289", "\u3289"], /* CIRCLED IDEOGRAPH TEN */ + ["\u328A", "\u328A"], /* CIRCLED IDEOGRAPH MOON */ + ["\u328B", "\u328B"], /* CIRCLED IDEOGRAPH FIRE */ + ["\u328C", "\u328C"], /* CIRCLED IDEOGRAPH WATER */ + ["\u328D", "\u328D"], /* CIRCLED IDEOGRAPH WOOD */ + ["\u328E", "\u328E"], /* CIRCLED IDEOGRAPH METAL */ + ["\u328F", "\u328F"], /* CIRCLED IDEOGRAPH EARTH */ + ["\u3290", "\u3290"], /* CIRCLED IDEOGRAPH SUN */ + ["\u3291", "\u3291"], /* CIRCLED IDEOGRAPH STOCK */ + ["\u3292", "\u3292"], /* CIRCLED IDEOGRAPH HAVE */ + ["\u3293", "\u3293"], /* CIRCLED IDEOGRAPH SOCIETY */ + ["\u3294", "\u3294"], /* CIRCLED IDEOGRAPH NAME */ + ["\u3295", "\u3295"], /* CIRCLED IDEOGRAPH SPECIAL */ + ["\u3296", "\u3296"], /* CIRCLED IDEOGRAPH FINANCIAL */ + ["\u3297", "\u3297"], /* CIRCLED IDEOGRAPH CONGRATULATION */ + ["\u3298", "\u3298"], /* CIRCLED IDEOGRAPH LABOR */ + ["\u3299", "\u3299"], /* CIRCLED IDEOGRAPH SECRET */ + ["\u329A", "\u329A"], /* CIRCLED IDEOGRAPH MALE */ + ["\u329B", "\u329B"], /* CIRCLED IDEOGRAPH FEMALE */ + ["\u329C", "\u329C"], /* CIRCLED IDEOGRAPH SUITABLE */ + ["\u329D", "\u329D"], /* CIRCLED IDEOGRAPH EXCELLENT */ + ["\u329E", "\u329E"], /* CIRCLED IDEOGRAPH PRINT */ + ["\u329F", "\u329F"], /* CIRCLED IDEOGRAPH ATTENTION */ + ["\u32A0", "\u32A0"], /* CIRCLED IDEOGRAPH ITEM */ + ["\u32A1", "\u32A1"], /* CIRCLED IDEOGRAPH REST */ + ["\u32A2", "\u32A2"], /* CIRCLED IDEOGRAPH COPY */ + ["\u32A3", "\u32A3"], /* CIRCLED IDEOGRAPH CORRECT */ + ["\u32A4", "\u32A4"], /* CIRCLED IDEOGRAPH HIGH */ + ["\u32A5", "\u32A5"], /* CIRCLED IDEOGRAPH CENTRE (CIRCLED IDEOGRAPH CENTER) */ + ["\u32A6", "\u32A6"], /* CIRCLED IDEOGRAPH LOW */ + ["\u32A7", "\u32A7"], /* CIRCLED IDEOGRAPH LEFT */ + ["\u32A8", "\u32A8"], /* CIRCLED IDEOGRAPH RIGHT */ + ["\u32A9", "\u32A9"], /* CIRCLED IDEOGRAPH MEDICINE */ + ["\u32AA", "\u32AA"], /* CIRCLED IDEOGRAPH RELIGION */ + ["\u32AB", "\u32AB"], /* CIRCLED IDEOGRAPH STUDY */ + ["\u32AC", "\u32AC"], /* CIRCLED IDEOGRAPH SUPERVISE */ + ["\u32AD", "\u32AD"], /* CIRCLED IDEOGRAPH ENTERPRISE */ + ["\u32AE", "\u32AE"], /* CIRCLED IDEOGRAPH RESOURCE */ + ["\u32AF", "\u32AF"], /* CIRCLED IDEOGRAPH ALLIANCE */ + ["\u32B0", "\u32B0"], /* CIRCLED IDEOGRAPH NIGHT */ + ["\u32B1", "\u32B1"], /* CIRCLED NUMBER THIRTY SIX */ + ["\u32B2", "\u32B2"], /* CIRCLED NUMBER THIRTY SEVEN */ + ["\u32B3", "\u32B3"], /* CIRCLED NUMBER THIRTY EIGHT */ + ["\u32B4", "\u32B4"], /* CIRCLED NUMBER THIRTY NINE */ + ["\u32B5", "\u32B5"], /* CIRCLED NUMBER FORTY */ + ["\u32B6", "\u32B6"], /* CIRCLED NUMBER FORTY ONE */ + ["\u32B7", "\u32B7"], /* CIRCLED NUMBER FORTY TWO */ + ["\u32B8", "\u32B8"], /* CIRCLED NUMBER FORTY THREE */ + ["\u32B9", "\u32B9"], /* CIRCLED NUMBER FORTY FOUR */ + ["\u32BA", "\u32BA"], /* CIRCLED NUMBER FORTY FIVE */ + ["\u32BB", "\u32BB"], /* CIRCLED NUMBER FORTY SIX */ + ["\u32BC", "\u32BC"], /* CIRCLED NUMBER FORTY SEVEN */ + ["\u32BD", "\u32BD"], /* CIRCLED NUMBER FORTY EIGHT */ + ["\u32BE", "\u32BE"], /* CIRCLED NUMBER FORTY NINE */ + ["\u32BF", "\u32BF"], /* CIRCLED NUMBER FIFTY */ + ["\u32C0", "\u32C0"], /* IDEOGRAPHIC TELEGRAPH SYMBOL FOR JANUARY */ + ["\u32C1", "\u32C1"], /* IDEOGRAPHIC TELEGRAPH SYMBOL FOR FEBRUARY */ + ["\u32C2", "\u32C2"], /* IDEOGRAPHIC TELEGRAPH SYMBOL FOR MARCH */ + ["\u32C3", "\u32C3"], /* IDEOGRAPHIC TELEGRAPH SYMBOL FOR APRIL */ + ["\u32C4", "\u32C4"], /* IDEOGRAPHIC TELEGRAPH SYMBOL FOR MAY */ + ["\u32C5", "\u32C5"], /* IDEOGRAPHIC TELEGRAPH SYMBOL FOR JUNE */ + ["\u32C6", "\u32C6"], /* IDEOGRAPHIC TELEGRAPH SYMBOL FOR JULY */ + ["\u32C7", "\u32C7"], /* IDEOGRAPHIC TELEGRAPH SYMBOL FOR AUGUST */ + ["\u32C8", "\u32C8"], /* IDEOGRAPHIC TELEGRAPH SYMBOL FOR SEPTEMBER */ + ["\u32C9", "\u32C9"], /* IDEOGRAPHIC TELEGRAPH SYMBOL FOR OCTOBER */ + ["\u32CA", "\u32CA"], /* IDEOGRAPHIC TELEGRAPH SYMBOL FOR NOVEMBER */ + ["\u32CB", "\u32CB"], /* IDEOGRAPHIC TELEGRAPH SYMBOL FOR DECEMBER */ + ["\u32CC", "\u32CC"], /* SQUARE HG */ + ["\u32CD", "\u32CD"], /* SQUARE ERG */ + ["\u32CE", "\u32CE"], /* SQUARE EV */ + ["\u32CF", "\u32CF"], /* LIMITED LIABILITY SIGN */ + ["\u32D0", "\u32D0"], /* CIRCLED KATAKANA A */ + ["\u32D1", "\u32D1"], /* CIRCLED KATAKANA I */ + ["\u32D2", "\u32D2"], /* CIRCLED KATAKANA U */ + ["\u32D3", "\u32D3"], /* CIRCLED KATAKANA E */ + ["\u32D4", "\u32D4"], /* CIRCLED KATAKANA O */ + ["\u32D5", "\u32D5"], /* CIRCLED KATAKANA KA */ + ["\u32D6", "\u32D6"], /* CIRCLED KATAKANA KI */ + ["\u32D7", "\u32D7"], /* CIRCLED KATAKANA KU */ + ["\u32D8", "\u32D8"], /* CIRCLED KATAKANA KE */ + ["\u32D9", "\u32D9"], /* CIRCLED KATAKANA KO */ + ["\u32DA", "\u32DA"], /* CIRCLED KATAKANA SA */ + ["\u32DB", "\u32DB"], /* CIRCLED KATAKANA SI */ + ["\u32DC", "\u32DC"], /* CIRCLED KATAKANA SU */ + ["\u32DD", "\u32DD"], /* CIRCLED KATAKANA SE */ + ["\u32DE", "\u32DE"], /* CIRCLED KATAKANA SO */ + ["\u32DF", "\u32DF"], /* CIRCLED KATAKANA TA */ + ["\u32E0", "\u32E0"], /* CIRCLED KATAKANA TI */ + ["\u32E1", "\u32E1"], /* CIRCLED KATAKANA TU */ + ["\u32E2", "\u32E2"], /* CIRCLED KATAKANA TE */ + ["\u32E3", "\u32E3"], /* CIRCLED KATAKANA TO */ + ["\u32E4", "\u32E4"], /* CIRCLED KATAKANA NA */ + ["\u32E5", "\u32E5"], /* CIRCLED KATAKANA NI */ + ["\u32E6", "\u32E6"], /* CIRCLED KATAKANA NU */ + ["\u32E7", "\u32E7"], /* CIRCLED KATAKANA NE */ + ["\u32E8", "\u32E8"], /* CIRCLED KATAKANA NO */ + ["\u32E9", "\u32E9"], /* CIRCLED KATAKANA HA */ + ["\u32EA", "\u32EA"], /* CIRCLED KATAKANA HI */ + ["\u32EB", "\u32EB"], /* CIRCLED KATAKANA HU */ + ["\u32EC", "\u32EC"], /* CIRCLED KATAKANA HE */ + ["\u32ED", "\u32ED"], /* CIRCLED KATAKANA HO */ + ["\u32EE", "\u32EE"], /* CIRCLED KATAKANA MA */ + ["\u32EF", "\u32EF"], /* CIRCLED KATAKANA MI */ + ["\u32F0", "\u32F0"], /* CIRCLED KATAKANA MU */ + ["\u32F1", "\u32F1"], /* CIRCLED KATAKANA ME */ + ["\u32F2", "\u32F2"], /* CIRCLED KATAKANA MO */ + ["\u32F3", "\u32F3"], /* CIRCLED KATAKANA YA */ + ["\u32F4", "\u32F4"], /* CIRCLED KATAKANA YU */ + ["\u32F5", "\u32F5"], /* CIRCLED KATAKANA YO */ + ["\u32F6", "\u32F6"], /* CIRCLED KATAKANA RA */ + ["\u32F7", "\u32F7"], /* CIRCLED KATAKANA RI */ + ["\u32F8", "\u32F8"], /* CIRCLED KATAKANA RU */ + ["\u32F9", "\u32F9"], /* CIRCLED KATAKANA RE */ + ["\u32FA", "\u32FA"], /* CIRCLED KATAKANA RO */ + ["\u32FB", "\u32FB"], /* CIRCLED KATAKANA WA */ + ["\u32FC", "\u32FC"], /* CIRCLED KATAKANA WI */ + ["\u32FD", "\u32FD"], /* CIRCLED KATAKANA WE */ + ["\u32FE", "\u32FE"], /* CIRCLED KATAKANA WO */ + ["\u32FF", "\u32FF"], /* SQUARE ERA NAME REIWA */ + ["\u3300", "\u3300"], /* SQUARE APAATO (SQUARED APAATO) */ + ["\u3301", "\u3301"], /* SQUARE ARUHUA (SQUARED ARUHUA) */ + ["\u3302", "\u3302"], /* SQUARE ANPEA (SQUARED ANPEA) */ + ["\u3303", "\u3303"], /* SQUARE AARU (SQUARED AARU) */ + ["\u3304", "\u3304"], /* SQUARE ININGU (SQUARED ININGU) */ + ["\u3305", "\u3305"], /* SQUARE INTI (SQUARED INTI) */ + ["\u3306", "\u3306"], /* SQUARE UON (SQUARED UON) */ + ["\u3307", "\u3307"], /* SQUARE ESUKUUDO (SQUARED ESUKUUDO) */ + ["\u3308", "\u3308"], /* SQUARE EEKAA (SQUARED EEKAA) */ + ["\u3309", "\u3309"], /* SQUARE ONSU (SQUARED ONSU) */ + ["\u330A", "\u330A"], /* SQUARE OOMU (SQUARED OOMU) */ + ["\u330B", "\u330B"], /* SQUARE KAIRI (SQUARED KAIRI) */ + ["\u330C", "\u330C"], /* SQUARE KARATTO (SQUARED KARATTO) */ + ["\u330D", "\u330D"], /* SQUARE KARORII (SQUARED KARORII) */ + ["\u330E", "\u330E"], /* SQUARE GARON (SQUARED GARON) */ + ["\u330F", "\u330F"], /* SQUARE GANMA (SQUARED GANMA) */ + ["\u3310", "\u3310"], /* SQUARE GIGA (SQUARED GIGA) */ + ["\u3311", "\u3311"], /* SQUARE GINII (SQUARED GINII) */ + ["\u3312", "\u3312"], /* SQUARE KYURII (SQUARED KYURII) */ + ["\u3313", "\u3313"], /* SQUARE GIRUDAA (SQUARED GIRUDAA) */ + ["\u3314", "\u3314"], /* SQUARE KIRO (SQUARED KIRO) */ + ["\u3315", "\u3315"], /* SQUARE KIROGURAMU (SQUARED KIROGURAMU) */ + ["\u3316", "\u3316"], /* SQUARE KIROMEETORU (SQUARED KIROMEETORU) */ + ["\u3317", "\u3317"], /* SQUARE KIROWATTO (SQUARED KIROWATTO) */ + ["\u3318", "\u3318"], /* SQUARE GURAMU (SQUARED GURAMU) */ + ["\u3319", "\u3319"], /* SQUARE GURAMUTON (SQUARED GURAMUTON) */ + ["\u331A", "\u331A"], /* SQUARE KURUZEIRO (SQUARED KURUZEIRO) */ + ["\u331B", "\u331B"], /* SQUARE KUROONE (SQUARED KUROONE) */ + ["\u331C", "\u331C"], /* SQUARE KEESU (SQUARED KEESU) */ + ["\u331D", "\u331D"], /* SQUARE KORUNA (SQUARED KORUNA) */ + ["\u331E", "\u331E"], /* SQUARE KOOPO (SQUARED KOOPO) */ + ["\u331F", "\u331F"], /* SQUARE SAIKURU (SQUARED SAIKURU) */ + ["\u3320", "\u3320"], /* SQUARE SANTIIMU (SQUARED SANTIIMU) */ + ["\u3321", "\u3321"], /* SQUARE SIRINGU (SQUARED SIRINGU) */ + ["\u3322", "\u3322"], /* SQUARE SENTI (SQUARED SENTI) */ + ["\u3323", "\u3323"], /* SQUARE SENTO (SQUARED SENTO) */ + ["\u3324", "\u3324"], /* SQUARE DAASU (SQUARED DAASU) */ + ["\u3325", "\u3325"], /* SQUARE DESI (SQUARED DESI) */ + ["\u3326", "\u3326"], /* SQUARE DORU (SQUARED DORU) */ + ["\u3327", "\u3327"], /* SQUARE TON (SQUARED TON) */ + ["\u3328", "\u3328"], /* SQUARE NANO (SQUARED NANO) */ + ["\u3329", "\u3329"], /* SQUARE NOTTO (SQUARED NOTTO) */ + ["\u332A", "\u332A"], /* SQUARE HAITU (SQUARED HAITU) */ + ["\u332B", "\u332B"], /* SQUARE PAASENTO (SQUARED PAASENTO) */ + ["\u332C", "\u332C"], /* SQUARE PAATU (SQUARED PAATU) */ + ["\u332D", "\u332D"], /* SQUARE BAARERU (SQUARED BAARERU) */ + ["\u332E", "\u332E"], /* SQUARE PIASUTORU (SQUARED PIASUTORU) */ + ["\u332F", "\u332F"], /* SQUARE PIKURU (SQUARED PIKURU) */ + ["\u3330", "\u3330"], /* SQUARE PIKO (SQUARED PIKO) */ + ["\u3331", "\u3331"], /* SQUARE BIRU (SQUARED BIRU) */ + ["\u3332", "\u3332"], /* SQUARE HUARADDO (SQUARED HUARADDO) */ + ["\u3333", "\u3333"], /* SQUARE HUIITO (SQUARED HUIITO) */ + ["\u3334", "\u3334"], /* SQUARE BUSSYERU (SQUARED BUSSYERU) */ + ["\u3335", "\u3335"], /* SQUARE HURAN (SQUARED HURAN) */ + ["\u3336", "\u3336"], /* SQUARE HEKUTAARU (SQUARED HEKUTAARU) */ + ["\u3337", "\u3337"], /* SQUARE PESO (SQUARED PESO) */ + ["\u3338", "\u3338"], /* SQUARE PENIHI (SQUARED PENIHI) */ + ["\u3339", "\u3339"], /* SQUARE HERUTU (SQUARED HERUTU) */ + ["\u333A", "\u333A"], /* SQUARE PENSU (SQUARED PENSU) */ + ["\u333B", "\u333B"], /* SQUARE PEEZI (SQUARED PEEZI) */ + ["\u333C", "\u333C"], /* SQUARE BEETA (SQUARED BEETA) */ + ["\u333D", "\u333D"], /* SQUARE POINTO (SQUARED POINTO) */ + ["\u333E", "\u333E"], /* SQUARE BORUTO (SQUARED BORUTO) */ + ["\u333F", "\u333F"], /* SQUARE HON (SQUARED HON) */ + ["\u3340", "\u3340"], /* SQUARE PONDO (SQUARED PONDO) */ + ["\u3341", "\u3341"], /* SQUARE HOORU (SQUARED HOORU) */ + ["\u3342", "\u3342"], /* SQUARE HOON (SQUARED HOON) */ + ["\u3343", "\u3343"], /* SQUARE MAIKURO (SQUARED MAIKURO) */ + ["\u3344", "\u3344"], /* SQUARE MAIRU (SQUARED MAIRU) */ + ["\u3345", "\u3345"], /* SQUARE MAHHA (SQUARED MAHHA) */ + ["\u3346", "\u3346"], /* SQUARE MARUKU (SQUARED MARUKU) */ + ["\u3347", "\u3347"], /* SQUARE MANSYON (SQUARED MANSYON) */ + ["\u3348", "\u3348"], /* SQUARE MIKURON (SQUARED MIKURON) */ + ["\u3349", "\u3349"], /* SQUARE MIRI (SQUARED MIRI) */ + ["\u334A", "\u334A"], /* SQUARE MIRIBAARU (SQUARED MIRIBAARU) */ + ["\u334B", "\u334B"], /* SQUARE MEGA (SQUARED MEGA) */ + ["\u334C", "\u334C"], /* SQUARE MEGATON (SQUARED MEGATON) */ + ["\u334D", "\u334D"], /* SQUARE MEETORU (SQUARED MEETORU) */ + ["\u334E", "\u334E"], /* SQUARE YAADO (SQUARED YAADO) */ + ["\u334F", "\u334F"], /* SQUARE YAARU (SQUARED YAARU) */ + ["\u3350", "\u3350"], /* SQUARE YUAN (SQUARED YUAN) */ + ["\u3351", "\u3351"], /* SQUARE RITTORU (SQUARED RITTORU) */ + ["\u3352", "\u3352"], /* SQUARE RIRA (SQUARED RIRA) */ + ["\u3353", "\u3353"], /* SQUARE RUPII (SQUARED RUPII) */ + ["\u3354", "\u3354"], /* SQUARE RUUBURU (SQUARED RUUBURU) */ + ["\u3355", "\u3355"], /* SQUARE REMU (SQUARED REMU) */ + ["\u3356", "\u3356"], /* SQUARE RENTOGEN (SQUARED RENTOGEN) */ + ["\u3357", "\u3357"], /* SQUARE WATTO (SQUARED WATTO) */ + ["\u3358", "\u3358"], /* IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR ZERO */ + ["\u3359", "\u3359"], /* IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR ONE */ + ["\u335A", "\u335A"], /* IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR TWO */ + ["\u335B", "\u335B"], /* IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR THREE */ + ["\u335C", "\u335C"], /* IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR FOUR */ + ["\u335D", "\u335D"], /* IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR FIVE */ + ["\u335E", "\u335E"], /* IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR SIX */ + ["\u335F", "\u335F"], /* IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR SEVEN */ + ["\u3360", "\u3360"], /* IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR EIGHT */ + ["\u3361", "\u3361"], /* IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR NINE */ + ["\u3362", "\u3362"], /* IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR TEN */ + ["\u3363", "\u3363"], /* IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR ELEVEN */ + ["\u3364", "\u3364"], /* IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR TWELVE */ + ["\u3365", "\u3365"], /* IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR THIRTEEN */ + ["\u3366", "\u3366"], /* IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR FOURTEEN */ + ["\u3367", "\u3367"], /* IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR FIFTEEN */ + ["\u3368", "\u3368"], /* IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR SIXTEEN */ + ["\u3369", "\u3369"], /* IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR SEVENTEEN */ + ["\u336A", "\u336A"], /* IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR EIGHTEEN */ + ["\u336B", "\u336B"], /* IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR NINETEEN */ + ["\u336C", "\u336C"], /* IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR TWENTY */ + ["\u336D", "\u336D"], /* IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR TWENTY-ONE */ + ["\u336E", "\u336E"], /* IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR TWENTY-TWO */ + ["\u336F", "\u336F"], /* IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR TWENTY-THREE */ + ["\u3370", "\u3370"], /* IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR TWENTY-FOUR */ + ["\u3371", "\u3371"], /* SQUARE HPA */ + ["\u3372", "\u3372"], /* SQUARE DA */ + ["\u3373", "\u3373"], /* SQUARE AU */ + ["\u3374", "\u3374"], /* SQUARE BAR */ + ["\u3375", "\u3375"], /* SQUARE OV */ + ["\u3376", "\u3376"], /* SQUARE PC */ + ["\u3377", "\u3377"], /* SQUARE DM */ + ["\u3378", "\u3378"], /* SQUARE DM SQUARED */ + ["\u3379", "\u3379"], /* SQUARE DM CUBED */ + ["\u337A", "\u337A"], /* SQUARE IU */ + ["\u337B", "\u337B"], /* SQUARE ERA NAME HEISEI (SQUARED TWO IDEOGRAPHS ERA NAME HEISEI) */ + ["\u337C", "\u337C"], /* SQUARE ERA NAME SYOUWA (SQUARED TWO IDEOGRAPHS ERA NAME SYOUWA) */ + ["\u337D", "\u337D"], /* SQUARE ERA NAME TAISYOU (SQUARED TWO IDEOGRAPHS ERA NAME TAISYOU) */ + ["\u337E", "\u337E"], /* SQUARE ERA NAME MEIZI (SQUARED TWO IDEOGRAPHS ERA NAME MEIZI) */ + ["\u337F", "\u337F"], /* SQUARE CORPORATION (SQUARED FOUR IDEOGRAPHS CORPORATION) */ + ["\u3380", "\u3380"], /* SQUARE PA AMPS (SQUARED PA AMPS) */ + ["\u3381", "\u3381"], /* SQUARE NA (SQUARED NA) */ + ["\u3382", "\u3382"], /* SQUARE MU A (SQUARED MU A) */ + ["\u3383", "\u3383"], /* SQUARE MA (SQUARED MA) */ + ["\u3384", "\u3384"], /* SQUARE KA (SQUARED KA) */ + ["\u3385", "\u3385"], /* SQUARE KB (SQUARED KB) */ + ["\u3386", "\u3386"], /* SQUARE MB (SQUARED MB) */ + ["\u3387", "\u3387"], /* SQUARE GB (SQUARED GB) */ + ["\u3388", "\u3388"], /* SQUARE CAL (SQUARED CAL) */ + ["\u3389", "\u3389"], /* SQUARE KCAL (SQUARED KCAL) */ + ["\u338A", "\u338A"], /* SQUARE PF (SQUARED PF) */ + ["\u338B", "\u338B"], /* SQUARE NF (SQUARED NF) */ + ["\u338C", "\u338C"], /* SQUARE MU F (SQUARED MU F) */ + ["\u338D", "\u338D"], /* SQUARE MU G (SQUARED MU G) */ + ["\u338E", "\u338E"], /* SQUARE MG (SQUARED MG) */ + ["\u338F", "\u338F"], /* SQUARE KG (SQUARED KG) */ + ["\u3390", "\u3390"], /* SQUARE HZ (SQUARED HZ) */ + ["\u3391", "\u3391"], /* SQUARE KHZ (SQUARED KHZ) */ + ["\u3392", "\u3392"], /* SQUARE MHZ (SQUARED MHZ) */ + ["\u3393", "\u3393"], /* SQUARE GHZ (SQUARED GHZ) */ + ["\u3394", "\u3394"], /* SQUARE THZ (SQUARED THZ) */ + ["\u3395", "\u3395"], /* SQUARE MU L (SQUARED MU L) */ + ["\u3396", "\u3396"], /* SQUARE ML (SQUARED ML) */ + ["\u3397", "\u3397"], /* SQUARE DL (SQUARED DL) */ + ["\u3398", "\u3398"], /* SQUARE KL (SQUARED KL) */ + ["\u3399", "\u3399"], /* SQUARE FM (SQUARED FM) */ + ["\u339A", "\u339A"], /* SQUARE NM (SQUARED NM) */ + ["\u339B", "\u339B"], /* SQUARE MU M (SQUARED MU M) */ + ["\u339C", "\u339C"], /* SQUARE MM (SQUARED MM) */ + ["\u339D", "\u339D"], /* SQUARE CM (SQUARED CM) */ + ["\u339E", "\u339E"], /* SQUARE KM (SQUARED KM) */ + ["\u339F", "\u339F"], /* SQUARE MM SQUARED (SQUARED MM SQUARED) */ + ["\u33A0", "\u33A0"], /* SQUARE CM SQUARED (SQUARED CM SQUARED) */ + ["\u33A1", "\u33A1"], /* SQUARE M SQUARED (SQUARED M SQUARED) */ + ["\u33A2", "\u33A2"], /* SQUARE KM SQUARED (SQUARED KM SQUARED) */ + ["\u33A3", "\u33A3"], /* SQUARE MM CUBED (SQUARED MM CUBED) */ + ["\u33A4", "\u33A4"], /* SQUARE CM CUBED (SQUARED CM CUBED) */ + ["\u33A5", "\u33A5"], /* SQUARE M CUBED (SQUARED M CUBED) */ + ["\u33A6", "\u33A6"], /* SQUARE KM CUBED (SQUARED KM CUBED) */ + ["\u33A7", "\u33A7"], /* SQUARE M OVER S (SQUARED M OVER S) */ + ["\u33A8", "\u33A8"], /* SQUARE M OVER S SQUARED (SQUARED M OVER S SQUARED) */ + ["\u33A9", "\u33A9"], /* SQUARE PA (SQUARED PA) */ + ["\u33AA", "\u33AA"], /* SQUARE KPA (SQUARED KPA) */ + ["\u33AB", "\u33AB"], /* SQUARE MPA (SQUARED MPA) */ + ["\u33AC", "\u33AC"], /* SQUARE GPA (SQUARED GPA) */ + ["\u33AD", "\u33AD"], /* SQUARE RAD (SQUARED RAD) */ + ["\u33AE", "\u33AE"], /* SQUARE RAD OVER S (SQUARED RAD OVER S) */ + ["\u33AF", "\u33AF"], /* SQUARE RAD OVER S SQUARED (SQUARED RAD OVER S SQUARED) */ + ["\u33B0", "\u33B0"], /* SQUARE PS (SQUARED PS) */ + ["\u33B1", "\u33B1"], /* SQUARE NS (SQUARED NS) */ + ["\u33B2", "\u33B2"], /* SQUARE MU S (SQUARED MU S) */ + ["\u33B3", "\u33B3"], /* SQUARE MS (SQUARED MS) */ + ["\u33B4", "\u33B4"], /* SQUARE PV (SQUARED PV) */ + ["\u33B5", "\u33B5"], /* SQUARE NV (SQUARED NV) */ + ["\u33B6", "\u33B6"], /* SQUARE MU V (SQUARED MU V) */ + ["\u33B7", "\u33B7"], /* SQUARE MV (SQUARED MV) */ + ["\u33B8", "\u33B8"], /* SQUARE KV (SQUARED KV) */ + ["\u33B9", "\u33B9"], /* SQUARE MV MEGA (SQUARED MV MEGA) */ + ["\u33BA", "\u33BA"], /* SQUARE PW (SQUARED PW) */ + ["\u33BB", "\u33BB"], /* SQUARE NW (SQUARED NW) */ + ["\u33BC", "\u33BC"], /* SQUARE MU W (SQUARED MU W) */ + ["\u33BD", "\u33BD"], /* SQUARE MW (SQUARED MW) */ + ["\u33BE", "\u33BE"], /* SQUARE KW (SQUARED KW) */ + ["\u33BF", "\u33BF"], /* SQUARE MW MEGA (SQUARED MW MEGA) */ + ["\u33C0", "\u33C0"], /* SQUARE K OHM (SQUARED K OHM) */ + ["\u33C1", "\u33C1"], /* SQUARE M OHM (SQUARED M OHM) */ + ["\u33C2", "\u33C2"], /* SQUARE AM (SQUARED AM) */ + ["\u33C3", "\u33C3"], /* SQUARE BQ (SQUARED BQ) */ + ["\u33C4", "\u33C4"], /* SQUARE CC (SQUARED CC) */ + ["\u33C5", "\u33C5"], /* SQUARE CD (SQUARED CD) */ + ["\u33C6", "\u33C6"], /* SQUARE C OVER KG (SQUARED C OVER KG) */ + ["\u33C7", "\u33C7"], /* SQUARE CO (SQUARED CO) */ + ["\u33C8", "\u33C8"], /* SQUARE DB (SQUARED DB) */ + ["\u33C9", "\u33C9"], /* SQUARE GY (SQUARED GY) */ + ["\u33CA", "\u33CA"], /* SQUARE HA (SQUARED HA) */ + ["\u33CB", "\u33CB"], /* SQUARE HP (SQUARED HP) */ + ["\u33CC", "\u33CC"], /* SQUARE IN (SQUARED IN) */ + ["\u33CD", "\u33CD"], /* SQUARE KK (SQUARED KK) */ + ["\u33CE", "\u33CE"], /* SQUARE KM CAPITAL (SQUARED KM CAPITAL) */ + ["\u33CF", "\u33CF"], /* SQUARE KT (SQUARED KT) */ + ["\u33D0", "\u33D0"], /* SQUARE LM (SQUARED LM) */ + ["\u33D1", "\u33D1"], /* SQUARE LN (SQUARED LN) */ + ["\u33D2", "\u33D2"], /* SQUARE LOG (SQUARED LOG) */ + ["\u33D3", "\u33D3"], /* SQUARE LX (SQUARED LX) */ + ["\u33D4", "\u33D4"], /* SQUARE MB SMALL (SQUARED MB SMALL) */ + ["\u33D5", "\u33D5"], /* SQUARE MIL (SQUARED MIL) */ + ["\u33D6", "\u33D6"], /* SQUARE MOL (SQUARED MOL) */ + ["\u33D7", "\u33D7"], /* SQUARE PH (SQUARED PH) */ + ["\u33D8", "\u33D8"], /* SQUARE PM (SQUARED PM) */ + ["\u33D9", "\u33D9"], /* SQUARE PPM (SQUARED PPM) */ + ["\u33DA", "\u33DA"], /* SQUARE PR (SQUARED PR) */ + ["\u33DB", "\u33DB"], /* SQUARE SR (SQUARED SR) */ + ["\u33DC", "\u33DC"], /* SQUARE SV (SQUARED SV) */ + ["\u33DD", "\u33DD"], /* SQUARE WB (SQUARED WB) */ + ["\u33DE", "\u33DE"], /* SQUARE V OVER M */ + ["\u33DF", "\u33DF"], /* SQUARE A OVER M */ + ["\u33E0", "\u33E0"], /* IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY ONE */ + ["\u33E1", "\u33E1"], /* IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWO */ + ["\u33E2", "\u33E2"], /* IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY THREE */ + ["\u33E3", "\u33E3"], /* IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY FOUR */ + ["\u33E4", "\u33E4"], /* IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY FIVE */ + ["\u33E5", "\u33E5"], /* IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY SIX */ + ["\u33E6", "\u33E6"], /* IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY SEVEN */ + ["\u33E7", "\u33E7"], /* IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY EIGHT */ + ["\u33E8", "\u33E8"], /* IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY NINE */ + ["\u33E9", "\u33E9"], /* IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TEN */ + ["\u33EA", "\u33EA"], /* IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY ELEVEN */ + ["\u33EB", "\u33EB"], /* IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWELVE */ + ["\u33EC", "\u33EC"], /* IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY THIRTEEN */ + ["\u33ED", "\u33ED"], /* IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY FOURTEEN */ + ["\u33EE", "\u33EE"], /* IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY FIFTEEN */ + ["\u33EF", "\u33EF"], /* IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY SIXTEEN */ + ["\u33F0", "\u33F0"], /* IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY SEVENTEEN */ + ["\u33F1", "\u33F1"], /* IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY EIGHTEEN */ + ["\u33F2", "\u33F2"], /* IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY NINETEEN */ + ["\u33F3", "\u33F3"], /* IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY */ + ["\u33F4", "\u33F4"], /* IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-ONE */ + ["\u33F5", "\u33F5"], /* IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-TWO */ + ["\u33F6", "\u33F6"], /* IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-THREE */ + ["\u33F7", "\u33F7"], /* IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-FOUR */ + ["\u33F8", "\u33F8"], /* IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-FIVE */ + ["\u33F9", "\u33F9"], /* IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-SIX */ + ["\u33FA", "\u33FA"], /* IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-SEVEN */ + ["\u33FB", "\u33FB"], /* IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-EIGHT */ + ["\u33FC", "\u33FC"], /* IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-NINE */ + ["\u33FD", "\u33FD"], /* IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY THIRTY */ + ["\u33FE", "\u33FE"], /* IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY THIRTY-ONE */ + ["\u33FF", "\u33FF"], /* SQUARE GAL */ + ["\u3400", "\u3400"], /* CJK Ideograph Extension A */ + ["\u3401", "\u3401"], /* CJK Ideograph Extension A */ + ["\u3402", "\u3402"], /* CJK Ideograph Extension A */ + ["\u3403", "\u3403"], /* CJK Ideograph Extension A */ + ["\u3404", "\u3404"], /* CJK Ideograph Extension A */ + ["\u3405", "\u3405"], /* CJK Ideograph Extension A */ + ["\u3406", "\u3406"], /* CJK Ideograph Extension A */ + ["\u3407", "\u3407"], /* CJK Ideograph Extension A */ + ["\u3408", "\u3408"], /* CJK Ideograph Extension A */ + ["\u3409", "\u3409"], /* CJK Ideograph Extension A */ + ["\u340A", "\u340A"], /* CJK Ideograph Extension A */ + ["\u340B", "\u340B"], /* CJK Ideograph Extension A */ + ["\u340C", "\u340C"], /* CJK Ideograph Extension A */ + ["\u340D", "\u340D"], /* CJK Ideograph Extension A */ + ["\u340E", "\u340E"], /* CJK Ideograph Extension A */ + ["\u340F", "\u340F"], /* CJK Ideograph Extension A */ + ["\u3410", "\u3410"], /* CJK Ideograph Extension A */ + ["\u3411", "\u3411"], /* CJK Ideograph Extension A */ + ["\u3412", "\u3412"], /* CJK Ideograph Extension A */ + ["\u3413", "\u3413"], /* CJK Ideograph Extension A */ + ["\u3414", "\u3414"], /* CJK Ideograph Extension A */ + ["\u3415", "\u3415"], /* CJK Ideograph Extension A */ + ["\u3416", "\u3416"], /* CJK Ideograph Extension A */ + ["\u3417", "\u3417"], /* CJK Ideograph Extension A */ + ["\u3418", "\u3418"], /* CJK Ideograph Extension A */ + ["\u3419", "\u3419"], /* CJK Ideograph Extension A */ + ["\u341A", "\u341A"], /* CJK Ideograph Extension A */ + ["\u341B", "\u341B"], /* CJK Ideograph Extension A */ + ["\u341C", "\u341C"], /* CJK Ideograph Extension A */ + ["\u341D", "\u341D"], /* CJK Ideograph Extension A */ + ["\u341E", "\u341E"], /* CJK Ideograph Extension A */ + ["\u341F", "\u341F"], /* CJK Ideograph Extension A */ + ["\u3420", "\u3420"], /* CJK Ideograph Extension A */ + ["\u3421", "\u3421"], /* CJK Ideograph Extension A */ + ["\u3422", "\u3422"], /* CJK Ideograph Extension A */ + ["\u3423", "\u3423"], /* CJK Ideograph Extension A */ + ["\u3424", "\u3424"], /* CJK Ideograph Extension A */ + ["\u3425", "\u3425"], /* CJK Ideograph Extension A */ + ["\u3426", "\u3426"], /* CJK Ideograph Extension A */ + ["\u3427", "\u3427"], /* CJK Ideograph Extension A */ + ["\u3428", "\u3428"], /* CJK Ideograph Extension A */ + ["\u3429", "\u3429"], /* CJK Ideograph Extension A */ + ["\u342A", "\u342A"], /* CJK Ideograph Extension A */ + ["\u342B", "\u342B"], /* CJK Ideograph Extension A */ + ["\u342C", "\u342C"], /* CJK Ideograph Extension A */ + ["\u342D", "\u342D"], /* CJK Ideograph Extension A */ + ["\u342E", "\u342E"], /* CJK Ideograph Extension A */ + ["\u342F", "\u342F"], /* CJK Ideograph Extension A */ + ["\u3430", "\u3430"], /* CJK Ideograph Extension A */ + ["\u3431", "\u3431"], /* CJK Ideograph Extension A */ + ["\u3432", "\u3432"], /* CJK Ideograph Extension A */ + ["\u3433", "\u3433"], /* CJK Ideograph Extension A */ + ["\u3434", "\u3434"], /* CJK Ideograph Extension A */ + ["\u3435", "\u3435"], /* CJK Ideograph Extension A */ + ["\u3436", "\u3436"], /* CJK Ideograph Extension A */ + ["\u3437", "\u3437"], /* CJK Ideograph Extension A */ + ["\u3438", "\u3438"], /* CJK Ideograph Extension A */ + ["\u3439", "\u3439"], /* CJK Ideograph Extension A */ + ["\u343A", "\u343A"], /* CJK Ideograph Extension A */ + ["\u343B", "\u343B"], /* CJK Ideograph Extension A */ + ["\u343C", "\u343C"], /* CJK Ideograph Extension A */ + ["\u343D", "\u343D"], /* CJK Ideograph Extension A */ + ["\u343E", "\u343E"], /* CJK Ideograph Extension A */ + ["\u343F", "\u343F"], /* CJK Ideograph Extension A */ + ["\u3440", "\u3440"], /* CJK Ideograph Extension A */ + ["\u3441", "\u3441"], /* CJK Ideograph Extension A */ + ["\u3442", "\u3442"], /* CJK Ideograph Extension A */ + ["\u3443", "\u3443"], /* CJK Ideograph Extension A */ + ["\u3444", "\u3444"], /* CJK Ideograph Extension A */ + ["\u3445", "\u3445"], /* CJK Ideograph Extension A */ + ["\u3446", "\u3446"], /* CJK Ideograph Extension A */ + ["\u3447", "\u3447"], /* CJK Ideograph Extension A */ + ["\u3448", "\u3448"], /* CJK Ideograph Extension A */ + ["\u3449", "\u3449"], /* CJK Ideograph Extension A */ + ["\u344A", "\u344A"], /* CJK Ideograph Extension A */ + ["\u344B", "\u344B"], /* CJK Ideograph Extension A */ + ["\u344C", "\u344C"], /* CJK Ideograph Extension A */ + ["\u344D", "\u344D"], /* CJK Ideograph Extension A */ + ["\u344E", "\u344E"], /* CJK Ideograph Extension A */ + ["\u344F", "\u344F"], /* CJK Ideograph Extension A */ + ["\u3450", "\u3450"], /* CJK Ideograph Extension A */ + ["\u3451", "\u3451"], /* CJK Ideograph Extension A */ + ["\u3452", "\u3452"], /* CJK Ideograph Extension A */ + ["\u3453", "\u3453"], /* CJK Ideograph Extension A */ + ["\u3454", "\u3454"], /* CJK Ideograph Extension A */ + ["\u3455", "\u3455"], /* CJK Ideograph Extension A */ + ["\u3456", "\u3456"], /* CJK Ideograph Extension A */ + ["\u3457", "\u3457"], /* CJK Ideograph Extension A */ + ["\u3458", "\u3458"], /* CJK Ideograph Extension A */ + ["\u3459", "\u3459"], /* CJK Ideograph Extension A */ + ["\u345A", "\u345A"], /* CJK Ideograph Extension A */ + ["\u345B", "\u345B"], /* CJK Ideograph Extension A */ + ["\u345C", "\u345C"], /* CJK Ideograph Extension A */ + ["\u345D", "\u345D"], /* CJK Ideograph Extension A */ + ["\u345E", "\u345E"], /* CJK Ideograph Extension A */ + ["\u345F", "\u345F"], /* CJK Ideograph Extension A */ + ["\u3460", "\u3460"], /* CJK Ideograph Extension A */ + ["\u3461", "\u3461"], /* CJK Ideograph Extension A */ + ["\u3462", "\u3462"], /* CJK Ideograph Extension A */ + ["\u3463", "\u3463"], /* CJK Ideograph Extension A */ + ["\u3464", "\u3464"], /* CJK Ideograph Extension A */ + ["\u3465", "\u3465"], /* CJK Ideograph Extension A */ + ["\u3466", "\u3466"], /* CJK Ideograph Extension A */ + ["\u3467", "\u3467"], /* CJK Ideograph Extension A */ + ["\u3468", "\u3468"], /* CJK Ideograph Extension A */ + ["\u3469", "\u3469"], /* CJK Ideograph Extension A */ + ["\u346A", "\u346A"], /* CJK Ideograph Extension A */ + ["\u346B", "\u346B"], /* CJK Ideograph Extension A */ + ["\u346C", "\u346C"], /* CJK Ideograph Extension A */ + ["\u346D", "\u346D"], /* CJK Ideograph Extension A */ + ["\u346E", "\u346E"], /* CJK Ideograph Extension A */ + ["\u346F", "\u346F"], /* CJK Ideograph Extension A */ + ["\u3470", "\u3470"], /* CJK Ideograph Extension A */ + ["\u3471", "\u3471"], /* CJK Ideograph Extension A */ + ["\u3472", "\u3472"], /* CJK Ideograph Extension A */ + ["\u3473", "\u3473"], /* CJK Ideograph Extension A */ + ["\u3474", "\u3474"], /* CJK Ideograph Extension A */ + ["\u3475", "\u3475"], /* CJK Ideograph Extension A */ + ["\u3476", "\u3476"], /* CJK Ideograph Extension A */ + ["\u3477", "\u3477"], /* CJK Ideograph Extension A */ + ["\u3478", "\u3478"], /* CJK Ideograph Extension A */ + ["\u3479", "\u3479"], /* CJK Ideograph Extension A */ + ["\u347A", "\u347A"], /* CJK Ideograph Extension A */ + ["\u347B", "\u347B"], /* CJK Ideograph Extension A */ + ["\u347C", "\u347C"], /* CJK Ideograph Extension A */ + ["\u347D", "\u347D"], /* CJK Ideograph Extension A */ + ["\u347E", "\u347E"], /* CJK Ideograph Extension A */ + ["\u347F", "\u347F"], /* CJK Ideograph Extension A */ + ["\u3480", "\u3480"], /* CJK Ideograph Extension A */ + ["\u3481", "\u3481"], /* CJK Ideograph Extension A */ + ["\u3482", "\u3482"], /* CJK Ideograph Extension A */ + ["\u3483", "\u3483"], /* CJK Ideograph Extension A */ + ["\u3484", "\u3484"], /* CJK Ideograph Extension A */ + ["\u3485", "\u3485"], /* CJK Ideograph Extension A */ + ["\u3486", "\u3486"], /* CJK Ideograph Extension A */ + ["\u3487", "\u3487"], /* CJK Ideograph Extension A */ + ["\u3488", "\u3488"], /* CJK Ideograph Extension A */ + ["\u3489", "\u3489"], /* CJK Ideograph Extension A */ + ["\u348A", "\u348A"], /* CJK Ideograph Extension A */ + ["\u348B", "\u348B"], /* CJK Ideograph Extension A */ + ["\u348C", "\u348C"], /* CJK Ideograph Extension A */ + ["\u348D", "\u348D"], /* CJK Ideograph Extension A */ + ["\u348E", "\u348E"], /* CJK Ideograph Extension A */ + ["\u348F", "\u348F"], /* CJK Ideograph Extension A */ + ["\u3490", "\u3490"], /* CJK Ideograph Extension A */ + ["\u3491", "\u3491"], /* CJK Ideograph Extension A */ + ["\u3492", "\u3492"], /* CJK Ideograph Extension A */ + ["\u3493", "\u3493"], /* CJK Ideograph Extension A */ + ["\u3494", "\u3494"], /* CJK Ideograph Extension A */ + ["\u3495", "\u3495"], /* CJK Ideograph Extension A */ + ["\u3496", "\u3496"], /* CJK Ideograph Extension A */ + ["\u3497", "\u3497"], /* CJK Ideograph Extension A */ + ["\u3498", "\u3498"], /* CJK Ideograph Extension A */ + ["\u3499", "\u3499"], /* CJK Ideograph Extension A */ + ["\u349A", "\u349A"], /* CJK Ideograph Extension A */ + ["\u349B", "\u349B"], /* CJK Ideograph Extension A */ + ["\u349C", "\u349C"], /* CJK Ideograph Extension A */ + ["\u349D", "\u349D"], /* CJK Ideograph Extension A */ + ["\u349E", "\u349E"], /* CJK Ideograph Extension A */ + ["\u349F", "\u349F"], /* CJK Ideograph Extension A */ + ["\u34A0", "\u34A0"], /* CJK Ideograph Extension A */ + ["\u34A1", "\u34A1"], /* CJK Ideograph Extension A */ + ["\u34A2", "\u34A2"], /* CJK Ideograph Extension A */ + ["\u34A3", "\u34A3"], /* CJK Ideograph Extension A */ + ["\u34A4", "\u34A4"], /* CJK Ideograph Extension A */ + ["\u34A5", "\u34A5"], /* CJK Ideograph Extension A */ + ["\u34A6", "\u34A6"], /* CJK Ideograph Extension A */ + ["\u34A7", "\u34A7"], /* CJK Ideograph Extension A */ + ["\u34A8", "\u34A8"], /* CJK Ideograph Extension A */ + ["\u34A9", "\u34A9"], /* CJK Ideograph Extension A */ + ["\u34AA", "\u34AA"], /* CJK Ideograph Extension A */ + ["\u34AB", "\u34AB"], /* CJK Ideograph Extension A */ + ["\u34AC", "\u34AC"], /* CJK Ideograph Extension A */ + ["\u34AD", "\u34AD"], /* CJK Ideograph Extension A */ + ["\u34AE", "\u34AE"], /* CJK Ideograph Extension A */ + ["\u34AF", "\u34AF"], /* CJK Ideograph Extension A */ + ["\u34B0", "\u34B0"], /* CJK Ideograph Extension A */ + ["\u34B1", "\u34B1"], /* CJK Ideograph Extension A */ + ["\u34B2", "\u34B2"], /* CJK Ideograph Extension A */ + ["\u34B3", "\u34B3"], /* CJK Ideograph Extension A */ + ["\u34B4", "\u34B4"], /* CJK Ideograph Extension A */ + ["\u34B5", "\u34B5"], /* CJK Ideograph Extension A */ + ["\u34B6", "\u34B6"], /* CJK Ideograph Extension A */ + ["\u34B7", "\u34B7"], /* CJK Ideograph Extension A */ + ["\u34B8", "\u34B8"], /* CJK Ideograph Extension A */ + ["\u34B9", "\u34B9"], /* CJK Ideograph Extension A */ + ["\u34BA", "\u34BA"], /* CJK Ideograph Extension A */ + ["\u34BB", "\u34BB"], /* CJK Ideograph Extension A */ + ["\u34BC", "\u34BC"], /* CJK Ideograph Extension A */ + ["\u34BD", "\u34BD"], /* CJK Ideograph Extension A */ + ["\u34BE", "\u34BE"], /* CJK Ideograph Extension A */ + ["\u34BF", "\u34BF"], /* CJK Ideograph Extension A */ + ["\u34C0", "\u34C0"], /* CJK Ideograph Extension A */ + ["\u34C1", "\u34C1"], /* CJK Ideograph Extension A */ + ["\u34C2", "\u34C2"], /* CJK Ideograph Extension A */ + ["\u34C3", "\u34C3"], /* CJK Ideograph Extension A */ + ["\u34C4", "\u34C4"], /* CJK Ideograph Extension A */ + ["\u34C5", "\u34C5"], /* CJK Ideograph Extension A */ + ["\u34C6", "\u34C6"], /* CJK Ideograph Extension A */ + ["\u34C7", "\u34C7"], /* CJK Ideograph Extension A */ + ["\u34C8", "\u34C8"], /* CJK Ideograph Extension A */ + ["\u34C9", "\u34C9"], /* CJK Ideograph Extension A */ + ["\u34CA", "\u34CA"], /* CJK Ideograph Extension A */ + ["\u34CB", "\u34CB"], /* CJK Ideograph Extension A */ + ["\u34CC", "\u34CC"], /* CJK Ideograph Extension A */ + ["\u34CD", "\u34CD"], /* CJK Ideograph Extension A */ + ["\u34CE", "\u34CE"], /* CJK Ideograph Extension A */ + ["\u34CF", "\u34CF"], /* CJK Ideograph Extension A */ + ["\u34D0", "\u34D0"], /* CJK Ideograph Extension A */ + ["\u34D1", "\u34D1"], /* CJK Ideograph Extension A */ + ["\u34D2", "\u34D2"], /* CJK Ideograph Extension A */ + ["\u34D3", "\u34D3"], /* CJK Ideograph Extension A */ + ["\u34D4", "\u34D4"], /* CJK Ideograph Extension A */ + ["\u34D5", "\u34D5"], /* CJK Ideograph Extension A */ + ["\u34D6", "\u34D6"], /* CJK Ideograph Extension A */ + ["\u34D7", "\u34D7"], /* CJK Ideograph Extension A */ + ["\u34D8", "\u34D8"], /* CJK Ideograph Extension A */ + ["\u34D9", "\u34D9"], /* CJK Ideograph Extension A */ + ["\u34DA", "\u34DA"], /* CJK Ideograph Extension A */ + ["\u34DB", "\u34DB"], /* CJK Ideograph Extension A */ + ["\u34DC", "\u34DC"], /* CJK Ideograph Extension A */ + ["\u34DD", "\u34DD"], /* CJK Ideograph Extension A */ + ["\u34DE", "\u34DE"], /* CJK Ideograph Extension A */ + ["\u34DF", "\u34DF"], /* CJK Ideograph Extension A */ + ["\u34E0", "\u34E0"], /* CJK Ideograph Extension A */ + ["\u34E1", "\u34E1"], /* CJK Ideograph Extension A */ + ["\u34E2", "\u34E2"], /* CJK Ideograph Extension A */ + ["\u34E3", "\u34E3"], /* CJK Ideograph Extension A */ + ["\u34E4", "\u34E4"], /* CJK Ideograph Extension A */ + ["\u34E5", "\u34E5"], /* CJK Ideograph Extension A */ + ["\u34E6", "\u34E6"], /* CJK Ideograph Extension A */ + ["\u34E7", "\u34E7"], /* CJK Ideograph Extension A */ + ["\u34E8", "\u34E8"], /* CJK Ideograph Extension A */ + ["\u34E9", "\u34E9"], /* CJK Ideograph Extension A */ + ["\u34EA", "\u34EA"], /* CJK Ideograph Extension A */ + ["\u34EB", "\u34EB"], /* CJK Ideograph Extension A */ + ["\u34EC", "\u34EC"], /* CJK Ideograph Extension A */ + ["\u34ED", "\u34ED"], /* CJK Ideograph Extension A */ + ["\u34EE", "\u34EE"], /* CJK Ideograph Extension A */ + ["\u34EF", "\u34EF"], /* CJK Ideograph Extension A */ + ["\u34F0", "\u34F0"], /* CJK Ideograph Extension A */ + ["\u34F1", "\u34F1"], /* CJK Ideograph Extension A */ + ["\u34F2", "\u34F2"], /* CJK Ideograph Extension A */ + ["\u34F3", "\u34F3"], /* CJK Ideograph Extension A */ + ["\u34F4", "\u34F4"], /* CJK Ideograph Extension A */ + ["\u34F5", "\u34F5"], /* CJK Ideograph Extension A */ + ["\u34F6", "\u34F6"], /* CJK Ideograph Extension A */ + ["\u34F7", "\u34F7"], /* CJK Ideograph Extension A */ + ["\u34F8", "\u34F8"], /* CJK Ideograph Extension A */ + ["\u34F9", "\u34F9"], /* CJK Ideograph Extension A */ + ["\u34FA", "\u34FA"], /* CJK Ideograph Extension A */ + ["\u34FB", "\u34FB"], /* CJK Ideograph Extension A */ + ["\u34FC", "\u34FC"], /* CJK Ideograph Extension A */ + ["\u34FD", "\u34FD"], /* CJK Ideograph Extension A */ + ["\u34FE", "\u34FE"], /* CJK Ideograph Extension A */ + ["\u34FF", "\u34FF"], /* CJK Ideograph Extension A */ + ["\u3500", "\u3500"], /* CJK Ideograph Extension A */ + ["\u3501", "\u3501"], /* CJK Ideograph Extension A */ + ["\u3502", "\u3502"], /* CJK Ideograph Extension A */ + ["\u3503", "\u3503"], /* CJK Ideograph Extension A */ + ["\u3504", "\u3504"], /* CJK Ideograph Extension A */ + ["\u3505", "\u3505"], /* CJK Ideograph Extension A */ + ["\u3506", "\u3506"], /* CJK Ideograph Extension A */ + ["\u3507", "\u3507"], /* CJK Ideograph Extension A */ + ["\u3508", "\u3508"], /* CJK Ideograph Extension A */ + ["\u3509", "\u3509"], /* CJK Ideograph Extension A */ + ["\u350A", "\u350A"], /* CJK Ideograph Extension A */ + ["\u350B", "\u350B"], /* CJK Ideograph Extension A */ + ["\u350C", "\u350C"], /* CJK Ideograph Extension A */ + ["\u350D", "\u350D"], /* CJK Ideograph Extension A */ + ["\u350E", "\u350E"], /* CJK Ideograph Extension A */ + ["\u350F", "\u350F"], /* CJK Ideograph Extension A */ + ["\u3510", "\u3510"], /* CJK Ideograph Extension A */ + ["\u3511", "\u3511"], /* CJK Ideograph Extension A */ + ["\u3512", "\u3512"], /* CJK Ideograph Extension A */ + ["\u3513", "\u3513"], /* CJK Ideograph Extension A */ + ["\u3514", "\u3514"], /* CJK Ideograph Extension A */ + ["\u3515", "\u3515"], /* CJK Ideograph Extension A */ + ["\u3516", "\u3516"], /* CJK Ideograph Extension A */ + ["\u3517", "\u3517"], /* CJK Ideograph Extension A */ + ["\u3518", "\u3518"], /* CJK Ideograph Extension A */ + ["\u3519", "\u3519"], /* CJK Ideograph Extension A */ + ["\u351A", "\u351A"], /* CJK Ideograph Extension A */ + ["\u351B", "\u351B"], /* CJK Ideograph Extension A */ + ["\u351C", "\u351C"], /* CJK Ideograph Extension A */ + ["\u351D", "\u351D"], /* CJK Ideograph Extension A */ + ["\u351E", "\u351E"], /* CJK Ideograph Extension A */ + ["\u351F", "\u351F"], /* CJK Ideograph Extension A */ + ["\u3520", "\u3520"], /* CJK Ideograph Extension A */ + ["\u3521", "\u3521"], /* CJK Ideograph Extension A */ + ["\u3522", "\u3522"], /* CJK Ideograph Extension A */ + ["\u3523", "\u3523"], /* CJK Ideograph Extension A */ + ["\u3524", "\u3524"], /* CJK Ideograph Extension A */ + ["\u3525", "\u3525"], /* CJK Ideograph Extension A */ + ["\u3526", "\u3526"], /* CJK Ideograph Extension A */ + ["\u3527", "\u3527"], /* CJK Ideograph Extension A */ + ["\u3528", "\u3528"], /* CJK Ideograph Extension A */ + ["\u3529", "\u3529"], /* CJK Ideograph Extension A */ + ["\u352A", "\u352A"], /* CJK Ideograph Extension A */ + ["\u352B", "\u352B"], /* CJK Ideograph Extension A */ + ["\u352C", "\u352C"], /* CJK Ideograph Extension A */ + ["\u352D", "\u352D"], /* CJK Ideograph Extension A */ + ["\u352E", "\u352E"], /* CJK Ideograph Extension A */ + ["\u352F", "\u352F"], /* CJK Ideograph Extension A */ + ["\u3530", "\u3530"], /* CJK Ideograph Extension A */ + ["\u3531", "\u3531"], /* CJK Ideograph Extension A */ + ["\u3532", "\u3532"], /* CJK Ideograph Extension A */ + ["\u3533", "\u3533"], /* CJK Ideograph Extension A */ + ["\u3534", "\u3534"], /* CJK Ideograph Extension A */ + ["\u3535", "\u3535"], /* CJK Ideograph Extension A */ + ["\u3536", "\u3536"], /* CJK Ideograph Extension A */ + ["\u3537", "\u3537"], /* CJK Ideograph Extension A */ + ["\u3538", "\u3538"], /* CJK Ideograph Extension A */ + ["\u3539", "\u3539"], /* CJK Ideograph Extension A */ + ["\u353A", "\u353A"], /* CJK Ideograph Extension A */ + ["\u353B", "\u353B"], /* CJK Ideograph Extension A */ + ["\u353C", "\u353C"], /* CJK Ideograph Extension A */ + ["\u353D", "\u353D"], /* CJK Ideograph Extension A */ + ["\u353E", "\u353E"], /* CJK Ideograph Extension A */ + ["\u353F", "\u353F"], /* CJK Ideograph Extension A */ + ["\u3540", "\u3540"], /* CJK Ideograph Extension A */ + ["\u3541", "\u3541"], /* CJK Ideograph Extension A */ + ["\u3542", "\u3542"], /* CJK Ideograph Extension A */ + ["\u3543", "\u3543"], /* CJK Ideograph Extension A */ + ["\u3544", "\u3544"], /* CJK Ideograph Extension A */ + ["\u3545", "\u3545"], /* CJK Ideograph Extension A */ + ["\u3546", "\u3546"], /* CJK Ideograph Extension A */ + ["\u3547", "\u3547"], /* CJK Ideograph Extension A */ + ["\u3548", "\u3548"], /* CJK Ideograph Extension A */ + ["\u3549", "\u3549"], /* CJK Ideograph Extension A */ + ["\u354A", "\u354A"], /* CJK Ideograph Extension A */ + ["\u354B", "\u354B"], /* CJK Ideograph Extension A */ + ["\u354C", "\u354C"], /* CJK Ideograph Extension A */ + ["\u354D", "\u354D"], /* CJK Ideograph Extension A */ + ["\u354E", "\u354E"], /* CJK Ideograph Extension A */ + ["\u354F", "\u354F"], /* CJK Ideograph Extension A */ + ["\u3550", "\u3550"], /* CJK Ideograph Extension A */ + ["\u3551", "\u3551"], /* CJK Ideograph Extension A */ + ["\u3552", "\u3552"], /* CJK Ideograph Extension A */ + ["\u3553", "\u3553"], /* CJK Ideograph Extension A */ + ["\u3554", "\u3554"], /* CJK Ideograph Extension A */ + ["\u3555", "\u3555"], /* CJK Ideograph Extension A */ + ["\u3556", "\u3556"], /* CJK Ideograph Extension A */ + ["\u3557", "\u3557"], /* CJK Ideograph Extension A */ + ["\u3558", "\u3558"], /* CJK Ideograph Extension A */ + ["\u3559", "\u3559"], /* CJK Ideograph Extension A */ + ["\u355A", "\u355A"], /* CJK Ideograph Extension A */ + ["\u355B", "\u355B"], /* CJK Ideograph Extension A */ + ["\u355C", "\u355C"], /* CJK Ideograph Extension A */ + ["\u355D", "\u355D"], /* CJK Ideograph Extension A */ + ["\u355E", "\u355E"], /* CJK Ideograph Extension A */ + ["\u355F", "\u355F"], /* CJK Ideograph Extension A */ + ["\u3560", "\u3560"], /* CJK Ideograph Extension A */ + ["\u3561", "\u3561"], /* CJK Ideograph Extension A */ + ["\u3562", "\u3562"], /* CJK Ideograph Extension A */ + ["\u3563", "\u3563"], /* CJK Ideograph Extension A */ + ["\u3564", "\u3564"], /* CJK Ideograph Extension A */ + ["\u3565", "\u3565"], /* CJK Ideograph Extension A */ + ["\u3566", "\u3566"], /* CJK Ideograph Extension A */ + ["\u3567", "\u3567"], /* CJK Ideograph Extension A */ + ["\u3568", "\u3568"], /* CJK Ideograph Extension A */ + ["\u3569", "\u3569"], /* CJK Ideograph Extension A */ + ["\u356A", "\u356A"], /* CJK Ideograph Extension A */ + ["\u356B", "\u356B"], /* CJK Ideograph Extension A */ + ["\u356C", "\u356C"], /* CJK Ideograph Extension A */ + ["\u356D", "\u356D"], /* CJK Ideograph Extension A */ + ["\u356E", "\u356E"], /* CJK Ideograph Extension A */ + ["\u356F", "\u356F"], /* CJK Ideograph Extension A */ + ["\u3570", "\u3570"], /* CJK Ideograph Extension A */ + ["\u3571", "\u3571"], /* CJK Ideograph Extension A */ + ["\u3572", "\u3572"], /* CJK Ideograph Extension A */ + ["\u3573", "\u3573"], /* CJK Ideograph Extension A */ + ["\u3574", "\u3574"], /* CJK Ideograph Extension A */ + ["\u3575", "\u3575"], /* CJK Ideograph Extension A */ + ["\u3576", "\u3576"], /* CJK Ideograph Extension A */ + ["\u3577", "\u3577"], /* CJK Ideograph Extension A */ + ["\u3578", "\u3578"], /* CJK Ideograph Extension A */ + ["\u3579", "\u3579"], /* CJK Ideograph Extension A */ + ["\u357A", "\u357A"], /* CJK Ideograph Extension A */ + ["\u357B", "\u357B"], /* CJK Ideograph Extension A */ + ["\u357C", "\u357C"], /* CJK Ideograph Extension A */ + ["\u357D", "\u357D"], /* CJK Ideograph Extension A */ + ["\u357E", "\u357E"], /* CJK Ideograph Extension A */ + ["\u357F", "\u357F"], /* CJK Ideograph Extension A */ + ["\u3580", "\u3580"], /* CJK Ideograph Extension A */ + ["\u3581", "\u3581"], /* CJK Ideograph Extension A */ + ["\u3582", "\u3582"], /* CJK Ideograph Extension A */ + ["\u3583", "\u3583"], /* CJK Ideograph Extension A */ + ["\u3584", "\u3584"], /* CJK Ideograph Extension A */ + ["\u3585", "\u3585"], /* CJK Ideograph Extension A */ + ["\u3586", "\u3586"], /* CJK Ideograph Extension A */ + ["\u3587", "\u3587"], /* CJK Ideograph Extension A */ + ["\u3588", "\u3588"], /* CJK Ideograph Extension A */ + ["\u3589", "\u3589"], /* CJK Ideograph Extension A */ + ["\u358A", "\u358A"], /* CJK Ideograph Extension A */ + ["\u358B", "\u358B"], /* CJK Ideograph Extension A */ + ["\u358C", "\u358C"], /* CJK Ideograph Extension A */ + ["\u358D", "\u358D"], /* CJK Ideograph Extension A */ + ["\u358E", "\u358E"], /* CJK Ideograph Extension A */ + ["\u358F", "\u358F"], /* CJK Ideograph Extension A */ + ["\u3590", "\u3590"], /* CJK Ideograph Extension A */ + ["\u3591", "\u3591"], /* CJK Ideograph Extension A */ + ["\u3592", "\u3592"], /* CJK Ideograph Extension A */ + ["\u3593", "\u3593"], /* CJK Ideograph Extension A */ + ["\u3594", "\u3594"], /* CJK Ideograph Extension A */ + ["\u3595", "\u3595"], /* CJK Ideograph Extension A */ + ["\u3596", "\u3596"], /* CJK Ideograph Extension A */ + ["\u3597", "\u3597"], /* CJK Ideograph Extension A */ + ["\u3598", "\u3598"], /* CJK Ideograph Extension A */ + ["\u3599", "\u3599"], /* CJK Ideograph Extension A */ + ["\u359A", "\u359A"], /* CJK Ideograph Extension A */ + ["\u359B", "\u359B"], /* CJK Ideograph Extension A */ + ["\u359C", "\u359C"], /* CJK Ideograph Extension A */ + ["\u359D", "\u359D"], /* CJK Ideograph Extension A */ + ["\u359E", "\u359E"], /* CJK Ideograph Extension A */ + ["\u359F", "\u359F"], /* CJK Ideograph Extension A */ + ["\u35A0", "\u35A0"], /* CJK Ideograph Extension A */ + ["\u35A1", "\u35A1"], /* CJK Ideograph Extension A */ + ["\u35A2", "\u35A2"], /* CJK Ideograph Extension A */ + ["\u35A3", "\u35A3"], /* CJK Ideograph Extension A */ + ["\u35A4", "\u35A4"], /* CJK Ideograph Extension A */ + ["\u35A5", "\u35A5"], /* CJK Ideograph Extension A */ + ["\u35A6", "\u35A6"], /* CJK Ideograph Extension A */ + ["\u35A7", "\u35A7"], /* CJK Ideograph Extension A */ + ["\u35A8", "\u35A8"], /* CJK Ideograph Extension A */ + ["\u35A9", "\u35A9"], /* CJK Ideograph Extension A */ + ["\u35AA", "\u35AA"], /* CJK Ideograph Extension A */ + ["\u35AB", "\u35AB"], /* CJK Ideograph Extension A */ + ["\u35AC", "\u35AC"], /* CJK Ideograph Extension A */ + ["\u35AD", "\u35AD"], /* CJK Ideograph Extension A */ + ["\u35AE", "\u35AE"], /* CJK Ideograph Extension A */ + ["\u35AF", "\u35AF"], /* CJK Ideograph Extension A */ + ["\u35B0", "\u35B0"], /* CJK Ideograph Extension A */ + ["\u35B1", "\u35B1"], /* CJK Ideograph Extension A */ + ["\u35B2", "\u35B2"], /* CJK Ideograph Extension A */ + ["\u35B3", "\u35B3"], /* CJK Ideograph Extension A */ + ["\u35B4", "\u35B4"], /* CJK Ideograph Extension A */ + ["\u35B5", "\u35B5"], /* CJK Ideograph Extension A */ + ["\u35B6", "\u35B6"], /* CJK Ideograph Extension A */ + ["\u35B7", "\u35B7"], /* CJK Ideograph Extension A */ + ["\u35B8", "\u35B8"], /* CJK Ideograph Extension A */ + ["\u35B9", "\u35B9"], /* CJK Ideograph Extension A */ + ["\u35BA", "\u35BA"], /* CJK Ideograph Extension A */ + ["\u35BB", "\u35BB"], /* CJK Ideograph Extension A */ + ["\u35BC", "\u35BC"], /* CJK Ideograph Extension A */ + ["\u35BD", "\u35BD"], /* CJK Ideograph Extension A */ + ["\u35BE", "\u35BE"], /* CJK Ideograph Extension A */ + ["\u35BF", "\u35BF"], /* CJK Ideograph Extension A */ + ["\u35C0", "\u35C0"], /* CJK Ideograph Extension A */ + ["\u35C1", "\u35C1"], /* CJK Ideograph Extension A */ + ["\u35C2", "\u35C2"], /* CJK Ideograph Extension A */ + ["\u35C3", "\u35C3"], /* CJK Ideograph Extension A */ + ["\u35C4", "\u35C4"], /* CJK Ideograph Extension A */ + ["\u35C5", "\u35C5"], /* CJK Ideograph Extension A */ + ["\u35C6", "\u35C6"], /* CJK Ideograph Extension A */ + ["\u35C7", "\u35C7"], /* CJK Ideograph Extension A */ + ["\u35C8", "\u35C8"], /* CJK Ideograph Extension A */ + ["\u35C9", "\u35C9"], /* CJK Ideograph Extension A */ + ["\u35CA", "\u35CA"], /* CJK Ideograph Extension A */ + ["\u35CB", "\u35CB"], /* CJK Ideograph Extension A */ + ["\u35CC", "\u35CC"], /* CJK Ideograph Extension A */ + ["\u35CD", "\u35CD"], /* CJK Ideograph Extension A */ + ["\u35CE", "\u35CE"], /* CJK Ideograph Extension A */ + ["\u35CF", "\u35CF"], /* CJK Ideograph Extension A */ + ["\u35D0", "\u35D0"], /* CJK Ideograph Extension A */ + ["\u35D1", "\u35D1"], /* CJK Ideograph Extension A */ + ["\u35D2", "\u35D2"], /* CJK Ideograph Extension A */ + ["\u35D3", "\u35D3"], /* CJK Ideograph Extension A */ + ["\u35D4", "\u35D4"], /* CJK Ideograph Extension A */ + ["\u35D5", "\u35D5"], /* CJK Ideograph Extension A */ + ["\u35D6", "\u35D6"], /* CJK Ideograph Extension A */ + ["\u35D7", "\u35D7"], /* CJK Ideograph Extension A */ + ["\u35D8", "\u35D8"], /* CJK Ideograph Extension A */ + ["\u35D9", "\u35D9"], /* CJK Ideograph Extension A */ + ["\u35DA", "\u35DA"], /* CJK Ideograph Extension A */ + ["\u35DB", "\u35DB"], /* CJK Ideograph Extension A */ + ["\u35DC", "\u35DC"], /* CJK Ideograph Extension A */ + ["\u35DD", "\u35DD"], /* CJK Ideograph Extension A */ + ["\u35DE", "\u35DE"], /* CJK Ideograph Extension A */ + ["\u35DF", "\u35DF"], /* CJK Ideograph Extension A */ + ["\u35E0", "\u35E0"], /* CJK Ideograph Extension A */ + ["\u35E1", "\u35E1"], /* CJK Ideograph Extension A */ + ["\u35E2", "\u35E2"], /* CJK Ideograph Extension A */ + ["\u35E3", "\u35E3"], /* CJK Ideograph Extension A */ + ["\u35E4", "\u35E4"], /* CJK Ideograph Extension A */ + ["\u35E5", "\u35E5"], /* CJK Ideograph Extension A */ + ["\u35E6", "\u35E6"], /* CJK Ideograph Extension A */ + ["\u35E7", "\u35E7"], /* CJK Ideograph Extension A */ + ["\u35E8", "\u35E8"], /* CJK Ideograph Extension A */ + ["\u35E9", "\u35E9"], /* CJK Ideograph Extension A */ + ["\u35EA", "\u35EA"], /* CJK Ideograph Extension A */ + ["\u35EB", "\u35EB"], /* CJK Ideograph Extension A */ + ["\u35EC", "\u35EC"], /* CJK Ideograph Extension A */ + ["\u35ED", "\u35ED"], /* CJK Ideograph Extension A */ + ["\u35EE", "\u35EE"], /* CJK Ideograph Extension A */ + ["\u35EF", "\u35EF"], /* CJK Ideograph Extension A */ + ["\u35F0", "\u35F0"], /* CJK Ideograph Extension A */ + ["\u35F1", "\u35F1"], /* CJK Ideograph Extension A */ + ["\u35F2", "\u35F2"], /* CJK Ideograph Extension A */ + ["\u35F3", "\u35F3"], /* CJK Ideograph Extension A */ + ["\u35F4", "\u35F4"], /* CJK Ideograph Extension A */ + ["\u35F5", "\u35F5"], /* CJK Ideograph Extension A */ + ["\u35F6", "\u35F6"], /* CJK Ideograph Extension A */ + ["\u35F7", "\u35F7"], /* CJK Ideograph Extension A */ + ["\u35F8", "\u35F8"], /* CJK Ideograph Extension A */ + ["\u35F9", "\u35F9"], /* CJK Ideograph Extension A */ + ["\u35FA", "\u35FA"], /* CJK Ideograph Extension A */ + ["\u35FB", "\u35FB"], /* CJK Ideograph Extension A */ + ["\u35FC", "\u35FC"], /* CJK Ideograph Extension A */ + ["\u35FD", "\u35FD"], /* CJK Ideograph Extension A */ + ["\u35FE", "\u35FE"], /* CJK Ideograph Extension A */ + ["\u35FF", "\u35FF"], /* CJK Ideograph Extension A */ + ["\u3600", "\u3600"], /* CJK Ideograph Extension A */ + ["\u3601", "\u3601"], /* CJK Ideograph Extension A */ + ["\u3602", "\u3602"], /* CJK Ideograph Extension A */ + ["\u3603", "\u3603"], /* CJK Ideograph Extension A */ + ["\u3604", "\u3604"], /* CJK Ideograph Extension A */ + ["\u3605", "\u3605"], /* CJK Ideograph Extension A */ + ["\u3606", "\u3606"], /* CJK Ideograph Extension A */ + ["\u3607", "\u3607"], /* CJK Ideograph Extension A */ + ["\u3608", "\u3608"], /* CJK Ideograph Extension A */ + ["\u3609", "\u3609"], /* CJK Ideograph Extension A */ + ["\u360A", "\u360A"], /* CJK Ideograph Extension A */ + ["\u360B", "\u360B"], /* CJK Ideograph Extension A */ + ["\u360C", "\u360C"], /* CJK Ideograph Extension A */ + ["\u360D", "\u360D"], /* CJK Ideograph Extension A */ + ["\u360E", "\u360E"], /* CJK Ideograph Extension A */ + ["\u360F", "\u360F"], /* CJK Ideograph Extension A */ + ["\u3610", "\u3610"], /* CJK Ideograph Extension A */ + ["\u3611", "\u3611"], /* CJK Ideograph Extension A */ + ["\u3612", "\u3612"], /* CJK Ideograph Extension A */ + ["\u3613", "\u3613"], /* CJK Ideograph Extension A */ + ["\u3614", "\u3614"], /* CJK Ideograph Extension A */ + ["\u3615", "\u3615"], /* CJK Ideograph Extension A */ + ["\u3616", "\u3616"], /* CJK Ideograph Extension A */ + ["\u3617", "\u3617"], /* CJK Ideograph Extension A */ + ["\u3618", "\u3618"], /* CJK Ideograph Extension A */ + ["\u3619", "\u3619"], /* CJK Ideograph Extension A */ + ["\u361A", "\u361A"], /* CJK Ideograph Extension A */ + ["\u361B", "\u361B"], /* CJK Ideograph Extension A */ + ["\u361C", "\u361C"], /* CJK Ideograph Extension A */ + ["\u361D", "\u361D"], /* CJK Ideograph Extension A */ + ["\u361E", "\u361E"], /* CJK Ideograph Extension A */ + ["\u361F", "\u361F"], /* CJK Ideograph Extension A */ + ["\u3620", "\u3620"], /* CJK Ideograph Extension A */ + ["\u3621", "\u3621"], /* CJK Ideograph Extension A */ + ["\u3622", "\u3622"], /* CJK Ideograph Extension A */ + ["\u3623", "\u3623"], /* CJK Ideograph Extension A */ + ["\u3624", "\u3624"], /* CJK Ideograph Extension A */ + ["\u3625", "\u3625"], /* CJK Ideograph Extension A */ + ["\u3626", "\u3626"], /* CJK Ideograph Extension A */ + ["\u3627", "\u3627"], /* CJK Ideograph Extension A */ + ["\u3628", "\u3628"], /* CJK Ideograph Extension A */ + ["\u3629", "\u3629"], /* CJK Ideograph Extension A */ + ["\u362A", "\u362A"], /* CJK Ideograph Extension A */ + ["\u362B", "\u362B"], /* CJK Ideograph Extension A */ + ["\u362C", "\u362C"], /* CJK Ideograph Extension A */ + ["\u362D", "\u362D"], /* CJK Ideograph Extension A */ + ["\u362E", "\u362E"], /* CJK Ideograph Extension A */ + ["\u362F", "\u362F"], /* CJK Ideograph Extension A */ + ["\u3630", "\u3630"], /* CJK Ideograph Extension A */ + ["\u3631", "\u3631"], /* CJK Ideograph Extension A */ + ["\u3632", "\u3632"], /* CJK Ideograph Extension A */ + ["\u3633", "\u3633"], /* CJK Ideograph Extension A */ + ["\u3634", "\u3634"], /* CJK Ideograph Extension A */ + ["\u3635", "\u3635"], /* CJK Ideograph Extension A */ + ["\u3636", "\u3636"], /* CJK Ideograph Extension A */ + ["\u3637", "\u3637"], /* CJK Ideograph Extension A */ + ["\u3638", "\u3638"], /* CJK Ideograph Extension A */ + ["\u3639", "\u3639"], /* CJK Ideograph Extension A */ + ["\u363A", "\u363A"], /* CJK Ideograph Extension A */ + ["\u363B", "\u363B"], /* CJK Ideograph Extension A */ + ["\u363C", "\u363C"], /* CJK Ideograph Extension A */ + ["\u363D", "\u363D"], /* CJK Ideograph Extension A */ + ["\u363E", "\u363E"], /* CJK Ideograph Extension A */ + ["\u363F", "\u363F"], /* CJK Ideograph Extension A */ + ["\u3640", "\u3640"], /* CJK Ideograph Extension A */ + ["\u3641", "\u3641"], /* CJK Ideograph Extension A */ + ["\u3642", "\u3642"], /* CJK Ideograph Extension A */ + ["\u3643", "\u3643"], /* CJK Ideograph Extension A */ + ["\u3644", "\u3644"], /* CJK Ideograph Extension A */ + ["\u3645", "\u3645"], /* CJK Ideograph Extension A */ + ["\u3646", "\u3646"], /* CJK Ideograph Extension A */ + ["\u3647", "\u3647"], /* CJK Ideograph Extension A */ + ["\u3648", "\u3648"], /* CJK Ideograph Extension A */ + ["\u3649", "\u3649"], /* CJK Ideograph Extension A */ + ["\u364A", "\u364A"], /* CJK Ideograph Extension A */ + ["\u364B", "\u364B"], /* CJK Ideograph Extension A */ + ["\u364C", "\u364C"], /* CJK Ideograph Extension A */ + ["\u364D", "\u364D"], /* CJK Ideograph Extension A */ + ["\u364E", "\u364E"], /* CJK Ideograph Extension A */ + ["\u364F", "\u364F"], /* CJK Ideograph Extension A */ + ["\u3650", "\u3650"], /* CJK Ideograph Extension A */ + ["\u3651", "\u3651"], /* CJK Ideograph Extension A */ + ["\u3652", "\u3652"], /* CJK Ideograph Extension A */ + ["\u3653", "\u3653"], /* CJK Ideograph Extension A */ + ["\u3654", "\u3654"], /* CJK Ideograph Extension A */ + ["\u3655", "\u3655"], /* CJK Ideograph Extension A */ + ["\u3656", "\u3656"], /* CJK Ideograph Extension A */ + ["\u3657", "\u3657"], /* CJK Ideograph Extension A */ + ["\u3658", "\u3658"], /* CJK Ideograph Extension A */ + ["\u3659", "\u3659"], /* CJK Ideograph Extension A */ + ["\u365A", "\u365A"], /* CJK Ideograph Extension A */ + ["\u365B", "\u365B"], /* CJK Ideograph Extension A */ + ["\u365C", "\u365C"], /* CJK Ideograph Extension A */ + ["\u365D", "\u365D"], /* CJK Ideograph Extension A */ + ["\u365E", "\u365E"], /* CJK Ideograph Extension A */ + ["\u365F", "\u365F"], /* CJK Ideograph Extension A */ + ["\u3660", "\u3660"], /* CJK Ideograph Extension A */ + ["\u3661", "\u3661"], /* CJK Ideograph Extension A */ + ["\u3662", "\u3662"], /* CJK Ideograph Extension A */ + ["\u3663", "\u3663"], /* CJK Ideograph Extension A */ + ["\u3664", "\u3664"], /* CJK Ideograph Extension A */ + ["\u3665", "\u3665"], /* CJK Ideograph Extension A */ + ["\u3666", "\u3666"], /* CJK Ideograph Extension A */ + ["\u3667", "\u3667"], /* CJK Ideograph Extension A */ + ["\u3668", "\u3668"], /* CJK Ideograph Extension A */ + ["\u3669", "\u3669"], /* CJK Ideograph Extension A */ + ["\u366A", "\u366A"], /* CJK Ideograph Extension A */ + ["\u366B", "\u366B"], /* CJK Ideograph Extension A */ + ["\u366C", "\u366C"], /* CJK Ideograph Extension A */ + ["\u366D", "\u366D"], /* CJK Ideograph Extension A */ + ["\u366E", "\u366E"], /* CJK Ideograph Extension A */ + ["\u366F", "\u366F"], /* CJK Ideograph Extension A */ + ["\u3670", "\u3670"], /* CJK Ideograph Extension A */ + ["\u3671", "\u3671"], /* CJK Ideograph Extension A */ + ["\u3672", "\u3672"], /* CJK Ideograph Extension A */ + ["\u3673", "\u3673"], /* CJK Ideograph Extension A */ + ["\u3674", "\u3674"], /* CJK Ideograph Extension A */ + ["\u3675", "\u3675"], /* CJK Ideograph Extension A */ + ["\u3676", "\u3676"], /* CJK Ideograph Extension A */ + ["\u3677", "\u3677"], /* CJK Ideograph Extension A */ + ["\u3678", "\u3678"], /* CJK Ideograph Extension A */ + ["\u3679", "\u3679"], /* CJK Ideograph Extension A */ + ["\u367A", "\u367A"], /* CJK Ideograph Extension A */ + ["\u367B", "\u367B"], /* CJK Ideograph Extension A */ + ["\u367C", "\u367C"], /* CJK Ideograph Extension A */ + ["\u367D", "\u367D"], /* CJK Ideograph Extension A */ + ["\u367E", "\u367E"], /* CJK Ideograph Extension A */ + ["\u367F", "\u367F"], /* CJK Ideograph Extension A */ + ["\u3680", "\u3680"], /* CJK Ideograph Extension A */ + ["\u3681", "\u3681"], /* CJK Ideograph Extension A */ + ["\u3682", "\u3682"], /* CJK Ideograph Extension A */ + ["\u3683", "\u3683"], /* CJK Ideograph Extension A */ + ["\u3684", "\u3684"], /* CJK Ideograph Extension A */ + ["\u3685", "\u3685"], /* CJK Ideograph Extension A */ + ["\u3686", "\u3686"], /* CJK Ideograph Extension A */ + ["\u3687", "\u3687"], /* CJK Ideograph Extension A */ + ["\u3688", "\u3688"], /* CJK Ideograph Extension A */ + ["\u3689", "\u3689"], /* CJK Ideograph Extension A */ + ["\u368A", "\u368A"], /* CJK Ideograph Extension A */ + ["\u368B", "\u368B"], /* CJK Ideograph Extension A */ + ["\u368C", "\u368C"], /* CJK Ideograph Extension A */ + ["\u368D", "\u368D"], /* CJK Ideograph Extension A */ + ["\u368E", "\u368E"], /* CJK Ideograph Extension A */ + ["\u368F", "\u368F"], /* CJK Ideograph Extension A */ + ["\u3690", "\u3690"], /* CJK Ideograph Extension A */ + ["\u3691", "\u3691"], /* CJK Ideograph Extension A */ + ["\u3692", "\u3692"], /* CJK Ideograph Extension A */ + ["\u3693", "\u3693"], /* CJK Ideograph Extension A */ + ["\u3694", "\u3694"], /* CJK Ideograph Extension A */ + ["\u3695", "\u3695"], /* CJK Ideograph Extension A */ + ["\u3696", "\u3696"], /* CJK Ideograph Extension A */ + ["\u3697", "\u3697"], /* CJK Ideograph Extension A */ + ["\u3698", "\u3698"], /* CJK Ideograph Extension A */ + ["\u3699", "\u3699"], /* CJK Ideograph Extension A */ + ["\u369A", "\u369A"], /* CJK Ideograph Extension A */ + ["\u369B", "\u369B"], /* CJK Ideograph Extension A */ + ["\u369C", "\u369C"], /* CJK Ideograph Extension A */ + ["\u369D", "\u369D"], /* CJK Ideograph Extension A */ + ["\u369E", "\u369E"], /* CJK Ideograph Extension A */ + ["\u369F", "\u369F"], /* CJK Ideograph Extension A */ + ["\u36A0", "\u36A0"], /* CJK Ideograph Extension A */ + ["\u36A1", "\u36A1"], /* CJK Ideograph Extension A */ + ["\u36A2", "\u36A2"], /* CJK Ideograph Extension A */ + ["\u36A3", "\u36A3"], /* CJK Ideograph Extension A */ + ["\u36A4", "\u36A4"], /* CJK Ideograph Extension A */ + ["\u36A5", "\u36A5"], /* CJK Ideograph Extension A */ + ["\u36A6", "\u36A6"], /* CJK Ideograph Extension A */ + ["\u36A7", "\u36A7"], /* CJK Ideograph Extension A */ + ["\u36A8", "\u36A8"], /* CJK Ideograph Extension A */ + ["\u36A9", "\u36A9"], /* CJK Ideograph Extension A */ + ["\u36AA", "\u36AA"], /* CJK Ideograph Extension A */ + ["\u36AB", "\u36AB"], /* CJK Ideograph Extension A */ + ["\u36AC", "\u36AC"], /* CJK Ideograph Extension A */ + ["\u36AD", "\u36AD"], /* CJK Ideograph Extension A */ + ["\u36AE", "\u36AE"], /* CJK Ideograph Extension A */ + ["\u36AF", "\u36AF"], /* CJK Ideograph Extension A */ + ["\u36B0", "\u36B0"], /* CJK Ideograph Extension A */ + ["\u36B1", "\u36B1"], /* CJK Ideograph Extension A */ + ["\u36B2", "\u36B2"], /* CJK Ideograph Extension A */ + ["\u36B3", "\u36B3"], /* CJK Ideograph Extension A */ + ["\u36B4", "\u36B4"], /* CJK Ideograph Extension A */ + ["\u36B5", "\u36B5"], /* CJK Ideograph Extension A */ + ["\u36B6", "\u36B6"], /* CJK Ideograph Extension A */ + ["\u36B7", "\u36B7"], /* CJK Ideograph Extension A */ + ["\u36B8", "\u36B8"], /* CJK Ideograph Extension A */ + ["\u36B9", "\u36B9"], /* CJK Ideograph Extension A */ + ["\u36BA", "\u36BA"], /* CJK Ideograph Extension A */ + ["\u36BB", "\u36BB"], /* CJK Ideograph Extension A */ + ["\u36BC", "\u36BC"], /* CJK Ideograph Extension A */ + ["\u36BD", "\u36BD"], /* CJK Ideograph Extension A */ + ["\u36BE", "\u36BE"], /* CJK Ideograph Extension A */ + ["\u36BF", "\u36BF"], /* CJK Ideograph Extension A */ + ["\u36C0", "\u36C0"], /* CJK Ideograph Extension A */ + ["\u36C1", "\u36C1"], /* CJK Ideograph Extension A */ + ["\u36C2", "\u36C2"], /* CJK Ideograph Extension A */ + ["\u36C3", "\u36C3"], /* CJK Ideograph Extension A */ + ["\u36C4", "\u36C4"], /* CJK Ideograph Extension A */ + ["\u36C5", "\u36C5"], /* CJK Ideograph Extension A */ + ["\u36C6", "\u36C6"], /* CJK Ideograph Extension A */ + ["\u36C7", "\u36C7"], /* CJK Ideograph Extension A */ + ["\u36C8", "\u36C8"], /* CJK Ideograph Extension A */ + ["\u36C9", "\u36C9"], /* CJK Ideograph Extension A */ + ["\u36CA", "\u36CA"], /* CJK Ideograph Extension A */ + ["\u36CB", "\u36CB"], /* CJK Ideograph Extension A */ + ["\u36CC", "\u36CC"], /* CJK Ideograph Extension A */ + ["\u36CD", "\u36CD"], /* CJK Ideograph Extension A */ + ["\u36CE", "\u36CE"], /* CJK Ideograph Extension A */ + ["\u36CF", "\u36CF"], /* CJK Ideograph Extension A */ + ["\u36D0", "\u36D0"], /* CJK Ideograph Extension A */ + ["\u36D1", "\u36D1"], /* CJK Ideograph Extension A */ + ["\u36D2", "\u36D2"], /* CJK Ideograph Extension A */ + ["\u36D3", "\u36D3"], /* CJK Ideograph Extension A */ + ["\u36D4", "\u36D4"], /* CJK Ideograph Extension A */ + ["\u36D5", "\u36D5"], /* CJK Ideograph Extension A */ + ["\u36D6", "\u36D6"], /* CJK Ideograph Extension A */ + ["\u36D7", "\u36D7"], /* CJK Ideograph Extension A */ + ["\u36D8", "\u36D8"], /* CJK Ideograph Extension A */ + ["\u36D9", "\u36D9"], /* CJK Ideograph Extension A */ + ["\u36DA", "\u36DA"], /* CJK Ideograph Extension A */ + ["\u36DB", "\u36DB"], /* CJK Ideograph Extension A */ + ["\u36DC", "\u36DC"], /* CJK Ideograph Extension A */ + ["\u36DD", "\u36DD"], /* CJK Ideograph Extension A */ + ["\u36DE", "\u36DE"], /* CJK Ideograph Extension A */ + ["\u36DF", "\u36DF"], /* CJK Ideograph Extension A */ + ["\u36E0", "\u36E0"], /* CJK Ideograph Extension A */ + ["\u36E1", "\u36E1"], /* CJK Ideograph Extension A */ + ["\u36E2", "\u36E2"], /* CJK Ideograph Extension A */ + ["\u36E3", "\u36E3"], /* CJK Ideograph Extension A */ + ["\u36E4", "\u36E4"], /* CJK Ideograph Extension A */ + ["\u36E5", "\u36E5"], /* CJK Ideograph Extension A */ + ["\u36E6", "\u36E6"], /* CJK Ideograph Extension A */ + ["\u36E7", "\u36E7"], /* CJK Ideograph Extension A */ + ["\u36E8", "\u36E8"], /* CJK Ideograph Extension A */ + ["\u36E9", "\u36E9"], /* CJK Ideograph Extension A */ + ["\u36EA", "\u36EA"], /* CJK Ideograph Extension A */ + ["\u36EB", "\u36EB"], /* CJK Ideograph Extension A */ + ["\u36EC", "\u36EC"], /* CJK Ideograph Extension A */ + ["\u36ED", "\u36ED"], /* CJK Ideograph Extension A */ + ["\u36EE", "\u36EE"], /* CJK Ideograph Extension A */ + ["\u36EF", "\u36EF"], /* CJK Ideograph Extension A */ + ["\u36F0", "\u36F0"], /* CJK Ideograph Extension A */ + ["\u36F1", "\u36F1"], /* CJK Ideograph Extension A */ + ["\u36F2", "\u36F2"], /* CJK Ideograph Extension A */ + ["\u36F3", "\u36F3"], /* CJK Ideograph Extension A */ + ["\u36F4", "\u36F4"], /* CJK Ideograph Extension A */ + ["\u36F5", "\u36F5"], /* CJK Ideograph Extension A */ + ["\u36F6", "\u36F6"], /* CJK Ideograph Extension A */ + ["\u36F7", "\u36F7"], /* CJK Ideograph Extension A */ + ["\u36F8", "\u36F8"], /* CJK Ideograph Extension A */ + ["\u36F9", "\u36F9"], /* CJK Ideograph Extension A */ + ["\u36FA", "\u36FA"], /* CJK Ideograph Extension A */ + ["\u36FB", "\u36FB"], /* CJK Ideograph Extension A */ + ["\u36FC", "\u36FC"], /* CJK Ideograph Extension A */ + ["\u36FD", "\u36FD"], /* CJK Ideograph Extension A */ + ["\u36FE", "\u36FE"], /* CJK Ideograph Extension A */ + ["\u36FF", "\u36FF"], /* CJK Ideograph Extension A */ + ["\u3700", "\u3700"], /* CJK Ideograph Extension A */ + ["\u3701", "\u3701"], /* CJK Ideograph Extension A */ + ["\u3702", "\u3702"], /* CJK Ideograph Extension A */ + ["\u3703", "\u3703"], /* CJK Ideograph Extension A */ + ["\u3704", "\u3704"], /* CJK Ideograph Extension A */ + ["\u3705", "\u3705"], /* CJK Ideograph Extension A */ + ["\u3706", "\u3706"], /* CJK Ideograph Extension A */ + ["\u3707", "\u3707"], /* CJK Ideograph Extension A */ + ["\u3708", "\u3708"], /* CJK Ideograph Extension A */ + ["\u3709", "\u3709"], /* CJK Ideograph Extension A */ + ["\u370A", "\u370A"], /* CJK Ideograph Extension A */ + ["\u370B", "\u370B"], /* CJK Ideograph Extension A */ + ["\u370C", "\u370C"], /* CJK Ideograph Extension A */ + ["\u370D", "\u370D"], /* CJK Ideograph Extension A */ + ["\u370E", "\u370E"], /* CJK Ideograph Extension A */ + ["\u370F", "\u370F"], /* CJK Ideograph Extension A */ + ["\u3710", "\u3710"], /* CJK Ideograph Extension A */ + ["\u3711", "\u3711"], /* CJK Ideograph Extension A */ + ["\u3712", "\u3712"], /* CJK Ideograph Extension A */ + ["\u3713", "\u3713"], /* CJK Ideograph Extension A */ + ["\u3714", "\u3714"], /* CJK Ideograph Extension A */ + ["\u3715", "\u3715"], /* CJK Ideograph Extension A */ + ["\u3716", "\u3716"], /* CJK Ideograph Extension A */ + ["\u3717", "\u3717"], /* CJK Ideograph Extension A */ + ["\u3718", "\u3718"], /* CJK Ideograph Extension A */ + ["\u3719", "\u3719"], /* CJK Ideograph Extension A */ + ["\u371A", "\u371A"], /* CJK Ideograph Extension A */ + ["\u371B", "\u371B"], /* CJK Ideograph Extension A */ + ["\u371C", "\u371C"], /* CJK Ideograph Extension A */ + ["\u371D", "\u371D"], /* CJK Ideograph Extension A */ + ["\u371E", "\u371E"], /* CJK Ideograph Extension A */ + ["\u371F", "\u371F"], /* CJK Ideograph Extension A */ + ["\u3720", "\u3720"], /* CJK Ideograph Extension A */ + ["\u3721", "\u3721"], /* CJK Ideograph Extension A */ + ["\u3722", "\u3722"], /* CJK Ideograph Extension A */ + ["\u3723", "\u3723"], /* CJK Ideograph Extension A */ + ["\u3724", "\u3724"], /* CJK Ideograph Extension A */ + ["\u3725", "\u3725"], /* CJK Ideograph Extension A */ + ["\u3726", "\u3726"], /* CJK Ideograph Extension A */ + ["\u3727", "\u3727"], /* CJK Ideograph Extension A */ + ["\u3728", "\u3728"], /* CJK Ideograph Extension A */ + ["\u3729", "\u3729"], /* CJK Ideograph Extension A */ + ["\u372A", "\u372A"], /* CJK Ideograph Extension A */ + ["\u372B", "\u372B"], /* CJK Ideograph Extension A */ + ["\u372C", "\u372C"], /* CJK Ideograph Extension A */ + ["\u372D", "\u372D"], /* CJK Ideograph Extension A */ + ["\u372E", "\u372E"], /* CJK Ideograph Extension A */ + ["\u372F", "\u372F"], /* CJK Ideograph Extension A */ + ["\u3730", "\u3730"], /* CJK Ideograph Extension A */ + ["\u3731", "\u3731"], /* CJK Ideograph Extension A */ + ["\u3732", "\u3732"], /* CJK Ideograph Extension A */ + ["\u3733", "\u3733"], /* CJK Ideograph Extension A */ + ["\u3734", "\u3734"], /* CJK Ideograph Extension A */ + ["\u3735", "\u3735"], /* CJK Ideograph Extension A */ + ["\u3736", "\u3736"], /* CJK Ideograph Extension A */ + ["\u3737", "\u3737"], /* CJK Ideograph Extension A */ + ["\u3738", "\u3738"], /* CJK Ideograph Extension A */ + ["\u3739", "\u3739"], /* CJK Ideograph Extension A */ + ["\u373A", "\u373A"], /* CJK Ideograph Extension A */ + ["\u373B", "\u373B"], /* CJK Ideograph Extension A */ + ["\u373C", "\u373C"], /* CJK Ideograph Extension A */ + ["\u373D", "\u373D"], /* CJK Ideograph Extension A */ + ["\u373E", "\u373E"], /* CJK Ideograph Extension A */ + ["\u373F", "\u373F"], /* CJK Ideograph Extension A */ + ["\u3740", "\u3740"], /* CJK Ideograph Extension A */ + ["\u3741", "\u3741"], /* CJK Ideograph Extension A */ + ["\u3742", "\u3742"], /* CJK Ideograph Extension A */ + ["\u3743", "\u3743"], /* CJK Ideograph Extension A */ + ["\u3744", "\u3744"], /* CJK Ideograph Extension A */ + ["\u3745", "\u3745"], /* CJK Ideograph Extension A */ + ["\u3746", "\u3746"], /* CJK Ideograph Extension A */ + ["\u3747", "\u3747"], /* CJK Ideograph Extension A */ + ["\u3748", "\u3748"], /* CJK Ideograph Extension A */ + ["\u3749", "\u3749"], /* CJK Ideograph Extension A */ + ["\u374A", "\u374A"], /* CJK Ideograph Extension A */ + ["\u374B", "\u374B"], /* CJK Ideograph Extension A */ + ["\u374C", "\u374C"], /* CJK Ideograph Extension A */ + ["\u374D", "\u374D"], /* CJK Ideograph Extension A */ + ["\u374E", "\u374E"], /* CJK Ideograph Extension A */ + ["\u374F", "\u374F"], /* CJK Ideograph Extension A */ + ["\u3750", "\u3750"], /* CJK Ideograph Extension A */ + ["\u3751", "\u3751"], /* CJK Ideograph Extension A */ + ["\u3752", "\u3752"], /* CJK Ideograph Extension A */ + ["\u3753", "\u3753"], /* CJK Ideograph Extension A */ + ["\u3754", "\u3754"], /* CJK Ideograph Extension A */ + ["\u3755", "\u3755"], /* CJK Ideograph Extension A */ + ["\u3756", "\u3756"], /* CJK Ideograph Extension A */ + ["\u3757", "\u3757"], /* CJK Ideograph Extension A */ + ["\u3758", "\u3758"], /* CJK Ideograph Extension A */ + ["\u3759", "\u3759"], /* CJK Ideograph Extension A */ + ["\u375A", "\u375A"], /* CJK Ideograph Extension A */ + ["\u375B", "\u375B"], /* CJK Ideograph Extension A */ + ["\u375C", "\u375C"], /* CJK Ideograph Extension A */ + ["\u375D", "\u375D"], /* CJK Ideograph Extension A */ + ["\u375E", "\u375E"], /* CJK Ideograph Extension A */ + ["\u375F", "\u375F"], /* CJK Ideograph Extension A */ + ["\u3760", "\u3760"], /* CJK Ideograph Extension A */ + ["\u3761", "\u3761"], /* CJK Ideograph Extension A */ + ["\u3762", "\u3762"], /* CJK Ideograph Extension A */ + ["\u3763", "\u3763"], /* CJK Ideograph Extension A */ + ["\u3764", "\u3764"], /* CJK Ideograph Extension A */ + ["\u3765", "\u3765"], /* CJK Ideograph Extension A */ + ["\u3766", "\u3766"], /* CJK Ideograph Extension A */ + ["\u3767", "\u3767"], /* CJK Ideograph Extension A */ + ["\u3768", "\u3768"], /* CJK Ideograph Extension A */ + ["\u3769", "\u3769"], /* CJK Ideograph Extension A */ + ["\u376A", "\u376A"], /* CJK Ideograph Extension A */ + ["\u376B", "\u376B"], /* CJK Ideograph Extension A */ + ["\u376C", "\u376C"], /* CJK Ideograph Extension A */ + ["\u376D", "\u376D"], /* CJK Ideograph Extension A */ + ["\u376E", "\u376E"], /* CJK Ideograph Extension A */ + ["\u376F", "\u376F"], /* CJK Ideograph Extension A */ + ["\u3770", "\u3770"], /* CJK Ideograph Extension A */ + ["\u3771", "\u3771"], /* CJK Ideograph Extension A */ + ["\u3772", "\u3772"], /* CJK Ideograph Extension A */ + ["\u3773", "\u3773"], /* CJK Ideograph Extension A */ + ["\u3774", "\u3774"], /* CJK Ideograph Extension A */ + ["\u3775", "\u3775"], /* CJK Ideograph Extension A */ + ["\u3776", "\u3776"], /* CJK Ideograph Extension A */ + ["\u3777", "\u3777"], /* CJK Ideograph Extension A */ + ["\u3778", "\u3778"], /* CJK Ideograph Extension A */ + ["\u3779", "\u3779"], /* CJK Ideograph Extension A */ + ["\u377A", "\u377A"], /* CJK Ideograph Extension A */ + ["\u377B", "\u377B"], /* CJK Ideograph Extension A */ + ["\u377C", "\u377C"], /* CJK Ideograph Extension A */ + ["\u377D", "\u377D"], /* CJK Ideograph Extension A */ + ["\u377E", "\u377E"], /* CJK Ideograph Extension A */ + ["\u377F", "\u377F"], /* CJK Ideograph Extension A */ + ["\u3780", "\u3780"], /* CJK Ideograph Extension A */ + ["\u3781", "\u3781"], /* CJK Ideograph Extension A */ + ["\u3782", "\u3782"], /* CJK Ideograph Extension A */ + ["\u3783", "\u3783"], /* CJK Ideograph Extension A */ + ["\u3784", "\u3784"], /* CJK Ideograph Extension A */ + ["\u3785", "\u3785"], /* CJK Ideograph Extension A */ + ["\u3786", "\u3786"], /* CJK Ideograph Extension A */ + ["\u3787", "\u3787"], /* CJK Ideograph Extension A */ + ["\u3788", "\u3788"], /* CJK Ideograph Extension A */ + ["\u3789", "\u3789"], /* CJK Ideograph Extension A */ + ["\u378A", "\u378A"], /* CJK Ideograph Extension A */ + ["\u378B", "\u378B"], /* CJK Ideograph Extension A */ + ["\u378C", "\u378C"], /* CJK Ideograph Extension A */ + ["\u378D", "\u378D"], /* CJK Ideograph Extension A */ + ["\u378E", "\u378E"], /* CJK Ideograph Extension A */ + ["\u378F", "\u378F"], /* CJK Ideograph Extension A */ + ["\u3790", "\u3790"], /* CJK Ideograph Extension A */ + ["\u3791", "\u3791"], /* CJK Ideograph Extension A */ + ["\u3792", "\u3792"], /* CJK Ideograph Extension A */ + ["\u3793", "\u3793"], /* CJK Ideograph Extension A */ + ["\u3794", "\u3794"], /* CJK Ideograph Extension A */ + ["\u3795", "\u3795"], /* CJK Ideograph Extension A */ + ["\u3796", "\u3796"], /* CJK Ideograph Extension A */ + ["\u3797", "\u3797"], /* CJK Ideograph Extension A */ + ["\u3798", "\u3798"], /* CJK Ideograph Extension A */ + ["\u3799", "\u3799"], /* CJK Ideograph Extension A */ + ["\u379A", "\u379A"], /* CJK Ideograph Extension A */ + ["\u379B", "\u379B"], /* CJK Ideograph Extension A */ + ["\u379C", "\u379C"], /* CJK Ideograph Extension A */ + ["\u379D", "\u379D"], /* CJK Ideograph Extension A */ + ["\u379E", "\u379E"], /* CJK Ideograph Extension A */ + ["\u379F", "\u379F"], /* CJK Ideograph Extension A */ + ["\u37A0", "\u37A0"], /* CJK Ideograph Extension A */ + ["\u37A1", "\u37A1"], /* CJK Ideograph Extension A */ + ["\u37A2", "\u37A2"], /* CJK Ideograph Extension A */ + ["\u37A3", "\u37A3"], /* CJK Ideograph Extension A */ + ["\u37A4", "\u37A4"], /* CJK Ideograph Extension A */ + ["\u37A5", "\u37A5"], /* CJK Ideograph Extension A */ + ["\u37A6", "\u37A6"], /* CJK Ideograph Extension A */ + ["\u37A7", "\u37A7"], /* CJK Ideograph Extension A */ + ["\u37A8", "\u37A8"], /* CJK Ideograph Extension A */ + ["\u37A9", "\u37A9"], /* CJK Ideograph Extension A */ + ["\u37AA", "\u37AA"], /* CJK Ideograph Extension A */ + ["\u37AB", "\u37AB"], /* CJK Ideograph Extension A */ + ["\u37AC", "\u37AC"], /* CJK Ideograph Extension A */ + ["\u37AD", "\u37AD"], /* CJK Ideograph Extension A */ + ["\u37AE", "\u37AE"], /* CJK Ideograph Extension A */ + ["\u37AF", "\u37AF"], /* CJK Ideograph Extension A */ + ["\u37B0", "\u37B0"], /* CJK Ideograph Extension A */ + ["\u37B1", "\u37B1"], /* CJK Ideograph Extension A */ + ["\u37B2", "\u37B2"], /* CJK Ideograph Extension A */ + ["\u37B3", "\u37B3"], /* CJK Ideograph Extension A */ + ["\u37B4", "\u37B4"], /* CJK Ideograph Extension A */ + ["\u37B5", "\u37B5"], /* CJK Ideograph Extension A */ + ["\u37B6", "\u37B6"], /* CJK Ideograph Extension A */ + ["\u37B7", "\u37B7"], /* CJK Ideograph Extension A */ + ["\u37B8", "\u37B8"], /* CJK Ideograph Extension A */ + ["\u37B9", "\u37B9"], /* CJK Ideograph Extension A */ + ["\u37BA", "\u37BA"], /* CJK Ideograph Extension A */ + ["\u37BB", "\u37BB"], /* CJK Ideograph Extension A */ + ["\u37BC", "\u37BC"], /* CJK Ideograph Extension A */ + ["\u37BD", "\u37BD"], /* CJK Ideograph Extension A */ + ["\u37BE", "\u37BE"], /* CJK Ideograph Extension A */ + ["\u37BF", "\u37BF"], /* CJK Ideograph Extension A */ + ["\u37C0", "\u37C0"], /* CJK Ideograph Extension A */ + ["\u37C1", "\u37C1"], /* CJK Ideograph Extension A */ + ["\u37C2", "\u37C2"], /* CJK Ideograph Extension A */ + ["\u37C3", "\u37C3"], /* CJK Ideograph Extension A */ + ["\u37C4", "\u37C4"], /* CJK Ideograph Extension A */ + ["\u37C5", "\u37C5"], /* CJK Ideograph Extension A */ + ["\u37C6", "\u37C6"], /* CJK Ideograph Extension A */ + ["\u37C7", "\u37C7"], /* CJK Ideograph Extension A */ + ["\u37C8", "\u37C8"], /* CJK Ideograph Extension A */ + ["\u37C9", "\u37C9"], /* CJK Ideograph Extension A */ + ["\u37CA", "\u37CA"], /* CJK Ideograph Extension A */ + ["\u37CB", "\u37CB"], /* CJK Ideograph Extension A */ + ["\u37CC", "\u37CC"], /* CJK Ideograph Extension A */ + ["\u37CD", "\u37CD"], /* CJK Ideograph Extension A */ + ["\u37CE", "\u37CE"], /* CJK Ideograph Extension A */ + ["\u37CF", "\u37CF"], /* CJK Ideograph Extension A */ + ["\u37D0", "\u37D0"], /* CJK Ideograph Extension A */ + ["\u37D1", "\u37D1"], /* CJK Ideograph Extension A */ + ["\u37D2", "\u37D2"], /* CJK Ideograph Extension A */ + ["\u37D3", "\u37D3"], /* CJK Ideograph Extension A */ + ["\u37D4", "\u37D4"], /* CJK Ideograph Extension A */ + ["\u37D5", "\u37D5"], /* CJK Ideograph Extension A */ + ["\u37D6", "\u37D6"], /* CJK Ideograph Extension A */ + ["\u37D7", "\u37D7"], /* CJK Ideograph Extension A */ + ["\u37D8", "\u37D8"], /* CJK Ideograph Extension A */ + ["\u37D9", "\u37D9"], /* CJK Ideograph Extension A */ + ["\u37DA", "\u37DA"], /* CJK Ideograph Extension A */ + ["\u37DB", "\u37DB"], /* CJK Ideograph Extension A */ + ["\u37DC", "\u37DC"], /* CJK Ideograph Extension A */ + ["\u37DD", "\u37DD"], /* CJK Ideograph Extension A */ + ["\u37DE", "\u37DE"], /* CJK Ideograph Extension A */ + ["\u37DF", "\u37DF"], /* CJK Ideograph Extension A */ + ["\u37E0", "\u37E0"], /* CJK Ideograph Extension A */ + ["\u37E1", "\u37E1"], /* CJK Ideograph Extension A */ + ["\u37E2", "\u37E2"], /* CJK Ideograph Extension A */ + ["\u37E3", "\u37E3"], /* CJK Ideograph Extension A */ + ["\u37E4", "\u37E4"], /* CJK Ideograph Extension A */ + ["\u37E5", "\u37E5"], /* CJK Ideograph Extension A */ + ["\u37E6", "\u37E6"], /* CJK Ideograph Extension A */ + ["\u37E7", "\u37E7"], /* CJK Ideograph Extension A */ + ["\u37E8", "\u37E8"], /* CJK Ideograph Extension A */ + ["\u37E9", "\u37E9"], /* CJK Ideograph Extension A */ + ["\u37EA", "\u37EA"], /* CJK Ideograph Extension A */ + ["\u37EB", "\u37EB"], /* CJK Ideograph Extension A */ + ["\u37EC", "\u37EC"], /* CJK Ideograph Extension A */ + ["\u37ED", "\u37ED"], /* CJK Ideograph Extension A */ + ["\u37EE", "\u37EE"], /* CJK Ideograph Extension A */ + ["\u37EF", "\u37EF"], /* CJK Ideograph Extension A */ + ["\u37F0", "\u37F0"], /* CJK Ideograph Extension A */ + ["\u37F1", "\u37F1"], /* CJK Ideograph Extension A */ + ["\u37F2", "\u37F2"], /* CJK Ideograph Extension A */ + ["\u37F3", "\u37F3"], /* CJK Ideograph Extension A */ + ["\u37F4", "\u37F4"], /* CJK Ideograph Extension A */ + ["\u37F5", "\u37F5"], /* CJK Ideograph Extension A */ + ["\u37F6", "\u37F6"], /* CJK Ideograph Extension A */ + ["\u37F7", "\u37F7"], /* CJK Ideograph Extension A */ + ["\u37F8", "\u37F8"], /* CJK Ideograph Extension A */ + ["\u37F9", "\u37F9"], /* CJK Ideograph Extension A */ + ["\u37FA", "\u37FA"], /* CJK Ideograph Extension A */ + ["\u37FB", "\u37FB"], /* CJK Ideograph Extension A */ + ["\u37FC", "\u37FC"], /* CJK Ideograph Extension A */ + ["\u37FD", "\u37FD"], /* CJK Ideograph Extension A */ + ["\u37FE", "\u37FE"], /* CJK Ideograph Extension A */ + ["\u37FF", "\u37FF"], /* CJK Ideograph Extension A */ + ["\u3800", "\u3800"], /* CJK Ideograph Extension A */ + ["\u3801", "\u3801"], /* CJK Ideograph Extension A */ + ["\u3802", "\u3802"], /* CJK Ideograph Extension A */ + ["\u3803", "\u3803"], /* CJK Ideograph Extension A */ + ["\u3804", "\u3804"], /* CJK Ideograph Extension A */ + ["\u3805", "\u3805"], /* CJK Ideograph Extension A */ + ["\u3806", "\u3806"], /* CJK Ideograph Extension A */ + ["\u3807", "\u3807"], /* CJK Ideograph Extension A */ + ["\u3808", "\u3808"], /* CJK Ideograph Extension A */ + ["\u3809", "\u3809"], /* CJK Ideograph Extension A */ + ["\u380A", "\u380A"], /* CJK Ideograph Extension A */ + ["\u380B", "\u380B"], /* CJK Ideograph Extension A */ + ["\u380C", "\u380C"], /* CJK Ideograph Extension A */ + ["\u380D", "\u380D"], /* CJK Ideograph Extension A */ + ["\u380E", "\u380E"], /* CJK Ideograph Extension A */ + ["\u380F", "\u380F"], /* CJK Ideograph Extension A */ + ["\u3810", "\u3810"], /* CJK Ideograph Extension A */ + ["\u3811", "\u3811"], /* CJK Ideograph Extension A */ + ["\u3812", "\u3812"], /* CJK Ideograph Extension A */ + ["\u3813", "\u3813"], /* CJK Ideograph Extension A */ + ["\u3814", "\u3814"], /* CJK Ideograph Extension A */ + ["\u3815", "\u3815"], /* CJK Ideograph Extension A */ + ["\u3816", "\u3816"], /* CJK Ideograph Extension A */ + ["\u3817", "\u3817"], /* CJK Ideograph Extension A */ + ["\u3818", "\u3818"], /* CJK Ideograph Extension A */ + ["\u3819", "\u3819"], /* CJK Ideograph Extension A */ + ["\u381A", "\u381A"], /* CJK Ideograph Extension A */ + ["\u381B", "\u381B"], /* CJK Ideograph Extension A */ + ["\u381C", "\u381C"], /* CJK Ideograph Extension A */ + ["\u381D", "\u381D"], /* CJK Ideograph Extension A */ + ["\u381E", "\u381E"], /* CJK Ideograph Extension A */ + ["\u381F", "\u381F"], /* CJK Ideograph Extension A */ + ["\u3820", "\u3820"], /* CJK Ideograph Extension A */ + ["\u3821", "\u3821"], /* CJK Ideograph Extension A */ + ["\u3822", "\u3822"], /* CJK Ideograph Extension A */ + ["\u3823", "\u3823"], /* CJK Ideograph Extension A */ + ["\u3824", "\u3824"], /* CJK Ideograph Extension A */ + ["\u3825", "\u3825"], /* CJK Ideograph Extension A */ + ["\u3826", "\u3826"], /* CJK Ideograph Extension A */ + ["\u3827", "\u3827"], /* CJK Ideograph Extension A */ + ["\u3828", "\u3828"], /* CJK Ideograph Extension A */ + ["\u3829", "\u3829"], /* CJK Ideograph Extension A */ + ["\u382A", "\u382A"], /* CJK Ideograph Extension A */ + ["\u382B", "\u382B"], /* CJK Ideograph Extension A */ + ["\u382C", "\u382C"], /* CJK Ideograph Extension A */ + ["\u382D", "\u382D"], /* CJK Ideograph Extension A */ + ["\u382E", "\u382E"], /* CJK Ideograph Extension A */ + ["\u382F", "\u382F"], /* CJK Ideograph Extension A */ + ["\u3830", "\u3830"], /* CJK Ideograph Extension A */ + ["\u3831", "\u3831"], /* CJK Ideograph Extension A */ + ["\u3832", "\u3832"], /* CJK Ideograph Extension A */ + ["\u3833", "\u3833"], /* CJK Ideograph Extension A */ + ["\u3834", "\u3834"], /* CJK Ideograph Extension A */ + ["\u3835", "\u3835"], /* CJK Ideograph Extension A */ + ["\u3836", "\u3836"], /* CJK Ideograph Extension A */ + ["\u3837", "\u3837"], /* CJK Ideograph Extension A */ + ["\u3838", "\u3838"], /* CJK Ideograph Extension A */ + ["\u3839", "\u3839"], /* CJK Ideograph Extension A */ + ["\u383A", "\u383A"], /* CJK Ideograph Extension A */ + ["\u383B", "\u383B"], /* CJK Ideograph Extension A */ + ["\u383C", "\u383C"], /* CJK Ideograph Extension A */ + ["\u383D", "\u383D"], /* CJK Ideograph Extension A */ + ["\u383E", "\u383E"], /* CJK Ideograph Extension A */ + ["\u383F", "\u383F"], /* CJK Ideograph Extension A */ + ["\u3840", "\u3840"], /* CJK Ideograph Extension A */ + ["\u3841", "\u3841"], /* CJK Ideograph Extension A */ + ["\u3842", "\u3842"], /* CJK Ideograph Extension A */ + ["\u3843", "\u3843"], /* CJK Ideograph Extension A */ + ["\u3844", "\u3844"], /* CJK Ideograph Extension A */ + ["\u3845", "\u3845"], /* CJK Ideograph Extension A */ + ["\u3846", "\u3846"], /* CJK Ideograph Extension A */ + ["\u3847", "\u3847"], /* CJK Ideograph Extension A */ + ["\u3848", "\u3848"], /* CJK Ideograph Extension A */ + ["\u3849", "\u3849"], /* CJK Ideograph Extension A */ + ["\u384A", "\u384A"], /* CJK Ideograph Extension A */ + ["\u384B", "\u384B"], /* CJK Ideograph Extension A */ + ["\u384C", "\u384C"], /* CJK Ideograph Extension A */ + ["\u384D", "\u384D"], /* CJK Ideograph Extension A */ + ["\u384E", "\u384E"], /* CJK Ideograph Extension A */ + ["\u384F", "\u384F"], /* CJK Ideograph Extension A */ + ["\u3850", "\u3850"], /* CJK Ideograph Extension A */ + ["\u3851", "\u3851"], /* CJK Ideograph Extension A */ + ["\u3852", "\u3852"], /* CJK Ideograph Extension A */ + ["\u3853", "\u3853"], /* CJK Ideograph Extension A */ + ["\u3854", "\u3854"], /* CJK Ideograph Extension A */ + ["\u3855", "\u3855"], /* CJK Ideograph Extension A */ + ["\u3856", "\u3856"], /* CJK Ideograph Extension A */ + ["\u3857", "\u3857"], /* CJK Ideograph Extension A */ + ["\u3858", "\u3858"], /* CJK Ideograph Extension A */ + ["\u3859", "\u3859"], /* CJK Ideograph Extension A */ + ["\u385A", "\u385A"], /* CJK Ideograph Extension A */ + ["\u385B", "\u385B"], /* CJK Ideograph Extension A */ + ["\u385C", "\u385C"], /* CJK Ideograph Extension A */ + ["\u385D", "\u385D"], /* CJK Ideograph Extension A */ + ["\u385E", "\u385E"], /* CJK Ideograph Extension A */ + ["\u385F", "\u385F"], /* CJK Ideograph Extension A */ + ["\u3860", "\u3860"], /* CJK Ideograph Extension A */ + ["\u3861", "\u3861"], /* CJK Ideograph Extension A */ + ["\u3862", "\u3862"], /* CJK Ideograph Extension A */ + ["\u3863", "\u3863"], /* CJK Ideograph Extension A */ + ["\u3864", "\u3864"], /* CJK Ideograph Extension A */ + ["\u3865", "\u3865"], /* CJK Ideograph Extension A */ + ["\u3866", "\u3866"], /* CJK Ideograph Extension A */ + ["\u3867", "\u3867"], /* CJK Ideograph Extension A */ + ["\u3868", "\u3868"], /* CJK Ideograph Extension A */ + ["\u3869", "\u3869"], /* CJK Ideograph Extension A */ + ["\u386A", "\u386A"], /* CJK Ideograph Extension A */ + ["\u386B", "\u386B"], /* CJK Ideograph Extension A */ + ["\u386C", "\u386C"], /* CJK Ideograph Extension A */ + ["\u386D", "\u386D"], /* CJK Ideograph Extension A */ + ["\u386E", "\u386E"], /* CJK Ideograph Extension A */ + ["\u386F", "\u386F"], /* CJK Ideograph Extension A */ + ["\u3870", "\u3870"], /* CJK Ideograph Extension A */ + ["\u3871", "\u3871"], /* CJK Ideograph Extension A */ + ["\u3872", "\u3872"], /* CJK Ideograph Extension A */ + ["\u3873", "\u3873"], /* CJK Ideograph Extension A */ + ["\u3874", "\u3874"], /* CJK Ideograph Extension A */ + ["\u3875", "\u3875"], /* CJK Ideograph Extension A */ + ["\u3876", "\u3876"], /* CJK Ideograph Extension A */ + ["\u3877", "\u3877"], /* CJK Ideograph Extension A */ + ["\u3878", "\u3878"], /* CJK Ideograph Extension A */ + ["\u3879", "\u3879"], /* CJK Ideograph Extension A */ + ["\u387A", "\u387A"], /* CJK Ideograph Extension A */ + ["\u387B", "\u387B"], /* CJK Ideograph Extension A */ + ["\u387C", "\u387C"], /* CJK Ideograph Extension A */ + ["\u387D", "\u387D"], /* CJK Ideograph Extension A */ + ["\u387E", "\u387E"], /* CJK Ideograph Extension A */ + ["\u387F", "\u387F"], /* CJK Ideograph Extension A */ + ["\u3880", "\u3880"], /* CJK Ideograph Extension A */ + ["\u3881", "\u3881"], /* CJK Ideograph Extension A */ + ["\u3882", "\u3882"], /* CJK Ideograph Extension A */ + ["\u3883", "\u3883"], /* CJK Ideograph Extension A */ + ["\u3884", "\u3884"], /* CJK Ideograph Extension A */ + ["\u3885", "\u3885"], /* CJK Ideograph Extension A */ + ["\u3886", "\u3886"], /* CJK Ideograph Extension A */ + ["\u3887", "\u3887"], /* CJK Ideograph Extension A */ + ["\u3888", "\u3888"], /* CJK Ideograph Extension A */ + ["\u3889", "\u3889"], /* CJK Ideograph Extension A */ + ["\u388A", "\u388A"], /* CJK Ideograph Extension A */ + ["\u388B", "\u388B"], /* CJK Ideograph Extension A */ + ["\u388C", "\u388C"], /* CJK Ideograph Extension A */ + ["\u388D", "\u388D"], /* CJK Ideograph Extension A */ + ["\u388E", "\u388E"], /* CJK Ideograph Extension A */ + ["\u388F", "\u388F"], /* CJK Ideograph Extension A */ + ["\u3890", "\u3890"], /* CJK Ideograph Extension A */ + ["\u3891", "\u3891"], /* CJK Ideograph Extension A */ + ["\u3892", "\u3892"], /* CJK Ideograph Extension A */ + ["\u3893", "\u3893"], /* CJK Ideograph Extension A */ + ["\u3894", "\u3894"], /* CJK Ideograph Extension A */ + ["\u3895", "\u3895"], /* CJK Ideograph Extension A */ + ["\u3896", "\u3896"], /* CJK Ideograph Extension A */ + ["\u3897", "\u3897"], /* CJK Ideograph Extension A */ + ["\u3898", "\u3898"], /* CJK Ideograph Extension A */ + ["\u3899", "\u3899"], /* CJK Ideograph Extension A */ + ["\u389A", "\u389A"], /* CJK Ideograph Extension A */ + ["\u389B", "\u389B"], /* CJK Ideograph Extension A */ + ["\u389C", "\u389C"], /* CJK Ideograph Extension A */ + ["\u389D", "\u389D"], /* CJK Ideograph Extension A */ + ["\u389E", "\u389E"], /* CJK Ideograph Extension A */ + ["\u389F", "\u389F"], /* CJK Ideograph Extension A */ + ["\u38A0", "\u38A0"], /* CJK Ideograph Extension A */ + ["\u38A1", "\u38A1"], /* CJK Ideograph Extension A */ + ["\u38A2", "\u38A2"], /* CJK Ideograph Extension A */ + ["\u38A3", "\u38A3"], /* CJK Ideograph Extension A */ + ["\u38A4", "\u38A4"], /* CJK Ideograph Extension A */ + ["\u38A5", "\u38A5"], /* CJK Ideograph Extension A */ + ["\u38A6", "\u38A6"], /* CJK Ideograph Extension A */ + ["\u38A7", "\u38A7"], /* CJK Ideograph Extension A */ + ["\u38A8", "\u38A8"], /* CJK Ideograph Extension A */ + ["\u38A9", "\u38A9"], /* CJK Ideograph Extension A */ + ["\u38AA", "\u38AA"], /* CJK Ideograph Extension A */ + ["\u38AB", "\u38AB"], /* CJK Ideograph Extension A */ + ["\u38AC", "\u38AC"], /* CJK Ideograph Extension A */ + ["\u38AD", "\u38AD"], /* CJK Ideograph Extension A */ + ["\u38AE", "\u38AE"], /* CJK Ideograph Extension A */ + ["\u38AF", "\u38AF"], /* CJK Ideograph Extension A */ + ["\u38B0", "\u38B0"], /* CJK Ideograph Extension A */ + ["\u38B1", "\u38B1"], /* CJK Ideograph Extension A */ + ["\u38B2", "\u38B2"], /* CJK Ideograph Extension A */ + ["\u38B3", "\u38B3"], /* CJK Ideograph Extension A */ + ["\u38B4", "\u38B4"], /* CJK Ideograph Extension A */ + ["\u38B5", "\u38B5"], /* CJK Ideograph Extension A */ + ["\u38B6", "\u38B6"], /* CJK Ideograph Extension A */ + ["\u38B7", "\u38B7"], /* CJK Ideograph Extension A */ + ["\u38B8", "\u38B8"], /* CJK Ideograph Extension A */ + ["\u38B9", "\u38B9"], /* CJK Ideograph Extension A */ + ["\u38BA", "\u38BA"], /* CJK Ideograph Extension A */ + ["\u38BB", "\u38BB"], /* CJK Ideograph Extension A */ + ["\u38BC", "\u38BC"], /* CJK Ideograph Extension A */ + ["\u38BD", "\u38BD"], /* CJK Ideograph Extension A */ + ["\u38BE", "\u38BE"], /* CJK Ideograph Extension A */ + ["\u38BF", "\u38BF"], /* CJK Ideograph Extension A */ + ["\u38C0", "\u38C0"], /* CJK Ideograph Extension A */ + ["\u38C1", "\u38C1"], /* CJK Ideograph Extension A */ + ["\u38C2", "\u38C2"], /* CJK Ideograph Extension A */ + ["\u38C3", "\u38C3"], /* CJK Ideograph Extension A */ + ["\u38C4", "\u38C4"], /* CJK Ideograph Extension A */ + ["\u38C5", "\u38C5"], /* CJK Ideograph Extension A */ + ["\u38C6", "\u38C6"], /* CJK Ideograph Extension A */ + ["\u38C7", "\u38C7"], /* CJK Ideograph Extension A */ + ["\u38C8", "\u38C8"], /* CJK Ideograph Extension A */ + ["\u38C9", "\u38C9"], /* CJK Ideograph Extension A */ + ["\u38CA", "\u38CA"], /* CJK Ideograph Extension A */ + ["\u38CB", "\u38CB"], /* CJK Ideograph Extension A */ + ["\u38CC", "\u38CC"], /* CJK Ideograph Extension A */ + ["\u38CD", "\u38CD"], /* CJK Ideograph Extension A */ + ["\u38CE", "\u38CE"], /* CJK Ideograph Extension A */ + ["\u38CF", "\u38CF"], /* CJK Ideograph Extension A */ + ["\u38D0", "\u38D0"], /* CJK Ideograph Extension A */ + ["\u38D1", "\u38D1"], /* CJK Ideograph Extension A */ + ["\u38D2", "\u38D2"], /* CJK Ideograph Extension A */ + ["\u38D3", "\u38D3"], /* CJK Ideograph Extension A */ + ["\u38D4", "\u38D4"], /* CJK Ideograph Extension A */ + ["\u38D5", "\u38D5"], /* CJK Ideograph Extension A */ + ["\u38D6", "\u38D6"], /* CJK Ideograph Extension A */ + ["\u38D7", "\u38D7"], /* CJK Ideograph Extension A */ + ["\u38D8", "\u38D8"], /* CJK Ideograph Extension A */ + ["\u38D9", "\u38D9"], /* CJK Ideograph Extension A */ + ["\u38DA", "\u38DA"], /* CJK Ideograph Extension A */ + ["\u38DB", "\u38DB"], /* CJK Ideograph Extension A */ + ["\u38DC", "\u38DC"], /* CJK Ideograph Extension A */ + ["\u38DD", "\u38DD"], /* CJK Ideograph Extension A */ + ["\u38DE", "\u38DE"], /* CJK Ideograph Extension A */ + ["\u38DF", "\u38DF"], /* CJK Ideograph Extension A */ + ["\u38E0", "\u38E0"], /* CJK Ideograph Extension A */ + ["\u38E1", "\u38E1"], /* CJK Ideograph Extension A */ + ["\u38E2", "\u38E2"], /* CJK Ideograph Extension A */ + ["\u38E3", "\u38E3"], /* CJK Ideograph Extension A */ + ["\u38E4", "\u38E4"], /* CJK Ideograph Extension A */ + ["\u38E5", "\u38E5"], /* CJK Ideograph Extension A */ + ["\u38E6", "\u38E6"], /* CJK Ideograph Extension A */ + ["\u38E7", "\u38E7"], /* CJK Ideograph Extension A */ + ["\u38E8", "\u38E8"], /* CJK Ideograph Extension A */ + ["\u38E9", "\u38E9"], /* CJK Ideograph Extension A */ + ["\u38EA", "\u38EA"], /* CJK Ideograph Extension A */ + ["\u38EB", "\u38EB"], /* CJK Ideograph Extension A */ + ["\u38EC", "\u38EC"], /* CJK Ideograph Extension A */ + ["\u38ED", "\u38ED"], /* CJK Ideograph Extension A */ + ["\u38EE", "\u38EE"], /* CJK Ideograph Extension A */ + ["\u38EF", "\u38EF"], /* CJK Ideograph Extension A */ + ["\u38F0", "\u38F0"], /* CJK Ideograph Extension A */ + ["\u38F1", "\u38F1"], /* CJK Ideograph Extension A */ + ["\u38F2", "\u38F2"], /* CJK Ideograph Extension A */ + ["\u38F3", "\u38F3"], /* CJK Ideograph Extension A */ + ["\u38F4", "\u38F4"], /* CJK Ideograph Extension A */ + ["\u38F5", "\u38F5"], /* CJK Ideograph Extension A */ + ["\u38F6", "\u38F6"], /* CJK Ideograph Extension A */ + ["\u38F7", "\u38F7"], /* CJK Ideograph Extension A */ + ["\u38F8", "\u38F8"], /* CJK Ideograph Extension A */ + ["\u38F9", "\u38F9"], /* CJK Ideograph Extension A */ + ["\u38FA", "\u38FA"], /* CJK Ideograph Extension A */ + ["\u38FB", "\u38FB"], /* CJK Ideograph Extension A */ + ["\u38FC", "\u38FC"], /* CJK Ideograph Extension A */ + ["\u38FD", "\u38FD"], /* CJK Ideograph Extension A */ + ["\u38FE", "\u38FE"], /* CJK Ideograph Extension A */ + ["\u38FF", "\u38FF"], /* CJK Ideograph Extension A */ + ["\u3900", "\u3900"], /* CJK Ideograph Extension A */ + ["\u3901", "\u3901"], /* CJK Ideograph Extension A */ + ["\u3902", "\u3902"], /* CJK Ideograph Extension A */ + ["\u3903", "\u3903"], /* CJK Ideograph Extension A */ + ["\u3904", "\u3904"], /* CJK Ideograph Extension A */ + ["\u3905", "\u3905"], /* CJK Ideograph Extension A */ + ["\u3906", "\u3906"], /* CJK Ideograph Extension A */ + ["\u3907", "\u3907"], /* CJK Ideograph Extension A */ + ["\u3908", "\u3908"], /* CJK Ideograph Extension A */ + ["\u3909", "\u3909"], /* CJK Ideograph Extension A */ + ["\u390A", "\u390A"], /* CJK Ideograph Extension A */ + ["\u390B", "\u390B"], /* CJK Ideograph Extension A */ + ["\u390C", "\u390C"], /* CJK Ideograph Extension A */ + ["\u390D", "\u390D"], /* CJK Ideograph Extension A */ + ["\u390E", "\u390E"], /* CJK Ideograph Extension A */ + ["\u390F", "\u390F"], /* CJK Ideograph Extension A */ + ["\u3910", "\u3910"], /* CJK Ideograph Extension A */ + ["\u3911", "\u3911"], /* CJK Ideograph Extension A */ + ["\u3912", "\u3912"], /* CJK Ideograph Extension A */ + ["\u3913", "\u3913"], /* CJK Ideograph Extension A */ + ["\u3914", "\u3914"], /* CJK Ideograph Extension A */ + ["\u3915", "\u3915"], /* CJK Ideograph Extension A */ + ["\u3916", "\u3916"], /* CJK Ideograph Extension A */ + ["\u3917", "\u3917"], /* CJK Ideograph Extension A */ + ["\u3918", "\u3918"], /* CJK Ideograph Extension A */ + ["\u3919", "\u3919"], /* CJK Ideograph Extension A */ + ["\u391A", "\u391A"], /* CJK Ideograph Extension A */ + ["\u391B", "\u391B"], /* CJK Ideograph Extension A */ + ["\u391C", "\u391C"], /* CJK Ideograph Extension A */ + ["\u391D", "\u391D"], /* CJK Ideograph Extension A */ + ["\u391E", "\u391E"], /* CJK Ideograph Extension A */ + ["\u391F", "\u391F"], /* CJK Ideograph Extension A */ + ["\u3920", "\u3920"], /* CJK Ideograph Extension A */ + ["\u3921", "\u3921"], /* CJK Ideograph Extension A */ + ["\u3922", "\u3922"], /* CJK Ideograph Extension A */ + ["\u3923", "\u3923"], /* CJK Ideograph Extension A */ + ["\u3924", "\u3924"], /* CJK Ideograph Extension A */ + ["\u3925", "\u3925"], /* CJK Ideograph Extension A */ + ["\u3926", "\u3926"], /* CJK Ideograph Extension A */ + ["\u3927", "\u3927"], /* CJK Ideograph Extension A */ + ["\u3928", "\u3928"], /* CJK Ideograph Extension A */ + ["\u3929", "\u3929"], /* CJK Ideograph Extension A */ + ["\u392A", "\u392A"], /* CJK Ideograph Extension A */ + ["\u392B", "\u392B"], /* CJK Ideograph Extension A */ + ["\u392C", "\u392C"], /* CJK Ideograph Extension A */ + ["\u392D", "\u392D"], /* CJK Ideograph Extension A */ + ["\u392E", "\u392E"], /* CJK Ideograph Extension A */ + ["\u392F", "\u392F"], /* CJK Ideograph Extension A */ + ["\u3930", "\u3930"], /* CJK Ideograph Extension A */ + ["\u3931", "\u3931"], /* CJK Ideograph Extension A */ + ["\u3932", "\u3932"], /* CJK Ideograph Extension A */ + ["\u3933", "\u3933"], /* CJK Ideograph Extension A */ + ["\u3934", "\u3934"], /* CJK Ideograph Extension A */ + ["\u3935", "\u3935"], /* CJK Ideograph Extension A */ + ["\u3936", "\u3936"], /* CJK Ideograph Extension A */ + ["\u3937", "\u3937"], /* CJK Ideograph Extension A */ + ["\u3938", "\u3938"], /* CJK Ideograph Extension A */ + ["\u3939", "\u3939"], /* CJK Ideograph Extension A */ + ["\u393A", "\u393A"], /* CJK Ideograph Extension A */ + ["\u393B", "\u393B"], /* CJK Ideograph Extension A */ + ["\u393C", "\u393C"], /* CJK Ideograph Extension A */ + ["\u393D", "\u393D"], /* CJK Ideograph Extension A */ + ["\u393E", "\u393E"], /* CJK Ideograph Extension A */ + ["\u393F", "\u393F"], /* CJK Ideograph Extension A */ + ["\u3940", "\u3940"], /* CJK Ideograph Extension A */ + ["\u3941", "\u3941"], /* CJK Ideograph Extension A */ + ["\u3942", "\u3942"], /* CJK Ideograph Extension A */ + ["\u3943", "\u3943"], /* CJK Ideograph Extension A */ + ["\u3944", "\u3944"], /* CJK Ideograph Extension A */ + ["\u3945", "\u3945"], /* CJK Ideograph Extension A */ + ["\u3946", "\u3946"], /* CJK Ideograph Extension A */ + ["\u3947", "\u3947"], /* CJK Ideograph Extension A */ + ["\u3948", "\u3948"], /* CJK Ideograph Extension A */ + ["\u3949", "\u3949"], /* CJK Ideograph Extension A */ + ["\u394A", "\u394A"], /* CJK Ideograph Extension A */ + ["\u394B", "\u394B"], /* CJK Ideograph Extension A */ + ["\u394C", "\u394C"], /* CJK Ideograph Extension A */ + ["\u394D", "\u394D"], /* CJK Ideograph Extension A */ + ["\u394E", "\u394E"], /* CJK Ideograph Extension A */ + ["\u394F", "\u394F"], /* CJK Ideograph Extension A */ + ["\u3950", "\u3950"], /* CJK Ideograph Extension A */ + ["\u3951", "\u3951"], /* CJK Ideograph Extension A */ + ["\u3952", "\u3952"], /* CJK Ideograph Extension A */ + ["\u3953", "\u3953"], /* CJK Ideograph Extension A */ + ["\u3954", "\u3954"], /* CJK Ideograph Extension A */ + ["\u3955", "\u3955"], /* CJK Ideograph Extension A */ + ["\u3956", "\u3956"], /* CJK Ideograph Extension A */ + ["\u3957", "\u3957"], /* CJK Ideograph Extension A */ + ["\u3958", "\u3958"], /* CJK Ideograph Extension A */ + ["\u3959", "\u3959"], /* CJK Ideograph Extension A */ + ["\u395A", "\u395A"], /* CJK Ideograph Extension A */ + ["\u395B", "\u395B"], /* CJK Ideograph Extension A */ + ["\u395C", "\u395C"], /* CJK Ideograph Extension A */ + ["\u395D", "\u395D"], /* CJK Ideograph Extension A */ + ["\u395E", "\u395E"], /* CJK Ideograph Extension A */ + ["\u395F", "\u395F"], /* CJK Ideograph Extension A */ + ["\u3960", "\u3960"], /* CJK Ideograph Extension A */ + ["\u3961", "\u3961"], /* CJK Ideograph Extension A */ + ["\u3962", "\u3962"], /* CJK Ideograph Extension A */ + ["\u3963", "\u3963"], /* CJK Ideograph Extension A */ + ["\u3964", "\u3964"], /* CJK Ideograph Extension A */ + ["\u3965", "\u3965"], /* CJK Ideograph Extension A */ + ["\u3966", "\u3966"], /* CJK Ideograph Extension A */ + ["\u3967", "\u3967"], /* CJK Ideograph Extension A */ + ["\u3968", "\u3968"], /* CJK Ideograph Extension A */ + ["\u3969", "\u3969"], /* CJK Ideograph Extension A */ + ["\u396A", "\u396A"], /* CJK Ideograph Extension A */ + ["\u396B", "\u396B"], /* CJK Ideograph Extension A */ + ["\u396C", "\u396C"], /* CJK Ideograph Extension A */ + ["\u396D", "\u396D"], /* CJK Ideograph Extension A */ + ["\u396E", "\u396E"], /* CJK Ideograph Extension A */ + ["\u396F", "\u396F"], /* CJK Ideograph Extension A */ + ["\u3970", "\u3970"], /* CJK Ideograph Extension A */ + ["\u3971", "\u3971"], /* CJK Ideograph Extension A */ + ["\u3972", "\u3972"], /* CJK Ideograph Extension A */ + ["\u3973", "\u3973"], /* CJK Ideograph Extension A */ + ["\u3974", "\u3974"], /* CJK Ideograph Extension A */ + ["\u3975", "\u3975"], /* CJK Ideograph Extension A */ + ["\u3976", "\u3976"], /* CJK Ideograph Extension A */ + ["\u3977", "\u3977"], /* CJK Ideograph Extension A */ + ["\u3978", "\u3978"], /* CJK Ideograph Extension A */ + ["\u3979", "\u3979"], /* CJK Ideograph Extension A */ + ["\u397A", "\u397A"], /* CJK Ideograph Extension A */ + ["\u397B", "\u397B"], /* CJK Ideograph Extension A */ + ["\u397C", "\u397C"], /* CJK Ideograph Extension A */ + ["\u397D", "\u397D"], /* CJK Ideograph Extension A */ + ["\u397E", "\u397E"], /* CJK Ideograph Extension A */ + ["\u397F", "\u397F"], /* CJK Ideograph Extension A */ + ["\u3980", "\u3980"], /* CJK Ideograph Extension A */ + ["\u3981", "\u3981"], /* CJK Ideograph Extension A */ + ["\u3982", "\u3982"], /* CJK Ideograph Extension A */ + ["\u3983", "\u3983"], /* CJK Ideograph Extension A */ + ["\u3984", "\u3984"], /* CJK Ideograph Extension A */ + ["\u3985", "\u3985"], /* CJK Ideograph Extension A */ + ["\u3986", "\u3986"], /* CJK Ideograph Extension A */ + ["\u3987", "\u3987"], /* CJK Ideograph Extension A */ + ["\u3988", "\u3988"], /* CJK Ideograph Extension A */ + ["\u3989", "\u3989"], /* CJK Ideograph Extension A */ + ["\u398A", "\u398A"], /* CJK Ideograph Extension A */ + ["\u398B", "\u398B"], /* CJK Ideograph Extension A */ + ["\u398C", "\u398C"], /* CJK Ideograph Extension A */ + ["\u398D", "\u398D"], /* CJK Ideograph Extension A */ + ["\u398E", "\u398E"], /* CJK Ideograph Extension A */ + ["\u398F", "\u398F"], /* CJK Ideograph Extension A */ + ["\u3990", "\u3990"], /* CJK Ideograph Extension A */ + ["\u3991", "\u3991"], /* CJK Ideograph Extension A */ + ["\u3992", "\u3992"], /* CJK Ideograph Extension A */ + ["\u3993", "\u3993"], /* CJK Ideograph Extension A */ + ["\u3994", "\u3994"], /* CJK Ideograph Extension A */ + ["\u3995", "\u3995"], /* CJK Ideograph Extension A */ + ["\u3996", "\u3996"], /* CJK Ideograph Extension A */ + ["\u3997", "\u3997"], /* CJK Ideograph Extension A */ + ["\u3998", "\u3998"], /* CJK Ideograph Extension A */ + ["\u3999", "\u3999"], /* CJK Ideograph Extension A */ + ["\u399A", "\u399A"], /* CJK Ideograph Extension A */ + ["\u399B", "\u399B"], /* CJK Ideograph Extension A */ + ["\u399C", "\u399C"], /* CJK Ideograph Extension A */ + ["\u399D", "\u399D"], /* CJK Ideograph Extension A */ + ["\u399E", "\u399E"], /* CJK Ideograph Extension A */ + ["\u399F", "\u399F"], /* CJK Ideograph Extension A */ + ["\u39A0", "\u39A0"], /* CJK Ideograph Extension A */ + ["\u39A1", "\u39A1"], /* CJK Ideograph Extension A */ + ["\u39A2", "\u39A2"], /* CJK Ideograph Extension A */ + ["\u39A3", "\u39A3"], /* CJK Ideograph Extension A */ + ["\u39A4", "\u39A4"], /* CJK Ideograph Extension A */ + ["\u39A5", "\u39A5"], /* CJK Ideograph Extension A */ + ["\u39A6", "\u39A6"], /* CJK Ideograph Extension A */ + ["\u39A7", "\u39A7"], /* CJK Ideograph Extension A */ + ["\u39A8", "\u39A8"], /* CJK Ideograph Extension A */ + ["\u39A9", "\u39A9"], /* CJK Ideograph Extension A */ + ["\u39AA", "\u39AA"], /* CJK Ideograph Extension A */ + ["\u39AB", "\u39AB"], /* CJK Ideograph Extension A */ + ["\u39AC", "\u39AC"], /* CJK Ideograph Extension A */ + ["\u39AD", "\u39AD"], /* CJK Ideograph Extension A */ + ["\u39AE", "\u39AE"], /* CJK Ideograph Extension A */ + ["\u39AF", "\u39AF"], /* CJK Ideograph Extension A */ + ["\u39B0", "\u39B0"], /* CJK Ideograph Extension A */ + ["\u39B1", "\u39B1"], /* CJK Ideograph Extension A */ + ["\u39B2", "\u39B2"], /* CJK Ideograph Extension A */ + ["\u39B3", "\u39B3"], /* CJK Ideograph Extension A */ + ["\u39B4", "\u39B4"], /* CJK Ideograph Extension A */ + ["\u39B5", "\u39B5"], /* CJK Ideograph Extension A */ + ["\u39B6", "\u39B6"], /* CJK Ideograph Extension A */ + ["\u39B7", "\u39B7"], /* CJK Ideograph Extension A */ + ["\u39B8", "\u39B8"], /* CJK Ideograph Extension A */ + ["\u39B9", "\u39B9"], /* CJK Ideograph Extension A */ + ["\u39BA", "\u39BA"], /* CJK Ideograph Extension A */ + ["\u39BB", "\u39BB"], /* CJK Ideograph Extension A */ + ["\u39BC", "\u39BC"], /* CJK Ideograph Extension A */ + ["\u39BD", "\u39BD"], /* CJK Ideograph Extension A */ + ["\u39BE", "\u39BE"], /* CJK Ideograph Extension A */ + ["\u39BF", "\u39BF"], /* CJK Ideograph Extension A */ + ["\u39C0", "\u39C0"], /* CJK Ideograph Extension A */ + ["\u39C1", "\u39C1"], /* CJK Ideograph Extension A */ + ["\u39C2", "\u39C2"], /* CJK Ideograph Extension A */ + ["\u39C3", "\u39C3"], /* CJK Ideograph Extension A */ + ["\u39C4", "\u39C4"], /* CJK Ideograph Extension A */ + ["\u39C5", "\u39C5"], /* CJK Ideograph Extension A */ + ["\u39C6", "\u39C6"], /* CJK Ideograph Extension A */ + ["\u39C7", "\u39C7"], /* CJK Ideograph Extension A */ + ["\u39C8", "\u39C8"], /* CJK Ideograph Extension A */ + ["\u39C9", "\u39C9"], /* CJK Ideograph Extension A */ + ["\u39CA", "\u39CA"], /* CJK Ideograph Extension A */ + ["\u39CB", "\u39CB"], /* CJK Ideograph Extension A */ + ["\u39CC", "\u39CC"], /* CJK Ideograph Extension A */ + ["\u39CD", "\u39CD"], /* CJK Ideograph Extension A */ + ["\u39CE", "\u39CE"], /* CJK Ideograph Extension A */ + ["\u39CF", "\u39CF"], /* CJK Ideograph Extension A */ + ["\u39D0", "\u39D0"], /* CJK Ideograph Extension A */ + ["\u39D1", "\u39D1"], /* CJK Ideograph Extension A */ + ["\u39D2", "\u39D2"], /* CJK Ideograph Extension A */ + ["\u39D3", "\u39D3"], /* CJK Ideograph Extension A */ + ["\u39D4", "\u39D4"], /* CJK Ideograph Extension A */ + ["\u39D5", "\u39D5"], /* CJK Ideograph Extension A */ + ["\u39D6", "\u39D6"], /* CJK Ideograph Extension A */ + ["\u39D7", "\u39D7"], /* CJK Ideograph Extension A */ + ["\u39D8", "\u39D8"], /* CJK Ideograph Extension A */ + ["\u39D9", "\u39D9"], /* CJK Ideograph Extension A */ + ["\u39DA", "\u39DA"], /* CJK Ideograph Extension A */ + ["\u39DB", "\u39DB"], /* CJK Ideograph Extension A */ + ["\u39DC", "\u39DC"], /* CJK Ideograph Extension A */ + ["\u39DD", "\u39DD"], /* CJK Ideograph Extension A */ + ["\u39DE", "\u39DE"], /* CJK Ideograph Extension A */ + ["\u39DF", "\u39DF"], /* CJK Ideograph Extension A */ + ["\u39E0", "\u39E0"], /* CJK Ideograph Extension A */ + ["\u39E1", "\u39E1"], /* CJK Ideograph Extension A */ + ["\u39E2", "\u39E2"], /* CJK Ideograph Extension A */ + ["\u39E3", "\u39E3"], /* CJK Ideograph Extension A */ + ["\u39E4", "\u39E4"], /* CJK Ideograph Extension A */ + ["\u39E5", "\u39E5"], /* CJK Ideograph Extension A */ + ["\u39E6", "\u39E6"], /* CJK Ideograph Extension A */ + ["\u39E7", "\u39E7"], /* CJK Ideograph Extension A */ + ["\u39E8", "\u39E8"], /* CJK Ideograph Extension A */ + ["\u39E9", "\u39E9"], /* CJK Ideograph Extension A */ + ["\u39EA", "\u39EA"], /* CJK Ideograph Extension A */ + ["\u39EB", "\u39EB"], /* CJK Ideograph Extension A */ + ["\u39EC", "\u39EC"], /* CJK Ideograph Extension A */ + ["\u39ED", "\u39ED"], /* CJK Ideograph Extension A */ + ["\u39EE", "\u39EE"], /* CJK Ideograph Extension A */ + ["\u39EF", "\u39EF"], /* CJK Ideograph Extension A */ + ["\u39F0", "\u39F0"], /* CJK Ideograph Extension A */ + ["\u39F1", "\u39F1"], /* CJK Ideograph Extension A */ + ["\u39F2", "\u39F2"], /* CJK Ideograph Extension A */ + ["\u39F3", "\u39F3"], /* CJK Ideograph Extension A */ + ["\u39F4", "\u39F4"], /* CJK Ideograph Extension A */ + ["\u39F5", "\u39F5"], /* CJK Ideograph Extension A */ + ["\u39F6", "\u39F6"], /* CJK Ideograph Extension A */ + ["\u39F7", "\u39F7"], /* CJK Ideograph Extension A */ + ["\u39F8", "\u39F8"], /* CJK Ideograph Extension A */ + ["\u39F9", "\u39F9"], /* CJK Ideograph Extension A */ + ["\u39FA", "\u39FA"], /* CJK Ideograph Extension A */ + ["\u39FB", "\u39FB"], /* CJK Ideograph Extension A */ + ["\u39FC", "\u39FC"], /* CJK Ideograph Extension A */ + ["\u39FD", "\u39FD"], /* CJK Ideograph Extension A */ + ["\u39FE", "\u39FE"], /* CJK Ideograph Extension A */ + ["\u39FF", "\u39FF"], /* CJK Ideograph Extension A */ + ["\u3A00", "\u3A00"], /* CJK Ideograph Extension A */ + ["\u3A01", "\u3A01"], /* CJK Ideograph Extension A */ + ["\u3A02", "\u3A02"], /* CJK Ideograph Extension A */ + ["\u3A03", "\u3A03"], /* CJK Ideograph Extension A */ + ["\u3A04", "\u3A04"], /* CJK Ideograph Extension A */ + ["\u3A05", "\u3A05"], /* CJK Ideograph Extension A */ + ["\u3A06", "\u3A06"], /* CJK Ideograph Extension A */ + ["\u3A07", "\u3A07"], /* CJK Ideograph Extension A */ + ["\u3A08", "\u3A08"], /* CJK Ideograph Extension A */ + ["\u3A09", "\u3A09"], /* CJK Ideograph Extension A */ + ["\u3A0A", "\u3A0A"], /* CJK Ideograph Extension A */ + ["\u3A0B", "\u3A0B"], /* CJK Ideograph Extension A */ + ["\u3A0C", "\u3A0C"], /* CJK Ideograph Extension A */ + ["\u3A0D", "\u3A0D"], /* CJK Ideograph Extension A */ + ["\u3A0E", "\u3A0E"], /* CJK Ideograph Extension A */ + ["\u3A0F", "\u3A0F"], /* CJK Ideograph Extension A */ + ["\u3A10", "\u3A10"], /* CJK Ideograph Extension A */ + ["\u3A11", "\u3A11"], /* CJK Ideograph Extension A */ + ["\u3A12", "\u3A12"], /* CJK Ideograph Extension A */ + ["\u3A13", "\u3A13"], /* CJK Ideograph Extension A */ + ["\u3A14", "\u3A14"], /* CJK Ideograph Extension A */ + ["\u3A15", "\u3A15"], /* CJK Ideograph Extension A */ + ["\u3A16", "\u3A16"], /* CJK Ideograph Extension A */ + ["\u3A17", "\u3A17"], /* CJK Ideograph Extension A */ + ["\u3A18", "\u3A18"], /* CJK Ideograph Extension A */ + ["\u3A19", "\u3A19"], /* CJK Ideograph Extension A */ + ["\u3A1A", "\u3A1A"], /* CJK Ideograph Extension A */ + ["\u3A1B", "\u3A1B"], /* CJK Ideograph Extension A */ + ["\u3A1C", "\u3A1C"], /* CJK Ideograph Extension A */ + ["\u3A1D", "\u3A1D"], /* CJK Ideograph Extension A */ + ["\u3A1E", "\u3A1E"], /* CJK Ideograph Extension A */ + ["\u3A1F", "\u3A1F"], /* CJK Ideograph Extension A */ + ["\u3A20", "\u3A20"], /* CJK Ideograph Extension A */ + ["\u3A21", "\u3A21"], /* CJK Ideograph Extension A */ + ["\u3A22", "\u3A22"], /* CJK Ideograph Extension A */ + ["\u3A23", "\u3A23"], /* CJK Ideograph Extension A */ + ["\u3A24", "\u3A24"], /* CJK Ideograph Extension A */ + ["\u3A25", "\u3A25"], /* CJK Ideograph Extension A */ + ["\u3A26", "\u3A26"], /* CJK Ideograph Extension A */ + ["\u3A27", "\u3A27"], /* CJK Ideograph Extension A */ + ["\u3A28", "\u3A28"], /* CJK Ideograph Extension A */ + ["\u3A29", "\u3A29"], /* CJK Ideograph Extension A */ + ["\u3A2A", "\u3A2A"], /* CJK Ideograph Extension A */ + ["\u3A2B", "\u3A2B"], /* CJK Ideograph Extension A */ + ["\u3A2C", "\u3A2C"], /* CJK Ideograph Extension A */ + ["\u3A2D", "\u3A2D"], /* CJK Ideograph Extension A */ + ["\u3A2E", "\u3A2E"], /* CJK Ideograph Extension A */ + ["\u3A2F", "\u3A2F"], /* CJK Ideograph Extension A */ + ["\u3A30", "\u3A30"], /* CJK Ideograph Extension A */ + ["\u3A31", "\u3A31"], /* CJK Ideograph Extension A */ + ["\u3A32", "\u3A32"], /* CJK Ideograph Extension A */ + ["\u3A33", "\u3A33"], /* CJK Ideograph Extension A */ + ["\u3A34", "\u3A34"], /* CJK Ideograph Extension A */ + ["\u3A35", "\u3A35"], /* CJK Ideograph Extension A */ + ["\u3A36", "\u3A36"], /* CJK Ideograph Extension A */ + ["\u3A37", "\u3A37"], /* CJK Ideograph Extension A */ + ["\u3A38", "\u3A38"], /* CJK Ideograph Extension A */ + ["\u3A39", "\u3A39"], /* CJK Ideograph Extension A */ + ["\u3A3A", "\u3A3A"], /* CJK Ideograph Extension A */ + ["\u3A3B", "\u3A3B"], /* CJK Ideograph Extension A */ + ["\u3A3C", "\u3A3C"], /* CJK Ideograph Extension A */ + ["\u3A3D", "\u3A3D"], /* CJK Ideograph Extension A */ + ["\u3A3E", "\u3A3E"], /* CJK Ideograph Extension A */ + ["\u3A3F", "\u3A3F"], /* CJK Ideograph Extension A */ + ["\u3A40", "\u3A40"], /* CJK Ideograph Extension A */ + ["\u3A41", "\u3A41"], /* CJK Ideograph Extension A */ + ["\u3A42", "\u3A42"], /* CJK Ideograph Extension A */ + ["\u3A43", "\u3A43"], /* CJK Ideograph Extension A */ + ["\u3A44", "\u3A44"], /* CJK Ideograph Extension A */ + ["\u3A45", "\u3A45"], /* CJK Ideograph Extension A */ + ["\u3A46", "\u3A46"], /* CJK Ideograph Extension A */ + ["\u3A47", "\u3A47"], /* CJK Ideograph Extension A */ + ["\u3A48", "\u3A48"], /* CJK Ideograph Extension A */ + ["\u3A49", "\u3A49"], /* CJK Ideograph Extension A */ + ["\u3A4A", "\u3A4A"], /* CJK Ideograph Extension A */ + ["\u3A4B", "\u3A4B"], /* CJK Ideograph Extension A */ + ["\u3A4C", "\u3A4C"], /* CJK Ideograph Extension A */ + ["\u3A4D", "\u3A4D"], /* CJK Ideograph Extension A */ + ["\u3A4E", "\u3A4E"], /* CJK Ideograph Extension A */ + ["\u3A4F", "\u3A4F"], /* CJK Ideograph Extension A */ + ["\u3A50", "\u3A50"], /* CJK Ideograph Extension A */ + ["\u3A51", "\u3A51"], /* CJK Ideograph Extension A */ + ["\u3A52", "\u3A52"], /* CJK Ideograph Extension A */ + ["\u3A53", "\u3A53"], /* CJK Ideograph Extension A */ + ["\u3A54", "\u3A54"], /* CJK Ideograph Extension A */ + ["\u3A55", "\u3A55"], /* CJK Ideograph Extension A */ + ["\u3A56", "\u3A56"], /* CJK Ideograph Extension A */ + ["\u3A57", "\u3A57"], /* CJK Ideograph Extension A */ + ["\u3A58", "\u3A58"], /* CJK Ideograph Extension A */ + ["\u3A59", "\u3A59"], /* CJK Ideograph Extension A */ + ["\u3A5A", "\u3A5A"], /* CJK Ideograph Extension A */ + ["\u3A5B", "\u3A5B"], /* CJK Ideograph Extension A */ + ["\u3A5C", "\u3A5C"], /* CJK Ideograph Extension A */ + ["\u3A5D", "\u3A5D"], /* CJK Ideograph Extension A */ + ["\u3A5E", "\u3A5E"], /* CJK Ideograph Extension A */ + ["\u3A5F", "\u3A5F"], /* CJK Ideograph Extension A */ + ["\u3A60", "\u3A60"], /* CJK Ideograph Extension A */ + ["\u3A61", "\u3A61"], /* CJK Ideograph Extension A */ + ["\u3A62", "\u3A62"], /* CJK Ideograph Extension A */ + ["\u3A63", "\u3A63"], /* CJK Ideograph Extension A */ + ["\u3A64", "\u3A64"], /* CJK Ideograph Extension A */ + ["\u3A65", "\u3A65"], /* CJK Ideograph Extension A */ + ["\u3A66", "\u3A66"], /* CJK Ideograph Extension A */ + ["\u3A67", "\u3A67"], /* CJK Ideograph Extension A */ + ["\u3A68", "\u3A68"], /* CJK Ideograph Extension A */ + ["\u3A69", "\u3A69"], /* CJK Ideograph Extension A */ + ["\u3A6A", "\u3A6A"], /* CJK Ideograph Extension A */ + ["\u3A6B", "\u3A6B"], /* CJK Ideograph Extension A */ + ["\u3A6C", "\u3A6C"], /* CJK Ideograph Extension A */ + ["\u3A6D", "\u3A6D"], /* CJK Ideograph Extension A */ + ["\u3A6E", "\u3A6E"], /* CJK Ideograph Extension A */ + ["\u3A6F", "\u3A6F"], /* CJK Ideograph Extension A */ + ["\u3A70", "\u3A70"], /* CJK Ideograph Extension A */ + ["\u3A71", "\u3A71"], /* CJK Ideograph Extension A */ + ["\u3A72", "\u3A72"], /* CJK Ideograph Extension A */ + ["\u3A73", "\u3A73"], /* CJK Ideograph Extension A */ + ["\u3A74", "\u3A74"], /* CJK Ideograph Extension A */ + ["\u3A75", "\u3A75"], /* CJK Ideograph Extension A */ + ["\u3A76", "\u3A76"], /* CJK Ideograph Extension A */ + ["\u3A77", "\u3A77"], /* CJK Ideograph Extension A */ + ["\u3A78", "\u3A78"], /* CJK Ideograph Extension A */ + ["\u3A79", "\u3A79"], /* CJK Ideograph Extension A */ + ["\u3A7A", "\u3A7A"], /* CJK Ideograph Extension A */ + ["\u3A7B", "\u3A7B"], /* CJK Ideograph Extension A */ + ["\u3A7C", "\u3A7C"], /* CJK Ideograph Extension A */ + ["\u3A7D", "\u3A7D"], /* CJK Ideograph Extension A */ + ["\u3A7E", "\u3A7E"], /* CJK Ideograph Extension A */ + ["\u3A7F", "\u3A7F"], /* CJK Ideograph Extension A */ + ["\u3A80", "\u3A80"], /* CJK Ideograph Extension A */ + ["\u3A81", "\u3A81"], /* CJK Ideograph Extension A */ + ["\u3A82", "\u3A82"], /* CJK Ideograph Extension A */ + ["\u3A83", "\u3A83"], /* CJK Ideograph Extension A */ + ["\u3A84", "\u3A84"], /* CJK Ideograph Extension A */ + ["\u3A85", "\u3A85"], /* CJK Ideograph Extension A */ + ["\u3A86", "\u3A86"], /* CJK Ideograph Extension A */ + ["\u3A87", "\u3A87"], /* CJK Ideograph Extension A */ + ["\u3A88", "\u3A88"], /* CJK Ideograph Extension A */ + ["\u3A89", "\u3A89"], /* CJK Ideograph Extension A */ + ["\u3A8A", "\u3A8A"], /* CJK Ideograph Extension A */ + ["\u3A8B", "\u3A8B"], /* CJK Ideograph Extension A */ + ["\u3A8C", "\u3A8C"], /* CJK Ideograph Extension A */ + ["\u3A8D", "\u3A8D"], /* CJK Ideograph Extension A */ + ["\u3A8E", "\u3A8E"], /* CJK Ideograph Extension A */ + ["\u3A8F", "\u3A8F"], /* CJK Ideograph Extension A */ + ["\u3A90", "\u3A90"], /* CJK Ideograph Extension A */ + ["\u3A91", "\u3A91"], /* CJK Ideograph Extension A */ + ["\u3A92", "\u3A92"], /* CJK Ideograph Extension A */ + ["\u3A93", "\u3A93"], /* CJK Ideograph Extension A */ + ["\u3A94", "\u3A94"], /* CJK Ideograph Extension A */ + ["\u3A95", "\u3A95"], /* CJK Ideograph Extension A */ + ["\u3A96", "\u3A96"], /* CJK Ideograph Extension A */ + ["\u3A97", "\u3A97"], /* CJK Ideograph Extension A */ + ["\u3A98", "\u3A98"], /* CJK Ideograph Extension A */ + ["\u3A99", "\u3A99"], /* CJK Ideograph Extension A */ + ["\u3A9A", "\u3A9A"], /* CJK Ideograph Extension A */ + ["\u3A9B", "\u3A9B"], /* CJK Ideograph Extension A */ + ["\u3A9C", "\u3A9C"], /* CJK Ideograph Extension A */ + ["\u3A9D", "\u3A9D"], /* CJK Ideograph Extension A */ + ["\u3A9E", "\u3A9E"], /* CJK Ideograph Extension A */ + ["\u3A9F", "\u3A9F"], /* CJK Ideograph Extension A */ + ["\u3AA0", "\u3AA0"], /* CJK Ideograph Extension A */ + ["\u3AA1", "\u3AA1"], /* CJK Ideograph Extension A */ + ["\u3AA2", "\u3AA2"], /* CJK Ideograph Extension A */ + ["\u3AA3", "\u3AA3"], /* CJK Ideograph Extension A */ + ["\u3AA4", "\u3AA4"], /* CJK Ideograph Extension A */ + ["\u3AA5", "\u3AA5"], /* CJK Ideograph Extension A */ + ["\u3AA6", "\u3AA6"], /* CJK Ideograph Extension A */ + ["\u3AA7", "\u3AA7"], /* CJK Ideograph Extension A */ + ["\u3AA8", "\u3AA8"], /* CJK Ideograph Extension A */ + ["\u3AA9", "\u3AA9"], /* CJK Ideograph Extension A */ + ["\u3AAA", "\u3AAA"], /* CJK Ideograph Extension A */ + ["\u3AAB", "\u3AAB"], /* CJK Ideograph Extension A */ + ["\u3AAC", "\u3AAC"], /* CJK Ideograph Extension A */ + ["\u3AAD", "\u3AAD"], /* CJK Ideograph Extension A */ + ["\u3AAE", "\u3AAE"], /* CJK Ideograph Extension A */ + ["\u3AAF", "\u3AAF"], /* CJK Ideograph Extension A */ + ["\u3AB0", "\u3AB0"], /* CJK Ideograph Extension A */ + ["\u3AB1", "\u3AB1"], /* CJK Ideograph Extension A */ + ["\u3AB2", "\u3AB2"], /* CJK Ideograph Extension A */ + ["\u3AB3", "\u3AB3"], /* CJK Ideograph Extension A */ + ["\u3AB4", "\u3AB4"], /* CJK Ideograph Extension A */ + ["\u3AB5", "\u3AB5"], /* CJK Ideograph Extension A */ + ["\u3AB6", "\u3AB6"], /* CJK Ideograph Extension A */ + ["\u3AB7", "\u3AB7"], /* CJK Ideograph Extension A */ + ["\u3AB8", "\u3AB8"], /* CJK Ideograph Extension A */ + ["\u3AB9", "\u3AB9"], /* CJK Ideograph Extension A */ + ["\u3ABA", "\u3ABA"], /* CJK Ideograph Extension A */ + ["\u3ABB", "\u3ABB"], /* CJK Ideograph Extension A */ + ["\u3ABC", "\u3ABC"], /* CJK Ideograph Extension A */ + ["\u3ABD", "\u3ABD"], /* CJK Ideograph Extension A */ + ["\u3ABE", "\u3ABE"], /* CJK Ideograph Extension A */ + ["\u3ABF", "\u3ABF"], /* CJK Ideograph Extension A */ + ["\u3AC0", "\u3AC0"], /* CJK Ideograph Extension A */ + ["\u3AC1", "\u3AC1"], /* CJK Ideograph Extension A */ + ["\u3AC2", "\u3AC2"], /* CJK Ideograph Extension A */ + ["\u3AC3", "\u3AC3"], /* CJK Ideograph Extension A */ + ["\u3AC4", "\u3AC4"], /* CJK Ideograph Extension A */ + ["\u3AC5", "\u3AC5"], /* CJK Ideograph Extension A */ + ["\u3AC6", "\u3AC6"], /* CJK Ideograph Extension A */ + ["\u3AC7", "\u3AC7"], /* CJK Ideograph Extension A */ + ["\u3AC8", "\u3AC8"], /* CJK Ideograph Extension A */ + ["\u3AC9", "\u3AC9"], /* CJK Ideograph Extension A */ + ["\u3ACA", "\u3ACA"], /* CJK Ideograph Extension A */ + ["\u3ACB", "\u3ACB"], /* CJK Ideograph Extension A */ + ["\u3ACC", "\u3ACC"], /* CJK Ideograph Extension A */ + ["\u3ACD", "\u3ACD"], /* CJK Ideograph Extension A */ + ["\u3ACE", "\u3ACE"], /* CJK Ideograph Extension A */ + ["\u3ACF", "\u3ACF"], /* CJK Ideograph Extension A */ + ["\u3AD0", "\u3AD0"], /* CJK Ideograph Extension A */ + ["\u3AD1", "\u3AD1"], /* CJK Ideograph Extension A */ + ["\u3AD2", "\u3AD2"], /* CJK Ideograph Extension A */ + ["\u3AD3", "\u3AD3"], /* CJK Ideograph Extension A */ + ["\u3AD4", "\u3AD4"], /* CJK Ideograph Extension A */ + ["\u3AD5", "\u3AD5"], /* CJK Ideograph Extension A */ + ["\u3AD6", "\u3AD6"], /* CJK Ideograph Extension A */ + ["\u3AD7", "\u3AD7"], /* CJK Ideograph Extension A */ + ["\u3AD8", "\u3AD8"], /* CJK Ideograph Extension A */ + ["\u3AD9", "\u3AD9"], /* CJK Ideograph Extension A */ + ["\u3ADA", "\u3ADA"], /* CJK Ideograph Extension A */ + ["\u3ADB", "\u3ADB"], /* CJK Ideograph Extension A */ + ["\u3ADC", "\u3ADC"], /* CJK Ideograph Extension A */ + ["\u3ADD", "\u3ADD"], /* CJK Ideograph Extension A */ + ["\u3ADE", "\u3ADE"], /* CJK Ideograph Extension A */ + ["\u3ADF", "\u3ADF"], /* CJK Ideograph Extension A */ + ["\u3AE0", "\u3AE0"], /* CJK Ideograph Extension A */ + ["\u3AE1", "\u3AE1"], /* CJK Ideograph Extension A */ + ["\u3AE2", "\u3AE2"], /* CJK Ideograph Extension A */ + ["\u3AE3", "\u3AE3"], /* CJK Ideograph Extension A */ + ["\u3AE4", "\u3AE4"], /* CJK Ideograph Extension A */ + ["\u3AE5", "\u3AE5"], /* CJK Ideograph Extension A */ + ["\u3AE6", "\u3AE6"], /* CJK Ideograph Extension A */ + ["\u3AE7", "\u3AE7"], /* CJK Ideograph Extension A */ + ["\u3AE8", "\u3AE8"], /* CJK Ideograph Extension A */ + ["\u3AE9", "\u3AE9"], /* CJK Ideograph Extension A */ + ["\u3AEA", "\u3AEA"], /* CJK Ideograph Extension A */ + ["\u3AEB", "\u3AEB"], /* CJK Ideograph Extension A */ + ["\u3AEC", "\u3AEC"], /* CJK Ideograph Extension A */ + ["\u3AED", "\u3AED"], /* CJK Ideograph Extension A */ + ["\u3AEE", "\u3AEE"], /* CJK Ideograph Extension A */ + ["\u3AEF", "\u3AEF"], /* CJK Ideograph Extension A */ + ["\u3AF0", "\u3AF0"], /* CJK Ideograph Extension A */ + ["\u3AF1", "\u3AF1"], /* CJK Ideograph Extension A */ + ["\u3AF2", "\u3AF2"], /* CJK Ideograph Extension A */ + ["\u3AF3", "\u3AF3"], /* CJK Ideograph Extension A */ + ["\u3AF4", "\u3AF4"], /* CJK Ideograph Extension A */ + ["\u3AF5", "\u3AF5"], /* CJK Ideograph Extension A */ + ["\u3AF6", "\u3AF6"], /* CJK Ideograph Extension A */ + ["\u3AF7", "\u3AF7"], /* CJK Ideograph Extension A */ + ["\u3AF8", "\u3AF8"], /* CJK Ideograph Extension A */ + ["\u3AF9", "\u3AF9"], /* CJK Ideograph Extension A */ + ["\u3AFA", "\u3AFA"], /* CJK Ideograph Extension A */ + ["\u3AFB", "\u3AFB"], /* CJK Ideograph Extension A */ + ["\u3AFC", "\u3AFC"], /* CJK Ideograph Extension A */ + ["\u3AFD", "\u3AFD"], /* CJK Ideograph Extension A */ + ["\u3AFE", "\u3AFE"], /* CJK Ideograph Extension A */ + ["\u3AFF", "\u3AFF"], /* CJK Ideograph Extension A */ + ["\u3B00", "\u3B00"], /* CJK Ideograph Extension A */ + ["\u3B01", "\u3B01"], /* CJK Ideograph Extension A */ + ["\u3B02", "\u3B02"], /* CJK Ideograph Extension A */ + ["\u3B03", "\u3B03"], /* CJK Ideograph Extension A */ + ["\u3B04", "\u3B04"], /* CJK Ideograph Extension A */ + ["\u3B05", "\u3B05"], /* CJK Ideograph Extension A */ + ["\u3B06", "\u3B06"], /* CJK Ideograph Extension A */ + ["\u3B07", "\u3B07"], /* CJK Ideograph Extension A */ + ["\u3B08", "\u3B08"], /* CJK Ideograph Extension A */ + ["\u3B09", "\u3B09"], /* CJK Ideograph Extension A */ + ["\u3B0A", "\u3B0A"], /* CJK Ideograph Extension A */ + ["\u3B0B", "\u3B0B"], /* CJK Ideograph Extension A */ + ["\u3B0C", "\u3B0C"], /* CJK Ideograph Extension A */ + ["\u3B0D", "\u3B0D"], /* CJK Ideograph Extension A */ + ["\u3B0E", "\u3B0E"], /* CJK Ideograph Extension A */ + ["\u3B0F", "\u3B0F"], /* CJK Ideograph Extension A */ + ["\u3B10", "\u3B10"], /* CJK Ideograph Extension A */ + ["\u3B11", "\u3B11"], /* CJK Ideograph Extension A */ + ["\u3B12", "\u3B12"], /* CJK Ideograph Extension A */ + ["\u3B13", "\u3B13"], /* CJK Ideograph Extension A */ + ["\u3B14", "\u3B14"], /* CJK Ideograph Extension A */ + ["\u3B15", "\u3B15"], /* CJK Ideograph Extension A */ + ["\u3B16", "\u3B16"], /* CJK Ideograph Extension A */ + ["\u3B17", "\u3B17"], /* CJK Ideograph Extension A */ + ["\u3B18", "\u3B18"], /* CJK Ideograph Extension A */ + ["\u3B19", "\u3B19"], /* CJK Ideograph Extension A */ + ["\u3B1A", "\u3B1A"], /* CJK Ideograph Extension A */ + ["\u3B1B", "\u3B1B"], /* CJK Ideograph Extension A */ + ["\u3B1C", "\u3B1C"], /* CJK Ideograph Extension A */ + ["\u3B1D", "\u3B1D"], /* CJK Ideograph Extension A */ + ["\u3B1E", "\u3B1E"], /* CJK Ideograph Extension A */ + ["\u3B1F", "\u3B1F"], /* CJK Ideograph Extension A */ + ["\u3B20", "\u3B20"], /* CJK Ideograph Extension A */ + ["\u3B21", "\u3B21"], /* CJK Ideograph Extension A */ + ["\u3B22", "\u3B22"], /* CJK Ideograph Extension A */ + ["\u3B23", "\u3B23"], /* CJK Ideograph Extension A */ + ["\u3B24", "\u3B24"], /* CJK Ideograph Extension A */ + ["\u3B25", "\u3B25"], /* CJK Ideograph Extension A */ + ["\u3B26", "\u3B26"], /* CJK Ideograph Extension A */ + ["\u3B27", "\u3B27"], /* CJK Ideograph Extension A */ + ["\u3B28", "\u3B28"], /* CJK Ideograph Extension A */ + ["\u3B29", "\u3B29"], /* CJK Ideograph Extension A */ + ["\u3B2A", "\u3B2A"], /* CJK Ideograph Extension A */ + ["\u3B2B", "\u3B2B"], /* CJK Ideograph Extension A */ + ["\u3B2C", "\u3B2C"], /* CJK Ideograph Extension A */ + ["\u3B2D", "\u3B2D"], /* CJK Ideograph Extension A */ + ["\u3B2E", "\u3B2E"], /* CJK Ideograph Extension A */ + ["\u3B2F", "\u3B2F"], /* CJK Ideograph Extension A */ + ["\u3B30", "\u3B30"], /* CJK Ideograph Extension A */ + ["\u3B31", "\u3B31"], /* CJK Ideograph Extension A */ + ["\u3B32", "\u3B32"], /* CJK Ideograph Extension A */ + ["\u3B33", "\u3B33"], /* CJK Ideograph Extension A */ + ["\u3B34", "\u3B34"], /* CJK Ideograph Extension A */ + ["\u3B35", "\u3B35"], /* CJK Ideograph Extension A */ + ["\u3B36", "\u3B36"], /* CJK Ideograph Extension A */ + ["\u3B37", "\u3B37"], /* CJK Ideograph Extension A */ + ["\u3B38", "\u3B38"], /* CJK Ideograph Extension A */ + ["\u3B39", "\u3B39"], /* CJK Ideograph Extension A */ + ["\u3B3A", "\u3B3A"], /* CJK Ideograph Extension A */ + ["\u3B3B", "\u3B3B"], /* CJK Ideograph Extension A */ + ["\u3B3C", "\u3B3C"], /* CJK Ideograph Extension A */ + ["\u3B3D", "\u3B3D"], /* CJK Ideograph Extension A */ + ["\u3B3E", "\u3B3E"], /* CJK Ideograph Extension A */ + ["\u3B3F", "\u3B3F"], /* CJK Ideograph Extension A */ + ["\u3B40", "\u3B40"], /* CJK Ideograph Extension A */ + ["\u3B41", "\u3B41"], /* CJK Ideograph Extension A */ + ["\u3B42", "\u3B42"], /* CJK Ideograph Extension A */ + ["\u3B43", "\u3B43"], /* CJK Ideograph Extension A */ + ["\u3B44", "\u3B44"], /* CJK Ideograph Extension A */ + ["\u3B45", "\u3B45"], /* CJK Ideograph Extension A */ + ["\u3B46", "\u3B46"], /* CJK Ideograph Extension A */ + ["\u3B47", "\u3B47"], /* CJK Ideograph Extension A */ + ["\u3B48", "\u3B48"], /* CJK Ideograph Extension A */ + ["\u3B49", "\u3B49"], /* CJK Ideograph Extension A */ + ["\u3B4A", "\u3B4A"], /* CJK Ideograph Extension A */ + ["\u3B4B", "\u3B4B"], /* CJK Ideograph Extension A */ + ["\u3B4C", "\u3B4C"], /* CJK Ideograph Extension A */ + ["\u3B4D", "\u3B4D"], /* CJK Ideograph Extension A */ + ["\u3B4E", "\u3B4E"], /* CJK Ideograph Extension A */ + ["\u3B4F", "\u3B4F"], /* CJK Ideograph Extension A */ + ["\u3B50", "\u3B50"], /* CJK Ideograph Extension A */ + ["\u3B51", "\u3B51"], /* CJK Ideograph Extension A */ + ["\u3B52", "\u3B52"], /* CJK Ideograph Extension A */ + ["\u3B53", "\u3B53"], /* CJK Ideograph Extension A */ + ["\u3B54", "\u3B54"], /* CJK Ideograph Extension A */ + ["\u3B55", "\u3B55"], /* CJK Ideograph Extension A */ + ["\u3B56", "\u3B56"], /* CJK Ideograph Extension A */ + ["\u3B57", "\u3B57"], /* CJK Ideograph Extension A */ + ["\u3B58", "\u3B58"], /* CJK Ideograph Extension A */ + ["\u3B59", "\u3B59"], /* CJK Ideograph Extension A */ + ["\u3B5A", "\u3B5A"], /* CJK Ideograph Extension A */ + ["\u3B5B", "\u3B5B"], /* CJK Ideograph Extension A */ + ["\u3B5C", "\u3B5C"], /* CJK Ideograph Extension A */ + ["\u3B5D", "\u3B5D"], /* CJK Ideograph Extension A */ + ["\u3B5E", "\u3B5E"], /* CJK Ideograph Extension A */ + ["\u3B5F", "\u3B5F"], /* CJK Ideograph Extension A */ + ["\u3B60", "\u3B60"], /* CJK Ideograph Extension A */ + ["\u3B61", "\u3B61"], /* CJK Ideograph Extension A */ + ["\u3B62", "\u3B62"], /* CJK Ideograph Extension A */ + ["\u3B63", "\u3B63"], /* CJK Ideograph Extension A */ + ["\u3B64", "\u3B64"], /* CJK Ideograph Extension A */ + ["\u3B65", "\u3B65"], /* CJK Ideograph Extension A */ + ["\u3B66", "\u3B66"], /* CJK Ideograph Extension A */ + ["\u3B67", "\u3B67"], /* CJK Ideograph Extension A */ + ["\u3B68", "\u3B68"], /* CJK Ideograph Extension A */ + ["\u3B69", "\u3B69"], /* CJK Ideograph Extension A */ + ["\u3B6A", "\u3B6A"], /* CJK Ideograph Extension A */ + ["\u3B6B", "\u3B6B"], /* CJK Ideograph Extension A */ + ["\u3B6C", "\u3B6C"], /* CJK Ideograph Extension A */ + ["\u3B6D", "\u3B6D"], /* CJK Ideograph Extension A */ + ["\u3B6E", "\u3B6E"], /* CJK Ideograph Extension A */ + ["\u3B6F", "\u3B6F"], /* CJK Ideograph Extension A */ + ["\u3B70", "\u3B70"], /* CJK Ideograph Extension A */ + ["\u3B71", "\u3B71"], /* CJK Ideograph Extension A */ + ["\u3B72", "\u3B72"], /* CJK Ideograph Extension A */ + ["\u3B73", "\u3B73"], /* CJK Ideograph Extension A */ + ["\u3B74", "\u3B74"], /* CJK Ideograph Extension A */ + ["\u3B75", "\u3B75"], /* CJK Ideograph Extension A */ + ["\u3B76", "\u3B76"], /* CJK Ideograph Extension A */ + ["\u3B77", "\u3B77"], /* CJK Ideograph Extension A */ + ["\u3B78", "\u3B78"], /* CJK Ideograph Extension A */ + ["\u3B79", "\u3B79"], /* CJK Ideograph Extension A */ + ["\u3B7A", "\u3B7A"], /* CJK Ideograph Extension A */ + ["\u3B7B", "\u3B7B"], /* CJK Ideograph Extension A */ + ["\u3B7C", "\u3B7C"], /* CJK Ideograph Extension A */ + ["\u3B7D", "\u3B7D"], /* CJK Ideograph Extension A */ + ["\u3B7E", "\u3B7E"], /* CJK Ideograph Extension A */ + ["\u3B7F", "\u3B7F"], /* CJK Ideograph Extension A */ + ["\u3B80", "\u3B80"], /* CJK Ideograph Extension A */ + ["\u3B81", "\u3B81"], /* CJK Ideograph Extension A */ + ["\u3B82", "\u3B82"], /* CJK Ideograph Extension A */ + ["\u3B83", "\u3B83"], /* CJK Ideograph Extension A */ + ["\u3B84", "\u3B84"], /* CJK Ideograph Extension A */ + ["\u3B85", "\u3B85"], /* CJK Ideograph Extension A */ + ["\u3B86", "\u3B86"], /* CJK Ideograph Extension A */ + ["\u3B87", "\u3B87"], /* CJK Ideograph Extension A */ + ["\u3B88", "\u3B88"], /* CJK Ideograph Extension A */ + ["\u3B89", "\u3B89"], /* CJK Ideograph Extension A */ + ["\u3B8A", "\u3B8A"], /* CJK Ideograph Extension A */ + ["\u3B8B", "\u3B8B"], /* CJK Ideograph Extension A */ + ["\u3B8C", "\u3B8C"], /* CJK Ideograph Extension A */ + ["\u3B8D", "\u3B8D"], /* CJK Ideograph Extension A */ + ["\u3B8E", "\u3B8E"], /* CJK Ideograph Extension A */ + ["\u3B8F", "\u3B8F"], /* CJK Ideograph Extension A */ + ["\u3B90", "\u3B90"], /* CJK Ideograph Extension A */ + ["\u3B91", "\u3B91"], /* CJK Ideograph Extension A */ + ["\u3B92", "\u3B92"], /* CJK Ideograph Extension A */ + ["\u3B93", "\u3B93"], /* CJK Ideograph Extension A */ + ["\u3B94", "\u3B94"], /* CJK Ideograph Extension A */ + ["\u3B95", "\u3B95"], /* CJK Ideograph Extension A */ + ["\u3B96", "\u3B96"], /* CJK Ideograph Extension A */ + ["\u3B97", "\u3B97"], /* CJK Ideograph Extension A */ + ["\u3B98", "\u3B98"], /* CJK Ideograph Extension A */ + ["\u3B99", "\u3B99"], /* CJK Ideograph Extension A */ + ["\u3B9A", "\u3B9A"], /* CJK Ideograph Extension A */ + ["\u3B9B", "\u3B9B"], /* CJK Ideograph Extension A */ + ["\u3B9C", "\u3B9C"], /* CJK Ideograph Extension A */ + ["\u3B9D", "\u3B9D"], /* CJK Ideograph Extension A */ + ["\u3B9E", "\u3B9E"], /* CJK Ideograph Extension A */ + ["\u3B9F", "\u3B9F"], /* CJK Ideograph Extension A */ + ["\u3BA0", "\u3BA0"], /* CJK Ideograph Extension A */ + ["\u3BA1", "\u3BA1"], /* CJK Ideograph Extension A */ + ["\u3BA2", "\u3BA2"], /* CJK Ideograph Extension A */ + ["\u3BA3", "\u3BA3"], /* CJK Ideograph Extension A */ + ["\u3BA4", "\u3BA4"], /* CJK Ideograph Extension A */ + ["\u3BA5", "\u3BA5"], /* CJK Ideograph Extension A */ + ["\u3BA6", "\u3BA6"], /* CJK Ideograph Extension A */ + ["\u3BA7", "\u3BA7"], /* CJK Ideograph Extension A */ + ["\u3BA8", "\u3BA8"], /* CJK Ideograph Extension A */ + ["\u3BA9", "\u3BA9"], /* CJK Ideograph Extension A */ + ["\u3BAA", "\u3BAA"], /* CJK Ideograph Extension A */ + ["\u3BAB", "\u3BAB"], /* CJK Ideograph Extension A */ + ["\u3BAC", "\u3BAC"], /* CJK Ideograph Extension A */ + ["\u3BAD", "\u3BAD"], /* CJK Ideograph Extension A */ + ["\u3BAE", "\u3BAE"], /* CJK Ideograph Extension A */ + ["\u3BAF", "\u3BAF"], /* CJK Ideograph Extension A */ + ["\u3BB0", "\u3BB0"], /* CJK Ideograph Extension A */ + ["\u3BB1", "\u3BB1"], /* CJK Ideograph Extension A */ + ["\u3BB2", "\u3BB2"], /* CJK Ideograph Extension A */ + ["\u3BB3", "\u3BB3"], /* CJK Ideograph Extension A */ + ["\u3BB4", "\u3BB4"], /* CJK Ideograph Extension A */ + ["\u3BB5", "\u3BB5"], /* CJK Ideograph Extension A */ + ["\u3BB6", "\u3BB6"], /* CJK Ideograph Extension A */ + ["\u3BB7", "\u3BB7"], /* CJK Ideograph Extension A */ + ["\u3BB8", "\u3BB8"], /* CJK Ideograph Extension A */ + ["\u3BB9", "\u3BB9"], /* CJK Ideograph Extension A */ + ["\u3BBA", "\u3BBA"], /* CJK Ideograph Extension A */ + ["\u3BBB", "\u3BBB"], /* CJK Ideograph Extension A */ + ["\u3BBC", "\u3BBC"], /* CJK Ideograph Extension A */ + ["\u3BBD", "\u3BBD"], /* CJK Ideograph Extension A */ + ["\u3BBE", "\u3BBE"], /* CJK Ideograph Extension A */ + ["\u3BBF", "\u3BBF"], /* CJK Ideograph Extension A */ + ["\u3BC0", "\u3BC0"], /* CJK Ideograph Extension A */ + ["\u3BC1", "\u3BC1"], /* CJK Ideograph Extension A */ + ["\u3BC2", "\u3BC2"], /* CJK Ideograph Extension A */ + ["\u3BC3", "\u3BC3"], /* CJK Ideograph Extension A */ + ["\u3BC4", "\u3BC4"], /* CJK Ideograph Extension A */ + ["\u3BC5", "\u3BC5"], /* CJK Ideograph Extension A */ + ["\u3BC6", "\u3BC6"], /* CJK Ideograph Extension A */ + ["\u3BC7", "\u3BC7"], /* CJK Ideograph Extension A */ + ["\u3BC8", "\u3BC8"], /* CJK Ideograph Extension A */ + ["\u3BC9", "\u3BC9"], /* CJK Ideograph Extension A */ + ["\u3BCA", "\u3BCA"], /* CJK Ideograph Extension A */ + ["\u3BCB", "\u3BCB"], /* CJK Ideograph Extension A */ + ["\u3BCC", "\u3BCC"], /* CJK Ideograph Extension A */ + ["\u3BCD", "\u3BCD"], /* CJK Ideograph Extension A */ + ["\u3BCE", "\u3BCE"], /* CJK Ideograph Extension A */ + ["\u3BCF", "\u3BCF"], /* CJK Ideograph Extension A */ + ["\u3BD0", "\u3BD0"], /* CJK Ideograph Extension A */ + ["\u3BD1", "\u3BD1"], /* CJK Ideograph Extension A */ + ["\u3BD2", "\u3BD2"], /* CJK Ideograph Extension A */ + ["\u3BD3", "\u3BD3"], /* CJK Ideograph Extension A */ + ["\u3BD4", "\u3BD4"], /* CJK Ideograph Extension A */ + ["\u3BD5", "\u3BD5"], /* CJK Ideograph Extension A */ + ["\u3BD6", "\u3BD6"], /* CJK Ideograph Extension A */ + ["\u3BD7", "\u3BD7"], /* CJK Ideograph Extension A */ + ["\u3BD8", "\u3BD8"], /* CJK Ideograph Extension A */ + ["\u3BD9", "\u3BD9"], /* CJK Ideograph Extension A */ + ["\u3BDA", "\u3BDA"], /* CJK Ideograph Extension A */ + ["\u3BDB", "\u3BDB"], /* CJK Ideograph Extension A */ + ["\u3BDC", "\u3BDC"], /* CJK Ideograph Extension A */ + ["\u3BDD", "\u3BDD"], /* CJK Ideograph Extension A */ + ["\u3BDE", "\u3BDE"], /* CJK Ideograph Extension A */ + ["\u3BDF", "\u3BDF"], /* CJK Ideograph Extension A */ + ["\u3BE0", "\u3BE0"], /* CJK Ideograph Extension A */ + ["\u3BE1", "\u3BE1"], /* CJK Ideograph Extension A */ + ["\u3BE2", "\u3BE2"], /* CJK Ideograph Extension A */ + ["\u3BE3", "\u3BE3"], /* CJK Ideograph Extension A */ + ["\u3BE4", "\u3BE4"], /* CJK Ideograph Extension A */ + ["\u3BE5", "\u3BE5"], /* CJK Ideograph Extension A */ + ["\u3BE6", "\u3BE6"], /* CJK Ideograph Extension A */ + ["\u3BE7", "\u3BE7"], /* CJK Ideograph Extension A */ + ["\u3BE8", "\u3BE8"], /* CJK Ideograph Extension A */ + ["\u3BE9", "\u3BE9"], /* CJK Ideograph Extension A */ + ["\u3BEA", "\u3BEA"], /* CJK Ideograph Extension A */ + ["\u3BEB", "\u3BEB"], /* CJK Ideograph Extension A */ + ["\u3BEC", "\u3BEC"], /* CJK Ideograph Extension A */ + ["\u3BED", "\u3BED"], /* CJK Ideograph Extension A */ + ["\u3BEE", "\u3BEE"], /* CJK Ideograph Extension A */ + ["\u3BEF", "\u3BEF"], /* CJK Ideograph Extension A */ + ["\u3BF0", "\u3BF0"], /* CJK Ideograph Extension A */ + ["\u3BF1", "\u3BF1"], /* CJK Ideograph Extension A */ + ["\u3BF2", "\u3BF2"], /* CJK Ideograph Extension A */ + ["\u3BF3", "\u3BF3"], /* CJK Ideograph Extension A */ + ["\u3BF4", "\u3BF4"], /* CJK Ideograph Extension A */ + ["\u3BF5", "\u3BF5"], /* CJK Ideograph Extension A */ + ["\u3BF6", "\u3BF6"], /* CJK Ideograph Extension A */ + ["\u3BF7", "\u3BF7"], /* CJK Ideograph Extension A */ + ["\u3BF8", "\u3BF8"], /* CJK Ideograph Extension A */ + ["\u3BF9", "\u3BF9"], /* CJK Ideograph Extension A */ + ["\u3BFA", "\u3BFA"], /* CJK Ideograph Extension A */ + ["\u3BFB", "\u3BFB"], /* CJK Ideograph Extension A */ + ["\u3BFC", "\u3BFC"], /* CJK Ideograph Extension A */ + ["\u3BFD", "\u3BFD"], /* CJK Ideograph Extension A */ + ["\u3BFE", "\u3BFE"], /* CJK Ideograph Extension A */ + ["\u3BFF", "\u3BFF"], /* CJK Ideograph Extension A */ + ["\u3C00", "\u3C00"], /* CJK Ideograph Extension A */ + ["\u3C01", "\u3C01"], /* CJK Ideograph Extension A */ + ["\u3C02", "\u3C02"], /* CJK Ideograph Extension A */ + ["\u3C03", "\u3C03"], /* CJK Ideograph Extension A */ + ["\u3C04", "\u3C04"], /* CJK Ideograph Extension A */ + ["\u3C05", "\u3C05"], /* CJK Ideograph Extension A */ + ["\u3C06", "\u3C06"], /* CJK Ideograph Extension A */ + ["\u3C07", "\u3C07"], /* CJK Ideograph Extension A */ + ["\u3C08", "\u3C08"], /* CJK Ideograph Extension A */ + ["\u3C09", "\u3C09"], /* CJK Ideograph Extension A */ + ["\u3C0A", "\u3C0A"], /* CJK Ideograph Extension A */ + ["\u3C0B", "\u3C0B"], /* CJK Ideograph Extension A */ + ["\u3C0C", "\u3C0C"], /* CJK Ideograph Extension A */ + ["\u3C0D", "\u3C0D"], /* CJK Ideograph Extension A */ + ["\u3C0E", "\u3C0E"], /* CJK Ideograph Extension A */ + ["\u3C0F", "\u3C0F"], /* CJK Ideograph Extension A */ + ["\u3C10", "\u3C10"], /* CJK Ideograph Extension A */ + ["\u3C11", "\u3C11"], /* CJK Ideograph Extension A */ + ["\u3C12", "\u3C12"], /* CJK Ideograph Extension A */ + ["\u3C13", "\u3C13"], /* CJK Ideograph Extension A */ + ["\u3C14", "\u3C14"], /* CJK Ideograph Extension A */ + ["\u3C15", "\u3C15"], /* CJK Ideograph Extension A */ + ["\u3C16", "\u3C16"], /* CJK Ideograph Extension A */ + ["\u3C17", "\u3C17"], /* CJK Ideograph Extension A */ + ["\u3C18", "\u3C18"], /* CJK Ideograph Extension A */ + ["\u3C19", "\u3C19"], /* CJK Ideograph Extension A */ + ["\u3C1A", "\u3C1A"], /* CJK Ideograph Extension A */ + ["\u3C1B", "\u3C1B"], /* CJK Ideograph Extension A */ + ["\u3C1C", "\u3C1C"], /* CJK Ideograph Extension A */ + ["\u3C1D", "\u3C1D"], /* CJK Ideograph Extension A */ + ["\u3C1E", "\u3C1E"], /* CJK Ideograph Extension A */ + ["\u3C1F", "\u3C1F"], /* CJK Ideograph Extension A */ + ["\u3C20", "\u3C20"], /* CJK Ideograph Extension A */ + ["\u3C21", "\u3C21"], /* CJK Ideograph Extension A */ + ["\u3C22", "\u3C22"], /* CJK Ideograph Extension A */ + ["\u3C23", "\u3C23"], /* CJK Ideograph Extension A */ + ["\u3C24", "\u3C24"], /* CJK Ideograph Extension A */ + ["\u3C25", "\u3C25"], /* CJK Ideograph Extension A */ + ["\u3C26", "\u3C26"], /* CJK Ideograph Extension A */ + ["\u3C27", "\u3C27"], /* CJK Ideograph Extension A */ + ["\u3C28", "\u3C28"], /* CJK Ideograph Extension A */ + ["\u3C29", "\u3C29"], /* CJK Ideograph Extension A */ + ["\u3C2A", "\u3C2A"], /* CJK Ideograph Extension A */ + ["\u3C2B", "\u3C2B"], /* CJK Ideograph Extension A */ + ["\u3C2C", "\u3C2C"], /* CJK Ideograph Extension A */ + ["\u3C2D", "\u3C2D"], /* CJK Ideograph Extension A */ + ["\u3C2E", "\u3C2E"], /* CJK Ideograph Extension A */ + ["\u3C2F", "\u3C2F"], /* CJK Ideograph Extension A */ + ["\u3C30", "\u3C30"], /* CJK Ideograph Extension A */ + ["\u3C31", "\u3C31"], /* CJK Ideograph Extension A */ + ["\u3C32", "\u3C32"], /* CJK Ideograph Extension A */ + ["\u3C33", "\u3C33"], /* CJK Ideograph Extension A */ + ["\u3C34", "\u3C34"], /* CJK Ideograph Extension A */ + ["\u3C35", "\u3C35"], /* CJK Ideograph Extension A */ + ["\u3C36", "\u3C36"], /* CJK Ideograph Extension A */ + ["\u3C37", "\u3C37"], /* CJK Ideograph Extension A */ + ["\u3C38", "\u3C38"], /* CJK Ideograph Extension A */ + ["\u3C39", "\u3C39"], /* CJK Ideograph Extension A */ + ["\u3C3A", "\u3C3A"], /* CJK Ideograph Extension A */ + ["\u3C3B", "\u3C3B"], /* CJK Ideograph Extension A */ + ["\u3C3C", "\u3C3C"], /* CJK Ideograph Extension A */ + ["\u3C3D", "\u3C3D"], /* CJK Ideograph Extension A */ + ["\u3C3E", "\u3C3E"], /* CJK Ideograph Extension A */ + ["\u3C3F", "\u3C3F"], /* CJK Ideograph Extension A */ + ["\u3C40", "\u3C40"], /* CJK Ideograph Extension A */ + ["\u3C41", "\u3C41"], /* CJK Ideograph Extension A */ + ["\u3C42", "\u3C42"], /* CJK Ideograph Extension A */ + ["\u3C43", "\u3C43"], /* CJK Ideograph Extension A */ + ["\u3C44", "\u3C44"], /* CJK Ideograph Extension A */ + ["\u3C45", "\u3C45"], /* CJK Ideograph Extension A */ + ["\u3C46", "\u3C46"], /* CJK Ideograph Extension A */ + ["\u3C47", "\u3C47"], /* CJK Ideograph Extension A */ + ["\u3C48", "\u3C48"], /* CJK Ideograph Extension A */ + ["\u3C49", "\u3C49"], /* CJK Ideograph Extension A */ + ["\u3C4A", "\u3C4A"], /* CJK Ideograph Extension A */ + ["\u3C4B", "\u3C4B"], /* CJK Ideograph Extension A */ + ["\u3C4C", "\u3C4C"], /* CJK Ideograph Extension A */ + ["\u3C4D", "\u3C4D"], /* CJK Ideograph Extension A */ + ["\u3C4E", "\u3C4E"], /* CJK Ideograph Extension A */ + ["\u3C4F", "\u3C4F"], /* CJK Ideograph Extension A */ + ["\u3C50", "\u3C50"], /* CJK Ideograph Extension A */ + ["\u3C51", "\u3C51"], /* CJK Ideograph Extension A */ + ["\u3C52", "\u3C52"], /* CJK Ideograph Extension A */ + ["\u3C53", "\u3C53"], /* CJK Ideograph Extension A */ + ["\u3C54", "\u3C54"], /* CJK Ideograph Extension A */ + ["\u3C55", "\u3C55"], /* CJK Ideograph Extension A */ + ["\u3C56", "\u3C56"], /* CJK Ideograph Extension A */ + ["\u3C57", "\u3C57"], /* CJK Ideograph Extension A */ + ["\u3C58", "\u3C58"], /* CJK Ideograph Extension A */ + ["\u3C59", "\u3C59"], /* CJK Ideograph Extension A */ + ["\u3C5A", "\u3C5A"], /* CJK Ideograph Extension A */ + ["\u3C5B", "\u3C5B"], /* CJK Ideograph Extension A */ + ["\u3C5C", "\u3C5C"], /* CJK Ideograph Extension A */ + ["\u3C5D", "\u3C5D"], /* CJK Ideograph Extension A */ + ["\u3C5E", "\u3C5E"], /* CJK Ideograph Extension A */ + ["\u3C5F", "\u3C5F"], /* CJK Ideograph Extension A */ + ["\u3C60", "\u3C60"], /* CJK Ideograph Extension A */ + ["\u3C61", "\u3C61"], /* CJK Ideograph Extension A */ + ["\u3C62", "\u3C62"], /* CJK Ideograph Extension A */ + ["\u3C63", "\u3C63"], /* CJK Ideograph Extension A */ + ["\u3C64", "\u3C64"], /* CJK Ideograph Extension A */ + ["\u3C65", "\u3C65"], /* CJK Ideograph Extension A */ + ["\u3C66", "\u3C66"], /* CJK Ideograph Extension A */ + ["\u3C67", "\u3C67"], /* CJK Ideograph Extension A */ + ["\u3C68", "\u3C68"], /* CJK Ideograph Extension A */ + ["\u3C69", "\u3C69"], /* CJK Ideograph Extension A */ + ["\u3C6A", "\u3C6A"], /* CJK Ideograph Extension A */ + ["\u3C6B", "\u3C6B"], /* CJK Ideograph Extension A */ + ["\u3C6C", "\u3C6C"], /* CJK Ideograph Extension A */ + ["\u3C6D", "\u3C6D"], /* CJK Ideograph Extension A */ + ["\u3C6E", "\u3C6E"], /* CJK Ideograph Extension A */ + ["\u3C6F", "\u3C6F"], /* CJK Ideograph Extension A */ + ["\u3C70", "\u3C70"], /* CJK Ideograph Extension A */ + ["\u3C71", "\u3C71"], /* CJK Ideograph Extension A */ + ["\u3C72", "\u3C72"], /* CJK Ideograph Extension A */ + ["\u3C73", "\u3C73"], /* CJK Ideograph Extension A */ + ["\u3C74", "\u3C74"], /* CJK Ideograph Extension A */ + ["\u3C75", "\u3C75"], /* CJK Ideograph Extension A */ + ["\u3C76", "\u3C76"], /* CJK Ideograph Extension A */ + ["\u3C77", "\u3C77"], /* CJK Ideograph Extension A */ + ["\u3C78", "\u3C78"], /* CJK Ideograph Extension A */ + ["\u3C79", "\u3C79"], /* CJK Ideograph Extension A */ + ["\u3C7A", "\u3C7A"], /* CJK Ideograph Extension A */ + ["\u3C7B", "\u3C7B"], /* CJK Ideograph Extension A */ + ["\u3C7C", "\u3C7C"], /* CJK Ideograph Extension A */ + ["\u3C7D", "\u3C7D"], /* CJK Ideograph Extension A */ + ["\u3C7E", "\u3C7E"], /* CJK Ideograph Extension A */ + ["\u3C7F", "\u3C7F"], /* CJK Ideograph Extension A */ + ["\u3C80", "\u3C80"], /* CJK Ideograph Extension A */ + ["\u3C81", "\u3C81"], /* CJK Ideograph Extension A */ + ["\u3C82", "\u3C82"], /* CJK Ideograph Extension A */ + ["\u3C83", "\u3C83"], /* CJK Ideograph Extension A */ + ["\u3C84", "\u3C84"], /* CJK Ideograph Extension A */ + ["\u3C85", "\u3C85"], /* CJK Ideograph Extension A */ + ["\u3C86", "\u3C86"], /* CJK Ideograph Extension A */ + ["\u3C87", "\u3C87"], /* CJK Ideograph Extension A */ + ["\u3C88", "\u3C88"], /* CJK Ideograph Extension A */ + ["\u3C89", "\u3C89"], /* CJK Ideograph Extension A */ + ["\u3C8A", "\u3C8A"], /* CJK Ideograph Extension A */ + ["\u3C8B", "\u3C8B"], /* CJK Ideograph Extension A */ + ["\u3C8C", "\u3C8C"], /* CJK Ideograph Extension A */ + ["\u3C8D", "\u3C8D"], /* CJK Ideograph Extension A */ + ["\u3C8E", "\u3C8E"], /* CJK Ideograph Extension A */ + ["\u3C8F", "\u3C8F"], /* CJK Ideograph Extension A */ + ["\u3C90", "\u3C90"], /* CJK Ideograph Extension A */ + ["\u3C91", "\u3C91"], /* CJK Ideograph Extension A */ + ["\u3C92", "\u3C92"], /* CJK Ideograph Extension A */ + ["\u3C93", "\u3C93"], /* CJK Ideograph Extension A */ + ["\u3C94", "\u3C94"], /* CJK Ideograph Extension A */ + ["\u3C95", "\u3C95"], /* CJK Ideograph Extension A */ + ["\u3C96", "\u3C96"], /* CJK Ideograph Extension A */ + ["\u3C97", "\u3C97"], /* CJK Ideograph Extension A */ + ["\u3C98", "\u3C98"], /* CJK Ideograph Extension A */ + ["\u3C99", "\u3C99"], /* CJK Ideograph Extension A */ + ["\u3C9A", "\u3C9A"], /* CJK Ideograph Extension A */ + ["\u3C9B", "\u3C9B"], /* CJK Ideograph Extension A */ + ["\u3C9C", "\u3C9C"], /* CJK Ideograph Extension A */ + ["\u3C9D", "\u3C9D"], /* CJK Ideograph Extension A */ + ["\u3C9E", "\u3C9E"], /* CJK Ideograph Extension A */ + ["\u3C9F", "\u3C9F"], /* CJK Ideograph Extension A */ + ["\u3CA0", "\u3CA0"], /* CJK Ideograph Extension A */ + ["\u3CA1", "\u3CA1"], /* CJK Ideograph Extension A */ + ["\u3CA2", "\u3CA2"], /* CJK Ideograph Extension A */ + ["\u3CA3", "\u3CA3"], /* CJK Ideograph Extension A */ + ["\u3CA4", "\u3CA4"], /* CJK Ideograph Extension A */ + ["\u3CA5", "\u3CA5"], /* CJK Ideograph Extension A */ + ["\u3CA6", "\u3CA6"], /* CJK Ideograph Extension A */ + ["\u3CA7", "\u3CA7"], /* CJK Ideograph Extension A */ + ["\u3CA8", "\u3CA8"], /* CJK Ideograph Extension A */ + ["\u3CA9", "\u3CA9"], /* CJK Ideograph Extension A */ + ["\u3CAA", "\u3CAA"], /* CJK Ideograph Extension A */ + ["\u3CAB", "\u3CAB"], /* CJK Ideograph Extension A */ + ["\u3CAC", "\u3CAC"], /* CJK Ideograph Extension A */ + ["\u3CAD", "\u3CAD"], /* CJK Ideograph Extension A */ + ["\u3CAE", "\u3CAE"], /* CJK Ideograph Extension A */ + ["\u3CAF", "\u3CAF"], /* CJK Ideograph Extension A */ + ["\u3CB0", "\u3CB0"], /* CJK Ideograph Extension A */ + ["\u3CB1", "\u3CB1"], /* CJK Ideograph Extension A */ + ["\u3CB2", "\u3CB2"], /* CJK Ideograph Extension A */ + ["\u3CB3", "\u3CB3"], /* CJK Ideograph Extension A */ + ["\u3CB4", "\u3CB4"], /* CJK Ideograph Extension A */ + ["\u3CB5", "\u3CB5"], /* CJK Ideograph Extension A */ + ["\u3CB6", "\u3CB6"], /* CJK Ideograph Extension A */ + ["\u3CB7", "\u3CB7"], /* CJK Ideograph Extension A */ + ["\u3CB8", "\u3CB8"], /* CJK Ideograph Extension A */ + ["\u3CB9", "\u3CB9"], /* CJK Ideograph Extension A */ + ["\u3CBA", "\u3CBA"], /* CJK Ideograph Extension A */ + ["\u3CBB", "\u3CBB"], /* CJK Ideograph Extension A */ + ["\u3CBC", "\u3CBC"], /* CJK Ideograph Extension A */ + ["\u3CBD", "\u3CBD"], /* CJK Ideograph Extension A */ + ["\u3CBE", "\u3CBE"], /* CJK Ideograph Extension A */ + ["\u3CBF", "\u3CBF"], /* CJK Ideograph Extension A */ + ["\u3CC0", "\u3CC0"], /* CJK Ideograph Extension A */ + ["\u3CC1", "\u3CC1"], /* CJK Ideograph Extension A */ + ["\u3CC2", "\u3CC2"], /* CJK Ideograph Extension A */ + ["\u3CC3", "\u3CC3"], /* CJK Ideograph Extension A */ + ["\u3CC4", "\u3CC4"], /* CJK Ideograph Extension A */ + ["\u3CC5", "\u3CC5"], /* CJK Ideograph Extension A */ + ["\u3CC6", "\u3CC6"], /* CJK Ideograph Extension A */ + ["\u3CC7", "\u3CC7"], /* CJK Ideograph Extension A */ + ["\u3CC8", "\u3CC8"], /* CJK Ideograph Extension A */ + ["\u3CC9", "\u3CC9"], /* CJK Ideograph Extension A */ + ["\u3CCA", "\u3CCA"], /* CJK Ideograph Extension A */ + ["\u3CCB", "\u3CCB"], /* CJK Ideograph Extension A */ + ["\u3CCC", "\u3CCC"], /* CJK Ideograph Extension A */ + ["\u3CCD", "\u3CCD"], /* CJK Ideograph Extension A */ + ["\u3CCE", "\u3CCE"], /* CJK Ideograph Extension A */ + ["\u3CCF", "\u3CCF"], /* CJK Ideograph Extension A */ + ["\u3CD0", "\u3CD0"], /* CJK Ideograph Extension A */ + ["\u3CD1", "\u3CD1"], /* CJK Ideograph Extension A */ + ["\u3CD2", "\u3CD2"], /* CJK Ideograph Extension A */ + ["\u3CD3", "\u3CD3"], /* CJK Ideograph Extension A */ + ["\u3CD4", "\u3CD4"], /* CJK Ideograph Extension A */ + ["\u3CD5", "\u3CD5"], /* CJK Ideograph Extension A */ + ["\u3CD6", "\u3CD6"], /* CJK Ideograph Extension A */ + ["\u3CD7", "\u3CD7"], /* CJK Ideograph Extension A */ + ["\u3CD8", "\u3CD8"], /* CJK Ideograph Extension A */ + ["\u3CD9", "\u3CD9"], /* CJK Ideograph Extension A */ + ["\u3CDA", "\u3CDA"], /* CJK Ideograph Extension A */ + ["\u3CDB", "\u3CDB"], /* CJK Ideograph Extension A */ + ["\u3CDC", "\u3CDC"], /* CJK Ideograph Extension A */ + ["\u3CDD", "\u3CDD"], /* CJK Ideograph Extension A */ + ["\u3CDE", "\u3CDE"], /* CJK Ideograph Extension A */ + ["\u3CDF", "\u3CDF"], /* CJK Ideograph Extension A */ + ["\u3CE0", "\u3CE0"], /* CJK Ideograph Extension A */ + ["\u3CE1", "\u3CE1"], /* CJK Ideograph Extension A */ + ["\u3CE2", "\u3CE2"], /* CJK Ideograph Extension A */ + ["\u3CE3", "\u3CE3"], /* CJK Ideograph Extension A */ + ["\u3CE4", "\u3CE4"], /* CJK Ideograph Extension A */ + ["\u3CE5", "\u3CE5"], /* CJK Ideograph Extension A */ + ["\u3CE6", "\u3CE6"], /* CJK Ideograph Extension A */ + ["\u3CE7", "\u3CE7"], /* CJK Ideograph Extension A */ + ["\u3CE8", "\u3CE8"], /* CJK Ideograph Extension A */ + ["\u3CE9", "\u3CE9"], /* CJK Ideograph Extension A */ + ["\u3CEA", "\u3CEA"], /* CJK Ideograph Extension A */ + ["\u3CEB", "\u3CEB"], /* CJK Ideograph Extension A */ + ["\u3CEC", "\u3CEC"], /* CJK Ideograph Extension A */ + ["\u3CED", "\u3CED"], /* CJK Ideograph Extension A */ + ["\u3CEE", "\u3CEE"], /* CJK Ideograph Extension A */ + ["\u3CEF", "\u3CEF"], /* CJK Ideograph Extension A */ + ["\u3CF0", "\u3CF0"], /* CJK Ideograph Extension A */ + ["\u3CF1", "\u3CF1"], /* CJK Ideograph Extension A */ + ["\u3CF2", "\u3CF2"], /* CJK Ideograph Extension A */ + ["\u3CF3", "\u3CF3"], /* CJK Ideograph Extension A */ + ["\u3CF4", "\u3CF4"], /* CJK Ideograph Extension A */ + ["\u3CF5", "\u3CF5"], /* CJK Ideograph Extension A */ + ["\u3CF6", "\u3CF6"], /* CJK Ideograph Extension A */ + ["\u3CF7", "\u3CF7"], /* CJK Ideograph Extension A */ + ["\u3CF8", "\u3CF8"], /* CJK Ideograph Extension A */ + ["\u3CF9", "\u3CF9"], /* CJK Ideograph Extension A */ + ["\u3CFA", "\u3CFA"], /* CJK Ideograph Extension A */ + ["\u3CFB", "\u3CFB"], /* CJK Ideograph Extension A */ + ["\u3CFC", "\u3CFC"], /* CJK Ideograph Extension A */ + ["\u3CFD", "\u3CFD"], /* CJK Ideograph Extension A */ + ["\u3CFE", "\u3CFE"], /* CJK Ideograph Extension A */ + ["\u3CFF", "\u3CFF"], /* CJK Ideograph Extension A */ + ["\u3D00", "\u3D00"], /* CJK Ideograph Extension A */ + ["\u3D01", "\u3D01"], /* CJK Ideograph Extension A */ + ["\u3D02", "\u3D02"], /* CJK Ideograph Extension A */ + ["\u3D03", "\u3D03"], /* CJK Ideograph Extension A */ + ["\u3D04", "\u3D04"], /* CJK Ideograph Extension A */ + ["\u3D05", "\u3D05"], /* CJK Ideograph Extension A */ + ["\u3D06", "\u3D06"], /* CJK Ideograph Extension A */ + ["\u3D07", "\u3D07"], /* CJK Ideograph Extension A */ + ["\u3D08", "\u3D08"], /* CJK Ideograph Extension A */ + ["\u3D09", "\u3D09"], /* CJK Ideograph Extension A */ + ["\u3D0A", "\u3D0A"], /* CJK Ideograph Extension A */ + ["\u3D0B", "\u3D0B"], /* CJK Ideograph Extension A */ + ["\u3D0C", "\u3D0C"], /* CJK Ideograph Extension A */ + ["\u3D0D", "\u3D0D"], /* CJK Ideograph Extension A */ + ["\u3D0E", "\u3D0E"], /* CJK Ideograph Extension A */ + ["\u3D0F", "\u3D0F"], /* CJK Ideograph Extension A */ + ["\u3D10", "\u3D10"], /* CJK Ideograph Extension A */ + ["\u3D11", "\u3D11"], /* CJK Ideograph Extension A */ + ["\u3D12", "\u3D12"], /* CJK Ideograph Extension A */ + ["\u3D13", "\u3D13"], /* CJK Ideograph Extension A */ + ["\u3D14", "\u3D14"], /* CJK Ideograph Extension A */ + ["\u3D15", "\u3D15"], /* CJK Ideograph Extension A */ + ["\u3D16", "\u3D16"], /* CJK Ideograph Extension A */ + ["\u3D17", "\u3D17"], /* CJK Ideograph Extension A */ + ["\u3D18", "\u3D18"], /* CJK Ideograph Extension A */ + ["\u3D19", "\u3D19"], /* CJK Ideograph Extension A */ + ["\u3D1A", "\u3D1A"], /* CJK Ideograph Extension A */ + ["\u3D1B", "\u3D1B"], /* CJK Ideograph Extension A */ + ["\u3D1C", "\u3D1C"], /* CJK Ideograph Extension A */ + ["\u3D1D", "\u3D1D"], /* CJK Ideograph Extension A */ + ["\u3D1E", "\u3D1E"], /* CJK Ideograph Extension A */ + ["\u3D1F", "\u3D1F"], /* CJK Ideograph Extension A */ + ["\u3D20", "\u3D20"], /* CJK Ideograph Extension A */ + ["\u3D21", "\u3D21"], /* CJK Ideograph Extension A */ + ["\u3D22", "\u3D22"], /* CJK Ideograph Extension A */ + ["\u3D23", "\u3D23"], /* CJK Ideograph Extension A */ + ["\u3D24", "\u3D24"], /* CJK Ideograph Extension A */ + ["\u3D25", "\u3D25"], /* CJK Ideograph Extension A */ + ["\u3D26", "\u3D26"], /* CJK Ideograph Extension A */ + ["\u3D27", "\u3D27"], /* CJK Ideograph Extension A */ + ["\u3D28", "\u3D28"], /* CJK Ideograph Extension A */ + ["\u3D29", "\u3D29"], /* CJK Ideograph Extension A */ + ["\u3D2A", "\u3D2A"], /* CJK Ideograph Extension A */ + ["\u3D2B", "\u3D2B"], /* CJK Ideograph Extension A */ + ["\u3D2C", "\u3D2C"], /* CJK Ideograph Extension A */ + ["\u3D2D", "\u3D2D"], /* CJK Ideograph Extension A */ + ["\u3D2E", "\u3D2E"], /* CJK Ideograph Extension A */ + ["\u3D2F", "\u3D2F"], /* CJK Ideograph Extension A */ + ["\u3D30", "\u3D30"], /* CJK Ideograph Extension A */ + ["\u3D31", "\u3D31"], /* CJK Ideograph Extension A */ + ["\u3D32", "\u3D32"], /* CJK Ideograph Extension A */ + ["\u3D33", "\u3D33"], /* CJK Ideograph Extension A */ + ["\u3D34", "\u3D34"], /* CJK Ideograph Extension A */ + ["\u3D35", "\u3D35"], /* CJK Ideograph Extension A */ + ["\u3D36", "\u3D36"], /* CJK Ideograph Extension A */ + ["\u3D37", "\u3D37"], /* CJK Ideograph Extension A */ + ["\u3D38", "\u3D38"], /* CJK Ideograph Extension A */ + ["\u3D39", "\u3D39"], /* CJK Ideograph Extension A */ + ["\u3D3A", "\u3D3A"], /* CJK Ideograph Extension A */ + ["\u3D3B", "\u3D3B"], /* CJK Ideograph Extension A */ + ["\u3D3C", "\u3D3C"], /* CJK Ideograph Extension A */ + ["\u3D3D", "\u3D3D"], /* CJK Ideograph Extension A */ + ["\u3D3E", "\u3D3E"], /* CJK Ideograph Extension A */ + ["\u3D3F", "\u3D3F"], /* CJK Ideograph Extension A */ + ["\u3D40", "\u3D40"], /* CJK Ideograph Extension A */ + ["\u3D41", "\u3D41"], /* CJK Ideograph Extension A */ + ["\u3D42", "\u3D42"], /* CJK Ideograph Extension A */ + ["\u3D43", "\u3D43"], /* CJK Ideograph Extension A */ + ["\u3D44", "\u3D44"], /* CJK Ideograph Extension A */ + ["\u3D45", "\u3D45"], /* CJK Ideograph Extension A */ + ["\u3D46", "\u3D46"], /* CJK Ideograph Extension A */ + ["\u3D47", "\u3D47"], /* CJK Ideograph Extension A */ + ["\u3D48", "\u3D48"], /* CJK Ideograph Extension A */ + ["\u3D49", "\u3D49"], /* CJK Ideograph Extension A */ + ["\u3D4A", "\u3D4A"], /* CJK Ideograph Extension A */ + ["\u3D4B", "\u3D4B"], /* CJK Ideograph Extension A */ + ["\u3D4C", "\u3D4C"], /* CJK Ideograph Extension A */ + ["\u3D4D", "\u3D4D"], /* CJK Ideograph Extension A */ + ["\u3D4E", "\u3D4E"], /* CJK Ideograph Extension A */ + ["\u3D4F", "\u3D4F"], /* CJK Ideograph Extension A */ + ["\u3D50", "\u3D50"], /* CJK Ideograph Extension A */ + ["\u3D51", "\u3D51"], /* CJK Ideograph Extension A */ + ["\u3D52", "\u3D52"], /* CJK Ideograph Extension A */ + ["\u3D53", "\u3D53"], /* CJK Ideograph Extension A */ + ["\u3D54", "\u3D54"], /* CJK Ideograph Extension A */ + ["\u3D55", "\u3D55"], /* CJK Ideograph Extension A */ + ["\u3D56", "\u3D56"], /* CJK Ideograph Extension A */ + ["\u3D57", "\u3D57"], /* CJK Ideograph Extension A */ + ["\u3D58", "\u3D58"], /* CJK Ideograph Extension A */ + ["\u3D59", "\u3D59"], /* CJK Ideograph Extension A */ + ["\u3D5A", "\u3D5A"], /* CJK Ideograph Extension A */ + ["\u3D5B", "\u3D5B"], /* CJK Ideograph Extension A */ + ["\u3D5C", "\u3D5C"], /* CJK Ideograph Extension A */ + ["\u3D5D", "\u3D5D"], /* CJK Ideograph Extension A */ + ["\u3D5E", "\u3D5E"], /* CJK Ideograph Extension A */ + ["\u3D5F", "\u3D5F"], /* CJK Ideograph Extension A */ + ["\u3D60", "\u3D60"], /* CJK Ideograph Extension A */ + ["\u3D61", "\u3D61"], /* CJK Ideograph Extension A */ + ["\u3D62", "\u3D62"], /* CJK Ideograph Extension A */ + ["\u3D63", "\u3D63"], /* CJK Ideograph Extension A */ + ["\u3D64", "\u3D64"], /* CJK Ideograph Extension A */ + ["\u3D65", "\u3D65"], /* CJK Ideograph Extension A */ + ["\u3D66", "\u3D66"], /* CJK Ideograph Extension A */ + ["\u3D67", "\u3D67"], /* CJK Ideograph Extension A */ + ["\u3D68", "\u3D68"], /* CJK Ideograph Extension A */ + ["\u3D69", "\u3D69"], /* CJK Ideograph Extension A */ + ["\u3D6A", "\u3D6A"], /* CJK Ideograph Extension A */ + ["\u3D6B", "\u3D6B"], /* CJK Ideograph Extension A */ + ["\u3D6C", "\u3D6C"], /* CJK Ideograph Extension A */ + ["\u3D6D", "\u3D6D"], /* CJK Ideograph Extension A */ + ["\u3D6E", "\u3D6E"], /* CJK Ideograph Extension A */ + ["\u3D6F", "\u3D6F"], /* CJK Ideograph Extension A */ + ["\u3D70", "\u3D70"], /* CJK Ideograph Extension A */ + ["\u3D71", "\u3D71"], /* CJK Ideograph Extension A */ + ["\u3D72", "\u3D72"], /* CJK Ideograph Extension A */ + ["\u3D73", "\u3D73"], /* CJK Ideograph Extension A */ + ["\u3D74", "\u3D74"], /* CJK Ideograph Extension A */ + ["\u3D75", "\u3D75"], /* CJK Ideograph Extension A */ + ["\u3D76", "\u3D76"], /* CJK Ideograph Extension A */ + ["\u3D77", "\u3D77"], /* CJK Ideograph Extension A */ + ["\u3D78", "\u3D78"], /* CJK Ideograph Extension A */ + ["\u3D79", "\u3D79"], /* CJK Ideograph Extension A */ + ["\u3D7A", "\u3D7A"], /* CJK Ideograph Extension A */ + ["\u3D7B", "\u3D7B"], /* CJK Ideograph Extension A */ + ["\u3D7C", "\u3D7C"], /* CJK Ideograph Extension A */ + ["\u3D7D", "\u3D7D"], /* CJK Ideograph Extension A */ + ["\u3D7E", "\u3D7E"], /* CJK Ideograph Extension A */ + ["\u3D7F", "\u3D7F"], /* CJK Ideograph Extension A */ + ["\u3D80", "\u3D80"], /* CJK Ideograph Extension A */ + ["\u3D81", "\u3D81"], /* CJK Ideograph Extension A */ + ["\u3D82", "\u3D82"], /* CJK Ideograph Extension A */ + ["\u3D83", "\u3D83"], /* CJK Ideograph Extension A */ + ["\u3D84", "\u3D84"], /* CJK Ideograph Extension A */ + ["\u3D85", "\u3D85"], /* CJK Ideograph Extension A */ + ["\u3D86", "\u3D86"], /* CJK Ideograph Extension A */ + ["\u3D87", "\u3D87"], /* CJK Ideograph Extension A */ + ["\u3D88", "\u3D88"], /* CJK Ideograph Extension A */ + ["\u3D89", "\u3D89"], /* CJK Ideograph Extension A */ + ["\u3D8A", "\u3D8A"], /* CJK Ideograph Extension A */ + ["\u3D8B", "\u3D8B"], /* CJK Ideograph Extension A */ + ["\u3D8C", "\u3D8C"], /* CJK Ideograph Extension A */ + ["\u3D8D", "\u3D8D"], /* CJK Ideograph Extension A */ + ["\u3D8E", "\u3D8E"], /* CJK Ideograph Extension A */ + ["\u3D8F", "\u3D8F"], /* CJK Ideograph Extension A */ + ["\u3D90", "\u3D90"], /* CJK Ideograph Extension A */ + ["\u3D91", "\u3D91"], /* CJK Ideograph Extension A */ + ["\u3D92", "\u3D92"], /* CJK Ideograph Extension A */ + ["\u3D93", "\u3D93"], /* CJK Ideograph Extension A */ + ["\u3D94", "\u3D94"], /* CJK Ideograph Extension A */ + ["\u3D95", "\u3D95"], /* CJK Ideograph Extension A */ + ["\u3D96", "\u3D96"], /* CJK Ideograph Extension A */ + ["\u3D97", "\u3D97"], /* CJK Ideograph Extension A */ + ["\u3D98", "\u3D98"], /* CJK Ideograph Extension A */ + ["\u3D99", "\u3D99"], /* CJK Ideograph Extension A */ + ["\u3D9A", "\u3D9A"], /* CJK Ideograph Extension A */ + ["\u3D9B", "\u3D9B"], /* CJK Ideograph Extension A */ + ["\u3D9C", "\u3D9C"], /* CJK Ideograph Extension A */ + ["\u3D9D", "\u3D9D"], /* CJK Ideograph Extension A */ + ["\u3D9E", "\u3D9E"], /* CJK Ideograph Extension A */ + ["\u3D9F", "\u3D9F"], /* CJK Ideograph Extension A */ + ["\u3DA0", "\u3DA0"], /* CJK Ideograph Extension A */ + ["\u3DA1", "\u3DA1"], /* CJK Ideograph Extension A */ + ["\u3DA2", "\u3DA2"], /* CJK Ideograph Extension A */ + ["\u3DA3", "\u3DA3"], /* CJK Ideograph Extension A */ + ["\u3DA4", "\u3DA4"], /* CJK Ideograph Extension A */ + ["\u3DA5", "\u3DA5"], /* CJK Ideograph Extension A */ + ["\u3DA6", "\u3DA6"], /* CJK Ideograph Extension A */ + ["\u3DA7", "\u3DA7"], /* CJK Ideograph Extension A */ + ["\u3DA8", "\u3DA8"], /* CJK Ideograph Extension A */ + ["\u3DA9", "\u3DA9"], /* CJK Ideograph Extension A */ + ["\u3DAA", "\u3DAA"], /* CJK Ideograph Extension A */ + ["\u3DAB", "\u3DAB"], /* CJK Ideograph Extension A */ + ["\u3DAC", "\u3DAC"], /* CJK Ideograph Extension A */ + ["\u3DAD", "\u3DAD"], /* CJK Ideograph Extension A */ + ["\u3DAE", "\u3DAE"], /* CJK Ideograph Extension A */ + ["\u3DAF", "\u3DAF"], /* CJK Ideograph Extension A */ + ["\u3DB0", "\u3DB0"], /* CJK Ideograph Extension A */ + ["\u3DB1", "\u3DB1"], /* CJK Ideograph Extension A */ + ["\u3DB2", "\u3DB2"], /* CJK Ideograph Extension A */ + ["\u3DB3", "\u3DB3"], /* CJK Ideograph Extension A */ + ["\u3DB4", "\u3DB4"], /* CJK Ideograph Extension A */ + ["\u3DB5", "\u3DB5"], /* CJK Ideograph Extension A */ + ["\u3DB6", "\u3DB6"], /* CJK Ideograph Extension A */ + ["\u3DB7", "\u3DB7"], /* CJK Ideograph Extension A */ + ["\u3DB8", "\u3DB8"], /* CJK Ideograph Extension A */ + ["\u3DB9", "\u3DB9"], /* CJK Ideograph Extension A */ + ["\u3DBA", "\u3DBA"], /* CJK Ideograph Extension A */ + ["\u3DBB", "\u3DBB"], /* CJK Ideograph Extension A */ + ["\u3DBC", "\u3DBC"], /* CJK Ideograph Extension A */ + ["\u3DBD", "\u3DBD"], /* CJK Ideograph Extension A */ + ["\u3DBE", "\u3DBE"], /* CJK Ideograph Extension A */ + ["\u3DBF", "\u3DBF"], /* CJK Ideograph Extension A */ + ["\u3DC0", "\u3DC0"], /* CJK Ideograph Extension A */ + ["\u3DC1", "\u3DC1"], /* CJK Ideograph Extension A */ + ["\u3DC2", "\u3DC2"], /* CJK Ideograph Extension A */ + ["\u3DC3", "\u3DC3"], /* CJK Ideograph Extension A */ + ["\u3DC4", "\u3DC4"], /* CJK Ideograph Extension A */ + ["\u3DC5", "\u3DC5"], /* CJK Ideograph Extension A */ + ["\u3DC6", "\u3DC6"], /* CJK Ideograph Extension A */ + ["\u3DC7", "\u3DC7"], /* CJK Ideograph Extension A */ + ["\u3DC8", "\u3DC8"], /* CJK Ideograph Extension A */ + ["\u3DC9", "\u3DC9"], /* CJK Ideograph Extension A */ + ["\u3DCA", "\u3DCA"], /* CJK Ideograph Extension A */ + ["\u3DCB", "\u3DCB"], /* CJK Ideograph Extension A */ + ["\u3DCC", "\u3DCC"], /* CJK Ideograph Extension A */ + ["\u3DCD", "\u3DCD"], /* CJK Ideograph Extension A */ + ["\u3DCE", "\u3DCE"], /* CJK Ideograph Extension A */ + ["\u3DCF", "\u3DCF"], /* CJK Ideograph Extension A */ + ["\u3DD0", "\u3DD0"], /* CJK Ideograph Extension A */ + ["\u3DD1", "\u3DD1"], /* CJK Ideograph Extension A */ + ["\u3DD2", "\u3DD2"], /* CJK Ideograph Extension A */ + ["\u3DD3", "\u3DD3"], /* CJK Ideograph Extension A */ + ["\u3DD4", "\u3DD4"], /* CJK Ideograph Extension A */ + ["\u3DD5", "\u3DD5"], /* CJK Ideograph Extension A */ + ["\u3DD6", "\u3DD6"], /* CJK Ideograph Extension A */ + ["\u3DD7", "\u3DD7"], /* CJK Ideograph Extension A */ + ["\u3DD8", "\u3DD8"], /* CJK Ideograph Extension A */ + ["\u3DD9", "\u3DD9"], /* CJK Ideograph Extension A */ + ["\u3DDA", "\u3DDA"], /* CJK Ideograph Extension A */ + ["\u3DDB", "\u3DDB"], /* CJK Ideograph Extension A */ + ["\u3DDC", "\u3DDC"], /* CJK Ideograph Extension A */ + ["\u3DDD", "\u3DDD"], /* CJK Ideograph Extension A */ + ["\u3DDE", "\u3DDE"], /* CJK Ideograph Extension A */ + ["\u3DDF", "\u3DDF"], /* CJK Ideograph Extension A */ + ["\u3DE0", "\u3DE0"], /* CJK Ideograph Extension A */ + ["\u3DE1", "\u3DE1"], /* CJK Ideograph Extension A */ + ["\u3DE2", "\u3DE2"], /* CJK Ideograph Extension A */ + ["\u3DE3", "\u3DE3"], /* CJK Ideograph Extension A */ + ["\u3DE4", "\u3DE4"], /* CJK Ideograph Extension A */ + ["\u3DE5", "\u3DE5"], /* CJK Ideograph Extension A */ + ["\u3DE6", "\u3DE6"], /* CJK Ideograph Extension A */ + ["\u3DE7", "\u3DE7"], /* CJK Ideograph Extension A */ + ["\u3DE8", "\u3DE8"], /* CJK Ideograph Extension A */ + ["\u3DE9", "\u3DE9"], /* CJK Ideograph Extension A */ + ["\u3DEA", "\u3DEA"], /* CJK Ideograph Extension A */ + ["\u3DEB", "\u3DEB"], /* CJK Ideograph Extension A */ + ["\u3DEC", "\u3DEC"], /* CJK Ideograph Extension A */ + ["\u3DED", "\u3DED"], /* CJK Ideograph Extension A */ + ["\u3DEE", "\u3DEE"], /* CJK Ideograph Extension A */ + ["\u3DEF", "\u3DEF"], /* CJK Ideograph Extension A */ + ["\u3DF0", "\u3DF0"], /* CJK Ideograph Extension A */ + ["\u3DF1", "\u3DF1"], /* CJK Ideograph Extension A */ + ["\u3DF2", "\u3DF2"], /* CJK Ideograph Extension A */ + ["\u3DF3", "\u3DF3"], /* CJK Ideograph Extension A */ + ["\u3DF4", "\u3DF4"], /* CJK Ideograph Extension A */ + ["\u3DF5", "\u3DF5"], /* CJK Ideograph Extension A */ + ["\u3DF6", "\u3DF6"], /* CJK Ideograph Extension A */ + ["\u3DF7", "\u3DF7"], /* CJK Ideograph Extension A */ + ["\u3DF8", "\u3DF8"], /* CJK Ideograph Extension A */ + ["\u3DF9", "\u3DF9"], /* CJK Ideograph Extension A */ + ["\u3DFA", "\u3DFA"], /* CJK Ideograph Extension A */ + ["\u3DFB", "\u3DFB"], /* CJK Ideograph Extension A */ + ["\u3DFC", "\u3DFC"], /* CJK Ideograph Extension A */ + ["\u3DFD", "\u3DFD"], /* CJK Ideograph Extension A */ + ["\u3DFE", "\u3DFE"], /* CJK Ideograph Extension A */ + ["\u3DFF", "\u3DFF"], /* CJK Ideograph Extension A */ + ["\u3E00", "\u3E00"], /* CJK Ideograph Extension A */ + ["\u3E01", "\u3E01"], /* CJK Ideograph Extension A */ + ["\u3E02", "\u3E02"], /* CJK Ideograph Extension A */ + ["\u3E03", "\u3E03"], /* CJK Ideograph Extension A */ + ["\u3E04", "\u3E04"], /* CJK Ideograph Extension A */ + ["\u3E05", "\u3E05"], /* CJK Ideograph Extension A */ + ["\u3E06", "\u3E06"], /* CJK Ideograph Extension A */ + ["\u3E07", "\u3E07"], /* CJK Ideograph Extension A */ + ["\u3E08", "\u3E08"], /* CJK Ideograph Extension A */ + ["\u3E09", "\u3E09"], /* CJK Ideograph Extension A */ + ["\u3E0A", "\u3E0A"], /* CJK Ideograph Extension A */ + ["\u3E0B", "\u3E0B"], /* CJK Ideograph Extension A */ + ["\u3E0C", "\u3E0C"], /* CJK Ideograph Extension A */ + ["\u3E0D", "\u3E0D"], /* CJK Ideograph Extension A */ + ["\u3E0E", "\u3E0E"], /* CJK Ideograph Extension A */ + ["\u3E0F", "\u3E0F"], /* CJK Ideograph Extension A */ + ["\u3E10", "\u3E10"], /* CJK Ideograph Extension A */ + ["\u3E11", "\u3E11"], /* CJK Ideograph Extension A */ + ["\u3E12", "\u3E12"], /* CJK Ideograph Extension A */ + ["\u3E13", "\u3E13"], /* CJK Ideograph Extension A */ + ["\u3E14", "\u3E14"], /* CJK Ideograph Extension A */ + ["\u3E15", "\u3E15"], /* CJK Ideograph Extension A */ + ["\u3E16", "\u3E16"], /* CJK Ideograph Extension A */ + ["\u3E17", "\u3E17"], /* CJK Ideograph Extension A */ + ["\u3E18", "\u3E18"], /* CJK Ideograph Extension A */ + ["\u3E19", "\u3E19"], /* CJK Ideograph Extension A */ + ["\u3E1A", "\u3E1A"], /* CJK Ideograph Extension A */ + ["\u3E1B", "\u3E1B"], /* CJK Ideograph Extension A */ + ["\u3E1C", "\u3E1C"], /* CJK Ideograph Extension A */ + ["\u3E1D", "\u3E1D"], /* CJK Ideograph Extension A */ + ["\u3E1E", "\u3E1E"], /* CJK Ideograph Extension A */ + ["\u3E1F", "\u3E1F"], /* CJK Ideograph Extension A */ + ["\u3E20", "\u3E20"], /* CJK Ideograph Extension A */ + ["\u3E21", "\u3E21"], /* CJK Ideograph Extension A */ + ["\u3E22", "\u3E22"], /* CJK Ideograph Extension A */ + ["\u3E23", "\u3E23"], /* CJK Ideograph Extension A */ + ["\u3E24", "\u3E24"], /* CJK Ideograph Extension A */ + ["\u3E25", "\u3E25"], /* CJK Ideograph Extension A */ + ["\u3E26", "\u3E26"], /* CJK Ideograph Extension A */ + ["\u3E27", "\u3E27"], /* CJK Ideograph Extension A */ + ["\u3E28", "\u3E28"], /* CJK Ideograph Extension A */ + ["\u3E29", "\u3E29"], /* CJK Ideograph Extension A */ + ["\u3E2A", "\u3E2A"], /* CJK Ideograph Extension A */ + ["\u3E2B", "\u3E2B"], /* CJK Ideograph Extension A */ + ["\u3E2C", "\u3E2C"], /* CJK Ideograph Extension A */ + ["\u3E2D", "\u3E2D"], /* CJK Ideograph Extension A */ + ["\u3E2E", "\u3E2E"], /* CJK Ideograph Extension A */ + ["\u3E2F", "\u3E2F"], /* CJK Ideograph Extension A */ + ["\u3E30", "\u3E30"], /* CJK Ideograph Extension A */ + ["\u3E31", "\u3E31"], /* CJK Ideograph Extension A */ + ["\u3E32", "\u3E32"], /* CJK Ideograph Extension A */ + ["\u3E33", "\u3E33"], /* CJK Ideograph Extension A */ + ["\u3E34", "\u3E34"], /* CJK Ideograph Extension A */ + ["\u3E35", "\u3E35"], /* CJK Ideograph Extension A */ + ["\u3E36", "\u3E36"], /* CJK Ideograph Extension A */ + ["\u3E37", "\u3E37"], /* CJK Ideograph Extension A */ + ["\u3E38", "\u3E38"], /* CJK Ideograph Extension A */ + ["\u3E39", "\u3E39"], /* CJK Ideograph Extension A */ + ["\u3E3A", "\u3E3A"], /* CJK Ideograph Extension A */ + ["\u3E3B", "\u3E3B"], /* CJK Ideograph Extension A */ + ["\u3E3C", "\u3E3C"], /* CJK Ideograph Extension A */ + ["\u3E3D", "\u3E3D"], /* CJK Ideograph Extension A */ + ["\u3E3E", "\u3E3E"], /* CJK Ideograph Extension A */ + ["\u3E3F", "\u3E3F"], /* CJK Ideograph Extension A */ + ["\u3E40", "\u3E40"], /* CJK Ideograph Extension A */ + ["\u3E41", "\u3E41"], /* CJK Ideograph Extension A */ + ["\u3E42", "\u3E42"], /* CJK Ideograph Extension A */ + ["\u3E43", "\u3E43"], /* CJK Ideograph Extension A */ + ["\u3E44", "\u3E44"], /* CJK Ideograph Extension A */ + ["\u3E45", "\u3E45"], /* CJK Ideograph Extension A */ + ["\u3E46", "\u3E46"], /* CJK Ideograph Extension A */ + ["\u3E47", "\u3E47"], /* CJK Ideograph Extension A */ + ["\u3E48", "\u3E48"], /* CJK Ideograph Extension A */ + ["\u3E49", "\u3E49"], /* CJK Ideograph Extension A */ + ["\u3E4A", "\u3E4A"], /* CJK Ideograph Extension A */ + ["\u3E4B", "\u3E4B"], /* CJK Ideograph Extension A */ + ["\u3E4C", "\u3E4C"], /* CJK Ideograph Extension A */ + ["\u3E4D", "\u3E4D"], /* CJK Ideograph Extension A */ + ["\u3E4E", "\u3E4E"], /* CJK Ideograph Extension A */ + ["\u3E4F", "\u3E4F"], /* CJK Ideograph Extension A */ + ["\u3E50", "\u3E50"], /* CJK Ideograph Extension A */ + ["\u3E51", "\u3E51"], /* CJK Ideograph Extension A */ + ["\u3E52", "\u3E52"], /* CJK Ideograph Extension A */ + ["\u3E53", "\u3E53"], /* CJK Ideograph Extension A */ + ["\u3E54", "\u3E54"], /* CJK Ideograph Extension A */ + ["\u3E55", "\u3E55"], /* CJK Ideograph Extension A */ + ["\u3E56", "\u3E56"], /* CJK Ideograph Extension A */ + ["\u3E57", "\u3E57"], /* CJK Ideograph Extension A */ + ["\u3E58", "\u3E58"], /* CJK Ideograph Extension A */ + ["\u3E59", "\u3E59"], /* CJK Ideograph Extension A */ + ["\u3E5A", "\u3E5A"], /* CJK Ideograph Extension A */ + ["\u3E5B", "\u3E5B"], /* CJK Ideograph Extension A */ + ["\u3E5C", "\u3E5C"], /* CJK Ideograph Extension A */ + ["\u3E5D", "\u3E5D"], /* CJK Ideograph Extension A */ + ["\u3E5E", "\u3E5E"], /* CJK Ideograph Extension A */ + ["\u3E5F", "\u3E5F"], /* CJK Ideograph Extension A */ + ["\u3E60", "\u3E60"], /* CJK Ideograph Extension A */ + ["\u3E61", "\u3E61"], /* CJK Ideograph Extension A */ + ["\u3E62", "\u3E62"], /* CJK Ideograph Extension A */ + ["\u3E63", "\u3E63"], /* CJK Ideograph Extension A */ + ["\u3E64", "\u3E64"], /* CJK Ideograph Extension A */ + ["\u3E65", "\u3E65"], /* CJK Ideograph Extension A */ + ["\u3E66", "\u3E66"], /* CJK Ideograph Extension A */ + ["\u3E67", "\u3E67"], /* CJK Ideograph Extension A */ + ["\u3E68", "\u3E68"], /* CJK Ideograph Extension A */ + ["\u3E69", "\u3E69"], /* CJK Ideograph Extension A */ + ["\u3E6A", "\u3E6A"], /* CJK Ideograph Extension A */ + ["\u3E6B", "\u3E6B"], /* CJK Ideograph Extension A */ + ["\u3E6C", "\u3E6C"], /* CJK Ideograph Extension A */ + ["\u3E6D", "\u3E6D"], /* CJK Ideograph Extension A */ + ["\u3E6E", "\u3E6E"], /* CJK Ideograph Extension A */ + ["\u3E6F", "\u3E6F"], /* CJK Ideograph Extension A */ + ["\u3E70", "\u3E70"], /* CJK Ideograph Extension A */ + ["\u3E71", "\u3E71"], /* CJK Ideograph Extension A */ + ["\u3E72", "\u3E72"], /* CJK Ideograph Extension A */ + ["\u3E73", "\u3E73"], /* CJK Ideograph Extension A */ + ["\u3E74", "\u3E74"], /* CJK Ideograph Extension A */ + ["\u3E75", "\u3E75"], /* CJK Ideograph Extension A */ + ["\u3E76", "\u3E76"], /* CJK Ideograph Extension A */ + ["\u3E77", "\u3E77"], /* CJK Ideograph Extension A */ + ["\u3E78", "\u3E78"], /* CJK Ideograph Extension A */ + ["\u3E79", "\u3E79"], /* CJK Ideograph Extension A */ + ["\u3E7A", "\u3E7A"], /* CJK Ideograph Extension A */ + ["\u3E7B", "\u3E7B"], /* CJK Ideograph Extension A */ + ["\u3E7C", "\u3E7C"], /* CJK Ideograph Extension A */ + ["\u3E7D", "\u3E7D"], /* CJK Ideograph Extension A */ + ["\u3E7E", "\u3E7E"], /* CJK Ideograph Extension A */ + ["\u3E7F", "\u3E7F"], /* CJK Ideograph Extension A */ + ["\u3E80", "\u3E80"], /* CJK Ideograph Extension A */ + ["\u3E81", "\u3E81"], /* CJK Ideograph Extension A */ + ["\u3E82", "\u3E82"], /* CJK Ideograph Extension A */ + ["\u3E83", "\u3E83"], /* CJK Ideograph Extension A */ + ["\u3E84", "\u3E84"], /* CJK Ideograph Extension A */ + ["\u3E85", "\u3E85"], /* CJK Ideograph Extension A */ + ["\u3E86", "\u3E86"], /* CJK Ideograph Extension A */ + ["\u3E87", "\u3E87"], /* CJK Ideograph Extension A */ + ["\u3E88", "\u3E88"], /* CJK Ideograph Extension A */ + ["\u3E89", "\u3E89"], /* CJK Ideograph Extension A */ + ["\u3E8A", "\u3E8A"], /* CJK Ideograph Extension A */ + ["\u3E8B", "\u3E8B"], /* CJK Ideograph Extension A */ + ["\u3E8C", "\u3E8C"], /* CJK Ideograph Extension A */ + ["\u3E8D", "\u3E8D"], /* CJK Ideograph Extension A */ + ["\u3E8E", "\u3E8E"], /* CJK Ideograph Extension A */ + ["\u3E8F", "\u3E8F"], /* CJK Ideograph Extension A */ + ["\u3E90", "\u3E90"], /* CJK Ideograph Extension A */ + ["\u3E91", "\u3E91"], /* CJK Ideograph Extension A */ + ["\u3E92", "\u3E92"], /* CJK Ideograph Extension A */ + ["\u3E93", "\u3E93"], /* CJK Ideograph Extension A */ + ["\u3E94", "\u3E94"], /* CJK Ideograph Extension A */ + ["\u3E95", "\u3E95"], /* CJK Ideograph Extension A */ + ["\u3E96", "\u3E96"], /* CJK Ideograph Extension A */ + ["\u3E97", "\u3E97"], /* CJK Ideograph Extension A */ + ["\u3E98", "\u3E98"], /* CJK Ideograph Extension A */ + ["\u3E99", "\u3E99"], /* CJK Ideograph Extension A */ + ["\u3E9A", "\u3E9A"], /* CJK Ideograph Extension A */ + ["\u3E9B", "\u3E9B"], /* CJK Ideograph Extension A */ + ["\u3E9C", "\u3E9C"], /* CJK Ideograph Extension A */ + ["\u3E9D", "\u3E9D"], /* CJK Ideograph Extension A */ + ["\u3E9E", "\u3E9E"], /* CJK Ideograph Extension A */ + ["\u3E9F", "\u3E9F"], /* CJK Ideograph Extension A */ + ["\u3EA0", "\u3EA0"], /* CJK Ideograph Extension A */ + ["\u3EA1", "\u3EA1"], /* CJK Ideograph Extension A */ + ["\u3EA2", "\u3EA2"], /* CJK Ideograph Extension A */ + ["\u3EA3", "\u3EA3"], /* CJK Ideograph Extension A */ + ["\u3EA4", "\u3EA4"], /* CJK Ideograph Extension A */ + ["\u3EA5", "\u3EA5"], /* CJK Ideograph Extension A */ + ["\u3EA6", "\u3EA6"], /* CJK Ideograph Extension A */ + ["\u3EA7", "\u3EA7"], /* CJK Ideograph Extension A */ + ["\u3EA8", "\u3EA8"], /* CJK Ideograph Extension A */ + ["\u3EA9", "\u3EA9"], /* CJK Ideograph Extension A */ + ["\u3EAA", "\u3EAA"], /* CJK Ideograph Extension A */ + ["\u3EAB", "\u3EAB"], /* CJK Ideograph Extension A */ + ["\u3EAC", "\u3EAC"], /* CJK Ideograph Extension A */ + ["\u3EAD", "\u3EAD"], /* CJK Ideograph Extension A */ + ["\u3EAE", "\u3EAE"], /* CJK Ideograph Extension A */ + ["\u3EAF", "\u3EAF"], /* CJK Ideograph Extension A */ + ["\u3EB0", "\u3EB0"], /* CJK Ideograph Extension A */ + ["\u3EB1", "\u3EB1"], /* CJK Ideograph Extension A */ + ["\u3EB2", "\u3EB2"], /* CJK Ideograph Extension A */ + ["\u3EB3", "\u3EB3"], /* CJK Ideograph Extension A */ + ["\u3EB4", "\u3EB4"], /* CJK Ideograph Extension A */ + ["\u3EB5", "\u3EB5"], /* CJK Ideograph Extension A */ + ["\u3EB6", "\u3EB6"], /* CJK Ideograph Extension A */ + ["\u3EB7", "\u3EB7"], /* CJK Ideograph Extension A */ + ["\u3EB8", "\u3EB8"], /* CJK Ideograph Extension A */ + ["\u3EB9", "\u3EB9"], /* CJK Ideograph Extension A */ + ["\u3EBA", "\u3EBA"], /* CJK Ideograph Extension A */ + ["\u3EBB", "\u3EBB"], /* CJK Ideograph Extension A */ + ["\u3EBC", "\u3EBC"], /* CJK Ideograph Extension A */ + ["\u3EBD", "\u3EBD"], /* CJK Ideograph Extension A */ + ["\u3EBE", "\u3EBE"], /* CJK Ideograph Extension A */ + ["\u3EBF", "\u3EBF"], /* CJK Ideograph Extension A */ + ["\u3EC0", "\u3EC0"], /* CJK Ideograph Extension A */ + ["\u3EC1", "\u3EC1"], /* CJK Ideograph Extension A */ + ["\u3EC2", "\u3EC2"], /* CJK Ideograph Extension A */ + ["\u3EC3", "\u3EC3"], /* CJK Ideograph Extension A */ + ["\u3EC4", "\u3EC4"], /* CJK Ideograph Extension A */ + ["\u3EC5", "\u3EC5"], /* CJK Ideograph Extension A */ + ["\u3EC6", "\u3EC6"], /* CJK Ideograph Extension A */ + ["\u3EC7", "\u3EC7"], /* CJK Ideograph Extension A */ + ["\u3EC8", "\u3EC8"], /* CJK Ideograph Extension A */ + ["\u3EC9", "\u3EC9"], /* CJK Ideograph Extension A */ + ["\u3ECA", "\u3ECA"], /* CJK Ideograph Extension A */ + ["\u3ECB", "\u3ECB"], /* CJK Ideograph Extension A */ + ["\u3ECC", "\u3ECC"], /* CJK Ideograph Extension A */ + ["\u3ECD", "\u3ECD"], /* CJK Ideograph Extension A */ + ["\u3ECE", "\u3ECE"], /* CJK Ideograph Extension A */ + ["\u3ECF", "\u3ECF"], /* CJK Ideograph Extension A */ + ["\u3ED0", "\u3ED0"], /* CJK Ideograph Extension A */ + ["\u3ED1", "\u3ED1"], /* CJK Ideograph Extension A */ + ["\u3ED2", "\u3ED2"], /* CJK Ideograph Extension A */ + ["\u3ED3", "\u3ED3"], /* CJK Ideograph Extension A */ + ["\u3ED4", "\u3ED4"], /* CJK Ideograph Extension A */ + ["\u3ED5", "\u3ED5"], /* CJK Ideograph Extension A */ + ["\u3ED6", "\u3ED6"], /* CJK Ideograph Extension A */ + ["\u3ED7", "\u3ED7"], /* CJK Ideograph Extension A */ + ["\u3ED8", "\u3ED8"], /* CJK Ideograph Extension A */ + ["\u3ED9", "\u3ED9"], /* CJK Ideograph Extension A */ + ["\u3EDA", "\u3EDA"], /* CJK Ideograph Extension A */ + ["\u3EDB", "\u3EDB"], /* CJK Ideograph Extension A */ + ["\u3EDC", "\u3EDC"], /* CJK Ideograph Extension A */ + ["\u3EDD", "\u3EDD"], /* CJK Ideograph Extension A */ + ["\u3EDE", "\u3EDE"], /* CJK Ideograph Extension A */ + ["\u3EDF", "\u3EDF"], /* CJK Ideograph Extension A */ + ["\u3EE0", "\u3EE0"], /* CJK Ideograph Extension A */ + ["\u3EE1", "\u3EE1"], /* CJK Ideograph Extension A */ + ["\u3EE2", "\u3EE2"], /* CJK Ideograph Extension A */ + ["\u3EE3", "\u3EE3"], /* CJK Ideograph Extension A */ + ["\u3EE4", "\u3EE4"], /* CJK Ideograph Extension A */ + ["\u3EE5", "\u3EE5"], /* CJK Ideograph Extension A */ + ["\u3EE6", "\u3EE6"], /* CJK Ideograph Extension A */ + ["\u3EE7", "\u3EE7"], /* CJK Ideograph Extension A */ + ["\u3EE8", "\u3EE8"], /* CJK Ideograph Extension A */ + ["\u3EE9", "\u3EE9"], /* CJK Ideograph Extension A */ + ["\u3EEA", "\u3EEA"], /* CJK Ideograph Extension A */ + ["\u3EEB", "\u3EEB"], /* CJK Ideograph Extension A */ + ["\u3EEC", "\u3EEC"], /* CJK Ideograph Extension A */ + ["\u3EED", "\u3EED"], /* CJK Ideograph Extension A */ + ["\u3EEE", "\u3EEE"], /* CJK Ideograph Extension A */ + ["\u3EEF", "\u3EEF"], /* CJK Ideograph Extension A */ + ["\u3EF0", "\u3EF0"], /* CJK Ideograph Extension A */ + ["\u3EF1", "\u3EF1"], /* CJK Ideograph Extension A */ + ["\u3EF2", "\u3EF2"], /* CJK Ideograph Extension A */ + ["\u3EF3", "\u3EF3"], /* CJK Ideograph Extension A */ + ["\u3EF4", "\u3EF4"], /* CJK Ideograph Extension A */ + ["\u3EF5", "\u3EF5"], /* CJK Ideograph Extension A */ + ["\u3EF6", "\u3EF6"], /* CJK Ideograph Extension A */ + ["\u3EF7", "\u3EF7"], /* CJK Ideograph Extension A */ + ["\u3EF8", "\u3EF8"], /* CJK Ideograph Extension A */ + ["\u3EF9", "\u3EF9"], /* CJK Ideograph Extension A */ + ["\u3EFA", "\u3EFA"], /* CJK Ideograph Extension A */ + ["\u3EFB", "\u3EFB"], /* CJK Ideograph Extension A */ + ["\u3EFC", "\u3EFC"], /* CJK Ideograph Extension A */ + ["\u3EFD", "\u3EFD"], /* CJK Ideograph Extension A */ + ["\u3EFE", "\u3EFE"], /* CJK Ideograph Extension A */ + ["\u3EFF", "\u3EFF"], /* CJK Ideograph Extension A */ + ["\u3F00", "\u3F00"], /* CJK Ideograph Extension A */ + ["\u3F01", "\u3F01"], /* CJK Ideograph Extension A */ + ["\u3F02", "\u3F02"], /* CJK Ideograph Extension A */ + ["\u3F03", "\u3F03"], /* CJK Ideograph Extension A */ + ["\u3F04", "\u3F04"], /* CJK Ideograph Extension A */ + ["\u3F05", "\u3F05"], /* CJK Ideograph Extension A */ + ["\u3F06", "\u3F06"], /* CJK Ideograph Extension A */ + ["\u3F07", "\u3F07"], /* CJK Ideograph Extension A */ + ["\u3F08", "\u3F08"], /* CJK Ideograph Extension A */ + ["\u3F09", "\u3F09"], /* CJK Ideograph Extension A */ + ["\u3F0A", "\u3F0A"], /* CJK Ideograph Extension A */ + ["\u3F0B", "\u3F0B"], /* CJK Ideograph Extension A */ + ["\u3F0C", "\u3F0C"], /* CJK Ideograph Extension A */ + ["\u3F0D", "\u3F0D"], /* CJK Ideograph Extension A */ + ["\u3F0E", "\u3F0E"], /* CJK Ideograph Extension A */ + ["\u3F0F", "\u3F0F"], /* CJK Ideograph Extension A */ + ["\u3F10", "\u3F10"], /* CJK Ideograph Extension A */ + ["\u3F11", "\u3F11"], /* CJK Ideograph Extension A */ + ["\u3F12", "\u3F12"], /* CJK Ideograph Extension A */ + ["\u3F13", "\u3F13"], /* CJK Ideograph Extension A */ + ["\u3F14", "\u3F14"], /* CJK Ideograph Extension A */ + ["\u3F15", "\u3F15"], /* CJK Ideograph Extension A */ + ["\u3F16", "\u3F16"], /* CJK Ideograph Extension A */ + ["\u3F17", "\u3F17"], /* CJK Ideograph Extension A */ + ["\u3F18", "\u3F18"], /* CJK Ideograph Extension A */ + ["\u3F19", "\u3F19"], /* CJK Ideograph Extension A */ + ["\u3F1A", "\u3F1A"], /* CJK Ideograph Extension A */ + ["\u3F1B", "\u3F1B"], /* CJK Ideograph Extension A */ + ["\u3F1C", "\u3F1C"], /* CJK Ideograph Extension A */ + ["\u3F1D", "\u3F1D"], /* CJK Ideograph Extension A */ + ["\u3F1E", "\u3F1E"], /* CJK Ideograph Extension A */ + ["\u3F1F", "\u3F1F"], /* CJK Ideograph Extension A */ + ["\u3F20", "\u3F20"], /* CJK Ideograph Extension A */ + ["\u3F21", "\u3F21"], /* CJK Ideograph Extension A */ + ["\u3F22", "\u3F22"], /* CJK Ideograph Extension A */ + ["\u3F23", "\u3F23"], /* CJK Ideograph Extension A */ + ["\u3F24", "\u3F24"], /* CJK Ideograph Extension A */ + ["\u3F25", "\u3F25"], /* CJK Ideograph Extension A */ + ["\u3F26", "\u3F26"], /* CJK Ideograph Extension A */ + ["\u3F27", "\u3F27"], /* CJK Ideograph Extension A */ + ["\u3F28", "\u3F28"], /* CJK Ideograph Extension A */ + ["\u3F29", "\u3F29"], /* CJK Ideograph Extension A */ + ["\u3F2A", "\u3F2A"], /* CJK Ideograph Extension A */ + ["\u3F2B", "\u3F2B"], /* CJK Ideograph Extension A */ + ["\u3F2C", "\u3F2C"], /* CJK Ideograph Extension A */ + ["\u3F2D", "\u3F2D"], /* CJK Ideograph Extension A */ + ["\u3F2E", "\u3F2E"], /* CJK Ideograph Extension A */ + ["\u3F2F", "\u3F2F"], /* CJK Ideograph Extension A */ + ["\u3F30", "\u3F30"], /* CJK Ideograph Extension A */ + ["\u3F31", "\u3F31"], /* CJK Ideograph Extension A */ + ["\u3F32", "\u3F32"], /* CJK Ideograph Extension A */ + ["\u3F33", "\u3F33"], /* CJK Ideograph Extension A */ + ["\u3F34", "\u3F34"], /* CJK Ideograph Extension A */ + ["\u3F35", "\u3F35"], /* CJK Ideograph Extension A */ + ["\u3F36", "\u3F36"], /* CJK Ideograph Extension A */ + ["\u3F37", "\u3F37"], /* CJK Ideograph Extension A */ + ["\u3F38", "\u3F38"], /* CJK Ideograph Extension A */ + ["\u3F39", "\u3F39"], /* CJK Ideograph Extension A */ + ["\u3F3A", "\u3F3A"], /* CJK Ideograph Extension A */ + ["\u3F3B", "\u3F3B"], /* CJK Ideograph Extension A */ + ["\u3F3C", "\u3F3C"], /* CJK Ideograph Extension A */ + ["\u3F3D", "\u3F3D"], /* CJK Ideograph Extension A */ + ["\u3F3E", "\u3F3E"], /* CJK Ideograph Extension A */ + ["\u3F3F", "\u3F3F"], /* CJK Ideograph Extension A */ + ["\u3F40", "\u3F40"], /* CJK Ideograph Extension A */ + ["\u3F41", "\u3F41"], /* CJK Ideograph Extension A */ + ["\u3F42", "\u3F42"], /* CJK Ideograph Extension A */ + ["\u3F43", "\u3F43"], /* CJK Ideograph Extension A */ + ["\u3F44", "\u3F44"], /* CJK Ideograph Extension A */ + ["\u3F45", "\u3F45"], /* CJK Ideograph Extension A */ + ["\u3F46", "\u3F46"], /* CJK Ideograph Extension A */ + ["\u3F47", "\u3F47"], /* CJK Ideograph Extension A */ + ["\u3F48", "\u3F48"], /* CJK Ideograph Extension A */ + ["\u3F49", "\u3F49"], /* CJK Ideograph Extension A */ + ["\u3F4A", "\u3F4A"], /* CJK Ideograph Extension A */ + ["\u3F4B", "\u3F4B"], /* CJK Ideograph Extension A */ + ["\u3F4C", "\u3F4C"], /* CJK Ideograph Extension A */ + ["\u3F4D", "\u3F4D"], /* CJK Ideograph Extension A */ + ["\u3F4E", "\u3F4E"], /* CJK Ideograph Extension A */ + ["\u3F4F", "\u3F4F"], /* CJK Ideograph Extension A */ + ["\u3F50", "\u3F50"], /* CJK Ideograph Extension A */ + ["\u3F51", "\u3F51"], /* CJK Ideograph Extension A */ + ["\u3F52", "\u3F52"], /* CJK Ideograph Extension A */ + ["\u3F53", "\u3F53"], /* CJK Ideograph Extension A */ + ["\u3F54", "\u3F54"], /* CJK Ideograph Extension A */ + ["\u3F55", "\u3F55"], /* CJK Ideograph Extension A */ + ["\u3F56", "\u3F56"], /* CJK Ideograph Extension A */ + ["\u3F57", "\u3F57"], /* CJK Ideograph Extension A */ + ["\u3F58", "\u3F58"], /* CJK Ideograph Extension A */ + ["\u3F59", "\u3F59"], /* CJK Ideograph Extension A */ + ["\u3F5A", "\u3F5A"], /* CJK Ideograph Extension A */ + ["\u3F5B", "\u3F5B"], /* CJK Ideograph Extension A */ + ["\u3F5C", "\u3F5C"], /* CJK Ideograph Extension A */ + ["\u3F5D", "\u3F5D"], /* CJK Ideograph Extension A */ + ["\u3F5E", "\u3F5E"], /* CJK Ideograph Extension A */ + ["\u3F5F", "\u3F5F"], /* CJK Ideograph Extension A */ + ["\u3F60", "\u3F60"], /* CJK Ideograph Extension A */ + ["\u3F61", "\u3F61"], /* CJK Ideograph Extension A */ + ["\u3F62", "\u3F62"], /* CJK Ideograph Extension A */ + ["\u3F63", "\u3F63"], /* CJK Ideograph Extension A */ + ["\u3F64", "\u3F64"], /* CJK Ideograph Extension A */ + ["\u3F65", "\u3F65"], /* CJK Ideograph Extension A */ + ["\u3F66", "\u3F66"], /* CJK Ideograph Extension A */ + ["\u3F67", "\u3F67"], /* CJK Ideograph Extension A */ + ["\u3F68", "\u3F68"], /* CJK Ideograph Extension A */ + ["\u3F69", "\u3F69"], /* CJK Ideograph Extension A */ + ["\u3F6A", "\u3F6A"], /* CJK Ideograph Extension A */ + ["\u3F6B", "\u3F6B"], /* CJK Ideograph Extension A */ + ["\u3F6C", "\u3F6C"], /* CJK Ideograph Extension A */ + ["\u3F6D", "\u3F6D"], /* CJK Ideograph Extension A */ + ["\u3F6E", "\u3F6E"], /* CJK Ideograph Extension A */ + ["\u3F6F", "\u3F6F"], /* CJK Ideograph Extension A */ + ["\u3F70", "\u3F70"], /* CJK Ideograph Extension A */ + ["\u3F71", "\u3F71"], /* CJK Ideograph Extension A */ + ["\u3F72", "\u3F72"], /* CJK Ideograph Extension A */ + ["\u3F73", "\u3F73"], /* CJK Ideograph Extension A */ + ["\u3F74", "\u3F74"], /* CJK Ideograph Extension A */ + ["\u3F75", "\u3F75"], /* CJK Ideograph Extension A */ + ["\u3F76", "\u3F76"], /* CJK Ideograph Extension A */ + ["\u3F77", "\u3F77"], /* CJK Ideograph Extension A */ + ["\u3F78", "\u3F78"], /* CJK Ideograph Extension A */ + ["\u3F79", "\u3F79"], /* CJK Ideograph Extension A */ + ["\u3F7A", "\u3F7A"], /* CJK Ideograph Extension A */ + ["\u3F7B", "\u3F7B"], /* CJK Ideograph Extension A */ + ["\u3F7C", "\u3F7C"], /* CJK Ideograph Extension A */ + ["\u3F7D", "\u3F7D"], /* CJK Ideograph Extension A */ + ["\u3F7E", "\u3F7E"], /* CJK Ideograph Extension A */ + ["\u3F7F", "\u3F7F"], /* CJK Ideograph Extension A */ + ["\u3F80", "\u3F80"], /* CJK Ideograph Extension A */ + ["\u3F81", "\u3F81"], /* CJK Ideograph Extension A */ + ["\u3F82", "\u3F82"], /* CJK Ideograph Extension A */ + ["\u3F83", "\u3F83"], /* CJK Ideograph Extension A */ + ["\u3F84", "\u3F84"], /* CJK Ideograph Extension A */ + ["\u3F85", "\u3F85"], /* CJK Ideograph Extension A */ + ["\u3F86", "\u3F86"], /* CJK Ideograph Extension A */ + ["\u3F87", "\u3F87"], /* CJK Ideograph Extension A */ + ["\u3F88", "\u3F88"], /* CJK Ideograph Extension A */ + ["\u3F89", "\u3F89"], /* CJK Ideograph Extension A */ + ["\u3F8A", "\u3F8A"], /* CJK Ideograph Extension A */ + ["\u3F8B", "\u3F8B"], /* CJK Ideograph Extension A */ + ["\u3F8C", "\u3F8C"], /* CJK Ideograph Extension A */ + ["\u3F8D", "\u3F8D"], /* CJK Ideograph Extension A */ + ["\u3F8E", "\u3F8E"], /* CJK Ideograph Extension A */ + ["\u3F8F", "\u3F8F"], /* CJK Ideograph Extension A */ + ["\u3F90", "\u3F90"], /* CJK Ideograph Extension A */ + ["\u3F91", "\u3F91"], /* CJK Ideograph Extension A */ + ["\u3F92", "\u3F92"], /* CJK Ideograph Extension A */ + ["\u3F93", "\u3F93"], /* CJK Ideograph Extension A */ + ["\u3F94", "\u3F94"], /* CJK Ideograph Extension A */ + ["\u3F95", "\u3F95"], /* CJK Ideograph Extension A */ + ["\u3F96", "\u3F96"], /* CJK Ideograph Extension A */ + ["\u3F97", "\u3F97"], /* CJK Ideograph Extension A */ + ["\u3F98", "\u3F98"], /* CJK Ideograph Extension A */ + ["\u3F99", "\u3F99"], /* CJK Ideograph Extension A */ + ["\u3F9A", "\u3F9A"], /* CJK Ideograph Extension A */ + ["\u3F9B", "\u3F9B"], /* CJK Ideograph Extension A */ + ["\u3F9C", "\u3F9C"], /* CJK Ideograph Extension A */ + ["\u3F9D", "\u3F9D"], /* CJK Ideograph Extension A */ + ["\u3F9E", "\u3F9E"], /* CJK Ideograph Extension A */ + ["\u3F9F", "\u3F9F"], /* CJK Ideograph Extension A */ + ["\u3FA0", "\u3FA0"], /* CJK Ideograph Extension A */ + ["\u3FA1", "\u3FA1"], /* CJK Ideograph Extension A */ + ["\u3FA2", "\u3FA2"], /* CJK Ideograph Extension A */ + ["\u3FA3", "\u3FA3"], /* CJK Ideograph Extension A */ + ["\u3FA4", "\u3FA4"], /* CJK Ideograph Extension A */ + ["\u3FA5", "\u3FA5"], /* CJK Ideograph Extension A */ + ["\u3FA6", "\u3FA6"], /* CJK Ideograph Extension A */ + ["\u3FA7", "\u3FA7"], /* CJK Ideograph Extension A */ + ["\u3FA8", "\u3FA8"], /* CJK Ideograph Extension A */ + ["\u3FA9", "\u3FA9"], /* CJK Ideograph Extension A */ + ["\u3FAA", "\u3FAA"], /* CJK Ideograph Extension A */ + ["\u3FAB", "\u3FAB"], /* CJK Ideograph Extension A */ + ["\u3FAC", "\u3FAC"], /* CJK Ideograph Extension A */ + ["\u3FAD", "\u3FAD"], /* CJK Ideograph Extension A */ + ["\u3FAE", "\u3FAE"], /* CJK Ideograph Extension A */ + ["\u3FAF", "\u3FAF"], /* CJK Ideograph Extension A */ + ["\u3FB0", "\u3FB0"], /* CJK Ideograph Extension A */ + ["\u3FB1", "\u3FB1"], /* CJK Ideograph Extension A */ + ["\u3FB2", "\u3FB2"], /* CJK Ideograph Extension A */ + ["\u3FB3", "\u3FB3"], /* CJK Ideograph Extension A */ + ["\u3FB4", "\u3FB4"], /* CJK Ideograph Extension A */ + ["\u3FB5", "\u3FB5"], /* CJK Ideograph Extension A */ + ["\u3FB6", "\u3FB6"], /* CJK Ideograph Extension A */ + ["\u3FB7", "\u3FB7"], /* CJK Ideograph Extension A */ + ["\u3FB8", "\u3FB8"], /* CJK Ideograph Extension A */ + ["\u3FB9", "\u3FB9"], /* CJK Ideograph Extension A */ + ["\u3FBA", "\u3FBA"], /* CJK Ideograph Extension A */ + ["\u3FBB", "\u3FBB"], /* CJK Ideograph Extension A */ + ["\u3FBC", "\u3FBC"], /* CJK Ideograph Extension A */ + ["\u3FBD", "\u3FBD"], /* CJK Ideograph Extension A */ + ["\u3FBE", "\u3FBE"], /* CJK Ideograph Extension A */ + ["\u3FBF", "\u3FBF"], /* CJK Ideograph Extension A */ + ["\u3FC0", "\u3FC0"], /* CJK Ideograph Extension A */ + ["\u3FC1", "\u3FC1"], /* CJK Ideograph Extension A */ + ["\u3FC2", "\u3FC2"], /* CJK Ideograph Extension A */ + ["\u3FC3", "\u3FC3"], /* CJK Ideograph Extension A */ + ["\u3FC4", "\u3FC4"], /* CJK Ideograph Extension A */ + ["\u3FC5", "\u3FC5"], /* CJK Ideograph Extension A */ + ["\u3FC6", "\u3FC6"], /* CJK Ideograph Extension A */ + ["\u3FC7", "\u3FC7"], /* CJK Ideograph Extension A */ + ["\u3FC8", "\u3FC8"], /* CJK Ideograph Extension A */ + ["\u3FC9", "\u3FC9"], /* CJK Ideograph Extension A */ + ["\u3FCA", "\u3FCA"], /* CJK Ideograph Extension A */ + ["\u3FCB", "\u3FCB"], /* CJK Ideograph Extension A */ + ["\u3FCC", "\u3FCC"], /* CJK Ideograph Extension A */ + ["\u3FCD", "\u3FCD"], /* CJK Ideograph Extension A */ + ["\u3FCE", "\u3FCE"], /* CJK Ideograph Extension A */ + ["\u3FCF", "\u3FCF"], /* CJK Ideograph Extension A */ + ["\u3FD0", "\u3FD0"], /* CJK Ideograph Extension A */ + ["\u3FD1", "\u3FD1"], /* CJK Ideograph Extension A */ + ["\u3FD2", "\u3FD2"], /* CJK Ideograph Extension A */ + ["\u3FD3", "\u3FD3"], /* CJK Ideograph Extension A */ + ["\u3FD4", "\u3FD4"], /* CJK Ideograph Extension A */ + ["\u3FD5", "\u3FD5"], /* CJK Ideograph Extension A */ + ["\u3FD6", "\u3FD6"], /* CJK Ideograph Extension A */ + ["\u3FD7", "\u3FD7"], /* CJK Ideograph Extension A */ + ["\u3FD8", "\u3FD8"], /* CJK Ideograph Extension A */ + ["\u3FD9", "\u3FD9"], /* CJK Ideograph Extension A */ + ["\u3FDA", "\u3FDA"], /* CJK Ideograph Extension A */ + ["\u3FDB", "\u3FDB"], /* CJK Ideograph Extension A */ + ["\u3FDC", "\u3FDC"], /* CJK Ideograph Extension A */ + ["\u3FDD", "\u3FDD"], /* CJK Ideograph Extension A */ + ["\u3FDE", "\u3FDE"], /* CJK Ideograph Extension A */ + ["\u3FDF", "\u3FDF"], /* CJK Ideograph Extension A */ + ["\u3FE0", "\u3FE0"], /* CJK Ideograph Extension A */ + ["\u3FE1", "\u3FE1"], /* CJK Ideograph Extension A */ + ["\u3FE2", "\u3FE2"], /* CJK Ideograph Extension A */ + ["\u3FE3", "\u3FE3"], /* CJK Ideograph Extension A */ + ["\u3FE4", "\u3FE4"], /* CJK Ideograph Extension A */ + ["\u3FE5", "\u3FE5"], /* CJK Ideograph Extension A */ + ["\u3FE6", "\u3FE6"], /* CJK Ideograph Extension A */ + ["\u3FE7", "\u3FE7"], /* CJK Ideograph Extension A */ + ["\u3FE8", "\u3FE8"], /* CJK Ideograph Extension A */ + ["\u3FE9", "\u3FE9"], /* CJK Ideograph Extension A */ + ["\u3FEA", "\u3FEA"], /* CJK Ideograph Extension A */ + ["\u3FEB", "\u3FEB"], /* CJK Ideograph Extension A */ + ["\u3FEC", "\u3FEC"], /* CJK Ideograph Extension A */ + ["\u3FED", "\u3FED"], /* CJK Ideograph Extension A */ + ["\u3FEE", "\u3FEE"], /* CJK Ideograph Extension A */ + ["\u3FEF", "\u3FEF"], /* CJK Ideograph Extension A */ + ["\u3FF0", "\u3FF0"], /* CJK Ideograph Extension A */ + ["\u3FF1", "\u3FF1"], /* CJK Ideograph Extension A */ + ["\u3FF2", "\u3FF2"], /* CJK Ideograph Extension A */ + ["\u3FF3", "\u3FF3"], /* CJK Ideograph Extension A */ + ["\u3FF4", "\u3FF4"], /* CJK Ideograph Extension A */ + ["\u3FF5", "\u3FF5"], /* CJK Ideograph Extension A */ + ["\u3FF6", "\u3FF6"], /* CJK Ideograph Extension A */ + ["\u3FF7", "\u3FF7"], /* CJK Ideograph Extension A */ + ["\u3FF8", "\u3FF8"], /* CJK Ideograph Extension A */ + ["\u3FF9", "\u3FF9"], /* CJK Ideograph Extension A */ + ["\u3FFA", "\u3FFA"], /* CJK Ideograph Extension A */ + ["\u3FFB", "\u3FFB"], /* CJK Ideograph Extension A */ + ["\u3FFC", "\u3FFC"], /* CJK Ideograph Extension A */ + ["\u3FFD", "\u3FFD"], /* CJK Ideograph Extension A */ + ["\u3FFE", "\u3FFE"], /* CJK Ideograph Extension A */ + ["\u3FFF", "\u3FFF"], /* CJK Ideograph Extension A */ + ["\u4000", "\u4000"], /* CJK Ideograph Extension A */ + ["\u4001", "\u4001"], /* CJK Ideograph Extension A */ + ["\u4002", "\u4002"], /* CJK Ideograph Extension A */ + ["\u4003", "\u4003"], /* CJK Ideograph Extension A */ + ["\u4004", "\u4004"], /* CJK Ideograph Extension A */ + ["\u4005", "\u4005"], /* CJK Ideograph Extension A */ + ["\u4006", "\u4006"], /* CJK Ideograph Extension A */ + ["\u4007", "\u4007"], /* CJK Ideograph Extension A */ + ["\u4008", "\u4008"], /* CJK Ideograph Extension A */ + ["\u4009", "\u4009"], /* CJK Ideograph Extension A */ + ["\u400A", "\u400A"], /* CJK Ideograph Extension A */ + ["\u400B", "\u400B"], /* CJK Ideograph Extension A */ + ["\u400C", "\u400C"], /* CJK Ideograph Extension A */ + ["\u400D", "\u400D"], /* CJK Ideograph Extension A */ + ["\u400E", "\u400E"], /* CJK Ideograph Extension A */ + ["\u400F", "\u400F"], /* CJK Ideograph Extension A */ + ["\u4010", "\u4010"], /* CJK Ideograph Extension A */ + ["\u4011", "\u4011"], /* CJK Ideograph Extension A */ + ["\u4012", "\u4012"], /* CJK Ideograph Extension A */ + ["\u4013", "\u4013"], /* CJK Ideograph Extension A */ + ["\u4014", "\u4014"], /* CJK Ideograph Extension A */ + ["\u4015", "\u4015"], /* CJK Ideograph Extension A */ + ["\u4016", "\u4016"], /* CJK Ideograph Extension A */ + ["\u4017", "\u4017"], /* CJK Ideograph Extension A */ + ["\u4018", "\u4018"], /* CJK Ideograph Extension A */ + ["\u4019", "\u4019"], /* CJK Ideograph Extension A */ + ["\u401A", "\u401A"], /* CJK Ideograph Extension A */ + ["\u401B", "\u401B"], /* CJK Ideograph Extension A */ + ["\u401C", "\u401C"], /* CJK Ideograph Extension A */ + ["\u401D", "\u401D"], /* CJK Ideograph Extension A */ + ["\u401E", "\u401E"], /* CJK Ideograph Extension A */ + ["\u401F", "\u401F"], /* CJK Ideograph Extension A */ + ["\u4020", "\u4020"], /* CJK Ideograph Extension A */ + ["\u4021", "\u4021"], /* CJK Ideograph Extension A */ + ["\u4022", "\u4022"], /* CJK Ideograph Extension A */ + ["\u4023", "\u4023"], /* CJK Ideograph Extension A */ + ["\u4024", "\u4024"], /* CJK Ideograph Extension A */ + ["\u4025", "\u4025"], /* CJK Ideograph Extension A */ + ["\u4026", "\u4026"], /* CJK Ideograph Extension A */ + ["\u4027", "\u4027"], /* CJK Ideograph Extension A */ + ["\u4028", "\u4028"], /* CJK Ideograph Extension A */ + ["\u4029", "\u4029"], /* CJK Ideograph Extension A */ + ["\u402A", "\u402A"], /* CJK Ideograph Extension A */ + ["\u402B", "\u402B"], /* CJK Ideograph Extension A */ + ["\u402C", "\u402C"], /* CJK Ideograph Extension A */ + ["\u402D", "\u402D"], /* CJK Ideograph Extension A */ + ["\u402E", "\u402E"], /* CJK Ideograph Extension A */ + ["\u402F", "\u402F"], /* CJK Ideograph Extension A */ + ["\u4030", "\u4030"], /* CJK Ideograph Extension A */ + ["\u4031", "\u4031"], /* CJK Ideograph Extension A */ + ["\u4032", "\u4032"], /* CJK Ideograph Extension A */ + ["\u4033", "\u4033"], /* CJK Ideograph Extension A */ + ["\u4034", "\u4034"], /* CJK Ideograph Extension A */ + ["\u4035", "\u4035"], /* CJK Ideograph Extension A */ + ["\u4036", "\u4036"], /* CJK Ideograph Extension A */ + ["\u4037", "\u4037"], /* CJK Ideograph Extension A */ + ["\u4038", "\u4038"], /* CJK Ideograph Extension A */ + ["\u4039", "\u4039"], /* CJK Ideograph Extension A */ + ["\u403A", "\u403A"], /* CJK Ideograph Extension A */ + ["\u403B", "\u403B"], /* CJK Ideograph Extension A */ + ["\u403C", "\u403C"], /* CJK Ideograph Extension A */ + ["\u403D", "\u403D"], /* CJK Ideograph Extension A */ + ["\u403E", "\u403E"], /* CJK Ideograph Extension A */ + ["\u403F", "\u403F"], /* CJK Ideograph Extension A */ + ["\u4040", "\u4040"], /* CJK Ideograph Extension A */ + ["\u4041", "\u4041"], /* CJK Ideograph Extension A */ + ["\u4042", "\u4042"], /* CJK Ideograph Extension A */ + ["\u4043", "\u4043"], /* CJK Ideograph Extension A */ + ["\u4044", "\u4044"], /* CJK Ideograph Extension A */ + ["\u4045", "\u4045"], /* CJK Ideograph Extension A */ + ["\u4046", "\u4046"], /* CJK Ideograph Extension A */ + ["\u4047", "\u4047"], /* CJK Ideograph Extension A */ + ["\u4048", "\u4048"], /* CJK Ideograph Extension A */ + ["\u4049", "\u4049"], /* CJK Ideograph Extension A */ + ["\u404A", "\u404A"], /* CJK Ideograph Extension A */ + ["\u404B", "\u404B"], /* CJK Ideograph Extension A */ + ["\u404C", "\u404C"], /* CJK Ideograph Extension A */ + ["\u404D", "\u404D"], /* CJK Ideograph Extension A */ + ["\u404E", "\u404E"], /* CJK Ideograph Extension A */ + ["\u404F", "\u404F"], /* CJK Ideograph Extension A */ + ["\u4050", "\u4050"], /* CJK Ideograph Extension A */ + ["\u4051", "\u4051"], /* CJK Ideograph Extension A */ + ["\u4052", "\u4052"], /* CJK Ideograph Extension A */ + ["\u4053", "\u4053"], /* CJK Ideograph Extension A */ + ["\u4054", "\u4054"], /* CJK Ideograph Extension A */ + ["\u4055", "\u4055"], /* CJK Ideograph Extension A */ + ["\u4056", "\u4056"], /* CJK Ideograph Extension A */ + ["\u4057", "\u4057"], /* CJK Ideograph Extension A */ + ["\u4058", "\u4058"], /* CJK Ideograph Extension A */ + ["\u4059", "\u4059"], /* CJK Ideograph Extension A */ + ["\u405A", "\u405A"], /* CJK Ideograph Extension A */ + ["\u405B", "\u405B"], /* CJK Ideograph Extension A */ + ["\u405C", "\u405C"], /* CJK Ideograph Extension A */ + ["\u405D", "\u405D"], /* CJK Ideograph Extension A */ + ["\u405E", "\u405E"], /* CJK Ideograph Extension A */ + ["\u405F", "\u405F"], /* CJK Ideograph Extension A */ + ["\u4060", "\u4060"], /* CJK Ideograph Extension A */ + ["\u4061", "\u4061"], /* CJK Ideograph Extension A */ + ["\u4062", "\u4062"], /* CJK Ideograph Extension A */ + ["\u4063", "\u4063"], /* CJK Ideograph Extension A */ + ["\u4064", "\u4064"], /* CJK Ideograph Extension A */ + ["\u4065", "\u4065"], /* CJK Ideograph Extension A */ + ["\u4066", "\u4066"], /* CJK Ideograph Extension A */ + ["\u4067", "\u4067"], /* CJK Ideograph Extension A */ + ["\u4068", "\u4068"], /* CJK Ideograph Extension A */ + ["\u4069", "\u4069"], /* CJK Ideograph Extension A */ + ["\u406A", "\u406A"], /* CJK Ideograph Extension A */ + ["\u406B", "\u406B"], /* CJK Ideograph Extension A */ + ["\u406C", "\u406C"], /* CJK Ideograph Extension A */ + ["\u406D", "\u406D"], /* CJK Ideograph Extension A */ + ["\u406E", "\u406E"], /* CJK Ideograph Extension A */ + ["\u406F", "\u406F"], /* CJK Ideograph Extension A */ + ["\u4070", "\u4070"], /* CJK Ideograph Extension A */ + ["\u4071", "\u4071"], /* CJK Ideograph Extension A */ + ["\u4072", "\u4072"], /* CJK Ideograph Extension A */ + ["\u4073", "\u4073"], /* CJK Ideograph Extension A */ + ["\u4074", "\u4074"], /* CJK Ideograph Extension A */ + ["\u4075", "\u4075"], /* CJK Ideograph Extension A */ + ["\u4076", "\u4076"], /* CJK Ideograph Extension A */ + ["\u4077", "\u4077"], /* CJK Ideograph Extension A */ + ["\u4078", "\u4078"], /* CJK Ideograph Extension A */ + ["\u4079", "\u4079"], /* CJK Ideograph Extension A */ + ["\u407A", "\u407A"], /* CJK Ideograph Extension A */ + ["\u407B", "\u407B"], /* CJK Ideograph Extension A */ + ["\u407C", "\u407C"], /* CJK Ideograph Extension A */ + ["\u407D", "\u407D"], /* CJK Ideograph Extension A */ + ["\u407E", "\u407E"], /* CJK Ideograph Extension A */ + ["\u407F", "\u407F"], /* CJK Ideograph Extension A */ + ["\u4080", "\u4080"], /* CJK Ideograph Extension A */ + ["\u4081", "\u4081"], /* CJK Ideograph Extension A */ + ["\u4082", "\u4082"], /* CJK Ideograph Extension A */ + ["\u4083", "\u4083"], /* CJK Ideograph Extension A */ + ["\u4084", "\u4084"], /* CJK Ideograph Extension A */ + ["\u4085", "\u4085"], /* CJK Ideograph Extension A */ + ["\u4086", "\u4086"], /* CJK Ideograph Extension A */ + ["\u4087", "\u4087"], /* CJK Ideograph Extension A */ + ["\u4088", "\u4088"], /* CJK Ideograph Extension A */ + ["\u4089", "\u4089"], /* CJK Ideograph Extension A */ + ["\u408A", "\u408A"], /* CJK Ideograph Extension A */ + ["\u408B", "\u408B"], /* CJK Ideograph Extension A */ + ["\u408C", "\u408C"], /* CJK Ideograph Extension A */ + ["\u408D", "\u408D"], /* CJK Ideograph Extension A */ + ["\u408E", "\u408E"], /* CJK Ideograph Extension A */ + ["\u408F", "\u408F"], /* CJK Ideograph Extension A */ + ["\u4090", "\u4090"], /* CJK Ideograph Extension A */ + ["\u4091", "\u4091"], /* CJK Ideograph Extension A */ + ["\u4092", "\u4092"], /* CJK Ideograph Extension A */ + ["\u4093", "\u4093"], /* CJK Ideograph Extension A */ + ["\u4094", "\u4094"], /* CJK Ideograph Extension A */ + ["\u4095", "\u4095"], /* CJK Ideograph Extension A */ + ["\u4096", "\u4096"], /* CJK Ideograph Extension A */ + ["\u4097", "\u4097"], /* CJK Ideograph Extension A */ + ["\u4098", "\u4098"], /* CJK Ideograph Extension A */ + ["\u4099", "\u4099"], /* CJK Ideograph Extension A */ + ["\u409A", "\u409A"], /* CJK Ideograph Extension A */ + ["\u409B", "\u409B"], /* CJK Ideograph Extension A */ + ["\u409C", "\u409C"], /* CJK Ideograph Extension A */ + ["\u409D", "\u409D"], /* CJK Ideograph Extension A */ + ["\u409E", "\u409E"], /* CJK Ideograph Extension A */ + ["\u409F", "\u409F"], /* CJK Ideograph Extension A */ + ["\u40A0", "\u40A0"], /* CJK Ideograph Extension A */ + ["\u40A1", "\u40A1"], /* CJK Ideograph Extension A */ + ["\u40A2", "\u40A2"], /* CJK Ideograph Extension A */ + ["\u40A3", "\u40A3"], /* CJK Ideograph Extension A */ + ["\u40A4", "\u40A4"], /* CJK Ideograph Extension A */ + ["\u40A5", "\u40A5"], /* CJK Ideograph Extension A */ + ["\u40A6", "\u40A6"], /* CJK Ideograph Extension A */ + ["\u40A7", "\u40A7"], /* CJK Ideograph Extension A */ + ["\u40A8", "\u40A8"], /* CJK Ideograph Extension A */ + ["\u40A9", "\u40A9"], /* CJK Ideograph Extension A */ + ["\u40AA", "\u40AA"], /* CJK Ideograph Extension A */ + ["\u40AB", "\u40AB"], /* CJK Ideograph Extension A */ + ["\u40AC", "\u40AC"], /* CJK Ideograph Extension A */ + ["\u40AD", "\u40AD"], /* CJK Ideograph Extension A */ + ["\u40AE", "\u40AE"], /* CJK Ideograph Extension A */ + ["\u40AF", "\u40AF"], /* CJK Ideograph Extension A */ + ["\u40B0", "\u40B0"], /* CJK Ideograph Extension A */ + ["\u40B1", "\u40B1"], /* CJK Ideograph Extension A */ + ["\u40B2", "\u40B2"], /* CJK Ideograph Extension A */ + ["\u40B3", "\u40B3"], /* CJK Ideograph Extension A */ + ["\u40B4", "\u40B4"], /* CJK Ideograph Extension A */ + ["\u40B5", "\u40B5"], /* CJK Ideograph Extension A */ + ["\u40B6", "\u40B6"], /* CJK Ideograph Extension A */ + ["\u40B7", "\u40B7"], /* CJK Ideograph Extension A */ + ["\u40B8", "\u40B8"], /* CJK Ideograph Extension A */ + ["\u40B9", "\u40B9"], /* CJK Ideograph Extension A */ + ["\u40BA", "\u40BA"], /* CJK Ideograph Extension A */ + ["\u40BB", "\u40BB"], /* CJK Ideograph Extension A */ + ["\u40BC", "\u40BC"], /* CJK Ideograph Extension A */ + ["\u40BD", "\u40BD"], /* CJK Ideograph Extension A */ + ["\u40BE", "\u40BE"], /* CJK Ideograph Extension A */ + ["\u40BF", "\u40BF"], /* CJK Ideograph Extension A */ + ["\u40C0", "\u40C0"], /* CJK Ideograph Extension A */ + ["\u40C1", "\u40C1"], /* CJK Ideograph Extension A */ + ["\u40C2", "\u40C2"], /* CJK Ideograph Extension A */ + ["\u40C3", "\u40C3"], /* CJK Ideograph Extension A */ + ["\u40C4", "\u40C4"], /* CJK Ideograph Extension A */ + ["\u40C5", "\u40C5"], /* CJK Ideograph Extension A */ + ["\u40C6", "\u40C6"], /* CJK Ideograph Extension A */ + ["\u40C7", "\u40C7"], /* CJK Ideograph Extension A */ + ["\u40C8", "\u40C8"], /* CJK Ideograph Extension A */ + ["\u40C9", "\u40C9"], /* CJK Ideograph Extension A */ + ["\u40CA", "\u40CA"], /* CJK Ideograph Extension A */ + ["\u40CB", "\u40CB"], /* CJK Ideograph Extension A */ + ["\u40CC", "\u40CC"], /* CJK Ideograph Extension A */ + ["\u40CD", "\u40CD"], /* CJK Ideograph Extension A */ + ["\u40CE", "\u40CE"], /* CJK Ideograph Extension A */ + ["\u40CF", "\u40CF"], /* CJK Ideograph Extension A */ + ["\u40D0", "\u40D0"], /* CJK Ideograph Extension A */ + ["\u40D1", "\u40D1"], /* CJK Ideograph Extension A */ + ["\u40D2", "\u40D2"], /* CJK Ideograph Extension A */ + ["\u40D3", "\u40D3"], /* CJK Ideograph Extension A */ + ["\u40D4", "\u40D4"], /* CJK Ideograph Extension A */ + ["\u40D5", "\u40D5"], /* CJK Ideograph Extension A */ + ["\u40D6", "\u40D6"], /* CJK Ideograph Extension A */ + ["\u40D7", "\u40D7"], /* CJK Ideograph Extension A */ + ["\u40D8", "\u40D8"], /* CJK Ideograph Extension A */ + ["\u40D9", "\u40D9"], /* CJK Ideograph Extension A */ + ["\u40DA", "\u40DA"], /* CJK Ideograph Extension A */ + ["\u40DB", "\u40DB"], /* CJK Ideograph Extension A */ + ["\u40DC", "\u40DC"], /* CJK Ideograph Extension A */ + ["\u40DD", "\u40DD"], /* CJK Ideograph Extension A */ + ["\u40DE", "\u40DE"], /* CJK Ideograph Extension A */ + ["\u40DF", "\u40DF"], /* CJK Ideograph Extension A */ + ["\u40E0", "\u40E0"], /* CJK Ideograph Extension A */ + ["\u40E1", "\u40E1"], /* CJK Ideograph Extension A */ + ["\u40E2", "\u40E2"], /* CJK Ideograph Extension A */ + ["\u40E3", "\u40E3"], /* CJK Ideograph Extension A */ + ["\u40E4", "\u40E4"], /* CJK Ideograph Extension A */ + ["\u40E5", "\u40E5"], /* CJK Ideograph Extension A */ + ["\u40E6", "\u40E6"], /* CJK Ideograph Extension A */ + ["\u40E7", "\u40E7"], /* CJK Ideograph Extension A */ + ["\u40E8", "\u40E8"], /* CJK Ideograph Extension A */ + ["\u40E9", "\u40E9"], /* CJK Ideograph Extension A */ + ["\u40EA", "\u40EA"], /* CJK Ideograph Extension A */ + ["\u40EB", "\u40EB"], /* CJK Ideograph Extension A */ + ["\u40EC", "\u40EC"], /* CJK Ideograph Extension A */ + ["\u40ED", "\u40ED"], /* CJK Ideograph Extension A */ + ["\u40EE", "\u40EE"], /* CJK Ideograph Extension A */ + ["\u40EF", "\u40EF"], /* CJK Ideograph Extension A */ + ["\u40F0", "\u40F0"], /* CJK Ideograph Extension A */ + ["\u40F1", "\u40F1"], /* CJK Ideograph Extension A */ + ["\u40F2", "\u40F2"], /* CJK Ideograph Extension A */ + ["\u40F3", "\u40F3"], /* CJK Ideograph Extension A */ + ["\u40F4", "\u40F4"], /* CJK Ideograph Extension A */ + ["\u40F5", "\u40F5"], /* CJK Ideograph Extension A */ + ["\u40F6", "\u40F6"], /* CJK Ideograph Extension A */ + ["\u40F7", "\u40F7"], /* CJK Ideograph Extension A */ + ["\u40F8", "\u40F8"], /* CJK Ideograph Extension A */ + ["\u40F9", "\u40F9"], /* CJK Ideograph Extension A */ + ["\u40FA", "\u40FA"], /* CJK Ideograph Extension A */ + ["\u40FB", "\u40FB"], /* CJK Ideograph Extension A */ + ["\u40FC", "\u40FC"], /* CJK Ideograph Extension A */ + ["\u40FD", "\u40FD"], /* CJK Ideograph Extension A */ + ["\u40FE", "\u40FE"], /* CJK Ideograph Extension A */ + ["\u40FF", "\u40FF"], /* CJK Ideograph Extension A */ + ["\u4100", "\u4100"], /* CJK Ideograph Extension A */ + ["\u4101", "\u4101"], /* CJK Ideograph Extension A */ + ["\u4102", "\u4102"], /* CJK Ideograph Extension A */ + ["\u4103", "\u4103"], /* CJK Ideograph Extension A */ + ["\u4104", "\u4104"], /* CJK Ideograph Extension A */ + ["\u4105", "\u4105"], /* CJK Ideograph Extension A */ + ["\u4106", "\u4106"], /* CJK Ideograph Extension A */ + ["\u4107", "\u4107"], /* CJK Ideograph Extension A */ + ["\u4108", "\u4108"], /* CJK Ideograph Extension A */ + ["\u4109", "\u4109"], /* CJK Ideograph Extension A */ + ["\u410A", "\u410A"], /* CJK Ideograph Extension A */ + ["\u410B", "\u410B"], /* CJK Ideograph Extension A */ + ["\u410C", "\u410C"], /* CJK Ideograph Extension A */ + ["\u410D", "\u410D"], /* CJK Ideograph Extension A */ + ["\u410E", "\u410E"], /* CJK Ideograph Extension A */ + ["\u410F", "\u410F"], /* CJK Ideograph Extension A */ + ["\u4110", "\u4110"], /* CJK Ideograph Extension A */ + ["\u4111", "\u4111"], /* CJK Ideograph Extension A */ + ["\u4112", "\u4112"], /* CJK Ideograph Extension A */ + ["\u4113", "\u4113"], /* CJK Ideograph Extension A */ + ["\u4114", "\u4114"], /* CJK Ideograph Extension A */ + ["\u4115", "\u4115"], /* CJK Ideograph Extension A */ + ["\u4116", "\u4116"], /* CJK Ideograph Extension A */ + ["\u4117", "\u4117"], /* CJK Ideograph Extension A */ + ["\u4118", "\u4118"], /* CJK Ideograph Extension A */ + ["\u4119", "\u4119"], /* CJK Ideograph Extension A */ + ["\u411A", "\u411A"], /* CJK Ideograph Extension A */ + ["\u411B", "\u411B"], /* CJK Ideograph Extension A */ + ["\u411C", "\u411C"], /* CJK Ideograph Extension A */ + ["\u411D", "\u411D"], /* CJK Ideograph Extension A */ + ["\u411E", "\u411E"], /* CJK Ideograph Extension A */ + ["\u411F", "\u411F"], /* CJK Ideograph Extension A */ + ["\u4120", "\u4120"], /* CJK Ideograph Extension A */ + ["\u4121", "\u4121"], /* CJK Ideograph Extension A */ + ["\u4122", "\u4122"], /* CJK Ideograph Extension A */ + ["\u4123", "\u4123"], /* CJK Ideograph Extension A */ + ["\u4124", "\u4124"], /* CJK Ideograph Extension A */ + ["\u4125", "\u4125"], /* CJK Ideograph Extension A */ + ["\u4126", "\u4126"], /* CJK Ideograph Extension A */ + ["\u4127", "\u4127"], /* CJK Ideograph Extension A */ + ["\u4128", "\u4128"], /* CJK Ideograph Extension A */ + ["\u4129", "\u4129"], /* CJK Ideograph Extension A */ + ["\u412A", "\u412A"], /* CJK Ideograph Extension A */ + ["\u412B", "\u412B"], /* CJK Ideograph Extension A */ + ["\u412C", "\u412C"], /* CJK Ideograph Extension A */ + ["\u412D", "\u412D"], /* CJK Ideograph Extension A */ + ["\u412E", "\u412E"], /* CJK Ideograph Extension A */ + ["\u412F", "\u412F"], /* CJK Ideograph Extension A */ + ["\u4130", "\u4130"], /* CJK Ideograph Extension A */ + ["\u4131", "\u4131"], /* CJK Ideograph Extension A */ + ["\u4132", "\u4132"], /* CJK Ideograph Extension A */ + ["\u4133", "\u4133"], /* CJK Ideograph Extension A */ + ["\u4134", "\u4134"], /* CJK Ideograph Extension A */ + ["\u4135", "\u4135"], /* CJK Ideograph Extension A */ + ["\u4136", "\u4136"], /* CJK Ideograph Extension A */ + ["\u4137", "\u4137"], /* CJK Ideograph Extension A */ + ["\u4138", "\u4138"], /* CJK Ideograph Extension A */ + ["\u4139", "\u4139"], /* CJK Ideograph Extension A */ + ["\u413A", "\u413A"], /* CJK Ideograph Extension A */ + ["\u413B", "\u413B"], /* CJK Ideograph Extension A */ + ["\u413C", "\u413C"], /* CJK Ideograph Extension A */ + ["\u413D", "\u413D"], /* CJK Ideograph Extension A */ + ["\u413E", "\u413E"], /* CJK Ideograph Extension A */ + ["\u413F", "\u413F"], /* CJK Ideograph Extension A */ + ["\u4140", "\u4140"], /* CJK Ideograph Extension A */ + ["\u4141", "\u4141"], /* CJK Ideograph Extension A */ + ["\u4142", "\u4142"], /* CJK Ideograph Extension A */ + ["\u4143", "\u4143"], /* CJK Ideograph Extension A */ + ["\u4144", "\u4144"], /* CJK Ideograph Extension A */ + ["\u4145", "\u4145"], /* CJK Ideograph Extension A */ + ["\u4146", "\u4146"], /* CJK Ideograph Extension A */ + ["\u4147", "\u4147"], /* CJK Ideograph Extension A */ + ["\u4148", "\u4148"], /* CJK Ideograph Extension A */ + ["\u4149", "\u4149"], /* CJK Ideograph Extension A */ + ["\u414A", "\u414A"], /* CJK Ideograph Extension A */ + ["\u414B", "\u414B"], /* CJK Ideograph Extension A */ + ["\u414C", "\u414C"], /* CJK Ideograph Extension A */ + ["\u414D", "\u414D"], /* CJK Ideograph Extension A */ + ["\u414E", "\u414E"], /* CJK Ideograph Extension A */ + ["\u414F", "\u414F"], /* CJK Ideograph Extension A */ + ["\u4150", "\u4150"], /* CJK Ideograph Extension A */ + ["\u4151", "\u4151"], /* CJK Ideograph Extension A */ + ["\u4152", "\u4152"], /* CJK Ideograph Extension A */ + ["\u4153", "\u4153"], /* CJK Ideograph Extension A */ + ["\u4154", "\u4154"], /* CJK Ideograph Extension A */ + ["\u4155", "\u4155"], /* CJK Ideograph Extension A */ + ["\u4156", "\u4156"], /* CJK Ideograph Extension A */ + ["\u4157", "\u4157"], /* CJK Ideograph Extension A */ + ["\u4158", "\u4158"], /* CJK Ideograph Extension A */ + ["\u4159", "\u4159"], /* CJK Ideograph Extension A */ + ["\u415A", "\u415A"], /* CJK Ideograph Extension A */ + ["\u415B", "\u415B"], /* CJK Ideograph Extension A */ + ["\u415C", "\u415C"], /* CJK Ideograph Extension A */ + ["\u415D", "\u415D"], /* CJK Ideograph Extension A */ + ["\u415E", "\u415E"], /* CJK Ideograph Extension A */ + ["\u415F", "\u415F"], /* CJK Ideograph Extension A */ + ["\u4160", "\u4160"], /* CJK Ideograph Extension A */ + ["\u4161", "\u4161"], /* CJK Ideograph Extension A */ + ["\u4162", "\u4162"], /* CJK Ideograph Extension A */ + ["\u4163", "\u4163"], /* CJK Ideograph Extension A */ + ["\u4164", "\u4164"], /* CJK Ideograph Extension A */ + ["\u4165", "\u4165"], /* CJK Ideograph Extension A */ + ["\u4166", "\u4166"], /* CJK Ideograph Extension A */ + ["\u4167", "\u4167"], /* CJK Ideograph Extension A */ + ["\u4168", "\u4168"], /* CJK Ideograph Extension A */ + ["\u4169", "\u4169"], /* CJK Ideograph Extension A */ + ["\u416A", "\u416A"], /* CJK Ideograph Extension A */ + ["\u416B", "\u416B"], /* CJK Ideograph Extension A */ + ["\u416C", "\u416C"], /* CJK Ideograph Extension A */ + ["\u416D", "\u416D"], /* CJK Ideograph Extension A */ + ["\u416E", "\u416E"], /* CJK Ideograph Extension A */ + ["\u416F", "\u416F"], /* CJK Ideograph Extension A */ + ["\u4170", "\u4170"], /* CJK Ideograph Extension A */ + ["\u4171", "\u4171"], /* CJK Ideograph Extension A */ + ["\u4172", "\u4172"], /* CJK Ideograph Extension A */ + ["\u4173", "\u4173"], /* CJK Ideograph Extension A */ + ["\u4174", "\u4174"], /* CJK Ideograph Extension A */ + ["\u4175", "\u4175"], /* CJK Ideograph Extension A */ + ["\u4176", "\u4176"], /* CJK Ideograph Extension A */ + ["\u4177", "\u4177"], /* CJK Ideograph Extension A */ + ["\u4178", "\u4178"], /* CJK Ideograph Extension A */ + ["\u4179", "\u4179"], /* CJK Ideograph Extension A */ + ["\u417A", "\u417A"], /* CJK Ideograph Extension A */ + ["\u417B", "\u417B"], /* CJK Ideograph Extension A */ + ["\u417C", "\u417C"], /* CJK Ideograph Extension A */ + ["\u417D", "\u417D"], /* CJK Ideograph Extension A */ + ["\u417E", "\u417E"], /* CJK Ideograph Extension A */ + ["\u417F", "\u417F"], /* CJK Ideograph Extension A */ + ["\u4180", "\u4180"], /* CJK Ideograph Extension A */ + ["\u4181", "\u4181"], /* CJK Ideograph Extension A */ + ["\u4182", "\u4182"], /* CJK Ideograph Extension A */ + ["\u4183", "\u4183"], /* CJK Ideograph Extension A */ + ["\u4184", "\u4184"], /* CJK Ideograph Extension A */ + ["\u4185", "\u4185"], /* CJK Ideograph Extension A */ + ["\u4186", "\u4186"], /* CJK Ideograph Extension A */ + ["\u4187", "\u4187"], /* CJK Ideograph Extension A */ + ["\u4188", "\u4188"], /* CJK Ideograph Extension A */ + ["\u4189", "\u4189"], /* CJK Ideograph Extension A */ + ["\u418A", "\u418A"], /* CJK Ideograph Extension A */ + ["\u418B", "\u418B"], /* CJK Ideograph Extension A */ + ["\u418C", "\u418C"], /* CJK Ideograph Extension A */ + ["\u418D", "\u418D"], /* CJK Ideograph Extension A */ + ["\u418E", "\u418E"], /* CJK Ideograph Extension A */ + ["\u418F", "\u418F"], /* CJK Ideograph Extension A */ + ["\u4190", "\u4190"], /* CJK Ideograph Extension A */ + ["\u4191", "\u4191"], /* CJK Ideograph Extension A */ + ["\u4192", "\u4192"], /* CJK Ideograph Extension A */ + ["\u4193", "\u4193"], /* CJK Ideograph Extension A */ + ["\u4194", "\u4194"], /* CJK Ideograph Extension A */ + ["\u4195", "\u4195"], /* CJK Ideograph Extension A */ + ["\u4196", "\u4196"], /* CJK Ideograph Extension A */ + ["\u4197", "\u4197"], /* CJK Ideograph Extension A */ + ["\u4198", "\u4198"], /* CJK Ideograph Extension A */ + ["\u4199", "\u4199"], /* CJK Ideograph Extension A */ + ["\u419A", "\u419A"], /* CJK Ideograph Extension A */ + ["\u419B", "\u419B"], /* CJK Ideograph Extension A */ + ["\u419C", "\u419C"], /* CJK Ideograph Extension A */ + ["\u419D", "\u419D"], /* CJK Ideograph Extension A */ + ["\u419E", "\u419E"], /* CJK Ideograph Extension A */ + ["\u419F", "\u419F"], /* CJK Ideograph Extension A */ + ["\u41A0", "\u41A0"], /* CJK Ideograph Extension A */ + ["\u41A1", "\u41A1"], /* CJK Ideograph Extension A */ + ["\u41A2", "\u41A2"], /* CJK Ideograph Extension A */ + ["\u41A3", "\u41A3"], /* CJK Ideograph Extension A */ + ["\u41A4", "\u41A4"], /* CJK Ideograph Extension A */ + ["\u41A5", "\u41A5"], /* CJK Ideograph Extension A */ + ["\u41A6", "\u41A6"], /* CJK Ideograph Extension A */ + ["\u41A7", "\u41A7"], /* CJK Ideograph Extension A */ + ["\u41A8", "\u41A8"], /* CJK Ideograph Extension A */ + ["\u41A9", "\u41A9"], /* CJK Ideograph Extension A */ + ["\u41AA", "\u41AA"], /* CJK Ideograph Extension A */ + ["\u41AB", "\u41AB"], /* CJK Ideograph Extension A */ + ["\u41AC", "\u41AC"], /* CJK Ideograph Extension A */ + ["\u41AD", "\u41AD"], /* CJK Ideograph Extension A */ + ["\u41AE", "\u41AE"], /* CJK Ideograph Extension A */ + ["\u41AF", "\u41AF"], /* CJK Ideograph Extension A */ + ["\u41B0", "\u41B0"], /* CJK Ideograph Extension A */ + ["\u41B1", "\u41B1"], /* CJK Ideograph Extension A */ + ["\u41B2", "\u41B2"], /* CJK Ideograph Extension A */ + ["\u41B3", "\u41B3"], /* CJK Ideograph Extension A */ + ["\u41B4", "\u41B4"], /* CJK Ideograph Extension A */ + ["\u41B5", "\u41B5"], /* CJK Ideograph Extension A */ + ["\u41B6", "\u41B6"], /* CJK Ideograph Extension A */ + ["\u41B7", "\u41B7"], /* CJK Ideograph Extension A */ + ["\u41B8", "\u41B8"], /* CJK Ideograph Extension A */ + ["\u41B9", "\u41B9"], /* CJK Ideograph Extension A */ + ["\u41BA", "\u41BA"], /* CJK Ideograph Extension A */ + ["\u41BB", "\u41BB"], /* CJK Ideograph Extension A */ + ["\u41BC", "\u41BC"], /* CJK Ideograph Extension A */ + ["\u41BD", "\u41BD"], /* CJK Ideograph Extension A */ + ["\u41BE", "\u41BE"], /* CJK Ideograph Extension A */ + ["\u41BF", "\u41BF"], /* CJK Ideograph Extension A */ + ["\u41C0", "\u41C0"], /* CJK Ideograph Extension A */ + ["\u41C1", "\u41C1"], /* CJK Ideograph Extension A */ + ["\u41C2", "\u41C2"], /* CJK Ideograph Extension A */ + ["\u41C3", "\u41C3"], /* CJK Ideograph Extension A */ + ["\u41C4", "\u41C4"], /* CJK Ideograph Extension A */ + ["\u41C5", "\u41C5"], /* CJK Ideograph Extension A */ + ["\u41C6", "\u41C6"], /* CJK Ideograph Extension A */ + ["\u41C7", "\u41C7"], /* CJK Ideograph Extension A */ + ["\u41C8", "\u41C8"], /* CJK Ideograph Extension A */ + ["\u41C9", "\u41C9"], /* CJK Ideograph Extension A */ + ["\u41CA", "\u41CA"], /* CJK Ideograph Extension A */ + ["\u41CB", "\u41CB"], /* CJK Ideograph Extension A */ + ["\u41CC", "\u41CC"], /* CJK Ideograph Extension A */ + ["\u41CD", "\u41CD"], /* CJK Ideograph Extension A */ + ["\u41CE", "\u41CE"], /* CJK Ideograph Extension A */ + ["\u41CF", "\u41CF"], /* CJK Ideograph Extension A */ + ["\u41D0", "\u41D0"], /* CJK Ideograph Extension A */ + ["\u41D1", "\u41D1"], /* CJK Ideograph Extension A */ + ["\u41D2", "\u41D2"], /* CJK Ideograph Extension A */ + ["\u41D3", "\u41D3"], /* CJK Ideograph Extension A */ + ["\u41D4", "\u41D4"], /* CJK Ideograph Extension A */ + ["\u41D5", "\u41D5"], /* CJK Ideograph Extension A */ + ["\u41D6", "\u41D6"], /* CJK Ideograph Extension A */ + ["\u41D7", "\u41D7"], /* CJK Ideograph Extension A */ + ["\u41D8", "\u41D8"], /* CJK Ideograph Extension A */ + ["\u41D9", "\u41D9"], /* CJK Ideograph Extension A */ + ["\u41DA", "\u41DA"], /* CJK Ideograph Extension A */ + ["\u41DB", "\u41DB"], /* CJK Ideograph Extension A */ + ["\u41DC", "\u41DC"], /* CJK Ideograph Extension A */ + ["\u41DD", "\u41DD"], /* CJK Ideograph Extension A */ + ["\u41DE", "\u41DE"], /* CJK Ideograph Extension A */ + ["\u41DF", "\u41DF"], /* CJK Ideograph Extension A */ + ["\u41E0", "\u41E0"], /* CJK Ideograph Extension A */ + ["\u41E1", "\u41E1"], /* CJK Ideograph Extension A */ + ["\u41E2", "\u41E2"], /* CJK Ideograph Extension A */ + ["\u41E3", "\u41E3"], /* CJK Ideograph Extension A */ + ["\u41E4", "\u41E4"], /* CJK Ideograph Extension A */ + ["\u41E5", "\u41E5"], /* CJK Ideograph Extension A */ + ["\u41E6", "\u41E6"], /* CJK Ideograph Extension A */ + ["\u41E7", "\u41E7"], /* CJK Ideograph Extension A */ + ["\u41E8", "\u41E8"], /* CJK Ideograph Extension A */ + ["\u41E9", "\u41E9"], /* CJK Ideograph Extension A */ + ["\u41EA", "\u41EA"], /* CJK Ideograph Extension A */ + ["\u41EB", "\u41EB"], /* CJK Ideograph Extension A */ + ["\u41EC", "\u41EC"], /* CJK Ideograph Extension A */ + ["\u41ED", "\u41ED"], /* CJK Ideograph Extension A */ + ["\u41EE", "\u41EE"], /* CJK Ideograph Extension A */ + ["\u41EF", "\u41EF"], /* CJK Ideograph Extension A */ + ["\u41F0", "\u41F0"], /* CJK Ideograph Extension A */ + ["\u41F1", "\u41F1"], /* CJK Ideograph Extension A */ + ["\u41F2", "\u41F2"], /* CJK Ideograph Extension A */ + ["\u41F3", "\u41F3"], /* CJK Ideograph Extension A */ + ["\u41F4", "\u41F4"], /* CJK Ideograph Extension A */ + ["\u41F5", "\u41F5"], /* CJK Ideograph Extension A */ + ["\u41F6", "\u41F6"], /* CJK Ideograph Extension A */ + ["\u41F7", "\u41F7"], /* CJK Ideograph Extension A */ + ["\u41F8", "\u41F8"], /* CJK Ideograph Extension A */ + ["\u41F9", "\u41F9"], /* CJK Ideograph Extension A */ + ["\u41FA", "\u41FA"], /* CJK Ideograph Extension A */ + ["\u41FB", "\u41FB"], /* CJK Ideograph Extension A */ + ["\u41FC", "\u41FC"], /* CJK Ideograph Extension A */ + ["\u41FD", "\u41FD"], /* CJK Ideograph Extension A */ + ["\u41FE", "\u41FE"], /* CJK Ideograph Extension A */ + ["\u41FF", "\u41FF"], /* CJK Ideograph Extension A */ + ["\u4200", "\u4200"], /* CJK Ideograph Extension A */ + ["\u4201", "\u4201"], /* CJK Ideograph Extension A */ + ["\u4202", "\u4202"], /* CJK Ideograph Extension A */ + ["\u4203", "\u4203"], /* CJK Ideograph Extension A */ + ["\u4204", "\u4204"], /* CJK Ideograph Extension A */ + ["\u4205", "\u4205"], /* CJK Ideograph Extension A */ + ["\u4206", "\u4206"], /* CJK Ideograph Extension A */ + ["\u4207", "\u4207"], /* CJK Ideograph Extension A */ + ["\u4208", "\u4208"], /* CJK Ideograph Extension A */ + ["\u4209", "\u4209"], /* CJK Ideograph Extension A */ + ["\u420A", "\u420A"], /* CJK Ideograph Extension A */ + ["\u420B", "\u420B"], /* CJK Ideograph Extension A */ + ["\u420C", "\u420C"], /* CJK Ideograph Extension A */ + ["\u420D", "\u420D"], /* CJK Ideograph Extension A */ + ["\u420E", "\u420E"], /* CJK Ideograph Extension A */ + ["\u420F", "\u420F"], /* CJK Ideograph Extension A */ + ["\u4210", "\u4210"], /* CJK Ideograph Extension A */ + ["\u4211", "\u4211"], /* CJK Ideograph Extension A */ + ["\u4212", "\u4212"], /* CJK Ideograph Extension A */ + ["\u4213", "\u4213"], /* CJK Ideograph Extension A */ + ["\u4214", "\u4214"], /* CJK Ideograph Extension A */ + ["\u4215", "\u4215"], /* CJK Ideograph Extension A */ + ["\u4216", "\u4216"], /* CJK Ideograph Extension A */ + ["\u4217", "\u4217"], /* CJK Ideograph Extension A */ + ["\u4218", "\u4218"], /* CJK Ideograph Extension A */ + ["\u4219", "\u4219"], /* CJK Ideograph Extension A */ + ["\u421A", "\u421A"], /* CJK Ideograph Extension A */ + ["\u421B", "\u421B"], /* CJK Ideograph Extension A */ + ["\u421C", "\u421C"], /* CJK Ideograph Extension A */ + ["\u421D", "\u421D"], /* CJK Ideograph Extension A */ + ["\u421E", "\u421E"], /* CJK Ideograph Extension A */ + ["\u421F", "\u421F"], /* CJK Ideograph Extension A */ + ["\u4220", "\u4220"], /* CJK Ideograph Extension A */ + ["\u4221", "\u4221"], /* CJK Ideograph Extension A */ + ["\u4222", "\u4222"], /* CJK Ideograph Extension A */ + ["\u4223", "\u4223"], /* CJK Ideograph Extension A */ + ["\u4224", "\u4224"], /* CJK Ideograph Extension A */ + ["\u4225", "\u4225"], /* CJK Ideograph Extension A */ + ["\u4226", "\u4226"], /* CJK Ideograph Extension A */ + ["\u4227", "\u4227"], /* CJK Ideograph Extension A */ + ["\u4228", "\u4228"], /* CJK Ideograph Extension A */ + ["\u4229", "\u4229"], /* CJK Ideograph Extension A */ + ["\u422A", "\u422A"], /* CJK Ideograph Extension A */ + ["\u422B", "\u422B"], /* CJK Ideograph Extension A */ + ["\u422C", "\u422C"], /* CJK Ideograph Extension A */ + ["\u422D", "\u422D"], /* CJK Ideograph Extension A */ + ["\u422E", "\u422E"], /* CJK Ideograph Extension A */ + ["\u422F", "\u422F"], /* CJK Ideograph Extension A */ + ["\u4230", "\u4230"], /* CJK Ideograph Extension A */ + ["\u4231", "\u4231"], /* CJK Ideograph Extension A */ + ["\u4232", "\u4232"], /* CJK Ideograph Extension A */ + ["\u4233", "\u4233"], /* CJK Ideograph Extension A */ + ["\u4234", "\u4234"], /* CJK Ideograph Extension A */ + ["\u4235", "\u4235"], /* CJK Ideograph Extension A */ + ["\u4236", "\u4236"], /* CJK Ideograph Extension A */ + ["\u4237", "\u4237"], /* CJK Ideograph Extension A */ + ["\u4238", "\u4238"], /* CJK Ideograph Extension A */ + ["\u4239", "\u4239"], /* CJK Ideograph Extension A */ + ["\u423A", "\u423A"], /* CJK Ideograph Extension A */ + ["\u423B", "\u423B"], /* CJK Ideograph Extension A */ + ["\u423C", "\u423C"], /* CJK Ideograph Extension A */ + ["\u423D", "\u423D"], /* CJK Ideograph Extension A */ + ["\u423E", "\u423E"], /* CJK Ideograph Extension A */ + ["\u423F", "\u423F"], /* CJK Ideograph Extension A */ + ["\u4240", "\u4240"], /* CJK Ideograph Extension A */ + ["\u4241", "\u4241"], /* CJK Ideograph Extension A */ + ["\u4242", "\u4242"], /* CJK Ideograph Extension A */ + ["\u4243", "\u4243"], /* CJK Ideograph Extension A */ + ["\u4244", "\u4244"], /* CJK Ideograph Extension A */ + ["\u4245", "\u4245"], /* CJK Ideograph Extension A */ + ["\u4246", "\u4246"], /* CJK Ideograph Extension A */ + ["\u4247", "\u4247"], /* CJK Ideograph Extension A */ + ["\u4248", "\u4248"], /* CJK Ideograph Extension A */ + ["\u4249", "\u4249"], /* CJK Ideograph Extension A */ + ["\u424A", "\u424A"], /* CJK Ideograph Extension A */ + ["\u424B", "\u424B"], /* CJK Ideograph Extension A */ + ["\u424C", "\u424C"], /* CJK Ideograph Extension A */ + ["\u424D", "\u424D"], /* CJK Ideograph Extension A */ + ["\u424E", "\u424E"], /* CJK Ideograph Extension A */ + ["\u424F", "\u424F"], /* CJK Ideograph Extension A */ + ["\u4250", "\u4250"], /* CJK Ideograph Extension A */ + ["\u4251", "\u4251"], /* CJK Ideograph Extension A */ + ["\u4252", "\u4252"], /* CJK Ideograph Extension A */ + ["\u4253", "\u4253"], /* CJK Ideograph Extension A */ + ["\u4254", "\u4254"], /* CJK Ideograph Extension A */ + ["\u4255", "\u4255"], /* CJK Ideograph Extension A */ + ["\u4256", "\u4256"], /* CJK Ideograph Extension A */ + ["\u4257", "\u4257"], /* CJK Ideograph Extension A */ + ["\u4258", "\u4258"], /* CJK Ideograph Extension A */ + ["\u4259", "\u4259"], /* CJK Ideograph Extension A */ + ["\u425A", "\u425A"], /* CJK Ideograph Extension A */ + ["\u425B", "\u425B"], /* CJK Ideograph Extension A */ + ["\u425C", "\u425C"], /* CJK Ideograph Extension A */ + ["\u425D", "\u425D"], /* CJK Ideograph Extension A */ + ["\u425E", "\u425E"], /* CJK Ideograph Extension A */ + ["\u425F", "\u425F"], /* CJK Ideograph Extension A */ + ["\u4260", "\u4260"], /* CJK Ideograph Extension A */ + ["\u4261", "\u4261"], /* CJK Ideograph Extension A */ + ["\u4262", "\u4262"], /* CJK Ideograph Extension A */ + ["\u4263", "\u4263"], /* CJK Ideograph Extension A */ + ["\u4264", "\u4264"], /* CJK Ideograph Extension A */ + ["\u4265", "\u4265"], /* CJK Ideograph Extension A */ + ["\u4266", "\u4266"], /* CJK Ideograph Extension A */ + ["\u4267", "\u4267"], /* CJK Ideograph Extension A */ + ["\u4268", "\u4268"], /* CJK Ideograph Extension A */ + ["\u4269", "\u4269"], /* CJK Ideograph Extension A */ + ["\u426A", "\u426A"], /* CJK Ideograph Extension A */ + ["\u426B", "\u426B"], /* CJK Ideograph Extension A */ + ["\u426C", "\u426C"], /* CJK Ideograph Extension A */ + ["\u426D", "\u426D"], /* CJK Ideograph Extension A */ + ["\u426E", "\u426E"], /* CJK Ideograph Extension A */ + ["\u426F", "\u426F"], /* CJK Ideograph Extension A */ + ["\u4270", "\u4270"], /* CJK Ideograph Extension A */ + ["\u4271", "\u4271"], /* CJK Ideograph Extension A */ + ["\u4272", "\u4272"], /* CJK Ideograph Extension A */ + ["\u4273", "\u4273"], /* CJK Ideograph Extension A */ + ["\u4274", "\u4274"], /* CJK Ideograph Extension A */ + ["\u4275", "\u4275"], /* CJK Ideograph Extension A */ + ["\u4276", "\u4276"], /* CJK Ideograph Extension A */ + ["\u4277", "\u4277"], /* CJK Ideograph Extension A */ + ["\u4278", "\u4278"], /* CJK Ideograph Extension A */ + ["\u4279", "\u4279"], /* CJK Ideograph Extension A */ + ["\u427A", "\u427A"], /* CJK Ideograph Extension A */ + ["\u427B", "\u427B"], /* CJK Ideograph Extension A */ + ["\u427C", "\u427C"], /* CJK Ideograph Extension A */ + ["\u427D", "\u427D"], /* CJK Ideograph Extension A */ + ["\u427E", "\u427E"], /* CJK Ideograph Extension A */ + ["\u427F", "\u427F"], /* CJK Ideograph Extension A */ + ["\u4280", "\u4280"], /* CJK Ideograph Extension A */ + ["\u4281", "\u4281"], /* CJK Ideograph Extension A */ + ["\u4282", "\u4282"], /* CJK Ideograph Extension A */ + ["\u4283", "\u4283"], /* CJK Ideograph Extension A */ + ["\u4284", "\u4284"], /* CJK Ideograph Extension A */ + ["\u4285", "\u4285"], /* CJK Ideograph Extension A */ + ["\u4286", "\u4286"], /* CJK Ideograph Extension A */ + ["\u4287", "\u4287"], /* CJK Ideograph Extension A */ + ["\u4288", "\u4288"], /* CJK Ideograph Extension A */ + ["\u4289", "\u4289"], /* CJK Ideograph Extension A */ + ["\u428A", "\u428A"], /* CJK Ideograph Extension A */ + ["\u428B", "\u428B"], /* CJK Ideograph Extension A */ + ["\u428C", "\u428C"], /* CJK Ideograph Extension A */ + ["\u428D", "\u428D"], /* CJK Ideograph Extension A */ + ["\u428E", "\u428E"], /* CJK Ideograph Extension A */ + ["\u428F", "\u428F"], /* CJK Ideograph Extension A */ + ["\u4290", "\u4290"], /* CJK Ideograph Extension A */ + ["\u4291", "\u4291"], /* CJK Ideograph Extension A */ + ["\u4292", "\u4292"], /* CJK Ideograph Extension A */ + ["\u4293", "\u4293"], /* CJK Ideograph Extension A */ + ["\u4294", "\u4294"], /* CJK Ideograph Extension A */ + ["\u4295", "\u4295"], /* CJK Ideograph Extension A */ + ["\u4296", "\u4296"], /* CJK Ideograph Extension A */ + ["\u4297", "\u4297"], /* CJK Ideograph Extension A */ + ["\u4298", "\u4298"], /* CJK Ideograph Extension A */ + ["\u4299", "\u4299"], /* CJK Ideograph Extension A */ + ["\u429A", "\u429A"], /* CJK Ideograph Extension A */ + ["\u429B", "\u429B"], /* CJK Ideograph Extension A */ + ["\u429C", "\u429C"], /* CJK Ideograph Extension A */ + ["\u429D", "\u429D"], /* CJK Ideograph Extension A */ + ["\u429E", "\u429E"], /* CJK Ideograph Extension A */ + ["\u429F", "\u429F"], /* CJK Ideograph Extension A */ + ["\u42A0", "\u42A0"], /* CJK Ideograph Extension A */ + ["\u42A1", "\u42A1"], /* CJK Ideograph Extension A */ + ["\u42A2", "\u42A2"], /* CJK Ideograph Extension A */ + ["\u42A3", "\u42A3"], /* CJK Ideograph Extension A */ + ["\u42A4", "\u42A4"], /* CJK Ideograph Extension A */ + ["\u42A5", "\u42A5"], /* CJK Ideograph Extension A */ + ["\u42A6", "\u42A6"], /* CJK Ideograph Extension A */ + ["\u42A7", "\u42A7"], /* CJK Ideograph Extension A */ + ["\u42A8", "\u42A8"], /* CJK Ideograph Extension A */ + ["\u42A9", "\u42A9"], /* CJK Ideograph Extension A */ + ["\u42AA", "\u42AA"], /* CJK Ideograph Extension A */ + ["\u42AB", "\u42AB"], /* CJK Ideograph Extension A */ + ["\u42AC", "\u42AC"], /* CJK Ideograph Extension A */ + ["\u42AD", "\u42AD"], /* CJK Ideograph Extension A */ + ["\u42AE", "\u42AE"], /* CJK Ideograph Extension A */ + ["\u42AF", "\u42AF"], /* CJK Ideograph Extension A */ + ["\u42B0", "\u42B0"], /* CJK Ideograph Extension A */ + ["\u42B1", "\u42B1"], /* CJK Ideograph Extension A */ + ["\u42B2", "\u42B2"], /* CJK Ideograph Extension A */ + ["\u42B3", "\u42B3"], /* CJK Ideograph Extension A */ + ["\u42B4", "\u42B4"], /* CJK Ideograph Extension A */ + ["\u42B5", "\u42B5"], /* CJK Ideograph Extension A */ + ["\u42B6", "\u42B6"], /* CJK Ideograph Extension A */ + ["\u42B7", "\u42B7"], /* CJK Ideograph Extension A */ + ["\u42B8", "\u42B8"], /* CJK Ideograph Extension A */ + ["\u42B9", "\u42B9"], /* CJK Ideograph Extension A */ + ["\u42BA", "\u42BA"], /* CJK Ideograph Extension A */ + ["\u42BB", "\u42BB"], /* CJK Ideograph Extension A */ + ["\u42BC", "\u42BC"], /* CJK Ideograph Extension A */ + ["\u42BD", "\u42BD"], /* CJK Ideograph Extension A */ + ["\u42BE", "\u42BE"], /* CJK Ideograph Extension A */ + ["\u42BF", "\u42BF"], /* CJK Ideograph Extension A */ + ["\u42C0", "\u42C0"], /* CJK Ideograph Extension A */ + ["\u42C1", "\u42C1"], /* CJK Ideograph Extension A */ + ["\u42C2", "\u42C2"], /* CJK Ideograph Extension A */ + ["\u42C3", "\u42C3"], /* CJK Ideograph Extension A */ + ["\u42C4", "\u42C4"], /* CJK Ideograph Extension A */ + ["\u42C5", "\u42C5"], /* CJK Ideograph Extension A */ + ["\u42C6", "\u42C6"], /* CJK Ideograph Extension A */ + ["\u42C7", "\u42C7"], /* CJK Ideograph Extension A */ + ["\u42C8", "\u42C8"], /* CJK Ideograph Extension A */ + ["\u42C9", "\u42C9"], /* CJK Ideograph Extension A */ + ["\u42CA", "\u42CA"], /* CJK Ideograph Extension A */ + ["\u42CB", "\u42CB"], /* CJK Ideograph Extension A */ + ["\u42CC", "\u42CC"], /* CJK Ideograph Extension A */ + ["\u42CD", "\u42CD"], /* CJK Ideograph Extension A */ + ["\u42CE", "\u42CE"], /* CJK Ideograph Extension A */ + ["\u42CF", "\u42CF"], /* CJK Ideograph Extension A */ + ["\u42D0", "\u42D0"], /* CJK Ideograph Extension A */ + ["\u42D1", "\u42D1"], /* CJK Ideograph Extension A */ + ["\u42D2", "\u42D2"], /* CJK Ideograph Extension A */ + ["\u42D3", "\u42D3"], /* CJK Ideograph Extension A */ + ["\u42D4", "\u42D4"], /* CJK Ideograph Extension A */ + ["\u42D5", "\u42D5"], /* CJK Ideograph Extension A */ + ["\u42D6", "\u42D6"], /* CJK Ideograph Extension A */ + ["\u42D7", "\u42D7"], /* CJK Ideograph Extension A */ + ["\u42D8", "\u42D8"], /* CJK Ideograph Extension A */ + ["\u42D9", "\u42D9"], /* CJK Ideograph Extension A */ + ["\u42DA", "\u42DA"], /* CJK Ideograph Extension A */ + ["\u42DB", "\u42DB"], /* CJK Ideograph Extension A */ + ["\u42DC", "\u42DC"], /* CJK Ideograph Extension A */ + ["\u42DD", "\u42DD"], /* CJK Ideograph Extension A */ + ["\u42DE", "\u42DE"], /* CJK Ideograph Extension A */ + ["\u42DF", "\u42DF"], /* CJK Ideograph Extension A */ + ["\u42E0", "\u42E0"], /* CJK Ideograph Extension A */ + ["\u42E1", "\u42E1"], /* CJK Ideograph Extension A */ + ["\u42E2", "\u42E2"], /* CJK Ideograph Extension A */ + ["\u42E3", "\u42E3"], /* CJK Ideograph Extension A */ + ["\u42E4", "\u42E4"], /* CJK Ideograph Extension A */ + ["\u42E5", "\u42E5"], /* CJK Ideograph Extension A */ + ["\u42E6", "\u42E6"], /* CJK Ideograph Extension A */ + ["\u42E7", "\u42E7"], /* CJK Ideograph Extension A */ + ["\u42E8", "\u42E8"], /* CJK Ideograph Extension A */ + ["\u42E9", "\u42E9"], /* CJK Ideograph Extension A */ + ["\u42EA", "\u42EA"], /* CJK Ideograph Extension A */ + ["\u42EB", "\u42EB"], /* CJK Ideograph Extension A */ + ["\u42EC", "\u42EC"], /* CJK Ideograph Extension A */ + ["\u42ED", "\u42ED"], /* CJK Ideograph Extension A */ + ["\u42EE", "\u42EE"], /* CJK Ideograph Extension A */ + ["\u42EF", "\u42EF"], /* CJK Ideograph Extension A */ + ["\u42F0", "\u42F0"], /* CJK Ideograph Extension A */ + ["\u42F1", "\u42F1"], /* CJK Ideograph Extension A */ + ["\u42F2", "\u42F2"], /* CJK Ideograph Extension A */ + ["\u42F3", "\u42F3"], /* CJK Ideograph Extension A */ + ["\u42F4", "\u42F4"], /* CJK Ideograph Extension A */ + ["\u42F5", "\u42F5"], /* CJK Ideograph Extension A */ + ["\u42F6", "\u42F6"], /* CJK Ideograph Extension A */ + ["\u42F7", "\u42F7"], /* CJK Ideograph Extension A */ + ["\u42F8", "\u42F8"], /* CJK Ideograph Extension A */ + ["\u42F9", "\u42F9"], /* CJK Ideograph Extension A */ + ["\u42FA", "\u42FA"], /* CJK Ideograph Extension A */ + ["\u42FB", "\u42FB"], /* CJK Ideograph Extension A */ + ["\u42FC", "\u42FC"], /* CJK Ideograph Extension A */ + ["\u42FD", "\u42FD"], /* CJK Ideograph Extension A */ + ["\u42FE", "\u42FE"], /* CJK Ideograph Extension A */ + ["\u42FF", "\u42FF"], /* CJK Ideograph Extension A */ + ["\u4300", "\u4300"], /* CJK Ideograph Extension A */ + ["\u4301", "\u4301"], /* CJK Ideograph Extension A */ + ["\u4302", "\u4302"], /* CJK Ideograph Extension A */ + ["\u4303", "\u4303"], /* CJK Ideograph Extension A */ + ["\u4304", "\u4304"], /* CJK Ideograph Extension A */ + ["\u4305", "\u4305"], /* CJK Ideograph Extension A */ + ["\u4306", "\u4306"], /* CJK Ideograph Extension A */ + ["\u4307", "\u4307"], /* CJK Ideograph Extension A */ + ["\u4308", "\u4308"], /* CJK Ideograph Extension A */ + ["\u4309", "\u4309"], /* CJK Ideograph Extension A */ + ["\u430A", "\u430A"], /* CJK Ideograph Extension A */ + ["\u430B", "\u430B"], /* CJK Ideograph Extension A */ + ["\u430C", "\u430C"], /* CJK Ideograph Extension A */ + ["\u430D", "\u430D"], /* CJK Ideograph Extension A */ + ["\u430E", "\u430E"], /* CJK Ideograph Extension A */ + ["\u430F", "\u430F"], /* CJK Ideograph Extension A */ + ["\u4310", "\u4310"], /* CJK Ideograph Extension A */ + ["\u4311", "\u4311"], /* CJK Ideograph Extension A */ + ["\u4312", "\u4312"], /* CJK Ideograph Extension A */ + ["\u4313", "\u4313"], /* CJK Ideograph Extension A */ + ["\u4314", "\u4314"], /* CJK Ideograph Extension A */ + ["\u4315", "\u4315"], /* CJK Ideograph Extension A */ + ["\u4316", "\u4316"], /* CJK Ideograph Extension A */ + ["\u4317", "\u4317"], /* CJK Ideograph Extension A */ + ["\u4318", "\u4318"], /* CJK Ideograph Extension A */ + ["\u4319", "\u4319"], /* CJK Ideograph Extension A */ + ["\u431A", "\u431A"], /* CJK Ideograph Extension A */ + ["\u431B", "\u431B"], /* CJK Ideograph Extension A */ + ["\u431C", "\u431C"], /* CJK Ideograph Extension A */ + ["\u431D", "\u431D"], /* CJK Ideograph Extension A */ + ["\u431E", "\u431E"], /* CJK Ideograph Extension A */ + ["\u431F", "\u431F"], /* CJK Ideograph Extension A */ + ["\u4320", "\u4320"], /* CJK Ideograph Extension A */ + ["\u4321", "\u4321"], /* CJK Ideograph Extension A */ + ["\u4322", "\u4322"], /* CJK Ideograph Extension A */ + ["\u4323", "\u4323"], /* CJK Ideograph Extension A */ + ["\u4324", "\u4324"], /* CJK Ideograph Extension A */ + ["\u4325", "\u4325"], /* CJK Ideograph Extension A */ + ["\u4326", "\u4326"], /* CJK Ideograph Extension A */ + ["\u4327", "\u4327"], /* CJK Ideograph Extension A */ + ["\u4328", "\u4328"], /* CJK Ideograph Extension A */ + ["\u4329", "\u4329"], /* CJK Ideograph Extension A */ + ["\u432A", "\u432A"], /* CJK Ideograph Extension A */ + ["\u432B", "\u432B"], /* CJK Ideograph Extension A */ + ["\u432C", "\u432C"], /* CJK Ideograph Extension A */ + ["\u432D", "\u432D"], /* CJK Ideograph Extension A */ + ["\u432E", "\u432E"], /* CJK Ideograph Extension A */ + ["\u432F", "\u432F"], /* CJK Ideograph Extension A */ + ["\u4330", "\u4330"], /* CJK Ideograph Extension A */ + ["\u4331", "\u4331"], /* CJK Ideograph Extension A */ + ["\u4332", "\u4332"], /* CJK Ideograph Extension A */ + ["\u4333", "\u4333"], /* CJK Ideograph Extension A */ + ["\u4334", "\u4334"], /* CJK Ideograph Extension A */ + ["\u4335", "\u4335"], /* CJK Ideograph Extension A */ + ["\u4336", "\u4336"], /* CJK Ideograph Extension A */ + ["\u4337", "\u4337"], /* CJK Ideograph Extension A */ + ["\u4338", "\u4338"], /* CJK Ideograph Extension A */ + ["\u4339", "\u4339"], /* CJK Ideograph Extension A */ + ["\u433A", "\u433A"], /* CJK Ideograph Extension A */ + ["\u433B", "\u433B"], /* CJK Ideograph Extension A */ + ["\u433C", "\u433C"], /* CJK Ideograph Extension A */ + ["\u433D", "\u433D"], /* CJK Ideograph Extension A */ + ["\u433E", "\u433E"], /* CJK Ideograph Extension A */ + ["\u433F", "\u433F"], /* CJK Ideograph Extension A */ + ["\u4340", "\u4340"], /* CJK Ideograph Extension A */ + ["\u4341", "\u4341"], /* CJK Ideograph Extension A */ + ["\u4342", "\u4342"], /* CJK Ideograph Extension A */ + ["\u4343", "\u4343"], /* CJK Ideograph Extension A */ + ["\u4344", "\u4344"], /* CJK Ideograph Extension A */ + ["\u4345", "\u4345"], /* CJK Ideograph Extension A */ + ["\u4346", "\u4346"], /* CJK Ideograph Extension A */ + ["\u4347", "\u4347"], /* CJK Ideograph Extension A */ + ["\u4348", "\u4348"], /* CJK Ideograph Extension A */ + ["\u4349", "\u4349"], /* CJK Ideograph Extension A */ + ["\u434A", "\u434A"], /* CJK Ideograph Extension A */ + ["\u434B", "\u434B"], /* CJK Ideograph Extension A */ + ["\u434C", "\u434C"], /* CJK Ideograph Extension A */ + ["\u434D", "\u434D"], /* CJK Ideograph Extension A */ + ["\u434E", "\u434E"], /* CJK Ideograph Extension A */ + ["\u434F", "\u434F"], /* CJK Ideograph Extension A */ + ["\u4350", "\u4350"], /* CJK Ideograph Extension A */ + ["\u4351", "\u4351"], /* CJK Ideograph Extension A */ + ["\u4352", "\u4352"], /* CJK Ideograph Extension A */ + ["\u4353", "\u4353"], /* CJK Ideograph Extension A */ + ["\u4354", "\u4354"], /* CJK Ideograph Extension A */ + ["\u4355", "\u4355"], /* CJK Ideograph Extension A */ + ["\u4356", "\u4356"], /* CJK Ideograph Extension A */ + ["\u4357", "\u4357"], /* CJK Ideograph Extension A */ + ["\u4358", "\u4358"], /* CJK Ideograph Extension A */ + ["\u4359", "\u4359"], /* CJK Ideograph Extension A */ + ["\u435A", "\u435A"], /* CJK Ideograph Extension A */ + ["\u435B", "\u435B"], /* CJK Ideograph Extension A */ + ["\u435C", "\u435C"], /* CJK Ideograph Extension A */ + ["\u435D", "\u435D"], /* CJK Ideograph Extension A */ + ["\u435E", "\u435E"], /* CJK Ideograph Extension A */ + ["\u435F", "\u435F"], /* CJK Ideograph Extension A */ + ["\u4360", "\u4360"], /* CJK Ideograph Extension A */ + ["\u4361", "\u4361"], /* CJK Ideograph Extension A */ + ["\u4362", "\u4362"], /* CJK Ideograph Extension A */ + ["\u4363", "\u4363"], /* CJK Ideograph Extension A */ + ["\u4364", "\u4364"], /* CJK Ideograph Extension A */ + ["\u4365", "\u4365"], /* CJK Ideograph Extension A */ + ["\u4366", "\u4366"], /* CJK Ideograph Extension A */ + ["\u4367", "\u4367"], /* CJK Ideograph Extension A */ + ["\u4368", "\u4368"], /* CJK Ideograph Extension A */ + ["\u4369", "\u4369"], /* CJK Ideograph Extension A */ + ["\u436A", "\u436A"], /* CJK Ideograph Extension A */ + ["\u436B", "\u436B"], /* CJK Ideograph Extension A */ + ["\u436C", "\u436C"], /* CJK Ideograph Extension A */ + ["\u436D", "\u436D"], /* CJK Ideograph Extension A */ + ["\u436E", "\u436E"], /* CJK Ideograph Extension A */ + ["\u436F", "\u436F"], /* CJK Ideograph Extension A */ + ["\u4370", "\u4370"], /* CJK Ideograph Extension A */ + ["\u4371", "\u4371"], /* CJK Ideograph Extension A */ + ["\u4372", "\u4372"], /* CJK Ideograph Extension A */ + ["\u4373", "\u4373"], /* CJK Ideograph Extension A */ + ["\u4374", "\u4374"], /* CJK Ideograph Extension A */ + ["\u4375", "\u4375"], /* CJK Ideograph Extension A */ + ["\u4376", "\u4376"], /* CJK Ideograph Extension A */ + ["\u4377", "\u4377"], /* CJK Ideograph Extension A */ + ["\u4378", "\u4378"], /* CJK Ideograph Extension A */ + ["\u4379", "\u4379"], /* CJK Ideograph Extension A */ + ["\u437A", "\u437A"], /* CJK Ideograph Extension A */ + ["\u437B", "\u437B"], /* CJK Ideograph Extension A */ + ["\u437C", "\u437C"], /* CJK Ideograph Extension A */ + ["\u437D", "\u437D"], /* CJK Ideograph Extension A */ + ["\u437E", "\u437E"], /* CJK Ideograph Extension A */ + ["\u437F", "\u437F"], /* CJK Ideograph Extension A */ + ["\u4380", "\u4380"], /* CJK Ideograph Extension A */ + ["\u4381", "\u4381"], /* CJK Ideograph Extension A */ + ["\u4382", "\u4382"], /* CJK Ideograph Extension A */ + ["\u4383", "\u4383"], /* CJK Ideograph Extension A */ + ["\u4384", "\u4384"], /* CJK Ideograph Extension A */ + ["\u4385", "\u4385"], /* CJK Ideograph Extension A */ + ["\u4386", "\u4386"], /* CJK Ideograph Extension A */ + ["\u4387", "\u4387"], /* CJK Ideograph Extension A */ + ["\u4388", "\u4388"], /* CJK Ideograph Extension A */ + ["\u4389", "\u4389"], /* CJK Ideograph Extension A */ + ["\u438A", "\u438A"], /* CJK Ideograph Extension A */ + ["\u438B", "\u438B"], /* CJK Ideograph Extension A */ + ["\u438C", "\u438C"], /* CJK Ideograph Extension A */ + ["\u438D", "\u438D"], /* CJK Ideograph Extension A */ + ["\u438E", "\u438E"], /* CJK Ideograph Extension A */ + ["\u438F", "\u438F"], /* CJK Ideograph Extension A */ + ["\u4390", "\u4390"], /* CJK Ideograph Extension A */ + ["\u4391", "\u4391"], /* CJK Ideograph Extension A */ + ["\u4392", "\u4392"], /* CJK Ideograph Extension A */ + ["\u4393", "\u4393"], /* CJK Ideograph Extension A */ + ["\u4394", "\u4394"], /* CJK Ideograph Extension A */ + ["\u4395", "\u4395"], /* CJK Ideograph Extension A */ + ["\u4396", "\u4396"], /* CJK Ideograph Extension A */ + ["\u4397", "\u4397"], /* CJK Ideograph Extension A */ + ["\u4398", "\u4398"], /* CJK Ideograph Extension A */ + ["\u4399", "\u4399"], /* CJK Ideograph Extension A */ + ["\u439A", "\u439A"], /* CJK Ideograph Extension A */ + ["\u439B", "\u439B"], /* CJK Ideograph Extension A */ + ["\u439C", "\u439C"], /* CJK Ideograph Extension A */ + ["\u439D", "\u439D"], /* CJK Ideograph Extension A */ + ["\u439E", "\u439E"], /* CJK Ideograph Extension A */ + ["\u439F", "\u439F"], /* CJK Ideograph Extension A */ + ["\u43A0", "\u43A0"], /* CJK Ideograph Extension A */ + ["\u43A1", "\u43A1"], /* CJK Ideograph Extension A */ + ["\u43A2", "\u43A2"], /* CJK Ideograph Extension A */ + ["\u43A3", "\u43A3"], /* CJK Ideograph Extension A */ + ["\u43A4", "\u43A4"], /* CJK Ideograph Extension A */ + ["\u43A5", "\u43A5"], /* CJK Ideograph Extension A */ + ["\u43A6", "\u43A6"], /* CJK Ideograph Extension A */ + ["\u43A7", "\u43A7"], /* CJK Ideograph Extension A */ + ["\u43A8", "\u43A8"], /* CJK Ideograph Extension A */ + ["\u43A9", "\u43A9"], /* CJK Ideograph Extension A */ + ["\u43AA", "\u43AA"], /* CJK Ideograph Extension A */ + ["\u43AB", "\u43AB"], /* CJK Ideograph Extension A */ + ["\u43AC", "\u43AC"], /* CJK Ideograph Extension A */ + ["\u43AD", "\u43AD"], /* CJK Ideograph Extension A */ + ["\u43AE", "\u43AE"], /* CJK Ideograph Extension A */ + ["\u43AF", "\u43AF"], /* CJK Ideograph Extension A */ + ["\u43B0", "\u43B0"], /* CJK Ideograph Extension A */ + ["\u43B1", "\u43B1"], /* CJK Ideograph Extension A */ + ["\u43B2", "\u43B2"], /* CJK Ideograph Extension A */ + ["\u43B3", "\u43B3"], /* CJK Ideograph Extension A */ + ["\u43B4", "\u43B4"], /* CJK Ideograph Extension A */ + ["\u43B5", "\u43B5"], /* CJK Ideograph Extension A */ + ["\u43B6", "\u43B6"], /* CJK Ideograph Extension A */ + ["\u43B7", "\u43B7"], /* CJK Ideograph Extension A */ + ["\u43B8", "\u43B8"], /* CJK Ideograph Extension A */ + ["\u43B9", "\u43B9"], /* CJK Ideograph Extension A */ + ["\u43BA", "\u43BA"], /* CJK Ideograph Extension A */ + ["\u43BB", "\u43BB"], /* CJK Ideograph Extension A */ + ["\u43BC", "\u43BC"], /* CJK Ideograph Extension A */ + ["\u43BD", "\u43BD"], /* CJK Ideograph Extension A */ + ["\u43BE", "\u43BE"], /* CJK Ideograph Extension A */ + ["\u43BF", "\u43BF"], /* CJK Ideograph Extension A */ + ["\u43C0", "\u43C0"], /* CJK Ideograph Extension A */ + ["\u43C1", "\u43C1"], /* CJK Ideograph Extension A */ + ["\u43C2", "\u43C2"], /* CJK Ideograph Extension A */ + ["\u43C3", "\u43C3"], /* CJK Ideograph Extension A */ + ["\u43C4", "\u43C4"], /* CJK Ideograph Extension A */ + ["\u43C5", "\u43C5"], /* CJK Ideograph Extension A */ + ["\u43C6", "\u43C6"], /* CJK Ideograph Extension A */ + ["\u43C7", "\u43C7"], /* CJK Ideograph Extension A */ + ["\u43C8", "\u43C8"], /* CJK Ideograph Extension A */ + ["\u43C9", "\u43C9"], /* CJK Ideograph Extension A */ + ["\u43CA", "\u43CA"], /* CJK Ideograph Extension A */ + ["\u43CB", "\u43CB"], /* CJK Ideograph Extension A */ + ["\u43CC", "\u43CC"], /* CJK Ideograph Extension A */ + ["\u43CD", "\u43CD"], /* CJK Ideograph Extension A */ + ["\u43CE", "\u43CE"], /* CJK Ideograph Extension A */ + ["\u43CF", "\u43CF"], /* CJK Ideograph Extension A */ + ["\u43D0", "\u43D0"], /* CJK Ideograph Extension A */ + ["\u43D1", "\u43D1"], /* CJK Ideograph Extension A */ + ["\u43D2", "\u43D2"], /* CJK Ideograph Extension A */ + ["\u43D3", "\u43D3"], /* CJK Ideograph Extension A */ + ["\u43D4", "\u43D4"], /* CJK Ideograph Extension A */ + ["\u43D5", "\u43D5"], /* CJK Ideograph Extension A */ + ["\u43D6", "\u43D6"], /* CJK Ideograph Extension A */ + ["\u43D7", "\u43D7"], /* CJK Ideograph Extension A */ + ["\u43D8", "\u43D8"], /* CJK Ideograph Extension A */ + ["\u43D9", "\u43D9"], /* CJK Ideograph Extension A */ + ["\u43DA", "\u43DA"], /* CJK Ideograph Extension A */ + ["\u43DB", "\u43DB"], /* CJK Ideograph Extension A */ + ["\u43DC", "\u43DC"], /* CJK Ideograph Extension A */ + ["\u43DD", "\u43DD"], /* CJK Ideograph Extension A */ + ["\u43DE", "\u43DE"], /* CJK Ideograph Extension A */ + ["\u43DF", "\u43DF"], /* CJK Ideograph Extension A */ + ["\u43E0", "\u43E0"], /* CJK Ideograph Extension A */ + ["\u43E1", "\u43E1"], /* CJK Ideograph Extension A */ + ["\u43E2", "\u43E2"], /* CJK Ideograph Extension A */ + ["\u43E3", "\u43E3"], /* CJK Ideograph Extension A */ + ["\u43E4", "\u43E4"], /* CJK Ideograph Extension A */ + ["\u43E5", "\u43E5"], /* CJK Ideograph Extension A */ + ["\u43E6", "\u43E6"], /* CJK Ideograph Extension A */ + ["\u43E7", "\u43E7"], /* CJK Ideograph Extension A */ + ["\u43E8", "\u43E8"], /* CJK Ideograph Extension A */ + ["\u43E9", "\u43E9"], /* CJK Ideograph Extension A */ + ["\u43EA", "\u43EA"], /* CJK Ideograph Extension A */ + ["\u43EB", "\u43EB"], /* CJK Ideograph Extension A */ + ["\u43EC", "\u43EC"], /* CJK Ideograph Extension A */ + ["\u43ED", "\u43ED"], /* CJK Ideograph Extension A */ + ["\u43EE", "\u43EE"], /* CJK Ideograph Extension A */ + ["\u43EF", "\u43EF"], /* CJK Ideograph Extension A */ + ["\u43F0", "\u43F0"], /* CJK Ideograph Extension A */ + ["\u43F1", "\u43F1"], /* CJK Ideograph Extension A */ + ["\u43F2", "\u43F2"], /* CJK Ideograph Extension A */ + ["\u43F3", "\u43F3"], /* CJK Ideograph Extension A */ + ["\u43F4", "\u43F4"], /* CJK Ideograph Extension A */ + ["\u43F5", "\u43F5"], /* CJK Ideograph Extension A */ + ["\u43F6", "\u43F6"], /* CJK Ideograph Extension A */ + ["\u43F7", "\u43F7"], /* CJK Ideograph Extension A */ + ["\u43F8", "\u43F8"], /* CJK Ideograph Extension A */ + ["\u43F9", "\u43F9"], /* CJK Ideograph Extension A */ + ["\u43FA", "\u43FA"], /* CJK Ideograph Extension A */ + ["\u43FB", "\u43FB"], /* CJK Ideograph Extension A */ + ["\u43FC", "\u43FC"], /* CJK Ideograph Extension A */ + ["\u43FD", "\u43FD"], /* CJK Ideograph Extension A */ + ["\u43FE", "\u43FE"], /* CJK Ideograph Extension A */ + ["\u43FF", "\u43FF"], /* CJK Ideograph Extension A */ + ["\u4400", "\u4400"], /* CJK Ideograph Extension A */ + ["\u4401", "\u4401"], /* CJK Ideograph Extension A */ + ["\u4402", "\u4402"], /* CJK Ideograph Extension A */ + ["\u4403", "\u4403"], /* CJK Ideograph Extension A */ + ["\u4404", "\u4404"], /* CJK Ideograph Extension A */ + ["\u4405", "\u4405"], /* CJK Ideograph Extension A */ + ["\u4406", "\u4406"], /* CJK Ideograph Extension A */ + ["\u4407", "\u4407"], /* CJK Ideograph Extension A */ + ["\u4408", "\u4408"], /* CJK Ideograph Extension A */ + ["\u4409", "\u4409"], /* CJK Ideograph Extension A */ + ["\u440A", "\u440A"], /* CJK Ideograph Extension A */ + ["\u440B", "\u440B"], /* CJK Ideograph Extension A */ + ["\u440C", "\u440C"], /* CJK Ideograph Extension A */ + ["\u440D", "\u440D"], /* CJK Ideograph Extension A */ + ["\u440E", "\u440E"], /* CJK Ideograph Extension A */ + ["\u440F", "\u440F"], /* CJK Ideograph Extension A */ + ["\u4410", "\u4410"], /* CJK Ideograph Extension A */ + ["\u4411", "\u4411"], /* CJK Ideograph Extension A */ + ["\u4412", "\u4412"], /* CJK Ideograph Extension A */ + ["\u4413", "\u4413"], /* CJK Ideograph Extension A */ + ["\u4414", "\u4414"], /* CJK Ideograph Extension A */ + ["\u4415", "\u4415"], /* CJK Ideograph Extension A */ + ["\u4416", "\u4416"], /* CJK Ideograph Extension A */ + ["\u4417", "\u4417"], /* CJK Ideograph Extension A */ + ["\u4418", "\u4418"], /* CJK Ideograph Extension A */ + ["\u4419", "\u4419"], /* CJK Ideograph Extension A */ + ["\u441A", "\u441A"], /* CJK Ideograph Extension A */ + ["\u441B", "\u441B"], /* CJK Ideograph Extension A */ + ["\u441C", "\u441C"], /* CJK Ideograph Extension A */ + ["\u441D", "\u441D"], /* CJK Ideograph Extension A */ + ["\u441E", "\u441E"], /* CJK Ideograph Extension A */ + ["\u441F", "\u441F"], /* CJK Ideograph Extension A */ + ["\u4420", "\u4420"], /* CJK Ideograph Extension A */ + ["\u4421", "\u4421"], /* CJK Ideograph Extension A */ + ["\u4422", "\u4422"], /* CJK Ideograph Extension A */ + ["\u4423", "\u4423"], /* CJK Ideograph Extension A */ + ["\u4424", "\u4424"], /* CJK Ideograph Extension A */ + ["\u4425", "\u4425"], /* CJK Ideograph Extension A */ + ["\u4426", "\u4426"], /* CJK Ideograph Extension A */ + ["\u4427", "\u4427"], /* CJK Ideograph Extension A */ + ["\u4428", "\u4428"], /* CJK Ideograph Extension A */ + ["\u4429", "\u4429"], /* CJK Ideograph Extension A */ + ["\u442A", "\u442A"], /* CJK Ideograph Extension A */ + ["\u442B", "\u442B"], /* CJK Ideograph Extension A */ + ["\u442C", "\u442C"], /* CJK Ideograph Extension A */ + ["\u442D", "\u442D"], /* CJK Ideograph Extension A */ + ["\u442E", "\u442E"], /* CJK Ideograph Extension A */ + ["\u442F", "\u442F"], /* CJK Ideograph Extension A */ + ["\u4430", "\u4430"], /* CJK Ideograph Extension A */ + ["\u4431", "\u4431"], /* CJK Ideograph Extension A */ + ["\u4432", "\u4432"], /* CJK Ideograph Extension A */ + ["\u4433", "\u4433"], /* CJK Ideograph Extension A */ + ["\u4434", "\u4434"], /* CJK Ideograph Extension A */ + ["\u4435", "\u4435"], /* CJK Ideograph Extension A */ + ["\u4436", "\u4436"], /* CJK Ideograph Extension A */ + ["\u4437", "\u4437"], /* CJK Ideograph Extension A */ + ["\u4438", "\u4438"], /* CJK Ideograph Extension A */ + ["\u4439", "\u4439"], /* CJK Ideograph Extension A */ + ["\u443A", "\u443A"], /* CJK Ideograph Extension A */ + ["\u443B", "\u443B"], /* CJK Ideograph Extension A */ + ["\u443C", "\u443C"], /* CJK Ideograph Extension A */ + ["\u443D", "\u443D"], /* CJK Ideograph Extension A */ + ["\u443E", "\u443E"], /* CJK Ideograph Extension A */ + ["\u443F", "\u443F"], /* CJK Ideograph Extension A */ + ["\u4440", "\u4440"], /* CJK Ideograph Extension A */ + ["\u4441", "\u4441"], /* CJK Ideograph Extension A */ + ["\u4442", "\u4442"], /* CJK Ideograph Extension A */ + ["\u4443", "\u4443"], /* CJK Ideograph Extension A */ + ["\u4444", "\u4444"], /* CJK Ideograph Extension A */ + ["\u4445", "\u4445"], /* CJK Ideograph Extension A */ + ["\u4446", "\u4446"], /* CJK Ideograph Extension A */ + ["\u4447", "\u4447"], /* CJK Ideograph Extension A */ + ["\u4448", "\u4448"], /* CJK Ideograph Extension A */ + ["\u4449", "\u4449"], /* CJK Ideograph Extension A */ + ["\u444A", "\u444A"], /* CJK Ideograph Extension A */ + ["\u444B", "\u444B"], /* CJK Ideograph Extension A */ + ["\u444C", "\u444C"], /* CJK Ideograph Extension A */ + ["\u444D", "\u444D"], /* CJK Ideograph Extension A */ + ["\u444E", "\u444E"], /* CJK Ideograph Extension A */ + ["\u444F", "\u444F"], /* CJK Ideograph Extension A */ + ["\u4450", "\u4450"], /* CJK Ideograph Extension A */ + ["\u4451", "\u4451"], /* CJK Ideograph Extension A */ + ["\u4452", "\u4452"], /* CJK Ideograph Extension A */ + ["\u4453", "\u4453"], /* CJK Ideograph Extension A */ + ["\u4454", "\u4454"], /* CJK Ideograph Extension A */ + ["\u4455", "\u4455"], /* CJK Ideograph Extension A */ + ["\u4456", "\u4456"], /* CJK Ideograph Extension A */ + ["\u4457", "\u4457"], /* CJK Ideograph Extension A */ + ["\u4458", "\u4458"], /* CJK Ideograph Extension A */ + ["\u4459", "\u4459"], /* CJK Ideograph Extension A */ + ["\u445A", "\u445A"], /* CJK Ideograph Extension A */ + ["\u445B", "\u445B"], /* CJK Ideograph Extension A */ + ["\u445C", "\u445C"], /* CJK Ideograph Extension A */ + ["\u445D", "\u445D"], /* CJK Ideograph Extension A */ + ["\u445E", "\u445E"], /* CJK Ideograph Extension A */ + ["\u445F", "\u445F"], /* CJK Ideograph Extension A */ + ["\u4460", "\u4460"], /* CJK Ideograph Extension A */ + ["\u4461", "\u4461"], /* CJK Ideograph Extension A */ + ["\u4462", "\u4462"], /* CJK Ideograph Extension A */ + ["\u4463", "\u4463"], /* CJK Ideograph Extension A */ + ["\u4464", "\u4464"], /* CJK Ideograph Extension A */ + ["\u4465", "\u4465"], /* CJK Ideograph Extension A */ + ["\u4466", "\u4466"], /* CJK Ideograph Extension A */ + ["\u4467", "\u4467"], /* CJK Ideograph Extension A */ + ["\u4468", "\u4468"], /* CJK Ideograph Extension A */ + ["\u4469", "\u4469"], /* CJK Ideograph Extension A */ + ["\u446A", "\u446A"], /* CJK Ideograph Extension A */ + ["\u446B", "\u446B"], /* CJK Ideograph Extension A */ + ["\u446C", "\u446C"], /* CJK Ideograph Extension A */ + ["\u446D", "\u446D"], /* CJK Ideograph Extension A */ + ["\u446E", "\u446E"], /* CJK Ideograph Extension A */ + ["\u446F", "\u446F"], /* CJK Ideograph Extension A */ + ["\u4470", "\u4470"], /* CJK Ideograph Extension A */ + ["\u4471", "\u4471"], /* CJK Ideograph Extension A */ + ["\u4472", "\u4472"], /* CJK Ideograph Extension A */ + ["\u4473", "\u4473"], /* CJK Ideograph Extension A */ + ["\u4474", "\u4474"], /* CJK Ideograph Extension A */ + ["\u4475", "\u4475"], /* CJK Ideograph Extension A */ + ["\u4476", "\u4476"], /* CJK Ideograph Extension A */ + ["\u4477", "\u4477"], /* CJK Ideograph Extension A */ + ["\u4478", "\u4478"], /* CJK Ideograph Extension A */ + ["\u4479", "\u4479"], /* CJK Ideograph Extension A */ + ["\u447A", "\u447A"], /* CJK Ideograph Extension A */ + ["\u447B", "\u447B"], /* CJK Ideograph Extension A */ + ["\u447C", "\u447C"], /* CJK Ideograph Extension A */ + ["\u447D", "\u447D"], /* CJK Ideograph Extension A */ + ["\u447E", "\u447E"], /* CJK Ideograph Extension A */ + ["\u447F", "\u447F"], /* CJK Ideograph Extension A */ + ["\u4480", "\u4480"], /* CJK Ideograph Extension A */ + ["\u4481", "\u4481"], /* CJK Ideograph Extension A */ + ["\u4482", "\u4482"], /* CJK Ideograph Extension A */ + ["\u4483", "\u4483"], /* CJK Ideograph Extension A */ + ["\u4484", "\u4484"], /* CJK Ideograph Extension A */ + ["\u4485", "\u4485"], /* CJK Ideograph Extension A */ + ["\u4486", "\u4486"], /* CJK Ideograph Extension A */ + ["\u4487", "\u4487"], /* CJK Ideograph Extension A */ + ["\u4488", "\u4488"], /* CJK Ideograph Extension A */ + ["\u4489", "\u4489"], /* CJK Ideograph Extension A */ + ["\u448A", "\u448A"], /* CJK Ideograph Extension A */ + ["\u448B", "\u448B"], /* CJK Ideograph Extension A */ + ["\u448C", "\u448C"], /* CJK Ideograph Extension A */ + ["\u448D", "\u448D"], /* CJK Ideograph Extension A */ + ["\u448E", "\u448E"], /* CJK Ideograph Extension A */ + ["\u448F", "\u448F"], /* CJK Ideograph Extension A */ + ["\u4490", "\u4490"], /* CJK Ideograph Extension A */ + ["\u4491", "\u4491"], /* CJK Ideograph Extension A */ + ["\u4492", "\u4492"], /* CJK Ideograph Extension A */ + ["\u4493", "\u4493"], /* CJK Ideograph Extension A */ + ["\u4494", "\u4494"], /* CJK Ideograph Extension A */ + ["\u4495", "\u4495"], /* CJK Ideograph Extension A */ + ["\u4496", "\u4496"], /* CJK Ideograph Extension A */ + ["\u4497", "\u4497"], /* CJK Ideograph Extension A */ + ["\u4498", "\u4498"], /* CJK Ideograph Extension A */ + ["\u4499", "\u4499"], /* CJK Ideograph Extension A */ + ["\u449A", "\u449A"], /* CJK Ideograph Extension A */ + ["\u449B", "\u449B"], /* CJK Ideograph Extension A */ + ["\u449C", "\u449C"], /* CJK Ideograph Extension A */ + ["\u449D", "\u449D"], /* CJK Ideograph Extension A */ + ["\u449E", "\u449E"], /* CJK Ideograph Extension A */ + ["\u449F", "\u449F"], /* CJK Ideograph Extension A */ + ["\u44A0", "\u44A0"], /* CJK Ideograph Extension A */ + ["\u44A1", "\u44A1"], /* CJK Ideograph Extension A */ + ["\u44A2", "\u44A2"], /* CJK Ideograph Extension A */ + ["\u44A3", "\u44A3"], /* CJK Ideograph Extension A */ + ["\u44A4", "\u44A4"], /* CJK Ideograph Extension A */ + ["\u44A5", "\u44A5"], /* CJK Ideograph Extension A */ + ["\u44A6", "\u44A6"], /* CJK Ideograph Extension A */ + ["\u44A7", "\u44A7"], /* CJK Ideograph Extension A */ + ["\u44A8", "\u44A8"], /* CJK Ideograph Extension A */ + ["\u44A9", "\u44A9"], /* CJK Ideograph Extension A */ + ["\u44AA", "\u44AA"], /* CJK Ideograph Extension A */ + ["\u44AB", "\u44AB"], /* CJK Ideograph Extension A */ + ["\u44AC", "\u44AC"], /* CJK Ideograph Extension A */ + ["\u44AD", "\u44AD"], /* CJK Ideograph Extension A */ + ["\u44AE", "\u44AE"], /* CJK Ideograph Extension A */ + ["\u44AF", "\u44AF"], /* CJK Ideograph Extension A */ + ["\u44B0", "\u44B0"], /* CJK Ideograph Extension A */ + ["\u44B1", "\u44B1"], /* CJK Ideograph Extension A */ + ["\u44B2", "\u44B2"], /* CJK Ideograph Extension A */ + ["\u44B3", "\u44B3"], /* CJK Ideograph Extension A */ + ["\u44B4", "\u44B4"], /* CJK Ideograph Extension A */ + ["\u44B5", "\u44B5"], /* CJK Ideograph Extension A */ + ["\u44B6", "\u44B6"], /* CJK Ideograph Extension A */ + ["\u44B7", "\u44B7"], /* CJK Ideograph Extension A */ + ["\u44B8", "\u44B8"], /* CJK Ideograph Extension A */ + ["\u44B9", "\u44B9"], /* CJK Ideograph Extension A */ + ["\u44BA", "\u44BA"], /* CJK Ideograph Extension A */ + ["\u44BB", "\u44BB"], /* CJK Ideograph Extension A */ + ["\u44BC", "\u44BC"], /* CJK Ideograph Extension A */ + ["\u44BD", "\u44BD"], /* CJK Ideograph Extension A */ + ["\u44BE", "\u44BE"], /* CJK Ideograph Extension A */ + ["\u44BF", "\u44BF"], /* CJK Ideograph Extension A */ + ["\u44C0", "\u44C0"], /* CJK Ideograph Extension A */ + ["\u44C1", "\u44C1"], /* CJK Ideograph Extension A */ + ["\u44C2", "\u44C2"], /* CJK Ideograph Extension A */ + ["\u44C3", "\u44C3"], /* CJK Ideograph Extension A */ + ["\u44C4", "\u44C4"], /* CJK Ideograph Extension A */ + ["\u44C5", "\u44C5"], /* CJK Ideograph Extension A */ + ["\u44C6", "\u44C6"], /* CJK Ideograph Extension A */ + ["\u44C7", "\u44C7"], /* CJK Ideograph Extension A */ + ["\u44C8", "\u44C8"], /* CJK Ideograph Extension A */ + ["\u44C9", "\u44C9"], /* CJK Ideograph Extension A */ + ["\u44CA", "\u44CA"], /* CJK Ideograph Extension A */ + ["\u44CB", "\u44CB"], /* CJK Ideograph Extension A */ + ["\u44CC", "\u44CC"], /* CJK Ideograph Extension A */ + ["\u44CD", "\u44CD"], /* CJK Ideograph Extension A */ + ["\u44CE", "\u44CE"], /* CJK Ideograph Extension A */ + ["\u44CF", "\u44CF"], /* CJK Ideograph Extension A */ + ["\u44D0", "\u44D0"], /* CJK Ideograph Extension A */ + ["\u44D1", "\u44D1"], /* CJK Ideograph Extension A */ + ["\u44D2", "\u44D2"], /* CJK Ideograph Extension A */ + ["\u44D3", "\u44D3"], /* CJK Ideograph Extension A */ + ["\u44D4", "\u44D4"], /* CJK Ideograph Extension A */ + ["\u44D5", "\u44D5"], /* CJK Ideograph Extension A */ + ["\u44D6", "\u44D6"], /* CJK Ideograph Extension A */ + ["\u44D7", "\u44D7"], /* CJK Ideograph Extension A */ + ["\u44D8", "\u44D8"], /* CJK Ideograph Extension A */ + ["\u44D9", "\u44D9"], /* CJK Ideograph Extension A */ + ["\u44DA", "\u44DA"], /* CJK Ideograph Extension A */ + ["\u44DB", "\u44DB"], /* CJK Ideograph Extension A */ + ["\u44DC", "\u44DC"], /* CJK Ideograph Extension A */ + ["\u44DD", "\u44DD"], /* CJK Ideograph Extension A */ + ["\u44DE", "\u44DE"], /* CJK Ideograph Extension A */ + ["\u44DF", "\u44DF"], /* CJK Ideograph Extension A */ + ["\u44E0", "\u44E0"], /* CJK Ideograph Extension A */ + ["\u44E1", "\u44E1"], /* CJK Ideograph Extension A */ + ["\u44E2", "\u44E2"], /* CJK Ideograph Extension A */ + ["\u44E3", "\u44E3"], /* CJK Ideograph Extension A */ + ["\u44E4", "\u44E4"], /* CJK Ideograph Extension A */ + ["\u44E5", "\u44E5"], /* CJK Ideograph Extension A */ + ["\u44E6", "\u44E6"], /* CJK Ideograph Extension A */ + ["\u44E7", "\u44E7"], /* CJK Ideograph Extension A */ + ["\u44E8", "\u44E8"], /* CJK Ideograph Extension A */ + ["\u44E9", "\u44E9"], /* CJK Ideograph Extension A */ + ["\u44EA", "\u44EA"], /* CJK Ideograph Extension A */ + ["\u44EB", "\u44EB"], /* CJK Ideograph Extension A */ + ["\u44EC", "\u44EC"], /* CJK Ideograph Extension A */ + ["\u44ED", "\u44ED"], /* CJK Ideograph Extension A */ + ["\u44EE", "\u44EE"], /* CJK Ideograph Extension A */ + ["\u44EF", "\u44EF"], /* CJK Ideograph Extension A */ + ["\u44F0", "\u44F0"], /* CJK Ideograph Extension A */ + ["\u44F1", "\u44F1"], /* CJK Ideograph Extension A */ + ["\u44F2", "\u44F2"], /* CJK Ideograph Extension A */ + ["\u44F3", "\u44F3"], /* CJK Ideograph Extension A */ + ["\u44F4", "\u44F4"], /* CJK Ideograph Extension A */ + ["\u44F5", "\u44F5"], /* CJK Ideograph Extension A */ + ["\u44F6", "\u44F6"], /* CJK Ideograph Extension A */ + ["\u44F7", "\u44F7"], /* CJK Ideograph Extension A */ + ["\u44F8", "\u44F8"], /* CJK Ideograph Extension A */ + ["\u44F9", "\u44F9"], /* CJK Ideograph Extension A */ + ["\u44FA", "\u44FA"], /* CJK Ideograph Extension A */ + ["\u44FB", "\u44FB"], /* CJK Ideograph Extension A */ + ["\u44FC", "\u44FC"], /* CJK Ideograph Extension A */ + ["\u44FD", "\u44FD"], /* CJK Ideograph Extension A */ + ["\u44FE", "\u44FE"], /* CJK Ideograph Extension A */ + ["\u44FF", "\u44FF"], /* CJK Ideograph Extension A */ + ["\u4500", "\u4500"], /* CJK Ideograph Extension A */ + ["\u4501", "\u4501"], /* CJK Ideograph Extension A */ + ["\u4502", "\u4502"], /* CJK Ideograph Extension A */ + ["\u4503", "\u4503"], /* CJK Ideograph Extension A */ + ["\u4504", "\u4504"], /* CJK Ideograph Extension A */ + ["\u4505", "\u4505"], /* CJK Ideograph Extension A */ + ["\u4506", "\u4506"], /* CJK Ideograph Extension A */ + ["\u4507", "\u4507"], /* CJK Ideograph Extension A */ + ["\u4508", "\u4508"], /* CJK Ideograph Extension A */ + ["\u4509", "\u4509"], /* CJK Ideograph Extension A */ + ["\u450A", "\u450A"], /* CJK Ideograph Extension A */ + ["\u450B", "\u450B"], /* CJK Ideograph Extension A */ + ["\u450C", "\u450C"], /* CJK Ideograph Extension A */ + ["\u450D", "\u450D"], /* CJK Ideograph Extension A */ + ["\u450E", "\u450E"], /* CJK Ideograph Extension A */ + ["\u450F", "\u450F"], /* CJK Ideograph Extension A */ + ["\u4510", "\u4510"], /* CJK Ideograph Extension A */ + ["\u4511", "\u4511"], /* CJK Ideograph Extension A */ + ["\u4512", "\u4512"], /* CJK Ideograph Extension A */ + ["\u4513", "\u4513"], /* CJK Ideograph Extension A */ + ["\u4514", "\u4514"], /* CJK Ideograph Extension A */ + ["\u4515", "\u4515"], /* CJK Ideograph Extension A */ + ["\u4516", "\u4516"], /* CJK Ideograph Extension A */ + ["\u4517", "\u4517"], /* CJK Ideograph Extension A */ + ["\u4518", "\u4518"], /* CJK Ideograph Extension A */ + ["\u4519", "\u4519"], /* CJK Ideograph Extension A */ + ["\u451A", "\u451A"], /* CJK Ideograph Extension A */ + ["\u451B", "\u451B"], /* CJK Ideograph Extension A */ + ["\u451C", "\u451C"], /* CJK Ideograph Extension A */ + ["\u451D", "\u451D"], /* CJK Ideograph Extension A */ + ["\u451E", "\u451E"], /* CJK Ideograph Extension A */ + ["\u451F", "\u451F"], /* CJK Ideograph Extension A */ + ["\u4520", "\u4520"], /* CJK Ideograph Extension A */ + ["\u4521", "\u4521"], /* CJK Ideograph Extension A */ + ["\u4522", "\u4522"], /* CJK Ideograph Extension A */ + ["\u4523", "\u4523"], /* CJK Ideograph Extension A */ + ["\u4524", "\u4524"], /* CJK Ideograph Extension A */ + ["\u4525", "\u4525"], /* CJK Ideograph Extension A */ + ["\u4526", "\u4526"], /* CJK Ideograph Extension A */ + ["\u4527", "\u4527"], /* CJK Ideograph Extension A */ + ["\u4528", "\u4528"], /* CJK Ideograph Extension A */ + ["\u4529", "\u4529"], /* CJK Ideograph Extension A */ + ["\u452A", "\u452A"], /* CJK Ideograph Extension A */ + ["\u452B", "\u452B"], /* CJK Ideograph Extension A */ + ["\u452C", "\u452C"], /* CJK Ideograph Extension A */ + ["\u452D", "\u452D"], /* CJK Ideograph Extension A */ + ["\u452E", "\u452E"], /* CJK Ideograph Extension A */ + ["\u452F", "\u452F"], /* CJK Ideograph Extension A */ + ["\u4530", "\u4530"], /* CJK Ideograph Extension A */ + ["\u4531", "\u4531"], /* CJK Ideograph Extension A */ + ["\u4532", "\u4532"], /* CJK Ideograph Extension A */ + ["\u4533", "\u4533"], /* CJK Ideograph Extension A */ + ["\u4534", "\u4534"], /* CJK Ideograph Extension A */ + ["\u4535", "\u4535"], /* CJK Ideograph Extension A */ + ["\u4536", "\u4536"], /* CJK Ideograph Extension A */ + ["\u4537", "\u4537"], /* CJK Ideograph Extension A */ + ["\u4538", "\u4538"], /* CJK Ideograph Extension A */ + ["\u4539", "\u4539"], /* CJK Ideograph Extension A */ + ["\u453A", "\u453A"], /* CJK Ideograph Extension A */ + ["\u453B", "\u453B"], /* CJK Ideograph Extension A */ + ["\u453C", "\u453C"], /* CJK Ideograph Extension A */ + ["\u453D", "\u453D"], /* CJK Ideograph Extension A */ + ["\u453E", "\u453E"], /* CJK Ideograph Extension A */ + ["\u453F", "\u453F"], /* CJK Ideograph Extension A */ + ["\u4540", "\u4540"], /* CJK Ideograph Extension A */ + ["\u4541", "\u4541"], /* CJK Ideograph Extension A */ + ["\u4542", "\u4542"], /* CJK Ideograph Extension A */ + ["\u4543", "\u4543"], /* CJK Ideograph Extension A */ + ["\u4544", "\u4544"], /* CJK Ideograph Extension A */ + ["\u4545", "\u4545"], /* CJK Ideograph Extension A */ + ["\u4546", "\u4546"], /* CJK Ideograph Extension A */ + ["\u4547", "\u4547"], /* CJK Ideograph Extension A */ + ["\u4548", "\u4548"], /* CJK Ideograph Extension A */ + ["\u4549", "\u4549"], /* CJK Ideograph Extension A */ + ["\u454A", "\u454A"], /* CJK Ideograph Extension A */ + ["\u454B", "\u454B"], /* CJK Ideograph Extension A */ + ["\u454C", "\u454C"], /* CJK Ideograph Extension A */ + ["\u454D", "\u454D"], /* CJK Ideograph Extension A */ + ["\u454E", "\u454E"], /* CJK Ideograph Extension A */ + ["\u454F", "\u454F"], /* CJK Ideograph Extension A */ + ["\u4550", "\u4550"], /* CJK Ideograph Extension A */ + ["\u4551", "\u4551"], /* CJK Ideograph Extension A */ + ["\u4552", "\u4552"], /* CJK Ideograph Extension A */ + ["\u4553", "\u4553"], /* CJK Ideograph Extension A */ + ["\u4554", "\u4554"], /* CJK Ideograph Extension A */ + ["\u4555", "\u4555"], /* CJK Ideograph Extension A */ + ["\u4556", "\u4556"], /* CJK Ideograph Extension A */ + ["\u4557", "\u4557"], /* CJK Ideograph Extension A */ + ["\u4558", "\u4558"], /* CJK Ideograph Extension A */ + ["\u4559", "\u4559"], /* CJK Ideograph Extension A */ + ["\u455A", "\u455A"], /* CJK Ideograph Extension A */ + ["\u455B", "\u455B"], /* CJK Ideograph Extension A */ + ["\u455C", "\u455C"], /* CJK Ideograph Extension A */ + ["\u455D", "\u455D"], /* CJK Ideograph Extension A */ + ["\u455E", "\u455E"], /* CJK Ideograph Extension A */ + ["\u455F", "\u455F"], /* CJK Ideograph Extension A */ + ["\u4560", "\u4560"], /* CJK Ideograph Extension A */ + ["\u4561", "\u4561"], /* CJK Ideograph Extension A */ + ["\u4562", "\u4562"], /* CJK Ideograph Extension A */ + ["\u4563", "\u4563"], /* CJK Ideograph Extension A */ + ["\u4564", "\u4564"], /* CJK Ideograph Extension A */ + ["\u4565", "\u4565"], /* CJK Ideograph Extension A */ + ["\u4566", "\u4566"], /* CJK Ideograph Extension A */ + ["\u4567", "\u4567"], /* CJK Ideograph Extension A */ + ["\u4568", "\u4568"], /* CJK Ideograph Extension A */ + ["\u4569", "\u4569"], /* CJK Ideograph Extension A */ + ["\u456A", "\u456A"], /* CJK Ideograph Extension A */ + ["\u456B", "\u456B"], /* CJK Ideograph Extension A */ + ["\u456C", "\u456C"], /* CJK Ideograph Extension A */ + ["\u456D", "\u456D"], /* CJK Ideograph Extension A */ + ["\u456E", "\u456E"], /* CJK Ideograph Extension A */ + ["\u456F", "\u456F"], /* CJK Ideograph Extension A */ + ["\u4570", "\u4570"], /* CJK Ideograph Extension A */ + ["\u4571", "\u4571"], /* CJK Ideograph Extension A */ + ["\u4572", "\u4572"], /* CJK Ideograph Extension A */ + ["\u4573", "\u4573"], /* CJK Ideograph Extension A */ + ["\u4574", "\u4574"], /* CJK Ideograph Extension A */ + ["\u4575", "\u4575"], /* CJK Ideograph Extension A */ + ["\u4576", "\u4576"], /* CJK Ideograph Extension A */ + ["\u4577", "\u4577"], /* CJK Ideograph Extension A */ + ["\u4578", "\u4578"], /* CJK Ideograph Extension A */ + ["\u4579", "\u4579"], /* CJK Ideograph Extension A */ + ["\u457A", "\u457A"], /* CJK Ideograph Extension A */ + ["\u457B", "\u457B"], /* CJK Ideograph Extension A */ + ["\u457C", "\u457C"], /* CJK Ideograph Extension A */ + ["\u457D", "\u457D"], /* CJK Ideograph Extension A */ + ["\u457E", "\u457E"], /* CJK Ideograph Extension A */ + ["\u457F", "\u457F"], /* CJK Ideograph Extension A */ + ["\u4580", "\u4580"], /* CJK Ideograph Extension A */ + ["\u4581", "\u4581"], /* CJK Ideograph Extension A */ + ["\u4582", "\u4582"], /* CJK Ideograph Extension A */ + ["\u4583", "\u4583"], /* CJK Ideograph Extension A */ + ["\u4584", "\u4584"], /* CJK Ideograph Extension A */ + ["\u4585", "\u4585"], /* CJK Ideograph Extension A */ + ["\u4586", "\u4586"], /* CJK Ideograph Extension A */ + ["\u4587", "\u4587"], /* CJK Ideograph Extension A */ + ["\u4588", "\u4588"], /* CJK Ideograph Extension A */ + ["\u4589", "\u4589"], /* CJK Ideograph Extension A */ + ["\u458A", "\u458A"], /* CJK Ideograph Extension A */ + ["\u458B", "\u458B"], /* CJK Ideograph Extension A */ + ["\u458C", "\u458C"], /* CJK Ideograph Extension A */ + ["\u458D", "\u458D"], /* CJK Ideograph Extension A */ + ["\u458E", "\u458E"], /* CJK Ideograph Extension A */ + ["\u458F", "\u458F"], /* CJK Ideograph Extension A */ + ["\u4590", "\u4590"], /* CJK Ideograph Extension A */ + ["\u4591", "\u4591"], /* CJK Ideograph Extension A */ + ["\u4592", "\u4592"], /* CJK Ideograph Extension A */ + ["\u4593", "\u4593"], /* CJK Ideograph Extension A */ + ["\u4594", "\u4594"], /* CJK Ideograph Extension A */ + ["\u4595", "\u4595"], /* CJK Ideograph Extension A */ + ["\u4596", "\u4596"], /* CJK Ideograph Extension A */ + ["\u4597", "\u4597"], /* CJK Ideograph Extension A */ + ["\u4598", "\u4598"], /* CJK Ideograph Extension A */ + ["\u4599", "\u4599"], /* CJK Ideograph Extension A */ + ["\u459A", "\u459A"], /* CJK Ideograph Extension A */ + ["\u459B", "\u459B"], /* CJK Ideograph Extension A */ + ["\u459C", "\u459C"], /* CJK Ideograph Extension A */ + ["\u459D", "\u459D"], /* CJK Ideograph Extension A */ + ["\u459E", "\u459E"], /* CJK Ideograph Extension A */ + ["\u459F", "\u459F"], /* CJK Ideograph Extension A */ + ["\u45A0", "\u45A0"], /* CJK Ideograph Extension A */ + ["\u45A1", "\u45A1"], /* CJK Ideograph Extension A */ + ["\u45A2", "\u45A2"], /* CJK Ideograph Extension A */ + ["\u45A3", "\u45A3"], /* CJK Ideograph Extension A */ + ["\u45A4", "\u45A4"], /* CJK Ideograph Extension A */ + ["\u45A5", "\u45A5"], /* CJK Ideograph Extension A */ + ["\u45A6", "\u45A6"], /* CJK Ideograph Extension A */ + ["\u45A7", "\u45A7"], /* CJK Ideograph Extension A */ + ["\u45A8", "\u45A8"], /* CJK Ideograph Extension A */ + ["\u45A9", "\u45A9"], /* CJK Ideograph Extension A */ + ["\u45AA", "\u45AA"], /* CJK Ideograph Extension A */ + ["\u45AB", "\u45AB"], /* CJK Ideograph Extension A */ + ["\u45AC", "\u45AC"], /* CJK Ideograph Extension A */ + ["\u45AD", "\u45AD"], /* CJK Ideograph Extension A */ + ["\u45AE", "\u45AE"], /* CJK Ideograph Extension A */ + ["\u45AF", "\u45AF"], /* CJK Ideograph Extension A */ + ["\u45B0", "\u45B0"], /* CJK Ideograph Extension A */ + ["\u45B1", "\u45B1"], /* CJK Ideograph Extension A */ + ["\u45B2", "\u45B2"], /* CJK Ideograph Extension A */ + ["\u45B3", "\u45B3"], /* CJK Ideograph Extension A */ + ["\u45B4", "\u45B4"], /* CJK Ideograph Extension A */ + ["\u45B5", "\u45B5"], /* CJK Ideograph Extension A */ + ["\u45B6", "\u45B6"], /* CJK Ideograph Extension A */ + ["\u45B7", "\u45B7"], /* CJK Ideograph Extension A */ + ["\u45B8", "\u45B8"], /* CJK Ideograph Extension A */ + ["\u45B9", "\u45B9"], /* CJK Ideograph Extension A */ + ["\u45BA", "\u45BA"], /* CJK Ideograph Extension A */ + ["\u45BB", "\u45BB"], /* CJK Ideograph Extension A */ + ["\u45BC", "\u45BC"], /* CJK Ideograph Extension A */ + ["\u45BD", "\u45BD"], /* CJK Ideograph Extension A */ + ["\u45BE", "\u45BE"], /* CJK Ideograph Extension A */ + ["\u45BF", "\u45BF"], /* CJK Ideograph Extension A */ + ["\u45C0", "\u45C0"], /* CJK Ideograph Extension A */ + ["\u45C1", "\u45C1"], /* CJK Ideograph Extension A */ + ["\u45C2", "\u45C2"], /* CJK Ideograph Extension A */ + ["\u45C3", "\u45C3"], /* CJK Ideograph Extension A */ + ["\u45C4", "\u45C4"], /* CJK Ideograph Extension A */ + ["\u45C5", "\u45C5"], /* CJK Ideograph Extension A */ + ["\u45C6", "\u45C6"], /* CJK Ideograph Extension A */ + ["\u45C7", "\u45C7"], /* CJK Ideograph Extension A */ + ["\u45C8", "\u45C8"], /* CJK Ideograph Extension A */ + ["\u45C9", "\u45C9"], /* CJK Ideograph Extension A */ + ["\u45CA", "\u45CA"], /* CJK Ideograph Extension A */ + ["\u45CB", "\u45CB"], /* CJK Ideograph Extension A */ + ["\u45CC", "\u45CC"], /* CJK Ideograph Extension A */ + ["\u45CD", "\u45CD"], /* CJK Ideograph Extension A */ + ["\u45CE", "\u45CE"], /* CJK Ideograph Extension A */ + ["\u45CF", "\u45CF"], /* CJK Ideograph Extension A */ + ["\u45D0", "\u45D0"], /* CJK Ideograph Extension A */ + ["\u45D1", "\u45D1"], /* CJK Ideograph Extension A */ + ["\u45D2", "\u45D2"], /* CJK Ideograph Extension A */ + ["\u45D3", "\u45D3"], /* CJK Ideograph Extension A */ + ["\u45D4", "\u45D4"], /* CJK Ideograph Extension A */ + ["\u45D5", "\u45D5"], /* CJK Ideograph Extension A */ + ["\u45D6", "\u45D6"], /* CJK Ideograph Extension A */ + ["\u45D7", "\u45D7"], /* CJK Ideograph Extension A */ + ["\u45D8", "\u45D8"], /* CJK Ideograph Extension A */ + ["\u45D9", "\u45D9"], /* CJK Ideograph Extension A */ + ["\u45DA", "\u45DA"], /* CJK Ideograph Extension A */ + ["\u45DB", "\u45DB"], /* CJK Ideograph Extension A */ + ["\u45DC", "\u45DC"], /* CJK Ideograph Extension A */ + ["\u45DD", "\u45DD"], /* CJK Ideograph Extension A */ + ["\u45DE", "\u45DE"], /* CJK Ideograph Extension A */ + ["\u45DF", "\u45DF"], /* CJK Ideograph Extension A */ + ["\u45E0", "\u45E0"], /* CJK Ideograph Extension A */ + ["\u45E1", "\u45E1"], /* CJK Ideograph Extension A */ + ["\u45E2", "\u45E2"], /* CJK Ideograph Extension A */ + ["\u45E3", "\u45E3"], /* CJK Ideograph Extension A */ + ["\u45E4", "\u45E4"], /* CJK Ideograph Extension A */ + ["\u45E5", "\u45E5"], /* CJK Ideograph Extension A */ + ["\u45E6", "\u45E6"], /* CJK Ideograph Extension A */ + ["\u45E7", "\u45E7"], /* CJK Ideograph Extension A */ + ["\u45E8", "\u45E8"], /* CJK Ideograph Extension A */ + ["\u45E9", "\u45E9"], /* CJK Ideograph Extension A */ + ["\u45EA", "\u45EA"], /* CJK Ideograph Extension A */ + ["\u45EB", "\u45EB"], /* CJK Ideograph Extension A */ + ["\u45EC", "\u45EC"], /* CJK Ideograph Extension A */ + ["\u45ED", "\u45ED"], /* CJK Ideograph Extension A */ + ["\u45EE", "\u45EE"], /* CJK Ideograph Extension A */ + ["\u45EF", "\u45EF"], /* CJK Ideograph Extension A */ + ["\u45F0", "\u45F0"], /* CJK Ideograph Extension A */ + ["\u45F1", "\u45F1"], /* CJK Ideograph Extension A */ + ["\u45F2", "\u45F2"], /* CJK Ideograph Extension A */ + ["\u45F3", "\u45F3"], /* CJK Ideograph Extension A */ + ["\u45F4", "\u45F4"], /* CJK Ideograph Extension A */ + ["\u45F5", "\u45F5"], /* CJK Ideograph Extension A */ + ["\u45F6", "\u45F6"], /* CJK Ideograph Extension A */ + ["\u45F7", "\u45F7"], /* CJK Ideograph Extension A */ + ["\u45F8", "\u45F8"], /* CJK Ideograph Extension A */ + ["\u45F9", "\u45F9"], /* CJK Ideograph Extension A */ + ["\u45FA", "\u45FA"], /* CJK Ideograph Extension A */ + ["\u45FB", "\u45FB"], /* CJK Ideograph Extension A */ + ["\u45FC", "\u45FC"], /* CJK Ideograph Extension A */ + ["\u45FD", "\u45FD"], /* CJK Ideograph Extension A */ + ["\u45FE", "\u45FE"], /* CJK Ideograph Extension A */ + ["\u45FF", "\u45FF"], /* CJK Ideograph Extension A */ + ["\u4600", "\u4600"], /* CJK Ideograph Extension A */ + ["\u4601", "\u4601"], /* CJK Ideograph Extension A */ + ["\u4602", "\u4602"], /* CJK Ideograph Extension A */ + ["\u4603", "\u4603"], /* CJK Ideograph Extension A */ + ["\u4604", "\u4604"], /* CJK Ideograph Extension A */ + ["\u4605", "\u4605"], /* CJK Ideograph Extension A */ + ["\u4606", "\u4606"], /* CJK Ideograph Extension A */ + ["\u4607", "\u4607"], /* CJK Ideograph Extension A */ + ["\u4608", "\u4608"], /* CJK Ideograph Extension A */ + ["\u4609", "\u4609"], /* CJK Ideograph Extension A */ + ["\u460A", "\u460A"], /* CJK Ideograph Extension A */ + ["\u460B", "\u460B"], /* CJK Ideograph Extension A */ + ["\u460C", "\u460C"], /* CJK Ideograph Extension A */ + ["\u460D", "\u460D"], /* CJK Ideograph Extension A */ + ["\u460E", "\u460E"], /* CJK Ideograph Extension A */ + ["\u460F", "\u460F"], /* CJK Ideograph Extension A */ + ["\u4610", "\u4610"], /* CJK Ideograph Extension A */ + ["\u4611", "\u4611"], /* CJK Ideograph Extension A */ + ["\u4612", "\u4612"], /* CJK Ideograph Extension A */ + ["\u4613", "\u4613"], /* CJK Ideograph Extension A */ + ["\u4614", "\u4614"], /* CJK Ideograph Extension A */ + ["\u4615", "\u4615"], /* CJK Ideograph Extension A */ + ["\u4616", "\u4616"], /* CJK Ideograph Extension A */ + ["\u4617", "\u4617"], /* CJK Ideograph Extension A */ + ["\u4618", "\u4618"], /* CJK Ideograph Extension A */ + ["\u4619", "\u4619"], /* CJK Ideograph Extension A */ + ["\u461A", "\u461A"], /* CJK Ideograph Extension A */ + ["\u461B", "\u461B"], /* CJK Ideograph Extension A */ + ["\u461C", "\u461C"], /* CJK Ideograph Extension A */ + ["\u461D", "\u461D"], /* CJK Ideograph Extension A */ + ["\u461E", "\u461E"], /* CJK Ideograph Extension A */ + ["\u461F", "\u461F"], /* CJK Ideograph Extension A */ + ["\u4620", "\u4620"], /* CJK Ideograph Extension A */ + ["\u4621", "\u4621"], /* CJK Ideograph Extension A */ + ["\u4622", "\u4622"], /* CJK Ideograph Extension A */ + ["\u4623", "\u4623"], /* CJK Ideograph Extension A */ + ["\u4624", "\u4624"], /* CJK Ideograph Extension A */ + ["\u4625", "\u4625"], /* CJK Ideograph Extension A */ + ["\u4626", "\u4626"], /* CJK Ideograph Extension A */ + ["\u4627", "\u4627"], /* CJK Ideograph Extension A */ + ["\u4628", "\u4628"], /* CJK Ideograph Extension A */ + ["\u4629", "\u4629"], /* CJK Ideograph Extension A */ + ["\u462A", "\u462A"], /* CJK Ideograph Extension A */ + ["\u462B", "\u462B"], /* CJK Ideograph Extension A */ + ["\u462C", "\u462C"], /* CJK Ideograph Extension A */ + ["\u462D", "\u462D"], /* CJK Ideograph Extension A */ + ["\u462E", "\u462E"], /* CJK Ideograph Extension A */ + ["\u462F", "\u462F"], /* CJK Ideograph Extension A */ + ["\u4630", "\u4630"], /* CJK Ideograph Extension A */ + ["\u4631", "\u4631"], /* CJK Ideograph Extension A */ + ["\u4632", "\u4632"], /* CJK Ideograph Extension A */ + ["\u4633", "\u4633"], /* CJK Ideograph Extension A */ + ["\u4634", "\u4634"], /* CJK Ideograph Extension A */ + ["\u4635", "\u4635"], /* CJK Ideograph Extension A */ + ["\u4636", "\u4636"], /* CJK Ideograph Extension A */ + ["\u4637", "\u4637"], /* CJK Ideograph Extension A */ + ["\u4638", "\u4638"], /* CJK Ideograph Extension A */ + ["\u4639", "\u4639"], /* CJK Ideograph Extension A */ + ["\u463A", "\u463A"], /* CJK Ideograph Extension A */ + ["\u463B", "\u463B"], /* CJK Ideograph Extension A */ + ["\u463C", "\u463C"], /* CJK Ideograph Extension A */ + ["\u463D", "\u463D"], /* CJK Ideograph Extension A */ + ["\u463E", "\u463E"], /* CJK Ideograph Extension A */ + ["\u463F", "\u463F"], /* CJK Ideograph Extension A */ + ["\u4640", "\u4640"], /* CJK Ideograph Extension A */ + ["\u4641", "\u4641"], /* CJK Ideograph Extension A */ + ["\u4642", "\u4642"], /* CJK Ideograph Extension A */ + ["\u4643", "\u4643"], /* CJK Ideograph Extension A */ + ["\u4644", "\u4644"], /* CJK Ideograph Extension A */ + ["\u4645", "\u4645"], /* CJK Ideograph Extension A */ + ["\u4646", "\u4646"], /* CJK Ideograph Extension A */ + ["\u4647", "\u4647"], /* CJK Ideograph Extension A */ + ["\u4648", "\u4648"], /* CJK Ideograph Extension A */ + ["\u4649", "\u4649"], /* CJK Ideograph Extension A */ + ["\u464A", "\u464A"], /* CJK Ideograph Extension A */ + ["\u464B", "\u464B"], /* CJK Ideograph Extension A */ + ["\u464C", "\u464C"], /* CJK Ideograph Extension A */ + ["\u464D", "\u464D"], /* CJK Ideograph Extension A */ + ["\u464E", "\u464E"], /* CJK Ideograph Extension A */ + ["\u464F", "\u464F"], /* CJK Ideograph Extension A */ + ["\u4650", "\u4650"], /* CJK Ideograph Extension A */ + ["\u4651", "\u4651"], /* CJK Ideograph Extension A */ + ["\u4652", "\u4652"], /* CJK Ideograph Extension A */ + ["\u4653", "\u4653"], /* CJK Ideograph Extension A */ + ["\u4654", "\u4654"], /* CJK Ideograph Extension A */ + ["\u4655", "\u4655"], /* CJK Ideograph Extension A */ + ["\u4656", "\u4656"], /* CJK Ideograph Extension A */ + ["\u4657", "\u4657"], /* CJK Ideograph Extension A */ + ["\u4658", "\u4658"], /* CJK Ideograph Extension A */ + ["\u4659", "\u4659"], /* CJK Ideograph Extension A */ + ["\u465A", "\u465A"], /* CJK Ideograph Extension A */ + ["\u465B", "\u465B"], /* CJK Ideograph Extension A */ + ["\u465C", "\u465C"], /* CJK Ideograph Extension A */ + ["\u465D", "\u465D"], /* CJK Ideograph Extension A */ + ["\u465E", "\u465E"], /* CJK Ideograph Extension A */ + ["\u465F", "\u465F"], /* CJK Ideograph Extension A */ + ["\u4660", "\u4660"], /* CJK Ideograph Extension A */ + ["\u4661", "\u4661"], /* CJK Ideograph Extension A */ + ["\u4662", "\u4662"], /* CJK Ideograph Extension A */ + ["\u4663", "\u4663"], /* CJK Ideograph Extension A */ + ["\u4664", "\u4664"], /* CJK Ideograph Extension A */ + ["\u4665", "\u4665"], /* CJK Ideograph Extension A */ + ["\u4666", "\u4666"], /* CJK Ideograph Extension A */ + ["\u4667", "\u4667"], /* CJK Ideograph Extension A */ + ["\u4668", "\u4668"], /* CJK Ideograph Extension A */ + ["\u4669", "\u4669"], /* CJK Ideograph Extension A */ + ["\u466A", "\u466A"], /* CJK Ideograph Extension A */ + ["\u466B", "\u466B"], /* CJK Ideograph Extension A */ + ["\u466C", "\u466C"], /* CJK Ideograph Extension A */ + ["\u466D", "\u466D"], /* CJK Ideograph Extension A */ + ["\u466E", "\u466E"], /* CJK Ideograph Extension A */ + ["\u466F", "\u466F"], /* CJK Ideograph Extension A */ + ["\u4670", "\u4670"], /* CJK Ideograph Extension A */ + ["\u4671", "\u4671"], /* CJK Ideograph Extension A */ + ["\u4672", "\u4672"], /* CJK Ideograph Extension A */ + ["\u4673", "\u4673"], /* CJK Ideograph Extension A */ + ["\u4674", "\u4674"], /* CJK Ideograph Extension A */ + ["\u4675", "\u4675"], /* CJK Ideograph Extension A */ + ["\u4676", "\u4676"], /* CJK Ideograph Extension A */ + ["\u4677", "\u4677"], /* CJK Ideograph Extension A */ + ["\u4678", "\u4678"], /* CJK Ideograph Extension A */ + ["\u4679", "\u4679"], /* CJK Ideograph Extension A */ + ["\u467A", "\u467A"], /* CJK Ideograph Extension A */ + ["\u467B", "\u467B"], /* CJK Ideograph Extension A */ + ["\u467C", "\u467C"], /* CJK Ideograph Extension A */ + ["\u467D", "\u467D"], /* CJK Ideograph Extension A */ + ["\u467E", "\u467E"], /* CJK Ideograph Extension A */ + ["\u467F", "\u467F"], /* CJK Ideograph Extension A */ + ["\u4680", "\u4680"], /* CJK Ideograph Extension A */ + ["\u4681", "\u4681"], /* CJK Ideograph Extension A */ + ["\u4682", "\u4682"], /* CJK Ideograph Extension A */ + ["\u4683", "\u4683"], /* CJK Ideograph Extension A */ + ["\u4684", "\u4684"], /* CJK Ideograph Extension A */ + ["\u4685", "\u4685"], /* CJK Ideograph Extension A */ + ["\u4686", "\u4686"], /* CJK Ideograph Extension A */ + ["\u4687", "\u4687"], /* CJK Ideograph Extension A */ + ["\u4688", "\u4688"], /* CJK Ideograph Extension A */ + ["\u4689", "\u4689"], /* CJK Ideograph Extension A */ + ["\u468A", "\u468A"], /* CJK Ideograph Extension A */ + ["\u468B", "\u468B"], /* CJK Ideograph Extension A */ + ["\u468C", "\u468C"], /* CJK Ideograph Extension A */ + ["\u468D", "\u468D"], /* CJK Ideograph Extension A */ + ["\u468E", "\u468E"], /* CJK Ideograph Extension A */ + ["\u468F", "\u468F"], /* CJK Ideograph Extension A */ + ["\u4690", "\u4690"], /* CJK Ideograph Extension A */ + ["\u4691", "\u4691"], /* CJK Ideograph Extension A */ + ["\u4692", "\u4692"], /* CJK Ideograph Extension A */ + ["\u4693", "\u4693"], /* CJK Ideograph Extension A */ + ["\u4694", "\u4694"], /* CJK Ideograph Extension A */ + ["\u4695", "\u4695"], /* CJK Ideograph Extension A */ + ["\u4696", "\u4696"], /* CJK Ideograph Extension A */ + ["\u4697", "\u4697"], /* CJK Ideograph Extension A */ + ["\u4698", "\u4698"], /* CJK Ideograph Extension A */ + ["\u4699", "\u4699"], /* CJK Ideograph Extension A */ + ["\u469A", "\u469A"], /* CJK Ideograph Extension A */ + ["\u469B", "\u469B"], /* CJK Ideograph Extension A */ + ["\u469C", "\u469C"], /* CJK Ideograph Extension A */ + ["\u469D", "\u469D"], /* CJK Ideograph Extension A */ + ["\u469E", "\u469E"], /* CJK Ideograph Extension A */ + ["\u469F", "\u469F"], /* CJK Ideograph Extension A */ + ["\u46A0", "\u46A0"], /* CJK Ideograph Extension A */ + ["\u46A1", "\u46A1"], /* CJK Ideograph Extension A */ + ["\u46A2", "\u46A2"], /* CJK Ideograph Extension A */ + ["\u46A3", "\u46A3"], /* CJK Ideograph Extension A */ + ["\u46A4", "\u46A4"], /* CJK Ideograph Extension A */ + ["\u46A5", "\u46A5"], /* CJK Ideograph Extension A */ + ["\u46A6", "\u46A6"], /* CJK Ideograph Extension A */ + ["\u46A7", "\u46A7"], /* CJK Ideograph Extension A */ + ["\u46A8", "\u46A8"], /* CJK Ideograph Extension A */ + ["\u46A9", "\u46A9"], /* CJK Ideograph Extension A */ + ["\u46AA", "\u46AA"], /* CJK Ideograph Extension A */ + ["\u46AB", "\u46AB"], /* CJK Ideograph Extension A */ + ["\u46AC", "\u46AC"], /* CJK Ideograph Extension A */ + ["\u46AD", "\u46AD"], /* CJK Ideograph Extension A */ + ["\u46AE", "\u46AE"], /* CJK Ideograph Extension A */ + ["\u46AF", "\u46AF"], /* CJK Ideograph Extension A */ + ["\u46B0", "\u46B0"], /* CJK Ideograph Extension A */ + ["\u46B1", "\u46B1"], /* CJK Ideograph Extension A */ + ["\u46B2", "\u46B2"], /* CJK Ideograph Extension A */ + ["\u46B3", "\u46B3"], /* CJK Ideograph Extension A */ + ["\u46B4", "\u46B4"], /* CJK Ideograph Extension A */ + ["\u46B5", "\u46B5"], /* CJK Ideograph Extension A */ + ["\u46B6", "\u46B6"], /* CJK Ideograph Extension A */ + ["\u46B7", "\u46B7"], /* CJK Ideograph Extension A */ + ["\u46B8", "\u46B8"], /* CJK Ideograph Extension A */ + ["\u46B9", "\u46B9"], /* CJK Ideograph Extension A */ + ["\u46BA", "\u46BA"], /* CJK Ideograph Extension A */ + ["\u46BB", "\u46BB"], /* CJK Ideograph Extension A */ + ["\u46BC", "\u46BC"], /* CJK Ideograph Extension A */ + ["\u46BD", "\u46BD"], /* CJK Ideograph Extension A */ + ["\u46BE", "\u46BE"], /* CJK Ideograph Extension A */ + ["\u46BF", "\u46BF"], /* CJK Ideograph Extension A */ + ["\u46C0", "\u46C0"], /* CJK Ideograph Extension A */ + ["\u46C1", "\u46C1"], /* CJK Ideograph Extension A */ + ["\u46C2", "\u46C2"], /* CJK Ideograph Extension A */ + ["\u46C3", "\u46C3"], /* CJK Ideograph Extension A */ + ["\u46C4", "\u46C4"], /* CJK Ideograph Extension A */ + ["\u46C5", "\u46C5"], /* CJK Ideograph Extension A */ + ["\u46C6", "\u46C6"], /* CJK Ideograph Extension A */ + ["\u46C7", "\u46C7"], /* CJK Ideograph Extension A */ + ["\u46C8", "\u46C8"], /* CJK Ideograph Extension A */ + ["\u46C9", "\u46C9"], /* CJK Ideograph Extension A */ + ["\u46CA", "\u46CA"], /* CJK Ideograph Extension A */ + ["\u46CB", "\u46CB"], /* CJK Ideograph Extension A */ + ["\u46CC", "\u46CC"], /* CJK Ideograph Extension A */ + ["\u46CD", "\u46CD"], /* CJK Ideograph Extension A */ + ["\u46CE", "\u46CE"], /* CJK Ideograph Extension A */ + ["\u46CF", "\u46CF"], /* CJK Ideograph Extension A */ + ["\u46D0", "\u46D0"], /* CJK Ideograph Extension A */ + ["\u46D1", "\u46D1"], /* CJK Ideograph Extension A */ + ["\u46D2", "\u46D2"], /* CJK Ideograph Extension A */ + ["\u46D3", "\u46D3"], /* CJK Ideograph Extension A */ + ["\u46D4", "\u46D4"], /* CJK Ideograph Extension A */ + ["\u46D5", "\u46D5"], /* CJK Ideograph Extension A */ + ["\u46D6", "\u46D6"], /* CJK Ideograph Extension A */ + ["\u46D7", "\u46D7"], /* CJK Ideograph Extension A */ + ["\u46D8", "\u46D8"], /* CJK Ideograph Extension A */ + ["\u46D9", "\u46D9"], /* CJK Ideograph Extension A */ + ["\u46DA", "\u46DA"], /* CJK Ideograph Extension A */ + ["\u46DB", "\u46DB"], /* CJK Ideograph Extension A */ + ["\u46DC", "\u46DC"], /* CJK Ideograph Extension A */ + ["\u46DD", "\u46DD"], /* CJK Ideograph Extension A */ + ["\u46DE", "\u46DE"], /* CJK Ideograph Extension A */ + ["\u46DF", "\u46DF"], /* CJK Ideograph Extension A */ + ["\u46E0", "\u46E0"], /* CJK Ideograph Extension A */ + ["\u46E1", "\u46E1"], /* CJK Ideograph Extension A */ + ["\u46E2", "\u46E2"], /* CJK Ideograph Extension A */ + ["\u46E3", "\u46E3"], /* CJK Ideograph Extension A */ + ["\u46E4", "\u46E4"], /* CJK Ideograph Extension A */ + ["\u46E5", "\u46E5"], /* CJK Ideograph Extension A */ + ["\u46E6", "\u46E6"], /* CJK Ideograph Extension A */ + ["\u46E7", "\u46E7"], /* CJK Ideograph Extension A */ + ["\u46E8", "\u46E8"], /* CJK Ideograph Extension A */ + ["\u46E9", "\u46E9"], /* CJK Ideograph Extension A */ + ["\u46EA", "\u46EA"], /* CJK Ideograph Extension A */ + ["\u46EB", "\u46EB"], /* CJK Ideograph Extension A */ + ["\u46EC", "\u46EC"], /* CJK Ideograph Extension A */ + ["\u46ED", "\u46ED"], /* CJK Ideograph Extension A */ + ["\u46EE", "\u46EE"], /* CJK Ideograph Extension A */ + ["\u46EF", "\u46EF"], /* CJK Ideograph Extension A */ + ["\u46F0", "\u46F0"], /* CJK Ideograph Extension A */ + ["\u46F1", "\u46F1"], /* CJK Ideograph Extension A */ + ["\u46F2", "\u46F2"], /* CJK Ideograph Extension A */ + ["\u46F3", "\u46F3"], /* CJK Ideograph Extension A */ + ["\u46F4", "\u46F4"], /* CJK Ideograph Extension A */ + ["\u46F5", "\u46F5"], /* CJK Ideograph Extension A */ + ["\u46F6", "\u46F6"], /* CJK Ideograph Extension A */ + ["\u46F7", "\u46F7"], /* CJK Ideograph Extension A */ + ["\u46F8", "\u46F8"], /* CJK Ideograph Extension A */ + ["\u46F9", "\u46F9"], /* CJK Ideograph Extension A */ + ["\u46FA", "\u46FA"], /* CJK Ideograph Extension A */ + ["\u46FB", "\u46FB"], /* CJK Ideograph Extension A */ + ["\u46FC", "\u46FC"], /* CJK Ideograph Extension A */ + ["\u46FD", "\u46FD"], /* CJK Ideograph Extension A */ + ["\u46FE", "\u46FE"], /* CJK Ideograph Extension A */ + ["\u46FF", "\u46FF"], /* CJK Ideograph Extension A */ + ["\u4700", "\u4700"], /* CJK Ideograph Extension A */ + ["\u4701", "\u4701"], /* CJK Ideograph Extension A */ + ["\u4702", "\u4702"], /* CJK Ideograph Extension A */ + ["\u4703", "\u4703"], /* CJK Ideograph Extension A */ + ["\u4704", "\u4704"], /* CJK Ideograph Extension A */ + ["\u4705", "\u4705"], /* CJK Ideograph Extension A */ + ["\u4706", "\u4706"], /* CJK Ideograph Extension A */ + ["\u4707", "\u4707"], /* CJK Ideograph Extension A */ + ["\u4708", "\u4708"], /* CJK Ideograph Extension A */ + ["\u4709", "\u4709"], /* CJK Ideograph Extension A */ + ["\u470A", "\u470A"], /* CJK Ideograph Extension A */ + ["\u470B", "\u470B"], /* CJK Ideograph Extension A */ + ["\u470C", "\u470C"], /* CJK Ideograph Extension A */ + ["\u470D", "\u470D"], /* CJK Ideograph Extension A */ + ["\u470E", "\u470E"], /* CJK Ideograph Extension A */ + ["\u470F", "\u470F"], /* CJK Ideograph Extension A */ + ["\u4710", "\u4710"], /* CJK Ideograph Extension A */ + ["\u4711", "\u4711"], /* CJK Ideograph Extension A */ + ["\u4712", "\u4712"], /* CJK Ideograph Extension A */ + ["\u4713", "\u4713"], /* CJK Ideograph Extension A */ + ["\u4714", "\u4714"], /* CJK Ideograph Extension A */ + ["\u4715", "\u4715"], /* CJK Ideograph Extension A */ + ["\u4716", "\u4716"], /* CJK Ideograph Extension A */ + ["\u4717", "\u4717"], /* CJK Ideograph Extension A */ + ["\u4718", "\u4718"], /* CJK Ideograph Extension A */ + ["\u4719", "\u4719"], /* CJK Ideograph Extension A */ + ["\u471A", "\u471A"], /* CJK Ideograph Extension A */ + ["\u471B", "\u471B"], /* CJK Ideograph Extension A */ + ["\u471C", "\u471C"], /* CJK Ideograph Extension A */ + ["\u471D", "\u471D"], /* CJK Ideograph Extension A */ + ["\u471E", "\u471E"], /* CJK Ideograph Extension A */ + ["\u471F", "\u471F"], /* CJK Ideograph Extension A */ + ["\u4720", "\u4720"], /* CJK Ideograph Extension A */ + ["\u4721", "\u4721"], /* CJK Ideograph Extension A */ + ["\u4722", "\u4722"], /* CJK Ideograph Extension A */ + ["\u4723", "\u4723"], /* CJK Ideograph Extension A */ + ["\u4724", "\u4724"], /* CJK Ideograph Extension A */ + ["\u4725", "\u4725"], /* CJK Ideograph Extension A */ + ["\u4726", "\u4726"], /* CJK Ideograph Extension A */ + ["\u4727", "\u4727"], /* CJK Ideograph Extension A */ + ["\u4728", "\u4728"], /* CJK Ideograph Extension A */ + ["\u4729", "\u4729"], /* CJK Ideograph Extension A */ + ["\u472A", "\u472A"], /* CJK Ideograph Extension A */ + ["\u472B", "\u472B"], /* CJK Ideograph Extension A */ + ["\u472C", "\u472C"], /* CJK Ideograph Extension A */ + ["\u472D", "\u472D"], /* CJK Ideograph Extension A */ + ["\u472E", "\u472E"], /* CJK Ideograph Extension A */ + ["\u472F", "\u472F"], /* CJK Ideograph Extension A */ + ["\u4730", "\u4730"], /* CJK Ideograph Extension A */ + ["\u4731", "\u4731"], /* CJK Ideograph Extension A */ + ["\u4732", "\u4732"], /* CJK Ideograph Extension A */ + ["\u4733", "\u4733"], /* CJK Ideograph Extension A */ + ["\u4734", "\u4734"], /* CJK Ideograph Extension A */ + ["\u4735", "\u4735"], /* CJK Ideograph Extension A */ + ["\u4736", "\u4736"], /* CJK Ideograph Extension A */ + ["\u4737", "\u4737"], /* CJK Ideograph Extension A */ + ["\u4738", "\u4738"], /* CJK Ideograph Extension A */ + ["\u4739", "\u4739"], /* CJK Ideograph Extension A */ + ["\u473A", "\u473A"], /* CJK Ideograph Extension A */ + ["\u473B", "\u473B"], /* CJK Ideograph Extension A */ + ["\u473C", "\u473C"], /* CJK Ideograph Extension A */ + ["\u473D", "\u473D"], /* CJK Ideograph Extension A */ + ["\u473E", "\u473E"], /* CJK Ideograph Extension A */ + ["\u473F", "\u473F"], /* CJK Ideograph Extension A */ + ["\u4740", "\u4740"], /* CJK Ideograph Extension A */ + ["\u4741", "\u4741"], /* CJK Ideograph Extension A */ + ["\u4742", "\u4742"], /* CJK Ideograph Extension A */ + ["\u4743", "\u4743"], /* CJK Ideograph Extension A */ + ["\u4744", "\u4744"], /* CJK Ideograph Extension A */ + ["\u4745", "\u4745"], /* CJK Ideograph Extension A */ + ["\u4746", "\u4746"], /* CJK Ideograph Extension A */ + ["\u4747", "\u4747"], /* CJK Ideograph Extension A */ + ["\u4748", "\u4748"], /* CJK Ideograph Extension A */ + ["\u4749", "\u4749"], /* CJK Ideograph Extension A */ + ["\u474A", "\u474A"], /* CJK Ideograph Extension A */ + ["\u474B", "\u474B"], /* CJK Ideograph Extension A */ + ["\u474C", "\u474C"], /* CJK Ideograph Extension A */ + ["\u474D", "\u474D"], /* CJK Ideograph Extension A */ + ["\u474E", "\u474E"], /* CJK Ideograph Extension A */ + ["\u474F", "\u474F"], /* CJK Ideograph Extension A */ + ["\u4750", "\u4750"], /* CJK Ideograph Extension A */ + ["\u4751", "\u4751"], /* CJK Ideograph Extension A */ + ["\u4752", "\u4752"], /* CJK Ideograph Extension A */ + ["\u4753", "\u4753"], /* CJK Ideograph Extension A */ + ["\u4754", "\u4754"], /* CJK Ideograph Extension A */ + ["\u4755", "\u4755"], /* CJK Ideograph Extension A */ + ["\u4756", "\u4756"], /* CJK Ideograph Extension A */ + ["\u4757", "\u4757"], /* CJK Ideograph Extension A */ + ["\u4758", "\u4758"], /* CJK Ideograph Extension A */ + ["\u4759", "\u4759"], /* CJK Ideograph Extension A */ + ["\u475A", "\u475A"], /* CJK Ideograph Extension A */ + ["\u475B", "\u475B"], /* CJK Ideograph Extension A */ + ["\u475C", "\u475C"], /* CJK Ideograph Extension A */ + ["\u475D", "\u475D"], /* CJK Ideograph Extension A */ + ["\u475E", "\u475E"], /* CJK Ideograph Extension A */ + ["\u475F", "\u475F"], /* CJK Ideograph Extension A */ + ["\u4760", "\u4760"], /* CJK Ideograph Extension A */ + ["\u4761", "\u4761"], /* CJK Ideograph Extension A */ + ["\u4762", "\u4762"], /* CJK Ideograph Extension A */ + ["\u4763", "\u4763"], /* CJK Ideograph Extension A */ + ["\u4764", "\u4764"], /* CJK Ideograph Extension A */ + ["\u4765", "\u4765"], /* CJK Ideograph Extension A */ + ["\u4766", "\u4766"], /* CJK Ideograph Extension A */ + ["\u4767", "\u4767"], /* CJK Ideograph Extension A */ + ["\u4768", "\u4768"], /* CJK Ideograph Extension A */ + ["\u4769", "\u4769"], /* CJK Ideograph Extension A */ + ["\u476A", "\u476A"], /* CJK Ideograph Extension A */ + ["\u476B", "\u476B"], /* CJK Ideograph Extension A */ + ["\u476C", "\u476C"], /* CJK Ideograph Extension A */ + ["\u476D", "\u476D"], /* CJK Ideograph Extension A */ + ["\u476E", "\u476E"], /* CJK Ideograph Extension A */ + ["\u476F", "\u476F"], /* CJK Ideograph Extension A */ + ["\u4770", "\u4770"], /* CJK Ideograph Extension A */ + ["\u4771", "\u4771"], /* CJK Ideograph Extension A */ + ["\u4772", "\u4772"], /* CJK Ideograph Extension A */ + ["\u4773", "\u4773"], /* CJK Ideograph Extension A */ + ["\u4774", "\u4774"], /* CJK Ideograph Extension A */ + ["\u4775", "\u4775"], /* CJK Ideograph Extension A */ + ["\u4776", "\u4776"], /* CJK Ideograph Extension A */ + ["\u4777", "\u4777"], /* CJK Ideograph Extension A */ + ["\u4778", "\u4778"], /* CJK Ideograph Extension A */ + ["\u4779", "\u4779"], /* CJK Ideograph Extension A */ + ["\u477A", "\u477A"], /* CJK Ideograph Extension A */ + ["\u477B", "\u477B"], /* CJK Ideograph Extension A */ + ["\u477C", "\u477C"], /* CJK Ideograph Extension A */ + ["\u477D", "\u477D"], /* CJK Ideograph Extension A */ + ["\u477E", "\u477E"], /* CJK Ideograph Extension A */ + ["\u477F", "\u477F"], /* CJK Ideograph Extension A */ + ["\u4780", "\u4780"], /* CJK Ideograph Extension A */ + ["\u4781", "\u4781"], /* CJK Ideograph Extension A */ + ["\u4782", "\u4782"], /* CJK Ideograph Extension A */ + ["\u4783", "\u4783"], /* CJK Ideograph Extension A */ + ["\u4784", "\u4784"], /* CJK Ideograph Extension A */ + ["\u4785", "\u4785"], /* CJK Ideograph Extension A */ + ["\u4786", "\u4786"], /* CJK Ideograph Extension A */ + ["\u4787", "\u4787"], /* CJK Ideograph Extension A */ + ["\u4788", "\u4788"], /* CJK Ideograph Extension A */ + ["\u4789", "\u4789"], /* CJK Ideograph Extension A */ + ["\u478A", "\u478A"], /* CJK Ideograph Extension A */ + ["\u478B", "\u478B"], /* CJK Ideograph Extension A */ + ["\u478C", "\u478C"], /* CJK Ideograph Extension A */ + ["\u478D", "\u478D"], /* CJK Ideograph Extension A */ + ["\u478E", "\u478E"], /* CJK Ideograph Extension A */ + ["\u478F", "\u478F"], /* CJK Ideograph Extension A */ + ["\u4790", "\u4790"], /* CJK Ideograph Extension A */ + ["\u4791", "\u4791"], /* CJK Ideograph Extension A */ + ["\u4792", "\u4792"], /* CJK Ideograph Extension A */ + ["\u4793", "\u4793"], /* CJK Ideograph Extension A */ + ["\u4794", "\u4794"], /* CJK Ideograph Extension A */ + ["\u4795", "\u4795"], /* CJK Ideograph Extension A */ + ["\u4796", "\u4796"], /* CJK Ideograph Extension A */ + ["\u4797", "\u4797"], /* CJK Ideograph Extension A */ + ["\u4798", "\u4798"], /* CJK Ideograph Extension A */ + ["\u4799", "\u4799"], /* CJK Ideograph Extension A */ + ["\u479A", "\u479A"], /* CJK Ideograph Extension A */ + ["\u479B", "\u479B"], /* CJK Ideograph Extension A */ + ["\u479C", "\u479C"], /* CJK Ideograph Extension A */ + ["\u479D", "\u479D"], /* CJK Ideograph Extension A */ + ["\u479E", "\u479E"], /* CJK Ideograph Extension A */ + ["\u479F", "\u479F"], /* CJK Ideograph Extension A */ + ["\u47A0", "\u47A0"], /* CJK Ideograph Extension A */ + ["\u47A1", "\u47A1"], /* CJK Ideograph Extension A */ + ["\u47A2", "\u47A2"], /* CJK Ideograph Extension A */ + ["\u47A3", "\u47A3"], /* CJK Ideograph Extension A */ + ["\u47A4", "\u47A4"], /* CJK Ideograph Extension A */ + ["\u47A5", "\u47A5"], /* CJK Ideograph Extension A */ + ["\u47A6", "\u47A6"], /* CJK Ideograph Extension A */ + ["\u47A7", "\u47A7"], /* CJK Ideograph Extension A */ + ["\u47A8", "\u47A8"], /* CJK Ideograph Extension A */ + ["\u47A9", "\u47A9"], /* CJK Ideograph Extension A */ + ["\u47AA", "\u47AA"], /* CJK Ideograph Extension A */ + ["\u47AB", "\u47AB"], /* CJK Ideograph Extension A */ + ["\u47AC", "\u47AC"], /* CJK Ideograph Extension A */ + ["\u47AD", "\u47AD"], /* CJK Ideograph Extension A */ + ["\u47AE", "\u47AE"], /* CJK Ideograph Extension A */ + ["\u47AF", "\u47AF"], /* CJK Ideograph Extension A */ + ["\u47B0", "\u47B0"], /* CJK Ideograph Extension A */ + ["\u47B1", "\u47B1"], /* CJK Ideograph Extension A */ + ["\u47B2", "\u47B2"], /* CJK Ideograph Extension A */ + ["\u47B3", "\u47B3"], /* CJK Ideograph Extension A */ + ["\u47B4", "\u47B4"], /* CJK Ideograph Extension A */ + ["\u47B5", "\u47B5"], /* CJK Ideograph Extension A */ + ["\u47B6", "\u47B6"], /* CJK Ideograph Extension A */ + ["\u47B7", "\u47B7"], /* CJK Ideograph Extension A */ + ["\u47B8", "\u47B8"], /* CJK Ideograph Extension A */ + ["\u47B9", "\u47B9"], /* CJK Ideograph Extension A */ + ["\u47BA", "\u47BA"], /* CJK Ideograph Extension A */ + ["\u47BB", "\u47BB"], /* CJK Ideograph Extension A */ + ["\u47BC", "\u47BC"], /* CJK Ideograph Extension A */ + ["\u47BD", "\u47BD"], /* CJK Ideograph Extension A */ + ["\u47BE", "\u47BE"], /* CJK Ideograph Extension A */ + ["\u47BF", "\u47BF"], /* CJK Ideograph Extension A */ + ["\u47C0", "\u47C0"], /* CJK Ideograph Extension A */ + ["\u47C1", "\u47C1"], /* CJK Ideograph Extension A */ + ["\u47C2", "\u47C2"], /* CJK Ideograph Extension A */ + ["\u47C3", "\u47C3"], /* CJK Ideograph Extension A */ + ["\u47C4", "\u47C4"], /* CJK Ideograph Extension A */ + ["\u47C5", "\u47C5"], /* CJK Ideograph Extension A */ + ["\u47C6", "\u47C6"], /* CJK Ideograph Extension A */ + ["\u47C7", "\u47C7"], /* CJK Ideograph Extension A */ + ["\u47C8", "\u47C8"], /* CJK Ideograph Extension A */ + ["\u47C9", "\u47C9"], /* CJK Ideograph Extension A */ + ["\u47CA", "\u47CA"], /* CJK Ideograph Extension A */ + ["\u47CB", "\u47CB"], /* CJK Ideograph Extension A */ + ["\u47CC", "\u47CC"], /* CJK Ideograph Extension A */ + ["\u47CD", "\u47CD"], /* CJK Ideograph Extension A */ + ["\u47CE", "\u47CE"], /* CJK Ideograph Extension A */ + ["\u47CF", "\u47CF"], /* CJK Ideograph Extension A */ + ["\u47D0", "\u47D0"], /* CJK Ideograph Extension A */ + ["\u47D1", "\u47D1"], /* CJK Ideograph Extension A */ + ["\u47D2", "\u47D2"], /* CJK Ideograph Extension A */ + ["\u47D3", "\u47D3"], /* CJK Ideograph Extension A */ + ["\u47D4", "\u47D4"], /* CJK Ideograph Extension A */ + ["\u47D5", "\u47D5"], /* CJK Ideograph Extension A */ + ["\u47D6", "\u47D6"], /* CJK Ideograph Extension A */ + ["\u47D7", "\u47D7"], /* CJK Ideograph Extension A */ + ["\u47D8", "\u47D8"], /* CJK Ideograph Extension A */ + ["\u47D9", "\u47D9"], /* CJK Ideograph Extension A */ + ["\u47DA", "\u47DA"], /* CJK Ideograph Extension A */ + ["\u47DB", "\u47DB"], /* CJK Ideograph Extension A */ + ["\u47DC", "\u47DC"], /* CJK Ideograph Extension A */ + ["\u47DD", "\u47DD"], /* CJK Ideograph Extension A */ + ["\u47DE", "\u47DE"], /* CJK Ideograph Extension A */ + ["\u47DF", "\u47DF"], /* CJK Ideograph Extension A */ + ["\u47E0", "\u47E0"], /* CJK Ideograph Extension A */ + ["\u47E1", "\u47E1"], /* CJK Ideograph Extension A */ + ["\u47E2", "\u47E2"], /* CJK Ideograph Extension A */ + ["\u47E3", "\u47E3"], /* CJK Ideograph Extension A */ + ["\u47E4", "\u47E4"], /* CJK Ideograph Extension A */ + ["\u47E5", "\u47E5"], /* CJK Ideograph Extension A */ + ["\u47E6", "\u47E6"], /* CJK Ideograph Extension A */ + ["\u47E7", "\u47E7"], /* CJK Ideograph Extension A */ + ["\u47E8", "\u47E8"], /* CJK Ideograph Extension A */ + ["\u47E9", "\u47E9"], /* CJK Ideograph Extension A */ + ["\u47EA", "\u47EA"], /* CJK Ideograph Extension A */ + ["\u47EB", "\u47EB"], /* CJK Ideograph Extension A */ + ["\u47EC", "\u47EC"], /* CJK Ideograph Extension A */ + ["\u47ED", "\u47ED"], /* CJK Ideograph Extension A */ + ["\u47EE", "\u47EE"], /* CJK Ideograph Extension A */ + ["\u47EF", "\u47EF"], /* CJK Ideograph Extension A */ + ["\u47F0", "\u47F0"], /* CJK Ideograph Extension A */ + ["\u47F1", "\u47F1"], /* CJK Ideograph Extension A */ + ["\u47F2", "\u47F2"], /* CJK Ideograph Extension A */ + ["\u47F3", "\u47F3"], /* CJK Ideograph Extension A */ + ["\u47F4", "\u47F4"], /* CJK Ideograph Extension A */ + ["\u47F5", "\u47F5"], /* CJK Ideograph Extension A */ + ["\u47F6", "\u47F6"], /* CJK Ideograph Extension A */ + ["\u47F7", "\u47F7"], /* CJK Ideograph Extension A */ + ["\u47F8", "\u47F8"], /* CJK Ideograph Extension A */ + ["\u47F9", "\u47F9"], /* CJK Ideograph Extension A */ + ["\u47FA", "\u47FA"], /* CJK Ideograph Extension A */ + ["\u47FB", "\u47FB"], /* CJK Ideograph Extension A */ + ["\u47FC", "\u47FC"], /* CJK Ideograph Extension A */ + ["\u47FD", "\u47FD"], /* CJK Ideograph Extension A */ + ["\u47FE", "\u47FE"], /* CJK Ideograph Extension A */ + ["\u47FF", "\u47FF"], /* CJK Ideograph Extension A */ + ["\u4800", "\u4800"], /* CJK Ideograph Extension A */ + ["\u4801", "\u4801"], /* CJK Ideograph Extension A */ + ["\u4802", "\u4802"], /* CJK Ideograph Extension A */ + ["\u4803", "\u4803"], /* CJK Ideograph Extension A */ + ["\u4804", "\u4804"], /* CJK Ideograph Extension A */ + ["\u4805", "\u4805"], /* CJK Ideograph Extension A */ + ["\u4806", "\u4806"], /* CJK Ideograph Extension A */ + ["\u4807", "\u4807"], /* CJK Ideograph Extension A */ + ["\u4808", "\u4808"], /* CJK Ideograph Extension A */ + ["\u4809", "\u4809"], /* CJK Ideograph Extension A */ + ["\u480A", "\u480A"], /* CJK Ideograph Extension A */ + ["\u480B", "\u480B"], /* CJK Ideograph Extension A */ + ["\u480C", "\u480C"], /* CJK Ideograph Extension A */ + ["\u480D", "\u480D"], /* CJK Ideograph Extension A */ + ["\u480E", "\u480E"], /* CJK Ideograph Extension A */ + ["\u480F", "\u480F"], /* CJK Ideograph Extension A */ + ["\u4810", "\u4810"], /* CJK Ideograph Extension A */ + ["\u4811", "\u4811"], /* CJK Ideograph Extension A */ + ["\u4812", "\u4812"], /* CJK Ideograph Extension A */ + ["\u4813", "\u4813"], /* CJK Ideograph Extension A */ + ["\u4814", "\u4814"], /* CJK Ideograph Extension A */ + ["\u4815", "\u4815"], /* CJK Ideograph Extension A */ + ["\u4816", "\u4816"], /* CJK Ideograph Extension A */ + ["\u4817", "\u4817"], /* CJK Ideograph Extension A */ + ["\u4818", "\u4818"], /* CJK Ideograph Extension A */ + ["\u4819", "\u4819"], /* CJK Ideograph Extension A */ + ["\u481A", "\u481A"], /* CJK Ideograph Extension A */ + ["\u481B", "\u481B"], /* CJK Ideograph Extension A */ + ["\u481C", "\u481C"], /* CJK Ideograph Extension A */ + ["\u481D", "\u481D"], /* CJK Ideograph Extension A */ + ["\u481E", "\u481E"], /* CJK Ideograph Extension A */ + ["\u481F", "\u481F"], /* CJK Ideograph Extension A */ + ["\u4820", "\u4820"], /* CJK Ideograph Extension A */ + ["\u4821", "\u4821"], /* CJK Ideograph Extension A */ + ["\u4822", "\u4822"], /* CJK Ideograph Extension A */ + ["\u4823", "\u4823"], /* CJK Ideograph Extension A */ + ["\u4824", "\u4824"], /* CJK Ideograph Extension A */ + ["\u4825", "\u4825"], /* CJK Ideograph Extension A */ + ["\u4826", "\u4826"], /* CJK Ideograph Extension A */ + ["\u4827", "\u4827"], /* CJK Ideograph Extension A */ + ["\u4828", "\u4828"], /* CJK Ideograph Extension A */ + ["\u4829", "\u4829"], /* CJK Ideograph Extension A */ + ["\u482A", "\u482A"], /* CJK Ideograph Extension A */ + ["\u482B", "\u482B"], /* CJK Ideograph Extension A */ + ["\u482C", "\u482C"], /* CJK Ideograph Extension A */ + ["\u482D", "\u482D"], /* CJK Ideograph Extension A */ + ["\u482E", "\u482E"], /* CJK Ideograph Extension A */ + ["\u482F", "\u482F"], /* CJK Ideograph Extension A */ + ["\u4830", "\u4830"], /* CJK Ideograph Extension A */ + ["\u4831", "\u4831"], /* CJK Ideograph Extension A */ + ["\u4832", "\u4832"], /* CJK Ideograph Extension A */ + ["\u4833", "\u4833"], /* CJK Ideograph Extension A */ + ["\u4834", "\u4834"], /* CJK Ideograph Extension A */ + ["\u4835", "\u4835"], /* CJK Ideograph Extension A */ + ["\u4836", "\u4836"], /* CJK Ideograph Extension A */ + ["\u4837", "\u4837"], /* CJK Ideograph Extension A */ + ["\u4838", "\u4838"], /* CJK Ideograph Extension A */ + ["\u4839", "\u4839"], /* CJK Ideograph Extension A */ + ["\u483A", "\u483A"], /* CJK Ideograph Extension A */ + ["\u483B", "\u483B"], /* CJK Ideograph Extension A */ + ["\u483C", "\u483C"], /* CJK Ideograph Extension A */ + ["\u483D", "\u483D"], /* CJK Ideograph Extension A */ + ["\u483E", "\u483E"], /* CJK Ideograph Extension A */ + ["\u483F", "\u483F"], /* CJK Ideograph Extension A */ + ["\u4840", "\u4840"], /* CJK Ideograph Extension A */ + ["\u4841", "\u4841"], /* CJK Ideograph Extension A */ + ["\u4842", "\u4842"], /* CJK Ideograph Extension A */ + ["\u4843", "\u4843"], /* CJK Ideograph Extension A */ + ["\u4844", "\u4844"], /* CJK Ideograph Extension A */ + ["\u4845", "\u4845"], /* CJK Ideograph Extension A */ + ["\u4846", "\u4846"], /* CJK Ideograph Extension A */ + ["\u4847", "\u4847"], /* CJK Ideograph Extension A */ + ["\u4848", "\u4848"], /* CJK Ideograph Extension A */ + ["\u4849", "\u4849"], /* CJK Ideograph Extension A */ + ["\u484A", "\u484A"], /* CJK Ideograph Extension A */ + ["\u484B", "\u484B"], /* CJK Ideograph Extension A */ + ["\u484C", "\u484C"], /* CJK Ideograph Extension A */ + ["\u484D", "\u484D"], /* CJK Ideograph Extension A */ + ["\u484E", "\u484E"], /* CJK Ideograph Extension A */ + ["\u484F", "\u484F"], /* CJK Ideograph Extension A */ + ["\u4850", "\u4850"], /* CJK Ideograph Extension A */ + ["\u4851", "\u4851"], /* CJK Ideograph Extension A */ + ["\u4852", "\u4852"], /* CJK Ideograph Extension A */ + ["\u4853", "\u4853"], /* CJK Ideograph Extension A */ + ["\u4854", "\u4854"], /* CJK Ideograph Extension A */ + ["\u4855", "\u4855"], /* CJK Ideograph Extension A */ + ["\u4856", "\u4856"], /* CJK Ideograph Extension A */ + ["\u4857", "\u4857"], /* CJK Ideograph Extension A */ + ["\u4858", "\u4858"], /* CJK Ideograph Extension A */ + ["\u4859", "\u4859"], /* CJK Ideograph Extension A */ + ["\u485A", "\u485A"], /* CJK Ideograph Extension A */ + ["\u485B", "\u485B"], /* CJK Ideograph Extension A */ + ["\u485C", "\u485C"], /* CJK Ideograph Extension A */ + ["\u485D", "\u485D"], /* CJK Ideograph Extension A */ + ["\u485E", "\u485E"], /* CJK Ideograph Extension A */ + ["\u485F", "\u485F"], /* CJK Ideograph Extension A */ + ["\u4860", "\u4860"], /* CJK Ideograph Extension A */ + ["\u4861", "\u4861"], /* CJK Ideograph Extension A */ + ["\u4862", "\u4862"], /* CJK Ideograph Extension A */ + ["\u4863", "\u4863"], /* CJK Ideograph Extension A */ + ["\u4864", "\u4864"], /* CJK Ideograph Extension A */ + ["\u4865", "\u4865"], /* CJK Ideograph Extension A */ + ["\u4866", "\u4866"], /* CJK Ideograph Extension A */ + ["\u4867", "\u4867"], /* CJK Ideograph Extension A */ + ["\u4868", "\u4868"], /* CJK Ideograph Extension A */ + ["\u4869", "\u4869"], /* CJK Ideograph Extension A */ + ["\u486A", "\u486A"], /* CJK Ideograph Extension A */ + ["\u486B", "\u486B"], /* CJK Ideograph Extension A */ + ["\u486C", "\u486C"], /* CJK Ideograph Extension A */ + ["\u486D", "\u486D"], /* CJK Ideograph Extension A */ + ["\u486E", "\u486E"], /* CJK Ideograph Extension A */ + ["\u486F", "\u486F"], /* CJK Ideograph Extension A */ + ["\u4870", "\u4870"], /* CJK Ideograph Extension A */ + ["\u4871", "\u4871"], /* CJK Ideograph Extension A */ + ["\u4872", "\u4872"], /* CJK Ideograph Extension A */ + ["\u4873", "\u4873"], /* CJK Ideograph Extension A */ + ["\u4874", "\u4874"], /* CJK Ideograph Extension A */ + ["\u4875", "\u4875"], /* CJK Ideograph Extension A */ + ["\u4876", "\u4876"], /* CJK Ideograph Extension A */ + ["\u4877", "\u4877"], /* CJK Ideograph Extension A */ + ["\u4878", "\u4878"], /* CJK Ideograph Extension A */ + ["\u4879", "\u4879"], /* CJK Ideograph Extension A */ + ["\u487A", "\u487A"], /* CJK Ideograph Extension A */ + ["\u487B", "\u487B"], /* CJK Ideograph Extension A */ + ["\u487C", "\u487C"], /* CJK Ideograph Extension A */ + ["\u487D", "\u487D"], /* CJK Ideograph Extension A */ + ["\u487E", "\u487E"], /* CJK Ideograph Extension A */ + ["\u487F", "\u487F"], /* CJK Ideograph Extension A */ + ["\u4880", "\u4880"], /* CJK Ideograph Extension A */ + ["\u4881", "\u4881"], /* CJK Ideograph Extension A */ + ["\u4882", "\u4882"], /* CJK Ideograph Extension A */ + ["\u4883", "\u4883"], /* CJK Ideograph Extension A */ + ["\u4884", "\u4884"], /* CJK Ideograph Extension A */ + ["\u4885", "\u4885"], /* CJK Ideograph Extension A */ + ["\u4886", "\u4886"], /* CJK Ideograph Extension A */ + ["\u4887", "\u4887"], /* CJK Ideograph Extension A */ + ["\u4888", "\u4888"], /* CJK Ideograph Extension A */ + ["\u4889", "\u4889"], /* CJK Ideograph Extension A */ + ["\u488A", "\u488A"], /* CJK Ideograph Extension A */ + ["\u488B", "\u488B"], /* CJK Ideograph Extension A */ + ["\u488C", "\u488C"], /* CJK Ideograph Extension A */ + ["\u488D", "\u488D"], /* CJK Ideograph Extension A */ + ["\u488E", "\u488E"], /* CJK Ideograph Extension A */ + ["\u488F", "\u488F"], /* CJK Ideograph Extension A */ + ["\u4890", "\u4890"], /* CJK Ideograph Extension A */ + ["\u4891", "\u4891"], /* CJK Ideograph Extension A */ + ["\u4892", "\u4892"], /* CJK Ideograph Extension A */ + ["\u4893", "\u4893"], /* CJK Ideograph Extension A */ + ["\u4894", "\u4894"], /* CJK Ideograph Extension A */ + ["\u4895", "\u4895"], /* CJK Ideograph Extension A */ + ["\u4896", "\u4896"], /* CJK Ideograph Extension A */ + ["\u4897", "\u4897"], /* CJK Ideograph Extension A */ + ["\u4898", "\u4898"], /* CJK Ideograph Extension A */ + ["\u4899", "\u4899"], /* CJK Ideograph Extension A */ + ["\u489A", "\u489A"], /* CJK Ideograph Extension A */ + ["\u489B", "\u489B"], /* CJK Ideograph Extension A */ + ["\u489C", "\u489C"], /* CJK Ideograph Extension A */ + ["\u489D", "\u489D"], /* CJK Ideograph Extension A */ + ["\u489E", "\u489E"], /* CJK Ideograph Extension A */ + ["\u489F", "\u489F"], /* CJK Ideograph Extension A */ + ["\u48A0", "\u48A0"], /* CJK Ideograph Extension A */ + ["\u48A1", "\u48A1"], /* CJK Ideograph Extension A */ + ["\u48A2", "\u48A2"], /* CJK Ideograph Extension A */ + ["\u48A3", "\u48A3"], /* CJK Ideograph Extension A */ + ["\u48A4", "\u48A4"], /* CJK Ideograph Extension A */ + ["\u48A5", "\u48A5"], /* CJK Ideograph Extension A */ + ["\u48A6", "\u48A6"], /* CJK Ideograph Extension A */ + ["\u48A7", "\u48A7"], /* CJK Ideograph Extension A */ + ["\u48A8", "\u48A8"], /* CJK Ideograph Extension A */ + ["\u48A9", "\u48A9"], /* CJK Ideograph Extension A */ + ["\u48AA", "\u48AA"], /* CJK Ideograph Extension A */ + ["\u48AB", "\u48AB"], /* CJK Ideograph Extension A */ + ["\u48AC", "\u48AC"], /* CJK Ideograph Extension A */ + ["\u48AD", "\u48AD"], /* CJK Ideograph Extension A */ + ["\u48AE", "\u48AE"], /* CJK Ideograph Extension A */ + ["\u48AF", "\u48AF"], /* CJK Ideograph Extension A */ + ["\u48B0", "\u48B0"], /* CJK Ideograph Extension A */ + ["\u48B1", "\u48B1"], /* CJK Ideograph Extension A */ + ["\u48B2", "\u48B2"], /* CJK Ideograph Extension A */ + ["\u48B3", "\u48B3"], /* CJK Ideograph Extension A */ + ["\u48B4", "\u48B4"], /* CJK Ideograph Extension A */ + ["\u48B5", "\u48B5"], /* CJK Ideograph Extension A */ + ["\u48B6", "\u48B6"], /* CJK Ideograph Extension A */ + ["\u48B7", "\u48B7"], /* CJK Ideograph Extension A */ + ["\u48B8", "\u48B8"], /* CJK Ideograph Extension A */ + ["\u48B9", "\u48B9"], /* CJK Ideograph Extension A */ + ["\u48BA", "\u48BA"], /* CJK Ideograph Extension A */ + ["\u48BB", "\u48BB"], /* CJK Ideograph Extension A */ + ["\u48BC", "\u48BC"], /* CJK Ideograph Extension A */ + ["\u48BD", "\u48BD"], /* CJK Ideograph Extension A */ + ["\u48BE", "\u48BE"], /* CJK Ideograph Extension A */ + ["\u48BF", "\u48BF"], /* CJK Ideograph Extension A */ + ["\u48C0", "\u48C0"], /* CJK Ideograph Extension A */ + ["\u48C1", "\u48C1"], /* CJK Ideograph Extension A */ + ["\u48C2", "\u48C2"], /* CJK Ideograph Extension A */ + ["\u48C3", "\u48C3"], /* CJK Ideograph Extension A */ + ["\u48C4", "\u48C4"], /* CJK Ideograph Extension A */ + ["\u48C5", "\u48C5"], /* CJK Ideograph Extension A */ + ["\u48C6", "\u48C6"], /* CJK Ideograph Extension A */ + ["\u48C7", "\u48C7"], /* CJK Ideograph Extension A */ + ["\u48C8", "\u48C8"], /* CJK Ideograph Extension A */ + ["\u48C9", "\u48C9"], /* CJK Ideograph Extension A */ + ["\u48CA", "\u48CA"], /* CJK Ideograph Extension A */ + ["\u48CB", "\u48CB"], /* CJK Ideograph Extension A */ + ["\u48CC", "\u48CC"], /* CJK Ideograph Extension A */ + ["\u48CD", "\u48CD"], /* CJK Ideograph Extension A */ + ["\u48CE", "\u48CE"], /* CJK Ideograph Extension A */ + ["\u48CF", "\u48CF"], /* CJK Ideograph Extension A */ + ["\u48D0", "\u48D0"], /* CJK Ideograph Extension A */ + ["\u48D1", "\u48D1"], /* CJK Ideograph Extension A */ + ["\u48D2", "\u48D2"], /* CJK Ideograph Extension A */ + ["\u48D3", "\u48D3"], /* CJK Ideograph Extension A */ + ["\u48D4", "\u48D4"], /* CJK Ideograph Extension A */ + ["\u48D5", "\u48D5"], /* CJK Ideograph Extension A */ + ["\u48D6", "\u48D6"], /* CJK Ideograph Extension A */ + ["\u48D7", "\u48D7"], /* CJK Ideograph Extension A */ + ["\u48D8", "\u48D8"], /* CJK Ideograph Extension A */ + ["\u48D9", "\u48D9"], /* CJK Ideograph Extension A */ + ["\u48DA", "\u48DA"], /* CJK Ideograph Extension A */ + ["\u48DB", "\u48DB"], /* CJK Ideograph Extension A */ + ["\u48DC", "\u48DC"], /* CJK Ideograph Extension A */ + ["\u48DD", "\u48DD"], /* CJK Ideograph Extension A */ + ["\u48DE", "\u48DE"], /* CJK Ideograph Extension A */ + ["\u48DF", "\u48DF"], /* CJK Ideograph Extension A */ + ["\u48E0", "\u48E0"], /* CJK Ideograph Extension A */ + ["\u48E1", "\u48E1"], /* CJK Ideograph Extension A */ + ["\u48E2", "\u48E2"], /* CJK Ideograph Extension A */ + ["\u48E3", "\u48E3"], /* CJK Ideograph Extension A */ + ["\u48E4", "\u48E4"], /* CJK Ideograph Extension A */ + ["\u48E5", "\u48E5"], /* CJK Ideograph Extension A */ + ["\u48E6", "\u48E6"], /* CJK Ideograph Extension A */ + ["\u48E7", "\u48E7"], /* CJK Ideograph Extension A */ + ["\u48E8", "\u48E8"], /* CJK Ideograph Extension A */ + ["\u48E9", "\u48E9"], /* CJK Ideograph Extension A */ + ["\u48EA", "\u48EA"], /* CJK Ideograph Extension A */ + ["\u48EB", "\u48EB"], /* CJK Ideograph Extension A */ + ["\u48EC", "\u48EC"], /* CJK Ideograph Extension A */ + ["\u48ED", "\u48ED"], /* CJK Ideograph Extension A */ + ["\u48EE", "\u48EE"], /* CJK Ideograph Extension A */ + ["\u48EF", "\u48EF"], /* CJK Ideograph Extension A */ + ["\u48F0", "\u48F0"], /* CJK Ideograph Extension A */ + ["\u48F1", "\u48F1"], /* CJK Ideograph Extension A */ + ["\u48F2", "\u48F2"], /* CJK Ideograph Extension A */ + ["\u48F3", "\u48F3"], /* CJK Ideograph Extension A */ + ["\u48F4", "\u48F4"], /* CJK Ideograph Extension A */ + ["\u48F5", "\u48F5"], /* CJK Ideograph Extension A */ + ["\u48F6", "\u48F6"], /* CJK Ideograph Extension A */ + ["\u48F7", "\u48F7"], /* CJK Ideograph Extension A */ + ["\u48F8", "\u48F8"], /* CJK Ideograph Extension A */ + ["\u48F9", "\u48F9"], /* CJK Ideograph Extension A */ + ["\u48FA", "\u48FA"], /* CJK Ideograph Extension A */ + ["\u48FB", "\u48FB"], /* CJK Ideograph Extension A */ + ["\u48FC", "\u48FC"], /* CJK Ideograph Extension A */ + ["\u48FD", "\u48FD"], /* CJK Ideograph Extension A */ + ["\u48FE", "\u48FE"], /* CJK Ideograph Extension A */ + ["\u48FF", "\u48FF"], /* CJK Ideograph Extension A */ + ["\u4900", "\u4900"], /* CJK Ideograph Extension A */ + ["\u4901", "\u4901"], /* CJK Ideograph Extension A */ + ["\u4902", "\u4902"], /* CJK Ideograph Extension A */ + ["\u4903", "\u4903"], /* CJK Ideograph Extension A */ + ["\u4904", "\u4904"], /* CJK Ideograph Extension A */ + ["\u4905", "\u4905"], /* CJK Ideograph Extension A */ + ["\u4906", "\u4906"], /* CJK Ideograph Extension A */ + ["\u4907", "\u4907"], /* CJK Ideograph Extension A */ + ["\u4908", "\u4908"], /* CJK Ideograph Extension A */ + ["\u4909", "\u4909"], /* CJK Ideograph Extension A */ + ["\u490A", "\u490A"], /* CJK Ideograph Extension A */ + ["\u490B", "\u490B"], /* CJK Ideograph Extension A */ + ["\u490C", "\u490C"], /* CJK Ideograph Extension A */ + ["\u490D", "\u490D"], /* CJK Ideograph Extension A */ + ["\u490E", "\u490E"], /* CJK Ideograph Extension A */ + ["\u490F", "\u490F"], /* CJK Ideograph Extension A */ + ["\u4910", "\u4910"], /* CJK Ideograph Extension A */ + ["\u4911", "\u4911"], /* CJK Ideograph Extension A */ + ["\u4912", "\u4912"], /* CJK Ideograph Extension A */ + ["\u4913", "\u4913"], /* CJK Ideograph Extension A */ + ["\u4914", "\u4914"], /* CJK Ideograph Extension A */ + ["\u4915", "\u4915"], /* CJK Ideograph Extension A */ + ["\u4916", "\u4916"], /* CJK Ideograph Extension A */ + ["\u4917", "\u4917"], /* CJK Ideograph Extension A */ + ["\u4918", "\u4918"], /* CJK Ideograph Extension A */ + ["\u4919", "\u4919"], /* CJK Ideograph Extension A */ + ["\u491A", "\u491A"], /* CJK Ideograph Extension A */ + ["\u491B", "\u491B"], /* CJK Ideograph Extension A */ + ["\u491C", "\u491C"], /* CJK Ideograph Extension A */ + ["\u491D", "\u491D"], /* CJK Ideograph Extension A */ + ["\u491E", "\u491E"], /* CJK Ideograph Extension A */ + ["\u491F", "\u491F"], /* CJK Ideograph Extension A */ + ["\u4920", "\u4920"], /* CJK Ideograph Extension A */ + ["\u4921", "\u4921"], /* CJK Ideograph Extension A */ + ["\u4922", "\u4922"], /* CJK Ideograph Extension A */ + ["\u4923", "\u4923"], /* CJK Ideograph Extension A */ + ["\u4924", "\u4924"], /* CJK Ideograph Extension A */ + ["\u4925", "\u4925"], /* CJK Ideograph Extension A */ + ["\u4926", "\u4926"], /* CJK Ideograph Extension A */ + ["\u4927", "\u4927"], /* CJK Ideograph Extension A */ + ["\u4928", "\u4928"], /* CJK Ideograph Extension A */ + ["\u4929", "\u4929"], /* CJK Ideograph Extension A */ + ["\u492A", "\u492A"], /* CJK Ideograph Extension A */ + ["\u492B", "\u492B"], /* CJK Ideograph Extension A */ + ["\u492C", "\u492C"], /* CJK Ideograph Extension A */ + ["\u492D", "\u492D"], /* CJK Ideograph Extension A */ + ["\u492E", "\u492E"], /* CJK Ideograph Extension A */ + ["\u492F", "\u492F"], /* CJK Ideograph Extension A */ + ["\u4930", "\u4930"], /* CJK Ideograph Extension A */ + ["\u4931", "\u4931"], /* CJK Ideograph Extension A */ + ["\u4932", "\u4932"], /* CJK Ideograph Extension A */ + ["\u4933", "\u4933"], /* CJK Ideograph Extension A */ + ["\u4934", "\u4934"], /* CJK Ideograph Extension A */ + ["\u4935", "\u4935"], /* CJK Ideograph Extension A */ + ["\u4936", "\u4936"], /* CJK Ideograph Extension A */ + ["\u4937", "\u4937"], /* CJK Ideograph Extension A */ + ["\u4938", "\u4938"], /* CJK Ideograph Extension A */ + ["\u4939", "\u4939"], /* CJK Ideograph Extension A */ + ["\u493A", "\u493A"], /* CJK Ideograph Extension A */ + ["\u493B", "\u493B"], /* CJK Ideograph Extension A */ + ["\u493C", "\u493C"], /* CJK Ideograph Extension A */ + ["\u493D", "\u493D"], /* CJK Ideograph Extension A */ + ["\u493E", "\u493E"], /* CJK Ideograph Extension A */ + ["\u493F", "\u493F"], /* CJK Ideograph Extension A */ + ["\u4940", "\u4940"], /* CJK Ideograph Extension A */ + ["\u4941", "\u4941"], /* CJK Ideograph Extension A */ + ["\u4942", "\u4942"], /* CJK Ideograph Extension A */ + ["\u4943", "\u4943"], /* CJK Ideograph Extension A */ + ["\u4944", "\u4944"], /* CJK Ideograph Extension A */ + ["\u4945", "\u4945"], /* CJK Ideograph Extension A */ + ["\u4946", "\u4946"], /* CJK Ideograph Extension A */ + ["\u4947", "\u4947"], /* CJK Ideograph Extension A */ + ["\u4948", "\u4948"], /* CJK Ideograph Extension A */ + ["\u4949", "\u4949"], /* CJK Ideograph Extension A */ + ["\u494A", "\u494A"], /* CJK Ideograph Extension A */ + ["\u494B", "\u494B"], /* CJK Ideograph Extension A */ + ["\u494C", "\u494C"], /* CJK Ideograph Extension A */ + ["\u494D", "\u494D"], /* CJK Ideograph Extension A */ + ["\u494E", "\u494E"], /* CJK Ideograph Extension A */ + ["\u494F", "\u494F"], /* CJK Ideograph Extension A */ + ["\u4950", "\u4950"], /* CJK Ideograph Extension A */ + ["\u4951", "\u4951"], /* CJK Ideograph Extension A */ + ["\u4952", "\u4952"], /* CJK Ideograph Extension A */ + ["\u4953", "\u4953"], /* CJK Ideograph Extension A */ + ["\u4954", "\u4954"], /* CJK Ideograph Extension A */ + ["\u4955", "\u4955"], /* CJK Ideograph Extension A */ + ["\u4956", "\u4956"], /* CJK Ideograph Extension A */ + ["\u4957", "\u4957"], /* CJK Ideograph Extension A */ + ["\u4958", "\u4958"], /* CJK Ideograph Extension A */ + ["\u4959", "\u4959"], /* CJK Ideograph Extension A */ + ["\u495A", "\u495A"], /* CJK Ideograph Extension A */ + ["\u495B", "\u495B"], /* CJK Ideograph Extension A */ + ["\u495C", "\u495C"], /* CJK Ideograph Extension A */ + ["\u495D", "\u495D"], /* CJK Ideograph Extension A */ + ["\u495E", "\u495E"], /* CJK Ideograph Extension A */ + ["\u495F", "\u495F"], /* CJK Ideograph Extension A */ + ["\u4960", "\u4960"], /* CJK Ideograph Extension A */ + ["\u4961", "\u4961"], /* CJK Ideograph Extension A */ + ["\u4962", "\u4962"], /* CJK Ideograph Extension A */ + ["\u4963", "\u4963"], /* CJK Ideograph Extension A */ + ["\u4964", "\u4964"], /* CJK Ideograph Extension A */ + ["\u4965", "\u4965"], /* CJK Ideograph Extension A */ + ["\u4966", "\u4966"], /* CJK Ideograph Extension A */ + ["\u4967", "\u4967"], /* CJK Ideograph Extension A */ + ["\u4968", "\u4968"], /* CJK Ideograph Extension A */ + ["\u4969", "\u4969"], /* CJK Ideograph Extension A */ + ["\u496A", "\u496A"], /* CJK Ideograph Extension A */ + ["\u496B", "\u496B"], /* CJK Ideograph Extension A */ + ["\u496C", "\u496C"], /* CJK Ideograph Extension A */ + ["\u496D", "\u496D"], /* CJK Ideograph Extension A */ + ["\u496E", "\u496E"], /* CJK Ideograph Extension A */ + ["\u496F", "\u496F"], /* CJK Ideograph Extension A */ + ["\u4970", "\u4970"], /* CJK Ideograph Extension A */ + ["\u4971", "\u4971"], /* CJK Ideograph Extension A */ + ["\u4972", "\u4972"], /* CJK Ideograph Extension A */ + ["\u4973", "\u4973"], /* CJK Ideograph Extension A */ + ["\u4974", "\u4974"], /* CJK Ideograph Extension A */ + ["\u4975", "\u4975"], /* CJK Ideograph Extension A */ + ["\u4976", "\u4976"], /* CJK Ideograph Extension A */ + ["\u4977", "\u4977"], /* CJK Ideograph Extension A */ + ["\u4978", "\u4978"], /* CJK Ideograph Extension A */ + ["\u4979", "\u4979"], /* CJK Ideograph Extension A */ + ["\u497A", "\u497A"], /* CJK Ideograph Extension A */ + ["\u497B", "\u497B"], /* CJK Ideograph Extension A */ + ["\u497C", "\u497C"], /* CJK Ideograph Extension A */ + ["\u497D", "\u497D"], /* CJK Ideograph Extension A */ + ["\u497E", "\u497E"], /* CJK Ideograph Extension A */ + ["\u497F", "\u497F"], /* CJK Ideograph Extension A */ + ["\u4980", "\u4980"], /* CJK Ideograph Extension A */ + ["\u4981", "\u4981"], /* CJK Ideograph Extension A */ + ["\u4982", "\u4982"], /* CJK Ideograph Extension A */ + ["\u4983", "\u4983"], /* CJK Ideograph Extension A */ + ["\u4984", "\u4984"], /* CJK Ideograph Extension A */ + ["\u4985", "\u4985"], /* CJK Ideograph Extension A */ + ["\u4986", "\u4986"], /* CJK Ideograph Extension A */ + ["\u4987", "\u4987"], /* CJK Ideograph Extension A */ + ["\u4988", "\u4988"], /* CJK Ideograph Extension A */ + ["\u4989", "\u4989"], /* CJK Ideograph Extension A */ + ["\u498A", "\u498A"], /* CJK Ideograph Extension A */ + ["\u498B", "\u498B"], /* CJK Ideograph Extension A */ + ["\u498C", "\u498C"], /* CJK Ideograph Extension A */ + ["\u498D", "\u498D"], /* CJK Ideograph Extension A */ + ["\u498E", "\u498E"], /* CJK Ideograph Extension A */ + ["\u498F", "\u498F"], /* CJK Ideograph Extension A */ + ["\u4990", "\u4990"], /* CJK Ideograph Extension A */ + ["\u4991", "\u4991"], /* CJK Ideograph Extension A */ + ["\u4992", "\u4992"], /* CJK Ideograph Extension A */ + ["\u4993", "\u4993"], /* CJK Ideograph Extension A */ + ["\u4994", "\u4994"], /* CJK Ideograph Extension A */ + ["\u4995", "\u4995"], /* CJK Ideograph Extension A */ + ["\u4996", "\u4996"], /* CJK Ideograph Extension A */ + ["\u4997", "\u4997"], /* CJK Ideograph Extension A */ + ["\u4998", "\u4998"], /* CJK Ideograph Extension A */ + ["\u4999", "\u4999"], /* CJK Ideograph Extension A */ + ["\u499A", "\u499A"], /* CJK Ideograph Extension A */ + ["\u499B", "\u499B"], /* CJK Ideograph Extension A */ + ["\u499C", "\u499C"], /* CJK Ideograph Extension A */ + ["\u499D", "\u499D"], /* CJK Ideograph Extension A */ + ["\u499E", "\u499E"], /* CJK Ideograph Extension A */ + ["\u499F", "\u499F"], /* CJK Ideograph Extension A */ + ["\u49A0", "\u49A0"], /* CJK Ideograph Extension A */ + ["\u49A1", "\u49A1"], /* CJK Ideograph Extension A */ + ["\u49A2", "\u49A2"], /* CJK Ideograph Extension A */ + ["\u49A3", "\u49A3"], /* CJK Ideograph Extension A */ + ["\u49A4", "\u49A4"], /* CJK Ideograph Extension A */ + ["\u49A5", "\u49A5"], /* CJK Ideograph Extension A */ + ["\u49A6", "\u49A6"], /* CJK Ideograph Extension A */ + ["\u49A7", "\u49A7"], /* CJK Ideograph Extension A */ + ["\u49A8", "\u49A8"], /* CJK Ideograph Extension A */ + ["\u49A9", "\u49A9"], /* CJK Ideograph Extension A */ + ["\u49AA", "\u49AA"], /* CJK Ideograph Extension A */ + ["\u49AB", "\u49AB"], /* CJK Ideograph Extension A */ + ["\u49AC", "\u49AC"], /* CJK Ideograph Extension A */ + ["\u49AD", "\u49AD"], /* CJK Ideograph Extension A */ + ["\u49AE", "\u49AE"], /* CJK Ideograph Extension A */ + ["\u49AF", "\u49AF"], /* CJK Ideograph Extension A */ + ["\u49B0", "\u49B0"], /* CJK Ideograph Extension A */ + ["\u49B1", "\u49B1"], /* CJK Ideograph Extension A */ + ["\u49B2", "\u49B2"], /* CJK Ideograph Extension A */ + ["\u49B3", "\u49B3"], /* CJK Ideograph Extension A */ + ["\u49B4", "\u49B4"], /* CJK Ideograph Extension A */ + ["\u49B5", "\u49B5"], /* CJK Ideograph Extension A */ + ["\u49B6", "\u49B6"], /* CJK Ideograph Extension A */ + ["\u49B7", "\u49B7"], /* CJK Ideograph Extension A */ + ["\u49B8", "\u49B8"], /* CJK Ideograph Extension A */ + ["\u49B9", "\u49B9"], /* CJK Ideograph Extension A */ + ["\u49BA", "\u49BA"], /* CJK Ideograph Extension A */ + ["\u49BB", "\u49BB"], /* CJK Ideograph Extension A */ + ["\u49BC", "\u49BC"], /* CJK Ideograph Extension A */ + ["\u49BD", "\u49BD"], /* CJK Ideograph Extension A */ + ["\u49BE", "\u49BE"], /* CJK Ideograph Extension A */ + ["\u49BF", "\u49BF"], /* CJK Ideograph Extension A */ + ["\u49C0", "\u49C0"], /* CJK Ideograph Extension A */ + ["\u49C1", "\u49C1"], /* CJK Ideograph Extension A */ + ["\u49C2", "\u49C2"], /* CJK Ideograph Extension A */ + ["\u49C3", "\u49C3"], /* CJK Ideograph Extension A */ + ["\u49C4", "\u49C4"], /* CJK Ideograph Extension A */ + ["\u49C5", "\u49C5"], /* CJK Ideograph Extension A */ + ["\u49C6", "\u49C6"], /* CJK Ideograph Extension A */ + ["\u49C7", "\u49C7"], /* CJK Ideograph Extension A */ + ["\u49C8", "\u49C8"], /* CJK Ideograph Extension A */ + ["\u49C9", "\u49C9"], /* CJK Ideograph Extension A */ + ["\u49CA", "\u49CA"], /* CJK Ideograph Extension A */ + ["\u49CB", "\u49CB"], /* CJK Ideograph Extension A */ + ["\u49CC", "\u49CC"], /* CJK Ideograph Extension A */ + ["\u49CD", "\u49CD"], /* CJK Ideograph Extension A */ + ["\u49CE", "\u49CE"], /* CJK Ideograph Extension A */ + ["\u49CF", "\u49CF"], /* CJK Ideograph Extension A */ + ["\u49D0", "\u49D0"], /* CJK Ideograph Extension A */ + ["\u49D1", "\u49D1"], /* CJK Ideograph Extension A */ + ["\u49D2", "\u49D2"], /* CJK Ideograph Extension A */ + ["\u49D3", "\u49D3"], /* CJK Ideograph Extension A */ + ["\u49D4", "\u49D4"], /* CJK Ideograph Extension A */ + ["\u49D5", "\u49D5"], /* CJK Ideograph Extension A */ + ["\u49D6", "\u49D6"], /* CJK Ideograph Extension A */ + ["\u49D7", "\u49D7"], /* CJK Ideograph Extension A */ + ["\u49D8", "\u49D8"], /* CJK Ideograph Extension A */ + ["\u49D9", "\u49D9"], /* CJK Ideograph Extension A */ + ["\u49DA", "\u49DA"], /* CJK Ideograph Extension A */ + ["\u49DB", "\u49DB"], /* CJK Ideograph Extension A */ + ["\u49DC", "\u49DC"], /* CJK Ideograph Extension A */ + ["\u49DD", "\u49DD"], /* CJK Ideograph Extension A */ + ["\u49DE", "\u49DE"], /* CJK Ideograph Extension A */ + ["\u49DF", "\u49DF"], /* CJK Ideograph Extension A */ + ["\u49E0", "\u49E0"], /* CJK Ideograph Extension A */ + ["\u49E1", "\u49E1"], /* CJK Ideograph Extension A */ + ["\u49E2", "\u49E2"], /* CJK Ideograph Extension A */ + ["\u49E3", "\u49E3"], /* CJK Ideograph Extension A */ + ["\u49E4", "\u49E4"], /* CJK Ideograph Extension A */ + ["\u49E5", "\u49E5"], /* CJK Ideograph Extension A */ + ["\u49E6", "\u49E6"], /* CJK Ideograph Extension A */ + ["\u49E7", "\u49E7"], /* CJK Ideograph Extension A */ + ["\u49E8", "\u49E8"], /* CJK Ideograph Extension A */ + ["\u49E9", "\u49E9"], /* CJK Ideograph Extension A */ + ["\u49EA", "\u49EA"], /* CJK Ideograph Extension A */ + ["\u49EB", "\u49EB"], /* CJK Ideograph Extension A */ + ["\u49EC", "\u49EC"], /* CJK Ideograph Extension A */ + ["\u49ED", "\u49ED"], /* CJK Ideograph Extension A */ + ["\u49EE", "\u49EE"], /* CJK Ideograph Extension A */ + ["\u49EF", "\u49EF"], /* CJK Ideograph Extension A */ + ["\u49F0", "\u49F0"], /* CJK Ideograph Extension A */ + ["\u49F1", "\u49F1"], /* CJK Ideograph Extension A */ + ["\u49F2", "\u49F2"], /* CJK Ideograph Extension A */ + ["\u49F3", "\u49F3"], /* CJK Ideograph Extension A */ + ["\u49F4", "\u49F4"], /* CJK Ideograph Extension A */ + ["\u49F5", "\u49F5"], /* CJK Ideograph Extension A */ + ["\u49F6", "\u49F6"], /* CJK Ideograph Extension A */ + ["\u49F7", "\u49F7"], /* CJK Ideograph Extension A */ + ["\u49F8", "\u49F8"], /* CJK Ideograph Extension A */ + ["\u49F9", "\u49F9"], /* CJK Ideograph Extension A */ + ["\u49FA", "\u49FA"], /* CJK Ideograph Extension A */ + ["\u49FB", "\u49FB"], /* CJK Ideograph Extension A */ + ["\u49FC", "\u49FC"], /* CJK Ideograph Extension A */ + ["\u49FD", "\u49FD"], /* CJK Ideograph Extension A */ + ["\u49FE", "\u49FE"], /* CJK Ideograph Extension A */ + ["\u49FF", "\u49FF"], /* CJK Ideograph Extension A */ + ["\u4A00", "\u4A00"], /* CJK Ideograph Extension A */ + ["\u4A01", "\u4A01"], /* CJK Ideograph Extension A */ + ["\u4A02", "\u4A02"], /* CJK Ideograph Extension A */ + ["\u4A03", "\u4A03"], /* CJK Ideograph Extension A */ + ["\u4A04", "\u4A04"], /* CJK Ideograph Extension A */ + ["\u4A05", "\u4A05"], /* CJK Ideograph Extension A */ + ["\u4A06", "\u4A06"], /* CJK Ideograph Extension A */ + ["\u4A07", "\u4A07"], /* CJK Ideograph Extension A */ + ["\u4A08", "\u4A08"], /* CJK Ideograph Extension A */ + ["\u4A09", "\u4A09"], /* CJK Ideograph Extension A */ + ["\u4A0A", "\u4A0A"], /* CJK Ideograph Extension A */ + ["\u4A0B", "\u4A0B"], /* CJK Ideograph Extension A */ + ["\u4A0C", "\u4A0C"], /* CJK Ideograph Extension A */ + ["\u4A0D", "\u4A0D"], /* CJK Ideograph Extension A */ + ["\u4A0E", "\u4A0E"], /* CJK Ideograph Extension A */ + ["\u4A0F", "\u4A0F"], /* CJK Ideograph Extension A */ + ["\u4A10", "\u4A10"], /* CJK Ideograph Extension A */ + ["\u4A11", "\u4A11"], /* CJK Ideograph Extension A */ + ["\u4A12", "\u4A12"], /* CJK Ideograph Extension A */ + ["\u4A13", "\u4A13"], /* CJK Ideograph Extension A */ + ["\u4A14", "\u4A14"], /* CJK Ideograph Extension A */ + ["\u4A15", "\u4A15"], /* CJK Ideograph Extension A */ + ["\u4A16", "\u4A16"], /* CJK Ideograph Extension A */ + ["\u4A17", "\u4A17"], /* CJK Ideograph Extension A */ + ["\u4A18", "\u4A18"], /* CJK Ideograph Extension A */ + ["\u4A19", "\u4A19"], /* CJK Ideograph Extension A */ + ["\u4A1A", "\u4A1A"], /* CJK Ideograph Extension A */ + ["\u4A1B", "\u4A1B"], /* CJK Ideograph Extension A */ + ["\u4A1C", "\u4A1C"], /* CJK Ideograph Extension A */ + ["\u4A1D", "\u4A1D"], /* CJK Ideograph Extension A */ + ["\u4A1E", "\u4A1E"], /* CJK Ideograph Extension A */ + ["\u4A1F", "\u4A1F"], /* CJK Ideograph Extension A */ + ["\u4A20", "\u4A20"], /* CJK Ideograph Extension A */ + ["\u4A21", "\u4A21"], /* CJK Ideograph Extension A */ + ["\u4A22", "\u4A22"], /* CJK Ideograph Extension A */ + ["\u4A23", "\u4A23"], /* CJK Ideograph Extension A */ + ["\u4A24", "\u4A24"], /* CJK Ideograph Extension A */ + ["\u4A25", "\u4A25"], /* CJK Ideograph Extension A */ + ["\u4A26", "\u4A26"], /* CJK Ideograph Extension A */ + ["\u4A27", "\u4A27"], /* CJK Ideograph Extension A */ + ["\u4A28", "\u4A28"], /* CJK Ideograph Extension A */ + ["\u4A29", "\u4A29"], /* CJK Ideograph Extension A */ + ["\u4A2A", "\u4A2A"], /* CJK Ideograph Extension A */ + ["\u4A2B", "\u4A2B"], /* CJK Ideograph Extension A */ + ["\u4A2C", "\u4A2C"], /* CJK Ideograph Extension A */ + ["\u4A2D", "\u4A2D"], /* CJK Ideograph Extension A */ + ["\u4A2E", "\u4A2E"], /* CJK Ideograph Extension A */ + ["\u4A2F", "\u4A2F"], /* CJK Ideograph Extension A */ + ["\u4A30", "\u4A30"], /* CJK Ideograph Extension A */ + ["\u4A31", "\u4A31"], /* CJK Ideograph Extension A */ + ["\u4A32", "\u4A32"], /* CJK Ideograph Extension A */ + ["\u4A33", "\u4A33"], /* CJK Ideograph Extension A */ + ["\u4A34", "\u4A34"], /* CJK Ideograph Extension A */ + ["\u4A35", "\u4A35"], /* CJK Ideograph Extension A */ + ["\u4A36", "\u4A36"], /* CJK Ideograph Extension A */ + ["\u4A37", "\u4A37"], /* CJK Ideograph Extension A */ + ["\u4A38", "\u4A38"], /* CJK Ideograph Extension A */ + ["\u4A39", "\u4A39"], /* CJK Ideograph Extension A */ + ["\u4A3A", "\u4A3A"], /* CJK Ideograph Extension A */ + ["\u4A3B", "\u4A3B"], /* CJK Ideograph Extension A */ + ["\u4A3C", "\u4A3C"], /* CJK Ideograph Extension A */ + ["\u4A3D", "\u4A3D"], /* CJK Ideograph Extension A */ + ["\u4A3E", "\u4A3E"], /* CJK Ideograph Extension A */ + ["\u4A3F", "\u4A3F"], /* CJK Ideograph Extension A */ + ["\u4A40", "\u4A40"], /* CJK Ideograph Extension A */ + ["\u4A41", "\u4A41"], /* CJK Ideograph Extension A */ + ["\u4A42", "\u4A42"], /* CJK Ideograph Extension A */ + ["\u4A43", "\u4A43"], /* CJK Ideograph Extension A */ + ["\u4A44", "\u4A44"], /* CJK Ideograph Extension A */ + ["\u4A45", "\u4A45"], /* CJK Ideograph Extension A */ + ["\u4A46", "\u4A46"], /* CJK Ideograph Extension A */ + ["\u4A47", "\u4A47"], /* CJK Ideograph Extension A */ + ["\u4A48", "\u4A48"], /* CJK Ideograph Extension A */ + ["\u4A49", "\u4A49"], /* CJK Ideograph Extension A */ + ["\u4A4A", "\u4A4A"], /* CJK Ideograph Extension A */ + ["\u4A4B", "\u4A4B"], /* CJK Ideograph Extension A */ + ["\u4A4C", "\u4A4C"], /* CJK Ideograph Extension A */ + ["\u4A4D", "\u4A4D"], /* CJK Ideograph Extension A */ + ["\u4A4E", "\u4A4E"], /* CJK Ideograph Extension A */ + ["\u4A4F", "\u4A4F"], /* CJK Ideograph Extension A */ + ["\u4A50", "\u4A50"], /* CJK Ideograph Extension A */ + ["\u4A51", "\u4A51"], /* CJK Ideograph Extension A */ + ["\u4A52", "\u4A52"], /* CJK Ideograph Extension A */ + ["\u4A53", "\u4A53"], /* CJK Ideograph Extension A */ + ["\u4A54", "\u4A54"], /* CJK Ideograph Extension A */ + ["\u4A55", "\u4A55"], /* CJK Ideograph Extension A */ + ["\u4A56", "\u4A56"], /* CJK Ideograph Extension A */ + ["\u4A57", "\u4A57"], /* CJK Ideograph Extension A */ + ["\u4A58", "\u4A58"], /* CJK Ideograph Extension A */ + ["\u4A59", "\u4A59"], /* CJK Ideograph Extension A */ + ["\u4A5A", "\u4A5A"], /* CJK Ideograph Extension A */ + ["\u4A5B", "\u4A5B"], /* CJK Ideograph Extension A */ + ["\u4A5C", "\u4A5C"], /* CJK Ideograph Extension A */ + ["\u4A5D", "\u4A5D"], /* CJK Ideograph Extension A */ + ["\u4A5E", "\u4A5E"], /* CJK Ideograph Extension A */ + ["\u4A5F", "\u4A5F"], /* CJK Ideograph Extension A */ + ["\u4A60", "\u4A60"], /* CJK Ideograph Extension A */ + ["\u4A61", "\u4A61"], /* CJK Ideograph Extension A */ + ["\u4A62", "\u4A62"], /* CJK Ideograph Extension A */ + ["\u4A63", "\u4A63"], /* CJK Ideograph Extension A */ + ["\u4A64", "\u4A64"], /* CJK Ideograph Extension A */ + ["\u4A65", "\u4A65"], /* CJK Ideograph Extension A */ + ["\u4A66", "\u4A66"], /* CJK Ideograph Extension A */ + ["\u4A67", "\u4A67"], /* CJK Ideograph Extension A */ + ["\u4A68", "\u4A68"], /* CJK Ideograph Extension A */ + ["\u4A69", "\u4A69"], /* CJK Ideograph Extension A */ + ["\u4A6A", "\u4A6A"], /* CJK Ideograph Extension A */ + ["\u4A6B", "\u4A6B"], /* CJK Ideograph Extension A */ + ["\u4A6C", "\u4A6C"], /* CJK Ideograph Extension A */ + ["\u4A6D", "\u4A6D"], /* CJK Ideograph Extension A */ + ["\u4A6E", "\u4A6E"], /* CJK Ideograph Extension A */ + ["\u4A6F", "\u4A6F"], /* CJK Ideograph Extension A */ + ["\u4A70", "\u4A70"], /* CJK Ideograph Extension A */ + ["\u4A71", "\u4A71"], /* CJK Ideograph Extension A */ + ["\u4A72", "\u4A72"], /* CJK Ideograph Extension A */ + ["\u4A73", "\u4A73"], /* CJK Ideograph Extension A */ + ["\u4A74", "\u4A74"], /* CJK Ideograph Extension A */ + ["\u4A75", "\u4A75"], /* CJK Ideograph Extension A */ + ["\u4A76", "\u4A76"], /* CJK Ideograph Extension A */ + ["\u4A77", "\u4A77"], /* CJK Ideograph Extension A */ + ["\u4A78", "\u4A78"], /* CJK Ideograph Extension A */ + ["\u4A79", "\u4A79"], /* CJK Ideograph Extension A */ + ["\u4A7A", "\u4A7A"], /* CJK Ideograph Extension A */ + ["\u4A7B", "\u4A7B"], /* CJK Ideograph Extension A */ + ["\u4A7C", "\u4A7C"], /* CJK Ideograph Extension A */ + ["\u4A7D", "\u4A7D"], /* CJK Ideograph Extension A */ + ["\u4A7E", "\u4A7E"], /* CJK Ideograph Extension A */ + ["\u4A7F", "\u4A7F"], /* CJK Ideograph Extension A */ + ["\u4A80", "\u4A80"], /* CJK Ideograph Extension A */ + ["\u4A81", "\u4A81"], /* CJK Ideograph Extension A */ + ["\u4A82", "\u4A82"], /* CJK Ideograph Extension A */ + ["\u4A83", "\u4A83"], /* CJK Ideograph Extension A */ + ["\u4A84", "\u4A84"], /* CJK Ideograph Extension A */ + ["\u4A85", "\u4A85"], /* CJK Ideograph Extension A */ + ["\u4A86", "\u4A86"], /* CJK Ideograph Extension A */ + ["\u4A87", "\u4A87"], /* CJK Ideograph Extension A */ + ["\u4A88", "\u4A88"], /* CJK Ideograph Extension A */ + ["\u4A89", "\u4A89"], /* CJK Ideograph Extension A */ + ["\u4A8A", "\u4A8A"], /* CJK Ideograph Extension A */ + ["\u4A8B", "\u4A8B"], /* CJK Ideograph Extension A */ + ["\u4A8C", "\u4A8C"], /* CJK Ideograph Extension A */ + ["\u4A8D", "\u4A8D"], /* CJK Ideograph Extension A */ + ["\u4A8E", "\u4A8E"], /* CJK Ideograph Extension A */ + ["\u4A8F", "\u4A8F"], /* CJK Ideograph Extension A */ + ["\u4A90", "\u4A90"], /* CJK Ideograph Extension A */ + ["\u4A91", "\u4A91"], /* CJK Ideograph Extension A */ + ["\u4A92", "\u4A92"], /* CJK Ideograph Extension A */ + ["\u4A93", "\u4A93"], /* CJK Ideograph Extension A */ + ["\u4A94", "\u4A94"], /* CJK Ideograph Extension A */ + ["\u4A95", "\u4A95"], /* CJK Ideograph Extension A */ + ["\u4A96", "\u4A96"], /* CJK Ideograph Extension A */ + ["\u4A97", "\u4A97"], /* CJK Ideograph Extension A */ + ["\u4A98", "\u4A98"], /* CJK Ideograph Extension A */ + ["\u4A99", "\u4A99"], /* CJK Ideograph Extension A */ + ["\u4A9A", "\u4A9A"], /* CJK Ideograph Extension A */ + ["\u4A9B", "\u4A9B"], /* CJK Ideograph Extension A */ + ["\u4A9C", "\u4A9C"], /* CJK Ideograph Extension A */ + ["\u4A9D", "\u4A9D"], /* CJK Ideograph Extension A */ + ["\u4A9E", "\u4A9E"], /* CJK Ideograph Extension A */ + ["\u4A9F", "\u4A9F"], /* CJK Ideograph Extension A */ + ["\u4AA0", "\u4AA0"], /* CJK Ideograph Extension A */ + ["\u4AA1", "\u4AA1"], /* CJK Ideograph Extension A */ + ["\u4AA2", "\u4AA2"], /* CJK Ideograph Extension A */ + ["\u4AA3", "\u4AA3"], /* CJK Ideograph Extension A */ + ["\u4AA4", "\u4AA4"], /* CJK Ideograph Extension A */ + ["\u4AA5", "\u4AA5"], /* CJK Ideograph Extension A */ + ["\u4AA6", "\u4AA6"], /* CJK Ideograph Extension A */ + ["\u4AA7", "\u4AA7"], /* CJK Ideograph Extension A */ + ["\u4AA8", "\u4AA8"], /* CJK Ideograph Extension A */ + ["\u4AA9", "\u4AA9"], /* CJK Ideograph Extension A */ + ["\u4AAA", "\u4AAA"], /* CJK Ideograph Extension A */ + ["\u4AAB", "\u4AAB"], /* CJK Ideograph Extension A */ + ["\u4AAC", "\u4AAC"], /* CJK Ideograph Extension A */ + ["\u4AAD", "\u4AAD"], /* CJK Ideograph Extension A */ + ["\u4AAE", "\u4AAE"], /* CJK Ideograph Extension A */ + ["\u4AAF", "\u4AAF"], /* CJK Ideograph Extension A */ + ["\u4AB0", "\u4AB0"], /* CJK Ideograph Extension A */ + ["\u4AB1", "\u4AB1"], /* CJK Ideograph Extension A */ + ["\u4AB2", "\u4AB2"], /* CJK Ideograph Extension A */ + ["\u4AB3", "\u4AB3"], /* CJK Ideograph Extension A */ + ["\u4AB4", "\u4AB4"], /* CJK Ideograph Extension A */ + ["\u4AB5", "\u4AB5"], /* CJK Ideograph Extension A */ + ["\u4AB6", "\u4AB6"], /* CJK Ideograph Extension A */ + ["\u4AB7", "\u4AB7"], /* CJK Ideograph Extension A */ + ["\u4AB8", "\u4AB8"], /* CJK Ideograph Extension A */ + ["\u4AB9", "\u4AB9"], /* CJK Ideograph Extension A */ + ["\u4ABA", "\u4ABA"], /* CJK Ideograph Extension A */ + ["\u4ABB", "\u4ABB"], /* CJK Ideograph Extension A */ + ["\u4ABC", "\u4ABC"], /* CJK Ideograph Extension A */ + ["\u4ABD", "\u4ABD"], /* CJK Ideograph Extension A */ + ["\u4ABE", "\u4ABE"], /* CJK Ideograph Extension A */ + ["\u4ABF", "\u4ABF"], /* CJK Ideograph Extension A */ + ["\u4AC0", "\u4AC0"], /* CJK Ideograph Extension A */ + ["\u4AC1", "\u4AC1"], /* CJK Ideograph Extension A */ + ["\u4AC2", "\u4AC2"], /* CJK Ideograph Extension A */ + ["\u4AC3", "\u4AC3"], /* CJK Ideograph Extension A */ + ["\u4AC4", "\u4AC4"], /* CJK Ideograph Extension A */ + ["\u4AC5", "\u4AC5"], /* CJK Ideograph Extension A */ + ["\u4AC6", "\u4AC6"], /* CJK Ideograph Extension A */ + ["\u4AC7", "\u4AC7"], /* CJK Ideograph Extension A */ + ["\u4AC8", "\u4AC8"], /* CJK Ideograph Extension A */ + ["\u4AC9", "\u4AC9"], /* CJK Ideograph Extension A */ + ["\u4ACA", "\u4ACA"], /* CJK Ideograph Extension A */ + ["\u4ACB", "\u4ACB"], /* CJK Ideograph Extension A */ + ["\u4ACC", "\u4ACC"], /* CJK Ideograph Extension A */ + ["\u4ACD", "\u4ACD"], /* CJK Ideograph Extension A */ + ["\u4ACE", "\u4ACE"], /* CJK Ideograph Extension A */ + ["\u4ACF", "\u4ACF"], /* CJK Ideograph Extension A */ + ["\u4AD0", "\u4AD0"], /* CJK Ideograph Extension A */ + ["\u4AD1", "\u4AD1"], /* CJK Ideograph Extension A */ + ["\u4AD2", "\u4AD2"], /* CJK Ideograph Extension A */ + ["\u4AD3", "\u4AD3"], /* CJK Ideograph Extension A */ + ["\u4AD4", "\u4AD4"], /* CJK Ideograph Extension A */ + ["\u4AD5", "\u4AD5"], /* CJK Ideograph Extension A */ + ["\u4AD6", "\u4AD6"], /* CJK Ideograph Extension A */ + ["\u4AD7", "\u4AD7"], /* CJK Ideograph Extension A */ + ["\u4AD8", "\u4AD8"], /* CJK Ideograph Extension A */ + ["\u4AD9", "\u4AD9"], /* CJK Ideograph Extension A */ + ["\u4ADA", "\u4ADA"], /* CJK Ideograph Extension A */ + ["\u4ADB", "\u4ADB"], /* CJK Ideograph Extension A */ + ["\u4ADC", "\u4ADC"], /* CJK Ideograph Extension A */ + ["\u4ADD", "\u4ADD"], /* CJK Ideograph Extension A */ + ["\u4ADE", "\u4ADE"], /* CJK Ideograph Extension A */ + ["\u4ADF", "\u4ADF"], /* CJK Ideograph Extension A */ + ["\u4AE0", "\u4AE0"], /* CJK Ideograph Extension A */ + ["\u4AE1", "\u4AE1"], /* CJK Ideograph Extension A */ + ["\u4AE2", "\u4AE2"], /* CJK Ideograph Extension A */ + ["\u4AE3", "\u4AE3"], /* CJK Ideograph Extension A */ + ["\u4AE4", "\u4AE4"], /* CJK Ideograph Extension A */ + ["\u4AE5", "\u4AE5"], /* CJK Ideograph Extension A */ + ["\u4AE6", "\u4AE6"], /* CJK Ideograph Extension A */ + ["\u4AE7", "\u4AE7"], /* CJK Ideograph Extension A */ + ["\u4AE8", "\u4AE8"], /* CJK Ideograph Extension A */ + ["\u4AE9", "\u4AE9"], /* CJK Ideograph Extension A */ + ["\u4AEA", "\u4AEA"], /* CJK Ideograph Extension A */ + ["\u4AEB", "\u4AEB"], /* CJK Ideograph Extension A */ + ["\u4AEC", "\u4AEC"], /* CJK Ideograph Extension A */ + ["\u4AED", "\u4AED"], /* CJK Ideograph Extension A */ + ["\u4AEE", "\u4AEE"], /* CJK Ideograph Extension A */ + ["\u4AEF", "\u4AEF"], /* CJK Ideograph Extension A */ + ["\u4AF0", "\u4AF0"], /* CJK Ideograph Extension A */ + ["\u4AF1", "\u4AF1"], /* CJK Ideograph Extension A */ + ["\u4AF2", "\u4AF2"], /* CJK Ideograph Extension A */ + ["\u4AF3", "\u4AF3"], /* CJK Ideograph Extension A */ + ["\u4AF4", "\u4AF4"], /* CJK Ideograph Extension A */ + ["\u4AF5", "\u4AF5"], /* CJK Ideograph Extension A */ + ["\u4AF6", "\u4AF6"], /* CJK Ideograph Extension A */ + ["\u4AF7", "\u4AF7"], /* CJK Ideograph Extension A */ + ["\u4AF8", "\u4AF8"], /* CJK Ideograph Extension A */ + ["\u4AF9", "\u4AF9"], /* CJK Ideograph Extension A */ + ["\u4AFA", "\u4AFA"], /* CJK Ideograph Extension A */ + ["\u4AFB", "\u4AFB"], /* CJK Ideograph Extension A */ + ["\u4AFC", "\u4AFC"], /* CJK Ideograph Extension A */ + ["\u4AFD", "\u4AFD"], /* CJK Ideograph Extension A */ + ["\u4AFE", "\u4AFE"], /* CJK Ideograph Extension A */ + ["\u4AFF", "\u4AFF"], /* CJK Ideograph Extension A */ + ["\u4B00", "\u4B00"], /* CJK Ideograph Extension A */ + ["\u4B01", "\u4B01"], /* CJK Ideograph Extension A */ + ["\u4B02", "\u4B02"], /* CJK Ideograph Extension A */ + ["\u4B03", "\u4B03"], /* CJK Ideograph Extension A */ + ["\u4B04", "\u4B04"], /* CJK Ideograph Extension A */ + ["\u4B05", "\u4B05"], /* CJK Ideograph Extension A */ + ["\u4B06", "\u4B06"], /* CJK Ideograph Extension A */ + ["\u4B07", "\u4B07"], /* CJK Ideograph Extension A */ + ["\u4B08", "\u4B08"], /* CJK Ideograph Extension A */ + ["\u4B09", "\u4B09"], /* CJK Ideograph Extension A */ + ["\u4B0A", "\u4B0A"], /* CJK Ideograph Extension A */ + ["\u4B0B", "\u4B0B"], /* CJK Ideograph Extension A */ + ["\u4B0C", "\u4B0C"], /* CJK Ideograph Extension A */ + ["\u4B0D", "\u4B0D"], /* CJK Ideograph Extension A */ + ["\u4B0E", "\u4B0E"], /* CJK Ideograph Extension A */ + ["\u4B0F", "\u4B0F"], /* CJK Ideograph Extension A */ + ["\u4B10", "\u4B10"], /* CJK Ideograph Extension A */ + ["\u4B11", "\u4B11"], /* CJK Ideograph Extension A */ + ["\u4B12", "\u4B12"], /* CJK Ideograph Extension A */ + ["\u4B13", "\u4B13"], /* CJK Ideograph Extension A */ + ["\u4B14", "\u4B14"], /* CJK Ideograph Extension A */ + ["\u4B15", "\u4B15"], /* CJK Ideograph Extension A */ + ["\u4B16", "\u4B16"], /* CJK Ideograph Extension A */ + ["\u4B17", "\u4B17"], /* CJK Ideograph Extension A */ + ["\u4B18", "\u4B18"], /* CJK Ideograph Extension A */ + ["\u4B19", "\u4B19"], /* CJK Ideograph Extension A */ + ["\u4B1A", "\u4B1A"], /* CJK Ideograph Extension A */ + ["\u4B1B", "\u4B1B"], /* CJK Ideograph Extension A */ + ["\u4B1C", "\u4B1C"], /* CJK Ideograph Extension A */ + ["\u4B1D", "\u4B1D"], /* CJK Ideograph Extension A */ + ["\u4B1E", "\u4B1E"], /* CJK Ideograph Extension A */ + ["\u4B1F", "\u4B1F"], /* CJK Ideograph Extension A */ + ["\u4B20", "\u4B20"], /* CJK Ideograph Extension A */ + ["\u4B21", "\u4B21"], /* CJK Ideograph Extension A */ + ["\u4B22", "\u4B22"], /* CJK Ideograph Extension A */ + ["\u4B23", "\u4B23"], /* CJK Ideograph Extension A */ + ["\u4B24", "\u4B24"], /* CJK Ideograph Extension A */ + ["\u4B25", "\u4B25"], /* CJK Ideograph Extension A */ + ["\u4B26", "\u4B26"], /* CJK Ideograph Extension A */ + ["\u4B27", "\u4B27"], /* CJK Ideograph Extension A */ + ["\u4B28", "\u4B28"], /* CJK Ideograph Extension A */ + ["\u4B29", "\u4B29"], /* CJK Ideograph Extension A */ + ["\u4B2A", "\u4B2A"], /* CJK Ideograph Extension A */ + ["\u4B2B", "\u4B2B"], /* CJK Ideograph Extension A */ + ["\u4B2C", "\u4B2C"], /* CJK Ideograph Extension A */ + ["\u4B2D", "\u4B2D"], /* CJK Ideograph Extension A */ + ["\u4B2E", "\u4B2E"], /* CJK Ideograph Extension A */ + ["\u4B2F", "\u4B2F"], /* CJK Ideograph Extension A */ + ["\u4B30", "\u4B30"], /* CJK Ideograph Extension A */ + ["\u4B31", "\u4B31"], /* CJK Ideograph Extension A */ + ["\u4B32", "\u4B32"], /* CJK Ideograph Extension A */ + ["\u4B33", "\u4B33"], /* CJK Ideograph Extension A */ + ["\u4B34", "\u4B34"], /* CJK Ideograph Extension A */ + ["\u4B35", "\u4B35"], /* CJK Ideograph Extension A */ + ["\u4B36", "\u4B36"], /* CJK Ideograph Extension A */ + ["\u4B37", "\u4B37"], /* CJK Ideograph Extension A */ + ["\u4B38", "\u4B38"], /* CJK Ideograph Extension A */ + ["\u4B39", "\u4B39"], /* CJK Ideograph Extension A */ + ["\u4B3A", "\u4B3A"], /* CJK Ideograph Extension A */ + ["\u4B3B", "\u4B3B"], /* CJK Ideograph Extension A */ + ["\u4B3C", "\u4B3C"], /* CJK Ideograph Extension A */ + ["\u4B3D", "\u4B3D"], /* CJK Ideograph Extension A */ + ["\u4B3E", "\u4B3E"], /* CJK Ideograph Extension A */ + ["\u4B3F", "\u4B3F"], /* CJK Ideograph Extension A */ + ["\u4B40", "\u4B40"], /* CJK Ideograph Extension A */ + ["\u4B41", "\u4B41"], /* CJK Ideograph Extension A */ + ["\u4B42", "\u4B42"], /* CJK Ideograph Extension A */ + ["\u4B43", "\u4B43"], /* CJK Ideograph Extension A */ + ["\u4B44", "\u4B44"], /* CJK Ideograph Extension A */ + ["\u4B45", "\u4B45"], /* CJK Ideograph Extension A */ + ["\u4B46", "\u4B46"], /* CJK Ideograph Extension A */ + ["\u4B47", "\u4B47"], /* CJK Ideograph Extension A */ + ["\u4B48", "\u4B48"], /* CJK Ideograph Extension A */ + ["\u4B49", "\u4B49"], /* CJK Ideograph Extension A */ + ["\u4B4A", "\u4B4A"], /* CJK Ideograph Extension A */ + ["\u4B4B", "\u4B4B"], /* CJK Ideograph Extension A */ + ["\u4B4C", "\u4B4C"], /* CJK Ideograph Extension A */ + ["\u4B4D", "\u4B4D"], /* CJK Ideograph Extension A */ + ["\u4B4E", "\u4B4E"], /* CJK Ideograph Extension A */ + ["\u4B4F", "\u4B4F"], /* CJK Ideograph Extension A */ + ["\u4B50", "\u4B50"], /* CJK Ideograph Extension A */ + ["\u4B51", "\u4B51"], /* CJK Ideograph Extension A */ + ["\u4B52", "\u4B52"], /* CJK Ideograph Extension A */ + ["\u4B53", "\u4B53"], /* CJK Ideograph Extension A */ + ["\u4B54", "\u4B54"], /* CJK Ideograph Extension A */ + ["\u4B55", "\u4B55"], /* CJK Ideograph Extension A */ + ["\u4B56", "\u4B56"], /* CJK Ideograph Extension A */ + ["\u4B57", "\u4B57"], /* CJK Ideograph Extension A */ + ["\u4B58", "\u4B58"], /* CJK Ideograph Extension A */ + ["\u4B59", "\u4B59"], /* CJK Ideograph Extension A */ + ["\u4B5A", "\u4B5A"], /* CJK Ideograph Extension A */ + ["\u4B5B", "\u4B5B"], /* CJK Ideograph Extension A */ + ["\u4B5C", "\u4B5C"], /* CJK Ideograph Extension A */ + ["\u4B5D", "\u4B5D"], /* CJK Ideograph Extension A */ + ["\u4B5E", "\u4B5E"], /* CJK Ideograph Extension A */ + ["\u4B5F", "\u4B5F"], /* CJK Ideograph Extension A */ + ["\u4B60", "\u4B60"], /* CJK Ideograph Extension A */ + ["\u4B61", "\u4B61"], /* CJK Ideograph Extension A */ + ["\u4B62", "\u4B62"], /* CJK Ideograph Extension A */ + ["\u4B63", "\u4B63"], /* CJK Ideograph Extension A */ + ["\u4B64", "\u4B64"], /* CJK Ideograph Extension A */ + ["\u4B65", "\u4B65"], /* CJK Ideograph Extension A */ + ["\u4B66", "\u4B66"], /* CJK Ideograph Extension A */ + ["\u4B67", "\u4B67"], /* CJK Ideograph Extension A */ + ["\u4B68", "\u4B68"], /* CJK Ideograph Extension A */ + ["\u4B69", "\u4B69"], /* CJK Ideograph Extension A */ + ["\u4B6A", "\u4B6A"], /* CJK Ideograph Extension A */ + ["\u4B6B", "\u4B6B"], /* CJK Ideograph Extension A */ + ["\u4B6C", "\u4B6C"], /* CJK Ideograph Extension A */ + ["\u4B6D", "\u4B6D"], /* CJK Ideograph Extension A */ + ["\u4B6E", "\u4B6E"], /* CJK Ideograph Extension A */ + ["\u4B6F", "\u4B6F"], /* CJK Ideograph Extension A */ + ["\u4B70", "\u4B70"], /* CJK Ideograph Extension A */ + ["\u4B71", "\u4B71"], /* CJK Ideograph Extension A */ + ["\u4B72", "\u4B72"], /* CJK Ideograph Extension A */ + ["\u4B73", "\u4B73"], /* CJK Ideograph Extension A */ + ["\u4B74", "\u4B74"], /* CJK Ideograph Extension A */ + ["\u4B75", "\u4B75"], /* CJK Ideograph Extension A */ + ["\u4B76", "\u4B76"], /* CJK Ideograph Extension A */ + ["\u4B77", "\u4B77"], /* CJK Ideograph Extension A */ + ["\u4B78", "\u4B78"], /* CJK Ideograph Extension A */ + ["\u4B79", "\u4B79"], /* CJK Ideograph Extension A */ + ["\u4B7A", "\u4B7A"], /* CJK Ideograph Extension A */ + ["\u4B7B", "\u4B7B"], /* CJK Ideograph Extension A */ + ["\u4B7C", "\u4B7C"], /* CJK Ideograph Extension A */ + ["\u4B7D", "\u4B7D"], /* CJK Ideograph Extension A */ + ["\u4B7E", "\u4B7E"], /* CJK Ideograph Extension A */ + ["\u4B7F", "\u4B7F"], /* CJK Ideograph Extension A */ + ["\u4B80", "\u4B80"], /* CJK Ideograph Extension A */ + ["\u4B81", "\u4B81"], /* CJK Ideograph Extension A */ + ["\u4B82", "\u4B82"], /* CJK Ideograph Extension A */ + ["\u4B83", "\u4B83"], /* CJK Ideograph Extension A */ + ["\u4B84", "\u4B84"], /* CJK Ideograph Extension A */ + ["\u4B85", "\u4B85"], /* CJK Ideograph Extension A */ + ["\u4B86", "\u4B86"], /* CJK Ideograph Extension A */ + ["\u4B87", "\u4B87"], /* CJK Ideograph Extension A */ + ["\u4B88", "\u4B88"], /* CJK Ideograph Extension A */ + ["\u4B89", "\u4B89"], /* CJK Ideograph Extension A */ + ["\u4B8A", "\u4B8A"], /* CJK Ideograph Extension A */ + ["\u4B8B", "\u4B8B"], /* CJK Ideograph Extension A */ + ["\u4B8C", "\u4B8C"], /* CJK Ideograph Extension A */ + ["\u4B8D", "\u4B8D"], /* CJK Ideograph Extension A */ + ["\u4B8E", "\u4B8E"], /* CJK Ideograph Extension A */ + ["\u4B8F", "\u4B8F"], /* CJK Ideograph Extension A */ + ["\u4B90", "\u4B90"], /* CJK Ideograph Extension A */ + ["\u4B91", "\u4B91"], /* CJK Ideograph Extension A */ + ["\u4B92", "\u4B92"], /* CJK Ideograph Extension A */ + ["\u4B93", "\u4B93"], /* CJK Ideograph Extension A */ + ["\u4B94", "\u4B94"], /* CJK Ideograph Extension A */ + ["\u4B95", "\u4B95"], /* CJK Ideograph Extension A */ + ["\u4B96", "\u4B96"], /* CJK Ideograph Extension A */ + ["\u4B97", "\u4B97"], /* CJK Ideograph Extension A */ + ["\u4B98", "\u4B98"], /* CJK Ideograph Extension A */ + ["\u4B99", "\u4B99"], /* CJK Ideograph Extension A */ + ["\u4B9A", "\u4B9A"], /* CJK Ideograph Extension A */ + ["\u4B9B", "\u4B9B"], /* CJK Ideograph Extension A */ + ["\u4B9C", "\u4B9C"], /* CJK Ideograph Extension A */ + ["\u4B9D", "\u4B9D"], /* CJK Ideograph Extension A */ + ["\u4B9E", "\u4B9E"], /* CJK Ideograph Extension A */ + ["\u4B9F", "\u4B9F"], /* CJK Ideograph Extension A */ + ["\u4BA0", "\u4BA0"], /* CJK Ideograph Extension A */ + ["\u4BA1", "\u4BA1"], /* CJK Ideograph Extension A */ + ["\u4BA2", "\u4BA2"], /* CJK Ideograph Extension A */ + ["\u4BA3", "\u4BA3"], /* CJK Ideograph Extension A */ + ["\u4BA4", "\u4BA4"], /* CJK Ideograph Extension A */ + ["\u4BA5", "\u4BA5"], /* CJK Ideograph Extension A */ + ["\u4BA6", "\u4BA6"], /* CJK Ideograph Extension A */ + ["\u4BA7", "\u4BA7"], /* CJK Ideograph Extension A */ + ["\u4BA8", "\u4BA8"], /* CJK Ideograph Extension A */ + ["\u4BA9", "\u4BA9"], /* CJK Ideograph Extension A */ + ["\u4BAA", "\u4BAA"], /* CJK Ideograph Extension A */ + ["\u4BAB", "\u4BAB"], /* CJK Ideograph Extension A */ + ["\u4BAC", "\u4BAC"], /* CJK Ideograph Extension A */ + ["\u4BAD", "\u4BAD"], /* CJK Ideograph Extension A */ + ["\u4BAE", "\u4BAE"], /* CJK Ideograph Extension A */ + ["\u4BAF", "\u4BAF"], /* CJK Ideograph Extension A */ + ["\u4BB0", "\u4BB0"], /* CJK Ideograph Extension A */ + ["\u4BB1", "\u4BB1"], /* CJK Ideograph Extension A */ + ["\u4BB2", "\u4BB2"], /* CJK Ideograph Extension A */ + ["\u4BB3", "\u4BB3"], /* CJK Ideograph Extension A */ + ["\u4BB4", "\u4BB4"], /* CJK Ideograph Extension A */ + ["\u4BB5", "\u4BB5"], /* CJK Ideograph Extension A */ + ["\u4BB6", "\u4BB6"], /* CJK Ideograph Extension A */ + ["\u4BB7", "\u4BB7"], /* CJK Ideograph Extension A */ + ["\u4BB8", "\u4BB8"], /* CJK Ideograph Extension A */ + ["\u4BB9", "\u4BB9"], /* CJK Ideograph Extension A */ + ["\u4BBA", "\u4BBA"], /* CJK Ideograph Extension A */ + ["\u4BBB", "\u4BBB"], /* CJK Ideograph Extension A */ + ["\u4BBC", "\u4BBC"], /* CJK Ideograph Extension A */ + ["\u4BBD", "\u4BBD"], /* CJK Ideograph Extension A */ + ["\u4BBE", "\u4BBE"], /* CJK Ideograph Extension A */ + ["\u4BBF", "\u4BBF"], /* CJK Ideograph Extension A */ + ["\u4BC0", "\u4BC0"], /* CJK Ideograph Extension A */ + ["\u4BC1", "\u4BC1"], /* CJK Ideograph Extension A */ + ["\u4BC2", "\u4BC2"], /* CJK Ideograph Extension A */ + ["\u4BC3", "\u4BC3"], /* CJK Ideograph Extension A */ + ["\u4BC4", "\u4BC4"], /* CJK Ideograph Extension A */ + ["\u4BC5", "\u4BC5"], /* CJK Ideograph Extension A */ + ["\u4BC6", "\u4BC6"], /* CJK Ideograph Extension A */ + ["\u4BC7", "\u4BC7"], /* CJK Ideograph Extension A */ + ["\u4BC8", "\u4BC8"], /* CJK Ideograph Extension A */ + ["\u4BC9", "\u4BC9"], /* CJK Ideograph Extension A */ + ["\u4BCA", "\u4BCA"], /* CJK Ideograph Extension A */ + ["\u4BCB", "\u4BCB"], /* CJK Ideograph Extension A */ + ["\u4BCC", "\u4BCC"], /* CJK Ideograph Extension A */ + ["\u4BCD", "\u4BCD"], /* CJK Ideograph Extension A */ + ["\u4BCE", "\u4BCE"], /* CJK Ideograph Extension A */ + ["\u4BCF", "\u4BCF"], /* CJK Ideograph Extension A */ + ["\u4BD0", "\u4BD0"], /* CJK Ideograph Extension A */ + ["\u4BD1", "\u4BD1"], /* CJK Ideograph Extension A */ + ["\u4BD2", "\u4BD2"], /* CJK Ideograph Extension A */ + ["\u4BD3", "\u4BD3"], /* CJK Ideograph Extension A */ + ["\u4BD4", "\u4BD4"], /* CJK Ideograph Extension A */ + ["\u4BD5", "\u4BD5"], /* CJK Ideograph Extension A */ + ["\u4BD6", "\u4BD6"], /* CJK Ideograph Extension A */ + ["\u4BD7", "\u4BD7"], /* CJK Ideograph Extension A */ + ["\u4BD8", "\u4BD8"], /* CJK Ideograph Extension A */ + ["\u4BD9", "\u4BD9"], /* CJK Ideograph Extension A */ + ["\u4BDA", "\u4BDA"], /* CJK Ideograph Extension A */ + ["\u4BDB", "\u4BDB"], /* CJK Ideograph Extension A */ + ["\u4BDC", "\u4BDC"], /* CJK Ideograph Extension A */ + ["\u4BDD", "\u4BDD"], /* CJK Ideograph Extension A */ + ["\u4BDE", "\u4BDE"], /* CJK Ideograph Extension A */ + ["\u4BDF", "\u4BDF"], /* CJK Ideograph Extension A */ + ["\u4BE0", "\u4BE0"], /* CJK Ideograph Extension A */ + ["\u4BE1", "\u4BE1"], /* CJK Ideograph Extension A */ + ["\u4BE2", "\u4BE2"], /* CJK Ideograph Extension A */ + ["\u4BE3", "\u4BE3"], /* CJK Ideograph Extension A */ + ["\u4BE4", "\u4BE4"], /* CJK Ideograph Extension A */ + ["\u4BE5", "\u4BE5"], /* CJK Ideograph Extension A */ + ["\u4BE6", "\u4BE6"], /* CJK Ideograph Extension A */ + ["\u4BE7", "\u4BE7"], /* CJK Ideograph Extension A */ + ["\u4BE8", "\u4BE8"], /* CJK Ideograph Extension A */ + ["\u4BE9", "\u4BE9"], /* CJK Ideograph Extension A */ + ["\u4BEA", "\u4BEA"], /* CJK Ideograph Extension A */ + ["\u4BEB", "\u4BEB"], /* CJK Ideograph Extension A */ + ["\u4BEC", "\u4BEC"], /* CJK Ideograph Extension A */ + ["\u4BED", "\u4BED"], /* CJK Ideograph Extension A */ + ["\u4BEE", "\u4BEE"], /* CJK Ideograph Extension A */ + ["\u4BEF", "\u4BEF"], /* CJK Ideograph Extension A */ + ["\u4BF0", "\u4BF0"], /* CJK Ideograph Extension A */ + ["\u4BF1", "\u4BF1"], /* CJK Ideograph Extension A */ + ["\u4BF2", "\u4BF2"], /* CJK Ideograph Extension A */ + ["\u4BF3", "\u4BF3"], /* CJK Ideograph Extension A */ + ["\u4BF4", "\u4BF4"], /* CJK Ideograph Extension A */ + ["\u4BF5", "\u4BF5"], /* CJK Ideograph Extension A */ + ["\u4BF6", "\u4BF6"], /* CJK Ideograph Extension A */ + ["\u4BF7", "\u4BF7"], /* CJK Ideograph Extension A */ + ["\u4BF8", "\u4BF8"], /* CJK Ideograph Extension A */ + ["\u4BF9", "\u4BF9"], /* CJK Ideograph Extension A */ + ["\u4BFA", "\u4BFA"], /* CJK Ideograph Extension A */ + ["\u4BFB", "\u4BFB"], /* CJK Ideograph Extension A */ + ["\u4BFC", "\u4BFC"], /* CJK Ideograph Extension A */ + ["\u4BFD", "\u4BFD"], /* CJK Ideograph Extension A */ + ["\u4BFE", "\u4BFE"], /* CJK Ideograph Extension A */ + ["\u4BFF", "\u4BFF"], /* CJK Ideograph Extension A */ + ["\u4C00", "\u4C00"], /* CJK Ideograph Extension A */ + ["\u4C01", "\u4C01"], /* CJK Ideograph Extension A */ + ["\u4C02", "\u4C02"], /* CJK Ideograph Extension A */ + ["\u4C03", "\u4C03"], /* CJK Ideograph Extension A */ + ["\u4C04", "\u4C04"], /* CJK Ideograph Extension A */ + ["\u4C05", "\u4C05"], /* CJK Ideograph Extension A */ + ["\u4C06", "\u4C06"], /* CJK Ideograph Extension A */ + ["\u4C07", "\u4C07"], /* CJK Ideograph Extension A */ + ["\u4C08", "\u4C08"], /* CJK Ideograph Extension A */ + ["\u4C09", "\u4C09"], /* CJK Ideograph Extension A */ + ["\u4C0A", "\u4C0A"], /* CJK Ideograph Extension A */ + ["\u4C0B", "\u4C0B"], /* CJK Ideograph Extension A */ + ["\u4C0C", "\u4C0C"], /* CJK Ideograph Extension A */ + ["\u4C0D", "\u4C0D"], /* CJK Ideograph Extension A */ + ["\u4C0E", "\u4C0E"], /* CJK Ideograph Extension A */ + ["\u4C0F", "\u4C0F"], /* CJK Ideograph Extension A */ + ["\u4C10", "\u4C10"], /* CJK Ideograph Extension A */ + ["\u4C11", "\u4C11"], /* CJK Ideograph Extension A */ + ["\u4C12", "\u4C12"], /* CJK Ideograph Extension A */ + ["\u4C13", "\u4C13"], /* CJK Ideograph Extension A */ + ["\u4C14", "\u4C14"], /* CJK Ideograph Extension A */ + ["\u4C15", "\u4C15"], /* CJK Ideograph Extension A */ + ["\u4C16", "\u4C16"], /* CJK Ideograph Extension A */ + ["\u4C17", "\u4C17"], /* CJK Ideograph Extension A */ + ["\u4C18", "\u4C18"], /* CJK Ideograph Extension A */ + ["\u4C19", "\u4C19"], /* CJK Ideograph Extension A */ + ["\u4C1A", "\u4C1A"], /* CJK Ideograph Extension A */ + ["\u4C1B", "\u4C1B"], /* CJK Ideograph Extension A */ + ["\u4C1C", "\u4C1C"], /* CJK Ideograph Extension A */ + ["\u4C1D", "\u4C1D"], /* CJK Ideograph Extension A */ + ["\u4C1E", "\u4C1E"], /* CJK Ideograph Extension A */ + ["\u4C1F", "\u4C1F"], /* CJK Ideograph Extension A */ + ["\u4C20", "\u4C20"], /* CJK Ideograph Extension A */ + ["\u4C21", "\u4C21"], /* CJK Ideograph Extension A */ + ["\u4C22", "\u4C22"], /* CJK Ideograph Extension A */ + ["\u4C23", "\u4C23"], /* CJK Ideograph Extension A */ + ["\u4C24", "\u4C24"], /* CJK Ideograph Extension A */ + ["\u4C25", "\u4C25"], /* CJK Ideograph Extension A */ + ["\u4C26", "\u4C26"], /* CJK Ideograph Extension A */ + ["\u4C27", "\u4C27"], /* CJK Ideograph Extension A */ + ["\u4C28", "\u4C28"], /* CJK Ideograph Extension A */ + ["\u4C29", "\u4C29"], /* CJK Ideograph Extension A */ + ["\u4C2A", "\u4C2A"], /* CJK Ideograph Extension A */ + ["\u4C2B", "\u4C2B"], /* CJK Ideograph Extension A */ + ["\u4C2C", "\u4C2C"], /* CJK Ideograph Extension A */ + ["\u4C2D", "\u4C2D"], /* CJK Ideograph Extension A */ + ["\u4C2E", "\u4C2E"], /* CJK Ideograph Extension A */ + ["\u4C2F", "\u4C2F"], /* CJK Ideograph Extension A */ + ["\u4C30", "\u4C30"], /* CJK Ideograph Extension A */ + ["\u4C31", "\u4C31"], /* CJK Ideograph Extension A */ + ["\u4C32", "\u4C32"], /* CJK Ideograph Extension A */ + ["\u4C33", "\u4C33"], /* CJK Ideograph Extension A */ + ["\u4C34", "\u4C34"], /* CJK Ideograph Extension A */ + ["\u4C35", "\u4C35"], /* CJK Ideograph Extension A */ + ["\u4C36", "\u4C36"], /* CJK Ideograph Extension A */ + ["\u4C37", "\u4C37"], /* CJK Ideograph Extension A */ + ["\u4C38", "\u4C38"], /* CJK Ideograph Extension A */ + ["\u4C39", "\u4C39"], /* CJK Ideograph Extension A */ + ["\u4C3A", "\u4C3A"], /* CJK Ideograph Extension A */ + ["\u4C3B", "\u4C3B"], /* CJK Ideograph Extension A */ + ["\u4C3C", "\u4C3C"], /* CJK Ideograph Extension A */ + ["\u4C3D", "\u4C3D"], /* CJK Ideograph Extension A */ + ["\u4C3E", "\u4C3E"], /* CJK Ideograph Extension A */ + ["\u4C3F", "\u4C3F"], /* CJK Ideograph Extension A */ + ["\u4C40", "\u4C40"], /* CJK Ideograph Extension A */ + ["\u4C41", "\u4C41"], /* CJK Ideograph Extension A */ + ["\u4C42", "\u4C42"], /* CJK Ideograph Extension A */ + ["\u4C43", "\u4C43"], /* CJK Ideograph Extension A */ + ["\u4C44", "\u4C44"], /* CJK Ideograph Extension A */ + ["\u4C45", "\u4C45"], /* CJK Ideograph Extension A */ + ["\u4C46", "\u4C46"], /* CJK Ideograph Extension A */ + ["\u4C47", "\u4C47"], /* CJK Ideograph Extension A */ + ["\u4C48", "\u4C48"], /* CJK Ideograph Extension A */ + ["\u4C49", "\u4C49"], /* CJK Ideograph Extension A */ + ["\u4C4A", "\u4C4A"], /* CJK Ideograph Extension A */ + ["\u4C4B", "\u4C4B"], /* CJK Ideograph Extension A */ + ["\u4C4C", "\u4C4C"], /* CJK Ideograph Extension A */ + ["\u4C4D", "\u4C4D"], /* CJK Ideograph Extension A */ + ["\u4C4E", "\u4C4E"], /* CJK Ideograph Extension A */ + ["\u4C4F", "\u4C4F"], /* CJK Ideograph Extension A */ + ["\u4C50", "\u4C50"], /* CJK Ideograph Extension A */ + ["\u4C51", "\u4C51"], /* CJK Ideograph Extension A */ + ["\u4C52", "\u4C52"], /* CJK Ideograph Extension A */ + ["\u4C53", "\u4C53"], /* CJK Ideograph Extension A */ + ["\u4C54", "\u4C54"], /* CJK Ideograph Extension A */ + ["\u4C55", "\u4C55"], /* CJK Ideograph Extension A */ + ["\u4C56", "\u4C56"], /* CJK Ideograph Extension A */ + ["\u4C57", "\u4C57"], /* CJK Ideograph Extension A */ + ["\u4C58", "\u4C58"], /* CJK Ideograph Extension A */ + ["\u4C59", "\u4C59"], /* CJK Ideograph Extension A */ + ["\u4C5A", "\u4C5A"], /* CJK Ideograph Extension A */ + ["\u4C5B", "\u4C5B"], /* CJK Ideograph Extension A */ + ["\u4C5C", "\u4C5C"], /* CJK Ideograph Extension A */ + ["\u4C5D", "\u4C5D"], /* CJK Ideograph Extension A */ + ["\u4C5E", "\u4C5E"], /* CJK Ideograph Extension A */ + ["\u4C5F", "\u4C5F"], /* CJK Ideograph Extension A */ + ["\u4C60", "\u4C60"], /* CJK Ideograph Extension A */ + ["\u4C61", "\u4C61"], /* CJK Ideograph Extension A */ + ["\u4C62", "\u4C62"], /* CJK Ideograph Extension A */ + ["\u4C63", "\u4C63"], /* CJK Ideograph Extension A */ + ["\u4C64", "\u4C64"], /* CJK Ideograph Extension A */ + ["\u4C65", "\u4C65"], /* CJK Ideograph Extension A */ + ["\u4C66", "\u4C66"], /* CJK Ideograph Extension A */ + ["\u4C67", "\u4C67"], /* CJK Ideograph Extension A */ + ["\u4C68", "\u4C68"], /* CJK Ideograph Extension A */ + ["\u4C69", "\u4C69"], /* CJK Ideograph Extension A */ + ["\u4C6A", "\u4C6A"], /* CJK Ideograph Extension A */ + ["\u4C6B", "\u4C6B"], /* CJK Ideograph Extension A */ + ["\u4C6C", "\u4C6C"], /* CJK Ideograph Extension A */ + ["\u4C6D", "\u4C6D"], /* CJK Ideograph Extension A */ + ["\u4C6E", "\u4C6E"], /* CJK Ideograph Extension A */ + ["\u4C6F", "\u4C6F"], /* CJK Ideograph Extension A */ + ["\u4C70", "\u4C70"], /* CJK Ideograph Extension A */ + ["\u4C71", "\u4C71"], /* CJK Ideograph Extension A */ + ["\u4C72", "\u4C72"], /* CJK Ideograph Extension A */ + ["\u4C73", "\u4C73"], /* CJK Ideograph Extension A */ + ["\u4C74", "\u4C74"], /* CJK Ideograph Extension A */ + ["\u4C75", "\u4C75"], /* CJK Ideograph Extension A */ + ["\u4C76", "\u4C76"], /* CJK Ideograph Extension A */ + ["\u4C77", "\u4C77"], /* CJK Ideograph Extension A */ + ["\u4C78", "\u4C78"], /* CJK Ideograph Extension A */ + ["\u4C79", "\u4C79"], /* CJK Ideograph Extension A */ + ["\u4C7A", "\u4C7A"], /* CJK Ideograph Extension A */ + ["\u4C7B", "\u4C7B"], /* CJK Ideograph Extension A */ + ["\u4C7C", "\u4C7C"], /* CJK Ideograph Extension A */ + ["\u4C7D", "\u4C7D"], /* CJK Ideograph Extension A */ + ["\u4C7E", "\u4C7E"], /* CJK Ideograph Extension A */ + ["\u4C7F", "\u4C7F"], /* CJK Ideograph Extension A */ + ["\u4C80", "\u4C80"], /* CJK Ideograph Extension A */ + ["\u4C81", "\u4C81"], /* CJK Ideograph Extension A */ + ["\u4C82", "\u4C82"], /* CJK Ideograph Extension A */ + ["\u4C83", "\u4C83"], /* CJK Ideograph Extension A */ + ["\u4C84", "\u4C84"], /* CJK Ideograph Extension A */ + ["\u4C85", "\u4C85"], /* CJK Ideograph Extension A */ + ["\u4C86", "\u4C86"], /* CJK Ideograph Extension A */ + ["\u4C87", "\u4C87"], /* CJK Ideograph Extension A */ + ["\u4C88", "\u4C88"], /* CJK Ideograph Extension A */ + ["\u4C89", "\u4C89"], /* CJK Ideograph Extension A */ + ["\u4C8A", "\u4C8A"], /* CJK Ideograph Extension A */ + ["\u4C8B", "\u4C8B"], /* CJK Ideograph Extension A */ + ["\u4C8C", "\u4C8C"], /* CJK Ideograph Extension A */ + ["\u4C8D", "\u4C8D"], /* CJK Ideograph Extension A */ + ["\u4C8E", "\u4C8E"], /* CJK Ideograph Extension A */ + ["\u4C8F", "\u4C8F"], /* CJK Ideograph Extension A */ + ["\u4C90", "\u4C90"], /* CJK Ideograph Extension A */ + ["\u4C91", "\u4C91"], /* CJK Ideograph Extension A */ + ["\u4C92", "\u4C92"], /* CJK Ideograph Extension A */ + ["\u4C93", "\u4C93"], /* CJK Ideograph Extension A */ + ["\u4C94", "\u4C94"], /* CJK Ideograph Extension A */ + ["\u4C95", "\u4C95"], /* CJK Ideograph Extension A */ + ["\u4C96", "\u4C96"], /* CJK Ideograph Extension A */ + ["\u4C97", "\u4C97"], /* CJK Ideograph Extension A */ + ["\u4C98", "\u4C98"], /* CJK Ideograph Extension A */ + ["\u4C99", "\u4C99"], /* CJK Ideograph Extension A */ + ["\u4C9A", "\u4C9A"], /* CJK Ideograph Extension A */ + ["\u4C9B", "\u4C9B"], /* CJK Ideograph Extension A */ + ["\u4C9C", "\u4C9C"], /* CJK Ideograph Extension A */ + ["\u4C9D", "\u4C9D"], /* CJK Ideograph Extension A */ + ["\u4C9E", "\u4C9E"], /* CJK Ideograph Extension A */ + ["\u4C9F", "\u4C9F"], /* CJK Ideograph Extension A */ + ["\u4CA0", "\u4CA0"], /* CJK Ideograph Extension A */ + ["\u4CA1", "\u4CA1"], /* CJK Ideograph Extension A */ + ["\u4CA2", "\u4CA2"], /* CJK Ideograph Extension A */ + ["\u4CA3", "\u4CA3"], /* CJK Ideograph Extension A */ + ["\u4CA4", "\u4CA4"], /* CJK Ideograph Extension A */ + ["\u4CA5", "\u4CA5"], /* CJK Ideograph Extension A */ + ["\u4CA6", "\u4CA6"], /* CJK Ideograph Extension A */ + ["\u4CA7", "\u4CA7"], /* CJK Ideograph Extension A */ + ["\u4CA8", "\u4CA8"], /* CJK Ideograph Extension A */ + ["\u4CA9", "\u4CA9"], /* CJK Ideograph Extension A */ + ["\u4CAA", "\u4CAA"], /* CJK Ideograph Extension A */ + ["\u4CAB", "\u4CAB"], /* CJK Ideograph Extension A */ + ["\u4CAC", "\u4CAC"], /* CJK Ideograph Extension A */ + ["\u4CAD", "\u4CAD"], /* CJK Ideograph Extension A */ + ["\u4CAE", "\u4CAE"], /* CJK Ideograph Extension A */ + ["\u4CAF", "\u4CAF"], /* CJK Ideograph Extension A */ + ["\u4CB0", "\u4CB0"], /* CJK Ideograph Extension A */ + ["\u4CB1", "\u4CB1"], /* CJK Ideograph Extension A */ + ["\u4CB2", "\u4CB2"], /* CJK Ideograph Extension A */ + ["\u4CB3", "\u4CB3"], /* CJK Ideograph Extension A */ + ["\u4CB4", "\u4CB4"], /* CJK Ideograph Extension A */ + ["\u4CB5", "\u4CB5"], /* CJK Ideograph Extension A */ + ["\u4CB6", "\u4CB6"], /* CJK Ideograph Extension A */ + ["\u4CB7", "\u4CB7"], /* CJK Ideograph Extension A */ + ["\u4CB8", "\u4CB8"], /* CJK Ideograph Extension A */ + ["\u4CB9", "\u4CB9"], /* CJK Ideograph Extension A */ + ["\u4CBA", "\u4CBA"], /* CJK Ideograph Extension A */ + ["\u4CBB", "\u4CBB"], /* CJK Ideograph Extension A */ + ["\u4CBC", "\u4CBC"], /* CJK Ideograph Extension A */ + ["\u4CBD", "\u4CBD"], /* CJK Ideograph Extension A */ + ["\u4CBE", "\u4CBE"], /* CJK Ideograph Extension A */ + ["\u4CBF", "\u4CBF"], /* CJK Ideograph Extension A */ + ["\u4CC0", "\u4CC0"], /* CJK Ideograph Extension A */ + ["\u4CC1", "\u4CC1"], /* CJK Ideograph Extension A */ + ["\u4CC2", "\u4CC2"], /* CJK Ideograph Extension A */ + ["\u4CC3", "\u4CC3"], /* CJK Ideograph Extension A */ + ["\u4CC4", "\u4CC4"], /* CJK Ideograph Extension A */ + ["\u4CC5", "\u4CC5"], /* CJK Ideograph Extension A */ + ["\u4CC6", "\u4CC6"], /* CJK Ideograph Extension A */ + ["\u4CC7", "\u4CC7"], /* CJK Ideograph Extension A */ + ["\u4CC8", "\u4CC8"], /* CJK Ideograph Extension A */ + ["\u4CC9", "\u4CC9"], /* CJK Ideograph Extension A */ + ["\u4CCA", "\u4CCA"], /* CJK Ideograph Extension A */ + ["\u4CCB", "\u4CCB"], /* CJK Ideograph Extension A */ + ["\u4CCC", "\u4CCC"], /* CJK Ideograph Extension A */ + ["\u4CCD", "\u4CCD"], /* CJK Ideograph Extension A */ + ["\u4CCE", "\u4CCE"], /* CJK Ideograph Extension A */ + ["\u4CCF", "\u4CCF"], /* CJK Ideograph Extension A */ + ["\u4CD0", "\u4CD0"], /* CJK Ideograph Extension A */ + ["\u4CD1", "\u4CD1"], /* CJK Ideograph Extension A */ + ["\u4CD2", "\u4CD2"], /* CJK Ideograph Extension A */ + ["\u4CD3", "\u4CD3"], /* CJK Ideograph Extension A */ + ["\u4CD4", "\u4CD4"], /* CJK Ideograph Extension A */ + ["\u4CD5", "\u4CD5"], /* CJK Ideograph Extension A */ + ["\u4CD6", "\u4CD6"], /* CJK Ideograph Extension A */ + ["\u4CD7", "\u4CD7"], /* CJK Ideograph Extension A */ + ["\u4CD8", "\u4CD8"], /* CJK Ideograph Extension A */ + ["\u4CD9", "\u4CD9"], /* CJK Ideograph Extension A */ + ["\u4CDA", "\u4CDA"], /* CJK Ideograph Extension A */ + ["\u4CDB", "\u4CDB"], /* CJK Ideograph Extension A */ + ["\u4CDC", "\u4CDC"], /* CJK Ideograph Extension A */ + ["\u4CDD", "\u4CDD"], /* CJK Ideograph Extension A */ + ["\u4CDE", "\u4CDE"], /* CJK Ideograph Extension A */ + ["\u4CDF", "\u4CDF"], /* CJK Ideograph Extension A */ + ["\u4CE0", "\u4CE0"], /* CJK Ideograph Extension A */ + ["\u4CE1", "\u4CE1"], /* CJK Ideograph Extension A */ + ["\u4CE2", "\u4CE2"], /* CJK Ideograph Extension A */ + ["\u4CE3", "\u4CE3"], /* CJK Ideograph Extension A */ + ["\u4CE4", "\u4CE4"], /* CJK Ideograph Extension A */ + ["\u4CE5", "\u4CE5"], /* CJK Ideograph Extension A */ + ["\u4CE6", "\u4CE6"], /* CJK Ideograph Extension A */ + ["\u4CE7", "\u4CE7"], /* CJK Ideograph Extension A */ + ["\u4CE8", "\u4CE8"], /* CJK Ideograph Extension A */ + ["\u4CE9", "\u4CE9"], /* CJK Ideograph Extension A */ + ["\u4CEA", "\u4CEA"], /* CJK Ideograph Extension A */ + ["\u4CEB", "\u4CEB"], /* CJK Ideograph Extension A */ + ["\u4CEC", "\u4CEC"], /* CJK Ideograph Extension A */ + ["\u4CED", "\u4CED"], /* CJK Ideograph Extension A */ + ["\u4CEE", "\u4CEE"], /* CJK Ideograph Extension A */ + ["\u4CEF", "\u4CEF"], /* CJK Ideograph Extension A */ + ["\u4CF0", "\u4CF0"], /* CJK Ideograph Extension A */ + ["\u4CF1", "\u4CF1"], /* CJK Ideograph Extension A */ + ["\u4CF2", "\u4CF2"], /* CJK Ideograph Extension A */ + ["\u4CF3", "\u4CF3"], /* CJK Ideograph Extension A */ + ["\u4CF4", "\u4CF4"], /* CJK Ideograph Extension A */ + ["\u4CF5", "\u4CF5"], /* CJK Ideograph Extension A */ + ["\u4CF6", "\u4CF6"], /* CJK Ideograph Extension A */ + ["\u4CF7", "\u4CF7"], /* CJK Ideograph Extension A */ + ["\u4CF8", "\u4CF8"], /* CJK Ideograph Extension A */ + ["\u4CF9", "\u4CF9"], /* CJK Ideograph Extension A */ + ["\u4CFA", "\u4CFA"], /* CJK Ideograph Extension A */ + ["\u4CFB", "\u4CFB"], /* CJK Ideograph Extension A */ + ["\u4CFC", "\u4CFC"], /* CJK Ideograph Extension A */ + ["\u4CFD", "\u4CFD"], /* CJK Ideograph Extension A */ + ["\u4CFE", "\u4CFE"], /* CJK Ideograph Extension A */ + ["\u4CFF", "\u4CFF"], /* CJK Ideograph Extension A */ + ["\u4D00", "\u4D00"], /* CJK Ideograph Extension A */ + ["\u4D01", "\u4D01"], /* CJK Ideograph Extension A */ + ["\u4D02", "\u4D02"], /* CJK Ideograph Extension A */ + ["\u4D03", "\u4D03"], /* CJK Ideograph Extension A */ + ["\u4D04", "\u4D04"], /* CJK Ideograph Extension A */ + ["\u4D05", "\u4D05"], /* CJK Ideograph Extension A */ + ["\u4D06", "\u4D06"], /* CJK Ideograph Extension A */ + ["\u4D07", "\u4D07"], /* CJK Ideograph Extension A */ + ["\u4D08", "\u4D08"], /* CJK Ideograph Extension A */ + ["\u4D09", "\u4D09"], /* CJK Ideograph Extension A */ + ["\u4D0A", "\u4D0A"], /* CJK Ideograph Extension A */ + ["\u4D0B", "\u4D0B"], /* CJK Ideograph Extension A */ + ["\u4D0C", "\u4D0C"], /* CJK Ideograph Extension A */ + ["\u4D0D", "\u4D0D"], /* CJK Ideograph Extension A */ + ["\u4D0E", "\u4D0E"], /* CJK Ideograph Extension A */ + ["\u4D0F", "\u4D0F"], /* CJK Ideograph Extension A */ + ["\u4D10", "\u4D10"], /* CJK Ideograph Extension A */ + ["\u4D11", "\u4D11"], /* CJK Ideograph Extension A */ + ["\u4D12", "\u4D12"], /* CJK Ideograph Extension A */ + ["\u4D13", "\u4D13"], /* CJK Ideograph Extension A */ + ["\u4D14", "\u4D14"], /* CJK Ideograph Extension A */ + ["\u4D15", "\u4D15"], /* CJK Ideograph Extension A */ + ["\u4D16", "\u4D16"], /* CJK Ideograph Extension A */ + ["\u4D17", "\u4D17"], /* CJK Ideograph Extension A */ + ["\u4D18", "\u4D18"], /* CJK Ideograph Extension A */ + ["\u4D19", "\u4D19"], /* CJK Ideograph Extension A */ + ["\u4D1A", "\u4D1A"], /* CJK Ideograph Extension A */ + ["\u4D1B", "\u4D1B"], /* CJK Ideograph Extension A */ + ["\u4D1C", "\u4D1C"], /* CJK Ideograph Extension A */ + ["\u4D1D", "\u4D1D"], /* CJK Ideograph Extension A */ + ["\u4D1E", "\u4D1E"], /* CJK Ideograph Extension A */ + ["\u4D1F", "\u4D1F"], /* CJK Ideograph Extension A */ + ["\u4D20", "\u4D20"], /* CJK Ideograph Extension A */ + ["\u4D21", "\u4D21"], /* CJK Ideograph Extension A */ + ["\u4D22", "\u4D22"], /* CJK Ideograph Extension A */ + ["\u4D23", "\u4D23"], /* CJK Ideograph Extension A */ + ["\u4D24", "\u4D24"], /* CJK Ideograph Extension A */ + ["\u4D25", "\u4D25"], /* CJK Ideograph Extension A */ + ["\u4D26", "\u4D26"], /* CJK Ideograph Extension A */ + ["\u4D27", "\u4D27"], /* CJK Ideograph Extension A */ + ["\u4D28", "\u4D28"], /* CJK Ideograph Extension A */ + ["\u4D29", "\u4D29"], /* CJK Ideograph Extension A */ + ["\u4D2A", "\u4D2A"], /* CJK Ideograph Extension A */ + ["\u4D2B", "\u4D2B"], /* CJK Ideograph Extension A */ + ["\u4D2C", "\u4D2C"], /* CJK Ideograph Extension A */ + ["\u4D2D", "\u4D2D"], /* CJK Ideograph Extension A */ + ["\u4D2E", "\u4D2E"], /* CJK Ideograph Extension A */ + ["\u4D2F", "\u4D2F"], /* CJK Ideograph Extension A */ + ["\u4D30", "\u4D30"], /* CJK Ideograph Extension A */ + ["\u4D31", "\u4D31"], /* CJK Ideograph Extension A */ + ["\u4D32", "\u4D32"], /* CJK Ideograph Extension A */ + ["\u4D33", "\u4D33"], /* CJK Ideograph Extension A */ + ["\u4D34", "\u4D34"], /* CJK Ideograph Extension A */ + ["\u4D35", "\u4D35"], /* CJK Ideograph Extension A */ + ["\u4D36", "\u4D36"], /* CJK Ideograph Extension A */ + ["\u4D37", "\u4D37"], /* CJK Ideograph Extension A */ + ["\u4D38", "\u4D38"], /* CJK Ideograph Extension A */ + ["\u4D39", "\u4D39"], /* CJK Ideograph Extension A */ + ["\u4D3A", "\u4D3A"], /* CJK Ideograph Extension A */ + ["\u4D3B", "\u4D3B"], /* CJK Ideograph Extension A */ + ["\u4D3C", "\u4D3C"], /* CJK Ideograph Extension A */ + ["\u4D3D", "\u4D3D"], /* CJK Ideograph Extension A */ + ["\u4D3E", "\u4D3E"], /* CJK Ideograph Extension A */ + ["\u4D3F", "\u4D3F"], /* CJK Ideograph Extension A */ + ["\u4D40", "\u4D40"], /* CJK Ideograph Extension A */ + ["\u4D41", "\u4D41"], /* CJK Ideograph Extension A */ + ["\u4D42", "\u4D42"], /* CJK Ideograph Extension A */ + ["\u4D43", "\u4D43"], /* CJK Ideograph Extension A */ + ["\u4D44", "\u4D44"], /* CJK Ideograph Extension A */ + ["\u4D45", "\u4D45"], /* CJK Ideograph Extension A */ + ["\u4D46", "\u4D46"], /* CJK Ideograph Extension A */ + ["\u4D47", "\u4D47"], /* CJK Ideograph Extension A */ + ["\u4D48", "\u4D48"], /* CJK Ideograph Extension A */ + ["\u4D49", "\u4D49"], /* CJK Ideograph Extension A */ + ["\u4D4A", "\u4D4A"], /* CJK Ideograph Extension A */ + ["\u4D4B", "\u4D4B"], /* CJK Ideograph Extension A */ + ["\u4D4C", "\u4D4C"], /* CJK Ideograph Extension A */ + ["\u4D4D", "\u4D4D"], /* CJK Ideograph Extension A */ + ["\u4D4E", "\u4D4E"], /* CJK Ideograph Extension A */ + ["\u4D4F", "\u4D4F"], /* CJK Ideograph Extension A */ + ["\u4D50", "\u4D50"], /* CJK Ideograph Extension A */ + ["\u4D51", "\u4D51"], /* CJK Ideograph Extension A */ + ["\u4D52", "\u4D52"], /* CJK Ideograph Extension A */ + ["\u4D53", "\u4D53"], /* CJK Ideograph Extension A */ + ["\u4D54", "\u4D54"], /* CJK Ideograph Extension A */ + ["\u4D55", "\u4D55"], /* CJK Ideograph Extension A */ + ["\u4D56", "\u4D56"], /* CJK Ideograph Extension A */ + ["\u4D57", "\u4D57"], /* CJK Ideograph Extension A */ + ["\u4D58", "\u4D58"], /* CJK Ideograph Extension A */ + ["\u4D59", "\u4D59"], /* CJK Ideograph Extension A */ + ["\u4D5A", "\u4D5A"], /* CJK Ideograph Extension A */ + ["\u4D5B", "\u4D5B"], /* CJK Ideograph Extension A */ + ["\u4D5C", "\u4D5C"], /* CJK Ideograph Extension A */ + ["\u4D5D", "\u4D5D"], /* CJK Ideograph Extension A */ + ["\u4D5E", "\u4D5E"], /* CJK Ideograph Extension A */ + ["\u4D5F", "\u4D5F"], /* CJK Ideograph Extension A */ + ["\u4D60", "\u4D60"], /* CJK Ideograph Extension A */ + ["\u4D61", "\u4D61"], /* CJK Ideograph Extension A */ + ["\u4D62", "\u4D62"], /* CJK Ideograph Extension A */ + ["\u4D63", "\u4D63"], /* CJK Ideograph Extension A */ + ["\u4D64", "\u4D64"], /* CJK Ideograph Extension A */ + ["\u4D65", "\u4D65"], /* CJK Ideograph Extension A */ + ["\u4D66", "\u4D66"], /* CJK Ideograph Extension A */ + ["\u4D67", "\u4D67"], /* CJK Ideograph Extension A */ + ["\u4D68", "\u4D68"], /* CJK Ideograph Extension A */ + ["\u4D69", "\u4D69"], /* CJK Ideograph Extension A */ + ["\u4D6A", "\u4D6A"], /* CJK Ideograph Extension A */ + ["\u4D6B", "\u4D6B"], /* CJK Ideograph Extension A */ + ["\u4D6C", "\u4D6C"], /* CJK Ideograph Extension A */ + ["\u4D6D", "\u4D6D"], /* CJK Ideograph Extension A */ + ["\u4D6E", "\u4D6E"], /* CJK Ideograph Extension A */ + ["\u4D6F", "\u4D6F"], /* CJK Ideograph Extension A */ + ["\u4D70", "\u4D70"], /* CJK Ideograph Extension A */ + ["\u4D71", "\u4D71"], /* CJK Ideograph Extension A */ + ["\u4D72", "\u4D72"], /* CJK Ideograph Extension A */ + ["\u4D73", "\u4D73"], /* CJK Ideograph Extension A */ + ["\u4D74", "\u4D74"], /* CJK Ideograph Extension A */ + ["\u4D75", "\u4D75"], /* CJK Ideograph Extension A */ + ["\u4D76", "\u4D76"], /* CJK Ideograph Extension A */ + ["\u4D77", "\u4D77"], /* CJK Ideograph Extension A */ + ["\u4D78", "\u4D78"], /* CJK Ideograph Extension A */ + ["\u4D79", "\u4D79"], /* CJK Ideograph Extension A */ + ["\u4D7A", "\u4D7A"], /* CJK Ideograph Extension A */ + ["\u4D7B", "\u4D7B"], /* CJK Ideograph Extension A */ + ["\u4D7C", "\u4D7C"], /* CJK Ideograph Extension A */ + ["\u4D7D", "\u4D7D"], /* CJK Ideograph Extension A */ + ["\u4D7E", "\u4D7E"], /* CJK Ideograph Extension A */ + ["\u4D7F", "\u4D7F"], /* CJK Ideograph Extension A */ + ["\u4D80", "\u4D80"], /* CJK Ideograph Extension A */ + ["\u4D81", "\u4D81"], /* CJK Ideograph Extension A */ + ["\u4D82", "\u4D82"], /* CJK Ideograph Extension A */ + ["\u4D83", "\u4D83"], /* CJK Ideograph Extension A */ + ["\u4D84", "\u4D84"], /* CJK Ideograph Extension A */ + ["\u4D85", "\u4D85"], /* CJK Ideograph Extension A */ + ["\u4D86", "\u4D86"], /* CJK Ideograph Extension A */ + ["\u4D87", "\u4D87"], /* CJK Ideograph Extension A */ + ["\u4D88", "\u4D88"], /* CJK Ideograph Extension A */ + ["\u4D89", "\u4D89"], /* CJK Ideograph Extension A */ + ["\u4D8A", "\u4D8A"], /* CJK Ideograph Extension A */ + ["\u4D8B", "\u4D8B"], /* CJK Ideograph Extension A */ + ["\u4D8C", "\u4D8C"], /* CJK Ideograph Extension A */ + ["\u4D8D", "\u4D8D"], /* CJK Ideograph Extension A */ + ["\u4D8E", "\u4D8E"], /* CJK Ideograph Extension A */ + ["\u4D8F", "\u4D8F"], /* CJK Ideograph Extension A */ + ["\u4D90", "\u4D90"], /* CJK Ideograph Extension A */ + ["\u4D91", "\u4D91"], /* CJK Ideograph Extension A */ + ["\u4D92", "\u4D92"], /* CJK Ideograph Extension A */ + ["\u4D93", "\u4D93"], /* CJK Ideograph Extension A */ + ["\u4D94", "\u4D94"], /* CJK Ideograph Extension A */ + ["\u4D95", "\u4D95"], /* CJK Ideograph Extension A */ + ["\u4D96", "\u4D96"], /* CJK Ideograph Extension A */ + ["\u4D97", "\u4D97"], /* CJK Ideograph Extension A */ + ["\u4D98", "\u4D98"], /* CJK Ideograph Extension A */ + ["\u4D99", "\u4D99"], /* CJK Ideograph Extension A */ + ["\u4D9A", "\u4D9A"], /* CJK Ideograph Extension A */ + ["\u4D9B", "\u4D9B"], /* CJK Ideograph Extension A */ + ["\u4D9C", "\u4D9C"], /* CJK Ideograph Extension A */ + ["\u4D9D", "\u4D9D"], /* CJK Ideograph Extension A */ + ["\u4D9E", "\u4D9E"], /* CJK Ideograph Extension A */ + ["\u4D9F", "\u4D9F"], /* CJK Ideograph Extension A */ + ["\u4DA0", "\u4DA0"], /* CJK Ideograph Extension A */ + ["\u4DA1", "\u4DA1"], /* CJK Ideograph Extension A */ + ["\u4DA2", "\u4DA2"], /* CJK Ideograph Extension A */ + ["\u4DA3", "\u4DA3"], /* CJK Ideograph Extension A */ + ["\u4DA4", "\u4DA4"], /* CJK Ideograph Extension A */ + ["\u4DA5", "\u4DA5"], /* CJK Ideograph Extension A */ + ["\u4DA6", "\u4DA6"], /* CJK Ideograph Extension A */ + ["\u4DA7", "\u4DA7"], /* CJK Ideograph Extension A */ + ["\u4DA8", "\u4DA8"], /* CJK Ideograph Extension A */ + ["\u4DA9", "\u4DA9"], /* CJK Ideograph Extension A */ + ["\u4DAA", "\u4DAA"], /* CJK Ideograph Extension A */ + ["\u4DAB", "\u4DAB"], /* CJK Ideograph Extension A */ + ["\u4DAC", "\u4DAC"], /* CJK Ideograph Extension A */ + ["\u4DAD", "\u4DAD"], /* CJK Ideograph Extension A */ + ["\u4DAE", "\u4DAE"], /* CJK Ideograph Extension A */ + ["\u4DAF", "\u4DAF"], /* CJK Ideograph Extension A */ + ["\u4DB0", "\u4DB0"], /* CJK Ideograph Extension A */ + ["\u4DB1", "\u4DB1"], /* CJK Ideograph Extension A */ + ["\u4DB2", "\u4DB2"], /* CJK Ideograph Extension A */ + ["\u4DB3", "\u4DB3"], /* CJK Ideograph Extension A */ + ["\u4DB4", "\u4DB4"], /* CJK Ideograph Extension A */ + ["\u4DB5", "\u4DB5"], /* CJK Ideograph Extension A */ + ["\u4DB6", "\u4DB6"], /* CJK Ideograph Extension A */ + ["\u4DB7", "\u4DB7"], /* CJK Ideograph Extension A */ + ["\u4DB8", "\u4DB8"], /* CJK Ideograph Extension A */ + ["\u4DB9", "\u4DB9"], /* CJK Ideograph Extension A */ + ["\u4DBA", "\u4DBA"], /* CJK Ideograph Extension A */ + ["\u4DBB", "\u4DBB"], /* CJK Ideograph Extension A */ + ["\u4DBC", "\u4DBC"], /* CJK Ideograph Extension A */ + ["\u4DBD", "\u4DBD"], /* CJK Ideograph Extension A */ + ["\u4DBE", "\u4DBE"], /* CJK Ideograph Extension A */ + ["\u4DBF", "\u4DBF"], /* CJK Ideograph Extension A */ + ["\u4DC0", "\u4DC0"], /* HEXAGRAM FOR THE CREATIVE HEAVEN */ + ["\u4DC1", "\u4DC1"], /* HEXAGRAM FOR THE RECEPTIVE EARTH */ + ["\u4DC2", "\u4DC2"], /* HEXAGRAM FOR DIFFICULTY AT THE BEGINNING */ + ["\u4DC3", "\u4DC3"], /* HEXAGRAM FOR YOUTHFUL FOLLY */ + ["\u4DC4", "\u4DC4"], /* HEXAGRAM FOR WAITING */ + ["\u4DC5", "\u4DC5"], /* HEXAGRAM FOR CONFLICT */ + ["\u4DC6", "\u4DC6"], /* HEXAGRAM FOR THE ARMY */ + ["\u4DC7", "\u4DC7"], /* HEXAGRAM FOR HOLDING TOGETHER */ + ["\u4DC8", "\u4DC8"], /* HEXAGRAM FOR SMALL TAMING */ + ["\u4DC9", "\u4DC9"], /* HEXAGRAM FOR TREADING */ + ["\u4DCA", "\u4DCA"], /* HEXAGRAM FOR PEACE */ + ["\u4DCB", "\u4DCB"], /* HEXAGRAM FOR STANDSTILL */ + ["\u4DCC", "\u4DCC"], /* HEXAGRAM FOR FELLOWSHIP */ + ["\u4DCD", "\u4DCD"], /* HEXAGRAM FOR GREAT POSSESSION */ + ["\u4DCE", "\u4DCE"], /* HEXAGRAM FOR MODESTY */ + ["\u4DCF", "\u4DCF"], /* HEXAGRAM FOR ENTHUSIASM */ + ["\u4DD0", "\u4DD0"], /* HEXAGRAM FOR FOLLOWING */ + ["\u4DD1", "\u4DD1"], /* HEXAGRAM FOR WORK ON THE DECAYED */ + ["\u4DD2", "\u4DD2"], /* HEXAGRAM FOR APPROACH */ + ["\u4DD3", "\u4DD3"], /* HEXAGRAM FOR CONTEMPLATION */ + ["\u4DD4", "\u4DD4"], /* HEXAGRAM FOR BITING THROUGH */ + ["\u4DD5", "\u4DD5"], /* HEXAGRAM FOR GRACE */ + ["\u4DD6", "\u4DD6"], /* HEXAGRAM FOR SPLITTING APART */ + ["\u4DD7", "\u4DD7"], /* HEXAGRAM FOR RETURN */ + ["\u4DD8", "\u4DD8"], /* HEXAGRAM FOR INNOCENCE */ + ["\u4DD9", "\u4DD9"], /* HEXAGRAM FOR GREAT TAMING */ + ["\u4DDA", "\u4DDA"], /* HEXAGRAM FOR MOUTH CORNERS */ + ["\u4DDB", "\u4DDB"], /* HEXAGRAM FOR GREAT PREPONDERANCE */ + ["\u4DDC", "\u4DDC"], /* HEXAGRAM FOR THE ABYSMAL WATER */ + ["\u4DDD", "\u4DDD"], /* HEXAGRAM FOR THE CLINGING FIRE */ + ["\u4DDE", "\u4DDE"], /* HEXAGRAM FOR INFLUENCE */ + ["\u4DDF", "\u4DDF"], /* HEXAGRAM FOR DURATION */ + ["\u4DE0", "\u4DE0"], /* HEXAGRAM FOR RETREAT */ + ["\u4DE1", "\u4DE1"], /* HEXAGRAM FOR GREAT POWER */ + ["\u4DE2", "\u4DE2"], /* HEXAGRAM FOR PROGRESS */ + ["\u4DE3", "\u4DE3"], /* HEXAGRAM FOR DARKENING OF THE LIGHT */ + ["\u4DE4", "\u4DE4"], /* HEXAGRAM FOR THE FAMILY */ + ["\u4DE5", "\u4DE5"], /* HEXAGRAM FOR OPPOSITION */ + ["\u4DE6", "\u4DE6"], /* HEXAGRAM FOR OBSTRUCTION */ + ["\u4DE7", "\u4DE7"], /* HEXAGRAM FOR DELIVERANCE */ + ["\u4DE8", "\u4DE8"], /* HEXAGRAM FOR DECREASE */ + ["\u4DE9", "\u4DE9"], /* HEXAGRAM FOR INCREASE */ + ["\u4DEA", "\u4DEA"], /* HEXAGRAM FOR BREAKTHROUGH */ + ["\u4DEB", "\u4DEB"], /* HEXAGRAM FOR COMING TO MEET */ + ["\u4DEC", "\u4DEC"], /* HEXAGRAM FOR GATHERING TOGETHER */ + ["\u4DED", "\u4DED"], /* HEXAGRAM FOR PUSHING UPWARD */ + ["\u4DEE", "\u4DEE"], /* HEXAGRAM FOR OPPRESSION */ + ["\u4DEF", "\u4DEF"], /* HEXAGRAM FOR THE WELL */ + ["\u4DF0", "\u4DF0"], /* HEXAGRAM FOR REVOLUTION */ + ["\u4DF1", "\u4DF1"], /* HEXAGRAM FOR THE CAULDRON */ + ["\u4DF2", "\u4DF2"], /* HEXAGRAM FOR THE AROUSING THUNDER */ + ["\u4DF3", "\u4DF3"], /* HEXAGRAM FOR THE KEEPING STILL MOUNTAIN */ + ["\u4DF4", "\u4DF4"], /* HEXAGRAM FOR DEVELOPMENT */ + ["\u4DF5", "\u4DF5"], /* HEXAGRAM FOR THE MARRYING MAIDEN */ + ["\u4DF6", "\u4DF6"], /* HEXAGRAM FOR ABUNDANCE */ + ["\u4DF7", "\u4DF7"], /* HEXAGRAM FOR THE WANDERER */ + ["\u4DF8", "\u4DF8"], /* HEXAGRAM FOR THE GENTLE WIND */ + ["\u4DF9", "\u4DF9"], /* HEXAGRAM FOR THE JOYOUS LAKE */ + ["\u4DFA", "\u4DFA"], /* HEXAGRAM FOR DISPERSION */ + ["\u4DFB", "\u4DFB"], /* HEXAGRAM FOR LIMITATION */ + ["\u4DFC", "\u4DFC"], /* HEXAGRAM FOR INNER TRUTH */ + ["\u4DFD", "\u4DFD"], /* HEXAGRAM FOR SMALL PREPONDERANCE */ + ["\u4DFE", "\u4DFE"], /* HEXAGRAM FOR AFTER COMPLETION */ + ["\u4DFF", "\u4DFF"], /* HEXAGRAM FOR BEFORE COMPLETION */ + ["\u4E00", "\u4E00"], /* CJK Ideograph */ + ["\u4E01", "\u4E01"], /* CJK Ideograph */ + ["\u4E02", "\u4E02"], /* CJK Ideograph */ + ["\u4E03", "\u4E03"], /* CJK Ideograph */ + ["\u4E04", "\u4E04"], /* CJK Ideograph */ + ["\u4E05", "\u4E05"], /* CJK Ideograph */ + ["\u4E06", "\u4E06"], /* CJK Ideograph */ + ["\u4E07", "\u4E07"], /* CJK Ideograph */ + ["\u4E08", "\u4E08"], /* CJK Ideograph */ + ["\u4E09", "\u4E09"], /* CJK Ideograph */ + ["\u4E0A", "\u4E0A"], /* CJK Ideograph */ + ["\u4E0B", "\u4E0B"], /* CJK Ideograph */ + ["\u4E0C", "\u4E0C"], /* CJK Ideograph */ + ["\u4E0D", "\u4E0D"], /* CJK Ideograph */ + ["\u4E0E", "\u4E0E"], /* CJK Ideograph */ + ["\u4E0F", "\u4E0F"], /* CJK Ideograph */ + ["\u4E10", "\u4E10"], /* CJK Ideograph */ + ["\u4E11", "\u4E11"], /* CJK Ideograph */ + ["\u4E12", "\u4E12"], /* CJK Ideograph */ + ["\u4E13", "\u4E13"], /* CJK Ideograph */ + ["\u4E14", "\u4E14"], /* CJK Ideograph */ + ["\u4E15", "\u4E15"], /* CJK Ideograph */ + ["\u4E16", "\u4E16"], /* CJK Ideograph */ + ["\u4E17", "\u4E17"], /* CJK Ideograph */ + ["\u4E18", "\u4E18"], /* CJK Ideograph */ + ["\u4E19", "\u4E19"], /* CJK Ideograph */ + ["\u4E1A", "\u4E1A"], /* CJK Ideograph */ + ["\u4E1B", "\u4E1B"], /* CJK Ideograph */ + ["\u4E1C", "\u4E1C"], /* CJK Ideograph */ + ["\u4E1D", "\u4E1D"], /* CJK Ideograph */ + ["\u4E1E", "\u4E1E"], /* CJK Ideograph */ + ["\u4E1F", "\u4E1F"], /* CJK Ideograph */ + ["\u4E20", "\u4E20"], /* CJK Ideograph */ + ["\u4E21", "\u4E21"], /* CJK Ideograph */ + ["\u4E22", "\u4E22"], /* CJK Ideograph */ + ["\u4E23", "\u4E23"], /* CJK Ideograph */ + ["\u4E24", "\u4E24"], /* CJK Ideograph */ + ["\u4E25", "\u4E25"], /* CJK Ideograph */ + ["\u4E26", "\u4E26"], /* CJK Ideograph */ + ["\u4E27", "\u4E27"], /* CJK Ideograph */ + ["\u4E28", "\u4E28"], /* CJK Ideograph */ + ["\u4E29", "\u4E29"], /* CJK Ideograph */ + ["\u4E2A", "\u4E2A"], /* CJK Ideograph */ + ["\u4E2B", "\u4E2B"], /* CJK Ideograph */ + ["\u4E2C", "\u4E2C"], /* CJK Ideograph */ + ["\u4E2D", "\u4E2D"], /* CJK Ideograph */ + ["\u4E2E", "\u4E2E"], /* CJK Ideograph */ + ["\u4E2F", "\u4E2F"], /* CJK Ideograph */ + ["\u4E30", "\u4E30"], /* CJK Ideograph */ + ["\u4E31", "\u4E31"], /* CJK Ideograph */ + ["\u4E32", "\u4E32"], /* CJK Ideograph */ + ["\u4E33", "\u4E33"], /* CJK Ideograph */ + ["\u4E34", "\u4E34"], /* CJK Ideograph */ + ["\u4E35", "\u4E35"], /* CJK Ideograph */ + ["\u4E36", "\u4E36"], /* CJK Ideograph */ + ["\u4E37", "\u4E37"], /* CJK Ideograph */ + ["\u4E38", "\u4E38"], /* CJK Ideograph */ + ["\u4E39", "\u4E39"], /* CJK Ideograph */ + ["\u4E3A", "\u4E3A"], /* CJK Ideograph */ + ["\u4E3B", "\u4E3B"], /* CJK Ideograph */ + ["\u4E3C", "\u4E3C"], /* CJK Ideograph */ + ["\u4E3D", "\u4E3D"], /* CJK Ideograph */ + ["\u4E3E", "\u4E3E"], /* CJK Ideograph */ + ["\u4E3F", "\u4E3F"], /* CJK Ideograph */ + ["\u4E40", "\u4E40"], /* CJK Ideograph */ + ["\u4E41", "\u4E41"], /* CJK Ideograph */ + ["\u4E42", "\u4E42"], /* CJK Ideograph */ + ["\u4E43", "\u4E43"], /* CJK Ideograph */ + ["\u4E44", "\u4E44"], /* CJK Ideograph */ + ["\u4E45", "\u4E45"], /* CJK Ideograph */ + ["\u4E46", "\u4E46"], /* CJK Ideograph */ + ["\u4E47", "\u4E47"], /* CJK Ideograph */ + ["\u4E48", "\u4E48"], /* CJK Ideograph */ + ["\u4E49", "\u4E49"], /* CJK Ideograph */ + ["\u4E4A", "\u4E4A"], /* CJK Ideograph */ + ["\u4E4B", "\u4E4B"], /* CJK Ideograph */ + ["\u4E4C", "\u4E4C"], /* CJK Ideograph */ + ["\u4E4D", "\u4E4D"], /* CJK Ideograph */ + ["\u4E4E", "\u4E4E"], /* CJK Ideograph */ + ["\u4E4F", "\u4E4F"], /* CJK Ideograph */ + ["\u4E50", "\u4E50"], /* CJK Ideograph */ + ["\u4E51", "\u4E51"], /* CJK Ideograph */ + ["\u4E52", "\u4E52"], /* CJK Ideograph */ + ["\u4E53", "\u4E53"], /* CJK Ideograph */ + ["\u4E54", "\u4E54"], /* CJK Ideograph */ + ["\u4E55", "\u4E55"], /* CJK Ideograph */ + ["\u4E56", "\u4E56"], /* CJK Ideograph */ + ["\u4E57", "\u4E57"], /* CJK Ideograph */ + ["\u4E58", "\u4E58"], /* CJK Ideograph */ + ["\u4E59", "\u4E59"], /* CJK Ideograph */ + ["\u4E5A", "\u4E5A"], /* CJK Ideograph */ + ["\u4E5B", "\u4E5B"], /* CJK Ideograph */ + ["\u4E5C", "\u4E5C"], /* CJK Ideograph */ + ["\u4E5D", "\u4E5D"], /* CJK Ideograph */ + ["\u4E5E", "\u4E5E"], /* CJK Ideograph */ + ["\u4E5F", "\u4E5F"], /* CJK Ideograph */ + ["\u4E60", "\u4E60"], /* CJK Ideograph */ + ["\u4E61", "\u4E61"], /* CJK Ideograph */ + ["\u4E62", "\u4E62"], /* CJK Ideograph */ + ["\u4E63", "\u4E63"], /* CJK Ideograph */ + ["\u4E64", "\u4E64"], /* CJK Ideograph */ + ["\u4E65", "\u4E65"], /* CJK Ideograph */ + ["\u4E66", "\u4E66"], /* CJK Ideograph */ + ["\u4E67", "\u4E67"], /* CJK Ideograph */ + ["\u4E68", "\u4E68"], /* CJK Ideograph */ + ["\u4E69", "\u4E69"], /* CJK Ideograph */ + ["\u4E6A", "\u4E6A"], /* CJK Ideograph */ + ["\u4E6B", "\u4E6B"], /* CJK Ideograph */ + ["\u4E6C", "\u4E6C"], /* CJK Ideograph */ + ["\u4E6D", "\u4E6D"], /* CJK Ideograph */ + ["\u4E6E", "\u4E6E"], /* CJK Ideograph */ + ["\u4E6F", "\u4E6F"], /* CJK Ideograph */ + ["\u4E70", "\u4E70"], /* CJK Ideograph */ + ["\u4E71", "\u4E71"], /* CJK Ideograph */ + ["\u4E72", "\u4E72"], /* CJK Ideograph */ + ["\u4E73", "\u4E73"], /* CJK Ideograph */ + ["\u4E74", "\u4E74"], /* CJK Ideograph */ + ["\u4E75", "\u4E75"], /* CJK Ideograph */ + ["\u4E76", "\u4E76"], /* CJK Ideograph */ + ["\u4E77", "\u4E77"], /* CJK Ideograph */ + ["\u4E78", "\u4E78"], /* CJK Ideograph */ + ["\u4E79", "\u4E79"], /* CJK Ideograph */ + ["\u4E7A", "\u4E7A"], /* CJK Ideograph */ + ["\u4E7B", "\u4E7B"], /* CJK Ideograph */ + ["\u4E7C", "\u4E7C"], /* CJK Ideograph */ + ["\u4E7D", "\u4E7D"], /* CJK Ideograph */ + ["\u4E7E", "\u4E7E"], /* CJK Ideograph */ + ["\u4E7F", "\u4E7F"], /* CJK Ideograph */ + ["\u4E80", "\u4E80"], /* CJK Ideograph */ + ["\u4E81", "\u4E81"], /* CJK Ideograph */ + ["\u4E82", "\u4E82"], /* CJK Ideograph */ + ["\u4E83", "\u4E83"], /* CJK Ideograph */ + ["\u4E84", "\u4E84"], /* CJK Ideograph */ + ["\u4E85", "\u4E85"], /* CJK Ideograph */ + ["\u4E86", "\u4E86"], /* CJK Ideograph */ + ["\u4E87", "\u4E87"], /* CJK Ideograph */ + ["\u4E88", "\u4E88"], /* CJK Ideograph */ + ["\u4E89", "\u4E89"], /* CJK Ideograph */ + ["\u4E8A", "\u4E8A"], /* CJK Ideograph */ + ["\u4E8B", "\u4E8B"], /* CJK Ideograph */ + ["\u4E8C", "\u4E8C"], /* CJK Ideograph */ + ["\u4E8D", "\u4E8D"], /* CJK Ideograph */ + ["\u4E8E", "\u4E8E"], /* CJK Ideograph */ + ["\u4E8F", "\u4E8F"], /* CJK Ideograph */ + ["\u4E90", "\u4E90"], /* CJK Ideograph */ + ["\u4E91", "\u4E91"], /* CJK Ideograph */ + ["\u4E92", "\u4E92"], /* CJK Ideograph */ + ["\u4E93", "\u4E93"], /* CJK Ideograph */ + ["\u4E94", "\u4E94"], /* CJK Ideograph */ + ["\u4E95", "\u4E95"], /* CJK Ideograph */ + ["\u4E96", "\u4E96"], /* CJK Ideograph */ + ["\u4E97", "\u4E97"], /* CJK Ideograph */ + ["\u4E98", "\u4E98"], /* CJK Ideograph */ + ["\u4E99", "\u4E99"], /* CJK Ideograph */ + ["\u4E9A", "\u4E9A"], /* CJK Ideograph */ + ["\u4E9B", "\u4E9B"], /* CJK Ideograph */ + ["\u4E9C", "\u4E9C"], /* CJK Ideograph */ + ["\u4E9D", "\u4E9D"], /* CJK Ideograph */ + ["\u4E9E", "\u4E9E"], /* CJK Ideograph */ + ["\u4E9F", "\u4E9F"], /* CJK Ideograph */ + ["\u4EA0", "\u4EA0"], /* CJK Ideograph */ + ["\u4EA1", "\u4EA1"], /* CJK Ideograph */ + ["\u4EA2", "\u4EA2"], /* CJK Ideograph */ + ["\u4EA3", "\u4EA3"], /* CJK Ideograph */ + ["\u4EA4", "\u4EA4"], /* CJK Ideograph */ + ["\u4EA5", "\u4EA5"], /* CJK Ideograph */ + ["\u4EA6", "\u4EA6"], /* CJK Ideograph */ + ["\u4EA7", "\u4EA7"], /* CJK Ideograph */ + ["\u4EA8", "\u4EA8"], /* CJK Ideograph */ + ["\u4EA9", "\u4EA9"], /* CJK Ideograph */ + ["\u4EAA", "\u4EAA"], /* CJK Ideograph */ + ["\u4EAB", "\u4EAB"], /* CJK Ideograph */ + ["\u4EAC", "\u4EAC"], /* CJK Ideograph */ + ["\u4EAD", "\u4EAD"], /* CJK Ideograph */ + ["\u4EAE", "\u4EAE"], /* CJK Ideograph */ + ["\u4EAF", "\u4EAF"], /* CJK Ideograph */ + ["\u4EB0", "\u4EB0"], /* CJK Ideograph */ + ["\u4EB1", "\u4EB1"], /* CJK Ideograph */ + ["\u4EB2", "\u4EB2"], /* CJK Ideograph */ + ["\u4EB3", "\u4EB3"], /* CJK Ideograph */ + ["\u4EB4", "\u4EB4"], /* CJK Ideograph */ + ["\u4EB5", "\u4EB5"], /* CJK Ideograph */ + ["\u4EB6", "\u4EB6"], /* CJK Ideograph */ + ["\u4EB7", "\u4EB7"], /* CJK Ideograph */ + ["\u4EB8", "\u4EB8"], /* CJK Ideograph */ + ["\u4EB9", "\u4EB9"], /* CJK Ideograph */ + ["\u4EBA", "\u4EBA"], /* CJK Ideograph */ + ["\u4EBB", "\u4EBB"], /* CJK Ideograph */ + ["\u4EBC", "\u4EBC"], /* CJK Ideograph */ + ["\u4EBD", "\u4EBD"], /* CJK Ideograph */ + ["\u4EBE", "\u4EBE"], /* CJK Ideograph */ + ["\u4EBF", "\u4EBF"], /* CJK Ideograph */ + ["\u4EC0", "\u4EC0"], /* CJK Ideograph */ + ["\u4EC1", "\u4EC1"], /* CJK Ideograph */ + ["\u4EC2", "\u4EC2"], /* CJK Ideograph */ + ["\u4EC3", "\u4EC3"], /* CJK Ideograph */ + ["\u4EC4", "\u4EC4"], /* CJK Ideograph */ + ["\u4EC5", "\u4EC5"], /* CJK Ideograph */ + ["\u4EC6", "\u4EC6"], /* CJK Ideograph */ + ["\u4EC7", "\u4EC7"], /* CJK Ideograph */ + ["\u4EC8", "\u4EC8"], /* CJK Ideograph */ + ["\u4EC9", "\u4EC9"], /* CJK Ideograph */ + ["\u4ECA", "\u4ECA"], /* CJK Ideograph */ + ["\u4ECB", "\u4ECB"], /* CJK Ideograph */ + ["\u4ECC", "\u4ECC"], /* CJK Ideograph */ + ["\u4ECD", "\u4ECD"], /* CJK Ideograph */ + ["\u4ECE", "\u4ECE"], /* CJK Ideograph */ + ["\u4ECF", "\u4ECF"], /* CJK Ideograph */ + ["\u4ED0", "\u4ED0"], /* CJK Ideograph */ + ["\u4ED1", "\u4ED1"], /* CJK Ideograph */ + ["\u4ED2", "\u4ED2"], /* CJK Ideograph */ + ["\u4ED3", "\u4ED3"], /* CJK Ideograph */ + ["\u4ED4", "\u4ED4"], /* CJK Ideograph */ + ["\u4ED5", "\u4ED5"], /* CJK Ideograph */ + ["\u4ED6", "\u4ED6"], /* CJK Ideograph */ + ["\u4ED7", "\u4ED7"], /* CJK Ideograph */ + ["\u4ED8", "\u4ED8"], /* CJK Ideograph */ + ["\u4ED9", "\u4ED9"], /* CJK Ideograph */ + ["\u4EDA", "\u4EDA"], /* CJK Ideograph */ + ["\u4EDB", "\u4EDB"], /* CJK Ideograph */ + ["\u4EDC", "\u4EDC"], /* CJK Ideograph */ + ["\u4EDD", "\u4EDD"], /* CJK Ideograph */ + ["\u4EDE", "\u4EDE"], /* CJK Ideograph */ + ["\u4EDF", "\u4EDF"], /* CJK Ideograph */ + ["\u4EE0", "\u4EE0"], /* CJK Ideograph */ + ["\u4EE1", "\u4EE1"], /* CJK Ideograph */ + ["\u4EE2", "\u4EE2"], /* CJK Ideograph */ + ["\u4EE3", "\u4EE3"], /* CJK Ideograph */ + ["\u4EE4", "\u4EE4"], /* CJK Ideograph */ + ["\u4EE5", "\u4EE5"], /* CJK Ideograph */ + ["\u4EE6", "\u4EE6"], /* CJK Ideograph */ + ["\u4EE7", "\u4EE7"], /* CJK Ideograph */ + ["\u4EE8", "\u4EE8"], /* CJK Ideograph */ + ["\u4EE9", "\u4EE9"], /* CJK Ideograph */ + ["\u4EEA", "\u4EEA"], /* CJK Ideograph */ + ["\u4EEB", "\u4EEB"], /* CJK Ideograph */ + ["\u4EEC", "\u4EEC"], /* CJK Ideograph */ + ["\u4EED", "\u4EED"], /* CJK Ideograph */ + ["\u4EEE", "\u4EEE"], /* CJK Ideograph */ + ["\u4EEF", "\u4EEF"], /* CJK Ideograph */ + ["\u4EF0", "\u4EF0"], /* CJK Ideograph */ + ["\u4EF1", "\u4EF1"], /* CJK Ideograph */ + ["\u4EF2", "\u4EF2"], /* CJK Ideograph */ + ["\u4EF3", "\u4EF3"], /* CJK Ideograph */ + ["\u4EF4", "\u4EF4"], /* CJK Ideograph */ + ["\u4EF5", "\u4EF5"], /* CJK Ideograph */ + ["\u4EF6", "\u4EF6"], /* CJK Ideograph */ + ["\u4EF7", "\u4EF7"], /* CJK Ideograph */ + ["\u4EF8", "\u4EF8"], /* CJK Ideograph */ + ["\u4EF9", "\u4EF9"], /* CJK Ideograph */ + ["\u4EFA", "\u4EFA"], /* CJK Ideograph */ + ["\u4EFB", "\u4EFB"], /* CJK Ideograph */ + ["\u4EFC", "\u4EFC"], /* CJK Ideograph */ + ["\u4EFD", "\u4EFD"], /* CJK Ideograph */ + ["\u4EFE", "\u4EFE"], /* CJK Ideograph */ + ["\u4EFF", "\u4EFF"], /* CJK Ideograph */ + ["\u4F00", "\u4F00"], /* CJK Ideograph */ + ["\u4F01", "\u4F01"], /* CJK Ideograph */ + ["\u4F02", "\u4F02"], /* CJK Ideograph */ + ["\u4F03", "\u4F03"], /* CJK Ideograph */ + ["\u4F04", "\u4F04"], /* CJK Ideograph */ + ["\u4F05", "\u4F05"], /* CJK Ideograph */ + ["\u4F06", "\u4F06"], /* CJK Ideograph */ + ["\u4F07", "\u4F07"], /* CJK Ideograph */ + ["\u4F08", "\u4F08"], /* CJK Ideograph */ + ["\u4F09", "\u4F09"], /* CJK Ideograph */ + ["\u4F0A", "\u4F0A"], /* CJK Ideograph */ + ["\u4F0B", "\u4F0B"], /* CJK Ideograph */ + ["\u4F0C", "\u4F0C"], /* CJK Ideograph */ + ["\u4F0D", "\u4F0D"], /* CJK Ideograph */ + ["\u4F0E", "\u4F0E"], /* CJK Ideograph */ + ["\u4F0F", "\u4F0F"], /* CJK Ideograph */ + ["\u4F10", "\u4F10"], /* CJK Ideograph */ + ["\u4F11", "\u4F11"], /* CJK Ideograph */ + ["\u4F12", "\u4F12"], /* CJK Ideograph */ + ["\u4F13", "\u4F13"], /* CJK Ideograph */ + ["\u4F14", "\u4F14"], /* CJK Ideograph */ + ["\u4F15", "\u4F15"], /* CJK Ideograph */ + ["\u4F16", "\u4F16"], /* CJK Ideograph */ + ["\u4F17", "\u4F17"], /* CJK Ideograph */ + ["\u4F18", "\u4F18"], /* CJK Ideograph */ + ["\u4F19", "\u4F19"], /* CJK Ideograph */ + ["\u4F1A", "\u4F1A"], /* CJK Ideograph */ + ["\u4F1B", "\u4F1B"], /* CJK Ideograph */ + ["\u4F1C", "\u4F1C"], /* CJK Ideograph */ + ["\u4F1D", "\u4F1D"], /* CJK Ideograph */ + ["\u4F1E", "\u4F1E"], /* CJK Ideograph */ + ["\u4F1F", "\u4F1F"], /* CJK Ideograph */ + ["\u4F20", "\u4F20"], /* CJK Ideograph */ + ["\u4F21", "\u4F21"], /* CJK Ideograph */ + ["\u4F22", "\u4F22"], /* CJK Ideograph */ + ["\u4F23", "\u4F23"], /* CJK Ideograph */ + ["\u4F24", "\u4F24"], /* CJK Ideograph */ + ["\u4F25", "\u4F25"], /* CJK Ideograph */ + ["\u4F26", "\u4F26"], /* CJK Ideograph */ + ["\u4F27", "\u4F27"], /* CJK Ideograph */ + ["\u4F28", "\u4F28"], /* CJK Ideograph */ + ["\u4F29", "\u4F29"], /* CJK Ideograph */ + ["\u4F2A", "\u4F2A"], /* CJK Ideograph */ + ["\u4F2B", "\u4F2B"], /* CJK Ideograph */ + ["\u4F2C", "\u4F2C"], /* CJK Ideograph */ + ["\u4F2D", "\u4F2D"], /* CJK Ideograph */ + ["\u4F2E", "\u4F2E"], /* CJK Ideograph */ + ["\u4F2F", "\u4F2F"], /* CJK Ideograph */ + ["\u4F30", "\u4F30"], /* CJK Ideograph */ + ["\u4F31", "\u4F31"], /* CJK Ideograph */ + ["\u4F32", "\u4F32"], /* CJK Ideograph */ + ["\u4F33", "\u4F33"], /* CJK Ideograph */ + ["\u4F34", "\u4F34"], /* CJK Ideograph */ + ["\u4F35", "\u4F35"], /* CJK Ideograph */ + ["\u4F36", "\u4F36"], /* CJK Ideograph */ + ["\u4F37", "\u4F37"], /* CJK Ideograph */ + ["\u4F38", "\u4F38"], /* CJK Ideograph */ + ["\u4F39", "\u4F39"], /* CJK Ideograph */ + ["\u4F3A", "\u4F3A"], /* CJK Ideograph */ + ["\u4F3B", "\u4F3B"], /* CJK Ideograph */ + ["\u4F3C", "\u4F3C"], /* CJK Ideograph */ + ["\u4F3D", "\u4F3D"], /* CJK Ideograph */ + ["\u4F3E", "\u4F3E"], /* CJK Ideograph */ + ["\u4F3F", "\u4F3F"], /* CJK Ideograph */ + ["\u4F40", "\u4F40"], /* CJK Ideograph */ + ["\u4F41", "\u4F41"], /* CJK Ideograph */ + ["\u4F42", "\u4F42"], /* CJK Ideograph */ + ["\u4F43", "\u4F43"], /* CJK Ideograph */ + ["\u4F44", "\u4F44"], /* CJK Ideograph */ + ["\u4F45", "\u4F45"], /* CJK Ideograph */ + ["\u4F46", "\u4F46"], /* CJK Ideograph */ + ["\u4F47", "\u4F47"], /* CJK Ideograph */ + ["\u4F48", "\u4F48"], /* CJK Ideograph */ + ["\u4F49", "\u4F49"], /* CJK Ideograph */ + ["\u4F4A", "\u4F4A"], /* CJK Ideograph */ + ["\u4F4B", "\u4F4B"], /* CJK Ideograph */ + ["\u4F4C", "\u4F4C"], /* CJK Ideograph */ + ["\u4F4D", "\u4F4D"], /* CJK Ideograph */ + ["\u4F4E", "\u4F4E"], /* CJK Ideograph */ + ["\u4F4F", "\u4F4F"], /* CJK Ideograph */ + ["\u4F50", "\u4F50"], /* CJK Ideograph */ + ["\u4F51", "\u4F51"], /* CJK Ideograph */ + ["\u4F52", "\u4F52"], /* CJK Ideograph */ + ["\u4F53", "\u4F53"], /* CJK Ideograph */ + ["\u4F54", "\u4F54"], /* CJK Ideograph */ + ["\u4F55", "\u4F55"], /* CJK Ideograph */ + ["\u4F56", "\u4F56"], /* CJK Ideograph */ + ["\u4F57", "\u4F57"], /* CJK Ideograph */ + ["\u4F58", "\u4F58"], /* CJK Ideograph */ + ["\u4F59", "\u4F59"], /* CJK Ideograph */ + ["\u4F5A", "\u4F5A"], /* CJK Ideograph */ + ["\u4F5B", "\u4F5B"], /* CJK Ideograph */ + ["\u4F5C", "\u4F5C"], /* CJK Ideograph */ + ["\u4F5D", "\u4F5D"], /* CJK Ideograph */ + ["\u4F5E", "\u4F5E"], /* CJK Ideograph */ + ["\u4F5F", "\u4F5F"], /* CJK Ideograph */ + ["\u4F60", "\u4F60"], /* CJK Ideograph */ + ["\u4F61", "\u4F61"], /* CJK Ideograph */ + ["\u4F62", "\u4F62"], /* CJK Ideograph */ + ["\u4F63", "\u4F63"], /* CJK Ideograph */ + ["\u4F64", "\u4F64"], /* CJK Ideograph */ + ["\u4F65", "\u4F65"], /* CJK Ideograph */ + ["\u4F66", "\u4F66"], /* CJK Ideograph */ + ["\u4F67", "\u4F67"], /* CJK Ideograph */ + ["\u4F68", "\u4F68"], /* CJK Ideograph */ + ["\u4F69", "\u4F69"], /* CJK Ideograph */ + ["\u4F6A", "\u4F6A"], /* CJK Ideograph */ + ["\u4F6B", "\u4F6B"], /* CJK Ideograph */ + ["\u4F6C", "\u4F6C"], /* CJK Ideograph */ + ["\u4F6D", "\u4F6D"], /* CJK Ideograph */ + ["\u4F6E", "\u4F6E"], /* CJK Ideograph */ + ["\u4F6F", "\u4F6F"], /* CJK Ideograph */ + ["\u4F70", "\u4F70"], /* CJK Ideograph */ + ["\u4F71", "\u4F71"], /* CJK Ideograph */ + ["\u4F72", "\u4F72"], /* CJK Ideograph */ + ["\u4F73", "\u4F73"], /* CJK Ideograph */ + ["\u4F74", "\u4F74"], /* CJK Ideograph */ + ["\u4F75", "\u4F75"], /* CJK Ideograph */ + ["\u4F76", "\u4F76"], /* CJK Ideograph */ + ["\u4F77", "\u4F77"], /* CJK Ideograph */ + ["\u4F78", "\u4F78"], /* CJK Ideograph */ + ["\u4F79", "\u4F79"], /* CJK Ideograph */ + ["\u4F7A", "\u4F7A"], /* CJK Ideograph */ + ["\u4F7B", "\u4F7B"], /* CJK Ideograph */ + ["\u4F7C", "\u4F7C"], /* CJK Ideograph */ + ["\u4F7D", "\u4F7D"], /* CJK Ideograph */ + ["\u4F7E", "\u4F7E"], /* CJK Ideograph */ + ["\u4F7F", "\u4F7F"], /* CJK Ideograph */ + ["\u4F80", "\u4F80"], /* CJK Ideograph */ + ["\u4F81", "\u4F81"], /* CJK Ideograph */ + ["\u4F82", "\u4F82"], /* CJK Ideograph */ + ["\u4F83", "\u4F83"], /* CJK Ideograph */ + ["\u4F84", "\u4F84"], /* CJK Ideograph */ + ["\u4F85", "\u4F85"], /* CJK Ideograph */ + ["\u4F86", "\u4F86"], /* CJK Ideograph */ + ["\u4F87", "\u4F87"], /* CJK Ideograph */ + ["\u4F88", "\u4F88"], /* CJK Ideograph */ + ["\u4F89", "\u4F89"], /* CJK Ideograph */ + ["\u4F8A", "\u4F8A"], /* CJK Ideograph */ + ["\u4F8B", "\u4F8B"], /* CJK Ideograph */ + ["\u4F8C", "\u4F8C"], /* CJK Ideograph */ + ["\u4F8D", "\u4F8D"], /* CJK Ideograph */ + ["\u4F8E", "\u4F8E"], /* CJK Ideograph */ + ["\u4F8F", "\u4F8F"], /* CJK Ideograph */ + ["\u4F90", "\u4F90"], /* CJK Ideograph */ + ["\u4F91", "\u4F91"], /* CJK Ideograph */ + ["\u4F92", "\u4F92"], /* CJK Ideograph */ + ["\u4F93", "\u4F93"], /* CJK Ideograph */ + ["\u4F94", "\u4F94"], /* CJK Ideograph */ + ["\u4F95", "\u4F95"], /* CJK Ideograph */ + ["\u4F96", "\u4F96"], /* CJK Ideograph */ + ["\u4F97", "\u4F97"], /* CJK Ideograph */ + ["\u4F98", "\u4F98"], /* CJK Ideograph */ + ["\u4F99", "\u4F99"], /* CJK Ideograph */ + ["\u4F9A", "\u4F9A"], /* CJK Ideograph */ + ["\u4F9B", "\u4F9B"], /* CJK Ideograph */ + ["\u4F9C", "\u4F9C"], /* CJK Ideograph */ + ["\u4F9D", "\u4F9D"], /* CJK Ideograph */ + ["\u4F9E", "\u4F9E"], /* CJK Ideograph */ + ["\u4F9F", "\u4F9F"], /* CJK Ideograph */ + ["\u4FA0", "\u4FA0"], /* CJK Ideograph */ + ["\u4FA1", "\u4FA1"], /* CJK Ideograph */ + ["\u4FA2", "\u4FA2"], /* CJK Ideograph */ + ["\u4FA3", "\u4FA3"], /* CJK Ideograph */ + ["\u4FA4", "\u4FA4"], /* CJK Ideograph */ + ["\u4FA5", "\u4FA5"], /* CJK Ideograph */ + ["\u4FA6", "\u4FA6"], /* CJK Ideograph */ + ["\u4FA7", "\u4FA7"], /* CJK Ideograph */ + ["\u4FA8", "\u4FA8"], /* CJK Ideograph */ + ["\u4FA9", "\u4FA9"], /* CJK Ideograph */ + ["\u4FAA", "\u4FAA"], /* CJK Ideograph */ + ["\u4FAB", "\u4FAB"], /* CJK Ideograph */ + ["\u4FAC", "\u4FAC"], /* CJK Ideograph */ + ["\u4FAD", "\u4FAD"], /* CJK Ideograph */ + ["\u4FAE", "\u4FAE"], /* CJK Ideograph */ + ["\u4FAF", "\u4FAF"], /* CJK Ideograph */ + ["\u4FB0", "\u4FB0"], /* CJK Ideograph */ + ["\u4FB1", "\u4FB1"], /* CJK Ideograph */ + ["\u4FB2", "\u4FB2"], /* CJK Ideograph */ + ["\u4FB3", "\u4FB3"], /* CJK Ideograph */ + ["\u4FB4", "\u4FB4"], /* CJK Ideograph */ + ["\u4FB5", "\u4FB5"], /* CJK Ideograph */ + ["\u4FB6", "\u4FB6"], /* CJK Ideograph */ + ["\u4FB7", "\u4FB7"], /* CJK Ideograph */ + ["\u4FB8", "\u4FB8"], /* CJK Ideograph */ + ["\u4FB9", "\u4FB9"], /* CJK Ideograph */ + ["\u4FBA", "\u4FBA"], /* CJK Ideograph */ + ["\u4FBB", "\u4FBB"], /* CJK Ideograph */ + ["\u4FBC", "\u4FBC"], /* CJK Ideograph */ + ["\u4FBD", "\u4FBD"], /* CJK Ideograph */ + ["\u4FBE", "\u4FBE"], /* CJK Ideograph */ + ["\u4FBF", "\u4FBF"], /* CJK Ideograph */ + ["\u4FC0", "\u4FC0"], /* CJK Ideograph */ + ["\u4FC1", "\u4FC1"], /* CJK Ideograph */ + ["\u4FC2", "\u4FC2"], /* CJK Ideograph */ + ["\u4FC3", "\u4FC3"], /* CJK Ideograph */ + ["\u4FC4", "\u4FC4"], /* CJK Ideograph */ + ["\u4FC5", "\u4FC5"], /* CJK Ideograph */ + ["\u4FC6", "\u4FC6"], /* CJK Ideograph */ + ["\u4FC7", "\u4FC7"], /* CJK Ideograph */ + ["\u4FC8", "\u4FC8"], /* CJK Ideograph */ + ["\u4FC9", "\u4FC9"], /* CJK Ideograph */ + ["\u4FCA", "\u4FCA"], /* CJK Ideograph */ + ["\u4FCB", "\u4FCB"], /* CJK Ideograph */ + ["\u4FCC", "\u4FCC"], /* CJK Ideograph */ + ["\u4FCD", "\u4FCD"], /* CJK Ideograph */ + ["\u4FCE", "\u4FCE"], /* CJK Ideograph */ + ["\u4FCF", "\u4FCF"], /* CJK Ideograph */ + ["\u4FD0", "\u4FD0"], /* CJK Ideograph */ + ["\u4FD1", "\u4FD1"], /* CJK Ideograph */ + ["\u4FD2", "\u4FD2"], /* CJK Ideograph */ + ["\u4FD3", "\u4FD3"], /* CJK Ideograph */ + ["\u4FD4", "\u4FD4"], /* CJK Ideograph */ + ["\u4FD5", "\u4FD5"], /* CJK Ideograph */ + ["\u4FD6", "\u4FD6"], /* CJK Ideograph */ + ["\u4FD7", "\u4FD7"], /* CJK Ideograph */ + ["\u4FD8", "\u4FD8"], /* CJK Ideograph */ + ["\u4FD9", "\u4FD9"], /* CJK Ideograph */ + ["\u4FDA", "\u4FDA"], /* CJK Ideograph */ + ["\u4FDB", "\u4FDB"], /* CJK Ideograph */ + ["\u4FDC", "\u4FDC"], /* CJK Ideograph */ + ["\u4FDD", "\u4FDD"], /* CJK Ideograph */ + ["\u4FDE", "\u4FDE"], /* CJK Ideograph */ + ["\u4FDF", "\u4FDF"], /* CJK Ideograph */ + ["\u4FE0", "\u4FE0"], /* CJK Ideograph */ + ["\u4FE1", "\u4FE1"], /* CJK Ideograph */ + ["\u4FE2", "\u4FE2"], /* CJK Ideograph */ + ["\u4FE3", "\u4FE3"], /* CJK Ideograph */ + ["\u4FE4", "\u4FE4"], /* CJK Ideograph */ + ["\u4FE5", "\u4FE5"], /* CJK Ideograph */ + ["\u4FE6", "\u4FE6"], /* CJK Ideograph */ + ["\u4FE7", "\u4FE7"], /* CJK Ideograph */ + ["\u4FE8", "\u4FE8"], /* CJK Ideograph */ + ["\u4FE9", "\u4FE9"], /* CJK Ideograph */ + ["\u4FEA", "\u4FEA"], /* CJK Ideograph */ + ["\u4FEB", "\u4FEB"], /* CJK Ideograph */ + ["\u4FEC", "\u4FEC"], /* CJK Ideograph */ + ["\u4FED", "\u4FED"], /* CJK Ideograph */ + ["\u4FEE", "\u4FEE"], /* CJK Ideograph */ + ["\u4FEF", "\u4FEF"], /* CJK Ideograph */ + ["\u4FF0", "\u4FF0"], /* CJK Ideograph */ + ["\u4FF1", "\u4FF1"], /* CJK Ideograph */ + ["\u4FF2", "\u4FF2"], /* CJK Ideograph */ + ["\u4FF3", "\u4FF3"], /* CJK Ideograph */ + ["\u4FF4", "\u4FF4"], /* CJK Ideograph */ + ["\u4FF5", "\u4FF5"], /* CJK Ideograph */ + ["\u4FF6", "\u4FF6"], /* CJK Ideograph */ + ["\u4FF7", "\u4FF7"], /* CJK Ideograph */ + ["\u4FF8", "\u4FF8"], /* CJK Ideograph */ + ["\u4FF9", "\u4FF9"], /* CJK Ideograph */ + ["\u4FFA", "\u4FFA"], /* CJK Ideograph */ + ["\u4FFB", "\u4FFB"], /* CJK Ideograph */ + ["\u4FFC", "\u4FFC"], /* CJK Ideograph */ + ["\u4FFD", "\u4FFD"], /* CJK Ideograph */ + ["\u4FFE", "\u4FFE"], /* CJK Ideograph */ + ["\u4FFF", "\u4FFF"], /* CJK Ideograph */ + ["\u5000", "\u5000"], /* CJK Ideograph */ + ["\u5001", "\u5001"], /* CJK Ideograph */ + ["\u5002", "\u5002"], /* CJK Ideograph */ + ["\u5003", "\u5003"], /* CJK Ideograph */ + ["\u5004", "\u5004"], /* CJK Ideograph */ + ["\u5005", "\u5005"], /* CJK Ideograph */ + ["\u5006", "\u5006"], /* CJK Ideograph */ + ["\u5007", "\u5007"], /* CJK Ideograph */ + ["\u5008", "\u5008"], /* CJK Ideograph */ + ["\u5009", "\u5009"], /* CJK Ideograph */ + ["\u500A", "\u500A"], /* CJK Ideograph */ + ["\u500B", "\u500B"], /* CJK Ideograph */ + ["\u500C", "\u500C"], /* CJK Ideograph */ + ["\u500D", "\u500D"], /* CJK Ideograph */ + ["\u500E", "\u500E"], /* CJK Ideograph */ + ["\u500F", "\u500F"], /* CJK Ideograph */ + ["\u5010", "\u5010"], /* CJK Ideograph */ + ["\u5011", "\u5011"], /* CJK Ideograph */ + ["\u5012", "\u5012"], /* CJK Ideograph */ + ["\u5013", "\u5013"], /* CJK Ideograph */ + ["\u5014", "\u5014"], /* CJK Ideograph */ + ["\u5015", "\u5015"], /* CJK Ideograph */ + ["\u5016", "\u5016"], /* CJK Ideograph */ + ["\u5017", "\u5017"], /* CJK Ideograph */ + ["\u5018", "\u5018"], /* CJK Ideograph */ + ["\u5019", "\u5019"], /* CJK Ideograph */ + ["\u501A", "\u501A"], /* CJK Ideograph */ + ["\u501B", "\u501B"], /* CJK Ideograph */ + ["\u501C", "\u501C"], /* CJK Ideograph */ + ["\u501D", "\u501D"], /* CJK Ideograph */ + ["\u501E", "\u501E"], /* CJK Ideograph */ + ["\u501F", "\u501F"], /* CJK Ideograph */ + ["\u5020", "\u5020"], /* CJK Ideograph */ + ["\u5021", "\u5021"], /* CJK Ideograph */ + ["\u5022", "\u5022"], /* CJK Ideograph */ + ["\u5023", "\u5023"], /* CJK Ideograph */ + ["\u5024", "\u5024"], /* CJK Ideograph */ + ["\u5025", "\u5025"], /* CJK Ideograph */ + ["\u5026", "\u5026"], /* CJK Ideograph */ + ["\u5027", "\u5027"], /* CJK Ideograph */ + ["\u5028", "\u5028"], /* CJK Ideograph */ + ["\u5029", "\u5029"], /* CJK Ideograph */ + ["\u502A", "\u502A"], /* CJK Ideograph */ + ["\u502B", "\u502B"], /* CJK Ideograph */ + ["\u502C", "\u502C"], /* CJK Ideograph */ + ["\u502D", "\u502D"], /* CJK Ideograph */ + ["\u502E", "\u502E"], /* CJK Ideograph */ + ["\u502F", "\u502F"], /* CJK Ideograph */ + ["\u5030", "\u5030"], /* CJK Ideograph */ + ["\u5031", "\u5031"], /* CJK Ideograph */ + ["\u5032", "\u5032"], /* CJK Ideograph */ + ["\u5033", "\u5033"], /* CJK Ideograph */ + ["\u5034", "\u5034"], /* CJK Ideograph */ + ["\u5035", "\u5035"], /* CJK Ideograph */ + ["\u5036", "\u5036"], /* CJK Ideograph */ + ["\u5037", "\u5037"], /* CJK Ideograph */ + ["\u5038", "\u5038"], /* CJK Ideograph */ + ["\u5039", "\u5039"], /* CJK Ideograph */ + ["\u503A", "\u503A"], /* CJK Ideograph */ + ["\u503B", "\u503B"], /* CJK Ideograph */ + ["\u503C", "\u503C"], /* CJK Ideograph */ + ["\u503D", "\u503D"], /* CJK Ideograph */ + ["\u503E", "\u503E"], /* CJK Ideograph */ + ["\u503F", "\u503F"], /* CJK Ideograph */ + ["\u5040", "\u5040"], /* CJK Ideograph */ + ["\u5041", "\u5041"], /* CJK Ideograph */ + ["\u5042", "\u5042"], /* CJK Ideograph */ + ["\u5043", "\u5043"], /* CJK Ideograph */ + ["\u5044", "\u5044"], /* CJK Ideograph */ + ["\u5045", "\u5045"], /* CJK Ideograph */ + ["\u5046", "\u5046"], /* CJK Ideograph */ + ["\u5047", "\u5047"], /* CJK Ideograph */ + ["\u5048", "\u5048"], /* CJK Ideograph */ + ["\u5049", "\u5049"], /* CJK Ideograph */ + ["\u504A", "\u504A"], /* CJK Ideograph */ + ["\u504B", "\u504B"], /* CJK Ideograph */ + ["\u504C", "\u504C"], /* CJK Ideograph */ + ["\u504D", "\u504D"], /* CJK Ideograph */ + ["\u504E", "\u504E"], /* CJK Ideograph */ + ["\u504F", "\u504F"], /* CJK Ideograph */ + ["\u5050", "\u5050"], /* CJK Ideograph */ + ["\u5051", "\u5051"], /* CJK Ideograph */ + ["\u5052", "\u5052"], /* CJK Ideograph */ + ["\u5053", "\u5053"], /* CJK Ideograph */ + ["\u5054", "\u5054"], /* CJK Ideograph */ + ["\u5055", "\u5055"], /* CJK Ideograph */ + ["\u5056", "\u5056"], /* CJK Ideograph */ + ["\u5057", "\u5057"], /* CJK Ideograph */ + ["\u5058", "\u5058"], /* CJK Ideograph */ + ["\u5059", "\u5059"], /* CJK Ideograph */ + ["\u505A", "\u505A"], /* CJK Ideograph */ + ["\u505B", "\u505B"], /* CJK Ideograph */ + ["\u505C", "\u505C"], /* CJK Ideograph */ + ["\u505D", "\u505D"], /* CJK Ideograph */ + ["\u505E", "\u505E"], /* CJK Ideograph */ + ["\u505F", "\u505F"], /* CJK Ideograph */ + ["\u5060", "\u5060"], /* CJK Ideograph */ + ["\u5061", "\u5061"], /* CJK Ideograph */ + ["\u5062", "\u5062"], /* CJK Ideograph */ + ["\u5063", "\u5063"], /* CJK Ideograph */ + ["\u5064", "\u5064"], /* CJK Ideograph */ + ["\u5065", "\u5065"], /* CJK Ideograph */ + ["\u5066", "\u5066"], /* CJK Ideograph */ + ["\u5067", "\u5067"], /* CJK Ideograph */ + ["\u5068", "\u5068"], /* CJK Ideograph */ + ["\u5069", "\u5069"], /* CJK Ideograph */ + ["\u506A", "\u506A"], /* CJK Ideograph */ + ["\u506B", "\u506B"], /* CJK Ideograph */ + ["\u506C", "\u506C"], /* CJK Ideograph */ + ["\u506D", "\u506D"], /* CJK Ideograph */ + ["\u506E", "\u506E"], /* CJK Ideograph */ + ["\u506F", "\u506F"], /* CJK Ideograph */ + ["\u5070", "\u5070"], /* CJK Ideograph */ + ["\u5071", "\u5071"], /* CJK Ideograph */ + ["\u5072", "\u5072"], /* CJK Ideograph */ + ["\u5073", "\u5073"], /* CJK Ideograph */ + ["\u5074", "\u5074"], /* CJK Ideograph */ + ["\u5075", "\u5075"], /* CJK Ideograph */ + ["\u5076", "\u5076"], /* CJK Ideograph */ + ["\u5077", "\u5077"], /* CJK Ideograph */ + ["\u5078", "\u5078"], /* CJK Ideograph */ + ["\u5079", "\u5079"], /* CJK Ideograph */ + ["\u507A", "\u507A"], /* CJK Ideograph */ + ["\u507B", "\u507B"], /* CJK Ideograph */ + ["\u507C", "\u507C"], /* CJK Ideograph */ + ["\u507D", "\u507D"], /* CJK Ideograph */ + ["\u507E", "\u507E"], /* CJK Ideograph */ + ["\u507F", "\u507F"], /* CJK Ideograph */ + ["\u5080", "\u5080"], /* CJK Ideograph */ + ["\u5081", "\u5081"], /* CJK Ideograph */ + ["\u5082", "\u5082"], /* CJK Ideograph */ + ["\u5083", "\u5083"], /* CJK Ideograph */ + ["\u5084", "\u5084"], /* CJK Ideograph */ + ["\u5085", "\u5085"], /* CJK Ideograph */ + ["\u5086", "\u5086"], /* CJK Ideograph */ + ["\u5087", "\u5087"], /* CJK Ideograph */ + ["\u5088", "\u5088"], /* CJK Ideograph */ + ["\u5089", "\u5089"], /* CJK Ideograph */ + ["\u508A", "\u508A"], /* CJK Ideograph */ + ["\u508B", "\u508B"], /* CJK Ideograph */ + ["\u508C", "\u508C"], /* CJK Ideograph */ + ["\u508D", "\u508D"], /* CJK Ideograph */ + ["\u508E", "\u508E"], /* CJK Ideograph */ + ["\u508F", "\u508F"], /* CJK Ideograph */ + ["\u5090", "\u5090"], /* CJK Ideograph */ + ["\u5091", "\u5091"], /* CJK Ideograph */ + ["\u5092", "\u5092"], /* CJK Ideograph */ + ["\u5093", "\u5093"], /* CJK Ideograph */ + ["\u5094", "\u5094"], /* CJK Ideograph */ + ["\u5095", "\u5095"], /* CJK Ideograph */ + ["\u5096", "\u5096"], /* CJK Ideograph */ + ["\u5097", "\u5097"], /* CJK Ideograph */ + ["\u5098", "\u5098"], /* CJK Ideograph */ + ["\u5099", "\u5099"], /* CJK Ideograph */ + ["\u509A", "\u509A"], /* CJK Ideograph */ + ["\u509B", "\u509B"], /* CJK Ideograph */ + ["\u509C", "\u509C"], /* CJK Ideograph */ + ["\u509D", "\u509D"], /* CJK Ideograph */ + ["\u509E", "\u509E"], /* CJK Ideograph */ + ["\u509F", "\u509F"], /* CJK Ideograph */ + ["\u50A0", "\u50A0"], /* CJK Ideograph */ + ["\u50A1", "\u50A1"], /* CJK Ideograph */ + ["\u50A2", "\u50A2"], /* CJK Ideograph */ + ["\u50A3", "\u50A3"], /* CJK Ideograph */ + ["\u50A4", "\u50A4"], /* CJK Ideograph */ + ["\u50A5", "\u50A5"], /* CJK Ideograph */ + ["\u50A6", "\u50A6"], /* CJK Ideograph */ + ["\u50A7", "\u50A7"], /* CJK Ideograph */ + ["\u50A8", "\u50A8"], /* CJK Ideograph */ + ["\u50A9", "\u50A9"], /* CJK Ideograph */ + ["\u50AA", "\u50AA"], /* CJK Ideograph */ + ["\u50AB", "\u50AB"], /* CJK Ideograph */ + ["\u50AC", "\u50AC"], /* CJK Ideograph */ + ["\u50AD", "\u50AD"], /* CJK Ideograph */ + ["\u50AE", "\u50AE"], /* CJK Ideograph */ + ["\u50AF", "\u50AF"], /* CJK Ideograph */ + ["\u50B0", "\u50B0"], /* CJK Ideograph */ + ["\u50B1", "\u50B1"], /* CJK Ideograph */ + ["\u50B2", "\u50B2"], /* CJK Ideograph */ + ["\u50B3", "\u50B3"], /* CJK Ideograph */ + ["\u50B4", "\u50B4"], /* CJK Ideograph */ + ["\u50B5", "\u50B5"], /* CJK Ideograph */ + ["\u50B6", "\u50B6"], /* CJK Ideograph */ + ["\u50B7", "\u50B7"], /* CJK Ideograph */ + ["\u50B8", "\u50B8"], /* CJK Ideograph */ + ["\u50B9", "\u50B9"], /* CJK Ideograph */ + ["\u50BA", "\u50BA"], /* CJK Ideograph */ + ["\u50BB", "\u50BB"], /* CJK Ideograph */ + ["\u50BC", "\u50BC"], /* CJK Ideograph */ + ["\u50BD", "\u50BD"], /* CJK Ideograph */ + ["\u50BE", "\u50BE"], /* CJK Ideograph */ + ["\u50BF", "\u50BF"], /* CJK Ideograph */ + ["\u50C0", "\u50C0"], /* CJK Ideograph */ + ["\u50C1", "\u50C1"], /* CJK Ideograph */ + ["\u50C2", "\u50C2"], /* CJK Ideograph */ + ["\u50C3", "\u50C3"], /* CJK Ideograph */ + ["\u50C4", "\u50C4"], /* CJK Ideograph */ + ["\u50C5", "\u50C5"], /* CJK Ideograph */ + ["\u50C6", "\u50C6"], /* CJK Ideograph */ + ["\u50C7", "\u50C7"], /* CJK Ideograph */ + ["\u50C8", "\u50C8"], /* CJK Ideograph */ + ["\u50C9", "\u50C9"], /* CJK Ideograph */ + ["\u50CA", "\u50CA"], /* CJK Ideograph */ + ["\u50CB", "\u50CB"], /* CJK Ideograph */ + ["\u50CC", "\u50CC"], /* CJK Ideograph */ + ["\u50CD", "\u50CD"], /* CJK Ideograph */ + ["\u50CE", "\u50CE"], /* CJK Ideograph */ + ["\u50CF", "\u50CF"], /* CJK Ideograph */ + ["\u50D0", "\u50D0"], /* CJK Ideograph */ + ["\u50D1", "\u50D1"], /* CJK Ideograph */ + ["\u50D2", "\u50D2"], /* CJK Ideograph */ + ["\u50D3", "\u50D3"], /* CJK Ideograph */ + ["\u50D4", "\u50D4"], /* CJK Ideograph */ + ["\u50D5", "\u50D5"], /* CJK Ideograph */ + ["\u50D6", "\u50D6"], /* CJK Ideograph */ + ["\u50D7", "\u50D7"], /* CJK Ideograph */ + ["\u50D8", "\u50D8"], /* CJK Ideograph */ + ["\u50D9", "\u50D9"], /* CJK Ideograph */ + ["\u50DA", "\u50DA"], /* CJK Ideograph */ + ["\u50DB", "\u50DB"], /* CJK Ideograph */ + ["\u50DC", "\u50DC"], /* CJK Ideograph */ + ["\u50DD", "\u50DD"], /* CJK Ideograph */ + ["\u50DE", "\u50DE"], /* CJK Ideograph */ + ["\u50DF", "\u50DF"], /* CJK Ideograph */ + ["\u50E0", "\u50E0"], /* CJK Ideograph */ + ["\u50E1", "\u50E1"], /* CJK Ideograph */ + ["\u50E2", "\u50E2"], /* CJK Ideograph */ + ["\u50E3", "\u50E3"], /* CJK Ideograph */ + ["\u50E4", "\u50E4"], /* CJK Ideograph */ + ["\u50E5", "\u50E5"], /* CJK Ideograph */ + ["\u50E6", "\u50E6"], /* CJK Ideograph */ + ["\u50E7", "\u50E7"], /* CJK Ideograph */ + ["\u50E8", "\u50E8"], /* CJK Ideograph */ + ["\u50E9", "\u50E9"], /* CJK Ideograph */ + ["\u50EA", "\u50EA"], /* CJK Ideograph */ + ["\u50EB", "\u50EB"], /* CJK Ideograph */ + ["\u50EC", "\u50EC"], /* CJK Ideograph */ + ["\u50ED", "\u50ED"], /* CJK Ideograph */ + ["\u50EE", "\u50EE"], /* CJK Ideograph */ + ["\u50EF", "\u50EF"], /* CJK Ideograph */ + ["\u50F0", "\u50F0"], /* CJK Ideograph */ + ["\u50F1", "\u50F1"], /* CJK Ideograph */ + ["\u50F2", "\u50F2"], /* CJK Ideograph */ + ["\u50F3", "\u50F3"], /* CJK Ideograph */ + ["\u50F4", "\u50F4"], /* CJK Ideograph */ + ["\u50F5", "\u50F5"], /* CJK Ideograph */ + ["\u50F6", "\u50F6"], /* CJK Ideograph */ + ["\u50F7", "\u50F7"], /* CJK Ideograph */ + ["\u50F8", "\u50F8"], /* CJK Ideograph */ + ["\u50F9", "\u50F9"], /* CJK Ideograph */ + ["\u50FA", "\u50FA"], /* CJK Ideograph */ + ["\u50FB", "\u50FB"], /* CJK Ideograph */ + ["\u50FC", "\u50FC"], /* CJK Ideograph */ + ["\u50FD", "\u50FD"], /* CJK Ideograph */ + ["\u50FE", "\u50FE"], /* CJK Ideograph */ + ["\u50FF", "\u50FF"], /* CJK Ideograph */ + ["\u5100", "\u5100"], /* CJK Ideograph */ + ["\u5101", "\u5101"], /* CJK Ideograph */ + ["\u5102", "\u5102"], /* CJK Ideograph */ + ["\u5103", "\u5103"], /* CJK Ideograph */ + ["\u5104", "\u5104"], /* CJK Ideograph */ + ["\u5105", "\u5105"], /* CJK Ideograph */ + ["\u5106", "\u5106"], /* CJK Ideograph */ + ["\u5107", "\u5107"], /* CJK Ideograph */ + ["\u5108", "\u5108"], /* CJK Ideograph */ + ["\u5109", "\u5109"], /* CJK Ideograph */ + ["\u510A", "\u510A"], /* CJK Ideograph */ + ["\u510B", "\u510B"], /* CJK Ideograph */ + ["\u510C", "\u510C"], /* CJK Ideograph */ + ["\u510D", "\u510D"], /* CJK Ideograph */ + ["\u510E", "\u510E"], /* CJK Ideograph */ + ["\u510F", "\u510F"], /* CJK Ideograph */ + ["\u5110", "\u5110"], /* CJK Ideograph */ + ["\u5111", "\u5111"], /* CJK Ideograph */ + ["\u5112", "\u5112"], /* CJK Ideograph */ + ["\u5113", "\u5113"], /* CJK Ideograph */ + ["\u5114", "\u5114"], /* CJK Ideograph */ + ["\u5115", "\u5115"], /* CJK Ideograph */ + ["\u5116", "\u5116"], /* CJK Ideograph */ + ["\u5117", "\u5117"], /* CJK Ideograph */ + ["\u5118", "\u5118"], /* CJK Ideograph */ + ["\u5119", "\u5119"], /* CJK Ideograph */ + ["\u511A", "\u511A"], /* CJK Ideograph */ + ["\u511B", "\u511B"], /* CJK Ideograph */ + ["\u511C", "\u511C"], /* CJK Ideograph */ + ["\u511D", "\u511D"], /* CJK Ideograph */ + ["\u511E", "\u511E"], /* CJK Ideograph */ + ["\u511F", "\u511F"], /* CJK Ideograph */ + ["\u5120", "\u5120"], /* CJK Ideograph */ + ["\u5121", "\u5121"], /* CJK Ideograph */ + ["\u5122", "\u5122"], /* CJK Ideograph */ + ["\u5123", "\u5123"], /* CJK Ideograph */ + ["\u5124", "\u5124"], /* CJK Ideograph */ + ["\u5125", "\u5125"], /* CJK Ideograph */ + ["\u5126", "\u5126"], /* CJK Ideograph */ + ["\u5127", "\u5127"], /* CJK Ideograph */ + ["\u5128", "\u5128"], /* CJK Ideograph */ + ["\u5129", "\u5129"], /* CJK Ideograph */ + ["\u512A", "\u512A"], /* CJK Ideograph */ + ["\u512B", "\u512B"], /* CJK Ideograph */ + ["\u512C", "\u512C"], /* CJK Ideograph */ + ["\u512D", "\u512D"], /* CJK Ideograph */ + ["\u512E", "\u512E"], /* CJK Ideograph */ + ["\u512F", "\u512F"], /* CJK Ideograph */ + ["\u5130", "\u5130"], /* CJK Ideograph */ + ["\u5131", "\u5131"], /* CJK Ideograph */ + ["\u5132", "\u5132"], /* CJK Ideograph */ + ["\u5133", "\u5133"], /* CJK Ideograph */ + ["\u5134", "\u5134"], /* CJK Ideograph */ + ["\u5135", "\u5135"], /* CJK Ideograph */ + ["\u5136", "\u5136"], /* CJK Ideograph */ + ["\u5137", "\u5137"], /* CJK Ideograph */ + ["\u5138", "\u5138"], /* CJK Ideograph */ + ["\u5139", "\u5139"], /* CJK Ideograph */ + ["\u513A", "\u513A"], /* CJK Ideograph */ + ["\u513B", "\u513B"], /* CJK Ideograph */ + ["\u513C", "\u513C"], /* CJK Ideograph */ + ["\u513D", "\u513D"], /* CJK Ideograph */ + ["\u513E", "\u513E"], /* CJK Ideograph */ + ["\u513F", "\u513F"], /* CJK Ideograph */ + ["\u5140", "\u5140"], /* CJK Ideograph */ + ["\u5141", "\u5141"], /* CJK Ideograph */ + ["\u5142", "\u5142"], /* CJK Ideograph */ + ["\u5143", "\u5143"], /* CJK Ideograph */ + ["\u5144", "\u5144"], /* CJK Ideograph */ + ["\u5145", "\u5145"], /* CJK Ideograph */ + ["\u5146", "\u5146"], /* CJK Ideograph */ + ["\u5147", "\u5147"], /* CJK Ideograph */ + ["\u5148", "\u5148"], /* CJK Ideograph */ + ["\u5149", "\u5149"], /* CJK Ideograph */ + ["\u514A", "\u514A"], /* CJK Ideograph */ + ["\u514B", "\u514B"], /* CJK Ideograph */ + ["\u514C", "\u514C"], /* CJK Ideograph */ + ["\u514D", "\u514D"], /* CJK Ideograph */ + ["\u514E", "\u514E"], /* CJK Ideograph */ + ["\u514F", "\u514F"], /* CJK Ideograph */ + ["\u5150", "\u5150"], /* CJK Ideograph */ + ["\u5151", "\u5151"], /* CJK Ideograph */ + ["\u5152", "\u5152"], /* CJK Ideograph */ + ["\u5153", "\u5153"], /* CJK Ideograph */ + ["\u5154", "\u5154"], /* CJK Ideograph */ + ["\u5155", "\u5155"], /* CJK Ideograph */ + ["\u5156", "\u5156"], /* CJK Ideograph */ + ["\u5157", "\u5157"], /* CJK Ideograph */ + ["\u5158", "\u5158"], /* CJK Ideograph */ + ["\u5159", "\u5159"], /* CJK Ideograph */ + ["\u515A", "\u515A"], /* CJK Ideograph */ + ["\u515B", "\u515B"], /* CJK Ideograph */ + ["\u515C", "\u515C"], /* CJK Ideograph */ + ["\u515D", "\u515D"], /* CJK Ideograph */ + ["\u515E", "\u515E"], /* CJK Ideograph */ + ["\u515F", "\u515F"], /* CJK Ideograph */ + ["\u5160", "\u5160"], /* CJK Ideograph */ + ["\u5161", "\u5161"], /* CJK Ideograph */ + ["\u5162", "\u5162"], /* CJK Ideograph */ + ["\u5163", "\u5163"], /* CJK Ideograph */ + ["\u5164", "\u5164"], /* CJK Ideograph */ + ["\u5165", "\u5165"], /* CJK Ideograph */ + ["\u5166", "\u5166"], /* CJK Ideograph */ + ["\u5167", "\u5167"], /* CJK Ideograph */ + ["\u5168", "\u5168"], /* CJK Ideograph */ + ["\u5169", "\u5169"], /* CJK Ideograph */ + ["\u516A", "\u516A"], /* CJK Ideograph */ + ["\u516B", "\u516B"], /* CJK Ideograph */ + ["\u516C", "\u516C"], /* CJK Ideograph */ + ["\u516D", "\u516D"], /* CJK Ideograph */ + ["\u516E", "\u516E"], /* CJK Ideograph */ + ["\u516F", "\u516F"], /* CJK Ideograph */ + ["\u5170", "\u5170"], /* CJK Ideograph */ + ["\u5171", "\u5171"], /* CJK Ideograph */ + ["\u5172", "\u5172"], /* CJK Ideograph */ + ["\u5173", "\u5173"], /* CJK Ideograph */ + ["\u5174", "\u5174"], /* CJK Ideograph */ + ["\u5175", "\u5175"], /* CJK Ideograph */ + ["\u5176", "\u5176"], /* CJK Ideograph */ + ["\u5177", "\u5177"], /* CJK Ideograph */ + ["\u5178", "\u5178"], /* CJK Ideograph */ + ["\u5179", "\u5179"], /* CJK Ideograph */ + ["\u517A", "\u517A"], /* CJK Ideograph */ + ["\u517B", "\u517B"], /* CJK Ideograph */ + ["\u517C", "\u517C"], /* CJK Ideograph */ + ["\u517D", "\u517D"], /* CJK Ideograph */ + ["\u517E", "\u517E"], /* CJK Ideograph */ + ["\u517F", "\u517F"], /* CJK Ideograph */ + ["\u5180", "\u5180"], /* CJK Ideograph */ + ["\u5181", "\u5181"], /* CJK Ideograph */ + ["\u5182", "\u5182"], /* CJK Ideograph */ + ["\u5183", "\u5183"], /* CJK Ideograph */ + ["\u5184", "\u5184"], /* CJK Ideograph */ + ["\u5185", "\u5185"], /* CJK Ideograph */ + ["\u5186", "\u5186"], /* CJK Ideograph */ + ["\u5187", "\u5187"], /* CJK Ideograph */ + ["\u5188", "\u5188"], /* CJK Ideograph */ + ["\u5189", "\u5189"], /* CJK Ideograph */ + ["\u518A", "\u518A"], /* CJK Ideograph */ + ["\u518B", "\u518B"], /* CJK Ideograph */ + ["\u518C", "\u518C"], /* CJK Ideograph */ + ["\u518D", "\u518D"], /* CJK Ideograph */ + ["\u518E", "\u518E"], /* CJK Ideograph */ + ["\u518F", "\u518F"], /* CJK Ideograph */ + ["\u5190", "\u5190"], /* CJK Ideograph */ + ["\u5191", "\u5191"], /* CJK Ideograph */ + ["\u5192", "\u5192"], /* CJK Ideograph */ + ["\u5193", "\u5193"], /* CJK Ideograph */ + ["\u5194", "\u5194"], /* CJK Ideograph */ + ["\u5195", "\u5195"], /* CJK Ideograph */ + ["\u5196", "\u5196"], /* CJK Ideograph */ + ["\u5197", "\u5197"], /* CJK Ideograph */ + ["\u5198", "\u5198"], /* CJK Ideograph */ + ["\u5199", "\u5199"], /* CJK Ideograph */ + ["\u519A", "\u519A"], /* CJK Ideograph */ + ["\u519B", "\u519B"], /* CJK Ideograph */ + ["\u519C", "\u519C"], /* CJK Ideograph */ + ["\u519D", "\u519D"], /* CJK Ideograph */ + ["\u519E", "\u519E"], /* CJK Ideograph */ + ["\u519F", "\u519F"], /* CJK Ideograph */ + ["\u51A0", "\u51A0"], /* CJK Ideograph */ + ["\u51A1", "\u51A1"], /* CJK Ideograph */ + ["\u51A2", "\u51A2"], /* CJK Ideograph */ + ["\u51A3", "\u51A3"], /* CJK Ideograph */ + ["\u51A4", "\u51A4"], /* CJK Ideograph */ + ["\u51A5", "\u51A5"], /* CJK Ideograph */ + ["\u51A6", "\u51A6"], /* CJK Ideograph */ + ["\u51A7", "\u51A7"], /* CJK Ideograph */ + ["\u51A8", "\u51A8"], /* CJK Ideograph */ + ["\u51A9", "\u51A9"], /* CJK Ideograph */ + ["\u51AA", "\u51AA"], /* CJK Ideograph */ + ["\u51AB", "\u51AB"], /* CJK Ideograph */ + ["\u51AC", "\u51AC"], /* CJK Ideograph */ + ["\u51AD", "\u51AD"], /* CJK Ideograph */ + ["\u51AE", "\u51AE"], /* CJK Ideograph */ + ["\u51AF", "\u51AF"], /* CJK Ideograph */ + ["\u51B0", "\u51B0"], /* CJK Ideograph */ + ["\u51B1", "\u51B1"], /* CJK Ideograph */ + ["\u51B2", "\u51B2"], /* CJK Ideograph */ + ["\u51B3", "\u51B3"], /* CJK Ideograph */ + ["\u51B4", "\u51B4"], /* CJK Ideograph */ + ["\u51B5", "\u51B5"], /* CJK Ideograph */ + ["\u51B6", "\u51B6"], /* CJK Ideograph */ + ["\u51B7", "\u51B7"], /* CJK Ideograph */ + ["\u51B8", "\u51B8"], /* CJK Ideograph */ + ["\u51B9", "\u51B9"], /* CJK Ideograph */ + ["\u51BA", "\u51BA"], /* CJK Ideograph */ + ["\u51BB", "\u51BB"], /* CJK Ideograph */ + ["\u51BC", "\u51BC"], /* CJK Ideograph */ + ["\u51BD", "\u51BD"], /* CJK Ideograph */ + ["\u51BE", "\u51BE"], /* CJK Ideograph */ + ["\u51BF", "\u51BF"], /* CJK Ideograph */ + ["\u51C0", "\u51C0"], /* CJK Ideograph */ + ["\u51C1", "\u51C1"], /* CJK Ideograph */ + ["\u51C2", "\u51C2"], /* CJK Ideograph */ + ["\u51C3", "\u51C3"], /* CJK Ideograph */ + ["\u51C4", "\u51C4"], /* CJK Ideograph */ + ["\u51C5", "\u51C5"], /* CJK Ideograph */ + ["\u51C6", "\u51C6"], /* CJK Ideograph */ + ["\u51C7", "\u51C7"], /* CJK Ideograph */ + ["\u51C8", "\u51C8"], /* CJK Ideograph */ + ["\u51C9", "\u51C9"], /* CJK Ideograph */ + ["\u51CA", "\u51CA"], /* CJK Ideograph */ + ["\u51CB", "\u51CB"], /* CJK Ideograph */ + ["\u51CC", "\u51CC"], /* CJK Ideograph */ + ["\u51CD", "\u51CD"], /* CJK Ideograph */ + ["\u51CE", "\u51CE"], /* CJK Ideograph */ + ["\u51CF", "\u51CF"], /* CJK Ideograph */ + ["\u51D0", "\u51D0"], /* CJK Ideograph */ + ["\u51D1", "\u51D1"], /* CJK Ideograph */ + ["\u51D2", "\u51D2"], /* CJK Ideograph */ + ["\u51D3", "\u51D3"], /* CJK Ideograph */ + ["\u51D4", "\u51D4"], /* CJK Ideograph */ + ["\u51D5", "\u51D5"], /* CJK Ideograph */ + ["\u51D6", "\u51D6"], /* CJK Ideograph */ + ["\u51D7", "\u51D7"], /* CJK Ideograph */ + ["\u51D8", "\u51D8"], /* CJK Ideograph */ + ["\u51D9", "\u51D9"], /* CJK Ideograph */ + ["\u51DA", "\u51DA"], /* CJK Ideograph */ + ["\u51DB", "\u51DB"], /* CJK Ideograph */ + ["\u51DC", "\u51DC"], /* CJK Ideograph */ + ["\u51DD", "\u51DD"], /* CJK Ideograph */ + ["\u51DE", "\u51DE"], /* CJK Ideograph */ + ["\u51DF", "\u51DF"], /* CJK Ideograph */ + ["\u51E0", "\u51E0"], /* CJK Ideograph */ + ["\u51E1", "\u51E1"], /* CJK Ideograph */ + ["\u51E2", "\u51E2"], /* CJK Ideograph */ + ["\u51E3", "\u51E3"], /* CJK Ideograph */ + ["\u51E4", "\u51E4"], /* CJK Ideograph */ + ["\u51E5", "\u51E5"], /* CJK Ideograph */ + ["\u51E6", "\u51E6"], /* CJK Ideograph */ + ["\u51E7", "\u51E7"], /* CJK Ideograph */ + ["\u51E8", "\u51E8"], /* CJK Ideograph */ + ["\u51E9", "\u51E9"], /* CJK Ideograph */ + ["\u51EA", "\u51EA"], /* CJK Ideograph */ + ["\u51EB", "\u51EB"], /* CJK Ideograph */ + ["\u51EC", "\u51EC"], /* CJK Ideograph */ + ["\u51ED", "\u51ED"], /* CJK Ideograph */ + ["\u51EE", "\u51EE"], /* CJK Ideograph */ + ["\u51EF", "\u51EF"], /* CJK Ideograph */ + ["\u51F0", "\u51F0"], /* CJK Ideograph */ + ["\u51F1", "\u51F1"], /* CJK Ideograph */ + ["\u51F2", "\u51F2"], /* CJK Ideograph */ + ["\u51F3", "\u51F3"], /* CJK Ideograph */ + ["\u51F4", "\u51F4"], /* CJK Ideograph */ + ["\u51F5", "\u51F5"], /* CJK Ideograph */ + ["\u51F6", "\u51F6"], /* CJK Ideograph */ + ["\u51F7", "\u51F7"], /* CJK Ideograph */ + ["\u51F8", "\u51F8"], /* CJK Ideograph */ + ["\u51F9", "\u51F9"], /* CJK Ideograph */ + ["\u51FA", "\u51FA"], /* CJK Ideograph */ + ["\u51FB", "\u51FB"], /* CJK Ideograph */ + ["\u51FC", "\u51FC"], /* CJK Ideograph */ + ["\u51FD", "\u51FD"], /* CJK Ideograph */ + ["\u51FE", "\u51FE"], /* CJK Ideograph */ + ["\u51FF", "\u51FF"], /* CJK Ideograph */ + ["\u5200", "\u5200"], /* CJK Ideograph */ + ["\u5201", "\u5201"], /* CJK Ideograph */ + ["\u5202", "\u5202"], /* CJK Ideograph */ + ["\u5203", "\u5203"], /* CJK Ideograph */ + ["\u5204", "\u5204"], /* CJK Ideograph */ + ["\u5205", "\u5205"], /* CJK Ideograph */ + ["\u5206", "\u5206"], /* CJK Ideograph */ + ["\u5207", "\u5207"], /* CJK Ideograph */ + ["\u5208", "\u5208"], /* CJK Ideograph */ + ["\u5209", "\u5209"], /* CJK Ideograph */ + ["\u520A", "\u520A"], /* CJK Ideograph */ + ["\u520B", "\u520B"], /* CJK Ideograph */ + ["\u520C", "\u520C"], /* CJK Ideograph */ + ["\u520D", "\u520D"], /* CJK Ideograph */ + ["\u520E", "\u520E"], /* CJK Ideograph */ + ["\u520F", "\u520F"], /* CJK Ideograph */ + ["\u5210", "\u5210"], /* CJK Ideograph */ + ["\u5211", "\u5211"], /* CJK Ideograph */ + ["\u5212", "\u5212"], /* CJK Ideograph */ + ["\u5213", "\u5213"], /* CJK Ideograph */ + ["\u5214", "\u5214"], /* CJK Ideograph */ + ["\u5215", "\u5215"], /* CJK Ideograph */ + ["\u5216", "\u5216"], /* CJK Ideograph */ + ["\u5217", "\u5217"], /* CJK Ideograph */ + ["\u5218", "\u5218"], /* CJK Ideograph */ + ["\u5219", "\u5219"], /* CJK Ideograph */ + ["\u521A", "\u521A"], /* CJK Ideograph */ + ["\u521B", "\u521B"], /* CJK Ideograph */ + ["\u521C", "\u521C"], /* CJK Ideograph */ + ["\u521D", "\u521D"], /* CJK Ideograph */ + ["\u521E", "\u521E"], /* CJK Ideograph */ + ["\u521F", "\u521F"], /* CJK Ideograph */ + ["\u5220", "\u5220"], /* CJK Ideograph */ + ["\u5221", "\u5221"], /* CJK Ideograph */ + ["\u5222", "\u5222"], /* CJK Ideograph */ + ["\u5223", "\u5223"], /* CJK Ideograph */ + ["\u5224", "\u5224"], /* CJK Ideograph */ + ["\u5225", "\u5225"], /* CJK Ideograph */ + ["\u5226", "\u5226"], /* CJK Ideograph */ + ["\u5227", "\u5227"], /* CJK Ideograph */ + ["\u5228", "\u5228"], /* CJK Ideograph */ + ["\u5229", "\u5229"], /* CJK Ideograph */ + ["\u522A", "\u522A"], /* CJK Ideograph */ + ["\u522B", "\u522B"], /* CJK Ideograph */ + ["\u522C", "\u522C"], /* CJK Ideograph */ + ["\u522D", "\u522D"], /* CJK Ideograph */ + ["\u522E", "\u522E"], /* CJK Ideograph */ + ["\u522F", "\u522F"], /* CJK Ideograph */ + ["\u5230", "\u5230"], /* CJK Ideograph */ + ["\u5231", "\u5231"], /* CJK Ideograph */ + ["\u5232", "\u5232"], /* CJK Ideograph */ + ["\u5233", "\u5233"], /* CJK Ideograph */ + ["\u5234", "\u5234"], /* CJK Ideograph */ + ["\u5235", "\u5235"], /* CJK Ideograph */ + ["\u5236", "\u5236"], /* CJK Ideograph */ + ["\u5237", "\u5237"], /* CJK Ideograph */ + ["\u5238", "\u5238"], /* CJK Ideograph */ + ["\u5239", "\u5239"], /* CJK Ideograph */ + ["\u523A", "\u523A"], /* CJK Ideograph */ + ["\u523B", "\u523B"], /* CJK Ideograph */ + ["\u523C", "\u523C"], /* CJK Ideograph */ + ["\u523D", "\u523D"], /* CJK Ideograph */ + ["\u523E", "\u523E"], /* CJK Ideograph */ + ["\u523F", "\u523F"], /* CJK Ideograph */ + ["\u5240", "\u5240"], /* CJK Ideograph */ + ["\u5241", "\u5241"], /* CJK Ideograph */ + ["\u5242", "\u5242"], /* CJK Ideograph */ + ["\u5243", "\u5243"], /* CJK Ideograph */ + ["\u5244", "\u5244"], /* CJK Ideograph */ + ["\u5245", "\u5245"], /* CJK Ideograph */ + ["\u5246", "\u5246"], /* CJK Ideograph */ + ["\u5247", "\u5247"], /* CJK Ideograph */ + ["\u5248", "\u5248"], /* CJK Ideograph */ + ["\u5249", "\u5249"], /* CJK Ideograph */ + ["\u524A", "\u524A"], /* CJK Ideograph */ + ["\u524B", "\u524B"], /* CJK Ideograph */ + ["\u524C", "\u524C"], /* CJK Ideograph */ + ["\u524D", "\u524D"], /* CJK Ideograph */ + ["\u524E", "\u524E"], /* CJK Ideograph */ + ["\u524F", "\u524F"], /* CJK Ideograph */ + ["\u5250", "\u5250"], /* CJK Ideograph */ + ["\u5251", "\u5251"], /* CJK Ideograph */ + ["\u5252", "\u5252"], /* CJK Ideograph */ + ["\u5253", "\u5253"], /* CJK Ideograph */ + ["\u5254", "\u5254"], /* CJK Ideograph */ + ["\u5255", "\u5255"], /* CJK Ideograph */ + ["\u5256", "\u5256"], /* CJK Ideograph */ + ["\u5257", "\u5257"], /* CJK Ideograph */ + ["\u5258", "\u5258"], /* CJK Ideograph */ + ["\u5259", "\u5259"], /* CJK Ideograph */ + ["\u525A", "\u525A"], /* CJK Ideograph */ + ["\u525B", "\u525B"], /* CJK Ideograph */ + ["\u525C", "\u525C"], /* CJK Ideograph */ + ["\u525D", "\u525D"], /* CJK Ideograph */ + ["\u525E", "\u525E"], /* CJK Ideograph */ + ["\u525F", "\u525F"], /* CJK Ideograph */ + ["\u5260", "\u5260"], /* CJK Ideograph */ + ["\u5261", "\u5261"], /* CJK Ideograph */ + ["\u5262", "\u5262"], /* CJK Ideograph */ + ["\u5263", "\u5263"], /* CJK Ideograph */ + ["\u5264", "\u5264"], /* CJK Ideograph */ + ["\u5265", "\u5265"], /* CJK Ideograph */ + ["\u5266", "\u5266"], /* CJK Ideograph */ + ["\u5267", "\u5267"], /* CJK Ideograph */ + ["\u5268", "\u5268"], /* CJK Ideograph */ + ["\u5269", "\u5269"], /* CJK Ideograph */ + ["\u526A", "\u526A"], /* CJK Ideograph */ + ["\u526B", "\u526B"], /* CJK Ideograph */ + ["\u526C", "\u526C"], /* CJK Ideograph */ + ["\u526D", "\u526D"], /* CJK Ideograph */ + ["\u526E", "\u526E"], /* CJK Ideograph */ + ["\u526F", "\u526F"], /* CJK Ideograph */ + ["\u5270", "\u5270"], /* CJK Ideograph */ + ["\u5271", "\u5271"], /* CJK Ideograph */ + ["\u5272", "\u5272"], /* CJK Ideograph */ + ["\u5273", "\u5273"], /* CJK Ideograph */ + ["\u5274", "\u5274"], /* CJK Ideograph */ + ["\u5275", "\u5275"], /* CJK Ideograph */ + ["\u5276", "\u5276"], /* CJK Ideograph */ + ["\u5277", "\u5277"], /* CJK Ideograph */ + ["\u5278", "\u5278"], /* CJK Ideograph */ + ["\u5279", "\u5279"], /* CJK Ideograph */ + ["\u527A", "\u527A"], /* CJK Ideograph */ + ["\u527B", "\u527B"], /* CJK Ideograph */ + ["\u527C", "\u527C"], /* CJK Ideograph */ + ["\u527D", "\u527D"], /* CJK Ideograph */ + ["\u527E", "\u527E"], /* CJK Ideograph */ + ["\u527F", "\u527F"], /* CJK Ideograph */ + ["\u5280", "\u5280"], /* CJK Ideograph */ + ["\u5281", "\u5281"], /* CJK Ideograph */ + ["\u5282", "\u5282"], /* CJK Ideograph */ + ["\u5283", "\u5283"], /* CJK Ideograph */ + ["\u5284", "\u5284"], /* CJK Ideograph */ + ["\u5285", "\u5285"], /* CJK Ideograph */ + ["\u5286", "\u5286"], /* CJK Ideograph */ + ["\u5287", "\u5287"], /* CJK Ideograph */ + ["\u5288", "\u5288"], /* CJK Ideograph */ + ["\u5289", "\u5289"], /* CJK Ideograph */ + ["\u528A", "\u528A"], /* CJK Ideograph */ + ["\u528B", "\u528B"], /* CJK Ideograph */ + ["\u528C", "\u528C"], /* CJK Ideograph */ + ["\u528D", "\u528D"], /* CJK Ideograph */ + ["\u528E", "\u528E"], /* CJK Ideograph */ + ["\u528F", "\u528F"], /* CJK Ideograph */ + ["\u5290", "\u5290"], /* CJK Ideograph */ + ["\u5291", "\u5291"], /* CJK Ideograph */ + ["\u5292", "\u5292"], /* CJK Ideograph */ + ["\u5293", "\u5293"], /* CJK Ideograph */ + ["\u5294", "\u5294"], /* CJK Ideograph */ + ["\u5295", "\u5295"], /* CJK Ideograph */ + ["\u5296", "\u5296"], /* CJK Ideograph */ + ["\u5297", "\u5297"], /* CJK Ideograph */ + ["\u5298", "\u5298"], /* CJK Ideograph */ + ["\u5299", "\u5299"], /* CJK Ideograph */ + ["\u529A", "\u529A"], /* CJK Ideograph */ + ["\u529B", "\u529B"], /* CJK Ideograph */ + ["\u529C", "\u529C"], /* CJK Ideograph */ + ["\u529D", "\u529D"], /* CJK Ideograph */ + ["\u529E", "\u529E"], /* CJK Ideograph */ + ["\u529F", "\u529F"], /* CJK Ideograph */ + ["\u52A0", "\u52A0"], /* CJK Ideograph */ + ["\u52A1", "\u52A1"], /* CJK Ideograph */ + ["\u52A2", "\u52A2"], /* CJK Ideograph */ + ["\u52A3", "\u52A3"], /* CJK Ideograph */ + ["\u52A4", "\u52A4"], /* CJK Ideograph */ + ["\u52A5", "\u52A5"], /* CJK Ideograph */ + ["\u52A6", "\u52A6"], /* CJK Ideograph */ + ["\u52A7", "\u52A7"], /* CJK Ideograph */ + ["\u52A8", "\u52A8"], /* CJK Ideograph */ + ["\u52A9", "\u52A9"], /* CJK Ideograph */ + ["\u52AA", "\u52AA"], /* CJK Ideograph */ + ["\u52AB", "\u52AB"], /* CJK Ideograph */ + ["\u52AC", "\u52AC"], /* CJK Ideograph */ + ["\u52AD", "\u52AD"], /* CJK Ideograph */ + ["\u52AE", "\u52AE"], /* CJK Ideograph */ + ["\u52AF", "\u52AF"], /* CJK Ideograph */ + ["\u52B0", "\u52B0"], /* CJK Ideograph */ + ["\u52B1", "\u52B1"], /* CJK Ideograph */ + ["\u52B2", "\u52B2"], /* CJK Ideograph */ + ["\u52B3", "\u52B3"], /* CJK Ideograph */ + ["\u52B4", "\u52B4"], /* CJK Ideograph */ + ["\u52B5", "\u52B5"], /* CJK Ideograph */ + ["\u52B6", "\u52B6"], /* CJK Ideograph */ + ["\u52B7", "\u52B7"], /* CJK Ideograph */ + ["\u52B8", "\u52B8"], /* CJK Ideograph */ + ["\u52B9", "\u52B9"], /* CJK Ideograph */ + ["\u52BA", "\u52BA"], /* CJK Ideograph */ + ["\u52BB", "\u52BB"], /* CJK Ideograph */ + ["\u52BC", "\u52BC"], /* CJK Ideograph */ + ["\u52BD", "\u52BD"], /* CJK Ideograph */ + ["\u52BE", "\u52BE"], /* CJK Ideograph */ + ["\u52BF", "\u52BF"], /* CJK Ideograph */ + ["\u52C0", "\u52C0"], /* CJK Ideograph */ + ["\u52C1", "\u52C1"], /* CJK Ideograph */ + ["\u52C2", "\u52C2"], /* CJK Ideograph */ + ["\u52C3", "\u52C3"], /* CJK Ideograph */ + ["\u52C4", "\u52C4"], /* CJK Ideograph */ + ["\u52C5", "\u52C5"], /* CJK Ideograph */ + ["\u52C6", "\u52C6"], /* CJK Ideograph */ + ["\u52C7", "\u52C7"], /* CJK Ideograph */ + ["\u52C8", "\u52C8"], /* CJK Ideograph */ + ["\u52C9", "\u52C9"], /* CJK Ideograph */ + ["\u52CA", "\u52CA"], /* CJK Ideograph */ + ["\u52CB", "\u52CB"], /* CJK Ideograph */ + ["\u52CC", "\u52CC"], /* CJK Ideograph */ + ["\u52CD", "\u52CD"], /* CJK Ideograph */ + ["\u52CE", "\u52CE"], /* CJK Ideograph */ + ["\u52CF", "\u52CF"], /* CJK Ideograph */ + ["\u52D0", "\u52D0"], /* CJK Ideograph */ + ["\u52D1", "\u52D1"], /* CJK Ideograph */ + ["\u52D2", "\u52D2"], /* CJK Ideograph */ + ["\u52D3", "\u52D3"], /* CJK Ideograph */ + ["\u52D4", "\u52D4"], /* CJK Ideograph */ + ["\u52D5", "\u52D5"], /* CJK Ideograph */ + ["\u52D6", "\u52D6"], /* CJK Ideograph */ + ["\u52D7", "\u52D7"], /* CJK Ideograph */ + ["\u52D8", "\u52D8"], /* CJK Ideograph */ + ["\u52D9", "\u52D9"], /* CJK Ideograph */ + ["\u52DA", "\u52DA"], /* CJK Ideograph */ + ["\u52DB", "\u52DB"], /* CJK Ideograph */ + ["\u52DC", "\u52DC"], /* CJK Ideograph */ + ["\u52DD", "\u52DD"], /* CJK Ideograph */ + ["\u52DE", "\u52DE"], /* CJK Ideograph */ + ["\u52DF", "\u52DF"], /* CJK Ideograph */ + ["\u52E0", "\u52E0"], /* CJK Ideograph */ + ["\u52E1", "\u52E1"], /* CJK Ideograph */ + ["\u52E2", "\u52E2"], /* CJK Ideograph */ + ["\u52E3", "\u52E3"], /* CJK Ideograph */ + ["\u52E4", "\u52E4"], /* CJK Ideograph */ + ["\u52E5", "\u52E5"], /* CJK Ideograph */ + ["\u52E6", "\u52E6"], /* CJK Ideograph */ + ["\u52E7", "\u52E7"], /* CJK Ideograph */ + ["\u52E8", "\u52E8"], /* CJK Ideograph */ + ["\u52E9", "\u52E9"], /* CJK Ideograph */ + ["\u52EA", "\u52EA"], /* CJK Ideograph */ + ["\u52EB", "\u52EB"], /* CJK Ideograph */ + ["\u52EC", "\u52EC"], /* CJK Ideograph */ + ["\u52ED", "\u52ED"], /* CJK Ideograph */ + ["\u52EE", "\u52EE"], /* CJK Ideograph */ + ["\u52EF", "\u52EF"], /* CJK Ideograph */ + ["\u52F0", "\u52F0"], /* CJK Ideograph */ + ["\u52F1", "\u52F1"], /* CJK Ideograph */ + ["\u52F2", "\u52F2"], /* CJK Ideograph */ + ["\u52F3", "\u52F3"], /* CJK Ideograph */ + ["\u52F4", "\u52F4"], /* CJK Ideograph */ + ["\u52F5", "\u52F5"], /* CJK Ideograph */ + ["\u52F6", "\u52F6"], /* CJK Ideograph */ + ["\u52F7", "\u52F7"], /* CJK Ideograph */ + ["\u52F8", "\u52F8"], /* CJK Ideograph */ + ["\u52F9", "\u52F9"], /* CJK Ideograph */ + ["\u52FA", "\u52FA"], /* CJK Ideograph */ + ["\u52FB", "\u52FB"], /* CJK Ideograph */ + ["\u52FC", "\u52FC"], /* CJK Ideograph */ + ["\u52FD", "\u52FD"], /* CJK Ideograph */ + ["\u52FE", "\u52FE"], /* CJK Ideograph */ + ["\u52FF", "\u52FF"], /* CJK Ideograph */ + ["\u5300", "\u5300"], /* CJK Ideograph */ + ["\u5301", "\u5301"], /* CJK Ideograph */ + ["\u5302", "\u5302"], /* CJK Ideograph */ + ["\u5303", "\u5303"], /* CJK Ideograph */ + ["\u5304", "\u5304"], /* CJK Ideograph */ + ["\u5305", "\u5305"], /* CJK Ideograph */ + ["\u5306", "\u5306"], /* CJK Ideograph */ + ["\u5307", "\u5307"], /* CJK Ideograph */ + ["\u5308", "\u5308"], /* CJK Ideograph */ + ["\u5309", "\u5309"], /* CJK Ideograph */ + ["\u530A", "\u530A"], /* CJK Ideograph */ + ["\u530B", "\u530B"], /* CJK Ideograph */ + ["\u530C", "\u530C"], /* CJK Ideograph */ + ["\u530D", "\u530D"], /* CJK Ideograph */ + ["\u530E", "\u530E"], /* CJK Ideograph */ + ["\u530F", "\u530F"], /* CJK Ideograph */ + ["\u5310", "\u5310"], /* CJK Ideograph */ + ["\u5311", "\u5311"], /* CJK Ideograph */ + ["\u5312", "\u5312"], /* CJK Ideograph */ + ["\u5313", "\u5313"], /* CJK Ideograph */ + ["\u5314", "\u5314"], /* CJK Ideograph */ + ["\u5315", "\u5315"], /* CJK Ideograph */ + ["\u5316", "\u5316"], /* CJK Ideograph */ + ["\u5317", "\u5317"], /* CJK Ideograph */ + ["\u5318", "\u5318"], /* CJK Ideograph */ + ["\u5319", "\u5319"], /* CJK Ideograph */ + ["\u531A", "\u531A"], /* CJK Ideograph */ + ["\u531B", "\u531B"], /* CJK Ideograph */ + ["\u531C", "\u531C"], /* CJK Ideograph */ + ["\u531D", "\u531D"], /* CJK Ideograph */ + ["\u531E", "\u531E"], /* CJK Ideograph */ + ["\u531F", "\u531F"], /* CJK Ideograph */ + ["\u5320", "\u5320"], /* CJK Ideograph */ + ["\u5321", "\u5321"], /* CJK Ideograph */ + ["\u5322", "\u5322"], /* CJK Ideograph */ + ["\u5323", "\u5323"], /* CJK Ideograph */ + ["\u5324", "\u5324"], /* CJK Ideograph */ + ["\u5325", "\u5325"], /* CJK Ideograph */ + ["\u5326", "\u5326"], /* CJK Ideograph */ + ["\u5327", "\u5327"], /* CJK Ideograph */ + ["\u5328", "\u5328"], /* CJK Ideograph */ + ["\u5329", "\u5329"], /* CJK Ideograph */ + ["\u532A", "\u532A"], /* CJK Ideograph */ + ["\u532B", "\u532B"], /* CJK Ideograph */ + ["\u532C", "\u532C"], /* CJK Ideograph */ + ["\u532D", "\u532D"], /* CJK Ideograph */ + ["\u532E", "\u532E"], /* CJK Ideograph */ + ["\u532F", "\u532F"], /* CJK Ideograph */ + ["\u5330", "\u5330"], /* CJK Ideograph */ + ["\u5331", "\u5331"], /* CJK Ideograph */ + ["\u5332", "\u5332"], /* CJK Ideograph */ + ["\u5333", "\u5333"], /* CJK Ideograph */ + ["\u5334", "\u5334"], /* CJK Ideograph */ + ["\u5335", "\u5335"], /* CJK Ideograph */ + ["\u5336", "\u5336"], /* CJK Ideograph */ + ["\u5337", "\u5337"], /* CJK Ideograph */ + ["\u5338", "\u5338"], /* CJK Ideograph */ + ["\u5339", "\u5339"], /* CJK Ideograph */ + ["\u533A", "\u533A"], /* CJK Ideograph */ + ["\u533B", "\u533B"], /* CJK Ideograph */ + ["\u533C", "\u533C"], /* CJK Ideograph */ + ["\u533D", "\u533D"], /* CJK Ideograph */ + ["\u533E", "\u533E"], /* CJK Ideograph */ + ["\u533F", "\u533F"], /* CJK Ideograph */ + ["\u5340", "\u5340"], /* CJK Ideograph */ + ["\u5341", "\u5341"], /* CJK Ideograph */ + ["\u5342", "\u5342"], /* CJK Ideograph */ + ["\u5343", "\u5343"], /* CJK Ideograph */ + ["\u5344", "\u5344"], /* CJK Ideograph */ + ["\u5345", "\u5345"], /* CJK Ideograph */ + ["\u5346", "\u5346"], /* CJK Ideograph */ + ["\u5347", "\u5347"], /* CJK Ideograph */ + ["\u5348", "\u5348"], /* CJK Ideograph */ + ["\u5349", "\u5349"], /* CJK Ideograph */ + ["\u534A", "\u534A"], /* CJK Ideograph */ + ["\u534B", "\u534B"], /* CJK Ideograph */ + ["\u534C", "\u534C"], /* CJK Ideograph */ + ["\u534D", "\u534D"], /* CJK Ideograph */ + ["\u534E", "\u534E"], /* CJK Ideograph */ + ["\u534F", "\u534F"], /* CJK Ideograph */ + ["\u5350", "\u5350"], /* CJK Ideograph */ + ["\u5351", "\u5351"], /* CJK Ideograph */ + ["\u5352", "\u5352"], /* CJK Ideograph */ + ["\u5353", "\u5353"], /* CJK Ideograph */ + ["\u5354", "\u5354"], /* CJK Ideograph */ + ["\u5355", "\u5355"], /* CJK Ideograph */ + ["\u5356", "\u5356"], /* CJK Ideograph */ + ["\u5357", "\u5357"], /* CJK Ideograph */ + ["\u5358", "\u5358"], /* CJK Ideograph */ + ["\u5359", "\u5359"], /* CJK Ideograph */ + ["\u535A", "\u535A"], /* CJK Ideograph */ + ["\u535B", "\u535B"], /* CJK Ideograph */ + ["\u535C", "\u535C"], /* CJK Ideograph */ + ["\u535D", "\u535D"], /* CJK Ideograph */ + ["\u535E", "\u535E"], /* CJK Ideograph */ + ["\u535F", "\u535F"], /* CJK Ideograph */ + ["\u5360", "\u5360"], /* CJK Ideograph */ + ["\u5361", "\u5361"], /* CJK Ideograph */ + ["\u5362", "\u5362"], /* CJK Ideograph */ + ["\u5363", "\u5363"], /* CJK Ideograph */ + ["\u5364", "\u5364"], /* CJK Ideograph */ + ["\u5365", "\u5365"], /* CJK Ideograph */ + ["\u5366", "\u5366"], /* CJK Ideograph */ + ["\u5367", "\u5367"], /* CJK Ideograph */ + ["\u5368", "\u5368"], /* CJK Ideograph */ + ["\u5369", "\u5369"], /* CJK Ideograph */ + ["\u536A", "\u536A"], /* CJK Ideograph */ + ["\u536B", "\u536B"], /* CJK Ideograph */ + ["\u536C", "\u536C"], /* CJK Ideograph */ + ["\u536D", "\u536D"], /* CJK Ideograph */ + ["\u536E", "\u536E"], /* CJK Ideograph */ + ["\u536F", "\u536F"], /* CJK Ideograph */ + ["\u5370", "\u5370"], /* CJK Ideograph */ + ["\u5371", "\u5371"], /* CJK Ideograph */ + ["\u5372", "\u5372"], /* CJK Ideograph */ + ["\u5373", "\u5373"], /* CJK Ideograph */ + ["\u5374", "\u5374"], /* CJK Ideograph */ + ["\u5375", "\u5375"], /* CJK Ideograph */ + ["\u5376", "\u5376"], /* CJK Ideograph */ + ["\u5377", "\u5377"], /* CJK Ideograph */ + ["\u5378", "\u5378"], /* CJK Ideograph */ + ["\u5379", "\u5379"], /* CJK Ideograph */ + ["\u537A", "\u537A"], /* CJK Ideograph */ + ["\u537B", "\u537B"], /* CJK Ideograph */ + ["\u537C", "\u537C"], /* CJK Ideograph */ + ["\u537D", "\u537D"], /* CJK Ideograph */ + ["\u537E", "\u537E"], /* CJK Ideograph */ + ["\u537F", "\u537F"], /* CJK Ideograph */ + ["\u5380", "\u5380"], /* CJK Ideograph */ + ["\u5381", "\u5381"], /* CJK Ideograph */ + ["\u5382", "\u5382"], /* CJK Ideograph */ + ["\u5383", "\u5383"], /* CJK Ideograph */ + ["\u5384", "\u5384"], /* CJK Ideograph */ + ["\u5385", "\u5385"], /* CJK Ideograph */ + ["\u5386", "\u5386"], /* CJK Ideograph */ + ["\u5387", "\u5387"], /* CJK Ideograph */ + ["\u5388", "\u5388"], /* CJK Ideograph */ + ["\u5389", "\u5389"], /* CJK Ideograph */ + ["\u538A", "\u538A"], /* CJK Ideograph */ + ["\u538B", "\u538B"], /* CJK Ideograph */ + ["\u538C", "\u538C"], /* CJK Ideograph */ + ["\u538D", "\u538D"], /* CJK Ideograph */ + ["\u538E", "\u538E"], /* CJK Ideograph */ + ["\u538F", "\u538F"], /* CJK Ideograph */ + ["\u5390", "\u5390"], /* CJK Ideograph */ + ["\u5391", "\u5391"], /* CJK Ideograph */ + ["\u5392", "\u5392"], /* CJK Ideograph */ + ["\u5393", "\u5393"], /* CJK Ideograph */ + ["\u5394", "\u5394"], /* CJK Ideograph */ + ["\u5395", "\u5395"], /* CJK Ideograph */ + ["\u5396", "\u5396"], /* CJK Ideograph */ + ["\u5397", "\u5397"], /* CJK Ideograph */ + ["\u5398", "\u5398"], /* CJK Ideograph */ + ["\u5399", "\u5399"], /* CJK Ideograph */ + ["\u539A", "\u539A"], /* CJK Ideograph */ + ["\u539B", "\u539B"], /* CJK Ideograph */ + ["\u539C", "\u539C"], /* CJK Ideograph */ + ["\u539D", "\u539D"], /* CJK Ideograph */ + ["\u539E", "\u539E"], /* CJK Ideograph */ + ["\u539F", "\u539F"], /* CJK Ideograph */ + ["\u53A0", "\u53A0"], /* CJK Ideograph */ + ["\u53A1", "\u53A1"], /* CJK Ideograph */ + ["\u53A2", "\u53A2"], /* CJK Ideograph */ + ["\u53A3", "\u53A3"], /* CJK Ideograph */ + ["\u53A4", "\u53A4"], /* CJK Ideograph */ + ["\u53A5", "\u53A5"], /* CJK Ideograph */ + ["\u53A6", "\u53A6"], /* CJK Ideograph */ + ["\u53A7", "\u53A7"], /* CJK Ideograph */ + ["\u53A8", "\u53A8"], /* CJK Ideograph */ + ["\u53A9", "\u53A9"], /* CJK Ideograph */ + ["\u53AA", "\u53AA"], /* CJK Ideograph */ + ["\u53AB", "\u53AB"], /* CJK Ideograph */ + ["\u53AC", "\u53AC"], /* CJK Ideograph */ + ["\u53AD", "\u53AD"], /* CJK Ideograph */ + ["\u53AE", "\u53AE"], /* CJK Ideograph */ + ["\u53AF", "\u53AF"], /* CJK Ideograph */ + ["\u53B0", "\u53B0"], /* CJK Ideograph */ + ["\u53B1", "\u53B1"], /* CJK Ideograph */ + ["\u53B2", "\u53B2"], /* CJK Ideograph */ + ["\u53B3", "\u53B3"], /* CJK Ideograph */ + ["\u53B4", "\u53B4"], /* CJK Ideograph */ + ["\u53B5", "\u53B5"], /* CJK Ideograph */ + ["\u53B6", "\u53B6"], /* CJK Ideograph */ + ["\u53B7", "\u53B7"], /* CJK Ideograph */ + ["\u53B8", "\u53B8"], /* CJK Ideograph */ + ["\u53B9", "\u53B9"], /* CJK Ideograph */ + ["\u53BA", "\u53BA"], /* CJK Ideograph */ + ["\u53BB", "\u53BB"], /* CJK Ideograph */ + ["\u53BC", "\u53BC"], /* CJK Ideograph */ + ["\u53BD", "\u53BD"], /* CJK Ideograph */ + ["\u53BE", "\u53BE"], /* CJK Ideograph */ + ["\u53BF", "\u53BF"], /* CJK Ideograph */ + ["\u53C0", "\u53C0"], /* CJK Ideograph */ + ["\u53C1", "\u53C1"], /* CJK Ideograph */ + ["\u53C2", "\u53C2"], /* CJK Ideograph */ + ["\u53C3", "\u53C3"], /* CJK Ideograph */ + ["\u53C4", "\u53C4"], /* CJK Ideograph */ + ["\u53C5", "\u53C5"], /* CJK Ideograph */ + ["\u53C6", "\u53C6"], /* CJK Ideograph */ + ["\u53C7", "\u53C7"], /* CJK Ideograph */ + ["\u53C8", "\u53C8"], /* CJK Ideograph */ + ["\u53C9", "\u53C9"], /* CJK Ideograph */ + ["\u53CA", "\u53CA"], /* CJK Ideograph */ + ["\u53CB", "\u53CB"], /* CJK Ideograph */ + ["\u53CC", "\u53CC"], /* CJK Ideograph */ + ["\u53CD", "\u53CD"], /* CJK Ideograph */ + ["\u53CE", "\u53CE"], /* CJK Ideograph */ + ["\u53CF", "\u53CF"], /* CJK Ideograph */ + ["\u53D0", "\u53D0"], /* CJK Ideograph */ + ["\u53D1", "\u53D1"], /* CJK Ideograph */ + ["\u53D2", "\u53D2"], /* CJK Ideograph */ + ["\u53D3", "\u53D3"], /* CJK Ideograph */ + ["\u53D4", "\u53D4"], /* CJK Ideograph */ + ["\u53D5", "\u53D5"], /* CJK Ideograph */ + ["\u53D6", "\u53D6"], /* CJK Ideograph */ + ["\u53D7", "\u53D7"], /* CJK Ideograph */ + ["\u53D8", "\u53D8"], /* CJK Ideograph */ + ["\u53D9", "\u53D9"], /* CJK Ideograph */ + ["\u53DA", "\u53DA"], /* CJK Ideograph */ + ["\u53DB", "\u53DB"], /* CJK Ideograph */ + ["\u53DC", "\u53DC"], /* CJK Ideograph */ + ["\u53DD", "\u53DD"], /* CJK Ideograph */ + ["\u53DE", "\u53DE"], /* CJK Ideograph */ + ["\u53DF", "\u53DF"], /* CJK Ideograph */ + ["\u53E0", "\u53E0"], /* CJK Ideograph */ + ["\u53E1", "\u53E1"], /* CJK Ideograph */ + ["\u53E2", "\u53E2"], /* CJK Ideograph */ + ["\u53E3", "\u53E3"], /* CJK Ideograph */ + ["\u53E4", "\u53E4"], /* CJK Ideograph */ + ["\u53E5", "\u53E5"], /* CJK Ideograph */ + ["\u53E6", "\u53E6"], /* CJK Ideograph */ + ["\u53E7", "\u53E7"], /* CJK Ideograph */ + ["\u53E8", "\u53E8"], /* CJK Ideograph */ + ["\u53E9", "\u53E9"], /* CJK Ideograph */ + ["\u53EA", "\u53EA"], /* CJK Ideograph */ + ["\u53EB", "\u53EB"], /* CJK Ideograph */ + ["\u53EC", "\u53EC"], /* CJK Ideograph */ + ["\u53ED", "\u53ED"], /* CJK Ideograph */ + ["\u53EE", "\u53EE"], /* CJK Ideograph */ + ["\u53EF", "\u53EF"], /* CJK Ideograph */ + ["\u53F0", "\u53F0"], /* CJK Ideograph */ + ["\u53F1", "\u53F1"], /* CJK Ideograph */ + ["\u53F2", "\u53F2"], /* CJK Ideograph */ + ["\u53F3", "\u53F3"], /* CJK Ideograph */ + ["\u53F4", "\u53F4"], /* CJK Ideograph */ + ["\u53F5", "\u53F5"], /* CJK Ideograph */ + ["\u53F6", "\u53F6"], /* CJK Ideograph */ + ["\u53F7", "\u53F7"], /* CJK Ideograph */ + ["\u53F8", "\u53F8"], /* CJK Ideograph */ + ["\u53F9", "\u53F9"], /* CJK Ideograph */ + ["\u53FA", "\u53FA"], /* CJK Ideograph */ + ["\u53FB", "\u53FB"], /* CJK Ideograph */ + ["\u53FC", "\u53FC"], /* CJK Ideograph */ + ["\u53FD", "\u53FD"], /* CJK Ideograph */ + ["\u53FE", "\u53FE"], /* CJK Ideograph */ + ["\u53FF", "\u53FF"], /* CJK Ideograph */ + ["\u5400", "\u5400"], /* CJK Ideograph */ + ["\u5401", "\u5401"], /* CJK Ideograph */ + ["\u5402", "\u5402"], /* CJK Ideograph */ + ["\u5403", "\u5403"], /* CJK Ideograph */ + ["\u5404", "\u5404"], /* CJK Ideograph */ + ["\u5405", "\u5405"], /* CJK Ideograph */ + ["\u5406", "\u5406"], /* CJK Ideograph */ + ["\u5407", "\u5407"], /* CJK Ideograph */ + ["\u5408", "\u5408"], /* CJK Ideograph */ + ["\u5409", "\u5409"], /* CJK Ideograph */ + ["\u540A", "\u540A"], /* CJK Ideograph */ + ["\u540B", "\u540B"], /* CJK Ideograph */ + ["\u540C", "\u540C"], /* CJK Ideograph */ + ["\u540D", "\u540D"], /* CJK Ideograph */ + ["\u540E", "\u540E"], /* CJK Ideograph */ + ["\u540F", "\u540F"], /* CJK Ideograph */ + ["\u5410", "\u5410"], /* CJK Ideograph */ + ["\u5411", "\u5411"], /* CJK Ideograph */ + ["\u5412", "\u5412"], /* CJK Ideograph */ + ["\u5413", "\u5413"], /* CJK Ideograph */ + ["\u5414", "\u5414"], /* CJK Ideograph */ + ["\u5415", "\u5415"], /* CJK Ideograph */ + ["\u5416", "\u5416"], /* CJK Ideograph */ + ["\u5417", "\u5417"], /* CJK Ideograph */ + ["\u5418", "\u5418"], /* CJK Ideograph */ + ["\u5419", "\u5419"], /* CJK Ideograph */ + ["\u541A", "\u541A"], /* CJK Ideograph */ + ["\u541B", "\u541B"], /* CJK Ideograph */ + ["\u541C", "\u541C"], /* CJK Ideograph */ + ["\u541D", "\u541D"], /* CJK Ideograph */ + ["\u541E", "\u541E"], /* CJK Ideograph */ + ["\u541F", "\u541F"], /* CJK Ideograph */ + ["\u5420", "\u5420"], /* CJK Ideograph */ + ["\u5421", "\u5421"], /* CJK Ideograph */ + ["\u5422", "\u5422"], /* CJK Ideograph */ + ["\u5423", "\u5423"], /* CJK Ideograph */ + ["\u5424", "\u5424"], /* CJK Ideograph */ + ["\u5425", "\u5425"], /* CJK Ideograph */ + ["\u5426", "\u5426"], /* CJK Ideograph */ + ["\u5427", "\u5427"], /* CJK Ideograph */ + ["\u5428", "\u5428"], /* CJK Ideograph */ + ["\u5429", "\u5429"], /* CJK Ideograph */ + ["\u542A", "\u542A"], /* CJK Ideograph */ + ["\u542B", "\u542B"], /* CJK Ideograph */ + ["\u542C", "\u542C"], /* CJK Ideograph */ + ["\u542D", "\u542D"], /* CJK Ideograph */ + ["\u542E", "\u542E"], /* CJK Ideograph */ + ["\u542F", "\u542F"], /* CJK Ideograph */ + ["\u5430", "\u5430"], /* CJK Ideograph */ + ["\u5431", "\u5431"], /* CJK Ideograph */ + ["\u5432", "\u5432"], /* CJK Ideograph */ + ["\u5433", "\u5433"], /* CJK Ideograph */ + ["\u5434", "\u5434"], /* CJK Ideograph */ + ["\u5435", "\u5435"], /* CJK Ideograph */ + ["\u5436", "\u5436"], /* CJK Ideograph */ + ["\u5437", "\u5437"], /* CJK Ideograph */ + ["\u5438", "\u5438"], /* CJK Ideograph */ + ["\u5439", "\u5439"], /* CJK Ideograph */ + ["\u543A", "\u543A"], /* CJK Ideograph */ + ["\u543B", "\u543B"], /* CJK Ideograph */ + ["\u543C", "\u543C"], /* CJK Ideograph */ + ["\u543D", "\u543D"], /* CJK Ideograph */ + ["\u543E", "\u543E"], /* CJK Ideograph */ + ["\u543F", "\u543F"], /* CJK Ideograph */ + ["\u5440", "\u5440"], /* CJK Ideograph */ + ["\u5441", "\u5441"], /* CJK Ideograph */ + ["\u5442", "\u5442"], /* CJK Ideograph */ + ["\u5443", "\u5443"], /* CJK Ideograph */ + ["\u5444", "\u5444"], /* CJK Ideograph */ + ["\u5445", "\u5445"], /* CJK Ideograph */ + ["\u5446", "\u5446"], /* CJK Ideograph */ + ["\u5447", "\u5447"], /* CJK Ideograph */ + ["\u5448", "\u5448"], /* CJK Ideograph */ + ["\u5449", "\u5449"], /* CJK Ideograph */ + ["\u544A", "\u544A"], /* CJK Ideograph */ + ["\u544B", "\u544B"], /* CJK Ideograph */ + ["\u544C", "\u544C"], /* CJK Ideograph */ + ["\u544D", "\u544D"], /* CJK Ideograph */ + ["\u544E", "\u544E"], /* CJK Ideograph */ + ["\u544F", "\u544F"], /* CJK Ideograph */ + ["\u5450", "\u5450"], /* CJK Ideograph */ + ["\u5451", "\u5451"], /* CJK Ideograph */ + ["\u5452", "\u5452"], /* CJK Ideograph */ + ["\u5453", "\u5453"], /* CJK Ideograph */ + ["\u5454", "\u5454"], /* CJK Ideograph */ + ["\u5455", "\u5455"], /* CJK Ideograph */ + ["\u5456", "\u5456"], /* CJK Ideograph */ + ["\u5457", "\u5457"], /* CJK Ideograph */ + ["\u5458", "\u5458"], /* CJK Ideograph */ + ["\u5459", "\u5459"], /* CJK Ideograph */ + ["\u545A", "\u545A"], /* CJK Ideograph */ + ["\u545B", "\u545B"], /* CJK Ideograph */ + ["\u545C", "\u545C"], /* CJK Ideograph */ + ["\u545D", "\u545D"], /* CJK Ideograph */ + ["\u545E", "\u545E"], /* CJK Ideograph */ + ["\u545F", "\u545F"], /* CJK Ideograph */ + ["\u5460", "\u5460"], /* CJK Ideograph */ + ["\u5461", "\u5461"], /* CJK Ideograph */ + ["\u5462", "\u5462"], /* CJK Ideograph */ + ["\u5463", "\u5463"], /* CJK Ideograph */ + ["\u5464", "\u5464"], /* CJK Ideograph */ + ["\u5465", "\u5465"], /* CJK Ideograph */ + ["\u5466", "\u5466"], /* CJK Ideograph */ + ["\u5467", "\u5467"], /* CJK Ideograph */ + ["\u5468", "\u5468"], /* CJK Ideograph */ + ["\u5469", "\u5469"], /* CJK Ideograph */ + ["\u546A", "\u546A"], /* CJK Ideograph */ + ["\u546B", "\u546B"], /* CJK Ideograph */ + ["\u546C", "\u546C"], /* CJK Ideograph */ + ["\u546D", "\u546D"], /* CJK Ideograph */ + ["\u546E", "\u546E"], /* CJK Ideograph */ + ["\u546F", "\u546F"], /* CJK Ideograph */ + ["\u5470", "\u5470"], /* CJK Ideograph */ + ["\u5471", "\u5471"], /* CJK Ideograph */ + ["\u5472", "\u5472"], /* CJK Ideograph */ + ["\u5473", "\u5473"], /* CJK Ideograph */ + ["\u5474", "\u5474"], /* CJK Ideograph */ + ["\u5475", "\u5475"], /* CJK Ideograph */ + ["\u5476", "\u5476"], /* CJK Ideograph */ + ["\u5477", "\u5477"], /* CJK Ideograph */ + ["\u5478", "\u5478"], /* CJK Ideograph */ + ["\u5479", "\u5479"], /* CJK Ideograph */ + ["\u547A", "\u547A"], /* CJK Ideograph */ + ["\u547B", "\u547B"], /* CJK Ideograph */ + ["\u547C", "\u547C"], /* CJK Ideograph */ + ["\u547D", "\u547D"], /* CJK Ideograph */ + ["\u547E", "\u547E"], /* CJK Ideograph */ + ["\u547F", "\u547F"], /* CJK Ideograph */ + ["\u5480", "\u5480"], /* CJK Ideograph */ + ["\u5481", "\u5481"], /* CJK Ideograph */ + ["\u5482", "\u5482"], /* CJK Ideograph */ + ["\u5483", "\u5483"], /* CJK Ideograph */ + ["\u5484", "\u5484"], /* CJK Ideograph */ + ["\u5485", "\u5485"], /* CJK Ideograph */ + ["\u5486", "\u5486"], /* CJK Ideograph */ + ["\u5487", "\u5487"], /* CJK Ideograph */ + ["\u5488", "\u5488"], /* CJK Ideograph */ + ["\u5489", "\u5489"], /* CJK Ideograph */ + ["\u548A", "\u548A"], /* CJK Ideograph */ + ["\u548B", "\u548B"], /* CJK Ideograph */ + ["\u548C", "\u548C"], /* CJK Ideograph */ + ["\u548D", "\u548D"], /* CJK Ideograph */ + ["\u548E", "\u548E"], /* CJK Ideograph */ + ["\u548F", "\u548F"], /* CJK Ideograph */ + ["\u5490", "\u5490"], /* CJK Ideograph */ + ["\u5491", "\u5491"], /* CJK Ideograph */ + ["\u5492", "\u5492"], /* CJK Ideograph */ + ["\u5493", "\u5493"], /* CJK Ideograph */ + ["\u5494", "\u5494"], /* CJK Ideograph */ + ["\u5495", "\u5495"], /* CJK Ideograph */ + ["\u5496", "\u5496"], /* CJK Ideograph */ + ["\u5497", "\u5497"], /* CJK Ideograph */ + ["\u5498", "\u5498"], /* CJK Ideograph */ + ["\u5499", "\u5499"], /* CJK Ideograph */ + ["\u549A", "\u549A"], /* CJK Ideograph */ + ["\u549B", "\u549B"], /* CJK Ideograph */ + ["\u549C", "\u549C"], /* CJK Ideograph */ + ["\u549D", "\u549D"], /* CJK Ideograph */ + ["\u549E", "\u549E"], /* CJK Ideograph */ + ["\u549F", "\u549F"], /* CJK Ideograph */ + ["\u54A0", "\u54A0"], /* CJK Ideograph */ + ["\u54A1", "\u54A1"], /* CJK Ideograph */ + ["\u54A2", "\u54A2"], /* CJK Ideograph */ + ["\u54A3", "\u54A3"], /* CJK Ideograph */ + ["\u54A4", "\u54A4"], /* CJK Ideograph */ + ["\u54A5", "\u54A5"], /* CJK Ideograph */ + ["\u54A6", "\u54A6"], /* CJK Ideograph */ + ["\u54A7", "\u54A7"], /* CJK Ideograph */ + ["\u54A8", "\u54A8"], /* CJK Ideograph */ + ["\u54A9", "\u54A9"], /* CJK Ideograph */ + ["\u54AA", "\u54AA"], /* CJK Ideograph */ + ["\u54AB", "\u54AB"], /* CJK Ideograph */ + ["\u54AC", "\u54AC"], /* CJK Ideograph */ + ["\u54AD", "\u54AD"], /* CJK Ideograph */ + ["\u54AE", "\u54AE"], /* CJK Ideograph */ + ["\u54AF", "\u54AF"], /* CJK Ideograph */ + ["\u54B0", "\u54B0"], /* CJK Ideograph */ + ["\u54B1", "\u54B1"], /* CJK Ideograph */ + ["\u54B2", "\u54B2"], /* CJK Ideograph */ + ["\u54B3", "\u54B3"], /* CJK Ideograph */ + ["\u54B4", "\u54B4"], /* CJK Ideograph */ + ["\u54B5", "\u54B5"], /* CJK Ideograph */ + ["\u54B6", "\u54B6"], /* CJK Ideograph */ + ["\u54B7", "\u54B7"], /* CJK Ideograph */ + ["\u54B8", "\u54B8"], /* CJK Ideograph */ + ["\u54B9", "\u54B9"], /* CJK Ideograph */ + ["\u54BA", "\u54BA"], /* CJK Ideograph */ + ["\u54BB", "\u54BB"], /* CJK Ideograph */ + ["\u54BC", "\u54BC"], /* CJK Ideograph */ + ["\u54BD", "\u54BD"], /* CJK Ideograph */ + ["\u54BE", "\u54BE"], /* CJK Ideograph */ + ["\u54BF", "\u54BF"], /* CJK Ideograph */ + ["\u54C0", "\u54C0"], /* CJK Ideograph */ + ["\u54C1", "\u54C1"], /* CJK Ideograph */ + ["\u54C2", "\u54C2"], /* CJK Ideograph */ + ["\u54C3", "\u54C3"], /* CJK Ideograph */ + ["\u54C4", "\u54C4"], /* CJK Ideograph */ + ["\u54C5", "\u54C5"], /* CJK Ideograph */ + ["\u54C6", "\u54C6"], /* CJK Ideograph */ + ["\u54C7", "\u54C7"], /* CJK Ideograph */ + ["\u54C8", "\u54C8"], /* CJK Ideograph */ + ["\u54C9", "\u54C9"], /* CJK Ideograph */ + ["\u54CA", "\u54CA"], /* CJK Ideograph */ + ["\u54CB", "\u54CB"], /* CJK Ideograph */ + ["\u54CC", "\u54CC"], /* CJK Ideograph */ + ["\u54CD", "\u54CD"], /* CJK Ideograph */ + ["\u54CE", "\u54CE"], /* CJK Ideograph */ + ["\u54CF", "\u54CF"], /* CJK Ideograph */ + ["\u54D0", "\u54D0"], /* CJK Ideograph */ + ["\u54D1", "\u54D1"], /* CJK Ideograph */ + ["\u54D2", "\u54D2"], /* CJK Ideograph */ + ["\u54D3", "\u54D3"], /* CJK Ideograph */ + ["\u54D4", "\u54D4"], /* CJK Ideograph */ + ["\u54D5", "\u54D5"], /* CJK Ideograph */ + ["\u54D6", "\u54D6"], /* CJK Ideograph */ + ["\u54D7", "\u54D7"], /* CJK Ideograph */ + ["\u54D8", "\u54D8"], /* CJK Ideograph */ + ["\u54D9", "\u54D9"], /* CJK Ideograph */ + ["\u54DA", "\u54DA"], /* CJK Ideograph */ + ["\u54DB", "\u54DB"], /* CJK Ideograph */ + ["\u54DC", "\u54DC"], /* CJK Ideograph */ + ["\u54DD", "\u54DD"], /* CJK Ideograph */ + ["\u54DE", "\u54DE"], /* CJK Ideograph */ + ["\u54DF", "\u54DF"], /* CJK Ideograph */ + ["\u54E0", "\u54E0"], /* CJK Ideograph */ + ["\u54E1", "\u54E1"], /* CJK Ideograph */ + ["\u54E2", "\u54E2"], /* CJK Ideograph */ + ["\u54E3", "\u54E3"], /* CJK Ideograph */ + ["\u54E4", "\u54E4"], /* CJK Ideograph */ + ["\u54E5", "\u54E5"], /* CJK Ideograph */ + ["\u54E6", "\u54E6"], /* CJK Ideograph */ + ["\u54E7", "\u54E7"], /* CJK Ideograph */ + ["\u54E8", "\u54E8"], /* CJK Ideograph */ + ["\u54E9", "\u54E9"], /* CJK Ideograph */ + ["\u54EA", "\u54EA"], /* CJK Ideograph */ + ["\u54EB", "\u54EB"], /* CJK Ideograph */ + ["\u54EC", "\u54EC"], /* CJK Ideograph */ + ["\u54ED", "\u54ED"], /* CJK Ideograph */ + ["\u54EE", "\u54EE"], /* CJK Ideograph */ + ["\u54EF", "\u54EF"], /* CJK Ideograph */ + ["\u54F0", "\u54F0"], /* CJK Ideograph */ + ["\u54F1", "\u54F1"], /* CJK Ideograph */ + ["\u54F2", "\u54F2"], /* CJK Ideograph */ + ["\u54F3", "\u54F3"], /* CJK Ideograph */ + ["\u54F4", "\u54F4"], /* CJK Ideograph */ + ["\u54F5", "\u54F5"], /* CJK Ideograph */ + ["\u54F6", "\u54F6"], /* CJK Ideograph */ + ["\u54F7", "\u54F7"], /* CJK Ideograph */ + ["\u54F8", "\u54F8"], /* CJK Ideograph */ + ["\u54F9", "\u54F9"], /* CJK Ideograph */ + ["\u54FA", "\u54FA"], /* CJK Ideograph */ + ["\u54FB", "\u54FB"], /* CJK Ideograph */ + ["\u54FC", "\u54FC"], /* CJK Ideograph */ + ["\u54FD", "\u54FD"], /* CJK Ideograph */ + ["\u54FE", "\u54FE"], /* CJK Ideograph */ + ["\u54FF", "\u54FF"], /* CJK Ideograph */ + ["\u5500", "\u5500"], /* CJK Ideograph */ + ["\u5501", "\u5501"], /* CJK Ideograph */ + ["\u5502", "\u5502"], /* CJK Ideograph */ + ["\u5503", "\u5503"], /* CJK Ideograph */ + ["\u5504", "\u5504"], /* CJK Ideograph */ + ["\u5505", "\u5505"], /* CJK Ideograph */ + ["\u5506", "\u5506"], /* CJK Ideograph */ + ["\u5507", "\u5507"], /* CJK Ideograph */ + ["\u5508", "\u5508"], /* CJK Ideograph */ + ["\u5509", "\u5509"], /* CJK Ideograph */ + ["\u550A", "\u550A"], /* CJK Ideograph */ + ["\u550B", "\u550B"], /* CJK Ideograph */ + ["\u550C", "\u550C"], /* CJK Ideograph */ + ["\u550D", "\u550D"], /* CJK Ideograph */ + ["\u550E", "\u550E"], /* CJK Ideograph */ + ["\u550F", "\u550F"], /* CJK Ideograph */ + ["\u5510", "\u5510"], /* CJK Ideograph */ + ["\u5511", "\u5511"], /* CJK Ideograph */ + ["\u5512", "\u5512"], /* CJK Ideograph */ + ["\u5513", "\u5513"], /* CJK Ideograph */ + ["\u5514", "\u5514"], /* CJK Ideograph */ + ["\u5515", "\u5515"], /* CJK Ideograph */ + ["\u5516", "\u5516"], /* CJK Ideograph */ + ["\u5517", "\u5517"], /* CJK Ideograph */ + ["\u5518", "\u5518"], /* CJK Ideograph */ + ["\u5519", "\u5519"], /* CJK Ideograph */ + ["\u551A", "\u551A"], /* CJK Ideograph */ + ["\u551B", "\u551B"], /* CJK Ideograph */ + ["\u551C", "\u551C"], /* CJK Ideograph */ + ["\u551D", "\u551D"], /* CJK Ideograph */ + ["\u551E", "\u551E"], /* CJK Ideograph */ + ["\u551F", "\u551F"], /* CJK Ideograph */ + ["\u5520", "\u5520"], /* CJK Ideograph */ + ["\u5521", "\u5521"], /* CJK Ideograph */ + ["\u5522", "\u5522"], /* CJK Ideograph */ + ["\u5523", "\u5523"], /* CJK Ideograph */ + ["\u5524", "\u5524"], /* CJK Ideograph */ + ["\u5525", "\u5525"], /* CJK Ideograph */ + ["\u5526", "\u5526"], /* CJK Ideograph */ + ["\u5527", "\u5527"], /* CJK Ideograph */ + ["\u5528", "\u5528"], /* CJK Ideograph */ + ["\u5529", "\u5529"], /* CJK Ideograph */ + ["\u552A", "\u552A"], /* CJK Ideograph */ + ["\u552B", "\u552B"], /* CJK Ideograph */ + ["\u552C", "\u552C"], /* CJK Ideograph */ + ["\u552D", "\u552D"], /* CJK Ideograph */ + ["\u552E", "\u552E"], /* CJK Ideograph */ + ["\u552F", "\u552F"], /* CJK Ideograph */ + ["\u5530", "\u5530"], /* CJK Ideograph */ + ["\u5531", "\u5531"], /* CJK Ideograph */ + ["\u5532", "\u5532"], /* CJK Ideograph */ + ["\u5533", "\u5533"], /* CJK Ideograph */ + ["\u5534", "\u5534"], /* CJK Ideograph */ + ["\u5535", "\u5535"], /* CJK Ideograph */ + ["\u5536", "\u5536"], /* CJK Ideograph */ + ["\u5537", "\u5537"], /* CJK Ideograph */ + ["\u5538", "\u5538"], /* CJK Ideograph */ + ["\u5539", "\u5539"], /* CJK Ideograph */ + ["\u553A", "\u553A"], /* CJK Ideograph */ + ["\u553B", "\u553B"], /* CJK Ideograph */ + ["\u553C", "\u553C"], /* CJK Ideograph */ + ["\u553D", "\u553D"], /* CJK Ideograph */ + ["\u553E", "\u553E"], /* CJK Ideograph */ + ["\u553F", "\u553F"], /* CJK Ideograph */ + ["\u5540", "\u5540"], /* CJK Ideograph */ + ["\u5541", "\u5541"], /* CJK Ideograph */ + ["\u5542", "\u5542"], /* CJK Ideograph */ + ["\u5543", "\u5543"], /* CJK Ideograph */ + ["\u5544", "\u5544"], /* CJK Ideograph */ + ["\u5545", "\u5545"], /* CJK Ideograph */ + ["\u5546", "\u5546"], /* CJK Ideograph */ + ["\u5547", "\u5547"], /* CJK Ideograph */ + ["\u5548", "\u5548"], /* CJK Ideograph */ + ["\u5549", "\u5549"], /* CJK Ideograph */ + ["\u554A", "\u554A"], /* CJK Ideograph */ + ["\u554B", "\u554B"], /* CJK Ideograph */ + ["\u554C", "\u554C"], /* CJK Ideograph */ + ["\u554D", "\u554D"], /* CJK Ideograph */ + ["\u554E", "\u554E"], /* CJK Ideograph */ + ["\u554F", "\u554F"], /* CJK Ideograph */ + ["\u5550", "\u5550"], /* CJK Ideograph */ + ["\u5551", "\u5551"], /* CJK Ideograph */ + ["\u5552", "\u5552"], /* CJK Ideograph */ + ["\u5553", "\u5553"], /* CJK Ideograph */ + ["\u5554", "\u5554"], /* CJK Ideograph */ + ["\u5555", "\u5555"], /* CJK Ideograph */ + ["\u5556", "\u5556"], /* CJK Ideograph */ + ["\u5557", "\u5557"], /* CJK Ideograph */ + ["\u5558", "\u5558"], /* CJK Ideograph */ + ["\u5559", "\u5559"], /* CJK Ideograph */ + ["\u555A", "\u555A"], /* CJK Ideograph */ + ["\u555B", "\u555B"], /* CJK Ideograph */ + ["\u555C", "\u555C"], /* CJK Ideograph */ + ["\u555D", "\u555D"], /* CJK Ideograph */ + ["\u555E", "\u555E"], /* CJK Ideograph */ + ["\u555F", "\u555F"], /* CJK Ideograph */ + ["\u5560", "\u5560"], /* CJK Ideograph */ + ["\u5561", "\u5561"], /* CJK Ideograph */ + ["\u5562", "\u5562"], /* CJK Ideograph */ + ["\u5563", "\u5563"], /* CJK Ideograph */ + ["\u5564", "\u5564"], /* CJK Ideograph */ + ["\u5565", "\u5565"], /* CJK Ideograph */ + ["\u5566", "\u5566"], /* CJK Ideograph */ + ["\u5567", "\u5567"], /* CJK Ideograph */ + ["\u5568", "\u5568"], /* CJK Ideograph */ + ["\u5569", "\u5569"], /* CJK Ideograph */ + ["\u556A", "\u556A"], /* CJK Ideograph */ + ["\u556B", "\u556B"], /* CJK Ideograph */ + ["\u556C", "\u556C"], /* CJK Ideograph */ + ["\u556D", "\u556D"], /* CJK Ideograph */ + ["\u556E", "\u556E"], /* CJK Ideograph */ + ["\u556F", "\u556F"], /* CJK Ideograph */ + ["\u5570", "\u5570"], /* CJK Ideograph */ + ["\u5571", "\u5571"], /* CJK Ideograph */ + ["\u5572", "\u5572"], /* CJK Ideograph */ + ["\u5573", "\u5573"], /* CJK Ideograph */ + ["\u5574", "\u5574"], /* CJK Ideograph */ + ["\u5575", "\u5575"], /* CJK Ideograph */ + ["\u5576", "\u5576"], /* CJK Ideograph */ + ["\u5577", "\u5577"], /* CJK Ideograph */ + ["\u5578", "\u5578"], /* CJK Ideograph */ + ["\u5579", "\u5579"], /* CJK Ideograph */ + ["\u557A", "\u557A"], /* CJK Ideograph */ + ["\u557B", "\u557B"], /* CJK Ideograph */ + ["\u557C", "\u557C"], /* CJK Ideograph */ + ["\u557D", "\u557D"], /* CJK Ideograph */ + ["\u557E", "\u557E"], /* CJK Ideograph */ + ["\u557F", "\u557F"], /* CJK Ideograph */ + ["\u5580", "\u5580"], /* CJK Ideograph */ + ["\u5581", "\u5581"], /* CJK Ideograph */ + ["\u5582", "\u5582"], /* CJK Ideograph */ + ["\u5583", "\u5583"], /* CJK Ideograph */ + ["\u5584", "\u5584"], /* CJK Ideograph */ + ["\u5585", "\u5585"], /* CJK Ideograph */ + ["\u5586", "\u5586"], /* CJK Ideograph */ + ["\u5587", "\u5587"], /* CJK Ideograph */ + ["\u5588", "\u5588"], /* CJK Ideograph */ + ["\u5589", "\u5589"], /* CJK Ideograph */ + ["\u558A", "\u558A"], /* CJK Ideograph */ + ["\u558B", "\u558B"], /* CJK Ideograph */ + ["\u558C", "\u558C"], /* CJK Ideograph */ + ["\u558D", "\u558D"], /* CJK Ideograph */ + ["\u558E", "\u558E"], /* CJK Ideograph */ + ["\u558F", "\u558F"], /* CJK Ideograph */ + ["\u5590", "\u5590"], /* CJK Ideograph */ + ["\u5591", "\u5591"], /* CJK Ideograph */ + ["\u5592", "\u5592"], /* CJK Ideograph */ + ["\u5593", "\u5593"], /* CJK Ideograph */ + ["\u5594", "\u5594"], /* CJK Ideograph */ + ["\u5595", "\u5595"], /* CJK Ideograph */ + ["\u5596", "\u5596"], /* CJK Ideograph */ + ["\u5597", "\u5597"], /* CJK Ideograph */ + ["\u5598", "\u5598"], /* CJK Ideograph */ + ["\u5599", "\u5599"], /* CJK Ideograph */ + ["\u559A", "\u559A"], /* CJK Ideograph */ + ["\u559B", "\u559B"], /* CJK Ideograph */ + ["\u559C", "\u559C"], /* CJK Ideograph */ + ["\u559D", "\u559D"], /* CJK Ideograph */ + ["\u559E", "\u559E"], /* CJK Ideograph */ + ["\u559F", "\u559F"], /* CJK Ideograph */ + ["\u55A0", "\u55A0"], /* CJK Ideograph */ + ["\u55A1", "\u55A1"], /* CJK Ideograph */ + ["\u55A2", "\u55A2"], /* CJK Ideograph */ + ["\u55A3", "\u55A3"], /* CJK Ideograph */ + ["\u55A4", "\u55A4"], /* CJK Ideograph */ + ["\u55A5", "\u55A5"], /* CJK Ideograph */ + ["\u55A6", "\u55A6"], /* CJK Ideograph */ + ["\u55A7", "\u55A7"], /* CJK Ideograph */ + ["\u55A8", "\u55A8"], /* CJK Ideograph */ + ["\u55A9", "\u55A9"], /* CJK Ideograph */ + ["\u55AA", "\u55AA"], /* CJK Ideograph */ + ["\u55AB", "\u55AB"], /* CJK Ideograph */ + ["\u55AC", "\u55AC"], /* CJK Ideograph */ + ["\u55AD", "\u55AD"], /* CJK Ideograph */ + ["\u55AE", "\u55AE"], /* CJK Ideograph */ + ["\u55AF", "\u55AF"], /* CJK Ideograph */ + ["\u55B0", "\u55B0"], /* CJK Ideograph */ + ["\u55B1", "\u55B1"], /* CJK Ideograph */ + ["\u55B2", "\u55B2"], /* CJK Ideograph */ + ["\u55B3", "\u55B3"], /* CJK Ideograph */ + ["\u55B4", "\u55B4"], /* CJK Ideograph */ + ["\u55B5", "\u55B5"], /* CJK Ideograph */ + ["\u55B6", "\u55B6"], /* CJK Ideograph */ + ["\u55B7", "\u55B7"], /* CJK Ideograph */ + ["\u55B8", "\u55B8"], /* CJK Ideograph */ + ["\u55B9", "\u55B9"], /* CJK Ideograph */ + ["\u55BA", "\u55BA"], /* CJK Ideograph */ + ["\u55BB", "\u55BB"], /* CJK Ideograph */ + ["\u55BC", "\u55BC"], /* CJK Ideograph */ + ["\u55BD", "\u55BD"], /* CJK Ideograph */ + ["\u55BE", "\u55BE"], /* CJK Ideograph */ + ["\u55BF", "\u55BF"], /* CJK Ideograph */ + ["\u55C0", "\u55C0"], /* CJK Ideograph */ + ["\u55C1", "\u55C1"], /* CJK Ideograph */ + ["\u55C2", "\u55C2"], /* CJK Ideograph */ + ["\u55C3", "\u55C3"], /* CJK Ideograph */ + ["\u55C4", "\u55C4"], /* CJK Ideograph */ + ["\u55C5", "\u55C5"], /* CJK Ideograph */ + ["\u55C6", "\u55C6"], /* CJK Ideograph */ + ["\u55C7", "\u55C7"], /* CJK Ideograph */ + ["\u55C8", "\u55C8"], /* CJK Ideograph */ + ["\u55C9", "\u55C9"], /* CJK Ideograph */ + ["\u55CA", "\u55CA"], /* CJK Ideograph */ + ["\u55CB", "\u55CB"], /* CJK Ideograph */ + ["\u55CC", "\u55CC"], /* CJK Ideograph */ + ["\u55CD", "\u55CD"], /* CJK Ideograph */ + ["\u55CE", "\u55CE"], /* CJK Ideograph */ + ["\u55CF", "\u55CF"], /* CJK Ideograph */ + ["\u55D0", "\u55D0"], /* CJK Ideograph */ + ["\u55D1", "\u55D1"], /* CJK Ideograph */ + ["\u55D2", "\u55D2"], /* CJK Ideograph */ + ["\u55D3", "\u55D3"], /* CJK Ideograph */ + ["\u55D4", "\u55D4"], /* CJK Ideograph */ + ["\u55D5", "\u55D5"], /* CJK Ideograph */ + ["\u55D6", "\u55D6"], /* CJK Ideograph */ + ["\u55D7", "\u55D7"], /* CJK Ideograph */ + ["\u55D8", "\u55D8"], /* CJK Ideograph */ + ["\u55D9", "\u55D9"], /* CJK Ideograph */ + ["\u55DA", "\u55DA"], /* CJK Ideograph */ + ["\u55DB", "\u55DB"], /* CJK Ideograph */ + ["\u55DC", "\u55DC"], /* CJK Ideograph */ + ["\u55DD", "\u55DD"], /* CJK Ideograph */ + ["\u55DE", "\u55DE"], /* CJK Ideograph */ + ["\u55DF", "\u55DF"], /* CJK Ideograph */ + ["\u55E0", "\u55E0"], /* CJK Ideograph */ + ["\u55E1", "\u55E1"], /* CJK Ideograph */ + ["\u55E2", "\u55E2"], /* CJK Ideograph */ + ["\u55E3", "\u55E3"], /* CJK Ideograph */ + ["\u55E4", "\u55E4"], /* CJK Ideograph */ + ["\u55E5", "\u55E5"], /* CJK Ideograph */ + ["\u55E6", "\u55E6"], /* CJK Ideograph */ + ["\u55E7", "\u55E7"], /* CJK Ideograph */ + ["\u55E8", "\u55E8"], /* CJK Ideograph */ + ["\u55E9", "\u55E9"], /* CJK Ideograph */ + ["\u55EA", "\u55EA"], /* CJK Ideograph */ + ["\u55EB", "\u55EB"], /* CJK Ideograph */ + ["\u55EC", "\u55EC"], /* CJK Ideograph */ + ["\u55ED", "\u55ED"], /* CJK Ideograph */ + ["\u55EE", "\u55EE"], /* CJK Ideograph */ + ["\u55EF", "\u55EF"], /* CJK Ideograph */ + ["\u55F0", "\u55F0"], /* CJK Ideograph */ + ["\u55F1", "\u55F1"], /* CJK Ideograph */ + ["\u55F2", "\u55F2"], /* CJK Ideograph */ + ["\u55F3", "\u55F3"], /* CJK Ideograph */ + ["\u55F4", "\u55F4"], /* CJK Ideograph */ + ["\u55F5", "\u55F5"], /* CJK Ideograph */ + ["\u55F6", "\u55F6"], /* CJK Ideograph */ + ["\u55F7", "\u55F7"], /* CJK Ideograph */ + ["\u55F8", "\u55F8"], /* CJK Ideograph */ + ["\u55F9", "\u55F9"], /* CJK Ideograph */ + ["\u55FA", "\u55FA"], /* CJK Ideograph */ + ["\u55FB", "\u55FB"], /* CJK Ideograph */ + ["\u55FC", "\u55FC"], /* CJK Ideograph */ + ["\u55FD", "\u55FD"], /* CJK Ideograph */ + ["\u55FE", "\u55FE"], /* CJK Ideograph */ + ["\u55FF", "\u55FF"], /* CJK Ideograph */ + ["\u5600", "\u5600"], /* CJK Ideograph */ + ["\u5601", "\u5601"], /* CJK Ideograph */ + ["\u5602", "\u5602"], /* CJK Ideograph */ + ["\u5603", "\u5603"], /* CJK Ideograph */ + ["\u5604", "\u5604"], /* CJK Ideograph */ + ["\u5605", "\u5605"], /* CJK Ideograph */ + ["\u5606", "\u5606"], /* CJK Ideograph */ + ["\u5607", "\u5607"], /* CJK Ideograph */ + ["\u5608", "\u5608"], /* CJK Ideograph */ + ["\u5609", "\u5609"], /* CJK Ideograph */ + ["\u560A", "\u560A"], /* CJK Ideograph */ + ["\u560B", "\u560B"], /* CJK Ideograph */ + ["\u560C", "\u560C"], /* CJK Ideograph */ + ["\u560D", "\u560D"], /* CJK Ideograph */ + ["\u560E", "\u560E"], /* CJK Ideograph */ + ["\u560F", "\u560F"], /* CJK Ideograph */ + ["\u5610", "\u5610"], /* CJK Ideograph */ + ["\u5611", "\u5611"], /* CJK Ideograph */ + ["\u5612", "\u5612"], /* CJK Ideograph */ + ["\u5613", "\u5613"], /* CJK Ideograph */ + ["\u5614", "\u5614"], /* CJK Ideograph */ + ["\u5615", "\u5615"], /* CJK Ideograph */ + ["\u5616", "\u5616"], /* CJK Ideograph */ + ["\u5617", "\u5617"], /* CJK Ideograph */ + ["\u5618", "\u5618"], /* CJK Ideograph */ + ["\u5619", "\u5619"], /* CJK Ideograph */ + ["\u561A", "\u561A"], /* CJK Ideograph */ + ["\u561B", "\u561B"], /* CJK Ideograph */ + ["\u561C", "\u561C"], /* CJK Ideograph */ + ["\u561D", "\u561D"], /* CJK Ideograph */ + ["\u561E", "\u561E"], /* CJK Ideograph */ + ["\u561F", "\u561F"], /* CJK Ideograph */ + ["\u5620", "\u5620"], /* CJK Ideograph */ + ["\u5621", "\u5621"], /* CJK Ideograph */ + ["\u5622", "\u5622"], /* CJK Ideograph */ + ["\u5623", "\u5623"], /* CJK Ideograph */ + ["\u5624", "\u5624"], /* CJK Ideograph */ + ["\u5625", "\u5625"], /* CJK Ideograph */ + ["\u5626", "\u5626"], /* CJK Ideograph */ + ["\u5627", "\u5627"], /* CJK Ideograph */ + ["\u5628", "\u5628"], /* CJK Ideograph */ + ["\u5629", "\u5629"], /* CJK Ideograph */ + ["\u562A", "\u562A"], /* CJK Ideograph */ + ["\u562B", "\u562B"], /* CJK Ideograph */ + ["\u562C", "\u562C"], /* CJK Ideograph */ + ["\u562D", "\u562D"], /* CJK Ideograph */ + ["\u562E", "\u562E"], /* CJK Ideograph */ + ["\u562F", "\u562F"], /* CJK Ideograph */ + ["\u5630", "\u5630"], /* CJK Ideograph */ + ["\u5631", "\u5631"], /* CJK Ideograph */ + ["\u5632", "\u5632"], /* CJK Ideograph */ + ["\u5633", "\u5633"], /* CJK Ideograph */ + ["\u5634", "\u5634"], /* CJK Ideograph */ + ["\u5635", "\u5635"], /* CJK Ideograph */ + ["\u5636", "\u5636"], /* CJK Ideograph */ + ["\u5637", "\u5637"], /* CJK Ideograph */ + ["\u5638", "\u5638"], /* CJK Ideograph */ + ["\u5639", "\u5639"], /* CJK Ideograph */ + ["\u563A", "\u563A"], /* CJK Ideograph */ + ["\u563B", "\u563B"], /* CJK Ideograph */ + ["\u563C", "\u563C"], /* CJK Ideograph */ + ["\u563D", "\u563D"], /* CJK Ideograph */ + ["\u563E", "\u563E"], /* CJK Ideograph */ + ["\u563F", "\u563F"], /* CJK Ideograph */ + ["\u5640", "\u5640"], /* CJK Ideograph */ + ["\u5641", "\u5641"], /* CJK Ideograph */ + ["\u5642", "\u5642"], /* CJK Ideograph */ + ["\u5643", "\u5643"], /* CJK Ideograph */ + ["\u5644", "\u5644"], /* CJK Ideograph */ + ["\u5645", "\u5645"], /* CJK Ideograph */ + ["\u5646", "\u5646"], /* CJK Ideograph */ + ["\u5647", "\u5647"], /* CJK Ideograph */ + ["\u5648", "\u5648"], /* CJK Ideograph */ + ["\u5649", "\u5649"], /* CJK Ideograph */ + ["\u564A", "\u564A"], /* CJK Ideograph */ + ["\u564B", "\u564B"], /* CJK Ideograph */ + ["\u564C", "\u564C"], /* CJK Ideograph */ + ["\u564D", "\u564D"], /* CJK Ideograph */ + ["\u564E", "\u564E"], /* CJK Ideograph */ + ["\u564F", "\u564F"], /* CJK Ideograph */ + ["\u5650", "\u5650"], /* CJK Ideograph */ + ["\u5651", "\u5651"], /* CJK Ideograph */ + ["\u5652", "\u5652"], /* CJK Ideograph */ + ["\u5653", "\u5653"], /* CJK Ideograph */ + ["\u5654", "\u5654"], /* CJK Ideograph */ + ["\u5655", "\u5655"], /* CJK Ideograph */ + ["\u5656", "\u5656"], /* CJK Ideograph */ + ["\u5657", "\u5657"], /* CJK Ideograph */ + ["\u5658", "\u5658"], /* CJK Ideograph */ + ["\u5659", "\u5659"], /* CJK Ideograph */ + ["\u565A", "\u565A"], /* CJK Ideograph */ + ["\u565B", "\u565B"], /* CJK Ideograph */ + ["\u565C", "\u565C"], /* CJK Ideograph */ + ["\u565D", "\u565D"], /* CJK Ideograph */ + ["\u565E", "\u565E"], /* CJK Ideograph */ + ["\u565F", "\u565F"], /* CJK Ideograph */ + ["\u5660", "\u5660"], /* CJK Ideograph */ + ["\u5661", "\u5661"], /* CJK Ideograph */ + ["\u5662", "\u5662"], /* CJK Ideograph */ + ["\u5663", "\u5663"], /* CJK Ideograph */ + ["\u5664", "\u5664"], /* CJK Ideograph */ + ["\u5665", "\u5665"], /* CJK Ideograph */ + ["\u5666", "\u5666"], /* CJK Ideograph */ + ["\u5667", "\u5667"], /* CJK Ideograph */ + ["\u5668", "\u5668"], /* CJK Ideograph */ + ["\u5669", "\u5669"], /* CJK Ideograph */ + ["\u566A", "\u566A"], /* CJK Ideograph */ + ["\u566B", "\u566B"], /* CJK Ideograph */ + ["\u566C", "\u566C"], /* CJK Ideograph */ + ["\u566D", "\u566D"], /* CJK Ideograph */ + ["\u566E", "\u566E"], /* CJK Ideograph */ + ["\u566F", "\u566F"], /* CJK Ideograph */ + ["\u5670", "\u5670"], /* CJK Ideograph */ + ["\u5671", "\u5671"], /* CJK Ideograph */ + ["\u5672", "\u5672"], /* CJK Ideograph */ + ["\u5673", "\u5673"], /* CJK Ideograph */ + ["\u5674", "\u5674"], /* CJK Ideograph */ + ["\u5675", "\u5675"], /* CJK Ideograph */ + ["\u5676", "\u5676"], /* CJK Ideograph */ + ["\u5677", "\u5677"], /* CJK Ideograph */ + ["\u5678", "\u5678"], /* CJK Ideograph */ + ["\u5679", "\u5679"], /* CJK Ideograph */ + ["\u567A", "\u567A"], /* CJK Ideograph */ + ["\u567B", "\u567B"], /* CJK Ideograph */ + ["\u567C", "\u567C"], /* CJK Ideograph */ + ["\u567D", "\u567D"], /* CJK Ideograph */ + ["\u567E", "\u567E"], /* CJK Ideograph */ + ["\u567F", "\u567F"], /* CJK Ideograph */ + ["\u5680", "\u5680"], /* CJK Ideograph */ + ["\u5681", "\u5681"], /* CJK Ideograph */ + ["\u5682", "\u5682"], /* CJK Ideograph */ + ["\u5683", "\u5683"], /* CJK Ideograph */ + ["\u5684", "\u5684"], /* CJK Ideograph */ + ["\u5685", "\u5685"], /* CJK Ideograph */ + ["\u5686", "\u5686"], /* CJK Ideograph */ + ["\u5687", "\u5687"], /* CJK Ideograph */ + ["\u5688", "\u5688"], /* CJK Ideograph */ + ["\u5689", "\u5689"], /* CJK Ideograph */ + ["\u568A", "\u568A"], /* CJK Ideograph */ + ["\u568B", "\u568B"], /* CJK Ideograph */ + ["\u568C", "\u568C"], /* CJK Ideograph */ + ["\u568D", "\u568D"], /* CJK Ideograph */ + ["\u568E", "\u568E"], /* CJK Ideograph */ + ["\u568F", "\u568F"], /* CJK Ideograph */ + ["\u5690", "\u5690"], /* CJK Ideograph */ + ["\u5691", "\u5691"], /* CJK Ideograph */ + ["\u5692", "\u5692"], /* CJK Ideograph */ + ["\u5693", "\u5693"], /* CJK Ideograph */ + ["\u5694", "\u5694"], /* CJK Ideograph */ + ["\u5695", "\u5695"], /* CJK Ideograph */ + ["\u5696", "\u5696"], /* CJK Ideograph */ + ["\u5697", "\u5697"], /* CJK Ideograph */ + ["\u5698", "\u5698"], /* CJK Ideograph */ + ["\u5699", "\u5699"], /* CJK Ideograph */ + ["\u569A", "\u569A"], /* CJK Ideograph */ + ["\u569B", "\u569B"], /* CJK Ideograph */ + ["\u569C", "\u569C"], /* CJK Ideograph */ + ["\u569D", "\u569D"], /* CJK Ideograph */ + ["\u569E", "\u569E"], /* CJK Ideograph */ + ["\u569F", "\u569F"], /* CJK Ideograph */ + ["\u56A0", "\u56A0"], /* CJK Ideograph */ + ["\u56A1", "\u56A1"], /* CJK Ideograph */ + ["\u56A2", "\u56A2"], /* CJK Ideograph */ + ["\u56A3", "\u56A3"], /* CJK Ideograph */ + ["\u56A4", "\u56A4"], /* CJK Ideograph */ + ["\u56A5", "\u56A5"], /* CJK Ideograph */ + ["\u56A6", "\u56A6"], /* CJK Ideograph */ + ["\u56A7", "\u56A7"], /* CJK Ideograph */ + ["\u56A8", "\u56A8"], /* CJK Ideograph */ + ["\u56A9", "\u56A9"], /* CJK Ideograph */ + ["\u56AA", "\u56AA"], /* CJK Ideograph */ + ["\u56AB", "\u56AB"], /* CJK Ideograph */ + ["\u56AC", "\u56AC"], /* CJK Ideograph */ + ["\u56AD", "\u56AD"], /* CJK Ideograph */ + ["\u56AE", "\u56AE"], /* CJK Ideograph */ + ["\u56AF", "\u56AF"], /* CJK Ideograph */ + ["\u56B0", "\u56B0"], /* CJK Ideograph */ + ["\u56B1", "\u56B1"], /* CJK Ideograph */ + ["\u56B2", "\u56B2"], /* CJK Ideograph */ + ["\u56B3", "\u56B3"], /* CJK Ideograph */ + ["\u56B4", "\u56B4"], /* CJK Ideograph */ + ["\u56B5", "\u56B5"], /* CJK Ideograph */ + ["\u56B6", "\u56B6"], /* CJK Ideograph */ + ["\u56B7", "\u56B7"], /* CJK Ideograph */ + ["\u56B8", "\u56B8"], /* CJK Ideograph */ + ["\u56B9", "\u56B9"], /* CJK Ideograph */ + ["\u56BA", "\u56BA"], /* CJK Ideograph */ + ["\u56BB", "\u56BB"], /* CJK Ideograph */ + ["\u56BC", "\u56BC"], /* CJK Ideograph */ + ["\u56BD", "\u56BD"], /* CJK Ideograph */ + ["\u56BE", "\u56BE"], /* CJK Ideograph */ + ["\u56BF", "\u56BF"], /* CJK Ideograph */ + ["\u56C0", "\u56C0"], /* CJK Ideograph */ + ["\u56C1", "\u56C1"], /* CJK Ideograph */ + ["\u56C2", "\u56C2"], /* CJK Ideograph */ + ["\u56C3", "\u56C3"], /* CJK Ideograph */ + ["\u56C4", "\u56C4"], /* CJK Ideograph */ + ["\u56C5", "\u56C5"], /* CJK Ideograph */ + ["\u56C6", "\u56C6"], /* CJK Ideograph */ + ["\u56C7", "\u56C7"], /* CJK Ideograph */ + ["\u56C8", "\u56C8"], /* CJK Ideograph */ + ["\u56C9", "\u56C9"], /* CJK Ideograph */ + ["\u56CA", "\u56CA"], /* CJK Ideograph */ + ["\u56CB", "\u56CB"], /* CJK Ideograph */ + ["\u56CC", "\u56CC"], /* CJK Ideograph */ + ["\u56CD", "\u56CD"], /* CJK Ideograph */ + ["\u56CE", "\u56CE"], /* CJK Ideograph */ + ["\u56CF", "\u56CF"], /* CJK Ideograph */ + ["\u56D0", "\u56D0"], /* CJK Ideograph */ + ["\u56D1", "\u56D1"], /* CJK Ideograph */ + ["\u56D2", "\u56D2"], /* CJK Ideograph */ + ["\u56D3", "\u56D3"], /* CJK Ideograph */ + ["\u56D4", "\u56D4"], /* CJK Ideograph */ + ["\u56D5", "\u56D5"], /* CJK Ideograph */ + ["\u56D6", "\u56D6"], /* CJK Ideograph */ + ["\u56D7", "\u56D7"], /* CJK Ideograph */ + ["\u56D8", "\u56D8"], /* CJK Ideograph */ + ["\u56D9", "\u56D9"], /* CJK Ideograph */ + ["\u56DA", "\u56DA"], /* CJK Ideograph */ + ["\u56DB", "\u56DB"], /* CJK Ideograph */ + ["\u56DC", "\u56DC"], /* CJK Ideograph */ + ["\u56DD", "\u56DD"], /* CJK Ideograph */ + ["\u56DE", "\u56DE"], /* CJK Ideograph */ + ["\u56DF", "\u56DF"], /* CJK Ideograph */ + ["\u56E0", "\u56E0"], /* CJK Ideograph */ + ["\u56E1", "\u56E1"], /* CJK Ideograph */ + ["\u56E2", "\u56E2"], /* CJK Ideograph */ + ["\u56E3", "\u56E3"], /* CJK Ideograph */ + ["\u56E4", "\u56E4"], /* CJK Ideograph */ + ["\u56E5", "\u56E5"], /* CJK Ideograph */ + ["\u56E6", "\u56E6"], /* CJK Ideograph */ + ["\u56E7", "\u56E7"], /* CJK Ideograph */ + ["\u56E8", "\u56E8"], /* CJK Ideograph */ + ["\u56E9", "\u56E9"], /* CJK Ideograph */ + ["\u56EA", "\u56EA"], /* CJK Ideograph */ + ["\u56EB", "\u56EB"], /* CJK Ideograph */ + ["\u56EC", "\u56EC"], /* CJK Ideograph */ + ["\u56ED", "\u56ED"], /* CJK Ideograph */ + ["\u56EE", "\u56EE"], /* CJK Ideograph */ + ["\u56EF", "\u56EF"], /* CJK Ideograph */ + ["\u56F0", "\u56F0"], /* CJK Ideograph */ + ["\u56F1", "\u56F1"], /* CJK Ideograph */ + ["\u56F2", "\u56F2"], /* CJK Ideograph */ + ["\u56F3", "\u56F3"], /* CJK Ideograph */ + ["\u56F4", "\u56F4"], /* CJK Ideograph */ + ["\u56F5", "\u56F5"], /* CJK Ideograph */ + ["\u56F6", "\u56F6"], /* CJK Ideograph */ + ["\u56F7", "\u56F7"], /* CJK Ideograph */ + ["\u56F8", "\u56F8"], /* CJK Ideograph */ + ["\u56F9", "\u56F9"], /* CJK Ideograph */ + ["\u56FA", "\u56FA"], /* CJK Ideograph */ + ["\u56FB", "\u56FB"], /* CJK Ideograph */ + ["\u56FC", "\u56FC"], /* CJK Ideograph */ + ["\u56FD", "\u56FD"], /* CJK Ideograph */ + ["\u56FE", "\u56FE"], /* CJK Ideograph */ + ["\u56FF", "\u56FF"], /* CJK Ideograph */ + ["\u5700", "\u5700"], /* CJK Ideograph */ + ["\u5701", "\u5701"], /* CJK Ideograph */ + ["\u5702", "\u5702"], /* CJK Ideograph */ + ["\u5703", "\u5703"], /* CJK Ideograph */ + ["\u5704", "\u5704"], /* CJK Ideograph */ + ["\u5705", "\u5705"], /* CJK Ideograph */ + ["\u5706", "\u5706"], /* CJK Ideograph */ + ["\u5707", "\u5707"], /* CJK Ideograph */ + ["\u5708", "\u5708"], /* CJK Ideograph */ + ["\u5709", "\u5709"], /* CJK Ideograph */ + ["\u570A", "\u570A"], /* CJK Ideograph */ + ["\u570B", "\u570B"], /* CJK Ideograph */ + ["\u570C", "\u570C"], /* CJK Ideograph */ + ["\u570D", "\u570D"], /* CJK Ideograph */ + ["\u570E", "\u570E"], /* CJK Ideograph */ + ["\u570F", "\u570F"], /* CJK Ideograph */ + ["\u5710", "\u5710"], /* CJK Ideograph */ + ["\u5711", "\u5711"], /* CJK Ideograph */ + ["\u5712", "\u5712"], /* CJK Ideograph */ + ["\u5713", "\u5713"], /* CJK Ideograph */ + ["\u5714", "\u5714"], /* CJK Ideograph */ + ["\u5715", "\u5715"], /* CJK Ideograph */ + ["\u5716", "\u5716"], /* CJK Ideograph */ + ["\u5717", "\u5717"], /* CJK Ideograph */ + ["\u5718", "\u5718"], /* CJK Ideograph */ + ["\u5719", "\u5719"], /* CJK Ideograph */ + ["\u571A", "\u571A"], /* CJK Ideograph */ + ["\u571B", "\u571B"], /* CJK Ideograph */ + ["\u571C", "\u571C"], /* CJK Ideograph */ + ["\u571D", "\u571D"], /* CJK Ideograph */ + ["\u571E", "\u571E"], /* CJK Ideograph */ + ["\u571F", "\u571F"], /* CJK Ideograph */ + ["\u5720", "\u5720"], /* CJK Ideograph */ + ["\u5721", "\u5721"], /* CJK Ideograph */ + ["\u5722", "\u5722"], /* CJK Ideograph */ + ["\u5723", "\u5723"], /* CJK Ideograph */ + ["\u5724", "\u5724"], /* CJK Ideograph */ + ["\u5725", "\u5725"], /* CJK Ideograph */ + ["\u5726", "\u5726"], /* CJK Ideograph */ + ["\u5727", "\u5727"], /* CJK Ideograph */ + ["\u5728", "\u5728"], /* CJK Ideograph */ + ["\u5729", "\u5729"], /* CJK Ideograph */ + ["\u572A", "\u572A"], /* CJK Ideograph */ + ["\u572B", "\u572B"], /* CJK Ideograph */ + ["\u572C", "\u572C"], /* CJK Ideograph */ + ["\u572D", "\u572D"], /* CJK Ideograph */ + ["\u572E", "\u572E"], /* CJK Ideograph */ + ["\u572F", "\u572F"], /* CJK Ideograph */ + ["\u5730", "\u5730"], /* CJK Ideograph */ + ["\u5731", "\u5731"], /* CJK Ideograph */ + ["\u5732", "\u5732"], /* CJK Ideograph */ + ["\u5733", "\u5733"], /* CJK Ideograph */ + ["\u5734", "\u5734"], /* CJK Ideograph */ + ["\u5735", "\u5735"], /* CJK Ideograph */ + ["\u5736", "\u5736"], /* CJK Ideograph */ + ["\u5737", "\u5737"], /* CJK Ideograph */ + ["\u5738", "\u5738"], /* CJK Ideograph */ + ["\u5739", "\u5739"], /* CJK Ideograph */ + ["\u573A", "\u573A"], /* CJK Ideograph */ + ["\u573B", "\u573B"], /* CJK Ideograph */ + ["\u573C", "\u573C"], /* CJK Ideograph */ + ["\u573D", "\u573D"], /* CJK Ideograph */ + ["\u573E", "\u573E"], /* CJK Ideograph */ + ["\u573F", "\u573F"], /* CJK Ideograph */ + ["\u5740", "\u5740"], /* CJK Ideograph */ + ["\u5741", "\u5741"], /* CJK Ideograph */ + ["\u5742", "\u5742"], /* CJK Ideograph */ + ["\u5743", "\u5743"], /* CJK Ideograph */ + ["\u5744", "\u5744"], /* CJK Ideograph */ + ["\u5745", "\u5745"], /* CJK Ideograph */ + ["\u5746", "\u5746"], /* CJK Ideograph */ + ["\u5747", "\u5747"], /* CJK Ideograph */ + ["\u5748", "\u5748"], /* CJK Ideograph */ + ["\u5749", "\u5749"], /* CJK Ideograph */ + ["\u574A", "\u574A"], /* CJK Ideograph */ + ["\u574B", "\u574B"], /* CJK Ideograph */ + ["\u574C", "\u574C"], /* CJK Ideograph */ + ["\u574D", "\u574D"], /* CJK Ideograph */ + ["\u574E", "\u574E"], /* CJK Ideograph */ + ["\u574F", "\u574F"], /* CJK Ideograph */ + ["\u5750", "\u5750"], /* CJK Ideograph */ + ["\u5751", "\u5751"], /* CJK Ideograph */ + ["\u5752", "\u5752"], /* CJK Ideograph */ + ["\u5753", "\u5753"], /* CJK Ideograph */ + ["\u5754", "\u5754"], /* CJK Ideograph */ + ["\u5755", "\u5755"], /* CJK Ideograph */ + ["\u5756", "\u5756"], /* CJK Ideograph */ + ["\u5757", "\u5757"], /* CJK Ideograph */ + ["\u5758", "\u5758"], /* CJK Ideograph */ + ["\u5759", "\u5759"], /* CJK Ideograph */ + ["\u575A", "\u575A"], /* CJK Ideograph */ + ["\u575B", "\u575B"], /* CJK Ideograph */ + ["\u575C", "\u575C"], /* CJK Ideograph */ + ["\u575D", "\u575D"], /* CJK Ideograph */ + ["\u575E", "\u575E"], /* CJK Ideograph */ + ["\u575F", "\u575F"], /* CJK Ideograph */ + ["\u5760", "\u5760"], /* CJK Ideograph */ + ["\u5761", "\u5761"], /* CJK Ideograph */ + ["\u5762", "\u5762"], /* CJK Ideograph */ + ["\u5763", "\u5763"], /* CJK Ideograph */ + ["\u5764", "\u5764"], /* CJK Ideograph */ + ["\u5765", "\u5765"], /* CJK Ideograph */ + ["\u5766", "\u5766"], /* CJK Ideograph */ + ["\u5767", "\u5767"], /* CJK Ideograph */ + ["\u5768", "\u5768"], /* CJK Ideograph */ + ["\u5769", "\u5769"], /* CJK Ideograph */ + ["\u576A", "\u576A"], /* CJK Ideograph */ + ["\u576B", "\u576B"], /* CJK Ideograph */ + ["\u576C", "\u576C"], /* CJK Ideograph */ + ["\u576D", "\u576D"], /* CJK Ideograph */ + ["\u576E", "\u576E"], /* CJK Ideograph */ + ["\u576F", "\u576F"], /* CJK Ideograph */ + ["\u5770", "\u5770"], /* CJK Ideograph */ + ["\u5771", "\u5771"], /* CJK Ideograph */ + ["\u5772", "\u5772"], /* CJK Ideograph */ + ["\u5773", "\u5773"], /* CJK Ideograph */ + ["\u5774", "\u5774"], /* CJK Ideograph */ + ["\u5775", "\u5775"], /* CJK Ideograph */ + ["\u5776", "\u5776"], /* CJK Ideograph */ + ["\u5777", "\u5777"], /* CJK Ideograph */ + ["\u5778", "\u5778"], /* CJK Ideograph */ + ["\u5779", "\u5779"], /* CJK Ideograph */ + ["\u577A", "\u577A"], /* CJK Ideograph */ + ["\u577B", "\u577B"], /* CJK Ideograph */ + ["\u577C", "\u577C"], /* CJK Ideograph */ + ["\u577D", "\u577D"], /* CJK Ideograph */ + ["\u577E", "\u577E"], /* CJK Ideograph */ + ["\u577F", "\u577F"], /* CJK Ideograph */ + ["\u5780", "\u5780"], /* CJK Ideograph */ + ["\u5781", "\u5781"], /* CJK Ideograph */ + ["\u5782", "\u5782"], /* CJK Ideograph */ + ["\u5783", "\u5783"], /* CJK Ideograph */ + ["\u5784", "\u5784"], /* CJK Ideograph */ + ["\u5785", "\u5785"], /* CJK Ideograph */ + ["\u5786", "\u5786"], /* CJK Ideograph */ + ["\u5787", "\u5787"], /* CJK Ideograph */ + ["\u5788", "\u5788"], /* CJK Ideograph */ + ["\u5789", "\u5789"], /* CJK Ideograph */ + ["\u578A", "\u578A"], /* CJK Ideograph */ + ["\u578B", "\u578B"], /* CJK Ideograph */ + ["\u578C", "\u578C"], /* CJK Ideograph */ + ["\u578D", "\u578D"], /* CJK Ideograph */ + ["\u578E", "\u578E"], /* CJK Ideograph */ + ["\u578F", "\u578F"], /* CJK Ideograph */ + ["\u5790", "\u5790"], /* CJK Ideograph */ + ["\u5791", "\u5791"], /* CJK Ideograph */ + ["\u5792", "\u5792"], /* CJK Ideograph */ + ["\u5793", "\u5793"], /* CJK Ideograph */ + ["\u5794", "\u5794"], /* CJK Ideograph */ + ["\u5795", "\u5795"], /* CJK Ideograph */ + ["\u5796", "\u5796"], /* CJK Ideograph */ + ["\u5797", "\u5797"], /* CJK Ideograph */ + ["\u5798", "\u5798"], /* CJK Ideograph */ + ["\u5799", "\u5799"], /* CJK Ideograph */ + ["\u579A", "\u579A"], /* CJK Ideograph */ + ["\u579B", "\u579B"], /* CJK Ideograph */ + ["\u579C", "\u579C"], /* CJK Ideograph */ + ["\u579D", "\u579D"], /* CJK Ideograph */ + ["\u579E", "\u579E"], /* CJK Ideograph */ + ["\u579F", "\u579F"], /* CJK Ideograph */ + ["\u57A0", "\u57A0"], /* CJK Ideograph */ + ["\u57A1", "\u57A1"], /* CJK Ideograph */ + ["\u57A2", "\u57A2"], /* CJK Ideograph */ + ["\u57A3", "\u57A3"], /* CJK Ideograph */ + ["\u57A4", "\u57A4"], /* CJK Ideograph */ + ["\u57A5", "\u57A5"], /* CJK Ideograph */ + ["\u57A6", "\u57A6"], /* CJK Ideograph */ + ["\u57A7", "\u57A7"], /* CJK Ideograph */ + ["\u57A8", "\u57A8"], /* CJK Ideograph */ + ["\u57A9", "\u57A9"], /* CJK Ideograph */ + ["\u57AA", "\u57AA"], /* CJK Ideograph */ + ["\u57AB", "\u57AB"], /* CJK Ideograph */ + ["\u57AC", "\u57AC"], /* CJK Ideograph */ + ["\u57AD", "\u57AD"], /* CJK Ideograph */ + ["\u57AE", "\u57AE"], /* CJK Ideograph */ + ["\u57AF", "\u57AF"], /* CJK Ideograph */ + ["\u57B0", "\u57B0"], /* CJK Ideograph */ + ["\u57B1", "\u57B1"], /* CJK Ideograph */ + ["\u57B2", "\u57B2"], /* CJK Ideograph */ + ["\u57B3", "\u57B3"], /* CJK Ideograph */ + ["\u57B4", "\u57B4"], /* CJK Ideograph */ + ["\u57B5", "\u57B5"], /* CJK Ideograph */ + ["\u57B6", "\u57B6"], /* CJK Ideograph */ + ["\u57B7", "\u57B7"], /* CJK Ideograph */ + ["\u57B8", "\u57B8"], /* CJK Ideograph */ + ["\u57B9", "\u57B9"], /* CJK Ideograph */ + ["\u57BA", "\u57BA"], /* CJK Ideograph */ + ["\u57BB", "\u57BB"], /* CJK Ideograph */ + ["\u57BC", "\u57BC"], /* CJK Ideograph */ + ["\u57BD", "\u57BD"], /* CJK Ideograph */ + ["\u57BE", "\u57BE"], /* CJK Ideograph */ + ["\u57BF", "\u57BF"], /* CJK Ideograph */ + ["\u57C0", "\u57C0"], /* CJK Ideograph */ + ["\u57C1", "\u57C1"], /* CJK Ideograph */ + ["\u57C2", "\u57C2"], /* CJK Ideograph */ + ["\u57C3", "\u57C3"], /* CJK Ideograph */ + ["\u57C4", "\u57C4"], /* CJK Ideograph */ + ["\u57C5", "\u57C5"], /* CJK Ideograph */ + ["\u57C6", "\u57C6"], /* CJK Ideograph */ + ["\u57C7", "\u57C7"], /* CJK Ideograph */ + ["\u57C8", "\u57C8"], /* CJK Ideograph */ + ["\u57C9", "\u57C9"], /* CJK Ideograph */ + ["\u57CA", "\u57CA"], /* CJK Ideograph */ + ["\u57CB", "\u57CB"], /* CJK Ideograph */ + ["\u57CC", "\u57CC"], /* CJK Ideograph */ + ["\u57CD", "\u57CD"], /* CJK Ideograph */ + ["\u57CE", "\u57CE"], /* CJK Ideograph */ + ["\u57CF", "\u57CF"], /* CJK Ideograph */ + ["\u57D0", "\u57D0"], /* CJK Ideograph */ + ["\u57D1", "\u57D1"], /* CJK Ideograph */ + ["\u57D2", "\u57D2"], /* CJK Ideograph */ + ["\u57D3", "\u57D3"], /* CJK Ideograph */ + ["\u57D4", "\u57D4"], /* CJK Ideograph */ + ["\u57D5", "\u57D5"], /* CJK Ideograph */ + ["\u57D6", "\u57D6"], /* CJK Ideograph */ + ["\u57D7", "\u57D7"], /* CJK Ideograph */ + ["\u57D8", "\u57D8"], /* CJK Ideograph */ + ["\u57D9", "\u57D9"], /* CJK Ideograph */ + ["\u57DA", "\u57DA"], /* CJK Ideograph */ + ["\u57DB", "\u57DB"], /* CJK Ideograph */ + ["\u57DC", "\u57DC"], /* CJK Ideograph */ + ["\u57DD", "\u57DD"], /* CJK Ideograph */ + ["\u57DE", "\u57DE"], /* CJK Ideograph */ + ["\u57DF", "\u57DF"], /* CJK Ideograph */ + ["\u57E0", "\u57E0"], /* CJK Ideograph */ + ["\u57E1", "\u57E1"], /* CJK Ideograph */ + ["\u57E2", "\u57E2"], /* CJK Ideograph */ + ["\u57E3", "\u57E3"], /* CJK Ideograph */ + ["\u57E4", "\u57E4"], /* CJK Ideograph */ + ["\u57E5", "\u57E5"], /* CJK Ideograph */ + ["\u57E6", "\u57E6"], /* CJK Ideograph */ + ["\u57E7", "\u57E7"], /* CJK Ideograph */ + ["\u57E8", "\u57E8"], /* CJK Ideograph */ + ["\u57E9", "\u57E9"], /* CJK Ideograph */ + ["\u57EA", "\u57EA"], /* CJK Ideograph */ + ["\u57EB", "\u57EB"], /* CJK Ideograph */ + ["\u57EC", "\u57EC"], /* CJK Ideograph */ + ["\u57ED", "\u57ED"], /* CJK Ideograph */ + ["\u57EE", "\u57EE"], /* CJK Ideograph */ + ["\u57EF", "\u57EF"], /* CJK Ideograph */ + ["\u57F0", "\u57F0"], /* CJK Ideograph */ + ["\u57F1", "\u57F1"], /* CJK Ideograph */ + ["\u57F2", "\u57F2"], /* CJK Ideograph */ + ["\u57F3", "\u57F3"], /* CJK Ideograph */ + ["\u57F4", "\u57F4"], /* CJK Ideograph */ + ["\u57F5", "\u57F5"], /* CJK Ideograph */ + ["\u57F6", "\u57F6"], /* CJK Ideograph */ + ["\u57F7", "\u57F7"], /* CJK Ideograph */ + ["\u57F8", "\u57F8"], /* CJK Ideograph */ + ["\u57F9", "\u57F9"], /* CJK Ideograph */ + ["\u57FA", "\u57FA"], /* CJK Ideograph */ + ["\u57FB", "\u57FB"], /* CJK Ideograph */ + ["\u57FC", "\u57FC"], /* CJK Ideograph */ + ["\u57FD", "\u57FD"], /* CJK Ideograph */ + ["\u57FE", "\u57FE"], /* CJK Ideograph */ + ["\u57FF", "\u57FF"], /* CJK Ideograph */ + ["\u5800", "\u5800"], /* CJK Ideograph */ + ["\u5801", "\u5801"], /* CJK Ideograph */ + ["\u5802", "\u5802"], /* CJK Ideograph */ + ["\u5803", "\u5803"], /* CJK Ideograph */ + ["\u5804", "\u5804"], /* CJK Ideograph */ + ["\u5805", "\u5805"], /* CJK Ideograph */ + ["\u5806", "\u5806"], /* CJK Ideograph */ + ["\u5807", "\u5807"], /* CJK Ideograph */ + ["\u5808", "\u5808"], /* CJK Ideograph */ + ["\u5809", "\u5809"], /* CJK Ideograph */ + ["\u580A", "\u580A"], /* CJK Ideograph */ + ["\u580B", "\u580B"], /* CJK Ideograph */ + ["\u580C", "\u580C"], /* CJK Ideograph */ + ["\u580D", "\u580D"], /* CJK Ideograph */ + ["\u580E", "\u580E"], /* CJK Ideograph */ + ["\u580F", "\u580F"], /* CJK Ideograph */ + ["\u5810", "\u5810"], /* CJK Ideograph */ + ["\u5811", "\u5811"], /* CJK Ideograph */ + ["\u5812", "\u5812"], /* CJK Ideograph */ + ["\u5813", "\u5813"], /* CJK Ideograph */ + ["\u5814", "\u5814"], /* CJK Ideograph */ + ["\u5815", "\u5815"], /* CJK Ideograph */ + ["\u5816", "\u5816"], /* CJK Ideograph */ + ["\u5817", "\u5817"], /* CJK Ideograph */ + ["\u5818", "\u5818"], /* CJK Ideograph */ + ["\u5819", "\u5819"], /* CJK Ideograph */ + ["\u581A", "\u581A"], /* CJK Ideograph */ + ["\u581B", "\u581B"], /* CJK Ideograph */ + ["\u581C", "\u581C"], /* CJK Ideograph */ + ["\u581D", "\u581D"], /* CJK Ideograph */ + ["\u581E", "\u581E"], /* CJK Ideograph */ + ["\u581F", "\u581F"], /* CJK Ideograph */ + ["\u5820", "\u5820"], /* CJK Ideograph */ + ["\u5821", "\u5821"], /* CJK Ideograph */ + ["\u5822", "\u5822"], /* CJK Ideograph */ + ["\u5823", "\u5823"], /* CJK Ideograph */ + ["\u5824", "\u5824"], /* CJK Ideograph */ + ["\u5825", "\u5825"], /* CJK Ideograph */ + ["\u5826", "\u5826"], /* CJK Ideograph */ + ["\u5827", "\u5827"], /* CJK Ideograph */ + ["\u5828", "\u5828"], /* CJK Ideograph */ + ["\u5829", "\u5829"], /* CJK Ideograph */ + ["\u582A", "\u582A"], /* CJK Ideograph */ + ["\u582B", "\u582B"], /* CJK Ideograph */ + ["\u582C", "\u582C"], /* CJK Ideograph */ + ["\u582D", "\u582D"], /* CJK Ideograph */ + ["\u582E", "\u582E"], /* CJK Ideograph */ + ["\u582F", "\u582F"], /* CJK Ideograph */ + ["\u5830", "\u5830"], /* CJK Ideograph */ + ["\u5831", "\u5831"], /* CJK Ideograph */ + ["\u5832", "\u5832"], /* CJK Ideograph */ + ["\u5833", "\u5833"], /* CJK Ideograph */ + ["\u5834", "\u5834"], /* CJK Ideograph */ + ["\u5835", "\u5835"], /* CJK Ideograph */ + ["\u5836", "\u5836"], /* CJK Ideograph */ + ["\u5837", "\u5837"], /* CJK Ideograph */ + ["\u5838", "\u5838"], /* CJK Ideograph */ + ["\u5839", "\u5839"], /* CJK Ideograph */ + ["\u583A", "\u583A"], /* CJK Ideograph */ + ["\u583B", "\u583B"], /* CJK Ideograph */ + ["\u583C", "\u583C"], /* CJK Ideograph */ + ["\u583D", "\u583D"], /* CJK Ideograph */ + ["\u583E", "\u583E"], /* CJK Ideograph */ + ["\u583F", "\u583F"], /* CJK Ideograph */ + ["\u5840", "\u5840"], /* CJK Ideograph */ + ["\u5841", "\u5841"], /* CJK Ideograph */ + ["\u5842", "\u5842"], /* CJK Ideograph */ + ["\u5843", "\u5843"], /* CJK Ideograph */ + ["\u5844", "\u5844"], /* CJK Ideograph */ + ["\u5845", "\u5845"], /* CJK Ideograph */ + ["\u5846", "\u5846"], /* CJK Ideograph */ + ["\u5847", "\u5847"], /* CJK Ideograph */ + ["\u5848", "\u5848"], /* CJK Ideograph */ + ["\u5849", "\u5849"], /* CJK Ideograph */ + ["\u584A", "\u584A"], /* CJK Ideograph */ + ["\u584B", "\u584B"], /* CJK Ideograph */ + ["\u584C", "\u584C"], /* CJK Ideograph */ + ["\u584D", "\u584D"], /* CJK Ideograph */ + ["\u584E", "\u584E"], /* CJK Ideograph */ + ["\u584F", "\u584F"], /* CJK Ideograph */ + ["\u5850", "\u5850"], /* CJK Ideograph */ + ["\u5851", "\u5851"], /* CJK Ideograph */ + ["\u5852", "\u5852"], /* CJK Ideograph */ + ["\u5853", "\u5853"], /* CJK Ideograph */ + ["\u5854", "\u5854"], /* CJK Ideograph */ + ["\u5855", "\u5855"], /* CJK Ideograph */ + ["\u5856", "\u5856"], /* CJK Ideograph */ + ["\u5857", "\u5857"], /* CJK Ideograph */ + ["\u5858", "\u5858"], /* CJK Ideograph */ + ["\u5859", "\u5859"], /* CJK Ideograph */ + ["\u585A", "\u585A"], /* CJK Ideograph */ + ["\u585B", "\u585B"], /* CJK Ideograph */ + ["\u585C", "\u585C"], /* CJK Ideograph */ + ["\u585D", "\u585D"], /* CJK Ideograph */ + ["\u585E", "\u585E"], /* CJK Ideograph */ + ["\u585F", "\u585F"], /* CJK Ideograph */ + ["\u5860", "\u5860"], /* CJK Ideograph */ + ["\u5861", "\u5861"], /* CJK Ideograph */ + ["\u5862", "\u5862"], /* CJK Ideograph */ + ["\u5863", "\u5863"], /* CJK Ideograph */ + ["\u5864", "\u5864"], /* CJK Ideograph */ + ["\u5865", "\u5865"], /* CJK Ideograph */ + ["\u5866", "\u5866"], /* CJK Ideograph */ + ["\u5867", "\u5867"], /* CJK Ideograph */ + ["\u5868", "\u5868"], /* CJK Ideograph */ + ["\u5869", "\u5869"], /* CJK Ideograph */ + ["\u586A", "\u586A"], /* CJK Ideograph */ + ["\u586B", "\u586B"], /* CJK Ideograph */ + ["\u586C", "\u586C"], /* CJK Ideograph */ + ["\u586D", "\u586D"], /* CJK Ideograph */ + ["\u586E", "\u586E"], /* CJK Ideograph */ + ["\u586F", "\u586F"], /* CJK Ideograph */ + ["\u5870", "\u5870"], /* CJK Ideograph */ + ["\u5871", "\u5871"], /* CJK Ideograph */ + ["\u5872", "\u5872"], /* CJK Ideograph */ + ["\u5873", "\u5873"], /* CJK Ideograph */ + ["\u5874", "\u5874"], /* CJK Ideograph */ + ["\u5875", "\u5875"], /* CJK Ideograph */ + ["\u5876", "\u5876"], /* CJK Ideograph */ + ["\u5877", "\u5877"], /* CJK Ideograph */ + ["\u5878", "\u5878"], /* CJK Ideograph */ + ["\u5879", "\u5879"], /* CJK Ideograph */ + ["\u587A", "\u587A"], /* CJK Ideograph */ + ["\u587B", "\u587B"], /* CJK Ideograph */ + ["\u587C", "\u587C"], /* CJK Ideograph */ + ["\u587D", "\u587D"], /* CJK Ideograph */ + ["\u587E", "\u587E"], /* CJK Ideograph */ + ["\u587F", "\u587F"], /* CJK Ideograph */ + ["\u5880", "\u5880"], /* CJK Ideograph */ + ["\u5881", "\u5881"], /* CJK Ideograph */ + ["\u5882", "\u5882"], /* CJK Ideograph */ + ["\u5883", "\u5883"], /* CJK Ideograph */ + ["\u5884", "\u5884"], /* CJK Ideograph */ + ["\u5885", "\u5885"], /* CJK Ideograph */ + ["\u5886", "\u5886"], /* CJK Ideograph */ + ["\u5887", "\u5887"], /* CJK Ideograph */ + ["\u5888", "\u5888"], /* CJK Ideograph */ + ["\u5889", "\u5889"], /* CJK Ideograph */ + ["\u588A", "\u588A"], /* CJK Ideograph */ + ["\u588B", "\u588B"], /* CJK Ideograph */ + ["\u588C", "\u588C"], /* CJK Ideograph */ + ["\u588D", "\u588D"], /* CJK Ideograph */ + ["\u588E", "\u588E"], /* CJK Ideograph */ + ["\u588F", "\u588F"], /* CJK Ideograph */ + ["\u5890", "\u5890"], /* CJK Ideograph */ + ["\u5891", "\u5891"], /* CJK Ideograph */ + ["\u5892", "\u5892"], /* CJK Ideograph */ + ["\u5893", "\u5893"], /* CJK Ideograph */ + ["\u5894", "\u5894"], /* CJK Ideograph */ + ["\u5895", "\u5895"], /* CJK Ideograph */ + ["\u5896", "\u5896"], /* CJK Ideograph */ + ["\u5897", "\u5897"], /* CJK Ideograph */ + ["\u5898", "\u5898"], /* CJK Ideograph */ + ["\u5899", "\u5899"], /* CJK Ideograph */ + ["\u589A", "\u589A"], /* CJK Ideograph */ + ["\u589B", "\u589B"], /* CJK Ideograph */ + ["\u589C", "\u589C"], /* CJK Ideograph */ + ["\u589D", "\u589D"], /* CJK Ideograph */ + ["\u589E", "\u589E"], /* CJK Ideograph */ + ["\u589F", "\u589F"], /* CJK Ideograph */ + ["\u58A0", "\u58A0"], /* CJK Ideograph */ + ["\u58A1", "\u58A1"], /* CJK Ideograph */ + ["\u58A2", "\u58A2"], /* CJK Ideograph */ + ["\u58A3", "\u58A3"], /* CJK Ideograph */ + ["\u58A4", "\u58A4"], /* CJK Ideograph */ + ["\u58A5", "\u58A5"], /* CJK Ideograph */ + ["\u58A6", "\u58A6"], /* CJK Ideograph */ + ["\u58A7", "\u58A7"], /* CJK Ideograph */ + ["\u58A8", "\u58A8"], /* CJK Ideograph */ + ["\u58A9", "\u58A9"], /* CJK Ideograph */ + ["\u58AA", "\u58AA"], /* CJK Ideograph */ + ["\u58AB", "\u58AB"], /* CJK Ideograph */ + ["\u58AC", "\u58AC"], /* CJK Ideograph */ + ["\u58AD", "\u58AD"], /* CJK Ideograph */ + ["\u58AE", "\u58AE"], /* CJK Ideograph */ + ["\u58AF", "\u58AF"], /* CJK Ideograph */ + ["\u58B0", "\u58B0"], /* CJK Ideograph */ + ["\u58B1", "\u58B1"], /* CJK Ideograph */ + ["\u58B2", "\u58B2"], /* CJK Ideograph */ + ["\u58B3", "\u58B3"], /* CJK Ideograph */ + ["\u58B4", "\u58B4"], /* CJK Ideograph */ + ["\u58B5", "\u58B5"], /* CJK Ideograph */ + ["\u58B6", "\u58B6"], /* CJK Ideograph */ + ["\u58B7", "\u58B7"], /* CJK Ideograph */ + ["\u58B8", "\u58B8"], /* CJK Ideograph */ + ["\u58B9", "\u58B9"], /* CJK Ideograph */ + ["\u58BA", "\u58BA"], /* CJK Ideograph */ + ["\u58BB", "\u58BB"], /* CJK Ideograph */ + ["\u58BC", "\u58BC"], /* CJK Ideograph */ + ["\u58BD", "\u58BD"], /* CJK Ideograph */ + ["\u58BE", "\u58BE"], /* CJK Ideograph */ + ["\u58BF", "\u58BF"], /* CJK Ideograph */ + ["\u58C0", "\u58C0"], /* CJK Ideograph */ + ["\u58C1", "\u58C1"], /* CJK Ideograph */ + ["\u58C2", "\u58C2"], /* CJK Ideograph */ + ["\u58C3", "\u58C3"], /* CJK Ideograph */ + ["\u58C4", "\u58C4"], /* CJK Ideograph */ + ["\u58C5", "\u58C5"], /* CJK Ideograph */ + ["\u58C6", "\u58C6"], /* CJK Ideograph */ + ["\u58C7", "\u58C7"], /* CJK Ideograph */ + ["\u58C8", "\u58C8"], /* CJK Ideograph */ + ["\u58C9", "\u58C9"], /* CJK Ideograph */ + ["\u58CA", "\u58CA"], /* CJK Ideograph */ + ["\u58CB", "\u58CB"], /* CJK Ideograph */ + ["\u58CC", "\u58CC"], /* CJK Ideograph */ + ["\u58CD", "\u58CD"], /* CJK Ideograph */ + ["\u58CE", "\u58CE"], /* CJK Ideograph */ + ["\u58CF", "\u58CF"], /* CJK Ideograph */ + ["\u58D0", "\u58D0"], /* CJK Ideograph */ + ["\u58D1", "\u58D1"], /* CJK Ideograph */ + ["\u58D2", "\u58D2"], /* CJK Ideograph */ + ["\u58D3", "\u58D3"], /* CJK Ideograph */ + ["\u58D4", "\u58D4"], /* CJK Ideograph */ + ["\u58D5", "\u58D5"], /* CJK Ideograph */ + ["\u58D6", "\u58D6"], /* CJK Ideograph */ + ["\u58D7", "\u58D7"], /* CJK Ideograph */ + ["\u58D8", "\u58D8"], /* CJK Ideograph */ + ["\u58D9", "\u58D9"], /* CJK Ideograph */ + ["\u58DA", "\u58DA"], /* CJK Ideograph */ + ["\u58DB", "\u58DB"], /* CJK Ideograph */ + ["\u58DC", "\u58DC"], /* CJK Ideograph */ + ["\u58DD", "\u58DD"], /* CJK Ideograph */ + ["\u58DE", "\u58DE"], /* CJK Ideograph */ + ["\u58DF", "\u58DF"], /* CJK Ideograph */ + ["\u58E0", "\u58E0"], /* CJK Ideograph */ + ["\u58E1", "\u58E1"], /* CJK Ideograph */ + ["\u58E2", "\u58E2"], /* CJK Ideograph */ + ["\u58E3", "\u58E3"], /* CJK Ideograph */ + ["\u58E4", "\u58E4"], /* CJK Ideograph */ + ["\u58E5", "\u58E5"], /* CJK Ideograph */ + ["\u58E6", "\u58E6"], /* CJK Ideograph */ + ["\u58E7", "\u58E7"], /* CJK Ideograph */ + ["\u58E8", "\u58E8"], /* CJK Ideograph */ + ["\u58E9", "\u58E9"], /* CJK Ideograph */ + ["\u58EA", "\u58EA"], /* CJK Ideograph */ + ["\u58EB", "\u58EB"], /* CJK Ideograph */ + ["\u58EC", "\u58EC"], /* CJK Ideograph */ + ["\u58ED", "\u58ED"], /* CJK Ideograph */ + ["\u58EE", "\u58EE"], /* CJK Ideograph */ + ["\u58EF", "\u58EF"], /* CJK Ideograph */ + ["\u58F0", "\u58F0"], /* CJK Ideograph */ + ["\u58F1", "\u58F1"], /* CJK Ideograph */ + ["\u58F2", "\u58F2"], /* CJK Ideograph */ + ["\u58F3", "\u58F3"], /* CJK Ideograph */ + ["\u58F4", "\u58F4"], /* CJK Ideograph */ + ["\u58F5", "\u58F5"], /* CJK Ideograph */ + ["\u58F6", "\u58F6"], /* CJK Ideograph */ + ["\u58F7", "\u58F7"], /* CJK Ideograph */ + ["\u58F8", "\u58F8"], /* CJK Ideograph */ + ["\u58F9", "\u58F9"], /* CJK Ideograph */ + ["\u58FA", "\u58FA"], /* CJK Ideograph */ + ["\u58FB", "\u58FB"], /* CJK Ideograph */ + ["\u58FC", "\u58FC"], /* CJK Ideograph */ + ["\u58FD", "\u58FD"], /* CJK Ideograph */ + ["\u58FE", "\u58FE"], /* CJK Ideograph */ + ["\u58FF", "\u58FF"], /* CJK Ideograph */ + ["\u5900", "\u5900"], /* CJK Ideograph */ + ["\u5901", "\u5901"], /* CJK Ideograph */ + ["\u5902", "\u5902"], /* CJK Ideograph */ + ["\u5903", "\u5903"], /* CJK Ideograph */ + ["\u5904", "\u5904"], /* CJK Ideograph */ + ["\u5905", "\u5905"], /* CJK Ideograph */ + ["\u5906", "\u5906"], /* CJK Ideograph */ + ["\u5907", "\u5907"], /* CJK Ideograph */ + ["\u5908", "\u5908"], /* CJK Ideograph */ + ["\u5909", "\u5909"], /* CJK Ideograph */ + ["\u590A", "\u590A"], /* CJK Ideograph */ + ["\u590B", "\u590B"], /* CJK Ideograph */ + ["\u590C", "\u590C"], /* CJK Ideograph */ + ["\u590D", "\u590D"], /* CJK Ideograph */ + ["\u590E", "\u590E"], /* CJK Ideograph */ + ["\u590F", "\u590F"], /* CJK Ideograph */ + ["\u5910", "\u5910"], /* CJK Ideograph */ + ["\u5911", "\u5911"], /* CJK Ideograph */ + ["\u5912", "\u5912"], /* CJK Ideograph */ + ["\u5913", "\u5913"], /* CJK Ideograph */ + ["\u5914", "\u5914"], /* CJK Ideograph */ + ["\u5915", "\u5915"], /* CJK Ideograph */ + ["\u5916", "\u5916"], /* CJK Ideograph */ + ["\u5917", "\u5917"], /* CJK Ideograph */ + ["\u5918", "\u5918"], /* CJK Ideograph */ + ["\u5919", "\u5919"], /* CJK Ideograph */ + ["\u591A", "\u591A"], /* CJK Ideograph */ + ["\u591B", "\u591B"], /* CJK Ideograph */ + ["\u591C", "\u591C"], /* CJK Ideograph */ + ["\u591D", "\u591D"], /* CJK Ideograph */ + ["\u591E", "\u591E"], /* CJK Ideograph */ + ["\u591F", "\u591F"], /* CJK Ideograph */ + ["\u5920", "\u5920"], /* CJK Ideograph */ + ["\u5921", "\u5921"], /* CJK Ideograph */ + ["\u5922", "\u5922"], /* CJK Ideograph */ + ["\u5923", "\u5923"], /* CJK Ideograph */ + ["\u5924", "\u5924"], /* CJK Ideograph */ + ["\u5925", "\u5925"], /* CJK Ideograph */ + ["\u5926", "\u5926"], /* CJK Ideograph */ + ["\u5927", "\u5927"], /* CJK Ideograph */ + ["\u5928", "\u5928"], /* CJK Ideograph */ + ["\u5929", "\u5929"], /* CJK Ideograph */ + ["\u592A", "\u592A"], /* CJK Ideograph */ + ["\u592B", "\u592B"], /* CJK Ideograph */ + ["\u592C", "\u592C"], /* CJK Ideograph */ + ["\u592D", "\u592D"], /* CJK Ideograph */ + ["\u592E", "\u592E"], /* CJK Ideograph */ + ["\u592F", "\u592F"], /* CJK Ideograph */ + ["\u5930", "\u5930"], /* CJK Ideograph */ + ["\u5931", "\u5931"], /* CJK Ideograph */ + ["\u5932", "\u5932"], /* CJK Ideograph */ + ["\u5933", "\u5933"], /* CJK Ideograph */ + ["\u5934", "\u5934"], /* CJK Ideograph */ + ["\u5935", "\u5935"], /* CJK Ideograph */ + ["\u5936", "\u5936"], /* CJK Ideograph */ + ["\u5937", "\u5937"], /* CJK Ideograph */ + ["\u5938", "\u5938"], /* CJK Ideograph */ + ["\u5939", "\u5939"], /* CJK Ideograph */ + ["\u593A", "\u593A"], /* CJK Ideograph */ + ["\u593B", "\u593B"], /* CJK Ideograph */ + ["\u593C", "\u593C"], /* CJK Ideograph */ + ["\u593D", "\u593D"], /* CJK Ideograph */ + ["\u593E", "\u593E"], /* CJK Ideograph */ + ["\u593F", "\u593F"], /* CJK Ideograph */ + ["\u5940", "\u5940"], /* CJK Ideograph */ + ["\u5941", "\u5941"], /* CJK Ideograph */ + ["\u5942", "\u5942"], /* CJK Ideograph */ + ["\u5943", "\u5943"], /* CJK Ideograph */ + ["\u5944", "\u5944"], /* CJK Ideograph */ + ["\u5945", "\u5945"], /* CJK Ideograph */ + ["\u5946", "\u5946"], /* CJK Ideograph */ + ["\u5947", "\u5947"], /* CJK Ideograph */ + ["\u5948", "\u5948"], /* CJK Ideograph */ + ["\u5949", "\u5949"], /* CJK Ideograph */ + ["\u594A", "\u594A"], /* CJK Ideograph */ + ["\u594B", "\u594B"], /* CJK Ideograph */ + ["\u594C", "\u594C"], /* CJK Ideograph */ + ["\u594D", "\u594D"], /* CJK Ideograph */ + ["\u594E", "\u594E"], /* CJK Ideograph */ + ["\u594F", "\u594F"], /* CJK Ideograph */ + ["\u5950", "\u5950"], /* CJK Ideograph */ + ["\u5951", "\u5951"], /* CJK Ideograph */ + ["\u5952", "\u5952"], /* CJK Ideograph */ + ["\u5953", "\u5953"], /* CJK Ideograph */ + ["\u5954", "\u5954"], /* CJK Ideograph */ + ["\u5955", "\u5955"], /* CJK Ideograph */ + ["\u5956", "\u5956"], /* CJK Ideograph */ + ["\u5957", "\u5957"], /* CJK Ideograph */ + ["\u5958", "\u5958"], /* CJK Ideograph */ + ["\u5959", "\u5959"], /* CJK Ideograph */ + ["\u595A", "\u595A"], /* CJK Ideograph */ + ["\u595B", "\u595B"], /* CJK Ideograph */ + ["\u595C", "\u595C"], /* CJK Ideograph */ + ["\u595D", "\u595D"], /* CJK Ideograph */ + ["\u595E", "\u595E"], /* CJK Ideograph */ + ["\u595F", "\u595F"], /* CJK Ideograph */ + ["\u5960", "\u5960"], /* CJK Ideograph */ + ["\u5961", "\u5961"], /* CJK Ideograph */ + ["\u5962", "\u5962"], /* CJK Ideograph */ + ["\u5963", "\u5963"], /* CJK Ideograph */ + ["\u5964", "\u5964"], /* CJK Ideograph */ + ["\u5965", "\u5965"], /* CJK Ideograph */ + ["\u5966", "\u5966"], /* CJK Ideograph */ + ["\u5967", "\u5967"], /* CJK Ideograph */ + ["\u5968", "\u5968"], /* CJK Ideograph */ + ["\u5969", "\u5969"], /* CJK Ideograph */ + ["\u596A", "\u596A"], /* CJK Ideograph */ + ["\u596B", "\u596B"], /* CJK Ideograph */ + ["\u596C", "\u596C"], /* CJK Ideograph */ + ["\u596D", "\u596D"], /* CJK Ideograph */ + ["\u596E", "\u596E"], /* CJK Ideograph */ + ["\u596F", "\u596F"], /* CJK Ideograph */ + ["\u5970", "\u5970"], /* CJK Ideograph */ + ["\u5971", "\u5971"], /* CJK Ideograph */ + ["\u5972", "\u5972"], /* CJK Ideograph */ + ["\u5973", "\u5973"], /* CJK Ideograph */ + ["\u5974", "\u5974"], /* CJK Ideograph */ + ["\u5975", "\u5975"], /* CJK Ideograph */ + ["\u5976", "\u5976"], /* CJK Ideograph */ + ["\u5977", "\u5977"], /* CJK Ideograph */ + ["\u5978", "\u5978"], /* CJK Ideograph */ + ["\u5979", "\u5979"], /* CJK Ideograph */ + ["\u597A", "\u597A"], /* CJK Ideograph */ + ["\u597B", "\u597B"], /* CJK Ideograph */ + ["\u597C", "\u597C"], /* CJK Ideograph */ + ["\u597D", "\u597D"], /* CJK Ideograph */ + ["\u597E", "\u597E"], /* CJK Ideograph */ + ["\u597F", "\u597F"], /* CJK Ideograph */ + ["\u5980", "\u5980"], /* CJK Ideograph */ + ["\u5981", "\u5981"], /* CJK Ideograph */ + ["\u5982", "\u5982"], /* CJK Ideograph */ + ["\u5983", "\u5983"], /* CJK Ideograph */ + ["\u5984", "\u5984"], /* CJK Ideograph */ + ["\u5985", "\u5985"], /* CJK Ideograph */ + ["\u5986", "\u5986"], /* CJK Ideograph */ + ["\u5987", "\u5987"], /* CJK Ideograph */ + ["\u5988", "\u5988"], /* CJK Ideograph */ + ["\u5989", "\u5989"], /* CJK Ideograph */ + ["\u598A", "\u598A"], /* CJK Ideograph */ + ["\u598B", "\u598B"], /* CJK Ideograph */ + ["\u598C", "\u598C"], /* CJK Ideograph */ + ["\u598D", "\u598D"], /* CJK Ideograph */ + ["\u598E", "\u598E"], /* CJK Ideograph */ + ["\u598F", "\u598F"], /* CJK Ideograph */ + ["\u5990", "\u5990"], /* CJK Ideograph */ + ["\u5991", "\u5991"], /* CJK Ideograph */ + ["\u5992", "\u5992"], /* CJK Ideograph */ + ["\u5993", "\u5993"], /* CJK Ideograph */ + ["\u5994", "\u5994"], /* CJK Ideograph */ + ["\u5995", "\u5995"], /* CJK Ideograph */ + ["\u5996", "\u5996"], /* CJK Ideograph */ + ["\u5997", "\u5997"], /* CJK Ideograph */ + ["\u5998", "\u5998"], /* CJK Ideograph */ + ["\u5999", "\u5999"], /* CJK Ideograph */ + ["\u599A", "\u599A"], /* CJK Ideograph */ + ["\u599B", "\u599B"], /* CJK Ideograph */ + ["\u599C", "\u599C"], /* CJK Ideograph */ + ["\u599D", "\u599D"], /* CJK Ideograph */ + ["\u599E", "\u599E"], /* CJK Ideograph */ + ["\u599F", "\u599F"], /* CJK Ideograph */ + ["\u59A0", "\u59A0"], /* CJK Ideograph */ + ["\u59A1", "\u59A1"], /* CJK Ideograph */ + ["\u59A2", "\u59A2"], /* CJK Ideograph */ + ["\u59A3", "\u59A3"], /* CJK Ideograph */ + ["\u59A4", "\u59A4"], /* CJK Ideograph */ + ["\u59A5", "\u59A5"], /* CJK Ideograph */ + ["\u59A6", "\u59A6"], /* CJK Ideograph */ + ["\u59A7", "\u59A7"], /* CJK Ideograph */ + ["\u59A8", "\u59A8"], /* CJK Ideograph */ + ["\u59A9", "\u59A9"], /* CJK Ideograph */ + ["\u59AA", "\u59AA"], /* CJK Ideograph */ + ["\u59AB", "\u59AB"], /* CJK Ideograph */ + ["\u59AC", "\u59AC"], /* CJK Ideograph */ + ["\u59AD", "\u59AD"], /* CJK Ideograph */ + ["\u59AE", "\u59AE"], /* CJK Ideograph */ + ["\u59AF", "\u59AF"], /* CJK Ideograph */ + ["\u59B0", "\u59B0"], /* CJK Ideograph */ + ["\u59B1", "\u59B1"], /* CJK Ideograph */ + ["\u59B2", "\u59B2"], /* CJK Ideograph */ + ["\u59B3", "\u59B3"], /* CJK Ideograph */ + ["\u59B4", "\u59B4"], /* CJK Ideograph */ + ["\u59B5", "\u59B5"], /* CJK Ideograph */ + ["\u59B6", "\u59B6"], /* CJK Ideograph */ + ["\u59B7", "\u59B7"], /* CJK Ideograph */ + ["\u59B8", "\u59B8"], /* CJK Ideograph */ + ["\u59B9", "\u59B9"], /* CJK Ideograph */ + ["\u59BA", "\u59BA"], /* CJK Ideograph */ + ["\u59BB", "\u59BB"], /* CJK Ideograph */ + ["\u59BC", "\u59BC"], /* CJK Ideograph */ + ["\u59BD", "\u59BD"], /* CJK Ideograph */ + ["\u59BE", "\u59BE"], /* CJK Ideograph */ + ["\u59BF", "\u59BF"], /* CJK Ideograph */ + ["\u59C0", "\u59C0"], /* CJK Ideograph */ + ["\u59C1", "\u59C1"], /* CJK Ideograph */ + ["\u59C2", "\u59C2"], /* CJK Ideograph */ + ["\u59C3", "\u59C3"], /* CJK Ideograph */ + ["\u59C4", "\u59C4"], /* CJK Ideograph */ + ["\u59C5", "\u59C5"], /* CJK Ideograph */ + ["\u59C6", "\u59C6"], /* CJK Ideograph */ + ["\u59C7", "\u59C7"], /* CJK Ideograph */ + ["\u59C8", "\u59C8"], /* CJK Ideograph */ + ["\u59C9", "\u59C9"], /* CJK Ideograph */ + ["\u59CA", "\u59CA"], /* CJK Ideograph */ + ["\u59CB", "\u59CB"], /* CJK Ideograph */ + ["\u59CC", "\u59CC"], /* CJK Ideograph */ + ["\u59CD", "\u59CD"], /* CJK Ideograph */ + ["\u59CE", "\u59CE"], /* CJK Ideograph */ + ["\u59CF", "\u59CF"], /* CJK Ideograph */ + ["\u59D0", "\u59D0"], /* CJK Ideograph */ + ["\u59D1", "\u59D1"], /* CJK Ideograph */ + ["\u59D2", "\u59D2"], /* CJK Ideograph */ + ["\u59D3", "\u59D3"], /* CJK Ideograph */ + ["\u59D4", "\u59D4"], /* CJK Ideograph */ + ["\u59D5", "\u59D5"], /* CJK Ideograph */ + ["\u59D6", "\u59D6"], /* CJK Ideograph */ + ["\u59D7", "\u59D7"], /* CJK Ideograph */ + ["\u59D8", "\u59D8"], /* CJK Ideograph */ + ["\u59D9", "\u59D9"], /* CJK Ideograph */ + ["\u59DA", "\u59DA"], /* CJK Ideograph */ + ["\u59DB", "\u59DB"], /* CJK Ideograph */ + ["\u59DC", "\u59DC"], /* CJK Ideograph */ + ["\u59DD", "\u59DD"], /* CJK Ideograph */ + ["\u59DE", "\u59DE"], /* CJK Ideograph */ + ["\u59DF", "\u59DF"], /* CJK Ideograph */ + ["\u59E0", "\u59E0"], /* CJK Ideograph */ + ["\u59E1", "\u59E1"], /* CJK Ideograph */ + ["\u59E2", "\u59E2"], /* CJK Ideograph */ + ["\u59E3", "\u59E3"], /* CJK Ideograph */ + ["\u59E4", "\u59E4"], /* CJK Ideograph */ + ["\u59E5", "\u59E5"], /* CJK Ideograph */ + ["\u59E6", "\u59E6"], /* CJK Ideograph */ + ["\u59E7", "\u59E7"], /* CJK Ideograph */ + ["\u59E8", "\u59E8"], /* CJK Ideograph */ + ["\u59E9", "\u59E9"], /* CJK Ideograph */ + ["\u59EA", "\u59EA"], /* CJK Ideograph */ + ["\u59EB", "\u59EB"], /* CJK Ideograph */ + ["\u59EC", "\u59EC"], /* CJK Ideograph */ + ["\u59ED", "\u59ED"], /* CJK Ideograph */ + ["\u59EE", "\u59EE"], /* CJK Ideograph */ + ["\u59EF", "\u59EF"], /* CJK Ideograph */ + ["\u59F0", "\u59F0"], /* CJK Ideograph */ + ["\u59F1", "\u59F1"], /* CJK Ideograph */ + ["\u59F2", "\u59F2"], /* CJK Ideograph */ + ["\u59F3", "\u59F3"], /* CJK Ideograph */ + ["\u59F4", "\u59F4"], /* CJK Ideograph */ + ["\u59F5", "\u59F5"], /* CJK Ideograph */ + ["\u59F6", "\u59F6"], /* CJK Ideograph */ + ["\u59F7", "\u59F7"], /* CJK Ideograph */ + ["\u59F8", "\u59F8"], /* CJK Ideograph */ + ["\u59F9", "\u59F9"], /* CJK Ideograph */ + ["\u59FA", "\u59FA"], /* CJK Ideograph */ + ["\u59FB", "\u59FB"], /* CJK Ideograph */ + ["\u59FC", "\u59FC"], /* CJK Ideograph */ + ["\u59FD", "\u59FD"], /* CJK Ideograph */ + ["\u59FE", "\u59FE"], /* CJK Ideograph */ + ["\u59FF", "\u59FF"], /* CJK Ideograph */ + ["\u5A00", "\u5A00"], /* CJK Ideograph */ + ["\u5A01", "\u5A01"], /* CJK Ideograph */ + ["\u5A02", "\u5A02"], /* CJK Ideograph */ + ["\u5A03", "\u5A03"], /* CJK Ideograph */ + ["\u5A04", "\u5A04"], /* CJK Ideograph */ + ["\u5A05", "\u5A05"], /* CJK Ideograph */ + ["\u5A06", "\u5A06"], /* CJK Ideograph */ + ["\u5A07", "\u5A07"], /* CJK Ideograph */ + ["\u5A08", "\u5A08"], /* CJK Ideograph */ + ["\u5A09", "\u5A09"], /* CJK Ideograph */ + ["\u5A0A", "\u5A0A"], /* CJK Ideograph */ + ["\u5A0B", "\u5A0B"], /* CJK Ideograph */ + ["\u5A0C", "\u5A0C"], /* CJK Ideograph */ + ["\u5A0D", "\u5A0D"], /* CJK Ideograph */ + ["\u5A0E", "\u5A0E"], /* CJK Ideograph */ + ["\u5A0F", "\u5A0F"], /* CJK Ideograph */ + ["\u5A10", "\u5A10"], /* CJK Ideograph */ + ["\u5A11", "\u5A11"], /* CJK Ideograph */ + ["\u5A12", "\u5A12"], /* CJK Ideograph */ + ["\u5A13", "\u5A13"], /* CJK Ideograph */ + ["\u5A14", "\u5A14"], /* CJK Ideograph */ + ["\u5A15", "\u5A15"], /* CJK Ideograph */ + ["\u5A16", "\u5A16"], /* CJK Ideograph */ + ["\u5A17", "\u5A17"], /* CJK Ideograph */ + ["\u5A18", "\u5A18"], /* CJK Ideograph */ + ["\u5A19", "\u5A19"], /* CJK Ideograph */ + ["\u5A1A", "\u5A1A"], /* CJK Ideograph */ + ["\u5A1B", "\u5A1B"], /* CJK Ideograph */ + ["\u5A1C", "\u5A1C"], /* CJK Ideograph */ + ["\u5A1D", "\u5A1D"], /* CJK Ideograph */ + ["\u5A1E", "\u5A1E"], /* CJK Ideograph */ + ["\u5A1F", "\u5A1F"], /* CJK Ideograph */ + ["\u5A20", "\u5A20"], /* CJK Ideograph */ + ["\u5A21", "\u5A21"], /* CJK Ideograph */ + ["\u5A22", "\u5A22"], /* CJK Ideograph */ + ["\u5A23", "\u5A23"], /* CJK Ideograph */ + ["\u5A24", "\u5A24"], /* CJK Ideograph */ + ["\u5A25", "\u5A25"], /* CJK Ideograph */ + ["\u5A26", "\u5A26"], /* CJK Ideograph */ + ["\u5A27", "\u5A27"], /* CJK Ideograph */ + ["\u5A28", "\u5A28"], /* CJK Ideograph */ + ["\u5A29", "\u5A29"], /* CJK Ideograph */ + ["\u5A2A", "\u5A2A"], /* CJK Ideograph */ + ["\u5A2B", "\u5A2B"], /* CJK Ideograph */ + ["\u5A2C", "\u5A2C"], /* CJK Ideograph */ + ["\u5A2D", "\u5A2D"], /* CJK Ideograph */ + ["\u5A2E", "\u5A2E"], /* CJK Ideograph */ + ["\u5A2F", "\u5A2F"], /* CJK Ideograph */ + ["\u5A30", "\u5A30"], /* CJK Ideograph */ + ["\u5A31", "\u5A31"], /* CJK Ideograph */ + ["\u5A32", "\u5A32"], /* CJK Ideograph */ + ["\u5A33", "\u5A33"], /* CJK Ideograph */ + ["\u5A34", "\u5A34"], /* CJK Ideograph */ + ["\u5A35", "\u5A35"], /* CJK Ideograph */ + ["\u5A36", "\u5A36"], /* CJK Ideograph */ + ["\u5A37", "\u5A37"], /* CJK Ideograph */ + ["\u5A38", "\u5A38"], /* CJK Ideograph */ + ["\u5A39", "\u5A39"], /* CJK Ideograph */ + ["\u5A3A", "\u5A3A"], /* CJK Ideograph */ + ["\u5A3B", "\u5A3B"], /* CJK Ideograph */ + ["\u5A3C", "\u5A3C"], /* CJK Ideograph */ + ["\u5A3D", "\u5A3D"], /* CJK Ideograph */ + ["\u5A3E", "\u5A3E"], /* CJK Ideograph */ + ["\u5A3F", "\u5A3F"], /* CJK Ideograph */ + ["\u5A40", "\u5A40"], /* CJK Ideograph */ + ["\u5A41", "\u5A41"], /* CJK Ideograph */ + ["\u5A42", "\u5A42"], /* CJK Ideograph */ + ["\u5A43", "\u5A43"], /* CJK Ideograph */ + ["\u5A44", "\u5A44"], /* CJK Ideograph */ + ["\u5A45", "\u5A45"], /* CJK Ideograph */ + ["\u5A46", "\u5A46"], /* CJK Ideograph */ + ["\u5A47", "\u5A47"], /* CJK Ideograph */ + ["\u5A48", "\u5A48"], /* CJK Ideograph */ + ["\u5A49", "\u5A49"], /* CJK Ideograph */ + ["\u5A4A", "\u5A4A"], /* CJK Ideograph */ + ["\u5A4B", "\u5A4B"], /* CJK Ideograph */ + ["\u5A4C", "\u5A4C"], /* CJK Ideograph */ + ["\u5A4D", "\u5A4D"], /* CJK Ideograph */ + ["\u5A4E", "\u5A4E"], /* CJK Ideograph */ + ["\u5A4F", "\u5A4F"], /* CJK Ideograph */ + ["\u5A50", "\u5A50"], /* CJK Ideograph */ + ["\u5A51", "\u5A51"], /* CJK Ideograph */ + ["\u5A52", "\u5A52"], /* CJK Ideograph */ + ["\u5A53", "\u5A53"], /* CJK Ideograph */ + ["\u5A54", "\u5A54"], /* CJK Ideograph */ + ["\u5A55", "\u5A55"], /* CJK Ideograph */ + ["\u5A56", "\u5A56"], /* CJK Ideograph */ + ["\u5A57", "\u5A57"], /* CJK Ideograph */ + ["\u5A58", "\u5A58"], /* CJK Ideograph */ + ["\u5A59", "\u5A59"], /* CJK Ideograph */ + ["\u5A5A", "\u5A5A"], /* CJK Ideograph */ + ["\u5A5B", "\u5A5B"], /* CJK Ideograph */ + ["\u5A5C", "\u5A5C"], /* CJK Ideograph */ + ["\u5A5D", "\u5A5D"], /* CJK Ideograph */ + ["\u5A5E", "\u5A5E"], /* CJK Ideograph */ + ["\u5A5F", "\u5A5F"], /* CJK Ideograph */ + ["\u5A60", "\u5A60"], /* CJK Ideograph */ + ["\u5A61", "\u5A61"], /* CJK Ideograph */ + ["\u5A62", "\u5A62"], /* CJK Ideograph */ + ["\u5A63", "\u5A63"], /* CJK Ideograph */ + ["\u5A64", "\u5A64"], /* CJK Ideograph */ + ["\u5A65", "\u5A65"], /* CJK Ideograph */ + ["\u5A66", "\u5A66"], /* CJK Ideograph */ + ["\u5A67", "\u5A67"], /* CJK Ideograph */ + ["\u5A68", "\u5A68"], /* CJK Ideograph */ + ["\u5A69", "\u5A69"], /* CJK Ideograph */ + ["\u5A6A", "\u5A6A"], /* CJK Ideograph */ + ["\u5A6B", "\u5A6B"], /* CJK Ideograph */ + ["\u5A6C", "\u5A6C"], /* CJK Ideograph */ + ["\u5A6D", "\u5A6D"], /* CJK Ideograph */ + ["\u5A6E", "\u5A6E"], /* CJK Ideograph */ + ["\u5A6F", "\u5A6F"], /* CJK Ideograph */ + ["\u5A70", "\u5A70"], /* CJK Ideograph */ + ["\u5A71", "\u5A71"], /* CJK Ideograph */ + ["\u5A72", "\u5A72"], /* CJK Ideograph */ + ["\u5A73", "\u5A73"], /* CJK Ideograph */ + ["\u5A74", "\u5A74"], /* CJK Ideograph */ + ["\u5A75", "\u5A75"], /* CJK Ideograph */ + ["\u5A76", "\u5A76"], /* CJK Ideograph */ + ["\u5A77", "\u5A77"], /* CJK Ideograph */ + ["\u5A78", "\u5A78"], /* CJK Ideograph */ + ["\u5A79", "\u5A79"], /* CJK Ideograph */ + ["\u5A7A", "\u5A7A"], /* CJK Ideograph */ + ["\u5A7B", "\u5A7B"], /* CJK Ideograph */ + ["\u5A7C", "\u5A7C"], /* CJK Ideograph */ + ["\u5A7D", "\u5A7D"], /* CJK Ideograph */ + ["\u5A7E", "\u5A7E"], /* CJK Ideograph */ + ["\u5A7F", "\u5A7F"], /* CJK Ideograph */ + ["\u5A80", "\u5A80"], /* CJK Ideograph */ + ["\u5A81", "\u5A81"], /* CJK Ideograph */ + ["\u5A82", "\u5A82"], /* CJK Ideograph */ + ["\u5A83", "\u5A83"], /* CJK Ideograph */ + ["\u5A84", "\u5A84"], /* CJK Ideograph */ + ["\u5A85", "\u5A85"], /* CJK Ideograph */ + ["\u5A86", "\u5A86"], /* CJK Ideograph */ + ["\u5A87", "\u5A87"], /* CJK Ideograph */ + ["\u5A88", "\u5A88"], /* CJK Ideograph */ + ["\u5A89", "\u5A89"], /* CJK Ideograph */ + ["\u5A8A", "\u5A8A"], /* CJK Ideograph */ + ["\u5A8B", "\u5A8B"], /* CJK Ideograph */ + ["\u5A8C", "\u5A8C"], /* CJK Ideograph */ + ["\u5A8D", "\u5A8D"], /* CJK Ideograph */ + ["\u5A8E", "\u5A8E"], /* CJK Ideograph */ + ["\u5A8F", "\u5A8F"], /* CJK Ideograph */ + ["\u5A90", "\u5A90"], /* CJK Ideograph */ + ["\u5A91", "\u5A91"], /* CJK Ideograph */ + ["\u5A92", "\u5A92"], /* CJK Ideograph */ + ["\u5A93", "\u5A93"], /* CJK Ideograph */ + ["\u5A94", "\u5A94"], /* CJK Ideograph */ + ["\u5A95", "\u5A95"], /* CJK Ideograph */ + ["\u5A96", "\u5A96"], /* CJK Ideograph */ + ["\u5A97", "\u5A97"], /* CJK Ideograph */ + ["\u5A98", "\u5A98"], /* CJK Ideograph */ + ["\u5A99", "\u5A99"], /* CJK Ideograph */ + ["\u5A9A", "\u5A9A"], /* CJK Ideograph */ + ["\u5A9B", "\u5A9B"], /* CJK Ideograph */ + ["\u5A9C", "\u5A9C"], /* CJK Ideograph */ + ["\u5A9D", "\u5A9D"], /* CJK Ideograph */ + ["\u5A9E", "\u5A9E"], /* CJK Ideograph */ + ["\u5A9F", "\u5A9F"], /* CJK Ideograph */ + ["\u5AA0", "\u5AA0"], /* CJK Ideograph */ + ["\u5AA1", "\u5AA1"], /* CJK Ideograph */ + ["\u5AA2", "\u5AA2"], /* CJK Ideograph */ + ["\u5AA3", "\u5AA3"], /* CJK Ideograph */ + ["\u5AA4", "\u5AA4"], /* CJK Ideograph */ + ["\u5AA5", "\u5AA5"], /* CJK Ideograph */ + ["\u5AA6", "\u5AA6"], /* CJK Ideograph */ + ["\u5AA7", "\u5AA7"], /* CJK Ideograph */ + ["\u5AA8", "\u5AA8"], /* CJK Ideograph */ + ["\u5AA9", "\u5AA9"], /* CJK Ideograph */ + ["\u5AAA", "\u5AAA"], /* CJK Ideograph */ + ["\u5AAB", "\u5AAB"], /* CJK Ideograph */ + ["\u5AAC", "\u5AAC"], /* CJK Ideograph */ + ["\u5AAD", "\u5AAD"], /* CJK Ideograph */ + ["\u5AAE", "\u5AAE"], /* CJK Ideograph */ + ["\u5AAF", "\u5AAF"], /* CJK Ideograph */ + ["\u5AB0", "\u5AB0"], /* CJK Ideograph */ + ["\u5AB1", "\u5AB1"], /* CJK Ideograph */ + ["\u5AB2", "\u5AB2"], /* CJK Ideograph */ + ["\u5AB3", "\u5AB3"], /* CJK Ideograph */ + ["\u5AB4", "\u5AB4"], /* CJK Ideograph */ + ["\u5AB5", "\u5AB5"], /* CJK Ideograph */ + ["\u5AB6", "\u5AB6"], /* CJK Ideograph */ + ["\u5AB7", "\u5AB7"], /* CJK Ideograph */ + ["\u5AB8", "\u5AB8"], /* CJK Ideograph */ + ["\u5AB9", "\u5AB9"], /* CJK Ideograph */ + ["\u5ABA", "\u5ABA"], /* CJK Ideograph */ + ["\u5ABB", "\u5ABB"], /* CJK Ideograph */ + ["\u5ABC", "\u5ABC"], /* CJK Ideograph */ + ["\u5ABD", "\u5ABD"], /* CJK Ideograph */ + ["\u5ABE", "\u5ABE"], /* CJK Ideograph */ + ["\u5ABF", "\u5ABF"], /* CJK Ideograph */ + ["\u5AC0", "\u5AC0"], /* CJK Ideograph */ + ["\u5AC1", "\u5AC1"], /* CJK Ideograph */ + ["\u5AC2", "\u5AC2"], /* CJK Ideograph */ + ["\u5AC3", "\u5AC3"], /* CJK Ideograph */ + ["\u5AC4", "\u5AC4"], /* CJK Ideograph */ + ["\u5AC5", "\u5AC5"], /* CJK Ideograph */ + ["\u5AC6", "\u5AC6"], /* CJK Ideograph */ + ["\u5AC7", "\u5AC7"], /* CJK Ideograph */ + ["\u5AC8", "\u5AC8"], /* CJK Ideograph */ + ["\u5AC9", "\u5AC9"], /* CJK Ideograph */ + ["\u5ACA", "\u5ACA"], /* CJK Ideograph */ + ["\u5ACB", "\u5ACB"], /* CJK Ideograph */ + ["\u5ACC", "\u5ACC"], /* CJK Ideograph */ + ["\u5ACD", "\u5ACD"], /* CJK Ideograph */ + ["\u5ACE", "\u5ACE"], /* CJK Ideograph */ + ["\u5ACF", "\u5ACF"], /* CJK Ideograph */ + ["\u5AD0", "\u5AD0"], /* CJK Ideograph */ + ["\u5AD1", "\u5AD1"], /* CJK Ideograph */ + ["\u5AD2", "\u5AD2"], /* CJK Ideograph */ + ["\u5AD3", "\u5AD3"], /* CJK Ideograph */ + ["\u5AD4", "\u5AD4"], /* CJK Ideograph */ + ["\u5AD5", "\u5AD5"], /* CJK Ideograph */ + ["\u5AD6", "\u5AD6"], /* CJK Ideograph */ + ["\u5AD7", "\u5AD7"], /* CJK Ideograph */ + ["\u5AD8", "\u5AD8"], /* CJK Ideograph */ + ["\u5AD9", "\u5AD9"], /* CJK Ideograph */ + ["\u5ADA", "\u5ADA"], /* CJK Ideograph */ + ["\u5ADB", "\u5ADB"], /* CJK Ideograph */ + ["\u5ADC", "\u5ADC"], /* CJK Ideograph */ + ["\u5ADD", "\u5ADD"], /* CJK Ideograph */ + ["\u5ADE", "\u5ADE"], /* CJK Ideograph */ + ["\u5ADF", "\u5ADF"], /* CJK Ideograph */ + ["\u5AE0", "\u5AE0"], /* CJK Ideograph */ + ["\u5AE1", "\u5AE1"], /* CJK Ideograph */ + ["\u5AE2", "\u5AE2"], /* CJK Ideograph */ + ["\u5AE3", "\u5AE3"], /* CJK Ideograph */ + ["\u5AE4", "\u5AE4"], /* CJK Ideograph */ + ["\u5AE5", "\u5AE5"], /* CJK Ideograph */ + ["\u5AE6", "\u5AE6"], /* CJK Ideograph */ + ["\u5AE7", "\u5AE7"], /* CJK Ideograph */ + ["\u5AE8", "\u5AE8"], /* CJK Ideograph */ + ["\u5AE9", "\u5AE9"], /* CJK Ideograph */ + ["\u5AEA", "\u5AEA"], /* CJK Ideograph */ + ["\u5AEB", "\u5AEB"], /* CJK Ideograph */ + ["\u5AEC", "\u5AEC"], /* CJK Ideograph */ + ["\u5AED", "\u5AED"], /* CJK Ideograph */ + ["\u5AEE", "\u5AEE"], /* CJK Ideograph */ + ["\u5AEF", "\u5AEF"], /* CJK Ideograph */ + ["\u5AF0", "\u5AF0"], /* CJK Ideograph */ + ["\u5AF1", "\u5AF1"], /* CJK Ideograph */ + ["\u5AF2", "\u5AF2"], /* CJK Ideograph */ + ["\u5AF3", "\u5AF3"], /* CJK Ideograph */ + ["\u5AF4", "\u5AF4"], /* CJK Ideograph */ + ["\u5AF5", "\u5AF5"], /* CJK Ideograph */ + ["\u5AF6", "\u5AF6"], /* CJK Ideograph */ + ["\u5AF7", "\u5AF7"], /* CJK Ideograph */ + ["\u5AF8", "\u5AF8"], /* CJK Ideograph */ + ["\u5AF9", "\u5AF9"], /* CJK Ideograph */ + ["\u5AFA", "\u5AFA"], /* CJK Ideograph */ + ["\u5AFB", "\u5AFB"], /* CJK Ideograph */ + ["\u5AFC", "\u5AFC"], /* CJK Ideograph */ + ["\u5AFD", "\u5AFD"], /* CJK Ideograph */ + ["\u5AFE", "\u5AFE"], /* CJK Ideograph */ + ["\u5AFF", "\u5AFF"], /* CJK Ideograph */ + ["\u5B00", "\u5B00"], /* CJK Ideograph */ + ["\u5B01", "\u5B01"], /* CJK Ideograph */ + ["\u5B02", "\u5B02"], /* CJK Ideograph */ + ["\u5B03", "\u5B03"], /* CJK Ideograph */ + ["\u5B04", "\u5B04"], /* CJK Ideograph */ + ["\u5B05", "\u5B05"], /* CJK Ideograph */ + ["\u5B06", "\u5B06"], /* CJK Ideograph */ + ["\u5B07", "\u5B07"], /* CJK Ideograph */ + ["\u5B08", "\u5B08"], /* CJK Ideograph */ + ["\u5B09", "\u5B09"], /* CJK Ideograph */ + ["\u5B0A", "\u5B0A"], /* CJK Ideograph */ + ["\u5B0B", "\u5B0B"], /* CJK Ideograph */ + ["\u5B0C", "\u5B0C"], /* CJK Ideograph */ + ["\u5B0D", "\u5B0D"], /* CJK Ideograph */ + ["\u5B0E", "\u5B0E"], /* CJK Ideograph */ + ["\u5B0F", "\u5B0F"], /* CJK Ideograph */ + ["\u5B10", "\u5B10"], /* CJK Ideograph */ + ["\u5B11", "\u5B11"], /* CJK Ideograph */ + ["\u5B12", "\u5B12"], /* CJK Ideograph */ + ["\u5B13", "\u5B13"], /* CJK Ideograph */ + ["\u5B14", "\u5B14"], /* CJK Ideograph */ + ["\u5B15", "\u5B15"], /* CJK Ideograph */ + ["\u5B16", "\u5B16"], /* CJK Ideograph */ + ["\u5B17", "\u5B17"], /* CJK Ideograph */ + ["\u5B18", "\u5B18"], /* CJK Ideograph */ + ["\u5B19", "\u5B19"], /* CJK Ideograph */ + ["\u5B1A", "\u5B1A"], /* CJK Ideograph */ + ["\u5B1B", "\u5B1B"], /* CJK Ideograph */ + ["\u5B1C", "\u5B1C"], /* CJK Ideograph */ + ["\u5B1D", "\u5B1D"], /* CJK Ideograph */ + ["\u5B1E", "\u5B1E"], /* CJK Ideograph */ + ["\u5B1F", "\u5B1F"], /* CJK Ideograph */ + ["\u5B20", "\u5B20"], /* CJK Ideograph */ + ["\u5B21", "\u5B21"], /* CJK Ideograph */ + ["\u5B22", "\u5B22"], /* CJK Ideograph */ + ["\u5B23", "\u5B23"], /* CJK Ideograph */ + ["\u5B24", "\u5B24"], /* CJK Ideograph */ + ["\u5B25", "\u5B25"], /* CJK Ideograph */ + ["\u5B26", "\u5B26"], /* CJK Ideograph */ + ["\u5B27", "\u5B27"], /* CJK Ideograph */ + ["\u5B28", "\u5B28"], /* CJK Ideograph */ + ["\u5B29", "\u5B29"], /* CJK Ideograph */ + ["\u5B2A", "\u5B2A"], /* CJK Ideograph */ + ["\u5B2B", "\u5B2B"], /* CJK Ideograph */ + ["\u5B2C", "\u5B2C"], /* CJK Ideograph */ + ["\u5B2D", "\u5B2D"], /* CJK Ideograph */ + ["\u5B2E", "\u5B2E"], /* CJK Ideograph */ + ["\u5B2F", "\u5B2F"], /* CJK Ideograph */ + ["\u5B30", "\u5B30"], /* CJK Ideograph */ + ["\u5B31", "\u5B31"], /* CJK Ideograph */ + ["\u5B32", "\u5B32"], /* CJK Ideograph */ + ["\u5B33", "\u5B33"], /* CJK Ideograph */ + ["\u5B34", "\u5B34"], /* CJK Ideograph */ + ["\u5B35", "\u5B35"], /* CJK Ideograph */ + ["\u5B36", "\u5B36"], /* CJK Ideograph */ + ["\u5B37", "\u5B37"], /* CJK Ideograph */ + ["\u5B38", "\u5B38"], /* CJK Ideograph */ + ["\u5B39", "\u5B39"], /* CJK Ideograph */ + ["\u5B3A", "\u5B3A"], /* CJK Ideograph */ + ["\u5B3B", "\u5B3B"], /* CJK Ideograph */ + ["\u5B3C", "\u5B3C"], /* CJK Ideograph */ + ["\u5B3D", "\u5B3D"], /* CJK Ideograph */ + ["\u5B3E", "\u5B3E"], /* CJK Ideograph */ + ["\u5B3F", "\u5B3F"], /* CJK Ideograph */ + ["\u5B40", "\u5B40"], /* CJK Ideograph */ + ["\u5B41", "\u5B41"], /* CJK Ideograph */ + ["\u5B42", "\u5B42"], /* CJK Ideograph */ + ["\u5B43", "\u5B43"], /* CJK Ideograph */ + ["\u5B44", "\u5B44"], /* CJK Ideograph */ + ["\u5B45", "\u5B45"], /* CJK Ideograph */ + ["\u5B46", "\u5B46"], /* CJK Ideograph */ + ["\u5B47", "\u5B47"], /* CJK Ideograph */ + ["\u5B48", "\u5B48"], /* CJK Ideograph */ + ["\u5B49", "\u5B49"], /* CJK Ideograph */ + ["\u5B4A", "\u5B4A"], /* CJK Ideograph */ + ["\u5B4B", "\u5B4B"], /* CJK Ideograph */ + ["\u5B4C", "\u5B4C"], /* CJK Ideograph */ + ["\u5B4D", "\u5B4D"], /* CJK Ideograph */ + ["\u5B4E", "\u5B4E"], /* CJK Ideograph */ + ["\u5B4F", "\u5B4F"], /* CJK Ideograph */ + ["\u5B50", "\u5B50"], /* CJK Ideograph */ + ["\u5B51", "\u5B51"], /* CJK Ideograph */ + ["\u5B52", "\u5B52"], /* CJK Ideograph */ + ["\u5B53", "\u5B53"], /* CJK Ideograph */ + ["\u5B54", "\u5B54"], /* CJK Ideograph */ + ["\u5B55", "\u5B55"], /* CJK Ideograph */ + ["\u5B56", "\u5B56"], /* CJK Ideograph */ + ["\u5B57", "\u5B57"], /* CJK Ideograph */ + ["\u5B58", "\u5B58"], /* CJK Ideograph */ + ["\u5B59", "\u5B59"], /* CJK Ideograph */ + ["\u5B5A", "\u5B5A"], /* CJK Ideograph */ + ["\u5B5B", "\u5B5B"], /* CJK Ideograph */ + ["\u5B5C", "\u5B5C"], /* CJK Ideograph */ + ["\u5B5D", "\u5B5D"], /* CJK Ideograph */ + ["\u5B5E", "\u5B5E"], /* CJK Ideograph */ + ["\u5B5F", "\u5B5F"], /* CJK Ideograph */ + ["\u5B60", "\u5B60"], /* CJK Ideograph */ + ["\u5B61", "\u5B61"], /* CJK Ideograph */ + ["\u5B62", "\u5B62"], /* CJK Ideograph */ + ["\u5B63", "\u5B63"], /* CJK Ideograph */ + ["\u5B64", "\u5B64"], /* CJK Ideograph */ + ["\u5B65", "\u5B65"], /* CJK Ideograph */ + ["\u5B66", "\u5B66"], /* CJK Ideograph */ + ["\u5B67", "\u5B67"], /* CJK Ideograph */ + ["\u5B68", "\u5B68"], /* CJK Ideograph */ + ["\u5B69", "\u5B69"], /* CJK Ideograph */ + ["\u5B6A", "\u5B6A"], /* CJK Ideograph */ + ["\u5B6B", "\u5B6B"], /* CJK Ideograph */ + ["\u5B6C", "\u5B6C"], /* CJK Ideograph */ + ["\u5B6D", "\u5B6D"], /* CJK Ideograph */ + ["\u5B6E", "\u5B6E"], /* CJK Ideograph */ + ["\u5B6F", "\u5B6F"], /* CJK Ideograph */ + ["\u5B70", "\u5B70"], /* CJK Ideograph */ + ["\u5B71", "\u5B71"], /* CJK Ideograph */ + ["\u5B72", "\u5B72"], /* CJK Ideograph */ + ["\u5B73", "\u5B73"], /* CJK Ideograph */ + ["\u5B74", "\u5B74"], /* CJK Ideograph */ + ["\u5B75", "\u5B75"], /* CJK Ideograph */ + ["\u5B76", "\u5B76"], /* CJK Ideograph */ + ["\u5B77", "\u5B77"], /* CJK Ideograph */ + ["\u5B78", "\u5B78"], /* CJK Ideograph */ + ["\u5B79", "\u5B79"], /* CJK Ideograph */ + ["\u5B7A", "\u5B7A"], /* CJK Ideograph */ + ["\u5B7B", "\u5B7B"], /* CJK Ideograph */ + ["\u5B7C", "\u5B7C"], /* CJK Ideograph */ + ["\u5B7D", "\u5B7D"], /* CJK Ideograph */ + ["\u5B7E", "\u5B7E"], /* CJK Ideograph */ + ["\u5B7F", "\u5B7F"], /* CJK Ideograph */ + ["\u5B80", "\u5B80"], /* CJK Ideograph */ + ["\u5B81", "\u5B81"], /* CJK Ideograph */ + ["\u5B82", "\u5B82"], /* CJK Ideograph */ + ["\u5B83", "\u5B83"], /* CJK Ideograph */ + ["\u5B84", "\u5B84"], /* CJK Ideograph */ + ["\u5B85", "\u5B85"], /* CJK Ideograph */ + ["\u5B86", "\u5B86"], /* CJK Ideograph */ + ["\u5B87", "\u5B87"], /* CJK Ideograph */ + ["\u5B88", "\u5B88"], /* CJK Ideograph */ + ["\u5B89", "\u5B89"], /* CJK Ideograph */ + ["\u5B8A", "\u5B8A"], /* CJK Ideograph */ + ["\u5B8B", "\u5B8B"], /* CJK Ideograph */ + ["\u5B8C", "\u5B8C"], /* CJK Ideograph */ + ["\u5B8D", "\u5B8D"], /* CJK Ideograph */ + ["\u5B8E", "\u5B8E"], /* CJK Ideograph */ + ["\u5B8F", "\u5B8F"], /* CJK Ideograph */ + ["\u5B90", "\u5B90"], /* CJK Ideograph */ + ["\u5B91", "\u5B91"], /* CJK Ideograph */ + ["\u5B92", "\u5B92"], /* CJK Ideograph */ + ["\u5B93", "\u5B93"], /* CJK Ideograph */ + ["\u5B94", "\u5B94"], /* CJK Ideograph */ + ["\u5B95", "\u5B95"], /* CJK Ideograph */ + ["\u5B96", "\u5B96"], /* CJK Ideograph */ + ["\u5B97", "\u5B97"], /* CJK Ideograph */ + ["\u5B98", "\u5B98"], /* CJK Ideograph */ + ["\u5B99", "\u5B99"], /* CJK Ideograph */ + ["\u5B9A", "\u5B9A"], /* CJK Ideograph */ + ["\u5B9B", "\u5B9B"], /* CJK Ideograph */ + ["\u5B9C", "\u5B9C"], /* CJK Ideograph */ + ["\u5B9D", "\u5B9D"], /* CJK Ideograph */ + ["\u5B9E", "\u5B9E"], /* CJK Ideograph */ + ["\u5B9F", "\u5B9F"], /* CJK Ideograph */ + ["\u5BA0", "\u5BA0"], /* CJK Ideograph */ + ["\u5BA1", "\u5BA1"], /* CJK Ideograph */ + ["\u5BA2", "\u5BA2"], /* CJK Ideograph */ + ["\u5BA3", "\u5BA3"], /* CJK Ideograph */ + ["\u5BA4", "\u5BA4"], /* CJK Ideograph */ + ["\u5BA5", "\u5BA5"], /* CJK Ideograph */ + ["\u5BA6", "\u5BA6"], /* CJK Ideograph */ + ["\u5BA7", "\u5BA7"], /* CJK Ideograph */ + ["\u5BA8", "\u5BA8"], /* CJK Ideograph */ + ["\u5BA9", "\u5BA9"], /* CJK Ideograph */ + ["\u5BAA", "\u5BAA"], /* CJK Ideograph */ + ["\u5BAB", "\u5BAB"], /* CJK Ideograph */ + ["\u5BAC", "\u5BAC"], /* CJK Ideograph */ + ["\u5BAD", "\u5BAD"], /* CJK Ideograph */ + ["\u5BAE", "\u5BAE"], /* CJK Ideograph */ + ["\u5BAF", "\u5BAF"], /* CJK Ideograph */ + ["\u5BB0", "\u5BB0"], /* CJK Ideograph */ + ["\u5BB1", "\u5BB1"], /* CJK Ideograph */ + ["\u5BB2", "\u5BB2"], /* CJK Ideograph */ + ["\u5BB3", "\u5BB3"], /* CJK Ideograph */ + ["\u5BB4", "\u5BB4"], /* CJK Ideograph */ + ["\u5BB5", "\u5BB5"], /* CJK Ideograph */ + ["\u5BB6", "\u5BB6"], /* CJK Ideograph */ + ["\u5BB7", "\u5BB7"], /* CJK Ideograph */ + ["\u5BB8", "\u5BB8"], /* CJK Ideograph */ + ["\u5BB9", "\u5BB9"], /* CJK Ideograph */ + ["\u5BBA", "\u5BBA"], /* CJK Ideograph */ + ["\u5BBB", "\u5BBB"], /* CJK Ideograph */ + ["\u5BBC", "\u5BBC"], /* CJK Ideograph */ + ["\u5BBD", "\u5BBD"], /* CJK Ideograph */ + ["\u5BBE", "\u5BBE"], /* CJK Ideograph */ + ["\u5BBF", "\u5BBF"], /* CJK Ideograph */ + ["\u5BC0", "\u5BC0"], /* CJK Ideograph */ + ["\u5BC1", "\u5BC1"], /* CJK Ideograph */ + ["\u5BC2", "\u5BC2"], /* CJK Ideograph */ + ["\u5BC3", "\u5BC3"], /* CJK Ideograph */ + ["\u5BC4", "\u5BC4"], /* CJK Ideograph */ + ["\u5BC5", "\u5BC5"], /* CJK Ideograph */ + ["\u5BC6", "\u5BC6"], /* CJK Ideograph */ + ["\u5BC7", "\u5BC7"], /* CJK Ideograph */ + ["\u5BC8", "\u5BC8"], /* CJK Ideograph */ + ["\u5BC9", "\u5BC9"], /* CJK Ideograph */ + ["\u5BCA", "\u5BCA"], /* CJK Ideograph */ + ["\u5BCB", "\u5BCB"], /* CJK Ideograph */ + ["\u5BCC", "\u5BCC"], /* CJK Ideograph */ + ["\u5BCD", "\u5BCD"], /* CJK Ideograph */ + ["\u5BCE", "\u5BCE"], /* CJK Ideograph */ + ["\u5BCF", "\u5BCF"], /* CJK Ideograph */ + ["\u5BD0", "\u5BD0"], /* CJK Ideograph */ + ["\u5BD1", "\u5BD1"], /* CJK Ideograph */ + ["\u5BD2", "\u5BD2"], /* CJK Ideograph */ + ["\u5BD3", "\u5BD3"], /* CJK Ideograph */ + ["\u5BD4", "\u5BD4"], /* CJK Ideograph */ + ["\u5BD5", "\u5BD5"], /* CJK Ideograph */ + ["\u5BD6", "\u5BD6"], /* CJK Ideograph */ + ["\u5BD7", "\u5BD7"], /* CJK Ideograph */ + ["\u5BD8", "\u5BD8"], /* CJK Ideograph */ + ["\u5BD9", "\u5BD9"], /* CJK Ideograph */ + ["\u5BDA", "\u5BDA"], /* CJK Ideograph */ + ["\u5BDB", "\u5BDB"], /* CJK Ideograph */ + ["\u5BDC", "\u5BDC"], /* CJK Ideograph */ + ["\u5BDD", "\u5BDD"], /* CJK Ideograph */ + ["\u5BDE", "\u5BDE"], /* CJK Ideograph */ + ["\u5BDF", "\u5BDF"], /* CJK Ideograph */ + ["\u5BE0", "\u5BE0"], /* CJK Ideograph */ + ["\u5BE1", "\u5BE1"], /* CJK Ideograph */ + ["\u5BE2", "\u5BE2"], /* CJK Ideograph */ + ["\u5BE3", "\u5BE3"], /* CJK Ideograph */ + ["\u5BE4", "\u5BE4"], /* CJK Ideograph */ + ["\u5BE5", "\u5BE5"], /* CJK Ideograph */ + ["\u5BE6", "\u5BE6"], /* CJK Ideograph */ + ["\u5BE7", "\u5BE7"], /* CJK Ideograph */ + ["\u5BE8", "\u5BE8"], /* CJK Ideograph */ + ["\u5BE9", "\u5BE9"], /* CJK Ideograph */ + ["\u5BEA", "\u5BEA"], /* CJK Ideograph */ + ["\u5BEB", "\u5BEB"], /* CJK Ideograph */ + ["\u5BEC", "\u5BEC"], /* CJK Ideograph */ + ["\u5BED", "\u5BED"], /* CJK Ideograph */ + ["\u5BEE", "\u5BEE"], /* CJK Ideograph */ + ["\u5BEF", "\u5BEF"], /* CJK Ideograph */ + ["\u5BF0", "\u5BF0"], /* CJK Ideograph */ + ["\u5BF1", "\u5BF1"], /* CJK Ideograph */ + ["\u5BF2", "\u5BF2"], /* CJK Ideograph */ + ["\u5BF3", "\u5BF3"], /* CJK Ideograph */ + ["\u5BF4", "\u5BF4"], /* CJK Ideograph */ + ["\u5BF5", "\u5BF5"], /* CJK Ideograph */ + ["\u5BF6", "\u5BF6"], /* CJK Ideograph */ + ["\u5BF7", "\u5BF7"], /* CJK Ideograph */ + ["\u5BF8", "\u5BF8"], /* CJK Ideograph */ + ["\u5BF9", "\u5BF9"], /* CJK Ideograph */ + ["\u5BFA", "\u5BFA"], /* CJK Ideograph */ + ["\u5BFB", "\u5BFB"], /* CJK Ideograph */ + ["\u5BFC", "\u5BFC"], /* CJK Ideograph */ + ["\u5BFD", "\u5BFD"], /* CJK Ideograph */ + ["\u5BFE", "\u5BFE"], /* CJK Ideograph */ + ["\u5BFF", "\u5BFF"], /* CJK Ideograph */ + ["\u5C00", "\u5C00"], /* CJK Ideograph */ + ["\u5C01", "\u5C01"], /* CJK Ideograph */ + ["\u5C02", "\u5C02"], /* CJK Ideograph */ + ["\u5C03", "\u5C03"], /* CJK Ideograph */ + ["\u5C04", "\u5C04"], /* CJK Ideograph */ + ["\u5C05", "\u5C05"], /* CJK Ideograph */ + ["\u5C06", "\u5C06"], /* CJK Ideograph */ + ["\u5C07", "\u5C07"], /* CJK Ideograph */ + ["\u5C08", "\u5C08"], /* CJK Ideograph */ + ["\u5C09", "\u5C09"], /* CJK Ideograph */ + ["\u5C0A", "\u5C0A"], /* CJK Ideograph */ + ["\u5C0B", "\u5C0B"], /* CJK Ideograph */ + ["\u5C0C", "\u5C0C"], /* CJK Ideograph */ + ["\u5C0D", "\u5C0D"], /* CJK Ideograph */ + ["\u5C0E", "\u5C0E"], /* CJK Ideograph */ + ["\u5C0F", "\u5C0F"], /* CJK Ideograph */ + ["\u5C10", "\u5C10"], /* CJK Ideograph */ + ["\u5C11", "\u5C11"], /* CJK Ideograph */ + ["\u5C12", "\u5C12"], /* CJK Ideograph */ + ["\u5C13", "\u5C13"], /* CJK Ideograph */ + ["\u5C14", "\u5C14"], /* CJK Ideograph */ + ["\u5C15", "\u5C15"], /* CJK Ideograph */ + ["\u5C16", "\u5C16"], /* CJK Ideograph */ + ["\u5C17", "\u5C17"], /* CJK Ideograph */ + ["\u5C18", "\u5C18"], /* CJK Ideograph */ + ["\u5C19", "\u5C19"], /* CJK Ideograph */ + ["\u5C1A", "\u5C1A"], /* CJK Ideograph */ + ["\u5C1B", "\u5C1B"], /* CJK Ideograph */ + ["\u5C1C", "\u5C1C"], /* CJK Ideograph */ + ["\u5C1D", "\u5C1D"], /* CJK Ideograph */ + ["\u5C1E", "\u5C1E"], /* CJK Ideograph */ + ["\u5C1F", "\u5C1F"], /* CJK Ideograph */ + ["\u5C20", "\u5C20"], /* CJK Ideograph */ + ["\u5C21", "\u5C21"], /* CJK Ideograph */ + ["\u5C22", "\u5C22"], /* CJK Ideograph */ + ["\u5C23", "\u5C23"], /* CJK Ideograph */ + ["\u5C24", "\u5C24"], /* CJK Ideograph */ + ["\u5C25", "\u5C25"], /* CJK Ideograph */ + ["\u5C26", "\u5C26"], /* CJK Ideograph */ + ["\u5C27", "\u5C27"], /* CJK Ideograph */ + ["\u5C28", "\u5C28"], /* CJK Ideograph */ + ["\u5C29", "\u5C29"], /* CJK Ideograph */ + ["\u5C2A", "\u5C2A"], /* CJK Ideograph */ + ["\u5C2B", "\u5C2B"], /* CJK Ideograph */ + ["\u5C2C", "\u5C2C"], /* CJK Ideograph */ + ["\u5C2D", "\u5C2D"], /* CJK Ideograph */ + ["\u5C2E", "\u5C2E"], /* CJK Ideograph */ + ["\u5C2F", "\u5C2F"], /* CJK Ideograph */ + ["\u5C30", "\u5C30"], /* CJK Ideograph */ + ["\u5C31", "\u5C31"], /* CJK Ideograph */ + ["\u5C32", "\u5C32"], /* CJK Ideograph */ + ["\u5C33", "\u5C33"], /* CJK Ideograph */ + ["\u5C34", "\u5C34"], /* CJK Ideograph */ + ["\u5C35", "\u5C35"], /* CJK Ideograph */ + ["\u5C36", "\u5C36"], /* CJK Ideograph */ + ["\u5C37", "\u5C37"], /* CJK Ideograph */ + ["\u5C38", "\u5C38"], /* CJK Ideograph */ + ["\u5C39", "\u5C39"], /* CJK Ideograph */ + ["\u5C3A", "\u5C3A"], /* CJK Ideograph */ + ["\u5C3B", "\u5C3B"], /* CJK Ideograph */ + ["\u5C3C", "\u5C3C"], /* CJK Ideograph */ + ["\u5C3D", "\u5C3D"], /* CJK Ideograph */ + ["\u5C3E", "\u5C3E"], /* CJK Ideograph */ + ["\u5C3F", "\u5C3F"], /* CJK Ideograph */ + ["\u5C40", "\u5C40"], /* CJK Ideograph */ + ["\u5C41", "\u5C41"], /* CJK Ideograph */ + ["\u5C42", "\u5C42"], /* CJK Ideograph */ + ["\u5C43", "\u5C43"], /* CJK Ideograph */ + ["\u5C44", "\u5C44"], /* CJK Ideograph */ + ["\u5C45", "\u5C45"], /* CJK Ideograph */ + ["\u5C46", "\u5C46"], /* CJK Ideograph */ + ["\u5C47", "\u5C47"], /* CJK Ideograph */ + ["\u5C48", "\u5C48"], /* CJK Ideograph */ + ["\u5C49", "\u5C49"], /* CJK Ideograph */ + ["\u5C4A", "\u5C4A"], /* CJK Ideograph */ + ["\u5C4B", "\u5C4B"], /* CJK Ideograph */ + ["\u5C4C", "\u5C4C"], /* CJK Ideograph */ + ["\u5C4D", "\u5C4D"], /* CJK Ideograph */ + ["\u5C4E", "\u5C4E"], /* CJK Ideograph */ + ["\u5C4F", "\u5C4F"], /* CJK Ideograph */ + ["\u5C50", "\u5C50"], /* CJK Ideograph */ + ["\u5C51", "\u5C51"], /* CJK Ideograph */ + ["\u5C52", "\u5C52"], /* CJK Ideograph */ + ["\u5C53", "\u5C53"], /* CJK Ideograph */ + ["\u5C54", "\u5C54"], /* CJK Ideograph */ + ["\u5C55", "\u5C55"], /* CJK Ideograph */ + ["\u5C56", "\u5C56"], /* CJK Ideograph */ + ["\u5C57", "\u5C57"], /* CJK Ideograph */ + ["\u5C58", "\u5C58"], /* CJK Ideograph */ + ["\u5C59", "\u5C59"], /* CJK Ideograph */ + ["\u5C5A", "\u5C5A"], /* CJK Ideograph */ + ["\u5C5B", "\u5C5B"], /* CJK Ideograph */ + ["\u5C5C", "\u5C5C"], /* CJK Ideograph */ + ["\u5C5D", "\u5C5D"], /* CJK Ideograph */ + ["\u5C5E", "\u5C5E"], /* CJK Ideograph */ + ["\u5C5F", "\u5C5F"], /* CJK Ideograph */ + ["\u5C60", "\u5C60"], /* CJK Ideograph */ + ["\u5C61", "\u5C61"], /* CJK Ideograph */ + ["\u5C62", "\u5C62"], /* CJK Ideograph */ + ["\u5C63", "\u5C63"], /* CJK Ideograph */ + ["\u5C64", "\u5C64"], /* CJK Ideograph */ + ["\u5C65", "\u5C65"], /* CJK Ideograph */ + ["\u5C66", "\u5C66"], /* CJK Ideograph */ + ["\u5C67", "\u5C67"], /* CJK Ideograph */ + ["\u5C68", "\u5C68"], /* CJK Ideograph */ + ["\u5C69", "\u5C69"], /* CJK Ideograph */ + ["\u5C6A", "\u5C6A"], /* CJK Ideograph */ + ["\u5C6B", "\u5C6B"], /* CJK Ideograph */ + ["\u5C6C", "\u5C6C"], /* CJK Ideograph */ + ["\u5C6D", "\u5C6D"], /* CJK Ideograph */ + ["\u5C6E", "\u5C6E"], /* CJK Ideograph */ + ["\u5C6F", "\u5C6F"], /* CJK Ideograph */ + ["\u5C70", "\u5C70"], /* CJK Ideograph */ + ["\u5C71", "\u5C71"], /* CJK Ideograph */ + ["\u5C72", "\u5C72"], /* CJK Ideograph */ + ["\u5C73", "\u5C73"], /* CJK Ideograph */ + ["\u5C74", "\u5C74"], /* CJK Ideograph */ + ["\u5C75", "\u5C75"], /* CJK Ideograph */ + ["\u5C76", "\u5C76"], /* CJK Ideograph */ + ["\u5C77", "\u5C77"], /* CJK Ideograph */ + ["\u5C78", "\u5C78"], /* CJK Ideograph */ + ["\u5C79", "\u5C79"], /* CJK Ideograph */ + ["\u5C7A", "\u5C7A"], /* CJK Ideograph */ + ["\u5C7B", "\u5C7B"], /* CJK Ideograph */ + ["\u5C7C", "\u5C7C"], /* CJK Ideograph */ + ["\u5C7D", "\u5C7D"], /* CJK Ideograph */ + ["\u5C7E", "\u5C7E"], /* CJK Ideograph */ + ["\u5C7F", "\u5C7F"], /* CJK Ideograph */ + ["\u5C80", "\u5C80"], /* CJK Ideograph */ + ["\u5C81", "\u5C81"], /* CJK Ideograph */ + ["\u5C82", "\u5C82"], /* CJK Ideograph */ + ["\u5C83", "\u5C83"], /* CJK Ideograph */ + ["\u5C84", "\u5C84"], /* CJK Ideograph */ + ["\u5C85", "\u5C85"], /* CJK Ideograph */ + ["\u5C86", "\u5C86"], /* CJK Ideograph */ + ["\u5C87", "\u5C87"], /* CJK Ideograph */ + ["\u5C88", "\u5C88"], /* CJK Ideograph */ + ["\u5C89", "\u5C89"], /* CJK Ideograph */ + ["\u5C8A", "\u5C8A"], /* CJK Ideograph */ + ["\u5C8B", "\u5C8B"], /* CJK Ideograph */ + ["\u5C8C", "\u5C8C"], /* CJK Ideograph */ + ["\u5C8D", "\u5C8D"], /* CJK Ideograph */ + ["\u5C8E", "\u5C8E"], /* CJK Ideograph */ + ["\u5C8F", "\u5C8F"], /* CJK Ideograph */ + ["\u5C90", "\u5C90"], /* CJK Ideograph */ + ["\u5C91", "\u5C91"], /* CJK Ideograph */ + ["\u5C92", "\u5C92"], /* CJK Ideograph */ + ["\u5C93", "\u5C93"], /* CJK Ideograph */ + ["\u5C94", "\u5C94"], /* CJK Ideograph */ + ["\u5C95", "\u5C95"], /* CJK Ideograph */ + ["\u5C96", "\u5C96"], /* CJK Ideograph */ + ["\u5C97", "\u5C97"], /* CJK Ideograph */ + ["\u5C98", "\u5C98"], /* CJK Ideograph */ + ["\u5C99", "\u5C99"], /* CJK Ideograph */ + ["\u5C9A", "\u5C9A"], /* CJK Ideograph */ + ["\u5C9B", "\u5C9B"], /* CJK Ideograph */ + ["\u5C9C", "\u5C9C"], /* CJK Ideograph */ + ["\u5C9D", "\u5C9D"], /* CJK Ideograph */ + ["\u5C9E", "\u5C9E"], /* CJK Ideograph */ + ["\u5C9F", "\u5C9F"], /* CJK Ideograph */ + ["\u5CA0", "\u5CA0"], /* CJK Ideograph */ + ["\u5CA1", "\u5CA1"], /* CJK Ideograph */ + ["\u5CA2", "\u5CA2"], /* CJK Ideograph */ + ["\u5CA3", "\u5CA3"], /* CJK Ideograph */ + ["\u5CA4", "\u5CA4"], /* CJK Ideograph */ + ["\u5CA5", "\u5CA5"], /* CJK Ideograph */ + ["\u5CA6", "\u5CA6"], /* CJK Ideograph */ + ["\u5CA7", "\u5CA7"], /* CJK Ideograph */ + ["\u5CA8", "\u5CA8"], /* CJK Ideograph */ + ["\u5CA9", "\u5CA9"], /* CJK Ideograph */ + ["\u5CAA", "\u5CAA"], /* CJK Ideograph */ + ["\u5CAB", "\u5CAB"], /* CJK Ideograph */ + ["\u5CAC", "\u5CAC"], /* CJK Ideograph */ + ["\u5CAD", "\u5CAD"], /* CJK Ideograph */ + ["\u5CAE", "\u5CAE"], /* CJK Ideograph */ + ["\u5CAF", "\u5CAF"], /* CJK Ideograph */ + ["\u5CB0", "\u5CB0"], /* CJK Ideograph */ + ["\u5CB1", "\u5CB1"], /* CJK Ideograph */ + ["\u5CB2", "\u5CB2"], /* CJK Ideograph */ + ["\u5CB3", "\u5CB3"], /* CJK Ideograph */ + ["\u5CB4", "\u5CB4"], /* CJK Ideograph */ + ["\u5CB5", "\u5CB5"], /* CJK Ideograph */ + ["\u5CB6", "\u5CB6"], /* CJK Ideograph */ + ["\u5CB7", "\u5CB7"], /* CJK Ideograph */ + ["\u5CB8", "\u5CB8"], /* CJK Ideograph */ + ["\u5CB9", "\u5CB9"], /* CJK Ideograph */ + ["\u5CBA", "\u5CBA"], /* CJK Ideograph */ + ["\u5CBB", "\u5CBB"], /* CJK Ideograph */ + ["\u5CBC", "\u5CBC"], /* CJK Ideograph */ + ["\u5CBD", "\u5CBD"], /* CJK Ideograph */ + ["\u5CBE", "\u5CBE"], /* CJK Ideograph */ + ["\u5CBF", "\u5CBF"], /* CJK Ideograph */ + ["\u5CC0", "\u5CC0"], /* CJK Ideograph */ + ["\u5CC1", "\u5CC1"], /* CJK Ideograph */ + ["\u5CC2", "\u5CC2"], /* CJK Ideograph */ + ["\u5CC3", "\u5CC3"], /* CJK Ideograph */ + ["\u5CC4", "\u5CC4"], /* CJK Ideograph */ + ["\u5CC5", "\u5CC5"], /* CJK Ideograph */ + ["\u5CC6", "\u5CC6"], /* CJK Ideograph */ + ["\u5CC7", "\u5CC7"], /* CJK Ideograph */ + ["\u5CC8", "\u5CC8"], /* CJK Ideograph */ + ["\u5CC9", "\u5CC9"], /* CJK Ideograph */ + ["\u5CCA", "\u5CCA"], /* CJK Ideograph */ + ["\u5CCB", "\u5CCB"], /* CJK Ideograph */ + ["\u5CCC", "\u5CCC"], /* CJK Ideograph */ + ["\u5CCD", "\u5CCD"], /* CJK Ideograph */ + ["\u5CCE", "\u5CCE"], /* CJK Ideograph */ + ["\u5CCF", "\u5CCF"], /* CJK Ideograph */ + ["\u5CD0", "\u5CD0"], /* CJK Ideograph */ + ["\u5CD1", "\u5CD1"], /* CJK Ideograph */ + ["\u5CD2", "\u5CD2"], /* CJK Ideograph */ + ["\u5CD3", "\u5CD3"], /* CJK Ideograph */ + ["\u5CD4", "\u5CD4"], /* CJK Ideograph */ + ["\u5CD5", "\u5CD5"], /* CJK Ideograph */ + ["\u5CD6", "\u5CD6"], /* CJK Ideograph */ + ["\u5CD7", "\u5CD7"], /* CJK Ideograph */ + ["\u5CD8", "\u5CD8"], /* CJK Ideograph */ + ["\u5CD9", "\u5CD9"], /* CJK Ideograph */ + ["\u5CDA", "\u5CDA"], /* CJK Ideograph */ + ["\u5CDB", "\u5CDB"], /* CJK Ideograph */ + ["\u5CDC", "\u5CDC"], /* CJK Ideograph */ + ["\u5CDD", "\u5CDD"], /* CJK Ideograph */ + ["\u5CDE", "\u5CDE"], /* CJK Ideograph */ + ["\u5CDF", "\u5CDF"], /* CJK Ideograph */ + ["\u5CE0", "\u5CE0"], /* CJK Ideograph */ + ["\u5CE1", "\u5CE1"], /* CJK Ideograph */ + ["\u5CE2", "\u5CE2"], /* CJK Ideograph */ + ["\u5CE3", "\u5CE3"], /* CJK Ideograph */ + ["\u5CE4", "\u5CE4"], /* CJK Ideograph */ + ["\u5CE5", "\u5CE5"], /* CJK Ideograph */ + ["\u5CE6", "\u5CE6"], /* CJK Ideograph */ + ["\u5CE7", "\u5CE7"], /* CJK Ideograph */ + ["\u5CE8", "\u5CE8"], /* CJK Ideograph */ + ["\u5CE9", "\u5CE9"], /* CJK Ideograph */ + ["\u5CEA", "\u5CEA"], /* CJK Ideograph */ + ["\u5CEB", "\u5CEB"], /* CJK Ideograph */ + ["\u5CEC", "\u5CEC"], /* CJK Ideograph */ + ["\u5CED", "\u5CED"], /* CJK Ideograph */ + ["\u5CEE", "\u5CEE"], /* CJK Ideograph */ + ["\u5CEF", "\u5CEF"], /* CJK Ideograph */ + ["\u5CF0", "\u5CF0"], /* CJK Ideograph */ + ["\u5CF1", "\u5CF1"], /* CJK Ideograph */ + ["\u5CF2", "\u5CF2"], /* CJK Ideograph */ + ["\u5CF3", "\u5CF3"], /* CJK Ideograph */ + ["\u5CF4", "\u5CF4"], /* CJK Ideograph */ + ["\u5CF5", "\u5CF5"], /* CJK Ideograph */ + ["\u5CF6", "\u5CF6"], /* CJK Ideograph */ + ["\u5CF7", "\u5CF7"], /* CJK Ideograph */ + ["\u5CF8", "\u5CF8"], /* CJK Ideograph */ + ["\u5CF9", "\u5CF9"], /* CJK Ideograph */ + ["\u5CFA", "\u5CFA"], /* CJK Ideograph */ + ["\u5CFB", "\u5CFB"], /* CJK Ideograph */ + ["\u5CFC", "\u5CFC"], /* CJK Ideograph */ + ["\u5CFD", "\u5CFD"], /* CJK Ideograph */ + ["\u5CFE", "\u5CFE"], /* CJK Ideograph */ + ["\u5CFF", "\u5CFF"], /* CJK Ideograph */ + ["\u5D00", "\u5D00"], /* CJK Ideograph */ + ["\u5D01", "\u5D01"], /* CJK Ideograph */ + ["\u5D02", "\u5D02"], /* CJK Ideograph */ + ["\u5D03", "\u5D03"], /* CJK Ideograph */ + ["\u5D04", "\u5D04"], /* CJK Ideograph */ + ["\u5D05", "\u5D05"], /* CJK Ideograph */ + ["\u5D06", "\u5D06"], /* CJK Ideograph */ + ["\u5D07", "\u5D07"], /* CJK Ideograph */ + ["\u5D08", "\u5D08"], /* CJK Ideograph */ + ["\u5D09", "\u5D09"], /* CJK Ideograph */ + ["\u5D0A", "\u5D0A"], /* CJK Ideograph */ + ["\u5D0B", "\u5D0B"], /* CJK Ideograph */ + ["\u5D0C", "\u5D0C"], /* CJK Ideograph */ + ["\u5D0D", "\u5D0D"], /* CJK Ideograph */ + ["\u5D0E", "\u5D0E"], /* CJK Ideograph */ + ["\u5D0F", "\u5D0F"], /* CJK Ideograph */ + ["\u5D10", "\u5D10"], /* CJK Ideograph */ + ["\u5D11", "\u5D11"], /* CJK Ideograph */ + ["\u5D12", "\u5D12"], /* CJK Ideograph */ + ["\u5D13", "\u5D13"], /* CJK Ideograph */ + ["\u5D14", "\u5D14"], /* CJK Ideograph */ + ["\u5D15", "\u5D15"], /* CJK Ideograph */ + ["\u5D16", "\u5D16"], /* CJK Ideograph */ + ["\u5D17", "\u5D17"], /* CJK Ideograph */ + ["\u5D18", "\u5D18"], /* CJK Ideograph */ + ["\u5D19", "\u5D19"], /* CJK Ideograph */ + ["\u5D1A", "\u5D1A"], /* CJK Ideograph */ + ["\u5D1B", "\u5D1B"], /* CJK Ideograph */ + ["\u5D1C", "\u5D1C"], /* CJK Ideograph */ + ["\u5D1D", "\u5D1D"], /* CJK Ideograph */ + ["\u5D1E", "\u5D1E"], /* CJK Ideograph */ + ["\u5D1F", "\u5D1F"], /* CJK Ideograph */ + ["\u5D20", "\u5D20"], /* CJK Ideograph */ + ["\u5D21", "\u5D21"], /* CJK Ideograph */ + ["\u5D22", "\u5D22"], /* CJK Ideograph */ + ["\u5D23", "\u5D23"], /* CJK Ideograph */ + ["\u5D24", "\u5D24"], /* CJK Ideograph */ + ["\u5D25", "\u5D25"], /* CJK Ideograph */ + ["\u5D26", "\u5D26"], /* CJK Ideograph */ + ["\u5D27", "\u5D27"], /* CJK Ideograph */ + ["\u5D28", "\u5D28"], /* CJK Ideograph */ + ["\u5D29", "\u5D29"], /* CJK Ideograph */ + ["\u5D2A", "\u5D2A"], /* CJK Ideograph */ + ["\u5D2B", "\u5D2B"], /* CJK Ideograph */ + ["\u5D2C", "\u5D2C"], /* CJK Ideograph */ + ["\u5D2D", "\u5D2D"], /* CJK Ideograph */ + ["\u5D2E", "\u5D2E"], /* CJK Ideograph */ + ["\u5D2F", "\u5D2F"], /* CJK Ideograph */ + ["\u5D30", "\u5D30"], /* CJK Ideograph */ + ["\u5D31", "\u5D31"], /* CJK Ideograph */ + ["\u5D32", "\u5D32"], /* CJK Ideograph */ + ["\u5D33", "\u5D33"], /* CJK Ideograph */ + ["\u5D34", "\u5D34"], /* CJK Ideograph */ + ["\u5D35", "\u5D35"], /* CJK Ideograph */ + ["\u5D36", "\u5D36"], /* CJK Ideograph */ + ["\u5D37", "\u5D37"], /* CJK Ideograph */ + ["\u5D38", "\u5D38"], /* CJK Ideograph */ + ["\u5D39", "\u5D39"], /* CJK Ideograph */ + ["\u5D3A", "\u5D3A"], /* CJK Ideograph */ + ["\u5D3B", "\u5D3B"], /* CJK Ideograph */ + ["\u5D3C", "\u5D3C"], /* CJK Ideograph */ + ["\u5D3D", "\u5D3D"], /* CJK Ideograph */ + ["\u5D3E", "\u5D3E"], /* CJK Ideograph */ + ["\u5D3F", "\u5D3F"], /* CJK Ideograph */ + ["\u5D40", "\u5D40"], /* CJK Ideograph */ + ["\u5D41", "\u5D41"], /* CJK Ideograph */ + ["\u5D42", "\u5D42"], /* CJK Ideograph */ + ["\u5D43", "\u5D43"], /* CJK Ideograph */ + ["\u5D44", "\u5D44"], /* CJK Ideograph */ + ["\u5D45", "\u5D45"], /* CJK Ideograph */ + ["\u5D46", "\u5D46"], /* CJK Ideograph */ + ["\u5D47", "\u5D47"], /* CJK Ideograph */ + ["\u5D48", "\u5D48"], /* CJK Ideograph */ + ["\u5D49", "\u5D49"], /* CJK Ideograph */ + ["\u5D4A", "\u5D4A"], /* CJK Ideograph */ + ["\u5D4B", "\u5D4B"], /* CJK Ideograph */ + ["\u5D4C", "\u5D4C"], /* CJK Ideograph */ + ["\u5D4D", "\u5D4D"], /* CJK Ideograph */ + ["\u5D4E", "\u5D4E"], /* CJK Ideograph */ + ["\u5D4F", "\u5D4F"], /* CJK Ideograph */ + ["\u5D50", "\u5D50"], /* CJK Ideograph */ + ["\u5D51", "\u5D51"], /* CJK Ideograph */ + ["\u5D52", "\u5D52"], /* CJK Ideograph */ + ["\u5D53", "\u5D53"], /* CJK Ideograph */ + ["\u5D54", "\u5D54"], /* CJK Ideograph */ + ["\u5D55", "\u5D55"], /* CJK Ideograph */ + ["\u5D56", "\u5D56"], /* CJK Ideograph */ + ["\u5D57", "\u5D57"], /* CJK Ideograph */ + ["\u5D58", "\u5D58"], /* CJK Ideograph */ + ["\u5D59", "\u5D59"], /* CJK Ideograph */ + ["\u5D5A", "\u5D5A"], /* CJK Ideograph */ + ["\u5D5B", "\u5D5B"], /* CJK Ideograph */ + ["\u5D5C", "\u5D5C"], /* CJK Ideograph */ + ["\u5D5D", "\u5D5D"], /* CJK Ideograph */ + ["\u5D5E", "\u5D5E"], /* CJK Ideograph */ + ["\u5D5F", "\u5D5F"], /* CJK Ideograph */ + ["\u5D60", "\u5D60"], /* CJK Ideograph */ + ["\u5D61", "\u5D61"], /* CJK Ideograph */ + ["\u5D62", "\u5D62"], /* CJK Ideograph */ + ["\u5D63", "\u5D63"], /* CJK Ideograph */ + ["\u5D64", "\u5D64"], /* CJK Ideograph */ + ["\u5D65", "\u5D65"], /* CJK Ideograph */ + ["\u5D66", "\u5D66"], /* CJK Ideograph */ + ["\u5D67", "\u5D67"], /* CJK Ideograph */ + ["\u5D68", "\u5D68"], /* CJK Ideograph */ + ["\u5D69", "\u5D69"], /* CJK Ideograph */ + ["\u5D6A", "\u5D6A"], /* CJK Ideograph */ + ["\u5D6B", "\u5D6B"], /* CJK Ideograph */ + ["\u5D6C", "\u5D6C"], /* CJK Ideograph */ + ["\u5D6D", "\u5D6D"], /* CJK Ideograph */ + ["\u5D6E", "\u5D6E"], /* CJK Ideograph */ + ["\u5D6F", "\u5D6F"], /* CJK Ideograph */ + ["\u5D70", "\u5D70"], /* CJK Ideograph */ + ["\u5D71", "\u5D71"], /* CJK Ideograph */ + ["\u5D72", "\u5D72"], /* CJK Ideograph */ + ["\u5D73", "\u5D73"], /* CJK Ideograph */ + ["\u5D74", "\u5D74"], /* CJK Ideograph */ + ["\u5D75", "\u5D75"], /* CJK Ideograph */ + ["\u5D76", "\u5D76"], /* CJK Ideograph */ + ["\u5D77", "\u5D77"], /* CJK Ideograph */ + ["\u5D78", "\u5D78"], /* CJK Ideograph */ + ["\u5D79", "\u5D79"], /* CJK Ideograph */ + ["\u5D7A", "\u5D7A"], /* CJK Ideograph */ + ["\u5D7B", "\u5D7B"], /* CJK Ideograph */ + ["\u5D7C", "\u5D7C"], /* CJK Ideograph */ + ["\u5D7D", "\u5D7D"], /* CJK Ideograph */ + ["\u5D7E", "\u5D7E"], /* CJK Ideograph */ + ["\u5D7F", "\u5D7F"], /* CJK Ideograph */ + ["\u5D80", "\u5D80"], /* CJK Ideograph */ + ["\u5D81", "\u5D81"], /* CJK Ideograph */ + ["\u5D82", "\u5D82"], /* CJK Ideograph */ + ["\u5D83", "\u5D83"], /* CJK Ideograph */ + ["\u5D84", "\u5D84"], /* CJK Ideograph */ + ["\u5D85", "\u5D85"], /* CJK Ideograph */ + ["\u5D86", "\u5D86"], /* CJK Ideograph */ + ["\u5D87", "\u5D87"], /* CJK Ideograph */ + ["\u5D88", "\u5D88"], /* CJK Ideograph */ + ["\u5D89", "\u5D89"], /* CJK Ideograph */ + ["\u5D8A", "\u5D8A"], /* CJK Ideograph */ + ["\u5D8B", "\u5D8B"], /* CJK Ideograph */ + ["\u5D8C", "\u5D8C"], /* CJK Ideograph */ + ["\u5D8D", "\u5D8D"], /* CJK Ideograph */ + ["\u5D8E", "\u5D8E"], /* CJK Ideograph */ + ["\u5D8F", "\u5D8F"], /* CJK Ideograph */ + ["\u5D90", "\u5D90"], /* CJK Ideograph */ + ["\u5D91", "\u5D91"], /* CJK Ideograph */ + ["\u5D92", "\u5D92"], /* CJK Ideograph */ + ["\u5D93", "\u5D93"], /* CJK Ideograph */ + ["\u5D94", "\u5D94"], /* CJK Ideograph */ + ["\u5D95", "\u5D95"], /* CJK Ideograph */ + ["\u5D96", "\u5D96"], /* CJK Ideograph */ + ["\u5D97", "\u5D97"], /* CJK Ideograph */ + ["\u5D98", "\u5D98"], /* CJK Ideograph */ + ["\u5D99", "\u5D99"], /* CJK Ideograph */ + ["\u5D9A", "\u5D9A"], /* CJK Ideograph */ + ["\u5D9B", "\u5D9B"], /* CJK Ideograph */ + ["\u5D9C", "\u5D9C"], /* CJK Ideograph */ + ["\u5D9D", "\u5D9D"], /* CJK Ideograph */ + ["\u5D9E", "\u5D9E"], /* CJK Ideograph */ + ["\u5D9F", "\u5D9F"], /* CJK Ideograph */ + ["\u5DA0", "\u5DA0"], /* CJK Ideograph */ + ["\u5DA1", "\u5DA1"], /* CJK Ideograph */ + ["\u5DA2", "\u5DA2"], /* CJK Ideograph */ + ["\u5DA3", "\u5DA3"], /* CJK Ideograph */ + ["\u5DA4", "\u5DA4"], /* CJK Ideograph */ + ["\u5DA5", "\u5DA5"], /* CJK Ideograph */ + ["\u5DA6", "\u5DA6"], /* CJK Ideograph */ + ["\u5DA7", "\u5DA7"], /* CJK Ideograph */ + ["\u5DA8", "\u5DA8"], /* CJK Ideograph */ + ["\u5DA9", "\u5DA9"], /* CJK Ideograph */ + ["\u5DAA", "\u5DAA"], /* CJK Ideograph */ + ["\u5DAB", "\u5DAB"], /* CJK Ideograph */ + ["\u5DAC", "\u5DAC"], /* CJK Ideograph */ + ["\u5DAD", "\u5DAD"], /* CJK Ideograph */ + ["\u5DAE", "\u5DAE"], /* CJK Ideograph */ + ["\u5DAF", "\u5DAF"], /* CJK Ideograph */ + ["\u5DB0", "\u5DB0"], /* CJK Ideograph */ + ["\u5DB1", "\u5DB1"], /* CJK Ideograph */ + ["\u5DB2", "\u5DB2"], /* CJK Ideograph */ + ["\u5DB3", "\u5DB3"], /* CJK Ideograph */ + ["\u5DB4", "\u5DB4"], /* CJK Ideograph */ + ["\u5DB5", "\u5DB5"], /* CJK Ideograph */ + ["\u5DB6", "\u5DB6"], /* CJK Ideograph */ + ["\u5DB7", "\u5DB7"], /* CJK Ideograph */ + ["\u5DB8", "\u5DB8"], /* CJK Ideograph */ + ["\u5DB9", "\u5DB9"], /* CJK Ideograph */ + ["\u5DBA", "\u5DBA"], /* CJK Ideograph */ + ["\u5DBB", "\u5DBB"], /* CJK Ideograph */ + ["\u5DBC", "\u5DBC"], /* CJK Ideograph */ + ["\u5DBD", "\u5DBD"], /* CJK Ideograph */ + ["\u5DBE", "\u5DBE"], /* CJK Ideograph */ + ["\u5DBF", "\u5DBF"], /* CJK Ideograph */ + ["\u5DC0", "\u5DC0"], /* CJK Ideograph */ + ["\u5DC1", "\u5DC1"], /* CJK Ideograph */ + ["\u5DC2", "\u5DC2"], /* CJK Ideograph */ + ["\u5DC3", "\u5DC3"], /* CJK Ideograph */ + ["\u5DC4", "\u5DC4"], /* CJK Ideograph */ + ["\u5DC5", "\u5DC5"], /* CJK Ideograph */ + ["\u5DC6", "\u5DC6"], /* CJK Ideograph */ + ["\u5DC7", "\u5DC7"], /* CJK Ideograph */ + ["\u5DC8", "\u5DC8"], /* CJK Ideograph */ + ["\u5DC9", "\u5DC9"], /* CJK Ideograph */ + ["\u5DCA", "\u5DCA"], /* CJK Ideograph */ + ["\u5DCB", "\u5DCB"], /* CJK Ideograph */ + ["\u5DCC", "\u5DCC"], /* CJK Ideograph */ + ["\u5DCD", "\u5DCD"], /* CJK Ideograph */ + ["\u5DCE", "\u5DCE"], /* CJK Ideograph */ + ["\u5DCF", "\u5DCF"], /* CJK Ideograph */ + ["\u5DD0", "\u5DD0"], /* CJK Ideograph */ + ["\u5DD1", "\u5DD1"], /* CJK Ideograph */ + ["\u5DD2", "\u5DD2"], /* CJK Ideograph */ + ["\u5DD3", "\u5DD3"], /* CJK Ideograph */ + ["\u5DD4", "\u5DD4"], /* CJK Ideograph */ + ["\u5DD5", "\u5DD5"], /* CJK Ideograph */ + ["\u5DD6", "\u5DD6"], /* CJK Ideograph */ + ["\u5DD7", "\u5DD7"], /* CJK Ideograph */ + ["\u5DD8", "\u5DD8"], /* CJK Ideograph */ + ["\u5DD9", "\u5DD9"], /* CJK Ideograph */ + ["\u5DDA", "\u5DDA"], /* CJK Ideograph */ + ["\u5DDB", "\u5DDB"], /* CJK Ideograph */ + ["\u5DDC", "\u5DDC"], /* CJK Ideograph */ + ["\u5DDD", "\u5DDD"], /* CJK Ideograph */ + ["\u5DDE", "\u5DDE"], /* CJK Ideograph */ + ["\u5DDF", "\u5DDF"], /* CJK Ideograph */ + ["\u5DE0", "\u5DE0"], /* CJK Ideograph */ + ["\u5DE1", "\u5DE1"], /* CJK Ideograph */ + ["\u5DE2", "\u5DE2"], /* CJK Ideograph */ + ["\u5DE3", "\u5DE3"], /* CJK Ideograph */ + ["\u5DE4", "\u5DE4"], /* CJK Ideograph */ + ["\u5DE5", "\u5DE5"], /* CJK Ideograph */ + ["\u5DE6", "\u5DE6"], /* CJK Ideograph */ + ["\u5DE7", "\u5DE7"], /* CJK Ideograph */ + ["\u5DE8", "\u5DE8"], /* CJK Ideograph */ + ["\u5DE9", "\u5DE9"], /* CJK Ideograph */ + ["\u5DEA", "\u5DEA"], /* CJK Ideograph */ + ["\u5DEB", "\u5DEB"], /* CJK Ideograph */ + ["\u5DEC", "\u5DEC"], /* CJK Ideograph */ + ["\u5DED", "\u5DED"], /* CJK Ideograph */ + ["\u5DEE", "\u5DEE"], /* CJK Ideograph */ + ["\u5DEF", "\u5DEF"], /* CJK Ideograph */ + ["\u5DF0", "\u5DF0"], /* CJK Ideograph */ + ["\u5DF1", "\u5DF1"], /* CJK Ideograph */ + ["\u5DF2", "\u5DF2"], /* CJK Ideograph */ + ["\u5DF3", "\u5DF3"], /* CJK Ideograph */ + ["\u5DF4", "\u5DF4"], /* CJK Ideograph */ + ["\u5DF5", "\u5DF5"], /* CJK Ideograph */ + ["\u5DF6", "\u5DF6"], /* CJK Ideograph */ + ["\u5DF7", "\u5DF7"], /* CJK Ideograph */ + ["\u5DF8", "\u5DF8"], /* CJK Ideograph */ + ["\u5DF9", "\u5DF9"], /* CJK Ideograph */ + ["\u5DFA", "\u5DFA"], /* CJK Ideograph */ + ["\u5DFB", "\u5DFB"], /* CJK Ideograph */ + ["\u5DFC", "\u5DFC"], /* CJK Ideograph */ + ["\u5DFD", "\u5DFD"], /* CJK Ideograph */ + ["\u5DFE", "\u5DFE"], /* CJK Ideograph */ + ["\u5DFF", "\u5DFF"], /* CJK Ideograph */ + ["\u5E00", "\u5E00"], /* CJK Ideograph */ + ["\u5E01", "\u5E01"], /* CJK Ideograph */ + ["\u5E02", "\u5E02"], /* CJK Ideograph */ + ["\u5E03", "\u5E03"], /* CJK Ideograph */ + ["\u5E04", "\u5E04"], /* CJK Ideograph */ + ["\u5E05", "\u5E05"], /* CJK Ideograph */ + ["\u5E06", "\u5E06"], /* CJK Ideograph */ + ["\u5E07", "\u5E07"], /* CJK Ideograph */ + ["\u5E08", "\u5E08"], /* CJK Ideograph */ + ["\u5E09", "\u5E09"], /* CJK Ideograph */ + ["\u5E0A", "\u5E0A"], /* CJK Ideograph */ + ["\u5E0B", "\u5E0B"], /* CJK Ideograph */ + ["\u5E0C", "\u5E0C"], /* CJK Ideograph */ + ["\u5E0D", "\u5E0D"], /* CJK Ideograph */ + ["\u5E0E", "\u5E0E"], /* CJK Ideograph */ + ["\u5E0F", "\u5E0F"], /* CJK Ideograph */ + ["\u5E10", "\u5E10"], /* CJK Ideograph */ + ["\u5E11", "\u5E11"], /* CJK Ideograph */ + ["\u5E12", "\u5E12"], /* CJK Ideograph */ + ["\u5E13", "\u5E13"], /* CJK Ideograph */ + ["\u5E14", "\u5E14"], /* CJK Ideograph */ + ["\u5E15", "\u5E15"], /* CJK Ideograph */ + ["\u5E16", "\u5E16"], /* CJK Ideograph */ + ["\u5E17", "\u5E17"], /* CJK Ideograph */ + ["\u5E18", "\u5E18"], /* CJK Ideograph */ + ["\u5E19", "\u5E19"], /* CJK Ideograph */ + ["\u5E1A", "\u5E1A"], /* CJK Ideograph */ + ["\u5E1B", "\u5E1B"], /* CJK Ideograph */ + ["\u5E1C", "\u5E1C"], /* CJK Ideograph */ + ["\u5E1D", "\u5E1D"], /* CJK Ideograph */ + ["\u5E1E", "\u5E1E"], /* CJK Ideograph */ + ["\u5E1F", "\u5E1F"], /* CJK Ideograph */ + ["\u5E20", "\u5E20"], /* CJK Ideograph */ + ["\u5E21", "\u5E21"], /* CJK Ideograph */ + ["\u5E22", "\u5E22"], /* CJK Ideograph */ + ["\u5E23", "\u5E23"], /* CJK Ideograph */ + ["\u5E24", "\u5E24"], /* CJK Ideograph */ + ["\u5E25", "\u5E25"], /* CJK Ideograph */ + ["\u5E26", "\u5E26"], /* CJK Ideograph */ + ["\u5E27", "\u5E27"], /* CJK Ideograph */ + ["\u5E28", "\u5E28"], /* CJK Ideograph */ + ["\u5E29", "\u5E29"], /* CJK Ideograph */ + ["\u5E2A", "\u5E2A"], /* CJK Ideograph */ + ["\u5E2B", "\u5E2B"], /* CJK Ideograph */ + ["\u5E2C", "\u5E2C"], /* CJK Ideograph */ + ["\u5E2D", "\u5E2D"], /* CJK Ideograph */ + ["\u5E2E", "\u5E2E"], /* CJK Ideograph */ + ["\u5E2F", "\u5E2F"], /* CJK Ideograph */ + ["\u5E30", "\u5E30"], /* CJK Ideograph */ + ["\u5E31", "\u5E31"], /* CJK Ideograph */ + ["\u5E32", "\u5E32"], /* CJK Ideograph */ + ["\u5E33", "\u5E33"], /* CJK Ideograph */ + ["\u5E34", "\u5E34"], /* CJK Ideograph */ + ["\u5E35", "\u5E35"], /* CJK Ideograph */ + ["\u5E36", "\u5E36"], /* CJK Ideograph */ + ["\u5E37", "\u5E37"], /* CJK Ideograph */ + ["\u5E38", "\u5E38"], /* CJK Ideograph */ + ["\u5E39", "\u5E39"], /* CJK Ideograph */ + ["\u5E3A", "\u5E3A"], /* CJK Ideograph */ + ["\u5E3B", "\u5E3B"], /* CJK Ideograph */ + ["\u5E3C", "\u5E3C"], /* CJK Ideograph */ + ["\u5E3D", "\u5E3D"], /* CJK Ideograph */ + ["\u5E3E", "\u5E3E"], /* CJK Ideograph */ + ["\u5E3F", "\u5E3F"], /* CJK Ideograph */ + ["\u5E40", "\u5E40"], /* CJK Ideograph */ + ["\u5E41", "\u5E41"], /* CJK Ideograph */ + ["\u5E42", "\u5E42"], /* CJK Ideograph */ + ["\u5E43", "\u5E43"], /* CJK Ideograph */ + ["\u5E44", "\u5E44"], /* CJK Ideograph */ + ["\u5E45", "\u5E45"], /* CJK Ideograph */ + ["\u5E46", "\u5E46"], /* CJK Ideograph */ + ["\u5E47", "\u5E47"], /* CJK Ideograph */ + ["\u5E48", "\u5E48"], /* CJK Ideograph */ + ["\u5E49", "\u5E49"], /* CJK Ideograph */ + ["\u5E4A", "\u5E4A"], /* CJK Ideograph */ + ["\u5E4B", "\u5E4B"], /* CJK Ideograph */ + ["\u5E4C", "\u5E4C"], /* CJK Ideograph */ + ["\u5E4D", "\u5E4D"], /* CJK Ideograph */ + ["\u5E4E", "\u5E4E"], /* CJK Ideograph */ + ["\u5E4F", "\u5E4F"], /* CJK Ideograph */ + ["\u5E50", "\u5E50"], /* CJK Ideograph */ + ["\u5E51", "\u5E51"], /* CJK Ideograph */ + ["\u5E52", "\u5E52"], /* CJK Ideograph */ + ["\u5E53", "\u5E53"], /* CJK Ideograph */ + ["\u5E54", "\u5E54"], /* CJK Ideograph */ + ["\u5E55", "\u5E55"], /* CJK Ideograph */ + ["\u5E56", "\u5E56"], /* CJK Ideograph */ + ["\u5E57", "\u5E57"], /* CJK Ideograph */ + ["\u5E58", "\u5E58"], /* CJK Ideograph */ + ["\u5E59", "\u5E59"], /* CJK Ideograph */ + ["\u5E5A", "\u5E5A"], /* CJK Ideograph */ + ["\u5E5B", "\u5E5B"], /* CJK Ideograph */ + ["\u5E5C", "\u5E5C"], /* CJK Ideograph */ + ["\u5E5D", "\u5E5D"], /* CJK Ideograph */ + ["\u5E5E", "\u5E5E"], /* CJK Ideograph */ + ["\u5E5F", "\u5E5F"], /* CJK Ideograph */ + ["\u5E60", "\u5E60"], /* CJK Ideograph */ + ["\u5E61", "\u5E61"], /* CJK Ideograph */ + ["\u5E62", "\u5E62"], /* CJK Ideograph */ + ["\u5E63", "\u5E63"], /* CJK Ideograph */ + ["\u5E64", "\u5E64"], /* CJK Ideograph */ + ["\u5E65", "\u5E65"], /* CJK Ideograph */ + ["\u5E66", "\u5E66"], /* CJK Ideograph */ + ["\u5E67", "\u5E67"], /* CJK Ideograph */ + ["\u5E68", "\u5E68"], /* CJK Ideograph */ + ["\u5E69", "\u5E69"], /* CJK Ideograph */ + ["\u5E6A", "\u5E6A"], /* CJK Ideograph */ + ["\u5E6B", "\u5E6B"], /* CJK Ideograph */ + ["\u5E6C", "\u5E6C"], /* CJK Ideograph */ + ["\u5E6D", "\u5E6D"], /* CJK Ideograph */ + ["\u5E6E", "\u5E6E"], /* CJK Ideograph */ + ["\u5E6F", "\u5E6F"], /* CJK Ideograph */ + ["\u5E70", "\u5E70"], /* CJK Ideograph */ + ["\u5E71", "\u5E71"], /* CJK Ideograph */ + ["\u5E72", "\u5E72"], /* CJK Ideograph */ + ["\u5E73", "\u5E73"], /* CJK Ideograph */ + ["\u5E74", "\u5E74"], /* CJK Ideograph */ + ["\u5E75", "\u5E75"], /* CJK Ideograph */ + ["\u5E76", "\u5E76"], /* CJK Ideograph */ + ["\u5E77", "\u5E77"], /* CJK Ideograph */ + ["\u5E78", "\u5E78"], /* CJK Ideograph */ + ["\u5E79", "\u5E79"], /* CJK Ideograph */ + ["\u5E7A", "\u5E7A"], /* CJK Ideograph */ + ["\u5E7B", "\u5E7B"], /* CJK Ideograph */ + ["\u5E7C", "\u5E7C"], /* CJK Ideograph */ + ["\u5E7D", "\u5E7D"], /* CJK Ideograph */ + ["\u5E7E", "\u5E7E"], /* CJK Ideograph */ + ["\u5E7F", "\u5E7F"], /* CJK Ideograph */ + ["\u5E80", "\u5E80"], /* CJK Ideograph */ + ["\u5E81", "\u5E81"], /* CJK Ideograph */ + ["\u5E82", "\u5E82"], /* CJK Ideograph */ + ["\u5E83", "\u5E83"], /* CJK Ideograph */ + ["\u5E84", "\u5E84"], /* CJK Ideograph */ + ["\u5E85", "\u5E85"], /* CJK Ideograph */ + ["\u5E86", "\u5E86"], /* CJK Ideograph */ + ["\u5E87", "\u5E87"], /* CJK Ideograph */ + ["\u5E88", "\u5E88"], /* CJK Ideograph */ + ["\u5E89", "\u5E89"], /* CJK Ideograph */ + ["\u5E8A", "\u5E8A"], /* CJK Ideograph */ + ["\u5E8B", "\u5E8B"], /* CJK Ideograph */ + ["\u5E8C", "\u5E8C"], /* CJK Ideograph */ + ["\u5E8D", "\u5E8D"], /* CJK Ideograph */ + ["\u5E8E", "\u5E8E"], /* CJK Ideograph */ + ["\u5E8F", "\u5E8F"], /* CJK Ideograph */ + ["\u5E90", "\u5E90"], /* CJK Ideograph */ + ["\u5E91", "\u5E91"], /* CJK Ideograph */ + ["\u5E92", "\u5E92"], /* CJK Ideograph */ + ["\u5E93", "\u5E93"], /* CJK Ideograph */ + ["\u5E94", "\u5E94"], /* CJK Ideograph */ + ["\u5E95", "\u5E95"], /* CJK Ideograph */ + ["\u5E96", "\u5E96"], /* CJK Ideograph */ + ["\u5E97", "\u5E97"], /* CJK Ideograph */ + ["\u5E98", "\u5E98"], /* CJK Ideograph */ + ["\u5E99", "\u5E99"], /* CJK Ideograph */ + ["\u5E9A", "\u5E9A"], /* CJK Ideograph */ + ["\u5E9B", "\u5E9B"], /* CJK Ideograph */ + ["\u5E9C", "\u5E9C"], /* CJK Ideograph */ + ["\u5E9D", "\u5E9D"], /* CJK Ideograph */ + ["\u5E9E", "\u5E9E"], /* CJK Ideograph */ + ["\u5E9F", "\u5E9F"], /* CJK Ideograph */ + ["\u5EA0", "\u5EA0"], /* CJK Ideograph */ + ["\u5EA1", "\u5EA1"], /* CJK Ideograph */ + ["\u5EA2", "\u5EA2"], /* CJK Ideograph */ + ["\u5EA3", "\u5EA3"], /* CJK Ideograph */ + ["\u5EA4", "\u5EA4"], /* CJK Ideograph */ + ["\u5EA5", "\u5EA5"], /* CJK Ideograph */ + ["\u5EA6", "\u5EA6"], /* CJK Ideograph */ + ["\u5EA7", "\u5EA7"], /* CJK Ideograph */ + ["\u5EA8", "\u5EA8"], /* CJK Ideograph */ + ["\u5EA9", "\u5EA9"], /* CJK Ideograph */ + ["\u5EAA", "\u5EAA"], /* CJK Ideograph */ + ["\u5EAB", "\u5EAB"], /* CJK Ideograph */ + ["\u5EAC", "\u5EAC"], /* CJK Ideograph */ + ["\u5EAD", "\u5EAD"], /* CJK Ideograph */ + ["\u5EAE", "\u5EAE"], /* CJK Ideograph */ + ["\u5EAF", "\u5EAF"], /* CJK Ideograph */ + ["\u5EB0", "\u5EB0"], /* CJK Ideograph */ + ["\u5EB1", "\u5EB1"], /* CJK Ideograph */ + ["\u5EB2", "\u5EB2"], /* CJK Ideograph */ + ["\u5EB3", "\u5EB3"], /* CJK Ideograph */ + ["\u5EB4", "\u5EB4"], /* CJK Ideograph */ + ["\u5EB5", "\u5EB5"], /* CJK Ideograph */ + ["\u5EB6", "\u5EB6"], /* CJK Ideograph */ + ["\u5EB7", "\u5EB7"], /* CJK Ideograph */ + ["\u5EB8", "\u5EB8"], /* CJK Ideograph */ + ["\u5EB9", "\u5EB9"], /* CJK Ideograph */ + ["\u5EBA", "\u5EBA"], /* CJK Ideograph */ + ["\u5EBB", "\u5EBB"], /* CJK Ideograph */ + ["\u5EBC", "\u5EBC"], /* CJK Ideograph */ + ["\u5EBD", "\u5EBD"], /* CJK Ideograph */ + ["\u5EBE", "\u5EBE"], /* CJK Ideograph */ + ["\u5EBF", "\u5EBF"], /* CJK Ideograph */ + ["\u5EC0", "\u5EC0"], /* CJK Ideograph */ + ["\u5EC1", "\u5EC1"], /* CJK Ideograph */ + ["\u5EC2", "\u5EC2"], /* CJK Ideograph */ + ["\u5EC3", "\u5EC3"], /* CJK Ideograph */ + ["\u5EC4", "\u5EC4"], /* CJK Ideograph */ + ["\u5EC5", "\u5EC5"], /* CJK Ideograph */ + ["\u5EC6", "\u5EC6"], /* CJK Ideograph */ + ["\u5EC7", "\u5EC7"], /* CJK Ideograph */ + ["\u5EC8", "\u5EC8"], /* CJK Ideograph */ + ["\u5EC9", "\u5EC9"], /* CJK Ideograph */ + ["\u5ECA", "\u5ECA"], /* CJK Ideograph */ + ["\u5ECB", "\u5ECB"], /* CJK Ideograph */ + ["\u5ECC", "\u5ECC"], /* CJK Ideograph */ + ["\u5ECD", "\u5ECD"], /* CJK Ideograph */ + ["\u5ECE", "\u5ECE"], /* CJK Ideograph */ + ["\u5ECF", "\u5ECF"], /* CJK Ideograph */ + ["\u5ED0", "\u5ED0"], /* CJK Ideograph */ + ["\u5ED1", "\u5ED1"], /* CJK Ideograph */ + ["\u5ED2", "\u5ED2"], /* CJK Ideograph */ + ["\u5ED3", "\u5ED3"], /* CJK Ideograph */ + ["\u5ED4", "\u5ED4"], /* CJK Ideograph */ + ["\u5ED5", "\u5ED5"], /* CJK Ideograph */ + ["\u5ED6", "\u5ED6"], /* CJK Ideograph */ + ["\u5ED7", "\u5ED7"], /* CJK Ideograph */ + ["\u5ED8", "\u5ED8"], /* CJK Ideograph */ + ["\u5ED9", "\u5ED9"], /* CJK Ideograph */ + ["\u5EDA", "\u5EDA"], /* CJK Ideograph */ + ["\u5EDB", "\u5EDB"], /* CJK Ideograph */ + ["\u5EDC", "\u5EDC"], /* CJK Ideograph */ + ["\u5EDD", "\u5EDD"], /* CJK Ideograph */ + ["\u5EDE", "\u5EDE"], /* CJK Ideograph */ + ["\u5EDF", "\u5EDF"], /* CJK Ideograph */ + ["\u5EE0", "\u5EE0"], /* CJK Ideograph */ + ["\u5EE1", "\u5EE1"], /* CJK Ideograph */ + ["\u5EE2", "\u5EE2"], /* CJK Ideograph */ + ["\u5EE3", "\u5EE3"], /* CJK Ideograph */ + ["\u5EE4", "\u5EE4"], /* CJK Ideograph */ + ["\u5EE5", "\u5EE5"], /* CJK Ideograph */ + ["\u5EE6", "\u5EE6"], /* CJK Ideograph */ + ["\u5EE7", "\u5EE7"], /* CJK Ideograph */ + ["\u5EE8", "\u5EE8"], /* CJK Ideograph */ + ["\u5EE9", "\u5EE9"], /* CJK Ideograph */ + ["\u5EEA", "\u5EEA"], /* CJK Ideograph */ + ["\u5EEB", "\u5EEB"], /* CJK Ideograph */ + ["\u5EEC", "\u5EEC"], /* CJK Ideograph */ + ["\u5EED", "\u5EED"], /* CJK Ideograph */ + ["\u5EEE", "\u5EEE"], /* CJK Ideograph */ + ["\u5EEF", "\u5EEF"], /* CJK Ideograph */ + ["\u5EF0", "\u5EF0"], /* CJK Ideograph */ + ["\u5EF1", "\u5EF1"], /* CJK Ideograph */ + ["\u5EF2", "\u5EF2"], /* CJK Ideograph */ + ["\u5EF3", "\u5EF3"], /* CJK Ideograph */ + ["\u5EF4", "\u5EF4"], /* CJK Ideograph */ + ["\u5EF5", "\u5EF5"], /* CJK Ideograph */ + ["\u5EF6", "\u5EF6"], /* CJK Ideograph */ + ["\u5EF7", "\u5EF7"], /* CJK Ideograph */ + ["\u5EF8", "\u5EF8"], /* CJK Ideograph */ + ["\u5EF9", "\u5EF9"], /* CJK Ideograph */ + ["\u5EFA", "\u5EFA"], /* CJK Ideograph */ + ["\u5EFB", "\u5EFB"], /* CJK Ideograph */ + ["\u5EFC", "\u5EFC"], /* CJK Ideograph */ + ["\u5EFD", "\u5EFD"], /* CJK Ideograph */ + ["\u5EFE", "\u5EFE"], /* CJK Ideograph */ + ["\u5EFF", "\u5EFF"], /* CJK Ideograph */ + ["\u5F00", "\u5F00"], /* CJK Ideograph */ + ["\u5F01", "\u5F01"], /* CJK Ideograph */ + ["\u5F02", "\u5F02"], /* CJK Ideograph */ + ["\u5F03", "\u5F03"], /* CJK Ideograph */ + ["\u5F04", "\u5F04"], /* CJK Ideograph */ + ["\u5F05", "\u5F05"], /* CJK Ideograph */ + ["\u5F06", "\u5F06"], /* CJK Ideograph */ + ["\u5F07", "\u5F07"], /* CJK Ideograph */ + ["\u5F08", "\u5F08"], /* CJK Ideograph */ + ["\u5F09", "\u5F09"], /* CJK Ideograph */ + ["\u5F0A", "\u5F0A"], /* CJK Ideograph */ + ["\u5F0B", "\u5F0B"], /* CJK Ideograph */ + ["\u5F0C", "\u5F0C"], /* CJK Ideograph */ + ["\u5F0D", "\u5F0D"], /* CJK Ideograph */ + ["\u5F0E", "\u5F0E"], /* CJK Ideograph */ + ["\u5F0F", "\u5F0F"], /* CJK Ideograph */ + ["\u5F10", "\u5F10"], /* CJK Ideograph */ + ["\u5F11", "\u5F11"], /* CJK Ideograph */ + ["\u5F12", "\u5F12"], /* CJK Ideograph */ + ["\u5F13", "\u5F13"], /* CJK Ideograph */ + ["\u5F14", "\u5F14"], /* CJK Ideograph */ + ["\u5F15", "\u5F15"], /* CJK Ideograph */ + ["\u5F16", "\u5F16"], /* CJK Ideograph */ + ["\u5F17", "\u5F17"], /* CJK Ideograph */ + ["\u5F18", "\u5F18"], /* CJK Ideograph */ + ["\u5F19", "\u5F19"], /* CJK Ideograph */ + ["\u5F1A", "\u5F1A"], /* CJK Ideograph */ + ["\u5F1B", "\u5F1B"], /* CJK Ideograph */ + ["\u5F1C", "\u5F1C"], /* CJK Ideograph */ + ["\u5F1D", "\u5F1D"], /* CJK Ideograph */ + ["\u5F1E", "\u5F1E"], /* CJK Ideograph */ + ["\u5F1F", "\u5F1F"], /* CJK Ideograph */ + ["\u5F20", "\u5F20"], /* CJK Ideograph */ + ["\u5F21", "\u5F21"], /* CJK Ideograph */ + ["\u5F22", "\u5F22"], /* CJK Ideograph */ + ["\u5F23", "\u5F23"], /* CJK Ideograph */ + ["\u5F24", "\u5F24"], /* CJK Ideograph */ + ["\u5F25", "\u5F25"], /* CJK Ideograph */ + ["\u5F26", "\u5F26"], /* CJK Ideograph */ + ["\u5F27", "\u5F27"], /* CJK Ideograph */ + ["\u5F28", "\u5F28"], /* CJK Ideograph */ + ["\u5F29", "\u5F29"], /* CJK Ideograph */ + ["\u5F2A", "\u5F2A"], /* CJK Ideograph */ + ["\u5F2B", "\u5F2B"], /* CJK Ideograph */ + ["\u5F2C", "\u5F2C"], /* CJK Ideograph */ + ["\u5F2D", "\u5F2D"], /* CJK Ideograph */ + ["\u5F2E", "\u5F2E"], /* CJK Ideograph */ + ["\u5F2F", "\u5F2F"], /* CJK Ideograph */ + ["\u5F30", "\u5F30"], /* CJK Ideograph */ + ["\u5F31", "\u5F31"], /* CJK Ideograph */ + ["\u5F32", "\u5F32"], /* CJK Ideograph */ + ["\u5F33", "\u5F33"], /* CJK Ideograph */ + ["\u5F34", "\u5F34"], /* CJK Ideograph */ + ["\u5F35", "\u5F35"], /* CJK Ideograph */ + ["\u5F36", "\u5F36"], /* CJK Ideograph */ + ["\u5F37", "\u5F37"], /* CJK Ideograph */ + ["\u5F38", "\u5F38"], /* CJK Ideograph */ + ["\u5F39", "\u5F39"], /* CJK Ideograph */ + ["\u5F3A", "\u5F3A"], /* CJK Ideograph */ + ["\u5F3B", "\u5F3B"], /* CJK Ideograph */ + ["\u5F3C", "\u5F3C"], /* CJK Ideograph */ + ["\u5F3D", "\u5F3D"], /* CJK Ideograph */ + ["\u5F3E", "\u5F3E"], /* CJK Ideograph */ + ["\u5F3F", "\u5F3F"], /* CJK Ideograph */ + ["\u5F40", "\u5F40"], /* CJK Ideograph */ + ["\u5F41", "\u5F41"], /* CJK Ideograph */ + ["\u5F42", "\u5F42"], /* CJK Ideograph */ + ["\u5F43", "\u5F43"], /* CJK Ideograph */ + ["\u5F44", "\u5F44"], /* CJK Ideograph */ + ["\u5F45", "\u5F45"], /* CJK Ideograph */ + ["\u5F46", "\u5F46"], /* CJK Ideograph */ + ["\u5F47", "\u5F47"], /* CJK Ideograph */ + ["\u5F48", "\u5F48"], /* CJK Ideograph */ + ["\u5F49", "\u5F49"], /* CJK Ideograph */ + ["\u5F4A", "\u5F4A"], /* CJK Ideograph */ + ["\u5F4B", "\u5F4B"], /* CJK Ideograph */ + ["\u5F4C", "\u5F4C"], /* CJK Ideograph */ + ["\u5F4D", "\u5F4D"], /* CJK Ideograph */ + ["\u5F4E", "\u5F4E"], /* CJK Ideograph */ + ["\u5F4F", "\u5F4F"], /* CJK Ideograph */ + ["\u5F50", "\u5F50"], /* CJK Ideograph */ + ["\u5F51", "\u5F51"], /* CJK Ideograph */ + ["\u5F52", "\u5F52"], /* CJK Ideograph */ + ["\u5F53", "\u5F53"], /* CJK Ideograph */ + ["\u5F54", "\u5F54"], /* CJK Ideograph */ + ["\u5F55", "\u5F55"], /* CJK Ideograph */ + ["\u5F56", "\u5F56"], /* CJK Ideograph */ + ["\u5F57", "\u5F57"], /* CJK Ideograph */ + ["\u5F58", "\u5F58"], /* CJK Ideograph */ + ["\u5F59", "\u5F59"], /* CJK Ideograph */ + ["\u5F5A", "\u5F5A"], /* CJK Ideograph */ + ["\u5F5B", "\u5F5B"], /* CJK Ideograph */ + ["\u5F5C", "\u5F5C"], /* CJK Ideograph */ + ["\u5F5D", "\u5F5D"], /* CJK Ideograph */ + ["\u5F5E", "\u5F5E"], /* CJK Ideograph */ + ["\u5F5F", "\u5F5F"], /* CJK Ideograph */ + ["\u5F60", "\u5F60"], /* CJK Ideograph */ + ["\u5F61", "\u5F61"], /* CJK Ideograph */ + ["\u5F62", "\u5F62"], /* CJK Ideograph */ + ["\u5F63", "\u5F63"], /* CJK Ideograph */ + ["\u5F64", "\u5F64"], /* CJK Ideograph */ + ["\u5F65", "\u5F65"], /* CJK Ideograph */ + ["\u5F66", "\u5F66"], /* CJK Ideograph */ + ["\u5F67", "\u5F67"], /* CJK Ideograph */ + ["\u5F68", "\u5F68"], /* CJK Ideograph */ + ["\u5F69", "\u5F69"], /* CJK Ideograph */ + ["\u5F6A", "\u5F6A"], /* CJK Ideograph */ + ["\u5F6B", "\u5F6B"], /* CJK Ideograph */ + ["\u5F6C", "\u5F6C"], /* CJK Ideograph */ + ["\u5F6D", "\u5F6D"], /* CJK Ideograph */ + ["\u5F6E", "\u5F6E"], /* CJK Ideograph */ + ["\u5F6F", "\u5F6F"], /* CJK Ideograph */ + ["\u5F70", "\u5F70"], /* CJK Ideograph */ + ["\u5F71", "\u5F71"], /* CJK Ideograph */ + ["\u5F72", "\u5F72"], /* CJK Ideograph */ + ["\u5F73", "\u5F73"], /* CJK Ideograph */ + ["\u5F74", "\u5F74"], /* CJK Ideograph */ + ["\u5F75", "\u5F75"], /* CJK Ideograph */ + ["\u5F76", "\u5F76"], /* CJK Ideograph */ + ["\u5F77", "\u5F77"], /* CJK Ideograph */ + ["\u5F78", "\u5F78"], /* CJK Ideograph */ + ["\u5F79", "\u5F79"], /* CJK Ideograph */ + ["\u5F7A", "\u5F7A"], /* CJK Ideograph */ + ["\u5F7B", "\u5F7B"], /* CJK Ideograph */ + ["\u5F7C", "\u5F7C"], /* CJK Ideograph */ + ["\u5F7D", "\u5F7D"], /* CJK Ideograph */ + ["\u5F7E", "\u5F7E"], /* CJK Ideograph */ + ["\u5F7F", "\u5F7F"], /* CJK Ideograph */ + ["\u5F80", "\u5F80"], /* CJK Ideograph */ + ["\u5F81", "\u5F81"], /* CJK Ideograph */ + ["\u5F82", "\u5F82"], /* CJK Ideograph */ + ["\u5F83", "\u5F83"], /* CJK Ideograph */ + ["\u5F84", "\u5F84"], /* CJK Ideograph */ + ["\u5F85", "\u5F85"], /* CJK Ideograph */ + ["\u5F86", "\u5F86"], /* CJK Ideograph */ + ["\u5F87", "\u5F87"], /* CJK Ideograph */ + ["\u5F88", "\u5F88"], /* CJK Ideograph */ + ["\u5F89", "\u5F89"], /* CJK Ideograph */ + ["\u5F8A", "\u5F8A"], /* CJK Ideograph */ + ["\u5F8B", "\u5F8B"], /* CJK Ideograph */ + ["\u5F8C", "\u5F8C"], /* CJK Ideograph */ + ["\u5F8D", "\u5F8D"], /* CJK Ideograph */ + ["\u5F8E", "\u5F8E"], /* CJK Ideograph */ + ["\u5F8F", "\u5F8F"], /* CJK Ideograph */ + ["\u5F90", "\u5F90"], /* CJK Ideograph */ + ["\u5F91", "\u5F91"], /* CJK Ideograph */ + ["\u5F92", "\u5F92"], /* CJK Ideograph */ + ["\u5F93", "\u5F93"], /* CJK Ideograph */ + ["\u5F94", "\u5F94"], /* CJK Ideograph */ + ["\u5F95", "\u5F95"], /* CJK Ideograph */ + ["\u5F96", "\u5F96"], /* CJK Ideograph */ + ["\u5F97", "\u5F97"], /* CJK Ideograph */ + ["\u5F98", "\u5F98"], /* CJK Ideograph */ + ["\u5F99", "\u5F99"], /* CJK Ideograph */ + ["\u5F9A", "\u5F9A"], /* CJK Ideograph */ + ["\u5F9B", "\u5F9B"], /* CJK Ideograph */ + ["\u5F9C", "\u5F9C"], /* CJK Ideograph */ + ["\u5F9D", "\u5F9D"], /* CJK Ideograph */ + ["\u5F9E", "\u5F9E"], /* CJK Ideograph */ + ["\u5F9F", "\u5F9F"], /* CJK Ideograph */ + ["\u5FA0", "\u5FA0"], /* CJK Ideograph */ + ["\u5FA1", "\u5FA1"], /* CJK Ideograph */ + ["\u5FA2", "\u5FA2"], /* CJK Ideograph */ + ["\u5FA3", "\u5FA3"], /* CJK Ideograph */ + ["\u5FA4", "\u5FA4"], /* CJK Ideograph */ + ["\u5FA5", "\u5FA5"], /* CJK Ideograph */ + ["\u5FA6", "\u5FA6"], /* CJK Ideograph */ + ["\u5FA7", "\u5FA7"], /* CJK Ideograph */ + ["\u5FA8", "\u5FA8"], /* CJK Ideograph */ + ["\u5FA9", "\u5FA9"], /* CJK Ideograph */ + ["\u5FAA", "\u5FAA"], /* CJK Ideograph */ + ["\u5FAB", "\u5FAB"], /* CJK Ideograph */ + ["\u5FAC", "\u5FAC"], /* CJK Ideograph */ + ["\u5FAD", "\u5FAD"], /* CJK Ideograph */ + ["\u5FAE", "\u5FAE"], /* CJK Ideograph */ + ["\u5FAF", "\u5FAF"], /* CJK Ideograph */ + ["\u5FB0", "\u5FB0"], /* CJK Ideograph */ + ["\u5FB1", "\u5FB1"], /* CJK Ideograph */ + ["\u5FB2", "\u5FB2"], /* CJK Ideograph */ + ["\u5FB3", "\u5FB3"], /* CJK Ideograph */ + ["\u5FB4", "\u5FB4"], /* CJK Ideograph */ + ["\u5FB5", "\u5FB5"], /* CJK Ideograph */ + ["\u5FB6", "\u5FB6"], /* CJK Ideograph */ + ["\u5FB7", "\u5FB7"], /* CJK Ideograph */ + ["\u5FB8", "\u5FB8"], /* CJK Ideograph */ + ["\u5FB9", "\u5FB9"], /* CJK Ideograph */ + ["\u5FBA", "\u5FBA"], /* CJK Ideograph */ + ["\u5FBB", "\u5FBB"], /* CJK Ideograph */ + ["\u5FBC", "\u5FBC"], /* CJK Ideograph */ + ["\u5FBD", "\u5FBD"], /* CJK Ideograph */ + ["\u5FBE", "\u5FBE"], /* CJK Ideograph */ + ["\u5FBF", "\u5FBF"], /* CJK Ideograph */ + ["\u5FC0", "\u5FC0"], /* CJK Ideograph */ + ["\u5FC1", "\u5FC1"], /* CJK Ideograph */ + ["\u5FC2", "\u5FC2"], /* CJK Ideograph */ + ["\u5FC3", "\u5FC3"], /* CJK Ideograph */ + ["\u5FC4", "\u5FC4"], /* CJK Ideograph */ + ["\u5FC5", "\u5FC5"], /* CJK Ideograph */ + ["\u5FC6", "\u5FC6"], /* CJK Ideograph */ + ["\u5FC7", "\u5FC7"], /* CJK Ideograph */ + ["\u5FC8", "\u5FC8"], /* CJK Ideograph */ + ["\u5FC9", "\u5FC9"], /* CJK Ideograph */ + ["\u5FCA", "\u5FCA"], /* CJK Ideograph */ + ["\u5FCB", "\u5FCB"], /* CJK Ideograph */ + ["\u5FCC", "\u5FCC"], /* CJK Ideograph */ + ["\u5FCD", "\u5FCD"], /* CJK Ideograph */ + ["\u5FCE", "\u5FCE"], /* CJK Ideograph */ + ["\u5FCF", "\u5FCF"], /* CJK Ideograph */ + ["\u5FD0", "\u5FD0"], /* CJK Ideograph */ + ["\u5FD1", "\u5FD1"], /* CJK Ideograph */ + ["\u5FD2", "\u5FD2"], /* CJK Ideograph */ + ["\u5FD3", "\u5FD3"], /* CJK Ideograph */ + ["\u5FD4", "\u5FD4"], /* CJK Ideograph */ + ["\u5FD5", "\u5FD5"], /* CJK Ideograph */ + ["\u5FD6", "\u5FD6"], /* CJK Ideograph */ + ["\u5FD7", "\u5FD7"], /* CJK Ideograph */ + ["\u5FD8", "\u5FD8"], /* CJK Ideograph */ + ["\u5FD9", "\u5FD9"], /* CJK Ideograph */ + ["\u5FDA", "\u5FDA"], /* CJK Ideograph */ + ["\u5FDB", "\u5FDB"], /* CJK Ideograph */ + ["\u5FDC", "\u5FDC"], /* CJK Ideograph */ + ["\u5FDD", "\u5FDD"], /* CJK Ideograph */ + ["\u5FDE", "\u5FDE"], /* CJK Ideograph */ + ["\u5FDF", "\u5FDF"], /* CJK Ideograph */ + ["\u5FE0", "\u5FE0"], /* CJK Ideograph */ + ["\u5FE1", "\u5FE1"], /* CJK Ideograph */ + ["\u5FE2", "\u5FE2"], /* CJK Ideograph */ + ["\u5FE3", "\u5FE3"], /* CJK Ideograph */ + ["\u5FE4", "\u5FE4"], /* CJK Ideograph */ + ["\u5FE5", "\u5FE5"], /* CJK Ideograph */ + ["\u5FE6", "\u5FE6"], /* CJK Ideograph */ + ["\u5FE7", "\u5FE7"], /* CJK Ideograph */ + ["\u5FE8", "\u5FE8"], /* CJK Ideograph */ + ["\u5FE9", "\u5FE9"], /* CJK Ideograph */ + ["\u5FEA", "\u5FEA"], /* CJK Ideograph */ + ["\u5FEB", "\u5FEB"], /* CJK Ideograph */ + ["\u5FEC", "\u5FEC"], /* CJK Ideograph */ + ["\u5FED", "\u5FED"], /* CJK Ideograph */ + ["\u5FEE", "\u5FEE"], /* CJK Ideograph */ + ["\u5FEF", "\u5FEF"], /* CJK Ideograph */ + ["\u5FF0", "\u5FF0"], /* CJK Ideograph */ + ["\u5FF1", "\u5FF1"], /* CJK Ideograph */ + ["\u5FF2", "\u5FF2"], /* CJK Ideograph */ + ["\u5FF3", "\u5FF3"], /* CJK Ideograph */ + ["\u5FF4", "\u5FF4"], /* CJK Ideograph */ + ["\u5FF5", "\u5FF5"], /* CJK Ideograph */ + ["\u5FF6", "\u5FF6"], /* CJK Ideograph */ + ["\u5FF7", "\u5FF7"], /* CJK Ideograph */ + ["\u5FF8", "\u5FF8"], /* CJK Ideograph */ + ["\u5FF9", "\u5FF9"], /* CJK Ideograph */ + ["\u5FFA", "\u5FFA"], /* CJK Ideograph */ + ["\u5FFB", "\u5FFB"], /* CJK Ideograph */ + ["\u5FFC", "\u5FFC"], /* CJK Ideograph */ + ["\u5FFD", "\u5FFD"], /* CJK Ideograph */ + ["\u5FFE", "\u5FFE"], /* CJK Ideograph */ + ["\u5FFF", "\u5FFF"], /* CJK Ideograph */ + ["\u6000", "\u6000"], /* CJK Ideograph */ + ["\u6001", "\u6001"], /* CJK Ideograph */ + ["\u6002", "\u6002"], /* CJK Ideograph */ + ["\u6003", "\u6003"], /* CJK Ideograph */ + ["\u6004", "\u6004"], /* CJK Ideograph */ + ["\u6005", "\u6005"], /* CJK Ideograph */ + ["\u6006", "\u6006"], /* CJK Ideograph */ + ["\u6007", "\u6007"], /* CJK Ideograph */ + ["\u6008", "\u6008"], /* CJK Ideograph */ + ["\u6009", "\u6009"], /* CJK Ideograph */ + ["\u600A", "\u600A"], /* CJK Ideograph */ + ["\u600B", "\u600B"], /* CJK Ideograph */ + ["\u600C", "\u600C"], /* CJK Ideograph */ + ["\u600D", "\u600D"], /* CJK Ideograph */ + ["\u600E", "\u600E"], /* CJK Ideograph */ + ["\u600F", "\u600F"], /* CJK Ideograph */ + ["\u6010", "\u6010"], /* CJK Ideograph */ + ["\u6011", "\u6011"], /* CJK Ideograph */ + ["\u6012", "\u6012"], /* CJK Ideograph */ + ["\u6013", "\u6013"], /* CJK Ideograph */ + ["\u6014", "\u6014"], /* CJK Ideograph */ + ["\u6015", "\u6015"], /* CJK Ideograph */ + ["\u6016", "\u6016"], /* CJK Ideograph */ + ["\u6017", "\u6017"], /* CJK Ideograph */ + ["\u6018", "\u6018"], /* CJK Ideograph */ + ["\u6019", "\u6019"], /* CJK Ideograph */ + ["\u601A", "\u601A"], /* CJK Ideograph */ + ["\u601B", "\u601B"], /* CJK Ideograph */ + ["\u601C", "\u601C"], /* CJK Ideograph */ + ["\u601D", "\u601D"], /* CJK Ideograph */ + ["\u601E", "\u601E"], /* CJK Ideograph */ + ["\u601F", "\u601F"], /* CJK Ideograph */ + ["\u6020", "\u6020"], /* CJK Ideograph */ + ["\u6021", "\u6021"], /* CJK Ideograph */ + ["\u6022", "\u6022"], /* CJK Ideograph */ + ["\u6023", "\u6023"], /* CJK Ideograph */ + ["\u6024", "\u6024"], /* CJK Ideograph */ + ["\u6025", "\u6025"], /* CJK Ideograph */ + ["\u6026", "\u6026"], /* CJK Ideograph */ + ["\u6027", "\u6027"], /* CJK Ideograph */ + ["\u6028", "\u6028"], /* CJK Ideograph */ + ["\u6029", "\u6029"], /* CJK Ideograph */ + ["\u602A", "\u602A"], /* CJK Ideograph */ + ["\u602B", "\u602B"], /* CJK Ideograph */ + ["\u602C", "\u602C"], /* CJK Ideograph */ + ["\u602D", "\u602D"], /* CJK Ideograph */ + ["\u602E", "\u602E"], /* CJK Ideograph */ + ["\u602F", "\u602F"], /* CJK Ideograph */ + ["\u6030", "\u6030"], /* CJK Ideograph */ + ["\u6031", "\u6031"], /* CJK Ideograph */ + ["\u6032", "\u6032"], /* CJK Ideograph */ + ["\u6033", "\u6033"], /* CJK Ideograph */ + ["\u6034", "\u6034"], /* CJK Ideograph */ + ["\u6035", "\u6035"], /* CJK Ideograph */ + ["\u6036", "\u6036"], /* CJK Ideograph */ + ["\u6037", "\u6037"], /* CJK Ideograph */ + ["\u6038", "\u6038"], /* CJK Ideograph */ + ["\u6039", "\u6039"], /* CJK Ideograph */ + ["\u603A", "\u603A"], /* CJK Ideograph */ + ["\u603B", "\u603B"], /* CJK Ideograph */ + ["\u603C", "\u603C"], /* CJK Ideograph */ + ["\u603D", "\u603D"], /* CJK Ideograph */ + ["\u603E", "\u603E"], /* CJK Ideograph */ + ["\u603F", "\u603F"], /* CJK Ideograph */ + ["\u6040", "\u6040"], /* CJK Ideograph */ + ["\u6041", "\u6041"], /* CJK Ideograph */ + ["\u6042", "\u6042"], /* CJK Ideograph */ + ["\u6043", "\u6043"], /* CJK Ideograph */ + ["\u6044", "\u6044"], /* CJK Ideograph */ + ["\u6045", "\u6045"], /* CJK Ideograph */ + ["\u6046", "\u6046"], /* CJK Ideograph */ + ["\u6047", "\u6047"], /* CJK Ideograph */ + ["\u6048", "\u6048"], /* CJK Ideograph */ + ["\u6049", "\u6049"], /* CJK Ideograph */ + ["\u604A", "\u604A"], /* CJK Ideograph */ + ["\u604B", "\u604B"], /* CJK Ideograph */ + ["\u604C", "\u604C"], /* CJK Ideograph */ + ["\u604D", "\u604D"], /* CJK Ideograph */ + ["\u604E", "\u604E"], /* CJK Ideograph */ + ["\u604F", "\u604F"], /* CJK Ideograph */ + ["\u6050", "\u6050"], /* CJK Ideograph */ + ["\u6051", "\u6051"], /* CJK Ideograph */ + ["\u6052", "\u6052"], /* CJK Ideograph */ + ["\u6053", "\u6053"], /* CJK Ideograph */ + ["\u6054", "\u6054"], /* CJK Ideograph */ + ["\u6055", "\u6055"], /* CJK Ideograph */ + ["\u6056", "\u6056"], /* CJK Ideograph */ + ["\u6057", "\u6057"], /* CJK Ideograph */ + ["\u6058", "\u6058"], /* CJK Ideograph */ + ["\u6059", "\u6059"], /* CJK Ideograph */ + ["\u605A", "\u605A"], /* CJK Ideograph */ + ["\u605B", "\u605B"], /* CJK Ideograph */ + ["\u605C", "\u605C"], /* CJK Ideograph */ + ["\u605D", "\u605D"], /* CJK Ideograph */ + ["\u605E", "\u605E"], /* CJK Ideograph */ + ["\u605F", "\u605F"], /* CJK Ideograph */ + ["\u6060", "\u6060"], /* CJK Ideograph */ + ["\u6061", "\u6061"], /* CJK Ideograph */ + ["\u6062", "\u6062"], /* CJK Ideograph */ + ["\u6063", "\u6063"], /* CJK Ideograph */ + ["\u6064", "\u6064"], /* CJK Ideograph */ + ["\u6065", "\u6065"], /* CJK Ideograph */ + ["\u6066", "\u6066"], /* CJK Ideograph */ + ["\u6067", "\u6067"], /* CJK Ideograph */ + ["\u6068", "\u6068"], /* CJK Ideograph */ + ["\u6069", "\u6069"], /* CJK Ideograph */ + ["\u606A", "\u606A"], /* CJK Ideograph */ + ["\u606B", "\u606B"], /* CJK Ideograph */ + ["\u606C", "\u606C"], /* CJK Ideograph */ + ["\u606D", "\u606D"], /* CJK Ideograph */ + ["\u606E", "\u606E"], /* CJK Ideograph */ + ["\u606F", "\u606F"], /* CJK Ideograph */ + ["\u6070", "\u6070"], /* CJK Ideograph */ + ["\u6071", "\u6071"], /* CJK Ideograph */ + ["\u6072", "\u6072"], /* CJK Ideograph */ + ["\u6073", "\u6073"], /* CJK Ideograph */ + ["\u6074", "\u6074"], /* CJK Ideograph */ + ["\u6075", "\u6075"], /* CJK Ideograph */ + ["\u6076", "\u6076"], /* CJK Ideograph */ + ["\u6077", "\u6077"], /* CJK Ideograph */ + ["\u6078", "\u6078"], /* CJK Ideograph */ + ["\u6079", "\u6079"], /* CJK Ideograph */ + ["\u607A", "\u607A"], /* CJK Ideograph */ + ["\u607B", "\u607B"], /* CJK Ideograph */ + ["\u607C", "\u607C"], /* CJK Ideograph */ + ["\u607D", "\u607D"], /* CJK Ideograph */ + ["\u607E", "\u607E"], /* CJK Ideograph */ + ["\u607F", "\u607F"], /* CJK Ideograph */ + ["\u6080", "\u6080"], /* CJK Ideograph */ + ["\u6081", "\u6081"], /* CJK Ideograph */ + ["\u6082", "\u6082"], /* CJK Ideograph */ + ["\u6083", "\u6083"], /* CJK Ideograph */ + ["\u6084", "\u6084"], /* CJK Ideograph */ + ["\u6085", "\u6085"], /* CJK Ideograph */ + ["\u6086", "\u6086"], /* CJK Ideograph */ + ["\u6087", "\u6087"], /* CJK Ideograph */ + ["\u6088", "\u6088"], /* CJK Ideograph */ + ["\u6089", "\u6089"], /* CJK Ideograph */ + ["\u608A", "\u608A"], /* CJK Ideograph */ + ["\u608B", "\u608B"], /* CJK Ideograph */ + ["\u608C", "\u608C"], /* CJK Ideograph */ + ["\u608D", "\u608D"], /* CJK Ideograph */ + ["\u608E", "\u608E"], /* CJK Ideograph */ + ["\u608F", "\u608F"], /* CJK Ideograph */ + ["\u6090", "\u6090"], /* CJK Ideograph */ + ["\u6091", "\u6091"], /* CJK Ideograph */ + ["\u6092", "\u6092"], /* CJK Ideograph */ + ["\u6093", "\u6093"], /* CJK Ideograph */ + ["\u6094", "\u6094"], /* CJK Ideograph */ + ["\u6095", "\u6095"], /* CJK Ideograph */ + ["\u6096", "\u6096"], /* CJK Ideograph */ + ["\u6097", "\u6097"], /* CJK Ideograph */ + ["\u6098", "\u6098"], /* CJK Ideograph */ + ["\u6099", "\u6099"], /* CJK Ideograph */ + ["\u609A", "\u609A"], /* CJK Ideograph */ + ["\u609B", "\u609B"], /* CJK Ideograph */ + ["\u609C", "\u609C"], /* CJK Ideograph */ + ["\u609D", "\u609D"], /* CJK Ideograph */ + ["\u609E", "\u609E"], /* CJK Ideograph */ + ["\u609F", "\u609F"], /* CJK Ideograph */ + ["\u60A0", "\u60A0"], /* CJK Ideograph */ + ["\u60A1", "\u60A1"], /* CJK Ideograph */ + ["\u60A2", "\u60A2"], /* CJK Ideograph */ + ["\u60A3", "\u60A3"], /* CJK Ideograph */ + ["\u60A4", "\u60A4"], /* CJK Ideograph */ + ["\u60A5", "\u60A5"], /* CJK Ideograph */ + ["\u60A6", "\u60A6"], /* CJK Ideograph */ + ["\u60A7", "\u60A7"], /* CJK Ideograph */ + ["\u60A8", "\u60A8"], /* CJK Ideograph */ + ["\u60A9", "\u60A9"], /* CJK Ideograph */ + ["\u60AA", "\u60AA"], /* CJK Ideograph */ + ["\u60AB", "\u60AB"], /* CJK Ideograph */ + ["\u60AC", "\u60AC"], /* CJK Ideograph */ + ["\u60AD", "\u60AD"], /* CJK Ideograph */ + ["\u60AE", "\u60AE"], /* CJK Ideograph */ + ["\u60AF", "\u60AF"], /* CJK Ideograph */ + ["\u60B0", "\u60B0"], /* CJK Ideograph */ + ["\u60B1", "\u60B1"], /* CJK Ideograph */ + ["\u60B2", "\u60B2"], /* CJK Ideograph */ + ["\u60B3", "\u60B3"], /* CJK Ideograph */ + ["\u60B4", "\u60B4"], /* CJK Ideograph */ + ["\u60B5", "\u60B5"], /* CJK Ideograph */ + ["\u60B6", "\u60B6"], /* CJK Ideograph */ + ["\u60B7", "\u60B7"], /* CJK Ideograph */ + ["\u60B8", "\u60B8"], /* CJK Ideograph */ + ["\u60B9", "\u60B9"], /* CJK Ideograph */ + ["\u60BA", "\u60BA"], /* CJK Ideograph */ + ["\u60BB", "\u60BB"], /* CJK Ideograph */ + ["\u60BC", "\u60BC"], /* CJK Ideograph */ + ["\u60BD", "\u60BD"], /* CJK Ideograph */ + ["\u60BE", "\u60BE"], /* CJK Ideograph */ + ["\u60BF", "\u60BF"], /* CJK Ideograph */ + ["\u60C0", "\u60C0"], /* CJK Ideograph */ + ["\u60C1", "\u60C1"], /* CJK Ideograph */ + ["\u60C2", "\u60C2"], /* CJK Ideograph */ + ["\u60C3", "\u60C3"], /* CJK Ideograph */ + ["\u60C4", "\u60C4"], /* CJK Ideograph */ + ["\u60C5", "\u60C5"], /* CJK Ideograph */ + ["\u60C6", "\u60C6"], /* CJK Ideograph */ + ["\u60C7", "\u60C7"], /* CJK Ideograph */ + ["\u60C8", "\u60C8"], /* CJK Ideograph */ + ["\u60C9", "\u60C9"], /* CJK Ideograph */ + ["\u60CA", "\u60CA"], /* CJK Ideograph */ + ["\u60CB", "\u60CB"], /* CJK Ideograph */ + ["\u60CC", "\u60CC"], /* CJK Ideograph */ + ["\u60CD", "\u60CD"], /* CJK Ideograph */ + ["\u60CE", "\u60CE"], /* CJK Ideograph */ + ["\u60CF", "\u60CF"], /* CJK Ideograph */ + ["\u60D0", "\u60D0"], /* CJK Ideograph */ + ["\u60D1", "\u60D1"], /* CJK Ideograph */ + ["\u60D2", "\u60D2"], /* CJK Ideograph */ + ["\u60D3", "\u60D3"], /* CJK Ideograph */ + ["\u60D4", "\u60D4"], /* CJK Ideograph */ + ["\u60D5", "\u60D5"], /* CJK Ideograph */ + ["\u60D6", "\u60D6"], /* CJK Ideograph */ + ["\u60D7", "\u60D7"], /* CJK Ideograph */ + ["\u60D8", "\u60D8"], /* CJK Ideograph */ + ["\u60D9", "\u60D9"], /* CJK Ideograph */ + ["\u60DA", "\u60DA"], /* CJK Ideograph */ + ["\u60DB", "\u60DB"], /* CJK Ideograph */ + ["\u60DC", "\u60DC"], /* CJK Ideograph */ + ["\u60DD", "\u60DD"], /* CJK Ideograph */ + ["\u60DE", "\u60DE"], /* CJK Ideograph */ + ["\u60DF", "\u60DF"], /* CJK Ideograph */ + ["\u60E0", "\u60E0"], /* CJK Ideograph */ + ["\u60E1", "\u60E1"], /* CJK Ideograph */ + ["\u60E2", "\u60E2"], /* CJK Ideograph */ + ["\u60E3", "\u60E3"], /* CJK Ideograph */ + ["\u60E4", "\u60E4"], /* CJK Ideograph */ + ["\u60E5", "\u60E5"], /* CJK Ideograph */ + ["\u60E6", "\u60E6"], /* CJK Ideograph */ + ["\u60E7", "\u60E7"], /* CJK Ideograph */ + ["\u60E8", "\u60E8"], /* CJK Ideograph */ + ["\u60E9", "\u60E9"], /* CJK Ideograph */ + ["\u60EA", "\u60EA"], /* CJK Ideograph */ + ["\u60EB", "\u60EB"], /* CJK Ideograph */ + ["\u60EC", "\u60EC"], /* CJK Ideograph */ + ["\u60ED", "\u60ED"], /* CJK Ideograph */ + ["\u60EE", "\u60EE"], /* CJK Ideograph */ + ["\u60EF", "\u60EF"], /* CJK Ideograph */ + ["\u60F0", "\u60F0"], /* CJK Ideograph */ + ["\u60F1", "\u60F1"], /* CJK Ideograph */ + ["\u60F2", "\u60F2"], /* CJK Ideograph */ + ["\u60F3", "\u60F3"], /* CJK Ideograph */ + ["\u60F4", "\u60F4"], /* CJK Ideograph */ + ["\u60F5", "\u60F5"], /* CJK Ideograph */ + ["\u60F6", "\u60F6"], /* CJK Ideograph */ + ["\u60F7", "\u60F7"], /* CJK Ideograph */ + ["\u60F8", "\u60F8"], /* CJK Ideograph */ + ["\u60F9", "\u60F9"], /* CJK Ideograph */ + ["\u60FA", "\u60FA"], /* CJK Ideograph */ + ["\u60FB", "\u60FB"], /* CJK Ideograph */ + ["\u60FC", "\u60FC"], /* CJK Ideograph */ + ["\u60FD", "\u60FD"], /* CJK Ideograph */ + ["\u60FE", "\u60FE"], /* CJK Ideograph */ + ["\u60FF", "\u60FF"], /* CJK Ideograph */ + ["\u6100", "\u6100"], /* CJK Ideograph */ + ["\u6101", "\u6101"], /* CJK Ideograph */ + ["\u6102", "\u6102"], /* CJK Ideograph */ + ["\u6103", "\u6103"], /* CJK Ideograph */ + ["\u6104", "\u6104"], /* CJK Ideograph */ + ["\u6105", "\u6105"], /* CJK Ideograph */ + ["\u6106", "\u6106"], /* CJK Ideograph */ + ["\u6107", "\u6107"], /* CJK Ideograph */ + ["\u6108", "\u6108"], /* CJK Ideograph */ + ["\u6109", "\u6109"], /* CJK Ideograph */ + ["\u610A", "\u610A"], /* CJK Ideograph */ + ["\u610B", "\u610B"], /* CJK Ideograph */ + ["\u610C", "\u610C"], /* CJK Ideograph */ + ["\u610D", "\u610D"], /* CJK Ideograph */ + ["\u610E", "\u610E"], /* CJK Ideograph */ + ["\u610F", "\u610F"], /* CJK Ideograph */ + ["\u6110", "\u6110"], /* CJK Ideograph */ + ["\u6111", "\u6111"], /* CJK Ideograph */ + ["\u6112", "\u6112"], /* CJK Ideograph */ + ["\u6113", "\u6113"], /* CJK Ideograph */ + ["\u6114", "\u6114"], /* CJK Ideograph */ + ["\u6115", "\u6115"], /* CJK Ideograph */ + ["\u6116", "\u6116"], /* CJK Ideograph */ + ["\u6117", "\u6117"], /* CJK Ideograph */ + ["\u6118", "\u6118"], /* CJK Ideograph */ + ["\u6119", "\u6119"], /* CJK Ideograph */ + ["\u611A", "\u611A"], /* CJK Ideograph */ + ["\u611B", "\u611B"], /* CJK Ideograph */ + ["\u611C", "\u611C"], /* CJK Ideograph */ + ["\u611D", "\u611D"], /* CJK Ideograph */ + ["\u611E", "\u611E"], /* CJK Ideograph */ + ["\u611F", "\u611F"], /* CJK Ideograph */ + ["\u6120", "\u6120"], /* CJK Ideograph */ + ["\u6121", "\u6121"], /* CJK Ideograph */ + ["\u6122", "\u6122"], /* CJK Ideograph */ + ["\u6123", "\u6123"], /* CJK Ideograph */ + ["\u6124", "\u6124"], /* CJK Ideograph */ + ["\u6125", "\u6125"], /* CJK Ideograph */ + ["\u6126", "\u6126"], /* CJK Ideograph */ + ["\u6127", "\u6127"], /* CJK Ideograph */ + ["\u6128", "\u6128"], /* CJK Ideograph */ + ["\u6129", "\u6129"], /* CJK Ideograph */ + ["\u612A", "\u612A"], /* CJK Ideograph */ + ["\u612B", "\u612B"], /* CJK Ideograph */ + ["\u612C", "\u612C"], /* CJK Ideograph */ + ["\u612D", "\u612D"], /* CJK Ideograph */ + ["\u612E", "\u612E"], /* CJK Ideograph */ + ["\u612F", "\u612F"], /* CJK Ideograph */ + ["\u6130", "\u6130"], /* CJK Ideograph */ + ["\u6131", "\u6131"], /* CJK Ideograph */ + ["\u6132", "\u6132"], /* CJK Ideograph */ + ["\u6133", "\u6133"], /* CJK Ideograph */ + ["\u6134", "\u6134"], /* CJK Ideograph */ + ["\u6135", "\u6135"], /* CJK Ideograph */ + ["\u6136", "\u6136"], /* CJK Ideograph */ + ["\u6137", "\u6137"], /* CJK Ideograph */ + ["\u6138", "\u6138"], /* CJK Ideograph */ + ["\u6139", "\u6139"], /* CJK Ideograph */ + ["\u613A", "\u613A"], /* CJK Ideograph */ + ["\u613B", "\u613B"], /* CJK Ideograph */ + ["\u613C", "\u613C"], /* CJK Ideograph */ + ["\u613D", "\u613D"], /* CJK Ideograph */ + ["\u613E", "\u613E"], /* CJK Ideograph */ + ["\u613F", "\u613F"], /* CJK Ideograph */ + ["\u6140", "\u6140"], /* CJK Ideograph */ + ["\u6141", "\u6141"], /* CJK Ideograph */ + ["\u6142", "\u6142"], /* CJK Ideograph */ + ["\u6143", "\u6143"], /* CJK Ideograph */ + ["\u6144", "\u6144"], /* CJK Ideograph */ + ["\u6145", "\u6145"], /* CJK Ideograph */ + ["\u6146", "\u6146"], /* CJK Ideograph */ + ["\u6147", "\u6147"], /* CJK Ideograph */ + ["\u6148", "\u6148"], /* CJK Ideograph */ + ["\u6149", "\u6149"], /* CJK Ideograph */ + ["\u614A", "\u614A"], /* CJK Ideograph */ + ["\u614B", "\u614B"], /* CJK Ideograph */ + ["\u614C", "\u614C"], /* CJK Ideograph */ + ["\u614D", "\u614D"], /* CJK Ideograph */ + ["\u614E", "\u614E"], /* CJK Ideograph */ + ["\u614F", "\u614F"], /* CJK Ideograph */ + ["\u6150", "\u6150"], /* CJK Ideograph */ + ["\u6151", "\u6151"], /* CJK Ideograph */ + ["\u6152", "\u6152"], /* CJK Ideograph */ + ["\u6153", "\u6153"], /* CJK Ideograph */ + ["\u6154", "\u6154"], /* CJK Ideograph */ + ["\u6155", "\u6155"], /* CJK Ideograph */ + ["\u6156", "\u6156"], /* CJK Ideograph */ + ["\u6157", "\u6157"], /* CJK Ideograph */ + ["\u6158", "\u6158"], /* CJK Ideograph */ + ["\u6159", "\u6159"], /* CJK Ideograph */ + ["\u615A", "\u615A"], /* CJK Ideograph */ + ["\u615B", "\u615B"], /* CJK Ideograph */ + ["\u615C", "\u615C"], /* CJK Ideograph */ + ["\u615D", "\u615D"], /* CJK Ideograph */ + ["\u615E", "\u615E"], /* CJK Ideograph */ + ["\u615F", "\u615F"], /* CJK Ideograph */ + ["\u6160", "\u6160"], /* CJK Ideograph */ + ["\u6161", "\u6161"], /* CJK Ideograph */ + ["\u6162", "\u6162"], /* CJK Ideograph */ + ["\u6163", "\u6163"], /* CJK Ideograph */ + ["\u6164", "\u6164"], /* CJK Ideograph */ + ["\u6165", "\u6165"], /* CJK Ideograph */ + ["\u6166", "\u6166"], /* CJK Ideograph */ + ["\u6167", "\u6167"], /* CJK Ideograph */ + ["\u6168", "\u6168"], /* CJK Ideograph */ + ["\u6169", "\u6169"], /* CJK Ideograph */ + ["\u616A", "\u616A"], /* CJK Ideograph */ + ["\u616B", "\u616B"], /* CJK Ideograph */ + ["\u616C", "\u616C"], /* CJK Ideograph */ + ["\u616D", "\u616D"], /* CJK Ideograph */ + ["\u616E", "\u616E"], /* CJK Ideograph */ + ["\u616F", "\u616F"], /* CJK Ideograph */ + ["\u6170", "\u6170"], /* CJK Ideograph */ + ["\u6171", "\u6171"], /* CJK Ideograph */ + ["\u6172", "\u6172"], /* CJK Ideograph */ + ["\u6173", "\u6173"], /* CJK Ideograph */ + ["\u6174", "\u6174"], /* CJK Ideograph */ + ["\u6175", "\u6175"], /* CJK Ideograph */ + ["\u6176", "\u6176"], /* CJK Ideograph */ + ["\u6177", "\u6177"], /* CJK Ideograph */ + ["\u6178", "\u6178"], /* CJK Ideograph */ + ["\u6179", "\u6179"], /* CJK Ideograph */ + ["\u617A", "\u617A"], /* CJK Ideograph */ + ["\u617B", "\u617B"], /* CJK Ideograph */ + ["\u617C", "\u617C"], /* CJK Ideograph */ + ["\u617D", "\u617D"], /* CJK Ideograph */ + ["\u617E", "\u617E"], /* CJK Ideograph */ + ["\u617F", "\u617F"], /* CJK Ideograph */ + ["\u6180", "\u6180"], /* CJK Ideograph */ + ["\u6181", "\u6181"], /* CJK Ideograph */ + ["\u6182", "\u6182"], /* CJK Ideograph */ + ["\u6183", "\u6183"], /* CJK Ideograph */ + ["\u6184", "\u6184"], /* CJK Ideograph */ + ["\u6185", "\u6185"], /* CJK Ideograph */ + ["\u6186", "\u6186"], /* CJK Ideograph */ + ["\u6187", "\u6187"], /* CJK Ideograph */ + ["\u6188", "\u6188"], /* CJK Ideograph */ + ["\u6189", "\u6189"], /* CJK Ideograph */ + ["\u618A", "\u618A"], /* CJK Ideograph */ + ["\u618B", "\u618B"], /* CJK Ideograph */ + ["\u618C", "\u618C"], /* CJK Ideograph */ + ["\u618D", "\u618D"], /* CJK Ideograph */ + ["\u618E", "\u618E"], /* CJK Ideograph */ + ["\u618F", "\u618F"], /* CJK Ideograph */ + ["\u6190", "\u6190"], /* CJK Ideograph */ + ["\u6191", "\u6191"], /* CJK Ideograph */ + ["\u6192", "\u6192"], /* CJK Ideograph */ + ["\u6193", "\u6193"], /* CJK Ideograph */ + ["\u6194", "\u6194"], /* CJK Ideograph */ + ["\u6195", "\u6195"], /* CJK Ideograph */ + ["\u6196", "\u6196"], /* CJK Ideograph */ + ["\u6197", "\u6197"], /* CJK Ideograph */ + ["\u6198", "\u6198"], /* CJK Ideograph */ + ["\u6199", "\u6199"], /* CJK Ideograph */ + ["\u619A", "\u619A"], /* CJK Ideograph */ + ["\u619B", "\u619B"], /* CJK Ideograph */ + ["\u619C", "\u619C"], /* CJK Ideograph */ + ["\u619D", "\u619D"], /* CJK Ideograph */ + ["\u619E", "\u619E"], /* CJK Ideograph */ + ["\u619F", "\u619F"], /* CJK Ideograph */ + ["\u61A0", "\u61A0"], /* CJK Ideograph */ + ["\u61A1", "\u61A1"], /* CJK Ideograph */ + ["\u61A2", "\u61A2"], /* CJK Ideograph */ + ["\u61A3", "\u61A3"], /* CJK Ideograph */ + ["\u61A4", "\u61A4"], /* CJK Ideograph */ + ["\u61A5", "\u61A5"], /* CJK Ideograph */ + ["\u61A6", "\u61A6"], /* CJK Ideograph */ + ["\u61A7", "\u61A7"], /* CJK Ideograph */ + ["\u61A8", "\u61A8"], /* CJK Ideograph */ + ["\u61A9", "\u61A9"], /* CJK Ideograph */ + ["\u61AA", "\u61AA"], /* CJK Ideograph */ + ["\u61AB", "\u61AB"], /* CJK Ideograph */ + ["\u61AC", "\u61AC"], /* CJK Ideograph */ + ["\u61AD", "\u61AD"], /* CJK Ideograph */ + ["\u61AE", "\u61AE"], /* CJK Ideograph */ + ["\u61AF", "\u61AF"], /* CJK Ideograph */ + ["\u61B0", "\u61B0"], /* CJK Ideograph */ + ["\u61B1", "\u61B1"], /* CJK Ideograph */ + ["\u61B2", "\u61B2"], /* CJK Ideograph */ + ["\u61B3", "\u61B3"], /* CJK Ideograph */ + ["\u61B4", "\u61B4"], /* CJK Ideograph */ + ["\u61B5", "\u61B5"], /* CJK Ideograph */ + ["\u61B6", "\u61B6"], /* CJK Ideograph */ + ["\u61B7", "\u61B7"], /* CJK Ideograph */ + ["\u61B8", "\u61B8"], /* CJK Ideograph */ + ["\u61B9", "\u61B9"], /* CJK Ideograph */ + ["\u61BA", "\u61BA"], /* CJK Ideograph */ + ["\u61BB", "\u61BB"], /* CJK Ideograph */ + ["\u61BC", "\u61BC"], /* CJK Ideograph */ + ["\u61BD", "\u61BD"], /* CJK Ideograph */ + ["\u61BE", "\u61BE"], /* CJK Ideograph */ + ["\u61BF", "\u61BF"], /* CJK Ideograph */ + ["\u61C0", "\u61C0"], /* CJK Ideograph */ + ["\u61C1", "\u61C1"], /* CJK Ideograph */ + ["\u61C2", "\u61C2"], /* CJK Ideograph */ + ["\u61C3", "\u61C3"], /* CJK Ideograph */ + ["\u61C4", "\u61C4"], /* CJK Ideograph */ + ["\u61C5", "\u61C5"], /* CJK Ideograph */ + ["\u61C6", "\u61C6"], /* CJK Ideograph */ + ["\u61C7", "\u61C7"], /* CJK Ideograph */ + ["\u61C8", "\u61C8"], /* CJK Ideograph */ + ["\u61C9", "\u61C9"], /* CJK Ideograph */ + ["\u61CA", "\u61CA"], /* CJK Ideograph */ + ["\u61CB", "\u61CB"], /* CJK Ideograph */ + ["\u61CC", "\u61CC"], /* CJK Ideograph */ + ["\u61CD", "\u61CD"], /* CJK Ideograph */ + ["\u61CE", "\u61CE"], /* CJK Ideograph */ + ["\u61CF", "\u61CF"], /* CJK Ideograph */ + ["\u61D0", "\u61D0"], /* CJK Ideograph */ + ["\u61D1", "\u61D1"], /* CJK Ideograph */ + ["\u61D2", "\u61D2"], /* CJK Ideograph */ + ["\u61D3", "\u61D3"], /* CJK Ideograph */ + ["\u61D4", "\u61D4"], /* CJK Ideograph */ + ["\u61D5", "\u61D5"], /* CJK Ideograph */ + ["\u61D6", "\u61D6"], /* CJK Ideograph */ + ["\u61D7", "\u61D7"], /* CJK Ideograph */ + ["\u61D8", "\u61D8"], /* CJK Ideograph */ + ["\u61D9", "\u61D9"], /* CJK Ideograph */ + ["\u61DA", "\u61DA"], /* CJK Ideograph */ + ["\u61DB", "\u61DB"], /* CJK Ideograph */ + ["\u61DC", "\u61DC"], /* CJK Ideograph */ + ["\u61DD", "\u61DD"], /* CJK Ideograph */ + ["\u61DE", "\u61DE"], /* CJK Ideograph */ + ["\u61DF", "\u61DF"], /* CJK Ideograph */ + ["\u61E0", "\u61E0"], /* CJK Ideograph */ + ["\u61E1", "\u61E1"], /* CJK Ideograph */ + ["\u61E2", "\u61E2"], /* CJK Ideograph */ + ["\u61E3", "\u61E3"], /* CJK Ideograph */ + ["\u61E4", "\u61E4"], /* CJK Ideograph */ + ["\u61E5", "\u61E5"], /* CJK Ideograph */ + ["\u61E6", "\u61E6"], /* CJK Ideograph */ + ["\u61E7", "\u61E7"], /* CJK Ideograph */ + ["\u61E8", "\u61E8"], /* CJK Ideograph */ + ["\u61E9", "\u61E9"], /* CJK Ideograph */ + ["\u61EA", "\u61EA"], /* CJK Ideograph */ + ["\u61EB", "\u61EB"], /* CJK Ideograph */ + ["\u61EC", "\u61EC"], /* CJK Ideograph */ + ["\u61ED", "\u61ED"], /* CJK Ideograph */ + ["\u61EE", "\u61EE"], /* CJK Ideograph */ + ["\u61EF", "\u61EF"], /* CJK Ideograph */ + ["\u61F0", "\u61F0"], /* CJK Ideograph */ + ["\u61F1", "\u61F1"], /* CJK Ideograph */ + ["\u61F2", "\u61F2"], /* CJK Ideograph */ + ["\u61F3", "\u61F3"], /* CJK Ideograph */ + ["\u61F4", "\u61F4"], /* CJK Ideograph */ + ["\u61F5", "\u61F5"], /* CJK Ideograph */ + ["\u61F6", "\u61F6"], /* CJK Ideograph */ + ["\u61F7", "\u61F7"], /* CJK Ideograph */ + ["\u61F8", "\u61F8"], /* CJK Ideograph */ + ["\u61F9", "\u61F9"], /* CJK Ideograph */ + ["\u61FA", "\u61FA"], /* CJK Ideograph */ + ["\u61FB", "\u61FB"], /* CJK Ideograph */ + ["\u61FC", "\u61FC"], /* CJK Ideograph */ + ["\u61FD", "\u61FD"], /* CJK Ideograph */ + ["\u61FE", "\u61FE"], /* CJK Ideograph */ + ["\u61FF", "\u61FF"], /* CJK Ideograph */ + ["\u6200", "\u6200"], /* CJK Ideograph */ + ["\u6201", "\u6201"], /* CJK Ideograph */ + ["\u6202", "\u6202"], /* CJK Ideograph */ + ["\u6203", "\u6203"], /* CJK Ideograph */ + ["\u6204", "\u6204"], /* CJK Ideograph */ + ["\u6205", "\u6205"], /* CJK Ideograph */ + ["\u6206", "\u6206"], /* CJK Ideograph */ + ["\u6207", "\u6207"], /* CJK Ideograph */ + ["\u6208", "\u6208"], /* CJK Ideograph */ + ["\u6209", "\u6209"], /* CJK Ideograph */ + ["\u620A", "\u620A"], /* CJK Ideograph */ + ["\u620B", "\u620B"], /* CJK Ideograph */ + ["\u620C", "\u620C"], /* CJK Ideograph */ + ["\u620D", "\u620D"], /* CJK Ideograph */ + ["\u620E", "\u620E"], /* CJK Ideograph */ + ["\u620F", "\u620F"], /* CJK Ideograph */ + ["\u6210", "\u6210"], /* CJK Ideograph */ + ["\u6211", "\u6211"], /* CJK Ideograph */ + ["\u6212", "\u6212"], /* CJK Ideograph */ + ["\u6213", "\u6213"], /* CJK Ideograph */ + ["\u6214", "\u6214"], /* CJK Ideograph */ + ["\u6215", "\u6215"], /* CJK Ideograph */ + ["\u6216", "\u6216"], /* CJK Ideograph */ + ["\u6217", "\u6217"], /* CJK Ideograph */ + ["\u6218", "\u6218"], /* CJK Ideograph */ + ["\u6219", "\u6219"], /* CJK Ideograph */ + ["\u621A", "\u621A"], /* CJK Ideograph */ + ["\u621B", "\u621B"], /* CJK Ideograph */ + ["\u621C", "\u621C"], /* CJK Ideograph */ + ["\u621D", "\u621D"], /* CJK Ideograph */ + ["\u621E", "\u621E"], /* CJK Ideograph */ + ["\u621F", "\u621F"], /* CJK Ideograph */ + ["\u6220", "\u6220"], /* CJK Ideograph */ + ["\u6221", "\u6221"], /* CJK Ideograph */ + ["\u6222", "\u6222"], /* CJK Ideograph */ + ["\u6223", "\u6223"], /* CJK Ideograph */ + ["\u6224", "\u6224"], /* CJK Ideograph */ + ["\u6225", "\u6225"], /* CJK Ideograph */ + ["\u6226", "\u6226"], /* CJK Ideograph */ + ["\u6227", "\u6227"], /* CJK Ideograph */ + ["\u6228", "\u6228"], /* CJK Ideograph */ + ["\u6229", "\u6229"], /* CJK Ideograph */ + ["\u622A", "\u622A"], /* CJK Ideograph */ + ["\u622B", "\u622B"], /* CJK Ideograph */ + ["\u622C", "\u622C"], /* CJK Ideograph */ + ["\u622D", "\u622D"], /* CJK Ideograph */ + ["\u622E", "\u622E"], /* CJK Ideograph */ + ["\u622F", "\u622F"], /* CJK Ideograph */ + ["\u6230", "\u6230"], /* CJK Ideograph */ + ["\u6231", "\u6231"], /* CJK Ideograph */ + ["\u6232", "\u6232"], /* CJK Ideograph */ + ["\u6233", "\u6233"], /* CJK Ideograph */ + ["\u6234", "\u6234"], /* CJK Ideograph */ + ["\u6235", "\u6235"], /* CJK Ideograph */ + ["\u6236", "\u6236"], /* CJK Ideograph */ + ["\u6237", "\u6237"], /* CJK Ideograph */ + ["\u6238", "\u6238"], /* CJK Ideograph */ + ["\u6239", "\u6239"], /* CJK Ideograph */ + ["\u623A", "\u623A"], /* CJK Ideograph */ + ["\u623B", "\u623B"], /* CJK Ideograph */ + ["\u623C", "\u623C"], /* CJK Ideograph */ + ["\u623D", "\u623D"], /* CJK Ideograph */ + ["\u623E", "\u623E"], /* CJK Ideograph */ + ["\u623F", "\u623F"], /* CJK Ideograph */ + ["\u6240", "\u6240"], /* CJK Ideograph */ + ["\u6241", "\u6241"], /* CJK Ideograph */ + ["\u6242", "\u6242"], /* CJK Ideograph */ + ["\u6243", "\u6243"], /* CJK Ideograph */ + ["\u6244", "\u6244"], /* CJK Ideograph */ + ["\u6245", "\u6245"], /* CJK Ideograph */ + ["\u6246", "\u6246"], /* CJK Ideograph */ + ["\u6247", "\u6247"], /* CJK Ideograph */ + ["\u6248", "\u6248"], /* CJK Ideograph */ + ["\u6249", "\u6249"], /* CJK Ideograph */ + ["\u624A", "\u624A"], /* CJK Ideograph */ + ["\u624B", "\u624B"], /* CJK Ideograph */ + ["\u624C", "\u624C"], /* CJK Ideograph */ + ["\u624D", "\u624D"], /* CJK Ideograph */ + ["\u624E", "\u624E"], /* CJK Ideograph */ + ["\u624F", "\u624F"], /* CJK Ideograph */ + ["\u6250", "\u6250"], /* CJK Ideograph */ + ["\u6251", "\u6251"], /* CJK Ideograph */ + ["\u6252", "\u6252"], /* CJK Ideograph */ + ["\u6253", "\u6253"], /* CJK Ideograph */ + ["\u6254", "\u6254"], /* CJK Ideograph */ + ["\u6255", "\u6255"], /* CJK Ideograph */ + ["\u6256", "\u6256"], /* CJK Ideograph */ + ["\u6257", "\u6257"], /* CJK Ideograph */ + ["\u6258", "\u6258"], /* CJK Ideograph */ + ["\u6259", "\u6259"], /* CJK Ideograph */ + ["\u625A", "\u625A"], /* CJK Ideograph */ + ["\u625B", "\u625B"], /* CJK Ideograph */ + ["\u625C", "\u625C"], /* CJK Ideograph */ + ["\u625D", "\u625D"], /* CJK Ideograph */ + ["\u625E", "\u625E"], /* CJK Ideograph */ + ["\u625F", "\u625F"], /* CJK Ideograph */ + ["\u6260", "\u6260"], /* CJK Ideograph */ + ["\u6261", "\u6261"], /* CJK Ideograph */ + ["\u6262", "\u6262"], /* CJK Ideograph */ + ["\u6263", "\u6263"], /* CJK Ideograph */ + ["\u6264", "\u6264"], /* CJK Ideograph */ + ["\u6265", "\u6265"], /* CJK Ideograph */ + ["\u6266", "\u6266"], /* CJK Ideograph */ + ["\u6267", "\u6267"], /* CJK Ideograph */ + ["\u6268", "\u6268"], /* CJK Ideograph */ + ["\u6269", "\u6269"], /* CJK Ideograph */ + ["\u626A", "\u626A"], /* CJK Ideograph */ + ["\u626B", "\u626B"], /* CJK Ideograph */ + ["\u626C", "\u626C"], /* CJK Ideograph */ + ["\u626D", "\u626D"], /* CJK Ideograph */ + ["\u626E", "\u626E"], /* CJK Ideograph */ + ["\u626F", "\u626F"], /* CJK Ideograph */ + ["\u6270", "\u6270"], /* CJK Ideograph */ + ["\u6271", "\u6271"], /* CJK Ideograph */ + ["\u6272", "\u6272"], /* CJK Ideograph */ + ["\u6273", "\u6273"], /* CJK Ideograph */ + ["\u6274", "\u6274"], /* CJK Ideograph */ + ["\u6275", "\u6275"], /* CJK Ideograph */ + ["\u6276", "\u6276"], /* CJK Ideograph */ + ["\u6277", "\u6277"], /* CJK Ideograph */ + ["\u6278", "\u6278"], /* CJK Ideograph */ + ["\u6279", "\u6279"], /* CJK Ideograph */ + ["\u627A", "\u627A"], /* CJK Ideograph */ + ["\u627B", "\u627B"], /* CJK Ideograph */ + ["\u627C", "\u627C"], /* CJK Ideograph */ + ["\u627D", "\u627D"], /* CJK Ideograph */ + ["\u627E", "\u627E"], /* CJK Ideograph */ + ["\u627F", "\u627F"], /* CJK Ideograph */ + ["\u6280", "\u6280"], /* CJK Ideograph */ + ["\u6281", "\u6281"], /* CJK Ideograph */ + ["\u6282", "\u6282"], /* CJK Ideograph */ + ["\u6283", "\u6283"], /* CJK Ideograph */ + ["\u6284", "\u6284"], /* CJK Ideograph */ + ["\u6285", "\u6285"], /* CJK Ideograph */ + ["\u6286", "\u6286"], /* CJK Ideograph */ + ["\u6287", "\u6287"], /* CJK Ideograph */ + ["\u6288", "\u6288"], /* CJK Ideograph */ + ["\u6289", "\u6289"], /* CJK Ideograph */ + ["\u628A", "\u628A"], /* CJK Ideograph */ + ["\u628B", "\u628B"], /* CJK Ideograph */ + ["\u628C", "\u628C"], /* CJK Ideograph */ + ["\u628D", "\u628D"], /* CJK Ideograph */ + ["\u628E", "\u628E"], /* CJK Ideograph */ + ["\u628F", "\u628F"], /* CJK Ideograph */ + ["\u6290", "\u6290"], /* CJK Ideograph */ + ["\u6291", "\u6291"], /* CJK Ideograph */ + ["\u6292", "\u6292"], /* CJK Ideograph */ + ["\u6293", "\u6293"], /* CJK Ideograph */ + ["\u6294", "\u6294"], /* CJK Ideograph */ + ["\u6295", "\u6295"], /* CJK Ideograph */ + ["\u6296", "\u6296"], /* CJK Ideograph */ + ["\u6297", "\u6297"], /* CJK Ideograph */ + ["\u6298", "\u6298"], /* CJK Ideograph */ + ["\u6299", "\u6299"], /* CJK Ideograph */ + ["\u629A", "\u629A"], /* CJK Ideograph */ + ["\u629B", "\u629B"], /* CJK Ideograph */ + ["\u629C", "\u629C"], /* CJK Ideograph */ + ["\u629D", "\u629D"], /* CJK Ideograph */ + ["\u629E", "\u629E"], /* CJK Ideograph */ + ["\u629F", "\u629F"], /* CJK Ideograph */ + ["\u62A0", "\u62A0"], /* CJK Ideograph */ + ["\u62A1", "\u62A1"], /* CJK Ideograph */ + ["\u62A2", "\u62A2"], /* CJK Ideograph */ + ["\u62A3", "\u62A3"], /* CJK Ideograph */ + ["\u62A4", "\u62A4"], /* CJK Ideograph */ + ["\u62A5", "\u62A5"], /* CJK Ideograph */ + ["\u62A6", "\u62A6"], /* CJK Ideograph */ + ["\u62A7", "\u62A7"], /* CJK Ideograph */ + ["\u62A8", "\u62A8"], /* CJK Ideograph */ + ["\u62A9", "\u62A9"], /* CJK Ideograph */ + ["\u62AA", "\u62AA"], /* CJK Ideograph */ + ["\u62AB", "\u62AB"], /* CJK Ideograph */ + ["\u62AC", "\u62AC"], /* CJK Ideograph */ + ["\u62AD", "\u62AD"], /* CJK Ideograph */ + ["\u62AE", "\u62AE"], /* CJK Ideograph */ + ["\u62AF", "\u62AF"], /* CJK Ideograph */ + ["\u62B0", "\u62B0"], /* CJK Ideograph */ + ["\u62B1", "\u62B1"], /* CJK Ideograph */ + ["\u62B2", "\u62B2"], /* CJK Ideograph */ + ["\u62B3", "\u62B3"], /* CJK Ideograph */ + ["\u62B4", "\u62B4"], /* CJK Ideograph */ + ["\u62B5", "\u62B5"], /* CJK Ideograph */ + ["\u62B6", "\u62B6"], /* CJK Ideograph */ + ["\u62B7", "\u62B7"], /* CJK Ideograph */ + ["\u62B8", "\u62B8"], /* CJK Ideograph */ + ["\u62B9", "\u62B9"], /* CJK Ideograph */ + ["\u62BA", "\u62BA"], /* CJK Ideograph */ + ["\u62BB", "\u62BB"], /* CJK Ideograph */ + ["\u62BC", "\u62BC"], /* CJK Ideograph */ + ["\u62BD", "\u62BD"], /* CJK Ideograph */ + ["\u62BE", "\u62BE"], /* CJK Ideograph */ + ["\u62BF", "\u62BF"], /* CJK Ideograph */ + ["\u62C0", "\u62C0"], /* CJK Ideograph */ + ["\u62C1", "\u62C1"], /* CJK Ideograph */ + ["\u62C2", "\u62C2"], /* CJK Ideograph */ + ["\u62C3", "\u62C3"], /* CJK Ideograph */ + ["\u62C4", "\u62C4"], /* CJK Ideograph */ + ["\u62C5", "\u62C5"], /* CJK Ideograph */ + ["\u62C6", "\u62C6"], /* CJK Ideograph */ + ["\u62C7", "\u62C7"], /* CJK Ideograph */ + ["\u62C8", "\u62C8"], /* CJK Ideograph */ + ["\u62C9", "\u62C9"], /* CJK Ideograph */ + ["\u62CA", "\u62CA"], /* CJK Ideograph */ + ["\u62CB", "\u62CB"], /* CJK Ideograph */ + ["\u62CC", "\u62CC"], /* CJK Ideograph */ + ["\u62CD", "\u62CD"], /* CJK Ideograph */ + ["\u62CE", "\u62CE"], /* CJK Ideograph */ + ["\u62CF", "\u62CF"], /* CJK Ideograph */ + ["\u62D0", "\u62D0"], /* CJK Ideograph */ + ["\u62D1", "\u62D1"], /* CJK Ideograph */ + ["\u62D2", "\u62D2"], /* CJK Ideograph */ + ["\u62D3", "\u62D3"], /* CJK Ideograph */ + ["\u62D4", "\u62D4"], /* CJK Ideograph */ + ["\u62D5", "\u62D5"], /* CJK Ideograph */ + ["\u62D6", "\u62D6"], /* CJK Ideograph */ + ["\u62D7", "\u62D7"], /* CJK Ideograph */ + ["\u62D8", "\u62D8"], /* CJK Ideograph */ + ["\u62D9", "\u62D9"], /* CJK Ideograph */ + ["\u62DA", "\u62DA"], /* CJK Ideograph */ + ["\u62DB", "\u62DB"], /* CJK Ideograph */ + ["\u62DC", "\u62DC"], /* CJK Ideograph */ + ["\u62DD", "\u62DD"], /* CJK Ideograph */ + ["\u62DE", "\u62DE"], /* CJK Ideograph */ + ["\u62DF", "\u62DF"], /* CJK Ideograph */ + ["\u62E0", "\u62E0"], /* CJK Ideograph */ + ["\u62E1", "\u62E1"], /* CJK Ideograph */ + ["\u62E2", "\u62E2"], /* CJK Ideograph */ + ["\u62E3", "\u62E3"], /* CJK Ideograph */ + ["\u62E4", "\u62E4"], /* CJK Ideograph */ + ["\u62E5", "\u62E5"], /* CJK Ideograph */ + ["\u62E6", "\u62E6"], /* CJK Ideograph */ + ["\u62E7", "\u62E7"], /* CJK Ideograph */ + ["\u62E8", "\u62E8"], /* CJK Ideograph */ + ["\u62E9", "\u62E9"], /* CJK Ideograph */ + ["\u62EA", "\u62EA"], /* CJK Ideograph */ + ["\u62EB", "\u62EB"], /* CJK Ideograph */ + ["\u62EC", "\u62EC"], /* CJK Ideograph */ + ["\u62ED", "\u62ED"], /* CJK Ideograph */ + ["\u62EE", "\u62EE"], /* CJK Ideograph */ + ["\u62EF", "\u62EF"], /* CJK Ideograph */ + ["\u62F0", "\u62F0"], /* CJK Ideograph */ + ["\u62F1", "\u62F1"], /* CJK Ideograph */ + ["\u62F2", "\u62F2"], /* CJK Ideograph */ + ["\u62F3", "\u62F3"], /* CJK Ideograph */ + ["\u62F4", "\u62F4"], /* CJK Ideograph */ + ["\u62F5", "\u62F5"], /* CJK Ideograph */ + ["\u62F6", "\u62F6"], /* CJK Ideograph */ + ["\u62F7", "\u62F7"], /* CJK Ideograph */ + ["\u62F8", "\u62F8"], /* CJK Ideograph */ + ["\u62F9", "\u62F9"], /* CJK Ideograph */ + ["\u62FA", "\u62FA"], /* CJK Ideograph */ + ["\u62FB", "\u62FB"], /* CJK Ideograph */ + ["\u62FC", "\u62FC"], /* CJK Ideograph */ + ["\u62FD", "\u62FD"], /* CJK Ideograph */ + ["\u62FE", "\u62FE"], /* CJK Ideograph */ + ["\u62FF", "\u62FF"], /* CJK Ideograph */ + ["\u6300", "\u6300"], /* CJK Ideograph */ + ["\u6301", "\u6301"], /* CJK Ideograph */ + ["\u6302", "\u6302"], /* CJK Ideograph */ + ["\u6303", "\u6303"], /* CJK Ideograph */ + ["\u6304", "\u6304"], /* CJK Ideograph */ + ["\u6305", "\u6305"], /* CJK Ideograph */ + ["\u6306", "\u6306"], /* CJK Ideograph */ + ["\u6307", "\u6307"], /* CJK Ideograph */ + ["\u6308", "\u6308"], /* CJK Ideograph */ + ["\u6309", "\u6309"], /* CJK Ideograph */ + ["\u630A", "\u630A"], /* CJK Ideograph */ + ["\u630B", "\u630B"], /* CJK Ideograph */ + ["\u630C", "\u630C"], /* CJK Ideograph */ + ["\u630D", "\u630D"], /* CJK Ideograph */ + ["\u630E", "\u630E"], /* CJK Ideograph */ + ["\u630F", "\u630F"], /* CJK Ideograph */ + ["\u6310", "\u6310"], /* CJK Ideograph */ + ["\u6311", "\u6311"], /* CJK Ideograph */ + ["\u6312", "\u6312"], /* CJK Ideograph */ + ["\u6313", "\u6313"], /* CJK Ideograph */ + ["\u6314", "\u6314"], /* CJK Ideograph */ + ["\u6315", "\u6315"], /* CJK Ideograph */ + ["\u6316", "\u6316"], /* CJK Ideograph */ + ["\u6317", "\u6317"], /* CJK Ideograph */ + ["\u6318", "\u6318"], /* CJK Ideograph */ + ["\u6319", "\u6319"], /* CJK Ideograph */ + ["\u631A", "\u631A"], /* CJK Ideograph */ + ["\u631B", "\u631B"], /* CJK Ideograph */ + ["\u631C", "\u631C"], /* CJK Ideograph */ + ["\u631D", "\u631D"], /* CJK Ideograph */ + ["\u631E", "\u631E"], /* CJK Ideograph */ + ["\u631F", "\u631F"], /* CJK Ideograph */ + ["\u6320", "\u6320"], /* CJK Ideograph */ + ["\u6321", "\u6321"], /* CJK Ideograph */ + ["\u6322", "\u6322"], /* CJK Ideograph */ + ["\u6323", "\u6323"], /* CJK Ideograph */ + ["\u6324", "\u6324"], /* CJK Ideograph */ + ["\u6325", "\u6325"], /* CJK Ideograph */ + ["\u6326", "\u6326"], /* CJK Ideograph */ + ["\u6327", "\u6327"], /* CJK Ideograph */ + ["\u6328", "\u6328"], /* CJK Ideograph */ + ["\u6329", "\u6329"], /* CJK Ideograph */ + ["\u632A", "\u632A"], /* CJK Ideograph */ + ["\u632B", "\u632B"], /* CJK Ideograph */ + ["\u632C", "\u632C"], /* CJK Ideograph */ + ["\u632D", "\u632D"], /* CJK Ideograph */ + ["\u632E", "\u632E"], /* CJK Ideograph */ + ["\u632F", "\u632F"], /* CJK Ideograph */ + ["\u6330", "\u6330"], /* CJK Ideograph */ + ["\u6331", "\u6331"], /* CJK Ideograph */ + ["\u6332", "\u6332"], /* CJK Ideograph */ + ["\u6333", "\u6333"], /* CJK Ideograph */ + ["\u6334", "\u6334"], /* CJK Ideograph */ + ["\u6335", "\u6335"], /* CJK Ideograph */ + ["\u6336", "\u6336"], /* CJK Ideograph */ + ["\u6337", "\u6337"], /* CJK Ideograph */ + ["\u6338", "\u6338"], /* CJK Ideograph */ + ["\u6339", "\u6339"], /* CJK Ideograph */ + ["\u633A", "\u633A"], /* CJK Ideograph */ + ["\u633B", "\u633B"], /* CJK Ideograph */ + ["\u633C", "\u633C"], /* CJK Ideograph */ + ["\u633D", "\u633D"], /* CJK Ideograph */ + ["\u633E", "\u633E"], /* CJK Ideograph */ + ["\u633F", "\u633F"], /* CJK Ideograph */ + ["\u6340", "\u6340"], /* CJK Ideograph */ + ["\u6341", "\u6341"], /* CJK Ideograph */ + ["\u6342", "\u6342"], /* CJK Ideograph */ + ["\u6343", "\u6343"], /* CJK Ideograph */ + ["\u6344", "\u6344"], /* CJK Ideograph */ + ["\u6345", "\u6345"], /* CJK Ideograph */ + ["\u6346", "\u6346"], /* CJK Ideograph */ + ["\u6347", "\u6347"], /* CJK Ideograph */ + ["\u6348", "\u6348"], /* CJK Ideograph */ + ["\u6349", "\u6349"], /* CJK Ideograph */ + ["\u634A", "\u634A"], /* CJK Ideograph */ + ["\u634B", "\u634B"], /* CJK Ideograph */ + ["\u634C", "\u634C"], /* CJK Ideograph */ + ["\u634D", "\u634D"], /* CJK Ideograph */ + ["\u634E", "\u634E"], /* CJK Ideograph */ + ["\u634F", "\u634F"], /* CJK Ideograph */ + ["\u6350", "\u6350"], /* CJK Ideograph */ + ["\u6351", "\u6351"], /* CJK Ideograph */ + ["\u6352", "\u6352"], /* CJK Ideograph */ + ["\u6353", "\u6353"], /* CJK Ideograph */ + ["\u6354", "\u6354"], /* CJK Ideograph */ + ["\u6355", "\u6355"], /* CJK Ideograph */ + ["\u6356", "\u6356"], /* CJK Ideograph */ + ["\u6357", "\u6357"], /* CJK Ideograph */ + ["\u6358", "\u6358"], /* CJK Ideograph */ + ["\u6359", "\u6359"], /* CJK Ideograph */ + ["\u635A", "\u635A"], /* CJK Ideograph */ + ["\u635B", "\u635B"], /* CJK Ideograph */ + ["\u635C", "\u635C"], /* CJK Ideograph */ + ["\u635D", "\u635D"], /* CJK Ideograph */ + ["\u635E", "\u635E"], /* CJK Ideograph */ + ["\u635F", "\u635F"], /* CJK Ideograph */ + ["\u6360", "\u6360"], /* CJK Ideograph */ + ["\u6361", "\u6361"], /* CJK Ideograph */ + ["\u6362", "\u6362"], /* CJK Ideograph */ + ["\u6363", "\u6363"], /* CJK Ideograph */ + ["\u6364", "\u6364"], /* CJK Ideograph */ + ["\u6365", "\u6365"], /* CJK Ideograph */ + ["\u6366", "\u6366"], /* CJK Ideograph */ + ["\u6367", "\u6367"], /* CJK Ideograph */ + ["\u6368", "\u6368"], /* CJK Ideograph */ + ["\u6369", "\u6369"], /* CJK Ideograph */ + ["\u636A", "\u636A"], /* CJK Ideograph */ + ["\u636B", "\u636B"], /* CJK Ideograph */ + ["\u636C", "\u636C"], /* CJK Ideograph */ + ["\u636D", "\u636D"], /* CJK Ideograph */ + ["\u636E", "\u636E"], /* CJK Ideograph */ + ["\u636F", "\u636F"], /* CJK Ideograph */ + ["\u6370", "\u6370"], /* CJK Ideograph */ + ["\u6371", "\u6371"], /* CJK Ideograph */ + ["\u6372", "\u6372"], /* CJK Ideograph */ + ["\u6373", "\u6373"], /* CJK Ideograph */ + ["\u6374", "\u6374"], /* CJK Ideograph */ + ["\u6375", "\u6375"], /* CJK Ideograph */ + ["\u6376", "\u6376"], /* CJK Ideograph */ + ["\u6377", "\u6377"], /* CJK Ideograph */ + ["\u6378", "\u6378"], /* CJK Ideograph */ + ["\u6379", "\u6379"], /* CJK Ideograph */ + ["\u637A", "\u637A"], /* CJK Ideograph */ + ["\u637B", "\u637B"], /* CJK Ideograph */ + ["\u637C", "\u637C"], /* CJK Ideograph */ + ["\u637D", "\u637D"], /* CJK Ideograph */ + ["\u637E", "\u637E"], /* CJK Ideograph */ + ["\u637F", "\u637F"], /* CJK Ideograph */ + ["\u6380", "\u6380"], /* CJK Ideograph */ + ["\u6381", "\u6381"], /* CJK Ideograph */ + ["\u6382", "\u6382"], /* CJK Ideograph */ + ["\u6383", "\u6383"], /* CJK Ideograph */ + ["\u6384", "\u6384"], /* CJK Ideograph */ + ["\u6385", "\u6385"], /* CJK Ideograph */ + ["\u6386", "\u6386"], /* CJK Ideograph */ + ["\u6387", "\u6387"], /* CJK Ideograph */ + ["\u6388", "\u6388"], /* CJK Ideograph */ + ["\u6389", "\u6389"], /* CJK Ideograph */ + ["\u638A", "\u638A"], /* CJK Ideograph */ + ["\u638B", "\u638B"], /* CJK Ideograph */ + ["\u638C", "\u638C"], /* CJK Ideograph */ + ["\u638D", "\u638D"], /* CJK Ideograph */ + ["\u638E", "\u638E"], /* CJK Ideograph */ + ["\u638F", "\u638F"], /* CJK Ideograph */ + ["\u6390", "\u6390"], /* CJK Ideograph */ + ["\u6391", "\u6391"], /* CJK Ideograph */ + ["\u6392", "\u6392"], /* CJK Ideograph */ + ["\u6393", "\u6393"], /* CJK Ideograph */ + ["\u6394", "\u6394"], /* CJK Ideograph */ + ["\u6395", "\u6395"], /* CJK Ideograph */ + ["\u6396", "\u6396"], /* CJK Ideograph */ + ["\u6397", "\u6397"], /* CJK Ideograph */ + ["\u6398", "\u6398"], /* CJK Ideograph */ + ["\u6399", "\u6399"], /* CJK Ideograph */ + ["\u639A", "\u639A"], /* CJK Ideograph */ + ["\u639B", "\u639B"], /* CJK Ideograph */ + ["\u639C", "\u639C"], /* CJK Ideograph */ + ["\u639D", "\u639D"], /* CJK Ideograph */ + ["\u639E", "\u639E"], /* CJK Ideograph */ + ["\u639F", "\u639F"], /* CJK Ideograph */ + ["\u63A0", "\u63A0"], /* CJK Ideograph */ + ["\u63A1", "\u63A1"], /* CJK Ideograph */ + ["\u63A2", "\u63A2"], /* CJK Ideograph */ + ["\u63A3", "\u63A3"], /* CJK Ideograph */ + ["\u63A4", "\u63A4"], /* CJK Ideograph */ + ["\u63A5", "\u63A5"], /* CJK Ideograph */ + ["\u63A6", "\u63A6"], /* CJK Ideograph */ + ["\u63A7", "\u63A7"], /* CJK Ideograph */ + ["\u63A8", "\u63A8"], /* CJK Ideograph */ + ["\u63A9", "\u63A9"], /* CJK Ideograph */ + ["\u63AA", "\u63AA"], /* CJK Ideograph */ + ["\u63AB", "\u63AB"], /* CJK Ideograph */ + ["\u63AC", "\u63AC"], /* CJK Ideograph */ + ["\u63AD", "\u63AD"], /* CJK Ideograph */ + ["\u63AE", "\u63AE"], /* CJK Ideograph */ + ["\u63AF", "\u63AF"], /* CJK Ideograph */ + ["\u63B0", "\u63B0"], /* CJK Ideograph */ + ["\u63B1", "\u63B1"], /* CJK Ideograph */ + ["\u63B2", "\u63B2"], /* CJK Ideograph */ + ["\u63B3", "\u63B3"], /* CJK Ideograph */ + ["\u63B4", "\u63B4"], /* CJK Ideograph */ + ["\u63B5", "\u63B5"], /* CJK Ideograph */ + ["\u63B6", "\u63B6"], /* CJK Ideograph */ + ["\u63B7", "\u63B7"], /* CJK Ideograph */ + ["\u63B8", "\u63B8"], /* CJK Ideograph */ + ["\u63B9", "\u63B9"], /* CJK Ideograph */ + ["\u63BA", "\u63BA"], /* CJK Ideograph */ + ["\u63BB", "\u63BB"], /* CJK Ideograph */ + ["\u63BC", "\u63BC"], /* CJK Ideograph */ + ["\u63BD", "\u63BD"], /* CJK Ideograph */ + ["\u63BE", "\u63BE"], /* CJK Ideograph */ + ["\u63BF", "\u63BF"], /* CJK Ideograph */ + ["\u63C0", "\u63C0"], /* CJK Ideograph */ + ["\u63C1", "\u63C1"], /* CJK Ideograph */ + ["\u63C2", "\u63C2"], /* CJK Ideograph */ + ["\u63C3", "\u63C3"], /* CJK Ideograph */ + ["\u63C4", "\u63C4"], /* CJK Ideograph */ + ["\u63C5", "\u63C5"], /* CJK Ideograph */ + ["\u63C6", "\u63C6"], /* CJK Ideograph */ + ["\u63C7", "\u63C7"], /* CJK Ideograph */ + ["\u63C8", "\u63C8"], /* CJK Ideograph */ + ["\u63C9", "\u63C9"], /* CJK Ideograph */ + ["\u63CA", "\u63CA"], /* CJK Ideograph */ + ["\u63CB", "\u63CB"], /* CJK Ideograph */ + ["\u63CC", "\u63CC"], /* CJK Ideograph */ + ["\u63CD", "\u63CD"], /* CJK Ideograph */ + ["\u63CE", "\u63CE"], /* CJK Ideograph */ + ["\u63CF", "\u63CF"], /* CJK Ideograph */ + ["\u63D0", "\u63D0"], /* CJK Ideograph */ + ["\u63D1", "\u63D1"], /* CJK Ideograph */ + ["\u63D2", "\u63D2"], /* CJK Ideograph */ + ["\u63D3", "\u63D3"], /* CJK Ideograph */ + ["\u63D4", "\u63D4"], /* CJK Ideograph */ + ["\u63D5", "\u63D5"], /* CJK Ideograph */ + ["\u63D6", "\u63D6"], /* CJK Ideograph */ + ["\u63D7", "\u63D7"], /* CJK Ideograph */ + ["\u63D8", "\u63D8"], /* CJK Ideograph */ + ["\u63D9", "\u63D9"], /* CJK Ideograph */ + ["\u63DA", "\u63DA"], /* CJK Ideograph */ + ["\u63DB", "\u63DB"], /* CJK Ideograph */ + ["\u63DC", "\u63DC"], /* CJK Ideograph */ + ["\u63DD", "\u63DD"], /* CJK Ideograph */ + ["\u63DE", "\u63DE"], /* CJK Ideograph */ + ["\u63DF", "\u63DF"], /* CJK Ideograph */ + ["\u63E0", "\u63E0"], /* CJK Ideograph */ + ["\u63E1", "\u63E1"], /* CJK Ideograph */ + ["\u63E2", "\u63E2"], /* CJK Ideograph */ + ["\u63E3", "\u63E3"], /* CJK Ideograph */ + ["\u63E4", "\u63E4"], /* CJK Ideograph */ + ["\u63E5", "\u63E5"], /* CJK Ideograph */ + ["\u63E6", "\u63E6"], /* CJK Ideograph */ + ["\u63E7", "\u63E7"], /* CJK Ideograph */ + ["\u63E8", "\u63E8"], /* CJK Ideograph */ + ["\u63E9", "\u63E9"], /* CJK Ideograph */ + ["\u63EA", "\u63EA"], /* CJK Ideograph */ + ["\u63EB", "\u63EB"], /* CJK Ideograph */ + ["\u63EC", "\u63EC"], /* CJK Ideograph */ + ["\u63ED", "\u63ED"], /* CJK Ideograph */ + ["\u63EE", "\u63EE"], /* CJK Ideograph */ + ["\u63EF", "\u63EF"], /* CJK Ideograph */ + ["\u63F0", "\u63F0"], /* CJK Ideograph */ + ["\u63F1", "\u63F1"], /* CJK Ideograph */ + ["\u63F2", "\u63F2"], /* CJK Ideograph */ + ["\u63F3", "\u63F3"], /* CJK Ideograph */ + ["\u63F4", "\u63F4"], /* CJK Ideograph */ + ["\u63F5", "\u63F5"], /* CJK Ideograph */ + ["\u63F6", "\u63F6"], /* CJK Ideograph */ + ["\u63F7", "\u63F7"], /* CJK Ideograph */ + ["\u63F8", "\u63F8"], /* CJK Ideograph */ + ["\u63F9", "\u63F9"], /* CJK Ideograph */ + ["\u63FA", "\u63FA"], /* CJK Ideograph */ + ["\u63FB", "\u63FB"], /* CJK Ideograph */ + ["\u63FC", "\u63FC"], /* CJK Ideograph */ + ["\u63FD", "\u63FD"], /* CJK Ideograph */ + ["\u63FE", "\u63FE"], /* CJK Ideograph */ + ["\u63FF", "\u63FF"], /* CJK Ideograph */ + ["\u6400", "\u6400"], /* CJK Ideograph */ + ["\u6401", "\u6401"], /* CJK Ideograph */ + ["\u6402", "\u6402"], /* CJK Ideograph */ + ["\u6403", "\u6403"], /* CJK Ideograph */ + ["\u6404", "\u6404"], /* CJK Ideograph */ + ["\u6405", "\u6405"], /* CJK Ideograph */ + ["\u6406", "\u6406"], /* CJK Ideograph */ + ["\u6407", "\u6407"], /* CJK Ideograph */ + ["\u6408", "\u6408"], /* CJK Ideograph */ + ["\u6409", "\u6409"], /* CJK Ideograph */ + ["\u640A", "\u640A"], /* CJK Ideograph */ + ["\u640B", "\u640B"], /* CJK Ideograph */ + ["\u640C", "\u640C"], /* CJK Ideograph */ + ["\u640D", "\u640D"], /* CJK Ideograph */ + ["\u640E", "\u640E"], /* CJK Ideograph */ + ["\u640F", "\u640F"], /* CJK Ideograph */ + ["\u6410", "\u6410"], /* CJK Ideograph */ + ["\u6411", "\u6411"], /* CJK Ideograph */ + ["\u6412", "\u6412"], /* CJK Ideograph */ + ["\u6413", "\u6413"], /* CJK Ideograph */ + ["\u6414", "\u6414"], /* CJK Ideograph */ + ["\u6415", "\u6415"], /* CJK Ideograph */ + ["\u6416", "\u6416"], /* CJK Ideograph */ + ["\u6417", "\u6417"], /* CJK Ideograph */ + ["\u6418", "\u6418"], /* CJK Ideograph */ + ["\u6419", "\u6419"], /* CJK Ideograph */ + ["\u641A", "\u641A"], /* CJK Ideograph */ + ["\u641B", "\u641B"], /* CJK Ideograph */ + ["\u641C", "\u641C"], /* CJK Ideograph */ + ["\u641D", "\u641D"], /* CJK Ideograph */ + ["\u641E", "\u641E"], /* CJK Ideograph */ + ["\u641F", "\u641F"], /* CJK Ideograph */ + ["\u6420", "\u6420"], /* CJK Ideograph */ + ["\u6421", "\u6421"], /* CJK Ideograph */ + ["\u6422", "\u6422"], /* CJK Ideograph */ + ["\u6423", "\u6423"], /* CJK Ideograph */ + ["\u6424", "\u6424"], /* CJK Ideograph */ + ["\u6425", "\u6425"], /* CJK Ideograph */ + ["\u6426", "\u6426"], /* CJK Ideograph */ + ["\u6427", "\u6427"], /* CJK Ideograph */ + ["\u6428", "\u6428"], /* CJK Ideograph */ + ["\u6429", "\u6429"], /* CJK Ideograph */ + ["\u642A", "\u642A"], /* CJK Ideograph */ + ["\u642B", "\u642B"], /* CJK Ideograph */ + ["\u642C", "\u642C"], /* CJK Ideograph */ + ["\u642D", "\u642D"], /* CJK Ideograph */ + ["\u642E", "\u642E"], /* CJK Ideograph */ + ["\u642F", "\u642F"], /* CJK Ideograph */ + ["\u6430", "\u6430"], /* CJK Ideograph */ + ["\u6431", "\u6431"], /* CJK Ideograph */ + ["\u6432", "\u6432"], /* CJK Ideograph */ + ["\u6433", "\u6433"], /* CJK Ideograph */ + ["\u6434", "\u6434"], /* CJK Ideograph */ + ["\u6435", "\u6435"], /* CJK Ideograph */ + ["\u6436", "\u6436"], /* CJK Ideograph */ + ["\u6437", "\u6437"], /* CJK Ideograph */ + ["\u6438", "\u6438"], /* CJK Ideograph */ + ["\u6439", "\u6439"], /* CJK Ideograph */ + ["\u643A", "\u643A"], /* CJK Ideograph */ + ["\u643B", "\u643B"], /* CJK Ideograph */ + ["\u643C", "\u643C"], /* CJK Ideograph */ + ["\u643D", "\u643D"], /* CJK Ideograph */ + ["\u643E", "\u643E"], /* CJK Ideograph */ + ["\u643F", "\u643F"], /* CJK Ideograph */ + ["\u6440", "\u6440"], /* CJK Ideograph */ + ["\u6441", "\u6441"], /* CJK Ideograph */ + ["\u6442", "\u6442"], /* CJK Ideograph */ + ["\u6443", "\u6443"], /* CJK Ideograph */ + ["\u6444", "\u6444"], /* CJK Ideograph */ + ["\u6445", "\u6445"], /* CJK Ideograph */ + ["\u6446", "\u6446"], /* CJK Ideograph */ + ["\u6447", "\u6447"], /* CJK Ideograph */ + ["\u6448", "\u6448"], /* CJK Ideograph */ + ["\u6449", "\u6449"], /* CJK Ideograph */ + ["\u644A", "\u644A"], /* CJK Ideograph */ + ["\u644B", "\u644B"], /* CJK Ideograph */ + ["\u644C", "\u644C"], /* CJK Ideograph */ + ["\u644D", "\u644D"], /* CJK Ideograph */ + ["\u644E", "\u644E"], /* CJK Ideograph */ + ["\u644F", "\u644F"], /* CJK Ideograph */ + ["\u6450", "\u6450"], /* CJK Ideograph */ + ["\u6451", "\u6451"], /* CJK Ideograph */ + ["\u6452", "\u6452"], /* CJK Ideograph */ + ["\u6453", "\u6453"], /* CJK Ideograph */ + ["\u6454", "\u6454"], /* CJK Ideograph */ + ["\u6455", "\u6455"], /* CJK Ideograph */ + ["\u6456", "\u6456"], /* CJK Ideograph */ + ["\u6457", "\u6457"], /* CJK Ideograph */ + ["\u6458", "\u6458"], /* CJK Ideograph */ + ["\u6459", "\u6459"], /* CJK Ideograph */ + ["\u645A", "\u645A"], /* CJK Ideograph */ + ["\u645B", "\u645B"], /* CJK Ideograph */ + ["\u645C", "\u645C"], /* CJK Ideograph */ + ["\u645D", "\u645D"], /* CJK Ideograph */ + ["\u645E", "\u645E"], /* CJK Ideograph */ + ["\u645F", "\u645F"], /* CJK Ideograph */ + ["\u6460", "\u6460"], /* CJK Ideograph */ + ["\u6461", "\u6461"], /* CJK Ideograph */ + ["\u6462", "\u6462"], /* CJK Ideograph */ + ["\u6463", "\u6463"], /* CJK Ideograph */ + ["\u6464", "\u6464"], /* CJK Ideograph */ + ["\u6465", "\u6465"], /* CJK Ideograph */ + ["\u6466", "\u6466"], /* CJK Ideograph */ + ["\u6467", "\u6467"], /* CJK Ideograph */ + ["\u6468", "\u6468"], /* CJK Ideograph */ + ["\u6469", "\u6469"], /* CJK Ideograph */ + ["\u646A", "\u646A"], /* CJK Ideograph */ + ["\u646B", "\u646B"], /* CJK Ideograph */ + ["\u646C", "\u646C"], /* CJK Ideograph */ + ["\u646D", "\u646D"], /* CJK Ideograph */ + ["\u646E", "\u646E"], /* CJK Ideograph */ + ["\u646F", "\u646F"], /* CJK Ideograph */ + ["\u6470", "\u6470"], /* CJK Ideograph */ + ["\u6471", "\u6471"], /* CJK Ideograph */ + ["\u6472", "\u6472"], /* CJK Ideograph */ + ["\u6473", "\u6473"], /* CJK Ideograph */ + ["\u6474", "\u6474"], /* CJK Ideograph */ + ["\u6475", "\u6475"], /* CJK Ideograph */ + ["\u6476", "\u6476"], /* CJK Ideograph */ + ["\u6477", "\u6477"], /* CJK Ideograph */ + ["\u6478", "\u6478"], /* CJK Ideograph */ + ["\u6479", "\u6479"], /* CJK Ideograph */ + ["\u647A", "\u647A"], /* CJK Ideograph */ + ["\u647B", "\u647B"], /* CJK Ideograph */ + ["\u647C", "\u647C"], /* CJK Ideograph */ + ["\u647D", "\u647D"], /* CJK Ideograph */ + ["\u647E", "\u647E"], /* CJK Ideograph */ + ["\u647F", "\u647F"], /* CJK Ideograph */ + ["\u6480", "\u6480"], /* CJK Ideograph */ + ["\u6481", "\u6481"], /* CJK Ideograph */ + ["\u6482", "\u6482"], /* CJK Ideograph */ + ["\u6483", "\u6483"], /* CJK Ideograph */ + ["\u6484", "\u6484"], /* CJK Ideograph */ + ["\u6485", "\u6485"], /* CJK Ideograph */ + ["\u6486", "\u6486"], /* CJK Ideograph */ + ["\u6487", "\u6487"], /* CJK Ideograph */ + ["\u6488", "\u6488"], /* CJK Ideograph */ + ["\u6489", "\u6489"], /* CJK Ideograph */ + ["\u648A", "\u648A"], /* CJK Ideograph */ + ["\u648B", "\u648B"], /* CJK Ideograph */ + ["\u648C", "\u648C"], /* CJK Ideograph */ + ["\u648D", "\u648D"], /* CJK Ideograph */ + ["\u648E", "\u648E"], /* CJK Ideograph */ + ["\u648F", "\u648F"], /* CJK Ideograph */ + ["\u6490", "\u6490"], /* CJK Ideograph */ + ["\u6491", "\u6491"], /* CJK Ideograph */ + ["\u6492", "\u6492"], /* CJK Ideograph */ + ["\u6493", "\u6493"], /* CJK Ideograph */ + ["\u6494", "\u6494"], /* CJK Ideograph */ + ["\u6495", "\u6495"], /* CJK Ideograph */ + ["\u6496", "\u6496"], /* CJK Ideograph */ + ["\u6497", "\u6497"], /* CJK Ideograph */ + ["\u6498", "\u6498"], /* CJK Ideograph */ + ["\u6499", "\u6499"], /* CJK Ideograph */ + ["\u649A", "\u649A"], /* CJK Ideograph */ + ["\u649B", "\u649B"], /* CJK Ideograph */ + ["\u649C", "\u649C"], /* CJK Ideograph */ + ["\u649D", "\u649D"], /* CJK Ideograph */ + ["\u649E", "\u649E"], /* CJK Ideograph */ + ["\u649F", "\u649F"], /* CJK Ideograph */ + ["\u64A0", "\u64A0"], /* CJK Ideograph */ + ["\u64A1", "\u64A1"], /* CJK Ideograph */ + ["\u64A2", "\u64A2"], /* CJK Ideograph */ + ["\u64A3", "\u64A3"], /* CJK Ideograph */ + ["\u64A4", "\u64A4"], /* CJK Ideograph */ + ["\u64A5", "\u64A5"], /* CJK Ideograph */ + ["\u64A6", "\u64A6"], /* CJK Ideograph */ + ["\u64A7", "\u64A7"], /* CJK Ideograph */ + ["\u64A8", "\u64A8"], /* CJK Ideograph */ + ["\u64A9", "\u64A9"], /* CJK Ideograph */ + ["\u64AA", "\u64AA"], /* CJK Ideograph */ + ["\u64AB", "\u64AB"], /* CJK Ideograph */ + ["\u64AC", "\u64AC"], /* CJK Ideograph */ + ["\u64AD", "\u64AD"], /* CJK Ideograph */ + ["\u64AE", "\u64AE"], /* CJK Ideograph */ + ["\u64AF", "\u64AF"], /* CJK Ideograph */ + ["\u64B0", "\u64B0"], /* CJK Ideograph */ + ["\u64B1", "\u64B1"], /* CJK Ideograph */ + ["\u64B2", "\u64B2"], /* CJK Ideograph */ + ["\u64B3", "\u64B3"], /* CJK Ideograph */ + ["\u64B4", "\u64B4"], /* CJK Ideograph */ + ["\u64B5", "\u64B5"], /* CJK Ideograph */ + ["\u64B6", "\u64B6"], /* CJK Ideograph */ + ["\u64B7", "\u64B7"], /* CJK Ideograph */ + ["\u64B8", "\u64B8"], /* CJK Ideograph */ + ["\u64B9", "\u64B9"], /* CJK Ideograph */ + ["\u64BA", "\u64BA"], /* CJK Ideograph */ + ["\u64BB", "\u64BB"], /* CJK Ideograph */ + ["\u64BC", "\u64BC"], /* CJK Ideograph */ + ["\u64BD", "\u64BD"], /* CJK Ideograph */ + ["\u64BE", "\u64BE"], /* CJK Ideograph */ + ["\u64BF", "\u64BF"], /* CJK Ideograph */ + ["\u64C0", "\u64C0"], /* CJK Ideograph */ + ["\u64C1", "\u64C1"], /* CJK Ideograph */ + ["\u64C2", "\u64C2"], /* CJK Ideograph */ + ["\u64C3", "\u64C3"], /* CJK Ideograph */ + ["\u64C4", "\u64C4"], /* CJK Ideograph */ + ["\u64C5", "\u64C5"], /* CJK Ideograph */ + ["\u64C6", "\u64C6"], /* CJK Ideograph */ + ["\u64C7", "\u64C7"], /* CJK Ideograph */ + ["\u64C8", "\u64C8"], /* CJK Ideograph */ + ["\u64C9", "\u64C9"], /* CJK Ideograph */ + ["\u64CA", "\u64CA"], /* CJK Ideograph */ + ["\u64CB", "\u64CB"], /* CJK Ideograph */ + ["\u64CC", "\u64CC"], /* CJK Ideograph */ + ["\u64CD", "\u64CD"], /* CJK Ideograph */ + ["\u64CE", "\u64CE"], /* CJK Ideograph */ + ["\u64CF", "\u64CF"], /* CJK Ideograph */ + ["\u64D0", "\u64D0"], /* CJK Ideograph */ + ["\u64D1", "\u64D1"], /* CJK Ideograph */ + ["\u64D2", "\u64D2"], /* CJK Ideograph */ + ["\u64D3", "\u64D3"], /* CJK Ideograph */ + ["\u64D4", "\u64D4"], /* CJK Ideograph */ + ["\u64D5", "\u64D5"], /* CJK Ideograph */ + ["\u64D6", "\u64D6"], /* CJK Ideograph */ + ["\u64D7", "\u64D7"], /* CJK Ideograph */ + ["\u64D8", "\u64D8"], /* CJK Ideograph */ + ["\u64D9", "\u64D9"], /* CJK Ideograph */ + ["\u64DA", "\u64DA"], /* CJK Ideograph */ + ["\u64DB", "\u64DB"], /* CJK Ideograph */ + ["\u64DC", "\u64DC"], /* CJK Ideograph */ + ["\u64DD", "\u64DD"], /* CJK Ideograph */ + ["\u64DE", "\u64DE"], /* CJK Ideograph */ + ["\u64DF", "\u64DF"], /* CJK Ideograph */ + ["\u64E0", "\u64E0"], /* CJK Ideograph */ + ["\u64E1", "\u64E1"], /* CJK Ideograph */ + ["\u64E2", "\u64E2"], /* CJK Ideograph */ + ["\u64E3", "\u64E3"], /* CJK Ideograph */ + ["\u64E4", "\u64E4"], /* CJK Ideograph */ + ["\u64E5", "\u64E5"], /* CJK Ideograph */ + ["\u64E6", "\u64E6"], /* CJK Ideograph */ + ["\u64E7", "\u64E7"], /* CJK Ideograph */ + ["\u64E8", "\u64E8"], /* CJK Ideograph */ + ["\u64E9", "\u64E9"], /* CJK Ideograph */ + ["\u64EA", "\u64EA"], /* CJK Ideograph */ + ["\u64EB", "\u64EB"], /* CJK Ideograph */ + ["\u64EC", "\u64EC"], /* CJK Ideograph */ + ["\u64ED", "\u64ED"], /* CJK Ideograph */ + ["\u64EE", "\u64EE"], /* CJK Ideograph */ + ["\u64EF", "\u64EF"], /* CJK Ideograph */ + ["\u64F0", "\u64F0"], /* CJK Ideograph */ + ["\u64F1", "\u64F1"], /* CJK Ideograph */ + ["\u64F2", "\u64F2"], /* CJK Ideograph */ + ["\u64F3", "\u64F3"], /* CJK Ideograph */ + ["\u64F4", "\u64F4"], /* CJK Ideograph */ + ["\u64F5", "\u64F5"], /* CJK Ideograph */ + ["\u64F6", "\u64F6"], /* CJK Ideograph */ + ["\u64F7", "\u64F7"], /* CJK Ideograph */ + ["\u64F8", "\u64F8"], /* CJK Ideograph */ + ["\u64F9", "\u64F9"], /* CJK Ideograph */ + ["\u64FA", "\u64FA"], /* CJK Ideograph */ + ["\u64FB", "\u64FB"], /* CJK Ideograph */ + ["\u64FC", "\u64FC"], /* CJK Ideograph */ + ["\u64FD", "\u64FD"], /* CJK Ideograph */ + ["\u64FE", "\u64FE"], /* CJK Ideograph */ + ["\u64FF", "\u64FF"], /* CJK Ideograph */ + ["\u6500", "\u6500"], /* CJK Ideograph */ + ["\u6501", "\u6501"], /* CJK Ideograph */ + ["\u6502", "\u6502"], /* CJK Ideograph */ + ["\u6503", "\u6503"], /* CJK Ideograph */ + ["\u6504", "\u6504"], /* CJK Ideograph */ + ["\u6505", "\u6505"], /* CJK Ideograph */ + ["\u6506", "\u6506"], /* CJK Ideograph */ + ["\u6507", "\u6507"], /* CJK Ideograph */ + ["\u6508", "\u6508"], /* CJK Ideograph */ + ["\u6509", "\u6509"], /* CJK Ideograph */ + ["\u650A", "\u650A"], /* CJK Ideograph */ + ["\u650B", "\u650B"], /* CJK Ideograph */ + ["\u650C", "\u650C"], /* CJK Ideograph */ + ["\u650D", "\u650D"], /* CJK Ideograph */ + ["\u650E", "\u650E"], /* CJK Ideograph */ + ["\u650F", "\u650F"], /* CJK Ideograph */ + ["\u6510", "\u6510"], /* CJK Ideograph */ + ["\u6511", "\u6511"], /* CJK Ideograph */ + ["\u6512", "\u6512"], /* CJK Ideograph */ + ["\u6513", "\u6513"], /* CJK Ideograph */ + ["\u6514", "\u6514"], /* CJK Ideograph */ + ["\u6515", "\u6515"], /* CJK Ideograph */ + ["\u6516", "\u6516"], /* CJK Ideograph */ + ["\u6517", "\u6517"], /* CJK Ideograph */ + ["\u6518", "\u6518"], /* CJK Ideograph */ + ["\u6519", "\u6519"], /* CJK Ideograph */ + ["\u651A", "\u651A"], /* CJK Ideograph */ + ["\u651B", "\u651B"], /* CJK Ideograph */ + ["\u651C", "\u651C"], /* CJK Ideograph */ + ["\u651D", "\u651D"], /* CJK Ideograph */ + ["\u651E", "\u651E"], /* CJK Ideograph */ + ["\u651F", "\u651F"], /* CJK Ideograph */ + ["\u6520", "\u6520"], /* CJK Ideograph */ + ["\u6521", "\u6521"], /* CJK Ideograph */ + ["\u6522", "\u6522"], /* CJK Ideograph */ + ["\u6523", "\u6523"], /* CJK Ideograph */ + ["\u6524", "\u6524"], /* CJK Ideograph */ + ["\u6525", "\u6525"], /* CJK Ideograph */ + ["\u6526", "\u6526"], /* CJK Ideograph */ + ["\u6527", "\u6527"], /* CJK Ideograph */ + ["\u6528", "\u6528"], /* CJK Ideograph */ + ["\u6529", "\u6529"], /* CJK Ideograph */ + ["\u652A", "\u652A"], /* CJK Ideograph */ + ["\u652B", "\u652B"], /* CJK Ideograph */ + ["\u652C", "\u652C"], /* CJK Ideograph */ + ["\u652D", "\u652D"], /* CJK Ideograph */ + ["\u652E", "\u652E"], /* CJK Ideograph */ + ["\u652F", "\u652F"], /* CJK Ideograph */ + ["\u6530", "\u6530"], /* CJK Ideograph */ + ["\u6531", "\u6531"], /* CJK Ideograph */ + ["\u6532", "\u6532"], /* CJK Ideograph */ + ["\u6533", "\u6533"], /* CJK Ideograph */ + ["\u6534", "\u6534"], /* CJK Ideograph */ + ["\u6535", "\u6535"], /* CJK Ideograph */ + ["\u6536", "\u6536"], /* CJK Ideograph */ + ["\u6537", "\u6537"], /* CJK Ideograph */ + ["\u6538", "\u6538"], /* CJK Ideograph */ + ["\u6539", "\u6539"], /* CJK Ideograph */ + ["\u653A", "\u653A"], /* CJK Ideograph */ + ["\u653B", "\u653B"], /* CJK Ideograph */ + ["\u653C", "\u653C"], /* CJK Ideograph */ + ["\u653D", "\u653D"], /* CJK Ideograph */ + ["\u653E", "\u653E"], /* CJK Ideograph */ + ["\u653F", "\u653F"], /* CJK Ideograph */ + ["\u6540", "\u6540"], /* CJK Ideograph */ + ["\u6541", "\u6541"], /* CJK Ideograph */ + ["\u6542", "\u6542"], /* CJK Ideograph */ + ["\u6543", "\u6543"], /* CJK Ideograph */ + ["\u6544", "\u6544"], /* CJK Ideograph */ + ["\u6545", "\u6545"], /* CJK Ideograph */ + ["\u6546", "\u6546"], /* CJK Ideograph */ + ["\u6547", "\u6547"], /* CJK Ideograph */ + ["\u6548", "\u6548"], /* CJK Ideograph */ + ["\u6549", "\u6549"], /* CJK Ideograph */ + ["\u654A", "\u654A"], /* CJK Ideograph */ + ["\u654B", "\u654B"], /* CJK Ideograph */ + ["\u654C", "\u654C"], /* CJK Ideograph */ + ["\u654D", "\u654D"], /* CJK Ideograph */ + ["\u654E", "\u654E"], /* CJK Ideograph */ + ["\u654F", "\u654F"], /* CJK Ideograph */ + ["\u6550", "\u6550"], /* CJK Ideograph */ + ["\u6551", "\u6551"], /* CJK Ideograph */ + ["\u6552", "\u6552"], /* CJK Ideograph */ + ["\u6553", "\u6553"], /* CJK Ideograph */ + ["\u6554", "\u6554"], /* CJK Ideograph */ + ["\u6555", "\u6555"], /* CJK Ideograph */ + ["\u6556", "\u6556"], /* CJK Ideograph */ + ["\u6557", "\u6557"], /* CJK Ideograph */ + ["\u6558", "\u6558"], /* CJK Ideograph */ + ["\u6559", "\u6559"], /* CJK Ideograph */ + ["\u655A", "\u655A"], /* CJK Ideograph */ + ["\u655B", "\u655B"], /* CJK Ideograph */ + ["\u655C", "\u655C"], /* CJK Ideograph */ + ["\u655D", "\u655D"], /* CJK Ideograph */ + ["\u655E", "\u655E"], /* CJK Ideograph */ + ["\u655F", "\u655F"], /* CJK Ideograph */ + ["\u6560", "\u6560"], /* CJK Ideograph */ + ["\u6561", "\u6561"], /* CJK Ideograph */ + ["\u6562", "\u6562"], /* CJK Ideograph */ + ["\u6563", "\u6563"], /* CJK Ideograph */ + ["\u6564", "\u6564"], /* CJK Ideograph */ + ["\u6565", "\u6565"], /* CJK Ideograph */ + ["\u6566", "\u6566"], /* CJK Ideograph */ + ["\u6567", "\u6567"], /* CJK Ideograph */ + ["\u6568", "\u6568"], /* CJK Ideograph */ + ["\u6569", "\u6569"], /* CJK Ideograph */ + ["\u656A", "\u656A"], /* CJK Ideograph */ + ["\u656B", "\u656B"], /* CJK Ideograph */ + ["\u656C", "\u656C"], /* CJK Ideograph */ + ["\u656D", "\u656D"], /* CJK Ideograph */ + ["\u656E", "\u656E"], /* CJK Ideograph */ + ["\u656F", "\u656F"], /* CJK Ideograph */ + ["\u6570", "\u6570"], /* CJK Ideograph */ + ["\u6571", "\u6571"], /* CJK Ideograph */ + ["\u6572", "\u6572"], /* CJK Ideograph */ + ["\u6573", "\u6573"], /* CJK Ideograph */ + ["\u6574", "\u6574"], /* CJK Ideograph */ + ["\u6575", "\u6575"], /* CJK Ideograph */ + ["\u6576", "\u6576"], /* CJK Ideograph */ + ["\u6577", "\u6577"], /* CJK Ideograph */ + ["\u6578", "\u6578"], /* CJK Ideograph */ + ["\u6579", "\u6579"], /* CJK Ideograph */ + ["\u657A", "\u657A"], /* CJK Ideograph */ + ["\u657B", "\u657B"], /* CJK Ideograph */ + ["\u657C", "\u657C"], /* CJK Ideograph */ + ["\u657D", "\u657D"], /* CJK Ideograph */ + ["\u657E", "\u657E"], /* CJK Ideograph */ + ["\u657F", "\u657F"], /* CJK Ideograph */ + ["\u6580", "\u6580"], /* CJK Ideograph */ + ["\u6581", "\u6581"], /* CJK Ideograph */ + ["\u6582", "\u6582"], /* CJK Ideograph */ + ["\u6583", "\u6583"], /* CJK Ideograph */ + ["\u6584", "\u6584"], /* CJK Ideograph */ + ["\u6585", "\u6585"], /* CJK Ideograph */ + ["\u6586", "\u6586"], /* CJK Ideograph */ + ["\u6587", "\u6587"], /* CJK Ideograph */ + ["\u6588", "\u6588"], /* CJK Ideograph */ + ["\u6589", "\u6589"], /* CJK Ideograph */ + ["\u658A", "\u658A"], /* CJK Ideograph */ + ["\u658B", "\u658B"], /* CJK Ideograph */ + ["\u658C", "\u658C"], /* CJK Ideograph */ + ["\u658D", "\u658D"], /* CJK Ideograph */ + ["\u658E", "\u658E"], /* CJK Ideograph */ + ["\u658F", "\u658F"], /* CJK Ideograph */ + ["\u6590", "\u6590"], /* CJK Ideograph */ + ["\u6591", "\u6591"], /* CJK Ideograph */ + ["\u6592", "\u6592"], /* CJK Ideograph */ + ["\u6593", "\u6593"], /* CJK Ideograph */ + ["\u6594", "\u6594"], /* CJK Ideograph */ + ["\u6595", "\u6595"], /* CJK Ideograph */ + ["\u6596", "\u6596"], /* CJK Ideograph */ + ["\u6597", "\u6597"], /* CJK Ideograph */ + ["\u6598", "\u6598"], /* CJK Ideograph */ + ["\u6599", "\u6599"], /* CJK Ideograph */ + ["\u659A", "\u659A"], /* CJK Ideograph */ + ["\u659B", "\u659B"], /* CJK Ideograph */ + ["\u659C", "\u659C"], /* CJK Ideograph */ + ["\u659D", "\u659D"], /* CJK Ideograph */ + ["\u659E", "\u659E"], /* CJK Ideograph */ + ["\u659F", "\u659F"], /* CJK Ideograph */ + ["\u65A0", "\u65A0"], /* CJK Ideograph */ + ["\u65A1", "\u65A1"], /* CJK Ideograph */ + ["\u65A2", "\u65A2"], /* CJK Ideograph */ + ["\u65A3", "\u65A3"], /* CJK Ideograph */ + ["\u65A4", "\u65A4"], /* CJK Ideograph */ + ["\u65A5", "\u65A5"], /* CJK Ideograph */ + ["\u65A6", "\u65A6"], /* CJK Ideograph */ + ["\u65A7", "\u65A7"], /* CJK Ideograph */ + ["\u65A8", "\u65A8"], /* CJK Ideograph */ + ["\u65A9", "\u65A9"], /* CJK Ideograph */ + ["\u65AA", "\u65AA"], /* CJK Ideograph */ + ["\u65AB", "\u65AB"], /* CJK Ideograph */ + ["\u65AC", "\u65AC"], /* CJK Ideograph */ + ["\u65AD", "\u65AD"], /* CJK Ideograph */ + ["\u65AE", "\u65AE"], /* CJK Ideograph */ + ["\u65AF", "\u65AF"], /* CJK Ideograph */ + ["\u65B0", "\u65B0"], /* CJK Ideograph */ + ["\u65B1", "\u65B1"], /* CJK Ideograph */ + ["\u65B2", "\u65B2"], /* CJK Ideograph */ + ["\u65B3", "\u65B3"], /* CJK Ideograph */ + ["\u65B4", "\u65B4"], /* CJK Ideograph */ + ["\u65B5", "\u65B5"], /* CJK Ideograph */ + ["\u65B6", "\u65B6"], /* CJK Ideograph */ + ["\u65B7", "\u65B7"], /* CJK Ideograph */ + ["\u65B8", "\u65B8"], /* CJK Ideograph */ + ["\u65B9", "\u65B9"], /* CJK Ideograph */ + ["\u65BA", "\u65BA"], /* CJK Ideograph */ + ["\u65BB", "\u65BB"], /* CJK Ideograph */ + ["\u65BC", "\u65BC"], /* CJK Ideograph */ + ["\u65BD", "\u65BD"], /* CJK Ideograph */ + ["\u65BE", "\u65BE"], /* CJK Ideograph */ + ["\u65BF", "\u65BF"], /* CJK Ideograph */ + ["\u65C0", "\u65C0"], /* CJK Ideograph */ + ["\u65C1", "\u65C1"], /* CJK Ideograph */ + ["\u65C2", "\u65C2"], /* CJK Ideograph */ + ["\u65C3", "\u65C3"], /* CJK Ideograph */ + ["\u65C4", "\u65C4"], /* CJK Ideograph */ + ["\u65C5", "\u65C5"], /* CJK Ideograph */ + ["\u65C6", "\u65C6"], /* CJK Ideograph */ + ["\u65C7", "\u65C7"], /* CJK Ideograph */ + ["\u65C8", "\u65C8"], /* CJK Ideograph */ + ["\u65C9", "\u65C9"], /* CJK Ideograph */ + ["\u65CA", "\u65CA"], /* CJK Ideograph */ + ["\u65CB", "\u65CB"], /* CJK Ideograph */ + ["\u65CC", "\u65CC"], /* CJK Ideograph */ + ["\u65CD", "\u65CD"], /* CJK Ideograph */ + ["\u65CE", "\u65CE"], /* CJK Ideograph */ + ["\u65CF", "\u65CF"], /* CJK Ideograph */ + ["\u65D0", "\u65D0"], /* CJK Ideograph */ + ["\u65D1", "\u65D1"], /* CJK Ideograph */ + ["\u65D2", "\u65D2"], /* CJK Ideograph */ + ["\u65D3", "\u65D3"], /* CJK Ideograph */ + ["\u65D4", "\u65D4"], /* CJK Ideograph */ + ["\u65D5", "\u65D5"], /* CJK Ideograph */ + ["\u65D6", "\u65D6"], /* CJK Ideograph */ + ["\u65D7", "\u65D7"], /* CJK Ideograph */ + ["\u65D8", "\u65D8"], /* CJK Ideograph */ + ["\u65D9", "\u65D9"], /* CJK Ideograph */ + ["\u65DA", "\u65DA"], /* CJK Ideograph */ + ["\u65DB", "\u65DB"], /* CJK Ideograph */ + ["\u65DC", "\u65DC"], /* CJK Ideograph */ + ["\u65DD", "\u65DD"], /* CJK Ideograph */ + ["\u65DE", "\u65DE"], /* CJK Ideograph */ + ["\u65DF", "\u65DF"], /* CJK Ideograph */ + ["\u65E0", "\u65E0"], /* CJK Ideograph */ + ["\u65E1", "\u65E1"], /* CJK Ideograph */ + ["\u65E2", "\u65E2"], /* CJK Ideograph */ + ["\u65E3", "\u65E3"], /* CJK Ideograph */ + ["\u65E4", "\u65E4"], /* CJK Ideograph */ + ["\u65E5", "\u65E5"], /* CJK Ideograph */ + ["\u65E6", "\u65E6"], /* CJK Ideograph */ + ["\u65E7", "\u65E7"], /* CJK Ideograph */ + ["\u65E8", "\u65E8"], /* CJK Ideograph */ + ["\u65E9", "\u65E9"], /* CJK Ideograph */ + ["\u65EA", "\u65EA"], /* CJK Ideograph */ + ["\u65EB", "\u65EB"], /* CJK Ideograph */ + ["\u65EC", "\u65EC"], /* CJK Ideograph */ + ["\u65ED", "\u65ED"], /* CJK Ideograph */ + ["\u65EE", "\u65EE"], /* CJK Ideograph */ + ["\u65EF", "\u65EF"], /* CJK Ideograph */ + ["\u65F0", "\u65F0"], /* CJK Ideograph */ + ["\u65F1", "\u65F1"], /* CJK Ideograph */ + ["\u65F2", "\u65F2"], /* CJK Ideograph */ + ["\u65F3", "\u65F3"], /* CJK Ideograph */ + ["\u65F4", "\u65F4"], /* CJK Ideograph */ + ["\u65F5", "\u65F5"], /* CJK Ideograph */ + ["\u65F6", "\u65F6"], /* CJK Ideograph */ + ["\u65F7", "\u65F7"], /* CJK Ideograph */ + ["\u65F8", "\u65F8"], /* CJK Ideograph */ + ["\u65F9", "\u65F9"], /* CJK Ideograph */ + ["\u65FA", "\u65FA"], /* CJK Ideograph */ + ["\u65FB", "\u65FB"], /* CJK Ideograph */ + ["\u65FC", "\u65FC"], /* CJK Ideograph */ + ["\u65FD", "\u65FD"], /* CJK Ideograph */ + ["\u65FE", "\u65FE"], /* CJK Ideograph */ + ["\u65FF", "\u65FF"], /* CJK Ideograph */ + ["\u6600", "\u6600"], /* CJK Ideograph */ + ["\u6601", "\u6601"], /* CJK Ideograph */ + ["\u6602", "\u6602"], /* CJK Ideograph */ + ["\u6603", "\u6603"], /* CJK Ideograph */ + ["\u6604", "\u6604"], /* CJK Ideograph */ + ["\u6605", "\u6605"], /* CJK Ideograph */ + ["\u6606", "\u6606"], /* CJK Ideograph */ + ["\u6607", "\u6607"], /* CJK Ideograph */ + ["\u6608", "\u6608"], /* CJK Ideograph */ + ["\u6609", "\u6609"], /* CJK Ideograph */ + ["\u660A", "\u660A"], /* CJK Ideograph */ + ["\u660B", "\u660B"], /* CJK Ideograph */ + ["\u660C", "\u660C"], /* CJK Ideograph */ + ["\u660D", "\u660D"], /* CJK Ideograph */ + ["\u660E", "\u660E"], /* CJK Ideograph */ + ["\u660F", "\u660F"], /* CJK Ideograph */ + ["\u6610", "\u6610"], /* CJK Ideograph */ + ["\u6611", "\u6611"], /* CJK Ideograph */ + ["\u6612", "\u6612"], /* CJK Ideograph */ + ["\u6613", "\u6613"], /* CJK Ideograph */ + ["\u6614", "\u6614"], /* CJK Ideograph */ + ["\u6615", "\u6615"], /* CJK Ideograph */ + ["\u6616", "\u6616"], /* CJK Ideograph */ + ["\u6617", "\u6617"], /* CJK Ideograph */ + ["\u6618", "\u6618"], /* CJK Ideograph */ + ["\u6619", "\u6619"], /* CJK Ideograph */ + ["\u661A", "\u661A"], /* CJK Ideograph */ + ["\u661B", "\u661B"], /* CJK Ideograph */ + ["\u661C", "\u661C"], /* CJK Ideograph */ + ["\u661D", "\u661D"], /* CJK Ideograph */ + ["\u661E", "\u661E"], /* CJK Ideograph */ + ["\u661F", "\u661F"], /* CJK Ideograph */ + ["\u6620", "\u6620"], /* CJK Ideograph */ + ["\u6621", "\u6621"], /* CJK Ideograph */ + ["\u6622", "\u6622"], /* CJK Ideograph */ + ["\u6623", "\u6623"], /* CJK Ideograph */ + ["\u6624", "\u6624"], /* CJK Ideograph */ + ["\u6625", "\u6625"], /* CJK Ideograph */ + ["\u6626", "\u6626"], /* CJK Ideograph */ + ["\u6627", "\u6627"], /* CJK Ideograph */ + ["\u6628", "\u6628"], /* CJK Ideograph */ + ["\u6629", "\u6629"], /* CJK Ideograph */ + ["\u662A", "\u662A"], /* CJK Ideograph */ + ["\u662B", "\u662B"], /* CJK Ideograph */ + ["\u662C", "\u662C"], /* CJK Ideograph */ + ["\u662D", "\u662D"], /* CJK Ideograph */ + ["\u662E", "\u662E"], /* CJK Ideograph */ + ["\u662F", "\u662F"], /* CJK Ideograph */ + ["\u6630", "\u6630"], /* CJK Ideograph */ + ["\u6631", "\u6631"], /* CJK Ideograph */ + ["\u6632", "\u6632"], /* CJK Ideograph */ + ["\u6633", "\u6633"], /* CJK Ideograph */ + ["\u6634", "\u6634"], /* CJK Ideograph */ + ["\u6635", "\u6635"], /* CJK Ideograph */ + ["\u6636", "\u6636"], /* CJK Ideograph */ + ["\u6637", "\u6637"], /* CJK Ideograph */ + ["\u6638", "\u6638"], /* CJK Ideograph */ + ["\u6639", "\u6639"], /* CJK Ideograph */ + ["\u663A", "\u663A"], /* CJK Ideograph */ + ["\u663B", "\u663B"], /* CJK Ideograph */ + ["\u663C", "\u663C"], /* CJK Ideograph */ + ["\u663D", "\u663D"], /* CJK Ideograph */ + ["\u663E", "\u663E"], /* CJK Ideograph */ + ["\u663F", "\u663F"], /* CJK Ideograph */ + ["\u6640", "\u6640"], /* CJK Ideograph */ + ["\u6641", "\u6641"], /* CJK Ideograph */ + ["\u6642", "\u6642"], /* CJK Ideograph */ + ["\u6643", "\u6643"], /* CJK Ideograph */ + ["\u6644", "\u6644"], /* CJK Ideograph */ + ["\u6645", "\u6645"], /* CJK Ideograph */ + ["\u6646", "\u6646"], /* CJK Ideograph */ + ["\u6647", "\u6647"], /* CJK Ideograph */ + ["\u6648", "\u6648"], /* CJK Ideograph */ + ["\u6649", "\u6649"], /* CJK Ideograph */ + ["\u664A", "\u664A"], /* CJK Ideograph */ + ["\u664B", "\u664B"], /* CJK Ideograph */ + ["\u664C", "\u664C"], /* CJK Ideograph */ + ["\u664D", "\u664D"], /* CJK Ideograph */ + ["\u664E", "\u664E"], /* CJK Ideograph */ + ["\u664F", "\u664F"], /* CJK Ideograph */ + ["\u6650", "\u6650"], /* CJK Ideograph */ + ["\u6651", "\u6651"], /* CJK Ideograph */ + ["\u6652", "\u6652"], /* CJK Ideograph */ + ["\u6653", "\u6653"], /* CJK Ideograph */ + ["\u6654", "\u6654"], /* CJK Ideograph */ + ["\u6655", "\u6655"], /* CJK Ideograph */ + ["\u6656", "\u6656"], /* CJK Ideograph */ + ["\u6657", "\u6657"], /* CJK Ideograph */ + ["\u6658", "\u6658"], /* CJK Ideograph */ + ["\u6659", "\u6659"], /* CJK Ideograph */ + ["\u665A", "\u665A"], /* CJK Ideograph */ + ["\u665B", "\u665B"], /* CJK Ideograph */ + ["\u665C", "\u665C"], /* CJK Ideograph */ + ["\u665D", "\u665D"], /* CJK Ideograph */ + ["\u665E", "\u665E"], /* CJK Ideograph */ + ["\u665F", "\u665F"], /* CJK Ideograph */ + ["\u6660", "\u6660"], /* CJK Ideograph */ + ["\u6661", "\u6661"], /* CJK Ideograph */ + ["\u6662", "\u6662"], /* CJK Ideograph */ + ["\u6663", "\u6663"], /* CJK Ideograph */ + ["\u6664", "\u6664"], /* CJK Ideograph */ + ["\u6665", "\u6665"], /* CJK Ideograph */ + ["\u6666", "\u6666"], /* CJK Ideograph */ + ["\u6667", "\u6667"], /* CJK Ideograph */ + ["\u6668", "\u6668"], /* CJK Ideograph */ + ["\u6669", "\u6669"], /* CJK Ideograph */ + ["\u666A", "\u666A"], /* CJK Ideograph */ + ["\u666B", "\u666B"], /* CJK Ideograph */ + ["\u666C", "\u666C"], /* CJK Ideograph */ + ["\u666D", "\u666D"], /* CJK Ideograph */ + ["\u666E", "\u666E"], /* CJK Ideograph */ + ["\u666F", "\u666F"], /* CJK Ideograph */ + ["\u6670", "\u6670"], /* CJK Ideograph */ + ["\u6671", "\u6671"], /* CJK Ideograph */ + ["\u6672", "\u6672"], /* CJK Ideograph */ + ["\u6673", "\u6673"], /* CJK Ideograph */ + ["\u6674", "\u6674"], /* CJK Ideograph */ + ["\u6675", "\u6675"], /* CJK Ideograph */ + ["\u6676", "\u6676"], /* CJK Ideograph */ + ["\u6677", "\u6677"], /* CJK Ideograph */ + ["\u6678", "\u6678"], /* CJK Ideograph */ + ["\u6679", "\u6679"], /* CJK Ideograph */ + ["\u667A", "\u667A"], /* CJK Ideograph */ + ["\u667B", "\u667B"], /* CJK Ideograph */ + ["\u667C", "\u667C"], /* CJK Ideograph */ + ["\u667D", "\u667D"], /* CJK Ideograph */ + ["\u667E", "\u667E"], /* CJK Ideograph */ + ["\u667F", "\u667F"], /* CJK Ideograph */ + ["\u6680", "\u6680"], /* CJK Ideograph */ + ["\u6681", "\u6681"], /* CJK Ideograph */ + ["\u6682", "\u6682"], /* CJK Ideograph */ + ["\u6683", "\u6683"], /* CJK Ideograph */ + ["\u6684", "\u6684"], /* CJK Ideograph */ + ["\u6685", "\u6685"], /* CJK Ideograph */ + ["\u6686", "\u6686"], /* CJK Ideograph */ + ["\u6687", "\u6687"], /* CJK Ideograph */ + ["\u6688", "\u6688"], /* CJK Ideograph */ + ["\u6689", "\u6689"], /* CJK Ideograph */ + ["\u668A", "\u668A"], /* CJK Ideograph */ + ["\u668B", "\u668B"], /* CJK Ideograph */ + ["\u668C", "\u668C"], /* CJK Ideograph */ + ["\u668D", "\u668D"], /* CJK Ideograph */ + ["\u668E", "\u668E"], /* CJK Ideograph */ + ["\u668F", "\u668F"], /* CJK Ideograph */ + ["\u6690", "\u6690"], /* CJK Ideograph */ + ["\u6691", "\u6691"], /* CJK Ideograph */ + ["\u6692", "\u6692"], /* CJK Ideograph */ + ["\u6693", "\u6693"], /* CJK Ideograph */ + ["\u6694", "\u6694"], /* CJK Ideograph */ + ["\u6695", "\u6695"], /* CJK Ideograph */ + ["\u6696", "\u6696"], /* CJK Ideograph */ + ["\u6697", "\u6697"], /* CJK Ideograph */ + ["\u6698", "\u6698"], /* CJK Ideograph */ + ["\u6699", "\u6699"], /* CJK Ideograph */ + ["\u669A", "\u669A"], /* CJK Ideograph */ + ["\u669B", "\u669B"], /* CJK Ideograph */ + ["\u669C", "\u669C"], /* CJK Ideograph */ + ["\u669D", "\u669D"], /* CJK Ideograph */ + ["\u669E", "\u669E"], /* CJK Ideograph */ + ["\u669F", "\u669F"], /* CJK Ideograph */ + ["\u66A0", "\u66A0"], /* CJK Ideograph */ + ["\u66A1", "\u66A1"], /* CJK Ideograph */ + ["\u66A2", "\u66A2"], /* CJK Ideograph */ + ["\u66A3", "\u66A3"], /* CJK Ideograph */ + ["\u66A4", "\u66A4"], /* CJK Ideograph */ + ["\u66A5", "\u66A5"], /* CJK Ideograph */ + ["\u66A6", "\u66A6"], /* CJK Ideograph */ + ["\u66A7", "\u66A7"], /* CJK Ideograph */ + ["\u66A8", "\u66A8"], /* CJK Ideograph */ + ["\u66A9", "\u66A9"], /* CJK Ideograph */ + ["\u66AA", "\u66AA"], /* CJK Ideograph */ + ["\u66AB", "\u66AB"], /* CJK Ideograph */ + ["\u66AC", "\u66AC"], /* CJK Ideograph */ + ["\u66AD", "\u66AD"], /* CJK Ideograph */ + ["\u66AE", "\u66AE"], /* CJK Ideograph */ + ["\u66AF", "\u66AF"], /* CJK Ideograph */ + ["\u66B0", "\u66B0"], /* CJK Ideograph */ + ["\u66B1", "\u66B1"], /* CJK Ideograph */ + ["\u66B2", "\u66B2"], /* CJK Ideograph */ + ["\u66B3", "\u66B3"], /* CJK Ideograph */ + ["\u66B4", "\u66B4"], /* CJK Ideograph */ + ["\u66B5", "\u66B5"], /* CJK Ideograph */ + ["\u66B6", "\u66B6"], /* CJK Ideograph */ + ["\u66B7", "\u66B7"], /* CJK Ideograph */ + ["\u66B8", "\u66B8"], /* CJK Ideograph */ + ["\u66B9", "\u66B9"], /* CJK Ideograph */ + ["\u66BA", "\u66BA"], /* CJK Ideograph */ + ["\u66BB", "\u66BB"], /* CJK Ideograph */ + ["\u66BC", "\u66BC"], /* CJK Ideograph */ + ["\u66BD", "\u66BD"], /* CJK Ideograph */ + ["\u66BE", "\u66BE"], /* CJK Ideograph */ + ["\u66BF", "\u66BF"], /* CJK Ideograph */ + ["\u66C0", "\u66C0"], /* CJK Ideograph */ + ["\u66C1", "\u66C1"], /* CJK Ideograph */ + ["\u66C2", "\u66C2"], /* CJK Ideograph */ + ["\u66C3", "\u66C3"], /* CJK Ideograph */ + ["\u66C4", "\u66C4"], /* CJK Ideograph */ + ["\u66C5", "\u66C5"], /* CJK Ideograph */ + ["\u66C6", "\u66C6"], /* CJK Ideograph */ + ["\u66C7", "\u66C7"], /* CJK Ideograph */ + ["\u66C8", "\u66C8"], /* CJK Ideograph */ + ["\u66C9", "\u66C9"], /* CJK Ideograph */ + ["\u66CA", "\u66CA"], /* CJK Ideograph */ + ["\u66CB", "\u66CB"], /* CJK Ideograph */ + ["\u66CC", "\u66CC"], /* CJK Ideograph */ + ["\u66CD", "\u66CD"], /* CJK Ideograph */ + ["\u66CE", "\u66CE"], /* CJK Ideograph */ + ["\u66CF", "\u66CF"], /* CJK Ideograph */ + ["\u66D0", "\u66D0"], /* CJK Ideograph */ + ["\u66D1", "\u66D1"], /* CJK Ideograph */ + ["\u66D2", "\u66D2"], /* CJK Ideograph */ + ["\u66D3", "\u66D3"], /* CJK Ideograph */ + ["\u66D4", "\u66D4"], /* CJK Ideograph */ + ["\u66D5", "\u66D5"], /* CJK Ideograph */ + ["\u66D6", "\u66D6"], /* CJK Ideograph */ + ["\u66D7", "\u66D7"], /* CJK Ideograph */ + ["\u66D8", "\u66D8"], /* CJK Ideograph */ + ["\u66D9", "\u66D9"], /* CJK Ideograph */ + ["\u66DA", "\u66DA"], /* CJK Ideograph */ + ["\u66DB", "\u66DB"], /* CJK Ideograph */ + ["\u66DC", "\u66DC"], /* CJK Ideograph */ + ["\u66DD", "\u66DD"], /* CJK Ideograph */ + ["\u66DE", "\u66DE"], /* CJK Ideograph */ + ["\u66DF", "\u66DF"], /* CJK Ideograph */ + ["\u66E0", "\u66E0"], /* CJK Ideograph */ + ["\u66E1", "\u66E1"], /* CJK Ideograph */ + ["\u66E2", "\u66E2"], /* CJK Ideograph */ + ["\u66E3", "\u66E3"], /* CJK Ideograph */ + ["\u66E4", "\u66E4"], /* CJK Ideograph */ + ["\u66E5", "\u66E5"], /* CJK Ideograph */ + ["\u66E6", "\u66E6"], /* CJK Ideograph */ + ["\u66E7", "\u66E7"], /* CJK Ideograph */ + ["\u66E8", "\u66E8"], /* CJK Ideograph */ + ["\u66E9", "\u66E9"], /* CJK Ideograph */ + ["\u66EA", "\u66EA"], /* CJK Ideograph */ + ["\u66EB", "\u66EB"], /* CJK Ideograph */ + ["\u66EC", "\u66EC"], /* CJK Ideograph */ + ["\u66ED", "\u66ED"], /* CJK Ideograph */ + ["\u66EE", "\u66EE"], /* CJK Ideograph */ + ["\u66EF", "\u66EF"], /* CJK Ideograph */ + ["\u66F0", "\u66F0"], /* CJK Ideograph */ + ["\u66F1", "\u66F1"], /* CJK Ideograph */ + ["\u66F2", "\u66F2"], /* CJK Ideograph */ + ["\u66F3", "\u66F3"], /* CJK Ideograph */ + ["\u66F4", "\u66F4"], /* CJK Ideograph */ + ["\u66F5", "\u66F5"], /* CJK Ideograph */ + ["\u66F6", "\u66F6"], /* CJK Ideograph */ + ["\u66F7", "\u66F7"], /* CJK Ideograph */ + ["\u66F8", "\u66F8"], /* CJK Ideograph */ + ["\u66F9", "\u66F9"], /* CJK Ideograph */ + ["\u66FA", "\u66FA"], /* CJK Ideograph */ + ["\u66FB", "\u66FB"], /* CJK Ideograph */ + ["\u66FC", "\u66FC"], /* CJK Ideograph */ + ["\u66FD", "\u66FD"], /* CJK Ideograph */ + ["\u66FE", "\u66FE"], /* CJK Ideograph */ + ["\u66FF", "\u66FF"], /* CJK Ideograph */ + ["\u6700", "\u6700"], /* CJK Ideograph */ + ["\u6701", "\u6701"], /* CJK Ideograph */ + ["\u6702", "\u6702"], /* CJK Ideograph */ + ["\u6703", "\u6703"], /* CJK Ideograph */ + ["\u6704", "\u6704"], /* CJK Ideograph */ + ["\u6705", "\u6705"], /* CJK Ideograph */ + ["\u6706", "\u6706"], /* CJK Ideograph */ + ["\u6707", "\u6707"], /* CJK Ideograph */ + ["\u6708", "\u6708"], /* CJK Ideograph */ + ["\u6709", "\u6709"], /* CJK Ideograph */ + ["\u670A", "\u670A"], /* CJK Ideograph */ + ["\u670B", "\u670B"], /* CJK Ideograph */ + ["\u670C", "\u670C"], /* CJK Ideograph */ + ["\u670D", "\u670D"], /* CJK Ideograph */ + ["\u670E", "\u670E"], /* CJK Ideograph */ + ["\u670F", "\u670F"], /* CJK Ideograph */ + ["\u6710", "\u6710"], /* CJK Ideograph */ + ["\u6711", "\u6711"], /* CJK Ideograph */ + ["\u6712", "\u6712"], /* CJK Ideograph */ + ["\u6713", "\u6713"], /* CJK Ideograph */ + ["\u6714", "\u6714"], /* CJK Ideograph */ + ["\u6715", "\u6715"], /* CJK Ideograph */ + ["\u6716", "\u6716"], /* CJK Ideograph */ + ["\u6717", "\u6717"], /* CJK Ideograph */ + ["\u6718", "\u6718"], /* CJK Ideograph */ + ["\u6719", "\u6719"], /* CJK Ideograph */ + ["\u671A", "\u671A"], /* CJK Ideograph */ + ["\u671B", "\u671B"], /* CJK Ideograph */ + ["\u671C", "\u671C"], /* CJK Ideograph */ + ["\u671D", "\u671D"], /* CJK Ideograph */ + ["\u671E", "\u671E"], /* CJK Ideograph */ + ["\u671F", "\u671F"], /* CJK Ideograph */ + ["\u6720", "\u6720"], /* CJK Ideograph */ + ["\u6721", "\u6721"], /* CJK Ideograph */ + ["\u6722", "\u6722"], /* CJK Ideograph */ + ["\u6723", "\u6723"], /* CJK Ideograph */ + ["\u6724", "\u6724"], /* CJK Ideograph */ + ["\u6725", "\u6725"], /* CJK Ideograph */ + ["\u6726", "\u6726"], /* CJK Ideograph */ + ["\u6727", "\u6727"], /* CJK Ideograph */ + ["\u6728", "\u6728"], /* CJK Ideograph */ + ["\u6729", "\u6729"], /* CJK Ideograph */ + ["\u672A", "\u672A"], /* CJK Ideograph */ + ["\u672B", "\u672B"], /* CJK Ideograph */ + ["\u672C", "\u672C"], /* CJK Ideograph */ + ["\u672D", "\u672D"], /* CJK Ideograph */ + ["\u672E", "\u672E"], /* CJK Ideograph */ + ["\u672F", "\u672F"], /* CJK Ideograph */ + ["\u6730", "\u6730"], /* CJK Ideograph */ + ["\u6731", "\u6731"], /* CJK Ideograph */ + ["\u6732", "\u6732"], /* CJK Ideograph */ + ["\u6733", "\u6733"], /* CJK Ideograph */ + ["\u6734", "\u6734"], /* CJK Ideograph */ + ["\u6735", "\u6735"], /* CJK Ideograph */ + ["\u6736", "\u6736"], /* CJK Ideograph */ + ["\u6737", "\u6737"], /* CJK Ideograph */ + ["\u6738", "\u6738"], /* CJK Ideograph */ + ["\u6739", "\u6739"], /* CJK Ideograph */ + ["\u673A", "\u673A"], /* CJK Ideograph */ + ["\u673B", "\u673B"], /* CJK Ideograph */ + ["\u673C", "\u673C"], /* CJK Ideograph */ + ["\u673D", "\u673D"], /* CJK Ideograph */ + ["\u673E", "\u673E"], /* CJK Ideograph */ + ["\u673F", "\u673F"], /* CJK Ideograph */ + ["\u6740", "\u6740"], /* CJK Ideograph */ + ["\u6741", "\u6741"], /* CJK Ideograph */ + ["\u6742", "\u6742"], /* CJK Ideograph */ + ["\u6743", "\u6743"], /* CJK Ideograph */ + ["\u6744", "\u6744"], /* CJK Ideograph */ + ["\u6745", "\u6745"], /* CJK Ideograph */ + ["\u6746", "\u6746"], /* CJK Ideograph */ + ["\u6747", "\u6747"], /* CJK Ideograph */ + ["\u6748", "\u6748"], /* CJK Ideograph */ + ["\u6749", "\u6749"], /* CJK Ideograph */ + ["\u674A", "\u674A"], /* CJK Ideograph */ + ["\u674B", "\u674B"], /* CJK Ideograph */ + ["\u674C", "\u674C"], /* CJK Ideograph */ + ["\u674D", "\u674D"], /* CJK Ideograph */ + ["\u674E", "\u674E"], /* CJK Ideograph */ + ["\u674F", "\u674F"], /* CJK Ideograph */ + ["\u6750", "\u6750"], /* CJK Ideograph */ + ["\u6751", "\u6751"], /* CJK Ideograph */ + ["\u6752", "\u6752"], /* CJK Ideograph */ + ["\u6753", "\u6753"], /* CJK Ideograph */ + ["\u6754", "\u6754"], /* CJK Ideograph */ + ["\u6755", "\u6755"], /* CJK Ideograph */ + ["\u6756", "\u6756"], /* CJK Ideograph */ + ["\u6757", "\u6757"], /* CJK Ideograph */ + ["\u6758", "\u6758"], /* CJK Ideograph */ + ["\u6759", "\u6759"], /* CJK Ideograph */ + ["\u675A", "\u675A"], /* CJK Ideograph */ + ["\u675B", "\u675B"], /* CJK Ideograph */ + ["\u675C", "\u675C"], /* CJK Ideograph */ + ["\u675D", "\u675D"], /* CJK Ideograph */ + ["\u675E", "\u675E"], /* CJK Ideograph */ + ["\u675F", "\u675F"], /* CJK Ideograph */ + ["\u6760", "\u6760"], /* CJK Ideograph */ + ["\u6761", "\u6761"], /* CJK Ideograph */ + ["\u6762", "\u6762"], /* CJK Ideograph */ + ["\u6763", "\u6763"], /* CJK Ideograph */ + ["\u6764", "\u6764"], /* CJK Ideograph */ + ["\u6765", "\u6765"], /* CJK Ideograph */ + ["\u6766", "\u6766"], /* CJK Ideograph */ + ["\u6767", "\u6767"], /* CJK Ideograph */ + ["\u6768", "\u6768"], /* CJK Ideograph */ + ["\u6769", "\u6769"], /* CJK Ideograph */ + ["\u676A", "\u676A"], /* CJK Ideograph */ + ["\u676B", "\u676B"], /* CJK Ideograph */ + ["\u676C", "\u676C"], /* CJK Ideograph */ + ["\u676D", "\u676D"], /* CJK Ideograph */ + ["\u676E", "\u676E"], /* CJK Ideograph */ + ["\u676F", "\u676F"], /* CJK Ideograph */ + ["\u6770", "\u6770"], /* CJK Ideograph */ + ["\u6771", "\u6771"], /* CJK Ideograph */ + ["\u6772", "\u6772"], /* CJK Ideograph */ + ["\u6773", "\u6773"], /* CJK Ideograph */ + ["\u6774", "\u6774"], /* CJK Ideograph */ + ["\u6775", "\u6775"], /* CJK Ideograph */ + ["\u6776", "\u6776"], /* CJK Ideograph */ + ["\u6777", "\u6777"], /* CJK Ideograph */ + ["\u6778", "\u6778"], /* CJK Ideograph */ + ["\u6779", "\u6779"], /* CJK Ideograph */ + ["\u677A", "\u677A"], /* CJK Ideograph */ + ["\u677B", "\u677B"], /* CJK Ideograph */ + ["\u677C", "\u677C"], /* CJK Ideograph */ + ["\u677D", "\u677D"], /* CJK Ideograph */ + ["\u677E", "\u677E"], /* CJK Ideograph */ + ["\u677F", "\u677F"], /* CJK Ideograph */ + ["\u6780", "\u6780"], /* CJK Ideograph */ + ["\u6781", "\u6781"], /* CJK Ideograph */ + ["\u6782", "\u6782"], /* CJK Ideograph */ + ["\u6783", "\u6783"], /* CJK Ideograph */ + ["\u6784", "\u6784"], /* CJK Ideograph */ + ["\u6785", "\u6785"], /* CJK Ideograph */ + ["\u6786", "\u6786"], /* CJK Ideograph */ + ["\u6787", "\u6787"], /* CJK Ideograph */ + ["\u6788", "\u6788"], /* CJK Ideograph */ + ["\u6789", "\u6789"], /* CJK Ideograph */ + ["\u678A", "\u678A"], /* CJK Ideograph */ + ["\u678B", "\u678B"], /* CJK Ideograph */ + ["\u678C", "\u678C"], /* CJK Ideograph */ + ["\u678D", "\u678D"], /* CJK Ideograph */ + ["\u678E", "\u678E"], /* CJK Ideograph */ + ["\u678F", "\u678F"], /* CJK Ideograph */ + ["\u6790", "\u6790"], /* CJK Ideograph */ + ["\u6791", "\u6791"], /* CJK Ideograph */ + ["\u6792", "\u6792"], /* CJK Ideograph */ + ["\u6793", "\u6793"], /* CJK Ideograph */ + ["\u6794", "\u6794"], /* CJK Ideograph */ + ["\u6795", "\u6795"], /* CJK Ideograph */ + ["\u6796", "\u6796"], /* CJK Ideograph */ + ["\u6797", "\u6797"], /* CJK Ideograph */ + ["\u6798", "\u6798"], /* CJK Ideograph */ + ["\u6799", "\u6799"], /* CJK Ideograph */ + ["\u679A", "\u679A"], /* CJK Ideograph */ + ["\u679B", "\u679B"], /* CJK Ideograph */ + ["\u679C", "\u679C"], /* CJK Ideograph */ + ["\u679D", "\u679D"], /* CJK Ideograph */ + ["\u679E", "\u679E"], /* CJK Ideograph */ + ["\u679F", "\u679F"], /* CJK Ideograph */ + ["\u67A0", "\u67A0"], /* CJK Ideograph */ + ["\u67A1", "\u67A1"], /* CJK Ideograph */ + ["\u67A2", "\u67A2"], /* CJK Ideograph */ + ["\u67A3", "\u67A3"], /* CJK Ideograph */ + ["\u67A4", "\u67A4"], /* CJK Ideograph */ + ["\u67A5", "\u67A5"], /* CJK Ideograph */ + ["\u67A6", "\u67A6"], /* CJK Ideograph */ + ["\u67A7", "\u67A7"], /* CJK Ideograph */ + ["\u67A8", "\u67A8"], /* CJK Ideograph */ + ["\u67A9", "\u67A9"], /* CJK Ideograph */ + ["\u67AA", "\u67AA"], /* CJK Ideograph */ + ["\u67AB", "\u67AB"], /* CJK Ideograph */ + ["\u67AC", "\u67AC"], /* CJK Ideograph */ + ["\u67AD", "\u67AD"], /* CJK Ideograph */ + ["\u67AE", "\u67AE"], /* CJK Ideograph */ + ["\u67AF", "\u67AF"], /* CJK Ideograph */ + ["\u67B0", "\u67B0"], /* CJK Ideograph */ + ["\u67B1", "\u67B1"], /* CJK Ideograph */ + ["\u67B2", "\u67B2"], /* CJK Ideograph */ + ["\u67B3", "\u67B3"], /* CJK Ideograph */ + ["\u67B4", "\u67B4"], /* CJK Ideograph */ + ["\u67B5", "\u67B5"], /* CJK Ideograph */ + ["\u67B6", "\u67B6"], /* CJK Ideograph */ + ["\u67B7", "\u67B7"], /* CJK Ideograph */ + ["\u67B8", "\u67B8"], /* CJK Ideograph */ + ["\u67B9", "\u67B9"], /* CJK Ideograph */ + ["\u67BA", "\u67BA"], /* CJK Ideograph */ + ["\u67BB", "\u67BB"], /* CJK Ideograph */ + ["\u67BC", "\u67BC"], /* CJK Ideograph */ + ["\u67BD", "\u67BD"], /* CJK Ideograph */ + ["\u67BE", "\u67BE"], /* CJK Ideograph */ + ["\u67BF", "\u67BF"], /* CJK Ideograph */ + ["\u67C0", "\u67C0"], /* CJK Ideograph */ + ["\u67C1", "\u67C1"], /* CJK Ideograph */ + ["\u67C2", "\u67C2"], /* CJK Ideograph */ + ["\u67C3", "\u67C3"], /* CJK Ideograph */ + ["\u67C4", "\u67C4"], /* CJK Ideograph */ + ["\u67C5", "\u67C5"], /* CJK Ideograph */ + ["\u67C6", "\u67C6"], /* CJK Ideograph */ + ["\u67C7", "\u67C7"], /* CJK Ideograph */ + ["\u67C8", "\u67C8"], /* CJK Ideograph */ + ["\u67C9", "\u67C9"], /* CJK Ideograph */ + ["\u67CA", "\u67CA"], /* CJK Ideograph */ + ["\u67CB", "\u67CB"], /* CJK Ideograph */ + ["\u67CC", "\u67CC"], /* CJK Ideograph */ + ["\u67CD", "\u67CD"], /* CJK Ideograph */ + ["\u67CE", "\u67CE"], /* CJK Ideograph */ + ["\u67CF", "\u67CF"], /* CJK Ideograph */ + ["\u67D0", "\u67D0"], /* CJK Ideograph */ + ["\u67D1", "\u67D1"], /* CJK Ideograph */ + ["\u67D2", "\u67D2"], /* CJK Ideograph */ + ["\u67D3", "\u67D3"], /* CJK Ideograph */ + ["\u67D4", "\u67D4"], /* CJK Ideograph */ + ["\u67D5", "\u67D5"], /* CJK Ideograph */ + ["\u67D6", "\u67D6"], /* CJK Ideograph */ + ["\u67D7", "\u67D7"], /* CJK Ideograph */ + ["\u67D8", "\u67D8"], /* CJK Ideograph */ + ["\u67D9", "\u67D9"], /* CJK Ideograph */ + ["\u67DA", "\u67DA"], /* CJK Ideograph */ + ["\u67DB", "\u67DB"], /* CJK Ideograph */ + ["\u67DC", "\u67DC"], /* CJK Ideograph */ + ["\u67DD", "\u67DD"], /* CJK Ideograph */ + ["\u67DE", "\u67DE"], /* CJK Ideograph */ + ["\u67DF", "\u67DF"], /* CJK Ideograph */ + ["\u67E0", "\u67E0"], /* CJK Ideograph */ + ["\u67E1", "\u67E1"], /* CJK Ideograph */ + ["\u67E2", "\u67E2"], /* CJK Ideograph */ + ["\u67E3", "\u67E3"], /* CJK Ideograph */ + ["\u67E4", "\u67E4"], /* CJK Ideograph */ + ["\u67E5", "\u67E5"], /* CJK Ideograph */ + ["\u67E6", "\u67E6"], /* CJK Ideograph */ + ["\u67E7", "\u67E7"], /* CJK Ideograph */ + ["\u67E8", "\u67E8"], /* CJK Ideograph */ + ["\u67E9", "\u67E9"], /* CJK Ideograph */ + ["\u67EA", "\u67EA"], /* CJK Ideograph */ + ["\u67EB", "\u67EB"], /* CJK Ideograph */ + ["\u67EC", "\u67EC"], /* CJK Ideograph */ + ["\u67ED", "\u67ED"], /* CJK Ideograph */ + ["\u67EE", "\u67EE"], /* CJK Ideograph */ + ["\u67EF", "\u67EF"], /* CJK Ideograph */ + ["\u67F0", "\u67F0"], /* CJK Ideograph */ + ["\u67F1", "\u67F1"], /* CJK Ideograph */ + ["\u67F2", "\u67F2"], /* CJK Ideograph */ + ["\u67F3", "\u67F3"], /* CJK Ideograph */ + ["\u67F4", "\u67F4"], /* CJK Ideograph */ + ["\u67F5", "\u67F5"], /* CJK Ideograph */ + ["\u67F6", "\u67F6"], /* CJK Ideograph */ + ["\u67F7", "\u67F7"], /* CJK Ideograph */ + ["\u67F8", "\u67F8"], /* CJK Ideograph */ + ["\u67F9", "\u67F9"], /* CJK Ideograph */ + ["\u67FA", "\u67FA"], /* CJK Ideograph */ + ["\u67FB", "\u67FB"], /* CJK Ideograph */ + ["\u67FC", "\u67FC"], /* CJK Ideograph */ + ["\u67FD", "\u67FD"], /* CJK Ideograph */ + ["\u67FE", "\u67FE"], /* CJK Ideograph */ + ["\u67FF", "\u67FF"], /* CJK Ideograph */ + ["\u6800", "\u6800"], /* CJK Ideograph */ + ["\u6801", "\u6801"], /* CJK Ideograph */ + ["\u6802", "\u6802"], /* CJK Ideograph */ + ["\u6803", "\u6803"], /* CJK Ideograph */ + ["\u6804", "\u6804"], /* CJK Ideograph */ + ["\u6805", "\u6805"], /* CJK Ideograph */ + ["\u6806", "\u6806"], /* CJK Ideograph */ + ["\u6807", "\u6807"], /* CJK Ideograph */ + ["\u6808", "\u6808"], /* CJK Ideograph */ + ["\u6809", "\u6809"], /* CJK Ideograph */ + ["\u680A", "\u680A"], /* CJK Ideograph */ + ["\u680B", "\u680B"], /* CJK Ideograph */ + ["\u680C", "\u680C"], /* CJK Ideograph */ + ["\u680D", "\u680D"], /* CJK Ideograph */ + ["\u680E", "\u680E"], /* CJK Ideograph */ + ["\u680F", "\u680F"], /* CJK Ideograph */ + ["\u6810", "\u6810"], /* CJK Ideograph */ + ["\u6811", "\u6811"], /* CJK Ideograph */ + ["\u6812", "\u6812"], /* CJK Ideograph */ + ["\u6813", "\u6813"], /* CJK Ideograph */ + ["\u6814", "\u6814"], /* CJK Ideograph */ + ["\u6815", "\u6815"], /* CJK Ideograph */ + ["\u6816", "\u6816"], /* CJK Ideograph */ + ["\u6817", "\u6817"], /* CJK Ideograph */ + ["\u6818", "\u6818"], /* CJK Ideograph */ + ["\u6819", "\u6819"], /* CJK Ideograph */ + ["\u681A", "\u681A"], /* CJK Ideograph */ + ["\u681B", "\u681B"], /* CJK Ideograph */ + ["\u681C", "\u681C"], /* CJK Ideograph */ + ["\u681D", "\u681D"], /* CJK Ideograph */ + ["\u681E", "\u681E"], /* CJK Ideograph */ + ["\u681F", "\u681F"], /* CJK Ideograph */ + ["\u6820", "\u6820"], /* CJK Ideograph */ + ["\u6821", "\u6821"], /* CJK Ideograph */ + ["\u6822", "\u6822"], /* CJK Ideograph */ + ["\u6823", "\u6823"], /* CJK Ideograph */ + ["\u6824", "\u6824"], /* CJK Ideograph */ + ["\u6825", "\u6825"], /* CJK Ideograph */ + ["\u6826", "\u6826"], /* CJK Ideograph */ + ["\u6827", "\u6827"], /* CJK Ideograph */ + ["\u6828", "\u6828"], /* CJK Ideograph */ + ["\u6829", "\u6829"], /* CJK Ideograph */ + ["\u682A", "\u682A"], /* CJK Ideograph */ + ["\u682B", "\u682B"], /* CJK Ideograph */ + ["\u682C", "\u682C"], /* CJK Ideograph */ + ["\u682D", "\u682D"], /* CJK Ideograph */ + ["\u682E", "\u682E"], /* CJK Ideograph */ + ["\u682F", "\u682F"], /* CJK Ideograph */ + ["\u6830", "\u6830"], /* CJK Ideograph */ + ["\u6831", "\u6831"], /* CJK Ideograph */ + ["\u6832", "\u6832"], /* CJK Ideograph */ + ["\u6833", "\u6833"], /* CJK Ideograph */ + ["\u6834", "\u6834"], /* CJK Ideograph */ + ["\u6835", "\u6835"], /* CJK Ideograph */ + ["\u6836", "\u6836"], /* CJK Ideograph */ + ["\u6837", "\u6837"], /* CJK Ideograph */ + ["\u6838", "\u6838"], /* CJK Ideograph */ + ["\u6839", "\u6839"], /* CJK Ideograph */ + ["\u683A", "\u683A"], /* CJK Ideograph */ + ["\u683B", "\u683B"], /* CJK Ideograph */ + ["\u683C", "\u683C"], /* CJK Ideograph */ + ["\u683D", "\u683D"], /* CJK Ideograph */ + ["\u683E", "\u683E"], /* CJK Ideograph */ + ["\u683F", "\u683F"], /* CJK Ideograph */ + ["\u6840", "\u6840"], /* CJK Ideograph */ + ["\u6841", "\u6841"], /* CJK Ideograph */ + ["\u6842", "\u6842"], /* CJK Ideograph */ + ["\u6843", "\u6843"], /* CJK Ideograph */ + ["\u6844", "\u6844"], /* CJK Ideograph */ + ["\u6845", "\u6845"], /* CJK Ideograph */ + ["\u6846", "\u6846"], /* CJK Ideograph */ + ["\u6847", "\u6847"], /* CJK Ideograph */ + ["\u6848", "\u6848"], /* CJK Ideograph */ + ["\u6849", "\u6849"], /* CJK Ideograph */ + ["\u684A", "\u684A"], /* CJK Ideograph */ + ["\u684B", "\u684B"], /* CJK Ideograph */ + ["\u684C", "\u684C"], /* CJK Ideograph */ + ["\u684D", "\u684D"], /* CJK Ideograph */ + ["\u684E", "\u684E"], /* CJK Ideograph */ + ["\u684F", "\u684F"], /* CJK Ideograph */ + ["\u6850", "\u6850"], /* CJK Ideograph */ + ["\u6851", "\u6851"], /* CJK Ideograph */ + ["\u6852", "\u6852"], /* CJK Ideograph */ + ["\u6853", "\u6853"], /* CJK Ideograph */ + ["\u6854", "\u6854"], /* CJK Ideograph */ + ["\u6855", "\u6855"], /* CJK Ideograph */ + ["\u6856", "\u6856"], /* CJK Ideograph */ + ["\u6857", "\u6857"], /* CJK Ideograph */ + ["\u6858", "\u6858"], /* CJK Ideograph */ + ["\u6859", "\u6859"], /* CJK Ideograph */ + ["\u685A", "\u685A"], /* CJK Ideograph */ + ["\u685B", "\u685B"], /* CJK Ideograph */ + ["\u685C", "\u685C"], /* CJK Ideograph */ + ["\u685D", "\u685D"], /* CJK Ideograph */ + ["\u685E", "\u685E"], /* CJK Ideograph */ + ["\u685F", "\u685F"], /* CJK Ideograph */ + ["\u6860", "\u6860"], /* CJK Ideograph */ + ["\u6861", "\u6861"], /* CJK Ideograph */ + ["\u6862", "\u6862"], /* CJK Ideograph */ + ["\u6863", "\u6863"], /* CJK Ideograph */ + ["\u6864", "\u6864"], /* CJK Ideograph */ + ["\u6865", "\u6865"], /* CJK Ideograph */ + ["\u6866", "\u6866"], /* CJK Ideograph */ + ["\u6867", "\u6867"], /* CJK Ideograph */ + ["\u6868", "\u6868"], /* CJK Ideograph */ + ["\u6869", "\u6869"], /* CJK Ideograph */ + ["\u686A", "\u686A"], /* CJK Ideograph */ + ["\u686B", "\u686B"], /* CJK Ideograph */ + ["\u686C", "\u686C"], /* CJK Ideograph */ + ["\u686D", "\u686D"], /* CJK Ideograph */ + ["\u686E", "\u686E"], /* CJK Ideograph */ + ["\u686F", "\u686F"], /* CJK Ideograph */ + ["\u6870", "\u6870"], /* CJK Ideograph */ + ["\u6871", "\u6871"], /* CJK Ideograph */ + ["\u6872", "\u6872"], /* CJK Ideograph */ + ["\u6873", "\u6873"], /* CJK Ideograph */ + ["\u6874", "\u6874"], /* CJK Ideograph */ + ["\u6875", "\u6875"], /* CJK Ideograph */ + ["\u6876", "\u6876"], /* CJK Ideograph */ + ["\u6877", "\u6877"], /* CJK Ideograph */ + ["\u6878", "\u6878"], /* CJK Ideograph */ + ["\u6879", "\u6879"], /* CJK Ideograph */ + ["\u687A", "\u687A"], /* CJK Ideograph */ + ["\u687B", "\u687B"], /* CJK Ideograph */ + ["\u687C", "\u687C"], /* CJK Ideograph */ + ["\u687D", "\u687D"], /* CJK Ideograph */ + ["\u687E", "\u687E"], /* CJK Ideograph */ + ["\u687F", "\u687F"], /* CJK Ideograph */ + ["\u6880", "\u6880"], /* CJK Ideograph */ + ["\u6881", "\u6881"], /* CJK Ideograph */ + ["\u6882", "\u6882"], /* CJK Ideograph */ + ["\u6883", "\u6883"], /* CJK Ideograph */ + ["\u6884", "\u6884"], /* CJK Ideograph */ + ["\u6885", "\u6885"], /* CJK Ideograph */ + ["\u6886", "\u6886"], /* CJK Ideograph */ + ["\u6887", "\u6887"], /* CJK Ideograph */ + ["\u6888", "\u6888"], /* CJK Ideograph */ + ["\u6889", "\u6889"], /* CJK Ideograph */ + ["\u688A", "\u688A"], /* CJK Ideograph */ + ["\u688B", "\u688B"], /* CJK Ideograph */ + ["\u688C", "\u688C"], /* CJK Ideograph */ + ["\u688D", "\u688D"], /* CJK Ideograph */ + ["\u688E", "\u688E"], /* CJK Ideograph */ + ["\u688F", "\u688F"], /* CJK Ideograph */ + ["\u6890", "\u6890"], /* CJK Ideograph */ + ["\u6891", "\u6891"], /* CJK Ideograph */ + ["\u6892", "\u6892"], /* CJK Ideograph */ + ["\u6893", "\u6893"], /* CJK Ideograph */ + ["\u6894", "\u6894"], /* CJK Ideograph */ + ["\u6895", "\u6895"], /* CJK Ideograph */ + ["\u6896", "\u6896"], /* CJK Ideograph */ + ["\u6897", "\u6897"], /* CJK Ideograph */ + ["\u6898", "\u6898"], /* CJK Ideograph */ + ["\u6899", "\u6899"], /* CJK Ideograph */ + ["\u689A", "\u689A"], /* CJK Ideograph */ + ["\u689B", "\u689B"], /* CJK Ideograph */ + ["\u689C", "\u689C"], /* CJK Ideograph */ + ["\u689D", "\u689D"], /* CJK Ideograph */ + ["\u689E", "\u689E"], /* CJK Ideograph */ + ["\u689F", "\u689F"], /* CJK Ideograph */ + ["\u68A0", "\u68A0"], /* CJK Ideograph */ + ["\u68A1", "\u68A1"], /* CJK Ideograph */ + ["\u68A2", "\u68A2"], /* CJK Ideograph */ + ["\u68A3", "\u68A3"], /* CJK Ideograph */ + ["\u68A4", "\u68A4"], /* CJK Ideograph */ + ["\u68A5", "\u68A5"], /* CJK Ideograph */ + ["\u68A6", "\u68A6"], /* CJK Ideograph */ + ["\u68A7", "\u68A7"], /* CJK Ideograph */ + ["\u68A8", "\u68A8"], /* CJK Ideograph */ + ["\u68A9", "\u68A9"], /* CJK Ideograph */ + ["\u68AA", "\u68AA"], /* CJK Ideograph */ + ["\u68AB", "\u68AB"], /* CJK Ideograph */ + ["\u68AC", "\u68AC"], /* CJK Ideograph */ + ["\u68AD", "\u68AD"], /* CJK Ideograph */ + ["\u68AE", "\u68AE"], /* CJK Ideograph */ + ["\u68AF", "\u68AF"], /* CJK Ideograph */ + ["\u68B0", "\u68B0"], /* CJK Ideograph */ + ["\u68B1", "\u68B1"], /* CJK Ideograph */ + ["\u68B2", "\u68B2"], /* CJK Ideograph */ + ["\u68B3", "\u68B3"], /* CJK Ideograph */ + ["\u68B4", "\u68B4"], /* CJK Ideograph */ + ["\u68B5", "\u68B5"], /* CJK Ideograph */ + ["\u68B6", "\u68B6"], /* CJK Ideograph */ + ["\u68B7", "\u68B7"], /* CJK Ideograph */ + ["\u68B8", "\u68B8"], /* CJK Ideograph */ + ["\u68B9", "\u68B9"], /* CJK Ideograph */ + ["\u68BA", "\u68BA"], /* CJK Ideograph */ + ["\u68BB", "\u68BB"], /* CJK Ideograph */ + ["\u68BC", "\u68BC"], /* CJK Ideograph */ + ["\u68BD", "\u68BD"], /* CJK Ideograph */ + ["\u68BE", "\u68BE"], /* CJK Ideograph */ + ["\u68BF", "\u68BF"], /* CJK Ideograph */ + ["\u68C0", "\u68C0"], /* CJK Ideograph */ + ["\u68C1", "\u68C1"], /* CJK Ideograph */ + ["\u68C2", "\u68C2"], /* CJK Ideograph */ + ["\u68C3", "\u68C3"], /* CJK Ideograph */ + ["\u68C4", "\u68C4"], /* CJK Ideograph */ + ["\u68C5", "\u68C5"], /* CJK Ideograph */ + ["\u68C6", "\u68C6"], /* CJK Ideograph */ + ["\u68C7", "\u68C7"], /* CJK Ideograph */ + ["\u68C8", "\u68C8"], /* CJK Ideograph */ + ["\u68C9", "\u68C9"], /* CJK Ideograph */ + ["\u68CA", "\u68CA"], /* CJK Ideograph */ + ["\u68CB", "\u68CB"], /* CJK Ideograph */ + ["\u68CC", "\u68CC"], /* CJK Ideograph */ + ["\u68CD", "\u68CD"], /* CJK Ideograph */ + ["\u68CE", "\u68CE"], /* CJK Ideograph */ + ["\u68CF", "\u68CF"], /* CJK Ideograph */ + ["\u68D0", "\u68D0"], /* CJK Ideograph */ + ["\u68D1", "\u68D1"], /* CJK Ideograph */ + ["\u68D2", "\u68D2"], /* CJK Ideograph */ + ["\u68D3", "\u68D3"], /* CJK Ideograph */ + ["\u68D4", "\u68D4"], /* CJK Ideograph */ + ["\u68D5", "\u68D5"], /* CJK Ideograph */ + ["\u68D6", "\u68D6"], /* CJK Ideograph */ + ["\u68D7", "\u68D7"], /* CJK Ideograph */ + ["\u68D8", "\u68D8"], /* CJK Ideograph */ + ["\u68D9", "\u68D9"], /* CJK Ideograph */ + ["\u68DA", "\u68DA"], /* CJK Ideograph */ + ["\u68DB", "\u68DB"], /* CJK Ideograph */ + ["\u68DC", "\u68DC"], /* CJK Ideograph */ + ["\u68DD", "\u68DD"], /* CJK Ideograph */ + ["\u68DE", "\u68DE"], /* CJK Ideograph */ + ["\u68DF", "\u68DF"], /* CJK Ideograph */ + ["\u68E0", "\u68E0"], /* CJK Ideograph */ + ["\u68E1", "\u68E1"], /* CJK Ideograph */ + ["\u68E2", "\u68E2"], /* CJK Ideograph */ + ["\u68E3", "\u68E3"], /* CJK Ideograph */ + ["\u68E4", "\u68E4"], /* CJK Ideograph */ + ["\u68E5", "\u68E5"], /* CJK Ideograph */ + ["\u68E6", "\u68E6"], /* CJK Ideograph */ + ["\u68E7", "\u68E7"], /* CJK Ideograph */ + ["\u68E8", "\u68E8"], /* CJK Ideograph */ + ["\u68E9", "\u68E9"], /* CJK Ideograph */ + ["\u68EA", "\u68EA"], /* CJK Ideograph */ + ["\u68EB", "\u68EB"], /* CJK Ideograph */ + ["\u68EC", "\u68EC"], /* CJK Ideograph */ + ["\u68ED", "\u68ED"], /* CJK Ideograph */ + ["\u68EE", "\u68EE"], /* CJK Ideograph */ + ["\u68EF", "\u68EF"], /* CJK Ideograph */ + ["\u68F0", "\u68F0"], /* CJK Ideograph */ + ["\u68F1", "\u68F1"], /* CJK Ideograph */ + ["\u68F2", "\u68F2"], /* CJK Ideograph */ + ["\u68F3", "\u68F3"], /* CJK Ideograph */ + ["\u68F4", "\u68F4"], /* CJK Ideograph */ + ["\u68F5", "\u68F5"], /* CJK Ideograph */ + ["\u68F6", "\u68F6"], /* CJK Ideograph */ + ["\u68F7", "\u68F7"], /* CJK Ideograph */ + ["\u68F8", "\u68F8"], /* CJK Ideograph */ + ["\u68F9", "\u68F9"], /* CJK Ideograph */ + ["\u68FA", "\u68FA"], /* CJK Ideograph */ + ["\u68FB", "\u68FB"], /* CJK Ideograph */ + ["\u68FC", "\u68FC"], /* CJK Ideograph */ + ["\u68FD", "\u68FD"], /* CJK Ideograph */ + ["\u68FE", "\u68FE"], /* CJK Ideograph */ + ["\u68FF", "\u68FF"], /* CJK Ideograph */ + ["\u6900", "\u6900"], /* CJK Ideograph */ + ["\u6901", "\u6901"], /* CJK Ideograph */ + ["\u6902", "\u6902"], /* CJK Ideograph */ + ["\u6903", "\u6903"], /* CJK Ideograph */ + ["\u6904", "\u6904"], /* CJK Ideograph */ + ["\u6905", "\u6905"], /* CJK Ideograph */ + ["\u6906", "\u6906"], /* CJK Ideograph */ + ["\u6907", "\u6907"], /* CJK Ideograph */ + ["\u6908", "\u6908"], /* CJK Ideograph */ + ["\u6909", "\u6909"], /* CJK Ideograph */ + ["\u690A", "\u690A"], /* CJK Ideograph */ + ["\u690B", "\u690B"], /* CJK Ideograph */ + ["\u690C", "\u690C"], /* CJK Ideograph */ + ["\u690D", "\u690D"], /* CJK Ideograph */ + ["\u690E", "\u690E"], /* CJK Ideograph */ + ["\u690F", "\u690F"], /* CJK Ideograph */ + ["\u6910", "\u6910"], /* CJK Ideograph */ + ["\u6911", "\u6911"], /* CJK Ideograph */ + ["\u6912", "\u6912"], /* CJK Ideograph */ + ["\u6913", "\u6913"], /* CJK Ideograph */ + ["\u6914", "\u6914"], /* CJK Ideograph */ + ["\u6915", "\u6915"], /* CJK Ideograph */ + ["\u6916", "\u6916"], /* CJK Ideograph */ + ["\u6917", "\u6917"], /* CJK Ideograph */ + ["\u6918", "\u6918"], /* CJK Ideograph */ + ["\u6919", "\u6919"], /* CJK Ideograph */ + ["\u691A", "\u691A"], /* CJK Ideograph */ + ["\u691B", "\u691B"], /* CJK Ideograph */ + ["\u691C", "\u691C"], /* CJK Ideograph */ + ["\u691D", "\u691D"], /* CJK Ideograph */ + ["\u691E", "\u691E"], /* CJK Ideograph */ + ["\u691F", "\u691F"], /* CJK Ideograph */ + ["\u6920", "\u6920"], /* CJK Ideograph */ + ["\u6921", "\u6921"], /* CJK Ideograph */ + ["\u6922", "\u6922"], /* CJK Ideograph */ + ["\u6923", "\u6923"], /* CJK Ideograph */ + ["\u6924", "\u6924"], /* CJK Ideograph */ + ["\u6925", "\u6925"], /* CJK Ideograph */ + ["\u6926", "\u6926"], /* CJK Ideograph */ + ["\u6927", "\u6927"], /* CJK Ideograph */ + ["\u6928", "\u6928"], /* CJK Ideograph */ + ["\u6929", "\u6929"], /* CJK Ideograph */ + ["\u692A", "\u692A"], /* CJK Ideograph */ + ["\u692B", "\u692B"], /* CJK Ideograph */ + ["\u692C", "\u692C"], /* CJK Ideograph */ + ["\u692D", "\u692D"], /* CJK Ideograph */ + ["\u692E", "\u692E"], /* CJK Ideograph */ + ["\u692F", "\u692F"], /* CJK Ideograph */ + ["\u6930", "\u6930"], /* CJK Ideograph */ + ["\u6931", "\u6931"], /* CJK Ideograph */ + ["\u6932", "\u6932"], /* CJK Ideograph */ + ["\u6933", "\u6933"], /* CJK Ideograph */ + ["\u6934", "\u6934"], /* CJK Ideograph */ + ["\u6935", "\u6935"], /* CJK Ideograph */ + ["\u6936", "\u6936"], /* CJK Ideograph */ + ["\u6937", "\u6937"], /* CJK Ideograph */ + ["\u6938", "\u6938"], /* CJK Ideograph */ + ["\u6939", "\u6939"], /* CJK Ideograph */ + ["\u693A", "\u693A"], /* CJK Ideograph */ + ["\u693B", "\u693B"], /* CJK Ideograph */ + ["\u693C", "\u693C"], /* CJK Ideograph */ + ["\u693D", "\u693D"], /* CJK Ideograph */ + ["\u693E", "\u693E"], /* CJK Ideograph */ + ["\u693F", "\u693F"], /* CJK Ideograph */ + ["\u6940", "\u6940"], /* CJK Ideograph */ + ["\u6941", "\u6941"], /* CJK Ideograph */ + ["\u6942", "\u6942"], /* CJK Ideograph */ + ["\u6943", "\u6943"], /* CJK Ideograph */ + ["\u6944", "\u6944"], /* CJK Ideograph */ + ["\u6945", "\u6945"], /* CJK Ideograph */ + ["\u6946", "\u6946"], /* CJK Ideograph */ + ["\u6947", "\u6947"], /* CJK Ideograph */ + ["\u6948", "\u6948"], /* CJK Ideograph */ + ["\u6949", "\u6949"], /* CJK Ideograph */ + ["\u694A", "\u694A"], /* CJK Ideograph */ + ["\u694B", "\u694B"], /* CJK Ideograph */ + ["\u694C", "\u694C"], /* CJK Ideograph */ + ["\u694D", "\u694D"], /* CJK Ideograph */ + ["\u694E", "\u694E"], /* CJK Ideograph */ + ["\u694F", "\u694F"], /* CJK Ideograph */ + ["\u6950", "\u6950"], /* CJK Ideograph */ + ["\u6951", "\u6951"], /* CJK Ideograph */ + ["\u6952", "\u6952"], /* CJK Ideograph */ + ["\u6953", "\u6953"], /* CJK Ideograph */ + ["\u6954", "\u6954"], /* CJK Ideograph */ + ["\u6955", "\u6955"], /* CJK Ideograph */ + ["\u6956", "\u6956"], /* CJK Ideograph */ + ["\u6957", "\u6957"], /* CJK Ideograph */ + ["\u6958", "\u6958"], /* CJK Ideograph */ + ["\u6959", "\u6959"], /* CJK Ideograph */ + ["\u695A", "\u695A"], /* CJK Ideograph */ + ["\u695B", "\u695B"], /* CJK Ideograph */ + ["\u695C", "\u695C"], /* CJK Ideograph */ + ["\u695D", "\u695D"], /* CJK Ideograph */ + ["\u695E", "\u695E"], /* CJK Ideograph */ + ["\u695F", "\u695F"], /* CJK Ideograph */ + ["\u6960", "\u6960"], /* CJK Ideograph */ + ["\u6961", "\u6961"], /* CJK Ideograph */ + ["\u6962", "\u6962"], /* CJK Ideograph */ + ["\u6963", "\u6963"], /* CJK Ideograph */ + ["\u6964", "\u6964"], /* CJK Ideograph */ + ["\u6965", "\u6965"], /* CJK Ideograph */ + ["\u6966", "\u6966"], /* CJK Ideograph */ + ["\u6967", "\u6967"], /* CJK Ideograph */ + ["\u6968", "\u6968"], /* CJK Ideograph */ + ["\u6969", "\u6969"], /* CJK Ideograph */ + ["\u696A", "\u696A"], /* CJK Ideograph */ + ["\u696B", "\u696B"], /* CJK Ideograph */ + ["\u696C", "\u696C"], /* CJK Ideograph */ + ["\u696D", "\u696D"], /* CJK Ideograph */ + ["\u696E", "\u696E"], /* CJK Ideograph */ + ["\u696F", "\u696F"], /* CJK Ideograph */ + ["\u6970", "\u6970"], /* CJK Ideograph */ + ["\u6971", "\u6971"], /* CJK Ideograph */ + ["\u6972", "\u6972"], /* CJK Ideograph */ + ["\u6973", "\u6973"], /* CJK Ideograph */ + ["\u6974", "\u6974"], /* CJK Ideograph */ + ["\u6975", "\u6975"], /* CJK Ideograph */ + ["\u6976", "\u6976"], /* CJK Ideograph */ + ["\u6977", "\u6977"], /* CJK Ideograph */ + ["\u6978", "\u6978"], /* CJK Ideograph */ + ["\u6979", "\u6979"], /* CJK Ideograph */ + ["\u697A", "\u697A"], /* CJK Ideograph */ + ["\u697B", "\u697B"], /* CJK Ideograph */ + ["\u697C", "\u697C"], /* CJK Ideograph */ + ["\u697D", "\u697D"], /* CJK Ideograph */ + ["\u697E", "\u697E"], /* CJK Ideograph */ + ["\u697F", "\u697F"], /* CJK Ideograph */ + ["\u6980", "\u6980"], /* CJK Ideograph */ + ["\u6981", "\u6981"], /* CJK Ideograph */ + ["\u6982", "\u6982"], /* CJK Ideograph */ + ["\u6983", "\u6983"], /* CJK Ideograph */ + ["\u6984", "\u6984"], /* CJK Ideograph */ + ["\u6985", "\u6985"], /* CJK Ideograph */ + ["\u6986", "\u6986"], /* CJK Ideograph */ + ["\u6987", "\u6987"], /* CJK Ideograph */ + ["\u6988", "\u6988"], /* CJK Ideograph */ + ["\u6989", "\u6989"], /* CJK Ideograph */ + ["\u698A", "\u698A"], /* CJK Ideograph */ + ["\u698B", "\u698B"], /* CJK Ideograph */ + ["\u698C", "\u698C"], /* CJK Ideograph */ + ["\u698D", "\u698D"], /* CJK Ideograph */ + ["\u698E", "\u698E"], /* CJK Ideograph */ + ["\u698F", "\u698F"], /* CJK Ideograph */ + ["\u6990", "\u6990"], /* CJK Ideograph */ + ["\u6991", "\u6991"], /* CJK Ideograph */ + ["\u6992", "\u6992"], /* CJK Ideograph */ + ["\u6993", "\u6993"], /* CJK Ideograph */ + ["\u6994", "\u6994"], /* CJK Ideograph */ + ["\u6995", "\u6995"], /* CJK Ideograph */ + ["\u6996", "\u6996"], /* CJK Ideograph */ + ["\u6997", "\u6997"], /* CJK Ideograph */ + ["\u6998", "\u6998"], /* CJK Ideograph */ + ["\u6999", "\u6999"], /* CJK Ideograph */ + ["\u699A", "\u699A"], /* CJK Ideograph */ + ["\u699B", "\u699B"], /* CJK Ideograph */ + ["\u699C", "\u699C"], /* CJK Ideograph */ + ["\u699D", "\u699D"], /* CJK Ideograph */ + ["\u699E", "\u699E"], /* CJK Ideograph */ + ["\u699F", "\u699F"], /* CJK Ideograph */ + ["\u69A0", "\u69A0"], /* CJK Ideograph */ + ["\u69A1", "\u69A1"], /* CJK Ideograph */ + ["\u69A2", "\u69A2"], /* CJK Ideograph */ + ["\u69A3", "\u69A3"], /* CJK Ideograph */ + ["\u69A4", "\u69A4"], /* CJK Ideograph */ + ["\u69A5", "\u69A5"], /* CJK Ideograph */ + ["\u69A6", "\u69A6"], /* CJK Ideograph */ + ["\u69A7", "\u69A7"], /* CJK Ideograph */ + ["\u69A8", "\u69A8"], /* CJK Ideograph */ + ["\u69A9", "\u69A9"], /* CJK Ideograph */ + ["\u69AA", "\u69AA"], /* CJK Ideograph */ + ["\u69AB", "\u69AB"], /* CJK Ideograph */ + ["\u69AC", "\u69AC"], /* CJK Ideograph */ + ["\u69AD", "\u69AD"], /* CJK Ideograph */ + ["\u69AE", "\u69AE"], /* CJK Ideograph */ + ["\u69AF", "\u69AF"], /* CJK Ideograph */ + ["\u69B0", "\u69B0"], /* CJK Ideograph */ + ["\u69B1", "\u69B1"], /* CJK Ideograph */ + ["\u69B2", "\u69B2"], /* CJK Ideograph */ + ["\u69B3", "\u69B3"], /* CJK Ideograph */ + ["\u69B4", "\u69B4"], /* CJK Ideograph */ + ["\u69B5", "\u69B5"], /* CJK Ideograph */ + ["\u69B6", "\u69B6"], /* CJK Ideograph */ + ["\u69B7", "\u69B7"], /* CJK Ideograph */ + ["\u69B8", "\u69B8"], /* CJK Ideograph */ + ["\u69B9", "\u69B9"], /* CJK Ideograph */ + ["\u69BA", "\u69BA"], /* CJK Ideograph */ + ["\u69BB", "\u69BB"], /* CJK Ideograph */ + ["\u69BC", "\u69BC"], /* CJK Ideograph */ + ["\u69BD", "\u69BD"], /* CJK Ideograph */ + ["\u69BE", "\u69BE"], /* CJK Ideograph */ + ["\u69BF", "\u69BF"], /* CJK Ideograph */ + ["\u69C0", "\u69C0"], /* CJK Ideograph */ + ["\u69C1", "\u69C1"], /* CJK Ideograph */ + ["\u69C2", "\u69C2"], /* CJK Ideograph */ + ["\u69C3", "\u69C3"], /* CJK Ideograph */ + ["\u69C4", "\u69C4"], /* CJK Ideograph */ + ["\u69C5", "\u69C5"], /* CJK Ideograph */ + ["\u69C6", "\u69C6"], /* CJK Ideograph */ + ["\u69C7", "\u69C7"], /* CJK Ideograph */ + ["\u69C8", "\u69C8"], /* CJK Ideograph */ + ["\u69C9", "\u69C9"], /* CJK Ideograph */ + ["\u69CA", "\u69CA"], /* CJK Ideograph */ + ["\u69CB", "\u69CB"], /* CJK Ideograph */ + ["\u69CC", "\u69CC"], /* CJK Ideograph */ + ["\u69CD", "\u69CD"], /* CJK Ideograph */ + ["\u69CE", "\u69CE"], /* CJK Ideograph */ + ["\u69CF", "\u69CF"], /* CJK Ideograph */ + ["\u69D0", "\u69D0"], /* CJK Ideograph */ + ["\u69D1", "\u69D1"], /* CJK Ideograph */ + ["\u69D2", "\u69D2"], /* CJK Ideograph */ + ["\u69D3", "\u69D3"], /* CJK Ideograph */ + ["\u69D4", "\u69D4"], /* CJK Ideograph */ + ["\u69D5", "\u69D5"], /* CJK Ideograph */ + ["\u69D6", "\u69D6"], /* CJK Ideograph */ + ["\u69D7", "\u69D7"], /* CJK Ideograph */ + ["\u69D8", "\u69D8"], /* CJK Ideograph */ + ["\u69D9", "\u69D9"], /* CJK Ideograph */ + ["\u69DA", "\u69DA"], /* CJK Ideograph */ + ["\u69DB", "\u69DB"], /* CJK Ideograph */ + ["\u69DC", "\u69DC"], /* CJK Ideograph */ + ["\u69DD", "\u69DD"], /* CJK Ideograph */ + ["\u69DE", "\u69DE"], /* CJK Ideograph */ + ["\u69DF", "\u69DF"], /* CJK Ideograph */ + ["\u69E0", "\u69E0"], /* CJK Ideograph */ + ["\u69E1", "\u69E1"], /* CJK Ideograph */ + ["\u69E2", "\u69E2"], /* CJK Ideograph */ + ["\u69E3", "\u69E3"], /* CJK Ideograph */ + ["\u69E4", "\u69E4"], /* CJK Ideograph */ + ["\u69E5", "\u69E5"], /* CJK Ideograph */ + ["\u69E6", "\u69E6"], /* CJK Ideograph */ + ["\u69E7", "\u69E7"], /* CJK Ideograph */ + ["\u69E8", "\u69E8"], /* CJK Ideograph */ + ["\u69E9", "\u69E9"], /* CJK Ideograph */ + ["\u69EA", "\u69EA"], /* CJK Ideograph */ + ["\u69EB", "\u69EB"], /* CJK Ideograph */ + ["\u69EC", "\u69EC"], /* CJK Ideograph */ + ["\u69ED", "\u69ED"], /* CJK Ideograph */ + ["\u69EE", "\u69EE"], /* CJK Ideograph */ + ["\u69EF", "\u69EF"], /* CJK Ideograph */ + ["\u69F0", "\u69F0"], /* CJK Ideograph */ + ["\u69F1", "\u69F1"], /* CJK Ideograph */ + ["\u69F2", "\u69F2"], /* CJK Ideograph */ + ["\u69F3", "\u69F3"], /* CJK Ideograph */ + ["\u69F4", "\u69F4"], /* CJK Ideograph */ + ["\u69F5", "\u69F5"], /* CJK Ideograph */ + ["\u69F6", "\u69F6"], /* CJK Ideograph */ + ["\u69F7", "\u69F7"], /* CJK Ideograph */ + ["\u69F8", "\u69F8"], /* CJK Ideograph */ + ["\u69F9", "\u69F9"], /* CJK Ideograph */ + ["\u69FA", "\u69FA"], /* CJK Ideograph */ + ["\u69FB", "\u69FB"], /* CJK Ideograph */ + ["\u69FC", "\u69FC"], /* CJK Ideograph */ + ["\u69FD", "\u69FD"], /* CJK Ideograph */ + ["\u69FE", "\u69FE"], /* CJK Ideograph */ + ["\u69FF", "\u69FF"], /* CJK Ideograph */ + ["\u6A00", "\u6A00"], /* CJK Ideograph */ + ["\u6A01", "\u6A01"], /* CJK Ideograph */ + ["\u6A02", "\u6A02"], /* CJK Ideograph */ + ["\u6A03", "\u6A03"], /* CJK Ideograph */ + ["\u6A04", "\u6A04"], /* CJK Ideograph */ + ["\u6A05", "\u6A05"], /* CJK Ideograph */ + ["\u6A06", "\u6A06"], /* CJK Ideograph */ + ["\u6A07", "\u6A07"], /* CJK Ideograph */ + ["\u6A08", "\u6A08"], /* CJK Ideograph */ + ["\u6A09", "\u6A09"], /* CJK Ideograph */ + ["\u6A0A", "\u6A0A"], /* CJK Ideograph */ + ["\u6A0B", "\u6A0B"], /* CJK Ideograph */ + ["\u6A0C", "\u6A0C"], /* CJK Ideograph */ + ["\u6A0D", "\u6A0D"], /* CJK Ideograph */ + ["\u6A0E", "\u6A0E"], /* CJK Ideograph */ + ["\u6A0F", "\u6A0F"], /* CJK Ideograph */ + ["\u6A10", "\u6A10"], /* CJK Ideograph */ + ["\u6A11", "\u6A11"], /* CJK Ideograph */ + ["\u6A12", "\u6A12"], /* CJK Ideograph */ + ["\u6A13", "\u6A13"], /* CJK Ideograph */ + ["\u6A14", "\u6A14"], /* CJK Ideograph */ + ["\u6A15", "\u6A15"], /* CJK Ideograph */ + ["\u6A16", "\u6A16"], /* CJK Ideograph */ + ["\u6A17", "\u6A17"], /* CJK Ideograph */ + ["\u6A18", "\u6A18"], /* CJK Ideograph */ + ["\u6A19", "\u6A19"], /* CJK Ideograph */ + ["\u6A1A", "\u6A1A"], /* CJK Ideograph */ + ["\u6A1B", "\u6A1B"], /* CJK Ideograph */ + ["\u6A1C", "\u6A1C"], /* CJK Ideograph */ + ["\u6A1D", "\u6A1D"], /* CJK Ideograph */ + ["\u6A1E", "\u6A1E"], /* CJK Ideograph */ + ["\u6A1F", "\u6A1F"], /* CJK Ideograph */ + ["\u6A20", "\u6A20"], /* CJK Ideograph */ + ["\u6A21", "\u6A21"], /* CJK Ideograph */ + ["\u6A22", "\u6A22"], /* CJK Ideograph */ + ["\u6A23", "\u6A23"], /* CJK Ideograph */ + ["\u6A24", "\u6A24"], /* CJK Ideograph */ + ["\u6A25", "\u6A25"], /* CJK Ideograph */ + ["\u6A26", "\u6A26"], /* CJK Ideograph */ + ["\u6A27", "\u6A27"], /* CJK Ideograph */ + ["\u6A28", "\u6A28"], /* CJK Ideograph */ + ["\u6A29", "\u6A29"], /* CJK Ideograph */ + ["\u6A2A", "\u6A2A"], /* CJK Ideograph */ + ["\u6A2B", "\u6A2B"], /* CJK Ideograph */ + ["\u6A2C", "\u6A2C"], /* CJK Ideograph */ + ["\u6A2D", "\u6A2D"], /* CJK Ideograph */ + ["\u6A2E", "\u6A2E"], /* CJK Ideograph */ + ["\u6A2F", "\u6A2F"], /* CJK Ideograph */ + ["\u6A30", "\u6A30"], /* CJK Ideograph */ + ["\u6A31", "\u6A31"], /* CJK Ideograph */ + ["\u6A32", "\u6A32"], /* CJK Ideograph */ + ["\u6A33", "\u6A33"], /* CJK Ideograph */ + ["\u6A34", "\u6A34"], /* CJK Ideograph */ + ["\u6A35", "\u6A35"], /* CJK Ideograph */ + ["\u6A36", "\u6A36"], /* CJK Ideograph */ + ["\u6A37", "\u6A37"], /* CJK Ideograph */ + ["\u6A38", "\u6A38"], /* CJK Ideograph */ + ["\u6A39", "\u6A39"], /* CJK Ideograph */ + ["\u6A3A", "\u6A3A"], /* CJK Ideograph */ + ["\u6A3B", "\u6A3B"], /* CJK Ideograph */ + ["\u6A3C", "\u6A3C"], /* CJK Ideograph */ + ["\u6A3D", "\u6A3D"], /* CJK Ideograph */ + ["\u6A3E", "\u6A3E"], /* CJK Ideograph */ + ["\u6A3F", "\u6A3F"], /* CJK Ideograph */ + ["\u6A40", "\u6A40"], /* CJK Ideograph */ + ["\u6A41", "\u6A41"], /* CJK Ideograph */ + ["\u6A42", "\u6A42"], /* CJK Ideograph */ + ["\u6A43", "\u6A43"], /* CJK Ideograph */ + ["\u6A44", "\u6A44"], /* CJK Ideograph */ + ["\u6A45", "\u6A45"], /* CJK Ideograph */ + ["\u6A46", "\u6A46"], /* CJK Ideograph */ + ["\u6A47", "\u6A47"], /* CJK Ideograph */ + ["\u6A48", "\u6A48"], /* CJK Ideograph */ + ["\u6A49", "\u6A49"], /* CJK Ideograph */ + ["\u6A4A", "\u6A4A"], /* CJK Ideograph */ + ["\u6A4B", "\u6A4B"], /* CJK Ideograph */ + ["\u6A4C", "\u6A4C"], /* CJK Ideograph */ + ["\u6A4D", "\u6A4D"], /* CJK Ideograph */ + ["\u6A4E", "\u6A4E"], /* CJK Ideograph */ + ["\u6A4F", "\u6A4F"], /* CJK Ideograph */ + ["\u6A50", "\u6A50"], /* CJK Ideograph */ + ["\u6A51", "\u6A51"], /* CJK Ideograph */ + ["\u6A52", "\u6A52"], /* CJK Ideograph */ + ["\u6A53", "\u6A53"], /* CJK Ideograph */ + ["\u6A54", "\u6A54"], /* CJK Ideograph */ + ["\u6A55", "\u6A55"], /* CJK Ideograph */ + ["\u6A56", "\u6A56"], /* CJK Ideograph */ + ["\u6A57", "\u6A57"], /* CJK Ideograph */ + ["\u6A58", "\u6A58"], /* CJK Ideograph */ + ["\u6A59", "\u6A59"], /* CJK Ideograph */ + ["\u6A5A", "\u6A5A"], /* CJK Ideograph */ + ["\u6A5B", "\u6A5B"], /* CJK Ideograph */ + ["\u6A5C", "\u6A5C"], /* CJK Ideograph */ + ["\u6A5D", "\u6A5D"], /* CJK Ideograph */ + ["\u6A5E", "\u6A5E"], /* CJK Ideograph */ + ["\u6A5F", "\u6A5F"], /* CJK Ideograph */ + ["\u6A60", "\u6A60"], /* CJK Ideograph */ + ["\u6A61", "\u6A61"], /* CJK Ideograph */ + ["\u6A62", "\u6A62"], /* CJK Ideograph */ + ["\u6A63", "\u6A63"], /* CJK Ideograph */ + ["\u6A64", "\u6A64"], /* CJK Ideograph */ + ["\u6A65", "\u6A65"], /* CJK Ideograph */ + ["\u6A66", "\u6A66"], /* CJK Ideograph */ + ["\u6A67", "\u6A67"], /* CJK Ideograph */ + ["\u6A68", "\u6A68"], /* CJK Ideograph */ + ["\u6A69", "\u6A69"], /* CJK Ideograph */ + ["\u6A6A", "\u6A6A"], /* CJK Ideograph */ + ["\u6A6B", "\u6A6B"], /* CJK Ideograph */ + ["\u6A6C", "\u6A6C"], /* CJK Ideograph */ + ["\u6A6D", "\u6A6D"], /* CJK Ideograph */ + ["\u6A6E", "\u6A6E"], /* CJK Ideograph */ + ["\u6A6F", "\u6A6F"], /* CJK Ideograph */ + ["\u6A70", "\u6A70"], /* CJK Ideograph */ + ["\u6A71", "\u6A71"], /* CJK Ideograph */ + ["\u6A72", "\u6A72"], /* CJK Ideograph */ + ["\u6A73", "\u6A73"], /* CJK Ideograph */ + ["\u6A74", "\u6A74"], /* CJK Ideograph */ + ["\u6A75", "\u6A75"], /* CJK Ideograph */ + ["\u6A76", "\u6A76"], /* CJK Ideograph */ + ["\u6A77", "\u6A77"], /* CJK Ideograph */ + ["\u6A78", "\u6A78"], /* CJK Ideograph */ + ["\u6A79", "\u6A79"], /* CJK Ideograph */ + ["\u6A7A", "\u6A7A"], /* CJK Ideograph */ + ["\u6A7B", "\u6A7B"], /* CJK Ideograph */ + ["\u6A7C", "\u6A7C"], /* CJK Ideograph */ + ["\u6A7D", "\u6A7D"], /* CJK Ideograph */ + ["\u6A7E", "\u6A7E"], /* CJK Ideograph */ + ["\u6A7F", "\u6A7F"], /* CJK Ideograph */ + ["\u6A80", "\u6A80"], /* CJK Ideograph */ + ["\u6A81", "\u6A81"], /* CJK Ideograph */ + ["\u6A82", "\u6A82"], /* CJK Ideograph */ + ["\u6A83", "\u6A83"], /* CJK Ideograph */ + ["\u6A84", "\u6A84"], /* CJK Ideograph */ + ["\u6A85", "\u6A85"], /* CJK Ideograph */ + ["\u6A86", "\u6A86"], /* CJK Ideograph */ + ["\u6A87", "\u6A87"], /* CJK Ideograph */ + ["\u6A88", "\u6A88"], /* CJK Ideograph */ + ["\u6A89", "\u6A89"], /* CJK Ideograph */ + ["\u6A8A", "\u6A8A"], /* CJK Ideograph */ + ["\u6A8B", "\u6A8B"], /* CJK Ideograph */ + ["\u6A8C", "\u6A8C"], /* CJK Ideograph */ + ["\u6A8D", "\u6A8D"], /* CJK Ideograph */ + ["\u6A8E", "\u6A8E"], /* CJK Ideograph */ + ["\u6A8F", "\u6A8F"], /* CJK Ideograph */ + ["\u6A90", "\u6A90"], /* CJK Ideograph */ + ["\u6A91", "\u6A91"], /* CJK Ideograph */ + ["\u6A92", "\u6A92"], /* CJK Ideograph */ + ["\u6A93", "\u6A93"], /* CJK Ideograph */ + ["\u6A94", "\u6A94"], /* CJK Ideograph */ + ["\u6A95", "\u6A95"], /* CJK Ideograph */ + ["\u6A96", "\u6A96"], /* CJK Ideograph */ + ["\u6A97", "\u6A97"], /* CJK Ideograph */ + ["\u6A98", "\u6A98"], /* CJK Ideograph */ + ["\u6A99", "\u6A99"], /* CJK Ideograph */ + ["\u6A9A", "\u6A9A"], /* CJK Ideograph */ + ["\u6A9B", "\u6A9B"], /* CJK Ideograph */ + ["\u6A9C", "\u6A9C"], /* CJK Ideograph */ + ["\u6A9D", "\u6A9D"], /* CJK Ideograph */ + ["\u6A9E", "\u6A9E"], /* CJK Ideograph */ + ["\u6A9F", "\u6A9F"], /* CJK Ideograph */ + ["\u6AA0", "\u6AA0"], /* CJK Ideograph */ + ["\u6AA1", "\u6AA1"], /* CJK Ideograph */ + ["\u6AA2", "\u6AA2"], /* CJK Ideograph */ + ["\u6AA3", "\u6AA3"], /* CJK Ideograph */ + ["\u6AA4", "\u6AA4"], /* CJK Ideograph */ + ["\u6AA5", "\u6AA5"], /* CJK Ideograph */ + ["\u6AA6", "\u6AA6"], /* CJK Ideograph */ + ["\u6AA7", "\u6AA7"], /* CJK Ideograph */ + ["\u6AA8", "\u6AA8"], /* CJK Ideograph */ + ["\u6AA9", "\u6AA9"], /* CJK Ideograph */ + ["\u6AAA", "\u6AAA"], /* CJK Ideograph */ + ["\u6AAB", "\u6AAB"], /* CJK Ideograph */ + ["\u6AAC", "\u6AAC"], /* CJK Ideograph */ + ["\u6AAD", "\u6AAD"], /* CJK Ideograph */ + ["\u6AAE", "\u6AAE"], /* CJK Ideograph */ + ["\u6AAF", "\u6AAF"], /* CJK Ideograph */ + ["\u6AB0", "\u6AB0"], /* CJK Ideograph */ + ["\u6AB1", "\u6AB1"], /* CJK Ideograph */ + ["\u6AB2", "\u6AB2"], /* CJK Ideograph */ + ["\u6AB3", "\u6AB3"], /* CJK Ideograph */ + ["\u6AB4", "\u6AB4"], /* CJK Ideograph */ + ["\u6AB5", "\u6AB5"], /* CJK Ideograph */ + ["\u6AB6", "\u6AB6"], /* CJK Ideograph */ + ["\u6AB7", "\u6AB7"], /* CJK Ideograph */ + ["\u6AB8", "\u6AB8"], /* CJK Ideograph */ + ["\u6AB9", "\u6AB9"], /* CJK Ideograph */ + ["\u6ABA", "\u6ABA"], /* CJK Ideograph */ + ["\u6ABB", "\u6ABB"], /* CJK Ideograph */ + ["\u6ABC", "\u6ABC"], /* CJK Ideograph */ + ["\u6ABD", "\u6ABD"], /* CJK Ideograph */ + ["\u6ABE", "\u6ABE"], /* CJK Ideograph */ + ["\u6ABF", "\u6ABF"], /* CJK Ideograph */ + ["\u6AC0", "\u6AC0"], /* CJK Ideograph */ + ["\u6AC1", "\u6AC1"], /* CJK Ideograph */ + ["\u6AC2", "\u6AC2"], /* CJK Ideograph */ + ["\u6AC3", "\u6AC3"], /* CJK Ideograph */ + ["\u6AC4", "\u6AC4"], /* CJK Ideograph */ + ["\u6AC5", "\u6AC5"], /* CJK Ideograph */ + ["\u6AC6", "\u6AC6"], /* CJK Ideograph */ + ["\u6AC7", "\u6AC7"], /* CJK Ideograph */ + ["\u6AC8", "\u6AC8"], /* CJK Ideograph */ + ["\u6AC9", "\u6AC9"], /* CJK Ideograph */ + ["\u6ACA", "\u6ACA"], /* CJK Ideograph */ + ["\u6ACB", "\u6ACB"], /* CJK Ideograph */ + ["\u6ACC", "\u6ACC"], /* CJK Ideograph */ + ["\u6ACD", "\u6ACD"], /* CJK Ideograph */ + ["\u6ACE", "\u6ACE"], /* CJK Ideograph */ + ["\u6ACF", "\u6ACF"], /* CJK Ideograph */ + ["\u6AD0", "\u6AD0"], /* CJK Ideograph */ + ["\u6AD1", "\u6AD1"], /* CJK Ideograph */ + ["\u6AD2", "\u6AD2"], /* CJK Ideograph */ + ["\u6AD3", "\u6AD3"], /* CJK Ideograph */ + ["\u6AD4", "\u6AD4"], /* CJK Ideograph */ + ["\u6AD5", "\u6AD5"], /* CJK Ideograph */ + ["\u6AD6", "\u6AD6"], /* CJK Ideograph */ + ["\u6AD7", "\u6AD7"], /* CJK Ideograph */ + ["\u6AD8", "\u6AD8"], /* CJK Ideograph */ + ["\u6AD9", "\u6AD9"], /* CJK Ideograph */ + ["\u6ADA", "\u6ADA"], /* CJK Ideograph */ + ["\u6ADB", "\u6ADB"], /* CJK Ideograph */ + ["\u6ADC", "\u6ADC"], /* CJK Ideograph */ + ["\u6ADD", "\u6ADD"], /* CJK Ideograph */ + ["\u6ADE", "\u6ADE"], /* CJK Ideograph */ + ["\u6ADF", "\u6ADF"], /* CJK Ideograph */ + ["\u6AE0", "\u6AE0"], /* CJK Ideograph */ + ["\u6AE1", "\u6AE1"], /* CJK Ideograph */ + ["\u6AE2", "\u6AE2"], /* CJK Ideograph */ + ["\u6AE3", "\u6AE3"], /* CJK Ideograph */ + ["\u6AE4", "\u6AE4"], /* CJK Ideograph */ + ["\u6AE5", "\u6AE5"], /* CJK Ideograph */ + ["\u6AE6", "\u6AE6"], /* CJK Ideograph */ + ["\u6AE7", "\u6AE7"], /* CJK Ideograph */ + ["\u6AE8", "\u6AE8"], /* CJK Ideograph */ + ["\u6AE9", "\u6AE9"], /* CJK Ideograph */ + ["\u6AEA", "\u6AEA"], /* CJK Ideograph */ + ["\u6AEB", "\u6AEB"], /* CJK Ideograph */ + ["\u6AEC", "\u6AEC"], /* CJK Ideograph */ + ["\u6AED", "\u6AED"], /* CJK Ideograph */ + ["\u6AEE", "\u6AEE"], /* CJK Ideograph */ + ["\u6AEF", "\u6AEF"], /* CJK Ideograph */ + ["\u6AF0", "\u6AF0"], /* CJK Ideograph */ + ["\u6AF1", "\u6AF1"], /* CJK Ideograph */ + ["\u6AF2", "\u6AF2"], /* CJK Ideograph */ + ["\u6AF3", "\u6AF3"], /* CJK Ideograph */ + ["\u6AF4", "\u6AF4"], /* CJK Ideograph */ + ["\u6AF5", "\u6AF5"], /* CJK Ideograph */ + ["\u6AF6", "\u6AF6"], /* CJK Ideograph */ + ["\u6AF7", "\u6AF7"], /* CJK Ideograph */ + ["\u6AF8", "\u6AF8"], /* CJK Ideograph */ + ["\u6AF9", "\u6AF9"], /* CJK Ideograph */ + ["\u6AFA", "\u6AFA"], /* CJK Ideograph */ + ["\u6AFB", "\u6AFB"], /* CJK Ideograph */ + ["\u6AFC", "\u6AFC"], /* CJK Ideograph */ + ["\u6AFD", "\u6AFD"], /* CJK Ideograph */ + ["\u6AFE", "\u6AFE"], /* CJK Ideograph */ + ["\u6AFF", "\u6AFF"], /* CJK Ideograph */ + ["\u6B00", "\u6B00"], /* CJK Ideograph */ + ["\u6B01", "\u6B01"], /* CJK Ideograph */ + ["\u6B02", "\u6B02"], /* CJK Ideograph */ + ["\u6B03", "\u6B03"], /* CJK Ideograph */ + ["\u6B04", "\u6B04"], /* CJK Ideograph */ + ["\u6B05", "\u6B05"], /* CJK Ideograph */ + ["\u6B06", "\u6B06"], /* CJK Ideograph */ + ["\u6B07", "\u6B07"], /* CJK Ideograph */ + ["\u6B08", "\u6B08"], /* CJK Ideograph */ + ["\u6B09", "\u6B09"], /* CJK Ideograph */ + ["\u6B0A", "\u6B0A"], /* CJK Ideograph */ + ["\u6B0B", "\u6B0B"], /* CJK Ideograph */ + ["\u6B0C", "\u6B0C"], /* CJK Ideograph */ + ["\u6B0D", "\u6B0D"], /* CJK Ideograph */ + ["\u6B0E", "\u6B0E"], /* CJK Ideograph */ + ["\u6B0F", "\u6B0F"], /* CJK Ideograph */ + ["\u6B10", "\u6B10"], /* CJK Ideograph */ + ["\u6B11", "\u6B11"], /* CJK Ideograph */ + ["\u6B12", "\u6B12"], /* CJK Ideograph */ + ["\u6B13", "\u6B13"], /* CJK Ideograph */ + ["\u6B14", "\u6B14"], /* CJK Ideograph */ + ["\u6B15", "\u6B15"], /* CJK Ideograph */ + ["\u6B16", "\u6B16"], /* CJK Ideograph */ + ["\u6B17", "\u6B17"], /* CJK Ideograph */ + ["\u6B18", "\u6B18"], /* CJK Ideograph */ + ["\u6B19", "\u6B19"], /* CJK Ideograph */ + ["\u6B1A", "\u6B1A"], /* CJK Ideograph */ + ["\u6B1B", "\u6B1B"], /* CJK Ideograph */ + ["\u6B1C", "\u6B1C"], /* CJK Ideograph */ + ["\u6B1D", "\u6B1D"], /* CJK Ideograph */ + ["\u6B1E", "\u6B1E"], /* CJK Ideograph */ + ["\u6B1F", "\u6B1F"], /* CJK Ideograph */ + ["\u6B20", "\u6B20"], /* CJK Ideograph */ + ["\u6B21", "\u6B21"], /* CJK Ideograph */ + ["\u6B22", "\u6B22"], /* CJK Ideograph */ + ["\u6B23", "\u6B23"], /* CJK Ideograph */ + ["\u6B24", "\u6B24"], /* CJK Ideograph */ + ["\u6B25", "\u6B25"], /* CJK Ideograph */ + ["\u6B26", "\u6B26"], /* CJK Ideograph */ + ["\u6B27", "\u6B27"], /* CJK Ideograph */ + ["\u6B28", "\u6B28"], /* CJK Ideograph */ + ["\u6B29", "\u6B29"], /* CJK Ideograph */ + ["\u6B2A", "\u6B2A"], /* CJK Ideograph */ + ["\u6B2B", "\u6B2B"], /* CJK Ideograph */ + ["\u6B2C", "\u6B2C"], /* CJK Ideograph */ + ["\u6B2D", "\u6B2D"], /* CJK Ideograph */ + ["\u6B2E", "\u6B2E"], /* CJK Ideograph */ + ["\u6B2F", "\u6B2F"], /* CJK Ideograph */ + ["\u6B30", "\u6B30"], /* CJK Ideograph */ + ["\u6B31", "\u6B31"], /* CJK Ideograph */ + ["\u6B32", "\u6B32"], /* CJK Ideograph */ + ["\u6B33", "\u6B33"], /* CJK Ideograph */ + ["\u6B34", "\u6B34"], /* CJK Ideograph */ + ["\u6B35", "\u6B35"], /* CJK Ideograph */ + ["\u6B36", "\u6B36"], /* CJK Ideograph */ + ["\u6B37", "\u6B37"], /* CJK Ideograph */ + ["\u6B38", "\u6B38"], /* CJK Ideograph */ + ["\u6B39", "\u6B39"], /* CJK Ideograph */ + ["\u6B3A", "\u6B3A"], /* CJK Ideograph */ + ["\u6B3B", "\u6B3B"], /* CJK Ideograph */ + ["\u6B3C", "\u6B3C"], /* CJK Ideograph */ + ["\u6B3D", "\u6B3D"], /* CJK Ideograph */ + ["\u6B3E", "\u6B3E"], /* CJK Ideograph */ + ["\u6B3F", "\u6B3F"], /* CJK Ideograph */ + ["\u6B40", "\u6B40"], /* CJK Ideograph */ + ["\u6B41", "\u6B41"], /* CJK Ideograph */ + ["\u6B42", "\u6B42"], /* CJK Ideograph */ + ["\u6B43", "\u6B43"], /* CJK Ideograph */ + ["\u6B44", "\u6B44"], /* CJK Ideograph */ + ["\u6B45", "\u6B45"], /* CJK Ideograph */ + ["\u6B46", "\u6B46"], /* CJK Ideograph */ + ["\u6B47", "\u6B47"], /* CJK Ideograph */ + ["\u6B48", "\u6B48"], /* CJK Ideograph */ + ["\u6B49", "\u6B49"], /* CJK Ideograph */ + ["\u6B4A", "\u6B4A"], /* CJK Ideograph */ + ["\u6B4B", "\u6B4B"], /* CJK Ideograph */ + ["\u6B4C", "\u6B4C"], /* CJK Ideograph */ + ["\u6B4D", "\u6B4D"], /* CJK Ideograph */ + ["\u6B4E", "\u6B4E"], /* CJK Ideograph */ + ["\u6B4F", "\u6B4F"], /* CJK Ideograph */ + ["\u6B50", "\u6B50"], /* CJK Ideograph */ + ["\u6B51", "\u6B51"], /* CJK Ideograph */ + ["\u6B52", "\u6B52"], /* CJK Ideograph */ + ["\u6B53", "\u6B53"], /* CJK Ideograph */ + ["\u6B54", "\u6B54"], /* CJK Ideograph */ + ["\u6B55", "\u6B55"], /* CJK Ideograph */ + ["\u6B56", "\u6B56"], /* CJK Ideograph */ + ["\u6B57", "\u6B57"], /* CJK Ideograph */ + ["\u6B58", "\u6B58"], /* CJK Ideograph */ + ["\u6B59", "\u6B59"], /* CJK Ideograph */ + ["\u6B5A", "\u6B5A"], /* CJK Ideograph */ + ["\u6B5B", "\u6B5B"], /* CJK Ideograph */ + ["\u6B5C", "\u6B5C"], /* CJK Ideograph */ + ["\u6B5D", "\u6B5D"], /* CJK Ideograph */ + ["\u6B5E", "\u6B5E"], /* CJK Ideograph */ + ["\u6B5F", "\u6B5F"], /* CJK Ideograph */ + ["\u6B60", "\u6B60"], /* CJK Ideograph */ + ["\u6B61", "\u6B61"], /* CJK Ideograph */ + ["\u6B62", "\u6B62"], /* CJK Ideograph */ + ["\u6B63", "\u6B63"], /* CJK Ideograph */ + ["\u6B64", "\u6B64"], /* CJK Ideograph */ + ["\u6B65", "\u6B65"], /* CJK Ideograph */ + ["\u6B66", "\u6B66"], /* CJK Ideograph */ + ["\u6B67", "\u6B67"], /* CJK Ideograph */ + ["\u6B68", "\u6B68"], /* CJK Ideograph */ + ["\u6B69", "\u6B69"], /* CJK Ideograph */ + ["\u6B6A", "\u6B6A"], /* CJK Ideograph */ + ["\u6B6B", "\u6B6B"], /* CJK Ideograph */ + ["\u6B6C", "\u6B6C"], /* CJK Ideograph */ + ["\u6B6D", "\u6B6D"], /* CJK Ideograph */ + ["\u6B6E", "\u6B6E"], /* CJK Ideograph */ + ["\u6B6F", "\u6B6F"], /* CJK Ideograph */ + ["\u6B70", "\u6B70"], /* CJK Ideograph */ + ["\u6B71", "\u6B71"], /* CJK Ideograph */ + ["\u6B72", "\u6B72"], /* CJK Ideograph */ + ["\u6B73", "\u6B73"], /* CJK Ideograph */ + ["\u6B74", "\u6B74"], /* CJK Ideograph */ + ["\u6B75", "\u6B75"], /* CJK Ideograph */ + ["\u6B76", "\u6B76"], /* CJK Ideograph */ + ["\u6B77", "\u6B77"], /* CJK Ideograph */ + ["\u6B78", "\u6B78"], /* CJK Ideograph */ + ["\u6B79", "\u6B79"], /* CJK Ideograph */ + ["\u6B7A", "\u6B7A"], /* CJK Ideograph */ + ["\u6B7B", "\u6B7B"], /* CJK Ideograph */ + ["\u6B7C", "\u6B7C"], /* CJK Ideograph */ + ["\u6B7D", "\u6B7D"], /* CJK Ideograph */ + ["\u6B7E", "\u6B7E"], /* CJK Ideograph */ + ["\u6B7F", "\u6B7F"], /* CJK Ideograph */ + ["\u6B80", "\u6B80"], /* CJK Ideograph */ + ["\u6B81", "\u6B81"], /* CJK Ideograph */ + ["\u6B82", "\u6B82"], /* CJK Ideograph */ + ["\u6B83", "\u6B83"], /* CJK Ideograph */ + ["\u6B84", "\u6B84"], /* CJK Ideograph */ + ["\u6B85", "\u6B85"], /* CJK Ideograph */ + ["\u6B86", "\u6B86"], /* CJK Ideograph */ + ["\u6B87", "\u6B87"], /* CJK Ideograph */ + ["\u6B88", "\u6B88"], /* CJK Ideograph */ + ["\u6B89", "\u6B89"], /* CJK Ideograph */ + ["\u6B8A", "\u6B8A"], /* CJK Ideograph */ + ["\u6B8B", "\u6B8B"], /* CJK Ideograph */ + ["\u6B8C", "\u6B8C"], /* CJK Ideograph */ + ["\u6B8D", "\u6B8D"], /* CJK Ideograph */ + ["\u6B8E", "\u6B8E"], /* CJK Ideograph */ + ["\u6B8F", "\u6B8F"], /* CJK Ideograph */ + ["\u6B90", "\u6B90"], /* CJK Ideograph */ + ["\u6B91", "\u6B91"], /* CJK Ideograph */ + ["\u6B92", "\u6B92"], /* CJK Ideograph */ + ["\u6B93", "\u6B93"], /* CJK Ideograph */ + ["\u6B94", "\u6B94"], /* CJK Ideograph */ + ["\u6B95", "\u6B95"], /* CJK Ideograph */ + ["\u6B96", "\u6B96"], /* CJK Ideograph */ + ["\u6B97", "\u6B97"], /* CJK Ideograph */ + ["\u6B98", "\u6B98"], /* CJK Ideograph */ + ["\u6B99", "\u6B99"], /* CJK Ideograph */ + ["\u6B9A", "\u6B9A"], /* CJK Ideograph */ + ["\u6B9B", "\u6B9B"], /* CJK Ideograph */ + ["\u6B9C", "\u6B9C"], /* CJK Ideograph */ + ["\u6B9D", "\u6B9D"], /* CJK Ideograph */ + ["\u6B9E", "\u6B9E"], /* CJK Ideograph */ + ["\u6B9F", "\u6B9F"], /* CJK Ideograph */ + ["\u6BA0", "\u6BA0"], /* CJK Ideograph */ + ["\u6BA1", "\u6BA1"], /* CJK Ideograph */ + ["\u6BA2", "\u6BA2"], /* CJK Ideograph */ + ["\u6BA3", "\u6BA3"], /* CJK Ideograph */ + ["\u6BA4", "\u6BA4"], /* CJK Ideograph */ + ["\u6BA5", "\u6BA5"], /* CJK Ideograph */ + ["\u6BA6", "\u6BA6"], /* CJK Ideograph */ + ["\u6BA7", "\u6BA7"], /* CJK Ideograph */ + ["\u6BA8", "\u6BA8"], /* CJK Ideograph */ + ["\u6BA9", "\u6BA9"], /* CJK Ideograph */ + ["\u6BAA", "\u6BAA"], /* CJK Ideograph */ + ["\u6BAB", "\u6BAB"], /* CJK Ideograph */ + ["\u6BAC", "\u6BAC"], /* CJK Ideograph */ + ["\u6BAD", "\u6BAD"], /* CJK Ideograph */ + ["\u6BAE", "\u6BAE"], /* CJK Ideograph */ + ["\u6BAF", "\u6BAF"], /* CJK Ideograph */ + ["\u6BB0", "\u6BB0"], /* CJK Ideograph */ + ["\u6BB1", "\u6BB1"], /* CJK Ideograph */ + ["\u6BB2", "\u6BB2"], /* CJK Ideograph */ + ["\u6BB3", "\u6BB3"], /* CJK Ideograph */ + ["\u6BB4", "\u6BB4"], /* CJK Ideograph */ + ["\u6BB5", "\u6BB5"], /* CJK Ideograph */ + ["\u6BB6", "\u6BB6"], /* CJK Ideograph */ + ["\u6BB7", "\u6BB7"], /* CJK Ideograph */ + ["\u6BB8", "\u6BB8"], /* CJK Ideograph */ + ["\u6BB9", "\u6BB9"], /* CJK Ideograph */ + ["\u6BBA", "\u6BBA"], /* CJK Ideograph */ + ["\u6BBB", "\u6BBB"], /* CJK Ideograph */ + ["\u6BBC", "\u6BBC"], /* CJK Ideograph */ + ["\u6BBD", "\u6BBD"], /* CJK Ideograph */ + ["\u6BBE", "\u6BBE"], /* CJK Ideograph */ + ["\u6BBF", "\u6BBF"], /* CJK Ideograph */ + ["\u6BC0", "\u6BC0"], /* CJK Ideograph */ + ["\u6BC1", "\u6BC1"], /* CJK Ideograph */ + ["\u6BC2", "\u6BC2"], /* CJK Ideograph */ + ["\u6BC3", "\u6BC3"], /* CJK Ideograph */ + ["\u6BC4", "\u6BC4"], /* CJK Ideograph */ + ["\u6BC5", "\u6BC5"], /* CJK Ideograph */ + ["\u6BC6", "\u6BC6"], /* CJK Ideograph */ + ["\u6BC7", "\u6BC7"], /* CJK Ideograph */ + ["\u6BC8", "\u6BC8"], /* CJK Ideograph */ + ["\u6BC9", "\u6BC9"], /* CJK Ideograph */ + ["\u6BCA", "\u6BCA"], /* CJK Ideograph */ + ["\u6BCB", "\u6BCB"], /* CJK Ideograph */ + ["\u6BCC", "\u6BCC"], /* CJK Ideograph */ + ["\u6BCD", "\u6BCD"], /* CJK Ideograph */ + ["\u6BCE", "\u6BCE"], /* CJK Ideograph */ + ["\u6BCF", "\u6BCF"], /* CJK Ideograph */ + ["\u6BD0", "\u6BD0"], /* CJK Ideograph */ + ["\u6BD1", "\u6BD1"], /* CJK Ideograph */ + ["\u6BD2", "\u6BD2"], /* CJK Ideograph */ + ["\u6BD3", "\u6BD3"], /* CJK Ideograph */ + ["\u6BD4", "\u6BD4"], /* CJK Ideograph */ + ["\u6BD5", "\u6BD5"], /* CJK Ideograph */ + ["\u6BD6", "\u6BD6"], /* CJK Ideograph */ + ["\u6BD7", "\u6BD7"], /* CJK Ideograph */ + ["\u6BD8", "\u6BD8"], /* CJK Ideograph */ + ["\u6BD9", "\u6BD9"], /* CJK Ideograph */ + ["\u6BDA", "\u6BDA"], /* CJK Ideograph */ + ["\u6BDB", "\u6BDB"], /* CJK Ideograph */ + ["\u6BDC", "\u6BDC"], /* CJK Ideograph */ + ["\u6BDD", "\u6BDD"], /* CJK Ideograph */ + ["\u6BDE", "\u6BDE"], /* CJK Ideograph */ + ["\u6BDF", "\u6BDF"], /* CJK Ideograph */ + ["\u6BE0", "\u6BE0"], /* CJK Ideograph */ + ["\u6BE1", "\u6BE1"], /* CJK Ideograph */ + ["\u6BE2", "\u6BE2"], /* CJK Ideograph */ + ["\u6BE3", "\u6BE3"], /* CJK Ideograph */ + ["\u6BE4", "\u6BE4"], /* CJK Ideograph */ + ["\u6BE5", "\u6BE5"], /* CJK Ideograph */ + ["\u6BE6", "\u6BE6"], /* CJK Ideograph */ + ["\u6BE7", "\u6BE7"], /* CJK Ideograph */ + ["\u6BE8", "\u6BE8"], /* CJK Ideograph */ + ["\u6BE9", "\u6BE9"], /* CJK Ideograph */ + ["\u6BEA", "\u6BEA"], /* CJK Ideograph */ + ["\u6BEB", "\u6BEB"], /* CJK Ideograph */ + ["\u6BEC", "\u6BEC"], /* CJK Ideograph */ + ["\u6BED", "\u6BED"], /* CJK Ideograph */ + ["\u6BEE", "\u6BEE"], /* CJK Ideograph */ + ["\u6BEF", "\u6BEF"], /* CJK Ideograph */ + ["\u6BF0", "\u6BF0"], /* CJK Ideograph */ + ["\u6BF1", "\u6BF1"], /* CJK Ideograph */ + ["\u6BF2", "\u6BF2"], /* CJK Ideograph */ + ["\u6BF3", "\u6BF3"], /* CJK Ideograph */ + ["\u6BF4", "\u6BF4"], /* CJK Ideograph */ + ["\u6BF5", "\u6BF5"], /* CJK Ideograph */ + ["\u6BF6", "\u6BF6"], /* CJK Ideograph */ + ["\u6BF7", "\u6BF7"], /* CJK Ideograph */ + ["\u6BF8", "\u6BF8"], /* CJK Ideograph */ + ["\u6BF9", "\u6BF9"], /* CJK Ideograph */ + ["\u6BFA", "\u6BFA"], /* CJK Ideograph */ + ["\u6BFB", "\u6BFB"], /* CJK Ideograph */ + ["\u6BFC", "\u6BFC"], /* CJK Ideograph */ + ["\u6BFD", "\u6BFD"], /* CJK Ideograph */ + ["\u6BFE", "\u6BFE"], /* CJK Ideograph */ + ["\u6BFF", "\u6BFF"], /* CJK Ideograph */ + ["\u6C00", "\u6C00"], /* CJK Ideograph */ + ["\u6C01", "\u6C01"], /* CJK Ideograph */ + ["\u6C02", "\u6C02"], /* CJK Ideograph */ + ["\u6C03", "\u6C03"], /* CJK Ideograph */ + ["\u6C04", "\u6C04"], /* CJK Ideograph */ + ["\u6C05", "\u6C05"], /* CJK Ideograph */ + ["\u6C06", "\u6C06"], /* CJK Ideograph */ + ["\u6C07", "\u6C07"], /* CJK Ideograph */ + ["\u6C08", "\u6C08"], /* CJK Ideograph */ + ["\u6C09", "\u6C09"], /* CJK Ideograph */ + ["\u6C0A", "\u6C0A"], /* CJK Ideograph */ + ["\u6C0B", "\u6C0B"], /* CJK Ideograph */ + ["\u6C0C", "\u6C0C"], /* CJK Ideograph */ + ["\u6C0D", "\u6C0D"], /* CJK Ideograph */ + ["\u6C0E", "\u6C0E"], /* CJK Ideograph */ + ["\u6C0F", "\u6C0F"], /* CJK Ideograph */ + ["\u6C10", "\u6C10"], /* CJK Ideograph */ + ["\u6C11", "\u6C11"], /* CJK Ideograph */ + ["\u6C12", "\u6C12"], /* CJK Ideograph */ + ["\u6C13", "\u6C13"], /* CJK Ideograph */ + ["\u6C14", "\u6C14"], /* CJK Ideograph */ + ["\u6C15", "\u6C15"], /* CJK Ideograph */ + ["\u6C16", "\u6C16"], /* CJK Ideograph */ + ["\u6C17", "\u6C17"], /* CJK Ideograph */ + ["\u6C18", "\u6C18"], /* CJK Ideograph */ + ["\u6C19", "\u6C19"], /* CJK Ideograph */ + ["\u6C1A", "\u6C1A"], /* CJK Ideograph */ + ["\u6C1B", "\u6C1B"], /* CJK Ideograph */ + ["\u6C1C", "\u6C1C"], /* CJK Ideograph */ + ["\u6C1D", "\u6C1D"], /* CJK Ideograph */ + ["\u6C1E", "\u6C1E"], /* CJK Ideograph */ + ["\u6C1F", "\u6C1F"], /* CJK Ideograph */ + ["\u6C20", "\u6C20"], /* CJK Ideograph */ + ["\u6C21", "\u6C21"], /* CJK Ideograph */ + ["\u6C22", "\u6C22"], /* CJK Ideograph */ + ["\u6C23", "\u6C23"], /* CJK Ideograph */ + ["\u6C24", "\u6C24"], /* CJK Ideograph */ + ["\u6C25", "\u6C25"], /* CJK Ideograph */ + ["\u6C26", "\u6C26"], /* CJK Ideograph */ + ["\u6C27", "\u6C27"], /* CJK Ideograph */ + ["\u6C28", "\u6C28"], /* CJK Ideograph */ + ["\u6C29", "\u6C29"], /* CJK Ideograph */ + ["\u6C2A", "\u6C2A"], /* CJK Ideograph */ + ["\u6C2B", "\u6C2B"], /* CJK Ideograph */ + ["\u6C2C", "\u6C2C"], /* CJK Ideograph */ + ["\u6C2D", "\u6C2D"], /* CJK Ideograph */ + ["\u6C2E", "\u6C2E"], /* CJK Ideograph */ + ["\u6C2F", "\u6C2F"], /* CJK Ideograph */ + ["\u6C30", "\u6C30"], /* CJK Ideograph */ + ["\u6C31", "\u6C31"], /* CJK Ideograph */ + ["\u6C32", "\u6C32"], /* CJK Ideograph */ + ["\u6C33", "\u6C33"], /* CJK Ideograph */ + ["\u6C34", "\u6C34"], /* CJK Ideograph */ + ["\u6C35", "\u6C35"], /* CJK Ideograph */ + ["\u6C36", "\u6C36"], /* CJK Ideograph */ + ["\u6C37", "\u6C37"], /* CJK Ideograph */ + ["\u6C38", "\u6C38"], /* CJK Ideograph */ + ["\u6C39", "\u6C39"], /* CJK Ideograph */ + ["\u6C3A", "\u6C3A"], /* CJK Ideograph */ + ["\u6C3B", "\u6C3B"], /* CJK Ideograph */ + ["\u6C3C", "\u6C3C"], /* CJK Ideograph */ + ["\u6C3D", "\u6C3D"], /* CJK Ideograph */ + ["\u6C3E", "\u6C3E"], /* CJK Ideograph */ + ["\u6C3F", "\u6C3F"], /* CJK Ideograph */ + ["\u6C40", "\u6C40"], /* CJK Ideograph */ + ["\u6C41", "\u6C41"], /* CJK Ideograph */ + ["\u6C42", "\u6C42"], /* CJK Ideograph */ + ["\u6C43", "\u6C43"], /* CJK Ideograph */ + ["\u6C44", "\u6C44"], /* CJK Ideograph */ + ["\u6C45", "\u6C45"], /* CJK Ideograph */ + ["\u6C46", "\u6C46"], /* CJK Ideograph */ + ["\u6C47", "\u6C47"], /* CJK Ideograph */ + ["\u6C48", "\u6C48"], /* CJK Ideograph */ + ["\u6C49", "\u6C49"], /* CJK Ideograph */ + ["\u6C4A", "\u6C4A"], /* CJK Ideograph */ + ["\u6C4B", "\u6C4B"], /* CJK Ideograph */ + ["\u6C4C", "\u6C4C"], /* CJK Ideograph */ + ["\u6C4D", "\u6C4D"], /* CJK Ideograph */ + ["\u6C4E", "\u6C4E"], /* CJK Ideograph */ + ["\u6C4F", "\u6C4F"], /* CJK Ideograph */ + ["\u6C50", "\u6C50"], /* CJK Ideograph */ + ["\u6C51", "\u6C51"], /* CJK Ideograph */ + ["\u6C52", "\u6C52"], /* CJK Ideograph */ + ["\u6C53", "\u6C53"], /* CJK Ideograph */ + ["\u6C54", "\u6C54"], /* CJK Ideograph */ + ["\u6C55", "\u6C55"], /* CJK Ideograph */ + ["\u6C56", "\u6C56"], /* CJK Ideograph */ + ["\u6C57", "\u6C57"], /* CJK Ideograph */ + ["\u6C58", "\u6C58"], /* CJK Ideograph */ + ["\u6C59", "\u6C59"], /* CJK Ideograph */ + ["\u6C5A", "\u6C5A"], /* CJK Ideograph */ + ["\u6C5B", "\u6C5B"], /* CJK Ideograph */ + ["\u6C5C", "\u6C5C"], /* CJK Ideograph */ + ["\u6C5D", "\u6C5D"], /* CJK Ideograph */ + ["\u6C5E", "\u6C5E"], /* CJK Ideograph */ + ["\u6C5F", "\u6C5F"], /* CJK Ideograph */ + ["\u6C60", "\u6C60"], /* CJK Ideograph */ + ["\u6C61", "\u6C61"], /* CJK Ideograph */ + ["\u6C62", "\u6C62"], /* CJK Ideograph */ + ["\u6C63", "\u6C63"], /* CJK Ideograph */ + ["\u6C64", "\u6C64"], /* CJK Ideograph */ + ["\u6C65", "\u6C65"], /* CJK Ideograph */ + ["\u6C66", "\u6C66"], /* CJK Ideograph */ + ["\u6C67", "\u6C67"], /* CJK Ideograph */ + ["\u6C68", "\u6C68"], /* CJK Ideograph */ + ["\u6C69", "\u6C69"], /* CJK Ideograph */ + ["\u6C6A", "\u6C6A"], /* CJK Ideograph */ + ["\u6C6B", "\u6C6B"], /* CJK Ideograph */ + ["\u6C6C", "\u6C6C"], /* CJK Ideograph */ + ["\u6C6D", "\u6C6D"], /* CJK Ideograph */ + ["\u6C6E", "\u6C6E"], /* CJK Ideograph */ + ["\u6C6F", "\u6C6F"], /* CJK Ideograph */ + ["\u6C70", "\u6C70"], /* CJK Ideograph */ + ["\u6C71", "\u6C71"], /* CJK Ideograph */ + ["\u6C72", "\u6C72"], /* CJK Ideograph */ + ["\u6C73", "\u6C73"], /* CJK Ideograph */ + ["\u6C74", "\u6C74"], /* CJK Ideograph */ + ["\u6C75", "\u6C75"], /* CJK Ideograph */ + ["\u6C76", "\u6C76"], /* CJK Ideograph */ + ["\u6C77", "\u6C77"], /* CJK Ideograph */ + ["\u6C78", "\u6C78"], /* CJK Ideograph */ + ["\u6C79", "\u6C79"], /* CJK Ideograph */ + ["\u6C7A", "\u6C7A"], /* CJK Ideograph */ + ["\u6C7B", "\u6C7B"], /* CJK Ideograph */ + ["\u6C7C", "\u6C7C"], /* CJK Ideograph */ + ["\u6C7D", "\u6C7D"], /* CJK Ideograph */ + ["\u6C7E", "\u6C7E"], /* CJK Ideograph */ + ["\u6C7F", "\u6C7F"], /* CJK Ideograph */ + ["\u6C80", "\u6C80"], /* CJK Ideograph */ + ["\u6C81", "\u6C81"], /* CJK Ideograph */ + ["\u6C82", "\u6C82"], /* CJK Ideograph */ + ["\u6C83", "\u6C83"], /* CJK Ideograph */ + ["\u6C84", "\u6C84"], /* CJK Ideograph */ + ["\u6C85", "\u6C85"], /* CJK Ideograph */ + ["\u6C86", "\u6C86"], /* CJK Ideograph */ + ["\u6C87", "\u6C87"], /* CJK Ideograph */ + ["\u6C88", "\u6C88"], /* CJK Ideograph */ + ["\u6C89", "\u6C89"], /* CJK Ideograph */ + ["\u6C8A", "\u6C8A"], /* CJK Ideograph */ + ["\u6C8B", "\u6C8B"], /* CJK Ideograph */ + ["\u6C8C", "\u6C8C"], /* CJK Ideograph */ + ["\u6C8D", "\u6C8D"], /* CJK Ideograph */ + ["\u6C8E", "\u6C8E"], /* CJK Ideograph */ + ["\u6C8F", "\u6C8F"], /* CJK Ideograph */ + ["\u6C90", "\u6C90"], /* CJK Ideograph */ + ["\u6C91", "\u6C91"], /* CJK Ideograph */ + ["\u6C92", "\u6C92"], /* CJK Ideograph */ + ["\u6C93", "\u6C93"], /* CJK Ideograph */ + ["\u6C94", "\u6C94"], /* CJK Ideograph */ + ["\u6C95", "\u6C95"], /* CJK Ideograph */ + ["\u6C96", "\u6C96"], /* CJK Ideograph */ + ["\u6C97", "\u6C97"], /* CJK Ideograph */ + ["\u6C98", "\u6C98"], /* CJK Ideograph */ + ["\u6C99", "\u6C99"], /* CJK Ideograph */ + ["\u6C9A", "\u6C9A"], /* CJK Ideograph */ + ["\u6C9B", "\u6C9B"], /* CJK Ideograph */ + ["\u6C9C", "\u6C9C"], /* CJK Ideograph */ + ["\u6C9D", "\u6C9D"], /* CJK Ideograph */ + ["\u6C9E", "\u6C9E"], /* CJK Ideograph */ + ["\u6C9F", "\u6C9F"], /* CJK Ideograph */ + ["\u6CA0", "\u6CA0"], /* CJK Ideograph */ + ["\u6CA1", "\u6CA1"], /* CJK Ideograph */ + ["\u6CA2", "\u6CA2"], /* CJK Ideograph */ + ["\u6CA3", "\u6CA3"], /* CJK Ideograph */ + ["\u6CA4", "\u6CA4"], /* CJK Ideograph */ + ["\u6CA5", "\u6CA5"], /* CJK Ideograph */ + ["\u6CA6", "\u6CA6"], /* CJK Ideograph */ + ["\u6CA7", "\u6CA7"], /* CJK Ideograph */ + ["\u6CA8", "\u6CA8"], /* CJK Ideograph */ + ["\u6CA9", "\u6CA9"], /* CJK Ideograph */ + ["\u6CAA", "\u6CAA"], /* CJK Ideograph */ + ["\u6CAB", "\u6CAB"], /* CJK Ideograph */ + ["\u6CAC", "\u6CAC"], /* CJK Ideograph */ + ["\u6CAD", "\u6CAD"], /* CJK Ideograph */ + ["\u6CAE", "\u6CAE"], /* CJK Ideograph */ + ["\u6CAF", "\u6CAF"], /* CJK Ideograph */ + ["\u6CB0", "\u6CB0"], /* CJK Ideograph */ + ["\u6CB1", "\u6CB1"], /* CJK Ideograph */ + ["\u6CB2", "\u6CB2"], /* CJK Ideograph */ + ["\u6CB3", "\u6CB3"], /* CJK Ideograph */ + ["\u6CB4", "\u6CB4"], /* CJK Ideograph */ + ["\u6CB5", "\u6CB5"], /* CJK Ideograph */ + ["\u6CB6", "\u6CB6"], /* CJK Ideograph */ + ["\u6CB7", "\u6CB7"], /* CJK Ideograph */ + ["\u6CB8", "\u6CB8"], /* CJK Ideograph */ + ["\u6CB9", "\u6CB9"], /* CJK Ideograph */ + ["\u6CBA", "\u6CBA"], /* CJK Ideograph */ + ["\u6CBB", "\u6CBB"], /* CJK Ideograph */ + ["\u6CBC", "\u6CBC"], /* CJK Ideograph */ + ["\u6CBD", "\u6CBD"], /* CJK Ideograph */ + ["\u6CBE", "\u6CBE"], /* CJK Ideograph */ + ["\u6CBF", "\u6CBF"], /* CJK Ideograph */ + ["\u6CC0", "\u6CC0"], /* CJK Ideograph */ + ["\u6CC1", "\u6CC1"], /* CJK Ideograph */ + ["\u6CC2", "\u6CC2"], /* CJK Ideograph */ + ["\u6CC3", "\u6CC3"], /* CJK Ideograph */ + ["\u6CC4", "\u6CC4"], /* CJK Ideograph */ + ["\u6CC5", "\u6CC5"], /* CJK Ideograph */ + ["\u6CC6", "\u6CC6"], /* CJK Ideograph */ + ["\u6CC7", "\u6CC7"], /* CJK Ideograph */ + ["\u6CC8", "\u6CC8"], /* CJK Ideograph */ + ["\u6CC9", "\u6CC9"], /* CJK Ideograph */ + ["\u6CCA", "\u6CCA"], /* CJK Ideograph */ + ["\u6CCB", "\u6CCB"], /* CJK Ideograph */ + ["\u6CCC", "\u6CCC"], /* CJK Ideograph */ + ["\u6CCD", "\u6CCD"], /* CJK Ideograph */ + ["\u6CCE", "\u6CCE"], /* CJK Ideograph */ + ["\u6CCF", "\u6CCF"], /* CJK Ideograph */ + ["\u6CD0", "\u6CD0"], /* CJK Ideograph */ + ["\u6CD1", "\u6CD1"], /* CJK Ideograph */ + ["\u6CD2", "\u6CD2"], /* CJK Ideograph */ + ["\u6CD3", "\u6CD3"], /* CJK Ideograph */ + ["\u6CD4", "\u6CD4"], /* CJK Ideograph */ + ["\u6CD5", "\u6CD5"], /* CJK Ideograph */ + ["\u6CD6", "\u6CD6"], /* CJK Ideograph */ + ["\u6CD7", "\u6CD7"], /* CJK Ideograph */ + ["\u6CD8", "\u6CD8"], /* CJK Ideograph */ + ["\u6CD9", "\u6CD9"], /* CJK Ideograph */ + ["\u6CDA", "\u6CDA"], /* CJK Ideograph */ + ["\u6CDB", "\u6CDB"], /* CJK Ideograph */ + ["\u6CDC", "\u6CDC"], /* CJK Ideograph */ + ["\u6CDD", "\u6CDD"], /* CJK Ideograph */ + ["\u6CDE", "\u6CDE"], /* CJK Ideograph */ + ["\u6CDF", "\u6CDF"], /* CJK Ideograph */ + ["\u6CE0", "\u6CE0"], /* CJK Ideograph */ + ["\u6CE1", "\u6CE1"], /* CJK Ideograph */ + ["\u6CE2", "\u6CE2"], /* CJK Ideograph */ + ["\u6CE3", "\u6CE3"], /* CJK Ideograph */ + ["\u6CE4", "\u6CE4"], /* CJK Ideograph */ + ["\u6CE5", "\u6CE5"], /* CJK Ideograph */ + ["\u6CE6", "\u6CE6"], /* CJK Ideograph */ + ["\u6CE7", "\u6CE7"], /* CJK Ideograph */ + ["\u6CE8", "\u6CE8"], /* CJK Ideograph */ + ["\u6CE9", "\u6CE9"], /* CJK Ideograph */ + ["\u6CEA", "\u6CEA"], /* CJK Ideograph */ + ["\u6CEB", "\u6CEB"], /* CJK Ideograph */ + ["\u6CEC", "\u6CEC"], /* CJK Ideograph */ + ["\u6CED", "\u6CED"], /* CJK Ideograph */ + ["\u6CEE", "\u6CEE"], /* CJK Ideograph */ + ["\u6CEF", "\u6CEF"], /* CJK Ideograph */ + ["\u6CF0", "\u6CF0"], /* CJK Ideograph */ + ["\u6CF1", "\u6CF1"], /* CJK Ideograph */ + ["\u6CF2", "\u6CF2"], /* CJK Ideograph */ + ["\u6CF3", "\u6CF3"], /* CJK Ideograph */ + ["\u6CF4", "\u6CF4"], /* CJK Ideograph */ + ["\u6CF5", "\u6CF5"], /* CJK Ideograph */ + ["\u6CF6", "\u6CF6"], /* CJK Ideograph */ + ["\u6CF7", "\u6CF7"], /* CJK Ideograph */ + ["\u6CF8", "\u6CF8"], /* CJK Ideograph */ + ["\u6CF9", "\u6CF9"], /* CJK Ideograph */ + ["\u6CFA", "\u6CFA"], /* CJK Ideograph */ + ["\u6CFB", "\u6CFB"], /* CJK Ideograph */ + ["\u6CFC", "\u6CFC"], /* CJK Ideograph */ + ["\u6CFD", "\u6CFD"], /* CJK Ideograph */ + ["\u6CFE", "\u6CFE"], /* CJK Ideograph */ + ["\u6CFF", "\u6CFF"], /* CJK Ideograph */ + ["\u6D00", "\u6D00"], /* CJK Ideograph */ + ["\u6D01", "\u6D01"], /* CJK Ideograph */ + ["\u6D02", "\u6D02"], /* CJK Ideograph */ + ["\u6D03", "\u6D03"], /* CJK Ideograph */ + ["\u6D04", "\u6D04"], /* CJK Ideograph */ + ["\u6D05", "\u6D05"], /* CJK Ideograph */ + ["\u6D06", "\u6D06"], /* CJK Ideograph */ + ["\u6D07", "\u6D07"], /* CJK Ideograph */ + ["\u6D08", "\u6D08"], /* CJK Ideograph */ + ["\u6D09", "\u6D09"], /* CJK Ideograph */ + ["\u6D0A", "\u6D0A"], /* CJK Ideograph */ + ["\u6D0B", "\u6D0B"], /* CJK Ideograph */ + ["\u6D0C", "\u6D0C"], /* CJK Ideograph */ + ["\u6D0D", "\u6D0D"], /* CJK Ideograph */ + ["\u6D0E", "\u6D0E"], /* CJK Ideograph */ + ["\u6D0F", "\u6D0F"], /* CJK Ideograph */ + ["\u6D10", "\u6D10"], /* CJK Ideograph */ + ["\u6D11", "\u6D11"], /* CJK Ideograph */ + ["\u6D12", "\u6D12"], /* CJK Ideograph */ + ["\u6D13", "\u6D13"], /* CJK Ideograph */ + ["\u6D14", "\u6D14"], /* CJK Ideograph */ + ["\u6D15", "\u6D15"], /* CJK Ideograph */ + ["\u6D16", "\u6D16"], /* CJK Ideograph */ + ["\u6D17", "\u6D17"], /* CJK Ideograph */ + ["\u6D18", "\u6D18"], /* CJK Ideograph */ + ["\u6D19", "\u6D19"], /* CJK Ideograph */ + ["\u6D1A", "\u6D1A"], /* CJK Ideograph */ + ["\u6D1B", "\u6D1B"], /* CJK Ideograph */ + ["\u6D1C", "\u6D1C"], /* CJK Ideograph */ + ["\u6D1D", "\u6D1D"], /* CJK Ideograph */ + ["\u6D1E", "\u6D1E"], /* CJK Ideograph */ + ["\u6D1F", "\u6D1F"], /* CJK Ideograph */ + ["\u6D20", "\u6D20"], /* CJK Ideograph */ + ["\u6D21", "\u6D21"], /* CJK Ideograph */ + ["\u6D22", "\u6D22"], /* CJK Ideograph */ + ["\u6D23", "\u6D23"], /* CJK Ideograph */ + ["\u6D24", "\u6D24"], /* CJK Ideograph */ + ["\u6D25", "\u6D25"], /* CJK Ideograph */ + ["\u6D26", "\u6D26"], /* CJK Ideograph */ + ["\u6D27", "\u6D27"], /* CJK Ideograph */ + ["\u6D28", "\u6D28"], /* CJK Ideograph */ + ["\u6D29", "\u6D29"], /* CJK Ideograph */ + ["\u6D2A", "\u6D2A"], /* CJK Ideograph */ + ["\u6D2B", "\u6D2B"], /* CJK Ideograph */ + ["\u6D2C", "\u6D2C"], /* CJK Ideograph */ + ["\u6D2D", "\u6D2D"], /* CJK Ideograph */ + ["\u6D2E", "\u6D2E"], /* CJK Ideograph */ + ["\u6D2F", "\u6D2F"], /* CJK Ideograph */ + ["\u6D30", "\u6D30"], /* CJK Ideograph */ + ["\u6D31", "\u6D31"], /* CJK Ideograph */ + ["\u6D32", "\u6D32"], /* CJK Ideograph */ + ["\u6D33", "\u6D33"], /* CJK Ideograph */ + ["\u6D34", "\u6D34"], /* CJK Ideograph */ + ["\u6D35", "\u6D35"], /* CJK Ideograph */ + ["\u6D36", "\u6D36"], /* CJK Ideograph */ + ["\u6D37", "\u6D37"], /* CJK Ideograph */ + ["\u6D38", "\u6D38"], /* CJK Ideograph */ + ["\u6D39", "\u6D39"], /* CJK Ideograph */ + ["\u6D3A", "\u6D3A"], /* CJK Ideograph */ + ["\u6D3B", "\u6D3B"], /* CJK Ideograph */ + ["\u6D3C", "\u6D3C"], /* CJK Ideograph */ + ["\u6D3D", "\u6D3D"], /* CJK Ideograph */ + ["\u6D3E", "\u6D3E"], /* CJK Ideograph */ + ["\u6D3F", "\u6D3F"], /* CJK Ideograph */ + ["\u6D40", "\u6D40"], /* CJK Ideograph */ + ["\u6D41", "\u6D41"], /* CJK Ideograph */ + ["\u6D42", "\u6D42"], /* CJK Ideograph */ + ["\u6D43", "\u6D43"], /* CJK Ideograph */ + ["\u6D44", "\u6D44"], /* CJK Ideograph */ + ["\u6D45", "\u6D45"], /* CJK Ideograph */ + ["\u6D46", "\u6D46"], /* CJK Ideograph */ + ["\u6D47", "\u6D47"], /* CJK Ideograph */ + ["\u6D48", "\u6D48"], /* CJK Ideograph */ + ["\u6D49", "\u6D49"], /* CJK Ideograph */ + ["\u6D4A", "\u6D4A"], /* CJK Ideograph */ + ["\u6D4B", "\u6D4B"], /* CJK Ideograph */ + ["\u6D4C", "\u6D4C"], /* CJK Ideograph */ + ["\u6D4D", "\u6D4D"], /* CJK Ideograph */ + ["\u6D4E", "\u6D4E"], /* CJK Ideograph */ + ["\u6D4F", "\u6D4F"], /* CJK Ideograph */ + ["\u6D50", "\u6D50"], /* CJK Ideograph */ + ["\u6D51", "\u6D51"], /* CJK Ideograph */ + ["\u6D52", "\u6D52"], /* CJK Ideograph */ + ["\u6D53", "\u6D53"], /* CJK Ideograph */ + ["\u6D54", "\u6D54"], /* CJK Ideograph */ + ["\u6D55", "\u6D55"], /* CJK Ideograph */ + ["\u6D56", "\u6D56"], /* CJK Ideograph */ + ["\u6D57", "\u6D57"], /* CJK Ideograph */ + ["\u6D58", "\u6D58"], /* CJK Ideograph */ + ["\u6D59", "\u6D59"], /* CJK Ideograph */ + ["\u6D5A", "\u6D5A"], /* CJK Ideograph */ + ["\u6D5B", "\u6D5B"], /* CJK Ideograph */ + ["\u6D5C", "\u6D5C"], /* CJK Ideograph */ + ["\u6D5D", "\u6D5D"], /* CJK Ideograph */ + ["\u6D5E", "\u6D5E"], /* CJK Ideograph */ + ["\u6D5F", "\u6D5F"], /* CJK Ideograph */ + ["\u6D60", "\u6D60"], /* CJK Ideograph */ + ["\u6D61", "\u6D61"], /* CJK Ideograph */ + ["\u6D62", "\u6D62"], /* CJK Ideograph */ + ["\u6D63", "\u6D63"], /* CJK Ideograph */ + ["\u6D64", "\u6D64"], /* CJK Ideograph */ + ["\u6D65", "\u6D65"], /* CJK Ideograph */ + ["\u6D66", "\u6D66"], /* CJK Ideograph */ + ["\u6D67", "\u6D67"], /* CJK Ideograph */ + ["\u6D68", "\u6D68"], /* CJK Ideograph */ + ["\u6D69", "\u6D69"], /* CJK Ideograph */ + ["\u6D6A", "\u6D6A"], /* CJK Ideograph */ + ["\u6D6B", "\u6D6B"], /* CJK Ideograph */ + ["\u6D6C", "\u6D6C"], /* CJK Ideograph */ + ["\u6D6D", "\u6D6D"], /* CJK Ideograph */ + ["\u6D6E", "\u6D6E"], /* CJK Ideograph */ + ["\u6D6F", "\u6D6F"], /* CJK Ideograph */ + ["\u6D70", "\u6D70"], /* CJK Ideograph */ + ["\u6D71", "\u6D71"], /* CJK Ideograph */ + ["\u6D72", "\u6D72"], /* CJK Ideograph */ + ["\u6D73", "\u6D73"], /* CJK Ideograph */ + ["\u6D74", "\u6D74"], /* CJK Ideograph */ + ["\u6D75", "\u6D75"], /* CJK Ideograph */ + ["\u6D76", "\u6D76"], /* CJK Ideograph */ + ["\u6D77", "\u6D77"], /* CJK Ideograph */ + ["\u6D78", "\u6D78"], /* CJK Ideograph */ + ["\u6D79", "\u6D79"], /* CJK Ideograph */ + ["\u6D7A", "\u6D7A"], /* CJK Ideograph */ + ["\u6D7B", "\u6D7B"], /* CJK Ideograph */ + ["\u6D7C", "\u6D7C"], /* CJK Ideograph */ + ["\u6D7D", "\u6D7D"], /* CJK Ideograph */ + ["\u6D7E", "\u6D7E"], /* CJK Ideograph */ + ["\u6D7F", "\u6D7F"], /* CJK Ideograph */ + ["\u6D80", "\u6D80"], /* CJK Ideograph */ + ["\u6D81", "\u6D81"], /* CJK Ideograph */ + ["\u6D82", "\u6D82"], /* CJK Ideograph */ + ["\u6D83", "\u6D83"], /* CJK Ideograph */ + ["\u6D84", "\u6D84"], /* CJK Ideograph */ + ["\u6D85", "\u6D85"], /* CJK Ideograph */ + ["\u6D86", "\u6D86"], /* CJK Ideograph */ + ["\u6D87", "\u6D87"], /* CJK Ideograph */ + ["\u6D88", "\u6D88"], /* CJK Ideograph */ + ["\u6D89", "\u6D89"], /* CJK Ideograph */ + ["\u6D8A", "\u6D8A"], /* CJK Ideograph */ + ["\u6D8B", "\u6D8B"], /* CJK Ideograph */ + ["\u6D8C", "\u6D8C"], /* CJK Ideograph */ + ["\u6D8D", "\u6D8D"], /* CJK Ideograph */ + ["\u6D8E", "\u6D8E"], /* CJK Ideograph */ + ["\u6D8F", "\u6D8F"], /* CJK Ideograph */ + ["\u6D90", "\u6D90"], /* CJK Ideograph */ + ["\u6D91", "\u6D91"], /* CJK Ideograph */ + ["\u6D92", "\u6D92"], /* CJK Ideograph */ + ["\u6D93", "\u6D93"], /* CJK Ideograph */ + ["\u6D94", "\u6D94"], /* CJK Ideograph */ + ["\u6D95", "\u6D95"], /* CJK Ideograph */ + ["\u6D96", "\u6D96"], /* CJK Ideograph */ + ["\u6D97", "\u6D97"], /* CJK Ideograph */ + ["\u6D98", "\u6D98"], /* CJK Ideograph */ + ["\u6D99", "\u6D99"], /* CJK Ideograph */ + ["\u6D9A", "\u6D9A"], /* CJK Ideograph */ + ["\u6D9B", "\u6D9B"], /* CJK Ideograph */ + ["\u6D9C", "\u6D9C"], /* CJK Ideograph */ + ["\u6D9D", "\u6D9D"], /* CJK Ideograph */ + ["\u6D9E", "\u6D9E"], /* CJK Ideograph */ + ["\u6D9F", "\u6D9F"], /* CJK Ideograph */ + ["\u6DA0", "\u6DA0"], /* CJK Ideograph */ + ["\u6DA1", "\u6DA1"], /* CJK Ideograph */ + ["\u6DA2", "\u6DA2"], /* CJK Ideograph */ + ["\u6DA3", "\u6DA3"], /* CJK Ideograph */ + ["\u6DA4", "\u6DA4"], /* CJK Ideograph */ + ["\u6DA5", "\u6DA5"], /* CJK Ideograph */ + ["\u6DA6", "\u6DA6"], /* CJK Ideograph */ + ["\u6DA7", "\u6DA7"], /* CJK Ideograph */ + ["\u6DA8", "\u6DA8"], /* CJK Ideograph */ + ["\u6DA9", "\u6DA9"], /* CJK Ideograph */ + ["\u6DAA", "\u6DAA"], /* CJK Ideograph */ + ["\u6DAB", "\u6DAB"], /* CJK Ideograph */ + ["\u6DAC", "\u6DAC"], /* CJK Ideograph */ + ["\u6DAD", "\u6DAD"], /* CJK Ideograph */ + ["\u6DAE", "\u6DAE"], /* CJK Ideograph */ + ["\u6DAF", "\u6DAF"], /* CJK Ideograph */ + ["\u6DB0", "\u6DB0"], /* CJK Ideograph */ + ["\u6DB1", "\u6DB1"], /* CJK Ideograph */ + ["\u6DB2", "\u6DB2"], /* CJK Ideograph */ + ["\u6DB3", "\u6DB3"], /* CJK Ideograph */ + ["\u6DB4", "\u6DB4"], /* CJK Ideograph */ + ["\u6DB5", "\u6DB5"], /* CJK Ideograph */ + ["\u6DB6", "\u6DB6"], /* CJK Ideograph */ + ["\u6DB7", "\u6DB7"], /* CJK Ideograph */ + ["\u6DB8", "\u6DB8"], /* CJK Ideograph */ + ["\u6DB9", "\u6DB9"], /* CJK Ideograph */ + ["\u6DBA", "\u6DBA"], /* CJK Ideograph */ + ["\u6DBB", "\u6DBB"], /* CJK Ideograph */ + ["\u6DBC", "\u6DBC"], /* CJK Ideograph */ + ["\u6DBD", "\u6DBD"], /* CJK Ideograph */ + ["\u6DBE", "\u6DBE"], /* CJK Ideograph */ + ["\u6DBF", "\u6DBF"], /* CJK Ideograph */ + ["\u6DC0", "\u6DC0"], /* CJK Ideograph */ + ["\u6DC1", "\u6DC1"], /* CJK Ideograph */ + ["\u6DC2", "\u6DC2"], /* CJK Ideograph */ + ["\u6DC3", "\u6DC3"], /* CJK Ideograph */ + ["\u6DC4", "\u6DC4"], /* CJK Ideograph */ + ["\u6DC5", "\u6DC5"], /* CJK Ideograph */ + ["\u6DC6", "\u6DC6"], /* CJK Ideograph */ + ["\u6DC7", "\u6DC7"], /* CJK Ideograph */ + ["\u6DC8", "\u6DC8"], /* CJK Ideograph */ + ["\u6DC9", "\u6DC9"], /* CJK Ideograph */ + ["\u6DCA", "\u6DCA"], /* CJK Ideograph */ + ["\u6DCB", "\u6DCB"], /* CJK Ideograph */ + ["\u6DCC", "\u6DCC"], /* CJK Ideograph */ + ["\u6DCD", "\u6DCD"], /* CJK Ideograph */ + ["\u6DCE", "\u6DCE"], /* CJK Ideograph */ + ["\u6DCF", "\u6DCF"], /* CJK Ideograph */ + ["\u6DD0", "\u6DD0"], /* CJK Ideograph */ + ["\u6DD1", "\u6DD1"], /* CJK Ideograph */ + ["\u6DD2", "\u6DD2"], /* CJK Ideograph */ + ["\u6DD3", "\u6DD3"], /* CJK Ideograph */ + ["\u6DD4", "\u6DD4"], /* CJK Ideograph */ + ["\u6DD5", "\u6DD5"], /* CJK Ideograph */ + ["\u6DD6", "\u6DD6"], /* CJK Ideograph */ + ["\u6DD7", "\u6DD7"], /* CJK Ideograph */ + ["\u6DD8", "\u6DD8"], /* CJK Ideograph */ + ["\u6DD9", "\u6DD9"], /* CJK Ideograph */ + ["\u6DDA", "\u6DDA"], /* CJK Ideograph */ + ["\u6DDB", "\u6DDB"], /* CJK Ideograph */ + ["\u6DDC", "\u6DDC"], /* CJK Ideograph */ + ["\u6DDD", "\u6DDD"], /* CJK Ideograph */ + ["\u6DDE", "\u6DDE"], /* CJK Ideograph */ + ["\u6DDF", "\u6DDF"], /* CJK Ideograph */ + ["\u6DE0", "\u6DE0"], /* CJK Ideograph */ + ["\u6DE1", "\u6DE1"], /* CJK Ideograph */ + ["\u6DE2", "\u6DE2"], /* CJK Ideograph */ + ["\u6DE3", "\u6DE3"], /* CJK Ideograph */ + ["\u6DE4", "\u6DE4"], /* CJK Ideograph */ + ["\u6DE5", "\u6DE5"], /* CJK Ideograph */ + ["\u6DE6", "\u6DE6"], /* CJK Ideograph */ + ["\u6DE7", "\u6DE7"], /* CJK Ideograph */ + ["\u6DE8", "\u6DE8"], /* CJK Ideograph */ + ["\u6DE9", "\u6DE9"], /* CJK Ideograph */ + ["\u6DEA", "\u6DEA"], /* CJK Ideograph */ + ["\u6DEB", "\u6DEB"], /* CJK Ideograph */ + ["\u6DEC", "\u6DEC"], /* CJK Ideograph */ + ["\u6DED", "\u6DED"], /* CJK Ideograph */ + ["\u6DEE", "\u6DEE"], /* CJK Ideograph */ + ["\u6DEF", "\u6DEF"], /* CJK Ideograph */ + ["\u6DF0", "\u6DF0"], /* CJK Ideograph */ + ["\u6DF1", "\u6DF1"], /* CJK Ideograph */ + ["\u6DF2", "\u6DF2"], /* CJK Ideograph */ + ["\u6DF3", "\u6DF3"], /* CJK Ideograph */ + ["\u6DF4", "\u6DF4"], /* CJK Ideograph */ + ["\u6DF5", "\u6DF5"], /* CJK Ideograph */ + ["\u6DF6", "\u6DF6"], /* CJK Ideograph */ + ["\u6DF7", "\u6DF7"], /* CJK Ideograph */ + ["\u6DF8", "\u6DF8"], /* CJK Ideograph */ + ["\u6DF9", "\u6DF9"], /* CJK Ideograph */ + ["\u6DFA", "\u6DFA"], /* CJK Ideograph */ + ["\u6DFB", "\u6DFB"], /* CJK Ideograph */ + ["\u6DFC", "\u6DFC"], /* CJK Ideograph */ + ["\u6DFD", "\u6DFD"], /* CJK Ideograph */ + ["\u6DFE", "\u6DFE"], /* CJK Ideograph */ + ["\u6DFF", "\u6DFF"], /* CJK Ideograph */ + ["\u6E00", "\u6E00"], /* CJK Ideograph */ + ["\u6E01", "\u6E01"], /* CJK Ideograph */ + ["\u6E02", "\u6E02"], /* CJK Ideograph */ + ["\u6E03", "\u6E03"], /* CJK Ideograph */ + ["\u6E04", "\u6E04"], /* CJK Ideograph */ + ["\u6E05", "\u6E05"], /* CJK Ideograph */ + ["\u6E06", "\u6E06"], /* CJK Ideograph */ + ["\u6E07", "\u6E07"], /* CJK Ideograph */ + ["\u6E08", "\u6E08"], /* CJK Ideograph */ + ["\u6E09", "\u6E09"], /* CJK Ideograph */ + ["\u6E0A", "\u6E0A"], /* CJK Ideograph */ + ["\u6E0B", "\u6E0B"], /* CJK Ideograph */ + ["\u6E0C", "\u6E0C"], /* CJK Ideograph */ + ["\u6E0D", "\u6E0D"], /* CJK Ideograph */ + ["\u6E0E", "\u6E0E"], /* CJK Ideograph */ + ["\u6E0F", "\u6E0F"], /* CJK Ideograph */ + ["\u6E10", "\u6E10"], /* CJK Ideograph */ + ["\u6E11", "\u6E11"], /* CJK Ideograph */ + ["\u6E12", "\u6E12"], /* CJK Ideograph */ + ["\u6E13", "\u6E13"], /* CJK Ideograph */ + ["\u6E14", "\u6E14"], /* CJK Ideograph */ + ["\u6E15", "\u6E15"], /* CJK Ideograph */ + ["\u6E16", "\u6E16"], /* CJK Ideograph */ + ["\u6E17", "\u6E17"], /* CJK Ideograph */ + ["\u6E18", "\u6E18"], /* CJK Ideograph */ + ["\u6E19", "\u6E19"], /* CJK Ideograph */ + ["\u6E1A", "\u6E1A"], /* CJK Ideograph */ + ["\u6E1B", "\u6E1B"], /* CJK Ideograph */ + ["\u6E1C", "\u6E1C"], /* CJK Ideograph */ + ["\u6E1D", "\u6E1D"], /* CJK Ideograph */ + ["\u6E1E", "\u6E1E"], /* CJK Ideograph */ + ["\u6E1F", "\u6E1F"], /* CJK Ideograph */ + ["\u6E20", "\u6E20"], /* CJK Ideograph */ + ["\u6E21", "\u6E21"], /* CJK Ideograph */ + ["\u6E22", "\u6E22"], /* CJK Ideograph */ + ["\u6E23", "\u6E23"], /* CJK Ideograph */ + ["\u6E24", "\u6E24"], /* CJK Ideograph */ + ["\u6E25", "\u6E25"], /* CJK Ideograph */ + ["\u6E26", "\u6E26"], /* CJK Ideograph */ + ["\u6E27", "\u6E27"], /* CJK Ideograph */ + ["\u6E28", "\u6E28"], /* CJK Ideograph */ + ["\u6E29", "\u6E29"], /* CJK Ideograph */ + ["\u6E2A", "\u6E2A"], /* CJK Ideograph */ + ["\u6E2B", "\u6E2B"], /* CJK Ideograph */ + ["\u6E2C", "\u6E2C"], /* CJK Ideograph */ + ["\u6E2D", "\u6E2D"], /* CJK Ideograph */ + ["\u6E2E", "\u6E2E"], /* CJK Ideograph */ + ["\u6E2F", "\u6E2F"], /* CJK Ideograph */ + ["\u6E30", "\u6E30"], /* CJK Ideograph */ + ["\u6E31", "\u6E31"], /* CJK Ideograph */ + ["\u6E32", "\u6E32"], /* CJK Ideograph */ + ["\u6E33", "\u6E33"], /* CJK Ideograph */ + ["\u6E34", "\u6E34"], /* CJK Ideograph */ + ["\u6E35", "\u6E35"], /* CJK Ideograph */ + ["\u6E36", "\u6E36"], /* CJK Ideograph */ + ["\u6E37", "\u6E37"], /* CJK Ideograph */ + ["\u6E38", "\u6E38"], /* CJK Ideograph */ + ["\u6E39", "\u6E39"], /* CJK Ideograph */ + ["\u6E3A", "\u6E3A"], /* CJK Ideograph */ + ["\u6E3B", "\u6E3B"], /* CJK Ideograph */ + ["\u6E3C", "\u6E3C"], /* CJK Ideograph */ + ["\u6E3D", "\u6E3D"], /* CJK Ideograph */ + ["\u6E3E", "\u6E3E"], /* CJK Ideograph */ + ["\u6E3F", "\u6E3F"], /* CJK Ideograph */ + ["\u6E40", "\u6E40"], /* CJK Ideograph */ + ["\u6E41", "\u6E41"], /* CJK Ideograph */ + ["\u6E42", "\u6E42"], /* CJK Ideograph */ + ["\u6E43", "\u6E43"], /* CJK Ideograph */ + ["\u6E44", "\u6E44"], /* CJK Ideograph */ + ["\u6E45", "\u6E45"], /* CJK Ideograph */ + ["\u6E46", "\u6E46"], /* CJK Ideograph */ + ["\u6E47", "\u6E47"], /* CJK Ideograph */ + ["\u6E48", "\u6E48"], /* CJK Ideograph */ + ["\u6E49", "\u6E49"], /* CJK Ideograph */ + ["\u6E4A", "\u6E4A"], /* CJK Ideograph */ + ["\u6E4B", "\u6E4B"], /* CJK Ideograph */ + ["\u6E4C", "\u6E4C"], /* CJK Ideograph */ + ["\u6E4D", "\u6E4D"], /* CJK Ideograph */ + ["\u6E4E", "\u6E4E"], /* CJK Ideograph */ + ["\u6E4F", "\u6E4F"], /* CJK Ideograph */ + ["\u6E50", "\u6E50"], /* CJK Ideograph */ + ["\u6E51", "\u6E51"], /* CJK Ideograph */ + ["\u6E52", "\u6E52"], /* CJK Ideograph */ + ["\u6E53", "\u6E53"], /* CJK Ideograph */ + ["\u6E54", "\u6E54"], /* CJK Ideograph */ + ["\u6E55", "\u6E55"], /* CJK Ideograph */ + ["\u6E56", "\u6E56"], /* CJK Ideograph */ + ["\u6E57", "\u6E57"], /* CJK Ideograph */ + ["\u6E58", "\u6E58"], /* CJK Ideograph */ + ["\u6E59", "\u6E59"], /* CJK Ideograph */ + ["\u6E5A", "\u6E5A"], /* CJK Ideograph */ + ["\u6E5B", "\u6E5B"], /* CJK Ideograph */ + ["\u6E5C", "\u6E5C"], /* CJK Ideograph */ + ["\u6E5D", "\u6E5D"], /* CJK Ideograph */ + ["\u6E5E", "\u6E5E"], /* CJK Ideograph */ + ["\u6E5F", "\u6E5F"], /* CJK Ideograph */ + ["\u6E60", "\u6E60"], /* CJK Ideograph */ + ["\u6E61", "\u6E61"], /* CJK Ideograph */ + ["\u6E62", "\u6E62"], /* CJK Ideograph */ + ["\u6E63", "\u6E63"], /* CJK Ideograph */ + ["\u6E64", "\u6E64"], /* CJK Ideograph */ + ["\u6E65", "\u6E65"], /* CJK Ideograph */ + ["\u6E66", "\u6E66"], /* CJK Ideograph */ + ["\u6E67", "\u6E67"], /* CJK Ideograph */ + ["\u6E68", "\u6E68"], /* CJK Ideograph */ + ["\u6E69", "\u6E69"], /* CJK Ideograph */ + ["\u6E6A", "\u6E6A"], /* CJK Ideograph */ + ["\u6E6B", "\u6E6B"], /* CJK Ideograph */ + ["\u6E6C", "\u6E6C"], /* CJK Ideograph */ + ["\u6E6D", "\u6E6D"], /* CJK Ideograph */ + ["\u6E6E", "\u6E6E"], /* CJK Ideograph */ + ["\u6E6F", "\u6E6F"], /* CJK Ideograph */ + ["\u6E70", "\u6E70"], /* CJK Ideograph */ + ["\u6E71", "\u6E71"], /* CJK Ideograph */ + ["\u6E72", "\u6E72"], /* CJK Ideograph */ + ["\u6E73", "\u6E73"], /* CJK Ideograph */ + ["\u6E74", "\u6E74"], /* CJK Ideograph */ + ["\u6E75", "\u6E75"], /* CJK Ideograph */ + ["\u6E76", "\u6E76"], /* CJK Ideograph */ + ["\u6E77", "\u6E77"], /* CJK Ideograph */ + ["\u6E78", "\u6E78"], /* CJK Ideograph */ + ["\u6E79", "\u6E79"], /* CJK Ideograph */ + ["\u6E7A", "\u6E7A"], /* CJK Ideograph */ + ["\u6E7B", "\u6E7B"], /* CJK Ideograph */ + ["\u6E7C", "\u6E7C"], /* CJK Ideograph */ + ["\u6E7D", "\u6E7D"], /* CJK Ideograph */ + ["\u6E7E", "\u6E7E"], /* CJK Ideograph */ + ["\u6E7F", "\u6E7F"], /* CJK Ideograph */ + ["\u6E80", "\u6E80"], /* CJK Ideograph */ + ["\u6E81", "\u6E81"], /* CJK Ideograph */ + ["\u6E82", "\u6E82"], /* CJK Ideograph */ + ["\u6E83", "\u6E83"], /* CJK Ideograph */ + ["\u6E84", "\u6E84"], /* CJK Ideograph */ + ["\u6E85", "\u6E85"], /* CJK Ideograph */ + ["\u6E86", "\u6E86"], /* CJK Ideograph */ + ["\u6E87", "\u6E87"], /* CJK Ideograph */ + ["\u6E88", "\u6E88"], /* CJK Ideograph */ + ["\u6E89", "\u6E89"], /* CJK Ideograph */ + ["\u6E8A", "\u6E8A"], /* CJK Ideograph */ + ["\u6E8B", "\u6E8B"], /* CJK Ideograph */ + ["\u6E8C", "\u6E8C"], /* CJK Ideograph */ + ["\u6E8D", "\u6E8D"], /* CJK Ideograph */ + ["\u6E8E", "\u6E8E"], /* CJK Ideograph */ + ["\u6E8F", "\u6E8F"], /* CJK Ideograph */ + ["\u6E90", "\u6E90"], /* CJK Ideograph */ + ["\u6E91", "\u6E91"], /* CJK Ideograph */ + ["\u6E92", "\u6E92"], /* CJK Ideograph */ + ["\u6E93", "\u6E93"], /* CJK Ideograph */ + ["\u6E94", "\u6E94"], /* CJK Ideograph */ + ["\u6E95", "\u6E95"], /* CJK Ideograph */ + ["\u6E96", "\u6E96"], /* CJK Ideograph */ + ["\u6E97", "\u6E97"], /* CJK Ideograph */ + ["\u6E98", "\u6E98"], /* CJK Ideograph */ + ["\u6E99", "\u6E99"], /* CJK Ideograph */ + ["\u6E9A", "\u6E9A"], /* CJK Ideograph */ + ["\u6E9B", "\u6E9B"], /* CJK Ideograph */ + ["\u6E9C", "\u6E9C"], /* CJK Ideograph */ + ["\u6E9D", "\u6E9D"], /* CJK Ideograph */ + ["\u6E9E", "\u6E9E"], /* CJK Ideograph */ + ["\u6E9F", "\u6E9F"], /* CJK Ideograph */ + ["\u6EA0", "\u6EA0"], /* CJK Ideograph */ + ["\u6EA1", "\u6EA1"], /* CJK Ideograph */ + ["\u6EA2", "\u6EA2"], /* CJK Ideograph */ + ["\u6EA3", "\u6EA3"], /* CJK Ideograph */ + ["\u6EA4", "\u6EA4"], /* CJK Ideograph */ + ["\u6EA5", "\u6EA5"], /* CJK Ideograph */ + ["\u6EA6", "\u6EA6"], /* CJK Ideograph */ + ["\u6EA7", "\u6EA7"], /* CJK Ideograph */ + ["\u6EA8", "\u6EA8"], /* CJK Ideograph */ + ["\u6EA9", "\u6EA9"], /* CJK Ideograph */ + ["\u6EAA", "\u6EAA"], /* CJK Ideograph */ + ["\u6EAB", "\u6EAB"], /* CJK Ideograph */ + ["\u6EAC", "\u6EAC"], /* CJK Ideograph */ + ["\u6EAD", "\u6EAD"], /* CJK Ideograph */ + ["\u6EAE", "\u6EAE"], /* CJK Ideograph */ + ["\u6EAF", "\u6EAF"], /* CJK Ideograph */ + ["\u6EB0", "\u6EB0"], /* CJK Ideograph */ + ["\u6EB1", "\u6EB1"], /* CJK Ideograph */ + ["\u6EB2", "\u6EB2"], /* CJK Ideograph */ + ["\u6EB3", "\u6EB3"], /* CJK Ideograph */ + ["\u6EB4", "\u6EB4"], /* CJK Ideograph */ + ["\u6EB5", "\u6EB5"], /* CJK Ideograph */ + ["\u6EB6", "\u6EB6"], /* CJK Ideograph */ + ["\u6EB7", "\u6EB7"], /* CJK Ideograph */ + ["\u6EB8", "\u6EB8"], /* CJK Ideograph */ + ["\u6EB9", "\u6EB9"], /* CJK Ideograph */ + ["\u6EBA", "\u6EBA"], /* CJK Ideograph */ + ["\u6EBB", "\u6EBB"], /* CJK Ideograph */ + ["\u6EBC", "\u6EBC"], /* CJK Ideograph */ + ["\u6EBD", "\u6EBD"], /* CJK Ideograph */ + ["\u6EBE", "\u6EBE"], /* CJK Ideograph */ + ["\u6EBF", "\u6EBF"], /* CJK Ideograph */ + ["\u6EC0", "\u6EC0"], /* CJK Ideograph */ + ["\u6EC1", "\u6EC1"], /* CJK Ideograph */ + ["\u6EC2", "\u6EC2"], /* CJK Ideograph */ + ["\u6EC3", "\u6EC3"], /* CJK Ideograph */ + ["\u6EC4", "\u6EC4"], /* CJK Ideograph */ + ["\u6EC5", "\u6EC5"], /* CJK Ideograph */ + ["\u6EC6", "\u6EC6"], /* CJK Ideograph */ + ["\u6EC7", "\u6EC7"], /* CJK Ideograph */ + ["\u6EC8", "\u6EC8"], /* CJK Ideograph */ + ["\u6EC9", "\u6EC9"], /* CJK Ideograph */ + ["\u6ECA", "\u6ECA"], /* CJK Ideograph */ + ["\u6ECB", "\u6ECB"], /* CJK Ideograph */ + ["\u6ECC", "\u6ECC"], /* CJK Ideograph */ + ["\u6ECD", "\u6ECD"], /* CJK Ideograph */ + ["\u6ECE", "\u6ECE"], /* CJK Ideograph */ + ["\u6ECF", "\u6ECF"], /* CJK Ideograph */ + ["\u6ED0", "\u6ED0"], /* CJK Ideograph */ + ["\u6ED1", "\u6ED1"], /* CJK Ideograph */ + ["\u6ED2", "\u6ED2"], /* CJK Ideograph */ + ["\u6ED3", "\u6ED3"], /* CJK Ideograph */ + ["\u6ED4", "\u6ED4"], /* CJK Ideograph */ + ["\u6ED5", "\u6ED5"], /* CJK Ideograph */ + ["\u6ED6", "\u6ED6"], /* CJK Ideograph */ + ["\u6ED7", "\u6ED7"], /* CJK Ideograph */ + ["\u6ED8", "\u6ED8"], /* CJK Ideograph */ + ["\u6ED9", "\u6ED9"], /* CJK Ideograph */ + ["\u6EDA", "\u6EDA"], /* CJK Ideograph */ + ["\u6EDB", "\u6EDB"], /* CJK Ideograph */ + ["\u6EDC", "\u6EDC"], /* CJK Ideograph */ + ["\u6EDD", "\u6EDD"], /* CJK Ideograph */ + ["\u6EDE", "\u6EDE"], /* CJK Ideograph */ + ["\u6EDF", "\u6EDF"], /* CJK Ideograph */ + ["\u6EE0", "\u6EE0"], /* CJK Ideograph */ + ["\u6EE1", "\u6EE1"], /* CJK Ideograph */ + ["\u6EE2", "\u6EE2"], /* CJK Ideograph */ + ["\u6EE3", "\u6EE3"], /* CJK Ideograph */ + ["\u6EE4", "\u6EE4"], /* CJK Ideograph */ + ["\u6EE5", "\u6EE5"], /* CJK Ideograph */ + ["\u6EE6", "\u6EE6"], /* CJK Ideograph */ + ["\u6EE7", "\u6EE7"], /* CJK Ideograph */ + ["\u6EE8", "\u6EE8"], /* CJK Ideograph */ + ["\u6EE9", "\u6EE9"], /* CJK Ideograph */ + ["\u6EEA", "\u6EEA"], /* CJK Ideograph */ + ["\u6EEB", "\u6EEB"], /* CJK Ideograph */ + ["\u6EEC", "\u6EEC"], /* CJK Ideograph */ + ["\u6EED", "\u6EED"], /* CJK Ideograph */ + ["\u6EEE", "\u6EEE"], /* CJK Ideograph */ + ["\u6EEF", "\u6EEF"], /* CJK Ideograph */ + ["\u6EF0", "\u6EF0"], /* CJK Ideograph */ + ["\u6EF1", "\u6EF1"], /* CJK Ideograph */ + ["\u6EF2", "\u6EF2"], /* CJK Ideograph */ + ["\u6EF3", "\u6EF3"], /* CJK Ideograph */ + ["\u6EF4", "\u6EF4"], /* CJK Ideograph */ + ["\u6EF5", "\u6EF5"], /* CJK Ideograph */ + ["\u6EF6", "\u6EF6"], /* CJK Ideograph */ + ["\u6EF7", "\u6EF7"], /* CJK Ideograph */ + ["\u6EF8", "\u6EF8"], /* CJK Ideograph */ + ["\u6EF9", "\u6EF9"], /* CJK Ideograph */ + ["\u6EFA", "\u6EFA"], /* CJK Ideograph */ + ["\u6EFB", "\u6EFB"], /* CJK Ideograph */ + ["\u6EFC", "\u6EFC"], /* CJK Ideograph */ + ["\u6EFD", "\u6EFD"], /* CJK Ideograph */ + ["\u6EFE", "\u6EFE"], /* CJK Ideograph */ + ["\u6EFF", "\u6EFF"], /* CJK Ideograph */ + ["\u6F00", "\u6F00"], /* CJK Ideograph */ + ["\u6F01", "\u6F01"], /* CJK Ideograph */ + ["\u6F02", "\u6F02"], /* CJK Ideograph */ + ["\u6F03", "\u6F03"], /* CJK Ideograph */ + ["\u6F04", "\u6F04"], /* CJK Ideograph */ + ["\u6F05", "\u6F05"], /* CJK Ideograph */ + ["\u6F06", "\u6F06"], /* CJK Ideograph */ + ["\u6F07", "\u6F07"], /* CJK Ideograph */ + ["\u6F08", "\u6F08"], /* CJK Ideograph */ + ["\u6F09", "\u6F09"], /* CJK Ideograph */ + ["\u6F0A", "\u6F0A"], /* CJK Ideograph */ + ["\u6F0B", "\u6F0B"], /* CJK Ideograph */ + ["\u6F0C", "\u6F0C"], /* CJK Ideograph */ + ["\u6F0D", "\u6F0D"], /* CJK Ideograph */ + ["\u6F0E", "\u6F0E"], /* CJK Ideograph */ + ["\u6F0F", "\u6F0F"], /* CJK Ideograph */ + ["\u6F10", "\u6F10"], /* CJK Ideograph */ + ["\u6F11", "\u6F11"], /* CJK Ideograph */ + ["\u6F12", "\u6F12"], /* CJK Ideograph */ + ["\u6F13", "\u6F13"], /* CJK Ideograph */ + ["\u6F14", "\u6F14"], /* CJK Ideograph */ + ["\u6F15", "\u6F15"], /* CJK Ideograph */ + ["\u6F16", "\u6F16"], /* CJK Ideograph */ + ["\u6F17", "\u6F17"], /* CJK Ideograph */ + ["\u6F18", "\u6F18"], /* CJK Ideograph */ + ["\u6F19", "\u6F19"], /* CJK Ideograph */ + ["\u6F1A", "\u6F1A"], /* CJK Ideograph */ + ["\u6F1B", "\u6F1B"], /* CJK Ideograph */ + ["\u6F1C", "\u6F1C"], /* CJK Ideograph */ + ["\u6F1D", "\u6F1D"], /* CJK Ideograph */ + ["\u6F1E", "\u6F1E"], /* CJK Ideograph */ + ["\u6F1F", "\u6F1F"], /* CJK Ideograph */ + ["\u6F20", "\u6F20"], /* CJK Ideograph */ + ["\u6F21", "\u6F21"], /* CJK Ideograph */ + ["\u6F22", "\u6F22"], /* CJK Ideograph */ + ["\u6F23", "\u6F23"], /* CJK Ideograph */ + ["\u6F24", "\u6F24"], /* CJK Ideograph */ + ["\u6F25", "\u6F25"], /* CJK Ideograph */ + ["\u6F26", "\u6F26"], /* CJK Ideograph */ + ["\u6F27", "\u6F27"], /* CJK Ideograph */ + ["\u6F28", "\u6F28"], /* CJK Ideograph */ + ["\u6F29", "\u6F29"], /* CJK Ideograph */ + ["\u6F2A", "\u6F2A"], /* CJK Ideograph */ + ["\u6F2B", "\u6F2B"], /* CJK Ideograph */ + ["\u6F2C", "\u6F2C"], /* CJK Ideograph */ + ["\u6F2D", "\u6F2D"], /* CJK Ideograph */ + ["\u6F2E", "\u6F2E"], /* CJK Ideograph */ + ["\u6F2F", "\u6F2F"], /* CJK Ideograph */ + ["\u6F30", "\u6F30"], /* CJK Ideograph */ + ["\u6F31", "\u6F31"], /* CJK Ideograph */ + ["\u6F32", "\u6F32"], /* CJK Ideograph */ + ["\u6F33", "\u6F33"], /* CJK Ideograph */ + ["\u6F34", "\u6F34"], /* CJK Ideograph */ + ["\u6F35", "\u6F35"], /* CJK Ideograph */ + ["\u6F36", "\u6F36"], /* CJK Ideograph */ + ["\u6F37", "\u6F37"], /* CJK Ideograph */ + ["\u6F38", "\u6F38"], /* CJK Ideograph */ + ["\u6F39", "\u6F39"], /* CJK Ideograph */ + ["\u6F3A", "\u6F3A"], /* CJK Ideograph */ + ["\u6F3B", "\u6F3B"], /* CJK Ideograph */ + ["\u6F3C", "\u6F3C"], /* CJK Ideograph */ + ["\u6F3D", "\u6F3D"], /* CJK Ideograph */ + ["\u6F3E", "\u6F3E"], /* CJK Ideograph */ + ["\u6F3F", "\u6F3F"], /* CJK Ideograph */ + ["\u6F40", "\u6F40"], /* CJK Ideograph */ + ["\u6F41", "\u6F41"], /* CJK Ideograph */ + ["\u6F42", "\u6F42"], /* CJK Ideograph */ + ["\u6F43", "\u6F43"], /* CJK Ideograph */ + ["\u6F44", "\u6F44"], /* CJK Ideograph */ + ["\u6F45", "\u6F45"], /* CJK Ideograph */ + ["\u6F46", "\u6F46"], /* CJK Ideograph */ + ["\u6F47", "\u6F47"], /* CJK Ideograph */ + ["\u6F48", "\u6F48"], /* CJK Ideograph */ + ["\u6F49", "\u6F49"], /* CJK Ideograph */ + ["\u6F4A", "\u6F4A"], /* CJK Ideograph */ + ["\u6F4B", "\u6F4B"], /* CJK Ideograph */ + ["\u6F4C", "\u6F4C"], /* CJK Ideograph */ + ["\u6F4D", "\u6F4D"], /* CJK Ideograph */ + ["\u6F4E", "\u6F4E"], /* CJK Ideograph */ + ["\u6F4F", "\u6F4F"], /* CJK Ideograph */ + ["\u6F50", "\u6F50"], /* CJK Ideograph */ + ["\u6F51", "\u6F51"], /* CJK Ideograph */ + ["\u6F52", "\u6F52"], /* CJK Ideograph */ + ["\u6F53", "\u6F53"], /* CJK Ideograph */ + ["\u6F54", "\u6F54"], /* CJK Ideograph */ + ["\u6F55", "\u6F55"], /* CJK Ideograph */ + ["\u6F56", "\u6F56"], /* CJK Ideograph */ + ["\u6F57", "\u6F57"], /* CJK Ideograph */ + ["\u6F58", "\u6F58"], /* CJK Ideograph */ + ["\u6F59", "\u6F59"], /* CJK Ideograph */ + ["\u6F5A", "\u6F5A"], /* CJK Ideograph */ + ["\u6F5B", "\u6F5B"], /* CJK Ideograph */ + ["\u6F5C", "\u6F5C"], /* CJK Ideograph */ + ["\u6F5D", "\u6F5D"], /* CJK Ideograph */ + ["\u6F5E", "\u6F5E"], /* CJK Ideograph */ + ["\u6F5F", "\u6F5F"], /* CJK Ideograph */ + ["\u6F60", "\u6F60"], /* CJK Ideograph */ + ["\u6F61", "\u6F61"], /* CJK Ideograph */ + ["\u6F62", "\u6F62"], /* CJK Ideograph */ + ["\u6F63", "\u6F63"], /* CJK Ideograph */ + ["\u6F64", "\u6F64"], /* CJK Ideograph */ + ["\u6F65", "\u6F65"], /* CJK Ideograph */ + ["\u6F66", "\u6F66"], /* CJK Ideograph */ + ["\u6F67", "\u6F67"], /* CJK Ideograph */ + ["\u6F68", "\u6F68"], /* CJK Ideograph */ + ["\u6F69", "\u6F69"], /* CJK Ideograph */ + ["\u6F6A", "\u6F6A"], /* CJK Ideograph */ + ["\u6F6B", "\u6F6B"], /* CJK Ideograph */ + ["\u6F6C", "\u6F6C"], /* CJK Ideograph */ + ["\u6F6D", "\u6F6D"], /* CJK Ideograph */ + ["\u6F6E", "\u6F6E"], /* CJK Ideograph */ + ["\u6F6F", "\u6F6F"], /* CJK Ideograph */ + ["\u6F70", "\u6F70"], /* CJK Ideograph */ + ["\u6F71", "\u6F71"], /* CJK Ideograph */ + ["\u6F72", "\u6F72"], /* CJK Ideograph */ + ["\u6F73", "\u6F73"], /* CJK Ideograph */ + ["\u6F74", "\u6F74"], /* CJK Ideograph */ + ["\u6F75", "\u6F75"], /* CJK Ideograph */ + ["\u6F76", "\u6F76"], /* CJK Ideograph */ + ["\u6F77", "\u6F77"], /* CJK Ideograph */ + ["\u6F78", "\u6F78"], /* CJK Ideograph */ + ["\u6F79", "\u6F79"], /* CJK Ideograph */ + ["\u6F7A", "\u6F7A"], /* CJK Ideograph */ + ["\u6F7B", "\u6F7B"], /* CJK Ideograph */ + ["\u6F7C", "\u6F7C"], /* CJK Ideograph */ + ["\u6F7D", "\u6F7D"], /* CJK Ideograph */ + ["\u6F7E", "\u6F7E"], /* CJK Ideograph */ + ["\u6F7F", "\u6F7F"], /* CJK Ideograph */ + ["\u6F80", "\u6F80"], /* CJK Ideograph */ + ["\u6F81", "\u6F81"], /* CJK Ideograph */ + ["\u6F82", "\u6F82"], /* CJK Ideograph */ + ["\u6F83", "\u6F83"], /* CJK Ideograph */ + ["\u6F84", "\u6F84"], /* CJK Ideograph */ + ["\u6F85", "\u6F85"], /* CJK Ideograph */ + ["\u6F86", "\u6F86"], /* CJK Ideograph */ + ["\u6F87", "\u6F87"], /* CJK Ideograph */ + ["\u6F88", "\u6F88"], /* CJK Ideograph */ + ["\u6F89", "\u6F89"], /* CJK Ideograph */ + ["\u6F8A", "\u6F8A"], /* CJK Ideograph */ + ["\u6F8B", "\u6F8B"], /* CJK Ideograph */ + ["\u6F8C", "\u6F8C"], /* CJK Ideograph */ + ["\u6F8D", "\u6F8D"], /* CJK Ideograph */ + ["\u6F8E", "\u6F8E"], /* CJK Ideograph */ + ["\u6F8F", "\u6F8F"], /* CJK Ideograph */ + ["\u6F90", "\u6F90"], /* CJK Ideograph */ + ["\u6F91", "\u6F91"], /* CJK Ideograph */ + ["\u6F92", "\u6F92"], /* CJK Ideograph */ + ["\u6F93", "\u6F93"], /* CJK Ideograph */ + ["\u6F94", "\u6F94"], /* CJK Ideograph */ + ["\u6F95", "\u6F95"], /* CJK Ideograph */ + ["\u6F96", "\u6F96"], /* CJK Ideograph */ + ["\u6F97", "\u6F97"], /* CJK Ideograph */ + ["\u6F98", "\u6F98"], /* CJK Ideograph */ + ["\u6F99", "\u6F99"], /* CJK Ideograph */ + ["\u6F9A", "\u6F9A"], /* CJK Ideograph */ + ["\u6F9B", "\u6F9B"], /* CJK Ideograph */ + ["\u6F9C", "\u6F9C"], /* CJK Ideograph */ + ["\u6F9D", "\u6F9D"], /* CJK Ideograph */ + ["\u6F9E", "\u6F9E"], /* CJK Ideograph */ + ["\u6F9F", "\u6F9F"], /* CJK Ideograph */ + ["\u6FA0", "\u6FA0"], /* CJK Ideograph */ + ["\u6FA1", "\u6FA1"], /* CJK Ideograph */ + ["\u6FA2", "\u6FA2"], /* CJK Ideograph */ + ["\u6FA3", "\u6FA3"], /* CJK Ideograph */ + ["\u6FA4", "\u6FA4"], /* CJK Ideograph */ + ["\u6FA5", "\u6FA5"], /* CJK Ideograph */ + ["\u6FA6", "\u6FA6"], /* CJK Ideograph */ + ["\u6FA7", "\u6FA7"], /* CJK Ideograph */ + ["\u6FA8", "\u6FA8"], /* CJK Ideograph */ + ["\u6FA9", "\u6FA9"], /* CJK Ideograph */ + ["\u6FAA", "\u6FAA"], /* CJK Ideograph */ + ["\u6FAB", "\u6FAB"], /* CJK Ideograph */ + ["\u6FAC", "\u6FAC"], /* CJK Ideograph */ + ["\u6FAD", "\u6FAD"], /* CJK Ideograph */ + ["\u6FAE", "\u6FAE"], /* CJK Ideograph */ + ["\u6FAF", "\u6FAF"], /* CJK Ideograph */ + ["\u6FB0", "\u6FB0"], /* CJK Ideograph */ + ["\u6FB1", "\u6FB1"], /* CJK Ideograph */ + ["\u6FB2", "\u6FB2"], /* CJK Ideograph */ + ["\u6FB3", "\u6FB3"], /* CJK Ideograph */ + ["\u6FB4", "\u6FB4"], /* CJK Ideograph */ + ["\u6FB5", "\u6FB5"], /* CJK Ideograph */ + ["\u6FB6", "\u6FB6"], /* CJK Ideograph */ + ["\u6FB7", "\u6FB7"], /* CJK Ideograph */ + ["\u6FB8", "\u6FB8"], /* CJK Ideograph */ + ["\u6FB9", "\u6FB9"], /* CJK Ideograph */ + ["\u6FBA", "\u6FBA"], /* CJK Ideograph */ + ["\u6FBB", "\u6FBB"], /* CJK Ideograph */ + ["\u6FBC", "\u6FBC"], /* CJK Ideograph */ + ["\u6FBD", "\u6FBD"], /* CJK Ideograph */ + ["\u6FBE", "\u6FBE"], /* CJK Ideograph */ + ["\u6FBF", "\u6FBF"], /* CJK Ideograph */ + ["\u6FC0", "\u6FC0"], /* CJK Ideograph */ + ["\u6FC1", "\u6FC1"], /* CJK Ideograph */ + ["\u6FC2", "\u6FC2"], /* CJK Ideograph */ + ["\u6FC3", "\u6FC3"], /* CJK Ideograph */ + ["\u6FC4", "\u6FC4"], /* CJK Ideograph */ + ["\u6FC5", "\u6FC5"], /* CJK Ideograph */ + ["\u6FC6", "\u6FC6"], /* CJK Ideograph */ + ["\u6FC7", "\u6FC7"], /* CJK Ideograph */ + ["\u6FC8", "\u6FC8"], /* CJK Ideograph */ + ["\u6FC9", "\u6FC9"], /* CJK Ideograph */ + ["\u6FCA", "\u6FCA"], /* CJK Ideograph */ + ["\u6FCB", "\u6FCB"], /* CJK Ideograph */ + ["\u6FCC", "\u6FCC"], /* CJK Ideograph */ + ["\u6FCD", "\u6FCD"], /* CJK Ideograph */ + ["\u6FCE", "\u6FCE"], /* CJK Ideograph */ + ["\u6FCF", "\u6FCF"], /* CJK Ideograph */ + ["\u6FD0", "\u6FD0"], /* CJK Ideograph */ + ["\u6FD1", "\u6FD1"], /* CJK Ideograph */ + ["\u6FD2", "\u6FD2"], /* CJK Ideograph */ + ["\u6FD3", "\u6FD3"], /* CJK Ideograph */ + ["\u6FD4", "\u6FD4"], /* CJK Ideograph */ + ["\u6FD5", "\u6FD5"], /* CJK Ideograph */ + ["\u6FD6", "\u6FD6"], /* CJK Ideograph */ + ["\u6FD7", "\u6FD7"], /* CJK Ideograph */ + ["\u6FD8", "\u6FD8"], /* CJK Ideograph */ + ["\u6FD9", "\u6FD9"], /* CJK Ideograph */ + ["\u6FDA", "\u6FDA"], /* CJK Ideograph */ + ["\u6FDB", "\u6FDB"], /* CJK Ideograph */ + ["\u6FDC", "\u6FDC"], /* CJK Ideograph */ + ["\u6FDD", "\u6FDD"], /* CJK Ideograph */ + ["\u6FDE", "\u6FDE"], /* CJK Ideograph */ + ["\u6FDF", "\u6FDF"], /* CJK Ideograph */ + ["\u6FE0", "\u6FE0"], /* CJK Ideograph */ + ["\u6FE1", "\u6FE1"], /* CJK Ideograph */ + ["\u6FE2", "\u6FE2"], /* CJK Ideograph */ + ["\u6FE3", "\u6FE3"], /* CJK Ideograph */ + ["\u6FE4", "\u6FE4"], /* CJK Ideograph */ + ["\u6FE5", "\u6FE5"], /* CJK Ideograph */ + ["\u6FE6", "\u6FE6"], /* CJK Ideograph */ + ["\u6FE7", "\u6FE7"], /* CJK Ideograph */ + ["\u6FE8", "\u6FE8"], /* CJK Ideograph */ + ["\u6FE9", "\u6FE9"], /* CJK Ideograph */ + ["\u6FEA", "\u6FEA"], /* CJK Ideograph */ + ["\u6FEB", "\u6FEB"], /* CJK Ideograph */ + ["\u6FEC", "\u6FEC"], /* CJK Ideograph */ + ["\u6FED", "\u6FED"], /* CJK Ideograph */ + ["\u6FEE", "\u6FEE"], /* CJK Ideograph */ + ["\u6FEF", "\u6FEF"], /* CJK Ideograph */ + ["\u6FF0", "\u6FF0"], /* CJK Ideograph */ + ["\u6FF1", "\u6FF1"], /* CJK Ideograph */ + ["\u6FF2", "\u6FF2"], /* CJK Ideograph */ + ["\u6FF3", "\u6FF3"], /* CJK Ideograph */ + ["\u6FF4", "\u6FF4"], /* CJK Ideograph */ + ["\u6FF5", "\u6FF5"], /* CJK Ideograph */ + ["\u6FF6", "\u6FF6"], /* CJK Ideograph */ + ["\u6FF7", "\u6FF7"], /* CJK Ideograph */ + ["\u6FF8", "\u6FF8"], /* CJK Ideograph */ + ["\u6FF9", "\u6FF9"], /* CJK Ideograph */ + ["\u6FFA", "\u6FFA"], /* CJK Ideograph */ + ["\u6FFB", "\u6FFB"], /* CJK Ideograph */ + ["\u6FFC", "\u6FFC"], /* CJK Ideograph */ + ["\u6FFD", "\u6FFD"], /* CJK Ideograph */ + ["\u6FFE", "\u6FFE"], /* CJK Ideograph */ + ["\u6FFF", "\u6FFF"], /* CJK Ideograph */ + ["\u7000", "\u7000"], /* CJK Ideograph */ + ["\u7001", "\u7001"], /* CJK Ideograph */ + ["\u7002", "\u7002"], /* CJK Ideograph */ + ["\u7003", "\u7003"], /* CJK Ideograph */ + ["\u7004", "\u7004"], /* CJK Ideograph */ + ["\u7005", "\u7005"], /* CJK Ideograph */ + ["\u7006", "\u7006"], /* CJK Ideograph */ + ["\u7007", "\u7007"], /* CJK Ideograph */ + ["\u7008", "\u7008"], /* CJK Ideograph */ + ["\u7009", "\u7009"], /* CJK Ideograph */ + ["\u700A", "\u700A"], /* CJK Ideograph */ + ["\u700B", "\u700B"], /* CJK Ideograph */ + ["\u700C", "\u700C"], /* CJK Ideograph */ + ["\u700D", "\u700D"], /* CJK Ideograph */ + ["\u700E", "\u700E"], /* CJK Ideograph */ + ["\u700F", "\u700F"], /* CJK Ideograph */ + ["\u7010", "\u7010"], /* CJK Ideograph */ + ["\u7011", "\u7011"], /* CJK Ideograph */ + ["\u7012", "\u7012"], /* CJK Ideograph */ + ["\u7013", "\u7013"], /* CJK Ideograph */ + ["\u7014", "\u7014"], /* CJK Ideograph */ + ["\u7015", "\u7015"], /* CJK Ideograph */ + ["\u7016", "\u7016"], /* CJK Ideograph */ + ["\u7017", "\u7017"], /* CJK Ideograph */ + ["\u7018", "\u7018"], /* CJK Ideograph */ + ["\u7019", "\u7019"], /* CJK Ideograph */ + ["\u701A", "\u701A"], /* CJK Ideograph */ + ["\u701B", "\u701B"], /* CJK Ideograph */ + ["\u701C", "\u701C"], /* CJK Ideograph */ + ["\u701D", "\u701D"], /* CJK Ideograph */ + ["\u701E", "\u701E"], /* CJK Ideograph */ + ["\u701F", "\u701F"], /* CJK Ideograph */ + ["\u7020", "\u7020"], /* CJK Ideograph */ + ["\u7021", "\u7021"], /* CJK Ideograph */ + ["\u7022", "\u7022"], /* CJK Ideograph */ + ["\u7023", "\u7023"], /* CJK Ideograph */ + ["\u7024", "\u7024"], /* CJK Ideograph */ + ["\u7025", "\u7025"], /* CJK Ideograph */ + ["\u7026", "\u7026"], /* CJK Ideograph */ + ["\u7027", "\u7027"], /* CJK Ideograph */ + ["\u7028", "\u7028"], /* CJK Ideograph */ + ["\u7029", "\u7029"], /* CJK Ideograph */ + ["\u702A", "\u702A"], /* CJK Ideograph */ + ["\u702B", "\u702B"], /* CJK Ideograph */ + ["\u702C", "\u702C"], /* CJK Ideograph */ + ["\u702D", "\u702D"], /* CJK Ideograph */ + ["\u702E", "\u702E"], /* CJK Ideograph */ + ["\u702F", "\u702F"], /* CJK Ideograph */ + ["\u7030", "\u7030"], /* CJK Ideograph */ + ["\u7031", "\u7031"], /* CJK Ideograph */ + ["\u7032", "\u7032"], /* CJK Ideograph */ + ["\u7033", "\u7033"], /* CJK Ideograph */ + ["\u7034", "\u7034"], /* CJK Ideograph */ + ["\u7035", "\u7035"], /* CJK Ideograph */ + ["\u7036", "\u7036"], /* CJK Ideograph */ + ["\u7037", "\u7037"], /* CJK Ideograph */ + ["\u7038", "\u7038"], /* CJK Ideograph */ + ["\u7039", "\u7039"], /* CJK Ideograph */ + ["\u703A", "\u703A"], /* CJK Ideograph */ + ["\u703B", "\u703B"], /* CJK Ideograph */ + ["\u703C", "\u703C"], /* CJK Ideograph */ + ["\u703D", "\u703D"], /* CJK Ideograph */ + ["\u703E", "\u703E"], /* CJK Ideograph */ + ["\u703F", "\u703F"], /* CJK Ideograph */ + ["\u7040", "\u7040"], /* CJK Ideograph */ + ["\u7041", "\u7041"], /* CJK Ideograph */ + ["\u7042", "\u7042"], /* CJK Ideograph */ + ["\u7043", "\u7043"], /* CJK Ideograph */ + ["\u7044", "\u7044"], /* CJK Ideograph */ + ["\u7045", "\u7045"], /* CJK Ideograph */ + ["\u7046", "\u7046"], /* CJK Ideograph */ + ["\u7047", "\u7047"], /* CJK Ideograph */ + ["\u7048", "\u7048"], /* CJK Ideograph */ + ["\u7049", "\u7049"], /* CJK Ideograph */ + ["\u704A", "\u704A"], /* CJK Ideograph */ + ["\u704B", "\u704B"], /* CJK Ideograph */ + ["\u704C", "\u704C"], /* CJK Ideograph */ + ["\u704D", "\u704D"], /* CJK Ideograph */ + ["\u704E", "\u704E"], /* CJK Ideograph */ + ["\u704F", "\u704F"], /* CJK Ideograph */ + ["\u7050", "\u7050"], /* CJK Ideograph */ + ["\u7051", "\u7051"], /* CJK Ideograph */ + ["\u7052", "\u7052"], /* CJK Ideograph */ + ["\u7053", "\u7053"], /* CJK Ideograph */ + ["\u7054", "\u7054"], /* CJK Ideograph */ + ["\u7055", "\u7055"], /* CJK Ideograph */ + ["\u7056", "\u7056"], /* CJK Ideograph */ + ["\u7057", "\u7057"], /* CJK Ideograph */ + ["\u7058", "\u7058"], /* CJK Ideograph */ + ["\u7059", "\u7059"], /* CJK Ideograph */ + ["\u705A", "\u705A"], /* CJK Ideograph */ + ["\u705B", "\u705B"], /* CJK Ideograph */ + ["\u705C", "\u705C"], /* CJK Ideograph */ + ["\u705D", "\u705D"], /* CJK Ideograph */ + ["\u705E", "\u705E"], /* CJK Ideograph */ + ["\u705F", "\u705F"], /* CJK Ideograph */ + ["\u7060", "\u7060"], /* CJK Ideograph */ + ["\u7061", "\u7061"], /* CJK Ideograph */ + ["\u7062", "\u7062"], /* CJK Ideograph */ + ["\u7063", "\u7063"], /* CJK Ideograph */ + ["\u7064", "\u7064"], /* CJK Ideograph */ + ["\u7065", "\u7065"], /* CJK Ideograph */ + ["\u7066", "\u7066"], /* CJK Ideograph */ + ["\u7067", "\u7067"], /* CJK Ideograph */ + ["\u7068", "\u7068"], /* CJK Ideograph */ + ["\u7069", "\u7069"], /* CJK Ideograph */ + ["\u706A", "\u706A"], /* CJK Ideograph */ + ["\u706B", "\u706B"], /* CJK Ideograph */ + ["\u706C", "\u706C"], /* CJK Ideograph */ + ["\u706D", "\u706D"], /* CJK Ideograph */ + ["\u706E", "\u706E"], /* CJK Ideograph */ + ["\u706F", "\u706F"], /* CJK Ideograph */ + ["\u7070", "\u7070"], /* CJK Ideograph */ + ["\u7071", "\u7071"], /* CJK Ideograph */ + ["\u7072", "\u7072"], /* CJK Ideograph */ + ["\u7073", "\u7073"], /* CJK Ideograph */ + ["\u7074", "\u7074"], /* CJK Ideograph */ + ["\u7075", "\u7075"], /* CJK Ideograph */ + ["\u7076", "\u7076"], /* CJK Ideograph */ + ["\u7077", "\u7077"], /* CJK Ideograph */ + ["\u7078", "\u7078"], /* CJK Ideograph */ + ["\u7079", "\u7079"], /* CJK Ideograph */ + ["\u707A", "\u707A"], /* CJK Ideograph */ + ["\u707B", "\u707B"], /* CJK Ideograph */ + ["\u707C", "\u707C"], /* CJK Ideograph */ + ["\u707D", "\u707D"], /* CJK Ideograph */ + ["\u707E", "\u707E"], /* CJK Ideograph */ + ["\u707F", "\u707F"], /* CJK Ideograph */ + ["\u7080", "\u7080"], /* CJK Ideograph */ + ["\u7081", "\u7081"], /* CJK Ideograph */ + ["\u7082", "\u7082"], /* CJK Ideograph */ + ["\u7083", "\u7083"], /* CJK Ideograph */ + ["\u7084", "\u7084"], /* CJK Ideograph */ + ["\u7085", "\u7085"], /* CJK Ideograph */ + ["\u7086", "\u7086"], /* CJK Ideograph */ + ["\u7087", "\u7087"], /* CJK Ideograph */ + ["\u7088", "\u7088"], /* CJK Ideograph */ + ["\u7089", "\u7089"], /* CJK Ideograph */ + ["\u708A", "\u708A"], /* CJK Ideograph */ + ["\u708B", "\u708B"], /* CJK Ideograph */ + ["\u708C", "\u708C"], /* CJK Ideograph */ + ["\u708D", "\u708D"], /* CJK Ideograph */ + ["\u708E", "\u708E"], /* CJK Ideograph */ + ["\u708F", "\u708F"], /* CJK Ideograph */ + ["\u7090", "\u7090"], /* CJK Ideograph */ + ["\u7091", "\u7091"], /* CJK Ideograph */ + ["\u7092", "\u7092"], /* CJK Ideograph */ + ["\u7093", "\u7093"], /* CJK Ideograph */ + ["\u7094", "\u7094"], /* CJK Ideograph */ + ["\u7095", "\u7095"], /* CJK Ideograph */ + ["\u7096", "\u7096"], /* CJK Ideograph */ + ["\u7097", "\u7097"], /* CJK Ideograph */ + ["\u7098", "\u7098"], /* CJK Ideograph */ + ["\u7099", "\u7099"], /* CJK Ideograph */ + ["\u709A", "\u709A"], /* CJK Ideograph */ + ["\u709B", "\u709B"], /* CJK Ideograph */ + ["\u709C", "\u709C"], /* CJK Ideograph */ + ["\u709D", "\u709D"], /* CJK Ideograph */ + ["\u709E", "\u709E"], /* CJK Ideograph */ + ["\u709F", "\u709F"], /* CJK Ideograph */ + ["\u70A0", "\u70A0"], /* CJK Ideograph */ + ["\u70A1", "\u70A1"], /* CJK Ideograph */ + ["\u70A2", "\u70A2"], /* CJK Ideograph */ + ["\u70A3", "\u70A3"], /* CJK Ideograph */ + ["\u70A4", "\u70A4"], /* CJK Ideograph */ + ["\u70A5", "\u70A5"], /* CJK Ideograph */ + ["\u70A6", "\u70A6"], /* CJK Ideograph */ + ["\u70A7", "\u70A7"], /* CJK Ideograph */ + ["\u70A8", "\u70A8"], /* CJK Ideograph */ + ["\u70A9", "\u70A9"], /* CJK Ideograph */ + ["\u70AA", "\u70AA"], /* CJK Ideograph */ + ["\u70AB", "\u70AB"], /* CJK Ideograph */ + ["\u70AC", "\u70AC"], /* CJK Ideograph */ + ["\u70AD", "\u70AD"], /* CJK Ideograph */ + ["\u70AE", "\u70AE"], /* CJK Ideograph */ + ["\u70AF", "\u70AF"], /* CJK Ideograph */ + ["\u70B0", "\u70B0"], /* CJK Ideograph */ + ["\u70B1", "\u70B1"], /* CJK Ideograph */ + ["\u70B2", "\u70B2"], /* CJK Ideograph */ + ["\u70B3", "\u70B3"], /* CJK Ideograph */ + ["\u70B4", "\u70B4"], /* CJK Ideograph */ + ["\u70B5", "\u70B5"], /* CJK Ideograph */ + ["\u70B6", "\u70B6"], /* CJK Ideograph */ + ["\u70B7", "\u70B7"], /* CJK Ideograph */ + ["\u70B8", "\u70B8"], /* CJK Ideograph */ + ["\u70B9", "\u70B9"], /* CJK Ideograph */ + ["\u70BA", "\u70BA"], /* CJK Ideograph */ + ["\u70BB", "\u70BB"], /* CJK Ideograph */ + ["\u70BC", "\u70BC"], /* CJK Ideograph */ + ["\u70BD", "\u70BD"], /* CJK Ideograph */ + ["\u70BE", "\u70BE"], /* CJK Ideograph */ + ["\u70BF", "\u70BF"], /* CJK Ideograph */ + ["\u70C0", "\u70C0"], /* CJK Ideograph */ + ["\u70C1", "\u70C1"], /* CJK Ideograph */ + ["\u70C2", "\u70C2"], /* CJK Ideograph */ + ["\u70C3", "\u70C3"], /* CJK Ideograph */ + ["\u70C4", "\u70C4"], /* CJK Ideograph */ + ["\u70C5", "\u70C5"], /* CJK Ideograph */ + ["\u70C6", "\u70C6"], /* CJK Ideograph */ + ["\u70C7", "\u70C7"], /* CJK Ideograph */ + ["\u70C8", "\u70C8"], /* CJK Ideograph */ + ["\u70C9", "\u70C9"], /* CJK Ideograph */ + ["\u70CA", "\u70CA"], /* CJK Ideograph */ + ["\u70CB", "\u70CB"], /* CJK Ideograph */ + ["\u70CC", "\u70CC"], /* CJK Ideograph */ + ["\u70CD", "\u70CD"], /* CJK Ideograph */ + ["\u70CE", "\u70CE"], /* CJK Ideograph */ + ["\u70CF", "\u70CF"], /* CJK Ideograph */ + ["\u70D0", "\u70D0"], /* CJK Ideograph */ + ["\u70D1", "\u70D1"], /* CJK Ideograph */ + ["\u70D2", "\u70D2"], /* CJK Ideograph */ + ["\u70D3", "\u70D3"], /* CJK Ideograph */ + ["\u70D4", "\u70D4"], /* CJK Ideograph */ + ["\u70D5", "\u70D5"], /* CJK Ideograph */ + ["\u70D6", "\u70D6"], /* CJK Ideograph */ + ["\u70D7", "\u70D7"], /* CJK Ideograph */ + ["\u70D8", "\u70D8"], /* CJK Ideograph */ + ["\u70D9", "\u70D9"], /* CJK Ideograph */ + ["\u70DA", "\u70DA"], /* CJK Ideograph */ + ["\u70DB", "\u70DB"], /* CJK Ideograph */ + ["\u70DC", "\u70DC"], /* CJK Ideograph */ + ["\u70DD", "\u70DD"], /* CJK Ideograph */ + ["\u70DE", "\u70DE"], /* CJK Ideograph */ + ["\u70DF", "\u70DF"], /* CJK Ideograph */ + ["\u70E0", "\u70E0"], /* CJK Ideograph */ + ["\u70E1", "\u70E1"], /* CJK Ideograph */ + ["\u70E2", "\u70E2"], /* CJK Ideograph */ + ["\u70E3", "\u70E3"], /* CJK Ideograph */ + ["\u70E4", "\u70E4"], /* CJK Ideograph */ + ["\u70E5", "\u70E5"], /* CJK Ideograph */ + ["\u70E6", "\u70E6"], /* CJK Ideograph */ + ["\u70E7", "\u70E7"], /* CJK Ideograph */ + ["\u70E8", "\u70E8"], /* CJK Ideograph */ + ["\u70E9", "\u70E9"], /* CJK Ideograph */ + ["\u70EA", "\u70EA"], /* CJK Ideograph */ + ["\u70EB", "\u70EB"], /* CJK Ideograph */ + ["\u70EC", "\u70EC"], /* CJK Ideograph */ + ["\u70ED", "\u70ED"], /* CJK Ideograph */ + ["\u70EE", "\u70EE"], /* CJK Ideograph */ + ["\u70EF", "\u70EF"], /* CJK Ideograph */ + ["\u70F0", "\u70F0"], /* CJK Ideograph */ + ["\u70F1", "\u70F1"], /* CJK Ideograph */ + ["\u70F2", "\u70F2"], /* CJK Ideograph */ + ["\u70F3", "\u70F3"], /* CJK Ideograph */ + ["\u70F4", "\u70F4"], /* CJK Ideograph */ + ["\u70F5", "\u70F5"], /* CJK Ideograph */ + ["\u70F6", "\u70F6"], /* CJK Ideograph */ + ["\u70F7", "\u70F7"], /* CJK Ideograph */ + ["\u70F8", "\u70F8"], /* CJK Ideograph */ + ["\u70F9", "\u70F9"], /* CJK Ideograph */ + ["\u70FA", "\u70FA"], /* CJK Ideograph */ + ["\u70FB", "\u70FB"], /* CJK Ideograph */ + ["\u70FC", "\u70FC"], /* CJK Ideograph */ + ["\u70FD", "\u70FD"], /* CJK Ideograph */ + ["\u70FE", "\u70FE"], /* CJK Ideograph */ + ["\u70FF", "\u70FF"], /* CJK Ideograph */ + ["\u7100", "\u7100"], /* CJK Ideograph */ + ["\u7101", "\u7101"], /* CJK Ideograph */ + ["\u7102", "\u7102"], /* CJK Ideograph */ + ["\u7103", "\u7103"], /* CJK Ideograph */ + ["\u7104", "\u7104"], /* CJK Ideograph */ + ["\u7105", "\u7105"], /* CJK Ideograph */ + ["\u7106", "\u7106"], /* CJK Ideograph */ + ["\u7107", "\u7107"], /* CJK Ideograph */ + ["\u7108", "\u7108"], /* CJK Ideograph */ + ["\u7109", "\u7109"], /* CJK Ideograph */ + ["\u710A", "\u710A"], /* CJK Ideograph */ + ["\u710B", "\u710B"], /* CJK Ideograph */ + ["\u710C", "\u710C"], /* CJK Ideograph */ + ["\u710D", "\u710D"], /* CJK Ideograph */ + ["\u710E", "\u710E"], /* CJK Ideograph */ + ["\u710F", "\u710F"], /* CJK Ideograph */ + ["\u7110", "\u7110"], /* CJK Ideograph */ + ["\u7111", "\u7111"], /* CJK Ideograph */ + ["\u7112", "\u7112"], /* CJK Ideograph */ + ["\u7113", "\u7113"], /* CJK Ideograph */ + ["\u7114", "\u7114"], /* CJK Ideograph */ + ["\u7115", "\u7115"], /* CJK Ideograph */ + ["\u7116", "\u7116"], /* CJK Ideograph */ + ["\u7117", "\u7117"], /* CJK Ideograph */ + ["\u7118", "\u7118"], /* CJK Ideograph */ + ["\u7119", "\u7119"], /* CJK Ideograph */ + ["\u711A", "\u711A"], /* CJK Ideograph */ + ["\u711B", "\u711B"], /* CJK Ideograph */ + ["\u711C", "\u711C"], /* CJK Ideograph */ + ["\u711D", "\u711D"], /* CJK Ideograph */ + ["\u711E", "\u711E"], /* CJK Ideograph */ + ["\u711F", "\u711F"], /* CJK Ideograph */ + ["\u7120", "\u7120"], /* CJK Ideograph */ + ["\u7121", "\u7121"], /* CJK Ideograph */ + ["\u7122", "\u7122"], /* CJK Ideograph */ + ["\u7123", "\u7123"], /* CJK Ideograph */ + ["\u7124", "\u7124"], /* CJK Ideograph */ + ["\u7125", "\u7125"], /* CJK Ideograph */ + ["\u7126", "\u7126"], /* CJK Ideograph */ + ["\u7127", "\u7127"], /* CJK Ideograph */ + ["\u7128", "\u7128"], /* CJK Ideograph */ + ["\u7129", "\u7129"], /* CJK Ideograph */ + ["\u712A", "\u712A"], /* CJK Ideograph */ + ["\u712B", "\u712B"], /* CJK Ideograph */ + ["\u712C", "\u712C"], /* CJK Ideograph */ + ["\u712D", "\u712D"], /* CJK Ideograph */ + ["\u712E", "\u712E"], /* CJK Ideograph */ + ["\u712F", "\u712F"], /* CJK Ideograph */ + ["\u7130", "\u7130"], /* CJK Ideograph */ + ["\u7131", "\u7131"], /* CJK Ideograph */ + ["\u7132", "\u7132"], /* CJK Ideograph */ + ["\u7133", "\u7133"], /* CJK Ideograph */ + ["\u7134", "\u7134"], /* CJK Ideograph */ + ["\u7135", "\u7135"], /* CJK Ideograph */ + ["\u7136", "\u7136"], /* CJK Ideograph */ + ["\u7137", "\u7137"], /* CJK Ideograph */ + ["\u7138", "\u7138"], /* CJK Ideograph */ + ["\u7139", "\u7139"], /* CJK Ideograph */ + ["\u713A", "\u713A"], /* CJK Ideograph */ + ["\u713B", "\u713B"], /* CJK Ideograph */ + ["\u713C", "\u713C"], /* CJK Ideograph */ + ["\u713D", "\u713D"], /* CJK Ideograph */ + ["\u713E", "\u713E"], /* CJK Ideograph */ + ["\u713F", "\u713F"], /* CJK Ideograph */ + ["\u7140", "\u7140"], /* CJK Ideograph */ + ["\u7141", "\u7141"], /* CJK Ideograph */ + ["\u7142", "\u7142"], /* CJK Ideograph */ + ["\u7143", "\u7143"], /* CJK Ideograph */ + ["\u7144", "\u7144"], /* CJK Ideograph */ + ["\u7145", "\u7145"], /* CJK Ideograph */ + ["\u7146", "\u7146"], /* CJK Ideograph */ + ["\u7147", "\u7147"], /* CJK Ideograph */ + ["\u7148", "\u7148"], /* CJK Ideograph */ + ["\u7149", "\u7149"], /* CJK Ideograph */ + ["\u714A", "\u714A"], /* CJK Ideograph */ + ["\u714B", "\u714B"], /* CJK Ideograph */ + ["\u714C", "\u714C"], /* CJK Ideograph */ + ["\u714D", "\u714D"], /* CJK Ideograph */ + ["\u714E", "\u714E"], /* CJK Ideograph */ + ["\u714F", "\u714F"], /* CJK Ideograph */ + ["\u7150", "\u7150"], /* CJK Ideograph */ + ["\u7151", "\u7151"], /* CJK Ideograph */ + ["\u7152", "\u7152"], /* CJK Ideograph */ + ["\u7153", "\u7153"], /* CJK Ideograph */ + ["\u7154", "\u7154"], /* CJK Ideograph */ + ["\u7155", "\u7155"], /* CJK Ideograph */ + ["\u7156", "\u7156"], /* CJK Ideograph */ + ["\u7157", "\u7157"], /* CJK Ideograph */ + ["\u7158", "\u7158"], /* CJK Ideograph */ + ["\u7159", "\u7159"], /* CJK Ideograph */ + ["\u715A", "\u715A"], /* CJK Ideograph */ + ["\u715B", "\u715B"], /* CJK Ideograph */ + ["\u715C", "\u715C"], /* CJK Ideograph */ + ["\u715D", "\u715D"], /* CJK Ideograph */ + ["\u715E", "\u715E"], /* CJK Ideograph */ + ["\u715F", "\u715F"], /* CJK Ideograph */ + ["\u7160", "\u7160"], /* CJK Ideograph */ + ["\u7161", "\u7161"], /* CJK Ideograph */ + ["\u7162", "\u7162"], /* CJK Ideograph */ + ["\u7163", "\u7163"], /* CJK Ideograph */ + ["\u7164", "\u7164"], /* CJK Ideograph */ + ["\u7165", "\u7165"], /* CJK Ideograph */ + ["\u7166", "\u7166"], /* CJK Ideograph */ + ["\u7167", "\u7167"], /* CJK Ideograph */ + ["\u7168", "\u7168"], /* CJK Ideograph */ + ["\u7169", "\u7169"], /* CJK Ideograph */ + ["\u716A", "\u716A"], /* CJK Ideograph */ + ["\u716B", "\u716B"], /* CJK Ideograph */ + ["\u716C", "\u716C"], /* CJK Ideograph */ + ["\u716D", "\u716D"], /* CJK Ideograph */ + ["\u716E", "\u716E"], /* CJK Ideograph */ + ["\u716F", "\u716F"], /* CJK Ideograph */ + ["\u7170", "\u7170"], /* CJK Ideograph */ + ["\u7171", "\u7171"], /* CJK Ideograph */ + ["\u7172", "\u7172"], /* CJK Ideograph */ + ["\u7173", "\u7173"], /* CJK Ideograph */ + ["\u7174", "\u7174"], /* CJK Ideograph */ + ["\u7175", "\u7175"], /* CJK Ideograph */ + ["\u7176", "\u7176"], /* CJK Ideograph */ + ["\u7177", "\u7177"], /* CJK Ideograph */ + ["\u7178", "\u7178"], /* CJK Ideograph */ + ["\u7179", "\u7179"], /* CJK Ideograph */ + ["\u717A", "\u717A"], /* CJK Ideograph */ + ["\u717B", "\u717B"], /* CJK Ideograph */ + ["\u717C", "\u717C"], /* CJK Ideograph */ + ["\u717D", "\u717D"], /* CJK Ideograph */ + ["\u717E", "\u717E"], /* CJK Ideograph */ + ["\u717F", "\u717F"], /* CJK Ideograph */ + ["\u7180", "\u7180"], /* CJK Ideograph */ + ["\u7181", "\u7181"], /* CJK Ideograph */ + ["\u7182", "\u7182"], /* CJK Ideograph */ + ["\u7183", "\u7183"], /* CJK Ideograph */ + ["\u7184", "\u7184"], /* CJK Ideograph */ + ["\u7185", "\u7185"], /* CJK Ideograph */ + ["\u7186", "\u7186"], /* CJK Ideograph */ + ["\u7187", "\u7187"], /* CJK Ideograph */ + ["\u7188", "\u7188"], /* CJK Ideograph */ + ["\u7189", "\u7189"], /* CJK Ideograph */ + ["\u718A", "\u718A"], /* CJK Ideograph */ + ["\u718B", "\u718B"], /* CJK Ideograph */ + ["\u718C", "\u718C"], /* CJK Ideograph */ + ["\u718D", "\u718D"], /* CJK Ideograph */ + ["\u718E", "\u718E"], /* CJK Ideograph */ + ["\u718F", "\u718F"], /* CJK Ideograph */ + ["\u7190", "\u7190"], /* CJK Ideograph */ + ["\u7191", "\u7191"], /* CJK Ideograph */ + ["\u7192", "\u7192"], /* CJK Ideograph */ + ["\u7193", "\u7193"], /* CJK Ideograph */ + ["\u7194", "\u7194"], /* CJK Ideograph */ + ["\u7195", "\u7195"], /* CJK Ideograph */ + ["\u7196", "\u7196"], /* CJK Ideograph */ + ["\u7197", "\u7197"], /* CJK Ideograph */ + ["\u7198", "\u7198"], /* CJK Ideograph */ + ["\u7199", "\u7199"], /* CJK Ideograph */ + ["\u719A", "\u719A"], /* CJK Ideograph */ + ["\u719B", "\u719B"], /* CJK Ideograph */ + ["\u719C", "\u719C"], /* CJK Ideograph */ + ["\u719D", "\u719D"], /* CJK Ideograph */ + ["\u719E", "\u719E"], /* CJK Ideograph */ + ["\u719F", "\u719F"], /* CJK Ideograph */ + ["\u71A0", "\u71A0"], /* CJK Ideograph */ + ["\u71A1", "\u71A1"], /* CJK Ideograph */ + ["\u71A2", "\u71A2"], /* CJK Ideograph */ + ["\u71A3", "\u71A3"], /* CJK Ideograph */ + ["\u71A4", "\u71A4"], /* CJK Ideograph */ + ["\u71A5", "\u71A5"], /* CJK Ideograph */ + ["\u71A6", "\u71A6"], /* CJK Ideograph */ + ["\u71A7", "\u71A7"], /* CJK Ideograph */ + ["\u71A8", "\u71A8"], /* CJK Ideograph */ + ["\u71A9", "\u71A9"], /* CJK Ideograph */ + ["\u71AA", "\u71AA"], /* CJK Ideograph */ + ["\u71AB", "\u71AB"], /* CJK Ideograph */ + ["\u71AC", "\u71AC"], /* CJK Ideograph */ + ["\u71AD", "\u71AD"], /* CJK Ideograph */ + ["\u71AE", "\u71AE"], /* CJK Ideograph */ + ["\u71AF", "\u71AF"], /* CJK Ideograph */ + ["\u71B0", "\u71B0"], /* CJK Ideograph */ + ["\u71B1", "\u71B1"], /* CJK Ideograph */ + ["\u71B2", "\u71B2"], /* CJK Ideograph */ + ["\u71B3", "\u71B3"], /* CJK Ideograph */ + ["\u71B4", "\u71B4"], /* CJK Ideograph */ + ["\u71B5", "\u71B5"], /* CJK Ideograph */ + ["\u71B6", "\u71B6"], /* CJK Ideograph */ + ["\u71B7", "\u71B7"], /* CJK Ideograph */ + ["\u71B8", "\u71B8"], /* CJK Ideograph */ + ["\u71B9", "\u71B9"], /* CJK Ideograph */ + ["\u71BA", "\u71BA"], /* CJK Ideograph */ + ["\u71BB", "\u71BB"], /* CJK Ideograph */ + ["\u71BC", "\u71BC"], /* CJK Ideograph */ + ["\u71BD", "\u71BD"], /* CJK Ideograph */ + ["\u71BE", "\u71BE"], /* CJK Ideograph */ + ["\u71BF", "\u71BF"], /* CJK Ideograph */ + ["\u71C0", "\u71C0"], /* CJK Ideograph */ + ["\u71C1", "\u71C1"], /* CJK Ideograph */ + ["\u71C2", "\u71C2"], /* CJK Ideograph */ + ["\u71C3", "\u71C3"], /* CJK Ideograph */ + ["\u71C4", "\u71C4"], /* CJK Ideograph */ + ["\u71C5", "\u71C5"], /* CJK Ideograph */ + ["\u71C6", "\u71C6"], /* CJK Ideograph */ + ["\u71C7", "\u71C7"], /* CJK Ideograph */ + ["\u71C8", "\u71C8"], /* CJK Ideograph */ + ["\u71C9", "\u71C9"], /* CJK Ideograph */ + ["\u71CA", "\u71CA"], /* CJK Ideograph */ + ["\u71CB", "\u71CB"], /* CJK Ideograph */ + ["\u71CC", "\u71CC"], /* CJK Ideograph */ + ["\u71CD", "\u71CD"], /* CJK Ideograph */ + ["\u71CE", "\u71CE"], /* CJK Ideograph */ + ["\u71CF", "\u71CF"], /* CJK Ideograph */ + ["\u71D0", "\u71D0"], /* CJK Ideograph */ + ["\u71D1", "\u71D1"], /* CJK Ideograph */ + ["\u71D2", "\u71D2"], /* CJK Ideograph */ + ["\u71D3", "\u71D3"], /* CJK Ideograph */ + ["\u71D4", "\u71D4"], /* CJK Ideograph */ + ["\u71D5", "\u71D5"], /* CJK Ideograph */ + ["\u71D6", "\u71D6"], /* CJK Ideograph */ + ["\u71D7", "\u71D7"], /* CJK Ideograph */ + ["\u71D8", "\u71D8"], /* CJK Ideograph */ + ["\u71D9", "\u71D9"], /* CJK Ideograph */ + ["\u71DA", "\u71DA"], /* CJK Ideograph */ + ["\u71DB", "\u71DB"], /* CJK Ideograph */ + ["\u71DC", "\u71DC"], /* CJK Ideograph */ + ["\u71DD", "\u71DD"], /* CJK Ideograph */ + ["\u71DE", "\u71DE"], /* CJK Ideograph */ + ["\u71DF", "\u71DF"], /* CJK Ideograph */ + ["\u71E0", "\u71E0"], /* CJK Ideograph */ + ["\u71E1", "\u71E1"], /* CJK Ideograph */ + ["\u71E2", "\u71E2"], /* CJK Ideograph */ + ["\u71E3", "\u71E3"], /* CJK Ideograph */ + ["\u71E4", "\u71E4"], /* CJK Ideograph */ + ["\u71E5", "\u71E5"], /* CJK Ideograph */ + ["\u71E6", "\u71E6"], /* CJK Ideograph */ + ["\u71E7", "\u71E7"], /* CJK Ideograph */ + ["\u71E8", "\u71E8"], /* CJK Ideograph */ + ["\u71E9", "\u71E9"], /* CJK Ideograph */ + ["\u71EA", "\u71EA"], /* CJK Ideograph */ + ["\u71EB", "\u71EB"], /* CJK Ideograph */ + ["\u71EC", "\u71EC"], /* CJK Ideograph */ + ["\u71ED", "\u71ED"], /* CJK Ideograph */ + ["\u71EE", "\u71EE"], /* CJK Ideograph */ + ["\u71EF", "\u71EF"], /* CJK Ideograph */ + ["\u71F0", "\u71F0"], /* CJK Ideograph */ + ["\u71F1", "\u71F1"], /* CJK Ideograph */ + ["\u71F2", "\u71F2"], /* CJK Ideograph */ + ["\u71F3", "\u71F3"], /* CJK Ideograph */ + ["\u71F4", "\u71F4"], /* CJK Ideograph */ + ["\u71F5", "\u71F5"], /* CJK Ideograph */ + ["\u71F6", "\u71F6"], /* CJK Ideograph */ + ["\u71F7", "\u71F7"], /* CJK Ideograph */ + ["\u71F8", "\u71F8"], /* CJK Ideograph */ + ["\u71F9", "\u71F9"], /* CJK Ideograph */ + ["\u71FA", "\u71FA"], /* CJK Ideograph */ + ["\u71FB", "\u71FB"], /* CJK Ideograph */ + ["\u71FC", "\u71FC"], /* CJK Ideograph */ + ["\u71FD", "\u71FD"], /* CJK Ideograph */ + ["\u71FE", "\u71FE"], /* CJK Ideograph */ + ["\u71FF", "\u71FF"], /* CJK Ideograph */ + ["\u7200", "\u7200"], /* CJK Ideograph */ + ["\u7201", "\u7201"], /* CJK Ideograph */ + ["\u7202", "\u7202"], /* CJK Ideograph */ + ["\u7203", "\u7203"], /* CJK Ideograph */ + ["\u7204", "\u7204"], /* CJK Ideograph */ + ["\u7205", "\u7205"], /* CJK Ideograph */ + ["\u7206", "\u7206"], /* CJK Ideograph */ + ["\u7207", "\u7207"], /* CJK Ideograph */ + ["\u7208", "\u7208"], /* CJK Ideograph */ + ["\u7209", "\u7209"], /* CJK Ideograph */ + ["\u720A", "\u720A"], /* CJK Ideograph */ + ["\u720B", "\u720B"], /* CJK Ideograph */ + ["\u720C", "\u720C"], /* CJK Ideograph */ + ["\u720D", "\u720D"], /* CJK Ideograph */ + ["\u720E", "\u720E"], /* CJK Ideograph */ + ["\u720F", "\u720F"], /* CJK Ideograph */ + ["\u7210", "\u7210"], /* CJK Ideograph */ + ["\u7211", "\u7211"], /* CJK Ideograph */ + ["\u7212", "\u7212"], /* CJK Ideograph */ + ["\u7213", "\u7213"], /* CJK Ideograph */ + ["\u7214", "\u7214"], /* CJK Ideograph */ + ["\u7215", "\u7215"], /* CJK Ideograph */ + ["\u7216", "\u7216"], /* CJK Ideograph */ + ["\u7217", "\u7217"], /* CJK Ideograph */ + ["\u7218", "\u7218"], /* CJK Ideograph */ + ["\u7219", "\u7219"], /* CJK Ideograph */ + ["\u721A", "\u721A"], /* CJK Ideograph */ + ["\u721B", "\u721B"], /* CJK Ideograph */ + ["\u721C", "\u721C"], /* CJK Ideograph */ + ["\u721D", "\u721D"], /* CJK Ideograph */ + ["\u721E", "\u721E"], /* CJK Ideograph */ + ["\u721F", "\u721F"], /* CJK Ideograph */ + ["\u7220", "\u7220"], /* CJK Ideograph */ + ["\u7221", "\u7221"], /* CJK Ideograph */ + ["\u7222", "\u7222"], /* CJK Ideograph */ + ["\u7223", "\u7223"], /* CJK Ideograph */ + ["\u7224", "\u7224"], /* CJK Ideograph */ + ["\u7225", "\u7225"], /* CJK Ideograph */ + ["\u7226", "\u7226"], /* CJK Ideograph */ + ["\u7227", "\u7227"], /* CJK Ideograph */ + ["\u7228", "\u7228"], /* CJK Ideograph */ + ["\u7229", "\u7229"], /* CJK Ideograph */ + ["\u722A", "\u722A"], /* CJK Ideograph */ + ["\u722B", "\u722B"], /* CJK Ideograph */ + ["\u722C", "\u722C"], /* CJK Ideograph */ + ["\u722D", "\u722D"], /* CJK Ideograph */ + ["\u722E", "\u722E"], /* CJK Ideograph */ + ["\u722F", "\u722F"], /* CJK Ideograph */ + ["\u7230", "\u7230"], /* CJK Ideograph */ + ["\u7231", "\u7231"], /* CJK Ideograph */ + ["\u7232", "\u7232"], /* CJK Ideograph */ + ["\u7233", "\u7233"], /* CJK Ideograph */ + ["\u7234", "\u7234"], /* CJK Ideograph */ + ["\u7235", "\u7235"], /* CJK Ideograph */ + ["\u7236", "\u7236"], /* CJK Ideograph */ + ["\u7237", "\u7237"], /* CJK Ideograph */ + ["\u7238", "\u7238"], /* CJK Ideograph */ + ["\u7239", "\u7239"], /* CJK Ideograph */ + ["\u723A", "\u723A"], /* CJK Ideograph */ + ["\u723B", "\u723B"], /* CJK Ideograph */ + ["\u723C", "\u723C"], /* CJK Ideograph */ + ["\u723D", "\u723D"], /* CJK Ideograph */ + ["\u723E", "\u723E"], /* CJK Ideograph */ + ["\u723F", "\u723F"], /* CJK Ideograph */ + ["\u7240", "\u7240"], /* CJK Ideograph */ + ["\u7241", "\u7241"], /* CJK Ideograph */ + ["\u7242", "\u7242"], /* CJK Ideograph */ + ["\u7243", "\u7243"], /* CJK Ideograph */ + ["\u7244", "\u7244"], /* CJK Ideograph */ + ["\u7245", "\u7245"], /* CJK Ideograph */ + ["\u7246", "\u7246"], /* CJK Ideograph */ + ["\u7247", "\u7247"], /* CJK Ideograph */ + ["\u7248", "\u7248"], /* CJK Ideograph */ + ["\u7249", "\u7249"], /* CJK Ideograph */ + ["\u724A", "\u724A"], /* CJK Ideograph */ + ["\u724B", "\u724B"], /* CJK Ideograph */ + ["\u724C", "\u724C"], /* CJK Ideograph */ + ["\u724D", "\u724D"], /* CJK Ideograph */ + ["\u724E", "\u724E"], /* CJK Ideograph */ + ["\u724F", "\u724F"], /* CJK Ideograph */ + ["\u7250", "\u7250"], /* CJK Ideograph */ + ["\u7251", "\u7251"], /* CJK Ideograph */ + ["\u7252", "\u7252"], /* CJK Ideograph */ + ["\u7253", "\u7253"], /* CJK Ideograph */ + ["\u7254", "\u7254"], /* CJK Ideograph */ + ["\u7255", "\u7255"], /* CJK Ideograph */ + ["\u7256", "\u7256"], /* CJK Ideograph */ + ["\u7257", "\u7257"], /* CJK Ideograph */ + ["\u7258", "\u7258"], /* CJK Ideograph */ + ["\u7259", "\u7259"], /* CJK Ideograph */ + ["\u725A", "\u725A"], /* CJK Ideograph */ + ["\u725B", "\u725B"], /* CJK Ideograph */ + ["\u725C", "\u725C"], /* CJK Ideograph */ + ["\u725D", "\u725D"], /* CJK Ideograph */ + ["\u725E", "\u725E"], /* CJK Ideograph */ + ["\u725F", "\u725F"], /* CJK Ideograph */ + ["\u7260", "\u7260"], /* CJK Ideograph */ + ["\u7261", "\u7261"], /* CJK Ideograph */ + ["\u7262", "\u7262"], /* CJK Ideograph */ + ["\u7263", "\u7263"], /* CJK Ideograph */ + ["\u7264", "\u7264"], /* CJK Ideograph */ + ["\u7265", "\u7265"], /* CJK Ideograph */ + ["\u7266", "\u7266"], /* CJK Ideograph */ + ["\u7267", "\u7267"], /* CJK Ideograph */ + ["\u7268", "\u7268"], /* CJK Ideograph */ + ["\u7269", "\u7269"], /* CJK Ideograph */ + ["\u726A", "\u726A"], /* CJK Ideograph */ + ["\u726B", "\u726B"], /* CJK Ideograph */ + ["\u726C", "\u726C"], /* CJK Ideograph */ + ["\u726D", "\u726D"], /* CJK Ideograph */ + ["\u726E", "\u726E"], /* CJK Ideograph */ + ["\u726F", "\u726F"], /* CJK Ideograph */ + ["\u7270", "\u7270"], /* CJK Ideograph */ + ["\u7271", "\u7271"], /* CJK Ideograph */ + ["\u7272", "\u7272"], /* CJK Ideograph */ + ["\u7273", "\u7273"], /* CJK Ideograph */ + ["\u7274", "\u7274"], /* CJK Ideograph */ + ["\u7275", "\u7275"], /* CJK Ideograph */ + ["\u7276", "\u7276"], /* CJK Ideograph */ + ["\u7277", "\u7277"], /* CJK Ideograph */ + ["\u7278", "\u7278"], /* CJK Ideograph */ + ["\u7279", "\u7279"], /* CJK Ideograph */ + ["\u727A", "\u727A"], /* CJK Ideograph */ + ["\u727B", "\u727B"], /* CJK Ideograph */ + ["\u727C", "\u727C"], /* CJK Ideograph */ + ["\u727D", "\u727D"], /* CJK Ideograph */ + ["\u727E", "\u727E"], /* CJK Ideograph */ + ["\u727F", "\u727F"], /* CJK Ideograph */ + ["\u7280", "\u7280"], /* CJK Ideograph */ + ["\u7281", "\u7281"], /* CJK Ideograph */ + ["\u7282", "\u7282"], /* CJK Ideograph */ + ["\u7283", "\u7283"], /* CJK Ideograph */ + ["\u7284", "\u7284"], /* CJK Ideograph */ + ["\u7285", "\u7285"], /* CJK Ideograph */ + ["\u7286", "\u7286"], /* CJK Ideograph */ + ["\u7287", "\u7287"], /* CJK Ideograph */ + ["\u7288", "\u7288"], /* CJK Ideograph */ + ["\u7289", "\u7289"], /* CJK Ideograph */ + ["\u728A", "\u728A"], /* CJK Ideograph */ + ["\u728B", "\u728B"], /* CJK Ideograph */ + ["\u728C", "\u728C"], /* CJK Ideograph */ + ["\u728D", "\u728D"], /* CJK Ideograph */ + ["\u728E", "\u728E"], /* CJK Ideograph */ + ["\u728F", "\u728F"], /* CJK Ideograph */ + ["\u7290", "\u7290"], /* CJK Ideograph */ + ["\u7291", "\u7291"], /* CJK Ideograph */ + ["\u7292", "\u7292"], /* CJK Ideograph */ + ["\u7293", "\u7293"], /* CJK Ideograph */ + ["\u7294", "\u7294"], /* CJK Ideograph */ + ["\u7295", "\u7295"], /* CJK Ideograph */ + ["\u7296", "\u7296"], /* CJK Ideograph */ + ["\u7297", "\u7297"], /* CJK Ideograph */ + ["\u7298", "\u7298"], /* CJK Ideograph */ + ["\u7299", "\u7299"], /* CJK Ideograph */ + ["\u729A", "\u729A"], /* CJK Ideograph */ + ["\u729B", "\u729B"], /* CJK Ideograph */ + ["\u729C", "\u729C"], /* CJK Ideograph */ + ["\u729D", "\u729D"], /* CJK Ideograph */ + ["\u729E", "\u729E"], /* CJK Ideograph */ + ["\u729F", "\u729F"], /* CJK Ideograph */ + ["\u72A0", "\u72A0"], /* CJK Ideograph */ + ["\u72A1", "\u72A1"], /* CJK Ideograph */ + ["\u72A2", "\u72A2"], /* CJK Ideograph */ + ["\u72A3", "\u72A3"], /* CJK Ideograph */ + ["\u72A4", "\u72A4"], /* CJK Ideograph */ + ["\u72A5", "\u72A5"], /* CJK Ideograph */ + ["\u72A6", "\u72A6"], /* CJK Ideograph */ + ["\u72A7", "\u72A7"], /* CJK Ideograph */ + ["\u72A8", "\u72A8"], /* CJK Ideograph */ + ["\u72A9", "\u72A9"], /* CJK Ideograph */ + ["\u72AA", "\u72AA"], /* CJK Ideograph */ + ["\u72AB", "\u72AB"], /* CJK Ideograph */ + ["\u72AC", "\u72AC"], /* CJK Ideograph */ + ["\u72AD", "\u72AD"], /* CJK Ideograph */ + ["\u72AE", "\u72AE"], /* CJK Ideograph */ + ["\u72AF", "\u72AF"], /* CJK Ideograph */ + ["\u72B0", "\u72B0"], /* CJK Ideograph */ + ["\u72B1", "\u72B1"], /* CJK Ideograph */ + ["\u72B2", "\u72B2"], /* CJK Ideograph */ + ["\u72B3", "\u72B3"], /* CJK Ideograph */ + ["\u72B4", "\u72B4"], /* CJK Ideograph */ + ["\u72B5", "\u72B5"], /* CJK Ideograph */ + ["\u72B6", "\u72B6"], /* CJK Ideograph */ + ["\u72B7", "\u72B7"], /* CJK Ideograph */ + ["\u72B8", "\u72B8"], /* CJK Ideograph */ + ["\u72B9", "\u72B9"], /* CJK Ideograph */ + ["\u72BA", "\u72BA"], /* CJK Ideograph */ + ["\u72BB", "\u72BB"], /* CJK Ideograph */ + ["\u72BC", "\u72BC"], /* CJK Ideograph */ + ["\u72BD", "\u72BD"], /* CJK Ideograph */ + ["\u72BE", "\u72BE"], /* CJK Ideograph */ + ["\u72BF", "\u72BF"], /* CJK Ideograph */ + ["\u72C0", "\u72C0"], /* CJK Ideograph */ + ["\u72C1", "\u72C1"], /* CJK Ideograph */ + ["\u72C2", "\u72C2"], /* CJK Ideograph */ + ["\u72C3", "\u72C3"], /* CJK Ideograph */ + ["\u72C4", "\u72C4"], /* CJK Ideograph */ + ["\u72C5", "\u72C5"], /* CJK Ideograph */ + ["\u72C6", "\u72C6"], /* CJK Ideograph */ + ["\u72C7", "\u72C7"], /* CJK Ideograph */ + ["\u72C8", "\u72C8"], /* CJK Ideograph */ + ["\u72C9", "\u72C9"], /* CJK Ideograph */ + ["\u72CA", "\u72CA"], /* CJK Ideograph */ + ["\u72CB", "\u72CB"], /* CJK Ideograph */ + ["\u72CC", "\u72CC"], /* CJK Ideograph */ + ["\u72CD", "\u72CD"], /* CJK Ideograph */ + ["\u72CE", "\u72CE"], /* CJK Ideograph */ + ["\u72CF", "\u72CF"], /* CJK Ideograph */ + ["\u72D0", "\u72D0"], /* CJK Ideograph */ + ["\u72D1", "\u72D1"], /* CJK Ideograph */ + ["\u72D2", "\u72D2"], /* CJK Ideograph */ + ["\u72D3", "\u72D3"], /* CJK Ideograph */ + ["\u72D4", "\u72D4"], /* CJK Ideograph */ + ["\u72D5", "\u72D5"], /* CJK Ideograph */ + ["\u72D6", "\u72D6"], /* CJK Ideograph */ + ["\u72D7", "\u72D7"], /* CJK Ideograph */ + ["\u72D8", "\u72D8"], /* CJK Ideograph */ + ["\u72D9", "\u72D9"], /* CJK Ideograph */ + ["\u72DA", "\u72DA"], /* CJK Ideograph */ + ["\u72DB", "\u72DB"], /* CJK Ideograph */ + ["\u72DC", "\u72DC"], /* CJK Ideograph */ + ["\u72DD", "\u72DD"], /* CJK Ideograph */ + ["\u72DE", "\u72DE"], /* CJK Ideograph */ + ["\u72DF", "\u72DF"], /* CJK Ideograph */ + ["\u72E0", "\u72E0"], /* CJK Ideograph */ + ["\u72E1", "\u72E1"], /* CJK Ideograph */ + ["\u72E2", "\u72E2"], /* CJK Ideograph */ + ["\u72E3", "\u72E3"], /* CJK Ideograph */ + ["\u72E4", "\u72E4"], /* CJK Ideograph */ + ["\u72E5", "\u72E5"], /* CJK Ideograph */ + ["\u72E6", "\u72E6"], /* CJK Ideograph */ + ["\u72E7", "\u72E7"], /* CJK Ideograph */ + ["\u72E8", "\u72E8"], /* CJK Ideograph */ + ["\u72E9", "\u72E9"], /* CJK Ideograph */ + ["\u72EA", "\u72EA"], /* CJK Ideograph */ + ["\u72EB", "\u72EB"], /* CJK Ideograph */ + ["\u72EC", "\u72EC"], /* CJK Ideograph */ + ["\u72ED", "\u72ED"], /* CJK Ideograph */ + ["\u72EE", "\u72EE"], /* CJK Ideograph */ + ["\u72EF", "\u72EF"], /* CJK Ideograph */ + ["\u72F0", "\u72F0"], /* CJK Ideograph */ + ["\u72F1", "\u72F1"], /* CJK Ideograph */ + ["\u72F2", "\u72F2"], /* CJK Ideograph */ + ["\u72F3", "\u72F3"], /* CJK Ideograph */ + ["\u72F4", "\u72F4"], /* CJK Ideograph */ + ["\u72F5", "\u72F5"], /* CJK Ideograph */ + ["\u72F6", "\u72F6"], /* CJK Ideograph */ + ["\u72F7", "\u72F7"], /* CJK Ideograph */ + ["\u72F8", "\u72F8"], /* CJK Ideograph */ + ["\u72F9", "\u72F9"], /* CJK Ideograph */ + ["\u72FA", "\u72FA"], /* CJK Ideograph */ + ["\u72FB", "\u72FB"], /* CJK Ideograph */ + ["\u72FC", "\u72FC"], /* CJK Ideograph */ + ["\u72FD", "\u72FD"], /* CJK Ideograph */ + ["\u72FE", "\u72FE"], /* CJK Ideograph */ + ["\u72FF", "\u72FF"], /* CJK Ideograph */ + ["\u7300", "\u7300"], /* CJK Ideograph */ + ["\u7301", "\u7301"], /* CJK Ideograph */ + ["\u7302", "\u7302"], /* CJK Ideograph */ + ["\u7303", "\u7303"], /* CJK Ideograph */ + ["\u7304", "\u7304"], /* CJK Ideograph */ + ["\u7305", "\u7305"], /* CJK Ideograph */ + ["\u7306", "\u7306"], /* CJK Ideograph */ + ["\u7307", "\u7307"], /* CJK Ideograph */ + ["\u7308", "\u7308"], /* CJK Ideograph */ + ["\u7309", "\u7309"], /* CJK Ideograph */ + ["\u730A", "\u730A"], /* CJK Ideograph */ + ["\u730B", "\u730B"], /* CJK Ideograph */ + ["\u730C", "\u730C"], /* CJK Ideograph */ + ["\u730D", "\u730D"], /* CJK Ideograph */ + ["\u730E", "\u730E"], /* CJK Ideograph */ + ["\u730F", "\u730F"], /* CJK Ideograph */ + ["\u7310", "\u7310"], /* CJK Ideograph */ + ["\u7311", "\u7311"], /* CJK Ideograph */ + ["\u7312", "\u7312"], /* CJK Ideograph */ + ["\u7313", "\u7313"], /* CJK Ideograph */ + ["\u7314", "\u7314"], /* CJK Ideograph */ + ["\u7315", "\u7315"], /* CJK Ideograph */ + ["\u7316", "\u7316"], /* CJK Ideograph */ + ["\u7317", "\u7317"], /* CJK Ideograph */ + ["\u7318", "\u7318"], /* CJK Ideograph */ + ["\u7319", "\u7319"], /* CJK Ideograph */ + ["\u731A", "\u731A"], /* CJK Ideograph */ + ["\u731B", "\u731B"], /* CJK Ideograph */ + ["\u731C", "\u731C"], /* CJK Ideograph */ + ["\u731D", "\u731D"], /* CJK Ideograph */ + ["\u731E", "\u731E"], /* CJK Ideograph */ + ["\u731F", "\u731F"], /* CJK Ideograph */ + ["\u7320", "\u7320"], /* CJK Ideograph */ + ["\u7321", "\u7321"], /* CJK Ideograph */ + ["\u7322", "\u7322"], /* CJK Ideograph */ + ["\u7323", "\u7323"], /* CJK Ideograph */ + ["\u7324", "\u7324"], /* CJK Ideograph */ + ["\u7325", "\u7325"], /* CJK Ideograph */ + ["\u7326", "\u7326"], /* CJK Ideograph */ + ["\u7327", "\u7327"], /* CJK Ideograph */ + ["\u7328", "\u7328"], /* CJK Ideograph */ + ["\u7329", "\u7329"], /* CJK Ideograph */ + ["\u732A", "\u732A"], /* CJK Ideograph */ + ["\u732B", "\u732B"], /* CJK Ideograph */ + ["\u732C", "\u732C"], /* CJK Ideograph */ + ["\u732D", "\u732D"], /* CJK Ideograph */ + ["\u732E", "\u732E"], /* CJK Ideograph */ + ["\u732F", "\u732F"], /* CJK Ideograph */ + ["\u7330", "\u7330"], /* CJK Ideograph */ + ["\u7331", "\u7331"], /* CJK Ideograph */ + ["\u7332", "\u7332"], /* CJK Ideograph */ + ["\u7333", "\u7333"], /* CJK Ideograph */ + ["\u7334", "\u7334"], /* CJK Ideograph */ + ["\u7335", "\u7335"], /* CJK Ideograph */ + ["\u7336", "\u7336"], /* CJK Ideograph */ + ["\u7337", "\u7337"], /* CJK Ideograph */ + ["\u7338", "\u7338"], /* CJK Ideograph */ + ["\u7339", "\u7339"], /* CJK Ideograph */ + ["\u733A", "\u733A"], /* CJK Ideograph */ + ["\u733B", "\u733B"], /* CJK Ideograph */ + ["\u733C", "\u733C"], /* CJK Ideograph */ + ["\u733D", "\u733D"], /* CJK Ideograph */ + ["\u733E", "\u733E"], /* CJK Ideograph */ + ["\u733F", "\u733F"], /* CJK Ideograph */ + ["\u7340", "\u7340"], /* CJK Ideograph */ + ["\u7341", "\u7341"], /* CJK Ideograph */ + ["\u7342", "\u7342"], /* CJK Ideograph */ + ["\u7343", "\u7343"], /* CJK Ideograph */ + ["\u7344", "\u7344"], /* CJK Ideograph */ + ["\u7345", "\u7345"], /* CJK Ideograph */ + ["\u7346", "\u7346"], /* CJK Ideograph */ + ["\u7347", "\u7347"], /* CJK Ideograph */ + ["\u7348", "\u7348"], /* CJK Ideograph */ + ["\u7349", "\u7349"], /* CJK Ideograph */ + ["\u734A", "\u734A"], /* CJK Ideograph */ + ["\u734B", "\u734B"], /* CJK Ideograph */ + ["\u734C", "\u734C"], /* CJK Ideograph */ + ["\u734D", "\u734D"], /* CJK Ideograph */ + ["\u734E", "\u734E"], /* CJK Ideograph */ + ["\u734F", "\u734F"], /* CJK Ideograph */ + ["\u7350", "\u7350"], /* CJK Ideograph */ + ["\u7351", "\u7351"], /* CJK Ideograph */ + ["\u7352", "\u7352"], /* CJK Ideograph */ + ["\u7353", "\u7353"], /* CJK Ideograph */ + ["\u7354", "\u7354"], /* CJK Ideograph */ + ["\u7355", "\u7355"], /* CJK Ideograph */ + ["\u7356", "\u7356"], /* CJK Ideograph */ + ["\u7357", "\u7357"], /* CJK Ideograph */ + ["\u7358", "\u7358"], /* CJK Ideograph */ + ["\u7359", "\u7359"], /* CJK Ideograph */ + ["\u735A", "\u735A"], /* CJK Ideograph */ + ["\u735B", "\u735B"], /* CJK Ideograph */ + ["\u735C", "\u735C"], /* CJK Ideograph */ + ["\u735D", "\u735D"], /* CJK Ideograph */ + ["\u735E", "\u735E"], /* CJK Ideograph */ + ["\u735F", "\u735F"], /* CJK Ideograph */ + ["\u7360", "\u7360"], /* CJK Ideograph */ + ["\u7361", "\u7361"], /* CJK Ideograph */ + ["\u7362", "\u7362"], /* CJK Ideograph */ + ["\u7363", "\u7363"], /* CJK Ideograph */ + ["\u7364", "\u7364"], /* CJK Ideograph */ + ["\u7365", "\u7365"], /* CJK Ideograph */ + ["\u7366", "\u7366"], /* CJK Ideograph */ + ["\u7367", "\u7367"], /* CJK Ideograph */ + ["\u7368", "\u7368"], /* CJK Ideograph */ + ["\u7369", "\u7369"], /* CJK Ideograph */ + ["\u736A", "\u736A"], /* CJK Ideograph */ + ["\u736B", "\u736B"], /* CJK Ideograph */ + ["\u736C", "\u736C"], /* CJK Ideograph */ + ["\u736D", "\u736D"], /* CJK Ideograph */ + ["\u736E", "\u736E"], /* CJK Ideograph */ + ["\u736F", "\u736F"], /* CJK Ideograph */ + ["\u7370", "\u7370"], /* CJK Ideograph */ + ["\u7371", "\u7371"], /* CJK Ideograph */ + ["\u7372", "\u7372"], /* CJK Ideograph */ + ["\u7373", "\u7373"], /* CJK Ideograph */ + ["\u7374", "\u7374"], /* CJK Ideograph */ + ["\u7375", "\u7375"], /* CJK Ideograph */ + ["\u7376", "\u7376"], /* CJK Ideograph */ + ["\u7377", "\u7377"], /* CJK Ideograph */ + ["\u7378", "\u7378"], /* CJK Ideograph */ + ["\u7379", "\u7379"], /* CJK Ideograph */ + ["\u737A", "\u737A"], /* CJK Ideograph */ + ["\u737B", "\u737B"], /* CJK Ideograph */ + ["\u737C", "\u737C"], /* CJK Ideograph */ + ["\u737D", "\u737D"], /* CJK Ideograph */ + ["\u737E", "\u737E"], /* CJK Ideograph */ + ["\u737F", "\u737F"], /* CJK Ideograph */ + ["\u7380", "\u7380"], /* CJK Ideograph */ + ["\u7381", "\u7381"], /* CJK Ideograph */ + ["\u7382", "\u7382"], /* CJK Ideograph */ + ["\u7383", "\u7383"], /* CJK Ideograph */ + ["\u7384", "\u7384"], /* CJK Ideograph */ + ["\u7385", "\u7385"], /* CJK Ideograph */ + ["\u7386", "\u7386"], /* CJK Ideograph */ + ["\u7387", "\u7387"], /* CJK Ideograph */ + ["\u7388", "\u7388"], /* CJK Ideograph */ + ["\u7389", "\u7389"], /* CJK Ideograph */ + ["\u738A", "\u738A"], /* CJK Ideograph */ + ["\u738B", "\u738B"], /* CJK Ideograph */ + ["\u738C", "\u738C"], /* CJK Ideograph */ + ["\u738D", "\u738D"], /* CJK Ideograph */ + ["\u738E", "\u738E"], /* CJK Ideograph */ + ["\u738F", "\u738F"], /* CJK Ideograph */ + ["\u7390", "\u7390"], /* CJK Ideograph */ + ["\u7391", "\u7391"], /* CJK Ideograph */ + ["\u7392", "\u7392"], /* CJK Ideograph */ + ["\u7393", "\u7393"], /* CJK Ideograph */ + ["\u7394", "\u7394"], /* CJK Ideograph */ + ["\u7395", "\u7395"], /* CJK Ideograph */ + ["\u7396", "\u7396"], /* CJK Ideograph */ + ["\u7397", "\u7397"], /* CJK Ideograph */ + ["\u7398", "\u7398"], /* CJK Ideograph */ + ["\u7399", "\u7399"], /* CJK Ideograph */ + ["\u739A", "\u739A"], /* CJK Ideograph */ + ["\u739B", "\u739B"], /* CJK Ideograph */ + ["\u739C", "\u739C"], /* CJK Ideograph */ + ["\u739D", "\u739D"], /* CJK Ideograph */ + ["\u739E", "\u739E"], /* CJK Ideograph */ + ["\u739F", "\u739F"], /* CJK Ideograph */ + ["\u73A0", "\u73A0"], /* CJK Ideograph */ + ["\u73A1", "\u73A1"], /* CJK Ideograph */ + ["\u73A2", "\u73A2"], /* CJK Ideograph */ + ["\u73A3", "\u73A3"], /* CJK Ideograph */ + ["\u73A4", "\u73A4"], /* CJK Ideograph */ + ["\u73A5", "\u73A5"], /* CJK Ideograph */ + ["\u73A6", "\u73A6"], /* CJK Ideograph */ + ["\u73A7", "\u73A7"], /* CJK Ideograph */ + ["\u73A8", "\u73A8"], /* CJK Ideograph */ + ["\u73A9", "\u73A9"], /* CJK Ideograph */ + ["\u73AA", "\u73AA"], /* CJK Ideograph */ + ["\u73AB", "\u73AB"], /* CJK Ideograph */ + ["\u73AC", "\u73AC"], /* CJK Ideograph */ + ["\u73AD", "\u73AD"], /* CJK Ideograph */ + ["\u73AE", "\u73AE"], /* CJK Ideograph */ + ["\u73AF", "\u73AF"], /* CJK Ideograph */ + ["\u73B0", "\u73B0"], /* CJK Ideograph */ + ["\u73B1", "\u73B1"], /* CJK Ideograph */ + ["\u73B2", "\u73B2"], /* CJK Ideograph */ + ["\u73B3", "\u73B3"], /* CJK Ideograph */ + ["\u73B4", "\u73B4"], /* CJK Ideograph */ + ["\u73B5", "\u73B5"], /* CJK Ideograph */ + ["\u73B6", "\u73B6"], /* CJK Ideograph */ + ["\u73B7", "\u73B7"], /* CJK Ideograph */ + ["\u73B8", "\u73B8"], /* CJK Ideograph */ + ["\u73B9", "\u73B9"], /* CJK Ideograph */ + ["\u73BA", "\u73BA"], /* CJK Ideograph */ + ["\u73BB", "\u73BB"], /* CJK Ideograph */ + ["\u73BC", "\u73BC"], /* CJK Ideograph */ + ["\u73BD", "\u73BD"], /* CJK Ideograph */ + ["\u73BE", "\u73BE"], /* CJK Ideograph */ + ["\u73BF", "\u73BF"], /* CJK Ideograph */ + ["\u73C0", "\u73C0"], /* CJK Ideograph */ + ["\u73C1", "\u73C1"], /* CJK Ideograph */ + ["\u73C2", "\u73C2"], /* CJK Ideograph */ + ["\u73C3", "\u73C3"], /* CJK Ideograph */ + ["\u73C4", "\u73C4"], /* CJK Ideograph */ + ["\u73C5", "\u73C5"], /* CJK Ideograph */ + ["\u73C6", "\u73C6"], /* CJK Ideograph */ + ["\u73C7", "\u73C7"], /* CJK Ideograph */ + ["\u73C8", "\u73C8"], /* CJK Ideograph */ + ["\u73C9", "\u73C9"], /* CJK Ideograph */ + ["\u73CA", "\u73CA"], /* CJK Ideograph */ + ["\u73CB", "\u73CB"], /* CJK Ideograph */ + ["\u73CC", "\u73CC"], /* CJK Ideograph */ + ["\u73CD", "\u73CD"], /* CJK Ideograph */ + ["\u73CE", "\u73CE"], /* CJK Ideograph */ + ["\u73CF", "\u73CF"], /* CJK Ideograph */ + ["\u73D0", "\u73D0"], /* CJK Ideograph */ + ["\u73D1", "\u73D1"], /* CJK Ideograph */ + ["\u73D2", "\u73D2"], /* CJK Ideograph */ + ["\u73D3", "\u73D3"], /* CJK Ideograph */ + ["\u73D4", "\u73D4"], /* CJK Ideograph */ + ["\u73D5", "\u73D5"], /* CJK Ideograph */ + ["\u73D6", "\u73D6"], /* CJK Ideograph */ + ["\u73D7", "\u73D7"], /* CJK Ideograph */ + ["\u73D8", "\u73D8"], /* CJK Ideograph */ + ["\u73D9", "\u73D9"], /* CJK Ideograph */ + ["\u73DA", "\u73DA"], /* CJK Ideograph */ + ["\u73DB", "\u73DB"], /* CJK Ideograph */ + ["\u73DC", "\u73DC"], /* CJK Ideograph */ + ["\u73DD", "\u73DD"], /* CJK Ideograph */ + ["\u73DE", "\u73DE"], /* CJK Ideograph */ + ["\u73DF", "\u73DF"], /* CJK Ideograph */ + ["\u73E0", "\u73E0"], /* CJK Ideograph */ + ["\u73E1", "\u73E1"], /* CJK Ideograph */ + ["\u73E2", "\u73E2"], /* CJK Ideograph */ + ["\u73E3", "\u73E3"], /* CJK Ideograph */ + ["\u73E4", "\u73E4"], /* CJK Ideograph */ + ["\u73E5", "\u73E5"], /* CJK Ideograph */ + ["\u73E6", "\u73E6"], /* CJK Ideograph */ + ["\u73E7", "\u73E7"], /* CJK Ideograph */ + ["\u73E8", "\u73E8"], /* CJK Ideograph */ + ["\u73E9", "\u73E9"], /* CJK Ideograph */ + ["\u73EA", "\u73EA"], /* CJK Ideograph */ + ["\u73EB", "\u73EB"], /* CJK Ideograph */ + ["\u73EC", "\u73EC"], /* CJK Ideograph */ + ["\u73ED", "\u73ED"], /* CJK Ideograph */ + ["\u73EE", "\u73EE"], /* CJK Ideograph */ + ["\u73EF", "\u73EF"], /* CJK Ideograph */ + ["\u73F0", "\u73F0"], /* CJK Ideograph */ + ["\u73F1", "\u73F1"], /* CJK Ideograph */ + ["\u73F2", "\u73F2"], /* CJK Ideograph */ + ["\u73F3", "\u73F3"], /* CJK Ideograph */ + ["\u73F4", "\u73F4"], /* CJK Ideograph */ + ["\u73F5", "\u73F5"], /* CJK Ideograph */ + ["\u73F6", "\u73F6"], /* CJK Ideograph */ + ["\u73F7", "\u73F7"], /* CJK Ideograph */ + ["\u73F8", "\u73F8"], /* CJK Ideograph */ + ["\u73F9", "\u73F9"], /* CJK Ideograph */ + ["\u73FA", "\u73FA"], /* CJK Ideograph */ + ["\u73FB", "\u73FB"], /* CJK Ideograph */ + ["\u73FC", "\u73FC"], /* CJK Ideograph */ + ["\u73FD", "\u73FD"], /* CJK Ideograph */ + ["\u73FE", "\u73FE"], /* CJK Ideograph */ + ["\u73FF", "\u73FF"], /* CJK Ideograph */ + ["\u7400", "\u7400"], /* CJK Ideograph */ + ["\u7401", "\u7401"], /* CJK Ideograph */ + ["\u7402", "\u7402"], /* CJK Ideograph */ + ["\u7403", "\u7403"], /* CJK Ideograph */ + ["\u7404", "\u7404"], /* CJK Ideograph */ + ["\u7405", "\u7405"], /* CJK Ideograph */ + ["\u7406", "\u7406"], /* CJK Ideograph */ + ["\u7407", "\u7407"], /* CJK Ideograph */ + ["\u7408", "\u7408"], /* CJK Ideograph */ + ["\u7409", "\u7409"], /* CJK Ideograph */ + ["\u740A", "\u740A"], /* CJK Ideograph */ + ["\u740B", "\u740B"], /* CJK Ideograph */ + ["\u740C", "\u740C"], /* CJK Ideograph */ + ["\u740D", "\u740D"], /* CJK Ideograph */ + ["\u740E", "\u740E"], /* CJK Ideograph */ + ["\u740F", "\u740F"], /* CJK Ideograph */ + ["\u7410", "\u7410"], /* CJK Ideograph */ + ["\u7411", "\u7411"], /* CJK Ideograph */ + ["\u7412", "\u7412"], /* CJK Ideograph */ + ["\u7413", "\u7413"], /* CJK Ideograph */ + ["\u7414", "\u7414"], /* CJK Ideograph */ + ["\u7415", "\u7415"], /* CJK Ideograph */ + ["\u7416", "\u7416"], /* CJK Ideograph */ + ["\u7417", "\u7417"], /* CJK Ideograph */ + ["\u7418", "\u7418"], /* CJK Ideograph */ + ["\u7419", "\u7419"], /* CJK Ideograph */ + ["\u741A", "\u741A"], /* CJK Ideograph */ + ["\u741B", "\u741B"], /* CJK Ideograph */ + ["\u741C", "\u741C"], /* CJK Ideograph */ + ["\u741D", "\u741D"], /* CJK Ideograph */ + ["\u741E", "\u741E"], /* CJK Ideograph */ + ["\u741F", "\u741F"], /* CJK Ideograph */ + ["\u7420", "\u7420"], /* CJK Ideograph */ + ["\u7421", "\u7421"], /* CJK Ideograph */ + ["\u7422", "\u7422"], /* CJK Ideograph */ + ["\u7423", "\u7423"], /* CJK Ideograph */ + ["\u7424", "\u7424"], /* CJK Ideograph */ + ["\u7425", "\u7425"], /* CJK Ideograph */ + ["\u7426", "\u7426"], /* CJK Ideograph */ + ["\u7427", "\u7427"], /* CJK Ideograph */ + ["\u7428", "\u7428"], /* CJK Ideograph */ + ["\u7429", "\u7429"], /* CJK Ideograph */ + ["\u742A", "\u742A"], /* CJK Ideograph */ + ["\u742B", "\u742B"], /* CJK Ideograph */ + ["\u742C", "\u742C"], /* CJK Ideograph */ + ["\u742D", "\u742D"], /* CJK Ideograph */ + ["\u742E", "\u742E"], /* CJK Ideograph */ + ["\u742F", "\u742F"], /* CJK Ideograph */ + ["\u7430", "\u7430"], /* CJK Ideograph */ + ["\u7431", "\u7431"], /* CJK Ideograph */ + ["\u7432", "\u7432"], /* CJK Ideograph */ + ["\u7433", "\u7433"], /* CJK Ideograph */ + ["\u7434", "\u7434"], /* CJK Ideograph */ + ["\u7435", "\u7435"], /* CJK Ideograph */ + ["\u7436", "\u7436"], /* CJK Ideograph */ + ["\u7437", "\u7437"], /* CJK Ideograph */ + ["\u7438", "\u7438"], /* CJK Ideograph */ + ["\u7439", "\u7439"], /* CJK Ideograph */ + ["\u743A", "\u743A"], /* CJK Ideograph */ + ["\u743B", "\u743B"], /* CJK Ideograph */ + ["\u743C", "\u743C"], /* CJK Ideograph */ + ["\u743D", "\u743D"], /* CJK Ideograph */ + ["\u743E", "\u743E"], /* CJK Ideograph */ + ["\u743F", "\u743F"], /* CJK Ideograph */ + ["\u7440", "\u7440"], /* CJK Ideograph */ + ["\u7441", "\u7441"], /* CJK Ideograph */ + ["\u7442", "\u7442"], /* CJK Ideograph */ + ["\u7443", "\u7443"], /* CJK Ideograph */ + ["\u7444", "\u7444"], /* CJK Ideograph */ + ["\u7445", "\u7445"], /* CJK Ideograph */ + ["\u7446", "\u7446"], /* CJK Ideograph */ + ["\u7447", "\u7447"], /* CJK Ideograph */ + ["\u7448", "\u7448"], /* CJK Ideograph */ + ["\u7449", "\u7449"], /* CJK Ideograph */ + ["\u744A", "\u744A"], /* CJK Ideograph */ + ["\u744B", "\u744B"], /* CJK Ideograph */ + ["\u744C", "\u744C"], /* CJK Ideograph */ + ["\u744D", "\u744D"], /* CJK Ideograph */ + ["\u744E", "\u744E"], /* CJK Ideograph */ + ["\u744F", "\u744F"], /* CJK Ideograph */ + ["\u7450", "\u7450"], /* CJK Ideograph */ + ["\u7451", "\u7451"], /* CJK Ideograph */ + ["\u7452", "\u7452"], /* CJK Ideograph */ + ["\u7453", "\u7453"], /* CJK Ideograph */ + ["\u7454", "\u7454"], /* CJK Ideograph */ + ["\u7455", "\u7455"], /* CJK Ideograph */ + ["\u7456", "\u7456"], /* CJK Ideograph */ + ["\u7457", "\u7457"], /* CJK Ideograph */ + ["\u7458", "\u7458"], /* CJK Ideograph */ + ["\u7459", "\u7459"], /* CJK Ideograph */ + ["\u745A", "\u745A"], /* CJK Ideograph */ + ["\u745B", "\u745B"], /* CJK Ideograph */ + ["\u745C", "\u745C"], /* CJK Ideograph */ + ["\u745D", "\u745D"], /* CJK Ideograph */ + ["\u745E", "\u745E"], /* CJK Ideograph */ + ["\u745F", "\u745F"], /* CJK Ideograph */ + ["\u7460", "\u7460"], /* CJK Ideograph */ + ["\u7461", "\u7461"], /* CJK Ideograph */ + ["\u7462", "\u7462"], /* CJK Ideograph */ + ["\u7463", "\u7463"], /* CJK Ideograph */ + ["\u7464", "\u7464"], /* CJK Ideograph */ + ["\u7465", "\u7465"], /* CJK Ideograph */ + ["\u7466", "\u7466"], /* CJK Ideograph */ + ["\u7467", "\u7467"], /* CJK Ideograph */ + ["\u7468", "\u7468"], /* CJK Ideograph */ + ["\u7469", "\u7469"], /* CJK Ideograph */ + ["\u746A", "\u746A"], /* CJK Ideograph */ + ["\u746B", "\u746B"], /* CJK Ideograph */ + ["\u746C", "\u746C"], /* CJK Ideograph */ + ["\u746D", "\u746D"], /* CJK Ideograph */ + ["\u746E", "\u746E"], /* CJK Ideograph */ + ["\u746F", "\u746F"], /* CJK Ideograph */ + ["\u7470", "\u7470"], /* CJK Ideograph */ + ["\u7471", "\u7471"], /* CJK Ideograph */ + ["\u7472", "\u7472"], /* CJK Ideograph */ + ["\u7473", "\u7473"], /* CJK Ideograph */ + ["\u7474", "\u7474"], /* CJK Ideograph */ + ["\u7475", "\u7475"], /* CJK Ideograph */ + ["\u7476", "\u7476"], /* CJK Ideograph */ + ["\u7477", "\u7477"], /* CJK Ideograph */ + ["\u7478", "\u7478"], /* CJK Ideograph */ + ["\u7479", "\u7479"], /* CJK Ideograph */ + ["\u747A", "\u747A"], /* CJK Ideograph */ + ["\u747B", "\u747B"], /* CJK Ideograph */ + ["\u747C", "\u747C"], /* CJK Ideograph */ + ["\u747D", "\u747D"], /* CJK Ideograph */ + ["\u747E", "\u747E"], /* CJK Ideograph */ + ["\u747F", "\u747F"], /* CJK Ideograph */ + ["\u7480", "\u7480"], /* CJK Ideograph */ + ["\u7481", "\u7481"], /* CJK Ideograph */ + ["\u7482", "\u7482"], /* CJK Ideograph */ + ["\u7483", "\u7483"], /* CJK Ideograph */ + ["\u7484", "\u7484"], /* CJK Ideograph */ + ["\u7485", "\u7485"], /* CJK Ideograph */ + ["\u7486", "\u7486"], /* CJK Ideograph */ + ["\u7487", "\u7487"], /* CJK Ideograph */ + ["\u7488", "\u7488"], /* CJK Ideograph */ + ["\u7489", "\u7489"], /* CJK Ideograph */ + ["\u748A", "\u748A"], /* CJK Ideograph */ + ["\u748B", "\u748B"], /* CJK Ideograph */ + ["\u748C", "\u748C"], /* CJK Ideograph */ + ["\u748D", "\u748D"], /* CJK Ideograph */ + ["\u748E", "\u748E"], /* CJK Ideograph */ + ["\u748F", "\u748F"], /* CJK Ideograph */ + ["\u7490", "\u7490"], /* CJK Ideograph */ + ["\u7491", "\u7491"], /* CJK Ideograph */ + ["\u7492", "\u7492"], /* CJK Ideograph */ + ["\u7493", "\u7493"], /* CJK Ideograph */ + ["\u7494", "\u7494"], /* CJK Ideograph */ + ["\u7495", "\u7495"], /* CJK Ideograph */ + ["\u7496", "\u7496"], /* CJK Ideograph */ + ["\u7497", "\u7497"], /* CJK Ideograph */ + ["\u7498", "\u7498"], /* CJK Ideograph */ + ["\u7499", "\u7499"], /* CJK Ideograph */ + ["\u749A", "\u749A"], /* CJK Ideograph */ + ["\u749B", "\u749B"], /* CJK Ideograph */ + ["\u749C", "\u749C"], /* CJK Ideograph */ + ["\u749D", "\u749D"], /* CJK Ideograph */ + ["\u749E", "\u749E"], /* CJK Ideograph */ + ["\u749F", "\u749F"], /* CJK Ideograph */ + ["\u74A0", "\u74A0"], /* CJK Ideograph */ + ["\u74A1", "\u74A1"], /* CJK Ideograph */ + ["\u74A2", "\u74A2"], /* CJK Ideograph */ + ["\u74A3", "\u74A3"], /* CJK Ideograph */ + ["\u74A4", "\u74A4"], /* CJK Ideograph */ + ["\u74A5", "\u74A5"], /* CJK Ideograph */ + ["\u74A6", "\u74A6"], /* CJK Ideograph */ + ["\u74A7", "\u74A7"], /* CJK Ideograph */ + ["\u74A8", "\u74A8"], /* CJK Ideograph */ + ["\u74A9", "\u74A9"], /* CJK Ideograph */ + ["\u74AA", "\u74AA"], /* CJK Ideograph */ + ["\u74AB", "\u74AB"], /* CJK Ideograph */ + ["\u74AC", "\u74AC"], /* CJK Ideograph */ + ["\u74AD", "\u74AD"], /* CJK Ideograph */ + ["\u74AE", "\u74AE"], /* CJK Ideograph */ + ["\u74AF", "\u74AF"], /* CJK Ideograph */ + ["\u74B0", "\u74B0"], /* CJK Ideograph */ + ["\u74B1", "\u74B1"], /* CJK Ideograph */ + ["\u74B2", "\u74B2"], /* CJK Ideograph */ + ["\u74B3", "\u74B3"], /* CJK Ideograph */ + ["\u74B4", "\u74B4"], /* CJK Ideograph */ + ["\u74B5", "\u74B5"], /* CJK Ideograph */ + ["\u74B6", "\u74B6"], /* CJK Ideograph */ + ["\u74B7", "\u74B7"], /* CJK Ideograph */ + ["\u74B8", "\u74B8"], /* CJK Ideograph */ + ["\u74B9", "\u74B9"], /* CJK Ideograph */ + ["\u74BA", "\u74BA"], /* CJK Ideograph */ + ["\u74BB", "\u74BB"], /* CJK Ideograph */ + ["\u74BC", "\u74BC"], /* CJK Ideograph */ + ["\u74BD", "\u74BD"], /* CJK Ideograph */ + ["\u74BE", "\u74BE"], /* CJK Ideograph */ + ["\u74BF", "\u74BF"], /* CJK Ideograph */ + ["\u74C0", "\u74C0"], /* CJK Ideograph */ + ["\u74C1", "\u74C1"], /* CJK Ideograph */ + ["\u74C2", "\u74C2"], /* CJK Ideograph */ + ["\u74C3", "\u74C3"], /* CJK Ideograph */ + ["\u74C4", "\u74C4"], /* CJK Ideograph */ + ["\u74C5", "\u74C5"], /* CJK Ideograph */ + ["\u74C6", "\u74C6"], /* CJK Ideograph */ + ["\u74C7", "\u74C7"], /* CJK Ideograph */ + ["\u74C8", "\u74C8"], /* CJK Ideograph */ + ["\u74C9", "\u74C9"], /* CJK Ideograph */ + ["\u74CA", "\u74CA"], /* CJK Ideograph */ + ["\u74CB", "\u74CB"], /* CJK Ideograph */ + ["\u74CC", "\u74CC"], /* CJK Ideograph */ + ["\u74CD", "\u74CD"], /* CJK Ideograph */ + ["\u74CE", "\u74CE"], /* CJK Ideograph */ + ["\u74CF", "\u74CF"], /* CJK Ideograph */ + ["\u74D0", "\u74D0"], /* CJK Ideograph */ + ["\u74D1", "\u74D1"], /* CJK Ideograph */ + ["\u74D2", "\u74D2"], /* CJK Ideograph */ + ["\u74D3", "\u74D3"], /* CJK Ideograph */ + ["\u74D4", "\u74D4"], /* CJK Ideograph */ + ["\u74D5", "\u74D5"], /* CJK Ideograph */ + ["\u74D6", "\u74D6"], /* CJK Ideograph */ + ["\u74D7", "\u74D7"], /* CJK Ideograph */ + ["\u74D8", "\u74D8"], /* CJK Ideograph */ + ["\u74D9", "\u74D9"], /* CJK Ideograph */ + ["\u74DA", "\u74DA"], /* CJK Ideograph */ + ["\u74DB", "\u74DB"], /* CJK Ideograph */ + ["\u74DC", "\u74DC"], /* CJK Ideograph */ + ["\u74DD", "\u74DD"], /* CJK Ideograph */ + ["\u74DE", "\u74DE"], /* CJK Ideograph */ + ["\u74DF", "\u74DF"], /* CJK Ideograph */ + ["\u74E0", "\u74E0"], /* CJK Ideograph */ + ["\u74E1", "\u74E1"], /* CJK Ideograph */ + ["\u74E2", "\u74E2"], /* CJK Ideograph */ + ["\u74E3", "\u74E3"], /* CJK Ideograph */ + ["\u74E4", "\u74E4"], /* CJK Ideograph */ + ["\u74E5", "\u74E5"], /* CJK Ideograph */ + ["\u74E6", "\u74E6"], /* CJK Ideograph */ + ["\u74E7", "\u74E7"], /* CJK Ideograph */ + ["\u74E8", "\u74E8"], /* CJK Ideograph */ + ["\u74E9", "\u74E9"], /* CJK Ideograph */ + ["\u74EA", "\u74EA"], /* CJK Ideograph */ + ["\u74EB", "\u74EB"], /* CJK Ideograph */ + ["\u74EC", "\u74EC"], /* CJK Ideograph */ + ["\u74ED", "\u74ED"], /* CJK Ideograph */ + ["\u74EE", "\u74EE"], /* CJK Ideograph */ + ["\u74EF", "\u74EF"], /* CJK Ideograph */ + ["\u74F0", "\u74F0"], /* CJK Ideograph */ + ["\u74F1", "\u74F1"], /* CJK Ideograph */ + ["\u74F2", "\u74F2"], /* CJK Ideograph */ + ["\u74F3", "\u74F3"], /* CJK Ideograph */ + ["\u74F4", "\u74F4"], /* CJK Ideograph */ + ["\u74F5", "\u74F5"], /* CJK Ideograph */ + ["\u74F6", "\u74F6"], /* CJK Ideograph */ + ["\u74F7", "\u74F7"], /* CJK Ideograph */ + ["\u74F8", "\u74F8"], /* CJK Ideograph */ + ["\u74F9", "\u74F9"], /* CJK Ideograph */ + ["\u74FA", "\u74FA"], /* CJK Ideograph */ + ["\u74FB", "\u74FB"], /* CJK Ideograph */ + ["\u74FC", "\u74FC"], /* CJK Ideograph */ + ["\u74FD", "\u74FD"], /* CJK Ideograph */ + ["\u74FE", "\u74FE"], /* CJK Ideograph */ + ["\u74FF", "\u74FF"], /* CJK Ideograph */ + ["\u7500", "\u7500"], /* CJK Ideograph */ + ["\u7501", "\u7501"], /* CJK Ideograph */ + ["\u7502", "\u7502"], /* CJK Ideograph */ + ["\u7503", "\u7503"], /* CJK Ideograph */ + ["\u7504", "\u7504"], /* CJK Ideograph */ + ["\u7505", "\u7505"], /* CJK Ideograph */ + ["\u7506", "\u7506"], /* CJK Ideograph */ + ["\u7507", "\u7507"], /* CJK Ideograph */ + ["\u7508", "\u7508"], /* CJK Ideograph */ + ["\u7509", "\u7509"], /* CJK Ideograph */ + ["\u750A", "\u750A"], /* CJK Ideograph */ + ["\u750B", "\u750B"], /* CJK Ideograph */ + ["\u750C", "\u750C"], /* CJK Ideograph */ + ["\u750D", "\u750D"], /* CJK Ideograph */ + ["\u750E", "\u750E"], /* CJK Ideograph */ + ["\u750F", "\u750F"], /* CJK Ideograph */ + ["\u7510", "\u7510"], /* CJK Ideograph */ + ["\u7511", "\u7511"], /* CJK Ideograph */ + ["\u7512", "\u7512"], /* CJK Ideograph */ + ["\u7513", "\u7513"], /* CJK Ideograph */ + ["\u7514", "\u7514"], /* CJK Ideograph */ + ["\u7515", "\u7515"], /* CJK Ideograph */ + ["\u7516", "\u7516"], /* CJK Ideograph */ + ["\u7517", "\u7517"], /* CJK Ideograph */ + ["\u7518", "\u7518"], /* CJK Ideograph */ + ["\u7519", "\u7519"], /* CJK Ideograph */ + ["\u751A", "\u751A"], /* CJK Ideograph */ + ["\u751B", "\u751B"], /* CJK Ideograph */ + ["\u751C", "\u751C"], /* CJK Ideograph */ + ["\u751D", "\u751D"], /* CJK Ideograph */ + ["\u751E", "\u751E"], /* CJK Ideograph */ + ["\u751F", "\u751F"], /* CJK Ideograph */ + ["\u7520", "\u7520"], /* CJK Ideograph */ + ["\u7521", "\u7521"], /* CJK Ideograph */ + ["\u7522", "\u7522"], /* CJK Ideograph */ + ["\u7523", "\u7523"], /* CJK Ideograph */ + ["\u7524", "\u7524"], /* CJK Ideograph */ + ["\u7525", "\u7525"], /* CJK Ideograph */ + ["\u7526", "\u7526"], /* CJK Ideograph */ + ["\u7527", "\u7527"], /* CJK Ideograph */ + ["\u7528", "\u7528"], /* CJK Ideograph */ + ["\u7529", "\u7529"], /* CJK Ideograph */ + ["\u752A", "\u752A"], /* CJK Ideograph */ + ["\u752B", "\u752B"], /* CJK Ideograph */ + ["\u752C", "\u752C"], /* CJK Ideograph */ + ["\u752D", "\u752D"], /* CJK Ideograph */ + ["\u752E", "\u752E"], /* CJK Ideograph */ + ["\u752F", "\u752F"], /* CJK Ideograph */ + ["\u7530", "\u7530"], /* CJK Ideograph */ + ["\u7531", "\u7531"], /* CJK Ideograph */ + ["\u7532", "\u7532"], /* CJK Ideograph */ + ["\u7533", "\u7533"], /* CJK Ideograph */ + ["\u7534", "\u7534"], /* CJK Ideograph */ + ["\u7535", "\u7535"], /* CJK Ideograph */ + ["\u7536", "\u7536"], /* CJK Ideograph */ + ["\u7537", "\u7537"], /* CJK Ideograph */ + ["\u7538", "\u7538"], /* CJK Ideograph */ + ["\u7539", "\u7539"], /* CJK Ideograph */ + ["\u753A", "\u753A"], /* CJK Ideograph */ + ["\u753B", "\u753B"], /* CJK Ideograph */ + ["\u753C", "\u753C"], /* CJK Ideograph */ + ["\u753D", "\u753D"], /* CJK Ideograph */ + ["\u753E", "\u753E"], /* CJK Ideograph */ + ["\u753F", "\u753F"], /* CJK Ideograph */ + ["\u7540", "\u7540"], /* CJK Ideograph */ + ["\u7541", "\u7541"], /* CJK Ideograph */ + ["\u7542", "\u7542"], /* CJK Ideograph */ + ["\u7543", "\u7543"], /* CJK Ideograph */ + ["\u7544", "\u7544"], /* CJK Ideograph */ + ["\u7545", "\u7545"], /* CJK Ideograph */ + ["\u7546", "\u7546"], /* CJK Ideograph */ + ["\u7547", "\u7547"], /* CJK Ideograph */ + ["\u7548", "\u7548"], /* CJK Ideograph */ + ["\u7549", "\u7549"], /* CJK Ideograph */ + ["\u754A", "\u754A"], /* CJK Ideograph */ + ["\u754B", "\u754B"], /* CJK Ideograph */ + ["\u754C", "\u754C"], /* CJK Ideograph */ + ["\u754D", "\u754D"], /* CJK Ideograph */ + ["\u754E", "\u754E"], /* CJK Ideograph */ + ["\u754F", "\u754F"], /* CJK Ideograph */ + ["\u7550", "\u7550"], /* CJK Ideograph */ + ["\u7551", "\u7551"], /* CJK Ideograph */ + ["\u7552", "\u7552"], /* CJK Ideograph */ + ["\u7553", "\u7553"], /* CJK Ideograph */ + ["\u7554", "\u7554"], /* CJK Ideograph */ + ["\u7555", "\u7555"], /* CJK Ideograph */ + ["\u7556", "\u7556"], /* CJK Ideograph */ + ["\u7557", "\u7557"], /* CJK Ideograph */ + ["\u7558", "\u7558"], /* CJK Ideograph */ + ["\u7559", "\u7559"], /* CJK Ideograph */ + ["\u755A", "\u755A"], /* CJK Ideograph */ + ["\u755B", "\u755B"], /* CJK Ideograph */ + ["\u755C", "\u755C"], /* CJK Ideograph */ + ["\u755D", "\u755D"], /* CJK Ideograph */ + ["\u755E", "\u755E"], /* CJK Ideograph */ + ["\u755F", "\u755F"], /* CJK Ideograph */ + ["\u7560", "\u7560"], /* CJK Ideograph */ + ["\u7561", "\u7561"], /* CJK Ideograph */ + ["\u7562", "\u7562"], /* CJK Ideograph */ + ["\u7563", "\u7563"], /* CJK Ideograph */ + ["\u7564", "\u7564"], /* CJK Ideograph */ + ["\u7565", "\u7565"], /* CJK Ideograph */ + ["\u7566", "\u7566"], /* CJK Ideograph */ + ["\u7567", "\u7567"], /* CJK Ideograph */ + ["\u7568", "\u7568"], /* CJK Ideograph */ + ["\u7569", "\u7569"], /* CJK Ideograph */ + ["\u756A", "\u756A"], /* CJK Ideograph */ + ["\u756B", "\u756B"], /* CJK Ideograph */ + ["\u756C", "\u756C"], /* CJK Ideograph */ + ["\u756D", "\u756D"], /* CJK Ideograph */ + ["\u756E", "\u756E"], /* CJK Ideograph */ + ["\u756F", "\u756F"], /* CJK Ideograph */ + ["\u7570", "\u7570"], /* CJK Ideograph */ + ["\u7571", "\u7571"], /* CJK Ideograph */ + ["\u7572", "\u7572"], /* CJK Ideograph */ + ["\u7573", "\u7573"], /* CJK Ideograph */ + ["\u7574", "\u7574"], /* CJK Ideograph */ + ["\u7575", "\u7575"], /* CJK Ideograph */ + ["\u7576", "\u7576"], /* CJK Ideograph */ + ["\u7577", "\u7577"], /* CJK Ideograph */ + ["\u7578", "\u7578"], /* CJK Ideograph */ + ["\u7579", "\u7579"], /* CJK Ideograph */ + ["\u757A", "\u757A"], /* CJK Ideograph */ + ["\u757B", "\u757B"], /* CJK Ideograph */ + ["\u757C", "\u757C"], /* CJK Ideograph */ + ["\u757D", "\u757D"], /* CJK Ideograph */ + ["\u757E", "\u757E"], /* CJK Ideograph */ + ["\u757F", "\u757F"], /* CJK Ideograph */ + ["\u7580", "\u7580"], /* CJK Ideograph */ + ["\u7581", "\u7581"], /* CJK Ideograph */ + ["\u7582", "\u7582"], /* CJK Ideograph */ + ["\u7583", "\u7583"], /* CJK Ideograph */ + ["\u7584", "\u7584"], /* CJK Ideograph */ + ["\u7585", "\u7585"], /* CJK Ideograph */ + ["\u7586", "\u7586"], /* CJK Ideograph */ + ["\u7587", "\u7587"], /* CJK Ideograph */ + ["\u7588", "\u7588"], /* CJK Ideograph */ + ["\u7589", "\u7589"], /* CJK Ideograph */ + ["\u758A", "\u758A"], /* CJK Ideograph */ + ["\u758B", "\u758B"], /* CJK Ideograph */ + ["\u758C", "\u758C"], /* CJK Ideograph */ + ["\u758D", "\u758D"], /* CJK Ideograph */ + ["\u758E", "\u758E"], /* CJK Ideograph */ + ["\u758F", "\u758F"], /* CJK Ideograph */ + ["\u7590", "\u7590"], /* CJK Ideograph */ + ["\u7591", "\u7591"], /* CJK Ideograph */ + ["\u7592", "\u7592"], /* CJK Ideograph */ + ["\u7593", "\u7593"], /* CJK Ideograph */ + ["\u7594", "\u7594"], /* CJK Ideograph */ + ["\u7595", "\u7595"], /* CJK Ideograph */ + ["\u7596", "\u7596"], /* CJK Ideograph */ + ["\u7597", "\u7597"], /* CJK Ideograph */ + ["\u7598", "\u7598"], /* CJK Ideograph */ + ["\u7599", "\u7599"], /* CJK Ideograph */ + ["\u759A", "\u759A"], /* CJK Ideograph */ + ["\u759B", "\u759B"], /* CJK Ideograph */ + ["\u759C", "\u759C"], /* CJK Ideograph */ + ["\u759D", "\u759D"], /* CJK Ideograph */ + ["\u759E", "\u759E"], /* CJK Ideograph */ + ["\u759F", "\u759F"], /* CJK Ideograph */ + ["\u75A0", "\u75A0"], /* CJK Ideograph */ + ["\u75A1", "\u75A1"], /* CJK Ideograph */ + ["\u75A2", "\u75A2"], /* CJK Ideograph */ + ["\u75A3", "\u75A3"], /* CJK Ideograph */ + ["\u75A4", "\u75A4"], /* CJK Ideograph */ + ["\u75A5", "\u75A5"], /* CJK Ideograph */ + ["\u75A6", "\u75A6"], /* CJK Ideograph */ + ["\u75A7", "\u75A7"], /* CJK Ideograph */ + ["\u75A8", "\u75A8"], /* CJK Ideograph */ + ["\u75A9", "\u75A9"], /* CJK Ideograph */ + ["\u75AA", "\u75AA"], /* CJK Ideograph */ + ["\u75AB", "\u75AB"], /* CJK Ideograph */ + ["\u75AC", "\u75AC"], /* CJK Ideograph */ + ["\u75AD", "\u75AD"], /* CJK Ideograph */ + ["\u75AE", "\u75AE"], /* CJK Ideograph */ + ["\u75AF", "\u75AF"], /* CJK Ideograph */ + ["\u75B0", "\u75B0"], /* CJK Ideograph */ + ["\u75B1", "\u75B1"], /* CJK Ideograph */ + ["\u75B2", "\u75B2"], /* CJK Ideograph */ + ["\u75B3", "\u75B3"], /* CJK Ideograph */ + ["\u75B4", "\u75B4"], /* CJK Ideograph */ + ["\u75B5", "\u75B5"], /* CJK Ideograph */ + ["\u75B6", "\u75B6"], /* CJK Ideograph */ + ["\u75B7", "\u75B7"], /* CJK Ideograph */ + ["\u75B8", "\u75B8"], /* CJK Ideograph */ + ["\u75B9", "\u75B9"], /* CJK Ideograph */ + ["\u75BA", "\u75BA"], /* CJK Ideograph */ + ["\u75BB", "\u75BB"], /* CJK Ideograph */ + ["\u75BC", "\u75BC"], /* CJK Ideograph */ + ["\u75BD", "\u75BD"], /* CJK Ideograph */ + ["\u75BE", "\u75BE"], /* CJK Ideograph */ + ["\u75BF", "\u75BF"], /* CJK Ideograph */ + ["\u75C0", "\u75C0"], /* CJK Ideograph */ + ["\u75C1", "\u75C1"], /* CJK Ideograph */ + ["\u75C2", "\u75C2"], /* CJK Ideograph */ + ["\u75C3", "\u75C3"], /* CJK Ideograph */ + ["\u75C4", "\u75C4"], /* CJK Ideograph */ + ["\u75C5", "\u75C5"], /* CJK Ideograph */ + ["\u75C6", "\u75C6"], /* CJK Ideograph */ + ["\u75C7", "\u75C7"], /* CJK Ideograph */ + ["\u75C8", "\u75C8"], /* CJK Ideograph */ + ["\u75C9", "\u75C9"], /* CJK Ideograph */ + ["\u75CA", "\u75CA"], /* CJK Ideograph */ + ["\u75CB", "\u75CB"], /* CJK Ideograph */ + ["\u75CC", "\u75CC"], /* CJK Ideograph */ + ["\u75CD", "\u75CD"], /* CJK Ideograph */ + ["\u75CE", "\u75CE"], /* CJK Ideograph */ + ["\u75CF", "\u75CF"], /* CJK Ideograph */ + ["\u75D0", "\u75D0"], /* CJK Ideograph */ + ["\u75D1", "\u75D1"], /* CJK Ideograph */ + ["\u75D2", "\u75D2"], /* CJK Ideograph */ + ["\u75D3", "\u75D3"], /* CJK Ideograph */ + ["\u75D4", "\u75D4"], /* CJK Ideograph */ + ["\u75D5", "\u75D5"], /* CJK Ideograph */ + ["\u75D6", "\u75D6"], /* CJK Ideograph */ + ["\u75D7", "\u75D7"], /* CJK Ideograph */ + ["\u75D8", "\u75D8"], /* CJK Ideograph */ + ["\u75D9", "\u75D9"], /* CJK Ideograph */ + ["\u75DA", "\u75DA"], /* CJK Ideograph */ + ["\u75DB", "\u75DB"], /* CJK Ideograph */ + ["\u75DC", "\u75DC"], /* CJK Ideograph */ + ["\u75DD", "\u75DD"], /* CJK Ideograph */ + ["\u75DE", "\u75DE"], /* CJK Ideograph */ + ["\u75DF", "\u75DF"], /* CJK Ideograph */ + ["\u75E0", "\u75E0"], /* CJK Ideograph */ + ["\u75E1", "\u75E1"], /* CJK Ideograph */ + ["\u75E2", "\u75E2"], /* CJK Ideograph */ + ["\u75E3", "\u75E3"], /* CJK Ideograph */ + ["\u75E4", "\u75E4"], /* CJK Ideograph */ + ["\u75E5", "\u75E5"], /* CJK Ideograph */ + ["\u75E6", "\u75E6"], /* CJK Ideograph */ + ["\u75E7", "\u75E7"], /* CJK Ideograph */ + ["\u75E8", "\u75E8"], /* CJK Ideograph */ + ["\u75E9", "\u75E9"], /* CJK Ideograph */ + ["\u75EA", "\u75EA"], /* CJK Ideograph */ + ["\u75EB", "\u75EB"], /* CJK Ideograph */ + ["\u75EC", "\u75EC"], /* CJK Ideograph */ + ["\u75ED", "\u75ED"], /* CJK Ideograph */ + ["\u75EE", "\u75EE"], /* CJK Ideograph */ + ["\u75EF", "\u75EF"], /* CJK Ideograph */ + ["\u75F0", "\u75F0"], /* CJK Ideograph */ + ["\u75F1", "\u75F1"], /* CJK Ideograph */ + ["\u75F2", "\u75F2"], /* CJK Ideograph */ + ["\u75F3", "\u75F3"], /* CJK Ideograph */ + ["\u75F4", "\u75F4"], /* CJK Ideograph */ + ["\u75F5", "\u75F5"], /* CJK Ideograph */ + ["\u75F6", "\u75F6"], /* CJK Ideograph */ + ["\u75F7", "\u75F7"], /* CJK Ideograph */ + ["\u75F8", "\u75F8"], /* CJK Ideograph */ + ["\u75F9", "\u75F9"], /* CJK Ideograph */ + ["\u75FA", "\u75FA"], /* CJK Ideograph */ + ["\u75FB", "\u75FB"], /* CJK Ideograph */ + ["\u75FC", "\u75FC"], /* CJK Ideograph */ + ["\u75FD", "\u75FD"], /* CJK Ideograph */ + ["\u75FE", "\u75FE"], /* CJK Ideograph */ + ["\u75FF", "\u75FF"], /* CJK Ideograph */ + ["\u7600", "\u7600"], /* CJK Ideograph */ + ["\u7601", "\u7601"], /* CJK Ideograph */ + ["\u7602", "\u7602"], /* CJK Ideograph */ + ["\u7603", "\u7603"], /* CJK Ideograph */ + ["\u7604", "\u7604"], /* CJK Ideograph */ + ["\u7605", "\u7605"], /* CJK Ideograph */ + ["\u7606", "\u7606"], /* CJK Ideograph */ + ["\u7607", "\u7607"], /* CJK Ideograph */ + ["\u7608", "\u7608"], /* CJK Ideograph */ + ["\u7609", "\u7609"], /* CJK Ideograph */ + ["\u760A", "\u760A"], /* CJK Ideograph */ + ["\u760B", "\u760B"], /* CJK Ideograph */ + ["\u760C", "\u760C"], /* CJK Ideograph */ + ["\u760D", "\u760D"], /* CJK Ideograph */ + ["\u760E", "\u760E"], /* CJK Ideograph */ + ["\u760F", "\u760F"], /* CJK Ideograph */ + ["\u7610", "\u7610"], /* CJK Ideograph */ + ["\u7611", "\u7611"], /* CJK Ideograph */ + ["\u7612", "\u7612"], /* CJK Ideograph */ + ["\u7613", "\u7613"], /* CJK Ideograph */ + ["\u7614", "\u7614"], /* CJK Ideograph */ + ["\u7615", "\u7615"], /* CJK Ideograph */ + ["\u7616", "\u7616"], /* CJK Ideograph */ + ["\u7617", "\u7617"], /* CJK Ideograph */ + ["\u7618", "\u7618"], /* CJK Ideograph */ + ["\u7619", "\u7619"], /* CJK Ideograph */ + ["\u761A", "\u761A"], /* CJK Ideograph */ + ["\u761B", "\u761B"], /* CJK Ideograph */ + ["\u761C", "\u761C"], /* CJK Ideograph */ + ["\u761D", "\u761D"], /* CJK Ideograph */ + ["\u761E", "\u761E"], /* CJK Ideograph */ + ["\u761F", "\u761F"], /* CJK Ideograph */ + ["\u7620", "\u7620"], /* CJK Ideograph */ + ["\u7621", "\u7621"], /* CJK Ideograph */ + ["\u7622", "\u7622"], /* CJK Ideograph */ + ["\u7623", "\u7623"], /* CJK Ideograph */ + ["\u7624", "\u7624"], /* CJK Ideograph */ + ["\u7625", "\u7625"], /* CJK Ideograph */ + ["\u7626", "\u7626"], /* CJK Ideograph */ + ["\u7627", "\u7627"], /* CJK Ideograph */ + ["\u7628", "\u7628"], /* CJK Ideograph */ + ["\u7629", "\u7629"], /* CJK Ideograph */ + ["\u762A", "\u762A"], /* CJK Ideograph */ + ["\u762B", "\u762B"], /* CJK Ideograph */ + ["\u762C", "\u762C"], /* CJK Ideograph */ + ["\u762D", "\u762D"], /* CJK Ideograph */ + ["\u762E", "\u762E"], /* CJK Ideograph */ + ["\u762F", "\u762F"], /* CJK Ideograph */ + ["\u7630", "\u7630"], /* CJK Ideograph */ + ["\u7631", "\u7631"], /* CJK Ideograph */ + ["\u7632", "\u7632"], /* CJK Ideograph */ + ["\u7633", "\u7633"], /* CJK Ideograph */ + ["\u7634", "\u7634"], /* CJK Ideograph */ + ["\u7635", "\u7635"], /* CJK Ideograph */ + ["\u7636", "\u7636"], /* CJK Ideograph */ + ["\u7637", "\u7637"], /* CJK Ideograph */ + ["\u7638", "\u7638"], /* CJK Ideograph */ + ["\u7639", "\u7639"], /* CJK Ideograph */ + ["\u763A", "\u763A"], /* CJK Ideograph */ + ["\u763B", "\u763B"], /* CJK Ideograph */ + ["\u763C", "\u763C"], /* CJK Ideograph */ + ["\u763D", "\u763D"], /* CJK Ideograph */ + ["\u763E", "\u763E"], /* CJK Ideograph */ + ["\u763F", "\u763F"], /* CJK Ideograph */ + ["\u7640", "\u7640"], /* CJK Ideograph */ + ["\u7641", "\u7641"], /* CJK Ideograph */ + ["\u7642", "\u7642"], /* CJK Ideograph */ + ["\u7643", "\u7643"], /* CJK Ideograph */ + ["\u7644", "\u7644"], /* CJK Ideograph */ + ["\u7645", "\u7645"], /* CJK Ideograph */ + ["\u7646", "\u7646"], /* CJK Ideograph */ + ["\u7647", "\u7647"], /* CJK Ideograph */ + ["\u7648", "\u7648"], /* CJK Ideograph */ + ["\u7649", "\u7649"], /* CJK Ideograph */ + ["\u764A", "\u764A"], /* CJK Ideograph */ + ["\u764B", "\u764B"], /* CJK Ideograph */ + ["\u764C", "\u764C"], /* CJK Ideograph */ + ["\u764D", "\u764D"], /* CJK Ideograph */ + ["\u764E", "\u764E"], /* CJK Ideograph */ + ["\u764F", "\u764F"], /* CJK Ideograph */ + ["\u7650", "\u7650"], /* CJK Ideograph */ + ["\u7651", "\u7651"], /* CJK Ideograph */ + ["\u7652", "\u7652"], /* CJK Ideograph */ + ["\u7653", "\u7653"], /* CJK Ideograph */ + ["\u7654", "\u7654"], /* CJK Ideograph */ + ["\u7655", "\u7655"], /* CJK Ideograph */ + ["\u7656", "\u7656"], /* CJK Ideograph */ + ["\u7657", "\u7657"], /* CJK Ideograph */ + ["\u7658", "\u7658"], /* CJK Ideograph */ + ["\u7659", "\u7659"], /* CJK Ideograph */ + ["\u765A", "\u765A"], /* CJK Ideograph */ + ["\u765B", "\u765B"], /* CJK Ideograph */ + ["\u765C", "\u765C"], /* CJK Ideograph */ + ["\u765D", "\u765D"], /* CJK Ideograph */ + ["\u765E", "\u765E"], /* CJK Ideograph */ + ["\u765F", "\u765F"], /* CJK Ideograph */ + ["\u7660", "\u7660"], /* CJK Ideograph */ + ["\u7661", "\u7661"], /* CJK Ideograph */ + ["\u7662", "\u7662"], /* CJK Ideograph */ + ["\u7663", "\u7663"], /* CJK Ideograph */ + ["\u7664", "\u7664"], /* CJK Ideograph */ + ["\u7665", "\u7665"], /* CJK Ideograph */ + ["\u7666", "\u7666"], /* CJK Ideograph */ + ["\u7667", "\u7667"], /* CJK Ideograph */ + ["\u7668", "\u7668"], /* CJK Ideograph */ + ["\u7669", "\u7669"], /* CJK Ideograph */ + ["\u766A", "\u766A"], /* CJK Ideograph */ + ["\u766B", "\u766B"], /* CJK Ideograph */ + ["\u766C", "\u766C"], /* CJK Ideograph */ + ["\u766D", "\u766D"], /* CJK Ideograph */ + ["\u766E", "\u766E"], /* CJK Ideograph */ + ["\u766F", "\u766F"], /* CJK Ideograph */ + ["\u7670", "\u7670"], /* CJK Ideograph */ + ["\u7671", "\u7671"], /* CJK Ideograph */ + ["\u7672", "\u7672"], /* CJK Ideograph */ + ["\u7673", "\u7673"], /* CJK Ideograph */ + ["\u7674", "\u7674"], /* CJK Ideograph */ + ["\u7675", "\u7675"], /* CJK Ideograph */ + ["\u7676", "\u7676"], /* CJK Ideograph */ + ["\u7677", "\u7677"], /* CJK Ideograph */ + ["\u7678", "\u7678"], /* CJK Ideograph */ + ["\u7679", "\u7679"], /* CJK Ideograph */ + ["\u767A", "\u767A"], /* CJK Ideograph */ + ["\u767B", "\u767B"], /* CJK Ideograph */ + ["\u767C", "\u767C"], /* CJK Ideograph */ + ["\u767D", "\u767D"], /* CJK Ideograph */ + ["\u767E", "\u767E"], /* CJK Ideograph */ + ["\u767F", "\u767F"], /* CJK Ideograph */ + ["\u7680", "\u7680"], /* CJK Ideograph */ + ["\u7681", "\u7681"], /* CJK Ideograph */ + ["\u7682", "\u7682"], /* CJK Ideograph */ + ["\u7683", "\u7683"], /* CJK Ideograph */ + ["\u7684", "\u7684"], /* CJK Ideograph */ + ["\u7685", "\u7685"], /* CJK Ideograph */ + ["\u7686", "\u7686"], /* CJK Ideograph */ + ["\u7687", "\u7687"], /* CJK Ideograph */ + ["\u7688", "\u7688"], /* CJK Ideograph */ + ["\u7689", "\u7689"], /* CJK Ideograph */ + ["\u768A", "\u768A"], /* CJK Ideograph */ + ["\u768B", "\u768B"], /* CJK Ideograph */ + ["\u768C", "\u768C"], /* CJK Ideograph */ + ["\u768D", "\u768D"], /* CJK Ideograph */ + ["\u768E", "\u768E"], /* CJK Ideograph */ + ["\u768F", "\u768F"], /* CJK Ideograph */ + ["\u7690", "\u7690"], /* CJK Ideograph */ + ["\u7691", "\u7691"], /* CJK Ideograph */ + ["\u7692", "\u7692"], /* CJK Ideograph */ + ["\u7693", "\u7693"], /* CJK Ideograph */ + ["\u7694", "\u7694"], /* CJK Ideograph */ + ["\u7695", "\u7695"], /* CJK Ideograph */ + ["\u7696", "\u7696"], /* CJK Ideograph */ + ["\u7697", "\u7697"], /* CJK Ideograph */ + ["\u7698", "\u7698"], /* CJK Ideograph */ + ["\u7699", "\u7699"], /* CJK Ideograph */ + ["\u769A", "\u769A"], /* CJK Ideograph */ + ["\u769B", "\u769B"], /* CJK Ideograph */ + ["\u769C", "\u769C"], /* CJK Ideograph */ + ["\u769D", "\u769D"], /* CJK Ideograph */ + ["\u769E", "\u769E"], /* CJK Ideograph */ + ["\u769F", "\u769F"], /* CJK Ideograph */ + ["\u76A0", "\u76A0"], /* CJK Ideograph */ + ["\u76A1", "\u76A1"], /* CJK Ideograph */ + ["\u76A2", "\u76A2"], /* CJK Ideograph */ + ["\u76A3", "\u76A3"], /* CJK Ideograph */ + ["\u76A4", "\u76A4"], /* CJK Ideograph */ + ["\u76A5", "\u76A5"], /* CJK Ideograph */ + ["\u76A6", "\u76A6"], /* CJK Ideograph */ + ["\u76A7", "\u76A7"], /* CJK Ideograph */ + ["\u76A8", "\u76A8"], /* CJK Ideograph */ + ["\u76A9", "\u76A9"], /* CJK Ideograph */ + ["\u76AA", "\u76AA"], /* CJK Ideograph */ + ["\u76AB", "\u76AB"], /* CJK Ideograph */ + ["\u76AC", "\u76AC"], /* CJK Ideograph */ + ["\u76AD", "\u76AD"], /* CJK Ideograph */ + ["\u76AE", "\u76AE"], /* CJK Ideograph */ + ["\u76AF", "\u76AF"], /* CJK Ideograph */ + ["\u76B0", "\u76B0"], /* CJK Ideograph */ + ["\u76B1", "\u76B1"], /* CJK Ideograph */ + ["\u76B2", "\u76B2"], /* CJK Ideograph */ + ["\u76B3", "\u76B3"], /* CJK Ideograph */ + ["\u76B4", "\u76B4"], /* CJK Ideograph */ + ["\u76B5", "\u76B5"], /* CJK Ideograph */ + ["\u76B6", "\u76B6"], /* CJK Ideograph */ + ["\u76B7", "\u76B7"], /* CJK Ideograph */ + ["\u76B8", "\u76B8"], /* CJK Ideograph */ + ["\u76B9", "\u76B9"], /* CJK Ideograph */ + ["\u76BA", "\u76BA"], /* CJK Ideograph */ + ["\u76BB", "\u76BB"], /* CJK Ideograph */ + ["\u76BC", "\u76BC"], /* CJK Ideograph */ + ["\u76BD", "\u76BD"], /* CJK Ideograph */ + ["\u76BE", "\u76BE"], /* CJK Ideograph */ + ["\u76BF", "\u76BF"], /* CJK Ideograph */ + ["\u76C0", "\u76C0"], /* CJK Ideograph */ + ["\u76C1", "\u76C1"], /* CJK Ideograph */ + ["\u76C2", "\u76C2"], /* CJK Ideograph */ + ["\u76C3", "\u76C3"], /* CJK Ideograph */ + ["\u76C4", "\u76C4"], /* CJK Ideograph */ + ["\u76C5", "\u76C5"], /* CJK Ideograph */ + ["\u76C6", "\u76C6"], /* CJK Ideograph */ + ["\u76C7", "\u76C7"], /* CJK Ideograph */ + ["\u76C8", "\u76C8"], /* CJK Ideograph */ + ["\u76C9", "\u76C9"], /* CJK Ideograph */ + ["\u76CA", "\u76CA"], /* CJK Ideograph */ + ["\u76CB", "\u76CB"], /* CJK Ideograph */ + ["\u76CC", "\u76CC"], /* CJK Ideograph */ + ["\u76CD", "\u76CD"], /* CJK Ideograph */ + ["\u76CE", "\u76CE"], /* CJK Ideograph */ + ["\u76CF", "\u76CF"], /* CJK Ideograph */ + ["\u76D0", "\u76D0"], /* CJK Ideograph */ + ["\u76D1", "\u76D1"], /* CJK Ideograph */ + ["\u76D2", "\u76D2"], /* CJK Ideograph */ + ["\u76D3", "\u76D3"], /* CJK Ideograph */ + ["\u76D4", "\u76D4"], /* CJK Ideograph */ + ["\u76D5", "\u76D5"], /* CJK Ideograph */ + ["\u76D6", "\u76D6"], /* CJK Ideograph */ + ["\u76D7", "\u76D7"], /* CJK Ideograph */ + ["\u76D8", "\u76D8"], /* CJK Ideograph */ + ["\u76D9", "\u76D9"], /* CJK Ideograph */ + ["\u76DA", "\u76DA"], /* CJK Ideograph */ + ["\u76DB", "\u76DB"], /* CJK Ideograph */ + ["\u76DC", "\u76DC"], /* CJK Ideograph */ + ["\u76DD", "\u76DD"], /* CJK Ideograph */ + ["\u76DE", "\u76DE"], /* CJK Ideograph */ + ["\u76DF", "\u76DF"], /* CJK Ideograph */ + ["\u76E0", "\u76E0"], /* CJK Ideograph */ + ["\u76E1", "\u76E1"], /* CJK Ideograph */ + ["\u76E2", "\u76E2"], /* CJK Ideograph */ + ["\u76E3", "\u76E3"], /* CJK Ideograph */ + ["\u76E4", "\u76E4"], /* CJK Ideograph */ + ["\u76E5", "\u76E5"], /* CJK Ideograph */ + ["\u76E6", "\u76E6"], /* CJK Ideograph */ + ["\u76E7", "\u76E7"], /* CJK Ideograph */ + ["\u76E8", "\u76E8"], /* CJK Ideograph */ + ["\u76E9", "\u76E9"], /* CJK Ideograph */ + ["\u76EA", "\u76EA"], /* CJK Ideograph */ + ["\u76EB", "\u76EB"], /* CJK Ideograph */ + ["\u76EC", "\u76EC"], /* CJK Ideograph */ + ["\u76ED", "\u76ED"], /* CJK Ideograph */ + ["\u76EE", "\u76EE"], /* CJK Ideograph */ + ["\u76EF", "\u76EF"], /* CJK Ideograph */ + ["\u76F0", "\u76F0"], /* CJK Ideograph */ + ["\u76F1", "\u76F1"], /* CJK Ideograph */ + ["\u76F2", "\u76F2"], /* CJK Ideograph */ + ["\u76F3", "\u76F3"], /* CJK Ideograph */ + ["\u76F4", "\u76F4"], /* CJK Ideograph */ + ["\u76F5", "\u76F5"], /* CJK Ideograph */ + ["\u76F6", "\u76F6"], /* CJK Ideograph */ + ["\u76F7", "\u76F7"], /* CJK Ideograph */ + ["\u76F8", "\u76F8"], /* CJK Ideograph */ + ["\u76F9", "\u76F9"], /* CJK Ideograph */ + ["\u76FA", "\u76FA"], /* CJK Ideograph */ + ["\u76FB", "\u76FB"], /* CJK Ideograph */ + ["\u76FC", "\u76FC"], /* CJK Ideograph */ + ["\u76FD", "\u76FD"], /* CJK Ideograph */ + ["\u76FE", "\u76FE"], /* CJK Ideograph */ + ["\u76FF", "\u76FF"], /* CJK Ideograph */ + ["\u7700", "\u7700"], /* CJK Ideograph */ + ["\u7701", "\u7701"], /* CJK Ideograph */ + ["\u7702", "\u7702"], /* CJK Ideograph */ + ["\u7703", "\u7703"], /* CJK Ideograph */ + ["\u7704", "\u7704"], /* CJK Ideograph */ + ["\u7705", "\u7705"], /* CJK Ideograph */ + ["\u7706", "\u7706"], /* CJK Ideograph */ + ["\u7707", "\u7707"], /* CJK Ideograph */ + ["\u7708", "\u7708"], /* CJK Ideograph */ + ["\u7709", "\u7709"], /* CJK Ideograph */ + ["\u770A", "\u770A"], /* CJK Ideograph */ + ["\u770B", "\u770B"], /* CJK Ideograph */ + ["\u770C", "\u770C"], /* CJK Ideograph */ + ["\u770D", "\u770D"], /* CJK Ideograph */ + ["\u770E", "\u770E"], /* CJK Ideograph */ + ["\u770F", "\u770F"], /* CJK Ideograph */ + ["\u7710", "\u7710"], /* CJK Ideograph */ + ["\u7711", "\u7711"], /* CJK Ideograph */ + ["\u7712", "\u7712"], /* CJK Ideograph */ + ["\u7713", "\u7713"], /* CJK Ideograph */ + ["\u7714", "\u7714"], /* CJK Ideograph */ + ["\u7715", "\u7715"], /* CJK Ideograph */ + ["\u7716", "\u7716"], /* CJK Ideograph */ + ["\u7717", "\u7717"], /* CJK Ideograph */ + ["\u7718", "\u7718"], /* CJK Ideograph */ + ["\u7719", "\u7719"], /* CJK Ideograph */ + ["\u771A", "\u771A"], /* CJK Ideograph */ + ["\u771B", "\u771B"], /* CJK Ideograph */ + ["\u771C", "\u771C"], /* CJK Ideograph */ + ["\u771D", "\u771D"], /* CJK Ideograph */ + ["\u771E", "\u771E"], /* CJK Ideograph */ + ["\u771F", "\u771F"], /* CJK Ideograph */ + ["\u7720", "\u7720"], /* CJK Ideograph */ + ["\u7721", "\u7721"], /* CJK Ideograph */ + ["\u7722", "\u7722"], /* CJK Ideograph */ + ["\u7723", "\u7723"], /* CJK Ideograph */ + ["\u7724", "\u7724"], /* CJK Ideograph */ + ["\u7725", "\u7725"], /* CJK Ideograph */ + ["\u7726", "\u7726"], /* CJK Ideograph */ + ["\u7727", "\u7727"], /* CJK Ideograph */ + ["\u7728", "\u7728"], /* CJK Ideograph */ + ["\u7729", "\u7729"], /* CJK Ideograph */ + ["\u772A", "\u772A"], /* CJK Ideograph */ + ["\u772B", "\u772B"], /* CJK Ideograph */ + ["\u772C", "\u772C"], /* CJK Ideograph */ + ["\u772D", "\u772D"], /* CJK Ideograph */ + ["\u772E", "\u772E"], /* CJK Ideograph */ + ["\u772F", "\u772F"], /* CJK Ideograph */ + ["\u7730", "\u7730"], /* CJK Ideograph */ + ["\u7731", "\u7731"], /* CJK Ideograph */ + ["\u7732", "\u7732"], /* CJK Ideograph */ + ["\u7733", "\u7733"], /* CJK Ideograph */ + ["\u7734", "\u7734"], /* CJK Ideograph */ + ["\u7735", "\u7735"], /* CJK Ideograph */ + ["\u7736", "\u7736"], /* CJK Ideograph */ + ["\u7737", "\u7737"], /* CJK Ideograph */ + ["\u7738", "\u7738"], /* CJK Ideograph */ + ["\u7739", "\u7739"], /* CJK Ideograph */ + ["\u773A", "\u773A"], /* CJK Ideograph */ + ["\u773B", "\u773B"], /* CJK Ideograph */ + ["\u773C", "\u773C"], /* CJK Ideograph */ + ["\u773D", "\u773D"], /* CJK Ideograph */ + ["\u773E", "\u773E"], /* CJK Ideograph */ + ["\u773F", "\u773F"], /* CJK Ideograph */ + ["\u7740", "\u7740"], /* CJK Ideograph */ + ["\u7741", "\u7741"], /* CJK Ideograph */ + ["\u7742", "\u7742"], /* CJK Ideograph */ + ["\u7743", "\u7743"], /* CJK Ideograph */ + ["\u7744", "\u7744"], /* CJK Ideograph */ + ["\u7745", "\u7745"], /* CJK Ideograph */ + ["\u7746", "\u7746"], /* CJK Ideograph */ + ["\u7747", "\u7747"], /* CJK Ideograph */ + ["\u7748", "\u7748"], /* CJK Ideograph */ + ["\u7749", "\u7749"], /* CJK Ideograph */ + ["\u774A", "\u774A"], /* CJK Ideograph */ + ["\u774B", "\u774B"], /* CJK Ideograph */ + ["\u774C", "\u774C"], /* CJK Ideograph */ + ["\u774D", "\u774D"], /* CJK Ideograph */ + ["\u774E", "\u774E"], /* CJK Ideograph */ + ["\u774F", "\u774F"], /* CJK Ideograph */ + ["\u7750", "\u7750"], /* CJK Ideograph */ + ["\u7751", "\u7751"], /* CJK Ideograph */ + ["\u7752", "\u7752"], /* CJK Ideograph */ + ["\u7753", "\u7753"], /* CJK Ideograph */ + ["\u7754", "\u7754"], /* CJK Ideograph */ + ["\u7755", "\u7755"], /* CJK Ideograph */ + ["\u7756", "\u7756"], /* CJK Ideograph */ + ["\u7757", "\u7757"], /* CJK Ideograph */ + ["\u7758", "\u7758"], /* CJK Ideograph */ + ["\u7759", "\u7759"], /* CJK Ideograph */ + ["\u775A", "\u775A"], /* CJK Ideograph */ + ["\u775B", "\u775B"], /* CJK Ideograph */ + ["\u775C", "\u775C"], /* CJK Ideograph */ + ["\u775D", "\u775D"], /* CJK Ideograph */ + ["\u775E", "\u775E"], /* CJK Ideograph */ + ["\u775F", "\u775F"], /* CJK Ideograph */ + ["\u7760", "\u7760"], /* CJK Ideograph */ + ["\u7761", "\u7761"], /* CJK Ideograph */ + ["\u7762", "\u7762"], /* CJK Ideograph */ + ["\u7763", "\u7763"], /* CJK Ideograph */ + ["\u7764", "\u7764"], /* CJK Ideograph */ + ["\u7765", "\u7765"], /* CJK Ideograph */ + ["\u7766", "\u7766"], /* CJK Ideograph */ + ["\u7767", "\u7767"], /* CJK Ideograph */ + ["\u7768", "\u7768"], /* CJK Ideograph */ + ["\u7769", "\u7769"], /* CJK Ideograph */ + ["\u776A", "\u776A"], /* CJK Ideograph */ + ["\u776B", "\u776B"], /* CJK Ideograph */ + ["\u776C", "\u776C"], /* CJK Ideograph */ + ["\u776D", "\u776D"], /* CJK Ideograph */ + ["\u776E", "\u776E"], /* CJK Ideograph */ + ["\u776F", "\u776F"], /* CJK Ideograph */ + ["\u7770", "\u7770"], /* CJK Ideograph */ + ["\u7771", "\u7771"], /* CJK Ideograph */ + ["\u7772", "\u7772"], /* CJK Ideograph */ + ["\u7773", "\u7773"], /* CJK Ideograph */ + ["\u7774", "\u7774"], /* CJK Ideograph */ + ["\u7775", "\u7775"], /* CJK Ideograph */ + ["\u7776", "\u7776"], /* CJK Ideograph */ + ["\u7777", "\u7777"], /* CJK Ideograph */ + ["\u7778", "\u7778"], /* CJK Ideograph */ + ["\u7779", "\u7779"], /* CJK Ideograph */ + ["\u777A", "\u777A"], /* CJK Ideograph */ + ["\u777B", "\u777B"], /* CJK Ideograph */ + ["\u777C", "\u777C"], /* CJK Ideograph */ + ["\u777D", "\u777D"], /* CJK Ideograph */ + ["\u777E", "\u777E"], /* CJK Ideograph */ + ["\u777F", "\u777F"], /* CJK Ideograph */ + ["\u7780", "\u7780"], /* CJK Ideograph */ + ["\u7781", "\u7781"], /* CJK Ideograph */ + ["\u7782", "\u7782"], /* CJK Ideograph */ + ["\u7783", "\u7783"], /* CJK Ideograph */ + ["\u7784", "\u7784"], /* CJK Ideograph */ + ["\u7785", "\u7785"], /* CJK Ideograph */ + ["\u7786", "\u7786"], /* CJK Ideograph */ + ["\u7787", "\u7787"], /* CJK Ideograph */ + ["\u7788", "\u7788"], /* CJK Ideograph */ + ["\u7789", "\u7789"], /* CJK Ideograph */ + ["\u778A", "\u778A"], /* CJK Ideograph */ + ["\u778B", "\u778B"], /* CJK Ideograph */ + ["\u778C", "\u778C"], /* CJK Ideograph */ + ["\u778D", "\u778D"], /* CJK Ideograph */ + ["\u778E", "\u778E"], /* CJK Ideograph */ + ["\u778F", "\u778F"], /* CJK Ideograph */ + ["\u7790", "\u7790"], /* CJK Ideograph */ + ["\u7791", "\u7791"], /* CJK Ideograph */ + ["\u7792", "\u7792"], /* CJK Ideograph */ + ["\u7793", "\u7793"], /* CJK Ideograph */ + ["\u7794", "\u7794"], /* CJK Ideograph */ + ["\u7795", "\u7795"], /* CJK Ideograph */ + ["\u7796", "\u7796"], /* CJK Ideograph */ + ["\u7797", "\u7797"], /* CJK Ideograph */ + ["\u7798", "\u7798"], /* CJK Ideograph */ + ["\u7799", "\u7799"], /* CJK Ideograph */ + ["\u779A", "\u779A"], /* CJK Ideograph */ + ["\u779B", "\u779B"], /* CJK Ideograph */ + ["\u779C", "\u779C"], /* CJK Ideograph */ + ["\u779D", "\u779D"], /* CJK Ideograph */ + ["\u779E", "\u779E"], /* CJK Ideograph */ + ["\u779F", "\u779F"], /* CJK Ideograph */ + ["\u77A0", "\u77A0"], /* CJK Ideograph */ + ["\u77A1", "\u77A1"], /* CJK Ideograph */ + ["\u77A2", "\u77A2"], /* CJK Ideograph */ + ["\u77A3", "\u77A3"], /* CJK Ideograph */ + ["\u77A4", "\u77A4"], /* CJK Ideograph */ + ["\u77A5", "\u77A5"], /* CJK Ideograph */ + ["\u77A6", "\u77A6"], /* CJK Ideograph */ + ["\u77A7", "\u77A7"], /* CJK Ideograph */ + ["\u77A8", "\u77A8"], /* CJK Ideograph */ + ["\u77A9", "\u77A9"], /* CJK Ideograph */ + ["\u77AA", "\u77AA"], /* CJK Ideograph */ + ["\u77AB", "\u77AB"], /* CJK Ideograph */ + ["\u77AC", "\u77AC"], /* CJK Ideograph */ + ["\u77AD", "\u77AD"], /* CJK Ideograph */ + ["\u77AE", "\u77AE"], /* CJK Ideograph */ + ["\u77AF", "\u77AF"], /* CJK Ideograph */ + ["\u77B0", "\u77B0"], /* CJK Ideograph */ + ["\u77B1", "\u77B1"], /* CJK Ideograph */ + ["\u77B2", "\u77B2"], /* CJK Ideograph */ + ["\u77B3", "\u77B3"], /* CJK Ideograph */ + ["\u77B4", "\u77B4"], /* CJK Ideograph */ + ["\u77B5", "\u77B5"], /* CJK Ideograph */ + ["\u77B6", "\u77B6"], /* CJK Ideograph */ + ["\u77B7", "\u77B7"], /* CJK Ideograph */ + ["\u77B8", "\u77B8"], /* CJK Ideograph */ + ["\u77B9", "\u77B9"], /* CJK Ideograph */ + ["\u77BA", "\u77BA"], /* CJK Ideograph */ + ["\u77BB", "\u77BB"], /* CJK Ideograph */ + ["\u77BC", "\u77BC"], /* CJK Ideograph */ + ["\u77BD", "\u77BD"], /* CJK Ideograph */ + ["\u77BE", "\u77BE"], /* CJK Ideograph */ + ["\u77BF", "\u77BF"], /* CJK Ideograph */ + ["\u77C0", "\u77C0"], /* CJK Ideograph */ + ["\u77C1", "\u77C1"], /* CJK Ideograph */ + ["\u77C2", "\u77C2"], /* CJK Ideograph */ + ["\u77C3", "\u77C3"], /* CJK Ideograph */ + ["\u77C4", "\u77C4"], /* CJK Ideograph */ + ["\u77C5", "\u77C5"], /* CJK Ideograph */ + ["\u77C6", "\u77C6"], /* CJK Ideograph */ + ["\u77C7", "\u77C7"], /* CJK Ideograph */ + ["\u77C8", "\u77C8"], /* CJK Ideograph */ + ["\u77C9", "\u77C9"], /* CJK Ideograph */ + ["\u77CA", "\u77CA"], /* CJK Ideograph */ + ["\u77CB", "\u77CB"], /* CJK Ideograph */ + ["\u77CC", "\u77CC"], /* CJK Ideograph */ + ["\u77CD", "\u77CD"], /* CJK Ideograph */ + ["\u77CE", "\u77CE"], /* CJK Ideograph */ + ["\u77CF", "\u77CF"], /* CJK Ideograph */ + ["\u77D0", "\u77D0"], /* CJK Ideograph */ + ["\u77D1", "\u77D1"], /* CJK Ideograph */ + ["\u77D2", "\u77D2"], /* CJK Ideograph */ + ["\u77D3", "\u77D3"], /* CJK Ideograph */ + ["\u77D4", "\u77D4"], /* CJK Ideograph */ + ["\u77D5", "\u77D5"], /* CJK Ideograph */ + ["\u77D6", "\u77D6"], /* CJK Ideograph */ + ["\u77D7", "\u77D7"], /* CJK Ideograph */ + ["\u77D8", "\u77D8"], /* CJK Ideograph */ + ["\u77D9", "\u77D9"], /* CJK Ideograph */ + ["\u77DA", "\u77DA"], /* CJK Ideograph */ + ["\u77DB", "\u77DB"], /* CJK Ideograph */ + ["\u77DC", "\u77DC"], /* CJK Ideograph */ + ["\u77DD", "\u77DD"], /* CJK Ideograph */ + ["\u77DE", "\u77DE"], /* CJK Ideograph */ + ["\u77DF", "\u77DF"], /* CJK Ideograph */ + ["\u77E0", "\u77E0"], /* CJK Ideograph */ + ["\u77E1", "\u77E1"], /* CJK Ideograph */ + ["\u77E2", "\u77E2"], /* CJK Ideograph */ + ["\u77E3", "\u77E3"], /* CJK Ideograph */ + ["\u77E4", "\u77E4"], /* CJK Ideograph */ + ["\u77E5", "\u77E5"], /* CJK Ideograph */ + ["\u77E6", "\u77E6"], /* CJK Ideograph */ + ["\u77E7", "\u77E7"], /* CJK Ideograph */ + ["\u77E8", "\u77E8"], /* CJK Ideograph */ + ["\u77E9", "\u77E9"], /* CJK Ideograph */ + ["\u77EA", "\u77EA"], /* CJK Ideograph */ + ["\u77EB", "\u77EB"], /* CJK Ideograph */ + ["\u77EC", "\u77EC"], /* CJK Ideograph */ + ["\u77ED", "\u77ED"], /* CJK Ideograph */ + ["\u77EE", "\u77EE"], /* CJK Ideograph */ + ["\u77EF", "\u77EF"], /* CJK Ideograph */ + ["\u77F0", "\u77F0"], /* CJK Ideograph */ + ["\u77F1", "\u77F1"], /* CJK Ideograph */ + ["\u77F2", "\u77F2"], /* CJK Ideograph */ + ["\u77F3", "\u77F3"], /* CJK Ideograph */ + ["\u77F4", "\u77F4"], /* CJK Ideograph */ + ["\u77F5", "\u77F5"], /* CJK Ideograph */ + ["\u77F6", "\u77F6"], /* CJK Ideograph */ + ["\u77F7", "\u77F7"], /* CJK Ideograph */ + ["\u77F8", "\u77F8"], /* CJK Ideograph */ + ["\u77F9", "\u77F9"], /* CJK Ideograph */ + ["\u77FA", "\u77FA"], /* CJK Ideograph */ + ["\u77FB", "\u77FB"], /* CJK Ideograph */ + ["\u77FC", "\u77FC"], /* CJK Ideograph */ + ["\u77FD", "\u77FD"], /* CJK Ideograph */ + ["\u77FE", "\u77FE"], /* CJK Ideograph */ + ["\u77FF", "\u77FF"], /* CJK Ideograph */ + ["\u7800", "\u7800"], /* CJK Ideograph */ + ["\u7801", "\u7801"], /* CJK Ideograph */ + ["\u7802", "\u7802"], /* CJK Ideograph */ + ["\u7803", "\u7803"], /* CJK Ideograph */ + ["\u7804", "\u7804"], /* CJK Ideograph */ + ["\u7805", "\u7805"], /* CJK Ideograph */ + ["\u7806", "\u7806"], /* CJK Ideograph */ + ["\u7807", "\u7807"], /* CJK Ideograph */ + ["\u7808", "\u7808"], /* CJK Ideograph */ + ["\u7809", "\u7809"], /* CJK Ideograph */ + ["\u780A", "\u780A"], /* CJK Ideograph */ + ["\u780B", "\u780B"], /* CJK Ideograph */ + ["\u780C", "\u780C"], /* CJK Ideograph */ + ["\u780D", "\u780D"], /* CJK Ideograph */ + ["\u780E", "\u780E"], /* CJK Ideograph */ + ["\u780F", "\u780F"], /* CJK Ideograph */ + ["\u7810", "\u7810"], /* CJK Ideograph */ + ["\u7811", "\u7811"], /* CJK Ideograph */ + ["\u7812", "\u7812"], /* CJK Ideograph */ + ["\u7813", "\u7813"], /* CJK Ideograph */ + ["\u7814", "\u7814"], /* CJK Ideograph */ + ["\u7815", "\u7815"], /* CJK Ideograph */ + ["\u7816", "\u7816"], /* CJK Ideograph */ + ["\u7817", "\u7817"], /* CJK Ideograph */ + ["\u7818", "\u7818"], /* CJK Ideograph */ + ["\u7819", "\u7819"], /* CJK Ideograph */ + ["\u781A", "\u781A"], /* CJK Ideograph */ + ["\u781B", "\u781B"], /* CJK Ideograph */ + ["\u781C", "\u781C"], /* CJK Ideograph */ + ["\u781D", "\u781D"], /* CJK Ideograph */ + ["\u781E", "\u781E"], /* CJK Ideograph */ + ["\u781F", "\u781F"], /* CJK Ideograph */ + ["\u7820", "\u7820"], /* CJK Ideograph */ + ["\u7821", "\u7821"], /* CJK Ideograph */ + ["\u7822", "\u7822"], /* CJK Ideograph */ + ["\u7823", "\u7823"], /* CJK Ideograph */ + ["\u7824", "\u7824"], /* CJK Ideograph */ + ["\u7825", "\u7825"], /* CJK Ideograph */ + ["\u7826", "\u7826"], /* CJK Ideograph */ + ["\u7827", "\u7827"], /* CJK Ideograph */ + ["\u7828", "\u7828"], /* CJK Ideograph */ + ["\u7829", "\u7829"], /* CJK Ideograph */ + ["\u782A", "\u782A"], /* CJK Ideograph */ + ["\u782B", "\u782B"], /* CJK Ideograph */ + ["\u782C", "\u782C"], /* CJK Ideograph */ + ["\u782D", "\u782D"], /* CJK Ideograph */ + ["\u782E", "\u782E"], /* CJK Ideograph */ + ["\u782F", "\u782F"], /* CJK Ideograph */ + ["\u7830", "\u7830"], /* CJK Ideograph */ + ["\u7831", "\u7831"], /* CJK Ideograph */ + ["\u7832", "\u7832"], /* CJK Ideograph */ + ["\u7833", "\u7833"], /* CJK Ideograph */ + ["\u7834", "\u7834"], /* CJK Ideograph */ + ["\u7835", "\u7835"], /* CJK Ideograph */ + ["\u7836", "\u7836"], /* CJK Ideograph */ + ["\u7837", "\u7837"], /* CJK Ideograph */ + ["\u7838", "\u7838"], /* CJK Ideograph */ + ["\u7839", "\u7839"], /* CJK Ideograph */ + ["\u783A", "\u783A"], /* CJK Ideograph */ + ["\u783B", "\u783B"], /* CJK Ideograph */ + ["\u783C", "\u783C"], /* CJK Ideograph */ + ["\u783D", "\u783D"], /* CJK Ideograph */ + ["\u783E", "\u783E"], /* CJK Ideograph */ + ["\u783F", "\u783F"], /* CJK Ideograph */ + ["\u7840", "\u7840"], /* CJK Ideograph */ + ["\u7841", "\u7841"], /* CJK Ideograph */ + ["\u7842", "\u7842"], /* CJK Ideograph */ + ["\u7843", "\u7843"], /* CJK Ideograph */ + ["\u7844", "\u7844"], /* CJK Ideograph */ + ["\u7845", "\u7845"], /* CJK Ideograph */ + ["\u7846", "\u7846"], /* CJK Ideograph */ + ["\u7847", "\u7847"], /* CJK Ideograph */ + ["\u7848", "\u7848"], /* CJK Ideograph */ + ["\u7849", "\u7849"], /* CJK Ideograph */ + ["\u784A", "\u784A"], /* CJK Ideograph */ + ["\u784B", "\u784B"], /* CJK Ideograph */ + ["\u784C", "\u784C"], /* CJK Ideograph */ + ["\u784D", "\u784D"], /* CJK Ideograph */ + ["\u784E", "\u784E"], /* CJK Ideograph */ + ["\u784F", "\u784F"], /* CJK Ideograph */ + ["\u7850", "\u7850"], /* CJK Ideograph */ + ["\u7851", "\u7851"], /* CJK Ideograph */ + ["\u7852", "\u7852"], /* CJK Ideograph */ + ["\u7853", "\u7853"], /* CJK Ideograph */ + ["\u7854", "\u7854"], /* CJK Ideograph */ + ["\u7855", "\u7855"], /* CJK Ideograph */ + ["\u7856", "\u7856"], /* CJK Ideograph */ + ["\u7857", "\u7857"], /* CJK Ideograph */ + ["\u7858", "\u7858"], /* CJK Ideograph */ + ["\u7859", "\u7859"], /* CJK Ideograph */ + ["\u785A", "\u785A"], /* CJK Ideograph */ + ["\u785B", "\u785B"], /* CJK Ideograph */ + ["\u785C", "\u785C"], /* CJK Ideograph */ + ["\u785D", "\u785D"], /* CJK Ideograph */ + ["\u785E", "\u785E"], /* CJK Ideograph */ + ["\u785F", "\u785F"], /* CJK Ideograph */ + ["\u7860", "\u7860"], /* CJK Ideograph */ + ["\u7861", "\u7861"], /* CJK Ideograph */ + ["\u7862", "\u7862"], /* CJK Ideograph */ + ["\u7863", "\u7863"], /* CJK Ideograph */ + ["\u7864", "\u7864"], /* CJK Ideograph */ + ["\u7865", "\u7865"], /* CJK Ideograph */ + ["\u7866", "\u7866"], /* CJK Ideograph */ + ["\u7867", "\u7867"], /* CJK Ideograph */ + ["\u7868", "\u7868"], /* CJK Ideograph */ + ["\u7869", "\u7869"], /* CJK Ideograph */ + ["\u786A", "\u786A"], /* CJK Ideograph */ + ["\u786B", "\u786B"], /* CJK Ideograph */ + ["\u786C", "\u786C"], /* CJK Ideograph */ + ["\u786D", "\u786D"], /* CJK Ideograph */ + ["\u786E", "\u786E"], /* CJK Ideograph */ + ["\u786F", "\u786F"], /* CJK Ideograph */ + ["\u7870", "\u7870"], /* CJK Ideograph */ + ["\u7871", "\u7871"], /* CJK Ideograph */ + ["\u7872", "\u7872"], /* CJK Ideograph */ + ["\u7873", "\u7873"], /* CJK Ideograph */ + ["\u7874", "\u7874"], /* CJK Ideograph */ + ["\u7875", "\u7875"], /* CJK Ideograph */ + ["\u7876", "\u7876"], /* CJK Ideograph */ + ["\u7877", "\u7877"], /* CJK Ideograph */ + ["\u7878", "\u7878"], /* CJK Ideograph */ + ["\u7879", "\u7879"], /* CJK Ideograph */ + ["\u787A", "\u787A"], /* CJK Ideograph */ + ["\u787B", "\u787B"], /* CJK Ideograph */ + ["\u787C", "\u787C"], /* CJK Ideograph */ + ["\u787D", "\u787D"], /* CJK Ideograph */ + ["\u787E", "\u787E"], /* CJK Ideograph */ + ["\u787F", "\u787F"], /* CJK Ideograph */ + ["\u7880", "\u7880"], /* CJK Ideograph */ + ["\u7881", "\u7881"], /* CJK Ideograph */ + ["\u7882", "\u7882"], /* CJK Ideograph */ + ["\u7883", "\u7883"], /* CJK Ideograph */ + ["\u7884", "\u7884"], /* CJK Ideograph */ + ["\u7885", "\u7885"], /* CJK Ideograph */ + ["\u7886", "\u7886"], /* CJK Ideograph */ + ["\u7887", "\u7887"], /* CJK Ideograph */ + ["\u7888", "\u7888"], /* CJK Ideograph */ + ["\u7889", "\u7889"], /* CJK Ideograph */ + ["\u788A", "\u788A"], /* CJK Ideograph */ + ["\u788B", "\u788B"], /* CJK Ideograph */ + ["\u788C", "\u788C"], /* CJK Ideograph */ + ["\u788D", "\u788D"], /* CJK Ideograph */ + ["\u788E", "\u788E"], /* CJK Ideograph */ + ["\u788F", "\u788F"], /* CJK Ideograph */ + ["\u7890", "\u7890"], /* CJK Ideograph */ + ["\u7891", "\u7891"], /* CJK Ideograph */ + ["\u7892", "\u7892"], /* CJK Ideograph */ + ["\u7893", "\u7893"], /* CJK Ideograph */ + ["\u7894", "\u7894"], /* CJK Ideograph */ + ["\u7895", "\u7895"], /* CJK Ideograph */ + ["\u7896", "\u7896"], /* CJK Ideograph */ + ["\u7897", "\u7897"], /* CJK Ideograph */ + ["\u7898", "\u7898"], /* CJK Ideograph */ + ["\u7899", "\u7899"], /* CJK Ideograph */ + ["\u789A", "\u789A"], /* CJK Ideograph */ + ["\u789B", "\u789B"], /* CJK Ideograph */ + ["\u789C", "\u789C"], /* CJK Ideograph */ + ["\u789D", "\u789D"], /* CJK Ideograph */ + ["\u789E", "\u789E"], /* CJK Ideograph */ + ["\u789F", "\u789F"], /* CJK Ideograph */ + ["\u78A0", "\u78A0"], /* CJK Ideograph */ + ["\u78A1", "\u78A1"], /* CJK Ideograph */ + ["\u78A2", "\u78A2"], /* CJK Ideograph */ + ["\u78A3", "\u78A3"], /* CJK Ideograph */ + ["\u78A4", "\u78A4"], /* CJK Ideograph */ + ["\u78A5", "\u78A5"], /* CJK Ideograph */ + ["\u78A6", "\u78A6"], /* CJK Ideograph */ + ["\u78A7", "\u78A7"], /* CJK Ideograph */ + ["\u78A8", "\u78A8"], /* CJK Ideograph */ + ["\u78A9", "\u78A9"], /* CJK Ideograph */ + ["\u78AA", "\u78AA"], /* CJK Ideograph */ + ["\u78AB", "\u78AB"], /* CJK Ideograph */ + ["\u78AC", "\u78AC"], /* CJK Ideograph */ + ["\u78AD", "\u78AD"], /* CJK Ideograph */ + ["\u78AE", "\u78AE"], /* CJK Ideograph */ + ["\u78AF", "\u78AF"], /* CJK Ideograph */ + ["\u78B0", "\u78B0"], /* CJK Ideograph */ + ["\u78B1", "\u78B1"], /* CJK Ideograph */ + ["\u78B2", "\u78B2"], /* CJK Ideograph */ + ["\u78B3", "\u78B3"], /* CJK Ideograph */ + ["\u78B4", "\u78B4"], /* CJK Ideograph */ + ["\u78B5", "\u78B5"], /* CJK Ideograph */ + ["\u78B6", "\u78B6"], /* CJK Ideograph */ + ["\u78B7", "\u78B7"], /* CJK Ideograph */ + ["\u78B8", "\u78B8"], /* CJK Ideograph */ + ["\u78B9", "\u78B9"], /* CJK Ideograph */ + ["\u78BA", "\u78BA"], /* CJK Ideograph */ + ["\u78BB", "\u78BB"], /* CJK Ideograph */ + ["\u78BC", "\u78BC"], /* CJK Ideograph */ + ["\u78BD", "\u78BD"], /* CJK Ideograph */ + ["\u78BE", "\u78BE"], /* CJK Ideograph */ + ["\u78BF", "\u78BF"], /* CJK Ideograph */ + ["\u78C0", "\u78C0"], /* CJK Ideograph */ + ["\u78C1", "\u78C1"], /* CJK Ideograph */ + ["\u78C2", "\u78C2"], /* CJK Ideograph */ + ["\u78C3", "\u78C3"], /* CJK Ideograph */ + ["\u78C4", "\u78C4"], /* CJK Ideograph */ + ["\u78C5", "\u78C5"], /* CJK Ideograph */ + ["\u78C6", "\u78C6"], /* CJK Ideograph */ + ["\u78C7", "\u78C7"], /* CJK Ideograph */ + ["\u78C8", "\u78C8"], /* CJK Ideograph */ + ["\u78C9", "\u78C9"], /* CJK Ideograph */ + ["\u78CA", "\u78CA"], /* CJK Ideograph */ + ["\u78CB", "\u78CB"], /* CJK Ideograph */ + ["\u78CC", "\u78CC"], /* CJK Ideograph */ + ["\u78CD", "\u78CD"], /* CJK Ideograph */ + ["\u78CE", "\u78CE"], /* CJK Ideograph */ + ["\u78CF", "\u78CF"], /* CJK Ideograph */ + ["\u78D0", "\u78D0"], /* CJK Ideograph */ + ["\u78D1", "\u78D1"], /* CJK Ideograph */ + ["\u78D2", "\u78D2"], /* CJK Ideograph */ + ["\u78D3", "\u78D3"], /* CJK Ideograph */ + ["\u78D4", "\u78D4"], /* CJK Ideograph */ + ["\u78D5", "\u78D5"], /* CJK Ideograph */ + ["\u78D6", "\u78D6"], /* CJK Ideograph */ + ["\u78D7", "\u78D7"], /* CJK Ideograph */ + ["\u78D8", "\u78D8"], /* CJK Ideograph */ + ["\u78D9", "\u78D9"], /* CJK Ideograph */ + ["\u78DA", "\u78DA"], /* CJK Ideograph */ + ["\u78DB", "\u78DB"], /* CJK Ideograph */ + ["\u78DC", "\u78DC"], /* CJK Ideograph */ + ["\u78DD", "\u78DD"], /* CJK Ideograph */ + ["\u78DE", "\u78DE"], /* CJK Ideograph */ + ["\u78DF", "\u78DF"], /* CJK Ideograph */ + ["\u78E0", "\u78E0"], /* CJK Ideograph */ + ["\u78E1", "\u78E1"], /* CJK Ideograph */ + ["\u78E2", "\u78E2"], /* CJK Ideograph */ + ["\u78E3", "\u78E3"], /* CJK Ideograph */ + ["\u78E4", "\u78E4"], /* CJK Ideograph */ + ["\u78E5", "\u78E5"], /* CJK Ideograph */ + ["\u78E6", "\u78E6"], /* CJK Ideograph */ + ["\u78E7", "\u78E7"], /* CJK Ideograph */ + ["\u78E8", "\u78E8"], /* CJK Ideograph */ + ["\u78E9", "\u78E9"], /* CJK Ideograph */ + ["\u78EA", "\u78EA"], /* CJK Ideograph */ + ["\u78EB", "\u78EB"], /* CJK Ideograph */ + ["\u78EC", "\u78EC"], /* CJK Ideograph */ + ["\u78ED", "\u78ED"], /* CJK Ideograph */ + ["\u78EE", "\u78EE"], /* CJK Ideograph */ + ["\u78EF", "\u78EF"], /* CJK Ideograph */ + ["\u78F0", "\u78F0"], /* CJK Ideograph */ + ["\u78F1", "\u78F1"], /* CJK Ideograph */ + ["\u78F2", "\u78F2"], /* CJK Ideograph */ + ["\u78F3", "\u78F3"], /* CJK Ideograph */ + ["\u78F4", "\u78F4"], /* CJK Ideograph */ + ["\u78F5", "\u78F5"], /* CJK Ideograph */ + ["\u78F6", "\u78F6"], /* CJK Ideograph */ + ["\u78F7", "\u78F7"], /* CJK Ideograph */ + ["\u78F8", "\u78F8"], /* CJK Ideograph */ + ["\u78F9", "\u78F9"], /* CJK Ideograph */ + ["\u78FA", "\u78FA"], /* CJK Ideograph */ + ["\u78FB", "\u78FB"], /* CJK Ideograph */ + ["\u78FC", "\u78FC"], /* CJK Ideograph */ + ["\u78FD", "\u78FD"], /* CJK Ideograph */ + ["\u78FE", "\u78FE"], /* CJK Ideograph */ + ["\u78FF", "\u78FF"], /* CJK Ideograph */ + ["\u7900", "\u7900"], /* CJK Ideograph */ + ["\u7901", "\u7901"], /* CJK Ideograph */ + ["\u7902", "\u7902"], /* CJK Ideograph */ + ["\u7903", "\u7903"], /* CJK Ideograph */ + ["\u7904", "\u7904"], /* CJK Ideograph */ + ["\u7905", "\u7905"], /* CJK Ideograph */ + ["\u7906", "\u7906"], /* CJK Ideograph */ + ["\u7907", "\u7907"], /* CJK Ideograph */ + ["\u7908", "\u7908"], /* CJK Ideograph */ + ["\u7909", "\u7909"], /* CJK Ideograph */ + ["\u790A", "\u790A"], /* CJK Ideograph */ + ["\u790B", "\u790B"], /* CJK Ideograph */ + ["\u790C", "\u790C"], /* CJK Ideograph */ + ["\u790D", "\u790D"], /* CJK Ideograph */ + ["\u790E", "\u790E"], /* CJK Ideograph */ + ["\u790F", "\u790F"], /* CJK Ideograph */ + ["\u7910", "\u7910"], /* CJK Ideograph */ + ["\u7911", "\u7911"], /* CJK Ideograph */ + ["\u7912", "\u7912"], /* CJK Ideograph */ + ["\u7913", "\u7913"], /* CJK Ideograph */ + ["\u7914", "\u7914"], /* CJK Ideograph */ + ["\u7915", "\u7915"], /* CJK Ideograph */ + ["\u7916", "\u7916"], /* CJK Ideograph */ + ["\u7917", "\u7917"], /* CJK Ideograph */ + ["\u7918", "\u7918"], /* CJK Ideograph */ + ["\u7919", "\u7919"], /* CJK Ideograph */ + ["\u791A", "\u791A"], /* CJK Ideograph */ + ["\u791B", "\u791B"], /* CJK Ideograph */ + ["\u791C", "\u791C"], /* CJK Ideograph */ + ["\u791D", "\u791D"], /* CJK Ideograph */ + ["\u791E", "\u791E"], /* CJK Ideograph */ + ["\u791F", "\u791F"], /* CJK Ideograph */ + ["\u7920", "\u7920"], /* CJK Ideograph */ + ["\u7921", "\u7921"], /* CJK Ideograph */ + ["\u7922", "\u7922"], /* CJK Ideograph */ + ["\u7923", "\u7923"], /* CJK Ideograph */ + ["\u7924", "\u7924"], /* CJK Ideograph */ + ["\u7925", "\u7925"], /* CJK Ideograph */ + ["\u7926", "\u7926"], /* CJK Ideograph */ + ["\u7927", "\u7927"], /* CJK Ideograph */ + ["\u7928", "\u7928"], /* CJK Ideograph */ + ["\u7929", "\u7929"], /* CJK Ideograph */ + ["\u792A", "\u792A"], /* CJK Ideograph */ + ["\u792B", "\u792B"], /* CJK Ideograph */ + ["\u792C", "\u792C"], /* CJK Ideograph */ + ["\u792D", "\u792D"], /* CJK Ideograph */ + ["\u792E", "\u792E"], /* CJK Ideograph */ + ["\u792F", "\u792F"], /* CJK Ideograph */ + ["\u7930", "\u7930"], /* CJK Ideograph */ + ["\u7931", "\u7931"], /* CJK Ideograph */ + ["\u7932", "\u7932"], /* CJK Ideograph */ + ["\u7933", "\u7933"], /* CJK Ideograph */ + ["\u7934", "\u7934"], /* CJK Ideograph */ + ["\u7935", "\u7935"], /* CJK Ideograph */ + ["\u7936", "\u7936"], /* CJK Ideograph */ + ["\u7937", "\u7937"], /* CJK Ideograph */ + ["\u7938", "\u7938"], /* CJK Ideograph */ + ["\u7939", "\u7939"], /* CJK Ideograph */ + ["\u793A", "\u793A"], /* CJK Ideograph */ + ["\u793B", "\u793B"], /* CJK Ideograph */ + ["\u793C", "\u793C"], /* CJK Ideograph */ + ["\u793D", "\u793D"], /* CJK Ideograph */ + ["\u793E", "\u793E"], /* CJK Ideograph */ + ["\u793F", "\u793F"], /* CJK Ideograph */ + ["\u7940", "\u7940"], /* CJK Ideograph */ + ["\u7941", "\u7941"], /* CJK Ideograph */ + ["\u7942", "\u7942"], /* CJK Ideograph */ + ["\u7943", "\u7943"], /* CJK Ideograph */ + ["\u7944", "\u7944"], /* CJK Ideograph */ + ["\u7945", "\u7945"], /* CJK Ideograph */ + ["\u7946", "\u7946"], /* CJK Ideograph */ + ["\u7947", "\u7947"], /* CJK Ideograph */ + ["\u7948", "\u7948"], /* CJK Ideograph */ + ["\u7949", "\u7949"], /* CJK Ideograph */ + ["\u794A", "\u794A"], /* CJK Ideograph */ + ["\u794B", "\u794B"], /* CJK Ideograph */ + ["\u794C", "\u794C"], /* CJK Ideograph */ + ["\u794D", "\u794D"], /* CJK Ideograph */ + ["\u794E", "\u794E"], /* CJK Ideograph */ + ["\u794F", "\u794F"], /* CJK Ideograph */ + ["\u7950", "\u7950"], /* CJK Ideograph */ + ["\u7951", "\u7951"], /* CJK Ideograph */ + ["\u7952", "\u7952"], /* CJK Ideograph */ + ["\u7953", "\u7953"], /* CJK Ideograph */ + ["\u7954", "\u7954"], /* CJK Ideograph */ + ["\u7955", "\u7955"], /* CJK Ideograph */ + ["\u7956", "\u7956"], /* CJK Ideograph */ + ["\u7957", "\u7957"], /* CJK Ideograph */ + ["\u7958", "\u7958"], /* CJK Ideograph */ + ["\u7959", "\u7959"], /* CJK Ideograph */ + ["\u795A", "\u795A"], /* CJK Ideograph */ + ["\u795B", "\u795B"], /* CJK Ideograph */ + ["\u795C", "\u795C"], /* CJK Ideograph */ + ["\u795D", "\u795D"], /* CJK Ideograph */ + ["\u795E", "\u795E"], /* CJK Ideograph */ + ["\u795F", "\u795F"], /* CJK Ideograph */ + ["\u7960", "\u7960"], /* CJK Ideograph */ + ["\u7961", "\u7961"], /* CJK Ideograph */ + ["\u7962", "\u7962"], /* CJK Ideograph */ + ["\u7963", "\u7963"], /* CJK Ideograph */ + ["\u7964", "\u7964"], /* CJK Ideograph */ + ["\u7965", "\u7965"], /* CJK Ideograph */ + ["\u7966", "\u7966"], /* CJK Ideograph */ + ["\u7967", "\u7967"], /* CJK Ideograph */ + ["\u7968", "\u7968"], /* CJK Ideograph */ + ["\u7969", "\u7969"], /* CJK Ideograph */ + ["\u796A", "\u796A"], /* CJK Ideograph */ + ["\u796B", "\u796B"], /* CJK Ideograph */ + ["\u796C", "\u796C"], /* CJK Ideograph */ + ["\u796D", "\u796D"], /* CJK Ideograph */ + ["\u796E", "\u796E"], /* CJK Ideograph */ + ["\u796F", "\u796F"], /* CJK Ideograph */ + ["\u7970", "\u7970"], /* CJK Ideograph */ + ["\u7971", "\u7971"], /* CJK Ideograph */ + ["\u7972", "\u7972"], /* CJK Ideograph */ + ["\u7973", "\u7973"], /* CJK Ideograph */ + ["\u7974", "\u7974"], /* CJK Ideograph */ + ["\u7975", "\u7975"], /* CJK Ideograph */ + ["\u7976", "\u7976"], /* CJK Ideograph */ + ["\u7977", "\u7977"], /* CJK Ideograph */ + ["\u7978", "\u7978"], /* CJK Ideograph */ + ["\u7979", "\u7979"], /* CJK Ideograph */ + ["\u797A", "\u797A"], /* CJK Ideograph */ + ["\u797B", "\u797B"], /* CJK Ideograph */ + ["\u797C", "\u797C"], /* CJK Ideograph */ + ["\u797D", "\u797D"], /* CJK Ideograph */ + ["\u797E", "\u797E"], /* CJK Ideograph */ + ["\u797F", "\u797F"], /* CJK Ideograph */ + ["\u7980", "\u7980"], /* CJK Ideograph */ + ["\u7981", "\u7981"], /* CJK Ideograph */ + ["\u7982", "\u7982"], /* CJK Ideograph */ + ["\u7983", "\u7983"], /* CJK Ideograph */ + ["\u7984", "\u7984"], /* CJK Ideograph */ + ["\u7985", "\u7985"], /* CJK Ideograph */ + ["\u7986", "\u7986"], /* CJK Ideograph */ + ["\u7987", "\u7987"], /* CJK Ideograph */ + ["\u7988", "\u7988"], /* CJK Ideograph */ + ["\u7989", "\u7989"], /* CJK Ideograph */ + ["\u798A", "\u798A"], /* CJK Ideograph */ + ["\u798B", "\u798B"], /* CJK Ideograph */ + ["\u798C", "\u798C"], /* CJK Ideograph */ + ["\u798D", "\u798D"], /* CJK Ideograph */ + ["\u798E", "\u798E"], /* CJK Ideograph */ + ["\u798F", "\u798F"], /* CJK Ideograph */ + ["\u7990", "\u7990"], /* CJK Ideograph */ + ["\u7991", "\u7991"], /* CJK Ideograph */ + ["\u7992", "\u7992"], /* CJK Ideograph */ + ["\u7993", "\u7993"], /* CJK Ideograph */ + ["\u7994", "\u7994"], /* CJK Ideograph */ + ["\u7995", "\u7995"], /* CJK Ideograph */ + ["\u7996", "\u7996"], /* CJK Ideograph */ + ["\u7997", "\u7997"], /* CJK Ideograph */ + ["\u7998", "\u7998"], /* CJK Ideograph */ + ["\u7999", "\u7999"], /* CJK Ideograph */ + ["\u799A", "\u799A"], /* CJK Ideograph */ + ["\u799B", "\u799B"], /* CJK Ideograph */ + ["\u799C", "\u799C"], /* CJK Ideograph */ + ["\u799D", "\u799D"], /* CJK Ideograph */ + ["\u799E", "\u799E"], /* CJK Ideograph */ + ["\u799F", "\u799F"], /* CJK Ideograph */ + ["\u79A0", "\u79A0"], /* CJK Ideograph */ + ["\u79A1", "\u79A1"], /* CJK Ideograph */ + ["\u79A2", "\u79A2"], /* CJK Ideograph */ + ["\u79A3", "\u79A3"], /* CJK Ideograph */ + ["\u79A4", "\u79A4"], /* CJK Ideograph */ + ["\u79A5", "\u79A5"], /* CJK Ideograph */ + ["\u79A6", "\u79A6"], /* CJK Ideograph */ + ["\u79A7", "\u79A7"], /* CJK Ideograph */ + ["\u79A8", "\u79A8"], /* CJK Ideograph */ + ["\u79A9", "\u79A9"], /* CJK Ideograph */ + ["\u79AA", "\u79AA"], /* CJK Ideograph */ + ["\u79AB", "\u79AB"], /* CJK Ideograph */ + ["\u79AC", "\u79AC"], /* CJK Ideograph */ + ["\u79AD", "\u79AD"], /* CJK Ideograph */ + ["\u79AE", "\u79AE"], /* CJK Ideograph */ + ["\u79AF", "\u79AF"], /* CJK Ideograph */ + ["\u79B0", "\u79B0"], /* CJK Ideograph */ + ["\u79B1", "\u79B1"], /* CJK Ideograph */ + ["\u79B2", "\u79B2"], /* CJK Ideograph */ + ["\u79B3", "\u79B3"], /* CJK Ideograph */ + ["\u79B4", "\u79B4"], /* CJK Ideograph */ + ["\u79B5", "\u79B5"], /* CJK Ideograph */ + ["\u79B6", "\u79B6"], /* CJK Ideograph */ + ["\u79B7", "\u79B7"], /* CJK Ideograph */ + ["\u79B8", "\u79B8"], /* CJK Ideograph */ + ["\u79B9", "\u79B9"], /* CJK Ideograph */ + ["\u79BA", "\u79BA"], /* CJK Ideograph */ + ["\u79BB", "\u79BB"], /* CJK Ideograph */ + ["\u79BC", "\u79BC"], /* CJK Ideograph */ + ["\u79BD", "\u79BD"], /* CJK Ideograph */ + ["\u79BE", "\u79BE"], /* CJK Ideograph */ + ["\u79BF", "\u79BF"], /* CJK Ideograph */ + ["\u79C0", "\u79C0"], /* CJK Ideograph */ + ["\u79C1", "\u79C1"], /* CJK Ideograph */ + ["\u79C2", "\u79C2"], /* CJK Ideograph */ + ["\u79C3", "\u79C3"], /* CJK Ideograph */ + ["\u79C4", "\u79C4"], /* CJK Ideograph */ + ["\u79C5", "\u79C5"], /* CJK Ideograph */ + ["\u79C6", "\u79C6"], /* CJK Ideograph */ + ["\u79C7", "\u79C7"], /* CJK Ideograph */ + ["\u79C8", "\u79C8"], /* CJK Ideograph */ + ["\u79C9", "\u79C9"], /* CJK Ideograph */ + ["\u79CA", "\u79CA"], /* CJK Ideograph */ + ["\u79CB", "\u79CB"], /* CJK Ideograph */ + ["\u79CC", "\u79CC"], /* CJK Ideograph */ + ["\u79CD", "\u79CD"], /* CJK Ideograph */ + ["\u79CE", "\u79CE"], /* CJK Ideograph */ + ["\u79CF", "\u79CF"], /* CJK Ideograph */ + ["\u79D0", "\u79D0"], /* CJK Ideograph */ + ["\u79D1", "\u79D1"], /* CJK Ideograph */ + ["\u79D2", "\u79D2"], /* CJK Ideograph */ + ["\u79D3", "\u79D3"], /* CJK Ideograph */ + ["\u79D4", "\u79D4"], /* CJK Ideograph */ + ["\u79D5", "\u79D5"], /* CJK Ideograph */ + ["\u79D6", "\u79D6"], /* CJK Ideograph */ + ["\u79D7", "\u79D7"], /* CJK Ideograph */ + ["\u79D8", "\u79D8"], /* CJK Ideograph */ + ["\u79D9", "\u79D9"], /* CJK Ideograph */ + ["\u79DA", "\u79DA"], /* CJK Ideograph */ + ["\u79DB", "\u79DB"], /* CJK Ideograph */ + ["\u79DC", "\u79DC"], /* CJK Ideograph */ + ["\u79DD", "\u79DD"], /* CJK Ideograph */ + ["\u79DE", "\u79DE"], /* CJK Ideograph */ + ["\u79DF", "\u79DF"], /* CJK Ideograph */ + ["\u79E0", "\u79E0"], /* CJK Ideograph */ + ["\u79E1", "\u79E1"], /* CJK Ideograph */ + ["\u79E2", "\u79E2"], /* CJK Ideograph */ + ["\u79E3", "\u79E3"], /* CJK Ideograph */ + ["\u79E4", "\u79E4"], /* CJK Ideograph */ + ["\u79E5", "\u79E5"], /* CJK Ideograph */ + ["\u79E6", "\u79E6"], /* CJK Ideograph */ + ["\u79E7", "\u79E7"], /* CJK Ideograph */ + ["\u79E8", "\u79E8"], /* CJK Ideograph */ + ["\u79E9", "\u79E9"], /* CJK Ideograph */ + ["\u79EA", "\u79EA"], /* CJK Ideograph */ + ["\u79EB", "\u79EB"], /* CJK Ideograph */ + ["\u79EC", "\u79EC"], /* CJK Ideograph */ + ["\u79ED", "\u79ED"], /* CJK Ideograph */ + ["\u79EE", "\u79EE"], /* CJK Ideograph */ + ["\u79EF", "\u79EF"], /* CJK Ideograph */ + ["\u79F0", "\u79F0"], /* CJK Ideograph */ + ["\u79F1", "\u79F1"], /* CJK Ideograph */ + ["\u79F2", "\u79F2"], /* CJK Ideograph */ + ["\u79F3", "\u79F3"], /* CJK Ideograph */ + ["\u79F4", "\u79F4"], /* CJK Ideograph */ + ["\u79F5", "\u79F5"], /* CJK Ideograph */ + ["\u79F6", "\u79F6"], /* CJK Ideograph */ + ["\u79F7", "\u79F7"], /* CJK Ideograph */ + ["\u79F8", "\u79F8"], /* CJK Ideograph */ + ["\u79F9", "\u79F9"], /* CJK Ideograph */ + ["\u79FA", "\u79FA"], /* CJK Ideograph */ + ["\u79FB", "\u79FB"], /* CJK Ideograph */ + ["\u79FC", "\u79FC"], /* CJK Ideograph */ + ["\u79FD", "\u79FD"], /* CJK Ideograph */ + ["\u79FE", "\u79FE"], /* CJK Ideograph */ + ["\u79FF", "\u79FF"], /* CJK Ideograph */ + ["\u7A00", "\u7A00"], /* CJK Ideograph */ + ["\u7A01", "\u7A01"], /* CJK Ideograph */ + ["\u7A02", "\u7A02"], /* CJK Ideograph */ + ["\u7A03", "\u7A03"], /* CJK Ideograph */ + ["\u7A04", "\u7A04"], /* CJK Ideograph */ + ["\u7A05", "\u7A05"], /* CJK Ideograph */ + ["\u7A06", "\u7A06"], /* CJK Ideograph */ + ["\u7A07", "\u7A07"], /* CJK Ideograph */ + ["\u7A08", "\u7A08"], /* CJK Ideograph */ + ["\u7A09", "\u7A09"], /* CJK Ideograph */ + ["\u7A0A", "\u7A0A"], /* CJK Ideograph */ + ["\u7A0B", "\u7A0B"], /* CJK Ideograph */ + ["\u7A0C", "\u7A0C"], /* CJK Ideograph */ + ["\u7A0D", "\u7A0D"], /* CJK Ideograph */ + ["\u7A0E", "\u7A0E"], /* CJK Ideograph */ + ["\u7A0F", "\u7A0F"], /* CJK Ideograph */ + ["\u7A10", "\u7A10"], /* CJK Ideograph */ + ["\u7A11", "\u7A11"], /* CJK Ideograph */ + ["\u7A12", "\u7A12"], /* CJK Ideograph */ + ["\u7A13", "\u7A13"], /* CJK Ideograph */ + ["\u7A14", "\u7A14"], /* CJK Ideograph */ + ["\u7A15", "\u7A15"], /* CJK Ideograph */ + ["\u7A16", "\u7A16"], /* CJK Ideograph */ + ["\u7A17", "\u7A17"], /* CJK Ideograph */ + ["\u7A18", "\u7A18"], /* CJK Ideograph */ + ["\u7A19", "\u7A19"], /* CJK Ideograph */ + ["\u7A1A", "\u7A1A"], /* CJK Ideograph */ + ["\u7A1B", "\u7A1B"], /* CJK Ideograph */ + ["\u7A1C", "\u7A1C"], /* CJK Ideograph */ + ["\u7A1D", "\u7A1D"], /* CJK Ideograph */ + ["\u7A1E", "\u7A1E"], /* CJK Ideograph */ + ["\u7A1F", "\u7A1F"], /* CJK Ideograph */ + ["\u7A20", "\u7A20"], /* CJK Ideograph */ + ["\u7A21", "\u7A21"], /* CJK Ideograph */ + ["\u7A22", "\u7A22"], /* CJK Ideograph */ + ["\u7A23", "\u7A23"], /* CJK Ideograph */ + ["\u7A24", "\u7A24"], /* CJK Ideograph */ + ["\u7A25", "\u7A25"], /* CJK Ideograph */ + ["\u7A26", "\u7A26"], /* CJK Ideograph */ + ["\u7A27", "\u7A27"], /* CJK Ideograph */ + ["\u7A28", "\u7A28"], /* CJK Ideograph */ + ["\u7A29", "\u7A29"], /* CJK Ideograph */ + ["\u7A2A", "\u7A2A"], /* CJK Ideograph */ + ["\u7A2B", "\u7A2B"], /* CJK Ideograph */ + ["\u7A2C", "\u7A2C"], /* CJK Ideograph */ + ["\u7A2D", "\u7A2D"], /* CJK Ideograph */ + ["\u7A2E", "\u7A2E"], /* CJK Ideograph */ + ["\u7A2F", "\u7A2F"], /* CJK Ideograph */ + ["\u7A30", "\u7A30"], /* CJK Ideograph */ + ["\u7A31", "\u7A31"], /* CJK Ideograph */ + ["\u7A32", "\u7A32"], /* CJK Ideograph */ + ["\u7A33", "\u7A33"], /* CJK Ideograph */ + ["\u7A34", "\u7A34"], /* CJK Ideograph */ + ["\u7A35", "\u7A35"], /* CJK Ideograph */ + ["\u7A36", "\u7A36"], /* CJK Ideograph */ + ["\u7A37", "\u7A37"], /* CJK Ideograph */ + ["\u7A38", "\u7A38"], /* CJK Ideograph */ + ["\u7A39", "\u7A39"], /* CJK Ideograph */ + ["\u7A3A", "\u7A3A"], /* CJK Ideograph */ + ["\u7A3B", "\u7A3B"], /* CJK Ideograph */ + ["\u7A3C", "\u7A3C"], /* CJK Ideograph */ + ["\u7A3D", "\u7A3D"], /* CJK Ideograph */ + ["\u7A3E", "\u7A3E"], /* CJK Ideograph */ + ["\u7A3F", "\u7A3F"], /* CJK Ideograph */ + ["\u7A40", "\u7A40"], /* CJK Ideograph */ + ["\u7A41", "\u7A41"], /* CJK Ideograph */ + ["\u7A42", "\u7A42"], /* CJK Ideograph */ + ["\u7A43", "\u7A43"], /* CJK Ideograph */ + ["\u7A44", "\u7A44"], /* CJK Ideograph */ + ["\u7A45", "\u7A45"], /* CJK Ideograph */ + ["\u7A46", "\u7A46"], /* CJK Ideograph */ + ["\u7A47", "\u7A47"], /* CJK Ideograph */ + ["\u7A48", "\u7A48"], /* CJK Ideograph */ + ["\u7A49", "\u7A49"], /* CJK Ideograph */ + ["\u7A4A", "\u7A4A"], /* CJK Ideograph */ + ["\u7A4B", "\u7A4B"], /* CJK Ideograph */ + ["\u7A4C", "\u7A4C"], /* CJK Ideograph */ + ["\u7A4D", "\u7A4D"], /* CJK Ideograph */ + ["\u7A4E", "\u7A4E"], /* CJK Ideograph */ + ["\u7A4F", "\u7A4F"], /* CJK Ideograph */ + ["\u7A50", "\u7A50"], /* CJK Ideograph */ + ["\u7A51", "\u7A51"], /* CJK Ideograph */ + ["\u7A52", "\u7A52"], /* CJK Ideograph */ + ["\u7A53", "\u7A53"], /* CJK Ideograph */ + ["\u7A54", "\u7A54"], /* CJK Ideograph */ + ["\u7A55", "\u7A55"], /* CJK Ideograph */ + ["\u7A56", "\u7A56"], /* CJK Ideograph */ + ["\u7A57", "\u7A57"], /* CJK Ideograph */ + ["\u7A58", "\u7A58"], /* CJK Ideograph */ + ["\u7A59", "\u7A59"], /* CJK Ideograph */ + ["\u7A5A", "\u7A5A"], /* CJK Ideograph */ + ["\u7A5B", "\u7A5B"], /* CJK Ideograph */ + ["\u7A5C", "\u7A5C"], /* CJK Ideograph */ + ["\u7A5D", "\u7A5D"], /* CJK Ideograph */ + ["\u7A5E", "\u7A5E"], /* CJK Ideograph */ + ["\u7A5F", "\u7A5F"], /* CJK Ideograph */ + ["\u7A60", "\u7A60"], /* CJK Ideograph */ + ["\u7A61", "\u7A61"], /* CJK Ideograph */ + ["\u7A62", "\u7A62"], /* CJK Ideograph */ + ["\u7A63", "\u7A63"], /* CJK Ideograph */ + ["\u7A64", "\u7A64"], /* CJK Ideograph */ + ["\u7A65", "\u7A65"], /* CJK Ideograph */ + ["\u7A66", "\u7A66"], /* CJK Ideograph */ + ["\u7A67", "\u7A67"], /* CJK Ideograph */ + ["\u7A68", "\u7A68"], /* CJK Ideograph */ + ["\u7A69", "\u7A69"], /* CJK Ideograph */ + ["\u7A6A", "\u7A6A"], /* CJK Ideograph */ + ["\u7A6B", "\u7A6B"], /* CJK Ideograph */ + ["\u7A6C", "\u7A6C"], /* CJK Ideograph */ + ["\u7A6D", "\u7A6D"], /* CJK Ideograph */ + ["\u7A6E", "\u7A6E"], /* CJK Ideograph */ + ["\u7A6F", "\u7A6F"], /* CJK Ideograph */ + ["\u7A70", "\u7A70"], /* CJK Ideograph */ + ["\u7A71", "\u7A71"], /* CJK Ideograph */ + ["\u7A72", "\u7A72"], /* CJK Ideograph */ + ["\u7A73", "\u7A73"], /* CJK Ideograph */ + ["\u7A74", "\u7A74"], /* CJK Ideograph */ + ["\u7A75", "\u7A75"], /* CJK Ideograph */ + ["\u7A76", "\u7A76"], /* CJK Ideograph */ + ["\u7A77", "\u7A77"], /* CJK Ideograph */ + ["\u7A78", "\u7A78"], /* CJK Ideograph */ + ["\u7A79", "\u7A79"], /* CJK Ideograph */ + ["\u7A7A", "\u7A7A"], /* CJK Ideograph */ + ["\u7A7B", "\u7A7B"], /* CJK Ideograph */ + ["\u7A7C", "\u7A7C"], /* CJK Ideograph */ + ["\u7A7D", "\u7A7D"], /* CJK Ideograph */ + ["\u7A7E", "\u7A7E"], /* CJK Ideograph */ + ["\u7A7F", "\u7A7F"], /* CJK Ideograph */ + ["\u7A80", "\u7A80"], /* CJK Ideograph */ + ["\u7A81", "\u7A81"], /* CJK Ideograph */ + ["\u7A82", "\u7A82"], /* CJK Ideograph */ + ["\u7A83", "\u7A83"], /* CJK Ideograph */ + ["\u7A84", "\u7A84"], /* CJK Ideograph */ + ["\u7A85", "\u7A85"], /* CJK Ideograph */ + ["\u7A86", "\u7A86"], /* CJK Ideograph */ + ["\u7A87", "\u7A87"], /* CJK Ideograph */ + ["\u7A88", "\u7A88"], /* CJK Ideograph */ + ["\u7A89", "\u7A89"], /* CJK Ideograph */ + ["\u7A8A", "\u7A8A"], /* CJK Ideograph */ + ["\u7A8B", "\u7A8B"], /* CJK Ideograph */ + ["\u7A8C", "\u7A8C"], /* CJK Ideograph */ + ["\u7A8D", "\u7A8D"], /* CJK Ideograph */ + ["\u7A8E", "\u7A8E"], /* CJK Ideograph */ + ["\u7A8F", "\u7A8F"], /* CJK Ideograph */ + ["\u7A90", "\u7A90"], /* CJK Ideograph */ + ["\u7A91", "\u7A91"], /* CJK Ideograph */ + ["\u7A92", "\u7A92"], /* CJK Ideograph */ + ["\u7A93", "\u7A93"], /* CJK Ideograph */ + ["\u7A94", "\u7A94"], /* CJK Ideograph */ + ["\u7A95", "\u7A95"], /* CJK Ideograph */ + ["\u7A96", "\u7A96"], /* CJK Ideograph */ + ["\u7A97", "\u7A97"], /* CJK Ideograph */ + ["\u7A98", "\u7A98"], /* CJK Ideograph */ + ["\u7A99", "\u7A99"], /* CJK Ideograph */ + ["\u7A9A", "\u7A9A"], /* CJK Ideograph */ + ["\u7A9B", "\u7A9B"], /* CJK Ideograph */ + ["\u7A9C", "\u7A9C"], /* CJK Ideograph */ + ["\u7A9D", "\u7A9D"], /* CJK Ideograph */ + ["\u7A9E", "\u7A9E"], /* CJK Ideograph */ + ["\u7A9F", "\u7A9F"], /* CJK Ideograph */ + ["\u7AA0", "\u7AA0"], /* CJK Ideograph */ + ["\u7AA1", "\u7AA1"], /* CJK Ideograph */ + ["\u7AA2", "\u7AA2"], /* CJK Ideograph */ + ["\u7AA3", "\u7AA3"], /* CJK Ideograph */ + ["\u7AA4", "\u7AA4"], /* CJK Ideograph */ + ["\u7AA5", "\u7AA5"], /* CJK Ideograph */ + ["\u7AA6", "\u7AA6"], /* CJK Ideograph */ + ["\u7AA7", "\u7AA7"], /* CJK Ideograph */ + ["\u7AA8", "\u7AA8"], /* CJK Ideograph */ + ["\u7AA9", "\u7AA9"], /* CJK Ideograph */ + ["\u7AAA", "\u7AAA"], /* CJK Ideograph */ + ["\u7AAB", "\u7AAB"], /* CJK Ideograph */ + ["\u7AAC", "\u7AAC"], /* CJK Ideograph */ + ["\u7AAD", "\u7AAD"], /* CJK Ideograph */ + ["\u7AAE", "\u7AAE"], /* CJK Ideograph */ + ["\u7AAF", "\u7AAF"], /* CJK Ideograph */ + ["\u7AB0", "\u7AB0"], /* CJK Ideograph */ + ["\u7AB1", "\u7AB1"], /* CJK Ideograph */ + ["\u7AB2", "\u7AB2"], /* CJK Ideograph */ + ["\u7AB3", "\u7AB3"], /* CJK Ideograph */ + ["\u7AB4", "\u7AB4"], /* CJK Ideograph */ + ["\u7AB5", "\u7AB5"], /* CJK Ideograph */ + ["\u7AB6", "\u7AB6"], /* CJK Ideograph */ + ["\u7AB7", "\u7AB7"], /* CJK Ideograph */ + ["\u7AB8", "\u7AB8"], /* CJK Ideograph */ + ["\u7AB9", "\u7AB9"], /* CJK Ideograph */ + ["\u7ABA", "\u7ABA"], /* CJK Ideograph */ + ["\u7ABB", "\u7ABB"], /* CJK Ideograph */ + ["\u7ABC", "\u7ABC"], /* CJK Ideograph */ + ["\u7ABD", "\u7ABD"], /* CJK Ideograph */ + ["\u7ABE", "\u7ABE"], /* CJK Ideograph */ + ["\u7ABF", "\u7ABF"], /* CJK Ideograph */ + ["\u7AC0", "\u7AC0"], /* CJK Ideograph */ + ["\u7AC1", "\u7AC1"], /* CJK Ideograph */ + ["\u7AC2", "\u7AC2"], /* CJK Ideograph */ + ["\u7AC3", "\u7AC3"], /* CJK Ideograph */ + ["\u7AC4", "\u7AC4"], /* CJK Ideograph */ + ["\u7AC5", "\u7AC5"], /* CJK Ideograph */ + ["\u7AC6", "\u7AC6"], /* CJK Ideograph */ + ["\u7AC7", "\u7AC7"], /* CJK Ideograph */ + ["\u7AC8", "\u7AC8"], /* CJK Ideograph */ + ["\u7AC9", "\u7AC9"], /* CJK Ideograph */ + ["\u7ACA", "\u7ACA"], /* CJK Ideograph */ + ["\u7ACB", "\u7ACB"], /* CJK Ideograph */ + ["\u7ACC", "\u7ACC"], /* CJK Ideograph */ + ["\u7ACD", "\u7ACD"], /* CJK Ideograph */ + ["\u7ACE", "\u7ACE"], /* CJK Ideograph */ + ["\u7ACF", "\u7ACF"], /* CJK Ideograph */ + ["\u7AD0", "\u7AD0"], /* CJK Ideograph */ + ["\u7AD1", "\u7AD1"], /* CJK Ideograph */ + ["\u7AD2", "\u7AD2"], /* CJK Ideograph */ + ["\u7AD3", "\u7AD3"], /* CJK Ideograph */ + ["\u7AD4", "\u7AD4"], /* CJK Ideograph */ + ["\u7AD5", "\u7AD5"], /* CJK Ideograph */ + ["\u7AD6", "\u7AD6"], /* CJK Ideograph */ + ["\u7AD7", "\u7AD7"], /* CJK Ideograph */ + ["\u7AD8", "\u7AD8"], /* CJK Ideograph */ + ["\u7AD9", "\u7AD9"], /* CJK Ideograph */ + ["\u7ADA", "\u7ADA"], /* CJK Ideograph */ + ["\u7ADB", "\u7ADB"], /* CJK Ideograph */ + ["\u7ADC", "\u7ADC"], /* CJK Ideograph */ + ["\u7ADD", "\u7ADD"], /* CJK Ideograph */ + ["\u7ADE", "\u7ADE"], /* CJK Ideograph */ + ["\u7ADF", "\u7ADF"], /* CJK Ideograph */ + ["\u7AE0", "\u7AE0"], /* CJK Ideograph */ + ["\u7AE1", "\u7AE1"], /* CJK Ideograph */ + ["\u7AE2", "\u7AE2"], /* CJK Ideograph */ + ["\u7AE3", "\u7AE3"], /* CJK Ideograph */ + ["\u7AE4", "\u7AE4"], /* CJK Ideograph */ + ["\u7AE5", "\u7AE5"], /* CJK Ideograph */ + ["\u7AE6", "\u7AE6"], /* CJK Ideograph */ + ["\u7AE7", "\u7AE7"], /* CJK Ideograph */ + ["\u7AE8", "\u7AE8"], /* CJK Ideograph */ + ["\u7AE9", "\u7AE9"], /* CJK Ideograph */ + ["\u7AEA", "\u7AEA"], /* CJK Ideograph */ + ["\u7AEB", "\u7AEB"], /* CJK Ideograph */ + ["\u7AEC", "\u7AEC"], /* CJK Ideograph */ + ["\u7AED", "\u7AED"], /* CJK Ideograph */ + ["\u7AEE", "\u7AEE"], /* CJK Ideograph */ + ["\u7AEF", "\u7AEF"], /* CJK Ideograph */ + ["\u7AF0", "\u7AF0"], /* CJK Ideograph */ + ["\u7AF1", "\u7AF1"], /* CJK Ideograph */ + ["\u7AF2", "\u7AF2"], /* CJK Ideograph */ + ["\u7AF3", "\u7AF3"], /* CJK Ideograph */ + ["\u7AF4", "\u7AF4"], /* CJK Ideograph */ + ["\u7AF5", "\u7AF5"], /* CJK Ideograph */ + ["\u7AF6", "\u7AF6"], /* CJK Ideograph */ + ["\u7AF7", "\u7AF7"], /* CJK Ideograph */ + ["\u7AF8", "\u7AF8"], /* CJK Ideograph */ + ["\u7AF9", "\u7AF9"], /* CJK Ideograph */ + ["\u7AFA", "\u7AFA"], /* CJK Ideograph */ + ["\u7AFB", "\u7AFB"], /* CJK Ideograph */ + ["\u7AFC", "\u7AFC"], /* CJK Ideograph */ + ["\u7AFD", "\u7AFD"], /* CJK Ideograph */ + ["\u7AFE", "\u7AFE"], /* CJK Ideograph */ + ["\u7AFF", "\u7AFF"], /* CJK Ideograph */ + ["\u7B00", "\u7B00"], /* CJK Ideograph */ + ["\u7B01", "\u7B01"], /* CJK Ideograph */ + ["\u7B02", "\u7B02"], /* CJK Ideograph */ + ["\u7B03", "\u7B03"], /* CJK Ideograph */ + ["\u7B04", "\u7B04"], /* CJK Ideograph */ + ["\u7B05", "\u7B05"], /* CJK Ideograph */ + ["\u7B06", "\u7B06"], /* CJK Ideograph */ + ["\u7B07", "\u7B07"], /* CJK Ideograph */ + ["\u7B08", "\u7B08"], /* CJK Ideograph */ + ["\u7B09", "\u7B09"], /* CJK Ideograph */ + ["\u7B0A", "\u7B0A"], /* CJK Ideograph */ + ["\u7B0B", "\u7B0B"], /* CJK Ideograph */ + ["\u7B0C", "\u7B0C"], /* CJK Ideograph */ + ["\u7B0D", "\u7B0D"], /* CJK Ideograph */ + ["\u7B0E", "\u7B0E"], /* CJK Ideograph */ + ["\u7B0F", "\u7B0F"], /* CJK Ideograph */ + ["\u7B10", "\u7B10"], /* CJK Ideograph */ + ["\u7B11", "\u7B11"], /* CJK Ideograph */ + ["\u7B12", "\u7B12"], /* CJK Ideograph */ + ["\u7B13", "\u7B13"], /* CJK Ideograph */ + ["\u7B14", "\u7B14"], /* CJK Ideograph */ + ["\u7B15", "\u7B15"], /* CJK Ideograph */ + ["\u7B16", "\u7B16"], /* CJK Ideograph */ + ["\u7B17", "\u7B17"], /* CJK Ideograph */ + ["\u7B18", "\u7B18"], /* CJK Ideograph */ + ["\u7B19", "\u7B19"], /* CJK Ideograph */ + ["\u7B1A", "\u7B1A"], /* CJK Ideograph */ + ["\u7B1B", "\u7B1B"], /* CJK Ideograph */ + ["\u7B1C", "\u7B1C"], /* CJK Ideograph */ + ["\u7B1D", "\u7B1D"], /* CJK Ideograph */ + ["\u7B1E", "\u7B1E"], /* CJK Ideograph */ + ["\u7B1F", "\u7B1F"], /* CJK Ideograph */ + ["\u7B20", "\u7B20"], /* CJK Ideograph */ + ["\u7B21", "\u7B21"], /* CJK Ideograph */ + ["\u7B22", "\u7B22"], /* CJK Ideograph */ + ["\u7B23", "\u7B23"], /* CJK Ideograph */ + ["\u7B24", "\u7B24"], /* CJK Ideograph */ + ["\u7B25", "\u7B25"], /* CJK Ideograph */ + ["\u7B26", "\u7B26"], /* CJK Ideograph */ + ["\u7B27", "\u7B27"], /* CJK Ideograph */ + ["\u7B28", "\u7B28"], /* CJK Ideograph */ + ["\u7B29", "\u7B29"], /* CJK Ideograph */ + ["\u7B2A", "\u7B2A"], /* CJK Ideograph */ + ["\u7B2B", "\u7B2B"], /* CJK Ideograph */ + ["\u7B2C", "\u7B2C"], /* CJK Ideograph */ + ["\u7B2D", "\u7B2D"], /* CJK Ideograph */ + ["\u7B2E", "\u7B2E"], /* CJK Ideograph */ + ["\u7B2F", "\u7B2F"], /* CJK Ideograph */ + ["\u7B30", "\u7B30"], /* CJK Ideograph */ + ["\u7B31", "\u7B31"], /* CJK Ideograph */ + ["\u7B32", "\u7B32"], /* CJK Ideograph */ + ["\u7B33", "\u7B33"], /* CJK Ideograph */ + ["\u7B34", "\u7B34"], /* CJK Ideograph */ + ["\u7B35", "\u7B35"], /* CJK Ideograph */ + ["\u7B36", "\u7B36"], /* CJK Ideograph */ + ["\u7B37", "\u7B37"], /* CJK Ideograph */ + ["\u7B38", "\u7B38"], /* CJK Ideograph */ + ["\u7B39", "\u7B39"], /* CJK Ideograph */ + ["\u7B3A", "\u7B3A"], /* CJK Ideograph */ + ["\u7B3B", "\u7B3B"], /* CJK Ideograph */ + ["\u7B3C", "\u7B3C"], /* CJK Ideograph */ + ["\u7B3D", "\u7B3D"], /* CJK Ideograph */ + ["\u7B3E", "\u7B3E"], /* CJK Ideograph */ + ["\u7B3F", "\u7B3F"], /* CJK Ideograph */ + ["\u7B40", "\u7B40"], /* CJK Ideograph */ + ["\u7B41", "\u7B41"], /* CJK Ideograph */ + ["\u7B42", "\u7B42"], /* CJK Ideograph */ + ["\u7B43", "\u7B43"], /* CJK Ideograph */ + ["\u7B44", "\u7B44"], /* CJK Ideograph */ + ["\u7B45", "\u7B45"], /* CJK Ideograph */ + ["\u7B46", "\u7B46"], /* CJK Ideograph */ + ["\u7B47", "\u7B47"], /* CJK Ideograph */ + ["\u7B48", "\u7B48"], /* CJK Ideograph */ + ["\u7B49", "\u7B49"], /* CJK Ideograph */ + ["\u7B4A", "\u7B4A"], /* CJK Ideograph */ + ["\u7B4B", "\u7B4B"], /* CJK Ideograph */ + ["\u7B4C", "\u7B4C"], /* CJK Ideograph */ + ["\u7B4D", "\u7B4D"], /* CJK Ideograph */ + ["\u7B4E", "\u7B4E"], /* CJK Ideograph */ + ["\u7B4F", "\u7B4F"], /* CJK Ideograph */ + ["\u7B50", "\u7B50"], /* CJK Ideograph */ + ["\u7B51", "\u7B51"], /* CJK Ideograph */ + ["\u7B52", "\u7B52"], /* CJK Ideograph */ + ["\u7B53", "\u7B53"], /* CJK Ideograph */ + ["\u7B54", "\u7B54"], /* CJK Ideograph */ + ["\u7B55", "\u7B55"], /* CJK Ideograph */ + ["\u7B56", "\u7B56"], /* CJK Ideograph */ + ["\u7B57", "\u7B57"], /* CJK Ideograph */ + ["\u7B58", "\u7B58"], /* CJK Ideograph */ + ["\u7B59", "\u7B59"], /* CJK Ideograph */ + ["\u7B5A", "\u7B5A"], /* CJK Ideograph */ + ["\u7B5B", "\u7B5B"], /* CJK Ideograph */ + ["\u7B5C", "\u7B5C"], /* CJK Ideograph */ + ["\u7B5D", "\u7B5D"], /* CJK Ideograph */ + ["\u7B5E", "\u7B5E"], /* CJK Ideograph */ + ["\u7B5F", "\u7B5F"], /* CJK Ideograph */ + ["\u7B60", "\u7B60"], /* CJK Ideograph */ + ["\u7B61", "\u7B61"], /* CJK Ideograph */ + ["\u7B62", "\u7B62"], /* CJK Ideograph */ + ["\u7B63", "\u7B63"], /* CJK Ideograph */ + ["\u7B64", "\u7B64"], /* CJK Ideograph */ + ["\u7B65", "\u7B65"], /* CJK Ideograph */ + ["\u7B66", "\u7B66"], /* CJK Ideograph */ + ["\u7B67", "\u7B67"], /* CJK Ideograph */ + ["\u7B68", "\u7B68"], /* CJK Ideograph */ + ["\u7B69", "\u7B69"], /* CJK Ideograph */ + ["\u7B6A", "\u7B6A"], /* CJK Ideograph */ + ["\u7B6B", "\u7B6B"], /* CJK Ideograph */ + ["\u7B6C", "\u7B6C"], /* CJK Ideograph */ + ["\u7B6D", "\u7B6D"], /* CJK Ideograph */ + ["\u7B6E", "\u7B6E"], /* CJK Ideograph */ + ["\u7B6F", "\u7B6F"], /* CJK Ideograph */ + ["\u7B70", "\u7B70"], /* CJK Ideograph */ + ["\u7B71", "\u7B71"], /* CJK Ideograph */ + ["\u7B72", "\u7B72"], /* CJK Ideograph */ + ["\u7B73", "\u7B73"], /* CJK Ideograph */ + ["\u7B74", "\u7B74"], /* CJK Ideograph */ + ["\u7B75", "\u7B75"], /* CJK Ideograph */ + ["\u7B76", "\u7B76"], /* CJK Ideograph */ + ["\u7B77", "\u7B77"], /* CJK Ideograph */ + ["\u7B78", "\u7B78"], /* CJK Ideograph */ + ["\u7B79", "\u7B79"], /* CJK Ideograph */ + ["\u7B7A", "\u7B7A"], /* CJK Ideograph */ + ["\u7B7B", "\u7B7B"], /* CJK Ideograph */ + ["\u7B7C", "\u7B7C"], /* CJK Ideograph */ + ["\u7B7D", "\u7B7D"], /* CJK Ideograph */ + ["\u7B7E", "\u7B7E"], /* CJK Ideograph */ + ["\u7B7F", "\u7B7F"], /* CJK Ideograph */ + ["\u7B80", "\u7B80"], /* CJK Ideograph */ + ["\u7B81", "\u7B81"], /* CJK Ideograph */ + ["\u7B82", "\u7B82"], /* CJK Ideograph */ + ["\u7B83", "\u7B83"], /* CJK Ideograph */ + ["\u7B84", "\u7B84"], /* CJK Ideograph */ + ["\u7B85", "\u7B85"], /* CJK Ideograph */ + ["\u7B86", "\u7B86"], /* CJK Ideograph */ + ["\u7B87", "\u7B87"], /* CJK Ideograph */ + ["\u7B88", "\u7B88"], /* CJK Ideograph */ + ["\u7B89", "\u7B89"], /* CJK Ideograph */ + ["\u7B8A", "\u7B8A"], /* CJK Ideograph */ + ["\u7B8B", "\u7B8B"], /* CJK Ideograph */ + ["\u7B8C", "\u7B8C"], /* CJK Ideograph */ + ["\u7B8D", "\u7B8D"], /* CJK Ideograph */ + ["\u7B8E", "\u7B8E"], /* CJK Ideograph */ + ["\u7B8F", "\u7B8F"], /* CJK Ideograph */ + ["\u7B90", "\u7B90"], /* CJK Ideograph */ + ["\u7B91", "\u7B91"], /* CJK Ideograph */ + ["\u7B92", "\u7B92"], /* CJK Ideograph */ + ["\u7B93", "\u7B93"], /* CJK Ideograph */ + ["\u7B94", "\u7B94"], /* CJK Ideograph */ + ["\u7B95", "\u7B95"], /* CJK Ideograph */ + ["\u7B96", "\u7B96"], /* CJK Ideograph */ + ["\u7B97", "\u7B97"], /* CJK Ideograph */ + ["\u7B98", "\u7B98"], /* CJK Ideograph */ + ["\u7B99", "\u7B99"], /* CJK Ideograph */ + ["\u7B9A", "\u7B9A"], /* CJK Ideograph */ + ["\u7B9B", "\u7B9B"], /* CJK Ideograph */ + ["\u7B9C", "\u7B9C"], /* CJK Ideograph */ + ["\u7B9D", "\u7B9D"], /* CJK Ideograph */ + ["\u7B9E", "\u7B9E"], /* CJK Ideograph */ + ["\u7B9F", "\u7B9F"], /* CJK Ideograph */ + ["\u7BA0", "\u7BA0"], /* CJK Ideograph */ + ["\u7BA1", "\u7BA1"], /* CJK Ideograph */ + ["\u7BA2", "\u7BA2"], /* CJK Ideograph */ + ["\u7BA3", "\u7BA3"], /* CJK Ideograph */ + ["\u7BA4", "\u7BA4"], /* CJK Ideograph */ + ["\u7BA5", "\u7BA5"], /* CJK Ideograph */ + ["\u7BA6", "\u7BA6"], /* CJK Ideograph */ + ["\u7BA7", "\u7BA7"], /* CJK Ideograph */ + ["\u7BA8", "\u7BA8"], /* CJK Ideograph */ + ["\u7BA9", "\u7BA9"], /* CJK Ideograph */ + ["\u7BAA", "\u7BAA"], /* CJK Ideograph */ + ["\u7BAB", "\u7BAB"], /* CJK Ideograph */ + ["\u7BAC", "\u7BAC"], /* CJK Ideograph */ + ["\u7BAD", "\u7BAD"], /* CJK Ideograph */ + ["\u7BAE", "\u7BAE"], /* CJK Ideograph */ + ["\u7BAF", "\u7BAF"], /* CJK Ideograph */ + ["\u7BB0", "\u7BB0"], /* CJK Ideograph */ + ["\u7BB1", "\u7BB1"], /* CJK Ideograph */ + ["\u7BB2", "\u7BB2"], /* CJK Ideograph */ + ["\u7BB3", "\u7BB3"], /* CJK Ideograph */ + ["\u7BB4", "\u7BB4"], /* CJK Ideograph */ + ["\u7BB5", "\u7BB5"], /* CJK Ideograph */ + ["\u7BB6", "\u7BB6"], /* CJK Ideograph */ + ["\u7BB7", "\u7BB7"], /* CJK Ideograph */ + ["\u7BB8", "\u7BB8"], /* CJK Ideograph */ + ["\u7BB9", "\u7BB9"], /* CJK Ideograph */ + ["\u7BBA", "\u7BBA"], /* CJK Ideograph */ + ["\u7BBB", "\u7BBB"], /* CJK Ideograph */ + ["\u7BBC", "\u7BBC"], /* CJK Ideograph */ + ["\u7BBD", "\u7BBD"], /* CJK Ideograph */ + ["\u7BBE", "\u7BBE"], /* CJK Ideograph */ + ["\u7BBF", "\u7BBF"], /* CJK Ideograph */ + ["\u7BC0", "\u7BC0"], /* CJK Ideograph */ + ["\u7BC1", "\u7BC1"], /* CJK Ideograph */ + ["\u7BC2", "\u7BC2"], /* CJK Ideograph */ + ["\u7BC3", "\u7BC3"], /* CJK Ideograph */ + ["\u7BC4", "\u7BC4"], /* CJK Ideograph */ + ["\u7BC5", "\u7BC5"], /* CJK Ideograph */ + ["\u7BC6", "\u7BC6"], /* CJK Ideograph */ + ["\u7BC7", "\u7BC7"], /* CJK Ideograph */ + ["\u7BC8", "\u7BC8"], /* CJK Ideograph */ + ["\u7BC9", "\u7BC9"], /* CJK Ideograph */ + ["\u7BCA", "\u7BCA"], /* CJK Ideograph */ + ["\u7BCB", "\u7BCB"], /* CJK Ideograph */ + ["\u7BCC", "\u7BCC"], /* CJK Ideograph */ + ["\u7BCD", "\u7BCD"], /* CJK Ideograph */ + ["\u7BCE", "\u7BCE"], /* CJK Ideograph */ + ["\u7BCF", "\u7BCF"], /* CJK Ideograph */ + ["\u7BD0", "\u7BD0"], /* CJK Ideograph */ + ["\u7BD1", "\u7BD1"], /* CJK Ideograph */ + ["\u7BD2", "\u7BD2"], /* CJK Ideograph */ + ["\u7BD3", "\u7BD3"], /* CJK Ideograph */ + ["\u7BD4", "\u7BD4"], /* CJK Ideograph */ + ["\u7BD5", "\u7BD5"], /* CJK Ideograph */ + ["\u7BD6", "\u7BD6"], /* CJK Ideograph */ + ["\u7BD7", "\u7BD7"], /* CJK Ideograph */ + ["\u7BD8", "\u7BD8"], /* CJK Ideograph */ + ["\u7BD9", "\u7BD9"], /* CJK Ideograph */ + ["\u7BDA", "\u7BDA"], /* CJK Ideograph */ + ["\u7BDB", "\u7BDB"], /* CJK Ideograph */ + ["\u7BDC", "\u7BDC"], /* CJK Ideograph */ + ["\u7BDD", "\u7BDD"], /* CJK Ideograph */ + ["\u7BDE", "\u7BDE"], /* CJK Ideograph */ + ["\u7BDF", "\u7BDF"], /* CJK Ideograph */ + ["\u7BE0", "\u7BE0"], /* CJK Ideograph */ + ["\u7BE1", "\u7BE1"], /* CJK Ideograph */ + ["\u7BE2", "\u7BE2"], /* CJK Ideograph */ + ["\u7BE3", "\u7BE3"], /* CJK Ideograph */ + ["\u7BE4", "\u7BE4"], /* CJK Ideograph */ + ["\u7BE5", "\u7BE5"], /* CJK Ideograph */ + ["\u7BE6", "\u7BE6"], /* CJK Ideograph */ + ["\u7BE7", "\u7BE7"], /* CJK Ideograph */ + ["\u7BE8", "\u7BE8"], /* CJK Ideograph */ + ["\u7BE9", "\u7BE9"], /* CJK Ideograph */ + ["\u7BEA", "\u7BEA"], /* CJK Ideograph */ + ["\u7BEB", "\u7BEB"], /* CJK Ideograph */ + ["\u7BEC", "\u7BEC"], /* CJK Ideograph */ + ["\u7BED", "\u7BED"], /* CJK Ideograph */ + ["\u7BEE", "\u7BEE"], /* CJK Ideograph */ + ["\u7BEF", "\u7BEF"], /* CJK Ideograph */ + ["\u7BF0", "\u7BF0"], /* CJK Ideograph */ + ["\u7BF1", "\u7BF1"], /* CJK Ideograph */ + ["\u7BF2", "\u7BF2"], /* CJK Ideograph */ + ["\u7BF3", "\u7BF3"], /* CJK Ideograph */ + ["\u7BF4", "\u7BF4"], /* CJK Ideograph */ + ["\u7BF5", "\u7BF5"], /* CJK Ideograph */ + ["\u7BF6", "\u7BF6"], /* CJK Ideograph */ + ["\u7BF7", "\u7BF7"], /* CJK Ideograph */ + ["\u7BF8", "\u7BF8"], /* CJK Ideograph */ + ["\u7BF9", "\u7BF9"], /* CJK Ideograph */ + ["\u7BFA", "\u7BFA"], /* CJK Ideograph */ + ["\u7BFB", "\u7BFB"], /* CJK Ideograph */ + ["\u7BFC", "\u7BFC"], /* CJK Ideograph */ + ["\u7BFD", "\u7BFD"], /* CJK Ideograph */ + ["\u7BFE", "\u7BFE"], /* CJK Ideograph */ + ["\u7BFF", "\u7BFF"], /* CJK Ideograph */ + ["\u7C00", "\u7C00"], /* CJK Ideograph */ + ["\u7C01", "\u7C01"], /* CJK Ideograph */ + ["\u7C02", "\u7C02"], /* CJK Ideograph */ + ["\u7C03", "\u7C03"], /* CJK Ideograph */ + ["\u7C04", "\u7C04"], /* CJK Ideograph */ + ["\u7C05", "\u7C05"], /* CJK Ideograph */ + ["\u7C06", "\u7C06"], /* CJK Ideograph */ + ["\u7C07", "\u7C07"], /* CJK Ideograph */ + ["\u7C08", "\u7C08"], /* CJK Ideograph */ + ["\u7C09", "\u7C09"], /* CJK Ideograph */ + ["\u7C0A", "\u7C0A"], /* CJK Ideograph */ + ["\u7C0B", "\u7C0B"], /* CJK Ideograph */ + ["\u7C0C", "\u7C0C"], /* CJK Ideograph */ + ["\u7C0D", "\u7C0D"], /* CJK Ideograph */ + ["\u7C0E", "\u7C0E"], /* CJK Ideograph */ + ["\u7C0F", "\u7C0F"], /* CJK Ideograph */ + ["\u7C10", "\u7C10"], /* CJK Ideograph */ + ["\u7C11", "\u7C11"], /* CJK Ideograph */ + ["\u7C12", "\u7C12"], /* CJK Ideograph */ + ["\u7C13", "\u7C13"], /* CJK Ideograph */ + ["\u7C14", "\u7C14"], /* CJK Ideograph */ + ["\u7C15", "\u7C15"], /* CJK Ideograph */ + ["\u7C16", "\u7C16"], /* CJK Ideograph */ + ["\u7C17", "\u7C17"], /* CJK Ideograph */ + ["\u7C18", "\u7C18"], /* CJK Ideograph */ + ["\u7C19", "\u7C19"], /* CJK Ideograph */ + ["\u7C1A", "\u7C1A"], /* CJK Ideograph */ + ["\u7C1B", "\u7C1B"], /* CJK Ideograph */ + ["\u7C1C", "\u7C1C"], /* CJK Ideograph */ + ["\u7C1D", "\u7C1D"], /* CJK Ideograph */ + ["\u7C1E", "\u7C1E"], /* CJK Ideograph */ + ["\u7C1F", "\u7C1F"], /* CJK Ideograph */ + ["\u7C20", "\u7C20"], /* CJK Ideograph */ + ["\u7C21", "\u7C21"], /* CJK Ideograph */ + ["\u7C22", "\u7C22"], /* CJK Ideograph */ + ["\u7C23", "\u7C23"], /* CJK Ideograph */ + ["\u7C24", "\u7C24"], /* CJK Ideograph */ + ["\u7C25", "\u7C25"], /* CJK Ideograph */ + ["\u7C26", "\u7C26"], /* CJK Ideograph */ + ["\u7C27", "\u7C27"], /* CJK Ideograph */ + ["\u7C28", "\u7C28"], /* CJK Ideograph */ + ["\u7C29", "\u7C29"], /* CJK Ideograph */ + ["\u7C2A", "\u7C2A"], /* CJK Ideograph */ + ["\u7C2B", "\u7C2B"], /* CJK Ideograph */ + ["\u7C2C", "\u7C2C"], /* CJK Ideograph */ + ["\u7C2D", "\u7C2D"], /* CJK Ideograph */ + ["\u7C2E", "\u7C2E"], /* CJK Ideograph */ + ["\u7C2F", "\u7C2F"], /* CJK Ideograph */ + ["\u7C30", "\u7C30"], /* CJK Ideograph */ + ["\u7C31", "\u7C31"], /* CJK Ideograph */ + ["\u7C32", "\u7C32"], /* CJK Ideograph */ + ["\u7C33", "\u7C33"], /* CJK Ideograph */ + ["\u7C34", "\u7C34"], /* CJK Ideograph */ + ["\u7C35", "\u7C35"], /* CJK Ideograph */ + ["\u7C36", "\u7C36"], /* CJK Ideograph */ + ["\u7C37", "\u7C37"], /* CJK Ideograph */ + ["\u7C38", "\u7C38"], /* CJK Ideograph */ + ["\u7C39", "\u7C39"], /* CJK Ideograph */ + ["\u7C3A", "\u7C3A"], /* CJK Ideograph */ + ["\u7C3B", "\u7C3B"], /* CJK Ideograph */ + ["\u7C3C", "\u7C3C"], /* CJK Ideograph */ + ["\u7C3D", "\u7C3D"], /* CJK Ideograph */ + ["\u7C3E", "\u7C3E"], /* CJK Ideograph */ + ["\u7C3F", "\u7C3F"], /* CJK Ideograph */ + ["\u7C40", "\u7C40"], /* CJK Ideograph */ + ["\u7C41", "\u7C41"], /* CJK Ideograph */ + ["\u7C42", "\u7C42"], /* CJK Ideograph */ + ["\u7C43", "\u7C43"], /* CJK Ideograph */ + ["\u7C44", "\u7C44"], /* CJK Ideograph */ + ["\u7C45", "\u7C45"], /* CJK Ideograph */ + ["\u7C46", "\u7C46"], /* CJK Ideograph */ + ["\u7C47", "\u7C47"], /* CJK Ideograph */ + ["\u7C48", "\u7C48"], /* CJK Ideograph */ + ["\u7C49", "\u7C49"], /* CJK Ideograph */ + ["\u7C4A", "\u7C4A"], /* CJK Ideograph */ + ["\u7C4B", "\u7C4B"], /* CJK Ideograph */ + ["\u7C4C", "\u7C4C"], /* CJK Ideograph */ + ["\u7C4D", "\u7C4D"], /* CJK Ideograph */ + ["\u7C4E", "\u7C4E"], /* CJK Ideograph */ + ["\u7C4F", "\u7C4F"], /* CJK Ideograph */ + ["\u7C50", "\u7C50"], /* CJK Ideograph */ + ["\u7C51", "\u7C51"], /* CJK Ideograph */ + ["\u7C52", "\u7C52"], /* CJK Ideograph */ + ["\u7C53", "\u7C53"], /* CJK Ideograph */ + ["\u7C54", "\u7C54"], /* CJK Ideograph */ + ["\u7C55", "\u7C55"], /* CJK Ideograph */ + ["\u7C56", "\u7C56"], /* CJK Ideograph */ + ["\u7C57", "\u7C57"], /* CJK Ideograph */ + ["\u7C58", "\u7C58"], /* CJK Ideograph */ + ["\u7C59", "\u7C59"], /* CJK Ideograph */ + ["\u7C5A", "\u7C5A"], /* CJK Ideograph */ + ["\u7C5B", "\u7C5B"], /* CJK Ideograph */ + ["\u7C5C", "\u7C5C"], /* CJK Ideograph */ + ["\u7C5D", "\u7C5D"], /* CJK Ideograph */ + ["\u7C5E", "\u7C5E"], /* CJK Ideograph */ + ["\u7C5F", "\u7C5F"], /* CJK Ideograph */ + ["\u7C60", "\u7C60"], /* CJK Ideograph */ + ["\u7C61", "\u7C61"], /* CJK Ideograph */ + ["\u7C62", "\u7C62"], /* CJK Ideograph */ + ["\u7C63", "\u7C63"], /* CJK Ideograph */ + ["\u7C64", "\u7C64"], /* CJK Ideograph */ + ["\u7C65", "\u7C65"], /* CJK Ideograph */ + ["\u7C66", "\u7C66"], /* CJK Ideograph */ + ["\u7C67", "\u7C67"], /* CJK Ideograph */ + ["\u7C68", "\u7C68"], /* CJK Ideograph */ + ["\u7C69", "\u7C69"], /* CJK Ideograph */ + ["\u7C6A", "\u7C6A"], /* CJK Ideograph */ + ["\u7C6B", "\u7C6B"], /* CJK Ideograph */ + ["\u7C6C", "\u7C6C"], /* CJK Ideograph */ + ["\u7C6D", "\u7C6D"], /* CJK Ideograph */ + ["\u7C6E", "\u7C6E"], /* CJK Ideograph */ + ["\u7C6F", "\u7C6F"], /* CJK Ideograph */ + ["\u7C70", "\u7C70"], /* CJK Ideograph */ + ["\u7C71", "\u7C71"], /* CJK Ideograph */ + ["\u7C72", "\u7C72"], /* CJK Ideograph */ + ["\u7C73", "\u7C73"], /* CJK Ideograph */ + ["\u7C74", "\u7C74"], /* CJK Ideograph */ + ["\u7C75", "\u7C75"], /* CJK Ideograph */ + ["\u7C76", "\u7C76"], /* CJK Ideograph */ + ["\u7C77", "\u7C77"], /* CJK Ideograph */ + ["\u7C78", "\u7C78"], /* CJK Ideograph */ + ["\u7C79", "\u7C79"], /* CJK Ideograph */ + ["\u7C7A", "\u7C7A"], /* CJK Ideograph */ + ["\u7C7B", "\u7C7B"], /* CJK Ideograph */ + ["\u7C7C", "\u7C7C"], /* CJK Ideograph */ + ["\u7C7D", "\u7C7D"], /* CJK Ideograph */ + ["\u7C7E", "\u7C7E"], /* CJK Ideograph */ + ["\u7C7F", "\u7C7F"], /* CJK Ideograph */ + ["\u7C80", "\u7C80"], /* CJK Ideograph */ + ["\u7C81", "\u7C81"], /* CJK Ideograph */ + ["\u7C82", "\u7C82"], /* CJK Ideograph */ + ["\u7C83", "\u7C83"], /* CJK Ideograph */ + ["\u7C84", "\u7C84"], /* CJK Ideograph */ + ["\u7C85", "\u7C85"], /* CJK Ideograph */ + ["\u7C86", "\u7C86"], /* CJK Ideograph */ + ["\u7C87", "\u7C87"], /* CJK Ideograph */ + ["\u7C88", "\u7C88"], /* CJK Ideograph */ + ["\u7C89", "\u7C89"], /* CJK Ideograph */ + ["\u7C8A", "\u7C8A"], /* CJK Ideograph */ + ["\u7C8B", "\u7C8B"], /* CJK Ideograph */ + ["\u7C8C", "\u7C8C"], /* CJK Ideograph */ + ["\u7C8D", "\u7C8D"], /* CJK Ideograph */ + ["\u7C8E", "\u7C8E"], /* CJK Ideograph */ + ["\u7C8F", "\u7C8F"], /* CJK Ideograph */ + ["\u7C90", "\u7C90"], /* CJK Ideograph */ + ["\u7C91", "\u7C91"], /* CJK Ideograph */ + ["\u7C92", "\u7C92"], /* CJK Ideograph */ + ["\u7C93", "\u7C93"], /* CJK Ideograph */ + ["\u7C94", "\u7C94"], /* CJK Ideograph */ + ["\u7C95", "\u7C95"], /* CJK Ideograph */ + ["\u7C96", "\u7C96"], /* CJK Ideograph */ + ["\u7C97", "\u7C97"], /* CJK Ideograph */ + ["\u7C98", "\u7C98"], /* CJK Ideograph */ + ["\u7C99", "\u7C99"], /* CJK Ideograph */ + ["\u7C9A", "\u7C9A"], /* CJK Ideograph */ + ["\u7C9B", "\u7C9B"], /* CJK Ideograph */ + ["\u7C9C", "\u7C9C"], /* CJK Ideograph */ + ["\u7C9D", "\u7C9D"], /* CJK Ideograph */ + ["\u7C9E", "\u7C9E"], /* CJK Ideograph */ + ["\u7C9F", "\u7C9F"], /* CJK Ideograph */ + ["\u7CA0", "\u7CA0"], /* CJK Ideograph */ + ["\u7CA1", "\u7CA1"], /* CJK Ideograph */ + ["\u7CA2", "\u7CA2"], /* CJK Ideograph */ + ["\u7CA3", "\u7CA3"], /* CJK Ideograph */ + ["\u7CA4", "\u7CA4"], /* CJK Ideograph */ + ["\u7CA5", "\u7CA5"], /* CJK Ideograph */ + ["\u7CA6", "\u7CA6"], /* CJK Ideograph */ + ["\u7CA7", "\u7CA7"], /* CJK Ideograph */ + ["\u7CA8", "\u7CA8"], /* CJK Ideograph */ + ["\u7CA9", "\u7CA9"], /* CJK Ideograph */ + ["\u7CAA", "\u7CAA"], /* CJK Ideograph */ + ["\u7CAB", "\u7CAB"], /* CJK Ideograph */ + ["\u7CAC", "\u7CAC"], /* CJK Ideograph */ + ["\u7CAD", "\u7CAD"], /* CJK Ideograph */ + ["\u7CAE", "\u7CAE"], /* CJK Ideograph */ + ["\u7CAF", "\u7CAF"], /* CJK Ideograph */ + ["\u7CB0", "\u7CB0"], /* CJK Ideograph */ + ["\u7CB1", "\u7CB1"], /* CJK Ideograph */ + ["\u7CB2", "\u7CB2"], /* CJK Ideograph */ + ["\u7CB3", "\u7CB3"], /* CJK Ideograph */ + ["\u7CB4", "\u7CB4"], /* CJK Ideograph */ + ["\u7CB5", "\u7CB5"], /* CJK Ideograph */ + ["\u7CB6", "\u7CB6"], /* CJK Ideograph */ + ["\u7CB7", "\u7CB7"], /* CJK Ideograph */ + ["\u7CB8", "\u7CB8"], /* CJK Ideograph */ + ["\u7CB9", "\u7CB9"], /* CJK Ideograph */ + ["\u7CBA", "\u7CBA"], /* CJK Ideograph */ + ["\u7CBB", "\u7CBB"], /* CJK Ideograph */ + ["\u7CBC", "\u7CBC"], /* CJK Ideograph */ + ["\u7CBD", "\u7CBD"], /* CJK Ideograph */ + ["\u7CBE", "\u7CBE"], /* CJK Ideograph */ + ["\u7CBF", "\u7CBF"], /* CJK Ideograph */ + ["\u7CC0", "\u7CC0"], /* CJK Ideograph */ + ["\u7CC1", "\u7CC1"], /* CJK Ideograph */ + ["\u7CC2", "\u7CC2"], /* CJK Ideograph */ + ["\u7CC3", "\u7CC3"], /* CJK Ideograph */ + ["\u7CC4", "\u7CC4"], /* CJK Ideograph */ + ["\u7CC5", "\u7CC5"], /* CJK Ideograph */ + ["\u7CC6", "\u7CC6"], /* CJK Ideograph */ + ["\u7CC7", "\u7CC7"], /* CJK Ideograph */ + ["\u7CC8", "\u7CC8"], /* CJK Ideograph */ + ["\u7CC9", "\u7CC9"], /* CJK Ideograph */ + ["\u7CCA", "\u7CCA"], /* CJK Ideograph */ + ["\u7CCB", "\u7CCB"], /* CJK Ideograph */ + ["\u7CCC", "\u7CCC"], /* CJK Ideograph */ + ["\u7CCD", "\u7CCD"], /* CJK Ideograph */ + ["\u7CCE", "\u7CCE"], /* CJK Ideograph */ + ["\u7CCF", "\u7CCF"], /* CJK Ideograph */ + ["\u7CD0", "\u7CD0"], /* CJK Ideograph */ + ["\u7CD1", "\u7CD1"], /* CJK Ideograph */ + ["\u7CD2", "\u7CD2"], /* CJK Ideograph */ + ["\u7CD3", "\u7CD3"], /* CJK Ideograph */ + ["\u7CD4", "\u7CD4"], /* CJK Ideograph */ + ["\u7CD5", "\u7CD5"], /* CJK Ideograph */ + ["\u7CD6", "\u7CD6"], /* CJK Ideograph */ + ["\u7CD7", "\u7CD7"], /* CJK Ideograph */ + ["\u7CD8", "\u7CD8"], /* CJK Ideograph */ + ["\u7CD9", "\u7CD9"], /* CJK Ideograph */ + ["\u7CDA", "\u7CDA"], /* CJK Ideograph */ + ["\u7CDB", "\u7CDB"], /* CJK Ideograph */ + ["\u7CDC", "\u7CDC"], /* CJK Ideograph */ + ["\u7CDD", "\u7CDD"], /* CJK Ideograph */ + ["\u7CDE", "\u7CDE"], /* CJK Ideograph */ + ["\u7CDF", "\u7CDF"], /* CJK Ideograph */ + ["\u7CE0", "\u7CE0"], /* CJK Ideograph */ + ["\u7CE1", "\u7CE1"], /* CJK Ideograph */ + ["\u7CE2", "\u7CE2"], /* CJK Ideograph */ + ["\u7CE3", "\u7CE3"], /* CJK Ideograph */ + ["\u7CE4", "\u7CE4"], /* CJK Ideograph */ + ["\u7CE5", "\u7CE5"], /* CJK Ideograph */ + ["\u7CE6", "\u7CE6"], /* CJK Ideograph */ + ["\u7CE7", "\u7CE7"], /* CJK Ideograph */ + ["\u7CE8", "\u7CE8"], /* CJK Ideograph */ + ["\u7CE9", "\u7CE9"], /* CJK Ideograph */ + ["\u7CEA", "\u7CEA"], /* CJK Ideograph */ + ["\u7CEB", "\u7CEB"], /* CJK Ideograph */ + ["\u7CEC", "\u7CEC"], /* CJK Ideograph */ + ["\u7CED", "\u7CED"], /* CJK Ideograph */ + ["\u7CEE", "\u7CEE"], /* CJK Ideograph */ + ["\u7CEF", "\u7CEF"], /* CJK Ideograph */ + ["\u7CF0", "\u7CF0"], /* CJK Ideograph */ + ["\u7CF1", "\u7CF1"], /* CJK Ideograph */ + ["\u7CF2", "\u7CF2"], /* CJK Ideograph */ + ["\u7CF3", "\u7CF3"], /* CJK Ideograph */ + ["\u7CF4", "\u7CF4"], /* CJK Ideograph */ + ["\u7CF5", "\u7CF5"], /* CJK Ideograph */ + ["\u7CF6", "\u7CF6"], /* CJK Ideograph */ + ["\u7CF7", "\u7CF7"], /* CJK Ideograph */ + ["\u7CF8", "\u7CF8"], /* CJK Ideograph */ + ["\u7CF9", "\u7CF9"], /* CJK Ideograph */ + ["\u7CFA", "\u7CFA"], /* CJK Ideograph */ + ["\u7CFB", "\u7CFB"], /* CJK Ideograph */ + ["\u7CFC", "\u7CFC"], /* CJK Ideograph */ + ["\u7CFD", "\u7CFD"], /* CJK Ideograph */ + ["\u7CFE", "\u7CFE"], /* CJK Ideograph */ + ["\u7CFF", "\u7CFF"], /* CJK Ideograph */ + ["\u7D00", "\u7D00"], /* CJK Ideograph */ + ["\u7D01", "\u7D01"], /* CJK Ideograph */ + ["\u7D02", "\u7D02"], /* CJK Ideograph */ + ["\u7D03", "\u7D03"], /* CJK Ideograph */ + ["\u7D04", "\u7D04"], /* CJK Ideograph */ + ["\u7D05", "\u7D05"], /* CJK Ideograph */ + ["\u7D06", "\u7D06"], /* CJK Ideograph */ + ["\u7D07", "\u7D07"], /* CJK Ideograph */ + ["\u7D08", "\u7D08"], /* CJK Ideograph */ + ["\u7D09", "\u7D09"], /* CJK Ideograph */ + ["\u7D0A", "\u7D0A"], /* CJK Ideograph */ + ["\u7D0B", "\u7D0B"], /* CJK Ideograph */ + ["\u7D0C", "\u7D0C"], /* CJK Ideograph */ + ["\u7D0D", "\u7D0D"], /* CJK Ideograph */ + ["\u7D0E", "\u7D0E"], /* CJK Ideograph */ + ["\u7D0F", "\u7D0F"], /* CJK Ideograph */ + ["\u7D10", "\u7D10"], /* CJK Ideograph */ + ["\u7D11", "\u7D11"], /* CJK Ideograph */ + ["\u7D12", "\u7D12"], /* CJK Ideograph */ + ["\u7D13", "\u7D13"], /* CJK Ideograph */ + ["\u7D14", "\u7D14"], /* CJK Ideograph */ + ["\u7D15", "\u7D15"], /* CJK Ideograph */ + ["\u7D16", "\u7D16"], /* CJK Ideograph */ + ["\u7D17", "\u7D17"], /* CJK Ideograph */ + ["\u7D18", "\u7D18"], /* CJK Ideograph */ + ["\u7D19", "\u7D19"], /* CJK Ideograph */ + ["\u7D1A", "\u7D1A"], /* CJK Ideograph */ + ["\u7D1B", "\u7D1B"], /* CJK Ideograph */ + ["\u7D1C", "\u7D1C"], /* CJK Ideograph */ + ["\u7D1D", "\u7D1D"], /* CJK Ideograph */ + ["\u7D1E", "\u7D1E"], /* CJK Ideograph */ + ["\u7D1F", "\u7D1F"], /* CJK Ideograph */ + ["\u7D20", "\u7D20"], /* CJK Ideograph */ + ["\u7D21", "\u7D21"], /* CJK Ideograph */ + ["\u7D22", "\u7D22"], /* CJK Ideograph */ + ["\u7D23", "\u7D23"], /* CJK Ideograph */ + ["\u7D24", "\u7D24"], /* CJK Ideograph */ + ["\u7D25", "\u7D25"], /* CJK Ideograph */ + ["\u7D26", "\u7D26"], /* CJK Ideograph */ + ["\u7D27", "\u7D27"], /* CJK Ideograph */ + ["\u7D28", "\u7D28"], /* CJK Ideograph */ + ["\u7D29", "\u7D29"], /* CJK Ideograph */ + ["\u7D2A", "\u7D2A"], /* CJK Ideograph */ + ["\u7D2B", "\u7D2B"], /* CJK Ideograph */ + ["\u7D2C", "\u7D2C"], /* CJK Ideograph */ + ["\u7D2D", "\u7D2D"], /* CJK Ideograph */ + ["\u7D2E", "\u7D2E"], /* CJK Ideograph */ + ["\u7D2F", "\u7D2F"], /* CJK Ideograph */ + ["\u7D30", "\u7D30"], /* CJK Ideograph */ + ["\u7D31", "\u7D31"], /* CJK Ideograph */ + ["\u7D32", "\u7D32"], /* CJK Ideograph */ + ["\u7D33", "\u7D33"], /* CJK Ideograph */ + ["\u7D34", "\u7D34"], /* CJK Ideograph */ + ["\u7D35", "\u7D35"], /* CJK Ideograph */ + ["\u7D36", "\u7D36"], /* CJK Ideograph */ + ["\u7D37", "\u7D37"], /* CJK Ideograph */ + ["\u7D38", "\u7D38"], /* CJK Ideograph */ + ["\u7D39", "\u7D39"], /* CJK Ideograph */ + ["\u7D3A", "\u7D3A"], /* CJK Ideograph */ + ["\u7D3B", "\u7D3B"], /* CJK Ideograph */ + ["\u7D3C", "\u7D3C"], /* CJK Ideograph */ + ["\u7D3D", "\u7D3D"], /* CJK Ideograph */ + ["\u7D3E", "\u7D3E"], /* CJK Ideograph */ + ["\u7D3F", "\u7D3F"], /* CJK Ideograph */ + ["\u7D40", "\u7D40"], /* CJK Ideograph */ + ["\u7D41", "\u7D41"], /* CJK Ideograph */ + ["\u7D42", "\u7D42"], /* CJK Ideograph */ + ["\u7D43", "\u7D43"], /* CJK Ideograph */ + ["\u7D44", "\u7D44"], /* CJK Ideograph */ + ["\u7D45", "\u7D45"], /* CJK Ideograph */ + ["\u7D46", "\u7D46"], /* CJK Ideograph */ + ["\u7D47", "\u7D47"], /* CJK Ideograph */ + ["\u7D48", "\u7D48"], /* CJK Ideograph */ + ["\u7D49", "\u7D49"], /* CJK Ideograph */ + ["\u7D4A", "\u7D4A"], /* CJK Ideograph */ + ["\u7D4B", "\u7D4B"], /* CJK Ideograph */ + ["\u7D4C", "\u7D4C"], /* CJK Ideograph */ + ["\u7D4D", "\u7D4D"], /* CJK Ideograph */ + ["\u7D4E", "\u7D4E"], /* CJK Ideograph */ + ["\u7D4F", "\u7D4F"], /* CJK Ideograph */ + ["\u7D50", "\u7D50"], /* CJK Ideograph */ + ["\u7D51", "\u7D51"], /* CJK Ideograph */ + ["\u7D52", "\u7D52"], /* CJK Ideograph */ + ["\u7D53", "\u7D53"], /* CJK Ideograph */ + ["\u7D54", "\u7D54"], /* CJK Ideograph */ + ["\u7D55", "\u7D55"], /* CJK Ideograph */ + ["\u7D56", "\u7D56"], /* CJK Ideograph */ + ["\u7D57", "\u7D57"], /* CJK Ideograph */ + ["\u7D58", "\u7D58"], /* CJK Ideograph */ + ["\u7D59", "\u7D59"], /* CJK Ideograph */ + ["\u7D5A", "\u7D5A"], /* CJK Ideograph */ + ["\u7D5B", "\u7D5B"], /* CJK Ideograph */ + ["\u7D5C", "\u7D5C"], /* CJK Ideograph */ + ["\u7D5D", "\u7D5D"], /* CJK Ideograph */ + ["\u7D5E", "\u7D5E"], /* CJK Ideograph */ + ["\u7D5F", "\u7D5F"], /* CJK Ideograph */ + ["\u7D60", "\u7D60"], /* CJK Ideograph */ + ["\u7D61", "\u7D61"], /* CJK Ideograph */ + ["\u7D62", "\u7D62"], /* CJK Ideograph */ + ["\u7D63", "\u7D63"], /* CJK Ideograph */ + ["\u7D64", "\u7D64"], /* CJK Ideograph */ + ["\u7D65", "\u7D65"], /* CJK Ideograph */ + ["\u7D66", "\u7D66"], /* CJK Ideograph */ + ["\u7D67", "\u7D67"], /* CJK Ideograph */ + ["\u7D68", "\u7D68"], /* CJK Ideograph */ + ["\u7D69", "\u7D69"], /* CJK Ideograph */ + ["\u7D6A", "\u7D6A"], /* CJK Ideograph */ + ["\u7D6B", "\u7D6B"], /* CJK Ideograph */ + ["\u7D6C", "\u7D6C"], /* CJK Ideograph */ + ["\u7D6D", "\u7D6D"], /* CJK Ideograph */ + ["\u7D6E", "\u7D6E"], /* CJK Ideograph */ + ["\u7D6F", "\u7D6F"], /* CJK Ideograph */ + ["\u7D70", "\u7D70"], /* CJK Ideograph */ + ["\u7D71", "\u7D71"], /* CJK Ideograph */ + ["\u7D72", "\u7D72"], /* CJK Ideograph */ + ["\u7D73", "\u7D73"], /* CJK Ideograph */ + ["\u7D74", "\u7D74"], /* CJK Ideograph */ + ["\u7D75", "\u7D75"], /* CJK Ideograph */ + ["\u7D76", "\u7D76"], /* CJK Ideograph */ + ["\u7D77", "\u7D77"], /* CJK Ideograph */ + ["\u7D78", "\u7D78"], /* CJK Ideograph */ + ["\u7D79", "\u7D79"], /* CJK Ideograph */ + ["\u7D7A", "\u7D7A"], /* CJK Ideograph */ + ["\u7D7B", "\u7D7B"], /* CJK Ideograph */ + ["\u7D7C", "\u7D7C"], /* CJK Ideograph */ + ["\u7D7D", "\u7D7D"], /* CJK Ideograph */ + ["\u7D7E", "\u7D7E"], /* CJK Ideograph */ + ["\u7D7F", "\u7D7F"], /* CJK Ideograph */ + ["\u7D80", "\u7D80"], /* CJK Ideograph */ + ["\u7D81", "\u7D81"], /* CJK Ideograph */ + ["\u7D82", "\u7D82"], /* CJK Ideograph */ + ["\u7D83", "\u7D83"], /* CJK Ideograph */ + ["\u7D84", "\u7D84"], /* CJK Ideograph */ + ["\u7D85", "\u7D85"], /* CJK Ideograph */ + ["\u7D86", "\u7D86"], /* CJK Ideograph */ + ["\u7D87", "\u7D87"], /* CJK Ideograph */ + ["\u7D88", "\u7D88"], /* CJK Ideograph */ + ["\u7D89", "\u7D89"], /* CJK Ideograph */ + ["\u7D8A", "\u7D8A"], /* CJK Ideograph */ + ["\u7D8B", "\u7D8B"], /* CJK Ideograph */ + ["\u7D8C", "\u7D8C"], /* CJK Ideograph */ + ["\u7D8D", "\u7D8D"], /* CJK Ideograph */ + ["\u7D8E", "\u7D8E"], /* CJK Ideograph */ + ["\u7D8F", "\u7D8F"], /* CJK Ideograph */ + ["\u7D90", "\u7D90"], /* CJK Ideograph */ + ["\u7D91", "\u7D91"], /* CJK Ideograph */ + ["\u7D92", "\u7D92"], /* CJK Ideograph */ + ["\u7D93", "\u7D93"], /* CJK Ideograph */ + ["\u7D94", "\u7D94"], /* CJK Ideograph */ + ["\u7D95", "\u7D95"], /* CJK Ideograph */ + ["\u7D96", "\u7D96"], /* CJK Ideograph */ + ["\u7D97", "\u7D97"], /* CJK Ideograph */ + ["\u7D98", "\u7D98"], /* CJK Ideograph */ + ["\u7D99", "\u7D99"], /* CJK Ideograph */ + ["\u7D9A", "\u7D9A"], /* CJK Ideograph */ + ["\u7D9B", "\u7D9B"], /* CJK Ideograph */ + ["\u7D9C", "\u7D9C"], /* CJK Ideograph */ + ["\u7D9D", "\u7D9D"], /* CJK Ideograph */ + ["\u7D9E", "\u7D9E"], /* CJK Ideograph */ + ["\u7D9F", "\u7D9F"], /* CJK Ideograph */ + ["\u7DA0", "\u7DA0"], /* CJK Ideograph */ + ["\u7DA1", "\u7DA1"], /* CJK Ideograph */ + ["\u7DA2", "\u7DA2"], /* CJK Ideograph */ + ["\u7DA3", "\u7DA3"], /* CJK Ideograph */ + ["\u7DA4", "\u7DA4"], /* CJK Ideograph */ + ["\u7DA5", "\u7DA5"], /* CJK Ideograph */ + ["\u7DA6", "\u7DA6"], /* CJK Ideograph */ + ["\u7DA7", "\u7DA7"], /* CJK Ideograph */ + ["\u7DA8", "\u7DA8"], /* CJK Ideograph */ + ["\u7DA9", "\u7DA9"], /* CJK Ideograph */ + ["\u7DAA", "\u7DAA"], /* CJK Ideograph */ + ["\u7DAB", "\u7DAB"], /* CJK Ideograph */ + ["\u7DAC", "\u7DAC"], /* CJK Ideograph */ + ["\u7DAD", "\u7DAD"], /* CJK Ideograph */ + ["\u7DAE", "\u7DAE"], /* CJK Ideograph */ + ["\u7DAF", "\u7DAF"], /* CJK Ideograph */ + ["\u7DB0", "\u7DB0"], /* CJK Ideograph */ + ["\u7DB1", "\u7DB1"], /* CJK Ideograph */ + ["\u7DB2", "\u7DB2"], /* CJK Ideograph */ + ["\u7DB3", "\u7DB3"], /* CJK Ideograph */ + ["\u7DB4", "\u7DB4"], /* CJK Ideograph */ + ["\u7DB5", "\u7DB5"], /* CJK Ideograph */ + ["\u7DB6", "\u7DB6"], /* CJK Ideograph */ + ["\u7DB7", "\u7DB7"], /* CJK Ideograph */ + ["\u7DB8", "\u7DB8"], /* CJK Ideograph */ + ["\u7DB9", "\u7DB9"], /* CJK Ideograph */ + ["\u7DBA", "\u7DBA"], /* CJK Ideograph */ + ["\u7DBB", "\u7DBB"], /* CJK Ideograph */ + ["\u7DBC", "\u7DBC"], /* CJK Ideograph */ + ["\u7DBD", "\u7DBD"], /* CJK Ideograph */ + ["\u7DBE", "\u7DBE"], /* CJK Ideograph */ + ["\u7DBF", "\u7DBF"], /* CJK Ideograph */ + ["\u7DC0", "\u7DC0"], /* CJK Ideograph */ + ["\u7DC1", "\u7DC1"], /* CJK Ideograph */ + ["\u7DC2", "\u7DC2"], /* CJK Ideograph */ + ["\u7DC3", "\u7DC3"], /* CJK Ideograph */ + ["\u7DC4", "\u7DC4"], /* CJK Ideograph */ + ["\u7DC5", "\u7DC5"], /* CJK Ideograph */ + ["\u7DC6", "\u7DC6"], /* CJK Ideograph */ + ["\u7DC7", "\u7DC7"], /* CJK Ideograph */ + ["\u7DC8", "\u7DC8"], /* CJK Ideograph */ + ["\u7DC9", "\u7DC9"], /* CJK Ideograph */ + ["\u7DCA", "\u7DCA"], /* CJK Ideograph */ + ["\u7DCB", "\u7DCB"], /* CJK Ideograph */ + ["\u7DCC", "\u7DCC"], /* CJK Ideograph */ + ["\u7DCD", "\u7DCD"], /* CJK Ideograph */ + ["\u7DCE", "\u7DCE"], /* CJK Ideograph */ + ["\u7DCF", "\u7DCF"], /* CJK Ideograph */ + ["\u7DD0", "\u7DD0"], /* CJK Ideograph */ + ["\u7DD1", "\u7DD1"], /* CJK Ideograph */ + ["\u7DD2", "\u7DD2"], /* CJK Ideograph */ + ["\u7DD3", "\u7DD3"], /* CJK Ideograph */ + ["\u7DD4", "\u7DD4"], /* CJK Ideograph */ + ["\u7DD5", "\u7DD5"], /* CJK Ideograph */ + ["\u7DD6", "\u7DD6"], /* CJK Ideograph */ + ["\u7DD7", "\u7DD7"], /* CJK Ideograph */ + ["\u7DD8", "\u7DD8"], /* CJK Ideograph */ + ["\u7DD9", "\u7DD9"], /* CJK Ideograph */ + ["\u7DDA", "\u7DDA"], /* CJK Ideograph */ + ["\u7DDB", "\u7DDB"], /* CJK Ideograph */ + ["\u7DDC", "\u7DDC"], /* CJK Ideograph */ + ["\u7DDD", "\u7DDD"], /* CJK Ideograph */ + ["\u7DDE", "\u7DDE"], /* CJK Ideograph */ + ["\u7DDF", "\u7DDF"], /* CJK Ideograph */ + ["\u7DE0", "\u7DE0"], /* CJK Ideograph */ + ["\u7DE1", "\u7DE1"], /* CJK Ideograph */ + ["\u7DE2", "\u7DE2"], /* CJK Ideograph */ + ["\u7DE3", "\u7DE3"], /* CJK Ideograph */ + ["\u7DE4", "\u7DE4"], /* CJK Ideograph */ + ["\u7DE5", "\u7DE5"], /* CJK Ideograph */ + ["\u7DE6", "\u7DE6"], /* CJK Ideograph */ + ["\u7DE7", "\u7DE7"], /* CJK Ideograph */ + ["\u7DE8", "\u7DE8"], /* CJK Ideograph */ + ["\u7DE9", "\u7DE9"], /* CJK Ideograph */ + ["\u7DEA", "\u7DEA"], /* CJK Ideograph */ + ["\u7DEB", "\u7DEB"], /* CJK Ideograph */ + ["\u7DEC", "\u7DEC"], /* CJK Ideograph */ + ["\u7DED", "\u7DED"], /* CJK Ideograph */ + ["\u7DEE", "\u7DEE"], /* CJK Ideograph */ + ["\u7DEF", "\u7DEF"], /* CJK Ideograph */ + ["\u7DF0", "\u7DF0"], /* CJK Ideograph */ + ["\u7DF1", "\u7DF1"], /* CJK Ideograph */ + ["\u7DF2", "\u7DF2"], /* CJK Ideograph */ + ["\u7DF3", "\u7DF3"], /* CJK Ideograph */ + ["\u7DF4", "\u7DF4"], /* CJK Ideograph */ + ["\u7DF5", "\u7DF5"], /* CJK Ideograph */ + ["\u7DF6", "\u7DF6"], /* CJK Ideograph */ + ["\u7DF7", "\u7DF7"], /* CJK Ideograph */ + ["\u7DF8", "\u7DF8"], /* CJK Ideograph */ + ["\u7DF9", "\u7DF9"], /* CJK Ideograph */ + ["\u7DFA", "\u7DFA"], /* CJK Ideograph */ + ["\u7DFB", "\u7DFB"], /* CJK Ideograph */ + ["\u7DFC", "\u7DFC"], /* CJK Ideograph */ + ["\u7DFD", "\u7DFD"], /* CJK Ideograph */ + ["\u7DFE", "\u7DFE"], /* CJK Ideograph */ + ["\u7DFF", "\u7DFF"], /* CJK Ideograph */ + ["\u7E00", "\u7E00"], /* CJK Ideograph */ + ["\u7E01", "\u7E01"], /* CJK Ideograph */ + ["\u7E02", "\u7E02"], /* CJK Ideograph */ + ["\u7E03", "\u7E03"], /* CJK Ideograph */ + ["\u7E04", "\u7E04"], /* CJK Ideograph */ + ["\u7E05", "\u7E05"], /* CJK Ideograph */ + ["\u7E06", "\u7E06"], /* CJK Ideograph */ + ["\u7E07", "\u7E07"], /* CJK Ideograph */ + ["\u7E08", "\u7E08"], /* CJK Ideograph */ + ["\u7E09", "\u7E09"], /* CJK Ideograph */ + ["\u7E0A", "\u7E0A"], /* CJK Ideograph */ + ["\u7E0B", "\u7E0B"], /* CJK Ideograph */ + ["\u7E0C", "\u7E0C"], /* CJK Ideograph */ + ["\u7E0D", "\u7E0D"], /* CJK Ideograph */ + ["\u7E0E", "\u7E0E"], /* CJK Ideograph */ + ["\u7E0F", "\u7E0F"], /* CJK Ideograph */ + ["\u7E10", "\u7E10"], /* CJK Ideograph */ + ["\u7E11", "\u7E11"], /* CJK Ideograph */ + ["\u7E12", "\u7E12"], /* CJK Ideograph */ + ["\u7E13", "\u7E13"], /* CJK Ideograph */ + ["\u7E14", "\u7E14"], /* CJK Ideograph */ + ["\u7E15", "\u7E15"], /* CJK Ideograph */ + ["\u7E16", "\u7E16"], /* CJK Ideograph */ + ["\u7E17", "\u7E17"], /* CJK Ideograph */ + ["\u7E18", "\u7E18"], /* CJK Ideograph */ + ["\u7E19", "\u7E19"], /* CJK Ideograph */ + ["\u7E1A", "\u7E1A"], /* CJK Ideograph */ + ["\u7E1B", "\u7E1B"], /* CJK Ideograph */ + ["\u7E1C", "\u7E1C"], /* CJK Ideograph */ + ["\u7E1D", "\u7E1D"], /* CJK Ideograph */ + ["\u7E1E", "\u7E1E"], /* CJK Ideograph */ + ["\u7E1F", "\u7E1F"], /* CJK Ideograph */ + ["\u7E20", "\u7E20"], /* CJK Ideograph */ + ["\u7E21", "\u7E21"], /* CJK Ideograph */ + ["\u7E22", "\u7E22"], /* CJK Ideograph */ + ["\u7E23", "\u7E23"], /* CJK Ideograph */ + ["\u7E24", "\u7E24"], /* CJK Ideograph */ + ["\u7E25", "\u7E25"], /* CJK Ideograph */ + ["\u7E26", "\u7E26"], /* CJK Ideograph */ + ["\u7E27", "\u7E27"], /* CJK Ideograph */ + ["\u7E28", "\u7E28"], /* CJK Ideograph */ + ["\u7E29", "\u7E29"], /* CJK Ideograph */ + ["\u7E2A", "\u7E2A"], /* CJK Ideograph */ + ["\u7E2B", "\u7E2B"], /* CJK Ideograph */ + ["\u7E2C", "\u7E2C"], /* CJK Ideograph */ + ["\u7E2D", "\u7E2D"], /* CJK Ideograph */ + ["\u7E2E", "\u7E2E"], /* CJK Ideograph */ + ["\u7E2F", "\u7E2F"], /* CJK Ideograph */ + ["\u7E30", "\u7E30"], /* CJK Ideograph */ + ["\u7E31", "\u7E31"], /* CJK Ideograph */ + ["\u7E32", "\u7E32"], /* CJK Ideograph */ + ["\u7E33", "\u7E33"], /* CJK Ideograph */ + ["\u7E34", "\u7E34"], /* CJK Ideograph */ + ["\u7E35", "\u7E35"], /* CJK Ideograph */ + ["\u7E36", "\u7E36"], /* CJK Ideograph */ + ["\u7E37", "\u7E37"], /* CJK Ideograph */ + ["\u7E38", "\u7E38"], /* CJK Ideograph */ + ["\u7E39", "\u7E39"], /* CJK Ideograph */ + ["\u7E3A", "\u7E3A"], /* CJK Ideograph */ + ["\u7E3B", "\u7E3B"], /* CJK Ideograph */ + ["\u7E3C", "\u7E3C"], /* CJK Ideograph */ + ["\u7E3D", "\u7E3D"], /* CJK Ideograph */ + ["\u7E3E", "\u7E3E"], /* CJK Ideograph */ + ["\u7E3F", "\u7E3F"], /* CJK Ideograph */ + ["\u7E40", "\u7E40"], /* CJK Ideograph */ + ["\u7E41", "\u7E41"], /* CJK Ideograph */ + ["\u7E42", "\u7E42"], /* CJK Ideograph */ + ["\u7E43", "\u7E43"], /* CJK Ideograph */ + ["\u7E44", "\u7E44"], /* CJK Ideograph */ + ["\u7E45", "\u7E45"], /* CJK Ideograph */ + ["\u7E46", "\u7E46"], /* CJK Ideograph */ + ["\u7E47", "\u7E47"], /* CJK Ideograph */ + ["\u7E48", "\u7E48"], /* CJK Ideograph */ + ["\u7E49", "\u7E49"], /* CJK Ideograph */ + ["\u7E4A", "\u7E4A"], /* CJK Ideograph */ + ["\u7E4B", "\u7E4B"], /* CJK Ideograph */ + ["\u7E4C", "\u7E4C"], /* CJK Ideograph */ + ["\u7E4D", "\u7E4D"], /* CJK Ideograph */ + ["\u7E4E", "\u7E4E"], /* CJK Ideograph */ + ["\u7E4F", "\u7E4F"], /* CJK Ideograph */ + ["\u7E50", "\u7E50"], /* CJK Ideograph */ + ["\u7E51", "\u7E51"], /* CJK Ideograph */ + ["\u7E52", "\u7E52"], /* CJK Ideograph */ + ["\u7E53", "\u7E53"], /* CJK Ideograph */ + ["\u7E54", "\u7E54"], /* CJK Ideograph */ + ["\u7E55", "\u7E55"], /* CJK Ideograph */ + ["\u7E56", "\u7E56"], /* CJK Ideograph */ + ["\u7E57", "\u7E57"], /* CJK Ideograph */ + ["\u7E58", "\u7E58"], /* CJK Ideograph */ + ["\u7E59", "\u7E59"], /* CJK Ideograph */ + ["\u7E5A", "\u7E5A"], /* CJK Ideograph */ + ["\u7E5B", "\u7E5B"], /* CJK Ideograph */ + ["\u7E5C", "\u7E5C"], /* CJK Ideograph */ + ["\u7E5D", "\u7E5D"], /* CJK Ideograph */ + ["\u7E5E", "\u7E5E"], /* CJK Ideograph */ + ["\u7E5F", "\u7E5F"], /* CJK Ideograph */ + ["\u7E60", "\u7E60"], /* CJK Ideograph */ + ["\u7E61", "\u7E61"], /* CJK Ideograph */ + ["\u7E62", "\u7E62"], /* CJK Ideograph */ + ["\u7E63", "\u7E63"], /* CJK Ideograph */ + ["\u7E64", "\u7E64"], /* CJK Ideograph */ + ["\u7E65", "\u7E65"], /* CJK Ideograph */ + ["\u7E66", "\u7E66"], /* CJK Ideograph */ + ["\u7E67", "\u7E67"], /* CJK Ideograph */ + ["\u7E68", "\u7E68"], /* CJK Ideograph */ + ["\u7E69", "\u7E69"], /* CJK Ideograph */ + ["\u7E6A", "\u7E6A"], /* CJK Ideograph */ + ["\u7E6B", "\u7E6B"], /* CJK Ideograph */ + ["\u7E6C", "\u7E6C"], /* CJK Ideograph */ + ["\u7E6D", "\u7E6D"], /* CJK Ideograph */ + ["\u7E6E", "\u7E6E"], /* CJK Ideograph */ + ["\u7E6F", "\u7E6F"], /* CJK Ideograph */ + ["\u7E70", "\u7E70"], /* CJK Ideograph */ + ["\u7E71", "\u7E71"], /* CJK Ideograph */ + ["\u7E72", "\u7E72"], /* CJK Ideograph */ + ["\u7E73", "\u7E73"], /* CJK Ideograph */ + ["\u7E74", "\u7E74"], /* CJK Ideograph */ + ["\u7E75", "\u7E75"], /* CJK Ideograph */ + ["\u7E76", "\u7E76"], /* CJK Ideograph */ + ["\u7E77", "\u7E77"], /* CJK Ideograph */ + ["\u7E78", "\u7E78"], /* CJK Ideograph */ + ["\u7E79", "\u7E79"], /* CJK Ideograph */ + ["\u7E7A", "\u7E7A"], /* CJK Ideograph */ + ["\u7E7B", "\u7E7B"], /* CJK Ideograph */ + ["\u7E7C", "\u7E7C"], /* CJK Ideograph */ + ["\u7E7D", "\u7E7D"], /* CJK Ideograph */ + ["\u7E7E", "\u7E7E"], /* CJK Ideograph */ + ["\u7E7F", "\u7E7F"], /* CJK Ideograph */ + ["\u7E80", "\u7E80"], /* CJK Ideograph */ + ["\u7E81", "\u7E81"], /* CJK Ideograph */ + ["\u7E82", "\u7E82"], /* CJK Ideograph */ + ["\u7E83", "\u7E83"], /* CJK Ideograph */ + ["\u7E84", "\u7E84"], /* CJK Ideograph */ + ["\u7E85", "\u7E85"], /* CJK Ideograph */ + ["\u7E86", "\u7E86"], /* CJK Ideograph */ + ["\u7E87", "\u7E87"], /* CJK Ideograph */ + ["\u7E88", "\u7E88"], /* CJK Ideograph */ + ["\u7E89", "\u7E89"], /* CJK Ideograph */ + ["\u7E8A", "\u7E8A"], /* CJK Ideograph */ + ["\u7E8B", "\u7E8B"], /* CJK Ideograph */ + ["\u7E8C", "\u7E8C"], /* CJK Ideograph */ + ["\u7E8D", "\u7E8D"], /* CJK Ideograph */ + ["\u7E8E", "\u7E8E"], /* CJK Ideograph */ + ["\u7E8F", "\u7E8F"], /* CJK Ideograph */ + ["\u7E90", "\u7E90"], /* CJK Ideograph */ + ["\u7E91", "\u7E91"], /* CJK Ideograph */ + ["\u7E92", "\u7E92"], /* CJK Ideograph */ + ["\u7E93", "\u7E93"], /* CJK Ideograph */ + ["\u7E94", "\u7E94"], /* CJK Ideograph */ + ["\u7E95", "\u7E95"], /* CJK Ideograph */ + ["\u7E96", "\u7E96"], /* CJK Ideograph */ + ["\u7E97", "\u7E97"], /* CJK Ideograph */ + ["\u7E98", "\u7E98"], /* CJK Ideograph */ + ["\u7E99", "\u7E99"], /* CJK Ideograph */ + ["\u7E9A", "\u7E9A"], /* CJK Ideograph */ + ["\u7E9B", "\u7E9B"], /* CJK Ideograph */ + ["\u7E9C", "\u7E9C"], /* CJK Ideograph */ + ["\u7E9D", "\u7E9D"], /* CJK Ideograph */ + ["\u7E9E", "\u7E9E"], /* CJK Ideograph */ + ["\u7E9F", "\u7E9F"], /* CJK Ideograph */ + ["\u7EA0", "\u7EA0"], /* CJK Ideograph */ + ["\u7EA1", "\u7EA1"], /* CJK Ideograph */ + ["\u7EA2", "\u7EA2"], /* CJK Ideograph */ + ["\u7EA3", "\u7EA3"], /* CJK Ideograph */ + ["\u7EA4", "\u7EA4"], /* CJK Ideograph */ + ["\u7EA5", "\u7EA5"], /* CJK Ideograph */ + ["\u7EA6", "\u7EA6"], /* CJK Ideograph */ + ["\u7EA7", "\u7EA7"], /* CJK Ideograph */ + ["\u7EA8", "\u7EA8"], /* CJK Ideograph */ + ["\u7EA9", "\u7EA9"], /* CJK Ideograph */ + ["\u7EAA", "\u7EAA"], /* CJK Ideograph */ + ["\u7EAB", "\u7EAB"], /* CJK Ideograph */ + ["\u7EAC", "\u7EAC"], /* CJK Ideograph */ + ["\u7EAD", "\u7EAD"], /* CJK Ideograph */ + ["\u7EAE", "\u7EAE"], /* CJK Ideograph */ + ["\u7EAF", "\u7EAF"], /* CJK Ideograph */ + ["\u7EB0", "\u7EB0"], /* CJK Ideograph */ + ["\u7EB1", "\u7EB1"], /* CJK Ideograph */ + ["\u7EB2", "\u7EB2"], /* CJK Ideograph */ + ["\u7EB3", "\u7EB3"], /* CJK Ideograph */ + ["\u7EB4", "\u7EB4"], /* CJK Ideograph */ + ["\u7EB5", "\u7EB5"], /* CJK Ideograph */ + ["\u7EB6", "\u7EB6"], /* CJK Ideograph */ + ["\u7EB7", "\u7EB7"], /* CJK Ideograph */ + ["\u7EB8", "\u7EB8"], /* CJK Ideograph */ + ["\u7EB9", "\u7EB9"], /* CJK Ideograph */ + ["\u7EBA", "\u7EBA"], /* CJK Ideograph */ + ["\u7EBB", "\u7EBB"], /* CJK Ideograph */ + ["\u7EBC", "\u7EBC"], /* CJK Ideograph */ + ["\u7EBD", "\u7EBD"], /* CJK Ideograph */ + ["\u7EBE", "\u7EBE"], /* CJK Ideograph */ + ["\u7EBF", "\u7EBF"], /* CJK Ideograph */ + ["\u7EC0", "\u7EC0"], /* CJK Ideograph */ + ["\u7EC1", "\u7EC1"], /* CJK Ideograph */ + ["\u7EC2", "\u7EC2"], /* CJK Ideograph */ + ["\u7EC3", "\u7EC3"], /* CJK Ideograph */ + ["\u7EC4", "\u7EC4"], /* CJK Ideograph */ + ["\u7EC5", "\u7EC5"], /* CJK Ideograph */ + ["\u7EC6", "\u7EC6"], /* CJK Ideograph */ + ["\u7EC7", "\u7EC7"], /* CJK Ideograph */ + ["\u7EC8", "\u7EC8"], /* CJK Ideograph */ + ["\u7EC9", "\u7EC9"], /* CJK Ideograph */ + ["\u7ECA", "\u7ECA"], /* CJK Ideograph */ + ["\u7ECB", "\u7ECB"], /* CJK Ideograph */ + ["\u7ECC", "\u7ECC"], /* CJK Ideograph */ + ["\u7ECD", "\u7ECD"], /* CJK Ideograph */ + ["\u7ECE", "\u7ECE"], /* CJK Ideograph */ + ["\u7ECF", "\u7ECF"], /* CJK Ideograph */ + ["\u7ED0", "\u7ED0"], /* CJK Ideograph */ + ["\u7ED1", "\u7ED1"], /* CJK Ideograph */ + ["\u7ED2", "\u7ED2"], /* CJK Ideograph */ + ["\u7ED3", "\u7ED3"], /* CJK Ideograph */ + ["\u7ED4", "\u7ED4"], /* CJK Ideograph */ + ["\u7ED5", "\u7ED5"], /* CJK Ideograph */ + ["\u7ED6", "\u7ED6"], /* CJK Ideograph */ + ["\u7ED7", "\u7ED7"], /* CJK Ideograph */ + ["\u7ED8", "\u7ED8"], /* CJK Ideograph */ + ["\u7ED9", "\u7ED9"], /* CJK Ideograph */ + ["\u7EDA", "\u7EDA"], /* CJK Ideograph */ + ["\u7EDB", "\u7EDB"], /* CJK Ideograph */ + ["\u7EDC", "\u7EDC"], /* CJK Ideograph */ + ["\u7EDD", "\u7EDD"], /* CJK Ideograph */ + ["\u7EDE", "\u7EDE"], /* CJK Ideograph */ + ["\u7EDF", "\u7EDF"], /* CJK Ideograph */ + ["\u7EE0", "\u7EE0"], /* CJK Ideograph */ + ["\u7EE1", "\u7EE1"], /* CJK Ideograph */ + ["\u7EE2", "\u7EE2"], /* CJK Ideograph */ + ["\u7EE3", "\u7EE3"], /* CJK Ideograph */ + ["\u7EE4", "\u7EE4"], /* CJK Ideograph */ + ["\u7EE5", "\u7EE5"], /* CJK Ideograph */ + ["\u7EE6", "\u7EE6"], /* CJK Ideograph */ + ["\u7EE7", "\u7EE7"], /* CJK Ideograph */ + ["\u7EE8", "\u7EE8"], /* CJK Ideograph */ + ["\u7EE9", "\u7EE9"], /* CJK Ideograph */ + ["\u7EEA", "\u7EEA"], /* CJK Ideograph */ + ["\u7EEB", "\u7EEB"], /* CJK Ideograph */ + ["\u7EEC", "\u7EEC"], /* CJK Ideograph */ + ["\u7EED", "\u7EED"], /* CJK Ideograph */ + ["\u7EEE", "\u7EEE"], /* CJK Ideograph */ + ["\u7EEF", "\u7EEF"], /* CJK Ideograph */ + ["\u7EF0", "\u7EF0"], /* CJK Ideograph */ + ["\u7EF1", "\u7EF1"], /* CJK Ideograph */ + ["\u7EF2", "\u7EF2"], /* CJK Ideograph */ + ["\u7EF3", "\u7EF3"], /* CJK Ideograph */ + ["\u7EF4", "\u7EF4"], /* CJK Ideograph */ + ["\u7EF5", "\u7EF5"], /* CJK Ideograph */ + ["\u7EF6", "\u7EF6"], /* CJK Ideograph */ + ["\u7EF7", "\u7EF7"], /* CJK Ideograph */ + ["\u7EF8", "\u7EF8"], /* CJK Ideograph */ + ["\u7EF9", "\u7EF9"], /* CJK Ideograph */ + ["\u7EFA", "\u7EFA"], /* CJK Ideograph */ + ["\u7EFB", "\u7EFB"], /* CJK Ideograph */ + ["\u7EFC", "\u7EFC"], /* CJK Ideograph */ + ["\u7EFD", "\u7EFD"], /* CJK Ideograph */ + ["\u7EFE", "\u7EFE"], /* CJK Ideograph */ + ["\u7EFF", "\u7EFF"], /* CJK Ideograph */ + ["\u7F00", "\u7F00"], /* CJK Ideograph */ + ["\u7F01", "\u7F01"], /* CJK Ideograph */ + ["\u7F02", "\u7F02"], /* CJK Ideograph */ + ["\u7F03", "\u7F03"], /* CJK Ideograph */ + ["\u7F04", "\u7F04"], /* CJK Ideograph */ + ["\u7F05", "\u7F05"], /* CJK Ideograph */ + ["\u7F06", "\u7F06"], /* CJK Ideograph */ + ["\u7F07", "\u7F07"], /* CJK Ideograph */ + ["\u7F08", "\u7F08"], /* CJK Ideograph */ + ["\u7F09", "\u7F09"], /* CJK Ideograph */ + ["\u7F0A", "\u7F0A"], /* CJK Ideograph */ + ["\u7F0B", "\u7F0B"], /* CJK Ideograph */ + ["\u7F0C", "\u7F0C"], /* CJK Ideograph */ + ["\u7F0D", "\u7F0D"], /* CJK Ideograph */ + ["\u7F0E", "\u7F0E"], /* CJK Ideograph */ + ["\u7F0F", "\u7F0F"], /* CJK Ideograph */ + ["\u7F10", "\u7F10"], /* CJK Ideograph */ + ["\u7F11", "\u7F11"], /* CJK Ideograph */ + ["\u7F12", "\u7F12"], /* CJK Ideograph */ + ["\u7F13", "\u7F13"], /* CJK Ideograph */ + ["\u7F14", "\u7F14"], /* CJK Ideograph */ + ["\u7F15", "\u7F15"], /* CJK Ideograph */ + ["\u7F16", "\u7F16"], /* CJK Ideograph */ + ["\u7F17", "\u7F17"], /* CJK Ideograph */ + ["\u7F18", "\u7F18"], /* CJK Ideograph */ + ["\u7F19", "\u7F19"], /* CJK Ideograph */ + ["\u7F1A", "\u7F1A"], /* CJK Ideograph */ + ["\u7F1B", "\u7F1B"], /* CJK Ideograph */ + ["\u7F1C", "\u7F1C"], /* CJK Ideograph */ + ["\u7F1D", "\u7F1D"], /* CJK Ideograph */ + ["\u7F1E", "\u7F1E"], /* CJK Ideograph */ + ["\u7F1F", "\u7F1F"], /* CJK Ideograph */ + ["\u7F20", "\u7F20"], /* CJK Ideograph */ + ["\u7F21", "\u7F21"], /* CJK Ideograph */ + ["\u7F22", "\u7F22"], /* CJK Ideograph */ + ["\u7F23", "\u7F23"], /* CJK Ideograph */ + ["\u7F24", "\u7F24"], /* CJK Ideograph */ + ["\u7F25", "\u7F25"], /* CJK Ideograph */ + ["\u7F26", "\u7F26"], /* CJK Ideograph */ + ["\u7F27", "\u7F27"], /* CJK Ideograph */ + ["\u7F28", "\u7F28"], /* CJK Ideograph */ + ["\u7F29", "\u7F29"], /* CJK Ideograph */ + ["\u7F2A", "\u7F2A"], /* CJK Ideograph */ + ["\u7F2B", "\u7F2B"], /* CJK Ideograph */ + ["\u7F2C", "\u7F2C"], /* CJK Ideograph */ + ["\u7F2D", "\u7F2D"], /* CJK Ideograph */ + ["\u7F2E", "\u7F2E"], /* CJK Ideograph */ + ["\u7F2F", "\u7F2F"], /* CJK Ideograph */ + ["\u7F30", "\u7F30"], /* CJK Ideograph */ + ["\u7F31", "\u7F31"], /* CJK Ideograph */ + ["\u7F32", "\u7F32"], /* CJK Ideograph */ + ["\u7F33", "\u7F33"], /* CJK Ideograph */ + ["\u7F34", "\u7F34"], /* CJK Ideograph */ + ["\u7F35", "\u7F35"], /* CJK Ideograph */ + ["\u7F36", "\u7F36"], /* CJK Ideograph */ + ["\u7F37", "\u7F37"], /* CJK Ideograph */ + ["\u7F38", "\u7F38"], /* CJK Ideograph */ + ["\u7F39", "\u7F39"], /* CJK Ideograph */ + ["\u7F3A", "\u7F3A"], /* CJK Ideograph */ + ["\u7F3B", "\u7F3B"], /* CJK Ideograph */ + ["\u7F3C", "\u7F3C"], /* CJK Ideograph */ + ["\u7F3D", "\u7F3D"], /* CJK Ideograph */ + ["\u7F3E", "\u7F3E"], /* CJK Ideograph */ + ["\u7F3F", "\u7F3F"], /* CJK Ideograph */ + ["\u7F40", "\u7F40"], /* CJK Ideograph */ + ["\u7F41", "\u7F41"], /* CJK Ideograph */ + ["\u7F42", "\u7F42"], /* CJK Ideograph */ + ["\u7F43", "\u7F43"], /* CJK Ideograph */ + ["\u7F44", "\u7F44"], /* CJK Ideograph */ + ["\u7F45", "\u7F45"], /* CJK Ideograph */ + ["\u7F46", "\u7F46"], /* CJK Ideograph */ + ["\u7F47", "\u7F47"], /* CJK Ideograph */ + ["\u7F48", "\u7F48"], /* CJK Ideograph */ + ["\u7F49", "\u7F49"], /* CJK Ideograph */ + ["\u7F4A", "\u7F4A"], /* CJK Ideograph */ + ["\u7F4B", "\u7F4B"], /* CJK Ideograph */ + ["\u7F4C", "\u7F4C"], /* CJK Ideograph */ + ["\u7F4D", "\u7F4D"], /* CJK Ideograph */ + ["\u7F4E", "\u7F4E"], /* CJK Ideograph */ + ["\u7F4F", "\u7F4F"], /* CJK Ideograph */ + ["\u7F50", "\u7F50"], /* CJK Ideograph */ + ["\u7F51", "\u7F51"], /* CJK Ideograph */ + ["\u7F52", "\u7F52"], /* CJK Ideograph */ + ["\u7F53", "\u7F53"], /* CJK Ideograph */ + ["\u7F54", "\u7F54"], /* CJK Ideograph */ + ["\u7F55", "\u7F55"], /* CJK Ideograph */ + ["\u7F56", "\u7F56"], /* CJK Ideograph */ + ["\u7F57", "\u7F57"], /* CJK Ideograph */ + ["\u7F58", "\u7F58"], /* CJK Ideograph */ + ["\u7F59", "\u7F59"], /* CJK Ideograph */ + ["\u7F5A", "\u7F5A"], /* CJK Ideograph */ + ["\u7F5B", "\u7F5B"], /* CJK Ideograph */ + ["\u7F5C", "\u7F5C"], /* CJK Ideograph */ + ["\u7F5D", "\u7F5D"], /* CJK Ideograph */ + ["\u7F5E", "\u7F5E"], /* CJK Ideograph */ + ["\u7F5F", "\u7F5F"], /* CJK Ideograph */ + ["\u7F60", "\u7F60"], /* CJK Ideograph */ + ["\u7F61", "\u7F61"], /* CJK Ideograph */ + ["\u7F62", "\u7F62"], /* CJK Ideograph */ + ["\u7F63", "\u7F63"], /* CJK Ideograph */ + ["\u7F64", "\u7F64"], /* CJK Ideograph */ + ["\u7F65", "\u7F65"], /* CJK Ideograph */ + ["\u7F66", "\u7F66"], /* CJK Ideograph */ + ["\u7F67", "\u7F67"], /* CJK Ideograph */ + ["\u7F68", "\u7F68"], /* CJK Ideograph */ + ["\u7F69", "\u7F69"], /* CJK Ideograph */ + ["\u7F6A", "\u7F6A"], /* CJK Ideograph */ + ["\u7F6B", "\u7F6B"], /* CJK Ideograph */ + ["\u7F6C", "\u7F6C"], /* CJK Ideograph */ + ["\u7F6D", "\u7F6D"], /* CJK Ideograph */ + ["\u7F6E", "\u7F6E"], /* CJK Ideograph */ + ["\u7F6F", "\u7F6F"], /* CJK Ideograph */ + ["\u7F70", "\u7F70"], /* CJK Ideograph */ + ["\u7F71", "\u7F71"], /* CJK Ideograph */ + ["\u7F72", "\u7F72"], /* CJK Ideograph */ + ["\u7F73", "\u7F73"], /* CJK Ideograph */ + ["\u7F74", "\u7F74"], /* CJK Ideograph */ + ["\u7F75", "\u7F75"], /* CJK Ideograph */ + ["\u7F76", "\u7F76"], /* CJK Ideograph */ + ["\u7F77", "\u7F77"], /* CJK Ideograph */ + ["\u7F78", "\u7F78"], /* CJK Ideograph */ + ["\u7F79", "\u7F79"], /* CJK Ideograph */ + ["\u7F7A", "\u7F7A"], /* CJK Ideograph */ + ["\u7F7B", "\u7F7B"], /* CJK Ideograph */ + ["\u7F7C", "\u7F7C"], /* CJK Ideograph */ + ["\u7F7D", "\u7F7D"], /* CJK Ideograph */ + ["\u7F7E", "\u7F7E"], /* CJK Ideograph */ + ["\u7F7F", "\u7F7F"], /* CJK Ideograph */ + ["\u7F80", "\u7F80"], /* CJK Ideograph */ + ["\u7F81", "\u7F81"], /* CJK Ideograph */ + ["\u7F82", "\u7F82"], /* CJK Ideograph */ + ["\u7F83", "\u7F83"], /* CJK Ideograph */ + ["\u7F84", "\u7F84"], /* CJK Ideograph */ + ["\u7F85", "\u7F85"], /* CJK Ideograph */ + ["\u7F86", "\u7F86"], /* CJK Ideograph */ + ["\u7F87", "\u7F87"], /* CJK Ideograph */ + ["\u7F88", "\u7F88"], /* CJK Ideograph */ + ["\u7F89", "\u7F89"], /* CJK Ideograph */ + ["\u7F8A", "\u7F8A"], /* CJK Ideograph */ + ["\u7F8B", "\u7F8B"], /* CJK Ideograph */ + ["\u7F8C", "\u7F8C"], /* CJK Ideograph */ + ["\u7F8D", "\u7F8D"], /* CJK Ideograph */ + ["\u7F8E", "\u7F8E"], /* CJK Ideograph */ + ["\u7F8F", "\u7F8F"], /* CJK Ideograph */ + ["\u7F90", "\u7F90"], /* CJK Ideograph */ + ["\u7F91", "\u7F91"], /* CJK Ideograph */ + ["\u7F92", "\u7F92"], /* CJK Ideograph */ + ["\u7F93", "\u7F93"], /* CJK Ideograph */ + ["\u7F94", "\u7F94"], /* CJK Ideograph */ + ["\u7F95", "\u7F95"], /* CJK Ideograph */ + ["\u7F96", "\u7F96"], /* CJK Ideograph */ + ["\u7F97", "\u7F97"], /* CJK Ideograph */ + ["\u7F98", "\u7F98"], /* CJK Ideograph */ + ["\u7F99", "\u7F99"], /* CJK Ideograph */ + ["\u7F9A", "\u7F9A"], /* CJK Ideograph */ + ["\u7F9B", "\u7F9B"], /* CJK Ideograph */ + ["\u7F9C", "\u7F9C"], /* CJK Ideograph */ + ["\u7F9D", "\u7F9D"], /* CJK Ideograph */ + ["\u7F9E", "\u7F9E"], /* CJK Ideograph */ + ["\u7F9F", "\u7F9F"], /* CJK Ideograph */ + ["\u7FA0", "\u7FA0"], /* CJK Ideograph */ + ["\u7FA1", "\u7FA1"], /* CJK Ideograph */ + ["\u7FA2", "\u7FA2"], /* CJK Ideograph */ + ["\u7FA3", "\u7FA3"], /* CJK Ideograph */ + ["\u7FA4", "\u7FA4"], /* CJK Ideograph */ + ["\u7FA5", "\u7FA5"], /* CJK Ideograph */ + ["\u7FA6", "\u7FA6"], /* CJK Ideograph */ + ["\u7FA7", "\u7FA7"], /* CJK Ideograph */ + ["\u7FA8", "\u7FA8"], /* CJK Ideograph */ + ["\u7FA9", "\u7FA9"], /* CJK Ideograph */ + ["\u7FAA", "\u7FAA"], /* CJK Ideograph */ + ["\u7FAB", "\u7FAB"], /* CJK Ideograph */ + ["\u7FAC", "\u7FAC"], /* CJK Ideograph */ + ["\u7FAD", "\u7FAD"], /* CJK Ideograph */ + ["\u7FAE", "\u7FAE"], /* CJK Ideograph */ + ["\u7FAF", "\u7FAF"], /* CJK Ideograph */ + ["\u7FB0", "\u7FB0"], /* CJK Ideograph */ + ["\u7FB1", "\u7FB1"], /* CJK Ideograph */ + ["\u7FB2", "\u7FB2"], /* CJK Ideograph */ + ["\u7FB3", "\u7FB3"], /* CJK Ideograph */ + ["\u7FB4", "\u7FB4"], /* CJK Ideograph */ + ["\u7FB5", "\u7FB5"], /* CJK Ideograph */ + ["\u7FB6", "\u7FB6"], /* CJK Ideograph */ + ["\u7FB7", "\u7FB7"], /* CJK Ideograph */ + ["\u7FB8", "\u7FB8"], /* CJK Ideograph */ + ["\u7FB9", "\u7FB9"], /* CJK Ideograph */ + ["\u7FBA", "\u7FBA"], /* CJK Ideograph */ + ["\u7FBB", "\u7FBB"], /* CJK Ideograph */ + ["\u7FBC", "\u7FBC"], /* CJK Ideograph */ + ["\u7FBD", "\u7FBD"], /* CJK Ideograph */ + ["\u7FBE", "\u7FBE"], /* CJK Ideograph */ + ["\u7FBF", "\u7FBF"], /* CJK Ideograph */ + ["\u7FC0", "\u7FC0"], /* CJK Ideograph */ + ["\u7FC1", "\u7FC1"], /* CJK Ideograph */ + ["\u7FC2", "\u7FC2"], /* CJK Ideograph */ + ["\u7FC3", "\u7FC3"], /* CJK Ideograph */ + ["\u7FC4", "\u7FC4"], /* CJK Ideograph */ + ["\u7FC5", "\u7FC5"], /* CJK Ideograph */ + ["\u7FC6", "\u7FC6"], /* CJK Ideograph */ + ["\u7FC7", "\u7FC7"], /* CJK Ideograph */ + ["\u7FC8", "\u7FC8"], /* CJK Ideograph */ + ["\u7FC9", "\u7FC9"], /* CJK Ideograph */ + ["\u7FCA", "\u7FCA"], /* CJK Ideograph */ + ["\u7FCB", "\u7FCB"], /* CJK Ideograph */ + ["\u7FCC", "\u7FCC"], /* CJK Ideograph */ + ["\u7FCD", "\u7FCD"], /* CJK Ideograph */ + ["\u7FCE", "\u7FCE"], /* CJK Ideograph */ + ["\u7FCF", "\u7FCF"], /* CJK Ideograph */ + ["\u7FD0", "\u7FD0"], /* CJK Ideograph */ + ["\u7FD1", "\u7FD1"], /* CJK Ideograph */ + ["\u7FD2", "\u7FD2"], /* CJK Ideograph */ + ["\u7FD3", "\u7FD3"], /* CJK Ideograph */ + ["\u7FD4", "\u7FD4"], /* CJK Ideograph */ + ["\u7FD5", "\u7FD5"], /* CJK Ideograph */ + ["\u7FD6", "\u7FD6"], /* CJK Ideograph */ + ["\u7FD7", "\u7FD7"], /* CJK Ideograph */ + ["\u7FD8", "\u7FD8"], /* CJK Ideograph */ + ["\u7FD9", "\u7FD9"], /* CJK Ideograph */ + ["\u7FDA", "\u7FDA"], /* CJK Ideograph */ + ["\u7FDB", "\u7FDB"], /* CJK Ideograph */ + ["\u7FDC", "\u7FDC"], /* CJK Ideograph */ + ["\u7FDD", "\u7FDD"], /* CJK Ideograph */ + ["\u7FDE", "\u7FDE"], /* CJK Ideograph */ + ["\u7FDF", "\u7FDF"], /* CJK Ideograph */ + ["\u7FE0", "\u7FE0"], /* CJK Ideograph */ + ["\u7FE1", "\u7FE1"], /* CJK Ideograph */ + ["\u7FE2", "\u7FE2"], /* CJK Ideograph */ + ["\u7FE3", "\u7FE3"], /* CJK Ideograph */ + ["\u7FE4", "\u7FE4"], /* CJK Ideograph */ + ["\u7FE5", "\u7FE5"], /* CJK Ideograph */ + ["\u7FE6", "\u7FE6"], /* CJK Ideograph */ + ["\u7FE7", "\u7FE7"], /* CJK Ideograph */ + ["\u7FE8", "\u7FE8"], /* CJK Ideograph */ + ["\u7FE9", "\u7FE9"], /* CJK Ideograph */ + ["\u7FEA", "\u7FEA"], /* CJK Ideograph */ + ["\u7FEB", "\u7FEB"], /* CJK Ideograph */ + ["\u7FEC", "\u7FEC"], /* CJK Ideograph */ + ["\u7FED", "\u7FED"], /* CJK Ideograph */ + ["\u7FEE", "\u7FEE"], /* CJK Ideograph */ + ["\u7FEF", "\u7FEF"], /* CJK Ideograph */ + ["\u7FF0", "\u7FF0"], /* CJK Ideograph */ + ["\u7FF1", "\u7FF1"], /* CJK Ideograph */ + ["\u7FF2", "\u7FF2"], /* CJK Ideograph */ + ["\u7FF3", "\u7FF3"], /* CJK Ideograph */ + ["\u7FF4", "\u7FF4"], /* CJK Ideograph */ + ["\u7FF5", "\u7FF5"], /* CJK Ideograph */ + ["\u7FF6", "\u7FF6"], /* CJK Ideograph */ + ["\u7FF7", "\u7FF7"], /* CJK Ideograph */ + ["\u7FF8", "\u7FF8"], /* CJK Ideograph */ + ["\u7FF9", "\u7FF9"], /* CJK Ideograph */ + ["\u7FFA", "\u7FFA"], /* CJK Ideograph */ + ["\u7FFB", "\u7FFB"], /* CJK Ideograph */ + ["\u7FFC", "\u7FFC"], /* CJK Ideograph */ + ["\u7FFD", "\u7FFD"], /* CJK Ideograph */ + ["\u7FFE", "\u7FFE"], /* CJK Ideograph */ + ["\u7FFF", "\u7FFF"], /* CJK Ideograph */ + ["\u8000", "\u8000"], /* CJK Ideograph */ + ["\u8001", "\u8001"], /* CJK Ideograph */ + ["\u8002", "\u8002"], /* CJK Ideograph */ + ["\u8003", "\u8003"], /* CJK Ideograph */ + ["\u8004", "\u8004"], /* CJK Ideograph */ + ["\u8005", "\u8005"], /* CJK Ideograph */ + ["\u8006", "\u8006"], /* CJK Ideograph */ + ["\u8007", "\u8007"], /* CJK Ideograph */ + ["\u8008", "\u8008"], /* CJK Ideograph */ + ["\u8009", "\u8009"], /* CJK Ideograph */ + ["\u800A", "\u800A"], /* CJK Ideograph */ + ["\u800B", "\u800B"], /* CJK Ideograph */ + ["\u800C", "\u800C"], /* CJK Ideograph */ + ["\u800D", "\u800D"], /* CJK Ideograph */ + ["\u800E", "\u800E"], /* CJK Ideograph */ + ["\u800F", "\u800F"], /* CJK Ideograph */ + ["\u8010", "\u8010"], /* CJK Ideograph */ + ["\u8011", "\u8011"], /* CJK Ideograph */ + ["\u8012", "\u8012"], /* CJK Ideograph */ + ["\u8013", "\u8013"], /* CJK Ideograph */ + ["\u8014", "\u8014"], /* CJK Ideograph */ + ["\u8015", "\u8015"], /* CJK Ideograph */ + ["\u8016", "\u8016"], /* CJK Ideograph */ + ["\u8017", "\u8017"], /* CJK Ideograph */ + ["\u8018", "\u8018"], /* CJK Ideograph */ + ["\u8019", "\u8019"], /* CJK Ideograph */ + ["\u801A", "\u801A"], /* CJK Ideograph */ + ["\u801B", "\u801B"], /* CJK Ideograph */ + ["\u801C", "\u801C"], /* CJK Ideograph */ + ["\u801D", "\u801D"], /* CJK Ideograph */ + ["\u801E", "\u801E"], /* CJK Ideograph */ + ["\u801F", "\u801F"], /* CJK Ideograph */ + ["\u8020", "\u8020"], /* CJK Ideograph */ + ["\u8021", "\u8021"], /* CJK Ideograph */ + ["\u8022", "\u8022"], /* CJK Ideograph */ + ["\u8023", "\u8023"], /* CJK Ideograph */ + ["\u8024", "\u8024"], /* CJK Ideograph */ + ["\u8025", "\u8025"], /* CJK Ideograph */ + ["\u8026", "\u8026"], /* CJK Ideograph */ + ["\u8027", "\u8027"], /* CJK Ideograph */ + ["\u8028", "\u8028"], /* CJK Ideograph */ + ["\u8029", "\u8029"], /* CJK Ideograph */ + ["\u802A", "\u802A"], /* CJK Ideograph */ + ["\u802B", "\u802B"], /* CJK Ideograph */ + ["\u802C", "\u802C"], /* CJK Ideograph */ + ["\u802D", "\u802D"], /* CJK Ideograph */ + ["\u802E", "\u802E"], /* CJK Ideograph */ + ["\u802F", "\u802F"], /* CJK Ideograph */ + ["\u8030", "\u8030"], /* CJK Ideograph */ + ["\u8031", "\u8031"], /* CJK Ideograph */ + ["\u8032", "\u8032"], /* CJK Ideograph */ + ["\u8033", "\u8033"], /* CJK Ideograph */ + ["\u8034", "\u8034"], /* CJK Ideograph */ + ["\u8035", "\u8035"], /* CJK Ideograph */ + ["\u8036", "\u8036"], /* CJK Ideograph */ + ["\u8037", "\u8037"], /* CJK Ideograph */ + ["\u8038", "\u8038"], /* CJK Ideograph */ + ["\u8039", "\u8039"], /* CJK Ideograph */ + ["\u803A", "\u803A"], /* CJK Ideograph */ + ["\u803B", "\u803B"], /* CJK Ideograph */ + ["\u803C", "\u803C"], /* CJK Ideograph */ + ["\u803D", "\u803D"], /* CJK Ideograph */ + ["\u803E", "\u803E"], /* CJK Ideograph */ + ["\u803F", "\u803F"], /* CJK Ideograph */ + ["\u8040", "\u8040"], /* CJK Ideograph */ + ["\u8041", "\u8041"], /* CJK Ideograph */ + ["\u8042", "\u8042"], /* CJK Ideograph */ + ["\u8043", "\u8043"], /* CJK Ideograph */ + ["\u8044", "\u8044"], /* CJK Ideograph */ + ["\u8045", "\u8045"], /* CJK Ideograph */ + ["\u8046", "\u8046"], /* CJK Ideograph */ + ["\u8047", "\u8047"], /* CJK Ideograph */ + ["\u8048", "\u8048"], /* CJK Ideograph */ + ["\u8049", "\u8049"], /* CJK Ideograph */ + ["\u804A", "\u804A"], /* CJK Ideograph */ + ["\u804B", "\u804B"], /* CJK Ideograph */ + ["\u804C", "\u804C"], /* CJK Ideograph */ + ["\u804D", "\u804D"], /* CJK Ideograph */ + ["\u804E", "\u804E"], /* CJK Ideograph */ + ["\u804F", "\u804F"], /* CJK Ideograph */ + ["\u8050", "\u8050"], /* CJK Ideograph */ + ["\u8051", "\u8051"], /* CJK Ideograph */ + ["\u8052", "\u8052"], /* CJK Ideograph */ + ["\u8053", "\u8053"], /* CJK Ideograph */ + ["\u8054", "\u8054"], /* CJK Ideograph */ + ["\u8055", "\u8055"], /* CJK Ideograph */ + ["\u8056", "\u8056"], /* CJK Ideograph */ + ["\u8057", "\u8057"], /* CJK Ideograph */ + ["\u8058", "\u8058"], /* CJK Ideograph */ + ["\u8059", "\u8059"], /* CJK Ideograph */ + ["\u805A", "\u805A"], /* CJK Ideograph */ + ["\u805B", "\u805B"], /* CJK Ideograph */ + ["\u805C", "\u805C"], /* CJK Ideograph */ + ["\u805D", "\u805D"], /* CJK Ideograph */ + ["\u805E", "\u805E"], /* CJK Ideograph */ + ["\u805F", "\u805F"], /* CJK Ideograph */ + ["\u8060", "\u8060"], /* CJK Ideograph */ + ["\u8061", "\u8061"], /* CJK Ideograph */ + ["\u8062", "\u8062"], /* CJK Ideograph */ + ["\u8063", "\u8063"], /* CJK Ideograph */ + ["\u8064", "\u8064"], /* CJK Ideograph */ + ["\u8065", "\u8065"], /* CJK Ideograph */ + ["\u8066", "\u8066"], /* CJK Ideograph */ + ["\u8067", "\u8067"], /* CJK Ideograph */ + ["\u8068", "\u8068"], /* CJK Ideograph */ + ["\u8069", "\u8069"], /* CJK Ideograph */ + ["\u806A", "\u806A"], /* CJK Ideograph */ + ["\u806B", "\u806B"], /* CJK Ideograph */ + ["\u806C", "\u806C"], /* CJK Ideograph */ + ["\u806D", "\u806D"], /* CJK Ideograph */ + ["\u806E", "\u806E"], /* CJK Ideograph */ + ["\u806F", "\u806F"], /* CJK Ideograph */ + ["\u8070", "\u8070"], /* CJK Ideograph */ + ["\u8071", "\u8071"], /* CJK Ideograph */ + ["\u8072", "\u8072"], /* CJK Ideograph */ + ["\u8073", "\u8073"], /* CJK Ideograph */ + ["\u8074", "\u8074"], /* CJK Ideograph */ + ["\u8075", "\u8075"], /* CJK Ideograph */ + ["\u8076", "\u8076"], /* CJK Ideograph */ + ["\u8077", "\u8077"], /* CJK Ideograph */ + ["\u8078", "\u8078"], /* CJK Ideograph */ + ["\u8079", "\u8079"], /* CJK Ideograph */ + ["\u807A", "\u807A"], /* CJK Ideograph */ + ["\u807B", "\u807B"], /* CJK Ideograph */ + ["\u807C", "\u807C"], /* CJK Ideograph */ + ["\u807D", "\u807D"], /* CJK Ideograph */ + ["\u807E", "\u807E"], /* CJK Ideograph */ + ["\u807F", "\u807F"], /* CJK Ideograph */ + ["\u8080", "\u8080"], /* CJK Ideograph */ + ["\u8081", "\u8081"], /* CJK Ideograph */ + ["\u8082", "\u8082"], /* CJK Ideograph */ + ["\u8083", "\u8083"], /* CJK Ideograph */ + ["\u8084", "\u8084"], /* CJK Ideograph */ + ["\u8085", "\u8085"], /* CJK Ideograph */ + ["\u8086", "\u8086"], /* CJK Ideograph */ + ["\u8087", "\u8087"], /* CJK Ideograph */ + ["\u8088", "\u8088"], /* CJK Ideograph */ + ["\u8089", "\u8089"], /* CJK Ideograph */ + ["\u808A", "\u808A"], /* CJK Ideograph */ + ["\u808B", "\u808B"], /* CJK Ideograph */ + ["\u808C", "\u808C"], /* CJK Ideograph */ + ["\u808D", "\u808D"], /* CJK Ideograph */ + ["\u808E", "\u808E"], /* CJK Ideograph */ + ["\u808F", "\u808F"], /* CJK Ideograph */ + ["\u8090", "\u8090"], /* CJK Ideograph */ + ["\u8091", "\u8091"], /* CJK Ideograph */ + ["\u8092", "\u8092"], /* CJK Ideograph */ + ["\u8093", "\u8093"], /* CJK Ideograph */ + ["\u8094", "\u8094"], /* CJK Ideograph */ + ["\u8095", "\u8095"], /* CJK Ideograph */ + ["\u8096", "\u8096"], /* CJK Ideograph */ + ["\u8097", "\u8097"], /* CJK Ideograph */ + ["\u8098", "\u8098"], /* CJK Ideograph */ + ["\u8099", "\u8099"], /* CJK Ideograph */ + ["\u809A", "\u809A"], /* CJK Ideograph */ + ["\u809B", "\u809B"], /* CJK Ideograph */ + ["\u809C", "\u809C"], /* CJK Ideograph */ + ["\u809D", "\u809D"], /* CJK Ideograph */ + ["\u809E", "\u809E"], /* CJK Ideograph */ + ["\u809F", "\u809F"], /* CJK Ideograph */ + ["\u80A0", "\u80A0"], /* CJK Ideograph */ + ["\u80A1", "\u80A1"], /* CJK Ideograph */ + ["\u80A2", "\u80A2"], /* CJK Ideograph */ + ["\u80A3", "\u80A3"], /* CJK Ideograph */ + ["\u80A4", "\u80A4"], /* CJK Ideograph */ + ["\u80A5", "\u80A5"], /* CJK Ideograph */ + ["\u80A6", "\u80A6"], /* CJK Ideograph */ + ["\u80A7", "\u80A7"], /* CJK Ideograph */ + ["\u80A8", "\u80A8"], /* CJK Ideograph */ + ["\u80A9", "\u80A9"], /* CJK Ideograph */ + ["\u80AA", "\u80AA"], /* CJK Ideograph */ + ["\u80AB", "\u80AB"], /* CJK Ideograph */ + ["\u80AC", "\u80AC"], /* CJK Ideograph */ + ["\u80AD", "\u80AD"], /* CJK Ideograph */ + ["\u80AE", "\u80AE"], /* CJK Ideograph */ + ["\u80AF", "\u80AF"], /* CJK Ideograph */ + ["\u80B0", "\u80B0"], /* CJK Ideograph */ + ["\u80B1", "\u80B1"], /* CJK Ideograph */ + ["\u80B2", "\u80B2"], /* CJK Ideograph */ + ["\u80B3", "\u80B3"], /* CJK Ideograph */ + ["\u80B4", "\u80B4"], /* CJK Ideograph */ + ["\u80B5", "\u80B5"], /* CJK Ideograph */ + ["\u80B6", "\u80B6"], /* CJK Ideograph */ + ["\u80B7", "\u80B7"], /* CJK Ideograph */ + ["\u80B8", "\u80B8"], /* CJK Ideograph */ + ["\u80B9", "\u80B9"], /* CJK Ideograph */ + ["\u80BA", "\u80BA"], /* CJK Ideograph */ + ["\u80BB", "\u80BB"], /* CJK Ideograph */ + ["\u80BC", "\u80BC"], /* CJK Ideograph */ + ["\u80BD", "\u80BD"], /* CJK Ideograph */ + ["\u80BE", "\u80BE"], /* CJK Ideograph */ + ["\u80BF", "\u80BF"], /* CJK Ideograph */ + ["\u80C0", "\u80C0"], /* CJK Ideograph */ + ["\u80C1", "\u80C1"], /* CJK Ideograph */ + ["\u80C2", "\u80C2"], /* CJK Ideograph */ + ["\u80C3", "\u80C3"], /* CJK Ideograph */ + ["\u80C4", "\u80C4"], /* CJK Ideograph */ + ["\u80C5", "\u80C5"], /* CJK Ideograph */ + ["\u80C6", "\u80C6"], /* CJK Ideograph */ + ["\u80C7", "\u80C7"], /* CJK Ideograph */ + ["\u80C8", "\u80C8"], /* CJK Ideograph */ + ["\u80C9", "\u80C9"], /* CJK Ideograph */ + ["\u80CA", "\u80CA"], /* CJK Ideograph */ + ["\u80CB", "\u80CB"], /* CJK Ideograph */ + ["\u80CC", "\u80CC"], /* CJK Ideograph */ + ["\u80CD", "\u80CD"], /* CJK Ideograph */ + ["\u80CE", "\u80CE"], /* CJK Ideograph */ + ["\u80CF", "\u80CF"], /* CJK Ideograph */ + ["\u80D0", "\u80D0"], /* CJK Ideograph */ + ["\u80D1", "\u80D1"], /* CJK Ideograph */ + ["\u80D2", "\u80D2"], /* CJK Ideograph */ + ["\u80D3", "\u80D3"], /* CJK Ideograph */ + ["\u80D4", "\u80D4"], /* CJK Ideograph */ + ["\u80D5", "\u80D5"], /* CJK Ideograph */ + ["\u80D6", "\u80D6"], /* CJK Ideograph */ + ["\u80D7", "\u80D7"], /* CJK Ideograph */ + ["\u80D8", "\u80D8"], /* CJK Ideograph */ + ["\u80D9", "\u80D9"], /* CJK Ideograph */ + ["\u80DA", "\u80DA"], /* CJK Ideograph */ + ["\u80DB", "\u80DB"], /* CJK Ideograph */ + ["\u80DC", "\u80DC"], /* CJK Ideograph */ + ["\u80DD", "\u80DD"], /* CJK Ideograph */ + ["\u80DE", "\u80DE"], /* CJK Ideograph */ + ["\u80DF", "\u80DF"], /* CJK Ideograph */ + ["\u80E0", "\u80E0"], /* CJK Ideograph */ + ["\u80E1", "\u80E1"], /* CJK Ideograph */ + ["\u80E2", "\u80E2"], /* CJK Ideograph */ + ["\u80E3", "\u80E3"], /* CJK Ideograph */ + ["\u80E4", "\u80E4"], /* CJK Ideograph */ + ["\u80E5", "\u80E5"], /* CJK Ideograph */ + ["\u80E6", "\u80E6"], /* CJK Ideograph */ + ["\u80E7", "\u80E7"], /* CJK Ideograph */ + ["\u80E8", "\u80E8"], /* CJK Ideograph */ + ["\u80E9", "\u80E9"], /* CJK Ideograph */ + ["\u80EA", "\u80EA"], /* CJK Ideograph */ + ["\u80EB", "\u80EB"], /* CJK Ideograph */ + ["\u80EC", "\u80EC"], /* CJK Ideograph */ + ["\u80ED", "\u80ED"], /* CJK Ideograph */ + ["\u80EE", "\u80EE"], /* CJK Ideograph */ + ["\u80EF", "\u80EF"], /* CJK Ideograph */ + ["\u80F0", "\u80F0"], /* CJK Ideograph */ + ["\u80F1", "\u80F1"], /* CJK Ideograph */ + ["\u80F2", "\u80F2"], /* CJK Ideograph */ + ["\u80F3", "\u80F3"], /* CJK Ideograph */ + ["\u80F4", "\u80F4"], /* CJK Ideograph */ + ["\u80F5", "\u80F5"], /* CJK Ideograph */ + ["\u80F6", "\u80F6"], /* CJK Ideograph */ + ["\u80F7", "\u80F7"], /* CJK Ideograph */ + ["\u80F8", "\u80F8"], /* CJK Ideograph */ + ["\u80F9", "\u80F9"], /* CJK Ideograph */ + ["\u80FA", "\u80FA"], /* CJK Ideograph */ + ["\u80FB", "\u80FB"], /* CJK Ideograph */ + ["\u80FC", "\u80FC"], /* CJK Ideograph */ + ["\u80FD", "\u80FD"], /* CJK Ideograph */ + ["\u80FE", "\u80FE"], /* CJK Ideograph */ + ["\u80FF", "\u80FF"], /* CJK Ideograph */ + ["\u8100", "\u8100"], /* CJK Ideograph */ + ["\u8101", "\u8101"], /* CJK Ideograph */ + ["\u8102", "\u8102"], /* CJK Ideograph */ + ["\u8103", "\u8103"], /* CJK Ideograph */ + ["\u8104", "\u8104"], /* CJK Ideograph */ + ["\u8105", "\u8105"], /* CJK Ideograph */ + ["\u8106", "\u8106"], /* CJK Ideograph */ + ["\u8107", "\u8107"], /* CJK Ideograph */ + ["\u8108", "\u8108"], /* CJK Ideograph */ + ["\u8109", "\u8109"], /* CJK Ideograph */ + ["\u810A", "\u810A"], /* CJK Ideograph */ + ["\u810B", "\u810B"], /* CJK Ideograph */ + ["\u810C", "\u810C"], /* CJK Ideograph */ + ["\u810D", "\u810D"], /* CJK Ideograph */ + ["\u810E", "\u810E"], /* CJK Ideograph */ + ["\u810F", "\u810F"], /* CJK Ideograph */ + ["\u8110", "\u8110"], /* CJK Ideograph */ + ["\u8111", "\u8111"], /* CJK Ideograph */ + ["\u8112", "\u8112"], /* CJK Ideograph */ + ["\u8113", "\u8113"], /* CJK Ideograph */ + ["\u8114", "\u8114"], /* CJK Ideograph */ + ["\u8115", "\u8115"], /* CJK Ideograph */ + ["\u8116", "\u8116"], /* CJK Ideograph */ + ["\u8117", "\u8117"], /* CJK Ideograph */ + ["\u8118", "\u8118"], /* CJK Ideograph */ + ["\u8119", "\u8119"], /* CJK Ideograph */ + ["\u811A", "\u811A"], /* CJK Ideograph */ + ["\u811B", "\u811B"], /* CJK Ideograph */ + ["\u811C", "\u811C"], /* CJK Ideograph */ + ["\u811D", "\u811D"], /* CJK Ideograph */ + ["\u811E", "\u811E"], /* CJK Ideograph */ + ["\u811F", "\u811F"], /* CJK Ideograph */ + ["\u8120", "\u8120"], /* CJK Ideograph */ + ["\u8121", "\u8121"], /* CJK Ideograph */ + ["\u8122", "\u8122"], /* CJK Ideograph */ + ["\u8123", "\u8123"], /* CJK Ideograph */ + ["\u8124", "\u8124"], /* CJK Ideograph */ + ["\u8125", "\u8125"], /* CJK Ideograph */ + ["\u8126", "\u8126"], /* CJK Ideograph */ + ["\u8127", "\u8127"], /* CJK Ideograph */ + ["\u8128", "\u8128"], /* CJK Ideograph */ + ["\u8129", "\u8129"], /* CJK Ideograph */ + ["\u812A", "\u812A"], /* CJK Ideograph */ + ["\u812B", "\u812B"], /* CJK Ideograph */ + ["\u812C", "\u812C"], /* CJK Ideograph */ + ["\u812D", "\u812D"], /* CJK Ideograph */ + ["\u812E", "\u812E"], /* CJK Ideograph */ + ["\u812F", "\u812F"], /* CJK Ideograph */ + ["\u8130", "\u8130"], /* CJK Ideograph */ + ["\u8131", "\u8131"], /* CJK Ideograph */ + ["\u8132", "\u8132"], /* CJK Ideograph */ + ["\u8133", "\u8133"], /* CJK Ideograph */ + ["\u8134", "\u8134"], /* CJK Ideograph */ + ["\u8135", "\u8135"], /* CJK Ideograph */ + ["\u8136", "\u8136"], /* CJK Ideograph */ + ["\u8137", "\u8137"], /* CJK Ideograph */ + ["\u8138", "\u8138"], /* CJK Ideograph */ + ["\u8139", "\u8139"], /* CJK Ideograph */ + ["\u813A", "\u813A"], /* CJK Ideograph */ + ["\u813B", "\u813B"], /* CJK Ideograph */ + ["\u813C", "\u813C"], /* CJK Ideograph */ + ["\u813D", "\u813D"], /* CJK Ideograph */ + ["\u813E", "\u813E"], /* CJK Ideograph */ + ["\u813F", "\u813F"], /* CJK Ideograph */ + ["\u8140", "\u8140"], /* CJK Ideograph */ + ["\u8141", "\u8141"], /* CJK Ideograph */ + ["\u8142", "\u8142"], /* CJK Ideograph */ + ["\u8143", "\u8143"], /* CJK Ideograph */ + ["\u8144", "\u8144"], /* CJK Ideograph */ + ["\u8145", "\u8145"], /* CJK Ideograph */ + ["\u8146", "\u8146"], /* CJK Ideograph */ + ["\u8147", "\u8147"], /* CJK Ideograph */ + ["\u8148", "\u8148"], /* CJK Ideograph */ + ["\u8149", "\u8149"], /* CJK Ideograph */ + ["\u814A", "\u814A"], /* CJK Ideograph */ + ["\u814B", "\u814B"], /* CJK Ideograph */ + ["\u814C", "\u814C"], /* CJK Ideograph */ + ["\u814D", "\u814D"], /* CJK Ideograph */ + ["\u814E", "\u814E"], /* CJK Ideograph */ + ["\u814F", "\u814F"], /* CJK Ideograph */ + ["\u8150", "\u8150"], /* CJK Ideograph */ + ["\u8151", "\u8151"], /* CJK Ideograph */ + ["\u8152", "\u8152"], /* CJK Ideograph */ + ["\u8153", "\u8153"], /* CJK Ideograph */ + ["\u8154", "\u8154"], /* CJK Ideograph */ + ["\u8155", "\u8155"], /* CJK Ideograph */ + ["\u8156", "\u8156"], /* CJK Ideograph */ + ["\u8157", "\u8157"], /* CJK Ideograph */ + ["\u8158", "\u8158"], /* CJK Ideograph */ + ["\u8159", "\u8159"], /* CJK Ideograph */ + ["\u815A", "\u815A"], /* CJK Ideograph */ + ["\u815B", "\u815B"], /* CJK Ideograph */ + ["\u815C", "\u815C"], /* CJK Ideograph */ + ["\u815D", "\u815D"], /* CJK Ideograph */ + ["\u815E", "\u815E"], /* CJK Ideograph */ + ["\u815F", "\u815F"], /* CJK Ideograph */ + ["\u8160", "\u8160"], /* CJK Ideograph */ + ["\u8161", "\u8161"], /* CJK Ideograph */ + ["\u8162", "\u8162"], /* CJK Ideograph */ + ["\u8163", "\u8163"], /* CJK Ideograph */ + ["\u8164", "\u8164"], /* CJK Ideograph */ + ["\u8165", "\u8165"], /* CJK Ideograph */ + ["\u8166", "\u8166"], /* CJK Ideograph */ + ["\u8167", "\u8167"], /* CJK Ideograph */ + ["\u8168", "\u8168"], /* CJK Ideograph */ + ["\u8169", "\u8169"], /* CJK Ideograph */ + ["\u816A", "\u816A"], /* CJK Ideograph */ + ["\u816B", "\u816B"], /* CJK Ideograph */ + ["\u816C", "\u816C"], /* CJK Ideograph */ + ["\u816D", "\u816D"], /* CJK Ideograph */ + ["\u816E", "\u816E"], /* CJK Ideograph */ + ["\u816F", "\u816F"], /* CJK Ideograph */ + ["\u8170", "\u8170"], /* CJK Ideograph */ + ["\u8171", "\u8171"], /* CJK Ideograph */ + ["\u8172", "\u8172"], /* CJK Ideograph */ + ["\u8173", "\u8173"], /* CJK Ideograph */ + ["\u8174", "\u8174"], /* CJK Ideograph */ + ["\u8175", "\u8175"], /* CJK Ideograph */ + ["\u8176", "\u8176"], /* CJK Ideograph */ + ["\u8177", "\u8177"], /* CJK Ideograph */ + ["\u8178", "\u8178"], /* CJK Ideograph */ + ["\u8179", "\u8179"], /* CJK Ideograph */ + ["\u817A", "\u817A"], /* CJK Ideograph */ + ["\u817B", "\u817B"], /* CJK Ideograph */ + ["\u817C", "\u817C"], /* CJK Ideograph */ + ["\u817D", "\u817D"], /* CJK Ideograph */ + ["\u817E", "\u817E"], /* CJK Ideograph */ + ["\u817F", "\u817F"], /* CJK Ideograph */ + ["\u8180", "\u8180"], /* CJK Ideograph */ + ["\u8181", "\u8181"], /* CJK Ideograph */ + ["\u8182", "\u8182"], /* CJK Ideograph */ + ["\u8183", "\u8183"], /* CJK Ideograph */ + ["\u8184", "\u8184"], /* CJK Ideograph */ + ["\u8185", "\u8185"], /* CJK Ideograph */ + ["\u8186", "\u8186"], /* CJK Ideograph */ + ["\u8187", "\u8187"], /* CJK Ideograph */ + ["\u8188", "\u8188"], /* CJK Ideograph */ + ["\u8189", "\u8189"], /* CJK Ideograph */ + ["\u818A", "\u818A"], /* CJK Ideograph */ + ["\u818B", "\u818B"], /* CJK Ideograph */ + ["\u818C", "\u818C"], /* CJK Ideograph */ + ["\u818D", "\u818D"], /* CJK Ideograph */ + ["\u818E", "\u818E"], /* CJK Ideograph */ + ["\u818F", "\u818F"], /* CJK Ideograph */ + ["\u8190", "\u8190"], /* CJK Ideograph */ + ["\u8191", "\u8191"], /* CJK Ideograph */ + ["\u8192", "\u8192"], /* CJK Ideograph */ + ["\u8193", "\u8193"], /* CJK Ideograph */ + ["\u8194", "\u8194"], /* CJK Ideograph */ + ["\u8195", "\u8195"], /* CJK Ideograph */ + ["\u8196", "\u8196"], /* CJK Ideograph */ + ["\u8197", "\u8197"], /* CJK Ideograph */ + ["\u8198", "\u8198"], /* CJK Ideograph */ + ["\u8199", "\u8199"], /* CJK Ideograph */ + ["\u819A", "\u819A"], /* CJK Ideograph */ + ["\u819B", "\u819B"], /* CJK Ideograph */ + ["\u819C", "\u819C"], /* CJK Ideograph */ + ["\u819D", "\u819D"], /* CJK Ideograph */ + ["\u819E", "\u819E"], /* CJK Ideograph */ + ["\u819F", "\u819F"], /* CJK Ideograph */ + ["\u81A0", "\u81A0"], /* CJK Ideograph */ + ["\u81A1", "\u81A1"], /* CJK Ideograph */ + ["\u81A2", "\u81A2"], /* CJK Ideograph */ + ["\u81A3", "\u81A3"], /* CJK Ideograph */ + ["\u81A4", "\u81A4"], /* CJK Ideograph */ + ["\u81A5", "\u81A5"], /* CJK Ideograph */ + ["\u81A6", "\u81A6"], /* CJK Ideograph */ + ["\u81A7", "\u81A7"], /* CJK Ideograph */ + ["\u81A8", "\u81A8"], /* CJK Ideograph */ + ["\u81A9", "\u81A9"], /* CJK Ideograph */ + ["\u81AA", "\u81AA"], /* CJK Ideograph */ + ["\u81AB", "\u81AB"], /* CJK Ideograph */ + ["\u81AC", "\u81AC"], /* CJK Ideograph */ + ["\u81AD", "\u81AD"], /* CJK Ideograph */ + ["\u81AE", "\u81AE"], /* CJK Ideograph */ + ["\u81AF", "\u81AF"], /* CJK Ideograph */ + ["\u81B0", "\u81B0"], /* CJK Ideograph */ + ["\u81B1", "\u81B1"], /* CJK Ideograph */ + ["\u81B2", "\u81B2"], /* CJK Ideograph */ + ["\u81B3", "\u81B3"], /* CJK Ideograph */ + ["\u81B4", "\u81B4"], /* CJK Ideograph */ + ["\u81B5", "\u81B5"], /* CJK Ideograph */ + ["\u81B6", "\u81B6"], /* CJK Ideograph */ + ["\u81B7", "\u81B7"], /* CJK Ideograph */ + ["\u81B8", "\u81B8"], /* CJK Ideograph */ + ["\u81B9", "\u81B9"], /* CJK Ideograph */ + ["\u81BA", "\u81BA"], /* CJK Ideograph */ + ["\u81BB", "\u81BB"], /* CJK Ideograph */ + ["\u81BC", "\u81BC"], /* CJK Ideograph */ + ["\u81BD", "\u81BD"], /* CJK Ideograph */ + ["\u81BE", "\u81BE"], /* CJK Ideograph */ + ["\u81BF", "\u81BF"], /* CJK Ideograph */ + ["\u81C0", "\u81C0"], /* CJK Ideograph */ + ["\u81C1", "\u81C1"], /* CJK Ideograph */ + ["\u81C2", "\u81C2"], /* CJK Ideograph */ + ["\u81C3", "\u81C3"], /* CJK Ideograph */ + ["\u81C4", "\u81C4"], /* CJK Ideograph */ + ["\u81C5", "\u81C5"], /* CJK Ideograph */ + ["\u81C6", "\u81C6"], /* CJK Ideograph */ + ["\u81C7", "\u81C7"], /* CJK Ideograph */ + ["\u81C8", "\u81C8"], /* CJK Ideograph */ + ["\u81C9", "\u81C9"], /* CJK Ideograph */ + ["\u81CA", "\u81CA"], /* CJK Ideograph */ + ["\u81CB", "\u81CB"], /* CJK Ideograph */ + ["\u81CC", "\u81CC"], /* CJK Ideograph */ + ["\u81CD", "\u81CD"], /* CJK Ideograph */ + ["\u81CE", "\u81CE"], /* CJK Ideograph */ + ["\u81CF", "\u81CF"], /* CJK Ideograph */ + ["\u81D0", "\u81D0"], /* CJK Ideograph */ + ["\u81D1", "\u81D1"], /* CJK Ideograph */ + ["\u81D2", "\u81D2"], /* CJK Ideograph */ + ["\u81D3", "\u81D3"], /* CJK Ideograph */ + ["\u81D4", "\u81D4"], /* CJK Ideograph */ + ["\u81D5", "\u81D5"], /* CJK Ideograph */ + ["\u81D6", "\u81D6"], /* CJK Ideograph */ + ["\u81D7", "\u81D7"], /* CJK Ideograph */ + ["\u81D8", "\u81D8"], /* CJK Ideograph */ + ["\u81D9", "\u81D9"], /* CJK Ideograph */ + ["\u81DA", "\u81DA"], /* CJK Ideograph */ + ["\u81DB", "\u81DB"], /* CJK Ideograph */ + ["\u81DC", "\u81DC"], /* CJK Ideograph */ + ["\u81DD", "\u81DD"], /* CJK Ideograph */ + ["\u81DE", "\u81DE"], /* CJK Ideograph */ + ["\u81DF", "\u81DF"], /* CJK Ideograph */ + ["\u81E0", "\u81E0"], /* CJK Ideograph */ + ["\u81E1", "\u81E1"], /* CJK Ideograph */ + ["\u81E2", "\u81E2"], /* CJK Ideograph */ + ["\u81E3", "\u81E3"], /* CJK Ideograph */ + ["\u81E4", "\u81E4"], /* CJK Ideograph */ + ["\u81E5", "\u81E5"], /* CJK Ideograph */ + ["\u81E6", "\u81E6"], /* CJK Ideograph */ + ["\u81E7", "\u81E7"], /* CJK Ideograph */ + ["\u81E8", "\u81E8"], /* CJK Ideograph */ + ["\u81E9", "\u81E9"], /* CJK Ideograph */ + ["\u81EA", "\u81EA"], /* CJK Ideograph */ + ["\u81EB", "\u81EB"], /* CJK Ideograph */ + ["\u81EC", "\u81EC"], /* CJK Ideograph */ + ["\u81ED", "\u81ED"], /* CJK Ideograph */ + ["\u81EE", "\u81EE"], /* CJK Ideograph */ + ["\u81EF", "\u81EF"], /* CJK Ideograph */ + ["\u81F0", "\u81F0"], /* CJK Ideograph */ + ["\u81F1", "\u81F1"], /* CJK Ideograph */ + ["\u81F2", "\u81F2"], /* CJK Ideograph */ + ["\u81F3", "\u81F3"], /* CJK Ideograph */ + ["\u81F4", "\u81F4"], /* CJK Ideograph */ + ["\u81F5", "\u81F5"], /* CJK Ideograph */ + ["\u81F6", "\u81F6"], /* CJK Ideograph */ + ["\u81F7", "\u81F7"], /* CJK Ideograph */ + ["\u81F8", "\u81F8"], /* CJK Ideograph */ + ["\u81F9", "\u81F9"], /* CJK Ideograph */ + ["\u81FA", "\u81FA"], /* CJK Ideograph */ + ["\u81FB", "\u81FB"], /* CJK Ideograph */ + ["\u81FC", "\u81FC"], /* CJK Ideograph */ + ["\u81FD", "\u81FD"], /* CJK Ideograph */ + ["\u81FE", "\u81FE"], /* CJK Ideograph */ + ["\u81FF", "\u81FF"], /* CJK Ideograph */ + ["\u8200", "\u8200"], /* CJK Ideograph */ + ["\u8201", "\u8201"], /* CJK Ideograph */ + ["\u8202", "\u8202"], /* CJK Ideograph */ + ["\u8203", "\u8203"], /* CJK Ideograph */ + ["\u8204", "\u8204"], /* CJK Ideograph */ + ["\u8205", "\u8205"], /* CJK Ideograph */ + ["\u8206", "\u8206"], /* CJK Ideograph */ + ["\u8207", "\u8207"], /* CJK Ideograph */ + ["\u8208", "\u8208"], /* CJK Ideograph */ + ["\u8209", "\u8209"], /* CJK Ideograph */ + ["\u820A", "\u820A"], /* CJK Ideograph */ + ["\u820B", "\u820B"], /* CJK Ideograph */ + ["\u820C", "\u820C"], /* CJK Ideograph */ + ["\u820D", "\u820D"], /* CJK Ideograph */ + ["\u820E", "\u820E"], /* CJK Ideograph */ + ["\u820F", "\u820F"], /* CJK Ideograph */ + ["\u8210", "\u8210"], /* CJK Ideograph */ + ["\u8211", "\u8211"], /* CJK Ideograph */ + ["\u8212", "\u8212"], /* CJK Ideograph */ + ["\u8213", "\u8213"], /* CJK Ideograph */ + ["\u8214", "\u8214"], /* CJK Ideograph */ + ["\u8215", "\u8215"], /* CJK Ideograph */ + ["\u8216", "\u8216"], /* CJK Ideograph */ + ["\u8217", "\u8217"], /* CJK Ideograph */ + ["\u8218", "\u8218"], /* CJK Ideograph */ + ["\u8219", "\u8219"], /* CJK Ideograph */ + ["\u821A", "\u821A"], /* CJK Ideograph */ + ["\u821B", "\u821B"], /* CJK Ideograph */ + ["\u821C", "\u821C"], /* CJK Ideograph */ + ["\u821D", "\u821D"], /* CJK Ideograph */ + ["\u821E", "\u821E"], /* CJK Ideograph */ + ["\u821F", "\u821F"], /* CJK Ideograph */ + ["\u8220", "\u8220"], /* CJK Ideograph */ + ["\u8221", "\u8221"], /* CJK Ideograph */ + ["\u8222", "\u8222"], /* CJK Ideograph */ + ["\u8223", "\u8223"], /* CJK Ideograph */ + ["\u8224", "\u8224"], /* CJK Ideograph */ + ["\u8225", "\u8225"], /* CJK Ideograph */ + ["\u8226", "\u8226"], /* CJK Ideograph */ + ["\u8227", "\u8227"], /* CJK Ideograph */ + ["\u8228", "\u8228"], /* CJK Ideograph */ + ["\u8229", "\u8229"], /* CJK Ideograph */ + ["\u822A", "\u822A"], /* CJK Ideograph */ + ["\u822B", "\u822B"], /* CJK Ideograph */ + ["\u822C", "\u822C"], /* CJK Ideograph */ + ["\u822D", "\u822D"], /* CJK Ideograph */ + ["\u822E", "\u822E"], /* CJK Ideograph */ + ["\u822F", "\u822F"], /* CJK Ideograph */ + ["\u8230", "\u8230"], /* CJK Ideograph */ + ["\u8231", "\u8231"], /* CJK Ideograph */ + ["\u8232", "\u8232"], /* CJK Ideograph */ + ["\u8233", "\u8233"], /* CJK Ideograph */ + ["\u8234", "\u8234"], /* CJK Ideograph */ + ["\u8235", "\u8235"], /* CJK Ideograph */ + ["\u8236", "\u8236"], /* CJK Ideograph */ + ["\u8237", "\u8237"], /* CJK Ideograph */ + ["\u8238", "\u8238"], /* CJK Ideograph */ + ["\u8239", "\u8239"], /* CJK Ideograph */ + ["\u823A", "\u823A"], /* CJK Ideograph */ + ["\u823B", "\u823B"], /* CJK Ideograph */ + ["\u823C", "\u823C"], /* CJK Ideograph */ + ["\u823D", "\u823D"], /* CJK Ideograph */ + ["\u823E", "\u823E"], /* CJK Ideograph */ + ["\u823F", "\u823F"], /* CJK Ideograph */ + ["\u8240", "\u8240"], /* CJK Ideograph */ + ["\u8241", "\u8241"], /* CJK Ideograph */ + ["\u8242", "\u8242"], /* CJK Ideograph */ + ["\u8243", "\u8243"], /* CJK Ideograph */ + ["\u8244", "\u8244"], /* CJK Ideograph */ + ["\u8245", "\u8245"], /* CJK Ideograph */ + ["\u8246", "\u8246"], /* CJK Ideograph */ + ["\u8247", "\u8247"], /* CJK Ideograph */ + ["\u8248", "\u8248"], /* CJK Ideograph */ + ["\u8249", "\u8249"], /* CJK Ideograph */ + ["\u824A", "\u824A"], /* CJK Ideograph */ + ["\u824B", "\u824B"], /* CJK Ideograph */ + ["\u824C", "\u824C"], /* CJK Ideograph */ + ["\u824D", "\u824D"], /* CJK Ideograph */ + ["\u824E", "\u824E"], /* CJK Ideograph */ + ["\u824F", "\u824F"], /* CJK Ideograph */ + ["\u8250", "\u8250"], /* CJK Ideograph */ + ["\u8251", "\u8251"], /* CJK Ideograph */ + ["\u8252", "\u8252"], /* CJK Ideograph */ + ["\u8253", "\u8253"], /* CJK Ideograph */ + ["\u8254", "\u8254"], /* CJK Ideograph */ + ["\u8255", "\u8255"], /* CJK Ideograph */ + ["\u8256", "\u8256"], /* CJK Ideograph */ + ["\u8257", "\u8257"], /* CJK Ideograph */ + ["\u8258", "\u8258"], /* CJK Ideograph */ + ["\u8259", "\u8259"], /* CJK Ideograph */ + ["\u825A", "\u825A"], /* CJK Ideograph */ + ["\u825B", "\u825B"], /* CJK Ideograph */ + ["\u825C", "\u825C"], /* CJK Ideograph */ + ["\u825D", "\u825D"], /* CJK Ideograph */ + ["\u825E", "\u825E"], /* CJK Ideograph */ + ["\u825F", "\u825F"], /* CJK Ideograph */ + ["\u8260", "\u8260"], /* CJK Ideograph */ + ["\u8261", "\u8261"], /* CJK Ideograph */ + ["\u8262", "\u8262"], /* CJK Ideograph */ + ["\u8263", "\u8263"], /* CJK Ideograph */ + ["\u8264", "\u8264"], /* CJK Ideograph */ + ["\u8265", "\u8265"], /* CJK Ideograph */ + ["\u8266", "\u8266"], /* CJK Ideograph */ + ["\u8267", "\u8267"], /* CJK Ideograph */ + ["\u8268", "\u8268"], /* CJK Ideograph */ + ["\u8269", "\u8269"], /* CJK Ideograph */ + ["\u826A", "\u826A"], /* CJK Ideograph */ + ["\u826B", "\u826B"], /* CJK Ideograph */ + ["\u826C", "\u826C"], /* CJK Ideograph */ + ["\u826D", "\u826D"], /* CJK Ideograph */ + ["\u826E", "\u826E"], /* CJK Ideograph */ + ["\u826F", "\u826F"], /* CJK Ideograph */ + ["\u8270", "\u8270"], /* CJK Ideograph */ + ["\u8271", "\u8271"], /* CJK Ideograph */ + ["\u8272", "\u8272"], /* CJK Ideograph */ + ["\u8273", "\u8273"], /* CJK Ideograph */ + ["\u8274", "\u8274"], /* CJK Ideograph */ + ["\u8275", "\u8275"], /* CJK Ideograph */ + ["\u8276", "\u8276"], /* CJK Ideograph */ + ["\u8277", "\u8277"], /* CJK Ideograph */ + ["\u8278", "\u8278"], /* CJK Ideograph */ + ["\u8279", "\u8279"], /* CJK Ideograph */ + ["\u827A", "\u827A"], /* CJK Ideograph */ + ["\u827B", "\u827B"], /* CJK Ideograph */ + ["\u827C", "\u827C"], /* CJK Ideograph */ + ["\u827D", "\u827D"], /* CJK Ideograph */ + ["\u827E", "\u827E"], /* CJK Ideograph */ + ["\u827F", "\u827F"], /* CJK Ideograph */ + ["\u8280", "\u8280"], /* CJK Ideograph */ + ["\u8281", "\u8281"], /* CJK Ideograph */ + ["\u8282", "\u8282"], /* CJK Ideograph */ + ["\u8283", "\u8283"], /* CJK Ideograph */ + ["\u8284", "\u8284"], /* CJK Ideograph */ + ["\u8285", "\u8285"], /* CJK Ideograph */ + ["\u8286", "\u8286"], /* CJK Ideograph */ + ["\u8287", "\u8287"], /* CJK Ideograph */ + ["\u8288", "\u8288"], /* CJK Ideograph */ + ["\u8289", "\u8289"], /* CJK Ideograph */ + ["\u828A", "\u828A"], /* CJK Ideograph */ + ["\u828B", "\u828B"], /* CJK Ideograph */ + ["\u828C", "\u828C"], /* CJK Ideograph */ + ["\u828D", "\u828D"], /* CJK Ideograph */ + ["\u828E", "\u828E"], /* CJK Ideograph */ + ["\u828F", "\u828F"], /* CJK Ideograph */ + ["\u8290", "\u8290"], /* CJK Ideograph */ + ["\u8291", "\u8291"], /* CJK Ideograph */ + ["\u8292", "\u8292"], /* CJK Ideograph */ + ["\u8293", "\u8293"], /* CJK Ideograph */ + ["\u8294", "\u8294"], /* CJK Ideograph */ + ["\u8295", "\u8295"], /* CJK Ideograph */ + ["\u8296", "\u8296"], /* CJK Ideograph */ + ["\u8297", "\u8297"], /* CJK Ideograph */ + ["\u8298", "\u8298"], /* CJK Ideograph */ + ["\u8299", "\u8299"], /* CJK Ideograph */ + ["\u829A", "\u829A"], /* CJK Ideograph */ + ["\u829B", "\u829B"], /* CJK Ideograph */ + ["\u829C", "\u829C"], /* CJK Ideograph */ + ["\u829D", "\u829D"], /* CJK Ideograph */ + ["\u829E", "\u829E"], /* CJK Ideograph */ + ["\u829F", "\u829F"], /* CJK Ideograph */ + ["\u82A0", "\u82A0"], /* CJK Ideograph */ + ["\u82A1", "\u82A1"], /* CJK Ideograph */ + ["\u82A2", "\u82A2"], /* CJK Ideograph */ + ["\u82A3", "\u82A3"], /* CJK Ideograph */ + ["\u82A4", "\u82A4"], /* CJK Ideograph */ + ["\u82A5", "\u82A5"], /* CJK Ideograph */ + ["\u82A6", "\u82A6"], /* CJK Ideograph */ + ["\u82A7", "\u82A7"], /* CJK Ideograph */ + ["\u82A8", "\u82A8"], /* CJK Ideograph */ + ["\u82A9", "\u82A9"], /* CJK Ideograph */ + ["\u82AA", "\u82AA"], /* CJK Ideograph */ + ["\u82AB", "\u82AB"], /* CJK Ideograph */ + ["\u82AC", "\u82AC"], /* CJK Ideograph */ + ["\u82AD", "\u82AD"], /* CJK Ideograph */ + ["\u82AE", "\u82AE"], /* CJK Ideograph */ + ["\u82AF", "\u82AF"], /* CJK Ideograph */ + ["\u82B0", "\u82B0"], /* CJK Ideograph */ + ["\u82B1", "\u82B1"], /* CJK Ideograph */ + ["\u82B2", "\u82B2"], /* CJK Ideograph */ + ["\u82B3", "\u82B3"], /* CJK Ideograph */ + ["\u82B4", "\u82B4"], /* CJK Ideograph */ + ["\u82B5", "\u82B5"], /* CJK Ideograph */ + ["\u82B6", "\u82B6"], /* CJK Ideograph */ + ["\u82B7", "\u82B7"], /* CJK Ideograph */ + ["\u82B8", "\u82B8"], /* CJK Ideograph */ + ["\u82B9", "\u82B9"], /* CJK Ideograph */ + ["\u82BA", "\u82BA"], /* CJK Ideograph */ + ["\u82BB", "\u82BB"], /* CJK Ideograph */ + ["\u82BC", "\u82BC"], /* CJK Ideograph */ + ["\u82BD", "\u82BD"], /* CJK Ideograph */ + ["\u82BE", "\u82BE"], /* CJK Ideograph */ + ["\u82BF", "\u82BF"], /* CJK Ideograph */ + ["\u82C0", "\u82C0"], /* CJK Ideograph */ + ["\u82C1", "\u82C1"], /* CJK Ideograph */ + ["\u82C2", "\u82C2"], /* CJK Ideograph */ + ["\u82C3", "\u82C3"], /* CJK Ideograph */ + ["\u82C4", "\u82C4"], /* CJK Ideograph */ + ["\u82C5", "\u82C5"], /* CJK Ideograph */ + ["\u82C6", "\u82C6"], /* CJK Ideograph */ + ["\u82C7", "\u82C7"], /* CJK Ideograph */ + ["\u82C8", "\u82C8"], /* CJK Ideograph */ + ["\u82C9", "\u82C9"], /* CJK Ideograph */ + ["\u82CA", "\u82CA"], /* CJK Ideograph */ + ["\u82CB", "\u82CB"], /* CJK Ideograph */ + ["\u82CC", "\u82CC"], /* CJK Ideograph */ + ["\u82CD", "\u82CD"], /* CJK Ideograph */ + ["\u82CE", "\u82CE"], /* CJK Ideograph */ + ["\u82CF", "\u82CF"], /* CJK Ideograph */ + ["\u82D0", "\u82D0"], /* CJK Ideograph */ + ["\u82D1", "\u82D1"], /* CJK Ideograph */ + ["\u82D2", "\u82D2"], /* CJK Ideograph */ + ["\u82D3", "\u82D3"], /* CJK Ideograph */ + ["\u82D4", "\u82D4"], /* CJK Ideograph */ + ["\u82D5", "\u82D5"], /* CJK Ideograph */ + ["\u82D6", "\u82D6"], /* CJK Ideograph */ + ["\u82D7", "\u82D7"], /* CJK Ideograph */ + ["\u82D8", "\u82D8"], /* CJK Ideograph */ + ["\u82D9", "\u82D9"], /* CJK Ideograph */ + ["\u82DA", "\u82DA"], /* CJK Ideograph */ + ["\u82DB", "\u82DB"], /* CJK Ideograph */ + ["\u82DC", "\u82DC"], /* CJK Ideograph */ + ["\u82DD", "\u82DD"], /* CJK Ideograph */ + ["\u82DE", "\u82DE"], /* CJK Ideograph */ + ["\u82DF", "\u82DF"], /* CJK Ideograph */ + ["\u82E0", "\u82E0"], /* CJK Ideograph */ + ["\u82E1", "\u82E1"], /* CJK Ideograph */ + ["\u82E2", "\u82E2"], /* CJK Ideograph */ + ["\u82E3", "\u82E3"], /* CJK Ideograph */ + ["\u82E4", "\u82E4"], /* CJK Ideograph */ + ["\u82E5", "\u82E5"], /* CJK Ideograph */ + ["\u82E6", "\u82E6"], /* CJK Ideograph */ + ["\u82E7", "\u82E7"], /* CJK Ideograph */ + ["\u82E8", "\u82E8"], /* CJK Ideograph */ + ["\u82E9", "\u82E9"], /* CJK Ideograph */ + ["\u82EA", "\u82EA"], /* CJK Ideograph */ + ["\u82EB", "\u82EB"], /* CJK Ideograph */ + ["\u82EC", "\u82EC"], /* CJK Ideograph */ + ["\u82ED", "\u82ED"], /* CJK Ideograph */ + ["\u82EE", "\u82EE"], /* CJK Ideograph */ + ["\u82EF", "\u82EF"], /* CJK Ideograph */ + ["\u82F0", "\u82F0"], /* CJK Ideograph */ + ["\u82F1", "\u82F1"], /* CJK Ideograph */ + ["\u82F2", "\u82F2"], /* CJK Ideograph */ + ["\u82F3", "\u82F3"], /* CJK Ideograph */ + ["\u82F4", "\u82F4"], /* CJK Ideograph */ + ["\u82F5", "\u82F5"], /* CJK Ideograph */ + ["\u82F6", "\u82F6"], /* CJK Ideograph */ + ["\u82F7", "\u82F7"], /* CJK Ideograph */ + ["\u82F8", "\u82F8"], /* CJK Ideograph */ + ["\u82F9", "\u82F9"], /* CJK Ideograph */ + ["\u82FA", "\u82FA"], /* CJK Ideograph */ + ["\u82FB", "\u82FB"], /* CJK Ideograph */ + ["\u82FC", "\u82FC"], /* CJK Ideograph */ + ["\u82FD", "\u82FD"], /* CJK Ideograph */ + ["\u82FE", "\u82FE"], /* CJK Ideograph */ + ["\u82FF", "\u82FF"], /* CJK Ideograph */ + ["\u8300", "\u8300"], /* CJK Ideograph */ + ["\u8301", "\u8301"], /* CJK Ideograph */ + ["\u8302", "\u8302"], /* CJK Ideograph */ + ["\u8303", "\u8303"], /* CJK Ideograph */ + ["\u8304", "\u8304"], /* CJK Ideograph */ + ["\u8305", "\u8305"], /* CJK Ideograph */ + ["\u8306", "\u8306"], /* CJK Ideograph */ + ["\u8307", "\u8307"], /* CJK Ideograph */ + ["\u8308", "\u8308"], /* CJK Ideograph */ + ["\u8309", "\u8309"], /* CJK Ideograph */ + ["\u830A", "\u830A"], /* CJK Ideograph */ + ["\u830B", "\u830B"], /* CJK Ideograph */ + ["\u830C", "\u830C"], /* CJK Ideograph */ + ["\u830D", "\u830D"], /* CJK Ideograph */ + ["\u830E", "\u830E"], /* CJK Ideograph */ + ["\u830F", "\u830F"], /* CJK Ideograph */ + ["\u8310", "\u8310"], /* CJK Ideograph */ + ["\u8311", "\u8311"], /* CJK Ideograph */ + ["\u8312", "\u8312"], /* CJK Ideograph */ + ["\u8313", "\u8313"], /* CJK Ideograph */ + ["\u8314", "\u8314"], /* CJK Ideograph */ + ["\u8315", "\u8315"], /* CJK Ideograph */ + ["\u8316", "\u8316"], /* CJK Ideograph */ + ["\u8317", "\u8317"], /* CJK Ideograph */ + ["\u8318", "\u8318"], /* CJK Ideograph */ + ["\u8319", "\u8319"], /* CJK Ideograph */ + ["\u831A", "\u831A"], /* CJK Ideograph */ + ["\u831B", "\u831B"], /* CJK Ideograph */ + ["\u831C", "\u831C"], /* CJK Ideograph */ + ["\u831D", "\u831D"], /* CJK Ideograph */ + ["\u831E", "\u831E"], /* CJK Ideograph */ + ["\u831F", "\u831F"], /* CJK Ideograph */ + ["\u8320", "\u8320"], /* CJK Ideograph */ + ["\u8321", "\u8321"], /* CJK Ideograph */ + ["\u8322", "\u8322"], /* CJK Ideograph */ + ["\u8323", "\u8323"], /* CJK Ideograph */ + ["\u8324", "\u8324"], /* CJK Ideograph */ + ["\u8325", "\u8325"], /* CJK Ideograph */ + ["\u8326", "\u8326"], /* CJK Ideograph */ + ["\u8327", "\u8327"], /* CJK Ideograph */ + ["\u8328", "\u8328"], /* CJK Ideograph */ + ["\u8329", "\u8329"], /* CJK Ideograph */ + ["\u832A", "\u832A"], /* CJK Ideograph */ + ["\u832B", "\u832B"], /* CJK Ideograph */ + ["\u832C", "\u832C"], /* CJK Ideograph */ + ["\u832D", "\u832D"], /* CJK Ideograph */ + ["\u832E", "\u832E"], /* CJK Ideograph */ + ["\u832F", "\u832F"], /* CJK Ideograph */ + ["\u8330", "\u8330"], /* CJK Ideograph */ + ["\u8331", "\u8331"], /* CJK Ideograph */ + ["\u8332", "\u8332"], /* CJK Ideograph */ + ["\u8333", "\u8333"], /* CJK Ideograph */ + ["\u8334", "\u8334"], /* CJK Ideograph */ + ["\u8335", "\u8335"], /* CJK Ideograph */ + ["\u8336", "\u8336"], /* CJK Ideograph */ + ["\u8337", "\u8337"], /* CJK Ideograph */ + ["\u8338", "\u8338"], /* CJK Ideograph */ + ["\u8339", "\u8339"], /* CJK Ideograph */ + ["\u833A", "\u833A"], /* CJK Ideograph */ + ["\u833B", "\u833B"], /* CJK Ideograph */ + ["\u833C", "\u833C"], /* CJK Ideograph */ + ["\u833D", "\u833D"], /* CJK Ideograph */ + ["\u833E", "\u833E"], /* CJK Ideograph */ + ["\u833F", "\u833F"], /* CJK Ideograph */ + ["\u8340", "\u8340"], /* CJK Ideograph */ + ["\u8341", "\u8341"], /* CJK Ideograph */ + ["\u8342", "\u8342"], /* CJK Ideograph */ + ["\u8343", "\u8343"], /* CJK Ideograph */ + ["\u8344", "\u8344"], /* CJK Ideograph */ + ["\u8345", "\u8345"], /* CJK Ideograph */ + ["\u8346", "\u8346"], /* CJK Ideograph */ + ["\u8347", "\u8347"], /* CJK Ideograph */ + ["\u8348", "\u8348"], /* CJK Ideograph */ + ["\u8349", "\u8349"], /* CJK Ideograph */ + ["\u834A", "\u834A"], /* CJK Ideograph */ + ["\u834B", "\u834B"], /* CJK Ideograph */ + ["\u834C", "\u834C"], /* CJK Ideograph */ + ["\u834D", "\u834D"], /* CJK Ideograph */ + ["\u834E", "\u834E"], /* CJK Ideograph */ + ["\u834F", "\u834F"], /* CJK Ideograph */ + ["\u8350", "\u8350"], /* CJK Ideograph */ + ["\u8351", "\u8351"], /* CJK Ideograph */ + ["\u8352", "\u8352"], /* CJK Ideograph */ + ["\u8353", "\u8353"], /* CJK Ideograph */ + ["\u8354", "\u8354"], /* CJK Ideograph */ + ["\u8355", "\u8355"], /* CJK Ideograph */ + ["\u8356", "\u8356"], /* CJK Ideograph */ + ["\u8357", "\u8357"], /* CJK Ideograph */ + ["\u8358", "\u8358"], /* CJK Ideograph */ + ["\u8359", "\u8359"], /* CJK Ideograph */ + ["\u835A", "\u835A"], /* CJK Ideograph */ + ["\u835B", "\u835B"], /* CJK Ideograph */ + ["\u835C", "\u835C"], /* CJK Ideograph */ + ["\u835D", "\u835D"], /* CJK Ideograph */ + ["\u835E", "\u835E"], /* CJK Ideograph */ + ["\u835F", "\u835F"], /* CJK Ideograph */ + ["\u8360", "\u8360"], /* CJK Ideograph */ + ["\u8361", "\u8361"], /* CJK Ideograph */ + ["\u8362", "\u8362"], /* CJK Ideograph */ + ["\u8363", "\u8363"], /* CJK Ideograph */ + ["\u8364", "\u8364"], /* CJK Ideograph */ + ["\u8365", "\u8365"], /* CJK Ideograph */ + ["\u8366", "\u8366"], /* CJK Ideograph */ + ["\u8367", "\u8367"], /* CJK Ideograph */ + ["\u8368", "\u8368"], /* CJK Ideograph */ + ["\u8369", "\u8369"], /* CJK Ideograph */ + ["\u836A", "\u836A"], /* CJK Ideograph */ + ["\u836B", "\u836B"], /* CJK Ideograph */ + ["\u836C", "\u836C"], /* CJK Ideograph */ + ["\u836D", "\u836D"], /* CJK Ideograph */ + ["\u836E", "\u836E"], /* CJK Ideograph */ + ["\u836F", "\u836F"], /* CJK Ideograph */ + ["\u8370", "\u8370"], /* CJK Ideograph */ + ["\u8371", "\u8371"], /* CJK Ideograph */ + ["\u8372", "\u8372"], /* CJK Ideograph */ + ["\u8373", "\u8373"], /* CJK Ideograph */ + ["\u8374", "\u8374"], /* CJK Ideograph */ + ["\u8375", "\u8375"], /* CJK Ideograph */ + ["\u8376", "\u8376"], /* CJK Ideograph */ + ["\u8377", "\u8377"], /* CJK Ideograph */ + ["\u8378", "\u8378"], /* CJK Ideograph */ + ["\u8379", "\u8379"], /* CJK Ideograph */ + ["\u837A", "\u837A"], /* CJK Ideograph */ + ["\u837B", "\u837B"], /* CJK Ideograph */ + ["\u837C", "\u837C"], /* CJK Ideograph */ + ["\u837D", "\u837D"], /* CJK Ideograph */ + ["\u837E", "\u837E"], /* CJK Ideograph */ + ["\u837F", "\u837F"], /* CJK Ideograph */ + ["\u8380", "\u8380"], /* CJK Ideograph */ + ["\u8381", "\u8381"], /* CJK Ideograph */ + ["\u8382", "\u8382"], /* CJK Ideograph */ + ["\u8383", "\u8383"], /* CJK Ideograph */ + ["\u8384", "\u8384"], /* CJK Ideograph */ + ["\u8385", "\u8385"], /* CJK Ideograph */ + ["\u8386", "\u8386"], /* CJK Ideograph */ + ["\u8387", "\u8387"], /* CJK Ideograph */ + ["\u8388", "\u8388"], /* CJK Ideograph */ + ["\u8389", "\u8389"], /* CJK Ideograph */ + ["\u838A", "\u838A"], /* CJK Ideograph */ + ["\u838B", "\u838B"], /* CJK Ideograph */ + ["\u838C", "\u838C"], /* CJK Ideograph */ + ["\u838D", "\u838D"], /* CJK Ideograph */ + ["\u838E", "\u838E"], /* CJK Ideograph */ + ["\u838F", "\u838F"], /* CJK Ideograph */ + ["\u8390", "\u8390"], /* CJK Ideograph */ + ["\u8391", "\u8391"], /* CJK Ideograph */ + ["\u8392", "\u8392"], /* CJK Ideograph */ + ["\u8393", "\u8393"], /* CJK Ideograph */ + ["\u8394", "\u8394"], /* CJK Ideograph */ + ["\u8395", "\u8395"], /* CJK Ideograph */ + ["\u8396", "\u8396"], /* CJK Ideograph */ + ["\u8397", "\u8397"], /* CJK Ideograph */ + ["\u8398", "\u8398"], /* CJK Ideograph */ + ["\u8399", "\u8399"], /* CJK Ideograph */ + ["\u839A", "\u839A"], /* CJK Ideograph */ + ["\u839B", "\u839B"], /* CJK Ideograph */ + ["\u839C", "\u839C"], /* CJK Ideograph */ + ["\u839D", "\u839D"], /* CJK Ideograph */ + ["\u839E", "\u839E"], /* CJK Ideograph */ + ["\u839F", "\u839F"], /* CJK Ideograph */ + ["\u83A0", "\u83A0"], /* CJK Ideograph */ + ["\u83A1", "\u83A1"], /* CJK Ideograph */ + ["\u83A2", "\u83A2"], /* CJK Ideograph */ + ["\u83A3", "\u83A3"], /* CJK Ideograph */ + ["\u83A4", "\u83A4"], /* CJK Ideograph */ + ["\u83A5", "\u83A5"], /* CJK Ideograph */ + ["\u83A6", "\u83A6"], /* CJK Ideograph */ + ["\u83A7", "\u83A7"], /* CJK Ideograph */ + ["\u83A8", "\u83A8"], /* CJK Ideograph */ + ["\u83A9", "\u83A9"], /* CJK Ideograph */ + ["\u83AA", "\u83AA"], /* CJK Ideograph */ + ["\u83AB", "\u83AB"], /* CJK Ideograph */ + ["\u83AC", "\u83AC"], /* CJK Ideograph */ + ["\u83AD", "\u83AD"], /* CJK Ideograph */ + ["\u83AE", "\u83AE"], /* CJK Ideograph */ + ["\u83AF", "\u83AF"], /* CJK Ideograph */ + ["\u83B0", "\u83B0"], /* CJK Ideograph */ + ["\u83B1", "\u83B1"], /* CJK Ideograph */ + ["\u83B2", "\u83B2"], /* CJK Ideograph */ + ["\u83B3", "\u83B3"], /* CJK Ideograph */ + ["\u83B4", "\u83B4"], /* CJK Ideograph */ + ["\u83B5", "\u83B5"], /* CJK Ideograph */ + ["\u83B6", "\u83B6"], /* CJK Ideograph */ + ["\u83B7", "\u83B7"], /* CJK Ideograph */ + ["\u83B8", "\u83B8"], /* CJK Ideograph */ + ["\u83B9", "\u83B9"], /* CJK Ideograph */ + ["\u83BA", "\u83BA"], /* CJK Ideograph */ + ["\u83BB", "\u83BB"], /* CJK Ideograph */ + ["\u83BC", "\u83BC"], /* CJK Ideograph */ + ["\u83BD", "\u83BD"], /* CJK Ideograph */ + ["\u83BE", "\u83BE"], /* CJK Ideograph */ + ["\u83BF", "\u83BF"], /* CJK Ideograph */ + ["\u83C0", "\u83C0"], /* CJK Ideograph */ + ["\u83C1", "\u83C1"], /* CJK Ideograph */ + ["\u83C2", "\u83C2"], /* CJK Ideograph */ + ["\u83C3", "\u83C3"], /* CJK Ideograph */ + ["\u83C4", "\u83C4"], /* CJK Ideograph */ + ["\u83C5", "\u83C5"], /* CJK Ideograph */ + ["\u83C6", "\u83C6"], /* CJK Ideograph */ + ["\u83C7", "\u83C7"], /* CJK Ideograph */ + ["\u83C8", "\u83C8"], /* CJK Ideograph */ + ["\u83C9", "\u83C9"], /* CJK Ideograph */ + ["\u83CA", "\u83CA"], /* CJK Ideograph */ + ["\u83CB", "\u83CB"], /* CJK Ideograph */ + ["\u83CC", "\u83CC"], /* CJK Ideograph */ + ["\u83CD", "\u83CD"], /* CJK Ideograph */ + ["\u83CE", "\u83CE"], /* CJK Ideograph */ + ["\u83CF", "\u83CF"], /* CJK Ideograph */ + ["\u83D0", "\u83D0"], /* CJK Ideograph */ + ["\u83D1", "\u83D1"], /* CJK Ideograph */ + ["\u83D2", "\u83D2"], /* CJK Ideograph */ + ["\u83D3", "\u83D3"], /* CJK Ideograph */ + ["\u83D4", "\u83D4"], /* CJK Ideograph */ + ["\u83D5", "\u83D5"], /* CJK Ideograph */ + ["\u83D6", "\u83D6"], /* CJK Ideograph */ + ["\u83D7", "\u83D7"], /* CJK Ideograph */ + ["\u83D8", "\u83D8"], /* CJK Ideograph */ + ["\u83D9", "\u83D9"], /* CJK Ideograph */ + ["\u83DA", "\u83DA"], /* CJK Ideograph */ + ["\u83DB", "\u83DB"], /* CJK Ideograph */ + ["\u83DC", "\u83DC"], /* CJK Ideograph */ + ["\u83DD", "\u83DD"], /* CJK Ideograph */ + ["\u83DE", "\u83DE"], /* CJK Ideograph */ + ["\u83DF", "\u83DF"], /* CJK Ideograph */ + ["\u83E0", "\u83E0"], /* CJK Ideograph */ + ["\u83E1", "\u83E1"], /* CJK Ideograph */ + ["\u83E2", "\u83E2"], /* CJK Ideograph */ + ["\u83E3", "\u83E3"], /* CJK Ideograph */ + ["\u83E4", "\u83E4"], /* CJK Ideograph */ + ["\u83E5", "\u83E5"], /* CJK Ideograph */ + ["\u83E6", "\u83E6"], /* CJK Ideograph */ + ["\u83E7", "\u83E7"], /* CJK Ideograph */ + ["\u83E8", "\u83E8"], /* CJK Ideograph */ + ["\u83E9", "\u83E9"], /* CJK Ideograph */ + ["\u83EA", "\u83EA"], /* CJK Ideograph */ + ["\u83EB", "\u83EB"], /* CJK Ideograph */ + ["\u83EC", "\u83EC"], /* CJK Ideograph */ + ["\u83ED", "\u83ED"], /* CJK Ideograph */ + ["\u83EE", "\u83EE"], /* CJK Ideograph */ + ["\u83EF", "\u83EF"], /* CJK Ideograph */ + ["\u83F0", "\u83F0"], /* CJK Ideograph */ + ["\u83F1", "\u83F1"], /* CJK Ideograph */ + ["\u83F2", "\u83F2"], /* CJK Ideograph */ + ["\u83F3", "\u83F3"], /* CJK Ideograph */ + ["\u83F4", "\u83F4"], /* CJK Ideograph */ + ["\u83F5", "\u83F5"], /* CJK Ideograph */ + ["\u83F6", "\u83F6"], /* CJK Ideograph */ + ["\u83F7", "\u83F7"], /* CJK Ideograph */ + ["\u83F8", "\u83F8"], /* CJK Ideograph */ + ["\u83F9", "\u83F9"], /* CJK Ideograph */ + ["\u83FA", "\u83FA"], /* CJK Ideograph */ + ["\u83FB", "\u83FB"], /* CJK Ideograph */ + ["\u83FC", "\u83FC"], /* CJK Ideograph */ + ["\u83FD", "\u83FD"], /* CJK Ideograph */ + ["\u83FE", "\u83FE"], /* CJK Ideograph */ + ["\u83FF", "\u83FF"], /* CJK Ideograph */ + ["\u8400", "\u8400"], /* CJK Ideograph */ + ["\u8401", "\u8401"], /* CJK Ideograph */ + ["\u8402", "\u8402"], /* CJK Ideograph */ + ["\u8403", "\u8403"], /* CJK Ideograph */ + ["\u8404", "\u8404"], /* CJK Ideograph */ + ["\u8405", "\u8405"], /* CJK Ideograph */ + ["\u8406", "\u8406"], /* CJK Ideograph */ + ["\u8407", "\u8407"], /* CJK Ideograph */ + ["\u8408", "\u8408"], /* CJK Ideograph */ + ["\u8409", "\u8409"], /* CJK Ideograph */ + ["\u840A", "\u840A"], /* CJK Ideograph */ + ["\u840B", "\u840B"], /* CJK Ideograph */ + ["\u840C", "\u840C"], /* CJK Ideograph */ + ["\u840D", "\u840D"], /* CJK Ideograph */ + ["\u840E", "\u840E"], /* CJK Ideograph */ + ["\u840F", "\u840F"], /* CJK Ideograph */ + ["\u8410", "\u8410"], /* CJK Ideograph */ + ["\u8411", "\u8411"], /* CJK Ideograph */ + ["\u8412", "\u8412"], /* CJK Ideograph */ + ["\u8413", "\u8413"], /* CJK Ideograph */ + ["\u8414", "\u8414"], /* CJK Ideograph */ + ["\u8415", "\u8415"], /* CJK Ideograph */ + ["\u8416", "\u8416"], /* CJK Ideograph */ + ["\u8417", "\u8417"], /* CJK Ideograph */ + ["\u8418", "\u8418"], /* CJK Ideograph */ + ["\u8419", "\u8419"], /* CJK Ideograph */ + ["\u841A", "\u841A"], /* CJK Ideograph */ + ["\u841B", "\u841B"], /* CJK Ideograph */ + ["\u841C", "\u841C"], /* CJK Ideograph */ + ["\u841D", "\u841D"], /* CJK Ideograph */ + ["\u841E", "\u841E"], /* CJK Ideograph */ + ["\u841F", "\u841F"], /* CJK Ideograph */ + ["\u8420", "\u8420"], /* CJK Ideograph */ + ["\u8421", "\u8421"], /* CJK Ideograph */ + ["\u8422", "\u8422"], /* CJK Ideograph */ + ["\u8423", "\u8423"], /* CJK Ideograph */ + ["\u8424", "\u8424"], /* CJK Ideograph */ + ["\u8425", "\u8425"], /* CJK Ideograph */ + ["\u8426", "\u8426"], /* CJK Ideograph */ + ["\u8427", "\u8427"], /* CJK Ideograph */ + ["\u8428", "\u8428"], /* CJK Ideograph */ + ["\u8429", "\u8429"], /* CJK Ideograph */ + ["\u842A", "\u842A"], /* CJK Ideograph */ + ["\u842B", "\u842B"], /* CJK Ideograph */ + ["\u842C", "\u842C"], /* CJK Ideograph */ + ["\u842D", "\u842D"], /* CJK Ideograph */ + ["\u842E", "\u842E"], /* CJK Ideograph */ + ["\u842F", "\u842F"], /* CJK Ideograph */ + ["\u8430", "\u8430"], /* CJK Ideograph */ + ["\u8431", "\u8431"], /* CJK Ideograph */ + ["\u8432", "\u8432"], /* CJK Ideograph */ + ["\u8433", "\u8433"], /* CJK Ideograph */ + ["\u8434", "\u8434"], /* CJK Ideograph */ + ["\u8435", "\u8435"], /* CJK Ideograph */ + ["\u8436", "\u8436"], /* CJK Ideograph */ + ["\u8437", "\u8437"], /* CJK Ideograph */ + ["\u8438", "\u8438"], /* CJK Ideograph */ + ["\u8439", "\u8439"], /* CJK Ideograph */ + ["\u843A", "\u843A"], /* CJK Ideograph */ + ["\u843B", "\u843B"], /* CJK Ideograph */ + ["\u843C", "\u843C"], /* CJK Ideograph */ + ["\u843D", "\u843D"], /* CJK Ideograph */ + ["\u843E", "\u843E"], /* CJK Ideograph */ + ["\u843F", "\u843F"], /* CJK Ideograph */ + ["\u8440", "\u8440"], /* CJK Ideograph */ + ["\u8441", "\u8441"], /* CJK Ideograph */ + ["\u8442", "\u8442"], /* CJK Ideograph */ + ["\u8443", "\u8443"], /* CJK Ideograph */ + ["\u8444", "\u8444"], /* CJK Ideograph */ + ["\u8445", "\u8445"], /* CJK Ideograph */ + ["\u8446", "\u8446"], /* CJK Ideograph */ + ["\u8447", "\u8447"], /* CJK Ideograph */ + ["\u8448", "\u8448"], /* CJK Ideograph */ + ["\u8449", "\u8449"], /* CJK Ideograph */ + ["\u844A", "\u844A"], /* CJK Ideograph */ + ["\u844B", "\u844B"], /* CJK Ideograph */ + ["\u844C", "\u844C"], /* CJK Ideograph */ + ["\u844D", "\u844D"], /* CJK Ideograph */ + ["\u844E", "\u844E"], /* CJK Ideograph */ + ["\u844F", "\u844F"], /* CJK Ideograph */ + ["\u8450", "\u8450"], /* CJK Ideograph */ + ["\u8451", "\u8451"], /* CJK Ideograph */ + ["\u8452", "\u8452"], /* CJK Ideograph */ + ["\u8453", "\u8453"], /* CJK Ideograph */ + ["\u8454", "\u8454"], /* CJK Ideograph */ + ["\u8455", "\u8455"], /* CJK Ideograph */ + ["\u8456", "\u8456"], /* CJK Ideograph */ + ["\u8457", "\u8457"], /* CJK Ideograph */ + ["\u8458", "\u8458"], /* CJK Ideograph */ + ["\u8459", "\u8459"], /* CJK Ideograph */ + ["\u845A", "\u845A"], /* CJK Ideograph */ + ["\u845B", "\u845B"], /* CJK Ideograph */ + ["\u845C", "\u845C"], /* CJK Ideograph */ + ["\u845D", "\u845D"], /* CJK Ideograph */ + ["\u845E", "\u845E"], /* CJK Ideograph */ + ["\u845F", "\u845F"], /* CJK Ideograph */ + ["\u8460", "\u8460"], /* CJK Ideograph */ + ["\u8461", "\u8461"], /* CJK Ideograph */ + ["\u8462", "\u8462"], /* CJK Ideograph */ + ["\u8463", "\u8463"], /* CJK Ideograph */ + ["\u8464", "\u8464"], /* CJK Ideograph */ + ["\u8465", "\u8465"], /* CJK Ideograph */ + ["\u8466", "\u8466"], /* CJK Ideograph */ + ["\u8467", "\u8467"], /* CJK Ideograph */ + ["\u8468", "\u8468"], /* CJK Ideograph */ + ["\u8469", "\u8469"], /* CJK Ideograph */ + ["\u846A", "\u846A"], /* CJK Ideograph */ + ["\u846B", "\u846B"], /* CJK Ideograph */ + ["\u846C", "\u846C"], /* CJK Ideograph */ + ["\u846D", "\u846D"], /* CJK Ideograph */ + ["\u846E", "\u846E"], /* CJK Ideograph */ + ["\u846F", "\u846F"], /* CJK Ideograph */ + ["\u8470", "\u8470"], /* CJK Ideograph */ + ["\u8471", "\u8471"], /* CJK Ideograph */ + ["\u8472", "\u8472"], /* CJK Ideograph */ + ["\u8473", "\u8473"], /* CJK Ideograph */ + ["\u8474", "\u8474"], /* CJK Ideograph */ + ["\u8475", "\u8475"], /* CJK Ideograph */ + ["\u8476", "\u8476"], /* CJK Ideograph */ + ["\u8477", "\u8477"], /* CJK Ideograph */ + ["\u8478", "\u8478"], /* CJK Ideograph */ + ["\u8479", "\u8479"], /* CJK Ideograph */ + ["\u847A", "\u847A"], /* CJK Ideograph */ + ["\u847B", "\u847B"], /* CJK Ideograph */ + ["\u847C", "\u847C"], /* CJK Ideograph */ + ["\u847D", "\u847D"], /* CJK Ideograph */ + ["\u847E", "\u847E"], /* CJK Ideograph */ + ["\u847F", "\u847F"], /* CJK Ideograph */ + ["\u8480", "\u8480"], /* CJK Ideograph */ + ["\u8481", "\u8481"], /* CJK Ideograph */ + ["\u8482", "\u8482"], /* CJK Ideograph */ + ["\u8483", "\u8483"], /* CJK Ideograph */ + ["\u8484", "\u8484"], /* CJK Ideograph */ + ["\u8485", "\u8485"], /* CJK Ideograph */ + ["\u8486", "\u8486"], /* CJK Ideograph */ + ["\u8487", "\u8487"], /* CJK Ideograph */ + ["\u8488", "\u8488"], /* CJK Ideograph */ + ["\u8489", "\u8489"], /* CJK Ideograph */ + ["\u848A", "\u848A"], /* CJK Ideograph */ + ["\u848B", "\u848B"], /* CJK Ideograph */ + ["\u848C", "\u848C"], /* CJK Ideograph */ + ["\u848D", "\u848D"], /* CJK Ideograph */ + ["\u848E", "\u848E"], /* CJK Ideograph */ + ["\u848F", "\u848F"], /* CJK Ideograph */ + ["\u8490", "\u8490"], /* CJK Ideograph */ + ["\u8491", "\u8491"], /* CJK Ideograph */ + ["\u8492", "\u8492"], /* CJK Ideograph */ + ["\u8493", "\u8493"], /* CJK Ideograph */ + ["\u8494", "\u8494"], /* CJK Ideograph */ + ["\u8495", "\u8495"], /* CJK Ideograph */ + ["\u8496", "\u8496"], /* CJK Ideograph */ + ["\u8497", "\u8497"], /* CJK Ideograph */ + ["\u8498", "\u8498"], /* CJK Ideograph */ + ["\u8499", "\u8499"], /* CJK Ideograph */ + ["\u849A", "\u849A"], /* CJK Ideograph */ + ["\u849B", "\u849B"], /* CJK Ideograph */ + ["\u849C", "\u849C"], /* CJK Ideograph */ + ["\u849D", "\u849D"], /* CJK Ideograph */ + ["\u849E", "\u849E"], /* CJK Ideograph */ + ["\u849F", "\u849F"], /* CJK Ideograph */ + ["\u84A0", "\u84A0"], /* CJK Ideograph */ + ["\u84A1", "\u84A1"], /* CJK Ideograph */ + ["\u84A2", "\u84A2"], /* CJK Ideograph */ + ["\u84A3", "\u84A3"], /* CJK Ideograph */ + ["\u84A4", "\u84A4"], /* CJK Ideograph */ + ["\u84A5", "\u84A5"], /* CJK Ideograph */ + ["\u84A6", "\u84A6"], /* CJK Ideograph */ + ["\u84A7", "\u84A7"], /* CJK Ideograph */ + ["\u84A8", "\u84A8"], /* CJK Ideograph */ + ["\u84A9", "\u84A9"], /* CJK Ideograph */ + ["\u84AA", "\u84AA"], /* CJK Ideograph */ + ["\u84AB", "\u84AB"], /* CJK Ideograph */ + ["\u84AC", "\u84AC"], /* CJK Ideograph */ + ["\u84AD", "\u84AD"], /* CJK Ideograph */ + ["\u84AE", "\u84AE"], /* CJK Ideograph */ + ["\u84AF", "\u84AF"], /* CJK Ideograph */ + ["\u84B0", "\u84B0"], /* CJK Ideograph */ + ["\u84B1", "\u84B1"], /* CJK Ideograph */ + ["\u84B2", "\u84B2"], /* CJK Ideograph */ + ["\u84B3", "\u84B3"], /* CJK Ideograph */ + ["\u84B4", "\u84B4"], /* CJK Ideograph */ + ["\u84B5", "\u84B5"], /* CJK Ideograph */ + ["\u84B6", "\u84B6"], /* CJK Ideograph */ + ["\u84B7", "\u84B7"], /* CJK Ideograph */ + ["\u84B8", "\u84B8"], /* CJK Ideograph */ + ["\u84B9", "\u84B9"], /* CJK Ideograph */ + ["\u84BA", "\u84BA"], /* CJK Ideograph */ + ["\u84BB", "\u84BB"], /* CJK Ideograph */ + ["\u84BC", "\u84BC"], /* CJK Ideograph */ + ["\u84BD", "\u84BD"], /* CJK Ideograph */ + ["\u84BE", "\u84BE"], /* CJK Ideograph */ + ["\u84BF", "\u84BF"], /* CJK Ideograph */ + ["\u84C0", "\u84C0"], /* CJK Ideograph */ + ["\u84C1", "\u84C1"], /* CJK Ideograph */ + ["\u84C2", "\u84C2"], /* CJK Ideograph */ + ["\u84C3", "\u84C3"], /* CJK Ideograph */ + ["\u84C4", "\u84C4"], /* CJK Ideograph */ + ["\u84C5", "\u84C5"], /* CJK Ideograph */ + ["\u84C6", "\u84C6"], /* CJK Ideograph */ + ["\u84C7", "\u84C7"], /* CJK Ideograph */ + ["\u84C8", "\u84C8"], /* CJK Ideograph */ + ["\u84C9", "\u84C9"], /* CJK Ideograph */ + ["\u84CA", "\u84CA"], /* CJK Ideograph */ + ["\u84CB", "\u84CB"], /* CJK Ideograph */ + ["\u84CC", "\u84CC"], /* CJK Ideograph */ + ["\u84CD", "\u84CD"], /* CJK Ideograph */ + ["\u84CE", "\u84CE"], /* CJK Ideograph */ + ["\u84CF", "\u84CF"], /* CJK Ideograph */ + ["\u84D0", "\u84D0"], /* CJK Ideograph */ + ["\u84D1", "\u84D1"], /* CJK Ideograph */ + ["\u84D2", "\u84D2"], /* CJK Ideograph */ + ["\u84D3", "\u84D3"], /* CJK Ideograph */ + ["\u84D4", "\u84D4"], /* CJK Ideograph */ + ["\u84D5", "\u84D5"], /* CJK Ideograph */ + ["\u84D6", "\u84D6"], /* CJK Ideograph */ + ["\u84D7", "\u84D7"], /* CJK Ideograph */ + ["\u84D8", "\u84D8"], /* CJK Ideograph */ + ["\u84D9", "\u84D9"], /* CJK Ideograph */ + ["\u84DA", "\u84DA"], /* CJK Ideograph */ + ["\u84DB", "\u84DB"], /* CJK Ideograph */ + ["\u84DC", "\u84DC"], /* CJK Ideograph */ + ["\u84DD", "\u84DD"], /* CJK Ideograph */ + ["\u84DE", "\u84DE"], /* CJK Ideograph */ + ["\u84DF", "\u84DF"], /* CJK Ideograph */ + ["\u84E0", "\u84E0"], /* CJK Ideograph */ + ["\u84E1", "\u84E1"], /* CJK Ideograph */ + ["\u84E2", "\u84E2"], /* CJK Ideograph */ + ["\u84E3", "\u84E3"], /* CJK Ideograph */ + ["\u84E4", "\u84E4"], /* CJK Ideograph */ + ["\u84E5", "\u84E5"], /* CJK Ideograph */ + ["\u84E6", "\u84E6"], /* CJK Ideograph */ + ["\u84E7", "\u84E7"], /* CJK Ideograph */ + ["\u84E8", "\u84E8"], /* CJK Ideograph */ + ["\u84E9", "\u84E9"], /* CJK Ideograph */ + ["\u84EA", "\u84EA"], /* CJK Ideograph */ + ["\u84EB", "\u84EB"], /* CJK Ideograph */ + ["\u84EC", "\u84EC"], /* CJK Ideograph */ + ["\u84ED", "\u84ED"], /* CJK Ideograph */ + ["\u84EE", "\u84EE"], /* CJK Ideograph */ + ["\u84EF", "\u84EF"], /* CJK Ideograph */ + ["\u84F0", "\u84F0"], /* CJK Ideograph */ + ["\u84F1", "\u84F1"], /* CJK Ideograph */ + ["\u84F2", "\u84F2"], /* CJK Ideograph */ + ["\u84F3", "\u84F3"], /* CJK Ideograph */ + ["\u84F4", "\u84F4"], /* CJK Ideograph */ + ["\u84F5", "\u84F5"], /* CJK Ideograph */ + ["\u84F6", "\u84F6"], /* CJK Ideograph */ + ["\u84F7", "\u84F7"], /* CJK Ideograph */ + ["\u84F8", "\u84F8"], /* CJK Ideograph */ + ["\u84F9", "\u84F9"], /* CJK Ideograph */ + ["\u84FA", "\u84FA"], /* CJK Ideograph */ + ["\u84FB", "\u84FB"], /* CJK Ideograph */ + ["\u84FC", "\u84FC"], /* CJK Ideograph */ + ["\u84FD", "\u84FD"], /* CJK Ideograph */ + ["\u84FE", "\u84FE"], /* CJK Ideograph */ + ["\u84FF", "\u84FF"], /* CJK Ideograph */ + ["\u8500", "\u8500"], /* CJK Ideograph */ + ["\u8501", "\u8501"], /* CJK Ideograph */ + ["\u8502", "\u8502"], /* CJK Ideograph */ + ["\u8503", "\u8503"], /* CJK Ideograph */ + ["\u8504", "\u8504"], /* CJK Ideograph */ + ["\u8505", "\u8505"], /* CJK Ideograph */ + ["\u8506", "\u8506"], /* CJK Ideograph */ + ["\u8507", "\u8507"], /* CJK Ideograph */ + ["\u8508", "\u8508"], /* CJK Ideograph */ + ["\u8509", "\u8509"], /* CJK Ideograph */ + ["\u850A", "\u850A"], /* CJK Ideograph */ + ["\u850B", "\u850B"], /* CJK Ideograph */ + ["\u850C", "\u850C"], /* CJK Ideograph */ + ["\u850D", "\u850D"], /* CJK Ideograph */ + ["\u850E", "\u850E"], /* CJK Ideograph */ + ["\u850F", "\u850F"], /* CJK Ideograph */ + ["\u8510", "\u8510"], /* CJK Ideograph */ + ["\u8511", "\u8511"], /* CJK Ideograph */ + ["\u8512", "\u8512"], /* CJK Ideograph */ + ["\u8513", "\u8513"], /* CJK Ideograph */ + ["\u8514", "\u8514"], /* CJK Ideograph */ + ["\u8515", "\u8515"], /* CJK Ideograph */ + ["\u8516", "\u8516"], /* CJK Ideograph */ + ["\u8517", "\u8517"], /* CJK Ideograph */ + ["\u8518", "\u8518"], /* CJK Ideograph */ + ["\u8519", "\u8519"], /* CJK Ideograph */ + ["\u851A", "\u851A"], /* CJK Ideograph */ + ["\u851B", "\u851B"], /* CJK Ideograph */ + ["\u851C", "\u851C"], /* CJK Ideograph */ + ["\u851D", "\u851D"], /* CJK Ideograph */ + ["\u851E", "\u851E"], /* CJK Ideograph */ + ["\u851F", "\u851F"], /* CJK Ideograph */ + ["\u8520", "\u8520"], /* CJK Ideograph */ + ["\u8521", "\u8521"], /* CJK Ideograph */ + ["\u8522", "\u8522"], /* CJK Ideograph */ + ["\u8523", "\u8523"], /* CJK Ideograph */ + ["\u8524", "\u8524"], /* CJK Ideograph */ + ["\u8525", "\u8525"], /* CJK Ideograph */ + ["\u8526", "\u8526"], /* CJK Ideograph */ + ["\u8527", "\u8527"], /* CJK Ideograph */ + ["\u8528", "\u8528"], /* CJK Ideograph */ + ["\u8529", "\u8529"], /* CJK Ideograph */ + ["\u852A", "\u852A"], /* CJK Ideograph */ + ["\u852B", "\u852B"], /* CJK Ideograph */ + ["\u852C", "\u852C"], /* CJK Ideograph */ + ["\u852D", "\u852D"], /* CJK Ideograph */ + ["\u852E", "\u852E"], /* CJK Ideograph */ + ["\u852F", "\u852F"], /* CJK Ideograph */ + ["\u8530", "\u8530"], /* CJK Ideograph */ + ["\u8531", "\u8531"], /* CJK Ideograph */ + ["\u8532", "\u8532"], /* CJK Ideograph */ + ["\u8533", "\u8533"], /* CJK Ideograph */ + ["\u8534", "\u8534"], /* CJK Ideograph */ + ["\u8535", "\u8535"], /* CJK Ideograph */ + ["\u8536", "\u8536"], /* CJK Ideograph */ + ["\u8537", "\u8537"], /* CJK Ideograph */ + ["\u8538", "\u8538"], /* CJK Ideograph */ + ["\u8539", "\u8539"], /* CJK Ideograph */ + ["\u853A", "\u853A"], /* CJK Ideograph */ + ["\u853B", "\u853B"], /* CJK Ideograph */ + ["\u853C", "\u853C"], /* CJK Ideograph */ + ["\u853D", "\u853D"], /* CJK Ideograph */ + ["\u853E", "\u853E"], /* CJK Ideograph */ + ["\u853F", "\u853F"], /* CJK Ideograph */ + ["\u8540", "\u8540"], /* CJK Ideograph */ + ["\u8541", "\u8541"], /* CJK Ideograph */ + ["\u8542", "\u8542"], /* CJK Ideograph */ + ["\u8543", "\u8543"], /* CJK Ideograph */ + ["\u8544", "\u8544"], /* CJK Ideograph */ + ["\u8545", "\u8545"], /* CJK Ideograph */ + ["\u8546", "\u8546"], /* CJK Ideograph */ + ["\u8547", "\u8547"], /* CJK Ideograph */ + ["\u8548", "\u8548"], /* CJK Ideograph */ + ["\u8549", "\u8549"], /* CJK Ideograph */ + ["\u854A", "\u854A"], /* CJK Ideograph */ + ["\u854B", "\u854B"], /* CJK Ideograph */ + ["\u854C", "\u854C"], /* CJK Ideograph */ + ["\u854D", "\u854D"], /* CJK Ideograph */ + ["\u854E", "\u854E"], /* CJK Ideograph */ + ["\u854F", "\u854F"], /* CJK Ideograph */ + ["\u8550", "\u8550"], /* CJK Ideograph */ + ["\u8551", "\u8551"], /* CJK Ideograph */ + ["\u8552", "\u8552"], /* CJK Ideograph */ + ["\u8553", "\u8553"], /* CJK Ideograph */ + ["\u8554", "\u8554"], /* CJK Ideograph */ + ["\u8555", "\u8555"], /* CJK Ideograph */ + ["\u8556", "\u8556"], /* CJK Ideograph */ + ["\u8557", "\u8557"], /* CJK Ideograph */ + ["\u8558", "\u8558"], /* CJK Ideograph */ + ["\u8559", "\u8559"], /* CJK Ideograph */ + ["\u855A", "\u855A"], /* CJK Ideograph */ + ["\u855B", "\u855B"], /* CJK Ideograph */ + ["\u855C", "\u855C"], /* CJK Ideograph */ + ["\u855D", "\u855D"], /* CJK Ideograph */ + ["\u855E", "\u855E"], /* CJK Ideograph */ + ["\u855F", "\u855F"], /* CJK Ideograph */ + ["\u8560", "\u8560"], /* CJK Ideograph */ + ["\u8561", "\u8561"], /* CJK Ideograph */ + ["\u8562", "\u8562"], /* CJK Ideograph */ + ["\u8563", "\u8563"], /* CJK Ideograph */ + ["\u8564", "\u8564"], /* CJK Ideograph */ + ["\u8565", "\u8565"], /* CJK Ideograph */ + ["\u8566", "\u8566"], /* CJK Ideograph */ + ["\u8567", "\u8567"], /* CJK Ideograph */ + ["\u8568", "\u8568"], /* CJK Ideograph */ + ["\u8569", "\u8569"], /* CJK Ideograph */ + ["\u856A", "\u856A"], /* CJK Ideograph */ + ["\u856B", "\u856B"], /* CJK Ideograph */ + ["\u856C", "\u856C"], /* CJK Ideograph */ + ["\u856D", "\u856D"], /* CJK Ideograph */ + ["\u856E", "\u856E"], /* CJK Ideograph */ + ["\u856F", "\u856F"], /* CJK Ideograph */ + ["\u8570", "\u8570"], /* CJK Ideograph */ + ["\u8571", "\u8571"], /* CJK Ideograph */ + ["\u8572", "\u8572"], /* CJK Ideograph */ + ["\u8573", "\u8573"], /* CJK Ideograph */ + ["\u8574", "\u8574"], /* CJK Ideograph */ + ["\u8575", "\u8575"], /* CJK Ideograph */ + ["\u8576", "\u8576"], /* CJK Ideograph */ + ["\u8577", "\u8577"], /* CJK Ideograph */ + ["\u8578", "\u8578"], /* CJK Ideograph */ + ["\u8579", "\u8579"], /* CJK Ideograph */ + ["\u857A", "\u857A"], /* CJK Ideograph */ + ["\u857B", "\u857B"], /* CJK Ideograph */ + ["\u857C", "\u857C"], /* CJK Ideograph */ + ["\u857D", "\u857D"], /* CJK Ideograph */ + ["\u857E", "\u857E"], /* CJK Ideograph */ + ["\u857F", "\u857F"], /* CJK Ideograph */ + ["\u8580", "\u8580"], /* CJK Ideograph */ + ["\u8581", "\u8581"], /* CJK Ideograph */ + ["\u8582", "\u8582"], /* CJK Ideograph */ + ["\u8583", "\u8583"], /* CJK Ideograph */ + ["\u8584", "\u8584"], /* CJK Ideograph */ + ["\u8585", "\u8585"], /* CJK Ideograph */ + ["\u8586", "\u8586"], /* CJK Ideograph */ + ["\u8587", "\u8587"], /* CJK Ideograph */ + ["\u8588", "\u8588"], /* CJK Ideograph */ + ["\u8589", "\u8589"], /* CJK Ideograph */ + ["\u858A", "\u858A"], /* CJK Ideograph */ + ["\u858B", "\u858B"], /* CJK Ideograph */ + ["\u858C", "\u858C"], /* CJK Ideograph */ + ["\u858D", "\u858D"], /* CJK Ideograph */ + ["\u858E", "\u858E"], /* CJK Ideograph */ + ["\u858F", "\u858F"], /* CJK Ideograph */ + ["\u8590", "\u8590"], /* CJK Ideograph */ + ["\u8591", "\u8591"], /* CJK Ideograph */ + ["\u8592", "\u8592"], /* CJK Ideograph */ + ["\u8593", "\u8593"], /* CJK Ideograph */ + ["\u8594", "\u8594"], /* CJK Ideograph */ + ["\u8595", "\u8595"], /* CJK Ideograph */ + ["\u8596", "\u8596"], /* CJK Ideograph */ + ["\u8597", "\u8597"], /* CJK Ideograph */ + ["\u8598", "\u8598"], /* CJK Ideograph */ + ["\u8599", "\u8599"], /* CJK Ideograph */ + ["\u859A", "\u859A"], /* CJK Ideograph */ + ["\u859B", "\u859B"], /* CJK Ideograph */ + ["\u859C", "\u859C"], /* CJK Ideograph */ + ["\u859D", "\u859D"], /* CJK Ideograph */ + ["\u859E", "\u859E"], /* CJK Ideograph */ + ["\u859F", "\u859F"], /* CJK Ideograph */ + ["\u85A0", "\u85A0"], /* CJK Ideograph */ + ["\u85A1", "\u85A1"], /* CJK Ideograph */ + ["\u85A2", "\u85A2"], /* CJK Ideograph */ + ["\u85A3", "\u85A3"], /* CJK Ideograph */ + ["\u85A4", "\u85A4"], /* CJK Ideograph */ + ["\u85A5", "\u85A5"], /* CJK Ideograph */ + ["\u85A6", "\u85A6"], /* CJK Ideograph */ + ["\u85A7", "\u85A7"], /* CJK Ideograph */ + ["\u85A8", "\u85A8"], /* CJK Ideograph */ + ["\u85A9", "\u85A9"], /* CJK Ideograph */ + ["\u85AA", "\u85AA"], /* CJK Ideograph */ + ["\u85AB", "\u85AB"], /* CJK Ideograph */ + ["\u85AC", "\u85AC"], /* CJK Ideograph */ + ["\u85AD", "\u85AD"], /* CJK Ideograph */ + ["\u85AE", "\u85AE"], /* CJK Ideograph */ + ["\u85AF", "\u85AF"], /* CJK Ideograph */ + ["\u85B0", "\u85B0"], /* CJK Ideograph */ + ["\u85B1", "\u85B1"], /* CJK Ideograph */ + ["\u85B2", "\u85B2"], /* CJK Ideograph */ + ["\u85B3", "\u85B3"], /* CJK Ideograph */ + ["\u85B4", "\u85B4"], /* CJK Ideograph */ + ["\u85B5", "\u85B5"], /* CJK Ideograph */ + ["\u85B6", "\u85B6"], /* CJK Ideograph */ + ["\u85B7", "\u85B7"], /* CJK Ideograph */ + ["\u85B8", "\u85B8"], /* CJK Ideograph */ + ["\u85B9", "\u85B9"], /* CJK Ideograph */ + ["\u85BA", "\u85BA"], /* CJK Ideograph */ + ["\u85BB", "\u85BB"], /* CJK Ideograph */ + ["\u85BC", "\u85BC"], /* CJK Ideograph */ + ["\u85BD", "\u85BD"], /* CJK Ideograph */ + ["\u85BE", "\u85BE"], /* CJK Ideograph */ + ["\u85BF", "\u85BF"], /* CJK Ideograph */ + ["\u85C0", "\u85C0"], /* CJK Ideograph */ + ["\u85C1", "\u85C1"], /* CJK Ideograph */ + ["\u85C2", "\u85C2"], /* CJK Ideograph */ + ["\u85C3", "\u85C3"], /* CJK Ideograph */ + ["\u85C4", "\u85C4"], /* CJK Ideograph */ + ["\u85C5", "\u85C5"], /* CJK Ideograph */ + ["\u85C6", "\u85C6"], /* CJK Ideograph */ + ["\u85C7", "\u85C7"], /* CJK Ideograph */ + ["\u85C8", "\u85C8"], /* CJK Ideograph */ + ["\u85C9", "\u85C9"], /* CJK Ideograph */ + ["\u85CA", "\u85CA"], /* CJK Ideograph */ + ["\u85CB", "\u85CB"], /* CJK Ideograph */ + ["\u85CC", "\u85CC"], /* CJK Ideograph */ + ["\u85CD", "\u85CD"], /* CJK Ideograph */ + ["\u85CE", "\u85CE"], /* CJK Ideograph */ + ["\u85CF", "\u85CF"], /* CJK Ideograph */ + ["\u85D0", "\u85D0"], /* CJK Ideograph */ + ["\u85D1", "\u85D1"], /* CJK Ideograph */ + ["\u85D2", "\u85D2"], /* CJK Ideograph */ + ["\u85D3", "\u85D3"], /* CJK Ideograph */ + ["\u85D4", "\u85D4"], /* CJK Ideograph */ + ["\u85D5", "\u85D5"], /* CJK Ideograph */ + ["\u85D6", "\u85D6"], /* CJK Ideograph */ + ["\u85D7", "\u85D7"], /* CJK Ideograph */ + ["\u85D8", "\u85D8"], /* CJK Ideograph */ + ["\u85D9", "\u85D9"], /* CJK Ideograph */ + ["\u85DA", "\u85DA"], /* CJK Ideograph */ + ["\u85DB", "\u85DB"], /* CJK Ideograph */ + ["\u85DC", "\u85DC"], /* CJK Ideograph */ + ["\u85DD", "\u85DD"], /* CJK Ideograph */ + ["\u85DE", "\u85DE"], /* CJK Ideograph */ + ["\u85DF", "\u85DF"], /* CJK Ideograph */ + ["\u85E0", "\u85E0"], /* CJK Ideograph */ + ["\u85E1", "\u85E1"], /* CJK Ideograph */ + ["\u85E2", "\u85E2"], /* CJK Ideograph */ + ["\u85E3", "\u85E3"], /* CJK Ideograph */ + ["\u85E4", "\u85E4"], /* CJK Ideograph */ + ["\u85E5", "\u85E5"], /* CJK Ideograph */ + ["\u85E6", "\u85E6"], /* CJK Ideograph */ + ["\u85E7", "\u85E7"], /* CJK Ideograph */ + ["\u85E8", "\u85E8"], /* CJK Ideograph */ + ["\u85E9", "\u85E9"], /* CJK Ideograph */ + ["\u85EA", "\u85EA"], /* CJK Ideograph */ + ["\u85EB", "\u85EB"], /* CJK Ideograph */ + ["\u85EC", "\u85EC"], /* CJK Ideograph */ + ["\u85ED", "\u85ED"], /* CJK Ideograph */ + ["\u85EE", "\u85EE"], /* CJK Ideograph */ + ["\u85EF", "\u85EF"], /* CJK Ideograph */ + ["\u85F0", "\u85F0"], /* CJK Ideograph */ + ["\u85F1", "\u85F1"], /* CJK Ideograph */ + ["\u85F2", "\u85F2"], /* CJK Ideograph */ + ["\u85F3", "\u85F3"], /* CJK Ideograph */ + ["\u85F4", "\u85F4"], /* CJK Ideograph */ + ["\u85F5", "\u85F5"], /* CJK Ideograph */ + ["\u85F6", "\u85F6"], /* CJK Ideograph */ + ["\u85F7", "\u85F7"], /* CJK Ideograph */ + ["\u85F8", "\u85F8"], /* CJK Ideograph */ + ["\u85F9", "\u85F9"], /* CJK Ideograph */ + ["\u85FA", "\u85FA"], /* CJK Ideograph */ + ["\u85FB", "\u85FB"], /* CJK Ideograph */ + ["\u85FC", "\u85FC"], /* CJK Ideograph */ + ["\u85FD", "\u85FD"], /* CJK Ideograph */ + ["\u85FE", "\u85FE"], /* CJK Ideograph */ + ["\u85FF", "\u85FF"], /* CJK Ideograph */ + ["\u8600", "\u8600"], /* CJK Ideograph */ + ["\u8601", "\u8601"], /* CJK Ideograph */ + ["\u8602", "\u8602"], /* CJK Ideograph */ + ["\u8603", "\u8603"], /* CJK Ideograph */ + ["\u8604", "\u8604"], /* CJK Ideograph */ + ["\u8605", "\u8605"], /* CJK Ideograph */ + ["\u8606", "\u8606"], /* CJK Ideograph */ + ["\u8607", "\u8607"], /* CJK Ideograph */ + ["\u8608", "\u8608"], /* CJK Ideograph */ + ["\u8609", "\u8609"], /* CJK Ideograph */ + ["\u860A", "\u860A"], /* CJK Ideograph */ + ["\u860B", "\u860B"], /* CJK Ideograph */ + ["\u860C", "\u860C"], /* CJK Ideograph */ + ["\u860D", "\u860D"], /* CJK Ideograph */ + ["\u860E", "\u860E"], /* CJK Ideograph */ + ["\u860F", "\u860F"], /* CJK Ideograph */ + ["\u8610", "\u8610"], /* CJK Ideograph */ + ["\u8611", "\u8611"], /* CJK Ideograph */ + ["\u8612", "\u8612"], /* CJK Ideograph */ + ["\u8613", "\u8613"], /* CJK Ideograph */ + ["\u8614", "\u8614"], /* CJK Ideograph */ + ["\u8615", "\u8615"], /* CJK Ideograph */ + ["\u8616", "\u8616"], /* CJK Ideograph */ + ["\u8617", "\u8617"], /* CJK Ideograph */ + ["\u8618", "\u8618"], /* CJK Ideograph */ + ["\u8619", "\u8619"], /* CJK Ideograph */ + ["\u861A", "\u861A"], /* CJK Ideograph */ + ["\u861B", "\u861B"], /* CJK Ideograph */ + ["\u861C", "\u861C"], /* CJK Ideograph */ + ["\u861D", "\u861D"], /* CJK Ideograph */ + ["\u861E", "\u861E"], /* CJK Ideograph */ + ["\u861F", "\u861F"], /* CJK Ideograph */ + ["\u8620", "\u8620"], /* CJK Ideograph */ + ["\u8621", "\u8621"], /* CJK Ideograph */ + ["\u8622", "\u8622"], /* CJK Ideograph */ + ["\u8623", "\u8623"], /* CJK Ideograph */ + ["\u8624", "\u8624"], /* CJK Ideograph */ + ["\u8625", "\u8625"], /* CJK Ideograph */ + ["\u8626", "\u8626"], /* CJK Ideograph */ + ["\u8627", "\u8627"], /* CJK Ideograph */ + ["\u8628", "\u8628"], /* CJK Ideograph */ + ["\u8629", "\u8629"], /* CJK Ideograph */ + ["\u862A", "\u862A"], /* CJK Ideograph */ + ["\u862B", "\u862B"], /* CJK Ideograph */ + ["\u862C", "\u862C"], /* CJK Ideograph */ + ["\u862D", "\u862D"], /* CJK Ideograph */ + ["\u862E", "\u862E"], /* CJK Ideograph */ + ["\u862F", "\u862F"], /* CJK Ideograph */ + ["\u8630", "\u8630"], /* CJK Ideograph */ + ["\u8631", "\u8631"], /* CJK Ideograph */ + ["\u8632", "\u8632"], /* CJK Ideograph */ + ["\u8633", "\u8633"], /* CJK Ideograph */ + ["\u8634", "\u8634"], /* CJK Ideograph */ + ["\u8635", "\u8635"], /* CJK Ideograph */ + ["\u8636", "\u8636"], /* CJK Ideograph */ + ["\u8637", "\u8637"], /* CJK Ideograph */ + ["\u8638", "\u8638"], /* CJK Ideograph */ + ["\u8639", "\u8639"], /* CJK Ideograph */ + ["\u863A", "\u863A"], /* CJK Ideograph */ + ["\u863B", "\u863B"], /* CJK Ideograph */ + ["\u863C", "\u863C"], /* CJK Ideograph */ + ["\u863D", "\u863D"], /* CJK Ideograph */ + ["\u863E", "\u863E"], /* CJK Ideograph */ + ["\u863F", "\u863F"], /* CJK Ideograph */ + ["\u8640", "\u8640"], /* CJK Ideograph */ + ["\u8641", "\u8641"], /* CJK Ideograph */ + ["\u8642", "\u8642"], /* CJK Ideograph */ + ["\u8643", "\u8643"], /* CJK Ideograph */ + ["\u8644", "\u8644"], /* CJK Ideograph */ + ["\u8645", "\u8645"], /* CJK Ideograph */ + ["\u8646", "\u8646"], /* CJK Ideograph */ + ["\u8647", "\u8647"], /* CJK Ideograph */ + ["\u8648", "\u8648"], /* CJK Ideograph */ + ["\u8649", "\u8649"], /* CJK Ideograph */ + ["\u864A", "\u864A"], /* CJK Ideograph */ + ["\u864B", "\u864B"], /* CJK Ideograph */ + ["\u864C", "\u864C"], /* CJK Ideograph */ + ["\u864D", "\u864D"], /* CJK Ideograph */ + ["\u864E", "\u864E"], /* CJK Ideograph */ + ["\u864F", "\u864F"], /* CJK Ideograph */ + ["\u8650", "\u8650"], /* CJK Ideograph */ + ["\u8651", "\u8651"], /* CJK Ideograph */ + ["\u8652", "\u8652"], /* CJK Ideograph */ + ["\u8653", "\u8653"], /* CJK Ideograph */ + ["\u8654", "\u8654"], /* CJK Ideograph */ + ["\u8655", "\u8655"], /* CJK Ideograph */ + ["\u8656", "\u8656"], /* CJK Ideograph */ + ["\u8657", "\u8657"], /* CJK Ideograph */ + ["\u8658", "\u8658"], /* CJK Ideograph */ + ["\u8659", "\u8659"], /* CJK Ideograph */ + ["\u865A", "\u865A"], /* CJK Ideograph */ + ["\u865B", "\u865B"], /* CJK Ideograph */ + ["\u865C", "\u865C"], /* CJK Ideograph */ + ["\u865D", "\u865D"], /* CJK Ideograph */ + ["\u865E", "\u865E"], /* CJK Ideograph */ + ["\u865F", "\u865F"], /* CJK Ideograph */ + ["\u8660", "\u8660"], /* CJK Ideograph */ + ["\u8661", "\u8661"], /* CJK Ideograph */ + ["\u8662", "\u8662"], /* CJK Ideograph */ + ["\u8663", "\u8663"], /* CJK Ideograph */ + ["\u8664", "\u8664"], /* CJK Ideograph */ + ["\u8665", "\u8665"], /* CJK Ideograph */ + ["\u8666", "\u8666"], /* CJK Ideograph */ + ["\u8667", "\u8667"], /* CJK Ideograph */ + ["\u8668", "\u8668"], /* CJK Ideograph */ + ["\u8669", "\u8669"], /* CJK Ideograph */ + ["\u866A", "\u866A"], /* CJK Ideograph */ + ["\u866B", "\u866B"], /* CJK Ideograph */ + ["\u866C", "\u866C"], /* CJK Ideograph */ + ["\u866D", "\u866D"], /* CJK Ideograph */ + ["\u866E", "\u866E"], /* CJK Ideograph */ + ["\u866F", "\u866F"], /* CJK Ideograph */ + ["\u8670", "\u8670"], /* CJK Ideograph */ + ["\u8671", "\u8671"], /* CJK Ideograph */ + ["\u8672", "\u8672"], /* CJK Ideograph */ + ["\u8673", "\u8673"], /* CJK Ideograph */ + ["\u8674", "\u8674"], /* CJK Ideograph */ + ["\u8675", "\u8675"], /* CJK Ideograph */ + ["\u8676", "\u8676"], /* CJK Ideograph */ + ["\u8677", "\u8677"], /* CJK Ideograph */ + ["\u8678", "\u8678"], /* CJK Ideograph */ + ["\u8679", "\u8679"], /* CJK Ideograph */ + ["\u867A", "\u867A"], /* CJK Ideograph */ + ["\u867B", "\u867B"], /* CJK Ideograph */ + ["\u867C", "\u867C"], /* CJK Ideograph */ + ["\u867D", "\u867D"], /* CJK Ideograph */ + ["\u867E", "\u867E"], /* CJK Ideograph */ + ["\u867F", "\u867F"], /* CJK Ideograph */ + ["\u8680", "\u8680"], /* CJK Ideograph */ + ["\u8681", "\u8681"], /* CJK Ideograph */ + ["\u8682", "\u8682"], /* CJK Ideograph */ + ["\u8683", "\u8683"], /* CJK Ideograph */ + ["\u8684", "\u8684"], /* CJK Ideograph */ + ["\u8685", "\u8685"], /* CJK Ideograph */ + ["\u8686", "\u8686"], /* CJK Ideograph */ + ["\u8687", "\u8687"], /* CJK Ideograph */ + ["\u8688", "\u8688"], /* CJK Ideograph */ + ["\u8689", "\u8689"], /* CJK Ideograph */ + ["\u868A", "\u868A"], /* CJK Ideograph */ + ["\u868B", "\u868B"], /* CJK Ideograph */ + ["\u868C", "\u868C"], /* CJK Ideograph */ + ["\u868D", "\u868D"], /* CJK Ideograph */ + ["\u868E", "\u868E"], /* CJK Ideograph */ + ["\u868F", "\u868F"], /* CJK Ideograph */ + ["\u8690", "\u8690"], /* CJK Ideograph */ + ["\u8691", "\u8691"], /* CJK Ideograph */ + ["\u8692", "\u8692"], /* CJK Ideograph */ + ["\u8693", "\u8693"], /* CJK Ideograph */ + ["\u8694", "\u8694"], /* CJK Ideograph */ + ["\u8695", "\u8695"], /* CJK Ideograph */ + ["\u8696", "\u8696"], /* CJK Ideograph */ + ["\u8697", "\u8697"], /* CJK Ideograph */ + ["\u8698", "\u8698"], /* CJK Ideograph */ + ["\u8699", "\u8699"], /* CJK Ideograph */ + ["\u869A", "\u869A"], /* CJK Ideograph */ + ["\u869B", "\u869B"], /* CJK Ideograph */ + ["\u869C", "\u869C"], /* CJK Ideograph */ + ["\u869D", "\u869D"], /* CJK Ideograph */ + ["\u869E", "\u869E"], /* CJK Ideograph */ + ["\u869F", "\u869F"], /* CJK Ideograph */ + ["\u86A0", "\u86A0"], /* CJK Ideograph */ + ["\u86A1", "\u86A1"], /* CJK Ideograph */ + ["\u86A2", "\u86A2"], /* CJK Ideograph */ + ["\u86A3", "\u86A3"], /* CJK Ideograph */ + ["\u86A4", "\u86A4"], /* CJK Ideograph */ + ["\u86A5", "\u86A5"], /* CJK Ideograph */ + ["\u86A6", "\u86A6"], /* CJK Ideograph */ + ["\u86A7", "\u86A7"], /* CJK Ideograph */ + ["\u86A8", "\u86A8"], /* CJK Ideograph */ + ["\u86A9", "\u86A9"], /* CJK Ideograph */ + ["\u86AA", "\u86AA"], /* CJK Ideograph */ + ["\u86AB", "\u86AB"], /* CJK Ideograph */ + ["\u86AC", "\u86AC"], /* CJK Ideograph */ + ["\u86AD", "\u86AD"], /* CJK Ideograph */ + ["\u86AE", "\u86AE"], /* CJK Ideograph */ + ["\u86AF", "\u86AF"], /* CJK Ideograph */ + ["\u86B0", "\u86B0"], /* CJK Ideograph */ + ["\u86B1", "\u86B1"], /* CJK Ideograph */ + ["\u86B2", "\u86B2"], /* CJK Ideograph */ + ["\u86B3", "\u86B3"], /* CJK Ideograph */ + ["\u86B4", "\u86B4"], /* CJK Ideograph */ + ["\u86B5", "\u86B5"], /* CJK Ideograph */ + ["\u86B6", "\u86B6"], /* CJK Ideograph */ + ["\u86B7", "\u86B7"], /* CJK Ideograph */ + ["\u86B8", "\u86B8"], /* CJK Ideograph */ + ["\u86B9", "\u86B9"], /* CJK Ideograph */ + ["\u86BA", "\u86BA"], /* CJK Ideograph */ + ["\u86BB", "\u86BB"], /* CJK Ideograph */ + ["\u86BC", "\u86BC"], /* CJK Ideograph */ + ["\u86BD", "\u86BD"], /* CJK Ideograph */ + ["\u86BE", "\u86BE"], /* CJK Ideograph */ + ["\u86BF", "\u86BF"], /* CJK Ideograph */ + ["\u86C0", "\u86C0"], /* CJK Ideograph */ + ["\u86C1", "\u86C1"], /* CJK Ideograph */ + ["\u86C2", "\u86C2"], /* CJK Ideograph */ + ["\u86C3", "\u86C3"], /* CJK Ideograph */ + ["\u86C4", "\u86C4"], /* CJK Ideograph */ + ["\u86C5", "\u86C5"], /* CJK Ideograph */ + ["\u86C6", "\u86C6"], /* CJK Ideograph */ + ["\u86C7", "\u86C7"], /* CJK Ideograph */ + ["\u86C8", "\u86C8"], /* CJK Ideograph */ + ["\u86C9", "\u86C9"], /* CJK Ideograph */ + ["\u86CA", "\u86CA"], /* CJK Ideograph */ + ["\u86CB", "\u86CB"], /* CJK Ideograph */ + ["\u86CC", "\u86CC"], /* CJK Ideograph */ + ["\u86CD", "\u86CD"], /* CJK Ideograph */ + ["\u86CE", "\u86CE"], /* CJK Ideograph */ + ["\u86CF", "\u86CF"], /* CJK Ideograph */ + ["\u86D0", "\u86D0"], /* CJK Ideograph */ + ["\u86D1", "\u86D1"], /* CJK Ideograph */ + ["\u86D2", "\u86D2"], /* CJK Ideograph */ + ["\u86D3", "\u86D3"], /* CJK Ideograph */ + ["\u86D4", "\u86D4"], /* CJK Ideograph */ + ["\u86D5", "\u86D5"], /* CJK Ideograph */ + ["\u86D6", "\u86D6"], /* CJK Ideograph */ + ["\u86D7", "\u86D7"], /* CJK Ideograph */ + ["\u86D8", "\u86D8"], /* CJK Ideograph */ + ["\u86D9", "\u86D9"], /* CJK Ideograph */ + ["\u86DA", "\u86DA"], /* CJK Ideograph */ + ["\u86DB", "\u86DB"], /* CJK Ideograph */ + ["\u86DC", "\u86DC"], /* CJK Ideograph */ + ["\u86DD", "\u86DD"], /* CJK Ideograph */ + ["\u86DE", "\u86DE"], /* CJK Ideograph */ + ["\u86DF", "\u86DF"], /* CJK Ideograph */ + ["\u86E0", "\u86E0"], /* CJK Ideograph */ + ["\u86E1", "\u86E1"], /* CJK Ideograph */ + ["\u86E2", "\u86E2"], /* CJK Ideograph */ + ["\u86E3", "\u86E3"], /* CJK Ideograph */ + ["\u86E4", "\u86E4"], /* CJK Ideograph */ + ["\u86E5", "\u86E5"], /* CJK Ideograph */ + ["\u86E6", "\u86E6"], /* CJK Ideograph */ + ["\u86E7", "\u86E7"], /* CJK Ideograph */ + ["\u86E8", "\u86E8"], /* CJK Ideograph */ + ["\u86E9", "\u86E9"], /* CJK Ideograph */ + ["\u86EA", "\u86EA"], /* CJK Ideograph */ + ["\u86EB", "\u86EB"], /* CJK Ideograph */ + ["\u86EC", "\u86EC"], /* CJK Ideograph */ + ["\u86ED", "\u86ED"], /* CJK Ideograph */ + ["\u86EE", "\u86EE"], /* CJK Ideograph */ + ["\u86EF", "\u86EF"], /* CJK Ideograph */ + ["\u86F0", "\u86F0"], /* CJK Ideograph */ + ["\u86F1", "\u86F1"], /* CJK Ideograph */ + ["\u86F2", "\u86F2"], /* CJK Ideograph */ + ["\u86F3", "\u86F3"], /* CJK Ideograph */ + ["\u86F4", "\u86F4"], /* CJK Ideograph */ + ["\u86F5", "\u86F5"], /* CJK Ideograph */ + ["\u86F6", "\u86F6"], /* CJK Ideograph */ + ["\u86F7", "\u86F7"], /* CJK Ideograph */ + ["\u86F8", "\u86F8"], /* CJK Ideograph */ + ["\u86F9", "\u86F9"], /* CJK Ideograph */ + ["\u86FA", "\u86FA"], /* CJK Ideograph */ + ["\u86FB", "\u86FB"], /* CJK Ideograph */ + ["\u86FC", "\u86FC"], /* CJK Ideograph */ + ["\u86FD", "\u86FD"], /* CJK Ideograph */ + ["\u86FE", "\u86FE"], /* CJK Ideograph */ + ["\u86FF", "\u86FF"], /* CJK Ideograph */ + ["\u8700", "\u8700"], /* CJK Ideograph */ + ["\u8701", "\u8701"], /* CJK Ideograph */ + ["\u8702", "\u8702"], /* CJK Ideograph */ + ["\u8703", "\u8703"], /* CJK Ideograph */ + ["\u8704", "\u8704"], /* CJK Ideograph */ + ["\u8705", "\u8705"], /* CJK Ideograph */ + ["\u8706", "\u8706"], /* CJK Ideograph */ + ["\u8707", "\u8707"], /* CJK Ideograph */ + ["\u8708", "\u8708"], /* CJK Ideograph */ + ["\u8709", "\u8709"], /* CJK Ideograph */ + ["\u870A", "\u870A"], /* CJK Ideograph */ + ["\u870B", "\u870B"], /* CJK Ideograph */ + ["\u870C", "\u870C"], /* CJK Ideograph */ + ["\u870D", "\u870D"], /* CJK Ideograph */ + ["\u870E", "\u870E"], /* CJK Ideograph */ + ["\u870F", "\u870F"], /* CJK Ideograph */ + ["\u8710", "\u8710"], /* CJK Ideograph */ + ["\u8711", "\u8711"], /* CJK Ideograph */ + ["\u8712", "\u8712"], /* CJK Ideograph */ + ["\u8713", "\u8713"], /* CJK Ideograph */ + ["\u8714", "\u8714"], /* CJK Ideograph */ + ["\u8715", "\u8715"], /* CJK Ideograph */ + ["\u8716", "\u8716"], /* CJK Ideograph */ + ["\u8717", "\u8717"], /* CJK Ideograph */ + ["\u8718", "\u8718"], /* CJK Ideograph */ + ["\u8719", "\u8719"], /* CJK Ideograph */ + ["\u871A", "\u871A"], /* CJK Ideograph */ + ["\u871B", "\u871B"], /* CJK Ideograph */ + ["\u871C", "\u871C"], /* CJK Ideograph */ + ["\u871D", "\u871D"], /* CJK Ideograph */ + ["\u871E", "\u871E"], /* CJK Ideograph */ + ["\u871F", "\u871F"], /* CJK Ideograph */ + ["\u8720", "\u8720"], /* CJK Ideograph */ + ["\u8721", "\u8721"], /* CJK Ideograph */ + ["\u8722", "\u8722"], /* CJK Ideograph */ + ["\u8723", "\u8723"], /* CJK Ideograph */ + ["\u8724", "\u8724"], /* CJK Ideograph */ + ["\u8725", "\u8725"], /* CJK Ideograph */ + ["\u8726", "\u8726"], /* CJK Ideograph */ + ["\u8727", "\u8727"], /* CJK Ideograph */ + ["\u8728", "\u8728"], /* CJK Ideograph */ + ["\u8729", "\u8729"], /* CJK Ideograph */ + ["\u872A", "\u872A"], /* CJK Ideograph */ + ["\u872B", "\u872B"], /* CJK Ideograph */ + ["\u872C", "\u872C"], /* CJK Ideograph */ + ["\u872D", "\u872D"], /* CJK Ideograph */ + ["\u872E", "\u872E"], /* CJK Ideograph */ + ["\u872F", "\u872F"], /* CJK Ideograph */ + ["\u8730", "\u8730"], /* CJK Ideograph */ + ["\u8731", "\u8731"], /* CJK Ideograph */ + ["\u8732", "\u8732"], /* CJK Ideograph */ + ["\u8733", "\u8733"], /* CJK Ideograph */ + ["\u8734", "\u8734"], /* CJK Ideograph */ + ["\u8735", "\u8735"], /* CJK Ideograph */ + ["\u8736", "\u8736"], /* CJK Ideograph */ + ["\u8737", "\u8737"], /* CJK Ideograph */ + ["\u8738", "\u8738"], /* CJK Ideograph */ + ["\u8739", "\u8739"], /* CJK Ideograph */ + ["\u873A", "\u873A"], /* CJK Ideograph */ + ["\u873B", "\u873B"], /* CJK Ideograph */ + ["\u873C", "\u873C"], /* CJK Ideograph */ + ["\u873D", "\u873D"], /* CJK Ideograph */ + ["\u873E", "\u873E"], /* CJK Ideograph */ + ["\u873F", "\u873F"], /* CJK Ideograph */ + ["\u8740", "\u8740"], /* CJK Ideograph */ + ["\u8741", "\u8741"], /* CJK Ideograph */ + ["\u8742", "\u8742"], /* CJK Ideograph */ + ["\u8743", "\u8743"], /* CJK Ideograph */ + ["\u8744", "\u8744"], /* CJK Ideograph */ + ["\u8745", "\u8745"], /* CJK Ideograph */ + ["\u8746", "\u8746"], /* CJK Ideograph */ + ["\u8747", "\u8747"], /* CJK Ideograph */ + ["\u8748", "\u8748"], /* CJK Ideograph */ + ["\u8749", "\u8749"], /* CJK Ideograph */ + ["\u874A", "\u874A"], /* CJK Ideograph */ + ["\u874B", "\u874B"], /* CJK Ideograph */ + ["\u874C", "\u874C"], /* CJK Ideograph */ + ["\u874D", "\u874D"], /* CJK Ideograph */ + ["\u874E", "\u874E"], /* CJK Ideograph */ + ["\u874F", "\u874F"], /* CJK Ideograph */ + ["\u8750", "\u8750"], /* CJK Ideograph */ + ["\u8751", "\u8751"], /* CJK Ideograph */ + ["\u8752", "\u8752"], /* CJK Ideograph */ + ["\u8753", "\u8753"], /* CJK Ideograph */ + ["\u8754", "\u8754"], /* CJK Ideograph */ + ["\u8755", "\u8755"], /* CJK Ideograph */ + ["\u8756", "\u8756"], /* CJK Ideograph */ + ["\u8757", "\u8757"], /* CJK Ideograph */ + ["\u8758", "\u8758"], /* CJK Ideograph */ + ["\u8759", "\u8759"], /* CJK Ideograph */ + ["\u875A", "\u875A"], /* CJK Ideograph */ + ["\u875B", "\u875B"], /* CJK Ideograph */ + ["\u875C", "\u875C"], /* CJK Ideograph */ + ["\u875D", "\u875D"], /* CJK Ideograph */ + ["\u875E", "\u875E"], /* CJK Ideograph */ + ["\u875F", "\u875F"], /* CJK Ideograph */ + ["\u8760", "\u8760"], /* CJK Ideograph */ + ["\u8761", "\u8761"], /* CJK Ideograph */ + ["\u8762", "\u8762"], /* CJK Ideograph */ + ["\u8763", "\u8763"], /* CJK Ideograph */ + ["\u8764", "\u8764"], /* CJK Ideograph */ + ["\u8765", "\u8765"], /* CJK Ideograph */ + ["\u8766", "\u8766"], /* CJK Ideograph */ + ["\u8767", "\u8767"], /* CJK Ideograph */ + ["\u8768", "\u8768"], /* CJK Ideograph */ + ["\u8769", "\u8769"], /* CJK Ideograph */ + ["\u876A", "\u876A"], /* CJK Ideograph */ + ["\u876B", "\u876B"], /* CJK Ideograph */ + ["\u876C", "\u876C"], /* CJK Ideograph */ + ["\u876D", "\u876D"], /* CJK Ideograph */ + ["\u876E", "\u876E"], /* CJK Ideograph */ + ["\u876F", "\u876F"], /* CJK Ideograph */ + ["\u8770", "\u8770"], /* CJK Ideograph */ + ["\u8771", "\u8771"], /* CJK Ideograph */ + ["\u8772", "\u8772"], /* CJK Ideograph */ + ["\u8773", "\u8773"], /* CJK Ideograph */ + ["\u8774", "\u8774"], /* CJK Ideograph */ + ["\u8775", "\u8775"], /* CJK Ideograph */ + ["\u8776", "\u8776"], /* CJK Ideograph */ + ["\u8777", "\u8777"], /* CJK Ideograph */ + ["\u8778", "\u8778"], /* CJK Ideograph */ + ["\u8779", "\u8779"], /* CJK Ideograph */ + ["\u877A", "\u877A"], /* CJK Ideograph */ + ["\u877B", "\u877B"], /* CJK Ideograph */ + ["\u877C", "\u877C"], /* CJK Ideograph */ + ["\u877D", "\u877D"], /* CJK Ideograph */ + ["\u877E", "\u877E"], /* CJK Ideograph */ + ["\u877F", "\u877F"], /* CJK Ideograph */ + ["\u8780", "\u8780"], /* CJK Ideograph */ + ["\u8781", "\u8781"], /* CJK Ideograph */ + ["\u8782", "\u8782"], /* CJK Ideograph */ + ["\u8783", "\u8783"], /* CJK Ideograph */ + ["\u8784", "\u8784"], /* CJK Ideograph */ + ["\u8785", "\u8785"], /* CJK Ideograph */ + ["\u8786", "\u8786"], /* CJK Ideograph */ + ["\u8787", "\u8787"], /* CJK Ideograph */ + ["\u8788", "\u8788"], /* CJK Ideograph */ + ["\u8789", "\u8789"], /* CJK Ideograph */ + ["\u878A", "\u878A"], /* CJK Ideograph */ + ["\u878B", "\u878B"], /* CJK Ideograph */ + ["\u878C", "\u878C"], /* CJK Ideograph */ + ["\u878D", "\u878D"], /* CJK Ideograph */ + ["\u878E", "\u878E"], /* CJK Ideograph */ + ["\u878F", "\u878F"], /* CJK Ideograph */ + ["\u8790", "\u8790"], /* CJK Ideograph */ + ["\u8791", "\u8791"], /* CJK Ideograph */ + ["\u8792", "\u8792"], /* CJK Ideograph */ + ["\u8793", "\u8793"], /* CJK Ideograph */ + ["\u8794", "\u8794"], /* CJK Ideograph */ + ["\u8795", "\u8795"], /* CJK Ideograph */ + ["\u8796", "\u8796"], /* CJK Ideograph */ + ["\u8797", "\u8797"], /* CJK Ideograph */ + ["\u8798", "\u8798"], /* CJK Ideograph */ + ["\u8799", "\u8799"], /* CJK Ideograph */ + ["\u879A", "\u879A"], /* CJK Ideograph */ + ["\u879B", "\u879B"], /* CJK Ideograph */ + ["\u879C", "\u879C"], /* CJK Ideograph */ + ["\u879D", "\u879D"], /* CJK Ideograph */ + ["\u879E", "\u879E"], /* CJK Ideograph */ + ["\u879F", "\u879F"], /* CJK Ideograph */ + ["\u87A0", "\u87A0"], /* CJK Ideograph */ + ["\u87A1", "\u87A1"], /* CJK Ideograph */ + ["\u87A2", "\u87A2"], /* CJK Ideograph */ + ["\u87A3", "\u87A3"], /* CJK Ideograph */ + ["\u87A4", "\u87A4"], /* CJK Ideograph */ + ["\u87A5", "\u87A5"], /* CJK Ideograph */ + ["\u87A6", "\u87A6"], /* CJK Ideograph */ + ["\u87A7", "\u87A7"], /* CJK Ideograph */ + ["\u87A8", "\u87A8"], /* CJK Ideograph */ + ["\u87A9", "\u87A9"], /* CJK Ideograph */ + ["\u87AA", "\u87AA"], /* CJK Ideograph */ + ["\u87AB", "\u87AB"], /* CJK Ideograph */ + ["\u87AC", "\u87AC"], /* CJK Ideograph */ + ["\u87AD", "\u87AD"], /* CJK Ideograph */ + ["\u87AE", "\u87AE"], /* CJK Ideograph */ + ["\u87AF", "\u87AF"], /* CJK Ideograph */ + ["\u87B0", "\u87B0"], /* CJK Ideograph */ + ["\u87B1", "\u87B1"], /* CJK Ideograph */ + ["\u87B2", "\u87B2"], /* CJK Ideograph */ + ["\u87B3", "\u87B3"], /* CJK Ideograph */ + ["\u87B4", "\u87B4"], /* CJK Ideograph */ + ["\u87B5", "\u87B5"], /* CJK Ideograph */ + ["\u87B6", "\u87B6"], /* CJK Ideograph */ + ["\u87B7", "\u87B7"], /* CJK Ideograph */ + ["\u87B8", "\u87B8"], /* CJK Ideograph */ + ["\u87B9", "\u87B9"], /* CJK Ideograph */ + ["\u87BA", "\u87BA"], /* CJK Ideograph */ + ["\u87BB", "\u87BB"], /* CJK Ideograph */ + ["\u87BC", "\u87BC"], /* CJK Ideograph */ + ["\u87BD", "\u87BD"], /* CJK Ideograph */ + ["\u87BE", "\u87BE"], /* CJK Ideograph */ + ["\u87BF", "\u87BF"], /* CJK Ideograph */ + ["\u87C0", "\u87C0"], /* CJK Ideograph */ + ["\u87C1", "\u87C1"], /* CJK Ideograph */ + ["\u87C2", "\u87C2"], /* CJK Ideograph */ + ["\u87C3", "\u87C3"], /* CJK Ideograph */ + ["\u87C4", "\u87C4"], /* CJK Ideograph */ + ["\u87C5", "\u87C5"], /* CJK Ideograph */ + ["\u87C6", "\u87C6"], /* CJK Ideograph */ + ["\u87C7", "\u87C7"], /* CJK Ideograph */ + ["\u87C8", "\u87C8"], /* CJK Ideograph */ + ["\u87C9", "\u87C9"], /* CJK Ideograph */ + ["\u87CA", "\u87CA"], /* CJK Ideograph */ + ["\u87CB", "\u87CB"], /* CJK Ideograph */ + ["\u87CC", "\u87CC"], /* CJK Ideograph */ + ["\u87CD", "\u87CD"], /* CJK Ideograph */ + ["\u87CE", "\u87CE"], /* CJK Ideograph */ + ["\u87CF", "\u87CF"], /* CJK Ideograph */ + ["\u87D0", "\u87D0"], /* CJK Ideograph */ + ["\u87D1", "\u87D1"], /* CJK Ideograph */ + ["\u87D2", "\u87D2"], /* CJK Ideograph */ + ["\u87D3", "\u87D3"], /* CJK Ideograph */ + ["\u87D4", "\u87D4"], /* CJK Ideograph */ + ["\u87D5", "\u87D5"], /* CJK Ideograph */ + ["\u87D6", "\u87D6"], /* CJK Ideograph */ + ["\u87D7", "\u87D7"], /* CJK Ideograph */ + ["\u87D8", "\u87D8"], /* CJK Ideograph */ + ["\u87D9", "\u87D9"], /* CJK Ideograph */ + ["\u87DA", "\u87DA"], /* CJK Ideograph */ + ["\u87DB", "\u87DB"], /* CJK Ideograph */ + ["\u87DC", "\u87DC"], /* CJK Ideograph */ + ["\u87DD", "\u87DD"], /* CJK Ideograph */ + ["\u87DE", "\u87DE"], /* CJK Ideograph */ + ["\u87DF", "\u87DF"], /* CJK Ideograph */ + ["\u87E0", "\u87E0"], /* CJK Ideograph */ + ["\u87E1", "\u87E1"], /* CJK Ideograph */ + ["\u87E2", "\u87E2"], /* CJK Ideograph */ + ["\u87E3", "\u87E3"], /* CJK Ideograph */ + ["\u87E4", "\u87E4"], /* CJK Ideograph */ + ["\u87E5", "\u87E5"], /* CJK Ideograph */ + ["\u87E6", "\u87E6"], /* CJK Ideograph */ + ["\u87E7", "\u87E7"], /* CJK Ideograph */ + ["\u87E8", "\u87E8"], /* CJK Ideograph */ + ["\u87E9", "\u87E9"], /* CJK Ideograph */ + ["\u87EA", "\u87EA"], /* CJK Ideograph */ + ["\u87EB", "\u87EB"], /* CJK Ideograph */ + ["\u87EC", "\u87EC"], /* CJK Ideograph */ + ["\u87ED", "\u87ED"], /* CJK Ideograph */ + ["\u87EE", "\u87EE"], /* CJK Ideograph */ + ["\u87EF", "\u87EF"], /* CJK Ideograph */ + ["\u87F0", "\u87F0"], /* CJK Ideograph */ + ["\u87F1", "\u87F1"], /* CJK Ideograph */ + ["\u87F2", "\u87F2"], /* CJK Ideograph */ + ["\u87F3", "\u87F3"], /* CJK Ideograph */ + ["\u87F4", "\u87F4"], /* CJK Ideograph */ + ["\u87F5", "\u87F5"], /* CJK Ideograph */ + ["\u87F6", "\u87F6"], /* CJK Ideograph */ + ["\u87F7", "\u87F7"], /* CJK Ideograph */ + ["\u87F8", "\u87F8"], /* CJK Ideograph */ + ["\u87F9", "\u87F9"], /* CJK Ideograph */ + ["\u87FA", "\u87FA"], /* CJK Ideograph */ + ["\u87FB", "\u87FB"], /* CJK Ideograph */ + ["\u87FC", "\u87FC"], /* CJK Ideograph */ + ["\u87FD", "\u87FD"], /* CJK Ideograph */ + ["\u87FE", "\u87FE"], /* CJK Ideograph */ + ["\u87FF", "\u87FF"], /* CJK Ideograph */ + ["\u8800", "\u8800"], /* CJK Ideograph */ + ["\u8801", "\u8801"], /* CJK Ideograph */ + ["\u8802", "\u8802"], /* CJK Ideograph */ + ["\u8803", "\u8803"], /* CJK Ideograph */ + ["\u8804", "\u8804"], /* CJK Ideograph */ + ["\u8805", "\u8805"], /* CJK Ideograph */ + ["\u8806", "\u8806"], /* CJK Ideograph */ + ["\u8807", "\u8807"], /* CJK Ideograph */ + ["\u8808", "\u8808"], /* CJK Ideograph */ + ["\u8809", "\u8809"], /* CJK Ideograph */ + ["\u880A", "\u880A"], /* CJK Ideograph */ + ["\u880B", "\u880B"], /* CJK Ideograph */ + ["\u880C", "\u880C"], /* CJK Ideograph */ + ["\u880D", "\u880D"], /* CJK Ideograph */ + ["\u880E", "\u880E"], /* CJK Ideograph */ + ["\u880F", "\u880F"], /* CJK Ideograph */ + ["\u8810", "\u8810"], /* CJK Ideograph */ + ["\u8811", "\u8811"], /* CJK Ideograph */ + ["\u8812", "\u8812"], /* CJK Ideograph */ + ["\u8813", "\u8813"], /* CJK Ideograph */ + ["\u8814", "\u8814"], /* CJK Ideograph */ + ["\u8815", "\u8815"], /* CJK Ideograph */ + ["\u8816", "\u8816"], /* CJK Ideograph */ + ["\u8817", "\u8817"], /* CJK Ideograph */ + ["\u8818", "\u8818"], /* CJK Ideograph */ + ["\u8819", "\u8819"], /* CJK Ideograph */ + ["\u881A", "\u881A"], /* CJK Ideograph */ + ["\u881B", "\u881B"], /* CJK Ideograph */ + ["\u881C", "\u881C"], /* CJK Ideograph */ + ["\u881D", "\u881D"], /* CJK Ideograph */ + ["\u881E", "\u881E"], /* CJK Ideograph */ + ["\u881F", "\u881F"], /* CJK Ideograph */ + ["\u8820", "\u8820"], /* CJK Ideograph */ + ["\u8821", "\u8821"], /* CJK Ideograph */ + ["\u8822", "\u8822"], /* CJK Ideograph */ + ["\u8823", "\u8823"], /* CJK Ideograph */ + ["\u8824", "\u8824"], /* CJK Ideograph */ + ["\u8825", "\u8825"], /* CJK Ideograph */ + ["\u8826", "\u8826"], /* CJK Ideograph */ + ["\u8827", "\u8827"], /* CJK Ideograph */ + ["\u8828", "\u8828"], /* CJK Ideograph */ + ["\u8829", "\u8829"], /* CJK Ideograph */ + ["\u882A", "\u882A"], /* CJK Ideograph */ + ["\u882B", "\u882B"], /* CJK Ideograph */ + ["\u882C", "\u882C"], /* CJK Ideograph */ + ["\u882D", "\u882D"], /* CJK Ideograph */ + ["\u882E", "\u882E"], /* CJK Ideograph */ + ["\u882F", "\u882F"], /* CJK Ideograph */ + ["\u8830", "\u8830"], /* CJK Ideograph */ + ["\u8831", "\u8831"], /* CJK Ideograph */ + ["\u8832", "\u8832"], /* CJK Ideograph */ + ["\u8833", "\u8833"], /* CJK Ideograph */ + ["\u8834", "\u8834"], /* CJK Ideograph */ + ["\u8835", "\u8835"], /* CJK Ideograph */ + ["\u8836", "\u8836"], /* CJK Ideograph */ + ["\u8837", "\u8837"], /* CJK Ideograph */ + ["\u8838", "\u8838"], /* CJK Ideograph */ + ["\u8839", "\u8839"], /* CJK Ideograph */ + ["\u883A", "\u883A"], /* CJK Ideograph */ + ["\u883B", "\u883B"], /* CJK Ideograph */ + ["\u883C", "\u883C"], /* CJK Ideograph */ + ["\u883D", "\u883D"], /* CJK Ideograph */ + ["\u883E", "\u883E"], /* CJK Ideograph */ + ["\u883F", "\u883F"], /* CJK Ideograph */ + ["\u8840", "\u8840"], /* CJK Ideograph */ + ["\u8841", "\u8841"], /* CJK Ideograph */ + ["\u8842", "\u8842"], /* CJK Ideograph */ + ["\u8843", "\u8843"], /* CJK Ideograph */ + ["\u8844", "\u8844"], /* CJK Ideograph */ + ["\u8845", "\u8845"], /* CJK Ideograph */ + ["\u8846", "\u8846"], /* CJK Ideograph */ + ["\u8847", "\u8847"], /* CJK Ideograph */ + ["\u8848", "\u8848"], /* CJK Ideograph */ + ["\u8849", "\u8849"], /* CJK Ideograph */ + ["\u884A", "\u884A"], /* CJK Ideograph */ + ["\u884B", "\u884B"], /* CJK Ideograph */ + ["\u884C", "\u884C"], /* CJK Ideograph */ + ["\u884D", "\u884D"], /* CJK Ideograph */ + ["\u884E", "\u884E"], /* CJK Ideograph */ + ["\u884F", "\u884F"], /* CJK Ideograph */ + ["\u8850", "\u8850"], /* CJK Ideograph */ + ["\u8851", "\u8851"], /* CJK Ideograph */ + ["\u8852", "\u8852"], /* CJK Ideograph */ + ["\u8853", "\u8853"], /* CJK Ideograph */ + ["\u8854", "\u8854"], /* CJK Ideograph */ + ["\u8855", "\u8855"], /* CJK Ideograph */ + ["\u8856", "\u8856"], /* CJK Ideograph */ + ["\u8857", "\u8857"], /* CJK Ideograph */ + ["\u8858", "\u8858"], /* CJK Ideograph */ + ["\u8859", "\u8859"], /* CJK Ideograph */ + ["\u885A", "\u885A"], /* CJK Ideograph */ + ["\u885B", "\u885B"], /* CJK Ideograph */ + ["\u885C", "\u885C"], /* CJK Ideograph */ + ["\u885D", "\u885D"], /* CJK Ideograph */ + ["\u885E", "\u885E"], /* CJK Ideograph */ + ["\u885F", "\u885F"], /* CJK Ideograph */ + ["\u8860", "\u8860"], /* CJK Ideograph */ + ["\u8861", "\u8861"], /* CJK Ideograph */ + ["\u8862", "\u8862"], /* CJK Ideograph */ + ["\u8863", "\u8863"], /* CJK Ideograph */ + ["\u8864", "\u8864"], /* CJK Ideograph */ + ["\u8865", "\u8865"], /* CJK Ideograph */ + ["\u8866", "\u8866"], /* CJK Ideograph */ + ["\u8867", "\u8867"], /* CJK Ideograph */ + ["\u8868", "\u8868"], /* CJK Ideograph */ + ["\u8869", "\u8869"], /* CJK Ideograph */ + ["\u886A", "\u886A"], /* CJK Ideograph */ + ["\u886B", "\u886B"], /* CJK Ideograph */ + ["\u886C", "\u886C"], /* CJK Ideograph */ + ["\u886D", "\u886D"], /* CJK Ideograph */ + ["\u886E", "\u886E"], /* CJK Ideograph */ + ["\u886F", "\u886F"], /* CJK Ideograph */ + ["\u8870", "\u8870"], /* CJK Ideograph */ + ["\u8871", "\u8871"], /* CJK Ideograph */ + ["\u8872", "\u8872"], /* CJK Ideograph */ + ["\u8873", "\u8873"], /* CJK Ideograph */ + ["\u8874", "\u8874"], /* CJK Ideograph */ + ["\u8875", "\u8875"], /* CJK Ideograph */ + ["\u8876", "\u8876"], /* CJK Ideograph */ + ["\u8877", "\u8877"], /* CJK Ideograph */ + ["\u8878", "\u8878"], /* CJK Ideograph */ + ["\u8879", "\u8879"], /* CJK Ideograph */ + ["\u887A", "\u887A"], /* CJK Ideograph */ + ["\u887B", "\u887B"], /* CJK Ideograph */ + ["\u887C", "\u887C"], /* CJK Ideograph */ + ["\u887D", "\u887D"], /* CJK Ideograph */ + ["\u887E", "\u887E"], /* CJK Ideograph */ + ["\u887F", "\u887F"], /* CJK Ideograph */ + ["\u8880", "\u8880"], /* CJK Ideograph */ + ["\u8881", "\u8881"], /* CJK Ideograph */ + ["\u8882", "\u8882"], /* CJK Ideograph */ + ["\u8883", "\u8883"], /* CJK Ideograph */ + ["\u8884", "\u8884"], /* CJK Ideograph */ + ["\u8885", "\u8885"], /* CJK Ideograph */ + ["\u8886", "\u8886"], /* CJK Ideograph */ + ["\u8887", "\u8887"], /* CJK Ideograph */ + ["\u8888", "\u8888"], /* CJK Ideograph */ + ["\u8889", "\u8889"], /* CJK Ideograph */ + ["\u888A", "\u888A"], /* CJK Ideograph */ + ["\u888B", "\u888B"], /* CJK Ideograph */ + ["\u888C", "\u888C"], /* CJK Ideograph */ + ["\u888D", "\u888D"], /* CJK Ideograph */ + ["\u888E", "\u888E"], /* CJK Ideograph */ + ["\u888F", "\u888F"], /* CJK Ideograph */ + ["\u8890", "\u8890"], /* CJK Ideograph */ + ["\u8891", "\u8891"], /* CJK Ideograph */ + ["\u8892", "\u8892"], /* CJK Ideograph */ + ["\u8893", "\u8893"], /* CJK Ideograph */ + ["\u8894", "\u8894"], /* CJK Ideograph */ + ["\u8895", "\u8895"], /* CJK Ideograph */ + ["\u8896", "\u8896"], /* CJK Ideograph */ + ["\u8897", "\u8897"], /* CJK Ideograph */ + ["\u8898", "\u8898"], /* CJK Ideograph */ + ["\u8899", "\u8899"], /* CJK Ideograph */ + ["\u889A", "\u889A"], /* CJK Ideograph */ + ["\u889B", "\u889B"], /* CJK Ideograph */ + ["\u889C", "\u889C"], /* CJK Ideograph */ + ["\u889D", "\u889D"], /* CJK Ideograph */ + ["\u889E", "\u889E"], /* CJK Ideograph */ + ["\u889F", "\u889F"], /* CJK Ideograph */ + ["\u88A0", "\u88A0"], /* CJK Ideograph */ + ["\u88A1", "\u88A1"], /* CJK Ideograph */ + ["\u88A2", "\u88A2"], /* CJK Ideograph */ + ["\u88A3", "\u88A3"], /* CJK Ideograph */ + ["\u88A4", "\u88A4"], /* CJK Ideograph */ + ["\u88A5", "\u88A5"], /* CJK Ideograph */ + ["\u88A6", "\u88A6"], /* CJK Ideograph */ + ["\u88A7", "\u88A7"], /* CJK Ideograph */ + ["\u88A8", "\u88A8"], /* CJK Ideograph */ + ["\u88A9", "\u88A9"], /* CJK Ideograph */ + ["\u88AA", "\u88AA"], /* CJK Ideograph */ + ["\u88AB", "\u88AB"], /* CJK Ideograph */ + ["\u88AC", "\u88AC"], /* CJK Ideograph */ + ["\u88AD", "\u88AD"], /* CJK Ideograph */ + ["\u88AE", "\u88AE"], /* CJK Ideograph */ + ["\u88AF", "\u88AF"], /* CJK Ideograph */ + ["\u88B0", "\u88B0"], /* CJK Ideograph */ + ["\u88B1", "\u88B1"], /* CJK Ideograph */ + ["\u88B2", "\u88B2"], /* CJK Ideograph */ + ["\u88B3", "\u88B3"], /* CJK Ideograph */ + ["\u88B4", "\u88B4"], /* CJK Ideograph */ + ["\u88B5", "\u88B5"], /* CJK Ideograph */ + ["\u88B6", "\u88B6"], /* CJK Ideograph */ + ["\u88B7", "\u88B7"], /* CJK Ideograph */ + ["\u88B8", "\u88B8"], /* CJK Ideograph */ + ["\u88B9", "\u88B9"], /* CJK Ideograph */ + ["\u88BA", "\u88BA"], /* CJK Ideograph */ + ["\u88BB", "\u88BB"], /* CJK Ideograph */ + ["\u88BC", "\u88BC"], /* CJK Ideograph */ + ["\u88BD", "\u88BD"], /* CJK Ideograph */ + ["\u88BE", "\u88BE"], /* CJK Ideograph */ + ["\u88BF", "\u88BF"], /* CJK Ideograph */ + ["\u88C0", "\u88C0"], /* CJK Ideograph */ + ["\u88C1", "\u88C1"], /* CJK Ideograph */ + ["\u88C2", "\u88C2"], /* CJK Ideograph */ + ["\u88C3", "\u88C3"], /* CJK Ideograph */ + ["\u88C4", "\u88C4"], /* CJK Ideograph */ + ["\u88C5", "\u88C5"], /* CJK Ideograph */ + ["\u88C6", "\u88C6"], /* CJK Ideograph */ + ["\u88C7", "\u88C7"], /* CJK Ideograph */ + ["\u88C8", "\u88C8"], /* CJK Ideograph */ + ["\u88C9", "\u88C9"], /* CJK Ideograph */ + ["\u88CA", "\u88CA"], /* CJK Ideograph */ + ["\u88CB", "\u88CB"], /* CJK Ideograph */ + ["\u88CC", "\u88CC"], /* CJK Ideograph */ + ["\u88CD", "\u88CD"], /* CJK Ideograph */ + ["\u88CE", "\u88CE"], /* CJK Ideograph */ + ["\u88CF", "\u88CF"], /* CJK Ideograph */ + ["\u88D0", "\u88D0"], /* CJK Ideograph */ + ["\u88D1", "\u88D1"], /* CJK Ideograph */ + ["\u88D2", "\u88D2"], /* CJK Ideograph */ + ["\u88D3", "\u88D3"], /* CJK Ideograph */ + ["\u88D4", "\u88D4"], /* CJK Ideograph */ + ["\u88D5", "\u88D5"], /* CJK Ideograph */ + ["\u88D6", "\u88D6"], /* CJK Ideograph */ + ["\u88D7", "\u88D7"], /* CJK Ideograph */ + ["\u88D8", "\u88D8"], /* CJK Ideograph */ + ["\u88D9", "\u88D9"], /* CJK Ideograph */ + ["\u88DA", "\u88DA"], /* CJK Ideograph */ + ["\u88DB", "\u88DB"], /* CJK Ideograph */ + ["\u88DC", "\u88DC"], /* CJK Ideograph */ + ["\u88DD", "\u88DD"], /* CJK Ideograph */ + ["\u88DE", "\u88DE"], /* CJK Ideograph */ + ["\u88DF", "\u88DF"], /* CJK Ideograph */ + ["\u88E0", "\u88E0"], /* CJK Ideograph */ + ["\u88E1", "\u88E1"], /* CJK Ideograph */ + ["\u88E2", "\u88E2"], /* CJK Ideograph */ + ["\u88E3", "\u88E3"], /* CJK Ideograph */ + ["\u88E4", "\u88E4"], /* CJK Ideograph */ + ["\u88E5", "\u88E5"], /* CJK Ideograph */ + ["\u88E6", "\u88E6"], /* CJK Ideograph */ + ["\u88E7", "\u88E7"], /* CJK Ideograph */ + ["\u88E8", "\u88E8"], /* CJK Ideograph */ + ["\u88E9", "\u88E9"], /* CJK Ideograph */ + ["\u88EA", "\u88EA"], /* CJK Ideograph */ + ["\u88EB", "\u88EB"], /* CJK Ideograph */ + ["\u88EC", "\u88EC"], /* CJK Ideograph */ + ["\u88ED", "\u88ED"], /* CJK Ideograph */ + ["\u88EE", "\u88EE"], /* CJK Ideograph */ + ["\u88EF", "\u88EF"], /* CJK Ideograph */ + ["\u88F0", "\u88F0"], /* CJK Ideograph */ + ["\u88F1", "\u88F1"], /* CJK Ideograph */ + ["\u88F2", "\u88F2"], /* CJK Ideograph */ + ["\u88F3", "\u88F3"], /* CJK Ideograph */ + ["\u88F4", "\u88F4"], /* CJK Ideograph */ + ["\u88F5", "\u88F5"], /* CJK Ideograph */ + ["\u88F6", "\u88F6"], /* CJK Ideograph */ + ["\u88F7", "\u88F7"], /* CJK Ideograph */ + ["\u88F8", "\u88F8"], /* CJK Ideograph */ + ["\u88F9", "\u88F9"], /* CJK Ideograph */ + ["\u88FA", "\u88FA"], /* CJK Ideograph */ + ["\u88FB", "\u88FB"], /* CJK Ideograph */ + ["\u88FC", "\u88FC"], /* CJK Ideograph */ + ["\u88FD", "\u88FD"], /* CJK Ideograph */ + ["\u88FE", "\u88FE"], /* CJK Ideograph */ + ["\u88FF", "\u88FF"], /* CJK Ideograph */ + ["\u8900", "\u8900"], /* CJK Ideograph */ + ["\u8901", "\u8901"], /* CJK Ideograph */ + ["\u8902", "\u8902"], /* CJK Ideograph */ + ["\u8903", "\u8903"], /* CJK Ideograph */ + ["\u8904", "\u8904"], /* CJK Ideograph */ + ["\u8905", "\u8905"], /* CJK Ideograph */ + ["\u8906", "\u8906"], /* CJK Ideograph */ + ["\u8907", "\u8907"], /* CJK Ideograph */ + ["\u8908", "\u8908"], /* CJK Ideograph */ + ["\u8909", "\u8909"], /* CJK Ideograph */ + ["\u890A", "\u890A"], /* CJK Ideograph */ + ["\u890B", "\u890B"], /* CJK Ideograph */ + ["\u890C", "\u890C"], /* CJK Ideograph */ + ["\u890D", "\u890D"], /* CJK Ideograph */ + ["\u890E", "\u890E"], /* CJK Ideograph */ + ["\u890F", "\u890F"], /* CJK Ideograph */ + ["\u8910", "\u8910"], /* CJK Ideograph */ + ["\u8911", "\u8911"], /* CJK Ideograph */ + ["\u8912", "\u8912"], /* CJK Ideograph */ + ["\u8913", "\u8913"], /* CJK Ideograph */ + ["\u8914", "\u8914"], /* CJK Ideograph */ + ["\u8915", "\u8915"], /* CJK Ideograph */ + ["\u8916", "\u8916"], /* CJK Ideograph */ + ["\u8917", "\u8917"], /* CJK Ideograph */ + ["\u8918", "\u8918"], /* CJK Ideograph */ + ["\u8919", "\u8919"], /* CJK Ideograph */ + ["\u891A", "\u891A"], /* CJK Ideograph */ + ["\u891B", "\u891B"], /* CJK Ideograph */ + ["\u891C", "\u891C"], /* CJK Ideograph */ + ["\u891D", "\u891D"], /* CJK Ideograph */ + ["\u891E", "\u891E"], /* CJK Ideograph */ + ["\u891F", "\u891F"], /* CJK Ideograph */ + ["\u8920", "\u8920"], /* CJK Ideograph */ + ["\u8921", "\u8921"], /* CJK Ideograph */ + ["\u8922", "\u8922"], /* CJK Ideograph */ + ["\u8923", "\u8923"], /* CJK Ideograph */ + ["\u8924", "\u8924"], /* CJK Ideograph */ + ["\u8925", "\u8925"], /* CJK Ideograph */ + ["\u8926", "\u8926"], /* CJK Ideograph */ + ["\u8927", "\u8927"], /* CJK Ideograph */ + ["\u8928", "\u8928"], /* CJK Ideograph */ + ["\u8929", "\u8929"], /* CJK Ideograph */ + ["\u892A", "\u892A"], /* CJK Ideograph */ + ["\u892B", "\u892B"], /* CJK Ideograph */ + ["\u892C", "\u892C"], /* CJK Ideograph */ + ["\u892D", "\u892D"], /* CJK Ideograph */ + ["\u892E", "\u892E"], /* CJK Ideograph */ + ["\u892F", "\u892F"], /* CJK Ideograph */ + ["\u8930", "\u8930"], /* CJK Ideograph */ + ["\u8931", "\u8931"], /* CJK Ideograph */ + ["\u8932", "\u8932"], /* CJK Ideograph */ + ["\u8933", "\u8933"], /* CJK Ideograph */ + ["\u8934", "\u8934"], /* CJK Ideograph */ + ["\u8935", "\u8935"], /* CJK Ideograph */ + ["\u8936", "\u8936"], /* CJK Ideograph */ + ["\u8937", "\u8937"], /* CJK Ideograph */ + ["\u8938", "\u8938"], /* CJK Ideograph */ + ["\u8939", "\u8939"], /* CJK Ideograph */ + ["\u893A", "\u893A"], /* CJK Ideograph */ + ["\u893B", "\u893B"], /* CJK Ideograph */ + ["\u893C", "\u893C"], /* CJK Ideograph */ + ["\u893D", "\u893D"], /* CJK Ideograph */ + ["\u893E", "\u893E"], /* CJK Ideograph */ + ["\u893F", "\u893F"], /* CJK Ideograph */ + ["\u8940", "\u8940"], /* CJK Ideograph */ + ["\u8941", "\u8941"], /* CJK Ideograph */ + ["\u8942", "\u8942"], /* CJK Ideograph */ + ["\u8943", "\u8943"], /* CJK Ideograph */ + ["\u8944", "\u8944"], /* CJK Ideograph */ + ["\u8945", "\u8945"], /* CJK Ideograph */ + ["\u8946", "\u8946"], /* CJK Ideograph */ + ["\u8947", "\u8947"], /* CJK Ideograph */ + ["\u8948", "\u8948"], /* CJK Ideograph */ + ["\u8949", "\u8949"], /* CJK Ideograph */ + ["\u894A", "\u894A"], /* CJK Ideograph */ + ["\u894B", "\u894B"], /* CJK Ideograph */ + ["\u894C", "\u894C"], /* CJK Ideograph */ + ["\u894D", "\u894D"], /* CJK Ideograph */ + ["\u894E", "\u894E"], /* CJK Ideograph */ + ["\u894F", "\u894F"], /* CJK Ideograph */ + ["\u8950", "\u8950"], /* CJK Ideograph */ + ["\u8951", "\u8951"], /* CJK Ideograph */ + ["\u8952", "\u8952"], /* CJK Ideograph */ + ["\u8953", "\u8953"], /* CJK Ideograph */ + ["\u8954", "\u8954"], /* CJK Ideograph */ + ["\u8955", "\u8955"], /* CJK Ideograph */ + ["\u8956", "\u8956"], /* CJK Ideograph */ + ["\u8957", "\u8957"], /* CJK Ideograph */ + ["\u8958", "\u8958"], /* CJK Ideograph */ + ["\u8959", "\u8959"], /* CJK Ideograph */ + ["\u895A", "\u895A"], /* CJK Ideograph */ + ["\u895B", "\u895B"], /* CJK Ideograph */ + ["\u895C", "\u895C"], /* CJK Ideograph */ + ["\u895D", "\u895D"], /* CJK Ideograph */ + ["\u895E", "\u895E"], /* CJK Ideograph */ + ["\u895F", "\u895F"], /* CJK Ideograph */ + ["\u8960", "\u8960"], /* CJK Ideograph */ + ["\u8961", "\u8961"], /* CJK Ideograph */ + ["\u8962", "\u8962"], /* CJK Ideograph */ + ["\u8963", "\u8963"], /* CJK Ideograph */ + ["\u8964", "\u8964"], /* CJK Ideograph */ + ["\u8965", "\u8965"], /* CJK Ideograph */ + ["\u8966", "\u8966"], /* CJK Ideograph */ + ["\u8967", "\u8967"], /* CJK Ideograph */ + ["\u8968", "\u8968"], /* CJK Ideograph */ + ["\u8969", "\u8969"], /* CJK Ideograph */ + ["\u896A", "\u896A"], /* CJK Ideograph */ + ["\u896B", "\u896B"], /* CJK Ideograph */ + ["\u896C", "\u896C"], /* CJK Ideograph */ + ["\u896D", "\u896D"], /* CJK Ideograph */ + ["\u896E", "\u896E"], /* CJK Ideograph */ + ["\u896F", "\u896F"], /* CJK Ideograph */ + ["\u8970", "\u8970"], /* CJK Ideograph */ + ["\u8971", "\u8971"], /* CJK Ideograph */ + ["\u8972", "\u8972"], /* CJK Ideograph */ + ["\u8973", "\u8973"], /* CJK Ideograph */ + ["\u8974", "\u8974"], /* CJK Ideograph */ + ["\u8975", "\u8975"], /* CJK Ideograph */ + ["\u8976", "\u8976"], /* CJK Ideograph */ + ["\u8977", "\u8977"], /* CJK Ideograph */ + ["\u8978", "\u8978"], /* CJK Ideograph */ + ["\u8979", "\u8979"], /* CJK Ideograph */ + ["\u897A", "\u897A"], /* CJK Ideograph */ + ["\u897B", "\u897B"], /* CJK Ideograph */ + ["\u897C", "\u897C"], /* CJK Ideograph */ + ["\u897D", "\u897D"], /* CJK Ideograph */ + ["\u897E", "\u897E"], /* CJK Ideograph */ + ["\u897F", "\u897F"], /* CJK Ideograph */ + ["\u8980", "\u8980"], /* CJK Ideograph */ + ["\u8981", "\u8981"], /* CJK Ideograph */ + ["\u8982", "\u8982"], /* CJK Ideograph */ + ["\u8983", "\u8983"], /* CJK Ideograph */ + ["\u8984", "\u8984"], /* CJK Ideograph */ + ["\u8985", "\u8985"], /* CJK Ideograph */ + ["\u8986", "\u8986"], /* CJK Ideograph */ + ["\u8987", "\u8987"], /* CJK Ideograph */ + ["\u8988", "\u8988"], /* CJK Ideograph */ + ["\u8989", "\u8989"], /* CJK Ideograph */ + ["\u898A", "\u898A"], /* CJK Ideograph */ + ["\u898B", "\u898B"], /* CJK Ideograph */ + ["\u898C", "\u898C"], /* CJK Ideograph */ + ["\u898D", "\u898D"], /* CJK Ideograph */ + ["\u898E", "\u898E"], /* CJK Ideograph */ + ["\u898F", "\u898F"], /* CJK Ideograph */ + ["\u8990", "\u8990"], /* CJK Ideograph */ + ["\u8991", "\u8991"], /* CJK Ideograph */ + ["\u8992", "\u8992"], /* CJK Ideograph */ + ["\u8993", "\u8993"], /* CJK Ideograph */ + ["\u8994", "\u8994"], /* CJK Ideograph */ + ["\u8995", "\u8995"], /* CJK Ideograph */ + ["\u8996", "\u8996"], /* CJK Ideograph */ + ["\u8997", "\u8997"], /* CJK Ideograph */ + ["\u8998", "\u8998"], /* CJK Ideograph */ + ["\u8999", "\u8999"], /* CJK Ideograph */ + ["\u899A", "\u899A"], /* CJK Ideograph */ + ["\u899B", "\u899B"], /* CJK Ideograph */ + ["\u899C", "\u899C"], /* CJK Ideograph */ + ["\u899D", "\u899D"], /* CJK Ideograph */ + ["\u899E", "\u899E"], /* CJK Ideograph */ + ["\u899F", "\u899F"], /* CJK Ideograph */ + ["\u89A0", "\u89A0"], /* CJK Ideograph */ + ["\u89A1", "\u89A1"], /* CJK Ideograph */ + ["\u89A2", "\u89A2"], /* CJK Ideograph */ + ["\u89A3", "\u89A3"], /* CJK Ideograph */ + ["\u89A4", "\u89A4"], /* CJK Ideograph */ + ["\u89A5", "\u89A5"], /* CJK Ideograph */ + ["\u89A6", "\u89A6"], /* CJK Ideograph */ + ["\u89A7", "\u89A7"], /* CJK Ideograph */ + ["\u89A8", "\u89A8"], /* CJK Ideograph */ + ["\u89A9", "\u89A9"], /* CJK Ideograph */ + ["\u89AA", "\u89AA"], /* CJK Ideograph */ + ["\u89AB", "\u89AB"], /* CJK Ideograph */ + ["\u89AC", "\u89AC"], /* CJK Ideograph */ + ["\u89AD", "\u89AD"], /* CJK Ideograph */ + ["\u89AE", "\u89AE"], /* CJK Ideograph */ + ["\u89AF", "\u89AF"], /* CJK Ideograph */ + ["\u89B0", "\u89B0"], /* CJK Ideograph */ + ["\u89B1", "\u89B1"], /* CJK Ideograph */ + ["\u89B2", "\u89B2"], /* CJK Ideograph */ + ["\u89B3", "\u89B3"], /* CJK Ideograph */ + ["\u89B4", "\u89B4"], /* CJK Ideograph */ + ["\u89B5", "\u89B5"], /* CJK Ideograph */ + ["\u89B6", "\u89B6"], /* CJK Ideograph */ + ["\u89B7", "\u89B7"], /* CJK Ideograph */ + ["\u89B8", "\u89B8"], /* CJK Ideograph */ + ["\u89B9", "\u89B9"], /* CJK Ideograph */ + ["\u89BA", "\u89BA"], /* CJK Ideograph */ + ["\u89BB", "\u89BB"], /* CJK Ideograph */ + ["\u89BC", "\u89BC"], /* CJK Ideograph */ + ["\u89BD", "\u89BD"], /* CJK Ideograph */ + ["\u89BE", "\u89BE"], /* CJK Ideograph */ + ["\u89BF", "\u89BF"], /* CJK Ideograph */ + ["\u89C0", "\u89C0"], /* CJK Ideograph */ + ["\u89C1", "\u89C1"], /* CJK Ideograph */ + ["\u89C2", "\u89C2"], /* CJK Ideograph */ + ["\u89C3", "\u89C3"], /* CJK Ideograph */ + ["\u89C4", "\u89C4"], /* CJK Ideograph */ + ["\u89C5", "\u89C5"], /* CJK Ideograph */ + ["\u89C6", "\u89C6"], /* CJK Ideograph */ + ["\u89C7", "\u89C7"], /* CJK Ideograph */ + ["\u89C8", "\u89C8"], /* CJK Ideograph */ + ["\u89C9", "\u89C9"], /* CJK Ideograph */ + ["\u89CA", "\u89CA"], /* CJK Ideograph */ + ["\u89CB", "\u89CB"], /* CJK Ideograph */ + ["\u89CC", "\u89CC"], /* CJK Ideograph */ + ["\u89CD", "\u89CD"], /* CJK Ideograph */ + ["\u89CE", "\u89CE"], /* CJK Ideograph */ + ["\u89CF", "\u89CF"], /* CJK Ideograph */ + ["\u89D0", "\u89D0"], /* CJK Ideograph */ + ["\u89D1", "\u89D1"], /* CJK Ideograph */ + ["\u89D2", "\u89D2"], /* CJK Ideograph */ + ["\u89D3", "\u89D3"], /* CJK Ideograph */ + ["\u89D4", "\u89D4"], /* CJK Ideograph */ + ["\u89D5", "\u89D5"], /* CJK Ideograph */ + ["\u89D6", "\u89D6"], /* CJK Ideograph */ + ["\u89D7", "\u89D7"], /* CJK Ideograph */ + ["\u89D8", "\u89D8"], /* CJK Ideograph */ + ["\u89D9", "\u89D9"], /* CJK Ideograph */ + ["\u89DA", "\u89DA"], /* CJK Ideograph */ + ["\u89DB", "\u89DB"], /* CJK Ideograph */ + ["\u89DC", "\u89DC"], /* CJK Ideograph */ + ["\u89DD", "\u89DD"], /* CJK Ideograph */ + ["\u89DE", "\u89DE"], /* CJK Ideograph */ + ["\u89DF", "\u89DF"], /* CJK Ideograph */ + ["\u89E0", "\u89E0"], /* CJK Ideograph */ + ["\u89E1", "\u89E1"], /* CJK Ideograph */ + ["\u89E2", "\u89E2"], /* CJK Ideograph */ + ["\u89E3", "\u89E3"], /* CJK Ideograph */ + ["\u89E4", "\u89E4"], /* CJK Ideograph */ + ["\u89E5", "\u89E5"], /* CJK Ideograph */ + ["\u89E6", "\u89E6"], /* CJK Ideograph */ + ["\u89E7", "\u89E7"], /* CJK Ideograph */ + ["\u89E8", "\u89E8"], /* CJK Ideograph */ + ["\u89E9", "\u89E9"], /* CJK Ideograph */ + ["\u89EA", "\u89EA"], /* CJK Ideograph */ + ["\u89EB", "\u89EB"], /* CJK Ideograph */ + ["\u89EC", "\u89EC"], /* CJK Ideograph */ + ["\u89ED", "\u89ED"], /* CJK Ideograph */ + ["\u89EE", "\u89EE"], /* CJK Ideograph */ + ["\u89EF", "\u89EF"], /* CJK Ideograph */ + ["\u89F0", "\u89F0"], /* CJK Ideograph */ + ["\u89F1", "\u89F1"], /* CJK Ideograph */ + ["\u89F2", "\u89F2"], /* CJK Ideograph */ + ["\u89F3", "\u89F3"], /* CJK Ideograph */ + ["\u89F4", "\u89F4"], /* CJK Ideograph */ + ["\u89F5", "\u89F5"], /* CJK Ideograph */ + ["\u89F6", "\u89F6"], /* CJK Ideograph */ + ["\u89F7", "\u89F7"], /* CJK Ideograph */ + ["\u89F8", "\u89F8"], /* CJK Ideograph */ + ["\u89F9", "\u89F9"], /* CJK Ideograph */ + ["\u89FA", "\u89FA"], /* CJK Ideograph */ + ["\u89FB", "\u89FB"], /* CJK Ideograph */ + ["\u89FC", "\u89FC"], /* CJK Ideograph */ + ["\u89FD", "\u89FD"], /* CJK Ideograph */ + ["\u89FE", "\u89FE"], /* CJK Ideograph */ + ["\u89FF", "\u89FF"], /* CJK Ideograph */ + ["\u8A00", "\u8A00"], /* CJK Ideograph */ + ["\u8A01", "\u8A01"], /* CJK Ideograph */ + ["\u8A02", "\u8A02"], /* CJK Ideograph */ + ["\u8A03", "\u8A03"], /* CJK Ideograph */ + ["\u8A04", "\u8A04"], /* CJK Ideograph */ + ["\u8A05", "\u8A05"], /* CJK Ideograph */ + ["\u8A06", "\u8A06"], /* CJK Ideograph */ + ["\u8A07", "\u8A07"], /* CJK Ideograph */ + ["\u8A08", "\u8A08"], /* CJK Ideograph */ + ["\u8A09", "\u8A09"], /* CJK Ideograph */ + ["\u8A0A", "\u8A0A"], /* CJK Ideograph */ + ["\u8A0B", "\u8A0B"], /* CJK Ideograph */ + ["\u8A0C", "\u8A0C"], /* CJK Ideograph */ + ["\u8A0D", "\u8A0D"], /* CJK Ideograph */ + ["\u8A0E", "\u8A0E"], /* CJK Ideograph */ + ["\u8A0F", "\u8A0F"], /* CJK Ideograph */ + ["\u8A10", "\u8A10"], /* CJK Ideograph */ + ["\u8A11", "\u8A11"], /* CJK Ideograph */ + ["\u8A12", "\u8A12"], /* CJK Ideograph */ + ["\u8A13", "\u8A13"], /* CJK Ideograph */ + ["\u8A14", "\u8A14"], /* CJK Ideograph */ + ["\u8A15", "\u8A15"], /* CJK Ideograph */ + ["\u8A16", "\u8A16"], /* CJK Ideograph */ + ["\u8A17", "\u8A17"], /* CJK Ideograph */ + ["\u8A18", "\u8A18"], /* CJK Ideograph */ + ["\u8A19", "\u8A19"], /* CJK Ideograph */ + ["\u8A1A", "\u8A1A"], /* CJK Ideograph */ + ["\u8A1B", "\u8A1B"], /* CJK Ideograph */ + ["\u8A1C", "\u8A1C"], /* CJK Ideograph */ + ["\u8A1D", "\u8A1D"], /* CJK Ideograph */ + ["\u8A1E", "\u8A1E"], /* CJK Ideograph */ + ["\u8A1F", "\u8A1F"], /* CJK Ideograph */ + ["\u8A20", "\u8A20"], /* CJK Ideograph */ + ["\u8A21", "\u8A21"], /* CJK Ideograph */ + ["\u8A22", "\u8A22"], /* CJK Ideograph */ + ["\u8A23", "\u8A23"], /* CJK Ideograph */ + ["\u8A24", "\u8A24"], /* CJK Ideograph */ + ["\u8A25", "\u8A25"], /* CJK Ideograph */ + ["\u8A26", "\u8A26"], /* CJK Ideograph */ + ["\u8A27", "\u8A27"], /* CJK Ideograph */ + ["\u8A28", "\u8A28"], /* CJK Ideograph */ + ["\u8A29", "\u8A29"], /* CJK Ideograph */ + ["\u8A2A", "\u8A2A"], /* CJK Ideograph */ + ["\u8A2B", "\u8A2B"], /* CJK Ideograph */ + ["\u8A2C", "\u8A2C"], /* CJK Ideograph */ + ["\u8A2D", "\u8A2D"], /* CJK Ideograph */ + ["\u8A2E", "\u8A2E"], /* CJK Ideograph */ + ["\u8A2F", "\u8A2F"], /* CJK Ideograph */ + ["\u8A30", "\u8A30"], /* CJK Ideograph */ + ["\u8A31", "\u8A31"], /* CJK Ideograph */ + ["\u8A32", "\u8A32"], /* CJK Ideograph */ + ["\u8A33", "\u8A33"], /* CJK Ideograph */ + ["\u8A34", "\u8A34"], /* CJK Ideograph */ + ["\u8A35", "\u8A35"], /* CJK Ideograph */ + ["\u8A36", "\u8A36"], /* CJK Ideograph */ + ["\u8A37", "\u8A37"], /* CJK Ideograph */ + ["\u8A38", "\u8A38"], /* CJK Ideograph */ + ["\u8A39", "\u8A39"], /* CJK Ideograph */ + ["\u8A3A", "\u8A3A"], /* CJK Ideograph */ + ["\u8A3B", "\u8A3B"], /* CJK Ideograph */ + ["\u8A3C", "\u8A3C"], /* CJK Ideograph */ + ["\u8A3D", "\u8A3D"], /* CJK Ideograph */ + ["\u8A3E", "\u8A3E"], /* CJK Ideograph */ + ["\u8A3F", "\u8A3F"], /* CJK Ideograph */ + ["\u8A40", "\u8A40"], /* CJK Ideograph */ + ["\u8A41", "\u8A41"], /* CJK Ideograph */ + ["\u8A42", "\u8A42"], /* CJK Ideograph */ + ["\u8A43", "\u8A43"], /* CJK Ideograph */ + ["\u8A44", "\u8A44"], /* CJK Ideograph */ + ["\u8A45", "\u8A45"], /* CJK Ideograph */ + ["\u8A46", "\u8A46"], /* CJK Ideograph */ + ["\u8A47", "\u8A47"], /* CJK Ideograph */ + ["\u8A48", "\u8A48"], /* CJK Ideograph */ + ["\u8A49", "\u8A49"], /* CJK Ideograph */ + ["\u8A4A", "\u8A4A"], /* CJK Ideograph */ + ["\u8A4B", "\u8A4B"], /* CJK Ideograph */ + ["\u8A4C", "\u8A4C"], /* CJK Ideograph */ + ["\u8A4D", "\u8A4D"], /* CJK Ideograph */ + ["\u8A4E", "\u8A4E"], /* CJK Ideograph */ + ["\u8A4F", "\u8A4F"], /* CJK Ideograph */ + ["\u8A50", "\u8A50"], /* CJK Ideograph */ + ["\u8A51", "\u8A51"], /* CJK Ideograph */ + ["\u8A52", "\u8A52"], /* CJK Ideograph */ + ["\u8A53", "\u8A53"], /* CJK Ideograph */ + ["\u8A54", "\u8A54"], /* CJK Ideograph */ + ["\u8A55", "\u8A55"], /* CJK Ideograph */ + ["\u8A56", "\u8A56"], /* CJK Ideograph */ + ["\u8A57", "\u8A57"], /* CJK Ideograph */ + ["\u8A58", "\u8A58"], /* CJK Ideograph */ + ["\u8A59", "\u8A59"], /* CJK Ideograph */ + ["\u8A5A", "\u8A5A"], /* CJK Ideograph */ + ["\u8A5B", "\u8A5B"], /* CJK Ideograph */ + ["\u8A5C", "\u8A5C"], /* CJK Ideograph */ + ["\u8A5D", "\u8A5D"], /* CJK Ideograph */ + ["\u8A5E", "\u8A5E"], /* CJK Ideograph */ + ["\u8A5F", "\u8A5F"], /* CJK Ideograph */ + ["\u8A60", "\u8A60"], /* CJK Ideograph */ + ["\u8A61", "\u8A61"], /* CJK Ideograph */ + ["\u8A62", "\u8A62"], /* CJK Ideograph */ + ["\u8A63", "\u8A63"], /* CJK Ideograph */ + ["\u8A64", "\u8A64"], /* CJK Ideograph */ + ["\u8A65", "\u8A65"], /* CJK Ideograph */ + ["\u8A66", "\u8A66"], /* CJK Ideograph */ + ["\u8A67", "\u8A67"], /* CJK Ideograph */ + ["\u8A68", "\u8A68"], /* CJK Ideograph */ + ["\u8A69", "\u8A69"], /* CJK Ideograph */ + ["\u8A6A", "\u8A6A"], /* CJK Ideograph */ + ["\u8A6B", "\u8A6B"], /* CJK Ideograph */ + ["\u8A6C", "\u8A6C"], /* CJK Ideograph */ + ["\u8A6D", "\u8A6D"], /* CJK Ideograph */ + ["\u8A6E", "\u8A6E"], /* CJK Ideograph */ + ["\u8A6F", "\u8A6F"], /* CJK Ideograph */ + ["\u8A70", "\u8A70"], /* CJK Ideograph */ + ["\u8A71", "\u8A71"], /* CJK Ideograph */ + ["\u8A72", "\u8A72"], /* CJK Ideograph */ + ["\u8A73", "\u8A73"], /* CJK Ideograph */ + ["\u8A74", "\u8A74"], /* CJK Ideograph */ + ["\u8A75", "\u8A75"], /* CJK Ideograph */ + ["\u8A76", "\u8A76"], /* CJK Ideograph */ + ["\u8A77", "\u8A77"], /* CJK Ideograph */ + ["\u8A78", "\u8A78"], /* CJK Ideograph */ + ["\u8A79", "\u8A79"], /* CJK Ideograph */ + ["\u8A7A", "\u8A7A"], /* CJK Ideograph */ + ["\u8A7B", "\u8A7B"], /* CJK Ideograph */ + ["\u8A7C", "\u8A7C"], /* CJK Ideograph */ + ["\u8A7D", "\u8A7D"], /* CJK Ideograph */ + ["\u8A7E", "\u8A7E"], /* CJK Ideograph */ + ["\u8A7F", "\u8A7F"], /* CJK Ideograph */ + ["\u8A80", "\u8A80"], /* CJK Ideograph */ + ["\u8A81", "\u8A81"], /* CJK Ideograph */ + ["\u8A82", "\u8A82"], /* CJK Ideograph */ + ["\u8A83", "\u8A83"], /* CJK Ideograph */ + ["\u8A84", "\u8A84"], /* CJK Ideograph */ + ["\u8A85", "\u8A85"], /* CJK Ideograph */ + ["\u8A86", "\u8A86"], /* CJK Ideograph */ + ["\u8A87", "\u8A87"], /* CJK Ideograph */ + ["\u8A88", "\u8A88"], /* CJK Ideograph */ + ["\u8A89", "\u8A89"], /* CJK Ideograph */ + ["\u8A8A", "\u8A8A"], /* CJK Ideograph */ + ["\u8A8B", "\u8A8B"], /* CJK Ideograph */ + ["\u8A8C", "\u8A8C"], /* CJK Ideograph */ + ["\u8A8D", "\u8A8D"], /* CJK Ideograph */ + ["\u8A8E", "\u8A8E"], /* CJK Ideograph */ + ["\u8A8F", "\u8A8F"], /* CJK Ideograph */ + ["\u8A90", "\u8A90"], /* CJK Ideograph */ + ["\u8A91", "\u8A91"], /* CJK Ideograph */ + ["\u8A92", "\u8A92"], /* CJK Ideograph */ + ["\u8A93", "\u8A93"], /* CJK Ideograph */ + ["\u8A94", "\u8A94"], /* CJK Ideograph */ + ["\u8A95", "\u8A95"], /* CJK Ideograph */ + ["\u8A96", "\u8A96"], /* CJK Ideograph */ + ["\u8A97", "\u8A97"], /* CJK Ideograph */ + ["\u8A98", "\u8A98"], /* CJK Ideograph */ + ["\u8A99", "\u8A99"], /* CJK Ideograph */ + ["\u8A9A", "\u8A9A"], /* CJK Ideograph */ + ["\u8A9B", "\u8A9B"], /* CJK Ideograph */ + ["\u8A9C", "\u8A9C"], /* CJK Ideograph */ + ["\u8A9D", "\u8A9D"], /* CJK Ideograph */ + ["\u8A9E", "\u8A9E"], /* CJK Ideograph */ + ["\u8A9F", "\u8A9F"], /* CJK Ideograph */ + ["\u8AA0", "\u8AA0"], /* CJK Ideograph */ + ["\u8AA1", "\u8AA1"], /* CJK Ideograph */ + ["\u8AA2", "\u8AA2"], /* CJK Ideograph */ + ["\u8AA3", "\u8AA3"], /* CJK Ideograph */ + ["\u8AA4", "\u8AA4"], /* CJK Ideograph */ + ["\u8AA5", "\u8AA5"], /* CJK Ideograph */ + ["\u8AA6", "\u8AA6"], /* CJK Ideograph */ + ["\u8AA7", "\u8AA7"], /* CJK Ideograph */ + ["\u8AA8", "\u8AA8"], /* CJK Ideograph */ + ["\u8AA9", "\u8AA9"], /* CJK Ideograph */ + ["\u8AAA", "\u8AAA"], /* CJK Ideograph */ + ["\u8AAB", "\u8AAB"], /* CJK Ideograph */ + ["\u8AAC", "\u8AAC"], /* CJK Ideograph */ + ["\u8AAD", "\u8AAD"], /* CJK Ideograph */ + ["\u8AAE", "\u8AAE"], /* CJK Ideograph */ + ["\u8AAF", "\u8AAF"], /* CJK Ideograph */ + ["\u8AB0", "\u8AB0"], /* CJK Ideograph */ + ["\u8AB1", "\u8AB1"], /* CJK Ideograph */ + ["\u8AB2", "\u8AB2"], /* CJK Ideograph */ + ["\u8AB3", "\u8AB3"], /* CJK Ideograph */ + ["\u8AB4", "\u8AB4"], /* CJK Ideograph */ + ["\u8AB5", "\u8AB5"], /* CJK Ideograph */ + ["\u8AB6", "\u8AB6"], /* CJK Ideograph */ + ["\u8AB7", "\u8AB7"], /* CJK Ideograph */ + ["\u8AB8", "\u8AB8"], /* CJK Ideograph */ + ["\u8AB9", "\u8AB9"], /* CJK Ideograph */ + ["\u8ABA", "\u8ABA"], /* CJK Ideograph */ + ["\u8ABB", "\u8ABB"], /* CJK Ideograph */ + ["\u8ABC", "\u8ABC"], /* CJK Ideograph */ + ["\u8ABD", "\u8ABD"], /* CJK Ideograph */ + ["\u8ABE", "\u8ABE"], /* CJK Ideograph */ + ["\u8ABF", "\u8ABF"], /* CJK Ideograph */ + ["\u8AC0", "\u8AC0"], /* CJK Ideograph */ + ["\u8AC1", "\u8AC1"], /* CJK Ideograph */ + ["\u8AC2", "\u8AC2"], /* CJK Ideograph */ + ["\u8AC3", "\u8AC3"], /* CJK Ideograph */ + ["\u8AC4", "\u8AC4"], /* CJK Ideograph */ + ["\u8AC5", "\u8AC5"], /* CJK Ideograph */ + ["\u8AC6", "\u8AC6"], /* CJK Ideograph */ + ["\u8AC7", "\u8AC7"], /* CJK Ideograph */ + ["\u8AC8", "\u8AC8"], /* CJK Ideograph */ + ["\u8AC9", "\u8AC9"], /* CJK Ideograph */ + ["\u8ACA", "\u8ACA"], /* CJK Ideograph */ + ["\u8ACB", "\u8ACB"], /* CJK Ideograph */ + ["\u8ACC", "\u8ACC"], /* CJK Ideograph */ + ["\u8ACD", "\u8ACD"], /* CJK Ideograph */ + ["\u8ACE", "\u8ACE"], /* CJK Ideograph */ + ["\u8ACF", "\u8ACF"], /* CJK Ideograph */ + ["\u8AD0", "\u8AD0"], /* CJK Ideograph */ + ["\u8AD1", "\u8AD1"], /* CJK Ideograph */ + ["\u8AD2", "\u8AD2"], /* CJK Ideograph */ + ["\u8AD3", "\u8AD3"], /* CJK Ideograph */ + ["\u8AD4", "\u8AD4"], /* CJK Ideograph */ + ["\u8AD5", "\u8AD5"], /* CJK Ideograph */ + ["\u8AD6", "\u8AD6"], /* CJK Ideograph */ + ["\u8AD7", "\u8AD7"], /* CJK Ideograph */ + ["\u8AD8", "\u8AD8"], /* CJK Ideograph */ + ["\u8AD9", "\u8AD9"], /* CJK Ideograph */ + ["\u8ADA", "\u8ADA"], /* CJK Ideograph */ + ["\u8ADB", "\u8ADB"], /* CJK Ideograph */ + ["\u8ADC", "\u8ADC"], /* CJK Ideograph */ + ["\u8ADD", "\u8ADD"], /* CJK Ideograph */ + ["\u8ADE", "\u8ADE"], /* CJK Ideograph */ + ["\u8ADF", "\u8ADF"], /* CJK Ideograph */ + ["\u8AE0", "\u8AE0"], /* CJK Ideograph */ + ["\u8AE1", "\u8AE1"], /* CJK Ideograph */ + ["\u8AE2", "\u8AE2"], /* CJK Ideograph */ + ["\u8AE3", "\u8AE3"], /* CJK Ideograph */ + ["\u8AE4", "\u8AE4"], /* CJK Ideograph */ + ["\u8AE5", "\u8AE5"], /* CJK Ideograph */ + ["\u8AE6", "\u8AE6"], /* CJK Ideograph */ + ["\u8AE7", "\u8AE7"], /* CJK Ideograph */ + ["\u8AE8", "\u8AE8"], /* CJK Ideograph */ + ["\u8AE9", "\u8AE9"], /* CJK Ideograph */ + ["\u8AEA", "\u8AEA"], /* CJK Ideograph */ + ["\u8AEB", "\u8AEB"], /* CJK Ideograph */ + ["\u8AEC", "\u8AEC"], /* CJK Ideograph */ + ["\u8AED", "\u8AED"], /* CJK Ideograph */ + ["\u8AEE", "\u8AEE"], /* CJK Ideograph */ + ["\u8AEF", "\u8AEF"], /* CJK Ideograph */ + ["\u8AF0", "\u8AF0"], /* CJK Ideograph */ + ["\u8AF1", "\u8AF1"], /* CJK Ideograph */ + ["\u8AF2", "\u8AF2"], /* CJK Ideograph */ + ["\u8AF3", "\u8AF3"], /* CJK Ideograph */ + ["\u8AF4", "\u8AF4"], /* CJK Ideograph */ + ["\u8AF5", "\u8AF5"], /* CJK Ideograph */ + ["\u8AF6", "\u8AF6"], /* CJK Ideograph */ + ["\u8AF7", "\u8AF7"], /* CJK Ideograph */ + ["\u8AF8", "\u8AF8"], /* CJK Ideograph */ + ["\u8AF9", "\u8AF9"], /* CJK Ideograph */ + ["\u8AFA", "\u8AFA"], /* CJK Ideograph */ + ["\u8AFB", "\u8AFB"], /* CJK Ideograph */ + ["\u8AFC", "\u8AFC"], /* CJK Ideograph */ + ["\u8AFD", "\u8AFD"], /* CJK Ideograph */ + ["\u8AFE", "\u8AFE"], /* CJK Ideograph */ + ["\u8AFF", "\u8AFF"], /* CJK Ideograph */ + ["\u8B00", "\u8B00"], /* CJK Ideograph */ + ["\u8B01", "\u8B01"], /* CJK Ideograph */ + ["\u8B02", "\u8B02"], /* CJK Ideograph */ + ["\u8B03", "\u8B03"], /* CJK Ideograph */ + ["\u8B04", "\u8B04"], /* CJK Ideograph */ + ["\u8B05", "\u8B05"], /* CJK Ideograph */ + ["\u8B06", "\u8B06"], /* CJK Ideograph */ + ["\u8B07", "\u8B07"], /* CJK Ideograph */ + ["\u8B08", "\u8B08"], /* CJK Ideograph */ + ["\u8B09", "\u8B09"], /* CJK Ideograph */ + ["\u8B0A", "\u8B0A"], /* CJK Ideograph */ + ["\u8B0B", "\u8B0B"], /* CJK Ideograph */ + ["\u8B0C", "\u8B0C"], /* CJK Ideograph */ + ["\u8B0D", "\u8B0D"], /* CJK Ideograph */ + ["\u8B0E", "\u8B0E"], /* CJK Ideograph */ + ["\u8B0F", "\u8B0F"], /* CJK Ideograph */ + ["\u8B10", "\u8B10"], /* CJK Ideograph */ + ["\u8B11", "\u8B11"], /* CJK Ideograph */ + ["\u8B12", "\u8B12"], /* CJK Ideograph */ + ["\u8B13", "\u8B13"], /* CJK Ideograph */ + ["\u8B14", "\u8B14"], /* CJK Ideograph */ + ["\u8B15", "\u8B15"], /* CJK Ideograph */ + ["\u8B16", "\u8B16"], /* CJK Ideograph */ + ["\u8B17", "\u8B17"], /* CJK Ideograph */ + ["\u8B18", "\u8B18"], /* CJK Ideograph */ + ["\u8B19", "\u8B19"], /* CJK Ideograph */ + ["\u8B1A", "\u8B1A"], /* CJK Ideograph */ + ["\u8B1B", "\u8B1B"], /* CJK Ideograph */ + ["\u8B1C", "\u8B1C"], /* CJK Ideograph */ + ["\u8B1D", "\u8B1D"], /* CJK Ideograph */ + ["\u8B1E", "\u8B1E"], /* CJK Ideograph */ + ["\u8B1F", "\u8B1F"], /* CJK Ideograph */ + ["\u8B20", "\u8B20"], /* CJK Ideograph */ + ["\u8B21", "\u8B21"], /* CJK Ideograph */ + ["\u8B22", "\u8B22"], /* CJK Ideograph */ + ["\u8B23", "\u8B23"], /* CJK Ideograph */ + ["\u8B24", "\u8B24"], /* CJK Ideograph */ + ["\u8B25", "\u8B25"], /* CJK Ideograph */ + ["\u8B26", "\u8B26"], /* CJK Ideograph */ + ["\u8B27", "\u8B27"], /* CJK Ideograph */ + ["\u8B28", "\u8B28"], /* CJK Ideograph */ + ["\u8B29", "\u8B29"], /* CJK Ideograph */ + ["\u8B2A", "\u8B2A"], /* CJK Ideograph */ + ["\u8B2B", "\u8B2B"], /* CJK Ideograph */ + ["\u8B2C", "\u8B2C"], /* CJK Ideograph */ + ["\u8B2D", "\u8B2D"], /* CJK Ideograph */ + ["\u8B2E", "\u8B2E"], /* CJK Ideograph */ + ["\u8B2F", "\u8B2F"], /* CJK Ideograph */ + ["\u8B30", "\u8B30"], /* CJK Ideograph */ + ["\u8B31", "\u8B31"], /* CJK Ideograph */ + ["\u8B32", "\u8B32"], /* CJK Ideograph */ + ["\u8B33", "\u8B33"], /* CJK Ideograph */ + ["\u8B34", "\u8B34"], /* CJK Ideograph */ + ["\u8B35", "\u8B35"], /* CJK Ideograph */ + ["\u8B36", "\u8B36"], /* CJK Ideograph */ + ["\u8B37", "\u8B37"], /* CJK Ideograph */ + ["\u8B38", "\u8B38"], /* CJK Ideograph */ + ["\u8B39", "\u8B39"], /* CJK Ideograph */ + ["\u8B3A", "\u8B3A"], /* CJK Ideograph */ + ["\u8B3B", "\u8B3B"], /* CJK Ideograph */ + ["\u8B3C", "\u8B3C"], /* CJK Ideograph */ + ["\u8B3D", "\u8B3D"], /* CJK Ideograph */ + ["\u8B3E", "\u8B3E"], /* CJK Ideograph */ + ["\u8B3F", "\u8B3F"], /* CJK Ideograph */ + ["\u8B40", "\u8B40"], /* CJK Ideograph */ + ["\u8B41", "\u8B41"], /* CJK Ideograph */ + ["\u8B42", "\u8B42"], /* CJK Ideograph */ + ["\u8B43", "\u8B43"], /* CJK Ideograph */ + ["\u8B44", "\u8B44"], /* CJK Ideograph */ + ["\u8B45", "\u8B45"], /* CJK Ideograph */ + ["\u8B46", "\u8B46"], /* CJK Ideograph */ + ["\u8B47", "\u8B47"], /* CJK Ideograph */ + ["\u8B48", "\u8B48"], /* CJK Ideograph */ + ["\u8B49", "\u8B49"], /* CJK Ideograph */ + ["\u8B4A", "\u8B4A"], /* CJK Ideograph */ + ["\u8B4B", "\u8B4B"], /* CJK Ideograph */ + ["\u8B4C", "\u8B4C"], /* CJK Ideograph */ + ["\u8B4D", "\u8B4D"], /* CJK Ideograph */ + ["\u8B4E", "\u8B4E"], /* CJK Ideograph */ + ["\u8B4F", "\u8B4F"], /* CJK Ideograph */ + ["\u8B50", "\u8B50"], /* CJK Ideograph */ + ["\u8B51", "\u8B51"], /* CJK Ideograph */ + ["\u8B52", "\u8B52"], /* CJK Ideograph */ + ["\u8B53", "\u8B53"], /* CJK Ideograph */ + ["\u8B54", "\u8B54"], /* CJK Ideograph */ + ["\u8B55", "\u8B55"], /* CJK Ideograph */ + ["\u8B56", "\u8B56"], /* CJK Ideograph */ + ["\u8B57", "\u8B57"], /* CJK Ideograph */ + ["\u8B58", "\u8B58"], /* CJK Ideograph */ + ["\u8B59", "\u8B59"], /* CJK Ideograph */ + ["\u8B5A", "\u8B5A"], /* CJK Ideograph */ + ["\u8B5B", "\u8B5B"], /* CJK Ideograph */ + ["\u8B5C", "\u8B5C"], /* CJK Ideograph */ + ["\u8B5D", "\u8B5D"], /* CJK Ideograph */ + ["\u8B5E", "\u8B5E"], /* CJK Ideograph */ + ["\u8B5F", "\u8B5F"], /* CJK Ideograph */ + ["\u8B60", "\u8B60"], /* CJK Ideograph */ + ["\u8B61", "\u8B61"], /* CJK Ideograph */ + ["\u8B62", "\u8B62"], /* CJK Ideograph */ + ["\u8B63", "\u8B63"], /* CJK Ideograph */ + ["\u8B64", "\u8B64"], /* CJK Ideograph */ + ["\u8B65", "\u8B65"], /* CJK Ideograph */ + ["\u8B66", "\u8B66"], /* CJK Ideograph */ + ["\u8B67", "\u8B67"], /* CJK Ideograph */ + ["\u8B68", "\u8B68"], /* CJK Ideograph */ + ["\u8B69", "\u8B69"], /* CJK Ideograph */ + ["\u8B6A", "\u8B6A"], /* CJK Ideograph */ + ["\u8B6B", "\u8B6B"], /* CJK Ideograph */ + ["\u8B6C", "\u8B6C"], /* CJK Ideograph */ + ["\u8B6D", "\u8B6D"], /* CJK Ideograph */ + ["\u8B6E", "\u8B6E"], /* CJK Ideograph */ + ["\u8B6F", "\u8B6F"], /* CJK Ideograph */ + ["\u8B70", "\u8B70"], /* CJK Ideograph */ + ["\u8B71", "\u8B71"], /* CJK Ideograph */ + ["\u8B72", "\u8B72"], /* CJK Ideograph */ + ["\u8B73", "\u8B73"], /* CJK Ideograph */ + ["\u8B74", "\u8B74"], /* CJK Ideograph */ + ["\u8B75", "\u8B75"], /* CJK Ideograph */ + ["\u8B76", "\u8B76"], /* CJK Ideograph */ + ["\u8B77", "\u8B77"], /* CJK Ideograph */ + ["\u8B78", "\u8B78"], /* CJK Ideograph */ + ["\u8B79", "\u8B79"], /* CJK Ideograph */ + ["\u8B7A", "\u8B7A"], /* CJK Ideograph */ + ["\u8B7B", "\u8B7B"], /* CJK Ideograph */ + ["\u8B7C", "\u8B7C"], /* CJK Ideograph */ + ["\u8B7D", "\u8B7D"], /* CJK Ideograph */ + ["\u8B7E", "\u8B7E"], /* CJK Ideograph */ + ["\u8B7F", "\u8B7F"], /* CJK Ideograph */ + ["\u8B80", "\u8B80"], /* CJK Ideograph */ + ["\u8B81", "\u8B81"], /* CJK Ideograph */ + ["\u8B82", "\u8B82"], /* CJK Ideograph */ + ["\u8B83", "\u8B83"], /* CJK Ideograph */ + ["\u8B84", "\u8B84"], /* CJK Ideograph */ + ["\u8B85", "\u8B85"], /* CJK Ideograph */ + ["\u8B86", "\u8B86"], /* CJK Ideograph */ + ["\u8B87", "\u8B87"], /* CJK Ideograph */ + ["\u8B88", "\u8B88"], /* CJK Ideograph */ + ["\u8B89", "\u8B89"], /* CJK Ideograph */ + ["\u8B8A", "\u8B8A"], /* CJK Ideograph */ + ["\u8B8B", "\u8B8B"], /* CJK Ideograph */ + ["\u8B8C", "\u8B8C"], /* CJK Ideograph */ + ["\u8B8D", "\u8B8D"], /* CJK Ideograph */ + ["\u8B8E", "\u8B8E"], /* CJK Ideograph */ + ["\u8B8F", "\u8B8F"], /* CJK Ideograph */ + ["\u8B90", "\u8B90"], /* CJK Ideograph */ + ["\u8B91", "\u8B91"], /* CJK Ideograph */ + ["\u8B92", "\u8B92"], /* CJK Ideograph */ + ["\u8B93", "\u8B93"], /* CJK Ideograph */ + ["\u8B94", "\u8B94"], /* CJK Ideograph */ + ["\u8B95", "\u8B95"], /* CJK Ideograph */ + ["\u8B96", "\u8B96"], /* CJK Ideograph */ + ["\u8B97", "\u8B97"], /* CJK Ideograph */ + ["\u8B98", "\u8B98"], /* CJK Ideograph */ + ["\u8B99", "\u8B99"], /* CJK Ideograph */ + ["\u8B9A", "\u8B9A"], /* CJK Ideograph */ + ["\u8B9B", "\u8B9B"], /* CJK Ideograph */ + ["\u8B9C", "\u8B9C"], /* CJK Ideograph */ + ["\u8B9D", "\u8B9D"], /* CJK Ideograph */ + ["\u8B9E", "\u8B9E"], /* CJK Ideograph */ + ["\u8B9F", "\u8B9F"], /* CJK Ideograph */ + ["\u8BA0", "\u8BA0"], /* CJK Ideograph */ + ["\u8BA1", "\u8BA1"], /* CJK Ideograph */ + ["\u8BA2", "\u8BA2"], /* CJK Ideograph */ + ["\u8BA3", "\u8BA3"], /* CJK Ideograph */ + ["\u8BA4", "\u8BA4"], /* CJK Ideograph */ + ["\u8BA5", "\u8BA5"], /* CJK Ideograph */ + ["\u8BA6", "\u8BA6"], /* CJK Ideograph */ + ["\u8BA7", "\u8BA7"], /* CJK Ideograph */ + ["\u8BA8", "\u8BA8"], /* CJK Ideograph */ + ["\u8BA9", "\u8BA9"], /* CJK Ideograph */ + ["\u8BAA", "\u8BAA"], /* CJK Ideograph */ + ["\u8BAB", "\u8BAB"], /* CJK Ideograph */ + ["\u8BAC", "\u8BAC"], /* CJK Ideograph */ + ["\u8BAD", "\u8BAD"], /* CJK Ideograph */ + ["\u8BAE", "\u8BAE"], /* CJK Ideograph */ + ["\u8BAF", "\u8BAF"], /* CJK Ideograph */ + ["\u8BB0", "\u8BB0"], /* CJK Ideograph */ + ["\u8BB1", "\u8BB1"], /* CJK Ideograph */ + ["\u8BB2", "\u8BB2"], /* CJK Ideograph */ + ["\u8BB3", "\u8BB3"], /* CJK Ideograph */ + ["\u8BB4", "\u8BB4"], /* CJK Ideograph */ + ["\u8BB5", "\u8BB5"], /* CJK Ideograph */ + ["\u8BB6", "\u8BB6"], /* CJK Ideograph */ + ["\u8BB7", "\u8BB7"], /* CJK Ideograph */ + ["\u8BB8", "\u8BB8"], /* CJK Ideograph */ + ["\u8BB9", "\u8BB9"], /* CJK Ideograph */ + ["\u8BBA", "\u8BBA"], /* CJK Ideograph */ + ["\u8BBB", "\u8BBB"], /* CJK Ideograph */ + ["\u8BBC", "\u8BBC"], /* CJK Ideograph */ + ["\u8BBD", "\u8BBD"], /* CJK Ideograph */ + ["\u8BBE", "\u8BBE"], /* CJK Ideograph */ + ["\u8BBF", "\u8BBF"], /* CJK Ideograph */ + ["\u8BC0", "\u8BC0"], /* CJK Ideograph */ + ["\u8BC1", "\u8BC1"], /* CJK Ideograph */ + ["\u8BC2", "\u8BC2"], /* CJK Ideograph */ + ["\u8BC3", "\u8BC3"], /* CJK Ideograph */ + ["\u8BC4", "\u8BC4"], /* CJK Ideograph */ + ["\u8BC5", "\u8BC5"], /* CJK Ideograph */ + ["\u8BC6", "\u8BC6"], /* CJK Ideograph */ + ["\u8BC7", "\u8BC7"], /* CJK Ideograph */ + ["\u8BC8", "\u8BC8"], /* CJK Ideograph */ + ["\u8BC9", "\u8BC9"], /* CJK Ideograph */ + ["\u8BCA", "\u8BCA"], /* CJK Ideograph */ + ["\u8BCB", "\u8BCB"], /* CJK Ideograph */ + ["\u8BCC", "\u8BCC"], /* CJK Ideograph */ + ["\u8BCD", "\u8BCD"], /* CJK Ideograph */ + ["\u8BCE", "\u8BCE"], /* CJK Ideograph */ + ["\u8BCF", "\u8BCF"], /* CJK Ideograph */ + ["\u8BD0", "\u8BD0"], /* CJK Ideograph */ + ["\u8BD1", "\u8BD1"], /* CJK Ideograph */ + ["\u8BD2", "\u8BD2"], /* CJK Ideograph */ + ["\u8BD3", "\u8BD3"], /* CJK Ideograph */ + ["\u8BD4", "\u8BD4"], /* CJK Ideograph */ + ["\u8BD5", "\u8BD5"], /* CJK Ideograph */ + ["\u8BD6", "\u8BD6"], /* CJK Ideograph */ + ["\u8BD7", "\u8BD7"], /* CJK Ideograph */ + ["\u8BD8", "\u8BD8"], /* CJK Ideograph */ + ["\u8BD9", "\u8BD9"], /* CJK Ideograph */ + ["\u8BDA", "\u8BDA"], /* CJK Ideograph */ + ["\u8BDB", "\u8BDB"], /* CJK Ideograph */ + ["\u8BDC", "\u8BDC"], /* CJK Ideograph */ + ["\u8BDD", "\u8BDD"], /* CJK Ideograph */ + ["\u8BDE", "\u8BDE"], /* CJK Ideograph */ + ["\u8BDF", "\u8BDF"], /* CJK Ideograph */ + ["\u8BE0", "\u8BE0"], /* CJK Ideograph */ + ["\u8BE1", "\u8BE1"], /* CJK Ideograph */ + ["\u8BE2", "\u8BE2"], /* CJK Ideograph */ + ["\u8BE3", "\u8BE3"], /* CJK Ideograph */ + ["\u8BE4", "\u8BE4"], /* CJK Ideograph */ + ["\u8BE5", "\u8BE5"], /* CJK Ideograph */ + ["\u8BE6", "\u8BE6"], /* CJK Ideograph */ + ["\u8BE7", "\u8BE7"], /* CJK Ideograph */ + ["\u8BE8", "\u8BE8"], /* CJK Ideograph */ + ["\u8BE9", "\u8BE9"], /* CJK Ideograph */ + ["\u8BEA", "\u8BEA"], /* CJK Ideograph */ + ["\u8BEB", "\u8BEB"], /* CJK Ideograph */ + ["\u8BEC", "\u8BEC"], /* CJK Ideograph */ + ["\u8BED", "\u8BED"], /* CJK Ideograph */ + ["\u8BEE", "\u8BEE"], /* CJK Ideograph */ + ["\u8BEF", "\u8BEF"], /* CJK Ideograph */ + ["\u8BF0", "\u8BF0"], /* CJK Ideograph */ + ["\u8BF1", "\u8BF1"], /* CJK Ideograph */ + ["\u8BF2", "\u8BF2"], /* CJK Ideograph */ + ["\u8BF3", "\u8BF3"], /* CJK Ideograph */ + ["\u8BF4", "\u8BF4"], /* CJK Ideograph */ + ["\u8BF5", "\u8BF5"], /* CJK Ideograph */ + ["\u8BF6", "\u8BF6"], /* CJK Ideograph */ + ["\u8BF7", "\u8BF7"], /* CJK Ideograph */ + ["\u8BF8", "\u8BF8"], /* CJK Ideograph */ + ["\u8BF9", "\u8BF9"], /* CJK Ideograph */ + ["\u8BFA", "\u8BFA"], /* CJK Ideograph */ + ["\u8BFB", "\u8BFB"], /* CJK Ideograph */ + ["\u8BFC", "\u8BFC"], /* CJK Ideograph */ + ["\u8BFD", "\u8BFD"], /* CJK Ideograph */ + ["\u8BFE", "\u8BFE"], /* CJK Ideograph */ + ["\u8BFF", "\u8BFF"], /* CJK Ideograph */ + ["\u8C00", "\u8C00"], /* CJK Ideograph */ + ["\u8C01", "\u8C01"], /* CJK Ideograph */ + ["\u8C02", "\u8C02"], /* CJK Ideograph */ + ["\u8C03", "\u8C03"], /* CJK Ideograph */ + ["\u8C04", "\u8C04"], /* CJK Ideograph */ + ["\u8C05", "\u8C05"], /* CJK Ideograph */ + ["\u8C06", "\u8C06"], /* CJK Ideograph */ + ["\u8C07", "\u8C07"], /* CJK Ideograph */ + ["\u8C08", "\u8C08"], /* CJK Ideograph */ + ["\u8C09", "\u8C09"], /* CJK Ideograph */ + ["\u8C0A", "\u8C0A"], /* CJK Ideograph */ + ["\u8C0B", "\u8C0B"], /* CJK Ideograph */ + ["\u8C0C", "\u8C0C"], /* CJK Ideograph */ + ["\u8C0D", "\u8C0D"], /* CJK Ideograph */ + ["\u8C0E", "\u8C0E"], /* CJK Ideograph */ + ["\u8C0F", "\u8C0F"], /* CJK Ideograph */ + ["\u8C10", "\u8C10"], /* CJK Ideograph */ + ["\u8C11", "\u8C11"], /* CJK Ideograph */ + ["\u8C12", "\u8C12"], /* CJK Ideograph */ + ["\u8C13", "\u8C13"], /* CJK Ideograph */ + ["\u8C14", "\u8C14"], /* CJK Ideograph */ + ["\u8C15", "\u8C15"], /* CJK Ideograph */ + ["\u8C16", "\u8C16"], /* CJK Ideograph */ + ["\u8C17", "\u8C17"], /* CJK Ideograph */ + ["\u8C18", "\u8C18"], /* CJK Ideograph */ + ["\u8C19", "\u8C19"], /* CJK Ideograph */ + ["\u8C1A", "\u8C1A"], /* CJK Ideograph */ + ["\u8C1B", "\u8C1B"], /* CJK Ideograph */ + ["\u8C1C", "\u8C1C"], /* CJK Ideograph */ + ["\u8C1D", "\u8C1D"], /* CJK Ideograph */ + ["\u8C1E", "\u8C1E"], /* CJK Ideograph */ + ["\u8C1F", "\u8C1F"], /* CJK Ideograph */ + ["\u8C20", "\u8C20"], /* CJK Ideograph */ + ["\u8C21", "\u8C21"], /* CJK Ideograph */ + ["\u8C22", "\u8C22"], /* CJK Ideograph */ + ["\u8C23", "\u8C23"], /* CJK Ideograph */ + ["\u8C24", "\u8C24"], /* CJK Ideograph */ + ["\u8C25", "\u8C25"], /* CJK Ideograph */ + ["\u8C26", "\u8C26"], /* CJK Ideograph */ + ["\u8C27", "\u8C27"], /* CJK Ideograph */ + ["\u8C28", "\u8C28"], /* CJK Ideograph */ + ["\u8C29", "\u8C29"], /* CJK Ideograph */ + ["\u8C2A", "\u8C2A"], /* CJK Ideograph */ + ["\u8C2B", "\u8C2B"], /* CJK Ideograph */ + ["\u8C2C", "\u8C2C"], /* CJK Ideograph */ + ["\u8C2D", "\u8C2D"], /* CJK Ideograph */ + ["\u8C2E", "\u8C2E"], /* CJK Ideograph */ + ["\u8C2F", "\u8C2F"], /* CJK Ideograph */ + ["\u8C30", "\u8C30"], /* CJK Ideograph */ + ["\u8C31", "\u8C31"], /* CJK Ideograph */ + ["\u8C32", "\u8C32"], /* CJK Ideograph */ + ["\u8C33", "\u8C33"], /* CJK Ideograph */ + ["\u8C34", "\u8C34"], /* CJK Ideograph */ + ["\u8C35", "\u8C35"], /* CJK Ideograph */ + ["\u8C36", "\u8C36"], /* CJK Ideograph */ + ["\u8C37", "\u8C37"], /* CJK Ideograph */ + ["\u8C38", "\u8C38"], /* CJK Ideograph */ + ["\u8C39", "\u8C39"], /* CJK Ideograph */ + ["\u8C3A", "\u8C3A"], /* CJK Ideograph */ + ["\u8C3B", "\u8C3B"], /* CJK Ideograph */ + ["\u8C3C", "\u8C3C"], /* CJK Ideograph */ + ["\u8C3D", "\u8C3D"], /* CJK Ideograph */ + ["\u8C3E", "\u8C3E"], /* CJK Ideograph */ + ["\u8C3F", "\u8C3F"], /* CJK Ideograph */ + ["\u8C40", "\u8C40"], /* CJK Ideograph */ + ["\u8C41", "\u8C41"], /* CJK Ideograph */ + ["\u8C42", "\u8C42"], /* CJK Ideograph */ + ["\u8C43", "\u8C43"], /* CJK Ideograph */ + ["\u8C44", "\u8C44"], /* CJK Ideograph */ + ["\u8C45", "\u8C45"], /* CJK Ideograph */ + ["\u8C46", "\u8C46"], /* CJK Ideograph */ + ["\u8C47", "\u8C47"], /* CJK Ideograph */ + ["\u8C48", "\u8C48"], /* CJK Ideograph */ + ["\u8C49", "\u8C49"], /* CJK Ideograph */ + ["\u8C4A", "\u8C4A"], /* CJK Ideograph */ + ["\u8C4B", "\u8C4B"], /* CJK Ideograph */ + ["\u8C4C", "\u8C4C"], /* CJK Ideograph */ + ["\u8C4D", "\u8C4D"], /* CJK Ideograph */ + ["\u8C4E", "\u8C4E"], /* CJK Ideograph */ + ["\u8C4F", "\u8C4F"], /* CJK Ideograph */ + ["\u8C50", "\u8C50"], /* CJK Ideograph */ + ["\u8C51", "\u8C51"], /* CJK Ideograph */ + ["\u8C52", "\u8C52"], /* CJK Ideograph */ + ["\u8C53", "\u8C53"], /* CJK Ideograph */ + ["\u8C54", "\u8C54"], /* CJK Ideograph */ + ["\u8C55", "\u8C55"], /* CJK Ideograph */ + ["\u8C56", "\u8C56"], /* CJK Ideograph */ + ["\u8C57", "\u8C57"], /* CJK Ideograph */ + ["\u8C58", "\u8C58"], /* CJK Ideograph */ + ["\u8C59", "\u8C59"], /* CJK Ideograph */ + ["\u8C5A", "\u8C5A"], /* CJK Ideograph */ + ["\u8C5B", "\u8C5B"], /* CJK Ideograph */ + ["\u8C5C", "\u8C5C"], /* CJK Ideograph */ + ["\u8C5D", "\u8C5D"], /* CJK Ideograph */ + ["\u8C5E", "\u8C5E"], /* CJK Ideograph */ + ["\u8C5F", "\u8C5F"], /* CJK Ideograph */ + ["\u8C60", "\u8C60"], /* CJK Ideograph */ + ["\u8C61", "\u8C61"], /* CJK Ideograph */ + ["\u8C62", "\u8C62"], /* CJK Ideograph */ + ["\u8C63", "\u8C63"], /* CJK Ideograph */ + ["\u8C64", "\u8C64"], /* CJK Ideograph */ + ["\u8C65", "\u8C65"], /* CJK Ideograph */ + ["\u8C66", "\u8C66"], /* CJK Ideograph */ + ["\u8C67", "\u8C67"], /* CJK Ideograph */ + ["\u8C68", "\u8C68"], /* CJK Ideograph */ + ["\u8C69", "\u8C69"], /* CJK Ideograph */ + ["\u8C6A", "\u8C6A"], /* CJK Ideograph */ + ["\u8C6B", "\u8C6B"], /* CJK Ideograph */ + ["\u8C6C", "\u8C6C"], /* CJK Ideograph */ + ["\u8C6D", "\u8C6D"], /* CJK Ideograph */ + ["\u8C6E", "\u8C6E"], /* CJK Ideograph */ + ["\u8C6F", "\u8C6F"], /* CJK Ideograph */ + ["\u8C70", "\u8C70"], /* CJK Ideograph */ + ["\u8C71", "\u8C71"], /* CJK Ideograph */ + ["\u8C72", "\u8C72"], /* CJK Ideograph */ + ["\u8C73", "\u8C73"], /* CJK Ideograph */ + ["\u8C74", "\u8C74"], /* CJK Ideograph */ + ["\u8C75", "\u8C75"], /* CJK Ideograph */ + ["\u8C76", "\u8C76"], /* CJK Ideograph */ + ["\u8C77", "\u8C77"], /* CJK Ideograph */ + ["\u8C78", "\u8C78"], /* CJK Ideograph */ + ["\u8C79", "\u8C79"], /* CJK Ideograph */ + ["\u8C7A", "\u8C7A"], /* CJK Ideograph */ + ["\u8C7B", "\u8C7B"], /* CJK Ideograph */ + ["\u8C7C", "\u8C7C"], /* CJK Ideograph */ + ["\u8C7D", "\u8C7D"], /* CJK Ideograph */ + ["\u8C7E", "\u8C7E"], /* CJK Ideograph */ + ["\u8C7F", "\u8C7F"], /* CJK Ideograph */ + ["\u8C80", "\u8C80"], /* CJK Ideograph */ + ["\u8C81", "\u8C81"], /* CJK Ideograph */ + ["\u8C82", "\u8C82"], /* CJK Ideograph */ + ["\u8C83", "\u8C83"], /* CJK Ideograph */ + ["\u8C84", "\u8C84"], /* CJK Ideograph */ + ["\u8C85", "\u8C85"], /* CJK Ideograph */ + ["\u8C86", "\u8C86"], /* CJK Ideograph */ + ["\u8C87", "\u8C87"], /* CJK Ideograph */ + ["\u8C88", "\u8C88"], /* CJK Ideograph */ + ["\u8C89", "\u8C89"], /* CJK Ideograph */ + ["\u8C8A", "\u8C8A"], /* CJK Ideograph */ + ["\u8C8B", "\u8C8B"], /* CJK Ideograph */ + ["\u8C8C", "\u8C8C"], /* CJK Ideograph */ + ["\u8C8D", "\u8C8D"], /* CJK Ideograph */ + ["\u8C8E", "\u8C8E"], /* CJK Ideograph */ + ["\u8C8F", "\u8C8F"], /* CJK Ideograph */ + ["\u8C90", "\u8C90"], /* CJK Ideograph */ + ["\u8C91", "\u8C91"], /* CJK Ideograph */ + ["\u8C92", "\u8C92"], /* CJK Ideograph */ + ["\u8C93", "\u8C93"], /* CJK Ideograph */ + ["\u8C94", "\u8C94"], /* CJK Ideograph */ + ["\u8C95", "\u8C95"], /* CJK Ideograph */ + ["\u8C96", "\u8C96"], /* CJK Ideograph */ + ["\u8C97", "\u8C97"], /* CJK Ideograph */ + ["\u8C98", "\u8C98"], /* CJK Ideograph */ + ["\u8C99", "\u8C99"], /* CJK Ideograph */ + ["\u8C9A", "\u8C9A"], /* CJK Ideograph */ + ["\u8C9B", "\u8C9B"], /* CJK Ideograph */ + ["\u8C9C", "\u8C9C"], /* CJK Ideograph */ + ["\u8C9D", "\u8C9D"], /* CJK Ideograph */ + ["\u8C9E", "\u8C9E"], /* CJK Ideograph */ + ["\u8C9F", "\u8C9F"], /* CJK Ideograph */ + ["\u8CA0", "\u8CA0"], /* CJK Ideograph */ + ["\u8CA1", "\u8CA1"], /* CJK Ideograph */ + ["\u8CA2", "\u8CA2"], /* CJK Ideograph */ + ["\u8CA3", "\u8CA3"], /* CJK Ideograph */ + ["\u8CA4", "\u8CA4"], /* CJK Ideograph */ + ["\u8CA5", "\u8CA5"], /* CJK Ideograph */ + ["\u8CA6", "\u8CA6"], /* CJK Ideograph */ + ["\u8CA7", "\u8CA7"], /* CJK Ideograph */ + ["\u8CA8", "\u8CA8"], /* CJK Ideograph */ + ["\u8CA9", "\u8CA9"], /* CJK Ideograph */ + ["\u8CAA", "\u8CAA"], /* CJK Ideograph */ + ["\u8CAB", "\u8CAB"], /* CJK Ideograph */ + ["\u8CAC", "\u8CAC"], /* CJK Ideograph */ + ["\u8CAD", "\u8CAD"], /* CJK Ideograph */ + ["\u8CAE", "\u8CAE"], /* CJK Ideograph */ + ["\u8CAF", "\u8CAF"], /* CJK Ideograph */ + ["\u8CB0", "\u8CB0"], /* CJK Ideograph */ + ["\u8CB1", "\u8CB1"], /* CJK Ideograph */ + ["\u8CB2", "\u8CB2"], /* CJK Ideograph */ + ["\u8CB3", "\u8CB3"], /* CJK Ideograph */ + ["\u8CB4", "\u8CB4"], /* CJK Ideograph */ + ["\u8CB5", "\u8CB5"], /* CJK Ideograph */ + ["\u8CB6", "\u8CB6"], /* CJK Ideograph */ + ["\u8CB7", "\u8CB7"], /* CJK Ideograph */ + ["\u8CB8", "\u8CB8"], /* CJK Ideograph */ + ["\u8CB9", "\u8CB9"], /* CJK Ideograph */ + ["\u8CBA", "\u8CBA"], /* CJK Ideograph */ + ["\u8CBB", "\u8CBB"], /* CJK Ideograph */ + ["\u8CBC", "\u8CBC"], /* CJK Ideograph */ + ["\u8CBD", "\u8CBD"], /* CJK Ideograph */ + ["\u8CBE", "\u8CBE"], /* CJK Ideograph */ + ["\u8CBF", "\u8CBF"], /* CJK Ideograph */ + ["\u8CC0", "\u8CC0"], /* CJK Ideograph */ + ["\u8CC1", "\u8CC1"], /* CJK Ideograph */ + ["\u8CC2", "\u8CC2"], /* CJK Ideograph */ + ["\u8CC3", "\u8CC3"], /* CJK Ideograph */ + ["\u8CC4", "\u8CC4"], /* CJK Ideograph */ + ["\u8CC5", "\u8CC5"], /* CJK Ideograph */ + ["\u8CC6", "\u8CC6"], /* CJK Ideograph */ + ["\u8CC7", "\u8CC7"], /* CJK Ideograph */ + ["\u8CC8", "\u8CC8"], /* CJK Ideograph */ + ["\u8CC9", "\u8CC9"], /* CJK Ideograph */ + ["\u8CCA", "\u8CCA"], /* CJK Ideograph */ + ["\u8CCB", "\u8CCB"], /* CJK Ideograph */ + ["\u8CCC", "\u8CCC"], /* CJK Ideograph */ + ["\u8CCD", "\u8CCD"], /* CJK Ideograph */ + ["\u8CCE", "\u8CCE"], /* CJK Ideograph */ + ["\u8CCF", "\u8CCF"], /* CJK Ideograph */ + ["\u8CD0", "\u8CD0"], /* CJK Ideograph */ + ["\u8CD1", "\u8CD1"], /* CJK Ideograph */ + ["\u8CD2", "\u8CD2"], /* CJK Ideograph */ + ["\u8CD3", "\u8CD3"], /* CJK Ideograph */ + ["\u8CD4", "\u8CD4"], /* CJK Ideograph */ + ["\u8CD5", "\u8CD5"], /* CJK Ideograph */ + ["\u8CD6", "\u8CD6"], /* CJK Ideograph */ + ["\u8CD7", "\u8CD7"], /* CJK Ideograph */ + ["\u8CD8", "\u8CD8"], /* CJK Ideograph */ + ["\u8CD9", "\u8CD9"], /* CJK Ideograph */ + ["\u8CDA", "\u8CDA"], /* CJK Ideograph */ + ["\u8CDB", "\u8CDB"], /* CJK Ideograph */ + ["\u8CDC", "\u8CDC"], /* CJK Ideograph */ + ["\u8CDD", "\u8CDD"], /* CJK Ideograph */ + ["\u8CDE", "\u8CDE"], /* CJK Ideograph */ + ["\u8CDF", "\u8CDF"], /* CJK Ideograph */ + ["\u8CE0", "\u8CE0"], /* CJK Ideograph */ + ["\u8CE1", "\u8CE1"], /* CJK Ideograph */ + ["\u8CE2", "\u8CE2"], /* CJK Ideograph */ + ["\u8CE3", "\u8CE3"], /* CJK Ideograph */ + ["\u8CE4", "\u8CE4"], /* CJK Ideograph */ + ["\u8CE5", "\u8CE5"], /* CJK Ideograph */ + ["\u8CE6", "\u8CE6"], /* CJK Ideograph */ + ["\u8CE7", "\u8CE7"], /* CJK Ideograph */ + ["\u8CE8", "\u8CE8"], /* CJK Ideograph */ + ["\u8CE9", "\u8CE9"], /* CJK Ideograph */ + ["\u8CEA", "\u8CEA"], /* CJK Ideograph */ + ["\u8CEB", "\u8CEB"], /* CJK Ideograph */ + ["\u8CEC", "\u8CEC"], /* CJK Ideograph */ + ["\u8CED", "\u8CED"], /* CJK Ideograph */ + ["\u8CEE", "\u8CEE"], /* CJK Ideograph */ + ["\u8CEF", "\u8CEF"], /* CJK Ideograph */ + ["\u8CF0", "\u8CF0"], /* CJK Ideograph */ + ["\u8CF1", "\u8CF1"], /* CJK Ideograph */ + ["\u8CF2", "\u8CF2"], /* CJK Ideograph */ + ["\u8CF3", "\u8CF3"], /* CJK Ideograph */ + ["\u8CF4", "\u8CF4"], /* CJK Ideograph */ + ["\u8CF5", "\u8CF5"], /* CJK Ideograph */ + ["\u8CF6", "\u8CF6"], /* CJK Ideograph */ + ["\u8CF7", "\u8CF7"], /* CJK Ideograph */ + ["\u8CF8", "\u8CF8"], /* CJK Ideograph */ + ["\u8CF9", "\u8CF9"], /* CJK Ideograph */ + ["\u8CFA", "\u8CFA"], /* CJK Ideograph */ + ["\u8CFB", "\u8CFB"], /* CJK Ideograph */ + ["\u8CFC", "\u8CFC"], /* CJK Ideograph */ + ["\u8CFD", "\u8CFD"], /* CJK Ideograph */ + ["\u8CFE", "\u8CFE"], /* CJK Ideograph */ + ["\u8CFF", "\u8CFF"], /* CJK Ideograph */ + ["\u8D00", "\u8D00"], /* CJK Ideograph */ + ["\u8D01", "\u8D01"], /* CJK Ideograph */ + ["\u8D02", "\u8D02"], /* CJK Ideograph */ + ["\u8D03", "\u8D03"], /* CJK Ideograph */ + ["\u8D04", "\u8D04"], /* CJK Ideograph */ + ["\u8D05", "\u8D05"], /* CJK Ideograph */ + ["\u8D06", "\u8D06"], /* CJK Ideograph */ + ["\u8D07", "\u8D07"], /* CJK Ideograph */ + ["\u8D08", "\u8D08"], /* CJK Ideograph */ + ["\u8D09", "\u8D09"], /* CJK Ideograph */ + ["\u8D0A", "\u8D0A"], /* CJK Ideograph */ + ["\u8D0B", "\u8D0B"], /* CJK Ideograph */ + ["\u8D0C", "\u8D0C"], /* CJK Ideograph */ + ["\u8D0D", "\u8D0D"], /* CJK Ideograph */ + ["\u8D0E", "\u8D0E"], /* CJK Ideograph */ + ["\u8D0F", "\u8D0F"], /* CJK Ideograph */ + ["\u8D10", "\u8D10"], /* CJK Ideograph */ + ["\u8D11", "\u8D11"], /* CJK Ideograph */ + ["\u8D12", "\u8D12"], /* CJK Ideograph */ + ["\u8D13", "\u8D13"], /* CJK Ideograph */ + ["\u8D14", "\u8D14"], /* CJK Ideograph */ + ["\u8D15", "\u8D15"], /* CJK Ideograph */ + ["\u8D16", "\u8D16"], /* CJK Ideograph */ + ["\u8D17", "\u8D17"], /* CJK Ideograph */ + ["\u8D18", "\u8D18"], /* CJK Ideograph */ + ["\u8D19", "\u8D19"], /* CJK Ideograph */ + ["\u8D1A", "\u8D1A"], /* CJK Ideograph */ + ["\u8D1B", "\u8D1B"], /* CJK Ideograph */ + ["\u8D1C", "\u8D1C"], /* CJK Ideograph */ + ["\u8D1D", "\u8D1D"], /* CJK Ideograph */ + ["\u8D1E", "\u8D1E"], /* CJK Ideograph */ + ["\u8D1F", "\u8D1F"], /* CJK Ideograph */ + ["\u8D20", "\u8D20"], /* CJK Ideograph */ + ["\u8D21", "\u8D21"], /* CJK Ideograph */ + ["\u8D22", "\u8D22"], /* CJK Ideograph */ + ["\u8D23", "\u8D23"], /* CJK Ideograph */ + ["\u8D24", "\u8D24"], /* CJK Ideograph */ + ["\u8D25", "\u8D25"], /* CJK Ideograph */ + ["\u8D26", "\u8D26"], /* CJK Ideograph */ + ["\u8D27", "\u8D27"], /* CJK Ideograph */ + ["\u8D28", "\u8D28"], /* CJK Ideograph */ + ["\u8D29", "\u8D29"], /* CJK Ideograph */ + ["\u8D2A", "\u8D2A"], /* CJK Ideograph */ + ["\u8D2B", "\u8D2B"], /* CJK Ideograph */ + ["\u8D2C", "\u8D2C"], /* CJK Ideograph */ + ["\u8D2D", "\u8D2D"], /* CJK Ideograph */ + ["\u8D2E", "\u8D2E"], /* CJK Ideograph */ + ["\u8D2F", "\u8D2F"], /* CJK Ideograph */ + ["\u8D30", "\u8D30"], /* CJK Ideograph */ + ["\u8D31", "\u8D31"], /* CJK Ideograph */ + ["\u8D32", "\u8D32"], /* CJK Ideograph */ + ["\u8D33", "\u8D33"], /* CJK Ideograph */ + ["\u8D34", "\u8D34"], /* CJK Ideograph */ + ["\u8D35", "\u8D35"], /* CJK Ideograph */ + ["\u8D36", "\u8D36"], /* CJK Ideograph */ + ["\u8D37", "\u8D37"], /* CJK Ideograph */ + ["\u8D38", "\u8D38"], /* CJK Ideograph */ + ["\u8D39", "\u8D39"], /* CJK Ideograph */ + ["\u8D3A", "\u8D3A"], /* CJK Ideograph */ + ["\u8D3B", "\u8D3B"], /* CJK Ideograph */ + ["\u8D3C", "\u8D3C"], /* CJK Ideograph */ + ["\u8D3D", "\u8D3D"], /* CJK Ideograph */ + ["\u8D3E", "\u8D3E"], /* CJK Ideograph */ + ["\u8D3F", "\u8D3F"], /* CJK Ideograph */ + ["\u8D40", "\u8D40"], /* CJK Ideograph */ + ["\u8D41", "\u8D41"], /* CJK Ideograph */ + ["\u8D42", "\u8D42"], /* CJK Ideograph */ + ["\u8D43", "\u8D43"], /* CJK Ideograph */ + ["\u8D44", "\u8D44"], /* CJK Ideograph */ + ["\u8D45", "\u8D45"], /* CJK Ideograph */ + ["\u8D46", "\u8D46"], /* CJK Ideograph */ + ["\u8D47", "\u8D47"], /* CJK Ideograph */ + ["\u8D48", "\u8D48"], /* CJK Ideograph */ + ["\u8D49", "\u8D49"], /* CJK Ideograph */ + ["\u8D4A", "\u8D4A"], /* CJK Ideograph */ + ["\u8D4B", "\u8D4B"], /* CJK Ideograph */ + ["\u8D4C", "\u8D4C"], /* CJK Ideograph */ + ["\u8D4D", "\u8D4D"], /* CJK Ideograph */ + ["\u8D4E", "\u8D4E"], /* CJK Ideograph */ + ["\u8D4F", "\u8D4F"], /* CJK Ideograph */ + ["\u8D50", "\u8D50"], /* CJK Ideograph */ + ["\u8D51", "\u8D51"], /* CJK Ideograph */ + ["\u8D52", "\u8D52"], /* CJK Ideograph */ + ["\u8D53", "\u8D53"], /* CJK Ideograph */ + ["\u8D54", "\u8D54"], /* CJK Ideograph */ + ["\u8D55", "\u8D55"], /* CJK Ideograph */ + ["\u8D56", "\u8D56"], /* CJK Ideograph */ + ["\u8D57", "\u8D57"], /* CJK Ideograph */ + ["\u8D58", "\u8D58"], /* CJK Ideograph */ + ["\u8D59", "\u8D59"], /* CJK Ideograph */ + ["\u8D5A", "\u8D5A"], /* CJK Ideograph */ + ["\u8D5B", "\u8D5B"], /* CJK Ideograph */ + ["\u8D5C", "\u8D5C"], /* CJK Ideograph */ + ["\u8D5D", "\u8D5D"], /* CJK Ideograph */ + ["\u8D5E", "\u8D5E"], /* CJK Ideograph */ + ["\u8D5F", "\u8D5F"], /* CJK Ideograph */ + ["\u8D60", "\u8D60"], /* CJK Ideograph */ + ["\u8D61", "\u8D61"], /* CJK Ideograph */ + ["\u8D62", "\u8D62"], /* CJK Ideograph */ + ["\u8D63", "\u8D63"], /* CJK Ideograph */ + ["\u8D64", "\u8D64"], /* CJK Ideograph */ + ["\u8D65", "\u8D65"], /* CJK Ideograph */ + ["\u8D66", "\u8D66"], /* CJK Ideograph */ + ["\u8D67", "\u8D67"], /* CJK Ideograph */ + ["\u8D68", "\u8D68"], /* CJK Ideograph */ + ["\u8D69", "\u8D69"], /* CJK Ideograph */ + ["\u8D6A", "\u8D6A"], /* CJK Ideograph */ + ["\u8D6B", "\u8D6B"], /* CJK Ideograph */ + ["\u8D6C", "\u8D6C"], /* CJK Ideograph */ + ["\u8D6D", "\u8D6D"], /* CJK Ideograph */ + ["\u8D6E", "\u8D6E"], /* CJK Ideograph */ + ["\u8D6F", "\u8D6F"], /* CJK Ideograph */ + ["\u8D70", "\u8D70"], /* CJK Ideograph */ + ["\u8D71", "\u8D71"], /* CJK Ideograph */ + ["\u8D72", "\u8D72"], /* CJK Ideograph */ + ["\u8D73", "\u8D73"], /* CJK Ideograph */ + ["\u8D74", "\u8D74"], /* CJK Ideograph */ + ["\u8D75", "\u8D75"], /* CJK Ideograph */ + ["\u8D76", "\u8D76"], /* CJK Ideograph */ + ["\u8D77", "\u8D77"], /* CJK Ideograph */ + ["\u8D78", "\u8D78"], /* CJK Ideograph */ + ["\u8D79", "\u8D79"], /* CJK Ideograph */ + ["\u8D7A", "\u8D7A"], /* CJK Ideograph */ + ["\u8D7B", "\u8D7B"], /* CJK Ideograph */ + ["\u8D7C", "\u8D7C"], /* CJK Ideograph */ + ["\u8D7D", "\u8D7D"], /* CJK Ideograph */ + ["\u8D7E", "\u8D7E"], /* CJK Ideograph */ + ["\u8D7F", "\u8D7F"], /* CJK Ideograph */ + ["\u8D80", "\u8D80"], /* CJK Ideograph */ + ["\u8D81", "\u8D81"], /* CJK Ideograph */ + ["\u8D82", "\u8D82"], /* CJK Ideograph */ + ["\u8D83", "\u8D83"], /* CJK Ideograph */ + ["\u8D84", "\u8D84"], /* CJK Ideograph */ + ["\u8D85", "\u8D85"], /* CJK Ideograph */ + ["\u8D86", "\u8D86"], /* CJK Ideograph */ + ["\u8D87", "\u8D87"], /* CJK Ideograph */ + ["\u8D88", "\u8D88"], /* CJK Ideograph */ + ["\u8D89", "\u8D89"], /* CJK Ideograph */ + ["\u8D8A", "\u8D8A"], /* CJK Ideograph */ + ["\u8D8B", "\u8D8B"], /* CJK Ideograph */ + ["\u8D8C", "\u8D8C"], /* CJK Ideograph */ + ["\u8D8D", "\u8D8D"], /* CJK Ideograph */ + ["\u8D8E", "\u8D8E"], /* CJK Ideograph */ + ["\u8D8F", "\u8D8F"], /* CJK Ideograph */ + ["\u8D90", "\u8D90"], /* CJK Ideograph */ + ["\u8D91", "\u8D91"], /* CJK Ideograph */ + ["\u8D92", "\u8D92"], /* CJK Ideograph */ + ["\u8D93", "\u8D93"], /* CJK Ideograph */ + ["\u8D94", "\u8D94"], /* CJK Ideograph */ + ["\u8D95", "\u8D95"], /* CJK Ideograph */ + ["\u8D96", "\u8D96"], /* CJK Ideograph */ + ["\u8D97", "\u8D97"], /* CJK Ideograph */ + ["\u8D98", "\u8D98"], /* CJK Ideograph */ + ["\u8D99", "\u8D99"], /* CJK Ideograph */ + ["\u8D9A", "\u8D9A"], /* CJK Ideograph */ + ["\u8D9B", "\u8D9B"], /* CJK Ideograph */ + ["\u8D9C", "\u8D9C"], /* CJK Ideograph */ + ["\u8D9D", "\u8D9D"], /* CJK Ideograph */ + ["\u8D9E", "\u8D9E"], /* CJK Ideograph */ + ["\u8D9F", "\u8D9F"], /* CJK Ideograph */ + ["\u8DA0", "\u8DA0"], /* CJK Ideograph */ + ["\u8DA1", "\u8DA1"], /* CJK Ideograph */ + ["\u8DA2", "\u8DA2"], /* CJK Ideograph */ + ["\u8DA3", "\u8DA3"], /* CJK Ideograph */ + ["\u8DA4", "\u8DA4"], /* CJK Ideograph */ + ["\u8DA5", "\u8DA5"], /* CJK Ideograph */ + ["\u8DA6", "\u8DA6"], /* CJK Ideograph */ + ["\u8DA7", "\u8DA7"], /* CJK Ideograph */ + ["\u8DA8", "\u8DA8"], /* CJK Ideograph */ + ["\u8DA9", "\u8DA9"], /* CJK Ideograph */ + ["\u8DAA", "\u8DAA"], /* CJK Ideograph */ + ["\u8DAB", "\u8DAB"], /* CJK Ideograph */ + ["\u8DAC", "\u8DAC"], /* CJK Ideograph */ + ["\u8DAD", "\u8DAD"], /* CJK Ideograph */ + ["\u8DAE", "\u8DAE"], /* CJK Ideograph */ + ["\u8DAF", "\u8DAF"], /* CJK Ideograph */ + ["\u8DB0", "\u8DB0"], /* CJK Ideograph */ + ["\u8DB1", "\u8DB1"], /* CJK Ideograph */ + ["\u8DB2", "\u8DB2"], /* CJK Ideograph */ + ["\u8DB3", "\u8DB3"], /* CJK Ideograph */ + ["\u8DB4", "\u8DB4"], /* CJK Ideograph */ + ["\u8DB5", "\u8DB5"], /* CJK Ideograph */ + ["\u8DB6", "\u8DB6"], /* CJK Ideograph */ + ["\u8DB7", "\u8DB7"], /* CJK Ideograph */ + ["\u8DB8", "\u8DB8"], /* CJK Ideograph */ + ["\u8DB9", "\u8DB9"], /* CJK Ideograph */ + ["\u8DBA", "\u8DBA"], /* CJK Ideograph */ + ["\u8DBB", "\u8DBB"], /* CJK Ideograph */ + ["\u8DBC", "\u8DBC"], /* CJK Ideograph */ + ["\u8DBD", "\u8DBD"], /* CJK Ideograph */ + ["\u8DBE", "\u8DBE"], /* CJK Ideograph */ + ["\u8DBF", "\u8DBF"], /* CJK Ideograph */ + ["\u8DC0", "\u8DC0"], /* CJK Ideograph */ + ["\u8DC1", "\u8DC1"], /* CJK Ideograph */ + ["\u8DC2", "\u8DC2"], /* CJK Ideograph */ + ["\u8DC3", "\u8DC3"], /* CJK Ideograph */ + ["\u8DC4", "\u8DC4"], /* CJK Ideograph */ + ["\u8DC5", "\u8DC5"], /* CJK Ideograph */ + ["\u8DC6", "\u8DC6"], /* CJK Ideograph */ + ["\u8DC7", "\u8DC7"], /* CJK Ideograph */ + ["\u8DC8", "\u8DC8"], /* CJK Ideograph */ + ["\u8DC9", "\u8DC9"], /* CJK Ideograph */ + ["\u8DCA", "\u8DCA"], /* CJK Ideograph */ + ["\u8DCB", "\u8DCB"], /* CJK Ideograph */ + ["\u8DCC", "\u8DCC"], /* CJK Ideograph */ + ["\u8DCD", "\u8DCD"], /* CJK Ideograph */ + ["\u8DCE", "\u8DCE"], /* CJK Ideograph */ + ["\u8DCF", "\u8DCF"], /* CJK Ideograph */ + ["\u8DD0", "\u8DD0"], /* CJK Ideograph */ + ["\u8DD1", "\u8DD1"], /* CJK Ideograph */ + ["\u8DD2", "\u8DD2"], /* CJK Ideograph */ + ["\u8DD3", "\u8DD3"], /* CJK Ideograph */ + ["\u8DD4", "\u8DD4"], /* CJK Ideograph */ + ["\u8DD5", "\u8DD5"], /* CJK Ideograph */ + ["\u8DD6", "\u8DD6"], /* CJK Ideograph */ + ["\u8DD7", "\u8DD7"], /* CJK Ideograph */ + ["\u8DD8", "\u8DD8"], /* CJK Ideograph */ + ["\u8DD9", "\u8DD9"], /* CJK Ideograph */ + ["\u8DDA", "\u8DDA"], /* CJK Ideograph */ + ["\u8DDB", "\u8DDB"], /* CJK Ideograph */ + ["\u8DDC", "\u8DDC"], /* CJK Ideograph */ + ["\u8DDD", "\u8DDD"], /* CJK Ideograph */ + ["\u8DDE", "\u8DDE"], /* CJK Ideograph */ + ["\u8DDF", "\u8DDF"], /* CJK Ideograph */ + ["\u8DE0", "\u8DE0"], /* CJK Ideograph */ + ["\u8DE1", "\u8DE1"], /* CJK Ideograph */ + ["\u8DE2", "\u8DE2"], /* CJK Ideograph */ + ["\u8DE3", "\u8DE3"], /* CJK Ideograph */ + ["\u8DE4", "\u8DE4"], /* CJK Ideograph */ + ["\u8DE5", "\u8DE5"], /* CJK Ideograph */ + ["\u8DE6", "\u8DE6"], /* CJK Ideograph */ + ["\u8DE7", "\u8DE7"], /* CJK Ideograph */ + ["\u8DE8", "\u8DE8"], /* CJK Ideograph */ + ["\u8DE9", "\u8DE9"], /* CJK Ideograph */ + ["\u8DEA", "\u8DEA"], /* CJK Ideograph */ + ["\u8DEB", "\u8DEB"], /* CJK Ideograph */ + ["\u8DEC", "\u8DEC"], /* CJK Ideograph */ + ["\u8DED", "\u8DED"], /* CJK Ideograph */ + ["\u8DEE", "\u8DEE"], /* CJK Ideograph */ + ["\u8DEF", "\u8DEF"], /* CJK Ideograph */ + ["\u8DF0", "\u8DF0"], /* CJK Ideograph */ + ["\u8DF1", "\u8DF1"], /* CJK Ideograph */ + ["\u8DF2", "\u8DF2"], /* CJK Ideograph */ + ["\u8DF3", "\u8DF3"], /* CJK Ideograph */ + ["\u8DF4", "\u8DF4"], /* CJK Ideograph */ + ["\u8DF5", "\u8DF5"], /* CJK Ideograph */ + ["\u8DF6", "\u8DF6"], /* CJK Ideograph */ + ["\u8DF7", "\u8DF7"], /* CJK Ideograph */ + ["\u8DF8", "\u8DF8"], /* CJK Ideograph */ + ["\u8DF9", "\u8DF9"], /* CJK Ideograph */ + ["\u8DFA", "\u8DFA"], /* CJK Ideograph */ + ["\u8DFB", "\u8DFB"], /* CJK Ideograph */ + ["\u8DFC", "\u8DFC"], /* CJK Ideograph */ + ["\u8DFD", "\u8DFD"], /* CJK Ideograph */ + ["\u8DFE", "\u8DFE"], /* CJK Ideograph */ + ["\u8DFF", "\u8DFF"], /* CJK Ideograph */ + ["\u8E00", "\u8E00"], /* CJK Ideograph */ + ["\u8E01", "\u8E01"], /* CJK Ideograph */ + ["\u8E02", "\u8E02"], /* CJK Ideograph */ + ["\u8E03", "\u8E03"], /* CJK Ideograph */ + ["\u8E04", "\u8E04"], /* CJK Ideograph */ + ["\u8E05", "\u8E05"], /* CJK Ideograph */ + ["\u8E06", "\u8E06"], /* CJK Ideograph */ + ["\u8E07", "\u8E07"], /* CJK Ideograph */ + ["\u8E08", "\u8E08"], /* CJK Ideograph */ + ["\u8E09", "\u8E09"], /* CJK Ideograph */ + ["\u8E0A", "\u8E0A"], /* CJK Ideograph */ + ["\u8E0B", "\u8E0B"], /* CJK Ideograph */ + ["\u8E0C", "\u8E0C"], /* CJK Ideograph */ + ["\u8E0D", "\u8E0D"], /* CJK Ideograph */ + ["\u8E0E", "\u8E0E"], /* CJK Ideograph */ + ["\u8E0F", "\u8E0F"], /* CJK Ideograph */ + ["\u8E10", "\u8E10"], /* CJK Ideograph */ + ["\u8E11", "\u8E11"], /* CJK Ideograph */ + ["\u8E12", "\u8E12"], /* CJK Ideograph */ + ["\u8E13", "\u8E13"], /* CJK Ideograph */ + ["\u8E14", "\u8E14"], /* CJK Ideograph */ + ["\u8E15", "\u8E15"], /* CJK Ideograph */ + ["\u8E16", "\u8E16"], /* CJK Ideograph */ + ["\u8E17", "\u8E17"], /* CJK Ideograph */ + ["\u8E18", "\u8E18"], /* CJK Ideograph */ + ["\u8E19", "\u8E19"], /* CJK Ideograph */ + ["\u8E1A", "\u8E1A"], /* CJK Ideograph */ + ["\u8E1B", "\u8E1B"], /* CJK Ideograph */ + ["\u8E1C", "\u8E1C"], /* CJK Ideograph */ + ["\u8E1D", "\u8E1D"], /* CJK Ideograph */ + ["\u8E1E", "\u8E1E"], /* CJK Ideograph */ + ["\u8E1F", "\u8E1F"], /* CJK Ideograph */ + ["\u8E20", "\u8E20"], /* CJK Ideograph */ + ["\u8E21", "\u8E21"], /* CJK Ideograph */ + ["\u8E22", "\u8E22"], /* CJK Ideograph */ + ["\u8E23", "\u8E23"], /* CJK Ideograph */ + ["\u8E24", "\u8E24"], /* CJK Ideograph */ + ["\u8E25", "\u8E25"], /* CJK Ideograph */ + ["\u8E26", "\u8E26"], /* CJK Ideograph */ + ["\u8E27", "\u8E27"], /* CJK Ideograph */ + ["\u8E28", "\u8E28"], /* CJK Ideograph */ + ["\u8E29", "\u8E29"], /* CJK Ideograph */ + ["\u8E2A", "\u8E2A"], /* CJK Ideograph */ + ["\u8E2B", "\u8E2B"], /* CJK Ideograph */ + ["\u8E2C", "\u8E2C"], /* CJK Ideograph */ + ["\u8E2D", "\u8E2D"], /* CJK Ideograph */ + ["\u8E2E", "\u8E2E"], /* CJK Ideograph */ + ["\u8E2F", "\u8E2F"], /* CJK Ideograph */ + ["\u8E30", "\u8E30"], /* CJK Ideograph */ + ["\u8E31", "\u8E31"], /* CJK Ideograph */ + ["\u8E32", "\u8E32"], /* CJK Ideograph */ + ["\u8E33", "\u8E33"], /* CJK Ideograph */ + ["\u8E34", "\u8E34"], /* CJK Ideograph */ + ["\u8E35", "\u8E35"], /* CJK Ideograph */ + ["\u8E36", "\u8E36"], /* CJK Ideograph */ + ["\u8E37", "\u8E37"], /* CJK Ideograph */ + ["\u8E38", "\u8E38"], /* CJK Ideograph */ + ["\u8E39", "\u8E39"], /* CJK Ideograph */ + ["\u8E3A", "\u8E3A"], /* CJK Ideograph */ + ["\u8E3B", "\u8E3B"], /* CJK Ideograph */ + ["\u8E3C", "\u8E3C"], /* CJK Ideograph */ + ["\u8E3D", "\u8E3D"], /* CJK Ideograph */ + ["\u8E3E", "\u8E3E"], /* CJK Ideograph */ + ["\u8E3F", "\u8E3F"], /* CJK Ideograph */ + ["\u8E40", "\u8E40"], /* CJK Ideograph */ + ["\u8E41", "\u8E41"], /* CJK Ideograph */ + ["\u8E42", "\u8E42"], /* CJK Ideograph */ + ["\u8E43", "\u8E43"], /* CJK Ideograph */ + ["\u8E44", "\u8E44"], /* CJK Ideograph */ + ["\u8E45", "\u8E45"], /* CJK Ideograph */ + ["\u8E46", "\u8E46"], /* CJK Ideograph */ + ["\u8E47", "\u8E47"], /* CJK Ideograph */ + ["\u8E48", "\u8E48"], /* CJK Ideograph */ + ["\u8E49", "\u8E49"], /* CJK Ideograph */ + ["\u8E4A", "\u8E4A"], /* CJK Ideograph */ + ["\u8E4B", "\u8E4B"], /* CJK Ideograph */ + ["\u8E4C", "\u8E4C"], /* CJK Ideograph */ + ["\u8E4D", "\u8E4D"], /* CJK Ideograph */ + ["\u8E4E", "\u8E4E"], /* CJK Ideograph */ + ["\u8E4F", "\u8E4F"], /* CJK Ideograph */ + ["\u8E50", "\u8E50"], /* CJK Ideograph */ + ["\u8E51", "\u8E51"], /* CJK Ideograph */ + ["\u8E52", "\u8E52"], /* CJK Ideograph */ + ["\u8E53", "\u8E53"], /* CJK Ideograph */ + ["\u8E54", "\u8E54"], /* CJK Ideograph */ + ["\u8E55", "\u8E55"], /* CJK Ideograph */ + ["\u8E56", "\u8E56"], /* CJK Ideograph */ + ["\u8E57", "\u8E57"], /* CJK Ideograph */ + ["\u8E58", "\u8E58"], /* CJK Ideograph */ + ["\u8E59", "\u8E59"], /* CJK Ideograph */ + ["\u8E5A", "\u8E5A"], /* CJK Ideograph */ + ["\u8E5B", "\u8E5B"], /* CJK Ideograph */ + ["\u8E5C", "\u8E5C"], /* CJK Ideograph */ + ["\u8E5D", "\u8E5D"], /* CJK Ideograph */ + ["\u8E5E", "\u8E5E"], /* CJK Ideograph */ + ["\u8E5F", "\u8E5F"], /* CJK Ideograph */ + ["\u8E60", "\u8E60"], /* CJK Ideograph */ + ["\u8E61", "\u8E61"], /* CJK Ideograph */ + ["\u8E62", "\u8E62"], /* CJK Ideograph */ + ["\u8E63", "\u8E63"], /* CJK Ideograph */ + ["\u8E64", "\u8E64"], /* CJK Ideograph */ + ["\u8E65", "\u8E65"], /* CJK Ideograph */ + ["\u8E66", "\u8E66"], /* CJK Ideograph */ + ["\u8E67", "\u8E67"], /* CJK Ideograph */ + ["\u8E68", "\u8E68"], /* CJK Ideograph */ + ["\u8E69", "\u8E69"], /* CJK Ideograph */ + ["\u8E6A", "\u8E6A"], /* CJK Ideograph */ + ["\u8E6B", "\u8E6B"], /* CJK Ideograph */ + ["\u8E6C", "\u8E6C"], /* CJK Ideograph */ + ["\u8E6D", "\u8E6D"], /* CJK Ideograph */ + ["\u8E6E", "\u8E6E"], /* CJK Ideograph */ + ["\u8E6F", "\u8E6F"], /* CJK Ideograph */ + ["\u8E70", "\u8E70"], /* CJK Ideograph */ + ["\u8E71", "\u8E71"], /* CJK Ideograph */ + ["\u8E72", "\u8E72"], /* CJK Ideograph */ + ["\u8E73", "\u8E73"], /* CJK Ideograph */ + ["\u8E74", "\u8E74"], /* CJK Ideograph */ + ["\u8E75", "\u8E75"], /* CJK Ideograph */ + ["\u8E76", "\u8E76"], /* CJK Ideograph */ + ["\u8E77", "\u8E77"], /* CJK Ideograph */ + ["\u8E78", "\u8E78"], /* CJK Ideograph */ + ["\u8E79", "\u8E79"], /* CJK Ideograph */ + ["\u8E7A", "\u8E7A"], /* CJK Ideograph */ + ["\u8E7B", "\u8E7B"], /* CJK Ideograph */ + ["\u8E7C", "\u8E7C"], /* CJK Ideograph */ + ["\u8E7D", "\u8E7D"], /* CJK Ideograph */ + ["\u8E7E", "\u8E7E"], /* CJK Ideograph */ + ["\u8E7F", "\u8E7F"], /* CJK Ideograph */ + ["\u8E80", "\u8E80"], /* CJK Ideograph */ + ["\u8E81", "\u8E81"], /* CJK Ideograph */ + ["\u8E82", "\u8E82"], /* CJK Ideograph */ + ["\u8E83", "\u8E83"], /* CJK Ideograph */ + ["\u8E84", "\u8E84"], /* CJK Ideograph */ + ["\u8E85", "\u8E85"], /* CJK Ideograph */ + ["\u8E86", "\u8E86"], /* CJK Ideograph */ + ["\u8E87", "\u8E87"], /* CJK Ideograph */ + ["\u8E88", "\u8E88"], /* CJK Ideograph */ + ["\u8E89", "\u8E89"], /* CJK Ideograph */ + ["\u8E8A", "\u8E8A"], /* CJK Ideograph */ + ["\u8E8B", "\u8E8B"], /* CJK Ideograph */ + ["\u8E8C", "\u8E8C"], /* CJK Ideograph */ + ["\u8E8D", "\u8E8D"], /* CJK Ideograph */ + ["\u8E8E", "\u8E8E"], /* CJK Ideograph */ + ["\u8E8F", "\u8E8F"], /* CJK Ideograph */ + ["\u8E90", "\u8E90"], /* CJK Ideograph */ + ["\u8E91", "\u8E91"], /* CJK Ideograph */ + ["\u8E92", "\u8E92"], /* CJK Ideograph */ + ["\u8E93", "\u8E93"], /* CJK Ideograph */ + ["\u8E94", "\u8E94"], /* CJK Ideograph */ + ["\u8E95", "\u8E95"], /* CJK Ideograph */ + ["\u8E96", "\u8E96"], /* CJK Ideograph */ + ["\u8E97", "\u8E97"], /* CJK Ideograph */ + ["\u8E98", "\u8E98"], /* CJK Ideograph */ + ["\u8E99", "\u8E99"], /* CJK Ideograph */ + ["\u8E9A", "\u8E9A"], /* CJK Ideograph */ + ["\u8E9B", "\u8E9B"], /* CJK Ideograph */ + ["\u8E9C", "\u8E9C"], /* CJK Ideograph */ + ["\u8E9D", "\u8E9D"], /* CJK Ideograph */ + ["\u8E9E", "\u8E9E"], /* CJK Ideograph */ + ["\u8E9F", "\u8E9F"], /* CJK Ideograph */ + ["\u8EA0", "\u8EA0"], /* CJK Ideograph */ + ["\u8EA1", "\u8EA1"], /* CJK Ideograph */ + ["\u8EA2", "\u8EA2"], /* CJK Ideograph */ + ["\u8EA3", "\u8EA3"], /* CJK Ideograph */ + ["\u8EA4", "\u8EA4"], /* CJK Ideograph */ + ["\u8EA5", "\u8EA5"], /* CJK Ideograph */ + ["\u8EA6", "\u8EA6"], /* CJK Ideograph */ + ["\u8EA7", "\u8EA7"], /* CJK Ideograph */ + ["\u8EA8", "\u8EA8"], /* CJK Ideograph */ + ["\u8EA9", "\u8EA9"], /* CJK Ideograph */ + ["\u8EAA", "\u8EAA"], /* CJK Ideograph */ + ["\u8EAB", "\u8EAB"], /* CJK Ideograph */ + ["\u8EAC", "\u8EAC"], /* CJK Ideograph */ + ["\u8EAD", "\u8EAD"], /* CJK Ideograph */ + ["\u8EAE", "\u8EAE"], /* CJK Ideograph */ + ["\u8EAF", "\u8EAF"], /* CJK Ideograph */ + ["\u8EB0", "\u8EB0"], /* CJK Ideograph */ + ["\u8EB1", "\u8EB1"], /* CJK Ideograph */ + ["\u8EB2", "\u8EB2"], /* CJK Ideograph */ + ["\u8EB3", "\u8EB3"], /* CJK Ideograph */ + ["\u8EB4", "\u8EB4"], /* CJK Ideograph */ + ["\u8EB5", "\u8EB5"], /* CJK Ideograph */ + ["\u8EB6", "\u8EB6"], /* CJK Ideograph */ + ["\u8EB7", "\u8EB7"], /* CJK Ideograph */ + ["\u8EB8", "\u8EB8"], /* CJK Ideograph */ + ["\u8EB9", "\u8EB9"], /* CJK Ideograph */ + ["\u8EBA", "\u8EBA"], /* CJK Ideograph */ + ["\u8EBB", "\u8EBB"], /* CJK Ideograph */ + ["\u8EBC", "\u8EBC"], /* CJK Ideograph */ + ["\u8EBD", "\u8EBD"], /* CJK Ideograph */ + ["\u8EBE", "\u8EBE"], /* CJK Ideograph */ + ["\u8EBF", "\u8EBF"], /* CJK Ideograph */ + ["\u8EC0", "\u8EC0"], /* CJK Ideograph */ + ["\u8EC1", "\u8EC1"], /* CJK Ideograph */ + ["\u8EC2", "\u8EC2"], /* CJK Ideograph */ + ["\u8EC3", "\u8EC3"], /* CJK Ideograph */ + ["\u8EC4", "\u8EC4"], /* CJK Ideograph */ + ["\u8EC5", "\u8EC5"], /* CJK Ideograph */ + ["\u8EC6", "\u8EC6"], /* CJK Ideograph */ + ["\u8EC7", "\u8EC7"], /* CJK Ideograph */ + ["\u8EC8", "\u8EC8"], /* CJK Ideograph */ + ["\u8EC9", "\u8EC9"], /* CJK Ideograph */ + ["\u8ECA", "\u8ECA"], /* CJK Ideograph */ + ["\u8ECB", "\u8ECB"], /* CJK Ideograph */ + ["\u8ECC", "\u8ECC"], /* CJK Ideograph */ + ["\u8ECD", "\u8ECD"], /* CJK Ideograph */ + ["\u8ECE", "\u8ECE"], /* CJK Ideograph */ + ["\u8ECF", "\u8ECF"], /* CJK Ideograph */ + ["\u8ED0", "\u8ED0"], /* CJK Ideograph */ + ["\u8ED1", "\u8ED1"], /* CJK Ideograph */ + ["\u8ED2", "\u8ED2"], /* CJK Ideograph */ + ["\u8ED3", "\u8ED3"], /* CJK Ideograph */ + ["\u8ED4", "\u8ED4"], /* CJK Ideograph */ + ["\u8ED5", "\u8ED5"], /* CJK Ideograph */ + ["\u8ED6", "\u8ED6"], /* CJK Ideograph */ + ["\u8ED7", "\u8ED7"], /* CJK Ideograph */ + ["\u8ED8", "\u8ED8"], /* CJK Ideograph */ + ["\u8ED9", "\u8ED9"], /* CJK Ideograph */ + ["\u8EDA", "\u8EDA"], /* CJK Ideograph */ + ["\u8EDB", "\u8EDB"], /* CJK Ideograph */ + ["\u8EDC", "\u8EDC"], /* CJK Ideograph */ + ["\u8EDD", "\u8EDD"], /* CJK Ideograph */ + ["\u8EDE", "\u8EDE"], /* CJK Ideograph */ + ["\u8EDF", "\u8EDF"], /* CJK Ideograph */ + ["\u8EE0", "\u8EE0"], /* CJK Ideograph */ + ["\u8EE1", "\u8EE1"], /* CJK Ideograph */ + ["\u8EE2", "\u8EE2"], /* CJK Ideograph */ + ["\u8EE3", "\u8EE3"], /* CJK Ideograph */ + ["\u8EE4", "\u8EE4"], /* CJK Ideograph */ + ["\u8EE5", "\u8EE5"], /* CJK Ideograph */ + ["\u8EE6", "\u8EE6"], /* CJK Ideograph */ + ["\u8EE7", "\u8EE7"], /* CJK Ideograph */ + ["\u8EE8", "\u8EE8"], /* CJK Ideograph */ + ["\u8EE9", "\u8EE9"], /* CJK Ideograph */ + ["\u8EEA", "\u8EEA"], /* CJK Ideograph */ + ["\u8EEB", "\u8EEB"], /* CJK Ideograph */ + ["\u8EEC", "\u8EEC"], /* CJK Ideograph */ + ["\u8EED", "\u8EED"], /* CJK Ideograph */ + ["\u8EEE", "\u8EEE"], /* CJK Ideograph */ + ["\u8EEF", "\u8EEF"], /* CJK Ideograph */ + ["\u8EF0", "\u8EF0"], /* CJK Ideograph */ + ["\u8EF1", "\u8EF1"], /* CJK Ideograph */ + ["\u8EF2", "\u8EF2"], /* CJK Ideograph */ + ["\u8EF3", "\u8EF3"], /* CJK Ideograph */ + ["\u8EF4", "\u8EF4"], /* CJK Ideograph */ + ["\u8EF5", "\u8EF5"], /* CJK Ideograph */ + ["\u8EF6", "\u8EF6"], /* CJK Ideograph */ + ["\u8EF7", "\u8EF7"], /* CJK Ideograph */ + ["\u8EF8", "\u8EF8"], /* CJK Ideograph */ + ["\u8EF9", "\u8EF9"], /* CJK Ideograph */ + ["\u8EFA", "\u8EFA"], /* CJK Ideograph */ + ["\u8EFB", "\u8EFB"], /* CJK Ideograph */ + ["\u8EFC", "\u8EFC"], /* CJK Ideograph */ + ["\u8EFD", "\u8EFD"], /* CJK Ideograph */ + ["\u8EFE", "\u8EFE"], /* CJK Ideograph */ + ["\u8EFF", "\u8EFF"], /* CJK Ideograph */ + ["\u8F00", "\u8F00"], /* CJK Ideograph */ + ["\u8F01", "\u8F01"], /* CJK Ideograph */ + ["\u8F02", "\u8F02"], /* CJK Ideograph */ + ["\u8F03", "\u8F03"], /* CJK Ideograph */ + ["\u8F04", "\u8F04"], /* CJK Ideograph */ + ["\u8F05", "\u8F05"], /* CJK Ideograph */ + ["\u8F06", "\u8F06"], /* CJK Ideograph */ + ["\u8F07", "\u8F07"], /* CJK Ideograph */ + ["\u8F08", "\u8F08"], /* CJK Ideograph */ + ["\u8F09", "\u8F09"], /* CJK Ideograph */ + ["\u8F0A", "\u8F0A"], /* CJK Ideograph */ + ["\u8F0B", "\u8F0B"], /* CJK Ideograph */ + ["\u8F0C", "\u8F0C"], /* CJK Ideograph */ + ["\u8F0D", "\u8F0D"], /* CJK Ideograph */ + ["\u8F0E", "\u8F0E"], /* CJK Ideograph */ + ["\u8F0F", "\u8F0F"], /* CJK Ideograph */ + ["\u8F10", "\u8F10"], /* CJK Ideograph */ + ["\u8F11", "\u8F11"], /* CJK Ideograph */ + ["\u8F12", "\u8F12"], /* CJK Ideograph */ + ["\u8F13", "\u8F13"], /* CJK Ideograph */ + ["\u8F14", "\u8F14"], /* CJK Ideograph */ + ["\u8F15", "\u8F15"], /* CJK Ideograph */ + ["\u8F16", "\u8F16"], /* CJK Ideograph */ + ["\u8F17", "\u8F17"], /* CJK Ideograph */ + ["\u8F18", "\u8F18"], /* CJK Ideograph */ + ["\u8F19", "\u8F19"], /* CJK Ideograph */ + ["\u8F1A", "\u8F1A"], /* CJK Ideograph */ + ["\u8F1B", "\u8F1B"], /* CJK Ideograph */ + ["\u8F1C", "\u8F1C"], /* CJK Ideograph */ + ["\u8F1D", "\u8F1D"], /* CJK Ideograph */ + ["\u8F1E", "\u8F1E"], /* CJK Ideograph */ + ["\u8F1F", "\u8F1F"], /* CJK Ideograph */ + ["\u8F20", "\u8F20"], /* CJK Ideograph */ + ["\u8F21", "\u8F21"], /* CJK Ideograph */ + ["\u8F22", "\u8F22"], /* CJK Ideograph */ + ["\u8F23", "\u8F23"], /* CJK Ideograph */ + ["\u8F24", "\u8F24"], /* CJK Ideograph */ + ["\u8F25", "\u8F25"], /* CJK Ideograph */ + ["\u8F26", "\u8F26"], /* CJK Ideograph */ + ["\u8F27", "\u8F27"], /* CJK Ideograph */ + ["\u8F28", "\u8F28"], /* CJK Ideograph */ + ["\u8F29", "\u8F29"], /* CJK Ideograph */ + ["\u8F2A", "\u8F2A"], /* CJK Ideograph */ + ["\u8F2B", "\u8F2B"], /* CJK Ideograph */ + ["\u8F2C", "\u8F2C"], /* CJK Ideograph */ + ["\u8F2D", "\u8F2D"], /* CJK Ideograph */ + ["\u8F2E", "\u8F2E"], /* CJK Ideograph */ + ["\u8F2F", "\u8F2F"], /* CJK Ideograph */ + ["\u8F30", "\u8F30"], /* CJK Ideograph */ + ["\u8F31", "\u8F31"], /* CJK Ideograph */ + ["\u8F32", "\u8F32"], /* CJK Ideograph */ + ["\u8F33", "\u8F33"], /* CJK Ideograph */ + ["\u8F34", "\u8F34"], /* CJK Ideograph */ + ["\u8F35", "\u8F35"], /* CJK Ideograph */ + ["\u8F36", "\u8F36"], /* CJK Ideograph */ + ["\u8F37", "\u8F37"], /* CJK Ideograph */ + ["\u8F38", "\u8F38"], /* CJK Ideograph */ + ["\u8F39", "\u8F39"], /* CJK Ideograph */ + ["\u8F3A", "\u8F3A"], /* CJK Ideograph */ + ["\u8F3B", "\u8F3B"], /* CJK Ideograph */ + ["\u8F3C", "\u8F3C"], /* CJK Ideograph */ + ["\u8F3D", "\u8F3D"], /* CJK Ideograph */ + ["\u8F3E", "\u8F3E"], /* CJK Ideograph */ + ["\u8F3F", "\u8F3F"], /* CJK Ideograph */ + ["\u8F40", "\u8F40"], /* CJK Ideograph */ + ["\u8F41", "\u8F41"], /* CJK Ideograph */ + ["\u8F42", "\u8F42"], /* CJK Ideograph */ + ["\u8F43", "\u8F43"], /* CJK Ideograph */ + ["\u8F44", "\u8F44"], /* CJK Ideograph */ + ["\u8F45", "\u8F45"], /* CJK Ideograph */ + ["\u8F46", "\u8F46"], /* CJK Ideograph */ + ["\u8F47", "\u8F47"], /* CJK Ideograph */ + ["\u8F48", "\u8F48"], /* CJK Ideograph */ + ["\u8F49", "\u8F49"], /* CJK Ideograph */ + ["\u8F4A", "\u8F4A"], /* CJK Ideograph */ + ["\u8F4B", "\u8F4B"], /* CJK Ideograph */ + ["\u8F4C", "\u8F4C"], /* CJK Ideograph */ + ["\u8F4D", "\u8F4D"], /* CJK Ideograph */ + ["\u8F4E", "\u8F4E"], /* CJK Ideograph */ + ["\u8F4F", "\u8F4F"], /* CJK Ideograph */ + ["\u8F50", "\u8F50"], /* CJK Ideograph */ + ["\u8F51", "\u8F51"], /* CJK Ideograph */ + ["\u8F52", "\u8F52"], /* CJK Ideograph */ + ["\u8F53", "\u8F53"], /* CJK Ideograph */ + ["\u8F54", "\u8F54"], /* CJK Ideograph */ + ["\u8F55", "\u8F55"], /* CJK Ideograph */ + ["\u8F56", "\u8F56"], /* CJK Ideograph */ + ["\u8F57", "\u8F57"], /* CJK Ideograph */ + ["\u8F58", "\u8F58"], /* CJK Ideograph */ + ["\u8F59", "\u8F59"], /* CJK Ideograph */ + ["\u8F5A", "\u8F5A"], /* CJK Ideograph */ + ["\u8F5B", "\u8F5B"], /* CJK Ideograph */ + ["\u8F5C", "\u8F5C"], /* CJK Ideograph */ + ["\u8F5D", "\u8F5D"], /* CJK Ideograph */ + ["\u8F5E", "\u8F5E"], /* CJK Ideograph */ + ["\u8F5F", "\u8F5F"], /* CJK Ideograph */ + ["\u8F60", "\u8F60"], /* CJK Ideograph */ + ["\u8F61", "\u8F61"], /* CJK Ideograph */ + ["\u8F62", "\u8F62"], /* CJK Ideograph */ + ["\u8F63", "\u8F63"], /* CJK Ideograph */ + ["\u8F64", "\u8F64"], /* CJK Ideograph */ + ["\u8F65", "\u8F65"], /* CJK Ideograph */ + ["\u8F66", "\u8F66"], /* CJK Ideograph */ + ["\u8F67", "\u8F67"], /* CJK Ideograph */ + ["\u8F68", "\u8F68"], /* CJK Ideograph */ + ["\u8F69", "\u8F69"], /* CJK Ideograph */ + ["\u8F6A", "\u8F6A"], /* CJK Ideograph */ + ["\u8F6B", "\u8F6B"], /* CJK Ideograph */ + ["\u8F6C", "\u8F6C"], /* CJK Ideograph */ + ["\u8F6D", "\u8F6D"], /* CJK Ideograph */ + ["\u8F6E", "\u8F6E"], /* CJK Ideograph */ + ["\u8F6F", "\u8F6F"], /* CJK Ideograph */ + ["\u8F70", "\u8F70"], /* CJK Ideograph */ + ["\u8F71", "\u8F71"], /* CJK Ideograph */ + ["\u8F72", "\u8F72"], /* CJK Ideograph */ + ["\u8F73", "\u8F73"], /* CJK Ideograph */ + ["\u8F74", "\u8F74"], /* CJK Ideograph */ + ["\u8F75", "\u8F75"], /* CJK Ideograph */ + ["\u8F76", "\u8F76"], /* CJK Ideograph */ + ["\u8F77", "\u8F77"], /* CJK Ideograph */ + ["\u8F78", "\u8F78"], /* CJK Ideograph */ + ["\u8F79", "\u8F79"], /* CJK Ideograph */ + ["\u8F7A", "\u8F7A"], /* CJK Ideograph */ + ["\u8F7B", "\u8F7B"], /* CJK Ideograph */ + ["\u8F7C", "\u8F7C"], /* CJK Ideograph */ + ["\u8F7D", "\u8F7D"], /* CJK Ideograph */ + ["\u8F7E", "\u8F7E"], /* CJK Ideograph */ + ["\u8F7F", "\u8F7F"], /* CJK Ideograph */ + ["\u8F80", "\u8F80"], /* CJK Ideograph */ + ["\u8F81", "\u8F81"], /* CJK Ideograph */ + ["\u8F82", "\u8F82"], /* CJK Ideograph */ + ["\u8F83", "\u8F83"], /* CJK Ideograph */ + ["\u8F84", "\u8F84"], /* CJK Ideograph */ + ["\u8F85", "\u8F85"], /* CJK Ideograph */ + ["\u8F86", "\u8F86"], /* CJK Ideograph */ + ["\u8F87", "\u8F87"], /* CJK Ideograph */ + ["\u8F88", "\u8F88"], /* CJK Ideograph */ + ["\u8F89", "\u8F89"], /* CJK Ideograph */ + ["\u8F8A", "\u8F8A"], /* CJK Ideograph */ + ["\u8F8B", "\u8F8B"], /* CJK Ideograph */ + ["\u8F8C", "\u8F8C"], /* CJK Ideograph */ + ["\u8F8D", "\u8F8D"], /* CJK Ideograph */ + ["\u8F8E", "\u8F8E"], /* CJK Ideograph */ + ["\u8F8F", "\u8F8F"], /* CJK Ideograph */ + ["\u8F90", "\u8F90"], /* CJK Ideograph */ + ["\u8F91", "\u8F91"], /* CJK Ideograph */ + ["\u8F92", "\u8F92"], /* CJK Ideograph */ + ["\u8F93", "\u8F93"], /* CJK Ideograph */ + ["\u8F94", "\u8F94"], /* CJK Ideograph */ + ["\u8F95", "\u8F95"], /* CJK Ideograph */ + ["\u8F96", "\u8F96"], /* CJK Ideograph */ + ["\u8F97", "\u8F97"], /* CJK Ideograph */ + ["\u8F98", "\u8F98"], /* CJK Ideograph */ + ["\u8F99", "\u8F99"], /* CJK Ideograph */ + ["\u8F9A", "\u8F9A"], /* CJK Ideograph */ + ["\u8F9B", "\u8F9B"], /* CJK Ideograph */ + ["\u8F9C", "\u8F9C"], /* CJK Ideograph */ + ["\u8F9D", "\u8F9D"], /* CJK Ideograph */ + ["\u8F9E", "\u8F9E"], /* CJK Ideograph */ + ["\u8F9F", "\u8F9F"], /* CJK Ideograph */ + ["\u8FA0", "\u8FA0"], /* CJK Ideograph */ + ["\u8FA1", "\u8FA1"], /* CJK Ideograph */ + ["\u8FA2", "\u8FA2"], /* CJK Ideograph */ + ["\u8FA3", "\u8FA3"], /* CJK Ideograph */ + ["\u8FA4", "\u8FA4"], /* CJK Ideograph */ + ["\u8FA5", "\u8FA5"], /* CJK Ideograph */ + ["\u8FA6", "\u8FA6"], /* CJK Ideograph */ + ["\u8FA7", "\u8FA7"], /* CJK Ideograph */ + ["\u8FA8", "\u8FA8"], /* CJK Ideograph */ + ["\u8FA9", "\u8FA9"], /* CJK Ideograph */ + ["\u8FAA", "\u8FAA"], /* CJK Ideograph */ + ["\u8FAB", "\u8FAB"], /* CJK Ideograph */ + ["\u8FAC", "\u8FAC"], /* CJK Ideograph */ + ["\u8FAD", "\u8FAD"], /* CJK Ideograph */ + ["\u8FAE", "\u8FAE"], /* CJK Ideograph */ + ["\u8FAF", "\u8FAF"], /* CJK Ideograph */ + ["\u8FB0", "\u8FB0"], /* CJK Ideograph */ + ["\u8FB1", "\u8FB1"], /* CJK Ideograph */ + ["\u8FB2", "\u8FB2"], /* CJK Ideograph */ + ["\u8FB3", "\u8FB3"], /* CJK Ideograph */ + ["\u8FB4", "\u8FB4"], /* CJK Ideograph */ + ["\u8FB5", "\u8FB5"], /* CJK Ideograph */ + ["\u8FB6", "\u8FB6"], /* CJK Ideograph */ + ["\u8FB7", "\u8FB7"], /* CJK Ideograph */ + ["\u8FB8", "\u8FB8"], /* CJK Ideograph */ + ["\u8FB9", "\u8FB9"], /* CJK Ideograph */ + ["\u8FBA", "\u8FBA"], /* CJK Ideograph */ + ["\u8FBB", "\u8FBB"], /* CJK Ideograph */ + ["\u8FBC", "\u8FBC"], /* CJK Ideograph */ + ["\u8FBD", "\u8FBD"], /* CJK Ideograph */ + ["\u8FBE", "\u8FBE"], /* CJK Ideograph */ + ["\u8FBF", "\u8FBF"], /* CJK Ideograph */ + ["\u8FC0", "\u8FC0"], /* CJK Ideograph */ + ["\u8FC1", "\u8FC1"], /* CJK Ideograph */ + ["\u8FC2", "\u8FC2"], /* CJK Ideograph */ + ["\u8FC3", "\u8FC3"], /* CJK Ideograph */ + ["\u8FC4", "\u8FC4"], /* CJK Ideograph */ + ["\u8FC5", "\u8FC5"], /* CJK Ideograph */ + ["\u8FC6", "\u8FC6"], /* CJK Ideograph */ + ["\u8FC7", "\u8FC7"], /* CJK Ideograph */ + ["\u8FC8", "\u8FC8"], /* CJK Ideograph */ + ["\u8FC9", "\u8FC9"], /* CJK Ideograph */ + ["\u8FCA", "\u8FCA"], /* CJK Ideograph */ + ["\u8FCB", "\u8FCB"], /* CJK Ideograph */ + ["\u8FCC", "\u8FCC"], /* CJK Ideograph */ + ["\u8FCD", "\u8FCD"], /* CJK Ideograph */ + ["\u8FCE", "\u8FCE"], /* CJK Ideograph */ + ["\u8FCF", "\u8FCF"], /* CJK Ideograph */ + ["\u8FD0", "\u8FD0"], /* CJK Ideograph */ + ["\u8FD1", "\u8FD1"], /* CJK Ideograph */ + ["\u8FD2", "\u8FD2"], /* CJK Ideograph */ + ["\u8FD3", "\u8FD3"], /* CJK Ideograph */ + ["\u8FD4", "\u8FD4"], /* CJK Ideograph */ + ["\u8FD5", "\u8FD5"], /* CJK Ideograph */ + ["\u8FD6", "\u8FD6"], /* CJK Ideograph */ + ["\u8FD7", "\u8FD7"], /* CJK Ideograph */ + ["\u8FD8", "\u8FD8"], /* CJK Ideograph */ + ["\u8FD9", "\u8FD9"], /* CJK Ideograph */ + ["\u8FDA", "\u8FDA"], /* CJK Ideograph */ + ["\u8FDB", "\u8FDB"], /* CJK Ideograph */ + ["\u8FDC", "\u8FDC"], /* CJK Ideograph */ + ["\u8FDD", "\u8FDD"], /* CJK Ideograph */ + ["\u8FDE", "\u8FDE"], /* CJK Ideograph */ + ["\u8FDF", "\u8FDF"], /* CJK Ideograph */ + ["\u8FE0", "\u8FE0"], /* CJK Ideograph */ + ["\u8FE1", "\u8FE1"], /* CJK Ideograph */ + ["\u8FE2", "\u8FE2"], /* CJK Ideograph */ + ["\u8FE3", "\u8FE3"], /* CJK Ideograph */ + ["\u8FE4", "\u8FE4"], /* CJK Ideograph */ + ["\u8FE5", "\u8FE5"], /* CJK Ideograph */ + ["\u8FE6", "\u8FE6"], /* CJK Ideograph */ + ["\u8FE7", "\u8FE7"], /* CJK Ideograph */ + ["\u8FE8", "\u8FE8"], /* CJK Ideograph */ + ["\u8FE9", "\u8FE9"], /* CJK Ideograph */ + ["\u8FEA", "\u8FEA"], /* CJK Ideograph */ + ["\u8FEB", "\u8FEB"], /* CJK Ideograph */ + ["\u8FEC", "\u8FEC"], /* CJK Ideograph */ + ["\u8FED", "\u8FED"], /* CJK Ideograph */ + ["\u8FEE", "\u8FEE"], /* CJK Ideograph */ + ["\u8FEF", "\u8FEF"], /* CJK Ideograph */ + ["\u8FF0", "\u8FF0"], /* CJK Ideograph */ + ["\u8FF1", "\u8FF1"], /* CJK Ideograph */ + ["\u8FF2", "\u8FF2"], /* CJK Ideograph */ + ["\u8FF3", "\u8FF3"], /* CJK Ideograph */ + ["\u8FF4", "\u8FF4"], /* CJK Ideograph */ + ["\u8FF5", "\u8FF5"], /* CJK Ideograph */ + ["\u8FF6", "\u8FF6"], /* CJK Ideograph */ + ["\u8FF7", "\u8FF7"], /* CJK Ideograph */ + ["\u8FF8", "\u8FF8"], /* CJK Ideograph */ + ["\u8FF9", "\u8FF9"], /* CJK Ideograph */ + ["\u8FFA", "\u8FFA"], /* CJK Ideograph */ + ["\u8FFB", "\u8FFB"], /* CJK Ideograph */ + ["\u8FFC", "\u8FFC"], /* CJK Ideograph */ + ["\u8FFD", "\u8FFD"], /* CJK Ideograph */ + ["\u8FFE", "\u8FFE"], /* CJK Ideograph */ + ["\u8FFF", "\u8FFF"], /* CJK Ideograph */ + ["\u9000", "\u9000"], /* CJK Ideograph */ + ["\u9001", "\u9001"], /* CJK Ideograph */ + ["\u9002", "\u9002"], /* CJK Ideograph */ + ["\u9003", "\u9003"], /* CJK Ideograph */ + ["\u9004", "\u9004"], /* CJK Ideograph */ + ["\u9005", "\u9005"], /* CJK Ideograph */ + ["\u9006", "\u9006"], /* CJK Ideograph */ + ["\u9007", "\u9007"], /* CJK Ideograph */ + ["\u9008", "\u9008"], /* CJK Ideograph */ + ["\u9009", "\u9009"], /* CJK Ideograph */ + ["\u900A", "\u900A"], /* CJK Ideograph */ + ["\u900B", "\u900B"], /* CJK Ideograph */ + ["\u900C", "\u900C"], /* CJK Ideograph */ + ["\u900D", "\u900D"], /* CJK Ideograph */ + ["\u900E", "\u900E"], /* CJK Ideograph */ + ["\u900F", "\u900F"], /* CJK Ideograph */ + ["\u9010", "\u9010"], /* CJK Ideograph */ + ["\u9011", "\u9011"], /* CJK Ideograph */ + ["\u9012", "\u9012"], /* CJK Ideograph */ + ["\u9013", "\u9013"], /* CJK Ideograph */ + ["\u9014", "\u9014"], /* CJK Ideograph */ + ["\u9015", "\u9015"], /* CJK Ideograph */ + ["\u9016", "\u9016"], /* CJK Ideograph */ + ["\u9017", "\u9017"], /* CJK Ideograph */ + ["\u9018", "\u9018"], /* CJK Ideograph */ + ["\u9019", "\u9019"], /* CJK Ideograph */ + ["\u901A", "\u901A"], /* CJK Ideograph */ + ["\u901B", "\u901B"], /* CJK Ideograph */ + ["\u901C", "\u901C"], /* CJK Ideograph */ + ["\u901D", "\u901D"], /* CJK Ideograph */ + ["\u901E", "\u901E"], /* CJK Ideograph */ + ["\u901F", "\u901F"], /* CJK Ideograph */ + ["\u9020", "\u9020"], /* CJK Ideograph */ + ["\u9021", "\u9021"], /* CJK Ideograph */ + ["\u9022", "\u9022"], /* CJK Ideograph */ + ["\u9023", "\u9023"], /* CJK Ideograph */ + ["\u9024", "\u9024"], /* CJK Ideograph */ + ["\u9025", "\u9025"], /* CJK Ideograph */ + ["\u9026", "\u9026"], /* CJK Ideograph */ + ["\u9027", "\u9027"], /* CJK Ideograph */ + ["\u9028", "\u9028"], /* CJK Ideograph */ + ["\u9029", "\u9029"], /* CJK Ideograph */ + ["\u902A", "\u902A"], /* CJK Ideograph */ + ["\u902B", "\u902B"], /* CJK Ideograph */ + ["\u902C", "\u902C"], /* CJK Ideograph */ + ["\u902D", "\u902D"], /* CJK Ideograph */ + ["\u902E", "\u902E"], /* CJK Ideograph */ + ["\u902F", "\u902F"], /* CJK Ideograph */ + ["\u9030", "\u9030"], /* CJK Ideograph */ + ["\u9031", "\u9031"], /* CJK Ideograph */ + ["\u9032", "\u9032"], /* CJK Ideograph */ + ["\u9033", "\u9033"], /* CJK Ideograph */ + ["\u9034", "\u9034"], /* CJK Ideograph */ + ["\u9035", "\u9035"], /* CJK Ideograph */ + ["\u9036", "\u9036"], /* CJK Ideograph */ + ["\u9037", "\u9037"], /* CJK Ideograph */ + ["\u9038", "\u9038"], /* CJK Ideograph */ + ["\u9039", "\u9039"], /* CJK Ideograph */ + ["\u903A", "\u903A"], /* CJK Ideograph */ + ["\u903B", "\u903B"], /* CJK Ideograph */ + ["\u903C", "\u903C"], /* CJK Ideograph */ + ["\u903D", "\u903D"], /* CJK Ideograph */ + ["\u903E", "\u903E"], /* CJK Ideograph */ + ["\u903F", "\u903F"], /* CJK Ideograph */ + ["\u9040", "\u9040"], /* CJK Ideograph */ + ["\u9041", "\u9041"], /* CJK Ideograph */ + ["\u9042", "\u9042"], /* CJK Ideograph */ + ["\u9043", "\u9043"], /* CJK Ideograph */ + ["\u9044", "\u9044"], /* CJK Ideograph */ + ["\u9045", "\u9045"], /* CJK Ideograph */ + ["\u9046", "\u9046"], /* CJK Ideograph */ + ["\u9047", "\u9047"], /* CJK Ideograph */ + ["\u9048", "\u9048"], /* CJK Ideograph */ + ["\u9049", "\u9049"], /* CJK Ideograph */ + ["\u904A", "\u904A"], /* CJK Ideograph */ + ["\u904B", "\u904B"], /* CJK Ideograph */ + ["\u904C", "\u904C"], /* CJK Ideograph */ + ["\u904D", "\u904D"], /* CJK Ideograph */ + ["\u904E", "\u904E"], /* CJK Ideograph */ + ["\u904F", "\u904F"], /* CJK Ideograph */ + ["\u9050", "\u9050"], /* CJK Ideograph */ + ["\u9051", "\u9051"], /* CJK Ideograph */ + ["\u9052", "\u9052"], /* CJK Ideograph */ + ["\u9053", "\u9053"], /* CJK Ideograph */ + ["\u9054", "\u9054"], /* CJK Ideograph */ + ["\u9055", "\u9055"], /* CJK Ideograph */ + ["\u9056", "\u9056"], /* CJK Ideograph */ + ["\u9057", "\u9057"], /* CJK Ideograph */ + ["\u9058", "\u9058"], /* CJK Ideograph */ + ["\u9059", "\u9059"], /* CJK Ideograph */ + ["\u905A", "\u905A"], /* CJK Ideograph */ + ["\u905B", "\u905B"], /* CJK Ideograph */ + ["\u905C", "\u905C"], /* CJK Ideograph */ + ["\u905D", "\u905D"], /* CJK Ideograph */ + ["\u905E", "\u905E"], /* CJK Ideograph */ + ["\u905F", "\u905F"], /* CJK Ideograph */ + ["\u9060", "\u9060"], /* CJK Ideograph */ + ["\u9061", "\u9061"], /* CJK Ideograph */ + ["\u9062", "\u9062"], /* CJK Ideograph */ + ["\u9063", "\u9063"], /* CJK Ideograph */ + ["\u9064", "\u9064"], /* CJK Ideograph */ + ["\u9065", "\u9065"], /* CJK Ideograph */ + ["\u9066", "\u9066"], /* CJK Ideograph */ + ["\u9067", "\u9067"], /* CJK Ideograph */ + ["\u9068", "\u9068"], /* CJK Ideograph */ + ["\u9069", "\u9069"], /* CJK Ideograph */ + ["\u906A", "\u906A"], /* CJK Ideograph */ + ["\u906B", "\u906B"], /* CJK Ideograph */ + ["\u906C", "\u906C"], /* CJK Ideograph */ + ["\u906D", "\u906D"], /* CJK Ideograph */ + ["\u906E", "\u906E"], /* CJK Ideograph */ + ["\u906F", "\u906F"], /* CJK Ideograph */ + ["\u9070", "\u9070"], /* CJK Ideograph */ + ["\u9071", "\u9071"], /* CJK Ideograph */ + ["\u9072", "\u9072"], /* CJK Ideograph */ + ["\u9073", "\u9073"], /* CJK Ideograph */ + ["\u9074", "\u9074"], /* CJK Ideograph */ + ["\u9075", "\u9075"], /* CJK Ideograph */ + ["\u9076", "\u9076"], /* CJK Ideograph */ + ["\u9077", "\u9077"], /* CJK Ideograph */ + ["\u9078", "\u9078"], /* CJK Ideograph */ + ["\u9079", "\u9079"], /* CJK Ideograph */ + ["\u907A", "\u907A"], /* CJK Ideograph */ + ["\u907B", "\u907B"], /* CJK Ideograph */ + ["\u907C", "\u907C"], /* CJK Ideograph */ + ["\u907D", "\u907D"], /* CJK Ideograph */ + ["\u907E", "\u907E"], /* CJK Ideograph */ + ["\u907F", "\u907F"], /* CJK Ideograph */ + ["\u9080", "\u9080"], /* CJK Ideograph */ + ["\u9081", "\u9081"], /* CJK Ideograph */ + ["\u9082", "\u9082"], /* CJK Ideograph */ + ["\u9083", "\u9083"], /* CJK Ideograph */ + ["\u9084", "\u9084"], /* CJK Ideograph */ + ["\u9085", "\u9085"], /* CJK Ideograph */ + ["\u9086", "\u9086"], /* CJK Ideograph */ + ["\u9087", "\u9087"], /* CJK Ideograph */ + ["\u9088", "\u9088"], /* CJK Ideograph */ + ["\u9089", "\u9089"], /* CJK Ideograph */ + ["\u908A", "\u908A"], /* CJK Ideograph */ + ["\u908B", "\u908B"], /* CJK Ideograph */ + ["\u908C", "\u908C"], /* CJK Ideograph */ + ["\u908D", "\u908D"], /* CJK Ideograph */ + ["\u908E", "\u908E"], /* CJK Ideograph */ + ["\u908F", "\u908F"], /* CJK Ideograph */ + ["\u9090", "\u9090"], /* CJK Ideograph */ + ["\u9091", "\u9091"], /* CJK Ideograph */ + ["\u9092", "\u9092"], /* CJK Ideograph */ + ["\u9093", "\u9093"], /* CJK Ideograph */ + ["\u9094", "\u9094"], /* CJK Ideograph */ + ["\u9095", "\u9095"], /* CJK Ideograph */ + ["\u9096", "\u9096"], /* CJK Ideograph */ + ["\u9097", "\u9097"], /* CJK Ideograph */ + ["\u9098", "\u9098"], /* CJK Ideograph */ + ["\u9099", "\u9099"], /* CJK Ideograph */ + ["\u909A", "\u909A"], /* CJK Ideograph */ + ["\u909B", "\u909B"], /* CJK Ideograph */ + ["\u909C", "\u909C"], /* CJK Ideograph */ + ["\u909D", "\u909D"], /* CJK Ideograph */ + ["\u909E", "\u909E"], /* CJK Ideograph */ + ["\u909F", "\u909F"], /* CJK Ideograph */ + ["\u90A0", "\u90A0"], /* CJK Ideograph */ + ["\u90A1", "\u90A1"], /* CJK Ideograph */ + ["\u90A2", "\u90A2"], /* CJK Ideograph */ + ["\u90A3", "\u90A3"], /* CJK Ideograph */ + ["\u90A4", "\u90A4"], /* CJK Ideograph */ + ["\u90A5", "\u90A5"], /* CJK Ideograph */ + ["\u90A6", "\u90A6"], /* CJK Ideograph */ + ["\u90A7", "\u90A7"], /* CJK Ideograph */ + ["\u90A8", "\u90A8"], /* CJK Ideograph */ + ["\u90A9", "\u90A9"], /* CJK Ideograph */ + ["\u90AA", "\u90AA"], /* CJK Ideograph */ + ["\u90AB", "\u90AB"], /* CJK Ideograph */ + ["\u90AC", "\u90AC"], /* CJK Ideograph */ + ["\u90AD", "\u90AD"], /* CJK Ideograph */ + ["\u90AE", "\u90AE"], /* CJK Ideograph */ + ["\u90AF", "\u90AF"], /* CJK Ideograph */ + ["\u90B0", "\u90B0"], /* CJK Ideograph */ + ["\u90B1", "\u90B1"], /* CJK Ideograph */ + ["\u90B2", "\u90B2"], /* CJK Ideograph */ + ["\u90B3", "\u90B3"], /* CJK Ideograph */ + ["\u90B4", "\u90B4"], /* CJK Ideograph */ + ["\u90B5", "\u90B5"], /* CJK Ideograph */ + ["\u90B6", "\u90B6"], /* CJK Ideograph */ + ["\u90B7", "\u90B7"], /* CJK Ideograph */ + ["\u90B8", "\u90B8"], /* CJK Ideograph */ + ["\u90B9", "\u90B9"], /* CJK Ideograph */ + ["\u90BA", "\u90BA"], /* CJK Ideograph */ + ["\u90BB", "\u90BB"], /* CJK Ideograph */ + ["\u90BC", "\u90BC"], /* CJK Ideograph */ + ["\u90BD", "\u90BD"], /* CJK Ideograph */ + ["\u90BE", "\u90BE"], /* CJK Ideograph */ + ["\u90BF", "\u90BF"], /* CJK Ideograph */ + ["\u90C0", "\u90C0"], /* CJK Ideograph */ + ["\u90C1", "\u90C1"], /* CJK Ideograph */ + ["\u90C2", "\u90C2"], /* CJK Ideograph */ + ["\u90C3", "\u90C3"], /* CJK Ideograph */ + ["\u90C4", "\u90C4"], /* CJK Ideograph */ + ["\u90C5", "\u90C5"], /* CJK Ideograph */ + ["\u90C6", "\u90C6"], /* CJK Ideograph */ + ["\u90C7", "\u90C7"], /* CJK Ideograph */ + ["\u90C8", "\u90C8"], /* CJK Ideograph */ + ["\u90C9", "\u90C9"], /* CJK Ideograph */ + ["\u90CA", "\u90CA"], /* CJK Ideograph */ + ["\u90CB", "\u90CB"], /* CJK Ideograph */ + ["\u90CC", "\u90CC"], /* CJK Ideograph */ + ["\u90CD", "\u90CD"], /* CJK Ideograph */ + ["\u90CE", "\u90CE"], /* CJK Ideograph */ + ["\u90CF", "\u90CF"], /* CJK Ideograph */ + ["\u90D0", "\u90D0"], /* CJK Ideograph */ + ["\u90D1", "\u90D1"], /* CJK Ideograph */ + ["\u90D2", "\u90D2"], /* CJK Ideograph */ + ["\u90D3", "\u90D3"], /* CJK Ideograph */ + ["\u90D4", "\u90D4"], /* CJK Ideograph */ + ["\u90D5", "\u90D5"], /* CJK Ideograph */ + ["\u90D6", "\u90D6"], /* CJK Ideograph */ + ["\u90D7", "\u90D7"], /* CJK Ideograph */ + ["\u90D8", "\u90D8"], /* CJK Ideograph */ + ["\u90D9", "\u90D9"], /* CJK Ideograph */ + ["\u90DA", "\u90DA"], /* CJK Ideograph */ + ["\u90DB", "\u90DB"], /* CJK Ideograph */ + ["\u90DC", "\u90DC"], /* CJK Ideograph */ + ["\u90DD", "\u90DD"], /* CJK Ideograph */ + ["\u90DE", "\u90DE"], /* CJK Ideograph */ + ["\u90DF", "\u90DF"], /* CJK Ideograph */ + ["\u90E0", "\u90E0"], /* CJK Ideograph */ + ["\u90E1", "\u90E1"], /* CJK Ideograph */ + ["\u90E2", "\u90E2"], /* CJK Ideograph */ + ["\u90E3", "\u90E3"], /* CJK Ideograph */ + ["\u90E4", "\u90E4"], /* CJK Ideograph */ + ["\u90E5", "\u90E5"], /* CJK Ideograph */ + ["\u90E6", "\u90E6"], /* CJK Ideograph */ + ["\u90E7", "\u90E7"], /* CJK Ideograph */ + ["\u90E8", "\u90E8"], /* CJK Ideograph */ + ["\u90E9", "\u90E9"], /* CJK Ideograph */ + ["\u90EA", "\u90EA"], /* CJK Ideograph */ + ["\u90EB", "\u90EB"], /* CJK Ideograph */ + ["\u90EC", "\u90EC"], /* CJK Ideograph */ + ["\u90ED", "\u90ED"], /* CJK Ideograph */ + ["\u90EE", "\u90EE"], /* CJK Ideograph */ + ["\u90EF", "\u90EF"], /* CJK Ideograph */ + ["\u90F0", "\u90F0"], /* CJK Ideograph */ + ["\u90F1", "\u90F1"], /* CJK Ideograph */ + ["\u90F2", "\u90F2"], /* CJK Ideograph */ + ["\u90F3", "\u90F3"], /* CJK Ideograph */ + ["\u90F4", "\u90F4"], /* CJK Ideograph */ + ["\u90F5", "\u90F5"], /* CJK Ideograph */ + ["\u90F6", "\u90F6"], /* CJK Ideograph */ + ["\u90F7", "\u90F7"], /* CJK Ideograph */ + ["\u90F8", "\u90F8"], /* CJK Ideograph */ + ["\u90F9", "\u90F9"], /* CJK Ideograph */ + ["\u90FA", "\u90FA"], /* CJK Ideograph */ + ["\u90FB", "\u90FB"], /* CJK Ideograph */ + ["\u90FC", "\u90FC"], /* CJK Ideograph */ + ["\u90FD", "\u90FD"], /* CJK Ideograph */ + ["\u90FE", "\u90FE"], /* CJK Ideograph */ + ["\u90FF", "\u90FF"], /* CJK Ideograph */ + ["\u9100", "\u9100"], /* CJK Ideograph */ + ["\u9101", "\u9101"], /* CJK Ideograph */ + ["\u9102", "\u9102"], /* CJK Ideograph */ + ["\u9103", "\u9103"], /* CJK Ideograph */ + ["\u9104", "\u9104"], /* CJK Ideograph */ + ["\u9105", "\u9105"], /* CJK Ideograph */ + ["\u9106", "\u9106"], /* CJK Ideograph */ + ["\u9107", "\u9107"], /* CJK Ideograph */ + ["\u9108", "\u9108"], /* CJK Ideograph */ + ["\u9109", "\u9109"], /* CJK Ideograph */ + ["\u910A", "\u910A"], /* CJK Ideograph */ + ["\u910B", "\u910B"], /* CJK Ideograph */ + ["\u910C", "\u910C"], /* CJK Ideograph */ + ["\u910D", "\u910D"], /* CJK Ideograph */ + ["\u910E", "\u910E"], /* CJK Ideograph */ + ["\u910F", "\u910F"], /* CJK Ideograph */ + ["\u9110", "\u9110"], /* CJK Ideograph */ + ["\u9111", "\u9111"], /* CJK Ideograph */ + ["\u9112", "\u9112"], /* CJK Ideograph */ + ["\u9113", "\u9113"], /* CJK Ideograph */ + ["\u9114", "\u9114"], /* CJK Ideograph */ + ["\u9115", "\u9115"], /* CJK Ideograph */ + ["\u9116", "\u9116"], /* CJK Ideograph */ + ["\u9117", "\u9117"], /* CJK Ideograph */ + ["\u9118", "\u9118"], /* CJK Ideograph */ + ["\u9119", "\u9119"], /* CJK Ideograph */ + ["\u911A", "\u911A"], /* CJK Ideograph */ + ["\u911B", "\u911B"], /* CJK Ideograph */ + ["\u911C", "\u911C"], /* CJK Ideograph */ + ["\u911D", "\u911D"], /* CJK Ideograph */ + ["\u911E", "\u911E"], /* CJK Ideograph */ + ["\u911F", "\u911F"], /* CJK Ideograph */ + ["\u9120", "\u9120"], /* CJK Ideograph */ + ["\u9121", "\u9121"], /* CJK Ideograph */ + ["\u9122", "\u9122"], /* CJK Ideograph */ + ["\u9123", "\u9123"], /* CJK Ideograph */ + ["\u9124", "\u9124"], /* CJK Ideograph */ + ["\u9125", "\u9125"], /* CJK Ideograph */ + ["\u9126", "\u9126"], /* CJK Ideograph */ + ["\u9127", "\u9127"], /* CJK Ideograph */ + ["\u9128", "\u9128"], /* CJK Ideograph */ + ["\u9129", "\u9129"], /* CJK Ideograph */ + ["\u912A", "\u912A"], /* CJK Ideograph */ + ["\u912B", "\u912B"], /* CJK Ideograph */ + ["\u912C", "\u912C"], /* CJK Ideograph */ + ["\u912D", "\u912D"], /* CJK Ideograph */ + ["\u912E", "\u912E"], /* CJK Ideograph */ + ["\u912F", "\u912F"], /* CJK Ideograph */ + ["\u9130", "\u9130"], /* CJK Ideograph */ + ["\u9131", "\u9131"], /* CJK Ideograph */ + ["\u9132", "\u9132"], /* CJK Ideograph */ + ["\u9133", "\u9133"], /* CJK Ideograph */ + ["\u9134", "\u9134"], /* CJK Ideograph */ + ["\u9135", "\u9135"], /* CJK Ideograph */ + ["\u9136", "\u9136"], /* CJK Ideograph */ + ["\u9137", "\u9137"], /* CJK Ideograph */ + ["\u9138", "\u9138"], /* CJK Ideograph */ + ["\u9139", "\u9139"], /* CJK Ideograph */ + ["\u913A", "\u913A"], /* CJK Ideograph */ + ["\u913B", "\u913B"], /* CJK Ideograph */ + ["\u913C", "\u913C"], /* CJK Ideograph */ + ["\u913D", "\u913D"], /* CJK Ideograph */ + ["\u913E", "\u913E"], /* CJK Ideograph */ + ["\u913F", "\u913F"], /* CJK Ideograph */ + ["\u9140", "\u9140"], /* CJK Ideograph */ + ["\u9141", "\u9141"], /* CJK Ideograph */ + ["\u9142", "\u9142"], /* CJK Ideograph */ + ["\u9143", "\u9143"], /* CJK Ideograph */ + ["\u9144", "\u9144"], /* CJK Ideograph */ + ["\u9145", "\u9145"], /* CJK Ideograph */ + ["\u9146", "\u9146"], /* CJK Ideograph */ + ["\u9147", "\u9147"], /* CJK Ideograph */ + ["\u9148", "\u9148"], /* CJK Ideograph */ + ["\u9149", "\u9149"], /* CJK Ideograph */ + ["\u914A", "\u914A"], /* CJK Ideograph */ + ["\u914B", "\u914B"], /* CJK Ideograph */ + ["\u914C", "\u914C"], /* CJK Ideograph */ + ["\u914D", "\u914D"], /* CJK Ideograph */ + ["\u914E", "\u914E"], /* CJK Ideograph */ + ["\u914F", "\u914F"], /* CJK Ideograph */ + ["\u9150", "\u9150"], /* CJK Ideograph */ + ["\u9151", "\u9151"], /* CJK Ideograph */ + ["\u9152", "\u9152"], /* CJK Ideograph */ + ["\u9153", "\u9153"], /* CJK Ideograph */ + ["\u9154", "\u9154"], /* CJK Ideograph */ + ["\u9155", "\u9155"], /* CJK Ideograph */ + ["\u9156", "\u9156"], /* CJK Ideograph */ + ["\u9157", "\u9157"], /* CJK Ideograph */ + ["\u9158", "\u9158"], /* CJK Ideograph */ + ["\u9159", "\u9159"], /* CJK Ideograph */ + ["\u915A", "\u915A"], /* CJK Ideograph */ + ["\u915B", "\u915B"], /* CJK Ideograph */ + ["\u915C", "\u915C"], /* CJK Ideograph */ + ["\u915D", "\u915D"], /* CJK Ideograph */ + ["\u915E", "\u915E"], /* CJK Ideograph */ + ["\u915F", "\u915F"], /* CJK Ideograph */ + ["\u9160", "\u9160"], /* CJK Ideograph */ + ["\u9161", "\u9161"], /* CJK Ideograph */ + ["\u9162", "\u9162"], /* CJK Ideograph */ + ["\u9163", "\u9163"], /* CJK Ideograph */ + ["\u9164", "\u9164"], /* CJK Ideograph */ + ["\u9165", "\u9165"], /* CJK Ideograph */ + ["\u9166", "\u9166"], /* CJK Ideograph */ + ["\u9167", "\u9167"], /* CJK Ideograph */ + ["\u9168", "\u9168"], /* CJK Ideograph */ + ["\u9169", "\u9169"], /* CJK Ideograph */ + ["\u916A", "\u916A"], /* CJK Ideograph */ + ["\u916B", "\u916B"], /* CJK Ideograph */ + ["\u916C", "\u916C"], /* CJK Ideograph */ + ["\u916D", "\u916D"], /* CJK Ideograph */ + ["\u916E", "\u916E"], /* CJK Ideograph */ + ["\u916F", "\u916F"], /* CJK Ideograph */ + ["\u9170", "\u9170"], /* CJK Ideograph */ + ["\u9171", "\u9171"], /* CJK Ideograph */ + ["\u9172", "\u9172"], /* CJK Ideograph */ + ["\u9173", "\u9173"], /* CJK Ideograph */ + ["\u9174", "\u9174"], /* CJK Ideograph */ + ["\u9175", "\u9175"], /* CJK Ideograph */ + ["\u9176", "\u9176"], /* CJK Ideograph */ + ["\u9177", "\u9177"], /* CJK Ideograph */ + ["\u9178", "\u9178"], /* CJK Ideograph */ + ["\u9179", "\u9179"], /* CJK Ideograph */ + ["\u917A", "\u917A"], /* CJK Ideograph */ + ["\u917B", "\u917B"], /* CJK Ideograph */ + ["\u917C", "\u917C"], /* CJK Ideograph */ + ["\u917D", "\u917D"], /* CJK Ideograph */ + ["\u917E", "\u917E"], /* CJK Ideograph */ + ["\u917F", "\u917F"], /* CJK Ideograph */ + ["\u9180", "\u9180"], /* CJK Ideograph */ + ["\u9181", "\u9181"], /* CJK Ideograph */ + ["\u9182", "\u9182"], /* CJK Ideograph */ + ["\u9183", "\u9183"], /* CJK Ideograph */ + ["\u9184", "\u9184"], /* CJK Ideograph */ + ["\u9185", "\u9185"], /* CJK Ideograph */ + ["\u9186", "\u9186"], /* CJK Ideograph */ + ["\u9187", "\u9187"], /* CJK Ideograph */ + ["\u9188", "\u9188"], /* CJK Ideograph */ + ["\u9189", "\u9189"], /* CJK Ideograph */ + ["\u918A", "\u918A"], /* CJK Ideograph */ + ["\u918B", "\u918B"], /* CJK Ideograph */ + ["\u918C", "\u918C"], /* CJK Ideograph */ + ["\u918D", "\u918D"], /* CJK Ideograph */ + ["\u918E", "\u918E"], /* CJK Ideograph */ + ["\u918F", "\u918F"], /* CJK Ideograph */ + ["\u9190", "\u9190"], /* CJK Ideograph */ + ["\u9191", "\u9191"], /* CJK Ideograph */ + ["\u9192", "\u9192"], /* CJK Ideograph */ + ["\u9193", "\u9193"], /* CJK Ideograph */ + ["\u9194", "\u9194"], /* CJK Ideograph */ + ["\u9195", "\u9195"], /* CJK Ideograph */ + ["\u9196", "\u9196"], /* CJK Ideograph */ + ["\u9197", "\u9197"], /* CJK Ideograph */ + ["\u9198", "\u9198"], /* CJK Ideograph */ + ["\u9199", "\u9199"], /* CJK Ideograph */ + ["\u919A", "\u919A"], /* CJK Ideograph */ + ["\u919B", "\u919B"], /* CJK Ideograph */ + ["\u919C", "\u919C"], /* CJK Ideograph */ + ["\u919D", "\u919D"], /* CJK Ideograph */ + ["\u919E", "\u919E"], /* CJK Ideograph */ + ["\u919F", "\u919F"], /* CJK Ideograph */ + ["\u91A0", "\u91A0"], /* CJK Ideograph */ + ["\u91A1", "\u91A1"], /* CJK Ideograph */ + ["\u91A2", "\u91A2"], /* CJK Ideograph */ + ["\u91A3", "\u91A3"], /* CJK Ideograph */ + ["\u91A4", "\u91A4"], /* CJK Ideograph */ + ["\u91A5", "\u91A5"], /* CJK Ideograph */ + ["\u91A6", "\u91A6"], /* CJK Ideograph */ + ["\u91A7", "\u91A7"], /* CJK Ideograph */ + ["\u91A8", "\u91A8"], /* CJK Ideograph */ + ["\u91A9", "\u91A9"], /* CJK Ideograph */ + ["\u91AA", "\u91AA"], /* CJK Ideograph */ + ["\u91AB", "\u91AB"], /* CJK Ideograph */ + ["\u91AC", "\u91AC"], /* CJK Ideograph */ + ["\u91AD", "\u91AD"], /* CJK Ideograph */ + ["\u91AE", "\u91AE"], /* CJK Ideograph */ + ["\u91AF", "\u91AF"], /* CJK Ideograph */ + ["\u91B0", "\u91B0"], /* CJK Ideograph */ + ["\u91B1", "\u91B1"], /* CJK Ideograph */ + ["\u91B2", "\u91B2"], /* CJK Ideograph */ + ["\u91B3", "\u91B3"], /* CJK Ideograph */ + ["\u91B4", "\u91B4"], /* CJK Ideograph */ + ["\u91B5", "\u91B5"], /* CJK Ideograph */ + ["\u91B6", "\u91B6"], /* CJK Ideograph */ + ["\u91B7", "\u91B7"], /* CJK Ideograph */ + ["\u91B8", "\u91B8"], /* CJK Ideograph */ + ["\u91B9", "\u91B9"], /* CJK Ideograph */ + ["\u91BA", "\u91BA"], /* CJK Ideograph */ + ["\u91BB", "\u91BB"], /* CJK Ideograph */ + ["\u91BC", "\u91BC"], /* CJK Ideograph */ + ["\u91BD", "\u91BD"], /* CJK Ideograph */ + ["\u91BE", "\u91BE"], /* CJK Ideograph */ + ["\u91BF", "\u91BF"], /* CJK Ideograph */ + ["\u91C0", "\u91C0"], /* CJK Ideograph */ + ["\u91C1", "\u91C1"], /* CJK Ideograph */ + ["\u91C2", "\u91C2"], /* CJK Ideograph */ + ["\u91C3", "\u91C3"], /* CJK Ideograph */ + ["\u91C4", "\u91C4"], /* CJK Ideograph */ + ["\u91C5", "\u91C5"], /* CJK Ideograph */ + ["\u91C6", "\u91C6"], /* CJK Ideograph */ + ["\u91C7", "\u91C7"], /* CJK Ideograph */ + ["\u91C8", "\u91C8"], /* CJK Ideograph */ + ["\u91C9", "\u91C9"], /* CJK Ideograph */ + ["\u91CA", "\u91CA"], /* CJK Ideograph */ + ["\u91CB", "\u91CB"], /* CJK Ideograph */ + ["\u91CC", "\u91CC"], /* CJK Ideograph */ + ["\u91CD", "\u91CD"], /* CJK Ideograph */ + ["\u91CE", "\u91CE"], /* CJK Ideograph */ + ["\u91CF", "\u91CF"], /* CJK Ideograph */ + ["\u91D0", "\u91D0"], /* CJK Ideograph */ + ["\u91D1", "\u91D1"], /* CJK Ideograph */ + ["\u91D2", "\u91D2"], /* CJK Ideograph */ + ["\u91D3", "\u91D3"], /* CJK Ideograph */ + ["\u91D4", "\u91D4"], /* CJK Ideograph */ + ["\u91D5", "\u91D5"], /* CJK Ideograph */ + ["\u91D6", "\u91D6"], /* CJK Ideograph */ + ["\u91D7", "\u91D7"], /* CJK Ideograph */ + ["\u91D8", "\u91D8"], /* CJK Ideograph */ + ["\u91D9", "\u91D9"], /* CJK Ideograph */ + ["\u91DA", "\u91DA"], /* CJK Ideograph */ + ["\u91DB", "\u91DB"], /* CJK Ideograph */ + ["\u91DC", "\u91DC"], /* CJK Ideograph */ + ["\u91DD", "\u91DD"], /* CJK Ideograph */ + ["\u91DE", "\u91DE"], /* CJK Ideograph */ + ["\u91DF", "\u91DF"], /* CJK Ideograph */ + ["\u91E0", "\u91E0"], /* CJK Ideograph */ + ["\u91E1", "\u91E1"], /* CJK Ideograph */ + ["\u91E2", "\u91E2"], /* CJK Ideograph */ + ["\u91E3", "\u91E3"], /* CJK Ideograph */ + ["\u91E4", "\u91E4"], /* CJK Ideograph */ + ["\u91E5", "\u91E5"], /* CJK Ideograph */ + ["\u91E6", "\u91E6"], /* CJK Ideograph */ + ["\u91E7", "\u91E7"], /* CJK Ideograph */ + ["\u91E8", "\u91E8"], /* CJK Ideograph */ + ["\u91E9", "\u91E9"], /* CJK Ideograph */ + ["\u91EA", "\u91EA"], /* CJK Ideograph */ + ["\u91EB", "\u91EB"], /* CJK Ideograph */ + ["\u91EC", "\u91EC"], /* CJK Ideograph */ + ["\u91ED", "\u91ED"], /* CJK Ideograph */ + ["\u91EE", "\u91EE"], /* CJK Ideograph */ + ["\u91EF", "\u91EF"], /* CJK Ideograph */ + ["\u91F0", "\u91F0"], /* CJK Ideograph */ + ["\u91F1", "\u91F1"], /* CJK Ideograph */ + ["\u91F2", "\u91F2"], /* CJK Ideograph */ + ["\u91F3", "\u91F3"], /* CJK Ideograph */ + ["\u91F4", "\u91F4"], /* CJK Ideograph */ + ["\u91F5", "\u91F5"], /* CJK Ideograph */ + ["\u91F6", "\u91F6"], /* CJK Ideograph */ + ["\u91F7", "\u91F7"], /* CJK Ideograph */ + ["\u91F8", "\u91F8"], /* CJK Ideograph */ + ["\u91F9", "\u91F9"], /* CJK Ideograph */ + ["\u91FA", "\u91FA"], /* CJK Ideograph */ + ["\u91FB", "\u91FB"], /* CJK Ideograph */ + ["\u91FC", "\u91FC"], /* CJK Ideograph */ + ["\u91FD", "\u91FD"], /* CJK Ideograph */ + ["\u91FE", "\u91FE"], /* CJK Ideograph */ + ["\u91FF", "\u91FF"], /* CJK Ideograph */ + ["\u9200", "\u9200"], /* CJK Ideograph */ + ["\u9201", "\u9201"], /* CJK Ideograph */ + ["\u9202", "\u9202"], /* CJK Ideograph */ + ["\u9203", "\u9203"], /* CJK Ideograph */ + ["\u9204", "\u9204"], /* CJK Ideograph */ + ["\u9205", "\u9205"], /* CJK Ideograph */ + ["\u9206", "\u9206"], /* CJK Ideograph */ + ["\u9207", "\u9207"], /* CJK Ideograph */ + ["\u9208", "\u9208"], /* CJK Ideograph */ + ["\u9209", "\u9209"], /* CJK Ideograph */ + ["\u920A", "\u920A"], /* CJK Ideograph */ + ["\u920B", "\u920B"], /* CJK Ideograph */ + ["\u920C", "\u920C"], /* CJK Ideograph */ + ["\u920D", "\u920D"], /* CJK Ideograph */ + ["\u920E", "\u920E"], /* CJK Ideograph */ + ["\u920F", "\u920F"], /* CJK Ideograph */ + ["\u9210", "\u9210"], /* CJK Ideograph */ + ["\u9211", "\u9211"], /* CJK Ideograph */ + ["\u9212", "\u9212"], /* CJK Ideograph */ + ["\u9213", "\u9213"], /* CJK Ideograph */ + ["\u9214", "\u9214"], /* CJK Ideograph */ + ["\u9215", "\u9215"], /* CJK Ideograph */ + ["\u9216", "\u9216"], /* CJK Ideograph */ + ["\u9217", "\u9217"], /* CJK Ideograph */ + ["\u9218", "\u9218"], /* CJK Ideograph */ + ["\u9219", "\u9219"], /* CJK Ideograph */ + ["\u921A", "\u921A"], /* CJK Ideograph */ + ["\u921B", "\u921B"], /* CJK Ideograph */ + ["\u921C", "\u921C"], /* CJK Ideograph */ + ["\u921D", "\u921D"], /* CJK Ideograph */ + ["\u921E", "\u921E"], /* CJK Ideograph */ + ["\u921F", "\u921F"], /* CJK Ideograph */ + ["\u9220", "\u9220"], /* CJK Ideograph */ + ["\u9221", "\u9221"], /* CJK Ideograph */ + ["\u9222", "\u9222"], /* CJK Ideograph */ + ["\u9223", "\u9223"], /* CJK Ideograph */ + ["\u9224", "\u9224"], /* CJK Ideograph */ + ["\u9225", "\u9225"], /* CJK Ideograph */ + ["\u9226", "\u9226"], /* CJK Ideograph */ + ["\u9227", "\u9227"], /* CJK Ideograph */ + ["\u9228", "\u9228"], /* CJK Ideograph */ + ["\u9229", "\u9229"], /* CJK Ideograph */ + ["\u922A", "\u922A"], /* CJK Ideograph */ + ["\u922B", "\u922B"], /* CJK Ideograph */ + ["\u922C", "\u922C"], /* CJK Ideograph */ + ["\u922D", "\u922D"], /* CJK Ideograph */ + ["\u922E", "\u922E"], /* CJK Ideograph */ + ["\u922F", "\u922F"], /* CJK Ideograph */ + ["\u9230", "\u9230"], /* CJK Ideograph */ + ["\u9231", "\u9231"], /* CJK Ideograph */ + ["\u9232", "\u9232"], /* CJK Ideograph */ + ["\u9233", "\u9233"], /* CJK Ideograph */ + ["\u9234", "\u9234"], /* CJK Ideograph */ + ["\u9235", "\u9235"], /* CJK Ideograph */ + ["\u9236", "\u9236"], /* CJK Ideograph */ + ["\u9237", "\u9237"], /* CJK Ideograph */ + ["\u9238", "\u9238"], /* CJK Ideograph */ + ["\u9239", "\u9239"], /* CJK Ideograph */ + ["\u923A", "\u923A"], /* CJK Ideograph */ + ["\u923B", "\u923B"], /* CJK Ideograph */ + ["\u923C", "\u923C"], /* CJK Ideograph */ + ["\u923D", "\u923D"], /* CJK Ideograph */ + ["\u923E", "\u923E"], /* CJK Ideograph */ + ["\u923F", "\u923F"], /* CJK Ideograph */ + ["\u9240", "\u9240"], /* CJK Ideograph */ + ["\u9241", "\u9241"], /* CJK Ideograph */ + ["\u9242", "\u9242"], /* CJK Ideograph */ + ["\u9243", "\u9243"], /* CJK Ideograph */ + ["\u9244", "\u9244"], /* CJK Ideograph */ + ["\u9245", "\u9245"], /* CJK Ideograph */ + ["\u9246", "\u9246"], /* CJK Ideograph */ + ["\u9247", "\u9247"], /* CJK Ideograph */ + ["\u9248", "\u9248"], /* CJK Ideograph */ + ["\u9249", "\u9249"], /* CJK Ideograph */ + ["\u924A", "\u924A"], /* CJK Ideograph */ + ["\u924B", "\u924B"], /* CJK Ideograph */ + ["\u924C", "\u924C"], /* CJK Ideograph */ + ["\u924D", "\u924D"], /* CJK Ideograph */ + ["\u924E", "\u924E"], /* CJK Ideograph */ + ["\u924F", "\u924F"], /* CJK Ideograph */ + ["\u9250", "\u9250"], /* CJK Ideograph */ + ["\u9251", "\u9251"], /* CJK Ideograph */ + ["\u9252", "\u9252"], /* CJK Ideograph */ + ["\u9253", "\u9253"], /* CJK Ideograph */ + ["\u9254", "\u9254"], /* CJK Ideograph */ + ["\u9255", "\u9255"], /* CJK Ideograph */ + ["\u9256", "\u9256"], /* CJK Ideograph */ + ["\u9257", "\u9257"], /* CJK Ideograph */ + ["\u9258", "\u9258"], /* CJK Ideograph */ + ["\u9259", "\u9259"], /* CJK Ideograph */ + ["\u925A", "\u925A"], /* CJK Ideograph */ + ["\u925B", "\u925B"], /* CJK Ideograph */ + ["\u925C", "\u925C"], /* CJK Ideograph */ + ["\u925D", "\u925D"], /* CJK Ideograph */ + ["\u925E", "\u925E"], /* CJK Ideograph */ + ["\u925F", "\u925F"], /* CJK Ideograph */ + ["\u9260", "\u9260"], /* CJK Ideograph */ + ["\u9261", "\u9261"], /* CJK Ideograph */ + ["\u9262", "\u9262"], /* CJK Ideograph */ + ["\u9263", "\u9263"], /* CJK Ideograph */ + ["\u9264", "\u9264"], /* CJK Ideograph */ + ["\u9265", "\u9265"], /* CJK Ideograph */ + ["\u9266", "\u9266"], /* CJK Ideograph */ + ["\u9267", "\u9267"], /* CJK Ideograph */ + ["\u9268", "\u9268"], /* CJK Ideograph */ + ["\u9269", "\u9269"], /* CJK Ideograph */ + ["\u926A", "\u926A"], /* CJK Ideograph */ + ["\u926B", "\u926B"], /* CJK Ideograph */ + ["\u926C", "\u926C"], /* CJK Ideograph */ + ["\u926D", "\u926D"], /* CJK Ideograph */ + ["\u926E", "\u926E"], /* CJK Ideograph */ + ["\u926F", "\u926F"], /* CJK Ideograph */ + ["\u9270", "\u9270"], /* CJK Ideograph */ + ["\u9271", "\u9271"], /* CJK Ideograph */ + ["\u9272", "\u9272"], /* CJK Ideograph */ + ["\u9273", "\u9273"], /* CJK Ideograph */ + ["\u9274", "\u9274"], /* CJK Ideograph */ + ["\u9275", "\u9275"], /* CJK Ideograph */ + ["\u9276", "\u9276"], /* CJK Ideograph */ + ["\u9277", "\u9277"], /* CJK Ideograph */ + ["\u9278", "\u9278"], /* CJK Ideograph */ + ["\u9279", "\u9279"], /* CJK Ideograph */ + ["\u927A", "\u927A"], /* CJK Ideograph */ + ["\u927B", "\u927B"], /* CJK Ideograph */ + ["\u927C", "\u927C"], /* CJK Ideograph */ + ["\u927D", "\u927D"], /* CJK Ideograph */ + ["\u927E", "\u927E"], /* CJK Ideograph */ + ["\u927F", "\u927F"], /* CJK Ideograph */ + ["\u9280", "\u9280"], /* CJK Ideograph */ + ["\u9281", "\u9281"], /* CJK Ideograph */ + ["\u9282", "\u9282"], /* CJK Ideograph */ + ["\u9283", "\u9283"], /* CJK Ideograph */ + ["\u9284", "\u9284"], /* CJK Ideograph */ + ["\u9285", "\u9285"], /* CJK Ideograph */ + ["\u9286", "\u9286"], /* CJK Ideograph */ + ["\u9287", "\u9287"], /* CJK Ideograph */ + ["\u9288", "\u9288"], /* CJK Ideograph */ + ["\u9289", "\u9289"], /* CJK Ideograph */ + ["\u928A", "\u928A"], /* CJK Ideograph */ + ["\u928B", "\u928B"], /* CJK Ideograph */ + ["\u928C", "\u928C"], /* CJK Ideograph */ + ["\u928D", "\u928D"], /* CJK Ideograph */ + ["\u928E", "\u928E"], /* CJK Ideograph */ + ["\u928F", "\u928F"], /* CJK Ideograph */ + ["\u9290", "\u9290"], /* CJK Ideograph */ + ["\u9291", "\u9291"], /* CJK Ideograph */ + ["\u9292", "\u9292"], /* CJK Ideograph */ + ["\u9293", "\u9293"], /* CJK Ideograph */ + ["\u9294", "\u9294"], /* CJK Ideograph */ + ["\u9295", "\u9295"], /* CJK Ideograph */ + ["\u9296", "\u9296"], /* CJK Ideograph */ + ["\u9297", "\u9297"], /* CJK Ideograph */ + ["\u9298", "\u9298"], /* CJK Ideograph */ + ["\u9299", "\u9299"], /* CJK Ideograph */ + ["\u929A", "\u929A"], /* CJK Ideograph */ + ["\u929B", "\u929B"], /* CJK Ideograph */ + ["\u929C", "\u929C"], /* CJK Ideograph */ + ["\u929D", "\u929D"], /* CJK Ideograph */ + ["\u929E", "\u929E"], /* CJK Ideograph */ + ["\u929F", "\u929F"], /* CJK Ideograph */ + ["\u92A0", "\u92A0"], /* CJK Ideograph */ + ["\u92A1", "\u92A1"], /* CJK Ideograph */ + ["\u92A2", "\u92A2"], /* CJK Ideograph */ + ["\u92A3", "\u92A3"], /* CJK Ideograph */ + ["\u92A4", "\u92A4"], /* CJK Ideograph */ + ["\u92A5", "\u92A5"], /* CJK Ideograph */ + ["\u92A6", "\u92A6"], /* CJK Ideograph */ + ["\u92A7", "\u92A7"], /* CJK Ideograph */ + ["\u92A8", "\u92A8"], /* CJK Ideograph */ + ["\u92A9", "\u92A9"], /* CJK Ideograph */ + ["\u92AA", "\u92AA"], /* CJK Ideograph */ + ["\u92AB", "\u92AB"], /* CJK Ideograph */ + ["\u92AC", "\u92AC"], /* CJK Ideograph */ + ["\u92AD", "\u92AD"], /* CJK Ideograph */ + ["\u92AE", "\u92AE"], /* CJK Ideograph */ + ["\u92AF", "\u92AF"], /* CJK Ideograph */ + ["\u92B0", "\u92B0"], /* CJK Ideograph */ + ["\u92B1", "\u92B1"], /* CJK Ideograph */ + ["\u92B2", "\u92B2"], /* CJK Ideograph */ + ["\u92B3", "\u92B3"], /* CJK Ideograph */ + ["\u92B4", "\u92B4"], /* CJK Ideograph */ + ["\u92B5", "\u92B5"], /* CJK Ideograph */ + ["\u92B6", "\u92B6"], /* CJK Ideograph */ + ["\u92B7", "\u92B7"], /* CJK Ideograph */ + ["\u92B8", "\u92B8"], /* CJK Ideograph */ + ["\u92B9", "\u92B9"], /* CJK Ideograph */ + ["\u92BA", "\u92BA"], /* CJK Ideograph */ + ["\u92BB", "\u92BB"], /* CJK Ideograph */ + ["\u92BC", "\u92BC"], /* CJK Ideograph */ + ["\u92BD", "\u92BD"], /* CJK Ideograph */ + ["\u92BE", "\u92BE"], /* CJK Ideograph */ + ["\u92BF", "\u92BF"], /* CJK Ideograph */ + ["\u92C0", "\u92C0"], /* CJK Ideograph */ + ["\u92C1", "\u92C1"], /* CJK Ideograph */ + ["\u92C2", "\u92C2"], /* CJK Ideograph */ + ["\u92C3", "\u92C3"], /* CJK Ideograph */ + ["\u92C4", "\u92C4"], /* CJK Ideograph */ + ["\u92C5", "\u92C5"], /* CJK Ideograph */ + ["\u92C6", "\u92C6"], /* CJK Ideograph */ + ["\u92C7", "\u92C7"], /* CJK Ideograph */ + ["\u92C8", "\u92C8"], /* CJK Ideograph */ + ["\u92C9", "\u92C9"], /* CJK Ideograph */ + ["\u92CA", "\u92CA"], /* CJK Ideograph */ + ["\u92CB", "\u92CB"], /* CJK Ideograph */ + ["\u92CC", "\u92CC"], /* CJK Ideograph */ + ["\u92CD", "\u92CD"], /* CJK Ideograph */ + ["\u92CE", "\u92CE"], /* CJK Ideograph */ + ["\u92CF", "\u92CF"], /* CJK Ideograph */ + ["\u92D0", "\u92D0"], /* CJK Ideograph */ + ["\u92D1", "\u92D1"], /* CJK Ideograph */ + ["\u92D2", "\u92D2"], /* CJK Ideograph */ + ["\u92D3", "\u92D3"], /* CJK Ideograph */ + ["\u92D4", "\u92D4"], /* CJK Ideograph */ + ["\u92D5", "\u92D5"], /* CJK Ideograph */ + ["\u92D6", "\u92D6"], /* CJK Ideograph */ + ["\u92D7", "\u92D7"], /* CJK Ideograph */ + ["\u92D8", "\u92D8"], /* CJK Ideograph */ + ["\u92D9", "\u92D9"], /* CJK Ideograph */ + ["\u92DA", "\u92DA"], /* CJK Ideograph */ + ["\u92DB", "\u92DB"], /* CJK Ideograph */ + ["\u92DC", "\u92DC"], /* CJK Ideograph */ + ["\u92DD", "\u92DD"], /* CJK Ideograph */ + ["\u92DE", "\u92DE"], /* CJK Ideograph */ + ["\u92DF", "\u92DF"], /* CJK Ideograph */ + ["\u92E0", "\u92E0"], /* CJK Ideograph */ + ["\u92E1", "\u92E1"], /* CJK Ideograph */ + ["\u92E2", "\u92E2"], /* CJK Ideograph */ + ["\u92E3", "\u92E3"], /* CJK Ideograph */ + ["\u92E4", "\u92E4"], /* CJK Ideograph */ + ["\u92E5", "\u92E5"], /* CJK Ideograph */ + ["\u92E6", "\u92E6"], /* CJK Ideograph */ + ["\u92E7", "\u92E7"], /* CJK Ideograph */ + ["\u92E8", "\u92E8"], /* CJK Ideograph */ + ["\u92E9", "\u92E9"], /* CJK Ideograph */ + ["\u92EA", "\u92EA"], /* CJK Ideograph */ + ["\u92EB", "\u92EB"], /* CJK Ideograph */ + ["\u92EC", "\u92EC"], /* CJK Ideograph */ + ["\u92ED", "\u92ED"], /* CJK Ideograph */ + ["\u92EE", "\u92EE"], /* CJK Ideograph */ + ["\u92EF", "\u92EF"], /* CJK Ideograph */ + ["\u92F0", "\u92F0"], /* CJK Ideograph */ + ["\u92F1", "\u92F1"], /* CJK Ideograph */ + ["\u92F2", "\u92F2"], /* CJK Ideograph */ + ["\u92F3", "\u92F3"], /* CJK Ideograph */ + ["\u92F4", "\u92F4"], /* CJK Ideograph */ + ["\u92F5", "\u92F5"], /* CJK Ideograph */ + ["\u92F6", "\u92F6"], /* CJK Ideograph */ + ["\u92F7", "\u92F7"], /* CJK Ideograph */ + ["\u92F8", "\u92F8"], /* CJK Ideograph */ + ["\u92F9", "\u92F9"], /* CJK Ideograph */ + ["\u92FA", "\u92FA"], /* CJK Ideograph */ + ["\u92FB", "\u92FB"], /* CJK Ideograph */ + ["\u92FC", "\u92FC"], /* CJK Ideograph */ + ["\u92FD", "\u92FD"], /* CJK Ideograph */ + ["\u92FE", "\u92FE"], /* CJK Ideograph */ + ["\u92FF", "\u92FF"], /* CJK Ideograph */ + ["\u9300", "\u9300"], /* CJK Ideograph */ + ["\u9301", "\u9301"], /* CJK Ideograph */ + ["\u9302", "\u9302"], /* CJK Ideograph */ + ["\u9303", "\u9303"], /* CJK Ideograph */ + ["\u9304", "\u9304"], /* CJK Ideograph */ + ["\u9305", "\u9305"], /* CJK Ideograph */ + ["\u9306", "\u9306"], /* CJK Ideograph */ + ["\u9307", "\u9307"], /* CJK Ideograph */ + ["\u9308", "\u9308"], /* CJK Ideograph */ + ["\u9309", "\u9309"], /* CJK Ideograph */ + ["\u930A", "\u930A"], /* CJK Ideograph */ + ["\u930B", "\u930B"], /* CJK Ideograph */ + ["\u930C", "\u930C"], /* CJK Ideograph */ + ["\u930D", "\u930D"], /* CJK Ideograph */ + ["\u930E", "\u930E"], /* CJK Ideograph */ + ["\u930F", "\u930F"], /* CJK Ideograph */ + ["\u9310", "\u9310"], /* CJK Ideograph */ + ["\u9311", "\u9311"], /* CJK Ideograph */ + ["\u9312", "\u9312"], /* CJK Ideograph */ + ["\u9313", "\u9313"], /* CJK Ideograph */ + ["\u9314", "\u9314"], /* CJK Ideograph */ + ["\u9315", "\u9315"], /* CJK Ideograph */ + ["\u9316", "\u9316"], /* CJK Ideograph */ + ["\u9317", "\u9317"], /* CJK Ideograph */ + ["\u9318", "\u9318"], /* CJK Ideograph */ + ["\u9319", "\u9319"], /* CJK Ideograph */ + ["\u931A", "\u931A"], /* CJK Ideograph */ + ["\u931B", "\u931B"], /* CJK Ideograph */ + ["\u931C", "\u931C"], /* CJK Ideograph */ + ["\u931D", "\u931D"], /* CJK Ideograph */ + ["\u931E", "\u931E"], /* CJK Ideograph */ + ["\u931F", "\u931F"], /* CJK Ideograph */ + ["\u9320", "\u9320"], /* CJK Ideograph */ + ["\u9321", "\u9321"], /* CJK Ideograph */ + ["\u9322", "\u9322"], /* CJK Ideograph */ + ["\u9323", "\u9323"], /* CJK Ideograph */ + ["\u9324", "\u9324"], /* CJK Ideograph */ + ["\u9325", "\u9325"], /* CJK Ideograph */ + ["\u9326", "\u9326"], /* CJK Ideograph */ + ["\u9327", "\u9327"], /* CJK Ideograph */ + ["\u9328", "\u9328"], /* CJK Ideograph */ + ["\u9329", "\u9329"], /* CJK Ideograph */ + ["\u932A", "\u932A"], /* CJK Ideograph */ + ["\u932B", "\u932B"], /* CJK Ideograph */ + ["\u932C", "\u932C"], /* CJK Ideograph */ + ["\u932D", "\u932D"], /* CJK Ideograph */ + ["\u932E", "\u932E"], /* CJK Ideograph */ + ["\u932F", "\u932F"], /* CJK Ideograph */ + ["\u9330", "\u9330"], /* CJK Ideograph */ + ["\u9331", "\u9331"], /* CJK Ideograph */ + ["\u9332", "\u9332"], /* CJK Ideograph */ + ["\u9333", "\u9333"], /* CJK Ideograph */ + ["\u9334", "\u9334"], /* CJK Ideograph */ + ["\u9335", "\u9335"], /* CJK Ideograph */ + ["\u9336", "\u9336"], /* CJK Ideograph */ + ["\u9337", "\u9337"], /* CJK Ideograph */ + ["\u9338", "\u9338"], /* CJK Ideograph */ + ["\u9339", "\u9339"], /* CJK Ideograph */ + ["\u933A", "\u933A"], /* CJK Ideograph */ + ["\u933B", "\u933B"], /* CJK Ideograph */ + ["\u933C", "\u933C"], /* CJK Ideograph */ + ["\u933D", "\u933D"], /* CJK Ideograph */ + ["\u933E", "\u933E"], /* CJK Ideograph */ + ["\u933F", "\u933F"], /* CJK Ideograph */ + ["\u9340", "\u9340"], /* CJK Ideograph */ + ["\u9341", "\u9341"], /* CJK Ideograph */ + ["\u9342", "\u9342"], /* CJK Ideograph */ + ["\u9343", "\u9343"], /* CJK Ideograph */ + ["\u9344", "\u9344"], /* CJK Ideograph */ + ["\u9345", "\u9345"], /* CJK Ideograph */ + ["\u9346", "\u9346"], /* CJK Ideograph */ + ["\u9347", "\u9347"], /* CJK Ideograph */ + ["\u9348", "\u9348"], /* CJK Ideograph */ + ["\u9349", "\u9349"], /* CJK Ideograph */ + ["\u934A", "\u934A"], /* CJK Ideograph */ + ["\u934B", "\u934B"], /* CJK Ideograph */ + ["\u934C", "\u934C"], /* CJK Ideograph */ + ["\u934D", "\u934D"], /* CJK Ideograph */ + ["\u934E", "\u934E"], /* CJK Ideograph */ + ["\u934F", "\u934F"], /* CJK Ideograph */ + ["\u9350", "\u9350"], /* CJK Ideograph */ + ["\u9351", "\u9351"], /* CJK Ideograph */ + ["\u9352", "\u9352"], /* CJK Ideograph */ + ["\u9353", "\u9353"], /* CJK Ideograph */ + ["\u9354", "\u9354"], /* CJK Ideograph */ + ["\u9355", "\u9355"], /* CJK Ideograph */ + ["\u9356", "\u9356"], /* CJK Ideograph */ + ["\u9357", "\u9357"], /* CJK Ideograph */ + ["\u9358", "\u9358"], /* CJK Ideograph */ + ["\u9359", "\u9359"], /* CJK Ideograph */ + ["\u935A", "\u935A"], /* CJK Ideograph */ + ["\u935B", "\u935B"], /* CJK Ideograph */ + ["\u935C", "\u935C"], /* CJK Ideograph */ + ["\u935D", "\u935D"], /* CJK Ideograph */ + ["\u935E", "\u935E"], /* CJK Ideograph */ + ["\u935F", "\u935F"], /* CJK Ideograph */ + ["\u9360", "\u9360"], /* CJK Ideograph */ + ["\u9361", "\u9361"], /* CJK Ideograph */ + ["\u9362", "\u9362"], /* CJK Ideograph */ + ["\u9363", "\u9363"], /* CJK Ideograph */ + ["\u9364", "\u9364"], /* CJK Ideograph */ + ["\u9365", "\u9365"], /* CJK Ideograph */ + ["\u9366", "\u9366"], /* CJK Ideograph */ + ["\u9367", "\u9367"], /* CJK Ideograph */ + ["\u9368", "\u9368"], /* CJK Ideograph */ + ["\u9369", "\u9369"], /* CJK Ideograph */ + ["\u936A", "\u936A"], /* CJK Ideograph */ + ["\u936B", "\u936B"], /* CJK Ideograph */ + ["\u936C", "\u936C"], /* CJK Ideograph */ + ["\u936D", "\u936D"], /* CJK Ideograph */ + ["\u936E", "\u936E"], /* CJK Ideograph */ + ["\u936F", "\u936F"], /* CJK Ideograph */ + ["\u9370", "\u9370"], /* CJK Ideograph */ + ["\u9371", "\u9371"], /* CJK Ideograph */ + ["\u9372", "\u9372"], /* CJK Ideograph */ + ["\u9373", "\u9373"], /* CJK Ideograph */ + ["\u9374", "\u9374"], /* CJK Ideograph */ + ["\u9375", "\u9375"], /* CJK Ideograph */ + ["\u9376", "\u9376"], /* CJK Ideograph */ + ["\u9377", "\u9377"], /* CJK Ideograph */ + ["\u9378", "\u9378"], /* CJK Ideograph */ + ["\u9379", "\u9379"], /* CJK Ideograph */ + ["\u937A", "\u937A"], /* CJK Ideograph */ + ["\u937B", "\u937B"], /* CJK Ideograph */ + ["\u937C", "\u937C"], /* CJK Ideograph */ + ["\u937D", "\u937D"], /* CJK Ideograph */ + ["\u937E", "\u937E"], /* CJK Ideograph */ + ["\u937F", "\u937F"], /* CJK Ideograph */ + ["\u9380", "\u9380"], /* CJK Ideograph */ + ["\u9381", "\u9381"], /* CJK Ideograph */ + ["\u9382", "\u9382"], /* CJK Ideograph */ + ["\u9383", "\u9383"], /* CJK Ideograph */ + ["\u9384", "\u9384"], /* CJK Ideograph */ + ["\u9385", "\u9385"], /* CJK Ideograph */ + ["\u9386", "\u9386"], /* CJK Ideograph */ + ["\u9387", "\u9387"], /* CJK Ideograph */ + ["\u9388", "\u9388"], /* CJK Ideograph */ + ["\u9389", "\u9389"], /* CJK Ideograph */ + ["\u938A", "\u938A"], /* CJK Ideograph */ + ["\u938B", "\u938B"], /* CJK Ideograph */ + ["\u938C", "\u938C"], /* CJK Ideograph */ + ["\u938D", "\u938D"], /* CJK Ideograph */ + ["\u938E", "\u938E"], /* CJK Ideograph */ + ["\u938F", "\u938F"], /* CJK Ideograph */ + ["\u9390", "\u9390"], /* CJK Ideograph */ + ["\u9391", "\u9391"], /* CJK Ideograph */ + ["\u9392", "\u9392"], /* CJK Ideograph */ + ["\u9393", "\u9393"], /* CJK Ideograph */ + ["\u9394", "\u9394"], /* CJK Ideograph */ + ["\u9395", "\u9395"], /* CJK Ideograph */ + ["\u9396", "\u9396"], /* CJK Ideograph */ + ["\u9397", "\u9397"], /* CJK Ideograph */ + ["\u9398", "\u9398"], /* CJK Ideograph */ + ["\u9399", "\u9399"], /* CJK Ideograph */ + ["\u939A", "\u939A"], /* CJK Ideograph */ + ["\u939B", "\u939B"], /* CJK Ideograph */ + ["\u939C", "\u939C"], /* CJK Ideograph */ + ["\u939D", "\u939D"], /* CJK Ideograph */ + ["\u939E", "\u939E"], /* CJK Ideograph */ + ["\u939F", "\u939F"], /* CJK Ideograph */ + ["\u93A0", "\u93A0"], /* CJK Ideograph */ + ["\u93A1", "\u93A1"], /* CJK Ideograph */ + ["\u93A2", "\u93A2"], /* CJK Ideograph */ + ["\u93A3", "\u93A3"], /* CJK Ideograph */ + ["\u93A4", "\u93A4"], /* CJK Ideograph */ + ["\u93A5", "\u93A5"], /* CJK Ideograph */ + ["\u93A6", "\u93A6"], /* CJK Ideograph */ + ["\u93A7", "\u93A7"], /* CJK Ideograph */ + ["\u93A8", "\u93A8"], /* CJK Ideograph */ + ["\u93A9", "\u93A9"], /* CJK Ideograph */ + ["\u93AA", "\u93AA"], /* CJK Ideograph */ + ["\u93AB", "\u93AB"], /* CJK Ideograph */ + ["\u93AC", "\u93AC"], /* CJK Ideograph */ + ["\u93AD", "\u93AD"], /* CJK Ideograph */ + ["\u93AE", "\u93AE"], /* CJK Ideograph */ + ["\u93AF", "\u93AF"], /* CJK Ideograph */ + ["\u93B0", "\u93B0"], /* CJK Ideograph */ + ["\u93B1", "\u93B1"], /* CJK Ideograph */ + ["\u93B2", "\u93B2"], /* CJK Ideograph */ + ["\u93B3", "\u93B3"], /* CJK Ideograph */ + ["\u93B4", "\u93B4"], /* CJK Ideograph */ + ["\u93B5", "\u93B5"], /* CJK Ideograph */ + ["\u93B6", "\u93B6"], /* CJK Ideograph */ + ["\u93B7", "\u93B7"], /* CJK Ideograph */ + ["\u93B8", "\u93B8"], /* CJK Ideograph */ + ["\u93B9", "\u93B9"], /* CJK Ideograph */ + ["\u93BA", "\u93BA"], /* CJK Ideograph */ + ["\u93BB", "\u93BB"], /* CJK Ideograph */ + ["\u93BC", "\u93BC"], /* CJK Ideograph */ + ["\u93BD", "\u93BD"], /* CJK Ideograph */ + ["\u93BE", "\u93BE"], /* CJK Ideograph */ + ["\u93BF", "\u93BF"], /* CJK Ideograph */ + ["\u93C0", "\u93C0"], /* CJK Ideograph */ + ["\u93C1", "\u93C1"], /* CJK Ideograph */ + ["\u93C2", "\u93C2"], /* CJK Ideograph */ + ["\u93C3", "\u93C3"], /* CJK Ideograph */ + ["\u93C4", "\u93C4"], /* CJK Ideograph */ + ["\u93C5", "\u93C5"], /* CJK Ideograph */ + ["\u93C6", "\u93C6"], /* CJK Ideograph */ + ["\u93C7", "\u93C7"], /* CJK Ideograph */ + ["\u93C8", "\u93C8"], /* CJK Ideograph */ + ["\u93C9", "\u93C9"], /* CJK Ideograph */ + ["\u93CA", "\u93CA"], /* CJK Ideograph */ + ["\u93CB", "\u93CB"], /* CJK Ideograph */ + ["\u93CC", "\u93CC"], /* CJK Ideograph */ + ["\u93CD", "\u93CD"], /* CJK Ideograph */ + ["\u93CE", "\u93CE"], /* CJK Ideograph */ + ["\u93CF", "\u93CF"], /* CJK Ideograph */ + ["\u93D0", "\u93D0"], /* CJK Ideograph */ + ["\u93D1", "\u93D1"], /* CJK Ideograph */ + ["\u93D2", "\u93D2"], /* CJK Ideograph */ + ["\u93D3", "\u93D3"], /* CJK Ideograph */ + ["\u93D4", "\u93D4"], /* CJK Ideograph */ + ["\u93D5", "\u93D5"], /* CJK Ideograph */ + ["\u93D6", "\u93D6"], /* CJK Ideograph */ + ["\u93D7", "\u93D7"], /* CJK Ideograph */ + ["\u93D8", "\u93D8"], /* CJK Ideograph */ + ["\u93D9", "\u93D9"], /* CJK Ideograph */ + ["\u93DA", "\u93DA"], /* CJK Ideograph */ + ["\u93DB", "\u93DB"], /* CJK Ideograph */ + ["\u93DC", "\u93DC"], /* CJK Ideograph */ + ["\u93DD", "\u93DD"], /* CJK Ideograph */ + ["\u93DE", "\u93DE"], /* CJK Ideograph */ + ["\u93DF", "\u93DF"], /* CJK Ideograph */ + ["\u93E0", "\u93E0"], /* CJK Ideograph */ + ["\u93E1", "\u93E1"], /* CJK Ideograph */ + ["\u93E2", "\u93E2"], /* CJK Ideograph */ + ["\u93E3", "\u93E3"], /* CJK Ideograph */ + ["\u93E4", "\u93E4"], /* CJK Ideograph */ + ["\u93E5", "\u93E5"], /* CJK Ideograph */ + ["\u93E6", "\u93E6"], /* CJK Ideograph */ + ["\u93E7", "\u93E7"], /* CJK Ideograph */ + ["\u93E8", "\u93E8"], /* CJK Ideograph */ + ["\u93E9", "\u93E9"], /* CJK Ideograph */ + ["\u93EA", "\u93EA"], /* CJK Ideograph */ + ["\u93EB", "\u93EB"], /* CJK Ideograph */ + ["\u93EC", "\u93EC"], /* CJK Ideograph */ + ["\u93ED", "\u93ED"], /* CJK Ideograph */ + ["\u93EE", "\u93EE"], /* CJK Ideograph */ + ["\u93EF", "\u93EF"], /* CJK Ideograph */ + ["\u93F0", "\u93F0"], /* CJK Ideograph */ + ["\u93F1", "\u93F1"], /* CJK Ideograph */ + ["\u93F2", "\u93F2"], /* CJK Ideograph */ + ["\u93F3", "\u93F3"], /* CJK Ideograph */ + ["\u93F4", "\u93F4"], /* CJK Ideograph */ + ["\u93F5", "\u93F5"], /* CJK Ideograph */ + ["\u93F6", "\u93F6"], /* CJK Ideograph */ + ["\u93F7", "\u93F7"], /* CJK Ideograph */ + ["\u93F8", "\u93F8"], /* CJK Ideograph */ + ["\u93F9", "\u93F9"], /* CJK Ideograph */ + ["\u93FA", "\u93FA"], /* CJK Ideograph */ + ["\u93FB", "\u93FB"], /* CJK Ideograph */ + ["\u93FC", "\u93FC"], /* CJK Ideograph */ + ["\u93FD", "\u93FD"], /* CJK Ideograph */ + ["\u93FE", "\u93FE"], /* CJK Ideograph */ + ["\u93FF", "\u93FF"], /* CJK Ideograph */ + ["\u9400", "\u9400"], /* CJK Ideograph */ + ["\u9401", "\u9401"], /* CJK Ideograph */ + ["\u9402", "\u9402"], /* CJK Ideograph */ + ["\u9403", "\u9403"], /* CJK Ideograph */ + ["\u9404", "\u9404"], /* CJK Ideograph */ + ["\u9405", "\u9405"], /* CJK Ideograph */ + ["\u9406", "\u9406"], /* CJK Ideograph */ + ["\u9407", "\u9407"], /* CJK Ideograph */ + ["\u9408", "\u9408"], /* CJK Ideograph */ + ["\u9409", "\u9409"], /* CJK Ideograph */ + ["\u940A", "\u940A"], /* CJK Ideograph */ + ["\u940B", "\u940B"], /* CJK Ideograph */ + ["\u940C", "\u940C"], /* CJK Ideograph */ + ["\u940D", "\u940D"], /* CJK Ideograph */ + ["\u940E", "\u940E"], /* CJK Ideograph */ + ["\u940F", "\u940F"], /* CJK Ideograph */ + ["\u9410", "\u9410"], /* CJK Ideograph */ + ["\u9411", "\u9411"], /* CJK Ideograph */ + ["\u9412", "\u9412"], /* CJK Ideograph */ + ["\u9413", "\u9413"], /* CJK Ideograph */ + ["\u9414", "\u9414"], /* CJK Ideograph */ + ["\u9415", "\u9415"], /* CJK Ideograph */ + ["\u9416", "\u9416"], /* CJK Ideograph */ + ["\u9417", "\u9417"], /* CJK Ideograph */ + ["\u9418", "\u9418"], /* CJK Ideograph */ + ["\u9419", "\u9419"], /* CJK Ideograph */ + ["\u941A", "\u941A"], /* CJK Ideograph */ + ["\u941B", "\u941B"], /* CJK Ideograph */ + ["\u941C", "\u941C"], /* CJK Ideograph */ + ["\u941D", "\u941D"], /* CJK Ideograph */ + ["\u941E", "\u941E"], /* CJK Ideograph */ + ["\u941F", "\u941F"], /* CJK Ideograph */ + ["\u9420", "\u9420"], /* CJK Ideograph */ + ["\u9421", "\u9421"], /* CJK Ideograph */ + ["\u9422", "\u9422"], /* CJK Ideograph */ + ["\u9423", "\u9423"], /* CJK Ideograph */ + ["\u9424", "\u9424"], /* CJK Ideograph */ + ["\u9425", "\u9425"], /* CJK Ideograph */ + ["\u9426", "\u9426"], /* CJK Ideograph */ + ["\u9427", "\u9427"], /* CJK Ideograph */ + ["\u9428", "\u9428"], /* CJK Ideograph */ + ["\u9429", "\u9429"], /* CJK Ideograph */ + ["\u942A", "\u942A"], /* CJK Ideograph */ + ["\u942B", "\u942B"], /* CJK Ideograph */ + ["\u942C", "\u942C"], /* CJK Ideograph */ + ["\u942D", "\u942D"], /* CJK Ideograph */ + ["\u942E", "\u942E"], /* CJK Ideograph */ + ["\u942F", "\u942F"], /* CJK Ideograph */ + ["\u9430", "\u9430"], /* CJK Ideograph */ + ["\u9431", "\u9431"], /* CJK Ideograph */ + ["\u9432", "\u9432"], /* CJK Ideograph */ + ["\u9433", "\u9433"], /* CJK Ideograph */ + ["\u9434", "\u9434"], /* CJK Ideograph */ + ["\u9435", "\u9435"], /* CJK Ideograph */ + ["\u9436", "\u9436"], /* CJK Ideograph */ + ["\u9437", "\u9437"], /* CJK Ideograph */ + ["\u9438", "\u9438"], /* CJK Ideograph */ + ["\u9439", "\u9439"], /* CJK Ideograph */ + ["\u943A", "\u943A"], /* CJK Ideograph */ + ["\u943B", "\u943B"], /* CJK Ideograph */ + ["\u943C", "\u943C"], /* CJK Ideograph */ + ["\u943D", "\u943D"], /* CJK Ideograph */ + ["\u943E", "\u943E"], /* CJK Ideograph */ + ["\u943F", "\u943F"], /* CJK Ideograph */ + ["\u9440", "\u9440"], /* CJK Ideograph */ + ["\u9441", "\u9441"], /* CJK Ideograph */ + ["\u9442", "\u9442"], /* CJK Ideograph */ + ["\u9443", "\u9443"], /* CJK Ideograph */ + ["\u9444", "\u9444"], /* CJK Ideograph */ + ["\u9445", "\u9445"], /* CJK Ideograph */ + ["\u9446", "\u9446"], /* CJK Ideograph */ + ["\u9447", "\u9447"], /* CJK Ideograph */ + ["\u9448", "\u9448"], /* CJK Ideograph */ + ["\u9449", "\u9449"], /* CJK Ideograph */ + ["\u944A", "\u944A"], /* CJK Ideograph */ + ["\u944B", "\u944B"], /* CJK Ideograph */ + ["\u944C", "\u944C"], /* CJK Ideograph */ + ["\u944D", "\u944D"], /* CJK Ideograph */ + ["\u944E", "\u944E"], /* CJK Ideograph */ + ["\u944F", "\u944F"], /* CJK Ideograph */ + ["\u9450", "\u9450"], /* CJK Ideograph */ + ["\u9451", "\u9451"], /* CJK Ideograph */ + ["\u9452", "\u9452"], /* CJK Ideograph */ + ["\u9453", "\u9453"], /* CJK Ideograph */ + ["\u9454", "\u9454"], /* CJK Ideograph */ + ["\u9455", "\u9455"], /* CJK Ideograph */ + ["\u9456", "\u9456"], /* CJK Ideograph */ + ["\u9457", "\u9457"], /* CJK Ideograph */ + ["\u9458", "\u9458"], /* CJK Ideograph */ + ["\u9459", "\u9459"], /* CJK Ideograph */ + ["\u945A", "\u945A"], /* CJK Ideograph */ + ["\u945B", "\u945B"], /* CJK Ideograph */ + ["\u945C", "\u945C"], /* CJK Ideograph */ + ["\u945D", "\u945D"], /* CJK Ideograph */ + ["\u945E", "\u945E"], /* CJK Ideograph */ + ["\u945F", "\u945F"], /* CJK Ideograph */ + ["\u9460", "\u9460"], /* CJK Ideograph */ + ["\u9461", "\u9461"], /* CJK Ideograph */ + ["\u9462", "\u9462"], /* CJK Ideograph */ + ["\u9463", "\u9463"], /* CJK Ideograph */ + ["\u9464", "\u9464"], /* CJK Ideograph */ + ["\u9465", "\u9465"], /* CJK Ideograph */ + ["\u9466", "\u9466"], /* CJK Ideograph */ + ["\u9467", "\u9467"], /* CJK Ideograph */ + ["\u9468", "\u9468"], /* CJK Ideograph */ + ["\u9469", "\u9469"], /* CJK Ideograph */ + ["\u946A", "\u946A"], /* CJK Ideograph */ + ["\u946B", "\u946B"], /* CJK Ideograph */ + ["\u946C", "\u946C"], /* CJK Ideograph */ + ["\u946D", "\u946D"], /* CJK Ideograph */ + ["\u946E", "\u946E"], /* CJK Ideograph */ + ["\u946F", "\u946F"], /* CJK Ideograph */ + ["\u9470", "\u9470"], /* CJK Ideograph */ + ["\u9471", "\u9471"], /* CJK Ideograph */ + ["\u9472", "\u9472"], /* CJK Ideograph */ + ["\u9473", "\u9473"], /* CJK Ideograph */ + ["\u9474", "\u9474"], /* CJK Ideograph */ + ["\u9475", "\u9475"], /* CJK Ideograph */ + ["\u9476", "\u9476"], /* CJK Ideograph */ + ["\u9477", "\u9477"], /* CJK Ideograph */ + ["\u9478", "\u9478"], /* CJK Ideograph */ + ["\u9479", "\u9479"], /* CJK Ideograph */ + ["\u947A", "\u947A"], /* CJK Ideograph */ + ["\u947B", "\u947B"], /* CJK Ideograph */ + ["\u947C", "\u947C"], /* CJK Ideograph */ + ["\u947D", "\u947D"], /* CJK Ideograph */ + ["\u947E", "\u947E"], /* CJK Ideograph */ + ["\u947F", "\u947F"], /* CJK Ideograph */ + ["\u9480", "\u9480"], /* CJK Ideograph */ + ["\u9481", "\u9481"], /* CJK Ideograph */ + ["\u9482", "\u9482"], /* CJK Ideograph */ + ["\u9483", "\u9483"], /* CJK Ideograph */ + ["\u9484", "\u9484"], /* CJK Ideograph */ + ["\u9485", "\u9485"], /* CJK Ideograph */ + ["\u9486", "\u9486"], /* CJK Ideograph */ + ["\u9487", "\u9487"], /* CJK Ideograph */ + ["\u9488", "\u9488"], /* CJK Ideograph */ + ["\u9489", "\u9489"], /* CJK Ideograph */ + ["\u948A", "\u948A"], /* CJK Ideograph */ + ["\u948B", "\u948B"], /* CJK Ideograph */ + ["\u948C", "\u948C"], /* CJK Ideograph */ + ["\u948D", "\u948D"], /* CJK Ideograph */ + ["\u948E", "\u948E"], /* CJK Ideograph */ + ["\u948F", "\u948F"], /* CJK Ideograph */ + ["\u9490", "\u9490"], /* CJK Ideograph */ + ["\u9491", "\u9491"], /* CJK Ideograph */ + ["\u9492", "\u9492"], /* CJK Ideograph */ + ["\u9493", "\u9493"], /* CJK Ideograph */ + ["\u9494", "\u9494"], /* CJK Ideograph */ + ["\u9495", "\u9495"], /* CJK Ideograph */ + ["\u9496", "\u9496"], /* CJK Ideograph */ + ["\u9497", "\u9497"], /* CJK Ideograph */ + ["\u9498", "\u9498"], /* CJK Ideograph */ + ["\u9499", "\u9499"], /* CJK Ideograph */ + ["\u949A", "\u949A"], /* CJK Ideograph */ + ["\u949B", "\u949B"], /* CJK Ideograph */ + ["\u949C", "\u949C"], /* CJK Ideograph */ + ["\u949D", "\u949D"], /* CJK Ideograph */ + ["\u949E", "\u949E"], /* CJK Ideograph */ + ["\u949F", "\u949F"], /* CJK Ideograph */ + ["\u94A0", "\u94A0"], /* CJK Ideograph */ + ["\u94A1", "\u94A1"], /* CJK Ideograph */ + ["\u94A2", "\u94A2"], /* CJK Ideograph */ + ["\u94A3", "\u94A3"], /* CJK Ideograph */ + ["\u94A4", "\u94A4"], /* CJK Ideograph */ + ["\u94A5", "\u94A5"], /* CJK Ideograph */ + ["\u94A6", "\u94A6"], /* CJK Ideograph */ + ["\u94A7", "\u94A7"], /* CJK Ideograph */ + ["\u94A8", "\u94A8"], /* CJK Ideograph */ + ["\u94A9", "\u94A9"], /* CJK Ideograph */ + ["\u94AA", "\u94AA"], /* CJK Ideograph */ + ["\u94AB", "\u94AB"], /* CJK Ideograph */ + ["\u94AC", "\u94AC"], /* CJK Ideograph */ + ["\u94AD", "\u94AD"], /* CJK Ideograph */ + ["\u94AE", "\u94AE"], /* CJK Ideograph */ + ["\u94AF", "\u94AF"], /* CJK Ideograph */ + ["\u94B0", "\u94B0"], /* CJK Ideograph */ + ["\u94B1", "\u94B1"], /* CJK Ideograph */ + ["\u94B2", "\u94B2"], /* CJK Ideograph */ + ["\u94B3", "\u94B3"], /* CJK Ideograph */ + ["\u94B4", "\u94B4"], /* CJK Ideograph */ + ["\u94B5", "\u94B5"], /* CJK Ideograph */ + ["\u94B6", "\u94B6"], /* CJK Ideograph */ + ["\u94B7", "\u94B7"], /* CJK Ideograph */ + ["\u94B8", "\u94B8"], /* CJK Ideograph */ + ["\u94B9", "\u94B9"], /* CJK Ideograph */ + ["\u94BA", "\u94BA"], /* CJK Ideograph */ + ["\u94BB", "\u94BB"], /* CJK Ideograph */ + ["\u94BC", "\u94BC"], /* CJK Ideograph */ + ["\u94BD", "\u94BD"], /* CJK Ideograph */ + ["\u94BE", "\u94BE"], /* CJK Ideograph */ + ["\u94BF", "\u94BF"], /* CJK Ideograph */ + ["\u94C0", "\u94C0"], /* CJK Ideograph */ + ["\u94C1", "\u94C1"], /* CJK Ideograph */ + ["\u94C2", "\u94C2"], /* CJK Ideograph */ + ["\u94C3", "\u94C3"], /* CJK Ideograph */ + ["\u94C4", "\u94C4"], /* CJK Ideograph */ + ["\u94C5", "\u94C5"], /* CJK Ideograph */ + ["\u94C6", "\u94C6"], /* CJK Ideograph */ + ["\u94C7", "\u94C7"], /* CJK Ideograph */ + ["\u94C8", "\u94C8"], /* CJK Ideograph */ + ["\u94C9", "\u94C9"], /* CJK Ideograph */ + ["\u94CA", "\u94CA"], /* CJK Ideograph */ + ["\u94CB", "\u94CB"], /* CJK Ideograph */ + ["\u94CC", "\u94CC"], /* CJK Ideograph */ + ["\u94CD", "\u94CD"], /* CJK Ideograph */ + ["\u94CE", "\u94CE"], /* CJK Ideograph */ + ["\u94CF", "\u94CF"], /* CJK Ideograph */ + ["\u94D0", "\u94D0"], /* CJK Ideograph */ + ["\u94D1", "\u94D1"], /* CJK Ideograph */ + ["\u94D2", "\u94D2"], /* CJK Ideograph */ + ["\u94D3", "\u94D3"], /* CJK Ideograph */ + ["\u94D4", "\u94D4"], /* CJK Ideograph */ + ["\u94D5", "\u94D5"], /* CJK Ideograph */ + ["\u94D6", "\u94D6"], /* CJK Ideograph */ + ["\u94D7", "\u94D7"], /* CJK Ideograph */ + ["\u94D8", "\u94D8"], /* CJK Ideograph */ + ["\u94D9", "\u94D9"], /* CJK Ideograph */ + ["\u94DA", "\u94DA"], /* CJK Ideograph */ + ["\u94DB", "\u94DB"], /* CJK Ideograph */ + ["\u94DC", "\u94DC"], /* CJK Ideograph */ + ["\u94DD", "\u94DD"], /* CJK Ideograph */ + ["\u94DE", "\u94DE"], /* CJK Ideograph */ + ["\u94DF", "\u94DF"], /* CJK Ideograph */ + ["\u94E0", "\u94E0"], /* CJK Ideograph */ + ["\u94E1", "\u94E1"], /* CJK Ideograph */ + ["\u94E2", "\u94E2"], /* CJK Ideograph */ + ["\u94E3", "\u94E3"], /* CJK Ideograph */ + ["\u94E4", "\u94E4"], /* CJK Ideograph */ + ["\u94E5", "\u94E5"], /* CJK Ideograph */ + ["\u94E6", "\u94E6"], /* CJK Ideograph */ + ["\u94E7", "\u94E7"], /* CJK Ideograph */ + ["\u94E8", "\u94E8"], /* CJK Ideograph */ + ["\u94E9", "\u94E9"], /* CJK Ideograph */ + ["\u94EA", "\u94EA"], /* CJK Ideograph */ + ["\u94EB", "\u94EB"], /* CJK Ideograph */ + ["\u94EC", "\u94EC"], /* CJK Ideograph */ + ["\u94ED", "\u94ED"], /* CJK Ideograph */ + ["\u94EE", "\u94EE"], /* CJK Ideograph */ + ["\u94EF", "\u94EF"], /* CJK Ideograph */ + ["\u94F0", "\u94F0"], /* CJK Ideograph */ + ["\u94F1", "\u94F1"], /* CJK Ideograph */ + ["\u94F2", "\u94F2"], /* CJK Ideograph */ + ["\u94F3", "\u94F3"], /* CJK Ideograph */ + ["\u94F4", "\u94F4"], /* CJK Ideograph */ + ["\u94F5", "\u94F5"], /* CJK Ideograph */ + ["\u94F6", "\u94F6"], /* CJK Ideograph */ + ["\u94F7", "\u94F7"], /* CJK Ideograph */ + ["\u94F8", "\u94F8"], /* CJK Ideograph */ + ["\u94F9", "\u94F9"], /* CJK Ideograph */ + ["\u94FA", "\u94FA"], /* CJK Ideograph */ + ["\u94FB", "\u94FB"], /* CJK Ideograph */ + ["\u94FC", "\u94FC"], /* CJK Ideograph */ + ["\u94FD", "\u94FD"], /* CJK Ideograph */ + ["\u94FE", "\u94FE"], /* CJK Ideograph */ + ["\u94FF", "\u94FF"], /* CJK Ideograph */ + ["\u9500", "\u9500"], /* CJK Ideograph */ + ["\u9501", "\u9501"], /* CJK Ideograph */ + ["\u9502", "\u9502"], /* CJK Ideograph */ + ["\u9503", "\u9503"], /* CJK Ideograph */ + ["\u9504", "\u9504"], /* CJK Ideograph */ + ["\u9505", "\u9505"], /* CJK Ideograph */ + ["\u9506", "\u9506"], /* CJK Ideograph */ + ["\u9507", "\u9507"], /* CJK Ideograph */ + ["\u9508", "\u9508"], /* CJK Ideograph */ + ["\u9509", "\u9509"], /* CJK Ideograph */ + ["\u950A", "\u950A"], /* CJK Ideograph */ + ["\u950B", "\u950B"], /* CJK Ideograph */ + ["\u950C", "\u950C"], /* CJK Ideograph */ + ["\u950D", "\u950D"], /* CJK Ideograph */ + ["\u950E", "\u950E"], /* CJK Ideograph */ + ["\u950F", "\u950F"], /* CJK Ideograph */ + ["\u9510", "\u9510"], /* CJK Ideograph */ + ["\u9511", "\u9511"], /* CJK Ideograph */ + ["\u9512", "\u9512"], /* CJK Ideograph */ + ["\u9513", "\u9513"], /* CJK Ideograph */ + ["\u9514", "\u9514"], /* CJK Ideograph */ + ["\u9515", "\u9515"], /* CJK Ideograph */ + ["\u9516", "\u9516"], /* CJK Ideograph */ + ["\u9517", "\u9517"], /* CJK Ideograph */ + ["\u9518", "\u9518"], /* CJK Ideograph */ + ["\u9519", "\u9519"], /* CJK Ideograph */ + ["\u951A", "\u951A"], /* CJK Ideograph */ + ["\u951B", "\u951B"], /* CJK Ideograph */ + ["\u951C", "\u951C"], /* CJK Ideograph */ + ["\u951D", "\u951D"], /* CJK Ideograph */ + ["\u951E", "\u951E"], /* CJK Ideograph */ + ["\u951F", "\u951F"], /* CJK Ideograph */ + ["\u9520", "\u9520"], /* CJK Ideograph */ + ["\u9521", "\u9521"], /* CJK Ideograph */ + ["\u9522", "\u9522"], /* CJK Ideograph */ + ["\u9523", "\u9523"], /* CJK Ideograph */ + ["\u9524", "\u9524"], /* CJK Ideograph */ + ["\u9525", "\u9525"], /* CJK Ideograph */ + ["\u9526", "\u9526"], /* CJK Ideograph */ + ["\u9527", "\u9527"], /* CJK Ideograph */ + ["\u9528", "\u9528"], /* CJK Ideograph */ + ["\u9529", "\u9529"], /* CJK Ideograph */ + ["\u952A", "\u952A"], /* CJK Ideograph */ + ["\u952B", "\u952B"], /* CJK Ideograph */ + ["\u952C", "\u952C"], /* CJK Ideograph */ + ["\u952D", "\u952D"], /* CJK Ideograph */ + ["\u952E", "\u952E"], /* CJK Ideograph */ + ["\u952F", "\u952F"], /* CJK Ideograph */ + ["\u9530", "\u9530"], /* CJK Ideograph */ + ["\u9531", "\u9531"], /* CJK Ideograph */ + ["\u9532", "\u9532"], /* CJK Ideograph */ + ["\u9533", "\u9533"], /* CJK Ideograph */ + ["\u9534", "\u9534"], /* CJK Ideograph */ + ["\u9535", "\u9535"], /* CJK Ideograph */ + ["\u9536", "\u9536"], /* CJK Ideograph */ + ["\u9537", "\u9537"], /* CJK Ideograph */ + ["\u9538", "\u9538"], /* CJK Ideograph */ + ["\u9539", "\u9539"], /* CJK Ideograph */ + ["\u953A", "\u953A"], /* CJK Ideograph */ + ["\u953B", "\u953B"], /* CJK Ideograph */ + ["\u953C", "\u953C"], /* CJK Ideograph */ + ["\u953D", "\u953D"], /* CJK Ideograph */ + ["\u953E", "\u953E"], /* CJK Ideograph */ + ["\u953F", "\u953F"], /* CJK Ideograph */ + ["\u9540", "\u9540"], /* CJK Ideograph */ + ["\u9541", "\u9541"], /* CJK Ideograph */ + ["\u9542", "\u9542"], /* CJK Ideograph */ + ["\u9543", "\u9543"], /* CJK Ideograph */ + ["\u9544", "\u9544"], /* CJK Ideograph */ + ["\u9545", "\u9545"], /* CJK Ideograph */ + ["\u9546", "\u9546"], /* CJK Ideograph */ + ["\u9547", "\u9547"], /* CJK Ideograph */ + ["\u9548", "\u9548"], /* CJK Ideograph */ + ["\u9549", "\u9549"], /* CJK Ideograph */ + ["\u954A", "\u954A"], /* CJK Ideograph */ + ["\u954B", "\u954B"], /* CJK Ideograph */ + ["\u954C", "\u954C"], /* CJK Ideograph */ + ["\u954D", "\u954D"], /* CJK Ideograph */ + ["\u954E", "\u954E"], /* CJK Ideograph */ + ["\u954F", "\u954F"], /* CJK Ideograph */ + ["\u9550", "\u9550"], /* CJK Ideograph */ + ["\u9551", "\u9551"], /* CJK Ideograph */ + ["\u9552", "\u9552"], /* CJK Ideograph */ + ["\u9553", "\u9553"], /* CJK Ideograph */ + ["\u9554", "\u9554"], /* CJK Ideograph */ + ["\u9555", "\u9555"], /* CJK Ideograph */ + ["\u9556", "\u9556"], /* CJK Ideograph */ + ["\u9557", "\u9557"], /* CJK Ideograph */ + ["\u9558", "\u9558"], /* CJK Ideograph */ + ["\u9559", "\u9559"], /* CJK Ideograph */ + ["\u955A", "\u955A"], /* CJK Ideograph */ + ["\u955B", "\u955B"], /* CJK Ideograph */ + ["\u955C", "\u955C"], /* CJK Ideograph */ + ["\u955D", "\u955D"], /* CJK Ideograph */ + ["\u955E", "\u955E"], /* CJK Ideograph */ + ["\u955F", "\u955F"], /* CJK Ideograph */ + ["\u9560", "\u9560"], /* CJK Ideograph */ + ["\u9561", "\u9561"], /* CJK Ideograph */ + ["\u9562", "\u9562"], /* CJK Ideograph */ + ["\u9563", "\u9563"], /* CJK Ideograph */ + ["\u9564", "\u9564"], /* CJK Ideograph */ + ["\u9565", "\u9565"], /* CJK Ideograph */ + ["\u9566", "\u9566"], /* CJK Ideograph */ + ["\u9567", "\u9567"], /* CJK Ideograph */ + ["\u9568", "\u9568"], /* CJK Ideograph */ + ["\u9569", "\u9569"], /* CJK Ideograph */ + ["\u956A", "\u956A"], /* CJK Ideograph */ + ["\u956B", "\u956B"], /* CJK Ideograph */ + ["\u956C", "\u956C"], /* CJK Ideograph */ + ["\u956D", "\u956D"], /* CJK Ideograph */ + ["\u956E", "\u956E"], /* CJK Ideograph */ + ["\u956F", "\u956F"], /* CJK Ideograph */ + ["\u9570", "\u9570"], /* CJK Ideograph */ + ["\u9571", "\u9571"], /* CJK Ideograph */ + ["\u9572", "\u9572"], /* CJK Ideograph */ + ["\u9573", "\u9573"], /* CJK Ideograph */ + ["\u9574", "\u9574"], /* CJK Ideograph */ + ["\u9575", "\u9575"], /* CJK Ideograph */ + ["\u9576", "\u9576"], /* CJK Ideograph */ + ["\u9577", "\u9577"], /* CJK Ideograph */ + ["\u9578", "\u9578"], /* CJK Ideograph */ + ["\u9579", "\u9579"], /* CJK Ideograph */ + ["\u957A", "\u957A"], /* CJK Ideograph */ + ["\u957B", "\u957B"], /* CJK Ideograph */ + ["\u957C", "\u957C"], /* CJK Ideograph */ + ["\u957D", "\u957D"], /* CJK Ideograph */ + ["\u957E", "\u957E"], /* CJK Ideograph */ + ["\u957F", "\u957F"], /* CJK Ideograph */ + ["\u9580", "\u9580"], /* CJK Ideograph */ + ["\u9581", "\u9581"], /* CJK Ideograph */ + ["\u9582", "\u9582"], /* CJK Ideograph */ + ["\u9583", "\u9583"], /* CJK Ideograph */ + ["\u9584", "\u9584"], /* CJK Ideograph */ + ["\u9585", "\u9585"], /* CJK Ideograph */ + ["\u9586", "\u9586"], /* CJK Ideograph */ + ["\u9587", "\u9587"], /* CJK Ideograph */ + ["\u9588", "\u9588"], /* CJK Ideograph */ + ["\u9589", "\u9589"], /* CJK Ideograph */ + ["\u958A", "\u958A"], /* CJK Ideograph */ + ["\u958B", "\u958B"], /* CJK Ideograph */ + ["\u958C", "\u958C"], /* CJK Ideograph */ + ["\u958D", "\u958D"], /* CJK Ideograph */ + ["\u958E", "\u958E"], /* CJK Ideograph */ + ["\u958F", "\u958F"], /* CJK Ideograph */ + ["\u9590", "\u9590"], /* CJK Ideograph */ + ["\u9591", "\u9591"], /* CJK Ideograph */ + ["\u9592", "\u9592"], /* CJK Ideograph */ + ["\u9593", "\u9593"], /* CJK Ideograph */ + ["\u9594", "\u9594"], /* CJK Ideograph */ + ["\u9595", "\u9595"], /* CJK Ideograph */ + ["\u9596", "\u9596"], /* CJK Ideograph */ + ["\u9597", "\u9597"], /* CJK Ideograph */ + ["\u9598", "\u9598"], /* CJK Ideograph */ + ["\u9599", "\u9599"], /* CJK Ideograph */ + ["\u959A", "\u959A"], /* CJK Ideograph */ + ["\u959B", "\u959B"], /* CJK Ideograph */ + ["\u959C", "\u959C"], /* CJK Ideograph */ + ["\u959D", "\u959D"], /* CJK Ideograph */ + ["\u959E", "\u959E"], /* CJK Ideograph */ + ["\u959F", "\u959F"], /* CJK Ideograph */ + ["\u95A0", "\u95A0"], /* CJK Ideograph */ + ["\u95A1", "\u95A1"], /* CJK Ideograph */ + ["\u95A2", "\u95A2"], /* CJK Ideograph */ + ["\u95A3", "\u95A3"], /* CJK Ideograph */ + ["\u95A4", "\u95A4"], /* CJK Ideograph */ + ["\u95A5", "\u95A5"], /* CJK Ideograph */ + ["\u95A6", "\u95A6"], /* CJK Ideograph */ + ["\u95A7", "\u95A7"], /* CJK Ideograph */ + ["\u95A8", "\u95A8"], /* CJK Ideograph */ + ["\u95A9", "\u95A9"], /* CJK Ideograph */ + ["\u95AA", "\u95AA"], /* CJK Ideograph */ + ["\u95AB", "\u95AB"], /* CJK Ideograph */ + ["\u95AC", "\u95AC"], /* CJK Ideograph */ + ["\u95AD", "\u95AD"], /* CJK Ideograph */ + ["\u95AE", "\u95AE"], /* CJK Ideograph */ + ["\u95AF", "\u95AF"], /* CJK Ideograph */ + ["\u95B0", "\u95B0"], /* CJK Ideograph */ + ["\u95B1", "\u95B1"], /* CJK Ideograph */ + ["\u95B2", "\u95B2"], /* CJK Ideograph */ + ["\u95B3", "\u95B3"], /* CJK Ideograph */ + ["\u95B4", "\u95B4"], /* CJK Ideograph */ + ["\u95B5", "\u95B5"], /* CJK Ideograph */ + ["\u95B6", "\u95B6"], /* CJK Ideograph */ + ["\u95B7", "\u95B7"], /* CJK Ideograph */ + ["\u95B8", "\u95B8"], /* CJK Ideograph */ + ["\u95B9", "\u95B9"], /* CJK Ideograph */ + ["\u95BA", "\u95BA"], /* CJK Ideograph */ + ["\u95BB", "\u95BB"], /* CJK Ideograph */ + ["\u95BC", "\u95BC"], /* CJK Ideograph */ + ["\u95BD", "\u95BD"], /* CJK Ideograph */ + ["\u95BE", "\u95BE"], /* CJK Ideograph */ + ["\u95BF", "\u95BF"], /* CJK Ideograph */ + ["\u95C0", "\u95C0"], /* CJK Ideograph */ + ["\u95C1", "\u95C1"], /* CJK Ideograph */ + ["\u95C2", "\u95C2"], /* CJK Ideograph */ + ["\u95C3", "\u95C3"], /* CJK Ideograph */ + ["\u95C4", "\u95C4"], /* CJK Ideograph */ + ["\u95C5", "\u95C5"], /* CJK Ideograph */ + ["\u95C6", "\u95C6"], /* CJK Ideograph */ + ["\u95C7", "\u95C7"], /* CJK Ideograph */ + ["\u95C8", "\u95C8"], /* CJK Ideograph */ + ["\u95C9", "\u95C9"], /* CJK Ideograph */ + ["\u95CA", "\u95CA"], /* CJK Ideograph */ + ["\u95CB", "\u95CB"], /* CJK Ideograph */ + ["\u95CC", "\u95CC"], /* CJK Ideograph */ + ["\u95CD", "\u95CD"], /* CJK Ideograph */ + ["\u95CE", "\u95CE"], /* CJK Ideograph */ + ["\u95CF", "\u95CF"], /* CJK Ideograph */ + ["\u95D0", "\u95D0"], /* CJK Ideograph */ + ["\u95D1", "\u95D1"], /* CJK Ideograph */ + ["\u95D2", "\u95D2"], /* CJK Ideograph */ + ["\u95D3", "\u95D3"], /* CJK Ideograph */ + ["\u95D4", "\u95D4"], /* CJK Ideograph */ + ["\u95D5", "\u95D5"], /* CJK Ideograph */ + ["\u95D6", "\u95D6"], /* CJK Ideograph */ + ["\u95D7", "\u95D7"], /* CJK Ideograph */ + ["\u95D8", "\u95D8"], /* CJK Ideograph */ + ["\u95D9", "\u95D9"], /* CJK Ideograph */ + ["\u95DA", "\u95DA"], /* CJK Ideograph */ + ["\u95DB", "\u95DB"], /* CJK Ideograph */ + ["\u95DC", "\u95DC"], /* CJK Ideograph */ + ["\u95DD", "\u95DD"], /* CJK Ideograph */ + ["\u95DE", "\u95DE"], /* CJK Ideograph */ + ["\u95DF", "\u95DF"], /* CJK Ideograph */ + ["\u95E0", "\u95E0"], /* CJK Ideograph */ + ["\u95E1", "\u95E1"], /* CJK Ideograph */ + ["\u95E2", "\u95E2"], /* CJK Ideograph */ + ["\u95E3", "\u95E3"], /* CJK Ideograph */ + ["\u95E4", "\u95E4"], /* CJK Ideograph */ + ["\u95E5", "\u95E5"], /* CJK Ideograph */ + ["\u95E6", "\u95E6"], /* CJK Ideograph */ + ["\u95E7", "\u95E7"], /* CJK Ideograph */ + ["\u95E8", "\u95E8"], /* CJK Ideograph */ + ["\u95E9", "\u95E9"], /* CJK Ideograph */ + ["\u95EA", "\u95EA"], /* CJK Ideograph */ + ["\u95EB", "\u95EB"], /* CJK Ideograph */ + ["\u95EC", "\u95EC"], /* CJK Ideograph */ + ["\u95ED", "\u95ED"], /* CJK Ideograph */ + ["\u95EE", "\u95EE"], /* CJK Ideograph */ + ["\u95EF", "\u95EF"], /* CJK Ideograph */ + ["\u95F0", "\u95F0"], /* CJK Ideograph */ + ["\u95F1", "\u95F1"], /* CJK Ideograph */ + ["\u95F2", "\u95F2"], /* CJK Ideograph */ + ["\u95F3", "\u95F3"], /* CJK Ideograph */ + ["\u95F4", "\u95F4"], /* CJK Ideograph */ + ["\u95F5", "\u95F5"], /* CJK Ideograph */ + ["\u95F6", "\u95F6"], /* CJK Ideograph */ + ["\u95F7", "\u95F7"], /* CJK Ideograph */ + ["\u95F8", "\u95F8"], /* CJK Ideograph */ + ["\u95F9", "\u95F9"], /* CJK Ideograph */ + ["\u95FA", "\u95FA"], /* CJK Ideograph */ + ["\u95FB", "\u95FB"], /* CJK Ideograph */ + ["\u95FC", "\u95FC"], /* CJK Ideograph */ + ["\u95FD", "\u95FD"], /* CJK Ideograph */ + ["\u95FE", "\u95FE"], /* CJK Ideograph */ + ["\u95FF", "\u95FF"], /* CJK Ideograph */ + ["\u9600", "\u9600"], /* CJK Ideograph */ + ["\u9601", "\u9601"], /* CJK Ideograph */ + ["\u9602", "\u9602"], /* CJK Ideograph */ + ["\u9603", "\u9603"], /* CJK Ideograph */ + ["\u9604", "\u9604"], /* CJK Ideograph */ + ["\u9605", "\u9605"], /* CJK Ideograph */ + ["\u9606", "\u9606"], /* CJK Ideograph */ + ["\u9607", "\u9607"], /* CJK Ideograph */ + ["\u9608", "\u9608"], /* CJK Ideograph */ + ["\u9609", "\u9609"], /* CJK Ideograph */ + ["\u960A", "\u960A"], /* CJK Ideograph */ + ["\u960B", "\u960B"], /* CJK Ideograph */ + ["\u960C", "\u960C"], /* CJK Ideograph */ + ["\u960D", "\u960D"], /* CJK Ideograph */ + ["\u960E", "\u960E"], /* CJK Ideograph */ + ["\u960F", "\u960F"], /* CJK Ideograph */ + ["\u9610", "\u9610"], /* CJK Ideograph */ + ["\u9611", "\u9611"], /* CJK Ideograph */ + ["\u9612", "\u9612"], /* CJK Ideograph */ + ["\u9613", "\u9613"], /* CJK Ideograph */ + ["\u9614", "\u9614"], /* CJK Ideograph */ + ["\u9615", "\u9615"], /* CJK Ideograph */ + ["\u9616", "\u9616"], /* CJK Ideograph */ + ["\u9617", "\u9617"], /* CJK Ideograph */ + ["\u9618", "\u9618"], /* CJK Ideograph */ + ["\u9619", "\u9619"], /* CJK Ideograph */ + ["\u961A", "\u961A"], /* CJK Ideograph */ + ["\u961B", "\u961B"], /* CJK Ideograph */ + ["\u961C", "\u961C"], /* CJK Ideograph */ + ["\u961D", "\u961D"], /* CJK Ideograph */ + ["\u961E", "\u961E"], /* CJK Ideograph */ + ["\u961F", "\u961F"], /* CJK Ideograph */ + ["\u9620", "\u9620"], /* CJK Ideograph */ + ["\u9621", "\u9621"], /* CJK Ideograph */ + ["\u9622", "\u9622"], /* CJK Ideograph */ + ["\u9623", "\u9623"], /* CJK Ideograph */ + ["\u9624", "\u9624"], /* CJK Ideograph */ + ["\u9625", "\u9625"], /* CJK Ideograph */ + ["\u9626", "\u9626"], /* CJK Ideograph */ + ["\u9627", "\u9627"], /* CJK Ideograph */ + ["\u9628", "\u9628"], /* CJK Ideograph */ + ["\u9629", "\u9629"], /* CJK Ideograph */ + ["\u962A", "\u962A"], /* CJK Ideograph */ + ["\u962B", "\u962B"], /* CJK Ideograph */ + ["\u962C", "\u962C"], /* CJK Ideograph */ + ["\u962D", "\u962D"], /* CJK Ideograph */ + ["\u962E", "\u962E"], /* CJK Ideograph */ + ["\u962F", "\u962F"], /* CJK Ideograph */ + ["\u9630", "\u9630"], /* CJK Ideograph */ + ["\u9631", "\u9631"], /* CJK Ideograph */ + ["\u9632", "\u9632"], /* CJK Ideograph */ + ["\u9633", "\u9633"], /* CJK Ideograph */ + ["\u9634", "\u9634"], /* CJK Ideograph */ + ["\u9635", "\u9635"], /* CJK Ideograph */ + ["\u9636", "\u9636"], /* CJK Ideograph */ + ["\u9637", "\u9637"], /* CJK Ideograph */ + ["\u9638", "\u9638"], /* CJK Ideograph */ + ["\u9639", "\u9639"], /* CJK Ideograph */ + ["\u963A", "\u963A"], /* CJK Ideograph */ + ["\u963B", "\u963B"], /* CJK Ideograph */ + ["\u963C", "\u963C"], /* CJK Ideograph */ + ["\u963D", "\u963D"], /* CJK Ideograph */ + ["\u963E", "\u963E"], /* CJK Ideograph */ + ["\u963F", "\u963F"], /* CJK Ideograph */ + ["\u9640", "\u9640"], /* CJK Ideograph */ + ["\u9641", "\u9641"], /* CJK Ideograph */ + ["\u9642", "\u9642"], /* CJK Ideograph */ + ["\u9643", "\u9643"], /* CJK Ideograph */ + ["\u9644", "\u9644"], /* CJK Ideograph */ + ["\u9645", "\u9645"], /* CJK Ideograph */ + ["\u9646", "\u9646"], /* CJK Ideograph */ + ["\u9647", "\u9647"], /* CJK Ideograph */ + ["\u9648", "\u9648"], /* CJK Ideograph */ + ["\u9649", "\u9649"], /* CJK Ideograph */ + ["\u964A", "\u964A"], /* CJK Ideograph */ + ["\u964B", "\u964B"], /* CJK Ideograph */ + ["\u964C", "\u964C"], /* CJK Ideograph */ + ["\u964D", "\u964D"], /* CJK Ideograph */ + ["\u964E", "\u964E"], /* CJK Ideograph */ + ["\u964F", "\u964F"], /* CJK Ideograph */ + ["\u9650", "\u9650"], /* CJK Ideograph */ + ["\u9651", "\u9651"], /* CJK Ideograph */ + ["\u9652", "\u9652"], /* CJK Ideograph */ + ["\u9653", "\u9653"], /* CJK Ideograph */ + ["\u9654", "\u9654"], /* CJK Ideograph */ + ["\u9655", "\u9655"], /* CJK Ideograph */ + ["\u9656", "\u9656"], /* CJK Ideograph */ + ["\u9657", "\u9657"], /* CJK Ideograph */ + ["\u9658", "\u9658"], /* CJK Ideograph */ + ["\u9659", "\u9659"], /* CJK Ideograph */ + ["\u965A", "\u965A"], /* CJK Ideograph */ + ["\u965B", "\u965B"], /* CJK Ideograph */ + ["\u965C", "\u965C"], /* CJK Ideograph */ + ["\u965D", "\u965D"], /* CJK Ideograph */ + ["\u965E", "\u965E"], /* CJK Ideograph */ + ["\u965F", "\u965F"], /* CJK Ideograph */ + ["\u9660", "\u9660"], /* CJK Ideograph */ + ["\u9661", "\u9661"], /* CJK Ideograph */ + ["\u9662", "\u9662"], /* CJK Ideograph */ + ["\u9663", "\u9663"], /* CJK Ideograph */ + ["\u9664", "\u9664"], /* CJK Ideograph */ + ["\u9665", "\u9665"], /* CJK Ideograph */ + ["\u9666", "\u9666"], /* CJK Ideograph */ + ["\u9667", "\u9667"], /* CJK Ideograph */ + ["\u9668", "\u9668"], /* CJK Ideograph */ + ["\u9669", "\u9669"], /* CJK Ideograph */ + ["\u966A", "\u966A"], /* CJK Ideograph */ + ["\u966B", "\u966B"], /* CJK Ideograph */ + ["\u966C", "\u966C"], /* CJK Ideograph */ + ["\u966D", "\u966D"], /* CJK Ideograph */ + ["\u966E", "\u966E"], /* CJK Ideograph */ + ["\u966F", "\u966F"], /* CJK Ideograph */ + ["\u9670", "\u9670"], /* CJK Ideograph */ + ["\u9671", "\u9671"], /* CJK Ideograph */ + ["\u9672", "\u9672"], /* CJK Ideograph */ + ["\u9673", "\u9673"], /* CJK Ideograph */ + ["\u9674", "\u9674"], /* CJK Ideograph */ + ["\u9675", "\u9675"], /* CJK Ideograph */ + ["\u9676", "\u9676"], /* CJK Ideograph */ + ["\u9677", "\u9677"], /* CJK Ideograph */ + ["\u9678", "\u9678"], /* CJK Ideograph */ + ["\u9679", "\u9679"], /* CJK Ideograph */ + ["\u967A", "\u967A"], /* CJK Ideograph */ + ["\u967B", "\u967B"], /* CJK Ideograph */ + ["\u967C", "\u967C"], /* CJK Ideograph */ + ["\u967D", "\u967D"], /* CJK Ideograph */ + ["\u967E", "\u967E"], /* CJK Ideograph */ + ["\u967F", "\u967F"], /* CJK Ideograph */ + ["\u9680", "\u9680"], /* CJK Ideograph */ + ["\u9681", "\u9681"], /* CJK Ideograph */ + ["\u9682", "\u9682"], /* CJK Ideograph */ + ["\u9683", "\u9683"], /* CJK Ideograph */ + ["\u9684", "\u9684"], /* CJK Ideograph */ + ["\u9685", "\u9685"], /* CJK Ideograph */ + ["\u9686", "\u9686"], /* CJK Ideograph */ + ["\u9687", "\u9687"], /* CJK Ideograph */ + ["\u9688", "\u9688"], /* CJK Ideograph */ + ["\u9689", "\u9689"], /* CJK Ideograph */ + ["\u968A", "\u968A"], /* CJK Ideograph */ + ["\u968B", "\u968B"], /* CJK Ideograph */ + ["\u968C", "\u968C"], /* CJK Ideograph */ + ["\u968D", "\u968D"], /* CJK Ideograph */ + ["\u968E", "\u968E"], /* CJK Ideograph */ + ["\u968F", "\u968F"], /* CJK Ideograph */ + ["\u9690", "\u9690"], /* CJK Ideograph */ + ["\u9691", "\u9691"], /* CJK Ideograph */ + ["\u9692", "\u9692"], /* CJK Ideograph */ + ["\u9693", "\u9693"], /* CJK Ideograph */ + ["\u9694", "\u9694"], /* CJK Ideograph */ + ["\u9695", "\u9695"], /* CJK Ideograph */ + ["\u9696", "\u9696"], /* CJK Ideograph */ + ["\u9697", "\u9697"], /* CJK Ideograph */ + ["\u9698", "\u9698"], /* CJK Ideograph */ + ["\u9699", "\u9699"], /* CJK Ideograph */ + ["\u969A", "\u969A"], /* CJK Ideograph */ + ["\u969B", "\u969B"], /* CJK Ideograph */ + ["\u969C", "\u969C"], /* CJK Ideograph */ + ["\u969D", "\u969D"], /* CJK Ideograph */ + ["\u969E", "\u969E"], /* CJK Ideograph */ + ["\u969F", "\u969F"], /* CJK Ideograph */ + ["\u96A0", "\u96A0"], /* CJK Ideograph */ + ["\u96A1", "\u96A1"], /* CJK Ideograph */ + ["\u96A2", "\u96A2"], /* CJK Ideograph */ + ["\u96A3", "\u96A3"], /* CJK Ideograph */ + ["\u96A4", "\u96A4"], /* CJK Ideograph */ + ["\u96A5", "\u96A5"], /* CJK Ideograph */ + ["\u96A6", "\u96A6"], /* CJK Ideograph */ + ["\u96A7", "\u96A7"], /* CJK Ideograph */ + ["\u96A8", "\u96A8"], /* CJK Ideograph */ + ["\u96A9", "\u96A9"], /* CJK Ideograph */ + ["\u96AA", "\u96AA"], /* CJK Ideograph */ + ["\u96AB", "\u96AB"], /* CJK Ideograph */ + ["\u96AC", "\u96AC"], /* CJK Ideograph */ + ["\u96AD", "\u96AD"], /* CJK Ideograph */ + ["\u96AE", "\u96AE"], /* CJK Ideograph */ + ["\u96AF", "\u96AF"], /* CJK Ideograph */ + ["\u96B0", "\u96B0"], /* CJK Ideograph */ + ["\u96B1", "\u96B1"], /* CJK Ideograph */ + ["\u96B2", "\u96B2"], /* CJK Ideograph */ + ["\u96B3", "\u96B3"], /* CJK Ideograph */ + ["\u96B4", "\u96B4"], /* CJK Ideograph */ + ["\u96B5", "\u96B5"], /* CJK Ideograph */ + ["\u96B6", "\u96B6"], /* CJK Ideograph */ + ["\u96B7", "\u96B7"], /* CJK Ideograph */ + ["\u96B8", "\u96B8"], /* CJK Ideograph */ + ["\u96B9", "\u96B9"], /* CJK Ideograph */ + ["\u96BA", "\u96BA"], /* CJK Ideograph */ + ["\u96BB", "\u96BB"], /* CJK Ideograph */ + ["\u96BC", "\u96BC"], /* CJK Ideograph */ + ["\u96BD", "\u96BD"], /* CJK Ideograph */ + ["\u96BE", "\u96BE"], /* CJK Ideograph */ + ["\u96BF", "\u96BF"], /* CJK Ideograph */ + ["\u96C0", "\u96C0"], /* CJK Ideograph */ + ["\u96C1", "\u96C1"], /* CJK Ideograph */ + ["\u96C2", "\u96C2"], /* CJK Ideograph */ + ["\u96C3", "\u96C3"], /* CJK Ideograph */ + ["\u96C4", "\u96C4"], /* CJK Ideograph */ + ["\u96C5", "\u96C5"], /* CJK Ideograph */ + ["\u96C6", "\u96C6"], /* CJK Ideograph */ + ["\u96C7", "\u96C7"], /* CJK Ideograph */ + ["\u96C8", "\u96C8"], /* CJK Ideograph */ + ["\u96C9", "\u96C9"], /* CJK Ideograph */ + ["\u96CA", "\u96CA"], /* CJK Ideograph */ + ["\u96CB", "\u96CB"], /* CJK Ideograph */ + ["\u96CC", "\u96CC"], /* CJK Ideograph */ + ["\u96CD", "\u96CD"], /* CJK Ideograph */ + ["\u96CE", "\u96CE"], /* CJK Ideograph */ + ["\u96CF", "\u96CF"], /* CJK Ideograph */ + ["\u96D0", "\u96D0"], /* CJK Ideograph */ + ["\u96D1", "\u96D1"], /* CJK Ideograph */ + ["\u96D2", "\u96D2"], /* CJK Ideograph */ + ["\u96D3", "\u96D3"], /* CJK Ideograph */ + ["\u96D4", "\u96D4"], /* CJK Ideograph */ + ["\u96D5", "\u96D5"], /* CJK Ideograph */ + ["\u96D6", "\u96D6"], /* CJK Ideograph */ + ["\u96D7", "\u96D7"], /* CJK Ideograph */ + ["\u96D8", "\u96D8"], /* CJK Ideograph */ + ["\u96D9", "\u96D9"], /* CJK Ideograph */ + ["\u96DA", "\u96DA"], /* CJK Ideograph */ + ["\u96DB", "\u96DB"], /* CJK Ideograph */ + ["\u96DC", "\u96DC"], /* CJK Ideograph */ + ["\u96DD", "\u96DD"], /* CJK Ideograph */ + ["\u96DE", "\u96DE"], /* CJK Ideograph */ + ["\u96DF", "\u96DF"], /* CJK Ideograph */ + ["\u96E0", "\u96E0"], /* CJK Ideograph */ + ["\u96E1", "\u96E1"], /* CJK Ideograph */ + ["\u96E2", "\u96E2"], /* CJK Ideograph */ + ["\u96E3", "\u96E3"], /* CJK Ideograph */ + ["\u96E4", "\u96E4"], /* CJK Ideograph */ + ["\u96E5", "\u96E5"], /* CJK Ideograph */ + ["\u96E6", "\u96E6"], /* CJK Ideograph */ + ["\u96E7", "\u96E7"], /* CJK Ideograph */ + ["\u96E8", "\u96E8"], /* CJK Ideograph */ + ["\u96E9", "\u96E9"], /* CJK Ideograph */ + ["\u96EA", "\u96EA"], /* CJK Ideograph */ + ["\u96EB", "\u96EB"], /* CJK Ideograph */ + ["\u96EC", "\u96EC"], /* CJK Ideograph */ + ["\u96ED", "\u96ED"], /* CJK Ideograph */ + ["\u96EE", "\u96EE"], /* CJK Ideograph */ + ["\u96EF", "\u96EF"], /* CJK Ideograph */ + ["\u96F0", "\u96F0"], /* CJK Ideograph */ + ["\u96F1", "\u96F1"], /* CJK Ideograph */ + ["\u96F2", "\u96F2"], /* CJK Ideograph */ + ["\u96F3", "\u96F3"], /* CJK Ideograph */ + ["\u96F4", "\u96F4"], /* CJK Ideograph */ + ["\u96F5", "\u96F5"], /* CJK Ideograph */ + ["\u96F6", "\u96F6"], /* CJK Ideograph */ + ["\u96F7", "\u96F7"], /* CJK Ideograph */ + ["\u96F8", "\u96F8"], /* CJK Ideograph */ + ["\u96F9", "\u96F9"], /* CJK Ideograph */ + ["\u96FA", "\u96FA"], /* CJK Ideograph */ + ["\u96FB", "\u96FB"], /* CJK Ideograph */ + ["\u96FC", "\u96FC"], /* CJK Ideograph */ + ["\u96FD", "\u96FD"], /* CJK Ideograph */ + ["\u96FE", "\u96FE"], /* CJK Ideograph */ + ["\u96FF", "\u96FF"], /* CJK Ideograph */ + ["\u9700", "\u9700"], /* CJK Ideograph */ + ["\u9701", "\u9701"], /* CJK Ideograph */ + ["\u9702", "\u9702"], /* CJK Ideograph */ + ["\u9703", "\u9703"], /* CJK Ideograph */ + ["\u9704", "\u9704"], /* CJK Ideograph */ + ["\u9705", "\u9705"], /* CJK Ideograph */ + ["\u9706", "\u9706"], /* CJK Ideograph */ + ["\u9707", "\u9707"], /* CJK Ideograph */ + ["\u9708", "\u9708"], /* CJK Ideograph */ + ["\u9709", "\u9709"], /* CJK Ideograph */ + ["\u970A", "\u970A"], /* CJK Ideograph */ + ["\u970B", "\u970B"], /* CJK Ideograph */ + ["\u970C", "\u970C"], /* CJK Ideograph */ + ["\u970D", "\u970D"], /* CJK Ideograph */ + ["\u970E", "\u970E"], /* CJK Ideograph */ + ["\u970F", "\u970F"], /* CJK Ideograph */ + ["\u9710", "\u9710"], /* CJK Ideograph */ + ["\u9711", "\u9711"], /* CJK Ideograph */ + ["\u9712", "\u9712"], /* CJK Ideograph */ + ["\u9713", "\u9713"], /* CJK Ideograph */ + ["\u9714", "\u9714"], /* CJK Ideograph */ + ["\u9715", "\u9715"], /* CJK Ideograph */ + ["\u9716", "\u9716"], /* CJK Ideograph */ + ["\u9717", "\u9717"], /* CJK Ideograph */ + ["\u9718", "\u9718"], /* CJK Ideograph */ + ["\u9719", "\u9719"], /* CJK Ideograph */ + ["\u971A", "\u971A"], /* CJK Ideograph */ + ["\u971B", "\u971B"], /* CJK Ideograph */ + ["\u971C", "\u971C"], /* CJK Ideograph */ + ["\u971D", "\u971D"], /* CJK Ideograph */ + ["\u971E", "\u971E"], /* CJK Ideograph */ + ["\u971F", "\u971F"], /* CJK Ideograph */ + ["\u9720", "\u9720"], /* CJK Ideograph */ + ["\u9721", "\u9721"], /* CJK Ideograph */ + ["\u9722", "\u9722"], /* CJK Ideograph */ + ["\u9723", "\u9723"], /* CJK Ideograph */ + ["\u9724", "\u9724"], /* CJK Ideograph */ + ["\u9725", "\u9725"], /* CJK Ideograph */ + ["\u9726", "\u9726"], /* CJK Ideograph */ + ["\u9727", "\u9727"], /* CJK Ideograph */ + ["\u9728", "\u9728"], /* CJK Ideograph */ + ["\u9729", "\u9729"], /* CJK Ideograph */ + ["\u972A", "\u972A"], /* CJK Ideograph */ + ["\u972B", "\u972B"], /* CJK Ideograph */ + ["\u972C", "\u972C"], /* CJK Ideograph */ + ["\u972D", "\u972D"], /* CJK Ideograph */ + ["\u972E", "\u972E"], /* CJK Ideograph */ + ["\u972F", "\u972F"], /* CJK Ideograph */ + ["\u9730", "\u9730"], /* CJK Ideograph */ + ["\u9731", "\u9731"], /* CJK Ideograph */ + ["\u9732", "\u9732"], /* CJK Ideograph */ + ["\u9733", "\u9733"], /* CJK Ideograph */ + ["\u9734", "\u9734"], /* CJK Ideograph */ + ["\u9735", "\u9735"], /* CJK Ideograph */ + ["\u9736", "\u9736"], /* CJK Ideograph */ + ["\u9737", "\u9737"], /* CJK Ideograph */ + ["\u9738", "\u9738"], /* CJK Ideograph */ + ["\u9739", "\u9739"], /* CJK Ideograph */ + ["\u973A", "\u973A"], /* CJK Ideograph */ + ["\u973B", "\u973B"], /* CJK Ideograph */ + ["\u973C", "\u973C"], /* CJK Ideograph */ + ["\u973D", "\u973D"], /* CJK Ideograph */ + ["\u973E", "\u973E"], /* CJK Ideograph */ + ["\u973F", "\u973F"], /* CJK Ideograph */ + ["\u9740", "\u9740"], /* CJK Ideograph */ + ["\u9741", "\u9741"], /* CJK Ideograph */ + ["\u9742", "\u9742"], /* CJK Ideograph */ + ["\u9743", "\u9743"], /* CJK Ideograph */ + ["\u9744", "\u9744"], /* CJK Ideograph */ + ["\u9745", "\u9745"], /* CJK Ideograph */ + ["\u9746", "\u9746"], /* CJK Ideograph */ + ["\u9747", "\u9747"], /* CJK Ideograph */ + ["\u9748", "\u9748"], /* CJK Ideograph */ + ["\u9749", "\u9749"], /* CJK Ideograph */ + ["\u974A", "\u974A"], /* CJK Ideograph */ + ["\u974B", "\u974B"], /* CJK Ideograph */ + ["\u974C", "\u974C"], /* CJK Ideograph */ + ["\u974D", "\u974D"], /* CJK Ideograph */ + ["\u974E", "\u974E"], /* CJK Ideograph */ + ["\u974F", "\u974F"], /* CJK Ideograph */ + ["\u9750", "\u9750"], /* CJK Ideograph */ + ["\u9751", "\u9751"], /* CJK Ideograph */ + ["\u9752", "\u9752"], /* CJK Ideograph */ + ["\u9753", "\u9753"], /* CJK Ideograph */ + ["\u9754", "\u9754"], /* CJK Ideograph */ + ["\u9755", "\u9755"], /* CJK Ideograph */ + ["\u9756", "\u9756"], /* CJK Ideograph */ + ["\u9757", "\u9757"], /* CJK Ideograph */ + ["\u9758", "\u9758"], /* CJK Ideograph */ + ["\u9759", "\u9759"], /* CJK Ideograph */ + ["\u975A", "\u975A"], /* CJK Ideograph */ + ["\u975B", "\u975B"], /* CJK Ideograph */ + ["\u975C", "\u975C"], /* CJK Ideograph */ + ["\u975D", "\u975D"], /* CJK Ideograph */ + ["\u975E", "\u975E"], /* CJK Ideograph */ + ["\u975F", "\u975F"], /* CJK Ideograph */ + ["\u9760", "\u9760"], /* CJK Ideograph */ + ["\u9761", "\u9761"], /* CJK Ideograph */ + ["\u9762", "\u9762"], /* CJK Ideograph */ + ["\u9763", "\u9763"], /* CJK Ideograph */ + ["\u9764", "\u9764"], /* CJK Ideograph */ + ["\u9765", "\u9765"], /* CJK Ideograph */ + ["\u9766", "\u9766"], /* CJK Ideograph */ + ["\u9767", "\u9767"], /* CJK Ideograph */ + ["\u9768", "\u9768"], /* CJK Ideograph */ + ["\u9769", "\u9769"], /* CJK Ideograph */ + ["\u976A", "\u976A"], /* CJK Ideograph */ + ["\u976B", "\u976B"], /* CJK Ideograph */ + ["\u976C", "\u976C"], /* CJK Ideograph */ + ["\u976D", "\u976D"], /* CJK Ideograph */ + ["\u976E", "\u976E"], /* CJK Ideograph */ + ["\u976F", "\u976F"], /* CJK Ideograph */ + ["\u9770", "\u9770"], /* CJK Ideograph */ + ["\u9771", "\u9771"], /* CJK Ideograph */ + ["\u9772", "\u9772"], /* CJK Ideograph */ + ["\u9773", "\u9773"], /* CJK Ideograph */ + ["\u9774", "\u9774"], /* CJK Ideograph */ + ["\u9775", "\u9775"], /* CJK Ideograph */ + ["\u9776", "\u9776"], /* CJK Ideograph */ + ["\u9777", "\u9777"], /* CJK Ideograph */ + ["\u9778", "\u9778"], /* CJK Ideograph */ + ["\u9779", "\u9779"], /* CJK Ideograph */ + ["\u977A", "\u977A"], /* CJK Ideograph */ + ["\u977B", "\u977B"], /* CJK Ideograph */ + ["\u977C", "\u977C"], /* CJK Ideograph */ + ["\u977D", "\u977D"], /* CJK Ideograph */ + ["\u977E", "\u977E"], /* CJK Ideograph */ + ["\u977F", "\u977F"], /* CJK Ideograph */ + ["\u9780", "\u9780"], /* CJK Ideograph */ + ["\u9781", "\u9781"], /* CJK Ideograph */ + ["\u9782", "\u9782"], /* CJK Ideograph */ + ["\u9783", "\u9783"], /* CJK Ideograph */ + ["\u9784", "\u9784"], /* CJK Ideograph */ + ["\u9785", "\u9785"], /* CJK Ideograph */ + ["\u9786", "\u9786"], /* CJK Ideograph */ + ["\u9787", "\u9787"], /* CJK Ideograph */ + ["\u9788", "\u9788"], /* CJK Ideograph */ + ["\u9789", "\u9789"], /* CJK Ideograph */ + ["\u978A", "\u978A"], /* CJK Ideograph */ + ["\u978B", "\u978B"], /* CJK Ideograph */ + ["\u978C", "\u978C"], /* CJK Ideograph */ + ["\u978D", "\u978D"], /* CJK Ideograph */ + ["\u978E", "\u978E"], /* CJK Ideograph */ + ["\u978F", "\u978F"], /* CJK Ideograph */ + ["\u9790", "\u9790"], /* CJK Ideograph */ + ["\u9791", "\u9791"], /* CJK Ideograph */ + ["\u9792", "\u9792"], /* CJK Ideograph */ + ["\u9793", "\u9793"], /* CJK Ideograph */ + ["\u9794", "\u9794"], /* CJK Ideograph */ + ["\u9795", "\u9795"], /* CJK Ideograph */ + ["\u9796", "\u9796"], /* CJK Ideograph */ + ["\u9797", "\u9797"], /* CJK Ideograph */ + ["\u9798", "\u9798"], /* CJK Ideograph */ + ["\u9799", "\u9799"], /* CJK Ideograph */ + ["\u979A", "\u979A"], /* CJK Ideograph */ + ["\u979B", "\u979B"], /* CJK Ideograph */ + ["\u979C", "\u979C"], /* CJK Ideograph */ + ["\u979D", "\u979D"], /* CJK Ideograph */ + ["\u979E", "\u979E"], /* CJK Ideograph */ + ["\u979F", "\u979F"], /* CJK Ideograph */ + ["\u97A0", "\u97A0"], /* CJK Ideograph */ + ["\u97A1", "\u97A1"], /* CJK Ideograph */ + ["\u97A2", "\u97A2"], /* CJK Ideograph */ + ["\u97A3", "\u97A3"], /* CJK Ideograph */ + ["\u97A4", "\u97A4"], /* CJK Ideograph */ + ["\u97A5", "\u97A5"], /* CJK Ideograph */ + ["\u97A6", "\u97A6"], /* CJK Ideograph */ + ["\u97A7", "\u97A7"], /* CJK Ideograph */ + ["\u97A8", "\u97A8"], /* CJK Ideograph */ + ["\u97A9", "\u97A9"], /* CJK Ideograph */ + ["\u97AA", "\u97AA"], /* CJK Ideograph */ + ["\u97AB", "\u97AB"], /* CJK Ideograph */ + ["\u97AC", "\u97AC"], /* CJK Ideograph */ + ["\u97AD", "\u97AD"], /* CJK Ideograph */ + ["\u97AE", "\u97AE"], /* CJK Ideograph */ + ["\u97AF", "\u97AF"], /* CJK Ideograph */ + ["\u97B0", "\u97B0"], /* CJK Ideograph */ + ["\u97B1", "\u97B1"], /* CJK Ideograph */ + ["\u97B2", "\u97B2"], /* CJK Ideograph */ + ["\u97B3", "\u97B3"], /* CJK Ideograph */ + ["\u97B4", "\u97B4"], /* CJK Ideograph */ + ["\u97B5", "\u97B5"], /* CJK Ideograph */ + ["\u97B6", "\u97B6"], /* CJK Ideograph */ + ["\u97B7", "\u97B7"], /* CJK Ideograph */ + ["\u97B8", "\u97B8"], /* CJK Ideograph */ + ["\u97B9", "\u97B9"], /* CJK Ideograph */ + ["\u97BA", "\u97BA"], /* CJK Ideograph */ + ["\u97BB", "\u97BB"], /* CJK Ideograph */ + ["\u97BC", "\u97BC"], /* CJK Ideograph */ + ["\u97BD", "\u97BD"], /* CJK Ideograph */ + ["\u97BE", "\u97BE"], /* CJK Ideograph */ + ["\u97BF", "\u97BF"], /* CJK Ideograph */ + ["\u97C0", "\u97C0"], /* CJK Ideograph */ + ["\u97C1", "\u97C1"], /* CJK Ideograph */ + ["\u97C2", "\u97C2"], /* CJK Ideograph */ + ["\u97C3", "\u97C3"], /* CJK Ideograph */ + ["\u97C4", "\u97C4"], /* CJK Ideograph */ + ["\u97C5", "\u97C5"], /* CJK Ideograph */ + ["\u97C6", "\u97C6"], /* CJK Ideograph */ + ["\u97C7", "\u97C7"], /* CJK Ideograph */ + ["\u97C8", "\u97C8"], /* CJK Ideograph */ + ["\u97C9", "\u97C9"], /* CJK Ideograph */ + ["\u97CA", "\u97CA"], /* CJK Ideograph */ + ["\u97CB", "\u97CB"], /* CJK Ideograph */ + ["\u97CC", "\u97CC"], /* CJK Ideograph */ + ["\u97CD", "\u97CD"], /* CJK Ideograph */ + ["\u97CE", "\u97CE"], /* CJK Ideograph */ + ["\u97CF", "\u97CF"], /* CJK Ideograph */ + ["\u97D0", "\u97D0"], /* CJK Ideograph */ + ["\u97D1", "\u97D1"], /* CJK Ideograph */ + ["\u97D2", "\u97D2"], /* CJK Ideograph */ + ["\u97D3", "\u97D3"], /* CJK Ideograph */ + ["\u97D4", "\u97D4"], /* CJK Ideograph */ + ["\u97D5", "\u97D5"], /* CJK Ideograph */ + ["\u97D6", "\u97D6"], /* CJK Ideograph */ + ["\u97D7", "\u97D7"], /* CJK Ideograph */ + ["\u97D8", "\u97D8"], /* CJK Ideograph */ + ["\u97D9", "\u97D9"], /* CJK Ideograph */ + ["\u97DA", "\u97DA"], /* CJK Ideograph */ + ["\u97DB", "\u97DB"], /* CJK Ideograph */ + ["\u97DC", "\u97DC"], /* CJK Ideograph */ + ["\u97DD", "\u97DD"], /* CJK Ideograph */ + ["\u97DE", "\u97DE"], /* CJK Ideograph */ + ["\u97DF", "\u97DF"], /* CJK Ideograph */ + ["\u97E0", "\u97E0"], /* CJK Ideograph */ + ["\u97E1", "\u97E1"], /* CJK Ideograph */ + ["\u97E2", "\u97E2"], /* CJK Ideograph */ + ["\u97E3", "\u97E3"], /* CJK Ideograph */ + ["\u97E4", "\u97E4"], /* CJK Ideograph */ + ["\u97E5", "\u97E5"], /* CJK Ideograph */ + ["\u97E6", "\u97E6"], /* CJK Ideograph */ + ["\u97E7", "\u97E7"], /* CJK Ideograph */ + ["\u97E8", "\u97E8"], /* CJK Ideograph */ + ["\u97E9", "\u97E9"], /* CJK Ideograph */ + ["\u97EA", "\u97EA"], /* CJK Ideograph */ + ["\u97EB", "\u97EB"], /* CJK Ideograph */ + ["\u97EC", "\u97EC"], /* CJK Ideograph */ + ["\u97ED", "\u97ED"], /* CJK Ideograph */ + ["\u97EE", "\u97EE"], /* CJK Ideograph */ + ["\u97EF", "\u97EF"], /* CJK Ideograph */ + ["\u97F0", "\u97F0"], /* CJK Ideograph */ + ["\u97F1", "\u97F1"], /* CJK Ideograph */ + ["\u97F2", "\u97F2"], /* CJK Ideograph */ + ["\u97F3", "\u97F3"], /* CJK Ideograph */ + ["\u97F4", "\u97F4"], /* CJK Ideograph */ + ["\u97F5", "\u97F5"], /* CJK Ideograph */ + ["\u97F6", "\u97F6"], /* CJK Ideograph */ + ["\u97F7", "\u97F7"], /* CJK Ideograph */ + ["\u97F8", "\u97F8"], /* CJK Ideograph */ + ["\u97F9", "\u97F9"], /* CJK Ideograph */ + ["\u97FA", "\u97FA"], /* CJK Ideograph */ + ["\u97FB", "\u97FB"], /* CJK Ideograph */ + ["\u97FC", "\u97FC"], /* CJK Ideograph */ + ["\u97FD", "\u97FD"], /* CJK Ideograph */ + ["\u97FE", "\u97FE"], /* CJK Ideograph */ + ["\u97FF", "\u97FF"], /* CJK Ideograph */ + ["\u9800", "\u9800"], /* CJK Ideograph */ + ["\u9801", "\u9801"], /* CJK Ideograph */ + ["\u9802", "\u9802"], /* CJK Ideograph */ + ["\u9803", "\u9803"], /* CJK Ideograph */ + ["\u9804", "\u9804"], /* CJK Ideograph */ + ["\u9805", "\u9805"], /* CJK Ideograph */ + ["\u9806", "\u9806"], /* CJK Ideograph */ + ["\u9807", "\u9807"], /* CJK Ideograph */ + ["\u9808", "\u9808"], /* CJK Ideograph */ + ["\u9809", "\u9809"], /* CJK Ideograph */ + ["\u980A", "\u980A"], /* CJK Ideograph */ + ["\u980B", "\u980B"], /* CJK Ideograph */ + ["\u980C", "\u980C"], /* CJK Ideograph */ + ["\u980D", "\u980D"], /* CJK Ideograph */ + ["\u980E", "\u980E"], /* CJK Ideograph */ + ["\u980F", "\u980F"], /* CJK Ideograph */ + ["\u9810", "\u9810"], /* CJK Ideograph */ + ["\u9811", "\u9811"], /* CJK Ideograph */ + ["\u9812", "\u9812"], /* CJK Ideograph */ + ["\u9813", "\u9813"], /* CJK Ideograph */ + ["\u9814", "\u9814"], /* CJK Ideograph */ + ["\u9815", "\u9815"], /* CJK Ideograph */ + ["\u9816", "\u9816"], /* CJK Ideograph */ + ["\u9817", "\u9817"], /* CJK Ideograph */ + ["\u9818", "\u9818"], /* CJK Ideograph */ + ["\u9819", "\u9819"], /* CJK Ideograph */ + ["\u981A", "\u981A"], /* CJK Ideograph */ + ["\u981B", "\u981B"], /* CJK Ideograph */ + ["\u981C", "\u981C"], /* CJK Ideograph */ + ["\u981D", "\u981D"], /* CJK Ideograph */ + ["\u981E", "\u981E"], /* CJK Ideograph */ + ["\u981F", "\u981F"], /* CJK Ideograph */ + ["\u9820", "\u9820"], /* CJK Ideograph */ + ["\u9821", "\u9821"], /* CJK Ideograph */ + ["\u9822", "\u9822"], /* CJK Ideograph */ + ["\u9823", "\u9823"], /* CJK Ideograph */ + ["\u9824", "\u9824"], /* CJK Ideograph */ + ["\u9825", "\u9825"], /* CJK Ideograph */ + ["\u9826", "\u9826"], /* CJK Ideograph */ + ["\u9827", "\u9827"], /* CJK Ideograph */ + ["\u9828", "\u9828"], /* CJK Ideograph */ + ["\u9829", "\u9829"], /* CJK Ideograph */ + ["\u982A", "\u982A"], /* CJK Ideograph */ + ["\u982B", "\u982B"], /* CJK Ideograph */ + ["\u982C", "\u982C"], /* CJK Ideograph */ + ["\u982D", "\u982D"], /* CJK Ideograph */ + ["\u982E", "\u982E"], /* CJK Ideograph */ + ["\u982F", "\u982F"], /* CJK Ideograph */ + ["\u9830", "\u9830"], /* CJK Ideograph */ + ["\u9831", "\u9831"], /* CJK Ideograph */ + ["\u9832", "\u9832"], /* CJK Ideograph */ + ["\u9833", "\u9833"], /* CJK Ideograph */ + ["\u9834", "\u9834"], /* CJK Ideograph */ + ["\u9835", "\u9835"], /* CJK Ideograph */ + ["\u9836", "\u9836"], /* CJK Ideograph */ + ["\u9837", "\u9837"], /* CJK Ideograph */ + ["\u9838", "\u9838"], /* CJK Ideograph */ + ["\u9839", "\u9839"], /* CJK Ideograph */ + ["\u983A", "\u983A"], /* CJK Ideograph */ + ["\u983B", "\u983B"], /* CJK Ideograph */ + ["\u983C", "\u983C"], /* CJK Ideograph */ + ["\u983D", "\u983D"], /* CJK Ideograph */ + ["\u983E", "\u983E"], /* CJK Ideograph */ + ["\u983F", "\u983F"], /* CJK Ideograph */ + ["\u9840", "\u9840"], /* CJK Ideograph */ + ["\u9841", "\u9841"], /* CJK Ideograph */ + ["\u9842", "\u9842"], /* CJK Ideograph */ + ["\u9843", "\u9843"], /* CJK Ideograph */ + ["\u9844", "\u9844"], /* CJK Ideograph */ + ["\u9845", "\u9845"], /* CJK Ideograph */ + ["\u9846", "\u9846"], /* CJK Ideograph */ + ["\u9847", "\u9847"], /* CJK Ideograph */ + ["\u9848", "\u9848"], /* CJK Ideograph */ + ["\u9849", "\u9849"], /* CJK Ideograph */ + ["\u984A", "\u984A"], /* CJK Ideograph */ + ["\u984B", "\u984B"], /* CJK Ideograph */ + ["\u984C", "\u984C"], /* CJK Ideograph */ + ["\u984D", "\u984D"], /* CJK Ideograph */ + ["\u984E", "\u984E"], /* CJK Ideograph */ + ["\u984F", "\u984F"], /* CJK Ideograph */ + ["\u9850", "\u9850"], /* CJK Ideograph */ + ["\u9851", "\u9851"], /* CJK Ideograph */ + ["\u9852", "\u9852"], /* CJK Ideograph */ + ["\u9853", "\u9853"], /* CJK Ideograph */ + ["\u9854", "\u9854"], /* CJK Ideograph */ + ["\u9855", "\u9855"], /* CJK Ideograph */ + ["\u9856", "\u9856"], /* CJK Ideograph */ + ["\u9857", "\u9857"], /* CJK Ideograph */ + ["\u9858", "\u9858"], /* CJK Ideograph */ + ["\u9859", "\u9859"], /* CJK Ideograph */ + ["\u985A", "\u985A"], /* CJK Ideograph */ + ["\u985B", "\u985B"], /* CJK Ideograph */ + ["\u985C", "\u985C"], /* CJK Ideograph */ + ["\u985D", "\u985D"], /* CJK Ideograph */ + ["\u985E", "\u985E"], /* CJK Ideograph */ + ["\u985F", "\u985F"], /* CJK Ideograph */ + ["\u9860", "\u9860"], /* CJK Ideograph */ + ["\u9861", "\u9861"], /* CJK Ideograph */ + ["\u9862", "\u9862"], /* CJK Ideograph */ + ["\u9863", "\u9863"], /* CJK Ideograph */ + ["\u9864", "\u9864"], /* CJK Ideograph */ + ["\u9865", "\u9865"], /* CJK Ideograph */ + ["\u9866", "\u9866"], /* CJK Ideograph */ + ["\u9867", "\u9867"], /* CJK Ideograph */ + ["\u9868", "\u9868"], /* CJK Ideograph */ + ["\u9869", "\u9869"], /* CJK Ideograph */ + ["\u986A", "\u986A"], /* CJK Ideograph */ + ["\u986B", "\u986B"], /* CJK Ideograph */ + ["\u986C", "\u986C"], /* CJK Ideograph */ + ["\u986D", "\u986D"], /* CJK Ideograph */ + ["\u986E", "\u986E"], /* CJK Ideograph */ + ["\u986F", "\u986F"], /* CJK Ideograph */ + ["\u9870", "\u9870"], /* CJK Ideograph */ + ["\u9871", "\u9871"], /* CJK Ideograph */ + ["\u9872", "\u9872"], /* CJK Ideograph */ + ["\u9873", "\u9873"], /* CJK Ideograph */ + ["\u9874", "\u9874"], /* CJK Ideograph */ + ["\u9875", "\u9875"], /* CJK Ideograph */ + ["\u9876", "\u9876"], /* CJK Ideograph */ + ["\u9877", "\u9877"], /* CJK Ideograph */ + ["\u9878", "\u9878"], /* CJK Ideograph */ + ["\u9879", "\u9879"], /* CJK Ideograph */ + ["\u987A", "\u987A"], /* CJK Ideograph */ + ["\u987B", "\u987B"], /* CJK Ideograph */ + ["\u987C", "\u987C"], /* CJK Ideograph */ + ["\u987D", "\u987D"], /* CJK Ideograph */ + ["\u987E", "\u987E"], /* CJK Ideograph */ + ["\u987F", "\u987F"], /* CJK Ideograph */ + ["\u9880", "\u9880"], /* CJK Ideograph */ + ["\u9881", "\u9881"], /* CJK Ideograph */ + ["\u9882", "\u9882"], /* CJK Ideograph */ + ["\u9883", "\u9883"], /* CJK Ideograph */ + ["\u9884", "\u9884"], /* CJK Ideograph */ + ["\u9885", "\u9885"], /* CJK Ideograph */ + ["\u9886", "\u9886"], /* CJK Ideograph */ + ["\u9887", "\u9887"], /* CJK Ideograph */ + ["\u9888", "\u9888"], /* CJK Ideograph */ + ["\u9889", "\u9889"], /* CJK Ideograph */ + ["\u988A", "\u988A"], /* CJK Ideograph */ + ["\u988B", "\u988B"], /* CJK Ideograph */ + ["\u988C", "\u988C"], /* CJK Ideograph */ + ["\u988D", "\u988D"], /* CJK Ideograph */ + ["\u988E", "\u988E"], /* CJK Ideograph */ + ["\u988F", "\u988F"], /* CJK Ideograph */ + ["\u9890", "\u9890"], /* CJK Ideograph */ + ["\u9891", "\u9891"], /* CJK Ideograph */ + ["\u9892", "\u9892"], /* CJK Ideograph */ + ["\u9893", "\u9893"], /* CJK Ideograph */ + ["\u9894", "\u9894"], /* CJK Ideograph */ + ["\u9895", "\u9895"], /* CJK Ideograph */ + ["\u9896", "\u9896"], /* CJK Ideograph */ + ["\u9897", "\u9897"], /* CJK Ideograph */ + ["\u9898", "\u9898"], /* CJK Ideograph */ + ["\u9899", "\u9899"], /* CJK Ideograph */ + ["\u989A", "\u989A"], /* CJK Ideograph */ + ["\u989B", "\u989B"], /* CJK Ideograph */ + ["\u989C", "\u989C"], /* CJK Ideograph */ + ["\u989D", "\u989D"], /* CJK Ideograph */ + ["\u989E", "\u989E"], /* CJK Ideograph */ + ["\u989F", "\u989F"], /* CJK Ideograph */ + ["\u98A0", "\u98A0"], /* CJK Ideograph */ + ["\u98A1", "\u98A1"], /* CJK Ideograph */ + ["\u98A2", "\u98A2"], /* CJK Ideograph */ + ["\u98A3", "\u98A3"], /* CJK Ideograph */ + ["\u98A4", "\u98A4"], /* CJK Ideograph */ + ["\u98A5", "\u98A5"], /* CJK Ideograph */ + ["\u98A6", "\u98A6"], /* CJK Ideograph */ + ["\u98A7", "\u98A7"], /* CJK Ideograph */ + ["\u98A8", "\u98A8"], /* CJK Ideograph */ + ["\u98A9", "\u98A9"], /* CJK Ideograph */ + ["\u98AA", "\u98AA"], /* CJK Ideograph */ + ["\u98AB", "\u98AB"], /* CJK Ideograph */ + ["\u98AC", "\u98AC"], /* CJK Ideograph */ + ["\u98AD", "\u98AD"], /* CJK Ideograph */ + ["\u98AE", "\u98AE"], /* CJK Ideograph */ + ["\u98AF", "\u98AF"], /* CJK Ideograph */ + ["\u98B0", "\u98B0"], /* CJK Ideograph */ + ["\u98B1", "\u98B1"], /* CJK Ideograph */ + ["\u98B2", "\u98B2"], /* CJK Ideograph */ + ["\u98B3", "\u98B3"], /* CJK Ideograph */ + ["\u98B4", "\u98B4"], /* CJK Ideograph */ + ["\u98B5", "\u98B5"], /* CJK Ideograph */ + ["\u98B6", "\u98B6"], /* CJK Ideograph */ + ["\u98B7", "\u98B7"], /* CJK Ideograph */ + ["\u98B8", "\u98B8"], /* CJK Ideograph */ + ["\u98B9", "\u98B9"], /* CJK Ideograph */ + ["\u98BA", "\u98BA"], /* CJK Ideograph */ + ["\u98BB", "\u98BB"], /* CJK Ideograph */ + ["\u98BC", "\u98BC"], /* CJK Ideograph */ + ["\u98BD", "\u98BD"], /* CJK Ideograph */ + ["\u98BE", "\u98BE"], /* CJK Ideograph */ + ["\u98BF", "\u98BF"], /* CJK Ideograph */ + ["\u98C0", "\u98C0"], /* CJK Ideograph */ + ["\u98C1", "\u98C1"], /* CJK Ideograph */ + ["\u98C2", "\u98C2"], /* CJK Ideograph */ + ["\u98C3", "\u98C3"], /* CJK Ideograph */ + ["\u98C4", "\u98C4"], /* CJK Ideograph */ + ["\u98C5", "\u98C5"], /* CJK Ideograph */ + ["\u98C6", "\u98C6"], /* CJK Ideograph */ + ["\u98C7", "\u98C7"], /* CJK Ideograph */ + ["\u98C8", "\u98C8"], /* CJK Ideograph */ + ["\u98C9", "\u98C9"], /* CJK Ideograph */ + ["\u98CA", "\u98CA"], /* CJK Ideograph */ + ["\u98CB", "\u98CB"], /* CJK Ideograph */ + ["\u98CC", "\u98CC"], /* CJK Ideograph */ + ["\u98CD", "\u98CD"], /* CJK Ideograph */ + ["\u98CE", "\u98CE"], /* CJK Ideograph */ + ["\u98CF", "\u98CF"], /* CJK Ideograph */ + ["\u98D0", "\u98D0"], /* CJK Ideograph */ + ["\u98D1", "\u98D1"], /* CJK Ideograph */ + ["\u98D2", "\u98D2"], /* CJK Ideograph */ + ["\u98D3", "\u98D3"], /* CJK Ideograph */ + ["\u98D4", "\u98D4"], /* CJK Ideograph */ + ["\u98D5", "\u98D5"], /* CJK Ideograph */ + ["\u98D6", "\u98D6"], /* CJK Ideograph */ + ["\u98D7", "\u98D7"], /* CJK Ideograph */ + ["\u98D8", "\u98D8"], /* CJK Ideograph */ + ["\u98D9", "\u98D9"], /* CJK Ideograph */ + ["\u98DA", "\u98DA"], /* CJK Ideograph */ + ["\u98DB", "\u98DB"], /* CJK Ideograph */ + ["\u98DC", "\u98DC"], /* CJK Ideograph */ + ["\u98DD", "\u98DD"], /* CJK Ideograph */ + ["\u98DE", "\u98DE"], /* CJK Ideograph */ + ["\u98DF", "\u98DF"], /* CJK Ideograph */ + ["\u98E0", "\u98E0"], /* CJK Ideograph */ + ["\u98E1", "\u98E1"], /* CJK Ideograph */ + ["\u98E2", "\u98E2"], /* CJK Ideograph */ + ["\u98E3", "\u98E3"], /* CJK Ideograph */ + ["\u98E4", "\u98E4"], /* CJK Ideograph */ + ["\u98E5", "\u98E5"], /* CJK Ideograph */ + ["\u98E6", "\u98E6"], /* CJK Ideograph */ + ["\u98E7", "\u98E7"], /* CJK Ideograph */ + ["\u98E8", "\u98E8"], /* CJK Ideograph */ + ["\u98E9", "\u98E9"], /* CJK Ideograph */ + ["\u98EA", "\u98EA"], /* CJK Ideograph */ + ["\u98EB", "\u98EB"], /* CJK Ideograph */ + ["\u98EC", "\u98EC"], /* CJK Ideograph */ + ["\u98ED", "\u98ED"], /* CJK Ideograph */ + ["\u98EE", "\u98EE"], /* CJK Ideograph */ + ["\u98EF", "\u98EF"], /* CJK Ideograph */ + ["\u98F0", "\u98F0"], /* CJK Ideograph */ + ["\u98F1", "\u98F1"], /* CJK Ideograph */ + ["\u98F2", "\u98F2"], /* CJK Ideograph */ + ["\u98F3", "\u98F3"], /* CJK Ideograph */ + ["\u98F4", "\u98F4"], /* CJK Ideograph */ + ["\u98F5", "\u98F5"], /* CJK Ideograph */ + ["\u98F6", "\u98F6"], /* CJK Ideograph */ + ["\u98F7", "\u98F7"], /* CJK Ideograph */ + ["\u98F8", "\u98F8"], /* CJK Ideograph */ + ["\u98F9", "\u98F9"], /* CJK Ideograph */ + ["\u98FA", "\u98FA"], /* CJK Ideograph */ + ["\u98FB", "\u98FB"], /* CJK Ideograph */ + ["\u98FC", "\u98FC"], /* CJK Ideograph */ + ["\u98FD", "\u98FD"], /* CJK Ideograph */ + ["\u98FE", "\u98FE"], /* CJK Ideograph */ + ["\u98FF", "\u98FF"], /* CJK Ideograph */ + ["\u9900", "\u9900"], /* CJK Ideograph */ + ["\u9901", "\u9901"], /* CJK Ideograph */ + ["\u9902", "\u9902"], /* CJK Ideograph */ + ["\u9903", "\u9903"], /* CJK Ideograph */ + ["\u9904", "\u9904"], /* CJK Ideograph */ + ["\u9905", "\u9905"], /* CJK Ideograph */ + ["\u9906", "\u9906"], /* CJK Ideograph */ + ["\u9907", "\u9907"], /* CJK Ideograph */ + ["\u9908", "\u9908"], /* CJK Ideograph */ + ["\u9909", "\u9909"], /* CJK Ideograph */ + ["\u990A", "\u990A"], /* CJK Ideograph */ + ["\u990B", "\u990B"], /* CJK Ideograph */ + ["\u990C", "\u990C"], /* CJK Ideograph */ + ["\u990D", "\u990D"], /* CJK Ideograph */ + ["\u990E", "\u990E"], /* CJK Ideograph */ + ["\u990F", "\u990F"], /* CJK Ideograph */ + ["\u9910", "\u9910"], /* CJK Ideograph */ + ["\u9911", "\u9911"], /* CJK Ideograph */ + ["\u9912", "\u9912"], /* CJK Ideograph */ + ["\u9913", "\u9913"], /* CJK Ideograph */ + ["\u9914", "\u9914"], /* CJK Ideograph */ + ["\u9915", "\u9915"], /* CJK Ideograph */ + ["\u9916", "\u9916"], /* CJK Ideograph */ + ["\u9917", "\u9917"], /* CJK Ideograph */ + ["\u9918", "\u9918"], /* CJK Ideograph */ + ["\u9919", "\u9919"], /* CJK Ideograph */ + ["\u991A", "\u991A"], /* CJK Ideograph */ + ["\u991B", "\u991B"], /* CJK Ideograph */ + ["\u991C", "\u991C"], /* CJK Ideograph */ + ["\u991D", "\u991D"], /* CJK Ideograph */ + ["\u991E", "\u991E"], /* CJK Ideograph */ + ["\u991F", "\u991F"], /* CJK Ideograph */ + ["\u9920", "\u9920"], /* CJK Ideograph */ + ["\u9921", "\u9921"], /* CJK Ideograph */ + ["\u9922", "\u9922"], /* CJK Ideograph */ + ["\u9923", "\u9923"], /* CJK Ideograph */ + ["\u9924", "\u9924"], /* CJK Ideograph */ + ["\u9925", "\u9925"], /* CJK Ideograph */ + ["\u9926", "\u9926"], /* CJK Ideograph */ + ["\u9927", "\u9927"], /* CJK Ideograph */ + ["\u9928", "\u9928"], /* CJK Ideograph */ + ["\u9929", "\u9929"], /* CJK Ideograph */ + ["\u992A", "\u992A"], /* CJK Ideograph */ + ["\u992B", "\u992B"], /* CJK Ideograph */ + ["\u992C", "\u992C"], /* CJK Ideograph */ + ["\u992D", "\u992D"], /* CJK Ideograph */ + ["\u992E", "\u992E"], /* CJK Ideograph */ + ["\u992F", "\u992F"], /* CJK Ideograph */ + ["\u9930", "\u9930"], /* CJK Ideograph */ + ["\u9931", "\u9931"], /* CJK Ideograph */ + ["\u9932", "\u9932"], /* CJK Ideograph */ + ["\u9933", "\u9933"], /* CJK Ideograph */ + ["\u9934", "\u9934"], /* CJK Ideograph */ + ["\u9935", "\u9935"], /* CJK Ideograph */ + ["\u9936", "\u9936"], /* CJK Ideograph */ + ["\u9937", "\u9937"], /* CJK Ideograph */ + ["\u9938", "\u9938"], /* CJK Ideograph */ + ["\u9939", "\u9939"], /* CJK Ideograph */ + ["\u993A", "\u993A"], /* CJK Ideograph */ + ["\u993B", "\u993B"], /* CJK Ideograph */ + ["\u993C", "\u993C"], /* CJK Ideograph */ + ["\u993D", "\u993D"], /* CJK Ideograph */ + ["\u993E", "\u993E"], /* CJK Ideograph */ + ["\u993F", "\u993F"], /* CJK Ideograph */ + ["\u9940", "\u9940"], /* CJK Ideograph */ + ["\u9941", "\u9941"], /* CJK Ideograph */ + ["\u9942", "\u9942"], /* CJK Ideograph */ + ["\u9943", "\u9943"], /* CJK Ideograph */ + ["\u9944", "\u9944"], /* CJK Ideograph */ + ["\u9945", "\u9945"], /* CJK Ideograph */ + ["\u9946", "\u9946"], /* CJK Ideograph */ + ["\u9947", "\u9947"], /* CJK Ideograph */ + ["\u9948", "\u9948"], /* CJK Ideograph */ + ["\u9949", "\u9949"], /* CJK Ideograph */ + ["\u994A", "\u994A"], /* CJK Ideograph */ + ["\u994B", "\u994B"], /* CJK Ideograph */ + ["\u994C", "\u994C"], /* CJK Ideograph */ + ["\u994D", "\u994D"], /* CJK Ideograph */ + ["\u994E", "\u994E"], /* CJK Ideograph */ + ["\u994F", "\u994F"], /* CJK Ideograph */ + ["\u9950", "\u9950"], /* CJK Ideograph */ + ["\u9951", "\u9951"], /* CJK Ideograph */ + ["\u9952", "\u9952"], /* CJK Ideograph */ + ["\u9953", "\u9953"], /* CJK Ideograph */ + ["\u9954", "\u9954"], /* CJK Ideograph */ + ["\u9955", "\u9955"], /* CJK Ideograph */ + ["\u9956", "\u9956"], /* CJK Ideograph */ + ["\u9957", "\u9957"], /* CJK Ideograph */ + ["\u9958", "\u9958"], /* CJK Ideograph */ + ["\u9959", "\u9959"], /* CJK Ideograph */ + ["\u995A", "\u995A"], /* CJK Ideograph */ + ["\u995B", "\u995B"], /* CJK Ideograph */ + ["\u995C", "\u995C"], /* CJK Ideograph */ + ["\u995D", "\u995D"], /* CJK Ideograph */ + ["\u995E", "\u995E"], /* CJK Ideograph */ + ["\u995F", "\u995F"], /* CJK Ideograph */ + ["\u9960", "\u9960"], /* CJK Ideograph */ + ["\u9961", "\u9961"], /* CJK Ideograph */ + ["\u9962", "\u9962"], /* CJK Ideograph */ + ["\u9963", "\u9963"], /* CJK Ideograph */ + ["\u9964", "\u9964"], /* CJK Ideograph */ + ["\u9965", "\u9965"], /* CJK Ideograph */ + ["\u9966", "\u9966"], /* CJK Ideograph */ + ["\u9967", "\u9967"], /* CJK Ideograph */ + ["\u9968", "\u9968"], /* CJK Ideograph */ + ["\u9969", "\u9969"], /* CJK Ideograph */ + ["\u996A", "\u996A"], /* CJK Ideograph */ + ["\u996B", "\u996B"], /* CJK Ideograph */ + ["\u996C", "\u996C"], /* CJK Ideograph */ + ["\u996D", "\u996D"], /* CJK Ideograph */ + ["\u996E", "\u996E"], /* CJK Ideograph */ + ["\u996F", "\u996F"], /* CJK Ideograph */ + ["\u9970", "\u9970"], /* CJK Ideograph */ + ["\u9971", "\u9971"], /* CJK Ideograph */ + ["\u9972", "\u9972"], /* CJK Ideograph */ + ["\u9973", "\u9973"], /* CJK Ideograph */ + ["\u9974", "\u9974"], /* CJK Ideograph */ + ["\u9975", "\u9975"], /* CJK Ideograph */ + ["\u9976", "\u9976"], /* CJK Ideograph */ + ["\u9977", "\u9977"], /* CJK Ideograph */ + ["\u9978", "\u9978"], /* CJK Ideograph */ + ["\u9979", "\u9979"], /* CJK Ideograph */ + ["\u997A", "\u997A"], /* CJK Ideograph */ + ["\u997B", "\u997B"], /* CJK Ideograph */ + ["\u997C", "\u997C"], /* CJK Ideograph */ + ["\u997D", "\u997D"], /* CJK Ideograph */ + ["\u997E", "\u997E"], /* CJK Ideograph */ + ["\u997F", "\u997F"], /* CJK Ideograph */ + ["\u9980", "\u9980"], /* CJK Ideograph */ + ["\u9981", "\u9981"], /* CJK Ideograph */ + ["\u9982", "\u9982"], /* CJK Ideograph */ + ["\u9983", "\u9983"], /* CJK Ideograph */ + ["\u9984", "\u9984"], /* CJK Ideograph */ + ["\u9985", "\u9985"], /* CJK Ideograph */ + ["\u9986", "\u9986"], /* CJK Ideograph */ + ["\u9987", "\u9987"], /* CJK Ideograph */ + ["\u9988", "\u9988"], /* CJK Ideograph */ + ["\u9989", "\u9989"], /* CJK Ideograph */ + ["\u998A", "\u998A"], /* CJK Ideograph */ + ["\u998B", "\u998B"], /* CJK Ideograph */ + ["\u998C", "\u998C"], /* CJK Ideograph */ + ["\u998D", "\u998D"], /* CJK Ideograph */ + ["\u998E", "\u998E"], /* CJK Ideograph */ + ["\u998F", "\u998F"], /* CJK Ideograph */ + ["\u9990", "\u9990"], /* CJK Ideograph */ + ["\u9991", "\u9991"], /* CJK Ideograph */ + ["\u9992", "\u9992"], /* CJK Ideograph */ + ["\u9993", "\u9993"], /* CJK Ideograph */ + ["\u9994", "\u9994"], /* CJK Ideograph */ + ["\u9995", "\u9995"], /* CJK Ideograph */ + ["\u9996", "\u9996"], /* CJK Ideograph */ + ["\u9997", "\u9997"], /* CJK Ideograph */ + ["\u9998", "\u9998"], /* CJK Ideograph */ + ["\u9999", "\u9999"], /* CJK Ideograph */ + ["\u999A", "\u999A"], /* CJK Ideograph */ + ["\u999B", "\u999B"], /* CJK Ideograph */ + ["\u999C", "\u999C"], /* CJK Ideograph */ + ["\u999D", "\u999D"], /* CJK Ideograph */ + ["\u999E", "\u999E"], /* CJK Ideograph */ + ["\u999F", "\u999F"], /* CJK Ideograph */ + ["\u99A0", "\u99A0"], /* CJK Ideograph */ + ["\u99A1", "\u99A1"], /* CJK Ideograph */ + ["\u99A2", "\u99A2"], /* CJK Ideograph */ + ["\u99A3", "\u99A3"], /* CJK Ideograph */ + ["\u99A4", "\u99A4"], /* CJK Ideograph */ + ["\u99A5", "\u99A5"], /* CJK Ideograph */ + ["\u99A6", "\u99A6"], /* CJK Ideograph */ + ["\u99A7", "\u99A7"], /* CJK Ideograph */ + ["\u99A8", "\u99A8"], /* CJK Ideograph */ + ["\u99A9", "\u99A9"], /* CJK Ideograph */ + ["\u99AA", "\u99AA"], /* CJK Ideograph */ + ["\u99AB", "\u99AB"], /* CJK Ideograph */ + ["\u99AC", "\u99AC"], /* CJK Ideograph */ + ["\u99AD", "\u99AD"], /* CJK Ideograph */ + ["\u99AE", "\u99AE"], /* CJK Ideograph */ + ["\u99AF", "\u99AF"], /* CJK Ideograph */ + ["\u99B0", "\u99B0"], /* CJK Ideograph */ + ["\u99B1", "\u99B1"], /* CJK Ideograph */ + ["\u99B2", "\u99B2"], /* CJK Ideograph */ + ["\u99B3", "\u99B3"], /* CJK Ideograph */ + ["\u99B4", "\u99B4"], /* CJK Ideograph */ + ["\u99B5", "\u99B5"], /* CJK Ideograph */ + ["\u99B6", "\u99B6"], /* CJK Ideograph */ + ["\u99B7", "\u99B7"], /* CJK Ideograph */ + ["\u99B8", "\u99B8"], /* CJK Ideograph */ + ["\u99B9", "\u99B9"], /* CJK Ideograph */ + ["\u99BA", "\u99BA"], /* CJK Ideograph */ + ["\u99BB", "\u99BB"], /* CJK Ideograph */ + ["\u99BC", "\u99BC"], /* CJK Ideograph */ + ["\u99BD", "\u99BD"], /* CJK Ideograph */ + ["\u99BE", "\u99BE"], /* CJK Ideograph */ + ["\u99BF", "\u99BF"], /* CJK Ideograph */ + ["\u99C0", "\u99C0"], /* CJK Ideograph */ + ["\u99C1", "\u99C1"], /* CJK Ideograph */ + ["\u99C2", "\u99C2"], /* CJK Ideograph */ + ["\u99C3", "\u99C3"], /* CJK Ideograph */ + ["\u99C4", "\u99C4"], /* CJK Ideograph */ + ["\u99C5", "\u99C5"], /* CJK Ideograph */ + ["\u99C6", "\u99C6"], /* CJK Ideograph */ + ["\u99C7", "\u99C7"], /* CJK Ideograph */ + ["\u99C8", "\u99C8"], /* CJK Ideograph */ + ["\u99C9", "\u99C9"], /* CJK Ideograph */ + ["\u99CA", "\u99CA"], /* CJK Ideograph */ + ["\u99CB", "\u99CB"], /* CJK Ideograph */ + ["\u99CC", "\u99CC"], /* CJK Ideograph */ + ["\u99CD", "\u99CD"], /* CJK Ideograph */ + ["\u99CE", "\u99CE"], /* CJK Ideograph */ + ["\u99CF", "\u99CF"], /* CJK Ideograph */ + ["\u99D0", "\u99D0"], /* CJK Ideograph */ + ["\u99D1", "\u99D1"], /* CJK Ideograph */ + ["\u99D2", "\u99D2"], /* CJK Ideograph */ + ["\u99D3", "\u99D3"], /* CJK Ideograph */ + ["\u99D4", "\u99D4"], /* CJK Ideograph */ + ["\u99D5", "\u99D5"], /* CJK Ideograph */ + ["\u99D6", "\u99D6"], /* CJK Ideograph */ + ["\u99D7", "\u99D7"], /* CJK Ideograph */ + ["\u99D8", "\u99D8"], /* CJK Ideograph */ + ["\u99D9", "\u99D9"], /* CJK Ideograph */ + ["\u99DA", "\u99DA"], /* CJK Ideograph */ + ["\u99DB", "\u99DB"], /* CJK Ideograph */ + ["\u99DC", "\u99DC"], /* CJK Ideograph */ + ["\u99DD", "\u99DD"], /* CJK Ideograph */ + ["\u99DE", "\u99DE"], /* CJK Ideograph */ + ["\u99DF", "\u99DF"], /* CJK Ideograph */ + ["\u99E0", "\u99E0"], /* CJK Ideograph */ + ["\u99E1", "\u99E1"], /* CJK Ideograph */ + ["\u99E2", "\u99E2"], /* CJK Ideograph */ + ["\u99E3", "\u99E3"], /* CJK Ideograph */ + ["\u99E4", "\u99E4"], /* CJK Ideograph */ + ["\u99E5", "\u99E5"], /* CJK Ideograph */ + ["\u99E6", "\u99E6"], /* CJK Ideograph */ + ["\u99E7", "\u99E7"], /* CJK Ideograph */ + ["\u99E8", "\u99E8"], /* CJK Ideograph */ + ["\u99E9", "\u99E9"], /* CJK Ideograph */ + ["\u99EA", "\u99EA"], /* CJK Ideograph */ + ["\u99EB", "\u99EB"], /* CJK Ideograph */ + ["\u99EC", "\u99EC"], /* CJK Ideograph */ + ["\u99ED", "\u99ED"], /* CJK Ideograph */ + ["\u99EE", "\u99EE"], /* CJK Ideograph */ + ["\u99EF", "\u99EF"], /* CJK Ideograph */ + ["\u99F0", "\u99F0"], /* CJK Ideograph */ + ["\u99F1", "\u99F1"], /* CJK Ideograph */ + ["\u99F2", "\u99F2"], /* CJK Ideograph */ + ["\u99F3", "\u99F3"], /* CJK Ideograph */ + ["\u99F4", "\u99F4"], /* CJK Ideograph */ + ["\u99F5", "\u99F5"], /* CJK Ideograph */ + ["\u99F6", "\u99F6"], /* CJK Ideograph */ + ["\u99F7", "\u99F7"], /* CJK Ideograph */ + ["\u99F8", "\u99F8"], /* CJK Ideograph */ + ["\u99F9", "\u99F9"], /* CJK Ideograph */ + ["\u99FA", "\u99FA"], /* CJK Ideograph */ + ["\u99FB", "\u99FB"], /* CJK Ideograph */ + ["\u99FC", "\u99FC"], /* CJK Ideograph */ + ["\u99FD", "\u99FD"], /* CJK Ideograph */ + ["\u99FE", "\u99FE"], /* CJK Ideograph */ + ["\u99FF", "\u99FF"], /* CJK Ideograph */ + ["\u9A00", "\u9A00"], /* CJK Ideograph */ + ["\u9A01", "\u9A01"], /* CJK Ideograph */ + ["\u9A02", "\u9A02"], /* CJK Ideograph */ + ["\u9A03", "\u9A03"], /* CJK Ideograph */ + ["\u9A04", "\u9A04"], /* CJK Ideograph */ + ["\u9A05", "\u9A05"], /* CJK Ideograph */ + ["\u9A06", "\u9A06"], /* CJK Ideograph */ + ["\u9A07", "\u9A07"], /* CJK Ideograph */ + ["\u9A08", "\u9A08"], /* CJK Ideograph */ + ["\u9A09", "\u9A09"], /* CJK Ideograph */ + ["\u9A0A", "\u9A0A"], /* CJK Ideograph */ + ["\u9A0B", "\u9A0B"], /* CJK Ideograph */ + ["\u9A0C", "\u9A0C"], /* CJK Ideograph */ + ["\u9A0D", "\u9A0D"], /* CJK Ideograph */ + ["\u9A0E", "\u9A0E"], /* CJK Ideograph */ + ["\u9A0F", "\u9A0F"], /* CJK Ideograph */ + ["\u9A10", "\u9A10"], /* CJK Ideograph */ + ["\u9A11", "\u9A11"], /* CJK Ideograph */ + ["\u9A12", "\u9A12"], /* CJK Ideograph */ + ["\u9A13", "\u9A13"], /* CJK Ideograph */ + ["\u9A14", "\u9A14"], /* CJK Ideograph */ + ["\u9A15", "\u9A15"], /* CJK Ideograph */ + ["\u9A16", "\u9A16"], /* CJK Ideograph */ + ["\u9A17", "\u9A17"], /* CJK Ideograph */ + ["\u9A18", "\u9A18"], /* CJK Ideograph */ + ["\u9A19", "\u9A19"], /* CJK Ideograph */ + ["\u9A1A", "\u9A1A"], /* CJK Ideograph */ + ["\u9A1B", "\u9A1B"], /* CJK Ideograph */ + ["\u9A1C", "\u9A1C"], /* CJK Ideograph */ + ["\u9A1D", "\u9A1D"], /* CJK Ideograph */ + ["\u9A1E", "\u9A1E"], /* CJK Ideograph */ + ["\u9A1F", "\u9A1F"], /* CJK Ideograph */ + ["\u9A20", "\u9A20"], /* CJK Ideograph */ + ["\u9A21", "\u9A21"], /* CJK Ideograph */ + ["\u9A22", "\u9A22"], /* CJK Ideograph */ + ["\u9A23", "\u9A23"], /* CJK Ideograph */ + ["\u9A24", "\u9A24"], /* CJK Ideograph */ + ["\u9A25", "\u9A25"], /* CJK Ideograph */ + ["\u9A26", "\u9A26"], /* CJK Ideograph */ + ["\u9A27", "\u9A27"], /* CJK Ideograph */ + ["\u9A28", "\u9A28"], /* CJK Ideograph */ + ["\u9A29", "\u9A29"], /* CJK Ideograph */ + ["\u9A2A", "\u9A2A"], /* CJK Ideograph */ + ["\u9A2B", "\u9A2B"], /* CJK Ideograph */ + ["\u9A2C", "\u9A2C"], /* CJK Ideograph */ + ["\u9A2D", "\u9A2D"], /* CJK Ideograph */ + ["\u9A2E", "\u9A2E"], /* CJK Ideograph */ + ["\u9A2F", "\u9A2F"], /* CJK Ideograph */ + ["\u9A30", "\u9A30"], /* CJK Ideograph */ + ["\u9A31", "\u9A31"], /* CJK Ideograph */ + ["\u9A32", "\u9A32"], /* CJK Ideograph */ + ["\u9A33", "\u9A33"], /* CJK Ideograph */ + ["\u9A34", "\u9A34"], /* CJK Ideograph */ + ["\u9A35", "\u9A35"], /* CJK Ideograph */ + ["\u9A36", "\u9A36"], /* CJK Ideograph */ + ["\u9A37", "\u9A37"], /* CJK Ideograph */ + ["\u9A38", "\u9A38"], /* CJK Ideograph */ + ["\u9A39", "\u9A39"], /* CJK Ideograph */ + ["\u9A3A", "\u9A3A"], /* CJK Ideograph */ + ["\u9A3B", "\u9A3B"], /* CJK Ideograph */ + ["\u9A3C", "\u9A3C"], /* CJK Ideograph */ + ["\u9A3D", "\u9A3D"], /* CJK Ideograph */ + ["\u9A3E", "\u9A3E"], /* CJK Ideograph */ + ["\u9A3F", "\u9A3F"], /* CJK Ideograph */ + ["\u9A40", "\u9A40"], /* CJK Ideograph */ + ["\u9A41", "\u9A41"], /* CJK Ideograph */ + ["\u9A42", "\u9A42"], /* CJK Ideograph */ + ["\u9A43", "\u9A43"], /* CJK Ideograph */ + ["\u9A44", "\u9A44"], /* CJK Ideograph */ + ["\u9A45", "\u9A45"], /* CJK Ideograph */ + ["\u9A46", "\u9A46"], /* CJK Ideograph */ + ["\u9A47", "\u9A47"], /* CJK Ideograph */ + ["\u9A48", "\u9A48"], /* CJK Ideograph */ + ["\u9A49", "\u9A49"], /* CJK Ideograph */ + ["\u9A4A", "\u9A4A"], /* CJK Ideograph */ + ["\u9A4B", "\u9A4B"], /* CJK Ideograph */ + ["\u9A4C", "\u9A4C"], /* CJK Ideograph */ + ["\u9A4D", "\u9A4D"], /* CJK Ideograph */ + ["\u9A4E", "\u9A4E"], /* CJK Ideograph */ + ["\u9A4F", "\u9A4F"], /* CJK Ideograph */ + ["\u9A50", "\u9A50"], /* CJK Ideograph */ + ["\u9A51", "\u9A51"], /* CJK Ideograph */ + ["\u9A52", "\u9A52"], /* CJK Ideograph */ + ["\u9A53", "\u9A53"], /* CJK Ideograph */ + ["\u9A54", "\u9A54"], /* CJK Ideograph */ + ["\u9A55", "\u9A55"], /* CJK Ideograph */ + ["\u9A56", "\u9A56"], /* CJK Ideograph */ + ["\u9A57", "\u9A57"], /* CJK Ideograph */ + ["\u9A58", "\u9A58"], /* CJK Ideograph */ + ["\u9A59", "\u9A59"], /* CJK Ideograph */ + ["\u9A5A", "\u9A5A"], /* CJK Ideograph */ + ["\u9A5B", "\u9A5B"], /* CJK Ideograph */ + ["\u9A5C", "\u9A5C"], /* CJK Ideograph */ + ["\u9A5D", "\u9A5D"], /* CJK Ideograph */ + ["\u9A5E", "\u9A5E"], /* CJK Ideograph */ + ["\u9A5F", "\u9A5F"], /* CJK Ideograph */ + ["\u9A60", "\u9A60"], /* CJK Ideograph */ + ["\u9A61", "\u9A61"], /* CJK Ideograph */ + ["\u9A62", "\u9A62"], /* CJK Ideograph */ + ["\u9A63", "\u9A63"], /* CJK Ideograph */ + ["\u9A64", "\u9A64"], /* CJK Ideograph */ + ["\u9A65", "\u9A65"], /* CJK Ideograph */ + ["\u9A66", "\u9A66"], /* CJK Ideograph */ + ["\u9A67", "\u9A67"], /* CJK Ideograph */ + ["\u9A68", "\u9A68"], /* CJK Ideograph */ + ["\u9A69", "\u9A69"], /* CJK Ideograph */ + ["\u9A6A", "\u9A6A"], /* CJK Ideograph */ + ["\u9A6B", "\u9A6B"], /* CJK Ideograph */ + ["\u9A6C", "\u9A6C"], /* CJK Ideograph */ + ["\u9A6D", "\u9A6D"], /* CJK Ideograph */ + ["\u9A6E", "\u9A6E"], /* CJK Ideograph */ + ["\u9A6F", "\u9A6F"], /* CJK Ideograph */ + ["\u9A70", "\u9A70"], /* CJK Ideograph */ + ["\u9A71", "\u9A71"], /* CJK Ideograph */ + ["\u9A72", "\u9A72"], /* CJK Ideograph */ + ["\u9A73", "\u9A73"], /* CJK Ideograph */ + ["\u9A74", "\u9A74"], /* CJK Ideograph */ + ["\u9A75", "\u9A75"], /* CJK Ideograph */ + ["\u9A76", "\u9A76"], /* CJK Ideograph */ + ["\u9A77", "\u9A77"], /* CJK Ideograph */ + ["\u9A78", "\u9A78"], /* CJK Ideograph */ + ["\u9A79", "\u9A79"], /* CJK Ideograph */ + ["\u9A7A", "\u9A7A"], /* CJK Ideograph */ + ["\u9A7B", "\u9A7B"], /* CJK Ideograph */ + ["\u9A7C", "\u9A7C"], /* CJK Ideograph */ + ["\u9A7D", "\u9A7D"], /* CJK Ideograph */ + ["\u9A7E", "\u9A7E"], /* CJK Ideograph */ + ["\u9A7F", "\u9A7F"], /* CJK Ideograph */ + ["\u9A80", "\u9A80"], /* CJK Ideograph */ + ["\u9A81", "\u9A81"], /* CJK Ideograph */ + ["\u9A82", "\u9A82"], /* CJK Ideograph */ + ["\u9A83", "\u9A83"], /* CJK Ideograph */ + ["\u9A84", "\u9A84"], /* CJK Ideograph */ + ["\u9A85", "\u9A85"], /* CJK Ideograph */ + ["\u9A86", "\u9A86"], /* CJK Ideograph */ + ["\u9A87", "\u9A87"], /* CJK Ideograph */ + ["\u9A88", "\u9A88"], /* CJK Ideograph */ + ["\u9A89", "\u9A89"], /* CJK Ideograph */ + ["\u9A8A", "\u9A8A"], /* CJK Ideograph */ + ["\u9A8B", "\u9A8B"], /* CJK Ideograph */ + ["\u9A8C", "\u9A8C"], /* CJK Ideograph */ + ["\u9A8D", "\u9A8D"], /* CJK Ideograph */ + ["\u9A8E", "\u9A8E"], /* CJK Ideograph */ + ["\u9A8F", "\u9A8F"], /* CJK Ideograph */ + ["\u9A90", "\u9A90"], /* CJK Ideograph */ + ["\u9A91", "\u9A91"], /* CJK Ideograph */ + ["\u9A92", "\u9A92"], /* CJK Ideograph */ + ["\u9A93", "\u9A93"], /* CJK Ideograph */ + ["\u9A94", "\u9A94"], /* CJK Ideograph */ + ["\u9A95", "\u9A95"], /* CJK Ideograph */ + ["\u9A96", "\u9A96"], /* CJK Ideograph */ + ["\u9A97", "\u9A97"], /* CJK Ideograph */ + ["\u9A98", "\u9A98"], /* CJK Ideograph */ + ["\u9A99", "\u9A99"], /* CJK Ideograph */ + ["\u9A9A", "\u9A9A"], /* CJK Ideograph */ + ["\u9A9B", "\u9A9B"], /* CJK Ideograph */ + ["\u9A9C", "\u9A9C"], /* CJK Ideograph */ + ["\u9A9D", "\u9A9D"], /* CJK Ideograph */ + ["\u9A9E", "\u9A9E"], /* CJK Ideograph */ + ["\u9A9F", "\u9A9F"], /* CJK Ideograph */ + ["\u9AA0", "\u9AA0"], /* CJK Ideograph */ + ["\u9AA1", "\u9AA1"], /* CJK Ideograph */ + ["\u9AA2", "\u9AA2"], /* CJK Ideograph */ + ["\u9AA3", "\u9AA3"], /* CJK Ideograph */ + ["\u9AA4", "\u9AA4"], /* CJK Ideograph */ + ["\u9AA5", "\u9AA5"], /* CJK Ideograph */ + ["\u9AA6", "\u9AA6"], /* CJK Ideograph */ + ["\u9AA7", "\u9AA7"], /* CJK Ideograph */ + ["\u9AA8", "\u9AA8"], /* CJK Ideograph */ + ["\u9AA9", "\u9AA9"], /* CJK Ideograph */ + ["\u9AAA", "\u9AAA"], /* CJK Ideograph */ + ["\u9AAB", "\u9AAB"], /* CJK Ideograph */ + ["\u9AAC", "\u9AAC"], /* CJK Ideograph */ + ["\u9AAD", "\u9AAD"], /* CJK Ideograph */ + ["\u9AAE", "\u9AAE"], /* CJK Ideograph */ + ["\u9AAF", "\u9AAF"], /* CJK Ideograph */ + ["\u9AB0", "\u9AB0"], /* CJK Ideograph */ + ["\u9AB1", "\u9AB1"], /* CJK Ideograph */ + ["\u9AB2", "\u9AB2"], /* CJK Ideograph */ + ["\u9AB3", "\u9AB3"], /* CJK Ideograph */ + ["\u9AB4", "\u9AB4"], /* CJK Ideograph */ + ["\u9AB5", "\u9AB5"], /* CJK Ideograph */ + ["\u9AB6", "\u9AB6"], /* CJK Ideograph */ + ["\u9AB7", "\u9AB7"], /* CJK Ideograph */ + ["\u9AB8", "\u9AB8"], /* CJK Ideograph */ + ["\u9AB9", "\u9AB9"], /* CJK Ideograph */ + ["\u9ABA", "\u9ABA"], /* CJK Ideograph */ + ["\u9ABB", "\u9ABB"], /* CJK Ideograph */ + ["\u9ABC", "\u9ABC"], /* CJK Ideograph */ + ["\u9ABD", "\u9ABD"], /* CJK Ideograph */ + ["\u9ABE", "\u9ABE"], /* CJK Ideograph */ + ["\u9ABF", "\u9ABF"], /* CJK Ideograph */ + ["\u9AC0", "\u9AC0"], /* CJK Ideograph */ + ["\u9AC1", "\u9AC1"], /* CJK Ideograph */ + ["\u9AC2", "\u9AC2"], /* CJK Ideograph */ + ["\u9AC3", "\u9AC3"], /* CJK Ideograph */ + ["\u9AC4", "\u9AC4"], /* CJK Ideograph */ + ["\u9AC5", "\u9AC5"], /* CJK Ideograph */ + ["\u9AC6", "\u9AC6"], /* CJK Ideograph */ + ["\u9AC7", "\u9AC7"], /* CJK Ideograph */ + ["\u9AC8", "\u9AC8"], /* CJK Ideograph */ + ["\u9AC9", "\u9AC9"], /* CJK Ideograph */ + ["\u9ACA", "\u9ACA"], /* CJK Ideograph */ + ["\u9ACB", "\u9ACB"], /* CJK Ideograph */ + ["\u9ACC", "\u9ACC"], /* CJK Ideograph */ + ["\u9ACD", "\u9ACD"], /* CJK Ideograph */ + ["\u9ACE", "\u9ACE"], /* CJK Ideograph */ + ["\u9ACF", "\u9ACF"], /* CJK Ideograph */ + ["\u9AD0", "\u9AD0"], /* CJK Ideograph */ + ["\u9AD1", "\u9AD1"], /* CJK Ideograph */ + ["\u9AD2", "\u9AD2"], /* CJK Ideograph */ + ["\u9AD3", "\u9AD3"], /* CJK Ideograph */ + ["\u9AD4", "\u9AD4"], /* CJK Ideograph */ + ["\u9AD5", "\u9AD5"], /* CJK Ideograph */ + ["\u9AD6", "\u9AD6"], /* CJK Ideograph */ + ["\u9AD7", "\u9AD7"], /* CJK Ideograph */ + ["\u9AD8", "\u9AD8"], /* CJK Ideograph */ + ["\u9AD9", "\u9AD9"], /* CJK Ideograph */ + ["\u9ADA", "\u9ADA"], /* CJK Ideograph */ + ["\u9ADB", "\u9ADB"], /* CJK Ideograph */ + ["\u9ADC", "\u9ADC"], /* CJK Ideograph */ + ["\u9ADD", "\u9ADD"], /* CJK Ideograph */ + ["\u9ADE", "\u9ADE"], /* CJK Ideograph */ + ["\u9ADF", "\u9ADF"], /* CJK Ideograph */ + ["\u9AE0", "\u9AE0"], /* CJK Ideograph */ + ["\u9AE1", "\u9AE1"], /* CJK Ideograph */ + ["\u9AE2", "\u9AE2"], /* CJK Ideograph */ + ["\u9AE3", "\u9AE3"], /* CJK Ideograph */ + ["\u9AE4", "\u9AE4"], /* CJK Ideograph */ + ["\u9AE5", "\u9AE5"], /* CJK Ideograph */ + ["\u9AE6", "\u9AE6"], /* CJK Ideograph */ + ["\u9AE7", "\u9AE7"], /* CJK Ideograph */ + ["\u9AE8", "\u9AE8"], /* CJK Ideograph */ + ["\u9AE9", "\u9AE9"], /* CJK Ideograph */ + ["\u9AEA", "\u9AEA"], /* CJK Ideograph */ + ["\u9AEB", "\u9AEB"], /* CJK Ideograph */ + ["\u9AEC", "\u9AEC"], /* CJK Ideograph */ + ["\u9AED", "\u9AED"], /* CJK Ideograph */ + ["\u9AEE", "\u9AEE"], /* CJK Ideograph */ + ["\u9AEF", "\u9AEF"], /* CJK Ideograph */ + ["\u9AF0", "\u9AF0"], /* CJK Ideograph */ + ["\u9AF1", "\u9AF1"], /* CJK Ideograph */ + ["\u9AF2", "\u9AF2"], /* CJK Ideograph */ + ["\u9AF3", "\u9AF3"], /* CJK Ideograph */ + ["\u9AF4", "\u9AF4"], /* CJK Ideograph */ + ["\u9AF5", "\u9AF5"], /* CJK Ideograph */ + ["\u9AF6", "\u9AF6"], /* CJK Ideograph */ + ["\u9AF7", "\u9AF7"], /* CJK Ideograph */ + ["\u9AF8", "\u9AF8"], /* CJK Ideograph */ + ["\u9AF9", "\u9AF9"], /* CJK Ideograph */ + ["\u9AFA", "\u9AFA"], /* CJK Ideograph */ + ["\u9AFB", "\u9AFB"], /* CJK Ideograph */ + ["\u9AFC", "\u9AFC"], /* CJK Ideograph */ + ["\u9AFD", "\u9AFD"], /* CJK Ideograph */ + ["\u9AFE", "\u9AFE"], /* CJK Ideograph */ + ["\u9AFF", "\u9AFF"], /* CJK Ideograph */ + ["\u9B00", "\u9B00"], /* CJK Ideograph */ + ["\u9B01", "\u9B01"], /* CJK Ideograph */ + ["\u9B02", "\u9B02"], /* CJK Ideograph */ + ["\u9B03", "\u9B03"], /* CJK Ideograph */ + ["\u9B04", "\u9B04"], /* CJK Ideograph */ + ["\u9B05", "\u9B05"], /* CJK Ideograph */ + ["\u9B06", "\u9B06"], /* CJK Ideograph */ + ["\u9B07", "\u9B07"], /* CJK Ideograph */ + ["\u9B08", "\u9B08"], /* CJK Ideograph */ + ["\u9B09", "\u9B09"], /* CJK Ideograph */ + ["\u9B0A", "\u9B0A"], /* CJK Ideograph */ + ["\u9B0B", "\u9B0B"], /* CJK Ideograph */ + ["\u9B0C", "\u9B0C"], /* CJK Ideograph */ + ["\u9B0D", "\u9B0D"], /* CJK Ideograph */ + ["\u9B0E", "\u9B0E"], /* CJK Ideograph */ + ["\u9B0F", "\u9B0F"], /* CJK Ideograph */ + ["\u9B10", "\u9B10"], /* CJK Ideograph */ + ["\u9B11", "\u9B11"], /* CJK Ideograph */ + ["\u9B12", "\u9B12"], /* CJK Ideograph */ + ["\u9B13", "\u9B13"], /* CJK Ideograph */ + ["\u9B14", "\u9B14"], /* CJK Ideograph */ + ["\u9B15", "\u9B15"], /* CJK Ideograph */ + ["\u9B16", "\u9B16"], /* CJK Ideograph */ + ["\u9B17", "\u9B17"], /* CJK Ideograph */ + ["\u9B18", "\u9B18"], /* CJK Ideograph */ + ["\u9B19", "\u9B19"], /* CJK Ideograph */ + ["\u9B1A", "\u9B1A"], /* CJK Ideograph */ + ["\u9B1B", "\u9B1B"], /* CJK Ideograph */ + ["\u9B1C", "\u9B1C"], /* CJK Ideograph */ + ["\u9B1D", "\u9B1D"], /* CJK Ideograph */ + ["\u9B1E", "\u9B1E"], /* CJK Ideograph */ + ["\u9B1F", "\u9B1F"], /* CJK Ideograph */ + ["\u9B20", "\u9B20"], /* CJK Ideograph */ + ["\u9B21", "\u9B21"], /* CJK Ideograph */ + ["\u9B22", "\u9B22"], /* CJK Ideograph */ + ["\u9B23", "\u9B23"], /* CJK Ideograph */ + ["\u9B24", "\u9B24"], /* CJK Ideograph */ + ["\u9B25", "\u9B25"], /* CJK Ideograph */ + ["\u9B26", "\u9B26"], /* CJK Ideograph */ + ["\u9B27", "\u9B27"], /* CJK Ideograph */ + ["\u9B28", "\u9B28"], /* CJK Ideograph */ + ["\u9B29", "\u9B29"], /* CJK Ideograph */ + ["\u9B2A", "\u9B2A"], /* CJK Ideograph */ + ["\u9B2B", "\u9B2B"], /* CJK Ideograph */ + ["\u9B2C", "\u9B2C"], /* CJK Ideograph */ + ["\u9B2D", "\u9B2D"], /* CJK Ideograph */ + ["\u9B2E", "\u9B2E"], /* CJK Ideograph */ + ["\u9B2F", "\u9B2F"], /* CJK Ideograph */ + ["\u9B30", "\u9B30"], /* CJK Ideograph */ + ["\u9B31", "\u9B31"], /* CJK Ideograph */ + ["\u9B32", "\u9B32"], /* CJK Ideograph */ + ["\u9B33", "\u9B33"], /* CJK Ideograph */ + ["\u9B34", "\u9B34"], /* CJK Ideograph */ + ["\u9B35", "\u9B35"], /* CJK Ideograph */ + ["\u9B36", "\u9B36"], /* CJK Ideograph */ + ["\u9B37", "\u9B37"], /* CJK Ideograph */ + ["\u9B38", "\u9B38"], /* CJK Ideograph */ + ["\u9B39", "\u9B39"], /* CJK Ideograph */ + ["\u9B3A", "\u9B3A"], /* CJK Ideograph */ + ["\u9B3B", "\u9B3B"], /* CJK Ideograph */ + ["\u9B3C", "\u9B3C"], /* CJK Ideograph */ + ["\u9B3D", "\u9B3D"], /* CJK Ideograph */ + ["\u9B3E", "\u9B3E"], /* CJK Ideograph */ + ["\u9B3F", "\u9B3F"], /* CJK Ideograph */ + ["\u9B40", "\u9B40"], /* CJK Ideograph */ + ["\u9B41", "\u9B41"], /* CJK Ideograph */ + ["\u9B42", "\u9B42"], /* CJK Ideograph */ + ["\u9B43", "\u9B43"], /* CJK Ideograph */ + ["\u9B44", "\u9B44"], /* CJK Ideograph */ + ["\u9B45", "\u9B45"], /* CJK Ideograph */ + ["\u9B46", "\u9B46"], /* CJK Ideograph */ + ["\u9B47", "\u9B47"], /* CJK Ideograph */ + ["\u9B48", "\u9B48"], /* CJK Ideograph */ + ["\u9B49", "\u9B49"], /* CJK Ideograph */ + ["\u9B4A", "\u9B4A"], /* CJK Ideograph */ + ["\u9B4B", "\u9B4B"], /* CJK Ideograph */ + ["\u9B4C", "\u9B4C"], /* CJK Ideograph */ + ["\u9B4D", "\u9B4D"], /* CJK Ideograph */ + ["\u9B4E", "\u9B4E"], /* CJK Ideograph */ + ["\u9B4F", "\u9B4F"], /* CJK Ideograph */ + ["\u9B50", "\u9B50"], /* CJK Ideograph */ + ["\u9B51", "\u9B51"], /* CJK Ideograph */ + ["\u9B52", "\u9B52"], /* CJK Ideograph */ + ["\u9B53", "\u9B53"], /* CJK Ideograph */ + ["\u9B54", "\u9B54"], /* CJK Ideograph */ + ["\u9B55", "\u9B55"], /* CJK Ideograph */ + ["\u9B56", "\u9B56"], /* CJK Ideograph */ + ["\u9B57", "\u9B57"], /* CJK Ideograph */ + ["\u9B58", "\u9B58"], /* CJK Ideograph */ + ["\u9B59", "\u9B59"], /* CJK Ideograph */ + ["\u9B5A", "\u9B5A"], /* CJK Ideograph */ + ["\u9B5B", "\u9B5B"], /* CJK Ideograph */ + ["\u9B5C", "\u9B5C"], /* CJK Ideograph */ + ["\u9B5D", "\u9B5D"], /* CJK Ideograph */ + ["\u9B5E", "\u9B5E"], /* CJK Ideograph */ + ["\u9B5F", "\u9B5F"], /* CJK Ideograph */ + ["\u9B60", "\u9B60"], /* CJK Ideograph */ + ["\u9B61", "\u9B61"], /* CJK Ideograph */ + ["\u9B62", "\u9B62"], /* CJK Ideograph */ + ["\u9B63", "\u9B63"], /* CJK Ideograph */ + ["\u9B64", "\u9B64"], /* CJK Ideograph */ + ["\u9B65", "\u9B65"], /* CJK Ideograph */ + ["\u9B66", "\u9B66"], /* CJK Ideograph */ + ["\u9B67", "\u9B67"], /* CJK Ideograph */ + ["\u9B68", "\u9B68"], /* CJK Ideograph */ + ["\u9B69", "\u9B69"], /* CJK Ideograph */ + ["\u9B6A", "\u9B6A"], /* CJK Ideograph */ + ["\u9B6B", "\u9B6B"], /* CJK Ideograph */ + ["\u9B6C", "\u9B6C"], /* CJK Ideograph */ + ["\u9B6D", "\u9B6D"], /* CJK Ideograph */ + ["\u9B6E", "\u9B6E"], /* CJK Ideograph */ + ["\u9B6F", "\u9B6F"], /* CJK Ideograph */ + ["\u9B70", "\u9B70"], /* CJK Ideograph */ + ["\u9B71", "\u9B71"], /* CJK Ideograph */ + ["\u9B72", "\u9B72"], /* CJK Ideograph */ + ["\u9B73", "\u9B73"], /* CJK Ideograph */ + ["\u9B74", "\u9B74"], /* CJK Ideograph */ + ["\u9B75", "\u9B75"], /* CJK Ideograph */ + ["\u9B76", "\u9B76"], /* CJK Ideograph */ + ["\u9B77", "\u9B77"], /* CJK Ideograph */ + ["\u9B78", "\u9B78"], /* CJK Ideograph */ + ["\u9B79", "\u9B79"], /* CJK Ideograph */ + ["\u9B7A", "\u9B7A"], /* CJK Ideograph */ + ["\u9B7B", "\u9B7B"], /* CJK Ideograph */ + ["\u9B7C", "\u9B7C"], /* CJK Ideograph */ + ["\u9B7D", "\u9B7D"], /* CJK Ideograph */ + ["\u9B7E", "\u9B7E"], /* CJK Ideograph */ + ["\u9B7F", "\u9B7F"], /* CJK Ideograph */ + ["\u9B80", "\u9B80"], /* CJK Ideograph */ + ["\u9B81", "\u9B81"], /* CJK Ideograph */ + ["\u9B82", "\u9B82"], /* CJK Ideograph */ + ["\u9B83", "\u9B83"], /* CJK Ideograph */ + ["\u9B84", "\u9B84"], /* CJK Ideograph */ + ["\u9B85", "\u9B85"], /* CJK Ideograph */ + ["\u9B86", "\u9B86"], /* CJK Ideograph */ + ["\u9B87", "\u9B87"], /* CJK Ideograph */ + ["\u9B88", "\u9B88"], /* CJK Ideograph */ + ["\u9B89", "\u9B89"], /* CJK Ideograph */ + ["\u9B8A", "\u9B8A"], /* CJK Ideograph */ + ["\u9B8B", "\u9B8B"], /* CJK Ideograph */ + ["\u9B8C", "\u9B8C"], /* CJK Ideograph */ + ["\u9B8D", "\u9B8D"], /* CJK Ideograph */ + ["\u9B8E", "\u9B8E"], /* CJK Ideograph */ + ["\u9B8F", "\u9B8F"], /* CJK Ideograph */ + ["\u9B90", "\u9B90"], /* CJK Ideograph */ + ["\u9B91", "\u9B91"], /* CJK Ideograph */ + ["\u9B92", "\u9B92"], /* CJK Ideograph */ + ["\u9B93", "\u9B93"], /* CJK Ideograph */ + ["\u9B94", "\u9B94"], /* CJK Ideograph */ + ["\u9B95", "\u9B95"], /* CJK Ideograph */ + ["\u9B96", "\u9B96"], /* CJK Ideograph */ + ["\u9B97", "\u9B97"], /* CJK Ideograph */ + ["\u9B98", "\u9B98"], /* CJK Ideograph */ + ["\u9B99", "\u9B99"], /* CJK Ideograph */ + ["\u9B9A", "\u9B9A"], /* CJK Ideograph */ + ["\u9B9B", "\u9B9B"], /* CJK Ideograph */ + ["\u9B9C", "\u9B9C"], /* CJK Ideograph */ + ["\u9B9D", "\u9B9D"], /* CJK Ideograph */ + ["\u9B9E", "\u9B9E"], /* CJK Ideograph */ + ["\u9B9F", "\u9B9F"], /* CJK Ideograph */ + ["\u9BA0", "\u9BA0"], /* CJK Ideograph */ + ["\u9BA1", "\u9BA1"], /* CJK Ideograph */ + ["\u9BA2", "\u9BA2"], /* CJK Ideograph */ + ["\u9BA3", "\u9BA3"], /* CJK Ideograph */ + ["\u9BA4", "\u9BA4"], /* CJK Ideograph */ + ["\u9BA5", "\u9BA5"], /* CJK Ideograph */ + ["\u9BA6", "\u9BA6"], /* CJK Ideograph */ + ["\u9BA7", "\u9BA7"], /* CJK Ideograph */ + ["\u9BA8", "\u9BA8"], /* CJK Ideograph */ + ["\u9BA9", "\u9BA9"], /* CJK Ideograph */ + ["\u9BAA", "\u9BAA"], /* CJK Ideograph */ + ["\u9BAB", "\u9BAB"], /* CJK Ideograph */ + ["\u9BAC", "\u9BAC"], /* CJK Ideograph */ + ["\u9BAD", "\u9BAD"], /* CJK Ideograph */ + ["\u9BAE", "\u9BAE"], /* CJK Ideograph */ + ["\u9BAF", "\u9BAF"], /* CJK Ideograph */ + ["\u9BB0", "\u9BB0"], /* CJK Ideograph */ + ["\u9BB1", "\u9BB1"], /* CJK Ideograph */ + ["\u9BB2", "\u9BB2"], /* CJK Ideograph */ + ["\u9BB3", "\u9BB3"], /* CJK Ideograph */ + ["\u9BB4", "\u9BB4"], /* CJK Ideograph */ + ["\u9BB5", "\u9BB5"], /* CJK Ideograph */ + ["\u9BB6", "\u9BB6"], /* CJK Ideograph */ + ["\u9BB7", "\u9BB7"], /* CJK Ideograph */ + ["\u9BB8", "\u9BB8"], /* CJK Ideograph */ + ["\u9BB9", "\u9BB9"], /* CJK Ideograph */ + ["\u9BBA", "\u9BBA"], /* CJK Ideograph */ + ["\u9BBB", "\u9BBB"], /* CJK Ideograph */ + ["\u9BBC", "\u9BBC"], /* CJK Ideograph */ + ["\u9BBD", "\u9BBD"], /* CJK Ideograph */ + ["\u9BBE", "\u9BBE"], /* CJK Ideograph */ + ["\u9BBF", "\u9BBF"], /* CJK Ideograph */ + ["\u9BC0", "\u9BC0"], /* CJK Ideograph */ + ["\u9BC1", "\u9BC1"], /* CJK Ideograph */ + ["\u9BC2", "\u9BC2"], /* CJK Ideograph */ + ["\u9BC3", "\u9BC3"], /* CJK Ideograph */ + ["\u9BC4", "\u9BC4"], /* CJK Ideograph */ + ["\u9BC5", "\u9BC5"], /* CJK Ideograph */ + ["\u9BC6", "\u9BC6"], /* CJK Ideograph */ + ["\u9BC7", "\u9BC7"], /* CJK Ideograph */ + ["\u9BC8", "\u9BC8"], /* CJK Ideograph */ + ["\u9BC9", "\u9BC9"], /* CJK Ideograph */ + ["\u9BCA", "\u9BCA"], /* CJK Ideograph */ + ["\u9BCB", "\u9BCB"], /* CJK Ideograph */ + ["\u9BCC", "\u9BCC"], /* CJK Ideograph */ + ["\u9BCD", "\u9BCD"], /* CJK Ideograph */ + ["\u9BCE", "\u9BCE"], /* CJK Ideograph */ + ["\u9BCF", "\u9BCF"], /* CJK Ideograph */ + ["\u9BD0", "\u9BD0"], /* CJK Ideograph */ + ["\u9BD1", "\u9BD1"], /* CJK Ideograph */ + ["\u9BD2", "\u9BD2"], /* CJK Ideograph */ + ["\u9BD3", "\u9BD3"], /* CJK Ideograph */ + ["\u9BD4", "\u9BD4"], /* CJK Ideograph */ + ["\u9BD5", "\u9BD5"], /* CJK Ideograph */ + ["\u9BD6", "\u9BD6"], /* CJK Ideograph */ + ["\u9BD7", "\u9BD7"], /* CJK Ideograph */ + ["\u9BD8", "\u9BD8"], /* CJK Ideograph */ + ["\u9BD9", "\u9BD9"], /* CJK Ideograph */ + ["\u9BDA", "\u9BDA"], /* CJK Ideograph */ + ["\u9BDB", "\u9BDB"], /* CJK Ideograph */ + ["\u9BDC", "\u9BDC"], /* CJK Ideograph */ + ["\u9BDD", "\u9BDD"], /* CJK Ideograph */ + ["\u9BDE", "\u9BDE"], /* CJK Ideograph */ + ["\u9BDF", "\u9BDF"], /* CJK Ideograph */ + ["\u9BE0", "\u9BE0"], /* CJK Ideograph */ + ["\u9BE1", "\u9BE1"], /* CJK Ideograph */ + ["\u9BE2", "\u9BE2"], /* CJK Ideograph */ + ["\u9BE3", "\u9BE3"], /* CJK Ideograph */ + ["\u9BE4", "\u9BE4"], /* CJK Ideograph */ + ["\u9BE5", "\u9BE5"], /* CJK Ideograph */ + ["\u9BE6", "\u9BE6"], /* CJK Ideograph */ + ["\u9BE7", "\u9BE7"], /* CJK Ideograph */ + ["\u9BE8", "\u9BE8"], /* CJK Ideograph */ + ["\u9BE9", "\u9BE9"], /* CJK Ideograph */ + ["\u9BEA", "\u9BEA"], /* CJK Ideograph */ + ["\u9BEB", "\u9BEB"], /* CJK Ideograph */ + ["\u9BEC", "\u9BEC"], /* CJK Ideograph */ + ["\u9BED", "\u9BED"], /* CJK Ideograph */ + ["\u9BEE", "\u9BEE"], /* CJK Ideograph */ + ["\u9BEF", "\u9BEF"], /* CJK Ideograph */ + ["\u9BF0", "\u9BF0"], /* CJK Ideograph */ + ["\u9BF1", "\u9BF1"], /* CJK Ideograph */ + ["\u9BF2", "\u9BF2"], /* CJK Ideograph */ + ["\u9BF3", "\u9BF3"], /* CJK Ideograph */ + ["\u9BF4", "\u9BF4"], /* CJK Ideograph */ + ["\u9BF5", "\u9BF5"], /* CJK Ideograph */ + ["\u9BF6", "\u9BF6"], /* CJK Ideograph */ + ["\u9BF7", "\u9BF7"], /* CJK Ideograph */ + ["\u9BF8", "\u9BF8"], /* CJK Ideograph */ + ["\u9BF9", "\u9BF9"], /* CJK Ideograph */ + ["\u9BFA", "\u9BFA"], /* CJK Ideograph */ + ["\u9BFB", "\u9BFB"], /* CJK Ideograph */ + ["\u9BFC", "\u9BFC"], /* CJK Ideograph */ + ["\u9BFD", "\u9BFD"], /* CJK Ideograph */ + ["\u9BFE", "\u9BFE"], /* CJK Ideograph */ + ["\u9BFF", "\u9BFF"], /* CJK Ideograph */ + ["\u9C00", "\u9C00"], /* CJK Ideograph */ + ["\u9C01", "\u9C01"], /* CJK Ideograph */ + ["\u9C02", "\u9C02"], /* CJK Ideograph */ + ["\u9C03", "\u9C03"], /* CJK Ideograph */ + ["\u9C04", "\u9C04"], /* CJK Ideograph */ + ["\u9C05", "\u9C05"], /* CJK Ideograph */ + ["\u9C06", "\u9C06"], /* CJK Ideograph */ + ["\u9C07", "\u9C07"], /* CJK Ideograph */ + ["\u9C08", "\u9C08"], /* CJK Ideograph */ + ["\u9C09", "\u9C09"], /* CJK Ideograph */ + ["\u9C0A", "\u9C0A"], /* CJK Ideograph */ + ["\u9C0B", "\u9C0B"], /* CJK Ideograph */ + ["\u9C0C", "\u9C0C"], /* CJK Ideograph */ + ["\u9C0D", "\u9C0D"], /* CJK Ideograph */ + ["\u9C0E", "\u9C0E"], /* CJK Ideograph */ + ["\u9C0F", "\u9C0F"], /* CJK Ideograph */ + ["\u9C10", "\u9C10"], /* CJK Ideograph */ + ["\u9C11", "\u9C11"], /* CJK Ideograph */ + ["\u9C12", "\u9C12"], /* CJK Ideograph */ + ["\u9C13", "\u9C13"], /* CJK Ideograph */ + ["\u9C14", "\u9C14"], /* CJK Ideograph */ + ["\u9C15", "\u9C15"], /* CJK Ideograph */ + ["\u9C16", "\u9C16"], /* CJK Ideograph */ + ["\u9C17", "\u9C17"], /* CJK Ideograph */ + ["\u9C18", "\u9C18"], /* CJK Ideograph */ + ["\u9C19", "\u9C19"], /* CJK Ideograph */ + ["\u9C1A", "\u9C1A"], /* CJK Ideograph */ + ["\u9C1B", "\u9C1B"], /* CJK Ideograph */ + ["\u9C1C", "\u9C1C"], /* CJK Ideograph */ + ["\u9C1D", "\u9C1D"], /* CJK Ideograph */ + ["\u9C1E", "\u9C1E"], /* CJK Ideograph */ + ["\u9C1F", "\u9C1F"], /* CJK Ideograph */ + ["\u9C20", "\u9C20"], /* CJK Ideograph */ + ["\u9C21", "\u9C21"], /* CJK Ideograph */ + ["\u9C22", "\u9C22"], /* CJK Ideograph */ + ["\u9C23", "\u9C23"], /* CJK Ideograph */ + ["\u9C24", "\u9C24"], /* CJK Ideograph */ + ["\u9C25", "\u9C25"], /* CJK Ideograph */ + ["\u9C26", "\u9C26"], /* CJK Ideograph */ + ["\u9C27", "\u9C27"], /* CJK Ideograph */ + ["\u9C28", "\u9C28"], /* CJK Ideograph */ + ["\u9C29", "\u9C29"], /* CJK Ideograph */ + ["\u9C2A", "\u9C2A"], /* CJK Ideograph */ + ["\u9C2B", "\u9C2B"], /* CJK Ideograph */ + ["\u9C2C", "\u9C2C"], /* CJK Ideograph */ + ["\u9C2D", "\u9C2D"], /* CJK Ideograph */ + ["\u9C2E", "\u9C2E"], /* CJK Ideograph */ + ["\u9C2F", "\u9C2F"], /* CJK Ideograph */ + ["\u9C30", "\u9C30"], /* CJK Ideograph */ + ["\u9C31", "\u9C31"], /* CJK Ideograph */ + ["\u9C32", "\u9C32"], /* CJK Ideograph */ + ["\u9C33", "\u9C33"], /* CJK Ideograph */ + ["\u9C34", "\u9C34"], /* CJK Ideograph */ + ["\u9C35", "\u9C35"], /* CJK Ideograph */ + ["\u9C36", "\u9C36"], /* CJK Ideograph */ + ["\u9C37", "\u9C37"], /* CJK Ideograph */ + ["\u9C38", "\u9C38"], /* CJK Ideograph */ + ["\u9C39", "\u9C39"], /* CJK Ideograph */ + ["\u9C3A", "\u9C3A"], /* CJK Ideograph */ + ["\u9C3B", "\u9C3B"], /* CJK Ideograph */ + ["\u9C3C", "\u9C3C"], /* CJK Ideograph */ + ["\u9C3D", "\u9C3D"], /* CJK Ideograph */ + ["\u9C3E", "\u9C3E"], /* CJK Ideograph */ + ["\u9C3F", "\u9C3F"], /* CJK Ideograph */ + ["\u9C40", "\u9C40"], /* CJK Ideograph */ + ["\u9C41", "\u9C41"], /* CJK Ideograph */ + ["\u9C42", "\u9C42"], /* CJK Ideograph */ + ["\u9C43", "\u9C43"], /* CJK Ideograph */ + ["\u9C44", "\u9C44"], /* CJK Ideograph */ + ["\u9C45", "\u9C45"], /* CJK Ideograph */ + ["\u9C46", "\u9C46"], /* CJK Ideograph */ + ["\u9C47", "\u9C47"], /* CJK Ideograph */ + ["\u9C48", "\u9C48"], /* CJK Ideograph */ + ["\u9C49", "\u9C49"], /* CJK Ideograph */ + ["\u9C4A", "\u9C4A"], /* CJK Ideograph */ + ["\u9C4B", "\u9C4B"], /* CJK Ideograph */ + ["\u9C4C", "\u9C4C"], /* CJK Ideograph */ + ["\u9C4D", "\u9C4D"], /* CJK Ideograph */ + ["\u9C4E", "\u9C4E"], /* CJK Ideograph */ + ["\u9C4F", "\u9C4F"], /* CJK Ideograph */ + ["\u9C50", "\u9C50"], /* CJK Ideograph */ + ["\u9C51", "\u9C51"], /* CJK Ideograph */ + ["\u9C52", "\u9C52"], /* CJK Ideograph */ + ["\u9C53", "\u9C53"], /* CJK Ideograph */ + ["\u9C54", "\u9C54"], /* CJK Ideograph */ + ["\u9C55", "\u9C55"], /* CJK Ideograph */ + ["\u9C56", "\u9C56"], /* CJK Ideograph */ + ["\u9C57", "\u9C57"], /* CJK Ideograph */ + ["\u9C58", "\u9C58"], /* CJK Ideograph */ + ["\u9C59", "\u9C59"], /* CJK Ideograph */ + ["\u9C5A", "\u9C5A"], /* CJK Ideograph */ + ["\u9C5B", "\u9C5B"], /* CJK Ideograph */ + ["\u9C5C", "\u9C5C"], /* CJK Ideograph */ + ["\u9C5D", "\u9C5D"], /* CJK Ideograph */ + ["\u9C5E", "\u9C5E"], /* CJK Ideograph */ + ["\u9C5F", "\u9C5F"], /* CJK Ideograph */ + ["\u9C60", "\u9C60"], /* CJK Ideograph */ + ["\u9C61", "\u9C61"], /* CJK Ideograph */ + ["\u9C62", "\u9C62"], /* CJK Ideograph */ + ["\u9C63", "\u9C63"], /* CJK Ideograph */ + ["\u9C64", "\u9C64"], /* CJK Ideograph */ + ["\u9C65", "\u9C65"], /* CJK Ideograph */ + ["\u9C66", "\u9C66"], /* CJK Ideograph */ + ["\u9C67", "\u9C67"], /* CJK Ideograph */ + ["\u9C68", "\u9C68"], /* CJK Ideograph */ + ["\u9C69", "\u9C69"], /* CJK Ideograph */ + ["\u9C6A", "\u9C6A"], /* CJK Ideograph */ + ["\u9C6B", "\u9C6B"], /* CJK Ideograph */ + ["\u9C6C", "\u9C6C"], /* CJK Ideograph */ + ["\u9C6D", "\u9C6D"], /* CJK Ideograph */ + ["\u9C6E", "\u9C6E"], /* CJK Ideograph */ + ["\u9C6F", "\u9C6F"], /* CJK Ideograph */ + ["\u9C70", "\u9C70"], /* CJK Ideograph */ + ["\u9C71", "\u9C71"], /* CJK Ideograph */ + ["\u9C72", "\u9C72"], /* CJK Ideograph */ + ["\u9C73", "\u9C73"], /* CJK Ideograph */ + ["\u9C74", "\u9C74"], /* CJK Ideograph */ + ["\u9C75", "\u9C75"], /* CJK Ideograph */ + ["\u9C76", "\u9C76"], /* CJK Ideograph */ + ["\u9C77", "\u9C77"], /* CJK Ideograph */ + ["\u9C78", "\u9C78"], /* CJK Ideograph */ + ["\u9C79", "\u9C79"], /* CJK Ideograph */ + ["\u9C7A", "\u9C7A"], /* CJK Ideograph */ + ["\u9C7B", "\u9C7B"], /* CJK Ideograph */ + ["\u9C7C", "\u9C7C"], /* CJK Ideograph */ + ["\u9C7D", "\u9C7D"], /* CJK Ideograph */ + ["\u9C7E", "\u9C7E"], /* CJK Ideograph */ + ["\u9C7F", "\u9C7F"], /* CJK Ideograph */ + ["\u9C80", "\u9C80"], /* CJK Ideograph */ + ["\u9C81", "\u9C81"], /* CJK Ideograph */ + ["\u9C82", "\u9C82"], /* CJK Ideograph */ + ["\u9C83", "\u9C83"], /* CJK Ideograph */ + ["\u9C84", "\u9C84"], /* CJK Ideograph */ + ["\u9C85", "\u9C85"], /* CJK Ideograph */ + ["\u9C86", "\u9C86"], /* CJK Ideograph */ + ["\u9C87", "\u9C87"], /* CJK Ideograph */ + ["\u9C88", "\u9C88"], /* CJK Ideograph */ + ["\u9C89", "\u9C89"], /* CJK Ideograph */ + ["\u9C8A", "\u9C8A"], /* CJK Ideograph */ + ["\u9C8B", "\u9C8B"], /* CJK Ideograph */ + ["\u9C8C", "\u9C8C"], /* CJK Ideograph */ + ["\u9C8D", "\u9C8D"], /* CJK Ideograph */ + ["\u9C8E", "\u9C8E"], /* CJK Ideograph */ + ["\u9C8F", "\u9C8F"], /* CJK Ideograph */ + ["\u9C90", "\u9C90"], /* CJK Ideograph */ + ["\u9C91", "\u9C91"], /* CJK Ideograph */ + ["\u9C92", "\u9C92"], /* CJK Ideograph */ + ["\u9C93", "\u9C93"], /* CJK Ideograph */ + ["\u9C94", "\u9C94"], /* CJK Ideograph */ + ["\u9C95", "\u9C95"], /* CJK Ideograph */ + ["\u9C96", "\u9C96"], /* CJK Ideograph */ + ["\u9C97", "\u9C97"], /* CJK Ideograph */ + ["\u9C98", "\u9C98"], /* CJK Ideograph */ + ["\u9C99", "\u9C99"], /* CJK Ideograph */ + ["\u9C9A", "\u9C9A"], /* CJK Ideograph */ + ["\u9C9B", "\u9C9B"], /* CJK Ideograph */ + ["\u9C9C", "\u9C9C"], /* CJK Ideograph */ + ["\u9C9D", "\u9C9D"], /* CJK Ideograph */ + ["\u9C9E", "\u9C9E"], /* CJK Ideograph */ + ["\u9C9F", "\u9C9F"], /* CJK Ideograph */ + ["\u9CA0", "\u9CA0"], /* CJK Ideograph */ + ["\u9CA1", "\u9CA1"], /* CJK Ideograph */ + ["\u9CA2", "\u9CA2"], /* CJK Ideograph */ + ["\u9CA3", "\u9CA3"], /* CJK Ideograph */ + ["\u9CA4", "\u9CA4"], /* CJK Ideograph */ + ["\u9CA5", "\u9CA5"], /* CJK Ideograph */ + ["\u9CA6", "\u9CA6"], /* CJK Ideograph */ + ["\u9CA7", "\u9CA7"], /* CJK Ideograph */ + ["\u9CA8", "\u9CA8"], /* CJK Ideograph */ + ["\u9CA9", "\u9CA9"], /* CJK Ideograph */ + ["\u9CAA", "\u9CAA"], /* CJK Ideograph */ + ["\u9CAB", "\u9CAB"], /* CJK Ideograph */ + ["\u9CAC", "\u9CAC"], /* CJK Ideograph */ + ["\u9CAD", "\u9CAD"], /* CJK Ideograph */ + ["\u9CAE", "\u9CAE"], /* CJK Ideograph */ + ["\u9CAF", "\u9CAF"], /* CJK Ideograph */ + ["\u9CB0", "\u9CB0"], /* CJK Ideograph */ + ["\u9CB1", "\u9CB1"], /* CJK Ideograph */ + ["\u9CB2", "\u9CB2"], /* CJK Ideograph */ + ["\u9CB3", "\u9CB3"], /* CJK Ideograph */ + ["\u9CB4", "\u9CB4"], /* CJK Ideograph */ + ["\u9CB5", "\u9CB5"], /* CJK Ideograph */ + ["\u9CB6", "\u9CB6"], /* CJK Ideograph */ + ["\u9CB7", "\u9CB7"], /* CJK Ideograph */ + ["\u9CB8", "\u9CB8"], /* CJK Ideograph */ + ["\u9CB9", "\u9CB9"], /* CJK Ideograph */ + ["\u9CBA", "\u9CBA"], /* CJK Ideograph */ + ["\u9CBB", "\u9CBB"], /* CJK Ideograph */ + ["\u9CBC", "\u9CBC"], /* CJK Ideograph */ + ["\u9CBD", "\u9CBD"], /* CJK Ideograph */ + ["\u9CBE", "\u9CBE"], /* CJK Ideograph */ + ["\u9CBF", "\u9CBF"], /* CJK Ideograph */ + ["\u9CC0", "\u9CC0"], /* CJK Ideograph */ + ["\u9CC1", "\u9CC1"], /* CJK Ideograph */ + ["\u9CC2", "\u9CC2"], /* CJK Ideograph */ + ["\u9CC3", "\u9CC3"], /* CJK Ideograph */ + ["\u9CC4", "\u9CC4"], /* CJK Ideograph */ + ["\u9CC5", "\u9CC5"], /* CJK Ideograph */ + ["\u9CC6", "\u9CC6"], /* CJK Ideograph */ + ["\u9CC7", "\u9CC7"], /* CJK Ideograph */ + ["\u9CC8", "\u9CC8"], /* CJK Ideograph */ + ["\u9CC9", "\u9CC9"], /* CJK Ideograph */ + ["\u9CCA", "\u9CCA"], /* CJK Ideograph */ + ["\u9CCB", "\u9CCB"], /* CJK Ideograph */ + ["\u9CCC", "\u9CCC"], /* CJK Ideograph */ + ["\u9CCD", "\u9CCD"], /* CJK Ideograph */ + ["\u9CCE", "\u9CCE"], /* CJK Ideograph */ + ["\u9CCF", "\u9CCF"], /* CJK Ideograph */ + ["\u9CD0", "\u9CD0"], /* CJK Ideograph */ + ["\u9CD1", "\u9CD1"], /* CJK Ideograph */ + ["\u9CD2", "\u9CD2"], /* CJK Ideograph */ + ["\u9CD3", "\u9CD3"], /* CJK Ideograph */ + ["\u9CD4", "\u9CD4"], /* CJK Ideograph */ + ["\u9CD5", "\u9CD5"], /* CJK Ideograph */ + ["\u9CD6", "\u9CD6"], /* CJK Ideograph */ + ["\u9CD7", "\u9CD7"], /* CJK Ideograph */ + ["\u9CD8", "\u9CD8"], /* CJK Ideograph */ + ["\u9CD9", "\u9CD9"], /* CJK Ideograph */ + ["\u9CDA", "\u9CDA"], /* CJK Ideograph */ + ["\u9CDB", "\u9CDB"], /* CJK Ideograph */ + ["\u9CDC", "\u9CDC"], /* CJK Ideograph */ + ["\u9CDD", "\u9CDD"], /* CJK Ideograph */ + ["\u9CDE", "\u9CDE"], /* CJK Ideograph */ + ["\u9CDF", "\u9CDF"], /* CJK Ideograph */ + ["\u9CE0", "\u9CE0"], /* CJK Ideograph */ + ["\u9CE1", "\u9CE1"], /* CJK Ideograph */ + ["\u9CE2", "\u9CE2"], /* CJK Ideograph */ + ["\u9CE3", "\u9CE3"], /* CJK Ideograph */ + ["\u9CE4", "\u9CE4"], /* CJK Ideograph */ + ["\u9CE5", "\u9CE5"], /* CJK Ideograph */ + ["\u9CE6", "\u9CE6"], /* CJK Ideograph */ + ["\u9CE7", "\u9CE7"], /* CJK Ideograph */ + ["\u9CE8", "\u9CE8"], /* CJK Ideograph */ + ["\u9CE9", "\u9CE9"], /* CJK Ideograph */ + ["\u9CEA", "\u9CEA"], /* CJK Ideograph */ + ["\u9CEB", "\u9CEB"], /* CJK Ideograph */ + ["\u9CEC", "\u9CEC"], /* CJK Ideograph */ + ["\u9CED", "\u9CED"], /* CJK Ideograph */ + ["\u9CEE", "\u9CEE"], /* CJK Ideograph */ + ["\u9CEF", "\u9CEF"], /* CJK Ideograph */ + ["\u9CF0", "\u9CF0"], /* CJK Ideograph */ + ["\u9CF1", "\u9CF1"], /* CJK Ideograph */ + ["\u9CF2", "\u9CF2"], /* CJK Ideograph */ + ["\u9CF3", "\u9CF3"], /* CJK Ideograph */ + ["\u9CF4", "\u9CF4"], /* CJK Ideograph */ + ["\u9CF5", "\u9CF5"], /* CJK Ideograph */ + ["\u9CF6", "\u9CF6"], /* CJK Ideograph */ + ["\u9CF7", "\u9CF7"], /* CJK Ideograph */ + ["\u9CF8", "\u9CF8"], /* CJK Ideograph */ + ["\u9CF9", "\u9CF9"], /* CJK Ideograph */ + ["\u9CFA", "\u9CFA"], /* CJK Ideograph */ + ["\u9CFB", "\u9CFB"], /* CJK Ideograph */ + ["\u9CFC", "\u9CFC"], /* CJK Ideograph */ + ["\u9CFD", "\u9CFD"], /* CJK Ideograph */ + ["\u9CFE", "\u9CFE"], /* CJK Ideograph */ + ["\u9CFF", "\u9CFF"], /* CJK Ideograph */ + ["\u9D00", "\u9D00"], /* CJK Ideograph */ + ["\u9D01", "\u9D01"], /* CJK Ideograph */ + ["\u9D02", "\u9D02"], /* CJK Ideograph */ + ["\u9D03", "\u9D03"], /* CJK Ideograph */ + ["\u9D04", "\u9D04"], /* CJK Ideograph */ + ["\u9D05", "\u9D05"], /* CJK Ideograph */ + ["\u9D06", "\u9D06"], /* CJK Ideograph */ + ["\u9D07", "\u9D07"], /* CJK Ideograph */ + ["\u9D08", "\u9D08"], /* CJK Ideograph */ + ["\u9D09", "\u9D09"], /* CJK Ideograph */ + ["\u9D0A", "\u9D0A"], /* CJK Ideograph */ + ["\u9D0B", "\u9D0B"], /* CJK Ideograph */ + ["\u9D0C", "\u9D0C"], /* CJK Ideograph */ + ["\u9D0D", "\u9D0D"], /* CJK Ideograph */ + ["\u9D0E", "\u9D0E"], /* CJK Ideograph */ + ["\u9D0F", "\u9D0F"], /* CJK Ideograph */ + ["\u9D10", "\u9D10"], /* CJK Ideograph */ + ["\u9D11", "\u9D11"], /* CJK Ideograph */ + ["\u9D12", "\u9D12"], /* CJK Ideograph */ + ["\u9D13", "\u9D13"], /* CJK Ideograph */ + ["\u9D14", "\u9D14"], /* CJK Ideograph */ + ["\u9D15", "\u9D15"], /* CJK Ideograph */ + ["\u9D16", "\u9D16"], /* CJK Ideograph */ + ["\u9D17", "\u9D17"], /* CJK Ideograph */ + ["\u9D18", "\u9D18"], /* CJK Ideograph */ + ["\u9D19", "\u9D19"], /* CJK Ideograph */ + ["\u9D1A", "\u9D1A"], /* CJK Ideograph */ + ["\u9D1B", "\u9D1B"], /* CJK Ideograph */ + ["\u9D1C", "\u9D1C"], /* CJK Ideograph */ + ["\u9D1D", "\u9D1D"], /* CJK Ideograph */ + ["\u9D1E", "\u9D1E"], /* CJK Ideograph */ + ["\u9D1F", "\u9D1F"], /* CJK Ideograph */ + ["\u9D20", "\u9D20"], /* CJK Ideograph */ + ["\u9D21", "\u9D21"], /* CJK Ideograph */ + ["\u9D22", "\u9D22"], /* CJK Ideograph */ + ["\u9D23", "\u9D23"], /* CJK Ideograph */ + ["\u9D24", "\u9D24"], /* CJK Ideograph */ + ["\u9D25", "\u9D25"], /* CJK Ideograph */ + ["\u9D26", "\u9D26"], /* CJK Ideograph */ + ["\u9D27", "\u9D27"], /* CJK Ideograph */ + ["\u9D28", "\u9D28"], /* CJK Ideograph */ + ["\u9D29", "\u9D29"], /* CJK Ideograph */ + ["\u9D2A", "\u9D2A"], /* CJK Ideograph */ + ["\u9D2B", "\u9D2B"], /* CJK Ideograph */ + ["\u9D2C", "\u9D2C"], /* CJK Ideograph */ + ["\u9D2D", "\u9D2D"], /* CJK Ideograph */ + ["\u9D2E", "\u9D2E"], /* CJK Ideograph */ + ["\u9D2F", "\u9D2F"], /* CJK Ideograph */ + ["\u9D30", "\u9D30"], /* CJK Ideograph */ + ["\u9D31", "\u9D31"], /* CJK Ideograph */ + ["\u9D32", "\u9D32"], /* CJK Ideograph */ + ["\u9D33", "\u9D33"], /* CJK Ideograph */ + ["\u9D34", "\u9D34"], /* CJK Ideograph */ + ["\u9D35", "\u9D35"], /* CJK Ideograph */ + ["\u9D36", "\u9D36"], /* CJK Ideograph */ + ["\u9D37", "\u9D37"], /* CJK Ideograph */ + ["\u9D38", "\u9D38"], /* CJK Ideograph */ + ["\u9D39", "\u9D39"], /* CJK Ideograph */ + ["\u9D3A", "\u9D3A"], /* CJK Ideograph */ + ["\u9D3B", "\u9D3B"], /* CJK Ideograph */ + ["\u9D3C", "\u9D3C"], /* CJK Ideograph */ + ["\u9D3D", "\u9D3D"], /* CJK Ideograph */ + ["\u9D3E", "\u9D3E"], /* CJK Ideograph */ + ["\u9D3F", "\u9D3F"], /* CJK Ideograph */ + ["\u9D40", "\u9D40"], /* CJK Ideograph */ + ["\u9D41", "\u9D41"], /* CJK Ideograph */ + ["\u9D42", "\u9D42"], /* CJK Ideograph */ + ["\u9D43", "\u9D43"], /* CJK Ideograph */ + ["\u9D44", "\u9D44"], /* CJK Ideograph */ + ["\u9D45", "\u9D45"], /* CJK Ideograph */ + ["\u9D46", "\u9D46"], /* CJK Ideograph */ + ["\u9D47", "\u9D47"], /* CJK Ideograph */ + ["\u9D48", "\u9D48"], /* CJK Ideograph */ + ["\u9D49", "\u9D49"], /* CJK Ideograph */ + ["\u9D4A", "\u9D4A"], /* CJK Ideograph */ + ["\u9D4B", "\u9D4B"], /* CJK Ideograph */ + ["\u9D4C", "\u9D4C"], /* CJK Ideograph */ + ["\u9D4D", "\u9D4D"], /* CJK Ideograph */ + ["\u9D4E", "\u9D4E"], /* CJK Ideograph */ + ["\u9D4F", "\u9D4F"], /* CJK Ideograph */ + ["\u9D50", "\u9D50"], /* CJK Ideograph */ + ["\u9D51", "\u9D51"], /* CJK Ideograph */ + ["\u9D52", "\u9D52"], /* CJK Ideograph */ + ["\u9D53", "\u9D53"], /* CJK Ideograph */ + ["\u9D54", "\u9D54"], /* CJK Ideograph */ + ["\u9D55", "\u9D55"], /* CJK Ideograph */ + ["\u9D56", "\u9D56"], /* CJK Ideograph */ + ["\u9D57", "\u9D57"], /* CJK Ideograph */ + ["\u9D58", "\u9D58"], /* CJK Ideograph */ + ["\u9D59", "\u9D59"], /* CJK Ideograph */ + ["\u9D5A", "\u9D5A"], /* CJK Ideograph */ + ["\u9D5B", "\u9D5B"], /* CJK Ideograph */ + ["\u9D5C", "\u9D5C"], /* CJK Ideograph */ + ["\u9D5D", "\u9D5D"], /* CJK Ideograph */ + ["\u9D5E", "\u9D5E"], /* CJK Ideograph */ + ["\u9D5F", "\u9D5F"], /* CJK Ideograph */ + ["\u9D60", "\u9D60"], /* CJK Ideograph */ + ["\u9D61", "\u9D61"], /* CJK Ideograph */ + ["\u9D62", "\u9D62"], /* CJK Ideograph */ + ["\u9D63", "\u9D63"], /* CJK Ideograph */ + ["\u9D64", "\u9D64"], /* CJK Ideograph */ + ["\u9D65", "\u9D65"], /* CJK Ideograph */ + ["\u9D66", "\u9D66"], /* CJK Ideograph */ + ["\u9D67", "\u9D67"], /* CJK Ideograph */ + ["\u9D68", "\u9D68"], /* CJK Ideograph */ + ["\u9D69", "\u9D69"], /* CJK Ideograph */ + ["\u9D6A", "\u9D6A"], /* CJK Ideograph */ + ["\u9D6B", "\u9D6B"], /* CJK Ideograph */ + ["\u9D6C", "\u9D6C"], /* CJK Ideograph */ + ["\u9D6D", "\u9D6D"], /* CJK Ideograph */ + ["\u9D6E", "\u9D6E"], /* CJK Ideograph */ + ["\u9D6F", "\u9D6F"], /* CJK Ideograph */ + ["\u9D70", "\u9D70"], /* CJK Ideograph */ + ["\u9D71", "\u9D71"], /* CJK Ideograph */ + ["\u9D72", "\u9D72"], /* CJK Ideograph */ + ["\u9D73", "\u9D73"], /* CJK Ideograph */ + ["\u9D74", "\u9D74"], /* CJK Ideograph */ + ["\u9D75", "\u9D75"], /* CJK Ideograph */ + ["\u9D76", "\u9D76"], /* CJK Ideograph */ + ["\u9D77", "\u9D77"], /* CJK Ideograph */ + ["\u9D78", "\u9D78"], /* CJK Ideograph */ + ["\u9D79", "\u9D79"], /* CJK Ideograph */ + ["\u9D7A", "\u9D7A"], /* CJK Ideograph */ + ["\u9D7B", "\u9D7B"], /* CJK Ideograph */ + ["\u9D7C", "\u9D7C"], /* CJK Ideograph */ + ["\u9D7D", "\u9D7D"], /* CJK Ideograph */ + ["\u9D7E", "\u9D7E"], /* CJK Ideograph */ + ["\u9D7F", "\u9D7F"], /* CJK Ideograph */ + ["\u9D80", "\u9D80"], /* CJK Ideograph */ + ["\u9D81", "\u9D81"], /* CJK Ideograph */ + ["\u9D82", "\u9D82"], /* CJK Ideograph */ + ["\u9D83", "\u9D83"], /* CJK Ideograph */ + ["\u9D84", "\u9D84"], /* CJK Ideograph */ + ["\u9D85", "\u9D85"], /* CJK Ideograph */ + ["\u9D86", "\u9D86"], /* CJK Ideograph */ + ["\u9D87", "\u9D87"], /* CJK Ideograph */ + ["\u9D88", "\u9D88"], /* CJK Ideograph */ + ["\u9D89", "\u9D89"], /* CJK Ideograph */ + ["\u9D8A", "\u9D8A"], /* CJK Ideograph */ + ["\u9D8B", "\u9D8B"], /* CJK Ideograph */ + ["\u9D8C", "\u9D8C"], /* CJK Ideograph */ + ["\u9D8D", "\u9D8D"], /* CJK Ideograph */ + ["\u9D8E", "\u9D8E"], /* CJK Ideograph */ + ["\u9D8F", "\u9D8F"], /* CJK Ideograph */ + ["\u9D90", "\u9D90"], /* CJK Ideograph */ + ["\u9D91", "\u9D91"], /* CJK Ideograph */ + ["\u9D92", "\u9D92"], /* CJK Ideograph */ + ["\u9D93", "\u9D93"], /* CJK Ideograph */ + ["\u9D94", "\u9D94"], /* CJK Ideograph */ + ["\u9D95", "\u9D95"], /* CJK Ideograph */ + ["\u9D96", "\u9D96"], /* CJK Ideograph */ + ["\u9D97", "\u9D97"], /* CJK Ideograph */ + ["\u9D98", "\u9D98"], /* CJK Ideograph */ + ["\u9D99", "\u9D99"], /* CJK Ideograph */ + ["\u9D9A", "\u9D9A"], /* CJK Ideograph */ + ["\u9D9B", "\u9D9B"], /* CJK Ideograph */ + ["\u9D9C", "\u9D9C"], /* CJK Ideograph */ + ["\u9D9D", "\u9D9D"], /* CJK Ideograph */ + ["\u9D9E", "\u9D9E"], /* CJK Ideograph */ + ["\u9D9F", "\u9D9F"], /* CJK Ideograph */ + ["\u9DA0", "\u9DA0"], /* CJK Ideograph */ + ["\u9DA1", "\u9DA1"], /* CJK Ideograph */ + ["\u9DA2", "\u9DA2"], /* CJK Ideograph */ + ["\u9DA3", "\u9DA3"], /* CJK Ideograph */ + ["\u9DA4", "\u9DA4"], /* CJK Ideograph */ + ["\u9DA5", "\u9DA5"], /* CJK Ideograph */ + ["\u9DA6", "\u9DA6"], /* CJK Ideograph */ + ["\u9DA7", "\u9DA7"], /* CJK Ideograph */ + ["\u9DA8", "\u9DA8"], /* CJK Ideograph */ + ["\u9DA9", "\u9DA9"], /* CJK Ideograph */ + ["\u9DAA", "\u9DAA"], /* CJK Ideograph */ + ["\u9DAB", "\u9DAB"], /* CJK Ideograph */ + ["\u9DAC", "\u9DAC"], /* CJK Ideograph */ + ["\u9DAD", "\u9DAD"], /* CJK Ideograph */ + ["\u9DAE", "\u9DAE"], /* CJK Ideograph */ + ["\u9DAF", "\u9DAF"], /* CJK Ideograph */ + ["\u9DB0", "\u9DB0"], /* CJK Ideograph */ + ["\u9DB1", "\u9DB1"], /* CJK Ideograph */ + ["\u9DB2", "\u9DB2"], /* CJK Ideograph */ + ["\u9DB3", "\u9DB3"], /* CJK Ideograph */ + ["\u9DB4", "\u9DB4"], /* CJK Ideograph */ + ["\u9DB5", "\u9DB5"], /* CJK Ideograph */ + ["\u9DB6", "\u9DB6"], /* CJK Ideograph */ + ["\u9DB7", "\u9DB7"], /* CJK Ideograph */ + ["\u9DB8", "\u9DB8"], /* CJK Ideograph */ + ["\u9DB9", "\u9DB9"], /* CJK Ideograph */ + ["\u9DBA", "\u9DBA"], /* CJK Ideograph */ + ["\u9DBB", "\u9DBB"], /* CJK Ideograph */ + ["\u9DBC", "\u9DBC"], /* CJK Ideograph */ + ["\u9DBD", "\u9DBD"], /* CJK Ideograph */ + ["\u9DBE", "\u9DBE"], /* CJK Ideograph */ + ["\u9DBF", "\u9DBF"], /* CJK Ideograph */ + ["\u9DC0", "\u9DC0"], /* CJK Ideograph */ + ["\u9DC1", "\u9DC1"], /* CJK Ideograph */ + ["\u9DC2", "\u9DC2"], /* CJK Ideograph */ + ["\u9DC3", "\u9DC3"], /* CJK Ideograph */ + ["\u9DC4", "\u9DC4"], /* CJK Ideograph */ + ["\u9DC5", "\u9DC5"], /* CJK Ideograph */ + ["\u9DC6", "\u9DC6"], /* CJK Ideograph */ + ["\u9DC7", "\u9DC7"], /* CJK Ideograph */ + ["\u9DC8", "\u9DC8"], /* CJK Ideograph */ + ["\u9DC9", "\u9DC9"], /* CJK Ideograph */ + ["\u9DCA", "\u9DCA"], /* CJK Ideograph */ + ["\u9DCB", "\u9DCB"], /* CJK Ideograph */ + ["\u9DCC", "\u9DCC"], /* CJK Ideograph */ + ["\u9DCD", "\u9DCD"], /* CJK Ideograph */ + ["\u9DCE", "\u9DCE"], /* CJK Ideograph */ + ["\u9DCF", "\u9DCF"], /* CJK Ideograph */ + ["\u9DD0", "\u9DD0"], /* CJK Ideograph */ + ["\u9DD1", "\u9DD1"], /* CJK Ideograph */ + ["\u9DD2", "\u9DD2"], /* CJK Ideograph */ + ["\u9DD3", "\u9DD3"], /* CJK Ideograph */ + ["\u9DD4", "\u9DD4"], /* CJK Ideograph */ + ["\u9DD5", "\u9DD5"], /* CJK Ideograph */ + ["\u9DD6", "\u9DD6"], /* CJK Ideograph */ + ["\u9DD7", "\u9DD7"], /* CJK Ideograph */ + ["\u9DD8", "\u9DD8"], /* CJK Ideograph */ + ["\u9DD9", "\u9DD9"], /* CJK Ideograph */ + ["\u9DDA", "\u9DDA"], /* CJK Ideograph */ + ["\u9DDB", "\u9DDB"], /* CJK Ideograph */ + ["\u9DDC", "\u9DDC"], /* CJK Ideograph */ + ["\u9DDD", "\u9DDD"], /* CJK Ideograph */ + ["\u9DDE", "\u9DDE"], /* CJK Ideograph */ + ["\u9DDF", "\u9DDF"], /* CJK Ideograph */ + ["\u9DE0", "\u9DE0"], /* CJK Ideograph */ + ["\u9DE1", "\u9DE1"], /* CJK Ideograph */ + ["\u9DE2", "\u9DE2"], /* CJK Ideograph */ + ["\u9DE3", "\u9DE3"], /* CJK Ideograph */ + ["\u9DE4", "\u9DE4"], /* CJK Ideograph */ + ["\u9DE5", "\u9DE5"], /* CJK Ideograph */ + ["\u9DE6", "\u9DE6"], /* CJK Ideograph */ + ["\u9DE7", "\u9DE7"], /* CJK Ideograph */ + ["\u9DE8", "\u9DE8"], /* CJK Ideograph */ + ["\u9DE9", "\u9DE9"], /* CJK Ideograph */ + ["\u9DEA", "\u9DEA"], /* CJK Ideograph */ + ["\u9DEB", "\u9DEB"], /* CJK Ideograph */ + ["\u9DEC", "\u9DEC"], /* CJK Ideograph */ + ["\u9DED", "\u9DED"], /* CJK Ideograph */ + ["\u9DEE", "\u9DEE"], /* CJK Ideograph */ + ["\u9DEF", "\u9DEF"], /* CJK Ideograph */ + ["\u9DF0", "\u9DF0"], /* CJK Ideograph */ + ["\u9DF1", "\u9DF1"], /* CJK Ideograph */ + ["\u9DF2", "\u9DF2"], /* CJK Ideograph */ + ["\u9DF3", "\u9DF3"], /* CJK Ideograph */ + ["\u9DF4", "\u9DF4"], /* CJK Ideograph */ + ["\u9DF5", "\u9DF5"], /* CJK Ideograph */ + ["\u9DF6", "\u9DF6"], /* CJK Ideograph */ + ["\u9DF7", "\u9DF7"], /* CJK Ideograph */ + ["\u9DF8", "\u9DF8"], /* CJK Ideograph */ + ["\u9DF9", "\u9DF9"], /* CJK Ideograph */ + ["\u9DFA", "\u9DFA"], /* CJK Ideograph */ + ["\u9DFB", "\u9DFB"], /* CJK Ideograph */ + ["\u9DFC", "\u9DFC"], /* CJK Ideograph */ + ["\u9DFD", "\u9DFD"], /* CJK Ideograph */ + ["\u9DFE", "\u9DFE"], /* CJK Ideograph */ + ["\u9DFF", "\u9DFF"], /* CJK Ideograph */ + ["\u9E00", "\u9E00"], /* CJK Ideograph */ + ["\u9E01", "\u9E01"], /* CJK Ideograph */ + ["\u9E02", "\u9E02"], /* CJK Ideograph */ + ["\u9E03", "\u9E03"], /* CJK Ideograph */ + ["\u9E04", "\u9E04"], /* CJK Ideograph */ + ["\u9E05", "\u9E05"], /* CJK Ideograph */ + ["\u9E06", "\u9E06"], /* CJK Ideograph */ + ["\u9E07", "\u9E07"], /* CJK Ideograph */ + ["\u9E08", "\u9E08"], /* CJK Ideograph */ + ["\u9E09", "\u9E09"], /* CJK Ideograph */ + ["\u9E0A", "\u9E0A"], /* CJK Ideograph */ + ["\u9E0B", "\u9E0B"], /* CJK Ideograph */ + ["\u9E0C", "\u9E0C"], /* CJK Ideograph */ + ["\u9E0D", "\u9E0D"], /* CJK Ideograph */ + ["\u9E0E", "\u9E0E"], /* CJK Ideograph */ + ["\u9E0F", "\u9E0F"], /* CJK Ideograph */ + ["\u9E10", "\u9E10"], /* CJK Ideograph */ + ["\u9E11", "\u9E11"], /* CJK Ideograph */ + ["\u9E12", "\u9E12"], /* CJK Ideograph */ + ["\u9E13", "\u9E13"], /* CJK Ideograph */ + ["\u9E14", "\u9E14"], /* CJK Ideograph */ + ["\u9E15", "\u9E15"], /* CJK Ideograph */ + ["\u9E16", "\u9E16"], /* CJK Ideograph */ + ["\u9E17", "\u9E17"], /* CJK Ideograph */ + ["\u9E18", "\u9E18"], /* CJK Ideograph */ + ["\u9E19", "\u9E19"], /* CJK Ideograph */ + ["\u9E1A", "\u9E1A"], /* CJK Ideograph */ + ["\u9E1B", "\u9E1B"], /* CJK Ideograph */ + ["\u9E1C", "\u9E1C"], /* CJK Ideograph */ + ["\u9E1D", "\u9E1D"], /* CJK Ideograph */ + ["\u9E1E", "\u9E1E"], /* CJK Ideograph */ + ["\u9E1F", "\u9E1F"], /* CJK Ideograph */ + ["\u9E20", "\u9E20"], /* CJK Ideograph */ + ["\u9E21", "\u9E21"], /* CJK Ideograph */ + ["\u9E22", "\u9E22"], /* CJK Ideograph */ + ["\u9E23", "\u9E23"], /* CJK Ideograph */ + ["\u9E24", "\u9E24"], /* CJK Ideograph */ + ["\u9E25", "\u9E25"], /* CJK Ideograph */ + ["\u9E26", "\u9E26"], /* CJK Ideograph */ + ["\u9E27", "\u9E27"], /* CJK Ideograph */ + ["\u9E28", "\u9E28"], /* CJK Ideograph */ + ["\u9E29", "\u9E29"], /* CJK Ideograph */ + ["\u9E2A", "\u9E2A"], /* CJK Ideograph */ + ["\u9E2B", "\u9E2B"], /* CJK Ideograph */ + ["\u9E2C", "\u9E2C"], /* CJK Ideograph */ + ["\u9E2D", "\u9E2D"], /* CJK Ideograph */ + ["\u9E2E", "\u9E2E"], /* CJK Ideograph */ + ["\u9E2F", "\u9E2F"], /* CJK Ideograph */ + ["\u9E30", "\u9E30"], /* CJK Ideograph */ + ["\u9E31", "\u9E31"], /* CJK Ideograph */ + ["\u9E32", "\u9E32"], /* CJK Ideograph */ + ["\u9E33", "\u9E33"], /* CJK Ideograph */ + ["\u9E34", "\u9E34"], /* CJK Ideograph */ + ["\u9E35", "\u9E35"], /* CJK Ideograph */ + ["\u9E36", "\u9E36"], /* CJK Ideograph */ + ["\u9E37", "\u9E37"], /* CJK Ideograph */ + ["\u9E38", "\u9E38"], /* CJK Ideograph */ + ["\u9E39", "\u9E39"], /* CJK Ideograph */ + ["\u9E3A", "\u9E3A"], /* CJK Ideograph */ + ["\u9E3B", "\u9E3B"], /* CJK Ideograph */ + ["\u9E3C", "\u9E3C"], /* CJK Ideograph */ + ["\u9E3D", "\u9E3D"], /* CJK Ideograph */ + ["\u9E3E", "\u9E3E"], /* CJK Ideograph */ + ["\u9E3F", "\u9E3F"], /* CJK Ideograph */ + ["\u9E40", "\u9E40"], /* CJK Ideograph */ + ["\u9E41", "\u9E41"], /* CJK Ideograph */ + ["\u9E42", "\u9E42"], /* CJK Ideograph */ + ["\u9E43", "\u9E43"], /* CJK Ideograph */ + ["\u9E44", "\u9E44"], /* CJK Ideograph */ + ["\u9E45", "\u9E45"], /* CJK Ideograph */ + ["\u9E46", "\u9E46"], /* CJK Ideograph */ + ["\u9E47", "\u9E47"], /* CJK Ideograph */ + ["\u9E48", "\u9E48"], /* CJK Ideograph */ + ["\u9E49", "\u9E49"], /* CJK Ideograph */ + ["\u9E4A", "\u9E4A"], /* CJK Ideograph */ + ["\u9E4B", "\u9E4B"], /* CJK Ideograph */ + ["\u9E4C", "\u9E4C"], /* CJK Ideograph */ + ["\u9E4D", "\u9E4D"], /* CJK Ideograph */ + ["\u9E4E", "\u9E4E"], /* CJK Ideograph */ + ["\u9E4F", "\u9E4F"], /* CJK Ideograph */ + ["\u9E50", "\u9E50"], /* CJK Ideograph */ + ["\u9E51", "\u9E51"], /* CJK Ideograph */ + ["\u9E52", "\u9E52"], /* CJK Ideograph */ + ["\u9E53", "\u9E53"], /* CJK Ideograph */ + ["\u9E54", "\u9E54"], /* CJK Ideograph */ + ["\u9E55", "\u9E55"], /* CJK Ideograph */ + ["\u9E56", "\u9E56"], /* CJK Ideograph */ + ["\u9E57", "\u9E57"], /* CJK Ideograph */ + ["\u9E58", "\u9E58"], /* CJK Ideograph */ + ["\u9E59", "\u9E59"], /* CJK Ideograph */ + ["\u9E5A", "\u9E5A"], /* CJK Ideograph */ + ["\u9E5B", "\u9E5B"], /* CJK Ideograph */ + ["\u9E5C", "\u9E5C"], /* CJK Ideograph */ + ["\u9E5D", "\u9E5D"], /* CJK Ideograph */ + ["\u9E5E", "\u9E5E"], /* CJK Ideograph */ + ["\u9E5F", "\u9E5F"], /* CJK Ideograph */ + ["\u9E60", "\u9E60"], /* CJK Ideograph */ + ["\u9E61", "\u9E61"], /* CJK Ideograph */ + ["\u9E62", "\u9E62"], /* CJK Ideograph */ + ["\u9E63", "\u9E63"], /* CJK Ideograph */ + ["\u9E64", "\u9E64"], /* CJK Ideograph */ + ["\u9E65", "\u9E65"], /* CJK Ideograph */ + ["\u9E66", "\u9E66"], /* CJK Ideograph */ + ["\u9E67", "\u9E67"], /* CJK Ideograph */ + ["\u9E68", "\u9E68"], /* CJK Ideograph */ + ["\u9E69", "\u9E69"], /* CJK Ideograph */ + ["\u9E6A", "\u9E6A"], /* CJK Ideograph */ + ["\u9E6B", "\u9E6B"], /* CJK Ideograph */ + ["\u9E6C", "\u9E6C"], /* CJK Ideograph */ + ["\u9E6D", "\u9E6D"], /* CJK Ideograph */ + ["\u9E6E", "\u9E6E"], /* CJK Ideograph */ + ["\u9E6F", "\u9E6F"], /* CJK Ideograph */ + ["\u9E70", "\u9E70"], /* CJK Ideograph */ + ["\u9E71", "\u9E71"], /* CJK Ideograph */ + ["\u9E72", "\u9E72"], /* CJK Ideograph */ + ["\u9E73", "\u9E73"], /* CJK Ideograph */ + ["\u9E74", "\u9E74"], /* CJK Ideograph */ + ["\u9E75", "\u9E75"], /* CJK Ideograph */ + ["\u9E76", "\u9E76"], /* CJK Ideograph */ + ["\u9E77", "\u9E77"], /* CJK Ideograph */ + ["\u9E78", "\u9E78"], /* CJK Ideograph */ + ["\u9E79", "\u9E79"], /* CJK Ideograph */ + ["\u9E7A", "\u9E7A"], /* CJK Ideograph */ + ["\u9E7B", "\u9E7B"], /* CJK Ideograph */ + ["\u9E7C", "\u9E7C"], /* CJK Ideograph */ + ["\u9E7D", "\u9E7D"], /* CJK Ideograph */ + ["\u9E7E", "\u9E7E"], /* CJK Ideograph */ + ["\u9E7F", "\u9E7F"], /* CJK Ideograph */ + ["\u9E80", "\u9E80"], /* CJK Ideograph */ + ["\u9E81", "\u9E81"], /* CJK Ideograph */ + ["\u9E82", "\u9E82"], /* CJK Ideograph */ + ["\u9E83", "\u9E83"], /* CJK Ideograph */ + ["\u9E84", "\u9E84"], /* CJK Ideograph */ + ["\u9E85", "\u9E85"], /* CJK Ideograph */ + ["\u9E86", "\u9E86"], /* CJK Ideograph */ + ["\u9E87", "\u9E87"], /* CJK Ideograph */ + ["\u9E88", "\u9E88"], /* CJK Ideograph */ + ["\u9E89", "\u9E89"], /* CJK Ideograph */ + ["\u9E8A", "\u9E8A"], /* CJK Ideograph */ + ["\u9E8B", "\u9E8B"], /* CJK Ideograph */ + ["\u9E8C", "\u9E8C"], /* CJK Ideograph */ + ["\u9E8D", "\u9E8D"], /* CJK Ideograph */ + ["\u9E8E", "\u9E8E"], /* CJK Ideograph */ + ["\u9E8F", "\u9E8F"], /* CJK Ideograph */ + ["\u9E90", "\u9E90"], /* CJK Ideograph */ + ["\u9E91", "\u9E91"], /* CJK Ideograph */ + ["\u9E92", "\u9E92"], /* CJK Ideograph */ + ["\u9E93", "\u9E93"], /* CJK Ideograph */ + ["\u9E94", "\u9E94"], /* CJK Ideograph */ + ["\u9E95", "\u9E95"], /* CJK Ideograph */ + ["\u9E96", "\u9E96"], /* CJK Ideograph */ + ["\u9E97", "\u9E97"], /* CJK Ideograph */ + ["\u9E98", "\u9E98"], /* CJK Ideograph */ + ["\u9E99", "\u9E99"], /* CJK Ideograph */ + ["\u9E9A", "\u9E9A"], /* CJK Ideograph */ + ["\u9E9B", "\u9E9B"], /* CJK Ideograph */ + ["\u9E9C", "\u9E9C"], /* CJK Ideograph */ + ["\u9E9D", "\u9E9D"], /* CJK Ideograph */ + ["\u9E9E", "\u9E9E"], /* CJK Ideograph */ + ["\u9E9F", "\u9E9F"], /* CJK Ideograph */ + ["\u9EA0", "\u9EA0"], /* CJK Ideograph */ + ["\u9EA1", "\u9EA1"], /* CJK Ideograph */ + ["\u9EA2", "\u9EA2"], /* CJK Ideograph */ + ["\u9EA3", "\u9EA3"], /* CJK Ideograph */ + ["\u9EA4", "\u9EA4"], /* CJK Ideograph */ + ["\u9EA5", "\u9EA5"], /* CJK Ideograph */ + ["\u9EA6", "\u9EA6"], /* CJK Ideograph */ + ["\u9EA7", "\u9EA7"], /* CJK Ideograph */ + ["\u9EA8", "\u9EA8"], /* CJK Ideograph */ + ["\u9EA9", "\u9EA9"], /* CJK Ideograph */ + ["\u9EAA", "\u9EAA"], /* CJK Ideograph */ + ["\u9EAB", "\u9EAB"], /* CJK Ideograph */ + ["\u9EAC", "\u9EAC"], /* CJK Ideograph */ + ["\u9EAD", "\u9EAD"], /* CJK Ideograph */ + ["\u9EAE", "\u9EAE"], /* CJK Ideograph */ + ["\u9EAF", "\u9EAF"], /* CJK Ideograph */ + ["\u9EB0", "\u9EB0"], /* CJK Ideograph */ + ["\u9EB1", "\u9EB1"], /* CJK Ideograph */ + ["\u9EB2", "\u9EB2"], /* CJK Ideograph */ + ["\u9EB3", "\u9EB3"], /* CJK Ideograph */ + ["\u9EB4", "\u9EB4"], /* CJK Ideograph */ + ["\u9EB5", "\u9EB5"], /* CJK Ideograph */ + ["\u9EB6", "\u9EB6"], /* CJK Ideograph */ + ["\u9EB7", "\u9EB7"], /* CJK Ideograph */ + ["\u9EB8", "\u9EB8"], /* CJK Ideograph */ + ["\u9EB9", "\u9EB9"], /* CJK Ideograph */ + ["\u9EBA", "\u9EBA"], /* CJK Ideograph */ + ["\u9EBB", "\u9EBB"], /* CJK Ideograph */ + ["\u9EBC", "\u9EBC"], /* CJK Ideograph */ + ["\u9EBD", "\u9EBD"], /* CJK Ideograph */ + ["\u9EBE", "\u9EBE"], /* CJK Ideograph */ + ["\u9EBF", "\u9EBF"], /* CJK Ideograph */ + ["\u9EC0", "\u9EC0"], /* CJK Ideograph */ + ["\u9EC1", "\u9EC1"], /* CJK Ideograph */ + ["\u9EC2", "\u9EC2"], /* CJK Ideograph */ + ["\u9EC3", "\u9EC3"], /* CJK Ideograph */ + ["\u9EC4", "\u9EC4"], /* CJK Ideograph */ + ["\u9EC5", "\u9EC5"], /* CJK Ideograph */ + ["\u9EC6", "\u9EC6"], /* CJK Ideograph */ + ["\u9EC7", "\u9EC7"], /* CJK Ideograph */ + ["\u9EC8", "\u9EC8"], /* CJK Ideograph */ + ["\u9EC9", "\u9EC9"], /* CJK Ideograph */ + ["\u9ECA", "\u9ECA"], /* CJK Ideograph */ + ["\u9ECB", "\u9ECB"], /* CJK Ideograph */ + ["\u9ECC", "\u9ECC"], /* CJK Ideograph */ + ["\u9ECD", "\u9ECD"], /* CJK Ideograph */ + ["\u9ECE", "\u9ECE"], /* CJK Ideograph */ + ["\u9ECF", "\u9ECF"], /* CJK Ideograph */ + ["\u9ED0", "\u9ED0"], /* CJK Ideograph */ + ["\u9ED1", "\u9ED1"], /* CJK Ideograph */ + ["\u9ED2", "\u9ED2"], /* CJK Ideograph */ + ["\u9ED3", "\u9ED3"], /* CJK Ideograph */ + ["\u9ED4", "\u9ED4"], /* CJK Ideograph */ + ["\u9ED5", "\u9ED5"], /* CJK Ideograph */ + ["\u9ED6", "\u9ED6"], /* CJK Ideograph */ + ["\u9ED7", "\u9ED7"], /* CJK Ideograph */ + ["\u9ED8", "\u9ED8"], /* CJK Ideograph */ + ["\u9ED9", "\u9ED9"], /* CJK Ideograph */ + ["\u9EDA", "\u9EDA"], /* CJK Ideograph */ + ["\u9EDB", "\u9EDB"], /* CJK Ideograph */ + ["\u9EDC", "\u9EDC"], /* CJK Ideograph */ + ["\u9EDD", "\u9EDD"], /* CJK Ideograph */ + ["\u9EDE", "\u9EDE"], /* CJK Ideograph */ + ["\u9EDF", "\u9EDF"], /* CJK Ideograph */ + ["\u9EE0", "\u9EE0"], /* CJK Ideograph */ + ["\u9EE1", "\u9EE1"], /* CJK Ideograph */ + ["\u9EE2", "\u9EE2"], /* CJK Ideograph */ + ["\u9EE3", "\u9EE3"], /* CJK Ideograph */ + ["\u9EE4", "\u9EE4"], /* CJK Ideograph */ + ["\u9EE5", "\u9EE5"], /* CJK Ideograph */ + ["\u9EE6", "\u9EE6"], /* CJK Ideograph */ + ["\u9EE7", "\u9EE7"], /* CJK Ideograph */ + ["\u9EE8", "\u9EE8"], /* CJK Ideograph */ + ["\u9EE9", "\u9EE9"], /* CJK Ideograph */ + ["\u9EEA", "\u9EEA"], /* CJK Ideograph */ + ["\u9EEB", "\u9EEB"], /* CJK Ideograph */ + ["\u9EEC", "\u9EEC"], /* CJK Ideograph */ + ["\u9EED", "\u9EED"], /* CJK Ideograph */ + ["\u9EEE", "\u9EEE"], /* CJK Ideograph */ + ["\u9EEF", "\u9EEF"], /* CJK Ideograph */ + ["\u9EF0", "\u9EF0"], /* CJK Ideograph */ + ["\u9EF1", "\u9EF1"], /* CJK Ideograph */ + ["\u9EF2", "\u9EF2"], /* CJK Ideograph */ + ["\u9EF3", "\u9EF3"], /* CJK Ideograph */ + ["\u9EF4", "\u9EF4"], /* CJK Ideograph */ + ["\u9EF5", "\u9EF5"], /* CJK Ideograph */ + ["\u9EF6", "\u9EF6"], /* CJK Ideograph */ + ["\u9EF7", "\u9EF7"], /* CJK Ideograph */ + ["\u9EF8", "\u9EF8"], /* CJK Ideograph */ + ["\u9EF9", "\u9EF9"], /* CJK Ideograph */ + ["\u9EFA", "\u9EFA"], /* CJK Ideograph */ + ["\u9EFB", "\u9EFB"], /* CJK Ideograph */ + ["\u9EFC", "\u9EFC"], /* CJK Ideograph */ + ["\u9EFD", "\u9EFD"], /* CJK Ideograph */ + ["\u9EFE", "\u9EFE"], /* CJK Ideograph */ + ["\u9EFF", "\u9EFF"], /* CJK Ideograph */ + ["\u9F00", "\u9F00"], /* CJK Ideograph */ + ["\u9F01", "\u9F01"], /* CJK Ideograph */ + ["\u9F02", "\u9F02"], /* CJK Ideograph */ + ["\u9F03", "\u9F03"], /* CJK Ideograph */ + ["\u9F04", "\u9F04"], /* CJK Ideograph */ + ["\u9F05", "\u9F05"], /* CJK Ideograph */ + ["\u9F06", "\u9F06"], /* CJK Ideograph */ + ["\u9F07", "\u9F07"], /* CJK Ideograph */ + ["\u9F08", "\u9F08"], /* CJK Ideograph */ + ["\u9F09", "\u9F09"], /* CJK Ideograph */ + ["\u9F0A", "\u9F0A"], /* CJK Ideograph */ + ["\u9F0B", "\u9F0B"], /* CJK Ideograph */ + ["\u9F0C", "\u9F0C"], /* CJK Ideograph */ + ["\u9F0D", "\u9F0D"], /* CJK Ideograph */ + ["\u9F0E", "\u9F0E"], /* CJK Ideograph */ + ["\u9F0F", "\u9F0F"], /* CJK Ideograph */ + ["\u9F10", "\u9F10"], /* CJK Ideograph */ + ["\u9F11", "\u9F11"], /* CJK Ideograph */ + ["\u9F12", "\u9F12"], /* CJK Ideograph */ + ["\u9F13", "\u9F13"], /* CJK Ideograph */ + ["\u9F14", "\u9F14"], /* CJK Ideograph */ + ["\u9F15", "\u9F15"], /* CJK Ideograph */ + ["\u9F16", "\u9F16"], /* CJK Ideograph */ + ["\u9F17", "\u9F17"], /* CJK Ideograph */ + ["\u9F18", "\u9F18"], /* CJK Ideograph */ + ["\u9F19", "\u9F19"], /* CJK Ideograph */ + ["\u9F1A", "\u9F1A"], /* CJK Ideograph */ + ["\u9F1B", "\u9F1B"], /* CJK Ideograph */ + ["\u9F1C", "\u9F1C"], /* CJK Ideograph */ + ["\u9F1D", "\u9F1D"], /* CJK Ideograph */ + ["\u9F1E", "\u9F1E"], /* CJK Ideograph */ + ["\u9F1F", "\u9F1F"], /* CJK Ideograph */ + ["\u9F20", "\u9F20"], /* CJK Ideograph */ + ["\u9F21", "\u9F21"], /* CJK Ideograph */ + ["\u9F22", "\u9F22"], /* CJK Ideograph */ + ["\u9F23", "\u9F23"], /* CJK Ideograph */ + ["\u9F24", "\u9F24"], /* CJK Ideograph */ + ["\u9F25", "\u9F25"], /* CJK Ideograph */ + ["\u9F26", "\u9F26"], /* CJK Ideograph */ + ["\u9F27", "\u9F27"], /* CJK Ideograph */ + ["\u9F28", "\u9F28"], /* CJK Ideograph */ + ["\u9F29", "\u9F29"], /* CJK Ideograph */ + ["\u9F2A", "\u9F2A"], /* CJK Ideograph */ + ["\u9F2B", "\u9F2B"], /* CJK Ideograph */ + ["\u9F2C", "\u9F2C"], /* CJK Ideograph */ + ["\u9F2D", "\u9F2D"], /* CJK Ideograph */ + ["\u9F2E", "\u9F2E"], /* CJK Ideograph */ + ["\u9F2F", "\u9F2F"], /* CJK Ideograph */ + ["\u9F30", "\u9F30"], /* CJK Ideograph */ + ["\u9F31", "\u9F31"], /* CJK Ideograph */ + ["\u9F32", "\u9F32"], /* CJK Ideograph */ + ["\u9F33", "\u9F33"], /* CJK Ideograph */ + ["\u9F34", "\u9F34"], /* CJK Ideograph */ + ["\u9F35", "\u9F35"], /* CJK Ideograph */ + ["\u9F36", "\u9F36"], /* CJK Ideograph */ + ["\u9F37", "\u9F37"], /* CJK Ideograph */ + ["\u9F38", "\u9F38"], /* CJK Ideograph */ + ["\u9F39", "\u9F39"], /* CJK Ideograph */ + ["\u9F3A", "\u9F3A"], /* CJK Ideograph */ + ["\u9F3B", "\u9F3B"], /* CJK Ideograph */ + ["\u9F3C", "\u9F3C"], /* CJK Ideograph */ + ["\u9F3D", "\u9F3D"], /* CJK Ideograph */ + ["\u9F3E", "\u9F3E"], /* CJK Ideograph */ + ["\u9F3F", "\u9F3F"], /* CJK Ideograph */ + ["\u9F40", "\u9F40"], /* CJK Ideograph */ + ["\u9F41", "\u9F41"], /* CJK Ideograph */ + ["\u9F42", "\u9F42"], /* CJK Ideograph */ + ["\u9F43", "\u9F43"], /* CJK Ideograph */ + ["\u9F44", "\u9F44"], /* CJK Ideograph */ + ["\u9F45", "\u9F45"], /* CJK Ideograph */ + ["\u9F46", "\u9F46"], /* CJK Ideograph */ + ["\u9F47", "\u9F47"], /* CJK Ideograph */ + ["\u9F48", "\u9F48"], /* CJK Ideograph */ + ["\u9F49", "\u9F49"], /* CJK Ideograph */ + ["\u9F4A", "\u9F4A"], /* CJK Ideograph */ + ["\u9F4B", "\u9F4B"], /* CJK Ideograph */ + ["\u9F4C", "\u9F4C"], /* CJK Ideograph */ + ["\u9F4D", "\u9F4D"], /* CJK Ideograph */ + ["\u9F4E", "\u9F4E"], /* CJK Ideograph */ + ["\u9F4F", "\u9F4F"], /* CJK Ideograph */ + ["\u9F50", "\u9F50"], /* CJK Ideograph */ + ["\u9F51", "\u9F51"], /* CJK Ideograph */ + ["\u9F52", "\u9F52"], /* CJK Ideograph */ + ["\u9F53", "\u9F53"], /* CJK Ideograph */ + ["\u9F54", "\u9F54"], /* CJK Ideograph */ + ["\u9F55", "\u9F55"], /* CJK Ideograph */ + ["\u9F56", "\u9F56"], /* CJK Ideograph */ + ["\u9F57", "\u9F57"], /* CJK Ideograph */ + ["\u9F58", "\u9F58"], /* CJK Ideograph */ + ["\u9F59", "\u9F59"], /* CJK Ideograph */ + ["\u9F5A", "\u9F5A"], /* CJK Ideograph */ + ["\u9F5B", "\u9F5B"], /* CJK Ideograph */ + ["\u9F5C", "\u9F5C"], /* CJK Ideograph */ + ["\u9F5D", "\u9F5D"], /* CJK Ideograph */ + ["\u9F5E", "\u9F5E"], /* CJK Ideograph */ + ["\u9F5F", "\u9F5F"], /* CJK Ideograph */ + ["\u9F60", "\u9F60"], /* CJK Ideograph */ + ["\u9F61", "\u9F61"], /* CJK Ideograph */ + ["\u9F62", "\u9F62"], /* CJK Ideograph */ + ["\u9F63", "\u9F63"], /* CJK Ideograph */ + ["\u9F64", "\u9F64"], /* CJK Ideograph */ + ["\u9F65", "\u9F65"], /* CJK Ideograph */ + ["\u9F66", "\u9F66"], /* CJK Ideograph */ + ["\u9F67", "\u9F67"], /* CJK Ideograph */ + ["\u9F68", "\u9F68"], /* CJK Ideograph */ + ["\u9F69", "\u9F69"], /* CJK Ideograph */ + ["\u9F6A", "\u9F6A"], /* CJK Ideograph */ + ["\u9F6B", "\u9F6B"], /* CJK Ideograph */ + ["\u9F6C", "\u9F6C"], /* CJK Ideograph */ + ["\u9F6D", "\u9F6D"], /* CJK Ideograph */ + ["\u9F6E", "\u9F6E"], /* CJK Ideograph */ + ["\u9F6F", "\u9F6F"], /* CJK Ideograph */ + ["\u9F70", "\u9F70"], /* CJK Ideograph */ + ["\u9F71", "\u9F71"], /* CJK Ideograph */ + ["\u9F72", "\u9F72"], /* CJK Ideograph */ + ["\u9F73", "\u9F73"], /* CJK Ideograph */ + ["\u9F74", "\u9F74"], /* CJK Ideograph */ + ["\u9F75", "\u9F75"], /* CJK Ideograph */ + ["\u9F76", "\u9F76"], /* CJK Ideograph */ + ["\u9F77", "\u9F77"], /* CJK Ideograph */ + ["\u9F78", "\u9F78"], /* CJK Ideograph */ + ["\u9F79", "\u9F79"], /* CJK Ideograph */ + ["\u9F7A", "\u9F7A"], /* CJK Ideograph */ + ["\u9F7B", "\u9F7B"], /* CJK Ideograph */ + ["\u9F7C", "\u9F7C"], /* CJK Ideograph */ + ["\u9F7D", "\u9F7D"], /* CJK Ideograph */ + ["\u9F7E", "\u9F7E"], /* CJK Ideograph */ + ["\u9F7F", "\u9F7F"], /* CJK Ideograph */ + ["\u9F80", "\u9F80"], /* CJK Ideograph */ + ["\u9F81", "\u9F81"], /* CJK Ideograph */ + ["\u9F82", "\u9F82"], /* CJK Ideograph */ + ["\u9F83", "\u9F83"], /* CJK Ideograph */ + ["\u9F84", "\u9F84"], /* CJK Ideograph */ + ["\u9F85", "\u9F85"], /* CJK Ideograph */ + ["\u9F86", "\u9F86"], /* CJK Ideograph */ + ["\u9F87", "\u9F87"], /* CJK Ideograph */ + ["\u9F88", "\u9F88"], /* CJK Ideograph */ + ["\u9F89", "\u9F89"], /* CJK Ideograph */ + ["\u9F8A", "\u9F8A"], /* CJK Ideograph */ + ["\u9F8B", "\u9F8B"], /* CJK Ideograph */ + ["\u9F8C", "\u9F8C"], /* CJK Ideograph */ + ["\u9F8D", "\u9F8D"], /* CJK Ideograph */ + ["\u9F8E", "\u9F8E"], /* CJK Ideograph */ + ["\u9F8F", "\u9F8F"], /* CJK Ideograph */ + ["\u9F90", "\u9F90"], /* CJK Ideograph */ + ["\u9F91", "\u9F91"], /* CJK Ideograph */ + ["\u9F92", "\u9F92"], /* CJK Ideograph */ + ["\u9F93", "\u9F93"], /* CJK Ideograph */ + ["\u9F94", "\u9F94"], /* CJK Ideograph */ + ["\u9F95", "\u9F95"], /* CJK Ideograph */ + ["\u9F96", "\u9F96"], /* CJK Ideograph */ + ["\u9F97", "\u9F97"], /* CJK Ideograph */ + ["\u9F98", "\u9F98"], /* CJK Ideograph */ + ["\u9F99", "\u9F99"], /* CJK Ideograph */ + ["\u9F9A", "\u9F9A"], /* CJK Ideograph */ + ["\u9F9B", "\u9F9B"], /* CJK Ideograph */ + ["\u9F9C", "\u9F9C"], /* CJK Ideograph */ + ["\u9F9D", "\u9F9D"], /* CJK Ideograph */ + ["\u9F9E", "\u9F9E"], /* CJK Ideograph */ + ["\u9F9F", "\u9F9F"], /* CJK Ideograph */ + ["\u9FA0", "\u9FA0"], /* CJK Ideograph */ + ["\u9FA1", "\u9FA1"], /* CJK Ideograph */ + ["\u9FA2", "\u9FA2"], /* CJK Ideograph */ + ["\u9FA3", "\u9FA3"], /* CJK Ideograph */ + ["\u9FA4", "\u9FA4"], /* CJK Ideograph */ + ["\u9FA5", "\u9FA5"], /* CJK Ideograph */ + ["\u9FA6", "\u9FA6"], /* CJK Ideograph */ + ["\u9FA7", "\u9FA7"], /* CJK Ideograph */ + ["\u9FA8", "\u9FA8"], /* CJK Ideograph */ + ["\u9FA9", "\u9FA9"], /* CJK Ideograph */ + ["\u9FAA", "\u9FAA"], /* CJK Ideograph */ + ["\u9FAB", "\u9FAB"], /* CJK Ideograph */ + ["\u9FAC", "\u9FAC"], /* CJK Ideograph */ + ["\u9FAD", "\u9FAD"], /* CJK Ideograph */ + ["\u9FAE", "\u9FAE"], /* CJK Ideograph */ + ["\u9FAF", "\u9FAF"], /* CJK Ideograph */ + ["\u9FB0", "\u9FB0"], /* CJK Ideograph */ + ["\u9FB1", "\u9FB1"], /* CJK Ideograph */ + ["\u9FB2", "\u9FB2"], /* CJK Ideograph */ + ["\u9FB3", "\u9FB3"], /* CJK Ideograph */ + ["\u9FB4", "\u9FB4"], /* CJK Ideograph */ + ["\u9FB5", "\u9FB5"], /* CJK Ideograph */ + ["\u9FB6", "\u9FB6"], /* CJK Ideograph */ + ["\u9FB7", "\u9FB7"], /* CJK Ideograph */ + ["\u9FB8", "\u9FB8"], /* CJK Ideograph */ + ["\u9FB9", "\u9FB9"], /* CJK Ideograph */ + ["\u9FBA", "\u9FBA"], /* CJK Ideograph */ + ["\u9FBB", "\u9FBB"], /* CJK Ideograph */ + ["\u9FBC", "\u9FBC"], /* CJK Ideograph */ + ["\u9FBD", "\u9FBD"], /* CJK Ideograph */ + ["\u9FBE", "\u9FBE"], /* CJK Ideograph */ + ["\u9FBF", "\u9FBF"], /* CJK Ideograph */ + ["\u9FC0", "\u9FC0"], /* CJK Ideograph */ + ["\u9FC1", "\u9FC1"], /* CJK Ideograph */ + ["\u9FC2", "\u9FC2"], /* CJK Ideograph */ + ["\u9FC3", "\u9FC3"], /* CJK Ideograph */ + ["\u9FC4", "\u9FC4"], /* CJK Ideograph */ + ["\u9FC5", "\u9FC5"], /* CJK Ideograph */ + ["\u9FC6", "\u9FC6"], /* CJK Ideograph */ + ["\u9FC7", "\u9FC7"], /* CJK Ideograph */ + ["\u9FC8", "\u9FC8"], /* CJK Ideograph */ + ["\u9FC9", "\u9FC9"], /* CJK Ideograph */ + ["\u9FCA", "\u9FCA"], /* CJK Ideograph */ + ["\u9FCB", "\u9FCB"], /* CJK Ideograph */ + ["\u9FCC", "\u9FCC"], /* CJK Ideograph */ + ["\u9FCD", "\u9FCD"], /* CJK Ideograph */ + ["\u9FCE", "\u9FCE"], /* CJK Ideograph */ + ["\u9FCF", "\u9FCF"], /* CJK Ideograph */ + ["\u9FD0", "\u9FD0"], /* CJK Ideograph */ + ["\u9FD1", "\u9FD1"], /* CJK Ideograph */ + ["\u9FD2", "\u9FD2"], /* CJK Ideograph */ + ["\u9FD3", "\u9FD3"], /* CJK Ideograph */ + ["\u9FD4", "\u9FD4"], /* CJK Ideograph */ + ["\u9FD5", "\u9FD5"], /* CJK Ideograph */ + ["\u9FD6", "\u9FD6"], /* CJK Ideograph */ + ["\u9FD7", "\u9FD7"], /* CJK Ideograph */ + ["\u9FD8", "\u9FD8"], /* CJK Ideograph */ + ["\u9FD9", "\u9FD9"], /* CJK Ideograph */ + ["\u9FDA", "\u9FDA"], /* CJK Ideograph */ + ["\u9FDB", "\u9FDB"], /* CJK Ideograph */ + ["\u9FDC", "\u9FDC"], /* CJK Ideograph */ + ["\u9FDD", "\u9FDD"], /* CJK Ideograph */ + ["\u9FDE", "\u9FDE"], /* CJK Ideograph */ + ["\u9FDF", "\u9FDF"], /* CJK Ideograph */ + ["\u9FE0", "\u9FE0"], /* CJK Ideograph */ + ["\u9FE1", "\u9FE1"], /* CJK Ideograph */ + ["\u9FE2", "\u9FE2"], /* CJK Ideograph */ + ["\u9FE3", "\u9FE3"], /* CJK Ideograph */ + ["\u9FE4", "\u9FE4"], /* CJK Ideograph */ + ["\u9FE5", "\u9FE5"], /* CJK Ideograph */ + ["\u9FE6", "\u9FE6"], /* CJK Ideograph */ + ["\u9FE7", "\u9FE7"], /* CJK Ideograph */ + ["\u9FE8", "\u9FE8"], /* CJK Ideograph */ + ["\u9FE9", "\u9FE9"], /* CJK Ideograph */ + ["\u9FEA", "\u9FEA"], /* CJK Ideograph */ + ["\u9FEB", "\u9FEB"], /* CJK Ideograph */ + ["\u9FEC", "\u9FEC"], /* CJK Ideograph */ + ["\u9FED", "\u9FED"], /* CJK Ideograph */ + ["\u9FEE", "\u9FEE"], /* CJK Ideograph */ + ["\u9FEF", "\u9FEF"], /* CJK Ideograph */ + ["\u9FF0", "\u9FF0"], /* CJK Ideograph */ + ["\u9FF1", "\u9FF1"], /* CJK Ideograph */ + ["\u9FF2", "\u9FF2"], /* CJK Ideograph */ + ["\u9FF3", "\u9FF3"], /* CJK Ideograph */ + ["\u9FF4", "\u9FF4"], /* CJK Ideograph */ + ["\u9FF5", "\u9FF5"], /* CJK Ideograph */ + ["\u9FF6", "\u9FF6"], /* CJK Ideograph */ + ["\u9FF7", "\u9FF7"], /* CJK Ideograph */ + ["\u9FF8", "\u9FF8"], /* CJK Ideograph */ + ["\u9FF9", "\u9FF9"], /* CJK Ideograph */ + ["\u9FFA", "\u9FFA"], /* CJK Ideograph */ + ["\u9FFB", "\u9FFB"], /* CJK Ideograph */ + ["\u9FFC", "\u9FFC"], /* CJK Ideograph */ + ["\u9FFD", "\u9FFD"], /* CJK Ideograph */ + ["\u9FFE", "\u9FFE"], /* CJK Ideograph */ + ["\u9FFF", "\u9FFF"], /* CJK Ideograph */ + ["\uA000", "\uA000"], /* YI SYLLABLE IT */ + ["\uA001", "\uA001"], /* YI SYLLABLE IX */ + ["\uA002", "\uA002"], /* YI SYLLABLE I */ + ["\uA003", "\uA003"], /* YI SYLLABLE IP */ + ["\uA004", "\uA004"], /* YI SYLLABLE IET */ + ["\uA005", "\uA005"], /* YI SYLLABLE IEX */ + ["\uA006", "\uA006"], /* YI SYLLABLE IE */ + ["\uA007", "\uA007"], /* YI SYLLABLE IEP */ + ["\uA008", "\uA008"], /* YI SYLLABLE AT */ + ["\uA009", "\uA009"], /* YI SYLLABLE AX */ + ["\uA00A", "\uA00A"], /* YI SYLLABLE A */ + ["\uA00B", "\uA00B"], /* YI SYLLABLE AP */ + ["\uA00C", "\uA00C"], /* YI SYLLABLE UOX */ + ["\uA00D", "\uA00D"], /* YI SYLLABLE UO */ + ["\uA00E", "\uA00E"], /* YI SYLLABLE UOP */ + ["\uA00F", "\uA00F"], /* YI SYLLABLE OT */ + ["\uA010", "\uA010"], /* YI SYLLABLE OX */ + ["\uA011", "\uA011"], /* YI SYLLABLE O */ + ["\uA012", "\uA012"], /* YI SYLLABLE OP */ + ["\uA013", "\uA013"], /* YI SYLLABLE EX */ + ["\uA014", "\uA014"], /* YI SYLLABLE E */ + ["\uA015", "\uA015"], /* YI SYLLABLE WU */ + ["\uA016", "\uA016"], /* YI SYLLABLE BIT */ + ["\uA017", "\uA017"], /* YI SYLLABLE BIX */ + ["\uA018", "\uA018"], /* YI SYLLABLE BI */ + ["\uA019", "\uA019"], /* YI SYLLABLE BIP */ + ["\uA01A", "\uA01A"], /* YI SYLLABLE BIET */ + ["\uA01B", "\uA01B"], /* YI SYLLABLE BIEX */ + ["\uA01C", "\uA01C"], /* YI SYLLABLE BIE */ + ["\uA01D", "\uA01D"], /* YI SYLLABLE BIEP */ + ["\uA01E", "\uA01E"], /* YI SYLLABLE BAT */ + ["\uA01F", "\uA01F"], /* YI SYLLABLE BAX */ + ["\uA020", "\uA020"], /* YI SYLLABLE BA */ + ["\uA021", "\uA021"], /* YI SYLLABLE BAP */ + ["\uA022", "\uA022"], /* YI SYLLABLE BUOX */ + ["\uA023", "\uA023"], /* YI SYLLABLE BUO */ + ["\uA024", "\uA024"], /* YI SYLLABLE BUOP */ + ["\uA025", "\uA025"], /* YI SYLLABLE BOT */ + ["\uA026", "\uA026"], /* YI SYLLABLE BOX */ + ["\uA027", "\uA027"], /* YI SYLLABLE BO */ + ["\uA028", "\uA028"], /* YI SYLLABLE BOP */ + ["\uA029", "\uA029"], /* YI SYLLABLE BEX */ + ["\uA02A", "\uA02A"], /* YI SYLLABLE BE */ + ["\uA02B", "\uA02B"], /* YI SYLLABLE BEP */ + ["\uA02C", "\uA02C"], /* YI SYLLABLE BUT */ + ["\uA02D", "\uA02D"], /* YI SYLLABLE BUX */ + ["\uA02E", "\uA02E"], /* YI SYLLABLE BU */ + ["\uA02F", "\uA02F"], /* YI SYLLABLE BUP */ + ["\uA030", "\uA030"], /* YI SYLLABLE BURX */ + ["\uA031", "\uA031"], /* YI SYLLABLE BUR */ + ["\uA032", "\uA032"], /* YI SYLLABLE BYT */ + ["\uA033", "\uA033"], /* YI SYLLABLE BYX */ + ["\uA034", "\uA034"], /* YI SYLLABLE BY */ + ["\uA035", "\uA035"], /* YI SYLLABLE BYP */ + ["\uA036", "\uA036"], /* YI SYLLABLE BYRX */ + ["\uA037", "\uA037"], /* YI SYLLABLE BYR */ + ["\uA038", "\uA038"], /* YI SYLLABLE PIT */ + ["\uA039", "\uA039"], /* YI SYLLABLE PIX */ + ["\uA03A", "\uA03A"], /* YI SYLLABLE PI */ + ["\uA03B", "\uA03B"], /* YI SYLLABLE PIP */ + ["\uA03C", "\uA03C"], /* YI SYLLABLE PIEX */ + ["\uA03D", "\uA03D"], /* YI SYLLABLE PIE */ + ["\uA03E", "\uA03E"], /* YI SYLLABLE PIEP */ + ["\uA03F", "\uA03F"], /* YI SYLLABLE PAT */ + ["\uA040", "\uA040"], /* YI SYLLABLE PAX */ + ["\uA041", "\uA041"], /* YI SYLLABLE PA */ + ["\uA042", "\uA042"], /* YI SYLLABLE PAP */ + ["\uA043", "\uA043"], /* YI SYLLABLE PUOX */ + ["\uA044", "\uA044"], /* YI SYLLABLE PUO */ + ["\uA045", "\uA045"], /* YI SYLLABLE PUOP */ + ["\uA046", "\uA046"], /* YI SYLLABLE POT */ + ["\uA047", "\uA047"], /* YI SYLLABLE POX */ + ["\uA048", "\uA048"], /* YI SYLLABLE PO */ + ["\uA049", "\uA049"], /* YI SYLLABLE POP */ + ["\uA04A", "\uA04A"], /* YI SYLLABLE PUT */ + ["\uA04B", "\uA04B"], /* YI SYLLABLE PUX */ + ["\uA04C", "\uA04C"], /* YI SYLLABLE PU */ + ["\uA04D", "\uA04D"], /* YI SYLLABLE PUP */ + ["\uA04E", "\uA04E"], /* YI SYLLABLE PURX */ + ["\uA04F", "\uA04F"], /* YI SYLLABLE PUR */ + ["\uA050", "\uA050"], /* YI SYLLABLE PYT */ + ["\uA051", "\uA051"], /* YI SYLLABLE PYX */ + ["\uA052", "\uA052"], /* YI SYLLABLE PY */ + ["\uA053", "\uA053"], /* YI SYLLABLE PYP */ + ["\uA054", "\uA054"], /* YI SYLLABLE PYRX */ + ["\uA055", "\uA055"], /* YI SYLLABLE PYR */ + ["\uA056", "\uA056"], /* YI SYLLABLE BBIT */ + ["\uA057", "\uA057"], /* YI SYLLABLE BBIX */ + ["\uA058", "\uA058"], /* YI SYLLABLE BBI */ + ["\uA059", "\uA059"], /* YI SYLLABLE BBIP */ + ["\uA05A", "\uA05A"], /* YI SYLLABLE BBIET */ + ["\uA05B", "\uA05B"], /* YI SYLLABLE BBIEX */ + ["\uA05C", "\uA05C"], /* YI SYLLABLE BBIE */ + ["\uA05D", "\uA05D"], /* YI SYLLABLE BBIEP */ + ["\uA05E", "\uA05E"], /* YI SYLLABLE BBAT */ + ["\uA05F", "\uA05F"], /* YI SYLLABLE BBAX */ + ["\uA060", "\uA060"], /* YI SYLLABLE BBA */ + ["\uA061", "\uA061"], /* YI SYLLABLE BBAP */ + ["\uA062", "\uA062"], /* YI SYLLABLE BBUOX */ + ["\uA063", "\uA063"], /* YI SYLLABLE BBUO */ + ["\uA064", "\uA064"], /* YI SYLLABLE BBUOP */ + ["\uA065", "\uA065"], /* YI SYLLABLE BBOT */ + ["\uA066", "\uA066"], /* YI SYLLABLE BBOX */ + ["\uA067", "\uA067"], /* YI SYLLABLE BBO */ + ["\uA068", "\uA068"], /* YI SYLLABLE BBOP */ + ["\uA069", "\uA069"], /* YI SYLLABLE BBEX */ + ["\uA06A", "\uA06A"], /* YI SYLLABLE BBE */ + ["\uA06B", "\uA06B"], /* YI SYLLABLE BBEP */ + ["\uA06C", "\uA06C"], /* YI SYLLABLE BBUT */ + ["\uA06D", "\uA06D"], /* YI SYLLABLE BBUX */ + ["\uA06E", "\uA06E"], /* YI SYLLABLE BBU */ + ["\uA06F", "\uA06F"], /* YI SYLLABLE BBUP */ + ["\uA070", "\uA070"], /* YI SYLLABLE BBURX */ + ["\uA071", "\uA071"], /* YI SYLLABLE BBUR */ + ["\uA072", "\uA072"], /* YI SYLLABLE BBYT */ + ["\uA073", "\uA073"], /* YI SYLLABLE BBYX */ + ["\uA074", "\uA074"], /* YI SYLLABLE BBY */ + ["\uA075", "\uA075"], /* YI SYLLABLE BBYP */ + ["\uA076", "\uA076"], /* YI SYLLABLE NBIT */ + ["\uA077", "\uA077"], /* YI SYLLABLE NBIX */ + ["\uA078", "\uA078"], /* YI SYLLABLE NBI */ + ["\uA079", "\uA079"], /* YI SYLLABLE NBIP */ + ["\uA07A", "\uA07A"], /* YI SYLLABLE NBIEX */ + ["\uA07B", "\uA07B"], /* YI SYLLABLE NBIE */ + ["\uA07C", "\uA07C"], /* YI SYLLABLE NBIEP */ + ["\uA07D", "\uA07D"], /* YI SYLLABLE NBAT */ + ["\uA07E", "\uA07E"], /* YI SYLLABLE NBAX */ + ["\uA07F", "\uA07F"], /* YI SYLLABLE NBA */ + ["\uA080", "\uA080"], /* YI SYLLABLE NBAP */ + ["\uA081", "\uA081"], /* YI SYLLABLE NBOT */ + ["\uA082", "\uA082"], /* YI SYLLABLE NBOX */ + ["\uA083", "\uA083"], /* YI SYLLABLE NBO */ + ["\uA084", "\uA084"], /* YI SYLLABLE NBOP */ + ["\uA085", "\uA085"], /* YI SYLLABLE NBUT */ + ["\uA086", "\uA086"], /* YI SYLLABLE NBUX */ + ["\uA087", "\uA087"], /* YI SYLLABLE NBU */ + ["\uA088", "\uA088"], /* YI SYLLABLE NBUP */ + ["\uA089", "\uA089"], /* YI SYLLABLE NBURX */ + ["\uA08A", "\uA08A"], /* YI SYLLABLE NBUR */ + ["\uA08B", "\uA08B"], /* YI SYLLABLE NBYT */ + ["\uA08C", "\uA08C"], /* YI SYLLABLE NBYX */ + ["\uA08D", "\uA08D"], /* YI SYLLABLE NBY */ + ["\uA08E", "\uA08E"], /* YI SYLLABLE NBYP */ + ["\uA08F", "\uA08F"], /* YI SYLLABLE NBYRX */ + ["\uA090", "\uA090"], /* YI SYLLABLE NBYR */ + ["\uA091", "\uA091"], /* YI SYLLABLE HMIT */ + ["\uA092", "\uA092"], /* YI SYLLABLE HMIX */ + ["\uA093", "\uA093"], /* YI SYLLABLE HMI */ + ["\uA094", "\uA094"], /* YI SYLLABLE HMIP */ + ["\uA095", "\uA095"], /* YI SYLLABLE HMIEX */ + ["\uA096", "\uA096"], /* YI SYLLABLE HMIE */ + ["\uA097", "\uA097"], /* YI SYLLABLE HMIEP */ + ["\uA098", "\uA098"], /* YI SYLLABLE HMAT */ + ["\uA099", "\uA099"], /* YI SYLLABLE HMAX */ + ["\uA09A", "\uA09A"], /* YI SYLLABLE HMA */ + ["\uA09B", "\uA09B"], /* YI SYLLABLE HMAP */ + ["\uA09C", "\uA09C"], /* YI SYLLABLE HMUOX */ + ["\uA09D", "\uA09D"], /* YI SYLLABLE HMUO */ + ["\uA09E", "\uA09E"], /* YI SYLLABLE HMUOP */ + ["\uA09F", "\uA09F"], /* YI SYLLABLE HMOT */ + ["\uA0A0", "\uA0A0"], /* YI SYLLABLE HMOX */ + ["\uA0A1", "\uA0A1"], /* YI SYLLABLE HMO */ + ["\uA0A2", "\uA0A2"], /* YI SYLLABLE HMOP */ + ["\uA0A3", "\uA0A3"], /* YI SYLLABLE HMUT */ + ["\uA0A4", "\uA0A4"], /* YI SYLLABLE HMUX */ + ["\uA0A5", "\uA0A5"], /* YI SYLLABLE HMU */ + ["\uA0A6", "\uA0A6"], /* YI SYLLABLE HMUP */ + ["\uA0A7", "\uA0A7"], /* YI SYLLABLE HMURX */ + ["\uA0A8", "\uA0A8"], /* YI SYLLABLE HMUR */ + ["\uA0A9", "\uA0A9"], /* YI SYLLABLE HMYX */ + ["\uA0AA", "\uA0AA"], /* YI SYLLABLE HMY */ + ["\uA0AB", "\uA0AB"], /* YI SYLLABLE HMYP */ + ["\uA0AC", "\uA0AC"], /* YI SYLLABLE HMYRX */ + ["\uA0AD", "\uA0AD"], /* YI SYLLABLE HMYR */ + ["\uA0AE", "\uA0AE"], /* YI SYLLABLE MIT */ + ["\uA0AF", "\uA0AF"], /* YI SYLLABLE MIX */ + ["\uA0B0", "\uA0B0"], /* YI SYLLABLE MI */ + ["\uA0B1", "\uA0B1"], /* YI SYLLABLE MIP */ + ["\uA0B2", "\uA0B2"], /* YI SYLLABLE MIEX */ + ["\uA0B3", "\uA0B3"], /* YI SYLLABLE MIE */ + ["\uA0B4", "\uA0B4"], /* YI SYLLABLE MIEP */ + ["\uA0B5", "\uA0B5"], /* YI SYLLABLE MAT */ + ["\uA0B6", "\uA0B6"], /* YI SYLLABLE MAX */ + ["\uA0B7", "\uA0B7"], /* YI SYLLABLE MA */ + ["\uA0B8", "\uA0B8"], /* YI SYLLABLE MAP */ + ["\uA0B9", "\uA0B9"], /* YI SYLLABLE MUOT */ + ["\uA0BA", "\uA0BA"], /* YI SYLLABLE MUOX */ + ["\uA0BB", "\uA0BB"], /* YI SYLLABLE MUO */ + ["\uA0BC", "\uA0BC"], /* YI SYLLABLE MUOP */ + ["\uA0BD", "\uA0BD"], /* YI SYLLABLE MOT */ + ["\uA0BE", "\uA0BE"], /* YI SYLLABLE MOX */ + ["\uA0BF", "\uA0BF"], /* YI SYLLABLE MO */ + ["\uA0C0", "\uA0C0"], /* YI SYLLABLE MOP */ + ["\uA0C1", "\uA0C1"], /* YI SYLLABLE MEX */ + ["\uA0C2", "\uA0C2"], /* YI SYLLABLE ME */ + ["\uA0C3", "\uA0C3"], /* YI SYLLABLE MUT */ + ["\uA0C4", "\uA0C4"], /* YI SYLLABLE MUX */ + ["\uA0C5", "\uA0C5"], /* YI SYLLABLE MU */ + ["\uA0C6", "\uA0C6"], /* YI SYLLABLE MUP */ + ["\uA0C7", "\uA0C7"], /* YI SYLLABLE MURX */ + ["\uA0C8", "\uA0C8"], /* YI SYLLABLE MUR */ + ["\uA0C9", "\uA0C9"], /* YI SYLLABLE MYT */ + ["\uA0CA", "\uA0CA"], /* YI SYLLABLE MYX */ + ["\uA0CB", "\uA0CB"], /* YI SYLLABLE MY */ + ["\uA0CC", "\uA0CC"], /* YI SYLLABLE MYP */ + ["\uA0CD", "\uA0CD"], /* YI SYLLABLE FIT */ + ["\uA0CE", "\uA0CE"], /* YI SYLLABLE FIX */ + ["\uA0CF", "\uA0CF"], /* YI SYLLABLE FI */ + ["\uA0D0", "\uA0D0"], /* YI SYLLABLE FIP */ + ["\uA0D1", "\uA0D1"], /* YI SYLLABLE FAT */ + ["\uA0D2", "\uA0D2"], /* YI SYLLABLE FAX */ + ["\uA0D3", "\uA0D3"], /* YI SYLLABLE FA */ + ["\uA0D4", "\uA0D4"], /* YI SYLLABLE FAP */ + ["\uA0D5", "\uA0D5"], /* YI SYLLABLE FOX */ + ["\uA0D6", "\uA0D6"], /* YI SYLLABLE FO */ + ["\uA0D7", "\uA0D7"], /* YI SYLLABLE FOP */ + ["\uA0D8", "\uA0D8"], /* YI SYLLABLE FUT */ + ["\uA0D9", "\uA0D9"], /* YI SYLLABLE FUX */ + ["\uA0DA", "\uA0DA"], /* YI SYLLABLE FU */ + ["\uA0DB", "\uA0DB"], /* YI SYLLABLE FUP */ + ["\uA0DC", "\uA0DC"], /* YI SYLLABLE FURX */ + ["\uA0DD", "\uA0DD"], /* YI SYLLABLE FUR */ + ["\uA0DE", "\uA0DE"], /* YI SYLLABLE FYT */ + ["\uA0DF", "\uA0DF"], /* YI SYLLABLE FYX */ + ["\uA0E0", "\uA0E0"], /* YI SYLLABLE FY */ + ["\uA0E1", "\uA0E1"], /* YI SYLLABLE FYP */ + ["\uA0E2", "\uA0E2"], /* YI SYLLABLE VIT */ + ["\uA0E3", "\uA0E3"], /* YI SYLLABLE VIX */ + ["\uA0E4", "\uA0E4"], /* YI SYLLABLE VI */ + ["\uA0E5", "\uA0E5"], /* YI SYLLABLE VIP */ + ["\uA0E6", "\uA0E6"], /* YI SYLLABLE VIET */ + ["\uA0E7", "\uA0E7"], /* YI SYLLABLE VIEX */ + ["\uA0E8", "\uA0E8"], /* YI SYLLABLE VIE */ + ["\uA0E9", "\uA0E9"], /* YI SYLLABLE VIEP */ + ["\uA0EA", "\uA0EA"], /* YI SYLLABLE VAT */ + ["\uA0EB", "\uA0EB"], /* YI SYLLABLE VAX */ + ["\uA0EC", "\uA0EC"], /* YI SYLLABLE VA */ + ["\uA0ED", "\uA0ED"], /* YI SYLLABLE VAP */ + ["\uA0EE", "\uA0EE"], /* YI SYLLABLE VOT */ + ["\uA0EF", "\uA0EF"], /* YI SYLLABLE VOX */ + ["\uA0F0", "\uA0F0"], /* YI SYLLABLE VO */ + ["\uA0F1", "\uA0F1"], /* YI SYLLABLE VOP */ + ["\uA0F2", "\uA0F2"], /* YI SYLLABLE VEX */ + ["\uA0F3", "\uA0F3"], /* YI SYLLABLE VEP */ + ["\uA0F4", "\uA0F4"], /* YI SYLLABLE VUT */ + ["\uA0F5", "\uA0F5"], /* YI SYLLABLE VUX */ + ["\uA0F6", "\uA0F6"], /* YI SYLLABLE VU */ + ["\uA0F7", "\uA0F7"], /* YI SYLLABLE VUP */ + ["\uA0F8", "\uA0F8"], /* YI SYLLABLE VURX */ + ["\uA0F9", "\uA0F9"], /* YI SYLLABLE VUR */ + ["\uA0FA", "\uA0FA"], /* YI SYLLABLE VYT */ + ["\uA0FB", "\uA0FB"], /* YI SYLLABLE VYX */ + ["\uA0FC", "\uA0FC"], /* YI SYLLABLE VY */ + ["\uA0FD", "\uA0FD"], /* YI SYLLABLE VYP */ + ["\uA0FE", "\uA0FE"], /* YI SYLLABLE VYRX */ + ["\uA0FF", "\uA0FF"], /* YI SYLLABLE VYR */ + ["\uA100", "\uA100"], /* YI SYLLABLE DIT */ + ["\uA101", "\uA101"], /* YI SYLLABLE DIX */ + ["\uA102", "\uA102"], /* YI SYLLABLE DI */ + ["\uA103", "\uA103"], /* YI SYLLABLE DIP */ + ["\uA104", "\uA104"], /* YI SYLLABLE DIEX */ + ["\uA105", "\uA105"], /* YI SYLLABLE DIE */ + ["\uA106", "\uA106"], /* YI SYLLABLE DIEP */ + ["\uA107", "\uA107"], /* YI SYLLABLE DAT */ + ["\uA108", "\uA108"], /* YI SYLLABLE DAX */ + ["\uA109", "\uA109"], /* YI SYLLABLE DA */ + ["\uA10A", "\uA10A"], /* YI SYLLABLE DAP */ + ["\uA10B", "\uA10B"], /* YI SYLLABLE DUOX */ + ["\uA10C", "\uA10C"], /* YI SYLLABLE DUO */ + ["\uA10D", "\uA10D"], /* YI SYLLABLE DOT */ + ["\uA10E", "\uA10E"], /* YI SYLLABLE DOX */ + ["\uA10F", "\uA10F"], /* YI SYLLABLE DO */ + ["\uA110", "\uA110"], /* YI SYLLABLE DOP */ + ["\uA111", "\uA111"], /* YI SYLLABLE DEX */ + ["\uA112", "\uA112"], /* YI SYLLABLE DE */ + ["\uA113", "\uA113"], /* YI SYLLABLE DEP */ + ["\uA114", "\uA114"], /* YI SYLLABLE DUT */ + ["\uA115", "\uA115"], /* YI SYLLABLE DUX */ + ["\uA116", "\uA116"], /* YI SYLLABLE DU */ + ["\uA117", "\uA117"], /* YI SYLLABLE DUP */ + ["\uA118", "\uA118"], /* YI SYLLABLE DURX */ + ["\uA119", "\uA119"], /* YI SYLLABLE DUR */ + ["\uA11A", "\uA11A"], /* YI SYLLABLE TIT */ + ["\uA11B", "\uA11B"], /* YI SYLLABLE TIX */ + ["\uA11C", "\uA11C"], /* YI SYLLABLE TI */ + ["\uA11D", "\uA11D"], /* YI SYLLABLE TIP */ + ["\uA11E", "\uA11E"], /* YI SYLLABLE TIEX */ + ["\uA11F", "\uA11F"], /* YI SYLLABLE TIE */ + ["\uA120", "\uA120"], /* YI SYLLABLE TIEP */ + ["\uA121", "\uA121"], /* YI SYLLABLE TAT */ + ["\uA122", "\uA122"], /* YI SYLLABLE TAX */ + ["\uA123", "\uA123"], /* YI SYLLABLE TA */ + ["\uA124", "\uA124"], /* YI SYLLABLE TAP */ + ["\uA125", "\uA125"], /* YI SYLLABLE TUOT */ + ["\uA126", "\uA126"], /* YI SYLLABLE TUOX */ + ["\uA127", "\uA127"], /* YI SYLLABLE TUO */ + ["\uA128", "\uA128"], /* YI SYLLABLE TUOP */ + ["\uA129", "\uA129"], /* YI SYLLABLE TOT */ + ["\uA12A", "\uA12A"], /* YI SYLLABLE TOX */ + ["\uA12B", "\uA12B"], /* YI SYLLABLE TO */ + ["\uA12C", "\uA12C"], /* YI SYLLABLE TOP */ + ["\uA12D", "\uA12D"], /* YI SYLLABLE TEX */ + ["\uA12E", "\uA12E"], /* YI SYLLABLE TE */ + ["\uA12F", "\uA12F"], /* YI SYLLABLE TEP */ + ["\uA130", "\uA130"], /* YI SYLLABLE TUT */ + ["\uA131", "\uA131"], /* YI SYLLABLE TUX */ + ["\uA132", "\uA132"], /* YI SYLLABLE TU */ + ["\uA133", "\uA133"], /* YI SYLLABLE TUP */ + ["\uA134", "\uA134"], /* YI SYLLABLE TURX */ + ["\uA135", "\uA135"], /* YI SYLLABLE TUR */ + ["\uA136", "\uA136"], /* YI SYLLABLE DDIT */ + ["\uA137", "\uA137"], /* YI SYLLABLE DDIX */ + ["\uA138", "\uA138"], /* YI SYLLABLE DDI */ + ["\uA139", "\uA139"], /* YI SYLLABLE DDIP */ + ["\uA13A", "\uA13A"], /* YI SYLLABLE DDIEX */ + ["\uA13B", "\uA13B"], /* YI SYLLABLE DDIE */ + ["\uA13C", "\uA13C"], /* YI SYLLABLE DDIEP */ + ["\uA13D", "\uA13D"], /* YI SYLLABLE DDAT */ + ["\uA13E", "\uA13E"], /* YI SYLLABLE DDAX */ + ["\uA13F", "\uA13F"], /* YI SYLLABLE DDA */ + ["\uA140", "\uA140"], /* YI SYLLABLE DDAP */ + ["\uA141", "\uA141"], /* YI SYLLABLE DDUOX */ + ["\uA142", "\uA142"], /* YI SYLLABLE DDUO */ + ["\uA143", "\uA143"], /* YI SYLLABLE DDUOP */ + ["\uA144", "\uA144"], /* YI SYLLABLE DDOT */ + ["\uA145", "\uA145"], /* YI SYLLABLE DDOX */ + ["\uA146", "\uA146"], /* YI SYLLABLE DDO */ + ["\uA147", "\uA147"], /* YI SYLLABLE DDOP */ + ["\uA148", "\uA148"], /* YI SYLLABLE DDEX */ + ["\uA149", "\uA149"], /* YI SYLLABLE DDE */ + ["\uA14A", "\uA14A"], /* YI SYLLABLE DDEP */ + ["\uA14B", "\uA14B"], /* YI SYLLABLE DDUT */ + ["\uA14C", "\uA14C"], /* YI SYLLABLE DDUX */ + ["\uA14D", "\uA14D"], /* YI SYLLABLE DDU */ + ["\uA14E", "\uA14E"], /* YI SYLLABLE DDUP */ + ["\uA14F", "\uA14F"], /* YI SYLLABLE DDURX */ + ["\uA150", "\uA150"], /* YI SYLLABLE DDUR */ + ["\uA151", "\uA151"], /* YI SYLLABLE NDIT */ + ["\uA152", "\uA152"], /* YI SYLLABLE NDIX */ + ["\uA153", "\uA153"], /* YI SYLLABLE NDI */ + ["\uA154", "\uA154"], /* YI SYLLABLE NDIP */ + ["\uA155", "\uA155"], /* YI SYLLABLE NDIEX */ + ["\uA156", "\uA156"], /* YI SYLLABLE NDIE */ + ["\uA157", "\uA157"], /* YI SYLLABLE NDAT */ + ["\uA158", "\uA158"], /* YI SYLLABLE NDAX */ + ["\uA159", "\uA159"], /* YI SYLLABLE NDA */ + ["\uA15A", "\uA15A"], /* YI SYLLABLE NDAP */ + ["\uA15B", "\uA15B"], /* YI SYLLABLE NDOT */ + ["\uA15C", "\uA15C"], /* YI SYLLABLE NDOX */ + ["\uA15D", "\uA15D"], /* YI SYLLABLE NDO */ + ["\uA15E", "\uA15E"], /* YI SYLLABLE NDOP */ + ["\uA15F", "\uA15F"], /* YI SYLLABLE NDEX */ + ["\uA160", "\uA160"], /* YI SYLLABLE NDE */ + ["\uA161", "\uA161"], /* YI SYLLABLE NDEP */ + ["\uA162", "\uA162"], /* YI SYLLABLE NDUT */ + ["\uA163", "\uA163"], /* YI SYLLABLE NDUX */ + ["\uA164", "\uA164"], /* YI SYLLABLE NDU */ + ["\uA165", "\uA165"], /* YI SYLLABLE NDUP */ + ["\uA166", "\uA166"], /* YI SYLLABLE NDURX */ + ["\uA167", "\uA167"], /* YI SYLLABLE NDUR */ + ["\uA168", "\uA168"], /* YI SYLLABLE HNIT */ + ["\uA169", "\uA169"], /* YI SYLLABLE HNIX */ + ["\uA16A", "\uA16A"], /* YI SYLLABLE HNI */ + ["\uA16B", "\uA16B"], /* YI SYLLABLE HNIP */ + ["\uA16C", "\uA16C"], /* YI SYLLABLE HNIET */ + ["\uA16D", "\uA16D"], /* YI SYLLABLE HNIEX */ + ["\uA16E", "\uA16E"], /* YI SYLLABLE HNIE */ + ["\uA16F", "\uA16F"], /* YI SYLLABLE HNIEP */ + ["\uA170", "\uA170"], /* YI SYLLABLE HNAT */ + ["\uA171", "\uA171"], /* YI SYLLABLE HNAX */ + ["\uA172", "\uA172"], /* YI SYLLABLE HNA */ + ["\uA173", "\uA173"], /* YI SYLLABLE HNAP */ + ["\uA174", "\uA174"], /* YI SYLLABLE HNUOX */ + ["\uA175", "\uA175"], /* YI SYLLABLE HNUO */ + ["\uA176", "\uA176"], /* YI SYLLABLE HNOT */ + ["\uA177", "\uA177"], /* YI SYLLABLE HNOX */ + ["\uA178", "\uA178"], /* YI SYLLABLE HNOP */ + ["\uA179", "\uA179"], /* YI SYLLABLE HNEX */ + ["\uA17A", "\uA17A"], /* YI SYLLABLE HNE */ + ["\uA17B", "\uA17B"], /* YI SYLLABLE HNEP */ + ["\uA17C", "\uA17C"], /* YI SYLLABLE HNUT */ + ["\uA17D", "\uA17D"], /* YI SYLLABLE NIT */ + ["\uA17E", "\uA17E"], /* YI SYLLABLE NIX */ + ["\uA17F", "\uA17F"], /* YI SYLLABLE NI */ + ["\uA180", "\uA180"], /* YI SYLLABLE NIP */ + ["\uA181", "\uA181"], /* YI SYLLABLE NIEX */ + ["\uA182", "\uA182"], /* YI SYLLABLE NIE */ + ["\uA183", "\uA183"], /* YI SYLLABLE NIEP */ + ["\uA184", "\uA184"], /* YI SYLLABLE NAX */ + ["\uA185", "\uA185"], /* YI SYLLABLE NA */ + ["\uA186", "\uA186"], /* YI SYLLABLE NAP */ + ["\uA187", "\uA187"], /* YI SYLLABLE NUOX */ + ["\uA188", "\uA188"], /* YI SYLLABLE NUO */ + ["\uA189", "\uA189"], /* YI SYLLABLE NUOP */ + ["\uA18A", "\uA18A"], /* YI SYLLABLE NOT */ + ["\uA18B", "\uA18B"], /* YI SYLLABLE NOX */ + ["\uA18C", "\uA18C"], /* YI SYLLABLE NO */ + ["\uA18D", "\uA18D"], /* YI SYLLABLE NOP */ + ["\uA18E", "\uA18E"], /* YI SYLLABLE NEX */ + ["\uA18F", "\uA18F"], /* YI SYLLABLE NE */ + ["\uA190", "\uA190"], /* YI SYLLABLE NEP */ + ["\uA191", "\uA191"], /* YI SYLLABLE NUT */ + ["\uA192", "\uA192"], /* YI SYLLABLE NUX */ + ["\uA193", "\uA193"], /* YI SYLLABLE NU */ + ["\uA194", "\uA194"], /* YI SYLLABLE NUP */ + ["\uA195", "\uA195"], /* YI SYLLABLE NURX */ + ["\uA196", "\uA196"], /* YI SYLLABLE NUR */ + ["\uA197", "\uA197"], /* YI SYLLABLE HLIT */ + ["\uA198", "\uA198"], /* YI SYLLABLE HLIX */ + ["\uA199", "\uA199"], /* YI SYLLABLE HLI */ + ["\uA19A", "\uA19A"], /* YI SYLLABLE HLIP */ + ["\uA19B", "\uA19B"], /* YI SYLLABLE HLIEX */ + ["\uA19C", "\uA19C"], /* YI SYLLABLE HLIE */ + ["\uA19D", "\uA19D"], /* YI SYLLABLE HLIEP */ + ["\uA19E", "\uA19E"], /* YI SYLLABLE HLAT */ + ["\uA19F", "\uA19F"], /* YI SYLLABLE HLAX */ + ["\uA1A0", "\uA1A0"], /* YI SYLLABLE HLA */ + ["\uA1A1", "\uA1A1"], /* YI SYLLABLE HLAP */ + ["\uA1A2", "\uA1A2"], /* YI SYLLABLE HLUOX */ + ["\uA1A3", "\uA1A3"], /* YI SYLLABLE HLUO */ + ["\uA1A4", "\uA1A4"], /* YI SYLLABLE HLUOP */ + ["\uA1A5", "\uA1A5"], /* YI SYLLABLE HLOX */ + ["\uA1A6", "\uA1A6"], /* YI SYLLABLE HLO */ + ["\uA1A7", "\uA1A7"], /* YI SYLLABLE HLOP */ + ["\uA1A8", "\uA1A8"], /* YI SYLLABLE HLEX */ + ["\uA1A9", "\uA1A9"], /* YI SYLLABLE HLE */ + ["\uA1AA", "\uA1AA"], /* YI SYLLABLE HLEP */ + ["\uA1AB", "\uA1AB"], /* YI SYLLABLE HLUT */ + ["\uA1AC", "\uA1AC"], /* YI SYLLABLE HLUX */ + ["\uA1AD", "\uA1AD"], /* YI SYLLABLE HLU */ + ["\uA1AE", "\uA1AE"], /* YI SYLLABLE HLUP */ + ["\uA1AF", "\uA1AF"], /* YI SYLLABLE HLURX */ + ["\uA1B0", "\uA1B0"], /* YI SYLLABLE HLUR */ + ["\uA1B1", "\uA1B1"], /* YI SYLLABLE HLYT */ + ["\uA1B2", "\uA1B2"], /* YI SYLLABLE HLYX */ + ["\uA1B3", "\uA1B3"], /* YI SYLLABLE HLY */ + ["\uA1B4", "\uA1B4"], /* YI SYLLABLE HLYP */ + ["\uA1B5", "\uA1B5"], /* YI SYLLABLE HLYRX */ + ["\uA1B6", "\uA1B6"], /* YI SYLLABLE HLYR */ + ["\uA1B7", "\uA1B7"], /* YI SYLLABLE LIT */ + ["\uA1B8", "\uA1B8"], /* YI SYLLABLE LIX */ + ["\uA1B9", "\uA1B9"], /* YI SYLLABLE LI */ + ["\uA1BA", "\uA1BA"], /* YI SYLLABLE LIP */ + ["\uA1BB", "\uA1BB"], /* YI SYLLABLE LIET */ + ["\uA1BC", "\uA1BC"], /* YI SYLLABLE LIEX */ + ["\uA1BD", "\uA1BD"], /* YI SYLLABLE LIE */ + ["\uA1BE", "\uA1BE"], /* YI SYLLABLE LIEP */ + ["\uA1BF", "\uA1BF"], /* YI SYLLABLE LAT */ + ["\uA1C0", "\uA1C0"], /* YI SYLLABLE LAX */ + ["\uA1C1", "\uA1C1"], /* YI SYLLABLE LA */ + ["\uA1C2", "\uA1C2"], /* YI SYLLABLE LAP */ + ["\uA1C3", "\uA1C3"], /* YI SYLLABLE LUOT */ + ["\uA1C4", "\uA1C4"], /* YI SYLLABLE LUOX */ + ["\uA1C5", "\uA1C5"], /* YI SYLLABLE LUO */ + ["\uA1C6", "\uA1C6"], /* YI SYLLABLE LUOP */ + ["\uA1C7", "\uA1C7"], /* YI SYLLABLE LOT */ + ["\uA1C8", "\uA1C8"], /* YI SYLLABLE LOX */ + ["\uA1C9", "\uA1C9"], /* YI SYLLABLE LO */ + ["\uA1CA", "\uA1CA"], /* YI SYLLABLE LOP */ + ["\uA1CB", "\uA1CB"], /* YI SYLLABLE LEX */ + ["\uA1CC", "\uA1CC"], /* YI SYLLABLE LE */ + ["\uA1CD", "\uA1CD"], /* YI SYLLABLE LEP */ + ["\uA1CE", "\uA1CE"], /* YI SYLLABLE LUT */ + ["\uA1CF", "\uA1CF"], /* YI SYLLABLE LUX */ + ["\uA1D0", "\uA1D0"], /* YI SYLLABLE LU */ + ["\uA1D1", "\uA1D1"], /* YI SYLLABLE LUP */ + ["\uA1D2", "\uA1D2"], /* YI SYLLABLE LURX */ + ["\uA1D3", "\uA1D3"], /* YI SYLLABLE LUR */ + ["\uA1D4", "\uA1D4"], /* YI SYLLABLE LYT */ + ["\uA1D5", "\uA1D5"], /* YI SYLLABLE LYX */ + ["\uA1D6", "\uA1D6"], /* YI SYLLABLE LY */ + ["\uA1D7", "\uA1D7"], /* YI SYLLABLE LYP */ + ["\uA1D8", "\uA1D8"], /* YI SYLLABLE LYRX */ + ["\uA1D9", "\uA1D9"], /* YI SYLLABLE LYR */ + ["\uA1DA", "\uA1DA"], /* YI SYLLABLE GIT */ + ["\uA1DB", "\uA1DB"], /* YI SYLLABLE GIX */ + ["\uA1DC", "\uA1DC"], /* YI SYLLABLE GI */ + ["\uA1DD", "\uA1DD"], /* YI SYLLABLE GIP */ + ["\uA1DE", "\uA1DE"], /* YI SYLLABLE GIET */ + ["\uA1DF", "\uA1DF"], /* YI SYLLABLE GIEX */ + ["\uA1E0", "\uA1E0"], /* YI SYLLABLE GIE */ + ["\uA1E1", "\uA1E1"], /* YI SYLLABLE GIEP */ + ["\uA1E2", "\uA1E2"], /* YI SYLLABLE GAT */ + ["\uA1E3", "\uA1E3"], /* YI SYLLABLE GAX */ + ["\uA1E4", "\uA1E4"], /* YI SYLLABLE GA */ + ["\uA1E5", "\uA1E5"], /* YI SYLLABLE GAP */ + ["\uA1E6", "\uA1E6"], /* YI SYLLABLE GUOT */ + ["\uA1E7", "\uA1E7"], /* YI SYLLABLE GUOX */ + ["\uA1E8", "\uA1E8"], /* YI SYLLABLE GUO */ + ["\uA1E9", "\uA1E9"], /* YI SYLLABLE GUOP */ + ["\uA1EA", "\uA1EA"], /* YI SYLLABLE GOT */ + ["\uA1EB", "\uA1EB"], /* YI SYLLABLE GOX */ + ["\uA1EC", "\uA1EC"], /* YI SYLLABLE GO */ + ["\uA1ED", "\uA1ED"], /* YI SYLLABLE GOP */ + ["\uA1EE", "\uA1EE"], /* YI SYLLABLE GET */ + ["\uA1EF", "\uA1EF"], /* YI SYLLABLE GEX */ + ["\uA1F0", "\uA1F0"], /* YI SYLLABLE GE */ + ["\uA1F1", "\uA1F1"], /* YI SYLLABLE GEP */ + ["\uA1F2", "\uA1F2"], /* YI SYLLABLE GUT */ + ["\uA1F3", "\uA1F3"], /* YI SYLLABLE GUX */ + ["\uA1F4", "\uA1F4"], /* YI SYLLABLE GU */ + ["\uA1F5", "\uA1F5"], /* YI SYLLABLE GUP */ + ["\uA1F6", "\uA1F6"], /* YI SYLLABLE GURX */ + ["\uA1F7", "\uA1F7"], /* YI SYLLABLE GUR */ + ["\uA1F8", "\uA1F8"], /* YI SYLLABLE KIT */ + ["\uA1F9", "\uA1F9"], /* YI SYLLABLE KIX */ + ["\uA1FA", "\uA1FA"], /* YI SYLLABLE KI */ + ["\uA1FB", "\uA1FB"], /* YI SYLLABLE KIP */ + ["\uA1FC", "\uA1FC"], /* YI SYLLABLE KIEX */ + ["\uA1FD", "\uA1FD"], /* YI SYLLABLE KIE */ + ["\uA1FE", "\uA1FE"], /* YI SYLLABLE KIEP */ + ["\uA1FF", "\uA1FF"], /* YI SYLLABLE KAT */ + ["\uA200", "\uA200"], /* YI SYLLABLE KAX */ + ["\uA201", "\uA201"], /* YI SYLLABLE KA */ + ["\uA202", "\uA202"], /* YI SYLLABLE KAP */ + ["\uA203", "\uA203"], /* YI SYLLABLE KUOX */ + ["\uA204", "\uA204"], /* YI SYLLABLE KUO */ + ["\uA205", "\uA205"], /* YI SYLLABLE KUOP */ + ["\uA206", "\uA206"], /* YI SYLLABLE KOT */ + ["\uA207", "\uA207"], /* YI SYLLABLE KOX */ + ["\uA208", "\uA208"], /* YI SYLLABLE KO */ + ["\uA209", "\uA209"], /* YI SYLLABLE KOP */ + ["\uA20A", "\uA20A"], /* YI SYLLABLE KET */ + ["\uA20B", "\uA20B"], /* YI SYLLABLE KEX */ + ["\uA20C", "\uA20C"], /* YI SYLLABLE KE */ + ["\uA20D", "\uA20D"], /* YI SYLLABLE KEP */ + ["\uA20E", "\uA20E"], /* YI SYLLABLE KUT */ + ["\uA20F", "\uA20F"], /* YI SYLLABLE KUX */ + ["\uA210", "\uA210"], /* YI SYLLABLE KU */ + ["\uA211", "\uA211"], /* YI SYLLABLE KUP */ + ["\uA212", "\uA212"], /* YI SYLLABLE KURX */ + ["\uA213", "\uA213"], /* YI SYLLABLE KUR */ + ["\uA214", "\uA214"], /* YI SYLLABLE GGIT */ + ["\uA215", "\uA215"], /* YI SYLLABLE GGIX */ + ["\uA216", "\uA216"], /* YI SYLLABLE GGI */ + ["\uA217", "\uA217"], /* YI SYLLABLE GGIEX */ + ["\uA218", "\uA218"], /* YI SYLLABLE GGIE */ + ["\uA219", "\uA219"], /* YI SYLLABLE GGIEP */ + ["\uA21A", "\uA21A"], /* YI SYLLABLE GGAT */ + ["\uA21B", "\uA21B"], /* YI SYLLABLE GGAX */ + ["\uA21C", "\uA21C"], /* YI SYLLABLE GGA */ + ["\uA21D", "\uA21D"], /* YI SYLLABLE GGAP */ + ["\uA21E", "\uA21E"], /* YI SYLLABLE GGUOT */ + ["\uA21F", "\uA21F"], /* YI SYLLABLE GGUOX */ + ["\uA220", "\uA220"], /* YI SYLLABLE GGUO */ + ["\uA221", "\uA221"], /* YI SYLLABLE GGUOP */ + ["\uA222", "\uA222"], /* YI SYLLABLE GGOT */ + ["\uA223", "\uA223"], /* YI SYLLABLE GGOX */ + ["\uA224", "\uA224"], /* YI SYLLABLE GGO */ + ["\uA225", "\uA225"], /* YI SYLLABLE GGOP */ + ["\uA226", "\uA226"], /* YI SYLLABLE GGET */ + ["\uA227", "\uA227"], /* YI SYLLABLE GGEX */ + ["\uA228", "\uA228"], /* YI SYLLABLE GGE */ + ["\uA229", "\uA229"], /* YI SYLLABLE GGEP */ + ["\uA22A", "\uA22A"], /* YI SYLLABLE GGUT */ + ["\uA22B", "\uA22B"], /* YI SYLLABLE GGUX */ + ["\uA22C", "\uA22C"], /* YI SYLLABLE GGU */ + ["\uA22D", "\uA22D"], /* YI SYLLABLE GGUP */ + ["\uA22E", "\uA22E"], /* YI SYLLABLE GGURX */ + ["\uA22F", "\uA22F"], /* YI SYLLABLE GGUR */ + ["\uA230", "\uA230"], /* YI SYLLABLE MGIEX */ + ["\uA231", "\uA231"], /* YI SYLLABLE MGIE */ + ["\uA232", "\uA232"], /* YI SYLLABLE MGAT */ + ["\uA233", "\uA233"], /* YI SYLLABLE MGAX */ + ["\uA234", "\uA234"], /* YI SYLLABLE MGA */ + ["\uA235", "\uA235"], /* YI SYLLABLE MGAP */ + ["\uA236", "\uA236"], /* YI SYLLABLE MGUOX */ + ["\uA237", "\uA237"], /* YI SYLLABLE MGUO */ + ["\uA238", "\uA238"], /* YI SYLLABLE MGUOP */ + ["\uA239", "\uA239"], /* YI SYLLABLE MGOT */ + ["\uA23A", "\uA23A"], /* YI SYLLABLE MGOX */ + ["\uA23B", "\uA23B"], /* YI SYLLABLE MGO */ + ["\uA23C", "\uA23C"], /* YI SYLLABLE MGOP */ + ["\uA23D", "\uA23D"], /* YI SYLLABLE MGEX */ + ["\uA23E", "\uA23E"], /* YI SYLLABLE MGE */ + ["\uA23F", "\uA23F"], /* YI SYLLABLE MGEP */ + ["\uA240", "\uA240"], /* YI SYLLABLE MGUT */ + ["\uA241", "\uA241"], /* YI SYLLABLE MGUX */ + ["\uA242", "\uA242"], /* YI SYLLABLE MGU */ + ["\uA243", "\uA243"], /* YI SYLLABLE MGUP */ + ["\uA244", "\uA244"], /* YI SYLLABLE MGURX */ + ["\uA245", "\uA245"], /* YI SYLLABLE MGUR */ + ["\uA246", "\uA246"], /* YI SYLLABLE HXIT */ + ["\uA247", "\uA247"], /* YI SYLLABLE HXIX */ + ["\uA248", "\uA248"], /* YI SYLLABLE HXI */ + ["\uA249", "\uA249"], /* YI SYLLABLE HXIP */ + ["\uA24A", "\uA24A"], /* YI SYLLABLE HXIET */ + ["\uA24B", "\uA24B"], /* YI SYLLABLE HXIEX */ + ["\uA24C", "\uA24C"], /* YI SYLLABLE HXIE */ + ["\uA24D", "\uA24D"], /* YI SYLLABLE HXIEP */ + ["\uA24E", "\uA24E"], /* YI SYLLABLE HXAT */ + ["\uA24F", "\uA24F"], /* YI SYLLABLE HXAX */ + ["\uA250", "\uA250"], /* YI SYLLABLE HXA */ + ["\uA251", "\uA251"], /* YI SYLLABLE HXAP */ + ["\uA252", "\uA252"], /* YI SYLLABLE HXUOT */ + ["\uA253", "\uA253"], /* YI SYLLABLE HXUOX */ + ["\uA254", "\uA254"], /* YI SYLLABLE HXUO */ + ["\uA255", "\uA255"], /* YI SYLLABLE HXUOP */ + ["\uA256", "\uA256"], /* YI SYLLABLE HXOT */ + ["\uA257", "\uA257"], /* YI SYLLABLE HXOX */ + ["\uA258", "\uA258"], /* YI SYLLABLE HXO */ + ["\uA259", "\uA259"], /* YI SYLLABLE HXOP */ + ["\uA25A", "\uA25A"], /* YI SYLLABLE HXEX */ + ["\uA25B", "\uA25B"], /* YI SYLLABLE HXE */ + ["\uA25C", "\uA25C"], /* YI SYLLABLE HXEP */ + ["\uA25D", "\uA25D"], /* YI SYLLABLE NGIEX */ + ["\uA25E", "\uA25E"], /* YI SYLLABLE NGIE */ + ["\uA25F", "\uA25F"], /* YI SYLLABLE NGIEP */ + ["\uA260", "\uA260"], /* YI SYLLABLE NGAT */ + ["\uA261", "\uA261"], /* YI SYLLABLE NGAX */ + ["\uA262", "\uA262"], /* YI SYLLABLE NGA */ + ["\uA263", "\uA263"], /* YI SYLLABLE NGAP */ + ["\uA264", "\uA264"], /* YI SYLLABLE NGUOT */ + ["\uA265", "\uA265"], /* YI SYLLABLE NGUOX */ + ["\uA266", "\uA266"], /* YI SYLLABLE NGUO */ + ["\uA267", "\uA267"], /* YI SYLLABLE NGOT */ + ["\uA268", "\uA268"], /* YI SYLLABLE NGOX */ + ["\uA269", "\uA269"], /* YI SYLLABLE NGO */ + ["\uA26A", "\uA26A"], /* YI SYLLABLE NGOP */ + ["\uA26B", "\uA26B"], /* YI SYLLABLE NGEX */ + ["\uA26C", "\uA26C"], /* YI SYLLABLE NGE */ + ["\uA26D", "\uA26D"], /* YI SYLLABLE NGEP */ + ["\uA26E", "\uA26E"], /* YI SYLLABLE HIT */ + ["\uA26F", "\uA26F"], /* YI SYLLABLE HIEX */ + ["\uA270", "\uA270"], /* YI SYLLABLE HIE */ + ["\uA271", "\uA271"], /* YI SYLLABLE HAT */ + ["\uA272", "\uA272"], /* YI SYLLABLE HAX */ + ["\uA273", "\uA273"], /* YI SYLLABLE HA */ + ["\uA274", "\uA274"], /* YI SYLLABLE HAP */ + ["\uA275", "\uA275"], /* YI SYLLABLE HUOT */ + ["\uA276", "\uA276"], /* YI SYLLABLE HUOX */ + ["\uA277", "\uA277"], /* YI SYLLABLE HUO */ + ["\uA278", "\uA278"], /* YI SYLLABLE HUOP */ + ["\uA279", "\uA279"], /* YI SYLLABLE HOT */ + ["\uA27A", "\uA27A"], /* YI SYLLABLE HOX */ + ["\uA27B", "\uA27B"], /* YI SYLLABLE HO */ + ["\uA27C", "\uA27C"], /* YI SYLLABLE HOP */ + ["\uA27D", "\uA27D"], /* YI SYLLABLE HEX */ + ["\uA27E", "\uA27E"], /* YI SYLLABLE HE */ + ["\uA27F", "\uA27F"], /* YI SYLLABLE HEP */ + ["\uA280", "\uA280"], /* YI SYLLABLE WAT */ + ["\uA281", "\uA281"], /* YI SYLLABLE WAX */ + ["\uA282", "\uA282"], /* YI SYLLABLE WA */ + ["\uA283", "\uA283"], /* YI SYLLABLE WAP */ + ["\uA284", "\uA284"], /* YI SYLLABLE WUOX */ + ["\uA285", "\uA285"], /* YI SYLLABLE WUO */ + ["\uA286", "\uA286"], /* YI SYLLABLE WUOP */ + ["\uA287", "\uA287"], /* YI SYLLABLE WOX */ + ["\uA288", "\uA288"], /* YI SYLLABLE WO */ + ["\uA289", "\uA289"], /* YI SYLLABLE WOP */ + ["\uA28A", "\uA28A"], /* YI SYLLABLE WEX */ + ["\uA28B", "\uA28B"], /* YI SYLLABLE WE */ + ["\uA28C", "\uA28C"], /* YI SYLLABLE WEP */ + ["\uA28D", "\uA28D"], /* YI SYLLABLE ZIT */ + ["\uA28E", "\uA28E"], /* YI SYLLABLE ZIX */ + ["\uA28F", "\uA28F"], /* YI SYLLABLE ZI */ + ["\uA290", "\uA290"], /* YI SYLLABLE ZIP */ + ["\uA291", "\uA291"], /* YI SYLLABLE ZIEX */ + ["\uA292", "\uA292"], /* YI SYLLABLE ZIE */ + ["\uA293", "\uA293"], /* YI SYLLABLE ZIEP */ + ["\uA294", "\uA294"], /* YI SYLLABLE ZAT */ + ["\uA295", "\uA295"], /* YI SYLLABLE ZAX */ + ["\uA296", "\uA296"], /* YI SYLLABLE ZA */ + ["\uA297", "\uA297"], /* YI SYLLABLE ZAP */ + ["\uA298", "\uA298"], /* YI SYLLABLE ZUOX */ + ["\uA299", "\uA299"], /* YI SYLLABLE ZUO */ + ["\uA29A", "\uA29A"], /* YI SYLLABLE ZUOP */ + ["\uA29B", "\uA29B"], /* YI SYLLABLE ZOT */ + ["\uA29C", "\uA29C"], /* YI SYLLABLE ZOX */ + ["\uA29D", "\uA29D"], /* YI SYLLABLE ZO */ + ["\uA29E", "\uA29E"], /* YI SYLLABLE ZOP */ + ["\uA29F", "\uA29F"], /* YI SYLLABLE ZEX */ + ["\uA2A0", "\uA2A0"], /* YI SYLLABLE ZE */ + ["\uA2A1", "\uA2A1"], /* YI SYLLABLE ZEP */ + ["\uA2A2", "\uA2A2"], /* YI SYLLABLE ZUT */ + ["\uA2A3", "\uA2A3"], /* YI SYLLABLE ZUX */ + ["\uA2A4", "\uA2A4"], /* YI SYLLABLE ZU */ + ["\uA2A5", "\uA2A5"], /* YI SYLLABLE ZUP */ + ["\uA2A6", "\uA2A6"], /* YI SYLLABLE ZURX */ + ["\uA2A7", "\uA2A7"], /* YI SYLLABLE ZUR */ + ["\uA2A8", "\uA2A8"], /* YI SYLLABLE ZYT */ + ["\uA2A9", "\uA2A9"], /* YI SYLLABLE ZYX */ + ["\uA2AA", "\uA2AA"], /* YI SYLLABLE ZY */ + ["\uA2AB", "\uA2AB"], /* YI SYLLABLE ZYP */ + ["\uA2AC", "\uA2AC"], /* YI SYLLABLE ZYRX */ + ["\uA2AD", "\uA2AD"], /* YI SYLLABLE ZYR */ + ["\uA2AE", "\uA2AE"], /* YI SYLLABLE CIT */ + ["\uA2AF", "\uA2AF"], /* YI SYLLABLE CIX */ + ["\uA2B0", "\uA2B0"], /* YI SYLLABLE CI */ + ["\uA2B1", "\uA2B1"], /* YI SYLLABLE CIP */ + ["\uA2B2", "\uA2B2"], /* YI SYLLABLE CIET */ + ["\uA2B3", "\uA2B3"], /* YI SYLLABLE CIEX */ + ["\uA2B4", "\uA2B4"], /* YI SYLLABLE CIE */ + ["\uA2B5", "\uA2B5"], /* YI SYLLABLE CIEP */ + ["\uA2B6", "\uA2B6"], /* YI SYLLABLE CAT */ + ["\uA2B7", "\uA2B7"], /* YI SYLLABLE CAX */ + ["\uA2B8", "\uA2B8"], /* YI SYLLABLE CA */ + ["\uA2B9", "\uA2B9"], /* YI SYLLABLE CAP */ + ["\uA2BA", "\uA2BA"], /* YI SYLLABLE CUOX */ + ["\uA2BB", "\uA2BB"], /* YI SYLLABLE CUO */ + ["\uA2BC", "\uA2BC"], /* YI SYLLABLE CUOP */ + ["\uA2BD", "\uA2BD"], /* YI SYLLABLE COT */ + ["\uA2BE", "\uA2BE"], /* YI SYLLABLE COX */ + ["\uA2BF", "\uA2BF"], /* YI SYLLABLE CO */ + ["\uA2C0", "\uA2C0"], /* YI SYLLABLE COP */ + ["\uA2C1", "\uA2C1"], /* YI SYLLABLE CEX */ + ["\uA2C2", "\uA2C2"], /* YI SYLLABLE CE */ + ["\uA2C3", "\uA2C3"], /* YI SYLLABLE CEP */ + ["\uA2C4", "\uA2C4"], /* YI SYLLABLE CUT */ + ["\uA2C5", "\uA2C5"], /* YI SYLLABLE CUX */ + ["\uA2C6", "\uA2C6"], /* YI SYLLABLE CU */ + ["\uA2C7", "\uA2C7"], /* YI SYLLABLE CUP */ + ["\uA2C8", "\uA2C8"], /* YI SYLLABLE CURX */ + ["\uA2C9", "\uA2C9"], /* YI SYLLABLE CUR */ + ["\uA2CA", "\uA2CA"], /* YI SYLLABLE CYT */ + ["\uA2CB", "\uA2CB"], /* YI SYLLABLE CYX */ + ["\uA2CC", "\uA2CC"], /* YI SYLLABLE CY */ + ["\uA2CD", "\uA2CD"], /* YI SYLLABLE CYP */ + ["\uA2CE", "\uA2CE"], /* YI SYLLABLE CYRX */ + ["\uA2CF", "\uA2CF"], /* YI SYLLABLE CYR */ + ["\uA2D0", "\uA2D0"], /* YI SYLLABLE ZZIT */ + ["\uA2D1", "\uA2D1"], /* YI SYLLABLE ZZIX */ + ["\uA2D2", "\uA2D2"], /* YI SYLLABLE ZZI */ + ["\uA2D3", "\uA2D3"], /* YI SYLLABLE ZZIP */ + ["\uA2D4", "\uA2D4"], /* YI SYLLABLE ZZIET */ + ["\uA2D5", "\uA2D5"], /* YI SYLLABLE ZZIEX */ + ["\uA2D6", "\uA2D6"], /* YI SYLLABLE ZZIE */ + ["\uA2D7", "\uA2D7"], /* YI SYLLABLE ZZIEP */ + ["\uA2D8", "\uA2D8"], /* YI SYLLABLE ZZAT */ + ["\uA2D9", "\uA2D9"], /* YI SYLLABLE ZZAX */ + ["\uA2DA", "\uA2DA"], /* YI SYLLABLE ZZA */ + ["\uA2DB", "\uA2DB"], /* YI SYLLABLE ZZAP */ + ["\uA2DC", "\uA2DC"], /* YI SYLLABLE ZZOX */ + ["\uA2DD", "\uA2DD"], /* YI SYLLABLE ZZO */ + ["\uA2DE", "\uA2DE"], /* YI SYLLABLE ZZOP */ + ["\uA2DF", "\uA2DF"], /* YI SYLLABLE ZZEX */ + ["\uA2E0", "\uA2E0"], /* YI SYLLABLE ZZE */ + ["\uA2E1", "\uA2E1"], /* YI SYLLABLE ZZEP */ + ["\uA2E2", "\uA2E2"], /* YI SYLLABLE ZZUX */ + ["\uA2E3", "\uA2E3"], /* YI SYLLABLE ZZU */ + ["\uA2E4", "\uA2E4"], /* YI SYLLABLE ZZUP */ + ["\uA2E5", "\uA2E5"], /* YI SYLLABLE ZZURX */ + ["\uA2E6", "\uA2E6"], /* YI SYLLABLE ZZUR */ + ["\uA2E7", "\uA2E7"], /* YI SYLLABLE ZZYT */ + ["\uA2E8", "\uA2E8"], /* YI SYLLABLE ZZYX */ + ["\uA2E9", "\uA2E9"], /* YI SYLLABLE ZZY */ + ["\uA2EA", "\uA2EA"], /* YI SYLLABLE ZZYP */ + ["\uA2EB", "\uA2EB"], /* YI SYLLABLE ZZYRX */ + ["\uA2EC", "\uA2EC"], /* YI SYLLABLE ZZYR */ + ["\uA2ED", "\uA2ED"], /* YI SYLLABLE NZIT */ + ["\uA2EE", "\uA2EE"], /* YI SYLLABLE NZIX */ + ["\uA2EF", "\uA2EF"], /* YI SYLLABLE NZI */ + ["\uA2F0", "\uA2F0"], /* YI SYLLABLE NZIP */ + ["\uA2F1", "\uA2F1"], /* YI SYLLABLE NZIEX */ + ["\uA2F2", "\uA2F2"], /* YI SYLLABLE NZIE */ + ["\uA2F3", "\uA2F3"], /* YI SYLLABLE NZIEP */ + ["\uA2F4", "\uA2F4"], /* YI SYLLABLE NZAT */ + ["\uA2F5", "\uA2F5"], /* YI SYLLABLE NZAX */ + ["\uA2F6", "\uA2F6"], /* YI SYLLABLE NZA */ + ["\uA2F7", "\uA2F7"], /* YI SYLLABLE NZAP */ + ["\uA2F8", "\uA2F8"], /* YI SYLLABLE NZUOX */ + ["\uA2F9", "\uA2F9"], /* YI SYLLABLE NZUO */ + ["\uA2FA", "\uA2FA"], /* YI SYLLABLE NZOX */ + ["\uA2FB", "\uA2FB"], /* YI SYLLABLE NZOP */ + ["\uA2FC", "\uA2FC"], /* YI SYLLABLE NZEX */ + ["\uA2FD", "\uA2FD"], /* YI SYLLABLE NZE */ + ["\uA2FE", "\uA2FE"], /* YI SYLLABLE NZUX */ + ["\uA2FF", "\uA2FF"], /* YI SYLLABLE NZU */ + ["\uA300", "\uA300"], /* YI SYLLABLE NZUP */ + ["\uA301", "\uA301"], /* YI SYLLABLE NZURX */ + ["\uA302", "\uA302"], /* YI SYLLABLE NZUR */ + ["\uA303", "\uA303"], /* YI SYLLABLE NZYT */ + ["\uA304", "\uA304"], /* YI SYLLABLE NZYX */ + ["\uA305", "\uA305"], /* YI SYLLABLE NZY */ + ["\uA306", "\uA306"], /* YI SYLLABLE NZYP */ + ["\uA307", "\uA307"], /* YI SYLLABLE NZYRX */ + ["\uA308", "\uA308"], /* YI SYLLABLE NZYR */ + ["\uA309", "\uA309"], /* YI SYLLABLE SIT */ + ["\uA30A", "\uA30A"], /* YI SYLLABLE SIX */ + ["\uA30B", "\uA30B"], /* YI SYLLABLE SI */ + ["\uA30C", "\uA30C"], /* YI SYLLABLE SIP */ + ["\uA30D", "\uA30D"], /* YI SYLLABLE SIEX */ + ["\uA30E", "\uA30E"], /* YI SYLLABLE SIE */ + ["\uA30F", "\uA30F"], /* YI SYLLABLE SIEP */ + ["\uA310", "\uA310"], /* YI SYLLABLE SAT */ + ["\uA311", "\uA311"], /* YI SYLLABLE SAX */ + ["\uA312", "\uA312"], /* YI SYLLABLE SA */ + ["\uA313", "\uA313"], /* YI SYLLABLE SAP */ + ["\uA314", "\uA314"], /* YI SYLLABLE SUOX */ + ["\uA315", "\uA315"], /* YI SYLLABLE SUO */ + ["\uA316", "\uA316"], /* YI SYLLABLE SUOP */ + ["\uA317", "\uA317"], /* YI SYLLABLE SOT */ + ["\uA318", "\uA318"], /* YI SYLLABLE SOX */ + ["\uA319", "\uA319"], /* YI SYLLABLE SO */ + ["\uA31A", "\uA31A"], /* YI SYLLABLE SOP */ + ["\uA31B", "\uA31B"], /* YI SYLLABLE SEX */ + ["\uA31C", "\uA31C"], /* YI SYLLABLE SE */ + ["\uA31D", "\uA31D"], /* YI SYLLABLE SEP */ + ["\uA31E", "\uA31E"], /* YI SYLLABLE SUT */ + ["\uA31F", "\uA31F"], /* YI SYLLABLE SUX */ + ["\uA320", "\uA320"], /* YI SYLLABLE SU */ + ["\uA321", "\uA321"], /* YI SYLLABLE SUP */ + ["\uA322", "\uA322"], /* YI SYLLABLE SURX */ + ["\uA323", "\uA323"], /* YI SYLLABLE SUR */ + ["\uA324", "\uA324"], /* YI SYLLABLE SYT */ + ["\uA325", "\uA325"], /* YI SYLLABLE SYX */ + ["\uA326", "\uA326"], /* YI SYLLABLE SY */ + ["\uA327", "\uA327"], /* YI SYLLABLE SYP */ + ["\uA328", "\uA328"], /* YI SYLLABLE SYRX */ + ["\uA329", "\uA329"], /* YI SYLLABLE SYR */ + ["\uA32A", "\uA32A"], /* YI SYLLABLE SSIT */ + ["\uA32B", "\uA32B"], /* YI SYLLABLE SSIX */ + ["\uA32C", "\uA32C"], /* YI SYLLABLE SSI */ + ["\uA32D", "\uA32D"], /* YI SYLLABLE SSIP */ + ["\uA32E", "\uA32E"], /* YI SYLLABLE SSIEX */ + ["\uA32F", "\uA32F"], /* YI SYLLABLE SSIE */ + ["\uA330", "\uA330"], /* YI SYLLABLE SSIEP */ + ["\uA331", "\uA331"], /* YI SYLLABLE SSAT */ + ["\uA332", "\uA332"], /* YI SYLLABLE SSAX */ + ["\uA333", "\uA333"], /* YI SYLLABLE SSA */ + ["\uA334", "\uA334"], /* YI SYLLABLE SSAP */ + ["\uA335", "\uA335"], /* YI SYLLABLE SSOT */ + ["\uA336", "\uA336"], /* YI SYLLABLE SSOX */ + ["\uA337", "\uA337"], /* YI SYLLABLE SSO */ + ["\uA338", "\uA338"], /* YI SYLLABLE SSOP */ + ["\uA339", "\uA339"], /* YI SYLLABLE SSEX */ + ["\uA33A", "\uA33A"], /* YI SYLLABLE SSE */ + ["\uA33B", "\uA33B"], /* YI SYLLABLE SSEP */ + ["\uA33C", "\uA33C"], /* YI SYLLABLE SSUT */ + ["\uA33D", "\uA33D"], /* YI SYLLABLE SSUX */ + ["\uA33E", "\uA33E"], /* YI SYLLABLE SSU */ + ["\uA33F", "\uA33F"], /* YI SYLLABLE SSUP */ + ["\uA340", "\uA340"], /* YI SYLLABLE SSYT */ + ["\uA341", "\uA341"], /* YI SYLLABLE SSYX */ + ["\uA342", "\uA342"], /* YI SYLLABLE SSY */ + ["\uA343", "\uA343"], /* YI SYLLABLE SSYP */ + ["\uA344", "\uA344"], /* YI SYLLABLE SSYRX */ + ["\uA345", "\uA345"], /* YI SYLLABLE SSYR */ + ["\uA346", "\uA346"], /* YI SYLLABLE ZHAT */ + ["\uA347", "\uA347"], /* YI SYLLABLE ZHAX */ + ["\uA348", "\uA348"], /* YI SYLLABLE ZHA */ + ["\uA349", "\uA349"], /* YI SYLLABLE ZHAP */ + ["\uA34A", "\uA34A"], /* YI SYLLABLE ZHUOX */ + ["\uA34B", "\uA34B"], /* YI SYLLABLE ZHUO */ + ["\uA34C", "\uA34C"], /* YI SYLLABLE ZHUOP */ + ["\uA34D", "\uA34D"], /* YI SYLLABLE ZHOT */ + ["\uA34E", "\uA34E"], /* YI SYLLABLE ZHOX */ + ["\uA34F", "\uA34F"], /* YI SYLLABLE ZHO */ + ["\uA350", "\uA350"], /* YI SYLLABLE ZHOP */ + ["\uA351", "\uA351"], /* YI SYLLABLE ZHET */ + ["\uA352", "\uA352"], /* YI SYLLABLE ZHEX */ + ["\uA353", "\uA353"], /* YI SYLLABLE ZHE */ + ["\uA354", "\uA354"], /* YI SYLLABLE ZHEP */ + ["\uA355", "\uA355"], /* YI SYLLABLE ZHUT */ + ["\uA356", "\uA356"], /* YI SYLLABLE ZHUX */ + ["\uA357", "\uA357"], /* YI SYLLABLE ZHU */ + ["\uA358", "\uA358"], /* YI SYLLABLE ZHUP */ + ["\uA359", "\uA359"], /* YI SYLLABLE ZHURX */ + ["\uA35A", "\uA35A"], /* YI SYLLABLE ZHUR */ + ["\uA35B", "\uA35B"], /* YI SYLLABLE ZHYT */ + ["\uA35C", "\uA35C"], /* YI SYLLABLE ZHYX */ + ["\uA35D", "\uA35D"], /* YI SYLLABLE ZHY */ + ["\uA35E", "\uA35E"], /* YI SYLLABLE ZHYP */ + ["\uA35F", "\uA35F"], /* YI SYLLABLE ZHYRX */ + ["\uA360", "\uA360"], /* YI SYLLABLE ZHYR */ + ["\uA361", "\uA361"], /* YI SYLLABLE CHAT */ + ["\uA362", "\uA362"], /* YI SYLLABLE CHAX */ + ["\uA363", "\uA363"], /* YI SYLLABLE CHA */ + ["\uA364", "\uA364"], /* YI SYLLABLE CHAP */ + ["\uA365", "\uA365"], /* YI SYLLABLE CHUOT */ + ["\uA366", "\uA366"], /* YI SYLLABLE CHUOX */ + ["\uA367", "\uA367"], /* YI SYLLABLE CHUO */ + ["\uA368", "\uA368"], /* YI SYLLABLE CHUOP */ + ["\uA369", "\uA369"], /* YI SYLLABLE CHOT */ + ["\uA36A", "\uA36A"], /* YI SYLLABLE CHOX */ + ["\uA36B", "\uA36B"], /* YI SYLLABLE CHO */ + ["\uA36C", "\uA36C"], /* YI SYLLABLE CHOP */ + ["\uA36D", "\uA36D"], /* YI SYLLABLE CHET */ + ["\uA36E", "\uA36E"], /* YI SYLLABLE CHEX */ + ["\uA36F", "\uA36F"], /* YI SYLLABLE CHE */ + ["\uA370", "\uA370"], /* YI SYLLABLE CHEP */ + ["\uA371", "\uA371"], /* YI SYLLABLE CHUX */ + ["\uA372", "\uA372"], /* YI SYLLABLE CHU */ + ["\uA373", "\uA373"], /* YI SYLLABLE CHUP */ + ["\uA374", "\uA374"], /* YI SYLLABLE CHURX */ + ["\uA375", "\uA375"], /* YI SYLLABLE CHUR */ + ["\uA376", "\uA376"], /* YI SYLLABLE CHYT */ + ["\uA377", "\uA377"], /* YI SYLLABLE CHYX */ + ["\uA378", "\uA378"], /* YI SYLLABLE CHY */ + ["\uA379", "\uA379"], /* YI SYLLABLE CHYP */ + ["\uA37A", "\uA37A"], /* YI SYLLABLE CHYRX */ + ["\uA37B", "\uA37B"], /* YI SYLLABLE CHYR */ + ["\uA37C", "\uA37C"], /* YI SYLLABLE RRAX */ + ["\uA37D", "\uA37D"], /* YI SYLLABLE RRA */ + ["\uA37E", "\uA37E"], /* YI SYLLABLE RRUOX */ + ["\uA37F", "\uA37F"], /* YI SYLLABLE RRUO */ + ["\uA380", "\uA380"], /* YI SYLLABLE RROT */ + ["\uA381", "\uA381"], /* YI SYLLABLE RROX */ + ["\uA382", "\uA382"], /* YI SYLLABLE RRO */ + ["\uA383", "\uA383"], /* YI SYLLABLE RROP */ + ["\uA384", "\uA384"], /* YI SYLLABLE RRET */ + ["\uA385", "\uA385"], /* YI SYLLABLE RREX */ + ["\uA386", "\uA386"], /* YI SYLLABLE RRE */ + ["\uA387", "\uA387"], /* YI SYLLABLE RREP */ + ["\uA388", "\uA388"], /* YI SYLLABLE RRUT */ + ["\uA389", "\uA389"], /* YI SYLLABLE RRUX */ + ["\uA38A", "\uA38A"], /* YI SYLLABLE RRU */ + ["\uA38B", "\uA38B"], /* YI SYLLABLE RRUP */ + ["\uA38C", "\uA38C"], /* YI SYLLABLE RRURX */ + ["\uA38D", "\uA38D"], /* YI SYLLABLE RRUR */ + ["\uA38E", "\uA38E"], /* YI SYLLABLE RRYT */ + ["\uA38F", "\uA38F"], /* YI SYLLABLE RRYX */ + ["\uA390", "\uA390"], /* YI SYLLABLE RRY */ + ["\uA391", "\uA391"], /* YI SYLLABLE RRYP */ + ["\uA392", "\uA392"], /* YI SYLLABLE RRYRX */ + ["\uA393", "\uA393"], /* YI SYLLABLE RRYR */ + ["\uA394", "\uA394"], /* YI SYLLABLE NRAT */ + ["\uA395", "\uA395"], /* YI SYLLABLE NRAX */ + ["\uA396", "\uA396"], /* YI SYLLABLE NRA */ + ["\uA397", "\uA397"], /* YI SYLLABLE NRAP */ + ["\uA398", "\uA398"], /* YI SYLLABLE NROX */ + ["\uA399", "\uA399"], /* YI SYLLABLE NRO */ + ["\uA39A", "\uA39A"], /* YI SYLLABLE NROP */ + ["\uA39B", "\uA39B"], /* YI SYLLABLE NRET */ + ["\uA39C", "\uA39C"], /* YI SYLLABLE NREX */ + ["\uA39D", "\uA39D"], /* YI SYLLABLE NRE */ + ["\uA39E", "\uA39E"], /* YI SYLLABLE NREP */ + ["\uA39F", "\uA39F"], /* YI SYLLABLE NRUT */ + ["\uA3A0", "\uA3A0"], /* YI SYLLABLE NRUX */ + ["\uA3A1", "\uA3A1"], /* YI SYLLABLE NRU */ + ["\uA3A2", "\uA3A2"], /* YI SYLLABLE NRUP */ + ["\uA3A3", "\uA3A3"], /* YI SYLLABLE NRURX */ + ["\uA3A4", "\uA3A4"], /* YI SYLLABLE NRUR */ + ["\uA3A5", "\uA3A5"], /* YI SYLLABLE NRYT */ + ["\uA3A6", "\uA3A6"], /* YI SYLLABLE NRYX */ + ["\uA3A7", "\uA3A7"], /* YI SYLLABLE NRY */ + ["\uA3A8", "\uA3A8"], /* YI SYLLABLE NRYP */ + ["\uA3A9", "\uA3A9"], /* YI SYLLABLE NRYRX */ + ["\uA3AA", "\uA3AA"], /* YI SYLLABLE NRYR */ + ["\uA3AB", "\uA3AB"], /* YI SYLLABLE SHAT */ + ["\uA3AC", "\uA3AC"], /* YI SYLLABLE SHAX */ + ["\uA3AD", "\uA3AD"], /* YI SYLLABLE SHA */ + ["\uA3AE", "\uA3AE"], /* YI SYLLABLE SHAP */ + ["\uA3AF", "\uA3AF"], /* YI SYLLABLE SHUOX */ + ["\uA3B0", "\uA3B0"], /* YI SYLLABLE SHUO */ + ["\uA3B1", "\uA3B1"], /* YI SYLLABLE SHUOP */ + ["\uA3B2", "\uA3B2"], /* YI SYLLABLE SHOT */ + ["\uA3B3", "\uA3B3"], /* YI SYLLABLE SHOX */ + ["\uA3B4", "\uA3B4"], /* YI SYLLABLE SHO */ + ["\uA3B5", "\uA3B5"], /* YI SYLLABLE SHOP */ + ["\uA3B6", "\uA3B6"], /* YI SYLLABLE SHET */ + ["\uA3B7", "\uA3B7"], /* YI SYLLABLE SHEX */ + ["\uA3B8", "\uA3B8"], /* YI SYLLABLE SHE */ + ["\uA3B9", "\uA3B9"], /* YI SYLLABLE SHEP */ + ["\uA3BA", "\uA3BA"], /* YI SYLLABLE SHUT */ + ["\uA3BB", "\uA3BB"], /* YI SYLLABLE SHUX */ + ["\uA3BC", "\uA3BC"], /* YI SYLLABLE SHU */ + ["\uA3BD", "\uA3BD"], /* YI SYLLABLE SHUP */ + ["\uA3BE", "\uA3BE"], /* YI SYLLABLE SHURX */ + ["\uA3BF", "\uA3BF"], /* YI SYLLABLE SHUR */ + ["\uA3C0", "\uA3C0"], /* YI SYLLABLE SHYT */ + ["\uA3C1", "\uA3C1"], /* YI SYLLABLE SHYX */ + ["\uA3C2", "\uA3C2"], /* YI SYLLABLE SHY */ + ["\uA3C3", "\uA3C3"], /* YI SYLLABLE SHYP */ + ["\uA3C4", "\uA3C4"], /* YI SYLLABLE SHYRX */ + ["\uA3C5", "\uA3C5"], /* YI SYLLABLE SHYR */ + ["\uA3C6", "\uA3C6"], /* YI SYLLABLE RAT */ + ["\uA3C7", "\uA3C7"], /* YI SYLLABLE RAX */ + ["\uA3C8", "\uA3C8"], /* YI SYLLABLE RA */ + ["\uA3C9", "\uA3C9"], /* YI SYLLABLE RAP */ + ["\uA3CA", "\uA3CA"], /* YI SYLLABLE RUOX */ + ["\uA3CB", "\uA3CB"], /* YI SYLLABLE RUO */ + ["\uA3CC", "\uA3CC"], /* YI SYLLABLE RUOP */ + ["\uA3CD", "\uA3CD"], /* YI SYLLABLE ROT */ + ["\uA3CE", "\uA3CE"], /* YI SYLLABLE ROX */ + ["\uA3CF", "\uA3CF"], /* YI SYLLABLE RO */ + ["\uA3D0", "\uA3D0"], /* YI SYLLABLE ROP */ + ["\uA3D1", "\uA3D1"], /* YI SYLLABLE REX */ + ["\uA3D2", "\uA3D2"], /* YI SYLLABLE RE */ + ["\uA3D3", "\uA3D3"], /* YI SYLLABLE REP */ + ["\uA3D4", "\uA3D4"], /* YI SYLLABLE RUT */ + ["\uA3D5", "\uA3D5"], /* YI SYLLABLE RUX */ + ["\uA3D6", "\uA3D6"], /* YI SYLLABLE RU */ + ["\uA3D7", "\uA3D7"], /* YI SYLLABLE RUP */ + ["\uA3D8", "\uA3D8"], /* YI SYLLABLE RURX */ + ["\uA3D9", "\uA3D9"], /* YI SYLLABLE RUR */ + ["\uA3DA", "\uA3DA"], /* YI SYLLABLE RYT */ + ["\uA3DB", "\uA3DB"], /* YI SYLLABLE RYX */ + ["\uA3DC", "\uA3DC"], /* YI SYLLABLE RY */ + ["\uA3DD", "\uA3DD"], /* YI SYLLABLE RYP */ + ["\uA3DE", "\uA3DE"], /* YI SYLLABLE RYRX */ + ["\uA3DF", "\uA3DF"], /* YI SYLLABLE RYR */ + ["\uA3E0", "\uA3E0"], /* YI SYLLABLE JIT */ + ["\uA3E1", "\uA3E1"], /* YI SYLLABLE JIX */ + ["\uA3E2", "\uA3E2"], /* YI SYLLABLE JI */ + ["\uA3E3", "\uA3E3"], /* YI SYLLABLE JIP */ + ["\uA3E4", "\uA3E4"], /* YI SYLLABLE JIET */ + ["\uA3E5", "\uA3E5"], /* YI SYLLABLE JIEX */ + ["\uA3E6", "\uA3E6"], /* YI SYLLABLE JIE */ + ["\uA3E7", "\uA3E7"], /* YI SYLLABLE JIEP */ + ["\uA3E8", "\uA3E8"], /* YI SYLLABLE JUOT */ + ["\uA3E9", "\uA3E9"], /* YI SYLLABLE JUOX */ + ["\uA3EA", "\uA3EA"], /* YI SYLLABLE JUO */ + ["\uA3EB", "\uA3EB"], /* YI SYLLABLE JUOP */ + ["\uA3EC", "\uA3EC"], /* YI SYLLABLE JOT */ + ["\uA3ED", "\uA3ED"], /* YI SYLLABLE JOX */ + ["\uA3EE", "\uA3EE"], /* YI SYLLABLE JO */ + ["\uA3EF", "\uA3EF"], /* YI SYLLABLE JOP */ + ["\uA3F0", "\uA3F0"], /* YI SYLLABLE JUT */ + ["\uA3F1", "\uA3F1"], /* YI SYLLABLE JUX */ + ["\uA3F2", "\uA3F2"], /* YI SYLLABLE JU */ + ["\uA3F3", "\uA3F3"], /* YI SYLLABLE JUP */ + ["\uA3F4", "\uA3F4"], /* YI SYLLABLE JURX */ + ["\uA3F5", "\uA3F5"], /* YI SYLLABLE JUR */ + ["\uA3F6", "\uA3F6"], /* YI SYLLABLE JYT */ + ["\uA3F7", "\uA3F7"], /* YI SYLLABLE JYX */ + ["\uA3F8", "\uA3F8"], /* YI SYLLABLE JY */ + ["\uA3F9", "\uA3F9"], /* YI SYLLABLE JYP */ + ["\uA3FA", "\uA3FA"], /* YI SYLLABLE JYRX */ + ["\uA3FB", "\uA3FB"], /* YI SYLLABLE JYR */ + ["\uA3FC", "\uA3FC"], /* YI SYLLABLE QIT */ + ["\uA3FD", "\uA3FD"], /* YI SYLLABLE QIX */ + ["\uA3FE", "\uA3FE"], /* YI SYLLABLE QI */ + ["\uA3FF", "\uA3FF"], /* YI SYLLABLE QIP */ + ["\uA400", "\uA400"], /* YI SYLLABLE QIET */ + ["\uA401", "\uA401"], /* YI SYLLABLE QIEX */ + ["\uA402", "\uA402"], /* YI SYLLABLE QIE */ + ["\uA403", "\uA403"], /* YI SYLLABLE QIEP */ + ["\uA404", "\uA404"], /* YI SYLLABLE QUOT */ + ["\uA405", "\uA405"], /* YI SYLLABLE QUOX */ + ["\uA406", "\uA406"], /* YI SYLLABLE QUO */ + ["\uA407", "\uA407"], /* YI SYLLABLE QUOP */ + ["\uA408", "\uA408"], /* YI SYLLABLE QOT */ + ["\uA409", "\uA409"], /* YI SYLLABLE QOX */ + ["\uA40A", "\uA40A"], /* YI SYLLABLE QO */ + ["\uA40B", "\uA40B"], /* YI SYLLABLE QOP */ + ["\uA40C", "\uA40C"], /* YI SYLLABLE QUT */ + ["\uA40D", "\uA40D"], /* YI SYLLABLE QUX */ + ["\uA40E", "\uA40E"], /* YI SYLLABLE QU */ + ["\uA40F", "\uA40F"], /* YI SYLLABLE QUP */ + ["\uA410", "\uA410"], /* YI SYLLABLE QURX */ + ["\uA411", "\uA411"], /* YI SYLLABLE QUR */ + ["\uA412", "\uA412"], /* YI SYLLABLE QYT */ + ["\uA413", "\uA413"], /* YI SYLLABLE QYX */ + ["\uA414", "\uA414"], /* YI SYLLABLE QY */ + ["\uA415", "\uA415"], /* YI SYLLABLE QYP */ + ["\uA416", "\uA416"], /* YI SYLLABLE QYRX */ + ["\uA417", "\uA417"], /* YI SYLLABLE QYR */ + ["\uA418", "\uA418"], /* YI SYLLABLE JJIT */ + ["\uA419", "\uA419"], /* YI SYLLABLE JJIX */ + ["\uA41A", "\uA41A"], /* YI SYLLABLE JJI */ + ["\uA41B", "\uA41B"], /* YI SYLLABLE JJIP */ + ["\uA41C", "\uA41C"], /* YI SYLLABLE JJIET */ + ["\uA41D", "\uA41D"], /* YI SYLLABLE JJIEX */ + ["\uA41E", "\uA41E"], /* YI SYLLABLE JJIE */ + ["\uA41F", "\uA41F"], /* YI SYLLABLE JJIEP */ + ["\uA420", "\uA420"], /* YI SYLLABLE JJUOX */ + ["\uA421", "\uA421"], /* YI SYLLABLE JJUO */ + ["\uA422", "\uA422"], /* YI SYLLABLE JJUOP */ + ["\uA423", "\uA423"], /* YI SYLLABLE JJOT */ + ["\uA424", "\uA424"], /* YI SYLLABLE JJOX */ + ["\uA425", "\uA425"], /* YI SYLLABLE JJO */ + ["\uA426", "\uA426"], /* YI SYLLABLE JJOP */ + ["\uA427", "\uA427"], /* YI SYLLABLE JJUT */ + ["\uA428", "\uA428"], /* YI SYLLABLE JJUX */ + ["\uA429", "\uA429"], /* YI SYLLABLE JJU */ + ["\uA42A", "\uA42A"], /* YI SYLLABLE JJUP */ + ["\uA42B", "\uA42B"], /* YI SYLLABLE JJURX */ + ["\uA42C", "\uA42C"], /* YI SYLLABLE JJUR */ + ["\uA42D", "\uA42D"], /* YI SYLLABLE JJYT */ + ["\uA42E", "\uA42E"], /* YI SYLLABLE JJYX */ + ["\uA42F", "\uA42F"], /* YI SYLLABLE JJY */ + ["\uA430", "\uA430"], /* YI SYLLABLE JJYP */ + ["\uA431", "\uA431"], /* YI SYLLABLE NJIT */ + ["\uA432", "\uA432"], /* YI SYLLABLE NJIX */ + ["\uA433", "\uA433"], /* YI SYLLABLE NJI */ + ["\uA434", "\uA434"], /* YI SYLLABLE NJIP */ + ["\uA435", "\uA435"], /* YI SYLLABLE NJIET */ + ["\uA436", "\uA436"], /* YI SYLLABLE NJIEX */ + ["\uA437", "\uA437"], /* YI SYLLABLE NJIE */ + ["\uA438", "\uA438"], /* YI SYLLABLE NJIEP */ + ["\uA439", "\uA439"], /* YI SYLLABLE NJUOX */ + ["\uA43A", "\uA43A"], /* YI SYLLABLE NJUO */ + ["\uA43B", "\uA43B"], /* YI SYLLABLE NJOT */ + ["\uA43C", "\uA43C"], /* YI SYLLABLE NJOX */ + ["\uA43D", "\uA43D"], /* YI SYLLABLE NJO */ + ["\uA43E", "\uA43E"], /* YI SYLLABLE NJOP */ + ["\uA43F", "\uA43F"], /* YI SYLLABLE NJUX */ + ["\uA440", "\uA440"], /* YI SYLLABLE NJU */ + ["\uA441", "\uA441"], /* YI SYLLABLE NJUP */ + ["\uA442", "\uA442"], /* YI SYLLABLE NJURX */ + ["\uA443", "\uA443"], /* YI SYLLABLE NJUR */ + ["\uA444", "\uA444"], /* YI SYLLABLE NJYT */ + ["\uA445", "\uA445"], /* YI SYLLABLE NJYX */ + ["\uA446", "\uA446"], /* YI SYLLABLE NJY */ + ["\uA447", "\uA447"], /* YI SYLLABLE NJYP */ + ["\uA448", "\uA448"], /* YI SYLLABLE NJYRX */ + ["\uA449", "\uA449"], /* YI SYLLABLE NJYR */ + ["\uA44A", "\uA44A"], /* YI SYLLABLE NYIT */ + ["\uA44B", "\uA44B"], /* YI SYLLABLE NYIX */ + ["\uA44C", "\uA44C"], /* YI SYLLABLE NYI */ + ["\uA44D", "\uA44D"], /* YI SYLLABLE NYIP */ + ["\uA44E", "\uA44E"], /* YI SYLLABLE NYIET */ + ["\uA44F", "\uA44F"], /* YI SYLLABLE NYIEX */ + ["\uA450", "\uA450"], /* YI SYLLABLE NYIE */ + ["\uA451", "\uA451"], /* YI SYLLABLE NYIEP */ + ["\uA452", "\uA452"], /* YI SYLLABLE NYUOX */ + ["\uA453", "\uA453"], /* YI SYLLABLE NYUO */ + ["\uA454", "\uA454"], /* YI SYLLABLE NYUOP */ + ["\uA455", "\uA455"], /* YI SYLLABLE NYOT */ + ["\uA456", "\uA456"], /* YI SYLLABLE NYOX */ + ["\uA457", "\uA457"], /* YI SYLLABLE NYO */ + ["\uA458", "\uA458"], /* YI SYLLABLE NYOP */ + ["\uA459", "\uA459"], /* YI SYLLABLE NYUT */ + ["\uA45A", "\uA45A"], /* YI SYLLABLE NYUX */ + ["\uA45B", "\uA45B"], /* YI SYLLABLE NYU */ + ["\uA45C", "\uA45C"], /* YI SYLLABLE NYUP */ + ["\uA45D", "\uA45D"], /* YI SYLLABLE XIT */ + ["\uA45E", "\uA45E"], /* YI SYLLABLE XIX */ + ["\uA45F", "\uA45F"], /* YI SYLLABLE XI */ + ["\uA460", "\uA460"], /* YI SYLLABLE XIP */ + ["\uA461", "\uA461"], /* YI SYLLABLE XIET */ + ["\uA462", "\uA462"], /* YI SYLLABLE XIEX */ + ["\uA463", "\uA463"], /* YI SYLLABLE XIE */ + ["\uA464", "\uA464"], /* YI SYLLABLE XIEP */ + ["\uA465", "\uA465"], /* YI SYLLABLE XUOX */ + ["\uA466", "\uA466"], /* YI SYLLABLE XUO */ + ["\uA467", "\uA467"], /* YI SYLLABLE XOT */ + ["\uA468", "\uA468"], /* YI SYLLABLE XOX */ + ["\uA469", "\uA469"], /* YI SYLLABLE XO */ + ["\uA46A", "\uA46A"], /* YI SYLLABLE XOP */ + ["\uA46B", "\uA46B"], /* YI SYLLABLE XYT */ + ["\uA46C", "\uA46C"], /* YI SYLLABLE XYX */ + ["\uA46D", "\uA46D"], /* YI SYLLABLE XY */ + ["\uA46E", "\uA46E"], /* YI SYLLABLE XYP */ + ["\uA46F", "\uA46F"], /* YI SYLLABLE XYRX */ + ["\uA470", "\uA470"], /* YI SYLLABLE XYR */ + ["\uA471", "\uA471"], /* YI SYLLABLE YIT */ + ["\uA472", "\uA472"], /* YI SYLLABLE YIX */ + ["\uA473", "\uA473"], /* YI SYLLABLE YI */ + ["\uA474", "\uA474"], /* YI SYLLABLE YIP */ + ["\uA475", "\uA475"], /* YI SYLLABLE YIET */ + ["\uA476", "\uA476"], /* YI SYLLABLE YIEX */ + ["\uA477", "\uA477"], /* YI SYLLABLE YIE */ + ["\uA478", "\uA478"], /* YI SYLLABLE YIEP */ + ["\uA479", "\uA479"], /* YI SYLLABLE YUOT */ + ["\uA47A", "\uA47A"], /* YI SYLLABLE YUOX */ + ["\uA47B", "\uA47B"], /* YI SYLLABLE YUO */ + ["\uA47C", "\uA47C"], /* YI SYLLABLE YUOP */ + ["\uA47D", "\uA47D"], /* YI SYLLABLE YOT */ + ["\uA47E", "\uA47E"], /* YI SYLLABLE YOX */ + ["\uA47F", "\uA47F"], /* YI SYLLABLE YO */ + ["\uA480", "\uA480"], /* YI SYLLABLE YOP */ + ["\uA481", "\uA481"], /* YI SYLLABLE YUT */ + ["\uA482", "\uA482"], /* YI SYLLABLE YUX */ + ["\uA483", "\uA483"], /* YI SYLLABLE YU */ + ["\uA484", "\uA484"], /* YI SYLLABLE YUP */ + ["\uA485", "\uA485"], /* YI SYLLABLE YURX */ + ["\uA486", "\uA486"], /* YI SYLLABLE YUR */ + ["\uA487", "\uA487"], /* YI SYLLABLE YYT */ + ["\uA488", "\uA488"], /* YI SYLLABLE YYX */ + ["\uA489", "\uA489"], /* YI SYLLABLE YY */ + ["\uA48A", "\uA48A"], /* YI SYLLABLE YYP */ + ["\uA48B", "\uA48B"], /* YI SYLLABLE YYRX */ + ["\uA48C", "\uA48C"], /* YI SYLLABLE YYR */ + ["\uA48D", "\uA48D"], + ["\uA48E", "\uA48E"], + ["\uA48F", "\uA48F"], + ["\uA490", "\uA490"], /* YI RADICAL QOT */ + ["\uA491", "\uA491"], /* YI RADICAL LI */ + ["\uA492", "\uA492"], /* YI RADICAL KIT */ + ["\uA493", "\uA493"], /* YI RADICAL NYIP */ + ["\uA494", "\uA494"], /* YI RADICAL CYP */ + ["\uA495", "\uA495"], /* YI RADICAL SSI */ + ["\uA496", "\uA496"], /* YI RADICAL GGOP */ + ["\uA497", "\uA497"], /* YI RADICAL GEP */ + ["\uA498", "\uA498"], /* YI RADICAL MI */ + ["\uA499", "\uA499"], /* YI RADICAL HXIT */ + ["\uA49A", "\uA49A"], /* YI RADICAL LYR */ + ["\uA49B", "\uA49B"], /* YI RADICAL BBUT */ + ["\uA49C", "\uA49C"], /* YI RADICAL MOP */ + ["\uA49D", "\uA49D"], /* YI RADICAL YO */ + ["\uA49E", "\uA49E"], /* YI RADICAL PUT */ + ["\uA49F", "\uA49F"], /* YI RADICAL HXUO */ + ["\uA4A0", "\uA4A0"], /* YI RADICAL TAT */ + ["\uA4A1", "\uA4A1"], /* YI RADICAL GA */ + ["\uA4A2", "\uA4A2"], /* YI RADICAL ZUP */ + ["\uA4A3", "\uA4A3"], /* YI RADICAL CYT */ + ["\uA4A4", "\uA4A4"], /* YI RADICAL DDUR */ + ["\uA4A5", "\uA4A5"], /* YI RADICAL BUR */ + ["\uA4A6", "\uA4A6"], /* YI RADICAL GGUO */ + ["\uA4A7", "\uA4A7"], /* YI RADICAL NYOP */ + ["\uA4A8", "\uA4A8"], /* YI RADICAL TU */ + ["\uA4A9", "\uA4A9"], /* YI RADICAL OP */ + ["\uA4AA", "\uA4AA"], /* YI RADICAL JJUT */ + ["\uA4AB", "\uA4AB"], /* YI RADICAL ZOT */ + ["\uA4AC", "\uA4AC"], /* YI RADICAL PYT */ + ["\uA4AD", "\uA4AD"], /* YI RADICAL HMO */ + ["\uA4AE", "\uA4AE"], /* YI RADICAL YIT */ + ["\uA4AF", "\uA4AF"], /* YI RADICAL VUR */ + ["\uA4B0", "\uA4B0"], /* YI RADICAL SHY */ + ["\uA4B1", "\uA4B1"], /* YI RADICAL VEP */ + ["\uA4B2", "\uA4B2"], /* YI RADICAL ZA */ + ["\uA4B3", "\uA4B3"], /* YI RADICAL JO */ + ["\uA4B4", "\uA4B4"], /* YI RADICAL NZUP */ + ["\uA4B5", "\uA4B5"], /* YI RADICAL JJY */ + ["\uA4B6", "\uA4B6"], /* YI RADICAL GOT */ + ["\uA4B7", "\uA4B7"], /* YI RADICAL JJIE */ + ["\uA4B8", "\uA4B8"], /* YI RADICAL WO */ + ["\uA4B9", "\uA4B9"], /* YI RADICAL DU */ + ["\uA4BA", "\uA4BA"], /* YI RADICAL SHUR */ + ["\uA4BB", "\uA4BB"], /* YI RADICAL LIE */ + ["\uA4BC", "\uA4BC"], /* YI RADICAL CY */ + ["\uA4BD", "\uA4BD"], /* YI RADICAL CUOP */ + ["\uA4BE", "\uA4BE"], /* YI RADICAL CIP */ + ["\uA4BF", "\uA4BF"], /* YI RADICAL HXOP */ + ["\uA4C0", "\uA4C0"], /* YI RADICAL SHAT */ + ["\uA4C1", "\uA4C1"], /* YI RADICAL ZUR */ + ["\uA4C2", "\uA4C2"], /* YI RADICAL SHOP */ + ["\uA4C3", "\uA4C3"], /* YI RADICAL CHE */ + ["\uA4C4", "\uA4C4"], /* YI RADICAL ZZIET */ + ["\uA4C5", "\uA4C5"], /* YI RADICAL NBIE */ + ["\uA4C6", "\uA4C6"], /* YI RADICAL KE */ + ["\uA4C7", "\uA4C7"], + ["\uA4C8", "\uA4C8"], + ["\uA4C9", "\uA4C9"], + ["\uA4CA", "\uA4CA"], + ["\uA4CB", "\uA4CB"], + ["\uA4CC", "\uA4CC"], + ["\uA4CD", "\uA4CD"], + ["\uA4CE", "\uA4CE"], + ["\uA4CF", "\uA4CF"], + ["\uA4D0", "\uA4D0"], /* LISU LETTER BA */ + ["\uA4D1", "\uA4D1"], /* LISU LETTER PA */ + ["\uA4D2", "\uA4D2"], /* LISU LETTER PHA */ + ["\uA4D3", "\uA4D3"], /* LISU LETTER DA */ + ["\uA4D4", "\uA4D4"], /* LISU LETTER TA */ + ["\uA4D5", "\uA4D5"], /* LISU LETTER THA */ + ["\uA4D6", "\uA4D6"], /* LISU LETTER GA */ + ["\uA4D7", "\uA4D7"], /* LISU LETTER KA */ + ["\uA4D8", "\uA4D8"], /* LISU LETTER KHA */ + ["\uA4D9", "\uA4D9"], /* LISU LETTER JA */ + ["\uA4DA", "\uA4DA"], /* LISU LETTER CA */ + ["\uA4DB", "\uA4DB"], /* LISU LETTER CHA */ + ["\uA4DC", "\uA4DC"], /* LISU LETTER DZA */ + ["\uA4DD", "\uA4DD"], /* LISU LETTER TSA */ + ["\uA4DE", "\uA4DE"], /* LISU LETTER TSHA */ + ["\uA4DF", "\uA4DF"], /* LISU LETTER MA */ + ["\uA4E0", "\uA4E0"], /* LISU LETTER NA */ + ["\uA4E1", "\uA4E1"], /* LISU LETTER LA */ + ["\uA4E2", "\uA4E2"], /* LISU LETTER SA */ + ["\uA4E3", "\uA4E3"], /* LISU LETTER ZHA */ + ["\uA4E4", "\uA4E4"], /* LISU LETTER ZA */ + ["\uA4E5", "\uA4E5"], /* LISU LETTER NGA */ + ["\uA4E6", "\uA4E6"], /* LISU LETTER HA */ + ["\uA4E7", "\uA4E7"], /* LISU LETTER XA */ + ["\uA4E8", "\uA4E8"], /* LISU LETTER HHA */ + ["\uA4E9", "\uA4E9"], /* LISU LETTER FA */ + ["\uA4EA", "\uA4EA"], /* LISU LETTER WA */ + ["\uA4EB", "\uA4EB"], /* LISU LETTER SHA */ + ["\uA4EC", "\uA4EC"], /* LISU LETTER YA */ + ["\uA4ED", "\uA4ED"], /* LISU LETTER GHA */ + ["\uA4EE", "\uA4EE"], /* LISU LETTER A */ + ["\uA4EF", "\uA4EF"], /* LISU LETTER AE */ + ["\uA4F0", "\uA4F0"], /* LISU LETTER E */ + ["\uA4F1", "\uA4F1"], /* LISU LETTER EU */ + ["\uA4F2", "\uA4F2"], /* LISU LETTER I */ + ["\uA4F3", "\uA4F3"], /* LISU LETTER O */ + ["\uA4F4", "\uA4F4"], /* LISU LETTER U */ + ["\uA4F5", "\uA4F5"], /* LISU LETTER UE */ + ["\uA4F6", "\uA4F6"], /* LISU LETTER UH */ + ["\uA4F7", "\uA4F7"], /* LISU LETTER OE */ + ["\uA4F8", "\uA4F8"], /* LISU LETTER TONE MYA TI */ + ["\uA4F9", "\uA4F9"], /* LISU LETTER TONE NA PO */ + ["\uA4FA", "\uA4FA"], /* LISU LETTER TONE MYA CYA */ + ["\uA4FB", "\uA4FB"], /* LISU LETTER TONE MYA BO */ + ["\uA4FC", "\uA4FC"], /* LISU LETTER TONE MYA NA */ + ["\uA4FD", "\uA4FD"], /* LISU LETTER TONE MYA JEU */ + ["\uA4FE", "\uA4FE"], /* LISU PUNCTUATION COMMA */ + ["\uA4FF", "\uA4FF"], /* LISU PUNCTUATION FULL STOP */ + ["\uA500", "\uA500"], /* VAI SYLLABLE EE */ + ["\uA501", "\uA501"], /* VAI SYLLABLE EEN */ + ["\uA502", "\uA502"], /* VAI SYLLABLE HEE */ + ["\uA503", "\uA503"], /* VAI SYLLABLE WEE */ + ["\uA504", "\uA504"], /* VAI SYLLABLE WEEN */ + ["\uA505", "\uA505"], /* VAI SYLLABLE PEE */ + ["\uA506", "\uA506"], /* VAI SYLLABLE BHEE */ + ["\uA507", "\uA507"], /* VAI SYLLABLE BEE */ + ["\uA508", "\uA508"], /* VAI SYLLABLE MBEE */ + ["\uA509", "\uA509"], /* VAI SYLLABLE KPEE */ + ["\uA50A", "\uA50A"], /* VAI SYLLABLE MGBEE */ + ["\uA50B", "\uA50B"], /* VAI SYLLABLE GBEE */ + ["\uA50C", "\uA50C"], /* VAI SYLLABLE FEE */ + ["\uA50D", "\uA50D"], /* VAI SYLLABLE VEE */ + ["\uA50E", "\uA50E"], /* VAI SYLLABLE TEE */ + ["\uA50F", "\uA50F"], /* VAI SYLLABLE THEE */ + ["\uA510", "\uA510"], /* VAI SYLLABLE DHEE */ + ["\uA511", "\uA511"], /* VAI SYLLABLE DHHEE */ + ["\uA512", "\uA512"], /* VAI SYLLABLE LEE */ + ["\uA513", "\uA513"], /* VAI SYLLABLE REE */ + ["\uA514", "\uA514"], /* VAI SYLLABLE DEE */ + ["\uA515", "\uA515"], /* VAI SYLLABLE NDEE */ + ["\uA516", "\uA516"], /* VAI SYLLABLE SEE */ + ["\uA517", "\uA517"], /* VAI SYLLABLE SHEE */ + ["\uA518", "\uA518"], /* VAI SYLLABLE ZEE */ + ["\uA519", "\uA519"], /* VAI SYLLABLE ZHEE */ + ["\uA51A", "\uA51A"], /* VAI SYLLABLE CEE */ + ["\uA51B", "\uA51B"], /* VAI SYLLABLE JEE */ + ["\uA51C", "\uA51C"], /* VAI SYLLABLE NJEE */ + ["\uA51D", "\uA51D"], /* VAI SYLLABLE YEE */ + ["\uA51E", "\uA51E"], /* VAI SYLLABLE KEE */ + ["\uA51F", "\uA51F"], /* VAI SYLLABLE NGGEE */ + ["\uA520", "\uA520"], /* VAI SYLLABLE GEE */ + ["\uA521", "\uA521"], /* VAI SYLLABLE MEE */ + ["\uA522", "\uA522"], /* VAI SYLLABLE NEE */ + ["\uA523", "\uA523"], /* VAI SYLLABLE NYEE */ + ["\uA524", "\uA524"], /* VAI SYLLABLE I */ + ["\uA525", "\uA525"], /* VAI SYLLABLE IN */ + ["\uA526", "\uA526"], /* VAI SYLLABLE HI */ + ["\uA527", "\uA527"], /* VAI SYLLABLE HIN */ + ["\uA528", "\uA528"], /* VAI SYLLABLE WI */ + ["\uA529", "\uA529"], /* VAI SYLLABLE WIN */ + ["\uA52A", "\uA52A"], /* VAI SYLLABLE PI */ + ["\uA52B", "\uA52B"], /* VAI SYLLABLE BHI */ + ["\uA52C", "\uA52C"], /* VAI SYLLABLE BI */ + ["\uA52D", "\uA52D"], /* VAI SYLLABLE MBI */ + ["\uA52E", "\uA52E"], /* VAI SYLLABLE KPI */ + ["\uA52F", "\uA52F"], /* VAI SYLLABLE MGBI */ + ["\uA530", "\uA530"], /* VAI SYLLABLE GBI */ + ["\uA531", "\uA531"], /* VAI SYLLABLE FI */ + ["\uA532", "\uA532"], /* VAI SYLLABLE VI */ + ["\uA533", "\uA533"], /* VAI SYLLABLE TI */ + ["\uA534", "\uA534"], /* VAI SYLLABLE THI */ + ["\uA535", "\uA535"], /* VAI SYLLABLE DHI */ + ["\uA536", "\uA536"], /* VAI SYLLABLE DHHI */ + ["\uA537", "\uA537"], /* VAI SYLLABLE LI */ + ["\uA538", "\uA538"], /* VAI SYLLABLE RI */ + ["\uA539", "\uA539"], /* VAI SYLLABLE DI */ + ["\uA53A", "\uA53A"], /* VAI SYLLABLE NDI */ + ["\uA53B", "\uA53B"], /* VAI SYLLABLE SI */ + ["\uA53C", "\uA53C"], /* VAI SYLLABLE SHI */ + ["\uA53D", "\uA53D"], /* VAI SYLLABLE ZI */ + ["\uA53E", "\uA53E"], /* VAI SYLLABLE ZHI */ + ["\uA53F", "\uA53F"], /* VAI SYLLABLE CI */ + ["\uA540", "\uA540"], /* VAI SYLLABLE JI */ + ["\uA541", "\uA541"], /* VAI SYLLABLE NJI */ + ["\uA542", "\uA542"], /* VAI SYLLABLE YI */ + ["\uA543", "\uA543"], /* VAI SYLLABLE KI */ + ["\uA544", "\uA544"], /* VAI SYLLABLE NGGI */ + ["\uA545", "\uA545"], /* VAI SYLLABLE GI */ + ["\uA546", "\uA546"], /* VAI SYLLABLE MI */ + ["\uA547", "\uA547"], /* VAI SYLLABLE NI */ + ["\uA548", "\uA548"], /* VAI SYLLABLE NYI */ + ["\uA549", "\uA549"], /* VAI SYLLABLE A */ + ["\uA54A", "\uA54A"], /* VAI SYLLABLE AN */ + ["\uA54B", "\uA54B"], /* VAI SYLLABLE NGAN */ + ["\uA54C", "\uA54C"], /* VAI SYLLABLE HA */ + ["\uA54D", "\uA54D"], /* VAI SYLLABLE HAN */ + ["\uA54E", "\uA54E"], /* VAI SYLLABLE WA */ + ["\uA54F", "\uA54F"], /* VAI SYLLABLE WAN */ + ["\uA550", "\uA550"], /* VAI SYLLABLE PA */ + ["\uA551", "\uA551"], /* VAI SYLLABLE BHA */ + ["\uA552", "\uA552"], /* VAI SYLLABLE BA */ + ["\uA553", "\uA553"], /* VAI SYLLABLE MBA */ + ["\uA554", "\uA554"], /* VAI SYLLABLE KPA */ + ["\uA555", "\uA555"], /* VAI SYLLABLE KPAN */ + ["\uA556", "\uA556"], /* VAI SYLLABLE MGBA */ + ["\uA557", "\uA557"], /* VAI SYLLABLE GBA */ + ["\uA558", "\uA558"], /* VAI SYLLABLE FA */ + ["\uA559", "\uA559"], /* VAI SYLLABLE VA */ + ["\uA55A", "\uA55A"], /* VAI SYLLABLE TA */ + ["\uA55B", "\uA55B"], /* VAI SYLLABLE THA */ + ["\uA55C", "\uA55C"], /* VAI SYLLABLE DHA */ + ["\uA55D", "\uA55D"], /* VAI SYLLABLE DHHA */ + ["\uA55E", "\uA55E"], /* VAI SYLLABLE LA */ + ["\uA55F", "\uA55F"], /* VAI SYLLABLE RA */ + ["\uA560", "\uA560"], /* VAI SYLLABLE DA */ + ["\uA561", "\uA561"], /* VAI SYLLABLE NDA */ + ["\uA562", "\uA562"], /* VAI SYLLABLE SA */ + ["\uA563", "\uA563"], /* VAI SYLLABLE SHA */ + ["\uA564", "\uA564"], /* VAI SYLLABLE ZA */ + ["\uA565", "\uA565"], /* VAI SYLLABLE ZHA */ + ["\uA566", "\uA566"], /* VAI SYLLABLE CA */ + ["\uA567", "\uA567"], /* VAI SYLLABLE JA */ + ["\uA568", "\uA568"], /* VAI SYLLABLE NJA */ + ["\uA569", "\uA569"], /* VAI SYLLABLE YA */ + ["\uA56A", "\uA56A"], /* VAI SYLLABLE KA */ + ["\uA56B", "\uA56B"], /* VAI SYLLABLE KAN */ + ["\uA56C", "\uA56C"], /* VAI SYLLABLE NGGA */ + ["\uA56D", "\uA56D"], /* VAI SYLLABLE GA */ + ["\uA56E", "\uA56E"], /* VAI SYLLABLE MA */ + ["\uA56F", "\uA56F"], /* VAI SYLLABLE NA */ + ["\uA570", "\uA570"], /* VAI SYLLABLE NYA */ + ["\uA571", "\uA571"], /* VAI SYLLABLE OO */ + ["\uA572", "\uA572"], /* VAI SYLLABLE OON */ + ["\uA573", "\uA573"], /* VAI SYLLABLE HOO */ + ["\uA574", "\uA574"], /* VAI SYLLABLE WOO */ + ["\uA575", "\uA575"], /* VAI SYLLABLE WOON */ + ["\uA576", "\uA576"], /* VAI SYLLABLE POO */ + ["\uA577", "\uA577"], /* VAI SYLLABLE BHOO */ + ["\uA578", "\uA578"], /* VAI SYLLABLE BOO */ + ["\uA579", "\uA579"], /* VAI SYLLABLE MBOO */ + ["\uA57A", "\uA57A"], /* VAI SYLLABLE KPOO */ + ["\uA57B", "\uA57B"], /* VAI SYLLABLE MGBOO */ + ["\uA57C", "\uA57C"], /* VAI SYLLABLE GBOO */ + ["\uA57D", "\uA57D"], /* VAI SYLLABLE FOO */ + ["\uA57E", "\uA57E"], /* VAI SYLLABLE VOO */ + ["\uA57F", "\uA57F"], /* VAI SYLLABLE TOO */ + ["\uA580", "\uA580"], /* VAI SYLLABLE THOO */ + ["\uA581", "\uA581"], /* VAI SYLLABLE DHOO */ + ["\uA582", "\uA582"], /* VAI SYLLABLE DHHOO */ + ["\uA583", "\uA583"], /* VAI SYLLABLE LOO */ + ["\uA584", "\uA584"], /* VAI SYLLABLE ROO */ + ["\uA585", "\uA585"], /* VAI SYLLABLE DOO */ + ["\uA586", "\uA586"], /* VAI SYLLABLE NDOO */ + ["\uA587", "\uA587"], /* VAI SYLLABLE SOO */ + ["\uA588", "\uA588"], /* VAI SYLLABLE SHOO */ + ["\uA589", "\uA589"], /* VAI SYLLABLE ZOO */ + ["\uA58A", "\uA58A"], /* VAI SYLLABLE ZHOO */ + ["\uA58B", "\uA58B"], /* VAI SYLLABLE COO */ + ["\uA58C", "\uA58C"], /* VAI SYLLABLE JOO */ + ["\uA58D", "\uA58D"], /* VAI SYLLABLE NJOO */ + ["\uA58E", "\uA58E"], /* VAI SYLLABLE YOO */ + ["\uA58F", "\uA58F"], /* VAI SYLLABLE KOO */ + ["\uA590", "\uA590"], /* VAI SYLLABLE NGGOO */ + ["\uA591", "\uA591"], /* VAI SYLLABLE GOO */ + ["\uA592", "\uA592"], /* VAI SYLLABLE MOO */ + ["\uA593", "\uA593"], /* VAI SYLLABLE NOO */ + ["\uA594", "\uA594"], /* VAI SYLLABLE NYOO */ + ["\uA595", "\uA595"], /* VAI SYLLABLE U */ + ["\uA596", "\uA596"], /* VAI SYLLABLE UN */ + ["\uA597", "\uA597"], /* VAI SYLLABLE HU */ + ["\uA598", "\uA598"], /* VAI SYLLABLE HUN */ + ["\uA599", "\uA599"], /* VAI SYLLABLE WU */ + ["\uA59A", "\uA59A"], /* VAI SYLLABLE WUN */ + ["\uA59B", "\uA59B"], /* VAI SYLLABLE PU */ + ["\uA59C", "\uA59C"], /* VAI SYLLABLE BHU */ + ["\uA59D", "\uA59D"], /* VAI SYLLABLE BU */ + ["\uA59E", "\uA59E"], /* VAI SYLLABLE MBU */ + ["\uA59F", "\uA59F"], /* VAI SYLLABLE KPU */ + ["\uA5A0", "\uA5A0"], /* VAI SYLLABLE MGBU */ + ["\uA5A1", "\uA5A1"], /* VAI SYLLABLE GBU */ + ["\uA5A2", "\uA5A2"], /* VAI SYLLABLE FU */ + ["\uA5A3", "\uA5A3"], /* VAI SYLLABLE VU */ + ["\uA5A4", "\uA5A4"], /* VAI SYLLABLE TU */ + ["\uA5A5", "\uA5A5"], /* VAI SYLLABLE THU */ + ["\uA5A6", "\uA5A6"], /* VAI SYLLABLE DHU */ + ["\uA5A7", "\uA5A7"], /* VAI SYLLABLE DHHU */ + ["\uA5A8", "\uA5A8"], /* VAI SYLLABLE LU */ + ["\uA5A9", "\uA5A9"], /* VAI SYLLABLE RU */ + ["\uA5AA", "\uA5AA"], /* VAI SYLLABLE DU */ + ["\uA5AB", "\uA5AB"], /* VAI SYLLABLE NDU */ + ["\uA5AC", "\uA5AC"], /* VAI SYLLABLE SU */ + ["\uA5AD", "\uA5AD"], /* VAI SYLLABLE SHU */ + ["\uA5AE", "\uA5AE"], /* VAI SYLLABLE ZU */ + ["\uA5AF", "\uA5AF"], /* VAI SYLLABLE ZHU */ + ["\uA5B0", "\uA5B0"], /* VAI SYLLABLE CU */ + ["\uA5B1", "\uA5B1"], /* VAI SYLLABLE JU */ + ["\uA5B2", "\uA5B2"], /* VAI SYLLABLE NJU */ + ["\uA5B3", "\uA5B3"], /* VAI SYLLABLE YU */ + ["\uA5B4", "\uA5B4"], /* VAI SYLLABLE KU */ + ["\uA5B5", "\uA5B5"], /* VAI SYLLABLE NGGU */ + ["\uA5B6", "\uA5B6"], /* VAI SYLLABLE GU */ + ["\uA5B7", "\uA5B7"], /* VAI SYLLABLE MU */ + ["\uA5B8", "\uA5B8"], /* VAI SYLLABLE NU */ + ["\uA5B9", "\uA5B9"], /* VAI SYLLABLE NYU */ + ["\uA5BA", "\uA5BA"], /* VAI SYLLABLE O */ + ["\uA5BB", "\uA5BB"], /* VAI SYLLABLE ON */ + ["\uA5BC", "\uA5BC"], /* VAI SYLLABLE NGON */ + ["\uA5BD", "\uA5BD"], /* VAI SYLLABLE HO */ + ["\uA5BE", "\uA5BE"], /* VAI SYLLABLE HON */ + ["\uA5BF", "\uA5BF"], /* VAI SYLLABLE WO */ + ["\uA5C0", "\uA5C0"], /* VAI SYLLABLE WON */ + ["\uA5C1", "\uA5C1"], /* VAI SYLLABLE PO */ + ["\uA5C2", "\uA5C2"], /* VAI SYLLABLE BHO */ + ["\uA5C3", "\uA5C3"], /* VAI SYLLABLE BO */ + ["\uA5C4", "\uA5C4"], /* VAI SYLLABLE MBO */ + ["\uA5C5", "\uA5C5"], /* VAI SYLLABLE KPO */ + ["\uA5C6", "\uA5C6"], /* VAI SYLLABLE MGBO */ + ["\uA5C7", "\uA5C7"], /* VAI SYLLABLE GBO */ + ["\uA5C8", "\uA5C8"], /* VAI SYLLABLE GBON */ + ["\uA5C9", "\uA5C9"], /* VAI SYLLABLE FO */ + ["\uA5CA", "\uA5CA"], /* VAI SYLLABLE VO */ + ["\uA5CB", "\uA5CB"], /* VAI SYLLABLE TO */ + ["\uA5CC", "\uA5CC"], /* VAI SYLLABLE THO */ + ["\uA5CD", "\uA5CD"], /* VAI SYLLABLE DHO */ + ["\uA5CE", "\uA5CE"], /* VAI SYLLABLE DHHO */ + ["\uA5CF", "\uA5CF"], /* VAI SYLLABLE LO */ + ["\uA5D0", "\uA5D0"], /* VAI SYLLABLE RO */ + ["\uA5D1", "\uA5D1"], /* VAI SYLLABLE DO */ + ["\uA5D2", "\uA5D2"], /* VAI SYLLABLE NDO */ + ["\uA5D3", "\uA5D3"], /* VAI SYLLABLE SO */ + ["\uA5D4", "\uA5D4"], /* VAI SYLLABLE SHO */ + ["\uA5D5", "\uA5D5"], /* VAI SYLLABLE ZO */ + ["\uA5D6", "\uA5D6"], /* VAI SYLLABLE ZHO */ + ["\uA5D7", "\uA5D7"], /* VAI SYLLABLE CO */ + ["\uA5D8", "\uA5D8"], /* VAI SYLLABLE JO */ + ["\uA5D9", "\uA5D9"], /* VAI SYLLABLE NJO */ + ["\uA5DA", "\uA5DA"], /* VAI SYLLABLE YO */ + ["\uA5DB", "\uA5DB"], /* VAI SYLLABLE KO */ + ["\uA5DC", "\uA5DC"], /* VAI SYLLABLE NGGO */ + ["\uA5DD", "\uA5DD"], /* VAI SYLLABLE GO */ + ["\uA5DE", "\uA5DE"], /* VAI SYLLABLE MO */ + ["\uA5DF", "\uA5DF"], /* VAI SYLLABLE NO */ + ["\uA5E0", "\uA5E0"], /* VAI SYLLABLE NYO */ + ["\uA5E1", "\uA5E1"], /* VAI SYLLABLE E */ + ["\uA5E2", "\uA5E2"], /* VAI SYLLABLE EN */ + ["\uA5E3", "\uA5E3"], /* VAI SYLLABLE NGEN */ + ["\uA5E4", "\uA5E4"], /* VAI SYLLABLE HE */ + ["\uA5E5", "\uA5E5"], /* VAI SYLLABLE HEN */ + ["\uA5E6", "\uA5E6"], /* VAI SYLLABLE WE */ + ["\uA5E7", "\uA5E7"], /* VAI SYLLABLE WEN */ + ["\uA5E8", "\uA5E8"], /* VAI SYLLABLE PE */ + ["\uA5E9", "\uA5E9"], /* VAI SYLLABLE BHE */ + ["\uA5EA", "\uA5EA"], /* VAI SYLLABLE BE */ + ["\uA5EB", "\uA5EB"], /* VAI SYLLABLE MBE */ + ["\uA5EC", "\uA5EC"], /* VAI SYLLABLE KPE */ + ["\uA5ED", "\uA5ED"], /* VAI SYLLABLE KPEN */ + ["\uA5EE", "\uA5EE"], /* VAI SYLLABLE MGBE */ + ["\uA5EF", "\uA5EF"], /* VAI SYLLABLE GBE */ + ["\uA5F0", "\uA5F0"], /* VAI SYLLABLE GBEN */ + ["\uA5F1", "\uA5F1"], /* VAI SYLLABLE FE */ + ["\uA5F2", "\uA5F2"], /* VAI SYLLABLE VE */ + ["\uA5F3", "\uA5F3"], /* VAI SYLLABLE TE */ + ["\uA5F4", "\uA5F4"], /* VAI SYLLABLE THE */ + ["\uA5F5", "\uA5F5"], /* VAI SYLLABLE DHE */ + ["\uA5F6", "\uA5F6"], /* VAI SYLLABLE DHHE */ + ["\uA5F7", "\uA5F7"], /* VAI SYLLABLE LE */ + ["\uA5F8", "\uA5F8"], /* VAI SYLLABLE RE */ + ["\uA5F9", "\uA5F9"], /* VAI SYLLABLE DE */ + ["\uA5FA", "\uA5FA"], /* VAI SYLLABLE NDE */ + ["\uA5FB", "\uA5FB"], /* VAI SYLLABLE SE */ + ["\uA5FC", "\uA5FC"], /* VAI SYLLABLE SHE */ + ["\uA5FD", "\uA5FD"], /* VAI SYLLABLE ZE */ + ["\uA5FE", "\uA5FE"], /* VAI SYLLABLE ZHE */ + ["\uA5FF", "\uA5FF"], /* VAI SYLLABLE CE */ + ["\uA600", "\uA600"], /* VAI SYLLABLE JE */ + ["\uA601", "\uA601"], /* VAI SYLLABLE NJE */ + ["\uA602", "\uA602"], /* VAI SYLLABLE YE */ + ["\uA603", "\uA603"], /* VAI SYLLABLE KE */ + ["\uA604", "\uA604"], /* VAI SYLLABLE NGGE */ + ["\uA605", "\uA605"], /* VAI SYLLABLE NGGEN */ + ["\uA606", "\uA606"], /* VAI SYLLABLE GE */ + ["\uA607", "\uA607"], /* VAI SYLLABLE GEN */ + ["\uA608", "\uA608"], /* VAI SYLLABLE ME */ + ["\uA609", "\uA609"], /* VAI SYLLABLE NE */ + ["\uA60A", "\uA60A"], /* VAI SYLLABLE NYE */ + ["\uA60B", "\uA60B"], /* VAI SYLLABLE NG */ + ["\uA60C", "\uA60C"], /* VAI SYLLABLE LENGTHENER */ + ["\uA60D", "\uA60D"], /* VAI COMMA */ + ["\uA60E", "\uA60E"], /* VAI FULL STOP */ + ["\uA60F", "\uA60F"], /* VAI QUESTION MARK */ + ["\uA610", "\uA610"], /* VAI SYLLABLE NDOLE FA */ + ["\uA611", "\uA611"], /* VAI SYLLABLE NDOLE KA */ + ["\uA612", "\uA612"], /* VAI SYLLABLE NDOLE SOO */ + ["\uA613", "\uA613"], /* VAI SYMBOL FEENG */ + ["\uA614", "\uA614"], /* VAI SYMBOL KEENG */ + ["\uA615", "\uA615"], /* VAI SYMBOL TING */ + ["\uA616", "\uA616"], /* VAI SYMBOL NII */ + ["\uA617", "\uA617"], /* VAI SYMBOL BANG */ + ["\uA618", "\uA618"], /* VAI SYMBOL FAA */ + ["\uA619", "\uA619"], /* VAI SYMBOL TAA */ + ["\uA61A", "\uA61A"], /* VAI SYMBOL DANG */ + ["\uA61B", "\uA61B"], /* VAI SYMBOL DOONG */ + ["\uA61C", "\uA61C"], /* VAI SYMBOL KUNG */ + ["\uA61D", "\uA61D"], /* VAI SYMBOL TONG */ + ["\uA61E", "\uA61E"], /* VAI SYMBOL DO-O */ + ["\uA61F", "\uA61F"], /* VAI SYMBOL JONG */ + ["\uA620", "\uA620"], /* VAI DIGIT ZERO */ + ["\uA621", "\uA621"], /* VAI DIGIT ONE */ + ["\uA622", "\uA622"], /* VAI DIGIT TWO */ + ["\uA623", "\uA623"], /* VAI DIGIT THREE */ + ["\uA624", "\uA624"], /* VAI DIGIT FOUR */ + ["\uA625", "\uA625"], /* VAI DIGIT FIVE */ + ["\uA626", "\uA626"], /* VAI DIGIT SIX */ + ["\uA627", "\uA627"], /* VAI DIGIT SEVEN */ + ["\uA628", "\uA628"], /* VAI DIGIT EIGHT */ + ["\uA629", "\uA629"], /* VAI DIGIT NINE */ + ["\uA62A", "\uA62A"], /* VAI SYLLABLE NDOLE MA */ + ["\uA62B", "\uA62B"], /* VAI SYLLABLE NDOLE DO */ + ["\uA62C", "\uA62C"], + ["\uA62D", "\uA62D"], + ["\uA62E", "\uA62E"], + ["\uA62F", "\uA62F"], + ["\uA630", "\uA630"], + ["\uA631", "\uA631"], + ["\uA632", "\uA632"], + ["\uA633", "\uA633"], + ["\uA634", "\uA634"], + ["\uA635", "\uA635"], + ["\uA636", "\uA636"], + ["\uA637", "\uA637"], + ["\uA638", "\uA638"], + ["\uA639", "\uA639"], + ["\uA63A", "\uA63A"], + ["\uA63B", "\uA63B"], + ["\uA63C", "\uA63C"], + ["\uA63D", "\uA63D"], + ["\uA63E", "\uA63E"], + ["\uA63F", "\uA63F"], + ["\uA640", "\uA641"], /* CYRILLIC CAPITAL LETTER ZEMLYA */ + ["\uA640", "\uA641"], /* CYRILLIC SMALL LETTER ZEMLYA */ + ["\uA642", "\uA643"], /* CYRILLIC CAPITAL LETTER DZELO */ + ["\uA642", "\uA643"], /* CYRILLIC SMALL LETTER DZELO */ + ["\uA644", "\uA645"], /* CYRILLIC CAPITAL LETTER REVERSED DZE */ + ["\uA644", "\uA645"], /* CYRILLIC SMALL LETTER REVERSED DZE */ + ["\uA646", "\uA647"], /* CYRILLIC CAPITAL LETTER IOTA */ + ["\uA646", "\uA647"], /* CYRILLIC SMALL LETTER IOTA */ + ["\uA648", "\uA649"], /* CYRILLIC CAPITAL LETTER DJERV */ + ["\uA648", "\uA649"], /* CYRILLIC SMALL LETTER DJERV */ + ["\uA64A", "\uA64B"], /* CYRILLIC CAPITAL LETTER MONOGRAPH UK */ + ["\uA64A", "\uA64B"], /* CYRILLIC SMALL LETTER MONOGRAPH UK */ + ["\uA64C", "\uA64D"], /* CYRILLIC CAPITAL LETTER BROAD OMEGA */ + ["\uA64C", "\uA64D"], /* CYRILLIC SMALL LETTER BROAD OMEGA */ + ["\uA64E", "\uA64F"], /* CYRILLIC CAPITAL LETTER NEUTRAL YER */ + ["\uA64E", "\uA64F"], /* CYRILLIC SMALL LETTER NEUTRAL YER */ + ["\uA650", "\uA651"], /* CYRILLIC CAPITAL LETTER YERU WITH BACK YER */ + ["\uA650", "\uA651"], /* CYRILLIC SMALL LETTER YERU WITH BACK YER */ + ["\uA652", "\uA653"], /* CYRILLIC CAPITAL LETTER IOTIFIED YAT */ + ["\uA652", "\uA653"], /* CYRILLIC SMALL LETTER IOTIFIED YAT */ + ["\uA654", "\uA655"], /* CYRILLIC CAPITAL LETTER REVERSED YU */ + ["\uA654", "\uA655"], /* CYRILLIC SMALL LETTER REVERSED YU */ + ["\uA656", "\uA657"], /* CYRILLIC CAPITAL LETTER IOTIFIED A */ + ["\uA656", "\uA657"], /* CYRILLIC SMALL LETTER IOTIFIED A */ + ["\uA658", "\uA659"], /* CYRILLIC CAPITAL LETTER CLOSED LITTLE YUS */ + ["\uA658", "\uA659"], /* CYRILLIC SMALL LETTER CLOSED LITTLE YUS */ + ["\uA65A", "\uA65B"], /* CYRILLIC CAPITAL LETTER BLENDED YUS */ + ["\uA65A", "\uA65B"], /* CYRILLIC SMALL LETTER BLENDED YUS */ + ["\uA65C", "\uA65D"], /* CYRILLIC CAPITAL LETTER IOTIFIED CLOSED LITTLE YUS */ + ["\uA65C", "\uA65D"], /* CYRILLIC SMALL LETTER IOTIFIED CLOSED LITTLE YUS */ + ["\uA65E", "\uA65F"], /* CYRILLIC CAPITAL LETTER YN */ + ["\uA65E", "\uA65F"], /* CYRILLIC SMALL LETTER YN */ + ["\uA660", "\uA661"], /* CYRILLIC CAPITAL LETTER REVERSED TSE */ + ["\uA660", "\uA661"], /* CYRILLIC SMALL LETTER REVERSED TSE */ + ["\uA662", "\uA663"], /* CYRILLIC CAPITAL LETTER SOFT DE */ + ["\uA662", "\uA663"], /* CYRILLIC SMALL LETTER SOFT DE */ + ["\uA664", "\uA665"], /* CYRILLIC CAPITAL LETTER SOFT EL */ + ["\uA664", "\uA665"], /* CYRILLIC SMALL LETTER SOFT EL */ + ["\uA666", "\uA667"], /* CYRILLIC CAPITAL LETTER SOFT EM */ + ["\uA666", "\uA667"], /* CYRILLIC SMALL LETTER SOFT EM */ + ["\uA668", "\uA669"], /* CYRILLIC CAPITAL LETTER MONOCULAR O */ + ["\uA668", "\uA669"], /* CYRILLIC SMALL LETTER MONOCULAR O */ + ["\uA66A", "\uA66B"], /* CYRILLIC CAPITAL LETTER BINOCULAR O */ + ["\uA66A", "\uA66B"], /* CYRILLIC SMALL LETTER BINOCULAR O */ + ["\uA66C", "\uA66D"], /* CYRILLIC CAPITAL LETTER DOUBLE MONOCULAR O */ + ["\uA66C", "\uA66D"], /* CYRILLIC SMALL LETTER DOUBLE MONOCULAR O */ + ["\uA66E", "\uA66E"], /* CYRILLIC LETTER MULTIOCULAR O */ + ["\uA66F", "\uA66F"], /* COMBINING CYRILLIC VZMET */ + ["\uA670", "\uA670"], /* COMBINING CYRILLIC TEN MILLIONS SIGN */ + ["\uA671", "\uA671"], /* COMBINING CYRILLIC HUNDRED MILLIONS SIGN */ + ["\uA672", "\uA672"], /* COMBINING CYRILLIC THOUSAND MILLIONS SIGN */ + ["\uA673", "\uA673"], /* SLAVONIC ASTERISK */ + ["\uA674", "\uA674"], /* COMBINING CYRILLIC LETTER UKRAINIAN IE */ + ["\uA675", "\uA675"], /* COMBINING CYRILLIC LETTER I */ + ["\uA676", "\uA676"], /* COMBINING CYRILLIC LETTER YI */ + ["\uA677", "\uA677"], /* COMBINING CYRILLIC LETTER U */ + ["\uA678", "\uA678"], /* COMBINING CYRILLIC LETTER HARD SIGN */ + ["\uA679", "\uA679"], /* COMBINING CYRILLIC LETTER YERU */ + ["\uA67A", "\uA67A"], /* COMBINING CYRILLIC LETTER SOFT SIGN */ + ["\uA67B", "\uA67B"], /* COMBINING CYRILLIC LETTER OMEGA */ + ["\uA67C", "\uA67C"], /* COMBINING CYRILLIC KAVYKA */ + ["\uA67D", "\uA67D"], /* COMBINING CYRILLIC PAYEROK */ + ["\uA67E", "\uA67E"], /* CYRILLIC KAVYKA */ + ["\uA67F", "\uA67F"], /* CYRILLIC PAYEROK */ + ["\uA680", "\uA681"], /* CYRILLIC CAPITAL LETTER DWE */ + ["\uA680", "\uA681"], /* CYRILLIC SMALL LETTER DWE */ + ["\uA682", "\uA683"], /* CYRILLIC CAPITAL LETTER DZWE */ + ["\uA682", "\uA683"], /* CYRILLIC SMALL LETTER DZWE */ + ["\uA684", "\uA685"], /* CYRILLIC CAPITAL LETTER ZHWE */ + ["\uA684", "\uA685"], /* CYRILLIC SMALL LETTER ZHWE */ + ["\uA686", "\uA687"], /* CYRILLIC CAPITAL LETTER CCHE */ + ["\uA686", "\uA687"], /* CYRILLIC SMALL LETTER CCHE */ + ["\uA688", "\uA689"], /* CYRILLIC CAPITAL LETTER DZZE */ + ["\uA688", "\uA689"], /* CYRILLIC SMALL LETTER DZZE */ + ["\uA68A", "\uA68B"], /* CYRILLIC CAPITAL LETTER TE WITH MIDDLE HOOK */ + ["\uA68A", "\uA68B"], /* CYRILLIC SMALL LETTER TE WITH MIDDLE HOOK */ + ["\uA68C", "\uA68D"], /* CYRILLIC CAPITAL LETTER TWE */ + ["\uA68C", "\uA68D"], /* CYRILLIC SMALL LETTER TWE */ + ["\uA68E", "\uA68F"], /* CYRILLIC CAPITAL LETTER TSWE */ + ["\uA68E", "\uA68F"], /* CYRILLIC SMALL LETTER TSWE */ + ["\uA690", "\uA691"], /* CYRILLIC CAPITAL LETTER TSSE */ + ["\uA690", "\uA691"], /* CYRILLIC SMALL LETTER TSSE */ + ["\uA692", "\uA693"], /* CYRILLIC CAPITAL LETTER TCHE */ + ["\uA692", "\uA693"], /* CYRILLIC SMALL LETTER TCHE */ + ["\uA694", "\uA695"], /* CYRILLIC CAPITAL LETTER HWE */ + ["\uA694", "\uA695"], /* CYRILLIC SMALL LETTER HWE */ + ["\uA696", "\uA697"], /* CYRILLIC CAPITAL LETTER SHWE */ + ["\uA696", "\uA697"], /* CYRILLIC SMALL LETTER SHWE */ + ["\uA698", "\uA699"], /* CYRILLIC CAPITAL LETTER DOUBLE O */ + ["\uA698", "\uA699"], /* CYRILLIC SMALL LETTER DOUBLE O */ + ["\uA69A", "\uA69B"], /* CYRILLIC CAPITAL LETTER CROSSED O */ + ["\uA69A", "\uA69B"], /* CYRILLIC SMALL LETTER CROSSED O */ + ["\uA69C", "\uA69C"], /* MODIFIER LETTER CYRILLIC HARD SIGN */ + ["\uA69D", "\uA69D"], /* MODIFIER LETTER CYRILLIC SOFT SIGN */ + ["\uA69E", "\uA69E"], /* COMBINING CYRILLIC LETTER EF */ + ["\uA69F", "\uA69F"], /* COMBINING CYRILLIC LETTER IOTIFIED E */ + ["\uA6A0", "\uA6A0"], /* BAMUM LETTER A */ + ["\uA6A1", "\uA6A1"], /* BAMUM LETTER KA */ + ["\uA6A2", "\uA6A2"], /* BAMUM LETTER U */ + ["\uA6A3", "\uA6A3"], /* BAMUM LETTER KU */ + ["\uA6A4", "\uA6A4"], /* BAMUM LETTER EE */ + ["\uA6A5", "\uA6A5"], /* BAMUM LETTER REE */ + ["\uA6A6", "\uA6A6"], /* BAMUM LETTER TAE */ + ["\uA6A7", "\uA6A7"], /* BAMUM LETTER O */ + ["\uA6A8", "\uA6A8"], /* BAMUM LETTER NYI */ + ["\uA6A9", "\uA6A9"], /* BAMUM LETTER I */ + ["\uA6AA", "\uA6AA"], /* BAMUM LETTER LA */ + ["\uA6AB", "\uA6AB"], /* BAMUM LETTER PA */ + ["\uA6AC", "\uA6AC"], /* BAMUM LETTER RII */ + ["\uA6AD", "\uA6AD"], /* BAMUM LETTER RIEE */ + ["\uA6AE", "\uA6AE"], /* BAMUM LETTER LEEEE */ + ["\uA6AF", "\uA6AF"], /* BAMUM LETTER MEEEE */ + ["\uA6B0", "\uA6B0"], /* BAMUM LETTER TAA */ + ["\uA6B1", "\uA6B1"], /* BAMUM LETTER NDAA */ + ["\uA6B2", "\uA6B2"], /* BAMUM LETTER NJAEM */ + ["\uA6B3", "\uA6B3"], /* BAMUM LETTER M */ + ["\uA6B4", "\uA6B4"], /* BAMUM LETTER SUU */ + ["\uA6B5", "\uA6B5"], /* BAMUM LETTER MU */ + ["\uA6B6", "\uA6B6"], /* BAMUM LETTER SHII */ + ["\uA6B7", "\uA6B7"], /* BAMUM LETTER SI */ + ["\uA6B8", "\uA6B8"], /* BAMUM LETTER SHEUX */ + ["\uA6B9", "\uA6B9"], /* BAMUM LETTER SEUX */ + ["\uA6BA", "\uA6BA"], /* BAMUM LETTER KYEE */ + ["\uA6BB", "\uA6BB"], /* BAMUM LETTER KET */ + ["\uA6BC", "\uA6BC"], /* BAMUM LETTER NUAE */ + ["\uA6BD", "\uA6BD"], /* BAMUM LETTER NU */ + ["\uA6BE", "\uA6BE"], /* BAMUM LETTER NJUAE */ + ["\uA6BF", "\uA6BF"], /* BAMUM LETTER YOQ */ + ["\uA6C0", "\uA6C0"], /* BAMUM LETTER SHU */ + ["\uA6C1", "\uA6C1"], /* BAMUM LETTER YUQ */ + ["\uA6C2", "\uA6C2"], /* BAMUM LETTER YA */ + ["\uA6C3", "\uA6C3"], /* BAMUM LETTER NSHA */ + ["\uA6C4", "\uA6C4"], /* BAMUM LETTER KEUX */ + ["\uA6C5", "\uA6C5"], /* BAMUM LETTER PEUX */ + ["\uA6C6", "\uA6C6"], /* BAMUM LETTER NJEE */ + ["\uA6C7", "\uA6C7"], /* BAMUM LETTER NTEE */ + ["\uA6C8", "\uA6C8"], /* BAMUM LETTER PUE */ + ["\uA6C9", "\uA6C9"], /* BAMUM LETTER WUE */ + ["\uA6CA", "\uA6CA"], /* BAMUM LETTER PEE */ + ["\uA6CB", "\uA6CB"], /* BAMUM LETTER FEE */ + ["\uA6CC", "\uA6CC"], /* BAMUM LETTER RU */ + ["\uA6CD", "\uA6CD"], /* BAMUM LETTER LU */ + ["\uA6CE", "\uA6CE"], /* BAMUM LETTER MI */ + ["\uA6CF", "\uA6CF"], /* BAMUM LETTER NI */ + ["\uA6D0", "\uA6D0"], /* BAMUM LETTER REUX */ + ["\uA6D1", "\uA6D1"], /* BAMUM LETTER RAE */ + ["\uA6D2", "\uA6D2"], /* BAMUM LETTER KEN */ + ["\uA6D3", "\uA6D3"], /* BAMUM LETTER NGKWAEN */ + ["\uA6D4", "\uA6D4"], /* BAMUM LETTER NGGA */ + ["\uA6D5", "\uA6D5"], /* BAMUM LETTER NGA */ + ["\uA6D6", "\uA6D6"], /* BAMUM LETTER SHO */ + ["\uA6D7", "\uA6D7"], /* BAMUM LETTER PUAE */ + ["\uA6D8", "\uA6D8"], /* BAMUM LETTER FU */ + ["\uA6D9", "\uA6D9"], /* BAMUM LETTER FOM */ + ["\uA6DA", "\uA6DA"], /* BAMUM LETTER WA */ + ["\uA6DB", "\uA6DB"], /* BAMUM LETTER NA */ + ["\uA6DC", "\uA6DC"], /* BAMUM LETTER LI */ + ["\uA6DD", "\uA6DD"], /* BAMUM LETTER PI */ + ["\uA6DE", "\uA6DE"], /* BAMUM LETTER LOQ */ + ["\uA6DF", "\uA6DF"], /* BAMUM LETTER KO */ + ["\uA6E0", "\uA6E0"], /* BAMUM LETTER MBEN */ + ["\uA6E1", "\uA6E1"], /* BAMUM LETTER REN */ + ["\uA6E2", "\uA6E2"], /* BAMUM LETTER MEN */ + ["\uA6E3", "\uA6E3"], /* BAMUM LETTER MA */ + ["\uA6E4", "\uA6E4"], /* BAMUM LETTER TI */ + ["\uA6E5", "\uA6E5"], /* BAMUM LETTER KI */ + ["\uA6E6", "\uA6E6"], /* BAMUM LETTER MO */ + ["\uA6E7", "\uA6E7"], /* BAMUM LETTER MBAA */ + ["\uA6E8", "\uA6E8"], /* BAMUM LETTER TET */ + ["\uA6E9", "\uA6E9"], /* BAMUM LETTER KPA */ + ["\uA6EA", "\uA6EA"], /* BAMUM LETTER TEN */ + ["\uA6EB", "\uA6EB"], /* BAMUM LETTER NTUU */ + ["\uA6EC", "\uA6EC"], /* BAMUM LETTER SAMBA */ + ["\uA6ED", "\uA6ED"], /* BAMUM LETTER FAAMAE */ + ["\uA6EE", "\uA6EE"], /* BAMUM LETTER KOVUU */ + ["\uA6EF", "\uA6EF"], /* BAMUM LETTER KOGHOM */ + ["\uA6F0", "\uA6F0"], /* BAMUM COMBINING MARK KOQNDON */ + ["\uA6F1", "\uA6F1"], /* BAMUM COMBINING MARK TUKWENTIS */ + ["\uA6F2", "\uA6F2"], /* BAMUM NJAEMLI */ + ["\uA6F3", "\uA6F3"], /* BAMUM FULL STOP */ + ["\uA6F4", "\uA6F4"], /* BAMUM COLON */ + ["\uA6F5", "\uA6F5"], /* BAMUM COMMA */ + ["\uA6F6", "\uA6F6"], /* BAMUM SEMICOLON */ + ["\uA6F7", "\uA6F7"], /* BAMUM QUESTION MARK */ + ["\uA6F8", "\uA6F8"], + ["\uA6F9", "\uA6F9"], + ["\uA6FA", "\uA6FA"], + ["\uA6FB", "\uA6FB"], + ["\uA6FC", "\uA6FC"], + ["\uA6FD", "\uA6FD"], + ["\uA6FE", "\uA6FE"], + ["\uA6FF", "\uA6FF"], + ["\uA700", "\uA700"], /* MODIFIER LETTER CHINESE TONE YIN PING */ + ["\uA701", "\uA701"], /* MODIFIER LETTER CHINESE TONE YANG PING */ + ["\uA702", "\uA702"], /* MODIFIER LETTER CHINESE TONE YIN SHANG */ + ["\uA703", "\uA703"], /* MODIFIER LETTER CHINESE TONE YANG SHANG */ + ["\uA704", "\uA704"], /* MODIFIER LETTER CHINESE TONE YIN QU */ + ["\uA705", "\uA705"], /* MODIFIER LETTER CHINESE TONE YANG QU */ + ["\uA706", "\uA706"], /* MODIFIER LETTER CHINESE TONE YIN RU */ + ["\uA707", "\uA707"], /* MODIFIER LETTER CHINESE TONE YANG RU */ + ["\uA708", "\uA708"], /* MODIFIER LETTER EXTRA-HIGH DOTTED TONE BAR */ + ["\uA709", "\uA709"], /* MODIFIER LETTER HIGH DOTTED TONE BAR */ + ["\uA70A", "\uA70A"], /* MODIFIER LETTER MID DOTTED TONE BAR */ + ["\uA70B", "\uA70B"], /* MODIFIER LETTER LOW DOTTED TONE BAR */ + ["\uA70C", "\uA70C"], /* MODIFIER LETTER EXTRA-LOW DOTTED TONE BAR */ + ["\uA70D", "\uA70D"], /* MODIFIER LETTER EXTRA-HIGH DOTTED LEFT-STEM TONE BAR */ + ["\uA70E", "\uA70E"], /* MODIFIER LETTER HIGH DOTTED LEFT-STEM TONE BAR */ + ["\uA70F", "\uA70F"], /* MODIFIER LETTER MID DOTTED LEFT-STEM TONE BAR */ + ["\uA710", "\uA710"], /* MODIFIER LETTER LOW DOTTED LEFT-STEM TONE BAR */ + ["\uA711", "\uA711"], /* MODIFIER LETTER EXTRA-LOW DOTTED LEFT-STEM TONE BAR */ + ["\uA712", "\uA712"], /* MODIFIER LETTER EXTRA-HIGH LEFT-STEM TONE BAR */ + ["\uA713", "\uA713"], /* MODIFIER LETTER HIGH LEFT-STEM TONE BAR */ + ["\uA714", "\uA714"], /* MODIFIER LETTER MID LEFT-STEM TONE BAR */ + ["\uA715", "\uA715"], /* MODIFIER LETTER LOW LEFT-STEM TONE BAR */ + ["\uA716", "\uA716"], /* MODIFIER LETTER EXTRA-LOW LEFT-STEM TONE BAR */ + ["\uA717", "\uA717"], /* MODIFIER LETTER DOT VERTICAL BAR */ + ["\uA718", "\uA718"], /* MODIFIER LETTER DOT SLASH */ + ["\uA719", "\uA719"], /* MODIFIER LETTER DOT HORIZONTAL BAR */ + ["\uA71A", "\uA71A"], /* MODIFIER LETTER LOWER RIGHT CORNER ANGLE */ + ["\uA71B", "\uA71B"], /* MODIFIER LETTER RAISED UP ARROW */ + ["\uA71C", "\uA71C"], /* MODIFIER LETTER RAISED DOWN ARROW */ + ["\uA71D", "\uA71D"], /* MODIFIER LETTER RAISED EXCLAMATION MARK */ + ["\uA71E", "\uA71E"], /* MODIFIER LETTER RAISED INVERTED EXCLAMATION MARK */ + ["\uA71F", "\uA71F"], /* MODIFIER LETTER LOW INVERTED EXCLAMATION MARK */ + ["\uA720", "\uA720"], /* MODIFIER LETTER STRESS AND HIGH TONE */ + ["\uA721", "\uA721"], /* MODIFIER LETTER STRESS AND LOW TONE */ + ["\uA722", "\uA723"], /* LATIN CAPITAL LETTER EGYPTOLOGICAL ALEF */ + ["\uA722", "\uA723"], /* LATIN SMALL LETTER EGYPTOLOGICAL ALEF */ + ["\uA724", "\uA725"], /* LATIN CAPITAL LETTER EGYPTOLOGICAL AIN */ + ["\uA724", "\uA725"], /* LATIN SMALL LETTER EGYPTOLOGICAL AIN */ + ["\uA726", "\uA727"], /* LATIN CAPITAL LETTER HENG */ + ["\uA726", "\uA727"], /* LATIN SMALL LETTER HENG */ + ["\uA728", "\uA729"], /* LATIN CAPITAL LETTER TZ */ + ["\uA728", "\uA729"], /* LATIN SMALL LETTER TZ */ + ["\uA72A", "\uA72B"], /* LATIN CAPITAL LETTER TRESILLO */ + ["\uA72A", "\uA72B"], /* LATIN SMALL LETTER TRESILLO */ + ["\uA72C", "\uA72D"], /* LATIN CAPITAL LETTER CUATRILLO */ + ["\uA72C", "\uA72D"], /* LATIN SMALL LETTER CUATRILLO */ + ["\uA72E", "\uA72F"], /* LATIN CAPITAL LETTER CUATRILLO WITH COMMA */ + ["\uA72E", "\uA72F"], /* LATIN SMALL LETTER CUATRILLO WITH COMMA */ + ["\uA730", "\uA730"], /* LATIN LETTER SMALL CAPITAL F */ + ["\uA731", "\uA731"], /* LATIN LETTER SMALL CAPITAL S */ + ["\uA732", "\uA733"], /* LATIN CAPITAL LETTER AA */ + ["\uA732", "\uA733"], /* LATIN SMALL LETTER AA */ + ["\uA734", "\uA735"], /* LATIN CAPITAL LETTER AO */ + ["\uA734", "\uA735"], /* LATIN SMALL LETTER AO */ + ["\uA736", "\uA737"], /* LATIN CAPITAL LETTER AU */ + ["\uA736", "\uA737"], /* LATIN SMALL LETTER AU */ + ["\uA738", "\uA739"], /* LATIN CAPITAL LETTER AV */ + ["\uA738", "\uA739"], /* LATIN SMALL LETTER AV */ + ["\uA73A", "\uA73B"], /* LATIN CAPITAL LETTER AV WITH HORIZONTAL BAR */ + ["\uA73A", "\uA73B"], /* LATIN SMALL LETTER AV WITH HORIZONTAL BAR */ + ["\uA73C", "\uA73D"], /* LATIN CAPITAL LETTER AY */ + ["\uA73C", "\uA73D"], /* LATIN SMALL LETTER AY */ + ["\uA73E", "\uA73F"], /* LATIN CAPITAL LETTER REVERSED C WITH DOT */ + ["\uA73E", "\uA73F"], /* LATIN SMALL LETTER REVERSED C WITH DOT */ + ["\uA740", "\uA741"], /* LATIN CAPITAL LETTER K WITH STROKE */ + ["\uA740", "\uA741"], /* LATIN SMALL LETTER K WITH STROKE */ + ["\uA742", "\uA743"], /* LATIN CAPITAL LETTER K WITH DIAGONAL STROKE */ + ["\uA742", "\uA743"], /* LATIN SMALL LETTER K WITH DIAGONAL STROKE */ + ["\uA744", "\uA745"], /* LATIN CAPITAL LETTER K WITH STROKE AND DIAGONAL STROKE */ + ["\uA744", "\uA745"], /* LATIN SMALL LETTER K WITH STROKE AND DIAGONAL STROKE */ + ["\uA746", "\uA747"], /* LATIN CAPITAL LETTER BROKEN L */ + ["\uA746", "\uA747"], /* LATIN SMALL LETTER BROKEN L */ + ["\uA748", "\uA749"], /* LATIN CAPITAL LETTER L WITH HIGH STROKE */ + ["\uA748", "\uA749"], /* LATIN SMALL LETTER L WITH HIGH STROKE */ + ["\uA74A", "\uA74B"], /* LATIN CAPITAL LETTER O WITH LONG STROKE OVERLAY */ + ["\uA74A", "\uA74B"], /* LATIN SMALL LETTER O WITH LONG STROKE OVERLAY */ + ["\uA74C", "\uA74D"], /* LATIN CAPITAL LETTER O WITH LOOP */ + ["\uA74C", "\uA74D"], /* LATIN SMALL LETTER O WITH LOOP */ + ["\uA74E", "\uA74F"], /* LATIN CAPITAL LETTER OO */ + ["\uA74E", "\uA74F"], /* LATIN SMALL LETTER OO */ + ["\uA750", "\uA751"], /* LATIN CAPITAL LETTER P WITH STROKE THROUGH DESCENDER */ + ["\uA750", "\uA751"], /* LATIN SMALL LETTER P WITH STROKE THROUGH DESCENDER */ + ["\uA752", "\uA753"], /* LATIN CAPITAL LETTER P WITH FLOURISH */ + ["\uA752", "\uA753"], /* LATIN SMALL LETTER P WITH FLOURISH */ + ["\uA754", "\uA755"], /* LATIN CAPITAL LETTER P WITH SQUIRREL TAIL */ + ["\uA754", "\uA755"], /* LATIN SMALL LETTER P WITH SQUIRREL TAIL */ + ["\uA756", "\uA757"], /* LATIN CAPITAL LETTER Q WITH STROKE THROUGH DESCENDER */ + ["\uA756", "\uA757"], /* LATIN SMALL LETTER Q WITH STROKE THROUGH DESCENDER */ + ["\uA758", "\uA759"], /* LATIN CAPITAL LETTER Q WITH DIAGONAL STROKE */ + ["\uA758", "\uA759"], /* LATIN SMALL LETTER Q WITH DIAGONAL STROKE */ + ["\uA75A", "\uA75B"], /* LATIN CAPITAL LETTER R ROTUNDA */ + ["\uA75A", "\uA75B"], /* LATIN SMALL LETTER R ROTUNDA */ + ["\uA75C", "\uA75D"], /* LATIN CAPITAL LETTER RUM ROTUNDA */ + ["\uA75C", "\uA75D"], /* LATIN SMALL LETTER RUM ROTUNDA */ + ["\uA75E", "\uA75F"], /* LATIN CAPITAL LETTER V WITH DIAGONAL STROKE */ + ["\uA75E", "\uA75F"], /* LATIN SMALL LETTER V WITH DIAGONAL STROKE */ + ["\uA760", "\uA761"], /* LATIN CAPITAL LETTER VY */ + ["\uA760", "\uA761"], /* LATIN SMALL LETTER VY */ + ["\uA762", "\uA763"], /* LATIN CAPITAL LETTER VISIGOTHIC Z */ + ["\uA762", "\uA763"], /* LATIN SMALL LETTER VISIGOTHIC Z */ + ["\uA764", "\uA765"], /* LATIN CAPITAL LETTER THORN WITH STROKE */ + ["\uA764", "\uA765"], /* LATIN SMALL LETTER THORN WITH STROKE */ + ["\uA766", "\uA767"], /* LATIN CAPITAL LETTER THORN WITH STROKE THROUGH DESCENDER */ + ["\uA766", "\uA767"], /* LATIN SMALL LETTER THORN WITH STROKE THROUGH DESCENDER */ + ["\uA768", "\uA769"], /* LATIN CAPITAL LETTER VEND */ + ["\uA768", "\uA769"], /* LATIN SMALL LETTER VEND */ + ["\uA76A", "\uA76B"], /* LATIN CAPITAL LETTER ET */ + ["\uA76A", "\uA76B"], /* LATIN SMALL LETTER ET */ + ["\uA76C", "\uA76D"], /* LATIN CAPITAL LETTER IS */ + ["\uA76C", "\uA76D"], /* LATIN SMALL LETTER IS */ + ["\uA76E", "\uA76F"], /* LATIN CAPITAL LETTER CON */ + ["\uA76E", "\uA76F"], /* LATIN SMALL LETTER CON */ + ["\uA770", "\uA770"], /* MODIFIER LETTER US */ + ["\uA771", "\uA771"], /* LATIN SMALL LETTER DUM */ + ["\uA772", "\uA772"], /* LATIN SMALL LETTER LUM */ + ["\uA773", "\uA773"], /* LATIN SMALL LETTER MUM */ + ["\uA774", "\uA774"], /* LATIN SMALL LETTER NUM */ + ["\uA775", "\uA775"], /* LATIN SMALL LETTER RUM */ + ["\uA776", "\uA776"], /* LATIN LETTER SMALL CAPITAL RUM */ + ["\uA777", "\uA777"], /* LATIN SMALL LETTER TUM */ + ["\uA778", "\uA778"], /* LATIN SMALL LETTER UM */ + ["\uA779", "\uA77A"], /* LATIN CAPITAL LETTER INSULAR D */ + ["\uA779", "\uA77A"], /* LATIN SMALL LETTER INSULAR D */ + ["\uA77B", "\uA77C"], /* LATIN CAPITAL LETTER INSULAR F */ + ["\uA77B", "\uA77C"], /* LATIN SMALL LETTER INSULAR F */ + ["\uA77D", "\u1D79"], /* LATIN CAPITAL LETTER INSULAR G */ + ["\uA77E", "\uA77F"], /* LATIN CAPITAL LETTER TURNED INSULAR G */ + ["\uA77E", "\uA77F"], /* LATIN SMALL LETTER TURNED INSULAR G */ + ["\uA780", "\uA781"], /* LATIN CAPITAL LETTER TURNED L */ + ["\uA780", "\uA781"], /* LATIN SMALL LETTER TURNED L */ + ["\uA782", "\uA783"], /* LATIN CAPITAL LETTER INSULAR R */ + ["\uA782", "\uA783"], /* LATIN SMALL LETTER INSULAR R */ + ["\uA784", "\uA785"], /* LATIN CAPITAL LETTER INSULAR S */ + ["\uA784", "\uA785"], /* LATIN SMALL LETTER INSULAR S */ + ["\uA786", "\uA787"], /* LATIN CAPITAL LETTER INSULAR T */ + ["\uA786", "\uA787"], /* LATIN SMALL LETTER INSULAR T */ + ["\uA788", "\uA788"], /* MODIFIER LETTER LOW CIRCUMFLEX ACCENT */ + ["\uA789", "\uA789"], /* MODIFIER LETTER COLON */ + ["\uA78A", "\uA78A"], /* MODIFIER LETTER SHORT EQUALS SIGN */ + ["\uA78B", "\uA78C"], /* LATIN CAPITAL LETTER SALTILLO */ + ["\uA78B", "\uA78C"], /* LATIN SMALL LETTER SALTILLO */ + ["\uA78D", "\u0265"], /* LATIN CAPITAL LETTER TURNED H */ + ["\uA78E", "\uA78E"], /* LATIN SMALL LETTER L WITH RETROFLEX HOOK AND BELT */ + ["\uA78F", "\uA78F"], /* LATIN LETTER SINOLOGICAL DOT */ + ["\uA790", "\uA791"], /* LATIN CAPITAL LETTER N WITH DESCENDER */ + ["\uA790", "\uA791"], /* LATIN SMALL LETTER N WITH DESCENDER */ + ["\uA792", "\uA793"], /* LATIN CAPITAL LETTER C WITH BAR */ + ["\uA792", "\uA793"], /* LATIN SMALL LETTER C WITH BAR */ + ["\uA7C4", "\uA794"], /* LATIN SMALL LETTER C WITH PALATAL HOOK */ + ["\uA795", "\uA795"], /* LATIN SMALL LETTER H WITH PALATAL HOOK */ + ["\uA796", "\uA797"], /* LATIN CAPITAL LETTER B WITH FLOURISH */ + ["\uA796", "\uA797"], /* LATIN SMALL LETTER B WITH FLOURISH */ + ["\uA798", "\uA799"], /* LATIN CAPITAL LETTER F WITH STROKE */ + ["\uA798", "\uA799"], /* LATIN SMALL LETTER F WITH STROKE */ + ["\uA79A", "\uA79B"], /* LATIN CAPITAL LETTER VOLAPUK AE */ + ["\uA79A", "\uA79B"], /* LATIN SMALL LETTER VOLAPUK AE */ + ["\uA79C", "\uA79D"], /* LATIN CAPITAL LETTER VOLAPUK OE */ + ["\uA79C", "\uA79D"], /* LATIN SMALL LETTER VOLAPUK OE */ + ["\uA79E", "\uA79F"], /* LATIN CAPITAL LETTER VOLAPUK UE */ + ["\uA79E", "\uA79F"], /* LATIN SMALL LETTER VOLAPUK UE */ + ["\uA7A0", "\uA7A1"], /* LATIN CAPITAL LETTER G WITH OBLIQUE STROKE */ + ["\uA7A0", "\uA7A1"], /* LATIN SMALL LETTER G WITH OBLIQUE STROKE */ + ["\uA7A2", "\uA7A3"], /* LATIN CAPITAL LETTER K WITH OBLIQUE STROKE */ + ["\uA7A2", "\uA7A3"], /* LATIN SMALL LETTER K WITH OBLIQUE STROKE */ + ["\uA7A4", "\uA7A5"], /* LATIN CAPITAL LETTER N WITH OBLIQUE STROKE */ + ["\uA7A4", "\uA7A5"], /* LATIN SMALL LETTER N WITH OBLIQUE STROKE */ + ["\uA7A6", "\uA7A7"], /* LATIN CAPITAL LETTER R WITH OBLIQUE STROKE */ + ["\uA7A6", "\uA7A7"], /* LATIN SMALL LETTER R WITH OBLIQUE STROKE */ + ["\uA7A8", "\uA7A9"], /* LATIN CAPITAL LETTER S WITH OBLIQUE STROKE */ + ["\uA7A8", "\uA7A9"], /* LATIN SMALL LETTER S WITH OBLIQUE STROKE */ + ["\uA7AA", "\u0266"], /* LATIN CAPITAL LETTER H WITH HOOK */ + ["\uA7AB", "\u025C"], /* LATIN CAPITAL LETTER REVERSED OPEN E */ + ["\uA7AC", "\u0261"], /* LATIN CAPITAL LETTER SCRIPT G */ + ["\uA7AD", "\u026C"], /* LATIN CAPITAL LETTER L WITH BELT */ + ["\uA7AE", "\u026A"], /* LATIN CAPITAL LETTER SMALL CAPITAL I */ + ["\uA7AF", "\uA7AF"], /* LATIN LETTER SMALL CAPITAL Q */ + ["\uA7B0", "\u029E"], /* LATIN CAPITAL LETTER TURNED K */ + ["\uA7B1", "\u0287"], /* LATIN CAPITAL LETTER TURNED T */ + ["\uA7B2", "\u029D"], /* LATIN CAPITAL LETTER J WITH CROSSED-TAIL */ + ["\uA7B3", "\uAB53"], /* LATIN CAPITAL LETTER CHI */ + ["\uA7B4", "\uA7B5"], /* LATIN CAPITAL LETTER BETA */ + ["\uA7B4", "\uA7B5"], /* LATIN SMALL LETTER BETA */ + ["\uA7B6", "\uA7B7"], /* LATIN CAPITAL LETTER OMEGA */ + ["\uA7B6", "\uA7B7"], /* LATIN SMALL LETTER OMEGA */ + ["\uA7B8", "\uA7B9"], /* LATIN CAPITAL LETTER U WITH STROKE */ + ["\uA7B8", "\uA7B9"], /* LATIN SMALL LETTER U WITH STROKE */ + ["\uA7BA", "\uA7BB"], /* LATIN CAPITAL LETTER GLOTTAL A */ + ["\uA7BA", "\uA7BB"], /* LATIN SMALL LETTER GLOTTAL A */ + ["\uA7BC", "\uA7BD"], /* LATIN CAPITAL LETTER GLOTTAL I */ + ["\uA7BC", "\uA7BD"], /* LATIN SMALL LETTER GLOTTAL I */ + ["\uA7BE", "\uA7BF"], /* LATIN CAPITAL LETTER GLOTTAL U */ + ["\uA7BE", "\uA7BF"], /* LATIN SMALL LETTER GLOTTAL U */ + ["\uA7C0", "\uA7C1"], /* LATIN CAPITAL LETTER OLD POLISH O */ + ["\uA7C0", "\uA7C1"], /* LATIN SMALL LETTER OLD POLISH O */ + ["\uA7C2", "\uA7C3"], /* LATIN CAPITAL LETTER ANGLICANA W */ + ["\uA7C2", "\uA7C3"], /* LATIN SMALL LETTER ANGLICANA W */ + ["\uA7C4", "\uA794"], /* LATIN CAPITAL LETTER C WITH PALATAL HOOK */ + ["\uA7C5", "\u0282"], /* LATIN CAPITAL LETTER S WITH HOOK */ + ["\uA7C6", "\u1D8E"], /* LATIN CAPITAL LETTER Z WITH PALATAL HOOK */ + ["\uA7C7", "\uA7C8"], /* LATIN CAPITAL LETTER D WITH SHORT STROKE OVERLAY */ + ["\uA7C7", "\uA7C8"], /* LATIN SMALL LETTER D WITH SHORT STROKE OVERLAY */ + ["\uA7C9", "\uA7CA"], /* LATIN CAPITAL LETTER S WITH SHORT STROKE OVERLAY */ + ["\uA7C9", "\uA7CA"], /* LATIN SMALL LETTER S WITH SHORT STROKE OVERLAY */ + ["\uA7CB", "\uA7CB"], + ["\uA7CC", "\uA7CC"], + ["\uA7CD", "\uA7CD"], + ["\uA7CE", "\uA7CE"], + ["\uA7CF", "\uA7CF"], + ["\uA7D0", "\uA7D1"], /* LATIN CAPITAL LETTER CLOSED INSULAR G */ + ["\uA7D0", "\uA7D1"], /* LATIN SMALL LETTER CLOSED INSULAR G */ + ["\uA7D2", "\uA7D2"], + ["\uA7D3", "\uA7D3"], /* LATIN SMALL LETTER DOUBLE THORN */ + ["\uA7D4", "\uA7D4"], + ["\uA7D5", "\uA7D5"], /* LATIN SMALL LETTER DOUBLE WYNN */ + ["\uA7D6", "\uA7D7"], /* LATIN CAPITAL LETTER MIDDLE SCOTS S */ + ["\uA7D6", "\uA7D7"], /* LATIN SMALL LETTER MIDDLE SCOTS S */ + ["\uA7D8", "\uA7D9"], /* LATIN CAPITAL LETTER SIGMOID S */ + ["\uA7D8", "\uA7D9"], /* LATIN SMALL LETTER SIGMOID S */ + ["\uA7DA", "\uA7DA"], + ["\uA7DB", "\uA7DB"], + ["\uA7DC", "\uA7DC"], + ["\uA7DD", "\uA7DD"], + ["\uA7DE", "\uA7DE"], + ["\uA7DF", "\uA7DF"], + ["\uA7E0", "\uA7E0"], + ["\uA7E1", "\uA7E1"], + ["\uA7E2", "\uA7E2"], + ["\uA7E3", "\uA7E3"], + ["\uA7E4", "\uA7E4"], + ["\uA7E5", "\uA7E5"], + ["\uA7E6", "\uA7E6"], + ["\uA7E7", "\uA7E7"], + ["\uA7E8", "\uA7E8"], + ["\uA7E9", "\uA7E9"], + ["\uA7EA", "\uA7EA"], + ["\uA7EB", "\uA7EB"], + ["\uA7EC", "\uA7EC"], + ["\uA7ED", "\uA7ED"], + ["\uA7EE", "\uA7EE"], + ["\uA7EF", "\uA7EF"], + ["\uA7F0", "\uA7F0"], + ["\uA7F1", "\uA7F1"], + ["\uA7F2", "\uA7F2"], /* MODIFIER LETTER CAPITAL C */ + ["\uA7F3", "\uA7F3"], /* MODIFIER LETTER CAPITAL F */ + ["\uA7F4", "\uA7F4"], /* MODIFIER LETTER CAPITAL Q */ + ["\uA7F5", "\uA7F6"], /* LATIN CAPITAL LETTER REVERSED HALF H */ + ["\uA7F5", "\uA7F6"], /* LATIN SMALL LETTER REVERSED HALF H */ + ["\uA7F7", "\uA7F7"], /* LATIN EPIGRAPHIC LETTER SIDEWAYS I */ + ["\uA7F8", "\uA7F8"], /* MODIFIER LETTER CAPITAL H WITH STROKE */ + ["\uA7F9", "\uA7F9"], /* MODIFIER LETTER SMALL LIGATURE OE */ + ["\uA7FA", "\uA7FA"], /* LATIN LETTER SMALL CAPITAL TURNED M */ + ["\uA7FB", "\uA7FB"], /* LATIN EPIGRAPHIC LETTER REVERSED F */ + ["\uA7FC", "\uA7FC"], /* LATIN EPIGRAPHIC LETTER REVERSED P */ + ["\uA7FD", "\uA7FD"], /* LATIN EPIGRAPHIC LETTER INVERTED M */ + ["\uA7FE", "\uA7FE"], /* LATIN EPIGRAPHIC LETTER I LONGA */ + ["\uA7FF", "\uA7FF"], /* LATIN EPIGRAPHIC LETTER ARCHAIC M */ + ["\uA800", "\uA800"], /* SYLOTI NAGRI LETTER A */ + ["\uA801", "\uA801"], /* SYLOTI NAGRI LETTER I */ + ["\uA802", "\uA802"], /* SYLOTI NAGRI SIGN DVISVARA */ + ["\uA803", "\uA803"], /* SYLOTI NAGRI LETTER U */ + ["\uA804", "\uA804"], /* SYLOTI NAGRI LETTER E */ + ["\uA805", "\uA805"], /* SYLOTI NAGRI LETTER O */ + ["\uA806", "\uA806"], /* SYLOTI NAGRI SIGN HASANTA */ + ["\uA807", "\uA807"], /* SYLOTI NAGRI LETTER KO */ + ["\uA808", "\uA808"], /* SYLOTI NAGRI LETTER KHO */ + ["\uA809", "\uA809"], /* SYLOTI NAGRI LETTER GO */ + ["\uA80A", "\uA80A"], /* SYLOTI NAGRI LETTER GHO */ + ["\uA80B", "\uA80B"], /* SYLOTI NAGRI SIGN ANUSVARA */ + ["\uA80C", "\uA80C"], /* SYLOTI NAGRI LETTER CO */ + ["\uA80D", "\uA80D"], /* SYLOTI NAGRI LETTER CHO */ + ["\uA80E", "\uA80E"], /* SYLOTI NAGRI LETTER JO */ + ["\uA80F", "\uA80F"], /* SYLOTI NAGRI LETTER JHO */ + ["\uA810", "\uA810"], /* SYLOTI NAGRI LETTER TTO */ + ["\uA811", "\uA811"], /* SYLOTI NAGRI LETTER TTHO */ + ["\uA812", "\uA812"], /* SYLOTI NAGRI LETTER DDO */ + ["\uA813", "\uA813"], /* SYLOTI NAGRI LETTER DDHO */ + ["\uA814", "\uA814"], /* SYLOTI NAGRI LETTER TO */ + ["\uA815", "\uA815"], /* SYLOTI NAGRI LETTER THO */ + ["\uA816", "\uA816"], /* SYLOTI NAGRI LETTER DO */ + ["\uA817", "\uA817"], /* SYLOTI NAGRI LETTER DHO */ + ["\uA818", "\uA818"], /* SYLOTI NAGRI LETTER NO */ + ["\uA819", "\uA819"], /* SYLOTI NAGRI LETTER PO */ + ["\uA81A", "\uA81A"], /* SYLOTI NAGRI LETTER PHO */ + ["\uA81B", "\uA81B"], /* SYLOTI NAGRI LETTER BO */ + ["\uA81C", "\uA81C"], /* SYLOTI NAGRI LETTER BHO */ + ["\uA81D", "\uA81D"], /* SYLOTI NAGRI LETTER MO */ + ["\uA81E", "\uA81E"], /* SYLOTI NAGRI LETTER RO */ + ["\uA81F", "\uA81F"], /* SYLOTI NAGRI LETTER LO */ + ["\uA820", "\uA820"], /* SYLOTI NAGRI LETTER RRO */ + ["\uA821", "\uA821"], /* SYLOTI NAGRI LETTER SO */ + ["\uA822", "\uA822"], /* SYLOTI NAGRI LETTER HO */ + ["\uA823", "\uA823"], /* SYLOTI NAGRI VOWEL SIGN A */ + ["\uA824", "\uA824"], /* SYLOTI NAGRI VOWEL SIGN I */ + ["\uA825", "\uA825"], /* SYLOTI NAGRI VOWEL SIGN U */ + ["\uA826", "\uA826"], /* SYLOTI NAGRI VOWEL SIGN E */ + ["\uA827", "\uA827"], /* SYLOTI NAGRI VOWEL SIGN OO */ + ["\uA828", "\uA828"], /* SYLOTI NAGRI POETRY MARK-1 */ + ["\uA829", "\uA829"], /* SYLOTI NAGRI POETRY MARK-2 */ + ["\uA82A", "\uA82A"], /* SYLOTI NAGRI POETRY MARK-3 */ + ["\uA82B", "\uA82B"], /* SYLOTI NAGRI POETRY MARK-4 */ + ["\uA82C", "\uA82C"], /* SYLOTI NAGRI SIGN ALTERNATE HASANTA */ + ["\uA82D", "\uA82D"], + ["\uA82E", "\uA82E"], + ["\uA82F", "\uA82F"], + ["\uA830", "\uA830"], /* NORTH INDIC FRACTION ONE QUARTER */ + ["\uA831", "\uA831"], /* NORTH INDIC FRACTION ONE HALF */ + ["\uA832", "\uA832"], /* NORTH INDIC FRACTION THREE QUARTERS */ + ["\uA833", "\uA833"], /* NORTH INDIC FRACTION ONE SIXTEENTH */ + ["\uA834", "\uA834"], /* NORTH INDIC FRACTION ONE EIGHTH */ + ["\uA835", "\uA835"], /* NORTH INDIC FRACTION THREE SIXTEENTHS */ + ["\uA836", "\uA836"], /* NORTH INDIC QUARTER MARK */ + ["\uA837", "\uA837"], /* NORTH INDIC PLACEHOLDER MARK */ + ["\uA838", "\uA838"], /* NORTH INDIC RUPEE MARK */ + ["\uA839", "\uA839"], /* NORTH INDIC QUANTITY MARK */ + ["\uA83A", "\uA83A"], + ["\uA83B", "\uA83B"], + ["\uA83C", "\uA83C"], + ["\uA83D", "\uA83D"], + ["\uA83E", "\uA83E"], + ["\uA83F", "\uA83F"], + ["\uA840", "\uA840"], /* PHAGS-PA LETTER KA */ + ["\uA841", "\uA841"], /* PHAGS-PA LETTER KHA */ + ["\uA842", "\uA842"], /* PHAGS-PA LETTER GA */ + ["\uA843", "\uA843"], /* PHAGS-PA LETTER NGA */ + ["\uA844", "\uA844"], /* PHAGS-PA LETTER CA */ + ["\uA845", "\uA845"], /* PHAGS-PA LETTER CHA */ + ["\uA846", "\uA846"], /* PHAGS-PA LETTER JA */ + ["\uA847", "\uA847"], /* PHAGS-PA LETTER NYA */ + ["\uA848", "\uA848"], /* PHAGS-PA LETTER TA */ + ["\uA849", "\uA849"], /* PHAGS-PA LETTER THA */ + ["\uA84A", "\uA84A"], /* PHAGS-PA LETTER DA */ + ["\uA84B", "\uA84B"], /* PHAGS-PA LETTER NA */ + ["\uA84C", "\uA84C"], /* PHAGS-PA LETTER PA */ + ["\uA84D", "\uA84D"], /* PHAGS-PA LETTER PHA */ + ["\uA84E", "\uA84E"], /* PHAGS-PA LETTER BA */ + ["\uA84F", "\uA84F"], /* PHAGS-PA LETTER MA */ + ["\uA850", "\uA850"], /* PHAGS-PA LETTER TSA */ + ["\uA851", "\uA851"], /* PHAGS-PA LETTER TSHA */ + ["\uA852", "\uA852"], /* PHAGS-PA LETTER DZA */ + ["\uA853", "\uA853"], /* PHAGS-PA LETTER WA */ + ["\uA854", "\uA854"], /* PHAGS-PA LETTER ZHA */ + ["\uA855", "\uA855"], /* PHAGS-PA LETTER ZA */ + ["\uA856", "\uA856"], /* PHAGS-PA LETTER SMALL A */ + ["\uA857", "\uA857"], /* PHAGS-PA LETTER YA */ + ["\uA858", "\uA858"], /* PHAGS-PA LETTER RA */ + ["\uA859", "\uA859"], /* PHAGS-PA LETTER LA */ + ["\uA85A", "\uA85A"], /* PHAGS-PA LETTER SHA */ + ["\uA85B", "\uA85B"], /* PHAGS-PA LETTER SA */ + ["\uA85C", "\uA85C"], /* PHAGS-PA LETTER HA */ + ["\uA85D", "\uA85D"], /* PHAGS-PA LETTER A */ + ["\uA85E", "\uA85E"], /* PHAGS-PA LETTER I */ + ["\uA85F", "\uA85F"], /* PHAGS-PA LETTER U */ + ["\uA860", "\uA860"], /* PHAGS-PA LETTER E */ + ["\uA861", "\uA861"], /* PHAGS-PA LETTER O */ + ["\uA862", "\uA862"], /* PHAGS-PA LETTER QA */ + ["\uA863", "\uA863"], /* PHAGS-PA LETTER XA */ + ["\uA864", "\uA864"], /* PHAGS-PA LETTER FA */ + ["\uA865", "\uA865"], /* PHAGS-PA LETTER GGA */ + ["\uA866", "\uA866"], /* PHAGS-PA LETTER EE */ + ["\uA867", "\uA867"], /* PHAGS-PA SUBJOINED LETTER WA */ + ["\uA868", "\uA868"], /* PHAGS-PA SUBJOINED LETTER YA */ + ["\uA869", "\uA869"], /* PHAGS-PA LETTER TTA */ + ["\uA86A", "\uA86A"], /* PHAGS-PA LETTER TTHA */ + ["\uA86B", "\uA86B"], /* PHAGS-PA LETTER DDA */ + ["\uA86C", "\uA86C"], /* PHAGS-PA LETTER NNA */ + ["\uA86D", "\uA86D"], /* PHAGS-PA LETTER ALTERNATE YA */ + ["\uA86E", "\uA86E"], /* PHAGS-PA LETTER VOICELESS SHA */ + ["\uA86F", "\uA86F"], /* PHAGS-PA LETTER VOICED HA */ + ["\uA870", "\uA870"], /* PHAGS-PA LETTER ASPIRATED FA */ + ["\uA871", "\uA871"], /* PHAGS-PA SUBJOINED LETTER RA */ + ["\uA872", "\uA872"], /* PHAGS-PA SUPERFIXED LETTER RA */ + ["\uA873", "\uA873"], /* PHAGS-PA LETTER CANDRABINDU */ + ["\uA874", "\uA874"], /* PHAGS-PA SINGLE HEAD MARK */ + ["\uA875", "\uA875"], /* PHAGS-PA DOUBLE HEAD MARK */ + ["\uA876", "\uA876"], /* PHAGS-PA MARK SHAD */ + ["\uA877", "\uA877"], /* PHAGS-PA MARK DOUBLE SHAD */ + ["\uA878", "\uA878"], + ["\uA879", "\uA879"], + ["\uA87A", "\uA87A"], + ["\uA87B", "\uA87B"], + ["\uA87C", "\uA87C"], + ["\uA87D", "\uA87D"], + ["\uA87E", "\uA87E"], + ["\uA87F", "\uA87F"], + ["\uA880", "\uA880"], /* SAURASHTRA SIGN ANUSVARA */ + ["\uA881", "\uA881"], /* SAURASHTRA SIGN VISARGA */ + ["\uA882", "\uA882"], /* SAURASHTRA LETTER A */ + ["\uA883", "\uA883"], /* SAURASHTRA LETTER AA */ + ["\uA884", "\uA884"], /* SAURASHTRA LETTER I */ + ["\uA885", "\uA885"], /* SAURASHTRA LETTER II */ + ["\uA886", "\uA886"], /* SAURASHTRA LETTER U */ + ["\uA887", "\uA887"], /* SAURASHTRA LETTER UU */ + ["\uA888", "\uA888"], /* SAURASHTRA LETTER VOCALIC R */ + ["\uA889", "\uA889"], /* SAURASHTRA LETTER VOCALIC RR */ + ["\uA88A", "\uA88A"], /* SAURASHTRA LETTER VOCALIC L */ + ["\uA88B", "\uA88B"], /* SAURASHTRA LETTER VOCALIC LL */ + ["\uA88C", "\uA88C"], /* SAURASHTRA LETTER E */ + ["\uA88D", "\uA88D"], /* SAURASHTRA LETTER EE */ + ["\uA88E", "\uA88E"], /* SAURASHTRA LETTER AI */ + ["\uA88F", "\uA88F"], /* SAURASHTRA LETTER O */ + ["\uA890", "\uA890"], /* SAURASHTRA LETTER OO */ + ["\uA891", "\uA891"], /* SAURASHTRA LETTER AU */ + ["\uA892", "\uA892"], /* SAURASHTRA LETTER KA */ + ["\uA893", "\uA893"], /* SAURASHTRA LETTER KHA */ + ["\uA894", "\uA894"], /* SAURASHTRA LETTER GA */ + ["\uA895", "\uA895"], /* SAURASHTRA LETTER GHA */ + ["\uA896", "\uA896"], /* SAURASHTRA LETTER NGA */ + ["\uA897", "\uA897"], /* SAURASHTRA LETTER CA */ + ["\uA898", "\uA898"], /* SAURASHTRA LETTER CHA */ + ["\uA899", "\uA899"], /* SAURASHTRA LETTER JA */ + ["\uA89A", "\uA89A"], /* SAURASHTRA LETTER JHA */ + ["\uA89B", "\uA89B"], /* SAURASHTRA LETTER NYA */ + ["\uA89C", "\uA89C"], /* SAURASHTRA LETTER TTA */ + ["\uA89D", "\uA89D"], /* SAURASHTRA LETTER TTHA */ + ["\uA89E", "\uA89E"], /* SAURASHTRA LETTER DDA */ + ["\uA89F", "\uA89F"], /* SAURASHTRA LETTER DDHA */ + ["\uA8A0", "\uA8A0"], /* SAURASHTRA LETTER NNA */ + ["\uA8A1", "\uA8A1"], /* SAURASHTRA LETTER TA */ + ["\uA8A2", "\uA8A2"], /* SAURASHTRA LETTER THA */ + ["\uA8A3", "\uA8A3"], /* SAURASHTRA LETTER DA */ + ["\uA8A4", "\uA8A4"], /* SAURASHTRA LETTER DHA */ + ["\uA8A5", "\uA8A5"], /* SAURASHTRA LETTER NA */ + ["\uA8A6", "\uA8A6"], /* SAURASHTRA LETTER PA */ + ["\uA8A7", "\uA8A7"], /* SAURASHTRA LETTER PHA */ + ["\uA8A8", "\uA8A8"], /* SAURASHTRA LETTER BA */ + ["\uA8A9", "\uA8A9"], /* SAURASHTRA LETTER BHA */ + ["\uA8AA", "\uA8AA"], /* SAURASHTRA LETTER MA */ + ["\uA8AB", "\uA8AB"], /* SAURASHTRA LETTER YA */ + ["\uA8AC", "\uA8AC"], /* SAURASHTRA LETTER RA */ + ["\uA8AD", "\uA8AD"], /* SAURASHTRA LETTER LA */ + ["\uA8AE", "\uA8AE"], /* SAURASHTRA LETTER VA */ + ["\uA8AF", "\uA8AF"], /* SAURASHTRA LETTER SHA */ + ["\uA8B0", "\uA8B0"], /* SAURASHTRA LETTER SSA */ + ["\uA8B1", "\uA8B1"], /* SAURASHTRA LETTER SA */ + ["\uA8B2", "\uA8B2"], /* SAURASHTRA LETTER HA */ + ["\uA8B3", "\uA8B3"], /* SAURASHTRA LETTER LLA */ + ["\uA8B4", "\uA8B4"], /* SAURASHTRA CONSONANT SIGN HAARU */ + ["\uA8B5", "\uA8B5"], /* SAURASHTRA VOWEL SIGN AA */ + ["\uA8B6", "\uA8B6"], /* SAURASHTRA VOWEL SIGN I */ + ["\uA8B7", "\uA8B7"], /* SAURASHTRA VOWEL SIGN II */ + ["\uA8B8", "\uA8B8"], /* SAURASHTRA VOWEL SIGN U */ + ["\uA8B9", "\uA8B9"], /* SAURASHTRA VOWEL SIGN UU */ + ["\uA8BA", "\uA8BA"], /* SAURASHTRA VOWEL SIGN VOCALIC R */ + ["\uA8BB", "\uA8BB"], /* SAURASHTRA VOWEL SIGN VOCALIC RR */ + ["\uA8BC", "\uA8BC"], /* SAURASHTRA VOWEL SIGN VOCALIC L */ + ["\uA8BD", "\uA8BD"], /* SAURASHTRA VOWEL SIGN VOCALIC LL */ + ["\uA8BE", "\uA8BE"], /* SAURASHTRA VOWEL SIGN E */ + ["\uA8BF", "\uA8BF"], /* SAURASHTRA VOWEL SIGN EE */ + ["\uA8C0", "\uA8C0"], /* SAURASHTRA VOWEL SIGN AI */ + ["\uA8C1", "\uA8C1"], /* SAURASHTRA VOWEL SIGN O */ + ["\uA8C2", "\uA8C2"], /* SAURASHTRA VOWEL SIGN OO */ + ["\uA8C3", "\uA8C3"], /* SAURASHTRA VOWEL SIGN AU */ + ["\uA8C4", "\uA8C4"], /* SAURASHTRA SIGN VIRAMA */ + ["\uA8C5", "\uA8C5"], /* SAURASHTRA SIGN CANDRABINDU */ + ["\uA8C6", "\uA8C6"], + ["\uA8C7", "\uA8C7"], + ["\uA8C8", "\uA8C8"], + ["\uA8C9", "\uA8C9"], + ["\uA8CA", "\uA8CA"], + ["\uA8CB", "\uA8CB"], + ["\uA8CC", "\uA8CC"], + ["\uA8CD", "\uA8CD"], + ["\uA8CE", "\uA8CE"], /* SAURASHTRA DANDA */ + ["\uA8CF", "\uA8CF"], /* SAURASHTRA DOUBLE DANDA */ + ["\uA8D0", "\uA8D0"], /* SAURASHTRA DIGIT ZERO */ + ["\uA8D1", "\uA8D1"], /* SAURASHTRA DIGIT ONE */ + ["\uA8D2", "\uA8D2"], /* SAURASHTRA DIGIT TWO */ + ["\uA8D3", "\uA8D3"], /* SAURASHTRA DIGIT THREE */ + ["\uA8D4", "\uA8D4"], /* SAURASHTRA DIGIT FOUR */ + ["\uA8D5", "\uA8D5"], /* SAURASHTRA DIGIT FIVE */ + ["\uA8D6", "\uA8D6"], /* SAURASHTRA DIGIT SIX */ + ["\uA8D7", "\uA8D7"], /* SAURASHTRA DIGIT SEVEN */ + ["\uA8D8", "\uA8D8"], /* SAURASHTRA DIGIT EIGHT */ + ["\uA8D9", "\uA8D9"], /* SAURASHTRA DIGIT NINE */ + ["\uA8DA", "\uA8DA"], + ["\uA8DB", "\uA8DB"], + ["\uA8DC", "\uA8DC"], + ["\uA8DD", "\uA8DD"], + ["\uA8DE", "\uA8DE"], + ["\uA8DF", "\uA8DF"], + ["\uA8E0", "\uA8E0"], /* COMBINING DEVANAGARI DIGIT ZERO */ + ["\uA8E1", "\uA8E1"], /* COMBINING DEVANAGARI DIGIT ONE */ + ["\uA8E2", "\uA8E2"], /* COMBINING DEVANAGARI DIGIT TWO */ + ["\uA8E3", "\uA8E3"], /* COMBINING DEVANAGARI DIGIT THREE */ + ["\uA8E4", "\uA8E4"], /* COMBINING DEVANAGARI DIGIT FOUR */ + ["\uA8E5", "\uA8E5"], /* COMBINING DEVANAGARI DIGIT FIVE */ + ["\uA8E6", "\uA8E6"], /* COMBINING DEVANAGARI DIGIT SIX */ + ["\uA8E7", "\uA8E7"], /* COMBINING DEVANAGARI DIGIT SEVEN */ + ["\uA8E8", "\uA8E8"], /* COMBINING DEVANAGARI DIGIT EIGHT */ + ["\uA8E9", "\uA8E9"], /* COMBINING DEVANAGARI DIGIT NINE */ + ["\uA8EA", "\uA8EA"], /* COMBINING DEVANAGARI LETTER A */ + ["\uA8EB", "\uA8EB"], /* COMBINING DEVANAGARI LETTER U */ + ["\uA8EC", "\uA8EC"], /* COMBINING DEVANAGARI LETTER KA */ + ["\uA8ED", "\uA8ED"], /* COMBINING DEVANAGARI LETTER NA */ + ["\uA8EE", "\uA8EE"], /* COMBINING DEVANAGARI LETTER PA */ + ["\uA8EF", "\uA8EF"], /* COMBINING DEVANAGARI LETTER RA */ + ["\uA8F0", "\uA8F0"], /* COMBINING DEVANAGARI LETTER VI */ + ["\uA8F1", "\uA8F1"], /* COMBINING DEVANAGARI SIGN AVAGRAHA */ + ["\uA8F2", "\uA8F2"], /* DEVANAGARI SIGN SPACING CANDRABINDU */ + ["\uA8F3", "\uA8F3"], /* DEVANAGARI SIGN CANDRABINDU VIRAMA */ + ["\uA8F4", "\uA8F4"], /* DEVANAGARI SIGN DOUBLE CANDRABINDU VIRAMA */ + ["\uA8F5", "\uA8F5"], /* DEVANAGARI SIGN CANDRABINDU TWO */ + ["\uA8F6", "\uA8F6"], /* DEVANAGARI SIGN CANDRABINDU THREE */ + ["\uA8F7", "\uA8F7"], /* DEVANAGARI SIGN CANDRABINDU AVAGRAHA */ + ["\uA8F8", "\uA8F8"], /* DEVANAGARI SIGN PUSHPIKA */ + ["\uA8F9", "\uA8F9"], /* DEVANAGARI GAP FILLER */ + ["\uA8FA", "\uA8FA"], /* DEVANAGARI CARET */ + ["\uA8FB", "\uA8FB"], /* DEVANAGARI HEADSTROKE */ + ["\uA8FC", "\uA8FC"], /* DEVANAGARI SIGN SIDDHAM */ + ["\uA8FD", "\uA8FD"], /* DEVANAGARI JAIN OM */ + ["\uA8FE", "\uA8FE"], /* DEVANAGARI LETTER AY */ + ["\uA8FF", "\uA8FF"], /* DEVANAGARI VOWEL SIGN AY */ + ["\uA900", "\uA900"], /* KAYAH LI DIGIT ZERO */ + ["\uA901", "\uA901"], /* KAYAH LI DIGIT ONE */ + ["\uA902", "\uA902"], /* KAYAH LI DIGIT TWO */ + ["\uA903", "\uA903"], /* KAYAH LI DIGIT THREE */ + ["\uA904", "\uA904"], /* KAYAH LI DIGIT FOUR */ + ["\uA905", "\uA905"], /* KAYAH LI DIGIT FIVE */ + ["\uA906", "\uA906"], /* KAYAH LI DIGIT SIX */ + ["\uA907", "\uA907"], /* KAYAH LI DIGIT SEVEN */ + ["\uA908", "\uA908"], /* KAYAH LI DIGIT EIGHT */ + ["\uA909", "\uA909"], /* KAYAH LI DIGIT NINE */ + ["\uA90A", "\uA90A"], /* KAYAH LI LETTER KA */ + ["\uA90B", "\uA90B"], /* KAYAH LI LETTER KHA */ + ["\uA90C", "\uA90C"], /* KAYAH LI LETTER GA */ + ["\uA90D", "\uA90D"], /* KAYAH LI LETTER NGA */ + ["\uA90E", "\uA90E"], /* KAYAH LI LETTER SA */ + ["\uA90F", "\uA90F"], /* KAYAH LI LETTER SHA */ + ["\uA910", "\uA910"], /* KAYAH LI LETTER ZA */ + ["\uA911", "\uA911"], /* KAYAH LI LETTER NYA */ + ["\uA912", "\uA912"], /* KAYAH LI LETTER TA */ + ["\uA913", "\uA913"], /* KAYAH LI LETTER HTA */ + ["\uA914", "\uA914"], /* KAYAH LI LETTER NA */ + ["\uA915", "\uA915"], /* KAYAH LI LETTER PA */ + ["\uA916", "\uA916"], /* KAYAH LI LETTER PHA */ + ["\uA917", "\uA917"], /* KAYAH LI LETTER MA */ + ["\uA918", "\uA918"], /* KAYAH LI LETTER DA */ + ["\uA919", "\uA919"], /* KAYAH LI LETTER BA */ + ["\uA91A", "\uA91A"], /* KAYAH LI LETTER RA */ + ["\uA91B", "\uA91B"], /* KAYAH LI LETTER YA */ + ["\uA91C", "\uA91C"], /* KAYAH LI LETTER LA */ + ["\uA91D", "\uA91D"], /* KAYAH LI LETTER WA */ + ["\uA91E", "\uA91E"], /* KAYAH LI LETTER THA */ + ["\uA91F", "\uA91F"], /* KAYAH LI LETTER HA */ + ["\uA920", "\uA920"], /* KAYAH LI LETTER VA */ + ["\uA921", "\uA921"], /* KAYAH LI LETTER CA */ + ["\uA922", "\uA922"], /* KAYAH LI LETTER A */ + ["\uA923", "\uA923"], /* KAYAH LI LETTER OE */ + ["\uA924", "\uA924"], /* KAYAH LI LETTER I */ + ["\uA925", "\uA925"], /* KAYAH LI LETTER OO */ + ["\uA926", "\uA926"], /* KAYAH LI VOWEL UE */ + ["\uA927", "\uA927"], /* KAYAH LI VOWEL E */ + ["\uA928", "\uA928"], /* KAYAH LI VOWEL U */ + ["\uA929", "\uA929"], /* KAYAH LI VOWEL EE */ + ["\uA92A", "\uA92A"], /* KAYAH LI VOWEL O */ + ["\uA92B", "\uA92B"], /* KAYAH LI TONE PLOPHU */ + ["\uA92C", "\uA92C"], /* KAYAH LI TONE CALYA */ + ["\uA92D", "\uA92D"], /* KAYAH LI TONE CALYA PLOPHU */ + ["\uA92E", "\uA92E"], /* KAYAH LI SIGN CWI */ + ["\uA92F", "\uA92F"], /* KAYAH LI SIGN SHYA */ + ["\uA930", "\uA930"], /* REJANG LETTER KA */ + ["\uA931", "\uA931"], /* REJANG LETTER GA */ + ["\uA932", "\uA932"], /* REJANG LETTER NGA */ + ["\uA933", "\uA933"], /* REJANG LETTER TA */ + ["\uA934", "\uA934"], /* REJANG LETTER DA */ + ["\uA935", "\uA935"], /* REJANG LETTER NA */ + ["\uA936", "\uA936"], /* REJANG LETTER PA */ + ["\uA937", "\uA937"], /* REJANG LETTER BA */ + ["\uA938", "\uA938"], /* REJANG LETTER MA */ + ["\uA939", "\uA939"], /* REJANG LETTER CA */ + ["\uA93A", "\uA93A"], /* REJANG LETTER JA */ + ["\uA93B", "\uA93B"], /* REJANG LETTER NYA */ + ["\uA93C", "\uA93C"], /* REJANG LETTER SA */ + ["\uA93D", "\uA93D"], /* REJANG LETTER RA */ + ["\uA93E", "\uA93E"], /* REJANG LETTER LA */ + ["\uA93F", "\uA93F"], /* REJANG LETTER YA */ + ["\uA940", "\uA940"], /* REJANG LETTER WA */ + ["\uA941", "\uA941"], /* REJANG LETTER HA */ + ["\uA942", "\uA942"], /* REJANG LETTER MBA */ + ["\uA943", "\uA943"], /* REJANG LETTER NGGA */ + ["\uA944", "\uA944"], /* REJANG LETTER NDA */ + ["\uA945", "\uA945"], /* REJANG LETTER NYJA */ + ["\uA946", "\uA946"], /* REJANG LETTER A */ + ["\uA947", "\uA947"], /* REJANG VOWEL SIGN I */ + ["\uA948", "\uA948"], /* REJANG VOWEL SIGN U */ + ["\uA949", "\uA949"], /* REJANG VOWEL SIGN E */ + ["\uA94A", "\uA94A"], /* REJANG VOWEL SIGN AI */ + ["\uA94B", "\uA94B"], /* REJANG VOWEL SIGN O */ + ["\uA94C", "\uA94C"], /* REJANG VOWEL SIGN AU */ + ["\uA94D", "\uA94D"], /* REJANG VOWEL SIGN EU */ + ["\uA94E", "\uA94E"], /* REJANG VOWEL SIGN EA */ + ["\uA94F", "\uA94F"], /* REJANG CONSONANT SIGN NG */ + ["\uA950", "\uA950"], /* REJANG CONSONANT SIGN N */ + ["\uA951", "\uA951"], /* REJANG CONSONANT SIGN R */ + ["\uA952", "\uA952"], /* REJANG CONSONANT SIGN H */ + ["\uA953", "\uA953"], /* REJANG VIRAMA */ + ["\uA954", "\uA954"], + ["\uA955", "\uA955"], + ["\uA956", "\uA956"], + ["\uA957", "\uA957"], + ["\uA958", "\uA958"], + ["\uA959", "\uA959"], + ["\uA95A", "\uA95A"], + ["\uA95B", "\uA95B"], + ["\uA95C", "\uA95C"], + ["\uA95D", "\uA95D"], + ["\uA95E", "\uA95E"], + ["\uA95F", "\uA95F"], /* REJANG SECTION MARK */ + ["\uA960", "\uA960"], /* HANGUL CHOSEONG TIKEUT-MIEUM */ + ["\uA961", "\uA961"], /* HANGUL CHOSEONG TIKEUT-PIEUP */ + ["\uA962", "\uA962"], /* HANGUL CHOSEONG TIKEUT-SIOS */ + ["\uA963", "\uA963"], /* HANGUL CHOSEONG TIKEUT-CIEUC */ + ["\uA964", "\uA964"], /* HANGUL CHOSEONG RIEUL-KIYEOK */ + ["\uA965", "\uA965"], /* HANGUL CHOSEONG RIEUL-SSANGKIYEOK */ + ["\uA966", "\uA966"], /* HANGUL CHOSEONG RIEUL-TIKEUT */ + ["\uA967", "\uA967"], /* HANGUL CHOSEONG RIEUL-SSANGTIKEUT */ + ["\uA968", "\uA968"], /* HANGUL CHOSEONG RIEUL-MIEUM */ + ["\uA969", "\uA969"], /* HANGUL CHOSEONG RIEUL-PIEUP */ + ["\uA96A", "\uA96A"], /* HANGUL CHOSEONG RIEUL-SSANGPIEUP */ + ["\uA96B", "\uA96B"], /* HANGUL CHOSEONG RIEUL-KAPYEOUNPIEUP */ + ["\uA96C", "\uA96C"], /* HANGUL CHOSEONG RIEUL-SIOS */ + ["\uA96D", "\uA96D"], /* HANGUL CHOSEONG RIEUL-CIEUC */ + ["\uA96E", "\uA96E"], /* HANGUL CHOSEONG RIEUL-KHIEUKH */ + ["\uA96F", "\uA96F"], /* HANGUL CHOSEONG MIEUM-KIYEOK */ + ["\uA970", "\uA970"], /* HANGUL CHOSEONG MIEUM-TIKEUT */ + ["\uA971", "\uA971"], /* HANGUL CHOSEONG MIEUM-SIOS */ + ["\uA972", "\uA972"], /* HANGUL CHOSEONG PIEUP-SIOS-THIEUTH */ + ["\uA973", "\uA973"], /* HANGUL CHOSEONG PIEUP-KHIEUKH */ + ["\uA974", "\uA974"], /* HANGUL CHOSEONG PIEUP-HIEUH */ + ["\uA975", "\uA975"], /* HANGUL CHOSEONG SSANGSIOS-PIEUP */ + ["\uA976", "\uA976"], /* HANGUL CHOSEONG IEUNG-RIEUL */ + ["\uA977", "\uA977"], /* HANGUL CHOSEONG IEUNG-HIEUH */ + ["\uA978", "\uA978"], /* HANGUL CHOSEONG SSANGCIEUC-HIEUH */ + ["\uA979", "\uA979"], /* HANGUL CHOSEONG SSANGTHIEUTH */ + ["\uA97A", "\uA97A"], /* HANGUL CHOSEONG PHIEUPH-HIEUH */ + ["\uA97B", "\uA97B"], /* HANGUL CHOSEONG HIEUH-SIOS */ + ["\uA97C", "\uA97C"], /* HANGUL CHOSEONG SSANGYEORINHIEUH */ + ["\uA97D", "\uA97D"], + ["\uA97E", "\uA97E"], + ["\uA97F", "\uA97F"], + ["\uA980", "\uA980"], /* JAVANESE SIGN PANYANGGA */ + ["\uA981", "\uA981"], /* JAVANESE SIGN CECAK */ + ["\uA982", "\uA982"], /* JAVANESE SIGN LAYAR */ + ["\uA983", "\uA983"], /* JAVANESE SIGN WIGNYAN */ + ["\uA984", "\uA984"], /* JAVANESE LETTER A */ + ["\uA985", "\uA985"], /* JAVANESE LETTER I KAWI */ + ["\uA986", "\uA986"], /* JAVANESE LETTER I */ + ["\uA987", "\uA987"], /* JAVANESE LETTER II */ + ["\uA988", "\uA988"], /* JAVANESE LETTER U */ + ["\uA989", "\uA989"], /* JAVANESE LETTER PA CEREK */ + ["\uA98A", "\uA98A"], /* JAVANESE LETTER NGA LELET */ + ["\uA98B", "\uA98B"], /* JAVANESE LETTER NGA LELET RASWADI */ + ["\uA98C", "\uA98C"], /* JAVANESE LETTER E */ + ["\uA98D", "\uA98D"], /* JAVANESE LETTER AI */ + ["\uA98E", "\uA98E"], /* JAVANESE LETTER O */ + ["\uA98F", "\uA98F"], /* JAVANESE LETTER KA */ + ["\uA990", "\uA990"], /* JAVANESE LETTER KA SASAK */ + ["\uA991", "\uA991"], /* JAVANESE LETTER KA MURDA */ + ["\uA992", "\uA992"], /* JAVANESE LETTER GA */ + ["\uA993", "\uA993"], /* JAVANESE LETTER GA MURDA */ + ["\uA994", "\uA994"], /* JAVANESE LETTER NGA */ + ["\uA995", "\uA995"], /* JAVANESE LETTER CA */ + ["\uA996", "\uA996"], /* JAVANESE LETTER CA MURDA */ + ["\uA997", "\uA997"], /* JAVANESE LETTER JA */ + ["\uA998", "\uA998"], /* JAVANESE LETTER NYA MURDA */ + ["\uA999", "\uA999"], /* JAVANESE LETTER JA MAHAPRANA */ + ["\uA99A", "\uA99A"], /* JAVANESE LETTER NYA */ + ["\uA99B", "\uA99B"], /* JAVANESE LETTER TTA */ + ["\uA99C", "\uA99C"], /* JAVANESE LETTER TTA MAHAPRANA */ + ["\uA99D", "\uA99D"], /* JAVANESE LETTER DDA */ + ["\uA99E", "\uA99E"], /* JAVANESE LETTER DDA MAHAPRANA */ + ["\uA99F", "\uA99F"], /* JAVANESE LETTER NA MURDA */ + ["\uA9A0", "\uA9A0"], /* JAVANESE LETTER TA */ + ["\uA9A1", "\uA9A1"], /* JAVANESE LETTER TA MURDA */ + ["\uA9A2", "\uA9A2"], /* JAVANESE LETTER DA */ + ["\uA9A3", "\uA9A3"], /* JAVANESE LETTER DA MAHAPRANA */ + ["\uA9A4", "\uA9A4"], /* JAVANESE LETTER NA */ + ["\uA9A5", "\uA9A5"], /* JAVANESE LETTER PA */ + ["\uA9A6", "\uA9A6"], /* JAVANESE LETTER PA MURDA */ + ["\uA9A7", "\uA9A7"], /* JAVANESE LETTER BA */ + ["\uA9A8", "\uA9A8"], /* JAVANESE LETTER BA MURDA */ + ["\uA9A9", "\uA9A9"], /* JAVANESE LETTER MA */ + ["\uA9AA", "\uA9AA"], /* JAVANESE LETTER YA */ + ["\uA9AB", "\uA9AB"], /* JAVANESE LETTER RA */ + ["\uA9AC", "\uA9AC"], /* JAVANESE LETTER RA AGUNG */ + ["\uA9AD", "\uA9AD"], /* JAVANESE LETTER LA */ + ["\uA9AE", "\uA9AE"], /* JAVANESE LETTER WA */ + ["\uA9AF", "\uA9AF"], /* JAVANESE LETTER SA MURDA */ + ["\uA9B0", "\uA9B0"], /* JAVANESE LETTER SA MAHAPRANA */ + ["\uA9B1", "\uA9B1"], /* JAVANESE LETTER SA */ + ["\uA9B2", "\uA9B2"], /* JAVANESE LETTER HA */ + ["\uA9B3", "\uA9B3"], /* JAVANESE SIGN CECAK TELU */ + ["\uA9B4", "\uA9B4"], /* JAVANESE VOWEL SIGN TARUNG */ + ["\uA9B5", "\uA9B5"], /* JAVANESE VOWEL SIGN TOLONG */ + ["\uA9B6", "\uA9B6"], /* JAVANESE VOWEL SIGN WULU */ + ["\uA9B7", "\uA9B7"], /* JAVANESE VOWEL SIGN WULU MELIK */ + ["\uA9B8", "\uA9B8"], /* JAVANESE VOWEL SIGN SUKU */ + ["\uA9B9", "\uA9B9"], /* JAVANESE VOWEL SIGN SUKU MENDUT */ + ["\uA9BA", "\uA9BA"], /* JAVANESE VOWEL SIGN TALING */ + ["\uA9BB", "\uA9BB"], /* JAVANESE VOWEL SIGN DIRGA MURE */ + ["\uA9BC", "\uA9BC"], /* JAVANESE VOWEL SIGN PEPET */ + ["\uA9BD", "\uA9BD"], /* JAVANESE CONSONANT SIGN KERET */ + ["\uA9BE", "\uA9BE"], /* JAVANESE CONSONANT SIGN PENGKAL */ + ["\uA9BF", "\uA9BF"], /* JAVANESE CONSONANT SIGN CAKRA */ + ["\uA9C0", "\uA9C0"], /* JAVANESE PANGKON */ + ["\uA9C1", "\uA9C1"], /* JAVANESE LEFT RERENGGAN */ + ["\uA9C2", "\uA9C2"], /* JAVANESE RIGHT RERENGGAN */ + ["\uA9C3", "\uA9C3"], /* JAVANESE PADA ANDAP */ + ["\uA9C4", "\uA9C4"], /* JAVANESE PADA MADYA */ + ["\uA9C5", "\uA9C5"], /* JAVANESE PADA LUHUR */ + ["\uA9C6", "\uA9C6"], /* JAVANESE PADA WINDU */ + ["\uA9C7", "\uA9C7"], /* JAVANESE PADA PANGKAT */ + ["\uA9C8", "\uA9C8"], /* JAVANESE PADA LINGSA */ + ["\uA9C9", "\uA9C9"], /* JAVANESE PADA LUNGSI */ + ["\uA9CA", "\uA9CA"], /* JAVANESE PADA ADEG */ + ["\uA9CB", "\uA9CB"], /* JAVANESE PADA ADEG ADEG */ + ["\uA9CC", "\uA9CC"], /* JAVANESE PADA PISELEH */ + ["\uA9CD", "\uA9CD"], /* JAVANESE TURNED PADA PISELEH */ + ["\uA9CE", "\uA9CE"], + ["\uA9CF", "\uA9CF"], /* JAVANESE PANGRANGKEP */ + ["\uA9D0", "\uA9D0"], /* JAVANESE DIGIT ZERO */ + ["\uA9D1", "\uA9D1"], /* JAVANESE DIGIT ONE */ + ["\uA9D2", "\uA9D2"], /* JAVANESE DIGIT TWO */ + ["\uA9D3", "\uA9D3"], /* JAVANESE DIGIT THREE */ + ["\uA9D4", "\uA9D4"], /* JAVANESE DIGIT FOUR */ + ["\uA9D5", "\uA9D5"], /* JAVANESE DIGIT FIVE */ + ["\uA9D6", "\uA9D6"], /* JAVANESE DIGIT SIX */ + ["\uA9D7", "\uA9D7"], /* JAVANESE DIGIT SEVEN */ + ["\uA9D8", "\uA9D8"], /* JAVANESE DIGIT EIGHT */ + ["\uA9D9", "\uA9D9"], /* JAVANESE DIGIT NINE */ + ["\uA9DA", "\uA9DA"], + ["\uA9DB", "\uA9DB"], + ["\uA9DC", "\uA9DC"], + ["\uA9DD", "\uA9DD"], + ["\uA9DE", "\uA9DE"], /* JAVANESE PADA TIRTA TUMETES */ + ["\uA9DF", "\uA9DF"], /* JAVANESE PADA ISEN-ISEN */ + ["\uA9E0", "\uA9E0"], /* MYANMAR LETTER SHAN GHA */ + ["\uA9E1", "\uA9E1"], /* MYANMAR LETTER SHAN CHA */ + ["\uA9E2", "\uA9E2"], /* MYANMAR LETTER SHAN JHA */ + ["\uA9E3", "\uA9E3"], /* MYANMAR LETTER SHAN NNA */ + ["\uA9E4", "\uA9E4"], /* MYANMAR LETTER SHAN BHA */ + ["\uA9E5", "\uA9E5"], /* MYANMAR SIGN SHAN SAW */ + ["\uA9E6", "\uA9E6"], /* MYANMAR MODIFIER LETTER SHAN REDUPLICATION */ + ["\uA9E7", "\uA9E7"], /* MYANMAR LETTER TAI LAING NYA */ + ["\uA9E8", "\uA9E8"], /* MYANMAR LETTER TAI LAING FA */ + ["\uA9E9", "\uA9E9"], /* MYANMAR LETTER TAI LAING GA */ + ["\uA9EA", "\uA9EA"], /* MYANMAR LETTER TAI LAING GHA */ + ["\uA9EB", "\uA9EB"], /* MYANMAR LETTER TAI LAING JA */ + ["\uA9EC", "\uA9EC"], /* MYANMAR LETTER TAI LAING JHA */ + ["\uA9ED", "\uA9ED"], /* MYANMAR LETTER TAI LAING DDA */ + ["\uA9EE", "\uA9EE"], /* MYANMAR LETTER TAI LAING DDHA */ + ["\uA9EF", "\uA9EF"], /* MYANMAR LETTER TAI LAING NNA */ + ["\uA9F0", "\uA9F0"], /* MYANMAR TAI LAING DIGIT ZERO */ + ["\uA9F1", "\uA9F1"], /* MYANMAR TAI LAING DIGIT ONE */ + ["\uA9F2", "\uA9F2"], /* MYANMAR TAI LAING DIGIT TWO */ + ["\uA9F3", "\uA9F3"], /* MYANMAR TAI LAING DIGIT THREE */ + ["\uA9F4", "\uA9F4"], /* MYANMAR TAI LAING DIGIT FOUR */ + ["\uA9F5", "\uA9F5"], /* MYANMAR TAI LAING DIGIT FIVE */ + ["\uA9F6", "\uA9F6"], /* MYANMAR TAI LAING DIGIT SIX */ + ["\uA9F7", "\uA9F7"], /* MYANMAR TAI LAING DIGIT SEVEN */ + ["\uA9F8", "\uA9F8"], /* MYANMAR TAI LAING DIGIT EIGHT */ + ["\uA9F9", "\uA9F9"], /* MYANMAR TAI LAING DIGIT NINE */ + ["\uA9FA", "\uA9FA"], /* MYANMAR LETTER TAI LAING LLA */ + ["\uA9FB", "\uA9FB"], /* MYANMAR LETTER TAI LAING DA */ + ["\uA9FC", "\uA9FC"], /* MYANMAR LETTER TAI LAING DHA */ + ["\uA9FD", "\uA9FD"], /* MYANMAR LETTER TAI LAING BA */ + ["\uA9FE", "\uA9FE"], /* MYANMAR LETTER TAI LAING BHA */ + ["\uA9FF", "\uA9FF"], + ["\uAA00", "\uAA00"], /* CHAM LETTER A */ + ["\uAA01", "\uAA01"], /* CHAM LETTER I */ + ["\uAA02", "\uAA02"], /* CHAM LETTER U */ + ["\uAA03", "\uAA03"], /* CHAM LETTER E */ + ["\uAA04", "\uAA04"], /* CHAM LETTER AI */ + ["\uAA05", "\uAA05"], /* CHAM LETTER O */ + ["\uAA06", "\uAA06"], /* CHAM LETTER KA */ + ["\uAA07", "\uAA07"], /* CHAM LETTER KHA */ + ["\uAA08", "\uAA08"], /* CHAM LETTER GA */ + ["\uAA09", "\uAA09"], /* CHAM LETTER GHA */ + ["\uAA0A", "\uAA0A"], /* CHAM LETTER NGUE */ + ["\uAA0B", "\uAA0B"], /* CHAM LETTER NGA */ + ["\uAA0C", "\uAA0C"], /* CHAM LETTER CHA */ + ["\uAA0D", "\uAA0D"], /* CHAM LETTER CHHA */ + ["\uAA0E", "\uAA0E"], /* CHAM LETTER JA */ + ["\uAA0F", "\uAA0F"], /* CHAM LETTER JHA */ + ["\uAA10", "\uAA10"], /* CHAM LETTER NHUE */ + ["\uAA11", "\uAA11"], /* CHAM LETTER NHA */ + ["\uAA12", "\uAA12"], /* CHAM LETTER NHJA */ + ["\uAA13", "\uAA13"], /* CHAM LETTER TA */ + ["\uAA14", "\uAA14"], /* CHAM LETTER THA */ + ["\uAA15", "\uAA15"], /* CHAM LETTER DA */ + ["\uAA16", "\uAA16"], /* CHAM LETTER DHA */ + ["\uAA17", "\uAA17"], /* CHAM LETTER NUE */ + ["\uAA18", "\uAA18"], /* CHAM LETTER NA */ + ["\uAA19", "\uAA19"], /* CHAM LETTER DDA */ + ["\uAA1A", "\uAA1A"], /* CHAM LETTER PA */ + ["\uAA1B", "\uAA1B"], /* CHAM LETTER PPA */ + ["\uAA1C", "\uAA1C"], /* CHAM LETTER PHA */ + ["\uAA1D", "\uAA1D"], /* CHAM LETTER BA */ + ["\uAA1E", "\uAA1E"], /* CHAM LETTER BHA */ + ["\uAA1F", "\uAA1F"], /* CHAM LETTER MUE */ + ["\uAA20", "\uAA20"], /* CHAM LETTER MA */ + ["\uAA21", "\uAA21"], /* CHAM LETTER BBA */ + ["\uAA22", "\uAA22"], /* CHAM LETTER YA */ + ["\uAA23", "\uAA23"], /* CHAM LETTER RA */ + ["\uAA24", "\uAA24"], /* CHAM LETTER LA */ + ["\uAA25", "\uAA25"], /* CHAM LETTER VA */ + ["\uAA26", "\uAA26"], /* CHAM LETTER SSA */ + ["\uAA27", "\uAA27"], /* CHAM LETTER SA */ + ["\uAA28", "\uAA28"], /* CHAM LETTER HA */ + ["\uAA29", "\uAA29"], /* CHAM VOWEL SIGN AA */ + ["\uAA2A", "\uAA2A"], /* CHAM VOWEL SIGN I */ + ["\uAA2B", "\uAA2B"], /* CHAM VOWEL SIGN II */ + ["\uAA2C", "\uAA2C"], /* CHAM VOWEL SIGN EI */ + ["\uAA2D", "\uAA2D"], /* CHAM VOWEL SIGN U */ + ["\uAA2E", "\uAA2E"], /* CHAM VOWEL SIGN OE */ + ["\uAA2F", "\uAA2F"], /* CHAM VOWEL SIGN O */ + ["\uAA30", "\uAA30"], /* CHAM VOWEL SIGN AI */ + ["\uAA31", "\uAA31"], /* CHAM VOWEL SIGN AU */ + ["\uAA32", "\uAA32"], /* CHAM VOWEL SIGN UE */ + ["\uAA33", "\uAA33"], /* CHAM CONSONANT SIGN YA */ + ["\uAA34", "\uAA34"], /* CHAM CONSONANT SIGN RA */ + ["\uAA35", "\uAA35"], /* CHAM CONSONANT SIGN LA */ + ["\uAA36", "\uAA36"], /* CHAM CONSONANT SIGN WA */ + ["\uAA37", "\uAA37"], + ["\uAA38", "\uAA38"], + ["\uAA39", "\uAA39"], + ["\uAA3A", "\uAA3A"], + ["\uAA3B", "\uAA3B"], + ["\uAA3C", "\uAA3C"], + ["\uAA3D", "\uAA3D"], + ["\uAA3E", "\uAA3E"], + ["\uAA3F", "\uAA3F"], + ["\uAA40", "\uAA40"], /* CHAM LETTER FINAL K */ + ["\uAA41", "\uAA41"], /* CHAM LETTER FINAL G */ + ["\uAA42", "\uAA42"], /* CHAM LETTER FINAL NG */ + ["\uAA43", "\uAA43"], /* CHAM CONSONANT SIGN FINAL NG */ + ["\uAA44", "\uAA44"], /* CHAM LETTER FINAL CH */ + ["\uAA45", "\uAA45"], /* CHAM LETTER FINAL T */ + ["\uAA46", "\uAA46"], /* CHAM LETTER FINAL N */ + ["\uAA47", "\uAA47"], /* CHAM LETTER FINAL P */ + ["\uAA48", "\uAA48"], /* CHAM LETTER FINAL Y */ + ["\uAA49", "\uAA49"], /* CHAM LETTER FINAL R */ + ["\uAA4A", "\uAA4A"], /* CHAM LETTER FINAL L */ + ["\uAA4B", "\uAA4B"], /* CHAM LETTER FINAL SS */ + ["\uAA4C", "\uAA4C"], /* CHAM CONSONANT SIGN FINAL M */ + ["\uAA4D", "\uAA4D"], /* CHAM CONSONANT SIGN FINAL H */ + ["\uAA4E", "\uAA4E"], + ["\uAA4F", "\uAA4F"], + ["\uAA50", "\uAA50"], /* CHAM DIGIT ZERO */ + ["\uAA51", "\uAA51"], /* CHAM DIGIT ONE */ + ["\uAA52", "\uAA52"], /* CHAM DIGIT TWO */ + ["\uAA53", "\uAA53"], /* CHAM DIGIT THREE */ + ["\uAA54", "\uAA54"], /* CHAM DIGIT FOUR */ + ["\uAA55", "\uAA55"], /* CHAM DIGIT FIVE */ + ["\uAA56", "\uAA56"], /* CHAM DIGIT SIX */ + ["\uAA57", "\uAA57"], /* CHAM DIGIT SEVEN */ + ["\uAA58", "\uAA58"], /* CHAM DIGIT EIGHT */ + ["\uAA59", "\uAA59"], /* CHAM DIGIT NINE */ + ["\uAA5A", "\uAA5A"], + ["\uAA5B", "\uAA5B"], + ["\uAA5C", "\uAA5C"], /* CHAM PUNCTUATION SPIRAL */ + ["\uAA5D", "\uAA5D"], /* CHAM PUNCTUATION DANDA */ + ["\uAA5E", "\uAA5E"], /* CHAM PUNCTUATION DOUBLE DANDA */ + ["\uAA5F", "\uAA5F"], /* CHAM PUNCTUATION TRIPLE DANDA */ + ["\uAA60", "\uAA60"], /* MYANMAR LETTER KHAMTI GA */ + ["\uAA61", "\uAA61"], /* MYANMAR LETTER KHAMTI CA */ + ["\uAA62", "\uAA62"], /* MYANMAR LETTER KHAMTI CHA */ + ["\uAA63", "\uAA63"], /* MYANMAR LETTER KHAMTI JA */ + ["\uAA64", "\uAA64"], /* MYANMAR LETTER KHAMTI JHA */ + ["\uAA65", "\uAA65"], /* MYANMAR LETTER KHAMTI NYA */ + ["\uAA66", "\uAA66"], /* MYANMAR LETTER KHAMTI TTA */ + ["\uAA67", "\uAA67"], /* MYANMAR LETTER KHAMTI TTHA */ + ["\uAA68", "\uAA68"], /* MYANMAR LETTER KHAMTI DDA */ + ["\uAA69", "\uAA69"], /* MYANMAR LETTER KHAMTI DDHA */ + ["\uAA6A", "\uAA6A"], /* MYANMAR LETTER KHAMTI DHA */ + ["\uAA6B", "\uAA6B"], /* MYANMAR LETTER KHAMTI NA */ + ["\uAA6C", "\uAA6C"], /* MYANMAR LETTER KHAMTI SA */ + ["\uAA6D", "\uAA6D"], /* MYANMAR LETTER KHAMTI HA */ + ["\uAA6E", "\uAA6E"], /* MYANMAR LETTER KHAMTI HHA */ + ["\uAA6F", "\uAA6F"], /* MYANMAR LETTER KHAMTI FA */ + ["\uAA70", "\uAA70"], /* MYANMAR MODIFIER LETTER KHAMTI REDUPLICATION */ + ["\uAA71", "\uAA71"], /* MYANMAR LETTER KHAMTI XA */ + ["\uAA72", "\uAA72"], /* MYANMAR LETTER KHAMTI ZA */ + ["\uAA73", "\uAA73"], /* MYANMAR LETTER KHAMTI RA */ + ["\uAA74", "\uAA74"], /* MYANMAR LOGOGRAM KHAMTI OAY */ + ["\uAA75", "\uAA75"], /* MYANMAR LOGOGRAM KHAMTI QN */ + ["\uAA76", "\uAA76"], /* MYANMAR LOGOGRAM KHAMTI HM */ + ["\uAA77", "\uAA77"], /* MYANMAR SYMBOL AITON EXCLAMATION */ + ["\uAA78", "\uAA78"], /* MYANMAR SYMBOL AITON ONE */ + ["\uAA79", "\uAA79"], /* MYANMAR SYMBOL AITON TWO */ + ["\uAA7A", "\uAA7A"], /* MYANMAR LETTER AITON RA */ + ["\uAA7B", "\uAA7B"], /* MYANMAR SIGN PAO KAREN TONE */ + ["\uAA7C", "\uAA7C"], /* MYANMAR SIGN TAI LAING TONE-2 */ + ["\uAA7D", "\uAA7D"], /* MYANMAR SIGN TAI LAING TONE-5 */ + ["\uAA7E", "\uAA7E"], /* MYANMAR LETTER SHWE PALAUNG CHA */ + ["\uAA7F", "\uAA7F"], /* MYANMAR LETTER SHWE PALAUNG SHA */ + ["\uAA80", "\uAA80"], /* TAI VIET LETTER LOW KO */ + ["\uAA81", "\uAA81"], /* TAI VIET LETTER HIGH KO */ + ["\uAA82", "\uAA82"], /* TAI VIET LETTER LOW KHO */ + ["\uAA83", "\uAA83"], /* TAI VIET LETTER HIGH KHO */ + ["\uAA84", "\uAA84"], /* TAI VIET LETTER LOW KHHO */ + ["\uAA85", "\uAA85"], /* TAI VIET LETTER HIGH KHHO */ + ["\uAA86", "\uAA86"], /* TAI VIET LETTER LOW GO */ + ["\uAA87", "\uAA87"], /* TAI VIET LETTER HIGH GO */ + ["\uAA88", "\uAA88"], /* TAI VIET LETTER LOW NGO */ + ["\uAA89", "\uAA89"], /* TAI VIET LETTER HIGH NGO */ + ["\uAA8A", "\uAA8A"], /* TAI VIET LETTER LOW CO */ + ["\uAA8B", "\uAA8B"], /* TAI VIET LETTER HIGH CO */ + ["\uAA8C", "\uAA8C"], /* TAI VIET LETTER LOW CHO */ + ["\uAA8D", "\uAA8D"], /* TAI VIET LETTER HIGH CHO */ + ["\uAA8E", "\uAA8E"], /* TAI VIET LETTER LOW SO */ + ["\uAA8F", "\uAA8F"], /* TAI VIET LETTER HIGH SO */ + ["\uAA90", "\uAA90"], /* TAI VIET LETTER LOW NYO */ + ["\uAA91", "\uAA91"], /* TAI VIET LETTER HIGH NYO */ + ["\uAA92", "\uAA92"], /* TAI VIET LETTER LOW DO */ + ["\uAA93", "\uAA93"], /* TAI VIET LETTER HIGH DO */ + ["\uAA94", "\uAA94"], /* TAI VIET LETTER LOW TO */ + ["\uAA95", "\uAA95"], /* TAI VIET LETTER HIGH TO */ + ["\uAA96", "\uAA96"], /* TAI VIET LETTER LOW THO */ + ["\uAA97", "\uAA97"], /* TAI VIET LETTER HIGH THO */ + ["\uAA98", "\uAA98"], /* TAI VIET LETTER LOW NO */ + ["\uAA99", "\uAA99"], /* TAI VIET LETTER HIGH NO */ + ["\uAA9A", "\uAA9A"], /* TAI VIET LETTER LOW BO */ + ["\uAA9B", "\uAA9B"], /* TAI VIET LETTER HIGH BO */ + ["\uAA9C", "\uAA9C"], /* TAI VIET LETTER LOW PO */ + ["\uAA9D", "\uAA9D"], /* TAI VIET LETTER HIGH PO */ + ["\uAA9E", "\uAA9E"], /* TAI VIET LETTER LOW PHO */ + ["\uAA9F", "\uAA9F"], /* TAI VIET LETTER HIGH PHO */ + ["\uAAA0", "\uAAA0"], /* TAI VIET LETTER LOW FO */ + ["\uAAA1", "\uAAA1"], /* TAI VIET LETTER HIGH FO */ + ["\uAAA2", "\uAAA2"], /* TAI VIET LETTER LOW MO */ + ["\uAAA3", "\uAAA3"], /* TAI VIET LETTER HIGH MO */ + ["\uAAA4", "\uAAA4"], /* TAI VIET LETTER LOW YO */ + ["\uAAA5", "\uAAA5"], /* TAI VIET LETTER HIGH YO */ + ["\uAAA6", "\uAAA6"], /* TAI VIET LETTER LOW RO */ + ["\uAAA7", "\uAAA7"], /* TAI VIET LETTER HIGH RO */ + ["\uAAA8", "\uAAA8"], /* TAI VIET LETTER LOW LO */ + ["\uAAA9", "\uAAA9"], /* TAI VIET LETTER HIGH LO */ + ["\uAAAA", "\uAAAA"], /* TAI VIET LETTER LOW VO */ + ["\uAAAB", "\uAAAB"], /* TAI VIET LETTER HIGH VO */ + ["\uAAAC", "\uAAAC"], /* TAI VIET LETTER LOW HO */ + ["\uAAAD", "\uAAAD"], /* TAI VIET LETTER HIGH HO */ + ["\uAAAE", "\uAAAE"], /* TAI VIET LETTER LOW O */ + ["\uAAAF", "\uAAAF"], /* TAI VIET LETTER HIGH O */ + ["\uAAB0", "\uAAB0"], /* TAI VIET MAI KANG */ + ["\uAAB1", "\uAAB1"], /* TAI VIET VOWEL AA */ + ["\uAAB2", "\uAAB2"], /* TAI VIET VOWEL I */ + ["\uAAB3", "\uAAB3"], /* TAI VIET VOWEL UE */ + ["\uAAB4", "\uAAB4"], /* TAI VIET VOWEL U */ + ["\uAAB5", "\uAAB5"], /* TAI VIET VOWEL E */ + ["\uAAB6", "\uAAB6"], /* TAI VIET VOWEL O */ + ["\uAAB7", "\uAAB7"], /* TAI VIET MAI KHIT */ + ["\uAAB8", "\uAAB8"], /* TAI VIET VOWEL IA */ + ["\uAAB9", "\uAAB9"], /* TAI VIET VOWEL UEA */ + ["\uAABA", "\uAABA"], /* TAI VIET VOWEL UA */ + ["\uAABB", "\uAABB"], /* TAI VIET VOWEL AUE */ + ["\uAABC", "\uAABC"], /* TAI VIET VOWEL AY */ + ["\uAABD", "\uAABD"], /* TAI VIET VOWEL AN */ + ["\uAABE", "\uAABE"], /* TAI VIET VOWEL AM */ + ["\uAABF", "\uAABF"], /* TAI VIET TONE MAI EK */ + ["\uAAC0", "\uAAC0"], /* TAI VIET TONE MAI NUENG */ + ["\uAAC1", "\uAAC1"], /* TAI VIET TONE MAI THO */ + ["\uAAC2", "\uAAC2"], /* TAI VIET TONE MAI SONG */ + ["\uAAC3", "\uAAC3"], + ["\uAAC4", "\uAAC4"], + ["\uAAC5", "\uAAC5"], + ["\uAAC6", "\uAAC6"], + ["\uAAC7", "\uAAC7"], + ["\uAAC8", "\uAAC8"], + ["\uAAC9", "\uAAC9"], + ["\uAACA", "\uAACA"], + ["\uAACB", "\uAACB"], + ["\uAACC", "\uAACC"], + ["\uAACD", "\uAACD"], + ["\uAACE", "\uAACE"], + ["\uAACF", "\uAACF"], + ["\uAAD0", "\uAAD0"], + ["\uAAD1", "\uAAD1"], + ["\uAAD2", "\uAAD2"], + ["\uAAD3", "\uAAD3"], + ["\uAAD4", "\uAAD4"], + ["\uAAD5", "\uAAD5"], + ["\uAAD6", "\uAAD6"], + ["\uAAD7", "\uAAD7"], + ["\uAAD8", "\uAAD8"], + ["\uAAD9", "\uAAD9"], + ["\uAADA", "\uAADA"], + ["\uAADB", "\uAADB"], /* TAI VIET SYMBOL KON */ + ["\uAADC", "\uAADC"], /* TAI VIET SYMBOL NUENG */ + ["\uAADD", "\uAADD"], /* TAI VIET SYMBOL SAM */ + ["\uAADE", "\uAADE"], /* TAI VIET SYMBOL HO HOI */ + ["\uAADF", "\uAADF"], /* TAI VIET SYMBOL KOI KOI */ + ["\uAAE0", "\uAAE0"], /* MEETEI MAYEK LETTER E */ + ["\uAAE1", "\uAAE1"], /* MEETEI MAYEK LETTER O */ + ["\uAAE2", "\uAAE2"], /* MEETEI MAYEK LETTER CHA */ + ["\uAAE3", "\uAAE3"], /* MEETEI MAYEK LETTER NYA */ + ["\uAAE4", "\uAAE4"], /* MEETEI MAYEK LETTER TTA */ + ["\uAAE5", "\uAAE5"], /* MEETEI MAYEK LETTER TTHA */ + ["\uAAE6", "\uAAE6"], /* MEETEI MAYEK LETTER DDA */ + ["\uAAE7", "\uAAE7"], /* MEETEI MAYEK LETTER DDHA */ + ["\uAAE8", "\uAAE8"], /* MEETEI MAYEK LETTER NNA */ + ["\uAAE9", "\uAAE9"], /* MEETEI MAYEK LETTER SHA */ + ["\uAAEA", "\uAAEA"], /* MEETEI MAYEK LETTER SSA */ + ["\uAAEB", "\uAAEB"], /* MEETEI MAYEK VOWEL SIGN II */ + ["\uAAEC", "\uAAEC"], /* MEETEI MAYEK VOWEL SIGN UU */ + ["\uAAED", "\uAAED"], /* MEETEI MAYEK VOWEL SIGN AAI */ + ["\uAAEE", "\uAAEE"], /* MEETEI MAYEK VOWEL SIGN AU */ + ["\uAAEF", "\uAAEF"], /* MEETEI MAYEK VOWEL SIGN AAU */ + ["\uAAF0", "\uAAF0"], /* MEETEI MAYEK CHEIKHAN */ + ["\uAAF1", "\uAAF1"], /* MEETEI MAYEK AHANG KHUDAM */ + ["\uAAF2", "\uAAF2"], /* MEETEI MAYEK ANJI */ + ["\uAAF3", "\uAAF3"], /* MEETEI MAYEK SYLLABLE REPETITION MARK */ + ["\uAAF4", "\uAAF4"], /* MEETEI MAYEK WORD REPETITION MARK */ + ["\uAAF5", "\uAAF5"], /* MEETEI MAYEK VOWEL SIGN VISARGA */ + ["\uAAF6", "\uAAF6"], /* MEETEI MAYEK VIRAMA */ + ["\uAAF7", "\uAAF7"], + ["\uAAF8", "\uAAF8"], + ["\uAAF9", "\uAAF9"], + ["\uAAFA", "\uAAFA"], + ["\uAAFB", "\uAAFB"], + ["\uAAFC", "\uAAFC"], + ["\uAAFD", "\uAAFD"], + ["\uAAFE", "\uAAFE"], + ["\uAAFF", "\uAAFF"], + ["\uAB00", "\uAB00"], + ["\uAB01", "\uAB01"], /* ETHIOPIC SYLLABLE TTHU */ + ["\uAB02", "\uAB02"], /* ETHIOPIC SYLLABLE TTHI */ + ["\uAB03", "\uAB03"], /* ETHIOPIC SYLLABLE TTHAA */ + ["\uAB04", "\uAB04"], /* ETHIOPIC SYLLABLE TTHEE */ + ["\uAB05", "\uAB05"], /* ETHIOPIC SYLLABLE TTHE */ + ["\uAB06", "\uAB06"], /* ETHIOPIC SYLLABLE TTHO */ + ["\uAB07", "\uAB07"], + ["\uAB08", "\uAB08"], + ["\uAB09", "\uAB09"], /* ETHIOPIC SYLLABLE DDHU */ + ["\uAB0A", "\uAB0A"], /* ETHIOPIC SYLLABLE DDHI */ + ["\uAB0B", "\uAB0B"], /* ETHIOPIC SYLLABLE DDHAA */ + ["\uAB0C", "\uAB0C"], /* ETHIOPIC SYLLABLE DDHEE */ + ["\uAB0D", "\uAB0D"], /* ETHIOPIC SYLLABLE DDHE */ + ["\uAB0E", "\uAB0E"], /* ETHIOPIC SYLLABLE DDHO */ + ["\uAB0F", "\uAB0F"], + ["\uAB10", "\uAB10"], + ["\uAB11", "\uAB11"], /* ETHIOPIC SYLLABLE DZU */ + ["\uAB12", "\uAB12"], /* ETHIOPIC SYLLABLE DZI */ + ["\uAB13", "\uAB13"], /* ETHIOPIC SYLLABLE DZAA */ + ["\uAB14", "\uAB14"], /* ETHIOPIC SYLLABLE DZEE */ + ["\uAB15", "\uAB15"], /* ETHIOPIC SYLLABLE DZE */ + ["\uAB16", "\uAB16"], /* ETHIOPIC SYLLABLE DZO */ + ["\uAB17", "\uAB17"], + ["\uAB18", "\uAB18"], + ["\uAB19", "\uAB19"], + ["\uAB1A", "\uAB1A"], + ["\uAB1B", "\uAB1B"], + ["\uAB1C", "\uAB1C"], + ["\uAB1D", "\uAB1D"], + ["\uAB1E", "\uAB1E"], + ["\uAB1F", "\uAB1F"], + ["\uAB20", "\uAB20"], /* ETHIOPIC SYLLABLE CCHHA */ + ["\uAB21", "\uAB21"], /* ETHIOPIC SYLLABLE CCHHU */ + ["\uAB22", "\uAB22"], /* ETHIOPIC SYLLABLE CCHHI */ + ["\uAB23", "\uAB23"], /* ETHIOPIC SYLLABLE CCHHAA */ + ["\uAB24", "\uAB24"], /* ETHIOPIC SYLLABLE CCHHEE */ + ["\uAB25", "\uAB25"], /* ETHIOPIC SYLLABLE CCHHE */ + ["\uAB26", "\uAB26"], /* ETHIOPIC SYLLABLE CCHHO */ + ["\uAB27", "\uAB27"], + ["\uAB28", "\uAB28"], /* ETHIOPIC SYLLABLE BBA */ + ["\uAB29", "\uAB29"], /* ETHIOPIC SYLLABLE BBU */ + ["\uAB2A", "\uAB2A"], /* ETHIOPIC SYLLABLE BBI */ + ["\uAB2B", "\uAB2B"], /* ETHIOPIC SYLLABLE BBAA */ + ["\uAB2C", "\uAB2C"], /* ETHIOPIC SYLLABLE BBEE */ + ["\uAB2D", "\uAB2D"], /* ETHIOPIC SYLLABLE BBE */ + ["\uAB2E", "\uAB2E"], /* ETHIOPIC SYLLABLE BBO */ + ["\uAB2F", "\uAB2F"], + ["\uAB30", "\uAB30"], /* LATIN SMALL LETTER BARRED ALPHA */ + ["\uAB31", "\uAB31"], /* LATIN SMALL LETTER A REVERSED-SCHWA */ + ["\uAB32", "\uAB32"], /* LATIN SMALL LETTER BLACKLETTER E */ + ["\uAB33", "\uAB33"], /* LATIN SMALL LETTER BARRED E */ + ["\uAB34", "\uAB34"], /* LATIN SMALL LETTER E WITH FLOURISH */ + ["\uAB35", "\uAB35"], /* LATIN SMALL LETTER LENIS F */ + ["\uAB36", "\uAB36"], /* LATIN SMALL LETTER SCRIPT G WITH CROSSED-TAIL */ + ["\uAB37", "\uAB37"], /* LATIN SMALL LETTER L WITH INVERTED LAZY S */ + ["\uAB38", "\uAB38"], /* LATIN SMALL LETTER L WITH DOUBLE MIDDLE TILDE */ + ["\uAB39", "\uAB39"], /* LATIN SMALL LETTER L WITH MIDDLE RING */ + ["\uAB3A", "\uAB3A"], /* LATIN SMALL LETTER M WITH CROSSED-TAIL */ + ["\uAB3B", "\uAB3B"], /* LATIN SMALL LETTER N WITH CROSSED-TAIL */ + ["\uAB3C", "\uAB3C"], /* LATIN SMALL LETTER ENG WITH CROSSED-TAIL */ + ["\uAB3D", "\uAB3D"], /* LATIN SMALL LETTER BLACKLETTER O */ + ["\uAB3E", "\uAB3E"], /* LATIN SMALL LETTER BLACKLETTER O WITH STROKE */ + ["\uAB3F", "\uAB3F"], /* LATIN SMALL LETTER OPEN O WITH STROKE */ + ["\uAB40", "\uAB40"], /* LATIN SMALL LETTER INVERTED OE */ + ["\uAB41", "\uAB41"], /* LATIN SMALL LETTER TURNED OE WITH STROKE */ + ["\uAB42", "\uAB42"], /* LATIN SMALL LETTER TURNED OE WITH HORIZONTAL STROKE */ + ["\uAB43", "\uAB43"], /* LATIN SMALL LETTER TURNED O OPEN-O */ + ["\uAB44", "\uAB44"], /* LATIN SMALL LETTER TURNED O OPEN-O WITH STROKE */ + ["\uAB45", "\uAB45"], /* LATIN SMALL LETTER STIRRUP R */ + ["\uAB46", "\uAB46"], /* LATIN LETTER SMALL CAPITAL R WITH RIGHT LEG */ + ["\uAB47", "\uAB47"], /* LATIN SMALL LETTER R WITHOUT HANDLE */ + ["\uAB48", "\uAB48"], /* LATIN SMALL LETTER DOUBLE R */ + ["\uAB49", "\uAB49"], /* LATIN SMALL LETTER R WITH CROSSED-TAIL */ + ["\uAB4A", "\uAB4A"], /* LATIN SMALL LETTER DOUBLE R WITH CROSSED-TAIL */ + ["\uAB4B", "\uAB4B"], /* LATIN SMALL LETTER SCRIPT R */ + ["\uAB4C", "\uAB4C"], /* LATIN SMALL LETTER SCRIPT R WITH RING */ + ["\uAB4D", "\uAB4D"], /* LATIN SMALL LETTER BASELINE ESH */ + ["\uAB4E", "\uAB4E"], /* LATIN SMALL LETTER U WITH SHORT RIGHT LEG */ + ["\uAB4F", "\uAB4F"], /* LATIN SMALL LETTER U BAR WITH SHORT RIGHT LEG */ + ["\uAB50", "\uAB50"], /* LATIN SMALL LETTER UI */ + ["\uAB51", "\uAB51"], /* LATIN SMALL LETTER TURNED UI */ + ["\uAB52", "\uAB52"], /* LATIN SMALL LETTER U WITH LEFT HOOK */ + ["\uA7B3", "\uAB53"], /* LATIN SMALL LETTER CHI */ + ["\uAB54", "\uAB54"], /* LATIN SMALL LETTER CHI WITH LOW RIGHT RING */ + ["\uAB55", "\uAB55"], /* LATIN SMALL LETTER CHI WITH LOW LEFT SERIF */ + ["\uAB56", "\uAB56"], /* LATIN SMALL LETTER X WITH LOW RIGHT RING */ + ["\uAB57", "\uAB57"], /* LATIN SMALL LETTER X WITH LONG LEFT LEG */ + ["\uAB58", "\uAB58"], /* LATIN SMALL LETTER X WITH LONG LEFT LEG AND LOW RIGHT RING */ + ["\uAB59", "\uAB59"], /* LATIN SMALL LETTER X WITH LONG LEFT LEG WITH SERIF */ + ["\uAB5A", "\uAB5A"], /* LATIN SMALL LETTER Y WITH SHORT RIGHT LEG */ + ["\uAB5B", "\uAB5B"], /* MODIFIER BREVE WITH INVERTED BREVE */ + ["\uAB5C", "\uAB5C"], /* MODIFIER LETTER SMALL HENG */ + ["\uAB5D", "\uAB5D"], /* MODIFIER LETTER SMALL L WITH INVERTED LAZY S */ + ["\uAB5E", "\uAB5E"], /* MODIFIER LETTER SMALL L WITH MIDDLE TILDE */ + ["\uAB5F", "\uAB5F"], /* MODIFIER LETTER SMALL U WITH LEFT HOOK */ + ["\uAB60", "\uAB60"], /* LATIN SMALL LETTER SAKHA YAT */ + ["\uAB61", "\uAB61"], /* LATIN SMALL LETTER IOTIFIED E */ + ["\uAB62", "\uAB62"], /* LATIN SMALL LETTER OPEN OE */ + ["\uAB63", "\uAB63"], /* LATIN SMALL LETTER UO */ + ["\uAB64", "\uAB64"], /* LATIN SMALL LETTER INVERTED ALPHA */ + ["\uAB65", "\uAB65"], /* GREEK LETTER SMALL CAPITAL OMEGA */ + ["\uAB66", "\uAB66"], /* LATIN SMALL LETTER DZ DIGRAPH WITH RETROFLEX HOOK */ + ["\uAB67", "\uAB67"], /* LATIN SMALL LETTER TS DIGRAPH WITH RETROFLEX HOOK */ + ["\uAB68", "\uAB68"], /* LATIN SMALL LETTER TURNED R WITH MIDDLE TILDE */ + ["\uAB69", "\uAB69"], /* MODIFIER LETTER SMALL TURNED W */ + ["\uAB6A", "\uAB6A"], /* MODIFIER LETTER LEFT TACK */ + ["\uAB6B", "\uAB6B"], /* MODIFIER LETTER RIGHT TACK */ + ["\uAB6C", "\uAB6C"], + ["\uAB6D", "\uAB6D"], + ["\uAB6E", "\uAB6E"], + ["\uAB6F", "\uAB6F"], + ["\u13A0", "\uAB70"], /* CHEROKEE SMALL LETTER A */ + ["\u13A1", "\uAB71"], /* CHEROKEE SMALL LETTER E */ + ["\u13A2", "\uAB72"], /* CHEROKEE SMALL LETTER I */ + ["\u13A3", "\uAB73"], /* CHEROKEE SMALL LETTER O */ + ["\u13A4", "\uAB74"], /* CHEROKEE SMALL LETTER U */ + ["\u13A5", "\uAB75"], /* CHEROKEE SMALL LETTER V */ + ["\u13A6", "\uAB76"], /* CHEROKEE SMALL LETTER GA */ + ["\u13A7", "\uAB77"], /* CHEROKEE SMALL LETTER KA */ + ["\u13A8", "\uAB78"], /* CHEROKEE SMALL LETTER GE */ + ["\u13A9", "\uAB79"], /* CHEROKEE SMALL LETTER GI */ + ["\u13AA", "\uAB7A"], /* CHEROKEE SMALL LETTER GO */ + ["\u13AB", "\uAB7B"], /* CHEROKEE SMALL LETTER GU */ + ["\u13AC", "\uAB7C"], /* CHEROKEE SMALL LETTER GV */ + ["\u13AD", "\uAB7D"], /* CHEROKEE SMALL LETTER HA */ + ["\u13AE", "\uAB7E"], /* CHEROKEE SMALL LETTER HE */ + ["\u13AF", "\uAB7F"], /* CHEROKEE SMALL LETTER HI */ + ["\u13B0", "\uAB80"], /* CHEROKEE SMALL LETTER HO */ + ["\u13B1", "\uAB81"], /* CHEROKEE SMALL LETTER HU */ + ["\u13B2", "\uAB82"], /* CHEROKEE SMALL LETTER HV */ + ["\u13B3", "\uAB83"], /* CHEROKEE SMALL LETTER LA */ + ["\u13B4", "\uAB84"], /* CHEROKEE SMALL LETTER LE */ + ["\u13B5", "\uAB85"], /* CHEROKEE SMALL LETTER LI */ + ["\u13B6", "\uAB86"], /* CHEROKEE SMALL LETTER LO */ + ["\u13B7", "\uAB87"], /* CHEROKEE SMALL LETTER LU */ + ["\u13B8", "\uAB88"], /* CHEROKEE SMALL LETTER LV */ + ["\u13B9", "\uAB89"], /* CHEROKEE SMALL LETTER MA */ + ["\u13BA", "\uAB8A"], /* CHEROKEE SMALL LETTER ME */ + ["\u13BB", "\uAB8B"], /* CHEROKEE SMALL LETTER MI */ + ["\u13BC", "\uAB8C"], /* CHEROKEE SMALL LETTER MO */ + ["\u13BD", "\uAB8D"], /* CHEROKEE SMALL LETTER MU */ + ["\u13BE", "\uAB8E"], /* CHEROKEE SMALL LETTER NA */ + ["\u13BF", "\uAB8F"], /* CHEROKEE SMALL LETTER HNA */ + ["\u13C0", "\uAB90"], /* CHEROKEE SMALL LETTER NAH */ + ["\u13C1", "\uAB91"], /* CHEROKEE SMALL LETTER NE */ + ["\u13C2", "\uAB92"], /* CHEROKEE SMALL LETTER NI */ + ["\u13C3", "\uAB93"], /* CHEROKEE SMALL LETTER NO */ + ["\u13C4", "\uAB94"], /* CHEROKEE SMALL LETTER NU */ + ["\u13C5", "\uAB95"], /* CHEROKEE SMALL LETTER NV */ + ["\u13C6", "\uAB96"], /* CHEROKEE SMALL LETTER QUA */ + ["\u13C7", "\uAB97"], /* CHEROKEE SMALL LETTER QUE */ + ["\u13C8", "\uAB98"], /* CHEROKEE SMALL LETTER QUI */ + ["\u13C9", "\uAB99"], /* CHEROKEE SMALL LETTER QUO */ + ["\u13CA", "\uAB9A"], /* CHEROKEE SMALL LETTER QUU */ + ["\u13CB", "\uAB9B"], /* CHEROKEE SMALL LETTER QUV */ + ["\u13CC", "\uAB9C"], /* CHEROKEE SMALL LETTER SA */ + ["\u13CD", "\uAB9D"], /* CHEROKEE SMALL LETTER S */ + ["\u13CE", "\uAB9E"], /* CHEROKEE SMALL LETTER SE */ + ["\u13CF", "\uAB9F"], /* CHEROKEE SMALL LETTER SI */ + ["\u13D0", "\uABA0"], /* CHEROKEE SMALL LETTER SO */ + ["\u13D1", "\uABA1"], /* CHEROKEE SMALL LETTER SU */ + ["\u13D2", "\uABA2"], /* CHEROKEE SMALL LETTER SV */ + ["\u13D3", "\uABA3"], /* CHEROKEE SMALL LETTER DA */ + ["\u13D4", "\uABA4"], /* CHEROKEE SMALL LETTER TA */ + ["\u13D5", "\uABA5"], /* CHEROKEE SMALL LETTER DE */ + ["\u13D6", "\uABA6"], /* CHEROKEE SMALL LETTER TE */ + ["\u13D7", "\uABA7"], /* CHEROKEE SMALL LETTER DI */ + ["\u13D8", "\uABA8"], /* CHEROKEE SMALL LETTER TI */ + ["\u13D9", "\uABA9"], /* CHEROKEE SMALL LETTER DO */ + ["\u13DA", "\uABAA"], /* CHEROKEE SMALL LETTER DU */ + ["\u13DB", "\uABAB"], /* CHEROKEE SMALL LETTER DV */ + ["\u13DC", "\uABAC"], /* CHEROKEE SMALL LETTER DLA */ + ["\u13DD", "\uABAD"], /* CHEROKEE SMALL LETTER TLA */ + ["\u13DE", "\uABAE"], /* CHEROKEE SMALL LETTER TLE */ + ["\u13DF", "\uABAF"], /* CHEROKEE SMALL LETTER TLI */ + ["\u13E0", "\uABB0"], /* CHEROKEE SMALL LETTER TLO */ + ["\u13E1", "\uABB1"], /* CHEROKEE SMALL LETTER TLU */ + ["\u13E2", "\uABB2"], /* CHEROKEE SMALL LETTER TLV */ + ["\u13E3", "\uABB3"], /* CHEROKEE SMALL LETTER TSA */ + ["\u13E4", "\uABB4"], /* CHEROKEE SMALL LETTER TSE */ + ["\u13E5", "\uABB5"], /* CHEROKEE SMALL LETTER TSI */ + ["\u13E6", "\uABB6"], /* CHEROKEE SMALL LETTER TSO */ + ["\u13E7", "\uABB7"], /* CHEROKEE SMALL LETTER TSU */ + ["\u13E8", "\uABB8"], /* CHEROKEE SMALL LETTER TSV */ + ["\u13E9", "\uABB9"], /* CHEROKEE SMALL LETTER WA */ + ["\u13EA", "\uABBA"], /* CHEROKEE SMALL LETTER WE */ + ["\u13EB", "\uABBB"], /* CHEROKEE SMALL LETTER WI */ + ["\u13EC", "\uABBC"], /* CHEROKEE SMALL LETTER WO */ + ["\u13ED", "\uABBD"], /* CHEROKEE SMALL LETTER WU */ + ["\u13EE", "\uABBE"], /* CHEROKEE SMALL LETTER WV */ + ["\u13EF", "\uABBF"], /* CHEROKEE SMALL LETTER YA */ + ["\uABC0", "\uABC0"], /* MEETEI MAYEK LETTER KOK */ + ["\uABC1", "\uABC1"], /* MEETEI MAYEK LETTER SAM */ + ["\uABC2", "\uABC2"], /* MEETEI MAYEK LETTER LAI */ + ["\uABC3", "\uABC3"], /* MEETEI MAYEK LETTER MIT */ + ["\uABC4", "\uABC4"], /* MEETEI MAYEK LETTER PA */ + ["\uABC5", "\uABC5"], /* MEETEI MAYEK LETTER NA */ + ["\uABC6", "\uABC6"], /* MEETEI MAYEK LETTER CHIL */ + ["\uABC7", "\uABC7"], /* MEETEI MAYEK LETTER TIL */ + ["\uABC8", "\uABC8"], /* MEETEI MAYEK LETTER KHOU */ + ["\uABC9", "\uABC9"], /* MEETEI MAYEK LETTER NGOU */ + ["\uABCA", "\uABCA"], /* MEETEI MAYEK LETTER THOU */ + ["\uABCB", "\uABCB"], /* MEETEI MAYEK LETTER WAI */ + ["\uABCC", "\uABCC"], /* MEETEI MAYEK LETTER YANG */ + ["\uABCD", "\uABCD"], /* MEETEI MAYEK LETTER HUK */ + ["\uABCE", "\uABCE"], /* MEETEI MAYEK LETTER UN */ + ["\uABCF", "\uABCF"], /* MEETEI MAYEK LETTER I */ + ["\uABD0", "\uABD0"], /* MEETEI MAYEK LETTER PHAM */ + ["\uABD1", "\uABD1"], /* MEETEI MAYEK LETTER ATIYA */ + ["\uABD2", "\uABD2"], /* MEETEI MAYEK LETTER GOK */ + ["\uABD3", "\uABD3"], /* MEETEI MAYEK LETTER JHAM */ + ["\uABD4", "\uABD4"], /* MEETEI MAYEK LETTER RAI */ + ["\uABD5", "\uABD5"], /* MEETEI MAYEK LETTER BA */ + ["\uABD6", "\uABD6"], /* MEETEI MAYEK LETTER JIL */ + ["\uABD7", "\uABD7"], /* MEETEI MAYEK LETTER DIL */ + ["\uABD8", "\uABD8"], /* MEETEI MAYEK LETTER GHOU */ + ["\uABD9", "\uABD9"], /* MEETEI MAYEK LETTER DHOU */ + ["\uABDA", "\uABDA"], /* MEETEI MAYEK LETTER BHAM */ + ["\uABDB", "\uABDB"], /* MEETEI MAYEK LETTER KOK LONSUM */ + ["\uABDC", "\uABDC"], /* MEETEI MAYEK LETTER LAI LONSUM */ + ["\uABDD", "\uABDD"], /* MEETEI MAYEK LETTER MIT LONSUM */ + ["\uABDE", "\uABDE"], /* MEETEI MAYEK LETTER PA LONSUM */ + ["\uABDF", "\uABDF"], /* MEETEI MAYEK LETTER NA LONSUM */ + ["\uABE0", "\uABE0"], /* MEETEI MAYEK LETTER TIL LONSUM */ + ["\uABE1", "\uABE1"], /* MEETEI MAYEK LETTER NGOU LONSUM */ + ["\uABE2", "\uABE2"], /* MEETEI MAYEK LETTER I LONSUM */ + ["\uABE3", "\uABE3"], /* MEETEI MAYEK VOWEL SIGN ONAP */ + ["\uABE4", "\uABE4"], /* MEETEI MAYEK VOWEL SIGN INAP */ + ["\uABE5", "\uABE5"], /* MEETEI MAYEK VOWEL SIGN ANAP */ + ["\uABE6", "\uABE6"], /* MEETEI MAYEK VOWEL SIGN YENAP */ + ["\uABE7", "\uABE7"], /* MEETEI MAYEK VOWEL SIGN SOUNAP */ + ["\uABE8", "\uABE8"], /* MEETEI MAYEK VOWEL SIGN UNAP */ + ["\uABE9", "\uABE9"], /* MEETEI MAYEK VOWEL SIGN CHEINAP */ + ["\uABEA", "\uABEA"], /* MEETEI MAYEK VOWEL SIGN NUNG */ + ["\uABEB", "\uABEB"], /* MEETEI MAYEK CHEIKHEI */ + ["\uABEC", "\uABEC"], /* MEETEI MAYEK LUM IYEK */ + ["\uABED", "\uABED"], /* MEETEI MAYEK APUN IYEK */ + ["\uABEE", "\uABEE"], + ["\uABEF", "\uABEF"], + ["\uABF0", "\uABF0"], /* MEETEI MAYEK DIGIT ZERO */ + ["\uABF1", "\uABF1"], /* MEETEI MAYEK DIGIT ONE */ + ["\uABF2", "\uABF2"], /* MEETEI MAYEK DIGIT TWO */ + ["\uABF3", "\uABF3"], /* MEETEI MAYEK DIGIT THREE */ + ["\uABF4", "\uABF4"], /* MEETEI MAYEK DIGIT FOUR */ + ["\uABF5", "\uABF5"], /* MEETEI MAYEK DIGIT FIVE */ + ["\uABF6", "\uABF6"], /* MEETEI MAYEK DIGIT SIX */ + ["\uABF7", "\uABF7"], /* MEETEI MAYEK DIGIT SEVEN */ + ["\uABF8", "\uABF8"], /* MEETEI MAYEK DIGIT EIGHT */ + ["\uABF9", "\uABF9"], /* MEETEI MAYEK DIGIT NINE */ + ["\uABFA", "\uABFA"], + ["\uABFB", "\uABFB"], + ["\uABFC", "\uABFC"], + ["\uABFD", "\uABFD"], + ["\uABFE", "\uABFE"], + ["\uABFF", "\uABFF"], + ["\uAC00", "\uAC00"], /* Hangul Syllable */ + ["\uAC01", "\uAC01"], /* Hangul Syllable */ + ["\uAC02", "\uAC02"], /* Hangul Syllable */ + ["\uAC03", "\uAC03"], /* Hangul Syllable */ + ["\uAC04", "\uAC04"], /* Hangul Syllable */ + ["\uAC05", "\uAC05"], /* Hangul Syllable */ + ["\uAC06", "\uAC06"], /* Hangul Syllable */ + ["\uAC07", "\uAC07"], /* Hangul Syllable */ + ["\uAC08", "\uAC08"], /* Hangul Syllable */ + ["\uAC09", "\uAC09"], /* Hangul Syllable */ + ["\uAC0A", "\uAC0A"], /* Hangul Syllable */ + ["\uAC0B", "\uAC0B"], /* Hangul Syllable */ + ["\uAC0C", "\uAC0C"], /* Hangul Syllable */ + ["\uAC0D", "\uAC0D"], /* Hangul Syllable */ + ["\uAC0E", "\uAC0E"], /* Hangul Syllable */ + ["\uAC0F", "\uAC0F"], /* Hangul Syllable */ + ["\uAC10", "\uAC10"], /* Hangul Syllable */ + ["\uAC11", "\uAC11"], /* Hangul Syllable */ + ["\uAC12", "\uAC12"], /* Hangul Syllable */ + ["\uAC13", "\uAC13"], /* Hangul Syllable */ + ["\uAC14", "\uAC14"], /* Hangul Syllable */ + ["\uAC15", "\uAC15"], /* Hangul Syllable */ + ["\uAC16", "\uAC16"], /* Hangul Syllable */ + ["\uAC17", "\uAC17"], /* Hangul Syllable */ + ["\uAC18", "\uAC18"], /* Hangul Syllable */ + ["\uAC19", "\uAC19"], /* Hangul Syllable */ + ["\uAC1A", "\uAC1A"], /* Hangul Syllable */ + ["\uAC1B", "\uAC1B"], /* Hangul Syllable */ + ["\uAC1C", "\uAC1C"], /* Hangul Syllable */ + ["\uAC1D", "\uAC1D"], /* Hangul Syllable */ + ["\uAC1E", "\uAC1E"], /* Hangul Syllable */ + ["\uAC1F", "\uAC1F"], /* Hangul Syllable */ + ["\uAC20", "\uAC20"], /* Hangul Syllable */ + ["\uAC21", "\uAC21"], /* Hangul Syllable */ + ["\uAC22", "\uAC22"], /* Hangul Syllable */ + ["\uAC23", "\uAC23"], /* Hangul Syllable */ + ["\uAC24", "\uAC24"], /* Hangul Syllable */ + ["\uAC25", "\uAC25"], /* Hangul Syllable */ + ["\uAC26", "\uAC26"], /* Hangul Syllable */ + ["\uAC27", "\uAC27"], /* Hangul Syllable */ + ["\uAC28", "\uAC28"], /* Hangul Syllable */ + ["\uAC29", "\uAC29"], /* Hangul Syllable */ + ["\uAC2A", "\uAC2A"], /* Hangul Syllable */ + ["\uAC2B", "\uAC2B"], /* Hangul Syllable */ + ["\uAC2C", "\uAC2C"], /* Hangul Syllable */ + ["\uAC2D", "\uAC2D"], /* Hangul Syllable */ + ["\uAC2E", "\uAC2E"], /* Hangul Syllable */ + ["\uAC2F", "\uAC2F"], /* Hangul Syllable */ + ["\uAC30", "\uAC30"], /* Hangul Syllable */ + ["\uAC31", "\uAC31"], /* Hangul Syllable */ + ["\uAC32", "\uAC32"], /* Hangul Syllable */ + ["\uAC33", "\uAC33"], /* Hangul Syllable */ + ["\uAC34", "\uAC34"], /* Hangul Syllable */ + ["\uAC35", "\uAC35"], /* Hangul Syllable */ + ["\uAC36", "\uAC36"], /* Hangul Syllable */ + ["\uAC37", "\uAC37"], /* Hangul Syllable */ + ["\uAC38", "\uAC38"], /* Hangul Syllable */ + ["\uAC39", "\uAC39"], /* Hangul Syllable */ + ["\uAC3A", "\uAC3A"], /* Hangul Syllable */ + ["\uAC3B", "\uAC3B"], /* Hangul Syllable */ + ["\uAC3C", "\uAC3C"], /* Hangul Syllable */ + ["\uAC3D", "\uAC3D"], /* Hangul Syllable */ + ["\uAC3E", "\uAC3E"], /* Hangul Syllable */ + ["\uAC3F", "\uAC3F"], /* Hangul Syllable */ + ["\uAC40", "\uAC40"], /* Hangul Syllable */ + ["\uAC41", "\uAC41"], /* Hangul Syllable */ + ["\uAC42", "\uAC42"], /* Hangul Syllable */ + ["\uAC43", "\uAC43"], /* Hangul Syllable */ + ["\uAC44", "\uAC44"], /* Hangul Syllable */ + ["\uAC45", "\uAC45"], /* Hangul Syllable */ + ["\uAC46", "\uAC46"], /* Hangul Syllable */ + ["\uAC47", "\uAC47"], /* Hangul Syllable */ + ["\uAC48", "\uAC48"], /* Hangul Syllable */ + ["\uAC49", "\uAC49"], /* Hangul Syllable */ + ["\uAC4A", "\uAC4A"], /* Hangul Syllable */ + ["\uAC4B", "\uAC4B"], /* Hangul Syllable */ + ["\uAC4C", "\uAC4C"], /* Hangul Syllable */ + ["\uAC4D", "\uAC4D"], /* Hangul Syllable */ + ["\uAC4E", "\uAC4E"], /* Hangul Syllable */ + ["\uAC4F", "\uAC4F"], /* Hangul Syllable */ + ["\uAC50", "\uAC50"], /* Hangul Syllable */ + ["\uAC51", "\uAC51"], /* Hangul Syllable */ + ["\uAC52", "\uAC52"], /* Hangul Syllable */ + ["\uAC53", "\uAC53"], /* Hangul Syllable */ + ["\uAC54", "\uAC54"], /* Hangul Syllable */ + ["\uAC55", "\uAC55"], /* Hangul Syllable */ + ["\uAC56", "\uAC56"], /* Hangul Syllable */ + ["\uAC57", "\uAC57"], /* Hangul Syllable */ + ["\uAC58", "\uAC58"], /* Hangul Syllable */ + ["\uAC59", "\uAC59"], /* Hangul Syllable */ + ["\uAC5A", "\uAC5A"], /* Hangul Syllable */ + ["\uAC5B", "\uAC5B"], /* Hangul Syllable */ + ["\uAC5C", "\uAC5C"], /* Hangul Syllable */ + ["\uAC5D", "\uAC5D"], /* Hangul Syllable */ + ["\uAC5E", "\uAC5E"], /* Hangul Syllable */ + ["\uAC5F", "\uAC5F"], /* Hangul Syllable */ + ["\uAC60", "\uAC60"], /* Hangul Syllable */ + ["\uAC61", "\uAC61"], /* Hangul Syllable */ + ["\uAC62", "\uAC62"], /* Hangul Syllable */ + ["\uAC63", "\uAC63"], /* Hangul Syllable */ + ["\uAC64", "\uAC64"], /* Hangul Syllable */ + ["\uAC65", "\uAC65"], /* Hangul Syllable */ + ["\uAC66", "\uAC66"], /* Hangul Syllable */ + ["\uAC67", "\uAC67"], /* Hangul Syllable */ + ["\uAC68", "\uAC68"], /* Hangul Syllable */ + ["\uAC69", "\uAC69"], /* Hangul Syllable */ + ["\uAC6A", "\uAC6A"], /* Hangul Syllable */ + ["\uAC6B", "\uAC6B"], /* Hangul Syllable */ + ["\uAC6C", "\uAC6C"], /* Hangul Syllable */ + ["\uAC6D", "\uAC6D"], /* Hangul Syllable */ + ["\uAC6E", "\uAC6E"], /* Hangul Syllable */ + ["\uAC6F", "\uAC6F"], /* Hangul Syllable */ + ["\uAC70", "\uAC70"], /* Hangul Syllable */ + ["\uAC71", "\uAC71"], /* Hangul Syllable */ + ["\uAC72", "\uAC72"], /* Hangul Syllable */ + ["\uAC73", "\uAC73"], /* Hangul Syllable */ + ["\uAC74", "\uAC74"], /* Hangul Syllable */ + ["\uAC75", "\uAC75"], /* Hangul Syllable */ + ["\uAC76", "\uAC76"], /* Hangul Syllable */ + ["\uAC77", "\uAC77"], /* Hangul Syllable */ + ["\uAC78", "\uAC78"], /* Hangul Syllable */ + ["\uAC79", "\uAC79"], /* Hangul Syllable */ + ["\uAC7A", "\uAC7A"], /* Hangul Syllable */ + ["\uAC7B", "\uAC7B"], /* Hangul Syllable */ + ["\uAC7C", "\uAC7C"], /* Hangul Syllable */ + ["\uAC7D", "\uAC7D"], /* Hangul Syllable */ + ["\uAC7E", "\uAC7E"], /* Hangul Syllable */ + ["\uAC7F", "\uAC7F"], /* Hangul Syllable */ + ["\uAC80", "\uAC80"], /* Hangul Syllable */ + ["\uAC81", "\uAC81"], /* Hangul Syllable */ + ["\uAC82", "\uAC82"], /* Hangul Syllable */ + ["\uAC83", "\uAC83"], /* Hangul Syllable */ + ["\uAC84", "\uAC84"], /* Hangul Syllable */ + ["\uAC85", "\uAC85"], /* Hangul Syllable */ + ["\uAC86", "\uAC86"], /* Hangul Syllable */ + ["\uAC87", "\uAC87"], /* Hangul Syllable */ + ["\uAC88", "\uAC88"], /* Hangul Syllable */ + ["\uAC89", "\uAC89"], /* Hangul Syllable */ + ["\uAC8A", "\uAC8A"], /* Hangul Syllable */ + ["\uAC8B", "\uAC8B"], /* Hangul Syllable */ + ["\uAC8C", "\uAC8C"], /* Hangul Syllable */ + ["\uAC8D", "\uAC8D"], /* Hangul Syllable */ + ["\uAC8E", "\uAC8E"], /* Hangul Syllable */ + ["\uAC8F", "\uAC8F"], /* Hangul Syllable */ + ["\uAC90", "\uAC90"], /* Hangul Syllable */ + ["\uAC91", "\uAC91"], /* Hangul Syllable */ + ["\uAC92", "\uAC92"], /* Hangul Syllable */ + ["\uAC93", "\uAC93"], /* Hangul Syllable */ + ["\uAC94", "\uAC94"], /* Hangul Syllable */ + ["\uAC95", "\uAC95"], /* Hangul Syllable */ + ["\uAC96", "\uAC96"], /* Hangul Syllable */ + ["\uAC97", "\uAC97"], /* Hangul Syllable */ + ["\uAC98", "\uAC98"], /* Hangul Syllable */ + ["\uAC99", "\uAC99"], /* Hangul Syllable */ + ["\uAC9A", "\uAC9A"], /* Hangul Syllable */ + ["\uAC9B", "\uAC9B"], /* Hangul Syllable */ + ["\uAC9C", "\uAC9C"], /* Hangul Syllable */ + ["\uAC9D", "\uAC9D"], /* Hangul Syllable */ + ["\uAC9E", "\uAC9E"], /* Hangul Syllable */ + ["\uAC9F", "\uAC9F"], /* Hangul Syllable */ + ["\uACA0", "\uACA0"], /* Hangul Syllable */ + ["\uACA1", "\uACA1"], /* Hangul Syllable */ + ["\uACA2", "\uACA2"], /* Hangul Syllable */ + ["\uACA3", "\uACA3"], /* Hangul Syllable */ + ["\uACA4", "\uACA4"], /* Hangul Syllable */ + ["\uACA5", "\uACA5"], /* Hangul Syllable */ + ["\uACA6", "\uACA6"], /* Hangul Syllable */ + ["\uACA7", "\uACA7"], /* Hangul Syllable */ + ["\uACA8", "\uACA8"], /* Hangul Syllable */ + ["\uACA9", "\uACA9"], /* Hangul Syllable */ + ["\uACAA", "\uACAA"], /* Hangul Syllable */ + ["\uACAB", "\uACAB"], /* Hangul Syllable */ + ["\uACAC", "\uACAC"], /* Hangul Syllable */ + ["\uACAD", "\uACAD"], /* Hangul Syllable */ + ["\uACAE", "\uACAE"], /* Hangul Syllable */ + ["\uACAF", "\uACAF"], /* Hangul Syllable */ + ["\uACB0", "\uACB0"], /* Hangul Syllable */ + ["\uACB1", "\uACB1"], /* Hangul Syllable */ + ["\uACB2", "\uACB2"], /* Hangul Syllable */ + ["\uACB3", "\uACB3"], /* Hangul Syllable */ + ["\uACB4", "\uACB4"], /* Hangul Syllable */ + ["\uACB5", "\uACB5"], /* Hangul Syllable */ + ["\uACB6", "\uACB6"], /* Hangul Syllable */ + ["\uACB7", "\uACB7"], /* Hangul Syllable */ + ["\uACB8", "\uACB8"], /* Hangul Syllable */ + ["\uACB9", "\uACB9"], /* Hangul Syllable */ + ["\uACBA", "\uACBA"], /* Hangul Syllable */ + ["\uACBB", "\uACBB"], /* Hangul Syllable */ + ["\uACBC", "\uACBC"], /* Hangul Syllable */ + ["\uACBD", "\uACBD"], /* Hangul Syllable */ + ["\uACBE", "\uACBE"], /* Hangul Syllable */ + ["\uACBF", "\uACBF"], /* Hangul Syllable */ + ["\uACC0", "\uACC0"], /* Hangul Syllable */ + ["\uACC1", "\uACC1"], /* Hangul Syllable */ + ["\uACC2", "\uACC2"], /* Hangul Syllable */ + ["\uACC3", "\uACC3"], /* Hangul Syllable */ + ["\uACC4", "\uACC4"], /* Hangul Syllable */ + ["\uACC5", "\uACC5"], /* Hangul Syllable */ + ["\uACC6", "\uACC6"], /* Hangul Syllable */ + ["\uACC7", "\uACC7"], /* Hangul Syllable */ + ["\uACC8", "\uACC8"], /* Hangul Syllable */ + ["\uACC9", "\uACC9"], /* Hangul Syllable */ + ["\uACCA", "\uACCA"], /* Hangul Syllable */ + ["\uACCB", "\uACCB"], /* Hangul Syllable */ + ["\uACCC", "\uACCC"], /* Hangul Syllable */ + ["\uACCD", "\uACCD"], /* Hangul Syllable */ + ["\uACCE", "\uACCE"], /* Hangul Syllable */ + ["\uACCF", "\uACCF"], /* Hangul Syllable */ + ["\uACD0", "\uACD0"], /* Hangul Syllable */ + ["\uACD1", "\uACD1"], /* Hangul Syllable */ + ["\uACD2", "\uACD2"], /* Hangul Syllable */ + ["\uACD3", "\uACD3"], /* Hangul Syllable */ + ["\uACD4", "\uACD4"], /* Hangul Syllable */ + ["\uACD5", "\uACD5"], /* Hangul Syllable */ + ["\uACD6", "\uACD6"], /* Hangul Syllable */ + ["\uACD7", "\uACD7"], /* Hangul Syllable */ + ["\uACD8", "\uACD8"], /* Hangul Syllable */ + ["\uACD9", "\uACD9"], /* Hangul Syllable */ + ["\uACDA", "\uACDA"], /* Hangul Syllable */ + ["\uACDB", "\uACDB"], /* Hangul Syllable */ + ["\uACDC", "\uACDC"], /* Hangul Syllable */ + ["\uACDD", "\uACDD"], /* Hangul Syllable */ + ["\uACDE", "\uACDE"], /* Hangul Syllable */ + ["\uACDF", "\uACDF"], /* Hangul Syllable */ + ["\uACE0", "\uACE0"], /* Hangul Syllable */ + ["\uACE1", "\uACE1"], /* Hangul Syllable */ + ["\uACE2", "\uACE2"], /* Hangul Syllable */ + ["\uACE3", "\uACE3"], /* Hangul Syllable */ + ["\uACE4", "\uACE4"], /* Hangul Syllable */ + ["\uACE5", "\uACE5"], /* Hangul Syllable */ + ["\uACE6", "\uACE6"], /* Hangul Syllable */ + ["\uACE7", "\uACE7"], /* Hangul Syllable */ + ["\uACE8", "\uACE8"], /* Hangul Syllable */ + ["\uACE9", "\uACE9"], /* Hangul Syllable */ + ["\uACEA", "\uACEA"], /* Hangul Syllable */ + ["\uACEB", "\uACEB"], /* Hangul Syllable */ + ["\uACEC", "\uACEC"], /* Hangul Syllable */ + ["\uACED", "\uACED"], /* Hangul Syllable */ + ["\uACEE", "\uACEE"], /* Hangul Syllable */ + ["\uACEF", "\uACEF"], /* Hangul Syllable */ + ["\uACF0", "\uACF0"], /* Hangul Syllable */ + ["\uACF1", "\uACF1"], /* Hangul Syllable */ + ["\uACF2", "\uACF2"], /* Hangul Syllable */ + ["\uACF3", "\uACF3"], /* Hangul Syllable */ + ["\uACF4", "\uACF4"], /* Hangul Syllable */ + ["\uACF5", "\uACF5"], /* Hangul Syllable */ + ["\uACF6", "\uACF6"], /* Hangul Syllable */ + ["\uACF7", "\uACF7"], /* Hangul Syllable */ + ["\uACF8", "\uACF8"], /* Hangul Syllable */ + ["\uACF9", "\uACF9"], /* Hangul Syllable */ + ["\uACFA", "\uACFA"], /* Hangul Syllable */ + ["\uACFB", "\uACFB"], /* Hangul Syllable */ + ["\uACFC", "\uACFC"], /* Hangul Syllable */ + ["\uACFD", "\uACFD"], /* Hangul Syllable */ + ["\uACFE", "\uACFE"], /* Hangul Syllable */ + ["\uACFF", "\uACFF"], /* Hangul Syllable */ + ["\uAD00", "\uAD00"], /* Hangul Syllable */ + ["\uAD01", "\uAD01"], /* Hangul Syllable */ + ["\uAD02", "\uAD02"], /* Hangul Syllable */ + ["\uAD03", "\uAD03"], /* Hangul Syllable */ + ["\uAD04", "\uAD04"], /* Hangul Syllable */ + ["\uAD05", "\uAD05"], /* Hangul Syllable */ + ["\uAD06", "\uAD06"], /* Hangul Syllable */ + ["\uAD07", "\uAD07"], /* Hangul Syllable */ + ["\uAD08", "\uAD08"], /* Hangul Syllable */ + ["\uAD09", "\uAD09"], /* Hangul Syllable */ + ["\uAD0A", "\uAD0A"], /* Hangul Syllable */ + ["\uAD0B", "\uAD0B"], /* Hangul Syllable */ + ["\uAD0C", "\uAD0C"], /* Hangul Syllable */ + ["\uAD0D", "\uAD0D"], /* Hangul Syllable */ + ["\uAD0E", "\uAD0E"], /* Hangul Syllable */ + ["\uAD0F", "\uAD0F"], /* Hangul Syllable */ + ["\uAD10", "\uAD10"], /* Hangul Syllable */ + ["\uAD11", "\uAD11"], /* Hangul Syllable */ + ["\uAD12", "\uAD12"], /* Hangul Syllable */ + ["\uAD13", "\uAD13"], /* Hangul Syllable */ + ["\uAD14", "\uAD14"], /* Hangul Syllable */ + ["\uAD15", "\uAD15"], /* Hangul Syllable */ + ["\uAD16", "\uAD16"], /* Hangul Syllable */ + ["\uAD17", "\uAD17"], /* Hangul Syllable */ + ["\uAD18", "\uAD18"], /* Hangul Syllable */ + ["\uAD19", "\uAD19"], /* Hangul Syllable */ + ["\uAD1A", "\uAD1A"], /* Hangul Syllable */ + ["\uAD1B", "\uAD1B"], /* Hangul Syllable */ + ["\uAD1C", "\uAD1C"], /* Hangul Syllable */ + ["\uAD1D", "\uAD1D"], /* Hangul Syllable */ + ["\uAD1E", "\uAD1E"], /* Hangul Syllable */ + ["\uAD1F", "\uAD1F"], /* Hangul Syllable */ + ["\uAD20", "\uAD20"], /* Hangul Syllable */ + ["\uAD21", "\uAD21"], /* Hangul Syllable */ + ["\uAD22", "\uAD22"], /* Hangul Syllable */ + ["\uAD23", "\uAD23"], /* Hangul Syllable */ + ["\uAD24", "\uAD24"], /* Hangul Syllable */ + ["\uAD25", "\uAD25"], /* Hangul Syllable */ + ["\uAD26", "\uAD26"], /* Hangul Syllable */ + ["\uAD27", "\uAD27"], /* Hangul Syllable */ + ["\uAD28", "\uAD28"], /* Hangul Syllable */ + ["\uAD29", "\uAD29"], /* Hangul Syllable */ + ["\uAD2A", "\uAD2A"], /* Hangul Syllable */ + ["\uAD2B", "\uAD2B"], /* Hangul Syllable */ + ["\uAD2C", "\uAD2C"], /* Hangul Syllable */ + ["\uAD2D", "\uAD2D"], /* Hangul Syllable */ + ["\uAD2E", "\uAD2E"], /* Hangul Syllable */ + ["\uAD2F", "\uAD2F"], /* Hangul Syllable */ + ["\uAD30", "\uAD30"], /* Hangul Syllable */ + ["\uAD31", "\uAD31"], /* Hangul Syllable */ + ["\uAD32", "\uAD32"], /* Hangul Syllable */ + ["\uAD33", "\uAD33"], /* Hangul Syllable */ + ["\uAD34", "\uAD34"], /* Hangul Syllable */ + ["\uAD35", "\uAD35"], /* Hangul Syllable */ + ["\uAD36", "\uAD36"], /* Hangul Syllable */ + ["\uAD37", "\uAD37"], /* Hangul Syllable */ + ["\uAD38", "\uAD38"], /* Hangul Syllable */ + ["\uAD39", "\uAD39"], /* Hangul Syllable */ + ["\uAD3A", "\uAD3A"], /* Hangul Syllable */ + ["\uAD3B", "\uAD3B"], /* Hangul Syllable */ + ["\uAD3C", "\uAD3C"], /* Hangul Syllable */ + ["\uAD3D", "\uAD3D"], /* Hangul Syllable */ + ["\uAD3E", "\uAD3E"], /* Hangul Syllable */ + ["\uAD3F", "\uAD3F"], /* Hangul Syllable */ + ["\uAD40", "\uAD40"], /* Hangul Syllable */ + ["\uAD41", "\uAD41"], /* Hangul Syllable */ + ["\uAD42", "\uAD42"], /* Hangul Syllable */ + ["\uAD43", "\uAD43"], /* Hangul Syllable */ + ["\uAD44", "\uAD44"], /* Hangul Syllable */ + ["\uAD45", "\uAD45"], /* Hangul Syllable */ + ["\uAD46", "\uAD46"], /* Hangul Syllable */ + ["\uAD47", "\uAD47"], /* Hangul Syllable */ + ["\uAD48", "\uAD48"], /* Hangul Syllable */ + ["\uAD49", "\uAD49"], /* Hangul Syllable */ + ["\uAD4A", "\uAD4A"], /* Hangul Syllable */ + ["\uAD4B", "\uAD4B"], /* Hangul Syllable */ + ["\uAD4C", "\uAD4C"], /* Hangul Syllable */ + ["\uAD4D", "\uAD4D"], /* Hangul Syllable */ + ["\uAD4E", "\uAD4E"], /* Hangul Syllable */ + ["\uAD4F", "\uAD4F"], /* Hangul Syllable */ + ["\uAD50", "\uAD50"], /* Hangul Syllable */ + ["\uAD51", "\uAD51"], /* Hangul Syllable */ + ["\uAD52", "\uAD52"], /* Hangul Syllable */ + ["\uAD53", "\uAD53"], /* Hangul Syllable */ + ["\uAD54", "\uAD54"], /* Hangul Syllable */ + ["\uAD55", "\uAD55"], /* Hangul Syllable */ + ["\uAD56", "\uAD56"], /* Hangul Syllable */ + ["\uAD57", "\uAD57"], /* Hangul Syllable */ + ["\uAD58", "\uAD58"], /* Hangul Syllable */ + ["\uAD59", "\uAD59"], /* Hangul Syllable */ + ["\uAD5A", "\uAD5A"], /* Hangul Syllable */ + ["\uAD5B", "\uAD5B"], /* Hangul Syllable */ + ["\uAD5C", "\uAD5C"], /* Hangul Syllable */ + ["\uAD5D", "\uAD5D"], /* Hangul Syllable */ + ["\uAD5E", "\uAD5E"], /* Hangul Syllable */ + ["\uAD5F", "\uAD5F"], /* Hangul Syllable */ + ["\uAD60", "\uAD60"], /* Hangul Syllable */ + ["\uAD61", "\uAD61"], /* Hangul Syllable */ + ["\uAD62", "\uAD62"], /* Hangul Syllable */ + ["\uAD63", "\uAD63"], /* Hangul Syllable */ + ["\uAD64", "\uAD64"], /* Hangul Syllable */ + ["\uAD65", "\uAD65"], /* Hangul Syllable */ + ["\uAD66", "\uAD66"], /* Hangul Syllable */ + ["\uAD67", "\uAD67"], /* Hangul Syllable */ + ["\uAD68", "\uAD68"], /* Hangul Syllable */ + ["\uAD69", "\uAD69"], /* Hangul Syllable */ + ["\uAD6A", "\uAD6A"], /* Hangul Syllable */ + ["\uAD6B", "\uAD6B"], /* Hangul Syllable */ + ["\uAD6C", "\uAD6C"], /* Hangul Syllable */ + ["\uAD6D", "\uAD6D"], /* Hangul Syllable */ + ["\uAD6E", "\uAD6E"], /* Hangul Syllable */ + ["\uAD6F", "\uAD6F"], /* Hangul Syllable */ + ["\uAD70", "\uAD70"], /* Hangul Syllable */ + ["\uAD71", "\uAD71"], /* Hangul Syllable */ + ["\uAD72", "\uAD72"], /* Hangul Syllable */ + ["\uAD73", "\uAD73"], /* Hangul Syllable */ + ["\uAD74", "\uAD74"], /* Hangul Syllable */ + ["\uAD75", "\uAD75"], /* Hangul Syllable */ + ["\uAD76", "\uAD76"], /* Hangul Syllable */ + ["\uAD77", "\uAD77"], /* Hangul Syllable */ + ["\uAD78", "\uAD78"], /* Hangul Syllable */ + ["\uAD79", "\uAD79"], /* Hangul Syllable */ + ["\uAD7A", "\uAD7A"], /* Hangul Syllable */ + ["\uAD7B", "\uAD7B"], /* Hangul Syllable */ + ["\uAD7C", "\uAD7C"], /* Hangul Syllable */ + ["\uAD7D", "\uAD7D"], /* Hangul Syllable */ + ["\uAD7E", "\uAD7E"], /* Hangul Syllable */ + ["\uAD7F", "\uAD7F"], /* Hangul Syllable */ + ["\uAD80", "\uAD80"], /* Hangul Syllable */ + ["\uAD81", "\uAD81"], /* Hangul Syllable */ + ["\uAD82", "\uAD82"], /* Hangul Syllable */ + ["\uAD83", "\uAD83"], /* Hangul Syllable */ + ["\uAD84", "\uAD84"], /* Hangul Syllable */ + ["\uAD85", "\uAD85"], /* Hangul Syllable */ + ["\uAD86", "\uAD86"], /* Hangul Syllable */ + ["\uAD87", "\uAD87"], /* Hangul Syllable */ + ["\uAD88", "\uAD88"], /* Hangul Syllable */ + ["\uAD89", "\uAD89"], /* Hangul Syllable */ + ["\uAD8A", "\uAD8A"], /* Hangul Syllable */ + ["\uAD8B", "\uAD8B"], /* Hangul Syllable */ + ["\uAD8C", "\uAD8C"], /* Hangul Syllable */ + ["\uAD8D", "\uAD8D"], /* Hangul Syllable */ + ["\uAD8E", "\uAD8E"], /* Hangul Syllable */ + ["\uAD8F", "\uAD8F"], /* Hangul Syllable */ + ["\uAD90", "\uAD90"], /* Hangul Syllable */ + ["\uAD91", "\uAD91"], /* Hangul Syllable */ + ["\uAD92", "\uAD92"], /* Hangul Syllable */ + ["\uAD93", "\uAD93"], /* Hangul Syllable */ + ["\uAD94", "\uAD94"], /* Hangul Syllable */ + ["\uAD95", "\uAD95"], /* Hangul Syllable */ + ["\uAD96", "\uAD96"], /* Hangul Syllable */ + ["\uAD97", "\uAD97"], /* Hangul Syllable */ + ["\uAD98", "\uAD98"], /* Hangul Syllable */ + ["\uAD99", "\uAD99"], /* Hangul Syllable */ + ["\uAD9A", "\uAD9A"], /* Hangul Syllable */ + ["\uAD9B", "\uAD9B"], /* Hangul Syllable */ + ["\uAD9C", "\uAD9C"], /* Hangul Syllable */ + ["\uAD9D", "\uAD9D"], /* Hangul Syllable */ + ["\uAD9E", "\uAD9E"], /* Hangul Syllable */ + ["\uAD9F", "\uAD9F"], /* Hangul Syllable */ + ["\uADA0", "\uADA0"], /* Hangul Syllable */ + ["\uADA1", "\uADA1"], /* Hangul Syllable */ + ["\uADA2", "\uADA2"], /* Hangul Syllable */ + ["\uADA3", "\uADA3"], /* Hangul Syllable */ + ["\uADA4", "\uADA4"], /* Hangul Syllable */ + ["\uADA5", "\uADA5"], /* Hangul Syllable */ + ["\uADA6", "\uADA6"], /* Hangul Syllable */ + ["\uADA7", "\uADA7"], /* Hangul Syllable */ + ["\uADA8", "\uADA8"], /* Hangul Syllable */ + ["\uADA9", "\uADA9"], /* Hangul Syllable */ + ["\uADAA", "\uADAA"], /* Hangul Syllable */ + ["\uADAB", "\uADAB"], /* Hangul Syllable */ + ["\uADAC", "\uADAC"], /* Hangul Syllable */ + ["\uADAD", "\uADAD"], /* Hangul Syllable */ + ["\uADAE", "\uADAE"], /* Hangul Syllable */ + ["\uADAF", "\uADAF"], /* Hangul Syllable */ + ["\uADB0", "\uADB0"], /* Hangul Syllable */ + ["\uADB1", "\uADB1"], /* Hangul Syllable */ + ["\uADB2", "\uADB2"], /* Hangul Syllable */ + ["\uADB3", "\uADB3"], /* Hangul Syllable */ + ["\uADB4", "\uADB4"], /* Hangul Syllable */ + ["\uADB5", "\uADB5"], /* Hangul Syllable */ + ["\uADB6", "\uADB6"], /* Hangul Syllable */ + ["\uADB7", "\uADB7"], /* Hangul Syllable */ + ["\uADB8", "\uADB8"], /* Hangul Syllable */ + ["\uADB9", "\uADB9"], /* Hangul Syllable */ + ["\uADBA", "\uADBA"], /* Hangul Syllable */ + ["\uADBB", "\uADBB"], /* Hangul Syllable */ + ["\uADBC", "\uADBC"], /* Hangul Syllable */ + ["\uADBD", "\uADBD"], /* Hangul Syllable */ + ["\uADBE", "\uADBE"], /* Hangul Syllable */ + ["\uADBF", "\uADBF"], /* Hangul Syllable */ + ["\uADC0", "\uADC0"], /* Hangul Syllable */ + ["\uADC1", "\uADC1"], /* Hangul Syllable */ + ["\uADC2", "\uADC2"], /* Hangul Syllable */ + ["\uADC3", "\uADC3"], /* Hangul Syllable */ + ["\uADC4", "\uADC4"], /* Hangul Syllable */ + ["\uADC5", "\uADC5"], /* Hangul Syllable */ + ["\uADC6", "\uADC6"], /* Hangul Syllable */ + ["\uADC7", "\uADC7"], /* Hangul Syllable */ + ["\uADC8", "\uADC8"], /* Hangul Syllable */ + ["\uADC9", "\uADC9"], /* Hangul Syllable */ + ["\uADCA", "\uADCA"], /* Hangul Syllable */ + ["\uADCB", "\uADCB"], /* Hangul Syllable */ + ["\uADCC", "\uADCC"], /* Hangul Syllable */ + ["\uADCD", "\uADCD"], /* Hangul Syllable */ + ["\uADCE", "\uADCE"], /* Hangul Syllable */ + ["\uADCF", "\uADCF"], /* Hangul Syllable */ + ["\uADD0", "\uADD0"], /* Hangul Syllable */ + ["\uADD1", "\uADD1"], /* Hangul Syllable */ + ["\uADD2", "\uADD2"], /* Hangul Syllable */ + ["\uADD3", "\uADD3"], /* Hangul Syllable */ + ["\uADD4", "\uADD4"], /* Hangul Syllable */ + ["\uADD5", "\uADD5"], /* Hangul Syllable */ + ["\uADD6", "\uADD6"], /* Hangul Syllable */ + ["\uADD7", "\uADD7"], /* Hangul Syllable */ + ["\uADD8", "\uADD8"], /* Hangul Syllable */ + ["\uADD9", "\uADD9"], /* Hangul Syllable */ + ["\uADDA", "\uADDA"], /* Hangul Syllable */ + ["\uADDB", "\uADDB"], /* Hangul Syllable */ + ["\uADDC", "\uADDC"], /* Hangul Syllable */ + ["\uADDD", "\uADDD"], /* Hangul Syllable */ + ["\uADDE", "\uADDE"], /* Hangul Syllable */ + ["\uADDF", "\uADDF"], /* Hangul Syllable */ + ["\uADE0", "\uADE0"], /* Hangul Syllable */ + ["\uADE1", "\uADE1"], /* Hangul Syllable */ + ["\uADE2", "\uADE2"], /* Hangul Syllable */ + ["\uADE3", "\uADE3"], /* Hangul Syllable */ + ["\uADE4", "\uADE4"], /* Hangul Syllable */ + ["\uADE5", "\uADE5"], /* Hangul Syllable */ + ["\uADE6", "\uADE6"], /* Hangul Syllable */ + ["\uADE7", "\uADE7"], /* Hangul Syllable */ + ["\uADE8", "\uADE8"], /* Hangul Syllable */ + ["\uADE9", "\uADE9"], /* Hangul Syllable */ + ["\uADEA", "\uADEA"], /* Hangul Syllable */ + ["\uADEB", "\uADEB"], /* Hangul Syllable */ + ["\uADEC", "\uADEC"], /* Hangul Syllable */ + ["\uADED", "\uADED"], /* Hangul Syllable */ + ["\uADEE", "\uADEE"], /* Hangul Syllable */ + ["\uADEF", "\uADEF"], /* Hangul Syllable */ + ["\uADF0", "\uADF0"], /* Hangul Syllable */ + ["\uADF1", "\uADF1"], /* Hangul Syllable */ + ["\uADF2", "\uADF2"], /* Hangul Syllable */ + ["\uADF3", "\uADF3"], /* Hangul Syllable */ + ["\uADF4", "\uADF4"], /* Hangul Syllable */ + ["\uADF5", "\uADF5"], /* Hangul Syllable */ + ["\uADF6", "\uADF6"], /* Hangul Syllable */ + ["\uADF7", "\uADF7"], /* Hangul Syllable */ + ["\uADF8", "\uADF8"], /* Hangul Syllable */ + ["\uADF9", "\uADF9"], /* Hangul Syllable */ + ["\uADFA", "\uADFA"], /* Hangul Syllable */ + ["\uADFB", "\uADFB"], /* Hangul Syllable */ + ["\uADFC", "\uADFC"], /* Hangul Syllable */ + ["\uADFD", "\uADFD"], /* Hangul Syllable */ + ["\uADFE", "\uADFE"], /* Hangul Syllable */ + ["\uADFF", "\uADFF"], /* Hangul Syllable */ + ["\uAE00", "\uAE00"], /* Hangul Syllable */ + ["\uAE01", "\uAE01"], /* Hangul Syllable */ + ["\uAE02", "\uAE02"], /* Hangul Syllable */ + ["\uAE03", "\uAE03"], /* Hangul Syllable */ + ["\uAE04", "\uAE04"], /* Hangul Syllable */ + ["\uAE05", "\uAE05"], /* Hangul Syllable */ + ["\uAE06", "\uAE06"], /* Hangul Syllable */ + ["\uAE07", "\uAE07"], /* Hangul Syllable */ + ["\uAE08", "\uAE08"], /* Hangul Syllable */ + ["\uAE09", "\uAE09"], /* Hangul Syllable */ + ["\uAE0A", "\uAE0A"], /* Hangul Syllable */ + ["\uAE0B", "\uAE0B"], /* Hangul Syllable */ + ["\uAE0C", "\uAE0C"], /* Hangul Syllable */ + ["\uAE0D", "\uAE0D"], /* Hangul Syllable */ + ["\uAE0E", "\uAE0E"], /* Hangul Syllable */ + ["\uAE0F", "\uAE0F"], /* Hangul Syllable */ + ["\uAE10", "\uAE10"], /* Hangul Syllable */ + ["\uAE11", "\uAE11"], /* Hangul Syllable */ + ["\uAE12", "\uAE12"], /* Hangul Syllable */ + ["\uAE13", "\uAE13"], /* Hangul Syllable */ + ["\uAE14", "\uAE14"], /* Hangul Syllable */ + ["\uAE15", "\uAE15"], /* Hangul Syllable */ + ["\uAE16", "\uAE16"], /* Hangul Syllable */ + ["\uAE17", "\uAE17"], /* Hangul Syllable */ + ["\uAE18", "\uAE18"], /* Hangul Syllable */ + ["\uAE19", "\uAE19"], /* Hangul Syllable */ + ["\uAE1A", "\uAE1A"], /* Hangul Syllable */ + ["\uAE1B", "\uAE1B"], /* Hangul Syllable */ + ["\uAE1C", "\uAE1C"], /* Hangul Syllable */ + ["\uAE1D", "\uAE1D"], /* Hangul Syllable */ + ["\uAE1E", "\uAE1E"], /* Hangul Syllable */ + ["\uAE1F", "\uAE1F"], /* Hangul Syllable */ + ["\uAE20", "\uAE20"], /* Hangul Syllable */ + ["\uAE21", "\uAE21"], /* Hangul Syllable */ + ["\uAE22", "\uAE22"], /* Hangul Syllable */ + ["\uAE23", "\uAE23"], /* Hangul Syllable */ + ["\uAE24", "\uAE24"], /* Hangul Syllable */ + ["\uAE25", "\uAE25"], /* Hangul Syllable */ + ["\uAE26", "\uAE26"], /* Hangul Syllable */ + ["\uAE27", "\uAE27"], /* Hangul Syllable */ + ["\uAE28", "\uAE28"], /* Hangul Syllable */ + ["\uAE29", "\uAE29"], /* Hangul Syllable */ + ["\uAE2A", "\uAE2A"], /* Hangul Syllable */ + ["\uAE2B", "\uAE2B"], /* Hangul Syllable */ + ["\uAE2C", "\uAE2C"], /* Hangul Syllable */ + ["\uAE2D", "\uAE2D"], /* Hangul Syllable */ + ["\uAE2E", "\uAE2E"], /* Hangul Syllable */ + ["\uAE2F", "\uAE2F"], /* Hangul Syllable */ + ["\uAE30", "\uAE30"], /* Hangul Syllable */ + ["\uAE31", "\uAE31"], /* Hangul Syllable */ + ["\uAE32", "\uAE32"], /* Hangul Syllable */ + ["\uAE33", "\uAE33"], /* Hangul Syllable */ + ["\uAE34", "\uAE34"], /* Hangul Syllable */ + ["\uAE35", "\uAE35"], /* Hangul Syllable */ + ["\uAE36", "\uAE36"], /* Hangul Syllable */ + ["\uAE37", "\uAE37"], /* Hangul Syllable */ + ["\uAE38", "\uAE38"], /* Hangul Syllable */ + ["\uAE39", "\uAE39"], /* Hangul Syllable */ + ["\uAE3A", "\uAE3A"], /* Hangul Syllable */ + ["\uAE3B", "\uAE3B"], /* Hangul Syllable */ + ["\uAE3C", "\uAE3C"], /* Hangul Syllable */ + ["\uAE3D", "\uAE3D"], /* Hangul Syllable */ + ["\uAE3E", "\uAE3E"], /* Hangul Syllable */ + ["\uAE3F", "\uAE3F"], /* Hangul Syllable */ + ["\uAE40", "\uAE40"], /* Hangul Syllable */ + ["\uAE41", "\uAE41"], /* Hangul Syllable */ + ["\uAE42", "\uAE42"], /* Hangul Syllable */ + ["\uAE43", "\uAE43"], /* Hangul Syllable */ + ["\uAE44", "\uAE44"], /* Hangul Syllable */ + ["\uAE45", "\uAE45"], /* Hangul Syllable */ + ["\uAE46", "\uAE46"], /* Hangul Syllable */ + ["\uAE47", "\uAE47"], /* Hangul Syllable */ + ["\uAE48", "\uAE48"], /* Hangul Syllable */ + ["\uAE49", "\uAE49"], /* Hangul Syllable */ + ["\uAE4A", "\uAE4A"], /* Hangul Syllable */ + ["\uAE4B", "\uAE4B"], /* Hangul Syllable */ + ["\uAE4C", "\uAE4C"], /* Hangul Syllable */ + ["\uAE4D", "\uAE4D"], /* Hangul Syllable */ + ["\uAE4E", "\uAE4E"], /* Hangul Syllable */ + ["\uAE4F", "\uAE4F"], /* Hangul Syllable */ + ["\uAE50", "\uAE50"], /* Hangul Syllable */ + ["\uAE51", "\uAE51"], /* Hangul Syllable */ + ["\uAE52", "\uAE52"], /* Hangul Syllable */ + ["\uAE53", "\uAE53"], /* Hangul Syllable */ + ["\uAE54", "\uAE54"], /* Hangul Syllable */ + ["\uAE55", "\uAE55"], /* Hangul Syllable */ + ["\uAE56", "\uAE56"], /* Hangul Syllable */ + ["\uAE57", "\uAE57"], /* Hangul Syllable */ + ["\uAE58", "\uAE58"], /* Hangul Syllable */ + ["\uAE59", "\uAE59"], /* Hangul Syllable */ + ["\uAE5A", "\uAE5A"], /* Hangul Syllable */ + ["\uAE5B", "\uAE5B"], /* Hangul Syllable */ + ["\uAE5C", "\uAE5C"], /* Hangul Syllable */ + ["\uAE5D", "\uAE5D"], /* Hangul Syllable */ + ["\uAE5E", "\uAE5E"], /* Hangul Syllable */ + ["\uAE5F", "\uAE5F"], /* Hangul Syllable */ + ["\uAE60", "\uAE60"], /* Hangul Syllable */ + ["\uAE61", "\uAE61"], /* Hangul Syllable */ + ["\uAE62", "\uAE62"], /* Hangul Syllable */ + ["\uAE63", "\uAE63"], /* Hangul Syllable */ + ["\uAE64", "\uAE64"], /* Hangul Syllable */ + ["\uAE65", "\uAE65"], /* Hangul Syllable */ + ["\uAE66", "\uAE66"], /* Hangul Syllable */ + ["\uAE67", "\uAE67"], /* Hangul Syllable */ + ["\uAE68", "\uAE68"], /* Hangul Syllable */ + ["\uAE69", "\uAE69"], /* Hangul Syllable */ + ["\uAE6A", "\uAE6A"], /* Hangul Syllable */ + ["\uAE6B", "\uAE6B"], /* Hangul Syllable */ + ["\uAE6C", "\uAE6C"], /* Hangul Syllable */ + ["\uAE6D", "\uAE6D"], /* Hangul Syllable */ + ["\uAE6E", "\uAE6E"], /* Hangul Syllable */ + ["\uAE6F", "\uAE6F"], /* Hangul Syllable */ + ["\uAE70", "\uAE70"], /* Hangul Syllable */ + ["\uAE71", "\uAE71"], /* Hangul Syllable */ + ["\uAE72", "\uAE72"], /* Hangul Syllable */ + ["\uAE73", "\uAE73"], /* Hangul Syllable */ + ["\uAE74", "\uAE74"], /* Hangul Syllable */ + ["\uAE75", "\uAE75"], /* Hangul Syllable */ + ["\uAE76", "\uAE76"], /* Hangul Syllable */ + ["\uAE77", "\uAE77"], /* Hangul Syllable */ + ["\uAE78", "\uAE78"], /* Hangul Syllable */ + ["\uAE79", "\uAE79"], /* Hangul Syllable */ + ["\uAE7A", "\uAE7A"], /* Hangul Syllable */ + ["\uAE7B", "\uAE7B"], /* Hangul Syllable */ + ["\uAE7C", "\uAE7C"], /* Hangul Syllable */ + ["\uAE7D", "\uAE7D"], /* Hangul Syllable */ + ["\uAE7E", "\uAE7E"], /* Hangul Syllable */ + ["\uAE7F", "\uAE7F"], /* Hangul Syllable */ + ["\uAE80", "\uAE80"], /* Hangul Syllable */ + ["\uAE81", "\uAE81"], /* Hangul Syllable */ + ["\uAE82", "\uAE82"], /* Hangul Syllable */ + ["\uAE83", "\uAE83"], /* Hangul Syllable */ + ["\uAE84", "\uAE84"], /* Hangul Syllable */ + ["\uAE85", "\uAE85"], /* Hangul Syllable */ + ["\uAE86", "\uAE86"], /* Hangul Syllable */ + ["\uAE87", "\uAE87"], /* Hangul Syllable */ + ["\uAE88", "\uAE88"], /* Hangul Syllable */ + ["\uAE89", "\uAE89"], /* Hangul Syllable */ + ["\uAE8A", "\uAE8A"], /* Hangul Syllable */ + ["\uAE8B", "\uAE8B"], /* Hangul Syllable */ + ["\uAE8C", "\uAE8C"], /* Hangul Syllable */ + ["\uAE8D", "\uAE8D"], /* Hangul Syllable */ + ["\uAE8E", "\uAE8E"], /* Hangul Syllable */ + ["\uAE8F", "\uAE8F"], /* Hangul Syllable */ + ["\uAE90", "\uAE90"], /* Hangul Syllable */ + ["\uAE91", "\uAE91"], /* Hangul Syllable */ + ["\uAE92", "\uAE92"], /* Hangul Syllable */ + ["\uAE93", "\uAE93"], /* Hangul Syllable */ + ["\uAE94", "\uAE94"], /* Hangul Syllable */ + ["\uAE95", "\uAE95"], /* Hangul Syllable */ + ["\uAE96", "\uAE96"], /* Hangul Syllable */ + ["\uAE97", "\uAE97"], /* Hangul Syllable */ + ["\uAE98", "\uAE98"], /* Hangul Syllable */ + ["\uAE99", "\uAE99"], /* Hangul Syllable */ + ["\uAE9A", "\uAE9A"], /* Hangul Syllable */ + ["\uAE9B", "\uAE9B"], /* Hangul Syllable */ + ["\uAE9C", "\uAE9C"], /* Hangul Syllable */ + ["\uAE9D", "\uAE9D"], /* Hangul Syllable */ + ["\uAE9E", "\uAE9E"], /* Hangul Syllable */ + ["\uAE9F", "\uAE9F"], /* Hangul Syllable */ + ["\uAEA0", "\uAEA0"], /* Hangul Syllable */ + ["\uAEA1", "\uAEA1"], /* Hangul Syllable */ + ["\uAEA2", "\uAEA2"], /* Hangul Syllable */ + ["\uAEA3", "\uAEA3"], /* Hangul Syllable */ + ["\uAEA4", "\uAEA4"], /* Hangul Syllable */ + ["\uAEA5", "\uAEA5"], /* Hangul Syllable */ + ["\uAEA6", "\uAEA6"], /* Hangul Syllable */ + ["\uAEA7", "\uAEA7"], /* Hangul Syllable */ + ["\uAEA8", "\uAEA8"], /* Hangul Syllable */ + ["\uAEA9", "\uAEA9"], /* Hangul Syllable */ + ["\uAEAA", "\uAEAA"], /* Hangul Syllable */ + ["\uAEAB", "\uAEAB"], /* Hangul Syllable */ + ["\uAEAC", "\uAEAC"], /* Hangul Syllable */ + ["\uAEAD", "\uAEAD"], /* Hangul Syllable */ + ["\uAEAE", "\uAEAE"], /* Hangul Syllable */ + ["\uAEAF", "\uAEAF"], /* Hangul Syllable */ + ["\uAEB0", "\uAEB0"], /* Hangul Syllable */ + ["\uAEB1", "\uAEB1"], /* Hangul Syllable */ + ["\uAEB2", "\uAEB2"], /* Hangul Syllable */ + ["\uAEB3", "\uAEB3"], /* Hangul Syllable */ + ["\uAEB4", "\uAEB4"], /* Hangul Syllable */ + ["\uAEB5", "\uAEB5"], /* Hangul Syllable */ + ["\uAEB6", "\uAEB6"], /* Hangul Syllable */ + ["\uAEB7", "\uAEB7"], /* Hangul Syllable */ + ["\uAEB8", "\uAEB8"], /* Hangul Syllable */ + ["\uAEB9", "\uAEB9"], /* Hangul Syllable */ + ["\uAEBA", "\uAEBA"], /* Hangul Syllable */ + ["\uAEBB", "\uAEBB"], /* Hangul Syllable */ + ["\uAEBC", "\uAEBC"], /* Hangul Syllable */ + ["\uAEBD", "\uAEBD"], /* Hangul Syllable */ + ["\uAEBE", "\uAEBE"], /* Hangul Syllable */ + ["\uAEBF", "\uAEBF"], /* Hangul Syllable */ + ["\uAEC0", "\uAEC0"], /* Hangul Syllable */ + ["\uAEC1", "\uAEC1"], /* Hangul Syllable */ + ["\uAEC2", "\uAEC2"], /* Hangul Syllable */ + ["\uAEC3", "\uAEC3"], /* Hangul Syllable */ + ["\uAEC4", "\uAEC4"], /* Hangul Syllable */ + ["\uAEC5", "\uAEC5"], /* Hangul Syllable */ + ["\uAEC6", "\uAEC6"], /* Hangul Syllable */ + ["\uAEC7", "\uAEC7"], /* Hangul Syllable */ + ["\uAEC8", "\uAEC8"], /* Hangul Syllable */ + ["\uAEC9", "\uAEC9"], /* Hangul Syllable */ + ["\uAECA", "\uAECA"], /* Hangul Syllable */ + ["\uAECB", "\uAECB"], /* Hangul Syllable */ + ["\uAECC", "\uAECC"], /* Hangul Syllable */ + ["\uAECD", "\uAECD"], /* Hangul Syllable */ + ["\uAECE", "\uAECE"], /* Hangul Syllable */ + ["\uAECF", "\uAECF"], /* Hangul Syllable */ + ["\uAED0", "\uAED0"], /* Hangul Syllable */ + ["\uAED1", "\uAED1"], /* Hangul Syllable */ + ["\uAED2", "\uAED2"], /* Hangul Syllable */ + ["\uAED3", "\uAED3"], /* Hangul Syllable */ + ["\uAED4", "\uAED4"], /* Hangul Syllable */ + ["\uAED5", "\uAED5"], /* Hangul Syllable */ + ["\uAED6", "\uAED6"], /* Hangul Syllable */ + ["\uAED7", "\uAED7"], /* Hangul Syllable */ + ["\uAED8", "\uAED8"], /* Hangul Syllable */ + ["\uAED9", "\uAED9"], /* Hangul Syllable */ + ["\uAEDA", "\uAEDA"], /* Hangul Syllable */ + ["\uAEDB", "\uAEDB"], /* Hangul Syllable */ + ["\uAEDC", "\uAEDC"], /* Hangul Syllable */ + ["\uAEDD", "\uAEDD"], /* Hangul Syllable */ + ["\uAEDE", "\uAEDE"], /* Hangul Syllable */ + ["\uAEDF", "\uAEDF"], /* Hangul Syllable */ + ["\uAEE0", "\uAEE0"], /* Hangul Syllable */ + ["\uAEE1", "\uAEE1"], /* Hangul Syllable */ + ["\uAEE2", "\uAEE2"], /* Hangul Syllable */ + ["\uAEE3", "\uAEE3"], /* Hangul Syllable */ + ["\uAEE4", "\uAEE4"], /* Hangul Syllable */ + ["\uAEE5", "\uAEE5"], /* Hangul Syllable */ + ["\uAEE6", "\uAEE6"], /* Hangul Syllable */ + ["\uAEE7", "\uAEE7"], /* Hangul Syllable */ + ["\uAEE8", "\uAEE8"], /* Hangul Syllable */ + ["\uAEE9", "\uAEE9"], /* Hangul Syllable */ + ["\uAEEA", "\uAEEA"], /* Hangul Syllable */ + ["\uAEEB", "\uAEEB"], /* Hangul Syllable */ + ["\uAEEC", "\uAEEC"], /* Hangul Syllable */ + ["\uAEED", "\uAEED"], /* Hangul Syllable */ + ["\uAEEE", "\uAEEE"], /* Hangul Syllable */ + ["\uAEEF", "\uAEEF"], /* Hangul Syllable */ + ["\uAEF0", "\uAEF0"], /* Hangul Syllable */ + ["\uAEF1", "\uAEF1"], /* Hangul Syllable */ + ["\uAEF2", "\uAEF2"], /* Hangul Syllable */ + ["\uAEF3", "\uAEF3"], /* Hangul Syllable */ + ["\uAEF4", "\uAEF4"], /* Hangul Syllable */ + ["\uAEF5", "\uAEF5"], /* Hangul Syllable */ + ["\uAEF6", "\uAEF6"], /* Hangul Syllable */ + ["\uAEF7", "\uAEF7"], /* Hangul Syllable */ + ["\uAEF8", "\uAEF8"], /* Hangul Syllable */ + ["\uAEF9", "\uAEF9"], /* Hangul Syllable */ + ["\uAEFA", "\uAEFA"], /* Hangul Syllable */ + ["\uAEFB", "\uAEFB"], /* Hangul Syllable */ + ["\uAEFC", "\uAEFC"], /* Hangul Syllable */ + ["\uAEFD", "\uAEFD"], /* Hangul Syllable */ + ["\uAEFE", "\uAEFE"], /* Hangul Syllable */ + ["\uAEFF", "\uAEFF"], /* Hangul Syllable */ + ["\uAF00", "\uAF00"], /* Hangul Syllable */ + ["\uAF01", "\uAF01"], /* Hangul Syllable */ + ["\uAF02", "\uAF02"], /* Hangul Syllable */ + ["\uAF03", "\uAF03"], /* Hangul Syllable */ + ["\uAF04", "\uAF04"], /* Hangul Syllable */ + ["\uAF05", "\uAF05"], /* Hangul Syllable */ + ["\uAF06", "\uAF06"], /* Hangul Syllable */ + ["\uAF07", "\uAF07"], /* Hangul Syllable */ + ["\uAF08", "\uAF08"], /* Hangul Syllable */ + ["\uAF09", "\uAF09"], /* Hangul Syllable */ + ["\uAF0A", "\uAF0A"], /* Hangul Syllable */ + ["\uAF0B", "\uAF0B"], /* Hangul Syllable */ + ["\uAF0C", "\uAF0C"], /* Hangul Syllable */ + ["\uAF0D", "\uAF0D"], /* Hangul Syllable */ + ["\uAF0E", "\uAF0E"], /* Hangul Syllable */ + ["\uAF0F", "\uAF0F"], /* Hangul Syllable */ + ["\uAF10", "\uAF10"], /* Hangul Syllable */ + ["\uAF11", "\uAF11"], /* Hangul Syllable */ + ["\uAF12", "\uAF12"], /* Hangul Syllable */ + ["\uAF13", "\uAF13"], /* Hangul Syllable */ + ["\uAF14", "\uAF14"], /* Hangul Syllable */ + ["\uAF15", "\uAF15"], /* Hangul Syllable */ + ["\uAF16", "\uAF16"], /* Hangul Syllable */ + ["\uAF17", "\uAF17"], /* Hangul Syllable */ + ["\uAF18", "\uAF18"], /* Hangul Syllable */ + ["\uAF19", "\uAF19"], /* Hangul Syllable */ + ["\uAF1A", "\uAF1A"], /* Hangul Syllable */ + ["\uAF1B", "\uAF1B"], /* Hangul Syllable */ + ["\uAF1C", "\uAF1C"], /* Hangul Syllable */ + ["\uAF1D", "\uAF1D"], /* Hangul Syllable */ + ["\uAF1E", "\uAF1E"], /* Hangul Syllable */ + ["\uAF1F", "\uAF1F"], /* Hangul Syllable */ + ["\uAF20", "\uAF20"], /* Hangul Syllable */ + ["\uAF21", "\uAF21"], /* Hangul Syllable */ + ["\uAF22", "\uAF22"], /* Hangul Syllable */ + ["\uAF23", "\uAF23"], /* Hangul Syllable */ + ["\uAF24", "\uAF24"], /* Hangul Syllable */ + ["\uAF25", "\uAF25"], /* Hangul Syllable */ + ["\uAF26", "\uAF26"], /* Hangul Syllable */ + ["\uAF27", "\uAF27"], /* Hangul Syllable */ + ["\uAF28", "\uAF28"], /* Hangul Syllable */ + ["\uAF29", "\uAF29"], /* Hangul Syllable */ + ["\uAF2A", "\uAF2A"], /* Hangul Syllable */ + ["\uAF2B", "\uAF2B"], /* Hangul Syllable */ + ["\uAF2C", "\uAF2C"], /* Hangul Syllable */ + ["\uAF2D", "\uAF2D"], /* Hangul Syllable */ + ["\uAF2E", "\uAF2E"], /* Hangul Syllable */ + ["\uAF2F", "\uAF2F"], /* Hangul Syllable */ + ["\uAF30", "\uAF30"], /* Hangul Syllable */ + ["\uAF31", "\uAF31"], /* Hangul Syllable */ + ["\uAF32", "\uAF32"], /* Hangul Syllable */ + ["\uAF33", "\uAF33"], /* Hangul Syllable */ + ["\uAF34", "\uAF34"], /* Hangul Syllable */ + ["\uAF35", "\uAF35"], /* Hangul Syllable */ + ["\uAF36", "\uAF36"], /* Hangul Syllable */ + ["\uAF37", "\uAF37"], /* Hangul Syllable */ + ["\uAF38", "\uAF38"], /* Hangul Syllable */ + ["\uAF39", "\uAF39"], /* Hangul Syllable */ + ["\uAF3A", "\uAF3A"], /* Hangul Syllable */ + ["\uAF3B", "\uAF3B"], /* Hangul Syllable */ + ["\uAF3C", "\uAF3C"], /* Hangul Syllable */ + ["\uAF3D", "\uAF3D"], /* Hangul Syllable */ + ["\uAF3E", "\uAF3E"], /* Hangul Syllable */ + ["\uAF3F", "\uAF3F"], /* Hangul Syllable */ + ["\uAF40", "\uAF40"], /* Hangul Syllable */ + ["\uAF41", "\uAF41"], /* Hangul Syllable */ + ["\uAF42", "\uAF42"], /* Hangul Syllable */ + ["\uAF43", "\uAF43"], /* Hangul Syllable */ + ["\uAF44", "\uAF44"], /* Hangul Syllable */ + ["\uAF45", "\uAF45"], /* Hangul Syllable */ + ["\uAF46", "\uAF46"], /* Hangul Syllable */ + ["\uAF47", "\uAF47"], /* Hangul Syllable */ + ["\uAF48", "\uAF48"], /* Hangul Syllable */ + ["\uAF49", "\uAF49"], /* Hangul Syllable */ + ["\uAF4A", "\uAF4A"], /* Hangul Syllable */ + ["\uAF4B", "\uAF4B"], /* Hangul Syllable */ + ["\uAF4C", "\uAF4C"], /* Hangul Syllable */ + ["\uAF4D", "\uAF4D"], /* Hangul Syllable */ + ["\uAF4E", "\uAF4E"], /* Hangul Syllable */ + ["\uAF4F", "\uAF4F"], /* Hangul Syllable */ + ["\uAF50", "\uAF50"], /* Hangul Syllable */ + ["\uAF51", "\uAF51"], /* Hangul Syllable */ + ["\uAF52", "\uAF52"], /* Hangul Syllable */ + ["\uAF53", "\uAF53"], /* Hangul Syllable */ + ["\uAF54", "\uAF54"], /* Hangul Syllable */ + ["\uAF55", "\uAF55"], /* Hangul Syllable */ + ["\uAF56", "\uAF56"], /* Hangul Syllable */ + ["\uAF57", "\uAF57"], /* Hangul Syllable */ + ["\uAF58", "\uAF58"], /* Hangul Syllable */ + ["\uAF59", "\uAF59"], /* Hangul Syllable */ + ["\uAF5A", "\uAF5A"], /* Hangul Syllable */ + ["\uAF5B", "\uAF5B"], /* Hangul Syllable */ + ["\uAF5C", "\uAF5C"], /* Hangul Syllable */ + ["\uAF5D", "\uAF5D"], /* Hangul Syllable */ + ["\uAF5E", "\uAF5E"], /* Hangul Syllable */ + ["\uAF5F", "\uAF5F"], /* Hangul Syllable */ + ["\uAF60", "\uAF60"], /* Hangul Syllable */ + ["\uAF61", "\uAF61"], /* Hangul Syllable */ + ["\uAF62", "\uAF62"], /* Hangul Syllable */ + ["\uAF63", "\uAF63"], /* Hangul Syllable */ + ["\uAF64", "\uAF64"], /* Hangul Syllable */ + ["\uAF65", "\uAF65"], /* Hangul Syllable */ + ["\uAF66", "\uAF66"], /* Hangul Syllable */ + ["\uAF67", "\uAF67"], /* Hangul Syllable */ + ["\uAF68", "\uAF68"], /* Hangul Syllable */ + ["\uAF69", "\uAF69"], /* Hangul Syllable */ + ["\uAF6A", "\uAF6A"], /* Hangul Syllable */ + ["\uAF6B", "\uAF6B"], /* Hangul Syllable */ + ["\uAF6C", "\uAF6C"], /* Hangul Syllable */ + ["\uAF6D", "\uAF6D"], /* Hangul Syllable */ + ["\uAF6E", "\uAF6E"], /* Hangul Syllable */ + ["\uAF6F", "\uAF6F"], /* Hangul Syllable */ + ["\uAF70", "\uAF70"], /* Hangul Syllable */ + ["\uAF71", "\uAF71"], /* Hangul Syllable */ + ["\uAF72", "\uAF72"], /* Hangul Syllable */ + ["\uAF73", "\uAF73"], /* Hangul Syllable */ + ["\uAF74", "\uAF74"], /* Hangul Syllable */ + ["\uAF75", "\uAF75"], /* Hangul Syllable */ + ["\uAF76", "\uAF76"], /* Hangul Syllable */ + ["\uAF77", "\uAF77"], /* Hangul Syllable */ + ["\uAF78", "\uAF78"], /* Hangul Syllable */ + ["\uAF79", "\uAF79"], /* Hangul Syllable */ + ["\uAF7A", "\uAF7A"], /* Hangul Syllable */ + ["\uAF7B", "\uAF7B"], /* Hangul Syllable */ + ["\uAF7C", "\uAF7C"], /* Hangul Syllable */ + ["\uAF7D", "\uAF7D"], /* Hangul Syllable */ + ["\uAF7E", "\uAF7E"], /* Hangul Syllable */ + ["\uAF7F", "\uAF7F"], /* Hangul Syllable */ + ["\uAF80", "\uAF80"], /* Hangul Syllable */ + ["\uAF81", "\uAF81"], /* Hangul Syllable */ + ["\uAF82", "\uAF82"], /* Hangul Syllable */ + ["\uAF83", "\uAF83"], /* Hangul Syllable */ + ["\uAF84", "\uAF84"], /* Hangul Syllable */ + ["\uAF85", "\uAF85"], /* Hangul Syllable */ + ["\uAF86", "\uAF86"], /* Hangul Syllable */ + ["\uAF87", "\uAF87"], /* Hangul Syllable */ + ["\uAF88", "\uAF88"], /* Hangul Syllable */ + ["\uAF89", "\uAF89"], /* Hangul Syllable */ + ["\uAF8A", "\uAF8A"], /* Hangul Syllable */ + ["\uAF8B", "\uAF8B"], /* Hangul Syllable */ + ["\uAF8C", "\uAF8C"], /* Hangul Syllable */ + ["\uAF8D", "\uAF8D"], /* Hangul Syllable */ + ["\uAF8E", "\uAF8E"], /* Hangul Syllable */ + ["\uAF8F", "\uAF8F"], /* Hangul Syllable */ + ["\uAF90", "\uAF90"], /* Hangul Syllable */ + ["\uAF91", "\uAF91"], /* Hangul Syllable */ + ["\uAF92", "\uAF92"], /* Hangul Syllable */ + ["\uAF93", "\uAF93"], /* Hangul Syllable */ + ["\uAF94", "\uAF94"], /* Hangul Syllable */ + ["\uAF95", "\uAF95"], /* Hangul Syllable */ + ["\uAF96", "\uAF96"], /* Hangul Syllable */ + ["\uAF97", "\uAF97"], /* Hangul Syllable */ + ["\uAF98", "\uAF98"], /* Hangul Syllable */ + ["\uAF99", "\uAF99"], /* Hangul Syllable */ + ["\uAF9A", "\uAF9A"], /* Hangul Syllable */ + ["\uAF9B", "\uAF9B"], /* Hangul Syllable */ + ["\uAF9C", "\uAF9C"], /* Hangul Syllable */ + ["\uAF9D", "\uAF9D"], /* Hangul Syllable */ + ["\uAF9E", "\uAF9E"], /* Hangul Syllable */ + ["\uAF9F", "\uAF9F"], /* Hangul Syllable */ + ["\uAFA0", "\uAFA0"], /* Hangul Syllable */ + ["\uAFA1", "\uAFA1"], /* Hangul Syllable */ + ["\uAFA2", "\uAFA2"], /* Hangul Syllable */ + ["\uAFA3", "\uAFA3"], /* Hangul Syllable */ + ["\uAFA4", "\uAFA4"], /* Hangul Syllable */ + ["\uAFA5", "\uAFA5"], /* Hangul Syllable */ + ["\uAFA6", "\uAFA6"], /* Hangul Syllable */ + ["\uAFA7", "\uAFA7"], /* Hangul Syllable */ + ["\uAFA8", "\uAFA8"], /* Hangul Syllable */ + ["\uAFA9", "\uAFA9"], /* Hangul Syllable */ + ["\uAFAA", "\uAFAA"], /* Hangul Syllable */ + ["\uAFAB", "\uAFAB"], /* Hangul Syllable */ + ["\uAFAC", "\uAFAC"], /* Hangul Syllable */ + ["\uAFAD", "\uAFAD"], /* Hangul Syllable */ + ["\uAFAE", "\uAFAE"], /* Hangul Syllable */ + ["\uAFAF", "\uAFAF"], /* Hangul Syllable */ + ["\uAFB0", "\uAFB0"], /* Hangul Syllable */ + ["\uAFB1", "\uAFB1"], /* Hangul Syllable */ + ["\uAFB2", "\uAFB2"], /* Hangul Syllable */ + ["\uAFB3", "\uAFB3"], /* Hangul Syllable */ + ["\uAFB4", "\uAFB4"], /* Hangul Syllable */ + ["\uAFB5", "\uAFB5"], /* Hangul Syllable */ + ["\uAFB6", "\uAFB6"], /* Hangul Syllable */ + ["\uAFB7", "\uAFB7"], /* Hangul Syllable */ + ["\uAFB8", "\uAFB8"], /* Hangul Syllable */ + ["\uAFB9", "\uAFB9"], /* Hangul Syllable */ + ["\uAFBA", "\uAFBA"], /* Hangul Syllable */ + ["\uAFBB", "\uAFBB"], /* Hangul Syllable */ + ["\uAFBC", "\uAFBC"], /* Hangul Syllable */ + ["\uAFBD", "\uAFBD"], /* Hangul Syllable */ + ["\uAFBE", "\uAFBE"], /* Hangul Syllable */ + ["\uAFBF", "\uAFBF"], /* Hangul Syllable */ + ["\uAFC0", "\uAFC0"], /* Hangul Syllable */ + ["\uAFC1", "\uAFC1"], /* Hangul Syllable */ + ["\uAFC2", "\uAFC2"], /* Hangul Syllable */ + ["\uAFC3", "\uAFC3"], /* Hangul Syllable */ + ["\uAFC4", "\uAFC4"], /* Hangul Syllable */ + ["\uAFC5", "\uAFC5"], /* Hangul Syllable */ + ["\uAFC6", "\uAFC6"], /* Hangul Syllable */ + ["\uAFC7", "\uAFC7"], /* Hangul Syllable */ + ["\uAFC8", "\uAFC8"], /* Hangul Syllable */ + ["\uAFC9", "\uAFC9"], /* Hangul Syllable */ + ["\uAFCA", "\uAFCA"], /* Hangul Syllable */ + ["\uAFCB", "\uAFCB"], /* Hangul Syllable */ + ["\uAFCC", "\uAFCC"], /* Hangul Syllable */ + ["\uAFCD", "\uAFCD"], /* Hangul Syllable */ + ["\uAFCE", "\uAFCE"], /* Hangul Syllable */ + ["\uAFCF", "\uAFCF"], /* Hangul Syllable */ + ["\uAFD0", "\uAFD0"], /* Hangul Syllable */ + ["\uAFD1", "\uAFD1"], /* Hangul Syllable */ + ["\uAFD2", "\uAFD2"], /* Hangul Syllable */ + ["\uAFD3", "\uAFD3"], /* Hangul Syllable */ + ["\uAFD4", "\uAFD4"], /* Hangul Syllable */ + ["\uAFD5", "\uAFD5"], /* Hangul Syllable */ + ["\uAFD6", "\uAFD6"], /* Hangul Syllable */ + ["\uAFD7", "\uAFD7"], /* Hangul Syllable */ + ["\uAFD8", "\uAFD8"], /* Hangul Syllable */ + ["\uAFD9", "\uAFD9"], /* Hangul Syllable */ + ["\uAFDA", "\uAFDA"], /* Hangul Syllable */ + ["\uAFDB", "\uAFDB"], /* Hangul Syllable */ + ["\uAFDC", "\uAFDC"], /* Hangul Syllable */ + ["\uAFDD", "\uAFDD"], /* Hangul Syllable */ + ["\uAFDE", "\uAFDE"], /* Hangul Syllable */ + ["\uAFDF", "\uAFDF"], /* Hangul Syllable */ + ["\uAFE0", "\uAFE0"], /* Hangul Syllable */ + ["\uAFE1", "\uAFE1"], /* Hangul Syllable */ + ["\uAFE2", "\uAFE2"], /* Hangul Syllable */ + ["\uAFE3", "\uAFE3"], /* Hangul Syllable */ + ["\uAFE4", "\uAFE4"], /* Hangul Syllable */ + ["\uAFE5", "\uAFE5"], /* Hangul Syllable */ + ["\uAFE6", "\uAFE6"], /* Hangul Syllable */ + ["\uAFE7", "\uAFE7"], /* Hangul Syllable */ + ["\uAFE8", "\uAFE8"], /* Hangul Syllable */ + ["\uAFE9", "\uAFE9"], /* Hangul Syllable */ + ["\uAFEA", "\uAFEA"], /* Hangul Syllable */ + ["\uAFEB", "\uAFEB"], /* Hangul Syllable */ + ["\uAFEC", "\uAFEC"], /* Hangul Syllable */ + ["\uAFED", "\uAFED"], /* Hangul Syllable */ + ["\uAFEE", "\uAFEE"], /* Hangul Syllable */ + ["\uAFEF", "\uAFEF"], /* Hangul Syllable */ + ["\uAFF0", "\uAFF0"], /* Hangul Syllable */ + ["\uAFF1", "\uAFF1"], /* Hangul Syllable */ + ["\uAFF2", "\uAFF2"], /* Hangul Syllable */ + ["\uAFF3", "\uAFF3"], /* Hangul Syllable */ + ["\uAFF4", "\uAFF4"], /* Hangul Syllable */ + ["\uAFF5", "\uAFF5"], /* Hangul Syllable */ + ["\uAFF6", "\uAFF6"], /* Hangul Syllable */ + ["\uAFF7", "\uAFF7"], /* Hangul Syllable */ + ["\uAFF8", "\uAFF8"], /* Hangul Syllable */ + ["\uAFF9", "\uAFF9"], /* Hangul Syllable */ + ["\uAFFA", "\uAFFA"], /* Hangul Syllable */ + ["\uAFFB", "\uAFFB"], /* Hangul Syllable */ + ["\uAFFC", "\uAFFC"], /* Hangul Syllable */ + ["\uAFFD", "\uAFFD"], /* Hangul Syllable */ + ["\uAFFE", "\uAFFE"], /* Hangul Syllable */ + ["\uAFFF", "\uAFFF"], /* Hangul Syllable */ + ["\uB000", "\uB000"], /* Hangul Syllable */ + ["\uB001", "\uB001"], /* Hangul Syllable */ + ["\uB002", "\uB002"], /* Hangul Syllable */ + ["\uB003", "\uB003"], /* Hangul Syllable */ + ["\uB004", "\uB004"], /* Hangul Syllable */ + ["\uB005", "\uB005"], /* Hangul Syllable */ + ["\uB006", "\uB006"], /* Hangul Syllable */ + ["\uB007", "\uB007"], /* Hangul Syllable */ + ["\uB008", "\uB008"], /* Hangul Syllable */ + ["\uB009", "\uB009"], /* Hangul Syllable */ + ["\uB00A", "\uB00A"], /* Hangul Syllable */ + ["\uB00B", "\uB00B"], /* Hangul Syllable */ + ["\uB00C", "\uB00C"], /* Hangul Syllable */ + ["\uB00D", "\uB00D"], /* Hangul Syllable */ + ["\uB00E", "\uB00E"], /* Hangul Syllable */ + ["\uB00F", "\uB00F"], /* Hangul Syllable */ + ["\uB010", "\uB010"], /* Hangul Syllable */ + ["\uB011", "\uB011"], /* Hangul Syllable */ + ["\uB012", "\uB012"], /* Hangul Syllable */ + ["\uB013", "\uB013"], /* Hangul Syllable */ + ["\uB014", "\uB014"], /* Hangul Syllable */ + ["\uB015", "\uB015"], /* Hangul Syllable */ + ["\uB016", "\uB016"], /* Hangul Syllable */ + ["\uB017", "\uB017"], /* Hangul Syllable */ + ["\uB018", "\uB018"], /* Hangul Syllable */ + ["\uB019", "\uB019"], /* Hangul Syllable */ + ["\uB01A", "\uB01A"], /* Hangul Syllable */ + ["\uB01B", "\uB01B"], /* Hangul Syllable */ + ["\uB01C", "\uB01C"], /* Hangul Syllable */ + ["\uB01D", "\uB01D"], /* Hangul Syllable */ + ["\uB01E", "\uB01E"], /* Hangul Syllable */ + ["\uB01F", "\uB01F"], /* Hangul Syllable */ + ["\uB020", "\uB020"], /* Hangul Syllable */ + ["\uB021", "\uB021"], /* Hangul Syllable */ + ["\uB022", "\uB022"], /* Hangul Syllable */ + ["\uB023", "\uB023"], /* Hangul Syllable */ + ["\uB024", "\uB024"], /* Hangul Syllable */ + ["\uB025", "\uB025"], /* Hangul Syllable */ + ["\uB026", "\uB026"], /* Hangul Syllable */ + ["\uB027", "\uB027"], /* Hangul Syllable */ + ["\uB028", "\uB028"], /* Hangul Syllable */ + ["\uB029", "\uB029"], /* Hangul Syllable */ + ["\uB02A", "\uB02A"], /* Hangul Syllable */ + ["\uB02B", "\uB02B"], /* Hangul Syllable */ + ["\uB02C", "\uB02C"], /* Hangul Syllable */ + ["\uB02D", "\uB02D"], /* Hangul Syllable */ + ["\uB02E", "\uB02E"], /* Hangul Syllable */ + ["\uB02F", "\uB02F"], /* Hangul Syllable */ + ["\uB030", "\uB030"], /* Hangul Syllable */ + ["\uB031", "\uB031"], /* Hangul Syllable */ + ["\uB032", "\uB032"], /* Hangul Syllable */ + ["\uB033", "\uB033"], /* Hangul Syllable */ + ["\uB034", "\uB034"], /* Hangul Syllable */ + ["\uB035", "\uB035"], /* Hangul Syllable */ + ["\uB036", "\uB036"], /* Hangul Syllable */ + ["\uB037", "\uB037"], /* Hangul Syllable */ + ["\uB038", "\uB038"], /* Hangul Syllable */ + ["\uB039", "\uB039"], /* Hangul Syllable */ + ["\uB03A", "\uB03A"], /* Hangul Syllable */ + ["\uB03B", "\uB03B"], /* Hangul Syllable */ + ["\uB03C", "\uB03C"], /* Hangul Syllable */ + ["\uB03D", "\uB03D"], /* Hangul Syllable */ + ["\uB03E", "\uB03E"], /* Hangul Syllable */ + ["\uB03F", "\uB03F"], /* Hangul Syllable */ + ["\uB040", "\uB040"], /* Hangul Syllable */ + ["\uB041", "\uB041"], /* Hangul Syllable */ + ["\uB042", "\uB042"], /* Hangul Syllable */ + ["\uB043", "\uB043"], /* Hangul Syllable */ + ["\uB044", "\uB044"], /* Hangul Syllable */ + ["\uB045", "\uB045"], /* Hangul Syllable */ + ["\uB046", "\uB046"], /* Hangul Syllable */ + ["\uB047", "\uB047"], /* Hangul Syllable */ + ["\uB048", "\uB048"], /* Hangul Syllable */ + ["\uB049", "\uB049"], /* Hangul Syllable */ + ["\uB04A", "\uB04A"], /* Hangul Syllable */ + ["\uB04B", "\uB04B"], /* Hangul Syllable */ + ["\uB04C", "\uB04C"], /* Hangul Syllable */ + ["\uB04D", "\uB04D"], /* Hangul Syllable */ + ["\uB04E", "\uB04E"], /* Hangul Syllable */ + ["\uB04F", "\uB04F"], /* Hangul Syllable */ + ["\uB050", "\uB050"], /* Hangul Syllable */ + ["\uB051", "\uB051"], /* Hangul Syllable */ + ["\uB052", "\uB052"], /* Hangul Syllable */ + ["\uB053", "\uB053"], /* Hangul Syllable */ + ["\uB054", "\uB054"], /* Hangul Syllable */ + ["\uB055", "\uB055"], /* Hangul Syllable */ + ["\uB056", "\uB056"], /* Hangul Syllable */ + ["\uB057", "\uB057"], /* Hangul Syllable */ + ["\uB058", "\uB058"], /* Hangul Syllable */ + ["\uB059", "\uB059"], /* Hangul Syllable */ + ["\uB05A", "\uB05A"], /* Hangul Syllable */ + ["\uB05B", "\uB05B"], /* Hangul Syllable */ + ["\uB05C", "\uB05C"], /* Hangul Syllable */ + ["\uB05D", "\uB05D"], /* Hangul Syllable */ + ["\uB05E", "\uB05E"], /* Hangul Syllable */ + ["\uB05F", "\uB05F"], /* Hangul Syllable */ + ["\uB060", "\uB060"], /* Hangul Syllable */ + ["\uB061", "\uB061"], /* Hangul Syllable */ + ["\uB062", "\uB062"], /* Hangul Syllable */ + ["\uB063", "\uB063"], /* Hangul Syllable */ + ["\uB064", "\uB064"], /* Hangul Syllable */ + ["\uB065", "\uB065"], /* Hangul Syllable */ + ["\uB066", "\uB066"], /* Hangul Syllable */ + ["\uB067", "\uB067"], /* Hangul Syllable */ + ["\uB068", "\uB068"], /* Hangul Syllable */ + ["\uB069", "\uB069"], /* Hangul Syllable */ + ["\uB06A", "\uB06A"], /* Hangul Syllable */ + ["\uB06B", "\uB06B"], /* Hangul Syllable */ + ["\uB06C", "\uB06C"], /* Hangul Syllable */ + ["\uB06D", "\uB06D"], /* Hangul Syllable */ + ["\uB06E", "\uB06E"], /* Hangul Syllable */ + ["\uB06F", "\uB06F"], /* Hangul Syllable */ + ["\uB070", "\uB070"], /* Hangul Syllable */ + ["\uB071", "\uB071"], /* Hangul Syllable */ + ["\uB072", "\uB072"], /* Hangul Syllable */ + ["\uB073", "\uB073"], /* Hangul Syllable */ + ["\uB074", "\uB074"], /* Hangul Syllable */ + ["\uB075", "\uB075"], /* Hangul Syllable */ + ["\uB076", "\uB076"], /* Hangul Syllable */ + ["\uB077", "\uB077"], /* Hangul Syllable */ + ["\uB078", "\uB078"], /* Hangul Syllable */ + ["\uB079", "\uB079"], /* Hangul Syllable */ + ["\uB07A", "\uB07A"], /* Hangul Syllable */ + ["\uB07B", "\uB07B"], /* Hangul Syllable */ + ["\uB07C", "\uB07C"], /* Hangul Syllable */ + ["\uB07D", "\uB07D"], /* Hangul Syllable */ + ["\uB07E", "\uB07E"], /* Hangul Syllable */ + ["\uB07F", "\uB07F"], /* Hangul Syllable */ + ["\uB080", "\uB080"], /* Hangul Syllable */ + ["\uB081", "\uB081"], /* Hangul Syllable */ + ["\uB082", "\uB082"], /* Hangul Syllable */ + ["\uB083", "\uB083"], /* Hangul Syllable */ + ["\uB084", "\uB084"], /* Hangul Syllable */ + ["\uB085", "\uB085"], /* Hangul Syllable */ + ["\uB086", "\uB086"], /* Hangul Syllable */ + ["\uB087", "\uB087"], /* Hangul Syllable */ + ["\uB088", "\uB088"], /* Hangul Syllable */ + ["\uB089", "\uB089"], /* Hangul Syllable */ + ["\uB08A", "\uB08A"], /* Hangul Syllable */ + ["\uB08B", "\uB08B"], /* Hangul Syllable */ + ["\uB08C", "\uB08C"], /* Hangul Syllable */ + ["\uB08D", "\uB08D"], /* Hangul Syllable */ + ["\uB08E", "\uB08E"], /* Hangul Syllable */ + ["\uB08F", "\uB08F"], /* Hangul Syllable */ + ["\uB090", "\uB090"], /* Hangul Syllable */ + ["\uB091", "\uB091"], /* Hangul Syllable */ + ["\uB092", "\uB092"], /* Hangul Syllable */ + ["\uB093", "\uB093"], /* Hangul Syllable */ + ["\uB094", "\uB094"], /* Hangul Syllable */ + ["\uB095", "\uB095"], /* Hangul Syllable */ + ["\uB096", "\uB096"], /* Hangul Syllable */ + ["\uB097", "\uB097"], /* Hangul Syllable */ + ["\uB098", "\uB098"], /* Hangul Syllable */ + ["\uB099", "\uB099"], /* Hangul Syllable */ + ["\uB09A", "\uB09A"], /* Hangul Syllable */ + ["\uB09B", "\uB09B"], /* Hangul Syllable */ + ["\uB09C", "\uB09C"], /* Hangul Syllable */ + ["\uB09D", "\uB09D"], /* Hangul Syllable */ + ["\uB09E", "\uB09E"], /* Hangul Syllable */ + ["\uB09F", "\uB09F"], /* Hangul Syllable */ + ["\uB0A0", "\uB0A0"], /* Hangul Syllable */ + ["\uB0A1", "\uB0A1"], /* Hangul Syllable */ + ["\uB0A2", "\uB0A2"], /* Hangul Syllable */ + ["\uB0A3", "\uB0A3"], /* Hangul Syllable */ + ["\uB0A4", "\uB0A4"], /* Hangul Syllable */ + ["\uB0A5", "\uB0A5"], /* Hangul Syllable */ + ["\uB0A6", "\uB0A6"], /* Hangul Syllable */ + ["\uB0A7", "\uB0A7"], /* Hangul Syllable */ + ["\uB0A8", "\uB0A8"], /* Hangul Syllable */ + ["\uB0A9", "\uB0A9"], /* Hangul Syllable */ + ["\uB0AA", "\uB0AA"], /* Hangul Syllable */ + ["\uB0AB", "\uB0AB"], /* Hangul Syllable */ + ["\uB0AC", "\uB0AC"], /* Hangul Syllable */ + ["\uB0AD", "\uB0AD"], /* Hangul Syllable */ + ["\uB0AE", "\uB0AE"], /* Hangul Syllable */ + ["\uB0AF", "\uB0AF"], /* Hangul Syllable */ + ["\uB0B0", "\uB0B0"], /* Hangul Syllable */ + ["\uB0B1", "\uB0B1"], /* Hangul Syllable */ + ["\uB0B2", "\uB0B2"], /* Hangul Syllable */ + ["\uB0B3", "\uB0B3"], /* Hangul Syllable */ + ["\uB0B4", "\uB0B4"], /* Hangul Syllable */ + ["\uB0B5", "\uB0B5"], /* Hangul Syllable */ + ["\uB0B6", "\uB0B6"], /* Hangul Syllable */ + ["\uB0B7", "\uB0B7"], /* Hangul Syllable */ + ["\uB0B8", "\uB0B8"], /* Hangul Syllable */ + ["\uB0B9", "\uB0B9"], /* Hangul Syllable */ + ["\uB0BA", "\uB0BA"], /* Hangul Syllable */ + ["\uB0BB", "\uB0BB"], /* Hangul Syllable */ + ["\uB0BC", "\uB0BC"], /* Hangul Syllable */ + ["\uB0BD", "\uB0BD"], /* Hangul Syllable */ + ["\uB0BE", "\uB0BE"], /* Hangul Syllable */ + ["\uB0BF", "\uB0BF"], /* Hangul Syllable */ + ["\uB0C0", "\uB0C0"], /* Hangul Syllable */ + ["\uB0C1", "\uB0C1"], /* Hangul Syllable */ + ["\uB0C2", "\uB0C2"], /* Hangul Syllable */ + ["\uB0C3", "\uB0C3"], /* Hangul Syllable */ + ["\uB0C4", "\uB0C4"], /* Hangul Syllable */ + ["\uB0C5", "\uB0C5"], /* Hangul Syllable */ + ["\uB0C6", "\uB0C6"], /* Hangul Syllable */ + ["\uB0C7", "\uB0C7"], /* Hangul Syllable */ + ["\uB0C8", "\uB0C8"], /* Hangul Syllable */ + ["\uB0C9", "\uB0C9"], /* Hangul Syllable */ + ["\uB0CA", "\uB0CA"], /* Hangul Syllable */ + ["\uB0CB", "\uB0CB"], /* Hangul Syllable */ + ["\uB0CC", "\uB0CC"], /* Hangul Syllable */ + ["\uB0CD", "\uB0CD"], /* Hangul Syllable */ + ["\uB0CE", "\uB0CE"], /* Hangul Syllable */ + ["\uB0CF", "\uB0CF"], /* Hangul Syllable */ + ["\uB0D0", "\uB0D0"], /* Hangul Syllable */ + ["\uB0D1", "\uB0D1"], /* Hangul Syllable */ + ["\uB0D2", "\uB0D2"], /* Hangul Syllable */ + ["\uB0D3", "\uB0D3"], /* Hangul Syllable */ + ["\uB0D4", "\uB0D4"], /* Hangul Syllable */ + ["\uB0D5", "\uB0D5"], /* Hangul Syllable */ + ["\uB0D6", "\uB0D6"], /* Hangul Syllable */ + ["\uB0D7", "\uB0D7"], /* Hangul Syllable */ + ["\uB0D8", "\uB0D8"], /* Hangul Syllable */ + ["\uB0D9", "\uB0D9"], /* Hangul Syllable */ + ["\uB0DA", "\uB0DA"], /* Hangul Syllable */ + ["\uB0DB", "\uB0DB"], /* Hangul Syllable */ + ["\uB0DC", "\uB0DC"], /* Hangul Syllable */ + ["\uB0DD", "\uB0DD"], /* Hangul Syllable */ + ["\uB0DE", "\uB0DE"], /* Hangul Syllable */ + ["\uB0DF", "\uB0DF"], /* Hangul Syllable */ + ["\uB0E0", "\uB0E0"], /* Hangul Syllable */ + ["\uB0E1", "\uB0E1"], /* Hangul Syllable */ + ["\uB0E2", "\uB0E2"], /* Hangul Syllable */ + ["\uB0E3", "\uB0E3"], /* Hangul Syllable */ + ["\uB0E4", "\uB0E4"], /* Hangul Syllable */ + ["\uB0E5", "\uB0E5"], /* Hangul Syllable */ + ["\uB0E6", "\uB0E6"], /* Hangul Syllable */ + ["\uB0E7", "\uB0E7"], /* Hangul Syllable */ + ["\uB0E8", "\uB0E8"], /* Hangul Syllable */ + ["\uB0E9", "\uB0E9"], /* Hangul Syllable */ + ["\uB0EA", "\uB0EA"], /* Hangul Syllable */ + ["\uB0EB", "\uB0EB"], /* Hangul Syllable */ + ["\uB0EC", "\uB0EC"], /* Hangul Syllable */ + ["\uB0ED", "\uB0ED"], /* Hangul Syllable */ + ["\uB0EE", "\uB0EE"], /* Hangul Syllable */ + ["\uB0EF", "\uB0EF"], /* Hangul Syllable */ + ["\uB0F0", "\uB0F0"], /* Hangul Syllable */ + ["\uB0F1", "\uB0F1"], /* Hangul Syllable */ + ["\uB0F2", "\uB0F2"], /* Hangul Syllable */ + ["\uB0F3", "\uB0F3"], /* Hangul Syllable */ + ["\uB0F4", "\uB0F4"], /* Hangul Syllable */ + ["\uB0F5", "\uB0F5"], /* Hangul Syllable */ + ["\uB0F6", "\uB0F6"], /* Hangul Syllable */ + ["\uB0F7", "\uB0F7"], /* Hangul Syllable */ + ["\uB0F8", "\uB0F8"], /* Hangul Syllable */ + ["\uB0F9", "\uB0F9"], /* Hangul Syllable */ + ["\uB0FA", "\uB0FA"], /* Hangul Syllable */ + ["\uB0FB", "\uB0FB"], /* Hangul Syllable */ + ["\uB0FC", "\uB0FC"], /* Hangul Syllable */ + ["\uB0FD", "\uB0FD"], /* Hangul Syllable */ + ["\uB0FE", "\uB0FE"], /* Hangul Syllable */ + ["\uB0FF", "\uB0FF"], /* Hangul Syllable */ + ["\uB100", "\uB100"], /* Hangul Syllable */ + ["\uB101", "\uB101"], /* Hangul Syllable */ + ["\uB102", "\uB102"], /* Hangul Syllable */ + ["\uB103", "\uB103"], /* Hangul Syllable */ + ["\uB104", "\uB104"], /* Hangul Syllable */ + ["\uB105", "\uB105"], /* Hangul Syllable */ + ["\uB106", "\uB106"], /* Hangul Syllable */ + ["\uB107", "\uB107"], /* Hangul Syllable */ + ["\uB108", "\uB108"], /* Hangul Syllable */ + ["\uB109", "\uB109"], /* Hangul Syllable */ + ["\uB10A", "\uB10A"], /* Hangul Syllable */ + ["\uB10B", "\uB10B"], /* Hangul Syllable */ + ["\uB10C", "\uB10C"], /* Hangul Syllable */ + ["\uB10D", "\uB10D"], /* Hangul Syllable */ + ["\uB10E", "\uB10E"], /* Hangul Syllable */ + ["\uB10F", "\uB10F"], /* Hangul Syllable */ + ["\uB110", "\uB110"], /* Hangul Syllable */ + ["\uB111", "\uB111"], /* Hangul Syllable */ + ["\uB112", "\uB112"], /* Hangul Syllable */ + ["\uB113", "\uB113"], /* Hangul Syllable */ + ["\uB114", "\uB114"], /* Hangul Syllable */ + ["\uB115", "\uB115"], /* Hangul Syllable */ + ["\uB116", "\uB116"], /* Hangul Syllable */ + ["\uB117", "\uB117"], /* Hangul Syllable */ + ["\uB118", "\uB118"], /* Hangul Syllable */ + ["\uB119", "\uB119"], /* Hangul Syllable */ + ["\uB11A", "\uB11A"], /* Hangul Syllable */ + ["\uB11B", "\uB11B"], /* Hangul Syllable */ + ["\uB11C", "\uB11C"], /* Hangul Syllable */ + ["\uB11D", "\uB11D"], /* Hangul Syllable */ + ["\uB11E", "\uB11E"], /* Hangul Syllable */ + ["\uB11F", "\uB11F"], /* Hangul Syllable */ + ["\uB120", "\uB120"], /* Hangul Syllable */ + ["\uB121", "\uB121"], /* Hangul Syllable */ + ["\uB122", "\uB122"], /* Hangul Syllable */ + ["\uB123", "\uB123"], /* Hangul Syllable */ + ["\uB124", "\uB124"], /* Hangul Syllable */ + ["\uB125", "\uB125"], /* Hangul Syllable */ + ["\uB126", "\uB126"], /* Hangul Syllable */ + ["\uB127", "\uB127"], /* Hangul Syllable */ + ["\uB128", "\uB128"], /* Hangul Syllable */ + ["\uB129", "\uB129"], /* Hangul Syllable */ + ["\uB12A", "\uB12A"], /* Hangul Syllable */ + ["\uB12B", "\uB12B"], /* Hangul Syllable */ + ["\uB12C", "\uB12C"], /* Hangul Syllable */ + ["\uB12D", "\uB12D"], /* Hangul Syllable */ + ["\uB12E", "\uB12E"], /* Hangul Syllable */ + ["\uB12F", "\uB12F"], /* Hangul Syllable */ + ["\uB130", "\uB130"], /* Hangul Syllable */ + ["\uB131", "\uB131"], /* Hangul Syllable */ + ["\uB132", "\uB132"], /* Hangul Syllable */ + ["\uB133", "\uB133"], /* Hangul Syllable */ + ["\uB134", "\uB134"], /* Hangul Syllable */ + ["\uB135", "\uB135"], /* Hangul Syllable */ + ["\uB136", "\uB136"], /* Hangul Syllable */ + ["\uB137", "\uB137"], /* Hangul Syllable */ + ["\uB138", "\uB138"], /* Hangul Syllable */ + ["\uB139", "\uB139"], /* Hangul Syllable */ + ["\uB13A", "\uB13A"], /* Hangul Syllable */ + ["\uB13B", "\uB13B"], /* Hangul Syllable */ + ["\uB13C", "\uB13C"], /* Hangul Syllable */ + ["\uB13D", "\uB13D"], /* Hangul Syllable */ + ["\uB13E", "\uB13E"], /* Hangul Syllable */ + ["\uB13F", "\uB13F"], /* Hangul Syllable */ + ["\uB140", "\uB140"], /* Hangul Syllable */ + ["\uB141", "\uB141"], /* Hangul Syllable */ + ["\uB142", "\uB142"], /* Hangul Syllable */ + ["\uB143", "\uB143"], /* Hangul Syllable */ + ["\uB144", "\uB144"], /* Hangul Syllable */ + ["\uB145", "\uB145"], /* Hangul Syllable */ + ["\uB146", "\uB146"], /* Hangul Syllable */ + ["\uB147", "\uB147"], /* Hangul Syllable */ + ["\uB148", "\uB148"], /* Hangul Syllable */ + ["\uB149", "\uB149"], /* Hangul Syllable */ + ["\uB14A", "\uB14A"], /* Hangul Syllable */ + ["\uB14B", "\uB14B"], /* Hangul Syllable */ + ["\uB14C", "\uB14C"], /* Hangul Syllable */ + ["\uB14D", "\uB14D"], /* Hangul Syllable */ + ["\uB14E", "\uB14E"], /* Hangul Syllable */ + ["\uB14F", "\uB14F"], /* Hangul Syllable */ + ["\uB150", "\uB150"], /* Hangul Syllable */ + ["\uB151", "\uB151"], /* Hangul Syllable */ + ["\uB152", "\uB152"], /* Hangul Syllable */ + ["\uB153", "\uB153"], /* Hangul Syllable */ + ["\uB154", "\uB154"], /* Hangul Syllable */ + ["\uB155", "\uB155"], /* Hangul Syllable */ + ["\uB156", "\uB156"], /* Hangul Syllable */ + ["\uB157", "\uB157"], /* Hangul Syllable */ + ["\uB158", "\uB158"], /* Hangul Syllable */ + ["\uB159", "\uB159"], /* Hangul Syllable */ + ["\uB15A", "\uB15A"], /* Hangul Syllable */ + ["\uB15B", "\uB15B"], /* Hangul Syllable */ + ["\uB15C", "\uB15C"], /* Hangul Syllable */ + ["\uB15D", "\uB15D"], /* Hangul Syllable */ + ["\uB15E", "\uB15E"], /* Hangul Syllable */ + ["\uB15F", "\uB15F"], /* Hangul Syllable */ + ["\uB160", "\uB160"], /* Hangul Syllable */ + ["\uB161", "\uB161"], /* Hangul Syllable */ + ["\uB162", "\uB162"], /* Hangul Syllable */ + ["\uB163", "\uB163"], /* Hangul Syllable */ + ["\uB164", "\uB164"], /* Hangul Syllable */ + ["\uB165", "\uB165"], /* Hangul Syllable */ + ["\uB166", "\uB166"], /* Hangul Syllable */ + ["\uB167", "\uB167"], /* Hangul Syllable */ + ["\uB168", "\uB168"], /* Hangul Syllable */ + ["\uB169", "\uB169"], /* Hangul Syllable */ + ["\uB16A", "\uB16A"], /* Hangul Syllable */ + ["\uB16B", "\uB16B"], /* Hangul Syllable */ + ["\uB16C", "\uB16C"], /* Hangul Syllable */ + ["\uB16D", "\uB16D"], /* Hangul Syllable */ + ["\uB16E", "\uB16E"], /* Hangul Syllable */ + ["\uB16F", "\uB16F"], /* Hangul Syllable */ + ["\uB170", "\uB170"], /* Hangul Syllable */ + ["\uB171", "\uB171"], /* Hangul Syllable */ + ["\uB172", "\uB172"], /* Hangul Syllable */ + ["\uB173", "\uB173"], /* Hangul Syllable */ + ["\uB174", "\uB174"], /* Hangul Syllable */ + ["\uB175", "\uB175"], /* Hangul Syllable */ + ["\uB176", "\uB176"], /* Hangul Syllable */ + ["\uB177", "\uB177"], /* Hangul Syllable */ + ["\uB178", "\uB178"], /* Hangul Syllable */ + ["\uB179", "\uB179"], /* Hangul Syllable */ + ["\uB17A", "\uB17A"], /* Hangul Syllable */ + ["\uB17B", "\uB17B"], /* Hangul Syllable */ + ["\uB17C", "\uB17C"], /* Hangul Syllable */ + ["\uB17D", "\uB17D"], /* Hangul Syllable */ + ["\uB17E", "\uB17E"], /* Hangul Syllable */ + ["\uB17F", "\uB17F"], /* Hangul Syllable */ + ["\uB180", "\uB180"], /* Hangul Syllable */ + ["\uB181", "\uB181"], /* Hangul Syllable */ + ["\uB182", "\uB182"], /* Hangul Syllable */ + ["\uB183", "\uB183"], /* Hangul Syllable */ + ["\uB184", "\uB184"], /* Hangul Syllable */ + ["\uB185", "\uB185"], /* Hangul Syllable */ + ["\uB186", "\uB186"], /* Hangul Syllable */ + ["\uB187", "\uB187"], /* Hangul Syllable */ + ["\uB188", "\uB188"], /* Hangul Syllable */ + ["\uB189", "\uB189"], /* Hangul Syllable */ + ["\uB18A", "\uB18A"], /* Hangul Syllable */ + ["\uB18B", "\uB18B"], /* Hangul Syllable */ + ["\uB18C", "\uB18C"], /* Hangul Syllable */ + ["\uB18D", "\uB18D"], /* Hangul Syllable */ + ["\uB18E", "\uB18E"], /* Hangul Syllable */ + ["\uB18F", "\uB18F"], /* Hangul Syllable */ + ["\uB190", "\uB190"], /* Hangul Syllable */ + ["\uB191", "\uB191"], /* Hangul Syllable */ + ["\uB192", "\uB192"], /* Hangul Syllable */ + ["\uB193", "\uB193"], /* Hangul Syllable */ + ["\uB194", "\uB194"], /* Hangul Syllable */ + ["\uB195", "\uB195"], /* Hangul Syllable */ + ["\uB196", "\uB196"], /* Hangul Syllable */ + ["\uB197", "\uB197"], /* Hangul Syllable */ + ["\uB198", "\uB198"], /* Hangul Syllable */ + ["\uB199", "\uB199"], /* Hangul Syllable */ + ["\uB19A", "\uB19A"], /* Hangul Syllable */ + ["\uB19B", "\uB19B"], /* Hangul Syllable */ + ["\uB19C", "\uB19C"], /* Hangul Syllable */ + ["\uB19D", "\uB19D"], /* Hangul Syllable */ + ["\uB19E", "\uB19E"], /* Hangul Syllable */ + ["\uB19F", "\uB19F"], /* Hangul Syllable */ + ["\uB1A0", "\uB1A0"], /* Hangul Syllable */ + ["\uB1A1", "\uB1A1"], /* Hangul Syllable */ + ["\uB1A2", "\uB1A2"], /* Hangul Syllable */ + ["\uB1A3", "\uB1A3"], /* Hangul Syllable */ + ["\uB1A4", "\uB1A4"], /* Hangul Syllable */ + ["\uB1A5", "\uB1A5"], /* Hangul Syllable */ + ["\uB1A6", "\uB1A6"], /* Hangul Syllable */ + ["\uB1A7", "\uB1A7"], /* Hangul Syllable */ + ["\uB1A8", "\uB1A8"], /* Hangul Syllable */ + ["\uB1A9", "\uB1A9"], /* Hangul Syllable */ + ["\uB1AA", "\uB1AA"], /* Hangul Syllable */ + ["\uB1AB", "\uB1AB"], /* Hangul Syllable */ + ["\uB1AC", "\uB1AC"], /* Hangul Syllable */ + ["\uB1AD", "\uB1AD"], /* Hangul Syllable */ + ["\uB1AE", "\uB1AE"], /* Hangul Syllable */ + ["\uB1AF", "\uB1AF"], /* Hangul Syllable */ + ["\uB1B0", "\uB1B0"], /* Hangul Syllable */ + ["\uB1B1", "\uB1B1"], /* Hangul Syllable */ + ["\uB1B2", "\uB1B2"], /* Hangul Syllable */ + ["\uB1B3", "\uB1B3"], /* Hangul Syllable */ + ["\uB1B4", "\uB1B4"], /* Hangul Syllable */ + ["\uB1B5", "\uB1B5"], /* Hangul Syllable */ + ["\uB1B6", "\uB1B6"], /* Hangul Syllable */ + ["\uB1B7", "\uB1B7"], /* Hangul Syllable */ + ["\uB1B8", "\uB1B8"], /* Hangul Syllable */ + ["\uB1B9", "\uB1B9"], /* Hangul Syllable */ + ["\uB1BA", "\uB1BA"], /* Hangul Syllable */ + ["\uB1BB", "\uB1BB"], /* Hangul Syllable */ + ["\uB1BC", "\uB1BC"], /* Hangul Syllable */ + ["\uB1BD", "\uB1BD"], /* Hangul Syllable */ + ["\uB1BE", "\uB1BE"], /* Hangul Syllable */ + ["\uB1BF", "\uB1BF"], /* Hangul Syllable */ + ["\uB1C0", "\uB1C0"], /* Hangul Syllable */ + ["\uB1C1", "\uB1C1"], /* Hangul Syllable */ + ["\uB1C2", "\uB1C2"], /* Hangul Syllable */ + ["\uB1C3", "\uB1C3"], /* Hangul Syllable */ + ["\uB1C4", "\uB1C4"], /* Hangul Syllable */ + ["\uB1C5", "\uB1C5"], /* Hangul Syllable */ + ["\uB1C6", "\uB1C6"], /* Hangul Syllable */ + ["\uB1C7", "\uB1C7"], /* Hangul Syllable */ + ["\uB1C8", "\uB1C8"], /* Hangul Syllable */ + ["\uB1C9", "\uB1C9"], /* Hangul Syllable */ + ["\uB1CA", "\uB1CA"], /* Hangul Syllable */ + ["\uB1CB", "\uB1CB"], /* Hangul Syllable */ + ["\uB1CC", "\uB1CC"], /* Hangul Syllable */ + ["\uB1CD", "\uB1CD"], /* Hangul Syllable */ + ["\uB1CE", "\uB1CE"], /* Hangul Syllable */ + ["\uB1CF", "\uB1CF"], /* Hangul Syllable */ + ["\uB1D0", "\uB1D0"], /* Hangul Syllable */ + ["\uB1D1", "\uB1D1"], /* Hangul Syllable */ + ["\uB1D2", "\uB1D2"], /* Hangul Syllable */ + ["\uB1D3", "\uB1D3"], /* Hangul Syllable */ + ["\uB1D4", "\uB1D4"], /* Hangul Syllable */ + ["\uB1D5", "\uB1D5"], /* Hangul Syllable */ + ["\uB1D6", "\uB1D6"], /* Hangul Syllable */ + ["\uB1D7", "\uB1D7"], /* Hangul Syllable */ + ["\uB1D8", "\uB1D8"], /* Hangul Syllable */ + ["\uB1D9", "\uB1D9"], /* Hangul Syllable */ + ["\uB1DA", "\uB1DA"], /* Hangul Syllable */ + ["\uB1DB", "\uB1DB"], /* Hangul Syllable */ + ["\uB1DC", "\uB1DC"], /* Hangul Syllable */ + ["\uB1DD", "\uB1DD"], /* Hangul Syllable */ + ["\uB1DE", "\uB1DE"], /* Hangul Syllable */ + ["\uB1DF", "\uB1DF"], /* Hangul Syllable */ + ["\uB1E0", "\uB1E0"], /* Hangul Syllable */ + ["\uB1E1", "\uB1E1"], /* Hangul Syllable */ + ["\uB1E2", "\uB1E2"], /* Hangul Syllable */ + ["\uB1E3", "\uB1E3"], /* Hangul Syllable */ + ["\uB1E4", "\uB1E4"], /* Hangul Syllable */ + ["\uB1E5", "\uB1E5"], /* Hangul Syllable */ + ["\uB1E6", "\uB1E6"], /* Hangul Syllable */ + ["\uB1E7", "\uB1E7"], /* Hangul Syllable */ + ["\uB1E8", "\uB1E8"], /* Hangul Syllable */ + ["\uB1E9", "\uB1E9"], /* Hangul Syllable */ + ["\uB1EA", "\uB1EA"], /* Hangul Syllable */ + ["\uB1EB", "\uB1EB"], /* Hangul Syllable */ + ["\uB1EC", "\uB1EC"], /* Hangul Syllable */ + ["\uB1ED", "\uB1ED"], /* Hangul Syllable */ + ["\uB1EE", "\uB1EE"], /* Hangul Syllable */ + ["\uB1EF", "\uB1EF"], /* Hangul Syllable */ + ["\uB1F0", "\uB1F0"], /* Hangul Syllable */ + ["\uB1F1", "\uB1F1"], /* Hangul Syllable */ + ["\uB1F2", "\uB1F2"], /* Hangul Syllable */ + ["\uB1F3", "\uB1F3"], /* Hangul Syllable */ + ["\uB1F4", "\uB1F4"], /* Hangul Syllable */ + ["\uB1F5", "\uB1F5"], /* Hangul Syllable */ + ["\uB1F6", "\uB1F6"], /* Hangul Syllable */ + ["\uB1F7", "\uB1F7"], /* Hangul Syllable */ + ["\uB1F8", "\uB1F8"], /* Hangul Syllable */ + ["\uB1F9", "\uB1F9"], /* Hangul Syllable */ + ["\uB1FA", "\uB1FA"], /* Hangul Syllable */ + ["\uB1FB", "\uB1FB"], /* Hangul Syllable */ + ["\uB1FC", "\uB1FC"], /* Hangul Syllable */ + ["\uB1FD", "\uB1FD"], /* Hangul Syllable */ + ["\uB1FE", "\uB1FE"], /* Hangul Syllable */ + ["\uB1FF", "\uB1FF"], /* Hangul Syllable */ + ["\uB200", "\uB200"], /* Hangul Syllable */ + ["\uB201", "\uB201"], /* Hangul Syllable */ + ["\uB202", "\uB202"], /* Hangul Syllable */ + ["\uB203", "\uB203"], /* Hangul Syllable */ + ["\uB204", "\uB204"], /* Hangul Syllable */ + ["\uB205", "\uB205"], /* Hangul Syllable */ + ["\uB206", "\uB206"], /* Hangul Syllable */ + ["\uB207", "\uB207"], /* Hangul Syllable */ + ["\uB208", "\uB208"], /* Hangul Syllable */ + ["\uB209", "\uB209"], /* Hangul Syllable */ + ["\uB20A", "\uB20A"], /* Hangul Syllable */ + ["\uB20B", "\uB20B"], /* Hangul Syllable */ + ["\uB20C", "\uB20C"], /* Hangul Syllable */ + ["\uB20D", "\uB20D"], /* Hangul Syllable */ + ["\uB20E", "\uB20E"], /* Hangul Syllable */ + ["\uB20F", "\uB20F"], /* Hangul Syllable */ + ["\uB210", "\uB210"], /* Hangul Syllable */ + ["\uB211", "\uB211"], /* Hangul Syllable */ + ["\uB212", "\uB212"], /* Hangul Syllable */ + ["\uB213", "\uB213"], /* Hangul Syllable */ + ["\uB214", "\uB214"], /* Hangul Syllable */ + ["\uB215", "\uB215"], /* Hangul Syllable */ + ["\uB216", "\uB216"], /* Hangul Syllable */ + ["\uB217", "\uB217"], /* Hangul Syllable */ + ["\uB218", "\uB218"], /* Hangul Syllable */ + ["\uB219", "\uB219"], /* Hangul Syllable */ + ["\uB21A", "\uB21A"], /* Hangul Syllable */ + ["\uB21B", "\uB21B"], /* Hangul Syllable */ + ["\uB21C", "\uB21C"], /* Hangul Syllable */ + ["\uB21D", "\uB21D"], /* Hangul Syllable */ + ["\uB21E", "\uB21E"], /* Hangul Syllable */ + ["\uB21F", "\uB21F"], /* Hangul Syllable */ + ["\uB220", "\uB220"], /* Hangul Syllable */ + ["\uB221", "\uB221"], /* Hangul Syllable */ + ["\uB222", "\uB222"], /* Hangul Syllable */ + ["\uB223", "\uB223"], /* Hangul Syllable */ + ["\uB224", "\uB224"], /* Hangul Syllable */ + ["\uB225", "\uB225"], /* Hangul Syllable */ + ["\uB226", "\uB226"], /* Hangul Syllable */ + ["\uB227", "\uB227"], /* Hangul Syllable */ + ["\uB228", "\uB228"], /* Hangul Syllable */ + ["\uB229", "\uB229"], /* Hangul Syllable */ + ["\uB22A", "\uB22A"], /* Hangul Syllable */ + ["\uB22B", "\uB22B"], /* Hangul Syllable */ + ["\uB22C", "\uB22C"], /* Hangul Syllable */ + ["\uB22D", "\uB22D"], /* Hangul Syllable */ + ["\uB22E", "\uB22E"], /* Hangul Syllable */ + ["\uB22F", "\uB22F"], /* Hangul Syllable */ + ["\uB230", "\uB230"], /* Hangul Syllable */ + ["\uB231", "\uB231"], /* Hangul Syllable */ + ["\uB232", "\uB232"], /* Hangul Syllable */ + ["\uB233", "\uB233"], /* Hangul Syllable */ + ["\uB234", "\uB234"], /* Hangul Syllable */ + ["\uB235", "\uB235"], /* Hangul Syllable */ + ["\uB236", "\uB236"], /* Hangul Syllable */ + ["\uB237", "\uB237"], /* Hangul Syllable */ + ["\uB238", "\uB238"], /* Hangul Syllable */ + ["\uB239", "\uB239"], /* Hangul Syllable */ + ["\uB23A", "\uB23A"], /* Hangul Syllable */ + ["\uB23B", "\uB23B"], /* Hangul Syllable */ + ["\uB23C", "\uB23C"], /* Hangul Syllable */ + ["\uB23D", "\uB23D"], /* Hangul Syllable */ + ["\uB23E", "\uB23E"], /* Hangul Syllable */ + ["\uB23F", "\uB23F"], /* Hangul Syllable */ + ["\uB240", "\uB240"], /* Hangul Syllable */ + ["\uB241", "\uB241"], /* Hangul Syllable */ + ["\uB242", "\uB242"], /* Hangul Syllable */ + ["\uB243", "\uB243"], /* Hangul Syllable */ + ["\uB244", "\uB244"], /* Hangul Syllable */ + ["\uB245", "\uB245"], /* Hangul Syllable */ + ["\uB246", "\uB246"], /* Hangul Syllable */ + ["\uB247", "\uB247"], /* Hangul Syllable */ + ["\uB248", "\uB248"], /* Hangul Syllable */ + ["\uB249", "\uB249"], /* Hangul Syllable */ + ["\uB24A", "\uB24A"], /* Hangul Syllable */ + ["\uB24B", "\uB24B"], /* Hangul Syllable */ + ["\uB24C", "\uB24C"], /* Hangul Syllable */ + ["\uB24D", "\uB24D"], /* Hangul Syllable */ + ["\uB24E", "\uB24E"], /* Hangul Syllable */ + ["\uB24F", "\uB24F"], /* Hangul Syllable */ + ["\uB250", "\uB250"], /* Hangul Syllable */ + ["\uB251", "\uB251"], /* Hangul Syllable */ + ["\uB252", "\uB252"], /* Hangul Syllable */ + ["\uB253", "\uB253"], /* Hangul Syllable */ + ["\uB254", "\uB254"], /* Hangul Syllable */ + ["\uB255", "\uB255"], /* Hangul Syllable */ + ["\uB256", "\uB256"], /* Hangul Syllable */ + ["\uB257", "\uB257"], /* Hangul Syllable */ + ["\uB258", "\uB258"], /* Hangul Syllable */ + ["\uB259", "\uB259"], /* Hangul Syllable */ + ["\uB25A", "\uB25A"], /* Hangul Syllable */ + ["\uB25B", "\uB25B"], /* Hangul Syllable */ + ["\uB25C", "\uB25C"], /* Hangul Syllable */ + ["\uB25D", "\uB25D"], /* Hangul Syllable */ + ["\uB25E", "\uB25E"], /* Hangul Syllable */ + ["\uB25F", "\uB25F"], /* Hangul Syllable */ + ["\uB260", "\uB260"], /* Hangul Syllable */ + ["\uB261", "\uB261"], /* Hangul Syllable */ + ["\uB262", "\uB262"], /* Hangul Syllable */ + ["\uB263", "\uB263"], /* Hangul Syllable */ + ["\uB264", "\uB264"], /* Hangul Syllable */ + ["\uB265", "\uB265"], /* Hangul Syllable */ + ["\uB266", "\uB266"], /* Hangul Syllable */ + ["\uB267", "\uB267"], /* Hangul Syllable */ + ["\uB268", "\uB268"], /* Hangul Syllable */ + ["\uB269", "\uB269"], /* Hangul Syllable */ + ["\uB26A", "\uB26A"], /* Hangul Syllable */ + ["\uB26B", "\uB26B"], /* Hangul Syllable */ + ["\uB26C", "\uB26C"], /* Hangul Syllable */ + ["\uB26D", "\uB26D"], /* Hangul Syllable */ + ["\uB26E", "\uB26E"], /* Hangul Syllable */ + ["\uB26F", "\uB26F"], /* Hangul Syllable */ + ["\uB270", "\uB270"], /* Hangul Syllable */ + ["\uB271", "\uB271"], /* Hangul Syllable */ + ["\uB272", "\uB272"], /* Hangul Syllable */ + ["\uB273", "\uB273"], /* Hangul Syllable */ + ["\uB274", "\uB274"], /* Hangul Syllable */ + ["\uB275", "\uB275"], /* Hangul Syllable */ + ["\uB276", "\uB276"], /* Hangul Syllable */ + ["\uB277", "\uB277"], /* Hangul Syllable */ + ["\uB278", "\uB278"], /* Hangul Syllable */ + ["\uB279", "\uB279"], /* Hangul Syllable */ + ["\uB27A", "\uB27A"], /* Hangul Syllable */ + ["\uB27B", "\uB27B"], /* Hangul Syllable */ + ["\uB27C", "\uB27C"], /* Hangul Syllable */ + ["\uB27D", "\uB27D"], /* Hangul Syllable */ + ["\uB27E", "\uB27E"], /* Hangul Syllable */ + ["\uB27F", "\uB27F"], /* Hangul Syllable */ + ["\uB280", "\uB280"], /* Hangul Syllable */ + ["\uB281", "\uB281"], /* Hangul Syllable */ + ["\uB282", "\uB282"], /* Hangul Syllable */ + ["\uB283", "\uB283"], /* Hangul Syllable */ + ["\uB284", "\uB284"], /* Hangul Syllable */ + ["\uB285", "\uB285"], /* Hangul Syllable */ + ["\uB286", "\uB286"], /* Hangul Syllable */ + ["\uB287", "\uB287"], /* Hangul Syllable */ + ["\uB288", "\uB288"], /* Hangul Syllable */ + ["\uB289", "\uB289"], /* Hangul Syllable */ + ["\uB28A", "\uB28A"], /* Hangul Syllable */ + ["\uB28B", "\uB28B"], /* Hangul Syllable */ + ["\uB28C", "\uB28C"], /* Hangul Syllable */ + ["\uB28D", "\uB28D"], /* Hangul Syllable */ + ["\uB28E", "\uB28E"], /* Hangul Syllable */ + ["\uB28F", "\uB28F"], /* Hangul Syllable */ + ["\uB290", "\uB290"], /* Hangul Syllable */ + ["\uB291", "\uB291"], /* Hangul Syllable */ + ["\uB292", "\uB292"], /* Hangul Syllable */ + ["\uB293", "\uB293"], /* Hangul Syllable */ + ["\uB294", "\uB294"], /* Hangul Syllable */ + ["\uB295", "\uB295"], /* Hangul Syllable */ + ["\uB296", "\uB296"], /* Hangul Syllable */ + ["\uB297", "\uB297"], /* Hangul Syllable */ + ["\uB298", "\uB298"], /* Hangul Syllable */ + ["\uB299", "\uB299"], /* Hangul Syllable */ + ["\uB29A", "\uB29A"], /* Hangul Syllable */ + ["\uB29B", "\uB29B"], /* Hangul Syllable */ + ["\uB29C", "\uB29C"], /* Hangul Syllable */ + ["\uB29D", "\uB29D"], /* Hangul Syllable */ + ["\uB29E", "\uB29E"], /* Hangul Syllable */ + ["\uB29F", "\uB29F"], /* Hangul Syllable */ + ["\uB2A0", "\uB2A0"], /* Hangul Syllable */ + ["\uB2A1", "\uB2A1"], /* Hangul Syllable */ + ["\uB2A2", "\uB2A2"], /* Hangul Syllable */ + ["\uB2A3", "\uB2A3"], /* Hangul Syllable */ + ["\uB2A4", "\uB2A4"], /* Hangul Syllable */ + ["\uB2A5", "\uB2A5"], /* Hangul Syllable */ + ["\uB2A6", "\uB2A6"], /* Hangul Syllable */ + ["\uB2A7", "\uB2A7"], /* Hangul Syllable */ + ["\uB2A8", "\uB2A8"], /* Hangul Syllable */ + ["\uB2A9", "\uB2A9"], /* Hangul Syllable */ + ["\uB2AA", "\uB2AA"], /* Hangul Syllable */ + ["\uB2AB", "\uB2AB"], /* Hangul Syllable */ + ["\uB2AC", "\uB2AC"], /* Hangul Syllable */ + ["\uB2AD", "\uB2AD"], /* Hangul Syllable */ + ["\uB2AE", "\uB2AE"], /* Hangul Syllable */ + ["\uB2AF", "\uB2AF"], /* Hangul Syllable */ + ["\uB2B0", "\uB2B0"], /* Hangul Syllable */ + ["\uB2B1", "\uB2B1"], /* Hangul Syllable */ + ["\uB2B2", "\uB2B2"], /* Hangul Syllable */ + ["\uB2B3", "\uB2B3"], /* Hangul Syllable */ + ["\uB2B4", "\uB2B4"], /* Hangul Syllable */ + ["\uB2B5", "\uB2B5"], /* Hangul Syllable */ + ["\uB2B6", "\uB2B6"], /* Hangul Syllable */ + ["\uB2B7", "\uB2B7"], /* Hangul Syllable */ + ["\uB2B8", "\uB2B8"], /* Hangul Syllable */ + ["\uB2B9", "\uB2B9"], /* Hangul Syllable */ + ["\uB2BA", "\uB2BA"], /* Hangul Syllable */ + ["\uB2BB", "\uB2BB"], /* Hangul Syllable */ + ["\uB2BC", "\uB2BC"], /* Hangul Syllable */ + ["\uB2BD", "\uB2BD"], /* Hangul Syllable */ + ["\uB2BE", "\uB2BE"], /* Hangul Syllable */ + ["\uB2BF", "\uB2BF"], /* Hangul Syllable */ + ["\uB2C0", "\uB2C0"], /* Hangul Syllable */ + ["\uB2C1", "\uB2C1"], /* Hangul Syllable */ + ["\uB2C2", "\uB2C2"], /* Hangul Syllable */ + ["\uB2C3", "\uB2C3"], /* Hangul Syllable */ + ["\uB2C4", "\uB2C4"], /* Hangul Syllable */ + ["\uB2C5", "\uB2C5"], /* Hangul Syllable */ + ["\uB2C6", "\uB2C6"], /* Hangul Syllable */ + ["\uB2C7", "\uB2C7"], /* Hangul Syllable */ + ["\uB2C8", "\uB2C8"], /* Hangul Syllable */ + ["\uB2C9", "\uB2C9"], /* Hangul Syllable */ + ["\uB2CA", "\uB2CA"], /* Hangul Syllable */ + ["\uB2CB", "\uB2CB"], /* Hangul Syllable */ + ["\uB2CC", "\uB2CC"], /* Hangul Syllable */ + ["\uB2CD", "\uB2CD"], /* Hangul Syllable */ + ["\uB2CE", "\uB2CE"], /* Hangul Syllable */ + ["\uB2CF", "\uB2CF"], /* Hangul Syllable */ + ["\uB2D0", "\uB2D0"], /* Hangul Syllable */ + ["\uB2D1", "\uB2D1"], /* Hangul Syllable */ + ["\uB2D2", "\uB2D2"], /* Hangul Syllable */ + ["\uB2D3", "\uB2D3"], /* Hangul Syllable */ + ["\uB2D4", "\uB2D4"], /* Hangul Syllable */ + ["\uB2D5", "\uB2D5"], /* Hangul Syllable */ + ["\uB2D6", "\uB2D6"], /* Hangul Syllable */ + ["\uB2D7", "\uB2D7"], /* Hangul Syllable */ + ["\uB2D8", "\uB2D8"], /* Hangul Syllable */ + ["\uB2D9", "\uB2D9"], /* Hangul Syllable */ + ["\uB2DA", "\uB2DA"], /* Hangul Syllable */ + ["\uB2DB", "\uB2DB"], /* Hangul Syllable */ + ["\uB2DC", "\uB2DC"], /* Hangul Syllable */ + ["\uB2DD", "\uB2DD"], /* Hangul Syllable */ + ["\uB2DE", "\uB2DE"], /* Hangul Syllable */ + ["\uB2DF", "\uB2DF"], /* Hangul Syllable */ + ["\uB2E0", "\uB2E0"], /* Hangul Syllable */ + ["\uB2E1", "\uB2E1"], /* Hangul Syllable */ + ["\uB2E2", "\uB2E2"], /* Hangul Syllable */ + ["\uB2E3", "\uB2E3"], /* Hangul Syllable */ + ["\uB2E4", "\uB2E4"], /* Hangul Syllable */ + ["\uB2E5", "\uB2E5"], /* Hangul Syllable */ + ["\uB2E6", "\uB2E6"], /* Hangul Syllable */ + ["\uB2E7", "\uB2E7"], /* Hangul Syllable */ + ["\uB2E8", "\uB2E8"], /* Hangul Syllable */ + ["\uB2E9", "\uB2E9"], /* Hangul Syllable */ + ["\uB2EA", "\uB2EA"], /* Hangul Syllable */ + ["\uB2EB", "\uB2EB"], /* Hangul Syllable */ + ["\uB2EC", "\uB2EC"], /* Hangul Syllable */ + ["\uB2ED", "\uB2ED"], /* Hangul Syllable */ + ["\uB2EE", "\uB2EE"], /* Hangul Syllable */ + ["\uB2EF", "\uB2EF"], /* Hangul Syllable */ + ["\uB2F0", "\uB2F0"], /* Hangul Syllable */ + ["\uB2F1", "\uB2F1"], /* Hangul Syllable */ + ["\uB2F2", "\uB2F2"], /* Hangul Syllable */ + ["\uB2F3", "\uB2F3"], /* Hangul Syllable */ + ["\uB2F4", "\uB2F4"], /* Hangul Syllable */ + ["\uB2F5", "\uB2F5"], /* Hangul Syllable */ + ["\uB2F6", "\uB2F6"], /* Hangul Syllable */ + ["\uB2F7", "\uB2F7"], /* Hangul Syllable */ + ["\uB2F8", "\uB2F8"], /* Hangul Syllable */ + ["\uB2F9", "\uB2F9"], /* Hangul Syllable */ + ["\uB2FA", "\uB2FA"], /* Hangul Syllable */ + ["\uB2FB", "\uB2FB"], /* Hangul Syllable */ + ["\uB2FC", "\uB2FC"], /* Hangul Syllable */ + ["\uB2FD", "\uB2FD"], /* Hangul Syllable */ + ["\uB2FE", "\uB2FE"], /* Hangul Syllable */ + ["\uB2FF", "\uB2FF"], /* Hangul Syllable */ + ["\uB300", "\uB300"], /* Hangul Syllable */ + ["\uB301", "\uB301"], /* Hangul Syllable */ + ["\uB302", "\uB302"], /* Hangul Syllable */ + ["\uB303", "\uB303"], /* Hangul Syllable */ + ["\uB304", "\uB304"], /* Hangul Syllable */ + ["\uB305", "\uB305"], /* Hangul Syllable */ + ["\uB306", "\uB306"], /* Hangul Syllable */ + ["\uB307", "\uB307"], /* Hangul Syllable */ + ["\uB308", "\uB308"], /* Hangul Syllable */ + ["\uB309", "\uB309"], /* Hangul Syllable */ + ["\uB30A", "\uB30A"], /* Hangul Syllable */ + ["\uB30B", "\uB30B"], /* Hangul Syllable */ + ["\uB30C", "\uB30C"], /* Hangul Syllable */ + ["\uB30D", "\uB30D"], /* Hangul Syllable */ + ["\uB30E", "\uB30E"], /* Hangul Syllable */ + ["\uB30F", "\uB30F"], /* Hangul Syllable */ + ["\uB310", "\uB310"], /* Hangul Syllable */ + ["\uB311", "\uB311"], /* Hangul Syllable */ + ["\uB312", "\uB312"], /* Hangul Syllable */ + ["\uB313", "\uB313"], /* Hangul Syllable */ + ["\uB314", "\uB314"], /* Hangul Syllable */ + ["\uB315", "\uB315"], /* Hangul Syllable */ + ["\uB316", "\uB316"], /* Hangul Syllable */ + ["\uB317", "\uB317"], /* Hangul Syllable */ + ["\uB318", "\uB318"], /* Hangul Syllable */ + ["\uB319", "\uB319"], /* Hangul Syllable */ + ["\uB31A", "\uB31A"], /* Hangul Syllable */ + ["\uB31B", "\uB31B"], /* Hangul Syllable */ + ["\uB31C", "\uB31C"], /* Hangul Syllable */ + ["\uB31D", "\uB31D"], /* Hangul Syllable */ + ["\uB31E", "\uB31E"], /* Hangul Syllable */ + ["\uB31F", "\uB31F"], /* Hangul Syllable */ + ["\uB320", "\uB320"], /* Hangul Syllable */ + ["\uB321", "\uB321"], /* Hangul Syllable */ + ["\uB322", "\uB322"], /* Hangul Syllable */ + ["\uB323", "\uB323"], /* Hangul Syllable */ + ["\uB324", "\uB324"], /* Hangul Syllable */ + ["\uB325", "\uB325"], /* Hangul Syllable */ + ["\uB326", "\uB326"], /* Hangul Syllable */ + ["\uB327", "\uB327"], /* Hangul Syllable */ + ["\uB328", "\uB328"], /* Hangul Syllable */ + ["\uB329", "\uB329"], /* Hangul Syllable */ + ["\uB32A", "\uB32A"], /* Hangul Syllable */ + ["\uB32B", "\uB32B"], /* Hangul Syllable */ + ["\uB32C", "\uB32C"], /* Hangul Syllable */ + ["\uB32D", "\uB32D"], /* Hangul Syllable */ + ["\uB32E", "\uB32E"], /* Hangul Syllable */ + ["\uB32F", "\uB32F"], /* Hangul Syllable */ + ["\uB330", "\uB330"], /* Hangul Syllable */ + ["\uB331", "\uB331"], /* Hangul Syllable */ + ["\uB332", "\uB332"], /* Hangul Syllable */ + ["\uB333", "\uB333"], /* Hangul Syllable */ + ["\uB334", "\uB334"], /* Hangul Syllable */ + ["\uB335", "\uB335"], /* Hangul Syllable */ + ["\uB336", "\uB336"], /* Hangul Syllable */ + ["\uB337", "\uB337"], /* Hangul Syllable */ + ["\uB338", "\uB338"], /* Hangul Syllable */ + ["\uB339", "\uB339"], /* Hangul Syllable */ + ["\uB33A", "\uB33A"], /* Hangul Syllable */ + ["\uB33B", "\uB33B"], /* Hangul Syllable */ + ["\uB33C", "\uB33C"], /* Hangul Syllable */ + ["\uB33D", "\uB33D"], /* Hangul Syllable */ + ["\uB33E", "\uB33E"], /* Hangul Syllable */ + ["\uB33F", "\uB33F"], /* Hangul Syllable */ + ["\uB340", "\uB340"], /* Hangul Syllable */ + ["\uB341", "\uB341"], /* Hangul Syllable */ + ["\uB342", "\uB342"], /* Hangul Syllable */ + ["\uB343", "\uB343"], /* Hangul Syllable */ + ["\uB344", "\uB344"], /* Hangul Syllable */ + ["\uB345", "\uB345"], /* Hangul Syllable */ + ["\uB346", "\uB346"], /* Hangul Syllable */ + ["\uB347", "\uB347"], /* Hangul Syllable */ + ["\uB348", "\uB348"], /* Hangul Syllable */ + ["\uB349", "\uB349"], /* Hangul Syllable */ + ["\uB34A", "\uB34A"], /* Hangul Syllable */ + ["\uB34B", "\uB34B"], /* Hangul Syllable */ + ["\uB34C", "\uB34C"], /* Hangul Syllable */ + ["\uB34D", "\uB34D"], /* Hangul Syllable */ + ["\uB34E", "\uB34E"], /* Hangul Syllable */ + ["\uB34F", "\uB34F"], /* Hangul Syllable */ + ["\uB350", "\uB350"], /* Hangul Syllable */ + ["\uB351", "\uB351"], /* Hangul Syllable */ + ["\uB352", "\uB352"], /* Hangul Syllable */ + ["\uB353", "\uB353"], /* Hangul Syllable */ + ["\uB354", "\uB354"], /* Hangul Syllable */ + ["\uB355", "\uB355"], /* Hangul Syllable */ + ["\uB356", "\uB356"], /* Hangul Syllable */ + ["\uB357", "\uB357"], /* Hangul Syllable */ + ["\uB358", "\uB358"], /* Hangul Syllable */ + ["\uB359", "\uB359"], /* Hangul Syllable */ + ["\uB35A", "\uB35A"], /* Hangul Syllable */ + ["\uB35B", "\uB35B"], /* Hangul Syllable */ + ["\uB35C", "\uB35C"], /* Hangul Syllable */ + ["\uB35D", "\uB35D"], /* Hangul Syllable */ + ["\uB35E", "\uB35E"], /* Hangul Syllable */ + ["\uB35F", "\uB35F"], /* Hangul Syllable */ + ["\uB360", "\uB360"], /* Hangul Syllable */ + ["\uB361", "\uB361"], /* Hangul Syllable */ + ["\uB362", "\uB362"], /* Hangul Syllable */ + ["\uB363", "\uB363"], /* Hangul Syllable */ + ["\uB364", "\uB364"], /* Hangul Syllable */ + ["\uB365", "\uB365"], /* Hangul Syllable */ + ["\uB366", "\uB366"], /* Hangul Syllable */ + ["\uB367", "\uB367"], /* Hangul Syllable */ + ["\uB368", "\uB368"], /* Hangul Syllable */ + ["\uB369", "\uB369"], /* Hangul Syllable */ + ["\uB36A", "\uB36A"], /* Hangul Syllable */ + ["\uB36B", "\uB36B"], /* Hangul Syllable */ + ["\uB36C", "\uB36C"], /* Hangul Syllable */ + ["\uB36D", "\uB36D"], /* Hangul Syllable */ + ["\uB36E", "\uB36E"], /* Hangul Syllable */ + ["\uB36F", "\uB36F"], /* Hangul Syllable */ + ["\uB370", "\uB370"], /* Hangul Syllable */ + ["\uB371", "\uB371"], /* Hangul Syllable */ + ["\uB372", "\uB372"], /* Hangul Syllable */ + ["\uB373", "\uB373"], /* Hangul Syllable */ + ["\uB374", "\uB374"], /* Hangul Syllable */ + ["\uB375", "\uB375"], /* Hangul Syllable */ + ["\uB376", "\uB376"], /* Hangul Syllable */ + ["\uB377", "\uB377"], /* Hangul Syllable */ + ["\uB378", "\uB378"], /* Hangul Syllable */ + ["\uB379", "\uB379"], /* Hangul Syllable */ + ["\uB37A", "\uB37A"], /* Hangul Syllable */ + ["\uB37B", "\uB37B"], /* Hangul Syllable */ + ["\uB37C", "\uB37C"], /* Hangul Syllable */ + ["\uB37D", "\uB37D"], /* Hangul Syllable */ + ["\uB37E", "\uB37E"], /* Hangul Syllable */ + ["\uB37F", "\uB37F"], /* Hangul Syllable */ + ["\uB380", "\uB380"], /* Hangul Syllable */ + ["\uB381", "\uB381"], /* Hangul Syllable */ + ["\uB382", "\uB382"], /* Hangul Syllable */ + ["\uB383", "\uB383"], /* Hangul Syllable */ + ["\uB384", "\uB384"], /* Hangul Syllable */ + ["\uB385", "\uB385"], /* Hangul Syllable */ + ["\uB386", "\uB386"], /* Hangul Syllable */ + ["\uB387", "\uB387"], /* Hangul Syllable */ + ["\uB388", "\uB388"], /* Hangul Syllable */ + ["\uB389", "\uB389"], /* Hangul Syllable */ + ["\uB38A", "\uB38A"], /* Hangul Syllable */ + ["\uB38B", "\uB38B"], /* Hangul Syllable */ + ["\uB38C", "\uB38C"], /* Hangul Syllable */ + ["\uB38D", "\uB38D"], /* Hangul Syllable */ + ["\uB38E", "\uB38E"], /* Hangul Syllable */ + ["\uB38F", "\uB38F"], /* Hangul Syllable */ + ["\uB390", "\uB390"], /* Hangul Syllable */ + ["\uB391", "\uB391"], /* Hangul Syllable */ + ["\uB392", "\uB392"], /* Hangul Syllable */ + ["\uB393", "\uB393"], /* Hangul Syllable */ + ["\uB394", "\uB394"], /* Hangul Syllable */ + ["\uB395", "\uB395"], /* Hangul Syllable */ + ["\uB396", "\uB396"], /* Hangul Syllable */ + ["\uB397", "\uB397"], /* Hangul Syllable */ + ["\uB398", "\uB398"], /* Hangul Syllable */ + ["\uB399", "\uB399"], /* Hangul Syllable */ + ["\uB39A", "\uB39A"], /* Hangul Syllable */ + ["\uB39B", "\uB39B"], /* Hangul Syllable */ + ["\uB39C", "\uB39C"], /* Hangul Syllable */ + ["\uB39D", "\uB39D"], /* Hangul Syllable */ + ["\uB39E", "\uB39E"], /* Hangul Syllable */ + ["\uB39F", "\uB39F"], /* Hangul Syllable */ + ["\uB3A0", "\uB3A0"], /* Hangul Syllable */ + ["\uB3A1", "\uB3A1"], /* Hangul Syllable */ + ["\uB3A2", "\uB3A2"], /* Hangul Syllable */ + ["\uB3A3", "\uB3A3"], /* Hangul Syllable */ + ["\uB3A4", "\uB3A4"], /* Hangul Syllable */ + ["\uB3A5", "\uB3A5"], /* Hangul Syllable */ + ["\uB3A6", "\uB3A6"], /* Hangul Syllable */ + ["\uB3A7", "\uB3A7"], /* Hangul Syllable */ + ["\uB3A8", "\uB3A8"], /* Hangul Syllable */ + ["\uB3A9", "\uB3A9"], /* Hangul Syllable */ + ["\uB3AA", "\uB3AA"], /* Hangul Syllable */ + ["\uB3AB", "\uB3AB"], /* Hangul Syllable */ + ["\uB3AC", "\uB3AC"], /* Hangul Syllable */ + ["\uB3AD", "\uB3AD"], /* Hangul Syllable */ + ["\uB3AE", "\uB3AE"], /* Hangul Syllable */ + ["\uB3AF", "\uB3AF"], /* Hangul Syllable */ + ["\uB3B0", "\uB3B0"], /* Hangul Syllable */ + ["\uB3B1", "\uB3B1"], /* Hangul Syllable */ + ["\uB3B2", "\uB3B2"], /* Hangul Syllable */ + ["\uB3B3", "\uB3B3"], /* Hangul Syllable */ + ["\uB3B4", "\uB3B4"], /* Hangul Syllable */ + ["\uB3B5", "\uB3B5"], /* Hangul Syllable */ + ["\uB3B6", "\uB3B6"], /* Hangul Syllable */ + ["\uB3B7", "\uB3B7"], /* Hangul Syllable */ + ["\uB3B8", "\uB3B8"], /* Hangul Syllable */ + ["\uB3B9", "\uB3B9"], /* Hangul Syllable */ + ["\uB3BA", "\uB3BA"], /* Hangul Syllable */ + ["\uB3BB", "\uB3BB"], /* Hangul Syllable */ + ["\uB3BC", "\uB3BC"], /* Hangul Syllable */ + ["\uB3BD", "\uB3BD"], /* Hangul Syllable */ + ["\uB3BE", "\uB3BE"], /* Hangul Syllable */ + ["\uB3BF", "\uB3BF"], /* Hangul Syllable */ + ["\uB3C0", "\uB3C0"], /* Hangul Syllable */ + ["\uB3C1", "\uB3C1"], /* Hangul Syllable */ + ["\uB3C2", "\uB3C2"], /* Hangul Syllable */ + ["\uB3C3", "\uB3C3"], /* Hangul Syllable */ + ["\uB3C4", "\uB3C4"], /* Hangul Syllable */ + ["\uB3C5", "\uB3C5"], /* Hangul Syllable */ + ["\uB3C6", "\uB3C6"], /* Hangul Syllable */ + ["\uB3C7", "\uB3C7"], /* Hangul Syllable */ + ["\uB3C8", "\uB3C8"], /* Hangul Syllable */ + ["\uB3C9", "\uB3C9"], /* Hangul Syllable */ + ["\uB3CA", "\uB3CA"], /* Hangul Syllable */ + ["\uB3CB", "\uB3CB"], /* Hangul Syllable */ + ["\uB3CC", "\uB3CC"], /* Hangul Syllable */ + ["\uB3CD", "\uB3CD"], /* Hangul Syllable */ + ["\uB3CE", "\uB3CE"], /* Hangul Syllable */ + ["\uB3CF", "\uB3CF"], /* Hangul Syllable */ + ["\uB3D0", "\uB3D0"], /* Hangul Syllable */ + ["\uB3D1", "\uB3D1"], /* Hangul Syllable */ + ["\uB3D2", "\uB3D2"], /* Hangul Syllable */ + ["\uB3D3", "\uB3D3"], /* Hangul Syllable */ + ["\uB3D4", "\uB3D4"], /* Hangul Syllable */ + ["\uB3D5", "\uB3D5"], /* Hangul Syllable */ + ["\uB3D6", "\uB3D6"], /* Hangul Syllable */ + ["\uB3D7", "\uB3D7"], /* Hangul Syllable */ + ["\uB3D8", "\uB3D8"], /* Hangul Syllable */ + ["\uB3D9", "\uB3D9"], /* Hangul Syllable */ + ["\uB3DA", "\uB3DA"], /* Hangul Syllable */ + ["\uB3DB", "\uB3DB"], /* Hangul Syllable */ + ["\uB3DC", "\uB3DC"], /* Hangul Syllable */ + ["\uB3DD", "\uB3DD"], /* Hangul Syllable */ + ["\uB3DE", "\uB3DE"], /* Hangul Syllable */ + ["\uB3DF", "\uB3DF"], /* Hangul Syllable */ + ["\uB3E0", "\uB3E0"], /* Hangul Syllable */ + ["\uB3E1", "\uB3E1"], /* Hangul Syllable */ + ["\uB3E2", "\uB3E2"], /* Hangul Syllable */ + ["\uB3E3", "\uB3E3"], /* Hangul Syllable */ + ["\uB3E4", "\uB3E4"], /* Hangul Syllable */ + ["\uB3E5", "\uB3E5"], /* Hangul Syllable */ + ["\uB3E6", "\uB3E6"], /* Hangul Syllable */ + ["\uB3E7", "\uB3E7"], /* Hangul Syllable */ + ["\uB3E8", "\uB3E8"], /* Hangul Syllable */ + ["\uB3E9", "\uB3E9"], /* Hangul Syllable */ + ["\uB3EA", "\uB3EA"], /* Hangul Syllable */ + ["\uB3EB", "\uB3EB"], /* Hangul Syllable */ + ["\uB3EC", "\uB3EC"], /* Hangul Syllable */ + ["\uB3ED", "\uB3ED"], /* Hangul Syllable */ + ["\uB3EE", "\uB3EE"], /* Hangul Syllable */ + ["\uB3EF", "\uB3EF"], /* Hangul Syllable */ + ["\uB3F0", "\uB3F0"], /* Hangul Syllable */ + ["\uB3F1", "\uB3F1"], /* Hangul Syllable */ + ["\uB3F2", "\uB3F2"], /* Hangul Syllable */ + ["\uB3F3", "\uB3F3"], /* Hangul Syllable */ + ["\uB3F4", "\uB3F4"], /* Hangul Syllable */ + ["\uB3F5", "\uB3F5"], /* Hangul Syllable */ + ["\uB3F6", "\uB3F6"], /* Hangul Syllable */ + ["\uB3F7", "\uB3F7"], /* Hangul Syllable */ + ["\uB3F8", "\uB3F8"], /* Hangul Syllable */ + ["\uB3F9", "\uB3F9"], /* Hangul Syllable */ + ["\uB3FA", "\uB3FA"], /* Hangul Syllable */ + ["\uB3FB", "\uB3FB"], /* Hangul Syllable */ + ["\uB3FC", "\uB3FC"], /* Hangul Syllable */ + ["\uB3FD", "\uB3FD"], /* Hangul Syllable */ + ["\uB3FE", "\uB3FE"], /* Hangul Syllable */ + ["\uB3FF", "\uB3FF"], /* Hangul Syllable */ + ["\uB400", "\uB400"], /* Hangul Syllable */ + ["\uB401", "\uB401"], /* Hangul Syllable */ + ["\uB402", "\uB402"], /* Hangul Syllable */ + ["\uB403", "\uB403"], /* Hangul Syllable */ + ["\uB404", "\uB404"], /* Hangul Syllable */ + ["\uB405", "\uB405"], /* Hangul Syllable */ + ["\uB406", "\uB406"], /* Hangul Syllable */ + ["\uB407", "\uB407"], /* Hangul Syllable */ + ["\uB408", "\uB408"], /* Hangul Syllable */ + ["\uB409", "\uB409"], /* Hangul Syllable */ + ["\uB40A", "\uB40A"], /* Hangul Syllable */ + ["\uB40B", "\uB40B"], /* Hangul Syllable */ + ["\uB40C", "\uB40C"], /* Hangul Syllable */ + ["\uB40D", "\uB40D"], /* Hangul Syllable */ + ["\uB40E", "\uB40E"], /* Hangul Syllable */ + ["\uB40F", "\uB40F"], /* Hangul Syllable */ + ["\uB410", "\uB410"], /* Hangul Syllable */ + ["\uB411", "\uB411"], /* Hangul Syllable */ + ["\uB412", "\uB412"], /* Hangul Syllable */ + ["\uB413", "\uB413"], /* Hangul Syllable */ + ["\uB414", "\uB414"], /* Hangul Syllable */ + ["\uB415", "\uB415"], /* Hangul Syllable */ + ["\uB416", "\uB416"], /* Hangul Syllable */ + ["\uB417", "\uB417"], /* Hangul Syllable */ + ["\uB418", "\uB418"], /* Hangul Syllable */ + ["\uB419", "\uB419"], /* Hangul Syllable */ + ["\uB41A", "\uB41A"], /* Hangul Syllable */ + ["\uB41B", "\uB41B"], /* Hangul Syllable */ + ["\uB41C", "\uB41C"], /* Hangul Syllable */ + ["\uB41D", "\uB41D"], /* Hangul Syllable */ + ["\uB41E", "\uB41E"], /* Hangul Syllable */ + ["\uB41F", "\uB41F"], /* Hangul Syllable */ + ["\uB420", "\uB420"], /* Hangul Syllable */ + ["\uB421", "\uB421"], /* Hangul Syllable */ + ["\uB422", "\uB422"], /* Hangul Syllable */ + ["\uB423", "\uB423"], /* Hangul Syllable */ + ["\uB424", "\uB424"], /* Hangul Syllable */ + ["\uB425", "\uB425"], /* Hangul Syllable */ + ["\uB426", "\uB426"], /* Hangul Syllable */ + ["\uB427", "\uB427"], /* Hangul Syllable */ + ["\uB428", "\uB428"], /* Hangul Syllable */ + ["\uB429", "\uB429"], /* Hangul Syllable */ + ["\uB42A", "\uB42A"], /* Hangul Syllable */ + ["\uB42B", "\uB42B"], /* Hangul Syllable */ + ["\uB42C", "\uB42C"], /* Hangul Syllable */ + ["\uB42D", "\uB42D"], /* Hangul Syllable */ + ["\uB42E", "\uB42E"], /* Hangul Syllable */ + ["\uB42F", "\uB42F"], /* Hangul Syllable */ + ["\uB430", "\uB430"], /* Hangul Syllable */ + ["\uB431", "\uB431"], /* Hangul Syllable */ + ["\uB432", "\uB432"], /* Hangul Syllable */ + ["\uB433", "\uB433"], /* Hangul Syllable */ + ["\uB434", "\uB434"], /* Hangul Syllable */ + ["\uB435", "\uB435"], /* Hangul Syllable */ + ["\uB436", "\uB436"], /* Hangul Syllable */ + ["\uB437", "\uB437"], /* Hangul Syllable */ + ["\uB438", "\uB438"], /* Hangul Syllable */ + ["\uB439", "\uB439"], /* Hangul Syllable */ + ["\uB43A", "\uB43A"], /* Hangul Syllable */ + ["\uB43B", "\uB43B"], /* Hangul Syllable */ + ["\uB43C", "\uB43C"], /* Hangul Syllable */ + ["\uB43D", "\uB43D"], /* Hangul Syllable */ + ["\uB43E", "\uB43E"], /* Hangul Syllable */ + ["\uB43F", "\uB43F"], /* Hangul Syllable */ + ["\uB440", "\uB440"], /* Hangul Syllable */ + ["\uB441", "\uB441"], /* Hangul Syllable */ + ["\uB442", "\uB442"], /* Hangul Syllable */ + ["\uB443", "\uB443"], /* Hangul Syllable */ + ["\uB444", "\uB444"], /* Hangul Syllable */ + ["\uB445", "\uB445"], /* Hangul Syllable */ + ["\uB446", "\uB446"], /* Hangul Syllable */ + ["\uB447", "\uB447"], /* Hangul Syllable */ + ["\uB448", "\uB448"], /* Hangul Syllable */ + ["\uB449", "\uB449"], /* Hangul Syllable */ + ["\uB44A", "\uB44A"], /* Hangul Syllable */ + ["\uB44B", "\uB44B"], /* Hangul Syllable */ + ["\uB44C", "\uB44C"], /* Hangul Syllable */ + ["\uB44D", "\uB44D"], /* Hangul Syllable */ + ["\uB44E", "\uB44E"], /* Hangul Syllable */ + ["\uB44F", "\uB44F"], /* Hangul Syllable */ + ["\uB450", "\uB450"], /* Hangul Syllable */ + ["\uB451", "\uB451"], /* Hangul Syllable */ + ["\uB452", "\uB452"], /* Hangul Syllable */ + ["\uB453", "\uB453"], /* Hangul Syllable */ + ["\uB454", "\uB454"], /* Hangul Syllable */ + ["\uB455", "\uB455"], /* Hangul Syllable */ + ["\uB456", "\uB456"], /* Hangul Syllable */ + ["\uB457", "\uB457"], /* Hangul Syllable */ + ["\uB458", "\uB458"], /* Hangul Syllable */ + ["\uB459", "\uB459"], /* Hangul Syllable */ + ["\uB45A", "\uB45A"], /* Hangul Syllable */ + ["\uB45B", "\uB45B"], /* Hangul Syllable */ + ["\uB45C", "\uB45C"], /* Hangul Syllable */ + ["\uB45D", "\uB45D"], /* Hangul Syllable */ + ["\uB45E", "\uB45E"], /* Hangul Syllable */ + ["\uB45F", "\uB45F"], /* Hangul Syllable */ + ["\uB460", "\uB460"], /* Hangul Syllable */ + ["\uB461", "\uB461"], /* Hangul Syllable */ + ["\uB462", "\uB462"], /* Hangul Syllable */ + ["\uB463", "\uB463"], /* Hangul Syllable */ + ["\uB464", "\uB464"], /* Hangul Syllable */ + ["\uB465", "\uB465"], /* Hangul Syllable */ + ["\uB466", "\uB466"], /* Hangul Syllable */ + ["\uB467", "\uB467"], /* Hangul Syllable */ + ["\uB468", "\uB468"], /* Hangul Syllable */ + ["\uB469", "\uB469"], /* Hangul Syllable */ + ["\uB46A", "\uB46A"], /* Hangul Syllable */ + ["\uB46B", "\uB46B"], /* Hangul Syllable */ + ["\uB46C", "\uB46C"], /* Hangul Syllable */ + ["\uB46D", "\uB46D"], /* Hangul Syllable */ + ["\uB46E", "\uB46E"], /* Hangul Syllable */ + ["\uB46F", "\uB46F"], /* Hangul Syllable */ + ["\uB470", "\uB470"], /* Hangul Syllable */ + ["\uB471", "\uB471"], /* Hangul Syllable */ + ["\uB472", "\uB472"], /* Hangul Syllable */ + ["\uB473", "\uB473"], /* Hangul Syllable */ + ["\uB474", "\uB474"], /* Hangul Syllable */ + ["\uB475", "\uB475"], /* Hangul Syllable */ + ["\uB476", "\uB476"], /* Hangul Syllable */ + ["\uB477", "\uB477"], /* Hangul Syllable */ + ["\uB478", "\uB478"], /* Hangul Syllable */ + ["\uB479", "\uB479"], /* Hangul Syllable */ + ["\uB47A", "\uB47A"], /* Hangul Syllable */ + ["\uB47B", "\uB47B"], /* Hangul Syllable */ + ["\uB47C", "\uB47C"], /* Hangul Syllable */ + ["\uB47D", "\uB47D"], /* Hangul Syllable */ + ["\uB47E", "\uB47E"], /* Hangul Syllable */ + ["\uB47F", "\uB47F"], /* Hangul Syllable */ + ["\uB480", "\uB480"], /* Hangul Syllable */ + ["\uB481", "\uB481"], /* Hangul Syllable */ + ["\uB482", "\uB482"], /* Hangul Syllable */ + ["\uB483", "\uB483"], /* Hangul Syllable */ + ["\uB484", "\uB484"], /* Hangul Syllable */ + ["\uB485", "\uB485"], /* Hangul Syllable */ + ["\uB486", "\uB486"], /* Hangul Syllable */ + ["\uB487", "\uB487"], /* Hangul Syllable */ + ["\uB488", "\uB488"], /* Hangul Syllable */ + ["\uB489", "\uB489"], /* Hangul Syllable */ + ["\uB48A", "\uB48A"], /* Hangul Syllable */ + ["\uB48B", "\uB48B"], /* Hangul Syllable */ + ["\uB48C", "\uB48C"], /* Hangul Syllable */ + ["\uB48D", "\uB48D"], /* Hangul Syllable */ + ["\uB48E", "\uB48E"], /* Hangul Syllable */ + ["\uB48F", "\uB48F"], /* Hangul Syllable */ + ["\uB490", "\uB490"], /* Hangul Syllable */ + ["\uB491", "\uB491"], /* Hangul Syllable */ + ["\uB492", "\uB492"], /* Hangul Syllable */ + ["\uB493", "\uB493"], /* Hangul Syllable */ + ["\uB494", "\uB494"], /* Hangul Syllable */ + ["\uB495", "\uB495"], /* Hangul Syllable */ + ["\uB496", "\uB496"], /* Hangul Syllable */ + ["\uB497", "\uB497"], /* Hangul Syllable */ + ["\uB498", "\uB498"], /* Hangul Syllable */ + ["\uB499", "\uB499"], /* Hangul Syllable */ + ["\uB49A", "\uB49A"], /* Hangul Syllable */ + ["\uB49B", "\uB49B"], /* Hangul Syllable */ + ["\uB49C", "\uB49C"], /* Hangul Syllable */ + ["\uB49D", "\uB49D"], /* Hangul Syllable */ + ["\uB49E", "\uB49E"], /* Hangul Syllable */ + ["\uB49F", "\uB49F"], /* Hangul Syllable */ + ["\uB4A0", "\uB4A0"], /* Hangul Syllable */ + ["\uB4A1", "\uB4A1"], /* Hangul Syllable */ + ["\uB4A2", "\uB4A2"], /* Hangul Syllable */ + ["\uB4A3", "\uB4A3"], /* Hangul Syllable */ + ["\uB4A4", "\uB4A4"], /* Hangul Syllable */ + ["\uB4A5", "\uB4A5"], /* Hangul Syllable */ + ["\uB4A6", "\uB4A6"], /* Hangul Syllable */ + ["\uB4A7", "\uB4A7"], /* Hangul Syllable */ + ["\uB4A8", "\uB4A8"], /* Hangul Syllable */ + ["\uB4A9", "\uB4A9"], /* Hangul Syllable */ + ["\uB4AA", "\uB4AA"], /* Hangul Syllable */ + ["\uB4AB", "\uB4AB"], /* Hangul Syllable */ + ["\uB4AC", "\uB4AC"], /* Hangul Syllable */ + ["\uB4AD", "\uB4AD"], /* Hangul Syllable */ + ["\uB4AE", "\uB4AE"], /* Hangul Syllable */ + ["\uB4AF", "\uB4AF"], /* Hangul Syllable */ + ["\uB4B0", "\uB4B0"], /* Hangul Syllable */ + ["\uB4B1", "\uB4B1"], /* Hangul Syllable */ + ["\uB4B2", "\uB4B2"], /* Hangul Syllable */ + ["\uB4B3", "\uB4B3"], /* Hangul Syllable */ + ["\uB4B4", "\uB4B4"], /* Hangul Syllable */ + ["\uB4B5", "\uB4B5"], /* Hangul Syllable */ + ["\uB4B6", "\uB4B6"], /* Hangul Syllable */ + ["\uB4B7", "\uB4B7"], /* Hangul Syllable */ + ["\uB4B8", "\uB4B8"], /* Hangul Syllable */ + ["\uB4B9", "\uB4B9"], /* Hangul Syllable */ + ["\uB4BA", "\uB4BA"], /* Hangul Syllable */ + ["\uB4BB", "\uB4BB"], /* Hangul Syllable */ + ["\uB4BC", "\uB4BC"], /* Hangul Syllable */ + ["\uB4BD", "\uB4BD"], /* Hangul Syllable */ + ["\uB4BE", "\uB4BE"], /* Hangul Syllable */ + ["\uB4BF", "\uB4BF"], /* Hangul Syllable */ + ["\uB4C0", "\uB4C0"], /* Hangul Syllable */ + ["\uB4C1", "\uB4C1"], /* Hangul Syllable */ + ["\uB4C2", "\uB4C2"], /* Hangul Syllable */ + ["\uB4C3", "\uB4C3"], /* Hangul Syllable */ + ["\uB4C4", "\uB4C4"], /* Hangul Syllable */ + ["\uB4C5", "\uB4C5"], /* Hangul Syllable */ + ["\uB4C6", "\uB4C6"], /* Hangul Syllable */ + ["\uB4C7", "\uB4C7"], /* Hangul Syllable */ + ["\uB4C8", "\uB4C8"], /* Hangul Syllable */ + ["\uB4C9", "\uB4C9"], /* Hangul Syllable */ + ["\uB4CA", "\uB4CA"], /* Hangul Syllable */ + ["\uB4CB", "\uB4CB"], /* Hangul Syllable */ + ["\uB4CC", "\uB4CC"], /* Hangul Syllable */ + ["\uB4CD", "\uB4CD"], /* Hangul Syllable */ + ["\uB4CE", "\uB4CE"], /* Hangul Syllable */ + ["\uB4CF", "\uB4CF"], /* Hangul Syllable */ + ["\uB4D0", "\uB4D0"], /* Hangul Syllable */ + ["\uB4D1", "\uB4D1"], /* Hangul Syllable */ + ["\uB4D2", "\uB4D2"], /* Hangul Syllable */ + ["\uB4D3", "\uB4D3"], /* Hangul Syllable */ + ["\uB4D4", "\uB4D4"], /* Hangul Syllable */ + ["\uB4D5", "\uB4D5"], /* Hangul Syllable */ + ["\uB4D6", "\uB4D6"], /* Hangul Syllable */ + ["\uB4D7", "\uB4D7"], /* Hangul Syllable */ + ["\uB4D8", "\uB4D8"], /* Hangul Syllable */ + ["\uB4D9", "\uB4D9"], /* Hangul Syllable */ + ["\uB4DA", "\uB4DA"], /* Hangul Syllable */ + ["\uB4DB", "\uB4DB"], /* Hangul Syllable */ + ["\uB4DC", "\uB4DC"], /* Hangul Syllable */ + ["\uB4DD", "\uB4DD"], /* Hangul Syllable */ + ["\uB4DE", "\uB4DE"], /* Hangul Syllable */ + ["\uB4DF", "\uB4DF"], /* Hangul Syllable */ + ["\uB4E0", "\uB4E0"], /* Hangul Syllable */ + ["\uB4E1", "\uB4E1"], /* Hangul Syllable */ + ["\uB4E2", "\uB4E2"], /* Hangul Syllable */ + ["\uB4E3", "\uB4E3"], /* Hangul Syllable */ + ["\uB4E4", "\uB4E4"], /* Hangul Syllable */ + ["\uB4E5", "\uB4E5"], /* Hangul Syllable */ + ["\uB4E6", "\uB4E6"], /* Hangul Syllable */ + ["\uB4E7", "\uB4E7"], /* Hangul Syllable */ + ["\uB4E8", "\uB4E8"], /* Hangul Syllable */ + ["\uB4E9", "\uB4E9"], /* Hangul Syllable */ + ["\uB4EA", "\uB4EA"], /* Hangul Syllable */ + ["\uB4EB", "\uB4EB"], /* Hangul Syllable */ + ["\uB4EC", "\uB4EC"], /* Hangul Syllable */ + ["\uB4ED", "\uB4ED"], /* Hangul Syllable */ + ["\uB4EE", "\uB4EE"], /* Hangul Syllable */ + ["\uB4EF", "\uB4EF"], /* Hangul Syllable */ + ["\uB4F0", "\uB4F0"], /* Hangul Syllable */ + ["\uB4F1", "\uB4F1"], /* Hangul Syllable */ + ["\uB4F2", "\uB4F2"], /* Hangul Syllable */ + ["\uB4F3", "\uB4F3"], /* Hangul Syllable */ + ["\uB4F4", "\uB4F4"], /* Hangul Syllable */ + ["\uB4F5", "\uB4F5"], /* Hangul Syllable */ + ["\uB4F6", "\uB4F6"], /* Hangul Syllable */ + ["\uB4F7", "\uB4F7"], /* Hangul Syllable */ + ["\uB4F8", "\uB4F8"], /* Hangul Syllable */ + ["\uB4F9", "\uB4F9"], /* Hangul Syllable */ + ["\uB4FA", "\uB4FA"], /* Hangul Syllable */ + ["\uB4FB", "\uB4FB"], /* Hangul Syllable */ + ["\uB4FC", "\uB4FC"], /* Hangul Syllable */ + ["\uB4FD", "\uB4FD"], /* Hangul Syllable */ + ["\uB4FE", "\uB4FE"], /* Hangul Syllable */ + ["\uB4FF", "\uB4FF"], /* Hangul Syllable */ + ["\uB500", "\uB500"], /* Hangul Syllable */ + ["\uB501", "\uB501"], /* Hangul Syllable */ + ["\uB502", "\uB502"], /* Hangul Syllable */ + ["\uB503", "\uB503"], /* Hangul Syllable */ + ["\uB504", "\uB504"], /* Hangul Syllable */ + ["\uB505", "\uB505"], /* Hangul Syllable */ + ["\uB506", "\uB506"], /* Hangul Syllable */ + ["\uB507", "\uB507"], /* Hangul Syllable */ + ["\uB508", "\uB508"], /* Hangul Syllable */ + ["\uB509", "\uB509"], /* Hangul Syllable */ + ["\uB50A", "\uB50A"], /* Hangul Syllable */ + ["\uB50B", "\uB50B"], /* Hangul Syllable */ + ["\uB50C", "\uB50C"], /* Hangul Syllable */ + ["\uB50D", "\uB50D"], /* Hangul Syllable */ + ["\uB50E", "\uB50E"], /* Hangul Syllable */ + ["\uB50F", "\uB50F"], /* Hangul Syllable */ + ["\uB510", "\uB510"], /* Hangul Syllable */ + ["\uB511", "\uB511"], /* Hangul Syllable */ + ["\uB512", "\uB512"], /* Hangul Syllable */ + ["\uB513", "\uB513"], /* Hangul Syllable */ + ["\uB514", "\uB514"], /* Hangul Syllable */ + ["\uB515", "\uB515"], /* Hangul Syllable */ + ["\uB516", "\uB516"], /* Hangul Syllable */ + ["\uB517", "\uB517"], /* Hangul Syllable */ + ["\uB518", "\uB518"], /* Hangul Syllable */ + ["\uB519", "\uB519"], /* Hangul Syllable */ + ["\uB51A", "\uB51A"], /* Hangul Syllable */ + ["\uB51B", "\uB51B"], /* Hangul Syllable */ + ["\uB51C", "\uB51C"], /* Hangul Syllable */ + ["\uB51D", "\uB51D"], /* Hangul Syllable */ + ["\uB51E", "\uB51E"], /* Hangul Syllable */ + ["\uB51F", "\uB51F"], /* Hangul Syllable */ + ["\uB520", "\uB520"], /* Hangul Syllable */ + ["\uB521", "\uB521"], /* Hangul Syllable */ + ["\uB522", "\uB522"], /* Hangul Syllable */ + ["\uB523", "\uB523"], /* Hangul Syllable */ + ["\uB524", "\uB524"], /* Hangul Syllable */ + ["\uB525", "\uB525"], /* Hangul Syllable */ + ["\uB526", "\uB526"], /* Hangul Syllable */ + ["\uB527", "\uB527"], /* Hangul Syllable */ + ["\uB528", "\uB528"], /* Hangul Syllable */ + ["\uB529", "\uB529"], /* Hangul Syllable */ + ["\uB52A", "\uB52A"], /* Hangul Syllable */ + ["\uB52B", "\uB52B"], /* Hangul Syllable */ + ["\uB52C", "\uB52C"], /* Hangul Syllable */ + ["\uB52D", "\uB52D"], /* Hangul Syllable */ + ["\uB52E", "\uB52E"], /* Hangul Syllable */ + ["\uB52F", "\uB52F"], /* Hangul Syllable */ + ["\uB530", "\uB530"], /* Hangul Syllable */ + ["\uB531", "\uB531"], /* Hangul Syllable */ + ["\uB532", "\uB532"], /* Hangul Syllable */ + ["\uB533", "\uB533"], /* Hangul Syllable */ + ["\uB534", "\uB534"], /* Hangul Syllable */ + ["\uB535", "\uB535"], /* Hangul Syllable */ + ["\uB536", "\uB536"], /* Hangul Syllable */ + ["\uB537", "\uB537"], /* Hangul Syllable */ + ["\uB538", "\uB538"], /* Hangul Syllable */ + ["\uB539", "\uB539"], /* Hangul Syllable */ + ["\uB53A", "\uB53A"], /* Hangul Syllable */ + ["\uB53B", "\uB53B"], /* Hangul Syllable */ + ["\uB53C", "\uB53C"], /* Hangul Syllable */ + ["\uB53D", "\uB53D"], /* Hangul Syllable */ + ["\uB53E", "\uB53E"], /* Hangul Syllable */ + ["\uB53F", "\uB53F"], /* Hangul Syllable */ + ["\uB540", "\uB540"], /* Hangul Syllable */ + ["\uB541", "\uB541"], /* Hangul Syllable */ + ["\uB542", "\uB542"], /* Hangul Syllable */ + ["\uB543", "\uB543"], /* Hangul Syllable */ + ["\uB544", "\uB544"], /* Hangul Syllable */ + ["\uB545", "\uB545"], /* Hangul Syllable */ + ["\uB546", "\uB546"], /* Hangul Syllable */ + ["\uB547", "\uB547"], /* Hangul Syllable */ + ["\uB548", "\uB548"], /* Hangul Syllable */ + ["\uB549", "\uB549"], /* Hangul Syllable */ + ["\uB54A", "\uB54A"], /* Hangul Syllable */ + ["\uB54B", "\uB54B"], /* Hangul Syllable */ + ["\uB54C", "\uB54C"], /* Hangul Syllable */ + ["\uB54D", "\uB54D"], /* Hangul Syllable */ + ["\uB54E", "\uB54E"], /* Hangul Syllable */ + ["\uB54F", "\uB54F"], /* Hangul Syllable */ + ["\uB550", "\uB550"], /* Hangul Syllable */ + ["\uB551", "\uB551"], /* Hangul Syllable */ + ["\uB552", "\uB552"], /* Hangul Syllable */ + ["\uB553", "\uB553"], /* Hangul Syllable */ + ["\uB554", "\uB554"], /* Hangul Syllable */ + ["\uB555", "\uB555"], /* Hangul Syllable */ + ["\uB556", "\uB556"], /* Hangul Syllable */ + ["\uB557", "\uB557"], /* Hangul Syllable */ + ["\uB558", "\uB558"], /* Hangul Syllable */ + ["\uB559", "\uB559"], /* Hangul Syllable */ + ["\uB55A", "\uB55A"], /* Hangul Syllable */ + ["\uB55B", "\uB55B"], /* Hangul Syllable */ + ["\uB55C", "\uB55C"], /* Hangul Syllable */ + ["\uB55D", "\uB55D"], /* Hangul Syllable */ + ["\uB55E", "\uB55E"], /* Hangul Syllable */ + ["\uB55F", "\uB55F"], /* Hangul Syllable */ + ["\uB560", "\uB560"], /* Hangul Syllable */ + ["\uB561", "\uB561"], /* Hangul Syllable */ + ["\uB562", "\uB562"], /* Hangul Syllable */ + ["\uB563", "\uB563"], /* Hangul Syllable */ + ["\uB564", "\uB564"], /* Hangul Syllable */ + ["\uB565", "\uB565"], /* Hangul Syllable */ + ["\uB566", "\uB566"], /* Hangul Syllable */ + ["\uB567", "\uB567"], /* Hangul Syllable */ + ["\uB568", "\uB568"], /* Hangul Syllable */ + ["\uB569", "\uB569"], /* Hangul Syllable */ + ["\uB56A", "\uB56A"], /* Hangul Syllable */ + ["\uB56B", "\uB56B"], /* Hangul Syllable */ + ["\uB56C", "\uB56C"], /* Hangul Syllable */ + ["\uB56D", "\uB56D"], /* Hangul Syllable */ + ["\uB56E", "\uB56E"], /* Hangul Syllable */ + ["\uB56F", "\uB56F"], /* Hangul Syllable */ + ["\uB570", "\uB570"], /* Hangul Syllable */ + ["\uB571", "\uB571"], /* Hangul Syllable */ + ["\uB572", "\uB572"], /* Hangul Syllable */ + ["\uB573", "\uB573"], /* Hangul Syllable */ + ["\uB574", "\uB574"], /* Hangul Syllable */ + ["\uB575", "\uB575"], /* Hangul Syllable */ + ["\uB576", "\uB576"], /* Hangul Syllable */ + ["\uB577", "\uB577"], /* Hangul Syllable */ + ["\uB578", "\uB578"], /* Hangul Syllable */ + ["\uB579", "\uB579"], /* Hangul Syllable */ + ["\uB57A", "\uB57A"], /* Hangul Syllable */ + ["\uB57B", "\uB57B"], /* Hangul Syllable */ + ["\uB57C", "\uB57C"], /* Hangul Syllable */ + ["\uB57D", "\uB57D"], /* Hangul Syllable */ + ["\uB57E", "\uB57E"], /* Hangul Syllable */ + ["\uB57F", "\uB57F"], /* Hangul Syllable */ + ["\uB580", "\uB580"], /* Hangul Syllable */ + ["\uB581", "\uB581"], /* Hangul Syllable */ + ["\uB582", "\uB582"], /* Hangul Syllable */ + ["\uB583", "\uB583"], /* Hangul Syllable */ + ["\uB584", "\uB584"], /* Hangul Syllable */ + ["\uB585", "\uB585"], /* Hangul Syllable */ + ["\uB586", "\uB586"], /* Hangul Syllable */ + ["\uB587", "\uB587"], /* Hangul Syllable */ + ["\uB588", "\uB588"], /* Hangul Syllable */ + ["\uB589", "\uB589"], /* Hangul Syllable */ + ["\uB58A", "\uB58A"], /* Hangul Syllable */ + ["\uB58B", "\uB58B"], /* Hangul Syllable */ + ["\uB58C", "\uB58C"], /* Hangul Syllable */ + ["\uB58D", "\uB58D"], /* Hangul Syllable */ + ["\uB58E", "\uB58E"], /* Hangul Syllable */ + ["\uB58F", "\uB58F"], /* Hangul Syllable */ + ["\uB590", "\uB590"], /* Hangul Syllable */ + ["\uB591", "\uB591"], /* Hangul Syllable */ + ["\uB592", "\uB592"], /* Hangul Syllable */ + ["\uB593", "\uB593"], /* Hangul Syllable */ + ["\uB594", "\uB594"], /* Hangul Syllable */ + ["\uB595", "\uB595"], /* Hangul Syllable */ + ["\uB596", "\uB596"], /* Hangul Syllable */ + ["\uB597", "\uB597"], /* Hangul Syllable */ + ["\uB598", "\uB598"], /* Hangul Syllable */ + ["\uB599", "\uB599"], /* Hangul Syllable */ + ["\uB59A", "\uB59A"], /* Hangul Syllable */ + ["\uB59B", "\uB59B"], /* Hangul Syllable */ + ["\uB59C", "\uB59C"], /* Hangul Syllable */ + ["\uB59D", "\uB59D"], /* Hangul Syllable */ + ["\uB59E", "\uB59E"], /* Hangul Syllable */ + ["\uB59F", "\uB59F"], /* Hangul Syllable */ + ["\uB5A0", "\uB5A0"], /* Hangul Syllable */ + ["\uB5A1", "\uB5A1"], /* Hangul Syllable */ + ["\uB5A2", "\uB5A2"], /* Hangul Syllable */ + ["\uB5A3", "\uB5A3"], /* Hangul Syllable */ + ["\uB5A4", "\uB5A4"], /* Hangul Syllable */ + ["\uB5A5", "\uB5A5"], /* Hangul Syllable */ + ["\uB5A6", "\uB5A6"], /* Hangul Syllable */ + ["\uB5A7", "\uB5A7"], /* Hangul Syllable */ + ["\uB5A8", "\uB5A8"], /* Hangul Syllable */ + ["\uB5A9", "\uB5A9"], /* Hangul Syllable */ + ["\uB5AA", "\uB5AA"], /* Hangul Syllable */ + ["\uB5AB", "\uB5AB"], /* Hangul Syllable */ + ["\uB5AC", "\uB5AC"], /* Hangul Syllable */ + ["\uB5AD", "\uB5AD"], /* Hangul Syllable */ + ["\uB5AE", "\uB5AE"], /* Hangul Syllable */ + ["\uB5AF", "\uB5AF"], /* Hangul Syllable */ + ["\uB5B0", "\uB5B0"], /* Hangul Syllable */ + ["\uB5B1", "\uB5B1"], /* Hangul Syllable */ + ["\uB5B2", "\uB5B2"], /* Hangul Syllable */ + ["\uB5B3", "\uB5B3"], /* Hangul Syllable */ + ["\uB5B4", "\uB5B4"], /* Hangul Syllable */ + ["\uB5B5", "\uB5B5"], /* Hangul Syllable */ + ["\uB5B6", "\uB5B6"], /* Hangul Syllable */ + ["\uB5B7", "\uB5B7"], /* Hangul Syllable */ + ["\uB5B8", "\uB5B8"], /* Hangul Syllable */ + ["\uB5B9", "\uB5B9"], /* Hangul Syllable */ + ["\uB5BA", "\uB5BA"], /* Hangul Syllable */ + ["\uB5BB", "\uB5BB"], /* Hangul Syllable */ + ["\uB5BC", "\uB5BC"], /* Hangul Syllable */ + ["\uB5BD", "\uB5BD"], /* Hangul Syllable */ + ["\uB5BE", "\uB5BE"], /* Hangul Syllable */ + ["\uB5BF", "\uB5BF"], /* Hangul Syllable */ + ["\uB5C0", "\uB5C0"], /* Hangul Syllable */ + ["\uB5C1", "\uB5C1"], /* Hangul Syllable */ + ["\uB5C2", "\uB5C2"], /* Hangul Syllable */ + ["\uB5C3", "\uB5C3"], /* Hangul Syllable */ + ["\uB5C4", "\uB5C4"], /* Hangul Syllable */ + ["\uB5C5", "\uB5C5"], /* Hangul Syllable */ + ["\uB5C6", "\uB5C6"], /* Hangul Syllable */ + ["\uB5C7", "\uB5C7"], /* Hangul Syllable */ + ["\uB5C8", "\uB5C8"], /* Hangul Syllable */ + ["\uB5C9", "\uB5C9"], /* Hangul Syllable */ + ["\uB5CA", "\uB5CA"], /* Hangul Syllable */ + ["\uB5CB", "\uB5CB"], /* Hangul Syllable */ + ["\uB5CC", "\uB5CC"], /* Hangul Syllable */ + ["\uB5CD", "\uB5CD"], /* Hangul Syllable */ + ["\uB5CE", "\uB5CE"], /* Hangul Syllable */ + ["\uB5CF", "\uB5CF"], /* Hangul Syllable */ + ["\uB5D0", "\uB5D0"], /* Hangul Syllable */ + ["\uB5D1", "\uB5D1"], /* Hangul Syllable */ + ["\uB5D2", "\uB5D2"], /* Hangul Syllable */ + ["\uB5D3", "\uB5D3"], /* Hangul Syllable */ + ["\uB5D4", "\uB5D4"], /* Hangul Syllable */ + ["\uB5D5", "\uB5D5"], /* Hangul Syllable */ + ["\uB5D6", "\uB5D6"], /* Hangul Syllable */ + ["\uB5D7", "\uB5D7"], /* Hangul Syllable */ + ["\uB5D8", "\uB5D8"], /* Hangul Syllable */ + ["\uB5D9", "\uB5D9"], /* Hangul Syllable */ + ["\uB5DA", "\uB5DA"], /* Hangul Syllable */ + ["\uB5DB", "\uB5DB"], /* Hangul Syllable */ + ["\uB5DC", "\uB5DC"], /* Hangul Syllable */ + ["\uB5DD", "\uB5DD"], /* Hangul Syllable */ + ["\uB5DE", "\uB5DE"], /* Hangul Syllable */ + ["\uB5DF", "\uB5DF"], /* Hangul Syllable */ + ["\uB5E0", "\uB5E0"], /* Hangul Syllable */ + ["\uB5E1", "\uB5E1"], /* Hangul Syllable */ + ["\uB5E2", "\uB5E2"], /* Hangul Syllable */ + ["\uB5E3", "\uB5E3"], /* Hangul Syllable */ + ["\uB5E4", "\uB5E4"], /* Hangul Syllable */ + ["\uB5E5", "\uB5E5"], /* Hangul Syllable */ + ["\uB5E6", "\uB5E6"], /* Hangul Syllable */ + ["\uB5E7", "\uB5E7"], /* Hangul Syllable */ + ["\uB5E8", "\uB5E8"], /* Hangul Syllable */ + ["\uB5E9", "\uB5E9"], /* Hangul Syllable */ + ["\uB5EA", "\uB5EA"], /* Hangul Syllable */ + ["\uB5EB", "\uB5EB"], /* Hangul Syllable */ + ["\uB5EC", "\uB5EC"], /* Hangul Syllable */ + ["\uB5ED", "\uB5ED"], /* Hangul Syllable */ + ["\uB5EE", "\uB5EE"], /* Hangul Syllable */ + ["\uB5EF", "\uB5EF"], /* Hangul Syllable */ + ["\uB5F0", "\uB5F0"], /* Hangul Syllable */ + ["\uB5F1", "\uB5F1"], /* Hangul Syllable */ + ["\uB5F2", "\uB5F2"], /* Hangul Syllable */ + ["\uB5F3", "\uB5F3"], /* Hangul Syllable */ + ["\uB5F4", "\uB5F4"], /* Hangul Syllable */ + ["\uB5F5", "\uB5F5"], /* Hangul Syllable */ + ["\uB5F6", "\uB5F6"], /* Hangul Syllable */ + ["\uB5F7", "\uB5F7"], /* Hangul Syllable */ + ["\uB5F8", "\uB5F8"], /* Hangul Syllable */ + ["\uB5F9", "\uB5F9"], /* Hangul Syllable */ + ["\uB5FA", "\uB5FA"], /* Hangul Syllable */ + ["\uB5FB", "\uB5FB"], /* Hangul Syllable */ + ["\uB5FC", "\uB5FC"], /* Hangul Syllable */ + ["\uB5FD", "\uB5FD"], /* Hangul Syllable */ + ["\uB5FE", "\uB5FE"], /* Hangul Syllable */ + ["\uB5FF", "\uB5FF"], /* Hangul Syllable */ + ["\uB600", "\uB600"], /* Hangul Syllable */ + ["\uB601", "\uB601"], /* Hangul Syllable */ + ["\uB602", "\uB602"], /* Hangul Syllable */ + ["\uB603", "\uB603"], /* Hangul Syllable */ + ["\uB604", "\uB604"], /* Hangul Syllable */ + ["\uB605", "\uB605"], /* Hangul Syllable */ + ["\uB606", "\uB606"], /* Hangul Syllable */ + ["\uB607", "\uB607"], /* Hangul Syllable */ + ["\uB608", "\uB608"], /* Hangul Syllable */ + ["\uB609", "\uB609"], /* Hangul Syllable */ + ["\uB60A", "\uB60A"], /* Hangul Syllable */ + ["\uB60B", "\uB60B"], /* Hangul Syllable */ + ["\uB60C", "\uB60C"], /* Hangul Syllable */ + ["\uB60D", "\uB60D"], /* Hangul Syllable */ + ["\uB60E", "\uB60E"], /* Hangul Syllable */ + ["\uB60F", "\uB60F"], /* Hangul Syllable */ + ["\uB610", "\uB610"], /* Hangul Syllable */ + ["\uB611", "\uB611"], /* Hangul Syllable */ + ["\uB612", "\uB612"], /* Hangul Syllable */ + ["\uB613", "\uB613"], /* Hangul Syllable */ + ["\uB614", "\uB614"], /* Hangul Syllable */ + ["\uB615", "\uB615"], /* Hangul Syllable */ + ["\uB616", "\uB616"], /* Hangul Syllable */ + ["\uB617", "\uB617"], /* Hangul Syllable */ + ["\uB618", "\uB618"], /* Hangul Syllable */ + ["\uB619", "\uB619"], /* Hangul Syllable */ + ["\uB61A", "\uB61A"], /* Hangul Syllable */ + ["\uB61B", "\uB61B"], /* Hangul Syllable */ + ["\uB61C", "\uB61C"], /* Hangul Syllable */ + ["\uB61D", "\uB61D"], /* Hangul Syllable */ + ["\uB61E", "\uB61E"], /* Hangul Syllable */ + ["\uB61F", "\uB61F"], /* Hangul Syllable */ + ["\uB620", "\uB620"], /* Hangul Syllable */ + ["\uB621", "\uB621"], /* Hangul Syllable */ + ["\uB622", "\uB622"], /* Hangul Syllable */ + ["\uB623", "\uB623"], /* Hangul Syllable */ + ["\uB624", "\uB624"], /* Hangul Syllable */ + ["\uB625", "\uB625"], /* Hangul Syllable */ + ["\uB626", "\uB626"], /* Hangul Syllable */ + ["\uB627", "\uB627"], /* Hangul Syllable */ + ["\uB628", "\uB628"], /* Hangul Syllable */ + ["\uB629", "\uB629"], /* Hangul Syllable */ + ["\uB62A", "\uB62A"], /* Hangul Syllable */ + ["\uB62B", "\uB62B"], /* Hangul Syllable */ + ["\uB62C", "\uB62C"], /* Hangul Syllable */ + ["\uB62D", "\uB62D"], /* Hangul Syllable */ + ["\uB62E", "\uB62E"], /* Hangul Syllable */ + ["\uB62F", "\uB62F"], /* Hangul Syllable */ + ["\uB630", "\uB630"], /* Hangul Syllable */ + ["\uB631", "\uB631"], /* Hangul Syllable */ + ["\uB632", "\uB632"], /* Hangul Syllable */ + ["\uB633", "\uB633"], /* Hangul Syllable */ + ["\uB634", "\uB634"], /* Hangul Syllable */ + ["\uB635", "\uB635"], /* Hangul Syllable */ + ["\uB636", "\uB636"], /* Hangul Syllable */ + ["\uB637", "\uB637"], /* Hangul Syllable */ + ["\uB638", "\uB638"], /* Hangul Syllable */ + ["\uB639", "\uB639"], /* Hangul Syllable */ + ["\uB63A", "\uB63A"], /* Hangul Syllable */ + ["\uB63B", "\uB63B"], /* Hangul Syllable */ + ["\uB63C", "\uB63C"], /* Hangul Syllable */ + ["\uB63D", "\uB63D"], /* Hangul Syllable */ + ["\uB63E", "\uB63E"], /* Hangul Syllable */ + ["\uB63F", "\uB63F"], /* Hangul Syllable */ + ["\uB640", "\uB640"], /* Hangul Syllable */ + ["\uB641", "\uB641"], /* Hangul Syllable */ + ["\uB642", "\uB642"], /* Hangul Syllable */ + ["\uB643", "\uB643"], /* Hangul Syllable */ + ["\uB644", "\uB644"], /* Hangul Syllable */ + ["\uB645", "\uB645"], /* Hangul Syllable */ + ["\uB646", "\uB646"], /* Hangul Syllable */ + ["\uB647", "\uB647"], /* Hangul Syllable */ + ["\uB648", "\uB648"], /* Hangul Syllable */ + ["\uB649", "\uB649"], /* Hangul Syllable */ + ["\uB64A", "\uB64A"], /* Hangul Syllable */ + ["\uB64B", "\uB64B"], /* Hangul Syllable */ + ["\uB64C", "\uB64C"], /* Hangul Syllable */ + ["\uB64D", "\uB64D"], /* Hangul Syllable */ + ["\uB64E", "\uB64E"], /* Hangul Syllable */ + ["\uB64F", "\uB64F"], /* Hangul Syllable */ + ["\uB650", "\uB650"], /* Hangul Syllable */ + ["\uB651", "\uB651"], /* Hangul Syllable */ + ["\uB652", "\uB652"], /* Hangul Syllable */ + ["\uB653", "\uB653"], /* Hangul Syllable */ + ["\uB654", "\uB654"], /* Hangul Syllable */ + ["\uB655", "\uB655"], /* Hangul Syllable */ + ["\uB656", "\uB656"], /* Hangul Syllable */ + ["\uB657", "\uB657"], /* Hangul Syllable */ + ["\uB658", "\uB658"], /* Hangul Syllable */ + ["\uB659", "\uB659"], /* Hangul Syllable */ + ["\uB65A", "\uB65A"], /* Hangul Syllable */ + ["\uB65B", "\uB65B"], /* Hangul Syllable */ + ["\uB65C", "\uB65C"], /* Hangul Syllable */ + ["\uB65D", "\uB65D"], /* Hangul Syllable */ + ["\uB65E", "\uB65E"], /* Hangul Syllable */ + ["\uB65F", "\uB65F"], /* Hangul Syllable */ + ["\uB660", "\uB660"], /* Hangul Syllable */ + ["\uB661", "\uB661"], /* Hangul Syllable */ + ["\uB662", "\uB662"], /* Hangul Syllable */ + ["\uB663", "\uB663"], /* Hangul Syllable */ + ["\uB664", "\uB664"], /* Hangul Syllable */ + ["\uB665", "\uB665"], /* Hangul Syllable */ + ["\uB666", "\uB666"], /* Hangul Syllable */ + ["\uB667", "\uB667"], /* Hangul Syllable */ + ["\uB668", "\uB668"], /* Hangul Syllable */ + ["\uB669", "\uB669"], /* Hangul Syllable */ + ["\uB66A", "\uB66A"], /* Hangul Syllable */ + ["\uB66B", "\uB66B"], /* Hangul Syllable */ + ["\uB66C", "\uB66C"], /* Hangul Syllable */ + ["\uB66D", "\uB66D"], /* Hangul Syllable */ + ["\uB66E", "\uB66E"], /* Hangul Syllable */ + ["\uB66F", "\uB66F"], /* Hangul Syllable */ + ["\uB670", "\uB670"], /* Hangul Syllable */ + ["\uB671", "\uB671"], /* Hangul Syllable */ + ["\uB672", "\uB672"], /* Hangul Syllable */ + ["\uB673", "\uB673"], /* Hangul Syllable */ + ["\uB674", "\uB674"], /* Hangul Syllable */ + ["\uB675", "\uB675"], /* Hangul Syllable */ + ["\uB676", "\uB676"], /* Hangul Syllable */ + ["\uB677", "\uB677"], /* Hangul Syllable */ + ["\uB678", "\uB678"], /* Hangul Syllable */ + ["\uB679", "\uB679"], /* Hangul Syllable */ + ["\uB67A", "\uB67A"], /* Hangul Syllable */ + ["\uB67B", "\uB67B"], /* Hangul Syllable */ + ["\uB67C", "\uB67C"], /* Hangul Syllable */ + ["\uB67D", "\uB67D"], /* Hangul Syllable */ + ["\uB67E", "\uB67E"], /* Hangul Syllable */ + ["\uB67F", "\uB67F"], /* Hangul Syllable */ + ["\uB680", "\uB680"], /* Hangul Syllable */ + ["\uB681", "\uB681"], /* Hangul Syllable */ + ["\uB682", "\uB682"], /* Hangul Syllable */ + ["\uB683", "\uB683"], /* Hangul Syllable */ + ["\uB684", "\uB684"], /* Hangul Syllable */ + ["\uB685", "\uB685"], /* Hangul Syllable */ + ["\uB686", "\uB686"], /* Hangul Syllable */ + ["\uB687", "\uB687"], /* Hangul Syllable */ + ["\uB688", "\uB688"], /* Hangul Syllable */ + ["\uB689", "\uB689"], /* Hangul Syllable */ + ["\uB68A", "\uB68A"], /* Hangul Syllable */ + ["\uB68B", "\uB68B"], /* Hangul Syllable */ + ["\uB68C", "\uB68C"], /* Hangul Syllable */ + ["\uB68D", "\uB68D"], /* Hangul Syllable */ + ["\uB68E", "\uB68E"], /* Hangul Syllable */ + ["\uB68F", "\uB68F"], /* Hangul Syllable */ + ["\uB690", "\uB690"], /* Hangul Syllable */ + ["\uB691", "\uB691"], /* Hangul Syllable */ + ["\uB692", "\uB692"], /* Hangul Syllable */ + ["\uB693", "\uB693"], /* Hangul Syllable */ + ["\uB694", "\uB694"], /* Hangul Syllable */ + ["\uB695", "\uB695"], /* Hangul Syllable */ + ["\uB696", "\uB696"], /* Hangul Syllable */ + ["\uB697", "\uB697"], /* Hangul Syllable */ + ["\uB698", "\uB698"], /* Hangul Syllable */ + ["\uB699", "\uB699"], /* Hangul Syllable */ + ["\uB69A", "\uB69A"], /* Hangul Syllable */ + ["\uB69B", "\uB69B"], /* Hangul Syllable */ + ["\uB69C", "\uB69C"], /* Hangul Syllable */ + ["\uB69D", "\uB69D"], /* Hangul Syllable */ + ["\uB69E", "\uB69E"], /* Hangul Syllable */ + ["\uB69F", "\uB69F"], /* Hangul Syllable */ + ["\uB6A0", "\uB6A0"], /* Hangul Syllable */ + ["\uB6A1", "\uB6A1"], /* Hangul Syllable */ + ["\uB6A2", "\uB6A2"], /* Hangul Syllable */ + ["\uB6A3", "\uB6A3"], /* Hangul Syllable */ + ["\uB6A4", "\uB6A4"], /* Hangul Syllable */ + ["\uB6A5", "\uB6A5"], /* Hangul Syllable */ + ["\uB6A6", "\uB6A6"], /* Hangul Syllable */ + ["\uB6A7", "\uB6A7"], /* Hangul Syllable */ + ["\uB6A8", "\uB6A8"], /* Hangul Syllable */ + ["\uB6A9", "\uB6A9"], /* Hangul Syllable */ + ["\uB6AA", "\uB6AA"], /* Hangul Syllable */ + ["\uB6AB", "\uB6AB"], /* Hangul Syllable */ + ["\uB6AC", "\uB6AC"], /* Hangul Syllable */ + ["\uB6AD", "\uB6AD"], /* Hangul Syllable */ + ["\uB6AE", "\uB6AE"], /* Hangul Syllable */ + ["\uB6AF", "\uB6AF"], /* Hangul Syllable */ + ["\uB6B0", "\uB6B0"], /* Hangul Syllable */ + ["\uB6B1", "\uB6B1"], /* Hangul Syllable */ + ["\uB6B2", "\uB6B2"], /* Hangul Syllable */ + ["\uB6B3", "\uB6B3"], /* Hangul Syllable */ + ["\uB6B4", "\uB6B4"], /* Hangul Syllable */ + ["\uB6B5", "\uB6B5"], /* Hangul Syllable */ + ["\uB6B6", "\uB6B6"], /* Hangul Syllable */ + ["\uB6B7", "\uB6B7"], /* Hangul Syllable */ + ["\uB6B8", "\uB6B8"], /* Hangul Syllable */ + ["\uB6B9", "\uB6B9"], /* Hangul Syllable */ + ["\uB6BA", "\uB6BA"], /* Hangul Syllable */ + ["\uB6BB", "\uB6BB"], /* Hangul Syllable */ + ["\uB6BC", "\uB6BC"], /* Hangul Syllable */ + ["\uB6BD", "\uB6BD"], /* Hangul Syllable */ + ["\uB6BE", "\uB6BE"], /* Hangul Syllable */ + ["\uB6BF", "\uB6BF"], /* Hangul Syllable */ + ["\uB6C0", "\uB6C0"], /* Hangul Syllable */ + ["\uB6C1", "\uB6C1"], /* Hangul Syllable */ + ["\uB6C2", "\uB6C2"], /* Hangul Syllable */ + ["\uB6C3", "\uB6C3"], /* Hangul Syllable */ + ["\uB6C4", "\uB6C4"], /* Hangul Syllable */ + ["\uB6C5", "\uB6C5"], /* Hangul Syllable */ + ["\uB6C6", "\uB6C6"], /* Hangul Syllable */ + ["\uB6C7", "\uB6C7"], /* Hangul Syllable */ + ["\uB6C8", "\uB6C8"], /* Hangul Syllable */ + ["\uB6C9", "\uB6C9"], /* Hangul Syllable */ + ["\uB6CA", "\uB6CA"], /* Hangul Syllable */ + ["\uB6CB", "\uB6CB"], /* Hangul Syllable */ + ["\uB6CC", "\uB6CC"], /* Hangul Syllable */ + ["\uB6CD", "\uB6CD"], /* Hangul Syllable */ + ["\uB6CE", "\uB6CE"], /* Hangul Syllable */ + ["\uB6CF", "\uB6CF"], /* Hangul Syllable */ + ["\uB6D0", "\uB6D0"], /* Hangul Syllable */ + ["\uB6D1", "\uB6D1"], /* Hangul Syllable */ + ["\uB6D2", "\uB6D2"], /* Hangul Syllable */ + ["\uB6D3", "\uB6D3"], /* Hangul Syllable */ + ["\uB6D4", "\uB6D4"], /* Hangul Syllable */ + ["\uB6D5", "\uB6D5"], /* Hangul Syllable */ + ["\uB6D6", "\uB6D6"], /* Hangul Syllable */ + ["\uB6D7", "\uB6D7"], /* Hangul Syllable */ + ["\uB6D8", "\uB6D8"], /* Hangul Syllable */ + ["\uB6D9", "\uB6D9"], /* Hangul Syllable */ + ["\uB6DA", "\uB6DA"], /* Hangul Syllable */ + ["\uB6DB", "\uB6DB"], /* Hangul Syllable */ + ["\uB6DC", "\uB6DC"], /* Hangul Syllable */ + ["\uB6DD", "\uB6DD"], /* Hangul Syllable */ + ["\uB6DE", "\uB6DE"], /* Hangul Syllable */ + ["\uB6DF", "\uB6DF"], /* Hangul Syllable */ + ["\uB6E0", "\uB6E0"], /* Hangul Syllable */ + ["\uB6E1", "\uB6E1"], /* Hangul Syllable */ + ["\uB6E2", "\uB6E2"], /* Hangul Syllable */ + ["\uB6E3", "\uB6E3"], /* Hangul Syllable */ + ["\uB6E4", "\uB6E4"], /* Hangul Syllable */ + ["\uB6E5", "\uB6E5"], /* Hangul Syllable */ + ["\uB6E6", "\uB6E6"], /* Hangul Syllable */ + ["\uB6E7", "\uB6E7"], /* Hangul Syllable */ + ["\uB6E8", "\uB6E8"], /* Hangul Syllable */ + ["\uB6E9", "\uB6E9"], /* Hangul Syllable */ + ["\uB6EA", "\uB6EA"], /* Hangul Syllable */ + ["\uB6EB", "\uB6EB"], /* Hangul Syllable */ + ["\uB6EC", "\uB6EC"], /* Hangul Syllable */ + ["\uB6ED", "\uB6ED"], /* Hangul Syllable */ + ["\uB6EE", "\uB6EE"], /* Hangul Syllable */ + ["\uB6EF", "\uB6EF"], /* Hangul Syllable */ + ["\uB6F0", "\uB6F0"], /* Hangul Syllable */ + ["\uB6F1", "\uB6F1"], /* Hangul Syllable */ + ["\uB6F2", "\uB6F2"], /* Hangul Syllable */ + ["\uB6F3", "\uB6F3"], /* Hangul Syllable */ + ["\uB6F4", "\uB6F4"], /* Hangul Syllable */ + ["\uB6F5", "\uB6F5"], /* Hangul Syllable */ + ["\uB6F6", "\uB6F6"], /* Hangul Syllable */ + ["\uB6F7", "\uB6F7"], /* Hangul Syllable */ + ["\uB6F8", "\uB6F8"], /* Hangul Syllable */ + ["\uB6F9", "\uB6F9"], /* Hangul Syllable */ + ["\uB6FA", "\uB6FA"], /* Hangul Syllable */ + ["\uB6FB", "\uB6FB"], /* Hangul Syllable */ + ["\uB6FC", "\uB6FC"], /* Hangul Syllable */ + ["\uB6FD", "\uB6FD"], /* Hangul Syllable */ + ["\uB6FE", "\uB6FE"], /* Hangul Syllable */ + ["\uB6FF", "\uB6FF"], /* Hangul Syllable */ + ["\uB700", "\uB700"], /* Hangul Syllable */ + ["\uB701", "\uB701"], /* Hangul Syllable */ + ["\uB702", "\uB702"], /* Hangul Syllable */ + ["\uB703", "\uB703"], /* Hangul Syllable */ + ["\uB704", "\uB704"], /* Hangul Syllable */ + ["\uB705", "\uB705"], /* Hangul Syllable */ + ["\uB706", "\uB706"], /* Hangul Syllable */ + ["\uB707", "\uB707"], /* Hangul Syllable */ + ["\uB708", "\uB708"], /* Hangul Syllable */ + ["\uB709", "\uB709"], /* Hangul Syllable */ + ["\uB70A", "\uB70A"], /* Hangul Syllable */ + ["\uB70B", "\uB70B"], /* Hangul Syllable */ + ["\uB70C", "\uB70C"], /* Hangul Syllable */ + ["\uB70D", "\uB70D"], /* Hangul Syllable */ + ["\uB70E", "\uB70E"], /* Hangul Syllable */ + ["\uB70F", "\uB70F"], /* Hangul Syllable */ + ["\uB710", "\uB710"], /* Hangul Syllable */ + ["\uB711", "\uB711"], /* Hangul Syllable */ + ["\uB712", "\uB712"], /* Hangul Syllable */ + ["\uB713", "\uB713"], /* Hangul Syllable */ + ["\uB714", "\uB714"], /* Hangul Syllable */ + ["\uB715", "\uB715"], /* Hangul Syllable */ + ["\uB716", "\uB716"], /* Hangul Syllable */ + ["\uB717", "\uB717"], /* Hangul Syllable */ + ["\uB718", "\uB718"], /* Hangul Syllable */ + ["\uB719", "\uB719"], /* Hangul Syllable */ + ["\uB71A", "\uB71A"], /* Hangul Syllable */ + ["\uB71B", "\uB71B"], /* Hangul Syllable */ + ["\uB71C", "\uB71C"], /* Hangul Syllable */ + ["\uB71D", "\uB71D"], /* Hangul Syllable */ + ["\uB71E", "\uB71E"], /* Hangul Syllable */ + ["\uB71F", "\uB71F"], /* Hangul Syllable */ + ["\uB720", "\uB720"], /* Hangul Syllable */ + ["\uB721", "\uB721"], /* Hangul Syllable */ + ["\uB722", "\uB722"], /* Hangul Syllable */ + ["\uB723", "\uB723"], /* Hangul Syllable */ + ["\uB724", "\uB724"], /* Hangul Syllable */ + ["\uB725", "\uB725"], /* Hangul Syllable */ + ["\uB726", "\uB726"], /* Hangul Syllable */ + ["\uB727", "\uB727"], /* Hangul Syllable */ + ["\uB728", "\uB728"], /* Hangul Syllable */ + ["\uB729", "\uB729"], /* Hangul Syllable */ + ["\uB72A", "\uB72A"], /* Hangul Syllable */ + ["\uB72B", "\uB72B"], /* Hangul Syllable */ + ["\uB72C", "\uB72C"], /* Hangul Syllable */ + ["\uB72D", "\uB72D"], /* Hangul Syllable */ + ["\uB72E", "\uB72E"], /* Hangul Syllable */ + ["\uB72F", "\uB72F"], /* Hangul Syllable */ + ["\uB730", "\uB730"], /* Hangul Syllable */ + ["\uB731", "\uB731"], /* Hangul Syllable */ + ["\uB732", "\uB732"], /* Hangul Syllable */ + ["\uB733", "\uB733"], /* Hangul Syllable */ + ["\uB734", "\uB734"], /* Hangul Syllable */ + ["\uB735", "\uB735"], /* Hangul Syllable */ + ["\uB736", "\uB736"], /* Hangul Syllable */ + ["\uB737", "\uB737"], /* Hangul Syllable */ + ["\uB738", "\uB738"], /* Hangul Syllable */ + ["\uB739", "\uB739"], /* Hangul Syllable */ + ["\uB73A", "\uB73A"], /* Hangul Syllable */ + ["\uB73B", "\uB73B"], /* Hangul Syllable */ + ["\uB73C", "\uB73C"], /* Hangul Syllable */ + ["\uB73D", "\uB73D"], /* Hangul Syllable */ + ["\uB73E", "\uB73E"], /* Hangul Syllable */ + ["\uB73F", "\uB73F"], /* Hangul Syllable */ + ["\uB740", "\uB740"], /* Hangul Syllable */ + ["\uB741", "\uB741"], /* Hangul Syllable */ + ["\uB742", "\uB742"], /* Hangul Syllable */ + ["\uB743", "\uB743"], /* Hangul Syllable */ + ["\uB744", "\uB744"], /* Hangul Syllable */ + ["\uB745", "\uB745"], /* Hangul Syllable */ + ["\uB746", "\uB746"], /* Hangul Syllable */ + ["\uB747", "\uB747"], /* Hangul Syllable */ + ["\uB748", "\uB748"], /* Hangul Syllable */ + ["\uB749", "\uB749"], /* Hangul Syllable */ + ["\uB74A", "\uB74A"], /* Hangul Syllable */ + ["\uB74B", "\uB74B"], /* Hangul Syllable */ + ["\uB74C", "\uB74C"], /* Hangul Syllable */ + ["\uB74D", "\uB74D"], /* Hangul Syllable */ + ["\uB74E", "\uB74E"], /* Hangul Syllable */ + ["\uB74F", "\uB74F"], /* Hangul Syllable */ + ["\uB750", "\uB750"], /* Hangul Syllable */ + ["\uB751", "\uB751"], /* Hangul Syllable */ + ["\uB752", "\uB752"], /* Hangul Syllable */ + ["\uB753", "\uB753"], /* Hangul Syllable */ + ["\uB754", "\uB754"], /* Hangul Syllable */ + ["\uB755", "\uB755"], /* Hangul Syllable */ + ["\uB756", "\uB756"], /* Hangul Syllable */ + ["\uB757", "\uB757"], /* Hangul Syllable */ + ["\uB758", "\uB758"], /* Hangul Syllable */ + ["\uB759", "\uB759"], /* Hangul Syllable */ + ["\uB75A", "\uB75A"], /* Hangul Syllable */ + ["\uB75B", "\uB75B"], /* Hangul Syllable */ + ["\uB75C", "\uB75C"], /* Hangul Syllable */ + ["\uB75D", "\uB75D"], /* Hangul Syllable */ + ["\uB75E", "\uB75E"], /* Hangul Syllable */ + ["\uB75F", "\uB75F"], /* Hangul Syllable */ + ["\uB760", "\uB760"], /* Hangul Syllable */ + ["\uB761", "\uB761"], /* Hangul Syllable */ + ["\uB762", "\uB762"], /* Hangul Syllable */ + ["\uB763", "\uB763"], /* Hangul Syllable */ + ["\uB764", "\uB764"], /* Hangul Syllable */ + ["\uB765", "\uB765"], /* Hangul Syllable */ + ["\uB766", "\uB766"], /* Hangul Syllable */ + ["\uB767", "\uB767"], /* Hangul Syllable */ + ["\uB768", "\uB768"], /* Hangul Syllable */ + ["\uB769", "\uB769"], /* Hangul Syllable */ + ["\uB76A", "\uB76A"], /* Hangul Syllable */ + ["\uB76B", "\uB76B"], /* Hangul Syllable */ + ["\uB76C", "\uB76C"], /* Hangul Syllable */ + ["\uB76D", "\uB76D"], /* Hangul Syllable */ + ["\uB76E", "\uB76E"], /* Hangul Syllable */ + ["\uB76F", "\uB76F"], /* Hangul Syllable */ + ["\uB770", "\uB770"], /* Hangul Syllable */ + ["\uB771", "\uB771"], /* Hangul Syllable */ + ["\uB772", "\uB772"], /* Hangul Syllable */ + ["\uB773", "\uB773"], /* Hangul Syllable */ + ["\uB774", "\uB774"], /* Hangul Syllable */ + ["\uB775", "\uB775"], /* Hangul Syllable */ + ["\uB776", "\uB776"], /* Hangul Syllable */ + ["\uB777", "\uB777"], /* Hangul Syllable */ + ["\uB778", "\uB778"], /* Hangul Syllable */ + ["\uB779", "\uB779"], /* Hangul Syllable */ + ["\uB77A", "\uB77A"], /* Hangul Syllable */ + ["\uB77B", "\uB77B"], /* Hangul Syllable */ + ["\uB77C", "\uB77C"], /* Hangul Syllable */ + ["\uB77D", "\uB77D"], /* Hangul Syllable */ + ["\uB77E", "\uB77E"], /* Hangul Syllable */ + ["\uB77F", "\uB77F"], /* Hangul Syllable */ + ["\uB780", "\uB780"], /* Hangul Syllable */ + ["\uB781", "\uB781"], /* Hangul Syllable */ + ["\uB782", "\uB782"], /* Hangul Syllable */ + ["\uB783", "\uB783"], /* Hangul Syllable */ + ["\uB784", "\uB784"], /* Hangul Syllable */ + ["\uB785", "\uB785"], /* Hangul Syllable */ + ["\uB786", "\uB786"], /* Hangul Syllable */ + ["\uB787", "\uB787"], /* Hangul Syllable */ + ["\uB788", "\uB788"], /* Hangul Syllable */ + ["\uB789", "\uB789"], /* Hangul Syllable */ + ["\uB78A", "\uB78A"], /* Hangul Syllable */ + ["\uB78B", "\uB78B"], /* Hangul Syllable */ + ["\uB78C", "\uB78C"], /* Hangul Syllable */ + ["\uB78D", "\uB78D"], /* Hangul Syllable */ + ["\uB78E", "\uB78E"], /* Hangul Syllable */ + ["\uB78F", "\uB78F"], /* Hangul Syllable */ + ["\uB790", "\uB790"], /* Hangul Syllable */ + ["\uB791", "\uB791"], /* Hangul Syllable */ + ["\uB792", "\uB792"], /* Hangul Syllable */ + ["\uB793", "\uB793"], /* Hangul Syllable */ + ["\uB794", "\uB794"], /* Hangul Syllable */ + ["\uB795", "\uB795"], /* Hangul Syllable */ + ["\uB796", "\uB796"], /* Hangul Syllable */ + ["\uB797", "\uB797"], /* Hangul Syllable */ + ["\uB798", "\uB798"], /* Hangul Syllable */ + ["\uB799", "\uB799"], /* Hangul Syllable */ + ["\uB79A", "\uB79A"], /* Hangul Syllable */ + ["\uB79B", "\uB79B"], /* Hangul Syllable */ + ["\uB79C", "\uB79C"], /* Hangul Syllable */ + ["\uB79D", "\uB79D"], /* Hangul Syllable */ + ["\uB79E", "\uB79E"], /* Hangul Syllable */ + ["\uB79F", "\uB79F"], /* Hangul Syllable */ + ["\uB7A0", "\uB7A0"], /* Hangul Syllable */ + ["\uB7A1", "\uB7A1"], /* Hangul Syllable */ + ["\uB7A2", "\uB7A2"], /* Hangul Syllable */ + ["\uB7A3", "\uB7A3"], /* Hangul Syllable */ + ["\uB7A4", "\uB7A4"], /* Hangul Syllable */ + ["\uB7A5", "\uB7A5"], /* Hangul Syllable */ + ["\uB7A6", "\uB7A6"], /* Hangul Syllable */ + ["\uB7A7", "\uB7A7"], /* Hangul Syllable */ + ["\uB7A8", "\uB7A8"], /* Hangul Syllable */ + ["\uB7A9", "\uB7A9"], /* Hangul Syllable */ + ["\uB7AA", "\uB7AA"], /* Hangul Syllable */ + ["\uB7AB", "\uB7AB"], /* Hangul Syllable */ + ["\uB7AC", "\uB7AC"], /* Hangul Syllable */ + ["\uB7AD", "\uB7AD"], /* Hangul Syllable */ + ["\uB7AE", "\uB7AE"], /* Hangul Syllable */ + ["\uB7AF", "\uB7AF"], /* Hangul Syllable */ + ["\uB7B0", "\uB7B0"], /* Hangul Syllable */ + ["\uB7B1", "\uB7B1"], /* Hangul Syllable */ + ["\uB7B2", "\uB7B2"], /* Hangul Syllable */ + ["\uB7B3", "\uB7B3"], /* Hangul Syllable */ + ["\uB7B4", "\uB7B4"], /* Hangul Syllable */ + ["\uB7B5", "\uB7B5"], /* Hangul Syllable */ + ["\uB7B6", "\uB7B6"], /* Hangul Syllable */ + ["\uB7B7", "\uB7B7"], /* Hangul Syllable */ + ["\uB7B8", "\uB7B8"], /* Hangul Syllable */ + ["\uB7B9", "\uB7B9"], /* Hangul Syllable */ + ["\uB7BA", "\uB7BA"], /* Hangul Syllable */ + ["\uB7BB", "\uB7BB"], /* Hangul Syllable */ + ["\uB7BC", "\uB7BC"], /* Hangul Syllable */ + ["\uB7BD", "\uB7BD"], /* Hangul Syllable */ + ["\uB7BE", "\uB7BE"], /* Hangul Syllable */ + ["\uB7BF", "\uB7BF"], /* Hangul Syllable */ + ["\uB7C0", "\uB7C0"], /* Hangul Syllable */ + ["\uB7C1", "\uB7C1"], /* Hangul Syllable */ + ["\uB7C2", "\uB7C2"], /* Hangul Syllable */ + ["\uB7C3", "\uB7C3"], /* Hangul Syllable */ + ["\uB7C4", "\uB7C4"], /* Hangul Syllable */ + ["\uB7C5", "\uB7C5"], /* Hangul Syllable */ + ["\uB7C6", "\uB7C6"], /* Hangul Syllable */ + ["\uB7C7", "\uB7C7"], /* Hangul Syllable */ + ["\uB7C8", "\uB7C8"], /* Hangul Syllable */ + ["\uB7C9", "\uB7C9"], /* Hangul Syllable */ + ["\uB7CA", "\uB7CA"], /* Hangul Syllable */ + ["\uB7CB", "\uB7CB"], /* Hangul Syllable */ + ["\uB7CC", "\uB7CC"], /* Hangul Syllable */ + ["\uB7CD", "\uB7CD"], /* Hangul Syllable */ + ["\uB7CE", "\uB7CE"], /* Hangul Syllable */ + ["\uB7CF", "\uB7CF"], /* Hangul Syllable */ + ["\uB7D0", "\uB7D0"], /* Hangul Syllable */ + ["\uB7D1", "\uB7D1"], /* Hangul Syllable */ + ["\uB7D2", "\uB7D2"], /* Hangul Syllable */ + ["\uB7D3", "\uB7D3"], /* Hangul Syllable */ + ["\uB7D4", "\uB7D4"], /* Hangul Syllable */ + ["\uB7D5", "\uB7D5"], /* Hangul Syllable */ + ["\uB7D6", "\uB7D6"], /* Hangul Syllable */ + ["\uB7D7", "\uB7D7"], /* Hangul Syllable */ + ["\uB7D8", "\uB7D8"], /* Hangul Syllable */ + ["\uB7D9", "\uB7D9"], /* Hangul Syllable */ + ["\uB7DA", "\uB7DA"], /* Hangul Syllable */ + ["\uB7DB", "\uB7DB"], /* Hangul Syllable */ + ["\uB7DC", "\uB7DC"], /* Hangul Syllable */ + ["\uB7DD", "\uB7DD"], /* Hangul Syllable */ + ["\uB7DE", "\uB7DE"], /* Hangul Syllable */ + ["\uB7DF", "\uB7DF"], /* Hangul Syllable */ + ["\uB7E0", "\uB7E0"], /* Hangul Syllable */ + ["\uB7E1", "\uB7E1"], /* Hangul Syllable */ + ["\uB7E2", "\uB7E2"], /* Hangul Syllable */ + ["\uB7E3", "\uB7E3"], /* Hangul Syllable */ + ["\uB7E4", "\uB7E4"], /* Hangul Syllable */ + ["\uB7E5", "\uB7E5"], /* Hangul Syllable */ + ["\uB7E6", "\uB7E6"], /* Hangul Syllable */ + ["\uB7E7", "\uB7E7"], /* Hangul Syllable */ + ["\uB7E8", "\uB7E8"], /* Hangul Syllable */ + ["\uB7E9", "\uB7E9"], /* Hangul Syllable */ + ["\uB7EA", "\uB7EA"], /* Hangul Syllable */ + ["\uB7EB", "\uB7EB"], /* Hangul Syllable */ + ["\uB7EC", "\uB7EC"], /* Hangul Syllable */ + ["\uB7ED", "\uB7ED"], /* Hangul Syllable */ + ["\uB7EE", "\uB7EE"], /* Hangul Syllable */ + ["\uB7EF", "\uB7EF"], /* Hangul Syllable */ + ["\uB7F0", "\uB7F0"], /* Hangul Syllable */ + ["\uB7F1", "\uB7F1"], /* Hangul Syllable */ + ["\uB7F2", "\uB7F2"], /* Hangul Syllable */ + ["\uB7F3", "\uB7F3"], /* Hangul Syllable */ + ["\uB7F4", "\uB7F4"], /* Hangul Syllable */ + ["\uB7F5", "\uB7F5"], /* Hangul Syllable */ + ["\uB7F6", "\uB7F6"], /* Hangul Syllable */ + ["\uB7F7", "\uB7F7"], /* Hangul Syllable */ + ["\uB7F8", "\uB7F8"], /* Hangul Syllable */ + ["\uB7F9", "\uB7F9"], /* Hangul Syllable */ + ["\uB7FA", "\uB7FA"], /* Hangul Syllable */ + ["\uB7FB", "\uB7FB"], /* Hangul Syllable */ + ["\uB7FC", "\uB7FC"], /* Hangul Syllable */ + ["\uB7FD", "\uB7FD"], /* Hangul Syllable */ + ["\uB7FE", "\uB7FE"], /* Hangul Syllable */ + ["\uB7FF", "\uB7FF"], /* Hangul Syllable */ + ["\uB800", "\uB800"], /* Hangul Syllable */ + ["\uB801", "\uB801"], /* Hangul Syllable */ + ["\uB802", "\uB802"], /* Hangul Syllable */ + ["\uB803", "\uB803"], /* Hangul Syllable */ + ["\uB804", "\uB804"], /* Hangul Syllable */ + ["\uB805", "\uB805"], /* Hangul Syllable */ + ["\uB806", "\uB806"], /* Hangul Syllable */ + ["\uB807", "\uB807"], /* Hangul Syllable */ + ["\uB808", "\uB808"], /* Hangul Syllable */ + ["\uB809", "\uB809"], /* Hangul Syllable */ + ["\uB80A", "\uB80A"], /* Hangul Syllable */ + ["\uB80B", "\uB80B"], /* Hangul Syllable */ + ["\uB80C", "\uB80C"], /* Hangul Syllable */ + ["\uB80D", "\uB80D"], /* Hangul Syllable */ + ["\uB80E", "\uB80E"], /* Hangul Syllable */ + ["\uB80F", "\uB80F"], /* Hangul Syllable */ + ["\uB810", "\uB810"], /* Hangul Syllable */ + ["\uB811", "\uB811"], /* Hangul Syllable */ + ["\uB812", "\uB812"], /* Hangul Syllable */ + ["\uB813", "\uB813"], /* Hangul Syllable */ + ["\uB814", "\uB814"], /* Hangul Syllable */ + ["\uB815", "\uB815"], /* Hangul Syllable */ + ["\uB816", "\uB816"], /* Hangul Syllable */ + ["\uB817", "\uB817"], /* Hangul Syllable */ + ["\uB818", "\uB818"], /* Hangul Syllable */ + ["\uB819", "\uB819"], /* Hangul Syllable */ + ["\uB81A", "\uB81A"], /* Hangul Syllable */ + ["\uB81B", "\uB81B"], /* Hangul Syllable */ + ["\uB81C", "\uB81C"], /* Hangul Syllable */ + ["\uB81D", "\uB81D"], /* Hangul Syllable */ + ["\uB81E", "\uB81E"], /* Hangul Syllable */ + ["\uB81F", "\uB81F"], /* Hangul Syllable */ + ["\uB820", "\uB820"], /* Hangul Syllable */ + ["\uB821", "\uB821"], /* Hangul Syllable */ + ["\uB822", "\uB822"], /* Hangul Syllable */ + ["\uB823", "\uB823"], /* Hangul Syllable */ + ["\uB824", "\uB824"], /* Hangul Syllable */ + ["\uB825", "\uB825"], /* Hangul Syllable */ + ["\uB826", "\uB826"], /* Hangul Syllable */ + ["\uB827", "\uB827"], /* Hangul Syllable */ + ["\uB828", "\uB828"], /* Hangul Syllable */ + ["\uB829", "\uB829"], /* Hangul Syllable */ + ["\uB82A", "\uB82A"], /* Hangul Syllable */ + ["\uB82B", "\uB82B"], /* Hangul Syllable */ + ["\uB82C", "\uB82C"], /* Hangul Syllable */ + ["\uB82D", "\uB82D"], /* Hangul Syllable */ + ["\uB82E", "\uB82E"], /* Hangul Syllable */ + ["\uB82F", "\uB82F"], /* Hangul Syllable */ + ["\uB830", "\uB830"], /* Hangul Syllable */ + ["\uB831", "\uB831"], /* Hangul Syllable */ + ["\uB832", "\uB832"], /* Hangul Syllable */ + ["\uB833", "\uB833"], /* Hangul Syllable */ + ["\uB834", "\uB834"], /* Hangul Syllable */ + ["\uB835", "\uB835"], /* Hangul Syllable */ + ["\uB836", "\uB836"], /* Hangul Syllable */ + ["\uB837", "\uB837"], /* Hangul Syllable */ + ["\uB838", "\uB838"], /* Hangul Syllable */ + ["\uB839", "\uB839"], /* Hangul Syllable */ + ["\uB83A", "\uB83A"], /* Hangul Syllable */ + ["\uB83B", "\uB83B"], /* Hangul Syllable */ + ["\uB83C", "\uB83C"], /* Hangul Syllable */ + ["\uB83D", "\uB83D"], /* Hangul Syllable */ + ["\uB83E", "\uB83E"], /* Hangul Syllable */ + ["\uB83F", "\uB83F"], /* Hangul Syllable */ + ["\uB840", "\uB840"], /* Hangul Syllable */ + ["\uB841", "\uB841"], /* Hangul Syllable */ + ["\uB842", "\uB842"], /* Hangul Syllable */ + ["\uB843", "\uB843"], /* Hangul Syllable */ + ["\uB844", "\uB844"], /* Hangul Syllable */ + ["\uB845", "\uB845"], /* Hangul Syllable */ + ["\uB846", "\uB846"], /* Hangul Syllable */ + ["\uB847", "\uB847"], /* Hangul Syllable */ + ["\uB848", "\uB848"], /* Hangul Syllable */ + ["\uB849", "\uB849"], /* Hangul Syllable */ + ["\uB84A", "\uB84A"], /* Hangul Syllable */ + ["\uB84B", "\uB84B"], /* Hangul Syllable */ + ["\uB84C", "\uB84C"], /* Hangul Syllable */ + ["\uB84D", "\uB84D"], /* Hangul Syllable */ + ["\uB84E", "\uB84E"], /* Hangul Syllable */ + ["\uB84F", "\uB84F"], /* Hangul Syllable */ + ["\uB850", "\uB850"], /* Hangul Syllable */ + ["\uB851", "\uB851"], /* Hangul Syllable */ + ["\uB852", "\uB852"], /* Hangul Syllable */ + ["\uB853", "\uB853"], /* Hangul Syllable */ + ["\uB854", "\uB854"], /* Hangul Syllable */ + ["\uB855", "\uB855"], /* Hangul Syllable */ + ["\uB856", "\uB856"], /* Hangul Syllable */ + ["\uB857", "\uB857"], /* Hangul Syllable */ + ["\uB858", "\uB858"], /* Hangul Syllable */ + ["\uB859", "\uB859"], /* Hangul Syllable */ + ["\uB85A", "\uB85A"], /* Hangul Syllable */ + ["\uB85B", "\uB85B"], /* Hangul Syllable */ + ["\uB85C", "\uB85C"], /* Hangul Syllable */ + ["\uB85D", "\uB85D"], /* Hangul Syllable */ + ["\uB85E", "\uB85E"], /* Hangul Syllable */ + ["\uB85F", "\uB85F"], /* Hangul Syllable */ + ["\uB860", "\uB860"], /* Hangul Syllable */ + ["\uB861", "\uB861"], /* Hangul Syllable */ + ["\uB862", "\uB862"], /* Hangul Syllable */ + ["\uB863", "\uB863"], /* Hangul Syllable */ + ["\uB864", "\uB864"], /* Hangul Syllable */ + ["\uB865", "\uB865"], /* Hangul Syllable */ + ["\uB866", "\uB866"], /* Hangul Syllable */ + ["\uB867", "\uB867"], /* Hangul Syllable */ + ["\uB868", "\uB868"], /* Hangul Syllable */ + ["\uB869", "\uB869"], /* Hangul Syllable */ + ["\uB86A", "\uB86A"], /* Hangul Syllable */ + ["\uB86B", "\uB86B"], /* Hangul Syllable */ + ["\uB86C", "\uB86C"], /* Hangul Syllable */ + ["\uB86D", "\uB86D"], /* Hangul Syllable */ + ["\uB86E", "\uB86E"], /* Hangul Syllable */ + ["\uB86F", "\uB86F"], /* Hangul Syllable */ + ["\uB870", "\uB870"], /* Hangul Syllable */ + ["\uB871", "\uB871"], /* Hangul Syllable */ + ["\uB872", "\uB872"], /* Hangul Syllable */ + ["\uB873", "\uB873"], /* Hangul Syllable */ + ["\uB874", "\uB874"], /* Hangul Syllable */ + ["\uB875", "\uB875"], /* Hangul Syllable */ + ["\uB876", "\uB876"], /* Hangul Syllable */ + ["\uB877", "\uB877"], /* Hangul Syllable */ + ["\uB878", "\uB878"], /* Hangul Syllable */ + ["\uB879", "\uB879"], /* Hangul Syllable */ + ["\uB87A", "\uB87A"], /* Hangul Syllable */ + ["\uB87B", "\uB87B"], /* Hangul Syllable */ + ["\uB87C", "\uB87C"], /* Hangul Syllable */ + ["\uB87D", "\uB87D"], /* Hangul Syllable */ + ["\uB87E", "\uB87E"], /* Hangul Syllable */ + ["\uB87F", "\uB87F"], /* Hangul Syllable */ + ["\uB880", "\uB880"], /* Hangul Syllable */ + ["\uB881", "\uB881"], /* Hangul Syllable */ + ["\uB882", "\uB882"], /* Hangul Syllable */ + ["\uB883", "\uB883"], /* Hangul Syllable */ + ["\uB884", "\uB884"], /* Hangul Syllable */ + ["\uB885", "\uB885"], /* Hangul Syllable */ + ["\uB886", "\uB886"], /* Hangul Syllable */ + ["\uB887", "\uB887"], /* Hangul Syllable */ + ["\uB888", "\uB888"], /* Hangul Syllable */ + ["\uB889", "\uB889"], /* Hangul Syllable */ + ["\uB88A", "\uB88A"], /* Hangul Syllable */ + ["\uB88B", "\uB88B"], /* Hangul Syllable */ + ["\uB88C", "\uB88C"], /* Hangul Syllable */ + ["\uB88D", "\uB88D"], /* Hangul Syllable */ + ["\uB88E", "\uB88E"], /* Hangul Syllable */ + ["\uB88F", "\uB88F"], /* Hangul Syllable */ + ["\uB890", "\uB890"], /* Hangul Syllable */ + ["\uB891", "\uB891"], /* Hangul Syllable */ + ["\uB892", "\uB892"], /* Hangul Syllable */ + ["\uB893", "\uB893"], /* Hangul Syllable */ + ["\uB894", "\uB894"], /* Hangul Syllable */ + ["\uB895", "\uB895"], /* Hangul Syllable */ + ["\uB896", "\uB896"], /* Hangul Syllable */ + ["\uB897", "\uB897"], /* Hangul Syllable */ + ["\uB898", "\uB898"], /* Hangul Syllable */ + ["\uB899", "\uB899"], /* Hangul Syllable */ + ["\uB89A", "\uB89A"], /* Hangul Syllable */ + ["\uB89B", "\uB89B"], /* Hangul Syllable */ + ["\uB89C", "\uB89C"], /* Hangul Syllable */ + ["\uB89D", "\uB89D"], /* Hangul Syllable */ + ["\uB89E", "\uB89E"], /* Hangul Syllable */ + ["\uB89F", "\uB89F"], /* Hangul Syllable */ + ["\uB8A0", "\uB8A0"], /* Hangul Syllable */ + ["\uB8A1", "\uB8A1"], /* Hangul Syllable */ + ["\uB8A2", "\uB8A2"], /* Hangul Syllable */ + ["\uB8A3", "\uB8A3"], /* Hangul Syllable */ + ["\uB8A4", "\uB8A4"], /* Hangul Syllable */ + ["\uB8A5", "\uB8A5"], /* Hangul Syllable */ + ["\uB8A6", "\uB8A6"], /* Hangul Syllable */ + ["\uB8A7", "\uB8A7"], /* Hangul Syllable */ + ["\uB8A8", "\uB8A8"], /* Hangul Syllable */ + ["\uB8A9", "\uB8A9"], /* Hangul Syllable */ + ["\uB8AA", "\uB8AA"], /* Hangul Syllable */ + ["\uB8AB", "\uB8AB"], /* Hangul Syllable */ + ["\uB8AC", "\uB8AC"], /* Hangul Syllable */ + ["\uB8AD", "\uB8AD"], /* Hangul Syllable */ + ["\uB8AE", "\uB8AE"], /* Hangul Syllable */ + ["\uB8AF", "\uB8AF"], /* Hangul Syllable */ + ["\uB8B0", "\uB8B0"], /* Hangul Syllable */ + ["\uB8B1", "\uB8B1"], /* Hangul Syllable */ + ["\uB8B2", "\uB8B2"], /* Hangul Syllable */ + ["\uB8B3", "\uB8B3"], /* Hangul Syllable */ + ["\uB8B4", "\uB8B4"], /* Hangul Syllable */ + ["\uB8B5", "\uB8B5"], /* Hangul Syllable */ + ["\uB8B6", "\uB8B6"], /* Hangul Syllable */ + ["\uB8B7", "\uB8B7"], /* Hangul Syllable */ + ["\uB8B8", "\uB8B8"], /* Hangul Syllable */ + ["\uB8B9", "\uB8B9"], /* Hangul Syllable */ + ["\uB8BA", "\uB8BA"], /* Hangul Syllable */ + ["\uB8BB", "\uB8BB"], /* Hangul Syllable */ + ["\uB8BC", "\uB8BC"], /* Hangul Syllable */ + ["\uB8BD", "\uB8BD"], /* Hangul Syllable */ + ["\uB8BE", "\uB8BE"], /* Hangul Syllable */ + ["\uB8BF", "\uB8BF"], /* Hangul Syllable */ + ["\uB8C0", "\uB8C0"], /* Hangul Syllable */ + ["\uB8C1", "\uB8C1"], /* Hangul Syllable */ + ["\uB8C2", "\uB8C2"], /* Hangul Syllable */ + ["\uB8C3", "\uB8C3"], /* Hangul Syllable */ + ["\uB8C4", "\uB8C4"], /* Hangul Syllable */ + ["\uB8C5", "\uB8C5"], /* Hangul Syllable */ + ["\uB8C6", "\uB8C6"], /* Hangul Syllable */ + ["\uB8C7", "\uB8C7"], /* Hangul Syllable */ + ["\uB8C8", "\uB8C8"], /* Hangul Syllable */ + ["\uB8C9", "\uB8C9"], /* Hangul Syllable */ + ["\uB8CA", "\uB8CA"], /* Hangul Syllable */ + ["\uB8CB", "\uB8CB"], /* Hangul Syllable */ + ["\uB8CC", "\uB8CC"], /* Hangul Syllable */ + ["\uB8CD", "\uB8CD"], /* Hangul Syllable */ + ["\uB8CE", "\uB8CE"], /* Hangul Syllable */ + ["\uB8CF", "\uB8CF"], /* Hangul Syllable */ + ["\uB8D0", "\uB8D0"], /* Hangul Syllable */ + ["\uB8D1", "\uB8D1"], /* Hangul Syllable */ + ["\uB8D2", "\uB8D2"], /* Hangul Syllable */ + ["\uB8D3", "\uB8D3"], /* Hangul Syllable */ + ["\uB8D4", "\uB8D4"], /* Hangul Syllable */ + ["\uB8D5", "\uB8D5"], /* Hangul Syllable */ + ["\uB8D6", "\uB8D6"], /* Hangul Syllable */ + ["\uB8D7", "\uB8D7"], /* Hangul Syllable */ + ["\uB8D8", "\uB8D8"], /* Hangul Syllable */ + ["\uB8D9", "\uB8D9"], /* Hangul Syllable */ + ["\uB8DA", "\uB8DA"], /* Hangul Syllable */ + ["\uB8DB", "\uB8DB"], /* Hangul Syllable */ + ["\uB8DC", "\uB8DC"], /* Hangul Syllable */ + ["\uB8DD", "\uB8DD"], /* Hangul Syllable */ + ["\uB8DE", "\uB8DE"], /* Hangul Syllable */ + ["\uB8DF", "\uB8DF"], /* Hangul Syllable */ + ["\uB8E0", "\uB8E0"], /* Hangul Syllable */ + ["\uB8E1", "\uB8E1"], /* Hangul Syllable */ + ["\uB8E2", "\uB8E2"], /* Hangul Syllable */ + ["\uB8E3", "\uB8E3"], /* Hangul Syllable */ + ["\uB8E4", "\uB8E4"], /* Hangul Syllable */ + ["\uB8E5", "\uB8E5"], /* Hangul Syllable */ + ["\uB8E6", "\uB8E6"], /* Hangul Syllable */ + ["\uB8E7", "\uB8E7"], /* Hangul Syllable */ + ["\uB8E8", "\uB8E8"], /* Hangul Syllable */ + ["\uB8E9", "\uB8E9"], /* Hangul Syllable */ + ["\uB8EA", "\uB8EA"], /* Hangul Syllable */ + ["\uB8EB", "\uB8EB"], /* Hangul Syllable */ + ["\uB8EC", "\uB8EC"], /* Hangul Syllable */ + ["\uB8ED", "\uB8ED"], /* Hangul Syllable */ + ["\uB8EE", "\uB8EE"], /* Hangul Syllable */ + ["\uB8EF", "\uB8EF"], /* Hangul Syllable */ + ["\uB8F0", "\uB8F0"], /* Hangul Syllable */ + ["\uB8F1", "\uB8F1"], /* Hangul Syllable */ + ["\uB8F2", "\uB8F2"], /* Hangul Syllable */ + ["\uB8F3", "\uB8F3"], /* Hangul Syllable */ + ["\uB8F4", "\uB8F4"], /* Hangul Syllable */ + ["\uB8F5", "\uB8F5"], /* Hangul Syllable */ + ["\uB8F6", "\uB8F6"], /* Hangul Syllable */ + ["\uB8F7", "\uB8F7"], /* Hangul Syllable */ + ["\uB8F8", "\uB8F8"], /* Hangul Syllable */ + ["\uB8F9", "\uB8F9"], /* Hangul Syllable */ + ["\uB8FA", "\uB8FA"], /* Hangul Syllable */ + ["\uB8FB", "\uB8FB"], /* Hangul Syllable */ + ["\uB8FC", "\uB8FC"], /* Hangul Syllable */ + ["\uB8FD", "\uB8FD"], /* Hangul Syllable */ + ["\uB8FE", "\uB8FE"], /* Hangul Syllable */ + ["\uB8FF", "\uB8FF"], /* Hangul Syllable */ + ["\uB900", "\uB900"], /* Hangul Syllable */ + ["\uB901", "\uB901"], /* Hangul Syllable */ + ["\uB902", "\uB902"], /* Hangul Syllable */ + ["\uB903", "\uB903"], /* Hangul Syllable */ + ["\uB904", "\uB904"], /* Hangul Syllable */ + ["\uB905", "\uB905"], /* Hangul Syllable */ + ["\uB906", "\uB906"], /* Hangul Syllable */ + ["\uB907", "\uB907"], /* Hangul Syllable */ + ["\uB908", "\uB908"], /* Hangul Syllable */ + ["\uB909", "\uB909"], /* Hangul Syllable */ + ["\uB90A", "\uB90A"], /* Hangul Syllable */ + ["\uB90B", "\uB90B"], /* Hangul Syllable */ + ["\uB90C", "\uB90C"], /* Hangul Syllable */ + ["\uB90D", "\uB90D"], /* Hangul Syllable */ + ["\uB90E", "\uB90E"], /* Hangul Syllable */ + ["\uB90F", "\uB90F"], /* Hangul Syllable */ + ["\uB910", "\uB910"], /* Hangul Syllable */ + ["\uB911", "\uB911"], /* Hangul Syllable */ + ["\uB912", "\uB912"], /* Hangul Syllable */ + ["\uB913", "\uB913"], /* Hangul Syllable */ + ["\uB914", "\uB914"], /* Hangul Syllable */ + ["\uB915", "\uB915"], /* Hangul Syllable */ + ["\uB916", "\uB916"], /* Hangul Syllable */ + ["\uB917", "\uB917"], /* Hangul Syllable */ + ["\uB918", "\uB918"], /* Hangul Syllable */ + ["\uB919", "\uB919"], /* Hangul Syllable */ + ["\uB91A", "\uB91A"], /* Hangul Syllable */ + ["\uB91B", "\uB91B"], /* Hangul Syllable */ + ["\uB91C", "\uB91C"], /* Hangul Syllable */ + ["\uB91D", "\uB91D"], /* Hangul Syllable */ + ["\uB91E", "\uB91E"], /* Hangul Syllable */ + ["\uB91F", "\uB91F"], /* Hangul Syllable */ + ["\uB920", "\uB920"], /* Hangul Syllable */ + ["\uB921", "\uB921"], /* Hangul Syllable */ + ["\uB922", "\uB922"], /* Hangul Syllable */ + ["\uB923", "\uB923"], /* Hangul Syllable */ + ["\uB924", "\uB924"], /* Hangul Syllable */ + ["\uB925", "\uB925"], /* Hangul Syllable */ + ["\uB926", "\uB926"], /* Hangul Syllable */ + ["\uB927", "\uB927"], /* Hangul Syllable */ + ["\uB928", "\uB928"], /* Hangul Syllable */ + ["\uB929", "\uB929"], /* Hangul Syllable */ + ["\uB92A", "\uB92A"], /* Hangul Syllable */ + ["\uB92B", "\uB92B"], /* Hangul Syllable */ + ["\uB92C", "\uB92C"], /* Hangul Syllable */ + ["\uB92D", "\uB92D"], /* Hangul Syllable */ + ["\uB92E", "\uB92E"], /* Hangul Syllable */ + ["\uB92F", "\uB92F"], /* Hangul Syllable */ + ["\uB930", "\uB930"], /* Hangul Syllable */ + ["\uB931", "\uB931"], /* Hangul Syllable */ + ["\uB932", "\uB932"], /* Hangul Syllable */ + ["\uB933", "\uB933"], /* Hangul Syllable */ + ["\uB934", "\uB934"], /* Hangul Syllable */ + ["\uB935", "\uB935"], /* Hangul Syllable */ + ["\uB936", "\uB936"], /* Hangul Syllable */ + ["\uB937", "\uB937"], /* Hangul Syllable */ + ["\uB938", "\uB938"], /* Hangul Syllable */ + ["\uB939", "\uB939"], /* Hangul Syllable */ + ["\uB93A", "\uB93A"], /* Hangul Syllable */ + ["\uB93B", "\uB93B"], /* Hangul Syllable */ + ["\uB93C", "\uB93C"], /* Hangul Syllable */ + ["\uB93D", "\uB93D"], /* Hangul Syllable */ + ["\uB93E", "\uB93E"], /* Hangul Syllable */ + ["\uB93F", "\uB93F"], /* Hangul Syllable */ + ["\uB940", "\uB940"], /* Hangul Syllable */ + ["\uB941", "\uB941"], /* Hangul Syllable */ + ["\uB942", "\uB942"], /* Hangul Syllable */ + ["\uB943", "\uB943"], /* Hangul Syllable */ + ["\uB944", "\uB944"], /* Hangul Syllable */ + ["\uB945", "\uB945"], /* Hangul Syllable */ + ["\uB946", "\uB946"], /* Hangul Syllable */ + ["\uB947", "\uB947"], /* Hangul Syllable */ + ["\uB948", "\uB948"], /* Hangul Syllable */ + ["\uB949", "\uB949"], /* Hangul Syllable */ + ["\uB94A", "\uB94A"], /* Hangul Syllable */ + ["\uB94B", "\uB94B"], /* Hangul Syllable */ + ["\uB94C", "\uB94C"], /* Hangul Syllable */ + ["\uB94D", "\uB94D"], /* Hangul Syllable */ + ["\uB94E", "\uB94E"], /* Hangul Syllable */ + ["\uB94F", "\uB94F"], /* Hangul Syllable */ + ["\uB950", "\uB950"], /* Hangul Syllable */ + ["\uB951", "\uB951"], /* Hangul Syllable */ + ["\uB952", "\uB952"], /* Hangul Syllable */ + ["\uB953", "\uB953"], /* Hangul Syllable */ + ["\uB954", "\uB954"], /* Hangul Syllable */ + ["\uB955", "\uB955"], /* Hangul Syllable */ + ["\uB956", "\uB956"], /* Hangul Syllable */ + ["\uB957", "\uB957"], /* Hangul Syllable */ + ["\uB958", "\uB958"], /* Hangul Syllable */ + ["\uB959", "\uB959"], /* Hangul Syllable */ + ["\uB95A", "\uB95A"], /* Hangul Syllable */ + ["\uB95B", "\uB95B"], /* Hangul Syllable */ + ["\uB95C", "\uB95C"], /* Hangul Syllable */ + ["\uB95D", "\uB95D"], /* Hangul Syllable */ + ["\uB95E", "\uB95E"], /* Hangul Syllable */ + ["\uB95F", "\uB95F"], /* Hangul Syllable */ + ["\uB960", "\uB960"], /* Hangul Syllable */ + ["\uB961", "\uB961"], /* Hangul Syllable */ + ["\uB962", "\uB962"], /* Hangul Syllable */ + ["\uB963", "\uB963"], /* Hangul Syllable */ + ["\uB964", "\uB964"], /* Hangul Syllable */ + ["\uB965", "\uB965"], /* Hangul Syllable */ + ["\uB966", "\uB966"], /* Hangul Syllable */ + ["\uB967", "\uB967"], /* Hangul Syllable */ + ["\uB968", "\uB968"], /* Hangul Syllable */ + ["\uB969", "\uB969"], /* Hangul Syllable */ + ["\uB96A", "\uB96A"], /* Hangul Syllable */ + ["\uB96B", "\uB96B"], /* Hangul Syllable */ + ["\uB96C", "\uB96C"], /* Hangul Syllable */ + ["\uB96D", "\uB96D"], /* Hangul Syllable */ + ["\uB96E", "\uB96E"], /* Hangul Syllable */ + ["\uB96F", "\uB96F"], /* Hangul Syllable */ + ["\uB970", "\uB970"], /* Hangul Syllable */ + ["\uB971", "\uB971"], /* Hangul Syllable */ + ["\uB972", "\uB972"], /* Hangul Syllable */ + ["\uB973", "\uB973"], /* Hangul Syllable */ + ["\uB974", "\uB974"], /* Hangul Syllable */ + ["\uB975", "\uB975"], /* Hangul Syllable */ + ["\uB976", "\uB976"], /* Hangul Syllable */ + ["\uB977", "\uB977"], /* Hangul Syllable */ + ["\uB978", "\uB978"], /* Hangul Syllable */ + ["\uB979", "\uB979"], /* Hangul Syllable */ + ["\uB97A", "\uB97A"], /* Hangul Syllable */ + ["\uB97B", "\uB97B"], /* Hangul Syllable */ + ["\uB97C", "\uB97C"], /* Hangul Syllable */ + ["\uB97D", "\uB97D"], /* Hangul Syllable */ + ["\uB97E", "\uB97E"], /* Hangul Syllable */ + ["\uB97F", "\uB97F"], /* Hangul Syllable */ + ["\uB980", "\uB980"], /* Hangul Syllable */ + ["\uB981", "\uB981"], /* Hangul Syllable */ + ["\uB982", "\uB982"], /* Hangul Syllable */ + ["\uB983", "\uB983"], /* Hangul Syllable */ + ["\uB984", "\uB984"], /* Hangul Syllable */ + ["\uB985", "\uB985"], /* Hangul Syllable */ + ["\uB986", "\uB986"], /* Hangul Syllable */ + ["\uB987", "\uB987"], /* Hangul Syllable */ + ["\uB988", "\uB988"], /* Hangul Syllable */ + ["\uB989", "\uB989"], /* Hangul Syllable */ + ["\uB98A", "\uB98A"], /* Hangul Syllable */ + ["\uB98B", "\uB98B"], /* Hangul Syllable */ + ["\uB98C", "\uB98C"], /* Hangul Syllable */ + ["\uB98D", "\uB98D"], /* Hangul Syllable */ + ["\uB98E", "\uB98E"], /* Hangul Syllable */ + ["\uB98F", "\uB98F"], /* Hangul Syllable */ + ["\uB990", "\uB990"], /* Hangul Syllable */ + ["\uB991", "\uB991"], /* Hangul Syllable */ + ["\uB992", "\uB992"], /* Hangul Syllable */ + ["\uB993", "\uB993"], /* Hangul Syllable */ + ["\uB994", "\uB994"], /* Hangul Syllable */ + ["\uB995", "\uB995"], /* Hangul Syllable */ + ["\uB996", "\uB996"], /* Hangul Syllable */ + ["\uB997", "\uB997"], /* Hangul Syllable */ + ["\uB998", "\uB998"], /* Hangul Syllable */ + ["\uB999", "\uB999"], /* Hangul Syllable */ + ["\uB99A", "\uB99A"], /* Hangul Syllable */ + ["\uB99B", "\uB99B"], /* Hangul Syllable */ + ["\uB99C", "\uB99C"], /* Hangul Syllable */ + ["\uB99D", "\uB99D"], /* Hangul Syllable */ + ["\uB99E", "\uB99E"], /* Hangul Syllable */ + ["\uB99F", "\uB99F"], /* Hangul Syllable */ + ["\uB9A0", "\uB9A0"], /* Hangul Syllable */ + ["\uB9A1", "\uB9A1"], /* Hangul Syllable */ + ["\uB9A2", "\uB9A2"], /* Hangul Syllable */ + ["\uB9A3", "\uB9A3"], /* Hangul Syllable */ + ["\uB9A4", "\uB9A4"], /* Hangul Syllable */ + ["\uB9A5", "\uB9A5"], /* Hangul Syllable */ + ["\uB9A6", "\uB9A6"], /* Hangul Syllable */ + ["\uB9A7", "\uB9A7"], /* Hangul Syllable */ + ["\uB9A8", "\uB9A8"], /* Hangul Syllable */ + ["\uB9A9", "\uB9A9"], /* Hangul Syllable */ + ["\uB9AA", "\uB9AA"], /* Hangul Syllable */ + ["\uB9AB", "\uB9AB"], /* Hangul Syllable */ + ["\uB9AC", "\uB9AC"], /* Hangul Syllable */ + ["\uB9AD", "\uB9AD"], /* Hangul Syllable */ + ["\uB9AE", "\uB9AE"], /* Hangul Syllable */ + ["\uB9AF", "\uB9AF"], /* Hangul Syllable */ + ["\uB9B0", "\uB9B0"], /* Hangul Syllable */ + ["\uB9B1", "\uB9B1"], /* Hangul Syllable */ + ["\uB9B2", "\uB9B2"], /* Hangul Syllable */ + ["\uB9B3", "\uB9B3"], /* Hangul Syllable */ + ["\uB9B4", "\uB9B4"], /* Hangul Syllable */ + ["\uB9B5", "\uB9B5"], /* Hangul Syllable */ + ["\uB9B6", "\uB9B6"], /* Hangul Syllable */ + ["\uB9B7", "\uB9B7"], /* Hangul Syllable */ + ["\uB9B8", "\uB9B8"], /* Hangul Syllable */ + ["\uB9B9", "\uB9B9"], /* Hangul Syllable */ + ["\uB9BA", "\uB9BA"], /* Hangul Syllable */ + ["\uB9BB", "\uB9BB"], /* Hangul Syllable */ + ["\uB9BC", "\uB9BC"], /* Hangul Syllable */ + ["\uB9BD", "\uB9BD"], /* Hangul Syllable */ + ["\uB9BE", "\uB9BE"], /* Hangul Syllable */ + ["\uB9BF", "\uB9BF"], /* Hangul Syllable */ + ["\uB9C0", "\uB9C0"], /* Hangul Syllable */ + ["\uB9C1", "\uB9C1"], /* Hangul Syllable */ + ["\uB9C2", "\uB9C2"], /* Hangul Syllable */ + ["\uB9C3", "\uB9C3"], /* Hangul Syllable */ + ["\uB9C4", "\uB9C4"], /* Hangul Syllable */ + ["\uB9C5", "\uB9C5"], /* Hangul Syllable */ + ["\uB9C6", "\uB9C6"], /* Hangul Syllable */ + ["\uB9C7", "\uB9C7"], /* Hangul Syllable */ + ["\uB9C8", "\uB9C8"], /* Hangul Syllable */ + ["\uB9C9", "\uB9C9"], /* Hangul Syllable */ + ["\uB9CA", "\uB9CA"], /* Hangul Syllable */ + ["\uB9CB", "\uB9CB"], /* Hangul Syllable */ + ["\uB9CC", "\uB9CC"], /* Hangul Syllable */ + ["\uB9CD", "\uB9CD"], /* Hangul Syllable */ + ["\uB9CE", "\uB9CE"], /* Hangul Syllable */ + ["\uB9CF", "\uB9CF"], /* Hangul Syllable */ + ["\uB9D0", "\uB9D0"], /* Hangul Syllable */ + ["\uB9D1", "\uB9D1"], /* Hangul Syllable */ + ["\uB9D2", "\uB9D2"], /* Hangul Syllable */ + ["\uB9D3", "\uB9D3"], /* Hangul Syllable */ + ["\uB9D4", "\uB9D4"], /* Hangul Syllable */ + ["\uB9D5", "\uB9D5"], /* Hangul Syllable */ + ["\uB9D6", "\uB9D6"], /* Hangul Syllable */ + ["\uB9D7", "\uB9D7"], /* Hangul Syllable */ + ["\uB9D8", "\uB9D8"], /* Hangul Syllable */ + ["\uB9D9", "\uB9D9"], /* Hangul Syllable */ + ["\uB9DA", "\uB9DA"], /* Hangul Syllable */ + ["\uB9DB", "\uB9DB"], /* Hangul Syllable */ + ["\uB9DC", "\uB9DC"], /* Hangul Syllable */ + ["\uB9DD", "\uB9DD"], /* Hangul Syllable */ + ["\uB9DE", "\uB9DE"], /* Hangul Syllable */ + ["\uB9DF", "\uB9DF"], /* Hangul Syllable */ + ["\uB9E0", "\uB9E0"], /* Hangul Syllable */ + ["\uB9E1", "\uB9E1"], /* Hangul Syllable */ + ["\uB9E2", "\uB9E2"], /* Hangul Syllable */ + ["\uB9E3", "\uB9E3"], /* Hangul Syllable */ + ["\uB9E4", "\uB9E4"], /* Hangul Syllable */ + ["\uB9E5", "\uB9E5"], /* Hangul Syllable */ + ["\uB9E6", "\uB9E6"], /* Hangul Syllable */ + ["\uB9E7", "\uB9E7"], /* Hangul Syllable */ + ["\uB9E8", "\uB9E8"], /* Hangul Syllable */ + ["\uB9E9", "\uB9E9"], /* Hangul Syllable */ + ["\uB9EA", "\uB9EA"], /* Hangul Syllable */ + ["\uB9EB", "\uB9EB"], /* Hangul Syllable */ + ["\uB9EC", "\uB9EC"], /* Hangul Syllable */ + ["\uB9ED", "\uB9ED"], /* Hangul Syllable */ + ["\uB9EE", "\uB9EE"], /* Hangul Syllable */ + ["\uB9EF", "\uB9EF"], /* Hangul Syllable */ + ["\uB9F0", "\uB9F0"], /* Hangul Syllable */ + ["\uB9F1", "\uB9F1"], /* Hangul Syllable */ + ["\uB9F2", "\uB9F2"], /* Hangul Syllable */ + ["\uB9F3", "\uB9F3"], /* Hangul Syllable */ + ["\uB9F4", "\uB9F4"], /* Hangul Syllable */ + ["\uB9F5", "\uB9F5"], /* Hangul Syllable */ + ["\uB9F6", "\uB9F6"], /* Hangul Syllable */ + ["\uB9F7", "\uB9F7"], /* Hangul Syllable */ + ["\uB9F8", "\uB9F8"], /* Hangul Syllable */ + ["\uB9F9", "\uB9F9"], /* Hangul Syllable */ + ["\uB9FA", "\uB9FA"], /* Hangul Syllable */ + ["\uB9FB", "\uB9FB"], /* Hangul Syllable */ + ["\uB9FC", "\uB9FC"], /* Hangul Syllable */ + ["\uB9FD", "\uB9FD"], /* Hangul Syllable */ + ["\uB9FE", "\uB9FE"], /* Hangul Syllable */ + ["\uB9FF", "\uB9FF"], /* Hangul Syllable */ + ["\uBA00", "\uBA00"], /* Hangul Syllable */ + ["\uBA01", "\uBA01"], /* Hangul Syllable */ + ["\uBA02", "\uBA02"], /* Hangul Syllable */ + ["\uBA03", "\uBA03"], /* Hangul Syllable */ + ["\uBA04", "\uBA04"], /* Hangul Syllable */ + ["\uBA05", "\uBA05"], /* Hangul Syllable */ + ["\uBA06", "\uBA06"], /* Hangul Syllable */ + ["\uBA07", "\uBA07"], /* Hangul Syllable */ + ["\uBA08", "\uBA08"], /* Hangul Syllable */ + ["\uBA09", "\uBA09"], /* Hangul Syllable */ + ["\uBA0A", "\uBA0A"], /* Hangul Syllable */ + ["\uBA0B", "\uBA0B"], /* Hangul Syllable */ + ["\uBA0C", "\uBA0C"], /* Hangul Syllable */ + ["\uBA0D", "\uBA0D"], /* Hangul Syllable */ + ["\uBA0E", "\uBA0E"], /* Hangul Syllable */ + ["\uBA0F", "\uBA0F"], /* Hangul Syllable */ + ["\uBA10", "\uBA10"], /* Hangul Syllable */ + ["\uBA11", "\uBA11"], /* Hangul Syllable */ + ["\uBA12", "\uBA12"], /* Hangul Syllable */ + ["\uBA13", "\uBA13"], /* Hangul Syllable */ + ["\uBA14", "\uBA14"], /* Hangul Syllable */ + ["\uBA15", "\uBA15"], /* Hangul Syllable */ + ["\uBA16", "\uBA16"], /* Hangul Syllable */ + ["\uBA17", "\uBA17"], /* Hangul Syllable */ + ["\uBA18", "\uBA18"], /* Hangul Syllable */ + ["\uBA19", "\uBA19"], /* Hangul Syllable */ + ["\uBA1A", "\uBA1A"], /* Hangul Syllable */ + ["\uBA1B", "\uBA1B"], /* Hangul Syllable */ + ["\uBA1C", "\uBA1C"], /* Hangul Syllable */ + ["\uBA1D", "\uBA1D"], /* Hangul Syllable */ + ["\uBA1E", "\uBA1E"], /* Hangul Syllable */ + ["\uBA1F", "\uBA1F"], /* Hangul Syllable */ + ["\uBA20", "\uBA20"], /* Hangul Syllable */ + ["\uBA21", "\uBA21"], /* Hangul Syllable */ + ["\uBA22", "\uBA22"], /* Hangul Syllable */ + ["\uBA23", "\uBA23"], /* Hangul Syllable */ + ["\uBA24", "\uBA24"], /* Hangul Syllable */ + ["\uBA25", "\uBA25"], /* Hangul Syllable */ + ["\uBA26", "\uBA26"], /* Hangul Syllable */ + ["\uBA27", "\uBA27"], /* Hangul Syllable */ + ["\uBA28", "\uBA28"], /* Hangul Syllable */ + ["\uBA29", "\uBA29"], /* Hangul Syllable */ + ["\uBA2A", "\uBA2A"], /* Hangul Syllable */ + ["\uBA2B", "\uBA2B"], /* Hangul Syllable */ + ["\uBA2C", "\uBA2C"], /* Hangul Syllable */ + ["\uBA2D", "\uBA2D"], /* Hangul Syllable */ + ["\uBA2E", "\uBA2E"], /* Hangul Syllable */ + ["\uBA2F", "\uBA2F"], /* Hangul Syllable */ + ["\uBA30", "\uBA30"], /* Hangul Syllable */ + ["\uBA31", "\uBA31"], /* Hangul Syllable */ + ["\uBA32", "\uBA32"], /* Hangul Syllable */ + ["\uBA33", "\uBA33"], /* Hangul Syllable */ + ["\uBA34", "\uBA34"], /* Hangul Syllable */ + ["\uBA35", "\uBA35"], /* Hangul Syllable */ + ["\uBA36", "\uBA36"], /* Hangul Syllable */ + ["\uBA37", "\uBA37"], /* Hangul Syllable */ + ["\uBA38", "\uBA38"], /* Hangul Syllable */ + ["\uBA39", "\uBA39"], /* Hangul Syllable */ + ["\uBA3A", "\uBA3A"], /* Hangul Syllable */ + ["\uBA3B", "\uBA3B"], /* Hangul Syllable */ + ["\uBA3C", "\uBA3C"], /* Hangul Syllable */ + ["\uBA3D", "\uBA3D"], /* Hangul Syllable */ + ["\uBA3E", "\uBA3E"], /* Hangul Syllable */ + ["\uBA3F", "\uBA3F"], /* Hangul Syllable */ + ["\uBA40", "\uBA40"], /* Hangul Syllable */ + ["\uBA41", "\uBA41"], /* Hangul Syllable */ + ["\uBA42", "\uBA42"], /* Hangul Syllable */ + ["\uBA43", "\uBA43"], /* Hangul Syllable */ + ["\uBA44", "\uBA44"], /* Hangul Syllable */ + ["\uBA45", "\uBA45"], /* Hangul Syllable */ + ["\uBA46", "\uBA46"], /* Hangul Syllable */ + ["\uBA47", "\uBA47"], /* Hangul Syllable */ + ["\uBA48", "\uBA48"], /* Hangul Syllable */ + ["\uBA49", "\uBA49"], /* Hangul Syllable */ + ["\uBA4A", "\uBA4A"], /* Hangul Syllable */ + ["\uBA4B", "\uBA4B"], /* Hangul Syllable */ + ["\uBA4C", "\uBA4C"], /* Hangul Syllable */ + ["\uBA4D", "\uBA4D"], /* Hangul Syllable */ + ["\uBA4E", "\uBA4E"], /* Hangul Syllable */ + ["\uBA4F", "\uBA4F"], /* Hangul Syllable */ + ["\uBA50", "\uBA50"], /* Hangul Syllable */ + ["\uBA51", "\uBA51"], /* Hangul Syllable */ + ["\uBA52", "\uBA52"], /* Hangul Syllable */ + ["\uBA53", "\uBA53"], /* Hangul Syllable */ + ["\uBA54", "\uBA54"], /* Hangul Syllable */ + ["\uBA55", "\uBA55"], /* Hangul Syllable */ + ["\uBA56", "\uBA56"], /* Hangul Syllable */ + ["\uBA57", "\uBA57"], /* Hangul Syllable */ + ["\uBA58", "\uBA58"], /* Hangul Syllable */ + ["\uBA59", "\uBA59"], /* Hangul Syllable */ + ["\uBA5A", "\uBA5A"], /* Hangul Syllable */ + ["\uBA5B", "\uBA5B"], /* Hangul Syllable */ + ["\uBA5C", "\uBA5C"], /* Hangul Syllable */ + ["\uBA5D", "\uBA5D"], /* Hangul Syllable */ + ["\uBA5E", "\uBA5E"], /* Hangul Syllable */ + ["\uBA5F", "\uBA5F"], /* Hangul Syllable */ + ["\uBA60", "\uBA60"], /* Hangul Syllable */ + ["\uBA61", "\uBA61"], /* Hangul Syllable */ + ["\uBA62", "\uBA62"], /* Hangul Syllable */ + ["\uBA63", "\uBA63"], /* Hangul Syllable */ + ["\uBA64", "\uBA64"], /* Hangul Syllable */ + ["\uBA65", "\uBA65"], /* Hangul Syllable */ + ["\uBA66", "\uBA66"], /* Hangul Syllable */ + ["\uBA67", "\uBA67"], /* Hangul Syllable */ + ["\uBA68", "\uBA68"], /* Hangul Syllable */ + ["\uBA69", "\uBA69"], /* Hangul Syllable */ + ["\uBA6A", "\uBA6A"], /* Hangul Syllable */ + ["\uBA6B", "\uBA6B"], /* Hangul Syllable */ + ["\uBA6C", "\uBA6C"], /* Hangul Syllable */ + ["\uBA6D", "\uBA6D"], /* Hangul Syllable */ + ["\uBA6E", "\uBA6E"], /* Hangul Syllable */ + ["\uBA6F", "\uBA6F"], /* Hangul Syllable */ + ["\uBA70", "\uBA70"], /* Hangul Syllable */ + ["\uBA71", "\uBA71"], /* Hangul Syllable */ + ["\uBA72", "\uBA72"], /* Hangul Syllable */ + ["\uBA73", "\uBA73"], /* Hangul Syllable */ + ["\uBA74", "\uBA74"], /* Hangul Syllable */ + ["\uBA75", "\uBA75"], /* Hangul Syllable */ + ["\uBA76", "\uBA76"], /* Hangul Syllable */ + ["\uBA77", "\uBA77"], /* Hangul Syllable */ + ["\uBA78", "\uBA78"], /* Hangul Syllable */ + ["\uBA79", "\uBA79"], /* Hangul Syllable */ + ["\uBA7A", "\uBA7A"], /* Hangul Syllable */ + ["\uBA7B", "\uBA7B"], /* Hangul Syllable */ + ["\uBA7C", "\uBA7C"], /* Hangul Syllable */ + ["\uBA7D", "\uBA7D"], /* Hangul Syllable */ + ["\uBA7E", "\uBA7E"], /* Hangul Syllable */ + ["\uBA7F", "\uBA7F"], /* Hangul Syllable */ + ["\uBA80", "\uBA80"], /* Hangul Syllable */ + ["\uBA81", "\uBA81"], /* Hangul Syllable */ + ["\uBA82", "\uBA82"], /* Hangul Syllable */ + ["\uBA83", "\uBA83"], /* Hangul Syllable */ + ["\uBA84", "\uBA84"], /* Hangul Syllable */ + ["\uBA85", "\uBA85"], /* Hangul Syllable */ + ["\uBA86", "\uBA86"], /* Hangul Syllable */ + ["\uBA87", "\uBA87"], /* Hangul Syllable */ + ["\uBA88", "\uBA88"], /* Hangul Syllable */ + ["\uBA89", "\uBA89"], /* Hangul Syllable */ + ["\uBA8A", "\uBA8A"], /* Hangul Syllable */ + ["\uBA8B", "\uBA8B"], /* Hangul Syllable */ + ["\uBA8C", "\uBA8C"], /* Hangul Syllable */ + ["\uBA8D", "\uBA8D"], /* Hangul Syllable */ + ["\uBA8E", "\uBA8E"], /* Hangul Syllable */ + ["\uBA8F", "\uBA8F"], /* Hangul Syllable */ + ["\uBA90", "\uBA90"], /* Hangul Syllable */ + ["\uBA91", "\uBA91"], /* Hangul Syllable */ + ["\uBA92", "\uBA92"], /* Hangul Syllable */ + ["\uBA93", "\uBA93"], /* Hangul Syllable */ + ["\uBA94", "\uBA94"], /* Hangul Syllable */ + ["\uBA95", "\uBA95"], /* Hangul Syllable */ + ["\uBA96", "\uBA96"], /* Hangul Syllable */ + ["\uBA97", "\uBA97"], /* Hangul Syllable */ + ["\uBA98", "\uBA98"], /* Hangul Syllable */ + ["\uBA99", "\uBA99"], /* Hangul Syllable */ + ["\uBA9A", "\uBA9A"], /* Hangul Syllable */ + ["\uBA9B", "\uBA9B"], /* Hangul Syllable */ + ["\uBA9C", "\uBA9C"], /* Hangul Syllable */ + ["\uBA9D", "\uBA9D"], /* Hangul Syllable */ + ["\uBA9E", "\uBA9E"], /* Hangul Syllable */ + ["\uBA9F", "\uBA9F"], /* Hangul Syllable */ + ["\uBAA0", "\uBAA0"], /* Hangul Syllable */ + ["\uBAA1", "\uBAA1"], /* Hangul Syllable */ + ["\uBAA2", "\uBAA2"], /* Hangul Syllable */ + ["\uBAA3", "\uBAA3"], /* Hangul Syllable */ + ["\uBAA4", "\uBAA4"], /* Hangul Syllable */ + ["\uBAA5", "\uBAA5"], /* Hangul Syllable */ + ["\uBAA6", "\uBAA6"], /* Hangul Syllable */ + ["\uBAA7", "\uBAA7"], /* Hangul Syllable */ + ["\uBAA8", "\uBAA8"], /* Hangul Syllable */ + ["\uBAA9", "\uBAA9"], /* Hangul Syllable */ + ["\uBAAA", "\uBAAA"], /* Hangul Syllable */ + ["\uBAAB", "\uBAAB"], /* Hangul Syllable */ + ["\uBAAC", "\uBAAC"], /* Hangul Syllable */ + ["\uBAAD", "\uBAAD"], /* Hangul Syllable */ + ["\uBAAE", "\uBAAE"], /* Hangul Syllable */ + ["\uBAAF", "\uBAAF"], /* Hangul Syllable */ + ["\uBAB0", "\uBAB0"], /* Hangul Syllable */ + ["\uBAB1", "\uBAB1"], /* Hangul Syllable */ + ["\uBAB2", "\uBAB2"], /* Hangul Syllable */ + ["\uBAB3", "\uBAB3"], /* Hangul Syllable */ + ["\uBAB4", "\uBAB4"], /* Hangul Syllable */ + ["\uBAB5", "\uBAB5"], /* Hangul Syllable */ + ["\uBAB6", "\uBAB6"], /* Hangul Syllable */ + ["\uBAB7", "\uBAB7"], /* Hangul Syllable */ + ["\uBAB8", "\uBAB8"], /* Hangul Syllable */ + ["\uBAB9", "\uBAB9"], /* Hangul Syllable */ + ["\uBABA", "\uBABA"], /* Hangul Syllable */ + ["\uBABB", "\uBABB"], /* Hangul Syllable */ + ["\uBABC", "\uBABC"], /* Hangul Syllable */ + ["\uBABD", "\uBABD"], /* Hangul Syllable */ + ["\uBABE", "\uBABE"], /* Hangul Syllable */ + ["\uBABF", "\uBABF"], /* Hangul Syllable */ + ["\uBAC0", "\uBAC0"], /* Hangul Syllable */ + ["\uBAC1", "\uBAC1"], /* Hangul Syllable */ + ["\uBAC2", "\uBAC2"], /* Hangul Syllable */ + ["\uBAC3", "\uBAC3"], /* Hangul Syllable */ + ["\uBAC4", "\uBAC4"], /* Hangul Syllable */ + ["\uBAC5", "\uBAC5"], /* Hangul Syllable */ + ["\uBAC6", "\uBAC6"], /* Hangul Syllable */ + ["\uBAC7", "\uBAC7"], /* Hangul Syllable */ + ["\uBAC8", "\uBAC8"], /* Hangul Syllable */ + ["\uBAC9", "\uBAC9"], /* Hangul Syllable */ + ["\uBACA", "\uBACA"], /* Hangul Syllable */ + ["\uBACB", "\uBACB"], /* Hangul Syllable */ + ["\uBACC", "\uBACC"], /* Hangul Syllable */ + ["\uBACD", "\uBACD"], /* Hangul Syllable */ + ["\uBACE", "\uBACE"], /* Hangul Syllable */ + ["\uBACF", "\uBACF"], /* Hangul Syllable */ + ["\uBAD0", "\uBAD0"], /* Hangul Syllable */ + ["\uBAD1", "\uBAD1"], /* Hangul Syllable */ + ["\uBAD2", "\uBAD2"], /* Hangul Syllable */ + ["\uBAD3", "\uBAD3"], /* Hangul Syllable */ + ["\uBAD4", "\uBAD4"], /* Hangul Syllable */ + ["\uBAD5", "\uBAD5"], /* Hangul Syllable */ + ["\uBAD6", "\uBAD6"], /* Hangul Syllable */ + ["\uBAD7", "\uBAD7"], /* Hangul Syllable */ + ["\uBAD8", "\uBAD8"], /* Hangul Syllable */ + ["\uBAD9", "\uBAD9"], /* Hangul Syllable */ + ["\uBADA", "\uBADA"], /* Hangul Syllable */ + ["\uBADB", "\uBADB"], /* Hangul Syllable */ + ["\uBADC", "\uBADC"], /* Hangul Syllable */ + ["\uBADD", "\uBADD"], /* Hangul Syllable */ + ["\uBADE", "\uBADE"], /* Hangul Syllable */ + ["\uBADF", "\uBADF"], /* Hangul Syllable */ + ["\uBAE0", "\uBAE0"], /* Hangul Syllable */ + ["\uBAE1", "\uBAE1"], /* Hangul Syllable */ + ["\uBAE2", "\uBAE2"], /* Hangul Syllable */ + ["\uBAE3", "\uBAE3"], /* Hangul Syllable */ + ["\uBAE4", "\uBAE4"], /* Hangul Syllable */ + ["\uBAE5", "\uBAE5"], /* Hangul Syllable */ + ["\uBAE6", "\uBAE6"], /* Hangul Syllable */ + ["\uBAE7", "\uBAE7"], /* Hangul Syllable */ + ["\uBAE8", "\uBAE8"], /* Hangul Syllable */ + ["\uBAE9", "\uBAE9"], /* Hangul Syllable */ + ["\uBAEA", "\uBAEA"], /* Hangul Syllable */ + ["\uBAEB", "\uBAEB"], /* Hangul Syllable */ + ["\uBAEC", "\uBAEC"], /* Hangul Syllable */ + ["\uBAED", "\uBAED"], /* Hangul Syllable */ + ["\uBAEE", "\uBAEE"], /* Hangul Syllable */ + ["\uBAEF", "\uBAEF"], /* Hangul Syllable */ + ["\uBAF0", "\uBAF0"], /* Hangul Syllable */ + ["\uBAF1", "\uBAF1"], /* Hangul Syllable */ + ["\uBAF2", "\uBAF2"], /* Hangul Syllable */ + ["\uBAF3", "\uBAF3"], /* Hangul Syllable */ + ["\uBAF4", "\uBAF4"], /* Hangul Syllable */ + ["\uBAF5", "\uBAF5"], /* Hangul Syllable */ + ["\uBAF6", "\uBAF6"], /* Hangul Syllable */ + ["\uBAF7", "\uBAF7"], /* Hangul Syllable */ + ["\uBAF8", "\uBAF8"], /* Hangul Syllable */ + ["\uBAF9", "\uBAF9"], /* Hangul Syllable */ + ["\uBAFA", "\uBAFA"], /* Hangul Syllable */ + ["\uBAFB", "\uBAFB"], /* Hangul Syllable */ + ["\uBAFC", "\uBAFC"], /* Hangul Syllable */ + ["\uBAFD", "\uBAFD"], /* Hangul Syllable */ + ["\uBAFE", "\uBAFE"], /* Hangul Syllable */ + ["\uBAFF", "\uBAFF"], /* Hangul Syllable */ + ["\uBB00", "\uBB00"], /* Hangul Syllable */ + ["\uBB01", "\uBB01"], /* Hangul Syllable */ + ["\uBB02", "\uBB02"], /* Hangul Syllable */ + ["\uBB03", "\uBB03"], /* Hangul Syllable */ + ["\uBB04", "\uBB04"], /* Hangul Syllable */ + ["\uBB05", "\uBB05"], /* Hangul Syllable */ + ["\uBB06", "\uBB06"], /* Hangul Syllable */ + ["\uBB07", "\uBB07"], /* Hangul Syllable */ + ["\uBB08", "\uBB08"], /* Hangul Syllable */ + ["\uBB09", "\uBB09"], /* Hangul Syllable */ + ["\uBB0A", "\uBB0A"], /* Hangul Syllable */ + ["\uBB0B", "\uBB0B"], /* Hangul Syllable */ + ["\uBB0C", "\uBB0C"], /* Hangul Syllable */ + ["\uBB0D", "\uBB0D"], /* Hangul Syllable */ + ["\uBB0E", "\uBB0E"], /* Hangul Syllable */ + ["\uBB0F", "\uBB0F"], /* Hangul Syllable */ + ["\uBB10", "\uBB10"], /* Hangul Syllable */ + ["\uBB11", "\uBB11"], /* Hangul Syllable */ + ["\uBB12", "\uBB12"], /* Hangul Syllable */ + ["\uBB13", "\uBB13"], /* Hangul Syllable */ + ["\uBB14", "\uBB14"], /* Hangul Syllable */ + ["\uBB15", "\uBB15"], /* Hangul Syllable */ + ["\uBB16", "\uBB16"], /* Hangul Syllable */ + ["\uBB17", "\uBB17"], /* Hangul Syllable */ + ["\uBB18", "\uBB18"], /* Hangul Syllable */ + ["\uBB19", "\uBB19"], /* Hangul Syllable */ + ["\uBB1A", "\uBB1A"], /* Hangul Syllable */ + ["\uBB1B", "\uBB1B"], /* Hangul Syllable */ + ["\uBB1C", "\uBB1C"], /* Hangul Syllable */ + ["\uBB1D", "\uBB1D"], /* Hangul Syllable */ + ["\uBB1E", "\uBB1E"], /* Hangul Syllable */ + ["\uBB1F", "\uBB1F"], /* Hangul Syllable */ + ["\uBB20", "\uBB20"], /* Hangul Syllable */ + ["\uBB21", "\uBB21"], /* Hangul Syllable */ + ["\uBB22", "\uBB22"], /* Hangul Syllable */ + ["\uBB23", "\uBB23"], /* Hangul Syllable */ + ["\uBB24", "\uBB24"], /* Hangul Syllable */ + ["\uBB25", "\uBB25"], /* Hangul Syllable */ + ["\uBB26", "\uBB26"], /* Hangul Syllable */ + ["\uBB27", "\uBB27"], /* Hangul Syllable */ + ["\uBB28", "\uBB28"], /* Hangul Syllable */ + ["\uBB29", "\uBB29"], /* Hangul Syllable */ + ["\uBB2A", "\uBB2A"], /* Hangul Syllable */ + ["\uBB2B", "\uBB2B"], /* Hangul Syllable */ + ["\uBB2C", "\uBB2C"], /* Hangul Syllable */ + ["\uBB2D", "\uBB2D"], /* Hangul Syllable */ + ["\uBB2E", "\uBB2E"], /* Hangul Syllable */ + ["\uBB2F", "\uBB2F"], /* Hangul Syllable */ + ["\uBB30", "\uBB30"], /* Hangul Syllable */ + ["\uBB31", "\uBB31"], /* Hangul Syllable */ + ["\uBB32", "\uBB32"], /* Hangul Syllable */ + ["\uBB33", "\uBB33"], /* Hangul Syllable */ + ["\uBB34", "\uBB34"], /* Hangul Syllable */ + ["\uBB35", "\uBB35"], /* Hangul Syllable */ + ["\uBB36", "\uBB36"], /* Hangul Syllable */ + ["\uBB37", "\uBB37"], /* Hangul Syllable */ + ["\uBB38", "\uBB38"], /* Hangul Syllable */ + ["\uBB39", "\uBB39"], /* Hangul Syllable */ + ["\uBB3A", "\uBB3A"], /* Hangul Syllable */ + ["\uBB3B", "\uBB3B"], /* Hangul Syllable */ + ["\uBB3C", "\uBB3C"], /* Hangul Syllable */ + ["\uBB3D", "\uBB3D"], /* Hangul Syllable */ + ["\uBB3E", "\uBB3E"], /* Hangul Syllable */ + ["\uBB3F", "\uBB3F"], /* Hangul Syllable */ + ["\uBB40", "\uBB40"], /* Hangul Syllable */ + ["\uBB41", "\uBB41"], /* Hangul Syllable */ + ["\uBB42", "\uBB42"], /* Hangul Syllable */ + ["\uBB43", "\uBB43"], /* Hangul Syllable */ + ["\uBB44", "\uBB44"], /* Hangul Syllable */ + ["\uBB45", "\uBB45"], /* Hangul Syllable */ + ["\uBB46", "\uBB46"], /* Hangul Syllable */ + ["\uBB47", "\uBB47"], /* Hangul Syllable */ + ["\uBB48", "\uBB48"], /* Hangul Syllable */ + ["\uBB49", "\uBB49"], /* Hangul Syllable */ + ["\uBB4A", "\uBB4A"], /* Hangul Syllable */ + ["\uBB4B", "\uBB4B"], /* Hangul Syllable */ + ["\uBB4C", "\uBB4C"], /* Hangul Syllable */ + ["\uBB4D", "\uBB4D"], /* Hangul Syllable */ + ["\uBB4E", "\uBB4E"], /* Hangul Syllable */ + ["\uBB4F", "\uBB4F"], /* Hangul Syllable */ + ["\uBB50", "\uBB50"], /* Hangul Syllable */ + ["\uBB51", "\uBB51"], /* Hangul Syllable */ + ["\uBB52", "\uBB52"], /* Hangul Syllable */ + ["\uBB53", "\uBB53"], /* Hangul Syllable */ + ["\uBB54", "\uBB54"], /* Hangul Syllable */ + ["\uBB55", "\uBB55"], /* Hangul Syllable */ + ["\uBB56", "\uBB56"], /* Hangul Syllable */ + ["\uBB57", "\uBB57"], /* Hangul Syllable */ + ["\uBB58", "\uBB58"], /* Hangul Syllable */ + ["\uBB59", "\uBB59"], /* Hangul Syllable */ + ["\uBB5A", "\uBB5A"], /* Hangul Syllable */ + ["\uBB5B", "\uBB5B"], /* Hangul Syllable */ + ["\uBB5C", "\uBB5C"], /* Hangul Syllable */ + ["\uBB5D", "\uBB5D"], /* Hangul Syllable */ + ["\uBB5E", "\uBB5E"], /* Hangul Syllable */ + ["\uBB5F", "\uBB5F"], /* Hangul Syllable */ + ["\uBB60", "\uBB60"], /* Hangul Syllable */ + ["\uBB61", "\uBB61"], /* Hangul Syllable */ + ["\uBB62", "\uBB62"], /* Hangul Syllable */ + ["\uBB63", "\uBB63"], /* Hangul Syllable */ + ["\uBB64", "\uBB64"], /* Hangul Syllable */ + ["\uBB65", "\uBB65"], /* Hangul Syllable */ + ["\uBB66", "\uBB66"], /* Hangul Syllable */ + ["\uBB67", "\uBB67"], /* Hangul Syllable */ + ["\uBB68", "\uBB68"], /* Hangul Syllable */ + ["\uBB69", "\uBB69"], /* Hangul Syllable */ + ["\uBB6A", "\uBB6A"], /* Hangul Syllable */ + ["\uBB6B", "\uBB6B"], /* Hangul Syllable */ + ["\uBB6C", "\uBB6C"], /* Hangul Syllable */ + ["\uBB6D", "\uBB6D"], /* Hangul Syllable */ + ["\uBB6E", "\uBB6E"], /* Hangul Syllable */ + ["\uBB6F", "\uBB6F"], /* Hangul Syllable */ + ["\uBB70", "\uBB70"], /* Hangul Syllable */ + ["\uBB71", "\uBB71"], /* Hangul Syllable */ + ["\uBB72", "\uBB72"], /* Hangul Syllable */ + ["\uBB73", "\uBB73"], /* Hangul Syllable */ + ["\uBB74", "\uBB74"], /* Hangul Syllable */ + ["\uBB75", "\uBB75"], /* Hangul Syllable */ + ["\uBB76", "\uBB76"], /* Hangul Syllable */ + ["\uBB77", "\uBB77"], /* Hangul Syllable */ + ["\uBB78", "\uBB78"], /* Hangul Syllable */ + ["\uBB79", "\uBB79"], /* Hangul Syllable */ + ["\uBB7A", "\uBB7A"], /* Hangul Syllable */ + ["\uBB7B", "\uBB7B"], /* Hangul Syllable */ + ["\uBB7C", "\uBB7C"], /* Hangul Syllable */ + ["\uBB7D", "\uBB7D"], /* Hangul Syllable */ + ["\uBB7E", "\uBB7E"], /* Hangul Syllable */ + ["\uBB7F", "\uBB7F"], /* Hangul Syllable */ + ["\uBB80", "\uBB80"], /* Hangul Syllable */ + ["\uBB81", "\uBB81"], /* Hangul Syllable */ + ["\uBB82", "\uBB82"], /* Hangul Syllable */ + ["\uBB83", "\uBB83"], /* Hangul Syllable */ + ["\uBB84", "\uBB84"], /* Hangul Syllable */ + ["\uBB85", "\uBB85"], /* Hangul Syllable */ + ["\uBB86", "\uBB86"], /* Hangul Syllable */ + ["\uBB87", "\uBB87"], /* Hangul Syllable */ + ["\uBB88", "\uBB88"], /* Hangul Syllable */ + ["\uBB89", "\uBB89"], /* Hangul Syllable */ + ["\uBB8A", "\uBB8A"], /* Hangul Syllable */ + ["\uBB8B", "\uBB8B"], /* Hangul Syllable */ + ["\uBB8C", "\uBB8C"], /* Hangul Syllable */ + ["\uBB8D", "\uBB8D"], /* Hangul Syllable */ + ["\uBB8E", "\uBB8E"], /* Hangul Syllable */ + ["\uBB8F", "\uBB8F"], /* Hangul Syllable */ + ["\uBB90", "\uBB90"], /* Hangul Syllable */ + ["\uBB91", "\uBB91"], /* Hangul Syllable */ + ["\uBB92", "\uBB92"], /* Hangul Syllable */ + ["\uBB93", "\uBB93"], /* Hangul Syllable */ + ["\uBB94", "\uBB94"], /* Hangul Syllable */ + ["\uBB95", "\uBB95"], /* Hangul Syllable */ + ["\uBB96", "\uBB96"], /* Hangul Syllable */ + ["\uBB97", "\uBB97"], /* Hangul Syllable */ + ["\uBB98", "\uBB98"], /* Hangul Syllable */ + ["\uBB99", "\uBB99"], /* Hangul Syllable */ + ["\uBB9A", "\uBB9A"], /* Hangul Syllable */ + ["\uBB9B", "\uBB9B"], /* Hangul Syllable */ + ["\uBB9C", "\uBB9C"], /* Hangul Syllable */ + ["\uBB9D", "\uBB9D"], /* Hangul Syllable */ + ["\uBB9E", "\uBB9E"], /* Hangul Syllable */ + ["\uBB9F", "\uBB9F"], /* Hangul Syllable */ + ["\uBBA0", "\uBBA0"], /* Hangul Syllable */ + ["\uBBA1", "\uBBA1"], /* Hangul Syllable */ + ["\uBBA2", "\uBBA2"], /* Hangul Syllable */ + ["\uBBA3", "\uBBA3"], /* Hangul Syllable */ + ["\uBBA4", "\uBBA4"], /* Hangul Syllable */ + ["\uBBA5", "\uBBA5"], /* Hangul Syllable */ + ["\uBBA6", "\uBBA6"], /* Hangul Syllable */ + ["\uBBA7", "\uBBA7"], /* Hangul Syllable */ + ["\uBBA8", "\uBBA8"], /* Hangul Syllable */ + ["\uBBA9", "\uBBA9"], /* Hangul Syllable */ + ["\uBBAA", "\uBBAA"], /* Hangul Syllable */ + ["\uBBAB", "\uBBAB"], /* Hangul Syllable */ + ["\uBBAC", "\uBBAC"], /* Hangul Syllable */ + ["\uBBAD", "\uBBAD"], /* Hangul Syllable */ + ["\uBBAE", "\uBBAE"], /* Hangul Syllable */ + ["\uBBAF", "\uBBAF"], /* Hangul Syllable */ + ["\uBBB0", "\uBBB0"], /* Hangul Syllable */ + ["\uBBB1", "\uBBB1"], /* Hangul Syllable */ + ["\uBBB2", "\uBBB2"], /* Hangul Syllable */ + ["\uBBB3", "\uBBB3"], /* Hangul Syllable */ + ["\uBBB4", "\uBBB4"], /* Hangul Syllable */ + ["\uBBB5", "\uBBB5"], /* Hangul Syllable */ + ["\uBBB6", "\uBBB6"], /* Hangul Syllable */ + ["\uBBB7", "\uBBB7"], /* Hangul Syllable */ + ["\uBBB8", "\uBBB8"], /* Hangul Syllable */ + ["\uBBB9", "\uBBB9"], /* Hangul Syllable */ + ["\uBBBA", "\uBBBA"], /* Hangul Syllable */ + ["\uBBBB", "\uBBBB"], /* Hangul Syllable */ + ["\uBBBC", "\uBBBC"], /* Hangul Syllable */ + ["\uBBBD", "\uBBBD"], /* Hangul Syllable */ + ["\uBBBE", "\uBBBE"], /* Hangul Syllable */ + ["\uBBBF", "\uBBBF"], /* Hangul Syllable */ + ["\uBBC0", "\uBBC0"], /* Hangul Syllable */ + ["\uBBC1", "\uBBC1"], /* Hangul Syllable */ + ["\uBBC2", "\uBBC2"], /* Hangul Syllable */ + ["\uBBC3", "\uBBC3"], /* Hangul Syllable */ + ["\uBBC4", "\uBBC4"], /* Hangul Syllable */ + ["\uBBC5", "\uBBC5"], /* Hangul Syllable */ + ["\uBBC6", "\uBBC6"], /* Hangul Syllable */ + ["\uBBC7", "\uBBC7"], /* Hangul Syllable */ + ["\uBBC8", "\uBBC8"], /* Hangul Syllable */ + ["\uBBC9", "\uBBC9"], /* Hangul Syllable */ + ["\uBBCA", "\uBBCA"], /* Hangul Syllable */ + ["\uBBCB", "\uBBCB"], /* Hangul Syllable */ + ["\uBBCC", "\uBBCC"], /* Hangul Syllable */ + ["\uBBCD", "\uBBCD"], /* Hangul Syllable */ + ["\uBBCE", "\uBBCE"], /* Hangul Syllable */ + ["\uBBCF", "\uBBCF"], /* Hangul Syllable */ + ["\uBBD0", "\uBBD0"], /* Hangul Syllable */ + ["\uBBD1", "\uBBD1"], /* Hangul Syllable */ + ["\uBBD2", "\uBBD2"], /* Hangul Syllable */ + ["\uBBD3", "\uBBD3"], /* Hangul Syllable */ + ["\uBBD4", "\uBBD4"], /* Hangul Syllable */ + ["\uBBD5", "\uBBD5"], /* Hangul Syllable */ + ["\uBBD6", "\uBBD6"], /* Hangul Syllable */ + ["\uBBD7", "\uBBD7"], /* Hangul Syllable */ + ["\uBBD8", "\uBBD8"], /* Hangul Syllable */ + ["\uBBD9", "\uBBD9"], /* Hangul Syllable */ + ["\uBBDA", "\uBBDA"], /* Hangul Syllable */ + ["\uBBDB", "\uBBDB"], /* Hangul Syllable */ + ["\uBBDC", "\uBBDC"], /* Hangul Syllable */ + ["\uBBDD", "\uBBDD"], /* Hangul Syllable */ + ["\uBBDE", "\uBBDE"], /* Hangul Syllable */ + ["\uBBDF", "\uBBDF"], /* Hangul Syllable */ + ["\uBBE0", "\uBBE0"], /* Hangul Syllable */ + ["\uBBE1", "\uBBE1"], /* Hangul Syllable */ + ["\uBBE2", "\uBBE2"], /* Hangul Syllable */ + ["\uBBE3", "\uBBE3"], /* Hangul Syllable */ + ["\uBBE4", "\uBBE4"], /* Hangul Syllable */ + ["\uBBE5", "\uBBE5"], /* Hangul Syllable */ + ["\uBBE6", "\uBBE6"], /* Hangul Syllable */ + ["\uBBE7", "\uBBE7"], /* Hangul Syllable */ + ["\uBBE8", "\uBBE8"], /* Hangul Syllable */ + ["\uBBE9", "\uBBE9"], /* Hangul Syllable */ + ["\uBBEA", "\uBBEA"], /* Hangul Syllable */ + ["\uBBEB", "\uBBEB"], /* Hangul Syllable */ + ["\uBBEC", "\uBBEC"], /* Hangul Syllable */ + ["\uBBED", "\uBBED"], /* Hangul Syllable */ + ["\uBBEE", "\uBBEE"], /* Hangul Syllable */ + ["\uBBEF", "\uBBEF"], /* Hangul Syllable */ + ["\uBBF0", "\uBBF0"], /* Hangul Syllable */ + ["\uBBF1", "\uBBF1"], /* Hangul Syllable */ + ["\uBBF2", "\uBBF2"], /* Hangul Syllable */ + ["\uBBF3", "\uBBF3"], /* Hangul Syllable */ + ["\uBBF4", "\uBBF4"], /* Hangul Syllable */ + ["\uBBF5", "\uBBF5"], /* Hangul Syllable */ + ["\uBBF6", "\uBBF6"], /* Hangul Syllable */ + ["\uBBF7", "\uBBF7"], /* Hangul Syllable */ + ["\uBBF8", "\uBBF8"], /* Hangul Syllable */ + ["\uBBF9", "\uBBF9"], /* Hangul Syllable */ + ["\uBBFA", "\uBBFA"], /* Hangul Syllable */ + ["\uBBFB", "\uBBFB"], /* Hangul Syllable */ + ["\uBBFC", "\uBBFC"], /* Hangul Syllable */ + ["\uBBFD", "\uBBFD"], /* Hangul Syllable */ + ["\uBBFE", "\uBBFE"], /* Hangul Syllable */ + ["\uBBFF", "\uBBFF"], /* Hangul Syllable */ + ["\uBC00", "\uBC00"], /* Hangul Syllable */ + ["\uBC01", "\uBC01"], /* Hangul Syllable */ + ["\uBC02", "\uBC02"], /* Hangul Syllable */ + ["\uBC03", "\uBC03"], /* Hangul Syllable */ + ["\uBC04", "\uBC04"], /* Hangul Syllable */ + ["\uBC05", "\uBC05"], /* Hangul Syllable */ + ["\uBC06", "\uBC06"], /* Hangul Syllable */ + ["\uBC07", "\uBC07"], /* Hangul Syllable */ + ["\uBC08", "\uBC08"], /* Hangul Syllable */ + ["\uBC09", "\uBC09"], /* Hangul Syllable */ + ["\uBC0A", "\uBC0A"], /* Hangul Syllable */ + ["\uBC0B", "\uBC0B"], /* Hangul Syllable */ + ["\uBC0C", "\uBC0C"], /* Hangul Syllable */ + ["\uBC0D", "\uBC0D"], /* Hangul Syllable */ + ["\uBC0E", "\uBC0E"], /* Hangul Syllable */ + ["\uBC0F", "\uBC0F"], /* Hangul Syllable */ + ["\uBC10", "\uBC10"], /* Hangul Syllable */ + ["\uBC11", "\uBC11"], /* Hangul Syllable */ + ["\uBC12", "\uBC12"], /* Hangul Syllable */ + ["\uBC13", "\uBC13"], /* Hangul Syllable */ + ["\uBC14", "\uBC14"], /* Hangul Syllable */ + ["\uBC15", "\uBC15"], /* Hangul Syllable */ + ["\uBC16", "\uBC16"], /* Hangul Syllable */ + ["\uBC17", "\uBC17"], /* Hangul Syllable */ + ["\uBC18", "\uBC18"], /* Hangul Syllable */ + ["\uBC19", "\uBC19"], /* Hangul Syllable */ + ["\uBC1A", "\uBC1A"], /* Hangul Syllable */ + ["\uBC1B", "\uBC1B"], /* Hangul Syllable */ + ["\uBC1C", "\uBC1C"], /* Hangul Syllable */ + ["\uBC1D", "\uBC1D"], /* Hangul Syllable */ + ["\uBC1E", "\uBC1E"], /* Hangul Syllable */ + ["\uBC1F", "\uBC1F"], /* Hangul Syllable */ + ["\uBC20", "\uBC20"], /* Hangul Syllable */ + ["\uBC21", "\uBC21"], /* Hangul Syllable */ + ["\uBC22", "\uBC22"], /* Hangul Syllable */ + ["\uBC23", "\uBC23"], /* Hangul Syllable */ + ["\uBC24", "\uBC24"], /* Hangul Syllable */ + ["\uBC25", "\uBC25"], /* Hangul Syllable */ + ["\uBC26", "\uBC26"], /* Hangul Syllable */ + ["\uBC27", "\uBC27"], /* Hangul Syllable */ + ["\uBC28", "\uBC28"], /* Hangul Syllable */ + ["\uBC29", "\uBC29"], /* Hangul Syllable */ + ["\uBC2A", "\uBC2A"], /* Hangul Syllable */ + ["\uBC2B", "\uBC2B"], /* Hangul Syllable */ + ["\uBC2C", "\uBC2C"], /* Hangul Syllable */ + ["\uBC2D", "\uBC2D"], /* Hangul Syllable */ + ["\uBC2E", "\uBC2E"], /* Hangul Syllable */ + ["\uBC2F", "\uBC2F"], /* Hangul Syllable */ + ["\uBC30", "\uBC30"], /* Hangul Syllable */ + ["\uBC31", "\uBC31"], /* Hangul Syllable */ + ["\uBC32", "\uBC32"], /* Hangul Syllable */ + ["\uBC33", "\uBC33"], /* Hangul Syllable */ + ["\uBC34", "\uBC34"], /* Hangul Syllable */ + ["\uBC35", "\uBC35"], /* Hangul Syllable */ + ["\uBC36", "\uBC36"], /* Hangul Syllable */ + ["\uBC37", "\uBC37"], /* Hangul Syllable */ + ["\uBC38", "\uBC38"], /* Hangul Syllable */ + ["\uBC39", "\uBC39"], /* Hangul Syllable */ + ["\uBC3A", "\uBC3A"], /* Hangul Syllable */ + ["\uBC3B", "\uBC3B"], /* Hangul Syllable */ + ["\uBC3C", "\uBC3C"], /* Hangul Syllable */ + ["\uBC3D", "\uBC3D"], /* Hangul Syllable */ + ["\uBC3E", "\uBC3E"], /* Hangul Syllable */ + ["\uBC3F", "\uBC3F"], /* Hangul Syllable */ + ["\uBC40", "\uBC40"], /* Hangul Syllable */ + ["\uBC41", "\uBC41"], /* Hangul Syllable */ + ["\uBC42", "\uBC42"], /* Hangul Syllable */ + ["\uBC43", "\uBC43"], /* Hangul Syllable */ + ["\uBC44", "\uBC44"], /* Hangul Syllable */ + ["\uBC45", "\uBC45"], /* Hangul Syllable */ + ["\uBC46", "\uBC46"], /* Hangul Syllable */ + ["\uBC47", "\uBC47"], /* Hangul Syllable */ + ["\uBC48", "\uBC48"], /* Hangul Syllable */ + ["\uBC49", "\uBC49"], /* Hangul Syllable */ + ["\uBC4A", "\uBC4A"], /* Hangul Syllable */ + ["\uBC4B", "\uBC4B"], /* Hangul Syllable */ + ["\uBC4C", "\uBC4C"], /* Hangul Syllable */ + ["\uBC4D", "\uBC4D"], /* Hangul Syllable */ + ["\uBC4E", "\uBC4E"], /* Hangul Syllable */ + ["\uBC4F", "\uBC4F"], /* Hangul Syllable */ + ["\uBC50", "\uBC50"], /* Hangul Syllable */ + ["\uBC51", "\uBC51"], /* Hangul Syllable */ + ["\uBC52", "\uBC52"], /* Hangul Syllable */ + ["\uBC53", "\uBC53"], /* Hangul Syllable */ + ["\uBC54", "\uBC54"], /* Hangul Syllable */ + ["\uBC55", "\uBC55"], /* Hangul Syllable */ + ["\uBC56", "\uBC56"], /* Hangul Syllable */ + ["\uBC57", "\uBC57"], /* Hangul Syllable */ + ["\uBC58", "\uBC58"], /* Hangul Syllable */ + ["\uBC59", "\uBC59"], /* Hangul Syllable */ + ["\uBC5A", "\uBC5A"], /* Hangul Syllable */ + ["\uBC5B", "\uBC5B"], /* Hangul Syllable */ + ["\uBC5C", "\uBC5C"], /* Hangul Syllable */ + ["\uBC5D", "\uBC5D"], /* Hangul Syllable */ + ["\uBC5E", "\uBC5E"], /* Hangul Syllable */ + ["\uBC5F", "\uBC5F"], /* Hangul Syllable */ + ["\uBC60", "\uBC60"], /* Hangul Syllable */ + ["\uBC61", "\uBC61"], /* Hangul Syllable */ + ["\uBC62", "\uBC62"], /* Hangul Syllable */ + ["\uBC63", "\uBC63"], /* Hangul Syllable */ + ["\uBC64", "\uBC64"], /* Hangul Syllable */ + ["\uBC65", "\uBC65"], /* Hangul Syllable */ + ["\uBC66", "\uBC66"], /* Hangul Syllable */ + ["\uBC67", "\uBC67"], /* Hangul Syllable */ + ["\uBC68", "\uBC68"], /* Hangul Syllable */ + ["\uBC69", "\uBC69"], /* Hangul Syllable */ + ["\uBC6A", "\uBC6A"], /* Hangul Syllable */ + ["\uBC6B", "\uBC6B"], /* Hangul Syllable */ + ["\uBC6C", "\uBC6C"], /* Hangul Syllable */ + ["\uBC6D", "\uBC6D"], /* Hangul Syllable */ + ["\uBC6E", "\uBC6E"], /* Hangul Syllable */ + ["\uBC6F", "\uBC6F"], /* Hangul Syllable */ + ["\uBC70", "\uBC70"], /* Hangul Syllable */ + ["\uBC71", "\uBC71"], /* Hangul Syllable */ + ["\uBC72", "\uBC72"], /* Hangul Syllable */ + ["\uBC73", "\uBC73"], /* Hangul Syllable */ + ["\uBC74", "\uBC74"], /* Hangul Syllable */ + ["\uBC75", "\uBC75"], /* Hangul Syllable */ + ["\uBC76", "\uBC76"], /* Hangul Syllable */ + ["\uBC77", "\uBC77"], /* Hangul Syllable */ + ["\uBC78", "\uBC78"], /* Hangul Syllable */ + ["\uBC79", "\uBC79"], /* Hangul Syllable */ + ["\uBC7A", "\uBC7A"], /* Hangul Syllable */ + ["\uBC7B", "\uBC7B"], /* Hangul Syllable */ + ["\uBC7C", "\uBC7C"], /* Hangul Syllable */ + ["\uBC7D", "\uBC7D"], /* Hangul Syllable */ + ["\uBC7E", "\uBC7E"], /* Hangul Syllable */ + ["\uBC7F", "\uBC7F"], /* Hangul Syllable */ + ["\uBC80", "\uBC80"], /* Hangul Syllable */ + ["\uBC81", "\uBC81"], /* Hangul Syllable */ + ["\uBC82", "\uBC82"], /* Hangul Syllable */ + ["\uBC83", "\uBC83"], /* Hangul Syllable */ + ["\uBC84", "\uBC84"], /* Hangul Syllable */ + ["\uBC85", "\uBC85"], /* Hangul Syllable */ + ["\uBC86", "\uBC86"], /* Hangul Syllable */ + ["\uBC87", "\uBC87"], /* Hangul Syllable */ + ["\uBC88", "\uBC88"], /* Hangul Syllable */ + ["\uBC89", "\uBC89"], /* Hangul Syllable */ + ["\uBC8A", "\uBC8A"], /* Hangul Syllable */ + ["\uBC8B", "\uBC8B"], /* Hangul Syllable */ + ["\uBC8C", "\uBC8C"], /* Hangul Syllable */ + ["\uBC8D", "\uBC8D"], /* Hangul Syllable */ + ["\uBC8E", "\uBC8E"], /* Hangul Syllable */ + ["\uBC8F", "\uBC8F"], /* Hangul Syllable */ + ["\uBC90", "\uBC90"], /* Hangul Syllable */ + ["\uBC91", "\uBC91"], /* Hangul Syllable */ + ["\uBC92", "\uBC92"], /* Hangul Syllable */ + ["\uBC93", "\uBC93"], /* Hangul Syllable */ + ["\uBC94", "\uBC94"], /* Hangul Syllable */ + ["\uBC95", "\uBC95"], /* Hangul Syllable */ + ["\uBC96", "\uBC96"], /* Hangul Syllable */ + ["\uBC97", "\uBC97"], /* Hangul Syllable */ + ["\uBC98", "\uBC98"], /* Hangul Syllable */ + ["\uBC99", "\uBC99"], /* Hangul Syllable */ + ["\uBC9A", "\uBC9A"], /* Hangul Syllable */ + ["\uBC9B", "\uBC9B"], /* Hangul Syllable */ + ["\uBC9C", "\uBC9C"], /* Hangul Syllable */ + ["\uBC9D", "\uBC9D"], /* Hangul Syllable */ + ["\uBC9E", "\uBC9E"], /* Hangul Syllable */ + ["\uBC9F", "\uBC9F"], /* Hangul Syllable */ + ["\uBCA0", "\uBCA0"], /* Hangul Syllable */ + ["\uBCA1", "\uBCA1"], /* Hangul Syllable */ + ["\uBCA2", "\uBCA2"], /* Hangul Syllable */ + ["\uBCA3", "\uBCA3"], /* Hangul Syllable */ + ["\uBCA4", "\uBCA4"], /* Hangul Syllable */ + ["\uBCA5", "\uBCA5"], /* Hangul Syllable */ + ["\uBCA6", "\uBCA6"], /* Hangul Syllable */ + ["\uBCA7", "\uBCA7"], /* Hangul Syllable */ + ["\uBCA8", "\uBCA8"], /* Hangul Syllable */ + ["\uBCA9", "\uBCA9"], /* Hangul Syllable */ + ["\uBCAA", "\uBCAA"], /* Hangul Syllable */ + ["\uBCAB", "\uBCAB"], /* Hangul Syllable */ + ["\uBCAC", "\uBCAC"], /* Hangul Syllable */ + ["\uBCAD", "\uBCAD"], /* Hangul Syllable */ + ["\uBCAE", "\uBCAE"], /* Hangul Syllable */ + ["\uBCAF", "\uBCAF"], /* Hangul Syllable */ + ["\uBCB0", "\uBCB0"], /* Hangul Syllable */ + ["\uBCB1", "\uBCB1"], /* Hangul Syllable */ + ["\uBCB2", "\uBCB2"], /* Hangul Syllable */ + ["\uBCB3", "\uBCB3"], /* Hangul Syllable */ + ["\uBCB4", "\uBCB4"], /* Hangul Syllable */ + ["\uBCB5", "\uBCB5"], /* Hangul Syllable */ + ["\uBCB6", "\uBCB6"], /* Hangul Syllable */ + ["\uBCB7", "\uBCB7"], /* Hangul Syllable */ + ["\uBCB8", "\uBCB8"], /* Hangul Syllable */ + ["\uBCB9", "\uBCB9"], /* Hangul Syllable */ + ["\uBCBA", "\uBCBA"], /* Hangul Syllable */ + ["\uBCBB", "\uBCBB"], /* Hangul Syllable */ + ["\uBCBC", "\uBCBC"], /* Hangul Syllable */ + ["\uBCBD", "\uBCBD"], /* Hangul Syllable */ + ["\uBCBE", "\uBCBE"], /* Hangul Syllable */ + ["\uBCBF", "\uBCBF"], /* Hangul Syllable */ + ["\uBCC0", "\uBCC0"], /* Hangul Syllable */ + ["\uBCC1", "\uBCC1"], /* Hangul Syllable */ + ["\uBCC2", "\uBCC2"], /* Hangul Syllable */ + ["\uBCC3", "\uBCC3"], /* Hangul Syllable */ + ["\uBCC4", "\uBCC4"], /* Hangul Syllable */ + ["\uBCC5", "\uBCC5"], /* Hangul Syllable */ + ["\uBCC6", "\uBCC6"], /* Hangul Syllable */ + ["\uBCC7", "\uBCC7"], /* Hangul Syllable */ + ["\uBCC8", "\uBCC8"], /* Hangul Syllable */ + ["\uBCC9", "\uBCC9"], /* Hangul Syllable */ + ["\uBCCA", "\uBCCA"], /* Hangul Syllable */ + ["\uBCCB", "\uBCCB"], /* Hangul Syllable */ + ["\uBCCC", "\uBCCC"], /* Hangul Syllable */ + ["\uBCCD", "\uBCCD"], /* Hangul Syllable */ + ["\uBCCE", "\uBCCE"], /* Hangul Syllable */ + ["\uBCCF", "\uBCCF"], /* Hangul Syllable */ + ["\uBCD0", "\uBCD0"], /* Hangul Syllable */ + ["\uBCD1", "\uBCD1"], /* Hangul Syllable */ + ["\uBCD2", "\uBCD2"], /* Hangul Syllable */ + ["\uBCD3", "\uBCD3"], /* Hangul Syllable */ + ["\uBCD4", "\uBCD4"], /* Hangul Syllable */ + ["\uBCD5", "\uBCD5"], /* Hangul Syllable */ + ["\uBCD6", "\uBCD6"], /* Hangul Syllable */ + ["\uBCD7", "\uBCD7"], /* Hangul Syllable */ + ["\uBCD8", "\uBCD8"], /* Hangul Syllable */ + ["\uBCD9", "\uBCD9"], /* Hangul Syllable */ + ["\uBCDA", "\uBCDA"], /* Hangul Syllable */ + ["\uBCDB", "\uBCDB"], /* Hangul Syllable */ + ["\uBCDC", "\uBCDC"], /* Hangul Syllable */ + ["\uBCDD", "\uBCDD"], /* Hangul Syllable */ + ["\uBCDE", "\uBCDE"], /* Hangul Syllable */ + ["\uBCDF", "\uBCDF"], /* Hangul Syllable */ + ["\uBCE0", "\uBCE0"], /* Hangul Syllable */ + ["\uBCE1", "\uBCE1"], /* Hangul Syllable */ + ["\uBCE2", "\uBCE2"], /* Hangul Syllable */ + ["\uBCE3", "\uBCE3"], /* Hangul Syllable */ + ["\uBCE4", "\uBCE4"], /* Hangul Syllable */ + ["\uBCE5", "\uBCE5"], /* Hangul Syllable */ + ["\uBCE6", "\uBCE6"], /* Hangul Syllable */ + ["\uBCE7", "\uBCE7"], /* Hangul Syllable */ + ["\uBCE8", "\uBCE8"], /* Hangul Syllable */ + ["\uBCE9", "\uBCE9"], /* Hangul Syllable */ + ["\uBCEA", "\uBCEA"], /* Hangul Syllable */ + ["\uBCEB", "\uBCEB"], /* Hangul Syllable */ + ["\uBCEC", "\uBCEC"], /* Hangul Syllable */ + ["\uBCED", "\uBCED"], /* Hangul Syllable */ + ["\uBCEE", "\uBCEE"], /* Hangul Syllable */ + ["\uBCEF", "\uBCEF"], /* Hangul Syllable */ + ["\uBCF0", "\uBCF0"], /* Hangul Syllable */ + ["\uBCF1", "\uBCF1"], /* Hangul Syllable */ + ["\uBCF2", "\uBCF2"], /* Hangul Syllable */ + ["\uBCF3", "\uBCF3"], /* Hangul Syllable */ + ["\uBCF4", "\uBCF4"], /* Hangul Syllable */ + ["\uBCF5", "\uBCF5"], /* Hangul Syllable */ + ["\uBCF6", "\uBCF6"], /* Hangul Syllable */ + ["\uBCF7", "\uBCF7"], /* Hangul Syllable */ + ["\uBCF8", "\uBCF8"], /* Hangul Syllable */ + ["\uBCF9", "\uBCF9"], /* Hangul Syllable */ + ["\uBCFA", "\uBCFA"], /* Hangul Syllable */ + ["\uBCFB", "\uBCFB"], /* Hangul Syllable */ + ["\uBCFC", "\uBCFC"], /* Hangul Syllable */ + ["\uBCFD", "\uBCFD"], /* Hangul Syllable */ + ["\uBCFE", "\uBCFE"], /* Hangul Syllable */ + ["\uBCFF", "\uBCFF"], /* Hangul Syllable */ + ["\uBD00", "\uBD00"], /* Hangul Syllable */ + ["\uBD01", "\uBD01"], /* Hangul Syllable */ + ["\uBD02", "\uBD02"], /* Hangul Syllable */ + ["\uBD03", "\uBD03"], /* Hangul Syllable */ + ["\uBD04", "\uBD04"], /* Hangul Syllable */ + ["\uBD05", "\uBD05"], /* Hangul Syllable */ + ["\uBD06", "\uBD06"], /* Hangul Syllable */ + ["\uBD07", "\uBD07"], /* Hangul Syllable */ + ["\uBD08", "\uBD08"], /* Hangul Syllable */ + ["\uBD09", "\uBD09"], /* Hangul Syllable */ + ["\uBD0A", "\uBD0A"], /* Hangul Syllable */ + ["\uBD0B", "\uBD0B"], /* Hangul Syllable */ + ["\uBD0C", "\uBD0C"], /* Hangul Syllable */ + ["\uBD0D", "\uBD0D"], /* Hangul Syllable */ + ["\uBD0E", "\uBD0E"], /* Hangul Syllable */ + ["\uBD0F", "\uBD0F"], /* Hangul Syllable */ + ["\uBD10", "\uBD10"], /* Hangul Syllable */ + ["\uBD11", "\uBD11"], /* Hangul Syllable */ + ["\uBD12", "\uBD12"], /* Hangul Syllable */ + ["\uBD13", "\uBD13"], /* Hangul Syllable */ + ["\uBD14", "\uBD14"], /* Hangul Syllable */ + ["\uBD15", "\uBD15"], /* Hangul Syllable */ + ["\uBD16", "\uBD16"], /* Hangul Syllable */ + ["\uBD17", "\uBD17"], /* Hangul Syllable */ + ["\uBD18", "\uBD18"], /* Hangul Syllable */ + ["\uBD19", "\uBD19"], /* Hangul Syllable */ + ["\uBD1A", "\uBD1A"], /* Hangul Syllable */ + ["\uBD1B", "\uBD1B"], /* Hangul Syllable */ + ["\uBD1C", "\uBD1C"], /* Hangul Syllable */ + ["\uBD1D", "\uBD1D"], /* Hangul Syllable */ + ["\uBD1E", "\uBD1E"], /* Hangul Syllable */ + ["\uBD1F", "\uBD1F"], /* Hangul Syllable */ + ["\uBD20", "\uBD20"], /* Hangul Syllable */ + ["\uBD21", "\uBD21"], /* Hangul Syllable */ + ["\uBD22", "\uBD22"], /* Hangul Syllable */ + ["\uBD23", "\uBD23"], /* Hangul Syllable */ + ["\uBD24", "\uBD24"], /* Hangul Syllable */ + ["\uBD25", "\uBD25"], /* Hangul Syllable */ + ["\uBD26", "\uBD26"], /* Hangul Syllable */ + ["\uBD27", "\uBD27"], /* Hangul Syllable */ + ["\uBD28", "\uBD28"], /* Hangul Syllable */ + ["\uBD29", "\uBD29"], /* Hangul Syllable */ + ["\uBD2A", "\uBD2A"], /* Hangul Syllable */ + ["\uBD2B", "\uBD2B"], /* Hangul Syllable */ + ["\uBD2C", "\uBD2C"], /* Hangul Syllable */ + ["\uBD2D", "\uBD2D"], /* Hangul Syllable */ + ["\uBD2E", "\uBD2E"], /* Hangul Syllable */ + ["\uBD2F", "\uBD2F"], /* Hangul Syllable */ + ["\uBD30", "\uBD30"], /* Hangul Syllable */ + ["\uBD31", "\uBD31"], /* Hangul Syllable */ + ["\uBD32", "\uBD32"], /* Hangul Syllable */ + ["\uBD33", "\uBD33"], /* Hangul Syllable */ + ["\uBD34", "\uBD34"], /* Hangul Syllable */ + ["\uBD35", "\uBD35"], /* Hangul Syllable */ + ["\uBD36", "\uBD36"], /* Hangul Syllable */ + ["\uBD37", "\uBD37"], /* Hangul Syllable */ + ["\uBD38", "\uBD38"], /* Hangul Syllable */ + ["\uBD39", "\uBD39"], /* Hangul Syllable */ + ["\uBD3A", "\uBD3A"], /* Hangul Syllable */ + ["\uBD3B", "\uBD3B"], /* Hangul Syllable */ + ["\uBD3C", "\uBD3C"], /* Hangul Syllable */ + ["\uBD3D", "\uBD3D"], /* Hangul Syllable */ + ["\uBD3E", "\uBD3E"], /* Hangul Syllable */ + ["\uBD3F", "\uBD3F"], /* Hangul Syllable */ + ["\uBD40", "\uBD40"], /* Hangul Syllable */ + ["\uBD41", "\uBD41"], /* Hangul Syllable */ + ["\uBD42", "\uBD42"], /* Hangul Syllable */ + ["\uBD43", "\uBD43"], /* Hangul Syllable */ + ["\uBD44", "\uBD44"], /* Hangul Syllable */ + ["\uBD45", "\uBD45"], /* Hangul Syllable */ + ["\uBD46", "\uBD46"], /* Hangul Syllable */ + ["\uBD47", "\uBD47"], /* Hangul Syllable */ + ["\uBD48", "\uBD48"], /* Hangul Syllable */ + ["\uBD49", "\uBD49"], /* Hangul Syllable */ + ["\uBD4A", "\uBD4A"], /* Hangul Syllable */ + ["\uBD4B", "\uBD4B"], /* Hangul Syllable */ + ["\uBD4C", "\uBD4C"], /* Hangul Syllable */ + ["\uBD4D", "\uBD4D"], /* Hangul Syllable */ + ["\uBD4E", "\uBD4E"], /* Hangul Syllable */ + ["\uBD4F", "\uBD4F"], /* Hangul Syllable */ + ["\uBD50", "\uBD50"], /* Hangul Syllable */ + ["\uBD51", "\uBD51"], /* Hangul Syllable */ + ["\uBD52", "\uBD52"], /* Hangul Syllable */ + ["\uBD53", "\uBD53"], /* Hangul Syllable */ + ["\uBD54", "\uBD54"], /* Hangul Syllable */ + ["\uBD55", "\uBD55"], /* Hangul Syllable */ + ["\uBD56", "\uBD56"], /* Hangul Syllable */ + ["\uBD57", "\uBD57"], /* Hangul Syllable */ + ["\uBD58", "\uBD58"], /* Hangul Syllable */ + ["\uBD59", "\uBD59"], /* Hangul Syllable */ + ["\uBD5A", "\uBD5A"], /* Hangul Syllable */ + ["\uBD5B", "\uBD5B"], /* Hangul Syllable */ + ["\uBD5C", "\uBD5C"], /* Hangul Syllable */ + ["\uBD5D", "\uBD5D"], /* Hangul Syllable */ + ["\uBD5E", "\uBD5E"], /* Hangul Syllable */ + ["\uBD5F", "\uBD5F"], /* Hangul Syllable */ + ["\uBD60", "\uBD60"], /* Hangul Syllable */ + ["\uBD61", "\uBD61"], /* Hangul Syllable */ + ["\uBD62", "\uBD62"], /* Hangul Syllable */ + ["\uBD63", "\uBD63"], /* Hangul Syllable */ + ["\uBD64", "\uBD64"], /* Hangul Syllable */ + ["\uBD65", "\uBD65"], /* Hangul Syllable */ + ["\uBD66", "\uBD66"], /* Hangul Syllable */ + ["\uBD67", "\uBD67"], /* Hangul Syllable */ + ["\uBD68", "\uBD68"], /* Hangul Syllable */ + ["\uBD69", "\uBD69"], /* Hangul Syllable */ + ["\uBD6A", "\uBD6A"], /* Hangul Syllable */ + ["\uBD6B", "\uBD6B"], /* Hangul Syllable */ + ["\uBD6C", "\uBD6C"], /* Hangul Syllable */ + ["\uBD6D", "\uBD6D"], /* Hangul Syllable */ + ["\uBD6E", "\uBD6E"], /* Hangul Syllable */ + ["\uBD6F", "\uBD6F"], /* Hangul Syllable */ + ["\uBD70", "\uBD70"], /* Hangul Syllable */ + ["\uBD71", "\uBD71"], /* Hangul Syllable */ + ["\uBD72", "\uBD72"], /* Hangul Syllable */ + ["\uBD73", "\uBD73"], /* Hangul Syllable */ + ["\uBD74", "\uBD74"], /* Hangul Syllable */ + ["\uBD75", "\uBD75"], /* Hangul Syllable */ + ["\uBD76", "\uBD76"], /* Hangul Syllable */ + ["\uBD77", "\uBD77"], /* Hangul Syllable */ + ["\uBD78", "\uBD78"], /* Hangul Syllable */ + ["\uBD79", "\uBD79"], /* Hangul Syllable */ + ["\uBD7A", "\uBD7A"], /* Hangul Syllable */ + ["\uBD7B", "\uBD7B"], /* Hangul Syllable */ + ["\uBD7C", "\uBD7C"], /* Hangul Syllable */ + ["\uBD7D", "\uBD7D"], /* Hangul Syllable */ + ["\uBD7E", "\uBD7E"], /* Hangul Syllable */ + ["\uBD7F", "\uBD7F"], /* Hangul Syllable */ + ["\uBD80", "\uBD80"], /* Hangul Syllable */ + ["\uBD81", "\uBD81"], /* Hangul Syllable */ + ["\uBD82", "\uBD82"], /* Hangul Syllable */ + ["\uBD83", "\uBD83"], /* Hangul Syllable */ + ["\uBD84", "\uBD84"], /* Hangul Syllable */ + ["\uBD85", "\uBD85"], /* Hangul Syllable */ + ["\uBD86", "\uBD86"], /* Hangul Syllable */ + ["\uBD87", "\uBD87"], /* Hangul Syllable */ + ["\uBD88", "\uBD88"], /* Hangul Syllable */ + ["\uBD89", "\uBD89"], /* Hangul Syllable */ + ["\uBD8A", "\uBD8A"], /* Hangul Syllable */ + ["\uBD8B", "\uBD8B"], /* Hangul Syllable */ + ["\uBD8C", "\uBD8C"], /* Hangul Syllable */ + ["\uBD8D", "\uBD8D"], /* Hangul Syllable */ + ["\uBD8E", "\uBD8E"], /* Hangul Syllable */ + ["\uBD8F", "\uBD8F"], /* Hangul Syllable */ + ["\uBD90", "\uBD90"], /* Hangul Syllable */ + ["\uBD91", "\uBD91"], /* Hangul Syllable */ + ["\uBD92", "\uBD92"], /* Hangul Syllable */ + ["\uBD93", "\uBD93"], /* Hangul Syllable */ + ["\uBD94", "\uBD94"], /* Hangul Syllable */ + ["\uBD95", "\uBD95"], /* Hangul Syllable */ + ["\uBD96", "\uBD96"], /* Hangul Syllable */ + ["\uBD97", "\uBD97"], /* Hangul Syllable */ + ["\uBD98", "\uBD98"], /* Hangul Syllable */ + ["\uBD99", "\uBD99"], /* Hangul Syllable */ + ["\uBD9A", "\uBD9A"], /* Hangul Syllable */ + ["\uBD9B", "\uBD9B"], /* Hangul Syllable */ + ["\uBD9C", "\uBD9C"], /* Hangul Syllable */ + ["\uBD9D", "\uBD9D"], /* Hangul Syllable */ + ["\uBD9E", "\uBD9E"], /* Hangul Syllable */ + ["\uBD9F", "\uBD9F"], /* Hangul Syllable */ + ["\uBDA0", "\uBDA0"], /* Hangul Syllable */ + ["\uBDA1", "\uBDA1"], /* Hangul Syllable */ + ["\uBDA2", "\uBDA2"], /* Hangul Syllable */ + ["\uBDA3", "\uBDA3"], /* Hangul Syllable */ + ["\uBDA4", "\uBDA4"], /* Hangul Syllable */ + ["\uBDA5", "\uBDA5"], /* Hangul Syllable */ + ["\uBDA6", "\uBDA6"], /* Hangul Syllable */ + ["\uBDA7", "\uBDA7"], /* Hangul Syllable */ + ["\uBDA8", "\uBDA8"], /* Hangul Syllable */ + ["\uBDA9", "\uBDA9"], /* Hangul Syllable */ + ["\uBDAA", "\uBDAA"], /* Hangul Syllable */ + ["\uBDAB", "\uBDAB"], /* Hangul Syllable */ + ["\uBDAC", "\uBDAC"], /* Hangul Syllable */ + ["\uBDAD", "\uBDAD"], /* Hangul Syllable */ + ["\uBDAE", "\uBDAE"], /* Hangul Syllable */ + ["\uBDAF", "\uBDAF"], /* Hangul Syllable */ + ["\uBDB0", "\uBDB0"], /* Hangul Syllable */ + ["\uBDB1", "\uBDB1"], /* Hangul Syllable */ + ["\uBDB2", "\uBDB2"], /* Hangul Syllable */ + ["\uBDB3", "\uBDB3"], /* Hangul Syllable */ + ["\uBDB4", "\uBDB4"], /* Hangul Syllable */ + ["\uBDB5", "\uBDB5"], /* Hangul Syllable */ + ["\uBDB6", "\uBDB6"], /* Hangul Syllable */ + ["\uBDB7", "\uBDB7"], /* Hangul Syllable */ + ["\uBDB8", "\uBDB8"], /* Hangul Syllable */ + ["\uBDB9", "\uBDB9"], /* Hangul Syllable */ + ["\uBDBA", "\uBDBA"], /* Hangul Syllable */ + ["\uBDBB", "\uBDBB"], /* Hangul Syllable */ + ["\uBDBC", "\uBDBC"], /* Hangul Syllable */ + ["\uBDBD", "\uBDBD"], /* Hangul Syllable */ + ["\uBDBE", "\uBDBE"], /* Hangul Syllable */ + ["\uBDBF", "\uBDBF"], /* Hangul Syllable */ + ["\uBDC0", "\uBDC0"], /* Hangul Syllable */ + ["\uBDC1", "\uBDC1"], /* Hangul Syllable */ + ["\uBDC2", "\uBDC2"], /* Hangul Syllable */ + ["\uBDC3", "\uBDC3"], /* Hangul Syllable */ + ["\uBDC4", "\uBDC4"], /* Hangul Syllable */ + ["\uBDC5", "\uBDC5"], /* Hangul Syllable */ + ["\uBDC6", "\uBDC6"], /* Hangul Syllable */ + ["\uBDC7", "\uBDC7"], /* Hangul Syllable */ + ["\uBDC8", "\uBDC8"], /* Hangul Syllable */ + ["\uBDC9", "\uBDC9"], /* Hangul Syllable */ + ["\uBDCA", "\uBDCA"], /* Hangul Syllable */ + ["\uBDCB", "\uBDCB"], /* Hangul Syllable */ + ["\uBDCC", "\uBDCC"], /* Hangul Syllable */ + ["\uBDCD", "\uBDCD"], /* Hangul Syllable */ + ["\uBDCE", "\uBDCE"], /* Hangul Syllable */ + ["\uBDCF", "\uBDCF"], /* Hangul Syllable */ + ["\uBDD0", "\uBDD0"], /* Hangul Syllable */ + ["\uBDD1", "\uBDD1"], /* Hangul Syllable */ + ["\uBDD2", "\uBDD2"], /* Hangul Syllable */ + ["\uBDD3", "\uBDD3"], /* Hangul Syllable */ + ["\uBDD4", "\uBDD4"], /* Hangul Syllable */ + ["\uBDD5", "\uBDD5"], /* Hangul Syllable */ + ["\uBDD6", "\uBDD6"], /* Hangul Syllable */ + ["\uBDD7", "\uBDD7"], /* Hangul Syllable */ + ["\uBDD8", "\uBDD8"], /* Hangul Syllable */ + ["\uBDD9", "\uBDD9"], /* Hangul Syllable */ + ["\uBDDA", "\uBDDA"], /* Hangul Syllable */ + ["\uBDDB", "\uBDDB"], /* Hangul Syllable */ + ["\uBDDC", "\uBDDC"], /* Hangul Syllable */ + ["\uBDDD", "\uBDDD"], /* Hangul Syllable */ + ["\uBDDE", "\uBDDE"], /* Hangul Syllable */ + ["\uBDDF", "\uBDDF"], /* Hangul Syllable */ + ["\uBDE0", "\uBDE0"], /* Hangul Syllable */ + ["\uBDE1", "\uBDE1"], /* Hangul Syllable */ + ["\uBDE2", "\uBDE2"], /* Hangul Syllable */ + ["\uBDE3", "\uBDE3"], /* Hangul Syllable */ + ["\uBDE4", "\uBDE4"], /* Hangul Syllable */ + ["\uBDE5", "\uBDE5"], /* Hangul Syllable */ + ["\uBDE6", "\uBDE6"], /* Hangul Syllable */ + ["\uBDE7", "\uBDE7"], /* Hangul Syllable */ + ["\uBDE8", "\uBDE8"], /* Hangul Syllable */ + ["\uBDE9", "\uBDE9"], /* Hangul Syllable */ + ["\uBDEA", "\uBDEA"], /* Hangul Syllable */ + ["\uBDEB", "\uBDEB"], /* Hangul Syllable */ + ["\uBDEC", "\uBDEC"], /* Hangul Syllable */ + ["\uBDED", "\uBDED"], /* Hangul Syllable */ + ["\uBDEE", "\uBDEE"], /* Hangul Syllable */ + ["\uBDEF", "\uBDEF"], /* Hangul Syllable */ + ["\uBDF0", "\uBDF0"], /* Hangul Syllable */ + ["\uBDF1", "\uBDF1"], /* Hangul Syllable */ + ["\uBDF2", "\uBDF2"], /* Hangul Syllable */ + ["\uBDF3", "\uBDF3"], /* Hangul Syllable */ + ["\uBDF4", "\uBDF4"], /* Hangul Syllable */ + ["\uBDF5", "\uBDF5"], /* Hangul Syllable */ + ["\uBDF6", "\uBDF6"], /* Hangul Syllable */ + ["\uBDF7", "\uBDF7"], /* Hangul Syllable */ + ["\uBDF8", "\uBDF8"], /* Hangul Syllable */ + ["\uBDF9", "\uBDF9"], /* Hangul Syllable */ + ["\uBDFA", "\uBDFA"], /* Hangul Syllable */ + ["\uBDFB", "\uBDFB"], /* Hangul Syllable */ + ["\uBDFC", "\uBDFC"], /* Hangul Syllable */ + ["\uBDFD", "\uBDFD"], /* Hangul Syllable */ + ["\uBDFE", "\uBDFE"], /* Hangul Syllable */ + ["\uBDFF", "\uBDFF"], /* Hangul Syllable */ + ["\uBE00", "\uBE00"], /* Hangul Syllable */ + ["\uBE01", "\uBE01"], /* Hangul Syllable */ + ["\uBE02", "\uBE02"], /* Hangul Syllable */ + ["\uBE03", "\uBE03"], /* Hangul Syllable */ + ["\uBE04", "\uBE04"], /* Hangul Syllable */ + ["\uBE05", "\uBE05"], /* Hangul Syllable */ + ["\uBE06", "\uBE06"], /* Hangul Syllable */ + ["\uBE07", "\uBE07"], /* Hangul Syllable */ + ["\uBE08", "\uBE08"], /* Hangul Syllable */ + ["\uBE09", "\uBE09"], /* Hangul Syllable */ + ["\uBE0A", "\uBE0A"], /* Hangul Syllable */ + ["\uBE0B", "\uBE0B"], /* Hangul Syllable */ + ["\uBE0C", "\uBE0C"], /* Hangul Syllable */ + ["\uBE0D", "\uBE0D"], /* Hangul Syllable */ + ["\uBE0E", "\uBE0E"], /* Hangul Syllable */ + ["\uBE0F", "\uBE0F"], /* Hangul Syllable */ + ["\uBE10", "\uBE10"], /* Hangul Syllable */ + ["\uBE11", "\uBE11"], /* Hangul Syllable */ + ["\uBE12", "\uBE12"], /* Hangul Syllable */ + ["\uBE13", "\uBE13"], /* Hangul Syllable */ + ["\uBE14", "\uBE14"], /* Hangul Syllable */ + ["\uBE15", "\uBE15"], /* Hangul Syllable */ + ["\uBE16", "\uBE16"], /* Hangul Syllable */ + ["\uBE17", "\uBE17"], /* Hangul Syllable */ + ["\uBE18", "\uBE18"], /* Hangul Syllable */ + ["\uBE19", "\uBE19"], /* Hangul Syllable */ + ["\uBE1A", "\uBE1A"], /* Hangul Syllable */ + ["\uBE1B", "\uBE1B"], /* Hangul Syllable */ + ["\uBE1C", "\uBE1C"], /* Hangul Syllable */ + ["\uBE1D", "\uBE1D"], /* Hangul Syllable */ + ["\uBE1E", "\uBE1E"], /* Hangul Syllable */ + ["\uBE1F", "\uBE1F"], /* Hangul Syllable */ + ["\uBE20", "\uBE20"], /* Hangul Syllable */ + ["\uBE21", "\uBE21"], /* Hangul Syllable */ + ["\uBE22", "\uBE22"], /* Hangul Syllable */ + ["\uBE23", "\uBE23"], /* Hangul Syllable */ + ["\uBE24", "\uBE24"], /* Hangul Syllable */ + ["\uBE25", "\uBE25"], /* Hangul Syllable */ + ["\uBE26", "\uBE26"], /* Hangul Syllable */ + ["\uBE27", "\uBE27"], /* Hangul Syllable */ + ["\uBE28", "\uBE28"], /* Hangul Syllable */ + ["\uBE29", "\uBE29"], /* Hangul Syllable */ + ["\uBE2A", "\uBE2A"], /* Hangul Syllable */ + ["\uBE2B", "\uBE2B"], /* Hangul Syllable */ + ["\uBE2C", "\uBE2C"], /* Hangul Syllable */ + ["\uBE2D", "\uBE2D"], /* Hangul Syllable */ + ["\uBE2E", "\uBE2E"], /* Hangul Syllable */ + ["\uBE2F", "\uBE2F"], /* Hangul Syllable */ + ["\uBE30", "\uBE30"], /* Hangul Syllable */ + ["\uBE31", "\uBE31"], /* Hangul Syllable */ + ["\uBE32", "\uBE32"], /* Hangul Syllable */ + ["\uBE33", "\uBE33"], /* Hangul Syllable */ + ["\uBE34", "\uBE34"], /* Hangul Syllable */ + ["\uBE35", "\uBE35"], /* Hangul Syllable */ + ["\uBE36", "\uBE36"], /* Hangul Syllable */ + ["\uBE37", "\uBE37"], /* Hangul Syllable */ + ["\uBE38", "\uBE38"], /* Hangul Syllable */ + ["\uBE39", "\uBE39"], /* Hangul Syllable */ + ["\uBE3A", "\uBE3A"], /* Hangul Syllable */ + ["\uBE3B", "\uBE3B"], /* Hangul Syllable */ + ["\uBE3C", "\uBE3C"], /* Hangul Syllable */ + ["\uBE3D", "\uBE3D"], /* Hangul Syllable */ + ["\uBE3E", "\uBE3E"], /* Hangul Syllable */ + ["\uBE3F", "\uBE3F"], /* Hangul Syllable */ + ["\uBE40", "\uBE40"], /* Hangul Syllable */ + ["\uBE41", "\uBE41"], /* Hangul Syllable */ + ["\uBE42", "\uBE42"], /* Hangul Syllable */ + ["\uBE43", "\uBE43"], /* Hangul Syllable */ + ["\uBE44", "\uBE44"], /* Hangul Syllable */ + ["\uBE45", "\uBE45"], /* Hangul Syllable */ + ["\uBE46", "\uBE46"], /* Hangul Syllable */ + ["\uBE47", "\uBE47"], /* Hangul Syllable */ + ["\uBE48", "\uBE48"], /* Hangul Syllable */ + ["\uBE49", "\uBE49"], /* Hangul Syllable */ + ["\uBE4A", "\uBE4A"], /* Hangul Syllable */ + ["\uBE4B", "\uBE4B"], /* Hangul Syllable */ + ["\uBE4C", "\uBE4C"], /* Hangul Syllable */ + ["\uBE4D", "\uBE4D"], /* Hangul Syllable */ + ["\uBE4E", "\uBE4E"], /* Hangul Syllable */ + ["\uBE4F", "\uBE4F"], /* Hangul Syllable */ + ["\uBE50", "\uBE50"], /* Hangul Syllable */ + ["\uBE51", "\uBE51"], /* Hangul Syllable */ + ["\uBE52", "\uBE52"], /* Hangul Syllable */ + ["\uBE53", "\uBE53"], /* Hangul Syllable */ + ["\uBE54", "\uBE54"], /* Hangul Syllable */ + ["\uBE55", "\uBE55"], /* Hangul Syllable */ + ["\uBE56", "\uBE56"], /* Hangul Syllable */ + ["\uBE57", "\uBE57"], /* Hangul Syllable */ + ["\uBE58", "\uBE58"], /* Hangul Syllable */ + ["\uBE59", "\uBE59"], /* Hangul Syllable */ + ["\uBE5A", "\uBE5A"], /* Hangul Syllable */ + ["\uBE5B", "\uBE5B"], /* Hangul Syllable */ + ["\uBE5C", "\uBE5C"], /* Hangul Syllable */ + ["\uBE5D", "\uBE5D"], /* Hangul Syllable */ + ["\uBE5E", "\uBE5E"], /* Hangul Syllable */ + ["\uBE5F", "\uBE5F"], /* Hangul Syllable */ + ["\uBE60", "\uBE60"], /* Hangul Syllable */ + ["\uBE61", "\uBE61"], /* Hangul Syllable */ + ["\uBE62", "\uBE62"], /* Hangul Syllable */ + ["\uBE63", "\uBE63"], /* Hangul Syllable */ + ["\uBE64", "\uBE64"], /* Hangul Syllable */ + ["\uBE65", "\uBE65"], /* Hangul Syllable */ + ["\uBE66", "\uBE66"], /* Hangul Syllable */ + ["\uBE67", "\uBE67"], /* Hangul Syllable */ + ["\uBE68", "\uBE68"], /* Hangul Syllable */ + ["\uBE69", "\uBE69"], /* Hangul Syllable */ + ["\uBE6A", "\uBE6A"], /* Hangul Syllable */ + ["\uBE6B", "\uBE6B"], /* Hangul Syllable */ + ["\uBE6C", "\uBE6C"], /* Hangul Syllable */ + ["\uBE6D", "\uBE6D"], /* Hangul Syllable */ + ["\uBE6E", "\uBE6E"], /* Hangul Syllable */ + ["\uBE6F", "\uBE6F"], /* Hangul Syllable */ + ["\uBE70", "\uBE70"], /* Hangul Syllable */ + ["\uBE71", "\uBE71"], /* Hangul Syllable */ + ["\uBE72", "\uBE72"], /* Hangul Syllable */ + ["\uBE73", "\uBE73"], /* Hangul Syllable */ + ["\uBE74", "\uBE74"], /* Hangul Syllable */ + ["\uBE75", "\uBE75"], /* Hangul Syllable */ + ["\uBE76", "\uBE76"], /* Hangul Syllable */ + ["\uBE77", "\uBE77"], /* Hangul Syllable */ + ["\uBE78", "\uBE78"], /* Hangul Syllable */ + ["\uBE79", "\uBE79"], /* Hangul Syllable */ + ["\uBE7A", "\uBE7A"], /* Hangul Syllable */ + ["\uBE7B", "\uBE7B"], /* Hangul Syllable */ + ["\uBE7C", "\uBE7C"], /* Hangul Syllable */ + ["\uBE7D", "\uBE7D"], /* Hangul Syllable */ + ["\uBE7E", "\uBE7E"], /* Hangul Syllable */ + ["\uBE7F", "\uBE7F"], /* Hangul Syllable */ + ["\uBE80", "\uBE80"], /* Hangul Syllable */ + ["\uBE81", "\uBE81"], /* Hangul Syllable */ + ["\uBE82", "\uBE82"], /* Hangul Syllable */ + ["\uBE83", "\uBE83"], /* Hangul Syllable */ + ["\uBE84", "\uBE84"], /* Hangul Syllable */ + ["\uBE85", "\uBE85"], /* Hangul Syllable */ + ["\uBE86", "\uBE86"], /* Hangul Syllable */ + ["\uBE87", "\uBE87"], /* Hangul Syllable */ + ["\uBE88", "\uBE88"], /* Hangul Syllable */ + ["\uBE89", "\uBE89"], /* Hangul Syllable */ + ["\uBE8A", "\uBE8A"], /* Hangul Syllable */ + ["\uBE8B", "\uBE8B"], /* Hangul Syllable */ + ["\uBE8C", "\uBE8C"], /* Hangul Syllable */ + ["\uBE8D", "\uBE8D"], /* Hangul Syllable */ + ["\uBE8E", "\uBE8E"], /* Hangul Syllable */ + ["\uBE8F", "\uBE8F"], /* Hangul Syllable */ + ["\uBE90", "\uBE90"], /* Hangul Syllable */ + ["\uBE91", "\uBE91"], /* Hangul Syllable */ + ["\uBE92", "\uBE92"], /* Hangul Syllable */ + ["\uBE93", "\uBE93"], /* Hangul Syllable */ + ["\uBE94", "\uBE94"], /* Hangul Syllable */ + ["\uBE95", "\uBE95"], /* Hangul Syllable */ + ["\uBE96", "\uBE96"], /* Hangul Syllable */ + ["\uBE97", "\uBE97"], /* Hangul Syllable */ + ["\uBE98", "\uBE98"], /* Hangul Syllable */ + ["\uBE99", "\uBE99"], /* Hangul Syllable */ + ["\uBE9A", "\uBE9A"], /* Hangul Syllable */ + ["\uBE9B", "\uBE9B"], /* Hangul Syllable */ + ["\uBE9C", "\uBE9C"], /* Hangul Syllable */ + ["\uBE9D", "\uBE9D"], /* Hangul Syllable */ + ["\uBE9E", "\uBE9E"], /* Hangul Syllable */ + ["\uBE9F", "\uBE9F"], /* Hangul Syllable */ + ["\uBEA0", "\uBEA0"], /* Hangul Syllable */ + ["\uBEA1", "\uBEA1"], /* Hangul Syllable */ + ["\uBEA2", "\uBEA2"], /* Hangul Syllable */ + ["\uBEA3", "\uBEA3"], /* Hangul Syllable */ + ["\uBEA4", "\uBEA4"], /* Hangul Syllable */ + ["\uBEA5", "\uBEA5"], /* Hangul Syllable */ + ["\uBEA6", "\uBEA6"], /* Hangul Syllable */ + ["\uBEA7", "\uBEA7"], /* Hangul Syllable */ + ["\uBEA8", "\uBEA8"], /* Hangul Syllable */ + ["\uBEA9", "\uBEA9"], /* Hangul Syllable */ + ["\uBEAA", "\uBEAA"], /* Hangul Syllable */ + ["\uBEAB", "\uBEAB"], /* Hangul Syllable */ + ["\uBEAC", "\uBEAC"], /* Hangul Syllable */ + ["\uBEAD", "\uBEAD"], /* Hangul Syllable */ + ["\uBEAE", "\uBEAE"], /* Hangul Syllable */ + ["\uBEAF", "\uBEAF"], /* Hangul Syllable */ + ["\uBEB0", "\uBEB0"], /* Hangul Syllable */ + ["\uBEB1", "\uBEB1"], /* Hangul Syllable */ + ["\uBEB2", "\uBEB2"], /* Hangul Syllable */ + ["\uBEB3", "\uBEB3"], /* Hangul Syllable */ + ["\uBEB4", "\uBEB4"], /* Hangul Syllable */ + ["\uBEB5", "\uBEB5"], /* Hangul Syllable */ + ["\uBEB6", "\uBEB6"], /* Hangul Syllable */ + ["\uBEB7", "\uBEB7"], /* Hangul Syllable */ + ["\uBEB8", "\uBEB8"], /* Hangul Syllable */ + ["\uBEB9", "\uBEB9"], /* Hangul Syllable */ + ["\uBEBA", "\uBEBA"], /* Hangul Syllable */ + ["\uBEBB", "\uBEBB"], /* Hangul Syllable */ + ["\uBEBC", "\uBEBC"], /* Hangul Syllable */ + ["\uBEBD", "\uBEBD"], /* Hangul Syllable */ + ["\uBEBE", "\uBEBE"], /* Hangul Syllable */ + ["\uBEBF", "\uBEBF"], /* Hangul Syllable */ + ["\uBEC0", "\uBEC0"], /* Hangul Syllable */ + ["\uBEC1", "\uBEC1"], /* Hangul Syllable */ + ["\uBEC2", "\uBEC2"], /* Hangul Syllable */ + ["\uBEC3", "\uBEC3"], /* Hangul Syllable */ + ["\uBEC4", "\uBEC4"], /* Hangul Syllable */ + ["\uBEC5", "\uBEC5"], /* Hangul Syllable */ + ["\uBEC6", "\uBEC6"], /* Hangul Syllable */ + ["\uBEC7", "\uBEC7"], /* Hangul Syllable */ + ["\uBEC8", "\uBEC8"], /* Hangul Syllable */ + ["\uBEC9", "\uBEC9"], /* Hangul Syllable */ + ["\uBECA", "\uBECA"], /* Hangul Syllable */ + ["\uBECB", "\uBECB"], /* Hangul Syllable */ + ["\uBECC", "\uBECC"], /* Hangul Syllable */ + ["\uBECD", "\uBECD"], /* Hangul Syllable */ + ["\uBECE", "\uBECE"], /* Hangul Syllable */ + ["\uBECF", "\uBECF"], /* Hangul Syllable */ + ["\uBED0", "\uBED0"], /* Hangul Syllable */ + ["\uBED1", "\uBED1"], /* Hangul Syllable */ + ["\uBED2", "\uBED2"], /* Hangul Syllable */ + ["\uBED3", "\uBED3"], /* Hangul Syllable */ + ["\uBED4", "\uBED4"], /* Hangul Syllable */ + ["\uBED5", "\uBED5"], /* Hangul Syllable */ + ["\uBED6", "\uBED6"], /* Hangul Syllable */ + ["\uBED7", "\uBED7"], /* Hangul Syllable */ + ["\uBED8", "\uBED8"], /* Hangul Syllable */ + ["\uBED9", "\uBED9"], /* Hangul Syllable */ + ["\uBEDA", "\uBEDA"], /* Hangul Syllable */ + ["\uBEDB", "\uBEDB"], /* Hangul Syllable */ + ["\uBEDC", "\uBEDC"], /* Hangul Syllable */ + ["\uBEDD", "\uBEDD"], /* Hangul Syllable */ + ["\uBEDE", "\uBEDE"], /* Hangul Syllable */ + ["\uBEDF", "\uBEDF"], /* Hangul Syllable */ + ["\uBEE0", "\uBEE0"], /* Hangul Syllable */ + ["\uBEE1", "\uBEE1"], /* Hangul Syllable */ + ["\uBEE2", "\uBEE2"], /* Hangul Syllable */ + ["\uBEE3", "\uBEE3"], /* Hangul Syllable */ + ["\uBEE4", "\uBEE4"], /* Hangul Syllable */ + ["\uBEE5", "\uBEE5"], /* Hangul Syllable */ + ["\uBEE6", "\uBEE6"], /* Hangul Syllable */ + ["\uBEE7", "\uBEE7"], /* Hangul Syllable */ + ["\uBEE8", "\uBEE8"], /* Hangul Syllable */ + ["\uBEE9", "\uBEE9"], /* Hangul Syllable */ + ["\uBEEA", "\uBEEA"], /* Hangul Syllable */ + ["\uBEEB", "\uBEEB"], /* Hangul Syllable */ + ["\uBEEC", "\uBEEC"], /* Hangul Syllable */ + ["\uBEED", "\uBEED"], /* Hangul Syllable */ + ["\uBEEE", "\uBEEE"], /* Hangul Syllable */ + ["\uBEEF", "\uBEEF"], /* Hangul Syllable */ + ["\uBEF0", "\uBEF0"], /* Hangul Syllable */ + ["\uBEF1", "\uBEF1"], /* Hangul Syllable */ + ["\uBEF2", "\uBEF2"], /* Hangul Syllable */ + ["\uBEF3", "\uBEF3"], /* Hangul Syllable */ + ["\uBEF4", "\uBEF4"], /* Hangul Syllable */ + ["\uBEF5", "\uBEF5"], /* Hangul Syllable */ + ["\uBEF6", "\uBEF6"], /* Hangul Syllable */ + ["\uBEF7", "\uBEF7"], /* Hangul Syllable */ + ["\uBEF8", "\uBEF8"], /* Hangul Syllable */ + ["\uBEF9", "\uBEF9"], /* Hangul Syllable */ + ["\uBEFA", "\uBEFA"], /* Hangul Syllable */ + ["\uBEFB", "\uBEFB"], /* Hangul Syllable */ + ["\uBEFC", "\uBEFC"], /* Hangul Syllable */ + ["\uBEFD", "\uBEFD"], /* Hangul Syllable */ + ["\uBEFE", "\uBEFE"], /* Hangul Syllable */ + ["\uBEFF", "\uBEFF"], /* Hangul Syllable */ + ["\uBF00", "\uBF00"], /* Hangul Syllable */ + ["\uBF01", "\uBF01"], /* Hangul Syllable */ + ["\uBF02", "\uBF02"], /* Hangul Syllable */ + ["\uBF03", "\uBF03"], /* Hangul Syllable */ + ["\uBF04", "\uBF04"], /* Hangul Syllable */ + ["\uBF05", "\uBF05"], /* Hangul Syllable */ + ["\uBF06", "\uBF06"], /* Hangul Syllable */ + ["\uBF07", "\uBF07"], /* Hangul Syllable */ + ["\uBF08", "\uBF08"], /* Hangul Syllable */ + ["\uBF09", "\uBF09"], /* Hangul Syllable */ + ["\uBF0A", "\uBF0A"], /* Hangul Syllable */ + ["\uBF0B", "\uBF0B"], /* Hangul Syllable */ + ["\uBF0C", "\uBF0C"], /* Hangul Syllable */ + ["\uBF0D", "\uBF0D"], /* Hangul Syllable */ + ["\uBF0E", "\uBF0E"], /* Hangul Syllable */ + ["\uBF0F", "\uBF0F"], /* Hangul Syllable */ + ["\uBF10", "\uBF10"], /* Hangul Syllable */ + ["\uBF11", "\uBF11"], /* Hangul Syllable */ + ["\uBF12", "\uBF12"], /* Hangul Syllable */ + ["\uBF13", "\uBF13"], /* Hangul Syllable */ + ["\uBF14", "\uBF14"], /* Hangul Syllable */ + ["\uBF15", "\uBF15"], /* Hangul Syllable */ + ["\uBF16", "\uBF16"], /* Hangul Syllable */ + ["\uBF17", "\uBF17"], /* Hangul Syllable */ + ["\uBF18", "\uBF18"], /* Hangul Syllable */ + ["\uBF19", "\uBF19"], /* Hangul Syllable */ + ["\uBF1A", "\uBF1A"], /* Hangul Syllable */ + ["\uBF1B", "\uBF1B"], /* Hangul Syllable */ + ["\uBF1C", "\uBF1C"], /* Hangul Syllable */ + ["\uBF1D", "\uBF1D"], /* Hangul Syllable */ + ["\uBF1E", "\uBF1E"], /* Hangul Syllable */ + ["\uBF1F", "\uBF1F"], /* Hangul Syllable */ + ["\uBF20", "\uBF20"], /* Hangul Syllable */ + ["\uBF21", "\uBF21"], /* Hangul Syllable */ + ["\uBF22", "\uBF22"], /* Hangul Syllable */ + ["\uBF23", "\uBF23"], /* Hangul Syllable */ + ["\uBF24", "\uBF24"], /* Hangul Syllable */ + ["\uBF25", "\uBF25"], /* Hangul Syllable */ + ["\uBF26", "\uBF26"], /* Hangul Syllable */ + ["\uBF27", "\uBF27"], /* Hangul Syllable */ + ["\uBF28", "\uBF28"], /* Hangul Syllable */ + ["\uBF29", "\uBF29"], /* Hangul Syllable */ + ["\uBF2A", "\uBF2A"], /* Hangul Syllable */ + ["\uBF2B", "\uBF2B"], /* Hangul Syllable */ + ["\uBF2C", "\uBF2C"], /* Hangul Syllable */ + ["\uBF2D", "\uBF2D"], /* Hangul Syllable */ + ["\uBF2E", "\uBF2E"], /* Hangul Syllable */ + ["\uBF2F", "\uBF2F"], /* Hangul Syllable */ + ["\uBF30", "\uBF30"], /* Hangul Syllable */ + ["\uBF31", "\uBF31"], /* Hangul Syllable */ + ["\uBF32", "\uBF32"], /* Hangul Syllable */ + ["\uBF33", "\uBF33"], /* Hangul Syllable */ + ["\uBF34", "\uBF34"], /* Hangul Syllable */ + ["\uBF35", "\uBF35"], /* Hangul Syllable */ + ["\uBF36", "\uBF36"], /* Hangul Syllable */ + ["\uBF37", "\uBF37"], /* Hangul Syllable */ + ["\uBF38", "\uBF38"], /* Hangul Syllable */ + ["\uBF39", "\uBF39"], /* Hangul Syllable */ + ["\uBF3A", "\uBF3A"], /* Hangul Syllable */ + ["\uBF3B", "\uBF3B"], /* Hangul Syllable */ + ["\uBF3C", "\uBF3C"], /* Hangul Syllable */ + ["\uBF3D", "\uBF3D"], /* Hangul Syllable */ + ["\uBF3E", "\uBF3E"], /* Hangul Syllable */ + ["\uBF3F", "\uBF3F"], /* Hangul Syllable */ + ["\uBF40", "\uBF40"], /* Hangul Syllable */ + ["\uBF41", "\uBF41"], /* Hangul Syllable */ + ["\uBF42", "\uBF42"], /* Hangul Syllable */ + ["\uBF43", "\uBF43"], /* Hangul Syllable */ + ["\uBF44", "\uBF44"], /* Hangul Syllable */ + ["\uBF45", "\uBF45"], /* Hangul Syllable */ + ["\uBF46", "\uBF46"], /* Hangul Syllable */ + ["\uBF47", "\uBF47"], /* Hangul Syllable */ + ["\uBF48", "\uBF48"], /* Hangul Syllable */ + ["\uBF49", "\uBF49"], /* Hangul Syllable */ + ["\uBF4A", "\uBF4A"], /* Hangul Syllable */ + ["\uBF4B", "\uBF4B"], /* Hangul Syllable */ + ["\uBF4C", "\uBF4C"], /* Hangul Syllable */ + ["\uBF4D", "\uBF4D"], /* Hangul Syllable */ + ["\uBF4E", "\uBF4E"], /* Hangul Syllable */ + ["\uBF4F", "\uBF4F"], /* Hangul Syllable */ + ["\uBF50", "\uBF50"], /* Hangul Syllable */ + ["\uBF51", "\uBF51"], /* Hangul Syllable */ + ["\uBF52", "\uBF52"], /* Hangul Syllable */ + ["\uBF53", "\uBF53"], /* Hangul Syllable */ + ["\uBF54", "\uBF54"], /* Hangul Syllable */ + ["\uBF55", "\uBF55"], /* Hangul Syllable */ + ["\uBF56", "\uBF56"], /* Hangul Syllable */ + ["\uBF57", "\uBF57"], /* Hangul Syllable */ + ["\uBF58", "\uBF58"], /* Hangul Syllable */ + ["\uBF59", "\uBF59"], /* Hangul Syllable */ + ["\uBF5A", "\uBF5A"], /* Hangul Syllable */ + ["\uBF5B", "\uBF5B"], /* Hangul Syllable */ + ["\uBF5C", "\uBF5C"], /* Hangul Syllable */ + ["\uBF5D", "\uBF5D"], /* Hangul Syllable */ + ["\uBF5E", "\uBF5E"], /* Hangul Syllable */ + ["\uBF5F", "\uBF5F"], /* Hangul Syllable */ + ["\uBF60", "\uBF60"], /* Hangul Syllable */ + ["\uBF61", "\uBF61"], /* Hangul Syllable */ + ["\uBF62", "\uBF62"], /* Hangul Syllable */ + ["\uBF63", "\uBF63"], /* Hangul Syllable */ + ["\uBF64", "\uBF64"], /* Hangul Syllable */ + ["\uBF65", "\uBF65"], /* Hangul Syllable */ + ["\uBF66", "\uBF66"], /* Hangul Syllable */ + ["\uBF67", "\uBF67"], /* Hangul Syllable */ + ["\uBF68", "\uBF68"], /* Hangul Syllable */ + ["\uBF69", "\uBF69"], /* Hangul Syllable */ + ["\uBF6A", "\uBF6A"], /* Hangul Syllable */ + ["\uBF6B", "\uBF6B"], /* Hangul Syllable */ + ["\uBF6C", "\uBF6C"], /* Hangul Syllable */ + ["\uBF6D", "\uBF6D"], /* Hangul Syllable */ + ["\uBF6E", "\uBF6E"], /* Hangul Syllable */ + ["\uBF6F", "\uBF6F"], /* Hangul Syllable */ + ["\uBF70", "\uBF70"], /* Hangul Syllable */ + ["\uBF71", "\uBF71"], /* Hangul Syllable */ + ["\uBF72", "\uBF72"], /* Hangul Syllable */ + ["\uBF73", "\uBF73"], /* Hangul Syllable */ + ["\uBF74", "\uBF74"], /* Hangul Syllable */ + ["\uBF75", "\uBF75"], /* Hangul Syllable */ + ["\uBF76", "\uBF76"], /* Hangul Syllable */ + ["\uBF77", "\uBF77"], /* Hangul Syllable */ + ["\uBF78", "\uBF78"], /* Hangul Syllable */ + ["\uBF79", "\uBF79"], /* Hangul Syllable */ + ["\uBF7A", "\uBF7A"], /* Hangul Syllable */ + ["\uBF7B", "\uBF7B"], /* Hangul Syllable */ + ["\uBF7C", "\uBF7C"], /* Hangul Syllable */ + ["\uBF7D", "\uBF7D"], /* Hangul Syllable */ + ["\uBF7E", "\uBF7E"], /* Hangul Syllable */ + ["\uBF7F", "\uBF7F"], /* Hangul Syllable */ + ["\uBF80", "\uBF80"], /* Hangul Syllable */ + ["\uBF81", "\uBF81"], /* Hangul Syllable */ + ["\uBF82", "\uBF82"], /* Hangul Syllable */ + ["\uBF83", "\uBF83"], /* Hangul Syllable */ + ["\uBF84", "\uBF84"], /* Hangul Syllable */ + ["\uBF85", "\uBF85"], /* Hangul Syllable */ + ["\uBF86", "\uBF86"], /* Hangul Syllable */ + ["\uBF87", "\uBF87"], /* Hangul Syllable */ + ["\uBF88", "\uBF88"], /* Hangul Syllable */ + ["\uBF89", "\uBF89"], /* Hangul Syllable */ + ["\uBF8A", "\uBF8A"], /* Hangul Syllable */ + ["\uBF8B", "\uBF8B"], /* Hangul Syllable */ + ["\uBF8C", "\uBF8C"], /* Hangul Syllable */ + ["\uBF8D", "\uBF8D"], /* Hangul Syllable */ + ["\uBF8E", "\uBF8E"], /* Hangul Syllable */ + ["\uBF8F", "\uBF8F"], /* Hangul Syllable */ + ["\uBF90", "\uBF90"], /* Hangul Syllable */ + ["\uBF91", "\uBF91"], /* Hangul Syllable */ + ["\uBF92", "\uBF92"], /* Hangul Syllable */ + ["\uBF93", "\uBF93"], /* Hangul Syllable */ + ["\uBF94", "\uBF94"], /* Hangul Syllable */ + ["\uBF95", "\uBF95"], /* Hangul Syllable */ + ["\uBF96", "\uBF96"], /* Hangul Syllable */ + ["\uBF97", "\uBF97"], /* Hangul Syllable */ + ["\uBF98", "\uBF98"], /* Hangul Syllable */ + ["\uBF99", "\uBF99"], /* Hangul Syllable */ + ["\uBF9A", "\uBF9A"], /* Hangul Syllable */ + ["\uBF9B", "\uBF9B"], /* Hangul Syllable */ + ["\uBF9C", "\uBF9C"], /* Hangul Syllable */ + ["\uBF9D", "\uBF9D"], /* Hangul Syllable */ + ["\uBF9E", "\uBF9E"], /* Hangul Syllable */ + ["\uBF9F", "\uBF9F"], /* Hangul Syllable */ + ["\uBFA0", "\uBFA0"], /* Hangul Syllable */ + ["\uBFA1", "\uBFA1"], /* Hangul Syllable */ + ["\uBFA2", "\uBFA2"], /* Hangul Syllable */ + ["\uBFA3", "\uBFA3"], /* Hangul Syllable */ + ["\uBFA4", "\uBFA4"], /* Hangul Syllable */ + ["\uBFA5", "\uBFA5"], /* Hangul Syllable */ + ["\uBFA6", "\uBFA6"], /* Hangul Syllable */ + ["\uBFA7", "\uBFA7"], /* Hangul Syllable */ + ["\uBFA8", "\uBFA8"], /* Hangul Syllable */ + ["\uBFA9", "\uBFA9"], /* Hangul Syllable */ + ["\uBFAA", "\uBFAA"], /* Hangul Syllable */ + ["\uBFAB", "\uBFAB"], /* Hangul Syllable */ + ["\uBFAC", "\uBFAC"], /* Hangul Syllable */ + ["\uBFAD", "\uBFAD"], /* Hangul Syllable */ + ["\uBFAE", "\uBFAE"], /* Hangul Syllable */ + ["\uBFAF", "\uBFAF"], /* Hangul Syllable */ + ["\uBFB0", "\uBFB0"], /* Hangul Syllable */ + ["\uBFB1", "\uBFB1"], /* Hangul Syllable */ + ["\uBFB2", "\uBFB2"], /* Hangul Syllable */ + ["\uBFB3", "\uBFB3"], /* Hangul Syllable */ + ["\uBFB4", "\uBFB4"], /* Hangul Syllable */ + ["\uBFB5", "\uBFB5"], /* Hangul Syllable */ + ["\uBFB6", "\uBFB6"], /* Hangul Syllable */ + ["\uBFB7", "\uBFB7"], /* Hangul Syllable */ + ["\uBFB8", "\uBFB8"], /* Hangul Syllable */ + ["\uBFB9", "\uBFB9"], /* Hangul Syllable */ + ["\uBFBA", "\uBFBA"], /* Hangul Syllable */ + ["\uBFBB", "\uBFBB"], /* Hangul Syllable */ + ["\uBFBC", "\uBFBC"], /* Hangul Syllable */ + ["\uBFBD", "\uBFBD"], /* Hangul Syllable */ + ["\uBFBE", "\uBFBE"], /* Hangul Syllable */ + ["\uBFBF", "\uBFBF"], /* Hangul Syllable */ + ["\uBFC0", "\uBFC0"], /* Hangul Syllable */ + ["\uBFC1", "\uBFC1"], /* Hangul Syllable */ + ["\uBFC2", "\uBFC2"], /* Hangul Syllable */ + ["\uBFC3", "\uBFC3"], /* Hangul Syllable */ + ["\uBFC4", "\uBFC4"], /* Hangul Syllable */ + ["\uBFC5", "\uBFC5"], /* Hangul Syllable */ + ["\uBFC6", "\uBFC6"], /* Hangul Syllable */ + ["\uBFC7", "\uBFC7"], /* Hangul Syllable */ + ["\uBFC8", "\uBFC8"], /* Hangul Syllable */ + ["\uBFC9", "\uBFC9"], /* Hangul Syllable */ + ["\uBFCA", "\uBFCA"], /* Hangul Syllable */ + ["\uBFCB", "\uBFCB"], /* Hangul Syllable */ + ["\uBFCC", "\uBFCC"], /* Hangul Syllable */ + ["\uBFCD", "\uBFCD"], /* Hangul Syllable */ + ["\uBFCE", "\uBFCE"], /* Hangul Syllable */ + ["\uBFCF", "\uBFCF"], /* Hangul Syllable */ + ["\uBFD0", "\uBFD0"], /* Hangul Syllable */ + ["\uBFD1", "\uBFD1"], /* Hangul Syllable */ + ["\uBFD2", "\uBFD2"], /* Hangul Syllable */ + ["\uBFD3", "\uBFD3"], /* Hangul Syllable */ + ["\uBFD4", "\uBFD4"], /* Hangul Syllable */ + ["\uBFD5", "\uBFD5"], /* Hangul Syllable */ + ["\uBFD6", "\uBFD6"], /* Hangul Syllable */ + ["\uBFD7", "\uBFD7"], /* Hangul Syllable */ + ["\uBFD8", "\uBFD8"], /* Hangul Syllable */ + ["\uBFD9", "\uBFD9"], /* Hangul Syllable */ + ["\uBFDA", "\uBFDA"], /* Hangul Syllable */ + ["\uBFDB", "\uBFDB"], /* Hangul Syllable */ + ["\uBFDC", "\uBFDC"], /* Hangul Syllable */ + ["\uBFDD", "\uBFDD"], /* Hangul Syllable */ + ["\uBFDE", "\uBFDE"], /* Hangul Syllable */ + ["\uBFDF", "\uBFDF"], /* Hangul Syllable */ + ["\uBFE0", "\uBFE0"], /* Hangul Syllable */ + ["\uBFE1", "\uBFE1"], /* Hangul Syllable */ + ["\uBFE2", "\uBFE2"], /* Hangul Syllable */ + ["\uBFE3", "\uBFE3"], /* Hangul Syllable */ + ["\uBFE4", "\uBFE4"], /* Hangul Syllable */ + ["\uBFE5", "\uBFE5"], /* Hangul Syllable */ + ["\uBFE6", "\uBFE6"], /* Hangul Syllable */ + ["\uBFE7", "\uBFE7"], /* Hangul Syllable */ + ["\uBFE8", "\uBFE8"], /* Hangul Syllable */ + ["\uBFE9", "\uBFE9"], /* Hangul Syllable */ + ["\uBFEA", "\uBFEA"], /* Hangul Syllable */ + ["\uBFEB", "\uBFEB"], /* Hangul Syllable */ + ["\uBFEC", "\uBFEC"], /* Hangul Syllable */ + ["\uBFED", "\uBFED"], /* Hangul Syllable */ + ["\uBFEE", "\uBFEE"], /* Hangul Syllable */ + ["\uBFEF", "\uBFEF"], /* Hangul Syllable */ + ["\uBFF0", "\uBFF0"], /* Hangul Syllable */ + ["\uBFF1", "\uBFF1"], /* Hangul Syllable */ + ["\uBFF2", "\uBFF2"], /* Hangul Syllable */ + ["\uBFF3", "\uBFF3"], /* Hangul Syllable */ + ["\uBFF4", "\uBFF4"], /* Hangul Syllable */ + ["\uBFF5", "\uBFF5"], /* Hangul Syllable */ + ["\uBFF6", "\uBFF6"], /* Hangul Syllable */ + ["\uBFF7", "\uBFF7"], /* Hangul Syllable */ + ["\uBFF8", "\uBFF8"], /* Hangul Syllable */ + ["\uBFF9", "\uBFF9"], /* Hangul Syllable */ + ["\uBFFA", "\uBFFA"], /* Hangul Syllable */ + ["\uBFFB", "\uBFFB"], /* Hangul Syllable */ + ["\uBFFC", "\uBFFC"], /* Hangul Syllable */ + ["\uBFFD", "\uBFFD"], /* Hangul Syllable */ + ["\uBFFE", "\uBFFE"], /* Hangul Syllable */ + ["\uBFFF", "\uBFFF"], /* Hangul Syllable */ + ["\uC000", "\uC000"], /* Hangul Syllable */ + ["\uC001", "\uC001"], /* Hangul Syllable */ + ["\uC002", "\uC002"], /* Hangul Syllable */ + ["\uC003", "\uC003"], /* Hangul Syllable */ + ["\uC004", "\uC004"], /* Hangul Syllable */ + ["\uC005", "\uC005"], /* Hangul Syllable */ + ["\uC006", "\uC006"], /* Hangul Syllable */ + ["\uC007", "\uC007"], /* Hangul Syllable */ + ["\uC008", "\uC008"], /* Hangul Syllable */ + ["\uC009", "\uC009"], /* Hangul Syllable */ + ["\uC00A", "\uC00A"], /* Hangul Syllable */ + ["\uC00B", "\uC00B"], /* Hangul Syllable */ + ["\uC00C", "\uC00C"], /* Hangul Syllable */ + ["\uC00D", "\uC00D"], /* Hangul Syllable */ + ["\uC00E", "\uC00E"], /* Hangul Syllable */ + ["\uC00F", "\uC00F"], /* Hangul Syllable */ + ["\uC010", "\uC010"], /* Hangul Syllable */ + ["\uC011", "\uC011"], /* Hangul Syllable */ + ["\uC012", "\uC012"], /* Hangul Syllable */ + ["\uC013", "\uC013"], /* Hangul Syllable */ + ["\uC014", "\uC014"], /* Hangul Syllable */ + ["\uC015", "\uC015"], /* Hangul Syllable */ + ["\uC016", "\uC016"], /* Hangul Syllable */ + ["\uC017", "\uC017"], /* Hangul Syllable */ + ["\uC018", "\uC018"], /* Hangul Syllable */ + ["\uC019", "\uC019"], /* Hangul Syllable */ + ["\uC01A", "\uC01A"], /* Hangul Syllable */ + ["\uC01B", "\uC01B"], /* Hangul Syllable */ + ["\uC01C", "\uC01C"], /* Hangul Syllable */ + ["\uC01D", "\uC01D"], /* Hangul Syllable */ + ["\uC01E", "\uC01E"], /* Hangul Syllable */ + ["\uC01F", "\uC01F"], /* Hangul Syllable */ + ["\uC020", "\uC020"], /* Hangul Syllable */ + ["\uC021", "\uC021"], /* Hangul Syllable */ + ["\uC022", "\uC022"], /* Hangul Syllable */ + ["\uC023", "\uC023"], /* Hangul Syllable */ + ["\uC024", "\uC024"], /* Hangul Syllable */ + ["\uC025", "\uC025"], /* Hangul Syllable */ + ["\uC026", "\uC026"], /* Hangul Syllable */ + ["\uC027", "\uC027"], /* Hangul Syllable */ + ["\uC028", "\uC028"], /* Hangul Syllable */ + ["\uC029", "\uC029"], /* Hangul Syllable */ + ["\uC02A", "\uC02A"], /* Hangul Syllable */ + ["\uC02B", "\uC02B"], /* Hangul Syllable */ + ["\uC02C", "\uC02C"], /* Hangul Syllable */ + ["\uC02D", "\uC02D"], /* Hangul Syllable */ + ["\uC02E", "\uC02E"], /* Hangul Syllable */ + ["\uC02F", "\uC02F"], /* Hangul Syllable */ + ["\uC030", "\uC030"], /* Hangul Syllable */ + ["\uC031", "\uC031"], /* Hangul Syllable */ + ["\uC032", "\uC032"], /* Hangul Syllable */ + ["\uC033", "\uC033"], /* Hangul Syllable */ + ["\uC034", "\uC034"], /* Hangul Syllable */ + ["\uC035", "\uC035"], /* Hangul Syllable */ + ["\uC036", "\uC036"], /* Hangul Syllable */ + ["\uC037", "\uC037"], /* Hangul Syllable */ + ["\uC038", "\uC038"], /* Hangul Syllable */ + ["\uC039", "\uC039"], /* Hangul Syllable */ + ["\uC03A", "\uC03A"], /* Hangul Syllable */ + ["\uC03B", "\uC03B"], /* Hangul Syllable */ + ["\uC03C", "\uC03C"], /* Hangul Syllable */ + ["\uC03D", "\uC03D"], /* Hangul Syllable */ + ["\uC03E", "\uC03E"], /* Hangul Syllable */ + ["\uC03F", "\uC03F"], /* Hangul Syllable */ + ["\uC040", "\uC040"], /* Hangul Syllable */ + ["\uC041", "\uC041"], /* Hangul Syllable */ + ["\uC042", "\uC042"], /* Hangul Syllable */ + ["\uC043", "\uC043"], /* Hangul Syllable */ + ["\uC044", "\uC044"], /* Hangul Syllable */ + ["\uC045", "\uC045"], /* Hangul Syllable */ + ["\uC046", "\uC046"], /* Hangul Syllable */ + ["\uC047", "\uC047"], /* Hangul Syllable */ + ["\uC048", "\uC048"], /* Hangul Syllable */ + ["\uC049", "\uC049"], /* Hangul Syllable */ + ["\uC04A", "\uC04A"], /* Hangul Syllable */ + ["\uC04B", "\uC04B"], /* Hangul Syllable */ + ["\uC04C", "\uC04C"], /* Hangul Syllable */ + ["\uC04D", "\uC04D"], /* Hangul Syllable */ + ["\uC04E", "\uC04E"], /* Hangul Syllable */ + ["\uC04F", "\uC04F"], /* Hangul Syllable */ + ["\uC050", "\uC050"], /* Hangul Syllable */ + ["\uC051", "\uC051"], /* Hangul Syllable */ + ["\uC052", "\uC052"], /* Hangul Syllable */ + ["\uC053", "\uC053"], /* Hangul Syllable */ + ["\uC054", "\uC054"], /* Hangul Syllable */ + ["\uC055", "\uC055"], /* Hangul Syllable */ + ["\uC056", "\uC056"], /* Hangul Syllable */ + ["\uC057", "\uC057"], /* Hangul Syllable */ + ["\uC058", "\uC058"], /* Hangul Syllable */ + ["\uC059", "\uC059"], /* Hangul Syllable */ + ["\uC05A", "\uC05A"], /* Hangul Syllable */ + ["\uC05B", "\uC05B"], /* Hangul Syllable */ + ["\uC05C", "\uC05C"], /* Hangul Syllable */ + ["\uC05D", "\uC05D"], /* Hangul Syllable */ + ["\uC05E", "\uC05E"], /* Hangul Syllable */ + ["\uC05F", "\uC05F"], /* Hangul Syllable */ + ["\uC060", "\uC060"], /* Hangul Syllable */ + ["\uC061", "\uC061"], /* Hangul Syllable */ + ["\uC062", "\uC062"], /* Hangul Syllable */ + ["\uC063", "\uC063"], /* Hangul Syllable */ + ["\uC064", "\uC064"], /* Hangul Syllable */ + ["\uC065", "\uC065"], /* Hangul Syllable */ + ["\uC066", "\uC066"], /* Hangul Syllable */ + ["\uC067", "\uC067"], /* Hangul Syllable */ + ["\uC068", "\uC068"], /* Hangul Syllable */ + ["\uC069", "\uC069"], /* Hangul Syllable */ + ["\uC06A", "\uC06A"], /* Hangul Syllable */ + ["\uC06B", "\uC06B"], /* Hangul Syllable */ + ["\uC06C", "\uC06C"], /* Hangul Syllable */ + ["\uC06D", "\uC06D"], /* Hangul Syllable */ + ["\uC06E", "\uC06E"], /* Hangul Syllable */ + ["\uC06F", "\uC06F"], /* Hangul Syllable */ + ["\uC070", "\uC070"], /* Hangul Syllable */ + ["\uC071", "\uC071"], /* Hangul Syllable */ + ["\uC072", "\uC072"], /* Hangul Syllable */ + ["\uC073", "\uC073"], /* Hangul Syllable */ + ["\uC074", "\uC074"], /* Hangul Syllable */ + ["\uC075", "\uC075"], /* Hangul Syllable */ + ["\uC076", "\uC076"], /* Hangul Syllable */ + ["\uC077", "\uC077"], /* Hangul Syllable */ + ["\uC078", "\uC078"], /* Hangul Syllable */ + ["\uC079", "\uC079"], /* Hangul Syllable */ + ["\uC07A", "\uC07A"], /* Hangul Syllable */ + ["\uC07B", "\uC07B"], /* Hangul Syllable */ + ["\uC07C", "\uC07C"], /* Hangul Syllable */ + ["\uC07D", "\uC07D"], /* Hangul Syllable */ + ["\uC07E", "\uC07E"], /* Hangul Syllable */ + ["\uC07F", "\uC07F"], /* Hangul Syllable */ + ["\uC080", "\uC080"], /* Hangul Syllable */ + ["\uC081", "\uC081"], /* Hangul Syllable */ + ["\uC082", "\uC082"], /* Hangul Syllable */ + ["\uC083", "\uC083"], /* Hangul Syllable */ + ["\uC084", "\uC084"], /* Hangul Syllable */ + ["\uC085", "\uC085"], /* Hangul Syllable */ + ["\uC086", "\uC086"], /* Hangul Syllable */ + ["\uC087", "\uC087"], /* Hangul Syllable */ + ["\uC088", "\uC088"], /* Hangul Syllable */ + ["\uC089", "\uC089"], /* Hangul Syllable */ + ["\uC08A", "\uC08A"], /* Hangul Syllable */ + ["\uC08B", "\uC08B"], /* Hangul Syllable */ + ["\uC08C", "\uC08C"], /* Hangul Syllable */ + ["\uC08D", "\uC08D"], /* Hangul Syllable */ + ["\uC08E", "\uC08E"], /* Hangul Syllable */ + ["\uC08F", "\uC08F"], /* Hangul Syllable */ + ["\uC090", "\uC090"], /* Hangul Syllable */ + ["\uC091", "\uC091"], /* Hangul Syllable */ + ["\uC092", "\uC092"], /* Hangul Syllable */ + ["\uC093", "\uC093"], /* Hangul Syllable */ + ["\uC094", "\uC094"], /* Hangul Syllable */ + ["\uC095", "\uC095"], /* Hangul Syllable */ + ["\uC096", "\uC096"], /* Hangul Syllable */ + ["\uC097", "\uC097"], /* Hangul Syllable */ + ["\uC098", "\uC098"], /* Hangul Syllable */ + ["\uC099", "\uC099"], /* Hangul Syllable */ + ["\uC09A", "\uC09A"], /* Hangul Syllable */ + ["\uC09B", "\uC09B"], /* Hangul Syllable */ + ["\uC09C", "\uC09C"], /* Hangul Syllable */ + ["\uC09D", "\uC09D"], /* Hangul Syllable */ + ["\uC09E", "\uC09E"], /* Hangul Syllable */ + ["\uC09F", "\uC09F"], /* Hangul Syllable */ + ["\uC0A0", "\uC0A0"], /* Hangul Syllable */ + ["\uC0A1", "\uC0A1"], /* Hangul Syllable */ + ["\uC0A2", "\uC0A2"], /* Hangul Syllable */ + ["\uC0A3", "\uC0A3"], /* Hangul Syllable */ + ["\uC0A4", "\uC0A4"], /* Hangul Syllable */ + ["\uC0A5", "\uC0A5"], /* Hangul Syllable */ + ["\uC0A6", "\uC0A6"], /* Hangul Syllable */ + ["\uC0A7", "\uC0A7"], /* Hangul Syllable */ + ["\uC0A8", "\uC0A8"], /* Hangul Syllable */ + ["\uC0A9", "\uC0A9"], /* Hangul Syllable */ + ["\uC0AA", "\uC0AA"], /* Hangul Syllable */ + ["\uC0AB", "\uC0AB"], /* Hangul Syllable */ + ["\uC0AC", "\uC0AC"], /* Hangul Syllable */ + ["\uC0AD", "\uC0AD"], /* Hangul Syllable */ + ["\uC0AE", "\uC0AE"], /* Hangul Syllable */ + ["\uC0AF", "\uC0AF"], /* Hangul Syllable */ + ["\uC0B0", "\uC0B0"], /* Hangul Syllable */ + ["\uC0B1", "\uC0B1"], /* Hangul Syllable */ + ["\uC0B2", "\uC0B2"], /* Hangul Syllable */ + ["\uC0B3", "\uC0B3"], /* Hangul Syllable */ + ["\uC0B4", "\uC0B4"], /* Hangul Syllable */ + ["\uC0B5", "\uC0B5"], /* Hangul Syllable */ + ["\uC0B6", "\uC0B6"], /* Hangul Syllable */ + ["\uC0B7", "\uC0B7"], /* Hangul Syllable */ + ["\uC0B8", "\uC0B8"], /* Hangul Syllable */ + ["\uC0B9", "\uC0B9"], /* Hangul Syllable */ + ["\uC0BA", "\uC0BA"], /* Hangul Syllable */ + ["\uC0BB", "\uC0BB"], /* Hangul Syllable */ + ["\uC0BC", "\uC0BC"], /* Hangul Syllable */ + ["\uC0BD", "\uC0BD"], /* Hangul Syllable */ + ["\uC0BE", "\uC0BE"], /* Hangul Syllable */ + ["\uC0BF", "\uC0BF"], /* Hangul Syllable */ + ["\uC0C0", "\uC0C0"], /* Hangul Syllable */ + ["\uC0C1", "\uC0C1"], /* Hangul Syllable */ + ["\uC0C2", "\uC0C2"], /* Hangul Syllable */ + ["\uC0C3", "\uC0C3"], /* Hangul Syllable */ + ["\uC0C4", "\uC0C4"], /* Hangul Syllable */ + ["\uC0C5", "\uC0C5"], /* Hangul Syllable */ + ["\uC0C6", "\uC0C6"], /* Hangul Syllable */ + ["\uC0C7", "\uC0C7"], /* Hangul Syllable */ + ["\uC0C8", "\uC0C8"], /* Hangul Syllable */ + ["\uC0C9", "\uC0C9"], /* Hangul Syllable */ + ["\uC0CA", "\uC0CA"], /* Hangul Syllable */ + ["\uC0CB", "\uC0CB"], /* Hangul Syllable */ + ["\uC0CC", "\uC0CC"], /* Hangul Syllable */ + ["\uC0CD", "\uC0CD"], /* Hangul Syllable */ + ["\uC0CE", "\uC0CE"], /* Hangul Syllable */ + ["\uC0CF", "\uC0CF"], /* Hangul Syllable */ + ["\uC0D0", "\uC0D0"], /* Hangul Syllable */ + ["\uC0D1", "\uC0D1"], /* Hangul Syllable */ + ["\uC0D2", "\uC0D2"], /* Hangul Syllable */ + ["\uC0D3", "\uC0D3"], /* Hangul Syllable */ + ["\uC0D4", "\uC0D4"], /* Hangul Syllable */ + ["\uC0D5", "\uC0D5"], /* Hangul Syllable */ + ["\uC0D6", "\uC0D6"], /* Hangul Syllable */ + ["\uC0D7", "\uC0D7"], /* Hangul Syllable */ + ["\uC0D8", "\uC0D8"], /* Hangul Syllable */ + ["\uC0D9", "\uC0D9"], /* Hangul Syllable */ + ["\uC0DA", "\uC0DA"], /* Hangul Syllable */ + ["\uC0DB", "\uC0DB"], /* Hangul Syllable */ + ["\uC0DC", "\uC0DC"], /* Hangul Syllable */ + ["\uC0DD", "\uC0DD"], /* Hangul Syllable */ + ["\uC0DE", "\uC0DE"], /* Hangul Syllable */ + ["\uC0DF", "\uC0DF"], /* Hangul Syllable */ + ["\uC0E0", "\uC0E0"], /* Hangul Syllable */ + ["\uC0E1", "\uC0E1"], /* Hangul Syllable */ + ["\uC0E2", "\uC0E2"], /* Hangul Syllable */ + ["\uC0E3", "\uC0E3"], /* Hangul Syllable */ + ["\uC0E4", "\uC0E4"], /* Hangul Syllable */ + ["\uC0E5", "\uC0E5"], /* Hangul Syllable */ + ["\uC0E6", "\uC0E6"], /* Hangul Syllable */ + ["\uC0E7", "\uC0E7"], /* Hangul Syllable */ + ["\uC0E8", "\uC0E8"], /* Hangul Syllable */ + ["\uC0E9", "\uC0E9"], /* Hangul Syllable */ + ["\uC0EA", "\uC0EA"], /* Hangul Syllable */ + ["\uC0EB", "\uC0EB"], /* Hangul Syllable */ + ["\uC0EC", "\uC0EC"], /* Hangul Syllable */ + ["\uC0ED", "\uC0ED"], /* Hangul Syllable */ + ["\uC0EE", "\uC0EE"], /* Hangul Syllable */ + ["\uC0EF", "\uC0EF"], /* Hangul Syllable */ + ["\uC0F0", "\uC0F0"], /* Hangul Syllable */ + ["\uC0F1", "\uC0F1"], /* Hangul Syllable */ + ["\uC0F2", "\uC0F2"], /* Hangul Syllable */ + ["\uC0F3", "\uC0F3"], /* Hangul Syllable */ + ["\uC0F4", "\uC0F4"], /* Hangul Syllable */ + ["\uC0F5", "\uC0F5"], /* Hangul Syllable */ + ["\uC0F6", "\uC0F6"], /* Hangul Syllable */ + ["\uC0F7", "\uC0F7"], /* Hangul Syllable */ + ["\uC0F8", "\uC0F8"], /* Hangul Syllable */ + ["\uC0F9", "\uC0F9"], /* Hangul Syllable */ + ["\uC0FA", "\uC0FA"], /* Hangul Syllable */ + ["\uC0FB", "\uC0FB"], /* Hangul Syllable */ + ["\uC0FC", "\uC0FC"], /* Hangul Syllable */ + ["\uC0FD", "\uC0FD"], /* Hangul Syllable */ + ["\uC0FE", "\uC0FE"], /* Hangul Syllable */ + ["\uC0FF", "\uC0FF"], /* Hangul Syllable */ + ["\uC100", "\uC100"], /* Hangul Syllable */ + ["\uC101", "\uC101"], /* Hangul Syllable */ + ["\uC102", "\uC102"], /* Hangul Syllable */ + ["\uC103", "\uC103"], /* Hangul Syllable */ + ["\uC104", "\uC104"], /* Hangul Syllable */ + ["\uC105", "\uC105"], /* Hangul Syllable */ + ["\uC106", "\uC106"], /* Hangul Syllable */ + ["\uC107", "\uC107"], /* Hangul Syllable */ + ["\uC108", "\uC108"], /* Hangul Syllable */ + ["\uC109", "\uC109"], /* Hangul Syllable */ + ["\uC10A", "\uC10A"], /* Hangul Syllable */ + ["\uC10B", "\uC10B"], /* Hangul Syllable */ + ["\uC10C", "\uC10C"], /* Hangul Syllable */ + ["\uC10D", "\uC10D"], /* Hangul Syllable */ + ["\uC10E", "\uC10E"], /* Hangul Syllable */ + ["\uC10F", "\uC10F"], /* Hangul Syllable */ + ["\uC110", "\uC110"], /* Hangul Syllable */ + ["\uC111", "\uC111"], /* Hangul Syllable */ + ["\uC112", "\uC112"], /* Hangul Syllable */ + ["\uC113", "\uC113"], /* Hangul Syllable */ + ["\uC114", "\uC114"], /* Hangul Syllable */ + ["\uC115", "\uC115"], /* Hangul Syllable */ + ["\uC116", "\uC116"], /* Hangul Syllable */ + ["\uC117", "\uC117"], /* Hangul Syllable */ + ["\uC118", "\uC118"], /* Hangul Syllable */ + ["\uC119", "\uC119"], /* Hangul Syllable */ + ["\uC11A", "\uC11A"], /* Hangul Syllable */ + ["\uC11B", "\uC11B"], /* Hangul Syllable */ + ["\uC11C", "\uC11C"], /* Hangul Syllable */ + ["\uC11D", "\uC11D"], /* Hangul Syllable */ + ["\uC11E", "\uC11E"], /* Hangul Syllable */ + ["\uC11F", "\uC11F"], /* Hangul Syllable */ + ["\uC120", "\uC120"], /* Hangul Syllable */ + ["\uC121", "\uC121"], /* Hangul Syllable */ + ["\uC122", "\uC122"], /* Hangul Syllable */ + ["\uC123", "\uC123"], /* Hangul Syllable */ + ["\uC124", "\uC124"], /* Hangul Syllable */ + ["\uC125", "\uC125"], /* Hangul Syllable */ + ["\uC126", "\uC126"], /* Hangul Syllable */ + ["\uC127", "\uC127"], /* Hangul Syllable */ + ["\uC128", "\uC128"], /* Hangul Syllable */ + ["\uC129", "\uC129"], /* Hangul Syllable */ + ["\uC12A", "\uC12A"], /* Hangul Syllable */ + ["\uC12B", "\uC12B"], /* Hangul Syllable */ + ["\uC12C", "\uC12C"], /* Hangul Syllable */ + ["\uC12D", "\uC12D"], /* Hangul Syllable */ + ["\uC12E", "\uC12E"], /* Hangul Syllable */ + ["\uC12F", "\uC12F"], /* Hangul Syllable */ + ["\uC130", "\uC130"], /* Hangul Syllable */ + ["\uC131", "\uC131"], /* Hangul Syllable */ + ["\uC132", "\uC132"], /* Hangul Syllable */ + ["\uC133", "\uC133"], /* Hangul Syllable */ + ["\uC134", "\uC134"], /* Hangul Syllable */ + ["\uC135", "\uC135"], /* Hangul Syllable */ + ["\uC136", "\uC136"], /* Hangul Syllable */ + ["\uC137", "\uC137"], /* Hangul Syllable */ + ["\uC138", "\uC138"], /* Hangul Syllable */ + ["\uC139", "\uC139"], /* Hangul Syllable */ + ["\uC13A", "\uC13A"], /* Hangul Syllable */ + ["\uC13B", "\uC13B"], /* Hangul Syllable */ + ["\uC13C", "\uC13C"], /* Hangul Syllable */ + ["\uC13D", "\uC13D"], /* Hangul Syllable */ + ["\uC13E", "\uC13E"], /* Hangul Syllable */ + ["\uC13F", "\uC13F"], /* Hangul Syllable */ + ["\uC140", "\uC140"], /* Hangul Syllable */ + ["\uC141", "\uC141"], /* Hangul Syllable */ + ["\uC142", "\uC142"], /* Hangul Syllable */ + ["\uC143", "\uC143"], /* Hangul Syllable */ + ["\uC144", "\uC144"], /* Hangul Syllable */ + ["\uC145", "\uC145"], /* Hangul Syllable */ + ["\uC146", "\uC146"], /* Hangul Syllable */ + ["\uC147", "\uC147"], /* Hangul Syllable */ + ["\uC148", "\uC148"], /* Hangul Syllable */ + ["\uC149", "\uC149"], /* Hangul Syllable */ + ["\uC14A", "\uC14A"], /* Hangul Syllable */ + ["\uC14B", "\uC14B"], /* Hangul Syllable */ + ["\uC14C", "\uC14C"], /* Hangul Syllable */ + ["\uC14D", "\uC14D"], /* Hangul Syllable */ + ["\uC14E", "\uC14E"], /* Hangul Syllable */ + ["\uC14F", "\uC14F"], /* Hangul Syllable */ + ["\uC150", "\uC150"], /* Hangul Syllable */ + ["\uC151", "\uC151"], /* Hangul Syllable */ + ["\uC152", "\uC152"], /* Hangul Syllable */ + ["\uC153", "\uC153"], /* Hangul Syllable */ + ["\uC154", "\uC154"], /* Hangul Syllable */ + ["\uC155", "\uC155"], /* Hangul Syllable */ + ["\uC156", "\uC156"], /* Hangul Syllable */ + ["\uC157", "\uC157"], /* Hangul Syllable */ + ["\uC158", "\uC158"], /* Hangul Syllable */ + ["\uC159", "\uC159"], /* Hangul Syllable */ + ["\uC15A", "\uC15A"], /* Hangul Syllable */ + ["\uC15B", "\uC15B"], /* Hangul Syllable */ + ["\uC15C", "\uC15C"], /* Hangul Syllable */ + ["\uC15D", "\uC15D"], /* Hangul Syllable */ + ["\uC15E", "\uC15E"], /* Hangul Syllable */ + ["\uC15F", "\uC15F"], /* Hangul Syllable */ + ["\uC160", "\uC160"], /* Hangul Syllable */ + ["\uC161", "\uC161"], /* Hangul Syllable */ + ["\uC162", "\uC162"], /* Hangul Syllable */ + ["\uC163", "\uC163"], /* Hangul Syllable */ + ["\uC164", "\uC164"], /* Hangul Syllable */ + ["\uC165", "\uC165"], /* Hangul Syllable */ + ["\uC166", "\uC166"], /* Hangul Syllable */ + ["\uC167", "\uC167"], /* Hangul Syllable */ + ["\uC168", "\uC168"], /* Hangul Syllable */ + ["\uC169", "\uC169"], /* Hangul Syllable */ + ["\uC16A", "\uC16A"], /* Hangul Syllable */ + ["\uC16B", "\uC16B"], /* Hangul Syllable */ + ["\uC16C", "\uC16C"], /* Hangul Syllable */ + ["\uC16D", "\uC16D"], /* Hangul Syllable */ + ["\uC16E", "\uC16E"], /* Hangul Syllable */ + ["\uC16F", "\uC16F"], /* Hangul Syllable */ + ["\uC170", "\uC170"], /* Hangul Syllable */ + ["\uC171", "\uC171"], /* Hangul Syllable */ + ["\uC172", "\uC172"], /* Hangul Syllable */ + ["\uC173", "\uC173"], /* Hangul Syllable */ + ["\uC174", "\uC174"], /* Hangul Syllable */ + ["\uC175", "\uC175"], /* Hangul Syllable */ + ["\uC176", "\uC176"], /* Hangul Syllable */ + ["\uC177", "\uC177"], /* Hangul Syllable */ + ["\uC178", "\uC178"], /* Hangul Syllable */ + ["\uC179", "\uC179"], /* Hangul Syllable */ + ["\uC17A", "\uC17A"], /* Hangul Syllable */ + ["\uC17B", "\uC17B"], /* Hangul Syllable */ + ["\uC17C", "\uC17C"], /* Hangul Syllable */ + ["\uC17D", "\uC17D"], /* Hangul Syllable */ + ["\uC17E", "\uC17E"], /* Hangul Syllable */ + ["\uC17F", "\uC17F"], /* Hangul Syllable */ + ["\uC180", "\uC180"], /* Hangul Syllable */ + ["\uC181", "\uC181"], /* Hangul Syllable */ + ["\uC182", "\uC182"], /* Hangul Syllable */ + ["\uC183", "\uC183"], /* Hangul Syllable */ + ["\uC184", "\uC184"], /* Hangul Syllable */ + ["\uC185", "\uC185"], /* Hangul Syllable */ + ["\uC186", "\uC186"], /* Hangul Syllable */ + ["\uC187", "\uC187"], /* Hangul Syllable */ + ["\uC188", "\uC188"], /* Hangul Syllable */ + ["\uC189", "\uC189"], /* Hangul Syllable */ + ["\uC18A", "\uC18A"], /* Hangul Syllable */ + ["\uC18B", "\uC18B"], /* Hangul Syllable */ + ["\uC18C", "\uC18C"], /* Hangul Syllable */ + ["\uC18D", "\uC18D"], /* Hangul Syllable */ + ["\uC18E", "\uC18E"], /* Hangul Syllable */ + ["\uC18F", "\uC18F"], /* Hangul Syllable */ + ["\uC190", "\uC190"], /* Hangul Syllable */ + ["\uC191", "\uC191"], /* Hangul Syllable */ + ["\uC192", "\uC192"], /* Hangul Syllable */ + ["\uC193", "\uC193"], /* Hangul Syllable */ + ["\uC194", "\uC194"], /* Hangul Syllable */ + ["\uC195", "\uC195"], /* Hangul Syllable */ + ["\uC196", "\uC196"], /* Hangul Syllable */ + ["\uC197", "\uC197"], /* Hangul Syllable */ + ["\uC198", "\uC198"], /* Hangul Syllable */ + ["\uC199", "\uC199"], /* Hangul Syllable */ + ["\uC19A", "\uC19A"], /* Hangul Syllable */ + ["\uC19B", "\uC19B"], /* Hangul Syllable */ + ["\uC19C", "\uC19C"], /* Hangul Syllable */ + ["\uC19D", "\uC19D"], /* Hangul Syllable */ + ["\uC19E", "\uC19E"], /* Hangul Syllable */ + ["\uC19F", "\uC19F"], /* Hangul Syllable */ + ["\uC1A0", "\uC1A0"], /* Hangul Syllable */ + ["\uC1A1", "\uC1A1"], /* Hangul Syllable */ + ["\uC1A2", "\uC1A2"], /* Hangul Syllable */ + ["\uC1A3", "\uC1A3"], /* Hangul Syllable */ + ["\uC1A4", "\uC1A4"], /* Hangul Syllable */ + ["\uC1A5", "\uC1A5"], /* Hangul Syllable */ + ["\uC1A6", "\uC1A6"], /* Hangul Syllable */ + ["\uC1A7", "\uC1A7"], /* Hangul Syllable */ + ["\uC1A8", "\uC1A8"], /* Hangul Syllable */ + ["\uC1A9", "\uC1A9"], /* Hangul Syllable */ + ["\uC1AA", "\uC1AA"], /* Hangul Syllable */ + ["\uC1AB", "\uC1AB"], /* Hangul Syllable */ + ["\uC1AC", "\uC1AC"], /* Hangul Syllable */ + ["\uC1AD", "\uC1AD"], /* Hangul Syllable */ + ["\uC1AE", "\uC1AE"], /* Hangul Syllable */ + ["\uC1AF", "\uC1AF"], /* Hangul Syllable */ + ["\uC1B0", "\uC1B0"], /* Hangul Syllable */ + ["\uC1B1", "\uC1B1"], /* Hangul Syllable */ + ["\uC1B2", "\uC1B2"], /* Hangul Syllable */ + ["\uC1B3", "\uC1B3"], /* Hangul Syllable */ + ["\uC1B4", "\uC1B4"], /* Hangul Syllable */ + ["\uC1B5", "\uC1B5"], /* Hangul Syllable */ + ["\uC1B6", "\uC1B6"], /* Hangul Syllable */ + ["\uC1B7", "\uC1B7"], /* Hangul Syllable */ + ["\uC1B8", "\uC1B8"], /* Hangul Syllable */ + ["\uC1B9", "\uC1B9"], /* Hangul Syllable */ + ["\uC1BA", "\uC1BA"], /* Hangul Syllable */ + ["\uC1BB", "\uC1BB"], /* Hangul Syllable */ + ["\uC1BC", "\uC1BC"], /* Hangul Syllable */ + ["\uC1BD", "\uC1BD"], /* Hangul Syllable */ + ["\uC1BE", "\uC1BE"], /* Hangul Syllable */ + ["\uC1BF", "\uC1BF"], /* Hangul Syllable */ + ["\uC1C0", "\uC1C0"], /* Hangul Syllable */ + ["\uC1C1", "\uC1C1"], /* Hangul Syllable */ + ["\uC1C2", "\uC1C2"], /* Hangul Syllable */ + ["\uC1C3", "\uC1C3"], /* Hangul Syllable */ + ["\uC1C4", "\uC1C4"], /* Hangul Syllable */ + ["\uC1C5", "\uC1C5"], /* Hangul Syllable */ + ["\uC1C6", "\uC1C6"], /* Hangul Syllable */ + ["\uC1C7", "\uC1C7"], /* Hangul Syllable */ + ["\uC1C8", "\uC1C8"], /* Hangul Syllable */ + ["\uC1C9", "\uC1C9"], /* Hangul Syllable */ + ["\uC1CA", "\uC1CA"], /* Hangul Syllable */ + ["\uC1CB", "\uC1CB"], /* Hangul Syllable */ + ["\uC1CC", "\uC1CC"], /* Hangul Syllable */ + ["\uC1CD", "\uC1CD"], /* Hangul Syllable */ + ["\uC1CE", "\uC1CE"], /* Hangul Syllable */ + ["\uC1CF", "\uC1CF"], /* Hangul Syllable */ + ["\uC1D0", "\uC1D0"], /* Hangul Syllable */ + ["\uC1D1", "\uC1D1"], /* Hangul Syllable */ + ["\uC1D2", "\uC1D2"], /* Hangul Syllable */ + ["\uC1D3", "\uC1D3"], /* Hangul Syllable */ + ["\uC1D4", "\uC1D4"], /* Hangul Syllable */ + ["\uC1D5", "\uC1D5"], /* Hangul Syllable */ + ["\uC1D6", "\uC1D6"], /* Hangul Syllable */ + ["\uC1D7", "\uC1D7"], /* Hangul Syllable */ + ["\uC1D8", "\uC1D8"], /* Hangul Syllable */ + ["\uC1D9", "\uC1D9"], /* Hangul Syllable */ + ["\uC1DA", "\uC1DA"], /* Hangul Syllable */ + ["\uC1DB", "\uC1DB"], /* Hangul Syllable */ + ["\uC1DC", "\uC1DC"], /* Hangul Syllable */ + ["\uC1DD", "\uC1DD"], /* Hangul Syllable */ + ["\uC1DE", "\uC1DE"], /* Hangul Syllable */ + ["\uC1DF", "\uC1DF"], /* Hangul Syllable */ + ["\uC1E0", "\uC1E0"], /* Hangul Syllable */ + ["\uC1E1", "\uC1E1"], /* Hangul Syllable */ + ["\uC1E2", "\uC1E2"], /* Hangul Syllable */ + ["\uC1E3", "\uC1E3"], /* Hangul Syllable */ + ["\uC1E4", "\uC1E4"], /* Hangul Syllable */ + ["\uC1E5", "\uC1E5"], /* Hangul Syllable */ + ["\uC1E6", "\uC1E6"], /* Hangul Syllable */ + ["\uC1E7", "\uC1E7"], /* Hangul Syllable */ + ["\uC1E8", "\uC1E8"], /* Hangul Syllable */ + ["\uC1E9", "\uC1E9"], /* Hangul Syllable */ + ["\uC1EA", "\uC1EA"], /* Hangul Syllable */ + ["\uC1EB", "\uC1EB"], /* Hangul Syllable */ + ["\uC1EC", "\uC1EC"], /* Hangul Syllable */ + ["\uC1ED", "\uC1ED"], /* Hangul Syllable */ + ["\uC1EE", "\uC1EE"], /* Hangul Syllable */ + ["\uC1EF", "\uC1EF"], /* Hangul Syllable */ + ["\uC1F0", "\uC1F0"], /* Hangul Syllable */ + ["\uC1F1", "\uC1F1"], /* Hangul Syllable */ + ["\uC1F2", "\uC1F2"], /* Hangul Syllable */ + ["\uC1F3", "\uC1F3"], /* Hangul Syllable */ + ["\uC1F4", "\uC1F4"], /* Hangul Syllable */ + ["\uC1F5", "\uC1F5"], /* Hangul Syllable */ + ["\uC1F6", "\uC1F6"], /* Hangul Syllable */ + ["\uC1F7", "\uC1F7"], /* Hangul Syllable */ + ["\uC1F8", "\uC1F8"], /* Hangul Syllable */ + ["\uC1F9", "\uC1F9"], /* Hangul Syllable */ + ["\uC1FA", "\uC1FA"], /* Hangul Syllable */ + ["\uC1FB", "\uC1FB"], /* Hangul Syllable */ + ["\uC1FC", "\uC1FC"], /* Hangul Syllable */ + ["\uC1FD", "\uC1FD"], /* Hangul Syllable */ + ["\uC1FE", "\uC1FE"], /* Hangul Syllable */ + ["\uC1FF", "\uC1FF"], /* Hangul Syllable */ + ["\uC200", "\uC200"], /* Hangul Syllable */ + ["\uC201", "\uC201"], /* Hangul Syllable */ + ["\uC202", "\uC202"], /* Hangul Syllable */ + ["\uC203", "\uC203"], /* Hangul Syllable */ + ["\uC204", "\uC204"], /* Hangul Syllable */ + ["\uC205", "\uC205"], /* Hangul Syllable */ + ["\uC206", "\uC206"], /* Hangul Syllable */ + ["\uC207", "\uC207"], /* Hangul Syllable */ + ["\uC208", "\uC208"], /* Hangul Syllable */ + ["\uC209", "\uC209"], /* Hangul Syllable */ + ["\uC20A", "\uC20A"], /* Hangul Syllable */ + ["\uC20B", "\uC20B"], /* Hangul Syllable */ + ["\uC20C", "\uC20C"], /* Hangul Syllable */ + ["\uC20D", "\uC20D"], /* Hangul Syllable */ + ["\uC20E", "\uC20E"], /* Hangul Syllable */ + ["\uC20F", "\uC20F"], /* Hangul Syllable */ + ["\uC210", "\uC210"], /* Hangul Syllable */ + ["\uC211", "\uC211"], /* Hangul Syllable */ + ["\uC212", "\uC212"], /* Hangul Syllable */ + ["\uC213", "\uC213"], /* Hangul Syllable */ + ["\uC214", "\uC214"], /* Hangul Syllable */ + ["\uC215", "\uC215"], /* Hangul Syllable */ + ["\uC216", "\uC216"], /* Hangul Syllable */ + ["\uC217", "\uC217"], /* Hangul Syllable */ + ["\uC218", "\uC218"], /* Hangul Syllable */ + ["\uC219", "\uC219"], /* Hangul Syllable */ + ["\uC21A", "\uC21A"], /* Hangul Syllable */ + ["\uC21B", "\uC21B"], /* Hangul Syllable */ + ["\uC21C", "\uC21C"], /* Hangul Syllable */ + ["\uC21D", "\uC21D"], /* Hangul Syllable */ + ["\uC21E", "\uC21E"], /* Hangul Syllable */ + ["\uC21F", "\uC21F"], /* Hangul Syllable */ + ["\uC220", "\uC220"], /* Hangul Syllable */ + ["\uC221", "\uC221"], /* Hangul Syllable */ + ["\uC222", "\uC222"], /* Hangul Syllable */ + ["\uC223", "\uC223"], /* Hangul Syllable */ + ["\uC224", "\uC224"], /* Hangul Syllable */ + ["\uC225", "\uC225"], /* Hangul Syllable */ + ["\uC226", "\uC226"], /* Hangul Syllable */ + ["\uC227", "\uC227"], /* Hangul Syllable */ + ["\uC228", "\uC228"], /* Hangul Syllable */ + ["\uC229", "\uC229"], /* Hangul Syllable */ + ["\uC22A", "\uC22A"], /* Hangul Syllable */ + ["\uC22B", "\uC22B"], /* Hangul Syllable */ + ["\uC22C", "\uC22C"], /* Hangul Syllable */ + ["\uC22D", "\uC22D"], /* Hangul Syllable */ + ["\uC22E", "\uC22E"], /* Hangul Syllable */ + ["\uC22F", "\uC22F"], /* Hangul Syllable */ + ["\uC230", "\uC230"], /* Hangul Syllable */ + ["\uC231", "\uC231"], /* Hangul Syllable */ + ["\uC232", "\uC232"], /* Hangul Syllable */ + ["\uC233", "\uC233"], /* Hangul Syllable */ + ["\uC234", "\uC234"], /* Hangul Syllable */ + ["\uC235", "\uC235"], /* Hangul Syllable */ + ["\uC236", "\uC236"], /* Hangul Syllable */ + ["\uC237", "\uC237"], /* Hangul Syllable */ + ["\uC238", "\uC238"], /* Hangul Syllable */ + ["\uC239", "\uC239"], /* Hangul Syllable */ + ["\uC23A", "\uC23A"], /* Hangul Syllable */ + ["\uC23B", "\uC23B"], /* Hangul Syllable */ + ["\uC23C", "\uC23C"], /* Hangul Syllable */ + ["\uC23D", "\uC23D"], /* Hangul Syllable */ + ["\uC23E", "\uC23E"], /* Hangul Syllable */ + ["\uC23F", "\uC23F"], /* Hangul Syllable */ + ["\uC240", "\uC240"], /* Hangul Syllable */ + ["\uC241", "\uC241"], /* Hangul Syllable */ + ["\uC242", "\uC242"], /* Hangul Syllable */ + ["\uC243", "\uC243"], /* Hangul Syllable */ + ["\uC244", "\uC244"], /* Hangul Syllable */ + ["\uC245", "\uC245"], /* Hangul Syllable */ + ["\uC246", "\uC246"], /* Hangul Syllable */ + ["\uC247", "\uC247"], /* Hangul Syllable */ + ["\uC248", "\uC248"], /* Hangul Syllable */ + ["\uC249", "\uC249"], /* Hangul Syllable */ + ["\uC24A", "\uC24A"], /* Hangul Syllable */ + ["\uC24B", "\uC24B"], /* Hangul Syllable */ + ["\uC24C", "\uC24C"], /* Hangul Syllable */ + ["\uC24D", "\uC24D"], /* Hangul Syllable */ + ["\uC24E", "\uC24E"], /* Hangul Syllable */ + ["\uC24F", "\uC24F"], /* Hangul Syllable */ + ["\uC250", "\uC250"], /* Hangul Syllable */ + ["\uC251", "\uC251"], /* Hangul Syllable */ + ["\uC252", "\uC252"], /* Hangul Syllable */ + ["\uC253", "\uC253"], /* Hangul Syllable */ + ["\uC254", "\uC254"], /* Hangul Syllable */ + ["\uC255", "\uC255"], /* Hangul Syllable */ + ["\uC256", "\uC256"], /* Hangul Syllable */ + ["\uC257", "\uC257"], /* Hangul Syllable */ + ["\uC258", "\uC258"], /* Hangul Syllable */ + ["\uC259", "\uC259"], /* Hangul Syllable */ + ["\uC25A", "\uC25A"], /* Hangul Syllable */ + ["\uC25B", "\uC25B"], /* Hangul Syllable */ + ["\uC25C", "\uC25C"], /* Hangul Syllable */ + ["\uC25D", "\uC25D"], /* Hangul Syllable */ + ["\uC25E", "\uC25E"], /* Hangul Syllable */ + ["\uC25F", "\uC25F"], /* Hangul Syllable */ + ["\uC260", "\uC260"], /* Hangul Syllable */ + ["\uC261", "\uC261"], /* Hangul Syllable */ + ["\uC262", "\uC262"], /* Hangul Syllable */ + ["\uC263", "\uC263"], /* Hangul Syllable */ + ["\uC264", "\uC264"], /* Hangul Syllable */ + ["\uC265", "\uC265"], /* Hangul Syllable */ + ["\uC266", "\uC266"], /* Hangul Syllable */ + ["\uC267", "\uC267"], /* Hangul Syllable */ + ["\uC268", "\uC268"], /* Hangul Syllable */ + ["\uC269", "\uC269"], /* Hangul Syllable */ + ["\uC26A", "\uC26A"], /* Hangul Syllable */ + ["\uC26B", "\uC26B"], /* Hangul Syllable */ + ["\uC26C", "\uC26C"], /* Hangul Syllable */ + ["\uC26D", "\uC26D"], /* Hangul Syllable */ + ["\uC26E", "\uC26E"], /* Hangul Syllable */ + ["\uC26F", "\uC26F"], /* Hangul Syllable */ + ["\uC270", "\uC270"], /* Hangul Syllable */ + ["\uC271", "\uC271"], /* Hangul Syllable */ + ["\uC272", "\uC272"], /* Hangul Syllable */ + ["\uC273", "\uC273"], /* Hangul Syllable */ + ["\uC274", "\uC274"], /* Hangul Syllable */ + ["\uC275", "\uC275"], /* Hangul Syllable */ + ["\uC276", "\uC276"], /* Hangul Syllable */ + ["\uC277", "\uC277"], /* Hangul Syllable */ + ["\uC278", "\uC278"], /* Hangul Syllable */ + ["\uC279", "\uC279"], /* Hangul Syllable */ + ["\uC27A", "\uC27A"], /* Hangul Syllable */ + ["\uC27B", "\uC27B"], /* Hangul Syllable */ + ["\uC27C", "\uC27C"], /* Hangul Syllable */ + ["\uC27D", "\uC27D"], /* Hangul Syllable */ + ["\uC27E", "\uC27E"], /* Hangul Syllable */ + ["\uC27F", "\uC27F"], /* Hangul Syllable */ + ["\uC280", "\uC280"], /* Hangul Syllable */ + ["\uC281", "\uC281"], /* Hangul Syllable */ + ["\uC282", "\uC282"], /* Hangul Syllable */ + ["\uC283", "\uC283"], /* Hangul Syllable */ + ["\uC284", "\uC284"], /* Hangul Syllable */ + ["\uC285", "\uC285"], /* Hangul Syllable */ + ["\uC286", "\uC286"], /* Hangul Syllable */ + ["\uC287", "\uC287"], /* Hangul Syllable */ + ["\uC288", "\uC288"], /* Hangul Syllable */ + ["\uC289", "\uC289"], /* Hangul Syllable */ + ["\uC28A", "\uC28A"], /* Hangul Syllable */ + ["\uC28B", "\uC28B"], /* Hangul Syllable */ + ["\uC28C", "\uC28C"], /* Hangul Syllable */ + ["\uC28D", "\uC28D"], /* Hangul Syllable */ + ["\uC28E", "\uC28E"], /* Hangul Syllable */ + ["\uC28F", "\uC28F"], /* Hangul Syllable */ + ["\uC290", "\uC290"], /* Hangul Syllable */ + ["\uC291", "\uC291"], /* Hangul Syllable */ + ["\uC292", "\uC292"], /* Hangul Syllable */ + ["\uC293", "\uC293"], /* Hangul Syllable */ + ["\uC294", "\uC294"], /* Hangul Syllable */ + ["\uC295", "\uC295"], /* Hangul Syllable */ + ["\uC296", "\uC296"], /* Hangul Syllable */ + ["\uC297", "\uC297"], /* Hangul Syllable */ + ["\uC298", "\uC298"], /* Hangul Syllable */ + ["\uC299", "\uC299"], /* Hangul Syllable */ + ["\uC29A", "\uC29A"], /* Hangul Syllable */ + ["\uC29B", "\uC29B"], /* Hangul Syllable */ + ["\uC29C", "\uC29C"], /* Hangul Syllable */ + ["\uC29D", "\uC29D"], /* Hangul Syllable */ + ["\uC29E", "\uC29E"], /* Hangul Syllable */ + ["\uC29F", "\uC29F"], /* Hangul Syllable */ + ["\uC2A0", "\uC2A0"], /* Hangul Syllable */ + ["\uC2A1", "\uC2A1"], /* Hangul Syllable */ + ["\uC2A2", "\uC2A2"], /* Hangul Syllable */ + ["\uC2A3", "\uC2A3"], /* Hangul Syllable */ + ["\uC2A4", "\uC2A4"], /* Hangul Syllable */ + ["\uC2A5", "\uC2A5"], /* Hangul Syllable */ + ["\uC2A6", "\uC2A6"], /* Hangul Syllable */ + ["\uC2A7", "\uC2A7"], /* Hangul Syllable */ + ["\uC2A8", "\uC2A8"], /* Hangul Syllable */ + ["\uC2A9", "\uC2A9"], /* Hangul Syllable */ + ["\uC2AA", "\uC2AA"], /* Hangul Syllable */ + ["\uC2AB", "\uC2AB"], /* Hangul Syllable */ + ["\uC2AC", "\uC2AC"], /* Hangul Syllable */ + ["\uC2AD", "\uC2AD"], /* Hangul Syllable */ + ["\uC2AE", "\uC2AE"], /* Hangul Syllable */ + ["\uC2AF", "\uC2AF"], /* Hangul Syllable */ + ["\uC2B0", "\uC2B0"], /* Hangul Syllable */ + ["\uC2B1", "\uC2B1"], /* Hangul Syllable */ + ["\uC2B2", "\uC2B2"], /* Hangul Syllable */ + ["\uC2B3", "\uC2B3"], /* Hangul Syllable */ + ["\uC2B4", "\uC2B4"], /* Hangul Syllable */ + ["\uC2B5", "\uC2B5"], /* Hangul Syllable */ + ["\uC2B6", "\uC2B6"], /* Hangul Syllable */ + ["\uC2B7", "\uC2B7"], /* Hangul Syllable */ + ["\uC2B8", "\uC2B8"], /* Hangul Syllable */ + ["\uC2B9", "\uC2B9"], /* Hangul Syllable */ + ["\uC2BA", "\uC2BA"], /* Hangul Syllable */ + ["\uC2BB", "\uC2BB"], /* Hangul Syllable */ + ["\uC2BC", "\uC2BC"], /* Hangul Syllable */ + ["\uC2BD", "\uC2BD"], /* Hangul Syllable */ + ["\uC2BE", "\uC2BE"], /* Hangul Syllable */ + ["\uC2BF", "\uC2BF"], /* Hangul Syllable */ + ["\uC2C0", "\uC2C0"], /* Hangul Syllable */ + ["\uC2C1", "\uC2C1"], /* Hangul Syllable */ + ["\uC2C2", "\uC2C2"], /* Hangul Syllable */ + ["\uC2C3", "\uC2C3"], /* Hangul Syllable */ + ["\uC2C4", "\uC2C4"], /* Hangul Syllable */ + ["\uC2C5", "\uC2C5"], /* Hangul Syllable */ + ["\uC2C6", "\uC2C6"], /* Hangul Syllable */ + ["\uC2C7", "\uC2C7"], /* Hangul Syllable */ + ["\uC2C8", "\uC2C8"], /* Hangul Syllable */ + ["\uC2C9", "\uC2C9"], /* Hangul Syllable */ + ["\uC2CA", "\uC2CA"], /* Hangul Syllable */ + ["\uC2CB", "\uC2CB"], /* Hangul Syllable */ + ["\uC2CC", "\uC2CC"], /* Hangul Syllable */ + ["\uC2CD", "\uC2CD"], /* Hangul Syllable */ + ["\uC2CE", "\uC2CE"], /* Hangul Syllable */ + ["\uC2CF", "\uC2CF"], /* Hangul Syllable */ + ["\uC2D0", "\uC2D0"], /* Hangul Syllable */ + ["\uC2D1", "\uC2D1"], /* Hangul Syllable */ + ["\uC2D2", "\uC2D2"], /* Hangul Syllable */ + ["\uC2D3", "\uC2D3"], /* Hangul Syllable */ + ["\uC2D4", "\uC2D4"], /* Hangul Syllable */ + ["\uC2D5", "\uC2D5"], /* Hangul Syllable */ + ["\uC2D6", "\uC2D6"], /* Hangul Syllable */ + ["\uC2D7", "\uC2D7"], /* Hangul Syllable */ + ["\uC2D8", "\uC2D8"], /* Hangul Syllable */ + ["\uC2D9", "\uC2D9"], /* Hangul Syllable */ + ["\uC2DA", "\uC2DA"], /* Hangul Syllable */ + ["\uC2DB", "\uC2DB"], /* Hangul Syllable */ + ["\uC2DC", "\uC2DC"], /* Hangul Syllable */ + ["\uC2DD", "\uC2DD"], /* Hangul Syllable */ + ["\uC2DE", "\uC2DE"], /* Hangul Syllable */ + ["\uC2DF", "\uC2DF"], /* Hangul Syllable */ + ["\uC2E0", "\uC2E0"], /* Hangul Syllable */ + ["\uC2E1", "\uC2E1"], /* Hangul Syllable */ + ["\uC2E2", "\uC2E2"], /* Hangul Syllable */ + ["\uC2E3", "\uC2E3"], /* Hangul Syllable */ + ["\uC2E4", "\uC2E4"], /* Hangul Syllable */ + ["\uC2E5", "\uC2E5"], /* Hangul Syllable */ + ["\uC2E6", "\uC2E6"], /* Hangul Syllable */ + ["\uC2E7", "\uC2E7"], /* Hangul Syllable */ + ["\uC2E8", "\uC2E8"], /* Hangul Syllable */ + ["\uC2E9", "\uC2E9"], /* Hangul Syllable */ + ["\uC2EA", "\uC2EA"], /* Hangul Syllable */ + ["\uC2EB", "\uC2EB"], /* Hangul Syllable */ + ["\uC2EC", "\uC2EC"], /* Hangul Syllable */ + ["\uC2ED", "\uC2ED"], /* Hangul Syllable */ + ["\uC2EE", "\uC2EE"], /* Hangul Syllable */ + ["\uC2EF", "\uC2EF"], /* Hangul Syllable */ + ["\uC2F0", "\uC2F0"], /* Hangul Syllable */ + ["\uC2F1", "\uC2F1"], /* Hangul Syllable */ + ["\uC2F2", "\uC2F2"], /* Hangul Syllable */ + ["\uC2F3", "\uC2F3"], /* Hangul Syllable */ + ["\uC2F4", "\uC2F4"], /* Hangul Syllable */ + ["\uC2F5", "\uC2F5"], /* Hangul Syllable */ + ["\uC2F6", "\uC2F6"], /* Hangul Syllable */ + ["\uC2F7", "\uC2F7"], /* Hangul Syllable */ + ["\uC2F8", "\uC2F8"], /* Hangul Syllable */ + ["\uC2F9", "\uC2F9"], /* Hangul Syllable */ + ["\uC2FA", "\uC2FA"], /* Hangul Syllable */ + ["\uC2FB", "\uC2FB"], /* Hangul Syllable */ + ["\uC2FC", "\uC2FC"], /* Hangul Syllable */ + ["\uC2FD", "\uC2FD"], /* Hangul Syllable */ + ["\uC2FE", "\uC2FE"], /* Hangul Syllable */ + ["\uC2FF", "\uC2FF"], /* Hangul Syllable */ + ["\uC300", "\uC300"], /* Hangul Syllable */ + ["\uC301", "\uC301"], /* Hangul Syllable */ + ["\uC302", "\uC302"], /* Hangul Syllable */ + ["\uC303", "\uC303"], /* Hangul Syllable */ + ["\uC304", "\uC304"], /* Hangul Syllable */ + ["\uC305", "\uC305"], /* Hangul Syllable */ + ["\uC306", "\uC306"], /* Hangul Syllable */ + ["\uC307", "\uC307"], /* Hangul Syllable */ + ["\uC308", "\uC308"], /* Hangul Syllable */ + ["\uC309", "\uC309"], /* Hangul Syllable */ + ["\uC30A", "\uC30A"], /* Hangul Syllable */ + ["\uC30B", "\uC30B"], /* Hangul Syllable */ + ["\uC30C", "\uC30C"], /* Hangul Syllable */ + ["\uC30D", "\uC30D"], /* Hangul Syllable */ + ["\uC30E", "\uC30E"], /* Hangul Syllable */ + ["\uC30F", "\uC30F"], /* Hangul Syllable */ + ["\uC310", "\uC310"], /* Hangul Syllable */ + ["\uC311", "\uC311"], /* Hangul Syllable */ + ["\uC312", "\uC312"], /* Hangul Syllable */ + ["\uC313", "\uC313"], /* Hangul Syllable */ + ["\uC314", "\uC314"], /* Hangul Syllable */ + ["\uC315", "\uC315"], /* Hangul Syllable */ + ["\uC316", "\uC316"], /* Hangul Syllable */ + ["\uC317", "\uC317"], /* Hangul Syllable */ + ["\uC318", "\uC318"], /* Hangul Syllable */ + ["\uC319", "\uC319"], /* Hangul Syllable */ + ["\uC31A", "\uC31A"], /* Hangul Syllable */ + ["\uC31B", "\uC31B"], /* Hangul Syllable */ + ["\uC31C", "\uC31C"], /* Hangul Syllable */ + ["\uC31D", "\uC31D"], /* Hangul Syllable */ + ["\uC31E", "\uC31E"], /* Hangul Syllable */ + ["\uC31F", "\uC31F"], /* Hangul Syllable */ + ["\uC320", "\uC320"], /* Hangul Syllable */ + ["\uC321", "\uC321"], /* Hangul Syllable */ + ["\uC322", "\uC322"], /* Hangul Syllable */ + ["\uC323", "\uC323"], /* Hangul Syllable */ + ["\uC324", "\uC324"], /* Hangul Syllable */ + ["\uC325", "\uC325"], /* Hangul Syllable */ + ["\uC326", "\uC326"], /* Hangul Syllable */ + ["\uC327", "\uC327"], /* Hangul Syllable */ + ["\uC328", "\uC328"], /* Hangul Syllable */ + ["\uC329", "\uC329"], /* Hangul Syllable */ + ["\uC32A", "\uC32A"], /* Hangul Syllable */ + ["\uC32B", "\uC32B"], /* Hangul Syllable */ + ["\uC32C", "\uC32C"], /* Hangul Syllable */ + ["\uC32D", "\uC32D"], /* Hangul Syllable */ + ["\uC32E", "\uC32E"], /* Hangul Syllable */ + ["\uC32F", "\uC32F"], /* Hangul Syllable */ + ["\uC330", "\uC330"], /* Hangul Syllable */ + ["\uC331", "\uC331"], /* Hangul Syllable */ + ["\uC332", "\uC332"], /* Hangul Syllable */ + ["\uC333", "\uC333"], /* Hangul Syllable */ + ["\uC334", "\uC334"], /* Hangul Syllable */ + ["\uC335", "\uC335"], /* Hangul Syllable */ + ["\uC336", "\uC336"], /* Hangul Syllable */ + ["\uC337", "\uC337"], /* Hangul Syllable */ + ["\uC338", "\uC338"], /* Hangul Syllable */ + ["\uC339", "\uC339"], /* Hangul Syllable */ + ["\uC33A", "\uC33A"], /* Hangul Syllable */ + ["\uC33B", "\uC33B"], /* Hangul Syllable */ + ["\uC33C", "\uC33C"], /* Hangul Syllable */ + ["\uC33D", "\uC33D"], /* Hangul Syllable */ + ["\uC33E", "\uC33E"], /* Hangul Syllable */ + ["\uC33F", "\uC33F"], /* Hangul Syllable */ + ["\uC340", "\uC340"], /* Hangul Syllable */ + ["\uC341", "\uC341"], /* Hangul Syllable */ + ["\uC342", "\uC342"], /* Hangul Syllable */ + ["\uC343", "\uC343"], /* Hangul Syllable */ + ["\uC344", "\uC344"], /* Hangul Syllable */ + ["\uC345", "\uC345"], /* Hangul Syllable */ + ["\uC346", "\uC346"], /* Hangul Syllable */ + ["\uC347", "\uC347"], /* Hangul Syllable */ + ["\uC348", "\uC348"], /* Hangul Syllable */ + ["\uC349", "\uC349"], /* Hangul Syllable */ + ["\uC34A", "\uC34A"], /* Hangul Syllable */ + ["\uC34B", "\uC34B"], /* Hangul Syllable */ + ["\uC34C", "\uC34C"], /* Hangul Syllable */ + ["\uC34D", "\uC34D"], /* Hangul Syllable */ + ["\uC34E", "\uC34E"], /* Hangul Syllable */ + ["\uC34F", "\uC34F"], /* Hangul Syllable */ + ["\uC350", "\uC350"], /* Hangul Syllable */ + ["\uC351", "\uC351"], /* Hangul Syllable */ + ["\uC352", "\uC352"], /* Hangul Syllable */ + ["\uC353", "\uC353"], /* Hangul Syllable */ + ["\uC354", "\uC354"], /* Hangul Syllable */ + ["\uC355", "\uC355"], /* Hangul Syllable */ + ["\uC356", "\uC356"], /* Hangul Syllable */ + ["\uC357", "\uC357"], /* Hangul Syllable */ + ["\uC358", "\uC358"], /* Hangul Syllable */ + ["\uC359", "\uC359"], /* Hangul Syllable */ + ["\uC35A", "\uC35A"], /* Hangul Syllable */ + ["\uC35B", "\uC35B"], /* Hangul Syllable */ + ["\uC35C", "\uC35C"], /* Hangul Syllable */ + ["\uC35D", "\uC35D"], /* Hangul Syllable */ + ["\uC35E", "\uC35E"], /* Hangul Syllable */ + ["\uC35F", "\uC35F"], /* Hangul Syllable */ + ["\uC360", "\uC360"], /* Hangul Syllable */ + ["\uC361", "\uC361"], /* Hangul Syllable */ + ["\uC362", "\uC362"], /* Hangul Syllable */ + ["\uC363", "\uC363"], /* Hangul Syllable */ + ["\uC364", "\uC364"], /* Hangul Syllable */ + ["\uC365", "\uC365"], /* Hangul Syllable */ + ["\uC366", "\uC366"], /* Hangul Syllable */ + ["\uC367", "\uC367"], /* Hangul Syllable */ + ["\uC368", "\uC368"], /* Hangul Syllable */ + ["\uC369", "\uC369"], /* Hangul Syllable */ + ["\uC36A", "\uC36A"], /* Hangul Syllable */ + ["\uC36B", "\uC36B"], /* Hangul Syllable */ + ["\uC36C", "\uC36C"], /* Hangul Syllable */ + ["\uC36D", "\uC36D"], /* Hangul Syllable */ + ["\uC36E", "\uC36E"], /* Hangul Syllable */ + ["\uC36F", "\uC36F"], /* Hangul Syllable */ + ["\uC370", "\uC370"], /* Hangul Syllable */ + ["\uC371", "\uC371"], /* Hangul Syllable */ + ["\uC372", "\uC372"], /* Hangul Syllable */ + ["\uC373", "\uC373"], /* Hangul Syllable */ + ["\uC374", "\uC374"], /* Hangul Syllable */ + ["\uC375", "\uC375"], /* Hangul Syllable */ + ["\uC376", "\uC376"], /* Hangul Syllable */ + ["\uC377", "\uC377"], /* Hangul Syllable */ + ["\uC378", "\uC378"], /* Hangul Syllable */ + ["\uC379", "\uC379"], /* Hangul Syllable */ + ["\uC37A", "\uC37A"], /* Hangul Syllable */ + ["\uC37B", "\uC37B"], /* Hangul Syllable */ + ["\uC37C", "\uC37C"], /* Hangul Syllable */ + ["\uC37D", "\uC37D"], /* Hangul Syllable */ + ["\uC37E", "\uC37E"], /* Hangul Syllable */ + ["\uC37F", "\uC37F"], /* Hangul Syllable */ + ["\uC380", "\uC380"], /* Hangul Syllable */ + ["\uC381", "\uC381"], /* Hangul Syllable */ + ["\uC382", "\uC382"], /* Hangul Syllable */ + ["\uC383", "\uC383"], /* Hangul Syllable */ + ["\uC384", "\uC384"], /* Hangul Syllable */ + ["\uC385", "\uC385"], /* Hangul Syllable */ + ["\uC386", "\uC386"], /* Hangul Syllable */ + ["\uC387", "\uC387"], /* Hangul Syllable */ + ["\uC388", "\uC388"], /* Hangul Syllable */ + ["\uC389", "\uC389"], /* Hangul Syllable */ + ["\uC38A", "\uC38A"], /* Hangul Syllable */ + ["\uC38B", "\uC38B"], /* Hangul Syllable */ + ["\uC38C", "\uC38C"], /* Hangul Syllable */ + ["\uC38D", "\uC38D"], /* Hangul Syllable */ + ["\uC38E", "\uC38E"], /* Hangul Syllable */ + ["\uC38F", "\uC38F"], /* Hangul Syllable */ + ["\uC390", "\uC390"], /* Hangul Syllable */ + ["\uC391", "\uC391"], /* Hangul Syllable */ + ["\uC392", "\uC392"], /* Hangul Syllable */ + ["\uC393", "\uC393"], /* Hangul Syllable */ + ["\uC394", "\uC394"], /* Hangul Syllable */ + ["\uC395", "\uC395"], /* Hangul Syllable */ + ["\uC396", "\uC396"], /* Hangul Syllable */ + ["\uC397", "\uC397"], /* Hangul Syllable */ + ["\uC398", "\uC398"], /* Hangul Syllable */ + ["\uC399", "\uC399"], /* Hangul Syllable */ + ["\uC39A", "\uC39A"], /* Hangul Syllable */ + ["\uC39B", "\uC39B"], /* Hangul Syllable */ + ["\uC39C", "\uC39C"], /* Hangul Syllable */ + ["\uC39D", "\uC39D"], /* Hangul Syllable */ + ["\uC39E", "\uC39E"], /* Hangul Syllable */ + ["\uC39F", "\uC39F"], /* Hangul Syllable */ + ["\uC3A0", "\uC3A0"], /* Hangul Syllable */ + ["\uC3A1", "\uC3A1"], /* Hangul Syllable */ + ["\uC3A2", "\uC3A2"], /* Hangul Syllable */ + ["\uC3A3", "\uC3A3"], /* Hangul Syllable */ + ["\uC3A4", "\uC3A4"], /* Hangul Syllable */ + ["\uC3A5", "\uC3A5"], /* Hangul Syllable */ + ["\uC3A6", "\uC3A6"], /* Hangul Syllable */ + ["\uC3A7", "\uC3A7"], /* Hangul Syllable */ + ["\uC3A8", "\uC3A8"], /* Hangul Syllable */ + ["\uC3A9", "\uC3A9"], /* Hangul Syllable */ + ["\uC3AA", "\uC3AA"], /* Hangul Syllable */ + ["\uC3AB", "\uC3AB"], /* Hangul Syllable */ + ["\uC3AC", "\uC3AC"], /* Hangul Syllable */ + ["\uC3AD", "\uC3AD"], /* Hangul Syllable */ + ["\uC3AE", "\uC3AE"], /* Hangul Syllable */ + ["\uC3AF", "\uC3AF"], /* Hangul Syllable */ + ["\uC3B0", "\uC3B0"], /* Hangul Syllable */ + ["\uC3B1", "\uC3B1"], /* Hangul Syllable */ + ["\uC3B2", "\uC3B2"], /* Hangul Syllable */ + ["\uC3B3", "\uC3B3"], /* Hangul Syllable */ + ["\uC3B4", "\uC3B4"], /* Hangul Syllable */ + ["\uC3B5", "\uC3B5"], /* Hangul Syllable */ + ["\uC3B6", "\uC3B6"], /* Hangul Syllable */ + ["\uC3B7", "\uC3B7"], /* Hangul Syllable */ + ["\uC3B8", "\uC3B8"], /* Hangul Syllable */ + ["\uC3B9", "\uC3B9"], /* Hangul Syllable */ + ["\uC3BA", "\uC3BA"], /* Hangul Syllable */ + ["\uC3BB", "\uC3BB"], /* Hangul Syllable */ + ["\uC3BC", "\uC3BC"], /* Hangul Syllable */ + ["\uC3BD", "\uC3BD"], /* Hangul Syllable */ + ["\uC3BE", "\uC3BE"], /* Hangul Syllable */ + ["\uC3BF", "\uC3BF"], /* Hangul Syllable */ + ["\uC3C0", "\uC3C0"], /* Hangul Syllable */ + ["\uC3C1", "\uC3C1"], /* Hangul Syllable */ + ["\uC3C2", "\uC3C2"], /* Hangul Syllable */ + ["\uC3C3", "\uC3C3"], /* Hangul Syllable */ + ["\uC3C4", "\uC3C4"], /* Hangul Syllable */ + ["\uC3C5", "\uC3C5"], /* Hangul Syllable */ + ["\uC3C6", "\uC3C6"], /* Hangul Syllable */ + ["\uC3C7", "\uC3C7"], /* Hangul Syllable */ + ["\uC3C8", "\uC3C8"], /* Hangul Syllable */ + ["\uC3C9", "\uC3C9"], /* Hangul Syllable */ + ["\uC3CA", "\uC3CA"], /* Hangul Syllable */ + ["\uC3CB", "\uC3CB"], /* Hangul Syllable */ + ["\uC3CC", "\uC3CC"], /* Hangul Syllable */ + ["\uC3CD", "\uC3CD"], /* Hangul Syllable */ + ["\uC3CE", "\uC3CE"], /* Hangul Syllable */ + ["\uC3CF", "\uC3CF"], /* Hangul Syllable */ + ["\uC3D0", "\uC3D0"], /* Hangul Syllable */ + ["\uC3D1", "\uC3D1"], /* Hangul Syllable */ + ["\uC3D2", "\uC3D2"], /* Hangul Syllable */ + ["\uC3D3", "\uC3D3"], /* Hangul Syllable */ + ["\uC3D4", "\uC3D4"], /* Hangul Syllable */ + ["\uC3D5", "\uC3D5"], /* Hangul Syllable */ + ["\uC3D6", "\uC3D6"], /* Hangul Syllable */ + ["\uC3D7", "\uC3D7"], /* Hangul Syllable */ + ["\uC3D8", "\uC3D8"], /* Hangul Syllable */ + ["\uC3D9", "\uC3D9"], /* Hangul Syllable */ + ["\uC3DA", "\uC3DA"], /* Hangul Syllable */ + ["\uC3DB", "\uC3DB"], /* Hangul Syllable */ + ["\uC3DC", "\uC3DC"], /* Hangul Syllable */ + ["\uC3DD", "\uC3DD"], /* Hangul Syllable */ + ["\uC3DE", "\uC3DE"], /* Hangul Syllable */ + ["\uC3DF", "\uC3DF"], /* Hangul Syllable */ + ["\uC3E0", "\uC3E0"], /* Hangul Syllable */ + ["\uC3E1", "\uC3E1"], /* Hangul Syllable */ + ["\uC3E2", "\uC3E2"], /* Hangul Syllable */ + ["\uC3E3", "\uC3E3"], /* Hangul Syllable */ + ["\uC3E4", "\uC3E4"], /* Hangul Syllable */ + ["\uC3E5", "\uC3E5"], /* Hangul Syllable */ + ["\uC3E6", "\uC3E6"], /* Hangul Syllable */ + ["\uC3E7", "\uC3E7"], /* Hangul Syllable */ + ["\uC3E8", "\uC3E8"], /* Hangul Syllable */ + ["\uC3E9", "\uC3E9"], /* Hangul Syllable */ + ["\uC3EA", "\uC3EA"], /* Hangul Syllable */ + ["\uC3EB", "\uC3EB"], /* Hangul Syllable */ + ["\uC3EC", "\uC3EC"], /* Hangul Syllable */ + ["\uC3ED", "\uC3ED"], /* Hangul Syllable */ + ["\uC3EE", "\uC3EE"], /* Hangul Syllable */ + ["\uC3EF", "\uC3EF"], /* Hangul Syllable */ + ["\uC3F0", "\uC3F0"], /* Hangul Syllable */ + ["\uC3F1", "\uC3F1"], /* Hangul Syllable */ + ["\uC3F2", "\uC3F2"], /* Hangul Syllable */ + ["\uC3F3", "\uC3F3"], /* Hangul Syllable */ + ["\uC3F4", "\uC3F4"], /* Hangul Syllable */ + ["\uC3F5", "\uC3F5"], /* Hangul Syllable */ + ["\uC3F6", "\uC3F6"], /* Hangul Syllable */ + ["\uC3F7", "\uC3F7"], /* Hangul Syllable */ + ["\uC3F8", "\uC3F8"], /* Hangul Syllable */ + ["\uC3F9", "\uC3F9"], /* Hangul Syllable */ + ["\uC3FA", "\uC3FA"], /* Hangul Syllable */ + ["\uC3FB", "\uC3FB"], /* Hangul Syllable */ + ["\uC3FC", "\uC3FC"], /* Hangul Syllable */ + ["\uC3FD", "\uC3FD"], /* Hangul Syllable */ + ["\uC3FE", "\uC3FE"], /* Hangul Syllable */ + ["\uC3FF", "\uC3FF"], /* Hangul Syllable */ + ["\uC400", "\uC400"], /* Hangul Syllable */ + ["\uC401", "\uC401"], /* Hangul Syllable */ + ["\uC402", "\uC402"], /* Hangul Syllable */ + ["\uC403", "\uC403"], /* Hangul Syllable */ + ["\uC404", "\uC404"], /* Hangul Syllable */ + ["\uC405", "\uC405"], /* Hangul Syllable */ + ["\uC406", "\uC406"], /* Hangul Syllable */ + ["\uC407", "\uC407"], /* Hangul Syllable */ + ["\uC408", "\uC408"], /* Hangul Syllable */ + ["\uC409", "\uC409"], /* Hangul Syllable */ + ["\uC40A", "\uC40A"], /* Hangul Syllable */ + ["\uC40B", "\uC40B"], /* Hangul Syllable */ + ["\uC40C", "\uC40C"], /* Hangul Syllable */ + ["\uC40D", "\uC40D"], /* Hangul Syllable */ + ["\uC40E", "\uC40E"], /* Hangul Syllable */ + ["\uC40F", "\uC40F"], /* Hangul Syllable */ + ["\uC410", "\uC410"], /* Hangul Syllable */ + ["\uC411", "\uC411"], /* Hangul Syllable */ + ["\uC412", "\uC412"], /* Hangul Syllable */ + ["\uC413", "\uC413"], /* Hangul Syllable */ + ["\uC414", "\uC414"], /* Hangul Syllable */ + ["\uC415", "\uC415"], /* Hangul Syllable */ + ["\uC416", "\uC416"], /* Hangul Syllable */ + ["\uC417", "\uC417"], /* Hangul Syllable */ + ["\uC418", "\uC418"], /* Hangul Syllable */ + ["\uC419", "\uC419"], /* Hangul Syllable */ + ["\uC41A", "\uC41A"], /* Hangul Syllable */ + ["\uC41B", "\uC41B"], /* Hangul Syllable */ + ["\uC41C", "\uC41C"], /* Hangul Syllable */ + ["\uC41D", "\uC41D"], /* Hangul Syllable */ + ["\uC41E", "\uC41E"], /* Hangul Syllable */ + ["\uC41F", "\uC41F"], /* Hangul Syllable */ + ["\uC420", "\uC420"], /* Hangul Syllable */ + ["\uC421", "\uC421"], /* Hangul Syllable */ + ["\uC422", "\uC422"], /* Hangul Syllable */ + ["\uC423", "\uC423"], /* Hangul Syllable */ + ["\uC424", "\uC424"], /* Hangul Syllable */ + ["\uC425", "\uC425"], /* Hangul Syllable */ + ["\uC426", "\uC426"], /* Hangul Syllable */ + ["\uC427", "\uC427"], /* Hangul Syllable */ + ["\uC428", "\uC428"], /* Hangul Syllable */ + ["\uC429", "\uC429"], /* Hangul Syllable */ + ["\uC42A", "\uC42A"], /* Hangul Syllable */ + ["\uC42B", "\uC42B"], /* Hangul Syllable */ + ["\uC42C", "\uC42C"], /* Hangul Syllable */ + ["\uC42D", "\uC42D"], /* Hangul Syllable */ + ["\uC42E", "\uC42E"], /* Hangul Syllable */ + ["\uC42F", "\uC42F"], /* Hangul Syllable */ + ["\uC430", "\uC430"], /* Hangul Syllable */ + ["\uC431", "\uC431"], /* Hangul Syllable */ + ["\uC432", "\uC432"], /* Hangul Syllable */ + ["\uC433", "\uC433"], /* Hangul Syllable */ + ["\uC434", "\uC434"], /* Hangul Syllable */ + ["\uC435", "\uC435"], /* Hangul Syllable */ + ["\uC436", "\uC436"], /* Hangul Syllable */ + ["\uC437", "\uC437"], /* Hangul Syllable */ + ["\uC438", "\uC438"], /* Hangul Syllable */ + ["\uC439", "\uC439"], /* Hangul Syllable */ + ["\uC43A", "\uC43A"], /* Hangul Syllable */ + ["\uC43B", "\uC43B"], /* Hangul Syllable */ + ["\uC43C", "\uC43C"], /* Hangul Syllable */ + ["\uC43D", "\uC43D"], /* Hangul Syllable */ + ["\uC43E", "\uC43E"], /* Hangul Syllable */ + ["\uC43F", "\uC43F"], /* Hangul Syllable */ + ["\uC440", "\uC440"], /* Hangul Syllable */ + ["\uC441", "\uC441"], /* Hangul Syllable */ + ["\uC442", "\uC442"], /* Hangul Syllable */ + ["\uC443", "\uC443"], /* Hangul Syllable */ + ["\uC444", "\uC444"], /* Hangul Syllable */ + ["\uC445", "\uC445"], /* Hangul Syllable */ + ["\uC446", "\uC446"], /* Hangul Syllable */ + ["\uC447", "\uC447"], /* Hangul Syllable */ + ["\uC448", "\uC448"], /* Hangul Syllable */ + ["\uC449", "\uC449"], /* Hangul Syllable */ + ["\uC44A", "\uC44A"], /* Hangul Syllable */ + ["\uC44B", "\uC44B"], /* Hangul Syllable */ + ["\uC44C", "\uC44C"], /* Hangul Syllable */ + ["\uC44D", "\uC44D"], /* Hangul Syllable */ + ["\uC44E", "\uC44E"], /* Hangul Syllable */ + ["\uC44F", "\uC44F"], /* Hangul Syllable */ + ["\uC450", "\uC450"], /* Hangul Syllable */ + ["\uC451", "\uC451"], /* Hangul Syllable */ + ["\uC452", "\uC452"], /* Hangul Syllable */ + ["\uC453", "\uC453"], /* Hangul Syllable */ + ["\uC454", "\uC454"], /* Hangul Syllable */ + ["\uC455", "\uC455"], /* Hangul Syllable */ + ["\uC456", "\uC456"], /* Hangul Syllable */ + ["\uC457", "\uC457"], /* Hangul Syllable */ + ["\uC458", "\uC458"], /* Hangul Syllable */ + ["\uC459", "\uC459"], /* Hangul Syllable */ + ["\uC45A", "\uC45A"], /* Hangul Syllable */ + ["\uC45B", "\uC45B"], /* Hangul Syllable */ + ["\uC45C", "\uC45C"], /* Hangul Syllable */ + ["\uC45D", "\uC45D"], /* Hangul Syllable */ + ["\uC45E", "\uC45E"], /* Hangul Syllable */ + ["\uC45F", "\uC45F"], /* Hangul Syllable */ + ["\uC460", "\uC460"], /* Hangul Syllable */ + ["\uC461", "\uC461"], /* Hangul Syllable */ + ["\uC462", "\uC462"], /* Hangul Syllable */ + ["\uC463", "\uC463"], /* Hangul Syllable */ + ["\uC464", "\uC464"], /* Hangul Syllable */ + ["\uC465", "\uC465"], /* Hangul Syllable */ + ["\uC466", "\uC466"], /* Hangul Syllable */ + ["\uC467", "\uC467"], /* Hangul Syllable */ + ["\uC468", "\uC468"], /* Hangul Syllable */ + ["\uC469", "\uC469"], /* Hangul Syllable */ + ["\uC46A", "\uC46A"], /* Hangul Syllable */ + ["\uC46B", "\uC46B"], /* Hangul Syllable */ + ["\uC46C", "\uC46C"], /* Hangul Syllable */ + ["\uC46D", "\uC46D"], /* Hangul Syllable */ + ["\uC46E", "\uC46E"], /* Hangul Syllable */ + ["\uC46F", "\uC46F"], /* Hangul Syllable */ + ["\uC470", "\uC470"], /* Hangul Syllable */ + ["\uC471", "\uC471"], /* Hangul Syllable */ + ["\uC472", "\uC472"], /* Hangul Syllable */ + ["\uC473", "\uC473"], /* Hangul Syllable */ + ["\uC474", "\uC474"], /* Hangul Syllable */ + ["\uC475", "\uC475"], /* Hangul Syllable */ + ["\uC476", "\uC476"], /* Hangul Syllable */ + ["\uC477", "\uC477"], /* Hangul Syllable */ + ["\uC478", "\uC478"], /* Hangul Syllable */ + ["\uC479", "\uC479"], /* Hangul Syllable */ + ["\uC47A", "\uC47A"], /* Hangul Syllable */ + ["\uC47B", "\uC47B"], /* Hangul Syllable */ + ["\uC47C", "\uC47C"], /* Hangul Syllable */ + ["\uC47D", "\uC47D"], /* Hangul Syllable */ + ["\uC47E", "\uC47E"], /* Hangul Syllable */ + ["\uC47F", "\uC47F"], /* Hangul Syllable */ + ["\uC480", "\uC480"], /* Hangul Syllable */ + ["\uC481", "\uC481"], /* Hangul Syllable */ + ["\uC482", "\uC482"], /* Hangul Syllable */ + ["\uC483", "\uC483"], /* Hangul Syllable */ + ["\uC484", "\uC484"], /* Hangul Syllable */ + ["\uC485", "\uC485"], /* Hangul Syllable */ + ["\uC486", "\uC486"], /* Hangul Syllable */ + ["\uC487", "\uC487"], /* Hangul Syllable */ + ["\uC488", "\uC488"], /* Hangul Syllable */ + ["\uC489", "\uC489"], /* Hangul Syllable */ + ["\uC48A", "\uC48A"], /* Hangul Syllable */ + ["\uC48B", "\uC48B"], /* Hangul Syllable */ + ["\uC48C", "\uC48C"], /* Hangul Syllable */ + ["\uC48D", "\uC48D"], /* Hangul Syllable */ + ["\uC48E", "\uC48E"], /* Hangul Syllable */ + ["\uC48F", "\uC48F"], /* Hangul Syllable */ + ["\uC490", "\uC490"], /* Hangul Syllable */ + ["\uC491", "\uC491"], /* Hangul Syllable */ + ["\uC492", "\uC492"], /* Hangul Syllable */ + ["\uC493", "\uC493"], /* Hangul Syllable */ + ["\uC494", "\uC494"], /* Hangul Syllable */ + ["\uC495", "\uC495"], /* Hangul Syllable */ + ["\uC496", "\uC496"], /* Hangul Syllable */ + ["\uC497", "\uC497"], /* Hangul Syllable */ + ["\uC498", "\uC498"], /* Hangul Syllable */ + ["\uC499", "\uC499"], /* Hangul Syllable */ + ["\uC49A", "\uC49A"], /* Hangul Syllable */ + ["\uC49B", "\uC49B"], /* Hangul Syllable */ + ["\uC49C", "\uC49C"], /* Hangul Syllable */ + ["\uC49D", "\uC49D"], /* Hangul Syllable */ + ["\uC49E", "\uC49E"], /* Hangul Syllable */ + ["\uC49F", "\uC49F"], /* Hangul Syllable */ + ["\uC4A0", "\uC4A0"], /* Hangul Syllable */ + ["\uC4A1", "\uC4A1"], /* Hangul Syllable */ + ["\uC4A2", "\uC4A2"], /* Hangul Syllable */ + ["\uC4A3", "\uC4A3"], /* Hangul Syllable */ + ["\uC4A4", "\uC4A4"], /* Hangul Syllable */ + ["\uC4A5", "\uC4A5"], /* Hangul Syllable */ + ["\uC4A6", "\uC4A6"], /* Hangul Syllable */ + ["\uC4A7", "\uC4A7"], /* Hangul Syllable */ + ["\uC4A8", "\uC4A8"], /* Hangul Syllable */ + ["\uC4A9", "\uC4A9"], /* Hangul Syllable */ + ["\uC4AA", "\uC4AA"], /* Hangul Syllable */ + ["\uC4AB", "\uC4AB"], /* Hangul Syllable */ + ["\uC4AC", "\uC4AC"], /* Hangul Syllable */ + ["\uC4AD", "\uC4AD"], /* Hangul Syllable */ + ["\uC4AE", "\uC4AE"], /* Hangul Syllable */ + ["\uC4AF", "\uC4AF"], /* Hangul Syllable */ + ["\uC4B0", "\uC4B0"], /* Hangul Syllable */ + ["\uC4B1", "\uC4B1"], /* Hangul Syllable */ + ["\uC4B2", "\uC4B2"], /* Hangul Syllable */ + ["\uC4B3", "\uC4B3"], /* Hangul Syllable */ + ["\uC4B4", "\uC4B4"], /* Hangul Syllable */ + ["\uC4B5", "\uC4B5"], /* Hangul Syllable */ + ["\uC4B6", "\uC4B6"], /* Hangul Syllable */ + ["\uC4B7", "\uC4B7"], /* Hangul Syllable */ + ["\uC4B8", "\uC4B8"], /* Hangul Syllable */ + ["\uC4B9", "\uC4B9"], /* Hangul Syllable */ + ["\uC4BA", "\uC4BA"], /* Hangul Syllable */ + ["\uC4BB", "\uC4BB"], /* Hangul Syllable */ + ["\uC4BC", "\uC4BC"], /* Hangul Syllable */ + ["\uC4BD", "\uC4BD"], /* Hangul Syllable */ + ["\uC4BE", "\uC4BE"], /* Hangul Syllable */ + ["\uC4BF", "\uC4BF"], /* Hangul Syllable */ + ["\uC4C0", "\uC4C0"], /* Hangul Syllable */ + ["\uC4C1", "\uC4C1"], /* Hangul Syllable */ + ["\uC4C2", "\uC4C2"], /* Hangul Syllable */ + ["\uC4C3", "\uC4C3"], /* Hangul Syllable */ + ["\uC4C4", "\uC4C4"], /* Hangul Syllable */ + ["\uC4C5", "\uC4C5"], /* Hangul Syllable */ + ["\uC4C6", "\uC4C6"], /* Hangul Syllable */ + ["\uC4C7", "\uC4C7"], /* Hangul Syllable */ + ["\uC4C8", "\uC4C8"], /* Hangul Syllable */ + ["\uC4C9", "\uC4C9"], /* Hangul Syllable */ + ["\uC4CA", "\uC4CA"], /* Hangul Syllable */ + ["\uC4CB", "\uC4CB"], /* Hangul Syllable */ + ["\uC4CC", "\uC4CC"], /* Hangul Syllable */ + ["\uC4CD", "\uC4CD"], /* Hangul Syllable */ + ["\uC4CE", "\uC4CE"], /* Hangul Syllable */ + ["\uC4CF", "\uC4CF"], /* Hangul Syllable */ + ["\uC4D0", "\uC4D0"], /* Hangul Syllable */ + ["\uC4D1", "\uC4D1"], /* Hangul Syllable */ + ["\uC4D2", "\uC4D2"], /* Hangul Syllable */ + ["\uC4D3", "\uC4D3"], /* Hangul Syllable */ + ["\uC4D4", "\uC4D4"], /* Hangul Syllable */ + ["\uC4D5", "\uC4D5"], /* Hangul Syllable */ + ["\uC4D6", "\uC4D6"], /* Hangul Syllable */ + ["\uC4D7", "\uC4D7"], /* Hangul Syllable */ + ["\uC4D8", "\uC4D8"], /* Hangul Syllable */ + ["\uC4D9", "\uC4D9"], /* Hangul Syllable */ + ["\uC4DA", "\uC4DA"], /* Hangul Syllable */ + ["\uC4DB", "\uC4DB"], /* Hangul Syllable */ + ["\uC4DC", "\uC4DC"], /* Hangul Syllable */ + ["\uC4DD", "\uC4DD"], /* Hangul Syllable */ + ["\uC4DE", "\uC4DE"], /* Hangul Syllable */ + ["\uC4DF", "\uC4DF"], /* Hangul Syllable */ + ["\uC4E0", "\uC4E0"], /* Hangul Syllable */ + ["\uC4E1", "\uC4E1"], /* Hangul Syllable */ + ["\uC4E2", "\uC4E2"], /* Hangul Syllable */ + ["\uC4E3", "\uC4E3"], /* Hangul Syllable */ + ["\uC4E4", "\uC4E4"], /* Hangul Syllable */ + ["\uC4E5", "\uC4E5"], /* Hangul Syllable */ + ["\uC4E6", "\uC4E6"], /* Hangul Syllable */ + ["\uC4E7", "\uC4E7"], /* Hangul Syllable */ + ["\uC4E8", "\uC4E8"], /* Hangul Syllable */ + ["\uC4E9", "\uC4E9"], /* Hangul Syllable */ + ["\uC4EA", "\uC4EA"], /* Hangul Syllable */ + ["\uC4EB", "\uC4EB"], /* Hangul Syllable */ + ["\uC4EC", "\uC4EC"], /* Hangul Syllable */ + ["\uC4ED", "\uC4ED"], /* Hangul Syllable */ + ["\uC4EE", "\uC4EE"], /* Hangul Syllable */ + ["\uC4EF", "\uC4EF"], /* Hangul Syllable */ + ["\uC4F0", "\uC4F0"], /* Hangul Syllable */ + ["\uC4F1", "\uC4F1"], /* Hangul Syllable */ + ["\uC4F2", "\uC4F2"], /* Hangul Syllable */ + ["\uC4F3", "\uC4F3"], /* Hangul Syllable */ + ["\uC4F4", "\uC4F4"], /* Hangul Syllable */ + ["\uC4F5", "\uC4F5"], /* Hangul Syllable */ + ["\uC4F6", "\uC4F6"], /* Hangul Syllable */ + ["\uC4F7", "\uC4F7"], /* Hangul Syllable */ + ["\uC4F8", "\uC4F8"], /* Hangul Syllable */ + ["\uC4F9", "\uC4F9"], /* Hangul Syllable */ + ["\uC4FA", "\uC4FA"], /* Hangul Syllable */ + ["\uC4FB", "\uC4FB"], /* Hangul Syllable */ + ["\uC4FC", "\uC4FC"], /* Hangul Syllable */ + ["\uC4FD", "\uC4FD"], /* Hangul Syllable */ + ["\uC4FE", "\uC4FE"], /* Hangul Syllable */ + ["\uC4FF", "\uC4FF"], /* Hangul Syllable */ + ["\uC500", "\uC500"], /* Hangul Syllable */ + ["\uC501", "\uC501"], /* Hangul Syllable */ + ["\uC502", "\uC502"], /* Hangul Syllable */ + ["\uC503", "\uC503"], /* Hangul Syllable */ + ["\uC504", "\uC504"], /* Hangul Syllable */ + ["\uC505", "\uC505"], /* Hangul Syllable */ + ["\uC506", "\uC506"], /* Hangul Syllable */ + ["\uC507", "\uC507"], /* Hangul Syllable */ + ["\uC508", "\uC508"], /* Hangul Syllable */ + ["\uC509", "\uC509"], /* Hangul Syllable */ + ["\uC50A", "\uC50A"], /* Hangul Syllable */ + ["\uC50B", "\uC50B"], /* Hangul Syllable */ + ["\uC50C", "\uC50C"], /* Hangul Syllable */ + ["\uC50D", "\uC50D"], /* Hangul Syllable */ + ["\uC50E", "\uC50E"], /* Hangul Syllable */ + ["\uC50F", "\uC50F"], /* Hangul Syllable */ + ["\uC510", "\uC510"], /* Hangul Syllable */ + ["\uC511", "\uC511"], /* Hangul Syllable */ + ["\uC512", "\uC512"], /* Hangul Syllable */ + ["\uC513", "\uC513"], /* Hangul Syllable */ + ["\uC514", "\uC514"], /* Hangul Syllable */ + ["\uC515", "\uC515"], /* Hangul Syllable */ + ["\uC516", "\uC516"], /* Hangul Syllable */ + ["\uC517", "\uC517"], /* Hangul Syllable */ + ["\uC518", "\uC518"], /* Hangul Syllable */ + ["\uC519", "\uC519"], /* Hangul Syllable */ + ["\uC51A", "\uC51A"], /* Hangul Syllable */ + ["\uC51B", "\uC51B"], /* Hangul Syllable */ + ["\uC51C", "\uC51C"], /* Hangul Syllable */ + ["\uC51D", "\uC51D"], /* Hangul Syllable */ + ["\uC51E", "\uC51E"], /* Hangul Syllable */ + ["\uC51F", "\uC51F"], /* Hangul Syllable */ + ["\uC520", "\uC520"], /* Hangul Syllable */ + ["\uC521", "\uC521"], /* Hangul Syllable */ + ["\uC522", "\uC522"], /* Hangul Syllable */ + ["\uC523", "\uC523"], /* Hangul Syllable */ + ["\uC524", "\uC524"], /* Hangul Syllable */ + ["\uC525", "\uC525"], /* Hangul Syllable */ + ["\uC526", "\uC526"], /* Hangul Syllable */ + ["\uC527", "\uC527"], /* Hangul Syllable */ + ["\uC528", "\uC528"], /* Hangul Syllable */ + ["\uC529", "\uC529"], /* Hangul Syllable */ + ["\uC52A", "\uC52A"], /* Hangul Syllable */ + ["\uC52B", "\uC52B"], /* Hangul Syllable */ + ["\uC52C", "\uC52C"], /* Hangul Syllable */ + ["\uC52D", "\uC52D"], /* Hangul Syllable */ + ["\uC52E", "\uC52E"], /* Hangul Syllable */ + ["\uC52F", "\uC52F"], /* Hangul Syllable */ + ["\uC530", "\uC530"], /* Hangul Syllable */ + ["\uC531", "\uC531"], /* Hangul Syllable */ + ["\uC532", "\uC532"], /* Hangul Syllable */ + ["\uC533", "\uC533"], /* Hangul Syllable */ + ["\uC534", "\uC534"], /* Hangul Syllable */ + ["\uC535", "\uC535"], /* Hangul Syllable */ + ["\uC536", "\uC536"], /* Hangul Syllable */ + ["\uC537", "\uC537"], /* Hangul Syllable */ + ["\uC538", "\uC538"], /* Hangul Syllable */ + ["\uC539", "\uC539"], /* Hangul Syllable */ + ["\uC53A", "\uC53A"], /* Hangul Syllable */ + ["\uC53B", "\uC53B"], /* Hangul Syllable */ + ["\uC53C", "\uC53C"], /* Hangul Syllable */ + ["\uC53D", "\uC53D"], /* Hangul Syllable */ + ["\uC53E", "\uC53E"], /* Hangul Syllable */ + ["\uC53F", "\uC53F"], /* Hangul Syllable */ + ["\uC540", "\uC540"], /* Hangul Syllable */ + ["\uC541", "\uC541"], /* Hangul Syllable */ + ["\uC542", "\uC542"], /* Hangul Syllable */ + ["\uC543", "\uC543"], /* Hangul Syllable */ + ["\uC544", "\uC544"], /* Hangul Syllable */ + ["\uC545", "\uC545"], /* Hangul Syllable */ + ["\uC546", "\uC546"], /* Hangul Syllable */ + ["\uC547", "\uC547"], /* Hangul Syllable */ + ["\uC548", "\uC548"], /* Hangul Syllable */ + ["\uC549", "\uC549"], /* Hangul Syllable */ + ["\uC54A", "\uC54A"], /* Hangul Syllable */ + ["\uC54B", "\uC54B"], /* Hangul Syllable */ + ["\uC54C", "\uC54C"], /* Hangul Syllable */ + ["\uC54D", "\uC54D"], /* Hangul Syllable */ + ["\uC54E", "\uC54E"], /* Hangul Syllable */ + ["\uC54F", "\uC54F"], /* Hangul Syllable */ + ["\uC550", "\uC550"], /* Hangul Syllable */ + ["\uC551", "\uC551"], /* Hangul Syllable */ + ["\uC552", "\uC552"], /* Hangul Syllable */ + ["\uC553", "\uC553"], /* Hangul Syllable */ + ["\uC554", "\uC554"], /* Hangul Syllable */ + ["\uC555", "\uC555"], /* Hangul Syllable */ + ["\uC556", "\uC556"], /* Hangul Syllable */ + ["\uC557", "\uC557"], /* Hangul Syllable */ + ["\uC558", "\uC558"], /* Hangul Syllable */ + ["\uC559", "\uC559"], /* Hangul Syllable */ + ["\uC55A", "\uC55A"], /* Hangul Syllable */ + ["\uC55B", "\uC55B"], /* Hangul Syllable */ + ["\uC55C", "\uC55C"], /* Hangul Syllable */ + ["\uC55D", "\uC55D"], /* Hangul Syllable */ + ["\uC55E", "\uC55E"], /* Hangul Syllable */ + ["\uC55F", "\uC55F"], /* Hangul Syllable */ + ["\uC560", "\uC560"], /* Hangul Syllable */ + ["\uC561", "\uC561"], /* Hangul Syllable */ + ["\uC562", "\uC562"], /* Hangul Syllable */ + ["\uC563", "\uC563"], /* Hangul Syllable */ + ["\uC564", "\uC564"], /* Hangul Syllable */ + ["\uC565", "\uC565"], /* Hangul Syllable */ + ["\uC566", "\uC566"], /* Hangul Syllable */ + ["\uC567", "\uC567"], /* Hangul Syllable */ + ["\uC568", "\uC568"], /* Hangul Syllable */ + ["\uC569", "\uC569"], /* Hangul Syllable */ + ["\uC56A", "\uC56A"], /* Hangul Syllable */ + ["\uC56B", "\uC56B"], /* Hangul Syllable */ + ["\uC56C", "\uC56C"], /* Hangul Syllable */ + ["\uC56D", "\uC56D"], /* Hangul Syllable */ + ["\uC56E", "\uC56E"], /* Hangul Syllable */ + ["\uC56F", "\uC56F"], /* Hangul Syllable */ + ["\uC570", "\uC570"], /* Hangul Syllable */ + ["\uC571", "\uC571"], /* Hangul Syllable */ + ["\uC572", "\uC572"], /* Hangul Syllable */ + ["\uC573", "\uC573"], /* Hangul Syllable */ + ["\uC574", "\uC574"], /* Hangul Syllable */ + ["\uC575", "\uC575"], /* Hangul Syllable */ + ["\uC576", "\uC576"], /* Hangul Syllable */ + ["\uC577", "\uC577"], /* Hangul Syllable */ + ["\uC578", "\uC578"], /* Hangul Syllable */ + ["\uC579", "\uC579"], /* Hangul Syllable */ + ["\uC57A", "\uC57A"], /* Hangul Syllable */ + ["\uC57B", "\uC57B"], /* Hangul Syllable */ + ["\uC57C", "\uC57C"], /* Hangul Syllable */ + ["\uC57D", "\uC57D"], /* Hangul Syllable */ + ["\uC57E", "\uC57E"], /* Hangul Syllable */ + ["\uC57F", "\uC57F"], /* Hangul Syllable */ + ["\uC580", "\uC580"], /* Hangul Syllable */ + ["\uC581", "\uC581"], /* Hangul Syllable */ + ["\uC582", "\uC582"], /* Hangul Syllable */ + ["\uC583", "\uC583"], /* Hangul Syllable */ + ["\uC584", "\uC584"], /* Hangul Syllable */ + ["\uC585", "\uC585"], /* Hangul Syllable */ + ["\uC586", "\uC586"], /* Hangul Syllable */ + ["\uC587", "\uC587"], /* Hangul Syllable */ + ["\uC588", "\uC588"], /* Hangul Syllable */ + ["\uC589", "\uC589"], /* Hangul Syllable */ + ["\uC58A", "\uC58A"], /* Hangul Syllable */ + ["\uC58B", "\uC58B"], /* Hangul Syllable */ + ["\uC58C", "\uC58C"], /* Hangul Syllable */ + ["\uC58D", "\uC58D"], /* Hangul Syllable */ + ["\uC58E", "\uC58E"], /* Hangul Syllable */ + ["\uC58F", "\uC58F"], /* Hangul Syllable */ + ["\uC590", "\uC590"], /* Hangul Syllable */ + ["\uC591", "\uC591"], /* Hangul Syllable */ + ["\uC592", "\uC592"], /* Hangul Syllable */ + ["\uC593", "\uC593"], /* Hangul Syllable */ + ["\uC594", "\uC594"], /* Hangul Syllable */ + ["\uC595", "\uC595"], /* Hangul Syllable */ + ["\uC596", "\uC596"], /* Hangul Syllable */ + ["\uC597", "\uC597"], /* Hangul Syllable */ + ["\uC598", "\uC598"], /* Hangul Syllable */ + ["\uC599", "\uC599"], /* Hangul Syllable */ + ["\uC59A", "\uC59A"], /* Hangul Syllable */ + ["\uC59B", "\uC59B"], /* Hangul Syllable */ + ["\uC59C", "\uC59C"], /* Hangul Syllable */ + ["\uC59D", "\uC59D"], /* Hangul Syllable */ + ["\uC59E", "\uC59E"], /* Hangul Syllable */ + ["\uC59F", "\uC59F"], /* Hangul Syllable */ + ["\uC5A0", "\uC5A0"], /* Hangul Syllable */ + ["\uC5A1", "\uC5A1"], /* Hangul Syllable */ + ["\uC5A2", "\uC5A2"], /* Hangul Syllable */ + ["\uC5A3", "\uC5A3"], /* Hangul Syllable */ + ["\uC5A4", "\uC5A4"], /* Hangul Syllable */ + ["\uC5A5", "\uC5A5"], /* Hangul Syllable */ + ["\uC5A6", "\uC5A6"], /* Hangul Syllable */ + ["\uC5A7", "\uC5A7"], /* Hangul Syllable */ + ["\uC5A8", "\uC5A8"], /* Hangul Syllable */ + ["\uC5A9", "\uC5A9"], /* Hangul Syllable */ + ["\uC5AA", "\uC5AA"], /* Hangul Syllable */ + ["\uC5AB", "\uC5AB"], /* Hangul Syllable */ + ["\uC5AC", "\uC5AC"], /* Hangul Syllable */ + ["\uC5AD", "\uC5AD"], /* Hangul Syllable */ + ["\uC5AE", "\uC5AE"], /* Hangul Syllable */ + ["\uC5AF", "\uC5AF"], /* Hangul Syllable */ + ["\uC5B0", "\uC5B0"], /* Hangul Syllable */ + ["\uC5B1", "\uC5B1"], /* Hangul Syllable */ + ["\uC5B2", "\uC5B2"], /* Hangul Syllable */ + ["\uC5B3", "\uC5B3"], /* Hangul Syllable */ + ["\uC5B4", "\uC5B4"], /* Hangul Syllable */ + ["\uC5B5", "\uC5B5"], /* Hangul Syllable */ + ["\uC5B6", "\uC5B6"], /* Hangul Syllable */ + ["\uC5B7", "\uC5B7"], /* Hangul Syllable */ + ["\uC5B8", "\uC5B8"], /* Hangul Syllable */ + ["\uC5B9", "\uC5B9"], /* Hangul Syllable */ + ["\uC5BA", "\uC5BA"], /* Hangul Syllable */ + ["\uC5BB", "\uC5BB"], /* Hangul Syllable */ + ["\uC5BC", "\uC5BC"], /* Hangul Syllable */ + ["\uC5BD", "\uC5BD"], /* Hangul Syllable */ + ["\uC5BE", "\uC5BE"], /* Hangul Syllable */ + ["\uC5BF", "\uC5BF"], /* Hangul Syllable */ + ["\uC5C0", "\uC5C0"], /* Hangul Syllable */ + ["\uC5C1", "\uC5C1"], /* Hangul Syllable */ + ["\uC5C2", "\uC5C2"], /* Hangul Syllable */ + ["\uC5C3", "\uC5C3"], /* Hangul Syllable */ + ["\uC5C4", "\uC5C4"], /* Hangul Syllable */ + ["\uC5C5", "\uC5C5"], /* Hangul Syllable */ + ["\uC5C6", "\uC5C6"], /* Hangul Syllable */ + ["\uC5C7", "\uC5C7"], /* Hangul Syllable */ + ["\uC5C8", "\uC5C8"], /* Hangul Syllable */ + ["\uC5C9", "\uC5C9"], /* Hangul Syllable */ + ["\uC5CA", "\uC5CA"], /* Hangul Syllable */ + ["\uC5CB", "\uC5CB"], /* Hangul Syllable */ + ["\uC5CC", "\uC5CC"], /* Hangul Syllable */ + ["\uC5CD", "\uC5CD"], /* Hangul Syllable */ + ["\uC5CE", "\uC5CE"], /* Hangul Syllable */ + ["\uC5CF", "\uC5CF"], /* Hangul Syllable */ + ["\uC5D0", "\uC5D0"], /* Hangul Syllable */ + ["\uC5D1", "\uC5D1"], /* Hangul Syllable */ + ["\uC5D2", "\uC5D2"], /* Hangul Syllable */ + ["\uC5D3", "\uC5D3"], /* Hangul Syllable */ + ["\uC5D4", "\uC5D4"], /* Hangul Syllable */ + ["\uC5D5", "\uC5D5"], /* Hangul Syllable */ + ["\uC5D6", "\uC5D6"], /* Hangul Syllable */ + ["\uC5D7", "\uC5D7"], /* Hangul Syllable */ + ["\uC5D8", "\uC5D8"], /* Hangul Syllable */ + ["\uC5D9", "\uC5D9"], /* Hangul Syllable */ + ["\uC5DA", "\uC5DA"], /* Hangul Syllable */ + ["\uC5DB", "\uC5DB"], /* Hangul Syllable */ + ["\uC5DC", "\uC5DC"], /* Hangul Syllable */ + ["\uC5DD", "\uC5DD"], /* Hangul Syllable */ + ["\uC5DE", "\uC5DE"], /* Hangul Syllable */ + ["\uC5DF", "\uC5DF"], /* Hangul Syllable */ + ["\uC5E0", "\uC5E0"], /* Hangul Syllable */ + ["\uC5E1", "\uC5E1"], /* Hangul Syllable */ + ["\uC5E2", "\uC5E2"], /* Hangul Syllable */ + ["\uC5E3", "\uC5E3"], /* Hangul Syllable */ + ["\uC5E4", "\uC5E4"], /* Hangul Syllable */ + ["\uC5E5", "\uC5E5"], /* Hangul Syllable */ + ["\uC5E6", "\uC5E6"], /* Hangul Syllable */ + ["\uC5E7", "\uC5E7"], /* Hangul Syllable */ + ["\uC5E8", "\uC5E8"], /* Hangul Syllable */ + ["\uC5E9", "\uC5E9"], /* Hangul Syllable */ + ["\uC5EA", "\uC5EA"], /* Hangul Syllable */ + ["\uC5EB", "\uC5EB"], /* Hangul Syllable */ + ["\uC5EC", "\uC5EC"], /* Hangul Syllable */ + ["\uC5ED", "\uC5ED"], /* Hangul Syllable */ + ["\uC5EE", "\uC5EE"], /* Hangul Syllable */ + ["\uC5EF", "\uC5EF"], /* Hangul Syllable */ + ["\uC5F0", "\uC5F0"], /* Hangul Syllable */ + ["\uC5F1", "\uC5F1"], /* Hangul Syllable */ + ["\uC5F2", "\uC5F2"], /* Hangul Syllable */ + ["\uC5F3", "\uC5F3"], /* Hangul Syllable */ + ["\uC5F4", "\uC5F4"], /* Hangul Syllable */ + ["\uC5F5", "\uC5F5"], /* Hangul Syllable */ + ["\uC5F6", "\uC5F6"], /* Hangul Syllable */ + ["\uC5F7", "\uC5F7"], /* Hangul Syllable */ + ["\uC5F8", "\uC5F8"], /* Hangul Syllable */ + ["\uC5F9", "\uC5F9"], /* Hangul Syllable */ + ["\uC5FA", "\uC5FA"], /* Hangul Syllable */ + ["\uC5FB", "\uC5FB"], /* Hangul Syllable */ + ["\uC5FC", "\uC5FC"], /* Hangul Syllable */ + ["\uC5FD", "\uC5FD"], /* Hangul Syllable */ + ["\uC5FE", "\uC5FE"], /* Hangul Syllable */ + ["\uC5FF", "\uC5FF"], /* Hangul Syllable */ + ["\uC600", "\uC600"], /* Hangul Syllable */ + ["\uC601", "\uC601"], /* Hangul Syllable */ + ["\uC602", "\uC602"], /* Hangul Syllable */ + ["\uC603", "\uC603"], /* Hangul Syllable */ + ["\uC604", "\uC604"], /* Hangul Syllable */ + ["\uC605", "\uC605"], /* Hangul Syllable */ + ["\uC606", "\uC606"], /* Hangul Syllable */ + ["\uC607", "\uC607"], /* Hangul Syllable */ + ["\uC608", "\uC608"], /* Hangul Syllable */ + ["\uC609", "\uC609"], /* Hangul Syllable */ + ["\uC60A", "\uC60A"], /* Hangul Syllable */ + ["\uC60B", "\uC60B"], /* Hangul Syllable */ + ["\uC60C", "\uC60C"], /* Hangul Syllable */ + ["\uC60D", "\uC60D"], /* Hangul Syllable */ + ["\uC60E", "\uC60E"], /* Hangul Syllable */ + ["\uC60F", "\uC60F"], /* Hangul Syllable */ + ["\uC610", "\uC610"], /* Hangul Syllable */ + ["\uC611", "\uC611"], /* Hangul Syllable */ + ["\uC612", "\uC612"], /* Hangul Syllable */ + ["\uC613", "\uC613"], /* Hangul Syllable */ + ["\uC614", "\uC614"], /* Hangul Syllable */ + ["\uC615", "\uC615"], /* Hangul Syllable */ + ["\uC616", "\uC616"], /* Hangul Syllable */ + ["\uC617", "\uC617"], /* Hangul Syllable */ + ["\uC618", "\uC618"], /* Hangul Syllable */ + ["\uC619", "\uC619"], /* Hangul Syllable */ + ["\uC61A", "\uC61A"], /* Hangul Syllable */ + ["\uC61B", "\uC61B"], /* Hangul Syllable */ + ["\uC61C", "\uC61C"], /* Hangul Syllable */ + ["\uC61D", "\uC61D"], /* Hangul Syllable */ + ["\uC61E", "\uC61E"], /* Hangul Syllable */ + ["\uC61F", "\uC61F"], /* Hangul Syllable */ + ["\uC620", "\uC620"], /* Hangul Syllable */ + ["\uC621", "\uC621"], /* Hangul Syllable */ + ["\uC622", "\uC622"], /* Hangul Syllable */ + ["\uC623", "\uC623"], /* Hangul Syllable */ + ["\uC624", "\uC624"], /* Hangul Syllable */ + ["\uC625", "\uC625"], /* Hangul Syllable */ + ["\uC626", "\uC626"], /* Hangul Syllable */ + ["\uC627", "\uC627"], /* Hangul Syllable */ + ["\uC628", "\uC628"], /* Hangul Syllable */ + ["\uC629", "\uC629"], /* Hangul Syllable */ + ["\uC62A", "\uC62A"], /* Hangul Syllable */ + ["\uC62B", "\uC62B"], /* Hangul Syllable */ + ["\uC62C", "\uC62C"], /* Hangul Syllable */ + ["\uC62D", "\uC62D"], /* Hangul Syllable */ + ["\uC62E", "\uC62E"], /* Hangul Syllable */ + ["\uC62F", "\uC62F"], /* Hangul Syllable */ + ["\uC630", "\uC630"], /* Hangul Syllable */ + ["\uC631", "\uC631"], /* Hangul Syllable */ + ["\uC632", "\uC632"], /* Hangul Syllable */ + ["\uC633", "\uC633"], /* Hangul Syllable */ + ["\uC634", "\uC634"], /* Hangul Syllable */ + ["\uC635", "\uC635"], /* Hangul Syllable */ + ["\uC636", "\uC636"], /* Hangul Syllable */ + ["\uC637", "\uC637"], /* Hangul Syllable */ + ["\uC638", "\uC638"], /* Hangul Syllable */ + ["\uC639", "\uC639"], /* Hangul Syllable */ + ["\uC63A", "\uC63A"], /* Hangul Syllable */ + ["\uC63B", "\uC63B"], /* Hangul Syllable */ + ["\uC63C", "\uC63C"], /* Hangul Syllable */ + ["\uC63D", "\uC63D"], /* Hangul Syllable */ + ["\uC63E", "\uC63E"], /* Hangul Syllable */ + ["\uC63F", "\uC63F"], /* Hangul Syllable */ + ["\uC640", "\uC640"], /* Hangul Syllable */ + ["\uC641", "\uC641"], /* Hangul Syllable */ + ["\uC642", "\uC642"], /* Hangul Syllable */ + ["\uC643", "\uC643"], /* Hangul Syllable */ + ["\uC644", "\uC644"], /* Hangul Syllable */ + ["\uC645", "\uC645"], /* Hangul Syllable */ + ["\uC646", "\uC646"], /* Hangul Syllable */ + ["\uC647", "\uC647"], /* Hangul Syllable */ + ["\uC648", "\uC648"], /* Hangul Syllable */ + ["\uC649", "\uC649"], /* Hangul Syllable */ + ["\uC64A", "\uC64A"], /* Hangul Syllable */ + ["\uC64B", "\uC64B"], /* Hangul Syllable */ + ["\uC64C", "\uC64C"], /* Hangul Syllable */ + ["\uC64D", "\uC64D"], /* Hangul Syllable */ + ["\uC64E", "\uC64E"], /* Hangul Syllable */ + ["\uC64F", "\uC64F"], /* Hangul Syllable */ + ["\uC650", "\uC650"], /* Hangul Syllable */ + ["\uC651", "\uC651"], /* Hangul Syllable */ + ["\uC652", "\uC652"], /* Hangul Syllable */ + ["\uC653", "\uC653"], /* Hangul Syllable */ + ["\uC654", "\uC654"], /* Hangul Syllable */ + ["\uC655", "\uC655"], /* Hangul Syllable */ + ["\uC656", "\uC656"], /* Hangul Syllable */ + ["\uC657", "\uC657"], /* Hangul Syllable */ + ["\uC658", "\uC658"], /* Hangul Syllable */ + ["\uC659", "\uC659"], /* Hangul Syllable */ + ["\uC65A", "\uC65A"], /* Hangul Syllable */ + ["\uC65B", "\uC65B"], /* Hangul Syllable */ + ["\uC65C", "\uC65C"], /* Hangul Syllable */ + ["\uC65D", "\uC65D"], /* Hangul Syllable */ + ["\uC65E", "\uC65E"], /* Hangul Syllable */ + ["\uC65F", "\uC65F"], /* Hangul Syllable */ + ["\uC660", "\uC660"], /* Hangul Syllable */ + ["\uC661", "\uC661"], /* Hangul Syllable */ + ["\uC662", "\uC662"], /* Hangul Syllable */ + ["\uC663", "\uC663"], /* Hangul Syllable */ + ["\uC664", "\uC664"], /* Hangul Syllable */ + ["\uC665", "\uC665"], /* Hangul Syllable */ + ["\uC666", "\uC666"], /* Hangul Syllable */ + ["\uC667", "\uC667"], /* Hangul Syllable */ + ["\uC668", "\uC668"], /* Hangul Syllable */ + ["\uC669", "\uC669"], /* Hangul Syllable */ + ["\uC66A", "\uC66A"], /* Hangul Syllable */ + ["\uC66B", "\uC66B"], /* Hangul Syllable */ + ["\uC66C", "\uC66C"], /* Hangul Syllable */ + ["\uC66D", "\uC66D"], /* Hangul Syllable */ + ["\uC66E", "\uC66E"], /* Hangul Syllable */ + ["\uC66F", "\uC66F"], /* Hangul Syllable */ + ["\uC670", "\uC670"], /* Hangul Syllable */ + ["\uC671", "\uC671"], /* Hangul Syllable */ + ["\uC672", "\uC672"], /* Hangul Syllable */ + ["\uC673", "\uC673"], /* Hangul Syllable */ + ["\uC674", "\uC674"], /* Hangul Syllable */ + ["\uC675", "\uC675"], /* Hangul Syllable */ + ["\uC676", "\uC676"], /* Hangul Syllable */ + ["\uC677", "\uC677"], /* Hangul Syllable */ + ["\uC678", "\uC678"], /* Hangul Syllable */ + ["\uC679", "\uC679"], /* Hangul Syllable */ + ["\uC67A", "\uC67A"], /* Hangul Syllable */ + ["\uC67B", "\uC67B"], /* Hangul Syllable */ + ["\uC67C", "\uC67C"], /* Hangul Syllable */ + ["\uC67D", "\uC67D"], /* Hangul Syllable */ + ["\uC67E", "\uC67E"], /* Hangul Syllable */ + ["\uC67F", "\uC67F"], /* Hangul Syllable */ + ["\uC680", "\uC680"], /* Hangul Syllable */ + ["\uC681", "\uC681"], /* Hangul Syllable */ + ["\uC682", "\uC682"], /* Hangul Syllable */ + ["\uC683", "\uC683"], /* Hangul Syllable */ + ["\uC684", "\uC684"], /* Hangul Syllable */ + ["\uC685", "\uC685"], /* Hangul Syllable */ + ["\uC686", "\uC686"], /* Hangul Syllable */ + ["\uC687", "\uC687"], /* Hangul Syllable */ + ["\uC688", "\uC688"], /* Hangul Syllable */ + ["\uC689", "\uC689"], /* Hangul Syllable */ + ["\uC68A", "\uC68A"], /* Hangul Syllable */ + ["\uC68B", "\uC68B"], /* Hangul Syllable */ + ["\uC68C", "\uC68C"], /* Hangul Syllable */ + ["\uC68D", "\uC68D"], /* Hangul Syllable */ + ["\uC68E", "\uC68E"], /* Hangul Syllable */ + ["\uC68F", "\uC68F"], /* Hangul Syllable */ + ["\uC690", "\uC690"], /* Hangul Syllable */ + ["\uC691", "\uC691"], /* Hangul Syllable */ + ["\uC692", "\uC692"], /* Hangul Syllable */ + ["\uC693", "\uC693"], /* Hangul Syllable */ + ["\uC694", "\uC694"], /* Hangul Syllable */ + ["\uC695", "\uC695"], /* Hangul Syllable */ + ["\uC696", "\uC696"], /* Hangul Syllable */ + ["\uC697", "\uC697"], /* Hangul Syllable */ + ["\uC698", "\uC698"], /* Hangul Syllable */ + ["\uC699", "\uC699"], /* Hangul Syllable */ + ["\uC69A", "\uC69A"], /* Hangul Syllable */ + ["\uC69B", "\uC69B"], /* Hangul Syllable */ + ["\uC69C", "\uC69C"], /* Hangul Syllable */ + ["\uC69D", "\uC69D"], /* Hangul Syllable */ + ["\uC69E", "\uC69E"], /* Hangul Syllable */ + ["\uC69F", "\uC69F"], /* Hangul Syllable */ + ["\uC6A0", "\uC6A0"], /* Hangul Syllable */ + ["\uC6A1", "\uC6A1"], /* Hangul Syllable */ + ["\uC6A2", "\uC6A2"], /* Hangul Syllable */ + ["\uC6A3", "\uC6A3"], /* Hangul Syllable */ + ["\uC6A4", "\uC6A4"], /* Hangul Syllable */ + ["\uC6A5", "\uC6A5"], /* Hangul Syllable */ + ["\uC6A6", "\uC6A6"], /* Hangul Syllable */ + ["\uC6A7", "\uC6A7"], /* Hangul Syllable */ + ["\uC6A8", "\uC6A8"], /* Hangul Syllable */ + ["\uC6A9", "\uC6A9"], /* Hangul Syllable */ + ["\uC6AA", "\uC6AA"], /* Hangul Syllable */ + ["\uC6AB", "\uC6AB"], /* Hangul Syllable */ + ["\uC6AC", "\uC6AC"], /* Hangul Syllable */ + ["\uC6AD", "\uC6AD"], /* Hangul Syllable */ + ["\uC6AE", "\uC6AE"], /* Hangul Syllable */ + ["\uC6AF", "\uC6AF"], /* Hangul Syllable */ + ["\uC6B0", "\uC6B0"], /* Hangul Syllable */ + ["\uC6B1", "\uC6B1"], /* Hangul Syllable */ + ["\uC6B2", "\uC6B2"], /* Hangul Syllable */ + ["\uC6B3", "\uC6B3"], /* Hangul Syllable */ + ["\uC6B4", "\uC6B4"], /* Hangul Syllable */ + ["\uC6B5", "\uC6B5"], /* Hangul Syllable */ + ["\uC6B6", "\uC6B6"], /* Hangul Syllable */ + ["\uC6B7", "\uC6B7"], /* Hangul Syllable */ + ["\uC6B8", "\uC6B8"], /* Hangul Syllable */ + ["\uC6B9", "\uC6B9"], /* Hangul Syllable */ + ["\uC6BA", "\uC6BA"], /* Hangul Syllable */ + ["\uC6BB", "\uC6BB"], /* Hangul Syllable */ + ["\uC6BC", "\uC6BC"], /* Hangul Syllable */ + ["\uC6BD", "\uC6BD"], /* Hangul Syllable */ + ["\uC6BE", "\uC6BE"], /* Hangul Syllable */ + ["\uC6BF", "\uC6BF"], /* Hangul Syllable */ + ["\uC6C0", "\uC6C0"], /* Hangul Syllable */ + ["\uC6C1", "\uC6C1"], /* Hangul Syllable */ + ["\uC6C2", "\uC6C2"], /* Hangul Syllable */ + ["\uC6C3", "\uC6C3"], /* Hangul Syllable */ + ["\uC6C4", "\uC6C4"], /* Hangul Syllable */ + ["\uC6C5", "\uC6C5"], /* Hangul Syllable */ + ["\uC6C6", "\uC6C6"], /* Hangul Syllable */ + ["\uC6C7", "\uC6C7"], /* Hangul Syllable */ + ["\uC6C8", "\uC6C8"], /* Hangul Syllable */ + ["\uC6C9", "\uC6C9"], /* Hangul Syllable */ + ["\uC6CA", "\uC6CA"], /* Hangul Syllable */ + ["\uC6CB", "\uC6CB"], /* Hangul Syllable */ + ["\uC6CC", "\uC6CC"], /* Hangul Syllable */ + ["\uC6CD", "\uC6CD"], /* Hangul Syllable */ + ["\uC6CE", "\uC6CE"], /* Hangul Syllable */ + ["\uC6CF", "\uC6CF"], /* Hangul Syllable */ + ["\uC6D0", "\uC6D0"], /* Hangul Syllable */ + ["\uC6D1", "\uC6D1"], /* Hangul Syllable */ + ["\uC6D2", "\uC6D2"], /* Hangul Syllable */ + ["\uC6D3", "\uC6D3"], /* Hangul Syllable */ + ["\uC6D4", "\uC6D4"], /* Hangul Syllable */ + ["\uC6D5", "\uC6D5"], /* Hangul Syllable */ + ["\uC6D6", "\uC6D6"], /* Hangul Syllable */ + ["\uC6D7", "\uC6D7"], /* Hangul Syllable */ + ["\uC6D8", "\uC6D8"], /* Hangul Syllable */ + ["\uC6D9", "\uC6D9"], /* Hangul Syllable */ + ["\uC6DA", "\uC6DA"], /* Hangul Syllable */ + ["\uC6DB", "\uC6DB"], /* Hangul Syllable */ + ["\uC6DC", "\uC6DC"], /* Hangul Syllable */ + ["\uC6DD", "\uC6DD"], /* Hangul Syllable */ + ["\uC6DE", "\uC6DE"], /* Hangul Syllable */ + ["\uC6DF", "\uC6DF"], /* Hangul Syllable */ + ["\uC6E0", "\uC6E0"], /* Hangul Syllable */ + ["\uC6E1", "\uC6E1"], /* Hangul Syllable */ + ["\uC6E2", "\uC6E2"], /* Hangul Syllable */ + ["\uC6E3", "\uC6E3"], /* Hangul Syllable */ + ["\uC6E4", "\uC6E4"], /* Hangul Syllable */ + ["\uC6E5", "\uC6E5"], /* Hangul Syllable */ + ["\uC6E6", "\uC6E6"], /* Hangul Syllable */ + ["\uC6E7", "\uC6E7"], /* Hangul Syllable */ + ["\uC6E8", "\uC6E8"], /* Hangul Syllable */ + ["\uC6E9", "\uC6E9"], /* Hangul Syllable */ + ["\uC6EA", "\uC6EA"], /* Hangul Syllable */ + ["\uC6EB", "\uC6EB"], /* Hangul Syllable */ + ["\uC6EC", "\uC6EC"], /* Hangul Syllable */ + ["\uC6ED", "\uC6ED"], /* Hangul Syllable */ + ["\uC6EE", "\uC6EE"], /* Hangul Syllable */ + ["\uC6EF", "\uC6EF"], /* Hangul Syllable */ + ["\uC6F0", "\uC6F0"], /* Hangul Syllable */ + ["\uC6F1", "\uC6F1"], /* Hangul Syllable */ + ["\uC6F2", "\uC6F2"], /* Hangul Syllable */ + ["\uC6F3", "\uC6F3"], /* Hangul Syllable */ + ["\uC6F4", "\uC6F4"], /* Hangul Syllable */ + ["\uC6F5", "\uC6F5"], /* Hangul Syllable */ + ["\uC6F6", "\uC6F6"], /* Hangul Syllable */ + ["\uC6F7", "\uC6F7"], /* Hangul Syllable */ + ["\uC6F8", "\uC6F8"], /* Hangul Syllable */ + ["\uC6F9", "\uC6F9"], /* Hangul Syllable */ + ["\uC6FA", "\uC6FA"], /* Hangul Syllable */ + ["\uC6FB", "\uC6FB"], /* Hangul Syllable */ + ["\uC6FC", "\uC6FC"], /* Hangul Syllable */ + ["\uC6FD", "\uC6FD"], /* Hangul Syllable */ + ["\uC6FE", "\uC6FE"], /* Hangul Syllable */ + ["\uC6FF", "\uC6FF"], /* Hangul Syllable */ + ["\uC700", "\uC700"], /* Hangul Syllable */ + ["\uC701", "\uC701"], /* Hangul Syllable */ + ["\uC702", "\uC702"], /* Hangul Syllable */ + ["\uC703", "\uC703"], /* Hangul Syllable */ + ["\uC704", "\uC704"], /* Hangul Syllable */ + ["\uC705", "\uC705"], /* Hangul Syllable */ + ["\uC706", "\uC706"], /* Hangul Syllable */ + ["\uC707", "\uC707"], /* Hangul Syllable */ + ["\uC708", "\uC708"], /* Hangul Syllable */ + ["\uC709", "\uC709"], /* Hangul Syllable */ + ["\uC70A", "\uC70A"], /* Hangul Syllable */ + ["\uC70B", "\uC70B"], /* Hangul Syllable */ + ["\uC70C", "\uC70C"], /* Hangul Syllable */ + ["\uC70D", "\uC70D"], /* Hangul Syllable */ + ["\uC70E", "\uC70E"], /* Hangul Syllable */ + ["\uC70F", "\uC70F"], /* Hangul Syllable */ + ["\uC710", "\uC710"], /* Hangul Syllable */ + ["\uC711", "\uC711"], /* Hangul Syllable */ + ["\uC712", "\uC712"], /* Hangul Syllable */ + ["\uC713", "\uC713"], /* Hangul Syllable */ + ["\uC714", "\uC714"], /* Hangul Syllable */ + ["\uC715", "\uC715"], /* Hangul Syllable */ + ["\uC716", "\uC716"], /* Hangul Syllable */ + ["\uC717", "\uC717"], /* Hangul Syllable */ + ["\uC718", "\uC718"], /* Hangul Syllable */ + ["\uC719", "\uC719"], /* Hangul Syllable */ + ["\uC71A", "\uC71A"], /* Hangul Syllable */ + ["\uC71B", "\uC71B"], /* Hangul Syllable */ + ["\uC71C", "\uC71C"], /* Hangul Syllable */ + ["\uC71D", "\uC71D"], /* Hangul Syllable */ + ["\uC71E", "\uC71E"], /* Hangul Syllable */ + ["\uC71F", "\uC71F"], /* Hangul Syllable */ + ["\uC720", "\uC720"], /* Hangul Syllable */ + ["\uC721", "\uC721"], /* Hangul Syllable */ + ["\uC722", "\uC722"], /* Hangul Syllable */ + ["\uC723", "\uC723"], /* Hangul Syllable */ + ["\uC724", "\uC724"], /* Hangul Syllable */ + ["\uC725", "\uC725"], /* Hangul Syllable */ + ["\uC726", "\uC726"], /* Hangul Syllable */ + ["\uC727", "\uC727"], /* Hangul Syllable */ + ["\uC728", "\uC728"], /* Hangul Syllable */ + ["\uC729", "\uC729"], /* Hangul Syllable */ + ["\uC72A", "\uC72A"], /* Hangul Syllable */ + ["\uC72B", "\uC72B"], /* Hangul Syllable */ + ["\uC72C", "\uC72C"], /* Hangul Syllable */ + ["\uC72D", "\uC72D"], /* Hangul Syllable */ + ["\uC72E", "\uC72E"], /* Hangul Syllable */ + ["\uC72F", "\uC72F"], /* Hangul Syllable */ + ["\uC730", "\uC730"], /* Hangul Syllable */ + ["\uC731", "\uC731"], /* Hangul Syllable */ + ["\uC732", "\uC732"], /* Hangul Syllable */ + ["\uC733", "\uC733"], /* Hangul Syllable */ + ["\uC734", "\uC734"], /* Hangul Syllable */ + ["\uC735", "\uC735"], /* Hangul Syllable */ + ["\uC736", "\uC736"], /* Hangul Syllable */ + ["\uC737", "\uC737"], /* Hangul Syllable */ + ["\uC738", "\uC738"], /* Hangul Syllable */ + ["\uC739", "\uC739"], /* Hangul Syllable */ + ["\uC73A", "\uC73A"], /* Hangul Syllable */ + ["\uC73B", "\uC73B"], /* Hangul Syllable */ + ["\uC73C", "\uC73C"], /* Hangul Syllable */ + ["\uC73D", "\uC73D"], /* Hangul Syllable */ + ["\uC73E", "\uC73E"], /* Hangul Syllable */ + ["\uC73F", "\uC73F"], /* Hangul Syllable */ + ["\uC740", "\uC740"], /* Hangul Syllable */ + ["\uC741", "\uC741"], /* Hangul Syllable */ + ["\uC742", "\uC742"], /* Hangul Syllable */ + ["\uC743", "\uC743"], /* Hangul Syllable */ + ["\uC744", "\uC744"], /* Hangul Syllable */ + ["\uC745", "\uC745"], /* Hangul Syllable */ + ["\uC746", "\uC746"], /* Hangul Syllable */ + ["\uC747", "\uC747"], /* Hangul Syllable */ + ["\uC748", "\uC748"], /* Hangul Syllable */ + ["\uC749", "\uC749"], /* Hangul Syllable */ + ["\uC74A", "\uC74A"], /* Hangul Syllable */ + ["\uC74B", "\uC74B"], /* Hangul Syllable */ + ["\uC74C", "\uC74C"], /* Hangul Syllable */ + ["\uC74D", "\uC74D"], /* Hangul Syllable */ + ["\uC74E", "\uC74E"], /* Hangul Syllable */ + ["\uC74F", "\uC74F"], /* Hangul Syllable */ + ["\uC750", "\uC750"], /* Hangul Syllable */ + ["\uC751", "\uC751"], /* Hangul Syllable */ + ["\uC752", "\uC752"], /* Hangul Syllable */ + ["\uC753", "\uC753"], /* Hangul Syllable */ + ["\uC754", "\uC754"], /* Hangul Syllable */ + ["\uC755", "\uC755"], /* Hangul Syllable */ + ["\uC756", "\uC756"], /* Hangul Syllable */ + ["\uC757", "\uC757"], /* Hangul Syllable */ + ["\uC758", "\uC758"], /* Hangul Syllable */ + ["\uC759", "\uC759"], /* Hangul Syllable */ + ["\uC75A", "\uC75A"], /* Hangul Syllable */ + ["\uC75B", "\uC75B"], /* Hangul Syllable */ + ["\uC75C", "\uC75C"], /* Hangul Syllable */ + ["\uC75D", "\uC75D"], /* Hangul Syllable */ + ["\uC75E", "\uC75E"], /* Hangul Syllable */ + ["\uC75F", "\uC75F"], /* Hangul Syllable */ + ["\uC760", "\uC760"], /* Hangul Syllable */ + ["\uC761", "\uC761"], /* Hangul Syllable */ + ["\uC762", "\uC762"], /* Hangul Syllable */ + ["\uC763", "\uC763"], /* Hangul Syllable */ + ["\uC764", "\uC764"], /* Hangul Syllable */ + ["\uC765", "\uC765"], /* Hangul Syllable */ + ["\uC766", "\uC766"], /* Hangul Syllable */ + ["\uC767", "\uC767"], /* Hangul Syllable */ + ["\uC768", "\uC768"], /* Hangul Syllable */ + ["\uC769", "\uC769"], /* Hangul Syllable */ + ["\uC76A", "\uC76A"], /* Hangul Syllable */ + ["\uC76B", "\uC76B"], /* Hangul Syllable */ + ["\uC76C", "\uC76C"], /* Hangul Syllable */ + ["\uC76D", "\uC76D"], /* Hangul Syllable */ + ["\uC76E", "\uC76E"], /* Hangul Syllable */ + ["\uC76F", "\uC76F"], /* Hangul Syllable */ + ["\uC770", "\uC770"], /* Hangul Syllable */ + ["\uC771", "\uC771"], /* Hangul Syllable */ + ["\uC772", "\uC772"], /* Hangul Syllable */ + ["\uC773", "\uC773"], /* Hangul Syllable */ + ["\uC774", "\uC774"], /* Hangul Syllable */ + ["\uC775", "\uC775"], /* Hangul Syllable */ + ["\uC776", "\uC776"], /* Hangul Syllable */ + ["\uC777", "\uC777"], /* Hangul Syllable */ + ["\uC778", "\uC778"], /* Hangul Syllable */ + ["\uC779", "\uC779"], /* Hangul Syllable */ + ["\uC77A", "\uC77A"], /* Hangul Syllable */ + ["\uC77B", "\uC77B"], /* Hangul Syllable */ + ["\uC77C", "\uC77C"], /* Hangul Syllable */ + ["\uC77D", "\uC77D"], /* Hangul Syllable */ + ["\uC77E", "\uC77E"], /* Hangul Syllable */ + ["\uC77F", "\uC77F"], /* Hangul Syllable */ + ["\uC780", "\uC780"], /* Hangul Syllable */ + ["\uC781", "\uC781"], /* Hangul Syllable */ + ["\uC782", "\uC782"], /* Hangul Syllable */ + ["\uC783", "\uC783"], /* Hangul Syllable */ + ["\uC784", "\uC784"], /* Hangul Syllable */ + ["\uC785", "\uC785"], /* Hangul Syllable */ + ["\uC786", "\uC786"], /* Hangul Syllable */ + ["\uC787", "\uC787"], /* Hangul Syllable */ + ["\uC788", "\uC788"], /* Hangul Syllable */ + ["\uC789", "\uC789"], /* Hangul Syllable */ + ["\uC78A", "\uC78A"], /* Hangul Syllable */ + ["\uC78B", "\uC78B"], /* Hangul Syllable */ + ["\uC78C", "\uC78C"], /* Hangul Syllable */ + ["\uC78D", "\uC78D"], /* Hangul Syllable */ + ["\uC78E", "\uC78E"], /* Hangul Syllable */ + ["\uC78F", "\uC78F"], /* Hangul Syllable */ + ["\uC790", "\uC790"], /* Hangul Syllable */ + ["\uC791", "\uC791"], /* Hangul Syllable */ + ["\uC792", "\uC792"], /* Hangul Syllable */ + ["\uC793", "\uC793"], /* Hangul Syllable */ + ["\uC794", "\uC794"], /* Hangul Syllable */ + ["\uC795", "\uC795"], /* Hangul Syllable */ + ["\uC796", "\uC796"], /* Hangul Syllable */ + ["\uC797", "\uC797"], /* Hangul Syllable */ + ["\uC798", "\uC798"], /* Hangul Syllable */ + ["\uC799", "\uC799"], /* Hangul Syllable */ + ["\uC79A", "\uC79A"], /* Hangul Syllable */ + ["\uC79B", "\uC79B"], /* Hangul Syllable */ + ["\uC79C", "\uC79C"], /* Hangul Syllable */ + ["\uC79D", "\uC79D"], /* Hangul Syllable */ + ["\uC79E", "\uC79E"], /* Hangul Syllable */ + ["\uC79F", "\uC79F"], /* Hangul Syllable */ + ["\uC7A0", "\uC7A0"], /* Hangul Syllable */ + ["\uC7A1", "\uC7A1"], /* Hangul Syllable */ + ["\uC7A2", "\uC7A2"], /* Hangul Syllable */ + ["\uC7A3", "\uC7A3"], /* Hangul Syllable */ + ["\uC7A4", "\uC7A4"], /* Hangul Syllable */ + ["\uC7A5", "\uC7A5"], /* Hangul Syllable */ + ["\uC7A6", "\uC7A6"], /* Hangul Syllable */ + ["\uC7A7", "\uC7A7"], /* Hangul Syllable */ + ["\uC7A8", "\uC7A8"], /* Hangul Syllable */ + ["\uC7A9", "\uC7A9"], /* Hangul Syllable */ + ["\uC7AA", "\uC7AA"], /* Hangul Syllable */ + ["\uC7AB", "\uC7AB"], /* Hangul Syllable */ + ["\uC7AC", "\uC7AC"], /* Hangul Syllable */ + ["\uC7AD", "\uC7AD"], /* Hangul Syllable */ + ["\uC7AE", "\uC7AE"], /* Hangul Syllable */ + ["\uC7AF", "\uC7AF"], /* Hangul Syllable */ + ["\uC7B0", "\uC7B0"], /* Hangul Syllable */ + ["\uC7B1", "\uC7B1"], /* Hangul Syllable */ + ["\uC7B2", "\uC7B2"], /* Hangul Syllable */ + ["\uC7B3", "\uC7B3"], /* Hangul Syllable */ + ["\uC7B4", "\uC7B4"], /* Hangul Syllable */ + ["\uC7B5", "\uC7B5"], /* Hangul Syllable */ + ["\uC7B6", "\uC7B6"], /* Hangul Syllable */ + ["\uC7B7", "\uC7B7"], /* Hangul Syllable */ + ["\uC7B8", "\uC7B8"], /* Hangul Syllable */ + ["\uC7B9", "\uC7B9"], /* Hangul Syllable */ + ["\uC7BA", "\uC7BA"], /* Hangul Syllable */ + ["\uC7BB", "\uC7BB"], /* Hangul Syllable */ + ["\uC7BC", "\uC7BC"], /* Hangul Syllable */ + ["\uC7BD", "\uC7BD"], /* Hangul Syllable */ + ["\uC7BE", "\uC7BE"], /* Hangul Syllable */ + ["\uC7BF", "\uC7BF"], /* Hangul Syllable */ + ["\uC7C0", "\uC7C0"], /* Hangul Syllable */ + ["\uC7C1", "\uC7C1"], /* Hangul Syllable */ + ["\uC7C2", "\uC7C2"], /* Hangul Syllable */ + ["\uC7C3", "\uC7C3"], /* Hangul Syllable */ + ["\uC7C4", "\uC7C4"], /* Hangul Syllable */ + ["\uC7C5", "\uC7C5"], /* Hangul Syllable */ + ["\uC7C6", "\uC7C6"], /* Hangul Syllable */ + ["\uC7C7", "\uC7C7"], /* Hangul Syllable */ + ["\uC7C8", "\uC7C8"], /* Hangul Syllable */ + ["\uC7C9", "\uC7C9"], /* Hangul Syllable */ + ["\uC7CA", "\uC7CA"], /* Hangul Syllable */ + ["\uC7CB", "\uC7CB"], /* Hangul Syllable */ + ["\uC7CC", "\uC7CC"], /* Hangul Syllable */ + ["\uC7CD", "\uC7CD"], /* Hangul Syllable */ + ["\uC7CE", "\uC7CE"], /* Hangul Syllable */ + ["\uC7CF", "\uC7CF"], /* Hangul Syllable */ + ["\uC7D0", "\uC7D0"], /* Hangul Syllable */ + ["\uC7D1", "\uC7D1"], /* Hangul Syllable */ + ["\uC7D2", "\uC7D2"], /* Hangul Syllable */ + ["\uC7D3", "\uC7D3"], /* Hangul Syllable */ + ["\uC7D4", "\uC7D4"], /* Hangul Syllable */ + ["\uC7D5", "\uC7D5"], /* Hangul Syllable */ + ["\uC7D6", "\uC7D6"], /* Hangul Syllable */ + ["\uC7D7", "\uC7D7"], /* Hangul Syllable */ + ["\uC7D8", "\uC7D8"], /* Hangul Syllable */ + ["\uC7D9", "\uC7D9"], /* Hangul Syllable */ + ["\uC7DA", "\uC7DA"], /* Hangul Syllable */ + ["\uC7DB", "\uC7DB"], /* Hangul Syllable */ + ["\uC7DC", "\uC7DC"], /* Hangul Syllable */ + ["\uC7DD", "\uC7DD"], /* Hangul Syllable */ + ["\uC7DE", "\uC7DE"], /* Hangul Syllable */ + ["\uC7DF", "\uC7DF"], /* Hangul Syllable */ + ["\uC7E0", "\uC7E0"], /* Hangul Syllable */ + ["\uC7E1", "\uC7E1"], /* Hangul Syllable */ + ["\uC7E2", "\uC7E2"], /* Hangul Syllable */ + ["\uC7E3", "\uC7E3"], /* Hangul Syllable */ + ["\uC7E4", "\uC7E4"], /* Hangul Syllable */ + ["\uC7E5", "\uC7E5"], /* Hangul Syllable */ + ["\uC7E6", "\uC7E6"], /* Hangul Syllable */ + ["\uC7E7", "\uC7E7"], /* Hangul Syllable */ + ["\uC7E8", "\uC7E8"], /* Hangul Syllable */ + ["\uC7E9", "\uC7E9"], /* Hangul Syllable */ + ["\uC7EA", "\uC7EA"], /* Hangul Syllable */ + ["\uC7EB", "\uC7EB"], /* Hangul Syllable */ + ["\uC7EC", "\uC7EC"], /* Hangul Syllable */ + ["\uC7ED", "\uC7ED"], /* Hangul Syllable */ + ["\uC7EE", "\uC7EE"], /* Hangul Syllable */ + ["\uC7EF", "\uC7EF"], /* Hangul Syllable */ + ["\uC7F0", "\uC7F0"], /* Hangul Syllable */ + ["\uC7F1", "\uC7F1"], /* Hangul Syllable */ + ["\uC7F2", "\uC7F2"], /* Hangul Syllable */ + ["\uC7F3", "\uC7F3"], /* Hangul Syllable */ + ["\uC7F4", "\uC7F4"], /* Hangul Syllable */ + ["\uC7F5", "\uC7F5"], /* Hangul Syllable */ + ["\uC7F6", "\uC7F6"], /* Hangul Syllable */ + ["\uC7F7", "\uC7F7"], /* Hangul Syllable */ + ["\uC7F8", "\uC7F8"], /* Hangul Syllable */ + ["\uC7F9", "\uC7F9"], /* Hangul Syllable */ + ["\uC7FA", "\uC7FA"], /* Hangul Syllable */ + ["\uC7FB", "\uC7FB"], /* Hangul Syllable */ + ["\uC7FC", "\uC7FC"], /* Hangul Syllable */ + ["\uC7FD", "\uC7FD"], /* Hangul Syllable */ + ["\uC7FE", "\uC7FE"], /* Hangul Syllable */ + ["\uC7FF", "\uC7FF"], /* Hangul Syllable */ + ["\uC800", "\uC800"], /* Hangul Syllable */ + ["\uC801", "\uC801"], /* Hangul Syllable */ + ["\uC802", "\uC802"], /* Hangul Syllable */ + ["\uC803", "\uC803"], /* Hangul Syllable */ + ["\uC804", "\uC804"], /* Hangul Syllable */ + ["\uC805", "\uC805"], /* Hangul Syllable */ + ["\uC806", "\uC806"], /* Hangul Syllable */ + ["\uC807", "\uC807"], /* Hangul Syllable */ + ["\uC808", "\uC808"], /* Hangul Syllable */ + ["\uC809", "\uC809"], /* Hangul Syllable */ + ["\uC80A", "\uC80A"], /* Hangul Syllable */ + ["\uC80B", "\uC80B"], /* Hangul Syllable */ + ["\uC80C", "\uC80C"], /* Hangul Syllable */ + ["\uC80D", "\uC80D"], /* Hangul Syllable */ + ["\uC80E", "\uC80E"], /* Hangul Syllable */ + ["\uC80F", "\uC80F"], /* Hangul Syllable */ + ["\uC810", "\uC810"], /* Hangul Syllable */ + ["\uC811", "\uC811"], /* Hangul Syllable */ + ["\uC812", "\uC812"], /* Hangul Syllable */ + ["\uC813", "\uC813"], /* Hangul Syllable */ + ["\uC814", "\uC814"], /* Hangul Syllable */ + ["\uC815", "\uC815"], /* Hangul Syllable */ + ["\uC816", "\uC816"], /* Hangul Syllable */ + ["\uC817", "\uC817"], /* Hangul Syllable */ + ["\uC818", "\uC818"], /* Hangul Syllable */ + ["\uC819", "\uC819"], /* Hangul Syllable */ + ["\uC81A", "\uC81A"], /* Hangul Syllable */ + ["\uC81B", "\uC81B"], /* Hangul Syllable */ + ["\uC81C", "\uC81C"], /* Hangul Syllable */ + ["\uC81D", "\uC81D"], /* Hangul Syllable */ + ["\uC81E", "\uC81E"], /* Hangul Syllable */ + ["\uC81F", "\uC81F"], /* Hangul Syllable */ + ["\uC820", "\uC820"], /* Hangul Syllable */ + ["\uC821", "\uC821"], /* Hangul Syllable */ + ["\uC822", "\uC822"], /* Hangul Syllable */ + ["\uC823", "\uC823"], /* Hangul Syllable */ + ["\uC824", "\uC824"], /* Hangul Syllable */ + ["\uC825", "\uC825"], /* Hangul Syllable */ + ["\uC826", "\uC826"], /* Hangul Syllable */ + ["\uC827", "\uC827"], /* Hangul Syllable */ + ["\uC828", "\uC828"], /* Hangul Syllable */ + ["\uC829", "\uC829"], /* Hangul Syllable */ + ["\uC82A", "\uC82A"], /* Hangul Syllable */ + ["\uC82B", "\uC82B"], /* Hangul Syllable */ + ["\uC82C", "\uC82C"], /* Hangul Syllable */ + ["\uC82D", "\uC82D"], /* Hangul Syllable */ + ["\uC82E", "\uC82E"], /* Hangul Syllable */ + ["\uC82F", "\uC82F"], /* Hangul Syllable */ + ["\uC830", "\uC830"], /* Hangul Syllable */ + ["\uC831", "\uC831"], /* Hangul Syllable */ + ["\uC832", "\uC832"], /* Hangul Syllable */ + ["\uC833", "\uC833"], /* Hangul Syllable */ + ["\uC834", "\uC834"], /* Hangul Syllable */ + ["\uC835", "\uC835"], /* Hangul Syllable */ + ["\uC836", "\uC836"], /* Hangul Syllable */ + ["\uC837", "\uC837"], /* Hangul Syllable */ + ["\uC838", "\uC838"], /* Hangul Syllable */ + ["\uC839", "\uC839"], /* Hangul Syllable */ + ["\uC83A", "\uC83A"], /* Hangul Syllable */ + ["\uC83B", "\uC83B"], /* Hangul Syllable */ + ["\uC83C", "\uC83C"], /* Hangul Syllable */ + ["\uC83D", "\uC83D"], /* Hangul Syllable */ + ["\uC83E", "\uC83E"], /* Hangul Syllable */ + ["\uC83F", "\uC83F"], /* Hangul Syllable */ + ["\uC840", "\uC840"], /* Hangul Syllable */ + ["\uC841", "\uC841"], /* Hangul Syllable */ + ["\uC842", "\uC842"], /* Hangul Syllable */ + ["\uC843", "\uC843"], /* Hangul Syllable */ + ["\uC844", "\uC844"], /* Hangul Syllable */ + ["\uC845", "\uC845"], /* Hangul Syllable */ + ["\uC846", "\uC846"], /* Hangul Syllable */ + ["\uC847", "\uC847"], /* Hangul Syllable */ + ["\uC848", "\uC848"], /* Hangul Syllable */ + ["\uC849", "\uC849"], /* Hangul Syllable */ + ["\uC84A", "\uC84A"], /* Hangul Syllable */ + ["\uC84B", "\uC84B"], /* Hangul Syllable */ + ["\uC84C", "\uC84C"], /* Hangul Syllable */ + ["\uC84D", "\uC84D"], /* Hangul Syllable */ + ["\uC84E", "\uC84E"], /* Hangul Syllable */ + ["\uC84F", "\uC84F"], /* Hangul Syllable */ + ["\uC850", "\uC850"], /* Hangul Syllable */ + ["\uC851", "\uC851"], /* Hangul Syllable */ + ["\uC852", "\uC852"], /* Hangul Syllable */ + ["\uC853", "\uC853"], /* Hangul Syllable */ + ["\uC854", "\uC854"], /* Hangul Syllable */ + ["\uC855", "\uC855"], /* Hangul Syllable */ + ["\uC856", "\uC856"], /* Hangul Syllable */ + ["\uC857", "\uC857"], /* Hangul Syllable */ + ["\uC858", "\uC858"], /* Hangul Syllable */ + ["\uC859", "\uC859"], /* Hangul Syllable */ + ["\uC85A", "\uC85A"], /* Hangul Syllable */ + ["\uC85B", "\uC85B"], /* Hangul Syllable */ + ["\uC85C", "\uC85C"], /* Hangul Syllable */ + ["\uC85D", "\uC85D"], /* Hangul Syllable */ + ["\uC85E", "\uC85E"], /* Hangul Syllable */ + ["\uC85F", "\uC85F"], /* Hangul Syllable */ + ["\uC860", "\uC860"], /* Hangul Syllable */ + ["\uC861", "\uC861"], /* Hangul Syllable */ + ["\uC862", "\uC862"], /* Hangul Syllable */ + ["\uC863", "\uC863"], /* Hangul Syllable */ + ["\uC864", "\uC864"], /* Hangul Syllable */ + ["\uC865", "\uC865"], /* Hangul Syllable */ + ["\uC866", "\uC866"], /* Hangul Syllable */ + ["\uC867", "\uC867"], /* Hangul Syllable */ + ["\uC868", "\uC868"], /* Hangul Syllable */ + ["\uC869", "\uC869"], /* Hangul Syllable */ + ["\uC86A", "\uC86A"], /* Hangul Syllable */ + ["\uC86B", "\uC86B"], /* Hangul Syllable */ + ["\uC86C", "\uC86C"], /* Hangul Syllable */ + ["\uC86D", "\uC86D"], /* Hangul Syllable */ + ["\uC86E", "\uC86E"], /* Hangul Syllable */ + ["\uC86F", "\uC86F"], /* Hangul Syllable */ + ["\uC870", "\uC870"], /* Hangul Syllable */ + ["\uC871", "\uC871"], /* Hangul Syllable */ + ["\uC872", "\uC872"], /* Hangul Syllable */ + ["\uC873", "\uC873"], /* Hangul Syllable */ + ["\uC874", "\uC874"], /* Hangul Syllable */ + ["\uC875", "\uC875"], /* Hangul Syllable */ + ["\uC876", "\uC876"], /* Hangul Syllable */ + ["\uC877", "\uC877"], /* Hangul Syllable */ + ["\uC878", "\uC878"], /* Hangul Syllable */ + ["\uC879", "\uC879"], /* Hangul Syllable */ + ["\uC87A", "\uC87A"], /* Hangul Syllable */ + ["\uC87B", "\uC87B"], /* Hangul Syllable */ + ["\uC87C", "\uC87C"], /* Hangul Syllable */ + ["\uC87D", "\uC87D"], /* Hangul Syllable */ + ["\uC87E", "\uC87E"], /* Hangul Syllable */ + ["\uC87F", "\uC87F"], /* Hangul Syllable */ + ["\uC880", "\uC880"], /* Hangul Syllable */ + ["\uC881", "\uC881"], /* Hangul Syllable */ + ["\uC882", "\uC882"], /* Hangul Syllable */ + ["\uC883", "\uC883"], /* Hangul Syllable */ + ["\uC884", "\uC884"], /* Hangul Syllable */ + ["\uC885", "\uC885"], /* Hangul Syllable */ + ["\uC886", "\uC886"], /* Hangul Syllable */ + ["\uC887", "\uC887"], /* Hangul Syllable */ + ["\uC888", "\uC888"], /* Hangul Syllable */ + ["\uC889", "\uC889"], /* Hangul Syllable */ + ["\uC88A", "\uC88A"], /* Hangul Syllable */ + ["\uC88B", "\uC88B"], /* Hangul Syllable */ + ["\uC88C", "\uC88C"], /* Hangul Syllable */ + ["\uC88D", "\uC88D"], /* Hangul Syllable */ + ["\uC88E", "\uC88E"], /* Hangul Syllable */ + ["\uC88F", "\uC88F"], /* Hangul Syllable */ + ["\uC890", "\uC890"], /* Hangul Syllable */ + ["\uC891", "\uC891"], /* Hangul Syllable */ + ["\uC892", "\uC892"], /* Hangul Syllable */ + ["\uC893", "\uC893"], /* Hangul Syllable */ + ["\uC894", "\uC894"], /* Hangul Syllable */ + ["\uC895", "\uC895"], /* Hangul Syllable */ + ["\uC896", "\uC896"], /* Hangul Syllable */ + ["\uC897", "\uC897"], /* Hangul Syllable */ + ["\uC898", "\uC898"], /* Hangul Syllable */ + ["\uC899", "\uC899"], /* Hangul Syllable */ + ["\uC89A", "\uC89A"], /* Hangul Syllable */ + ["\uC89B", "\uC89B"], /* Hangul Syllable */ + ["\uC89C", "\uC89C"], /* Hangul Syllable */ + ["\uC89D", "\uC89D"], /* Hangul Syllable */ + ["\uC89E", "\uC89E"], /* Hangul Syllable */ + ["\uC89F", "\uC89F"], /* Hangul Syllable */ + ["\uC8A0", "\uC8A0"], /* Hangul Syllable */ + ["\uC8A1", "\uC8A1"], /* Hangul Syllable */ + ["\uC8A2", "\uC8A2"], /* Hangul Syllable */ + ["\uC8A3", "\uC8A3"], /* Hangul Syllable */ + ["\uC8A4", "\uC8A4"], /* Hangul Syllable */ + ["\uC8A5", "\uC8A5"], /* Hangul Syllable */ + ["\uC8A6", "\uC8A6"], /* Hangul Syllable */ + ["\uC8A7", "\uC8A7"], /* Hangul Syllable */ + ["\uC8A8", "\uC8A8"], /* Hangul Syllable */ + ["\uC8A9", "\uC8A9"], /* Hangul Syllable */ + ["\uC8AA", "\uC8AA"], /* Hangul Syllable */ + ["\uC8AB", "\uC8AB"], /* Hangul Syllable */ + ["\uC8AC", "\uC8AC"], /* Hangul Syllable */ + ["\uC8AD", "\uC8AD"], /* Hangul Syllable */ + ["\uC8AE", "\uC8AE"], /* Hangul Syllable */ + ["\uC8AF", "\uC8AF"], /* Hangul Syllable */ + ["\uC8B0", "\uC8B0"], /* Hangul Syllable */ + ["\uC8B1", "\uC8B1"], /* Hangul Syllable */ + ["\uC8B2", "\uC8B2"], /* Hangul Syllable */ + ["\uC8B3", "\uC8B3"], /* Hangul Syllable */ + ["\uC8B4", "\uC8B4"], /* Hangul Syllable */ + ["\uC8B5", "\uC8B5"], /* Hangul Syllable */ + ["\uC8B6", "\uC8B6"], /* Hangul Syllable */ + ["\uC8B7", "\uC8B7"], /* Hangul Syllable */ + ["\uC8B8", "\uC8B8"], /* Hangul Syllable */ + ["\uC8B9", "\uC8B9"], /* Hangul Syllable */ + ["\uC8BA", "\uC8BA"], /* Hangul Syllable */ + ["\uC8BB", "\uC8BB"], /* Hangul Syllable */ + ["\uC8BC", "\uC8BC"], /* Hangul Syllable */ + ["\uC8BD", "\uC8BD"], /* Hangul Syllable */ + ["\uC8BE", "\uC8BE"], /* Hangul Syllable */ + ["\uC8BF", "\uC8BF"], /* Hangul Syllable */ + ["\uC8C0", "\uC8C0"], /* Hangul Syllable */ + ["\uC8C1", "\uC8C1"], /* Hangul Syllable */ + ["\uC8C2", "\uC8C2"], /* Hangul Syllable */ + ["\uC8C3", "\uC8C3"], /* Hangul Syllable */ + ["\uC8C4", "\uC8C4"], /* Hangul Syllable */ + ["\uC8C5", "\uC8C5"], /* Hangul Syllable */ + ["\uC8C6", "\uC8C6"], /* Hangul Syllable */ + ["\uC8C7", "\uC8C7"], /* Hangul Syllable */ + ["\uC8C8", "\uC8C8"], /* Hangul Syllable */ + ["\uC8C9", "\uC8C9"], /* Hangul Syllable */ + ["\uC8CA", "\uC8CA"], /* Hangul Syllable */ + ["\uC8CB", "\uC8CB"], /* Hangul Syllable */ + ["\uC8CC", "\uC8CC"], /* Hangul Syllable */ + ["\uC8CD", "\uC8CD"], /* Hangul Syllable */ + ["\uC8CE", "\uC8CE"], /* Hangul Syllable */ + ["\uC8CF", "\uC8CF"], /* Hangul Syllable */ + ["\uC8D0", "\uC8D0"], /* Hangul Syllable */ + ["\uC8D1", "\uC8D1"], /* Hangul Syllable */ + ["\uC8D2", "\uC8D2"], /* Hangul Syllable */ + ["\uC8D3", "\uC8D3"], /* Hangul Syllable */ + ["\uC8D4", "\uC8D4"], /* Hangul Syllable */ + ["\uC8D5", "\uC8D5"], /* Hangul Syllable */ + ["\uC8D6", "\uC8D6"], /* Hangul Syllable */ + ["\uC8D7", "\uC8D7"], /* Hangul Syllable */ + ["\uC8D8", "\uC8D8"], /* Hangul Syllable */ + ["\uC8D9", "\uC8D9"], /* Hangul Syllable */ + ["\uC8DA", "\uC8DA"], /* Hangul Syllable */ + ["\uC8DB", "\uC8DB"], /* Hangul Syllable */ + ["\uC8DC", "\uC8DC"], /* Hangul Syllable */ + ["\uC8DD", "\uC8DD"], /* Hangul Syllable */ + ["\uC8DE", "\uC8DE"], /* Hangul Syllable */ + ["\uC8DF", "\uC8DF"], /* Hangul Syllable */ + ["\uC8E0", "\uC8E0"], /* Hangul Syllable */ + ["\uC8E1", "\uC8E1"], /* Hangul Syllable */ + ["\uC8E2", "\uC8E2"], /* Hangul Syllable */ + ["\uC8E3", "\uC8E3"], /* Hangul Syllable */ + ["\uC8E4", "\uC8E4"], /* Hangul Syllable */ + ["\uC8E5", "\uC8E5"], /* Hangul Syllable */ + ["\uC8E6", "\uC8E6"], /* Hangul Syllable */ + ["\uC8E7", "\uC8E7"], /* Hangul Syllable */ + ["\uC8E8", "\uC8E8"], /* Hangul Syllable */ + ["\uC8E9", "\uC8E9"], /* Hangul Syllable */ + ["\uC8EA", "\uC8EA"], /* Hangul Syllable */ + ["\uC8EB", "\uC8EB"], /* Hangul Syllable */ + ["\uC8EC", "\uC8EC"], /* Hangul Syllable */ + ["\uC8ED", "\uC8ED"], /* Hangul Syllable */ + ["\uC8EE", "\uC8EE"], /* Hangul Syllable */ + ["\uC8EF", "\uC8EF"], /* Hangul Syllable */ + ["\uC8F0", "\uC8F0"], /* Hangul Syllable */ + ["\uC8F1", "\uC8F1"], /* Hangul Syllable */ + ["\uC8F2", "\uC8F2"], /* Hangul Syllable */ + ["\uC8F3", "\uC8F3"], /* Hangul Syllable */ + ["\uC8F4", "\uC8F4"], /* Hangul Syllable */ + ["\uC8F5", "\uC8F5"], /* Hangul Syllable */ + ["\uC8F6", "\uC8F6"], /* Hangul Syllable */ + ["\uC8F7", "\uC8F7"], /* Hangul Syllable */ + ["\uC8F8", "\uC8F8"], /* Hangul Syllable */ + ["\uC8F9", "\uC8F9"], /* Hangul Syllable */ + ["\uC8FA", "\uC8FA"], /* Hangul Syllable */ + ["\uC8FB", "\uC8FB"], /* Hangul Syllable */ + ["\uC8FC", "\uC8FC"], /* Hangul Syllable */ + ["\uC8FD", "\uC8FD"], /* Hangul Syllable */ + ["\uC8FE", "\uC8FE"], /* Hangul Syllable */ + ["\uC8FF", "\uC8FF"], /* Hangul Syllable */ + ["\uC900", "\uC900"], /* Hangul Syllable */ + ["\uC901", "\uC901"], /* Hangul Syllable */ + ["\uC902", "\uC902"], /* Hangul Syllable */ + ["\uC903", "\uC903"], /* Hangul Syllable */ + ["\uC904", "\uC904"], /* Hangul Syllable */ + ["\uC905", "\uC905"], /* Hangul Syllable */ + ["\uC906", "\uC906"], /* Hangul Syllable */ + ["\uC907", "\uC907"], /* Hangul Syllable */ + ["\uC908", "\uC908"], /* Hangul Syllable */ + ["\uC909", "\uC909"], /* Hangul Syllable */ + ["\uC90A", "\uC90A"], /* Hangul Syllable */ + ["\uC90B", "\uC90B"], /* Hangul Syllable */ + ["\uC90C", "\uC90C"], /* Hangul Syllable */ + ["\uC90D", "\uC90D"], /* Hangul Syllable */ + ["\uC90E", "\uC90E"], /* Hangul Syllable */ + ["\uC90F", "\uC90F"], /* Hangul Syllable */ + ["\uC910", "\uC910"], /* Hangul Syllable */ + ["\uC911", "\uC911"], /* Hangul Syllable */ + ["\uC912", "\uC912"], /* Hangul Syllable */ + ["\uC913", "\uC913"], /* Hangul Syllable */ + ["\uC914", "\uC914"], /* Hangul Syllable */ + ["\uC915", "\uC915"], /* Hangul Syllable */ + ["\uC916", "\uC916"], /* Hangul Syllable */ + ["\uC917", "\uC917"], /* Hangul Syllable */ + ["\uC918", "\uC918"], /* Hangul Syllable */ + ["\uC919", "\uC919"], /* Hangul Syllable */ + ["\uC91A", "\uC91A"], /* Hangul Syllable */ + ["\uC91B", "\uC91B"], /* Hangul Syllable */ + ["\uC91C", "\uC91C"], /* Hangul Syllable */ + ["\uC91D", "\uC91D"], /* Hangul Syllable */ + ["\uC91E", "\uC91E"], /* Hangul Syllable */ + ["\uC91F", "\uC91F"], /* Hangul Syllable */ + ["\uC920", "\uC920"], /* Hangul Syllable */ + ["\uC921", "\uC921"], /* Hangul Syllable */ + ["\uC922", "\uC922"], /* Hangul Syllable */ + ["\uC923", "\uC923"], /* Hangul Syllable */ + ["\uC924", "\uC924"], /* Hangul Syllable */ + ["\uC925", "\uC925"], /* Hangul Syllable */ + ["\uC926", "\uC926"], /* Hangul Syllable */ + ["\uC927", "\uC927"], /* Hangul Syllable */ + ["\uC928", "\uC928"], /* Hangul Syllable */ + ["\uC929", "\uC929"], /* Hangul Syllable */ + ["\uC92A", "\uC92A"], /* Hangul Syllable */ + ["\uC92B", "\uC92B"], /* Hangul Syllable */ + ["\uC92C", "\uC92C"], /* Hangul Syllable */ + ["\uC92D", "\uC92D"], /* Hangul Syllable */ + ["\uC92E", "\uC92E"], /* Hangul Syllable */ + ["\uC92F", "\uC92F"], /* Hangul Syllable */ + ["\uC930", "\uC930"], /* Hangul Syllable */ + ["\uC931", "\uC931"], /* Hangul Syllable */ + ["\uC932", "\uC932"], /* Hangul Syllable */ + ["\uC933", "\uC933"], /* Hangul Syllable */ + ["\uC934", "\uC934"], /* Hangul Syllable */ + ["\uC935", "\uC935"], /* Hangul Syllable */ + ["\uC936", "\uC936"], /* Hangul Syllable */ + ["\uC937", "\uC937"], /* Hangul Syllable */ + ["\uC938", "\uC938"], /* Hangul Syllable */ + ["\uC939", "\uC939"], /* Hangul Syllable */ + ["\uC93A", "\uC93A"], /* Hangul Syllable */ + ["\uC93B", "\uC93B"], /* Hangul Syllable */ + ["\uC93C", "\uC93C"], /* Hangul Syllable */ + ["\uC93D", "\uC93D"], /* Hangul Syllable */ + ["\uC93E", "\uC93E"], /* Hangul Syllable */ + ["\uC93F", "\uC93F"], /* Hangul Syllable */ + ["\uC940", "\uC940"], /* Hangul Syllable */ + ["\uC941", "\uC941"], /* Hangul Syllable */ + ["\uC942", "\uC942"], /* Hangul Syllable */ + ["\uC943", "\uC943"], /* Hangul Syllable */ + ["\uC944", "\uC944"], /* Hangul Syllable */ + ["\uC945", "\uC945"], /* Hangul Syllable */ + ["\uC946", "\uC946"], /* Hangul Syllable */ + ["\uC947", "\uC947"], /* Hangul Syllable */ + ["\uC948", "\uC948"], /* Hangul Syllable */ + ["\uC949", "\uC949"], /* Hangul Syllable */ + ["\uC94A", "\uC94A"], /* Hangul Syllable */ + ["\uC94B", "\uC94B"], /* Hangul Syllable */ + ["\uC94C", "\uC94C"], /* Hangul Syllable */ + ["\uC94D", "\uC94D"], /* Hangul Syllable */ + ["\uC94E", "\uC94E"], /* Hangul Syllable */ + ["\uC94F", "\uC94F"], /* Hangul Syllable */ + ["\uC950", "\uC950"], /* Hangul Syllable */ + ["\uC951", "\uC951"], /* Hangul Syllable */ + ["\uC952", "\uC952"], /* Hangul Syllable */ + ["\uC953", "\uC953"], /* Hangul Syllable */ + ["\uC954", "\uC954"], /* Hangul Syllable */ + ["\uC955", "\uC955"], /* Hangul Syllable */ + ["\uC956", "\uC956"], /* Hangul Syllable */ + ["\uC957", "\uC957"], /* Hangul Syllable */ + ["\uC958", "\uC958"], /* Hangul Syllable */ + ["\uC959", "\uC959"], /* Hangul Syllable */ + ["\uC95A", "\uC95A"], /* Hangul Syllable */ + ["\uC95B", "\uC95B"], /* Hangul Syllable */ + ["\uC95C", "\uC95C"], /* Hangul Syllable */ + ["\uC95D", "\uC95D"], /* Hangul Syllable */ + ["\uC95E", "\uC95E"], /* Hangul Syllable */ + ["\uC95F", "\uC95F"], /* Hangul Syllable */ + ["\uC960", "\uC960"], /* Hangul Syllable */ + ["\uC961", "\uC961"], /* Hangul Syllable */ + ["\uC962", "\uC962"], /* Hangul Syllable */ + ["\uC963", "\uC963"], /* Hangul Syllable */ + ["\uC964", "\uC964"], /* Hangul Syllable */ + ["\uC965", "\uC965"], /* Hangul Syllable */ + ["\uC966", "\uC966"], /* Hangul Syllable */ + ["\uC967", "\uC967"], /* Hangul Syllable */ + ["\uC968", "\uC968"], /* Hangul Syllable */ + ["\uC969", "\uC969"], /* Hangul Syllable */ + ["\uC96A", "\uC96A"], /* Hangul Syllable */ + ["\uC96B", "\uC96B"], /* Hangul Syllable */ + ["\uC96C", "\uC96C"], /* Hangul Syllable */ + ["\uC96D", "\uC96D"], /* Hangul Syllable */ + ["\uC96E", "\uC96E"], /* Hangul Syllable */ + ["\uC96F", "\uC96F"], /* Hangul Syllable */ + ["\uC970", "\uC970"], /* Hangul Syllable */ + ["\uC971", "\uC971"], /* Hangul Syllable */ + ["\uC972", "\uC972"], /* Hangul Syllable */ + ["\uC973", "\uC973"], /* Hangul Syllable */ + ["\uC974", "\uC974"], /* Hangul Syllable */ + ["\uC975", "\uC975"], /* Hangul Syllable */ + ["\uC976", "\uC976"], /* Hangul Syllable */ + ["\uC977", "\uC977"], /* Hangul Syllable */ + ["\uC978", "\uC978"], /* Hangul Syllable */ + ["\uC979", "\uC979"], /* Hangul Syllable */ + ["\uC97A", "\uC97A"], /* Hangul Syllable */ + ["\uC97B", "\uC97B"], /* Hangul Syllable */ + ["\uC97C", "\uC97C"], /* Hangul Syllable */ + ["\uC97D", "\uC97D"], /* Hangul Syllable */ + ["\uC97E", "\uC97E"], /* Hangul Syllable */ + ["\uC97F", "\uC97F"], /* Hangul Syllable */ + ["\uC980", "\uC980"], /* Hangul Syllable */ + ["\uC981", "\uC981"], /* Hangul Syllable */ + ["\uC982", "\uC982"], /* Hangul Syllable */ + ["\uC983", "\uC983"], /* Hangul Syllable */ + ["\uC984", "\uC984"], /* Hangul Syllable */ + ["\uC985", "\uC985"], /* Hangul Syllable */ + ["\uC986", "\uC986"], /* Hangul Syllable */ + ["\uC987", "\uC987"], /* Hangul Syllable */ + ["\uC988", "\uC988"], /* Hangul Syllable */ + ["\uC989", "\uC989"], /* Hangul Syllable */ + ["\uC98A", "\uC98A"], /* Hangul Syllable */ + ["\uC98B", "\uC98B"], /* Hangul Syllable */ + ["\uC98C", "\uC98C"], /* Hangul Syllable */ + ["\uC98D", "\uC98D"], /* Hangul Syllable */ + ["\uC98E", "\uC98E"], /* Hangul Syllable */ + ["\uC98F", "\uC98F"], /* Hangul Syllable */ + ["\uC990", "\uC990"], /* Hangul Syllable */ + ["\uC991", "\uC991"], /* Hangul Syllable */ + ["\uC992", "\uC992"], /* Hangul Syllable */ + ["\uC993", "\uC993"], /* Hangul Syllable */ + ["\uC994", "\uC994"], /* Hangul Syllable */ + ["\uC995", "\uC995"], /* Hangul Syllable */ + ["\uC996", "\uC996"], /* Hangul Syllable */ + ["\uC997", "\uC997"], /* Hangul Syllable */ + ["\uC998", "\uC998"], /* Hangul Syllable */ + ["\uC999", "\uC999"], /* Hangul Syllable */ + ["\uC99A", "\uC99A"], /* Hangul Syllable */ + ["\uC99B", "\uC99B"], /* Hangul Syllable */ + ["\uC99C", "\uC99C"], /* Hangul Syllable */ + ["\uC99D", "\uC99D"], /* Hangul Syllable */ + ["\uC99E", "\uC99E"], /* Hangul Syllable */ + ["\uC99F", "\uC99F"], /* Hangul Syllable */ + ["\uC9A0", "\uC9A0"], /* Hangul Syllable */ + ["\uC9A1", "\uC9A1"], /* Hangul Syllable */ + ["\uC9A2", "\uC9A2"], /* Hangul Syllable */ + ["\uC9A3", "\uC9A3"], /* Hangul Syllable */ + ["\uC9A4", "\uC9A4"], /* Hangul Syllable */ + ["\uC9A5", "\uC9A5"], /* Hangul Syllable */ + ["\uC9A6", "\uC9A6"], /* Hangul Syllable */ + ["\uC9A7", "\uC9A7"], /* Hangul Syllable */ + ["\uC9A8", "\uC9A8"], /* Hangul Syllable */ + ["\uC9A9", "\uC9A9"], /* Hangul Syllable */ + ["\uC9AA", "\uC9AA"], /* Hangul Syllable */ + ["\uC9AB", "\uC9AB"], /* Hangul Syllable */ + ["\uC9AC", "\uC9AC"], /* Hangul Syllable */ + ["\uC9AD", "\uC9AD"], /* Hangul Syllable */ + ["\uC9AE", "\uC9AE"], /* Hangul Syllable */ + ["\uC9AF", "\uC9AF"], /* Hangul Syllable */ + ["\uC9B0", "\uC9B0"], /* Hangul Syllable */ + ["\uC9B1", "\uC9B1"], /* Hangul Syllable */ + ["\uC9B2", "\uC9B2"], /* Hangul Syllable */ + ["\uC9B3", "\uC9B3"], /* Hangul Syllable */ + ["\uC9B4", "\uC9B4"], /* Hangul Syllable */ + ["\uC9B5", "\uC9B5"], /* Hangul Syllable */ + ["\uC9B6", "\uC9B6"], /* Hangul Syllable */ + ["\uC9B7", "\uC9B7"], /* Hangul Syllable */ + ["\uC9B8", "\uC9B8"], /* Hangul Syllable */ + ["\uC9B9", "\uC9B9"], /* Hangul Syllable */ + ["\uC9BA", "\uC9BA"], /* Hangul Syllable */ + ["\uC9BB", "\uC9BB"], /* Hangul Syllable */ + ["\uC9BC", "\uC9BC"], /* Hangul Syllable */ + ["\uC9BD", "\uC9BD"], /* Hangul Syllable */ + ["\uC9BE", "\uC9BE"], /* Hangul Syllable */ + ["\uC9BF", "\uC9BF"], /* Hangul Syllable */ + ["\uC9C0", "\uC9C0"], /* Hangul Syllable */ + ["\uC9C1", "\uC9C1"], /* Hangul Syllable */ + ["\uC9C2", "\uC9C2"], /* Hangul Syllable */ + ["\uC9C3", "\uC9C3"], /* Hangul Syllable */ + ["\uC9C4", "\uC9C4"], /* Hangul Syllable */ + ["\uC9C5", "\uC9C5"], /* Hangul Syllable */ + ["\uC9C6", "\uC9C6"], /* Hangul Syllable */ + ["\uC9C7", "\uC9C7"], /* Hangul Syllable */ + ["\uC9C8", "\uC9C8"], /* Hangul Syllable */ + ["\uC9C9", "\uC9C9"], /* Hangul Syllable */ + ["\uC9CA", "\uC9CA"], /* Hangul Syllable */ + ["\uC9CB", "\uC9CB"], /* Hangul Syllable */ + ["\uC9CC", "\uC9CC"], /* Hangul Syllable */ + ["\uC9CD", "\uC9CD"], /* Hangul Syllable */ + ["\uC9CE", "\uC9CE"], /* Hangul Syllable */ + ["\uC9CF", "\uC9CF"], /* Hangul Syllable */ + ["\uC9D0", "\uC9D0"], /* Hangul Syllable */ + ["\uC9D1", "\uC9D1"], /* Hangul Syllable */ + ["\uC9D2", "\uC9D2"], /* Hangul Syllable */ + ["\uC9D3", "\uC9D3"], /* Hangul Syllable */ + ["\uC9D4", "\uC9D4"], /* Hangul Syllable */ + ["\uC9D5", "\uC9D5"], /* Hangul Syllable */ + ["\uC9D6", "\uC9D6"], /* Hangul Syllable */ + ["\uC9D7", "\uC9D7"], /* Hangul Syllable */ + ["\uC9D8", "\uC9D8"], /* Hangul Syllable */ + ["\uC9D9", "\uC9D9"], /* Hangul Syllable */ + ["\uC9DA", "\uC9DA"], /* Hangul Syllable */ + ["\uC9DB", "\uC9DB"], /* Hangul Syllable */ + ["\uC9DC", "\uC9DC"], /* Hangul Syllable */ + ["\uC9DD", "\uC9DD"], /* Hangul Syllable */ + ["\uC9DE", "\uC9DE"], /* Hangul Syllable */ + ["\uC9DF", "\uC9DF"], /* Hangul Syllable */ + ["\uC9E0", "\uC9E0"], /* Hangul Syllable */ + ["\uC9E1", "\uC9E1"], /* Hangul Syllable */ + ["\uC9E2", "\uC9E2"], /* Hangul Syllable */ + ["\uC9E3", "\uC9E3"], /* Hangul Syllable */ + ["\uC9E4", "\uC9E4"], /* Hangul Syllable */ + ["\uC9E5", "\uC9E5"], /* Hangul Syllable */ + ["\uC9E6", "\uC9E6"], /* Hangul Syllable */ + ["\uC9E7", "\uC9E7"], /* Hangul Syllable */ + ["\uC9E8", "\uC9E8"], /* Hangul Syllable */ + ["\uC9E9", "\uC9E9"], /* Hangul Syllable */ + ["\uC9EA", "\uC9EA"], /* Hangul Syllable */ + ["\uC9EB", "\uC9EB"], /* Hangul Syllable */ + ["\uC9EC", "\uC9EC"], /* Hangul Syllable */ + ["\uC9ED", "\uC9ED"], /* Hangul Syllable */ + ["\uC9EE", "\uC9EE"], /* Hangul Syllable */ + ["\uC9EF", "\uC9EF"], /* Hangul Syllable */ + ["\uC9F0", "\uC9F0"], /* Hangul Syllable */ + ["\uC9F1", "\uC9F1"], /* Hangul Syllable */ + ["\uC9F2", "\uC9F2"], /* Hangul Syllable */ + ["\uC9F3", "\uC9F3"], /* Hangul Syllable */ + ["\uC9F4", "\uC9F4"], /* Hangul Syllable */ + ["\uC9F5", "\uC9F5"], /* Hangul Syllable */ + ["\uC9F6", "\uC9F6"], /* Hangul Syllable */ + ["\uC9F7", "\uC9F7"], /* Hangul Syllable */ + ["\uC9F8", "\uC9F8"], /* Hangul Syllable */ + ["\uC9F9", "\uC9F9"], /* Hangul Syllable */ + ["\uC9FA", "\uC9FA"], /* Hangul Syllable */ + ["\uC9FB", "\uC9FB"], /* Hangul Syllable */ + ["\uC9FC", "\uC9FC"], /* Hangul Syllable */ + ["\uC9FD", "\uC9FD"], /* Hangul Syllable */ + ["\uC9FE", "\uC9FE"], /* Hangul Syllable */ + ["\uC9FF", "\uC9FF"], /* Hangul Syllable */ + ["\uCA00", "\uCA00"], /* Hangul Syllable */ + ["\uCA01", "\uCA01"], /* Hangul Syllable */ + ["\uCA02", "\uCA02"], /* Hangul Syllable */ + ["\uCA03", "\uCA03"], /* Hangul Syllable */ + ["\uCA04", "\uCA04"], /* Hangul Syllable */ + ["\uCA05", "\uCA05"], /* Hangul Syllable */ + ["\uCA06", "\uCA06"], /* Hangul Syllable */ + ["\uCA07", "\uCA07"], /* Hangul Syllable */ + ["\uCA08", "\uCA08"], /* Hangul Syllable */ + ["\uCA09", "\uCA09"], /* Hangul Syllable */ + ["\uCA0A", "\uCA0A"], /* Hangul Syllable */ + ["\uCA0B", "\uCA0B"], /* Hangul Syllable */ + ["\uCA0C", "\uCA0C"], /* Hangul Syllable */ + ["\uCA0D", "\uCA0D"], /* Hangul Syllable */ + ["\uCA0E", "\uCA0E"], /* Hangul Syllable */ + ["\uCA0F", "\uCA0F"], /* Hangul Syllable */ + ["\uCA10", "\uCA10"], /* Hangul Syllable */ + ["\uCA11", "\uCA11"], /* Hangul Syllable */ + ["\uCA12", "\uCA12"], /* Hangul Syllable */ + ["\uCA13", "\uCA13"], /* Hangul Syllable */ + ["\uCA14", "\uCA14"], /* Hangul Syllable */ + ["\uCA15", "\uCA15"], /* Hangul Syllable */ + ["\uCA16", "\uCA16"], /* Hangul Syllable */ + ["\uCA17", "\uCA17"], /* Hangul Syllable */ + ["\uCA18", "\uCA18"], /* Hangul Syllable */ + ["\uCA19", "\uCA19"], /* Hangul Syllable */ + ["\uCA1A", "\uCA1A"], /* Hangul Syllable */ + ["\uCA1B", "\uCA1B"], /* Hangul Syllable */ + ["\uCA1C", "\uCA1C"], /* Hangul Syllable */ + ["\uCA1D", "\uCA1D"], /* Hangul Syllable */ + ["\uCA1E", "\uCA1E"], /* Hangul Syllable */ + ["\uCA1F", "\uCA1F"], /* Hangul Syllable */ + ["\uCA20", "\uCA20"], /* Hangul Syllable */ + ["\uCA21", "\uCA21"], /* Hangul Syllable */ + ["\uCA22", "\uCA22"], /* Hangul Syllable */ + ["\uCA23", "\uCA23"], /* Hangul Syllable */ + ["\uCA24", "\uCA24"], /* Hangul Syllable */ + ["\uCA25", "\uCA25"], /* Hangul Syllable */ + ["\uCA26", "\uCA26"], /* Hangul Syllable */ + ["\uCA27", "\uCA27"], /* Hangul Syllable */ + ["\uCA28", "\uCA28"], /* Hangul Syllable */ + ["\uCA29", "\uCA29"], /* Hangul Syllable */ + ["\uCA2A", "\uCA2A"], /* Hangul Syllable */ + ["\uCA2B", "\uCA2B"], /* Hangul Syllable */ + ["\uCA2C", "\uCA2C"], /* Hangul Syllable */ + ["\uCA2D", "\uCA2D"], /* Hangul Syllable */ + ["\uCA2E", "\uCA2E"], /* Hangul Syllable */ + ["\uCA2F", "\uCA2F"], /* Hangul Syllable */ + ["\uCA30", "\uCA30"], /* Hangul Syllable */ + ["\uCA31", "\uCA31"], /* Hangul Syllable */ + ["\uCA32", "\uCA32"], /* Hangul Syllable */ + ["\uCA33", "\uCA33"], /* Hangul Syllable */ + ["\uCA34", "\uCA34"], /* Hangul Syllable */ + ["\uCA35", "\uCA35"], /* Hangul Syllable */ + ["\uCA36", "\uCA36"], /* Hangul Syllable */ + ["\uCA37", "\uCA37"], /* Hangul Syllable */ + ["\uCA38", "\uCA38"], /* Hangul Syllable */ + ["\uCA39", "\uCA39"], /* Hangul Syllable */ + ["\uCA3A", "\uCA3A"], /* Hangul Syllable */ + ["\uCA3B", "\uCA3B"], /* Hangul Syllable */ + ["\uCA3C", "\uCA3C"], /* Hangul Syllable */ + ["\uCA3D", "\uCA3D"], /* Hangul Syllable */ + ["\uCA3E", "\uCA3E"], /* Hangul Syllable */ + ["\uCA3F", "\uCA3F"], /* Hangul Syllable */ + ["\uCA40", "\uCA40"], /* Hangul Syllable */ + ["\uCA41", "\uCA41"], /* Hangul Syllable */ + ["\uCA42", "\uCA42"], /* Hangul Syllable */ + ["\uCA43", "\uCA43"], /* Hangul Syllable */ + ["\uCA44", "\uCA44"], /* Hangul Syllable */ + ["\uCA45", "\uCA45"], /* Hangul Syllable */ + ["\uCA46", "\uCA46"], /* Hangul Syllable */ + ["\uCA47", "\uCA47"], /* Hangul Syllable */ + ["\uCA48", "\uCA48"], /* Hangul Syllable */ + ["\uCA49", "\uCA49"], /* Hangul Syllable */ + ["\uCA4A", "\uCA4A"], /* Hangul Syllable */ + ["\uCA4B", "\uCA4B"], /* Hangul Syllable */ + ["\uCA4C", "\uCA4C"], /* Hangul Syllable */ + ["\uCA4D", "\uCA4D"], /* Hangul Syllable */ + ["\uCA4E", "\uCA4E"], /* Hangul Syllable */ + ["\uCA4F", "\uCA4F"], /* Hangul Syllable */ + ["\uCA50", "\uCA50"], /* Hangul Syllable */ + ["\uCA51", "\uCA51"], /* Hangul Syllable */ + ["\uCA52", "\uCA52"], /* Hangul Syllable */ + ["\uCA53", "\uCA53"], /* Hangul Syllable */ + ["\uCA54", "\uCA54"], /* Hangul Syllable */ + ["\uCA55", "\uCA55"], /* Hangul Syllable */ + ["\uCA56", "\uCA56"], /* Hangul Syllable */ + ["\uCA57", "\uCA57"], /* Hangul Syllable */ + ["\uCA58", "\uCA58"], /* Hangul Syllable */ + ["\uCA59", "\uCA59"], /* Hangul Syllable */ + ["\uCA5A", "\uCA5A"], /* Hangul Syllable */ + ["\uCA5B", "\uCA5B"], /* Hangul Syllable */ + ["\uCA5C", "\uCA5C"], /* Hangul Syllable */ + ["\uCA5D", "\uCA5D"], /* Hangul Syllable */ + ["\uCA5E", "\uCA5E"], /* Hangul Syllable */ + ["\uCA5F", "\uCA5F"], /* Hangul Syllable */ + ["\uCA60", "\uCA60"], /* Hangul Syllable */ + ["\uCA61", "\uCA61"], /* Hangul Syllable */ + ["\uCA62", "\uCA62"], /* Hangul Syllable */ + ["\uCA63", "\uCA63"], /* Hangul Syllable */ + ["\uCA64", "\uCA64"], /* Hangul Syllable */ + ["\uCA65", "\uCA65"], /* Hangul Syllable */ + ["\uCA66", "\uCA66"], /* Hangul Syllable */ + ["\uCA67", "\uCA67"], /* Hangul Syllable */ + ["\uCA68", "\uCA68"], /* Hangul Syllable */ + ["\uCA69", "\uCA69"], /* Hangul Syllable */ + ["\uCA6A", "\uCA6A"], /* Hangul Syllable */ + ["\uCA6B", "\uCA6B"], /* Hangul Syllable */ + ["\uCA6C", "\uCA6C"], /* Hangul Syllable */ + ["\uCA6D", "\uCA6D"], /* Hangul Syllable */ + ["\uCA6E", "\uCA6E"], /* Hangul Syllable */ + ["\uCA6F", "\uCA6F"], /* Hangul Syllable */ + ["\uCA70", "\uCA70"], /* Hangul Syllable */ + ["\uCA71", "\uCA71"], /* Hangul Syllable */ + ["\uCA72", "\uCA72"], /* Hangul Syllable */ + ["\uCA73", "\uCA73"], /* Hangul Syllable */ + ["\uCA74", "\uCA74"], /* Hangul Syllable */ + ["\uCA75", "\uCA75"], /* Hangul Syllable */ + ["\uCA76", "\uCA76"], /* Hangul Syllable */ + ["\uCA77", "\uCA77"], /* Hangul Syllable */ + ["\uCA78", "\uCA78"], /* Hangul Syllable */ + ["\uCA79", "\uCA79"], /* Hangul Syllable */ + ["\uCA7A", "\uCA7A"], /* Hangul Syllable */ + ["\uCA7B", "\uCA7B"], /* Hangul Syllable */ + ["\uCA7C", "\uCA7C"], /* Hangul Syllable */ + ["\uCA7D", "\uCA7D"], /* Hangul Syllable */ + ["\uCA7E", "\uCA7E"], /* Hangul Syllable */ + ["\uCA7F", "\uCA7F"], /* Hangul Syllable */ + ["\uCA80", "\uCA80"], /* Hangul Syllable */ + ["\uCA81", "\uCA81"], /* Hangul Syllable */ + ["\uCA82", "\uCA82"], /* Hangul Syllable */ + ["\uCA83", "\uCA83"], /* Hangul Syllable */ + ["\uCA84", "\uCA84"], /* Hangul Syllable */ + ["\uCA85", "\uCA85"], /* Hangul Syllable */ + ["\uCA86", "\uCA86"], /* Hangul Syllable */ + ["\uCA87", "\uCA87"], /* Hangul Syllable */ + ["\uCA88", "\uCA88"], /* Hangul Syllable */ + ["\uCA89", "\uCA89"], /* Hangul Syllable */ + ["\uCA8A", "\uCA8A"], /* Hangul Syllable */ + ["\uCA8B", "\uCA8B"], /* Hangul Syllable */ + ["\uCA8C", "\uCA8C"], /* Hangul Syllable */ + ["\uCA8D", "\uCA8D"], /* Hangul Syllable */ + ["\uCA8E", "\uCA8E"], /* Hangul Syllable */ + ["\uCA8F", "\uCA8F"], /* Hangul Syllable */ + ["\uCA90", "\uCA90"], /* Hangul Syllable */ + ["\uCA91", "\uCA91"], /* Hangul Syllable */ + ["\uCA92", "\uCA92"], /* Hangul Syllable */ + ["\uCA93", "\uCA93"], /* Hangul Syllable */ + ["\uCA94", "\uCA94"], /* Hangul Syllable */ + ["\uCA95", "\uCA95"], /* Hangul Syllable */ + ["\uCA96", "\uCA96"], /* Hangul Syllable */ + ["\uCA97", "\uCA97"], /* Hangul Syllable */ + ["\uCA98", "\uCA98"], /* Hangul Syllable */ + ["\uCA99", "\uCA99"], /* Hangul Syllable */ + ["\uCA9A", "\uCA9A"], /* Hangul Syllable */ + ["\uCA9B", "\uCA9B"], /* Hangul Syllable */ + ["\uCA9C", "\uCA9C"], /* Hangul Syllable */ + ["\uCA9D", "\uCA9D"], /* Hangul Syllable */ + ["\uCA9E", "\uCA9E"], /* Hangul Syllable */ + ["\uCA9F", "\uCA9F"], /* Hangul Syllable */ + ["\uCAA0", "\uCAA0"], /* Hangul Syllable */ + ["\uCAA1", "\uCAA1"], /* Hangul Syllable */ + ["\uCAA2", "\uCAA2"], /* Hangul Syllable */ + ["\uCAA3", "\uCAA3"], /* Hangul Syllable */ + ["\uCAA4", "\uCAA4"], /* Hangul Syllable */ + ["\uCAA5", "\uCAA5"], /* Hangul Syllable */ + ["\uCAA6", "\uCAA6"], /* Hangul Syllable */ + ["\uCAA7", "\uCAA7"], /* Hangul Syllable */ + ["\uCAA8", "\uCAA8"], /* Hangul Syllable */ + ["\uCAA9", "\uCAA9"], /* Hangul Syllable */ + ["\uCAAA", "\uCAAA"], /* Hangul Syllable */ + ["\uCAAB", "\uCAAB"], /* Hangul Syllable */ + ["\uCAAC", "\uCAAC"], /* Hangul Syllable */ + ["\uCAAD", "\uCAAD"], /* Hangul Syllable */ + ["\uCAAE", "\uCAAE"], /* Hangul Syllable */ + ["\uCAAF", "\uCAAF"], /* Hangul Syllable */ + ["\uCAB0", "\uCAB0"], /* Hangul Syllable */ + ["\uCAB1", "\uCAB1"], /* Hangul Syllable */ + ["\uCAB2", "\uCAB2"], /* Hangul Syllable */ + ["\uCAB3", "\uCAB3"], /* Hangul Syllable */ + ["\uCAB4", "\uCAB4"], /* Hangul Syllable */ + ["\uCAB5", "\uCAB5"], /* Hangul Syllable */ + ["\uCAB6", "\uCAB6"], /* Hangul Syllable */ + ["\uCAB7", "\uCAB7"], /* Hangul Syllable */ + ["\uCAB8", "\uCAB8"], /* Hangul Syllable */ + ["\uCAB9", "\uCAB9"], /* Hangul Syllable */ + ["\uCABA", "\uCABA"], /* Hangul Syllable */ + ["\uCABB", "\uCABB"], /* Hangul Syllable */ + ["\uCABC", "\uCABC"], /* Hangul Syllable */ + ["\uCABD", "\uCABD"], /* Hangul Syllable */ + ["\uCABE", "\uCABE"], /* Hangul Syllable */ + ["\uCABF", "\uCABF"], /* Hangul Syllable */ + ["\uCAC0", "\uCAC0"], /* Hangul Syllable */ + ["\uCAC1", "\uCAC1"], /* Hangul Syllable */ + ["\uCAC2", "\uCAC2"], /* Hangul Syllable */ + ["\uCAC3", "\uCAC3"], /* Hangul Syllable */ + ["\uCAC4", "\uCAC4"], /* Hangul Syllable */ + ["\uCAC5", "\uCAC5"], /* Hangul Syllable */ + ["\uCAC6", "\uCAC6"], /* Hangul Syllable */ + ["\uCAC7", "\uCAC7"], /* Hangul Syllable */ + ["\uCAC8", "\uCAC8"], /* Hangul Syllable */ + ["\uCAC9", "\uCAC9"], /* Hangul Syllable */ + ["\uCACA", "\uCACA"], /* Hangul Syllable */ + ["\uCACB", "\uCACB"], /* Hangul Syllable */ + ["\uCACC", "\uCACC"], /* Hangul Syllable */ + ["\uCACD", "\uCACD"], /* Hangul Syllable */ + ["\uCACE", "\uCACE"], /* Hangul Syllable */ + ["\uCACF", "\uCACF"], /* Hangul Syllable */ + ["\uCAD0", "\uCAD0"], /* Hangul Syllable */ + ["\uCAD1", "\uCAD1"], /* Hangul Syllable */ + ["\uCAD2", "\uCAD2"], /* Hangul Syllable */ + ["\uCAD3", "\uCAD3"], /* Hangul Syllable */ + ["\uCAD4", "\uCAD4"], /* Hangul Syllable */ + ["\uCAD5", "\uCAD5"], /* Hangul Syllable */ + ["\uCAD6", "\uCAD6"], /* Hangul Syllable */ + ["\uCAD7", "\uCAD7"], /* Hangul Syllable */ + ["\uCAD8", "\uCAD8"], /* Hangul Syllable */ + ["\uCAD9", "\uCAD9"], /* Hangul Syllable */ + ["\uCADA", "\uCADA"], /* Hangul Syllable */ + ["\uCADB", "\uCADB"], /* Hangul Syllable */ + ["\uCADC", "\uCADC"], /* Hangul Syllable */ + ["\uCADD", "\uCADD"], /* Hangul Syllable */ + ["\uCADE", "\uCADE"], /* Hangul Syllable */ + ["\uCADF", "\uCADF"], /* Hangul Syllable */ + ["\uCAE0", "\uCAE0"], /* Hangul Syllable */ + ["\uCAE1", "\uCAE1"], /* Hangul Syllable */ + ["\uCAE2", "\uCAE2"], /* Hangul Syllable */ + ["\uCAE3", "\uCAE3"], /* Hangul Syllable */ + ["\uCAE4", "\uCAE4"], /* Hangul Syllable */ + ["\uCAE5", "\uCAE5"], /* Hangul Syllable */ + ["\uCAE6", "\uCAE6"], /* Hangul Syllable */ + ["\uCAE7", "\uCAE7"], /* Hangul Syllable */ + ["\uCAE8", "\uCAE8"], /* Hangul Syllable */ + ["\uCAE9", "\uCAE9"], /* Hangul Syllable */ + ["\uCAEA", "\uCAEA"], /* Hangul Syllable */ + ["\uCAEB", "\uCAEB"], /* Hangul Syllable */ + ["\uCAEC", "\uCAEC"], /* Hangul Syllable */ + ["\uCAED", "\uCAED"], /* Hangul Syllable */ + ["\uCAEE", "\uCAEE"], /* Hangul Syllable */ + ["\uCAEF", "\uCAEF"], /* Hangul Syllable */ + ["\uCAF0", "\uCAF0"], /* Hangul Syllable */ + ["\uCAF1", "\uCAF1"], /* Hangul Syllable */ + ["\uCAF2", "\uCAF2"], /* Hangul Syllable */ + ["\uCAF3", "\uCAF3"], /* Hangul Syllable */ + ["\uCAF4", "\uCAF4"], /* Hangul Syllable */ + ["\uCAF5", "\uCAF5"], /* Hangul Syllable */ + ["\uCAF6", "\uCAF6"], /* Hangul Syllable */ + ["\uCAF7", "\uCAF7"], /* Hangul Syllable */ + ["\uCAF8", "\uCAF8"], /* Hangul Syllable */ + ["\uCAF9", "\uCAF9"], /* Hangul Syllable */ + ["\uCAFA", "\uCAFA"], /* Hangul Syllable */ + ["\uCAFB", "\uCAFB"], /* Hangul Syllable */ + ["\uCAFC", "\uCAFC"], /* Hangul Syllable */ + ["\uCAFD", "\uCAFD"], /* Hangul Syllable */ + ["\uCAFE", "\uCAFE"], /* Hangul Syllable */ + ["\uCAFF", "\uCAFF"], /* Hangul Syllable */ + ["\uCB00", "\uCB00"], /* Hangul Syllable */ + ["\uCB01", "\uCB01"], /* Hangul Syllable */ + ["\uCB02", "\uCB02"], /* Hangul Syllable */ + ["\uCB03", "\uCB03"], /* Hangul Syllable */ + ["\uCB04", "\uCB04"], /* Hangul Syllable */ + ["\uCB05", "\uCB05"], /* Hangul Syllable */ + ["\uCB06", "\uCB06"], /* Hangul Syllable */ + ["\uCB07", "\uCB07"], /* Hangul Syllable */ + ["\uCB08", "\uCB08"], /* Hangul Syllable */ + ["\uCB09", "\uCB09"], /* Hangul Syllable */ + ["\uCB0A", "\uCB0A"], /* Hangul Syllable */ + ["\uCB0B", "\uCB0B"], /* Hangul Syllable */ + ["\uCB0C", "\uCB0C"], /* Hangul Syllable */ + ["\uCB0D", "\uCB0D"], /* Hangul Syllable */ + ["\uCB0E", "\uCB0E"], /* Hangul Syllable */ + ["\uCB0F", "\uCB0F"], /* Hangul Syllable */ + ["\uCB10", "\uCB10"], /* Hangul Syllable */ + ["\uCB11", "\uCB11"], /* Hangul Syllable */ + ["\uCB12", "\uCB12"], /* Hangul Syllable */ + ["\uCB13", "\uCB13"], /* Hangul Syllable */ + ["\uCB14", "\uCB14"], /* Hangul Syllable */ + ["\uCB15", "\uCB15"], /* Hangul Syllable */ + ["\uCB16", "\uCB16"], /* Hangul Syllable */ + ["\uCB17", "\uCB17"], /* Hangul Syllable */ + ["\uCB18", "\uCB18"], /* Hangul Syllable */ + ["\uCB19", "\uCB19"], /* Hangul Syllable */ + ["\uCB1A", "\uCB1A"], /* Hangul Syllable */ + ["\uCB1B", "\uCB1B"], /* Hangul Syllable */ + ["\uCB1C", "\uCB1C"], /* Hangul Syllable */ + ["\uCB1D", "\uCB1D"], /* Hangul Syllable */ + ["\uCB1E", "\uCB1E"], /* Hangul Syllable */ + ["\uCB1F", "\uCB1F"], /* Hangul Syllable */ + ["\uCB20", "\uCB20"], /* Hangul Syllable */ + ["\uCB21", "\uCB21"], /* Hangul Syllable */ + ["\uCB22", "\uCB22"], /* Hangul Syllable */ + ["\uCB23", "\uCB23"], /* Hangul Syllable */ + ["\uCB24", "\uCB24"], /* Hangul Syllable */ + ["\uCB25", "\uCB25"], /* Hangul Syllable */ + ["\uCB26", "\uCB26"], /* Hangul Syllable */ + ["\uCB27", "\uCB27"], /* Hangul Syllable */ + ["\uCB28", "\uCB28"], /* Hangul Syllable */ + ["\uCB29", "\uCB29"], /* Hangul Syllable */ + ["\uCB2A", "\uCB2A"], /* Hangul Syllable */ + ["\uCB2B", "\uCB2B"], /* Hangul Syllable */ + ["\uCB2C", "\uCB2C"], /* Hangul Syllable */ + ["\uCB2D", "\uCB2D"], /* Hangul Syllable */ + ["\uCB2E", "\uCB2E"], /* Hangul Syllable */ + ["\uCB2F", "\uCB2F"], /* Hangul Syllable */ + ["\uCB30", "\uCB30"], /* Hangul Syllable */ + ["\uCB31", "\uCB31"], /* Hangul Syllable */ + ["\uCB32", "\uCB32"], /* Hangul Syllable */ + ["\uCB33", "\uCB33"], /* Hangul Syllable */ + ["\uCB34", "\uCB34"], /* Hangul Syllable */ + ["\uCB35", "\uCB35"], /* Hangul Syllable */ + ["\uCB36", "\uCB36"], /* Hangul Syllable */ + ["\uCB37", "\uCB37"], /* Hangul Syllable */ + ["\uCB38", "\uCB38"], /* Hangul Syllable */ + ["\uCB39", "\uCB39"], /* Hangul Syllable */ + ["\uCB3A", "\uCB3A"], /* Hangul Syllable */ + ["\uCB3B", "\uCB3B"], /* Hangul Syllable */ + ["\uCB3C", "\uCB3C"], /* Hangul Syllable */ + ["\uCB3D", "\uCB3D"], /* Hangul Syllable */ + ["\uCB3E", "\uCB3E"], /* Hangul Syllable */ + ["\uCB3F", "\uCB3F"], /* Hangul Syllable */ + ["\uCB40", "\uCB40"], /* Hangul Syllable */ + ["\uCB41", "\uCB41"], /* Hangul Syllable */ + ["\uCB42", "\uCB42"], /* Hangul Syllable */ + ["\uCB43", "\uCB43"], /* Hangul Syllable */ + ["\uCB44", "\uCB44"], /* Hangul Syllable */ + ["\uCB45", "\uCB45"], /* Hangul Syllable */ + ["\uCB46", "\uCB46"], /* Hangul Syllable */ + ["\uCB47", "\uCB47"], /* Hangul Syllable */ + ["\uCB48", "\uCB48"], /* Hangul Syllable */ + ["\uCB49", "\uCB49"], /* Hangul Syllable */ + ["\uCB4A", "\uCB4A"], /* Hangul Syllable */ + ["\uCB4B", "\uCB4B"], /* Hangul Syllable */ + ["\uCB4C", "\uCB4C"], /* Hangul Syllable */ + ["\uCB4D", "\uCB4D"], /* Hangul Syllable */ + ["\uCB4E", "\uCB4E"], /* Hangul Syllable */ + ["\uCB4F", "\uCB4F"], /* Hangul Syllable */ + ["\uCB50", "\uCB50"], /* Hangul Syllable */ + ["\uCB51", "\uCB51"], /* Hangul Syllable */ + ["\uCB52", "\uCB52"], /* Hangul Syllable */ + ["\uCB53", "\uCB53"], /* Hangul Syllable */ + ["\uCB54", "\uCB54"], /* Hangul Syllable */ + ["\uCB55", "\uCB55"], /* Hangul Syllable */ + ["\uCB56", "\uCB56"], /* Hangul Syllable */ + ["\uCB57", "\uCB57"], /* Hangul Syllable */ + ["\uCB58", "\uCB58"], /* Hangul Syllable */ + ["\uCB59", "\uCB59"], /* Hangul Syllable */ + ["\uCB5A", "\uCB5A"], /* Hangul Syllable */ + ["\uCB5B", "\uCB5B"], /* Hangul Syllable */ + ["\uCB5C", "\uCB5C"], /* Hangul Syllable */ + ["\uCB5D", "\uCB5D"], /* Hangul Syllable */ + ["\uCB5E", "\uCB5E"], /* Hangul Syllable */ + ["\uCB5F", "\uCB5F"], /* Hangul Syllable */ + ["\uCB60", "\uCB60"], /* Hangul Syllable */ + ["\uCB61", "\uCB61"], /* Hangul Syllable */ + ["\uCB62", "\uCB62"], /* Hangul Syllable */ + ["\uCB63", "\uCB63"], /* Hangul Syllable */ + ["\uCB64", "\uCB64"], /* Hangul Syllable */ + ["\uCB65", "\uCB65"], /* Hangul Syllable */ + ["\uCB66", "\uCB66"], /* Hangul Syllable */ + ["\uCB67", "\uCB67"], /* Hangul Syllable */ + ["\uCB68", "\uCB68"], /* Hangul Syllable */ + ["\uCB69", "\uCB69"], /* Hangul Syllable */ + ["\uCB6A", "\uCB6A"], /* Hangul Syllable */ + ["\uCB6B", "\uCB6B"], /* Hangul Syllable */ + ["\uCB6C", "\uCB6C"], /* Hangul Syllable */ + ["\uCB6D", "\uCB6D"], /* Hangul Syllable */ + ["\uCB6E", "\uCB6E"], /* Hangul Syllable */ + ["\uCB6F", "\uCB6F"], /* Hangul Syllable */ + ["\uCB70", "\uCB70"], /* Hangul Syllable */ + ["\uCB71", "\uCB71"], /* Hangul Syllable */ + ["\uCB72", "\uCB72"], /* Hangul Syllable */ + ["\uCB73", "\uCB73"], /* Hangul Syllable */ + ["\uCB74", "\uCB74"], /* Hangul Syllable */ + ["\uCB75", "\uCB75"], /* Hangul Syllable */ + ["\uCB76", "\uCB76"], /* Hangul Syllable */ + ["\uCB77", "\uCB77"], /* Hangul Syllable */ + ["\uCB78", "\uCB78"], /* Hangul Syllable */ + ["\uCB79", "\uCB79"], /* Hangul Syllable */ + ["\uCB7A", "\uCB7A"], /* Hangul Syllable */ + ["\uCB7B", "\uCB7B"], /* Hangul Syllable */ + ["\uCB7C", "\uCB7C"], /* Hangul Syllable */ + ["\uCB7D", "\uCB7D"], /* Hangul Syllable */ + ["\uCB7E", "\uCB7E"], /* Hangul Syllable */ + ["\uCB7F", "\uCB7F"], /* Hangul Syllable */ + ["\uCB80", "\uCB80"], /* Hangul Syllable */ + ["\uCB81", "\uCB81"], /* Hangul Syllable */ + ["\uCB82", "\uCB82"], /* Hangul Syllable */ + ["\uCB83", "\uCB83"], /* Hangul Syllable */ + ["\uCB84", "\uCB84"], /* Hangul Syllable */ + ["\uCB85", "\uCB85"], /* Hangul Syllable */ + ["\uCB86", "\uCB86"], /* Hangul Syllable */ + ["\uCB87", "\uCB87"], /* Hangul Syllable */ + ["\uCB88", "\uCB88"], /* Hangul Syllable */ + ["\uCB89", "\uCB89"], /* Hangul Syllable */ + ["\uCB8A", "\uCB8A"], /* Hangul Syllable */ + ["\uCB8B", "\uCB8B"], /* Hangul Syllable */ + ["\uCB8C", "\uCB8C"], /* Hangul Syllable */ + ["\uCB8D", "\uCB8D"], /* Hangul Syllable */ + ["\uCB8E", "\uCB8E"], /* Hangul Syllable */ + ["\uCB8F", "\uCB8F"], /* Hangul Syllable */ + ["\uCB90", "\uCB90"], /* Hangul Syllable */ + ["\uCB91", "\uCB91"], /* Hangul Syllable */ + ["\uCB92", "\uCB92"], /* Hangul Syllable */ + ["\uCB93", "\uCB93"], /* Hangul Syllable */ + ["\uCB94", "\uCB94"], /* Hangul Syllable */ + ["\uCB95", "\uCB95"], /* Hangul Syllable */ + ["\uCB96", "\uCB96"], /* Hangul Syllable */ + ["\uCB97", "\uCB97"], /* Hangul Syllable */ + ["\uCB98", "\uCB98"], /* Hangul Syllable */ + ["\uCB99", "\uCB99"], /* Hangul Syllable */ + ["\uCB9A", "\uCB9A"], /* Hangul Syllable */ + ["\uCB9B", "\uCB9B"], /* Hangul Syllable */ + ["\uCB9C", "\uCB9C"], /* Hangul Syllable */ + ["\uCB9D", "\uCB9D"], /* Hangul Syllable */ + ["\uCB9E", "\uCB9E"], /* Hangul Syllable */ + ["\uCB9F", "\uCB9F"], /* Hangul Syllable */ + ["\uCBA0", "\uCBA0"], /* Hangul Syllable */ + ["\uCBA1", "\uCBA1"], /* Hangul Syllable */ + ["\uCBA2", "\uCBA2"], /* Hangul Syllable */ + ["\uCBA3", "\uCBA3"], /* Hangul Syllable */ + ["\uCBA4", "\uCBA4"], /* Hangul Syllable */ + ["\uCBA5", "\uCBA5"], /* Hangul Syllable */ + ["\uCBA6", "\uCBA6"], /* Hangul Syllable */ + ["\uCBA7", "\uCBA7"], /* Hangul Syllable */ + ["\uCBA8", "\uCBA8"], /* Hangul Syllable */ + ["\uCBA9", "\uCBA9"], /* Hangul Syllable */ + ["\uCBAA", "\uCBAA"], /* Hangul Syllable */ + ["\uCBAB", "\uCBAB"], /* Hangul Syllable */ + ["\uCBAC", "\uCBAC"], /* Hangul Syllable */ + ["\uCBAD", "\uCBAD"], /* Hangul Syllable */ + ["\uCBAE", "\uCBAE"], /* Hangul Syllable */ + ["\uCBAF", "\uCBAF"], /* Hangul Syllable */ + ["\uCBB0", "\uCBB0"], /* Hangul Syllable */ + ["\uCBB1", "\uCBB1"], /* Hangul Syllable */ + ["\uCBB2", "\uCBB2"], /* Hangul Syllable */ + ["\uCBB3", "\uCBB3"], /* Hangul Syllable */ + ["\uCBB4", "\uCBB4"], /* Hangul Syllable */ + ["\uCBB5", "\uCBB5"], /* Hangul Syllable */ + ["\uCBB6", "\uCBB6"], /* Hangul Syllable */ + ["\uCBB7", "\uCBB7"], /* Hangul Syllable */ + ["\uCBB8", "\uCBB8"], /* Hangul Syllable */ + ["\uCBB9", "\uCBB9"], /* Hangul Syllable */ + ["\uCBBA", "\uCBBA"], /* Hangul Syllable */ + ["\uCBBB", "\uCBBB"], /* Hangul Syllable */ + ["\uCBBC", "\uCBBC"], /* Hangul Syllable */ + ["\uCBBD", "\uCBBD"], /* Hangul Syllable */ + ["\uCBBE", "\uCBBE"], /* Hangul Syllable */ + ["\uCBBF", "\uCBBF"], /* Hangul Syllable */ + ["\uCBC0", "\uCBC0"], /* Hangul Syllable */ + ["\uCBC1", "\uCBC1"], /* Hangul Syllable */ + ["\uCBC2", "\uCBC2"], /* Hangul Syllable */ + ["\uCBC3", "\uCBC3"], /* Hangul Syllable */ + ["\uCBC4", "\uCBC4"], /* Hangul Syllable */ + ["\uCBC5", "\uCBC5"], /* Hangul Syllable */ + ["\uCBC6", "\uCBC6"], /* Hangul Syllable */ + ["\uCBC7", "\uCBC7"], /* Hangul Syllable */ + ["\uCBC8", "\uCBC8"], /* Hangul Syllable */ + ["\uCBC9", "\uCBC9"], /* Hangul Syllable */ + ["\uCBCA", "\uCBCA"], /* Hangul Syllable */ + ["\uCBCB", "\uCBCB"], /* Hangul Syllable */ + ["\uCBCC", "\uCBCC"], /* Hangul Syllable */ + ["\uCBCD", "\uCBCD"], /* Hangul Syllable */ + ["\uCBCE", "\uCBCE"], /* Hangul Syllable */ + ["\uCBCF", "\uCBCF"], /* Hangul Syllable */ + ["\uCBD0", "\uCBD0"], /* Hangul Syllable */ + ["\uCBD1", "\uCBD1"], /* Hangul Syllable */ + ["\uCBD2", "\uCBD2"], /* Hangul Syllable */ + ["\uCBD3", "\uCBD3"], /* Hangul Syllable */ + ["\uCBD4", "\uCBD4"], /* Hangul Syllable */ + ["\uCBD5", "\uCBD5"], /* Hangul Syllable */ + ["\uCBD6", "\uCBD6"], /* Hangul Syllable */ + ["\uCBD7", "\uCBD7"], /* Hangul Syllable */ + ["\uCBD8", "\uCBD8"], /* Hangul Syllable */ + ["\uCBD9", "\uCBD9"], /* Hangul Syllable */ + ["\uCBDA", "\uCBDA"], /* Hangul Syllable */ + ["\uCBDB", "\uCBDB"], /* Hangul Syllable */ + ["\uCBDC", "\uCBDC"], /* Hangul Syllable */ + ["\uCBDD", "\uCBDD"], /* Hangul Syllable */ + ["\uCBDE", "\uCBDE"], /* Hangul Syllable */ + ["\uCBDF", "\uCBDF"], /* Hangul Syllable */ + ["\uCBE0", "\uCBE0"], /* Hangul Syllable */ + ["\uCBE1", "\uCBE1"], /* Hangul Syllable */ + ["\uCBE2", "\uCBE2"], /* Hangul Syllable */ + ["\uCBE3", "\uCBE3"], /* Hangul Syllable */ + ["\uCBE4", "\uCBE4"], /* Hangul Syllable */ + ["\uCBE5", "\uCBE5"], /* Hangul Syllable */ + ["\uCBE6", "\uCBE6"], /* Hangul Syllable */ + ["\uCBE7", "\uCBE7"], /* Hangul Syllable */ + ["\uCBE8", "\uCBE8"], /* Hangul Syllable */ + ["\uCBE9", "\uCBE9"], /* Hangul Syllable */ + ["\uCBEA", "\uCBEA"], /* Hangul Syllable */ + ["\uCBEB", "\uCBEB"], /* Hangul Syllable */ + ["\uCBEC", "\uCBEC"], /* Hangul Syllable */ + ["\uCBED", "\uCBED"], /* Hangul Syllable */ + ["\uCBEE", "\uCBEE"], /* Hangul Syllable */ + ["\uCBEF", "\uCBEF"], /* Hangul Syllable */ + ["\uCBF0", "\uCBF0"], /* Hangul Syllable */ + ["\uCBF1", "\uCBF1"], /* Hangul Syllable */ + ["\uCBF2", "\uCBF2"], /* Hangul Syllable */ + ["\uCBF3", "\uCBF3"], /* Hangul Syllable */ + ["\uCBF4", "\uCBF4"], /* Hangul Syllable */ + ["\uCBF5", "\uCBF5"], /* Hangul Syllable */ + ["\uCBF6", "\uCBF6"], /* Hangul Syllable */ + ["\uCBF7", "\uCBF7"], /* Hangul Syllable */ + ["\uCBF8", "\uCBF8"], /* Hangul Syllable */ + ["\uCBF9", "\uCBF9"], /* Hangul Syllable */ + ["\uCBFA", "\uCBFA"], /* Hangul Syllable */ + ["\uCBFB", "\uCBFB"], /* Hangul Syllable */ + ["\uCBFC", "\uCBFC"], /* Hangul Syllable */ + ["\uCBFD", "\uCBFD"], /* Hangul Syllable */ + ["\uCBFE", "\uCBFE"], /* Hangul Syllable */ + ["\uCBFF", "\uCBFF"], /* Hangul Syllable */ + ["\uCC00", "\uCC00"], /* Hangul Syllable */ + ["\uCC01", "\uCC01"], /* Hangul Syllable */ + ["\uCC02", "\uCC02"], /* Hangul Syllable */ + ["\uCC03", "\uCC03"], /* Hangul Syllable */ + ["\uCC04", "\uCC04"], /* Hangul Syllable */ + ["\uCC05", "\uCC05"], /* Hangul Syllable */ + ["\uCC06", "\uCC06"], /* Hangul Syllable */ + ["\uCC07", "\uCC07"], /* Hangul Syllable */ + ["\uCC08", "\uCC08"], /* Hangul Syllable */ + ["\uCC09", "\uCC09"], /* Hangul Syllable */ + ["\uCC0A", "\uCC0A"], /* Hangul Syllable */ + ["\uCC0B", "\uCC0B"], /* Hangul Syllable */ + ["\uCC0C", "\uCC0C"], /* Hangul Syllable */ + ["\uCC0D", "\uCC0D"], /* Hangul Syllable */ + ["\uCC0E", "\uCC0E"], /* Hangul Syllable */ + ["\uCC0F", "\uCC0F"], /* Hangul Syllable */ + ["\uCC10", "\uCC10"], /* Hangul Syllable */ + ["\uCC11", "\uCC11"], /* Hangul Syllable */ + ["\uCC12", "\uCC12"], /* Hangul Syllable */ + ["\uCC13", "\uCC13"], /* Hangul Syllable */ + ["\uCC14", "\uCC14"], /* Hangul Syllable */ + ["\uCC15", "\uCC15"], /* Hangul Syllable */ + ["\uCC16", "\uCC16"], /* Hangul Syllable */ + ["\uCC17", "\uCC17"], /* Hangul Syllable */ + ["\uCC18", "\uCC18"], /* Hangul Syllable */ + ["\uCC19", "\uCC19"], /* Hangul Syllable */ + ["\uCC1A", "\uCC1A"], /* Hangul Syllable */ + ["\uCC1B", "\uCC1B"], /* Hangul Syllable */ + ["\uCC1C", "\uCC1C"], /* Hangul Syllable */ + ["\uCC1D", "\uCC1D"], /* Hangul Syllable */ + ["\uCC1E", "\uCC1E"], /* Hangul Syllable */ + ["\uCC1F", "\uCC1F"], /* Hangul Syllable */ + ["\uCC20", "\uCC20"], /* Hangul Syllable */ + ["\uCC21", "\uCC21"], /* Hangul Syllable */ + ["\uCC22", "\uCC22"], /* Hangul Syllable */ + ["\uCC23", "\uCC23"], /* Hangul Syllable */ + ["\uCC24", "\uCC24"], /* Hangul Syllable */ + ["\uCC25", "\uCC25"], /* Hangul Syllable */ + ["\uCC26", "\uCC26"], /* Hangul Syllable */ + ["\uCC27", "\uCC27"], /* Hangul Syllable */ + ["\uCC28", "\uCC28"], /* Hangul Syllable */ + ["\uCC29", "\uCC29"], /* Hangul Syllable */ + ["\uCC2A", "\uCC2A"], /* Hangul Syllable */ + ["\uCC2B", "\uCC2B"], /* Hangul Syllable */ + ["\uCC2C", "\uCC2C"], /* Hangul Syllable */ + ["\uCC2D", "\uCC2D"], /* Hangul Syllable */ + ["\uCC2E", "\uCC2E"], /* Hangul Syllable */ + ["\uCC2F", "\uCC2F"], /* Hangul Syllable */ + ["\uCC30", "\uCC30"], /* Hangul Syllable */ + ["\uCC31", "\uCC31"], /* Hangul Syllable */ + ["\uCC32", "\uCC32"], /* Hangul Syllable */ + ["\uCC33", "\uCC33"], /* Hangul Syllable */ + ["\uCC34", "\uCC34"], /* Hangul Syllable */ + ["\uCC35", "\uCC35"], /* Hangul Syllable */ + ["\uCC36", "\uCC36"], /* Hangul Syllable */ + ["\uCC37", "\uCC37"], /* Hangul Syllable */ + ["\uCC38", "\uCC38"], /* Hangul Syllable */ + ["\uCC39", "\uCC39"], /* Hangul Syllable */ + ["\uCC3A", "\uCC3A"], /* Hangul Syllable */ + ["\uCC3B", "\uCC3B"], /* Hangul Syllable */ + ["\uCC3C", "\uCC3C"], /* Hangul Syllable */ + ["\uCC3D", "\uCC3D"], /* Hangul Syllable */ + ["\uCC3E", "\uCC3E"], /* Hangul Syllable */ + ["\uCC3F", "\uCC3F"], /* Hangul Syllable */ + ["\uCC40", "\uCC40"], /* Hangul Syllable */ + ["\uCC41", "\uCC41"], /* Hangul Syllable */ + ["\uCC42", "\uCC42"], /* Hangul Syllable */ + ["\uCC43", "\uCC43"], /* Hangul Syllable */ + ["\uCC44", "\uCC44"], /* Hangul Syllable */ + ["\uCC45", "\uCC45"], /* Hangul Syllable */ + ["\uCC46", "\uCC46"], /* Hangul Syllable */ + ["\uCC47", "\uCC47"], /* Hangul Syllable */ + ["\uCC48", "\uCC48"], /* Hangul Syllable */ + ["\uCC49", "\uCC49"], /* Hangul Syllable */ + ["\uCC4A", "\uCC4A"], /* Hangul Syllable */ + ["\uCC4B", "\uCC4B"], /* Hangul Syllable */ + ["\uCC4C", "\uCC4C"], /* Hangul Syllable */ + ["\uCC4D", "\uCC4D"], /* Hangul Syllable */ + ["\uCC4E", "\uCC4E"], /* Hangul Syllable */ + ["\uCC4F", "\uCC4F"], /* Hangul Syllable */ + ["\uCC50", "\uCC50"], /* Hangul Syllable */ + ["\uCC51", "\uCC51"], /* Hangul Syllable */ + ["\uCC52", "\uCC52"], /* Hangul Syllable */ + ["\uCC53", "\uCC53"], /* Hangul Syllable */ + ["\uCC54", "\uCC54"], /* Hangul Syllable */ + ["\uCC55", "\uCC55"], /* Hangul Syllable */ + ["\uCC56", "\uCC56"], /* Hangul Syllable */ + ["\uCC57", "\uCC57"], /* Hangul Syllable */ + ["\uCC58", "\uCC58"], /* Hangul Syllable */ + ["\uCC59", "\uCC59"], /* Hangul Syllable */ + ["\uCC5A", "\uCC5A"], /* Hangul Syllable */ + ["\uCC5B", "\uCC5B"], /* Hangul Syllable */ + ["\uCC5C", "\uCC5C"], /* Hangul Syllable */ + ["\uCC5D", "\uCC5D"], /* Hangul Syllable */ + ["\uCC5E", "\uCC5E"], /* Hangul Syllable */ + ["\uCC5F", "\uCC5F"], /* Hangul Syllable */ + ["\uCC60", "\uCC60"], /* Hangul Syllable */ + ["\uCC61", "\uCC61"], /* Hangul Syllable */ + ["\uCC62", "\uCC62"], /* Hangul Syllable */ + ["\uCC63", "\uCC63"], /* Hangul Syllable */ + ["\uCC64", "\uCC64"], /* Hangul Syllable */ + ["\uCC65", "\uCC65"], /* Hangul Syllable */ + ["\uCC66", "\uCC66"], /* Hangul Syllable */ + ["\uCC67", "\uCC67"], /* Hangul Syllable */ + ["\uCC68", "\uCC68"], /* Hangul Syllable */ + ["\uCC69", "\uCC69"], /* Hangul Syllable */ + ["\uCC6A", "\uCC6A"], /* Hangul Syllable */ + ["\uCC6B", "\uCC6B"], /* Hangul Syllable */ + ["\uCC6C", "\uCC6C"], /* Hangul Syllable */ + ["\uCC6D", "\uCC6D"], /* Hangul Syllable */ + ["\uCC6E", "\uCC6E"], /* Hangul Syllable */ + ["\uCC6F", "\uCC6F"], /* Hangul Syllable */ + ["\uCC70", "\uCC70"], /* Hangul Syllable */ + ["\uCC71", "\uCC71"], /* Hangul Syllable */ + ["\uCC72", "\uCC72"], /* Hangul Syllable */ + ["\uCC73", "\uCC73"], /* Hangul Syllable */ + ["\uCC74", "\uCC74"], /* Hangul Syllable */ + ["\uCC75", "\uCC75"], /* Hangul Syllable */ + ["\uCC76", "\uCC76"], /* Hangul Syllable */ + ["\uCC77", "\uCC77"], /* Hangul Syllable */ + ["\uCC78", "\uCC78"], /* Hangul Syllable */ + ["\uCC79", "\uCC79"], /* Hangul Syllable */ + ["\uCC7A", "\uCC7A"], /* Hangul Syllable */ + ["\uCC7B", "\uCC7B"], /* Hangul Syllable */ + ["\uCC7C", "\uCC7C"], /* Hangul Syllable */ + ["\uCC7D", "\uCC7D"], /* Hangul Syllable */ + ["\uCC7E", "\uCC7E"], /* Hangul Syllable */ + ["\uCC7F", "\uCC7F"], /* Hangul Syllable */ + ["\uCC80", "\uCC80"], /* Hangul Syllable */ + ["\uCC81", "\uCC81"], /* Hangul Syllable */ + ["\uCC82", "\uCC82"], /* Hangul Syllable */ + ["\uCC83", "\uCC83"], /* Hangul Syllable */ + ["\uCC84", "\uCC84"], /* Hangul Syllable */ + ["\uCC85", "\uCC85"], /* Hangul Syllable */ + ["\uCC86", "\uCC86"], /* Hangul Syllable */ + ["\uCC87", "\uCC87"], /* Hangul Syllable */ + ["\uCC88", "\uCC88"], /* Hangul Syllable */ + ["\uCC89", "\uCC89"], /* Hangul Syllable */ + ["\uCC8A", "\uCC8A"], /* Hangul Syllable */ + ["\uCC8B", "\uCC8B"], /* Hangul Syllable */ + ["\uCC8C", "\uCC8C"], /* Hangul Syllable */ + ["\uCC8D", "\uCC8D"], /* Hangul Syllable */ + ["\uCC8E", "\uCC8E"], /* Hangul Syllable */ + ["\uCC8F", "\uCC8F"], /* Hangul Syllable */ + ["\uCC90", "\uCC90"], /* Hangul Syllable */ + ["\uCC91", "\uCC91"], /* Hangul Syllable */ + ["\uCC92", "\uCC92"], /* Hangul Syllable */ + ["\uCC93", "\uCC93"], /* Hangul Syllable */ + ["\uCC94", "\uCC94"], /* Hangul Syllable */ + ["\uCC95", "\uCC95"], /* Hangul Syllable */ + ["\uCC96", "\uCC96"], /* Hangul Syllable */ + ["\uCC97", "\uCC97"], /* Hangul Syllable */ + ["\uCC98", "\uCC98"], /* Hangul Syllable */ + ["\uCC99", "\uCC99"], /* Hangul Syllable */ + ["\uCC9A", "\uCC9A"], /* Hangul Syllable */ + ["\uCC9B", "\uCC9B"], /* Hangul Syllable */ + ["\uCC9C", "\uCC9C"], /* Hangul Syllable */ + ["\uCC9D", "\uCC9D"], /* Hangul Syllable */ + ["\uCC9E", "\uCC9E"], /* Hangul Syllable */ + ["\uCC9F", "\uCC9F"], /* Hangul Syllable */ + ["\uCCA0", "\uCCA0"], /* Hangul Syllable */ + ["\uCCA1", "\uCCA1"], /* Hangul Syllable */ + ["\uCCA2", "\uCCA2"], /* Hangul Syllable */ + ["\uCCA3", "\uCCA3"], /* Hangul Syllable */ + ["\uCCA4", "\uCCA4"], /* Hangul Syllable */ + ["\uCCA5", "\uCCA5"], /* Hangul Syllable */ + ["\uCCA6", "\uCCA6"], /* Hangul Syllable */ + ["\uCCA7", "\uCCA7"], /* Hangul Syllable */ + ["\uCCA8", "\uCCA8"], /* Hangul Syllable */ + ["\uCCA9", "\uCCA9"], /* Hangul Syllable */ + ["\uCCAA", "\uCCAA"], /* Hangul Syllable */ + ["\uCCAB", "\uCCAB"], /* Hangul Syllable */ + ["\uCCAC", "\uCCAC"], /* Hangul Syllable */ + ["\uCCAD", "\uCCAD"], /* Hangul Syllable */ + ["\uCCAE", "\uCCAE"], /* Hangul Syllable */ + ["\uCCAF", "\uCCAF"], /* Hangul Syllable */ + ["\uCCB0", "\uCCB0"], /* Hangul Syllable */ + ["\uCCB1", "\uCCB1"], /* Hangul Syllable */ + ["\uCCB2", "\uCCB2"], /* Hangul Syllable */ + ["\uCCB3", "\uCCB3"], /* Hangul Syllable */ + ["\uCCB4", "\uCCB4"], /* Hangul Syllable */ + ["\uCCB5", "\uCCB5"], /* Hangul Syllable */ + ["\uCCB6", "\uCCB6"], /* Hangul Syllable */ + ["\uCCB7", "\uCCB7"], /* Hangul Syllable */ + ["\uCCB8", "\uCCB8"], /* Hangul Syllable */ + ["\uCCB9", "\uCCB9"], /* Hangul Syllable */ + ["\uCCBA", "\uCCBA"], /* Hangul Syllable */ + ["\uCCBB", "\uCCBB"], /* Hangul Syllable */ + ["\uCCBC", "\uCCBC"], /* Hangul Syllable */ + ["\uCCBD", "\uCCBD"], /* Hangul Syllable */ + ["\uCCBE", "\uCCBE"], /* Hangul Syllable */ + ["\uCCBF", "\uCCBF"], /* Hangul Syllable */ + ["\uCCC0", "\uCCC0"], /* Hangul Syllable */ + ["\uCCC1", "\uCCC1"], /* Hangul Syllable */ + ["\uCCC2", "\uCCC2"], /* Hangul Syllable */ + ["\uCCC3", "\uCCC3"], /* Hangul Syllable */ + ["\uCCC4", "\uCCC4"], /* Hangul Syllable */ + ["\uCCC5", "\uCCC5"], /* Hangul Syllable */ + ["\uCCC6", "\uCCC6"], /* Hangul Syllable */ + ["\uCCC7", "\uCCC7"], /* Hangul Syllable */ + ["\uCCC8", "\uCCC8"], /* Hangul Syllable */ + ["\uCCC9", "\uCCC9"], /* Hangul Syllable */ + ["\uCCCA", "\uCCCA"], /* Hangul Syllable */ + ["\uCCCB", "\uCCCB"], /* Hangul Syllable */ + ["\uCCCC", "\uCCCC"], /* Hangul Syllable */ + ["\uCCCD", "\uCCCD"], /* Hangul Syllable */ + ["\uCCCE", "\uCCCE"], /* Hangul Syllable */ + ["\uCCCF", "\uCCCF"], /* Hangul Syllable */ + ["\uCCD0", "\uCCD0"], /* Hangul Syllable */ + ["\uCCD1", "\uCCD1"], /* Hangul Syllable */ + ["\uCCD2", "\uCCD2"], /* Hangul Syllable */ + ["\uCCD3", "\uCCD3"], /* Hangul Syllable */ + ["\uCCD4", "\uCCD4"], /* Hangul Syllable */ + ["\uCCD5", "\uCCD5"], /* Hangul Syllable */ + ["\uCCD6", "\uCCD6"], /* Hangul Syllable */ + ["\uCCD7", "\uCCD7"], /* Hangul Syllable */ + ["\uCCD8", "\uCCD8"], /* Hangul Syllable */ + ["\uCCD9", "\uCCD9"], /* Hangul Syllable */ + ["\uCCDA", "\uCCDA"], /* Hangul Syllable */ + ["\uCCDB", "\uCCDB"], /* Hangul Syllable */ + ["\uCCDC", "\uCCDC"], /* Hangul Syllable */ + ["\uCCDD", "\uCCDD"], /* Hangul Syllable */ + ["\uCCDE", "\uCCDE"], /* Hangul Syllable */ + ["\uCCDF", "\uCCDF"], /* Hangul Syllable */ + ["\uCCE0", "\uCCE0"], /* Hangul Syllable */ + ["\uCCE1", "\uCCE1"], /* Hangul Syllable */ + ["\uCCE2", "\uCCE2"], /* Hangul Syllable */ + ["\uCCE3", "\uCCE3"], /* Hangul Syllable */ + ["\uCCE4", "\uCCE4"], /* Hangul Syllable */ + ["\uCCE5", "\uCCE5"], /* Hangul Syllable */ + ["\uCCE6", "\uCCE6"], /* Hangul Syllable */ + ["\uCCE7", "\uCCE7"], /* Hangul Syllable */ + ["\uCCE8", "\uCCE8"], /* Hangul Syllable */ + ["\uCCE9", "\uCCE9"], /* Hangul Syllable */ + ["\uCCEA", "\uCCEA"], /* Hangul Syllable */ + ["\uCCEB", "\uCCEB"], /* Hangul Syllable */ + ["\uCCEC", "\uCCEC"], /* Hangul Syllable */ + ["\uCCED", "\uCCED"], /* Hangul Syllable */ + ["\uCCEE", "\uCCEE"], /* Hangul Syllable */ + ["\uCCEF", "\uCCEF"], /* Hangul Syllable */ + ["\uCCF0", "\uCCF0"], /* Hangul Syllable */ + ["\uCCF1", "\uCCF1"], /* Hangul Syllable */ + ["\uCCF2", "\uCCF2"], /* Hangul Syllable */ + ["\uCCF3", "\uCCF3"], /* Hangul Syllable */ + ["\uCCF4", "\uCCF4"], /* Hangul Syllable */ + ["\uCCF5", "\uCCF5"], /* Hangul Syllable */ + ["\uCCF6", "\uCCF6"], /* Hangul Syllable */ + ["\uCCF7", "\uCCF7"], /* Hangul Syllable */ + ["\uCCF8", "\uCCF8"], /* Hangul Syllable */ + ["\uCCF9", "\uCCF9"], /* Hangul Syllable */ + ["\uCCFA", "\uCCFA"], /* Hangul Syllable */ + ["\uCCFB", "\uCCFB"], /* Hangul Syllable */ + ["\uCCFC", "\uCCFC"], /* Hangul Syllable */ + ["\uCCFD", "\uCCFD"], /* Hangul Syllable */ + ["\uCCFE", "\uCCFE"], /* Hangul Syllable */ + ["\uCCFF", "\uCCFF"], /* Hangul Syllable */ + ["\uCD00", "\uCD00"], /* Hangul Syllable */ + ["\uCD01", "\uCD01"], /* Hangul Syllable */ + ["\uCD02", "\uCD02"], /* Hangul Syllable */ + ["\uCD03", "\uCD03"], /* Hangul Syllable */ + ["\uCD04", "\uCD04"], /* Hangul Syllable */ + ["\uCD05", "\uCD05"], /* Hangul Syllable */ + ["\uCD06", "\uCD06"], /* Hangul Syllable */ + ["\uCD07", "\uCD07"], /* Hangul Syllable */ + ["\uCD08", "\uCD08"], /* Hangul Syllable */ + ["\uCD09", "\uCD09"], /* Hangul Syllable */ + ["\uCD0A", "\uCD0A"], /* Hangul Syllable */ + ["\uCD0B", "\uCD0B"], /* Hangul Syllable */ + ["\uCD0C", "\uCD0C"], /* Hangul Syllable */ + ["\uCD0D", "\uCD0D"], /* Hangul Syllable */ + ["\uCD0E", "\uCD0E"], /* Hangul Syllable */ + ["\uCD0F", "\uCD0F"], /* Hangul Syllable */ + ["\uCD10", "\uCD10"], /* Hangul Syllable */ + ["\uCD11", "\uCD11"], /* Hangul Syllable */ + ["\uCD12", "\uCD12"], /* Hangul Syllable */ + ["\uCD13", "\uCD13"], /* Hangul Syllable */ + ["\uCD14", "\uCD14"], /* Hangul Syllable */ + ["\uCD15", "\uCD15"], /* Hangul Syllable */ + ["\uCD16", "\uCD16"], /* Hangul Syllable */ + ["\uCD17", "\uCD17"], /* Hangul Syllable */ + ["\uCD18", "\uCD18"], /* Hangul Syllable */ + ["\uCD19", "\uCD19"], /* Hangul Syllable */ + ["\uCD1A", "\uCD1A"], /* Hangul Syllable */ + ["\uCD1B", "\uCD1B"], /* Hangul Syllable */ + ["\uCD1C", "\uCD1C"], /* Hangul Syllable */ + ["\uCD1D", "\uCD1D"], /* Hangul Syllable */ + ["\uCD1E", "\uCD1E"], /* Hangul Syllable */ + ["\uCD1F", "\uCD1F"], /* Hangul Syllable */ + ["\uCD20", "\uCD20"], /* Hangul Syllable */ + ["\uCD21", "\uCD21"], /* Hangul Syllable */ + ["\uCD22", "\uCD22"], /* Hangul Syllable */ + ["\uCD23", "\uCD23"], /* Hangul Syllable */ + ["\uCD24", "\uCD24"], /* Hangul Syllable */ + ["\uCD25", "\uCD25"], /* Hangul Syllable */ + ["\uCD26", "\uCD26"], /* Hangul Syllable */ + ["\uCD27", "\uCD27"], /* Hangul Syllable */ + ["\uCD28", "\uCD28"], /* Hangul Syllable */ + ["\uCD29", "\uCD29"], /* Hangul Syllable */ + ["\uCD2A", "\uCD2A"], /* Hangul Syllable */ + ["\uCD2B", "\uCD2B"], /* Hangul Syllable */ + ["\uCD2C", "\uCD2C"], /* Hangul Syllable */ + ["\uCD2D", "\uCD2D"], /* Hangul Syllable */ + ["\uCD2E", "\uCD2E"], /* Hangul Syllable */ + ["\uCD2F", "\uCD2F"], /* Hangul Syllable */ + ["\uCD30", "\uCD30"], /* Hangul Syllable */ + ["\uCD31", "\uCD31"], /* Hangul Syllable */ + ["\uCD32", "\uCD32"], /* Hangul Syllable */ + ["\uCD33", "\uCD33"], /* Hangul Syllable */ + ["\uCD34", "\uCD34"], /* Hangul Syllable */ + ["\uCD35", "\uCD35"], /* Hangul Syllable */ + ["\uCD36", "\uCD36"], /* Hangul Syllable */ + ["\uCD37", "\uCD37"], /* Hangul Syllable */ + ["\uCD38", "\uCD38"], /* Hangul Syllable */ + ["\uCD39", "\uCD39"], /* Hangul Syllable */ + ["\uCD3A", "\uCD3A"], /* Hangul Syllable */ + ["\uCD3B", "\uCD3B"], /* Hangul Syllable */ + ["\uCD3C", "\uCD3C"], /* Hangul Syllable */ + ["\uCD3D", "\uCD3D"], /* Hangul Syllable */ + ["\uCD3E", "\uCD3E"], /* Hangul Syllable */ + ["\uCD3F", "\uCD3F"], /* Hangul Syllable */ + ["\uCD40", "\uCD40"], /* Hangul Syllable */ + ["\uCD41", "\uCD41"], /* Hangul Syllable */ + ["\uCD42", "\uCD42"], /* Hangul Syllable */ + ["\uCD43", "\uCD43"], /* Hangul Syllable */ + ["\uCD44", "\uCD44"], /* Hangul Syllable */ + ["\uCD45", "\uCD45"], /* Hangul Syllable */ + ["\uCD46", "\uCD46"], /* Hangul Syllable */ + ["\uCD47", "\uCD47"], /* Hangul Syllable */ + ["\uCD48", "\uCD48"], /* Hangul Syllable */ + ["\uCD49", "\uCD49"], /* Hangul Syllable */ + ["\uCD4A", "\uCD4A"], /* Hangul Syllable */ + ["\uCD4B", "\uCD4B"], /* Hangul Syllable */ + ["\uCD4C", "\uCD4C"], /* Hangul Syllable */ + ["\uCD4D", "\uCD4D"], /* Hangul Syllable */ + ["\uCD4E", "\uCD4E"], /* Hangul Syllable */ + ["\uCD4F", "\uCD4F"], /* Hangul Syllable */ + ["\uCD50", "\uCD50"], /* Hangul Syllable */ + ["\uCD51", "\uCD51"], /* Hangul Syllable */ + ["\uCD52", "\uCD52"], /* Hangul Syllable */ + ["\uCD53", "\uCD53"], /* Hangul Syllable */ + ["\uCD54", "\uCD54"], /* Hangul Syllable */ + ["\uCD55", "\uCD55"], /* Hangul Syllable */ + ["\uCD56", "\uCD56"], /* Hangul Syllable */ + ["\uCD57", "\uCD57"], /* Hangul Syllable */ + ["\uCD58", "\uCD58"], /* Hangul Syllable */ + ["\uCD59", "\uCD59"], /* Hangul Syllable */ + ["\uCD5A", "\uCD5A"], /* Hangul Syllable */ + ["\uCD5B", "\uCD5B"], /* Hangul Syllable */ + ["\uCD5C", "\uCD5C"], /* Hangul Syllable */ + ["\uCD5D", "\uCD5D"], /* Hangul Syllable */ + ["\uCD5E", "\uCD5E"], /* Hangul Syllable */ + ["\uCD5F", "\uCD5F"], /* Hangul Syllable */ + ["\uCD60", "\uCD60"], /* Hangul Syllable */ + ["\uCD61", "\uCD61"], /* Hangul Syllable */ + ["\uCD62", "\uCD62"], /* Hangul Syllable */ + ["\uCD63", "\uCD63"], /* Hangul Syllable */ + ["\uCD64", "\uCD64"], /* Hangul Syllable */ + ["\uCD65", "\uCD65"], /* Hangul Syllable */ + ["\uCD66", "\uCD66"], /* Hangul Syllable */ + ["\uCD67", "\uCD67"], /* Hangul Syllable */ + ["\uCD68", "\uCD68"], /* Hangul Syllable */ + ["\uCD69", "\uCD69"], /* Hangul Syllable */ + ["\uCD6A", "\uCD6A"], /* Hangul Syllable */ + ["\uCD6B", "\uCD6B"], /* Hangul Syllable */ + ["\uCD6C", "\uCD6C"], /* Hangul Syllable */ + ["\uCD6D", "\uCD6D"], /* Hangul Syllable */ + ["\uCD6E", "\uCD6E"], /* Hangul Syllable */ + ["\uCD6F", "\uCD6F"], /* Hangul Syllable */ + ["\uCD70", "\uCD70"], /* Hangul Syllable */ + ["\uCD71", "\uCD71"], /* Hangul Syllable */ + ["\uCD72", "\uCD72"], /* Hangul Syllable */ + ["\uCD73", "\uCD73"], /* Hangul Syllable */ + ["\uCD74", "\uCD74"], /* Hangul Syllable */ + ["\uCD75", "\uCD75"], /* Hangul Syllable */ + ["\uCD76", "\uCD76"], /* Hangul Syllable */ + ["\uCD77", "\uCD77"], /* Hangul Syllable */ + ["\uCD78", "\uCD78"], /* Hangul Syllable */ + ["\uCD79", "\uCD79"], /* Hangul Syllable */ + ["\uCD7A", "\uCD7A"], /* Hangul Syllable */ + ["\uCD7B", "\uCD7B"], /* Hangul Syllable */ + ["\uCD7C", "\uCD7C"], /* Hangul Syllable */ + ["\uCD7D", "\uCD7D"], /* Hangul Syllable */ + ["\uCD7E", "\uCD7E"], /* Hangul Syllable */ + ["\uCD7F", "\uCD7F"], /* Hangul Syllable */ + ["\uCD80", "\uCD80"], /* Hangul Syllable */ + ["\uCD81", "\uCD81"], /* Hangul Syllable */ + ["\uCD82", "\uCD82"], /* Hangul Syllable */ + ["\uCD83", "\uCD83"], /* Hangul Syllable */ + ["\uCD84", "\uCD84"], /* Hangul Syllable */ + ["\uCD85", "\uCD85"], /* Hangul Syllable */ + ["\uCD86", "\uCD86"], /* Hangul Syllable */ + ["\uCD87", "\uCD87"], /* Hangul Syllable */ + ["\uCD88", "\uCD88"], /* Hangul Syllable */ + ["\uCD89", "\uCD89"], /* Hangul Syllable */ + ["\uCD8A", "\uCD8A"], /* Hangul Syllable */ + ["\uCD8B", "\uCD8B"], /* Hangul Syllable */ + ["\uCD8C", "\uCD8C"], /* Hangul Syllable */ + ["\uCD8D", "\uCD8D"], /* Hangul Syllable */ + ["\uCD8E", "\uCD8E"], /* Hangul Syllable */ + ["\uCD8F", "\uCD8F"], /* Hangul Syllable */ + ["\uCD90", "\uCD90"], /* Hangul Syllable */ + ["\uCD91", "\uCD91"], /* Hangul Syllable */ + ["\uCD92", "\uCD92"], /* Hangul Syllable */ + ["\uCD93", "\uCD93"], /* Hangul Syllable */ + ["\uCD94", "\uCD94"], /* Hangul Syllable */ + ["\uCD95", "\uCD95"], /* Hangul Syllable */ + ["\uCD96", "\uCD96"], /* Hangul Syllable */ + ["\uCD97", "\uCD97"], /* Hangul Syllable */ + ["\uCD98", "\uCD98"], /* Hangul Syllable */ + ["\uCD99", "\uCD99"], /* Hangul Syllable */ + ["\uCD9A", "\uCD9A"], /* Hangul Syllable */ + ["\uCD9B", "\uCD9B"], /* Hangul Syllable */ + ["\uCD9C", "\uCD9C"], /* Hangul Syllable */ + ["\uCD9D", "\uCD9D"], /* Hangul Syllable */ + ["\uCD9E", "\uCD9E"], /* Hangul Syllable */ + ["\uCD9F", "\uCD9F"], /* Hangul Syllable */ + ["\uCDA0", "\uCDA0"], /* Hangul Syllable */ + ["\uCDA1", "\uCDA1"], /* Hangul Syllable */ + ["\uCDA2", "\uCDA2"], /* Hangul Syllable */ + ["\uCDA3", "\uCDA3"], /* Hangul Syllable */ + ["\uCDA4", "\uCDA4"], /* Hangul Syllable */ + ["\uCDA5", "\uCDA5"], /* Hangul Syllable */ + ["\uCDA6", "\uCDA6"], /* Hangul Syllable */ + ["\uCDA7", "\uCDA7"], /* Hangul Syllable */ + ["\uCDA8", "\uCDA8"], /* Hangul Syllable */ + ["\uCDA9", "\uCDA9"], /* Hangul Syllable */ + ["\uCDAA", "\uCDAA"], /* Hangul Syllable */ + ["\uCDAB", "\uCDAB"], /* Hangul Syllable */ + ["\uCDAC", "\uCDAC"], /* Hangul Syllable */ + ["\uCDAD", "\uCDAD"], /* Hangul Syllable */ + ["\uCDAE", "\uCDAE"], /* Hangul Syllable */ + ["\uCDAF", "\uCDAF"], /* Hangul Syllable */ + ["\uCDB0", "\uCDB0"], /* Hangul Syllable */ + ["\uCDB1", "\uCDB1"], /* Hangul Syllable */ + ["\uCDB2", "\uCDB2"], /* Hangul Syllable */ + ["\uCDB3", "\uCDB3"], /* Hangul Syllable */ + ["\uCDB4", "\uCDB4"], /* Hangul Syllable */ + ["\uCDB5", "\uCDB5"], /* Hangul Syllable */ + ["\uCDB6", "\uCDB6"], /* Hangul Syllable */ + ["\uCDB7", "\uCDB7"], /* Hangul Syllable */ + ["\uCDB8", "\uCDB8"], /* Hangul Syllable */ + ["\uCDB9", "\uCDB9"], /* Hangul Syllable */ + ["\uCDBA", "\uCDBA"], /* Hangul Syllable */ + ["\uCDBB", "\uCDBB"], /* Hangul Syllable */ + ["\uCDBC", "\uCDBC"], /* Hangul Syllable */ + ["\uCDBD", "\uCDBD"], /* Hangul Syllable */ + ["\uCDBE", "\uCDBE"], /* Hangul Syllable */ + ["\uCDBF", "\uCDBF"], /* Hangul Syllable */ + ["\uCDC0", "\uCDC0"], /* Hangul Syllable */ + ["\uCDC1", "\uCDC1"], /* Hangul Syllable */ + ["\uCDC2", "\uCDC2"], /* Hangul Syllable */ + ["\uCDC3", "\uCDC3"], /* Hangul Syllable */ + ["\uCDC4", "\uCDC4"], /* Hangul Syllable */ + ["\uCDC5", "\uCDC5"], /* Hangul Syllable */ + ["\uCDC6", "\uCDC6"], /* Hangul Syllable */ + ["\uCDC7", "\uCDC7"], /* Hangul Syllable */ + ["\uCDC8", "\uCDC8"], /* Hangul Syllable */ + ["\uCDC9", "\uCDC9"], /* Hangul Syllable */ + ["\uCDCA", "\uCDCA"], /* Hangul Syllable */ + ["\uCDCB", "\uCDCB"], /* Hangul Syllable */ + ["\uCDCC", "\uCDCC"], /* Hangul Syllable */ + ["\uCDCD", "\uCDCD"], /* Hangul Syllable */ + ["\uCDCE", "\uCDCE"], /* Hangul Syllable */ + ["\uCDCF", "\uCDCF"], /* Hangul Syllable */ + ["\uCDD0", "\uCDD0"], /* Hangul Syllable */ + ["\uCDD1", "\uCDD1"], /* Hangul Syllable */ + ["\uCDD2", "\uCDD2"], /* Hangul Syllable */ + ["\uCDD3", "\uCDD3"], /* Hangul Syllable */ + ["\uCDD4", "\uCDD4"], /* Hangul Syllable */ + ["\uCDD5", "\uCDD5"], /* Hangul Syllable */ + ["\uCDD6", "\uCDD6"], /* Hangul Syllable */ + ["\uCDD7", "\uCDD7"], /* Hangul Syllable */ + ["\uCDD8", "\uCDD8"], /* Hangul Syllable */ + ["\uCDD9", "\uCDD9"], /* Hangul Syllable */ + ["\uCDDA", "\uCDDA"], /* Hangul Syllable */ + ["\uCDDB", "\uCDDB"], /* Hangul Syllable */ + ["\uCDDC", "\uCDDC"], /* Hangul Syllable */ + ["\uCDDD", "\uCDDD"], /* Hangul Syllable */ + ["\uCDDE", "\uCDDE"], /* Hangul Syllable */ + ["\uCDDF", "\uCDDF"], /* Hangul Syllable */ + ["\uCDE0", "\uCDE0"], /* Hangul Syllable */ + ["\uCDE1", "\uCDE1"], /* Hangul Syllable */ + ["\uCDE2", "\uCDE2"], /* Hangul Syllable */ + ["\uCDE3", "\uCDE3"], /* Hangul Syllable */ + ["\uCDE4", "\uCDE4"], /* Hangul Syllable */ + ["\uCDE5", "\uCDE5"], /* Hangul Syllable */ + ["\uCDE6", "\uCDE6"], /* Hangul Syllable */ + ["\uCDE7", "\uCDE7"], /* Hangul Syllable */ + ["\uCDE8", "\uCDE8"], /* Hangul Syllable */ + ["\uCDE9", "\uCDE9"], /* Hangul Syllable */ + ["\uCDEA", "\uCDEA"], /* Hangul Syllable */ + ["\uCDEB", "\uCDEB"], /* Hangul Syllable */ + ["\uCDEC", "\uCDEC"], /* Hangul Syllable */ + ["\uCDED", "\uCDED"], /* Hangul Syllable */ + ["\uCDEE", "\uCDEE"], /* Hangul Syllable */ + ["\uCDEF", "\uCDEF"], /* Hangul Syllable */ + ["\uCDF0", "\uCDF0"], /* Hangul Syllable */ + ["\uCDF1", "\uCDF1"], /* Hangul Syllable */ + ["\uCDF2", "\uCDF2"], /* Hangul Syllable */ + ["\uCDF3", "\uCDF3"], /* Hangul Syllable */ + ["\uCDF4", "\uCDF4"], /* Hangul Syllable */ + ["\uCDF5", "\uCDF5"], /* Hangul Syllable */ + ["\uCDF6", "\uCDF6"], /* Hangul Syllable */ + ["\uCDF7", "\uCDF7"], /* Hangul Syllable */ + ["\uCDF8", "\uCDF8"], /* Hangul Syllable */ + ["\uCDF9", "\uCDF9"], /* Hangul Syllable */ + ["\uCDFA", "\uCDFA"], /* Hangul Syllable */ + ["\uCDFB", "\uCDFB"], /* Hangul Syllable */ + ["\uCDFC", "\uCDFC"], /* Hangul Syllable */ + ["\uCDFD", "\uCDFD"], /* Hangul Syllable */ + ["\uCDFE", "\uCDFE"], /* Hangul Syllable */ + ["\uCDFF", "\uCDFF"], /* Hangul Syllable */ + ["\uCE00", "\uCE00"], /* Hangul Syllable */ + ["\uCE01", "\uCE01"], /* Hangul Syllable */ + ["\uCE02", "\uCE02"], /* Hangul Syllable */ + ["\uCE03", "\uCE03"], /* Hangul Syllable */ + ["\uCE04", "\uCE04"], /* Hangul Syllable */ + ["\uCE05", "\uCE05"], /* Hangul Syllable */ + ["\uCE06", "\uCE06"], /* Hangul Syllable */ + ["\uCE07", "\uCE07"], /* Hangul Syllable */ + ["\uCE08", "\uCE08"], /* Hangul Syllable */ + ["\uCE09", "\uCE09"], /* Hangul Syllable */ + ["\uCE0A", "\uCE0A"], /* Hangul Syllable */ + ["\uCE0B", "\uCE0B"], /* Hangul Syllable */ + ["\uCE0C", "\uCE0C"], /* Hangul Syllable */ + ["\uCE0D", "\uCE0D"], /* Hangul Syllable */ + ["\uCE0E", "\uCE0E"], /* Hangul Syllable */ + ["\uCE0F", "\uCE0F"], /* Hangul Syllable */ + ["\uCE10", "\uCE10"], /* Hangul Syllable */ + ["\uCE11", "\uCE11"], /* Hangul Syllable */ + ["\uCE12", "\uCE12"], /* Hangul Syllable */ + ["\uCE13", "\uCE13"], /* Hangul Syllable */ + ["\uCE14", "\uCE14"], /* Hangul Syllable */ + ["\uCE15", "\uCE15"], /* Hangul Syllable */ + ["\uCE16", "\uCE16"], /* Hangul Syllable */ + ["\uCE17", "\uCE17"], /* Hangul Syllable */ + ["\uCE18", "\uCE18"], /* Hangul Syllable */ + ["\uCE19", "\uCE19"], /* Hangul Syllable */ + ["\uCE1A", "\uCE1A"], /* Hangul Syllable */ + ["\uCE1B", "\uCE1B"], /* Hangul Syllable */ + ["\uCE1C", "\uCE1C"], /* Hangul Syllable */ + ["\uCE1D", "\uCE1D"], /* Hangul Syllable */ + ["\uCE1E", "\uCE1E"], /* Hangul Syllable */ + ["\uCE1F", "\uCE1F"], /* Hangul Syllable */ + ["\uCE20", "\uCE20"], /* Hangul Syllable */ + ["\uCE21", "\uCE21"], /* Hangul Syllable */ + ["\uCE22", "\uCE22"], /* Hangul Syllable */ + ["\uCE23", "\uCE23"], /* Hangul Syllable */ + ["\uCE24", "\uCE24"], /* Hangul Syllable */ + ["\uCE25", "\uCE25"], /* Hangul Syllable */ + ["\uCE26", "\uCE26"], /* Hangul Syllable */ + ["\uCE27", "\uCE27"], /* Hangul Syllable */ + ["\uCE28", "\uCE28"], /* Hangul Syllable */ + ["\uCE29", "\uCE29"], /* Hangul Syllable */ + ["\uCE2A", "\uCE2A"], /* Hangul Syllable */ + ["\uCE2B", "\uCE2B"], /* Hangul Syllable */ + ["\uCE2C", "\uCE2C"], /* Hangul Syllable */ + ["\uCE2D", "\uCE2D"], /* Hangul Syllable */ + ["\uCE2E", "\uCE2E"], /* Hangul Syllable */ + ["\uCE2F", "\uCE2F"], /* Hangul Syllable */ + ["\uCE30", "\uCE30"], /* Hangul Syllable */ + ["\uCE31", "\uCE31"], /* Hangul Syllable */ + ["\uCE32", "\uCE32"], /* Hangul Syllable */ + ["\uCE33", "\uCE33"], /* Hangul Syllable */ + ["\uCE34", "\uCE34"], /* Hangul Syllable */ + ["\uCE35", "\uCE35"], /* Hangul Syllable */ + ["\uCE36", "\uCE36"], /* Hangul Syllable */ + ["\uCE37", "\uCE37"], /* Hangul Syllable */ + ["\uCE38", "\uCE38"], /* Hangul Syllable */ + ["\uCE39", "\uCE39"], /* Hangul Syllable */ + ["\uCE3A", "\uCE3A"], /* Hangul Syllable */ + ["\uCE3B", "\uCE3B"], /* Hangul Syllable */ + ["\uCE3C", "\uCE3C"], /* Hangul Syllable */ + ["\uCE3D", "\uCE3D"], /* Hangul Syllable */ + ["\uCE3E", "\uCE3E"], /* Hangul Syllable */ + ["\uCE3F", "\uCE3F"], /* Hangul Syllable */ + ["\uCE40", "\uCE40"], /* Hangul Syllable */ + ["\uCE41", "\uCE41"], /* Hangul Syllable */ + ["\uCE42", "\uCE42"], /* Hangul Syllable */ + ["\uCE43", "\uCE43"], /* Hangul Syllable */ + ["\uCE44", "\uCE44"], /* Hangul Syllable */ + ["\uCE45", "\uCE45"], /* Hangul Syllable */ + ["\uCE46", "\uCE46"], /* Hangul Syllable */ + ["\uCE47", "\uCE47"], /* Hangul Syllable */ + ["\uCE48", "\uCE48"], /* Hangul Syllable */ + ["\uCE49", "\uCE49"], /* Hangul Syllable */ + ["\uCE4A", "\uCE4A"], /* Hangul Syllable */ + ["\uCE4B", "\uCE4B"], /* Hangul Syllable */ + ["\uCE4C", "\uCE4C"], /* Hangul Syllable */ + ["\uCE4D", "\uCE4D"], /* Hangul Syllable */ + ["\uCE4E", "\uCE4E"], /* Hangul Syllable */ + ["\uCE4F", "\uCE4F"], /* Hangul Syllable */ + ["\uCE50", "\uCE50"], /* Hangul Syllable */ + ["\uCE51", "\uCE51"], /* Hangul Syllable */ + ["\uCE52", "\uCE52"], /* Hangul Syllable */ + ["\uCE53", "\uCE53"], /* Hangul Syllable */ + ["\uCE54", "\uCE54"], /* Hangul Syllable */ + ["\uCE55", "\uCE55"], /* Hangul Syllable */ + ["\uCE56", "\uCE56"], /* Hangul Syllable */ + ["\uCE57", "\uCE57"], /* Hangul Syllable */ + ["\uCE58", "\uCE58"], /* Hangul Syllable */ + ["\uCE59", "\uCE59"], /* Hangul Syllable */ + ["\uCE5A", "\uCE5A"], /* Hangul Syllable */ + ["\uCE5B", "\uCE5B"], /* Hangul Syllable */ + ["\uCE5C", "\uCE5C"], /* Hangul Syllable */ + ["\uCE5D", "\uCE5D"], /* Hangul Syllable */ + ["\uCE5E", "\uCE5E"], /* Hangul Syllable */ + ["\uCE5F", "\uCE5F"], /* Hangul Syllable */ + ["\uCE60", "\uCE60"], /* Hangul Syllable */ + ["\uCE61", "\uCE61"], /* Hangul Syllable */ + ["\uCE62", "\uCE62"], /* Hangul Syllable */ + ["\uCE63", "\uCE63"], /* Hangul Syllable */ + ["\uCE64", "\uCE64"], /* Hangul Syllable */ + ["\uCE65", "\uCE65"], /* Hangul Syllable */ + ["\uCE66", "\uCE66"], /* Hangul Syllable */ + ["\uCE67", "\uCE67"], /* Hangul Syllable */ + ["\uCE68", "\uCE68"], /* Hangul Syllable */ + ["\uCE69", "\uCE69"], /* Hangul Syllable */ + ["\uCE6A", "\uCE6A"], /* Hangul Syllable */ + ["\uCE6B", "\uCE6B"], /* Hangul Syllable */ + ["\uCE6C", "\uCE6C"], /* Hangul Syllable */ + ["\uCE6D", "\uCE6D"], /* Hangul Syllable */ + ["\uCE6E", "\uCE6E"], /* Hangul Syllable */ + ["\uCE6F", "\uCE6F"], /* Hangul Syllable */ + ["\uCE70", "\uCE70"], /* Hangul Syllable */ + ["\uCE71", "\uCE71"], /* Hangul Syllable */ + ["\uCE72", "\uCE72"], /* Hangul Syllable */ + ["\uCE73", "\uCE73"], /* Hangul Syllable */ + ["\uCE74", "\uCE74"], /* Hangul Syllable */ + ["\uCE75", "\uCE75"], /* Hangul Syllable */ + ["\uCE76", "\uCE76"], /* Hangul Syllable */ + ["\uCE77", "\uCE77"], /* Hangul Syllable */ + ["\uCE78", "\uCE78"], /* Hangul Syllable */ + ["\uCE79", "\uCE79"], /* Hangul Syllable */ + ["\uCE7A", "\uCE7A"], /* Hangul Syllable */ + ["\uCE7B", "\uCE7B"], /* Hangul Syllable */ + ["\uCE7C", "\uCE7C"], /* Hangul Syllable */ + ["\uCE7D", "\uCE7D"], /* Hangul Syllable */ + ["\uCE7E", "\uCE7E"], /* Hangul Syllable */ + ["\uCE7F", "\uCE7F"], /* Hangul Syllable */ + ["\uCE80", "\uCE80"], /* Hangul Syllable */ + ["\uCE81", "\uCE81"], /* Hangul Syllable */ + ["\uCE82", "\uCE82"], /* Hangul Syllable */ + ["\uCE83", "\uCE83"], /* Hangul Syllable */ + ["\uCE84", "\uCE84"], /* Hangul Syllable */ + ["\uCE85", "\uCE85"], /* Hangul Syllable */ + ["\uCE86", "\uCE86"], /* Hangul Syllable */ + ["\uCE87", "\uCE87"], /* Hangul Syllable */ + ["\uCE88", "\uCE88"], /* Hangul Syllable */ + ["\uCE89", "\uCE89"], /* Hangul Syllable */ + ["\uCE8A", "\uCE8A"], /* Hangul Syllable */ + ["\uCE8B", "\uCE8B"], /* Hangul Syllable */ + ["\uCE8C", "\uCE8C"], /* Hangul Syllable */ + ["\uCE8D", "\uCE8D"], /* Hangul Syllable */ + ["\uCE8E", "\uCE8E"], /* Hangul Syllable */ + ["\uCE8F", "\uCE8F"], /* Hangul Syllable */ + ["\uCE90", "\uCE90"], /* Hangul Syllable */ + ["\uCE91", "\uCE91"], /* Hangul Syllable */ + ["\uCE92", "\uCE92"], /* Hangul Syllable */ + ["\uCE93", "\uCE93"], /* Hangul Syllable */ + ["\uCE94", "\uCE94"], /* Hangul Syllable */ + ["\uCE95", "\uCE95"], /* Hangul Syllable */ + ["\uCE96", "\uCE96"], /* Hangul Syllable */ + ["\uCE97", "\uCE97"], /* Hangul Syllable */ + ["\uCE98", "\uCE98"], /* Hangul Syllable */ + ["\uCE99", "\uCE99"], /* Hangul Syllable */ + ["\uCE9A", "\uCE9A"], /* Hangul Syllable */ + ["\uCE9B", "\uCE9B"], /* Hangul Syllable */ + ["\uCE9C", "\uCE9C"], /* Hangul Syllable */ + ["\uCE9D", "\uCE9D"], /* Hangul Syllable */ + ["\uCE9E", "\uCE9E"], /* Hangul Syllable */ + ["\uCE9F", "\uCE9F"], /* Hangul Syllable */ + ["\uCEA0", "\uCEA0"], /* Hangul Syllable */ + ["\uCEA1", "\uCEA1"], /* Hangul Syllable */ + ["\uCEA2", "\uCEA2"], /* Hangul Syllable */ + ["\uCEA3", "\uCEA3"], /* Hangul Syllable */ + ["\uCEA4", "\uCEA4"], /* Hangul Syllable */ + ["\uCEA5", "\uCEA5"], /* Hangul Syllable */ + ["\uCEA6", "\uCEA6"], /* Hangul Syllable */ + ["\uCEA7", "\uCEA7"], /* Hangul Syllable */ + ["\uCEA8", "\uCEA8"], /* Hangul Syllable */ + ["\uCEA9", "\uCEA9"], /* Hangul Syllable */ + ["\uCEAA", "\uCEAA"], /* Hangul Syllable */ + ["\uCEAB", "\uCEAB"], /* Hangul Syllable */ + ["\uCEAC", "\uCEAC"], /* Hangul Syllable */ + ["\uCEAD", "\uCEAD"], /* Hangul Syllable */ + ["\uCEAE", "\uCEAE"], /* Hangul Syllable */ + ["\uCEAF", "\uCEAF"], /* Hangul Syllable */ + ["\uCEB0", "\uCEB0"], /* Hangul Syllable */ + ["\uCEB1", "\uCEB1"], /* Hangul Syllable */ + ["\uCEB2", "\uCEB2"], /* Hangul Syllable */ + ["\uCEB3", "\uCEB3"], /* Hangul Syllable */ + ["\uCEB4", "\uCEB4"], /* Hangul Syllable */ + ["\uCEB5", "\uCEB5"], /* Hangul Syllable */ + ["\uCEB6", "\uCEB6"], /* Hangul Syllable */ + ["\uCEB7", "\uCEB7"], /* Hangul Syllable */ + ["\uCEB8", "\uCEB8"], /* Hangul Syllable */ + ["\uCEB9", "\uCEB9"], /* Hangul Syllable */ + ["\uCEBA", "\uCEBA"], /* Hangul Syllable */ + ["\uCEBB", "\uCEBB"], /* Hangul Syllable */ + ["\uCEBC", "\uCEBC"], /* Hangul Syllable */ + ["\uCEBD", "\uCEBD"], /* Hangul Syllable */ + ["\uCEBE", "\uCEBE"], /* Hangul Syllable */ + ["\uCEBF", "\uCEBF"], /* Hangul Syllable */ + ["\uCEC0", "\uCEC0"], /* Hangul Syllable */ + ["\uCEC1", "\uCEC1"], /* Hangul Syllable */ + ["\uCEC2", "\uCEC2"], /* Hangul Syllable */ + ["\uCEC3", "\uCEC3"], /* Hangul Syllable */ + ["\uCEC4", "\uCEC4"], /* Hangul Syllable */ + ["\uCEC5", "\uCEC5"], /* Hangul Syllable */ + ["\uCEC6", "\uCEC6"], /* Hangul Syllable */ + ["\uCEC7", "\uCEC7"], /* Hangul Syllable */ + ["\uCEC8", "\uCEC8"], /* Hangul Syllable */ + ["\uCEC9", "\uCEC9"], /* Hangul Syllable */ + ["\uCECA", "\uCECA"], /* Hangul Syllable */ + ["\uCECB", "\uCECB"], /* Hangul Syllable */ + ["\uCECC", "\uCECC"], /* Hangul Syllable */ + ["\uCECD", "\uCECD"], /* Hangul Syllable */ + ["\uCECE", "\uCECE"], /* Hangul Syllable */ + ["\uCECF", "\uCECF"], /* Hangul Syllable */ + ["\uCED0", "\uCED0"], /* Hangul Syllable */ + ["\uCED1", "\uCED1"], /* Hangul Syllable */ + ["\uCED2", "\uCED2"], /* Hangul Syllable */ + ["\uCED3", "\uCED3"], /* Hangul Syllable */ + ["\uCED4", "\uCED4"], /* Hangul Syllable */ + ["\uCED5", "\uCED5"], /* Hangul Syllable */ + ["\uCED6", "\uCED6"], /* Hangul Syllable */ + ["\uCED7", "\uCED7"], /* Hangul Syllable */ + ["\uCED8", "\uCED8"], /* Hangul Syllable */ + ["\uCED9", "\uCED9"], /* Hangul Syllable */ + ["\uCEDA", "\uCEDA"], /* Hangul Syllable */ + ["\uCEDB", "\uCEDB"], /* Hangul Syllable */ + ["\uCEDC", "\uCEDC"], /* Hangul Syllable */ + ["\uCEDD", "\uCEDD"], /* Hangul Syllable */ + ["\uCEDE", "\uCEDE"], /* Hangul Syllable */ + ["\uCEDF", "\uCEDF"], /* Hangul Syllable */ + ["\uCEE0", "\uCEE0"], /* Hangul Syllable */ + ["\uCEE1", "\uCEE1"], /* Hangul Syllable */ + ["\uCEE2", "\uCEE2"], /* Hangul Syllable */ + ["\uCEE3", "\uCEE3"], /* Hangul Syllable */ + ["\uCEE4", "\uCEE4"], /* Hangul Syllable */ + ["\uCEE5", "\uCEE5"], /* Hangul Syllable */ + ["\uCEE6", "\uCEE6"], /* Hangul Syllable */ + ["\uCEE7", "\uCEE7"], /* Hangul Syllable */ + ["\uCEE8", "\uCEE8"], /* Hangul Syllable */ + ["\uCEE9", "\uCEE9"], /* Hangul Syllable */ + ["\uCEEA", "\uCEEA"], /* Hangul Syllable */ + ["\uCEEB", "\uCEEB"], /* Hangul Syllable */ + ["\uCEEC", "\uCEEC"], /* Hangul Syllable */ + ["\uCEED", "\uCEED"], /* Hangul Syllable */ + ["\uCEEE", "\uCEEE"], /* Hangul Syllable */ + ["\uCEEF", "\uCEEF"], /* Hangul Syllable */ + ["\uCEF0", "\uCEF0"], /* Hangul Syllable */ + ["\uCEF1", "\uCEF1"], /* Hangul Syllable */ + ["\uCEF2", "\uCEF2"], /* Hangul Syllable */ + ["\uCEF3", "\uCEF3"], /* Hangul Syllable */ + ["\uCEF4", "\uCEF4"], /* Hangul Syllable */ + ["\uCEF5", "\uCEF5"], /* Hangul Syllable */ + ["\uCEF6", "\uCEF6"], /* Hangul Syllable */ + ["\uCEF7", "\uCEF7"], /* Hangul Syllable */ + ["\uCEF8", "\uCEF8"], /* Hangul Syllable */ + ["\uCEF9", "\uCEF9"], /* Hangul Syllable */ + ["\uCEFA", "\uCEFA"], /* Hangul Syllable */ + ["\uCEFB", "\uCEFB"], /* Hangul Syllable */ + ["\uCEFC", "\uCEFC"], /* Hangul Syllable */ + ["\uCEFD", "\uCEFD"], /* Hangul Syllable */ + ["\uCEFE", "\uCEFE"], /* Hangul Syllable */ + ["\uCEFF", "\uCEFF"], /* Hangul Syllable */ + ["\uCF00", "\uCF00"], /* Hangul Syllable */ + ["\uCF01", "\uCF01"], /* Hangul Syllable */ + ["\uCF02", "\uCF02"], /* Hangul Syllable */ + ["\uCF03", "\uCF03"], /* Hangul Syllable */ + ["\uCF04", "\uCF04"], /* Hangul Syllable */ + ["\uCF05", "\uCF05"], /* Hangul Syllable */ + ["\uCF06", "\uCF06"], /* Hangul Syllable */ + ["\uCF07", "\uCF07"], /* Hangul Syllable */ + ["\uCF08", "\uCF08"], /* Hangul Syllable */ + ["\uCF09", "\uCF09"], /* Hangul Syllable */ + ["\uCF0A", "\uCF0A"], /* Hangul Syllable */ + ["\uCF0B", "\uCF0B"], /* Hangul Syllable */ + ["\uCF0C", "\uCF0C"], /* Hangul Syllable */ + ["\uCF0D", "\uCF0D"], /* Hangul Syllable */ + ["\uCF0E", "\uCF0E"], /* Hangul Syllable */ + ["\uCF0F", "\uCF0F"], /* Hangul Syllable */ + ["\uCF10", "\uCF10"], /* Hangul Syllable */ + ["\uCF11", "\uCF11"], /* Hangul Syllable */ + ["\uCF12", "\uCF12"], /* Hangul Syllable */ + ["\uCF13", "\uCF13"], /* Hangul Syllable */ + ["\uCF14", "\uCF14"], /* Hangul Syllable */ + ["\uCF15", "\uCF15"], /* Hangul Syllable */ + ["\uCF16", "\uCF16"], /* Hangul Syllable */ + ["\uCF17", "\uCF17"], /* Hangul Syllable */ + ["\uCF18", "\uCF18"], /* Hangul Syllable */ + ["\uCF19", "\uCF19"], /* Hangul Syllable */ + ["\uCF1A", "\uCF1A"], /* Hangul Syllable */ + ["\uCF1B", "\uCF1B"], /* Hangul Syllable */ + ["\uCF1C", "\uCF1C"], /* Hangul Syllable */ + ["\uCF1D", "\uCF1D"], /* Hangul Syllable */ + ["\uCF1E", "\uCF1E"], /* Hangul Syllable */ + ["\uCF1F", "\uCF1F"], /* Hangul Syllable */ + ["\uCF20", "\uCF20"], /* Hangul Syllable */ + ["\uCF21", "\uCF21"], /* Hangul Syllable */ + ["\uCF22", "\uCF22"], /* Hangul Syllable */ + ["\uCF23", "\uCF23"], /* Hangul Syllable */ + ["\uCF24", "\uCF24"], /* Hangul Syllable */ + ["\uCF25", "\uCF25"], /* Hangul Syllable */ + ["\uCF26", "\uCF26"], /* Hangul Syllable */ + ["\uCF27", "\uCF27"], /* Hangul Syllable */ + ["\uCF28", "\uCF28"], /* Hangul Syllable */ + ["\uCF29", "\uCF29"], /* Hangul Syllable */ + ["\uCF2A", "\uCF2A"], /* Hangul Syllable */ + ["\uCF2B", "\uCF2B"], /* Hangul Syllable */ + ["\uCF2C", "\uCF2C"], /* Hangul Syllable */ + ["\uCF2D", "\uCF2D"], /* Hangul Syllable */ + ["\uCF2E", "\uCF2E"], /* Hangul Syllable */ + ["\uCF2F", "\uCF2F"], /* Hangul Syllable */ + ["\uCF30", "\uCF30"], /* Hangul Syllable */ + ["\uCF31", "\uCF31"], /* Hangul Syllable */ + ["\uCF32", "\uCF32"], /* Hangul Syllable */ + ["\uCF33", "\uCF33"], /* Hangul Syllable */ + ["\uCF34", "\uCF34"], /* Hangul Syllable */ + ["\uCF35", "\uCF35"], /* Hangul Syllable */ + ["\uCF36", "\uCF36"], /* Hangul Syllable */ + ["\uCF37", "\uCF37"], /* Hangul Syllable */ + ["\uCF38", "\uCF38"], /* Hangul Syllable */ + ["\uCF39", "\uCF39"], /* Hangul Syllable */ + ["\uCF3A", "\uCF3A"], /* Hangul Syllable */ + ["\uCF3B", "\uCF3B"], /* Hangul Syllable */ + ["\uCF3C", "\uCF3C"], /* Hangul Syllable */ + ["\uCF3D", "\uCF3D"], /* Hangul Syllable */ + ["\uCF3E", "\uCF3E"], /* Hangul Syllable */ + ["\uCF3F", "\uCF3F"], /* Hangul Syllable */ + ["\uCF40", "\uCF40"], /* Hangul Syllable */ + ["\uCF41", "\uCF41"], /* Hangul Syllable */ + ["\uCF42", "\uCF42"], /* Hangul Syllable */ + ["\uCF43", "\uCF43"], /* Hangul Syllable */ + ["\uCF44", "\uCF44"], /* Hangul Syllable */ + ["\uCF45", "\uCF45"], /* Hangul Syllable */ + ["\uCF46", "\uCF46"], /* Hangul Syllable */ + ["\uCF47", "\uCF47"], /* Hangul Syllable */ + ["\uCF48", "\uCF48"], /* Hangul Syllable */ + ["\uCF49", "\uCF49"], /* Hangul Syllable */ + ["\uCF4A", "\uCF4A"], /* Hangul Syllable */ + ["\uCF4B", "\uCF4B"], /* Hangul Syllable */ + ["\uCF4C", "\uCF4C"], /* Hangul Syllable */ + ["\uCF4D", "\uCF4D"], /* Hangul Syllable */ + ["\uCF4E", "\uCF4E"], /* Hangul Syllable */ + ["\uCF4F", "\uCF4F"], /* Hangul Syllable */ + ["\uCF50", "\uCF50"], /* Hangul Syllable */ + ["\uCF51", "\uCF51"], /* Hangul Syllable */ + ["\uCF52", "\uCF52"], /* Hangul Syllable */ + ["\uCF53", "\uCF53"], /* Hangul Syllable */ + ["\uCF54", "\uCF54"], /* Hangul Syllable */ + ["\uCF55", "\uCF55"], /* Hangul Syllable */ + ["\uCF56", "\uCF56"], /* Hangul Syllable */ + ["\uCF57", "\uCF57"], /* Hangul Syllable */ + ["\uCF58", "\uCF58"], /* Hangul Syllable */ + ["\uCF59", "\uCF59"], /* Hangul Syllable */ + ["\uCF5A", "\uCF5A"], /* Hangul Syllable */ + ["\uCF5B", "\uCF5B"], /* Hangul Syllable */ + ["\uCF5C", "\uCF5C"], /* Hangul Syllable */ + ["\uCF5D", "\uCF5D"], /* Hangul Syllable */ + ["\uCF5E", "\uCF5E"], /* Hangul Syllable */ + ["\uCF5F", "\uCF5F"], /* Hangul Syllable */ + ["\uCF60", "\uCF60"], /* Hangul Syllable */ + ["\uCF61", "\uCF61"], /* Hangul Syllable */ + ["\uCF62", "\uCF62"], /* Hangul Syllable */ + ["\uCF63", "\uCF63"], /* Hangul Syllable */ + ["\uCF64", "\uCF64"], /* Hangul Syllable */ + ["\uCF65", "\uCF65"], /* Hangul Syllable */ + ["\uCF66", "\uCF66"], /* Hangul Syllable */ + ["\uCF67", "\uCF67"], /* Hangul Syllable */ + ["\uCF68", "\uCF68"], /* Hangul Syllable */ + ["\uCF69", "\uCF69"], /* Hangul Syllable */ + ["\uCF6A", "\uCF6A"], /* Hangul Syllable */ + ["\uCF6B", "\uCF6B"], /* Hangul Syllable */ + ["\uCF6C", "\uCF6C"], /* Hangul Syllable */ + ["\uCF6D", "\uCF6D"], /* Hangul Syllable */ + ["\uCF6E", "\uCF6E"], /* Hangul Syllable */ + ["\uCF6F", "\uCF6F"], /* Hangul Syllable */ + ["\uCF70", "\uCF70"], /* Hangul Syllable */ + ["\uCF71", "\uCF71"], /* Hangul Syllable */ + ["\uCF72", "\uCF72"], /* Hangul Syllable */ + ["\uCF73", "\uCF73"], /* Hangul Syllable */ + ["\uCF74", "\uCF74"], /* Hangul Syllable */ + ["\uCF75", "\uCF75"], /* Hangul Syllable */ + ["\uCF76", "\uCF76"], /* Hangul Syllable */ + ["\uCF77", "\uCF77"], /* Hangul Syllable */ + ["\uCF78", "\uCF78"], /* Hangul Syllable */ + ["\uCF79", "\uCF79"], /* Hangul Syllable */ + ["\uCF7A", "\uCF7A"], /* Hangul Syllable */ + ["\uCF7B", "\uCF7B"], /* Hangul Syllable */ + ["\uCF7C", "\uCF7C"], /* Hangul Syllable */ + ["\uCF7D", "\uCF7D"], /* Hangul Syllable */ + ["\uCF7E", "\uCF7E"], /* Hangul Syllable */ + ["\uCF7F", "\uCF7F"], /* Hangul Syllable */ + ["\uCF80", "\uCF80"], /* Hangul Syllable */ + ["\uCF81", "\uCF81"], /* Hangul Syllable */ + ["\uCF82", "\uCF82"], /* Hangul Syllable */ + ["\uCF83", "\uCF83"], /* Hangul Syllable */ + ["\uCF84", "\uCF84"], /* Hangul Syllable */ + ["\uCF85", "\uCF85"], /* Hangul Syllable */ + ["\uCF86", "\uCF86"], /* Hangul Syllable */ + ["\uCF87", "\uCF87"], /* Hangul Syllable */ + ["\uCF88", "\uCF88"], /* Hangul Syllable */ + ["\uCF89", "\uCF89"], /* Hangul Syllable */ + ["\uCF8A", "\uCF8A"], /* Hangul Syllable */ + ["\uCF8B", "\uCF8B"], /* Hangul Syllable */ + ["\uCF8C", "\uCF8C"], /* Hangul Syllable */ + ["\uCF8D", "\uCF8D"], /* Hangul Syllable */ + ["\uCF8E", "\uCF8E"], /* Hangul Syllable */ + ["\uCF8F", "\uCF8F"], /* Hangul Syllable */ + ["\uCF90", "\uCF90"], /* Hangul Syllable */ + ["\uCF91", "\uCF91"], /* Hangul Syllable */ + ["\uCF92", "\uCF92"], /* Hangul Syllable */ + ["\uCF93", "\uCF93"], /* Hangul Syllable */ + ["\uCF94", "\uCF94"], /* Hangul Syllable */ + ["\uCF95", "\uCF95"], /* Hangul Syllable */ + ["\uCF96", "\uCF96"], /* Hangul Syllable */ + ["\uCF97", "\uCF97"], /* Hangul Syllable */ + ["\uCF98", "\uCF98"], /* Hangul Syllable */ + ["\uCF99", "\uCF99"], /* Hangul Syllable */ + ["\uCF9A", "\uCF9A"], /* Hangul Syllable */ + ["\uCF9B", "\uCF9B"], /* Hangul Syllable */ + ["\uCF9C", "\uCF9C"], /* Hangul Syllable */ + ["\uCF9D", "\uCF9D"], /* Hangul Syllable */ + ["\uCF9E", "\uCF9E"], /* Hangul Syllable */ + ["\uCF9F", "\uCF9F"], /* Hangul Syllable */ + ["\uCFA0", "\uCFA0"], /* Hangul Syllable */ + ["\uCFA1", "\uCFA1"], /* Hangul Syllable */ + ["\uCFA2", "\uCFA2"], /* Hangul Syllable */ + ["\uCFA3", "\uCFA3"], /* Hangul Syllable */ + ["\uCFA4", "\uCFA4"], /* Hangul Syllable */ + ["\uCFA5", "\uCFA5"], /* Hangul Syllable */ + ["\uCFA6", "\uCFA6"], /* Hangul Syllable */ + ["\uCFA7", "\uCFA7"], /* Hangul Syllable */ + ["\uCFA8", "\uCFA8"], /* Hangul Syllable */ + ["\uCFA9", "\uCFA9"], /* Hangul Syllable */ + ["\uCFAA", "\uCFAA"], /* Hangul Syllable */ + ["\uCFAB", "\uCFAB"], /* Hangul Syllable */ + ["\uCFAC", "\uCFAC"], /* Hangul Syllable */ + ["\uCFAD", "\uCFAD"], /* Hangul Syllable */ + ["\uCFAE", "\uCFAE"], /* Hangul Syllable */ + ["\uCFAF", "\uCFAF"], /* Hangul Syllable */ + ["\uCFB0", "\uCFB0"], /* Hangul Syllable */ + ["\uCFB1", "\uCFB1"], /* Hangul Syllable */ + ["\uCFB2", "\uCFB2"], /* Hangul Syllable */ + ["\uCFB3", "\uCFB3"], /* Hangul Syllable */ + ["\uCFB4", "\uCFB4"], /* Hangul Syllable */ + ["\uCFB5", "\uCFB5"], /* Hangul Syllable */ + ["\uCFB6", "\uCFB6"], /* Hangul Syllable */ + ["\uCFB7", "\uCFB7"], /* Hangul Syllable */ + ["\uCFB8", "\uCFB8"], /* Hangul Syllable */ + ["\uCFB9", "\uCFB9"], /* Hangul Syllable */ + ["\uCFBA", "\uCFBA"], /* Hangul Syllable */ + ["\uCFBB", "\uCFBB"], /* Hangul Syllable */ + ["\uCFBC", "\uCFBC"], /* Hangul Syllable */ + ["\uCFBD", "\uCFBD"], /* Hangul Syllable */ + ["\uCFBE", "\uCFBE"], /* Hangul Syllable */ + ["\uCFBF", "\uCFBF"], /* Hangul Syllable */ + ["\uCFC0", "\uCFC0"], /* Hangul Syllable */ + ["\uCFC1", "\uCFC1"], /* Hangul Syllable */ + ["\uCFC2", "\uCFC2"], /* Hangul Syllable */ + ["\uCFC3", "\uCFC3"], /* Hangul Syllable */ + ["\uCFC4", "\uCFC4"], /* Hangul Syllable */ + ["\uCFC5", "\uCFC5"], /* Hangul Syllable */ + ["\uCFC6", "\uCFC6"], /* Hangul Syllable */ + ["\uCFC7", "\uCFC7"], /* Hangul Syllable */ + ["\uCFC8", "\uCFC8"], /* Hangul Syllable */ + ["\uCFC9", "\uCFC9"], /* Hangul Syllable */ + ["\uCFCA", "\uCFCA"], /* Hangul Syllable */ + ["\uCFCB", "\uCFCB"], /* Hangul Syllable */ + ["\uCFCC", "\uCFCC"], /* Hangul Syllable */ + ["\uCFCD", "\uCFCD"], /* Hangul Syllable */ + ["\uCFCE", "\uCFCE"], /* Hangul Syllable */ + ["\uCFCF", "\uCFCF"], /* Hangul Syllable */ + ["\uCFD0", "\uCFD0"], /* Hangul Syllable */ + ["\uCFD1", "\uCFD1"], /* Hangul Syllable */ + ["\uCFD2", "\uCFD2"], /* Hangul Syllable */ + ["\uCFD3", "\uCFD3"], /* Hangul Syllable */ + ["\uCFD4", "\uCFD4"], /* Hangul Syllable */ + ["\uCFD5", "\uCFD5"], /* Hangul Syllable */ + ["\uCFD6", "\uCFD6"], /* Hangul Syllable */ + ["\uCFD7", "\uCFD7"], /* Hangul Syllable */ + ["\uCFD8", "\uCFD8"], /* Hangul Syllable */ + ["\uCFD9", "\uCFD9"], /* Hangul Syllable */ + ["\uCFDA", "\uCFDA"], /* Hangul Syllable */ + ["\uCFDB", "\uCFDB"], /* Hangul Syllable */ + ["\uCFDC", "\uCFDC"], /* Hangul Syllable */ + ["\uCFDD", "\uCFDD"], /* Hangul Syllable */ + ["\uCFDE", "\uCFDE"], /* Hangul Syllable */ + ["\uCFDF", "\uCFDF"], /* Hangul Syllable */ + ["\uCFE0", "\uCFE0"], /* Hangul Syllable */ + ["\uCFE1", "\uCFE1"], /* Hangul Syllable */ + ["\uCFE2", "\uCFE2"], /* Hangul Syllable */ + ["\uCFE3", "\uCFE3"], /* Hangul Syllable */ + ["\uCFE4", "\uCFE4"], /* Hangul Syllable */ + ["\uCFE5", "\uCFE5"], /* Hangul Syllable */ + ["\uCFE6", "\uCFE6"], /* Hangul Syllable */ + ["\uCFE7", "\uCFE7"], /* Hangul Syllable */ + ["\uCFE8", "\uCFE8"], /* Hangul Syllable */ + ["\uCFE9", "\uCFE9"], /* Hangul Syllable */ + ["\uCFEA", "\uCFEA"], /* Hangul Syllable */ + ["\uCFEB", "\uCFEB"], /* Hangul Syllable */ + ["\uCFEC", "\uCFEC"], /* Hangul Syllable */ + ["\uCFED", "\uCFED"], /* Hangul Syllable */ + ["\uCFEE", "\uCFEE"], /* Hangul Syllable */ + ["\uCFEF", "\uCFEF"], /* Hangul Syllable */ + ["\uCFF0", "\uCFF0"], /* Hangul Syllable */ + ["\uCFF1", "\uCFF1"], /* Hangul Syllable */ + ["\uCFF2", "\uCFF2"], /* Hangul Syllable */ + ["\uCFF3", "\uCFF3"], /* Hangul Syllable */ + ["\uCFF4", "\uCFF4"], /* Hangul Syllable */ + ["\uCFF5", "\uCFF5"], /* Hangul Syllable */ + ["\uCFF6", "\uCFF6"], /* Hangul Syllable */ + ["\uCFF7", "\uCFF7"], /* Hangul Syllable */ + ["\uCFF8", "\uCFF8"], /* Hangul Syllable */ + ["\uCFF9", "\uCFF9"], /* Hangul Syllable */ + ["\uCFFA", "\uCFFA"], /* Hangul Syllable */ + ["\uCFFB", "\uCFFB"], /* Hangul Syllable */ + ["\uCFFC", "\uCFFC"], /* Hangul Syllable */ + ["\uCFFD", "\uCFFD"], /* Hangul Syllable */ + ["\uCFFE", "\uCFFE"], /* Hangul Syllable */ + ["\uCFFF", "\uCFFF"], /* Hangul Syllable */ + ["\uD000", "\uD000"], /* Hangul Syllable */ + ["\uD001", "\uD001"], /* Hangul Syllable */ + ["\uD002", "\uD002"], /* Hangul Syllable */ + ["\uD003", "\uD003"], /* Hangul Syllable */ + ["\uD004", "\uD004"], /* Hangul Syllable */ + ["\uD005", "\uD005"], /* Hangul Syllable */ + ["\uD006", "\uD006"], /* Hangul Syllable */ + ["\uD007", "\uD007"], /* Hangul Syllable */ + ["\uD008", "\uD008"], /* Hangul Syllable */ + ["\uD009", "\uD009"], /* Hangul Syllable */ + ["\uD00A", "\uD00A"], /* Hangul Syllable */ + ["\uD00B", "\uD00B"], /* Hangul Syllable */ + ["\uD00C", "\uD00C"], /* Hangul Syllable */ + ["\uD00D", "\uD00D"], /* Hangul Syllable */ + ["\uD00E", "\uD00E"], /* Hangul Syllable */ + ["\uD00F", "\uD00F"], /* Hangul Syllable */ + ["\uD010", "\uD010"], /* Hangul Syllable */ + ["\uD011", "\uD011"], /* Hangul Syllable */ + ["\uD012", "\uD012"], /* Hangul Syllable */ + ["\uD013", "\uD013"], /* Hangul Syllable */ + ["\uD014", "\uD014"], /* Hangul Syllable */ + ["\uD015", "\uD015"], /* Hangul Syllable */ + ["\uD016", "\uD016"], /* Hangul Syllable */ + ["\uD017", "\uD017"], /* Hangul Syllable */ + ["\uD018", "\uD018"], /* Hangul Syllable */ + ["\uD019", "\uD019"], /* Hangul Syllable */ + ["\uD01A", "\uD01A"], /* Hangul Syllable */ + ["\uD01B", "\uD01B"], /* Hangul Syllable */ + ["\uD01C", "\uD01C"], /* Hangul Syllable */ + ["\uD01D", "\uD01D"], /* Hangul Syllable */ + ["\uD01E", "\uD01E"], /* Hangul Syllable */ + ["\uD01F", "\uD01F"], /* Hangul Syllable */ + ["\uD020", "\uD020"], /* Hangul Syllable */ + ["\uD021", "\uD021"], /* Hangul Syllable */ + ["\uD022", "\uD022"], /* Hangul Syllable */ + ["\uD023", "\uD023"], /* Hangul Syllable */ + ["\uD024", "\uD024"], /* Hangul Syllable */ + ["\uD025", "\uD025"], /* Hangul Syllable */ + ["\uD026", "\uD026"], /* Hangul Syllable */ + ["\uD027", "\uD027"], /* Hangul Syllable */ + ["\uD028", "\uD028"], /* Hangul Syllable */ + ["\uD029", "\uD029"], /* Hangul Syllable */ + ["\uD02A", "\uD02A"], /* Hangul Syllable */ + ["\uD02B", "\uD02B"], /* Hangul Syllable */ + ["\uD02C", "\uD02C"], /* Hangul Syllable */ + ["\uD02D", "\uD02D"], /* Hangul Syllable */ + ["\uD02E", "\uD02E"], /* Hangul Syllable */ + ["\uD02F", "\uD02F"], /* Hangul Syllable */ + ["\uD030", "\uD030"], /* Hangul Syllable */ + ["\uD031", "\uD031"], /* Hangul Syllable */ + ["\uD032", "\uD032"], /* Hangul Syllable */ + ["\uD033", "\uD033"], /* Hangul Syllable */ + ["\uD034", "\uD034"], /* Hangul Syllable */ + ["\uD035", "\uD035"], /* Hangul Syllable */ + ["\uD036", "\uD036"], /* Hangul Syllable */ + ["\uD037", "\uD037"], /* Hangul Syllable */ + ["\uD038", "\uD038"], /* Hangul Syllable */ + ["\uD039", "\uD039"], /* Hangul Syllable */ + ["\uD03A", "\uD03A"], /* Hangul Syllable */ + ["\uD03B", "\uD03B"], /* Hangul Syllable */ + ["\uD03C", "\uD03C"], /* Hangul Syllable */ + ["\uD03D", "\uD03D"], /* Hangul Syllable */ + ["\uD03E", "\uD03E"], /* Hangul Syllable */ + ["\uD03F", "\uD03F"], /* Hangul Syllable */ + ["\uD040", "\uD040"], /* Hangul Syllable */ + ["\uD041", "\uD041"], /* Hangul Syllable */ + ["\uD042", "\uD042"], /* Hangul Syllable */ + ["\uD043", "\uD043"], /* Hangul Syllable */ + ["\uD044", "\uD044"], /* Hangul Syllable */ + ["\uD045", "\uD045"], /* Hangul Syllable */ + ["\uD046", "\uD046"], /* Hangul Syllable */ + ["\uD047", "\uD047"], /* Hangul Syllable */ + ["\uD048", "\uD048"], /* Hangul Syllable */ + ["\uD049", "\uD049"], /* Hangul Syllable */ + ["\uD04A", "\uD04A"], /* Hangul Syllable */ + ["\uD04B", "\uD04B"], /* Hangul Syllable */ + ["\uD04C", "\uD04C"], /* Hangul Syllable */ + ["\uD04D", "\uD04D"], /* Hangul Syllable */ + ["\uD04E", "\uD04E"], /* Hangul Syllable */ + ["\uD04F", "\uD04F"], /* Hangul Syllable */ + ["\uD050", "\uD050"], /* Hangul Syllable */ + ["\uD051", "\uD051"], /* Hangul Syllable */ + ["\uD052", "\uD052"], /* Hangul Syllable */ + ["\uD053", "\uD053"], /* Hangul Syllable */ + ["\uD054", "\uD054"], /* Hangul Syllable */ + ["\uD055", "\uD055"], /* Hangul Syllable */ + ["\uD056", "\uD056"], /* Hangul Syllable */ + ["\uD057", "\uD057"], /* Hangul Syllable */ + ["\uD058", "\uD058"], /* Hangul Syllable */ + ["\uD059", "\uD059"], /* Hangul Syllable */ + ["\uD05A", "\uD05A"], /* Hangul Syllable */ + ["\uD05B", "\uD05B"], /* Hangul Syllable */ + ["\uD05C", "\uD05C"], /* Hangul Syllable */ + ["\uD05D", "\uD05D"], /* Hangul Syllable */ + ["\uD05E", "\uD05E"], /* Hangul Syllable */ + ["\uD05F", "\uD05F"], /* Hangul Syllable */ + ["\uD060", "\uD060"], /* Hangul Syllable */ + ["\uD061", "\uD061"], /* Hangul Syllable */ + ["\uD062", "\uD062"], /* Hangul Syllable */ + ["\uD063", "\uD063"], /* Hangul Syllable */ + ["\uD064", "\uD064"], /* Hangul Syllable */ + ["\uD065", "\uD065"], /* Hangul Syllable */ + ["\uD066", "\uD066"], /* Hangul Syllable */ + ["\uD067", "\uD067"], /* Hangul Syllable */ + ["\uD068", "\uD068"], /* Hangul Syllable */ + ["\uD069", "\uD069"], /* Hangul Syllable */ + ["\uD06A", "\uD06A"], /* Hangul Syllable */ + ["\uD06B", "\uD06B"], /* Hangul Syllable */ + ["\uD06C", "\uD06C"], /* Hangul Syllable */ + ["\uD06D", "\uD06D"], /* Hangul Syllable */ + ["\uD06E", "\uD06E"], /* Hangul Syllable */ + ["\uD06F", "\uD06F"], /* Hangul Syllable */ + ["\uD070", "\uD070"], /* Hangul Syllable */ + ["\uD071", "\uD071"], /* Hangul Syllable */ + ["\uD072", "\uD072"], /* Hangul Syllable */ + ["\uD073", "\uD073"], /* Hangul Syllable */ + ["\uD074", "\uD074"], /* Hangul Syllable */ + ["\uD075", "\uD075"], /* Hangul Syllable */ + ["\uD076", "\uD076"], /* Hangul Syllable */ + ["\uD077", "\uD077"], /* Hangul Syllable */ + ["\uD078", "\uD078"], /* Hangul Syllable */ + ["\uD079", "\uD079"], /* Hangul Syllable */ + ["\uD07A", "\uD07A"], /* Hangul Syllable */ + ["\uD07B", "\uD07B"], /* Hangul Syllable */ + ["\uD07C", "\uD07C"], /* Hangul Syllable */ + ["\uD07D", "\uD07D"], /* Hangul Syllable */ + ["\uD07E", "\uD07E"], /* Hangul Syllable */ + ["\uD07F", "\uD07F"], /* Hangul Syllable */ + ["\uD080", "\uD080"], /* Hangul Syllable */ + ["\uD081", "\uD081"], /* Hangul Syllable */ + ["\uD082", "\uD082"], /* Hangul Syllable */ + ["\uD083", "\uD083"], /* Hangul Syllable */ + ["\uD084", "\uD084"], /* Hangul Syllable */ + ["\uD085", "\uD085"], /* Hangul Syllable */ + ["\uD086", "\uD086"], /* Hangul Syllable */ + ["\uD087", "\uD087"], /* Hangul Syllable */ + ["\uD088", "\uD088"], /* Hangul Syllable */ + ["\uD089", "\uD089"], /* Hangul Syllable */ + ["\uD08A", "\uD08A"], /* Hangul Syllable */ + ["\uD08B", "\uD08B"], /* Hangul Syllable */ + ["\uD08C", "\uD08C"], /* Hangul Syllable */ + ["\uD08D", "\uD08D"], /* Hangul Syllable */ + ["\uD08E", "\uD08E"], /* Hangul Syllable */ + ["\uD08F", "\uD08F"], /* Hangul Syllable */ + ["\uD090", "\uD090"], /* Hangul Syllable */ + ["\uD091", "\uD091"], /* Hangul Syllable */ + ["\uD092", "\uD092"], /* Hangul Syllable */ + ["\uD093", "\uD093"], /* Hangul Syllable */ + ["\uD094", "\uD094"], /* Hangul Syllable */ + ["\uD095", "\uD095"], /* Hangul Syllable */ + ["\uD096", "\uD096"], /* Hangul Syllable */ + ["\uD097", "\uD097"], /* Hangul Syllable */ + ["\uD098", "\uD098"], /* Hangul Syllable */ + ["\uD099", "\uD099"], /* Hangul Syllable */ + ["\uD09A", "\uD09A"], /* Hangul Syllable */ + ["\uD09B", "\uD09B"], /* Hangul Syllable */ + ["\uD09C", "\uD09C"], /* Hangul Syllable */ + ["\uD09D", "\uD09D"], /* Hangul Syllable */ + ["\uD09E", "\uD09E"], /* Hangul Syllable */ + ["\uD09F", "\uD09F"], /* Hangul Syllable */ + ["\uD0A0", "\uD0A0"], /* Hangul Syllable */ + ["\uD0A1", "\uD0A1"], /* Hangul Syllable */ + ["\uD0A2", "\uD0A2"], /* Hangul Syllable */ + ["\uD0A3", "\uD0A3"], /* Hangul Syllable */ + ["\uD0A4", "\uD0A4"], /* Hangul Syllable */ + ["\uD0A5", "\uD0A5"], /* Hangul Syllable */ + ["\uD0A6", "\uD0A6"], /* Hangul Syllable */ + ["\uD0A7", "\uD0A7"], /* Hangul Syllable */ + ["\uD0A8", "\uD0A8"], /* Hangul Syllable */ + ["\uD0A9", "\uD0A9"], /* Hangul Syllable */ + ["\uD0AA", "\uD0AA"], /* Hangul Syllable */ + ["\uD0AB", "\uD0AB"], /* Hangul Syllable */ + ["\uD0AC", "\uD0AC"], /* Hangul Syllable */ + ["\uD0AD", "\uD0AD"], /* Hangul Syllable */ + ["\uD0AE", "\uD0AE"], /* Hangul Syllable */ + ["\uD0AF", "\uD0AF"], /* Hangul Syllable */ + ["\uD0B0", "\uD0B0"], /* Hangul Syllable */ + ["\uD0B1", "\uD0B1"], /* Hangul Syllable */ + ["\uD0B2", "\uD0B2"], /* Hangul Syllable */ + ["\uD0B3", "\uD0B3"], /* Hangul Syllable */ + ["\uD0B4", "\uD0B4"], /* Hangul Syllable */ + ["\uD0B5", "\uD0B5"], /* Hangul Syllable */ + ["\uD0B6", "\uD0B6"], /* Hangul Syllable */ + ["\uD0B7", "\uD0B7"], /* Hangul Syllable */ + ["\uD0B8", "\uD0B8"], /* Hangul Syllable */ + ["\uD0B9", "\uD0B9"], /* Hangul Syllable */ + ["\uD0BA", "\uD0BA"], /* Hangul Syllable */ + ["\uD0BB", "\uD0BB"], /* Hangul Syllable */ + ["\uD0BC", "\uD0BC"], /* Hangul Syllable */ + ["\uD0BD", "\uD0BD"], /* Hangul Syllable */ + ["\uD0BE", "\uD0BE"], /* Hangul Syllable */ + ["\uD0BF", "\uD0BF"], /* Hangul Syllable */ + ["\uD0C0", "\uD0C0"], /* Hangul Syllable */ + ["\uD0C1", "\uD0C1"], /* Hangul Syllable */ + ["\uD0C2", "\uD0C2"], /* Hangul Syllable */ + ["\uD0C3", "\uD0C3"], /* Hangul Syllable */ + ["\uD0C4", "\uD0C4"], /* Hangul Syllable */ + ["\uD0C5", "\uD0C5"], /* Hangul Syllable */ + ["\uD0C6", "\uD0C6"], /* Hangul Syllable */ + ["\uD0C7", "\uD0C7"], /* Hangul Syllable */ + ["\uD0C8", "\uD0C8"], /* Hangul Syllable */ + ["\uD0C9", "\uD0C9"], /* Hangul Syllable */ + ["\uD0CA", "\uD0CA"], /* Hangul Syllable */ + ["\uD0CB", "\uD0CB"], /* Hangul Syllable */ + ["\uD0CC", "\uD0CC"], /* Hangul Syllable */ + ["\uD0CD", "\uD0CD"], /* Hangul Syllable */ + ["\uD0CE", "\uD0CE"], /* Hangul Syllable */ + ["\uD0CF", "\uD0CF"], /* Hangul Syllable */ + ["\uD0D0", "\uD0D0"], /* Hangul Syllable */ + ["\uD0D1", "\uD0D1"], /* Hangul Syllable */ + ["\uD0D2", "\uD0D2"], /* Hangul Syllable */ + ["\uD0D3", "\uD0D3"], /* Hangul Syllable */ + ["\uD0D4", "\uD0D4"], /* Hangul Syllable */ + ["\uD0D5", "\uD0D5"], /* Hangul Syllable */ + ["\uD0D6", "\uD0D6"], /* Hangul Syllable */ + ["\uD0D7", "\uD0D7"], /* Hangul Syllable */ + ["\uD0D8", "\uD0D8"], /* Hangul Syllable */ + ["\uD0D9", "\uD0D9"], /* Hangul Syllable */ + ["\uD0DA", "\uD0DA"], /* Hangul Syllable */ + ["\uD0DB", "\uD0DB"], /* Hangul Syllable */ + ["\uD0DC", "\uD0DC"], /* Hangul Syllable */ + ["\uD0DD", "\uD0DD"], /* Hangul Syllable */ + ["\uD0DE", "\uD0DE"], /* Hangul Syllable */ + ["\uD0DF", "\uD0DF"], /* Hangul Syllable */ + ["\uD0E0", "\uD0E0"], /* Hangul Syllable */ + ["\uD0E1", "\uD0E1"], /* Hangul Syllable */ + ["\uD0E2", "\uD0E2"], /* Hangul Syllable */ + ["\uD0E3", "\uD0E3"], /* Hangul Syllable */ + ["\uD0E4", "\uD0E4"], /* Hangul Syllable */ + ["\uD0E5", "\uD0E5"], /* Hangul Syllable */ + ["\uD0E6", "\uD0E6"], /* Hangul Syllable */ + ["\uD0E7", "\uD0E7"], /* Hangul Syllable */ + ["\uD0E8", "\uD0E8"], /* Hangul Syllable */ + ["\uD0E9", "\uD0E9"], /* Hangul Syllable */ + ["\uD0EA", "\uD0EA"], /* Hangul Syllable */ + ["\uD0EB", "\uD0EB"], /* Hangul Syllable */ + ["\uD0EC", "\uD0EC"], /* Hangul Syllable */ + ["\uD0ED", "\uD0ED"], /* Hangul Syllable */ + ["\uD0EE", "\uD0EE"], /* Hangul Syllable */ + ["\uD0EF", "\uD0EF"], /* Hangul Syllable */ + ["\uD0F0", "\uD0F0"], /* Hangul Syllable */ + ["\uD0F1", "\uD0F1"], /* Hangul Syllable */ + ["\uD0F2", "\uD0F2"], /* Hangul Syllable */ + ["\uD0F3", "\uD0F3"], /* Hangul Syllable */ + ["\uD0F4", "\uD0F4"], /* Hangul Syllable */ + ["\uD0F5", "\uD0F5"], /* Hangul Syllable */ + ["\uD0F6", "\uD0F6"], /* Hangul Syllable */ + ["\uD0F7", "\uD0F7"], /* Hangul Syllable */ + ["\uD0F8", "\uD0F8"], /* Hangul Syllable */ + ["\uD0F9", "\uD0F9"], /* Hangul Syllable */ + ["\uD0FA", "\uD0FA"], /* Hangul Syllable */ + ["\uD0FB", "\uD0FB"], /* Hangul Syllable */ + ["\uD0FC", "\uD0FC"], /* Hangul Syllable */ + ["\uD0FD", "\uD0FD"], /* Hangul Syllable */ + ["\uD0FE", "\uD0FE"], /* Hangul Syllable */ + ["\uD0FF", "\uD0FF"], /* Hangul Syllable */ + ["\uD100", "\uD100"], /* Hangul Syllable */ + ["\uD101", "\uD101"], /* Hangul Syllable */ + ["\uD102", "\uD102"], /* Hangul Syllable */ + ["\uD103", "\uD103"], /* Hangul Syllable */ + ["\uD104", "\uD104"], /* Hangul Syllable */ + ["\uD105", "\uD105"], /* Hangul Syllable */ + ["\uD106", "\uD106"], /* Hangul Syllable */ + ["\uD107", "\uD107"], /* Hangul Syllable */ + ["\uD108", "\uD108"], /* Hangul Syllable */ + ["\uD109", "\uD109"], /* Hangul Syllable */ + ["\uD10A", "\uD10A"], /* Hangul Syllable */ + ["\uD10B", "\uD10B"], /* Hangul Syllable */ + ["\uD10C", "\uD10C"], /* Hangul Syllable */ + ["\uD10D", "\uD10D"], /* Hangul Syllable */ + ["\uD10E", "\uD10E"], /* Hangul Syllable */ + ["\uD10F", "\uD10F"], /* Hangul Syllable */ + ["\uD110", "\uD110"], /* Hangul Syllable */ + ["\uD111", "\uD111"], /* Hangul Syllable */ + ["\uD112", "\uD112"], /* Hangul Syllable */ + ["\uD113", "\uD113"], /* Hangul Syllable */ + ["\uD114", "\uD114"], /* Hangul Syllable */ + ["\uD115", "\uD115"], /* Hangul Syllable */ + ["\uD116", "\uD116"], /* Hangul Syllable */ + ["\uD117", "\uD117"], /* Hangul Syllable */ + ["\uD118", "\uD118"], /* Hangul Syllable */ + ["\uD119", "\uD119"], /* Hangul Syllable */ + ["\uD11A", "\uD11A"], /* Hangul Syllable */ + ["\uD11B", "\uD11B"], /* Hangul Syllable */ + ["\uD11C", "\uD11C"], /* Hangul Syllable */ + ["\uD11D", "\uD11D"], /* Hangul Syllable */ + ["\uD11E", "\uD11E"], /* Hangul Syllable */ + ["\uD11F", "\uD11F"], /* Hangul Syllable */ + ["\uD120", "\uD120"], /* Hangul Syllable */ + ["\uD121", "\uD121"], /* Hangul Syllable */ + ["\uD122", "\uD122"], /* Hangul Syllable */ + ["\uD123", "\uD123"], /* Hangul Syllable */ + ["\uD124", "\uD124"], /* Hangul Syllable */ + ["\uD125", "\uD125"], /* Hangul Syllable */ + ["\uD126", "\uD126"], /* Hangul Syllable */ + ["\uD127", "\uD127"], /* Hangul Syllable */ + ["\uD128", "\uD128"], /* Hangul Syllable */ + ["\uD129", "\uD129"], /* Hangul Syllable */ + ["\uD12A", "\uD12A"], /* Hangul Syllable */ + ["\uD12B", "\uD12B"], /* Hangul Syllable */ + ["\uD12C", "\uD12C"], /* Hangul Syllable */ + ["\uD12D", "\uD12D"], /* Hangul Syllable */ + ["\uD12E", "\uD12E"], /* Hangul Syllable */ + ["\uD12F", "\uD12F"], /* Hangul Syllable */ + ["\uD130", "\uD130"], /* Hangul Syllable */ + ["\uD131", "\uD131"], /* Hangul Syllable */ + ["\uD132", "\uD132"], /* Hangul Syllable */ + ["\uD133", "\uD133"], /* Hangul Syllable */ + ["\uD134", "\uD134"], /* Hangul Syllable */ + ["\uD135", "\uD135"], /* Hangul Syllable */ + ["\uD136", "\uD136"], /* Hangul Syllable */ + ["\uD137", "\uD137"], /* Hangul Syllable */ + ["\uD138", "\uD138"], /* Hangul Syllable */ + ["\uD139", "\uD139"], /* Hangul Syllable */ + ["\uD13A", "\uD13A"], /* Hangul Syllable */ + ["\uD13B", "\uD13B"], /* Hangul Syllable */ + ["\uD13C", "\uD13C"], /* Hangul Syllable */ + ["\uD13D", "\uD13D"], /* Hangul Syllable */ + ["\uD13E", "\uD13E"], /* Hangul Syllable */ + ["\uD13F", "\uD13F"], /* Hangul Syllable */ + ["\uD140", "\uD140"], /* Hangul Syllable */ + ["\uD141", "\uD141"], /* Hangul Syllable */ + ["\uD142", "\uD142"], /* Hangul Syllable */ + ["\uD143", "\uD143"], /* Hangul Syllable */ + ["\uD144", "\uD144"], /* Hangul Syllable */ + ["\uD145", "\uD145"], /* Hangul Syllable */ + ["\uD146", "\uD146"], /* Hangul Syllable */ + ["\uD147", "\uD147"], /* Hangul Syllable */ + ["\uD148", "\uD148"], /* Hangul Syllable */ + ["\uD149", "\uD149"], /* Hangul Syllable */ + ["\uD14A", "\uD14A"], /* Hangul Syllable */ + ["\uD14B", "\uD14B"], /* Hangul Syllable */ + ["\uD14C", "\uD14C"], /* Hangul Syllable */ + ["\uD14D", "\uD14D"], /* Hangul Syllable */ + ["\uD14E", "\uD14E"], /* Hangul Syllable */ + ["\uD14F", "\uD14F"], /* Hangul Syllable */ + ["\uD150", "\uD150"], /* Hangul Syllable */ + ["\uD151", "\uD151"], /* Hangul Syllable */ + ["\uD152", "\uD152"], /* Hangul Syllable */ + ["\uD153", "\uD153"], /* Hangul Syllable */ + ["\uD154", "\uD154"], /* Hangul Syllable */ + ["\uD155", "\uD155"], /* Hangul Syllable */ + ["\uD156", "\uD156"], /* Hangul Syllable */ + ["\uD157", "\uD157"], /* Hangul Syllable */ + ["\uD158", "\uD158"], /* Hangul Syllable */ + ["\uD159", "\uD159"], /* Hangul Syllable */ + ["\uD15A", "\uD15A"], /* Hangul Syllable */ + ["\uD15B", "\uD15B"], /* Hangul Syllable */ + ["\uD15C", "\uD15C"], /* Hangul Syllable */ + ["\uD15D", "\uD15D"], /* Hangul Syllable */ + ["\uD15E", "\uD15E"], /* Hangul Syllable */ + ["\uD15F", "\uD15F"], /* Hangul Syllable */ + ["\uD160", "\uD160"], /* Hangul Syllable */ + ["\uD161", "\uD161"], /* Hangul Syllable */ + ["\uD162", "\uD162"], /* Hangul Syllable */ + ["\uD163", "\uD163"], /* Hangul Syllable */ + ["\uD164", "\uD164"], /* Hangul Syllable */ + ["\uD165", "\uD165"], /* Hangul Syllable */ + ["\uD166", "\uD166"], /* Hangul Syllable */ + ["\uD167", "\uD167"], /* Hangul Syllable */ + ["\uD168", "\uD168"], /* Hangul Syllable */ + ["\uD169", "\uD169"], /* Hangul Syllable */ + ["\uD16A", "\uD16A"], /* Hangul Syllable */ + ["\uD16B", "\uD16B"], /* Hangul Syllable */ + ["\uD16C", "\uD16C"], /* Hangul Syllable */ + ["\uD16D", "\uD16D"], /* Hangul Syllable */ + ["\uD16E", "\uD16E"], /* Hangul Syllable */ + ["\uD16F", "\uD16F"], /* Hangul Syllable */ + ["\uD170", "\uD170"], /* Hangul Syllable */ + ["\uD171", "\uD171"], /* Hangul Syllable */ + ["\uD172", "\uD172"], /* Hangul Syllable */ + ["\uD173", "\uD173"], /* Hangul Syllable */ + ["\uD174", "\uD174"], /* Hangul Syllable */ + ["\uD175", "\uD175"], /* Hangul Syllable */ + ["\uD176", "\uD176"], /* Hangul Syllable */ + ["\uD177", "\uD177"], /* Hangul Syllable */ + ["\uD178", "\uD178"], /* Hangul Syllable */ + ["\uD179", "\uD179"], /* Hangul Syllable */ + ["\uD17A", "\uD17A"], /* Hangul Syllable */ + ["\uD17B", "\uD17B"], /* Hangul Syllable */ + ["\uD17C", "\uD17C"], /* Hangul Syllable */ + ["\uD17D", "\uD17D"], /* Hangul Syllable */ + ["\uD17E", "\uD17E"], /* Hangul Syllable */ + ["\uD17F", "\uD17F"], /* Hangul Syllable */ + ["\uD180", "\uD180"], /* Hangul Syllable */ + ["\uD181", "\uD181"], /* Hangul Syllable */ + ["\uD182", "\uD182"], /* Hangul Syllable */ + ["\uD183", "\uD183"], /* Hangul Syllable */ + ["\uD184", "\uD184"], /* Hangul Syllable */ + ["\uD185", "\uD185"], /* Hangul Syllable */ + ["\uD186", "\uD186"], /* Hangul Syllable */ + ["\uD187", "\uD187"], /* Hangul Syllable */ + ["\uD188", "\uD188"], /* Hangul Syllable */ + ["\uD189", "\uD189"], /* Hangul Syllable */ + ["\uD18A", "\uD18A"], /* Hangul Syllable */ + ["\uD18B", "\uD18B"], /* Hangul Syllable */ + ["\uD18C", "\uD18C"], /* Hangul Syllable */ + ["\uD18D", "\uD18D"], /* Hangul Syllable */ + ["\uD18E", "\uD18E"], /* Hangul Syllable */ + ["\uD18F", "\uD18F"], /* Hangul Syllable */ + ["\uD190", "\uD190"], /* Hangul Syllable */ + ["\uD191", "\uD191"], /* Hangul Syllable */ + ["\uD192", "\uD192"], /* Hangul Syllable */ + ["\uD193", "\uD193"], /* Hangul Syllable */ + ["\uD194", "\uD194"], /* Hangul Syllable */ + ["\uD195", "\uD195"], /* Hangul Syllable */ + ["\uD196", "\uD196"], /* Hangul Syllable */ + ["\uD197", "\uD197"], /* Hangul Syllable */ + ["\uD198", "\uD198"], /* Hangul Syllable */ + ["\uD199", "\uD199"], /* Hangul Syllable */ + ["\uD19A", "\uD19A"], /* Hangul Syllable */ + ["\uD19B", "\uD19B"], /* Hangul Syllable */ + ["\uD19C", "\uD19C"], /* Hangul Syllable */ + ["\uD19D", "\uD19D"], /* Hangul Syllable */ + ["\uD19E", "\uD19E"], /* Hangul Syllable */ + ["\uD19F", "\uD19F"], /* Hangul Syllable */ + ["\uD1A0", "\uD1A0"], /* Hangul Syllable */ + ["\uD1A1", "\uD1A1"], /* Hangul Syllable */ + ["\uD1A2", "\uD1A2"], /* Hangul Syllable */ + ["\uD1A3", "\uD1A3"], /* Hangul Syllable */ + ["\uD1A4", "\uD1A4"], /* Hangul Syllable */ + ["\uD1A5", "\uD1A5"], /* Hangul Syllable */ + ["\uD1A6", "\uD1A6"], /* Hangul Syllable */ + ["\uD1A7", "\uD1A7"], /* Hangul Syllable */ + ["\uD1A8", "\uD1A8"], /* Hangul Syllable */ + ["\uD1A9", "\uD1A9"], /* Hangul Syllable */ + ["\uD1AA", "\uD1AA"], /* Hangul Syllable */ + ["\uD1AB", "\uD1AB"], /* Hangul Syllable */ + ["\uD1AC", "\uD1AC"], /* Hangul Syllable */ + ["\uD1AD", "\uD1AD"], /* Hangul Syllable */ + ["\uD1AE", "\uD1AE"], /* Hangul Syllable */ + ["\uD1AF", "\uD1AF"], /* Hangul Syllable */ + ["\uD1B0", "\uD1B0"], /* Hangul Syllable */ + ["\uD1B1", "\uD1B1"], /* Hangul Syllable */ + ["\uD1B2", "\uD1B2"], /* Hangul Syllable */ + ["\uD1B3", "\uD1B3"], /* Hangul Syllable */ + ["\uD1B4", "\uD1B4"], /* Hangul Syllable */ + ["\uD1B5", "\uD1B5"], /* Hangul Syllable */ + ["\uD1B6", "\uD1B6"], /* Hangul Syllable */ + ["\uD1B7", "\uD1B7"], /* Hangul Syllable */ + ["\uD1B8", "\uD1B8"], /* Hangul Syllable */ + ["\uD1B9", "\uD1B9"], /* Hangul Syllable */ + ["\uD1BA", "\uD1BA"], /* Hangul Syllable */ + ["\uD1BB", "\uD1BB"], /* Hangul Syllable */ + ["\uD1BC", "\uD1BC"], /* Hangul Syllable */ + ["\uD1BD", "\uD1BD"], /* Hangul Syllable */ + ["\uD1BE", "\uD1BE"], /* Hangul Syllable */ + ["\uD1BF", "\uD1BF"], /* Hangul Syllable */ + ["\uD1C0", "\uD1C0"], /* Hangul Syllable */ + ["\uD1C1", "\uD1C1"], /* Hangul Syllable */ + ["\uD1C2", "\uD1C2"], /* Hangul Syllable */ + ["\uD1C3", "\uD1C3"], /* Hangul Syllable */ + ["\uD1C4", "\uD1C4"], /* Hangul Syllable */ + ["\uD1C5", "\uD1C5"], /* Hangul Syllable */ + ["\uD1C6", "\uD1C6"], /* Hangul Syllable */ + ["\uD1C7", "\uD1C7"], /* Hangul Syllable */ + ["\uD1C8", "\uD1C8"], /* Hangul Syllable */ + ["\uD1C9", "\uD1C9"], /* Hangul Syllable */ + ["\uD1CA", "\uD1CA"], /* Hangul Syllable */ + ["\uD1CB", "\uD1CB"], /* Hangul Syllable */ + ["\uD1CC", "\uD1CC"], /* Hangul Syllable */ + ["\uD1CD", "\uD1CD"], /* Hangul Syllable */ + ["\uD1CE", "\uD1CE"], /* Hangul Syllable */ + ["\uD1CF", "\uD1CF"], /* Hangul Syllable */ + ["\uD1D0", "\uD1D0"], /* Hangul Syllable */ + ["\uD1D1", "\uD1D1"], /* Hangul Syllable */ + ["\uD1D2", "\uD1D2"], /* Hangul Syllable */ + ["\uD1D3", "\uD1D3"], /* Hangul Syllable */ + ["\uD1D4", "\uD1D4"], /* Hangul Syllable */ + ["\uD1D5", "\uD1D5"], /* Hangul Syllable */ + ["\uD1D6", "\uD1D6"], /* Hangul Syllable */ + ["\uD1D7", "\uD1D7"], /* Hangul Syllable */ + ["\uD1D8", "\uD1D8"], /* Hangul Syllable */ + ["\uD1D9", "\uD1D9"], /* Hangul Syllable */ + ["\uD1DA", "\uD1DA"], /* Hangul Syllable */ + ["\uD1DB", "\uD1DB"], /* Hangul Syllable */ + ["\uD1DC", "\uD1DC"], /* Hangul Syllable */ + ["\uD1DD", "\uD1DD"], /* Hangul Syllable */ + ["\uD1DE", "\uD1DE"], /* Hangul Syllable */ + ["\uD1DF", "\uD1DF"], /* Hangul Syllable */ + ["\uD1E0", "\uD1E0"], /* Hangul Syllable */ + ["\uD1E1", "\uD1E1"], /* Hangul Syllable */ + ["\uD1E2", "\uD1E2"], /* Hangul Syllable */ + ["\uD1E3", "\uD1E3"], /* Hangul Syllable */ + ["\uD1E4", "\uD1E4"], /* Hangul Syllable */ + ["\uD1E5", "\uD1E5"], /* Hangul Syllable */ + ["\uD1E6", "\uD1E6"], /* Hangul Syllable */ + ["\uD1E7", "\uD1E7"], /* Hangul Syllable */ + ["\uD1E8", "\uD1E8"], /* Hangul Syllable */ + ["\uD1E9", "\uD1E9"], /* Hangul Syllable */ + ["\uD1EA", "\uD1EA"], /* Hangul Syllable */ + ["\uD1EB", "\uD1EB"], /* Hangul Syllable */ + ["\uD1EC", "\uD1EC"], /* Hangul Syllable */ + ["\uD1ED", "\uD1ED"], /* Hangul Syllable */ + ["\uD1EE", "\uD1EE"], /* Hangul Syllable */ + ["\uD1EF", "\uD1EF"], /* Hangul Syllable */ + ["\uD1F0", "\uD1F0"], /* Hangul Syllable */ + ["\uD1F1", "\uD1F1"], /* Hangul Syllable */ + ["\uD1F2", "\uD1F2"], /* Hangul Syllable */ + ["\uD1F3", "\uD1F3"], /* Hangul Syllable */ + ["\uD1F4", "\uD1F4"], /* Hangul Syllable */ + ["\uD1F5", "\uD1F5"], /* Hangul Syllable */ + ["\uD1F6", "\uD1F6"], /* Hangul Syllable */ + ["\uD1F7", "\uD1F7"], /* Hangul Syllable */ + ["\uD1F8", "\uD1F8"], /* Hangul Syllable */ + ["\uD1F9", "\uD1F9"], /* Hangul Syllable */ + ["\uD1FA", "\uD1FA"], /* Hangul Syllable */ + ["\uD1FB", "\uD1FB"], /* Hangul Syllable */ + ["\uD1FC", "\uD1FC"], /* Hangul Syllable */ + ["\uD1FD", "\uD1FD"], /* Hangul Syllable */ + ["\uD1FE", "\uD1FE"], /* Hangul Syllable */ + ["\uD1FF", "\uD1FF"], /* Hangul Syllable */ + ["\uD200", "\uD200"], /* Hangul Syllable */ + ["\uD201", "\uD201"], /* Hangul Syllable */ + ["\uD202", "\uD202"], /* Hangul Syllable */ + ["\uD203", "\uD203"], /* Hangul Syllable */ + ["\uD204", "\uD204"], /* Hangul Syllable */ + ["\uD205", "\uD205"], /* Hangul Syllable */ + ["\uD206", "\uD206"], /* Hangul Syllable */ + ["\uD207", "\uD207"], /* Hangul Syllable */ + ["\uD208", "\uD208"], /* Hangul Syllable */ + ["\uD209", "\uD209"], /* Hangul Syllable */ + ["\uD20A", "\uD20A"], /* Hangul Syllable */ + ["\uD20B", "\uD20B"], /* Hangul Syllable */ + ["\uD20C", "\uD20C"], /* Hangul Syllable */ + ["\uD20D", "\uD20D"], /* Hangul Syllable */ + ["\uD20E", "\uD20E"], /* Hangul Syllable */ + ["\uD20F", "\uD20F"], /* Hangul Syllable */ + ["\uD210", "\uD210"], /* Hangul Syllable */ + ["\uD211", "\uD211"], /* Hangul Syllable */ + ["\uD212", "\uD212"], /* Hangul Syllable */ + ["\uD213", "\uD213"], /* Hangul Syllable */ + ["\uD214", "\uD214"], /* Hangul Syllable */ + ["\uD215", "\uD215"], /* Hangul Syllable */ + ["\uD216", "\uD216"], /* Hangul Syllable */ + ["\uD217", "\uD217"], /* Hangul Syllable */ + ["\uD218", "\uD218"], /* Hangul Syllable */ + ["\uD219", "\uD219"], /* Hangul Syllable */ + ["\uD21A", "\uD21A"], /* Hangul Syllable */ + ["\uD21B", "\uD21B"], /* Hangul Syllable */ + ["\uD21C", "\uD21C"], /* Hangul Syllable */ + ["\uD21D", "\uD21D"], /* Hangul Syllable */ + ["\uD21E", "\uD21E"], /* Hangul Syllable */ + ["\uD21F", "\uD21F"], /* Hangul Syllable */ + ["\uD220", "\uD220"], /* Hangul Syllable */ + ["\uD221", "\uD221"], /* Hangul Syllable */ + ["\uD222", "\uD222"], /* Hangul Syllable */ + ["\uD223", "\uD223"], /* Hangul Syllable */ + ["\uD224", "\uD224"], /* Hangul Syllable */ + ["\uD225", "\uD225"], /* Hangul Syllable */ + ["\uD226", "\uD226"], /* Hangul Syllable */ + ["\uD227", "\uD227"], /* Hangul Syllable */ + ["\uD228", "\uD228"], /* Hangul Syllable */ + ["\uD229", "\uD229"], /* Hangul Syllable */ + ["\uD22A", "\uD22A"], /* Hangul Syllable */ + ["\uD22B", "\uD22B"], /* Hangul Syllable */ + ["\uD22C", "\uD22C"], /* Hangul Syllable */ + ["\uD22D", "\uD22D"], /* Hangul Syllable */ + ["\uD22E", "\uD22E"], /* Hangul Syllable */ + ["\uD22F", "\uD22F"], /* Hangul Syllable */ + ["\uD230", "\uD230"], /* Hangul Syllable */ + ["\uD231", "\uD231"], /* Hangul Syllable */ + ["\uD232", "\uD232"], /* Hangul Syllable */ + ["\uD233", "\uD233"], /* Hangul Syllable */ + ["\uD234", "\uD234"], /* Hangul Syllable */ + ["\uD235", "\uD235"], /* Hangul Syllable */ + ["\uD236", "\uD236"], /* Hangul Syllable */ + ["\uD237", "\uD237"], /* Hangul Syllable */ + ["\uD238", "\uD238"], /* Hangul Syllable */ + ["\uD239", "\uD239"], /* Hangul Syllable */ + ["\uD23A", "\uD23A"], /* Hangul Syllable */ + ["\uD23B", "\uD23B"], /* Hangul Syllable */ + ["\uD23C", "\uD23C"], /* Hangul Syllable */ + ["\uD23D", "\uD23D"], /* Hangul Syllable */ + ["\uD23E", "\uD23E"], /* Hangul Syllable */ + ["\uD23F", "\uD23F"], /* Hangul Syllable */ + ["\uD240", "\uD240"], /* Hangul Syllable */ + ["\uD241", "\uD241"], /* Hangul Syllable */ + ["\uD242", "\uD242"], /* Hangul Syllable */ + ["\uD243", "\uD243"], /* Hangul Syllable */ + ["\uD244", "\uD244"], /* Hangul Syllable */ + ["\uD245", "\uD245"], /* Hangul Syllable */ + ["\uD246", "\uD246"], /* Hangul Syllable */ + ["\uD247", "\uD247"], /* Hangul Syllable */ + ["\uD248", "\uD248"], /* Hangul Syllable */ + ["\uD249", "\uD249"], /* Hangul Syllable */ + ["\uD24A", "\uD24A"], /* Hangul Syllable */ + ["\uD24B", "\uD24B"], /* Hangul Syllable */ + ["\uD24C", "\uD24C"], /* Hangul Syllable */ + ["\uD24D", "\uD24D"], /* Hangul Syllable */ + ["\uD24E", "\uD24E"], /* Hangul Syllable */ + ["\uD24F", "\uD24F"], /* Hangul Syllable */ + ["\uD250", "\uD250"], /* Hangul Syllable */ + ["\uD251", "\uD251"], /* Hangul Syllable */ + ["\uD252", "\uD252"], /* Hangul Syllable */ + ["\uD253", "\uD253"], /* Hangul Syllable */ + ["\uD254", "\uD254"], /* Hangul Syllable */ + ["\uD255", "\uD255"], /* Hangul Syllable */ + ["\uD256", "\uD256"], /* Hangul Syllable */ + ["\uD257", "\uD257"], /* Hangul Syllable */ + ["\uD258", "\uD258"], /* Hangul Syllable */ + ["\uD259", "\uD259"], /* Hangul Syllable */ + ["\uD25A", "\uD25A"], /* Hangul Syllable */ + ["\uD25B", "\uD25B"], /* Hangul Syllable */ + ["\uD25C", "\uD25C"], /* Hangul Syllable */ + ["\uD25D", "\uD25D"], /* Hangul Syllable */ + ["\uD25E", "\uD25E"], /* Hangul Syllable */ + ["\uD25F", "\uD25F"], /* Hangul Syllable */ + ["\uD260", "\uD260"], /* Hangul Syllable */ + ["\uD261", "\uD261"], /* Hangul Syllable */ + ["\uD262", "\uD262"], /* Hangul Syllable */ + ["\uD263", "\uD263"], /* Hangul Syllable */ + ["\uD264", "\uD264"], /* Hangul Syllable */ + ["\uD265", "\uD265"], /* Hangul Syllable */ + ["\uD266", "\uD266"], /* Hangul Syllable */ + ["\uD267", "\uD267"], /* Hangul Syllable */ + ["\uD268", "\uD268"], /* Hangul Syllable */ + ["\uD269", "\uD269"], /* Hangul Syllable */ + ["\uD26A", "\uD26A"], /* Hangul Syllable */ + ["\uD26B", "\uD26B"], /* Hangul Syllable */ + ["\uD26C", "\uD26C"], /* Hangul Syllable */ + ["\uD26D", "\uD26D"], /* Hangul Syllable */ + ["\uD26E", "\uD26E"], /* Hangul Syllable */ + ["\uD26F", "\uD26F"], /* Hangul Syllable */ + ["\uD270", "\uD270"], /* Hangul Syllable */ + ["\uD271", "\uD271"], /* Hangul Syllable */ + ["\uD272", "\uD272"], /* Hangul Syllable */ + ["\uD273", "\uD273"], /* Hangul Syllable */ + ["\uD274", "\uD274"], /* Hangul Syllable */ + ["\uD275", "\uD275"], /* Hangul Syllable */ + ["\uD276", "\uD276"], /* Hangul Syllable */ + ["\uD277", "\uD277"], /* Hangul Syllable */ + ["\uD278", "\uD278"], /* Hangul Syllable */ + ["\uD279", "\uD279"], /* Hangul Syllable */ + ["\uD27A", "\uD27A"], /* Hangul Syllable */ + ["\uD27B", "\uD27B"], /* Hangul Syllable */ + ["\uD27C", "\uD27C"], /* Hangul Syllable */ + ["\uD27D", "\uD27D"], /* Hangul Syllable */ + ["\uD27E", "\uD27E"], /* Hangul Syllable */ + ["\uD27F", "\uD27F"], /* Hangul Syllable */ + ["\uD280", "\uD280"], /* Hangul Syllable */ + ["\uD281", "\uD281"], /* Hangul Syllable */ + ["\uD282", "\uD282"], /* Hangul Syllable */ + ["\uD283", "\uD283"], /* Hangul Syllable */ + ["\uD284", "\uD284"], /* Hangul Syllable */ + ["\uD285", "\uD285"], /* Hangul Syllable */ + ["\uD286", "\uD286"], /* Hangul Syllable */ + ["\uD287", "\uD287"], /* Hangul Syllable */ + ["\uD288", "\uD288"], /* Hangul Syllable */ + ["\uD289", "\uD289"], /* Hangul Syllable */ + ["\uD28A", "\uD28A"], /* Hangul Syllable */ + ["\uD28B", "\uD28B"], /* Hangul Syllable */ + ["\uD28C", "\uD28C"], /* Hangul Syllable */ + ["\uD28D", "\uD28D"], /* Hangul Syllable */ + ["\uD28E", "\uD28E"], /* Hangul Syllable */ + ["\uD28F", "\uD28F"], /* Hangul Syllable */ + ["\uD290", "\uD290"], /* Hangul Syllable */ + ["\uD291", "\uD291"], /* Hangul Syllable */ + ["\uD292", "\uD292"], /* Hangul Syllable */ + ["\uD293", "\uD293"], /* Hangul Syllable */ + ["\uD294", "\uD294"], /* Hangul Syllable */ + ["\uD295", "\uD295"], /* Hangul Syllable */ + ["\uD296", "\uD296"], /* Hangul Syllable */ + ["\uD297", "\uD297"], /* Hangul Syllable */ + ["\uD298", "\uD298"], /* Hangul Syllable */ + ["\uD299", "\uD299"], /* Hangul Syllable */ + ["\uD29A", "\uD29A"], /* Hangul Syllable */ + ["\uD29B", "\uD29B"], /* Hangul Syllable */ + ["\uD29C", "\uD29C"], /* Hangul Syllable */ + ["\uD29D", "\uD29D"], /* Hangul Syllable */ + ["\uD29E", "\uD29E"], /* Hangul Syllable */ + ["\uD29F", "\uD29F"], /* Hangul Syllable */ + ["\uD2A0", "\uD2A0"], /* Hangul Syllable */ + ["\uD2A1", "\uD2A1"], /* Hangul Syllable */ + ["\uD2A2", "\uD2A2"], /* Hangul Syllable */ + ["\uD2A3", "\uD2A3"], /* Hangul Syllable */ + ["\uD2A4", "\uD2A4"], /* Hangul Syllable */ + ["\uD2A5", "\uD2A5"], /* Hangul Syllable */ + ["\uD2A6", "\uD2A6"], /* Hangul Syllable */ + ["\uD2A7", "\uD2A7"], /* Hangul Syllable */ + ["\uD2A8", "\uD2A8"], /* Hangul Syllable */ + ["\uD2A9", "\uD2A9"], /* Hangul Syllable */ + ["\uD2AA", "\uD2AA"], /* Hangul Syllable */ + ["\uD2AB", "\uD2AB"], /* Hangul Syllable */ + ["\uD2AC", "\uD2AC"], /* Hangul Syllable */ + ["\uD2AD", "\uD2AD"], /* Hangul Syllable */ + ["\uD2AE", "\uD2AE"], /* Hangul Syllable */ + ["\uD2AF", "\uD2AF"], /* Hangul Syllable */ + ["\uD2B0", "\uD2B0"], /* Hangul Syllable */ + ["\uD2B1", "\uD2B1"], /* Hangul Syllable */ + ["\uD2B2", "\uD2B2"], /* Hangul Syllable */ + ["\uD2B3", "\uD2B3"], /* Hangul Syllable */ + ["\uD2B4", "\uD2B4"], /* Hangul Syllable */ + ["\uD2B5", "\uD2B5"], /* Hangul Syllable */ + ["\uD2B6", "\uD2B6"], /* Hangul Syllable */ + ["\uD2B7", "\uD2B7"], /* Hangul Syllable */ + ["\uD2B8", "\uD2B8"], /* Hangul Syllable */ + ["\uD2B9", "\uD2B9"], /* Hangul Syllable */ + ["\uD2BA", "\uD2BA"], /* Hangul Syllable */ + ["\uD2BB", "\uD2BB"], /* Hangul Syllable */ + ["\uD2BC", "\uD2BC"], /* Hangul Syllable */ + ["\uD2BD", "\uD2BD"], /* Hangul Syllable */ + ["\uD2BE", "\uD2BE"], /* Hangul Syllable */ + ["\uD2BF", "\uD2BF"], /* Hangul Syllable */ + ["\uD2C0", "\uD2C0"], /* Hangul Syllable */ + ["\uD2C1", "\uD2C1"], /* Hangul Syllable */ + ["\uD2C2", "\uD2C2"], /* Hangul Syllable */ + ["\uD2C3", "\uD2C3"], /* Hangul Syllable */ + ["\uD2C4", "\uD2C4"], /* Hangul Syllable */ + ["\uD2C5", "\uD2C5"], /* Hangul Syllable */ + ["\uD2C6", "\uD2C6"], /* Hangul Syllable */ + ["\uD2C7", "\uD2C7"], /* Hangul Syllable */ + ["\uD2C8", "\uD2C8"], /* Hangul Syllable */ + ["\uD2C9", "\uD2C9"], /* Hangul Syllable */ + ["\uD2CA", "\uD2CA"], /* Hangul Syllable */ + ["\uD2CB", "\uD2CB"], /* Hangul Syllable */ + ["\uD2CC", "\uD2CC"], /* Hangul Syllable */ + ["\uD2CD", "\uD2CD"], /* Hangul Syllable */ + ["\uD2CE", "\uD2CE"], /* Hangul Syllable */ + ["\uD2CF", "\uD2CF"], /* Hangul Syllable */ + ["\uD2D0", "\uD2D0"], /* Hangul Syllable */ + ["\uD2D1", "\uD2D1"], /* Hangul Syllable */ + ["\uD2D2", "\uD2D2"], /* Hangul Syllable */ + ["\uD2D3", "\uD2D3"], /* Hangul Syllable */ + ["\uD2D4", "\uD2D4"], /* Hangul Syllable */ + ["\uD2D5", "\uD2D5"], /* Hangul Syllable */ + ["\uD2D6", "\uD2D6"], /* Hangul Syllable */ + ["\uD2D7", "\uD2D7"], /* Hangul Syllable */ + ["\uD2D8", "\uD2D8"], /* Hangul Syllable */ + ["\uD2D9", "\uD2D9"], /* Hangul Syllable */ + ["\uD2DA", "\uD2DA"], /* Hangul Syllable */ + ["\uD2DB", "\uD2DB"], /* Hangul Syllable */ + ["\uD2DC", "\uD2DC"], /* Hangul Syllable */ + ["\uD2DD", "\uD2DD"], /* Hangul Syllable */ + ["\uD2DE", "\uD2DE"], /* Hangul Syllable */ + ["\uD2DF", "\uD2DF"], /* Hangul Syllable */ + ["\uD2E0", "\uD2E0"], /* Hangul Syllable */ + ["\uD2E1", "\uD2E1"], /* Hangul Syllable */ + ["\uD2E2", "\uD2E2"], /* Hangul Syllable */ + ["\uD2E3", "\uD2E3"], /* Hangul Syllable */ + ["\uD2E4", "\uD2E4"], /* Hangul Syllable */ + ["\uD2E5", "\uD2E5"], /* Hangul Syllable */ + ["\uD2E6", "\uD2E6"], /* Hangul Syllable */ + ["\uD2E7", "\uD2E7"], /* Hangul Syllable */ + ["\uD2E8", "\uD2E8"], /* Hangul Syllable */ + ["\uD2E9", "\uD2E9"], /* Hangul Syllable */ + ["\uD2EA", "\uD2EA"], /* Hangul Syllable */ + ["\uD2EB", "\uD2EB"], /* Hangul Syllable */ + ["\uD2EC", "\uD2EC"], /* Hangul Syllable */ + ["\uD2ED", "\uD2ED"], /* Hangul Syllable */ + ["\uD2EE", "\uD2EE"], /* Hangul Syllable */ + ["\uD2EF", "\uD2EF"], /* Hangul Syllable */ + ["\uD2F0", "\uD2F0"], /* Hangul Syllable */ + ["\uD2F1", "\uD2F1"], /* Hangul Syllable */ + ["\uD2F2", "\uD2F2"], /* Hangul Syllable */ + ["\uD2F3", "\uD2F3"], /* Hangul Syllable */ + ["\uD2F4", "\uD2F4"], /* Hangul Syllable */ + ["\uD2F5", "\uD2F5"], /* Hangul Syllable */ + ["\uD2F6", "\uD2F6"], /* Hangul Syllable */ + ["\uD2F7", "\uD2F7"], /* Hangul Syllable */ + ["\uD2F8", "\uD2F8"], /* Hangul Syllable */ + ["\uD2F9", "\uD2F9"], /* Hangul Syllable */ + ["\uD2FA", "\uD2FA"], /* Hangul Syllable */ + ["\uD2FB", "\uD2FB"], /* Hangul Syllable */ + ["\uD2FC", "\uD2FC"], /* Hangul Syllable */ + ["\uD2FD", "\uD2FD"], /* Hangul Syllable */ + ["\uD2FE", "\uD2FE"], /* Hangul Syllable */ + ["\uD2FF", "\uD2FF"], /* Hangul Syllable */ + ["\uD300", "\uD300"], /* Hangul Syllable */ + ["\uD301", "\uD301"], /* Hangul Syllable */ + ["\uD302", "\uD302"], /* Hangul Syllable */ + ["\uD303", "\uD303"], /* Hangul Syllable */ + ["\uD304", "\uD304"], /* Hangul Syllable */ + ["\uD305", "\uD305"], /* Hangul Syllable */ + ["\uD306", "\uD306"], /* Hangul Syllable */ + ["\uD307", "\uD307"], /* Hangul Syllable */ + ["\uD308", "\uD308"], /* Hangul Syllable */ + ["\uD309", "\uD309"], /* Hangul Syllable */ + ["\uD30A", "\uD30A"], /* Hangul Syllable */ + ["\uD30B", "\uD30B"], /* Hangul Syllable */ + ["\uD30C", "\uD30C"], /* Hangul Syllable */ + ["\uD30D", "\uD30D"], /* Hangul Syllable */ + ["\uD30E", "\uD30E"], /* Hangul Syllable */ + ["\uD30F", "\uD30F"], /* Hangul Syllable */ + ["\uD310", "\uD310"], /* Hangul Syllable */ + ["\uD311", "\uD311"], /* Hangul Syllable */ + ["\uD312", "\uD312"], /* Hangul Syllable */ + ["\uD313", "\uD313"], /* Hangul Syllable */ + ["\uD314", "\uD314"], /* Hangul Syllable */ + ["\uD315", "\uD315"], /* Hangul Syllable */ + ["\uD316", "\uD316"], /* Hangul Syllable */ + ["\uD317", "\uD317"], /* Hangul Syllable */ + ["\uD318", "\uD318"], /* Hangul Syllable */ + ["\uD319", "\uD319"], /* Hangul Syllable */ + ["\uD31A", "\uD31A"], /* Hangul Syllable */ + ["\uD31B", "\uD31B"], /* Hangul Syllable */ + ["\uD31C", "\uD31C"], /* Hangul Syllable */ + ["\uD31D", "\uD31D"], /* Hangul Syllable */ + ["\uD31E", "\uD31E"], /* Hangul Syllable */ + ["\uD31F", "\uD31F"], /* Hangul Syllable */ + ["\uD320", "\uD320"], /* Hangul Syllable */ + ["\uD321", "\uD321"], /* Hangul Syllable */ + ["\uD322", "\uD322"], /* Hangul Syllable */ + ["\uD323", "\uD323"], /* Hangul Syllable */ + ["\uD324", "\uD324"], /* Hangul Syllable */ + ["\uD325", "\uD325"], /* Hangul Syllable */ + ["\uD326", "\uD326"], /* Hangul Syllable */ + ["\uD327", "\uD327"], /* Hangul Syllable */ + ["\uD328", "\uD328"], /* Hangul Syllable */ + ["\uD329", "\uD329"], /* Hangul Syllable */ + ["\uD32A", "\uD32A"], /* Hangul Syllable */ + ["\uD32B", "\uD32B"], /* Hangul Syllable */ + ["\uD32C", "\uD32C"], /* Hangul Syllable */ + ["\uD32D", "\uD32D"], /* Hangul Syllable */ + ["\uD32E", "\uD32E"], /* Hangul Syllable */ + ["\uD32F", "\uD32F"], /* Hangul Syllable */ + ["\uD330", "\uD330"], /* Hangul Syllable */ + ["\uD331", "\uD331"], /* Hangul Syllable */ + ["\uD332", "\uD332"], /* Hangul Syllable */ + ["\uD333", "\uD333"], /* Hangul Syllable */ + ["\uD334", "\uD334"], /* Hangul Syllable */ + ["\uD335", "\uD335"], /* Hangul Syllable */ + ["\uD336", "\uD336"], /* Hangul Syllable */ + ["\uD337", "\uD337"], /* Hangul Syllable */ + ["\uD338", "\uD338"], /* Hangul Syllable */ + ["\uD339", "\uD339"], /* Hangul Syllable */ + ["\uD33A", "\uD33A"], /* Hangul Syllable */ + ["\uD33B", "\uD33B"], /* Hangul Syllable */ + ["\uD33C", "\uD33C"], /* Hangul Syllable */ + ["\uD33D", "\uD33D"], /* Hangul Syllable */ + ["\uD33E", "\uD33E"], /* Hangul Syllable */ + ["\uD33F", "\uD33F"], /* Hangul Syllable */ + ["\uD340", "\uD340"], /* Hangul Syllable */ + ["\uD341", "\uD341"], /* Hangul Syllable */ + ["\uD342", "\uD342"], /* Hangul Syllable */ + ["\uD343", "\uD343"], /* Hangul Syllable */ + ["\uD344", "\uD344"], /* Hangul Syllable */ + ["\uD345", "\uD345"], /* Hangul Syllable */ + ["\uD346", "\uD346"], /* Hangul Syllable */ + ["\uD347", "\uD347"], /* Hangul Syllable */ + ["\uD348", "\uD348"], /* Hangul Syllable */ + ["\uD349", "\uD349"], /* Hangul Syllable */ + ["\uD34A", "\uD34A"], /* Hangul Syllable */ + ["\uD34B", "\uD34B"], /* Hangul Syllable */ + ["\uD34C", "\uD34C"], /* Hangul Syllable */ + ["\uD34D", "\uD34D"], /* Hangul Syllable */ + ["\uD34E", "\uD34E"], /* Hangul Syllable */ + ["\uD34F", "\uD34F"], /* Hangul Syllable */ + ["\uD350", "\uD350"], /* Hangul Syllable */ + ["\uD351", "\uD351"], /* Hangul Syllable */ + ["\uD352", "\uD352"], /* Hangul Syllable */ + ["\uD353", "\uD353"], /* Hangul Syllable */ + ["\uD354", "\uD354"], /* Hangul Syllable */ + ["\uD355", "\uD355"], /* Hangul Syllable */ + ["\uD356", "\uD356"], /* Hangul Syllable */ + ["\uD357", "\uD357"], /* Hangul Syllable */ + ["\uD358", "\uD358"], /* Hangul Syllable */ + ["\uD359", "\uD359"], /* Hangul Syllable */ + ["\uD35A", "\uD35A"], /* Hangul Syllable */ + ["\uD35B", "\uD35B"], /* Hangul Syllable */ + ["\uD35C", "\uD35C"], /* Hangul Syllable */ + ["\uD35D", "\uD35D"], /* Hangul Syllable */ + ["\uD35E", "\uD35E"], /* Hangul Syllable */ + ["\uD35F", "\uD35F"], /* Hangul Syllable */ + ["\uD360", "\uD360"], /* Hangul Syllable */ + ["\uD361", "\uD361"], /* Hangul Syllable */ + ["\uD362", "\uD362"], /* Hangul Syllable */ + ["\uD363", "\uD363"], /* Hangul Syllable */ + ["\uD364", "\uD364"], /* Hangul Syllable */ + ["\uD365", "\uD365"], /* Hangul Syllable */ + ["\uD366", "\uD366"], /* Hangul Syllable */ + ["\uD367", "\uD367"], /* Hangul Syllable */ + ["\uD368", "\uD368"], /* Hangul Syllable */ + ["\uD369", "\uD369"], /* Hangul Syllable */ + ["\uD36A", "\uD36A"], /* Hangul Syllable */ + ["\uD36B", "\uD36B"], /* Hangul Syllable */ + ["\uD36C", "\uD36C"], /* Hangul Syllable */ + ["\uD36D", "\uD36D"], /* Hangul Syllable */ + ["\uD36E", "\uD36E"], /* Hangul Syllable */ + ["\uD36F", "\uD36F"], /* Hangul Syllable */ + ["\uD370", "\uD370"], /* Hangul Syllable */ + ["\uD371", "\uD371"], /* Hangul Syllable */ + ["\uD372", "\uD372"], /* Hangul Syllable */ + ["\uD373", "\uD373"], /* Hangul Syllable */ + ["\uD374", "\uD374"], /* Hangul Syllable */ + ["\uD375", "\uD375"], /* Hangul Syllable */ + ["\uD376", "\uD376"], /* Hangul Syllable */ + ["\uD377", "\uD377"], /* Hangul Syllable */ + ["\uD378", "\uD378"], /* Hangul Syllable */ + ["\uD379", "\uD379"], /* Hangul Syllable */ + ["\uD37A", "\uD37A"], /* Hangul Syllable */ + ["\uD37B", "\uD37B"], /* Hangul Syllable */ + ["\uD37C", "\uD37C"], /* Hangul Syllable */ + ["\uD37D", "\uD37D"], /* Hangul Syllable */ + ["\uD37E", "\uD37E"], /* Hangul Syllable */ + ["\uD37F", "\uD37F"], /* Hangul Syllable */ + ["\uD380", "\uD380"], /* Hangul Syllable */ + ["\uD381", "\uD381"], /* Hangul Syllable */ + ["\uD382", "\uD382"], /* Hangul Syllable */ + ["\uD383", "\uD383"], /* Hangul Syllable */ + ["\uD384", "\uD384"], /* Hangul Syllable */ + ["\uD385", "\uD385"], /* Hangul Syllable */ + ["\uD386", "\uD386"], /* Hangul Syllable */ + ["\uD387", "\uD387"], /* Hangul Syllable */ + ["\uD388", "\uD388"], /* Hangul Syllable */ + ["\uD389", "\uD389"], /* Hangul Syllable */ + ["\uD38A", "\uD38A"], /* Hangul Syllable */ + ["\uD38B", "\uD38B"], /* Hangul Syllable */ + ["\uD38C", "\uD38C"], /* Hangul Syllable */ + ["\uD38D", "\uD38D"], /* Hangul Syllable */ + ["\uD38E", "\uD38E"], /* Hangul Syllable */ + ["\uD38F", "\uD38F"], /* Hangul Syllable */ + ["\uD390", "\uD390"], /* Hangul Syllable */ + ["\uD391", "\uD391"], /* Hangul Syllable */ + ["\uD392", "\uD392"], /* Hangul Syllable */ + ["\uD393", "\uD393"], /* Hangul Syllable */ + ["\uD394", "\uD394"], /* Hangul Syllable */ + ["\uD395", "\uD395"], /* Hangul Syllable */ + ["\uD396", "\uD396"], /* Hangul Syllable */ + ["\uD397", "\uD397"], /* Hangul Syllable */ + ["\uD398", "\uD398"], /* Hangul Syllable */ + ["\uD399", "\uD399"], /* Hangul Syllable */ + ["\uD39A", "\uD39A"], /* Hangul Syllable */ + ["\uD39B", "\uD39B"], /* Hangul Syllable */ + ["\uD39C", "\uD39C"], /* Hangul Syllable */ + ["\uD39D", "\uD39D"], /* Hangul Syllable */ + ["\uD39E", "\uD39E"], /* Hangul Syllable */ + ["\uD39F", "\uD39F"], /* Hangul Syllable */ + ["\uD3A0", "\uD3A0"], /* Hangul Syllable */ + ["\uD3A1", "\uD3A1"], /* Hangul Syllable */ + ["\uD3A2", "\uD3A2"], /* Hangul Syllable */ + ["\uD3A3", "\uD3A3"], /* Hangul Syllable */ + ["\uD3A4", "\uD3A4"], /* Hangul Syllable */ + ["\uD3A5", "\uD3A5"], /* Hangul Syllable */ + ["\uD3A6", "\uD3A6"], /* Hangul Syllable */ + ["\uD3A7", "\uD3A7"], /* Hangul Syllable */ + ["\uD3A8", "\uD3A8"], /* Hangul Syllable */ + ["\uD3A9", "\uD3A9"], /* Hangul Syllable */ + ["\uD3AA", "\uD3AA"], /* Hangul Syllable */ + ["\uD3AB", "\uD3AB"], /* Hangul Syllable */ + ["\uD3AC", "\uD3AC"], /* Hangul Syllable */ + ["\uD3AD", "\uD3AD"], /* Hangul Syllable */ + ["\uD3AE", "\uD3AE"], /* Hangul Syllable */ + ["\uD3AF", "\uD3AF"], /* Hangul Syllable */ + ["\uD3B0", "\uD3B0"], /* Hangul Syllable */ + ["\uD3B1", "\uD3B1"], /* Hangul Syllable */ + ["\uD3B2", "\uD3B2"], /* Hangul Syllable */ + ["\uD3B3", "\uD3B3"], /* Hangul Syllable */ + ["\uD3B4", "\uD3B4"], /* Hangul Syllable */ + ["\uD3B5", "\uD3B5"], /* Hangul Syllable */ + ["\uD3B6", "\uD3B6"], /* Hangul Syllable */ + ["\uD3B7", "\uD3B7"], /* Hangul Syllable */ + ["\uD3B8", "\uD3B8"], /* Hangul Syllable */ + ["\uD3B9", "\uD3B9"], /* Hangul Syllable */ + ["\uD3BA", "\uD3BA"], /* Hangul Syllable */ + ["\uD3BB", "\uD3BB"], /* Hangul Syllable */ + ["\uD3BC", "\uD3BC"], /* Hangul Syllable */ + ["\uD3BD", "\uD3BD"], /* Hangul Syllable */ + ["\uD3BE", "\uD3BE"], /* Hangul Syllable */ + ["\uD3BF", "\uD3BF"], /* Hangul Syllable */ + ["\uD3C0", "\uD3C0"], /* Hangul Syllable */ + ["\uD3C1", "\uD3C1"], /* Hangul Syllable */ + ["\uD3C2", "\uD3C2"], /* Hangul Syllable */ + ["\uD3C3", "\uD3C3"], /* Hangul Syllable */ + ["\uD3C4", "\uD3C4"], /* Hangul Syllable */ + ["\uD3C5", "\uD3C5"], /* Hangul Syllable */ + ["\uD3C6", "\uD3C6"], /* Hangul Syllable */ + ["\uD3C7", "\uD3C7"], /* Hangul Syllable */ + ["\uD3C8", "\uD3C8"], /* Hangul Syllable */ + ["\uD3C9", "\uD3C9"], /* Hangul Syllable */ + ["\uD3CA", "\uD3CA"], /* Hangul Syllable */ + ["\uD3CB", "\uD3CB"], /* Hangul Syllable */ + ["\uD3CC", "\uD3CC"], /* Hangul Syllable */ + ["\uD3CD", "\uD3CD"], /* Hangul Syllable */ + ["\uD3CE", "\uD3CE"], /* Hangul Syllable */ + ["\uD3CF", "\uD3CF"], /* Hangul Syllable */ + ["\uD3D0", "\uD3D0"], /* Hangul Syllable */ + ["\uD3D1", "\uD3D1"], /* Hangul Syllable */ + ["\uD3D2", "\uD3D2"], /* Hangul Syllable */ + ["\uD3D3", "\uD3D3"], /* Hangul Syllable */ + ["\uD3D4", "\uD3D4"], /* Hangul Syllable */ + ["\uD3D5", "\uD3D5"], /* Hangul Syllable */ + ["\uD3D6", "\uD3D6"], /* Hangul Syllable */ + ["\uD3D7", "\uD3D7"], /* Hangul Syllable */ + ["\uD3D8", "\uD3D8"], /* Hangul Syllable */ + ["\uD3D9", "\uD3D9"], /* Hangul Syllable */ + ["\uD3DA", "\uD3DA"], /* Hangul Syllable */ + ["\uD3DB", "\uD3DB"], /* Hangul Syllable */ + ["\uD3DC", "\uD3DC"], /* Hangul Syllable */ + ["\uD3DD", "\uD3DD"], /* Hangul Syllable */ + ["\uD3DE", "\uD3DE"], /* Hangul Syllable */ + ["\uD3DF", "\uD3DF"], /* Hangul Syllable */ + ["\uD3E0", "\uD3E0"], /* Hangul Syllable */ + ["\uD3E1", "\uD3E1"], /* Hangul Syllable */ + ["\uD3E2", "\uD3E2"], /* Hangul Syllable */ + ["\uD3E3", "\uD3E3"], /* Hangul Syllable */ + ["\uD3E4", "\uD3E4"], /* Hangul Syllable */ + ["\uD3E5", "\uD3E5"], /* Hangul Syllable */ + ["\uD3E6", "\uD3E6"], /* Hangul Syllable */ + ["\uD3E7", "\uD3E7"], /* Hangul Syllable */ + ["\uD3E8", "\uD3E8"], /* Hangul Syllable */ + ["\uD3E9", "\uD3E9"], /* Hangul Syllable */ + ["\uD3EA", "\uD3EA"], /* Hangul Syllable */ + ["\uD3EB", "\uD3EB"], /* Hangul Syllable */ + ["\uD3EC", "\uD3EC"], /* Hangul Syllable */ + ["\uD3ED", "\uD3ED"], /* Hangul Syllable */ + ["\uD3EE", "\uD3EE"], /* Hangul Syllable */ + ["\uD3EF", "\uD3EF"], /* Hangul Syllable */ + ["\uD3F0", "\uD3F0"], /* Hangul Syllable */ + ["\uD3F1", "\uD3F1"], /* Hangul Syllable */ + ["\uD3F2", "\uD3F2"], /* Hangul Syllable */ + ["\uD3F3", "\uD3F3"], /* Hangul Syllable */ + ["\uD3F4", "\uD3F4"], /* Hangul Syllable */ + ["\uD3F5", "\uD3F5"], /* Hangul Syllable */ + ["\uD3F6", "\uD3F6"], /* Hangul Syllable */ + ["\uD3F7", "\uD3F7"], /* Hangul Syllable */ + ["\uD3F8", "\uD3F8"], /* Hangul Syllable */ + ["\uD3F9", "\uD3F9"], /* Hangul Syllable */ + ["\uD3FA", "\uD3FA"], /* Hangul Syllable */ + ["\uD3FB", "\uD3FB"], /* Hangul Syllable */ + ["\uD3FC", "\uD3FC"], /* Hangul Syllable */ + ["\uD3FD", "\uD3FD"], /* Hangul Syllable */ + ["\uD3FE", "\uD3FE"], /* Hangul Syllable */ + ["\uD3FF", "\uD3FF"], /* Hangul Syllable */ + ["\uD400", "\uD400"], /* Hangul Syllable */ + ["\uD401", "\uD401"], /* Hangul Syllable */ + ["\uD402", "\uD402"], /* Hangul Syllable */ + ["\uD403", "\uD403"], /* Hangul Syllable */ + ["\uD404", "\uD404"], /* Hangul Syllable */ + ["\uD405", "\uD405"], /* Hangul Syllable */ + ["\uD406", "\uD406"], /* Hangul Syllable */ + ["\uD407", "\uD407"], /* Hangul Syllable */ + ["\uD408", "\uD408"], /* Hangul Syllable */ + ["\uD409", "\uD409"], /* Hangul Syllable */ + ["\uD40A", "\uD40A"], /* Hangul Syllable */ + ["\uD40B", "\uD40B"], /* Hangul Syllable */ + ["\uD40C", "\uD40C"], /* Hangul Syllable */ + ["\uD40D", "\uD40D"], /* Hangul Syllable */ + ["\uD40E", "\uD40E"], /* Hangul Syllable */ + ["\uD40F", "\uD40F"], /* Hangul Syllable */ + ["\uD410", "\uD410"], /* Hangul Syllable */ + ["\uD411", "\uD411"], /* Hangul Syllable */ + ["\uD412", "\uD412"], /* Hangul Syllable */ + ["\uD413", "\uD413"], /* Hangul Syllable */ + ["\uD414", "\uD414"], /* Hangul Syllable */ + ["\uD415", "\uD415"], /* Hangul Syllable */ + ["\uD416", "\uD416"], /* Hangul Syllable */ + ["\uD417", "\uD417"], /* Hangul Syllable */ + ["\uD418", "\uD418"], /* Hangul Syllable */ + ["\uD419", "\uD419"], /* Hangul Syllable */ + ["\uD41A", "\uD41A"], /* Hangul Syllable */ + ["\uD41B", "\uD41B"], /* Hangul Syllable */ + ["\uD41C", "\uD41C"], /* Hangul Syllable */ + ["\uD41D", "\uD41D"], /* Hangul Syllable */ + ["\uD41E", "\uD41E"], /* Hangul Syllable */ + ["\uD41F", "\uD41F"], /* Hangul Syllable */ + ["\uD420", "\uD420"], /* Hangul Syllable */ + ["\uD421", "\uD421"], /* Hangul Syllable */ + ["\uD422", "\uD422"], /* Hangul Syllable */ + ["\uD423", "\uD423"], /* Hangul Syllable */ + ["\uD424", "\uD424"], /* Hangul Syllable */ + ["\uD425", "\uD425"], /* Hangul Syllable */ + ["\uD426", "\uD426"], /* Hangul Syllable */ + ["\uD427", "\uD427"], /* Hangul Syllable */ + ["\uD428", "\uD428"], /* Hangul Syllable */ + ["\uD429", "\uD429"], /* Hangul Syllable */ + ["\uD42A", "\uD42A"], /* Hangul Syllable */ + ["\uD42B", "\uD42B"], /* Hangul Syllable */ + ["\uD42C", "\uD42C"], /* Hangul Syllable */ + ["\uD42D", "\uD42D"], /* Hangul Syllable */ + ["\uD42E", "\uD42E"], /* Hangul Syllable */ + ["\uD42F", "\uD42F"], /* Hangul Syllable */ + ["\uD430", "\uD430"], /* Hangul Syllable */ + ["\uD431", "\uD431"], /* Hangul Syllable */ + ["\uD432", "\uD432"], /* Hangul Syllable */ + ["\uD433", "\uD433"], /* Hangul Syllable */ + ["\uD434", "\uD434"], /* Hangul Syllable */ + ["\uD435", "\uD435"], /* Hangul Syllable */ + ["\uD436", "\uD436"], /* Hangul Syllable */ + ["\uD437", "\uD437"], /* Hangul Syllable */ + ["\uD438", "\uD438"], /* Hangul Syllable */ + ["\uD439", "\uD439"], /* Hangul Syllable */ + ["\uD43A", "\uD43A"], /* Hangul Syllable */ + ["\uD43B", "\uD43B"], /* Hangul Syllable */ + ["\uD43C", "\uD43C"], /* Hangul Syllable */ + ["\uD43D", "\uD43D"], /* Hangul Syllable */ + ["\uD43E", "\uD43E"], /* Hangul Syllable */ + ["\uD43F", "\uD43F"], /* Hangul Syllable */ + ["\uD440", "\uD440"], /* Hangul Syllable */ + ["\uD441", "\uD441"], /* Hangul Syllable */ + ["\uD442", "\uD442"], /* Hangul Syllable */ + ["\uD443", "\uD443"], /* Hangul Syllable */ + ["\uD444", "\uD444"], /* Hangul Syllable */ + ["\uD445", "\uD445"], /* Hangul Syllable */ + ["\uD446", "\uD446"], /* Hangul Syllable */ + ["\uD447", "\uD447"], /* Hangul Syllable */ + ["\uD448", "\uD448"], /* Hangul Syllable */ + ["\uD449", "\uD449"], /* Hangul Syllable */ + ["\uD44A", "\uD44A"], /* Hangul Syllable */ + ["\uD44B", "\uD44B"], /* Hangul Syllable */ + ["\uD44C", "\uD44C"], /* Hangul Syllable */ + ["\uD44D", "\uD44D"], /* Hangul Syllable */ + ["\uD44E", "\uD44E"], /* Hangul Syllable */ + ["\uD44F", "\uD44F"], /* Hangul Syllable */ + ["\uD450", "\uD450"], /* Hangul Syllable */ + ["\uD451", "\uD451"], /* Hangul Syllable */ + ["\uD452", "\uD452"], /* Hangul Syllable */ + ["\uD453", "\uD453"], /* Hangul Syllable */ + ["\uD454", "\uD454"], /* Hangul Syllable */ + ["\uD455", "\uD455"], /* Hangul Syllable */ + ["\uD456", "\uD456"], /* Hangul Syllable */ + ["\uD457", "\uD457"], /* Hangul Syllable */ + ["\uD458", "\uD458"], /* Hangul Syllable */ + ["\uD459", "\uD459"], /* Hangul Syllable */ + ["\uD45A", "\uD45A"], /* Hangul Syllable */ + ["\uD45B", "\uD45B"], /* Hangul Syllable */ + ["\uD45C", "\uD45C"], /* Hangul Syllable */ + ["\uD45D", "\uD45D"], /* Hangul Syllable */ + ["\uD45E", "\uD45E"], /* Hangul Syllable */ + ["\uD45F", "\uD45F"], /* Hangul Syllable */ + ["\uD460", "\uD460"], /* Hangul Syllable */ + ["\uD461", "\uD461"], /* Hangul Syllable */ + ["\uD462", "\uD462"], /* Hangul Syllable */ + ["\uD463", "\uD463"], /* Hangul Syllable */ + ["\uD464", "\uD464"], /* Hangul Syllable */ + ["\uD465", "\uD465"], /* Hangul Syllable */ + ["\uD466", "\uD466"], /* Hangul Syllable */ + ["\uD467", "\uD467"], /* Hangul Syllable */ + ["\uD468", "\uD468"], /* Hangul Syllable */ + ["\uD469", "\uD469"], /* Hangul Syllable */ + ["\uD46A", "\uD46A"], /* Hangul Syllable */ + ["\uD46B", "\uD46B"], /* Hangul Syllable */ + ["\uD46C", "\uD46C"], /* Hangul Syllable */ + ["\uD46D", "\uD46D"], /* Hangul Syllable */ + ["\uD46E", "\uD46E"], /* Hangul Syllable */ + ["\uD46F", "\uD46F"], /* Hangul Syllable */ + ["\uD470", "\uD470"], /* Hangul Syllable */ + ["\uD471", "\uD471"], /* Hangul Syllable */ + ["\uD472", "\uD472"], /* Hangul Syllable */ + ["\uD473", "\uD473"], /* Hangul Syllable */ + ["\uD474", "\uD474"], /* Hangul Syllable */ + ["\uD475", "\uD475"], /* Hangul Syllable */ + ["\uD476", "\uD476"], /* Hangul Syllable */ + ["\uD477", "\uD477"], /* Hangul Syllable */ + ["\uD478", "\uD478"], /* Hangul Syllable */ + ["\uD479", "\uD479"], /* Hangul Syllable */ + ["\uD47A", "\uD47A"], /* Hangul Syllable */ + ["\uD47B", "\uD47B"], /* Hangul Syllable */ + ["\uD47C", "\uD47C"], /* Hangul Syllable */ + ["\uD47D", "\uD47D"], /* Hangul Syllable */ + ["\uD47E", "\uD47E"], /* Hangul Syllable */ + ["\uD47F", "\uD47F"], /* Hangul Syllable */ + ["\uD480", "\uD480"], /* Hangul Syllable */ + ["\uD481", "\uD481"], /* Hangul Syllable */ + ["\uD482", "\uD482"], /* Hangul Syllable */ + ["\uD483", "\uD483"], /* Hangul Syllable */ + ["\uD484", "\uD484"], /* Hangul Syllable */ + ["\uD485", "\uD485"], /* Hangul Syllable */ + ["\uD486", "\uD486"], /* Hangul Syllable */ + ["\uD487", "\uD487"], /* Hangul Syllable */ + ["\uD488", "\uD488"], /* Hangul Syllable */ + ["\uD489", "\uD489"], /* Hangul Syllable */ + ["\uD48A", "\uD48A"], /* Hangul Syllable */ + ["\uD48B", "\uD48B"], /* Hangul Syllable */ + ["\uD48C", "\uD48C"], /* Hangul Syllable */ + ["\uD48D", "\uD48D"], /* Hangul Syllable */ + ["\uD48E", "\uD48E"], /* Hangul Syllable */ + ["\uD48F", "\uD48F"], /* Hangul Syllable */ + ["\uD490", "\uD490"], /* Hangul Syllable */ + ["\uD491", "\uD491"], /* Hangul Syllable */ + ["\uD492", "\uD492"], /* Hangul Syllable */ + ["\uD493", "\uD493"], /* Hangul Syllable */ + ["\uD494", "\uD494"], /* Hangul Syllable */ + ["\uD495", "\uD495"], /* Hangul Syllable */ + ["\uD496", "\uD496"], /* Hangul Syllable */ + ["\uD497", "\uD497"], /* Hangul Syllable */ + ["\uD498", "\uD498"], /* Hangul Syllable */ + ["\uD499", "\uD499"], /* Hangul Syllable */ + ["\uD49A", "\uD49A"], /* Hangul Syllable */ + ["\uD49B", "\uD49B"], /* Hangul Syllable */ + ["\uD49C", "\uD49C"], /* Hangul Syllable */ + ["\uD49D", "\uD49D"], /* Hangul Syllable */ + ["\uD49E", "\uD49E"], /* Hangul Syllable */ + ["\uD49F", "\uD49F"], /* Hangul Syllable */ + ["\uD4A0", "\uD4A0"], /* Hangul Syllable */ + ["\uD4A1", "\uD4A1"], /* Hangul Syllable */ + ["\uD4A2", "\uD4A2"], /* Hangul Syllable */ + ["\uD4A3", "\uD4A3"], /* Hangul Syllable */ + ["\uD4A4", "\uD4A4"], /* Hangul Syllable */ + ["\uD4A5", "\uD4A5"], /* Hangul Syllable */ + ["\uD4A6", "\uD4A6"], /* Hangul Syllable */ + ["\uD4A7", "\uD4A7"], /* Hangul Syllable */ + ["\uD4A8", "\uD4A8"], /* Hangul Syllable */ + ["\uD4A9", "\uD4A9"], /* Hangul Syllable */ + ["\uD4AA", "\uD4AA"], /* Hangul Syllable */ + ["\uD4AB", "\uD4AB"], /* Hangul Syllable */ + ["\uD4AC", "\uD4AC"], /* Hangul Syllable */ + ["\uD4AD", "\uD4AD"], /* Hangul Syllable */ + ["\uD4AE", "\uD4AE"], /* Hangul Syllable */ + ["\uD4AF", "\uD4AF"], /* Hangul Syllable */ + ["\uD4B0", "\uD4B0"], /* Hangul Syllable */ + ["\uD4B1", "\uD4B1"], /* Hangul Syllable */ + ["\uD4B2", "\uD4B2"], /* Hangul Syllable */ + ["\uD4B3", "\uD4B3"], /* Hangul Syllable */ + ["\uD4B4", "\uD4B4"], /* Hangul Syllable */ + ["\uD4B5", "\uD4B5"], /* Hangul Syllable */ + ["\uD4B6", "\uD4B6"], /* Hangul Syllable */ + ["\uD4B7", "\uD4B7"], /* Hangul Syllable */ + ["\uD4B8", "\uD4B8"], /* Hangul Syllable */ + ["\uD4B9", "\uD4B9"], /* Hangul Syllable */ + ["\uD4BA", "\uD4BA"], /* Hangul Syllable */ + ["\uD4BB", "\uD4BB"], /* Hangul Syllable */ + ["\uD4BC", "\uD4BC"], /* Hangul Syllable */ + ["\uD4BD", "\uD4BD"], /* Hangul Syllable */ + ["\uD4BE", "\uD4BE"], /* Hangul Syllable */ + ["\uD4BF", "\uD4BF"], /* Hangul Syllable */ + ["\uD4C0", "\uD4C0"], /* Hangul Syllable */ + ["\uD4C1", "\uD4C1"], /* Hangul Syllable */ + ["\uD4C2", "\uD4C2"], /* Hangul Syllable */ + ["\uD4C3", "\uD4C3"], /* Hangul Syllable */ + ["\uD4C4", "\uD4C4"], /* Hangul Syllable */ + ["\uD4C5", "\uD4C5"], /* Hangul Syllable */ + ["\uD4C6", "\uD4C6"], /* Hangul Syllable */ + ["\uD4C7", "\uD4C7"], /* Hangul Syllable */ + ["\uD4C8", "\uD4C8"], /* Hangul Syllable */ + ["\uD4C9", "\uD4C9"], /* Hangul Syllable */ + ["\uD4CA", "\uD4CA"], /* Hangul Syllable */ + ["\uD4CB", "\uD4CB"], /* Hangul Syllable */ + ["\uD4CC", "\uD4CC"], /* Hangul Syllable */ + ["\uD4CD", "\uD4CD"], /* Hangul Syllable */ + ["\uD4CE", "\uD4CE"], /* Hangul Syllable */ + ["\uD4CF", "\uD4CF"], /* Hangul Syllable */ + ["\uD4D0", "\uD4D0"], /* Hangul Syllable */ + ["\uD4D1", "\uD4D1"], /* Hangul Syllable */ + ["\uD4D2", "\uD4D2"], /* Hangul Syllable */ + ["\uD4D3", "\uD4D3"], /* Hangul Syllable */ + ["\uD4D4", "\uD4D4"], /* Hangul Syllable */ + ["\uD4D5", "\uD4D5"], /* Hangul Syllable */ + ["\uD4D6", "\uD4D6"], /* Hangul Syllable */ + ["\uD4D7", "\uD4D7"], /* Hangul Syllable */ + ["\uD4D8", "\uD4D8"], /* Hangul Syllable */ + ["\uD4D9", "\uD4D9"], /* Hangul Syllable */ + ["\uD4DA", "\uD4DA"], /* Hangul Syllable */ + ["\uD4DB", "\uD4DB"], /* Hangul Syllable */ + ["\uD4DC", "\uD4DC"], /* Hangul Syllable */ + ["\uD4DD", "\uD4DD"], /* Hangul Syllable */ + ["\uD4DE", "\uD4DE"], /* Hangul Syllable */ + ["\uD4DF", "\uD4DF"], /* Hangul Syllable */ + ["\uD4E0", "\uD4E0"], /* Hangul Syllable */ + ["\uD4E1", "\uD4E1"], /* Hangul Syllable */ + ["\uD4E2", "\uD4E2"], /* Hangul Syllable */ + ["\uD4E3", "\uD4E3"], /* Hangul Syllable */ + ["\uD4E4", "\uD4E4"], /* Hangul Syllable */ + ["\uD4E5", "\uD4E5"], /* Hangul Syllable */ + ["\uD4E6", "\uD4E6"], /* Hangul Syllable */ + ["\uD4E7", "\uD4E7"], /* Hangul Syllable */ + ["\uD4E8", "\uD4E8"], /* Hangul Syllable */ + ["\uD4E9", "\uD4E9"], /* Hangul Syllable */ + ["\uD4EA", "\uD4EA"], /* Hangul Syllable */ + ["\uD4EB", "\uD4EB"], /* Hangul Syllable */ + ["\uD4EC", "\uD4EC"], /* Hangul Syllable */ + ["\uD4ED", "\uD4ED"], /* Hangul Syllable */ + ["\uD4EE", "\uD4EE"], /* Hangul Syllable */ + ["\uD4EF", "\uD4EF"], /* Hangul Syllable */ + ["\uD4F0", "\uD4F0"], /* Hangul Syllable */ + ["\uD4F1", "\uD4F1"], /* Hangul Syllable */ + ["\uD4F2", "\uD4F2"], /* Hangul Syllable */ + ["\uD4F3", "\uD4F3"], /* Hangul Syllable */ + ["\uD4F4", "\uD4F4"], /* Hangul Syllable */ + ["\uD4F5", "\uD4F5"], /* Hangul Syllable */ + ["\uD4F6", "\uD4F6"], /* Hangul Syllable */ + ["\uD4F7", "\uD4F7"], /* Hangul Syllable */ + ["\uD4F8", "\uD4F8"], /* Hangul Syllable */ + ["\uD4F9", "\uD4F9"], /* Hangul Syllable */ + ["\uD4FA", "\uD4FA"], /* Hangul Syllable */ + ["\uD4FB", "\uD4FB"], /* Hangul Syllable */ + ["\uD4FC", "\uD4FC"], /* Hangul Syllable */ + ["\uD4FD", "\uD4FD"], /* Hangul Syllable */ + ["\uD4FE", "\uD4FE"], /* Hangul Syllable */ + ["\uD4FF", "\uD4FF"], /* Hangul Syllable */ + ["\uD500", "\uD500"], /* Hangul Syllable */ + ["\uD501", "\uD501"], /* Hangul Syllable */ + ["\uD502", "\uD502"], /* Hangul Syllable */ + ["\uD503", "\uD503"], /* Hangul Syllable */ + ["\uD504", "\uD504"], /* Hangul Syllable */ + ["\uD505", "\uD505"], /* Hangul Syllable */ + ["\uD506", "\uD506"], /* Hangul Syllable */ + ["\uD507", "\uD507"], /* Hangul Syllable */ + ["\uD508", "\uD508"], /* Hangul Syllable */ + ["\uD509", "\uD509"], /* Hangul Syllable */ + ["\uD50A", "\uD50A"], /* Hangul Syllable */ + ["\uD50B", "\uD50B"], /* Hangul Syllable */ + ["\uD50C", "\uD50C"], /* Hangul Syllable */ + ["\uD50D", "\uD50D"], /* Hangul Syllable */ + ["\uD50E", "\uD50E"], /* Hangul Syllable */ + ["\uD50F", "\uD50F"], /* Hangul Syllable */ + ["\uD510", "\uD510"], /* Hangul Syllable */ + ["\uD511", "\uD511"], /* Hangul Syllable */ + ["\uD512", "\uD512"], /* Hangul Syllable */ + ["\uD513", "\uD513"], /* Hangul Syllable */ + ["\uD514", "\uD514"], /* Hangul Syllable */ + ["\uD515", "\uD515"], /* Hangul Syllable */ + ["\uD516", "\uD516"], /* Hangul Syllable */ + ["\uD517", "\uD517"], /* Hangul Syllable */ + ["\uD518", "\uD518"], /* Hangul Syllable */ + ["\uD519", "\uD519"], /* Hangul Syllable */ + ["\uD51A", "\uD51A"], /* Hangul Syllable */ + ["\uD51B", "\uD51B"], /* Hangul Syllable */ + ["\uD51C", "\uD51C"], /* Hangul Syllable */ + ["\uD51D", "\uD51D"], /* Hangul Syllable */ + ["\uD51E", "\uD51E"], /* Hangul Syllable */ + ["\uD51F", "\uD51F"], /* Hangul Syllable */ + ["\uD520", "\uD520"], /* Hangul Syllable */ + ["\uD521", "\uD521"], /* Hangul Syllable */ + ["\uD522", "\uD522"], /* Hangul Syllable */ + ["\uD523", "\uD523"], /* Hangul Syllable */ + ["\uD524", "\uD524"], /* Hangul Syllable */ + ["\uD525", "\uD525"], /* Hangul Syllable */ + ["\uD526", "\uD526"], /* Hangul Syllable */ + ["\uD527", "\uD527"], /* Hangul Syllable */ + ["\uD528", "\uD528"], /* Hangul Syllable */ + ["\uD529", "\uD529"], /* Hangul Syllable */ + ["\uD52A", "\uD52A"], /* Hangul Syllable */ + ["\uD52B", "\uD52B"], /* Hangul Syllable */ + ["\uD52C", "\uD52C"], /* Hangul Syllable */ + ["\uD52D", "\uD52D"], /* Hangul Syllable */ + ["\uD52E", "\uD52E"], /* Hangul Syllable */ + ["\uD52F", "\uD52F"], /* Hangul Syllable */ + ["\uD530", "\uD530"], /* Hangul Syllable */ + ["\uD531", "\uD531"], /* Hangul Syllable */ + ["\uD532", "\uD532"], /* Hangul Syllable */ + ["\uD533", "\uD533"], /* Hangul Syllable */ + ["\uD534", "\uD534"], /* Hangul Syllable */ + ["\uD535", "\uD535"], /* Hangul Syllable */ + ["\uD536", "\uD536"], /* Hangul Syllable */ + ["\uD537", "\uD537"], /* Hangul Syllable */ + ["\uD538", "\uD538"], /* Hangul Syllable */ + ["\uD539", "\uD539"], /* Hangul Syllable */ + ["\uD53A", "\uD53A"], /* Hangul Syllable */ + ["\uD53B", "\uD53B"], /* Hangul Syllable */ + ["\uD53C", "\uD53C"], /* Hangul Syllable */ + ["\uD53D", "\uD53D"], /* Hangul Syllable */ + ["\uD53E", "\uD53E"], /* Hangul Syllable */ + ["\uD53F", "\uD53F"], /* Hangul Syllable */ + ["\uD540", "\uD540"], /* Hangul Syllable */ + ["\uD541", "\uD541"], /* Hangul Syllable */ + ["\uD542", "\uD542"], /* Hangul Syllable */ + ["\uD543", "\uD543"], /* Hangul Syllable */ + ["\uD544", "\uD544"], /* Hangul Syllable */ + ["\uD545", "\uD545"], /* Hangul Syllable */ + ["\uD546", "\uD546"], /* Hangul Syllable */ + ["\uD547", "\uD547"], /* Hangul Syllable */ + ["\uD548", "\uD548"], /* Hangul Syllable */ + ["\uD549", "\uD549"], /* Hangul Syllable */ + ["\uD54A", "\uD54A"], /* Hangul Syllable */ + ["\uD54B", "\uD54B"], /* Hangul Syllable */ + ["\uD54C", "\uD54C"], /* Hangul Syllable */ + ["\uD54D", "\uD54D"], /* Hangul Syllable */ + ["\uD54E", "\uD54E"], /* Hangul Syllable */ + ["\uD54F", "\uD54F"], /* Hangul Syllable */ + ["\uD550", "\uD550"], /* Hangul Syllable */ + ["\uD551", "\uD551"], /* Hangul Syllable */ + ["\uD552", "\uD552"], /* Hangul Syllable */ + ["\uD553", "\uD553"], /* Hangul Syllable */ + ["\uD554", "\uD554"], /* Hangul Syllable */ + ["\uD555", "\uD555"], /* Hangul Syllable */ + ["\uD556", "\uD556"], /* Hangul Syllable */ + ["\uD557", "\uD557"], /* Hangul Syllable */ + ["\uD558", "\uD558"], /* Hangul Syllable */ + ["\uD559", "\uD559"], /* Hangul Syllable */ + ["\uD55A", "\uD55A"], /* Hangul Syllable */ + ["\uD55B", "\uD55B"], /* Hangul Syllable */ + ["\uD55C", "\uD55C"], /* Hangul Syllable */ + ["\uD55D", "\uD55D"], /* Hangul Syllable */ + ["\uD55E", "\uD55E"], /* Hangul Syllable */ + ["\uD55F", "\uD55F"], /* Hangul Syllable */ + ["\uD560", "\uD560"], /* Hangul Syllable */ + ["\uD561", "\uD561"], /* Hangul Syllable */ + ["\uD562", "\uD562"], /* Hangul Syllable */ + ["\uD563", "\uD563"], /* Hangul Syllable */ + ["\uD564", "\uD564"], /* Hangul Syllable */ + ["\uD565", "\uD565"], /* Hangul Syllable */ + ["\uD566", "\uD566"], /* Hangul Syllable */ + ["\uD567", "\uD567"], /* Hangul Syllable */ + ["\uD568", "\uD568"], /* Hangul Syllable */ + ["\uD569", "\uD569"], /* Hangul Syllable */ + ["\uD56A", "\uD56A"], /* Hangul Syllable */ + ["\uD56B", "\uD56B"], /* Hangul Syllable */ + ["\uD56C", "\uD56C"], /* Hangul Syllable */ + ["\uD56D", "\uD56D"], /* Hangul Syllable */ + ["\uD56E", "\uD56E"], /* Hangul Syllable */ + ["\uD56F", "\uD56F"], /* Hangul Syllable */ + ["\uD570", "\uD570"], /* Hangul Syllable */ + ["\uD571", "\uD571"], /* Hangul Syllable */ + ["\uD572", "\uD572"], /* Hangul Syllable */ + ["\uD573", "\uD573"], /* Hangul Syllable */ + ["\uD574", "\uD574"], /* Hangul Syllable */ + ["\uD575", "\uD575"], /* Hangul Syllable */ + ["\uD576", "\uD576"], /* Hangul Syllable */ + ["\uD577", "\uD577"], /* Hangul Syllable */ + ["\uD578", "\uD578"], /* Hangul Syllable */ + ["\uD579", "\uD579"], /* Hangul Syllable */ + ["\uD57A", "\uD57A"], /* Hangul Syllable */ + ["\uD57B", "\uD57B"], /* Hangul Syllable */ + ["\uD57C", "\uD57C"], /* Hangul Syllable */ + ["\uD57D", "\uD57D"], /* Hangul Syllable */ + ["\uD57E", "\uD57E"], /* Hangul Syllable */ + ["\uD57F", "\uD57F"], /* Hangul Syllable */ + ["\uD580", "\uD580"], /* Hangul Syllable */ + ["\uD581", "\uD581"], /* Hangul Syllable */ + ["\uD582", "\uD582"], /* Hangul Syllable */ + ["\uD583", "\uD583"], /* Hangul Syllable */ + ["\uD584", "\uD584"], /* Hangul Syllable */ + ["\uD585", "\uD585"], /* Hangul Syllable */ + ["\uD586", "\uD586"], /* Hangul Syllable */ + ["\uD587", "\uD587"], /* Hangul Syllable */ + ["\uD588", "\uD588"], /* Hangul Syllable */ + ["\uD589", "\uD589"], /* Hangul Syllable */ + ["\uD58A", "\uD58A"], /* Hangul Syllable */ + ["\uD58B", "\uD58B"], /* Hangul Syllable */ + ["\uD58C", "\uD58C"], /* Hangul Syllable */ + ["\uD58D", "\uD58D"], /* Hangul Syllable */ + ["\uD58E", "\uD58E"], /* Hangul Syllable */ + ["\uD58F", "\uD58F"], /* Hangul Syllable */ + ["\uD590", "\uD590"], /* Hangul Syllable */ + ["\uD591", "\uD591"], /* Hangul Syllable */ + ["\uD592", "\uD592"], /* Hangul Syllable */ + ["\uD593", "\uD593"], /* Hangul Syllable */ + ["\uD594", "\uD594"], /* Hangul Syllable */ + ["\uD595", "\uD595"], /* Hangul Syllable */ + ["\uD596", "\uD596"], /* Hangul Syllable */ + ["\uD597", "\uD597"], /* Hangul Syllable */ + ["\uD598", "\uD598"], /* Hangul Syllable */ + ["\uD599", "\uD599"], /* Hangul Syllable */ + ["\uD59A", "\uD59A"], /* Hangul Syllable */ + ["\uD59B", "\uD59B"], /* Hangul Syllable */ + ["\uD59C", "\uD59C"], /* Hangul Syllable */ + ["\uD59D", "\uD59D"], /* Hangul Syllable */ + ["\uD59E", "\uD59E"], /* Hangul Syllable */ + ["\uD59F", "\uD59F"], /* Hangul Syllable */ + ["\uD5A0", "\uD5A0"], /* Hangul Syllable */ + ["\uD5A1", "\uD5A1"], /* Hangul Syllable */ + ["\uD5A2", "\uD5A2"], /* Hangul Syllable */ + ["\uD5A3", "\uD5A3"], /* Hangul Syllable */ + ["\uD5A4", "\uD5A4"], /* Hangul Syllable */ + ["\uD5A5", "\uD5A5"], /* Hangul Syllable */ + ["\uD5A6", "\uD5A6"], /* Hangul Syllable */ + ["\uD5A7", "\uD5A7"], /* Hangul Syllable */ + ["\uD5A8", "\uD5A8"], /* Hangul Syllable */ + ["\uD5A9", "\uD5A9"], /* Hangul Syllable */ + ["\uD5AA", "\uD5AA"], /* Hangul Syllable */ + ["\uD5AB", "\uD5AB"], /* Hangul Syllable */ + ["\uD5AC", "\uD5AC"], /* Hangul Syllable */ + ["\uD5AD", "\uD5AD"], /* Hangul Syllable */ + ["\uD5AE", "\uD5AE"], /* Hangul Syllable */ + ["\uD5AF", "\uD5AF"], /* Hangul Syllable */ + ["\uD5B0", "\uD5B0"], /* Hangul Syllable */ + ["\uD5B1", "\uD5B1"], /* Hangul Syllable */ + ["\uD5B2", "\uD5B2"], /* Hangul Syllable */ + ["\uD5B3", "\uD5B3"], /* Hangul Syllable */ + ["\uD5B4", "\uD5B4"], /* Hangul Syllable */ + ["\uD5B5", "\uD5B5"], /* Hangul Syllable */ + ["\uD5B6", "\uD5B6"], /* Hangul Syllable */ + ["\uD5B7", "\uD5B7"], /* Hangul Syllable */ + ["\uD5B8", "\uD5B8"], /* Hangul Syllable */ + ["\uD5B9", "\uD5B9"], /* Hangul Syllable */ + ["\uD5BA", "\uD5BA"], /* Hangul Syllable */ + ["\uD5BB", "\uD5BB"], /* Hangul Syllable */ + ["\uD5BC", "\uD5BC"], /* Hangul Syllable */ + ["\uD5BD", "\uD5BD"], /* Hangul Syllable */ + ["\uD5BE", "\uD5BE"], /* Hangul Syllable */ + ["\uD5BF", "\uD5BF"], /* Hangul Syllable */ + ["\uD5C0", "\uD5C0"], /* Hangul Syllable */ + ["\uD5C1", "\uD5C1"], /* Hangul Syllable */ + ["\uD5C2", "\uD5C2"], /* Hangul Syllable */ + ["\uD5C3", "\uD5C3"], /* Hangul Syllable */ + ["\uD5C4", "\uD5C4"], /* Hangul Syllable */ + ["\uD5C5", "\uD5C5"], /* Hangul Syllable */ + ["\uD5C6", "\uD5C6"], /* Hangul Syllable */ + ["\uD5C7", "\uD5C7"], /* Hangul Syllable */ + ["\uD5C8", "\uD5C8"], /* Hangul Syllable */ + ["\uD5C9", "\uD5C9"], /* Hangul Syllable */ + ["\uD5CA", "\uD5CA"], /* Hangul Syllable */ + ["\uD5CB", "\uD5CB"], /* Hangul Syllable */ + ["\uD5CC", "\uD5CC"], /* Hangul Syllable */ + ["\uD5CD", "\uD5CD"], /* Hangul Syllable */ + ["\uD5CE", "\uD5CE"], /* Hangul Syllable */ + ["\uD5CF", "\uD5CF"], /* Hangul Syllable */ + ["\uD5D0", "\uD5D0"], /* Hangul Syllable */ + ["\uD5D1", "\uD5D1"], /* Hangul Syllable */ + ["\uD5D2", "\uD5D2"], /* Hangul Syllable */ + ["\uD5D3", "\uD5D3"], /* Hangul Syllable */ + ["\uD5D4", "\uD5D4"], /* Hangul Syllable */ + ["\uD5D5", "\uD5D5"], /* Hangul Syllable */ + ["\uD5D6", "\uD5D6"], /* Hangul Syllable */ + ["\uD5D7", "\uD5D7"], /* Hangul Syllable */ + ["\uD5D8", "\uD5D8"], /* Hangul Syllable */ + ["\uD5D9", "\uD5D9"], /* Hangul Syllable */ + ["\uD5DA", "\uD5DA"], /* Hangul Syllable */ + ["\uD5DB", "\uD5DB"], /* Hangul Syllable */ + ["\uD5DC", "\uD5DC"], /* Hangul Syllable */ + ["\uD5DD", "\uD5DD"], /* Hangul Syllable */ + ["\uD5DE", "\uD5DE"], /* Hangul Syllable */ + ["\uD5DF", "\uD5DF"], /* Hangul Syllable */ + ["\uD5E0", "\uD5E0"], /* Hangul Syllable */ + ["\uD5E1", "\uD5E1"], /* Hangul Syllable */ + ["\uD5E2", "\uD5E2"], /* Hangul Syllable */ + ["\uD5E3", "\uD5E3"], /* Hangul Syllable */ + ["\uD5E4", "\uD5E4"], /* Hangul Syllable */ + ["\uD5E5", "\uD5E5"], /* Hangul Syllable */ + ["\uD5E6", "\uD5E6"], /* Hangul Syllable */ + ["\uD5E7", "\uD5E7"], /* Hangul Syllable */ + ["\uD5E8", "\uD5E8"], /* Hangul Syllable */ + ["\uD5E9", "\uD5E9"], /* Hangul Syllable */ + ["\uD5EA", "\uD5EA"], /* Hangul Syllable */ + ["\uD5EB", "\uD5EB"], /* Hangul Syllable */ + ["\uD5EC", "\uD5EC"], /* Hangul Syllable */ + ["\uD5ED", "\uD5ED"], /* Hangul Syllable */ + ["\uD5EE", "\uD5EE"], /* Hangul Syllable */ + ["\uD5EF", "\uD5EF"], /* Hangul Syllable */ + ["\uD5F0", "\uD5F0"], /* Hangul Syllable */ + ["\uD5F1", "\uD5F1"], /* Hangul Syllable */ + ["\uD5F2", "\uD5F2"], /* Hangul Syllable */ + ["\uD5F3", "\uD5F3"], /* Hangul Syllable */ + ["\uD5F4", "\uD5F4"], /* Hangul Syllable */ + ["\uD5F5", "\uD5F5"], /* Hangul Syllable */ + ["\uD5F6", "\uD5F6"], /* Hangul Syllable */ + ["\uD5F7", "\uD5F7"], /* Hangul Syllable */ + ["\uD5F8", "\uD5F8"], /* Hangul Syllable */ + ["\uD5F9", "\uD5F9"], /* Hangul Syllable */ + ["\uD5FA", "\uD5FA"], /* Hangul Syllable */ + ["\uD5FB", "\uD5FB"], /* Hangul Syllable */ + ["\uD5FC", "\uD5FC"], /* Hangul Syllable */ + ["\uD5FD", "\uD5FD"], /* Hangul Syllable */ + ["\uD5FE", "\uD5FE"], /* Hangul Syllable */ + ["\uD5FF", "\uD5FF"], /* Hangul Syllable */ + ["\uD600", "\uD600"], /* Hangul Syllable */ + ["\uD601", "\uD601"], /* Hangul Syllable */ + ["\uD602", "\uD602"], /* Hangul Syllable */ + ["\uD603", "\uD603"], /* Hangul Syllable */ + ["\uD604", "\uD604"], /* Hangul Syllable */ + ["\uD605", "\uD605"], /* Hangul Syllable */ + ["\uD606", "\uD606"], /* Hangul Syllable */ + ["\uD607", "\uD607"], /* Hangul Syllable */ + ["\uD608", "\uD608"], /* Hangul Syllable */ + ["\uD609", "\uD609"], /* Hangul Syllable */ + ["\uD60A", "\uD60A"], /* Hangul Syllable */ + ["\uD60B", "\uD60B"], /* Hangul Syllable */ + ["\uD60C", "\uD60C"], /* Hangul Syllable */ + ["\uD60D", "\uD60D"], /* Hangul Syllable */ + ["\uD60E", "\uD60E"], /* Hangul Syllable */ + ["\uD60F", "\uD60F"], /* Hangul Syllable */ + ["\uD610", "\uD610"], /* Hangul Syllable */ + ["\uD611", "\uD611"], /* Hangul Syllable */ + ["\uD612", "\uD612"], /* Hangul Syllable */ + ["\uD613", "\uD613"], /* Hangul Syllable */ + ["\uD614", "\uD614"], /* Hangul Syllable */ + ["\uD615", "\uD615"], /* Hangul Syllable */ + ["\uD616", "\uD616"], /* Hangul Syllable */ + ["\uD617", "\uD617"], /* Hangul Syllable */ + ["\uD618", "\uD618"], /* Hangul Syllable */ + ["\uD619", "\uD619"], /* Hangul Syllable */ + ["\uD61A", "\uD61A"], /* Hangul Syllable */ + ["\uD61B", "\uD61B"], /* Hangul Syllable */ + ["\uD61C", "\uD61C"], /* Hangul Syllable */ + ["\uD61D", "\uD61D"], /* Hangul Syllable */ + ["\uD61E", "\uD61E"], /* Hangul Syllable */ + ["\uD61F", "\uD61F"], /* Hangul Syllable */ + ["\uD620", "\uD620"], /* Hangul Syllable */ + ["\uD621", "\uD621"], /* Hangul Syllable */ + ["\uD622", "\uD622"], /* Hangul Syllable */ + ["\uD623", "\uD623"], /* Hangul Syllable */ + ["\uD624", "\uD624"], /* Hangul Syllable */ + ["\uD625", "\uD625"], /* Hangul Syllable */ + ["\uD626", "\uD626"], /* Hangul Syllable */ + ["\uD627", "\uD627"], /* Hangul Syllable */ + ["\uD628", "\uD628"], /* Hangul Syllable */ + ["\uD629", "\uD629"], /* Hangul Syllable */ + ["\uD62A", "\uD62A"], /* Hangul Syllable */ + ["\uD62B", "\uD62B"], /* Hangul Syllable */ + ["\uD62C", "\uD62C"], /* Hangul Syllable */ + ["\uD62D", "\uD62D"], /* Hangul Syllable */ + ["\uD62E", "\uD62E"], /* Hangul Syllable */ + ["\uD62F", "\uD62F"], /* Hangul Syllable */ + ["\uD630", "\uD630"], /* Hangul Syllable */ + ["\uD631", "\uD631"], /* Hangul Syllable */ + ["\uD632", "\uD632"], /* Hangul Syllable */ + ["\uD633", "\uD633"], /* Hangul Syllable */ + ["\uD634", "\uD634"], /* Hangul Syllable */ + ["\uD635", "\uD635"], /* Hangul Syllable */ + ["\uD636", "\uD636"], /* Hangul Syllable */ + ["\uD637", "\uD637"], /* Hangul Syllable */ + ["\uD638", "\uD638"], /* Hangul Syllable */ + ["\uD639", "\uD639"], /* Hangul Syllable */ + ["\uD63A", "\uD63A"], /* Hangul Syllable */ + ["\uD63B", "\uD63B"], /* Hangul Syllable */ + ["\uD63C", "\uD63C"], /* Hangul Syllable */ + ["\uD63D", "\uD63D"], /* Hangul Syllable */ + ["\uD63E", "\uD63E"], /* Hangul Syllable */ + ["\uD63F", "\uD63F"], /* Hangul Syllable */ + ["\uD640", "\uD640"], /* Hangul Syllable */ + ["\uD641", "\uD641"], /* Hangul Syllable */ + ["\uD642", "\uD642"], /* Hangul Syllable */ + ["\uD643", "\uD643"], /* Hangul Syllable */ + ["\uD644", "\uD644"], /* Hangul Syllable */ + ["\uD645", "\uD645"], /* Hangul Syllable */ + ["\uD646", "\uD646"], /* Hangul Syllable */ + ["\uD647", "\uD647"], /* Hangul Syllable */ + ["\uD648", "\uD648"], /* Hangul Syllable */ + ["\uD649", "\uD649"], /* Hangul Syllable */ + ["\uD64A", "\uD64A"], /* Hangul Syllable */ + ["\uD64B", "\uD64B"], /* Hangul Syllable */ + ["\uD64C", "\uD64C"], /* Hangul Syllable */ + ["\uD64D", "\uD64D"], /* Hangul Syllable */ + ["\uD64E", "\uD64E"], /* Hangul Syllable */ + ["\uD64F", "\uD64F"], /* Hangul Syllable */ + ["\uD650", "\uD650"], /* Hangul Syllable */ + ["\uD651", "\uD651"], /* Hangul Syllable */ + ["\uD652", "\uD652"], /* Hangul Syllable */ + ["\uD653", "\uD653"], /* Hangul Syllable */ + ["\uD654", "\uD654"], /* Hangul Syllable */ + ["\uD655", "\uD655"], /* Hangul Syllable */ + ["\uD656", "\uD656"], /* Hangul Syllable */ + ["\uD657", "\uD657"], /* Hangul Syllable */ + ["\uD658", "\uD658"], /* Hangul Syllable */ + ["\uD659", "\uD659"], /* Hangul Syllable */ + ["\uD65A", "\uD65A"], /* Hangul Syllable */ + ["\uD65B", "\uD65B"], /* Hangul Syllable */ + ["\uD65C", "\uD65C"], /* Hangul Syllable */ + ["\uD65D", "\uD65D"], /* Hangul Syllable */ + ["\uD65E", "\uD65E"], /* Hangul Syllable */ + ["\uD65F", "\uD65F"], /* Hangul Syllable */ + ["\uD660", "\uD660"], /* Hangul Syllable */ + ["\uD661", "\uD661"], /* Hangul Syllable */ + ["\uD662", "\uD662"], /* Hangul Syllable */ + ["\uD663", "\uD663"], /* Hangul Syllable */ + ["\uD664", "\uD664"], /* Hangul Syllable */ + ["\uD665", "\uD665"], /* Hangul Syllable */ + ["\uD666", "\uD666"], /* Hangul Syllable */ + ["\uD667", "\uD667"], /* Hangul Syllable */ + ["\uD668", "\uD668"], /* Hangul Syllable */ + ["\uD669", "\uD669"], /* Hangul Syllable */ + ["\uD66A", "\uD66A"], /* Hangul Syllable */ + ["\uD66B", "\uD66B"], /* Hangul Syllable */ + ["\uD66C", "\uD66C"], /* Hangul Syllable */ + ["\uD66D", "\uD66D"], /* Hangul Syllable */ + ["\uD66E", "\uD66E"], /* Hangul Syllable */ + ["\uD66F", "\uD66F"], /* Hangul Syllable */ + ["\uD670", "\uD670"], /* Hangul Syllable */ + ["\uD671", "\uD671"], /* Hangul Syllable */ + ["\uD672", "\uD672"], /* Hangul Syllable */ + ["\uD673", "\uD673"], /* Hangul Syllable */ + ["\uD674", "\uD674"], /* Hangul Syllable */ + ["\uD675", "\uD675"], /* Hangul Syllable */ + ["\uD676", "\uD676"], /* Hangul Syllable */ + ["\uD677", "\uD677"], /* Hangul Syllable */ + ["\uD678", "\uD678"], /* Hangul Syllable */ + ["\uD679", "\uD679"], /* Hangul Syllable */ + ["\uD67A", "\uD67A"], /* Hangul Syllable */ + ["\uD67B", "\uD67B"], /* Hangul Syllable */ + ["\uD67C", "\uD67C"], /* Hangul Syllable */ + ["\uD67D", "\uD67D"], /* Hangul Syllable */ + ["\uD67E", "\uD67E"], /* Hangul Syllable */ + ["\uD67F", "\uD67F"], /* Hangul Syllable */ + ["\uD680", "\uD680"], /* Hangul Syllable */ + ["\uD681", "\uD681"], /* Hangul Syllable */ + ["\uD682", "\uD682"], /* Hangul Syllable */ + ["\uD683", "\uD683"], /* Hangul Syllable */ + ["\uD684", "\uD684"], /* Hangul Syllable */ + ["\uD685", "\uD685"], /* Hangul Syllable */ + ["\uD686", "\uD686"], /* Hangul Syllable */ + ["\uD687", "\uD687"], /* Hangul Syllable */ + ["\uD688", "\uD688"], /* Hangul Syllable */ + ["\uD689", "\uD689"], /* Hangul Syllable */ + ["\uD68A", "\uD68A"], /* Hangul Syllable */ + ["\uD68B", "\uD68B"], /* Hangul Syllable */ + ["\uD68C", "\uD68C"], /* Hangul Syllable */ + ["\uD68D", "\uD68D"], /* Hangul Syllable */ + ["\uD68E", "\uD68E"], /* Hangul Syllable */ + ["\uD68F", "\uD68F"], /* Hangul Syllable */ + ["\uD690", "\uD690"], /* Hangul Syllable */ + ["\uD691", "\uD691"], /* Hangul Syllable */ + ["\uD692", "\uD692"], /* Hangul Syllable */ + ["\uD693", "\uD693"], /* Hangul Syllable */ + ["\uD694", "\uD694"], /* Hangul Syllable */ + ["\uD695", "\uD695"], /* Hangul Syllable */ + ["\uD696", "\uD696"], /* Hangul Syllable */ + ["\uD697", "\uD697"], /* Hangul Syllable */ + ["\uD698", "\uD698"], /* Hangul Syllable */ + ["\uD699", "\uD699"], /* Hangul Syllable */ + ["\uD69A", "\uD69A"], /* Hangul Syllable */ + ["\uD69B", "\uD69B"], /* Hangul Syllable */ + ["\uD69C", "\uD69C"], /* Hangul Syllable */ + ["\uD69D", "\uD69D"], /* Hangul Syllable */ + ["\uD69E", "\uD69E"], /* Hangul Syllable */ + ["\uD69F", "\uD69F"], /* Hangul Syllable */ + ["\uD6A0", "\uD6A0"], /* Hangul Syllable */ + ["\uD6A1", "\uD6A1"], /* Hangul Syllable */ + ["\uD6A2", "\uD6A2"], /* Hangul Syllable */ + ["\uD6A3", "\uD6A3"], /* Hangul Syllable */ + ["\uD6A4", "\uD6A4"], /* Hangul Syllable */ + ["\uD6A5", "\uD6A5"], /* Hangul Syllable */ + ["\uD6A6", "\uD6A6"], /* Hangul Syllable */ + ["\uD6A7", "\uD6A7"], /* Hangul Syllable */ + ["\uD6A8", "\uD6A8"], /* Hangul Syllable */ + ["\uD6A9", "\uD6A9"], /* Hangul Syllable */ + ["\uD6AA", "\uD6AA"], /* Hangul Syllable */ + ["\uD6AB", "\uD6AB"], /* Hangul Syllable */ + ["\uD6AC", "\uD6AC"], /* Hangul Syllable */ + ["\uD6AD", "\uD6AD"], /* Hangul Syllable */ + ["\uD6AE", "\uD6AE"], /* Hangul Syllable */ + ["\uD6AF", "\uD6AF"], /* Hangul Syllable */ + ["\uD6B0", "\uD6B0"], /* Hangul Syllable */ + ["\uD6B1", "\uD6B1"], /* Hangul Syllable */ + ["\uD6B2", "\uD6B2"], /* Hangul Syllable */ + ["\uD6B3", "\uD6B3"], /* Hangul Syllable */ + ["\uD6B4", "\uD6B4"], /* Hangul Syllable */ + ["\uD6B5", "\uD6B5"], /* Hangul Syllable */ + ["\uD6B6", "\uD6B6"], /* Hangul Syllable */ + ["\uD6B7", "\uD6B7"], /* Hangul Syllable */ + ["\uD6B8", "\uD6B8"], /* Hangul Syllable */ + ["\uD6B9", "\uD6B9"], /* Hangul Syllable */ + ["\uD6BA", "\uD6BA"], /* Hangul Syllable */ + ["\uD6BB", "\uD6BB"], /* Hangul Syllable */ + ["\uD6BC", "\uD6BC"], /* Hangul Syllable */ + ["\uD6BD", "\uD6BD"], /* Hangul Syllable */ + ["\uD6BE", "\uD6BE"], /* Hangul Syllable */ + ["\uD6BF", "\uD6BF"], /* Hangul Syllable */ + ["\uD6C0", "\uD6C0"], /* Hangul Syllable */ + ["\uD6C1", "\uD6C1"], /* Hangul Syllable */ + ["\uD6C2", "\uD6C2"], /* Hangul Syllable */ + ["\uD6C3", "\uD6C3"], /* Hangul Syllable */ + ["\uD6C4", "\uD6C4"], /* Hangul Syllable */ + ["\uD6C5", "\uD6C5"], /* Hangul Syllable */ + ["\uD6C6", "\uD6C6"], /* Hangul Syllable */ + ["\uD6C7", "\uD6C7"], /* Hangul Syllable */ + ["\uD6C8", "\uD6C8"], /* Hangul Syllable */ + ["\uD6C9", "\uD6C9"], /* Hangul Syllable */ + ["\uD6CA", "\uD6CA"], /* Hangul Syllable */ + ["\uD6CB", "\uD6CB"], /* Hangul Syllable */ + ["\uD6CC", "\uD6CC"], /* Hangul Syllable */ + ["\uD6CD", "\uD6CD"], /* Hangul Syllable */ + ["\uD6CE", "\uD6CE"], /* Hangul Syllable */ + ["\uD6CF", "\uD6CF"], /* Hangul Syllable */ + ["\uD6D0", "\uD6D0"], /* Hangul Syllable */ + ["\uD6D1", "\uD6D1"], /* Hangul Syllable */ + ["\uD6D2", "\uD6D2"], /* Hangul Syllable */ + ["\uD6D3", "\uD6D3"], /* Hangul Syllable */ + ["\uD6D4", "\uD6D4"], /* Hangul Syllable */ + ["\uD6D5", "\uD6D5"], /* Hangul Syllable */ + ["\uD6D6", "\uD6D6"], /* Hangul Syllable */ + ["\uD6D7", "\uD6D7"], /* Hangul Syllable */ + ["\uD6D8", "\uD6D8"], /* Hangul Syllable */ + ["\uD6D9", "\uD6D9"], /* Hangul Syllable */ + ["\uD6DA", "\uD6DA"], /* Hangul Syllable */ + ["\uD6DB", "\uD6DB"], /* Hangul Syllable */ + ["\uD6DC", "\uD6DC"], /* Hangul Syllable */ + ["\uD6DD", "\uD6DD"], /* Hangul Syllable */ + ["\uD6DE", "\uD6DE"], /* Hangul Syllable */ + ["\uD6DF", "\uD6DF"], /* Hangul Syllable */ + ["\uD6E0", "\uD6E0"], /* Hangul Syllable */ + ["\uD6E1", "\uD6E1"], /* Hangul Syllable */ + ["\uD6E2", "\uD6E2"], /* Hangul Syllable */ + ["\uD6E3", "\uD6E3"], /* Hangul Syllable */ + ["\uD6E4", "\uD6E4"], /* Hangul Syllable */ + ["\uD6E5", "\uD6E5"], /* Hangul Syllable */ + ["\uD6E6", "\uD6E6"], /* Hangul Syllable */ + ["\uD6E7", "\uD6E7"], /* Hangul Syllable */ + ["\uD6E8", "\uD6E8"], /* Hangul Syllable */ + ["\uD6E9", "\uD6E9"], /* Hangul Syllable */ + ["\uD6EA", "\uD6EA"], /* Hangul Syllable */ + ["\uD6EB", "\uD6EB"], /* Hangul Syllable */ + ["\uD6EC", "\uD6EC"], /* Hangul Syllable */ + ["\uD6ED", "\uD6ED"], /* Hangul Syllable */ + ["\uD6EE", "\uD6EE"], /* Hangul Syllable */ + ["\uD6EF", "\uD6EF"], /* Hangul Syllable */ + ["\uD6F0", "\uD6F0"], /* Hangul Syllable */ + ["\uD6F1", "\uD6F1"], /* Hangul Syllable */ + ["\uD6F2", "\uD6F2"], /* Hangul Syllable */ + ["\uD6F3", "\uD6F3"], /* Hangul Syllable */ + ["\uD6F4", "\uD6F4"], /* Hangul Syllable */ + ["\uD6F5", "\uD6F5"], /* Hangul Syllable */ + ["\uD6F6", "\uD6F6"], /* Hangul Syllable */ + ["\uD6F7", "\uD6F7"], /* Hangul Syllable */ + ["\uD6F8", "\uD6F8"], /* Hangul Syllable */ + ["\uD6F9", "\uD6F9"], /* Hangul Syllable */ + ["\uD6FA", "\uD6FA"], /* Hangul Syllable */ + ["\uD6FB", "\uD6FB"], /* Hangul Syllable */ + ["\uD6FC", "\uD6FC"], /* Hangul Syllable */ + ["\uD6FD", "\uD6FD"], /* Hangul Syllable */ + ["\uD6FE", "\uD6FE"], /* Hangul Syllable */ + ["\uD6FF", "\uD6FF"], /* Hangul Syllable */ + ["\uD700", "\uD700"], /* Hangul Syllable */ + ["\uD701", "\uD701"], /* Hangul Syllable */ + ["\uD702", "\uD702"], /* Hangul Syllable */ + ["\uD703", "\uD703"], /* Hangul Syllable */ + ["\uD704", "\uD704"], /* Hangul Syllable */ + ["\uD705", "\uD705"], /* Hangul Syllable */ + ["\uD706", "\uD706"], /* Hangul Syllable */ + ["\uD707", "\uD707"], /* Hangul Syllable */ + ["\uD708", "\uD708"], /* Hangul Syllable */ + ["\uD709", "\uD709"], /* Hangul Syllable */ + ["\uD70A", "\uD70A"], /* Hangul Syllable */ + ["\uD70B", "\uD70B"], /* Hangul Syllable */ + ["\uD70C", "\uD70C"], /* Hangul Syllable */ + ["\uD70D", "\uD70D"], /* Hangul Syllable */ + ["\uD70E", "\uD70E"], /* Hangul Syllable */ + ["\uD70F", "\uD70F"], /* Hangul Syllable */ + ["\uD710", "\uD710"], /* Hangul Syllable */ + ["\uD711", "\uD711"], /* Hangul Syllable */ + ["\uD712", "\uD712"], /* Hangul Syllable */ + ["\uD713", "\uD713"], /* Hangul Syllable */ + ["\uD714", "\uD714"], /* Hangul Syllable */ + ["\uD715", "\uD715"], /* Hangul Syllable */ + ["\uD716", "\uD716"], /* Hangul Syllable */ + ["\uD717", "\uD717"], /* Hangul Syllable */ + ["\uD718", "\uD718"], /* Hangul Syllable */ + ["\uD719", "\uD719"], /* Hangul Syllable */ + ["\uD71A", "\uD71A"], /* Hangul Syllable */ + ["\uD71B", "\uD71B"], /* Hangul Syllable */ + ["\uD71C", "\uD71C"], /* Hangul Syllable */ + ["\uD71D", "\uD71D"], /* Hangul Syllable */ + ["\uD71E", "\uD71E"], /* Hangul Syllable */ + ["\uD71F", "\uD71F"], /* Hangul Syllable */ + ["\uD720", "\uD720"], /* Hangul Syllable */ + ["\uD721", "\uD721"], /* Hangul Syllable */ + ["\uD722", "\uD722"], /* Hangul Syllable */ + ["\uD723", "\uD723"], /* Hangul Syllable */ + ["\uD724", "\uD724"], /* Hangul Syllable */ + ["\uD725", "\uD725"], /* Hangul Syllable */ + ["\uD726", "\uD726"], /* Hangul Syllable */ + ["\uD727", "\uD727"], /* Hangul Syllable */ + ["\uD728", "\uD728"], /* Hangul Syllable */ + ["\uD729", "\uD729"], /* Hangul Syllable */ + ["\uD72A", "\uD72A"], /* Hangul Syllable */ + ["\uD72B", "\uD72B"], /* Hangul Syllable */ + ["\uD72C", "\uD72C"], /* Hangul Syllable */ + ["\uD72D", "\uD72D"], /* Hangul Syllable */ + ["\uD72E", "\uD72E"], /* Hangul Syllable */ + ["\uD72F", "\uD72F"], /* Hangul Syllable */ + ["\uD730", "\uD730"], /* Hangul Syllable */ + ["\uD731", "\uD731"], /* Hangul Syllable */ + ["\uD732", "\uD732"], /* Hangul Syllable */ + ["\uD733", "\uD733"], /* Hangul Syllable */ + ["\uD734", "\uD734"], /* Hangul Syllable */ + ["\uD735", "\uD735"], /* Hangul Syllable */ + ["\uD736", "\uD736"], /* Hangul Syllable */ + ["\uD737", "\uD737"], /* Hangul Syllable */ + ["\uD738", "\uD738"], /* Hangul Syllable */ + ["\uD739", "\uD739"], /* Hangul Syllable */ + ["\uD73A", "\uD73A"], /* Hangul Syllable */ + ["\uD73B", "\uD73B"], /* Hangul Syllable */ + ["\uD73C", "\uD73C"], /* Hangul Syllable */ + ["\uD73D", "\uD73D"], /* Hangul Syllable */ + ["\uD73E", "\uD73E"], /* Hangul Syllable */ + ["\uD73F", "\uD73F"], /* Hangul Syllable */ + ["\uD740", "\uD740"], /* Hangul Syllable */ + ["\uD741", "\uD741"], /* Hangul Syllable */ + ["\uD742", "\uD742"], /* Hangul Syllable */ + ["\uD743", "\uD743"], /* Hangul Syllable */ + ["\uD744", "\uD744"], /* Hangul Syllable */ + ["\uD745", "\uD745"], /* Hangul Syllable */ + ["\uD746", "\uD746"], /* Hangul Syllable */ + ["\uD747", "\uD747"], /* Hangul Syllable */ + ["\uD748", "\uD748"], /* Hangul Syllable */ + ["\uD749", "\uD749"], /* Hangul Syllable */ + ["\uD74A", "\uD74A"], /* Hangul Syllable */ + ["\uD74B", "\uD74B"], /* Hangul Syllable */ + ["\uD74C", "\uD74C"], /* Hangul Syllable */ + ["\uD74D", "\uD74D"], /* Hangul Syllable */ + ["\uD74E", "\uD74E"], /* Hangul Syllable */ + ["\uD74F", "\uD74F"], /* Hangul Syllable */ + ["\uD750", "\uD750"], /* Hangul Syllable */ + ["\uD751", "\uD751"], /* Hangul Syllable */ + ["\uD752", "\uD752"], /* Hangul Syllable */ + ["\uD753", "\uD753"], /* Hangul Syllable */ + ["\uD754", "\uD754"], /* Hangul Syllable */ + ["\uD755", "\uD755"], /* Hangul Syllable */ + ["\uD756", "\uD756"], /* Hangul Syllable */ + ["\uD757", "\uD757"], /* Hangul Syllable */ + ["\uD758", "\uD758"], /* Hangul Syllable */ + ["\uD759", "\uD759"], /* Hangul Syllable */ + ["\uD75A", "\uD75A"], /* Hangul Syllable */ + ["\uD75B", "\uD75B"], /* Hangul Syllable */ + ["\uD75C", "\uD75C"], /* Hangul Syllable */ + ["\uD75D", "\uD75D"], /* Hangul Syllable */ + ["\uD75E", "\uD75E"], /* Hangul Syllable */ + ["\uD75F", "\uD75F"], /* Hangul Syllable */ + ["\uD760", "\uD760"], /* Hangul Syllable */ + ["\uD761", "\uD761"], /* Hangul Syllable */ + ["\uD762", "\uD762"], /* Hangul Syllable */ + ["\uD763", "\uD763"], /* Hangul Syllable */ + ["\uD764", "\uD764"], /* Hangul Syllable */ + ["\uD765", "\uD765"], /* Hangul Syllable */ + ["\uD766", "\uD766"], /* Hangul Syllable */ + ["\uD767", "\uD767"], /* Hangul Syllable */ + ["\uD768", "\uD768"], /* Hangul Syllable */ + ["\uD769", "\uD769"], /* Hangul Syllable */ + ["\uD76A", "\uD76A"], /* Hangul Syllable */ + ["\uD76B", "\uD76B"], /* Hangul Syllable */ + ["\uD76C", "\uD76C"], /* Hangul Syllable */ + ["\uD76D", "\uD76D"], /* Hangul Syllable */ + ["\uD76E", "\uD76E"], /* Hangul Syllable */ + ["\uD76F", "\uD76F"], /* Hangul Syllable */ + ["\uD770", "\uD770"], /* Hangul Syllable */ + ["\uD771", "\uD771"], /* Hangul Syllable */ + ["\uD772", "\uD772"], /* Hangul Syllable */ + ["\uD773", "\uD773"], /* Hangul Syllable */ + ["\uD774", "\uD774"], /* Hangul Syllable */ + ["\uD775", "\uD775"], /* Hangul Syllable */ + ["\uD776", "\uD776"], /* Hangul Syllable */ + ["\uD777", "\uD777"], /* Hangul Syllable */ + ["\uD778", "\uD778"], /* Hangul Syllable */ + ["\uD779", "\uD779"], /* Hangul Syllable */ + ["\uD77A", "\uD77A"], /* Hangul Syllable */ + ["\uD77B", "\uD77B"], /* Hangul Syllable */ + ["\uD77C", "\uD77C"], /* Hangul Syllable */ + ["\uD77D", "\uD77D"], /* Hangul Syllable */ + ["\uD77E", "\uD77E"], /* Hangul Syllable */ + ["\uD77F", "\uD77F"], /* Hangul Syllable */ + ["\uD780", "\uD780"], /* Hangul Syllable */ + ["\uD781", "\uD781"], /* Hangul Syllable */ + ["\uD782", "\uD782"], /* Hangul Syllable */ + ["\uD783", "\uD783"], /* Hangul Syllable */ + ["\uD784", "\uD784"], /* Hangul Syllable */ + ["\uD785", "\uD785"], /* Hangul Syllable */ + ["\uD786", "\uD786"], /* Hangul Syllable */ + ["\uD787", "\uD787"], /* Hangul Syllable */ + ["\uD788", "\uD788"], /* Hangul Syllable */ + ["\uD789", "\uD789"], /* Hangul Syllable */ + ["\uD78A", "\uD78A"], /* Hangul Syllable */ + ["\uD78B", "\uD78B"], /* Hangul Syllable */ + ["\uD78C", "\uD78C"], /* Hangul Syllable */ + ["\uD78D", "\uD78D"], /* Hangul Syllable */ + ["\uD78E", "\uD78E"], /* Hangul Syllable */ + ["\uD78F", "\uD78F"], /* Hangul Syllable */ + ["\uD790", "\uD790"], /* Hangul Syllable */ + ["\uD791", "\uD791"], /* Hangul Syllable */ + ["\uD792", "\uD792"], /* Hangul Syllable */ + ["\uD793", "\uD793"], /* Hangul Syllable */ + ["\uD794", "\uD794"], /* Hangul Syllable */ + ["\uD795", "\uD795"], /* Hangul Syllable */ + ["\uD796", "\uD796"], /* Hangul Syllable */ + ["\uD797", "\uD797"], /* Hangul Syllable */ + ["\uD798", "\uD798"], /* Hangul Syllable */ + ["\uD799", "\uD799"], /* Hangul Syllable */ + ["\uD79A", "\uD79A"], /* Hangul Syllable */ + ["\uD79B", "\uD79B"], /* Hangul Syllable */ + ["\uD79C", "\uD79C"], /* Hangul Syllable */ + ["\uD79D", "\uD79D"], /* Hangul Syllable */ + ["\uD79E", "\uD79E"], /* Hangul Syllable */ + ["\uD79F", "\uD79F"], /* Hangul Syllable */ + ["\uD7A0", "\uD7A0"], /* Hangul Syllable */ + ["\uD7A1", "\uD7A1"], /* Hangul Syllable */ + ["\uD7A2", "\uD7A2"], /* Hangul Syllable */ + ["\uD7A3", "\uD7A3"], /* Hangul Syllable */ + ["\uD7A4", "\uD7A4"], + ["\uD7A5", "\uD7A5"], + ["\uD7A6", "\uD7A6"], + ["\uD7A7", "\uD7A7"], + ["\uD7A8", "\uD7A8"], + ["\uD7A9", "\uD7A9"], + ["\uD7AA", "\uD7AA"], + ["\uD7AB", "\uD7AB"], + ["\uD7AC", "\uD7AC"], + ["\uD7AD", "\uD7AD"], + ["\uD7AE", "\uD7AE"], + ["\uD7AF", "\uD7AF"], + ["\uD7B0", "\uD7B0"], /* HANGUL JUNGSEONG O-YEO */ + ["\uD7B1", "\uD7B1"], /* HANGUL JUNGSEONG O-O-I */ + ["\uD7B2", "\uD7B2"], /* HANGUL JUNGSEONG YO-A */ + ["\uD7B3", "\uD7B3"], /* HANGUL JUNGSEONG YO-AE */ + ["\uD7B4", "\uD7B4"], /* HANGUL JUNGSEONG YO-EO */ + ["\uD7B5", "\uD7B5"], /* HANGUL JUNGSEONG U-YEO */ + ["\uD7B6", "\uD7B6"], /* HANGUL JUNGSEONG U-I-I */ + ["\uD7B7", "\uD7B7"], /* HANGUL JUNGSEONG YU-AE */ + ["\uD7B8", "\uD7B8"], /* HANGUL JUNGSEONG YU-O */ + ["\uD7B9", "\uD7B9"], /* HANGUL JUNGSEONG EU-A */ + ["\uD7BA", "\uD7BA"], /* HANGUL JUNGSEONG EU-EO */ + ["\uD7BB", "\uD7BB"], /* HANGUL JUNGSEONG EU-E */ + ["\uD7BC", "\uD7BC"], /* HANGUL JUNGSEONG EU-O */ + ["\uD7BD", "\uD7BD"], /* HANGUL JUNGSEONG I-YA-O */ + ["\uD7BE", "\uD7BE"], /* HANGUL JUNGSEONG I-YAE */ + ["\uD7BF", "\uD7BF"], /* HANGUL JUNGSEONG I-YEO */ + ["\uD7C0", "\uD7C0"], /* HANGUL JUNGSEONG I-YE */ + ["\uD7C1", "\uD7C1"], /* HANGUL JUNGSEONG I-O-I */ + ["\uD7C2", "\uD7C2"], /* HANGUL JUNGSEONG I-YO */ + ["\uD7C3", "\uD7C3"], /* HANGUL JUNGSEONG I-YU */ + ["\uD7C4", "\uD7C4"], /* HANGUL JUNGSEONG I-I */ + ["\uD7C5", "\uD7C5"], /* HANGUL JUNGSEONG ARAEA-A */ + ["\uD7C6", "\uD7C6"], /* HANGUL JUNGSEONG ARAEA-E */ + ["\uD7C7", "\uD7C7"], + ["\uD7C8", "\uD7C8"], + ["\uD7C9", "\uD7C9"], + ["\uD7CA", "\uD7CA"], + ["\uD7CB", "\uD7CB"], /* HANGUL JONGSEONG NIEUN-RIEUL */ + ["\uD7CC", "\uD7CC"], /* HANGUL JONGSEONG NIEUN-CHIEUCH */ + ["\uD7CD", "\uD7CD"], /* HANGUL JONGSEONG SSANGTIKEUT */ + ["\uD7CE", "\uD7CE"], /* HANGUL JONGSEONG SSANGTIKEUT-PIEUP */ + ["\uD7CF", "\uD7CF"], /* HANGUL JONGSEONG TIKEUT-PIEUP */ + ["\uD7D0", "\uD7D0"], /* HANGUL JONGSEONG TIKEUT-SIOS */ + ["\uD7D1", "\uD7D1"], /* HANGUL JONGSEONG TIKEUT-SIOS-KIYEOK */ + ["\uD7D2", "\uD7D2"], /* HANGUL JONGSEONG TIKEUT-CIEUC */ + ["\uD7D3", "\uD7D3"], /* HANGUL JONGSEONG TIKEUT-CHIEUCH */ + ["\uD7D4", "\uD7D4"], /* HANGUL JONGSEONG TIKEUT-THIEUTH */ + ["\uD7D5", "\uD7D5"], /* HANGUL JONGSEONG RIEUL-SSANGKIYEOK */ + ["\uD7D6", "\uD7D6"], /* HANGUL JONGSEONG RIEUL-KIYEOK-HIEUH */ + ["\uD7D7", "\uD7D7"], /* HANGUL JONGSEONG SSANGRIEUL-KHIEUKH */ + ["\uD7D8", "\uD7D8"], /* HANGUL JONGSEONG RIEUL-MIEUM-HIEUH */ + ["\uD7D9", "\uD7D9"], /* HANGUL JONGSEONG RIEUL-PIEUP-TIKEUT */ + ["\uD7DA", "\uD7DA"], /* HANGUL JONGSEONG RIEUL-PIEUP-PHIEUPH */ + ["\uD7DB", "\uD7DB"], /* HANGUL JONGSEONG RIEUL-YESIEUNG */ + ["\uD7DC", "\uD7DC"], /* HANGUL JONGSEONG RIEUL-YEORINHIEUH-HIEUH */ + ["\uD7DD", "\uD7DD"], /* HANGUL JONGSEONG KAPYEOUNRIEUL */ + ["\uD7DE", "\uD7DE"], /* HANGUL JONGSEONG MIEUM-NIEUN */ + ["\uD7DF", "\uD7DF"], /* HANGUL JONGSEONG MIEUM-SSANGNIEUN */ + ["\uD7E0", "\uD7E0"], /* HANGUL JONGSEONG SSANGMIEUM */ + ["\uD7E1", "\uD7E1"], /* HANGUL JONGSEONG MIEUM-PIEUP-SIOS */ + ["\uD7E2", "\uD7E2"], /* HANGUL JONGSEONG MIEUM-CIEUC */ + ["\uD7E3", "\uD7E3"], /* HANGUL JONGSEONG PIEUP-TIKEUT */ + ["\uD7E4", "\uD7E4"], /* HANGUL JONGSEONG PIEUP-RIEUL-PHIEUPH */ + ["\uD7E5", "\uD7E5"], /* HANGUL JONGSEONG PIEUP-MIEUM */ + ["\uD7E6", "\uD7E6"], /* HANGUL JONGSEONG SSANGPIEUP */ + ["\uD7E7", "\uD7E7"], /* HANGUL JONGSEONG PIEUP-SIOS-TIKEUT */ + ["\uD7E8", "\uD7E8"], /* HANGUL JONGSEONG PIEUP-CIEUC */ + ["\uD7E9", "\uD7E9"], /* HANGUL JONGSEONG PIEUP-CHIEUCH */ + ["\uD7EA", "\uD7EA"], /* HANGUL JONGSEONG SIOS-MIEUM */ + ["\uD7EB", "\uD7EB"], /* HANGUL JONGSEONG SIOS-KAPYEOUNPIEUP */ + ["\uD7EC", "\uD7EC"], /* HANGUL JONGSEONG SSANGSIOS-KIYEOK */ + ["\uD7ED", "\uD7ED"], /* HANGUL JONGSEONG SSANGSIOS-TIKEUT */ + ["\uD7EE", "\uD7EE"], /* HANGUL JONGSEONG SIOS-PANSIOS */ + ["\uD7EF", "\uD7EF"], /* HANGUL JONGSEONG SIOS-CIEUC */ + ["\uD7F0", "\uD7F0"], /* HANGUL JONGSEONG SIOS-CHIEUCH */ + ["\uD7F1", "\uD7F1"], /* HANGUL JONGSEONG SIOS-THIEUTH */ + ["\uD7F2", "\uD7F2"], /* HANGUL JONGSEONG SIOS-HIEUH */ + ["\uD7F3", "\uD7F3"], /* HANGUL JONGSEONG PANSIOS-PIEUP */ + ["\uD7F4", "\uD7F4"], /* HANGUL JONGSEONG PANSIOS-KAPYEOUNPIEUP */ + ["\uD7F5", "\uD7F5"], /* HANGUL JONGSEONG YESIEUNG-MIEUM */ + ["\uD7F6", "\uD7F6"], /* HANGUL JONGSEONG YESIEUNG-HIEUH */ + ["\uD7F7", "\uD7F7"], /* HANGUL JONGSEONG CIEUC-PIEUP */ + ["\uD7F8", "\uD7F8"], /* HANGUL JONGSEONG CIEUC-SSANGPIEUP */ + ["\uD7F9", "\uD7F9"], /* HANGUL JONGSEONG SSANGCIEUC */ + ["\uD7FA", "\uD7FA"], /* HANGUL JONGSEONG PHIEUPH-SIOS */ + ["\uD7FB", "\uD7FB"], /* HANGUL JONGSEONG PHIEUPH-THIEUTH */ + ["\uD7FC", "\uD7FC"], + ["\uD7FD", "\uD7FD"], + ["\uD7FE", "\uD7FE"], + ["\uD7FF", "\uD7FF"], + ["\uD800", "\uD800"], /* Non Private Use High Surrogate */ + ["\uD801", "\uD801"], /* Non Private Use High Surrogate */ + ["\uD802", "\uD802"], /* Non Private Use High Surrogate */ + ["\uD803", "\uD803"], /* Non Private Use High Surrogate */ + ["\uD804", "\uD804"], /* Non Private Use High Surrogate */ + ["\uD805", "\uD805"], /* Non Private Use High Surrogate */ + ["\uD806", "\uD806"], /* Non Private Use High Surrogate */ + ["\uD807", "\uD807"], /* Non Private Use High Surrogate */ + ["\uD808", "\uD808"], /* Non Private Use High Surrogate */ + ["\uD809", "\uD809"], /* Non Private Use High Surrogate */ + ["\uD80A", "\uD80A"], /* Non Private Use High Surrogate */ + ["\uD80B", "\uD80B"], /* Non Private Use High Surrogate */ + ["\uD80C", "\uD80C"], /* Non Private Use High Surrogate */ + ["\uD80D", "\uD80D"], /* Non Private Use High Surrogate */ + ["\uD80E", "\uD80E"], /* Non Private Use High Surrogate */ + ["\uD80F", "\uD80F"], /* Non Private Use High Surrogate */ + ["\uD810", "\uD810"], /* Non Private Use High Surrogate */ + ["\uD811", "\uD811"], /* Non Private Use High Surrogate */ + ["\uD812", "\uD812"], /* Non Private Use High Surrogate */ + ["\uD813", "\uD813"], /* Non Private Use High Surrogate */ + ["\uD814", "\uD814"], /* Non Private Use High Surrogate */ + ["\uD815", "\uD815"], /* Non Private Use High Surrogate */ + ["\uD816", "\uD816"], /* Non Private Use High Surrogate */ + ["\uD817", "\uD817"], /* Non Private Use High Surrogate */ + ["\uD818", "\uD818"], /* Non Private Use High Surrogate */ + ["\uD819", "\uD819"], /* Non Private Use High Surrogate */ + ["\uD81A", "\uD81A"], /* Non Private Use High Surrogate */ + ["\uD81B", "\uD81B"], /* Non Private Use High Surrogate */ + ["\uD81C", "\uD81C"], /* Non Private Use High Surrogate */ + ["\uD81D", "\uD81D"], /* Non Private Use High Surrogate */ + ["\uD81E", "\uD81E"], /* Non Private Use High Surrogate */ + ["\uD81F", "\uD81F"], /* Non Private Use High Surrogate */ + ["\uD820", "\uD820"], /* Non Private Use High Surrogate */ + ["\uD821", "\uD821"], /* Non Private Use High Surrogate */ + ["\uD822", "\uD822"], /* Non Private Use High Surrogate */ + ["\uD823", "\uD823"], /* Non Private Use High Surrogate */ + ["\uD824", "\uD824"], /* Non Private Use High Surrogate */ + ["\uD825", "\uD825"], /* Non Private Use High Surrogate */ + ["\uD826", "\uD826"], /* Non Private Use High Surrogate */ + ["\uD827", "\uD827"], /* Non Private Use High Surrogate */ + ["\uD828", "\uD828"], /* Non Private Use High Surrogate */ + ["\uD829", "\uD829"], /* Non Private Use High Surrogate */ + ["\uD82A", "\uD82A"], /* Non Private Use High Surrogate */ + ["\uD82B", "\uD82B"], /* Non Private Use High Surrogate */ + ["\uD82C", "\uD82C"], /* Non Private Use High Surrogate */ + ["\uD82D", "\uD82D"], /* Non Private Use High Surrogate */ + ["\uD82E", "\uD82E"], /* Non Private Use High Surrogate */ + ["\uD82F", "\uD82F"], /* Non Private Use High Surrogate */ + ["\uD830", "\uD830"], /* Non Private Use High Surrogate */ + ["\uD831", "\uD831"], /* Non Private Use High Surrogate */ + ["\uD832", "\uD832"], /* Non Private Use High Surrogate */ + ["\uD833", "\uD833"], /* Non Private Use High Surrogate */ + ["\uD834", "\uD834"], /* Non Private Use High Surrogate */ + ["\uD835", "\uD835"], /* Non Private Use High Surrogate */ + ["\uD836", "\uD836"], /* Non Private Use High Surrogate */ + ["\uD837", "\uD837"], /* Non Private Use High Surrogate */ + ["\uD838", "\uD838"], /* Non Private Use High Surrogate */ + ["\uD839", "\uD839"], /* Non Private Use High Surrogate */ + ["\uD83A", "\uD83A"], /* Non Private Use High Surrogate */ + ["\uD83B", "\uD83B"], /* Non Private Use High Surrogate */ + ["\uD83C", "\uD83C"], /* Non Private Use High Surrogate */ + ["\uD83D", "\uD83D"], /* Non Private Use High Surrogate */ + ["\uD83E", "\uD83E"], /* Non Private Use High Surrogate */ + ["\uD83F", "\uD83F"], /* Non Private Use High Surrogate */ + ["\uD840", "\uD840"], /* Non Private Use High Surrogate */ + ["\uD841", "\uD841"], /* Non Private Use High Surrogate */ + ["\uD842", "\uD842"], /* Non Private Use High Surrogate */ + ["\uD843", "\uD843"], /* Non Private Use High Surrogate */ + ["\uD844", "\uD844"], /* Non Private Use High Surrogate */ + ["\uD845", "\uD845"], /* Non Private Use High Surrogate */ + ["\uD846", "\uD846"], /* Non Private Use High Surrogate */ + ["\uD847", "\uD847"], /* Non Private Use High Surrogate */ + ["\uD848", "\uD848"], /* Non Private Use High Surrogate */ + ["\uD849", "\uD849"], /* Non Private Use High Surrogate */ + ["\uD84A", "\uD84A"], /* Non Private Use High Surrogate */ + ["\uD84B", "\uD84B"], /* Non Private Use High Surrogate */ + ["\uD84C", "\uD84C"], /* Non Private Use High Surrogate */ + ["\uD84D", "\uD84D"], /* Non Private Use High Surrogate */ + ["\uD84E", "\uD84E"], /* Non Private Use High Surrogate */ + ["\uD84F", "\uD84F"], /* Non Private Use High Surrogate */ + ["\uD850", "\uD850"], /* Non Private Use High Surrogate */ + ["\uD851", "\uD851"], /* Non Private Use High Surrogate */ + ["\uD852", "\uD852"], /* Non Private Use High Surrogate */ + ["\uD853", "\uD853"], /* Non Private Use High Surrogate */ + ["\uD854", "\uD854"], /* Non Private Use High Surrogate */ + ["\uD855", "\uD855"], /* Non Private Use High Surrogate */ + ["\uD856", "\uD856"], /* Non Private Use High Surrogate */ + ["\uD857", "\uD857"], /* Non Private Use High Surrogate */ + ["\uD858", "\uD858"], /* Non Private Use High Surrogate */ + ["\uD859", "\uD859"], /* Non Private Use High Surrogate */ + ["\uD85A", "\uD85A"], /* Non Private Use High Surrogate */ + ["\uD85B", "\uD85B"], /* Non Private Use High Surrogate */ + ["\uD85C", "\uD85C"], /* Non Private Use High Surrogate */ + ["\uD85D", "\uD85D"], /* Non Private Use High Surrogate */ + ["\uD85E", "\uD85E"], /* Non Private Use High Surrogate */ + ["\uD85F", "\uD85F"], /* Non Private Use High Surrogate */ + ["\uD860", "\uD860"], /* Non Private Use High Surrogate */ + ["\uD861", "\uD861"], /* Non Private Use High Surrogate */ + ["\uD862", "\uD862"], /* Non Private Use High Surrogate */ + ["\uD863", "\uD863"], /* Non Private Use High Surrogate */ + ["\uD864", "\uD864"], /* Non Private Use High Surrogate */ + ["\uD865", "\uD865"], /* Non Private Use High Surrogate */ + ["\uD866", "\uD866"], /* Non Private Use High Surrogate */ + ["\uD867", "\uD867"], /* Non Private Use High Surrogate */ + ["\uD868", "\uD868"], /* Non Private Use High Surrogate */ + ["\uD869", "\uD869"], /* Non Private Use High Surrogate */ + ["\uD86A", "\uD86A"], /* Non Private Use High Surrogate */ + ["\uD86B", "\uD86B"], /* Non Private Use High Surrogate */ + ["\uD86C", "\uD86C"], /* Non Private Use High Surrogate */ + ["\uD86D", "\uD86D"], /* Non Private Use High Surrogate */ + ["\uD86E", "\uD86E"], /* Non Private Use High Surrogate */ + ["\uD86F", "\uD86F"], /* Non Private Use High Surrogate */ + ["\uD870", "\uD870"], /* Non Private Use High Surrogate */ + ["\uD871", "\uD871"], /* Non Private Use High Surrogate */ + ["\uD872", "\uD872"], /* Non Private Use High Surrogate */ + ["\uD873", "\uD873"], /* Non Private Use High Surrogate */ + ["\uD874", "\uD874"], /* Non Private Use High Surrogate */ + ["\uD875", "\uD875"], /* Non Private Use High Surrogate */ + ["\uD876", "\uD876"], /* Non Private Use High Surrogate */ + ["\uD877", "\uD877"], /* Non Private Use High Surrogate */ + ["\uD878", "\uD878"], /* Non Private Use High Surrogate */ + ["\uD879", "\uD879"], /* Non Private Use High Surrogate */ + ["\uD87A", "\uD87A"], /* Non Private Use High Surrogate */ + ["\uD87B", "\uD87B"], /* Non Private Use High Surrogate */ + ["\uD87C", "\uD87C"], /* Non Private Use High Surrogate */ + ["\uD87D", "\uD87D"], /* Non Private Use High Surrogate */ + ["\uD87E", "\uD87E"], /* Non Private Use High Surrogate */ + ["\uD87F", "\uD87F"], /* Non Private Use High Surrogate */ + ["\uD880", "\uD880"], /* Non Private Use High Surrogate */ + ["\uD881", "\uD881"], /* Non Private Use High Surrogate */ + ["\uD882", "\uD882"], /* Non Private Use High Surrogate */ + ["\uD883", "\uD883"], /* Non Private Use High Surrogate */ + ["\uD884", "\uD884"], /* Non Private Use High Surrogate */ + ["\uD885", "\uD885"], /* Non Private Use High Surrogate */ + ["\uD886", "\uD886"], /* Non Private Use High Surrogate */ + ["\uD887", "\uD887"], /* Non Private Use High Surrogate */ + ["\uD888", "\uD888"], /* Non Private Use High Surrogate */ + ["\uD889", "\uD889"], /* Non Private Use High Surrogate */ + ["\uD88A", "\uD88A"], /* Non Private Use High Surrogate */ + ["\uD88B", "\uD88B"], /* Non Private Use High Surrogate */ + ["\uD88C", "\uD88C"], /* Non Private Use High Surrogate */ + ["\uD88D", "\uD88D"], /* Non Private Use High Surrogate */ + ["\uD88E", "\uD88E"], /* Non Private Use High Surrogate */ + ["\uD88F", "\uD88F"], /* Non Private Use High Surrogate */ + ["\uD890", "\uD890"], /* Non Private Use High Surrogate */ + ["\uD891", "\uD891"], /* Non Private Use High Surrogate */ + ["\uD892", "\uD892"], /* Non Private Use High Surrogate */ + ["\uD893", "\uD893"], /* Non Private Use High Surrogate */ + ["\uD894", "\uD894"], /* Non Private Use High Surrogate */ + ["\uD895", "\uD895"], /* Non Private Use High Surrogate */ + ["\uD896", "\uD896"], /* Non Private Use High Surrogate */ + ["\uD897", "\uD897"], /* Non Private Use High Surrogate */ + ["\uD898", "\uD898"], /* Non Private Use High Surrogate */ + ["\uD899", "\uD899"], /* Non Private Use High Surrogate */ + ["\uD89A", "\uD89A"], /* Non Private Use High Surrogate */ + ["\uD89B", "\uD89B"], /* Non Private Use High Surrogate */ + ["\uD89C", "\uD89C"], /* Non Private Use High Surrogate */ + ["\uD89D", "\uD89D"], /* Non Private Use High Surrogate */ + ["\uD89E", "\uD89E"], /* Non Private Use High Surrogate */ + ["\uD89F", "\uD89F"], /* Non Private Use High Surrogate */ + ["\uD8A0", "\uD8A0"], /* Non Private Use High Surrogate */ + ["\uD8A1", "\uD8A1"], /* Non Private Use High Surrogate */ + ["\uD8A2", "\uD8A2"], /* Non Private Use High Surrogate */ + ["\uD8A3", "\uD8A3"], /* Non Private Use High Surrogate */ + ["\uD8A4", "\uD8A4"], /* Non Private Use High Surrogate */ + ["\uD8A5", "\uD8A5"], /* Non Private Use High Surrogate */ + ["\uD8A6", "\uD8A6"], /* Non Private Use High Surrogate */ + ["\uD8A7", "\uD8A7"], /* Non Private Use High Surrogate */ + ["\uD8A8", "\uD8A8"], /* Non Private Use High Surrogate */ + ["\uD8A9", "\uD8A9"], /* Non Private Use High Surrogate */ + ["\uD8AA", "\uD8AA"], /* Non Private Use High Surrogate */ + ["\uD8AB", "\uD8AB"], /* Non Private Use High Surrogate */ + ["\uD8AC", "\uD8AC"], /* Non Private Use High Surrogate */ + ["\uD8AD", "\uD8AD"], /* Non Private Use High Surrogate */ + ["\uD8AE", "\uD8AE"], /* Non Private Use High Surrogate */ + ["\uD8AF", "\uD8AF"], /* Non Private Use High Surrogate */ + ["\uD8B0", "\uD8B0"], /* Non Private Use High Surrogate */ + ["\uD8B1", "\uD8B1"], /* Non Private Use High Surrogate */ + ["\uD8B2", "\uD8B2"], /* Non Private Use High Surrogate */ + ["\uD8B3", "\uD8B3"], /* Non Private Use High Surrogate */ + ["\uD8B4", "\uD8B4"], /* Non Private Use High Surrogate */ + ["\uD8B5", "\uD8B5"], /* Non Private Use High Surrogate */ + ["\uD8B6", "\uD8B6"], /* Non Private Use High Surrogate */ + ["\uD8B7", "\uD8B7"], /* Non Private Use High Surrogate */ + ["\uD8B8", "\uD8B8"], /* Non Private Use High Surrogate */ + ["\uD8B9", "\uD8B9"], /* Non Private Use High Surrogate */ + ["\uD8BA", "\uD8BA"], /* Non Private Use High Surrogate */ + ["\uD8BB", "\uD8BB"], /* Non Private Use High Surrogate */ + ["\uD8BC", "\uD8BC"], /* Non Private Use High Surrogate */ + ["\uD8BD", "\uD8BD"], /* Non Private Use High Surrogate */ + ["\uD8BE", "\uD8BE"], /* Non Private Use High Surrogate */ + ["\uD8BF", "\uD8BF"], /* Non Private Use High Surrogate */ + ["\uD8C0", "\uD8C0"], /* Non Private Use High Surrogate */ + ["\uD8C1", "\uD8C1"], /* Non Private Use High Surrogate */ + ["\uD8C2", "\uD8C2"], /* Non Private Use High Surrogate */ + ["\uD8C3", "\uD8C3"], /* Non Private Use High Surrogate */ + ["\uD8C4", "\uD8C4"], /* Non Private Use High Surrogate */ + ["\uD8C5", "\uD8C5"], /* Non Private Use High Surrogate */ + ["\uD8C6", "\uD8C6"], /* Non Private Use High Surrogate */ + ["\uD8C7", "\uD8C7"], /* Non Private Use High Surrogate */ + ["\uD8C8", "\uD8C8"], /* Non Private Use High Surrogate */ + ["\uD8C9", "\uD8C9"], /* Non Private Use High Surrogate */ + ["\uD8CA", "\uD8CA"], /* Non Private Use High Surrogate */ + ["\uD8CB", "\uD8CB"], /* Non Private Use High Surrogate */ + ["\uD8CC", "\uD8CC"], /* Non Private Use High Surrogate */ + ["\uD8CD", "\uD8CD"], /* Non Private Use High Surrogate */ + ["\uD8CE", "\uD8CE"], /* Non Private Use High Surrogate */ + ["\uD8CF", "\uD8CF"], /* Non Private Use High Surrogate */ + ["\uD8D0", "\uD8D0"], /* Non Private Use High Surrogate */ + ["\uD8D1", "\uD8D1"], /* Non Private Use High Surrogate */ + ["\uD8D2", "\uD8D2"], /* Non Private Use High Surrogate */ + ["\uD8D3", "\uD8D3"], /* Non Private Use High Surrogate */ + ["\uD8D4", "\uD8D4"], /* Non Private Use High Surrogate */ + ["\uD8D5", "\uD8D5"], /* Non Private Use High Surrogate */ + ["\uD8D6", "\uD8D6"], /* Non Private Use High Surrogate */ + ["\uD8D7", "\uD8D7"], /* Non Private Use High Surrogate */ + ["\uD8D8", "\uD8D8"], /* Non Private Use High Surrogate */ + ["\uD8D9", "\uD8D9"], /* Non Private Use High Surrogate */ + ["\uD8DA", "\uD8DA"], /* Non Private Use High Surrogate */ + ["\uD8DB", "\uD8DB"], /* Non Private Use High Surrogate */ + ["\uD8DC", "\uD8DC"], /* Non Private Use High Surrogate */ + ["\uD8DD", "\uD8DD"], /* Non Private Use High Surrogate */ + ["\uD8DE", "\uD8DE"], /* Non Private Use High Surrogate */ + ["\uD8DF", "\uD8DF"], /* Non Private Use High Surrogate */ + ["\uD8E0", "\uD8E0"], /* Non Private Use High Surrogate */ + ["\uD8E1", "\uD8E1"], /* Non Private Use High Surrogate */ + ["\uD8E2", "\uD8E2"], /* Non Private Use High Surrogate */ + ["\uD8E3", "\uD8E3"], /* Non Private Use High Surrogate */ + ["\uD8E4", "\uD8E4"], /* Non Private Use High Surrogate */ + ["\uD8E5", "\uD8E5"], /* Non Private Use High Surrogate */ + ["\uD8E6", "\uD8E6"], /* Non Private Use High Surrogate */ + ["\uD8E7", "\uD8E7"], /* Non Private Use High Surrogate */ + ["\uD8E8", "\uD8E8"], /* Non Private Use High Surrogate */ + ["\uD8E9", "\uD8E9"], /* Non Private Use High Surrogate */ + ["\uD8EA", "\uD8EA"], /* Non Private Use High Surrogate */ + ["\uD8EB", "\uD8EB"], /* Non Private Use High Surrogate */ + ["\uD8EC", "\uD8EC"], /* Non Private Use High Surrogate */ + ["\uD8ED", "\uD8ED"], /* Non Private Use High Surrogate */ + ["\uD8EE", "\uD8EE"], /* Non Private Use High Surrogate */ + ["\uD8EF", "\uD8EF"], /* Non Private Use High Surrogate */ + ["\uD8F0", "\uD8F0"], /* Non Private Use High Surrogate */ + ["\uD8F1", "\uD8F1"], /* Non Private Use High Surrogate */ + ["\uD8F2", "\uD8F2"], /* Non Private Use High Surrogate */ + ["\uD8F3", "\uD8F3"], /* Non Private Use High Surrogate */ + ["\uD8F4", "\uD8F4"], /* Non Private Use High Surrogate */ + ["\uD8F5", "\uD8F5"], /* Non Private Use High Surrogate */ + ["\uD8F6", "\uD8F6"], /* Non Private Use High Surrogate */ + ["\uD8F7", "\uD8F7"], /* Non Private Use High Surrogate */ + ["\uD8F8", "\uD8F8"], /* Non Private Use High Surrogate */ + ["\uD8F9", "\uD8F9"], /* Non Private Use High Surrogate */ + ["\uD8FA", "\uD8FA"], /* Non Private Use High Surrogate */ + ["\uD8FB", "\uD8FB"], /* Non Private Use High Surrogate */ + ["\uD8FC", "\uD8FC"], /* Non Private Use High Surrogate */ + ["\uD8FD", "\uD8FD"], /* Non Private Use High Surrogate */ + ["\uD8FE", "\uD8FE"], /* Non Private Use High Surrogate */ + ["\uD8FF", "\uD8FF"], /* Non Private Use High Surrogate */ + ["\uD900", "\uD900"], /* Non Private Use High Surrogate */ + ["\uD901", "\uD901"], /* Non Private Use High Surrogate */ + ["\uD902", "\uD902"], /* Non Private Use High Surrogate */ + ["\uD903", "\uD903"], /* Non Private Use High Surrogate */ + ["\uD904", "\uD904"], /* Non Private Use High Surrogate */ + ["\uD905", "\uD905"], /* Non Private Use High Surrogate */ + ["\uD906", "\uD906"], /* Non Private Use High Surrogate */ + ["\uD907", "\uD907"], /* Non Private Use High Surrogate */ + ["\uD908", "\uD908"], /* Non Private Use High Surrogate */ + ["\uD909", "\uD909"], /* Non Private Use High Surrogate */ + ["\uD90A", "\uD90A"], /* Non Private Use High Surrogate */ + ["\uD90B", "\uD90B"], /* Non Private Use High Surrogate */ + ["\uD90C", "\uD90C"], /* Non Private Use High Surrogate */ + ["\uD90D", "\uD90D"], /* Non Private Use High Surrogate */ + ["\uD90E", "\uD90E"], /* Non Private Use High Surrogate */ + ["\uD90F", "\uD90F"], /* Non Private Use High Surrogate */ + ["\uD910", "\uD910"], /* Non Private Use High Surrogate */ + ["\uD911", "\uD911"], /* Non Private Use High Surrogate */ + ["\uD912", "\uD912"], /* Non Private Use High Surrogate */ + ["\uD913", "\uD913"], /* Non Private Use High Surrogate */ + ["\uD914", "\uD914"], /* Non Private Use High Surrogate */ + ["\uD915", "\uD915"], /* Non Private Use High Surrogate */ + ["\uD916", "\uD916"], /* Non Private Use High Surrogate */ + ["\uD917", "\uD917"], /* Non Private Use High Surrogate */ + ["\uD918", "\uD918"], /* Non Private Use High Surrogate */ + ["\uD919", "\uD919"], /* Non Private Use High Surrogate */ + ["\uD91A", "\uD91A"], /* Non Private Use High Surrogate */ + ["\uD91B", "\uD91B"], /* Non Private Use High Surrogate */ + ["\uD91C", "\uD91C"], /* Non Private Use High Surrogate */ + ["\uD91D", "\uD91D"], /* Non Private Use High Surrogate */ + ["\uD91E", "\uD91E"], /* Non Private Use High Surrogate */ + ["\uD91F", "\uD91F"], /* Non Private Use High Surrogate */ + ["\uD920", "\uD920"], /* Non Private Use High Surrogate */ + ["\uD921", "\uD921"], /* Non Private Use High Surrogate */ + ["\uD922", "\uD922"], /* Non Private Use High Surrogate */ + ["\uD923", "\uD923"], /* Non Private Use High Surrogate */ + ["\uD924", "\uD924"], /* Non Private Use High Surrogate */ + ["\uD925", "\uD925"], /* Non Private Use High Surrogate */ + ["\uD926", "\uD926"], /* Non Private Use High Surrogate */ + ["\uD927", "\uD927"], /* Non Private Use High Surrogate */ + ["\uD928", "\uD928"], /* Non Private Use High Surrogate */ + ["\uD929", "\uD929"], /* Non Private Use High Surrogate */ + ["\uD92A", "\uD92A"], /* Non Private Use High Surrogate */ + ["\uD92B", "\uD92B"], /* Non Private Use High Surrogate */ + ["\uD92C", "\uD92C"], /* Non Private Use High Surrogate */ + ["\uD92D", "\uD92D"], /* Non Private Use High Surrogate */ + ["\uD92E", "\uD92E"], /* Non Private Use High Surrogate */ + ["\uD92F", "\uD92F"], /* Non Private Use High Surrogate */ + ["\uD930", "\uD930"], /* Non Private Use High Surrogate */ + ["\uD931", "\uD931"], /* Non Private Use High Surrogate */ + ["\uD932", "\uD932"], /* Non Private Use High Surrogate */ + ["\uD933", "\uD933"], /* Non Private Use High Surrogate */ + ["\uD934", "\uD934"], /* Non Private Use High Surrogate */ + ["\uD935", "\uD935"], /* Non Private Use High Surrogate */ + ["\uD936", "\uD936"], /* Non Private Use High Surrogate */ + ["\uD937", "\uD937"], /* Non Private Use High Surrogate */ + ["\uD938", "\uD938"], /* Non Private Use High Surrogate */ + ["\uD939", "\uD939"], /* Non Private Use High Surrogate */ + ["\uD93A", "\uD93A"], /* Non Private Use High Surrogate */ + ["\uD93B", "\uD93B"], /* Non Private Use High Surrogate */ + ["\uD93C", "\uD93C"], /* Non Private Use High Surrogate */ + ["\uD93D", "\uD93D"], /* Non Private Use High Surrogate */ + ["\uD93E", "\uD93E"], /* Non Private Use High Surrogate */ + ["\uD93F", "\uD93F"], /* Non Private Use High Surrogate */ + ["\uD940", "\uD940"], /* Non Private Use High Surrogate */ + ["\uD941", "\uD941"], /* Non Private Use High Surrogate */ + ["\uD942", "\uD942"], /* Non Private Use High Surrogate */ + ["\uD943", "\uD943"], /* Non Private Use High Surrogate */ + ["\uD944", "\uD944"], /* Non Private Use High Surrogate */ + ["\uD945", "\uD945"], /* Non Private Use High Surrogate */ + ["\uD946", "\uD946"], /* Non Private Use High Surrogate */ + ["\uD947", "\uD947"], /* Non Private Use High Surrogate */ + ["\uD948", "\uD948"], /* Non Private Use High Surrogate */ + ["\uD949", "\uD949"], /* Non Private Use High Surrogate */ + ["\uD94A", "\uD94A"], /* Non Private Use High Surrogate */ + ["\uD94B", "\uD94B"], /* Non Private Use High Surrogate */ + ["\uD94C", "\uD94C"], /* Non Private Use High Surrogate */ + ["\uD94D", "\uD94D"], /* Non Private Use High Surrogate */ + ["\uD94E", "\uD94E"], /* Non Private Use High Surrogate */ + ["\uD94F", "\uD94F"], /* Non Private Use High Surrogate */ + ["\uD950", "\uD950"], /* Non Private Use High Surrogate */ + ["\uD951", "\uD951"], /* Non Private Use High Surrogate */ + ["\uD952", "\uD952"], /* Non Private Use High Surrogate */ + ["\uD953", "\uD953"], /* Non Private Use High Surrogate */ + ["\uD954", "\uD954"], /* Non Private Use High Surrogate */ + ["\uD955", "\uD955"], /* Non Private Use High Surrogate */ + ["\uD956", "\uD956"], /* Non Private Use High Surrogate */ + ["\uD957", "\uD957"], /* Non Private Use High Surrogate */ + ["\uD958", "\uD958"], /* Non Private Use High Surrogate */ + ["\uD959", "\uD959"], /* Non Private Use High Surrogate */ + ["\uD95A", "\uD95A"], /* Non Private Use High Surrogate */ + ["\uD95B", "\uD95B"], /* Non Private Use High Surrogate */ + ["\uD95C", "\uD95C"], /* Non Private Use High Surrogate */ + ["\uD95D", "\uD95D"], /* Non Private Use High Surrogate */ + ["\uD95E", "\uD95E"], /* Non Private Use High Surrogate */ + ["\uD95F", "\uD95F"], /* Non Private Use High Surrogate */ + ["\uD960", "\uD960"], /* Non Private Use High Surrogate */ + ["\uD961", "\uD961"], /* Non Private Use High Surrogate */ + ["\uD962", "\uD962"], /* Non Private Use High Surrogate */ + ["\uD963", "\uD963"], /* Non Private Use High Surrogate */ + ["\uD964", "\uD964"], /* Non Private Use High Surrogate */ + ["\uD965", "\uD965"], /* Non Private Use High Surrogate */ + ["\uD966", "\uD966"], /* Non Private Use High Surrogate */ + ["\uD967", "\uD967"], /* Non Private Use High Surrogate */ + ["\uD968", "\uD968"], /* Non Private Use High Surrogate */ + ["\uD969", "\uD969"], /* Non Private Use High Surrogate */ + ["\uD96A", "\uD96A"], /* Non Private Use High Surrogate */ + ["\uD96B", "\uD96B"], /* Non Private Use High Surrogate */ + ["\uD96C", "\uD96C"], /* Non Private Use High Surrogate */ + ["\uD96D", "\uD96D"], /* Non Private Use High Surrogate */ + ["\uD96E", "\uD96E"], /* Non Private Use High Surrogate */ + ["\uD96F", "\uD96F"], /* Non Private Use High Surrogate */ + ["\uD970", "\uD970"], /* Non Private Use High Surrogate */ + ["\uD971", "\uD971"], /* Non Private Use High Surrogate */ + ["\uD972", "\uD972"], /* Non Private Use High Surrogate */ + ["\uD973", "\uD973"], /* Non Private Use High Surrogate */ + ["\uD974", "\uD974"], /* Non Private Use High Surrogate */ + ["\uD975", "\uD975"], /* Non Private Use High Surrogate */ + ["\uD976", "\uD976"], /* Non Private Use High Surrogate */ + ["\uD977", "\uD977"], /* Non Private Use High Surrogate */ + ["\uD978", "\uD978"], /* Non Private Use High Surrogate */ + ["\uD979", "\uD979"], /* Non Private Use High Surrogate */ + ["\uD97A", "\uD97A"], /* Non Private Use High Surrogate */ + ["\uD97B", "\uD97B"], /* Non Private Use High Surrogate */ + ["\uD97C", "\uD97C"], /* Non Private Use High Surrogate */ + ["\uD97D", "\uD97D"], /* Non Private Use High Surrogate */ + ["\uD97E", "\uD97E"], /* Non Private Use High Surrogate */ + ["\uD97F", "\uD97F"], /* Non Private Use High Surrogate */ + ["\uD980", "\uD980"], /* Non Private Use High Surrogate */ + ["\uD981", "\uD981"], /* Non Private Use High Surrogate */ + ["\uD982", "\uD982"], /* Non Private Use High Surrogate */ + ["\uD983", "\uD983"], /* Non Private Use High Surrogate */ + ["\uD984", "\uD984"], /* Non Private Use High Surrogate */ + ["\uD985", "\uD985"], /* Non Private Use High Surrogate */ + ["\uD986", "\uD986"], /* Non Private Use High Surrogate */ + ["\uD987", "\uD987"], /* Non Private Use High Surrogate */ + ["\uD988", "\uD988"], /* Non Private Use High Surrogate */ + ["\uD989", "\uD989"], /* Non Private Use High Surrogate */ + ["\uD98A", "\uD98A"], /* Non Private Use High Surrogate */ + ["\uD98B", "\uD98B"], /* Non Private Use High Surrogate */ + ["\uD98C", "\uD98C"], /* Non Private Use High Surrogate */ + ["\uD98D", "\uD98D"], /* Non Private Use High Surrogate */ + ["\uD98E", "\uD98E"], /* Non Private Use High Surrogate */ + ["\uD98F", "\uD98F"], /* Non Private Use High Surrogate */ + ["\uD990", "\uD990"], /* Non Private Use High Surrogate */ + ["\uD991", "\uD991"], /* Non Private Use High Surrogate */ + ["\uD992", "\uD992"], /* Non Private Use High Surrogate */ + ["\uD993", "\uD993"], /* Non Private Use High Surrogate */ + ["\uD994", "\uD994"], /* Non Private Use High Surrogate */ + ["\uD995", "\uD995"], /* Non Private Use High Surrogate */ + ["\uD996", "\uD996"], /* Non Private Use High Surrogate */ + ["\uD997", "\uD997"], /* Non Private Use High Surrogate */ + ["\uD998", "\uD998"], /* Non Private Use High Surrogate */ + ["\uD999", "\uD999"], /* Non Private Use High Surrogate */ + ["\uD99A", "\uD99A"], /* Non Private Use High Surrogate */ + ["\uD99B", "\uD99B"], /* Non Private Use High Surrogate */ + ["\uD99C", "\uD99C"], /* Non Private Use High Surrogate */ + ["\uD99D", "\uD99D"], /* Non Private Use High Surrogate */ + ["\uD99E", "\uD99E"], /* Non Private Use High Surrogate */ + ["\uD99F", "\uD99F"], /* Non Private Use High Surrogate */ + ["\uD9A0", "\uD9A0"], /* Non Private Use High Surrogate */ + ["\uD9A1", "\uD9A1"], /* Non Private Use High Surrogate */ + ["\uD9A2", "\uD9A2"], /* Non Private Use High Surrogate */ + ["\uD9A3", "\uD9A3"], /* Non Private Use High Surrogate */ + ["\uD9A4", "\uD9A4"], /* Non Private Use High Surrogate */ + ["\uD9A5", "\uD9A5"], /* Non Private Use High Surrogate */ + ["\uD9A6", "\uD9A6"], /* Non Private Use High Surrogate */ + ["\uD9A7", "\uD9A7"], /* Non Private Use High Surrogate */ + ["\uD9A8", "\uD9A8"], /* Non Private Use High Surrogate */ + ["\uD9A9", "\uD9A9"], /* Non Private Use High Surrogate */ + ["\uD9AA", "\uD9AA"], /* Non Private Use High Surrogate */ + ["\uD9AB", "\uD9AB"], /* Non Private Use High Surrogate */ + ["\uD9AC", "\uD9AC"], /* Non Private Use High Surrogate */ + ["\uD9AD", "\uD9AD"], /* Non Private Use High Surrogate */ + ["\uD9AE", "\uD9AE"], /* Non Private Use High Surrogate */ + ["\uD9AF", "\uD9AF"], /* Non Private Use High Surrogate */ + ["\uD9B0", "\uD9B0"], /* Non Private Use High Surrogate */ + ["\uD9B1", "\uD9B1"], /* Non Private Use High Surrogate */ + ["\uD9B2", "\uD9B2"], /* Non Private Use High Surrogate */ + ["\uD9B3", "\uD9B3"], /* Non Private Use High Surrogate */ + ["\uD9B4", "\uD9B4"], /* Non Private Use High Surrogate */ + ["\uD9B5", "\uD9B5"], /* Non Private Use High Surrogate */ + ["\uD9B6", "\uD9B6"], /* Non Private Use High Surrogate */ + ["\uD9B7", "\uD9B7"], /* Non Private Use High Surrogate */ + ["\uD9B8", "\uD9B8"], /* Non Private Use High Surrogate */ + ["\uD9B9", "\uD9B9"], /* Non Private Use High Surrogate */ + ["\uD9BA", "\uD9BA"], /* Non Private Use High Surrogate */ + ["\uD9BB", "\uD9BB"], /* Non Private Use High Surrogate */ + ["\uD9BC", "\uD9BC"], /* Non Private Use High Surrogate */ + ["\uD9BD", "\uD9BD"], /* Non Private Use High Surrogate */ + ["\uD9BE", "\uD9BE"], /* Non Private Use High Surrogate */ + ["\uD9BF", "\uD9BF"], /* Non Private Use High Surrogate */ + ["\uD9C0", "\uD9C0"], /* Non Private Use High Surrogate */ + ["\uD9C1", "\uD9C1"], /* Non Private Use High Surrogate */ + ["\uD9C2", "\uD9C2"], /* Non Private Use High Surrogate */ + ["\uD9C3", "\uD9C3"], /* Non Private Use High Surrogate */ + ["\uD9C4", "\uD9C4"], /* Non Private Use High Surrogate */ + ["\uD9C5", "\uD9C5"], /* Non Private Use High Surrogate */ + ["\uD9C6", "\uD9C6"], /* Non Private Use High Surrogate */ + ["\uD9C7", "\uD9C7"], /* Non Private Use High Surrogate */ + ["\uD9C8", "\uD9C8"], /* Non Private Use High Surrogate */ + ["\uD9C9", "\uD9C9"], /* Non Private Use High Surrogate */ + ["\uD9CA", "\uD9CA"], /* Non Private Use High Surrogate */ + ["\uD9CB", "\uD9CB"], /* Non Private Use High Surrogate */ + ["\uD9CC", "\uD9CC"], /* Non Private Use High Surrogate */ + ["\uD9CD", "\uD9CD"], /* Non Private Use High Surrogate */ + ["\uD9CE", "\uD9CE"], /* Non Private Use High Surrogate */ + ["\uD9CF", "\uD9CF"], /* Non Private Use High Surrogate */ + ["\uD9D0", "\uD9D0"], /* Non Private Use High Surrogate */ + ["\uD9D1", "\uD9D1"], /* Non Private Use High Surrogate */ + ["\uD9D2", "\uD9D2"], /* Non Private Use High Surrogate */ + ["\uD9D3", "\uD9D3"], /* Non Private Use High Surrogate */ + ["\uD9D4", "\uD9D4"], /* Non Private Use High Surrogate */ + ["\uD9D5", "\uD9D5"], /* Non Private Use High Surrogate */ + ["\uD9D6", "\uD9D6"], /* Non Private Use High Surrogate */ + ["\uD9D7", "\uD9D7"], /* Non Private Use High Surrogate */ + ["\uD9D8", "\uD9D8"], /* Non Private Use High Surrogate */ + ["\uD9D9", "\uD9D9"], /* Non Private Use High Surrogate */ + ["\uD9DA", "\uD9DA"], /* Non Private Use High Surrogate */ + ["\uD9DB", "\uD9DB"], /* Non Private Use High Surrogate */ + ["\uD9DC", "\uD9DC"], /* Non Private Use High Surrogate */ + ["\uD9DD", "\uD9DD"], /* Non Private Use High Surrogate */ + ["\uD9DE", "\uD9DE"], /* Non Private Use High Surrogate */ + ["\uD9DF", "\uD9DF"], /* Non Private Use High Surrogate */ + ["\uD9E0", "\uD9E0"], /* Non Private Use High Surrogate */ + ["\uD9E1", "\uD9E1"], /* Non Private Use High Surrogate */ + ["\uD9E2", "\uD9E2"], /* Non Private Use High Surrogate */ + ["\uD9E3", "\uD9E3"], /* Non Private Use High Surrogate */ + ["\uD9E4", "\uD9E4"], /* Non Private Use High Surrogate */ + ["\uD9E5", "\uD9E5"], /* Non Private Use High Surrogate */ + ["\uD9E6", "\uD9E6"], /* Non Private Use High Surrogate */ + ["\uD9E7", "\uD9E7"], /* Non Private Use High Surrogate */ + ["\uD9E8", "\uD9E8"], /* Non Private Use High Surrogate */ + ["\uD9E9", "\uD9E9"], /* Non Private Use High Surrogate */ + ["\uD9EA", "\uD9EA"], /* Non Private Use High Surrogate */ + ["\uD9EB", "\uD9EB"], /* Non Private Use High Surrogate */ + ["\uD9EC", "\uD9EC"], /* Non Private Use High Surrogate */ + ["\uD9ED", "\uD9ED"], /* Non Private Use High Surrogate */ + ["\uD9EE", "\uD9EE"], /* Non Private Use High Surrogate */ + ["\uD9EF", "\uD9EF"], /* Non Private Use High Surrogate */ + ["\uD9F0", "\uD9F0"], /* Non Private Use High Surrogate */ + ["\uD9F1", "\uD9F1"], /* Non Private Use High Surrogate */ + ["\uD9F2", "\uD9F2"], /* Non Private Use High Surrogate */ + ["\uD9F3", "\uD9F3"], /* Non Private Use High Surrogate */ + ["\uD9F4", "\uD9F4"], /* Non Private Use High Surrogate */ + ["\uD9F5", "\uD9F5"], /* Non Private Use High Surrogate */ + ["\uD9F6", "\uD9F6"], /* Non Private Use High Surrogate */ + ["\uD9F7", "\uD9F7"], /* Non Private Use High Surrogate */ + ["\uD9F8", "\uD9F8"], /* Non Private Use High Surrogate */ + ["\uD9F9", "\uD9F9"], /* Non Private Use High Surrogate */ + ["\uD9FA", "\uD9FA"], /* Non Private Use High Surrogate */ + ["\uD9FB", "\uD9FB"], /* Non Private Use High Surrogate */ + ["\uD9FC", "\uD9FC"], /* Non Private Use High Surrogate */ + ["\uD9FD", "\uD9FD"], /* Non Private Use High Surrogate */ + ["\uD9FE", "\uD9FE"], /* Non Private Use High Surrogate */ + ["\uD9FF", "\uD9FF"], /* Non Private Use High Surrogate */ + ["\uDA00", "\uDA00"], /* Non Private Use High Surrogate */ + ["\uDA01", "\uDA01"], /* Non Private Use High Surrogate */ + ["\uDA02", "\uDA02"], /* Non Private Use High Surrogate */ + ["\uDA03", "\uDA03"], /* Non Private Use High Surrogate */ + ["\uDA04", "\uDA04"], /* Non Private Use High Surrogate */ + ["\uDA05", "\uDA05"], /* Non Private Use High Surrogate */ + ["\uDA06", "\uDA06"], /* Non Private Use High Surrogate */ + ["\uDA07", "\uDA07"], /* Non Private Use High Surrogate */ + ["\uDA08", "\uDA08"], /* Non Private Use High Surrogate */ + ["\uDA09", "\uDA09"], /* Non Private Use High Surrogate */ + ["\uDA0A", "\uDA0A"], /* Non Private Use High Surrogate */ + ["\uDA0B", "\uDA0B"], /* Non Private Use High Surrogate */ + ["\uDA0C", "\uDA0C"], /* Non Private Use High Surrogate */ + ["\uDA0D", "\uDA0D"], /* Non Private Use High Surrogate */ + ["\uDA0E", "\uDA0E"], /* Non Private Use High Surrogate */ + ["\uDA0F", "\uDA0F"], /* Non Private Use High Surrogate */ + ["\uDA10", "\uDA10"], /* Non Private Use High Surrogate */ + ["\uDA11", "\uDA11"], /* Non Private Use High Surrogate */ + ["\uDA12", "\uDA12"], /* Non Private Use High Surrogate */ + ["\uDA13", "\uDA13"], /* Non Private Use High Surrogate */ + ["\uDA14", "\uDA14"], /* Non Private Use High Surrogate */ + ["\uDA15", "\uDA15"], /* Non Private Use High Surrogate */ + ["\uDA16", "\uDA16"], /* Non Private Use High Surrogate */ + ["\uDA17", "\uDA17"], /* Non Private Use High Surrogate */ + ["\uDA18", "\uDA18"], /* Non Private Use High Surrogate */ + ["\uDA19", "\uDA19"], /* Non Private Use High Surrogate */ + ["\uDA1A", "\uDA1A"], /* Non Private Use High Surrogate */ + ["\uDA1B", "\uDA1B"], /* Non Private Use High Surrogate */ + ["\uDA1C", "\uDA1C"], /* Non Private Use High Surrogate */ + ["\uDA1D", "\uDA1D"], /* Non Private Use High Surrogate */ + ["\uDA1E", "\uDA1E"], /* Non Private Use High Surrogate */ + ["\uDA1F", "\uDA1F"], /* Non Private Use High Surrogate */ + ["\uDA20", "\uDA20"], /* Non Private Use High Surrogate */ + ["\uDA21", "\uDA21"], /* Non Private Use High Surrogate */ + ["\uDA22", "\uDA22"], /* Non Private Use High Surrogate */ + ["\uDA23", "\uDA23"], /* Non Private Use High Surrogate */ + ["\uDA24", "\uDA24"], /* Non Private Use High Surrogate */ + ["\uDA25", "\uDA25"], /* Non Private Use High Surrogate */ + ["\uDA26", "\uDA26"], /* Non Private Use High Surrogate */ + ["\uDA27", "\uDA27"], /* Non Private Use High Surrogate */ + ["\uDA28", "\uDA28"], /* Non Private Use High Surrogate */ + ["\uDA29", "\uDA29"], /* Non Private Use High Surrogate */ + ["\uDA2A", "\uDA2A"], /* Non Private Use High Surrogate */ + ["\uDA2B", "\uDA2B"], /* Non Private Use High Surrogate */ + ["\uDA2C", "\uDA2C"], /* Non Private Use High Surrogate */ + ["\uDA2D", "\uDA2D"], /* Non Private Use High Surrogate */ + ["\uDA2E", "\uDA2E"], /* Non Private Use High Surrogate */ + ["\uDA2F", "\uDA2F"], /* Non Private Use High Surrogate */ + ["\uDA30", "\uDA30"], /* Non Private Use High Surrogate */ + ["\uDA31", "\uDA31"], /* Non Private Use High Surrogate */ + ["\uDA32", "\uDA32"], /* Non Private Use High Surrogate */ + ["\uDA33", "\uDA33"], /* Non Private Use High Surrogate */ + ["\uDA34", "\uDA34"], /* Non Private Use High Surrogate */ + ["\uDA35", "\uDA35"], /* Non Private Use High Surrogate */ + ["\uDA36", "\uDA36"], /* Non Private Use High Surrogate */ + ["\uDA37", "\uDA37"], /* Non Private Use High Surrogate */ + ["\uDA38", "\uDA38"], /* Non Private Use High Surrogate */ + ["\uDA39", "\uDA39"], /* Non Private Use High Surrogate */ + ["\uDA3A", "\uDA3A"], /* Non Private Use High Surrogate */ + ["\uDA3B", "\uDA3B"], /* Non Private Use High Surrogate */ + ["\uDA3C", "\uDA3C"], /* Non Private Use High Surrogate */ + ["\uDA3D", "\uDA3D"], /* Non Private Use High Surrogate */ + ["\uDA3E", "\uDA3E"], /* Non Private Use High Surrogate */ + ["\uDA3F", "\uDA3F"], /* Non Private Use High Surrogate */ + ["\uDA40", "\uDA40"], /* Non Private Use High Surrogate */ + ["\uDA41", "\uDA41"], /* Non Private Use High Surrogate */ + ["\uDA42", "\uDA42"], /* Non Private Use High Surrogate */ + ["\uDA43", "\uDA43"], /* Non Private Use High Surrogate */ + ["\uDA44", "\uDA44"], /* Non Private Use High Surrogate */ + ["\uDA45", "\uDA45"], /* Non Private Use High Surrogate */ + ["\uDA46", "\uDA46"], /* Non Private Use High Surrogate */ + ["\uDA47", "\uDA47"], /* Non Private Use High Surrogate */ + ["\uDA48", "\uDA48"], /* Non Private Use High Surrogate */ + ["\uDA49", "\uDA49"], /* Non Private Use High Surrogate */ + ["\uDA4A", "\uDA4A"], /* Non Private Use High Surrogate */ + ["\uDA4B", "\uDA4B"], /* Non Private Use High Surrogate */ + ["\uDA4C", "\uDA4C"], /* Non Private Use High Surrogate */ + ["\uDA4D", "\uDA4D"], /* Non Private Use High Surrogate */ + ["\uDA4E", "\uDA4E"], /* Non Private Use High Surrogate */ + ["\uDA4F", "\uDA4F"], /* Non Private Use High Surrogate */ + ["\uDA50", "\uDA50"], /* Non Private Use High Surrogate */ + ["\uDA51", "\uDA51"], /* Non Private Use High Surrogate */ + ["\uDA52", "\uDA52"], /* Non Private Use High Surrogate */ + ["\uDA53", "\uDA53"], /* Non Private Use High Surrogate */ + ["\uDA54", "\uDA54"], /* Non Private Use High Surrogate */ + ["\uDA55", "\uDA55"], /* Non Private Use High Surrogate */ + ["\uDA56", "\uDA56"], /* Non Private Use High Surrogate */ + ["\uDA57", "\uDA57"], /* Non Private Use High Surrogate */ + ["\uDA58", "\uDA58"], /* Non Private Use High Surrogate */ + ["\uDA59", "\uDA59"], /* Non Private Use High Surrogate */ + ["\uDA5A", "\uDA5A"], /* Non Private Use High Surrogate */ + ["\uDA5B", "\uDA5B"], /* Non Private Use High Surrogate */ + ["\uDA5C", "\uDA5C"], /* Non Private Use High Surrogate */ + ["\uDA5D", "\uDA5D"], /* Non Private Use High Surrogate */ + ["\uDA5E", "\uDA5E"], /* Non Private Use High Surrogate */ + ["\uDA5F", "\uDA5F"], /* Non Private Use High Surrogate */ + ["\uDA60", "\uDA60"], /* Non Private Use High Surrogate */ + ["\uDA61", "\uDA61"], /* Non Private Use High Surrogate */ + ["\uDA62", "\uDA62"], /* Non Private Use High Surrogate */ + ["\uDA63", "\uDA63"], /* Non Private Use High Surrogate */ + ["\uDA64", "\uDA64"], /* Non Private Use High Surrogate */ + ["\uDA65", "\uDA65"], /* Non Private Use High Surrogate */ + ["\uDA66", "\uDA66"], /* Non Private Use High Surrogate */ + ["\uDA67", "\uDA67"], /* Non Private Use High Surrogate */ + ["\uDA68", "\uDA68"], /* Non Private Use High Surrogate */ + ["\uDA69", "\uDA69"], /* Non Private Use High Surrogate */ + ["\uDA6A", "\uDA6A"], /* Non Private Use High Surrogate */ + ["\uDA6B", "\uDA6B"], /* Non Private Use High Surrogate */ + ["\uDA6C", "\uDA6C"], /* Non Private Use High Surrogate */ + ["\uDA6D", "\uDA6D"], /* Non Private Use High Surrogate */ + ["\uDA6E", "\uDA6E"], /* Non Private Use High Surrogate */ + ["\uDA6F", "\uDA6F"], /* Non Private Use High Surrogate */ + ["\uDA70", "\uDA70"], /* Non Private Use High Surrogate */ + ["\uDA71", "\uDA71"], /* Non Private Use High Surrogate */ + ["\uDA72", "\uDA72"], /* Non Private Use High Surrogate */ + ["\uDA73", "\uDA73"], /* Non Private Use High Surrogate */ + ["\uDA74", "\uDA74"], /* Non Private Use High Surrogate */ + ["\uDA75", "\uDA75"], /* Non Private Use High Surrogate */ + ["\uDA76", "\uDA76"], /* Non Private Use High Surrogate */ + ["\uDA77", "\uDA77"], /* Non Private Use High Surrogate */ + ["\uDA78", "\uDA78"], /* Non Private Use High Surrogate */ + ["\uDA79", "\uDA79"], /* Non Private Use High Surrogate */ + ["\uDA7A", "\uDA7A"], /* Non Private Use High Surrogate */ + ["\uDA7B", "\uDA7B"], /* Non Private Use High Surrogate */ + ["\uDA7C", "\uDA7C"], /* Non Private Use High Surrogate */ + ["\uDA7D", "\uDA7D"], /* Non Private Use High Surrogate */ + ["\uDA7E", "\uDA7E"], /* Non Private Use High Surrogate */ + ["\uDA7F", "\uDA7F"], /* Non Private Use High Surrogate */ + ["\uDA80", "\uDA80"], /* Non Private Use High Surrogate */ + ["\uDA81", "\uDA81"], /* Non Private Use High Surrogate */ + ["\uDA82", "\uDA82"], /* Non Private Use High Surrogate */ + ["\uDA83", "\uDA83"], /* Non Private Use High Surrogate */ + ["\uDA84", "\uDA84"], /* Non Private Use High Surrogate */ + ["\uDA85", "\uDA85"], /* Non Private Use High Surrogate */ + ["\uDA86", "\uDA86"], /* Non Private Use High Surrogate */ + ["\uDA87", "\uDA87"], /* Non Private Use High Surrogate */ + ["\uDA88", "\uDA88"], /* Non Private Use High Surrogate */ + ["\uDA89", "\uDA89"], /* Non Private Use High Surrogate */ + ["\uDA8A", "\uDA8A"], /* Non Private Use High Surrogate */ + ["\uDA8B", "\uDA8B"], /* Non Private Use High Surrogate */ + ["\uDA8C", "\uDA8C"], /* Non Private Use High Surrogate */ + ["\uDA8D", "\uDA8D"], /* Non Private Use High Surrogate */ + ["\uDA8E", "\uDA8E"], /* Non Private Use High Surrogate */ + ["\uDA8F", "\uDA8F"], /* Non Private Use High Surrogate */ + ["\uDA90", "\uDA90"], /* Non Private Use High Surrogate */ + ["\uDA91", "\uDA91"], /* Non Private Use High Surrogate */ + ["\uDA92", "\uDA92"], /* Non Private Use High Surrogate */ + ["\uDA93", "\uDA93"], /* Non Private Use High Surrogate */ + ["\uDA94", "\uDA94"], /* Non Private Use High Surrogate */ + ["\uDA95", "\uDA95"], /* Non Private Use High Surrogate */ + ["\uDA96", "\uDA96"], /* Non Private Use High Surrogate */ + ["\uDA97", "\uDA97"], /* Non Private Use High Surrogate */ + ["\uDA98", "\uDA98"], /* Non Private Use High Surrogate */ + ["\uDA99", "\uDA99"], /* Non Private Use High Surrogate */ + ["\uDA9A", "\uDA9A"], /* Non Private Use High Surrogate */ + ["\uDA9B", "\uDA9B"], /* Non Private Use High Surrogate */ + ["\uDA9C", "\uDA9C"], /* Non Private Use High Surrogate */ + ["\uDA9D", "\uDA9D"], /* Non Private Use High Surrogate */ + ["\uDA9E", "\uDA9E"], /* Non Private Use High Surrogate */ + ["\uDA9F", "\uDA9F"], /* Non Private Use High Surrogate */ + ["\uDAA0", "\uDAA0"], /* Non Private Use High Surrogate */ + ["\uDAA1", "\uDAA1"], /* Non Private Use High Surrogate */ + ["\uDAA2", "\uDAA2"], /* Non Private Use High Surrogate */ + ["\uDAA3", "\uDAA3"], /* Non Private Use High Surrogate */ + ["\uDAA4", "\uDAA4"], /* Non Private Use High Surrogate */ + ["\uDAA5", "\uDAA5"], /* Non Private Use High Surrogate */ + ["\uDAA6", "\uDAA6"], /* Non Private Use High Surrogate */ + ["\uDAA7", "\uDAA7"], /* Non Private Use High Surrogate */ + ["\uDAA8", "\uDAA8"], /* Non Private Use High Surrogate */ + ["\uDAA9", "\uDAA9"], /* Non Private Use High Surrogate */ + ["\uDAAA", "\uDAAA"], /* Non Private Use High Surrogate */ + ["\uDAAB", "\uDAAB"], /* Non Private Use High Surrogate */ + ["\uDAAC", "\uDAAC"], /* Non Private Use High Surrogate */ + ["\uDAAD", "\uDAAD"], /* Non Private Use High Surrogate */ + ["\uDAAE", "\uDAAE"], /* Non Private Use High Surrogate */ + ["\uDAAF", "\uDAAF"], /* Non Private Use High Surrogate */ + ["\uDAB0", "\uDAB0"], /* Non Private Use High Surrogate */ + ["\uDAB1", "\uDAB1"], /* Non Private Use High Surrogate */ + ["\uDAB2", "\uDAB2"], /* Non Private Use High Surrogate */ + ["\uDAB3", "\uDAB3"], /* Non Private Use High Surrogate */ + ["\uDAB4", "\uDAB4"], /* Non Private Use High Surrogate */ + ["\uDAB5", "\uDAB5"], /* Non Private Use High Surrogate */ + ["\uDAB6", "\uDAB6"], /* Non Private Use High Surrogate */ + ["\uDAB7", "\uDAB7"], /* Non Private Use High Surrogate */ + ["\uDAB8", "\uDAB8"], /* Non Private Use High Surrogate */ + ["\uDAB9", "\uDAB9"], /* Non Private Use High Surrogate */ + ["\uDABA", "\uDABA"], /* Non Private Use High Surrogate */ + ["\uDABB", "\uDABB"], /* Non Private Use High Surrogate */ + ["\uDABC", "\uDABC"], /* Non Private Use High Surrogate */ + ["\uDABD", "\uDABD"], /* Non Private Use High Surrogate */ + ["\uDABE", "\uDABE"], /* Non Private Use High Surrogate */ + ["\uDABF", "\uDABF"], /* Non Private Use High Surrogate */ + ["\uDAC0", "\uDAC0"], /* Non Private Use High Surrogate */ + ["\uDAC1", "\uDAC1"], /* Non Private Use High Surrogate */ + ["\uDAC2", "\uDAC2"], /* Non Private Use High Surrogate */ + ["\uDAC3", "\uDAC3"], /* Non Private Use High Surrogate */ + ["\uDAC4", "\uDAC4"], /* Non Private Use High Surrogate */ + ["\uDAC5", "\uDAC5"], /* Non Private Use High Surrogate */ + ["\uDAC6", "\uDAC6"], /* Non Private Use High Surrogate */ + ["\uDAC7", "\uDAC7"], /* Non Private Use High Surrogate */ + ["\uDAC8", "\uDAC8"], /* Non Private Use High Surrogate */ + ["\uDAC9", "\uDAC9"], /* Non Private Use High Surrogate */ + ["\uDACA", "\uDACA"], /* Non Private Use High Surrogate */ + ["\uDACB", "\uDACB"], /* Non Private Use High Surrogate */ + ["\uDACC", "\uDACC"], /* Non Private Use High Surrogate */ + ["\uDACD", "\uDACD"], /* Non Private Use High Surrogate */ + ["\uDACE", "\uDACE"], /* Non Private Use High Surrogate */ + ["\uDACF", "\uDACF"], /* Non Private Use High Surrogate */ + ["\uDAD0", "\uDAD0"], /* Non Private Use High Surrogate */ + ["\uDAD1", "\uDAD1"], /* Non Private Use High Surrogate */ + ["\uDAD2", "\uDAD2"], /* Non Private Use High Surrogate */ + ["\uDAD3", "\uDAD3"], /* Non Private Use High Surrogate */ + ["\uDAD4", "\uDAD4"], /* Non Private Use High Surrogate */ + ["\uDAD5", "\uDAD5"], /* Non Private Use High Surrogate */ + ["\uDAD6", "\uDAD6"], /* Non Private Use High Surrogate */ + ["\uDAD7", "\uDAD7"], /* Non Private Use High Surrogate */ + ["\uDAD8", "\uDAD8"], /* Non Private Use High Surrogate */ + ["\uDAD9", "\uDAD9"], /* Non Private Use High Surrogate */ + ["\uDADA", "\uDADA"], /* Non Private Use High Surrogate */ + ["\uDADB", "\uDADB"], /* Non Private Use High Surrogate */ + ["\uDADC", "\uDADC"], /* Non Private Use High Surrogate */ + ["\uDADD", "\uDADD"], /* Non Private Use High Surrogate */ + ["\uDADE", "\uDADE"], /* Non Private Use High Surrogate */ + ["\uDADF", "\uDADF"], /* Non Private Use High Surrogate */ + ["\uDAE0", "\uDAE0"], /* Non Private Use High Surrogate */ + ["\uDAE1", "\uDAE1"], /* Non Private Use High Surrogate */ + ["\uDAE2", "\uDAE2"], /* Non Private Use High Surrogate */ + ["\uDAE3", "\uDAE3"], /* Non Private Use High Surrogate */ + ["\uDAE4", "\uDAE4"], /* Non Private Use High Surrogate */ + ["\uDAE5", "\uDAE5"], /* Non Private Use High Surrogate */ + ["\uDAE6", "\uDAE6"], /* Non Private Use High Surrogate */ + ["\uDAE7", "\uDAE7"], /* Non Private Use High Surrogate */ + ["\uDAE8", "\uDAE8"], /* Non Private Use High Surrogate */ + ["\uDAE9", "\uDAE9"], /* Non Private Use High Surrogate */ + ["\uDAEA", "\uDAEA"], /* Non Private Use High Surrogate */ + ["\uDAEB", "\uDAEB"], /* Non Private Use High Surrogate */ + ["\uDAEC", "\uDAEC"], /* Non Private Use High Surrogate */ + ["\uDAED", "\uDAED"], /* Non Private Use High Surrogate */ + ["\uDAEE", "\uDAEE"], /* Non Private Use High Surrogate */ + ["\uDAEF", "\uDAEF"], /* Non Private Use High Surrogate */ + ["\uDAF0", "\uDAF0"], /* Non Private Use High Surrogate */ + ["\uDAF1", "\uDAF1"], /* Non Private Use High Surrogate */ + ["\uDAF2", "\uDAF2"], /* Non Private Use High Surrogate */ + ["\uDAF3", "\uDAF3"], /* Non Private Use High Surrogate */ + ["\uDAF4", "\uDAF4"], /* Non Private Use High Surrogate */ + ["\uDAF5", "\uDAF5"], /* Non Private Use High Surrogate */ + ["\uDAF6", "\uDAF6"], /* Non Private Use High Surrogate */ + ["\uDAF7", "\uDAF7"], /* Non Private Use High Surrogate */ + ["\uDAF8", "\uDAF8"], /* Non Private Use High Surrogate */ + ["\uDAF9", "\uDAF9"], /* Non Private Use High Surrogate */ + ["\uDAFA", "\uDAFA"], /* Non Private Use High Surrogate */ + ["\uDAFB", "\uDAFB"], /* Non Private Use High Surrogate */ + ["\uDAFC", "\uDAFC"], /* Non Private Use High Surrogate */ + ["\uDAFD", "\uDAFD"], /* Non Private Use High Surrogate */ + ["\uDAFE", "\uDAFE"], /* Non Private Use High Surrogate */ + ["\uDAFF", "\uDAFF"], /* Non Private Use High Surrogate */ + ["\uDB00", "\uDB00"], /* Non Private Use High Surrogate */ + ["\uDB01", "\uDB01"], /* Non Private Use High Surrogate */ + ["\uDB02", "\uDB02"], /* Non Private Use High Surrogate */ + ["\uDB03", "\uDB03"], /* Non Private Use High Surrogate */ + ["\uDB04", "\uDB04"], /* Non Private Use High Surrogate */ + ["\uDB05", "\uDB05"], /* Non Private Use High Surrogate */ + ["\uDB06", "\uDB06"], /* Non Private Use High Surrogate */ + ["\uDB07", "\uDB07"], /* Non Private Use High Surrogate */ + ["\uDB08", "\uDB08"], /* Non Private Use High Surrogate */ + ["\uDB09", "\uDB09"], /* Non Private Use High Surrogate */ + ["\uDB0A", "\uDB0A"], /* Non Private Use High Surrogate */ + ["\uDB0B", "\uDB0B"], /* Non Private Use High Surrogate */ + ["\uDB0C", "\uDB0C"], /* Non Private Use High Surrogate */ + ["\uDB0D", "\uDB0D"], /* Non Private Use High Surrogate */ + ["\uDB0E", "\uDB0E"], /* Non Private Use High Surrogate */ + ["\uDB0F", "\uDB0F"], /* Non Private Use High Surrogate */ + ["\uDB10", "\uDB10"], /* Non Private Use High Surrogate */ + ["\uDB11", "\uDB11"], /* Non Private Use High Surrogate */ + ["\uDB12", "\uDB12"], /* Non Private Use High Surrogate */ + ["\uDB13", "\uDB13"], /* Non Private Use High Surrogate */ + ["\uDB14", "\uDB14"], /* Non Private Use High Surrogate */ + ["\uDB15", "\uDB15"], /* Non Private Use High Surrogate */ + ["\uDB16", "\uDB16"], /* Non Private Use High Surrogate */ + ["\uDB17", "\uDB17"], /* Non Private Use High Surrogate */ + ["\uDB18", "\uDB18"], /* Non Private Use High Surrogate */ + ["\uDB19", "\uDB19"], /* Non Private Use High Surrogate */ + ["\uDB1A", "\uDB1A"], /* Non Private Use High Surrogate */ + ["\uDB1B", "\uDB1B"], /* Non Private Use High Surrogate */ + ["\uDB1C", "\uDB1C"], /* Non Private Use High Surrogate */ + ["\uDB1D", "\uDB1D"], /* Non Private Use High Surrogate */ + ["\uDB1E", "\uDB1E"], /* Non Private Use High Surrogate */ + ["\uDB1F", "\uDB1F"], /* Non Private Use High Surrogate */ + ["\uDB20", "\uDB20"], /* Non Private Use High Surrogate */ + ["\uDB21", "\uDB21"], /* Non Private Use High Surrogate */ + ["\uDB22", "\uDB22"], /* Non Private Use High Surrogate */ + ["\uDB23", "\uDB23"], /* Non Private Use High Surrogate */ + ["\uDB24", "\uDB24"], /* Non Private Use High Surrogate */ + ["\uDB25", "\uDB25"], /* Non Private Use High Surrogate */ + ["\uDB26", "\uDB26"], /* Non Private Use High Surrogate */ + ["\uDB27", "\uDB27"], /* Non Private Use High Surrogate */ + ["\uDB28", "\uDB28"], /* Non Private Use High Surrogate */ + ["\uDB29", "\uDB29"], /* Non Private Use High Surrogate */ + ["\uDB2A", "\uDB2A"], /* Non Private Use High Surrogate */ + ["\uDB2B", "\uDB2B"], /* Non Private Use High Surrogate */ + ["\uDB2C", "\uDB2C"], /* Non Private Use High Surrogate */ + ["\uDB2D", "\uDB2D"], /* Non Private Use High Surrogate */ + ["\uDB2E", "\uDB2E"], /* Non Private Use High Surrogate */ + ["\uDB2F", "\uDB2F"], /* Non Private Use High Surrogate */ + ["\uDB30", "\uDB30"], /* Non Private Use High Surrogate */ + ["\uDB31", "\uDB31"], /* Non Private Use High Surrogate */ + ["\uDB32", "\uDB32"], /* Non Private Use High Surrogate */ + ["\uDB33", "\uDB33"], /* Non Private Use High Surrogate */ + ["\uDB34", "\uDB34"], /* Non Private Use High Surrogate */ + ["\uDB35", "\uDB35"], /* Non Private Use High Surrogate */ + ["\uDB36", "\uDB36"], /* Non Private Use High Surrogate */ + ["\uDB37", "\uDB37"], /* Non Private Use High Surrogate */ + ["\uDB38", "\uDB38"], /* Non Private Use High Surrogate */ + ["\uDB39", "\uDB39"], /* Non Private Use High Surrogate */ + ["\uDB3A", "\uDB3A"], /* Non Private Use High Surrogate */ + ["\uDB3B", "\uDB3B"], /* Non Private Use High Surrogate */ + ["\uDB3C", "\uDB3C"], /* Non Private Use High Surrogate */ + ["\uDB3D", "\uDB3D"], /* Non Private Use High Surrogate */ + ["\uDB3E", "\uDB3E"], /* Non Private Use High Surrogate */ + ["\uDB3F", "\uDB3F"], /* Non Private Use High Surrogate */ + ["\uDB40", "\uDB40"], /* Non Private Use High Surrogate */ + ["\uDB41", "\uDB41"], /* Non Private Use High Surrogate */ + ["\uDB42", "\uDB42"], /* Non Private Use High Surrogate */ + ["\uDB43", "\uDB43"], /* Non Private Use High Surrogate */ + ["\uDB44", "\uDB44"], /* Non Private Use High Surrogate */ + ["\uDB45", "\uDB45"], /* Non Private Use High Surrogate */ + ["\uDB46", "\uDB46"], /* Non Private Use High Surrogate */ + ["\uDB47", "\uDB47"], /* Non Private Use High Surrogate */ + ["\uDB48", "\uDB48"], /* Non Private Use High Surrogate */ + ["\uDB49", "\uDB49"], /* Non Private Use High Surrogate */ + ["\uDB4A", "\uDB4A"], /* Non Private Use High Surrogate */ + ["\uDB4B", "\uDB4B"], /* Non Private Use High Surrogate */ + ["\uDB4C", "\uDB4C"], /* Non Private Use High Surrogate */ + ["\uDB4D", "\uDB4D"], /* Non Private Use High Surrogate */ + ["\uDB4E", "\uDB4E"], /* Non Private Use High Surrogate */ + ["\uDB4F", "\uDB4F"], /* Non Private Use High Surrogate */ + ["\uDB50", "\uDB50"], /* Non Private Use High Surrogate */ + ["\uDB51", "\uDB51"], /* Non Private Use High Surrogate */ + ["\uDB52", "\uDB52"], /* Non Private Use High Surrogate */ + ["\uDB53", "\uDB53"], /* Non Private Use High Surrogate */ + ["\uDB54", "\uDB54"], /* Non Private Use High Surrogate */ + ["\uDB55", "\uDB55"], /* Non Private Use High Surrogate */ + ["\uDB56", "\uDB56"], /* Non Private Use High Surrogate */ + ["\uDB57", "\uDB57"], /* Non Private Use High Surrogate */ + ["\uDB58", "\uDB58"], /* Non Private Use High Surrogate */ + ["\uDB59", "\uDB59"], /* Non Private Use High Surrogate */ + ["\uDB5A", "\uDB5A"], /* Non Private Use High Surrogate */ + ["\uDB5B", "\uDB5B"], /* Non Private Use High Surrogate */ + ["\uDB5C", "\uDB5C"], /* Non Private Use High Surrogate */ + ["\uDB5D", "\uDB5D"], /* Non Private Use High Surrogate */ + ["\uDB5E", "\uDB5E"], /* Non Private Use High Surrogate */ + ["\uDB5F", "\uDB5F"], /* Non Private Use High Surrogate */ + ["\uDB60", "\uDB60"], /* Non Private Use High Surrogate */ + ["\uDB61", "\uDB61"], /* Non Private Use High Surrogate */ + ["\uDB62", "\uDB62"], /* Non Private Use High Surrogate */ + ["\uDB63", "\uDB63"], /* Non Private Use High Surrogate */ + ["\uDB64", "\uDB64"], /* Non Private Use High Surrogate */ + ["\uDB65", "\uDB65"], /* Non Private Use High Surrogate */ + ["\uDB66", "\uDB66"], /* Non Private Use High Surrogate */ + ["\uDB67", "\uDB67"], /* Non Private Use High Surrogate */ + ["\uDB68", "\uDB68"], /* Non Private Use High Surrogate */ + ["\uDB69", "\uDB69"], /* Non Private Use High Surrogate */ + ["\uDB6A", "\uDB6A"], /* Non Private Use High Surrogate */ + ["\uDB6B", "\uDB6B"], /* Non Private Use High Surrogate */ + ["\uDB6C", "\uDB6C"], /* Non Private Use High Surrogate */ + ["\uDB6D", "\uDB6D"], /* Non Private Use High Surrogate */ + ["\uDB6E", "\uDB6E"], /* Non Private Use High Surrogate */ + ["\uDB6F", "\uDB6F"], /* Non Private Use High Surrogate */ + ["\uDB70", "\uDB70"], /* Non Private Use High Surrogate */ + ["\uDB71", "\uDB71"], /* Non Private Use High Surrogate */ + ["\uDB72", "\uDB72"], /* Non Private Use High Surrogate */ + ["\uDB73", "\uDB73"], /* Non Private Use High Surrogate */ + ["\uDB74", "\uDB74"], /* Non Private Use High Surrogate */ + ["\uDB75", "\uDB75"], /* Non Private Use High Surrogate */ + ["\uDB76", "\uDB76"], /* Non Private Use High Surrogate */ + ["\uDB77", "\uDB77"], /* Non Private Use High Surrogate */ + ["\uDB78", "\uDB78"], /* Non Private Use High Surrogate */ + ["\uDB79", "\uDB79"], /* Non Private Use High Surrogate */ + ["\uDB7A", "\uDB7A"], /* Non Private Use High Surrogate */ + ["\uDB7B", "\uDB7B"], /* Non Private Use High Surrogate */ + ["\uDB7C", "\uDB7C"], /* Non Private Use High Surrogate */ + ["\uDB7D", "\uDB7D"], /* Non Private Use High Surrogate */ + ["\uDB7E", "\uDB7E"], /* Non Private Use High Surrogate */ + ["\uDB7F", "\uDB7F"], /* Non Private Use High Surrogate */ + ["\uDB80", "\uDB80"], /* Private Use High Surrogate */ + ["\uDB81", "\uDB81"], /* Private Use High Surrogate */ + ["\uDB82", "\uDB82"], /* Private Use High Surrogate */ + ["\uDB83", "\uDB83"], /* Private Use High Surrogate */ + ["\uDB84", "\uDB84"], /* Private Use High Surrogate */ + ["\uDB85", "\uDB85"], /* Private Use High Surrogate */ + ["\uDB86", "\uDB86"], /* Private Use High Surrogate */ + ["\uDB87", "\uDB87"], /* Private Use High Surrogate */ + ["\uDB88", "\uDB88"], /* Private Use High Surrogate */ + ["\uDB89", "\uDB89"], /* Private Use High Surrogate */ + ["\uDB8A", "\uDB8A"], /* Private Use High Surrogate */ + ["\uDB8B", "\uDB8B"], /* Private Use High Surrogate */ + ["\uDB8C", "\uDB8C"], /* Private Use High Surrogate */ + ["\uDB8D", "\uDB8D"], /* Private Use High Surrogate */ + ["\uDB8E", "\uDB8E"], /* Private Use High Surrogate */ + ["\uDB8F", "\uDB8F"], /* Private Use High Surrogate */ + ["\uDB90", "\uDB90"], /* Private Use High Surrogate */ + ["\uDB91", "\uDB91"], /* Private Use High Surrogate */ + ["\uDB92", "\uDB92"], /* Private Use High Surrogate */ + ["\uDB93", "\uDB93"], /* Private Use High Surrogate */ + ["\uDB94", "\uDB94"], /* Private Use High Surrogate */ + ["\uDB95", "\uDB95"], /* Private Use High Surrogate */ + ["\uDB96", "\uDB96"], /* Private Use High Surrogate */ + ["\uDB97", "\uDB97"], /* Private Use High Surrogate */ + ["\uDB98", "\uDB98"], /* Private Use High Surrogate */ + ["\uDB99", "\uDB99"], /* Private Use High Surrogate */ + ["\uDB9A", "\uDB9A"], /* Private Use High Surrogate */ + ["\uDB9B", "\uDB9B"], /* Private Use High Surrogate */ + ["\uDB9C", "\uDB9C"], /* Private Use High Surrogate */ + ["\uDB9D", "\uDB9D"], /* Private Use High Surrogate */ + ["\uDB9E", "\uDB9E"], /* Private Use High Surrogate */ + ["\uDB9F", "\uDB9F"], /* Private Use High Surrogate */ + ["\uDBA0", "\uDBA0"], /* Private Use High Surrogate */ + ["\uDBA1", "\uDBA1"], /* Private Use High Surrogate */ + ["\uDBA2", "\uDBA2"], /* Private Use High Surrogate */ + ["\uDBA3", "\uDBA3"], /* Private Use High Surrogate */ + ["\uDBA4", "\uDBA4"], /* Private Use High Surrogate */ + ["\uDBA5", "\uDBA5"], /* Private Use High Surrogate */ + ["\uDBA6", "\uDBA6"], /* Private Use High Surrogate */ + ["\uDBA7", "\uDBA7"], /* Private Use High Surrogate */ + ["\uDBA8", "\uDBA8"], /* Private Use High Surrogate */ + ["\uDBA9", "\uDBA9"], /* Private Use High Surrogate */ + ["\uDBAA", "\uDBAA"], /* Private Use High Surrogate */ + ["\uDBAB", "\uDBAB"], /* Private Use High Surrogate */ + ["\uDBAC", "\uDBAC"], /* Private Use High Surrogate */ + ["\uDBAD", "\uDBAD"], /* Private Use High Surrogate */ + ["\uDBAE", "\uDBAE"], /* Private Use High Surrogate */ + ["\uDBAF", "\uDBAF"], /* Private Use High Surrogate */ + ["\uDBB0", "\uDBB0"], /* Private Use High Surrogate */ + ["\uDBB1", "\uDBB1"], /* Private Use High Surrogate */ + ["\uDBB2", "\uDBB2"], /* Private Use High Surrogate */ + ["\uDBB3", "\uDBB3"], /* Private Use High Surrogate */ + ["\uDBB4", "\uDBB4"], /* Private Use High Surrogate */ + ["\uDBB5", "\uDBB5"], /* Private Use High Surrogate */ + ["\uDBB6", "\uDBB6"], /* Private Use High Surrogate */ + ["\uDBB7", "\uDBB7"], /* Private Use High Surrogate */ + ["\uDBB8", "\uDBB8"], /* Private Use High Surrogate */ + ["\uDBB9", "\uDBB9"], /* Private Use High Surrogate */ + ["\uDBBA", "\uDBBA"], /* Private Use High Surrogate */ + ["\uDBBB", "\uDBBB"], /* Private Use High Surrogate */ + ["\uDBBC", "\uDBBC"], /* Private Use High Surrogate */ + ["\uDBBD", "\uDBBD"], /* Private Use High Surrogate */ + ["\uDBBE", "\uDBBE"], /* Private Use High Surrogate */ + ["\uDBBF", "\uDBBF"], /* Private Use High Surrogate */ + ["\uDBC0", "\uDBC0"], /* Private Use High Surrogate */ + ["\uDBC1", "\uDBC1"], /* Private Use High Surrogate */ + ["\uDBC2", "\uDBC2"], /* Private Use High Surrogate */ + ["\uDBC3", "\uDBC3"], /* Private Use High Surrogate */ + ["\uDBC4", "\uDBC4"], /* Private Use High Surrogate */ + ["\uDBC5", "\uDBC5"], /* Private Use High Surrogate */ + ["\uDBC6", "\uDBC6"], /* Private Use High Surrogate */ + ["\uDBC7", "\uDBC7"], /* Private Use High Surrogate */ + ["\uDBC8", "\uDBC8"], /* Private Use High Surrogate */ + ["\uDBC9", "\uDBC9"], /* Private Use High Surrogate */ + ["\uDBCA", "\uDBCA"], /* Private Use High Surrogate */ + ["\uDBCB", "\uDBCB"], /* Private Use High Surrogate */ + ["\uDBCC", "\uDBCC"], /* Private Use High Surrogate */ + ["\uDBCD", "\uDBCD"], /* Private Use High Surrogate */ + ["\uDBCE", "\uDBCE"], /* Private Use High Surrogate */ + ["\uDBCF", "\uDBCF"], /* Private Use High Surrogate */ + ["\uDBD0", "\uDBD0"], /* Private Use High Surrogate */ + ["\uDBD1", "\uDBD1"], /* Private Use High Surrogate */ + ["\uDBD2", "\uDBD2"], /* Private Use High Surrogate */ + ["\uDBD3", "\uDBD3"], /* Private Use High Surrogate */ + ["\uDBD4", "\uDBD4"], /* Private Use High Surrogate */ + ["\uDBD5", "\uDBD5"], /* Private Use High Surrogate */ + ["\uDBD6", "\uDBD6"], /* Private Use High Surrogate */ + ["\uDBD7", "\uDBD7"], /* Private Use High Surrogate */ + ["\uDBD8", "\uDBD8"], /* Private Use High Surrogate */ + ["\uDBD9", "\uDBD9"], /* Private Use High Surrogate */ + ["\uDBDA", "\uDBDA"], /* Private Use High Surrogate */ + ["\uDBDB", "\uDBDB"], /* Private Use High Surrogate */ + ["\uDBDC", "\uDBDC"], /* Private Use High Surrogate */ + ["\uDBDD", "\uDBDD"], /* Private Use High Surrogate */ + ["\uDBDE", "\uDBDE"], /* Private Use High Surrogate */ + ["\uDBDF", "\uDBDF"], /* Private Use High Surrogate */ + ["\uDBE0", "\uDBE0"], /* Private Use High Surrogate */ + ["\uDBE1", "\uDBE1"], /* Private Use High Surrogate */ + ["\uDBE2", "\uDBE2"], /* Private Use High Surrogate */ + ["\uDBE3", "\uDBE3"], /* Private Use High Surrogate */ + ["\uDBE4", "\uDBE4"], /* Private Use High Surrogate */ + ["\uDBE5", "\uDBE5"], /* Private Use High Surrogate */ + ["\uDBE6", "\uDBE6"], /* Private Use High Surrogate */ + ["\uDBE7", "\uDBE7"], /* Private Use High Surrogate */ + ["\uDBE8", "\uDBE8"], /* Private Use High Surrogate */ + ["\uDBE9", "\uDBE9"], /* Private Use High Surrogate */ + ["\uDBEA", "\uDBEA"], /* Private Use High Surrogate */ + ["\uDBEB", "\uDBEB"], /* Private Use High Surrogate */ + ["\uDBEC", "\uDBEC"], /* Private Use High Surrogate */ + ["\uDBED", "\uDBED"], /* Private Use High Surrogate */ + ["\uDBEE", "\uDBEE"], /* Private Use High Surrogate */ + ["\uDBEF", "\uDBEF"], /* Private Use High Surrogate */ + ["\uDBF0", "\uDBF0"], /* Private Use High Surrogate */ + ["\uDBF1", "\uDBF1"], /* Private Use High Surrogate */ + ["\uDBF2", "\uDBF2"], /* Private Use High Surrogate */ + ["\uDBF3", "\uDBF3"], /* Private Use High Surrogate */ + ["\uDBF4", "\uDBF4"], /* Private Use High Surrogate */ + ["\uDBF5", "\uDBF5"], /* Private Use High Surrogate */ + ["\uDBF6", "\uDBF6"], /* Private Use High Surrogate */ + ["\uDBF7", "\uDBF7"], /* Private Use High Surrogate */ + ["\uDBF8", "\uDBF8"], /* Private Use High Surrogate */ + ["\uDBF9", "\uDBF9"], /* Private Use High Surrogate */ + ["\uDBFA", "\uDBFA"], /* Private Use High Surrogate */ + ["\uDBFB", "\uDBFB"], /* Private Use High Surrogate */ + ["\uDBFC", "\uDBFC"], /* Private Use High Surrogate */ + ["\uDBFD", "\uDBFD"], /* Private Use High Surrogate */ + ["\uDBFE", "\uDBFE"], /* Private Use High Surrogate */ + ["\uDBFF", "\uDBFF"], /* Private Use High Surrogate */ + ["\uDC00", "\uDC00"], /* Low Surrogate */ + ["\uDC01", "\uDC01"], /* Low Surrogate */ + ["\uDC02", "\uDC02"], /* Low Surrogate */ + ["\uDC03", "\uDC03"], /* Low Surrogate */ + ["\uDC04", "\uDC04"], /* Low Surrogate */ + ["\uDC05", "\uDC05"], /* Low Surrogate */ + ["\uDC06", "\uDC06"], /* Low Surrogate */ + ["\uDC07", "\uDC07"], /* Low Surrogate */ + ["\uDC08", "\uDC08"], /* Low Surrogate */ + ["\uDC09", "\uDC09"], /* Low Surrogate */ + ["\uDC0A", "\uDC0A"], /* Low Surrogate */ + ["\uDC0B", "\uDC0B"], /* Low Surrogate */ + ["\uDC0C", "\uDC0C"], /* Low Surrogate */ + ["\uDC0D", "\uDC0D"], /* Low Surrogate */ + ["\uDC0E", "\uDC0E"], /* Low Surrogate */ + ["\uDC0F", "\uDC0F"], /* Low Surrogate */ + ["\uDC10", "\uDC10"], /* Low Surrogate */ + ["\uDC11", "\uDC11"], /* Low Surrogate */ + ["\uDC12", "\uDC12"], /* Low Surrogate */ + ["\uDC13", "\uDC13"], /* Low Surrogate */ + ["\uDC14", "\uDC14"], /* Low Surrogate */ + ["\uDC15", "\uDC15"], /* Low Surrogate */ + ["\uDC16", "\uDC16"], /* Low Surrogate */ + ["\uDC17", "\uDC17"], /* Low Surrogate */ + ["\uDC18", "\uDC18"], /* Low Surrogate */ + ["\uDC19", "\uDC19"], /* Low Surrogate */ + ["\uDC1A", "\uDC1A"], /* Low Surrogate */ + ["\uDC1B", "\uDC1B"], /* Low Surrogate */ + ["\uDC1C", "\uDC1C"], /* Low Surrogate */ + ["\uDC1D", "\uDC1D"], /* Low Surrogate */ + ["\uDC1E", "\uDC1E"], /* Low Surrogate */ + ["\uDC1F", "\uDC1F"], /* Low Surrogate */ + ["\uDC20", "\uDC20"], /* Low Surrogate */ + ["\uDC21", "\uDC21"], /* Low Surrogate */ + ["\uDC22", "\uDC22"], /* Low Surrogate */ + ["\uDC23", "\uDC23"], /* Low Surrogate */ + ["\uDC24", "\uDC24"], /* Low Surrogate */ + ["\uDC25", "\uDC25"], /* Low Surrogate */ + ["\uDC26", "\uDC26"], /* Low Surrogate */ + ["\uDC27", "\uDC27"], /* Low Surrogate */ + ["\uDC28", "\uDC28"], /* Low Surrogate */ + ["\uDC29", "\uDC29"], /* Low Surrogate */ + ["\uDC2A", "\uDC2A"], /* Low Surrogate */ + ["\uDC2B", "\uDC2B"], /* Low Surrogate */ + ["\uDC2C", "\uDC2C"], /* Low Surrogate */ + ["\uDC2D", "\uDC2D"], /* Low Surrogate */ + ["\uDC2E", "\uDC2E"], /* Low Surrogate */ + ["\uDC2F", "\uDC2F"], /* Low Surrogate */ + ["\uDC30", "\uDC30"], /* Low Surrogate */ + ["\uDC31", "\uDC31"], /* Low Surrogate */ + ["\uDC32", "\uDC32"], /* Low Surrogate */ + ["\uDC33", "\uDC33"], /* Low Surrogate */ + ["\uDC34", "\uDC34"], /* Low Surrogate */ + ["\uDC35", "\uDC35"], /* Low Surrogate */ + ["\uDC36", "\uDC36"], /* Low Surrogate */ + ["\uDC37", "\uDC37"], /* Low Surrogate */ + ["\uDC38", "\uDC38"], /* Low Surrogate */ + ["\uDC39", "\uDC39"], /* Low Surrogate */ + ["\uDC3A", "\uDC3A"], /* Low Surrogate */ + ["\uDC3B", "\uDC3B"], /* Low Surrogate */ + ["\uDC3C", "\uDC3C"], /* Low Surrogate */ + ["\uDC3D", "\uDC3D"], /* Low Surrogate */ + ["\uDC3E", "\uDC3E"], /* Low Surrogate */ + ["\uDC3F", "\uDC3F"], /* Low Surrogate */ + ["\uDC40", "\uDC40"], /* Low Surrogate */ + ["\uDC41", "\uDC41"], /* Low Surrogate */ + ["\uDC42", "\uDC42"], /* Low Surrogate */ + ["\uDC43", "\uDC43"], /* Low Surrogate */ + ["\uDC44", "\uDC44"], /* Low Surrogate */ + ["\uDC45", "\uDC45"], /* Low Surrogate */ + ["\uDC46", "\uDC46"], /* Low Surrogate */ + ["\uDC47", "\uDC47"], /* Low Surrogate */ + ["\uDC48", "\uDC48"], /* Low Surrogate */ + ["\uDC49", "\uDC49"], /* Low Surrogate */ + ["\uDC4A", "\uDC4A"], /* Low Surrogate */ + ["\uDC4B", "\uDC4B"], /* Low Surrogate */ + ["\uDC4C", "\uDC4C"], /* Low Surrogate */ + ["\uDC4D", "\uDC4D"], /* Low Surrogate */ + ["\uDC4E", "\uDC4E"], /* Low Surrogate */ + ["\uDC4F", "\uDC4F"], /* Low Surrogate */ + ["\uDC50", "\uDC50"], /* Low Surrogate */ + ["\uDC51", "\uDC51"], /* Low Surrogate */ + ["\uDC52", "\uDC52"], /* Low Surrogate */ + ["\uDC53", "\uDC53"], /* Low Surrogate */ + ["\uDC54", "\uDC54"], /* Low Surrogate */ + ["\uDC55", "\uDC55"], /* Low Surrogate */ + ["\uDC56", "\uDC56"], /* Low Surrogate */ + ["\uDC57", "\uDC57"], /* Low Surrogate */ + ["\uDC58", "\uDC58"], /* Low Surrogate */ + ["\uDC59", "\uDC59"], /* Low Surrogate */ + ["\uDC5A", "\uDC5A"], /* Low Surrogate */ + ["\uDC5B", "\uDC5B"], /* Low Surrogate */ + ["\uDC5C", "\uDC5C"], /* Low Surrogate */ + ["\uDC5D", "\uDC5D"], /* Low Surrogate */ + ["\uDC5E", "\uDC5E"], /* Low Surrogate */ + ["\uDC5F", "\uDC5F"], /* Low Surrogate */ + ["\uDC60", "\uDC60"], /* Low Surrogate */ + ["\uDC61", "\uDC61"], /* Low Surrogate */ + ["\uDC62", "\uDC62"], /* Low Surrogate */ + ["\uDC63", "\uDC63"], /* Low Surrogate */ + ["\uDC64", "\uDC64"], /* Low Surrogate */ + ["\uDC65", "\uDC65"], /* Low Surrogate */ + ["\uDC66", "\uDC66"], /* Low Surrogate */ + ["\uDC67", "\uDC67"], /* Low Surrogate */ + ["\uDC68", "\uDC68"], /* Low Surrogate */ + ["\uDC69", "\uDC69"], /* Low Surrogate */ + ["\uDC6A", "\uDC6A"], /* Low Surrogate */ + ["\uDC6B", "\uDC6B"], /* Low Surrogate */ + ["\uDC6C", "\uDC6C"], /* Low Surrogate */ + ["\uDC6D", "\uDC6D"], /* Low Surrogate */ + ["\uDC6E", "\uDC6E"], /* Low Surrogate */ + ["\uDC6F", "\uDC6F"], /* Low Surrogate */ + ["\uDC70", "\uDC70"], /* Low Surrogate */ + ["\uDC71", "\uDC71"], /* Low Surrogate */ + ["\uDC72", "\uDC72"], /* Low Surrogate */ + ["\uDC73", "\uDC73"], /* Low Surrogate */ + ["\uDC74", "\uDC74"], /* Low Surrogate */ + ["\uDC75", "\uDC75"], /* Low Surrogate */ + ["\uDC76", "\uDC76"], /* Low Surrogate */ + ["\uDC77", "\uDC77"], /* Low Surrogate */ + ["\uDC78", "\uDC78"], /* Low Surrogate */ + ["\uDC79", "\uDC79"], /* Low Surrogate */ + ["\uDC7A", "\uDC7A"], /* Low Surrogate */ + ["\uDC7B", "\uDC7B"], /* Low Surrogate */ + ["\uDC7C", "\uDC7C"], /* Low Surrogate */ + ["\uDC7D", "\uDC7D"], /* Low Surrogate */ + ["\uDC7E", "\uDC7E"], /* Low Surrogate */ + ["\uDC7F", "\uDC7F"], /* Low Surrogate */ + ["\uDC80", "\uDC80"], /* Low Surrogate */ + ["\uDC81", "\uDC81"], /* Low Surrogate */ + ["\uDC82", "\uDC82"], /* Low Surrogate */ + ["\uDC83", "\uDC83"], /* Low Surrogate */ + ["\uDC84", "\uDC84"], /* Low Surrogate */ + ["\uDC85", "\uDC85"], /* Low Surrogate */ + ["\uDC86", "\uDC86"], /* Low Surrogate */ + ["\uDC87", "\uDC87"], /* Low Surrogate */ + ["\uDC88", "\uDC88"], /* Low Surrogate */ + ["\uDC89", "\uDC89"], /* Low Surrogate */ + ["\uDC8A", "\uDC8A"], /* Low Surrogate */ + ["\uDC8B", "\uDC8B"], /* Low Surrogate */ + ["\uDC8C", "\uDC8C"], /* Low Surrogate */ + ["\uDC8D", "\uDC8D"], /* Low Surrogate */ + ["\uDC8E", "\uDC8E"], /* Low Surrogate */ + ["\uDC8F", "\uDC8F"], /* Low Surrogate */ + ["\uDC90", "\uDC90"], /* Low Surrogate */ + ["\uDC91", "\uDC91"], /* Low Surrogate */ + ["\uDC92", "\uDC92"], /* Low Surrogate */ + ["\uDC93", "\uDC93"], /* Low Surrogate */ + ["\uDC94", "\uDC94"], /* Low Surrogate */ + ["\uDC95", "\uDC95"], /* Low Surrogate */ + ["\uDC96", "\uDC96"], /* Low Surrogate */ + ["\uDC97", "\uDC97"], /* Low Surrogate */ + ["\uDC98", "\uDC98"], /* Low Surrogate */ + ["\uDC99", "\uDC99"], /* Low Surrogate */ + ["\uDC9A", "\uDC9A"], /* Low Surrogate */ + ["\uDC9B", "\uDC9B"], /* Low Surrogate */ + ["\uDC9C", "\uDC9C"], /* Low Surrogate */ + ["\uDC9D", "\uDC9D"], /* Low Surrogate */ + ["\uDC9E", "\uDC9E"], /* Low Surrogate */ + ["\uDC9F", "\uDC9F"], /* Low Surrogate */ + ["\uDCA0", "\uDCA0"], /* Low Surrogate */ + ["\uDCA1", "\uDCA1"], /* Low Surrogate */ + ["\uDCA2", "\uDCA2"], /* Low Surrogate */ + ["\uDCA3", "\uDCA3"], /* Low Surrogate */ + ["\uDCA4", "\uDCA4"], /* Low Surrogate */ + ["\uDCA5", "\uDCA5"], /* Low Surrogate */ + ["\uDCA6", "\uDCA6"], /* Low Surrogate */ + ["\uDCA7", "\uDCA7"], /* Low Surrogate */ + ["\uDCA8", "\uDCA8"], /* Low Surrogate */ + ["\uDCA9", "\uDCA9"], /* Low Surrogate */ + ["\uDCAA", "\uDCAA"], /* Low Surrogate */ + ["\uDCAB", "\uDCAB"], /* Low Surrogate */ + ["\uDCAC", "\uDCAC"], /* Low Surrogate */ + ["\uDCAD", "\uDCAD"], /* Low Surrogate */ + ["\uDCAE", "\uDCAE"], /* Low Surrogate */ + ["\uDCAF", "\uDCAF"], /* Low Surrogate */ + ["\uDCB0", "\uDCB0"], /* Low Surrogate */ + ["\uDCB1", "\uDCB1"], /* Low Surrogate */ + ["\uDCB2", "\uDCB2"], /* Low Surrogate */ + ["\uDCB3", "\uDCB3"], /* Low Surrogate */ + ["\uDCB4", "\uDCB4"], /* Low Surrogate */ + ["\uDCB5", "\uDCB5"], /* Low Surrogate */ + ["\uDCB6", "\uDCB6"], /* Low Surrogate */ + ["\uDCB7", "\uDCB7"], /* Low Surrogate */ + ["\uDCB8", "\uDCB8"], /* Low Surrogate */ + ["\uDCB9", "\uDCB9"], /* Low Surrogate */ + ["\uDCBA", "\uDCBA"], /* Low Surrogate */ + ["\uDCBB", "\uDCBB"], /* Low Surrogate */ + ["\uDCBC", "\uDCBC"], /* Low Surrogate */ + ["\uDCBD", "\uDCBD"], /* Low Surrogate */ + ["\uDCBE", "\uDCBE"], /* Low Surrogate */ + ["\uDCBF", "\uDCBF"], /* Low Surrogate */ + ["\uDCC0", "\uDCC0"], /* Low Surrogate */ + ["\uDCC1", "\uDCC1"], /* Low Surrogate */ + ["\uDCC2", "\uDCC2"], /* Low Surrogate */ + ["\uDCC3", "\uDCC3"], /* Low Surrogate */ + ["\uDCC4", "\uDCC4"], /* Low Surrogate */ + ["\uDCC5", "\uDCC5"], /* Low Surrogate */ + ["\uDCC6", "\uDCC6"], /* Low Surrogate */ + ["\uDCC7", "\uDCC7"], /* Low Surrogate */ + ["\uDCC8", "\uDCC8"], /* Low Surrogate */ + ["\uDCC9", "\uDCC9"], /* Low Surrogate */ + ["\uDCCA", "\uDCCA"], /* Low Surrogate */ + ["\uDCCB", "\uDCCB"], /* Low Surrogate */ + ["\uDCCC", "\uDCCC"], /* Low Surrogate */ + ["\uDCCD", "\uDCCD"], /* Low Surrogate */ + ["\uDCCE", "\uDCCE"], /* Low Surrogate */ + ["\uDCCF", "\uDCCF"], /* Low Surrogate */ + ["\uDCD0", "\uDCD0"], /* Low Surrogate */ + ["\uDCD1", "\uDCD1"], /* Low Surrogate */ + ["\uDCD2", "\uDCD2"], /* Low Surrogate */ + ["\uDCD3", "\uDCD3"], /* Low Surrogate */ + ["\uDCD4", "\uDCD4"], /* Low Surrogate */ + ["\uDCD5", "\uDCD5"], /* Low Surrogate */ + ["\uDCD6", "\uDCD6"], /* Low Surrogate */ + ["\uDCD7", "\uDCD7"], /* Low Surrogate */ + ["\uDCD8", "\uDCD8"], /* Low Surrogate */ + ["\uDCD9", "\uDCD9"], /* Low Surrogate */ + ["\uDCDA", "\uDCDA"], /* Low Surrogate */ + ["\uDCDB", "\uDCDB"], /* Low Surrogate */ + ["\uDCDC", "\uDCDC"], /* Low Surrogate */ + ["\uDCDD", "\uDCDD"], /* Low Surrogate */ + ["\uDCDE", "\uDCDE"], /* Low Surrogate */ + ["\uDCDF", "\uDCDF"], /* Low Surrogate */ + ["\uDCE0", "\uDCE0"], /* Low Surrogate */ + ["\uDCE1", "\uDCE1"], /* Low Surrogate */ + ["\uDCE2", "\uDCE2"], /* Low Surrogate */ + ["\uDCE3", "\uDCE3"], /* Low Surrogate */ + ["\uDCE4", "\uDCE4"], /* Low Surrogate */ + ["\uDCE5", "\uDCE5"], /* Low Surrogate */ + ["\uDCE6", "\uDCE6"], /* Low Surrogate */ + ["\uDCE7", "\uDCE7"], /* Low Surrogate */ + ["\uDCE8", "\uDCE8"], /* Low Surrogate */ + ["\uDCE9", "\uDCE9"], /* Low Surrogate */ + ["\uDCEA", "\uDCEA"], /* Low Surrogate */ + ["\uDCEB", "\uDCEB"], /* Low Surrogate */ + ["\uDCEC", "\uDCEC"], /* Low Surrogate */ + ["\uDCED", "\uDCED"], /* Low Surrogate */ + ["\uDCEE", "\uDCEE"], /* Low Surrogate */ + ["\uDCEF", "\uDCEF"], /* Low Surrogate */ + ["\uDCF0", "\uDCF0"], /* Low Surrogate */ + ["\uDCF1", "\uDCF1"], /* Low Surrogate */ + ["\uDCF2", "\uDCF2"], /* Low Surrogate */ + ["\uDCF3", "\uDCF3"], /* Low Surrogate */ + ["\uDCF4", "\uDCF4"], /* Low Surrogate */ + ["\uDCF5", "\uDCF5"], /* Low Surrogate */ + ["\uDCF6", "\uDCF6"], /* Low Surrogate */ + ["\uDCF7", "\uDCF7"], /* Low Surrogate */ + ["\uDCF8", "\uDCF8"], /* Low Surrogate */ + ["\uDCF9", "\uDCF9"], /* Low Surrogate */ + ["\uDCFA", "\uDCFA"], /* Low Surrogate */ + ["\uDCFB", "\uDCFB"], /* Low Surrogate */ + ["\uDCFC", "\uDCFC"], /* Low Surrogate */ + ["\uDCFD", "\uDCFD"], /* Low Surrogate */ + ["\uDCFE", "\uDCFE"], /* Low Surrogate */ + ["\uDCFF", "\uDCFF"], /* Low Surrogate */ + ["\uDD00", "\uDD00"], /* Low Surrogate */ + ["\uDD01", "\uDD01"], /* Low Surrogate */ + ["\uDD02", "\uDD02"], /* Low Surrogate */ + ["\uDD03", "\uDD03"], /* Low Surrogate */ + ["\uDD04", "\uDD04"], /* Low Surrogate */ + ["\uDD05", "\uDD05"], /* Low Surrogate */ + ["\uDD06", "\uDD06"], /* Low Surrogate */ + ["\uDD07", "\uDD07"], /* Low Surrogate */ + ["\uDD08", "\uDD08"], /* Low Surrogate */ + ["\uDD09", "\uDD09"], /* Low Surrogate */ + ["\uDD0A", "\uDD0A"], /* Low Surrogate */ + ["\uDD0B", "\uDD0B"], /* Low Surrogate */ + ["\uDD0C", "\uDD0C"], /* Low Surrogate */ + ["\uDD0D", "\uDD0D"], /* Low Surrogate */ + ["\uDD0E", "\uDD0E"], /* Low Surrogate */ + ["\uDD0F", "\uDD0F"], /* Low Surrogate */ + ["\uDD10", "\uDD10"], /* Low Surrogate */ + ["\uDD11", "\uDD11"], /* Low Surrogate */ + ["\uDD12", "\uDD12"], /* Low Surrogate */ + ["\uDD13", "\uDD13"], /* Low Surrogate */ + ["\uDD14", "\uDD14"], /* Low Surrogate */ + ["\uDD15", "\uDD15"], /* Low Surrogate */ + ["\uDD16", "\uDD16"], /* Low Surrogate */ + ["\uDD17", "\uDD17"], /* Low Surrogate */ + ["\uDD18", "\uDD18"], /* Low Surrogate */ + ["\uDD19", "\uDD19"], /* Low Surrogate */ + ["\uDD1A", "\uDD1A"], /* Low Surrogate */ + ["\uDD1B", "\uDD1B"], /* Low Surrogate */ + ["\uDD1C", "\uDD1C"], /* Low Surrogate */ + ["\uDD1D", "\uDD1D"], /* Low Surrogate */ + ["\uDD1E", "\uDD1E"], /* Low Surrogate */ + ["\uDD1F", "\uDD1F"], /* Low Surrogate */ + ["\uDD20", "\uDD20"], /* Low Surrogate */ + ["\uDD21", "\uDD21"], /* Low Surrogate */ + ["\uDD22", "\uDD22"], /* Low Surrogate */ + ["\uDD23", "\uDD23"], /* Low Surrogate */ + ["\uDD24", "\uDD24"], /* Low Surrogate */ + ["\uDD25", "\uDD25"], /* Low Surrogate */ + ["\uDD26", "\uDD26"], /* Low Surrogate */ + ["\uDD27", "\uDD27"], /* Low Surrogate */ + ["\uDD28", "\uDD28"], /* Low Surrogate */ + ["\uDD29", "\uDD29"], /* Low Surrogate */ + ["\uDD2A", "\uDD2A"], /* Low Surrogate */ + ["\uDD2B", "\uDD2B"], /* Low Surrogate */ + ["\uDD2C", "\uDD2C"], /* Low Surrogate */ + ["\uDD2D", "\uDD2D"], /* Low Surrogate */ + ["\uDD2E", "\uDD2E"], /* Low Surrogate */ + ["\uDD2F", "\uDD2F"], /* Low Surrogate */ + ["\uDD30", "\uDD30"], /* Low Surrogate */ + ["\uDD31", "\uDD31"], /* Low Surrogate */ + ["\uDD32", "\uDD32"], /* Low Surrogate */ + ["\uDD33", "\uDD33"], /* Low Surrogate */ + ["\uDD34", "\uDD34"], /* Low Surrogate */ + ["\uDD35", "\uDD35"], /* Low Surrogate */ + ["\uDD36", "\uDD36"], /* Low Surrogate */ + ["\uDD37", "\uDD37"], /* Low Surrogate */ + ["\uDD38", "\uDD38"], /* Low Surrogate */ + ["\uDD39", "\uDD39"], /* Low Surrogate */ + ["\uDD3A", "\uDD3A"], /* Low Surrogate */ + ["\uDD3B", "\uDD3B"], /* Low Surrogate */ + ["\uDD3C", "\uDD3C"], /* Low Surrogate */ + ["\uDD3D", "\uDD3D"], /* Low Surrogate */ + ["\uDD3E", "\uDD3E"], /* Low Surrogate */ + ["\uDD3F", "\uDD3F"], /* Low Surrogate */ + ["\uDD40", "\uDD40"], /* Low Surrogate */ + ["\uDD41", "\uDD41"], /* Low Surrogate */ + ["\uDD42", "\uDD42"], /* Low Surrogate */ + ["\uDD43", "\uDD43"], /* Low Surrogate */ + ["\uDD44", "\uDD44"], /* Low Surrogate */ + ["\uDD45", "\uDD45"], /* Low Surrogate */ + ["\uDD46", "\uDD46"], /* Low Surrogate */ + ["\uDD47", "\uDD47"], /* Low Surrogate */ + ["\uDD48", "\uDD48"], /* Low Surrogate */ + ["\uDD49", "\uDD49"], /* Low Surrogate */ + ["\uDD4A", "\uDD4A"], /* Low Surrogate */ + ["\uDD4B", "\uDD4B"], /* Low Surrogate */ + ["\uDD4C", "\uDD4C"], /* Low Surrogate */ + ["\uDD4D", "\uDD4D"], /* Low Surrogate */ + ["\uDD4E", "\uDD4E"], /* Low Surrogate */ + ["\uDD4F", "\uDD4F"], /* Low Surrogate */ + ["\uDD50", "\uDD50"], /* Low Surrogate */ + ["\uDD51", "\uDD51"], /* Low Surrogate */ + ["\uDD52", "\uDD52"], /* Low Surrogate */ + ["\uDD53", "\uDD53"], /* Low Surrogate */ + ["\uDD54", "\uDD54"], /* Low Surrogate */ + ["\uDD55", "\uDD55"], /* Low Surrogate */ + ["\uDD56", "\uDD56"], /* Low Surrogate */ + ["\uDD57", "\uDD57"], /* Low Surrogate */ + ["\uDD58", "\uDD58"], /* Low Surrogate */ + ["\uDD59", "\uDD59"], /* Low Surrogate */ + ["\uDD5A", "\uDD5A"], /* Low Surrogate */ + ["\uDD5B", "\uDD5B"], /* Low Surrogate */ + ["\uDD5C", "\uDD5C"], /* Low Surrogate */ + ["\uDD5D", "\uDD5D"], /* Low Surrogate */ + ["\uDD5E", "\uDD5E"], /* Low Surrogate */ + ["\uDD5F", "\uDD5F"], /* Low Surrogate */ + ["\uDD60", "\uDD60"], /* Low Surrogate */ + ["\uDD61", "\uDD61"], /* Low Surrogate */ + ["\uDD62", "\uDD62"], /* Low Surrogate */ + ["\uDD63", "\uDD63"], /* Low Surrogate */ + ["\uDD64", "\uDD64"], /* Low Surrogate */ + ["\uDD65", "\uDD65"], /* Low Surrogate */ + ["\uDD66", "\uDD66"], /* Low Surrogate */ + ["\uDD67", "\uDD67"], /* Low Surrogate */ + ["\uDD68", "\uDD68"], /* Low Surrogate */ + ["\uDD69", "\uDD69"], /* Low Surrogate */ + ["\uDD6A", "\uDD6A"], /* Low Surrogate */ + ["\uDD6B", "\uDD6B"], /* Low Surrogate */ + ["\uDD6C", "\uDD6C"], /* Low Surrogate */ + ["\uDD6D", "\uDD6D"], /* Low Surrogate */ + ["\uDD6E", "\uDD6E"], /* Low Surrogate */ + ["\uDD6F", "\uDD6F"], /* Low Surrogate */ + ["\uDD70", "\uDD70"], /* Low Surrogate */ + ["\uDD71", "\uDD71"], /* Low Surrogate */ + ["\uDD72", "\uDD72"], /* Low Surrogate */ + ["\uDD73", "\uDD73"], /* Low Surrogate */ + ["\uDD74", "\uDD74"], /* Low Surrogate */ + ["\uDD75", "\uDD75"], /* Low Surrogate */ + ["\uDD76", "\uDD76"], /* Low Surrogate */ + ["\uDD77", "\uDD77"], /* Low Surrogate */ + ["\uDD78", "\uDD78"], /* Low Surrogate */ + ["\uDD79", "\uDD79"], /* Low Surrogate */ + ["\uDD7A", "\uDD7A"], /* Low Surrogate */ + ["\uDD7B", "\uDD7B"], /* Low Surrogate */ + ["\uDD7C", "\uDD7C"], /* Low Surrogate */ + ["\uDD7D", "\uDD7D"], /* Low Surrogate */ + ["\uDD7E", "\uDD7E"], /* Low Surrogate */ + ["\uDD7F", "\uDD7F"], /* Low Surrogate */ + ["\uDD80", "\uDD80"], /* Low Surrogate */ + ["\uDD81", "\uDD81"], /* Low Surrogate */ + ["\uDD82", "\uDD82"], /* Low Surrogate */ + ["\uDD83", "\uDD83"], /* Low Surrogate */ + ["\uDD84", "\uDD84"], /* Low Surrogate */ + ["\uDD85", "\uDD85"], /* Low Surrogate */ + ["\uDD86", "\uDD86"], /* Low Surrogate */ + ["\uDD87", "\uDD87"], /* Low Surrogate */ + ["\uDD88", "\uDD88"], /* Low Surrogate */ + ["\uDD89", "\uDD89"], /* Low Surrogate */ + ["\uDD8A", "\uDD8A"], /* Low Surrogate */ + ["\uDD8B", "\uDD8B"], /* Low Surrogate */ + ["\uDD8C", "\uDD8C"], /* Low Surrogate */ + ["\uDD8D", "\uDD8D"], /* Low Surrogate */ + ["\uDD8E", "\uDD8E"], /* Low Surrogate */ + ["\uDD8F", "\uDD8F"], /* Low Surrogate */ + ["\uDD90", "\uDD90"], /* Low Surrogate */ + ["\uDD91", "\uDD91"], /* Low Surrogate */ + ["\uDD92", "\uDD92"], /* Low Surrogate */ + ["\uDD93", "\uDD93"], /* Low Surrogate */ + ["\uDD94", "\uDD94"], /* Low Surrogate */ + ["\uDD95", "\uDD95"], /* Low Surrogate */ + ["\uDD96", "\uDD96"], /* Low Surrogate */ + ["\uDD97", "\uDD97"], /* Low Surrogate */ + ["\uDD98", "\uDD98"], /* Low Surrogate */ + ["\uDD99", "\uDD99"], /* Low Surrogate */ + ["\uDD9A", "\uDD9A"], /* Low Surrogate */ + ["\uDD9B", "\uDD9B"], /* Low Surrogate */ + ["\uDD9C", "\uDD9C"], /* Low Surrogate */ + ["\uDD9D", "\uDD9D"], /* Low Surrogate */ + ["\uDD9E", "\uDD9E"], /* Low Surrogate */ + ["\uDD9F", "\uDD9F"], /* Low Surrogate */ + ["\uDDA0", "\uDDA0"], /* Low Surrogate */ + ["\uDDA1", "\uDDA1"], /* Low Surrogate */ + ["\uDDA2", "\uDDA2"], /* Low Surrogate */ + ["\uDDA3", "\uDDA3"], /* Low Surrogate */ + ["\uDDA4", "\uDDA4"], /* Low Surrogate */ + ["\uDDA5", "\uDDA5"], /* Low Surrogate */ + ["\uDDA6", "\uDDA6"], /* Low Surrogate */ + ["\uDDA7", "\uDDA7"], /* Low Surrogate */ + ["\uDDA8", "\uDDA8"], /* Low Surrogate */ + ["\uDDA9", "\uDDA9"], /* Low Surrogate */ + ["\uDDAA", "\uDDAA"], /* Low Surrogate */ + ["\uDDAB", "\uDDAB"], /* Low Surrogate */ + ["\uDDAC", "\uDDAC"], /* Low Surrogate */ + ["\uDDAD", "\uDDAD"], /* Low Surrogate */ + ["\uDDAE", "\uDDAE"], /* Low Surrogate */ + ["\uDDAF", "\uDDAF"], /* Low Surrogate */ + ["\uDDB0", "\uDDB0"], /* Low Surrogate */ + ["\uDDB1", "\uDDB1"], /* Low Surrogate */ + ["\uDDB2", "\uDDB2"], /* Low Surrogate */ + ["\uDDB3", "\uDDB3"], /* Low Surrogate */ + ["\uDDB4", "\uDDB4"], /* Low Surrogate */ + ["\uDDB5", "\uDDB5"], /* Low Surrogate */ + ["\uDDB6", "\uDDB6"], /* Low Surrogate */ + ["\uDDB7", "\uDDB7"], /* Low Surrogate */ + ["\uDDB8", "\uDDB8"], /* Low Surrogate */ + ["\uDDB9", "\uDDB9"], /* Low Surrogate */ + ["\uDDBA", "\uDDBA"], /* Low Surrogate */ + ["\uDDBB", "\uDDBB"], /* Low Surrogate */ + ["\uDDBC", "\uDDBC"], /* Low Surrogate */ + ["\uDDBD", "\uDDBD"], /* Low Surrogate */ + ["\uDDBE", "\uDDBE"], /* Low Surrogate */ + ["\uDDBF", "\uDDBF"], /* Low Surrogate */ + ["\uDDC0", "\uDDC0"], /* Low Surrogate */ + ["\uDDC1", "\uDDC1"], /* Low Surrogate */ + ["\uDDC2", "\uDDC2"], /* Low Surrogate */ + ["\uDDC3", "\uDDC3"], /* Low Surrogate */ + ["\uDDC4", "\uDDC4"], /* Low Surrogate */ + ["\uDDC5", "\uDDC5"], /* Low Surrogate */ + ["\uDDC6", "\uDDC6"], /* Low Surrogate */ + ["\uDDC7", "\uDDC7"], /* Low Surrogate */ + ["\uDDC8", "\uDDC8"], /* Low Surrogate */ + ["\uDDC9", "\uDDC9"], /* Low Surrogate */ + ["\uDDCA", "\uDDCA"], /* Low Surrogate */ + ["\uDDCB", "\uDDCB"], /* Low Surrogate */ + ["\uDDCC", "\uDDCC"], /* Low Surrogate */ + ["\uDDCD", "\uDDCD"], /* Low Surrogate */ + ["\uDDCE", "\uDDCE"], /* Low Surrogate */ + ["\uDDCF", "\uDDCF"], /* Low Surrogate */ + ["\uDDD0", "\uDDD0"], /* Low Surrogate */ + ["\uDDD1", "\uDDD1"], /* Low Surrogate */ + ["\uDDD2", "\uDDD2"], /* Low Surrogate */ + ["\uDDD3", "\uDDD3"], /* Low Surrogate */ + ["\uDDD4", "\uDDD4"], /* Low Surrogate */ + ["\uDDD5", "\uDDD5"], /* Low Surrogate */ + ["\uDDD6", "\uDDD6"], /* Low Surrogate */ + ["\uDDD7", "\uDDD7"], /* Low Surrogate */ + ["\uDDD8", "\uDDD8"], /* Low Surrogate */ + ["\uDDD9", "\uDDD9"], /* Low Surrogate */ + ["\uDDDA", "\uDDDA"], /* Low Surrogate */ + ["\uDDDB", "\uDDDB"], /* Low Surrogate */ + ["\uDDDC", "\uDDDC"], /* Low Surrogate */ + ["\uDDDD", "\uDDDD"], /* Low Surrogate */ + ["\uDDDE", "\uDDDE"], /* Low Surrogate */ + ["\uDDDF", "\uDDDF"], /* Low Surrogate */ + ["\uDDE0", "\uDDE0"], /* Low Surrogate */ + ["\uDDE1", "\uDDE1"], /* Low Surrogate */ + ["\uDDE2", "\uDDE2"], /* Low Surrogate */ + ["\uDDE3", "\uDDE3"], /* Low Surrogate */ + ["\uDDE4", "\uDDE4"], /* Low Surrogate */ + ["\uDDE5", "\uDDE5"], /* Low Surrogate */ + ["\uDDE6", "\uDDE6"], /* Low Surrogate */ + ["\uDDE7", "\uDDE7"], /* Low Surrogate */ + ["\uDDE8", "\uDDE8"], /* Low Surrogate */ + ["\uDDE9", "\uDDE9"], /* Low Surrogate */ + ["\uDDEA", "\uDDEA"], /* Low Surrogate */ + ["\uDDEB", "\uDDEB"], /* Low Surrogate */ + ["\uDDEC", "\uDDEC"], /* Low Surrogate */ + ["\uDDED", "\uDDED"], /* Low Surrogate */ + ["\uDDEE", "\uDDEE"], /* Low Surrogate */ + ["\uDDEF", "\uDDEF"], /* Low Surrogate */ + ["\uDDF0", "\uDDF0"], /* Low Surrogate */ + ["\uDDF1", "\uDDF1"], /* Low Surrogate */ + ["\uDDF2", "\uDDF2"], /* Low Surrogate */ + ["\uDDF3", "\uDDF3"], /* Low Surrogate */ + ["\uDDF4", "\uDDF4"], /* Low Surrogate */ + ["\uDDF5", "\uDDF5"], /* Low Surrogate */ + ["\uDDF6", "\uDDF6"], /* Low Surrogate */ + ["\uDDF7", "\uDDF7"], /* Low Surrogate */ + ["\uDDF8", "\uDDF8"], /* Low Surrogate */ + ["\uDDF9", "\uDDF9"], /* Low Surrogate */ + ["\uDDFA", "\uDDFA"], /* Low Surrogate */ + ["\uDDFB", "\uDDFB"], /* Low Surrogate */ + ["\uDDFC", "\uDDFC"], /* Low Surrogate */ + ["\uDDFD", "\uDDFD"], /* Low Surrogate */ + ["\uDDFE", "\uDDFE"], /* Low Surrogate */ + ["\uDDFF", "\uDDFF"], /* Low Surrogate */ + ["\uDE00", "\uDE00"], /* Low Surrogate */ + ["\uDE01", "\uDE01"], /* Low Surrogate */ + ["\uDE02", "\uDE02"], /* Low Surrogate */ + ["\uDE03", "\uDE03"], /* Low Surrogate */ + ["\uDE04", "\uDE04"], /* Low Surrogate */ + ["\uDE05", "\uDE05"], /* Low Surrogate */ + ["\uDE06", "\uDE06"], /* Low Surrogate */ + ["\uDE07", "\uDE07"], /* Low Surrogate */ + ["\uDE08", "\uDE08"], /* Low Surrogate */ + ["\uDE09", "\uDE09"], /* Low Surrogate */ + ["\uDE0A", "\uDE0A"], /* Low Surrogate */ + ["\uDE0B", "\uDE0B"], /* Low Surrogate */ + ["\uDE0C", "\uDE0C"], /* Low Surrogate */ + ["\uDE0D", "\uDE0D"], /* Low Surrogate */ + ["\uDE0E", "\uDE0E"], /* Low Surrogate */ + ["\uDE0F", "\uDE0F"], /* Low Surrogate */ + ["\uDE10", "\uDE10"], /* Low Surrogate */ + ["\uDE11", "\uDE11"], /* Low Surrogate */ + ["\uDE12", "\uDE12"], /* Low Surrogate */ + ["\uDE13", "\uDE13"], /* Low Surrogate */ + ["\uDE14", "\uDE14"], /* Low Surrogate */ + ["\uDE15", "\uDE15"], /* Low Surrogate */ + ["\uDE16", "\uDE16"], /* Low Surrogate */ + ["\uDE17", "\uDE17"], /* Low Surrogate */ + ["\uDE18", "\uDE18"], /* Low Surrogate */ + ["\uDE19", "\uDE19"], /* Low Surrogate */ + ["\uDE1A", "\uDE1A"], /* Low Surrogate */ + ["\uDE1B", "\uDE1B"], /* Low Surrogate */ + ["\uDE1C", "\uDE1C"], /* Low Surrogate */ + ["\uDE1D", "\uDE1D"], /* Low Surrogate */ + ["\uDE1E", "\uDE1E"], /* Low Surrogate */ + ["\uDE1F", "\uDE1F"], /* Low Surrogate */ + ["\uDE20", "\uDE20"], /* Low Surrogate */ + ["\uDE21", "\uDE21"], /* Low Surrogate */ + ["\uDE22", "\uDE22"], /* Low Surrogate */ + ["\uDE23", "\uDE23"], /* Low Surrogate */ + ["\uDE24", "\uDE24"], /* Low Surrogate */ + ["\uDE25", "\uDE25"], /* Low Surrogate */ + ["\uDE26", "\uDE26"], /* Low Surrogate */ + ["\uDE27", "\uDE27"], /* Low Surrogate */ + ["\uDE28", "\uDE28"], /* Low Surrogate */ + ["\uDE29", "\uDE29"], /* Low Surrogate */ + ["\uDE2A", "\uDE2A"], /* Low Surrogate */ + ["\uDE2B", "\uDE2B"], /* Low Surrogate */ + ["\uDE2C", "\uDE2C"], /* Low Surrogate */ + ["\uDE2D", "\uDE2D"], /* Low Surrogate */ + ["\uDE2E", "\uDE2E"], /* Low Surrogate */ + ["\uDE2F", "\uDE2F"], /* Low Surrogate */ + ["\uDE30", "\uDE30"], /* Low Surrogate */ + ["\uDE31", "\uDE31"], /* Low Surrogate */ + ["\uDE32", "\uDE32"], /* Low Surrogate */ + ["\uDE33", "\uDE33"], /* Low Surrogate */ + ["\uDE34", "\uDE34"], /* Low Surrogate */ + ["\uDE35", "\uDE35"], /* Low Surrogate */ + ["\uDE36", "\uDE36"], /* Low Surrogate */ + ["\uDE37", "\uDE37"], /* Low Surrogate */ + ["\uDE38", "\uDE38"], /* Low Surrogate */ + ["\uDE39", "\uDE39"], /* Low Surrogate */ + ["\uDE3A", "\uDE3A"], /* Low Surrogate */ + ["\uDE3B", "\uDE3B"], /* Low Surrogate */ + ["\uDE3C", "\uDE3C"], /* Low Surrogate */ + ["\uDE3D", "\uDE3D"], /* Low Surrogate */ + ["\uDE3E", "\uDE3E"], /* Low Surrogate */ + ["\uDE3F", "\uDE3F"], /* Low Surrogate */ + ["\uDE40", "\uDE40"], /* Low Surrogate */ + ["\uDE41", "\uDE41"], /* Low Surrogate */ + ["\uDE42", "\uDE42"], /* Low Surrogate */ + ["\uDE43", "\uDE43"], /* Low Surrogate */ + ["\uDE44", "\uDE44"], /* Low Surrogate */ + ["\uDE45", "\uDE45"], /* Low Surrogate */ + ["\uDE46", "\uDE46"], /* Low Surrogate */ + ["\uDE47", "\uDE47"], /* Low Surrogate */ + ["\uDE48", "\uDE48"], /* Low Surrogate */ + ["\uDE49", "\uDE49"], /* Low Surrogate */ + ["\uDE4A", "\uDE4A"], /* Low Surrogate */ + ["\uDE4B", "\uDE4B"], /* Low Surrogate */ + ["\uDE4C", "\uDE4C"], /* Low Surrogate */ + ["\uDE4D", "\uDE4D"], /* Low Surrogate */ + ["\uDE4E", "\uDE4E"], /* Low Surrogate */ + ["\uDE4F", "\uDE4F"], /* Low Surrogate */ + ["\uDE50", "\uDE50"], /* Low Surrogate */ + ["\uDE51", "\uDE51"], /* Low Surrogate */ + ["\uDE52", "\uDE52"], /* Low Surrogate */ + ["\uDE53", "\uDE53"], /* Low Surrogate */ + ["\uDE54", "\uDE54"], /* Low Surrogate */ + ["\uDE55", "\uDE55"], /* Low Surrogate */ + ["\uDE56", "\uDE56"], /* Low Surrogate */ + ["\uDE57", "\uDE57"], /* Low Surrogate */ + ["\uDE58", "\uDE58"], /* Low Surrogate */ + ["\uDE59", "\uDE59"], /* Low Surrogate */ + ["\uDE5A", "\uDE5A"], /* Low Surrogate */ + ["\uDE5B", "\uDE5B"], /* Low Surrogate */ + ["\uDE5C", "\uDE5C"], /* Low Surrogate */ + ["\uDE5D", "\uDE5D"], /* Low Surrogate */ + ["\uDE5E", "\uDE5E"], /* Low Surrogate */ + ["\uDE5F", "\uDE5F"], /* Low Surrogate */ + ["\uDE60", "\uDE60"], /* Low Surrogate */ + ["\uDE61", "\uDE61"], /* Low Surrogate */ + ["\uDE62", "\uDE62"], /* Low Surrogate */ + ["\uDE63", "\uDE63"], /* Low Surrogate */ + ["\uDE64", "\uDE64"], /* Low Surrogate */ + ["\uDE65", "\uDE65"], /* Low Surrogate */ + ["\uDE66", "\uDE66"], /* Low Surrogate */ + ["\uDE67", "\uDE67"], /* Low Surrogate */ + ["\uDE68", "\uDE68"], /* Low Surrogate */ + ["\uDE69", "\uDE69"], /* Low Surrogate */ + ["\uDE6A", "\uDE6A"], /* Low Surrogate */ + ["\uDE6B", "\uDE6B"], /* Low Surrogate */ + ["\uDE6C", "\uDE6C"], /* Low Surrogate */ + ["\uDE6D", "\uDE6D"], /* Low Surrogate */ + ["\uDE6E", "\uDE6E"], /* Low Surrogate */ + ["\uDE6F", "\uDE6F"], /* Low Surrogate */ + ["\uDE70", "\uDE70"], /* Low Surrogate */ + ["\uDE71", "\uDE71"], /* Low Surrogate */ + ["\uDE72", "\uDE72"], /* Low Surrogate */ + ["\uDE73", "\uDE73"], /* Low Surrogate */ + ["\uDE74", "\uDE74"], /* Low Surrogate */ + ["\uDE75", "\uDE75"], /* Low Surrogate */ + ["\uDE76", "\uDE76"], /* Low Surrogate */ + ["\uDE77", "\uDE77"], /* Low Surrogate */ + ["\uDE78", "\uDE78"], /* Low Surrogate */ + ["\uDE79", "\uDE79"], /* Low Surrogate */ + ["\uDE7A", "\uDE7A"], /* Low Surrogate */ + ["\uDE7B", "\uDE7B"], /* Low Surrogate */ + ["\uDE7C", "\uDE7C"], /* Low Surrogate */ + ["\uDE7D", "\uDE7D"], /* Low Surrogate */ + ["\uDE7E", "\uDE7E"], /* Low Surrogate */ + ["\uDE7F", "\uDE7F"], /* Low Surrogate */ + ["\uDE80", "\uDE80"], /* Low Surrogate */ + ["\uDE81", "\uDE81"], /* Low Surrogate */ + ["\uDE82", "\uDE82"], /* Low Surrogate */ + ["\uDE83", "\uDE83"], /* Low Surrogate */ + ["\uDE84", "\uDE84"], /* Low Surrogate */ + ["\uDE85", "\uDE85"], /* Low Surrogate */ + ["\uDE86", "\uDE86"], /* Low Surrogate */ + ["\uDE87", "\uDE87"], /* Low Surrogate */ + ["\uDE88", "\uDE88"], /* Low Surrogate */ + ["\uDE89", "\uDE89"], /* Low Surrogate */ + ["\uDE8A", "\uDE8A"], /* Low Surrogate */ + ["\uDE8B", "\uDE8B"], /* Low Surrogate */ + ["\uDE8C", "\uDE8C"], /* Low Surrogate */ + ["\uDE8D", "\uDE8D"], /* Low Surrogate */ + ["\uDE8E", "\uDE8E"], /* Low Surrogate */ + ["\uDE8F", "\uDE8F"], /* Low Surrogate */ + ["\uDE90", "\uDE90"], /* Low Surrogate */ + ["\uDE91", "\uDE91"], /* Low Surrogate */ + ["\uDE92", "\uDE92"], /* Low Surrogate */ + ["\uDE93", "\uDE93"], /* Low Surrogate */ + ["\uDE94", "\uDE94"], /* Low Surrogate */ + ["\uDE95", "\uDE95"], /* Low Surrogate */ + ["\uDE96", "\uDE96"], /* Low Surrogate */ + ["\uDE97", "\uDE97"], /* Low Surrogate */ + ["\uDE98", "\uDE98"], /* Low Surrogate */ + ["\uDE99", "\uDE99"], /* Low Surrogate */ + ["\uDE9A", "\uDE9A"], /* Low Surrogate */ + ["\uDE9B", "\uDE9B"], /* Low Surrogate */ + ["\uDE9C", "\uDE9C"], /* Low Surrogate */ + ["\uDE9D", "\uDE9D"], /* Low Surrogate */ + ["\uDE9E", "\uDE9E"], /* Low Surrogate */ + ["\uDE9F", "\uDE9F"], /* Low Surrogate */ + ["\uDEA0", "\uDEA0"], /* Low Surrogate */ + ["\uDEA1", "\uDEA1"], /* Low Surrogate */ + ["\uDEA2", "\uDEA2"], /* Low Surrogate */ + ["\uDEA3", "\uDEA3"], /* Low Surrogate */ + ["\uDEA4", "\uDEA4"], /* Low Surrogate */ + ["\uDEA5", "\uDEA5"], /* Low Surrogate */ + ["\uDEA6", "\uDEA6"], /* Low Surrogate */ + ["\uDEA7", "\uDEA7"], /* Low Surrogate */ + ["\uDEA8", "\uDEA8"], /* Low Surrogate */ + ["\uDEA9", "\uDEA9"], /* Low Surrogate */ + ["\uDEAA", "\uDEAA"], /* Low Surrogate */ + ["\uDEAB", "\uDEAB"], /* Low Surrogate */ + ["\uDEAC", "\uDEAC"], /* Low Surrogate */ + ["\uDEAD", "\uDEAD"], /* Low Surrogate */ + ["\uDEAE", "\uDEAE"], /* Low Surrogate */ + ["\uDEAF", "\uDEAF"], /* Low Surrogate */ + ["\uDEB0", "\uDEB0"], /* Low Surrogate */ + ["\uDEB1", "\uDEB1"], /* Low Surrogate */ + ["\uDEB2", "\uDEB2"], /* Low Surrogate */ + ["\uDEB3", "\uDEB3"], /* Low Surrogate */ + ["\uDEB4", "\uDEB4"], /* Low Surrogate */ + ["\uDEB5", "\uDEB5"], /* Low Surrogate */ + ["\uDEB6", "\uDEB6"], /* Low Surrogate */ + ["\uDEB7", "\uDEB7"], /* Low Surrogate */ + ["\uDEB8", "\uDEB8"], /* Low Surrogate */ + ["\uDEB9", "\uDEB9"], /* Low Surrogate */ + ["\uDEBA", "\uDEBA"], /* Low Surrogate */ + ["\uDEBB", "\uDEBB"], /* Low Surrogate */ + ["\uDEBC", "\uDEBC"], /* Low Surrogate */ + ["\uDEBD", "\uDEBD"], /* Low Surrogate */ + ["\uDEBE", "\uDEBE"], /* Low Surrogate */ + ["\uDEBF", "\uDEBF"], /* Low Surrogate */ + ["\uDEC0", "\uDEC0"], /* Low Surrogate */ + ["\uDEC1", "\uDEC1"], /* Low Surrogate */ + ["\uDEC2", "\uDEC2"], /* Low Surrogate */ + ["\uDEC3", "\uDEC3"], /* Low Surrogate */ + ["\uDEC4", "\uDEC4"], /* Low Surrogate */ + ["\uDEC5", "\uDEC5"], /* Low Surrogate */ + ["\uDEC6", "\uDEC6"], /* Low Surrogate */ + ["\uDEC7", "\uDEC7"], /* Low Surrogate */ + ["\uDEC8", "\uDEC8"], /* Low Surrogate */ + ["\uDEC9", "\uDEC9"], /* Low Surrogate */ + ["\uDECA", "\uDECA"], /* Low Surrogate */ + ["\uDECB", "\uDECB"], /* Low Surrogate */ + ["\uDECC", "\uDECC"], /* Low Surrogate */ + ["\uDECD", "\uDECD"], /* Low Surrogate */ + ["\uDECE", "\uDECE"], /* Low Surrogate */ + ["\uDECF", "\uDECF"], /* Low Surrogate */ + ["\uDED0", "\uDED0"], /* Low Surrogate */ + ["\uDED1", "\uDED1"], /* Low Surrogate */ + ["\uDED2", "\uDED2"], /* Low Surrogate */ + ["\uDED3", "\uDED3"], /* Low Surrogate */ + ["\uDED4", "\uDED4"], /* Low Surrogate */ + ["\uDED5", "\uDED5"], /* Low Surrogate */ + ["\uDED6", "\uDED6"], /* Low Surrogate */ + ["\uDED7", "\uDED7"], /* Low Surrogate */ + ["\uDED8", "\uDED8"], /* Low Surrogate */ + ["\uDED9", "\uDED9"], /* Low Surrogate */ + ["\uDEDA", "\uDEDA"], /* Low Surrogate */ + ["\uDEDB", "\uDEDB"], /* Low Surrogate */ + ["\uDEDC", "\uDEDC"], /* Low Surrogate */ + ["\uDEDD", "\uDEDD"], /* Low Surrogate */ + ["\uDEDE", "\uDEDE"], /* Low Surrogate */ + ["\uDEDF", "\uDEDF"], /* Low Surrogate */ + ["\uDEE0", "\uDEE0"], /* Low Surrogate */ + ["\uDEE1", "\uDEE1"], /* Low Surrogate */ + ["\uDEE2", "\uDEE2"], /* Low Surrogate */ + ["\uDEE3", "\uDEE3"], /* Low Surrogate */ + ["\uDEE4", "\uDEE4"], /* Low Surrogate */ + ["\uDEE5", "\uDEE5"], /* Low Surrogate */ + ["\uDEE6", "\uDEE6"], /* Low Surrogate */ + ["\uDEE7", "\uDEE7"], /* Low Surrogate */ + ["\uDEE8", "\uDEE8"], /* Low Surrogate */ + ["\uDEE9", "\uDEE9"], /* Low Surrogate */ + ["\uDEEA", "\uDEEA"], /* Low Surrogate */ + ["\uDEEB", "\uDEEB"], /* Low Surrogate */ + ["\uDEEC", "\uDEEC"], /* Low Surrogate */ + ["\uDEED", "\uDEED"], /* Low Surrogate */ + ["\uDEEE", "\uDEEE"], /* Low Surrogate */ + ["\uDEEF", "\uDEEF"], /* Low Surrogate */ + ["\uDEF0", "\uDEF0"], /* Low Surrogate */ + ["\uDEF1", "\uDEF1"], /* Low Surrogate */ + ["\uDEF2", "\uDEF2"], /* Low Surrogate */ + ["\uDEF3", "\uDEF3"], /* Low Surrogate */ + ["\uDEF4", "\uDEF4"], /* Low Surrogate */ + ["\uDEF5", "\uDEF5"], /* Low Surrogate */ + ["\uDEF6", "\uDEF6"], /* Low Surrogate */ + ["\uDEF7", "\uDEF7"], /* Low Surrogate */ + ["\uDEF8", "\uDEF8"], /* Low Surrogate */ + ["\uDEF9", "\uDEF9"], /* Low Surrogate */ + ["\uDEFA", "\uDEFA"], /* Low Surrogate */ + ["\uDEFB", "\uDEFB"], /* Low Surrogate */ + ["\uDEFC", "\uDEFC"], /* Low Surrogate */ + ["\uDEFD", "\uDEFD"], /* Low Surrogate */ + ["\uDEFE", "\uDEFE"], /* Low Surrogate */ + ["\uDEFF", "\uDEFF"], /* Low Surrogate */ + ["\uDF00", "\uDF00"], /* Low Surrogate */ + ["\uDF01", "\uDF01"], /* Low Surrogate */ + ["\uDF02", "\uDF02"], /* Low Surrogate */ + ["\uDF03", "\uDF03"], /* Low Surrogate */ + ["\uDF04", "\uDF04"], /* Low Surrogate */ + ["\uDF05", "\uDF05"], /* Low Surrogate */ + ["\uDF06", "\uDF06"], /* Low Surrogate */ + ["\uDF07", "\uDF07"], /* Low Surrogate */ + ["\uDF08", "\uDF08"], /* Low Surrogate */ + ["\uDF09", "\uDF09"], /* Low Surrogate */ + ["\uDF0A", "\uDF0A"], /* Low Surrogate */ + ["\uDF0B", "\uDF0B"], /* Low Surrogate */ + ["\uDF0C", "\uDF0C"], /* Low Surrogate */ + ["\uDF0D", "\uDF0D"], /* Low Surrogate */ + ["\uDF0E", "\uDF0E"], /* Low Surrogate */ + ["\uDF0F", "\uDF0F"], /* Low Surrogate */ + ["\uDF10", "\uDF10"], /* Low Surrogate */ + ["\uDF11", "\uDF11"], /* Low Surrogate */ + ["\uDF12", "\uDF12"], /* Low Surrogate */ + ["\uDF13", "\uDF13"], /* Low Surrogate */ + ["\uDF14", "\uDF14"], /* Low Surrogate */ + ["\uDF15", "\uDF15"], /* Low Surrogate */ + ["\uDF16", "\uDF16"], /* Low Surrogate */ + ["\uDF17", "\uDF17"], /* Low Surrogate */ + ["\uDF18", "\uDF18"], /* Low Surrogate */ + ["\uDF19", "\uDF19"], /* Low Surrogate */ + ["\uDF1A", "\uDF1A"], /* Low Surrogate */ + ["\uDF1B", "\uDF1B"], /* Low Surrogate */ + ["\uDF1C", "\uDF1C"], /* Low Surrogate */ + ["\uDF1D", "\uDF1D"], /* Low Surrogate */ + ["\uDF1E", "\uDF1E"], /* Low Surrogate */ + ["\uDF1F", "\uDF1F"], /* Low Surrogate */ + ["\uDF20", "\uDF20"], /* Low Surrogate */ + ["\uDF21", "\uDF21"], /* Low Surrogate */ + ["\uDF22", "\uDF22"], /* Low Surrogate */ + ["\uDF23", "\uDF23"], /* Low Surrogate */ + ["\uDF24", "\uDF24"], /* Low Surrogate */ + ["\uDF25", "\uDF25"], /* Low Surrogate */ + ["\uDF26", "\uDF26"], /* Low Surrogate */ + ["\uDF27", "\uDF27"], /* Low Surrogate */ + ["\uDF28", "\uDF28"], /* Low Surrogate */ + ["\uDF29", "\uDF29"], /* Low Surrogate */ + ["\uDF2A", "\uDF2A"], /* Low Surrogate */ + ["\uDF2B", "\uDF2B"], /* Low Surrogate */ + ["\uDF2C", "\uDF2C"], /* Low Surrogate */ + ["\uDF2D", "\uDF2D"], /* Low Surrogate */ + ["\uDF2E", "\uDF2E"], /* Low Surrogate */ + ["\uDF2F", "\uDF2F"], /* Low Surrogate */ + ["\uDF30", "\uDF30"], /* Low Surrogate */ + ["\uDF31", "\uDF31"], /* Low Surrogate */ + ["\uDF32", "\uDF32"], /* Low Surrogate */ + ["\uDF33", "\uDF33"], /* Low Surrogate */ + ["\uDF34", "\uDF34"], /* Low Surrogate */ + ["\uDF35", "\uDF35"], /* Low Surrogate */ + ["\uDF36", "\uDF36"], /* Low Surrogate */ + ["\uDF37", "\uDF37"], /* Low Surrogate */ + ["\uDF38", "\uDF38"], /* Low Surrogate */ + ["\uDF39", "\uDF39"], /* Low Surrogate */ + ["\uDF3A", "\uDF3A"], /* Low Surrogate */ + ["\uDF3B", "\uDF3B"], /* Low Surrogate */ + ["\uDF3C", "\uDF3C"], /* Low Surrogate */ + ["\uDF3D", "\uDF3D"], /* Low Surrogate */ + ["\uDF3E", "\uDF3E"], /* Low Surrogate */ + ["\uDF3F", "\uDF3F"], /* Low Surrogate */ + ["\uDF40", "\uDF40"], /* Low Surrogate */ + ["\uDF41", "\uDF41"], /* Low Surrogate */ + ["\uDF42", "\uDF42"], /* Low Surrogate */ + ["\uDF43", "\uDF43"], /* Low Surrogate */ + ["\uDF44", "\uDF44"], /* Low Surrogate */ + ["\uDF45", "\uDF45"], /* Low Surrogate */ + ["\uDF46", "\uDF46"], /* Low Surrogate */ + ["\uDF47", "\uDF47"], /* Low Surrogate */ + ["\uDF48", "\uDF48"], /* Low Surrogate */ + ["\uDF49", "\uDF49"], /* Low Surrogate */ + ["\uDF4A", "\uDF4A"], /* Low Surrogate */ + ["\uDF4B", "\uDF4B"], /* Low Surrogate */ + ["\uDF4C", "\uDF4C"], /* Low Surrogate */ + ["\uDF4D", "\uDF4D"], /* Low Surrogate */ + ["\uDF4E", "\uDF4E"], /* Low Surrogate */ + ["\uDF4F", "\uDF4F"], /* Low Surrogate */ + ["\uDF50", "\uDF50"], /* Low Surrogate */ + ["\uDF51", "\uDF51"], /* Low Surrogate */ + ["\uDF52", "\uDF52"], /* Low Surrogate */ + ["\uDF53", "\uDF53"], /* Low Surrogate */ + ["\uDF54", "\uDF54"], /* Low Surrogate */ + ["\uDF55", "\uDF55"], /* Low Surrogate */ + ["\uDF56", "\uDF56"], /* Low Surrogate */ + ["\uDF57", "\uDF57"], /* Low Surrogate */ + ["\uDF58", "\uDF58"], /* Low Surrogate */ + ["\uDF59", "\uDF59"], /* Low Surrogate */ + ["\uDF5A", "\uDF5A"], /* Low Surrogate */ + ["\uDF5B", "\uDF5B"], /* Low Surrogate */ + ["\uDF5C", "\uDF5C"], /* Low Surrogate */ + ["\uDF5D", "\uDF5D"], /* Low Surrogate */ + ["\uDF5E", "\uDF5E"], /* Low Surrogate */ + ["\uDF5F", "\uDF5F"], /* Low Surrogate */ + ["\uDF60", "\uDF60"], /* Low Surrogate */ + ["\uDF61", "\uDF61"], /* Low Surrogate */ + ["\uDF62", "\uDF62"], /* Low Surrogate */ + ["\uDF63", "\uDF63"], /* Low Surrogate */ + ["\uDF64", "\uDF64"], /* Low Surrogate */ + ["\uDF65", "\uDF65"], /* Low Surrogate */ + ["\uDF66", "\uDF66"], /* Low Surrogate */ + ["\uDF67", "\uDF67"], /* Low Surrogate */ + ["\uDF68", "\uDF68"], /* Low Surrogate */ + ["\uDF69", "\uDF69"], /* Low Surrogate */ + ["\uDF6A", "\uDF6A"], /* Low Surrogate */ + ["\uDF6B", "\uDF6B"], /* Low Surrogate */ + ["\uDF6C", "\uDF6C"], /* Low Surrogate */ + ["\uDF6D", "\uDF6D"], /* Low Surrogate */ + ["\uDF6E", "\uDF6E"], /* Low Surrogate */ + ["\uDF6F", "\uDF6F"], /* Low Surrogate */ + ["\uDF70", "\uDF70"], /* Low Surrogate */ + ["\uDF71", "\uDF71"], /* Low Surrogate */ + ["\uDF72", "\uDF72"], /* Low Surrogate */ + ["\uDF73", "\uDF73"], /* Low Surrogate */ + ["\uDF74", "\uDF74"], /* Low Surrogate */ + ["\uDF75", "\uDF75"], /* Low Surrogate */ + ["\uDF76", "\uDF76"], /* Low Surrogate */ + ["\uDF77", "\uDF77"], /* Low Surrogate */ + ["\uDF78", "\uDF78"], /* Low Surrogate */ + ["\uDF79", "\uDF79"], /* Low Surrogate */ + ["\uDF7A", "\uDF7A"], /* Low Surrogate */ + ["\uDF7B", "\uDF7B"], /* Low Surrogate */ + ["\uDF7C", "\uDF7C"], /* Low Surrogate */ + ["\uDF7D", "\uDF7D"], /* Low Surrogate */ + ["\uDF7E", "\uDF7E"], /* Low Surrogate */ + ["\uDF7F", "\uDF7F"], /* Low Surrogate */ + ["\uDF80", "\uDF80"], /* Low Surrogate */ + ["\uDF81", "\uDF81"], /* Low Surrogate */ + ["\uDF82", "\uDF82"], /* Low Surrogate */ + ["\uDF83", "\uDF83"], /* Low Surrogate */ + ["\uDF84", "\uDF84"], /* Low Surrogate */ + ["\uDF85", "\uDF85"], /* Low Surrogate */ + ["\uDF86", "\uDF86"], /* Low Surrogate */ + ["\uDF87", "\uDF87"], /* Low Surrogate */ + ["\uDF88", "\uDF88"], /* Low Surrogate */ + ["\uDF89", "\uDF89"], /* Low Surrogate */ + ["\uDF8A", "\uDF8A"], /* Low Surrogate */ + ["\uDF8B", "\uDF8B"], /* Low Surrogate */ + ["\uDF8C", "\uDF8C"], /* Low Surrogate */ + ["\uDF8D", "\uDF8D"], /* Low Surrogate */ + ["\uDF8E", "\uDF8E"], /* Low Surrogate */ + ["\uDF8F", "\uDF8F"], /* Low Surrogate */ + ["\uDF90", "\uDF90"], /* Low Surrogate */ + ["\uDF91", "\uDF91"], /* Low Surrogate */ + ["\uDF92", "\uDF92"], /* Low Surrogate */ + ["\uDF93", "\uDF93"], /* Low Surrogate */ + ["\uDF94", "\uDF94"], /* Low Surrogate */ + ["\uDF95", "\uDF95"], /* Low Surrogate */ + ["\uDF96", "\uDF96"], /* Low Surrogate */ + ["\uDF97", "\uDF97"], /* Low Surrogate */ + ["\uDF98", "\uDF98"], /* Low Surrogate */ + ["\uDF99", "\uDF99"], /* Low Surrogate */ + ["\uDF9A", "\uDF9A"], /* Low Surrogate */ + ["\uDF9B", "\uDF9B"], /* Low Surrogate */ + ["\uDF9C", "\uDF9C"], /* Low Surrogate */ + ["\uDF9D", "\uDF9D"], /* Low Surrogate */ + ["\uDF9E", "\uDF9E"], /* Low Surrogate */ + ["\uDF9F", "\uDF9F"], /* Low Surrogate */ + ["\uDFA0", "\uDFA0"], /* Low Surrogate */ + ["\uDFA1", "\uDFA1"], /* Low Surrogate */ + ["\uDFA2", "\uDFA2"], /* Low Surrogate */ + ["\uDFA3", "\uDFA3"], /* Low Surrogate */ + ["\uDFA4", "\uDFA4"], /* Low Surrogate */ + ["\uDFA5", "\uDFA5"], /* Low Surrogate */ + ["\uDFA6", "\uDFA6"], /* Low Surrogate */ + ["\uDFA7", "\uDFA7"], /* Low Surrogate */ + ["\uDFA8", "\uDFA8"], /* Low Surrogate */ + ["\uDFA9", "\uDFA9"], /* Low Surrogate */ + ["\uDFAA", "\uDFAA"], /* Low Surrogate */ + ["\uDFAB", "\uDFAB"], /* Low Surrogate */ + ["\uDFAC", "\uDFAC"], /* Low Surrogate */ + ["\uDFAD", "\uDFAD"], /* Low Surrogate */ + ["\uDFAE", "\uDFAE"], /* Low Surrogate */ + ["\uDFAF", "\uDFAF"], /* Low Surrogate */ + ["\uDFB0", "\uDFB0"], /* Low Surrogate */ + ["\uDFB1", "\uDFB1"], /* Low Surrogate */ + ["\uDFB2", "\uDFB2"], /* Low Surrogate */ + ["\uDFB3", "\uDFB3"], /* Low Surrogate */ + ["\uDFB4", "\uDFB4"], /* Low Surrogate */ + ["\uDFB5", "\uDFB5"], /* Low Surrogate */ + ["\uDFB6", "\uDFB6"], /* Low Surrogate */ + ["\uDFB7", "\uDFB7"], /* Low Surrogate */ + ["\uDFB8", "\uDFB8"], /* Low Surrogate */ + ["\uDFB9", "\uDFB9"], /* Low Surrogate */ + ["\uDFBA", "\uDFBA"], /* Low Surrogate */ + ["\uDFBB", "\uDFBB"], /* Low Surrogate */ + ["\uDFBC", "\uDFBC"], /* Low Surrogate */ + ["\uDFBD", "\uDFBD"], /* Low Surrogate */ + ["\uDFBE", "\uDFBE"], /* Low Surrogate */ + ["\uDFBF", "\uDFBF"], /* Low Surrogate */ + ["\uDFC0", "\uDFC0"], /* Low Surrogate */ + ["\uDFC1", "\uDFC1"], /* Low Surrogate */ + ["\uDFC2", "\uDFC2"], /* Low Surrogate */ + ["\uDFC3", "\uDFC3"], /* Low Surrogate */ + ["\uDFC4", "\uDFC4"], /* Low Surrogate */ + ["\uDFC5", "\uDFC5"], /* Low Surrogate */ + ["\uDFC6", "\uDFC6"], /* Low Surrogate */ + ["\uDFC7", "\uDFC7"], /* Low Surrogate */ + ["\uDFC8", "\uDFC8"], /* Low Surrogate */ + ["\uDFC9", "\uDFC9"], /* Low Surrogate */ + ["\uDFCA", "\uDFCA"], /* Low Surrogate */ + ["\uDFCB", "\uDFCB"], /* Low Surrogate */ + ["\uDFCC", "\uDFCC"], /* Low Surrogate */ + ["\uDFCD", "\uDFCD"], /* Low Surrogate */ + ["\uDFCE", "\uDFCE"], /* Low Surrogate */ + ["\uDFCF", "\uDFCF"], /* Low Surrogate */ + ["\uDFD0", "\uDFD0"], /* Low Surrogate */ + ["\uDFD1", "\uDFD1"], /* Low Surrogate */ + ["\uDFD2", "\uDFD2"], /* Low Surrogate */ + ["\uDFD3", "\uDFD3"], /* Low Surrogate */ + ["\uDFD4", "\uDFD4"], /* Low Surrogate */ + ["\uDFD5", "\uDFD5"], /* Low Surrogate */ + ["\uDFD6", "\uDFD6"], /* Low Surrogate */ + ["\uDFD7", "\uDFD7"], /* Low Surrogate */ + ["\uDFD8", "\uDFD8"], /* Low Surrogate */ + ["\uDFD9", "\uDFD9"], /* Low Surrogate */ + ["\uDFDA", "\uDFDA"], /* Low Surrogate */ + ["\uDFDB", "\uDFDB"], /* Low Surrogate */ + ["\uDFDC", "\uDFDC"], /* Low Surrogate */ + ["\uDFDD", "\uDFDD"], /* Low Surrogate */ + ["\uDFDE", "\uDFDE"], /* Low Surrogate */ + ["\uDFDF", "\uDFDF"], /* Low Surrogate */ + ["\uDFE0", "\uDFE0"], /* Low Surrogate */ + ["\uDFE1", "\uDFE1"], /* Low Surrogate */ + ["\uDFE2", "\uDFE2"], /* Low Surrogate */ + ["\uDFE3", "\uDFE3"], /* Low Surrogate */ + ["\uDFE4", "\uDFE4"], /* Low Surrogate */ + ["\uDFE5", "\uDFE5"], /* Low Surrogate */ + ["\uDFE6", "\uDFE6"], /* Low Surrogate */ + ["\uDFE7", "\uDFE7"], /* Low Surrogate */ + ["\uDFE8", "\uDFE8"], /* Low Surrogate */ + ["\uDFE9", "\uDFE9"], /* Low Surrogate */ + ["\uDFEA", "\uDFEA"], /* Low Surrogate */ + ["\uDFEB", "\uDFEB"], /* Low Surrogate */ + ["\uDFEC", "\uDFEC"], /* Low Surrogate */ + ["\uDFED", "\uDFED"], /* Low Surrogate */ + ["\uDFEE", "\uDFEE"], /* Low Surrogate */ + ["\uDFEF", "\uDFEF"], /* Low Surrogate */ + ["\uDFF0", "\uDFF0"], /* Low Surrogate */ + ["\uDFF1", "\uDFF1"], /* Low Surrogate */ + ["\uDFF2", "\uDFF2"], /* Low Surrogate */ + ["\uDFF3", "\uDFF3"], /* Low Surrogate */ + ["\uDFF4", "\uDFF4"], /* Low Surrogate */ + ["\uDFF5", "\uDFF5"], /* Low Surrogate */ + ["\uDFF6", "\uDFF6"], /* Low Surrogate */ + ["\uDFF7", "\uDFF7"], /* Low Surrogate */ + ["\uDFF8", "\uDFF8"], /* Low Surrogate */ + ["\uDFF9", "\uDFF9"], /* Low Surrogate */ + ["\uDFFA", "\uDFFA"], /* Low Surrogate */ + ["\uDFFB", "\uDFFB"], /* Low Surrogate */ + ["\uDFFC", "\uDFFC"], /* Low Surrogate */ + ["\uDFFD", "\uDFFD"], /* Low Surrogate */ + ["\uDFFE", "\uDFFE"], /* Low Surrogate */ + ["\uDFFF", "\uDFFF"], /* Low Surrogate */ + ["\uE000", "\uE000"], /* Private Use */ + ["\uE001", "\uE001"], /* Private Use */ + ["\uE002", "\uE002"], /* Private Use */ + ["\uE003", "\uE003"], /* Private Use */ + ["\uE004", "\uE004"], /* Private Use */ + ["\uE005", "\uE005"], /* Private Use */ + ["\uE006", "\uE006"], /* Private Use */ + ["\uE007", "\uE007"], /* Private Use */ + ["\uE008", "\uE008"], /* Private Use */ + ["\uE009", "\uE009"], /* Private Use */ + ["\uE00A", "\uE00A"], /* Private Use */ + ["\uE00B", "\uE00B"], /* Private Use */ + ["\uE00C", "\uE00C"], /* Private Use */ + ["\uE00D", "\uE00D"], /* Private Use */ + ["\uE00E", "\uE00E"], /* Private Use */ + ["\uE00F", "\uE00F"], /* Private Use */ + ["\uE010", "\uE010"], /* Private Use */ + ["\uE011", "\uE011"], /* Private Use */ + ["\uE012", "\uE012"], /* Private Use */ + ["\uE013", "\uE013"], /* Private Use */ + ["\uE014", "\uE014"], /* Private Use */ + ["\uE015", "\uE015"], /* Private Use */ + ["\uE016", "\uE016"], /* Private Use */ + ["\uE017", "\uE017"], /* Private Use */ + ["\uE018", "\uE018"], /* Private Use */ + ["\uE019", "\uE019"], /* Private Use */ + ["\uE01A", "\uE01A"], /* Private Use */ + ["\uE01B", "\uE01B"], /* Private Use */ + ["\uE01C", "\uE01C"], /* Private Use */ + ["\uE01D", "\uE01D"], /* Private Use */ + ["\uE01E", "\uE01E"], /* Private Use */ + ["\uE01F", "\uE01F"], /* Private Use */ + ["\uE020", "\uE020"], /* Private Use */ + ["\uE021", "\uE021"], /* Private Use */ + ["\uE022", "\uE022"], /* Private Use */ + ["\uE023", "\uE023"], /* Private Use */ + ["\uE024", "\uE024"], /* Private Use */ + ["\uE025", "\uE025"], /* Private Use */ + ["\uE026", "\uE026"], /* Private Use */ + ["\uE027", "\uE027"], /* Private Use */ + ["\uE028", "\uE028"], /* Private Use */ + ["\uE029", "\uE029"], /* Private Use */ + ["\uE02A", "\uE02A"], /* Private Use */ + ["\uE02B", "\uE02B"], /* Private Use */ + ["\uE02C", "\uE02C"], /* Private Use */ + ["\uE02D", "\uE02D"], /* Private Use */ + ["\uE02E", "\uE02E"], /* Private Use */ + ["\uE02F", "\uE02F"], /* Private Use */ + ["\uE030", "\uE030"], /* Private Use */ + ["\uE031", "\uE031"], /* Private Use */ + ["\uE032", "\uE032"], /* Private Use */ + ["\uE033", "\uE033"], /* Private Use */ + ["\uE034", "\uE034"], /* Private Use */ + ["\uE035", "\uE035"], /* Private Use */ + ["\uE036", "\uE036"], /* Private Use */ + ["\uE037", "\uE037"], /* Private Use */ + ["\uE038", "\uE038"], /* Private Use */ + ["\uE039", "\uE039"], /* Private Use */ + ["\uE03A", "\uE03A"], /* Private Use */ + ["\uE03B", "\uE03B"], /* Private Use */ + ["\uE03C", "\uE03C"], /* Private Use */ + ["\uE03D", "\uE03D"], /* Private Use */ + ["\uE03E", "\uE03E"], /* Private Use */ + ["\uE03F", "\uE03F"], /* Private Use */ + ["\uE040", "\uE040"], /* Private Use */ + ["\uE041", "\uE041"], /* Private Use */ + ["\uE042", "\uE042"], /* Private Use */ + ["\uE043", "\uE043"], /* Private Use */ + ["\uE044", "\uE044"], /* Private Use */ + ["\uE045", "\uE045"], /* Private Use */ + ["\uE046", "\uE046"], /* Private Use */ + ["\uE047", "\uE047"], /* Private Use */ + ["\uE048", "\uE048"], /* Private Use */ + ["\uE049", "\uE049"], /* Private Use */ + ["\uE04A", "\uE04A"], /* Private Use */ + ["\uE04B", "\uE04B"], /* Private Use */ + ["\uE04C", "\uE04C"], /* Private Use */ + ["\uE04D", "\uE04D"], /* Private Use */ + ["\uE04E", "\uE04E"], /* Private Use */ + ["\uE04F", "\uE04F"], /* Private Use */ + ["\uE050", "\uE050"], /* Private Use */ + ["\uE051", "\uE051"], /* Private Use */ + ["\uE052", "\uE052"], /* Private Use */ + ["\uE053", "\uE053"], /* Private Use */ + ["\uE054", "\uE054"], /* Private Use */ + ["\uE055", "\uE055"], /* Private Use */ + ["\uE056", "\uE056"], /* Private Use */ + ["\uE057", "\uE057"], /* Private Use */ + ["\uE058", "\uE058"], /* Private Use */ + ["\uE059", "\uE059"], /* Private Use */ + ["\uE05A", "\uE05A"], /* Private Use */ + ["\uE05B", "\uE05B"], /* Private Use */ + ["\uE05C", "\uE05C"], /* Private Use */ + ["\uE05D", "\uE05D"], /* Private Use */ + ["\uE05E", "\uE05E"], /* Private Use */ + ["\uE05F", "\uE05F"], /* Private Use */ + ["\uE060", "\uE060"], /* Private Use */ + ["\uE061", "\uE061"], /* Private Use */ + ["\uE062", "\uE062"], /* Private Use */ + ["\uE063", "\uE063"], /* Private Use */ + ["\uE064", "\uE064"], /* Private Use */ + ["\uE065", "\uE065"], /* Private Use */ + ["\uE066", "\uE066"], /* Private Use */ + ["\uE067", "\uE067"], /* Private Use */ + ["\uE068", "\uE068"], /* Private Use */ + ["\uE069", "\uE069"], /* Private Use */ + ["\uE06A", "\uE06A"], /* Private Use */ + ["\uE06B", "\uE06B"], /* Private Use */ + ["\uE06C", "\uE06C"], /* Private Use */ + ["\uE06D", "\uE06D"], /* Private Use */ + ["\uE06E", "\uE06E"], /* Private Use */ + ["\uE06F", "\uE06F"], /* Private Use */ + ["\uE070", "\uE070"], /* Private Use */ + ["\uE071", "\uE071"], /* Private Use */ + ["\uE072", "\uE072"], /* Private Use */ + ["\uE073", "\uE073"], /* Private Use */ + ["\uE074", "\uE074"], /* Private Use */ + ["\uE075", "\uE075"], /* Private Use */ + ["\uE076", "\uE076"], /* Private Use */ + ["\uE077", "\uE077"], /* Private Use */ + ["\uE078", "\uE078"], /* Private Use */ + ["\uE079", "\uE079"], /* Private Use */ + ["\uE07A", "\uE07A"], /* Private Use */ + ["\uE07B", "\uE07B"], /* Private Use */ + ["\uE07C", "\uE07C"], /* Private Use */ + ["\uE07D", "\uE07D"], /* Private Use */ + ["\uE07E", "\uE07E"], /* Private Use */ + ["\uE07F", "\uE07F"], /* Private Use */ + ["\uE080", "\uE080"], /* Private Use */ + ["\uE081", "\uE081"], /* Private Use */ + ["\uE082", "\uE082"], /* Private Use */ + ["\uE083", "\uE083"], /* Private Use */ + ["\uE084", "\uE084"], /* Private Use */ + ["\uE085", "\uE085"], /* Private Use */ + ["\uE086", "\uE086"], /* Private Use */ + ["\uE087", "\uE087"], /* Private Use */ + ["\uE088", "\uE088"], /* Private Use */ + ["\uE089", "\uE089"], /* Private Use */ + ["\uE08A", "\uE08A"], /* Private Use */ + ["\uE08B", "\uE08B"], /* Private Use */ + ["\uE08C", "\uE08C"], /* Private Use */ + ["\uE08D", "\uE08D"], /* Private Use */ + ["\uE08E", "\uE08E"], /* Private Use */ + ["\uE08F", "\uE08F"], /* Private Use */ + ["\uE090", "\uE090"], /* Private Use */ + ["\uE091", "\uE091"], /* Private Use */ + ["\uE092", "\uE092"], /* Private Use */ + ["\uE093", "\uE093"], /* Private Use */ + ["\uE094", "\uE094"], /* Private Use */ + ["\uE095", "\uE095"], /* Private Use */ + ["\uE096", "\uE096"], /* Private Use */ + ["\uE097", "\uE097"], /* Private Use */ + ["\uE098", "\uE098"], /* Private Use */ + ["\uE099", "\uE099"], /* Private Use */ + ["\uE09A", "\uE09A"], /* Private Use */ + ["\uE09B", "\uE09B"], /* Private Use */ + ["\uE09C", "\uE09C"], /* Private Use */ + ["\uE09D", "\uE09D"], /* Private Use */ + ["\uE09E", "\uE09E"], /* Private Use */ + ["\uE09F", "\uE09F"], /* Private Use */ + ["\uE0A0", "\uE0A0"], /* Private Use */ + ["\uE0A1", "\uE0A1"], /* Private Use */ + ["\uE0A2", "\uE0A2"], /* Private Use */ + ["\uE0A3", "\uE0A3"], /* Private Use */ + ["\uE0A4", "\uE0A4"], /* Private Use */ + ["\uE0A5", "\uE0A5"], /* Private Use */ + ["\uE0A6", "\uE0A6"], /* Private Use */ + ["\uE0A7", "\uE0A7"], /* Private Use */ + ["\uE0A8", "\uE0A8"], /* Private Use */ + ["\uE0A9", "\uE0A9"], /* Private Use */ + ["\uE0AA", "\uE0AA"], /* Private Use */ + ["\uE0AB", "\uE0AB"], /* Private Use */ + ["\uE0AC", "\uE0AC"], /* Private Use */ + ["\uE0AD", "\uE0AD"], /* Private Use */ + ["\uE0AE", "\uE0AE"], /* Private Use */ + ["\uE0AF", "\uE0AF"], /* Private Use */ + ["\uE0B0", "\uE0B0"], /* Private Use */ + ["\uE0B1", "\uE0B1"], /* Private Use */ + ["\uE0B2", "\uE0B2"], /* Private Use */ + ["\uE0B3", "\uE0B3"], /* Private Use */ + ["\uE0B4", "\uE0B4"], /* Private Use */ + ["\uE0B5", "\uE0B5"], /* Private Use */ + ["\uE0B6", "\uE0B6"], /* Private Use */ + ["\uE0B7", "\uE0B7"], /* Private Use */ + ["\uE0B8", "\uE0B8"], /* Private Use */ + ["\uE0B9", "\uE0B9"], /* Private Use */ + ["\uE0BA", "\uE0BA"], /* Private Use */ + ["\uE0BB", "\uE0BB"], /* Private Use */ + ["\uE0BC", "\uE0BC"], /* Private Use */ + ["\uE0BD", "\uE0BD"], /* Private Use */ + ["\uE0BE", "\uE0BE"], /* Private Use */ + ["\uE0BF", "\uE0BF"], /* Private Use */ + ["\uE0C0", "\uE0C0"], /* Private Use */ + ["\uE0C1", "\uE0C1"], /* Private Use */ + ["\uE0C2", "\uE0C2"], /* Private Use */ + ["\uE0C3", "\uE0C3"], /* Private Use */ + ["\uE0C4", "\uE0C4"], /* Private Use */ + ["\uE0C5", "\uE0C5"], /* Private Use */ + ["\uE0C6", "\uE0C6"], /* Private Use */ + ["\uE0C7", "\uE0C7"], /* Private Use */ + ["\uE0C8", "\uE0C8"], /* Private Use */ + ["\uE0C9", "\uE0C9"], /* Private Use */ + ["\uE0CA", "\uE0CA"], /* Private Use */ + ["\uE0CB", "\uE0CB"], /* Private Use */ + ["\uE0CC", "\uE0CC"], /* Private Use */ + ["\uE0CD", "\uE0CD"], /* Private Use */ + ["\uE0CE", "\uE0CE"], /* Private Use */ + ["\uE0CF", "\uE0CF"], /* Private Use */ + ["\uE0D0", "\uE0D0"], /* Private Use */ + ["\uE0D1", "\uE0D1"], /* Private Use */ + ["\uE0D2", "\uE0D2"], /* Private Use */ + ["\uE0D3", "\uE0D3"], /* Private Use */ + ["\uE0D4", "\uE0D4"], /* Private Use */ + ["\uE0D5", "\uE0D5"], /* Private Use */ + ["\uE0D6", "\uE0D6"], /* Private Use */ + ["\uE0D7", "\uE0D7"], /* Private Use */ + ["\uE0D8", "\uE0D8"], /* Private Use */ + ["\uE0D9", "\uE0D9"], /* Private Use */ + ["\uE0DA", "\uE0DA"], /* Private Use */ + ["\uE0DB", "\uE0DB"], /* Private Use */ + ["\uE0DC", "\uE0DC"], /* Private Use */ + ["\uE0DD", "\uE0DD"], /* Private Use */ + ["\uE0DE", "\uE0DE"], /* Private Use */ + ["\uE0DF", "\uE0DF"], /* Private Use */ + ["\uE0E0", "\uE0E0"], /* Private Use */ + ["\uE0E1", "\uE0E1"], /* Private Use */ + ["\uE0E2", "\uE0E2"], /* Private Use */ + ["\uE0E3", "\uE0E3"], /* Private Use */ + ["\uE0E4", "\uE0E4"], /* Private Use */ + ["\uE0E5", "\uE0E5"], /* Private Use */ + ["\uE0E6", "\uE0E6"], /* Private Use */ + ["\uE0E7", "\uE0E7"], /* Private Use */ + ["\uE0E8", "\uE0E8"], /* Private Use */ + ["\uE0E9", "\uE0E9"], /* Private Use */ + ["\uE0EA", "\uE0EA"], /* Private Use */ + ["\uE0EB", "\uE0EB"], /* Private Use */ + ["\uE0EC", "\uE0EC"], /* Private Use */ + ["\uE0ED", "\uE0ED"], /* Private Use */ + ["\uE0EE", "\uE0EE"], /* Private Use */ + ["\uE0EF", "\uE0EF"], /* Private Use */ + ["\uE0F0", "\uE0F0"], /* Private Use */ + ["\uE0F1", "\uE0F1"], /* Private Use */ + ["\uE0F2", "\uE0F2"], /* Private Use */ + ["\uE0F3", "\uE0F3"], /* Private Use */ + ["\uE0F4", "\uE0F4"], /* Private Use */ + ["\uE0F5", "\uE0F5"], /* Private Use */ + ["\uE0F6", "\uE0F6"], /* Private Use */ + ["\uE0F7", "\uE0F7"], /* Private Use */ + ["\uE0F8", "\uE0F8"], /* Private Use */ + ["\uE0F9", "\uE0F9"], /* Private Use */ + ["\uE0FA", "\uE0FA"], /* Private Use */ + ["\uE0FB", "\uE0FB"], /* Private Use */ + ["\uE0FC", "\uE0FC"], /* Private Use */ + ["\uE0FD", "\uE0FD"], /* Private Use */ + ["\uE0FE", "\uE0FE"], /* Private Use */ + ["\uE0FF", "\uE0FF"], /* Private Use */ + ["\uE100", "\uE100"], /* Private Use */ + ["\uE101", "\uE101"], /* Private Use */ + ["\uE102", "\uE102"], /* Private Use */ + ["\uE103", "\uE103"], /* Private Use */ + ["\uE104", "\uE104"], /* Private Use */ + ["\uE105", "\uE105"], /* Private Use */ + ["\uE106", "\uE106"], /* Private Use */ + ["\uE107", "\uE107"], /* Private Use */ + ["\uE108", "\uE108"], /* Private Use */ + ["\uE109", "\uE109"], /* Private Use */ + ["\uE10A", "\uE10A"], /* Private Use */ + ["\uE10B", "\uE10B"], /* Private Use */ + ["\uE10C", "\uE10C"], /* Private Use */ + ["\uE10D", "\uE10D"], /* Private Use */ + ["\uE10E", "\uE10E"], /* Private Use */ + ["\uE10F", "\uE10F"], /* Private Use */ + ["\uE110", "\uE110"], /* Private Use */ + ["\uE111", "\uE111"], /* Private Use */ + ["\uE112", "\uE112"], /* Private Use */ + ["\uE113", "\uE113"], /* Private Use */ + ["\uE114", "\uE114"], /* Private Use */ + ["\uE115", "\uE115"], /* Private Use */ + ["\uE116", "\uE116"], /* Private Use */ + ["\uE117", "\uE117"], /* Private Use */ + ["\uE118", "\uE118"], /* Private Use */ + ["\uE119", "\uE119"], /* Private Use */ + ["\uE11A", "\uE11A"], /* Private Use */ + ["\uE11B", "\uE11B"], /* Private Use */ + ["\uE11C", "\uE11C"], /* Private Use */ + ["\uE11D", "\uE11D"], /* Private Use */ + ["\uE11E", "\uE11E"], /* Private Use */ + ["\uE11F", "\uE11F"], /* Private Use */ + ["\uE120", "\uE120"], /* Private Use */ + ["\uE121", "\uE121"], /* Private Use */ + ["\uE122", "\uE122"], /* Private Use */ + ["\uE123", "\uE123"], /* Private Use */ + ["\uE124", "\uE124"], /* Private Use */ + ["\uE125", "\uE125"], /* Private Use */ + ["\uE126", "\uE126"], /* Private Use */ + ["\uE127", "\uE127"], /* Private Use */ + ["\uE128", "\uE128"], /* Private Use */ + ["\uE129", "\uE129"], /* Private Use */ + ["\uE12A", "\uE12A"], /* Private Use */ + ["\uE12B", "\uE12B"], /* Private Use */ + ["\uE12C", "\uE12C"], /* Private Use */ + ["\uE12D", "\uE12D"], /* Private Use */ + ["\uE12E", "\uE12E"], /* Private Use */ + ["\uE12F", "\uE12F"], /* Private Use */ + ["\uE130", "\uE130"], /* Private Use */ + ["\uE131", "\uE131"], /* Private Use */ + ["\uE132", "\uE132"], /* Private Use */ + ["\uE133", "\uE133"], /* Private Use */ + ["\uE134", "\uE134"], /* Private Use */ + ["\uE135", "\uE135"], /* Private Use */ + ["\uE136", "\uE136"], /* Private Use */ + ["\uE137", "\uE137"], /* Private Use */ + ["\uE138", "\uE138"], /* Private Use */ + ["\uE139", "\uE139"], /* Private Use */ + ["\uE13A", "\uE13A"], /* Private Use */ + ["\uE13B", "\uE13B"], /* Private Use */ + ["\uE13C", "\uE13C"], /* Private Use */ + ["\uE13D", "\uE13D"], /* Private Use */ + ["\uE13E", "\uE13E"], /* Private Use */ + ["\uE13F", "\uE13F"], /* Private Use */ + ["\uE140", "\uE140"], /* Private Use */ + ["\uE141", "\uE141"], /* Private Use */ + ["\uE142", "\uE142"], /* Private Use */ + ["\uE143", "\uE143"], /* Private Use */ + ["\uE144", "\uE144"], /* Private Use */ + ["\uE145", "\uE145"], /* Private Use */ + ["\uE146", "\uE146"], /* Private Use */ + ["\uE147", "\uE147"], /* Private Use */ + ["\uE148", "\uE148"], /* Private Use */ + ["\uE149", "\uE149"], /* Private Use */ + ["\uE14A", "\uE14A"], /* Private Use */ + ["\uE14B", "\uE14B"], /* Private Use */ + ["\uE14C", "\uE14C"], /* Private Use */ + ["\uE14D", "\uE14D"], /* Private Use */ + ["\uE14E", "\uE14E"], /* Private Use */ + ["\uE14F", "\uE14F"], /* Private Use */ + ["\uE150", "\uE150"], /* Private Use */ + ["\uE151", "\uE151"], /* Private Use */ + ["\uE152", "\uE152"], /* Private Use */ + ["\uE153", "\uE153"], /* Private Use */ + ["\uE154", "\uE154"], /* Private Use */ + ["\uE155", "\uE155"], /* Private Use */ + ["\uE156", "\uE156"], /* Private Use */ + ["\uE157", "\uE157"], /* Private Use */ + ["\uE158", "\uE158"], /* Private Use */ + ["\uE159", "\uE159"], /* Private Use */ + ["\uE15A", "\uE15A"], /* Private Use */ + ["\uE15B", "\uE15B"], /* Private Use */ + ["\uE15C", "\uE15C"], /* Private Use */ + ["\uE15D", "\uE15D"], /* Private Use */ + ["\uE15E", "\uE15E"], /* Private Use */ + ["\uE15F", "\uE15F"], /* Private Use */ + ["\uE160", "\uE160"], /* Private Use */ + ["\uE161", "\uE161"], /* Private Use */ + ["\uE162", "\uE162"], /* Private Use */ + ["\uE163", "\uE163"], /* Private Use */ + ["\uE164", "\uE164"], /* Private Use */ + ["\uE165", "\uE165"], /* Private Use */ + ["\uE166", "\uE166"], /* Private Use */ + ["\uE167", "\uE167"], /* Private Use */ + ["\uE168", "\uE168"], /* Private Use */ + ["\uE169", "\uE169"], /* Private Use */ + ["\uE16A", "\uE16A"], /* Private Use */ + ["\uE16B", "\uE16B"], /* Private Use */ + ["\uE16C", "\uE16C"], /* Private Use */ + ["\uE16D", "\uE16D"], /* Private Use */ + ["\uE16E", "\uE16E"], /* Private Use */ + ["\uE16F", "\uE16F"], /* Private Use */ + ["\uE170", "\uE170"], /* Private Use */ + ["\uE171", "\uE171"], /* Private Use */ + ["\uE172", "\uE172"], /* Private Use */ + ["\uE173", "\uE173"], /* Private Use */ + ["\uE174", "\uE174"], /* Private Use */ + ["\uE175", "\uE175"], /* Private Use */ + ["\uE176", "\uE176"], /* Private Use */ + ["\uE177", "\uE177"], /* Private Use */ + ["\uE178", "\uE178"], /* Private Use */ + ["\uE179", "\uE179"], /* Private Use */ + ["\uE17A", "\uE17A"], /* Private Use */ + ["\uE17B", "\uE17B"], /* Private Use */ + ["\uE17C", "\uE17C"], /* Private Use */ + ["\uE17D", "\uE17D"], /* Private Use */ + ["\uE17E", "\uE17E"], /* Private Use */ + ["\uE17F", "\uE17F"], /* Private Use */ + ["\uE180", "\uE180"], /* Private Use */ + ["\uE181", "\uE181"], /* Private Use */ + ["\uE182", "\uE182"], /* Private Use */ + ["\uE183", "\uE183"], /* Private Use */ + ["\uE184", "\uE184"], /* Private Use */ + ["\uE185", "\uE185"], /* Private Use */ + ["\uE186", "\uE186"], /* Private Use */ + ["\uE187", "\uE187"], /* Private Use */ + ["\uE188", "\uE188"], /* Private Use */ + ["\uE189", "\uE189"], /* Private Use */ + ["\uE18A", "\uE18A"], /* Private Use */ + ["\uE18B", "\uE18B"], /* Private Use */ + ["\uE18C", "\uE18C"], /* Private Use */ + ["\uE18D", "\uE18D"], /* Private Use */ + ["\uE18E", "\uE18E"], /* Private Use */ + ["\uE18F", "\uE18F"], /* Private Use */ + ["\uE190", "\uE190"], /* Private Use */ + ["\uE191", "\uE191"], /* Private Use */ + ["\uE192", "\uE192"], /* Private Use */ + ["\uE193", "\uE193"], /* Private Use */ + ["\uE194", "\uE194"], /* Private Use */ + ["\uE195", "\uE195"], /* Private Use */ + ["\uE196", "\uE196"], /* Private Use */ + ["\uE197", "\uE197"], /* Private Use */ + ["\uE198", "\uE198"], /* Private Use */ + ["\uE199", "\uE199"], /* Private Use */ + ["\uE19A", "\uE19A"], /* Private Use */ + ["\uE19B", "\uE19B"], /* Private Use */ + ["\uE19C", "\uE19C"], /* Private Use */ + ["\uE19D", "\uE19D"], /* Private Use */ + ["\uE19E", "\uE19E"], /* Private Use */ + ["\uE19F", "\uE19F"], /* Private Use */ + ["\uE1A0", "\uE1A0"], /* Private Use */ + ["\uE1A1", "\uE1A1"], /* Private Use */ + ["\uE1A2", "\uE1A2"], /* Private Use */ + ["\uE1A3", "\uE1A3"], /* Private Use */ + ["\uE1A4", "\uE1A4"], /* Private Use */ + ["\uE1A5", "\uE1A5"], /* Private Use */ + ["\uE1A6", "\uE1A6"], /* Private Use */ + ["\uE1A7", "\uE1A7"], /* Private Use */ + ["\uE1A8", "\uE1A8"], /* Private Use */ + ["\uE1A9", "\uE1A9"], /* Private Use */ + ["\uE1AA", "\uE1AA"], /* Private Use */ + ["\uE1AB", "\uE1AB"], /* Private Use */ + ["\uE1AC", "\uE1AC"], /* Private Use */ + ["\uE1AD", "\uE1AD"], /* Private Use */ + ["\uE1AE", "\uE1AE"], /* Private Use */ + ["\uE1AF", "\uE1AF"], /* Private Use */ + ["\uE1B0", "\uE1B0"], /* Private Use */ + ["\uE1B1", "\uE1B1"], /* Private Use */ + ["\uE1B2", "\uE1B2"], /* Private Use */ + ["\uE1B3", "\uE1B3"], /* Private Use */ + ["\uE1B4", "\uE1B4"], /* Private Use */ + ["\uE1B5", "\uE1B5"], /* Private Use */ + ["\uE1B6", "\uE1B6"], /* Private Use */ + ["\uE1B7", "\uE1B7"], /* Private Use */ + ["\uE1B8", "\uE1B8"], /* Private Use */ + ["\uE1B9", "\uE1B9"], /* Private Use */ + ["\uE1BA", "\uE1BA"], /* Private Use */ + ["\uE1BB", "\uE1BB"], /* Private Use */ + ["\uE1BC", "\uE1BC"], /* Private Use */ + ["\uE1BD", "\uE1BD"], /* Private Use */ + ["\uE1BE", "\uE1BE"], /* Private Use */ + ["\uE1BF", "\uE1BF"], /* Private Use */ + ["\uE1C0", "\uE1C0"], /* Private Use */ + ["\uE1C1", "\uE1C1"], /* Private Use */ + ["\uE1C2", "\uE1C2"], /* Private Use */ + ["\uE1C3", "\uE1C3"], /* Private Use */ + ["\uE1C4", "\uE1C4"], /* Private Use */ + ["\uE1C5", "\uE1C5"], /* Private Use */ + ["\uE1C6", "\uE1C6"], /* Private Use */ + ["\uE1C7", "\uE1C7"], /* Private Use */ + ["\uE1C8", "\uE1C8"], /* Private Use */ + ["\uE1C9", "\uE1C9"], /* Private Use */ + ["\uE1CA", "\uE1CA"], /* Private Use */ + ["\uE1CB", "\uE1CB"], /* Private Use */ + ["\uE1CC", "\uE1CC"], /* Private Use */ + ["\uE1CD", "\uE1CD"], /* Private Use */ + ["\uE1CE", "\uE1CE"], /* Private Use */ + ["\uE1CF", "\uE1CF"], /* Private Use */ + ["\uE1D0", "\uE1D0"], /* Private Use */ + ["\uE1D1", "\uE1D1"], /* Private Use */ + ["\uE1D2", "\uE1D2"], /* Private Use */ + ["\uE1D3", "\uE1D3"], /* Private Use */ + ["\uE1D4", "\uE1D4"], /* Private Use */ + ["\uE1D5", "\uE1D5"], /* Private Use */ + ["\uE1D6", "\uE1D6"], /* Private Use */ + ["\uE1D7", "\uE1D7"], /* Private Use */ + ["\uE1D8", "\uE1D8"], /* Private Use */ + ["\uE1D9", "\uE1D9"], /* Private Use */ + ["\uE1DA", "\uE1DA"], /* Private Use */ + ["\uE1DB", "\uE1DB"], /* Private Use */ + ["\uE1DC", "\uE1DC"], /* Private Use */ + ["\uE1DD", "\uE1DD"], /* Private Use */ + ["\uE1DE", "\uE1DE"], /* Private Use */ + ["\uE1DF", "\uE1DF"], /* Private Use */ + ["\uE1E0", "\uE1E0"], /* Private Use */ + ["\uE1E1", "\uE1E1"], /* Private Use */ + ["\uE1E2", "\uE1E2"], /* Private Use */ + ["\uE1E3", "\uE1E3"], /* Private Use */ + ["\uE1E4", "\uE1E4"], /* Private Use */ + ["\uE1E5", "\uE1E5"], /* Private Use */ + ["\uE1E6", "\uE1E6"], /* Private Use */ + ["\uE1E7", "\uE1E7"], /* Private Use */ + ["\uE1E8", "\uE1E8"], /* Private Use */ + ["\uE1E9", "\uE1E9"], /* Private Use */ + ["\uE1EA", "\uE1EA"], /* Private Use */ + ["\uE1EB", "\uE1EB"], /* Private Use */ + ["\uE1EC", "\uE1EC"], /* Private Use */ + ["\uE1ED", "\uE1ED"], /* Private Use */ + ["\uE1EE", "\uE1EE"], /* Private Use */ + ["\uE1EF", "\uE1EF"], /* Private Use */ + ["\uE1F0", "\uE1F0"], /* Private Use */ + ["\uE1F1", "\uE1F1"], /* Private Use */ + ["\uE1F2", "\uE1F2"], /* Private Use */ + ["\uE1F3", "\uE1F3"], /* Private Use */ + ["\uE1F4", "\uE1F4"], /* Private Use */ + ["\uE1F5", "\uE1F5"], /* Private Use */ + ["\uE1F6", "\uE1F6"], /* Private Use */ + ["\uE1F7", "\uE1F7"], /* Private Use */ + ["\uE1F8", "\uE1F8"], /* Private Use */ + ["\uE1F9", "\uE1F9"], /* Private Use */ + ["\uE1FA", "\uE1FA"], /* Private Use */ + ["\uE1FB", "\uE1FB"], /* Private Use */ + ["\uE1FC", "\uE1FC"], /* Private Use */ + ["\uE1FD", "\uE1FD"], /* Private Use */ + ["\uE1FE", "\uE1FE"], /* Private Use */ + ["\uE1FF", "\uE1FF"], /* Private Use */ + ["\uE200", "\uE200"], /* Private Use */ + ["\uE201", "\uE201"], /* Private Use */ + ["\uE202", "\uE202"], /* Private Use */ + ["\uE203", "\uE203"], /* Private Use */ + ["\uE204", "\uE204"], /* Private Use */ + ["\uE205", "\uE205"], /* Private Use */ + ["\uE206", "\uE206"], /* Private Use */ + ["\uE207", "\uE207"], /* Private Use */ + ["\uE208", "\uE208"], /* Private Use */ + ["\uE209", "\uE209"], /* Private Use */ + ["\uE20A", "\uE20A"], /* Private Use */ + ["\uE20B", "\uE20B"], /* Private Use */ + ["\uE20C", "\uE20C"], /* Private Use */ + ["\uE20D", "\uE20D"], /* Private Use */ + ["\uE20E", "\uE20E"], /* Private Use */ + ["\uE20F", "\uE20F"], /* Private Use */ + ["\uE210", "\uE210"], /* Private Use */ + ["\uE211", "\uE211"], /* Private Use */ + ["\uE212", "\uE212"], /* Private Use */ + ["\uE213", "\uE213"], /* Private Use */ + ["\uE214", "\uE214"], /* Private Use */ + ["\uE215", "\uE215"], /* Private Use */ + ["\uE216", "\uE216"], /* Private Use */ + ["\uE217", "\uE217"], /* Private Use */ + ["\uE218", "\uE218"], /* Private Use */ + ["\uE219", "\uE219"], /* Private Use */ + ["\uE21A", "\uE21A"], /* Private Use */ + ["\uE21B", "\uE21B"], /* Private Use */ + ["\uE21C", "\uE21C"], /* Private Use */ + ["\uE21D", "\uE21D"], /* Private Use */ + ["\uE21E", "\uE21E"], /* Private Use */ + ["\uE21F", "\uE21F"], /* Private Use */ + ["\uE220", "\uE220"], /* Private Use */ + ["\uE221", "\uE221"], /* Private Use */ + ["\uE222", "\uE222"], /* Private Use */ + ["\uE223", "\uE223"], /* Private Use */ + ["\uE224", "\uE224"], /* Private Use */ + ["\uE225", "\uE225"], /* Private Use */ + ["\uE226", "\uE226"], /* Private Use */ + ["\uE227", "\uE227"], /* Private Use */ + ["\uE228", "\uE228"], /* Private Use */ + ["\uE229", "\uE229"], /* Private Use */ + ["\uE22A", "\uE22A"], /* Private Use */ + ["\uE22B", "\uE22B"], /* Private Use */ + ["\uE22C", "\uE22C"], /* Private Use */ + ["\uE22D", "\uE22D"], /* Private Use */ + ["\uE22E", "\uE22E"], /* Private Use */ + ["\uE22F", "\uE22F"], /* Private Use */ + ["\uE230", "\uE230"], /* Private Use */ + ["\uE231", "\uE231"], /* Private Use */ + ["\uE232", "\uE232"], /* Private Use */ + ["\uE233", "\uE233"], /* Private Use */ + ["\uE234", "\uE234"], /* Private Use */ + ["\uE235", "\uE235"], /* Private Use */ + ["\uE236", "\uE236"], /* Private Use */ + ["\uE237", "\uE237"], /* Private Use */ + ["\uE238", "\uE238"], /* Private Use */ + ["\uE239", "\uE239"], /* Private Use */ + ["\uE23A", "\uE23A"], /* Private Use */ + ["\uE23B", "\uE23B"], /* Private Use */ + ["\uE23C", "\uE23C"], /* Private Use */ + ["\uE23D", "\uE23D"], /* Private Use */ + ["\uE23E", "\uE23E"], /* Private Use */ + ["\uE23F", "\uE23F"], /* Private Use */ + ["\uE240", "\uE240"], /* Private Use */ + ["\uE241", "\uE241"], /* Private Use */ + ["\uE242", "\uE242"], /* Private Use */ + ["\uE243", "\uE243"], /* Private Use */ + ["\uE244", "\uE244"], /* Private Use */ + ["\uE245", "\uE245"], /* Private Use */ + ["\uE246", "\uE246"], /* Private Use */ + ["\uE247", "\uE247"], /* Private Use */ + ["\uE248", "\uE248"], /* Private Use */ + ["\uE249", "\uE249"], /* Private Use */ + ["\uE24A", "\uE24A"], /* Private Use */ + ["\uE24B", "\uE24B"], /* Private Use */ + ["\uE24C", "\uE24C"], /* Private Use */ + ["\uE24D", "\uE24D"], /* Private Use */ + ["\uE24E", "\uE24E"], /* Private Use */ + ["\uE24F", "\uE24F"], /* Private Use */ + ["\uE250", "\uE250"], /* Private Use */ + ["\uE251", "\uE251"], /* Private Use */ + ["\uE252", "\uE252"], /* Private Use */ + ["\uE253", "\uE253"], /* Private Use */ + ["\uE254", "\uE254"], /* Private Use */ + ["\uE255", "\uE255"], /* Private Use */ + ["\uE256", "\uE256"], /* Private Use */ + ["\uE257", "\uE257"], /* Private Use */ + ["\uE258", "\uE258"], /* Private Use */ + ["\uE259", "\uE259"], /* Private Use */ + ["\uE25A", "\uE25A"], /* Private Use */ + ["\uE25B", "\uE25B"], /* Private Use */ + ["\uE25C", "\uE25C"], /* Private Use */ + ["\uE25D", "\uE25D"], /* Private Use */ + ["\uE25E", "\uE25E"], /* Private Use */ + ["\uE25F", "\uE25F"], /* Private Use */ + ["\uE260", "\uE260"], /* Private Use */ + ["\uE261", "\uE261"], /* Private Use */ + ["\uE262", "\uE262"], /* Private Use */ + ["\uE263", "\uE263"], /* Private Use */ + ["\uE264", "\uE264"], /* Private Use */ + ["\uE265", "\uE265"], /* Private Use */ + ["\uE266", "\uE266"], /* Private Use */ + ["\uE267", "\uE267"], /* Private Use */ + ["\uE268", "\uE268"], /* Private Use */ + ["\uE269", "\uE269"], /* Private Use */ + ["\uE26A", "\uE26A"], /* Private Use */ + ["\uE26B", "\uE26B"], /* Private Use */ + ["\uE26C", "\uE26C"], /* Private Use */ + ["\uE26D", "\uE26D"], /* Private Use */ + ["\uE26E", "\uE26E"], /* Private Use */ + ["\uE26F", "\uE26F"], /* Private Use */ + ["\uE270", "\uE270"], /* Private Use */ + ["\uE271", "\uE271"], /* Private Use */ + ["\uE272", "\uE272"], /* Private Use */ + ["\uE273", "\uE273"], /* Private Use */ + ["\uE274", "\uE274"], /* Private Use */ + ["\uE275", "\uE275"], /* Private Use */ + ["\uE276", "\uE276"], /* Private Use */ + ["\uE277", "\uE277"], /* Private Use */ + ["\uE278", "\uE278"], /* Private Use */ + ["\uE279", "\uE279"], /* Private Use */ + ["\uE27A", "\uE27A"], /* Private Use */ + ["\uE27B", "\uE27B"], /* Private Use */ + ["\uE27C", "\uE27C"], /* Private Use */ + ["\uE27D", "\uE27D"], /* Private Use */ + ["\uE27E", "\uE27E"], /* Private Use */ + ["\uE27F", "\uE27F"], /* Private Use */ + ["\uE280", "\uE280"], /* Private Use */ + ["\uE281", "\uE281"], /* Private Use */ + ["\uE282", "\uE282"], /* Private Use */ + ["\uE283", "\uE283"], /* Private Use */ + ["\uE284", "\uE284"], /* Private Use */ + ["\uE285", "\uE285"], /* Private Use */ + ["\uE286", "\uE286"], /* Private Use */ + ["\uE287", "\uE287"], /* Private Use */ + ["\uE288", "\uE288"], /* Private Use */ + ["\uE289", "\uE289"], /* Private Use */ + ["\uE28A", "\uE28A"], /* Private Use */ + ["\uE28B", "\uE28B"], /* Private Use */ + ["\uE28C", "\uE28C"], /* Private Use */ + ["\uE28D", "\uE28D"], /* Private Use */ + ["\uE28E", "\uE28E"], /* Private Use */ + ["\uE28F", "\uE28F"], /* Private Use */ + ["\uE290", "\uE290"], /* Private Use */ + ["\uE291", "\uE291"], /* Private Use */ + ["\uE292", "\uE292"], /* Private Use */ + ["\uE293", "\uE293"], /* Private Use */ + ["\uE294", "\uE294"], /* Private Use */ + ["\uE295", "\uE295"], /* Private Use */ + ["\uE296", "\uE296"], /* Private Use */ + ["\uE297", "\uE297"], /* Private Use */ + ["\uE298", "\uE298"], /* Private Use */ + ["\uE299", "\uE299"], /* Private Use */ + ["\uE29A", "\uE29A"], /* Private Use */ + ["\uE29B", "\uE29B"], /* Private Use */ + ["\uE29C", "\uE29C"], /* Private Use */ + ["\uE29D", "\uE29D"], /* Private Use */ + ["\uE29E", "\uE29E"], /* Private Use */ + ["\uE29F", "\uE29F"], /* Private Use */ + ["\uE2A0", "\uE2A0"], /* Private Use */ + ["\uE2A1", "\uE2A1"], /* Private Use */ + ["\uE2A2", "\uE2A2"], /* Private Use */ + ["\uE2A3", "\uE2A3"], /* Private Use */ + ["\uE2A4", "\uE2A4"], /* Private Use */ + ["\uE2A5", "\uE2A5"], /* Private Use */ + ["\uE2A6", "\uE2A6"], /* Private Use */ + ["\uE2A7", "\uE2A7"], /* Private Use */ + ["\uE2A8", "\uE2A8"], /* Private Use */ + ["\uE2A9", "\uE2A9"], /* Private Use */ + ["\uE2AA", "\uE2AA"], /* Private Use */ + ["\uE2AB", "\uE2AB"], /* Private Use */ + ["\uE2AC", "\uE2AC"], /* Private Use */ + ["\uE2AD", "\uE2AD"], /* Private Use */ + ["\uE2AE", "\uE2AE"], /* Private Use */ + ["\uE2AF", "\uE2AF"], /* Private Use */ + ["\uE2B0", "\uE2B0"], /* Private Use */ + ["\uE2B1", "\uE2B1"], /* Private Use */ + ["\uE2B2", "\uE2B2"], /* Private Use */ + ["\uE2B3", "\uE2B3"], /* Private Use */ + ["\uE2B4", "\uE2B4"], /* Private Use */ + ["\uE2B5", "\uE2B5"], /* Private Use */ + ["\uE2B6", "\uE2B6"], /* Private Use */ + ["\uE2B7", "\uE2B7"], /* Private Use */ + ["\uE2B8", "\uE2B8"], /* Private Use */ + ["\uE2B9", "\uE2B9"], /* Private Use */ + ["\uE2BA", "\uE2BA"], /* Private Use */ + ["\uE2BB", "\uE2BB"], /* Private Use */ + ["\uE2BC", "\uE2BC"], /* Private Use */ + ["\uE2BD", "\uE2BD"], /* Private Use */ + ["\uE2BE", "\uE2BE"], /* Private Use */ + ["\uE2BF", "\uE2BF"], /* Private Use */ + ["\uE2C0", "\uE2C0"], /* Private Use */ + ["\uE2C1", "\uE2C1"], /* Private Use */ + ["\uE2C2", "\uE2C2"], /* Private Use */ + ["\uE2C3", "\uE2C3"], /* Private Use */ + ["\uE2C4", "\uE2C4"], /* Private Use */ + ["\uE2C5", "\uE2C5"], /* Private Use */ + ["\uE2C6", "\uE2C6"], /* Private Use */ + ["\uE2C7", "\uE2C7"], /* Private Use */ + ["\uE2C8", "\uE2C8"], /* Private Use */ + ["\uE2C9", "\uE2C9"], /* Private Use */ + ["\uE2CA", "\uE2CA"], /* Private Use */ + ["\uE2CB", "\uE2CB"], /* Private Use */ + ["\uE2CC", "\uE2CC"], /* Private Use */ + ["\uE2CD", "\uE2CD"], /* Private Use */ + ["\uE2CE", "\uE2CE"], /* Private Use */ + ["\uE2CF", "\uE2CF"], /* Private Use */ + ["\uE2D0", "\uE2D0"], /* Private Use */ + ["\uE2D1", "\uE2D1"], /* Private Use */ + ["\uE2D2", "\uE2D2"], /* Private Use */ + ["\uE2D3", "\uE2D3"], /* Private Use */ + ["\uE2D4", "\uE2D4"], /* Private Use */ + ["\uE2D5", "\uE2D5"], /* Private Use */ + ["\uE2D6", "\uE2D6"], /* Private Use */ + ["\uE2D7", "\uE2D7"], /* Private Use */ + ["\uE2D8", "\uE2D8"], /* Private Use */ + ["\uE2D9", "\uE2D9"], /* Private Use */ + ["\uE2DA", "\uE2DA"], /* Private Use */ + ["\uE2DB", "\uE2DB"], /* Private Use */ + ["\uE2DC", "\uE2DC"], /* Private Use */ + ["\uE2DD", "\uE2DD"], /* Private Use */ + ["\uE2DE", "\uE2DE"], /* Private Use */ + ["\uE2DF", "\uE2DF"], /* Private Use */ + ["\uE2E0", "\uE2E0"], /* Private Use */ + ["\uE2E1", "\uE2E1"], /* Private Use */ + ["\uE2E2", "\uE2E2"], /* Private Use */ + ["\uE2E3", "\uE2E3"], /* Private Use */ + ["\uE2E4", "\uE2E4"], /* Private Use */ + ["\uE2E5", "\uE2E5"], /* Private Use */ + ["\uE2E6", "\uE2E6"], /* Private Use */ + ["\uE2E7", "\uE2E7"], /* Private Use */ + ["\uE2E8", "\uE2E8"], /* Private Use */ + ["\uE2E9", "\uE2E9"], /* Private Use */ + ["\uE2EA", "\uE2EA"], /* Private Use */ + ["\uE2EB", "\uE2EB"], /* Private Use */ + ["\uE2EC", "\uE2EC"], /* Private Use */ + ["\uE2ED", "\uE2ED"], /* Private Use */ + ["\uE2EE", "\uE2EE"], /* Private Use */ + ["\uE2EF", "\uE2EF"], /* Private Use */ + ["\uE2F0", "\uE2F0"], /* Private Use */ + ["\uE2F1", "\uE2F1"], /* Private Use */ + ["\uE2F2", "\uE2F2"], /* Private Use */ + ["\uE2F3", "\uE2F3"], /* Private Use */ + ["\uE2F4", "\uE2F4"], /* Private Use */ + ["\uE2F5", "\uE2F5"], /* Private Use */ + ["\uE2F6", "\uE2F6"], /* Private Use */ + ["\uE2F7", "\uE2F7"], /* Private Use */ + ["\uE2F8", "\uE2F8"], /* Private Use */ + ["\uE2F9", "\uE2F9"], /* Private Use */ + ["\uE2FA", "\uE2FA"], /* Private Use */ + ["\uE2FB", "\uE2FB"], /* Private Use */ + ["\uE2FC", "\uE2FC"], /* Private Use */ + ["\uE2FD", "\uE2FD"], /* Private Use */ + ["\uE2FE", "\uE2FE"], /* Private Use */ + ["\uE2FF", "\uE2FF"], /* Private Use */ + ["\uE300", "\uE300"], /* Private Use */ + ["\uE301", "\uE301"], /* Private Use */ + ["\uE302", "\uE302"], /* Private Use */ + ["\uE303", "\uE303"], /* Private Use */ + ["\uE304", "\uE304"], /* Private Use */ + ["\uE305", "\uE305"], /* Private Use */ + ["\uE306", "\uE306"], /* Private Use */ + ["\uE307", "\uE307"], /* Private Use */ + ["\uE308", "\uE308"], /* Private Use */ + ["\uE309", "\uE309"], /* Private Use */ + ["\uE30A", "\uE30A"], /* Private Use */ + ["\uE30B", "\uE30B"], /* Private Use */ + ["\uE30C", "\uE30C"], /* Private Use */ + ["\uE30D", "\uE30D"], /* Private Use */ + ["\uE30E", "\uE30E"], /* Private Use */ + ["\uE30F", "\uE30F"], /* Private Use */ + ["\uE310", "\uE310"], /* Private Use */ + ["\uE311", "\uE311"], /* Private Use */ + ["\uE312", "\uE312"], /* Private Use */ + ["\uE313", "\uE313"], /* Private Use */ + ["\uE314", "\uE314"], /* Private Use */ + ["\uE315", "\uE315"], /* Private Use */ + ["\uE316", "\uE316"], /* Private Use */ + ["\uE317", "\uE317"], /* Private Use */ + ["\uE318", "\uE318"], /* Private Use */ + ["\uE319", "\uE319"], /* Private Use */ + ["\uE31A", "\uE31A"], /* Private Use */ + ["\uE31B", "\uE31B"], /* Private Use */ + ["\uE31C", "\uE31C"], /* Private Use */ + ["\uE31D", "\uE31D"], /* Private Use */ + ["\uE31E", "\uE31E"], /* Private Use */ + ["\uE31F", "\uE31F"], /* Private Use */ + ["\uE320", "\uE320"], /* Private Use */ + ["\uE321", "\uE321"], /* Private Use */ + ["\uE322", "\uE322"], /* Private Use */ + ["\uE323", "\uE323"], /* Private Use */ + ["\uE324", "\uE324"], /* Private Use */ + ["\uE325", "\uE325"], /* Private Use */ + ["\uE326", "\uE326"], /* Private Use */ + ["\uE327", "\uE327"], /* Private Use */ + ["\uE328", "\uE328"], /* Private Use */ + ["\uE329", "\uE329"], /* Private Use */ + ["\uE32A", "\uE32A"], /* Private Use */ + ["\uE32B", "\uE32B"], /* Private Use */ + ["\uE32C", "\uE32C"], /* Private Use */ + ["\uE32D", "\uE32D"], /* Private Use */ + ["\uE32E", "\uE32E"], /* Private Use */ + ["\uE32F", "\uE32F"], /* Private Use */ + ["\uE330", "\uE330"], /* Private Use */ + ["\uE331", "\uE331"], /* Private Use */ + ["\uE332", "\uE332"], /* Private Use */ + ["\uE333", "\uE333"], /* Private Use */ + ["\uE334", "\uE334"], /* Private Use */ + ["\uE335", "\uE335"], /* Private Use */ + ["\uE336", "\uE336"], /* Private Use */ + ["\uE337", "\uE337"], /* Private Use */ + ["\uE338", "\uE338"], /* Private Use */ + ["\uE339", "\uE339"], /* Private Use */ + ["\uE33A", "\uE33A"], /* Private Use */ + ["\uE33B", "\uE33B"], /* Private Use */ + ["\uE33C", "\uE33C"], /* Private Use */ + ["\uE33D", "\uE33D"], /* Private Use */ + ["\uE33E", "\uE33E"], /* Private Use */ + ["\uE33F", "\uE33F"], /* Private Use */ + ["\uE340", "\uE340"], /* Private Use */ + ["\uE341", "\uE341"], /* Private Use */ + ["\uE342", "\uE342"], /* Private Use */ + ["\uE343", "\uE343"], /* Private Use */ + ["\uE344", "\uE344"], /* Private Use */ + ["\uE345", "\uE345"], /* Private Use */ + ["\uE346", "\uE346"], /* Private Use */ + ["\uE347", "\uE347"], /* Private Use */ + ["\uE348", "\uE348"], /* Private Use */ + ["\uE349", "\uE349"], /* Private Use */ + ["\uE34A", "\uE34A"], /* Private Use */ + ["\uE34B", "\uE34B"], /* Private Use */ + ["\uE34C", "\uE34C"], /* Private Use */ + ["\uE34D", "\uE34D"], /* Private Use */ + ["\uE34E", "\uE34E"], /* Private Use */ + ["\uE34F", "\uE34F"], /* Private Use */ + ["\uE350", "\uE350"], /* Private Use */ + ["\uE351", "\uE351"], /* Private Use */ + ["\uE352", "\uE352"], /* Private Use */ + ["\uE353", "\uE353"], /* Private Use */ + ["\uE354", "\uE354"], /* Private Use */ + ["\uE355", "\uE355"], /* Private Use */ + ["\uE356", "\uE356"], /* Private Use */ + ["\uE357", "\uE357"], /* Private Use */ + ["\uE358", "\uE358"], /* Private Use */ + ["\uE359", "\uE359"], /* Private Use */ + ["\uE35A", "\uE35A"], /* Private Use */ + ["\uE35B", "\uE35B"], /* Private Use */ + ["\uE35C", "\uE35C"], /* Private Use */ + ["\uE35D", "\uE35D"], /* Private Use */ + ["\uE35E", "\uE35E"], /* Private Use */ + ["\uE35F", "\uE35F"], /* Private Use */ + ["\uE360", "\uE360"], /* Private Use */ + ["\uE361", "\uE361"], /* Private Use */ + ["\uE362", "\uE362"], /* Private Use */ + ["\uE363", "\uE363"], /* Private Use */ + ["\uE364", "\uE364"], /* Private Use */ + ["\uE365", "\uE365"], /* Private Use */ + ["\uE366", "\uE366"], /* Private Use */ + ["\uE367", "\uE367"], /* Private Use */ + ["\uE368", "\uE368"], /* Private Use */ + ["\uE369", "\uE369"], /* Private Use */ + ["\uE36A", "\uE36A"], /* Private Use */ + ["\uE36B", "\uE36B"], /* Private Use */ + ["\uE36C", "\uE36C"], /* Private Use */ + ["\uE36D", "\uE36D"], /* Private Use */ + ["\uE36E", "\uE36E"], /* Private Use */ + ["\uE36F", "\uE36F"], /* Private Use */ + ["\uE370", "\uE370"], /* Private Use */ + ["\uE371", "\uE371"], /* Private Use */ + ["\uE372", "\uE372"], /* Private Use */ + ["\uE373", "\uE373"], /* Private Use */ + ["\uE374", "\uE374"], /* Private Use */ + ["\uE375", "\uE375"], /* Private Use */ + ["\uE376", "\uE376"], /* Private Use */ + ["\uE377", "\uE377"], /* Private Use */ + ["\uE378", "\uE378"], /* Private Use */ + ["\uE379", "\uE379"], /* Private Use */ + ["\uE37A", "\uE37A"], /* Private Use */ + ["\uE37B", "\uE37B"], /* Private Use */ + ["\uE37C", "\uE37C"], /* Private Use */ + ["\uE37D", "\uE37D"], /* Private Use */ + ["\uE37E", "\uE37E"], /* Private Use */ + ["\uE37F", "\uE37F"], /* Private Use */ + ["\uE380", "\uE380"], /* Private Use */ + ["\uE381", "\uE381"], /* Private Use */ + ["\uE382", "\uE382"], /* Private Use */ + ["\uE383", "\uE383"], /* Private Use */ + ["\uE384", "\uE384"], /* Private Use */ + ["\uE385", "\uE385"], /* Private Use */ + ["\uE386", "\uE386"], /* Private Use */ + ["\uE387", "\uE387"], /* Private Use */ + ["\uE388", "\uE388"], /* Private Use */ + ["\uE389", "\uE389"], /* Private Use */ + ["\uE38A", "\uE38A"], /* Private Use */ + ["\uE38B", "\uE38B"], /* Private Use */ + ["\uE38C", "\uE38C"], /* Private Use */ + ["\uE38D", "\uE38D"], /* Private Use */ + ["\uE38E", "\uE38E"], /* Private Use */ + ["\uE38F", "\uE38F"], /* Private Use */ + ["\uE390", "\uE390"], /* Private Use */ + ["\uE391", "\uE391"], /* Private Use */ + ["\uE392", "\uE392"], /* Private Use */ + ["\uE393", "\uE393"], /* Private Use */ + ["\uE394", "\uE394"], /* Private Use */ + ["\uE395", "\uE395"], /* Private Use */ + ["\uE396", "\uE396"], /* Private Use */ + ["\uE397", "\uE397"], /* Private Use */ + ["\uE398", "\uE398"], /* Private Use */ + ["\uE399", "\uE399"], /* Private Use */ + ["\uE39A", "\uE39A"], /* Private Use */ + ["\uE39B", "\uE39B"], /* Private Use */ + ["\uE39C", "\uE39C"], /* Private Use */ + ["\uE39D", "\uE39D"], /* Private Use */ + ["\uE39E", "\uE39E"], /* Private Use */ + ["\uE39F", "\uE39F"], /* Private Use */ + ["\uE3A0", "\uE3A0"], /* Private Use */ + ["\uE3A1", "\uE3A1"], /* Private Use */ + ["\uE3A2", "\uE3A2"], /* Private Use */ + ["\uE3A3", "\uE3A3"], /* Private Use */ + ["\uE3A4", "\uE3A4"], /* Private Use */ + ["\uE3A5", "\uE3A5"], /* Private Use */ + ["\uE3A6", "\uE3A6"], /* Private Use */ + ["\uE3A7", "\uE3A7"], /* Private Use */ + ["\uE3A8", "\uE3A8"], /* Private Use */ + ["\uE3A9", "\uE3A9"], /* Private Use */ + ["\uE3AA", "\uE3AA"], /* Private Use */ + ["\uE3AB", "\uE3AB"], /* Private Use */ + ["\uE3AC", "\uE3AC"], /* Private Use */ + ["\uE3AD", "\uE3AD"], /* Private Use */ + ["\uE3AE", "\uE3AE"], /* Private Use */ + ["\uE3AF", "\uE3AF"], /* Private Use */ + ["\uE3B0", "\uE3B0"], /* Private Use */ + ["\uE3B1", "\uE3B1"], /* Private Use */ + ["\uE3B2", "\uE3B2"], /* Private Use */ + ["\uE3B3", "\uE3B3"], /* Private Use */ + ["\uE3B4", "\uE3B4"], /* Private Use */ + ["\uE3B5", "\uE3B5"], /* Private Use */ + ["\uE3B6", "\uE3B6"], /* Private Use */ + ["\uE3B7", "\uE3B7"], /* Private Use */ + ["\uE3B8", "\uE3B8"], /* Private Use */ + ["\uE3B9", "\uE3B9"], /* Private Use */ + ["\uE3BA", "\uE3BA"], /* Private Use */ + ["\uE3BB", "\uE3BB"], /* Private Use */ + ["\uE3BC", "\uE3BC"], /* Private Use */ + ["\uE3BD", "\uE3BD"], /* Private Use */ + ["\uE3BE", "\uE3BE"], /* Private Use */ + ["\uE3BF", "\uE3BF"], /* Private Use */ + ["\uE3C0", "\uE3C0"], /* Private Use */ + ["\uE3C1", "\uE3C1"], /* Private Use */ + ["\uE3C2", "\uE3C2"], /* Private Use */ + ["\uE3C3", "\uE3C3"], /* Private Use */ + ["\uE3C4", "\uE3C4"], /* Private Use */ + ["\uE3C5", "\uE3C5"], /* Private Use */ + ["\uE3C6", "\uE3C6"], /* Private Use */ + ["\uE3C7", "\uE3C7"], /* Private Use */ + ["\uE3C8", "\uE3C8"], /* Private Use */ + ["\uE3C9", "\uE3C9"], /* Private Use */ + ["\uE3CA", "\uE3CA"], /* Private Use */ + ["\uE3CB", "\uE3CB"], /* Private Use */ + ["\uE3CC", "\uE3CC"], /* Private Use */ + ["\uE3CD", "\uE3CD"], /* Private Use */ + ["\uE3CE", "\uE3CE"], /* Private Use */ + ["\uE3CF", "\uE3CF"], /* Private Use */ + ["\uE3D0", "\uE3D0"], /* Private Use */ + ["\uE3D1", "\uE3D1"], /* Private Use */ + ["\uE3D2", "\uE3D2"], /* Private Use */ + ["\uE3D3", "\uE3D3"], /* Private Use */ + ["\uE3D4", "\uE3D4"], /* Private Use */ + ["\uE3D5", "\uE3D5"], /* Private Use */ + ["\uE3D6", "\uE3D6"], /* Private Use */ + ["\uE3D7", "\uE3D7"], /* Private Use */ + ["\uE3D8", "\uE3D8"], /* Private Use */ + ["\uE3D9", "\uE3D9"], /* Private Use */ + ["\uE3DA", "\uE3DA"], /* Private Use */ + ["\uE3DB", "\uE3DB"], /* Private Use */ + ["\uE3DC", "\uE3DC"], /* Private Use */ + ["\uE3DD", "\uE3DD"], /* Private Use */ + ["\uE3DE", "\uE3DE"], /* Private Use */ + ["\uE3DF", "\uE3DF"], /* Private Use */ + ["\uE3E0", "\uE3E0"], /* Private Use */ + ["\uE3E1", "\uE3E1"], /* Private Use */ + ["\uE3E2", "\uE3E2"], /* Private Use */ + ["\uE3E3", "\uE3E3"], /* Private Use */ + ["\uE3E4", "\uE3E4"], /* Private Use */ + ["\uE3E5", "\uE3E5"], /* Private Use */ + ["\uE3E6", "\uE3E6"], /* Private Use */ + ["\uE3E7", "\uE3E7"], /* Private Use */ + ["\uE3E8", "\uE3E8"], /* Private Use */ + ["\uE3E9", "\uE3E9"], /* Private Use */ + ["\uE3EA", "\uE3EA"], /* Private Use */ + ["\uE3EB", "\uE3EB"], /* Private Use */ + ["\uE3EC", "\uE3EC"], /* Private Use */ + ["\uE3ED", "\uE3ED"], /* Private Use */ + ["\uE3EE", "\uE3EE"], /* Private Use */ + ["\uE3EF", "\uE3EF"], /* Private Use */ + ["\uE3F0", "\uE3F0"], /* Private Use */ + ["\uE3F1", "\uE3F1"], /* Private Use */ + ["\uE3F2", "\uE3F2"], /* Private Use */ + ["\uE3F3", "\uE3F3"], /* Private Use */ + ["\uE3F4", "\uE3F4"], /* Private Use */ + ["\uE3F5", "\uE3F5"], /* Private Use */ + ["\uE3F6", "\uE3F6"], /* Private Use */ + ["\uE3F7", "\uE3F7"], /* Private Use */ + ["\uE3F8", "\uE3F8"], /* Private Use */ + ["\uE3F9", "\uE3F9"], /* Private Use */ + ["\uE3FA", "\uE3FA"], /* Private Use */ + ["\uE3FB", "\uE3FB"], /* Private Use */ + ["\uE3FC", "\uE3FC"], /* Private Use */ + ["\uE3FD", "\uE3FD"], /* Private Use */ + ["\uE3FE", "\uE3FE"], /* Private Use */ + ["\uE3FF", "\uE3FF"], /* Private Use */ + ["\uE400", "\uE400"], /* Private Use */ + ["\uE401", "\uE401"], /* Private Use */ + ["\uE402", "\uE402"], /* Private Use */ + ["\uE403", "\uE403"], /* Private Use */ + ["\uE404", "\uE404"], /* Private Use */ + ["\uE405", "\uE405"], /* Private Use */ + ["\uE406", "\uE406"], /* Private Use */ + ["\uE407", "\uE407"], /* Private Use */ + ["\uE408", "\uE408"], /* Private Use */ + ["\uE409", "\uE409"], /* Private Use */ + ["\uE40A", "\uE40A"], /* Private Use */ + ["\uE40B", "\uE40B"], /* Private Use */ + ["\uE40C", "\uE40C"], /* Private Use */ + ["\uE40D", "\uE40D"], /* Private Use */ + ["\uE40E", "\uE40E"], /* Private Use */ + ["\uE40F", "\uE40F"], /* Private Use */ + ["\uE410", "\uE410"], /* Private Use */ + ["\uE411", "\uE411"], /* Private Use */ + ["\uE412", "\uE412"], /* Private Use */ + ["\uE413", "\uE413"], /* Private Use */ + ["\uE414", "\uE414"], /* Private Use */ + ["\uE415", "\uE415"], /* Private Use */ + ["\uE416", "\uE416"], /* Private Use */ + ["\uE417", "\uE417"], /* Private Use */ + ["\uE418", "\uE418"], /* Private Use */ + ["\uE419", "\uE419"], /* Private Use */ + ["\uE41A", "\uE41A"], /* Private Use */ + ["\uE41B", "\uE41B"], /* Private Use */ + ["\uE41C", "\uE41C"], /* Private Use */ + ["\uE41D", "\uE41D"], /* Private Use */ + ["\uE41E", "\uE41E"], /* Private Use */ + ["\uE41F", "\uE41F"], /* Private Use */ + ["\uE420", "\uE420"], /* Private Use */ + ["\uE421", "\uE421"], /* Private Use */ + ["\uE422", "\uE422"], /* Private Use */ + ["\uE423", "\uE423"], /* Private Use */ + ["\uE424", "\uE424"], /* Private Use */ + ["\uE425", "\uE425"], /* Private Use */ + ["\uE426", "\uE426"], /* Private Use */ + ["\uE427", "\uE427"], /* Private Use */ + ["\uE428", "\uE428"], /* Private Use */ + ["\uE429", "\uE429"], /* Private Use */ + ["\uE42A", "\uE42A"], /* Private Use */ + ["\uE42B", "\uE42B"], /* Private Use */ + ["\uE42C", "\uE42C"], /* Private Use */ + ["\uE42D", "\uE42D"], /* Private Use */ + ["\uE42E", "\uE42E"], /* Private Use */ + ["\uE42F", "\uE42F"], /* Private Use */ + ["\uE430", "\uE430"], /* Private Use */ + ["\uE431", "\uE431"], /* Private Use */ + ["\uE432", "\uE432"], /* Private Use */ + ["\uE433", "\uE433"], /* Private Use */ + ["\uE434", "\uE434"], /* Private Use */ + ["\uE435", "\uE435"], /* Private Use */ + ["\uE436", "\uE436"], /* Private Use */ + ["\uE437", "\uE437"], /* Private Use */ + ["\uE438", "\uE438"], /* Private Use */ + ["\uE439", "\uE439"], /* Private Use */ + ["\uE43A", "\uE43A"], /* Private Use */ + ["\uE43B", "\uE43B"], /* Private Use */ + ["\uE43C", "\uE43C"], /* Private Use */ + ["\uE43D", "\uE43D"], /* Private Use */ + ["\uE43E", "\uE43E"], /* Private Use */ + ["\uE43F", "\uE43F"], /* Private Use */ + ["\uE440", "\uE440"], /* Private Use */ + ["\uE441", "\uE441"], /* Private Use */ + ["\uE442", "\uE442"], /* Private Use */ + ["\uE443", "\uE443"], /* Private Use */ + ["\uE444", "\uE444"], /* Private Use */ + ["\uE445", "\uE445"], /* Private Use */ + ["\uE446", "\uE446"], /* Private Use */ + ["\uE447", "\uE447"], /* Private Use */ + ["\uE448", "\uE448"], /* Private Use */ + ["\uE449", "\uE449"], /* Private Use */ + ["\uE44A", "\uE44A"], /* Private Use */ + ["\uE44B", "\uE44B"], /* Private Use */ + ["\uE44C", "\uE44C"], /* Private Use */ + ["\uE44D", "\uE44D"], /* Private Use */ + ["\uE44E", "\uE44E"], /* Private Use */ + ["\uE44F", "\uE44F"], /* Private Use */ + ["\uE450", "\uE450"], /* Private Use */ + ["\uE451", "\uE451"], /* Private Use */ + ["\uE452", "\uE452"], /* Private Use */ + ["\uE453", "\uE453"], /* Private Use */ + ["\uE454", "\uE454"], /* Private Use */ + ["\uE455", "\uE455"], /* Private Use */ + ["\uE456", "\uE456"], /* Private Use */ + ["\uE457", "\uE457"], /* Private Use */ + ["\uE458", "\uE458"], /* Private Use */ + ["\uE459", "\uE459"], /* Private Use */ + ["\uE45A", "\uE45A"], /* Private Use */ + ["\uE45B", "\uE45B"], /* Private Use */ + ["\uE45C", "\uE45C"], /* Private Use */ + ["\uE45D", "\uE45D"], /* Private Use */ + ["\uE45E", "\uE45E"], /* Private Use */ + ["\uE45F", "\uE45F"], /* Private Use */ + ["\uE460", "\uE460"], /* Private Use */ + ["\uE461", "\uE461"], /* Private Use */ + ["\uE462", "\uE462"], /* Private Use */ + ["\uE463", "\uE463"], /* Private Use */ + ["\uE464", "\uE464"], /* Private Use */ + ["\uE465", "\uE465"], /* Private Use */ + ["\uE466", "\uE466"], /* Private Use */ + ["\uE467", "\uE467"], /* Private Use */ + ["\uE468", "\uE468"], /* Private Use */ + ["\uE469", "\uE469"], /* Private Use */ + ["\uE46A", "\uE46A"], /* Private Use */ + ["\uE46B", "\uE46B"], /* Private Use */ + ["\uE46C", "\uE46C"], /* Private Use */ + ["\uE46D", "\uE46D"], /* Private Use */ + ["\uE46E", "\uE46E"], /* Private Use */ + ["\uE46F", "\uE46F"], /* Private Use */ + ["\uE470", "\uE470"], /* Private Use */ + ["\uE471", "\uE471"], /* Private Use */ + ["\uE472", "\uE472"], /* Private Use */ + ["\uE473", "\uE473"], /* Private Use */ + ["\uE474", "\uE474"], /* Private Use */ + ["\uE475", "\uE475"], /* Private Use */ + ["\uE476", "\uE476"], /* Private Use */ + ["\uE477", "\uE477"], /* Private Use */ + ["\uE478", "\uE478"], /* Private Use */ + ["\uE479", "\uE479"], /* Private Use */ + ["\uE47A", "\uE47A"], /* Private Use */ + ["\uE47B", "\uE47B"], /* Private Use */ + ["\uE47C", "\uE47C"], /* Private Use */ + ["\uE47D", "\uE47D"], /* Private Use */ + ["\uE47E", "\uE47E"], /* Private Use */ + ["\uE47F", "\uE47F"], /* Private Use */ + ["\uE480", "\uE480"], /* Private Use */ + ["\uE481", "\uE481"], /* Private Use */ + ["\uE482", "\uE482"], /* Private Use */ + ["\uE483", "\uE483"], /* Private Use */ + ["\uE484", "\uE484"], /* Private Use */ + ["\uE485", "\uE485"], /* Private Use */ + ["\uE486", "\uE486"], /* Private Use */ + ["\uE487", "\uE487"], /* Private Use */ + ["\uE488", "\uE488"], /* Private Use */ + ["\uE489", "\uE489"], /* Private Use */ + ["\uE48A", "\uE48A"], /* Private Use */ + ["\uE48B", "\uE48B"], /* Private Use */ + ["\uE48C", "\uE48C"], /* Private Use */ + ["\uE48D", "\uE48D"], /* Private Use */ + ["\uE48E", "\uE48E"], /* Private Use */ + ["\uE48F", "\uE48F"], /* Private Use */ + ["\uE490", "\uE490"], /* Private Use */ + ["\uE491", "\uE491"], /* Private Use */ + ["\uE492", "\uE492"], /* Private Use */ + ["\uE493", "\uE493"], /* Private Use */ + ["\uE494", "\uE494"], /* Private Use */ + ["\uE495", "\uE495"], /* Private Use */ + ["\uE496", "\uE496"], /* Private Use */ + ["\uE497", "\uE497"], /* Private Use */ + ["\uE498", "\uE498"], /* Private Use */ + ["\uE499", "\uE499"], /* Private Use */ + ["\uE49A", "\uE49A"], /* Private Use */ + ["\uE49B", "\uE49B"], /* Private Use */ + ["\uE49C", "\uE49C"], /* Private Use */ + ["\uE49D", "\uE49D"], /* Private Use */ + ["\uE49E", "\uE49E"], /* Private Use */ + ["\uE49F", "\uE49F"], /* Private Use */ + ["\uE4A0", "\uE4A0"], /* Private Use */ + ["\uE4A1", "\uE4A1"], /* Private Use */ + ["\uE4A2", "\uE4A2"], /* Private Use */ + ["\uE4A3", "\uE4A3"], /* Private Use */ + ["\uE4A4", "\uE4A4"], /* Private Use */ + ["\uE4A5", "\uE4A5"], /* Private Use */ + ["\uE4A6", "\uE4A6"], /* Private Use */ + ["\uE4A7", "\uE4A7"], /* Private Use */ + ["\uE4A8", "\uE4A8"], /* Private Use */ + ["\uE4A9", "\uE4A9"], /* Private Use */ + ["\uE4AA", "\uE4AA"], /* Private Use */ + ["\uE4AB", "\uE4AB"], /* Private Use */ + ["\uE4AC", "\uE4AC"], /* Private Use */ + ["\uE4AD", "\uE4AD"], /* Private Use */ + ["\uE4AE", "\uE4AE"], /* Private Use */ + ["\uE4AF", "\uE4AF"], /* Private Use */ + ["\uE4B0", "\uE4B0"], /* Private Use */ + ["\uE4B1", "\uE4B1"], /* Private Use */ + ["\uE4B2", "\uE4B2"], /* Private Use */ + ["\uE4B3", "\uE4B3"], /* Private Use */ + ["\uE4B4", "\uE4B4"], /* Private Use */ + ["\uE4B5", "\uE4B5"], /* Private Use */ + ["\uE4B6", "\uE4B6"], /* Private Use */ + ["\uE4B7", "\uE4B7"], /* Private Use */ + ["\uE4B8", "\uE4B8"], /* Private Use */ + ["\uE4B9", "\uE4B9"], /* Private Use */ + ["\uE4BA", "\uE4BA"], /* Private Use */ + ["\uE4BB", "\uE4BB"], /* Private Use */ + ["\uE4BC", "\uE4BC"], /* Private Use */ + ["\uE4BD", "\uE4BD"], /* Private Use */ + ["\uE4BE", "\uE4BE"], /* Private Use */ + ["\uE4BF", "\uE4BF"], /* Private Use */ + ["\uE4C0", "\uE4C0"], /* Private Use */ + ["\uE4C1", "\uE4C1"], /* Private Use */ + ["\uE4C2", "\uE4C2"], /* Private Use */ + ["\uE4C3", "\uE4C3"], /* Private Use */ + ["\uE4C4", "\uE4C4"], /* Private Use */ + ["\uE4C5", "\uE4C5"], /* Private Use */ + ["\uE4C6", "\uE4C6"], /* Private Use */ + ["\uE4C7", "\uE4C7"], /* Private Use */ + ["\uE4C8", "\uE4C8"], /* Private Use */ + ["\uE4C9", "\uE4C9"], /* Private Use */ + ["\uE4CA", "\uE4CA"], /* Private Use */ + ["\uE4CB", "\uE4CB"], /* Private Use */ + ["\uE4CC", "\uE4CC"], /* Private Use */ + ["\uE4CD", "\uE4CD"], /* Private Use */ + ["\uE4CE", "\uE4CE"], /* Private Use */ + ["\uE4CF", "\uE4CF"], /* Private Use */ + ["\uE4D0", "\uE4D0"], /* Private Use */ + ["\uE4D1", "\uE4D1"], /* Private Use */ + ["\uE4D2", "\uE4D2"], /* Private Use */ + ["\uE4D3", "\uE4D3"], /* Private Use */ + ["\uE4D4", "\uE4D4"], /* Private Use */ + ["\uE4D5", "\uE4D5"], /* Private Use */ + ["\uE4D6", "\uE4D6"], /* Private Use */ + ["\uE4D7", "\uE4D7"], /* Private Use */ + ["\uE4D8", "\uE4D8"], /* Private Use */ + ["\uE4D9", "\uE4D9"], /* Private Use */ + ["\uE4DA", "\uE4DA"], /* Private Use */ + ["\uE4DB", "\uE4DB"], /* Private Use */ + ["\uE4DC", "\uE4DC"], /* Private Use */ + ["\uE4DD", "\uE4DD"], /* Private Use */ + ["\uE4DE", "\uE4DE"], /* Private Use */ + ["\uE4DF", "\uE4DF"], /* Private Use */ + ["\uE4E0", "\uE4E0"], /* Private Use */ + ["\uE4E1", "\uE4E1"], /* Private Use */ + ["\uE4E2", "\uE4E2"], /* Private Use */ + ["\uE4E3", "\uE4E3"], /* Private Use */ + ["\uE4E4", "\uE4E4"], /* Private Use */ + ["\uE4E5", "\uE4E5"], /* Private Use */ + ["\uE4E6", "\uE4E6"], /* Private Use */ + ["\uE4E7", "\uE4E7"], /* Private Use */ + ["\uE4E8", "\uE4E8"], /* Private Use */ + ["\uE4E9", "\uE4E9"], /* Private Use */ + ["\uE4EA", "\uE4EA"], /* Private Use */ + ["\uE4EB", "\uE4EB"], /* Private Use */ + ["\uE4EC", "\uE4EC"], /* Private Use */ + ["\uE4ED", "\uE4ED"], /* Private Use */ + ["\uE4EE", "\uE4EE"], /* Private Use */ + ["\uE4EF", "\uE4EF"], /* Private Use */ + ["\uE4F0", "\uE4F0"], /* Private Use */ + ["\uE4F1", "\uE4F1"], /* Private Use */ + ["\uE4F2", "\uE4F2"], /* Private Use */ + ["\uE4F3", "\uE4F3"], /* Private Use */ + ["\uE4F4", "\uE4F4"], /* Private Use */ + ["\uE4F5", "\uE4F5"], /* Private Use */ + ["\uE4F6", "\uE4F6"], /* Private Use */ + ["\uE4F7", "\uE4F7"], /* Private Use */ + ["\uE4F8", "\uE4F8"], /* Private Use */ + ["\uE4F9", "\uE4F9"], /* Private Use */ + ["\uE4FA", "\uE4FA"], /* Private Use */ + ["\uE4FB", "\uE4FB"], /* Private Use */ + ["\uE4FC", "\uE4FC"], /* Private Use */ + ["\uE4FD", "\uE4FD"], /* Private Use */ + ["\uE4FE", "\uE4FE"], /* Private Use */ + ["\uE4FF", "\uE4FF"], /* Private Use */ + ["\uE500", "\uE500"], /* Private Use */ + ["\uE501", "\uE501"], /* Private Use */ + ["\uE502", "\uE502"], /* Private Use */ + ["\uE503", "\uE503"], /* Private Use */ + ["\uE504", "\uE504"], /* Private Use */ + ["\uE505", "\uE505"], /* Private Use */ + ["\uE506", "\uE506"], /* Private Use */ + ["\uE507", "\uE507"], /* Private Use */ + ["\uE508", "\uE508"], /* Private Use */ + ["\uE509", "\uE509"], /* Private Use */ + ["\uE50A", "\uE50A"], /* Private Use */ + ["\uE50B", "\uE50B"], /* Private Use */ + ["\uE50C", "\uE50C"], /* Private Use */ + ["\uE50D", "\uE50D"], /* Private Use */ + ["\uE50E", "\uE50E"], /* Private Use */ + ["\uE50F", "\uE50F"], /* Private Use */ + ["\uE510", "\uE510"], /* Private Use */ + ["\uE511", "\uE511"], /* Private Use */ + ["\uE512", "\uE512"], /* Private Use */ + ["\uE513", "\uE513"], /* Private Use */ + ["\uE514", "\uE514"], /* Private Use */ + ["\uE515", "\uE515"], /* Private Use */ + ["\uE516", "\uE516"], /* Private Use */ + ["\uE517", "\uE517"], /* Private Use */ + ["\uE518", "\uE518"], /* Private Use */ + ["\uE519", "\uE519"], /* Private Use */ + ["\uE51A", "\uE51A"], /* Private Use */ + ["\uE51B", "\uE51B"], /* Private Use */ + ["\uE51C", "\uE51C"], /* Private Use */ + ["\uE51D", "\uE51D"], /* Private Use */ + ["\uE51E", "\uE51E"], /* Private Use */ + ["\uE51F", "\uE51F"], /* Private Use */ + ["\uE520", "\uE520"], /* Private Use */ + ["\uE521", "\uE521"], /* Private Use */ + ["\uE522", "\uE522"], /* Private Use */ + ["\uE523", "\uE523"], /* Private Use */ + ["\uE524", "\uE524"], /* Private Use */ + ["\uE525", "\uE525"], /* Private Use */ + ["\uE526", "\uE526"], /* Private Use */ + ["\uE527", "\uE527"], /* Private Use */ + ["\uE528", "\uE528"], /* Private Use */ + ["\uE529", "\uE529"], /* Private Use */ + ["\uE52A", "\uE52A"], /* Private Use */ + ["\uE52B", "\uE52B"], /* Private Use */ + ["\uE52C", "\uE52C"], /* Private Use */ + ["\uE52D", "\uE52D"], /* Private Use */ + ["\uE52E", "\uE52E"], /* Private Use */ + ["\uE52F", "\uE52F"], /* Private Use */ + ["\uE530", "\uE530"], /* Private Use */ + ["\uE531", "\uE531"], /* Private Use */ + ["\uE532", "\uE532"], /* Private Use */ + ["\uE533", "\uE533"], /* Private Use */ + ["\uE534", "\uE534"], /* Private Use */ + ["\uE535", "\uE535"], /* Private Use */ + ["\uE536", "\uE536"], /* Private Use */ + ["\uE537", "\uE537"], /* Private Use */ + ["\uE538", "\uE538"], /* Private Use */ + ["\uE539", "\uE539"], /* Private Use */ + ["\uE53A", "\uE53A"], /* Private Use */ + ["\uE53B", "\uE53B"], /* Private Use */ + ["\uE53C", "\uE53C"], /* Private Use */ + ["\uE53D", "\uE53D"], /* Private Use */ + ["\uE53E", "\uE53E"], /* Private Use */ + ["\uE53F", "\uE53F"], /* Private Use */ + ["\uE540", "\uE540"], /* Private Use */ + ["\uE541", "\uE541"], /* Private Use */ + ["\uE542", "\uE542"], /* Private Use */ + ["\uE543", "\uE543"], /* Private Use */ + ["\uE544", "\uE544"], /* Private Use */ + ["\uE545", "\uE545"], /* Private Use */ + ["\uE546", "\uE546"], /* Private Use */ + ["\uE547", "\uE547"], /* Private Use */ + ["\uE548", "\uE548"], /* Private Use */ + ["\uE549", "\uE549"], /* Private Use */ + ["\uE54A", "\uE54A"], /* Private Use */ + ["\uE54B", "\uE54B"], /* Private Use */ + ["\uE54C", "\uE54C"], /* Private Use */ + ["\uE54D", "\uE54D"], /* Private Use */ + ["\uE54E", "\uE54E"], /* Private Use */ + ["\uE54F", "\uE54F"], /* Private Use */ + ["\uE550", "\uE550"], /* Private Use */ + ["\uE551", "\uE551"], /* Private Use */ + ["\uE552", "\uE552"], /* Private Use */ + ["\uE553", "\uE553"], /* Private Use */ + ["\uE554", "\uE554"], /* Private Use */ + ["\uE555", "\uE555"], /* Private Use */ + ["\uE556", "\uE556"], /* Private Use */ + ["\uE557", "\uE557"], /* Private Use */ + ["\uE558", "\uE558"], /* Private Use */ + ["\uE559", "\uE559"], /* Private Use */ + ["\uE55A", "\uE55A"], /* Private Use */ + ["\uE55B", "\uE55B"], /* Private Use */ + ["\uE55C", "\uE55C"], /* Private Use */ + ["\uE55D", "\uE55D"], /* Private Use */ + ["\uE55E", "\uE55E"], /* Private Use */ + ["\uE55F", "\uE55F"], /* Private Use */ + ["\uE560", "\uE560"], /* Private Use */ + ["\uE561", "\uE561"], /* Private Use */ + ["\uE562", "\uE562"], /* Private Use */ + ["\uE563", "\uE563"], /* Private Use */ + ["\uE564", "\uE564"], /* Private Use */ + ["\uE565", "\uE565"], /* Private Use */ + ["\uE566", "\uE566"], /* Private Use */ + ["\uE567", "\uE567"], /* Private Use */ + ["\uE568", "\uE568"], /* Private Use */ + ["\uE569", "\uE569"], /* Private Use */ + ["\uE56A", "\uE56A"], /* Private Use */ + ["\uE56B", "\uE56B"], /* Private Use */ + ["\uE56C", "\uE56C"], /* Private Use */ + ["\uE56D", "\uE56D"], /* Private Use */ + ["\uE56E", "\uE56E"], /* Private Use */ + ["\uE56F", "\uE56F"], /* Private Use */ + ["\uE570", "\uE570"], /* Private Use */ + ["\uE571", "\uE571"], /* Private Use */ + ["\uE572", "\uE572"], /* Private Use */ + ["\uE573", "\uE573"], /* Private Use */ + ["\uE574", "\uE574"], /* Private Use */ + ["\uE575", "\uE575"], /* Private Use */ + ["\uE576", "\uE576"], /* Private Use */ + ["\uE577", "\uE577"], /* Private Use */ + ["\uE578", "\uE578"], /* Private Use */ + ["\uE579", "\uE579"], /* Private Use */ + ["\uE57A", "\uE57A"], /* Private Use */ + ["\uE57B", "\uE57B"], /* Private Use */ + ["\uE57C", "\uE57C"], /* Private Use */ + ["\uE57D", "\uE57D"], /* Private Use */ + ["\uE57E", "\uE57E"], /* Private Use */ + ["\uE57F", "\uE57F"], /* Private Use */ + ["\uE580", "\uE580"], /* Private Use */ + ["\uE581", "\uE581"], /* Private Use */ + ["\uE582", "\uE582"], /* Private Use */ + ["\uE583", "\uE583"], /* Private Use */ + ["\uE584", "\uE584"], /* Private Use */ + ["\uE585", "\uE585"], /* Private Use */ + ["\uE586", "\uE586"], /* Private Use */ + ["\uE587", "\uE587"], /* Private Use */ + ["\uE588", "\uE588"], /* Private Use */ + ["\uE589", "\uE589"], /* Private Use */ + ["\uE58A", "\uE58A"], /* Private Use */ + ["\uE58B", "\uE58B"], /* Private Use */ + ["\uE58C", "\uE58C"], /* Private Use */ + ["\uE58D", "\uE58D"], /* Private Use */ + ["\uE58E", "\uE58E"], /* Private Use */ + ["\uE58F", "\uE58F"], /* Private Use */ + ["\uE590", "\uE590"], /* Private Use */ + ["\uE591", "\uE591"], /* Private Use */ + ["\uE592", "\uE592"], /* Private Use */ + ["\uE593", "\uE593"], /* Private Use */ + ["\uE594", "\uE594"], /* Private Use */ + ["\uE595", "\uE595"], /* Private Use */ + ["\uE596", "\uE596"], /* Private Use */ + ["\uE597", "\uE597"], /* Private Use */ + ["\uE598", "\uE598"], /* Private Use */ + ["\uE599", "\uE599"], /* Private Use */ + ["\uE59A", "\uE59A"], /* Private Use */ + ["\uE59B", "\uE59B"], /* Private Use */ + ["\uE59C", "\uE59C"], /* Private Use */ + ["\uE59D", "\uE59D"], /* Private Use */ + ["\uE59E", "\uE59E"], /* Private Use */ + ["\uE59F", "\uE59F"], /* Private Use */ + ["\uE5A0", "\uE5A0"], /* Private Use */ + ["\uE5A1", "\uE5A1"], /* Private Use */ + ["\uE5A2", "\uE5A2"], /* Private Use */ + ["\uE5A3", "\uE5A3"], /* Private Use */ + ["\uE5A4", "\uE5A4"], /* Private Use */ + ["\uE5A5", "\uE5A5"], /* Private Use */ + ["\uE5A6", "\uE5A6"], /* Private Use */ + ["\uE5A7", "\uE5A7"], /* Private Use */ + ["\uE5A8", "\uE5A8"], /* Private Use */ + ["\uE5A9", "\uE5A9"], /* Private Use */ + ["\uE5AA", "\uE5AA"], /* Private Use */ + ["\uE5AB", "\uE5AB"], /* Private Use */ + ["\uE5AC", "\uE5AC"], /* Private Use */ + ["\uE5AD", "\uE5AD"], /* Private Use */ + ["\uE5AE", "\uE5AE"], /* Private Use */ + ["\uE5AF", "\uE5AF"], /* Private Use */ + ["\uE5B0", "\uE5B0"], /* Private Use */ + ["\uE5B1", "\uE5B1"], /* Private Use */ + ["\uE5B2", "\uE5B2"], /* Private Use */ + ["\uE5B3", "\uE5B3"], /* Private Use */ + ["\uE5B4", "\uE5B4"], /* Private Use */ + ["\uE5B5", "\uE5B5"], /* Private Use */ + ["\uE5B6", "\uE5B6"], /* Private Use */ + ["\uE5B7", "\uE5B7"], /* Private Use */ + ["\uE5B8", "\uE5B8"], /* Private Use */ + ["\uE5B9", "\uE5B9"], /* Private Use */ + ["\uE5BA", "\uE5BA"], /* Private Use */ + ["\uE5BB", "\uE5BB"], /* Private Use */ + ["\uE5BC", "\uE5BC"], /* Private Use */ + ["\uE5BD", "\uE5BD"], /* Private Use */ + ["\uE5BE", "\uE5BE"], /* Private Use */ + ["\uE5BF", "\uE5BF"], /* Private Use */ + ["\uE5C0", "\uE5C0"], /* Private Use */ + ["\uE5C1", "\uE5C1"], /* Private Use */ + ["\uE5C2", "\uE5C2"], /* Private Use */ + ["\uE5C3", "\uE5C3"], /* Private Use */ + ["\uE5C4", "\uE5C4"], /* Private Use */ + ["\uE5C5", "\uE5C5"], /* Private Use */ + ["\uE5C6", "\uE5C6"], /* Private Use */ + ["\uE5C7", "\uE5C7"], /* Private Use */ + ["\uE5C8", "\uE5C8"], /* Private Use */ + ["\uE5C9", "\uE5C9"], /* Private Use */ + ["\uE5CA", "\uE5CA"], /* Private Use */ + ["\uE5CB", "\uE5CB"], /* Private Use */ + ["\uE5CC", "\uE5CC"], /* Private Use */ + ["\uE5CD", "\uE5CD"], /* Private Use */ + ["\uE5CE", "\uE5CE"], /* Private Use */ + ["\uE5CF", "\uE5CF"], /* Private Use */ + ["\uE5D0", "\uE5D0"], /* Private Use */ + ["\uE5D1", "\uE5D1"], /* Private Use */ + ["\uE5D2", "\uE5D2"], /* Private Use */ + ["\uE5D3", "\uE5D3"], /* Private Use */ + ["\uE5D4", "\uE5D4"], /* Private Use */ + ["\uE5D5", "\uE5D5"], /* Private Use */ + ["\uE5D6", "\uE5D6"], /* Private Use */ + ["\uE5D7", "\uE5D7"], /* Private Use */ + ["\uE5D8", "\uE5D8"], /* Private Use */ + ["\uE5D9", "\uE5D9"], /* Private Use */ + ["\uE5DA", "\uE5DA"], /* Private Use */ + ["\uE5DB", "\uE5DB"], /* Private Use */ + ["\uE5DC", "\uE5DC"], /* Private Use */ + ["\uE5DD", "\uE5DD"], /* Private Use */ + ["\uE5DE", "\uE5DE"], /* Private Use */ + ["\uE5DF", "\uE5DF"], /* Private Use */ + ["\uE5E0", "\uE5E0"], /* Private Use */ + ["\uE5E1", "\uE5E1"], /* Private Use */ + ["\uE5E2", "\uE5E2"], /* Private Use */ + ["\uE5E3", "\uE5E3"], /* Private Use */ + ["\uE5E4", "\uE5E4"], /* Private Use */ + ["\uE5E5", "\uE5E5"], /* Private Use */ + ["\uE5E6", "\uE5E6"], /* Private Use */ + ["\uE5E7", "\uE5E7"], /* Private Use */ + ["\uE5E8", "\uE5E8"], /* Private Use */ + ["\uE5E9", "\uE5E9"], /* Private Use */ + ["\uE5EA", "\uE5EA"], /* Private Use */ + ["\uE5EB", "\uE5EB"], /* Private Use */ + ["\uE5EC", "\uE5EC"], /* Private Use */ + ["\uE5ED", "\uE5ED"], /* Private Use */ + ["\uE5EE", "\uE5EE"], /* Private Use */ + ["\uE5EF", "\uE5EF"], /* Private Use */ + ["\uE5F0", "\uE5F0"], /* Private Use */ + ["\uE5F1", "\uE5F1"], /* Private Use */ + ["\uE5F2", "\uE5F2"], /* Private Use */ + ["\uE5F3", "\uE5F3"], /* Private Use */ + ["\uE5F4", "\uE5F4"], /* Private Use */ + ["\uE5F5", "\uE5F5"], /* Private Use */ + ["\uE5F6", "\uE5F6"], /* Private Use */ + ["\uE5F7", "\uE5F7"], /* Private Use */ + ["\uE5F8", "\uE5F8"], /* Private Use */ + ["\uE5F9", "\uE5F9"], /* Private Use */ + ["\uE5FA", "\uE5FA"], /* Private Use */ + ["\uE5FB", "\uE5FB"], /* Private Use */ + ["\uE5FC", "\uE5FC"], /* Private Use */ + ["\uE5FD", "\uE5FD"], /* Private Use */ + ["\uE5FE", "\uE5FE"], /* Private Use */ + ["\uE5FF", "\uE5FF"], /* Private Use */ + ["\uE600", "\uE600"], /* Private Use */ + ["\uE601", "\uE601"], /* Private Use */ + ["\uE602", "\uE602"], /* Private Use */ + ["\uE603", "\uE603"], /* Private Use */ + ["\uE604", "\uE604"], /* Private Use */ + ["\uE605", "\uE605"], /* Private Use */ + ["\uE606", "\uE606"], /* Private Use */ + ["\uE607", "\uE607"], /* Private Use */ + ["\uE608", "\uE608"], /* Private Use */ + ["\uE609", "\uE609"], /* Private Use */ + ["\uE60A", "\uE60A"], /* Private Use */ + ["\uE60B", "\uE60B"], /* Private Use */ + ["\uE60C", "\uE60C"], /* Private Use */ + ["\uE60D", "\uE60D"], /* Private Use */ + ["\uE60E", "\uE60E"], /* Private Use */ + ["\uE60F", "\uE60F"], /* Private Use */ + ["\uE610", "\uE610"], /* Private Use */ + ["\uE611", "\uE611"], /* Private Use */ + ["\uE612", "\uE612"], /* Private Use */ + ["\uE613", "\uE613"], /* Private Use */ + ["\uE614", "\uE614"], /* Private Use */ + ["\uE615", "\uE615"], /* Private Use */ + ["\uE616", "\uE616"], /* Private Use */ + ["\uE617", "\uE617"], /* Private Use */ + ["\uE618", "\uE618"], /* Private Use */ + ["\uE619", "\uE619"], /* Private Use */ + ["\uE61A", "\uE61A"], /* Private Use */ + ["\uE61B", "\uE61B"], /* Private Use */ + ["\uE61C", "\uE61C"], /* Private Use */ + ["\uE61D", "\uE61D"], /* Private Use */ + ["\uE61E", "\uE61E"], /* Private Use */ + ["\uE61F", "\uE61F"], /* Private Use */ + ["\uE620", "\uE620"], /* Private Use */ + ["\uE621", "\uE621"], /* Private Use */ + ["\uE622", "\uE622"], /* Private Use */ + ["\uE623", "\uE623"], /* Private Use */ + ["\uE624", "\uE624"], /* Private Use */ + ["\uE625", "\uE625"], /* Private Use */ + ["\uE626", "\uE626"], /* Private Use */ + ["\uE627", "\uE627"], /* Private Use */ + ["\uE628", "\uE628"], /* Private Use */ + ["\uE629", "\uE629"], /* Private Use */ + ["\uE62A", "\uE62A"], /* Private Use */ + ["\uE62B", "\uE62B"], /* Private Use */ + ["\uE62C", "\uE62C"], /* Private Use */ + ["\uE62D", "\uE62D"], /* Private Use */ + ["\uE62E", "\uE62E"], /* Private Use */ + ["\uE62F", "\uE62F"], /* Private Use */ + ["\uE630", "\uE630"], /* Private Use */ + ["\uE631", "\uE631"], /* Private Use */ + ["\uE632", "\uE632"], /* Private Use */ + ["\uE633", "\uE633"], /* Private Use */ + ["\uE634", "\uE634"], /* Private Use */ + ["\uE635", "\uE635"], /* Private Use */ + ["\uE636", "\uE636"], /* Private Use */ + ["\uE637", "\uE637"], /* Private Use */ + ["\uE638", "\uE638"], /* Private Use */ + ["\uE639", "\uE639"], /* Private Use */ + ["\uE63A", "\uE63A"], /* Private Use */ + ["\uE63B", "\uE63B"], /* Private Use */ + ["\uE63C", "\uE63C"], /* Private Use */ + ["\uE63D", "\uE63D"], /* Private Use */ + ["\uE63E", "\uE63E"], /* Private Use */ + ["\uE63F", "\uE63F"], /* Private Use */ + ["\uE640", "\uE640"], /* Private Use */ + ["\uE641", "\uE641"], /* Private Use */ + ["\uE642", "\uE642"], /* Private Use */ + ["\uE643", "\uE643"], /* Private Use */ + ["\uE644", "\uE644"], /* Private Use */ + ["\uE645", "\uE645"], /* Private Use */ + ["\uE646", "\uE646"], /* Private Use */ + ["\uE647", "\uE647"], /* Private Use */ + ["\uE648", "\uE648"], /* Private Use */ + ["\uE649", "\uE649"], /* Private Use */ + ["\uE64A", "\uE64A"], /* Private Use */ + ["\uE64B", "\uE64B"], /* Private Use */ + ["\uE64C", "\uE64C"], /* Private Use */ + ["\uE64D", "\uE64D"], /* Private Use */ + ["\uE64E", "\uE64E"], /* Private Use */ + ["\uE64F", "\uE64F"], /* Private Use */ + ["\uE650", "\uE650"], /* Private Use */ + ["\uE651", "\uE651"], /* Private Use */ + ["\uE652", "\uE652"], /* Private Use */ + ["\uE653", "\uE653"], /* Private Use */ + ["\uE654", "\uE654"], /* Private Use */ + ["\uE655", "\uE655"], /* Private Use */ + ["\uE656", "\uE656"], /* Private Use */ + ["\uE657", "\uE657"], /* Private Use */ + ["\uE658", "\uE658"], /* Private Use */ + ["\uE659", "\uE659"], /* Private Use */ + ["\uE65A", "\uE65A"], /* Private Use */ + ["\uE65B", "\uE65B"], /* Private Use */ + ["\uE65C", "\uE65C"], /* Private Use */ + ["\uE65D", "\uE65D"], /* Private Use */ + ["\uE65E", "\uE65E"], /* Private Use */ + ["\uE65F", "\uE65F"], /* Private Use */ + ["\uE660", "\uE660"], /* Private Use */ + ["\uE661", "\uE661"], /* Private Use */ + ["\uE662", "\uE662"], /* Private Use */ + ["\uE663", "\uE663"], /* Private Use */ + ["\uE664", "\uE664"], /* Private Use */ + ["\uE665", "\uE665"], /* Private Use */ + ["\uE666", "\uE666"], /* Private Use */ + ["\uE667", "\uE667"], /* Private Use */ + ["\uE668", "\uE668"], /* Private Use */ + ["\uE669", "\uE669"], /* Private Use */ + ["\uE66A", "\uE66A"], /* Private Use */ + ["\uE66B", "\uE66B"], /* Private Use */ + ["\uE66C", "\uE66C"], /* Private Use */ + ["\uE66D", "\uE66D"], /* Private Use */ + ["\uE66E", "\uE66E"], /* Private Use */ + ["\uE66F", "\uE66F"], /* Private Use */ + ["\uE670", "\uE670"], /* Private Use */ + ["\uE671", "\uE671"], /* Private Use */ + ["\uE672", "\uE672"], /* Private Use */ + ["\uE673", "\uE673"], /* Private Use */ + ["\uE674", "\uE674"], /* Private Use */ + ["\uE675", "\uE675"], /* Private Use */ + ["\uE676", "\uE676"], /* Private Use */ + ["\uE677", "\uE677"], /* Private Use */ + ["\uE678", "\uE678"], /* Private Use */ + ["\uE679", "\uE679"], /* Private Use */ + ["\uE67A", "\uE67A"], /* Private Use */ + ["\uE67B", "\uE67B"], /* Private Use */ + ["\uE67C", "\uE67C"], /* Private Use */ + ["\uE67D", "\uE67D"], /* Private Use */ + ["\uE67E", "\uE67E"], /* Private Use */ + ["\uE67F", "\uE67F"], /* Private Use */ + ["\uE680", "\uE680"], /* Private Use */ + ["\uE681", "\uE681"], /* Private Use */ + ["\uE682", "\uE682"], /* Private Use */ + ["\uE683", "\uE683"], /* Private Use */ + ["\uE684", "\uE684"], /* Private Use */ + ["\uE685", "\uE685"], /* Private Use */ + ["\uE686", "\uE686"], /* Private Use */ + ["\uE687", "\uE687"], /* Private Use */ + ["\uE688", "\uE688"], /* Private Use */ + ["\uE689", "\uE689"], /* Private Use */ + ["\uE68A", "\uE68A"], /* Private Use */ + ["\uE68B", "\uE68B"], /* Private Use */ + ["\uE68C", "\uE68C"], /* Private Use */ + ["\uE68D", "\uE68D"], /* Private Use */ + ["\uE68E", "\uE68E"], /* Private Use */ + ["\uE68F", "\uE68F"], /* Private Use */ + ["\uE690", "\uE690"], /* Private Use */ + ["\uE691", "\uE691"], /* Private Use */ + ["\uE692", "\uE692"], /* Private Use */ + ["\uE693", "\uE693"], /* Private Use */ + ["\uE694", "\uE694"], /* Private Use */ + ["\uE695", "\uE695"], /* Private Use */ + ["\uE696", "\uE696"], /* Private Use */ + ["\uE697", "\uE697"], /* Private Use */ + ["\uE698", "\uE698"], /* Private Use */ + ["\uE699", "\uE699"], /* Private Use */ + ["\uE69A", "\uE69A"], /* Private Use */ + ["\uE69B", "\uE69B"], /* Private Use */ + ["\uE69C", "\uE69C"], /* Private Use */ + ["\uE69D", "\uE69D"], /* Private Use */ + ["\uE69E", "\uE69E"], /* Private Use */ + ["\uE69F", "\uE69F"], /* Private Use */ + ["\uE6A0", "\uE6A0"], /* Private Use */ + ["\uE6A1", "\uE6A1"], /* Private Use */ + ["\uE6A2", "\uE6A2"], /* Private Use */ + ["\uE6A3", "\uE6A3"], /* Private Use */ + ["\uE6A4", "\uE6A4"], /* Private Use */ + ["\uE6A5", "\uE6A5"], /* Private Use */ + ["\uE6A6", "\uE6A6"], /* Private Use */ + ["\uE6A7", "\uE6A7"], /* Private Use */ + ["\uE6A8", "\uE6A8"], /* Private Use */ + ["\uE6A9", "\uE6A9"], /* Private Use */ + ["\uE6AA", "\uE6AA"], /* Private Use */ + ["\uE6AB", "\uE6AB"], /* Private Use */ + ["\uE6AC", "\uE6AC"], /* Private Use */ + ["\uE6AD", "\uE6AD"], /* Private Use */ + ["\uE6AE", "\uE6AE"], /* Private Use */ + ["\uE6AF", "\uE6AF"], /* Private Use */ + ["\uE6B0", "\uE6B0"], /* Private Use */ + ["\uE6B1", "\uE6B1"], /* Private Use */ + ["\uE6B2", "\uE6B2"], /* Private Use */ + ["\uE6B3", "\uE6B3"], /* Private Use */ + ["\uE6B4", "\uE6B4"], /* Private Use */ + ["\uE6B5", "\uE6B5"], /* Private Use */ + ["\uE6B6", "\uE6B6"], /* Private Use */ + ["\uE6B7", "\uE6B7"], /* Private Use */ + ["\uE6B8", "\uE6B8"], /* Private Use */ + ["\uE6B9", "\uE6B9"], /* Private Use */ + ["\uE6BA", "\uE6BA"], /* Private Use */ + ["\uE6BB", "\uE6BB"], /* Private Use */ + ["\uE6BC", "\uE6BC"], /* Private Use */ + ["\uE6BD", "\uE6BD"], /* Private Use */ + ["\uE6BE", "\uE6BE"], /* Private Use */ + ["\uE6BF", "\uE6BF"], /* Private Use */ + ["\uE6C0", "\uE6C0"], /* Private Use */ + ["\uE6C1", "\uE6C1"], /* Private Use */ + ["\uE6C2", "\uE6C2"], /* Private Use */ + ["\uE6C3", "\uE6C3"], /* Private Use */ + ["\uE6C4", "\uE6C4"], /* Private Use */ + ["\uE6C5", "\uE6C5"], /* Private Use */ + ["\uE6C6", "\uE6C6"], /* Private Use */ + ["\uE6C7", "\uE6C7"], /* Private Use */ + ["\uE6C8", "\uE6C8"], /* Private Use */ + ["\uE6C9", "\uE6C9"], /* Private Use */ + ["\uE6CA", "\uE6CA"], /* Private Use */ + ["\uE6CB", "\uE6CB"], /* Private Use */ + ["\uE6CC", "\uE6CC"], /* Private Use */ + ["\uE6CD", "\uE6CD"], /* Private Use */ + ["\uE6CE", "\uE6CE"], /* Private Use */ + ["\uE6CF", "\uE6CF"], /* Private Use */ + ["\uE6D0", "\uE6D0"], /* Private Use */ + ["\uE6D1", "\uE6D1"], /* Private Use */ + ["\uE6D2", "\uE6D2"], /* Private Use */ + ["\uE6D3", "\uE6D3"], /* Private Use */ + ["\uE6D4", "\uE6D4"], /* Private Use */ + ["\uE6D5", "\uE6D5"], /* Private Use */ + ["\uE6D6", "\uE6D6"], /* Private Use */ + ["\uE6D7", "\uE6D7"], /* Private Use */ + ["\uE6D8", "\uE6D8"], /* Private Use */ + ["\uE6D9", "\uE6D9"], /* Private Use */ + ["\uE6DA", "\uE6DA"], /* Private Use */ + ["\uE6DB", "\uE6DB"], /* Private Use */ + ["\uE6DC", "\uE6DC"], /* Private Use */ + ["\uE6DD", "\uE6DD"], /* Private Use */ + ["\uE6DE", "\uE6DE"], /* Private Use */ + ["\uE6DF", "\uE6DF"], /* Private Use */ + ["\uE6E0", "\uE6E0"], /* Private Use */ + ["\uE6E1", "\uE6E1"], /* Private Use */ + ["\uE6E2", "\uE6E2"], /* Private Use */ + ["\uE6E3", "\uE6E3"], /* Private Use */ + ["\uE6E4", "\uE6E4"], /* Private Use */ + ["\uE6E5", "\uE6E5"], /* Private Use */ + ["\uE6E6", "\uE6E6"], /* Private Use */ + ["\uE6E7", "\uE6E7"], /* Private Use */ + ["\uE6E8", "\uE6E8"], /* Private Use */ + ["\uE6E9", "\uE6E9"], /* Private Use */ + ["\uE6EA", "\uE6EA"], /* Private Use */ + ["\uE6EB", "\uE6EB"], /* Private Use */ + ["\uE6EC", "\uE6EC"], /* Private Use */ + ["\uE6ED", "\uE6ED"], /* Private Use */ + ["\uE6EE", "\uE6EE"], /* Private Use */ + ["\uE6EF", "\uE6EF"], /* Private Use */ + ["\uE6F0", "\uE6F0"], /* Private Use */ + ["\uE6F1", "\uE6F1"], /* Private Use */ + ["\uE6F2", "\uE6F2"], /* Private Use */ + ["\uE6F3", "\uE6F3"], /* Private Use */ + ["\uE6F4", "\uE6F4"], /* Private Use */ + ["\uE6F5", "\uE6F5"], /* Private Use */ + ["\uE6F6", "\uE6F6"], /* Private Use */ + ["\uE6F7", "\uE6F7"], /* Private Use */ + ["\uE6F8", "\uE6F8"], /* Private Use */ + ["\uE6F9", "\uE6F9"], /* Private Use */ + ["\uE6FA", "\uE6FA"], /* Private Use */ + ["\uE6FB", "\uE6FB"], /* Private Use */ + ["\uE6FC", "\uE6FC"], /* Private Use */ + ["\uE6FD", "\uE6FD"], /* Private Use */ + ["\uE6FE", "\uE6FE"], /* Private Use */ + ["\uE6FF", "\uE6FF"], /* Private Use */ + ["\uE700", "\uE700"], /* Private Use */ + ["\uE701", "\uE701"], /* Private Use */ + ["\uE702", "\uE702"], /* Private Use */ + ["\uE703", "\uE703"], /* Private Use */ + ["\uE704", "\uE704"], /* Private Use */ + ["\uE705", "\uE705"], /* Private Use */ + ["\uE706", "\uE706"], /* Private Use */ + ["\uE707", "\uE707"], /* Private Use */ + ["\uE708", "\uE708"], /* Private Use */ + ["\uE709", "\uE709"], /* Private Use */ + ["\uE70A", "\uE70A"], /* Private Use */ + ["\uE70B", "\uE70B"], /* Private Use */ + ["\uE70C", "\uE70C"], /* Private Use */ + ["\uE70D", "\uE70D"], /* Private Use */ + ["\uE70E", "\uE70E"], /* Private Use */ + ["\uE70F", "\uE70F"], /* Private Use */ + ["\uE710", "\uE710"], /* Private Use */ + ["\uE711", "\uE711"], /* Private Use */ + ["\uE712", "\uE712"], /* Private Use */ + ["\uE713", "\uE713"], /* Private Use */ + ["\uE714", "\uE714"], /* Private Use */ + ["\uE715", "\uE715"], /* Private Use */ + ["\uE716", "\uE716"], /* Private Use */ + ["\uE717", "\uE717"], /* Private Use */ + ["\uE718", "\uE718"], /* Private Use */ + ["\uE719", "\uE719"], /* Private Use */ + ["\uE71A", "\uE71A"], /* Private Use */ + ["\uE71B", "\uE71B"], /* Private Use */ + ["\uE71C", "\uE71C"], /* Private Use */ + ["\uE71D", "\uE71D"], /* Private Use */ + ["\uE71E", "\uE71E"], /* Private Use */ + ["\uE71F", "\uE71F"], /* Private Use */ + ["\uE720", "\uE720"], /* Private Use */ + ["\uE721", "\uE721"], /* Private Use */ + ["\uE722", "\uE722"], /* Private Use */ + ["\uE723", "\uE723"], /* Private Use */ + ["\uE724", "\uE724"], /* Private Use */ + ["\uE725", "\uE725"], /* Private Use */ + ["\uE726", "\uE726"], /* Private Use */ + ["\uE727", "\uE727"], /* Private Use */ + ["\uE728", "\uE728"], /* Private Use */ + ["\uE729", "\uE729"], /* Private Use */ + ["\uE72A", "\uE72A"], /* Private Use */ + ["\uE72B", "\uE72B"], /* Private Use */ + ["\uE72C", "\uE72C"], /* Private Use */ + ["\uE72D", "\uE72D"], /* Private Use */ + ["\uE72E", "\uE72E"], /* Private Use */ + ["\uE72F", "\uE72F"], /* Private Use */ + ["\uE730", "\uE730"], /* Private Use */ + ["\uE731", "\uE731"], /* Private Use */ + ["\uE732", "\uE732"], /* Private Use */ + ["\uE733", "\uE733"], /* Private Use */ + ["\uE734", "\uE734"], /* Private Use */ + ["\uE735", "\uE735"], /* Private Use */ + ["\uE736", "\uE736"], /* Private Use */ + ["\uE737", "\uE737"], /* Private Use */ + ["\uE738", "\uE738"], /* Private Use */ + ["\uE739", "\uE739"], /* Private Use */ + ["\uE73A", "\uE73A"], /* Private Use */ + ["\uE73B", "\uE73B"], /* Private Use */ + ["\uE73C", "\uE73C"], /* Private Use */ + ["\uE73D", "\uE73D"], /* Private Use */ + ["\uE73E", "\uE73E"], /* Private Use */ + ["\uE73F", "\uE73F"], /* Private Use */ + ["\uE740", "\uE740"], /* Private Use */ + ["\uE741", "\uE741"], /* Private Use */ + ["\uE742", "\uE742"], /* Private Use */ + ["\uE743", "\uE743"], /* Private Use */ + ["\uE744", "\uE744"], /* Private Use */ + ["\uE745", "\uE745"], /* Private Use */ + ["\uE746", "\uE746"], /* Private Use */ + ["\uE747", "\uE747"], /* Private Use */ + ["\uE748", "\uE748"], /* Private Use */ + ["\uE749", "\uE749"], /* Private Use */ + ["\uE74A", "\uE74A"], /* Private Use */ + ["\uE74B", "\uE74B"], /* Private Use */ + ["\uE74C", "\uE74C"], /* Private Use */ + ["\uE74D", "\uE74D"], /* Private Use */ + ["\uE74E", "\uE74E"], /* Private Use */ + ["\uE74F", "\uE74F"], /* Private Use */ + ["\uE750", "\uE750"], /* Private Use */ + ["\uE751", "\uE751"], /* Private Use */ + ["\uE752", "\uE752"], /* Private Use */ + ["\uE753", "\uE753"], /* Private Use */ + ["\uE754", "\uE754"], /* Private Use */ + ["\uE755", "\uE755"], /* Private Use */ + ["\uE756", "\uE756"], /* Private Use */ + ["\uE757", "\uE757"], /* Private Use */ + ["\uE758", "\uE758"], /* Private Use */ + ["\uE759", "\uE759"], /* Private Use */ + ["\uE75A", "\uE75A"], /* Private Use */ + ["\uE75B", "\uE75B"], /* Private Use */ + ["\uE75C", "\uE75C"], /* Private Use */ + ["\uE75D", "\uE75D"], /* Private Use */ + ["\uE75E", "\uE75E"], /* Private Use */ + ["\uE75F", "\uE75F"], /* Private Use */ + ["\uE760", "\uE760"], /* Private Use */ + ["\uE761", "\uE761"], /* Private Use */ + ["\uE762", "\uE762"], /* Private Use */ + ["\uE763", "\uE763"], /* Private Use */ + ["\uE764", "\uE764"], /* Private Use */ + ["\uE765", "\uE765"], /* Private Use */ + ["\uE766", "\uE766"], /* Private Use */ + ["\uE767", "\uE767"], /* Private Use */ + ["\uE768", "\uE768"], /* Private Use */ + ["\uE769", "\uE769"], /* Private Use */ + ["\uE76A", "\uE76A"], /* Private Use */ + ["\uE76B", "\uE76B"], /* Private Use */ + ["\uE76C", "\uE76C"], /* Private Use */ + ["\uE76D", "\uE76D"], /* Private Use */ + ["\uE76E", "\uE76E"], /* Private Use */ + ["\uE76F", "\uE76F"], /* Private Use */ + ["\uE770", "\uE770"], /* Private Use */ + ["\uE771", "\uE771"], /* Private Use */ + ["\uE772", "\uE772"], /* Private Use */ + ["\uE773", "\uE773"], /* Private Use */ + ["\uE774", "\uE774"], /* Private Use */ + ["\uE775", "\uE775"], /* Private Use */ + ["\uE776", "\uE776"], /* Private Use */ + ["\uE777", "\uE777"], /* Private Use */ + ["\uE778", "\uE778"], /* Private Use */ + ["\uE779", "\uE779"], /* Private Use */ + ["\uE77A", "\uE77A"], /* Private Use */ + ["\uE77B", "\uE77B"], /* Private Use */ + ["\uE77C", "\uE77C"], /* Private Use */ + ["\uE77D", "\uE77D"], /* Private Use */ + ["\uE77E", "\uE77E"], /* Private Use */ + ["\uE77F", "\uE77F"], /* Private Use */ + ["\uE780", "\uE780"], /* Private Use */ + ["\uE781", "\uE781"], /* Private Use */ + ["\uE782", "\uE782"], /* Private Use */ + ["\uE783", "\uE783"], /* Private Use */ + ["\uE784", "\uE784"], /* Private Use */ + ["\uE785", "\uE785"], /* Private Use */ + ["\uE786", "\uE786"], /* Private Use */ + ["\uE787", "\uE787"], /* Private Use */ + ["\uE788", "\uE788"], /* Private Use */ + ["\uE789", "\uE789"], /* Private Use */ + ["\uE78A", "\uE78A"], /* Private Use */ + ["\uE78B", "\uE78B"], /* Private Use */ + ["\uE78C", "\uE78C"], /* Private Use */ + ["\uE78D", "\uE78D"], /* Private Use */ + ["\uE78E", "\uE78E"], /* Private Use */ + ["\uE78F", "\uE78F"], /* Private Use */ + ["\uE790", "\uE790"], /* Private Use */ + ["\uE791", "\uE791"], /* Private Use */ + ["\uE792", "\uE792"], /* Private Use */ + ["\uE793", "\uE793"], /* Private Use */ + ["\uE794", "\uE794"], /* Private Use */ + ["\uE795", "\uE795"], /* Private Use */ + ["\uE796", "\uE796"], /* Private Use */ + ["\uE797", "\uE797"], /* Private Use */ + ["\uE798", "\uE798"], /* Private Use */ + ["\uE799", "\uE799"], /* Private Use */ + ["\uE79A", "\uE79A"], /* Private Use */ + ["\uE79B", "\uE79B"], /* Private Use */ + ["\uE79C", "\uE79C"], /* Private Use */ + ["\uE79D", "\uE79D"], /* Private Use */ + ["\uE79E", "\uE79E"], /* Private Use */ + ["\uE79F", "\uE79F"], /* Private Use */ + ["\uE7A0", "\uE7A0"], /* Private Use */ + ["\uE7A1", "\uE7A1"], /* Private Use */ + ["\uE7A2", "\uE7A2"], /* Private Use */ + ["\uE7A3", "\uE7A3"], /* Private Use */ + ["\uE7A4", "\uE7A4"], /* Private Use */ + ["\uE7A5", "\uE7A5"], /* Private Use */ + ["\uE7A6", "\uE7A6"], /* Private Use */ + ["\uE7A7", "\uE7A7"], /* Private Use */ + ["\uE7A8", "\uE7A8"], /* Private Use */ + ["\uE7A9", "\uE7A9"], /* Private Use */ + ["\uE7AA", "\uE7AA"], /* Private Use */ + ["\uE7AB", "\uE7AB"], /* Private Use */ + ["\uE7AC", "\uE7AC"], /* Private Use */ + ["\uE7AD", "\uE7AD"], /* Private Use */ + ["\uE7AE", "\uE7AE"], /* Private Use */ + ["\uE7AF", "\uE7AF"], /* Private Use */ + ["\uE7B0", "\uE7B0"], /* Private Use */ + ["\uE7B1", "\uE7B1"], /* Private Use */ + ["\uE7B2", "\uE7B2"], /* Private Use */ + ["\uE7B3", "\uE7B3"], /* Private Use */ + ["\uE7B4", "\uE7B4"], /* Private Use */ + ["\uE7B5", "\uE7B5"], /* Private Use */ + ["\uE7B6", "\uE7B6"], /* Private Use */ + ["\uE7B7", "\uE7B7"], /* Private Use */ + ["\uE7B8", "\uE7B8"], /* Private Use */ + ["\uE7B9", "\uE7B9"], /* Private Use */ + ["\uE7BA", "\uE7BA"], /* Private Use */ + ["\uE7BB", "\uE7BB"], /* Private Use */ + ["\uE7BC", "\uE7BC"], /* Private Use */ + ["\uE7BD", "\uE7BD"], /* Private Use */ + ["\uE7BE", "\uE7BE"], /* Private Use */ + ["\uE7BF", "\uE7BF"], /* Private Use */ + ["\uE7C0", "\uE7C0"], /* Private Use */ + ["\uE7C1", "\uE7C1"], /* Private Use */ + ["\uE7C2", "\uE7C2"], /* Private Use */ + ["\uE7C3", "\uE7C3"], /* Private Use */ + ["\uE7C4", "\uE7C4"], /* Private Use */ + ["\uE7C5", "\uE7C5"], /* Private Use */ + ["\uE7C6", "\uE7C6"], /* Private Use */ + ["\uE7C7", "\uE7C7"], /* Private Use */ + ["\uE7C8", "\uE7C8"], /* Private Use */ + ["\uE7C9", "\uE7C9"], /* Private Use */ + ["\uE7CA", "\uE7CA"], /* Private Use */ + ["\uE7CB", "\uE7CB"], /* Private Use */ + ["\uE7CC", "\uE7CC"], /* Private Use */ + ["\uE7CD", "\uE7CD"], /* Private Use */ + ["\uE7CE", "\uE7CE"], /* Private Use */ + ["\uE7CF", "\uE7CF"], /* Private Use */ + ["\uE7D0", "\uE7D0"], /* Private Use */ + ["\uE7D1", "\uE7D1"], /* Private Use */ + ["\uE7D2", "\uE7D2"], /* Private Use */ + ["\uE7D3", "\uE7D3"], /* Private Use */ + ["\uE7D4", "\uE7D4"], /* Private Use */ + ["\uE7D5", "\uE7D5"], /* Private Use */ + ["\uE7D6", "\uE7D6"], /* Private Use */ + ["\uE7D7", "\uE7D7"], /* Private Use */ + ["\uE7D8", "\uE7D8"], /* Private Use */ + ["\uE7D9", "\uE7D9"], /* Private Use */ + ["\uE7DA", "\uE7DA"], /* Private Use */ + ["\uE7DB", "\uE7DB"], /* Private Use */ + ["\uE7DC", "\uE7DC"], /* Private Use */ + ["\uE7DD", "\uE7DD"], /* Private Use */ + ["\uE7DE", "\uE7DE"], /* Private Use */ + ["\uE7DF", "\uE7DF"], /* Private Use */ + ["\uE7E0", "\uE7E0"], /* Private Use */ + ["\uE7E1", "\uE7E1"], /* Private Use */ + ["\uE7E2", "\uE7E2"], /* Private Use */ + ["\uE7E3", "\uE7E3"], /* Private Use */ + ["\uE7E4", "\uE7E4"], /* Private Use */ + ["\uE7E5", "\uE7E5"], /* Private Use */ + ["\uE7E6", "\uE7E6"], /* Private Use */ + ["\uE7E7", "\uE7E7"], /* Private Use */ + ["\uE7E8", "\uE7E8"], /* Private Use */ + ["\uE7E9", "\uE7E9"], /* Private Use */ + ["\uE7EA", "\uE7EA"], /* Private Use */ + ["\uE7EB", "\uE7EB"], /* Private Use */ + ["\uE7EC", "\uE7EC"], /* Private Use */ + ["\uE7ED", "\uE7ED"], /* Private Use */ + ["\uE7EE", "\uE7EE"], /* Private Use */ + ["\uE7EF", "\uE7EF"], /* Private Use */ + ["\uE7F0", "\uE7F0"], /* Private Use */ + ["\uE7F1", "\uE7F1"], /* Private Use */ + ["\uE7F2", "\uE7F2"], /* Private Use */ + ["\uE7F3", "\uE7F3"], /* Private Use */ + ["\uE7F4", "\uE7F4"], /* Private Use */ + ["\uE7F5", "\uE7F5"], /* Private Use */ + ["\uE7F6", "\uE7F6"], /* Private Use */ + ["\uE7F7", "\uE7F7"], /* Private Use */ + ["\uE7F8", "\uE7F8"], /* Private Use */ + ["\uE7F9", "\uE7F9"], /* Private Use */ + ["\uE7FA", "\uE7FA"], /* Private Use */ + ["\uE7FB", "\uE7FB"], /* Private Use */ + ["\uE7FC", "\uE7FC"], /* Private Use */ + ["\uE7FD", "\uE7FD"], /* Private Use */ + ["\uE7FE", "\uE7FE"], /* Private Use */ + ["\uE7FF", "\uE7FF"], /* Private Use */ + ["\uE800", "\uE800"], /* Private Use */ + ["\uE801", "\uE801"], /* Private Use */ + ["\uE802", "\uE802"], /* Private Use */ + ["\uE803", "\uE803"], /* Private Use */ + ["\uE804", "\uE804"], /* Private Use */ + ["\uE805", "\uE805"], /* Private Use */ + ["\uE806", "\uE806"], /* Private Use */ + ["\uE807", "\uE807"], /* Private Use */ + ["\uE808", "\uE808"], /* Private Use */ + ["\uE809", "\uE809"], /* Private Use */ + ["\uE80A", "\uE80A"], /* Private Use */ + ["\uE80B", "\uE80B"], /* Private Use */ + ["\uE80C", "\uE80C"], /* Private Use */ + ["\uE80D", "\uE80D"], /* Private Use */ + ["\uE80E", "\uE80E"], /* Private Use */ + ["\uE80F", "\uE80F"], /* Private Use */ + ["\uE810", "\uE810"], /* Private Use */ + ["\uE811", "\uE811"], /* Private Use */ + ["\uE812", "\uE812"], /* Private Use */ + ["\uE813", "\uE813"], /* Private Use */ + ["\uE814", "\uE814"], /* Private Use */ + ["\uE815", "\uE815"], /* Private Use */ + ["\uE816", "\uE816"], /* Private Use */ + ["\uE817", "\uE817"], /* Private Use */ + ["\uE818", "\uE818"], /* Private Use */ + ["\uE819", "\uE819"], /* Private Use */ + ["\uE81A", "\uE81A"], /* Private Use */ + ["\uE81B", "\uE81B"], /* Private Use */ + ["\uE81C", "\uE81C"], /* Private Use */ + ["\uE81D", "\uE81D"], /* Private Use */ + ["\uE81E", "\uE81E"], /* Private Use */ + ["\uE81F", "\uE81F"], /* Private Use */ + ["\uE820", "\uE820"], /* Private Use */ + ["\uE821", "\uE821"], /* Private Use */ + ["\uE822", "\uE822"], /* Private Use */ + ["\uE823", "\uE823"], /* Private Use */ + ["\uE824", "\uE824"], /* Private Use */ + ["\uE825", "\uE825"], /* Private Use */ + ["\uE826", "\uE826"], /* Private Use */ + ["\uE827", "\uE827"], /* Private Use */ + ["\uE828", "\uE828"], /* Private Use */ + ["\uE829", "\uE829"], /* Private Use */ + ["\uE82A", "\uE82A"], /* Private Use */ + ["\uE82B", "\uE82B"], /* Private Use */ + ["\uE82C", "\uE82C"], /* Private Use */ + ["\uE82D", "\uE82D"], /* Private Use */ + ["\uE82E", "\uE82E"], /* Private Use */ + ["\uE82F", "\uE82F"], /* Private Use */ + ["\uE830", "\uE830"], /* Private Use */ + ["\uE831", "\uE831"], /* Private Use */ + ["\uE832", "\uE832"], /* Private Use */ + ["\uE833", "\uE833"], /* Private Use */ + ["\uE834", "\uE834"], /* Private Use */ + ["\uE835", "\uE835"], /* Private Use */ + ["\uE836", "\uE836"], /* Private Use */ + ["\uE837", "\uE837"], /* Private Use */ + ["\uE838", "\uE838"], /* Private Use */ + ["\uE839", "\uE839"], /* Private Use */ + ["\uE83A", "\uE83A"], /* Private Use */ + ["\uE83B", "\uE83B"], /* Private Use */ + ["\uE83C", "\uE83C"], /* Private Use */ + ["\uE83D", "\uE83D"], /* Private Use */ + ["\uE83E", "\uE83E"], /* Private Use */ + ["\uE83F", "\uE83F"], /* Private Use */ + ["\uE840", "\uE840"], /* Private Use */ + ["\uE841", "\uE841"], /* Private Use */ + ["\uE842", "\uE842"], /* Private Use */ + ["\uE843", "\uE843"], /* Private Use */ + ["\uE844", "\uE844"], /* Private Use */ + ["\uE845", "\uE845"], /* Private Use */ + ["\uE846", "\uE846"], /* Private Use */ + ["\uE847", "\uE847"], /* Private Use */ + ["\uE848", "\uE848"], /* Private Use */ + ["\uE849", "\uE849"], /* Private Use */ + ["\uE84A", "\uE84A"], /* Private Use */ + ["\uE84B", "\uE84B"], /* Private Use */ + ["\uE84C", "\uE84C"], /* Private Use */ + ["\uE84D", "\uE84D"], /* Private Use */ + ["\uE84E", "\uE84E"], /* Private Use */ + ["\uE84F", "\uE84F"], /* Private Use */ + ["\uE850", "\uE850"], /* Private Use */ + ["\uE851", "\uE851"], /* Private Use */ + ["\uE852", "\uE852"], /* Private Use */ + ["\uE853", "\uE853"], /* Private Use */ + ["\uE854", "\uE854"], /* Private Use */ + ["\uE855", "\uE855"], /* Private Use */ + ["\uE856", "\uE856"], /* Private Use */ + ["\uE857", "\uE857"], /* Private Use */ + ["\uE858", "\uE858"], /* Private Use */ + ["\uE859", "\uE859"], /* Private Use */ + ["\uE85A", "\uE85A"], /* Private Use */ + ["\uE85B", "\uE85B"], /* Private Use */ + ["\uE85C", "\uE85C"], /* Private Use */ + ["\uE85D", "\uE85D"], /* Private Use */ + ["\uE85E", "\uE85E"], /* Private Use */ + ["\uE85F", "\uE85F"], /* Private Use */ + ["\uE860", "\uE860"], /* Private Use */ + ["\uE861", "\uE861"], /* Private Use */ + ["\uE862", "\uE862"], /* Private Use */ + ["\uE863", "\uE863"], /* Private Use */ + ["\uE864", "\uE864"], /* Private Use */ + ["\uE865", "\uE865"], /* Private Use */ + ["\uE866", "\uE866"], /* Private Use */ + ["\uE867", "\uE867"], /* Private Use */ + ["\uE868", "\uE868"], /* Private Use */ + ["\uE869", "\uE869"], /* Private Use */ + ["\uE86A", "\uE86A"], /* Private Use */ + ["\uE86B", "\uE86B"], /* Private Use */ + ["\uE86C", "\uE86C"], /* Private Use */ + ["\uE86D", "\uE86D"], /* Private Use */ + ["\uE86E", "\uE86E"], /* Private Use */ + ["\uE86F", "\uE86F"], /* Private Use */ + ["\uE870", "\uE870"], /* Private Use */ + ["\uE871", "\uE871"], /* Private Use */ + ["\uE872", "\uE872"], /* Private Use */ + ["\uE873", "\uE873"], /* Private Use */ + ["\uE874", "\uE874"], /* Private Use */ + ["\uE875", "\uE875"], /* Private Use */ + ["\uE876", "\uE876"], /* Private Use */ + ["\uE877", "\uE877"], /* Private Use */ + ["\uE878", "\uE878"], /* Private Use */ + ["\uE879", "\uE879"], /* Private Use */ + ["\uE87A", "\uE87A"], /* Private Use */ + ["\uE87B", "\uE87B"], /* Private Use */ + ["\uE87C", "\uE87C"], /* Private Use */ + ["\uE87D", "\uE87D"], /* Private Use */ + ["\uE87E", "\uE87E"], /* Private Use */ + ["\uE87F", "\uE87F"], /* Private Use */ + ["\uE880", "\uE880"], /* Private Use */ + ["\uE881", "\uE881"], /* Private Use */ + ["\uE882", "\uE882"], /* Private Use */ + ["\uE883", "\uE883"], /* Private Use */ + ["\uE884", "\uE884"], /* Private Use */ + ["\uE885", "\uE885"], /* Private Use */ + ["\uE886", "\uE886"], /* Private Use */ + ["\uE887", "\uE887"], /* Private Use */ + ["\uE888", "\uE888"], /* Private Use */ + ["\uE889", "\uE889"], /* Private Use */ + ["\uE88A", "\uE88A"], /* Private Use */ + ["\uE88B", "\uE88B"], /* Private Use */ + ["\uE88C", "\uE88C"], /* Private Use */ + ["\uE88D", "\uE88D"], /* Private Use */ + ["\uE88E", "\uE88E"], /* Private Use */ + ["\uE88F", "\uE88F"], /* Private Use */ + ["\uE890", "\uE890"], /* Private Use */ + ["\uE891", "\uE891"], /* Private Use */ + ["\uE892", "\uE892"], /* Private Use */ + ["\uE893", "\uE893"], /* Private Use */ + ["\uE894", "\uE894"], /* Private Use */ + ["\uE895", "\uE895"], /* Private Use */ + ["\uE896", "\uE896"], /* Private Use */ + ["\uE897", "\uE897"], /* Private Use */ + ["\uE898", "\uE898"], /* Private Use */ + ["\uE899", "\uE899"], /* Private Use */ + ["\uE89A", "\uE89A"], /* Private Use */ + ["\uE89B", "\uE89B"], /* Private Use */ + ["\uE89C", "\uE89C"], /* Private Use */ + ["\uE89D", "\uE89D"], /* Private Use */ + ["\uE89E", "\uE89E"], /* Private Use */ + ["\uE89F", "\uE89F"], /* Private Use */ + ["\uE8A0", "\uE8A0"], /* Private Use */ + ["\uE8A1", "\uE8A1"], /* Private Use */ + ["\uE8A2", "\uE8A2"], /* Private Use */ + ["\uE8A3", "\uE8A3"], /* Private Use */ + ["\uE8A4", "\uE8A4"], /* Private Use */ + ["\uE8A5", "\uE8A5"], /* Private Use */ + ["\uE8A6", "\uE8A6"], /* Private Use */ + ["\uE8A7", "\uE8A7"], /* Private Use */ + ["\uE8A8", "\uE8A8"], /* Private Use */ + ["\uE8A9", "\uE8A9"], /* Private Use */ + ["\uE8AA", "\uE8AA"], /* Private Use */ + ["\uE8AB", "\uE8AB"], /* Private Use */ + ["\uE8AC", "\uE8AC"], /* Private Use */ + ["\uE8AD", "\uE8AD"], /* Private Use */ + ["\uE8AE", "\uE8AE"], /* Private Use */ + ["\uE8AF", "\uE8AF"], /* Private Use */ + ["\uE8B0", "\uE8B0"], /* Private Use */ + ["\uE8B1", "\uE8B1"], /* Private Use */ + ["\uE8B2", "\uE8B2"], /* Private Use */ + ["\uE8B3", "\uE8B3"], /* Private Use */ + ["\uE8B4", "\uE8B4"], /* Private Use */ + ["\uE8B5", "\uE8B5"], /* Private Use */ + ["\uE8B6", "\uE8B6"], /* Private Use */ + ["\uE8B7", "\uE8B7"], /* Private Use */ + ["\uE8B8", "\uE8B8"], /* Private Use */ + ["\uE8B9", "\uE8B9"], /* Private Use */ + ["\uE8BA", "\uE8BA"], /* Private Use */ + ["\uE8BB", "\uE8BB"], /* Private Use */ + ["\uE8BC", "\uE8BC"], /* Private Use */ + ["\uE8BD", "\uE8BD"], /* Private Use */ + ["\uE8BE", "\uE8BE"], /* Private Use */ + ["\uE8BF", "\uE8BF"], /* Private Use */ + ["\uE8C0", "\uE8C0"], /* Private Use */ + ["\uE8C1", "\uE8C1"], /* Private Use */ + ["\uE8C2", "\uE8C2"], /* Private Use */ + ["\uE8C3", "\uE8C3"], /* Private Use */ + ["\uE8C4", "\uE8C4"], /* Private Use */ + ["\uE8C5", "\uE8C5"], /* Private Use */ + ["\uE8C6", "\uE8C6"], /* Private Use */ + ["\uE8C7", "\uE8C7"], /* Private Use */ + ["\uE8C8", "\uE8C8"], /* Private Use */ + ["\uE8C9", "\uE8C9"], /* Private Use */ + ["\uE8CA", "\uE8CA"], /* Private Use */ + ["\uE8CB", "\uE8CB"], /* Private Use */ + ["\uE8CC", "\uE8CC"], /* Private Use */ + ["\uE8CD", "\uE8CD"], /* Private Use */ + ["\uE8CE", "\uE8CE"], /* Private Use */ + ["\uE8CF", "\uE8CF"], /* Private Use */ + ["\uE8D0", "\uE8D0"], /* Private Use */ + ["\uE8D1", "\uE8D1"], /* Private Use */ + ["\uE8D2", "\uE8D2"], /* Private Use */ + ["\uE8D3", "\uE8D3"], /* Private Use */ + ["\uE8D4", "\uE8D4"], /* Private Use */ + ["\uE8D5", "\uE8D5"], /* Private Use */ + ["\uE8D6", "\uE8D6"], /* Private Use */ + ["\uE8D7", "\uE8D7"], /* Private Use */ + ["\uE8D8", "\uE8D8"], /* Private Use */ + ["\uE8D9", "\uE8D9"], /* Private Use */ + ["\uE8DA", "\uE8DA"], /* Private Use */ + ["\uE8DB", "\uE8DB"], /* Private Use */ + ["\uE8DC", "\uE8DC"], /* Private Use */ + ["\uE8DD", "\uE8DD"], /* Private Use */ + ["\uE8DE", "\uE8DE"], /* Private Use */ + ["\uE8DF", "\uE8DF"], /* Private Use */ + ["\uE8E0", "\uE8E0"], /* Private Use */ + ["\uE8E1", "\uE8E1"], /* Private Use */ + ["\uE8E2", "\uE8E2"], /* Private Use */ + ["\uE8E3", "\uE8E3"], /* Private Use */ + ["\uE8E4", "\uE8E4"], /* Private Use */ + ["\uE8E5", "\uE8E5"], /* Private Use */ + ["\uE8E6", "\uE8E6"], /* Private Use */ + ["\uE8E7", "\uE8E7"], /* Private Use */ + ["\uE8E8", "\uE8E8"], /* Private Use */ + ["\uE8E9", "\uE8E9"], /* Private Use */ + ["\uE8EA", "\uE8EA"], /* Private Use */ + ["\uE8EB", "\uE8EB"], /* Private Use */ + ["\uE8EC", "\uE8EC"], /* Private Use */ + ["\uE8ED", "\uE8ED"], /* Private Use */ + ["\uE8EE", "\uE8EE"], /* Private Use */ + ["\uE8EF", "\uE8EF"], /* Private Use */ + ["\uE8F0", "\uE8F0"], /* Private Use */ + ["\uE8F1", "\uE8F1"], /* Private Use */ + ["\uE8F2", "\uE8F2"], /* Private Use */ + ["\uE8F3", "\uE8F3"], /* Private Use */ + ["\uE8F4", "\uE8F4"], /* Private Use */ + ["\uE8F5", "\uE8F5"], /* Private Use */ + ["\uE8F6", "\uE8F6"], /* Private Use */ + ["\uE8F7", "\uE8F7"], /* Private Use */ + ["\uE8F8", "\uE8F8"], /* Private Use */ + ["\uE8F9", "\uE8F9"], /* Private Use */ + ["\uE8FA", "\uE8FA"], /* Private Use */ + ["\uE8FB", "\uE8FB"], /* Private Use */ + ["\uE8FC", "\uE8FC"], /* Private Use */ + ["\uE8FD", "\uE8FD"], /* Private Use */ + ["\uE8FE", "\uE8FE"], /* Private Use */ + ["\uE8FF", "\uE8FF"], /* Private Use */ + ["\uE900", "\uE900"], /* Private Use */ + ["\uE901", "\uE901"], /* Private Use */ + ["\uE902", "\uE902"], /* Private Use */ + ["\uE903", "\uE903"], /* Private Use */ + ["\uE904", "\uE904"], /* Private Use */ + ["\uE905", "\uE905"], /* Private Use */ + ["\uE906", "\uE906"], /* Private Use */ + ["\uE907", "\uE907"], /* Private Use */ + ["\uE908", "\uE908"], /* Private Use */ + ["\uE909", "\uE909"], /* Private Use */ + ["\uE90A", "\uE90A"], /* Private Use */ + ["\uE90B", "\uE90B"], /* Private Use */ + ["\uE90C", "\uE90C"], /* Private Use */ + ["\uE90D", "\uE90D"], /* Private Use */ + ["\uE90E", "\uE90E"], /* Private Use */ + ["\uE90F", "\uE90F"], /* Private Use */ + ["\uE910", "\uE910"], /* Private Use */ + ["\uE911", "\uE911"], /* Private Use */ + ["\uE912", "\uE912"], /* Private Use */ + ["\uE913", "\uE913"], /* Private Use */ + ["\uE914", "\uE914"], /* Private Use */ + ["\uE915", "\uE915"], /* Private Use */ + ["\uE916", "\uE916"], /* Private Use */ + ["\uE917", "\uE917"], /* Private Use */ + ["\uE918", "\uE918"], /* Private Use */ + ["\uE919", "\uE919"], /* Private Use */ + ["\uE91A", "\uE91A"], /* Private Use */ + ["\uE91B", "\uE91B"], /* Private Use */ + ["\uE91C", "\uE91C"], /* Private Use */ + ["\uE91D", "\uE91D"], /* Private Use */ + ["\uE91E", "\uE91E"], /* Private Use */ + ["\uE91F", "\uE91F"], /* Private Use */ + ["\uE920", "\uE920"], /* Private Use */ + ["\uE921", "\uE921"], /* Private Use */ + ["\uE922", "\uE922"], /* Private Use */ + ["\uE923", "\uE923"], /* Private Use */ + ["\uE924", "\uE924"], /* Private Use */ + ["\uE925", "\uE925"], /* Private Use */ + ["\uE926", "\uE926"], /* Private Use */ + ["\uE927", "\uE927"], /* Private Use */ + ["\uE928", "\uE928"], /* Private Use */ + ["\uE929", "\uE929"], /* Private Use */ + ["\uE92A", "\uE92A"], /* Private Use */ + ["\uE92B", "\uE92B"], /* Private Use */ + ["\uE92C", "\uE92C"], /* Private Use */ + ["\uE92D", "\uE92D"], /* Private Use */ + ["\uE92E", "\uE92E"], /* Private Use */ + ["\uE92F", "\uE92F"], /* Private Use */ + ["\uE930", "\uE930"], /* Private Use */ + ["\uE931", "\uE931"], /* Private Use */ + ["\uE932", "\uE932"], /* Private Use */ + ["\uE933", "\uE933"], /* Private Use */ + ["\uE934", "\uE934"], /* Private Use */ + ["\uE935", "\uE935"], /* Private Use */ + ["\uE936", "\uE936"], /* Private Use */ + ["\uE937", "\uE937"], /* Private Use */ + ["\uE938", "\uE938"], /* Private Use */ + ["\uE939", "\uE939"], /* Private Use */ + ["\uE93A", "\uE93A"], /* Private Use */ + ["\uE93B", "\uE93B"], /* Private Use */ + ["\uE93C", "\uE93C"], /* Private Use */ + ["\uE93D", "\uE93D"], /* Private Use */ + ["\uE93E", "\uE93E"], /* Private Use */ + ["\uE93F", "\uE93F"], /* Private Use */ + ["\uE940", "\uE940"], /* Private Use */ + ["\uE941", "\uE941"], /* Private Use */ + ["\uE942", "\uE942"], /* Private Use */ + ["\uE943", "\uE943"], /* Private Use */ + ["\uE944", "\uE944"], /* Private Use */ + ["\uE945", "\uE945"], /* Private Use */ + ["\uE946", "\uE946"], /* Private Use */ + ["\uE947", "\uE947"], /* Private Use */ + ["\uE948", "\uE948"], /* Private Use */ + ["\uE949", "\uE949"], /* Private Use */ + ["\uE94A", "\uE94A"], /* Private Use */ + ["\uE94B", "\uE94B"], /* Private Use */ + ["\uE94C", "\uE94C"], /* Private Use */ + ["\uE94D", "\uE94D"], /* Private Use */ + ["\uE94E", "\uE94E"], /* Private Use */ + ["\uE94F", "\uE94F"], /* Private Use */ + ["\uE950", "\uE950"], /* Private Use */ + ["\uE951", "\uE951"], /* Private Use */ + ["\uE952", "\uE952"], /* Private Use */ + ["\uE953", "\uE953"], /* Private Use */ + ["\uE954", "\uE954"], /* Private Use */ + ["\uE955", "\uE955"], /* Private Use */ + ["\uE956", "\uE956"], /* Private Use */ + ["\uE957", "\uE957"], /* Private Use */ + ["\uE958", "\uE958"], /* Private Use */ + ["\uE959", "\uE959"], /* Private Use */ + ["\uE95A", "\uE95A"], /* Private Use */ + ["\uE95B", "\uE95B"], /* Private Use */ + ["\uE95C", "\uE95C"], /* Private Use */ + ["\uE95D", "\uE95D"], /* Private Use */ + ["\uE95E", "\uE95E"], /* Private Use */ + ["\uE95F", "\uE95F"], /* Private Use */ + ["\uE960", "\uE960"], /* Private Use */ + ["\uE961", "\uE961"], /* Private Use */ + ["\uE962", "\uE962"], /* Private Use */ + ["\uE963", "\uE963"], /* Private Use */ + ["\uE964", "\uE964"], /* Private Use */ + ["\uE965", "\uE965"], /* Private Use */ + ["\uE966", "\uE966"], /* Private Use */ + ["\uE967", "\uE967"], /* Private Use */ + ["\uE968", "\uE968"], /* Private Use */ + ["\uE969", "\uE969"], /* Private Use */ + ["\uE96A", "\uE96A"], /* Private Use */ + ["\uE96B", "\uE96B"], /* Private Use */ + ["\uE96C", "\uE96C"], /* Private Use */ + ["\uE96D", "\uE96D"], /* Private Use */ + ["\uE96E", "\uE96E"], /* Private Use */ + ["\uE96F", "\uE96F"], /* Private Use */ + ["\uE970", "\uE970"], /* Private Use */ + ["\uE971", "\uE971"], /* Private Use */ + ["\uE972", "\uE972"], /* Private Use */ + ["\uE973", "\uE973"], /* Private Use */ + ["\uE974", "\uE974"], /* Private Use */ + ["\uE975", "\uE975"], /* Private Use */ + ["\uE976", "\uE976"], /* Private Use */ + ["\uE977", "\uE977"], /* Private Use */ + ["\uE978", "\uE978"], /* Private Use */ + ["\uE979", "\uE979"], /* Private Use */ + ["\uE97A", "\uE97A"], /* Private Use */ + ["\uE97B", "\uE97B"], /* Private Use */ + ["\uE97C", "\uE97C"], /* Private Use */ + ["\uE97D", "\uE97D"], /* Private Use */ + ["\uE97E", "\uE97E"], /* Private Use */ + ["\uE97F", "\uE97F"], /* Private Use */ + ["\uE980", "\uE980"], /* Private Use */ + ["\uE981", "\uE981"], /* Private Use */ + ["\uE982", "\uE982"], /* Private Use */ + ["\uE983", "\uE983"], /* Private Use */ + ["\uE984", "\uE984"], /* Private Use */ + ["\uE985", "\uE985"], /* Private Use */ + ["\uE986", "\uE986"], /* Private Use */ + ["\uE987", "\uE987"], /* Private Use */ + ["\uE988", "\uE988"], /* Private Use */ + ["\uE989", "\uE989"], /* Private Use */ + ["\uE98A", "\uE98A"], /* Private Use */ + ["\uE98B", "\uE98B"], /* Private Use */ + ["\uE98C", "\uE98C"], /* Private Use */ + ["\uE98D", "\uE98D"], /* Private Use */ + ["\uE98E", "\uE98E"], /* Private Use */ + ["\uE98F", "\uE98F"], /* Private Use */ + ["\uE990", "\uE990"], /* Private Use */ + ["\uE991", "\uE991"], /* Private Use */ + ["\uE992", "\uE992"], /* Private Use */ + ["\uE993", "\uE993"], /* Private Use */ + ["\uE994", "\uE994"], /* Private Use */ + ["\uE995", "\uE995"], /* Private Use */ + ["\uE996", "\uE996"], /* Private Use */ + ["\uE997", "\uE997"], /* Private Use */ + ["\uE998", "\uE998"], /* Private Use */ + ["\uE999", "\uE999"], /* Private Use */ + ["\uE99A", "\uE99A"], /* Private Use */ + ["\uE99B", "\uE99B"], /* Private Use */ + ["\uE99C", "\uE99C"], /* Private Use */ + ["\uE99D", "\uE99D"], /* Private Use */ + ["\uE99E", "\uE99E"], /* Private Use */ + ["\uE99F", "\uE99F"], /* Private Use */ + ["\uE9A0", "\uE9A0"], /* Private Use */ + ["\uE9A1", "\uE9A1"], /* Private Use */ + ["\uE9A2", "\uE9A2"], /* Private Use */ + ["\uE9A3", "\uE9A3"], /* Private Use */ + ["\uE9A4", "\uE9A4"], /* Private Use */ + ["\uE9A5", "\uE9A5"], /* Private Use */ + ["\uE9A6", "\uE9A6"], /* Private Use */ + ["\uE9A7", "\uE9A7"], /* Private Use */ + ["\uE9A8", "\uE9A8"], /* Private Use */ + ["\uE9A9", "\uE9A9"], /* Private Use */ + ["\uE9AA", "\uE9AA"], /* Private Use */ + ["\uE9AB", "\uE9AB"], /* Private Use */ + ["\uE9AC", "\uE9AC"], /* Private Use */ + ["\uE9AD", "\uE9AD"], /* Private Use */ + ["\uE9AE", "\uE9AE"], /* Private Use */ + ["\uE9AF", "\uE9AF"], /* Private Use */ + ["\uE9B0", "\uE9B0"], /* Private Use */ + ["\uE9B1", "\uE9B1"], /* Private Use */ + ["\uE9B2", "\uE9B2"], /* Private Use */ + ["\uE9B3", "\uE9B3"], /* Private Use */ + ["\uE9B4", "\uE9B4"], /* Private Use */ + ["\uE9B5", "\uE9B5"], /* Private Use */ + ["\uE9B6", "\uE9B6"], /* Private Use */ + ["\uE9B7", "\uE9B7"], /* Private Use */ + ["\uE9B8", "\uE9B8"], /* Private Use */ + ["\uE9B9", "\uE9B9"], /* Private Use */ + ["\uE9BA", "\uE9BA"], /* Private Use */ + ["\uE9BB", "\uE9BB"], /* Private Use */ + ["\uE9BC", "\uE9BC"], /* Private Use */ + ["\uE9BD", "\uE9BD"], /* Private Use */ + ["\uE9BE", "\uE9BE"], /* Private Use */ + ["\uE9BF", "\uE9BF"], /* Private Use */ + ["\uE9C0", "\uE9C0"], /* Private Use */ + ["\uE9C1", "\uE9C1"], /* Private Use */ + ["\uE9C2", "\uE9C2"], /* Private Use */ + ["\uE9C3", "\uE9C3"], /* Private Use */ + ["\uE9C4", "\uE9C4"], /* Private Use */ + ["\uE9C5", "\uE9C5"], /* Private Use */ + ["\uE9C6", "\uE9C6"], /* Private Use */ + ["\uE9C7", "\uE9C7"], /* Private Use */ + ["\uE9C8", "\uE9C8"], /* Private Use */ + ["\uE9C9", "\uE9C9"], /* Private Use */ + ["\uE9CA", "\uE9CA"], /* Private Use */ + ["\uE9CB", "\uE9CB"], /* Private Use */ + ["\uE9CC", "\uE9CC"], /* Private Use */ + ["\uE9CD", "\uE9CD"], /* Private Use */ + ["\uE9CE", "\uE9CE"], /* Private Use */ + ["\uE9CF", "\uE9CF"], /* Private Use */ + ["\uE9D0", "\uE9D0"], /* Private Use */ + ["\uE9D1", "\uE9D1"], /* Private Use */ + ["\uE9D2", "\uE9D2"], /* Private Use */ + ["\uE9D3", "\uE9D3"], /* Private Use */ + ["\uE9D4", "\uE9D4"], /* Private Use */ + ["\uE9D5", "\uE9D5"], /* Private Use */ + ["\uE9D6", "\uE9D6"], /* Private Use */ + ["\uE9D7", "\uE9D7"], /* Private Use */ + ["\uE9D8", "\uE9D8"], /* Private Use */ + ["\uE9D9", "\uE9D9"], /* Private Use */ + ["\uE9DA", "\uE9DA"], /* Private Use */ + ["\uE9DB", "\uE9DB"], /* Private Use */ + ["\uE9DC", "\uE9DC"], /* Private Use */ + ["\uE9DD", "\uE9DD"], /* Private Use */ + ["\uE9DE", "\uE9DE"], /* Private Use */ + ["\uE9DF", "\uE9DF"], /* Private Use */ + ["\uE9E0", "\uE9E0"], /* Private Use */ + ["\uE9E1", "\uE9E1"], /* Private Use */ + ["\uE9E2", "\uE9E2"], /* Private Use */ + ["\uE9E3", "\uE9E3"], /* Private Use */ + ["\uE9E4", "\uE9E4"], /* Private Use */ + ["\uE9E5", "\uE9E5"], /* Private Use */ + ["\uE9E6", "\uE9E6"], /* Private Use */ + ["\uE9E7", "\uE9E7"], /* Private Use */ + ["\uE9E8", "\uE9E8"], /* Private Use */ + ["\uE9E9", "\uE9E9"], /* Private Use */ + ["\uE9EA", "\uE9EA"], /* Private Use */ + ["\uE9EB", "\uE9EB"], /* Private Use */ + ["\uE9EC", "\uE9EC"], /* Private Use */ + ["\uE9ED", "\uE9ED"], /* Private Use */ + ["\uE9EE", "\uE9EE"], /* Private Use */ + ["\uE9EF", "\uE9EF"], /* Private Use */ + ["\uE9F0", "\uE9F0"], /* Private Use */ + ["\uE9F1", "\uE9F1"], /* Private Use */ + ["\uE9F2", "\uE9F2"], /* Private Use */ + ["\uE9F3", "\uE9F3"], /* Private Use */ + ["\uE9F4", "\uE9F4"], /* Private Use */ + ["\uE9F5", "\uE9F5"], /* Private Use */ + ["\uE9F6", "\uE9F6"], /* Private Use */ + ["\uE9F7", "\uE9F7"], /* Private Use */ + ["\uE9F8", "\uE9F8"], /* Private Use */ + ["\uE9F9", "\uE9F9"], /* Private Use */ + ["\uE9FA", "\uE9FA"], /* Private Use */ + ["\uE9FB", "\uE9FB"], /* Private Use */ + ["\uE9FC", "\uE9FC"], /* Private Use */ + ["\uE9FD", "\uE9FD"], /* Private Use */ + ["\uE9FE", "\uE9FE"], /* Private Use */ + ["\uE9FF", "\uE9FF"], /* Private Use */ + ["\uEA00", "\uEA00"], /* Private Use */ + ["\uEA01", "\uEA01"], /* Private Use */ + ["\uEA02", "\uEA02"], /* Private Use */ + ["\uEA03", "\uEA03"], /* Private Use */ + ["\uEA04", "\uEA04"], /* Private Use */ + ["\uEA05", "\uEA05"], /* Private Use */ + ["\uEA06", "\uEA06"], /* Private Use */ + ["\uEA07", "\uEA07"], /* Private Use */ + ["\uEA08", "\uEA08"], /* Private Use */ + ["\uEA09", "\uEA09"], /* Private Use */ + ["\uEA0A", "\uEA0A"], /* Private Use */ + ["\uEA0B", "\uEA0B"], /* Private Use */ + ["\uEA0C", "\uEA0C"], /* Private Use */ + ["\uEA0D", "\uEA0D"], /* Private Use */ + ["\uEA0E", "\uEA0E"], /* Private Use */ + ["\uEA0F", "\uEA0F"], /* Private Use */ + ["\uEA10", "\uEA10"], /* Private Use */ + ["\uEA11", "\uEA11"], /* Private Use */ + ["\uEA12", "\uEA12"], /* Private Use */ + ["\uEA13", "\uEA13"], /* Private Use */ + ["\uEA14", "\uEA14"], /* Private Use */ + ["\uEA15", "\uEA15"], /* Private Use */ + ["\uEA16", "\uEA16"], /* Private Use */ + ["\uEA17", "\uEA17"], /* Private Use */ + ["\uEA18", "\uEA18"], /* Private Use */ + ["\uEA19", "\uEA19"], /* Private Use */ + ["\uEA1A", "\uEA1A"], /* Private Use */ + ["\uEA1B", "\uEA1B"], /* Private Use */ + ["\uEA1C", "\uEA1C"], /* Private Use */ + ["\uEA1D", "\uEA1D"], /* Private Use */ + ["\uEA1E", "\uEA1E"], /* Private Use */ + ["\uEA1F", "\uEA1F"], /* Private Use */ + ["\uEA20", "\uEA20"], /* Private Use */ + ["\uEA21", "\uEA21"], /* Private Use */ + ["\uEA22", "\uEA22"], /* Private Use */ + ["\uEA23", "\uEA23"], /* Private Use */ + ["\uEA24", "\uEA24"], /* Private Use */ + ["\uEA25", "\uEA25"], /* Private Use */ + ["\uEA26", "\uEA26"], /* Private Use */ + ["\uEA27", "\uEA27"], /* Private Use */ + ["\uEA28", "\uEA28"], /* Private Use */ + ["\uEA29", "\uEA29"], /* Private Use */ + ["\uEA2A", "\uEA2A"], /* Private Use */ + ["\uEA2B", "\uEA2B"], /* Private Use */ + ["\uEA2C", "\uEA2C"], /* Private Use */ + ["\uEA2D", "\uEA2D"], /* Private Use */ + ["\uEA2E", "\uEA2E"], /* Private Use */ + ["\uEA2F", "\uEA2F"], /* Private Use */ + ["\uEA30", "\uEA30"], /* Private Use */ + ["\uEA31", "\uEA31"], /* Private Use */ + ["\uEA32", "\uEA32"], /* Private Use */ + ["\uEA33", "\uEA33"], /* Private Use */ + ["\uEA34", "\uEA34"], /* Private Use */ + ["\uEA35", "\uEA35"], /* Private Use */ + ["\uEA36", "\uEA36"], /* Private Use */ + ["\uEA37", "\uEA37"], /* Private Use */ + ["\uEA38", "\uEA38"], /* Private Use */ + ["\uEA39", "\uEA39"], /* Private Use */ + ["\uEA3A", "\uEA3A"], /* Private Use */ + ["\uEA3B", "\uEA3B"], /* Private Use */ + ["\uEA3C", "\uEA3C"], /* Private Use */ + ["\uEA3D", "\uEA3D"], /* Private Use */ + ["\uEA3E", "\uEA3E"], /* Private Use */ + ["\uEA3F", "\uEA3F"], /* Private Use */ + ["\uEA40", "\uEA40"], /* Private Use */ + ["\uEA41", "\uEA41"], /* Private Use */ + ["\uEA42", "\uEA42"], /* Private Use */ + ["\uEA43", "\uEA43"], /* Private Use */ + ["\uEA44", "\uEA44"], /* Private Use */ + ["\uEA45", "\uEA45"], /* Private Use */ + ["\uEA46", "\uEA46"], /* Private Use */ + ["\uEA47", "\uEA47"], /* Private Use */ + ["\uEA48", "\uEA48"], /* Private Use */ + ["\uEA49", "\uEA49"], /* Private Use */ + ["\uEA4A", "\uEA4A"], /* Private Use */ + ["\uEA4B", "\uEA4B"], /* Private Use */ + ["\uEA4C", "\uEA4C"], /* Private Use */ + ["\uEA4D", "\uEA4D"], /* Private Use */ + ["\uEA4E", "\uEA4E"], /* Private Use */ + ["\uEA4F", "\uEA4F"], /* Private Use */ + ["\uEA50", "\uEA50"], /* Private Use */ + ["\uEA51", "\uEA51"], /* Private Use */ + ["\uEA52", "\uEA52"], /* Private Use */ + ["\uEA53", "\uEA53"], /* Private Use */ + ["\uEA54", "\uEA54"], /* Private Use */ + ["\uEA55", "\uEA55"], /* Private Use */ + ["\uEA56", "\uEA56"], /* Private Use */ + ["\uEA57", "\uEA57"], /* Private Use */ + ["\uEA58", "\uEA58"], /* Private Use */ + ["\uEA59", "\uEA59"], /* Private Use */ + ["\uEA5A", "\uEA5A"], /* Private Use */ + ["\uEA5B", "\uEA5B"], /* Private Use */ + ["\uEA5C", "\uEA5C"], /* Private Use */ + ["\uEA5D", "\uEA5D"], /* Private Use */ + ["\uEA5E", "\uEA5E"], /* Private Use */ + ["\uEA5F", "\uEA5F"], /* Private Use */ + ["\uEA60", "\uEA60"], /* Private Use */ + ["\uEA61", "\uEA61"], /* Private Use */ + ["\uEA62", "\uEA62"], /* Private Use */ + ["\uEA63", "\uEA63"], /* Private Use */ + ["\uEA64", "\uEA64"], /* Private Use */ + ["\uEA65", "\uEA65"], /* Private Use */ + ["\uEA66", "\uEA66"], /* Private Use */ + ["\uEA67", "\uEA67"], /* Private Use */ + ["\uEA68", "\uEA68"], /* Private Use */ + ["\uEA69", "\uEA69"], /* Private Use */ + ["\uEA6A", "\uEA6A"], /* Private Use */ + ["\uEA6B", "\uEA6B"], /* Private Use */ + ["\uEA6C", "\uEA6C"], /* Private Use */ + ["\uEA6D", "\uEA6D"], /* Private Use */ + ["\uEA6E", "\uEA6E"], /* Private Use */ + ["\uEA6F", "\uEA6F"], /* Private Use */ + ["\uEA70", "\uEA70"], /* Private Use */ + ["\uEA71", "\uEA71"], /* Private Use */ + ["\uEA72", "\uEA72"], /* Private Use */ + ["\uEA73", "\uEA73"], /* Private Use */ + ["\uEA74", "\uEA74"], /* Private Use */ + ["\uEA75", "\uEA75"], /* Private Use */ + ["\uEA76", "\uEA76"], /* Private Use */ + ["\uEA77", "\uEA77"], /* Private Use */ + ["\uEA78", "\uEA78"], /* Private Use */ + ["\uEA79", "\uEA79"], /* Private Use */ + ["\uEA7A", "\uEA7A"], /* Private Use */ + ["\uEA7B", "\uEA7B"], /* Private Use */ + ["\uEA7C", "\uEA7C"], /* Private Use */ + ["\uEA7D", "\uEA7D"], /* Private Use */ + ["\uEA7E", "\uEA7E"], /* Private Use */ + ["\uEA7F", "\uEA7F"], /* Private Use */ + ["\uEA80", "\uEA80"], /* Private Use */ + ["\uEA81", "\uEA81"], /* Private Use */ + ["\uEA82", "\uEA82"], /* Private Use */ + ["\uEA83", "\uEA83"], /* Private Use */ + ["\uEA84", "\uEA84"], /* Private Use */ + ["\uEA85", "\uEA85"], /* Private Use */ + ["\uEA86", "\uEA86"], /* Private Use */ + ["\uEA87", "\uEA87"], /* Private Use */ + ["\uEA88", "\uEA88"], /* Private Use */ + ["\uEA89", "\uEA89"], /* Private Use */ + ["\uEA8A", "\uEA8A"], /* Private Use */ + ["\uEA8B", "\uEA8B"], /* Private Use */ + ["\uEA8C", "\uEA8C"], /* Private Use */ + ["\uEA8D", "\uEA8D"], /* Private Use */ + ["\uEA8E", "\uEA8E"], /* Private Use */ + ["\uEA8F", "\uEA8F"], /* Private Use */ + ["\uEA90", "\uEA90"], /* Private Use */ + ["\uEA91", "\uEA91"], /* Private Use */ + ["\uEA92", "\uEA92"], /* Private Use */ + ["\uEA93", "\uEA93"], /* Private Use */ + ["\uEA94", "\uEA94"], /* Private Use */ + ["\uEA95", "\uEA95"], /* Private Use */ + ["\uEA96", "\uEA96"], /* Private Use */ + ["\uEA97", "\uEA97"], /* Private Use */ + ["\uEA98", "\uEA98"], /* Private Use */ + ["\uEA99", "\uEA99"], /* Private Use */ + ["\uEA9A", "\uEA9A"], /* Private Use */ + ["\uEA9B", "\uEA9B"], /* Private Use */ + ["\uEA9C", "\uEA9C"], /* Private Use */ + ["\uEA9D", "\uEA9D"], /* Private Use */ + ["\uEA9E", "\uEA9E"], /* Private Use */ + ["\uEA9F", "\uEA9F"], /* Private Use */ + ["\uEAA0", "\uEAA0"], /* Private Use */ + ["\uEAA1", "\uEAA1"], /* Private Use */ + ["\uEAA2", "\uEAA2"], /* Private Use */ + ["\uEAA3", "\uEAA3"], /* Private Use */ + ["\uEAA4", "\uEAA4"], /* Private Use */ + ["\uEAA5", "\uEAA5"], /* Private Use */ + ["\uEAA6", "\uEAA6"], /* Private Use */ + ["\uEAA7", "\uEAA7"], /* Private Use */ + ["\uEAA8", "\uEAA8"], /* Private Use */ + ["\uEAA9", "\uEAA9"], /* Private Use */ + ["\uEAAA", "\uEAAA"], /* Private Use */ + ["\uEAAB", "\uEAAB"], /* Private Use */ + ["\uEAAC", "\uEAAC"], /* Private Use */ + ["\uEAAD", "\uEAAD"], /* Private Use */ + ["\uEAAE", "\uEAAE"], /* Private Use */ + ["\uEAAF", "\uEAAF"], /* Private Use */ + ["\uEAB0", "\uEAB0"], /* Private Use */ + ["\uEAB1", "\uEAB1"], /* Private Use */ + ["\uEAB2", "\uEAB2"], /* Private Use */ + ["\uEAB3", "\uEAB3"], /* Private Use */ + ["\uEAB4", "\uEAB4"], /* Private Use */ + ["\uEAB5", "\uEAB5"], /* Private Use */ + ["\uEAB6", "\uEAB6"], /* Private Use */ + ["\uEAB7", "\uEAB7"], /* Private Use */ + ["\uEAB8", "\uEAB8"], /* Private Use */ + ["\uEAB9", "\uEAB9"], /* Private Use */ + ["\uEABA", "\uEABA"], /* Private Use */ + ["\uEABB", "\uEABB"], /* Private Use */ + ["\uEABC", "\uEABC"], /* Private Use */ + ["\uEABD", "\uEABD"], /* Private Use */ + ["\uEABE", "\uEABE"], /* Private Use */ + ["\uEABF", "\uEABF"], /* Private Use */ + ["\uEAC0", "\uEAC0"], /* Private Use */ + ["\uEAC1", "\uEAC1"], /* Private Use */ + ["\uEAC2", "\uEAC2"], /* Private Use */ + ["\uEAC3", "\uEAC3"], /* Private Use */ + ["\uEAC4", "\uEAC4"], /* Private Use */ + ["\uEAC5", "\uEAC5"], /* Private Use */ + ["\uEAC6", "\uEAC6"], /* Private Use */ + ["\uEAC7", "\uEAC7"], /* Private Use */ + ["\uEAC8", "\uEAC8"], /* Private Use */ + ["\uEAC9", "\uEAC9"], /* Private Use */ + ["\uEACA", "\uEACA"], /* Private Use */ + ["\uEACB", "\uEACB"], /* Private Use */ + ["\uEACC", "\uEACC"], /* Private Use */ + ["\uEACD", "\uEACD"], /* Private Use */ + ["\uEACE", "\uEACE"], /* Private Use */ + ["\uEACF", "\uEACF"], /* Private Use */ + ["\uEAD0", "\uEAD0"], /* Private Use */ + ["\uEAD1", "\uEAD1"], /* Private Use */ + ["\uEAD2", "\uEAD2"], /* Private Use */ + ["\uEAD3", "\uEAD3"], /* Private Use */ + ["\uEAD4", "\uEAD4"], /* Private Use */ + ["\uEAD5", "\uEAD5"], /* Private Use */ + ["\uEAD6", "\uEAD6"], /* Private Use */ + ["\uEAD7", "\uEAD7"], /* Private Use */ + ["\uEAD8", "\uEAD8"], /* Private Use */ + ["\uEAD9", "\uEAD9"], /* Private Use */ + ["\uEADA", "\uEADA"], /* Private Use */ + ["\uEADB", "\uEADB"], /* Private Use */ + ["\uEADC", "\uEADC"], /* Private Use */ + ["\uEADD", "\uEADD"], /* Private Use */ + ["\uEADE", "\uEADE"], /* Private Use */ + ["\uEADF", "\uEADF"], /* Private Use */ + ["\uEAE0", "\uEAE0"], /* Private Use */ + ["\uEAE1", "\uEAE1"], /* Private Use */ + ["\uEAE2", "\uEAE2"], /* Private Use */ + ["\uEAE3", "\uEAE3"], /* Private Use */ + ["\uEAE4", "\uEAE4"], /* Private Use */ + ["\uEAE5", "\uEAE5"], /* Private Use */ + ["\uEAE6", "\uEAE6"], /* Private Use */ + ["\uEAE7", "\uEAE7"], /* Private Use */ + ["\uEAE8", "\uEAE8"], /* Private Use */ + ["\uEAE9", "\uEAE9"], /* Private Use */ + ["\uEAEA", "\uEAEA"], /* Private Use */ + ["\uEAEB", "\uEAEB"], /* Private Use */ + ["\uEAEC", "\uEAEC"], /* Private Use */ + ["\uEAED", "\uEAED"], /* Private Use */ + ["\uEAEE", "\uEAEE"], /* Private Use */ + ["\uEAEF", "\uEAEF"], /* Private Use */ + ["\uEAF0", "\uEAF0"], /* Private Use */ + ["\uEAF1", "\uEAF1"], /* Private Use */ + ["\uEAF2", "\uEAF2"], /* Private Use */ + ["\uEAF3", "\uEAF3"], /* Private Use */ + ["\uEAF4", "\uEAF4"], /* Private Use */ + ["\uEAF5", "\uEAF5"], /* Private Use */ + ["\uEAF6", "\uEAF6"], /* Private Use */ + ["\uEAF7", "\uEAF7"], /* Private Use */ + ["\uEAF8", "\uEAF8"], /* Private Use */ + ["\uEAF9", "\uEAF9"], /* Private Use */ + ["\uEAFA", "\uEAFA"], /* Private Use */ + ["\uEAFB", "\uEAFB"], /* Private Use */ + ["\uEAFC", "\uEAFC"], /* Private Use */ + ["\uEAFD", "\uEAFD"], /* Private Use */ + ["\uEAFE", "\uEAFE"], /* Private Use */ + ["\uEAFF", "\uEAFF"], /* Private Use */ + ["\uEB00", "\uEB00"], /* Private Use */ + ["\uEB01", "\uEB01"], /* Private Use */ + ["\uEB02", "\uEB02"], /* Private Use */ + ["\uEB03", "\uEB03"], /* Private Use */ + ["\uEB04", "\uEB04"], /* Private Use */ + ["\uEB05", "\uEB05"], /* Private Use */ + ["\uEB06", "\uEB06"], /* Private Use */ + ["\uEB07", "\uEB07"], /* Private Use */ + ["\uEB08", "\uEB08"], /* Private Use */ + ["\uEB09", "\uEB09"], /* Private Use */ + ["\uEB0A", "\uEB0A"], /* Private Use */ + ["\uEB0B", "\uEB0B"], /* Private Use */ + ["\uEB0C", "\uEB0C"], /* Private Use */ + ["\uEB0D", "\uEB0D"], /* Private Use */ + ["\uEB0E", "\uEB0E"], /* Private Use */ + ["\uEB0F", "\uEB0F"], /* Private Use */ + ["\uEB10", "\uEB10"], /* Private Use */ + ["\uEB11", "\uEB11"], /* Private Use */ + ["\uEB12", "\uEB12"], /* Private Use */ + ["\uEB13", "\uEB13"], /* Private Use */ + ["\uEB14", "\uEB14"], /* Private Use */ + ["\uEB15", "\uEB15"], /* Private Use */ + ["\uEB16", "\uEB16"], /* Private Use */ + ["\uEB17", "\uEB17"], /* Private Use */ + ["\uEB18", "\uEB18"], /* Private Use */ + ["\uEB19", "\uEB19"], /* Private Use */ + ["\uEB1A", "\uEB1A"], /* Private Use */ + ["\uEB1B", "\uEB1B"], /* Private Use */ + ["\uEB1C", "\uEB1C"], /* Private Use */ + ["\uEB1D", "\uEB1D"], /* Private Use */ + ["\uEB1E", "\uEB1E"], /* Private Use */ + ["\uEB1F", "\uEB1F"], /* Private Use */ + ["\uEB20", "\uEB20"], /* Private Use */ + ["\uEB21", "\uEB21"], /* Private Use */ + ["\uEB22", "\uEB22"], /* Private Use */ + ["\uEB23", "\uEB23"], /* Private Use */ + ["\uEB24", "\uEB24"], /* Private Use */ + ["\uEB25", "\uEB25"], /* Private Use */ + ["\uEB26", "\uEB26"], /* Private Use */ + ["\uEB27", "\uEB27"], /* Private Use */ + ["\uEB28", "\uEB28"], /* Private Use */ + ["\uEB29", "\uEB29"], /* Private Use */ + ["\uEB2A", "\uEB2A"], /* Private Use */ + ["\uEB2B", "\uEB2B"], /* Private Use */ + ["\uEB2C", "\uEB2C"], /* Private Use */ + ["\uEB2D", "\uEB2D"], /* Private Use */ + ["\uEB2E", "\uEB2E"], /* Private Use */ + ["\uEB2F", "\uEB2F"], /* Private Use */ + ["\uEB30", "\uEB30"], /* Private Use */ + ["\uEB31", "\uEB31"], /* Private Use */ + ["\uEB32", "\uEB32"], /* Private Use */ + ["\uEB33", "\uEB33"], /* Private Use */ + ["\uEB34", "\uEB34"], /* Private Use */ + ["\uEB35", "\uEB35"], /* Private Use */ + ["\uEB36", "\uEB36"], /* Private Use */ + ["\uEB37", "\uEB37"], /* Private Use */ + ["\uEB38", "\uEB38"], /* Private Use */ + ["\uEB39", "\uEB39"], /* Private Use */ + ["\uEB3A", "\uEB3A"], /* Private Use */ + ["\uEB3B", "\uEB3B"], /* Private Use */ + ["\uEB3C", "\uEB3C"], /* Private Use */ + ["\uEB3D", "\uEB3D"], /* Private Use */ + ["\uEB3E", "\uEB3E"], /* Private Use */ + ["\uEB3F", "\uEB3F"], /* Private Use */ + ["\uEB40", "\uEB40"], /* Private Use */ + ["\uEB41", "\uEB41"], /* Private Use */ + ["\uEB42", "\uEB42"], /* Private Use */ + ["\uEB43", "\uEB43"], /* Private Use */ + ["\uEB44", "\uEB44"], /* Private Use */ + ["\uEB45", "\uEB45"], /* Private Use */ + ["\uEB46", "\uEB46"], /* Private Use */ + ["\uEB47", "\uEB47"], /* Private Use */ + ["\uEB48", "\uEB48"], /* Private Use */ + ["\uEB49", "\uEB49"], /* Private Use */ + ["\uEB4A", "\uEB4A"], /* Private Use */ + ["\uEB4B", "\uEB4B"], /* Private Use */ + ["\uEB4C", "\uEB4C"], /* Private Use */ + ["\uEB4D", "\uEB4D"], /* Private Use */ + ["\uEB4E", "\uEB4E"], /* Private Use */ + ["\uEB4F", "\uEB4F"], /* Private Use */ + ["\uEB50", "\uEB50"], /* Private Use */ + ["\uEB51", "\uEB51"], /* Private Use */ + ["\uEB52", "\uEB52"], /* Private Use */ + ["\uEB53", "\uEB53"], /* Private Use */ + ["\uEB54", "\uEB54"], /* Private Use */ + ["\uEB55", "\uEB55"], /* Private Use */ + ["\uEB56", "\uEB56"], /* Private Use */ + ["\uEB57", "\uEB57"], /* Private Use */ + ["\uEB58", "\uEB58"], /* Private Use */ + ["\uEB59", "\uEB59"], /* Private Use */ + ["\uEB5A", "\uEB5A"], /* Private Use */ + ["\uEB5B", "\uEB5B"], /* Private Use */ + ["\uEB5C", "\uEB5C"], /* Private Use */ + ["\uEB5D", "\uEB5D"], /* Private Use */ + ["\uEB5E", "\uEB5E"], /* Private Use */ + ["\uEB5F", "\uEB5F"], /* Private Use */ + ["\uEB60", "\uEB60"], /* Private Use */ + ["\uEB61", "\uEB61"], /* Private Use */ + ["\uEB62", "\uEB62"], /* Private Use */ + ["\uEB63", "\uEB63"], /* Private Use */ + ["\uEB64", "\uEB64"], /* Private Use */ + ["\uEB65", "\uEB65"], /* Private Use */ + ["\uEB66", "\uEB66"], /* Private Use */ + ["\uEB67", "\uEB67"], /* Private Use */ + ["\uEB68", "\uEB68"], /* Private Use */ + ["\uEB69", "\uEB69"], /* Private Use */ + ["\uEB6A", "\uEB6A"], /* Private Use */ + ["\uEB6B", "\uEB6B"], /* Private Use */ + ["\uEB6C", "\uEB6C"], /* Private Use */ + ["\uEB6D", "\uEB6D"], /* Private Use */ + ["\uEB6E", "\uEB6E"], /* Private Use */ + ["\uEB6F", "\uEB6F"], /* Private Use */ + ["\uEB70", "\uEB70"], /* Private Use */ + ["\uEB71", "\uEB71"], /* Private Use */ + ["\uEB72", "\uEB72"], /* Private Use */ + ["\uEB73", "\uEB73"], /* Private Use */ + ["\uEB74", "\uEB74"], /* Private Use */ + ["\uEB75", "\uEB75"], /* Private Use */ + ["\uEB76", "\uEB76"], /* Private Use */ + ["\uEB77", "\uEB77"], /* Private Use */ + ["\uEB78", "\uEB78"], /* Private Use */ + ["\uEB79", "\uEB79"], /* Private Use */ + ["\uEB7A", "\uEB7A"], /* Private Use */ + ["\uEB7B", "\uEB7B"], /* Private Use */ + ["\uEB7C", "\uEB7C"], /* Private Use */ + ["\uEB7D", "\uEB7D"], /* Private Use */ + ["\uEB7E", "\uEB7E"], /* Private Use */ + ["\uEB7F", "\uEB7F"], /* Private Use */ + ["\uEB80", "\uEB80"], /* Private Use */ + ["\uEB81", "\uEB81"], /* Private Use */ + ["\uEB82", "\uEB82"], /* Private Use */ + ["\uEB83", "\uEB83"], /* Private Use */ + ["\uEB84", "\uEB84"], /* Private Use */ + ["\uEB85", "\uEB85"], /* Private Use */ + ["\uEB86", "\uEB86"], /* Private Use */ + ["\uEB87", "\uEB87"], /* Private Use */ + ["\uEB88", "\uEB88"], /* Private Use */ + ["\uEB89", "\uEB89"], /* Private Use */ + ["\uEB8A", "\uEB8A"], /* Private Use */ + ["\uEB8B", "\uEB8B"], /* Private Use */ + ["\uEB8C", "\uEB8C"], /* Private Use */ + ["\uEB8D", "\uEB8D"], /* Private Use */ + ["\uEB8E", "\uEB8E"], /* Private Use */ + ["\uEB8F", "\uEB8F"], /* Private Use */ + ["\uEB90", "\uEB90"], /* Private Use */ + ["\uEB91", "\uEB91"], /* Private Use */ + ["\uEB92", "\uEB92"], /* Private Use */ + ["\uEB93", "\uEB93"], /* Private Use */ + ["\uEB94", "\uEB94"], /* Private Use */ + ["\uEB95", "\uEB95"], /* Private Use */ + ["\uEB96", "\uEB96"], /* Private Use */ + ["\uEB97", "\uEB97"], /* Private Use */ + ["\uEB98", "\uEB98"], /* Private Use */ + ["\uEB99", "\uEB99"], /* Private Use */ + ["\uEB9A", "\uEB9A"], /* Private Use */ + ["\uEB9B", "\uEB9B"], /* Private Use */ + ["\uEB9C", "\uEB9C"], /* Private Use */ + ["\uEB9D", "\uEB9D"], /* Private Use */ + ["\uEB9E", "\uEB9E"], /* Private Use */ + ["\uEB9F", "\uEB9F"], /* Private Use */ + ["\uEBA0", "\uEBA0"], /* Private Use */ + ["\uEBA1", "\uEBA1"], /* Private Use */ + ["\uEBA2", "\uEBA2"], /* Private Use */ + ["\uEBA3", "\uEBA3"], /* Private Use */ + ["\uEBA4", "\uEBA4"], /* Private Use */ + ["\uEBA5", "\uEBA5"], /* Private Use */ + ["\uEBA6", "\uEBA6"], /* Private Use */ + ["\uEBA7", "\uEBA7"], /* Private Use */ + ["\uEBA8", "\uEBA8"], /* Private Use */ + ["\uEBA9", "\uEBA9"], /* Private Use */ + ["\uEBAA", "\uEBAA"], /* Private Use */ + ["\uEBAB", "\uEBAB"], /* Private Use */ + ["\uEBAC", "\uEBAC"], /* Private Use */ + ["\uEBAD", "\uEBAD"], /* Private Use */ + ["\uEBAE", "\uEBAE"], /* Private Use */ + ["\uEBAF", "\uEBAF"], /* Private Use */ + ["\uEBB0", "\uEBB0"], /* Private Use */ + ["\uEBB1", "\uEBB1"], /* Private Use */ + ["\uEBB2", "\uEBB2"], /* Private Use */ + ["\uEBB3", "\uEBB3"], /* Private Use */ + ["\uEBB4", "\uEBB4"], /* Private Use */ + ["\uEBB5", "\uEBB5"], /* Private Use */ + ["\uEBB6", "\uEBB6"], /* Private Use */ + ["\uEBB7", "\uEBB7"], /* Private Use */ + ["\uEBB8", "\uEBB8"], /* Private Use */ + ["\uEBB9", "\uEBB9"], /* Private Use */ + ["\uEBBA", "\uEBBA"], /* Private Use */ + ["\uEBBB", "\uEBBB"], /* Private Use */ + ["\uEBBC", "\uEBBC"], /* Private Use */ + ["\uEBBD", "\uEBBD"], /* Private Use */ + ["\uEBBE", "\uEBBE"], /* Private Use */ + ["\uEBBF", "\uEBBF"], /* Private Use */ + ["\uEBC0", "\uEBC0"], /* Private Use */ + ["\uEBC1", "\uEBC1"], /* Private Use */ + ["\uEBC2", "\uEBC2"], /* Private Use */ + ["\uEBC3", "\uEBC3"], /* Private Use */ + ["\uEBC4", "\uEBC4"], /* Private Use */ + ["\uEBC5", "\uEBC5"], /* Private Use */ + ["\uEBC6", "\uEBC6"], /* Private Use */ + ["\uEBC7", "\uEBC7"], /* Private Use */ + ["\uEBC8", "\uEBC8"], /* Private Use */ + ["\uEBC9", "\uEBC9"], /* Private Use */ + ["\uEBCA", "\uEBCA"], /* Private Use */ + ["\uEBCB", "\uEBCB"], /* Private Use */ + ["\uEBCC", "\uEBCC"], /* Private Use */ + ["\uEBCD", "\uEBCD"], /* Private Use */ + ["\uEBCE", "\uEBCE"], /* Private Use */ + ["\uEBCF", "\uEBCF"], /* Private Use */ + ["\uEBD0", "\uEBD0"], /* Private Use */ + ["\uEBD1", "\uEBD1"], /* Private Use */ + ["\uEBD2", "\uEBD2"], /* Private Use */ + ["\uEBD3", "\uEBD3"], /* Private Use */ + ["\uEBD4", "\uEBD4"], /* Private Use */ + ["\uEBD5", "\uEBD5"], /* Private Use */ + ["\uEBD6", "\uEBD6"], /* Private Use */ + ["\uEBD7", "\uEBD7"], /* Private Use */ + ["\uEBD8", "\uEBD8"], /* Private Use */ + ["\uEBD9", "\uEBD9"], /* Private Use */ + ["\uEBDA", "\uEBDA"], /* Private Use */ + ["\uEBDB", "\uEBDB"], /* Private Use */ + ["\uEBDC", "\uEBDC"], /* Private Use */ + ["\uEBDD", "\uEBDD"], /* Private Use */ + ["\uEBDE", "\uEBDE"], /* Private Use */ + ["\uEBDF", "\uEBDF"], /* Private Use */ + ["\uEBE0", "\uEBE0"], /* Private Use */ + ["\uEBE1", "\uEBE1"], /* Private Use */ + ["\uEBE2", "\uEBE2"], /* Private Use */ + ["\uEBE3", "\uEBE3"], /* Private Use */ + ["\uEBE4", "\uEBE4"], /* Private Use */ + ["\uEBE5", "\uEBE5"], /* Private Use */ + ["\uEBE6", "\uEBE6"], /* Private Use */ + ["\uEBE7", "\uEBE7"], /* Private Use */ + ["\uEBE8", "\uEBE8"], /* Private Use */ + ["\uEBE9", "\uEBE9"], /* Private Use */ + ["\uEBEA", "\uEBEA"], /* Private Use */ + ["\uEBEB", "\uEBEB"], /* Private Use */ + ["\uEBEC", "\uEBEC"], /* Private Use */ + ["\uEBED", "\uEBED"], /* Private Use */ + ["\uEBEE", "\uEBEE"], /* Private Use */ + ["\uEBEF", "\uEBEF"], /* Private Use */ + ["\uEBF0", "\uEBF0"], /* Private Use */ + ["\uEBF1", "\uEBF1"], /* Private Use */ + ["\uEBF2", "\uEBF2"], /* Private Use */ + ["\uEBF3", "\uEBF3"], /* Private Use */ + ["\uEBF4", "\uEBF4"], /* Private Use */ + ["\uEBF5", "\uEBF5"], /* Private Use */ + ["\uEBF6", "\uEBF6"], /* Private Use */ + ["\uEBF7", "\uEBF7"], /* Private Use */ + ["\uEBF8", "\uEBF8"], /* Private Use */ + ["\uEBF9", "\uEBF9"], /* Private Use */ + ["\uEBFA", "\uEBFA"], /* Private Use */ + ["\uEBFB", "\uEBFB"], /* Private Use */ + ["\uEBFC", "\uEBFC"], /* Private Use */ + ["\uEBFD", "\uEBFD"], /* Private Use */ + ["\uEBFE", "\uEBFE"], /* Private Use */ + ["\uEBFF", "\uEBFF"], /* Private Use */ + ["\uEC00", "\uEC00"], /* Private Use */ + ["\uEC01", "\uEC01"], /* Private Use */ + ["\uEC02", "\uEC02"], /* Private Use */ + ["\uEC03", "\uEC03"], /* Private Use */ + ["\uEC04", "\uEC04"], /* Private Use */ + ["\uEC05", "\uEC05"], /* Private Use */ + ["\uEC06", "\uEC06"], /* Private Use */ + ["\uEC07", "\uEC07"], /* Private Use */ + ["\uEC08", "\uEC08"], /* Private Use */ + ["\uEC09", "\uEC09"], /* Private Use */ + ["\uEC0A", "\uEC0A"], /* Private Use */ + ["\uEC0B", "\uEC0B"], /* Private Use */ + ["\uEC0C", "\uEC0C"], /* Private Use */ + ["\uEC0D", "\uEC0D"], /* Private Use */ + ["\uEC0E", "\uEC0E"], /* Private Use */ + ["\uEC0F", "\uEC0F"], /* Private Use */ + ["\uEC10", "\uEC10"], /* Private Use */ + ["\uEC11", "\uEC11"], /* Private Use */ + ["\uEC12", "\uEC12"], /* Private Use */ + ["\uEC13", "\uEC13"], /* Private Use */ + ["\uEC14", "\uEC14"], /* Private Use */ + ["\uEC15", "\uEC15"], /* Private Use */ + ["\uEC16", "\uEC16"], /* Private Use */ + ["\uEC17", "\uEC17"], /* Private Use */ + ["\uEC18", "\uEC18"], /* Private Use */ + ["\uEC19", "\uEC19"], /* Private Use */ + ["\uEC1A", "\uEC1A"], /* Private Use */ + ["\uEC1B", "\uEC1B"], /* Private Use */ + ["\uEC1C", "\uEC1C"], /* Private Use */ + ["\uEC1D", "\uEC1D"], /* Private Use */ + ["\uEC1E", "\uEC1E"], /* Private Use */ + ["\uEC1F", "\uEC1F"], /* Private Use */ + ["\uEC20", "\uEC20"], /* Private Use */ + ["\uEC21", "\uEC21"], /* Private Use */ + ["\uEC22", "\uEC22"], /* Private Use */ + ["\uEC23", "\uEC23"], /* Private Use */ + ["\uEC24", "\uEC24"], /* Private Use */ + ["\uEC25", "\uEC25"], /* Private Use */ + ["\uEC26", "\uEC26"], /* Private Use */ + ["\uEC27", "\uEC27"], /* Private Use */ + ["\uEC28", "\uEC28"], /* Private Use */ + ["\uEC29", "\uEC29"], /* Private Use */ + ["\uEC2A", "\uEC2A"], /* Private Use */ + ["\uEC2B", "\uEC2B"], /* Private Use */ + ["\uEC2C", "\uEC2C"], /* Private Use */ + ["\uEC2D", "\uEC2D"], /* Private Use */ + ["\uEC2E", "\uEC2E"], /* Private Use */ + ["\uEC2F", "\uEC2F"], /* Private Use */ + ["\uEC30", "\uEC30"], /* Private Use */ + ["\uEC31", "\uEC31"], /* Private Use */ + ["\uEC32", "\uEC32"], /* Private Use */ + ["\uEC33", "\uEC33"], /* Private Use */ + ["\uEC34", "\uEC34"], /* Private Use */ + ["\uEC35", "\uEC35"], /* Private Use */ + ["\uEC36", "\uEC36"], /* Private Use */ + ["\uEC37", "\uEC37"], /* Private Use */ + ["\uEC38", "\uEC38"], /* Private Use */ + ["\uEC39", "\uEC39"], /* Private Use */ + ["\uEC3A", "\uEC3A"], /* Private Use */ + ["\uEC3B", "\uEC3B"], /* Private Use */ + ["\uEC3C", "\uEC3C"], /* Private Use */ + ["\uEC3D", "\uEC3D"], /* Private Use */ + ["\uEC3E", "\uEC3E"], /* Private Use */ + ["\uEC3F", "\uEC3F"], /* Private Use */ + ["\uEC40", "\uEC40"], /* Private Use */ + ["\uEC41", "\uEC41"], /* Private Use */ + ["\uEC42", "\uEC42"], /* Private Use */ + ["\uEC43", "\uEC43"], /* Private Use */ + ["\uEC44", "\uEC44"], /* Private Use */ + ["\uEC45", "\uEC45"], /* Private Use */ + ["\uEC46", "\uEC46"], /* Private Use */ + ["\uEC47", "\uEC47"], /* Private Use */ + ["\uEC48", "\uEC48"], /* Private Use */ + ["\uEC49", "\uEC49"], /* Private Use */ + ["\uEC4A", "\uEC4A"], /* Private Use */ + ["\uEC4B", "\uEC4B"], /* Private Use */ + ["\uEC4C", "\uEC4C"], /* Private Use */ + ["\uEC4D", "\uEC4D"], /* Private Use */ + ["\uEC4E", "\uEC4E"], /* Private Use */ + ["\uEC4F", "\uEC4F"], /* Private Use */ + ["\uEC50", "\uEC50"], /* Private Use */ + ["\uEC51", "\uEC51"], /* Private Use */ + ["\uEC52", "\uEC52"], /* Private Use */ + ["\uEC53", "\uEC53"], /* Private Use */ + ["\uEC54", "\uEC54"], /* Private Use */ + ["\uEC55", "\uEC55"], /* Private Use */ + ["\uEC56", "\uEC56"], /* Private Use */ + ["\uEC57", "\uEC57"], /* Private Use */ + ["\uEC58", "\uEC58"], /* Private Use */ + ["\uEC59", "\uEC59"], /* Private Use */ + ["\uEC5A", "\uEC5A"], /* Private Use */ + ["\uEC5B", "\uEC5B"], /* Private Use */ + ["\uEC5C", "\uEC5C"], /* Private Use */ + ["\uEC5D", "\uEC5D"], /* Private Use */ + ["\uEC5E", "\uEC5E"], /* Private Use */ + ["\uEC5F", "\uEC5F"], /* Private Use */ + ["\uEC60", "\uEC60"], /* Private Use */ + ["\uEC61", "\uEC61"], /* Private Use */ + ["\uEC62", "\uEC62"], /* Private Use */ + ["\uEC63", "\uEC63"], /* Private Use */ + ["\uEC64", "\uEC64"], /* Private Use */ + ["\uEC65", "\uEC65"], /* Private Use */ + ["\uEC66", "\uEC66"], /* Private Use */ + ["\uEC67", "\uEC67"], /* Private Use */ + ["\uEC68", "\uEC68"], /* Private Use */ + ["\uEC69", "\uEC69"], /* Private Use */ + ["\uEC6A", "\uEC6A"], /* Private Use */ + ["\uEC6B", "\uEC6B"], /* Private Use */ + ["\uEC6C", "\uEC6C"], /* Private Use */ + ["\uEC6D", "\uEC6D"], /* Private Use */ + ["\uEC6E", "\uEC6E"], /* Private Use */ + ["\uEC6F", "\uEC6F"], /* Private Use */ + ["\uEC70", "\uEC70"], /* Private Use */ + ["\uEC71", "\uEC71"], /* Private Use */ + ["\uEC72", "\uEC72"], /* Private Use */ + ["\uEC73", "\uEC73"], /* Private Use */ + ["\uEC74", "\uEC74"], /* Private Use */ + ["\uEC75", "\uEC75"], /* Private Use */ + ["\uEC76", "\uEC76"], /* Private Use */ + ["\uEC77", "\uEC77"], /* Private Use */ + ["\uEC78", "\uEC78"], /* Private Use */ + ["\uEC79", "\uEC79"], /* Private Use */ + ["\uEC7A", "\uEC7A"], /* Private Use */ + ["\uEC7B", "\uEC7B"], /* Private Use */ + ["\uEC7C", "\uEC7C"], /* Private Use */ + ["\uEC7D", "\uEC7D"], /* Private Use */ + ["\uEC7E", "\uEC7E"], /* Private Use */ + ["\uEC7F", "\uEC7F"], /* Private Use */ + ["\uEC80", "\uEC80"], /* Private Use */ + ["\uEC81", "\uEC81"], /* Private Use */ + ["\uEC82", "\uEC82"], /* Private Use */ + ["\uEC83", "\uEC83"], /* Private Use */ + ["\uEC84", "\uEC84"], /* Private Use */ + ["\uEC85", "\uEC85"], /* Private Use */ + ["\uEC86", "\uEC86"], /* Private Use */ + ["\uEC87", "\uEC87"], /* Private Use */ + ["\uEC88", "\uEC88"], /* Private Use */ + ["\uEC89", "\uEC89"], /* Private Use */ + ["\uEC8A", "\uEC8A"], /* Private Use */ + ["\uEC8B", "\uEC8B"], /* Private Use */ + ["\uEC8C", "\uEC8C"], /* Private Use */ + ["\uEC8D", "\uEC8D"], /* Private Use */ + ["\uEC8E", "\uEC8E"], /* Private Use */ + ["\uEC8F", "\uEC8F"], /* Private Use */ + ["\uEC90", "\uEC90"], /* Private Use */ + ["\uEC91", "\uEC91"], /* Private Use */ + ["\uEC92", "\uEC92"], /* Private Use */ + ["\uEC93", "\uEC93"], /* Private Use */ + ["\uEC94", "\uEC94"], /* Private Use */ + ["\uEC95", "\uEC95"], /* Private Use */ + ["\uEC96", "\uEC96"], /* Private Use */ + ["\uEC97", "\uEC97"], /* Private Use */ + ["\uEC98", "\uEC98"], /* Private Use */ + ["\uEC99", "\uEC99"], /* Private Use */ + ["\uEC9A", "\uEC9A"], /* Private Use */ + ["\uEC9B", "\uEC9B"], /* Private Use */ + ["\uEC9C", "\uEC9C"], /* Private Use */ + ["\uEC9D", "\uEC9D"], /* Private Use */ + ["\uEC9E", "\uEC9E"], /* Private Use */ + ["\uEC9F", "\uEC9F"], /* Private Use */ + ["\uECA0", "\uECA0"], /* Private Use */ + ["\uECA1", "\uECA1"], /* Private Use */ + ["\uECA2", "\uECA2"], /* Private Use */ + ["\uECA3", "\uECA3"], /* Private Use */ + ["\uECA4", "\uECA4"], /* Private Use */ + ["\uECA5", "\uECA5"], /* Private Use */ + ["\uECA6", "\uECA6"], /* Private Use */ + ["\uECA7", "\uECA7"], /* Private Use */ + ["\uECA8", "\uECA8"], /* Private Use */ + ["\uECA9", "\uECA9"], /* Private Use */ + ["\uECAA", "\uECAA"], /* Private Use */ + ["\uECAB", "\uECAB"], /* Private Use */ + ["\uECAC", "\uECAC"], /* Private Use */ + ["\uECAD", "\uECAD"], /* Private Use */ + ["\uECAE", "\uECAE"], /* Private Use */ + ["\uECAF", "\uECAF"], /* Private Use */ + ["\uECB0", "\uECB0"], /* Private Use */ + ["\uECB1", "\uECB1"], /* Private Use */ + ["\uECB2", "\uECB2"], /* Private Use */ + ["\uECB3", "\uECB3"], /* Private Use */ + ["\uECB4", "\uECB4"], /* Private Use */ + ["\uECB5", "\uECB5"], /* Private Use */ + ["\uECB6", "\uECB6"], /* Private Use */ + ["\uECB7", "\uECB7"], /* Private Use */ + ["\uECB8", "\uECB8"], /* Private Use */ + ["\uECB9", "\uECB9"], /* Private Use */ + ["\uECBA", "\uECBA"], /* Private Use */ + ["\uECBB", "\uECBB"], /* Private Use */ + ["\uECBC", "\uECBC"], /* Private Use */ + ["\uECBD", "\uECBD"], /* Private Use */ + ["\uECBE", "\uECBE"], /* Private Use */ + ["\uECBF", "\uECBF"], /* Private Use */ + ["\uECC0", "\uECC0"], /* Private Use */ + ["\uECC1", "\uECC1"], /* Private Use */ + ["\uECC2", "\uECC2"], /* Private Use */ + ["\uECC3", "\uECC3"], /* Private Use */ + ["\uECC4", "\uECC4"], /* Private Use */ + ["\uECC5", "\uECC5"], /* Private Use */ + ["\uECC6", "\uECC6"], /* Private Use */ + ["\uECC7", "\uECC7"], /* Private Use */ + ["\uECC8", "\uECC8"], /* Private Use */ + ["\uECC9", "\uECC9"], /* Private Use */ + ["\uECCA", "\uECCA"], /* Private Use */ + ["\uECCB", "\uECCB"], /* Private Use */ + ["\uECCC", "\uECCC"], /* Private Use */ + ["\uECCD", "\uECCD"], /* Private Use */ + ["\uECCE", "\uECCE"], /* Private Use */ + ["\uECCF", "\uECCF"], /* Private Use */ + ["\uECD0", "\uECD0"], /* Private Use */ + ["\uECD1", "\uECD1"], /* Private Use */ + ["\uECD2", "\uECD2"], /* Private Use */ + ["\uECD3", "\uECD3"], /* Private Use */ + ["\uECD4", "\uECD4"], /* Private Use */ + ["\uECD5", "\uECD5"], /* Private Use */ + ["\uECD6", "\uECD6"], /* Private Use */ + ["\uECD7", "\uECD7"], /* Private Use */ + ["\uECD8", "\uECD8"], /* Private Use */ + ["\uECD9", "\uECD9"], /* Private Use */ + ["\uECDA", "\uECDA"], /* Private Use */ + ["\uECDB", "\uECDB"], /* Private Use */ + ["\uECDC", "\uECDC"], /* Private Use */ + ["\uECDD", "\uECDD"], /* Private Use */ + ["\uECDE", "\uECDE"], /* Private Use */ + ["\uECDF", "\uECDF"], /* Private Use */ + ["\uECE0", "\uECE0"], /* Private Use */ + ["\uECE1", "\uECE1"], /* Private Use */ + ["\uECE2", "\uECE2"], /* Private Use */ + ["\uECE3", "\uECE3"], /* Private Use */ + ["\uECE4", "\uECE4"], /* Private Use */ + ["\uECE5", "\uECE5"], /* Private Use */ + ["\uECE6", "\uECE6"], /* Private Use */ + ["\uECE7", "\uECE7"], /* Private Use */ + ["\uECE8", "\uECE8"], /* Private Use */ + ["\uECE9", "\uECE9"], /* Private Use */ + ["\uECEA", "\uECEA"], /* Private Use */ + ["\uECEB", "\uECEB"], /* Private Use */ + ["\uECEC", "\uECEC"], /* Private Use */ + ["\uECED", "\uECED"], /* Private Use */ + ["\uECEE", "\uECEE"], /* Private Use */ + ["\uECEF", "\uECEF"], /* Private Use */ + ["\uECF0", "\uECF0"], /* Private Use */ + ["\uECF1", "\uECF1"], /* Private Use */ + ["\uECF2", "\uECF2"], /* Private Use */ + ["\uECF3", "\uECF3"], /* Private Use */ + ["\uECF4", "\uECF4"], /* Private Use */ + ["\uECF5", "\uECF5"], /* Private Use */ + ["\uECF6", "\uECF6"], /* Private Use */ + ["\uECF7", "\uECF7"], /* Private Use */ + ["\uECF8", "\uECF8"], /* Private Use */ + ["\uECF9", "\uECF9"], /* Private Use */ + ["\uECFA", "\uECFA"], /* Private Use */ + ["\uECFB", "\uECFB"], /* Private Use */ + ["\uECFC", "\uECFC"], /* Private Use */ + ["\uECFD", "\uECFD"], /* Private Use */ + ["\uECFE", "\uECFE"], /* Private Use */ + ["\uECFF", "\uECFF"], /* Private Use */ + ["\uED00", "\uED00"], /* Private Use */ + ["\uED01", "\uED01"], /* Private Use */ + ["\uED02", "\uED02"], /* Private Use */ + ["\uED03", "\uED03"], /* Private Use */ + ["\uED04", "\uED04"], /* Private Use */ + ["\uED05", "\uED05"], /* Private Use */ + ["\uED06", "\uED06"], /* Private Use */ + ["\uED07", "\uED07"], /* Private Use */ + ["\uED08", "\uED08"], /* Private Use */ + ["\uED09", "\uED09"], /* Private Use */ + ["\uED0A", "\uED0A"], /* Private Use */ + ["\uED0B", "\uED0B"], /* Private Use */ + ["\uED0C", "\uED0C"], /* Private Use */ + ["\uED0D", "\uED0D"], /* Private Use */ + ["\uED0E", "\uED0E"], /* Private Use */ + ["\uED0F", "\uED0F"], /* Private Use */ + ["\uED10", "\uED10"], /* Private Use */ + ["\uED11", "\uED11"], /* Private Use */ + ["\uED12", "\uED12"], /* Private Use */ + ["\uED13", "\uED13"], /* Private Use */ + ["\uED14", "\uED14"], /* Private Use */ + ["\uED15", "\uED15"], /* Private Use */ + ["\uED16", "\uED16"], /* Private Use */ + ["\uED17", "\uED17"], /* Private Use */ + ["\uED18", "\uED18"], /* Private Use */ + ["\uED19", "\uED19"], /* Private Use */ + ["\uED1A", "\uED1A"], /* Private Use */ + ["\uED1B", "\uED1B"], /* Private Use */ + ["\uED1C", "\uED1C"], /* Private Use */ + ["\uED1D", "\uED1D"], /* Private Use */ + ["\uED1E", "\uED1E"], /* Private Use */ + ["\uED1F", "\uED1F"], /* Private Use */ + ["\uED20", "\uED20"], /* Private Use */ + ["\uED21", "\uED21"], /* Private Use */ + ["\uED22", "\uED22"], /* Private Use */ + ["\uED23", "\uED23"], /* Private Use */ + ["\uED24", "\uED24"], /* Private Use */ + ["\uED25", "\uED25"], /* Private Use */ + ["\uED26", "\uED26"], /* Private Use */ + ["\uED27", "\uED27"], /* Private Use */ + ["\uED28", "\uED28"], /* Private Use */ + ["\uED29", "\uED29"], /* Private Use */ + ["\uED2A", "\uED2A"], /* Private Use */ + ["\uED2B", "\uED2B"], /* Private Use */ + ["\uED2C", "\uED2C"], /* Private Use */ + ["\uED2D", "\uED2D"], /* Private Use */ + ["\uED2E", "\uED2E"], /* Private Use */ + ["\uED2F", "\uED2F"], /* Private Use */ + ["\uED30", "\uED30"], /* Private Use */ + ["\uED31", "\uED31"], /* Private Use */ + ["\uED32", "\uED32"], /* Private Use */ + ["\uED33", "\uED33"], /* Private Use */ + ["\uED34", "\uED34"], /* Private Use */ + ["\uED35", "\uED35"], /* Private Use */ + ["\uED36", "\uED36"], /* Private Use */ + ["\uED37", "\uED37"], /* Private Use */ + ["\uED38", "\uED38"], /* Private Use */ + ["\uED39", "\uED39"], /* Private Use */ + ["\uED3A", "\uED3A"], /* Private Use */ + ["\uED3B", "\uED3B"], /* Private Use */ + ["\uED3C", "\uED3C"], /* Private Use */ + ["\uED3D", "\uED3D"], /* Private Use */ + ["\uED3E", "\uED3E"], /* Private Use */ + ["\uED3F", "\uED3F"], /* Private Use */ + ["\uED40", "\uED40"], /* Private Use */ + ["\uED41", "\uED41"], /* Private Use */ + ["\uED42", "\uED42"], /* Private Use */ + ["\uED43", "\uED43"], /* Private Use */ + ["\uED44", "\uED44"], /* Private Use */ + ["\uED45", "\uED45"], /* Private Use */ + ["\uED46", "\uED46"], /* Private Use */ + ["\uED47", "\uED47"], /* Private Use */ + ["\uED48", "\uED48"], /* Private Use */ + ["\uED49", "\uED49"], /* Private Use */ + ["\uED4A", "\uED4A"], /* Private Use */ + ["\uED4B", "\uED4B"], /* Private Use */ + ["\uED4C", "\uED4C"], /* Private Use */ + ["\uED4D", "\uED4D"], /* Private Use */ + ["\uED4E", "\uED4E"], /* Private Use */ + ["\uED4F", "\uED4F"], /* Private Use */ + ["\uED50", "\uED50"], /* Private Use */ + ["\uED51", "\uED51"], /* Private Use */ + ["\uED52", "\uED52"], /* Private Use */ + ["\uED53", "\uED53"], /* Private Use */ + ["\uED54", "\uED54"], /* Private Use */ + ["\uED55", "\uED55"], /* Private Use */ + ["\uED56", "\uED56"], /* Private Use */ + ["\uED57", "\uED57"], /* Private Use */ + ["\uED58", "\uED58"], /* Private Use */ + ["\uED59", "\uED59"], /* Private Use */ + ["\uED5A", "\uED5A"], /* Private Use */ + ["\uED5B", "\uED5B"], /* Private Use */ + ["\uED5C", "\uED5C"], /* Private Use */ + ["\uED5D", "\uED5D"], /* Private Use */ + ["\uED5E", "\uED5E"], /* Private Use */ + ["\uED5F", "\uED5F"], /* Private Use */ + ["\uED60", "\uED60"], /* Private Use */ + ["\uED61", "\uED61"], /* Private Use */ + ["\uED62", "\uED62"], /* Private Use */ + ["\uED63", "\uED63"], /* Private Use */ + ["\uED64", "\uED64"], /* Private Use */ + ["\uED65", "\uED65"], /* Private Use */ + ["\uED66", "\uED66"], /* Private Use */ + ["\uED67", "\uED67"], /* Private Use */ + ["\uED68", "\uED68"], /* Private Use */ + ["\uED69", "\uED69"], /* Private Use */ + ["\uED6A", "\uED6A"], /* Private Use */ + ["\uED6B", "\uED6B"], /* Private Use */ + ["\uED6C", "\uED6C"], /* Private Use */ + ["\uED6D", "\uED6D"], /* Private Use */ + ["\uED6E", "\uED6E"], /* Private Use */ + ["\uED6F", "\uED6F"], /* Private Use */ + ["\uED70", "\uED70"], /* Private Use */ + ["\uED71", "\uED71"], /* Private Use */ + ["\uED72", "\uED72"], /* Private Use */ + ["\uED73", "\uED73"], /* Private Use */ + ["\uED74", "\uED74"], /* Private Use */ + ["\uED75", "\uED75"], /* Private Use */ + ["\uED76", "\uED76"], /* Private Use */ + ["\uED77", "\uED77"], /* Private Use */ + ["\uED78", "\uED78"], /* Private Use */ + ["\uED79", "\uED79"], /* Private Use */ + ["\uED7A", "\uED7A"], /* Private Use */ + ["\uED7B", "\uED7B"], /* Private Use */ + ["\uED7C", "\uED7C"], /* Private Use */ + ["\uED7D", "\uED7D"], /* Private Use */ + ["\uED7E", "\uED7E"], /* Private Use */ + ["\uED7F", "\uED7F"], /* Private Use */ + ["\uED80", "\uED80"], /* Private Use */ + ["\uED81", "\uED81"], /* Private Use */ + ["\uED82", "\uED82"], /* Private Use */ + ["\uED83", "\uED83"], /* Private Use */ + ["\uED84", "\uED84"], /* Private Use */ + ["\uED85", "\uED85"], /* Private Use */ + ["\uED86", "\uED86"], /* Private Use */ + ["\uED87", "\uED87"], /* Private Use */ + ["\uED88", "\uED88"], /* Private Use */ + ["\uED89", "\uED89"], /* Private Use */ + ["\uED8A", "\uED8A"], /* Private Use */ + ["\uED8B", "\uED8B"], /* Private Use */ + ["\uED8C", "\uED8C"], /* Private Use */ + ["\uED8D", "\uED8D"], /* Private Use */ + ["\uED8E", "\uED8E"], /* Private Use */ + ["\uED8F", "\uED8F"], /* Private Use */ + ["\uED90", "\uED90"], /* Private Use */ + ["\uED91", "\uED91"], /* Private Use */ + ["\uED92", "\uED92"], /* Private Use */ + ["\uED93", "\uED93"], /* Private Use */ + ["\uED94", "\uED94"], /* Private Use */ + ["\uED95", "\uED95"], /* Private Use */ + ["\uED96", "\uED96"], /* Private Use */ + ["\uED97", "\uED97"], /* Private Use */ + ["\uED98", "\uED98"], /* Private Use */ + ["\uED99", "\uED99"], /* Private Use */ + ["\uED9A", "\uED9A"], /* Private Use */ + ["\uED9B", "\uED9B"], /* Private Use */ + ["\uED9C", "\uED9C"], /* Private Use */ + ["\uED9D", "\uED9D"], /* Private Use */ + ["\uED9E", "\uED9E"], /* Private Use */ + ["\uED9F", "\uED9F"], /* Private Use */ + ["\uEDA0", "\uEDA0"], /* Private Use */ + ["\uEDA1", "\uEDA1"], /* Private Use */ + ["\uEDA2", "\uEDA2"], /* Private Use */ + ["\uEDA3", "\uEDA3"], /* Private Use */ + ["\uEDA4", "\uEDA4"], /* Private Use */ + ["\uEDA5", "\uEDA5"], /* Private Use */ + ["\uEDA6", "\uEDA6"], /* Private Use */ + ["\uEDA7", "\uEDA7"], /* Private Use */ + ["\uEDA8", "\uEDA8"], /* Private Use */ + ["\uEDA9", "\uEDA9"], /* Private Use */ + ["\uEDAA", "\uEDAA"], /* Private Use */ + ["\uEDAB", "\uEDAB"], /* Private Use */ + ["\uEDAC", "\uEDAC"], /* Private Use */ + ["\uEDAD", "\uEDAD"], /* Private Use */ + ["\uEDAE", "\uEDAE"], /* Private Use */ + ["\uEDAF", "\uEDAF"], /* Private Use */ + ["\uEDB0", "\uEDB0"], /* Private Use */ + ["\uEDB1", "\uEDB1"], /* Private Use */ + ["\uEDB2", "\uEDB2"], /* Private Use */ + ["\uEDB3", "\uEDB3"], /* Private Use */ + ["\uEDB4", "\uEDB4"], /* Private Use */ + ["\uEDB5", "\uEDB5"], /* Private Use */ + ["\uEDB6", "\uEDB6"], /* Private Use */ + ["\uEDB7", "\uEDB7"], /* Private Use */ + ["\uEDB8", "\uEDB8"], /* Private Use */ + ["\uEDB9", "\uEDB9"], /* Private Use */ + ["\uEDBA", "\uEDBA"], /* Private Use */ + ["\uEDBB", "\uEDBB"], /* Private Use */ + ["\uEDBC", "\uEDBC"], /* Private Use */ + ["\uEDBD", "\uEDBD"], /* Private Use */ + ["\uEDBE", "\uEDBE"], /* Private Use */ + ["\uEDBF", "\uEDBF"], /* Private Use */ + ["\uEDC0", "\uEDC0"], /* Private Use */ + ["\uEDC1", "\uEDC1"], /* Private Use */ + ["\uEDC2", "\uEDC2"], /* Private Use */ + ["\uEDC3", "\uEDC3"], /* Private Use */ + ["\uEDC4", "\uEDC4"], /* Private Use */ + ["\uEDC5", "\uEDC5"], /* Private Use */ + ["\uEDC6", "\uEDC6"], /* Private Use */ + ["\uEDC7", "\uEDC7"], /* Private Use */ + ["\uEDC8", "\uEDC8"], /* Private Use */ + ["\uEDC9", "\uEDC9"], /* Private Use */ + ["\uEDCA", "\uEDCA"], /* Private Use */ + ["\uEDCB", "\uEDCB"], /* Private Use */ + ["\uEDCC", "\uEDCC"], /* Private Use */ + ["\uEDCD", "\uEDCD"], /* Private Use */ + ["\uEDCE", "\uEDCE"], /* Private Use */ + ["\uEDCF", "\uEDCF"], /* Private Use */ + ["\uEDD0", "\uEDD0"], /* Private Use */ + ["\uEDD1", "\uEDD1"], /* Private Use */ + ["\uEDD2", "\uEDD2"], /* Private Use */ + ["\uEDD3", "\uEDD3"], /* Private Use */ + ["\uEDD4", "\uEDD4"], /* Private Use */ + ["\uEDD5", "\uEDD5"], /* Private Use */ + ["\uEDD6", "\uEDD6"], /* Private Use */ + ["\uEDD7", "\uEDD7"], /* Private Use */ + ["\uEDD8", "\uEDD8"], /* Private Use */ + ["\uEDD9", "\uEDD9"], /* Private Use */ + ["\uEDDA", "\uEDDA"], /* Private Use */ + ["\uEDDB", "\uEDDB"], /* Private Use */ + ["\uEDDC", "\uEDDC"], /* Private Use */ + ["\uEDDD", "\uEDDD"], /* Private Use */ + ["\uEDDE", "\uEDDE"], /* Private Use */ + ["\uEDDF", "\uEDDF"], /* Private Use */ + ["\uEDE0", "\uEDE0"], /* Private Use */ + ["\uEDE1", "\uEDE1"], /* Private Use */ + ["\uEDE2", "\uEDE2"], /* Private Use */ + ["\uEDE3", "\uEDE3"], /* Private Use */ + ["\uEDE4", "\uEDE4"], /* Private Use */ + ["\uEDE5", "\uEDE5"], /* Private Use */ + ["\uEDE6", "\uEDE6"], /* Private Use */ + ["\uEDE7", "\uEDE7"], /* Private Use */ + ["\uEDE8", "\uEDE8"], /* Private Use */ + ["\uEDE9", "\uEDE9"], /* Private Use */ + ["\uEDEA", "\uEDEA"], /* Private Use */ + ["\uEDEB", "\uEDEB"], /* Private Use */ + ["\uEDEC", "\uEDEC"], /* Private Use */ + ["\uEDED", "\uEDED"], /* Private Use */ + ["\uEDEE", "\uEDEE"], /* Private Use */ + ["\uEDEF", "\uEDEF"], /* Private Use */ + ["\uEDF0", "\uEDF0"], /* Private Use */ + ["\uEDF1", "\uEDF1"], /* Private Use */ + ["\uEDF2", "\uEDF2"], /* Private Use */ + ["\uEDF3", "\uEDF3"], /* Private Use */ + ["\uEDF4", "\uEDF4"], /* Private Use */ + ["\uEDF5", "\uEDF5"], /* Private Use */ + ["\uEDF6", "\uEDF6"], /* Private Use */ + ["\uEDF7", "\uEDF7"], /* Private Use */ + ["\uEDF8", "\uEDF8"], /* Private Use */ + ["\uEDF9", "\uEDF9"], /* Private Use */ + ["\uEDFA", "\uEDFA"], /* Private Use */ + ["\uEDFB", "\uEDFB"], /* Private Use */ + ["\uEDFC", "\uEDFC"], /* Private Use */ + ["\uEDFD", "\uEDFD"], /* Private Use */ + ["\uEDFE", "\uEDFE"], /* Private Use */ + ["\uEDFF", "\uEDFF"], /* Private Use */ + ["\uEE00", "\uEE00"], /* Private Use */ + ["\uEE01", "\uEE01"], /* Private Use */ + ["\uEE02", "\uEE02"], /* Private Use */ + ["\uEE03", "\uEE03"], /* Private Use */ + ["\uEE04", "\uEE04"], /* Private Use */ + ["\uEE05", "\uEE05"], /* Private Use */ + ["\uEE06", "\uEE06"], /* Private Use */ + ["\uEE07", "\uEE07"], /* Private Use */ + ["\uEE08", "\uEE08"], /* Private Use */ + ["\uEE09", "\uEE09"], /* Private Use */ + ["\uEE0A", "\uEE0A"], /* Private Use */ + ["\uEE0B", "\uEE0B"], /* Private Use */ + ["\uEE0C", "\uEE0C"], /* Private Use */ + ["\uEE0D", "\uEE0D"], /* Private Use */ + ["\uEE0E", "\uEE0E"], /* Private Use */ + ["\uEE0F", "\uEE0F"], /* Private Use */ + ["\uEE10", "\uEE10"], /* Private Use */ + ["\uEE11", "\uEE11"], /* Private Use */ + ["\uEE12", "\uEE12"], /* Private Use */ + ["\uEE13", "\uEE13"], /* Private Use */ + ["\uEE14", "\uEE14"], /* Private Use */ + ["\uEE15", "\uEE15"], /* Private Use */ + ["\uEE16", "\uEE16"], /* Private Use */ + ["\uEE17", "\uEE17"], /* Private Use */ + ["\uEE18", "\uEE18"], /* Private Use */ + ["\uEE19", "\uEE19"], /* Private Use */ + ["\uEE1A", "\uEE1A"], /* Private Use */ + ["\uEE1B", "\uEE1B"], /* Private Use */ + ["\uEE1C", "\uEE1C"], /* Private Use */ + ["\uEE1D", "\uEE1D"], /* Private Use */ + ["\uEE1E", "\uEE1E"], /* Private Use */ + ["\uEE1F", "\uEE1F"], /* Private Use */ + ["\uEE20", "\uEE20"], /* Private Use */ + ["\uEE21", "\uEE21"], /* Private Use */ + ["\uEE22", "\uEE22"], /* Private Use */ + ["\uEE23", "\uEE23"], /* Private Use */ + ["\uEE24", "\uEE24"], /* Private Use */ + ["\uEE25", "\uEE25"], /* Private Use */ + ["\uEE26", "\uEE26"], /* Private Use */ + ["\uEE27", "\uEE27"], /* Private Use */ + ["\uEE28", "\uEE28"], /* Private Use */ + ["\uEE29", "\uEE29"], /* Private Use */ + ["\uEE2A", "\uEE2A"], /* Private Use */ + ["\uEE2B", "\uEE2B"], /* Private Use */ + ["\uEE2C", "\uEE2C"], /* Private Use */ + ["\uEE2D", "\uEE2D"], /* Private Use */ + ["\uEE2E", "\uEE2E"], /* Private Use */ + ["\uEE2F", "\uEE2F"], /* Private Use */ + ["\uEE30", "\uEE30"], /* Private Use */ + ["\uEE31", "\uEE31"], /* Private Use */ + ["\uEE32", "\uEE32"], /* Private Use */ + ["\uEE33", "\uEE33"], /* Private Use */ + ["\uEE34", "\uEE34"], /* Private Use */ + ["\uEE35", "\uEE35"], /* Private Use */ + ["\uEE36", "\uEE36"], /* Private Use */ + ["\uEE37", "\uEE37"], /* Private Use */ + ["\uEE38", "\uEE38"], /* Private Use */ + ["\uEE39", "\uEE39"], /* Private Use */ + ["\uEE3A", "\uEE3A"], /* Private Use */ + ["\uEE3B", "\uEE3B"], /* Private Use */ + ["\uEE3C", "\uEE3C"], /* Private Use */ + ["\uEE3D", "\uEE3D"], /* Private Use */ + ["\uEE3E", "\uEE3E"], /* Private Use */ + ["\uEE3F", "\uEE3F"], /* Private Use */ + ["\uEE40", "\uEE40"], /* Private Use */ + ["\uEE41", "\uEE41"], /* Private Use */ + ["\uEE42", "\uEE42"], /* Private Use */ + ["\uEE43", "\uEE43"], /* Private Use */ + ["\uEE44", "\uEE44"], /* Private Use */ + ["\uEE45", "\uEE45"], /* Private Use */ + ["\uEE46", "\uEE46"], /* Private Use */ + ["\uEE47", "\uEE47"], /* Private Use */ + ["\uEE48", "\uEE48"], /* Private Use */ + ["\uEE49", "\uEE49"], /* Private Use */ + ["\uEE4A", "\uEE4A"], /* Private Use */ + ["\uEE4B", "\uEE4B"], /* Private Use */ + ["\uEE4C", "\uEE4C"], /* Private Use */ + ["\uEE4D", "\uEE4D"], /* Private Use */ + ["\uEE4E", "\uEE4E"], /* Private Use */ + ["\uEE4F", "\uEE4F"], /* Private Use */ + ["\uEE50", "\uEE50"], /* Private Use */ + ["\uEE51", "\uEE51"], /* Private Use */ + ["\uEE52", "\uEE52"], /* Private Use */ + ["\uEE53", "\uEE53"], /* Private Use */ + ["\uEE54", "\uEE54"], /* Private Use */ + ["\uEE55", "\uEE55"], /* Private Use */ + ["\uEE56", "\uEE56"], /* Private Use */ + ["\uEE57", "\uEE57"], /* Private Use */ + ["\uEE58", "\uEE58"], /* Private Use */ + ["\uEE59", "\uEE59"], /* Private Use */ + ["\uEE5A", "\uEE5A"], /* Private Use */ + ["\uEE5B", "\uEE5B"], /* Private Use */ + ["\uEE5C", "\uEE5C"], /* Private Use */ + ["\uEE5D", "\uEE5D"], /* Private Use */ + ["\uEE5E", "\uEE5E"], /* Private Use */ + ["\uEE5F", "\uEE5F"], /* Private Use */ + ["\uEE60", "\uEE60"], /* Private Use */ + ["\uEE61", "\uEE61"], /* Private Use */ + ["\uEE62", "\uEE62"], /* Private Use */ + ["\uEE63", "\uEE63"], /* Private Use */ + ["\uEE64", "\uEE64"], /* Private Use */ + ["\uEE65", "\uEE65"], /* Private Use */ + ["\uEE66", "\uEE66"], /* Private Use */ + ["\uEE67", "\uEE67"], /* Private Use */ + ["\uEE68", "\uEE68"], /* Private Use */ + ["\uEE69", "\uEE69"], /* Private Use */ + ["\uEE6A", "\uEE6A"], /* Private Use */ + ["\uEE6B", "\uEE6B"], /* Private Use */ + ["\uEE6C", "\uEE6C"], /* Private Use */ + ["\uEE6D", "\uEE6D"], /* Private Use */ + ["\uEE6E", "\uEE6E"], /* Private Use */ + ["\uEE6F", "\uEE6F"], /* Private Use */ + ["\uEE70", "\uEE70"], /* Private Use */ + ["\uEE71", "\uEE71"], /* Private Use */ + ["\uEE72", "\uEE72"], /* Private Use */ + ["\uEE73", "\uEE73"], /* Private Use */ + ["\uEE74", "\uEE74"], /* Private Use */ + ["\uEE75", "\uEE75"], /* Private Use */ + ["\uEE76", "\uEE76"], /* Private Use */ + ["\uEE77", "\uEE77"], /* Private Use */ + ["\uEE78", "\uEE78"], /* Private Use */ + ["\uEE79", "\uEE79"], /* Private Use */ + ["\uEE7A", "\uEE7A"], /* Private Use */ + ["\uEE7B", "\uEE7B"], /* Private Use */ + ["\uEE7C", "\uEE7C"], /* Private Use */ + ["\uEE7D", "\uEE7D"], /* Private Use */ + ["\uEE7E", "\uEE7E"], /* Private Use */ + ["\uEE7F", "\uEE7F"], /* Private Use */ + ["\uEE80", "\uEE80"], /* Private Use */ + ["\uEE81", "\uEE81"], /* Private Use */ + ["\uEE82", "\uEE82"], /* Private Use */ + ["\uEE83", "\uEE83"], /* Private Use */ + ["\uEE84", "\uEE84"], /* Private Use */ + ["\uEE85", "\uEE85"], /* Private Use */ + ["\uEE86", "\uEE86"], /* Private Use */ + ["\uEE87", "\uEE87"], /* Private Use */ + ["\uEE88", "\uEE88"], /* Private Use */ + ["\uEE89", "\uEE89"], /* Private Use */ + ["\uEE8A", "\uEE8A"], /* Private Use */ + ["\uEE8B", "\uEE8B"], /* Private Use */ + ["\uEE8C", "\uEE8C"], /* Private Use */ + ["\uEE8D", "\uEE8D"], /* Private Use */ + ["\uEE8E", "\uEE8E"], /* Private Use */ + ["\uEE8F", "\uEE8F"], /* Private Use */ + ["\uEE90", "\uEE90"], /* Private Use */ + ["\uEE91", "\uEE91"], /* Private Use */ + ["\uEE92", "\uEE92"], /* Private Use */ + ["\uEE93", "\uEE93"], /* Private Use */ + ["\uEE94", "\uEE94"], /* Private Use */ + ["\uEE95", "\uEE95"], /* Private Use */ + ["\uEE96", "\uEE96"], /* Private Use */ + ["\uEE97", "\uEE97"], /* Private Use */ + ["\uEE98", "\uEE98"], /* Private Use */ + ["\uEE99", "\uEE99"], /* Private Use */ + ["\uEE9A", "\uEE9A"], /* Private Use */ + ["\uEE9B", "\uEE9B"], /* Private Use */ + ["\uEE9C", "\uEE9C"], /* Private Use */ + ["\uEE9D", "\uEE9D"], /* Private Use */ + ["\uEE9E", "\uEE9E"], /* Private Use */ + ["\uEE9F", "\uEE9F"], /* Private Use */ + ["\uEEA0", "\uEEA0"], /* Private Use */ + ["\uEEA1", "\uEEA1"], /* Private Use */ + ["\uEEA2", "\uEEA2"], /* Private Use */ + ["\uEEA3", "\uEEA3"], /* Private Use */ + ["\uEEA4", "\uEEA4"], /* Private Use */ + ["\uEEA5", "\uEEA5"], /* Private Use */ + ["\uEEA6", "\uEEA6"], /* Private Use */ + ["\uEEA7", "\uEEA7"], /* Private Use */ + ["\uEEA8", "\uEEA8"], /* Private Use */ + ["\uEEA9", "\uEEA9"], /* Private Use */ + ["\uEEAA", "\uEEAA"], /* Private Use */ + ["\uEEAB", "\uEEAB"], /* Private Use */ + ["\uEEAC", "\uEEAC"], /* Private Use */ + ["\uEEAD", "\uEEAD"], /* Private Use */ + ["\uEEAE", "\uEEAE"], /* Private Use */ + ["\uEEAF", "\uEEAF"], /* Private Use */ + ["\uEEB0", "\uEEB0"], /* Private Use */ + ["\uEEB1", "\uEEB1"], /* Private Use */ + ["\uEEB2", "\uEEB2"], /* Private Use */ + ["\uEEB3", "\uEEB3"], /* Private Use */ + ["\uEEB4", "\uEEB4"], /* Private Use */ + ["\uEEB5", "\uEEB5"], /* Private Use */ + ["\uEEB6", "\uEEB6"], /* Private Use */ + ["\uEEB7", "\uEEB7"], /* Private Use */ + ["\uEEB8", "\uEEB8"], /* Private Use */ + ["\uEEB9", "\uEEB9"], /* Private Use */ + ["\uEEBA", "\uEEBA"], /* Private Use */ + ["\uEEBB", "\uEEBB"], /* Private Use */ + ["\uEEBC", "\uEEBC"], /* Private Use */ + ["\uEEBD", "\uEEBD"], /* Private Use */ + ["\uEEBE", "\uEEBE"], /* Private Use */ + ["\uEEBF", "\uEEBF"], /* Private Use */ + ["\uEEC0", "\uEEC0"], /* Private Use */ + ["\uEEC1", "\uEEC1"], /* Private Use */ + ["\uEEC2", "\uEEC2"], /* Private Use */ + ["\uEEC3", "\uEEC3"], /* Private Use */ + ["\uEEC4", "\uEEC4"], /* Private Use */ + ["\uEEC5", "\uEEC5"], /* Private Use */ + ["\uEEC6", "\uEEC6"], /* Private Use */ + ["\uEEC7", "\uEEC7"], /* Private Use */ + ["\uEEC8", "\uEEC8"], /* Private Use */ + ["\uEEC9", "\uEEC9"], /* Private Use */ + ["\uEECA", "\uEECA"], /* Private Use */ + ["\uEECB", "\uEECB"], /* Private Use */ + ["\uEECC", "\uEECC"], /* Private Use */ + ["\uEECD", "\uEECD"], /* Private Use */ + ["\uEECE", "\uEECE"], /* Private Use */ + ["\uEECF", "\uEECF"], /* Private Use */ + ["\uEED0", "\uEED0"], /* Private Use */ + ["\uEED1", "\uEED1"], /* Private Use */ + ["\uEED2", "\uEED2"], /* Private Use */ + ["\uEED3", "\uEED3"], /* Private Use */ + ["\uEED4", "\uEED4"], /* Private Use */ + ["\uEED5", "\uEED5"], /* Private Use */ + ["\uEED6", "\uEED6"], /* Private Use */ + ["\uEED7", "\uEED7"], /* Private Use */ + ["\uEED8", "\uEED8"], /* Private Use */ + ["\uEED9", "\uEED9"], /* Private Use */ + ["\uEEDA", "\uEEDA"], /* Private Use */ + ["\uEEDB", "\uEEDB"], /* Private Use */ + ["\uEEDC", "\uEEDC"], /* Private Use */ + ["\uEEDD", "\uEEDD"], /* Private Use */ + ["\uEEDE", "\uEEDE"], /* Private Use */ + ["\uEEDF", "\uEEDF"], /* Private Use */ + ["\uEEE0", "\uEEE0"], /* Private Use */ + ["\uEEE1", "\uEEE1"], /* Private Use */ + ["\uEEE2", "\uEEE2"], /* Private Use */ + ["\uEEE3", "\uEEE3"], /* Private Use */ + ["\uEEE4", "\uEEE4"], /* Private Use */ + ["\uEEE5", "\uEEE5"], /* Private Use */ + ["\uEEE6", "\uEEE6"], /* Private Use */ + ["\uEEE7", "\uEEE7"], /* Private Use */ + ["\uEEE8", "\uEEE8"], /* Private Use */ + ["\uEEE9", "\uEEE9"], /* Private Use */ + ["\uEEEA", "\uEEEA"], /* Private Use */ + ["\uEEEB", "\uEEEB"], /* Private Use */ + ["\uEEEC", "\uEEEC"], /* Private Use */ + ["\uEEED", "\uEEED"], /* Private Use */ + ["\uEEEE", "\uEEEE"], /* Private Use */ + ["\uEEEF", "\uEEEF"], /* Private Use */ + ["\uEEF0", "\uEEF0"], /* Private Use */ + ["\uEEF1", "\uEEF1"], /* Private Use */ + ["\uEEF2", "\uEEF2"], /* Private Use */ + ["\uEEF3", "\uEEF3"], /* Private Use */ + ["\uEEF4", "\uEEF4"], /* Private Use */ + ["\uEEF5", "\uEEF5"], /* Private Use */ + ["\uEEF6", "\uEEF6"], /* Private Use */ + ["\uEEF7", "\uEEF7"], /* Private Use */ + ["\uEEF8", "\uEEF8"], /* Private Use */ + ["\uEEF9", "\uEEF9"], /* Private Use */ + ["\uEEFA", "\uEEFA"], /* Private Use */ + ["\uEEFB", "\uEEFB"], /* Private Use */ + ["\uEEFC", "\uEEFC"], /* Private Use */ + ["\uEEFD", "\uEEFD"], /* Private Use */ + ["\uEEFE", "\uEEFE"], /* Private Use */ + ["\uEEFF", "\uEEFF"], /* Private Use */ + ["\uEF00", "\uEF00"], /* Private Use */ + ["\uEF01", "\uEF01"], /* Private Use */ + ["\uEF02", "\uEF02"], /* Private Use */ + ["\uEF03", "\uEF03"], /* Private Use */ + ["\uEF04", "\uEF04"], /* Private Use */ + ["\uEF05", "\uEF05"], /* Private Use */ + ["\uEF06", "\uEF06"], /* Private Use */ + ["\uEF07", "\uEF07"], /* Private Use */ + ["\uEF08", "\uEF08"], /* Private Use */ + ["\uEF09", "\uEF09"], /* Private Use */ + ["\uEF0A", "\uEF0A"], /* Private Use */ + ["\uEF0B", "\uEF0B"], /* Private Use */ + ["\uEF0C", "\uEF0C"], /* Private Use */ + ["\uEF0D", "\uEF0D"], /* Private Use */ + ["\uEF0E", "\uEF0E"], /* Private Use */ + ["\uEF0F", "\uEF0F"], /* Private Use */ + ["\uEF10", "\uEF10"], /* Private Use */ + ["\uEF11", "\uEF11"], /* Private Use */ + ["\uEF12", "\uEF12"], /* Private Use */ + ["\uEF13", "\uEF13"], /* Private Use */ + ["\uEF14", "\uEF14"], /* Private Use */ + ["\uEF15", "\uEF15"], /* Private Use */ + ["\uEF16", "\uEF16"], /* Private Use */ + ["\uEF17", "\uEF17"], /* Private Use */ + ["\uEF18", "\uEF18"], /* Private Use */ + ["\uEF19", "\uEF19"], /* Private Use */ + ["\uEF1A", "\uEF1A"], /* Private Use */ + ["\uEF1B", "\uEF1B"], /* Private Use */ + ["\uEF1C", "\uEF1C"], /* Private Use */ + ["\uEF1D", "\uEF1D"], /* Private Use */ + ["\uEF1E", "\uEF1E"], /* Private Use */ + ["\uEF1F", "\uEF1F"], /* Private Use */ + ["\uEF20", "\uEF20"], /* Private Use */ + ["\uEF21", "\uEF21"], /* Private Use */ + ["\uEF22", "\uEF22"], /* Private Use */ + ["\uEF23", "\uEF23"], /* Private Use */ + ["\uEF24", "\uEF24"], /* Private Use */ + ["\uEF25", "\uEF25"], /* Private Use */ + ["\uEF26", "\uEF26"], /* Private Use */ + ["\uEF27", "\uEF27"], /* Private Use */ + ["\uEF28", "\uEF28"], /* Private Use */ + ["\uEF29", "\uEF29"], /* Private Use */ + ["\uEF2A", "\uEF2A"], /* Private Use */ + ["\uEF2B", "\uEF2B"], /* Private Use */ + ["\uEF2C", "\uEF2C"], /* Private Use */ + ["\uEF2D", "\uEF2D"], /* Private Use */ + ["\uEF2E", "\uEF2E"], /* Private Use */ + ["\uEF2F", "\uEF2F"], /* Private Use */ + ["\uEF30", "\uEF30"], /* Private Use */ + ["\uEF31", "\uEF31"], /* Private Use */ + ["\uEF32", "\uEF32"], /* Private Use */ + ["\uEF33", "\uEF33"], /* Private Use */ + ["\uEF34", "\uEF34"], /* Private Use */ + ["\uEF35", "\uEF35"], /* Private Use */ + ["\uEF36", "\uEF36"], /* Private Use */ + ["\uEF37", "\uEF37"], /* Private Use */ + ["\uEF38", "\uEF38"], /* Private Use */ + ["\uEF39", "\uEF39"], /* Private Use */ + ["\uEF3A", "\uEF3A"], /* Private Use */ + ["\uEF3B", "\uEF3B"], /* Private Use */ + ["\uEF3C", "\uEF3C"], /* Private Use */ + ["\uEF3D", "\uEF3D"], /* Private Use */ + ["\uEF3E", "\uEF3E"], /* Private Use */ + ["\uEF3F", "\uEF3F"], /* Private Use */ + ["\uEF40", "\uEF40"], /* Private Use */ + ["\uEF41", "\uEF41"], /* Private Use */ + ["\uEF42", "\uEF42"], /* Private Use */ + ["\uEF43", "\uEF43"], /* Private Use */ + ["\uEF44", "\uEF44"], /* Private Use */ + ["\uEF45", "\uEF45"], /* Private Use */ + ["\uEF46", "\uEF46"], /* Private Use */ + ["\uEF47", "\uEF47"], /* Private Use */ + ["\uEF48", "\uEF48"], /* Private Use */ + ["\uEF49", "\uEF49"], /* Private Use */ + ["\uEF4A", "\uEF4A"], /* Private Use */ + ["\uEF4B", "\uEF4B"], /* Private Use */ + ["\uEF4C", "\uEF4C"], /* Private Use */ + ["\uEF4D", "\uEF4D"], /* Private Use */ + ["\uEF4E", "\uEF4E"], /* Private Use */ + ["\uEF4F", "\uEF4F"], /* Private Use */ + ["\uEF50", "\uEF50"], /* Private Use */ + ["\uEF51", "\uEF51"], /* Private Use */ + ["\uEF52", "\uEF52"], /* Private Use */ + ["\uEF53", "\uEF53"], /* Private Use */ + ["\uEF54", "\uEF54"], /* Private Use */ + ["\uEF55", "\uEF55"], /* Private Use */ + ["\uEF56", "\uEF56"], /* Private Use */ + ["\uEF57", "\uEF57"], /* Private Use */ + ["\uEF58", "\uEF58"], /* Private Use */ + ["\uEF59", "\uEF59"], /* Private Use */ + ["\uEF5A", "\uEF5A"], /* Private Use */ + ["\uEF5B", "\uEF5B"], /* Private Use */ + ["\uEF5C", "\uEF5C"], /* Private Use */ + ["\uEF5D", "\uEF5D"], /* Private Use */ + ["\uEF5E", "\uEF5E"], /* Private Use */ + ["\uEF5F", "\uEF5F"], /* Private Use */ + ["\uEF60", "\uEF60"], /* Private Use */ + ["\uEF61", "\uEF61"], /* Private Use */ + ["\uEF62", "\uEF62"], /* Private Use */ + ["\uEF63", "\uEF63"], /* Private Use */ + ["\uEF64", "\uEF64"], /* Private Use */ + ["\uEF65", "\uEF65"], /* Private Use */ + ["\uEF66", "\uEF66"], /* Private Use */ + ["\uEF67", "\uEF67"], /* Private Use */ + ["\uEF68", "\uEF68"], /* Private Use */ + ["\uEF69", "\uEF69"], /* Private Use */ + ["\uEF6A", "\uEF6A"], /* Private Use */ + ["\uEF6B", "\uEF6B"], /* Private Use */ + ["\uEF6C", "\uEF6C"], /* Private Use */ + ["\uEF6D", "\uEF6D"], /* Private Use */ + ["\uEF6E", "\uEF6E"], /* Private Use */ + ["\uEF6F", "\uEF6F"], /* Private Use */ + ["\uEF70", "\uEF70"], /* Private Use */ + ["\uEF71", "\uEF71"], /* Private Use */ + ["\uEF72", "\uEF72"], /* Private Use */ + ["\uEF73", "\uEF73"], /* Private Use */ + ["\uEF74", "\uEF74"], /* Private Use */ + ["\uEF75", "\uEF75"], /* Private Use */ + ["\uEF76", "\uEF76"], /* Private Use */ + ["\uEF77", "\uEF77"], /* Private Use */ + ["\uEF78", "\uEF78"], /* Private Use */ + ["\uEF79", "\uEF79"], /* Private Use */ + ["\uEF7A", "\uEF7A"], /* Private Use */ + ["\uEF7B", "\uEF7B"], /* Private Use */ + ["\uEF7C", "\uEF7C"], /* Private Use */ + ["\uEF7D", "\uEF7D"], /* Private Use */ + ["\uEF7E", "\uEF7E"], /* Private Use */ + ["\uEF7F", "\uEF7F"], /* Private Use */ + ["\uEF80", "\uEF80"], /* Private Use */ + ["\uEF81", "\uEF81"], /* Private Use */ + ["\uEF82", "\uEF82"], /* Private Use */ + ["\uEF83", "\uEF83"], /* Private Use */ + ["\uEF84", "\uEF84"], /* Private Use */ + ["\uEF85", "\uEF85"], /* Private Use */ + ["\uEF86", "\uEF86"], /* Private Use */ + ["\uEF87", "\uEF87"], /* Private Use */ + ["\uEF88", "\uEF88"], /* Private Use */ + ["\uEF89", "\uEF89"], /* Private Use */ + ["\uEF8A", "\uEF8A"], /* Private Use */ + ["\uEF8B", "\uEF8B"], /* Private Use */ + ["\uEF8C", "\uEF8C"], /* Private Use */ + ["\uEF8D", "\uEF8D"], /* Private Use */ + ["\uEF8E", "\uEF8E"], /* Private Use */ + ["\uEF8F", "\uEF8F"], /* Private Use */ + ["\uEF90", "\uEF90"], /* Private Use */ + ["\uEF91", "\uEF91"], /* Private Use */ + ["\uEF92", "\uEF92"], /* Private Use */ + ["\uEF93", "\uEF93"], /* Private Use */ + ["\uEF94", "\uEF94"], /* Private Use */ + ["\uEF95", "\uEF95"], /* Private Use */ + ["\uEF96", "\uEF96"], /* Private Use */ + ["\uEF97", "\uEF97"], /* Private Use */ + ["\uEF98", "\uEF98"], /* Private Use */ + ["\uEF99", "\uEF99"], /* Private Use */ + ["\uEF9A", "\uEF9A"], /* Private Use */ + ["\uEF9B", "\uEF9B"], /* Private Use */ + ["\uEF9C", "\uEF9C"], /* Private Use */ + ["\uEF9D", "\uEF9D"], /* Private Use */ + ["\uEF9E", "\uEF9E"], /* Private Use */ + ["\uEF9F", "\uEF9F"], /* Private Use */ + ["\uEFA0", "\uEFA0"], /* Private Use */ + ["\uEFA1", "\uEFA1"], /* Private Use */ + ["\uEFA2", "\uEFA2"], /* Private Use */ + ["\uEFA3", "\uEFA3"], /* Private Use */ + ["\uEFA4", "\uEFA4"], /* Private Use */ + ["\uEFA5", "\uEFA5"], /* Private Use */ + ["\uEFA6", "\uEFA6"], /* Private Use */ + ["\uEFA7", "\uEFA7"], /* Private Use */ + ["\uEFA8", "\uEFA8"], /* Private Use */ + ["\uEFA9", "\uEFA9"], /* Private Use */ + ["\uEFAA", "\uEFAA"], /* Private Use */ + ["\uEFAB", "\uEFAB"], /* Private Use */ + ["\uEFAC", "\uEFAC"], /* Private Use */ + ["\uEFAD", "\uEFAD"], /* Private Use */ + ["\uEFAE", "\uEFAE"], /* Private Use */ + ["\uEFAF", "\uEFAF"], /* Private Use */ + ["\uEFB0", "\uEFB0"], /* Private Use */ + ["\uEFB1", "\uEFB1"], /* Private Use */ + ["\uEFB2", "\uEFB2"], /* Private Use */ + ["\uEFB3", "\uEFB3"], /* Private Use */ + ["\uEFB4", "\uEFB4"], /* Private Use */ + ["\uEFB5", "\uEFB5"], /* Private Use */ + ["\uEFB6", "\uEFB6"], /* Private Use */ + ["\uEFB7", "\uEFB7"], /* Private Use */ + ["\uEFB8", "\uEFB8"], /* Private Use */ + ["\uEFB9", "\uEFB9"], /* Private Use */ + ["\uEFBA", "\uEFBA"], /* Private Use */ + ["\uEFBB", "\uEFBB"], /* Private Use */ + ["\uEFBC", "\uEFBC"], /* Private Use */ + ["\uEFBD", "\uEFBD"], /* Private Use */ + ["\uEFBE", "\uEFBE"], /* Private Use */ + ["\uEFBF", "\uEFBF"], /* Private Use */ + ["\uEFC0", "\uEFC0"], /* Private Use */ + ["\uEFC1", "\uEFC1"], /* Private Use */ + ["\uEFC2", "\uEFC2"], /* Private Use */ + ["\uEFC3", "\uEFC3"], /* Private Use */ + ["\uEFC4", "\uEFC4"], /* Private Use */ + ["\uEFC5", "\uEFC5"], /* Private Use */ + ["\uEFC6", "\uEFC6"], /* Private Use */ + ["\uEFC7", "\uEFC7"], /* Private Use */ + ["\uEFC8", "\uEFC8"], /* Private Use */ + ["\uEFC9", "\uEFC9"], /* Private Use */ + ["\uEFCA", "\uEFCA"], /* Private Use */ + ["\uEFCB", "\uEFCB"], /* Private Use */ + ["\uEFCC", "\uEFCC"], /* Private Use */ + ["\uEFCD", "\uEFCD"], /* Private Use */ + ["\uEFCE", "\uEFCE"], /* Private Use */ + ["\uEFCF", "\uEFCF"], /* Private Use */ + ["\uEFD0", "\uEFD0"], /* Private Use */ + ["\uEFD1", "\uEFD1"], /* Private Use */ + ["\uEFD2", "\uEFD2"], /* Private Use */ + ["\uEFD3", "\uEFD3"], /* Private Use */ + ["\uEFD4", "\uEFD4"], /* Private Use */ + ["\uEFD5", "\uEFD5"], /* Private Use */ + ["\uEFD6", "\uEFD6"], /* Private Use */ + ["\uEFD7", "\uEFD7"], /* Private Use */ + ["\uEFD8", "\uEFD8"], /* Private Use */ + ["\uEFD9", "\uEFD9"], /* Private Use */ + ["\uEFDA", "\uEFDA"], /* Private Use */ + ["\uEFDB", "\uEFDB"], /* Private Use */ + ["\uEFDC", "\uEFDC"], /* Private Use */ + ["\uEFDD", "\uEFDD"], /* Private Use */ + ["\uEFDE", "\uEFDE"], /* Private Use */ + ["\uEFDF", "\uEFDF"], /* Private Use */ + ["\uEFE0", "\uEFE0"], /* Private Use */ + ["\uEFE1", "\uEFE1"], /* Private Use */ + ["\uEFE2", "\uEFE2"], /* Private Use */ + ["\uEFE3", "\uEFE3"], /* Private Use */ + ["\uEFE4", "\uEFE4"], /* Private Use */ + ["\uEFE5", "\uEFE5"], /* Private Use */ + ["\uEFE6", "\uEFE6"], /* Private Use */ + ["\uEFE7", "\uEFE7"], /* Private Use */ + ["\uEFE8", "\uEFE8"], /* Private Use */ + ["\uEFE9", "\uEFE9"], /* Private Use */ + ["\uEFEA", "\uEFEA"], /* Private Use */ + ["\uEFEB", "\uEFEB"], /* Private Use */ + ["\uEFEC", "\uEFEC"], /* Private Use */ + ["\uEFED", "\uEFED"], /* Private Use */ + ["\uEFEE", "\uEFEE"], /* Private Use */ + ["\uEFEF", "\uEFEF"], /* Private Use */ + ["\uEFF0", "\uEFF0"], /* Private Use */ + ["\uEFF1", "\uEFF1"], /* Private Use */ + ["\uEFF2", "\uEFF2"], /* Private Use */ + ["\uEFF3", "\uEFF3"], /* Private Use */ + ["\uEFF4", "\uEFF4"], /* Private Use */ + ["\uEFF5", "\uEFF5"], /* Private Use */ + ["\uEFF6", "\uEFF6"], /* Private Use */ + ["\uEFF7", "\uEFF7"], /* Private Use */ + ["\uEFF8", "\uEFF8"], /* Private Use */ + ["\uEFF9", "\uEFF9"], /* Private Use */ + ["\uEFFA", "\uEFFA"], /* Private Use */ + ["\uEFFB", "\uEFFB"], /* Private Use */ + ["\uEFFC", "\uEFFC"], /* Private Use */ + ["\uEFFD", "\uEFFD"], /* Private Use */ + ["\uEFFE", "\uEFFE"], /* Private Use */ + ["\uEFFF", "\uEFFF"], /* Private Use */ + ["\uF000", "\uF000"], /* Private Use */ + ["\uF001", "\uF001"], /* Private Use */ + ["\uF002", "\uF002"], /* Private Use */ + ["\uF003", "\uF003"], /* Private Use */ + ["\uF004", "\uF004"], /* Private Use */ + ["\uF005", "\uF005"], /* Private Use */ + ["\uF006", "\uF006"], /* Private Use */ + ["\uF007", "\uF007"], /* Private Use */ + ["\uF008", "\uF008"], /* Private Use */ + ["\uF009", "\uF009"], /* Private Use */ + ["\uF00A", "\uF00A"], /* Private Use */ + ["\uF00B", "\uF00B"], /* Private Use */ + ["\uF00C", "\uF00C"], /* Private Use */ + ["\uF00D", "\uF00D"], /* Private Use */ + ["\uF00E", "\uF00E"], /* Private Use */ + ["\uF00F", "\uF00F"], /* Private Use */ + ["\uF010", "\uF010"], /* Private Use */ + ["\uF011", "\uF011"], /* Private Use */ + ["\uF012", "\uF012"], /* Private Use */ + ["\uF013", "\uF013"], /* Private Use */ + ["\uF014", "\uF014"], /* Private Use */ + ["\uF015", "\uF015"], /* Private Use */ + ["\uF016", "\uF016"], /* Private Use */ + ["\uF017", "\uF017"], /* Private Use */ + ["\uF018", "\uF018"], /* Private Use */ + ["\uF019", "\uF019"], /* Private Use */ + ["\uF01A", "\uF01A"], /* Private Use */ + ["\uF01B", "\uF01B"], /* Private Use */ + ["\uF01C", "\uF01C"], /* Private Use */ + ["\uF01D", "\uF01D"], /* Private Use */ + ["\uF01E", "\uF01E"], /* Private Use */ + ["\uF01F", "\uF01F"], /* Private Use */ + ["\uF020", "\uF020"], /* Private Use */ + ["\uF021", "\uF021"], /* Private Use */ + ["\uF022", "\uF022"], /* Private Use */ + ["\uF023", "\uF023"], /* Private Use */ + ["\uF024", "\uF024"], /* Private Use */ + ["\uF025", "\uF025"], /* Private Use */ + ["\uF026", "\uF026"], /* Private Use */ + ["\uF027", "\uF027"], /* Private Use */ + ["\uF028", "\uF028"], /* Private Use */ + ["\uF029", "\uF029"], /* Private Use */ + ["\uF02A", "\uF02A"], /* Private Use */ + ["\uF02B", "\uF02B"], /* Private Use */ + ["\uF02C", "\uF02C"], /* Private Use */ + ["\uF02D", "\uF02D"], /* Private Use */ + ["\uF02E", "\uF02E"], /* Private Use */ + ["\uF02F", "\uF02F"], /* Private Use */ + ["\uF030", "\uF030"], /* Private Use */ + ["\uF031", "\uF031"], /* Private Use */ + ["\uF032", "\uF032"], /* Private Use */ + ["\uF033", "\uF033"], /* Private Use */ + ["\uF034", "\uF034"], /* Private Use */ + ["\uF035", "\uF035"], /* Private Use */ + ["\uF036", "\uF036"], /* Private Use */ + ["\uF037", "\uF037"], /* Private Use */ + ["\uF038", "\uF038"], /* Private Use */ + ["\uF039", "\uF039"], /* Private Use */ + ["\uF03A", "\uF03A"], /* Private Use */ + ["\uF03B", "\uF03B"], /* Private Use */ + ["\uF03C", "\uF03C"], /* Private Use */ + ["\uF03D", "\uF03D"], /* Private Use */ + ["\uF03E", "\uF03E"], /* Private Use */ + ["\uF03F", "\uF03F"], /* Private Use */ + ["\uF040", "\uF040"], /* Private Use */ + ["\uF041", "\uF041"], /* Private Use */ + ["\uF042", "\uF042"], /* Private Use */ + ["\uF043", "\uF043"], /* Private Use */ + ["\uF044", "\uF044"], /* Private Use */ + ["\uF045", "\uF045"], /* Private Use */ + ["\uF046", "\uF046"], /* Private Use */ + ["\uF047", "\uF047"], /* Private Use */ + ["\uF048", "\uF048"], /* Private Use */ + ["\uF049", "\uF049"], /* Private Use */ + ["\uF04A", "\uF04A"], /* Private Use */ + ["\uF04B", "\uF04B"], /* Private Use */ + ["\uF04C", "\uF04C"], /* Private Use */ + ["\uF04D", "\uF04D"], /* Private Use */ + ["\uF04E", "\uF04E"], /* Private Use */ + ["\uF04F", "\uF04F"], /* Private Use */ + ["\uF050", "\uF050"], /* Private Use */ + ["\uF051", "\uF051"], /* Private Use */ + ["\uF052", "\uF052"], /* Private Use */ + ["\uF053", "\uF053"], /* Private Use */ + ["\uF054", "\uF054"], /* Private Use */ + ["\uF055", "\uF055"], /* Private Use */ + ["\uF056", "\uF056"], /* Private Use */ + ["\uF057", "\uF057"], /* Private Use */ + ["\uF058", "\uF058"], /* Private Use */ + ["\uF059", "\uF059"], /* Private Use */ + ["\uF05A", "\uF05A"], /* Private Use */ + ["\uF05B", "\uF05B"], /* Private Use */ + ["\uF05C", "\uF05C"], /* Private Use */ + ["\uF05D", "\uF05D"], /* Private Use */ + ["\uF05E", "\uF05E"], /* Private Use */ + ["\uF05F", "\uF05F"], /* Private Use */ + ["\uF060", "\uF060"], /* Private Use */ + ["\uF061", "\uF061"], /* Private Use */ + ["\uF062", "\uF062"], /* Private Use */ + ["\uF063", "\uF063"], /* Private Use */ + ["\uF064", "\uF064"], /* Private Use */ + ["\uF065", "\uF065"], /* Private Use */ + ["\uF066", "\uF066"], /* Private Use */ + ["\uF067", "\uF067"], /* Private Use */ + ["\uF068", "\uF068"], /* Private Use */ + ["\uF069", "\uF069"], /* Private Use */ + ["\uF06A", "\uF06A"], /* Private Use */ + ["\uF06B", "\uF06B"], /* Private Use */ + ["\uF06C", "\uF06C"], /* Private Use */ + ["\uF06D", "\uF06D"], /* Private Use */ + ["\uF06E", "\uF06E"], /* Private Use */ + ["\uF06F", "\uF06F"], /* Private Use */ + ["\uF070", "\uF070"], /* Private Use */ + ["\uF071", "\uF071"], /* Private Use */ + ["\uF072", "\uF072"], /* Private Use */ + ["\uF073", "\uF073"], /* Private Use */ + ["\uF074", "\uF074"], /* Private Use */ + ["\uF075", "\uF075"], /* Private Use */ + ["\uF076", "\uF076"], /* Private Use */ + ["\uF077", "\uF077"], /* Private Use */ + ["\uF078", "\uF078"], /* Private Use */ + ["\uF079", "\uF079"], /* Private Use */ + ["\uF07A", "\uF07A"], /* Private Use */ + ["\uF07B", "\uF07B"], /* Private Use */ + ["\uF07C", "\uF07C"], /* Private Use */ + ["\uF07D", "\uF07D"], /* Private Use */ + ["\uF07E", "\uF07E"], /* Private Use */ + ["\uF07F", "\uF07F"], /* Private Use */ + ["\uF080", "\uF080"], /* Private Use */ + ["\uF081", "\uF081"], /* Private Use */ + ["\uF082", "\uF082"], /* Private Use */ + ["\uF083", "\uF083"], /* Private Use */ + ["\uF084", "\uF084"], /* Private Use */ + ["\uF085", "\uF085"], /* Private Use */ + ["\uF086", "\uF086"], /* Private Use */ + ["\uF087", "\uF087"], /* Private Use */ + ["\uF088", "\uF088"], /* Private Use */ + ["\uF089", "\uF089"], /* Private Use */ + ["\uF08A", "\uF08A"], /* Private Use */ + ["\uF08B", "\uF08B"], /* Private Use */ + ["\uF08C", "\uF08C"], /* Private Use */ + ["\uF08D", "\uF08D"], /* Private Use */ + ["\uF08E", "\uF08E"], /* Private Use */ + ["\uF08F", "\uF08F"], /* Private Use */ + ["\uF090", "\uF090"], /* Private Use */ + ["\uF091", "\uF091"], /* Private Use */ + ["\uF092", "\uF092"], /* Private Use */ + ["\uF093", "\uF093"], /* Private Use */ + ["\uF094", "\uF094"], /* Private Use */ + ["\uF095", "\uF095"], /* Private Use */ + ["\uF096", "\uF096"], /* Private Use */ + ["\uF097", "\uF097"], /* Private Use */ + ["\uF098", "\uF098"], /* Private Use */ + ["\uF099", "\uF099"], /* Private Use */ + ["\uF09A", "\uF09A"], /* Private Use */ + ["\uF09B", "\uF09B"], /* Private Use */ + ["\uF09C", "\uF09C"], /* Private Use */ + ["\uF09D", "\uF09D"], /* Private Use */ + ["\uF09E", "\uF09E"], /* Private Use */ + ["\uF09F", "\uF09F"], /* Private Use */ + ["\uF0A0", "\uF0A0"], /* Private Use */ + ["\uF0A1", "\uF0A1"], /* Private Use */ + ["\uF0A2", "\uF0A2"], /* Private Use */ + ["\uF0A3", "\uF0A3"], /* Private Use */ + ["\uF0A4", "\uF0A4"], /* Private Use */ + ["\uF0A5", "\uF0A5"], /* Private Use */ + ["\uF0A6", "\uF0A6"], /* Private Use */ + ["\uF0A7", "\uF0A7"], /* Private Use */ + ["\uF0A8", "\uF0A8"], /* Private Use */ + ["\uF0A9", "\uF0A9"], /* Private Use */ + ["\uF0AA", "\uF0AA"], /* Private Use */ + ["\uF0AB", "\uF0AB"], /* Private Use */ + ["\uF0AC", "\uF0AC"], /* Private Use */ + ["\uF0AD", "\uF0AD"], /* Private Use */ + ["\uF0AE", "\uF0AE"], /* Private Use */ + ["\uF0AF", "\uF0AF"], /* Private Use */ + ["\uF0B0", "\uF0B0"], /* Private Use */ + ["\uF0B1", "\uF0B1"], /* Private Use */ + ["\uF0B2", "\uF0B2"], /* Private Use */ + ["\uF0B3", "\uF0B3"], /* Private Use */ + ["\uF0B4", "\uF0B4"], /* Private Use */ + ["\uF0B5", "\uF0B5"], /* Private Use */ + ["\uF0B6", "\uF0B6"], /* Private Use */ + ["\uF0B7", "\uF0B7"], /* Private Use */ + ["\uF0B8", "\uF0B8"], /* Private Use */ + ["\uF0B9", "\uF0B9"], /* Private Use */ + ["\uF0BA", "\uF0BA"], /* Private Use */ + ["\uF0BB", "\uF0BB"], /* Private Use */ + ["\uF0BC", "\uF0BC"], /* Private Use */ + ["\uF0BD", "\uF0BD"], /* Private Use */ + ["\uF0BE", "\uF0BE"], /* Private Use */ + ["\uF0BF", "\uF0BF"], /* Private Use */ + ["\uF0C0", "\uF0C0"], /* Private Use */ + ["\uF0C1", "\uF0C1"], /* Private Use */ + ["\uF0C2", "\uF0C2"], /* Private Use */ + ["\uF0C3", "\uF0C3"], /* Private Use */ + ["\uF0C4", "\uF0C4"], /* Private Use */ + ["\uF0C5", "\uF0C5"], /* Private Use */ + ["\uF0C6", "\uF0C6"], /* Private Use */ + ["\uF0C7", "\uF0C7"], /* Private Use */ + ["\uF0C8", "\uF0C8"], /* Private Use */ + ["\uF0C9", "\uF0C9"], /* Private Use */ + ["\uF0CA", "\uF0CA"], /* Private Use */ + ["\uF0CB", "\uF0CB"], /* Private Use */ + ["\uF0CC", "\uF0CC"], /* Private Use */ + ["\uF0CD", "\uF0CD"], /* Private Use */ + ["\uF0CE", "\uF0CE"], /* Private Use */ + ["\uF0CF", "\uF0CF"], /* Private Use */ + ["\uF0D0", "\uF0D0"], /* Private Use */ + ["\uF0D1", "\uF0D1"], /* Private Use */ + ["\uF0D2", "\uF0D2"], /* Private Use */ + ["\uF0D3", "\uF0D3"], /* Private Use */ + ["\uF0D4", "\uF0D4"], /* Private Use */ + ["\uF0D5", "\uF0D5"], /* Private Use */ + ["\uF0D6", "\uF0D6"], /* Private Use */ + ["\uF0D7", "\uF0D7"], /* Private Use */ + ["\uF0D8", "\uF0D8"], /* Private Use */ + ["\uF0D9", "\uF0D9"], /* Private Use */ + ["\uF0DA", "\uF0DA"], /* Private Use */ + ["\uF0DB", "\uF0DB"], /* Private Use */ + ["\uF0DC", "\uF0DC"], /* Private Use */ + ["\uF0DD", "\uF0DD"], /* Private Use */ + ["\uF0DE", "\uF0DE"], /* Private Use */ + ["\uF0DF", "\uF0DF"], /* Private Use */ + ["\uF0E0", "\uF0E0"], /* Private Use */ + ["\uF0E1", "\uF0E1"], /* Private Use */ + ["\uF0E2", "\uF0E2"], /* Private Use */ + ["\uF0E3", "\uF0E3"], /* Private Use */ + ["\uF0E4", "\uF0E4"], /* Private Use */ + ["\uF0E5", "\uF0E5"], /* Private Use */ + ["\uF0E6", "\uF0E6"], /* Private Use */ + ["\uF0E7", "\uF0E7"], /* Private Use */ + ["\uF0E8", "\uF0E8"], /* Private Use */ + ["\uF0E9", "\uF0E9"], /* Private Use */ + ["\uF0EA", "\uF0EA"], /* Private Use */ + ["\uF0EB", "\uF0EB"], /* Private Use */ + ["\uF0EC", "\uF0EC"], /* Private Use */ + ["\uF0ED", "\uF0ED"], /* Private Use */ + ["\uF0EE", "\uF0EE"], /* Private Use */ + ["\uF0EF", "\uF0EF"], /* Private Use */ + ["\uF0F0", "\uF0F0"], /* Private Use */ + ["\uF0F1", "\uF0F1"], /* Private Use */ + ["\uF0F2", "\uF0F2"], /* Private Use */ + ["\uF0F3", "\uF0F3"], /* Private Use */ + ["\uF0F4", "\uF0F4"], /* Private Use */ + ["\uF0F5", "\uF0F5"], /* Private Use */ + ["\uF0F6", "\uF0F6"], /* Private Use */ + ["\uF0F7", "\uF0F7"], /* Private Use */ + ["\uF0F8", "\uF0F8"], /* Private Use */ + ["\uF0F9", "\uF0F9"], /* Private Use */ + ["\uF0FA", "\uF0FA"], /* Private Use */ + ["\uF0FB", "\uF0FB"], /* Private Use */ + ["\uF0FC", "\uF0FC"], /* Private Use */ + ["\uF0FD", "\uF0FD"], /* Private Use */ + ["\uF0FE", "\uF0FE"], /* Private Use */ + ["\uF0FF", "\uF0FF"], /* Private Use */ + ["\uF100", "\uF100"], /* Private Use */ + ["\uF101", "\uF101"], /* Private Use */ + ["\uF102", "\uF102"], /* Private Use */ + ["\uF103", "\uF103"], /* Private Use */ + ["\uF104", "\uF104"], /* Private Use */ + ["\uF105", "\uF105"], /* Private Use */ + ["\uF106", "\uF106"], /* Private Use */ + ["\uF107", "\uF107"], /* Private Use */ + ["\uF108", "\uF108"], /* Private Use */ + ["\uF109", "\uF109"], /* Private Use */ + ["\uF10A", "\uF10A"], /* Private Use */ + ["\uF10B", "\uF10B"], /* Private Use */ + ["\uF10C", "\uF10C"], /* Private Use */ + ["\uF10D", "\uF10D"], /* Private Use */ + ["\uF10E", "\uF10E"], /* Private Use */ + ["\uF10F", "\uF10F"], /* Private Use */ + ["\uF110", "\uF110"], /* Private Use */ + ["\uF111", "\uF111"], /* Private Use */ + ["\uF112", "\uF112"], /* Private Use */ + ["\uF113", "\uF113"], /* Private Use */ + ["\uF114", "\uF114"], /* Private Use */ + ["\uF115", "\uF115"], /* Private Use */ + ["\uF116", "\uF116"], /* Private Use */ + ["\uF117", "\uF117"], /* Private Use */ + ["\uF118", "\uF118"], /* Private Use */ + ["\uF119", "\uF119"], /* Private Use */ + ["\uF11A", "\uF11A"], /* Private Use */ + ["\uF11B", "\uF11B"], /* Private Use */ + ["\uF11C", "\uF11C"], /* Private Use */ + ["\uF11D", "\uF11D"], /* Private Use */ + ["\uF11E", "\uF11E"], /* Private Use */ + ["\uF11F", "\uF11F"], /* Private Use */ + ["\uF120", "\uF120"], /* Private Use */ + ["\uF121", "\uF121"], /* Private Use */ + ["\uF122", "\uF122"], /* Private Use */ + ["\uF123", "\uF123"], /* Private Use */ + ["\uF124", "\uF124"], /* Private Use */ + ["\uF125", "\uF125"], /* Private Use */ + ["\uF126", "\uF126"], /* Private Use */ + ["\uF127", "\uF127"], /* Private Use */ + ["\uF128", "\uF128"], /* Private Use */ + ["\uF129", "\uF129"], /* Private Use */ + ["\uF12A", "\uF12A"], /* Private Use */ + ["\uF12B", "\uF12B"], /* Private Use */ + ["\uF12C", "\uF12C"], /* Private Use */ + ["\uF12D", "\uF12D"], /* Private Use */ + ["\uF12E", "\uF12E"], /* Private Use */ + ["\uF12F", "\uF12F"], /* Private Use */ + ["\uF130", "\uF130"], /* Private Use */ + ["\uF131", "\uF131"], /* Private Use */ + ["\uF132", "\uF132"], /* Private Use */ + ["\uF133", "\uF133"], /* Private Use */ + ["\uF134", "\uF134"], /* Private Use */ + ["\uF135", "\uF135"], /* Private Use */ + ["\uF136", "\uF136"], /* Private Use */ + ["\uF137", "\uF137"], /* Private Use */ + ["\uF138", "\uF138"], /* Private Use */ + ["\uF139", "\uF139"], /* Private Use */ + ["\uF13A", "\uF13A"], /* Private Use */ + ["\uF13B", "\uF13B"], /* Private Use */ + ["\uF13C", "\uF13C"], /* Private Use */ + ["\uF13D", "\uF13D"], /* Private Use */ + ["\uF13E", "\uF13E"], /* Private Use */ + ["\uF13F", "\uF13F"], /* Private Use */ + ["\uF140", "\uF140"], /* Private Use */ + ["\uF141", "\uF141"], /* Private Use */ + ["\uF142", "\uF142"], /* Private Use */ + ["\uF143", "\uF143"], /* Private Use */ + ["\uF144", "\uF144"], /* Private Use */ + ["\uF145", "\uF145"], /* Private Use */ + ["\uF146", "\uF146"], /* Private Use */ + ["\uF147", "\uF147"], /* Private Use */ + ["\uF148", "\uF148"], /* Private Use */ + ["\uF149", "\uF149"], /* Private Use */ + ["\uF14A", "\uF14A"], /* Private Use */ + ["\uF14B", "\uF14B"], /* Private Use */ + ["\uF14C", "\uF14C"], /* Private Use */ + ["\uF14D", "\uF14D"], /* Private Use */ + ["\uF14E", "\uF14E"], /* Private Use */ + ["\uF14F", "\uF14F"], /* Private Use */ + ["\uF150", "\uF150"], /* Private Use */ + ["\uF151", "\uF151"], /* Private Use */ + ["\uF152", "\uF152"], /* Private Use */ + ["\uF153", "\uF153"], /* Private Use */ + ["\uF154", "\uF154"], /* Private Use */ + ["\uF155", "\uF155"], /* Private Use */ + ["\uF156", "\uF156"], /* Private Use */ + ["\uF157", "\uF157"], /* Private Use */ + ["\uF158", "\uF158"], /* Private Use */ + ["\uF159", "\uF159"], /* Private Use */ + ["\uF15A", "\uF15A"], /* Private Use */ + ["\uF15B", "\uF15B"], /* Private Use */ + ["\uF15C", "\uF15C"], /* Private Use */ + ["\uF15D", "\uF15D"], /* Private Use */ + ["\uF15E", "\uF15E"], /* Private Use */ + ["\uF15F", "\uF15F"], /* Private Use */ + ["\uF160", "\uF160"], /* Private Use */ + ["\uF161", "\uF161"], /* Private Use */ + ["\uF162", "\uF162"], /* Private Use */ + ["\uF163", "\uF163"], /* Private Use */ + ["\uF164", "\uF164"], /* Private Use */ + ["\uF165", "\uF165"], /* Private Use */ + ["\uF166", "\uF166"], /* Private Use */ + ["\uF167", "\uF167"], /* Private Use */ + ["\uF168", "\uF168"], /* Private Use */ + ["\uF169", "\uF169"], /* Private Use */ + ["\uF16A", "\uF16A"], /* Private Use */ + ["\uF16B", "\uF16B"], /* Private Use */ + ["\uF16C", "\uF16C"], /* Private Use */ + ["\uF16D", "\uF16D"], /* Private Use */ + ["\uF16E", "\uF16E"], /* Private Use */ + ["\uF16F", "\uF16F"], /* Private Use */ + ["\uF170", "\uF170"], /* Private Use */ + ["\uF171", "\uF171"], /* Private Use */ + ["\uF172", "\uF172"], /* Private Use */ + ["\uF173", "\uF173"], /* Private Use */ + ["\uF174", "\uF174"], /* Private Use */ + ["\uF175", "\uF175"], /* Private Use */ + ["\uF176", "\uF176"], /* Private Use */ + ["\uF177", "\uF177"], /* Private Use */ + ["\uF178", "\uF178"], /* Private Use */ + ["\uF179", "\uF179"], /* Private Use */ + ["\uF17A", "\uF17A"], /* Private Use */ + ["\uF17B", "\uF17B"], /* Private Use */ + ["\uF17C", "\uF17C"], /* Private Use */ + ["\uF17D", "\uF17D"], /* Private Use */ + ["\uF17E", "\uF17E"], /* Private Use */ + ["\uF17F", "\uF17F"], /* Private Use */ + ["\uF180", "\uF180"], /* Private Use */ + ["\uF181", "\uF181"], /* Private Use */ + ["\uF182", "\uF182"], /* Private Use */ + ["\uF183", "\uF183"], /* Private Use */ + ["\uF184", "\uF184"], /* Private Use */ + ["\uF185", "\uF185"], /* Private Use */ + ["\uF186", "\uF186"], /* Private Use */ + ["\uF187", "\uF187"], /* Private Use */ + ["\uF188", "\uF188"], /* Private Use */ + ["\uF189", "\uF189"], /* Private Use */ + ["\uF18A", "\uF18A"], /* Private Use */ + ["\uF18B", "\uF18B"], /* Private Use */ + ["\uF18C", "\uF18C"], /* Private Use */ + ["\uF18D", "\uF18D"], /* Private Use */ + ["\uF18E", "\uF18E"], /* Private Use */ + ["\uF18F", "\uF18F"], /* Private Use */ + ["\uF190", "\uF190"], /* Private Use */ + ["\uF191", "\uF191"], /* Private Use */ + ["\uF192", "\uF192"], /* Private Use */ + ["\uF193", "\uF193"], /* Private Use */ + ["\uF194", "\uF194"], /* Private Use */ + ["\uF195", "\uF195"], /* Private Use */ + ["\uF196", "\uF196"], /* Private Use */ + ["\uF197", "\uF197"], /* Private Use */ + ["\uF198", "\uF198"], /* Private Use */ + ["\uF199", "\uF199"], /* Private Use */ + ["\uF19A", "\uF19A"], /* Private Use */ + ["\uF19B", "\uF19B"], /* Private Use */ + ["\uF19C", "\uF19C"], /* Private Use */ + ["\uF19D", "\uF19D"], /* Private Use */ + ["\uF19E", "\uF19E"], /* Private Use */ + ["\uF19F", "\uF19F"], /* Private Use */ + ["\uF1A0", "\uF1A0"], /* Private Use */ + ["\uF1A1", "\uF1A1"], /* Private Use */ + ["\uF1A2", "\uF1A2"], /* Private Use */ + ["\uF1A3", "\uF1A3"], /* Private Use */ + ["\uF1A4", "\uF1A4"], /* Private Use */ + ["\uF1A5", "\uF1A5"], /* Private Use */ + ["\uF1A6", "\uF1A6"], /* Private Use */ + ["\uF1A7", "\uF1A7"], /* Private Use */ + ["\uF1A8", "\uF1A8"], /* Private Use */ + ["\uF1A9", "\uF1A9"], /* Private Use */ + ["\uF1AA", "\uF1AA"], /* Private Use */ + ["\uF1AB", "\uF1AB"], /* Private Use */ + ["\uF1AC", "\uF1AC"], /* Private Use */ + ["\uF1AD", "\uF1AD"], /* Private Use */ + ["\uF1AE", "\uF1AE"], /* Private Use */ + ["\uF1AF", "\uF1AF"], /* Private Use */ + ["\uF1B0", "\uF1B0"], /* Private Use */ + ["\uF1B1", "\uF1B1"], /* Private Use */ + ["\uF1B2", "\uF1B2"], /* Private Use */ + ["\uF1B3", "\uF1B3"], /* Private Use */ + ["\uF1B4", "\uF1B4"], /* Private Use */ + ["\uF1B5", "\uF1B5"], /* Private Use */ + ["\uF1B6", "\uF1B6"], /* Private Use */ + ["\uF1B7", "\uF1B7"], /* Private Use */ + ["\uF1B8", "\uF1B8"], /* Private Use */ + ["\uF1B9", "\uF1B9"], /* Private Use */ + ["\uF1BA", "\uF1BA"], /* Private Use */ + ["\uF1BB", "\uF1BB"], /* Private Use */ + ["\uF1BC", "\uF1BC"], /* Private Use */ + ["\uF1BD", "\uF1BD"], /* Private Use */ + ["\uF1BE", "\uF1BE"], /* Private Use */ + ["\uF1BF", "\uF1BF"], /* Private Use */ + ["\uF1C0", "\uF1C0"], /* Private Use */ + ["\uF1C1", "\uF1C1"], /* Private Use */ + ["\uF1C2", "\uF1C2"], /* Private Use */ + ["\uF1C3", "\uF1C3"], /* Private Use */ + ["\uF1C4", "\uF1C4"], /* Private Use */ + ["\uF1C5", "\uF1C5"], /* Private Use */ + ["\uF1C6", "\uF1C6"], /* Private Use */ + ["\uF1C7", "\uF1C7"], /* Private Use */ + ["\uF1C8", "\uF1C8"], /* Private Use */ + ["\uF1C9", "\uF1C9"], /* Private Use */ + ["\uF1CA", "\uF1CA"], /* Private Use */ + ["\uF1CB", "\uF1CB"], /* Private Use */ + ["\uF1CC", "\uF1CC"], /* Private Use */ + ["\uF1CD", "\uF1CD"], /* Private Use */ + ["\uF1CE", "\uF1CE"], /* Private Use */ + ["\uF1CF", "\uF1CF"], /* Private Use */ + ["\uF1D0", "\uF1D0"], /* Private Use */ + ["\uF1D1", "\uF1D1"], /* Private Use */ + ["\uF1D2", "\uF1D2"], /* Private Use */ + ["\uF1D3", "\uF1D3"], /* Private Use */ + ["\uF1D4", "\uF1D4"], /* Private Use */ + ["\uF1D5", "\uF1D5"], /* Private Use */ + ["\uF1D6", "\uF1D6"], /* Private Use */ + ["\uF1D7", "\uF1D7"], /* Private Use */ + ["\uF1D8", "\uF1D8"], /* Private Use */ + ["\uF1D9", "\uF1D9"], /* Private Use */ + ["\uF1DA", "\uF1DA"], /* Private Use */ + ["\uF1DB", "\uF1DB"], /* Private Use */ + ["\uF1DC", "\uF1DC"], /* Private Use */ + ["\uF1DD", "\uF1DD"], /* Private Use */ + ["\uF1DE", "\uF1DE"], /* Private Use */ + ["\uF1DF", "\uF1DF"], /* Private Use */ + ["\uF1E0", "\uF1E0"], /* Private Use */ + ["\uF1E1", "\uF1E1"], /* Private Use */ + ["\uF1E2", "\uF1E2"], /* Private Use */ + ["\uF1E3", "\uF1E3"], /* Private Use */ + ["\uF1E4", "\uF1E4"], /* Private Use */ + ["\uF1E5", "\uF1E5"], /* Private Use */ + ["\uF1E6", "\uF1E6"], /* Private Use */ + ["\uF1E7", "\uF1E7"], /* Private Use */ + ["\uF1E8", "\uF1E8"], /* Private Use */ + ["\uF1E9", "\uF1E9"], /* Private Use */ + ["\uF1EA", "\uF1EA"], /* Private Use */ + ["\uF1EB", "\uF1EB"], /* Private Use */ + ["\uF1EC", "\uF1EC"], /* Private Use */ + ["\uF1ED", "\uF1ED"], /* Private Use */ + ["\uF1EE", "\uF1EE"], /* Private Use */ + ["\uF1EF", "\uF1EF"], /* Private Use */ + ["\uF1F0", "\uF1F0"], /* Private Use */ + ["\uF1F1", "\uF1F1"], /* Private Use */ + ["\uF1F2", "\uF1F2"], /* Private Use */ + ["\uF1F3", "\uF1F3"], /* Private Use */ + ["\uF1F4", "\uF1F4"], /* Private Use */ + ["\uF1F5", "\uF1F5"], /* Private Use */ + ["\uF1F6", "\uF1F6"], /* Private Use */ + ["\uF1F7", "\uF1F7"], /* Private Use */ + ["\uF1F8", "\uF1F8"], /* Private Use */ + ["\uF1F9", "\uF1F9"], /* Private Use */ + ["\uF1FA", "\uF1FA"], /* Private Use */ + ["\uF1FB", "\uF1FB"], /* Private Use */ + ["\uF1FC", "\uF1FC"], /* Private Use */ + ["\uF1FD", "\uF1FD"], /* Private Use */ + ["\uF1FE", "\uF1FE"], /* Private Use */ + ["\uF1FF", "\uF1FF"], /* Private Use */ + ["\uF200", "\uF200"], /* Private Use */ + ["\uF201", "\uF201"], /* Private Use */ + ["\uF202", "\uF202"], /* Private Use */ + ["\uF203", "\uF203"], /* Private Use */ + ["\uF204", "\uF204"], /* Private Use */ + ["\uF205", "\uF205"], /* Private Use */ + ["\uF206", "\uF206"], /* Private Use */ + ["\uF207", "\uF207"], /* Private Use */ + ["\uF208", "\uF208"], /* Private Use */ + ["\uF209", "\uF209"], /* Private Use */ + ["\uF20A", "\uF20A"], /* Private Use */ + ["\uF20B", "\uF20B"], /* Private Use */ + ["\uF20C", "\uF20C"], /* Private Use */ + ["\uF20D", "\uF20D"], /* Private Use */ + ["\uF20E", "\uF20E"], /* Private Use */ + ["\uF20F", "\uF20F"], /* Private Use */ + ["\uF210", "\uF210"], /* Private Use */ + ["\uF211", "\uF211"], /* Private Use */ + ["\uF212", "\uF212"], /* Private Use */ + ["\uF213", "\uF213"], /* Private Use */ + ["\uF214", "\uF214"], /* Private Use */ + ["\uF215", "\uF215"], /* Private Use */ + ["\uF216", "\uF216"], /* Private Use */ + ["\uF217", "\uF217"], /* Private Use */ + ["\uF218", "\uF218"], /* Private Use */ + ["\uF219", "\uF219"], /* Private Use */ + ["\uF21A", "\uF21A"], /* Private Use */ + ["\uF21B", "\uF21B"], /* Private Use */ + ["\uF21C", "\uF21C"], /* Private Use */ + ["\uF21D", "\uF21D"], /* Private Use */ + ["\uF21E", "\uF21E"], /* Private Use */ + ["\uF21F", "\uF21F"], /* Private Use */ + ["\uF220", "\uF220"], /* Private Use */ + ["\uF221", "\uF221"], /* Private Use */ + ["\uF222", "\uF222"], /* Private Use */ + ["\uF223", "\uF223"], /* Private Use */ + ["\uF224", "\uF224"], /* Private Use */ + ["\uF225", "\uF225"], /* Private Use */ + ["\uF226", "\uF226"], /* Private Use */ + ["\uF227", "\uF227"], /* Private Use */ + ["\uF228", "\uF228"], /* Private Use */ + ["\uF229", "\uF229"], /* Private Use */ + ["\uF22A", "\uF22A"], /* Private Use */ + ["\uF22B", "\uF22B"], /* Private Use */ + ["\uF22C", "\uF22C"], /* Private Use */ + ["\uF22D", "\uF22D"], /* Private Use */ + ["\uF22E", "\uF22E"], /* Private Use */ + ["\uF22F", "\uF22F"], /* Private Use */ + ["\uF230", "\uF230"], /* Private Use */ + ["\uF231", "\uF231"], /* Private Use */ + ["\uF232", "\uF232"], /* Private Use */ + ["\uF233", "\uF233"], /* Private Use */ + ["\uF234", "\uF234"], /* Private Use */ + ["\uF235", "\uF235"], /* Private Use */ + ["\uF236", "\uF236"], /* Private Use */ + ["\uF237", "\uF237"], /* Private Use */ + ["\uF238", "\uF238"], /* Private Use */ + ["\uF239", "\uF239"], /* Private Use */ + ["\uF23A", "\uF23A"], /* Private Use */ + ["\uF23B", "\uF23B"], /* Private Use */ + ["\uF23C", "\uF23C"], /* Private Use */ + ["\uF23D", "\uF23D"], /* Private Use */ + ["\uF23E", "\uF23E"], /* Private Use */ + ["\uF23F", "\uF23F"], /* Private Use */ + ["\uF240", "\uF240"], /* Private Use */ + ["\uF241", "\uF241"], /* Private Use */ + ["\uF242", "\uF242"], /* Private Use */ + ["\uF243", "\uF243"], /* Private Use */ + ["\uF244", "\uF244"], /* Private Use */ + ["\uF245", "\uF245"], /* Private Use */ + ["\uF246", "\uF246"], /* Private Use */ + ["\uF247", "\uF247"], /* Private Use */ + ["\uF248", "\uF248"], /* Private Use */ + ["\uF249", "\uF249"], /* Private Use */ + ["\uF24A", "\uF24A"], /* Private Use */ + ["\uF24B", "\uF24B"], /* Private Use */ + ["\uF24C", "\uF24C"], /* Private Use */ + ["\uF24D", "\uF24D"], /* Private Use */ + ["\uF24E", "\uF24E"], /* Private Use */ + ["\uF24F", "\uF24F"], /* Private Use */ + ["\uF250", "\uF250"], /* Private Use */ + ["\uF251", "\uF251"], /* Private Use */ + ["\uF252", "\uF252"], /* Private Use */ + ["\uF253", "\uF253"], /* Private Use */ + ["\uF254", "\uF254"], /* Private Use */ + ["\uF255", "\uF255"], /* Private Use */ + ["\uF256", "\uF256"], /* Private Use */ + ["\uF257", "\uF257"], /* Private Use */ + ["\uF258", "\uF258"], /* Private Use */ + ["\uF259", "\uF259"], /* Private Use */ + ["\uF25A", "\uF25A"], /* Private Use */ + ["\uF25B", "\uF25B"], /* Private Use */ + ["\uF25C", "\uF25C"], /* Private Use */ + ["\uF25D", "\uF25D"], /* Private Use */ + ["\uF25E", "\uF25E"], /* Private Use */ + ["\uF25F", "\uF25F"], /* Private Use */ + ["\uF260", "\uF260"], /* Private Use */ + ["\uF261", "\uF261"], /* Private Use */ + ["\uF262", "\uF262"], /* Private Use */ + ["\uF263", "\uF263"], /* Private Use */ + ["\uF264", "\uF264"], /* Private Use */ + ["\uF265", "\uF265"], /* Private Use */ + ["\uF266", "\uF266"], /* Private Use */ + ["\uF267", "\uF267"], /* Private Use */ + ["\uF268", "\uF268"], /* Private Use */ + ["\uF269", "\uF269"], /* Private Use */ + ["\uF26A", "\uF26A"], /* Private Use */ + ["\uF26B", "\uF26B"], /* Private Use */ + ["\uF26C", "\uF26C"], /* Private Use */ + ["\uF26D", "\uF26D"], /* Private Use */ + ["\uF26E", "\uF26E"], /* Private Use */ + ["\uF26F", "\uF26F"], /* Private Use */ + ["\uF270", "\uF270"], /* Private Use */ + ["\uF271", "\uF271"], /* Private Use */ + ["\uF272", "\uF272"], /* Private Use */ + ["\uF273", "\uF273"], /* Private Use */ + ["\uF274", "\uF274"], /* Private Use */ + ["\uF275", "\uF275"], /* Private Use */ + ["\uF276", "\uF276"], /* Private Use */ + ["\uF277", "\uF277"], /* Private Use */ + ["\uF278", "\uF278"], /* Private Use */ + ["\uF279", "\uF279"], /* Private Use */ + ["\uF27A", "\uF27A"], /* Private Use */ + ["\uF27B", "\uF27B"], /* Private Use */ + ["\uF27C", "\uF27C"], /* Private Use */ + ["\uF27D", "\uF27D"], /* Private Use */ + ["\uF27E", "\uF27E"], /* Private Use */ + ["\uF27F", "\uF27F"], /* Private Use */ + ["\uF280", "\uF280"], /* Private Use */ + ["\uF281", "\uF281"], /* Private Use */ + ["\uF282", "\uF282"], /* Private Use */ + ["\uF283", "\uF283"], /* Private Use */ + ["\uF284", "\uF284"], /* Private Use */ + ["\uF285", "\uF285"], /* Private Use */ + ["\uF286", "\uF286"], /* Private Use */ + ["\uF287", "\uF287"], /* Private Use */ + ["\uF288", "\uF288"], /* Private Use */ + ["\uF289", "\uF289"], /* Private Use */ + ["\uF28A", "\uF28A"], /* Private Use */ + ["\uF28B", "\uF28B"], /* Private Use */ + ["\uF28C", "\uF28C"], /* Private Use */ + ["\uF28D", "\uF28D"], /* Private Use */ + ["\uF28E", "\uF28E"], /* Private Use */ + ["\uF28F", "\uF28F"], /* Private Use */ + ["\uF290", "\uF290"], /* Private Use */ + ["\uF291", "\uF291"], /* Private Use */ + ["\uF292", "\uF292"], /* Private Use */ + ["\uF293", "\uF293"], /* Private Use */ + ["\uF294", "\uF294"], /* Private Use */ + ["\uF295", "\uF295"], /* Private Use */ + ["\uF296", "\uF296"], /* Private Use */ + ["\uF297", "\uF297"], /* Private Use */ + ["\uF298", "\uF298"], /* Private Use */ + ["\uF299", "\uF299"], /* Private Use */ + ["\uF29A", "\uF29A"], /* Private Use */ + ["\uF29B", "\uF29B"], /* Private Use */ + ["\uF29C", "\uF29C"], /* Private Use */ + ["\uF29D", "\uF29D"], /* Private Use */ + ["\uF29E", "\uF29E"], /* Private Use */ + ["\uF29F", "\uF29F"], /* Private Use */ + ["\uF2A0", "\uF2A0"], /* Private Use */ + ["\uF2A1", "\uF2A1"], /* Private Use */ + ["\uF2A2", "\uF2A2"], /* Private Use */ + ["\uF2A3", "\uF2A3"], /* Private Use */ + ["\uF2A4", "\uF2A4"], /* Private Use */ + ["\uF2A5", "\uF2A5"], /* Private Use */ + ["\uF2A6", "\uF2A6"], /* Private Use */ + ["\uF2A7", "\uF2A7"], /* Private Use */ + ["\uF2A8", "\uF2A8"], /* Private Use */ + ["\uF2A9", "\uF2A9"], /* Private Use */ + ["\uF2AA", "\uF2AA"], /* Private Use */ + ["\uF2AB", "\uF2AB"], /* Private Use */ + ["\uF2AC", "\uF2AC"], /* Private Use */ + ["\uF2AD", "\uF2AD"], /* Private Use */ + ["\uF2AE", "\uF2AE"], /* Private Use */ + ["\uF2AF", "\uF2AF"], /* Private Use */ + ["\uF2B0", "\uF2B0"], /* Private Use */ + ["\uF2B1", "\uF2B1"], /* Private Use */ + ["\uF2B2", "\uF2B2"], /* Private Use */ + ["\uF2B3", "\uF2B3"], /* Private Use */ + ["\uF2B4", "\uF2B4"], /* Private Use */ + ["\uF2B5", "\uF2B5"], /* Private Use */ + ["\uF2B6", "\uF2B6"], /* Private Use */ + ["\uF2B7", "\uF2B7"], /* Private Use */ + ["\uF2B8", "\uF2B8"], /* Private Use */ + ["\uF2B9", "\uF2B9"], /* Private Use */ + ["\uF2BA", "\uF2BA"], /* Private Use */ + ["\uF2BB", "\uF2BB"], /* Private Use */ + ["\uF2BC", "\uF2BC"], /* Private Use */ + ["\uF2BD", "\uF2BD"], /* Private Use */ + ["\uF2BE", "\uF2BE"], /* Private Use */ + ["\uF2BF", "\uF2BF"], /* Private Use */ + ["\uF2C0", "\uF2C0"], /* Private Use */ + ["\uF2C1", "\uF2C1"], /* Private Use */ + ["\uF2C2", "\uF2C2"], /* Private Use */ + ["\uF2C3", "\uF2C3"], /* Private Use */ + ["\uF2C4", "\uF2C4"], /* Private Use */ + ["\uF2C5", "\uF2C5"], /* Private Use */ + ["\uF2C6", "\uF2C6"], /* Private Use */ + ["\uF2C7", "\uF2C7"], /* Private Use */ + ["\uF2C8", "\uF2C8"], /* Private Use */ + ["\uF2C9", "\uF2C9"], /* Private Use */ + ["\uF2CA", "\uF2CA"], /* Private Use */ + ["\uF2CB", "\uF2CB"], /* Private Use */ + ["\uF2CC", "\uF2CC"], /* Private Use */ + ["\uF2CD", "\uF2CD"], /* Private Use */ + ["\uF2CE", "\uF2CE"], /* Private Use */ + ["\uF2CF", "\uF2CF"], /* Private Use */ + ["\uF2D0", "\uF2D0"], /* Private Use */ + ["\uF2D1", "\uF2D1"], /* Private Use */ + ["\uF2D2", "\uF2D2"], /* Private Use */ + ["\uF2D3", "\uF2D3"], /* Private Use */ + ["\uF2D4", "\uF2D4"], /* Private Use */ + ["\uF2D5", "\uF2D5"], /* Private Use */ + ["\uF2D6", "\uF2D6"], /* Private Use */ + ["\uF2D7", "\uF2D7"], /* Private Use */ + ["\uF2D8", "\uF2D8"], /* Private Use */ + ["\uF2D9", "\uF2D9"], /* Private Use */ + ["\uF2DA", "\uF2DA"], /* Private Use */ + ["\uF2DB", "\uF2DB"], /* Private Use */ + ["\uF2DC", "\uF2DC"], /* Private Use */ + ["\uF2DD", "\uF2DD"], /* Private Use */ + ["\uF2DE", "\uF2DE"], /* Private Use */ + ["\uF2DF", "\uF2DF"], /* Private Use */ + ["\uF2E0", "\uF2E0"], /* Private Use */ + ["\uF2E1", "\uF2E1"], /* Private Use */ + ["\uF2E2", "\uF2E2"], /* Private Use */ + ["\uF2E3", "\uF2E3"], /* Private Use */ + ["\uF2E4", "\uF2E4"], /* Private Use */ + ["\uF2E5", "\uF2E5"], /* Private Use */ + ["\uF2E6", "\uF2E6"], /* Private Use */ + ["\uF2E7", "\uF2E7"], /* Private Use */ + ["\uF2E8", "\uF2E8"], /* Private Use */ + ["\uF2E9", "\uF2E9"], /* Private Use */ + ["\uF2EA", "\uF2EA"], /* Private Use */ + ["\uF2EB", "\uF2EB"], /* Private Use */ + ["\uF2EC", "\uF2EC"], /* Private Use */ + ["\uF2ED", "\uF2ED"], /* Private Use */ + ["\uF2EE", "\uF2EE"], /* Private Use */ + ["\uF2EF", "\uF2EF"], /* Private Use */ + ["\uF2F0", "\uF2F0"], /* Private Use */ + ["\uF2F1", "\uF2F1"], /* Private Use */ + ["\uF2F2", "\uF2F2"], /* Private Use */ + ["\uF2F3", "\uF2F3"], /* Private Use */ + ["\uF2F4", "\uF2F4"], /* Private Use */ + ["\uF2F5", "\uF2F5"], /* Private Use */ + ["\uF2F6", "\uF2F6"], /* Private Use */ + ["\uF2F7", "\uF2F7"], /* Private Use */ + ["\uF2F8", "\uF2F8"], /* Private Use */ + ["\uF2F9", "\uF2F9"], /* Private Use */ + ["\uF2FA", "\uF2FA"], /* Private Use */ + ["\uF2FB", "\uF2FB"], /* Private Use */ + ["\uF2FC", "\uF2FC"], /* Private Use */ + ["\uF2FD", "\uF2FD"], /* Private Use */ + ["\uF2FE", "\uF2FE"], /* Private Use */ + ["\uF2FF", "\uF2FF"], /* Private Use */ + ["\uF300", "\uF300"], /* Private Use */ + ["\uF301", "\uF301"], /* Private Use */ + ["\uF302", "\uF302"], /* Private Use */ + ["\uF303", "\uF303"], /* Private Use */ + ["\uF304", "\uF304"], /* Private Use */ + ["\uF305", "\uF305"], /* Private Use */ + ["\uF306", "\uF306"], /* Private Use */ + ["\uF307", "\uF307"], /* Private Use */ + ["\uF308", "\uF308"], /* Private Use */ + ["\uF309", "\uF309"], /* Private Use */ + ["\uF30A", "\uF30A"], /* Private Use */ + ["\uF30B", "\uF30B"], /* Private Use */ + ["\uF30C", "\uF30C"], /* Private Use */ + ["\uF30D", "\uF30D"], /* Private Use */ + ["\uF30E", "\uF30E"], /* Private Use */ + ["\uF30F", "\uF30F"], /* Private Use */ + ["\uF310", "\uF310"], /* Private Use */ + ["\uF311", "\uF311"], /* Private Use */ + ["\uF312", "\uF312"], /* Private Use */ + ["\uF313", "\uF313"], /* Private Use */ + ["\uF314", "\uF314"], /* Private Use */ + ["\uF315", "\uF315"], /* Private Use */ + ["\uF316", "\uF316"], /* Private Use */ + ["\uF317", "\uF317"], /* Private Use */ + ["\uF318", "\uF318"], /* Private Use */ + ["\uF319", "\uF319"], /* Private Use */ + ["\uF31A", "\uF31A"], /* Private Use */ + ["\uF31B", "\uF31B"], /* Private Use */ + ["\uF31C", "\uF31C"], /* Private Use */ + ["\uF31D", "\uF31D"], /* Private Use */ + ["\uF31E", "\uF31E"], /* Private Use */ + ["\uF31F", "\uF31F"], /* Private Use */ + ["\uF320", "\uF320"], /* Private Use */ + ["\uF321", "\uF321"], /* Private Use */ + ["\uF322", "\uF322"], /* Private Use */ + ["\uF323", "\uF323"], /* Private Use */ + ["\uF324", "\uF324"], /* Private Use */ + ["\uF325", "\uF325"], /* Private Use */ + ["\uF326", "\uF326"], /* Private Use */ + ["\uF327", "\uF327"], /* Private Use */ + ["\uF328", "\uF328"], /* Private Use */ + ["\uF329", "\uF329"], /* Private Use */ + ["\uF32A", "\uF32A"], /* Private Use */ + ["\uF32B", "\uF32B"], /* Private Use */ + ["\uF32C", "\uF32C"], /* Private Use */ + ["\uF32D", "\uF32D"], /* Private Use */ + ["\uF32E", "\uF32E"], /* Private Use */ + ["\uF32F", "\uF32F"], /* Private Use */ + ["\uF330", "\uF330"], /* Private Use */ + ["\uF331", "\uF331"], /* Private Use */ + ["\uF332", "\uF332"], /* Private Use */ + ["\uF333", "\uF333"], /* Private Use */ + ["\uF334", "\uF334"], /* Private Use */ + ["\uF335", "\uF335"], /* Private Use */ + ["\uF336", "\uF336"], /* Private Use */ + ["\uF337", "\uF337"], /* Private Use */ + ["\uF338", "\uF338"], /* Private Use */ + ["\uF339", "\uF339"], /* Private Use */ + ["\uF33A", "\uF33A"], /* Private Use */ + ["\uF33B", "\uF33B"], /* Private Use */ + ["\uF33C", "\uF33C"], /* Private Use */ + ["\uF33D", "\uF33D"], /* Private Use */ + ["\uF33E", "\uF33E"], /* Private Use */ + ["\uF33F", "\uF33F"], /* Private Use */ + ["\uF340", "\uF340"], /* Private Use */ + ["\uF341", "\uF341"], /* Private Use */ + ["\uF342", "\uF342"], /* Private Use */ + ["\uF343", "\uF343"], /* Private Use */ + ["\uF344", "\uF344"], /* Private Use */ + ["\uF345", "\uF345"], /* Private Use */ + ["\uF346", "\uF346"], /* Private Use */ + ["\uF347", "\uF347"], /* Private Use */ + ["\uF348", "\uF348"], /* Private Use */ + ["\uF349", "\uF349"], /* Private Use */ + ["\uF34A", "\uF34A"], /* Private Use */ + ["\uF34B", "\uF34B"], /* Private Use */ + ["\uF34C", "\uF34C"], /* Private Use */ + ["\uF34D", "\uF34D"], /* Private Use */ + ["\uF34E", "\uF34E"], /* Private Use */ + ["\uF34F", "\uF34F"], /* Private Use */ + ["\uF350", "\uF350"], /* Private Use */ + ["\uF351", "\uF351"], /* Private Use */ + ["\uF352", "\uF352"], /* Private Use */ + ["\uF353", "\uF353"], /* Private Use */ + ["\uF354", "\uF354"], /* Private Use */ + ["\uF355", "\uF355"], /* Private Use */ + ["\uF356", "\uF356"], /* Private Use */ + ["\uF357", "\uF357"], /* Private Use */ + ["\uF358", "\uF358"], /* Private Use */ + ["\uF359", "\uF359"], /* Private Use */ + ["\uF35A", "\uF35A"], /* Private Use */ + ["\uF35B", "\uF35B"], /* Private Use */ + ["\uF35C", "\uF35C"], /* Private Use */ + ["\uF35D", "\uF35D"], /* Private Use */ + ["\uF35E", "\uF35E"], /* Private Use */ + ["\uF35F", "\uF35F"], /* Private Use */ + ["\uF360", "\uF360"], /* Private Use */ + ["\uF361", "\uF361"], /* Private Use */ + ["\uF362", "\uF362"], /* Private Use */ + ["\uF363", "\uF363"], /* Private Use */ + ["\uF364", "\uF364"], /* Private Use */ + ["\uF365", "\uF365"], /* Private Use */ + ["\uF366", "\uF366"], /* Private Use */ + ["\uF367", "\uF367"], /* Private Use */ + ["\uF368", "\uF368"], /* Private Use */ + ["\uF369", "\uF369"], /* Private Use */ + ["\uF36A", "\uF36A"], /* Private Use */ + ["\uF36B", "\uF36B"], /* Private Use */ + ["\uF36C", "\uF36C"], /* Private Use */ + ["\uF36D", "\uF36D"], /* Private Use */ + ["\uF36E", "\uF36E"], /* Private Use */ + ["\uF36F", "\uF36F"], /* Private Use */ + ["\uF370", "\uF370"], /* Private Use */ + ["\uF371", "\uF371"], /* Private Use */ + ["\uF372", "\uF372"], /* Private Use */ + ["\uF373", "\uF373"], /* Private Use */ + ["\uF374", "\uF374"], /* Private Use */ + ["\uF375", "\uF375"], /* Private Use */ + ["\uF376", "\uF376"], /* Private Use */ + ["\uF377", "\uF377"], /* Private Use */ + ["\uF378", "\uF378"], /* Private Use */ + ["\uF379", "\uF379"], /* Private Use */ + ["\uF37A", "\uF37A"], /* Private Use */ + ["\uF37B", "\uF37B"], /* Private Use */ + ["\uF37C", "\uF37C"], /* Private Use */ + ["\uF37D", "\uF37D"], /* Private Use */ + ["\uF37E", "\uF37E"], /* Private Use */ + ["\uF37F", "\uF37F"], /* Private Use */ + ["\uF380", "\uF380"], /* Private Use */ + ["\uF381", "\uF381"], /* Private Use */ + ["\uF382", "\uF382"], /* Private Use */ + ["\uF383", "\uF383"], /* Private Use */ + ["\uF384", "\uF384"], /* Private Use */ + ["\uF385", "\uF385"], /* Private Use */ + ["\uF386", "\uF386"], /* Private Use */ + ["\uF387", "\uF387"], /* Private Use */ + ["\uF388", "\uF388"], /* Private Use */ + ["\uF389", "\uF389"], /* Private Use */ + ["\uF38A", "\uF38A"], /* Private Use */ + ["\uF38B", "\uF38B"], /* Private Use */ + ["\uF38C", "\uF38C"], /* Private Use */ + ["\uF38D", "\uF38D"], /* Private Use */ + ["\uF38E", "\uF38E"], /* Private Use */ + ["\uF38F", "\uF38F"], /* Private Use */ + ["\uF390", "\uF390"], /* Private Use */ + ["\uF391", "\uF391"], /* Private Use */ + ["\uF392", "\uF392"], /* Private Use */ + ["\uF393", "\uF393"], /* Private Use */ + ["\uF394", "\uF394"], /* Private Use */ + ["\uF395", "\uF395"], /* Private Use */ + ["\uF396", "\uF396"], /* Private Use */ + ["\uF397", "\uF397"], /* Private Use */ + ["\uF398", "\uF398"], /* Private Use */ + ["\uF399", "\uF399"], /* Private Use */ + ["\uF39A", "\uF39A"], /* Private Use */ + ["\uF39B", "\uF39B"], /* Private Use */ + ["\uF39C", "\uF39C"], /* Private Use */ + ["\uF39D", "\uF39D"], /* Private Use */ + ["\uF39E", "\uF39E"], /* Private Use */ + ["\uF39F", "\uF39F"], /* Private Use */ + ["\uF3A0", "\uF3A0"], /* Private Use */ + ["\uF3A1", "\uF3A1"], /* Private Use */ + ["\uF3A2", "\uF3A2"], /* Private Use */ + ["\uF3A3", "\uF3A3"], /* Private Use */ + ["\uF3A4", "\uF3A4"], /* Private Use */ + ["\uF3A5", "\uF3A5"], /* Private Use */ + ["\uF3A6", "\uF3A6"], /* Private Use */ + ["\uF3A7", "\uF3A7"], /* Private Use */ + ["\uF3A8", "\uF3A8"], /* Private Use */ + ["\uF3A9", "\uF3A9"], /* Private Use */ + ["\uF3AA", "\uF3AA"], /* Private Use */ + ["\uF3AB", "\uF3AB"], /* Private Use */ + ["\uF3AC", "\uF3AC"], /* Private Use */ + ["\uF3AD", "\uF3AD"], /* Private Use */ + ["\uF3AE", "\uF3AE"], /* Private Use */ + ["\uF3AF", "\uF3AF"], /* Private Use */ + ["\uF3B0", "\uF3B0"], /* Private Use */ + ["\uF3B1", "\uF3B1"], /* Private Use */ + ["\uF3B2", "\uF3B2"], /* Private Use */ + ["\uF3B3", "\uF3B3"], /* Private Use */ + ["\uF3B4", "\uF3B4"], /* Private Use */ + ["\uF3B5", "\uF3B5"], /* Private Use */ + ["\uF3B6", "\uF3B6"], /* Private Use */ + ["\uF3B7", "\uF3B7"], /* Private Use */ + ["\uF3B8", "\uF3B8"], /* Private Use */ + ["\uF3B9", "\uF3B9"], /* Private Use */ + ["\uF3BA", "\uF3BA"], /* Private Use */ + ["\uF3BB", "\uF3BB"], /* Private Use */ + ["\uF3BC", "\uF3BC"], /* Private Use */ + ["\uF3BD", "\uF3BD"], /* Private Use */ + ["\uF3BE", "\uF3BE"], /* Private Use */ + ["\uF3BF", "\uF3BF"], /* Private Use */ + ["\uF3C0", "\uF3C0"], /* Private Use */ + ["\uF3C1", "\uF3C1"], /* Private Use */ + ["\uF3C2", "\uF3C2"], /* Private Use */ + ["\uF3C3", "\uF3C3"], /* Private Use */ + ["\uF3C4", "\uF3C4"], /* Private Use */ + ["\uF3C5", "\uF3C5"], /* Private Use */ + ["\uF3C6", "\uF3C6"], /* Private Use */ + ["\uF3C7", "\uF3C7"], /* Private Use */ + ["\uF3C8", "\uF3C8"], /* Private Use */ + ["\uF3C9", "\uF3C9"], /* Private Use */ + ["\uF3CA", "\uF3CA"], /* Private Use */ + ["\uF3CB", "\uF3CB"], /* Private Use */ + ["\uF3CC", "\uF3CC"], /* Private Use */ + ["\uF3CD", "\uF3CD"], /* Private Use */ + ["\uF3CE", "\uF3CE"], /* Private Use */ + ["\uF3CF", "\uF3CF"], /* Private Use */ + ["\uF3D0", "\uF3D0"], /* Private Use */ + ["\uF3D1", "\uF3D1"], /* Private Use */ + ["\uF3D2", "\uF3D2"], /* Private Use */ + ["\uF3D3", "\uF3D3"], /* Private Use */ + ["\uF3D4", "\uF3D4"], /* Private Use */ + ["\uF3D5", "\uF3D5"], /* Private Use */ + ["\uF3D6", "\uF3D6"], /* Private Use */ + ["\uF3D7", "\uF3D7"], /* Private Use */ + ["\uF3D8", "\uF3D8"], /* Private Use */ + ["\uF3D9", "\uF3D9"], /* Private Use */ + ["\uF3DA", "\uF3DA"], /* Private Use */ + ["\uF3DB", "\uF3DB"], /* Private Use */ + ["\uF3DC", "\uF3DC"], /* Private Use */ + ["\uF3DD", "\uF3DD"], /* Private Use */ + ["\uF3DE", "\uF3DE"], /* Private Use */ + ["\uF3DF", "\uF3DF"], /* Private Use */ + ["\uF3E0", "\uF3E0"], /* Private Use */ + ["\uF3E1", "\uF3E1"], /* Private Use */ + ["\uF3E2", "\uF3E2"], /* Private Use */ + ["\uF3E3", "\uF3E3"], /* Private Use */ + ["\uF3E4", "\uF3E4"], /* Private Use */ + ["\uF3E5", "\uF3E5"], /* Private Use */ + ["\uF3E6", "\uF3E6"], /* Private Use */ + ["\uF3E7", "\uF3E7"], /* Private Use */ + ["\uF3E8", "\uF3E8"], /* Private Use */ + ["\uF3E9", "\uF3E9"], /* Private Use */ + ["\uF3EA", "\uF3EA"], /* Private Use */ + ["\uF3EB", "\uF3EB"], /* Private Use */ + ["\uF3EC", "\uF3EC"], /* Private Use */ + ["\uF3ED", "\uF3ED"], /* Private Use */ + ["\uF3EE", "\uF3EE"], /* Private Use */ + ["\uF3EF", "\uF3EF"], /* Private Use */ + ["\uF3F0", "\uF3F0"], /* Private Use */ + ["\uF3F1", "\uF3F1"], /* Private Use */ + ["\uF3F2", "\uF3F2"], /* Private Use */ + ["\uF3F3", "\uF3F3"], /* Private Use */ + ["\uF3F4", "\uF3F4"], /* Private Use */ + ["\uF3F5", "\uF3F5"], /* Private Use */ + ["\uF3F6", "\uF3F6"], /* Private Use */ + ["\uF3F7", "\uF3F7"], /* Private Use */ + ["\uF3F8", "\uF3F8"], /* Private Use */ + ["\uF3F9", "\uF3F9"], /* Private Use */ + ["\uF3FA", "\uF3FA"], /* Private Use */ + ["\uF3FB", "\uF3FB"], /* Private Use */ + ["\uF3FC", "\uF3FC"], /* Private Use */ + ["\uF3FD", "\uF3FD"], /* Private Use */ + ["\uF3FE", "\uF3FE"], /* Private Use */ + ["\uF3FF", "\uF3FF"], /* Private Use */ + ["\uF400", "\uF400"], /* Private Use */ + ["\uF401", "\uF401"], /* Private Use */ + ["\uF402", "\uF402"], /* Private Use */ + ["\uF403", "\uF403"], /* Private Use */ + ["\uF404", "\uF404"], /* Private Use */ + ["\uF405", "\uF405"], /* Private Use */ + ["\uF406", "\uF406"], /* Private Use */ + ["\uF407", "\uF407"], /* Private Use */ + ["\uF408", "\uF408"], /* Private Use */ + ["\uF409", "\uF409"], /* Private Use */ + ["\uF40A", "\uF40A"], /* Private Use */ + ["\uF40B", "\uF40B"], /* Private Use */ + ["\uF40C", "\uF40C"], /* Private Use */ + ["\uF40D", "\uF40D"], /* Private Use */ + ["\uF40E", "\uF40E"], /* Private Use */ + ["\uF40F", "\uF40F"], /* Private Use */ + ["\uF410", "\uF410"], /* Private Use */ + ["\uF411", "\uF411"], /* Private Use */ + ["\uF412", "\uF412"], /* Private Use */ + ["\uF413", "\uF413"], /* Private Use */ + ["\uF414", "\uF414"], /* Private Use */ + ["\uF415", "\uF415"], /* Private Use */ + ["\uF416", "\uF416"], /* Private Use */ + ["\uF417", "\uF417"], /* Private Use */ + ["\uF418", "\uF418"], /* Private Use */ + ["\uF419", "\uF419"], /* Private Use */ + ["\uF41A", "\uF41A"], /* Private Use */ + ["\uF41B", "\uF41B"], /* Private Use */ + ["\uF41C", "\uF41C"], /* Private Use */ + ["\uF41D", "\uF41D"], /* Private Use */ + ["\uF41E", "\uF41E"], /* Private Use */ + ["\uF41F", "\uF41F"], /* Private Use */ + ["\uF420", "\uF420"], /* Private Use */ + ["\uF421", "\uF421"], /* Private Use */ + ["\uF422", "\uF422"], /* Private Use */ + ["\uF423", "\uF423"], /* Private Use */ + ["\uF424", "\uF424"], /* Private Use */ + ["\uF425", "\uF425"], /* Private Use */ + ["\uF426", "\uF426"], /* Private Use */ + ["\uF427", "\uF427"], /* Private Use */ + ["\uF428", "\uF428"], /* Private Use */ + ["\uF429", "\uF429"], /* Private Use */ + ["\uF42A", "\uF42A"], /* Private Use */ + ["\uF42B", "\uF42B"], /* Private Use */ + ["\uF42C", "\uF42C"], /* Private Use */ + ["\uF42D", "\uF42D"], /* Private Use */ + ["\uF42E", "\uF42E"], /* Private Use */ + ["\uF42F", "\uF42F"], /* Private Use */ + ["\uF430", "\uF430"], /* Private Use */ + ["\uF431", "\uF431"], /* Private Use */ + ["\uF432", "\uF432"], /* Private Use */ + ["\uF433", "\uF433"], /* Private Use */ + ["\uF434", "\uF434"], /* Private Use */ + ["\uF435", "\uF435"], /* Private Use */ + ["\uF436", "\uF436"], /* Private Use */ + ["\uF437", "\uF437"], /* Private Use */ + ["\uF438", "\uF438"], /* Private Use */ + ["\uF439", "\uF439"], /* Private Use */ + ["\uF43A", "\uF43A"], /* Private Use */ + ["\uF43B", "\uF43B"], /* Private Use */ + ["\uF43C", "\uF43C"], /* Private Use */ + ["\uF43D", "\uF43D"], /* Private Use */ + ["\uF43E", "\uF43E"], /* Private Use */ + ["\uF43F", "\uF43F"], /* Private Use */ + ["\uF440", "\uF440"], /* Private Use */ + ["\uF441", "\uF441"], /* Private Use */ + ["\uF442", "\uF442"], /* Private Use */ + ["\uF443", "\uF443"], /* Private Use */ + ["\uF444", "\uF444"], /* Private Use */ + ["\uF445", "\uF445"], /* Private Use */ + ["\uF446", "\uF446"], /* Private Use */ + ["\uF447", "\uF447"], /* Private Use */ + ["\uF448", "\uF448"], /* Private Use */ + ["\uF449", "\uF449"], /* Private Use */ + ["\uF44A", "\uF44A"], /* Private Use */ + ["\uF44B", "\uF44B"], /* Private Use */ + ["\uF44C", "\uF44C"], /* Private Use */ + ["\uF44D", "\uF44D"], /* Private Use */ + ["\uF44E", "\uF44E"], /* Private Use */ + ["\uF44F", "\uF44F"], /* Private Use */ + ["\uF450", "\uF450"], /* Private Use */ + ["\uF451", "\uF451"], /* Private Use */ + ["\uF452", "\uF452"], /* Private Use */ + ["\uF453", "\uF453"], /* Private Use */ + ["\uF454", "\uF454"], /* Private Use */ + ["\uF455", "\uF455"], /* Private Use */ + ["\uF456", "\uF456"], /* Private Use */ + ["\uF457", "\uF457"], /* Private Use */ + ["\uF458", "\uF458"], /* Private Use */ + ["\uF459", "\uF459"], /* Private Use */ + ["\uF45A", "\uF45A"], /* Private Use */ + ["\uF45B", "\uF45B"], /* Private Use */ + ["\uF45C", "\uF45C"], /* Private Use */ + ["\uF45D", "\uF45D"], /* Private Use */ + ["\uF45E", "\uF45E"], /* Private Use */ + ["\uF45F", "\uF45F"], /* Private Use */ + ["\uF460", "\uF460"], /* Private Use */ + ["\uF461", "\uF461"], /* Private Use */ + ["\uF462", "\uF462"], /* Private Use */ + ["\uF463", "\uF463"], /* Private Use */ + ["\uF464", "\uF464"], /* Private Use */ + ["\uF465", "\uF465"], /* Private Use */ + ["\uF466", "\uF466"], /* Private Use */ + ["\uF467", "\uF467"], /* Private Use */ + ["\uF468", "\uF468"], /* Private Use */ + ["\uF469", "\uF469"], /* Private Use */ + ["\uF46A", "\uF46A"], /* Private Use */ + ["\uF46B", "\uF46B"], /* Private Use */ + ["\uF46C", "\uF46C"], /* Private Use */ + ["\uF46D", "\uF46D"], /* Private Use */ + ["\uF46E", "\uF46E"], /* Private Use */ + ["\uF46F", "\uF46F"], /* Private Use */ + ["\uF470", "\uF470"], /* Private Use */ + ["\uF471", "\uF471"], /* Private Use */ + ["\uF472", "\uF472"], /* Private Use */ + ["\uF473", "\uF473"], /* Private Use */ + ["\uF474", "\uF474"], /* Private Use */ + ["\uF475", "\uF475"], /* Private Use */ + ["\uF476", "\uF476"], /* Private Use */ + ["\uF477", "\uF477"], /* Private Use */ + ["\uF478", "\uF478"], /* Private Use */ + ["\uF479", "\uF479"], /* Private Use */ + ["\uF47A", "\uF47A"], /* Private Use */ + ["\uF47B", "\uF47B"], /* Private Use */ + ["\uF47C", "\uF47C"], /* Private Use */ + ["\uF47D", "\uF47D"], /* Private Use */ + ["\uF47E", "\uF47E"], /* Private Use */ + ["\uF47F", "\uF47F"], /* Private Use */ + ["\uF480", "\uF480"], /* Private Use */ + ["\uF481", "\uF481"], /* Private Use */ + ["\uF482", "\uF482"], /* Private Use */ + ["\uF483", "\uF483"], /* Private Use */ + ["\uF484", "\uF484"], /* Private Use */ + ["\uF485", "\uF485"], /* Private Use */ + ["\uF486", "\uF486"], /* Private Use */ + ["\uF487", "\uF487"], /* Private Use */ + ["\uF488", "\uF488"], /* Private Use */ + ["\uF489", "\uF489"], /* Private Use */ + ["\uF48A", "\uF48A"], /* Private Use */ + ["\uF48B", "\uF48B"], /* Private Use */ + ["\uF48C", "\uF48C"], /* Private Use */ + ["\uF48D", "\uF48D"], /* Private Use */ + ["\uF48E", "\uF48E"], /* Private Use */ + ["\uF48F", "\uF48F"], /* Private Use */ + ["\uF490", "\uF490"], /* Private Use */ + ["\uF491", "\uF491"], /* Private Use */ + ["\uF492", "\uF492"], /* Private Use */ + ["\uF493", "\uF493"], /* Private Use */ + ["\uF494", "\uF494"], /* Private Use */ + ["\uF495", "\uF495"], /* Private Use */ + ["\uF496", "\uF496"], /* Private Use */ + ["\uF497", "\uF497"], /* Private Use */ + ["\uF498", "\uF498"], /* Private Use */ + ["\uF499", "\uF499"], /* Private Use */ + ["\uF49A", "\uF49A"], /* Private Use */ + ["\uF49B", "\uF49B"], /* Private Use */ + ["\uF49C", "\uF49C"], /* Private Use */ + ["\uF49D", "\uF49D"], /* Private Use */ + ["\uF49E", "\uF49E"], /* Private Use */ + ["\uF49F", "\uF49F"], /* Private Use */ + ["\uF4A0", "\uF4A0"], /* Private Use */ + ["\uF4A1", "\uF4A1"], /* Private Use */ + ["\uF4A2", "\uF4A2"], /* Private Use */ + ["\uF4A3", "\uF4A3"], /* Private Use */ + ["\uF4A4", "\uF4A4"], /* Private Use */ + ["\uF4A5", "\uF4A5"], /* Private Use */ + ["\uF4A6", "\uF4A6"], /* Private Use */ + ["\uF4A7", "\uF4A7"], /* Private Use */ + ["\uF4A8", "\uF4A8"], /* Private Use */ + ["\uF4A9", "\uF4A9"], /* Private Use */ + ["\uF4AA", "\uF4AA"], /* Private Use */ + ["\uF4AB", "\uF4AB"], /* Private Use */ + ["\uF4AC", "\uF4AC"], /* Private Use */ + ["\uF4AD", "\uF4AD"], /* Private Use */ + ["\uF4AE", "\uF4AE"], /* Private Use */ + ["\uF4AF", "\uF4AF"], /* Private Use */ + ["\uF4B0", "\uF4B0"], /* Private Use */ + ["\uF4B1", "\uF4B1"], /* Private Use */ + ["\uF4B2", "\uF4B2"], /* Private Use */ + ["\uF4B3", "\uF4B3"], /* Private Use */ + ["\uF4B4", "\uF4B4"], /* Private Use */ + ["\uF4B5", "\uF4B5"], /* Private Use */ + ["\uF4B6", "\uF4B6"], /* Private Use */ + ["\uF4B7", "\uF4B7"], /* Private Use */ + ["\uF4B8", "\uF4B8"], /* Private Use */ + ["\uF4B9", "\uF4B9"], /* Private Use */ + ["\uF4BA", "\uF4BA"], /* Private Use */ + ["\uF4BB", "\uF4BB"], /* Private Use */ + ["\uF4BC", "\uF4BC"], /* Private Use */ + ["\uF4BD", "\uF4BD"], /* Private Use */ + ["\uF4BE", "\uF4BE"], /* Private Use */ + ["\uF4BF", "\uF4BF"], /* Private Use */ + ["\uF4C0", "\uF4C0"], /* Private Use */ + ["\uF4C1", "\uF4C1"], /* Private Use */ + ["\uF4C2", "\uF4C2"], /* Private Use */ + ["\uF4C3", "\uF4C3"], /* Private Use */ + ["\uF4C4", "\uF4C4"], /* Private Use */ + ["\uF4C5", "\uF4C5"], /* Private Use */ + ["\uF4C6", "\uF4C6"], /* Private Use */ + ["\uF4C7", "\uF4C7"], /* Private Use */ + ["\uF4C8", "\uF4C8"], /* Private Use */ + ["\uF4C9", "\uF4C9"], /* Private Use */ + ["\uF4CA", "\uF4CA"], /* Private Use */ + ["\uF4CB", "\uF4CB"], /* Private Use */ + ["\uF4CC", "\uF4CC"], /* Private Use */ + ["\uF4CD", "\uF4CD"], /* Private Use */ + ["\uF4CE", "\uF4CE"], /* Private Use */ + ["\uF4CF", "\uF4CF"], /* Private Use */ + ["\uF4D0", "\uF4D0"], /* Private Use */ + ["\uF4D1", "\uF4D1"], /* Private Use */ + ["\uF4D2", "\uF4D2"], /* Private Use */ + ["\uF4D3", "\uF4D3"], /* Private Use */ + ["\uF4D4", "\uF4D4"], /* Private Use */ + ["\uF4D5", "\uF4D5"], /* Private Use */ + ["\uF4D6", "\uF4D6"], /* Private Use */ + ["\uF4D7", "\uF4D7"], /* Private Use */ + ["\uF4D8", "\uF4D8"], /* Private Use */ + ["\uF4D9", "\uF4D9"], /* Private Use */ + ["\uF4DA", "\uF4DA"], /* Private Use */ + ["\uF4DB", "\uF4DB"], /* Private Use */ + ["\uF4DC", "\uF4DC"], /* Private Use */ + ["\uF4DD", "\uF4DD"], /* Private Use */ + ["\uF4DE", "\uF4DE"], /* Private Use */ + ["\uF4DF", "\uF4DF"], /* Private Use */ + ["\uF4E0", "\uF4E0"], /* Private Use */ + ["\uF4E1", "\uF4E1"], /* Private Use */ + ["\uF4E2", "\uF4E2"], /* Private Use */ + ["\uF4E3", "\uF4E3"], /* Private Use */ + ["\uF4E4", "\uF4E4"], /* Private Use */ + ["\uF4E5", "\uF4E5"], /* Private Use */ + ["\uF4E6", "\uF4E6"], /* Private Use */ + ["\uF4E7", "\uF4E7"], /* Private Use */ + ["\uF4E8", "\uF4E8"], /* Private Use */ + ["\uF4E9", "\uF4E9"], /* Private Use */ + ["\uF4EA", "\uF4EA"], /* Private Use */ + ["\uF4EB", "\uF4EB"], /* Private Use */ + ["\uF4EC", "\uF4EC"], /* Private Use */ + ["\uF4ED", "\uF4ED"], /* Private Use */ + ["\uF4EE", "\uF4EE"], /* Private Use */ + ["\uF4EF", "\uF4EF"], /* Private Use */ + ["\uF4F0", "\uF4F0"], /* Private Use */ + ["\uF4F1", "\uF4F1"], /* Private Use */ + ["\uF4F2", "\uF4F2"], /* Private Use */ + ["\uF4F3", "\uF4F3"], /* Private Use */ + ["\uF4F4", "\uF4F4"], /* Private Use */ + ["\uF4F5", "\uF4F5"], /* Private Use */ + ["\uF4F6", "\uF4F6"], /* Private Use */ + ["\uF4F7", "\uF4F7"], /* Private Use */ + ["\uF4F8", "\uF4F8"], /* Private Use */ + ["\uF4F9", "\uF4F9"], /* Private Use */ + ["\uF4FA", "\uF4FA"], /* Private Use */ + ["\uF4FB", "\uF4FB"], /* Private Use */ + ["\uF4FC", "\uF4FC"], /* Private Use */ + ["\uF4FD", "\uF4FD"], /* Private Use */ + ["\uF4FE", "\uF4FE"], /* Private Use */ + ["\uF4FF", "\uF4FF"], /* Private Use */ + ["\uF500", "\uF500"], /* Private Use */ + ["\uF501", "\uF501"], /* Private Use */ + ["\uF502", "\uF502"], /* Private Use */ + ["\uF503", "\uF503"], /* Private Use */ + ["\uF504", "\uF504"], /* Private Use */ + ["\uF505", "\uF505"], /* Private Use */ + ["\uF506", "\uF506"], /* Private Use */ + ["\uF507", "\uF507"], /* Private Use */ + ["\uF508", "\uF508"], /* Private Use */ + ["\uF509", "\uF509"], /* Private Use */ + ["\uF50A", "\uF50A"], /* Private Use */ + ["\uF50B", "\uF50B"], /* Private Use */ + ["\uF50C", "\uF50C"], /* Private Use */ + ["\uF50D", "\uF50D"], /* Private Use */ + ["\uF50E", "\uF50E"], /* Private Use */ + ["\uF50F", "\uF50F"], /* Private Use */ + ["\uF510", "\uF510"], /* Private Use */ + ["\uF511", "\uF511"], /* Private Use */ + ["\uF512", "\uF512"], /* Private Use */ + ["\uF513", "\uF513"], /* Private Use */ + ["\uF514", "\uF514"], /* Private Use */ + ["\uF515", "\uF515"], /* Private Use */ + ["\uF516", "\uF516"], /* Private Use */ + ["\uF517", "\uF517"], /* Private Use */ + ["\uF518", "\uF518"], /* Private Use */ + ["\uF519", "\uF519"], /* Private Use */ + ["\uF51A", "\uF51A"], /* Private Use */ + ["\uF51B", "\uF51B"], /* Private Use */ + ["\uF51C", "\uF51C"], /* Private Use */ + ["\uF51D", "\uF51D"], /* Private Use */ + ["\uF51E", "\uF51E"], /* Private Use */ + ["\uF51F", "\uF51F"], /* Private Use */ + ["\uF520", "\uF520"], /* Private Use */ + ["\uF521", "\uF521"], /* Private Use */ + ["\uF522", "\uF522"], /* Private Use */ + ["\uF523", "\uF523"], /* Private Use */ + ["\uF524", "\uF524"], /* Private Use */ + ["\uF525", "\uF525"], /* Private Use */ + ["\uF526", "\uF526"], /* Private Use */ + ["\uF527", "\uF527"], /* Private Use */ + ["\uF528", "\uF528"], /* Private Use */ + ["\uF529", "\uF529"], /* Private Use */ + ["\uF52A", "\uF52A"], /* Private Use */ + ["\uF52B", "\uF52B"], /* Private Use */ + ["\uF52C", "\uF52C"], /* Private Use */ + ["\uF52D", "\uF52D"], /* Private Use */ + ["\uF52E", "\uF52E"], /* Private Use */ + ["\uF52F", "\uF52F"], /* Private Use */ + ["\uF530", "\uF530"], /* Private Use */ + ["\uF531", "\uF531"], /* Private Use */ + ["\uF532", "\uF532"], /* Private Use */ + ["\uF533", "\uF533"], /* Private Use */ + ["\uF534", "\uF534"], /* Private Use */ + ["\uF535", "\uF535"], /* Private Use */ + ["\uF536", "\uF536"], /* Private Use */ + ["\uF537", "\uF537"], /* Private Use */ + ["\uF538", "\uF538"], /* Private Use */ + ["\uF539", "\uF539"], /* Private Use */ + ["\uF53A", "\uF53A"], /* Private Use */ + ["\uF53B", "\uF53B"], /* Private Use */ + ["\uF53C", "\uF53C"], /* Private Use */ + ["\uF53D", "\uF53D"], /* Private Use */ + ["\uF53E", "\uF53E"], /* Private Use */ + ["\uF53F", "\uF53F"], /* Private Use */ + ["\uF540", "\uF540"], /* Private Use */ + ["\uF541", "\uF541"], /* Private Use */ + ["\uF542", "\uF542"], /* Private Use */ + ["\uF543", "\uF543"], /* Private Use */ + ["\uF544", "\uF544"], /* Private Use */ + ["\uF545", "\uF545"], /* Private Use */ + ["\uF546", "\uF546"], /* Private Use */ + ["\uF547", "\uF547"], /* Private Use */ + ["\uF548", "\uF548"], /* Private Use */ + ["\uF549", "\uF549"], /* Private Use */ + ["\uF54A", "\uF54A"], /* Private Use */ + ["\uF54B", "\uF54B"], /* Private Use */ + ["\uF54C", "\uF54C"], /* Private Use */ + ["\uF54D", "\uF54D"], /* Private Use */ + ["\uF54E", "\uF54E"], /* Private Use */ + ["\uF54F", "\uF54F"], /* Private Use */ + ["\uF550", "\uF550"], /* Private Use */ + ["\uF551", "\uF551"], /* Private Use */ + ["\uF552", "\uF552"], /* Private Use */ + ["\uF553", "\uF553"], /* Private Use */ + ["\uF554", "\uF554"], /* Private Use */ + ["\uF555", "\uF555"], /* Private Use */ + ["\uF556", "\uF556"], /* Private Use */ + ["\uF557", "\uF557"], /* Private Use */ + ["\uF558", "\uF558"], /* Private Use */ + ["\uF559", "\uF559"], /* Private Use */ + ["\uF55A", "\uF55A"], /* Private Use */ + ["\uF55B", "\uF55B"], /* Private Use */ + ["\uF55C", "\uF55C"], /* Private Use */ + ["\uF55D", "\uF55D"], /* Private Use */ + ["\uF55E", "\uF55E"], /* Private Use */ + ["\uF55F", "\uF55F"], /* Private Use */ + ["\uF560", "\uF560"], /* Private Use */ + ["\uF561", "\uF561"], /* Private Use */ + ["\uF562", "\uF562"], /* Private Use */ + ["\uF563", "\uF563"], /* Private Use */ + ["\uF564", "\uF564"], /* Private Use */ + ["\uF565", "\uF565"], /* Private Use */ + ["\uF566", "\uF566"], /* Private Use */ + ["\uF567", "\uF567"], /* Private Use */ + ["\uF568", "\uF568"], /* Private Use */ + ["\uF569", "\uF569"], /* Private Use */ + ["\uF56A", "\uF56A"], /* Private Use */ + ["\uF56B", "\uF56B"], /* Private Use */ + ["\uF56C", "\uF56C"], /* Private Use */ + ["\uF56D", "\uF56D"], /* Private Use */ + ["\uF56E", "\uF56E"], /* Private Use */ + ["\uF56F", "\uF56F"], /* Private Use */ + ["\uF570", "\uF570"], /* Private Use */ + ["\uF571", "\uF571"], /* Private Use */ + ["\uF572", "\uF572"], /* Private Use */ + ["\uF573", "\uF573"], /* Private Use */ + ["\uF574", "\uF574"], /* Private Use */ + ["\uF575", "\uF575"], /* Private Use */ + ["\uF576", "\uF576"], /* Private Use */ + ["\uF577", "\uF577"], /* Private Use */ + ["\uF578", "\uF578"], /* Private Use */ + ["\uF579", "\uF579"], /* Private Use */ + ["\uF57A", "\uF57A"], /* Private Use */ + ["\uF57B", "\uF57B"], /* Private Use */ + ["\uF57C", "\uF57C"], /* Private Use */ + ["\uF57D", "\uF57D"], /* Private Use */ + ["\uF57E", "\uF57E"], /* Private Use */ + ["\uF57F", "\uF57F"], /* Private Use */ + ["\uF580", "\uF580"], /* Private Use */ + ["\uF581", "\uF581"], /* Private Use */ + ["\uF582", "\uF582"], /* Private Use */ + ["\uF583", "\uF583"], /* Private Use */ + ["\uF584", "\uF584"], /* Private Use */ + ["\uF585", "\uF585"], /* Private Use */ + ["\uF586", "\uF586"], /* Private Use */ + ["\uF587", "\uF587"], /* Private Use */ + ["\uF588", "\uF588"], /* Private Use */ + ["\uF589", "\uF589"], /* Private Use */ + ["\uF58A", "\uF58A"], /* Private Use */ + ["\uF58B", "\uF58B"], /* Private Use */ + ["\uF58C", "\uF58C"], /* Private Use */ + ["\uF58D", "\uF58D"], /* Private Use */ + ["\uF58E", "\uF58E"], /* Private Use */ + ["\uF58F", "\uF58F"], /* Private Use */ + ["\uF590", "\uF590"], /* Private Use */ + ["\uF591", "\uF591"], /* Private Use */ + ["\uF592", "\uF592"], /* Private Use */ + ["\uF593", "\uF593"], /* Private Use */ + ["\uF594", "\uF594"], /* Private Use */ + ["\uF595", "\uF595"], /* Private Use */ + ["\uF596", "\uF596"], /* Private Use */ + ["\uF597", "\uF597"], /* Private Use */ + ["\uF598", "\uF598"], /* Private Use */ + ["\uF599", "\uF599"], /* Private Use */ + ["\uF59A", "\uF59A"], /* Private Use */ + ["\uF59B", "\uF59B"], /* Private Use */ + ["\uF59C", "\uF59C"], /* Private Use */ + ["\uF59D", "\uF59D"], /* Private Use */ + ["\uF59E", "\uF59E"], /* Private Use */ + ["\uF59F", "\uF59F"], /* Private Use */ + ["\uF5A0", "\uF5A0"], /* Private Use */ + ["\uF5A1", "\uF5A1"], /* Private Use */ + ["\uF5A2", "\uF5A2"], /* Private Use */ + ["\uF5A3", "\uF5A3"], /* Private Use */ + ["\uF5A4", "\uF5A4"], /* Private Use */ + ["\uF5A5", "\uF5A5"], /* Private Use */ + ["\uF5A6", "\uF5A6"], /* Private Use */ + ["\uF5A7", "\uF5A7"], /* Private Use */ + ["\uF5A8", "\uF5A8"], /* Private Use */ + ["\uF5A9", "\uF5A9"], /* Private Use */ + ["\uF5AA", "\uF5AA"], /* Private Use */ + ["\uF5AB", "\uF5AB"], /* Private Use */ + ["\uF5AC", "\uF5AC"], /* Private Use */ + ["\uF5AD", "\uF5AD"], /* Private Use */ + ["\uF5AE", "\uF5AE"], /* Private Use */ + ["\uF5AF", "\uF5AF"], /* Private Use */ + ["\uF5B0", "\uF5B0"], /* Private Use */ + ["\uF5B1", "\uF5B1"], /* Private Use */ + ["\uF5B2", "\uF5B2"], /* Private Use */ + ["\uF5B3", "\uF5B3"], /* Private Use */ + ["\uF5B4", "\uF5B4"], /* Private Use */ + ["\uF5B5", "\uF5B5"], /* Private Use */ + ["\uF5B6", "\uF5B6"], /* Private Use */ + ["\uF5B7", "\uF5B7"], /* Private Use */ + ["\uF5B8", "\uF5B8"], /* Private Use */ + ["\uF5B9", "\uF5B9"], /* Private Use */ + ["\uF5BA", "\uF5BA"], /* Private Use */ + ["\uF5BB", "\uF5BB"], /* Private Use */ + ["\uF5BC", "\uF5BC"], /* Private Use */ + ["\uF5BD", "\uF5BD"], /* Private Use */ + ["\uF5BE", "\uF5BE"], /* Private Use */ + ["\uF5BF", "\uF5BF"], /* Private Use */ + ["\uF5C0", "\uF5C0"], /* Private Use */ + ["\uF5C1", "\uF5C1"], /* Private Use */ + ["\uF5C2", "\uF5C2"], /* Private Use */ + ["\uF5C3", "\uF5C3"], /* Private Use */ + ["\uF5C4", "\uF5C4"], /* Private Use */ + ["\uF5C5", "\uF5C5"], /* Private Use */ + ["\uF5C6", "\uF5C6"], /* Private Use */ + ["\uF5C7", "\uF5C7"], /* Private Use */ + ["\uF5C8", "\uF5C8"], /* Private Use */ + ["\uF5C9", "\uF5C9"], /* Private Use */ + ["\uF5CA", "\uF5CA"], /* Private Use */ + ["\uF5CB", "\uF5CB"], /* Private Use */ + ["\uF5CC", "\uF5CC"], /* Private Use */ + ["\uF5CD", "\uF5CD"], /* Private Use */ + ["\uF5CE", "\uF5CE"], /* Private Use */ + ["\uF5CF", "\uF5CF"], /* Private Use */ + ["\uF5D0", "\uF5D0"], /* Private Use */ + ["\uF5D1", "\uF5D1"], /* Private Use */ + ["\uF5D2", "\uF5D2"], /* Private Use */ + ["\uF5D3", "\uF5D3"], /* Private Use */ + ["\uF5D4", "\uF5D4"], /* Private Use */ + ["\uF5D5", "\uF5D5"], /* Private Use */ + ["\uF5D6", "\uF5D6"], /* Private Use */ + ["\uF5D7", "\uF5D7"], /* Private Use */ + ["\uF5D8", "\uF5D8"], /* Private Use */ + ["\uF5D9", "\uF5D9"], /* Private Use */ + ["\uF5DA", "\uF5DA"], /* Private Use */ + ["\uF5DB", "\uF5DB"], /* Private Use */ + ["\uF5DC", "\uF5DC"], /* Private Use */ + ["\uF5DD", "\uF5DD"], /* Private Use */ + ["\uF5DE", "\uF5DE"], /* Private Use */ + ["\uF5DF", "\uF5DF"], /* Private Use */ + ["\uF5E0", "\uF5E0"], /* Private Use */ + ["\uF5E1", "\uF5E1"], /* Private Use */ + ["\uF5E2", "\uF5E2"], /* Private Use */ + ["\uF5E3", "\uF5E3"], /* Private Use */ + ["\uF5E4", "\uF5E4"], /* Private Use */ + ["\uF5E5", "\uF5E5"], /* Private Use */ + ["\uF5E6", "\uF5E6"], /* Private Use */ + ["\uF5E7", "\uF5E7"], /* Private Use */ + ["\uF5E8", "\uF5E8"], /* Private Use */ + ["\uF5E9", "\uF5E9"], /* Private Use */ + ["\uF5EA", "\uF5EA"], /* Private Use */ + ["\uF5EB", "\uF5EB"], /* Private Use */ + ["\uF5EC", "\uF5EC"], /* Private Use */ + ["\uF5ED", "\uF5ED"], /* Private Use */ + ["\uF5EE", "\uF5EE"], /* Private Use */ + ["\uF5EF", "\uF5EF"], /* Private Use */ + ["\uF5F0", "\uF5F0"], /* Private Use */ + ["\uF5F1", "\uF5F1"], /* Private Use */ + ["\uF5F2", "\uF5F2"], /* Private Use */ + ["\uF5F3", "\uF5F3"], /* Private Use */ + ["\uF5F4", "\uF5F4"], /* Private Use */ + ["\uF5F5", "\uF5F5"], /* Private Use */ + ["\uF5F6", "\uF5F6"], /* Private Use */ + ["\uF5F7", "\uF5F7"], /* Private Use */ + ["\uF5F8", "\uF5F8"], /* Private Use */ + ["\uF5F9", "\uF5F9"], /* Private Use */ + ["\uF5FA", "\uF5FA"], /* Private Use */ + ["\uF5FB", "\uF5FB"], /* Private Use */ + ["\uF5FC", "\uF5FC"], /* Private Use */ + ["\uF5FD", "\uF5FD"], /* Private Use */ + ["\uF5FE", "\uF5FE"], /* Private Use */ + ["\uF5FF", "\uF5FF"], /* Private Use */ + ["\uF600", "\uF600"], /* Private Use */ + ["\uF601", "\uF601"], /* Private Use */ + ["\uF602", "\uF602"], /* Private Use */ + ["\uF603", "\uF603"], /* Private Use */ + ["\uF604", "\uF604"], /* Private Use */ + ["\uF605", "\uF605"], /* Private Use */ + ["\uF606", "\uF606"], /* Private Use */ + ["\uF607", "\uF607"], /* Private Use */ + ["\uF608", "\uF608"], /* Private Use */ + ["\uF609", "\uF609"], /* Private Use */ + ["\uF60A", "\uF60A"], /* Private Use */ + ["\uF60B", "\uF60B"], /* Private Use */ + ["\uF60C", "\uF60C"], /* Private Use */ + ["\uF60D", "\uF60D"], /* Private Use */ + ["\uF60E", "\uF60E"], /* Private Use */ + ["\uF60F", "\uF60F"], /* Private Use */ + ["\uF610", "\uF610"], /* Private Use */ + ["\uF611", "\uF611"], /* Private Use */ + ["\uF612", "\uF612"], /* Private Use */ + ["\uF613", "\uF613"], /* Private Use */ + ["\uF614", "\uF614"], /* Private Use */ + ["\uF615", "\uF615"], /* Private Use */ + ["\uF616", "\uF616"], /* Private Use */ + ["\uF617", "\uF617"], /* Private Use */ + ["\uF618", "\uF618"], /* Private Use */ + ["\uF619", "\uF619"], /* Private Use */ + ["\uF61A", "\uF61A"], /* Private Use */ + ["\uF61B", "\uF61B"], /* Private Use */ + ["\uF61C", "\uF61C"], /* Private Use */ + ["\uF61D", "\uF61D"], /* Private Use */ + ["\uF61E", "\uF61E"], /* Private Use */ + ["\uF61F", "\uF61F"], /* Private Use */ + ["\uF620", "\uF620"], /* Private Use */ + ["\uF621", "\uF621"], /* Private Use */ + ["\uF622", "\uF622"], /* Private Use */ + ["\uF623", "\uF623"], /* Private Use */ + ["\uF624", "\uF624"], /* Private Use */ + ["\uF625", "\uF625"], /* Private Use */ + ["\uF626", "\uF626"], /* Private Use */ + ["\uF627", "\uF627"], /* Private Use */ + ["\uF628", "\uF628"], /* Private Use */ + ["\uF629", "\uF629"], /* Private Use */ + ["\uF62A", "\uF62A"], /* Private Use */ + ["\uF62B", "\uF62B"], /* Private Use */ + ["\uF62C", "\uF62C"], /* Private Use */ + ["\uF62D", "\uF62D"], /* Private Use */ + ["\uF62E", "\uF62E"], /* Private Use */ + ["\uF62F", "\uF62F"], /* Private Use */ + ["\uF630", "\uF630"], /* Private Use */ + ["\uF631", "\uF631"], /* Private Use */ + ["\uF632", "\uF632"], /* Private Use */ + ["\uF633", "\uF633"], /* Private Use */ + ["\uF634", "\uF634"], /* Private Use */ + ["\uF635", "\uF635"], /* Private Use */ + ["\uF636", "\uF636"], /* Private Use */ + ["\uF637", "\uF637"], /* Private Use */ + ["\uF638", "\uF638"], /* Private Use */ + ["\uF639", "\uF639"], /* Private Use */ + ["\uF63A", "\uF63A"], /* Private Use */ + ["\uF63B", "\uF63B"], /* Private Use */ + ["\uF63C", "\uF63C"], /* Private Use */ + ["\uF63D", "\uF63D"], /* Private Use */ + ["\uF63E", "\uF63E"], /* Private Use */ + ["\uF63F", "\uF63F"], /* Private Use */ + ["\uF640", "\uF640"], /* Private Use */ + ["\uF641", "\uF641"], /* Private Use */ + ["\uF642", "\uF642"], /* Private Use */ + ["\uF643", "\uF643"], /* Private Use */ + ["\uF644", "\uF644"], /* Private Use */ + ["\uF645", "\uF645"], /* Private Use */ + ["\uF646", "\uF646"], /* Private Use */ + ["\uF647", "\uF647"], /* Private Use */ + ["\uF648", "\uF648"], /* Private Use */ + ["\uF649", "\uF649"], /* Private Use */ + ["\uF64A", "\uF64A"], /* Private Use */ + ["\uF64B", "\uF64B"], /* Private Use */ + ["\uF64C", "\uF64C"], /* Private Use */ + ["\uF64D", "\uF64D"], /* Private Use */ + ["\uF64E", "\uF64E"], /* Private Use */ + ["\uF64F", "\uF64F"], /* Private Use */ + ["\uF650", "\uF650"], /* Private Use */ + ["\uF651", "\uF651"], /* Private Use */ + ["\uF652", "\uF652"], /* Private Use */ + ["\uF653", "\uF653"], /* Private Use */ + ["\uF654", "\uF654"], /* Private Use */ + ["\uF655", "\uF655"], /* Private Use */ + ["\uF656", "\uF656"], /* Private Use */ + ["\uF657", "\uF657"], /* Private Use */ + ["\uF658", "\uF658"], /* Private Use */ + ["\uF659", "\uF659"], /* Private Use */ + ["\uF65A", "\uF65A"], /* Private Use */ + ["\uF65B", "\uF65B"], /* Private Use */ + ["\uF65C", "\uF65C"], /* Private Use */ + ["\uF65D", "\uF65D"], /* Private Use */ + ["\uF65E", "\uF65E"], /* Private Use */ + ["\uF65F", "\uF65F"], /* Private Use */ + ["\uF660", "\uF660"], /* Private Use */ + ["\uF661", "\uF661"], /* Private Use */ + ["\uF662", "\uF662"], /* Private Use */ + ["\uF663", "\uF663"], /* Private Use */ + ["\uF664", "\uF664"], /* Private Use */ + ["\uF665", "\uF665"], /* Private Use */ + ["\uF666", "\uF666"], /* Private Use */ + ["\uF667", "\uF667"], /* Private Use */ + ["\uF668", "\uF668"], /* Private Use */ + ["\uF669", "\uF669"], /* Private Use */ + ["\uF66A", "\uF66A"], /* Private Use */ + ["\uF66B", "\uF66B"], /* Private Use */ + ["\uF66C", "\uF66C"], /* Private Use */ + ["\uF66D", "\uF66D"], /* Private Use */ + ["\uF66E", "\uF66E"], /* Private Use */ + ["\uF66F", "\uF66F"], /* Private Use */ + ["\uF670", "\uF670"], /* Private Use */ + ["\uF671", "\uF671"], /* Private Use */ + ["\uF672", "\uF672"], /* Private Use */ + ["\uF673", "\uF673"], /* Private Use */ + ["\uF674", "\uF674"], /* Private Use */ + ["\uF675", "\uF675"], /* Private Use */ + ["\uF676", "\uF676"], /* Private Use */ + ["\uF677", "\uF677"], /* Private Use */ + ["\uF678", "\uF678"], /* Private Use */ + ["\uF679", "\uF679"], /* Private Use */ + ["\uF67A", "\uF67A"], /* Private Use */ + ["\uF67B", "\uF67B"], /* Private Use */ + ["\uF67C", "\uF67C"], /* Private Use */ + ["\uF67D", "\uF67D"], /* Private Use */ + ["\uF67E", "\uF67E"], /* Private Use */ + ["\uF67F", "\uF67F"], /* Private Use */ + ["\uF680", "\uF680"], /* Private Use */ + ["\uF681", "\uF681"], /* Private Use */ + ["\uF682", "\uF682"], /* Private Use */ + ["\uF683", "\uF683"], /* Private Use */ + ["\uF684", "\uF684"], /* Private Use */ + ["\uF685", "\uF685"], /* Private Use */ + ["\uF686", "\uF686"], /* Private Use */ + ["\uF687", "\uF687"], /* Private Use */ + ["\uF688", "\uF688"], /* Private Use */ + ["\uF689", "\uF689"], /* Private Use */ + ["\uF68A", "\uF68A"], /* Private Use */ + ["\uF68B", "\uF68B"], /* Private Use */ + ["\uF68C", "\uF68C"], /* Private Use */ + ["\uF68D", "\uF68D"], /* Private Use */ + ["\uF68E", "\uF68E"], /* Private Use */ + ["\uF68F", "\uF68F"], /* Private Use */ + ["\uF690", "\uF690"], /* Private Use */ + ["\uF691", "\uF691"], /* Private Use */ + ["\uF692", "\uF692"], /* Private Use */ + ["\uF693", "\uF693"], /* Private Use */ + ["\uF694", "\uF694"], /* Private Use */ + ["\uF695", "\uF695"], /* Private Use */ + ["\uF696", "\uF696"], /* Private Use */ + ["\uF697", "\uF697"], /* Private Use */ + ["\uF698", "\uF698"], /* Private Use */ + ["\uF699", "\uF699"], /* Private Use */ + ["\uF69A", "\uF69A"], /* Private Use */ + ["\uF69B", "\uF69B"], /* Private Use */ + ["\uF69C", "\uF69C"], /* Private Use */ + ["\uF69D", "\uF69D"], /* Private Use */ + ["\uF69E", "\uF69E"], /* Private Use */ + ["\uF69F", "\uF69F"], /* Private Use */ + ["\uF6A0", "\uF6A0"], /* Private Use */ + ["\uF6A1", "\uF6A1"], /* Private Use */ + ["\uF6A2", "\uF6A2"], /* Private Use */ + ["\uF6A3", "\uF6A3"], /* Private Use */ + ["\uF6A4", "\uF6A4"], /* Private Use */ + ["\uF6A5", "\uF6A5"], /* Private Use */ + ["\uF6A6", "\uF6A6"], /* Private Use */ + ["\uF6A7", "\uF6A7"], /* Private Use */ + ["\uF6A8", "\uF6A8"], /* Private Use */ + ["\uF6A9", "\uF6A9"], /* Private Use */ + ["\uF6AA", "\uF6AA"], /* Private Use */ + ["\uF6AB", "\uF6AB"], /* Private Use */ + ["\uF6AC", "\uF6AC"], /* Private Use */ + ["\uF6AD", "\uF6AD"], /* Private Use */ + ["\uF6AE", "\uF6AE"], /* Private Use */ + ["\uF6AF", "\uF6AF"], /* Private Use */ + ["\uF6B0", "\uF6B0"], /* Private Use */ + ["\uF6B1", "\uF6B1"], /* Private Use */ + ["\uF6B2", "\uF6B2"], /* Private Use */ + ["\uF6B3", "\uF6B3"], /* Private Use */ + ["\uF6B4", "\uF6B4"], /* Private Use */ + ["\uF6B5", "\uF6B5"], /* Private Use */ + ["\uF6B6", "\uF6B6"], /* Private Use */ + ["\uF6B7", "\uF6B7"], /* Private Use */ + ["\uF6B8", "\uF6B8"], /* Private Use */ + ["\uF6B9", "\uF6B9"], /* Private Use */ + ["\uF6BA", "\uF6BA"], /* Private Use */ + ["\uF6BB", "\uF6BB"], /* Private Use */ + ["\uF6BC", "\uF6BC"], /* Private Use */ + ["\uF6BD", "\uF6BD"], /* Private Use */ + ["\uF6BE", "\uF6BE"], /* Private Use */ + ["\uF6BF", "\uF6BF"], /* Private Use */ + ["\uF6C0", "\uF6C0"], /* Private Use */ + ["\uF6C1", "\uF6C1"], /* Private Use */ + ["\uF6C2", "\uF6C2"], /* Private Use */ + ["\uF6C3", "\uF6C3"], /* Private Use */ + ["\uF6C4", "\uF6C4"], /* Private Use */ + ["\uF6C5", "\uF6C5"], /* Private Use */ + ["\uF6C6", "\uF6C6"], /* Private Use */ + ["\uF6C7", "\uF6C7"], /* Private Use */ + ["\uF6C8", "\uF6C8"], /* Private Use */ + ["\uF6C9", "\uF6C9"], /* Private Use */ + ["\uF6CA", "\uF6CA"], /* Private Use */ + ["\uF6CB", "\uF6CB"], /* Private Use */ + ["\uF6CC", "\uF6CC"], /* Private Use */ + ["\uF6CD", "\uF6CD"], /* Private Use */ + ["\uF6CE", "\uF6CE"], /* Private Use */ + ["\uF6CF", "\uF6CF"], /* Private Use */ + ["\uF6D0", "\uF6D0"], /* Private Use */ + ["\uF6D1", "\uF6D1"], /* Private Use */ + ["\uF6D2", "\uF6D2"], /* Private Use */ + ["\uF6D3", "\uF6D3"], /* Private Use */ + ["\uF6D4", "\uF6D4"], /* Private Use */ + ["\uF6D5", "\uF6D5"], /* Private Use */ + ["\uF6D6", "\uF6D6"], /* Private Use */ + ["\uF6D7", "\uF6D7"], /* Private Use */ + ["\uF6D8", "\uF6D8"], /* Private Use */ + ["\uF6D9", "\uF6D9"], /* Private Use */ + ["\uF6DA", "\uF6DA"], /* Private Use */ + ["\uF6DB", "\uF6DB"], /* Private Use */ + ["\uF6DC", "\uF6DC"], /* Private Use */ + ["\uF6DD", "\uF6DD"], /* Private Use */ + ["\uF6DE", "\uF6DE"], /* Private Use */ + ["\uF6DF", "\uF6DF"], /* Private Use */ + ["\uF6E0", "\uF6E0"], /* Private Use */ + ["\uF6E1", "\uF6E1"], /* Private Use */ + ["\uF6E2", "\uF6E2"], /* Private Use */ + ["\uF6E3", "\uF6E3"], /* Private Use */ + ["\uF6E4", "\uF6E4"], /* Private Use */ + ["\uF6E5", "\uF6E5"], /* Private Use */ + ["\uF6E6", "\uF6E6"], /* Private Use */ + ["\uF6E7", "\uF6E7"], /* Private Use */ + ["\uF6E8", "\uF6E8"], /* Private Use */ + ["\uF6E9", "\uF6E9"], /* Private Use */ + ["\uF6EA", "\uF6EA"], /* Private Use */ + ["\uF6EB", "\uF6EB"], /* Private Use */ + ["\uF6EC", "\uF6EC"], /* Private Use */ + ["\uF6ED", "\uF6ED"], /* Private Use */ + ["\uF6EE", "\uF6EE"], /* Private Use */ + ["\uF6EF", "\uF6EF"], /* Private Use */ + ["\uF6F0", "\uF6F0"], /* Private Use */ + ["\uF6F1", "\uF6F1"], /* Private Use */ + ["\uF6F2", "\uF6F2"], /* Private Use */ + ["\uF6F3", "\uF6F3"], /* Private Use */ + ["\uF6F4", "\uF6F4"], /* Private Use */ + ["\uF6F5", "\uF6F5"], /* Private Use */ + ["\uF6F6", "\uF6F6"], /* Private Use */ + ["\uF6F7", "\uF6F7"], /* Private Use */ + ["\uF6F8", "\uF6F8"], /* Private Use */ + ["\uF6F9", "\uF6F9"], /* Private Use */ + ["\uF6FA", "\uF6FA"], /* Private Use */ + ["\uF6FB", "\uF6FB"], /* Private Use */ + ["\uF6FC", "\uF6FC"], /* Private Use */ + ["\uF6FD", "\uF6FD"], /* Private Use */ + ["\uF6FE", "\uF6FE"], /* Private Use */ + ["\uF6FF", "\uF6FF"], /* Private Use */ + ["\uF700", "\uF700"], /* Private Use */ + ["\uF701", "\uF701"], /* Private Use */ + ["\uF702", "\uF702"], /* Private Use */ + ["\uF703", "\uF703"], /* Private Use */ + ["\uF704", "\uF704"], /* Private Use */ + ["\uF705", "\uF705"], /* Private Use */ + ["\uF706", "\uF706"], /* Private Use */ + ["\uF707", "\uF707"], /* Private Use */ + ["\uF708", "\uF708"], /* Private Use */ + ["\uF709", "\uF709"], /* Private Use */ + ["\uF70A", "\uF70A"], /* Private Use */ + ["\uF70B", "\uF70B"], /* Private Use */ + ["\uF70C", "\uF70C"], /* Private Use */ + ["\uF70D", "\uF70D"], /* Private Use */ + ["\uF70E", "\uF70E"], /* Private Use */ + ["\uF70F", "\uF70F"], /* Private Use */ + ["\uF710", "\uF710"], /* Private Use */ + ["\uF711", "\uF711"], /* Private Use */ + ["\uF712", "\uF712"], /* Private Use */ + ["\uF713", "\uF713"], /* Private Use */ + ["\uF714", "\uF714"], /* Private Use */ + ["\uF715", "\uF715"], /* Private Use */ + ["\uF716", "\uF716"], /* Private Use */ + ["\uF717", "\uF717"], /* Private Use */ + ["\uF718", "\uF718"], /* Private Use */ + ["\uF719", "\uF719"], /* Private Use */ + ["\uF71A", "\uF71A"], /* Private Use */ + ["\uF71B", "\uF71B"], /* Private Use */ + ["\uF71C", "\uF71C"], /* Private Use */ + ["\uF71D", "\uF71D"], /* Private Use */ + ["\uF71E", "\uF71E"], /* Private Use */ + ["\uF71F", "\uF71F"], /* Private Use */ + ["\uF720", "\uF720"], /* Private Use */ + ["\uF721", "\uF721"], /* Private Use */ + ["\uF722", "\uF722"], /* Private Use */ + ["\uF723", "\uF723"], /* Private Use */ + ["\uF724", "\uF724"], /* Private Use */ + ["\uF725", "\uF725"], /* Private Use */ + ["\uF726", "\uF726"], /* Private Use */ + ["\uF727", "\uF727"], /* Private Use */ + ["\uF728", "\uF728"], /* Private Use */ + ["\uF729", "\uF729"], /* Private Use */ + ["\uF72A", "\uF72A"], /* Private Use */ + ["\uF72B", "\uF72B"], /* Private Use */ + ["\uF72C", "\uF72C"], /* Private Use */ + ["\uF72D", "\uF72D"], /* Private Use */ + ["\uF72E", "\uF72E"], /* Private Use */ + ["\uF72F", "\uF72F"], /* Private Use */ + ["\uF730", "\uF730"], /* Private Use */ + ["\uF731", "\uF731"], /* Private Use */ + ["\uF732", "\uF732"], /* Private Use */ + ["\uF733", "\uF733"], /* Private Use */ + ["\uF734", "\uF734"], /* Private Use */ + ["\uF735", "\uF735"], /* Private Use */ + ["\uF736", "\uF736"], /* Private Use */ + ["\uF737", "\uF737"], /* Private Use */ + ["\uF738", "\uF738"], /* Private Use */ + ["\uF739", "\uF739"], /* Private Use */ + ["\uF73A", "\uF73A"], /* Private Use */ + ["\uF73B", "\uF73B"], /* Private Use */ + ["\uF73C", "\uF73C"], /* Private Use */ + ["\uF73D", "\uF73D"], /* Private Use */ + ["\uF73E", "\uF73E"], /* Private Use */ + ["\uF73F", "\uF73F"], /* Private Use */ + ["\uF740", "\uF740"], /* Private Use */ + ["\uF741", "\uF741"], /* Private Use */ + ["\uF742", "\uF742"], /* Private Use */ + ["\uF743", "\uF743"], /* Private Use */ + ["\uF744", "\uF744"], /* Private Use */ + ["\uF745", "\uF745"], /* Private Use */ + ["\uF746", "\uF746"], /* Private Use */ + ["\uF747", "\uF747"], /* Private Use */ + ["\uF748", "\uF748"], /* Private Use */ + ["\uF749", "\uF749"], /* Private Use */ + ["\uF74A", "\uF74A"], /* Private Use */ + ["\uF74B", "\uF74B"], /* Private Use */ + ["\uF74C", "\uF74C"], /* Private Use */ + ["\uF74D", "\uF74D"], /* Private Use */ + ["\uF74E", "\uF74E"], /* Private Use */ + ["\uF74F", "\uF74F"], /* Private Use */ + ["\uF750", "\uF750"], /* Private Use */ + ["\uF751", "\uF751"], /* Private Use */ + ["\uF752", "\uF752"], /* Private Use */ + ["\uF753", "\uF753"], /* Private Use */ + ["\uF754", "\uF754"], /* Private Use */ + ["\uF755", "\uF755"], /* Private Use */ + ["\uF756", "\uF756"], /* Private Use */ + ["\uF757", "\uF757"], /* Private Use */ + ["\uF758", "\uF758"], /* Private Use */ + ["\uF759", "\uF759"], /* Private Use */ + ["\uF75A", "\uF75A"], /* Private Use */ + ["\uF75B", "\uF75B"], /* Private Use */ + ["\uF75C", "\uF75C"], /* Private Use */ + ["\uF75D", "\uF75D"], /* Private Use */ + ["\uF75E", "\uF75E"], /* Private Use */ + ["\uF75F", "\uF75F"], /* Private Use */ + ["\uF760", "\uF760"], /* Private Use */ + ["\uF761", "\uF761"], /* Private Use */ + ["\uF762", "\uF762"], /* Private Use */ + ["\uF763", "\uF763"], /* Private Use */ + ["\uF764", "\uF764"], /* Private Use */ + ["\uF765", "\uF765"], /* Private Use */ + ["\uF766", "\uF766"], /* Private Use */ + ["\uF767", "\uF767"], /* Private Use */ + ["\uF768", "\uF768"], /* Private Use */ + ["\uF769", "\uF769"], /* Private Use */ + ["\uF76A", "\uF76A"], /* Private Use */ + ["\uF76B", "\uF76B"], /* Private Use */ + ["\uF76C", "\uF76C"], /* Private Use */ + ["\uF76D", "\uF76D"], /* Private Use */ + ["\uF76E", "\uF76E"], /* Private Use */ + ["\uF76F", "\uF76F"], /* Private Use */ + ["\uF770", "\uF770"], /* Private Use */ + ["\uF771", "\uF771"], /* Private Use */ + ["\uF772", "\uF772"], /* Private Use */ + ["\uF773", "\uF773"], /* Private Use */ + ["\uF774", "\uF774"], /* Private Use */ + ["\uF775", "\uF775"], /* Private Use */ + ["\uF776", "\uF776"], /* Private Use */ + ["\uF777", "\uF777"], /* Private Use */ + ["\uF778", "\uF778"], /* Private Use */ + ["\uF779", "\uF779"], /* Private Use */ + ["\uF77A", "\uF77A"], /* Private Use */ + ["\uF77B", "\uF77B"], /* Private Use */ + ["\uF77C", "\uF77C"], /* Private Use */ + ["\uF77D", "\uF77D"], /* Private Use */ + ["\uF77E", "\uF77E"], /* Private Use */ + ["\uF77F", "\uF77F"], /* Private Use */ + ["\uF780", "\uF780"], /* Private Use */ + ["\uF781", "\uF781"], /* Private Use */ + ["\uF782", "\uF782"], /* Private Use */ + ["\uF783", "\uF783"], /* Private Use */ + ["\uF784", "\uF784"], /* Private Use */ + ["\uF785", "\uF785"], /* Private Use */ + ["\uF786", "\uF786"], /* Private Use */ + ["\uF787", "\uF787"], /* Private Use */ + ["\uF788", "\uF788"], /* Private Use */ + ["\uF789", "\uF789"], /* Private Use */ + ["\uF78A", "\uF78A"], /* Private Use */ + ["\uF78B", "\uF78B"], /* Private Use */ + ["\uF78C", "\uF78C"], /* Private Use */ + ["\uF78D", "\uF78D"], /* Private Use */ + ["\uF78E", "\uF78E"], /* Private Use */ + ["\uF78F", "\uF78F"], /* Private Use */ + ["\uF790", "\uF790"], /* Private Use */ + ["\uF791", "\uF791"], /* Private Use */ + ["\uF792", "\uF792"], /* Private Use */ + ["\uF793", "\uF793"], /* Private Use */ + ["\uF794", "\uF794"], /* Private Use */ + ["\uF795", "\uF795"], /* Private Use */ + ["\uF796", "\uF796"], /* Private Use */ + ["\uF797", "\uF797"], /* Private Use */ + ["\uF798", "\uF798"], /* Private Use */ + ["\uF799", "\uF799"], /* Private Use */ + ["\uF79A", "\uF79A"], /* Private Use */ + ["\uF79B", "\uF79B"], /* Private Use */ + ["\uF79C", "\uF79C"], /* Private Use */ + ["\uF79D", "\uF79D"], /* Private Use */ + ["\uF79E", "\uF79E"], /* Private Use */ + ["\uF79F", "\uF79F"], /* Private Use */ + ["\uF7A0", "\uF7A0"], /* Private Use */ + ["\uF7A1", "\uF7A1"], /* Private Use */ + ["\uF7A2", "\uF7A2"], /* Private Use */ + ["\uF7A3", "\uF7A3"], /* Private Use */ + ["\uF7A4", "\uF7A4"], /* Private Use */ + ["\uF7A5", "\uF7A5"], /* Private Use */ + ["\uF7A6", "\uF7A6"], /* Private Use */ + ["\uF7A7", "\uF7A7"], /* Private Use */ + ["\uF7A8", "\uF7A8"], /* Private Use */ + ["\uF7A9", "\uF7A9"], /* Private Use */ + ["\uF7AA", "\uF7AA"], /* Private Use */ + ["\uF7AB", "\uF7AB"], /* Private Use */ + ["\uF7AC", "\uF7AC"], /* Private Use */ + ["\uF7AD", "\uF7AD"], /* Private Use */ + ["\uF7AE", "\uF7AE"], /* Private Use */ + ["\uF7AF", "\uF7AF"], /* Private Use */ + ["\uF7B0", "\uF7B0"], /* Private Use */ + ["\uF7B1", "\uF7B1"], /* Private Use */ + ["\uF7B2", "\uF7B2"], /* Private Use */ + ["\uF7B3", "\uF7B3"], /* Private Use */ + ["\uF7B4", "\uF7B4"], /* Private Use */ + ["\uF7B5", "\uF7B5"], /* Private Use */ + ["\uF7B6", "\uF7B6"], /* Private Use */ + ["\uF7B7", "\uF7B7"], /* Private Use */ + ["\uF7B8", "\uF7B8"], /* Private Use */ + ["\uF7B9", "\uF7B9"], /* Private Use */ + ["\uF7BA", "\uF7BA"], /* Private Use */ + ["\uF7BB", "\uF7BB"], /* Private Use */ + ["\uF7BC", "\uF7BC"], /* Private Use */ + ["\uF7BD", "\uF7BD"], /* Private Use */ + ["\uF7BE", "\uF7BE"], /* Private Use */ + ["\uF7BF", "\uF7BF"], /* Private Use */ + ["\uF7C0", "\uF7C0"], /* Private Use */ + ["\uF7C1", "\uF7C1"], /* Private Use */ + ["\uF7C2", "\uF7C2"], /* Private Use */ + ["\uF7C3", "\uF7C3"], /* Private Use */ + ["\uF7C4", "\uF7C4"], /* Private Use */ + ["\uF7C5", "\uF7C5"], /* Private Use */ + ["\uF7C6", "\uF7C6"], /* Private Use */ + ["\uF7C7", "\uF7C7"], /* Private Use */ + ["\uF7C8", "\uF7C8"], /* Private Use */ + ["\uF7C9", "\uF7C9"], /* Private Use */ + ["\uF7CA", "\uF7CA"], /* Private Use */ + ["\uF7CB", "\uF7CB"], /* Private Use */ + ["\uF7CC", "\uF7CC"], /* Private Use */ + ["\uF7CD", "\uF7CD"], /* Private Use */ + ["\uF7CE", "\uF7CE"], /* Private Use */ + ["\uF7CF", "\uF7CF"], /* Private Use */ + ["\uF7D0", "\uF7D0"], /* Private Use */ + ["\uF7D1", "\uF7D1"], /* Private Use */ + ["\uF7D2", "\uF7D2"], /* Private Use */ + ["\uF7D3", "\uF7D3"], /* Private Use */ + ["\uF7D4", "\uF7D4"], /* Private Use */ + ["\uF7D5", "\uF7D5"], /* Private Use */ + ["\uF7D6", "\uF7D6"], /* Private Use */ + ["\uF7D7", "\uF7D7"], /* Private Use */ + ["\uF7D8", "\uF7D8"], /* Private Use */ + ["\uF7D9", "\uF7D9"], /* Private Use */ + ["\uF7DA", "\uF7DA"], /* Private Use */ + ["\uF7DB", "\uF7DB"], /* Private Use */ + ["\uF7DC", "\uF7DC"], /* Private Use */ + ["\uF7DD", "\uF7DD"], /* Private Use */ + ["\uF7DE", "\uF7DE"], /* Private Use */ + ["\uF7DF", "\uF7DF"], /* Private Use */ + ["\uF7E0", "\uF7E0"], /* Private Use */ + ["\uF7E1", "\uF7E1"], /* Private Use */ + ["\uF7E2", "\uF7E2"], /* Private Use */ + ["\uF7E3", "\uF7E3"], /* Private Use */ + ["\uF7E4", "\uF7E4"], /* Private Use */ + ["\uF7E5", "\uF7E5"], /* Private Use */ + ["\uF7E6", "\uF7E6"], /* Private Use */ + ["\uF7E7", "\uF7E7"], /* Private Use */ + ["\uF7E8", "\uF7E8"], /* Private Use */ + ["\uF7E9", "\uF7E9"], /* Private Use */ + ["\uF7EA", "\uF7EA"], /* Private Use */ + ["\uF7EB", "\uF7EB"], /* Private Use */ + ["\uF7EC", "\uF7EC"], /* Private Use */ + ["\uF7ED", "\uF7ED"], /* Private Use */ + ["\uF7EE", "\uF7EE"], /* Private Use */ + ["\uF7EF", "\uF7EF"], /* Private Use */ + ["\uF7F0", "\uF7F0"], /* Private Use */ + ["\uF7F1", "\uF7F1"], /* Private Use */ + ["\uF7F2", "\uF7F2"], /* Private Use */ + ["\uF7F3", "\uF7F3"], /* Private Use */ + ["\uF7F4", "\uF7F4"], /* Private Use */ + ["\uF7F5", "\uF7F5"], /* Private Use */ + ["\uF7F6", "\uF7F6"], /* Private Use */ + ["\uF7F7", "\uF7F7"], /* Private Use */ + ["\uF7F8", "\uF7F8"], /* Private Use */ + ["\uF7F9", "\uF7F9"], /* Private Use */ + ["\uF7FA", "\uF7FA"], /* Private Use */ + ["\uF7FB", "\uF7FB"], /* Private Use */ + ["\uF7FC", "\uF7FC"], /* Private Use */ + ["\uF7FD", "\uF7FD"], /* Private Use */ + ["\uF7FE", "\uF7FE"], /* Private Use */ + ["\uF7FF", "\uF7FF"], /* Private Use */ + ["\uF800", "\uF800"], /* Private Use */ + ["\uF801", "\uF801"], /* Private Use */ + ["\uF802", "\uF802"], /* Private Use */ + ["\uF803", "\uF803"], /* Private Use */ + ["\uF804", "\uF804"], /* Private Use */ + ["\uF805", "\uF805"], /* Private Use */ + ["\uF806", "\uF806"], /* Private Use */ + ["\uF807", "\uF807"], /* Private Use */ + ["\uF808", "\uF808"], /* Private Use */ + ["\uF809", "\uF809"], /* Private Use */ + ["\uF80A", "\uF80A"], /* Private Use */ + ["\uF80B", "\uF80B"], /* Private Use */ + ["\uF80C", "\uF80C"], /* Private Use */ + ["\uF80D", "\uF80D"], /* Private Use */ + ["\uF80E", "\uF80E"], /* Private Use */ + ["\uF80F", "\uF80F"], /* Private Use */ + ["\uF810", "\uF810"], /* Private Use */ + ["\uF811", "\uF811"], /* Private Use */ + ["\uF812", "\uF812"], /* Private Use */ + ["\uF813", "\uF813"], /* Private Use */ + ["\uF814", "\uF814"], /* Private Use */ + ["\uF815", "\uF815"], /* Private Use */ + ["\uF816", "\uF816"], /* Private Use */ + ["\uF817", "\uF817"], /* Private Use */ + ["\uF818", "\uF818"], /* Private Use */ + ["\uF819", "\uF819"], /* Private Use */ + ["\uF81A", "\uF81A"], /* Private Use */ + ["\uF81B", "\uF81B"], /* Private Use */ + ["\uF81C", "\uF81C"], /* Private Use */ + ["\uF81D", "\uF81D"], /* Private Use */ + ["\uF81E", "\uF81E"], /* Private Use */ + ["\uF81F", "\uF81F"], /* Private Use */ + ["\uF820", "\uF820"], /* Private Use */ + ["\uF821", "\uF821"], /* Private Use */ + ["\uF822", "\uF822"], /* Private Use */ + ["\uF823", "\uF823"], /* Private Use */ + ["\uF824", "\uF824"], /* Private Use */ + ["\uF825", "\uF825"], /* Private Use */ + ["\uF826", "\uF826"], /* Private Use */ + ["\uF827", "\uF827"], /* Private Use */ + ["\uF828", "\uF828"], /* Private Use */ + ["\uF829", "\uF829"], /* Private Use */ + ["\uF82A", "\uF82A"], /* Private Use */ + ["\uF82B", "\uF82B"], /* Private Use */ + ["\uF82C", "\uF82C"], /* Private Use */ + ["\uF82D", "\uF82D"], /* Private Use */ + ["\uF82E", "\uF82E"], /* Private Use */ + ["\uF82F", "\uF82F"], /* Private Use */ + ["\uF830", "\uF830"], /* Private Use */ + ["\uF831", "\uF831"], /* Private Use */ + ["\uF832", "\uF832"], /* Private Use */ + ["\uF833", "\uF833"], /* Private Use */ + ["\uF834", "\uF834"], /* Private Use */ + ["\uF835", "\uF835"], /* Private Use */ + ["\uF836", "\uF836"], /* Private Use */ + ["\uF837", "\uF837"], /* Private Use */ + ["\uF838", "\uF838"], /* Private Use */ + ["\uF839", "\uF839"], /* Private Use */ + ["\uF83A", "\uF83A"], /* Private Use */ + ["\uF83B", "\uF83B"], /* Private Use */ + ["\uF83C", "\uF83C"], /* Private Use */ + ["\uF83D", "\uF83D"], /* Private Use */ + ["\uF83E", "\uF83E"], /* Private Use */ + ["\uF83F", "\uF83F"], /* Private Use */ + ["\uF840", "\uF840"], /* Private Use */ + ["\uF841", "\uF841"], /* Private Use */ + ["\uF842", "\uF842"], /* Private Use */ + ["\uF843", "\uF843"], /* Private Use */ + ["\uF844", "\uF844"], /* Private Use */ + ["\uF845", "\uF845"], /* Private Use */ + ["\uF846", "\uF846"], /* Private Use */ + ["\uF847", "\uF847"], /* Private Use */ + ["\uF848", "\uF848"], /* Private Use */ + ["\uF849", "\uF849"], /* Private Use */ + ["\uF84A", "\uF84A"], /* Private Use */ + ["\uF84B", "\uF84B"], /* Private Use */ + ["\uF84C", "\uF84C"], /* Private Use */ + ["\uF84D", "\uF84D"], /* Private Use */ + ["\uF84E", "\uF84E"], /* Private Use */ + ["\uF84F", "\uF84F"], /* Private Use */ + ["\uF850", "\uF850"], /* Private Use */ + ["\uF851", "\uF851"], /* Private Use */ + ["\uF852", "\uF852"], /* Private Use */ + ["\uF853", "\uF853"], /* Private Use */ + ["\uF854", "\uF854"], /* Private Use */ + ["\uF855", "\uF855"], /* Private Use */ + ["\uF856", "\uF856"], /* Private Use */ + ["\uF857", "\uF857"], /* Private Use */ + ["\uF858", "\uF858"], /* Private Use */ + ["\uF859", "\uF859"], /* Private Use */ + ["\uF85A", "\uF85A"], /* Private Use */ + ["\uF85B", "\uF85B"], /* Private Use */ + ["\uF85C", "\uF85C"], /* Private Use */ + ["\uF85D", "\uF85D"], /* Private Use */ + ["\uF85E", "\uF85E"], /* Private Use */ + ["\uF85F", "\uF85F"], /* Private Use */ + ["\uF860", "\uF860"], /* Private Use */ + ["\uF861", "\uF861"], /* Private Use */ + ["\uF862", "\uF862"], /* Private Use */ + ["\uF863", "\uF863"], /* Private Use */ + ["\uF864", "\uF864"], /* Private Use */ + ["\uF865", "\uF865"], /* Private Use */ + ["\uF866", "\uF866"], /* Private Use */ + ["\uF867", "\uF867"], /* Private Use */ + ["\uF868", "\uF868"], /* Private Use */ + ["\uF869", "\uF869"], /* Private Use */ + ["\uF86A", "\uF86A"], /* Private Use */ + ["\uF86B", "\uF86B"], /* Private Use */ + ["\uF86C", "\uF86C"], /* Private Use */ + ["\uF86D", "\uF86D"], /* Private Use */ + ["\uF86E", "\uF86E"], /* Private Use */ + ["\uF86F", "\uF86F"], /* Private Use */ + ["\uF870", "\uF870"], /* Private Use */ + ["\uF871", "\uF871"], /* Private Use */ + ["\uF872", "\uF872"], /* Private Use */ + ["\uF873", "\uF873"], /* Private Use */ + ["\uF874", "\uF874"], /* Private Use */ + ["\uF875", "\uF875"], /* Private Use */ + ["\uF876", "\uF876"], /* Private Use */ + ["\uF877", "\uF877"], /* Private Use */ + ["\uF878", "\uF878"], /* Private Use */ + ["\uF879", "\uF879"], /* Private Use */ + ["\uF87A", "\uF87A"], /* Private Use */ + ["\uF87B", "\uF87B"], /* Private Use */ + ["\uF87C", "\uF87C"], /* Private Use */ + ["\uF87D", "\uF87D"], /* Private Use */ + ["\uF87E", "\uF87E"], /* Private Use */ + ["\uF87F", "\uF87F"], /* Private Use */ + ["\uF880", "\uF880"], /* Private Use */ + ["\uF881", "\uF881"], /* Private Use */ + ["\uF882", "\uF882"], /* Private Use */ + ["\uF883", "\uF883"], /* Private Use */ + ["\uF884", "\uF884"], /* Private Use */ + ["\uF885", "\uF885"], /* Private Use */ + ["\uF886", "\uF886"], /* Private Use */ + ["\uF887", "\uF887"], /* Private Use */ + ["\uF888", "\uF888"], /* Private Use */ + ["\uF889", "\uF889"], /* Private Use */ + ["\uF88A", "\uF88A"], /* Private Use */ + ["\uF88B", "\uF88B"], /* Private Use */ + ["\uF88C", "\uF88C"], /* Private Use */ + ["\uF88D", "\uF88D"], /* Private Use */ + ["\uF88E", "\uF88E"], /* Private Use */ + ["\uF88F", "\uF88F"], /* Private Use */ + ["\uF890", "\uF890"], /* Private Use */ + ["\uF891", "\uF891"], /* Private Use */ + ["\uF892", "\uF892"], /* Private Use */ + ["\uF893", "\uF893"], /* Private Use */ + ["\uF894", "\uF894"], /* Private Use */ + ["\uF895", "\uF895"], /* Private Use */ + ["\uF896", "\uF896"], /* Private Use */ + ["\uF897", "\uF897"], /* Private Use */ + ["\uF898", "\uF898"], /* Private Use */ + ["\uF899", "\uF899"], /* Private Use */ + ["\uF89A", "\uF89A"], /* Private Use */ + ["\uF89B", "\uF89B"], /* Private Use */ + ["\uF89C", "\uF89C"], /* Private Use */ + ["\uF89D", "\uF89D"], /* Private Use */ + ["\uF89E", "\uF89E"], /* Private Use */ + ["\uF89F", "\uF89F"], /* Private Use */ + ["\uF8A0", "\uF8A0"], /* Private Use */ + ["\uF8A1", "\uF8A1"], /* Private Use */ + ["\uF8A2", "\uF8A2"], /* Private Use */ + ["\uF8A3", "\uF8A3"], /* Private Use */ + ["\uF8A4", "\uF8A4"], /* Private Use */ + ["\uF8A5", "\uF8A5"], /* Private Use */ + ["\uF8A6", "\uF8A6"], /* Private Use */ + ["\uF8A7", "\uF8A7"], /* Private Use */ + ["\uF8A8", "\uF8A8"], /* Private Use */ + ["\uF8A9", "\uF8A9"], /* Private Use */ + ["\uF8AA", "\uF8AA"], /* Private Use */ + ["\uF8AB", "\uF8AB"], /* Private Use */ + ["\uF8AC", "\uF8AC"], /* Private Use */ + ["\uF8AD", "\uF8AD"], /* Private Use */ + ["\uF8AE", "\uF8AE"], /* Private Use */ + ["\uF8AF", "\uF8AF"], /* Private Use */ + ["\uF8B0", "\uF8B0"], /* Private Use */ + ["\uF8B1", "\uF8B1"], /* Private Use */ + ["\uF8B2", "\uF8B2"], /* Private Use */ + ["\uF8B3", "\uF8B3"], /* Private Use */ + ["\uF8B4", "\uF8B4"], /* Private Use */ + ["\uF8B5", "\uF8B5"], /* Private Use */ + ["\uF8B6", "\uF8B6"], /* Private Use */ + ["\uF8B7", "\uF8B7"], /* Private Use */ + ["\uF8B8", "\uF8B8"], /* Private Use */ + ["\uF8B9", "\uF8B9"], /* Private Use */ + ["\uF8BA", "\uF8BA"], /* Private Use */ + ["\uF8BB", "\uF8BB"], /* Private Use */ + ["\uF8BC", "\uF8BC"], /* Private Use */ + ["\uF8BD", "\uF8BD"], /* Private Use */ + ["\uF8BE", "\uF8BE"], /* Private Use */ + ["\uF8BF", "\uF8BF"], /* Private Use */ + ["\uF8C0", "\uF8C0"], /* Private Use */ + ["\uF8C1", "\uF8C1"], /* Private Use */ + ["\uF8C2", "\uF8C2"], /* Private Use */ + ["\uF8C3", "\uF8C3"], /* Private Use */ + ["\uF8C4", "\uF8C4"], /* Private Use */ + ["\uF8C5", "\uF8C5"], /* Private Use */ + ["\uF8C6", "\uF8C6"], /* Private Use */ + ["\uF8C7", "\uF8C7"], /* Private Use */ + ["\uF8C8", "\uF8C8"], /* Private Use */ + ["\uF8C9", "\uF8C9"], /* Private Use */ + ["\uF8CA", "\uF8CA"], /* Private Use */ + ["\uF8CB", "\uF8CB"], /* Private Use */ + ["\uF8CC", "\uF8CC"], /* Private Use */ + ["\uF8CD", "\uF8CD"], /* Private Use */ + ["\uF8CE", "\uF8CE"], /* Private Use */ + ["\uF8CF", "\uF8CF"], /* Private Use */ + ["\uF8D0", "\uF8D0"], /* Private Use */ + ["\uF8D1", "\uF8D1"], /* Private Use */ + ["\uF8D2", "\uF8D2"], /* Private Use */ + ["\uF8D3", "\uF8D3"], /* Private Use */ + ["\uF8D4", "\uF8D4"], /* Private Use */ + ["\uF8D5", "\uF8D5"], /* Private Use */ + ["\uF8D6", "\uF8D6"], /* Private Use */ + ["\uF8D7", "\uF8D7"], /* Private Use */ + ["\uF8D8", "\uF8D8"], /* Private Use */ + ["\uF8D9", "\uF8D9"], /* Private Use */ + ["\uF8DA", "\uF8DA"], /* Private Use */ + ["\uF8DB", "\uF8DB"], /* Private Use */ + ["\uF8DC", "\uF8DC"], /* Private Use */ + ["\uF8DD", "\uF8DD"], /* Private Use */ + ["\uF8DE", "\uF8DE"], /* Private Use */ + ["\uF8DF", "\uF8DF"], /* Private Use */ + ["\uF8E0", "\uF8E0"], /* Private Use */ + ["\uF8E1", "\uF8E1"], /* Private Use */ + ["\uF8E2", "\uF8E2"], /* Private Use */ + ["\uF8E3", "\uF8E3"], /* Private Use */ + ["\uF8E4", "\uF8E4"], /* Private Use */ + ["\uF8E5", "\uF8E5"], /* Private Use */ + ["\uF8E6", "\uF8E6"], /* Private Use */ + ["\uF8E7", "\uF8E7"], /* Private Use */ + ["\uF8E8", "\uF8E8"], /* Private Use */ + ["\uF8E9", "\uF8E9"], /* Private Use */ + ["\uF8EA", "\uF8EA"], /* Private Use */ + ["\uF8EB", "\uF8EB"], /* Private Use */ + ["\uF8EC", "\uF8EC"], /* Private Use */ + ["\uF8ED", "\uF8ED"], /* Private Use */ + ["\uF8EE", "\uF8EE"], /* Private Use */ + ["\uF8EF", "\uF8EF"], /* Private Use */ + ["\uF8F0", "\uF8F0"], /* Private Use */ + ["\uF8F1", "\uF8F1"], /* Private Use */ + ["\uF8F2", "\uF8F2"], /* Private Use */ + ["\uF8F3", "\uF8F3"], /* Private Use */ + ["\uF8F4", "\uF8F4"], /* Private Use */ + ["\uF8F5", "\uF8F5"], /* Private Use */ + ["\uF8F6", "\uF8F6"], /* Private Use */ + ["\uF8F7", "\uF8F7"], /* Private Use */ + ["\uF8F8", "\uF8F8"], /* Private Use */ + ["\uF8F9", "\uF8F9"], /* Private Use */ + ["\uF8FA", "\uF8FA"], /* Private Use */ + ["\uF8FB", "\uF8FB"], /* Private Use */ + ["\uF8FC", "\uF8FC"], /* Private Use */ + ["\uF8FD", "\uF8FD"], /* Private Use */ + ["\uF8FE", "\uF8FE"], /* Private Use */ + ["\uF8FF", "\uF8FF"], /* Private Use */ + ["\uF900", "\uF900"], /* CJK COMPATIBILITY IDEOGRAPH-F900 */ + ["\uF901", "\uF901"], /* CJK COMPATIBILITY IDEOGRAPH-F901 */ + ["\uF902", "\uF902"], /* CJK COMPATIBILITY IDEOGRAPH-F902 */ + ["\uF903", "\uF903"], /* CJK COMPATIBILITY IDEOGRAPH-F903 */ + ["\uF904", "\uF904"], /* CJK COMPATIBILITY IDEOGRAPH-F904 */ + ["\uF905", "\uF905"], /* CJK COMPATIBILITY IDEOGRAPH-F905 */ + ["\uF906", "\uF906"], /* CJK COMPATIBILITY IDEOGRAPH-F906 */ + ["\uF907", "\uF907"], /* CJK COMPATIBILITY IDEOGRAPH-F907 */ + ["\uF908", "\uF908"], /* CJK COMPATIBILITY IDEOGRAPH-F908 */ + ["\uF909", "\uF909"], /* CJK COMPATIBILITY IDEOGRAPH-F909 */ + ["\uF90A", "\uF90A"], /* CJK COMPATIBILITY IDEOGRAPH-F90A */ + ["\uF90B", "\uF90B"], /* CJK COMPATIBILITY IDEOGRAPH-F90B */ + ["\uF90C", "\uF90C"], /* CJK COMPATIBILITY IDEOGRAPH-F90C */ + ["\uF90D", "\uF90D"], /* CJK COMPATIBILITY IDEOGRAPH-F90D */ + ["\uF90E", "\uF90E"], /* CJK COMPATIBILITY IDEOGRAPH-F90E */ + ["\uF90F", "\uF90F"], /* CJK COMPATIBILITY IDEOGRAPH-F90F */ + ["\uF910", "\uF910"], /* CJK COMPATIBILITY IDEOGRAPH-F910 */ + ["\uF911", "\uF911"], /* CJK COMPATIBILITY IDEOGRAPH-F911 */ + ["\uF912", "\uF912"], /* CJK COMPATIBILITY IDEOGRAPH-F912 */ + ["\uF913", "\uF913"], /* CJK COMPATIBILITY IDEOGRAPH-F913 */ + ["\uF914", "\uF914"], /* CJK COMPATIBILITY IDEOGRAPH-F914 */ + ["\uF915", "\uF915"], /* CJK COMPATIBILITY IDEOGRAPH-F915 */ + ["\uF916", "\uF916"], /* CJK COMPATIBILITY IDEOGRAPH-F916 */ + ["\uF917", "\uF917"], /* CJK COMPATIBILITY IDEOGRAPH-F917 */ + ["\uF918", "\uF918"], /* CJK COMPATIBILITY IDEOGRAPH-F918 */ + ["\uF919", "\uF919"], /* CJK COMPATIBILITY IDEOGRAPH-F919 */ + ["\uF91A", "\uF91A"], /* CJK COMPATIBILITY IDEOGRAPH-F91A */ + ["\uF91B", "\uF91B"], /* CJK COMPATIBILITY IDEOGRAPH-F91B */ + ["\uF91C", "\uF91C"], /* CJK COMPATIBILITY IDEOGRAPH-F91C */ + ["\uF91D", "\uF91D"], /* CJK COMPATIBILITY IDEOGRAPH-F91D */ + ["\uF91E", "\uF91E"], /* CJK COMPATIBILITY IDEOGRAPH-F91E */ + ["\uF91F", "\uF91F"], /* CJK COMPATIBILITY IDEOGRAPH-F91F */ + ["\uF920", "\uF920"], /* CJK COMPATIBILITY IDEOGRAPH-F920 */ + ["\uF921", "\uF921"], /* CJK COMPATIBILITY IDEOGRAPH-F921 */ + ["\uF922", "\uF922"], /* CJK COMPATIBILITY IDEOGRAPH-F922 */ + ["\uF923", "\uF923"], /* CJK COMPATIBILITY IDEOGRAPH-F923 */ + ["\uF924", "\uF924"], /* CJK COMPATIBILITY IDEOGRAPH-F924 */ + ["\uF925", "\uF925"], /* CJK COMPATIBILITY IDEOGRAPH-F925 */ + ["\uF926", "\uF926"], /* CJK COMPATIBILITY IDEOGRAPH-F926 */ + ["\uF927", "\uF927"], /* CJK COMPATIBILITY IDEOGRAPH-F927 */ + ["\uF928", "\uF928"], /* CJK COMPATIBILITY IDEOGRAPH-F928 */ + ["\uF929", "\uF929"], /* CJK COMPATIBILITY IDEOGRAPH-F929 */ + ["\uF92A", "\uF92A"], /* CJK COMPATIBILITY IDEOGRAPH-F92A */ + ["\uF92B", "\uF92B"], /* CJK COMPATIBILITY IDEOGRAPH-F92B */ + ["\uF92C", "\uF92C"], /* CJK COMPATIBILITY IDEOGRAPH-F92C */ + ["\uF92D", "\uF92D"], /* CJK COMPATIBILITY IDEOGRAPH-F92D */ + ["\uF92E", "\uF92E"], /* CJK COMPATIBILITY IDEOGRAPH-F92E */ + ["\uF92F", "\uF92F"], /* CJK COMPATIBILITY IDEOGRAPH-F92F */ + ["\uF930", "\uF930"], /* CJK COMPATIBILITY IDEOGRAPH-F930 */ + ["\uF931", "\uF931"], /* CJK COMPATIBILITY IDEOGRAPH-F931 */ + ["\uF932", "\uF932"], /* CJK COMPATIBILITY IDEOGRAPH-F932 */ + ["\uF933", "\uF933"], /* CJK COMPATIBILITY IDEOGRAPH-F933 */ + ["\uF934", "\uF934"], /* CJK COMPATIBILITY IDEOGRAPH-F934 */ + ["\uF935", "\uF935"], /* CJK COMPATIBILITY IDEOGRAPH-F935 */ + ["\uF936", "\uF936"], /* CJK COMPATIBILITY IDEOGRAPH-F936 */ + ["\uF937", "\uF937"], /* CJK COMPATIBILITY IDEOGRAPH-F937 */ + ["\uF938", "\uF938"], /* CJK COMPATIBILITY IDEOGRAPH-F938 */ + ["\uF939", "\uF939"], /* CJK COMPATIBILITY IDEOGRAPH-F939 */ + ["\uF93A", "\uF93A"], /* CJK COMPATIBILITY IDEOGRAPH-F93A */ + ["\uF93B", "\uF93B"], /* CJK COMPATIBILITY IDEOGRAPH-F93B */ + ["\uF93C", "\uF93C"], /* CJK COMPATIBILITY IDEOGRAPH-F93C */ + ["\uF93D", "\uF93D"], /* CJK COMPATIBILITY IDEOGRAPH-F93D */ + ["\uF93E", "\uF93E"], /* CJK COMPATIBILITY IDEOGRAPH-F93E */ + ["\uF93F", "\uF93F"], /* CJK COMPATIBILITY IDEOGRAPH-F93F */ + ["\uF940", "\uF940"], /* CJK COMPATIBILITY IDEOGRAPH-F940 */ + ["\uF941", "\uF941"], /* CJK COMPATIBILITY IDEOGRAPH-F941 */ + ["\uF942", "\uF942"], /* CJK COMPATIBILITY IDEOGRAPH-F942 */ + ["\uF943", "\uF943"], /* CJK COMPATIBILITY IDEOGRAPH-F943 */ + ["\uF944", "\uF944"], /* CJK COMPATIBILITY IDEOGRAPH-F944 */ + ["\uF945", "\uF945"], /* CJK COMPATIBILITY IDEOGRAPH-F945 */ + ["\uF946", "\uF946"], /* CJK COMPATIBILITY IDEOGRAPH-F946 */ + ["\uF947", "\uF947"], /* CJK COMPATIBILITY IDEOGRAPH-F947 */ + ["\uF948", "\uF948"], /* CJK COMPATIBILITY IDEOGRAPH-F948 */ + ["\uF949", "\uF949"], /* CJK COMPATIBILITY IDEOGRAPH-F949 */ + ["\uF94A", "\uF94A"], /* CJK COMPATIBILITY IDEOGRAPH-F94A */ + ["\uF94B", "\uF94B"], /* CJK COMPATIBILITY IDEOGRAPH-F94B */ + ["\uF94C", "\uF94C"], /* CJK COMPATIBILITY IDEOGRAPH-F94C */ + ["\uF94D", "\uF94D"], /* CJK COMPATIBILITY IDEOGRAPH-F94D */ + ["\uF94E", "\uF94E"], /* CJK COMPATIBILITY IDEOGRAPH-F94E */ + ["\uF94F", "\uF94F"], /* CJK COMPATIBILITY IDEOGRAPH-F94F */ + ["\uF950", "\uF950"], /* CJK COMPATIBILITY IDEOGRAPH-F950 */ + ["\uF951", "\uF951"], /* CJK COMPATIBILITY IDEOGRAPH-F951 */ + ["\uF952", "\uF952"], /* CJK COMPATIBILITY IDEOGRAPH-F952 */ + ["\uF953", "\uF953"], /* CJK COMPATIBILITY IDEOGRAPH-F953 */ + ["\uF954", "\uF954"], /* CJK COMPATIBILITY IDEOGRAPH-F954 */ + ["\uF955", "\uF955"], /* CJK COMPATIBILITY IDEOGRAPH-F955 */ + ["\uF956", "\uF956"], /* CJK COMPATIBILITY IDEOGRAPH-F956 */ + ["\uF957", "\uF957"], /* CJK COMPATIBILITY IDEOGRAPH-F957 */ + ["\uF958", "\uF958"], /* CJK COMPATIBILITY IDEOGRAPH-F958 */ + ["\uF959", "\uF959"], /* CJK COMPATIBILITY IDEOGRAPH-F959 */ + ["\uF95A", "\uF95A"], /* CJK COMPATIBILITY IDEOGRAPH-F95A */ + ["\uF95B", "\uF95B"], /* CJK COMPATIBILITY IDEOGRAPH-F95B */ + ["\uF95C", "\uF95C"], /* CJK COMPATIBILITY IDEOGRAPH-F95C */ + ["\uF95D", "\uF95D"], /* CJK COMPATIBILITY IDEOGRAPH-F95D */ + ["\uF95E", "\uF95E"], /* CJK COMPATIBILITY IDEOGRAPH-F95E */ + ["\uF95F", "\uF95F"], /* CJK COMPATIBILITY IDEOGRAPH-F95F */ + ["\uF960", "\uF960"], /* CJK COMPATIBILITY IDEOGRAPH-F960 */ + ["\uF961", "\uF961"], /* CJK COMPATIBILITY IDEOGRAPH-F961 */ + ["\uF962", "\uF962"], /* CJK COMPATIBILITY IDEOGRAPH-F962 */ + ["\uF963", "\uF963"], /* CJK COMPATIBILITY IDEOGRAPH-F963 */ + ["\uF964", "\uF964"], /* CJK COMPATIBILITY IDEOGRAPH-F964 */ + ["\uF965", "\uF965"], /* CJK COMPATIBILITY IDEOGRAPH-F965 */ + ["\uF966", "\uF966"], /* CJK COMPATIBILITY IDEOGRAPH-F966 */ + ["\uF967", "\uF967"], /* CJK COMPATIBILITY IDEOGRAPH-F967 */ + ["\uF968", "\uF968"], /* CJK COMPATIBILITY IDEOGRAPH-F968 */ + ["\uF969", "\uF969"], /* CJK COMPATIBILITY IDEOGRAPH-F969 */ + ["\uF96A", "\uF96A"], /* CJK COMPATIBILITY IDEOGRAPH-F96A */ + ["\uF96B", "\uF96B"], /* CJK COMPATIBILITY IDEOGRAPH-F96B */ + ["\uF96C", "\uF96C"], /* CJK COMPATIBILITY IDEOGRAPH-F96C */ + ["\uF96D", "\uF96D"], /* CJK COMPATIBILITY IDEOGRAPH-F96D */ + ["\uF96E", "\uF96E"], /* CJK COMPATIBILITY IDEOGRAPH-F96E */ + ["\uF96F", "\uF96F"], /* CJK COMPATIBILITY IDEOGRAPH-F96F */ + ["\uF970", "\uF970"], /* CJK COMPATIBILITY IDEOGRAPH-F970 */ + ["\uF971", "\uF971"], /* CJK COMPATIBILITY IDEOGRAPH-F971 */ + ["\uF972", "\uF972"], /* CJK COMPATIBILITY IDEOGRAPH-F972 */ + ["\uF973", "\uF973"], /* CJK COMPATIBILITY IDEOGRAPH-F973 */ + ["\uF974", "\uF974"], /* CJK COMPATIBILITY IDEOGRAPH-F974 */ + ["\uF975", "\uF975"], /* CJK COMPATIBILITY IDEOGRAPH-F975 */ + ["\uF976", "\uF976"], /* CJK COMPATIBILITY IDEOGRAPH-F976 */ + ["\uF977", "\uF977"], /* CJK COMPATIBILITY IDEOGRAPH-F977 */ + ["\uF978", "\uF978"], /* CJK COMPATIBILITY IDEOGRAPH-F978 */ + ["\uF979", "\uF979"], /* CJK COMPATIBILITY IDEOGRAPH-F979 */ + ["\uF97A", "\uF97A"], /* CJK COMPATIBILITY IDEOGRAPH-F97A */ + ["\uF97B", "\uF97B"], /* CJK COMPATIBILITY IDEOGRAPH-F97B */ + ["\uF97C", "\uF97C"], /* CJK COMPATIBILITY IDEOGRAPH-F97C */ + ["\uF97D", "\uF97D"], /* CJK COMPATIBILITY IDEOGRAPH-F97D */ + ["\uF97E", "\uF97E"], /* CJK COMPATIBILITY IDEOGRAPH-F97E */ + ["\uF97F", "\uF97F"], /* CJK COMPATIBILITY IDEOGRAPH-F97F */ + ["\uF980", "\uF980"], /* CJK COMPATIBILITY IDEOGRAPH-F980 */ + ["\uF981", "\uF981"], /* CJK COMPATIBILITY IDEOGRAPH-F981 */ + ["\uF982", "\uF982"], /* CJK COMPATIBILITY IDEOGRAPH-F982 */ + ["\uF983", "\uF983"], /* CJK COMPATIBILITY IDEOGRAPH-F983 */ + ["\uF984", "\uF984"], /* CJK COMPATIBILITY IDEOGRAPH-F984 */ + ["\uF985", "\uF985"], /* CJK COMPATIBILITY IDEOGRAPH-F985 */ + ["\uF986", "\uF986"], /* CJK COMPATIBILITY IDEOGRAPH-F986 */ + ["\uF987", "\uF987"], /* CJK COMPATIBILITY IDEOGRAPH-F987 */ + ["\uF988", "\uF988"], /* CJK COMPATIBILITY IDEOGRAPH-F988 */ + ["\uF989", "\uF989"], /* CJK COMPATIBILITY IDEOGRAPH-F989 */ + ["\uF98A", "\uF98A"], /* CJK COMPATIBILITY IDEOGRAPH-F98A */ + ["\uF98B", "\uF98B"], /* CJK COMPATIBILITY IDEOGRAPH-F98B */ + ["\uF98C", "\uF98C"], /* CJK COMPATIBILITY IDEOGRAPH-F98C */ + ["\uF98D", "\uF98D"], /* CJK COMPATIBILITY IDEOGRAPH-F98D */ + ["\uF98E", "\uF98E"], /* CJK COMPATIBILITY IDEOGRAPH-F98E */ + ["\uF98F", "\uF98F"], /* CJK COMPATIBILITY IDEOGRAPH-F98F */ + ["\uF990", "\uF990"], /* CJK COMPATIBILITY IDEOGRAPH-F990 */ + ["\uF991", "\uF991"], /* CJK COMPATIBILITY IDEOGRAPH-F991 */ + ["\uF992", "\uF992"], /* CJK COMPATIBILITY IDEOGRAPH-F992 */ + ["\uF993", "\uF993"], /* CJK COMPATIBILITY IDEOGRAPH-F993 */ + ["\uF994", "\uF994"], /* CJK COMPATIBILITY IDEOGRAPH-F994 */ + ["\uF995", "\uF995"], /* CJK COMPATIBILITY IDEOGRAPH-F995 */ + ["\uF996", "\uF996"], /* CJK COMPATIBILITY IDEOGRAPH-F996 */ + ["\uF997", "\uF997"], /* CJK COMPATIBILITY IDEOGRAPH-F997 */ + ["\uF998", "\uF998"], /* CJK COMPATIBILITY IDEOGRAPH-F998 */ + ["\uF999", "\uF999"], /* CJK COMPATIBILITY IDEOGRAPH-F999 */ + ["\uF99A", "\uF99A"], /* CJK COMPATIBILITY IDEOGRAPH-F99A */ + ["\uF99B", "\uF99B"], /* CJK COMPATIBILITY IDEOGRAPH-F99B */ + ["\uF99C", "\uF99C"], /* CJK COMPATIBILITY IDEOGRAPH-F99C */ + ["\uF99D", "\uF99D"], /* CJK COMPATIBILITY IDEOGRAPH-F99D */ + ["\uF99E", "\uF99E"], /* CJK COMPATIBILITY IDEOGRAPH-F99E */ + ["\uF99F", "\uF99F"], /* CJK COMPATIBILITY IDEOGRAPH-F99F */ + ["\uF9A0", "\uF9A0"], /* CJK COMPATIBILITY IDEOGRAPH-F9A0 */ + ["\uF9A1", "\uF9A1"], /* CJK COMPATIBILITY IDEOGRAPH-F9A1 */ + ["\uF9A2", "\uF9A2"], /* CJK COMPATIBILITY IDEOGRAPH-F9A2 */ + ["\uF9A3", "\uF9A3"], /* CJK COMPATIBILITY IDEOGRAPH-F9A3 */ + ["\uF9A4", "\uF9A4"], /* CJK COMPATIBILITY IDEOGRAPH-F9A4 */ + ["\uF9A5", "\uF9A5"], /* CJK COMPATIBILITY IDEOGRAPH-F9A5 */ + ["\uF9A6", "\uF9A6"], /* CJK COMPATIBILITY IDEOGRAPH-F9A6 */ + ["\uF9A7", "\uF9A7"], /* CJK COMPATIBILITY IDEOGRAPH-F9A7 */ + ["\uF9A8", "\uF9A8"], /* CJK COMPATIBILITY IDEOGRAPH-F9A8 */ + ["\uF9A9", "\uF9A9"], /* CJK COMPATIBILITY IDEOGRAPH-F9A9 */ + ["\uF9AA", "\uF9AA"], /* CJK COMPATIBILITY IDEOGRAPH-F9AA */ + ["\uF9AB", "\uF9AB"], /* CJK COMPATIBILITY IDEOGRAPH-F9AB */ + ["\uF9AC", "\uF9AC"], /* CJK COMPATIBILITY IDEOGRAPH-F9AC */ + ["\uF9AD", "\uF9AD"], /* CJK COMPATIBILITY IDEOGRAPH-F9AD */ + ["\uF9AE", "\uF9AE"], /* CJK COMPATIBILITY IDEOGRAPH-F9AE */ + ["\uF9AF", "\uF9AF"], /* CJK COMPATIBILITY IDEOGRAPH-F9AF */ + ["\uF9B0", "\uF9B0"], /* CJK COMPATIBILITY IDEOGRAPH-F9B0 */ + ["\uF9B1", "\uF9B1"], /* CJK COMPATIBILITY IDEOGRAPH-F9B1 */ + ["\uF9B2", "\uF9B2"], /* CJK COMPATIBILITY IDEOGRAPH-F9B2 */ + ["\uF9B3", "\uF9B3"], /* CJK COMPATIBILITY IDEOGRAPH-F9B3 */ + ["\uF9B4", "\uF9B4"], /* CJK COMPATIBILITY IDEOGRAPH-F9B4 */ + ["\uF9B5", "\uF9B5"], /* CJK COMPATIBILITY IDEOGRAPH-F9B5 */ + ["\uF9B6", "\uF9B6"], /* CJK COMPATIBILITY IDEOGRAPH-F9B6 */ + ["\uF9B7", "\uF9B7"], /* CJK COMPATIBILITY IDEOGRAPH-F9B7 */ + ["\uF9B8", "\uF9B8"], /* CJK COMPATIBILITY IDEOGRAPH-F9B8 */ + ["\uF9B9", "\uF9B9"], /* CJK COMPATIBILITY IDEOGRAPH-F9B9 */ + ["\uF9BA", "\uF9BA"], /* CJK COMPATIBILITY IDEOGRAPH-F9BA */ + ["\uF9BB", "\uF9BB"], /* CJK COMPATIBILITY IDEOGRAPH-F9BB */ + ["\uF9BC", "\uF9BC"], /* CJK COMPATIBILITY IDEOGRAPH-F9BC */ + ["\uF9BD", "\uF9BD"], /* CJK COMPATIBILITY IDEOGRAPH-F9BD */ + ["\uF9BE", "\uF9BE"], /* CJK COMPATIBILITY IDEOGRAPH-F9BE */ + ["\uF9BF", "\uF9BF"], /* CJK COMPATIBILITY IDEOGRAPH-F9BF */ + ["\uF9C0", "\uF9C0"], /* CJK COMPATIBILITY IDEOGRAPH-F9C0 */ + ["\uF9C1", "\uF9C1"], /* CJK COMPATIBILITY IDEOGRAPH-F9C1 */ + ["\uF9C2", "\uF9C2"], /* CJK COMPATIBILITY IDEOGRAPH-F9C2 */ + ["\uF9C3", "\uF9C3"], /* CJK COMPATIBILITY IDEOGRAPH-F9C3 */ + ["\uF9C4", "\uF9C4"], /* CJK COMPATIBILITY IDEOGRAPH-F9C4 */ + ["\uF9C5", "\uF9C5"], /* CJK COMPATIBILITY IDEOGRAPH-F9C5 */ + ["\uF9C6", "\uF9C6"], /* CJK COMPATIBILITY IDEOGRAPH-F9C6 */ + ["\uF9C7", "\uF9C7"], /* CJK COMPATIBILITY IDEOGRAPH-F9C7 */ + ["\uF9C8", "\uF9C8"], /* CJK COMPATIBILITY IDEOGRAPH-F9C8 */ + ["\uF9C9", "\uF9C9"], /* CJK COMPATIBILITY IDEOGRAPH-F9C9 */ + ["\uF9CA", "\uF9CA"], /* CJK COMPATIBILITY IDEOGRAPH-F9CA */ + ["\uF9CB", "\uF9CB"], /* CJK COMPATIBILITY IDEOGRAPH-F9CB */ + ["\uF9CC", "\uF9CC"], /* CJK COMPATIBILITY IDEOGRAPH-F9CC */ + ["\uF9CD", "\uF9CD"], /* CJK COMPATIBILITY IDEOGRAPH-F9CD */ + ["\uF9CE", "\uF9CE"], /* CJK COMPATIBILITY IDEOGRAPH-F9CE */ + ["\uF9CF", "\uF9CF"], /* CJK COMPATIBILITY IDEOGRAPH-F9CF */ + ["\uF9D0", "\uF9D0"], /* CJK COMPATIBILITY IDEOGRAPH-F9D0 */ + ["\uF9D1", "\uF9D1"], /* CJK COMPATIBILITY IDEOGRAPH-F9D1 */ + ["\uF9D2", "\uF9D2"], /* CJK COMPATIBILITY IDEOGRAPH-F9D2 */ + ["\uF9D3", "\uF9D3"], /* CJK COMPATIBILITY IDEOGRAPH-F9D3 */ + ["\uF9D4", "\uF9D4"], /* CJK COMPATIBILITY IDEOGRAPH-F9D4 */ + ["\uF9D5", "\uF9D5"], /* CJK COMPATIBILITY IDEOGRAPH-F9D5 */ + ["\uF9D6", "\uF9D6"], /* CJK COMPATIBILITY IDEOGRAPH-F9D6 */ + ["\uF9D7", "\uF9D7"], /* CJK COMPATIBILITY IDEOGRAPH-F9D7 */ + ["\uF9D8", "\uF9D8"], /* CJK COMPATIBILITY IDEOGRAPH-F9D8 */ + ["\uF9D9", "\uF9D9"], /* CJK COMPATIBILITY IDEOGRAPH-F9D9 */ + ["\uF9DA", "\uF9DA"], /* CJK COMPATIBILITY IDEOGRAPH-F9DA */ + ["\uF9DB", "\uF9DB"], /* CJK COMPATIBILITY IDEOGRAPH-F9DB */ + ["\uF9DC", "\uF9DC"], /* CJK COMPATIBILITY IDEOGRAPH-F9DC */ + ["\uF9DD", "\uF9DD"], /* CJK COMPATIBILITY IDEOGRAPH-F9DD */ + ["\uF9DE", "\uF9DE"], /* CJK COMPATIBILITY IDEOGRAPH-F9DE */ + ["\uF9DF", "\uF9DF"], /* CJK COMPATIBILITY IDEOGRAPH-F9DF */ + ["\uF9E0", "\uF9E0"], /* CJK COMPATIBILITY IDEOGRAPH-F9E0 */ + ["\uF9E1", "\uF9E1"], /* CJK COMPATIBILITY IDEOGRAPH-F9E1 */ + ["\uF9E2", "\uF9E2"], /* CJK COMPATIBILITY IDEOGRAPH-F9E2 */ + ["\uF9E3", "\uF9E3"], /* CJK COMPATIBILITY IDEOGRAPH-F9E3 */ + ["\uF9E4", "\uF9E4"], /* CJK COMPATIBILITY IDEOGRAPH-F9E4 */ + ["\uF9E5", "\uF9E5"], /* CJK COMPATIBILITY IDEOGRAPH-F9E5 */ + ["\uF9E6", "\uF9E6"], /* CJK COMPATIBILITY IDEOGRAPH-F9E6 */ + ["\uF9E7", "\uF9E7"], /* CJK COMPATIBILITY IDEOGRAPH-F9E7 */ + ["\uF9E8", "\uF9E8"], /* CJK COMPATIBILITY IDEOGRAPH-F9E8 */ + ["\uF9E9", "\uF9E9"], /* CJK COMPATIBILITY IDEOGRAPH-F9E9 */ + ["\uF9EA", "\uF9EA"], /* CJK COMPATIBILITY IDEOGRAPH-F9EA */ + ["\uF9EB", "\uF9EB"], /* CJK COMPATIBILITY IDEOGRAPH-F9EB */ + ["\uF9EC", "\uF9EC"], /* CJK COMPATIBILITY IDEOGRAPH-F9EC */ + ["\uF9ED", "\uF9ED"], /* CJK COMPATIBILITY IDEOGRAPH-F9ED */ + ["\uF9EE", "\uF9EE"], /* CJK COMPATIBILITY IDEOGRAPH-F9EE */ + ["\uF9EF", "\uF9EF"], /* CJK COMPATIBILITY IDEOGRAPH-F9EF */ + ["\uF9F0", "\uF9F0"], /* CJK COMPATIBILITY IDEOGRAPH-F9F0 */ + ["\uF9F1", "\uF9F1"], /* CJK COMPATIBILITY IDEOGRAPH-F9F1 */ + ["\uF9F2", "\uF9F2"], /* CJK COMPATIBILITY IDEOGRAPH-F9F2 */ + ["\uF9F3", "\uF9F3"], /* CJK COMPATIBILITY IDEOGRAPH-F9F3 */ + ["\uF9F4", "\uF9F4"], /* CJK COMPATIBILITY IDEOGRAPH-F9F4 */ + ["\uF9F5", "\uF9F5"], /* CJK COMPATIBILITY IDEOGRAPH-F9F5 */ + ["\uF9F6", "\uF9F6"], /* CJK COMPATIBILITY IDEOGRAPH-F9F6 */ + ["\uF9F7", "\uF9F7"], /* CJK COMPATIBILITY IDEOGRAPH-F9F7 */ + ["\uF9F8", "\uF9F8"], /* CJK COMPATIBILITY IDEOGRAPH-F9F8 */ + ["\uF9F9", "\uF9F9"], /* CJK COMPATIBILITY IDEOGRAPH-F9F9 */ + ["\uF9FA", "\uF9FA"], /* CJK COMPATIBILITY IDEOGRAPH-F9FA */ + ["\uF9FB", "\uF9FB"], /* CJK COMPATIBILITY IDEOGRAPH-F9FB */ + ["\uF9FC", "\uF9FC"], /* CJK COMPATIBILITY IDEOGRAPH-F9FC */ + ["\uF9FD", "\uF9FD"], /* CJK COMPATIBILITY IDEOGRAPH-F9FD */ + ["\uF9FE", "\uF9FE"], /* CJK COMPATIBILITY IDEOGRAPH-F9FE */ + ["\uF9FF", "\uF9FF"], /* CJK COMPATIBILITY IDEOGRAPH-F9FF */ + ["\uFA00", "\uFA00"], /* CJK COMPATIBILITY IDEOGRAPH-FA00 */ + ["\uFA01", "\uFA01"], /* CJK COMPATIBILITY IDEOGRAPH-FA01 */ + ["\uFA02", "\uFA02"], /* CJK COMPATIBILITY IDEOGRAPH-FA02 */ + ["\uFA03", "\uFA03"], /* CJK COMPATIBILITY IDEOGRAPH-FA03 */ + ["\uFA04", "\uFA04"], /* CJK COMPATIBILITY IDEOGRAPH-FA04 */ + ["\uFA05", "\uFA05"], /* CJK COMPATIBILITY IDEOGRAPH-FA05 */ + ["\uFA06", "\uFA06"], /* CJK COMPATIBILITY IDEOGRAPH-FA06 */ + ["\uFA07", "\uFA07"], /* CJK COMPATIBILITY IDEOGRAPH-FA07 */ + ["\uFA08", "\uFA08"], /* CJK COMPATIBILITY IDEOGRAPH-FA08 */ + ["\uFA09", "\uFA09"], /* CJK COMPATIBILITY IDEOGRAPH-FA09 */ + ["\uFA0A", "\uFA0A"], /* CJK COMPATIBILITY IDEOGRAPH-FA0A */ + ["\uFA0B", "\uFA0B"], /* CJK COMPATIBILITY IDEOGRAPH-FA0B */ + ["\uFA0C", "\uFA0C"], /* CJK COMPATIBILITY IDEOGRAPH-FA0C */ + ["\uFA0D", "\uFA0D"], /* CJK COMPATIBILITY IDEOGRAPH-FA0D */ + ["\uFA0E", "\uFA0E"], /* CJK COMPATIBILITY IDEOGRAPH-FA0E */ + ["\uFA0F", "\uFA0F"], /* CJK COMPATIBILITY IDEOGRAPH-FA0F */ + ["\uFA10", "\uFA10"], /* CJK COMPATIBILITY IDEOGRAPH-FA10 */ + ["\uFA11", "\uFA11"], /* CJK COMPATIBILITY IDEOGRAPH-FA11 */ + ["\uFA12", "\uFA12"], /* CJK COMPATIBILITY IDEOGRAPH-FA12 */ + ["\uFA13", "\uFA13"], /* CJK COMPATIBILITY IDEOGRAPH-FA13 */ + ["\uFA14", "\uFA14"], /* CJK COMPATIBILITY IDEOGRAPH-FA14 */ + ["\uFA15", "\uFA15"], /* CJK COMPATIBILITY IDEOGRAPH-FA15 */ + ["\uFA16", "\uFA16"], /* CJK COMPATIBILITY IDEOGRAPH-FA16 */ + ["\uFA17", "\uFA17"], /* CJK COMPATIBILITY IDEOGRAPH-FA17 */ + ["\uFA18", "\uFA18"], /* CJK COMPATIBILITY IDEOGRAPH-FA18 */ + ["\uFA19", "\uFA19"], /* CJK COMPATIBILITY IDEOGRAPH-FA19 */ + ["\uFA1A", "\uFA1A"], /* CJK COMPATIBILITY IDEOGRAPH-FA1A */ + ["\uFA1B", "\uFA1B"], /* CJK COMPATIBILITY IDEOGRAPH-FA1B */ + ["\uFA1C", "\uFA1C"], /* CJK COMPATIBILITY IDEOGRAPH-FA1C */ + ["\uFA1D", "\uFA1D"], /* CJK COMPATIBILITY IDEOGRAPH-FA1D */ + ["\uFA1E", "\uFA1E"], /* CJK COMPATIBILITY IDEOGRAPH-FA1E */ + ["\uFA1F", "\uFA1F"], /* CJK COMPATIBILITY IDEOGRAPH-FA1F */ + ["\uFA20", "\uFA20"], /* CJK COMPATIBILITY IDEOGRAPH-FA20 */ + ["\uFA21", "\uFA21"], /* CJK COMPATIBILITY IDEOGRAPH-FA21 */ + ["\uFA22", "\uFA22"], /* CJK COMPATIBILITY IDEOGRAPH-FA22 */ + ["\uFA23", "\uFA23"], /* CJK COMPATIBILITY IDEOGRAPH-FA23 */ + ["\uFA24", "\uFA24"], /* CJK COMPATIBILITY IDEOGRAPH-FA24 */ + ["\uFA25", "\uFA25"], /* CJK COMPATIBILITY IDEOGRAPH-FA25 */ + ["\uFA26", "\uFA26"], /* CJK COMPATIBILITY IDEOGRAPH-FA26 */ + ["\uFA27", "\uFA27"], /* CJK COMPATIBILITY IDEOGRAPH-FA27 */ + ["\uFA28", "\uFA28"], /* CJK COMPATIBILITY IDEOGRAPH-FA28 */ + ["\uFA29", "\uFA29"], /* CJK COMPATIBILITY IDEOGRAPH-FA29 */ + ["\uFA2A", "\uFA2A"], /* CJK COMPATIBILITY IDEOGRAPH-FA2A */ + ["\uFA2B", "\uFA2B"], /* CJK COMPATIBILITY IDEOGRAPH-FA2B */ + ["\uFA2C", "\uFA2C"], /* CJK COMPATIBILITY IDEOGRAPH-FA2C */ + ["\uFA2D", "\uFA2D"], /* CJK COMPATIBILITY IDEOGRAPH-FA2D */ + ["\uFA2E", "\uFA2E"], /* CJK COMPATIBILITY IDEOGRAPH-FA2E */ + ["\uFA2F", "\uFA2F"], /* CJK COMPATIBILITY IDEOGRAPH-FA2F */ + ["\uFA30", "\uFA30"], /* CJK COMPATIBILITY IDEOGRAPH-FA30 */ + ["\uFA31", "\uFA31"], /* CJK COMPATIBILITY IDEOGRAPH-FA31 */ + ["\uFA32", "\uFA32"], /* CJK COMPATIBILITY IDEOGRAPH-FA32 */ + ["\uFA33", "\uFA33"], /* CJK COMPATIBILITY IDEOGRAPH-FA33 */ + ["\uFA34", "\uFA34"], /* CJK COMPATIBILITY IDEOGRAPH-FA34 */ + ["\uFA35", "\uFA35"], /* CJK COMPATIBILITY IDEOGRAPH-FA35 */ + ["\uFA36", "\uFA36"], /* CJK COMPATIBILITY IDEOGRAPH-FA36 */ + ["\uFA37", "\uFA37"], /* CJK COMPATIBILITY IDEOGRAPH-FA37 */ + ["\uFA38", "\uFA38"], /* CJK COMPATIBILITY IDEOGRAPH-FA38 */ + ["\uFA39", "\uFA39"], /* CJK COMPATIBILITY IDEOGRAPH-FA39 */ + ["\uFA3A", "\uFA3A"], /* CJK COMPATIBILITY IDEOGRAPH-FA3A */ + ["\uFA3B", "\uFA3B"], /* CJK COMPATIBILITY IDEOGRAPH-FA3B */ + ["\uFA3C", "\uFA3C"], /* CJK COMPATIBILITY IDEOGRAPH-FA3C */ + ["\uFA3D", "\uFA3D"], /* CJK COMPATIBILITY IDEOGRAPH-FA3D */ + ["\uFA3E", "\uFA3E"], /* CJK COMPATIBILITY IDEOGRAPH-FA3E */ + ["\uFA3F", "\uFA3F"], /* CJK COMPATIBILITY IDEOGRAPH-FA3F */ + ["\uFA40", "\uFA40"], /* CJK COMPATIBILITY IDEOGRAPH-FA40 */ + ["\uFA41", "\uFA41"], /* CJK COMPATIBILITY IDEOGRAPH-FA41 */ + ["\uFA42", "\uFA42"], /* CJK COMPATIBILITY IDEOGRAPH-FA42 */ + ["\uFA43", "\uFA43"], /* CJK COMPATIBILITY IDEOGRAPH-FA43 */ + ["\uFA44", "\uFA44"], /* CJK COMPATIBILITY IDEOGRAPH-FA44 */ + ["\uFA45", "\uFA45"], /* CJK COMPATIBILITY IDEOGRAPH-FA45 */ + ["\uFA46", "\uFA46"], /* CJK COMPATIBILITY IDEOGRAPH-FA46 */ + ["\uFA47", "\uFA47"], /* CJK COMPATIBILITY IDEOGRAPH-FA47 */ + ["\uFA48", "\uFA48"], /* CJK COMPATIBILITY IDEOGRAPH-FA48 */ + ["\uFA49", "\uFA49"], /* CJK COMPATIBILITY IDEOGRAPH-FA49 */ + ["\uFA4A", "\uFA4A"], /* CJK COMPATIBILITY IDEOGRAPH-FA4A */ + ["\uFA4B", "\uFA4B"], /* CJK COMPATIBILITY IDEOGRAPH-FA4B */ + ["\uFA4C", "\uFA4C"], /* CJK COMPATIBILITY IDEOGRAPH-FA4C */ + ["\uFA4D", "\uFA4D"], /* CJK COMPATIBILITY IDEOGRAPH-FA4D */ + ["\uFA4E", "\uFA4E"], /* CJK COMPATIBILITY IDEOGRAPH-FA4E */ + ["\uFA4F", "\uFA4F"], /* CJK COMPATIBILITY IDEOGRAPH-FA4F */ + ["\uFA50", "\uFA50"], /* CJK COMPATIBILITY IDEOGRAPH-FA50 */ + ["\uFA51", "\uFA51"], /* CJK COMPATIBILITY IDEOGRAPH-FA51 */ + ["\uFA52", "\uFA52"], /* CJK COMPATIBILITY IDEOGRAPH-FA52 */ + ["\uFA53", "\uFA53"], /* CJK COMPATIBILITY IDEOGRAPH-FA53 */ + ["\uFA54", "\uFA54"], /* CJK COMPATIBILITY IDEOGRAPH-FA54 */ + ["\uFA55", "\uFA55"], /* CJK COMPATIBILITY IDEOGRAPH-FA55 */ + ["\uFA56", "\uFA56"], /* CJK COMPATIBILITY IDEOGRAPH-FA56 */ + ["\uFA57", "\uFA57"], /* CJK COMPATIBILITY IDEOGRAPH-FA57 */ + ["\uFA58", "\uFA58"], /* CJK COMPATIBILITY IDEOGRAPH-FA58 */ + ["\uFA59", "\uFA59"], /* CJK COMPATIBILITY IDEOGRAPH-FA59 */ + ["\uFA5A", "\uFA5A"], /* CJK COMPATIBILITY IDEOGRAPH-FA5A */ + ["\uFA5B", "\uFA5B"], /* CJK COMPATIBILITY IDEOGRAPH-FA5B */ + ["\uFA5C", "\uFA5C"], /* CJK COMPATIBILITY IDEOGRAPH-FA5C */ + ["\uFA5D", "\uFA5D"], /* CJK COMPATIBILITY IDEOGRAPH-FA5D */ + ["\uFA5E", "\uFA5E"], /* CJK COMPATIBILITY IDEOGRAPH-FA5E */ + ["\uFA5F", "\uFA5F"], /* CJK COMPATIBILITY IDEOGRAPH-FA5F */ + ["\uFA60", "\uFA60"], /* CJK COMPATIBILITY IDEOGRAPH-FA60 */ + ["\uFA61", "\uFA61"], /* CJK COMPATIBILITY IDEOGRAPH-FA61 */ + ["\uFA62", "\uFA62"], /* CJK COMPATIBILITY IDEOGRAPH-FA62 */ + ["\uFA63", "\uFA63"], /* CJK COMPATIBILITY IDEOGRAPH-FA63 */ + ["\uFA64", "\uFA64"], /* CJK COMPATIBILITY IDEOGRAPH-FA64 */ + ["\uFA65", "\uFA65"], /* CJK COMPATIBILITY IDEOGRAPH-FA65 */ + ["\uFA66", "\uFA66"], /* CJK COMPATIBILITY IDEOGRAPH-FA66 */ + ["\uFA67", "\uFA67"], /* CJK COMPATIBILITY IDEOGRAPH-FA67 */ + ["\uFA68", "\uFA68"], /* CJK COMPATIBILITY IDEOGRAPH-FA68 */ + ["\uFA69", "\uFA69"], /* CJK COMPATIBILITY IDEOGRAPH-FA69 */ + ["\uFA6A", "\uFA6A"], /* CJK COMPATIBILITY IDEOGRAPH-FA6A */ + ["\uFA6B", "\uFA6B"], /* CJK COMPATIBILITY IDEOGRAPH-FA6B */ + ["\uFA6C", "\uFA6C"], /* CJK COMPATIBILITY IDEOGRAPH-FA6C */ + ["\uFA6D", "\uFA6D"], /* CJK COMPATIBILITY IDEOGRAPH-FA6D */ + ["\uFA6E", "\uFA6E"], + ["\uFA6F", "\uFA6F"], + ["\uFA70", "\uFA70"], /* CJK COMPATIBILITY IDEOGRAPH-FA70 */ + ["\uFA71", "\uFA71"], /* CJK COMPATIBILITY IDEOGRAPH-FA71 */ + ["\uFA72", "\uFA72"], /* CJK COMPATIBILITY IDEOGRAPH-FA72 */ + ["\uFA73", "\uFA73"], /* CJK COMPATIBILITY IDEOGRAPH-FA73 */ + ["\uFA74", "\uFA74"], /* CJK COMPATIBILITY IDEOGRAPH-FA74 */ + ["\uFA75", "\uFA75"], /* CJK COMPATIBILITY IDEOGRAPH-FA75 */ + ["\uFA76", "\uFA76"], /* CJK COMPATIBILITY IDEOGRAPH-FA76 */ + ["\uFA77", "\uFA77"], /* CJK COMPATIBILITY IDEOGRAPH-FA77 */ + ["\uFA78", "\uFA78"], /* CJK COMPATIBILITY IDEOGRAPH-FA78 */ + ["\uFA79", "\uFA79"], /* CJK COMPATIBILITY IDEOGRAPH-FA79 */ + ["\uFA7A", "\uFA7A"], /* CJK COMPATIBILITY IDEOGRAPH-FA7A */ + ["\uFA7B", "\uFA7B"], /* CJK COMPATIBILITY IDEOGRAPH-FA7B */ + ["\uFA7C", "\uFA7C"], /* CJK COMPATIBILITY IDEOGRAPH-FA7C */ + ["\uFA7D", "\uFA7D"], /* CJK COMPATIBILITY IDEOGRAPH-FA7D */ + ["\uFA7E", "\uFA7E"], /* CJK COMPATIBILITY IDEOGRAPH-FA7E */ + ["\uFA7F", "\uFA7F"], /* CJK COMPATIBILITY IDEOGRAPH-FA7F */ + ["\uFA80", "\uFA80"], /* CJK COMPATIBILITY IDEOGRAPH-FA80 */ + ["\uFA81", "\uFA81"], /* CJK COMPATIBILITY IDEOGRAPH-FA81 */ + ["\uFA82", "\uFA82"], /* CJK COMPATIBILITY IDEOGRAPH-FA82 */ + ["\uFA83", "\uFA83"], /* CJK COMPATIBILITY IDEOGRAPH-FA83 */ + ["\uFA84", "\uFA84"], /* CJK COMPATIBILITY IDEOGRAPH-FA84 */ + ["\uFA85", "\uFA85"], /* CJK COMPATIBILITY IDEOGRAPH-FA85 */ + ["\uFA86", "\uFA86"], /* CJK COMPATIBILITY IDEOGRAPH-FA86 */ + ["\uFA87", "\uFA87"], /* CJK COMPATIBILITY IDEOGRAPH-FA87 */ + ["\uFA88", "\uFA88"], /* CJK COMPATIBILITY IDEOGRAPH-FA88 */ + ["\uFA89", "\uFA89"], /* CJK COMPATIBILITY IDEOGRAPH-FA89 */ + ["\uFA8A", "\uFA8A"], /* CJK COMPATIBILITY IDEOGRAPH-FA8A */ + ["\uFA8B", "\uFA8B"], /* CJK COMPATIBILITY IDEOGRAPH-FA8B */ + ["\uFA8C", "\uFA8C"], /* CJK COMPATIBILITY IDEOGRAPH-FA8C */ + ["\uFA8D", "\uFA8D"], /* CJK COMPATIBILITY IDEOGRAPH-FA8D */ + ["\uFA8E", "\uFA8E"], /* CJK COMPATIBILITY IDEOGRAPH-FA8E */ + ["\uFA8F", "\uFA8F"], /* CJK COMPATIBILITY IDEOGRAPH-FA8F */ + ["\uFA90", "\uFA90"], /* CJK COMPATIBILITY IDEOGRAPH-FA90 */ + ["\uFA91", "\uFA91"], /* CJK COMPATIBILITY IDEOGRAPH-FA91 */ + ["\uFA92", "\uFA92"], /* CJK COMPATIBILITY IDEOGRAPH-FA92 */ + ["\uFA93", "\uFA93"], /* CJK COMPATIBILITY IDEOGRAPH-FA93 */ + ["\uFA94", "\uFA94"], /* CJK COMPATIBILITY IDEOGRAPH-FA94 */ + ["\uFA95", "\uFA95"], /* CJK COMPATIBILITY IDEOGRAPH-FA95 */ + ["\uFA96", "\uFA96"], /* CJK COMPATIBILITY IDEOGRAPH-FA96 */ + ["\uFA97", "\uFA97"], /* CJK COMPATIBILITY IDEOGRAPH-FA97 */ + ["\uFA98", "\uFA98"], /* CJK COMPATIBILITY IDEOGRAPH-FA98 */ + ["\uFA99", "\uFA99"], /* CJK COMPATIBILITY IDEOGRAPH-FA99 */ + ["\uFA9A", "\uFA9A"], /* CJK COMPATIBILITY IDEOGRAPH-FA9A */ + ["\uFA9B", "\uFA9B"], /* CJK COMPATIBILITY IDEOGRAPH-FA9B */ + ["\uFA9C", "\uFA9C"], /* CJK COMPATIBILITY IDEOGRAPH-FA9C */ + ["\uFA9D", "\uFA9D"], /* CJK COMPATIBILITY IDEOGRAPH-FA9D */ + ["\uFA9E", "\uFA9E"], /* CJK COMPATIBILITY IDEOGRAPH-FA9E */ + ["\uFA9F", "\uFA9F"], /* CJK COMPATIBILITY IDEOGRAPH-FA9F */ + ["\uFAA0", "\uFAA0"], /* CJK COMPATIBILITY IDEOGRAPH-FAA0 */ + ["\uFAA1", "\uFAA1"], /* CJK COMPATIBILITY IDEOGRAPH-FAA1 */ + ["\uFAA2", "\uFAA2"], /* CJK COMPATIBILITY IDEOGRAPH-FAA2 */ + ["\uFAA3", "\uFAA3"], /* CJK COMPATIBILITY IDEOGRAPH-FAA3 */ + ["\uFAA4", "\uFAA4"], /* CJK COMPATIBILITY IDEOGRAPH-FAA4 */ + ["\uFAA5", "\uFAA5"], /* CJK COMPATIBILITY IDEOGRAPH-FAA5 */ + ["\uFAA6", "\uFAA6"], /* CJK COMPATIBILITY IDEOGRAPH-FAA6 */ + ["\uFAA7", "\uFAA7"], /* CJK COMPATIBILITY IDEOGRAPH-FAA7 */ + ["\uFAA8", "\uFAA8"], /* CJK COMPATIBILITY IDEOGRAPH-FAA8 */ + ["\uFAA9", "\uFAA9"], /* CJK COMPATIBILITY IDEOGRAPH-FAA9 */ + ["\uFAAA", "\uFAAA"], /* CJK COMPATIBILITY IDEOGRAPH-FAAA */ + ["\uFAAB", "\uFAAB"], /* CJK COMPATIBILITY IDEOGRAPH-FAAB */ + ["\uFAAC", "\uFAAC"], /* CJK COMPATIBILITY IDEOGRAPH-FAAC */ + ["\uFAAD", "\uFAAD"], /* CJK COMPATIBILITY IDEOGRAPH-FAAD */ + ["\uFAAE", "\uFAAE"], /* CJK COMPATIBILITY IDEOGRAPH-FAAE */ + ["\uFAAF", "\uFAAF"], /* CJK COMPATIBILITY IDEOGRAPH-FAAF */ + ["\uFAB0", "\uFAB0"], /* CJK COMPATIBILITY IDEOGRAPH-FAB0 */ + ["\uFAB1", "\uFAB1"], /* CJK COMPATIBILITY IDEOGRAPH-FAB1 */ + ["\uFAB2", "\uFAB2"], /* CJK COMPATIBILITY IDEOGRAPH-FAB2 */ + ["\uFAB3", "\uFAB3"], /* CJK COMPATIBILITY IDEOGRAPH-FAB3 */ + ["\uFAB4", "\uFAB4"], /* CJK COMPATIBILITY IDEOGRAPH-FAB4 */ + ["\uFAB5", "\uFAB5"], /* CJK COMPATIBILITY IDEOGRAPH-FAB5 */ + ["\uFAB6", "\uFAB6"], /* CJK COMPATIBILITY IDEOGRAPH-FAB6 */ + ["\uFAB7", "\uFAB7"], /* CJK COMPATIBILITY IDEOGRAPH-FAB7 */ + ["\uFAB8", "\uFAB8"], /* CJK COMPATIBILITY IDEOGRAPH-FAB8 */ + ["\uFAB9", "\uFAB9"], /* CJK COMPATIBILITY IDEOGRAPH-FAB9 */ + ["\uFABA", "\uFABA"], /* CJK COMPATIBILITY IDEOGRAPH-FABA */ + ["\uFABB", "\uFABB"], /* CJK COMPATIBILITY IDEOGRAPH-FABB */ + ["\uFABC", "\uFABC"], /* CJK COMPATIBILITY IDEOGRAPH-FABC */ + ["\uFABD", "\uFABD"], /* CJK COMPATIBILITY IDEOGRAPH-FABD */ + ["\uFABE", "\uFABE"], /* CJK COMPATIBILITY IDEOGRAPH-FABE */ + ["\uFABF", "\uFABF"], /* CJK COMPATIBILITY IDEOGRAPH-FABF */ + ["\uFAC0", "\uFAC0"], /* CJK COMPATIBILITY IDEOGRAPH-FAC0 */ + ["\uFAC1", "\uFAC1"], /* CJK COMPATIBILITY IDEOGRAPH-FAC1 */ + ["\uFAC2", "\uFAC2"], /* CJK COMPATIBILITY IDEOGRAPH-FAC2 */ + ["\uFAC3", "\uFAC3"], /* CJK COMPATIBILITY IDEOGRAPH-FAC3 */ + ["\uFAC4", "\uFAC4"], /* CJK COMPATIBILITY IDEOGRAPH-FAC4 */ + ["\uFAC5", "\uFAC5"], /* CJK COMPATIBILITY IDEOGRAPH-FAC5 */ + ["\uFAC6", "\uFAC6"], /* CJK COMPATIBILITY IDEOGRAPH-FAC6 */ + ["\uFAC7", "\uFAC7"], /* CJK COMPATIBILITY IDEOGRAPH-FAC7 */ + ["\uFAC8", "\uFAC8"], /* CJK COMPATIBILITY IDEOGRAPH-FAC8 */ + ["\uFAC9", "\uFAC9"], /* CJK COMPATIBILITY IDEOGRAPH-FAC9 */ + ["\uFACA", "\uFACA"], /* CJK COMPATIBILITY IDEOGRAPH-FACA */ + ["\uFACB", "\uFACB"], /* CJK COMPATIBILITY IDEOGRAPH-FACB */ + ["\uFACC", "\uFACC"], /* CJK COMPATIBILITY IDEOGRAPH-FACC */ + ["\uFACD", "\uFACD"], /* CJK COMPATIBILITY IDEOGRAPH-FACD */ + ["\uFACE", "\uFACE"], /* CJK COMPATIBILITY IDEOGRAPH-FACE */ + ["\uFACF", "\uFACF"], /* CJK COMPATIBILITY IDEOGRAPH-FACF */ + ["\uFAD0", "\uFAD0"], /* CJK COMPATIBILITY IDEOGRAPH-FAD0 */ + ["\uFAD1", "\uFAD1"], /* CJK COMPATIBILITY IDEOGRAPH-FAD1 */ + ["\uFAD2", "\uFAD2"], /* CJK COMPATIBILITY IDEOGRAPH-FAD2 */ + ["\uFAD3", "\uFAD3"], /* CJK COMPATIBILITY IDEOGRAPH-FAD3 */ + ["\uFAD4", "\uFAD4"], /* CJK COMPATIBILITY IDEOGRAPH-FAD4 */ + ["\uFAD5", "\uFAD5"], /* CJK COMPATIBILITY IDEOGRAPH-FAD5 */ + ["\uFAD6", "\uFAD6"], /* CJK COMPATIBILITY IDEOGRAPH-FAD6 */ + ["\uFAD7", "\uFAD7"], /* CJK COMPATIBILITY IDEOGRAPH-FAD7 */ + ["\uFAD8", "\uFAD8"], /* CJK COMPATIBILITY IDEOGRAPH-FAD8 */ + ["\uFAD9", "\uFAD9"], /* CJK COMPATIBILITY IDEOGRAPH-FAD9 */ + ["\uFADA", "\uFADA"], + ["\uFADB", "\uFADB"], + ["\uFADC", "\uFADC"], + ["\uFADD", "\uFADD"], + ["\uFADE", "\uFADE"], + ["\uFADF", "\uFADF"], + ["\uFAE0", "\uFAE0"], + ["\uFAE1", "\uFAE1"], + ["\uFAE2", "\uFAE2"], + ["\uFAE3", "\uFAE3"], + ["\uFAE4", "\uFAE4"], + ["\uFAE5", "\uFAE5"], + ["\uFAE6", "\uFAE6"], + ["\uFAE7", "\uFAE7"], + ["\uFAE8", "\uFAE8"], + ["\uFAE9", "\uFAE9"], + ["\uFAEA", "\uFAEA"], + ["\uFAEB", "\uFAEB"], + ["\uFAEC", "\uFAEC"], + ["\uFAED", "\uFAED"], + ["\uFAEE", "\uFAEE"], + ["\uFAEF", "\uFAEF"], + ["\uFAF0", "\uFAF0"], + ["\uFAF1", "\uFAF1"], + ["\uFAF2", "\uFAF2"], + ["\uFAF3", "\uFAF3"], + ["\uFAF4", "\uFAF4"], + ["\uFAF5", "\uFAF5"], + ["\uFAF6", "\uFAF6"], + ["\uFAF7", "\uFAF7"], + ["\uFAF8", "\uFAF8"], + ["\uFAF9", "\uFAF9"], + ["\uFAFA", "\uFAFA"], + ["\uFAFB", "\uFAFB"], + ["\uFAFC", "\uFAFC"], + ["\uFAFD", "\uFAFD"], + ["\uFAFE", "\uFAFE"], + ["\uFAFF", "\uFAFF"], + ["\u0046\u0046", "\uFB00"], /* LATIN SMALL LIGATURE FF */ + ["\u0046\u0049", "\uFB01"], /* LATIN SMALL LIGATURE FI */ + ["\u0046\u004C", "\uFB02"], /* LATIN SMALL LIGATURE FL */ + ["\u0046\u0046\u0049", "\uFB03"], /* LATIN SMALL LIGATURE FFI */ + ["\u0046\u0046\u004C", "\uFB04"], /* LATIN SMALL LIGATURE FFL */ + ["\u0053\u0054", "\uFB05"], /* LATIN SMALL LIGATURE LONG S T */ + ["\u0053\u0054", "\uFB06"], /* LATIN SMALL LIGATURE ST */ + ["\uFB07", "\uFB07"], + ["\uFB08", "\uFB08"], + ["\uFB09", "\uFB09"], + ["\uFB0A", "\uFB0A"], + ["\uFB0B", "\uFB0B"], + ["\uFB0C", "\uFB0C"], + ["\uFB0D", "\uFB0D"], + ["\uFB0E", "\uFB0E"], + ["\uFB0F", "\uFB0F"], + ["\uFB10", "\uFB10"], + ["\uFB11", "\uFB11"], + ["\uFB12", "\uFB12"], + ["\u0544\u0546", "\uFB13"], /* ARMENIAN SMALL LIGATURE MEN NOW */ + ["\u0544\u0535", "\uFB14"], /* ARMENIAN SMALL LIGATURE MEN ECH */ + ["\u0544\u053B", "\uFB15"], /* ARMENIAN SMALL LIGATURE MEN INI */ + ["\u054E\u0546", "\uFB16"], /* ARMENIAN SMALL LIGATURE VEW NOW */ + ["\u0544\u053D", "\uFB17"], /* ARMENIAN SMALL LIGATURE MEN XEH */ + ["\uFB18", "\uFB18"], + ["\uFB19", "\uFB19"], + ["\uFB1A", "\uFB1A"], + ["\uFB1B", "\uFB1B"], + ["\uFB1C", "\uFB1C"], + ["\uFB1D", "\uFB1D"], /* HEBREW LETTER YOD WITH HIRIQ */ + ["\uFB1E", "\uFB1E"], /* HEBREW POINT JUDEO-SPANISH VARIKA (HEBREW POINT VARIKA) */ + ["\uFB1F", "\uFB1F"], /* HEBREW LIGATURE YIDDISH YOD YOD PATAH */ + ["\uFB20", "\uFB20"], /* HEBREW LETTER ALTERNATIVE AYIN */ + ["\uFB21", "\uFB21"], /* HEBREW LETTER WIDE ALEF */ + ["\uFB22", "\uFB22"], /* HEBREW LETTER WIDE DALET */ + ["\uFB23", "\uFB23"], /* HEBREW LETTER WIDE HE */ + ["\uFB24", "\uFB24"], /* HEBREW LETTER WIDE KAF */ + ["\uFB25", "\uFB25"], /* HEBREW LETTER WIDE LAMED */ + ["\uFB26", "\uFB26"], /* HEBREW LETTER WIDE FINAL MEM */ + ["\uFB27", "\uFB27"], /* HEBREW LETTER WIDE RESH */ + ["\uFB28", "\uFB28"], /* HEBREW LETTER WIDE TAV */ + ["\uFB29", "\uFB29"], /* HEBREW LETTER ALTERNATIVE PLUS SIGN */ + ["\uFB2A", "\uFB2A"], /* HEBREW LETTER SHIN WITH SHIN DOT */ + ["\uFB2B", "\uFB2B"], /* HEBREW LETTER SHIN WITH SIN DOT */ + ["\uFB2C", "\uFB2C"], /* HEBREW LETTER SHIN WITH DAGESH AND SHIN DOT */ + ["\uFB2D", "\uFB2D"], /* HEBREW LETTER SHIN WITH DAGESH AND SIN DOT */ + ["\uFB2E", "\uFB2E"], /* HEBREW LETTER ALEF WITH PATAH */ + ["\uFB2F", "\uFB2F"], /* HEBREW LETTER ALEF WITH QAMATS */ + ["\uFB30", "\uFB30"], /* HEBREW LETTER ALEF WITH MAPIQ */ + ["\uFB31", "\uFB31"], /* HEBREW LETTER BET WITH DAGESH */ + ["\uFB32", "\uFB32"], /* HEBREW LETTER GIMEL WITH DAGESH */ + ["\uFB33", "\uFB33"], /* HEBREW LETTER DALET WITH DAGESH */ + ["\uFB34", "\uFB34"], /* HEBREW LETTER HE WITH MAPIQ */ + ["\uFB35", "\uFB35"], /* HEBREW LETTER VAV WITH DAGESH */ + ["\uFB36", "\uFB36"], /* HEBREW LETTER ZAYIN WITH DAGESH */ + ["\uFB37", "\uFB37"], + ["\uFB38", "\uFB38"], /* HEBREW LETTER TET WITH DAGESH */ + ["\uFB39", "\uFB39"], /* HEBREW LETTER YOD WITH DAGESH */ + ["\uFB3A", "\uFB3A"], /* HEBREW LETTER FINAL KAF WITH DAGESH */ + ["\uFB3B", "\uFB3B"], /* HEBREW LETTER KAF WITH DAGESH */ + ["\uFB3C", "\uFB3C"], /* HEBREW LETTER LAMED WITH DAGESH */ + ["\uFB3D", "\uFB3D"], + ["\uFB3E", "\uFB3E"], /* HEBREW LETTER MEM WITH DAGESH */ + ["\uFB3F", "\uFB3F"], + ["\uFB40", "\uFB40"], /* HEBREW LETTER NUN WITH DAGESH */ + ["\uFB41", "\uFB41"], /* HEBREW LETTER SAMEKH WITH DAGESH */ + ["\uFB42", "\uFB42"], + ["\uFB43", "\uFB43"], /* HEBREW LETTER FINAL PE WITH DAGESH */ + ["\uFB44", "\uFB44"], /* HEBREW LETTER PE WITH DAGESH */ + ["\uFB45", "\uFB45"], + ["\uFB46", "\uFB46"], /* HEBREW LETTER TSADI WITH DAGESH */ + ["\uFB47", "\uFB47"], /* HEBREW LETTER QOF WITH DAGESH */ + ["\uFB48", "\uFB48"], /* HEBREW LETTER RESH WITH DAGESH */ + ["\uFB49", "\uFB49"], /* HEBREW LETTER SHIN WITH DAGESH */ + ["\uFB4A", "\uFB4A"], /* HEBREW LETTER TAV WITH DAGESH */ + ["\uFB4B", "\uFB4B"], /* HEBREW LETTER VAV WITH HOLAM */ + ["\uFB4C", "\uFB4C"], /* HEBREW LETTER BET WITH RAFE */ + ["\uFB4D", "\uFB4D"], /* HEBREW LETTER KAF WITH RAFE */ + ["\uFB4E", "\uFB4E"], /* HEBREW LETTER PE WITH RAFE */ + ["\uFB4F", "\uFB4F"], /* HEBREW LIGATURE ALEF LAMED */ + ["\uFB50", "\uFB50"], /* ARABIC LETTER ALEF WASLA ISOLATED FORM */ + ["\uFB51", "\uFB51"], /* ARABIC LETTER ALEF WASLA FINAL FORM */ + ["\uFB52", "\uFB52"], /* ARABIC LETTER BEEH ISOLATED FORM */ + ["\uFB53", "\uFB53"], /* ARABIC LETTER BEEH FINAL FORM */ + ["\uFB54", "\uFB54"], /* ARABIC LETTER BEEH INITIAL FORM */ + ["\uFB55", "\uFB55"], /* ARABIC LETTER BEEH MEDIAL FORM */ + ["\uFB56", "\uFB56"], /* ARABIC LETTER PEH ISOLATED FORM */ + ["\uFB57", "\uFB57"], /* ARABIC LETTER PEH FINAL FORM */ + ["\uFB58", "\uFB58"], /* ARABIC LETTER PEH INITIAL FORM */ + ["\uFB59", "\uFB59"], /* ARABIC LETTER PEH MEDIAL FORM */ + ["\uFB5A", "\uFB5A"], /* ARABIC LETTER BEHEH ISOLATED FORM */ + ["\uFB5B", "\uFB5B"], /* ARABIC LETTER BEHEH FINAL FORM */ + ["\uFB5C", "\uFB5C"], /* ARABIC LETTER BEHEH INITIAL FORM */ + ["\uFB5D", "\uFB5D"], /* ARABIC LETTER BEHEH MEDIAL FORM */ + ["\uFB5E", "\uFB5E"], /* ARABIC LETTER TTEHEH ISOLATED FORM */ + ["\uFB5F", "\uFB5F"], /* ARABIC LETTER TTEHEH FINAL FORM */ + ["\uFB60", "\uFB60"], /* ARABIC LETTER TTEHEH INITIAL FORM */ + ["\uFB61", "\uFB61"], /* ARABIC LETTER TTEHEH MEDIAL FORM */ + ["\uFB62", "\uFB62"], /* ARABIC LETTER TEHEH ISOLATED FORM */ + ["\uFB63", "\uFB63"], /* ARABIC LETTER TEHEH FINAL FORM */ + ["\uFB64", "\uFB64"], /* ARABIC LETTER TEHEH INITIAL FORM */ + ["\uFB65", "\uFB65"], /* ARABIC LETTER TEHEH MEDIAL FORM */ + ["\uFB66", "\uFB66"], /* ARABIC LETTER TTEH ISOLATED FORM */ + ["\uFB67", "\uFB67"], /* ARABIC LETTER TTEH FINAL FORM */ + ["\uFB68", "\uFB68"], /* ARABIC LETTER TTEH INITIAL FORM */ + ["\uFB69", "\uFB69"], /* ARABIC LETTER TTEH MEDIAL FORM */ + ["\uFB6A", "\uFB6A"], /* ARABIC LETTER VEH ISOLATED FORM */ + ["\uFB6B", "\uFB6B"], /* ARABIC LETTER VEH FINAL FORM */ + ["\uFB6C", "\uFB6C"], /* ARABIC LETTER VEH INITIAL FORM */ + ["\uFB6D", "\uFB6D"], /* ARABIC LETTER VEH MEDIAL FORM */ + ["\uFB6E", "\uFB6E"], /* ARABIC LETTER PEHEH ISOLATED FORM */ + ["\uFB6F", "\uFB6F"], /* ARABIC LETTER PEHEH FINAL FORM */ + ["\uFB70", "\uFB70"], /* ARABIC LETTER PEHEH INITIAL FORM */ + ["\uFB71", "\uFB71"], /* ARABIC LETTER PEHEH MEDIAL FORM */ + ["\uFB72", "\uFB72"], /* ARABIC LETTER DYEH ISOLATED FORM */ + ["\uFB73", "\uFB73"], /* ARABIC LETTER DYEH FINAL FORM */ + ["\uFB74", "\uFB74"], /* ARABIC LETTER DYEH INITIAL FORM */ + ["\uFB75", "\uFB75"], /* ARABIC LETTER DYEH MEDIAL FORM */ + ["\uFB76", "\uFB76"], /* ARABIC LETTER NYEH ISOLATED FORM */ + ["\uFB77", "\uFB77"], /* ARABIC LETTER NYEH FINAL FORM */ + ["\uFB78", "\uFB78"], /* ARABIC LETTER NYEH INITIAL FORM */ + ["\uFB79", "\uFB79"], /* ARABIC LETTER NYEH MEDIAL FORM */ + ["\uFB7A", "\uFB7A"], /* ARABIC LETTER TCHEH ISOLATED FORM */ + ["\uFB7B", "\uFB7B"], /* ARABIC LETTER TCHEH FINAL FORM */ + ["\uFB7C", "\uFB7C"], /* ARABIC LETTER TCHEH INITIAL FORM */ + ["\uFB7D", "\uFB7D"], /* ARABIC LETTER TCHEH MEDIAL FORM */ + ["\uFB7E", "\uFB7E"], /* ARABIC LETTER TCHEHEH ISOLATED FORM */ + ["\uFB7F", "\uFB7F"], /* ARABIC LETTER TCHEHEH FINAL FORM */ + ["\uFB80", "\uFB80"], /* ARABIC LETTER TCHEHEH INITIAL FORM */ + ["\uFB81", "\uFB81"], /* ARABIC LETTER TCHEHEH MEDIAL FORM */ + ["\uFB82", "\uFB82"], /* ARABIC LETTER DDAHAL ISOLATED FORM */ + ["\uFB83", "\uFB83"], /* ARABIC LETTER DDAHAL FINAL FORM */ + ["\uFB84", "\uFB84"], /* ARABIC LETTER DAHAL ISOLATED FORM */ + ["\uFB85", "\uFB85"], /* ARABIC LETTER DAHAL FINAL FORM */ + ["\uFB86", "\uFB86"], /* ARABIC LETTER DUL ISOLATED FORM */ + ["\uFB87", "\uFB87"], /* ARABIC LETTER DUL FINAL FORM */ + ["\uFB88", "\uFB88"], /* ARABIC LETTER DDAL ISOLATED FORM */ + ["\uFB89", "\uFB89"], /* ARABIC LETTER DDAL FINAL FORM */ + ["\uFB8A", "\uFB8A"], /* ARABIC LETTER JEH ISOLATED FORM */ + ["\uFB8B", "\uFB8B"], /* ARABIC LETTER JEH FINAL FORM */ + ["\uFB8C", "\uFB8C"], /* ARABIC LETTER RREH ISOLATED FORM */ + ["\uFB8D", "\uFB8D"], /* ARABIC LETTER RREH FINAL FORM */ + ["\uFB8E", "\uFB8E"], /* ARABIC LETTER KEHEH ISOLATED FORM */ + ["\uFB8F", "\uFB8F"], /* ARABIC LETTER KEHEH FINAL FORM */ + ["\uFB90", "\uFB90"], /* ARABIC LETTER KEHEH INITIAL FORM */ + ["\uFB91", "\uFB91"], /* ARABIC LETTER KEHEH MEDIAL FORM */ + ["\uFB92", "\uFB92"], /* ARABIC LETTER GAF ISOLATED FORM */ + ["\uFB93", "\uFB93"], /* ARABIC LETTER GAF FINAL FORM */ + ["\uFB94", "\uFB94"], /* ARABIC LETTER GAF INITIAL FORM */ + ["\uFB95", "\uFB95"], /* ARABIC LETTER GAF MEDIAL FORM */ + ["\uFB96", "\uFB96"], /* ARABIC LETTER GUEH ISOLATED FORM */ + ["\uFB97", "\uFB97"], /* ARABIC LETTER GUEH FINAL FORM */ + ["\uFB98", "\uFB98"], /* ARABIC LETTER GUEH INITIAL FORM */ + ["\uFB99", "\uFB99"], /* ARABIC LETTER GUEH MEDIAL FORM */ + ["\uFB9A", "\uFB9A"], /* ARABIC LETTER NGOEH ISOLATED FORM */ + ["\uFB9B", "\uFB9B"], /* ARABIC LETTER NGOEH FINAL FORM */ + ["\uFB9C", "\uFB9C"], /* ARABIC LETTER NGOEH INITIAL FORM */ + ["\uFB9D", "\uFB9D"], /* ARABIC LETTER NGOEH MEDIAL FORM */ + ["\uFB9E", "\uFB9E"], /* ARABIC LETTER NOON GHUNNA ISOLATED FORM */ + ["\uFB9F", "\uFB9F"], /* ARABIC LETTER NOON GHUNNA FINAL FORM */ + ["\uFBA0", "\uFBA0"], /* ARABIC LETTER RNOON ISOLATED FORM */ + ["\uFBA1", "\uFBA1"], /* ARABIC LETTER RNOON FINAL FORM */ + ["\uFBA2", "\uFBA2"], /* ARABIC LETTER RNOON INITIAL FORM */ + ["\uFBA3", "\uFBA3"], /* ARABIC LETTER RNOON MEDIAL FORM */ + ["\uFBA4", "\uFBA4"], /* ARABIC LETTER HEH WITH YEH ABOVE ISOLATED FORM */ + ["\uFBA5", "\uFBA5"], /* ARABIC LETTER HEH WITH YEH ABOVE FINAL FORM */ + ["\uFBA6", "\uFBA6"], /* ARABIC LETTER HEH GOAL ISOLATED FORM */ + ["\uFBA7", "\uFBA7"], /* ARABIC LETTER HEH GOAL FINAL FORM */ + ["\uFBA8", "\uFBA8"], /* ARABIC LETTER HEH GOAL INITIAL FORM */ + ["\uFBA9", "\uFBA9"], /* ARABIC LETTER HEH GOAL MEDIAL FORM */ + ["\uFBAA", "\uFBAA"], /* ARABIC LETTER HEH DOACHASHMEE ISOLATED FORM */ + ["\uFBAB", "\uFBAB"], /* ARABIC LETTER HEH DOACHASHMEE FINAL FORM */ + ["\uFBAC", "\uFBAC"], /* ARABIC LETTER HEH DOACHASHMEE INITIAL FORM */ + ["\uFBAD", "\uFBAD"], /* ARABIC LETTER HEH DOACHASHMEE MEDIAL FORM */ + ["\uFBAE", "\uFBAE"], /* ARABIC LETTER YEH BARREE ISOLATED FORM */ + ["\uFBAF", "\uFBAF"], /* ARABIC LETTER YEH BARREE FINAL FORM */ + ["\uFBB0", "\uFBB0"], /* ARABIC LETTER YEH BARREE WITH HAMZA ABOVE ISOLATED FORM */ + ["\uFBB1", "\uFBB1"], /* ARABIC LETTER YEH BARREE WITH HAMZA ABOVE FINAL FORM */ + ["\uFBB2", "\uFBB2"], /* ARABIC SYMBOL DOT ABOVE */ + ["\uFBB3", "\uFBB3"], /* ARABIC SYMBOL DOT BELOW */ + ["\uFBB4", "\uFBB4"], /* ARABIC SYMBOL TWO DOTS ABOVE */ + ["\uFBB5", "\uFBB5"], /* ARABIC SYMBOL TWO DOTS BELOW */ + ["\uFBB6", "\uFBB6"], /* ARABIC SYMBOL THREE DOTS ABOVE */ + ["\uFBB7", "\uFBB7"], /* ARABIC SYMBOL THREE DOTS BELOW */ + ["\uFBB8", "\uFBB8"], /* ARABIC SYMBOL THREE DOTS POINTING DOWNWARDS ABOVE */ + ["\uFBB9", "\uFBB9"], /* ARABIC SYMBOL THREE DOTS POINTING DOWNWARDS BELOW */ + ["\uFBBA", "\uFBBA"], /* ARABIC SYMBOL FOUR DOTS ABOVE */ + ["\uFBBB", "\uFBBB"], /* ARABIC SYMBOL FOUR DOTS BELOW */ + ["\uFBBC", "\uFBBC"], /* ARABIC SYMBOL DOUBLE VERTICAL BAR BELOW */ + ["\uFBBD", "\uFBBD"], /* ARABIC SYMBOL TWO DOTS VERTICALLY ABOVE */ + ["\uFBBE", "\uFBBE"], /* ARABIC SYMBOL TWO DOTS VERTICALLY BELOW */ + ["\uFBBF", "\uFBBF"], /* ARABIC SYMBOL RING */ + ["\uFBC0", "\uFBC0"], /* ARABIC SYMBOL SMALL TAH ABOVE */ + ["\uFBC1", "\uFBC1"], /* ARABIC SYMBOL SMALL TAH BELOW */ + ["\uFBC2", "\uFBC2"], /* ARABIC SYMBOL WASLA ABOVE */ + ["\uFBC3", "\uFBC3"], + ["\uFBC4", "\uFBC4"], + ["\uFBC5", "\uFBC5"], + ["\uFBC6", "\uFBC6"], + ["\uFBC7", "\uFBC7"], + ["\uFBC8", "\uFBC8"], + ["\uFBC9", "\uFBC9"], + ["\uFBCA", "\uFBCA"], + ["\uFBCB", "\uFBCB"], + ["\uFBCC", "\uFBCC"], + ["\uFBCD", "\uFBCD"], + ["\uFBCE", "\uFBCE"], + ["\uFBCF", "\uFBCF"], + ["\uFBD0", "\uFBD0"], + ["\uFBD1", "\uFBD1"], + ["\uFBD2", "\uFBD2"], + ["\uFBD3", "\uFBD3"], /* ARABIC LETTER NG ISOLATED FORM */ + ["\uFBD4", "\uFBD4"], /* ARABIC LETTER NG FINAL FORM */ + ["\uFBD5", "\uFBD5"], /* ARABIC LETTER NG INITIAL FORM */ + ["\uFBD6", "\uFBD6"], /* ARABIC LETTER NG MEDIAL FORM */ + ["\uFBD7", "\uFBD7"], /* ARABIC LETTER U ISOLATED FORM */ + ["\uFBD8", "\uFBD8"], /* ARABIC LETTER U FINAL FORM */ + ["\uFBD9", "\uFBD9"], /* ARABIC LETTER OE ISOLATED FORM */ + ["\uFBDA", "\uFBDA"], /* ARABIC LETTER OE FINAL FORM */ + ["\uFBDB", "\uFBDB"], /* ARABIC LETTER YU ISOLATED FORM */ + ["\uFBDC", "\uFBDC"], /* ARABIC LETTER YU FINAL FORM */ + ["\uFBDD", "\uFBDD"], /* ARABIC LETTER U WITH HAMZA ABOVE ISOLATED FORM */ + ["\uFBDE", "\uFBDE"], /* ARABIC LETTER VE ISOLATED FORM */ + ["\uFBDF", "\uFBDF"], /* ARABIC LETTER VE FINAL FORM */ + ["\uFBE0", "\uFBE0"], /* ARABIC LETTER KIRGHIZ OE ISOLATED FORM */ + ["\uFBE1", "\uFBE1"], /* ARABIC LETTER KIRGHIZ OE FINAL FORM */ + ["\uFBE2", "\uFBE2"], /* ARABIC LETTER KIRGHIZ YU ISOLATED FORM */ + ["\uFBE3", "\uFBE3"], /* ARABIC LETTER KIRGHIZ YU FINAL FORM */ + ["\uFBE4", "\uFBE4"], /* ARABIC LETTER E ISOLATED FORM */ + ["\uFBE5", "\uFBE5"], /* ARABIC LETTER E FINAL FORM */ + ["\uFBE6", "\uFBE6"], /* ARABIC LETTER E INITIAL FORM */ + ["\uFBE7", "\uFBE7"], /* ARABIC LETTER E MEDIAL FORM */ + ["\uFBE8", "\uFBE8"], /* ARABIC LETTER UIGHUR KAZAKH KIRGHIZ ALEF MAKSURA INITIAL FORM */ + ["\uFBE9", "\uFBE9"], /* ARABIC LETTER UIGHUR KAZAKH KIRGHIZ ALEF MAKSURA MEDIAL FORM */ + ["\uFBEA", "\uFBEA"], /* ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH ALEF ISOLATED FORM */ + ["\uFBEB", "\uFBEB"], /* ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH ALEF FINAL FORM */ + ["\uFBEC", "\uFBEC"], /* ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH AE ISOLATED FORM */ + ["\uFBED", "\uFBED"], /* ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH AE FINAL FORM */ + ["\uFBEE", "\uFBEE"], /* ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH WAW ISOLATED FORM */ + ["\uFBEF", "\uFBEF"], /* ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH WAW FINAL FORM */ + ["\uFBF0", "\uFBF0"], /* ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH U ISOLATED FORM */ + ["\uFBF1", "\uFBF1"], /* ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH U FINAL FORM */ + ["\uFBF2", "\uFBF2"], /* ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH OE ISOLATED FORM */ + ["\uFBF3", "\uFBF3"], /* ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH OE FINAL FORM */ + ["\uFBF4", "\uFBF4"], /* ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH YU ISOLATED FORM */ + ["\uFBF5", "\uFBF5"], /* ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH YU FINAL FORM */ + ["\uFBF6", "\uFBF6"], /* ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH E ISOLATED FORM */ + ["\uFBF7", "\uFBF7"], /* ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH E FINAL FORM */ + ["\uFBF8", "\uFBF8"], /* ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH E INITIAL FORM */ + ["\uFBF9", "\uFBF9"], /* ARABIC LIGATURE UIGHUR KIRGHIZ YEH WITH HAMZA ABOVE WITH ALEF MAKSURA ISOLATED FORM */ + ["\uFBFA", "\uFBFA"], /* ARABIC LIGATURE UIGHUR KIRGHIZ YEH WITH HAMZA ABOVE WITH ALEF MAKSURA FINAL FORM */ + ["\uFBFB", "\uFBFB"], /* ARABIC LIGATURE UIGHUR KIRGHIZ YEH WITH HAMZA ABOVE WITH ALEF MAKSURA INITIAL FORM */ + ["\uFBFC", "\uFBFC"], /* ARABIC LETTER FARSI YEH ISOLATED FORM */ + ["\uFBFD", "\uFBFD"], /* ARABIC LETTER FARSI YEH FINAL FORM */ + ["\uFBFE", "\uFBFE"], /* ARABIC LETTER FARSI YEH INITIAL FORM */ + ["\uFBFF", "\uFBFF"], /* ARABIC LETTER FARSI YEH MEDIAL FORM */ + ["\uFC00", "\uFC00"], /* ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH JEEM ISOLATED FORM */ + ["\uFC01", "\uFC01"], /* ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH HAH ISOLATED FORM */ + ["\uFC02", "\uFC02"], /* ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH MEEM ISOLATED FORM */ + ["\uFC03", "\uFC03"], /* ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH ALEF MAKSURA ISOLATED FORM */ + ["\uFC04", "\uFC04"], /* ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH YEH ISOLATED FORM */ + ["\uFC05", "\uFC05"], /* ARABIC LIGATURE BEH WITH JEEM ISOLATED FORM */ + ["\uFC06", "\uFC06"], /* ARABIC LIGATURE BEH WITH HAH ISOLATED FORM */ + ["\uFC07", "\uFC07"], /* ARABIC LIGATURE BEH WITH KHAH ISOLATED FORM */ + ["\uFC08", "\uFC08"], /* ARABIC LIGATURE BEH WITH MEEM ISOLATED FORM */ + ["\uFC09", "\uFC09"], /* ARABIC LIGATURE BEH WITH ALEF MAKSURA ISOLATED FORM */ + ["\uFC0A", "\uFC0A"], /* ARABIC LIGATURE BEH WITH YEH ISOLATED FORM */ + ["\uFC0B", "\uFC0B"], /* ARABIC LIGATURE TEH WITH JEEM ISOLATED FORM */ + ["\uFC0C", "\uFC0C"], /* ARABIC LIGATURE TEH WITH HAH ISOLATED FORM */ + ["\uFC0D", "\uFC0D"], /* ARABIC LIGATURE TEH WITH KHAH ISOLATED FORM */ + ["\uFC0E", "\uFC0E"], /* ARABIC LIGATURE TEH WITH MEEM ISOLATED FORM */ + ["\uFC0F", "\uFC0F"], /* ARABIC LIGATURE TEH WITH ALEF MAKSURA ISOLATED FORM */ + ["\uFC10", "\uFC10"], /* ARABIC LIGATURE TEH WITH YEH ISOLATED FORM */ + ["\uFC11", "\uFC11"], /* ARABIC LIGATURE THEH WITH JEEM ISOLATED FORM */ + ["\uFC12", "\uFC12"], /* ARABIC LIGATURE THEH WITH MEEM ISOLATED FORM */ + ["\uFC13", "\uFC13"], /* ARABIC LIGATURE THEH WITH ALEF MAKSURA ISOLATED FORM */ + ["\uFC14", "\uFC14"], /* ARABIC LIGATURE THEH WITH YEH ISOLATED FORM */ + ["\uFC15", "\uFC15"], /* ARABIC LIGATURE JEEM WITH HAH ISOLATED FORM */ + ["\uFC16", "\uFC16"], /* ARABIC LIGATURE JEEM WITH MEEM ISOLATED FORM */ + ["\uFC17", "\uFC17"], /* ARABIC LIGATURE HAH WITH JEEM ISOLATED FORM */ + ["\uFC18", "\uFC18"], /* ARABIC LIGATURE HAH WITH MEEM ISOLATED FORM */ + ["\uFC19", "\uFC19"], /* ARABIC LIGATURE KHAH WITH JEEM ISOLATED FORM */ + ["\uFC1A", "\uFC1A"], /* ARABIC LIGATURE KHAH WITH HAH ISOLATED FORM */ + ["\uFC1B", "\uFC1B"], /* ARABIC LIGATURE KHAH WITH MEEM ISOLATED FORM */ + ["\uFC1C", "\uFC1C"], /* ARABIC LIGATURE SEEN WITH JEEM ISOLATED FORM */ + ["\uFC1D", "\uFC1D"], /* ARABIC LIGATURE SEEN WITH HAH ISOLATED FORM */ + ["\uFC1E", "\uFC1E"], /* ARABIC LIGATURE SEEN WITH KHAH ISOLATED FORM */ + ["\uFC1F", "\uFC1F"], /* ARABIC LIGATURE SEEN WITH MEEM ISOLATED FORM */ + ["\uFC20", "\uFC20"], /* ARABIC LIGATURE SAD WITH HAH ISOLATED FORM */ + ["\uFC21", "\uFC21"], /* ARABIC LIGATURE SAD WITH MEEM ISOLATED FORM */ + ["\uFC22", "\uFC22"], /* ARABIC LIGATURE DAD WITH JEEM ISOLATED FORM */ + ["\uFC23", "\uFC23"], /* ARABIC LIGATURE DAD WITH HAH ISOLATED FORM */ + ["\uFC24", "\uFC24"], /* ARABIC LIGATURE DAD WITH KHAH ISOLATED FORM */ + ["\uFC25", "\uFC25"], /* ARABIC LIGATURE DAD WITH MEEM ISOLATED FORM */ + ["\uFC26", "\uFC26"], /* ARABIC LIGATURE TAH WITH HAH ISOLATED FORM */ + ["\uFC27", "\uFC27"], /* ARABIC LIGATURE TAH WITH MEEM ISOLATED FORM */ + ["\uFC28", "\uFC28"], /* ARABIC LIGATURE ZAH WITH MEEM ISOLATED FORM */ + ["\uFC29", "\uFC29"], /* ARABIC LIGATURE AIN WITH JEEM ISOLATED FORM */ + ["\uFC2A", "\uFC2A"], /* ARABIC LIGATURE AIN WITH MEEM ISOLATED FORM */ + ["\uFC2B", "\uFC2B"], /* ARABIC LIGATURE GHAIN WITH JEEM ISOLATED FORM */ + ["\uFC2C", "\uFC2C"], /* ARABIC LIGATURE GHAIN WITH MEEM ISOLATED FORM */ + ["\uFC2D", "\uFC2D"], /* ARABIC LIGATURE FEH WITH JEEM ISOLATED FORM */ + ["\uFC2E", "\uFC2E"], /* ARABIC LIGATURE FEH WITH HAH ISOLATED FORM */ + ["\uFC2F", "\uFC2F"], /* ARABIC LIGATURE FEH WITH KHAH ISOLATED FORM */ + ["\uFC30", "\uFC30"], /* ARABIC LIGATURE FEH WITH MEEM ISOLATED FORM */ + ["\uFC31", "\uFC31"], /* ARABIC LIGATURE FEH WITH ALEF MAKSURA ISOLATED FORM */ + ["\uFC32", "\uFC32"], /* ARABIC LIGATURE FEH WITH YEH ISOLATED FORM */ + ["\uFC33", "\uFC33"], /* ARABIC LIGATURE QAF WITH HAH ISOLATED FORM */ + ["\uFC34", "\uFC34"], /* ARABIC LIGATURE QAF WITH MEEM ISOLATED FORM */ + ["\uFC35", "\uFC35"], /* ARABIC LIGATURE QAF WITH ALEF MAKSURA ISOLATED FORM */ + ["\uFC36", "\uFC36"], /* ARABIC LIGATURE QAF WITH YEH ISOLATED FORM */ + ["\uFC37", "\uFC37"], /* ARABIC LIGATURE KAF WITH ALEF ISOLATED FORM */ + ["\uFC38", "\uFC38"], /* ARABIC LIGATURE KAF WITH JEEM ISOLATED FORM */ + ["\uFC39", "\uFC39"], /* ARABIC LIGATURE KAF WITH HAH ISOLATED FORM */ + ["\uFC3A", "\uFC3A"], /* ARABIC LIGATURE KAF WITH KHAH ISOLATED FORM */ + ["\uFC3B", "\uFC3B"], /* ARABIC LIGATURE KAF WITH LAM ISOLATED FORM */ + ["\uFC3C", "\uFC3C"], /* ARABIC LIGATURE KAF WITH MEEM ISOLATED FORM */ + ["\uFC3D", "\uFC3D"], /* ARABIC LIGATURE KAF WITH ALEF MAKSURA ISOLATED FORM */ + ["\uFC3E", "\uFC3E"], /* ARABIC LIGATURE KAF WITH YEH ISOLATED FORM */ + ["\uFC3F", "\uFC3F"], /* ARABIC LIGATURE LAM WITH JEEM ISOLATED FORM */ + ["\uFC40", "\uFC40"], /* ARABIC LIGATURE LAM WITH HAH ISOLATED FORM */ + ["\uFC41", "\uFC41"], /* ARABIC LIGATURE LAM WITH KHAH ISOLATED FORM */ + ["\uFC42", "\uFC42"], /* ARABIC LIGATURE LAM WITH MEEM ISOLATED FORM */ + ["\uFC43", "\uFC43"], /* ARABIC LIGATURE LAM WITH ALEF MAKSURA ISOLATED FORM */ + ["\uFC44", "\uFC44"], /* ARABIC LIGATURE LAM WITH YEH ISOLATED FORM */ + ["\uFC45", "\uFC45"], /* ARABIC LIGATURE MEEM WITH JEEM ISOLATED FORM */ + ["\uFC46", "\uFC46"], /* ARABIC LIGATURE MEEM WITH HAH ISOLATED FORM */ + ["\uFC47", "\uFC47"], /* ARABIC LIGATURE MEEM WITH KHAH ISOLATED FORM */ + ["\uFC48", "\uFC48"], /* ARABIC LIGATURE MEEM WITH MEEM ISOLATED FORM */ + ["\uFC49", "\uFC49"], /* ARABIC LIGATURE MEEM WITH ALEF MAKSURA ISOLATED FORM */ + ["\uFC4A", "\uFC4A"], /* ARABIC LIGATURE MEEM WITH YEH ISOLATED FORM */ + ["\uFC4B", "\uFC4B"], /* ARABIC LIGATURE NOON WITH JEEM ISOLATED FORM */ + ["\uFC4C", "\uFC4C"], /* ARABIC LIGATURE NOON WITH HAH ISOLATED FORM */ + ["\uFC4D", "\uFC4D"], /* ARABIC LIGATURE NOON WITH KHAH ISOLATED FORM */ + ["\uFC4E", "\uFC4E"], /* ARABIC LIGATURE NOON WITH MEEM ISOLATED FORM */ + ["\uFC4F", "\uFC4F"], /* ARABIC LIGATURE NOON WITH ALEF MAKSURA ISOLATED FORM */ + ["\uFC50", "\uFC50"], /* ARABIC LIGATURE NOON WITH YEH ISOLATED FORM */ + ["\uFC51", "\uFC51"], /* ARABIC LIGATURE HEH WITH JEEM ISOLATED FORM */ + ["\uFC52", "\uFC52"], /* ARABIC LIGATURE HEH WITH MEEM ISOLATED FORM */ + ["\uFC53", "\uFC53"], /* ARABIC LIGATURE HEH WITH ALEF MAKSURA ISOLATED FORM */ + ["\uFC54", "\uFC54"], /* ARABIC LIGATURE HEH WITH YEH ISOLATED FORM */ + ["\uFC55", "\uFC55"], /* ARABIC LIGATURE YEH WITH JEEM ISOLATED FORM */ + ["\uFC56", "\uFC56"], /* ARABIC LIGATURE YEH WITH HAH ISOLATED FORM */ + ["\uFC57", "\uFC57"], /* ARABIC LIGATURE YEH WITH KHAH ISOLATED FORM */ + ["\uFC58", "\uFC58"], /* ARABIC LIGATURE YEH WITH MEEM ISOLATED FORM */ + ["\uFC59", "\uFC59"], /* ARABIC LIGATURE YEH WITH ALEF MAKSURA ISOLATED FORM */ + ["\uFC5A", "\uFC5A"], /* ARABIC LIGATURE YEH WITH YEH ISOLATED FORM */ + ["\uFC5B", "\uFC5B"], /* ARABIC LIGATURE THAL WITH SUPERSCRIPT ALEF ISOLATED FORM */ + ["\uFC5C", "\uFC5C"], /* ARABIC LIGATURE REH WITH SUPERSCRIPT ALEF ISOLATED FORM */ + ["\uFC5D", "\uFC5D"], /* ARABIC LIGATURE ALEF MAKSURA WITH SUPERSCRIPT ALEF ISOLATED FORM */ + ["\uFC5E", "\uFC5E"], /* ARABIC LIGATURE SHADDA WITH DAMMATAN ISOLATED FORM */ + ["\uFC5F", "\uFC5F"], /* ARABIC LIGATURE SHADDA WITH KASRATAN ISOLATED FORM */ + ["\uFC60", "\uFC60"], /* ARABIC LIGATURE SHADDA WITH FATHA ISOLATED FORM */ + ["\uFC61", "\uFC61"], /* ARABIC LIGATURE SHADDA WITH DAMMA ISOLATED FORM */ + ["\uFC62", "\uFC62"], /* ARABIC LIGATURE SHADDA WITH KASRA ISOLATED FORM */ + ["\uFC63", "\uFC63"], /* ARABIC LIGATURE SHADDA WITH SUPERSCRIPT ALEF ISOLATED FORM */ + ["\uFC64", "\uFC64"], /* ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH REH FINAL FORM */ + ["\uFC65", "\uFC65"], /* ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH ZAIN FINAL FORM */ + ["\uFC66", "\uFC66"], /* ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH MEEM FINAL FORM */ + ["\uFC67", "\uFC67"], /* ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH NOON FINAL FORM */ + ["\uFC68", "\uFC68"], /* ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH ALEF MAKSURA FINAL FORM */ + ["\uFC69", "\uFC69"], /* ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH YEH FINAL FORM */ + ["\uFC6A", "\uFC6A"], /* ARABIC LIGATURE BEH WITH REH FINAL FORM */ + ["\uFC6B", "\uFC6B"], /* ARABIC LIGATURE BEH WITH ZAIN FINAL FORM */ + ["\uFC6C", "\uFC6C"], /* ARABIC LIGATURE BEH WITH MEEM FINAL FORM */ + ["\uFC6D", "\uFC6D"], /* ARABIC LIGATURE BEH WITH NOON FINAL FORM */ + ["\uFC6E", "\uFC6E"], /* ARABIC LIGATURE BEH WITH ALEF MAKSURA FINAL FORM */ + ["\uFC6F", "\uFC6F"], /* ARABIC LIGATURE BEH WITH YEH FINAL FORM */ + ["\uFC70", "\uFC70"], /* ARABIC LIGATURE TEH WITH REH FINAL FORM */ + ["\uFC71", "\uFC71"], /* ARABIC LIGATURE TEH WITH ZAIN FINAL FORM */ + ["\uFC72", "\uFC72"], /* ARABIC LIGATURE TEH WITH MEEM FINAL FORM */ + ["\uFC73", "\uFC73"], /* ARABIC LIGATURE TEH WITH NOON FINAL FORM */ + ["\uFC74", "\uFC74"], /* ARABIC LIGATURE TEH WITH ALEF MAKSURA FINAL FORM */ + ["\uFC75", "\uFC75"], /* ARABIC LIGATURE TEH WITH YEH FINAL FORM */ + ["\uFC76", "\uFC76"], /* ARABIC LIGATURE THEH WITH REH FINAL FORM */ + ["\uFC77", "\uFC77"], /* ARABIC LIGATURE THEH WITH ZAIN FINAL FORM */ + ["\uFC78", "\uFC78"], /* ARABIC LIGATURE THEH WITH MEEM FINAL FORM */ + ["\uFC79", "\uFC79"], /* ARABIC LIGATURE THEH WITH NOON FINAL FORM */ + ["\uFC7A", "\uFC7A"], /* ARABIC LIGATURE THEH WITH ALEF MAKSURA FINAL FORM */ + ["\uFC7B", "\uFC7B"], /* ARABIC LIGATURE THEH WITH YEH FINAL FORM */ + ["\uFC7C", "\uFC7C"], /* ARABIC LIGATURE FEH WITH ALEF MAKSURA FINAL FORM */ + ["\uFC7D", "\uFC7D"], /* ARABIC LIGATURE FEH WITH YEH FINAL FORM */ + ["\uFC7E", "\uFC7E"], /* ARABIC LIGATURE QAF WITH ALEF MAKSURA FINAL FORM */ + ["\uFC7F", "\uFC7F"], /* ARABIC LIGATURE QAF WITH YEH FINAL FORM */ + ["\uFC80", "\uFC80"], /* ARABIC LIGATURE KAF WITH ALEF FINAL FORM */ + ["\uFC81", "\uFC81"], /* ARABIC LIGATURE KAF WITH LAM FINAL FORM */ + ["\uFC82", "\uFC82"], /* ARABIC LIGATURE KAF WITH MEEM FINAL FORM */ + ["\uFC83", "\uFC83"], /* ARABIC LIGATURE KAF WITH ALEF MAKSURA FINAL FORM */ + ["\uFC84", "\uFC84"], /* ARABIC LIGATURE KAF WITH YEH FINAL FORM */ + ["\uFC85", "\uFC85"], /* ARABIC LIGATURE LAM WITH MEEM FINAL FORM */ + ["\uFC86", "\uFC86"], /* ARABIC LIGATURE LAM WITH ALEF MAKSURA FINAL FORM */ + ["\uFC87", "\uFC87"], /* ARABIC LIGATURE LAM WITH YEH FINAL FORM */ + ["\uFC88", "\uFC88"], /* ARABIC LIGATURE MEEM WITH ALEF FINAL FORM */ + ["\uFC89", "\uFC89"], /* ARABIC LIGATURE MEEM WITH MEEM FINAL FORM */ + ["\uFC8A", "\uFC8A"], /* ARABIC LIGATURE NOON WITH REH FINAL FORM */ + ["\uFC8B", "\uFC8B"], /* ARABIC LIGATURE NOON WITH ZAIN FINAL FORM */ + ["\uFC8C", "\uFC8C"], /* ARABIC LIGATURE NOON WITH MEEM FINAL FORM */ + ["\uFC8D", "\uFC8D"], /* ARABIC LIGATURE NOON WITH NOON FINAL FORM */ + ["\uFC8E", "\uFC8E"], /* ARABIC LIGATURE NOON WITH ALEF MAKSURA FINAL FORM */ + ["\uFC8F", "\uFC8F"], /* ARABIC LIGATURE NOON WITH YEH FINAL FORM */ + ["\uFC90", "\uFC90"], /* ARABIC LIGATURE ALEF MAKSURA WITH SUPERSCRIPT ALEF FINAL FORM */ + ["\uFC91", "\uFC91"], /* ARABIC LIGATURE YEH WITH REH FINAL FORM */ + ["\uFC92", "\uFC92"], /* ARABIC LIGATURE YEH WITH ZAIN FINAL FORM */ + ["\uFC93", "\uFC93"], /* ARABIC LIGATURE YEH WITH MEEM FINAL FORM */ + ["\uFC94", "\uFC94"], /* ARABIC LIGATURE YEH WITH NOON FINAL FORM */ + ["\uFC95", "\uFC95"], /* ARABIC LIGATURE YEH WITH ALEF MAKSURA FINAL FORM */ + ["\uFC96", "\uFC96"], /* ARABIC LIGATURE YEH WITH YEH FINAL FORM */ + ["\uFC97", "\uFC97"], /* ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH JEEM INITIAL FORM */ + ["\uFC98", "\uFC98"], /* ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH HAH INITIAL FORM */ + ["\uFC99", "\uFC99"], /* ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH KHAH INITIAL FORM */ + ["\uFC9A", "\uFC9A"], /* ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH MEEM INITIAL FORM */ + ["\uFC9B", "\uFC9B"], /* ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH HEH INITIAL FORM */ + ["\uFC9C", "\uFC9C"], /* ARABIC LIGATURE BEH WITH JEEM INITIAL FORM */ + ["\uFC9D", "\uFC9D"], /* ARABIC LIGATURE BEH WITH HAH INITIAL FORM */ + ["\uFC9E", "\uFC9E"], /* ARABIC LIGATURE BEH WITH KHAH INITIAL FORM */ + ["\uFC9F", "\uFC9F"], /* ARABIC LIGATURE BEH WITH MEEM INITIAL FORM */ + ["\uFCA0", "\uFCA0"], /* ARABIC LIGATURE BEH WITH HEH INITIAL FORM */ + ["\uFCA1", "\uFCA1"], /* ARABIC LIGATURE TEH WITH JEEM INITIAL FORM */ + ["\uFCA2", "\uFCA2"], /* ARABIC LIGATURE TEH WITH HAH INITIAL FORM */ + ["\uFCA3", "\uFCA3"], /* ARABIC LIGATURE TEH WITH KHAH INITIAL FORM */ + ["\uFCA4", "\uFCA4"], /* ARABIC LIGATURE TEH WITH MEEM INITIAL FORM */ + ["\uFCA5", "\uFCA5"], /* ARABIC LIGATURE TEH WITH HEH INITIAL FORM */ + ["\uFCA6", "\uFCA6"], /* ARABIC LIGATURE THEH WITH MEEM INITIAL FORM */ + ["\uFCA7", "\uFCA7"], /* ARABIC LIGATURE JEEM WITH HAH INITIAL FORM */ + ["\uFCA8", "\uFCA8"], /* ARABIC LIGATURE JEEM WITH MEEM INITIAL FORM */ + ["\uFCA9", "\uFCA9"], /* ARABIC LIGATURE HAH WITH JEEM INITIAL FORM */ + ["\uFCAA", "\uFCAA"], /* ARABIC LIGATURE HAH WITH MEEM INITIAL FORM */ + ["\uFCAB", "\uFCAB"], /* ARABIC LIGATURE KHAH WITH JEEM INITIAL FORM */ + ["\uFCAC", "\uFCAC"], /* ARABIC LIGATURE KHAH WITH MEEM INITIAL FORM */ + ["\uFCAD", "\uFCAD"], /* ARABIC LIGATURE SEEN WITH JEEM INITIAL FORM */ + ["\uFCAE", "\uFCAE"], /* ARABIC LIGATURE SEEN WITH HAH INITIAL FORM */ + ["\uFCAF", "\uFCAF"], /* ARABIC LIGATURE SEEN WITH KHAH INITIAL FORM */ + ["\uFCB0", "\uFCB0"], /* ARABIC LIGATURE SEEN WITH MEEM INITIAL FORM */ + ["\uFCB1", "\uFCB1"], /* ARABIC LIGATURE SAD WITH HAH INITIAL FORM */ + ["\uFCB2", "\uFCB2"], /* ARABIC LIGATURE SAD WITH KHAH INITIAL FORM */ + ["\uFCB3", "\uFCB3"], /* ARABIC LIGATURE SAD WITH MEEM INITIAL FORM */ + ["\uFCB4", "\uFCB4"], /* ARABIC LIGATURE DAD WITH JEEM INITIAL FORM */ + ["\uFCB5", "\uFCB5"], /* ARABIC LIGATURE DAD WITH HAH INITIAL FORM */ + ["\uFCB6", "\uFCB6"], /* ARABIC LIGATURE DAD WITH KHAH INITIAL FORM */ + ["\uFCB7", "\uFCB7"], /* ARABIC LIGATURE DAD WITH MEEM INITIAL FORM */ + ["\uFCB8", "\uFCB8"], /* ARABIC LIGATURE TAH WITH HAH INITIAL FORM */ + ["\uFCB9", "\uFCB9"], /* ARABIC LIGATURE ZAH WITH MEEM INITIAL FORM */ + ["\uFCBA", "\uFCBA"], /* ARABIC LIGATURE AIN WITH JEEM INITIAL FORM */ + ["\uFCBB", "\uFCBB"], /* ARABIC LIGATURE AIN WITH MEEM INITIAL FORM */ + ["\uFCBC", "\uFCBC"], /* ARABIC LIGATURE GHAIN WITH JEEM INITIAL FORM */ + ["\uFCBD", "\uFCBD"], /* ARABIC LIGATURE GHAIN WITH MEEM INITIAL FORM */ + ["\uFCBE", "\uFCBE"], /* ARABIC LIGATURE FEH WITH JEEM INITIAL FORM */ + ["\uFCBF", "\uFCBF"], /* ARABIC LIGATURE FEH WITH HAH INITIAL FORM */ + ["\uFCC0", "\uFCC0"], /* ARABIC LIGATURE FEH WITH KHAH INITIAL FORM */ + ["\uFCC1", "\uFCC1"], /* ARABIC LIGATURE FEH WITH MEEM INITIAL FORM */ + ["\uFCC2", "\uFCC2"], /* ARABIC LIGATURE QAF WITH HAH INITIAL FORM */ + ["\uFCC3", "\uFCC3"], /* ARABIC LIGATURE QAF WITH MEEM INITIAL FORM */ + ["\uFCC4", "\uFCC4"], /* ARABIC LIGATURE KAF WITH JEEM INITIAL FORM */ + ["\uFCC5", "\uFCC5"], /* ARABIC LIGATURE KAF WITH HAH INITIAL FORM */ + ["\uFCC6", "\uFCC6"], /* ARABIC LIGATURE KAF WITH KHAH INITIAL FORM */ + ["\uFCC7", "\uFCC7"], /* ARABIC LIGATURE KAF WITH LAM INITIAL FORM */ + ["\uFCC8", "\uFCC8"], /* ARABIC LIGATURE KAF WITH MEEM INITIAL FORM */ + ["\uFCC9", "\uFCC9"], /* ARABIC LIGATURE LAM WITH JEEM INITIAL FORM */ + ["\uFCCA", "\uFCCA"], /* ARABIC LIGATURE LAM WITH HAH INITIAL FORM */ + ["\uFCCB", "\uFCCB"], /* ARABIC LIGATURE LAM WITH KHAH INITIAL FORM */ + ["\uFCCC", "\uFCCC"], /* ARABIC LIGATURE LAM WITH MEEM INITIAL FORM */ + ["\uFCCD", "\uFCCD"], /* ARABIC LIGATURE LAM WITH HEH INITIAL FORM */ + ["\uFCCE", "\uFCCE"], /* ARABIC LIGATURE MEEM WITH JEEM INITIAL FORM */ + ["\uFCCF", "\uFCCF"], /* ARABIC LIGATURE MEEM WITH HAH INITIAL FORM */ + ["\uFCD0", "\uFCD0"], /* ARABIC LIGATURE MEEM WITH KHAH INITIAL FORM */ + ["\uFCD1", "\uFCD1"], /* ARABIC LIGATURE MEEM WITH MEEM INITIAL FORM */ + ["\uFCD2", "\uFCD2"], /* ARABIC LIGATURE NOON WITH JEEM INITIAL FORM */ + ["\uFCD3", "\uFCD3"], /* ARABIC LIGATURE NOON WITH HAH INITIAL FORM */ + ["\uFCD4", "\uFCD4"], /* ARABIC LIGATURE NOON WITH KHAH INITIAL FORM */ + ["\uFCD5", "\uFCD5"], /* ARABIC LIGATURE NOON WITH MEEM INITIAL FORM */ + ["\uFCD6", "\uFCD6"], /* ARABIC LIGATURE NOON WITH HEH INITIAL FORM */ + ["\uFCD7", "\uFCD7"], /* ARABIC LIGATURE HEH WITH JEEM INITIAL FORM */ + ["\uFCD8", "\uFCD8"], /* ARABIC LIGATURE HEH WITH MEEM INITIAL FORM */ + ["\uFCD9", "\uFCD9"], /* ARABIC LIGATURE HEH WITH SUPERSCRIPT ALEF INITIAL FORM */ + ["\uFCDA", "\uFCDA"], /* ARABIC LIGATURE YEH WITH JEEM INITIAL FORM */ + ["\uFCDB", "\uFCDB"], /* ARABIC LIGATURE YEH WITH HAH INITIAL FORM */ + ["\uFCDC", "\uFCDC"], /* ARABIC LIGATURE YEH WITH KHAH INITIAL FORM */ + ["\uFCDD", "\uFCDD"], /* ARABIC LIGATURE YEH WITH MEEM INITIAL FORM */ + ["\uFCDE", "\uFCDE"], /* ARABIC LIGATURE YEH WITH HEH INITIAL FORM */ + ["\uFCDF", "\uFCDF"], /* ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH MEEM MEDIAL FORM */ + ["\uFCE0", "\uFCE0"], /* ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH HEH MEDIAL FORM */ + ["\uFCE1", "\uFCE1"], /* ARABIC LIGATURE BEH WITH MEEM MEDIAL FORM */ + ["\uFCE2", "\uFCE2"], /* ARABIC LIGATURE BEH WITH HEH MEDIAL FORM */ + ["\uFCE3", "\uFCE3"], /* ARABIC LIGATURE TEH WITH MEEM MEDIAL FORM */ + ["\uFCE4", "\uFCE4"], /* ARABIC LIGATURE TEH WITH HEH MEDIAL FORM */ + ["\uFCE5", "\uFCE5"], /* ARABIC LIGATURE THEH WITH MEEM MEDIAL FORM */ + ["\uFCE6", "\uFCE6"], /* ARABIC LIGATURE THEH WITH HEH MEDIAL FORM */ + ["\uFCE7", "\uFCE7"], /* ARABIC LIGATURE SEEN WITH MEEM MEDIAL FORM */ + ["\uFCE8", "\uFCE8"], /* ARABIC LIGATURE SEEN WITH HEH MEDIAL FORM */ + ["\uFCE9", "\uFCE9"], /* ARABIC LIGATURE SHEEN WITH MEEM MEDIAL FORM */ + ["\uFCEA", "\uFCEA"], /* ARABIC LIGATURE SHEEN WITH HEH MEDIAL FORM */ + ["\uFCEB", "\uFCEB"], /* ARABIC LIGATURE KAF WITH LAM MEDIAL FORM */ + ["\uFCEC", "\uFCEC"], /* ARABIC LIGATURE KAF WITH MEEM MEDIAL FORM */ + ["\uFCED", "\uFCED"], /* ARABIC LIGATURE LAM WITH MEEM MEDIAL FORM */ + ["\uFCEE", "\uFCEE"], /* ARABIC LIGATURE NOON WITH MEEM MEDIAL FORM */ + ["\uFCEF", "\uFCEF"], /* ARABIC LIGATURE NOON WITH HEH MEDIAL FORM */ + ["\uFCF0", "\uFCF0"], /* ARABIC LIGATURE YEH WITH MEEM MEDIAL FORM */ + ["\uFCF1", "\uFCF1"], /* ARABIC LIGATURE YEH WITH HEH MEDIAL FORM */ + ["\uFCF2", "\uFCF2"], /* ARABIC LIGATURE SHADDA WITH FATHA MEDIAL FORM */ + ["\uFCF3", "\uFCF3"], /* ARABIC LIGATURE SHADDA WITH DAMMA MEDIAL FORM */ + ["\uFCF4", "\uFCF4"], /* ARABIC LIGATURE SHADDA WITH KASRA MEDIAL FORM */ + ["\uFCF5", "\uFCF5"], /* ARABIC LIGATURE TAH WITH ALEF MAKSURA ISOLATED FORM */ + ["\uFCF6", "\uFCF6"], /* ARABIC LIGATURE TAH WITH YEH ISOLATED FORM */ + ["\uFCF7", "\uFCF7"], /* ARABIC LIGATURE AIN WITH ALEF MAKSURA ISOLATED FORM */ + ["\uFCF8", "\uFCF8"], /* ARABIC LIGATURE AIN WITH YEH ISOLATED FORM */ + ["\uFCF9", "\uFCF9"], /* ARABIC LIGATURE GHAIN WITH ALEF MAKSURA ISOLATED FORM */ + ["\uFCFA", "\uFCFA"], /* ARABIC LIGATURE GHAIN WITH YEH ISOLATED FORM */ + ["\uFCFB", "\uFCFB"], /* ARABIC LIGATURE SEEN WITH ALEF MAKSURA ISOLATED FORM */ + ["\uFCFC", "\uFCFC"], /* ARABIC LIGATURE SEEN WITH YEH ISOLATED FORM */ + ["\uFCFD", "\uFCFD"], /* ARABIC LIGATURE SHEEN WITH ALEF MAKSURA ISOLATED FORM */ + ["\uFCFE", "\uFCFE"], /* ARABIC LIGATURE SHEEN WITH YEH ISOLATED FORM */ + ["\uFCFF", "\uFCFF"], /* ARABIC LIGATURE HAH WITH ALEF MAKSURA ISOLATED FORM */ + ["\uFD00", "\uFD00"], /* ARABIC LIGATURE HAH WITH YEH ISOLATED FORM */ + ["\uFD01", "\uFD01"], /* ARABIC LIGATURE JEEM WITH ALEF MAKSURA ISOLATED FORM */ + ["\uFD02", "\uFD02"], /* ARABIC LIGATURE JEEM WITH YEH ISOLATED FORM */ + ["\uFD03", "\uFD03"], /* ARABIC LIGATURE KHAH WITH ALEF MAKSURA ISOLATED FORM */ + ["\uFD04", "\uFD04"], /* ARABIC LIGATURE KHAH WITH YEH ISOLATED FORM */ + ["\uFD05", "\uFD05"], /* ARABIC LIGATURE SAD WITH ALEF MAKSURA ISOLATED FORM */ + ["\uFD06", "\uFD06"], /* ARABIC LIGATURE SAD WITH YEH ISOLATED FORM */ + ["\uFD07", "\uFD07"], /* ARABIC LIGATURE DAD WITH ALEF MAKSURA ISOLATED FORM */ + ["\uFD08", "\uFD08"], /* ARABIC LIGATURE DAD WITH YEH ISOLATED FORM */ + ["\uFD09", "\uFD09"], /* ARABIC LIGATURE SHEEN WITH JEEM ISOLATED FORM */ + ["\uFD0A", "\uFD0A"], /* ARABIC LIGATURE SHEEN WITH HAH ISOLATED FORM */ + ["\uFD0B", "\uFD0B"], /* ARABIC LIGATURE SHEEN WITH KHAH ISOLATED FORM */ + ["\uFD0C", "\uFD0C"], /* ARABIC LIGATURE SHEEN WITH MEEM ISOLATED FORM */ + ["\uFD0D", "\uFD0D"], /* ARABIC LIGATURE SHEEN WITH REH ISOLATED FORM */ + ["\uFD0E", "\uFD0E"], /* ARABIC LIGATURE SEEN WITH REH ISOLATED FORM */ + ["\uFD0F", "\uFD0F"], /* ARABIC LIGATURE SAD WITH REH ISOLATED FORM */ + ["\uFD10", "\uFD10"], /* ARABIC LIGATURE DAD WITH REH ISOLATED FORM */ + ["\uFD11", "\uFD11"], /* ARABIC LIGATURE TAH WITH ALEF MAKSURA FINAL FORM */ + ["\uFD12", "\uFD12"], /* ARABIC LIGATURE TAH WITH YEH FINAL FORM */ + ["\uFD13", "\uFD13"], /* ARABIC LIGATURE AIN WITH ALEF MAKSURA FINAL FORM */ + ["\uFD14", "\uFD14"], /* ARABIC LIGATURE AIN WITH YEH FINAL FORM */ + ["\uFD15", "\uFD15"], /* ARABIC LIGATURE GHAIN WITH ALEF MAKSURA FINAL FORM */ + ["\uFD16", "\uFD16"], /* ARABIC LIGATURE GHAIN WITH YEH FINAL FORM */ + ["\uFD17", "\uFD17"], /* ARABIC LIGATURE SEEN WITH ALEF MAKSURA FINAL FORM */ + ["\uFD18", "\uFD18"], /* ARABIC LIGATURE SEEN WITH YEH FINAL FORM */ + ["\uFD19", "\uFD19"], /* ARABIC LIGATURE SHEEN WITH ALEF MAKSURA FINAL FORM */ + ["\uFD1A", "\uFD1A"], /* ARABIC LIGATURE SHEEN WITH YEH FINAL FORM */ + ["\uFD1B", "\uFD1B"], /* ARABIC LIGATURE HAH WITH ALEF MAKSURA FINAL FORM */ + ["\uFD1C", "\uFD1C"], /* ARABIC LIGATURE HAH WITH YEH FINAL FORM */ + ["\uFD1D", "\uFD1D"], /* ARABIC LIGATURE JEEM WITH ALEF MAKSURA FINAL FORM */ + ["\uFD1E", "\uFD1E"], /* ARABIC LIGATURE JEEM WITH YEH FINAL FORM */ + ["\uFD1F", "\uFD1F"], /* ARABIC LIGATURE KHAH WITH ALEF MAKSURA FINAL FORM */ + ["\uFD20", "\uFD20"], /* ARABIC LIGATURE KHAH WITH YEH FINAL FORM */ + ["\uFD21", "\uFD21"], /* ARABIC LIGATURE SAD WITH ALEF MAKSURA FINAL FORM */ + ["\uFD22", "\uFD22"], /* ARABIC LIGATURE SAD WITH YEH FINAL FORM */ + ["\uFD23", "\uFD23"], /* ARABIC LIGATURE DAD WITH ALEF MAKSURA FINAL FORM */ + ["\uFD24", "\uFD24"], /* ARABIC LIGATURE DAD WITH YEH FINAL FORM */ + ["\uFD25", "\uFD25"], /* ARABIC LIGATURE SHEEN WITH JEEM FINAL FORM */ + ["\uFD26", "\uFD26"], /* ARABIC LIGATURE SHEEN WITH HAH FINAL FORM */ + ["\uFD27", "\uFD27"], /* ARABIC LIGATURE SHEEN WITH KHAH FINAL FORM */ + ["\uFD28", "\uFD28"], /* ARABIC LIGATURE SHEEN WITH MEEM FINAL FORM */ + ["\uFD29", "\uFD29"], /* ARABIC LIGATURE SHEEN WITH REH FINAL FORM */ + ["\uFD2A", "\uFD2A"], /* ARABIC LIGATURE SEEN WITH REH FINAL FORM */ + ["\uFD2B", "\uFD2B"], /* ARABIC LIGATURE SAD WITH REH FINAL FORM */ + ["\uFD2C", "\uFD2C"], /* ARABIC LIGATURE DAD WITH REH FINAL FORM */ + ["\uFD2D", "\uFD2D"], /* ARABIC LIGATURE SHEEN WITH JEEM INITIAL FORM */ + ["\uFD2E", "\uFD2E"], /* ARABIC LIGATURE SHEEN WITH HAH INITIAL FORM */ + ["\uFD2F", "\uFD2F"], /* ARABIC LIGATURE SHEEN WITH KHAH INITIAL FORM */ + ["\uFD30", "\uFD30"], /* ARABIC LIGATURE SHEEN WITH MEEM INITIAL FORM */ + ["\uFD31", "\uFD31"], /* ARABIC LIGATURE SEEN WITH HEH INITIAL FORM */ + ["\uFD32", "\uFD32"], /* ARABIC LIGATURE SHEEN WITH HEH INITIAL FORM */ + ["\uFD33", "\uFD33"], /* ARABIC LIGATURE TAH WITH MEEM INITIAL FORM */ + ["\uFD34", "\uFD34"], /* ARABIC LIGATURE SEEN WITH JEEM MEDIAL FORM */ + ["\uFD35", "\uFD35"], /* ARABIC LIGATURE SEEN WITH HAH MEDIAL FORM */ + ["\uFD36", "\uFD36"], /* ARABIC LIGATURE SEEN WITH KHAH MEDIAL FORM */ + ["\uFD37", "\uFD37"], /* ARABIC LIGATURE SHEEN WITH JEEM MEDIAL FORM */ + ["\uFD38", "\uFD38"], /* ARABIC LIGATURE SHEEN WITH HAH MEDIAL FORM */ + ["\uFD39", "\uFD39"], /* ARABIC LIGATURE SHEEN WITH KHAH MEDIAL FORM */ + ["\uFD3A", "\uFD3A"], /* ARABIC LIGATURE TAH WITH MEEM MEDIAL FORM */ + ["\uFD3B", "\uFD3B"], /* ARABIC LIGATURE ZAH WITH MEEM MEDIAL FORM */ + ["\uFD3C", "\uFD3C"], /* ARABIC LIGATURE ALEF WITH FATHATAN FINAL FORM */ + ["\uFD3D", "\uFD3D"], /* ARABIC LIGATURE ALEF WITH FATHATAN ISOLATED FORM */ + ["\uFD3E", "\uFD3E"], /* ORNATE LEFT PARENTHESIS */ + ["\uFD3F", "\uFD3F"], /* ORNATE RIGHT PARENTHESIS */ + ["\uFD40", "\uFD40"], /* ARABIC LIGATURE RAHIMAHU ALLAAH */ + ["\uFD41", "\uFD41"], /* ARABIC LIGATURE RADI ALLAAHU ANH */ + ["\uFD42", "\uFD42"], /* ARABIC LIGATURE RADI ALLAAHU ANHAA */ + ["\uFD43", "\uFD43"], /* ARABIC LIGATURE RADI ALLAAHU ANHUM */ + ["\uFD44", "\uFD44"], /* ARABIC LIGATURE RADI ALLAAHU ANHUMAA */ + ["\uFD45", "\uFD45"], /* ARABIC LIGATURE RADI ALLAAHU ANHUNNA */ + ["\uFD46", "\uFD46"], /* ARABIC LIGATURE SALLALLAAHU ALAYHI WA-AALIH */ + ["\uFD47", "\uFD47"], /* ARABIC LIGATURE ALAYHI AS-SALAAM */ + ["\uFD48", "\uFD48"], /* ARABIC LIGATURE ALAYHIM AS-SALAAM */ + ["\uFD49", "\uFD49"], /* ARABIC LIGATURE ALAYHIMAA AS-SALAAM */ + ["\uFD4A", "\uFD4A"], /* ARABIC LIGATURE ALAYHI AS-SALAATU WAS-SALAAM */ + ["\uFD4B", "\uFD4B"], /* ARABIC LIGATURE QUDDISA SIRRAH */ + ["\uFD4C", "\uFD4C"], /* ARABIC LIGATURE SALLALLAHU ALAYHI WAAALIHEE WA-SALLAM */ + ["\uFD4D", "\uFD4D"], /* ARABIC LIGATURE ALAYHAA AS-SALAAM */ + ["\uFD4E", "\uFD4E"], /* ARABIC LIGATURE TABAARAKA WA-TAAALAA */ + ["\uFD4F", "\uFD4F"], /* ARABIC LIGATURE RAHIMAHUM ALLAAH */ + ["\uFD50", "\uFD50"], /* ARABIC LIGATURE TEH WITH JEEM WITH MEEM INITIAL FORM */ + ["\uFD51", "\uFD51"], /* ARABIC LIGATURE TEH WITH HAH WITH JEEM FINAL FORM */ + ["\uFD52", "\uFD52"], /* ARABIC LIGATURE TEH WITH HAH WITH JEEM INITIAL FORM */ + ["\uFD53", "\uFD53"], /* ARABIC LIGATURE TEH WITH HAH WITH MEEM INITIAL FORM */ + ["\uFD54", "\uFD54"], /* ARABIC LIGATURE TEH WITH KHAH WITH MEEM INITIAL FORM */ + ["\uFD55", "\uFD55"], /* ARABIC LIGATURE TEH WITH MEEM WITH JEEM INITIAL FORM */ + ["\uFD56", "\uFD56"], /* ARABIC LIGATURE TEH WITH MEEM WITH HAH INITIAL FORM */ + ["\uFD57", "\uFD57"], /* ARABIC LIGATURE TEH WITH MEEM WITH KHAH INITIAL FORM */ + ["\uFD58", "\uFD58"], /* ARABIC LIGATURE JEEM WITH MEEM WITH HAH FINAL FORM */ + ["\uFD59", "\uFD59"], /* ARABIC LIGATURE JEEM WITH MEEM WITH HAH INITIAL FORM */ + ["\uFD5A", "\uFD5A"], /* ARABIC LIGATURE HAH WITH MEEM WITH YEH FINAL FORM */ + ["\uFD5B", "\uFD5B"], /* ARABIC LIGATURE HAH WITH MEEM WITH ALEF MAKSURA FINAL FORM */ + ["\uFD5C", "\uFD5C"], /* ARABIC LIGATURE SEEN WITH HAH WITH JEEM INITIAL FORM */ + ["\uFD5D", "\uFD5D"], /* ARABIC LIGATURE SEEN WITH JEEM WITH HAH INITIAL FORM */ + ["\uFD5E", "\uFD5E"], /* ARABIC LIGATURE SEEN WITH JEEM WITH ALEF MAKSURA FINAL FORM */ + ["\uFD5F", "\uFD5F"], /* ARABIC LIGATURE SEEN WITH MEEM WITH HAH FINAL FORM */ + ["\uFD60", "\uFD60"], /* ARABIC LIGATURE SEEN WITH MEEM WITH HAH INITIAL FORM */ + ["\uFD61", "\uFD61"], /* ARABIC LIGATURE SEEN WITH MEEM WITH JEEM INITIAL FORM */ + ["\uFD62", "\uFD62"], /* ARABIC LIGATURE SEEN WITH MEEM WITH MEEM FINAL FORM */ + ["\uFD63", "\uFD63"], /* ARABIC LIGATURE SEEN WITH MEEM WITH MEEM INITIAL FORM */ + ["\uFD64", "\uFD64"], /* ARABIC LIGATURE SAD WITH HAH WITH HAH FINAL FORM */ + ["\uFD65", "\uFD65"], /* ARABIC LIGATURE SAD WITH HAH WITH HAH INITIAL FORM */ + ["\uFD66", "\uFD66"], /* ARABIC LIGATURE SAD WITH MEEM WITH MEEM FINAL FORM */ + ["\uFD67", "\uFD67"], /* ARABIC LIGATURE SHEEN WITH HAH WITH MEEM FINAL FORM */ + ["\uFD68", "\uFD68"], /* ARABIC LIGATURE SHEEN WITH HAH WITH MEEM INITIAL FORM */ + ["\uFD69", "\uFD69"], /* ARABIC LIGATURE SHEEN WITH JEEM WITH YEH FINAL FORM */ + ["\uFD6A", "\uFD6A"], /* ARABIC LIGATURE SHEEN WITH MEEM WITH KHAH FINAL FORM */ + ["\uFD6B", "\uFD6B"], /* ARABIC LIGATURE SHEEN WITH MEEM WITH KHAH INITIAL FORM */ + ["\uFD6C", "\uFD6C"], /* ARABIC LIGATURE SHEEN WITH MEEM WITH MEEM FINAL FORM */ + ["\uFD6D", "\uFD6D"], /* ARABIC LIGATURE SHEEN WITH MEEM WITH MEEM INITIAL FORM */ + ["\uFD6E", "\uFD6E"], /* ARABIC LIGATURE DAD WITH HAH WITH ALEF MAKSURA FINAL FORM */ + ["\uFD6F", "\uFD6F"], /* ARABIC LIGATURE DAD WITH KHAH WITH MEEM FINAL FORM */ + ["\uFD70", "\uFD70"], /* ARABIC LIGATURE DAD WITH KHAH WITH MEEM INITIAL FORM */ + ["\uFD71", "\uFD71"], /* ARABIC LIGATURE TAH WITH MEEM WITH HAH FINAL FORM */ + ["\uFD72", "\uFD72"], /* ARABIC LIGATURE TAH WITH MEEM WITH HAH INITIAL FORM */ + ["\uFD73", "\uFD73"], /* ARABIC LIGATURE TAH WITH MEEM WITH MEEM INITIAL FORM */ + ["\uFD74", "\uFD74"], /* ARABIC LIGATURE TAH WITH MEEM WITH YEH FINAL FORM */ + ["\uFD75", "\uFD75"], /* ARABIC LIGATURE AIN WITH JEEM WITH MEEM FINAL FORM */ + ["\uFD76", "\uFD76"], /* ARABIC LIGATURE AIN WITH MEEM WITH MEEM FINAL FORM */ + ["\uFD77", "\uFD77"], /* ARABIC LIGATURE AIN WITH MEEM WITH MEEM INITIAL FORM */ + ["\uFD78", "\uFD78"], /* ARABIC LIGATURE AIN WITH MEEM WITH ALEF MAKSURA FINAL FORM */ + ["\uFD79", "\uFD79"], /* ARABIC LIGATURE GHAIN WITH MEEM WITH MEEM FINAL FORM */ + ["\uFD7A", "\uFD7A"], /* ARABIC LIGATURE GHAIN WITH MEEM WITH YEH FINAL FORM */ + ["\uFD7B", "\uFD7B"], /* ARABIC LIGATURE GHAIN WITH MEEM WITH ALEF MAKSURA FINAL FORM */ + ["\uFD7C", "\uFD7C"], /* ARABIC LIGATURE FEH WITH KHAH WITH MEEM FINAL FORM */ + ["\uFD7D", "\uFD7D"], /* ARABIC LIGATURE FEH WITH KHAH WITH MEEM INITIAL FORM */ + ["\uFD7E", "\uFD7E"], /* ARABIC LIGATURE QAF WITH MEEM WITH HAH FINAL FORM */ + ["\uFD7F", "\uFD7F"], /* ARABIC LIGATURE QAF WITH MEEM WITH MEEM FINAL FORM */ + ["\uFD80", "\uFD80"], /* ARABIC LIGATURE LAM WITH HAH WITH MEEM FINAL FORM */ + ["\uFD81", "\uFD81"], /* ARABIC LIGATURE LAM WITH HAH WITH YEH FINAL FORM */ + ["\uFD82", "\uFD82"], /* ARABIC LIGATURE LAM WITH HAH WITH ALEF MAKSURA FINAL FORM */ + ["\uFD83", "\uFD83"], /* ARABIC LIGATURE LAM WITH JEEM WITH JEEM INITIAL FORM */ + ["\uFD84", "\uFD84"], /* ARABIC LIGATURE LAM WITH JEEM WITH JEEM FINAL FORM */ + ["\uFD85", "\uFD85"], /* ARABIC LIGATURE LAM WITH KHAH WITH MEEM FINAL FORM */ + ["\uFD86", "\uFD86"], /* ARABIC LIGATURE LAM WITH KHAH WITH MEEM INITIAL FORM */ + ["\uFD87", "\uFD87"], /* ARABIC LIGATURE LAM WITH MEEM WITH HAH FINAL FORM */ + ["\uFD88", "\uFD88"], /* ARABIC LIGATURE LAM WITH MEEM WITH HAH INITIAL FORM */ + ["\uFD89", "\uFD89"], /* ARABIC LIGATURE MEEM WITH HAH WITH JEEM INITIAL FORM */ + ["\uFD8A", "\uFD8A"], /* ARABIC LIGATURE MEEM WITH HAH WITH MEEM INITIAL FORM */ + ["\uFD8B", "\uFD8B"], /* ARABIC LIGATURE MEEM WITH HAH WITH YEH FINAL FORM */ + ["\uFD8C", "\uFD8C"], /* ARABIC LIGATURE MEEM WITH JEEM WITH HAH INITIAL FORM */ + ["\uFD8D", "\uFD8D"], /* ARABIC LIGATURE MEEM WITH JEEM WITH MEEM INITIAL FORM */ + ["\uFD8E", "\uFD8E"], /* ARABIC LIGATURE MEEM WITH KHAH WITH JEEM INITIAL FORM */ + ["\uFD8F", "\uFD8F"], /* ARABIC LIGATURE MEEM WITH KHAH WITH MEEM INITIAL FORM */ + ["\uFD90", "\uFD90"], + ["\uFD91", "\uFD91"], + ["\uFD92", "\uFD92"], /* ARABIC LIGATURE MEEM WITH JEEM WITH KHAH INITIAL FORM */ + ["\uFD93", "\uFD93"], /* ARABIC LIGATURE HEH WITH MEEM WITH JEEM INITIAL FORM */ + ["\uFD94", "\uFD94"], /* ARABIC LIGATURE HEH WITH MEEM WITH MEEM INITIAL FORM */ + ["\uFD95", "\uFD95"], /* ARABIC LIGATURE NOON WITH HAH WITH MEEM INITIAL FORM */ + ["\uFD96", "\uFD96"], /* ARABIC LIGATURE NOON WITH HAH WITH ALEF MAKSURA FINAL FORM */ + ["\uFD97", "\uFD97"], /* ARABIC LIGATURE NOON WITH JEEM WITH MEEM FINAL FORM */ + ["\uFD98", "\uFD98"], /* ARABIC LIGATURE NOON WITH JEEM WITH MEEM INITIAL FORM */ + ["\uFD99", "\uFD99"], /* ARABIC LIGATURE NOON WITH JEEM WITH ALEF MAKSURA FINAL FORM */ + ["\uFD9A", "\uFD9A"], /* ARABIC LIGATURE NOON WITH MEEM WITH YEH FINAL FORM */ + ["\uFD9B", "\uFD9B"], /* ARABIC LIGATURE NOON WITH MEEM WITH ALEF MAKSURA FINAL FORM */ + ["\uFD9C", "\uFD9C"], /* ARABIC LIGATURE YEH WITH MEEM WITH MEEM FINAL FORM */ + ["\uFD9D", "\uFD9D"], /* ARABIC LIGATURE YEH WITH MEEM WITH MEEM INITIAL FORM */ + ["\uFD9E", "\uFD9E"], /* ARABIC LIGATURE BEH WITH KHAH WITH YEH FINAL FORM */ + ["\uFD9F", "\uFD9F"], /* ARABIC LIGATURE TEH WITH JEEM WITH YEH FINAL FORM */ + ["\uFDA0", "\uFDA0"], /* ARABIC LIGATURE TEH WITH JEEM WITH ALEF MAKSURA FINAL FORM */ + ["\uFDA1", "\uFDA1"], /* ARABIC LIGATURE TEH WITH KHAH WITH YEH FINAL FORM */ + ["\uFDA2", "\uFDA2"], /* ARABIC LIGATURE TEH WITH KHAH WITH ALEF MAKSURA FINAL FORM */ + ["\uFDA3", "\uFDA3"], /* ARABIC LIGATURE TEH WITH MEEM WITH YEH FINAL FORM */ + ["\uFDA4", "\uFDA4"], /* ARABIC LIGATURE TEH WITH MEEM WITH ALEF MAKSURA FINAL FORM */ + ["\uFDA5", "\uFDA5"], /* ARABIC LIGATURE JEEM WITH MEEM WITH YEH FINAL FORM */ + ["\uFDA6", "\uFDA6"], /* ARABIC LIGATURE JEEM WITH HAH WITH ALEF MAKSURA FINAL FORM */ + ["\uFDA7", "\uFDA7"], /* ARABIC LIGATURE JEEM WITH MEEM WITH ALEF MAKSURA FINAL FORM */ + ["\uFDA8", "\uFDA8"], /* ARABIC LIGATURE SEEN WITH KHAH WITH ALEF MAKSURA FINAL FORM */ + ["\uFDA9", "\uFDA9"], /* ARABIC LIGATURE SAD WITH HAH WITH YEH FINAL FORM */ + ["\uFDAA", "\uFDAA"], /* ARABIC LIGATURE SHEEN WITH HAH WITH YEH FINAL FORM */ + ["\uFDAB", "\uFDAB"], /* ARABIC LIGATURE DAD WITH HAH WITH YEH FINAL FORM */ + ["\uFDAC", "\uFDAC"], /* ARABIC LIGATURE LAM WITH JEEM WITH YEH FINAL FORM */ + ["\uFDAD", "\uFDAD"], /* ARABIC LIGATURE LAM WITH MEEM WITH YEH FINAL FORM */ + ["\uFDAE", "\uFDAE"], /* ARABIC LIGATURE YEH WITH HAH WITH YEH FINAL FORM */ + ["\uFDAF", "\uFDAF"], /* ARABIC LIGATURE YEH WITH JEEM WITH YEH FINAL FORM */ + ["\uFDB0", "\uFDB0"], /* ARABIC LIGATURE YEH WITH MEEM WITH YEH FINAL FORM */ + ["\uFDB1", "\uFDB1"], /* ARABIC LIGATURE MEEM WITH MEEM WITH YEH FINAL FORM */ + ["\uFDB2", "\uFDB2"], /* ARABIC LIGATURE QAF WITH MEEM WITH YEH FINAL FORM */ + ["\uFDB3", "\uFDB3"], /* ARABIC LIGATURE NOON WITH HAH WITH YEH FINAL FORM */ + ["\uFDB4", "\uFDB4"], /* ARABIC LIGATURE QAF WITH MEEM WITH HAH INITIAL FORM */ + ["\uFDB5", "\uFDB5"], /* ARABIC LIGATURE LAM WITH HAH WITH MEEM INITIAL FORM */ + ["\uFDB6", "\uFDB6"], /* ARABIC LIGATURE AIN WITH MEEM WITH YEH FINAL FORM */ + ["\uFDB7", "\uFDB7"], /* ARABIC LIGATURE KAF WITH MEEM WITH YEH FINAL FORM */ + ["\uFDB8", "\uFDB8"], /* ARABIC LIGATURE NOON WITH JEEM WITH HAH INITIAL FORM */ + ["\uFDB9", "\uFDB9"], /* ARABIC LIGATURE MEEM WITH KHAH WITH YEH FINAL FORM */ + ["\uFDBA", "\uFDBA"], /* ARABIC LIGATURE LAM WITH JEEM WITH MEEM INITIAL FORM */ + ["\uFDBB", "\uFDBB"], /* ARABIC LIGATURE KAF WITH MEEM WITH MEEM FINAL FORM */ + ["\uFDBC", "\uFDBC"], /* ARABIC LIGATURE LAM WITH JEEM WITH MEEM FINAL FORM */ + ["\uFDBD", "\uFDBD"], /* ARABIC LIGATURE NOON WITH JEEM WITH HAH FINAL FORM */ + ["\uFDBE", "\uFDBE"], /* ARABIC LIGATURE JEEM WITH HAH WITH YEH FINAL FORM */ + ["\uFDBF", "\uFDBF"], /* ARABIC LIGATURE HAH WITH JEEM WITH YEH FINAL FORM */ + ["\uFDC0", "\uFDC0"], /* ARABIC LIGATURE MEEM WITH JEEM WITH YEH FINAL FORM */ + ["\uFDC1", "\uFDC1"], /* ARABIC LIGATURE FEH WITH MEEM WITH YEH FINAL FORM */ + ["\uFDC2", "\uFDC2"], /* ARABIC LIGATURE BEH WITH HAH WITH YEH FINAL FORM */ + ["\uFDC3", "\uFDC3"], /* ARABIC LIGATURE KAF WITH MEEM WITH MEEM INITIAL FORM */ + ["\uFDC4", "\uFDC4"], /* ARABIC LIGATURE AIN WITH JEEM WITH MEEM INITIAL FORM */ + ["\uFDC5", "\uFDC5"], /* ARABIC LIGATURE SAD WITH MEEM WITH MEEM INITIAL FORM */ + ["\uFDC6", "\uFDC6"], /* ARABIC LIGATURE SEEN WITH KHAH WITH YEH FINAL FORM */ + ["\uFDC7", "\uFDC7"], /* ARABIC LIGATURE NOON WITH JEEM WITH YEH FINAL FORM */ + ["\uFDC8", "\uFDC8"], + ["\uFDC9", "\uFDC9"], + ["\uFDCA", "\uFDCA"], + ["\uFDCB", "\uFDCB"], + ["\uFDCC", "\uFDCC"], + ["\uFDCD", "\uFDCD"], + ["\uFDCE", "\uFDCE"], + ["\uFDCF", "\uFDCF"], /* ARABIC LIGATURE SALAAMUHU ALAYNAA */ + ["\uFDD0", "\uFDD0"], + ["\uFDD1", "\uFDD1"], + ["\uFDD2", "\uFDD2"], + ["\uFDD3", "\uFDD3"], + ["\uFDD4", "\uFDD4"], + ["\uFDD5", "\uFDD5"], + ["\uFDD6", "\uFDD6"], + ["\uFDD7", "\uFDD7"], + ["\uFDD8", "\uFDD8"], + ["\uFDD9", "\uFDD9"], + ["\uFDDA", "\uFDDA"], + ["\uFDDB", "\uFDDB"], + ["\uFDDC", "\uFDDC"], + ["\uFDDD", "\uFDDD"], + ["\uFDDE", "\uFDDE"], + ["\uFDDF", "\uFDDF"], + ["\uFDE0", "\uFDE0"], + ["\uFDE1", "\uFDE1"], + ["\uFDE2", "\uFDE2"], + ["\uFDE3", "\uFDE3"], + ["\uFDE4", "\uFDE4"], + ["\uFDE5", "\uFDE5"], + ["\uFDE6", "\uFDE6"], + ["\uFDE7", "\uFDE7"], + ["\uFDE8", "\uFDE8"], + ["\uFDE9", "\uFDE9"], + ["\uFDEA", "\uFDEA"], + ["\uFDEB", "\uFDEB"], + ["\uFDEC", "\uFDEC"], + ["\uFDED", "\uFDED"], + ["\uFDEE", "\uFDEE"], + ["\uFDEF", "\uFDEF"], + ["\uFDF0", "\uFDF0"], /* ARABIC LIGATURE SALLA USED AS KORANIC STOP SIGN ISOLATED FORM */ + ["\uFDF1", "\uFDF1"], /* ARABIC LIGATURE QALA USED AS KORANIC STOP SIGN ISOLATED FORM */ + ["\uFDF2", "\uFDF2"], /* ARABIC LIGATURE ALLAH ISOLATED FORM */ + ["\uFDF3", "\uFDF3"], /* ARABIC LIGATURE AKBAR ISOLATED FORM */ + ["\uFDF4", "\uFDF4"], /* ARABIC LIGATURE MOHAMMAD ISOLATED FORM */ + ["\uFDF5", "\uFDF5"], /* ARABIC LIGATURE SALAM ISOLATED FORM */ + ["\uFDF6", "\uFDF6"], /* ARABIC LIGATURE RASOUL ISOLATED FORM */ + ["\uFDF7", "\uFDF7"], /* ARABIC LIGATURE ALAYHE ISOLATED FORM */ + ["\uFDF8", "\uFDF8"], /* ARABIC LIGATURE WASALLAM ISOLATED FORM */ + ["\uFDF9", "\uFDF9"], /* ARABIC LIGATURE SALLA ISOLATED FORM */ + ["\uFDFA", "\uFDFA"], /* ARABIC LIGATURE SALLALLAHOU ALAYHE WASALLAM (ARABIC LETTER SALLALLAHOU ALAYHE WASALLAM) */ + ["\uFDFB", "\uFDFB"], /* ARABIC LIGATURE JALLAJALALOUHOU (ARABIC LETTER JALLAJALALOUHOU) */ + ["\uFDFC", "\uFDFC"], /* RIAL SIGN */ + ["\uFDFD", "\uFDFD"], /* ARABIC LIGATURE BISMILLAH AR-RAHMAN AR-RAHEEM */ + ["\uFDFE", "\uFDFE"], /* ARABIC LIGATURE SUBHAANAHU WA TAAALAA */ + ["\uFDFF", "\uFDFF"], /* ARABIC LIGATURE AZZA WA JALL */ + ["\uFE00", "\uFE00"], /* VARIATION SELECTOR-1 */ + ["\uFE01", "\uFE01"], /* VARIATION SELECTOR-2 */ + ["\uFE02", "\uFE02"], /* VARIATION SELECTOR-3 */ + ["\uFE03", "\uFE03"], /* VARIATION SELECTOR-4 */ + ["\uFE04", "\uFE04"], /* VARIATION SELECTOR-5 */ + ["\uFE05", "\uFE05"], /* VARIATION SELECTOR-6 */ + ["\uFE06", "\uFE06"], /* VARIATION SELECTOR-7 */ + ["\uFE07", "\uFE07"], /* VARIATION SELECTOR-8 */ + ["\uFE08", "\uFE08"], /* VARIATION SELECTOR-9 */ + ["\uFE09", "\uFE09"], /* VARIATION SELECTOR-10 */ + ["\uFE0A", "\uFE0A"], /* VARIATION SELECTOR-11 */ + ["\uFE0B", "\uFE0B"], /* VARIATION SELECTOR-12 */ + ["\uFE0C", "\uFE0C"], /* VARIATION SELECTOR-13 */ + ["\uFE0D", "\uFE0D"], /* VARIATION SELECTOR-14 */ + ["\uFE0E", "\uFE0E"], /* VARIATION SELECTOR-15 */ + ["\uFE0F", "\uFE0F"], /* VARIATION SELECTOR-16 */ + ["\uFE10", "\uFE10"], /* PRESENTATION FORM FOR VERTICAL COMMA */ + ["\uFE11", "\uFE11"], /* PRESENTATION FORM FOR VERTICAL IDEOGRAPHIC COMMA */ + ["\uFE12", "\uFE12"], /* PRESENTATION FORM FOR VERTICAL IDEOGRAPHIC FULL STOP */ + ["\uFE13", "\uFE13"], /* PRESENTATION FORM FOR VERTICAL COLON */ + ["\uFE14", "\uFE14"], /* PRESENTATION FORM FOR VERTICAL SEMICOLON */ + ["\uFE15", "\uFE15"], /* PRESENTATION FORM FOR VERTICAL EXCLAMATION MARK */ + ["\uFE16", "\uFE16"], /* PRESENTATION FORM FOR VERTICAL QUESTION MARK */ + ["\uFE17", "\uFE17"], /* PRESENTATION FORM FOR VERTICAL LEFT WHITE LENTICULAR BRACKET */ + ["\uFE18", "\uFE18"], /* PRESENTATION FORM FOR VERTICAL RIGHT WHITE LENTICULAR BRAKCET */ + ["\uFE19", "\uFE19"], /* PRESENTATION FORM FOR VERTICAL HORIZONTAL ELLIPSIS */ + ["\uFE1A", "\uFE1A"], + ["\uFE1B", "\uFE1B"], + ["\uFE1C", "\uFE1C"], + ["\uFE1D", "\uFE1D"], + ["\uFE1E", "\uFE1E"], + ["\uFE1F", "\uFE1F"], + ["\uFE20", "\uFE20"], /* COMBINING LIGATURE LEFT HALF */ + ["\uFE21", "\uFE21"], /* COMBINING LIGATURE RIGHT HALF */ + ["\uFE22", "\uFE22"], /* COMBINING DOUBLE TILDE LEFT HALF */ + ["\uFE23", "\uFE23"], /* COMBINING DOUBLE TILDE RIGHT HALF */ + ["\uFE24", "\uFE24"], /* COMBINING MACRON LEFT HALF */ + ["\uFE25", "\uFE25"], /* COMBINING MACRON RIGHT HALF */ + ["\uFE26", "\uFE26"], /* COMBINING CONJOINING MACRON */ + ["\uFE27", "\uFE27"], /* COMBINING LIGATURE LEFT HALF BELOW */ + ["\uFE28", "\uFE28"], /* COMBINING LIGATURE RIGHT HALF BELOW */ + ["\uFE29", "\uFE29"], /* COMBINING TILDE LEFT HALF BELOW */ + ["\uFE2A", "\uFE2A"], /* COMBINING TILDE RIGHT HALF BELOW */ + ["\uFE2B", "\uFE2B"], /* COMBINING MACRON LEFT HALF BELOW */ + ["\uFE2C", "\uFE2C"], /* COMBINING MACRON RIGHT HALF BELOW */ + ["\uFE2D", "\uFE2D"], /* COMBINING CONJOINING MACRON BELOW */ + ["\uFE2E", "\uFE2E"], /* COMBINING CYRILLIC TITLO LEFT HALF */ + ["\uFE2F", "\uFE2F"], /* COMBINING CYRILLIC TITLO RIGHT HALF */ + ["\uFE30", "\uFE30"], /* PRESENTATION FORM FOR VERTICAL TWO DOT LEADER (GLYPH FOR VERTICAL TWO DOT LEADER) */ + ["\uFE31", "\uFE31"], /* PRESENTATION FORM FOR VERTICAL EM DASH (GLYPH FOR VERTICAL EM DASH) */ + ["\uFE32", "\uFE32"], /* PRESENTATION FORM FOR VERTICAL EN DASH (GLYPH FOR VERTICAL EN DASH) */ + ["\uFE33", "\uFE33"], /* PRESENTATION FORM FOR VERTICAL LOW LINE (GLYPH FOR VERTICAL SPACING UNDERSCORE) */ + ["\uFE34", "\uFE34"], /* PRESENTATION FORM FOR VERTICAL WAVY LOW LINE (GLYPH FOR VERTICAL SPACING WAVY UNDERSCORE) */ + ["\uFE35", "\uFE35"], /* PRESENTATION FORM FOR VERTICAL LEFT PARENTHESIS (GLYPH FOR VERTICAL OPENING PARENTHESIS) */ + ["\uFE36", "\uFE36"], /* PRESENTATION FORM FOR VERTICAL RIGHT PARENTHESIS (GLYPH FOR VERTICAL CLOSING PARENTHESIS) */ + ["\uFE37", "\uFE37"], /* PRESENTATION FORM FOR VERTICAL LEFT CURLY BRACKET (GLYPH FOR VERTICAL OPENING CURLY BRACKET) */ + ["\uFE38", "\uFE38"], /* PRESENTATION FORM FOR VERTICAL RIGHT CURLY BRACKET (GLYPH FOR VERTICAL CLOSING CURLY BRACKET) */ + ["\uFE39", "\uFE39"], /* PRESENTATION FORM FOR VERTICAL LEFT TORTOISE SHELL BRACKET (GLYPH FOR VERTICAL OPENING TORTOISE SHELL BRACKET) */ + ["\uFE3A", "\uFE3A"], /* PRESENTATION FORM FOR VERTICAL RIGHT TORTOISE SHELL BRACKET (GLYPH FOR VERTICAL CLOSING TORTOISE SHELL BRACKET) */ + ["\uFE3B", "\uFE3B"], /* PRESENTATION FORM FOR VERTICAL LEFT BLACK LENTICULAR BRACKET (GLYPH FOR VERTICAL OPENING BLACK LENTICULAR BRACKET) */ + ["\uFE3C", "\uFE3C"], /* PRESENTATION FORM FOR VERTICAL RIGHT BLACK LENTICULAR BRACKET (GLYPH FOR VERTICAL CLOSING BLACK LENTICULAR BRACKET) */ + ["\uFE3D", "\uFE3D"], /* PRESENTATION FORM FOR VERTICAL LEFT DOUBLE ANGLE BRACKET (GLYPH FOR VERTICAL OPENING DOUBLE ANGLE BRACKET) */ + ["\uFE3E", "\uFE3E"], /* PRESENTATION FORM FOR VERTICAL RIGHT DOUBLE ANGLE BRACKET (GLYPH FOR VERTICAL CLOSING DOUBLE ANGLE BRACKET) */ + ["\uFE3F", "\uFE3F"], /* PRESENTATION FORM FOR VERTICAL LEFT ANGLE BRACKET (GLYPH FOR VERTICAL OPENING ANGLE BRACKET) */ + ["\uFE40", "\uFE40"], /* PRESENTATION FORM FOR VERTICAL RIGHT ANGLE BRACKET (GLYPH FOR VERTICAL CLOSING ANGLE BRACKET) */ + ["\uFE41", "\uFE41"], /* PRESENTATION FORM FOR VERTICAL LEFT CORNER BRACKET (GLYPH FOR VERTICAL OPENING CORNER BRACKET) */ + ["\uFE42", "\uFE42"], /* PRESENTATION FORM FOR VERTICAL RIGHT CORNER BRACKET (GLYPH FOR VERTICAL CLOSING CORNER BRACKET) */ + ["\uFE43", "\uFE43"], /* PRESENTATION FORM FOR VERTICAL LEFT WHITE CORNER BRACKET (GLYPH FOR VERTICAL OPENING WHITE CORNER BRACKET) */ + ["\uFE44", "\uFE44"], /* PRESENTATION FORM FOR VERTICAL RIGHT WHITE CORNER BRACKET (GLYPH FOR VERTICAL CLOSING WHITE CORNER BRACKET) */ + ["\uFE45", "\uFE45"], /* SESAME DOT */ + ["\uFE46", "\uFE46"], /* WHITE SESAME DOT */ + ["\uFE47", "\uFE47"], /* PRESENTATION FORM FOR VERTICAL LEFT SQUARE BRACKET */ + ["\uFE48", "\uFE48"], /* PRESENTATION FORM FOR VERTICAL RIGHT SQUARE BRACKET */ + ["\uFE49", "\uFE49"], /* DASHED OVERLINE (SPACING DASHED OVERSCORE) */ + ["\uFE4A", "\uFE4A"], /* CENTRELINE OVERLINE (SPACING CENTERLINE OVERSCORE) */ + ["\uFE4B", "\uFE4B"], /* WAVY OVERLINE (SPACING WAVY OVERSCORE) */ + ["\uFE4C", "\uFE4C"], /* DOUBLE WAVY OVERLINE (SPACING DOUBLE WAVY OVERSCORE) */ + ["\uFE4D", "\uFE4D"], /* DASHED LOW LINE (SPACING DASHED UNDERSCORE) */ + ["\uFE4E", "\uFE4E"], /* CENTRELINE LOW LINE (SPACING CENTERLINE UNDERSCORE) */ + ["\uFE4F", "\uFE4F"], /* WAVY LOW LINE (SPACING WAVY UNDERSCORE) */ + ["\uFE50", "\uFE50"], /* SMALL COMMA */ + ["\uFE51", "\uFE51"], /* SMALL IDEOGRAPHIC COMMA */ + ["\uFE52", "\uFE52"], /* SMALL FULL STOP (SMALL PERIOD) */ + ["\uFE53", "\uFE53"], + ["\uFE54", "\uFE54"], /* SMALL SEMICOLON */ + ["\uFE55", "\uFE55"], /* SMALL COLON */ + ["\uFE56", "\uFE56"], /* SMALL QUESTION MARK */ + ["\uFE57", "\uFE57"], /* SMALL EXCLAMATION MARK */ + ["\uFE58", "\uFE58"], /* SMALL EM DASH */ + ["\uFE59", "\uFE59"], /* SMALL LEFT PARENTHESIS (SMALL OPENING PARENTHESIS) */ + ["\uFE5A", "\uFE5A"], /* SMALL RIGHT PARENTHESIS (SMALL CLOSING PARENTHESIS) */ + ["\uFE5B", "\uFE5B"], /* SMALL LEFT CURLY BRACKET (SMALL OPENING CURLY BRACKET) */ + ["\uFE5C", "\uFE5C"], /* SMALL RIGHT CURLY BRACKET (SMALL CLOSING CURLY BRACKET) */ + ["\uFE5D", "\uFE5D"], /* SMALL LEFT TORTOISE SHELL BRACKET (SMALL OPENING TORTOISE SHELL BRACKET) */ + ["\uFE5E", "\uFE5E"], /* SMALL RIGHT TORTOISE SHELL BRACKET (SMALL CLOSING TORTOISE SHELL BRACKET) */ + ["\uFE5F", "\uFE5F"], /* SMALL NUMBER SIGN */ + ["\uFE60", "\uFE60"], /* SMALL AMPERSAND */ + ["\uFE61", "\uFE61"], /* SMALL ASTERISK */ + ["\uFE62", "\uFE62"], /* SMALL PLUS SIGN */ + ["\uFE63", "\uFE63"], /* SMALL HYPHEN-MINUS */ + ["\uFE64", "\uFE64"], /* SMALL LESS-THAN SIGN */ + ["\uFE65", "\uFE65"], /* SMALL GREATER-THAN SIGN */ + ["\uFE66", "\uFE66"], /* SMALL EQUALS SIGN */ + ["\uFE67", "\uFE67"], + ["\uFE68", "\uFE68"], /* SMALL REVERSE SOLIDUS (SMALL BACKSLASH) */ + ["\uFE69", "\uFE69"], /* SMALL DOLLAR SIGN */ + ["\uFE6A", "\uFE6A"], /* SMALL PERCENT SIGN */ + ["\uFE6B", "\uFE6B"], /* SMALL COMMERCIAL AT */ + ["\uFE6C", "\uFE6C"], + ["\uFE6D", "\uFE6D"], + ["\uFE6E", "\uFE6E"], + ["\uFE6F", "\uFE6F"], + ["\uFE70", "\uFE70"], /* ARABIC FATHATAN ISOLATED FORM (ARABIC SPACING FATHATAN) */ + ["\uFE71", "\uFE71"], /* ARABIC TATWEEL WITH FATHATAN ABOVE (ARABIC FATHATAN ON TATWEEL) */ + ["\uFE72", "\uFE72"], /* ARABIC DAMMATAN ISOLATED FORM (ARABIC SPACING DAMMATAN) */ + ["\uFE73", "\uFE73"], /* ARABIC TAIL FRAGMENT */ + ["\uFE74", "\uFE74"], /* ARABIC KASRATAN ISOLATED FORM (ARABIC SPACING KASRATAN) */ + ["\uFE75", "\uFE75"], + ["\uFE76", "\uFE76"], /* ARABIC FATHA ISOLATED FORM (ARABIC SPACING FATHAH) */ + ["\uFE77", "\uFE77"], /* ARABIC FATHA MEDIAL FORM (ARABIC FATHAH ON TATWEEL) */ + ["\uFE78", "\uFE78"], /* ARABIC DAMMA ISOLATED FORM (ARABIC SPACING DAMMAH) */ + ["\uFE79", "\uFE79"], /* ARABIC DAMMA MEDIAL FORM (ARABIC DAMMAH ON TATWEEL) */ + ["\uFE7A", "\uFE7A"], /* ARABIC KASRA ISOLATED FORM (ARABIC SPACING KASRAH) */ + ["\uFE7B", "\uFE7B"], /* ARABIC KASRA MEDIAL FORM (ARABIC KASRAH ON TATWEEL) */ + ["\uFE7C", "\uFE7C"], /* ARABIC SHADDA ISOLATED FORM (ARABIC SPACING SHADDAH) */ + ["\uFE7D", "\uFE7D"], /* ARABIC SHADDA MEDIAL FORM (ARABIC SHADDAH ON TATWEEL) */ + ["\uFE7E", "\uFE7E"], /* ARABIC SUKUN ISOLATED FORM (ARABIC SPACING SUKUN) */ + ["\uFE7F", "\uFE7F"], /* ARABIC SUKUN MEDIAL FORM (ARABIC SUKUN ON TATWEEL) */ + ["\uFE80", "\uFE80"], /* ARABIC LETTER HAMZA ISOLATED FORM (GLYPH FOR ISOLATE ARABIC HAMZAH) */ + ["\uFE81", "\uFE81"], /* ARABIC LETTER ALEF WITH MADDA ABOVE ISOLATED FORM (GLYPH FOR ISOLATE ARABIC MADDAH ON ALEF) */ + ["\uFE82", "\uFE82"], /* ARABIC LETTER ALEF WITH MADDA ABOVE FINAL FORM (GLYPH FOR FINAL ARABIC MADDAH ON ALEF) */ + ["\uFE83", "\uFE83"], /* ARABIC LETTER ALEF WITH HAMZA ABOVE ISOLATED FORM (GLYPH FOR ISOLATE ARABIC HAMZAH ON ALEF) */ + ["\uFE84", "\uFE84"], /* ARABIC LETTER ALEF WITH HAMZA ABOVE FINAL FORM (GLYPH FOR FINAL ARABIC HAMZAH ON ALEF) */ + ["\uFE85", "\uFE85"], /* ARABIC LETTER WAW WITH HAMZA ABOVE ISOLATED FORM (GLYPH FOR ISOLATE ARABIC HAMZAH ON WAW) */ + ["\uFE86", "\uFE86"], /* ARABIC LETTER WAW WITH HAMZA ABOVE FINAL FORM (GLYPH FOR FINAL ARABIC HAMZAH ON WAW) */ + ["\uFE87", "\uFE87"], /* ARABIC LETTER ALEF WITH HAMZA BELOW ISOLATED FORM (GLYPH FOR ISOLATE ARABIC HAMZAH UNDER ALEF) */ + ["\uFE88", "\uFE88"], /* ARABIC LETTER ALEF WITH HAMZA BELOW FINAL FORM (GLYPH FOR FINAL ARABIC HAMZAH UNDER ALEF) */ + ["\uFE89", "\uFE89"], /* ARABIC LETTER YEH WITH HAMZA ABOVE ISOLATED FORM (GLYPH FOR ISOLATE ARABIC HAMZAH ON YA) */ + ["\uFE8A", "\uFE8A"], /* ARABIC LETTER YEH WITH HAMZA ABOVE FINAL FORM (GLYPH FOR FINAL ARABIC HAMZAH ON YA) */ + ["\uFE8B", "\uFE8B"], /* ARABIC LETTER YEH WITH HAMZA ABOVE INITIAL FORM (GLYPH FOR INITIAL ARABIC HAMZAH ON YA) */ + ["\uFE8C", "\uFE8C"], /* ARABIC LETTER YEH WITH HAMZA ABOVE MEDIAL FORM (GLYPH FOR MEDIAL ARABIC HAMZAH ON YA) */ + ["\uFE8D", "\uFE8D"], /* ARABIC LETTER ALEF ISOLATED FORM (GLYPH FOR ISOLATE ARABIC ALEF) */ + ["\uFE8E", "\uFE8E"], /* ARABIC LETTER ALEF FINAL FORM (GLYPH FOR FINAL ARABIC ALEF) */ + ["\uFE8F", "\uFE8F"], /* ARABIC LETTER BEH ISOLATED FORM (GLYPH FOR ISOLATE ARABIC BAA) */ + ["\uFE90", "\uFE90"], /* ARABIC LETTER BEH FINAL FORM (GLYPH FOR FINAL ARABIC BAA) */ + ["\uFE91", "\uFE91"], /* ARABIC LETTER BEH INITIAL FORM (GLYPH FOR INITIAL ARABIC BAA) */ + ["\uFE92", "\uFE92"], /* ARABIC LETTER BEH MEDIAL FORM (GLYPH FOR MEDIAL ARABIC BAA) */ + ["\uFE93", "\uFE93"], /* ARABIC LETTER TEH MARBUTA ISOLATED FORM (GLYPH FOR ISOLATE ARABIC TAA MARBUTAH) */ + ["\uFE94", "\uFE94"], /* ARABIC LETTER TEH MARBUTA FINAL FORM (GLYPH FOR FINAL ARABIC TAA MARBUTAH) */ + ["\uFE95", "\uFE95"], /* ARABIC LETTER TEH ISOLATED FORM (GLYPH FOR ISOLATE ARABIC TAA) */ + ["\uFE96", "\uFE96"], /* ARABIC LETTER TEH FINAL FORM (GLYPH FOR FINAL ARABIC TAA) */ + ["\uFE97", "\uFE97"], /* ARABIC LETTER TEH INITIAL FORM (GLYPH FOR INITIAL ARABIC TAA) */ + ["\uFE98", "\uFE98"], /* ARABIC LETTER TEH MEDIAL FORM (GLYPH FOR MEDIAL ARABIC TAA) */ + ["\uFE99", "\uFE99"], /* ARABIC LETTER THEH ISOLATED FORM (GLYPH FOR ISOLATE ARABIC THAA) */ + ["\uFE9A", "\uFE9A"], /* ARABIC LETTER THEH FINAL FORM (GLYPH FOR FINAL ARABIC THAA) */ + ["\uFE9B", "\uFE9B"], /* ARABIC LETTER THEH INITIAL FORM (GLYPH FOR INITIAL ARABIC THAA) */ + ["\uFE9C", "\uFE9C"], /* ARABIC LETTER THEH MEDIAL FORM (GLYPH FOR MEDIAL ARABIC THAA) */ + ["\uFE9D", "\uFE9D"], /* ARABIC LETTER JEEM ISOLATED FORM (GLYPH FOR ISOLATE ARABIC JEEM) */ + ["\uFE9E", "\uFE9E"], /* ARABIC LETTER JEEM FINAL FORM (GLYPH FOR FINAL ARABIC JEEM) */ + ["\uFE9F", "\uFE9F"], /* ARABIC LETTER JEEM INITIAL FORM (GLYPH FOR INITIAL ARABIC JEEM) */ + ["\uFEA0", "\uFEA0"], /* ARABIC LETTER JEEM MEDIAL FORM (GLYPH FOR MEDIAL ARABIC JEEM) */ + ["\uFEA1", "\uFEA1"], /* ARABIC LETTER HAH ISOLATED FORM (GLYPH FOR ISOLATE ARABIC HAA) */ + ["\uFEA2", "\uFEA2"], /* ARABIC LETTER HAH FINAL FORM (GLYPH FOR FINAL ARABIC HAA) */ + ["\uFEA3", "\uFEA3"], /* ARABIC LETTER HAH INITIAL FORM (GLYPH FOR INITIAL ARABIC HAA) */ + ["\uFEA4", "\uFEA4"], /* ARABIC LETTER HAH MEDIAL FORM (GLYPH FOR MEDIAL ARABIC HAA) */ + ["\uFEA5", "\uFEA5"], /* ARABIC LETTER KHAH ISOLATED FORM (GLYPH FOR ISOLATE ARABIC KHAA) */ + ["\uFEA6", "\uFEA6"], /* ARABIC LETTER KHAH FINAL FORM (GLYPH FOR FINAL ARABIC KHAA) */ + ["\uFEA7", "\uFEA7"], /* ARABIC LETTER KHAH INITIAL FORM (GLYPH FOR INITIAL ARABIC KHAA) */ + ["\uFEA8", "\uFEA8"], /* ARABIC LETTER KHAH MEDIAL FORM (GLYPH FOR MEDIAL ARABIC KHAA) */ + ["\uFEA9", "\uFEA9"], /* ARABIC LETTER DAL ISOLATED FORM (GLYPH FOR ISOLATE ARABIC DAL) */ + ["\uFEAA", "\uFEAA"], /* ARABIC LETTER DAL FINAL FORM (GLYPH FOR FINAL ARABIC DAL) */ + ["\uFEAB", "\uFEAB"], /* ARABIC LETTER THAL ISOLATED FORM (GLYPH FOR ISOLATE ARABIC THAL) */ + ["\uFEAC", "\uFEAC"], /* ARABIC LETTER THAL FINAL FORM (GLYPH FOR FINAL ARABIC THAL) */ + ["\uFEAD", "\uFEAD"], /* ARABIC LETTER REH ISOLATED FORM (GLYPH FOR ISOLATE ARABIC RA) */ + ["\uFEAE", "\uFEAE"], /* ARABIC LETTER REH FINAL FORM (GLYPH FOR FINAL ARABIC RA) */ + ["\uFEAF", "\uFEAF"], /* ARABIC LETTER ZAIN ISOLATED FORM (GLYPH FOR ISOLATE ARABIC ZAIN) */ + ["\uFEB0", "\uFEB0"], /* ARABIC LETTER ZAIN FINAL FORM (GLYPH FOR FINAL ARABIC ZAIN) */ + ["\uFEB1", "\uFEB1"], /* ARABIC LETTER SEEN ISOLATED FORM (GLYPH FOR ISOLATE ARABIC SEEN) */ + ["\uFEB2", "\uFEB2"], /* ARABIC LETTER SEEN FINAL FORM (GLYPH FOR FINAL ARABIC SEEN) */ + ["\uFEB3", "\uFEB3"], /* ARABIC LETTER SEEN INITIAL FORM (GLYPH FOR INITIAL ARABIC SEEN) */ + ["\uFEB4", "\uFEB4"], /* ARABIC LETTER SEEN MEDIAL FORM (GLYPH FOR MEDIAL ARABIC SEEN) */ + ["\uFEB5", "\uFEB5"], /* ARABIC LETTER SHEEN ISOLATED FORM (GLYPH FOR ISOLATE ARABIC SHEEN) */ + ["\uFEB6", "\uFEB6"], /* ARABIC LETTER SHEEN FINAL FORM (GLYPH FOR FINAL ARABIC SHEEN) */ + ["\uFEB7", "\uFEB7"], /* ARABIC LETTER SHEEN INITIAL FORM (GLYPH FOR INITIAL ARABIC SHEEN) */ + ["\uFEB8", "\uFEB8"], /* ARABIC LETTER SHEEN MEDIAL FORM (GLYPH FOR MEDIAL ARABIC SHEEN) */ + ["\uFEB9", "\uFEB9"], /* ARABIC LETTER SAD ISOLATED FORM (GLYPH FOR ISOLATE ARABIC SAD) */ + ["\uFEBA", "\uFEBA"], /* ARABIC LETTER SAD FINAL FORM (GLYPH FOR FINAL ARABIC SAD) */ + ["\uFEBB", "\uFEBB"], /* ARABIC LETTER SAD INITIAL FORM (GLYPH FOR INITIAL ARABIC SAD) */ + ["\uFEBC", "\uFEBC"], /* ARABIC LETTER SAD MEDIAL FORM (GLYPH FOR MEDIAL ARABIC SAD) */ + ["\uFEBD", "\uFEBD"], /* ARABIC LETTER DAD ISOLATED FORM (GLYPH FOR ISOLATE ARABIC DAD) */ + ["\uFEBE", "\uFEBE"], /* ARABIC LETTER DAD FINAL FORM (GLYPH FOR FINAL ARABIC DAD) */ + ["\uFEBF", "\uFEBF"], /* ARABIC LETTER DAD INITIAL FORM (GLYPH FOR INITIAL ARABIC DAD) */ + ["\uFEC0", "\uFEC0"], /* ARABIC LETTER DAD MEDIAL FORM (GLYPH FOR MEDIAL ARABIC DAD) */ + ["\uFEC1", "\uFEC1"], /* ARABIC LETTER TAH ISOLATED FORM (GLYPH FOR ISOLATE ARABIC TAH) */ + ["\uFEC2", "\uFEC2"], /* ARABIC LETTER TAH FINAL FORM (GLYPH FOR FINAL ARABIC TAH) */ + ["\uFEC3", "\uFEC3"], /* ARABIC LETTER TAH INITIAL FORM (GLYPH FOR INITIAL ARABIC TAH) */ + ["\uFEC4", "\uFEC4"], /* ARABIC LETTER TAH MEDIAL FORM (GLYPH FOR MEDIAL ARABIC TAH) */ + ["\uFEC5", "\uFEC5"], /* ARABIC LETTER ZAH ISOLATED FORM (GLYPH FOR ISOLATE ARABIC DHAH) */ + ["\uFEC6", "\uFEC6"], /* ARABIC LETTER ZAH FINAL FORM (GLYPH FOR FINAL ARABIC DHAH) */ + ["\uFEC7", "\uFEC7"], /* ARABIC LETTER ZAH INITIAL FORM (GLYPH FOR INITIAL ARABIC DHAH) */ + ["\uFEC8", "\uFEC8"], /* ARABIC LETTER ZAH MEDIAL FORM (GLYPH FOR MEDIAL ARABIC DHAH) */ + ["\uFEC9", "\uFEC9"], /* ARABIC LETTER AIN ISOLATED FORM (GLYPH FOR ISOLATE ARABIC AIN) */ + ["\uFECA", "\uFECA"], /* ARABIC LETTER AIN FINAL FORM (GLYPH FOR FINAL ARABIC AIN) */ + ["\uFECB", "\uFECB"], /* ARABIC LETTER AIN INITIAL FORM (GLYPH FOR INITIAL ARABIC AIN) */ + ["\uFECC", "\uFECC"], /* ARABIC LETTER AIN MEDIAL FORM (GLYPH FOR MEDIAL ARABIC AIN) */ + ["\uFECD", "\uFECD"], /* ARABIC LETTER GHAIN ISOLATED FORM (GLYPH FOR ISOLATE ARABIC GHAIN) */ + ["\uFECE", "\uFECE"], /* ARABIC LETTER GHAIN FINAL FORM (GLYPH FOR FINAL ARABIC GHAIN) */ + ["\uFECF", "\uFECF"], /* ARABIC LETTER GHAIN INITIAL FORM (GLYPH FOR INITIAL ARABIC GHAIN) */ + ["\uFED0", "\uFED0"], /* ARABIC LETTER GHAIN MEDIAL FORM (GLYPH FOR MEDIAL ARABIC GHAIN) */ + ["\uFED1", "\uFED1"], /* ARABIC LETTER FEH ISOLATED FORM (GLYPH FOR ISOLATE ARABIC FA) */ + ["\uFED2", "\uFED2"], /* ARABIC LETTER FEH FINAL FORM (GLYPH FOR FINAL ARABIC FA) */ + ["\uFED3", "\uFED3"], /* ARABIC LETTER FEH INITIAL FORM (GLYPH FOR INITIAL ARABIC FA) */ + ["\uFED4", "\uFED4"], /* ARABIC LETTER FEH MEDIAL FORM (GLYPH FOR MEDIAL ARABIC FA) */ + ["\uFED5", "\uFED5"], /* ARABIC LETTER QAF ISOLATED FORM (GLYPH FOR ISOLATE ARABIC QAF) */ + ["\uFED6", "\uFED6"], /* ARABIC LETTER QAF FINAL FORM (GLYPH FOR FINAL ARABIC QAF) */ + ["\uFED7", "\uFED7"], /* ARABIC LETTER QAF INITIAL FORM (GLYPH FOR INITIAL ARABIC QAF) */ + ["\uFED8", "\uFED8"], /* ARABIC LETTER QAF MEDIAL FORM (GLYPH FOR MEDIAL ARABIC QAF) */ + ["\uFED9", "\uFED9"], /* ARABIC LETTER KAF ISOLATED FORM (GLYPH FOR ISOLATE ARABIC CAF) */ + ["\uFEDA", "\uFEDA"], /* ARABIC LETTER KAF FINAL FORM (GLYPH FOR FINAL ARABIC CAF) */ + ["\uFEDB", "\uFEDB"], /* ARABIC LETTER KAF INITIAL FORM (GLYPH FOR INITIAL ARABIC CAF) */ + ["\uFEDC", "\uFEDC"], /* ARABIC LETTER KAF MEDIAL FORM (GLYPH FOR MEDIAL ARABIC CAF) */ + ["\uFEDD", "\uFEDD"], /* ARABIC LETTER LAM ISOLATED FORM (GLYPH FOR ISOLATE ARABIC LAM) */ + ["\uFEDE", "\uFEDE"], /* ARABIC LETTER LAM FINAL FORM (GLYPH FOR FINAL ARABIC LAM) */ + ["\uFEDF", "\uFEDF"], /* ARABIC LETTER LAM INITIAL FORM (GLYPH FOR INITIAL ARABIC LAM) */ + ["\uFEE0", "\uFEE0"], /* ARABIC LETTER LAM MEDIAL FORM (GLYPH FOR MEDIAL ARABIC LAM) */ + ["\uFEE1", "\uFEE1"], /* ARABIC LETTER MEEM ISOLATED FORM (GLYPH FOR ISOLATE ARABIC MEEM) */ + ["\uFEE2", "\uFEE2"], /* ARABIC LETTER MEEM FINAL FORM (GLYPH FOR FINAL ARABIC MEEM) */ + ["\uFEE3", "\uFEE3"], /* ARABIC LETTER MEEM INITIAL FORM (GLYPH FOR INITIAL ARABIC MEEM) */ + ["\uFEE4", "\uFEE4"], /* ARABIC LETTER MEEM MEDIAL FORM (GLYPH FOR MEDIAL ARABIC MEEM) */ + ["\uFEE5", "\uFEE5"], /* ARABIC LETTER NOON ISOLATED FORM (GLYPH FOR ISOLATE ARABIC NOON) */ + ["\uFEE6", "\uFEE6"], /* ARABIC LETTER NOON FINAL FORM (GLYPH FOR FINAL ARABIC NOON) */ + ["\uFEE7", "\uFEE7"], /* ARABIC LETTER NOON INITIAL FORM (GLYPH FOR INITIAL ARABIC NOON) */ + ["\uFEE8", "\uFEE8"], /* ARABIC LETTER NOON MEDIAL FORM (GLYPH FOR MEDIAL ARABIC NOON) */ + ["\uFEE9", "\uFEE9"], /* ARABIC LETTER HEH ISOLATED FORM (GLYPH FOR ISOLATE ARABIC HA) */ + ["\uFEEA", "\uFEEA"], /* ARABIC LETTER HEH FINAL FORM (GLYPH FOR FINAL ARABIC HA) */ + ["\uFEEB", "\uFEEB"], /* ARABIC LETTER HEH INITIAL FORM (GLYPH FOR INITIAL ARABIC HA) */ + ["\uFEEC", "\uFEEC"], /* ARABIC LETTER HEH MEDIAL FORM (GLYPH FOR MEDIAL ARABIC HA) */ + ["\uFEED", "\uFEED"], /* ARABIC LETTER WAW ISOLATED FORM (GLYPH FOR ISOLATE ARABIC WAW) */ + ["\uFEEE", "\uFEEE"], /* ARABIC LETTER WAW FINAL FORM (GLYPH FOR FINAL ARABIC WAW) */ + ["\uFEEF", "\uFEEF"], /* ARABIC LETTER ALEF MAKSURA ISOLATED FORM (GLYPH FOR ISOLATE ARABIC ALEF MAQSURAH) */ + ["\uFEF0", "\uFEF0"], /* ARABIC LETTER ALEF MAKSURA FINAL FORM (GLYPH FOR FINAL ARABIC ALEF MAQSURAH) */ + ["\uFEF1", "\uFEF1"], /* ARABIC LETTER YEH ISOLATED FORM (GLYPH FOR ISOLATE ARABIC YA) */ + ["\uFEF2", "\uFEF2"], /* ARABIC LETTER YEH FINAL FORM (GLYPH FOR FINAL ARABIC YA) */ + ["\uFEF3", "\uFEF3"], /* ARABIC LETTER YEH INITIAL FORM (GLYPH FOR INITIAL ARABIC YA) */ + ["\uFEF4", "\uFEF4"], /* ARABIC LETTER YEH MEDIAL FORM (GLYPH FOR MEDIAL ARABIC YA) */ + ["\uFEF5", "\uFEF5"], /* ARABIC LIGATURE LAM WITH ALEF WITH MADDA ABOVE ISOLATED FORM (GLYPH FOR ISOLATE ARABIC MADDAH ON LIGATURE LAM ALEF) */ + ["\uFEF6", "\uFEF6"], /* ARABIC LIGATURE LAM WITH ALEF WITH MADDA ABOVE FINAL FORM (GLYPH FOR FINAL ARABIC MADDAH ON LIGATURE LAM ALEF) */ + ["\uFEF7", "\uFEF7"], /* ARABIC LIGATURE LAM WITH ALEF WITH HAMZA ABOVE ISOLATED FORM (GLYPH FOR ISOLATE ARABIC HAMZAH ON LIGATURE LAM ALEF) */ + ["\uFEF8", "\uFEF8"], /* ARABIC LIGATURE LAM WITH ALEF WITH HAMZA ABOVE FINAL FORM (GLYPH FOR FINAL ARABIC HAMZAH ON LIGATURE LAM ALEF) */ + ["\uFEF9", "\uFEF9"], /* ARABIC LIGATURE LAM WITH ALEF WITH HAMZA BELOW ISOLATED FORM (GLYPH FOR ISOLATE ARABIC HAMZAH UNDER LIGATURE LAM ALEF) */ + ["\uFEFA", "\uFEFA"], /* ARABIC LIGATURE LAM WITH ALEF WITH HAMZA BELOW FINAL FORM (GLYPH FOR FINAL ARABIC HAMZAH UNDER LIGATURE LAM ALEF) */ + ["\uFEFB", "\uFEFB"], /* ARABIC LIGATURE LAM WITH ALEF ISOLATED FORM (GLYPH FOR ISOLATE ARABIC LIGATURE LAM ALEF) */ + ["\uFEFC", "\uFEFC"], /* ARABIC LIGATURE LAM WITH ALEF FINAL FORM (GLYPH FOR FINAL ARABIC LIGATURE LAM ALEF) */ + ["\uFEFD", "\uFEFD"], + ["\uFEFE", "\uFEFE"], + ["\uFEFF", "\uFEFF"], /* ZERO WIDTH NO-BREAK SPACE (BYTE ORDER MARK) */ + ["\uFF00", "\uFF00"], + ["\uFF01", "\uFF01"], /* FULLWIDTH EXCLAMATION MARK */ + ["\uFF02", "\uFF02"], /* FULLWIDTH QUOTATION MARK */ + ["\uFF03", "\uFF03"], /* FULLWIDTH NUMBER SIGN */ + ["\uFF04", "\uFF04"], /* FULLWIDTH DOLLAR SIGN */ + ["\uFF05", "\uFF05"], /* FULLWIDTH PERCENT SIGN */ + ["\uFF06", "\uFF06"], /* FULLWIDTH AMPERSAND */ + ["\uFF07", "\uFF07"], /* FULLWIDTH APOSTROPHE */ + ["\uFF08", "\uFF08"], /* FULLWIDTH LEFT PARENTHESIS (FULLWIDTH OPENING PARENTHESIS) */ + ["\uFF09", "\uFF09"], /* FULLWIDTH RIGHT PARENTHESIS (FULLWIDTH CLOSING PARENTHESIS) */ + ["\uFF0A", "\uFF0A"], /* FULLWIDTH ASTERISK */ + ["\uFF0B", "\uFF0B"], /* FULLWIDTH PLUS SIGN */ + ["\uFF0C", "\uFF0C"], /* FULLWIDTH COMMA */ + ["\uFF0D", "\uFF0D"], /* FULLWIDTH HYPHEN-MINUS */ + ["\uFF0E", "\uFF0E"], /* FULLWIDTH FULL STOP (FULLWIDTH PERIOD) */ + ["\uFF0F", "\uFF0F"], /* FULLWIDTH SOLIDUS (FULLWIDTH SLASH) */ + ["\uFF10", "\uFF10"], /* FULLWIDTH DIGIT ZERO */ + ["\uFF11", "\uFF11"], /* FULLWIDTH DIGIT ONE */ + ["\uFF12", "\uFF12"], /* FULLWIDTH DIGIT TWO */ + ["\uFF13", "\uFF13"], /* FULLWIDTH DIGIT THREE */ + ["\uFF14", "\uFF14"], /* FULLWIDTH DIGIT FOUR */ + ["\uFF15", "\uFF15"], /* FULLWIDTH DIGIT FIVE */ + ["\uFF16", "\uFF16"], /* FULLWIDTH DIGIT SIX */ + ["\uFF17", "\uFF17"], /* FULLWIDTH DIGIT SEVEN */ + ["\uFF18", "\uFF18"], /* FULLWIDTH DIGIT EIGHT */ + ["\uFF19", "\uFF19"], /* FULLWIDTH DIGIT NINE */ + ["\uFF1A", "\uFF1A"], /* FULLWIDTH COLON */ + ["\uFF1B", "\uFF1B"], /* FULLWIDTH SEMICOLON */ + ["\uFF1C", "\uFF1C"], /* FULLWIDTH LESS-THAN SIGN */ + ["\uFF1D", "\uFF1D"], /* FULLWIDTH EQUALS SIGN */ + ["\uFF1E", "\uFF1E"], /* FULLWIDTH GREATER-THAN SIGN */ + ["\uFF1F", "\uFF1F"], /* FULLWIDTH QUESTION MARK */ + ["\uFF20", "\uFF20"], /* FULLWIDTH COMMERCIAL AT */ + ["\uFF21", "\uFF41"], /* FULLWIDTH LATIN CAPITAL LETTER A */ + ["\uFF22", "\uFF42"], /* FULLWIDTH LATIN CAPITAL LETTER B */ + ["\uFF23", "\uFF43"], /* FULLWIDTH LATIN CAPITAL LETTER C */ + ["\uFF24", "\uFF44"], /* FULLWIDTH LATIN CAPITAL LETTER D */ + ["\uFF25", "\uFF45"], /* FULLWIDTH LATIN CAPITAL LETTER E */ + ["\uFF26", "\uFF46"], /* FULLWIDTH LATIN CAPITAL LETTER F */ + ["\uFF27", "\uFF47"], /* FULLWIDTH LATIN CAPITAL LETTER G */ + ["\uFF28", "\uFF48"], /* FULLWIDTH LATIN CAPITAL LETTER H */ + ["\uFF29", "\uFF49"], /* FULLWIDTH LATIN CAPITAL LETTER I */ + ["\uFF2A", "\uFF4A"], /* FULLWIDTH LATIN CAPITAL LETTER J */ + ["\uFF2B", "\uFF4B"], /* FULLWIDTH LATIN CAPITAL LETTER K */ + ["\uFF2C", "\uFF4C"], /* FULLWIDTH LATIN CAPITAL LETTER L */ + ["\uFF2D", "\uFF4D"], /* FULLWIDTH LATIN CAPITAL LETTER M */ + ["\uFF2E", "\uFF4E"], /* FULLWIDTH LATIN CAPITAL LETTER N */ + ["\uFF2F", "\uFF4F"], /* FULLWIDTH LATIN CAPITAL LETTER O */ + ["\uFF30", "\uFF50"], /* FULLWIDTH LATIN CAPITAL LETTER P */ + ["\uFF31", "\uFF51"], /* FULLWIDTH LATIN CAPITAL LETTER Q */ + ["\uFF32", "\uFF52"], /* FULLWIDTH LATIN CAPITAL LETTER R */ + ["\uFF33", "\uFF53"], /* FULLWIDTH LATIN CAPITAL LETTER S */ + ["\uFF34", "\uFF54"], /* FULLWIDTH LATIN CAPITAL LETTER T */ + ["\uFF35", "\uFF55"], /* FULLWIDTH LATIN CAPITAL LETTER U */ + ["\uFF36", "\uFF56"], /* FULLWIDTH LATIN CAPITAL LETTER V */ + ["\uFF37", "\uFF57"], /* FULLWIDTH LATIN CAPITAL LETTER W */ + ["\uFF38", "\uFF58"], /* FULLWIDTH LATIN CAPITAL LETTER X */ + ["\uFF39", "\uFF59"], /* FULLWIDTH LATIN CAPITAL LETTER Y */ + ["\uFF3A", "\uFF5A"], /* FULLWIDTH LATIN CAPITAL LETTER Z */ + ["\uFF3B", "\uFF3B"], /* FULLWIDTH LEFT SQUARE BRACKET (FULLWIDTH OPENING SQUARE BRACKET) */ + ["\uFF3C", "\uFF3C"], /* FULLWIDTH REVERSE SOLIDUS (FULLWIDTH BACKSLASH) */ + ["\uFF3D", "\uFF3D"], /* FULLWIDTH RIGHT SQUARE BRACKET (FULLWIDTH CLOSING SQUARE BRACKET) */ + ["\uFF3E", "\uFF3E"], /* FULLWIDTH CIRCUMFLEX ACCENT (FULLWIDTH SPACING CIRCUMFLEX) */ + ["\uFF3F", "\uFF3F"], /* FULLWIDTH LOW LINE (FULLWIDTH SPACING UNDERSCORE) */ + ["\uFF40", "\uFF40"], /* FULLWIDTH GRAVE ACCENT (FULLWIDTH SPACING GRAVE) */ + ["\uFF21", "\uFF41"], /* FULLWIDTH LATIN SMALL LETTER A */ + ["\uFF22", "\uFF42"], /* FULLWIDTH LATIN SMALL LETTER B */ + ["\uFF23", "\uFF43"], /* FULLWIDTH LATIN SMALL LETTER C */ + ["\uFF24", "\uFF44"], /* FULLWIDTH LATIN SMALL LETTER D */ + ["\uFF25", "\uFF45"], /* FULLWIDTH LATIN SMALL LETTER E */ + ["\uFF26", "\uFF46"], /* FULLWIDTH LATIN SMALL LETTER F */ + ["\uFF27", "\uFF47"], /* FULLWIDTH LATIN SMALL LETTER G */ + ["\uFF28", "\uFF48"], /* FULLWIDTH LATIN SMALL LETTER H */ + ["\uFF29", "\uFF49"], /* FULLWIDTH LATIN SMALL LETTER I */ + ["\uFF2A", "\uFF4A"], /* FULLWIDTH LATIN SMALL LETTER J */ + ["\uFF2B", "\uFF4B"], /* FULLWIDTH LATIN SMALL LETTER K */ + ["\uFF2C", "\uFF4C"], /* FULLWIDTH LATIN SMALL LETTER L */ + ["\uFF2D", "\uFF4D"], /* FULLWIDTH LATIN SMALL LETTER M */ + ["\uFF2E", "\uFF4E"], /* FULLWIDTH LATIN SMALL LETTER N */ + ["\uFF2F", "\uFF4F"], /* FULLWIDTH LATIN SMALL LETTER O */ + ["\uFF30", "\uFF50"], /* FULLWIDTH LATIN SMALL LETTER P */ + ["\uFF31", "\uFF51"], /* FULLWIDTH LATIN SMALL LETTER Q */ + ["\uFF32", "\uFF52"], /* FULLWIDTH LATIN SMALL LETTER R */ + ["\uFF33", "\uFF53"], /* FULLWIDTH LATIN SMALL LETTER S */ + ["\uFF34", "\uFF54"], /* FULLWIDTH LATIN SMALL LETTER T */ + ["\uFF35", "\uFF55"], /* FULLWIDTH LATIN SMALL LETTER U */ + ["\uFF36", "\uFF56"], /* FULLWIDTH LATIN SMALL LETTER V */ + ["\uFF37", "\uFF57"], /* FULLWIDTH LATIN SMALL LETTER W */ + ["\uFF38", "\uFF58"], /* FULLWIDTH LATIN SMALL LETTER X */ + ["\uFF39", "\uFF59"], /* FULLWIDTH LATIN SMALL LETTER Y */ + ["\uFF3A", "\uFF5A"], /* FULLWIDTH LATIN SMALL LETTER Z */ + ["\uFF5B", "\uFF5B"], /* FULLWIDTH LEFT CURLY BRACKET (FULLWIDTH OPENING CURLY BRACKET) */ + ["\uFF5C", "\uFF5C"], /* FULLWIDTH VERTICAL LINE (FULLWIDTH VERTICAL BAR) */ + ["\uFF5D", "\uFF5D"], /* FULLWIDTH RIGHT CURLY BRACKET (FULLWIDTH CLOSING CURLY BRACKET) */ + ["\uFF5E", "\uFF5E"], /* FULLWIDTH TILDE (FULLWIDTH SPACING TILDE) */ + ["\uFF5F", "\uFF5F"], /* FULLWIDTH LEFT WHITE PARENTHESIS */ + ["\uFF60", "\uFF60"], /* FULLWIDTH RIGHT WHITE PARENTHESIS */ + ["\uFF61", "\uFF61"], /* HALFWIDTH IDEOGRAPHIC FULL STOP (HALFWIDTH IDEOGRAPHIC PERIOD) */ + ["\uFF62", "\uFF62"], /* HALFWIDTH LEFT CORNER BRACKET (HALFWIDTH OPENING CORNER BRACKET) */ + ["\uFF63", "\uFF63"], /* HALFWIDTH RIGHT CORNER BRACKET (HALFWIDTH CLOSING CORNER BRACKET) */ + ["\uFF64", "\uFF64"], /* HALFWIDTH IDEOGRAPHIC COMMA */ + ["\uFF65", "\uFF65"], /* HALFWIDTH KATAKANA MIDDLE DOT */ + ["\uFF66", "\uFF66"], /* HALFWIDTH KATAKANA LETTER WO */ + ["\uFF67", "\uFF67"], /* HALFWIDTH KATAKANA LETTER SMALL A */ + ["\uFF68", "\uFF68"], /* HALFWIDTH KATAKANA LETTER SMALL I */ + ["\uFF69", "\uFF69"], /* HALFWIDTH KATAKANA LETTER SMALL U */ + ["\uFF6A", "\uFF6A"], /* HALFWIDTH KATAKANA LETTER SMALL E */ + ["\uFF6B", "\uFF6B"], /* HALFWIDTH KATAKANA LETTER SMALL O */ + ["\uFF6C", "\uFF6C"], /* HALFWIDTH KATAKANA LETTER SMALL YA */ + ["\uFF6D", "\uFF6D"], /* HALFWIDTH KATAKANA LETTER SMALL YU */ + ["\uFF6E", "\uFF6E"], /* HALFWIDTH KATAKANA LETTER SMALL YO */ + ["\uFF6F", "\uFF6F"], /* HALFWIDTH KATAKANA LETTER SMALL TU */ + ["\uFF70", "\uFF70"], /* HALFWIDTH KATAKANA-HIRAGANA PROLONGED SOUND MARK */ + ["\uFF71", "\uFF71"], /* HALFWIDTH KATAKANA LETTER A */ + ["\uFF72", "\uFF72"], /* HALFWIDTH KATAKANA LETTER I */ + ["\uFF73", "\uFF73"], /* HALFWIDTH KATAKANA LETTER U */ + ["\uFF74", "\uFF74"], /* HALFWIDTH KATAKANA LETTER E */ + ["\uFF75", "\uFF75"], /* HALFWIDTH KATAKANA LETTER O */ + ["\uFF76", "\uFF76"], /* HALFWIDTH KATAKANA LETTER KA */ + ["\uFF77", "\uFF77"], /* HALFWIDTH KATAKANA LETTER KI */ + ["\uFF78", "\uFF78"], /* HALFWIDTH KATAKANA LETTER KU */ + ["\uFF79", "\uFF79"], /* HALFWIDTH KATAKANA LETTER KE */ + ["\uFF7A", "\uFF7A"], /* HALFWIDTH KATAKANA LETTER KO */ + ["\uFF7B", "\uFF7B"], /* HALFWIDTH KATAKANA LETTER SA */ + ["\uFF7C", "\uFF7C"], /* HALFWIDTH KATAKANA LETTER SI */ + ["\uFF7D", "\uFF7D"], /* HALFWIDTH KATAKANA LETTER SU */ + ["\uFF7E", "\uFF7E"], /* HALFWIDTH KATAKANA LETTER SE */ + ["\uFF7F", "\uFF7F"], /* HALFWIDTH KATAKANA LETTER SO */ + ["\uFF80", "\uFF80"], /* HALFWIDTH KATAKANA LETTER TA */ + ["\uFF81", "\uFF81"], /* HALFWIDTH KATAKANA LETTER TI */ + ["\uFF82", "\uFF82"], /* HALFWIDTH KATAKANA LETTER TU */ + ["\uFF83", "\uFF83"], /* HALFWIDTH KATAKANA LETTER TE */ + ["\uFF84", "\uFF84"], /* HALFWIDTH KATAKANA LETTER TO */ + ["\uFF85", "\uFF85"], /* HALFWIDTH KATAKANA LETTER NA */ + ["\uFF86", "\uFF86"], /* HALFWIDTH KATAKANA LETTER NI */ + ["\uFF87", "\uFF87"], /* HALFWIDTH KATAKANA LETTER NU */ + ["\uFF88", "\uFF88"], /* HALFWIDTH KATAKANA LETTER NE */ + ["\uFF89", "\uFF89"], /* HALFWIDTH KATAKANA LETTER NO */ + ["\uFF8A", "\uFF8A"], /* HALFWIDTH KATAKANA LETTER HA */ + ["\uFF8B", "\uFF8B"], /* HALFWIDTH KATAKANA LETTER HI */ + ["\uFF8C", "\uFF8C"], /* HALFWIDTH KATAKANA LETTER HU */ + ["\uFF8D", "\uFF8D"], /* HALFWIDTH KATAKANA LETTER HE */ + ["\uFF8E", "\uFF8E"], /* HALFWIDTH KATAKANA LETTER HO */ + ["\uFF8F", "\uFF8F"], /* HALFWIDTH KATAKANA LETTER MA */ + ["\uFF90", "\uFF90"], /* HALFWIDTH KATAKANA LETTER MI */ + ["\uFF91", "\uFF91"], /* HALFWIDTH KATAKANA LETTER MU */ + ["\uFF92", "\uFF92"], /* HALFWIDTH KATAKANA LETTER ME */ + ["\uFF93", "\uFF93"], /* HALFWIDTH KATAKANA LETTER MO */ + ["\uFF94", "\uFF94"], /* HALFWIDTH KATAKANA LETTER YA */ + ["\uFF95", "\uFF95"], /* HALFWIDTH KATAKANA LETTER YU */ + ["\uFF96", "\uFF96"], /* HALFWIDTH KATAKANA LETTER YO */ + ["\uFF97", "\uFF97"], /* HALFWIDTH KATAKANA LETTER RA */ + ["\uFF98", "\uFF98"], /* HALFWIDTH KATAKANA LETTER RI */ + ["\uFF99", "\uFF99"], /* HALFWIDTH KATAKANA LETTER RU */ + ["\uFF9A", "\uFF9A"], /* HALFWIDTH KATAKANA LETTER RE */ + ["\uFF9B", "\uFF9B"], /* HALFWIDTH KATAKANA LETTER RO */ + ["\uFF9C", "\uFF9C"], /* HALFWIDTH KATAKANA LETTER WA */ + ["\uFF9D", "\uFF9D"], /* HALFWIDTH KATAKANA LETTER N */ + ["\uFF9E", "\uFF9E"], /* HALFWIDTH KATAKANA VOICED SOUND MARK */ + ["\uFF9F", "\uFF9F"], /* HALFWIDTH KATAKANA SEMI-VOICED SOUND MARK */ + ["\uFFA0", "\uFFA0"], /* HALFWIDTH HANGUL FILLER (HALFWIDTH HANGUL CAE OM) */ + ["\uFFA1", "\uFFA1"], /* HALFWIDTH HANGUL LETTER KIYEOK (HALFWIDTH HANGUL LETTER GIYEOG) */ + ["\uFFA2", "\uFFA2"], /* HALFWIDTH HANGUL LETTER SSANGKIYEOK (HALFWIDTH HANGUL LETTER SSANG GIYEOG) */ + ["\uFFA3", "\uFFA3"], /* HALFWIDTH HANGUL LETTER KIYEOK-SIOS (HALFWIDTH HANGUL LETTER GIYEOG SIOS) */ + ["\uFFA4", "\uFFA4"], /* HALFWIDTH HANGUL LETTER NIEUN */ + ["\uFFA5", "\uFFA5"], /* HALFWIDTH HANGUL LETTER NIEUN-CIEUC (HALFWIDTH HANGUL LETTER NIEUN JIEUJ) */ + ["\uFFA6", "\uFFA6"], /* HALFWIDTH HANGUL LETTER NIEUN-HIEUH (HALFWIDTH HANGUL LETTER NIEUN HIEUH) */ + ["\uFFA7", "\uFFA7"], /* HALFWIDTH HANGUL LETTER TIKEUT (HALFWIDTH HANGUL LETTER DIGEUD) */ + ["\uFFA8", "\uFFA8"], /* HALFWIDTH HANGUL LETTER SSANGTIKEUT (HALFWIDTH HANGUL LETTER SSANG DIGEUD) */ + ["\uFFA9", "\uFFA9"], /* HALFWIDTH HANGUL LETTER RIEUL (HALFWIDTH HANGUL LETTER LIEUL) */ + ["\uFFAA", "\uFFAA"], /* HALFWIDTH HANGUL LETTER RIEUL-KIYEOK (HALFWIDTH HANGUL LETTER LIEUL GIYEOG) */ + ["\uFFAB", "\uFFAB"], /* HALFWIDTH HANGUL LETTER RIEUL-MIEUM (HALFWIDTH HANGUL LETTER LIEUL MIEUM) */ + ["\uFFAC", "\uFFAC"], /* HALFWIDTH HANGUL LETTER RIEUL-PIEUP (HALFWIDTH HANGUL LETTER LIEUL BIEUB) */ + ["\uFFAD", "\uFFAD"], /* HALFWIDTH HANGUL LETTER RIEUL-SIOS (HALFWIDTH HANGUL LETTER LIEUL SIOS) */ + ["\uFFAE", "\uFFAE"], /* HALFWIDTH HANGUL LETTER RIEUL-THIEUTH (HALFWIDTH HANGUL LETTER LIEUL TIEUT) */ + ["\uFFAF", "\uFFAF"], /* HALFWIDTH HANGUL LETTER RIEUL-PHIEUPH (HALFWIDTH HANGUL LETTER LIEUL PIEUP) */ + ["\uFFB0", "\uFFB0"], /* HALFWIDTH HANGUL LETTER RIEUL-HIEUH (HALFWIDTH HANGUL LETTER LIEUL HIEUH) */ + ["\uFFB1", "\uFFB1"], /* HALFWIDTH HANGUL LETTER MIEUM */ + ["\uFFB2", "\uFFB2"], /* HALFWIDTH HANGUL LETTER PIEUP (HALFWIDTH HANGUL LETTER BIEUB) */ + ["\uFFB3", "\uFFB3"], /* HALFWIDTH HANGUL LETTER SSANGPIEUP (HALFWIDTH HANGUL LETTER SSANG BIEUB) */ + ["\uFFB4", "\uFFB4"], /* HALFWIDTH HANGUL LETTER PIEUP-SIOS (HALFWIDTH HANGUL LETTER BIEUB SIOS) */ + ["\uFFB5", "\uFFB5"], /* HALFWIDTH HANGUL LETTER SIOS */ + ["\uFFB6", "\uFFB6"], /* HALFWIDTH HANGUL LETTER SSANGSIOS (HALFWIDTH HANGUL LETTER SSANG SIOS) */ + ["\uFFB7", "\uFFB7"], /* HALFWIDTH HANGUL LETTER IEUNG */ + ["\uFFB8", "\uFFB8"], /* HALFWIDTH HANGUL LETTER CIEUC (HALFWIDTH HANGUL LETTER JIEUJ) */ + ["\uFFB9", "\uFFB9"], /* HALFWIDTH HANGUL LETTER SSANGCIEUC (HALFWIDTH HANGUL LETTER SSANG JIEUJ) */ + ["\uFFBA", "\uFFBA"], /* HALFWIDTH HANGUL LETTER CHIEUCH (HALFWIDTH HANGUL LETTER CIEUC) */ + ["\uFFBB", "\uFFBB"], /* HALFWIDTH HANGUL LETTER KHIEUKH (HALFWIDTH HANGUL LETTER KIYEOK) */ + ["\uFFBC", "\uFFBC"], /* HALFWIDTH HANGUL LETTER THIEUTH (HALFWIDTH HANGUL LETTER TIEUT) */ + ["\uFFBD", "\uFFBD"], /* HALFWIDTH HANGUL LETTER PHIEUPH (HALFWIDTH HANGUL LETTER PIEUP) */ + ["\uFFBE", "\uFFBE"], /* HALFWIDTH HANGUL LETTER HIEUH */ + ["\uFFBF", "\uFFBF"], + ["\uFFC0", "\uFFC0"], + ["\uFFC1", "\uFFC1"], + ["\uFFC2", "\uFFC2"], /* HALFWIDTH HANGUL LETTER A */ + ["\uFFC3", "\uFFC3"], /* HALFWIDTH HANGUL LETTER AE */ + ["\uFFC4", "\uFFC4"], /* HALFWIDTH HANGUL LETTER YA */ + ["\uFFC5", "\uFFC5"], /* HALFWIDTH HANGUL LETTER YAE */ + ["\uFFC6", "\uFFC6"], /* HALFWIDTH HANGUL LETTER EO */ + ["\uFFC7", "\uFFC7"], /* HALFWIDTH HANGUL LETTER E */ + ["\uFFC8", "\uFFC8"], + ["\uFFC9", "\uFFC9"], + ["\uFFCA", "\uFFCA"], /* HALFWIDTH HANGUL LETTER YEO */ + ["\uFFCB", "\uFFCB"], /* HALFWIDTH HANGUL LETTER YE */ + ["\uFFCC", "\uFFCC"], /* HALFWIDTH HANGUL LETTER O */ + ["\uFFCD", "\uFFCD"], /* HALFWIDTH HANGUL LETTER WA */ + ["\uFFCE", "\uFFCE"], /* HALFWIDTH HANGUL LETTER WAE */ + ["\uFFCF", "\uFFCF"], /* HALFWIDTH HANGUL LETTER OE */ + ["\uFFD0", "\uFFD0"], + ["\uFFD1", "\uFFD1"], + ["\uFFD2", "\uFFD2"], /* HALFWIDTH HANGUL LETTER YO */ + ["\uFFD3", "\uFFD3"], /* HALFWIDTH HANGUL LETTER U */ + ["\uFFD4", "\uFFD4"], /* HALFWIDTH HANGUL LETTER WEO */ + ["\uFFD5", "\uFFD5"], /* HALFWIDTH HANGUL LETTER WE */ + ["\uFFD6", "\uFFD6"], /* HALFWIDTH HANGUL LETTER WI */ + ["\uFFD7", "\uFFD7"], /* HALFWIDTH HANGUL LETTER YU */ + ["\uFFD8", "\uFFD8"], + ["\uFFD9", "\uFFD9"], + ["\uFFDA", "\uFFDA"], /* HALFWIDTH HANGUL LETTER EU */ + ["\uFFDB", "\uFFDB"], /* HALFWIDTH HANGUL LETTER YI */ + ["\uFFDC", "\uFFDC"], /* HALFWIDTH HANGUL LETTER I */ + ["\uFFDD", "\uFFDD"], + ["\uFFDE", "\uFFDE"], + ["\uFFDF", "\uFFDF"], + ["\uFFE0", "\uFFE0"], /* FULLWIDTH CENT SIGN */ + ["\uFFE1", "\uFFE1"], /* FULLWIDTH POUND SIGN */ + ["\uFFE2", "\uFFE2"], /* FULLWIDTH NOT SIGN */ + ["\uFFE3", "\uFFE3"], /* FULLWIDTH MACRON (FULLWIDTH SPACING MACRON) */ + ["\uFFE4", "\uFFE4"], /* FULLWIDTH BROKEN BAR (FULLWIDTH BROKEN VERTICAL BAR) */ + ["\uFFE5", "\uFFE5"], /* FULLWIDTH YEN SIGN */ + ["\uFFE6", "\uFFE6"], /* FULLWIDTH WON SIGN */ + ["\uFFE7", "\uFFE7"], + ["\uFFE8", "\uFFE8"], /* HALFWIDTH FORMS LIGHT VERTICAL */ + ["\uFFE9", "\uFFE9"], /* HALFWIDTH LEFTWARDS ARROW */ + ["\uFFEA", "\uFFEA"], /* HALFWIDTH UPWARDS ARROW */ + ["\uFFEB", "\uFFEB"], /* HALFWIDTH RIGHTWARDS ARROW */ + ["\uFFEC", "\uFFEC"], /* HALFWIDTH DOWNWARDS ARROW */ + ["\uFFED", "\uFFED"], /* HALFWIDTH BLACK SQUARE */ + ["\uFFEE", "\uFFEE"], /* HALFWIDTH WHITE CIRCLE */ + ["\uFFEF", "\uFFEF"], + ["\uFFF0", "\uFFF0"], + ["\uFFF1", "\uFFF1"], + ["\uFFF2", "\uFFF2"], + ["\uFFF3", "\uFFF3"], + ["\uFFF4", "\uFFF4"], + ["\uFFF5", "\uFFF5"], + ["\uFFF6", "\uFFF6"], + ["\uFFF7", "\uFFF7"], + ["\uFFF8", "\uFFF8"], + ["\uFFF9", "\uFFF9"], /* INTERLINEAR ANNOTATION ANCHOR */ + ["\uFFFA", "\uFFFA"], /* INTERLINEAR ANNOTATION SEPARATOR */ + ["\uFFFB", "\uFFFB"], /* INTERLINEAR ANNOTATION TERMINATOR */ + ["\uFFFC", "\uFFFC"], /* OBJECT REPLACEMENT CHARACTER */ + ["\uFFFD", "\uFFFD"], /* REPLACEMENT CHARACTER */ + ["\uFFFE", "\uFFFE"], + ["\uFFFF", "\uFFFF"], +]; + +assert.sameValue(mapping.length, 0x10000); +for (var i = 0; i <= 0xffff; i++) { + var char = String.fromCharCode(i); + var info = mapping[i]; + + assert.sameValue(char.toUpperCase(), info[0]); + assert.sameValue(char.toLowerCase(), info[1]); +} + diff --git a/test/staging/sm/String/thisv-error.js b/test/staging/sm/String/thisv-error.js new file mode 100644 index 0000000000..8c3d1622fb --- /dev/null +++ b/test/staging/sm/String/thisv-error.js @@ -0,0 +1,47 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-String-shell.js, sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +function testName(thisv) { + var failures = [ + // Not a function + "length", + // TODO: Different implementation + "toString", + "toSource", + "valueOf", + // Aliases + "trimLeft", + "trimRight", + ] + + var keys = Object.getOwnPropertyNames(String.prototype); + for (var key of keys) { + if (key === "constructor") { + assert.sameValue(String.prototype[key].call(thisv), ""); + } else if (failures.includes(key)) { + assertThrowsInstanceOf(() => String.prototype[key].call(thisv), TypeError, key); + } else { + var expected = `String.prototype.${key} called on incompatible ${thisv}`; + assertThrowsInstanceOfWithMessage(() => String.prototype[key].call(thisv), TypeError, expected, key) + } + } +} +testName(null); +testName(undefined); + +// On-off test for Symbol.iterator +function testIterator(thisv) { + assertThrowsInstanceOfWithMessage(() => String.prototype[Symbol.iterator].call(thisv), TypeError, + `String.prototype[Symbol.iterator] called on incompatible ${thisv}`); +} +testIterator(null); +testIterator(undefined); + diff --git a/test/staging/sm/String/two-length-nonlatin-indexOf.js b/test/staging/sm/String/two-length-nonlatin-indexOf.js new file mode 100644 index 0000000000..2b96d68edf --- /dev/null +++ b/test/staging/sm/String/two-length-nonlatin-indexOf.js @@ -0,0 +1,20 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-String-shell.js, sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +var BUGNUMBER = 1801690; +var summary = "indexOf function doesn't work correctly with polish letters"; + +// Prior to this bug being fixed, this would return 0. This is because 'ł' +// truncates to the same 8-bit number as 'B'. We had a guard on the first +// character, but there was a hole in our logic specifically for the +// second character of the needle string. +assert.sameValue("AB".indexOf("Ał"), -1); + diff --git a/test/staging/sm/String/unicode-braced.js b/test/staging/sm/String/unicode-braced.js new file mode 100644 index 0000000000..ba085d8853 --- /dev/null +++ b/test/staging/sm/String/unicode-braced.js @@ -0,0 +1,73 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-String-shell.js, sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +var BUGNUMBER = 320500; +var summary = 'Add \\u{xxxxxx} string literals'; + +print(BUGNUMBER + ": " + summary); + +assert.sameValue("\u{0}", String.fromCodePoint(0x0)); +assert.sameValue("\u{1}", String.fromCodePoint(0x1)); +assert.sameValue("\u{10}", String.fromCodePoint(0x10)); +assert.sameValue("\u{100}", String.fromCodePoint(0x100)); +assert.sameValue("\u{1000}", String.fromCodePoint(0x1000)); +assert.sameValue("\u{D7FF}", String.fromCodePoint(0xD7FF)); +assert.sameValue("\u{D800}", String.fromCodePoint(0xD800)); +assert.sameValue("\u{DBFF}", String.fromCodePoint(0xDBFF)); +assert.sameValue("\u{DC00}", String.fromCodePoint(0xDC00)); +assert.sameValue("\u{DFFF}", String.fromCodePoint(0xDFFF)); +assert.sameValue("\u{E000}", String.fromCodePoint(0xE000)); +assert.sameValue("\u{10000}", String.fromCodePoint(0x10000)); +assert.sameValue("\u{100000}", String.fromCodePoint(0x100000)); +assert.sameValue("\u{10FFFF}", String.fromCodePoint(0x10FFFF)); +assert.sameValue("\u{10ffff}", String.fromCodePoint(0x10FFFF)); + +assert.sameValue("A\u{1}\u{10}B\u{100}\u{1000}\u{10000}C\u{100000}", + "A" + + String.fromCodePoint(0x1) + + String.fromCodePoint(0x10) + + "B" + + String.fromCodePoint(0x100) + + String.fromCodePoint(0x1000) + + String.fromCodePoint(0x10000) + + "C" + + String.fromCodePoint(0x100000)); + +assert.sameValue('\u{10ffff}', String.fromCodePoint(0x10FFFF)); +assert.sameValue(`\u{10ffff}`, String.fromCodePoint(0x10FFFF)); +assert.sameValue(`\u{10ffff}${""}`, String.fromCodePoint(0x10FFFF)); +assert.sameValue(`${""}\u{10ffff}`, String.fromCodePoint(0x10FFFF)); +assert.sameValue(`${""}\u{10ffff}${""}`, String.fromCodePoint(0x10FFFF)); + +assert.sameValue("\u{00}", String.fromCodePoint(0x0)); +assert.sameValue("\u{00000000000000000}", String.fromCodePoint(0x0)); +assert.sameValue("\u{00000000000001000}", String.fromCodePoint(0x1000)); + +assert.sameValue(eval(`"\\u{${"0".repeat(Math.pow(2, 24)) + "1234"}}"`), String.fromCodePoint(0x1234)); + +assert.sameValue("\U{0}", "U{0}"); + +assertThrowsInstanceOf(() => eval(`"\\u{-1}"`), SyntaxError); +assertThrowsInstanceOf(() => eval(`"\\u{0.0}"`), SyntaxError); +assertThrowsInstanceOf(() => eval(`"\\u{G}"`), SyntaxError); +assertThrowsInstanceOf(() => eval(`"\\u{}"`), SyntaxError); +assertThrowsInstanceOf(() => eval(`"\\u{{"`), SyntaxError); +assertThrowsInstanceOf(() => eval(`"\\u{"`), SyntaxError); +assertThrowsInstanceOf(() => eval(`"\\u{110000}"`), SyntaxError); +assertThrowsInstanceOf(() => eval(`"\\u{00110000}"`), SyntaxError); +assertThrowsInstanceOf(() => eval(`"\\u{100000000000000000000000000000}"`), SyntaxError); +assertThrowsInstanceOf(() => eval(`"\\u{FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF}"`), SyntaxError); +assertThrowsInstanceOf(() => eval(`"\\u{ FFFF}"`), SyntaxError); +assertThrowsInstanceOf(() => eval(`"\\u{FFFF }"`), SyntaxError); +assertThrowsInstanceOf(() => eval(`"\\u{FF FF}"`), SyntaxError); +assertThrowsInstanceOf(() => eval(`"\\u{F F F F}"`), SyntaxError); +assertThrowsInstanceOf(() => eval(`"\\u{100000001}"`), SyntaxError); + diff --git a/test/staging/sm/Symbol/as-base-value.js b/test/staging/sm/Symbol/as-base-value.js new file mode 100644 index 0000000000..4004274c4f --- /dev/null +++ b/test/staging/sm/Symbol/as-base-value.js @@ -0,0 +1,95 @@ +/* + * Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/licenses/publicdomain/ + */ + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +// Like other primitives, symbols can be treated as objects, using object-like +// syntax: `symbol.prop` or `symbol[key]`. +// +// In ECMAScript spec jargon, this creates a Reference whose base value is a +// primitive Symbol value. + +var symbols = [ + Symbol(), + Symbol("ponies"), + Symbol.for("sym"), + Symbol.iterator +]; + +// Test accessor property, used below. +var gets, sets; +Object.defineProperty(Symbol.prototype, "prop", { + get: function () { + "use strict"; + gets++; + assert.sameValue(typeof this, "symbol"); + assert.sameValue(this, sym); + return "got"; + }, + set: function (v) { + "use strict"; + sets++; + assert.sameValue(typeof this, "symbol"); + assert.sameValue(this, sym); + assert.sameValue(v, "newvalue"); + } +}); + +for (var sym of symbols) { + assert.sameValue(sym.constructor, Symbol); + + // method on Object.prototype + assert.sameValue(sym.hasOwnProperty("constructor"), false); + assert.sameValue(sym.toLocaleString(), sym.toString()); // once .toString() exists + + // custom method monkeypatched onto Symbol.prototype + Symbol.prototype.nonStrictMethod = function (arg) { + assert.sameValue(arg, "ok"); + assert.sameValue(this instanceof Symbol, true); + assert.sameValue(this.valueOf(), sym); + return 13; + }; + assert.sameValue(sym.nonStrictMethod("ok"), 13); + + // the same, but strict mode + Symbol.prototype.strictMethod = function (arg) { + "use strict"; + assert.sameValue(arg, "ok2"); + assert.sameValue(this, sym); + return 14; + }; + assert.sameValue(sym.strictMethod("ok2"), 14); + + // getter/setter on Symbol.prototype + gets = 0; + sets = 0; + var propname = "prop"; + + assert.sameValue(sym.prop, "got"); + assert.sameValue(gets, 1); + assert.sameValue(sym[propname], "got"); + assert.sameValue(gets, 2); + + assert.sameValue(sym.prop = "newvalue", "newvalue"); + assert.sameValue(sets, 1); + assert.sameValue(sym[propname] = "newvalue", "newvalue"); + assert.sameValue(sets, 2); + + // non-existent property + assert.sameValue(sym.noSuchProp, undefined); + var noSuchPropName = "nonesuch"; + assert.sameValue(sym[noSuchPropName], undefined); + + // non-existent method + assertThrowsInstanceOf(() => sym.noSuchProp(), TypeError); + assertThrowsInstanceOf(() => sym[noSuchPropName](), TypeError); +} + diff --git a/test/staging/sm/Symbol/comparisons.js b/test/staging/sm/Symbol/comparisons.js new file mode 100644 index 0000000000..f0073a117e --- /dev/null +++ b/test/staging/sm/Symbol/comparisons.js @@ -0,0 +1,42 @@ +/* + * Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/licenses/publicdomain/ + */ + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +var symbols = [ + Symbol(), + Symbol("0"), + Symbol.for("snowman"), + Symbol.iterator +]; + +var values = [ + undefined, null, 0, 3.14, -0, NaN, "", "alphabet", Symbol("0"), + {}, [] +]; + +for (var comparator of ["==", "!=", "===", "!=="]) { + var f = Function("a, b", "return a " + comparator + " b;"); + var expected = (comparator[0] == '!'); + for (var a of symbols) { + for (var b of values) + assert.sameValue(f(a, b), expected); + } +} + +for (var comparator of ["<", "<=", ">", ">="]) { + var f = Function("a, b", "return a " + comparator + " b;"); + for (var a of symbols) { + for (var b of values) + assertThrowsInstanceOf(() => f(a, b), TypeError); + } +} + diff --git a/test/staging/sm/Symbol/constructor.js b/test/staging/sm/Symbol/constructor.js new file mode 100644 index 0000000000..1a3c152c35 --- /dev/null +++ b/test/staging/sm/Symbol/constructor.js @@ -0,0 +1,43 @@ +/* + * Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/licenses/publicdomain/ + */ + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +// Symbol(symbol) throws a TypeError. +var sym = Symbol(); +assertThrowsInstanceOf(() => Symbol(sym), TypeError); + +// Symbol(undefined) is equivalent to Symbol(). +assert.sameValue(Symbol(undefined).toString(), "Symbol()"); + +// Otherwise, Symbol(v) means Symbol(ToString(v)). +assert.sameValue(Symbol(7).toString(), "Symbol(7)"); +assert.sameValue(Symbol(true).toString(), "Symbol(true)"); +assert.sameValue(Symbol(null).toString(), "Symbol(null)"); +assert.sameValue(Symbol([1, 2]).toString(), "Symbol(1,2)"); +var symobj = Object(sym); +assertThrowsInstanceOf(() => Symbol(symobj), TypeError); + +var hits = 0; +var obj = { + toString: function () { + hits++; + return "ponies"; + } +}; +assert.sameValue(Symbol(obj).toString(), "Symbol(ponies)"); +assert.sameValue(hits, 1); + +assert.sameValue(Object.getPrototypeOf(Symbol.prototype), Object.prototype); + +// Symbol.prototype is not itself a Symbol object. +assertThrowsInstanceOf(() => Symbol.prototype.valueOf(), TypeError); + diff --git a/test/staging/sm/Symbol/conversions.js b/test/staging/sm/Symbol/conversions.js new file mode 100644 index 0000000000..7cc4bb6753 --- /dev/null +++ b/test/staging/sm/Symbol/conversions.js @@ -0,0 +1,98 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +// Section numbers cite ES6 rev 24 (2014 April 27). + +var symbols = [ + Symbol(), + Symbol("one"), + Symbol.for("two"), + Symbol.iterator +]; + +function testSymbolConversions(sym) { + // 7.1.2 ToBoolean + assert.sameValue(Boolean(sym), true); + assert.sameValue(!sym, false); + assert.sameValue(sym || 13, sym); + assert.sameValue(sym && 13, 13); + + // 7.1.3 ToNumber + assertThrowsInstanceOf(() => +sym, TypeError); + assertThrowsInstanceOf(() => sym | 0, TypeError); + + // 7.1.12 ToString + assertThrowsInstanceOf(() => "" + sym, TypeError); + assertThrowsInstanceOf(() => sym + "", TypeError); + assertThrowsInstanceOf(() => "" + [1, 2, sym], TypeError); + assertThrowsInstanceOf(() => ["simple", "thimble", sym].join(), TypeError); + + // 21.1.1.1 String() + assert.sameValue(String(sym), sym.toString()); + + // 21.1.1.2 new String() + assertThrowsInstanceOf(() => new String(sym), TypeError); + + // 7.1.13 ToObject + var obj = Object(sym); + assert.sameValue(typeof obj, "object"); + assert.sameValue(Object.prototype.toString.call(obj), "[object Symbol]"); + assert.sameValue(Object.getPrototypeOf(obj), Symbol.prototype); + assert.sameValue(Object.getOwnPropertyNames(obj).length, 0); + assert.sameValue(Object(sym) === Object(sym), false); // new object each time + var f = function () { return this; }; + assert.sameValue(f.call(sym) === f.call(sym), false); // new object each time +} + + +for (var sym of symbols) { + testSymbolConversions(sym); + + // 7.1.1 ToPrimitive + var symobj = Object(sym); + assertThrowsInstanceOf(() => Number(symobj), TypeError); + assertThrowsInstanceOf(() => String(symobj), TypeError); + assertThrowsInstanceOf(() => symobj < 0, TypeError); + assertThrowsInstanceOf(() => 0 < symobj, TypeError); + assertThrowsInstanceOf(() => symobj + 1, TypeError); + assertThrowsInstanceOf(() => "" + symobj, TypeError); + assert.sameValue(sym == symobj, true); + assert.sameValue(sym === symobj, false); + assert.sameValue(symobj == 0, false); + assert.sameValue(0 != symobj, true); + + // 7.1.12 ToString + assertThrowsInstanceOf(() => String(Object(sym)), TypeError); +} + +// Deleting Symbol.prototype[@@toPrimitive] does not change the behavior of +// conversions from a symbol to other types. +delete Symbol.prototype[Symbol.toPrimitive]; +assert.sameValue(Symbol.toPrimitive in Symbol.prototype, false); +testSymbolConversions(symbols[0]); + +// It does change the behavior of ToPrimitive on Symbol objects, though. +// It causes the default algorithm (OrdinaryToPrimitive) to be used. +var VALUEOF_CALLED = 117.25; +Symbol.prototype.valueOf = function () { return VALUEOF_CALLED; }; +Symbol.prototype.toString = function () { return "toString called"; }; +for (var sym of symbols) { + var symobj = Object(sym); + assert.sameValue(Number(symobj), VALUEOF_CALLED); + assert.sameValue(String(symobj), "toString called"); + assert.sameValue(symobj < 0, VALUEOF_CALLED < 0); + assert.sameValue(0 < symobj, 0 < VALUEOF_CALLED); + assert.sameValue(symobj + 1, VALUEOF_CALLED + 1); + assert.sameValue("" + symobj, "" + VALUEOF_CALLED); + assert.sameValue(symobj == 0, false); + assert.sameValue(0 != symobj, true); +} + diff --git a/test/staging/sm/Symbol/enumeration-order.js b/test/staging/sm/Symbol/enumeration-order.js new file mode 100644 index 0000000000..2c477c4a56 --- /dev/null +++ b/test/staging/sm/Symbol/enumeration-order.js @@ -0,0 +1,48 @@ +/* + * Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/licenses/publicdomain/ + */ + +/*--- +includes: [deepEqual.js, sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +// Symbols follow all other property keys in the result list. +var log; +function LoggingProxy() { + return new Proxy({}, { + defineProperty: (t, key, desc) => { + log.push(key); + return true; + } + }); +} + +var keys = [ + "before", + Symbol(), + "during", + Symbol.for("during"), + Symbol.iterator, + "after" +]; +var descs = {}; +for (var k of keys) + descs[k] = {configurable: true, value: 0}; + +function test(descsObj) { + log = []; + Object.defineProperties(LoggingProxy(), descs); + assert.sameValue(log.length, keys.length); + assert.deepEqual(log.map(k => typeof k), ["string", "string", "string", "symbol", "symbol", "symbol"]); + for (var key of keys) + assert.sameValue(log.indexOf(key) !== -1, true); +} + +test(descs); +test(new Proxy(descs, {})); + diff --git a/test/staging/sm/Symbol/enumeration.js b/test/staging/sm/Symbol/enumeration.js new file mode 100644 index 0000000000..82b83dfa0f --- /dev/null +++ b/test/staging/sm/Symbol/enumeration.js @@ -0,0 +1,60 @@ +/* + * Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/licenses/publicdomain/ + */ + +/*--- +includes: [deepEqual.js, sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +// for-in loops skip properties with symbol keys, even enumerable properties. +var obj = {}; +obj[Symbol.for("moon")] = "sun"; +obj[Symbol("asleep")] = "awake"; +obj[Symbol.iterator] = "List"; +for (var x in obj) + throw "FAIL: " + String(x); + +// This includes inherited properties. +var obj2 = Object.create(obj); +for (var x in obj2) + throw "FAIL: " + String(x); + +// The same goes for proxies. +var p = new Proxy(obj, {}); +for (var x in p) + throw "FAIL: " + String(x); +var p2 = new Proxy(obj2, {}); +for (var x in p2) + throw "FAIL: " + String(x); + +// Object.keys() and .getOwnPropertyNames() also skip symbols. +assert.sameValue(Object.keys(obj).length, 0); +assert.sameValue(Object.keys(p).length, 0); +assert.sameValue(Object.keys(obj2).length, 0); +assert.sameValue(Object.keys(p2).length, 0); +assert.sameValue(Object.getOwnPropertyNames(obj).length, 0); +assert.sameValue(Object.getOwnPropertyNames(p).length, 0); +assert.sameValue(Object.getOwnPropertyNames(obj2).length, 0); +assert.sameValue(Object.getOwnPropertyNames(p2).length, 0); + +// Test interaction of Object.keys(), proxies, and symbol property keys. +var log = []; +var h = { + ownKeys: (t) => { + log.push("ownKeys"); + return ["a", "0", Symbol.for("moon"), Symbol("asleep"), Symbol.iterator]; + }, + getOwnPropertyDescriptor: (t, key) => { + log.push("gopd", key); + return {configurable: true, enumerable: true, value: 0, writable: true}; + } +}; +p = new Proxy({}, h); +assert.deepEqual(Object.keys(p), ["a", "0"]); +assert.deepEqual(log, ["ownKeys", "gopd", "a", "gopd", "0"]); + diff --git a/test/staging/sm/Symbol/equality.js b/test/staging/sm/Symbol/equality.js new file mode 100644 index 0000000000..1831d43beb --- /dev/null +++ b/test/staging/sm/Symbol/equality.js @@ -0,0 +1,38 @@ +/* + * Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/licenses/publicdomain/ + */ + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +// Symbol.for returns the same symbol whenever the same argument is passed. +assert.sameValue(Symbol.for("q") === Symbol.for("q"), true); + +// Several distinct Symbol values. +var symbols = [ + Symbol(), + Symbol("Symbol.iterator"), + Symbol("Symbol.iterator"), // distinct new symbol with the same description + Symbol.for("Symbol.iterator"), + Symbol.iterator +]; + +// Distinct symbols are never equal to each other, even if they have the same +// description. +for (var i = 0; i < symbols.length; i++) { + for (var j = i; j < symbols.length; j++) { + var expected = (i === j); + assert.sameValue(symbols[i] == symbols[j], expected); + assert.sameValue(symbols[i] != symbols[j], !expected); + assert.sameValue(symbols[i] === symbols[j], expected); + assert.sameValue(symbols[i] !== symbols[j], !expected); + assert.sameValue(Object.is(symbols[i], symbols[j]), expected); + } +} + diff --git a/test/staging/sm/Symbol/errors.js b/test/staging/sm/Symbol/errors.js new file mode 100644 index 0000000000..e5a786686a --- /dev/null +++ b/test/staging/sm/Symbol/errors.js @@ -0,0 +1,25 @@ +/* + * Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/licenses/publicdomain/ + */ + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +// Section numbers cite ES6 rev 24 (2014 April 27). + +var sym = Symbol(); + +// 7.2.2 IsCallable +assertThrowsInstanceOf(() => sym(), TypeError); +assertThrowsInstanceOf(() => Function.prototype.call.call(sym), TypeError); + +// 7.2.5 IsConstructor +assertThrowsInstanceOf(() => new sym(), TypeError); +assertThrowsInstanceOf(() => new Symbol(), TypeError); + diff --git a/test/staging/sm/Symbol/for-in-order.js b/test/staging/sm/Symbol/for-in-order.js new file mode 100644 index 0000000000..6f7274f703 --- /dev/null +++ b/test/staging/sm/Symbol/for-in-order.js @@ -0,0 +1,41 @@ +/* + * Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/licenses/publicdomain/ + */ + +/*--- +includes: [deepEqual.js, sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +// ES6 does not specify enumeration order, but implementations mostly retain +// property insertion order -- and must, for web compatibility. This test checks +// that symbol-keyed properties do not interfere with that order. + +var obj = {}; +obj[Symbol("moon")] = 0; +obj.x = 1; +obj[Symbol.for("y")] = 2 +obj.y = 3; +obj[Symbol.iterator] = function* () { yield 4; }; +obj.z = 5; +Object.prototype[Symbol.for("comet")] = 6; + +var keys = []; +for (var k in obj) + keys.push(k); +assert.deepEqual(keys, ["x", "y", "z"]); +assert.deepEqual(Object.keys(obj), ["x", "y", "z"]); + +// Test with more properties. +for (var i = 0; i < 1000; i++) + obj[Symbol(i)] = i; +obj.w = 1000; +keys = [] +for (var k in obj) + keys.push(k); +assert.deepEqual(keys, ["x", "y", "z", "w"]); + diff --git a/test/staging/sm/Symbol/for.js b/test/staging/sm/Symbol/for.js new file mode 100644 index 0000000000..2718a1cf48 --- /dev/null +++ b/test/staging/sm/Symbol/for.js @@ -0,0 +1,39 @@ +/* + * Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/licenses/publicdomain/ + */ + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +// Symbol.for called twice with the same argument returns the same symbol. +assert.sameValue(Symbol.for("ponies"), Symbol.for("ponies")); + +// Called twice with equal strings: still the same result. +var one = Array(64+1).join("x"); +var two = Array(8+1).join(Array(8+1).join("x")); +assert.sameValue(Symbol.for(one), Symbol.for(two)); + +// Symbols created by calling Symbol() are not in the symbol registry. +var sym = Symbol("123"); +assert.sameValue(Symbol.for("123") !== sym, true); + +// Empty string is fine. +assert.sameValue(typeof Symbol.for(""), "symbol"); + +// Primitive arguments. +assert.sameValue(Symbol.for(3), Symbol.for("3")); +assert.sameValue(Symbol.for(null), Symbol.for("null")); +assert.sameValue(Symbol.for(undefined), Symbol.for("undefined")); +assert.sameValue(Symbol.for(), Symbol.for("undefined")); + +// Symbol.for ignores the 'this' value. +var foo = Symbol.for("foo") +assert.sameValue(Symbol.for.call(String, "foo"), foo); +assert.sameValue(Symbol.for.call(3.14, "foo"), foo); + diff --git a/test/staging/sm/Symbol/json-stringify-keys.js b/test/staging/sm/Symbol/json-stringify-keys.js new file mode 100644 index 0000000000..aa9b08e666 --- /dev/null +++ b/test/staging/sm/Symbol/json-stringify-keys.js @@ -0,0 +1,27 @@ +/* + * Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/licenses/publicdomain/ + */ + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +// JSON.stringify ignores symbol-keyed properties, even enumerable ones. + +var obj = {a: 1}; +obj[Symbol.for("ponies")] = {toJSON: function () { throw "fit"; }}; +obj[Symbol.iterator] = {toJSON: function () { throw "fit"; }}; +assert.sameValue(JSON.stringify(obj), '{"a":1}'); + +var replacer = function (k, v) { + if (typeof k === "symbol") + throw "fit"; + return v; +}; +assert.sameValue(JSON.stringify(obj, replacer), '{"a":1}'); + diff --git a/test/staging/sm/Symbol/json-stringify-values.js b/test/staging/sm/Symbol/json-stringify-values.js new file mode 100644 index 0000000000..045d951a3c --- /dev/null +++ b/test/staging/sm/Symbol/json-stringify-values.js @@ -0,0 +1,41 @@ +/* + * Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/licenses/publicdomain/ + */ + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +// To JSON.stringify, symbols are the same as undefined. + +var symbols = [ + Symbol(), + Symbol.for("ponies"), + Symbol.iterator +]; + +for (var sym of symbols) { + assert.sameValue(JSON.stringify(sym), undefined); + assert.sameValue(JSON.stringify([sym]), "[null]"); + + // JSON.stringify skips symbol-valued properties! + assert.sameValue(JSON.stringify({x: sym}), '{}'); + + // However such properties are passed to the replacerFunction if any. + var replacer = function (key, val) { + assert.sameValue(typeof this, "object"); + if (typeof val === "symbol") { + assert.sameValue(val, sym); + return "ding"; + } + return val; + }; + assert.sameValue(JSON.stringify(sym, replacer), '"ding"'); + assert.sameValue(JSON.stringify({x: sym}, replacer), '{"x":"ding"}'); +} + diff --git a/test/staging/sm/Symbol/keyFor.js b/test/staging/sm/Symbol/keyFor.js new file mode 100644 index 0000000000..4ec9a3159c --- /dev/null +++ b/test/staging/sm/Symbol/keyFor.js @@ -0,0 +1,23 @@ +/* + * Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/licenses/publicdomain/ + */ + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +assert.sameValue(Symbol.keyFor(Symbol.for("moon")), "moon"); +assert.sameValue(Symbol.keyFor(Symbol.for("")), ""); +assert.sameValue(Symbol.keyFor(Symbol("moon")), undefined); +assert.sameValue(Symbol.keyFor(Symbol.iterator), undefined); + +assertThrowsInstanceOf(() => Symbol.keyFor(), TypeError); +assertThrowsInstanceOf(() => Symbol.keyFor(Object(Symbol("moon"))), TypeError); + +assert.sameValue(Symbol.keyFor.length, 1); + diff --git a/test/staging/sm/Symbol/property-accessor.js b/test/staging/sm/Symbol/property-accessor.js new file mode 100644 index 0000000000..c05b1bcdb6 --- /dev/null +++ b/test/staging/sm/Symbol/property-accessor.js @@ -0,0 +1,47 @@ +/* + * Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/licenses/publicdomain/ + */ + +/*--- +includes: [deepEqual.js, sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +var obj = {}; +var sym = Symbol(); + +var gets = 0; +var sets = []; +Object.defineProperty(obj, sym, { + get: function () { return ++gets; }, + set: function (v) { sets.push(v); } +}); + +// getter +for (var i = 1; i < 9; i++) + assert.sameValue(obj[sym], i); + +// setter +var expected = []; +for (var i = 0; i < 9; i++) { + assert.sameValue(obj[sym] = i, i); + expected.push(i); +} +assert.deepEqual(sets, expected); + +// increment operator +gets = 0; +sets = []; +assert.sameValue(obj[sym]++, 1); +assert.deepEqual(sets, [2]); + +// assignment +gets = 0; +sets = []; +assert.sameValue(obj[sym] *= 12, 12); +assert.deepEqual(sets, [12]); + diff --git a/test/staging/sm/Symbol/property-basics.js b/test/staging/sm/Symbol/property-basics.js new file mode 100644 index 0000000000..8531678516 --- /dev/null +++ b/test/staging/sm/Symbol/property-basics.js @@ -0,0 +1,52 @@ +/* + * Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/licenses/publicdomain/ + */ + +/*--- +includes: [deepEqual.js, sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +var symbols = [ + Symbol(), + Symbol("one"), + Symbol.for("two"), + Symbol.iterator, + Object(Symbol()) +]; + +for (var sym of symbols) { + var obj = {}; + + // access a nonexistent property + assert.sameValue(sym in obj, false); + assert.sameValue(obj.hasOwnProperty(sym), false); + assert.sameValue(obj[sym], undefined); + assert.sameValue(typeof obj[sym], "undefined"); + assert.sameValue(Object.getOwnPropertyDescriptor(obj, sym), undefined); + + // assign, then try accessing again + obj[sym] = "ok"; + assert.sameValue(sym in obj, true); + assert.sameValue(obj.hasOwnProperty(sym), true); + assert.sameValue(obj[sym], "ok"); + assert.deepEqual(Object.getOwnPropertyDescriptor(obj, sym), { + value: "ok", + writable: true, + enumerable: true, + configurable: true + }); + + // assign again, observe value is overwritten + obj[sym] = 12; + assert.sameValue(obj[sym], 12); + + // increment + assert.sameValue(obj[sym]++, 12); + assert.sameValue(obj[sym], 13); +} + diff --git a/test/staging/sm/Symbol/property-inheritance.js b/test/staging/sm/Symbol/property-inheritance.js new file mode 100644 index 0000000000..e1a87c1db6 --- /dev/null +++ b/test/staging/sm/Symbol/property-inheritance.js @@ -0,0 +1,58 @@ +/* + * Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/licenses/publicdomain/ + */ + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +var sym = Symbol.for("hello"); +function F() {} +var f = new F(); + +// inherited data property +F.prototype[sym] = "world"; +assert.sameValue(sym in f, true); +assert.sameValue(f.hasOwnProperty(sym), false); +assert.sameValue(f[sym], "world"); + +// shadowing assignment +f[sym] = "kitty"; +assert.sameValue(f[sym], "kitty"); +assert.sameValue(F.prototype[sym], "world"); + +// deletion, revealing previously shadowed property +assert.sameValue(delete f[sym], true); +assert.sameValue(f.hasOwnProperty(sym), false); +assert.sameValue(f[sym], "world"); + +// inherited accessor property +var value = undefined; +Object.defineProperty(F.prototype, sym, { + configurable: true, + get: function () { return 23; }, + set: function (v) { value = v; } +}); +assert.sameValue(sym in f, true); +assert.sameValue(f.hasOwnProperty(sym), false); +assert.sameValue(f[sym], 23); +f[sym] = "gravity"; +assert.sameValue(value, "gravity"); + +// inherited accessor property with no setter +Object.defineProperty(F.prototype, sym, { + set: undefined +}); +assertThrowsInstanceOf(function () { "use strict"; f[sym] = 0; }, TypeError); + +// deeply inherited accessor property +var g = Object.create(f); +for (var i = 0; i < 100; i++) + g = Object.create(g); +assert.sameValue(g[sym], 23); + diff --git a/test/staging/sm/Symbol/property-nonwritable.js b/test/staging/sm/Symbol/property-nonwritable.js new file mode 100644 index 0000000000..835ce6140d --- /dev/null +++ b/test/staging/sm/Symbol/property-nonwritable.js @@ -0,0 +1,39 @@ +/* + * Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/licenses/publicdomain/ + */ + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +var sym = Symbol.for("moon"); +function checkNotWritable(obj) { + // In sloppy mode, assigning to a nonwritable property silently fails. + obj[sym] = "portals"; + assert.sameValue(obj[sym], "cheese"); + + // In strict mode code, it throws. + assertThrowsInstanceOf(function () { "use strict"; obj[sym] = "robots"; }, TypeError); + assert.sameValue(obj[sym], "cheese"); +} + +var x = {}; +Object.defineProperty(x, sym, { + configurable: true, + enumerable: true, + value: "cheese", + writable: false +}); + +checkNotWritable(x); + +// Assignment can't shadow inherited nonwritable properties either. +var y = Object.create(x); +checkNotWritable(y); +checkNotWritable(Object.create(y)); + diff --git a/test/staging/sm/Symbol/property-reflection.js b/test/staging/sm/Symbol/property-reflection.js new file mode 100644 index 0000000000..ee0477a94d --- /dev/null +++ b/test/staging/sm/Symbol/property-reflection.js @@ -0,0 +1,144 @@ +/* + * Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/licenses/publicdomain/ + */ + +/*--- +includes: [deepEqual.js, sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +// Basic tests for standard Object APIs interacting with symbols. + +// Object.defineProperty +function F() {} +var f = new F; +Object.defineProperty(f, Symbol.for("name"), { + configurable: true, + value: "eff" +}); +assert.sameValue("name" in f, false); +assert.sameValue("Symbol(name)" in f, false); +assert.sameValue(Symbol.for("name") in f, true); +assert.sameValue(f[Symbol.for("name")], "eff"); + +// Object.defineProperties +function D() {} +var descs = new D; +var s1 = Symbol("s1"); +var hits = 0; +descs[s1] = { + get: () => hits++, + set: undefined, + enumerable: true, + configurable: true +}; +var s2 = Symbol("s2"); +descs[s2] = { + value: {}, + writable: true, + enumerable: false, + configurable: true +}; +var s3 = Symbol("s3"); +D.prototype[s3] = {value: "FAIL"}; +assert.sameValue(Object.defineProperties(f, descs), f); +assert.sameValue(s1 in f, true); +assert.sameValue(f[s1], 0); +assert.sameValue(hits, 1); +assert.sameValue(s2 in f, true); +assert.sameValue(f[s2], descs[s2].value); +assert.sameValue(s3 in f, false); + +// Object.create +var n = Object.create({}, descs); +assert.sameValue(s1 in n, true); +assert.sameValue(n[s1], 1); +assert.sameValue(hits, 2); +assert.sameValue(s2 in n, true); +assert.sameValue(n[s2], descs[s2].value); +assert.sameValue(s3 in n, false); + +// Object.getOwnPropertyDescriptor +var desc = Object.getOwnPropertyDescriptor(n, s1); +assert.deepEqual(desc, descs[s1]); +assert.sameValue(desc.get, descs[s1].get); +desc = Object.getOwnPropertyDescriptor(n, s2); +assert.deepEqual(desc, descs[s2]); +assert.sameValue(desc.value, descs[s2].value); + +// Object.prototype.hasOwnProperty +assert.sameValue(descs.hasOwnProperty(s1), true); +assert.sameValue(descs.hasOwnProperty(s2), true); +assert.sameValue(descs.hasOwnProperty(s3), false); +assert.sameValue([].hasOwnProperty(Symbol.iterator), false); +assert.sameValue(Array.prototype.hasOwnProperty(Symbol.iterator), true); + +// Object.prototype.propertyIsEnumerable +assert.sameValue(n.propertyIsEnumerable(s1), true); +assert.sameValue(n.propertyIsEnumerable(s2), false); +assert.sameValue(n.propertyIsEnumerable(s3), false); // no such property +assert.sameValue(D.prototype.propertyIsEnumerable(s3), true); +assert.sameValue(descs.propertyIsEnumerable(s3), false); // inherited properties are not considered + +// Object.preventExtensions +var obj = {}; +obj[s1] = 1; +assert.sameValue(Object.preventExtensions(obj), obj); +assertThrowsInstanceOf(function () { "use strict"; obj[s2] = 2; }, TypeError); +obj[s2] = 2; // still no effect +assert.sameValue(s2 in obj, false); + +// Object.isSealed, Object.isFrozen +assert.sameValue(Object.isSealed(obj), false); +assert.sameValue(Object.isFrozen(obj), false); +assert.sameValue(delete obj[s1], true); +assert.sameValue(Object.isSealed(obj), true); +assert.sameValue(Object.isFrozen(obj), true); + +obj = {}; +obj[s1] = 1; +Object.preventExtensions(obj); +Object.defineProperty(obj, s1, {configurable: false}); // still writable +assert.sameValue(Object.isSealed(obj), true); +assert.sameValue(Object.isFrozen(obj), false); +obj[s1] = 2; +assert.sameValue(obj[s1], 2); +Object.defineProperty(obj, s1, {writable: false}); +assert.sameValue(Object.isFrozen(obj), true); + +// Object.seal, Object.freeze +var obj = {}; +obj[s1] = 1; +Object.seal(obj); +desc = Object.getOwnPropertyDescriptor(obj, s1); +assert.sameValue(desc.configurable, false); +assert.sameValue(desc.writable, true); +Object.freeze(obj); +assert.sameValue(Object.getOwnPropertyDescriptor(obj, s1).writable, false); + +// Object.setPrototypeOf purges caches for symbol-keyed properties. +var proto = {}; +proto[s1] = 1; +Object.defineProperty(proto, s2, { + get: () => 2, + set: v => undefined +}); +var obj = Object.create(proto); +var last1, last2; +var N = 9; +for (var i = 0; i < N; i++) { + last1 = obj[s1]; + last2 = obj[s2]; + obj[s2] = "marker"; + if (i === N - 2) + Object.setPrototypeOf(obj, {}); +} +assert.sameValue(last1, undefined); +assert.sameValue(last2, undefined); +assert.sameValue(obj.hasOwnProperty(s2), true); +assert.sameValue(obj[s2], "marker"); + diff --git a/test/staging/sm/Symbol/realms.js b/test/staging/sm/Symbol/realms.js new file mode 100644 index 0000000000..ae9743739c --- /dev/null +++ b/test/staging/sm/Symbol/realms.js @@ -0,0 +1,44 @@ +/* + * Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/licenses/publicdomain/ + */ + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +// Symbols can be shared across realms. + +if (typeof Reflect !== "undefined" && typeof Reflect.Realm === "function") { + throw new Error("Congratulations on implementing Reflect.Realm! " + + "Please update this test to use it."); +} +if (typeof createNewGlobal === "function") { + var g = createNewGlobal(); + var gj = g.eval("jones = Symbol('jones')"); + assert.sameValue(typeof gj, "symbol"); + assert.sameValue(g.jones, g.jones); + assert.sameValue(gj, g.jones); + assert.sameValue(gj !== Symbol("jones"), true); + + // A symbol can be round-tripped to another realm and back; + // the result is the original symbol. + var smith = Symbol("smith"); + g.smith = smith; // put smith into the realm + assert.sameValue(g.smith, smith); // pull it back out + + // Spot-check that non-generic methods can be applied to symbols and Symbol + // objects from other realms. + assert.sameValue(Symbol.prototype.toString.call(gj), "Symbol(jones)"); + assert.sameValue(Symbol.prototype.toString.call(g.eval("Object(Symbol('brown'))")), + "Symbol(brown)"); + + // Symbol.for functions share a symbol registry across all realms. + assert.sameValue(g.Symbol.for("ponies"), Symbol.for("ponies")); + assert.sameValue(g.eval("Symbol.for('rainbows')"), Symbol.for("rainbows")); +} + diff --git a/test/staging/sm/Symbol/species.js b/test/staging/sm/Symbol/species.js new file mode 100644 index 0000000000..2647ad63ac --- /dev/null +++ b/test/staging/sm/Symbol/species.js @@ -0,0 +1,39 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [deepEqual.js, sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +var BUGNUMBER = 1131043; +var summary = "Implement @@species getter for builtin types"; + +print(BUGNUMBER + ": " + summary); + +var TypedArray = Object.getPrototypeOf(Int8Array); + +for (var C of [Array, Map, Set, RegExp, + Int8Array, Uint8Array, Uint8ClampedArray, + Int16Array, Uint16Array, Int32Array, Uint32Array, + Float32Array, Float64Array, + ArrayBuffer]) { + assert.sameValue(C[Symbol.species], C); +} + +for (C of [Array, Map, Set, RegExp, + TypedArray, + ArrayBuffer]) { + var desc = Object.getOwnPropertyDescriptor(C, Symbol.species); + assert.deepEqual(Object.keys(desc).sort(), ["configurable", "enumerable", "get", "set"]); + assert.sameValue(desc.set, undefined); + assert.sameValue(desc.enumerable, false); + assert.sameValue(desc.configurable, true); + assert.sameValue(desc.get.apply(null), null); + assert.sameValue(desc.get.apply(undefined), undefined); + assert.sameValue(desc.get.apply(42), 42); +} + diff --git a/test/staging/sm/Symbol/surfaces.js b/test/staging/sm/Symbol/surfaces.js new file mode 100644 index 0000000000..dd1c486339 --- /dev/null +++ b/test/staging/sm/Symbol/surfaces.js @@ -0,0 +1,42 @@ +/* + * Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/licenses/publicdomain/ + */ + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +// Test superficial properties of the Symbol constructor and prototype. + +var desc = Object.getOwnPropertyDescriptor(this, "Symbol"); +assert.sameValue(desc.configurable, true); +assert.sameValue(desc.enumerable, false); +assert.sameValue(desc.writable, true); +assert.sameValue(typeof Symbol, "function"); +assert.sameValue(Symbol.length, 0); + +desc = Object.getOwnPropertyDescriptor(Symbol, "prototype"); +assert.sameValue(desc.configurable, false); +assert.sameValue(desc.enumerable, false); +assert.sameValue(desc.writable, false); + +assert.sameValue(Symbol.prototype.constructor, Symbol); +desc = Object.getOwnPropertyDescriptor(Symbol.prototype, "constructor"); +assert.sameValue(desc.configurable, true); +assert.sameValue(desc.enumerable, false); +assert.sameValue(desc.writable, true); + +desc = Object.getOwnPropertyDescriptor(Symbol, "iterator"); +assert.sameValue(desc.configurable, false); +assert.sameValue(desc.enumerable, false); +assert.sameValue(desc.writable, false); + +assert.sameValue(Symbol.for.length, 1); +assert.sameValue(Symbol.prototype.toString.length, 0); +assert.sameValue(Symbol.prototype.valueOf.length, 0); + diff --git a/test/staging/sm/Symbol/symbol-object-not-unboxed-for-value-to-id.js b/test/staging/sm/Symbol/symbol-object-not-unboxed-for-value-to-id.js new file mode 100644 index 0000000000..0d54770a05 --- /dev/null +++ b/test/staging/sm/Symbol/symbol-object-not-unboxed-for-value-to-id.js @@ -0,0 +1,40 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +// Create a symbol and a wrapper for it. +var s = Symbol(); +var so = Object(s); + +// Create a symbol-valued property key using |s|. +var o = {[s]: 0}; + +// The default Symbol.prototype[@@toPrimitive] will unbox the symbol object as needed. +assert.sameValue(o.propertyIsEnumerable(so), true); +assert.sameValue(o.hasOwnProperty(so), true); + +// After redefining Symbol.prototype[@@toPrimitive], any calls to the ToPropertyKey +// abstract operation will no longer unbox the symbol object. +Object.defineProperty(Symbol.prototype, Symbol.toPrimitive, { + value: function() { + return "foo"; + } +}); + +// |o| doesn't have a string-valued property named "foo". +assert.sameValue(o.propertyIsEnumerable(so), false); +assert.sameValue(o.hasOwnProperty(so), false); + +o.foo = 123; + +// After |o.foo| was added, both calls should return true again. +assert.sameValue(o.propertyIsEnumerable(so), true); +assert.sameValue(o.hasOwnProperty(so), true); + diff --git a/test/staging/sm/Symbol/toPrimitive-undefined-or-null.js b/test/staging/sm/Symbol/toPrimitive-undefined-or-null.js new file mode 100644 index 0000000000..c458338a5b --- /dev/null +++ b/test/staging/sm/Symbol/toPrimitive-undefined-or-null.js @@ -0,0 +1,27 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +for (let method of [undefined, null]) { + let obj = { + [Symbol.toPrimitive]: method, + toString: () => "pass", + }; + assert.sameValue("" + obj, "pass"); +} + +for (let method of [true, false, 0, 123, "", "abc", Symbol(), {}]) { + let obj = { + [Symbol.toPrimitive]: method, + toString: () => "pass", + }; + assertThrowsInstanceOf(() => "" + obj, TypeError); +} + diff --git a/test/staging/sm/Symbol/toPrimitive.js b/test/staging/sm/Symbol/toPrimitive.js new file mode 100644 index 0000000000..c005043eca --- /dev/null +++ b/test/staging/sm/Symbol/toPrimitive.js @@ -0,0 +1,49 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +// ES6 19.4.3.4 Symbol.prototype[@@toPrimitive](hint) + +// This method gets the primitive symbol from a Symbol wrapper object. +var sym = Symbol.for("truth") +var obj = Object(sym); +assert.sameValue(obj[Symbol.toPrimitive]("default"), sym); + +// The hint argument is ignored. +assert.sameValue(obj[Symbol.toPrimitive]("number"), sym); +assert.sameValue(obj[Symbol.toPrimitive]("string"), sym); +assert.sameValue(obj[Symbol.toPrimitive](), sym); +assert.sameValue(obj[Symbol.toPrimitive](Math.atan2), sym); + +// The this value can also be a primitive symbol. +assert.sameValue(sym[Symbol.toPrimitive](), sym); + +// Or a wrapper to a Symbol object in another compartment. +var obj2 = createNewGlobal().Object(sym); +assert.sameValue(obj2[Symbol.toPrimitive]("default"), sym); + +// Otherwise a TypeError is thrown. +var symbolToPrimitive = Symbol.prototype[Symbol.toPrimitive]; +var nonSymbols = [ + undefined, null, true, 13, NaN, "justice", {}, [sym], + symbolToPrimitive, + new Proxy(obj, {}) +]; +for (var value of nonSymbols) { + assertThrowsInstanceOf(() => symbolToPrimitive.call(value, "string"), TypeError); +} + +// Surface features: +assert.sameValue(symbolToPrimitive.name, "[Symbol.toPrimitive]"); +var desc = Object.getOwnPropertyDescriptor(Symbol.prototype, Symbol.toPrimitive); +assert.sameValue(desc.configurable, true); +assert.sameValue(desc.enumerable, false); +assert.sameValue(desc.writable, false); + diff --git a/test/staging/sm/Symbol/toString.js b/test/staging/sm/Symbol/toString.js new file mode 100644 index 0000000000..2ca6539855 --- /dev/null +++ b/test/staging/sm/Symbol/toString.js @@ -0,0 +1,35 @@ +/* + * Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/licenses/publicdomain/ + */ + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +var cases = [ + {sym: Symbol(), str: "Symbol()"}, + {sym: Symbol("ok"), str: "Symbol(ok)"}, + {sym: Symbol("\0"), str: "Symbol(\0)"}, + {sym: Symbol.iterator, str: "Symbol(Symbol.iterator)"}, + {sym: Symbol.for("dummies"), str: "Symbol(dummies)"} +]; + +// Symbol.prototype.toString works on both primitive symbols and Symbol +// objects. +for (var test of cases) { + assert.sameValue(test.sym.toString(), test.str); + assert.sameValue(Object(test.sym).toString(), test.str); +} + +// Any other value throws. +var nonsymbols = [ + undefined, null, "not-ok", new String("still-not-ok"), {}, [] +]; +for (var nonsym of nonsymbols) + assertThrowsInstanceOf(() => Symbol.prototype.toString.call(nonsym), TypeError); + diff --git a/test/staging/sm/Symbol/toStringTag.js b/test/staging/sm/Symbol/toStringTag.js new file mode 100644 index 0000000000..4b8c0ab280 --- /dev/null +++ b/test/staging/sm/Symbol/toStringTag.js @@ -0,0 +1,164 @@ +/* + * Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/licenses/publicdomain/ + */ + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +// ES6 19.1.3.6 Object.prototype.toString ( ) +function testToString() { + var tests = [ + [undefined, "[object Undefined]"], + [null, "[object Null]"], + [[], "[object Array]"], + [new String("abc"), "[object String]"], + [(function () {return arguments;})(), "[object Arguments]"], + [(function () {"use strict"; return arguments;})(), "[object Arguments]"], + [function() {}, "[object Function]"], + [new Error("abc"), "[object Error]"], + [true, "[object Boolean]"], + [5, "[object Number]"], + [new Date(), "[object Date]"], + [/regexp/, "[object RegExp]"], + [{[Symbol.toStringTag]: "abc"}, "[object abc]"], + [Object.create(JSON), "[object JSON]"], + [Object.create(new Number), "[object Object]"], + [Object.create(new Number, {[Symbol.toStringTag]: {value: "abc"}}), "[object abc]"], + [(function() { var x = new Number(); x[Symbol.toStringTag] = "abc"; return x; })(), "[object abc]"], + [[], "[object Array]"] + ]; + + // Testing if the values are obtained the right way. + for (let [value, expected] of tests) { + let result = Object.prototype.toString.call(value); + assert.sameValue(result, expected); + } +} +testToString(); + +function testProxy() { + var count = 0; + var metaHandler = new Proxy({}, { + get(target, property, receiver) { + assert.sameValue(property, "get"); + + return function(target, property, receiver) { + assert.sameValue(property, Symbol.toStringTag); + count++; + return undefined; + } + } + }); + + assert.sameValue(Object.prototype.toString.call(new Proxy({}, metaHandler)), "[object Object]") + assert.sameValue(Object.prototype.toString.call(new Proxy(new Date, metaHandler)), "[object Object]") + assert.sameValue(Object.prototype.toString.call(new Proxy([], metaHandler)), "[object Array]") + assert.sameValue(Object.prototype.toString.call(new Proxy(function() {}, metaHandler)), "[object Function]") + var {proxy, revoke} = Proxy.revocable({}, metaHandler); + revoke(); + assertThrowsInstanceOf(() => Object.prototype.toString.call(proxy), TypeError); + + assert.sameValue(count, 4); +} +testProxy(); + +// Tests the passed objects toStringTag values and ensures it's +// desc is writable: false, enumerable: false, configurable: true +function testDefault(object, expected) { + let desc = Object.getOwnPropertyDescriptor(object, Symbol.toStringTag); + assert.sameValue(desc.value, expected); + assert.sameValue(desc.writable, false); + assert.sameValue(desc.enumerable, false); + assert.sameValue(desc.configurable, true); +} + +// ES6 19.4.3.5 Symbol.prototype [ @@toStringTag ] +testDefault(Symbol.prototype, "Symbol"); + +// ES6 20.2.1.9 Math [ @@toStringTag ] +testDefault(Math, "Math"); + +// ES6 21.1.5.2.2 %StringIteratorPrototype% [ @@toStringTag ] +testDefault(""[Symbol.iterator]().__proto__, "String Iterator") + +// ES6 22.1.5.2.2 %ArrayIteratorPrototype% [ @@toStringTag ] +testDefault([][Symbol.iterator]().__proto__, "Array Iterator") + +// ES6 22.2.3.31 get %TypedArray%.prototype [ @@toStringTag ] +function testTypedArray() { + let ta = (new Uint8Array(0)).__proto__.__proto__; + let desc = Object.getOwnPropertyDescriptor(ta, Symbol.toStringTag); + assert.sameValue(desc.enumerable, false); + assert.sameValue(desc.configurable, true); + assert.sameValue(desc.set, undefined); + + let get = desc.get; + assert.sameValue(get.name, "get [Symbol.toStringTag]"); + assert.sameValue(get.call(3.14), undefined); + assert.sameValue(get.call({}), undefined); + assert.sameValue(get.call(ta), undefined); + + let types = [ + Int8Array, + Uint8Array, + Int16Array, + Uint16Array, + Int32Array, + Uint32Array, + Float32Array, + Float64Array + ]; + + for (let type of types) { + let array = new type(0); + assert.sameValue(get.call(array), type.name); + assert.sameValue(Object.prototype.toString.call(array), `[object ${type.name}]`); + } +} +testTypedArray(); + +// ES6 23.1.3.13 Map.prototype [ @@toStringTag ] +testDefault(Map.prototype, "Map"); + +// ES6 23.1.5.2.2 %MapIteratorPrototype% [ @@toStringTag ] +testDefault(new Map()[Symbol.iterator]().__proto__, "Map Iterator") + +// ES6 23.2.3.12 Set.prototype [ @@toStringTag ] +testDefault(Set.prototype, "Set"); + +// ES6 23.2.5.2.2 %SetIteratorPrototype% [ @@toStringTag ] +testDefault(new Set()[Symbol.iterator]().__proto__, "Set Iterator") + +// ES6 23.3.3.6 WeakMap.prototype [ @@toStringTag ] +testDefault(WeakMap.prototype, "WeakMap"); + +// ES6 23.4.3.5 WeakSet.prototype [ @@toStringTag ] +testDefault(WeakSet.prototype, "WeakSet"); + +// ES6 24.1.4.4 ArrayBuffer.prototype [ @@toStringTag ] +testDefault(ArrayBuffer.prototype, "ArrayBuffer"); + +// ES6 24.2.4.21 DataView.prototype[ @@toStringTag ] +testDefault(DataView.prototype, "DataView"); + +// ES6 24.3.3 JSON [ @@toStringTag ] +testDefault(JSON, "JSON"); + +// ES6 25.2.3.3 GeneratorFunction.prototype [ @@toStringTag ] +testDefault(function* () {}.constructor.prototype, "GeneratorFunction"); + +// ES6 25.3.1.5 Generator.prototype [ @@toStringTag ] +testDefault(function* () {}().__proto__.__proto__, "Generator"); + +// ES6 25.4.5.4 Promise.prototype [ @@toStringTag ] +testDefault(Promise.prototype, "Promise"); + +// AsyncFunction.prototype [ @@toStringTag ] +testDefault(async function() {}.constructor.prototype, "AsyncFunction"); + diff --git a/test/staging/sm/Symbol/typed-arrays.js b/test/staging/sm/Symbol/typed-arrays.js new file mode 100644 index 0000000000..2d450d255c --- /dev/null +++ b/test/staging/sm/Symbol/typed-arrays.js @@ -0,0 +1,25 @@ +/* + * Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/licenses/publicdomain/ + */ + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +// Symbol-to-number type conversions involving typed arrays. + +for (var T of [Uint8Array, Uint8ClampedArray, Int16Array, Float32Array]) { + // Typed array constructors convert symbols using ToNumber(), which throws. + assertThrowsInstanceOf(() => new T([Symbol("a")]), TypeError); + + // Assignment does the same. + var arr = new T([1]); + assertThrowsInstanceOf(() => { arr[0] = Symbol.iterator; }, TypeError); + assert.sameValue(arr[0], 1); +} + diff --git a/test/staging/sm/Symbol/typeof.js b/test/staging/sm/Symbol/typeof.js new file mode 100644 index 0000000000..9016df7c55 --- /dev/null +++ b/test/staging/sm/Symbol/typeof.js @@ -0,0 +1,19 @@ +/* + * Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/licenses/publicdomain/ + */ + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +assert.sameValue(typeof Symbol(), "symbol"); +assert.sameValue(typeof Symbol("ponies"), "symbol"); +assert.sameValue(typeof Symbol.for("ponies"), "symbol"); + +assert.sameValue(typeof Object(Symbol()), "object"); + diff --git a/test/staging/sm/Symbol/valueOf.js b/test/staging/sm/Symbol/valueOf.js new file mode 100644 index 0000000000..c330fa7910 --- /dev/null +++ b/test/staging/sm/Symbol/valueOf.js @@ -0,0 +1,30 @@ +/* + * Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/licenses/publicdomain/ + */ + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +var symbols = [ + Symbol(), + Symbol("ok"), + Symbol.for("dummies"), + Symbol.iterator +]; + +for (var sym of symbols) { + assert.sameValue(sym.valueOf(), sym); + assert.sameValue(Object(sym).valueOf(), sym); +} + +// Any other value throws. +var nonsymbols = [undefined, null, NaN, {}, Symbol.prototype]; +for (var nonsym of nonsymbols) + assertThrowsInstanceOf(() => Symbol.prototype.valueOf.call(nonsym), TypeError); + diff --git a/test/staging/sm/Symbol/well-known.js b/test/staging/sm/Symbol/well-known.js new file mode 100644 index 0000000000..66fbae10c7 --- /dev/null +++ b/test/staging/sm/Symbol/well-known.js @@ -0,0 +1,50 @@ +/* + * Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/licenses/publicdomain/ + */ + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +var names = [ + "isConcatSpreadable", + "iterator", + "match", + "replace", + "search", + "species", + "hasInstance", + "split", + "toPrimitive", + "unscopables", + "asyncIterator" +]; + +for (var name of names) { + // Well-known symbols exist. + assert.sameValue(typeof Symbol[name], "symbol"); + + // They are never in the registry. + assert.sameValue(Symbol[name] !== Symbol.for("Symbol." + name), true); + + // They are shared across realms. + if (typeof Realm === 'function') + throw new Error("please update this test to use Realms"); + if (typeof createNewGlobal === 'function') { + var g = createNewGlobal(); + assert.sameValue(Symbol[name], g.Symbol[name]); + } + + // Descriptor is all false. + var desc = Object.getOwnPropertyDescriptor(Symbol, name); + assert.sameValue(typeof desc.value, "symbol"); + assert.sameValue(desc.writable, false); + assert.sameValue(desc.enumerable, false); + assert.sameValue(desc.configurable, false); +} + diff --git a/test/staging/sm/Temporal/Calendar/compare-to-datetimeformat.js b/test/staging/sm/Temporal/Calendar/compare-to-datetimeformat.js new file mode 100644 index 0000000000..010c2aeec1 --- /dev/null +++ b/test/staging/sm/Temporal/Calendar/compare-to-datetimeformat.js @@ -0,0 +1,127 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +features: +- Temporal +description: | + pending +esid: pending +---*/ + +// Test we get consistent results for Temporal and Intl.DateTimeFormat, even +// though the former uses ICU4X, whereas the latter uses ICU4C for calendrical +// computations. + +// Map Hebrew months from English name to their corresponding month number. +const hebrewMonths = { + Tishri: 1, + Heshvan: 2, + Kislev: 3, + Tevet: 4, + Shevat: 5, + "Adar I": 6, + Adar: 6, + "Adar II": 7, + Nisan: [7, 8], + Iyar: [8, 9], + Sivan: [9, 10], + Tamuz: [10, 11], + Av: [11, 12], + Elul: [12, 13], +}; + +function toFields(dtf, date, calendar, timeZone) { + let {epochMilliseconds} = date.withCalendar("iso8601").toZonedDateTime(timeZone); + let parts = dtf.formatToParts(epochMilliseconds); + + let monthPart = parts.find(({type}) => type === "month"); + let dayPart = parts.find(({type}) => type === "day"); + + assert.sameValue(monthPart !== undefined, true); + assert.sameValue(dayPart !== undefined, true); + + let month = parseInt(monthPart.value, 10); + let day = parseInt(dayPart.value, 10); + + // Workaround for . + if (!Number.isInteger(month) && calendar === "hebrew") { + assert.sameValue(Object.hasOwn(hebrewMonths, monthPart.value), true, `month = ${monthPart.value}`); + + let hebrewMonth = hebrewMonths[monthPart.value]; + if (Array.isArray(hebrewMonth)) { + month = hebrewMonth[Number(date.inLeapYear)]; + } else { + month = hebrewMonth; + } + } + + assert.sameValue(Number.isInteger(month), true, `month = ${monthPart.value}`); + assert.sameValue(Number.isInteger(day), true, `day = ${dayPart.value}`); + + return {month, day}; +} + +// All supported calendars have at most 31 days per month. +const maximumDaysPerMonth = 31; + +const timeZone = "UTC"; + +for (let calendar of Intl.supportedValuesOf("calendar")) { + // Lunar calendars. ICU4C and ICU4X appear to use different algorithms. + if (calendar === "chinese") continue; + if (calendar === "dangi") continue; + + // Observational lunar calendars. ICU4C and ICU4X use different algorithms. + if (calendar === "islamic") continue; + if (calendar === "islamic-rgsa") continue; + + // ICU4C returns 29, but ICU4X correctly returns 30. + // + // Temporal.PlainDate.from({year: 2046, month:10, day:30}).withCalendar("hebrew").day + if (calendar === "hebrew") continue; + + // ICU4C returns 29, but ICU4X returns 30. + // + // Temporal.PlainDate.from({year: 2006, month:7, day:25}).withCalendar("islamic-umalqura").day + if (calendar === "islamic-umalqura") continue; + + // ICU4C returns 30, but ICU4X returns 31. + // + // Temporal.PlainDate.from({year: 2025, month:4, day:19}).withCalendar("persian").day + if (calendar === "persian") continue; + + // Calendars "buddhist", "japanese", and "roc" use Julian calendar arithmetic + // before the Gregorian change date October 15, 1582. + // + // https://unicode-org.atlassian.net/jira/software/c/projects/ICU/issues/ICU-22412 + // + // if (calendar === "buddhist") continue; + // if (calendar === "japanese") continue; + // if (calendar === "roc") continue; + + let dtf = new Intl.DateTimeFormat("en", { + calendar, + timeZone, + month: "numeric", + day: "numeric", + }); + + // Test near past and near future. + for (let y = 2050; y >= 1950; --y) { + let isoYear = Temporal.PlainDate.from({year: y, month: 1, day: 1}); + let {year, monthsInYear} = isoYear.withCalendar(calendar); + + for (let month = 1; month <= monthsInYear; ++month) { + let date = Temporal.PlainDate.from({calendar, year, month, day: maximumDaysPerMonth}); + let fields = toFields(dtf, date, calendar, timeZone); + + assert.sameValue(fields.month, date.month, `date = ${date}`); + assert.sameValue(fields.day, date.day, `date = ${date}`); + } + } +} + diff --git a/test/staging/sm/Temporal/PlainDate/from-constrain-hebrew.js b/test/staging/sm/Temporal/PlainDate/from-constrain-hebrew.js new file mode 100644 index 0000000000..35f61ef335 --- /dev/null +++ b/test/staging/sm/Temporal/PlainDate/from-constrain-hebrew.js @@ -0,0 +1,191 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +features: +- Temporal +description: | + pending +esid: pending +---*/ + +const months = [ + { + name: "Tishrei", + month: [1], + monthCode: "M01", + days: [30], + }, + { + name: "Cheshvan", + month: [2], + monthCode: "M02", + days: [29, 30], // Rosh Hashanah postponement rules + }, + { + name: "Kislev", + month: [3], + monthCode: "M03", + days: [29, 30], // Rosh Hashanah postponement rules + }, + { + name: "Tevet", + month: [4], + monthCode: "M04", + days: [29], + }, + { + name: "Shevat", + month: [5], + monthCode: "M05", + days: [30], + }, + { + name: "Adar I", + month: [6], + monthCode: "M05L", + days: [30], + }, + { + name: "Adar", // Adar II + month: [6, 7], + monthCode: "M06", + days: [29], + }, + { + name: "Nisan", + month: [7, 8], + monthCode: "M07", + days: [30], + }, + { + name: "Iyar", + month: [8, 9], + monthCode: "M08", + days: [29], + }, + { + name: "Sivan", + month: [9, 10], + monthCode: "M09", + days: [30], + }, + { + name: "Tammuz", + month: [10, 11], + monthCode: "M10", + days: [29], + }, + { + name: "Av", + month: [11, 12], + monthCode: "M11", + days: [30], + }, + { + name: "Elul", + month: [12, 13], + monthCode: "M12", + days: [29], + }, +]; + +// Test non-leap years. +for (let {month: [month], monthCode, days} of months) { + // Year 1 isn't a leap year. + const year = 1; + + // Skip over leap months. + if (monthCode.endsWith("L")) { + continue; + } + + let startOfMonth = Temporal.PlainDate.from({ + calendar: "hebrew", + year, + month, + day: 1, + }); + + assert.sameValue(startOfMonth.year, year); + assert.sameValue(startOfMonth.month, month); + assert.sameValue(startOfMonth.monthCode, monthCode); + assert.sameValue(startOfMonth.day, 1); + + let endOfMonth = Temporal.PlainDate.from({ + calendar: "hebrew", + year, + month, + day: days[0], + }); + + assert.sameValue(endOfMonth.year, year); + assert.sameValue(endOfMonth.month, month); + assert.sameValue(endOfMonth.monthCode, monthCode); + assert.sameValue(endOfMonth.day, days[0]); +} + +// Test leap years. +for (let {month: [nonLeapMonth, month = nonLeapMonth], monthCode, days} of months) { + // Year 3 is a leap year. + const year = 3; + + let startOfMonth = Temporal.PlainDate.from({ + calendar: "hebrew", + year, + month, + day: 1, + }); + + assert.sameValue(startOfMonth.year, year); + assert.sameValue(startOfMonth.month, month); + assert.sameValue(startOfMonth.monthCode, monthCode); + assert.sameValue(startOfMonth.day, 1); + + let endOfMonth = Temporal.PlainDate.from({ + calendar: "hebrew", + year, + month, + day: days[0], + }); + + assert.sameValue(endOfMonth.year, year); + assert.sameValue(endOfMonth.month, month); + assert.sameValue(endOfMonth.monthCode, monthCode); + assert.sameValue(endOfMonth.day, days[0]); +} + +// Rosh Hashanah postponement +{ + // Days in Cheshvan and Kislev for years 0..10. + const daysPerMonth = { + Cheshvan: [ + 29, 30, 30, 29, 29, 30, 30, 29, 29, 30, 29, + ], + Kislev: [ + 30, 30, 30, 29, 30, 30, 30, 30, 29, 30, 30, + ], + }; + + for (let year = 0; year < daysPerMonth.Cheshvan.length; ++year) { + let endOfCheshvan = Temporal.PlainDate.from({ + calendar: "hebrew", + year, + monthCode: "M02", + day: 30, + }); + assert.sameValue(endOfCheshvan.day, daysPerMonth.Cheshvan[year]); + + let endOfKislev = Temporal.PlainDate.from({ + calendar: "hebrew", + year, + monthCode: "M03", + day: 30, + }); + assert.sameValue(endOfKislev.day, daysPerMonth.Kislev[year]); + } +} + diff --git a/test/staging/sm/Temporal/PlainDate/from-constrain-japanese.js b/test/staging/sm/Temporal/PlainDate/from-constrain-japanese.js new file mode 100644 index 0000000000..f5ec2fe723 --- /dev/null +++ b/test/staging/sm/Temporal/PlainDate/from-constrain-japanese.js @@ -0,0 +1,246 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +features: +- Temporal +description: | + pending +esid: pending +---*/ + +const eras = [ + { + name: "meiji", + start: "1868-09-08", + end: "1912-07-29", + }, + { + name: "taisho", + start: "1912-07-30", + end: "1926-12-24", + }, + { + name: "showa", + start: "1926-12-25", + end: "1989-01-07", + }, + { + name: "heisei", + start: "1989-01-08", + end: "2019-04-30", + }, + { + name: "reiwa", + start: "2019-05-01", + end: undefined, + }, +]; + +for (let {name: era, start, end} of eras) { + let eraStart = Temporal.PlainDate.from(start); + let eraEnd = end && Temporal.PlainDate.from(end); + + // Months before start of era. + for (let month = 1; month < eraStart.month; ++month) { + for (let day = 1; day <= 32; ++day) { + let monthCode = "M" + String(month).padStart(2, "0"); + + let dateWithMonth = Temporal.PlainDate.from({ + calendar: "japanese", + era, + eraYear: 1, + month, + day, + }); + + let dateWithMonthCode = Temporal.PlainDate.from({ + calendar: "japanese", + era, + eraYear: 1, + monthCode, + day, + }); + + assert.sameValue(dateWithMonth.toString({calendarName: "never"}), start); + assert.sameValue(dateWithMonthCode.toString({calendarName: "never"}), start); + } + } + + // Days before start of era. + for (let day = 1; day < eraStart.day; ++day) { + let dateWithMonth = Temporal.PlainDate.from({ + calendar: "japanese", + era, + eraYear: 1, + month: eraStart.month, + day, + }); + + let dateWithMonthCode = Temporal.PlainDate.from({ + calendar: "japanese", + era, + eraYear: 1, + monthCode: eraStart.monthCode, + day, + }); + + assert.sameValue(dateWithMonth.toString({calendarName: "never"}), start); + assert.sameValue(dateWithMonthCode.toString({calendarName: "never"}), start); + } + + // After start of era. + for (let day = eraStart.day; day <= 32; ++day) { + let dateWithMonth = Temporal.PlainDate.from({ + calendar: "japanese", + era, + eraYear: 1, + month: eraStart.month, + day, + }); + + let dateWithMonthCode = Temporal.PlainDate.from({ + calendar: "japanese", + era, + eraYear: 1, + monthCode: eraStart.monthCode, + day, + }); + + let expected = Temporal.PlainDate.from({ + year: eraStart.year, + monthCode: eraStart.monthCode, + day, + }).toString(); + + assert.sameValue(dateWithMonth.toString({calendarName: "never"}), expected); + assert.sameValue(dateWithMonthCode.toString({calendarName: "never"}), expected); + } + + // Months after start of era. + for (let month = eraStart.month + 1; month <= 12; ++month) { + for (let day = 1; day <= 32; ++day) { + let monthCode = "M" + String(month).padStart(2, "0"); + + let dateWithMonth = Temporal.PlainDate.from({ + calendar: "japanese", + era, + eraYear: 1, + month, + day, + }); + + let dateWithMonthCode = Temporal.PlainDate.from({ + calendar: "japanese", + era, + eraYear: 1, + monthCode, + day, + }); + + let expected = Temporal.PlainDate.from({ + year: eraStart.year, + monthCode: monthCode, + day, + }).toString(); + + assert.sameValue(dateWithMonth.toString({calendarName: "never"}), expected); + assert.sameValue(dateWithMonthCode.toString({calendarName: "never"}), expected); + } + } + + if (end) { + let lastEraYear = (eraEnd.year - eraStart.year) + 1; + + // After end of era. + for (let day = 31; day <= 32; ++day) { + let date = Temporal.PlainDate.from({ + calendar: "japanese", + era, + eraYear: 100, + monthCode: "M12", + day, + }); + assert.sameValue(date.toString({calendarName: "never"}), end); + } + + // Days after end of era. + for (let day = eraEnd.day + 1; day <= 32; ++day) { + let dateWithMonth = Temporal.PlainDate.from({ + calendar: "japanese", + era, + eraYear: lastEraYear, + month: eraEnd.month, + day, + }); + + let dateWithMonthCode = Temporal.PlainDate.from({ + calendar: "japanese", + era, + eraYear: lastEraYear, + monthCode: eraEnd.monthCode, + day, + }); + + assert.sameValue(dateWithMonth.toString({calendarName: "never"}), end); + assert.sameValue(dateWithMonthCode.toString({calendarName: "never"}), end); + } + + // Months after end of era. + for (let month = eraEnd.month + 1; month <= 12; ++month) { + for (let day = 1; day <= 32; ++day) { + let monthCode = "M" + String(month).padStart(2, "0"); + + let dateWithMonth = Temporal.PlainDate.from({ + calendar: "japanese", + era, + eraYear: lastEraYear, + month, + day, + }); + + let dateWithMonthCode = Temporal.PlainDate.from({ + calendar: "japanese", + era, + eraYear: lastEraYear, + monthCode, + day, + }); + + assert.sameValue(dateWithMonth.toString({calendarName: "never"}), end); + assert.sameValue(dateWithMonthCode.toString({calendarName: "never"}), end); + } + } + + // Year after end of era. + let yearAfterLastEraYear = lastEraYear + 1; + for (let month = 1; month <= 12; ++month) { + for (let day = 1; day <= 31; ++day) { + let monthCode = "M" + String(month).padStart(2, "0"); + + let dateWithMonth = Temporal.PlainDate.from({ + calendar: "japanese", + era, + eraYear: yearAfterLastEraYear, + month, + day, + }); + + let dateWithMonthCode = Temporal.PlainDate.from({ + calendar: "japanese", + era, + eraYear: yearAfterLastEraYear, + monthCode, + day, + }); + + assert.sameValue(dateWithMonth.toString({calendarName: "never"}), end, `era=${era}, eraYear=${yearAfterLastEraYear}, month=${month}, day=${day}`); + assert.sameValue(dateWithMonthCode.toString({calendarName: "never"}), end, `era=${era}, eraYear=${yearAfterLastEraYear}, monthCode=${monthCode}, day=${day}`); + } + } + } +} + diff --git a/test/staging/sm/Temporal/PlainDate/from-hebrew-keviah.js b/test/staging/sm/Temporal/PlainDate/from-hebrew-keviah.js new file mode 100644 index 0000000000..8a061bbe60 --- /dev/null +++ b/test/staging/sm/Temporal/PlainDate/from-hebrew-keviah.js @@ -0,0 +1,72 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +features: +- Temporal +description: | + pending +esid: pending +---*/ + +// Ensure kevi'ah is correct. +// +// https://en.wikipedia.org/wiki/Hebrew_calendar#Keviah + +function KeviahSymbol(year) { + let startOfYear = Temporal.PlainDate.from({ + calendar: "hebrew", + year, + monthCode: "M01", + day: 1, + }); + + let firstDayOfPesach = Temporal.PlainDate.from({ + calendar: "hebrew", + year, + monthCode: "M07", + day: 15, + }); + + let yearSymbol = { + 353: "D", // deficient + 354: "R", // regular + 355: "C", // complete + + 383: "D", // deficient, leap year + 384: "R", // regular, leap year + 385: "C", // complete, leap year + }; + + // Week starts on Sunday. + let daySymbol = date => (date.dayOfWeek % 7) + 1; + + let {daysInYear} = startOfYear; + assert.sameValue(daysInYear in yearSymbol, true); + + return `${daySymbol(startOfYear)}${yearSymbol[daysInYear]}${daySymbol(firstDayOfPesach)}`; +} + +const validKeviahSymbols = new Set([ + "2D3", "2C5", "2D5", "2C7", + "3R5", "3R7", + "5R7", "5C1", "5D1", "5C3", + "7D1", "7C3", "7D3", "7C5" +]); + +// Modern years. +for (let year = 5700; year <= 5800; ++year) { + let sym = KeviahSymbol(year); + assert.sameValue(validKeviahSymbols.has(sym), true, `${year} -> ${sym}`); +} + +// Things start to break when year is 3760 or earlier. +// Temporal.PlainDate.from({calendar:"hebrew", year:3760, monthCode:"M01", day:1}).withCalendar("iso8601").year == -1 +// +// Temporal.PlainDate.from({calendar:"hebrew", year:3760, monthCode:"M01", day:1}).dayOfWeek returns 7 (Sunday), but should be 6 (Saturday). +// +// https://github.com/unicode-org/icu4x/issues/4893 + diff --git a/test/staging/sm/Temporal/PlainDate/from-islamic-umalqura.js b/test/staging/sm/Temporal/PlainDate/from-islamic-umalqura.js new file mode 100644 index 0000000000..205bf1bc03 --- /dev/null +++ b/test/staging/sm/Temporal/PlainDate/from-islamic-umalqura.js @@ -0,0 +1,25 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +features: +- Temporal +description: | + pending +esid: pending +---*/ + +// https://github.com/unicode-org/icu4x/issues/4914 +if (0) { + let date = Temporal.PlainDate.from({ + calendar: "islamic-umalqura", + year: -6823, + monthCode: "M01", + day: 1, + }); + assert.sameValue(date.day, 1); +} + diff --git a/test/staging/sm/Temporal/PlainDate/withCalendar.js b/test/staging/sm/Temporal/PlainDate/withCalendar.js new file mode 100644 index 0000000000..c806522f7c --- /dev/null +++ b/test/staging/sm/Temporal/PlainDate/withCalendar.js @@ -0,0 +1,43 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +features: +- Temporal +description: | + pending +esid: pending +---*/ + +// Lunisolar/lunar calendars can't accurately predict celestial orbits for dates +// far into the past/future. +// +// https://github.com/unicode-org/icu4x/issues/4917 +// https://github.com/tc39/proposal-temporal/issues/2869 +const calendarsNotSupportingLargeDates = new Set([ + "chinese", + "dangi", + "islamic", + "islamic-rgsa", + "islamic-umalqura", +]); + +const minDate = new Temporal.PlainDate(-271821, 4, 19); +const maxDate = new Temporal.PlainDate(275760, 9, 13); + +for (let calendar of Intl.supportedValuesOf("calendar")) { + // Skip this calendar when large dates are unsupported to avoid hitting + // assertions in ICU4X code. + if (calendarsNotSupportingLargeDates.has(calendar)) { + continue; + } + + let min = minDate.withCalendar(calendar); + let max = maxDate.withCalendar(calendar); + + assert.sameValue(min.year < max.year, true); +} + diff --git a/test/staging/sm/Temporal/PlainMonthDay/from-chinese-leap-month-common.js b/test/staging/sm/Temporal/PlainMonthDay/from-chinese-leap-month-common.js new file mode 100644 index 0000000000..772a7c513e --- /dev/null +++ b/test/staging/sm/Temporal/PlainMonthDay/from-chinese-leap-month-common.js @@ -0,0 +1,70 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-Temporal-PlainMonthDay-shell.js, sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +features: +- Temporal +description: | + pending +esid: pending +---*/ + +// Common leap months should find a result not too far into the past. +// +// Month -> ISO year +// +// M01L +// M02L 1765 +// M03L 1955 +// M04L 1944 +// M05L 1952 +// M06L 1941 +// M07L 1938 +// M08L 1718 +// M09L +// M10L +// M11L +// M12L +// +// M02L and M08L with 29 days is common, but with 30 is actually rather uncommon. +// +// See also "The Mathematics of the Chinese Calendar", Table 21 [1] for a +// distribution of leap months. +// +// [1] https://www.xirugu.com/CHI500/Dates_Time/Chinesecalender.pdf + +const monthCodes = [ + // M01L is an uncommon leap month. + "M02L", + "M03L", + "M04L", + "M05L", + "M06L", + "M07L", + "M08L", + // M09L..M12L are uncommon leap months. +]; + +const calendar = "chinese"; + +// Months can have up to 30 days. +const day = 30; + +for (let monthCode of monthCodes) { + let pmd = Temporal.PlainMonthDay.from({calendar, monthCode, day}); + assert.sameValue(pmd.monthCode, monthCode); + assert.sameValue(pmd.day, day); + + let constrain = Temporal.PlainMonthDay.from({calendar, monthCode, day: day + 1}, {overflow: "constrain"}); + assert.sameValue(constrain.monthCode, monthCode); + assert.sameValue(constrain.day, day); + assertSameISOFields(constrain, pmd); + + assertThrowsInstanceOf(() => { + Temporal.PlainMonthDay.from({calendar, monthCode, day: day + 1}, {overflow: "reject"}); + }, RangeError); +} + diff --git a/test/staging/sm/Temporal/PlainMonthDay/from-chinese-leap-month-uncommon.js b/test/staging/sm/Temporal/PlainMonthDay/from-chinese-leap-month-uncommon.js new file mode 100644 index 0000000000..65d7ce94da --- /dev/null +++ b/test/staging/sm/Temporal/PlainMonthDay/from-chinese-leap-month-uncommon.js @@ -0,0 +1,82 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-Temporal-PlainMonthDay-shell.js, sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +features: +- Temporal +description: | + pending +esid: pending +---*/ + +// Uncommon leap month with 30 days can be far into the past. Computing the +// results can take its time, therefore the test is marked as "slow". +// +// Month -> ISO year +// +// M01L 1461 +// M02L +// M03L +// M04L +// M05L +// M06L +// M07L +// M08L +// M09L -6482 +// M10L -4633 +// M11L -2172 +// M12L -179 +// +// See also "The Mathematics of the Chinese Calendar", Table 21 [1] for a +// distribution of leap months. +// +// [1] https://www.xirugu.com/CHI500/Dates_Time/Chinesecalender.pdf + +const monthCodes = [ + "M01L", + // M02L..M08L are common leap months. + "M09L", + "M10L", + "M11L", + "M12L", +]; + +function assertSameISOFields(actual, expected) { + let actualFields = actual.getISOFields(); + let expectedFields = expected.getISOFields(); + + assert.sameValue(typeof actualFields.isoYear, "number"); + assert.sameValue(typeof actualFields.isoMonth, "number"); + assert.sameValue(typeof actualFields.isoDay, "number"); + + assert.sameValue(actualFields.isoMonth > 0, true); + assert.sameValue(actualFields.isoDay > 0, true); + + assert.sameValue(actualFields.isoYear, expectedFields.isoYear); + assert.sameValue(actualFields.isoMonth, expectedFields.isoMonth); + assert.sameValue(actualFields.isoDay, expectedFields.isoDay); +} + +const calendar = "chinese"; + +// Months can have up to 30 days. +const day = 30; + +for (let monthCode of monthCodes) { + let pmd = Temporal.PlainMonthDay.from({calendar, monthCode, day}); + assert.sameValue(pmd.monthCode, monthCode); + assert.sameValue(pmd.day, day); + + let constrain = Temporal.PlainMonthDay.from({calendar, monthCode, day: day + 1}, {overflow: "constrain"}); + assert.sameValue(constrain.monthCode, monthCode); + assert.sameValue(constrain.day, day); + assertSameISOFields(constrain, pmd); + + assertThrowsInstanceOf(() => { + Temporal.PlainMonthDay.from({calendar, monthCode, day: day + 1}, {overflow: "reject"}); + }, RangeError); +} + diff --git a/test/staging/sm/Temporal/PlainMonthDay/from-chinese.js b/test/staging/sm/Temporal/PlainMonthDay/from-chinese.js new file mode 100644 index 0000000000..eb3b23a77d --- /dev/null +++ b/test/staging/sm/Temporal/PlainMonthDay/from-chinese.js @@ -0,0 +1,66 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-Temporal-PlainMonthDay-shell.js, sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +features: +- Temporal +description: | + pending +esid: pending +---*/ + +// Non-leap month should find a result in years around 1972. +// +// Month -> ISO year +// +// M01 1970 +// M02 1972 +// M03 1966 +// M04 1970 +// M05 1972 +// M06 1971 +// M07 1972 +// M08 1971 +// M09 1972 +// M10 1972 +// M11 1970 +// M12 1972 + +const monthCodes = [ + "M01", + "M02", + "M03", + "M04", + "M05", + "M06", + "M07", + "M08", + "M09", + "M10", + "M11", + "M12", +]; + +const calendar = "chinese"; + +// Months can have up to 30 days. +const day = 30; + +for (let monthCode of monthCodes) { + let pmd = Temporal.PlainMonthDay.from({calendar, monthCode, day}); + assert.sameValue(pmd.monthCode, monthCode); + assert.sameValue(pmd.day, day); + + let constrain = Temporal.PlainMonthDay.from({calendar, monthCode, day: day + 1}, {overflow: "constrain"}); + assert.sameValue(constrain.monthCode, monthCode); + assert.sameValue(constrain.day, day); + assertSameISOFields(constrain, pmd); + + assertThrowsInstanceOf(() => { + Temporal.PlainMonthDay.from({calendar, monthCode, day: day + 1}, {overflow: "reject"}); + }, RangeError); +} + diff --git a/test/staging/sm/Temporal/PlainMonthDay/from-coptic.js b/test/staging/sm/Temporal/PlainMonthDay/from-coptic.js new file mode 100644 index 0000000000..3d4889580b --- /dev/null +++ b/test/staging/sm/Temporal/PlainMonthDay/from-coptic.js @@ -0,0 +1,39 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-Temporal-PlainMonthDay-shell.js, sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +features: +- Temporal +description: | + pending +esid: pending +---*/ + +// Input which has to skip the first two candidates when starting the search from +// December 31, 1972. +// +// Note: December 31, 1972 is year 1689 in the coptic calendar. +// +// 1. First candidate 1689-M13-05 ("1973-09-10[u-ca=coptic]") is after December 31, 1972. +// 2. Second candidate 1688-M13-05 ("1972-09-10[u-ca=coptic]") is before December 31, 1972, +// but day doesn't match. +// 3. Third candidate 1687-M13-06 ("1971-09-11[u-ca=coptic]") is a full match. +{ + let pmd = Temporal.PlainMonthDay.from({ + calendar: "coptic", + monthCode: "M13", + day: 7, + }); + assert.sameValue(pmd.monthCode, "M13"); + assert.sameValue(pmd.day, 6); + + let fields = ISOFields(pmd); + assert.sameValue(fields.calendar, "coptic"); + assert.sameValue(fields.isoYear, 1971); + assert.sameValue(fields.isoMonth, 9); + assert.sameValue(fields.isoDay, 11); +} + diff --git a/test/staging/sm/Temporal/PlainMonthDay/from-gregory.js b/test/staging/sm/Temporal/PlainMonthDay/from-gregory.js new file mode 100644 index 0000000000..f5427e17a0 --- /dev/null +++ b/test/staging/sm/Temporal/PlainMonthDay/from-gregory.js @@ -0,0 +1,78 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-Temporal-PlainMonthDay-shell.js, sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +features: +- Temporal +description: | + pending +esid: pending +---*/ + +// Equivalent monthCode and month are resolved to the same PlainMonthDay. +{ + let withMonthCode = Temporal.PlainMonthDay.from({ + calendar: "gregory", + year: 2023, + monthCode: "M02", + day: 30, + }); + + let withMonth = Temporal.PlainMonthDay.from({ + calendar: "gregory", + year: 2023, + month: 2, + day: 30, + }); + + assert.sameValue(withMonthCode.equals(withMonth), true); +} + +// Inconsistent eraYear and year are ignored when monthCode is present. +{ + let pmd = Temporal.PlainMonthDay.from({ + calendar: "gregory", + era: "ce", + eraYear: 2024, + year: 2023, + monthCode: "M01", + day: 1, + }); + + let expected = Temporal.PlainMonthDay.from({ + calendar: "gregory", + monthCode: "M01", + day: 1, + }); + + assert.sameValue(pmd.equals(expected), true); +} + +// eraYear and year must be consistent when month is present. +{ + let fields = { + calendar: "gregory", + era: "ce", + eraYear: 2024, + year: 2023, + month: 1, + day: 1, + }; + assertThrowsInstanceOf(() => Temporal.PlainMonthDay.from(fields), RangeError); +} + +// monthCode and month must be consistent. +{ + let fields = { + calendar: "gregory", + year: 2024, + monthCode: "M01", + month: 2, + day: 1, + }; + assertThrowsInstanceOf(() => Temporal.PlainMonthDay.from(fields), RangeError); +} + diff --git a/test/staging/sm/Temporal/PlainMonthDay/result-not-after-1972-dec-31.js b/test/staging/sm/Temporal/PlainMonthDay/result-not-after-1972-dec-31.js new file mode 100644 index 0000000000..41322b0fb3 --- /dev/null +++ b/test/staging/sm/Temporal/PlainMonthDay/result-not-after-1972-dec-31.js @@ -0,0 +1,85 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-Temporal-PlainMonthDay-shell.js, sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +features: +- Temporal +description: | + pending +esid: pending +---*/ + +const monthCodes = [ + "M01", + "M02", + "M03", + "M04", + "M05", + "M06", + "M07", + "M08", + "M09", + "M10", + "M11", + "M12", + + // Short epagomenal month. + "M13", + + // Leap months. + "M01L", + "M02L", + "M03L", + "M04L", + "M05L", + "M06L", + "M07L", + "M08L", + "M09L", + "M10L", + "M11L", + "M12L", +]; + +// Chinese and Dangi are excluded to avoid unnecessary slow-downs, see also +// from-chinese*.js tests. +const calendars = [ + "buddhist", + // "chinese", + "coptic", + // "dangi", + "ethiopic", + "ethioaa", + "gregory", + "hebrew", + "indian", + // Islamic calendars are broken in ICU4X 1.5. + // https://github.com/unicode-org/icu4x/issues/5069 + // "islamic", + "islamic-civil", + // "islamic-rgsa", + "islamic-tbla", + // "islamic-umalqura", + "japanese", + "persian", + "roc", +]; + +for (let calendar of calendars) { + const day = 31; + for (let monthCode of monthCodes) { + let pmd; + try { + pmd = Temporal.PlainMonthDay.from({calendar, monthCode, day}); + } catch { + continue; + } + assert.sameValue(pmd.monthCode, monthCode); + assert.sameValue(pmd.day <= day, true); + assert.sameValue(ISOFields(pmd).isoYear <= 1972, true); + } +} + diff --git a/test/staging/sm/Tuple/4.1.2.11.js b/test/staging/sm/Tuple/4.1.2.11.js new file mode 100644 index 0000000000..f6de1d3bb7 --- /dev/null +++ b/test/staging/sm/Tuple/4.1.2.11.js @@ -0,0 +1,139 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +features: +- record-tuple +description: | + pending +esid: pending +---*/ + +/* +2. If ! IsValidTupleIndex(numericIndex) is false, return empty. +*/ + +var t = #[1,2,3,4,5]; +assert.sameValue(t[true], undefined); +assert.sameValue(t[false], undefined); +assert.sameValue(t[-2], undefined); +/* TODO: This should be undefined as per section 4.1.2.10, step 1, + * but it's currently treated the same as t[0]. + */ +// assert.sameValue(t[-0], undefined); +assert.sameValue(t[10], undefined); +assert.sameValue(t[NaN], undefined); +assert.sameValue(t[Number.POSITIVE_INFINITY], undefined); +assert.sameValue(t[Number.NEGATIVE_INFINITY], undefined); +assert.sameValue(t["abc"], undefined); +assert.sameValue(t["3"], t[3]); +assert.sameValue(t[new String("3")], t[3]); +assert.sameValue(t["0"], t[0]); +assert.sameValue(t[new String("0")], t[0]); +assert.sameValue(t[new Number(0)], t[0]); +assert.sameValue(t[new Number(3)], t[3]); +assert.sameValue(t[1.1], undefined); +assert.sameValue(t[null], undefined); +assert.sameValue(t[undefined], undefined); + +var object = { + valueOf: function() { + return 1 + } +}; +assert.sameValue(t[object], undefined); + +var object = { + valueOf: function() { + return 1 + }, + toString: function() { + return 0 + } +}; +assert.sameValue(t[object], t[0]); + +var object = { + valueOf: function() { + return 1 + }, + toString: function() { + return {} + } +}; +assert.sameValue(t[object], t[1]); + +//CHECK#4 +try { + x = []; + var object = { + valueOf: function() { + throw "error" + }, + toString: function() { + return 1 + } + }; + assert.sameValue(tup[object], tup[1]); +} +catch (e) { + assert.sameValue(e === "error", false); +} + +//CHECK#5 +var object = { + toString: function() { + return 1 + } +}; +assert.sameValue(t[object], t[1]); + +//CHECK#6 +x = []; +var object = { + valueOf: function() { + return {} + }, + toString: function() { + return 1 + } +} +assert.sameValue(t[object], t[1]); + +//CHECK#7 +try { + var object = { + valueOf: function() { + return 1 + }, + toString: function() { + throw "error" + } + }; + t[object]; + throw new SyntaxError(); +} +catch (e) { + assert.sameValue(e, "error", 'The value of e is expected to be "error"'); +} + +//CHECK#8 +try { + var object = { + valueOf: function() { + return {} + }, + toString: function() { + return {} + } + }; + t[object]; + throw new SyntaxError(); +} +catch (e) { + assert.sameValue(e instanceof TypeError, true); +} + diff --git a/test/staging/sm/Tuple/4.1.2.6.js b/test/staging/sm/Tuple/4.1.2.6.js new file mode 100644 index 0000000000..0f398f425e --- /dev/null +++ b/test/staging/sm/Tuple/4.1.2.6.js @@ -0,0 +1,30 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +features: +- record-tuple +description: | + pending +esid: pending +---*/ + +/* +4.1.2.6 [[Set]] ( P, Receiver ) +The [[Set]] internal method of a Tuple exotic object takes arguments P and Receiver. It performs the following steps when called: + +1. Assert: IsPropertyKey(P) is true. +2. Return false. +*/ + +// Setting properties should have no effect +var t = #[1]; +t[4294967295] = "not a tuple element"; +assert.sameValue(t[4294967295], undefined); +assert.sameValue(t.length, 1); +t[1] = 5; +assert.sameValue(t.length, 1); + diff --git a/test/staging/sm/Tuple/9.1.1.1.js b/test/staging/sm/Tuple/9.1.1.1.js new file mode 100644 index 0000000000..139facf018 --- /dev/null +++ b/test/staging/sm/Tuple/9.1.1.1.js @@ -0,0 +1,23 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +features: +- record-tuple +description: | + pending +esid: pending +---*/ + +assert.sameValue(Object.prototype.toString.call(#[1,2,3]), + "[object Tuple]"); +assert.sameValue(Object.prototype.toString.call(Object(#[1,2,3])), + "[object Tuple]"); +assert.sameValue(Object.prototype.toString.call(#[]), + "[object Tuple]"); +assert.sameValue(Object.prototype.toString.call(Object(#[])), + "[object Tuple]"); + diff --git a/test/staging/sm/Tuple/constructor.js b/test/staging/sm/Tuple/constructor.js new file mode 100644 index 0000000000..7dc81282be --- /dev/null +++ b/test/staging/sm/Tuple/constructor.js @@ -0,0 +1,29 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +features: +- record-tuple +description: | + pending +esid: pending +---*/ + +assertThrowsInstanceOf( + () => new Tuple(), + TypeError, + "Tuple is not a constructor" +); + +assert.sameValue(typeof Tuple(), "tuple"); +assert.sameValue(typeof Object(Tuple()), "object"); +assert.sameValue(Tuple() instanceof Tuple, false); +assert.sameValue(Object(Tuple()) instanceof Tuple, true); + +assert.sameValue(Tuple().__proto__, Tuple.prototype); +assert.sameValue(Object(Tuple()).__proto__, Tuple.prototype); +assert.sameValue(Tuple.prototype.constructor, Tuple); + diff --git a/test/staging/sm/Tuple/constructor/8.2.1.js b/test/staging/sm/Tuple/constructor/8.2.1.js new file mode 100644 index 0000000000..971db2647a --- /dev/null +++ b/test/staging/sm/Tuple/constructor/8.2.1.js @@ -0,0 +1,63 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +features: +- record-tuple +description: | + pending +esid: pending +---*/ +/* +8.2.1 The Tuple Constructor +The Tuple constructor: + +is the intrinsic object %Tuple%. +*/ + +assert.sameValue(typeof Tuple, "function"); +assert.sameValue(typeof Tuple.prototype, "object"); + +/* +is the initial value of the "Tuple" property of the global object. +*/ +assert.sameValue(this.Tuple, Tuple); + +/* +creates and initializes a new Tuple object when called as a function. +*/ +assert.sameValue(Tuple(), #[]); +assert.sameValue(Tuple(1), #[1]); +assert.sameValue(Tuple("a", 1, true), #["a", 1, true]); +/* 8.2.1.1 +3. For each element e of items, +a. If Type(e) is Object, throw a TypeError exception. +*/ +assertThrowsInstanceOf(() => Tuple("a", new Object()), TypeError, + "Object in Tuple"); + +/* +is not intended to be used with the new operator or to be subclassed. +*/ +/* 8.2.1.1 +1. If NewTarget is not undefined, throw a TypeError exception. +*/ +assertThrowsInstanceOf(() => new Tuple(1, 2, 3), TypeError, "Tuple is not intended to be used with the new operator"); + + +/* It may be used as the value of an extends clause of a class definition but a super call to the Tuple constructor will cause an exception. +*/ +class C extends Tuple{}; // class declaration is allowed +// super() is called implicitly +assertThrowsInstanceOf (() => new C(), TypeError, "super call to Tuple constructor"); +class D extends Tuple { + constructor() { + super(); + } +}; +// Explicit call to super() will also throw +assertThrowsInstanceOf(() => new D(), TypeError, "super call to Tuple constructor"); + diff --git a/test/staging/sm/Tuple/constructor/8.2.2.js b/test/staging/sm/Tuple/constructor/8.2.2.js new file mode 100644 index 0000000000..99480ab59b --- /dev/null +++ b/test/staging/sm/Tuple/constructor/8.2.2.js @@ -0,0 +1,22 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +features: +- record-tuple +description: | + pending +esid: pending +---*/ + +/* +8.2.2 Properties of the Tuple Constructor +The Tuple constructor: + +has a [[Prototype]] internal slot whose value is %Function.prototype%. +*/ +assert.sameValue(Object.getPrototypeOf(Tuple), Function.prototype); + diff --git a/test/staging/sm/Tuple/constructor/call-method.js b/test/staging/sm/Tuple/constructor/call-method.js new file mode 100644 index 0000000000..3c49cbcb38 --- /dev/null +++ b/test/staging/sm/Tuple/constructor/call-method.js @@ -0,0 +1,28 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +features: +- record-tuple +description: | + pending +esid: pending +---*/ +/* +10.2 ECMAScript Function Objects +... +All ECMAScript function objects have the [[Call]] internal method defined here. ECMAScript functions that are also constructors in addition have the [[Construct]] internal method. +*/ + +assert.sameValue(Tuple.call(), #[]); +assert.sameValue(Tuple.call(undefined), #[]); +assert.sameValue(Tuple.call(undefined, 1), #[1]); +assert.sameValue(Tuple.call(2, 1), #[1]); +assert.sameValue(Tuple.call(#[], 1), #[1]); +assert.sameValue(Tuple.call(undefined, 1, 2, 3), #[1,2,3]); +assert.sameValue(Tuple.call(6, 1, 2, 3), #[1,2,3]); +assert.sameValue(Tuple.call(#[1], 1, 2, 3), #[1,2,3]); + diff --git a/test/staging/sm/Tuple/constructor/is-a-constructor.js b/test/staging/sm/Tuple/constructor/is-a-constructor.js new file mode 100644 index 0000000000..d6a95565f4 --- /dev/null +++ b/test/staging/sm/Tuple/constructor/is-a-constructor.js @@ -0,0 +1,15 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +features: +- record-tuple +description: | + pending +esid: pending +---*/ +assert.sameValue(isConstructor(Tuple), true); + diff --git a/test/staging/sm/Tuple/constructor/length.js b/test/staging/sm/Tuple/constructor/length.js new file mode 100644 index 0000000000..54fc083ac7 --- /dev/null +++ b/test/staging/sm/Tuple/constructor/length.js @@ -0,0 +1,24 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +features: +- record-tuple +description: | + pending +esid: pending +---*/ +/* +18 ECMAScript Standard Built-in Objects +... +Every built-in function object, including constructors, has a "length" property whose value is a non-negative integral Number. Unless otherwise specified, this value is equal to the number of required parameters shown in the subclause heading for the function description. Optional parameters and rest parameters are not included in the parameter count. +*/ +var desc = Object.getOwnPropertyDescriptor(Tuple, "length"); +assert.sameValue(desc.value, 0); +assert.sameValue(desc.writable, false); +assert.sameValue(desc.enumerable, false); +assert.sameValue(desc.configurable, true); + diff --git a/test/staging/sm/Tuple/constructor/name.js b/test/staging/sm/Tuple/constructor/name.js new file mode 100644 index 0000000000..b713f17305 --- /dev/null +++ b/test/staging/sm/Tuple/constructor/name.js @@ -0,0 +1,29 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +features: +- record-tuple +description: | + pending +esid: pending +---*/ +/* +18 ECMAScript Standard Built-in Objects + +Every built-in function object, including constructors, has a "name" property whose value is a String. Unless otherwise specified, this value is the name that is given to the function in this specification. Functions that are identified as anonymous functions use the empty String as the value of the "name" property. +... +Unless otherwise specified, the "name" property of a built-in function object has the attributes { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: true }. +*/ + + +var desc = Object.getOwnPropertyDescriptor(Tuple, "name"); +assert.sameValue(desc.value, "Tuple"); + +assert.sameValue(desc.writable, false); +assert.sameValue(desc.enumerable, false); +assert.sameValue(desc.configurable, true); + diff --git a/test/staging/sm/Tuple/cross-realm.js b/test/staging/sm/Tuple/cross-realm.js new file mode 100644 index 0000000000..2585179c48 --- /dev/null +++ b/test/staging/sm/Tuple/cross-realm.js @@ -0,0 +1,33 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +features: +- record-tuple +description: | + pending +esid: pending +---*/ + +const realm = createNewGlobal(); + +const realm_TupleConstructor = realm.eval("Tuple"); +const realm_tuple = realm.eval(` + var tuple = Tuple(1, 2, 3); + tuple; +`); + +assert.sameValue(realm_tuple === #[1, 2, 3], true); +assert.sameValue(realm_tuple.constructor, Tuple); +assert.sameValue(realm.eval("tuple.constructor"), realm_TupleConstructor); + +realm_TupleConstructor.prototype.foo = 42; +assert.sameValue(realm.eval("tuple.foo"), 42); +assert.sameValue(realm_tuple.foo, undefined); + +assert.sameValue("foo" in Object(realm_tuple), false); +assert.sameValue(realm.eval(`"foo" in Object(tuple)`), true); + diff --git a/test/staging/sm/Tuple/elements.js b/test/staging/sm/Tuple/elements.js new file mode 100644 index 0000000000..cfe1289db8 --- /dev/null +++ b/test/staging/sm/Tuple/elements.js @@ -0,0 +1,30 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +features: +- record-tuple +description: | + pending +esid: pending +---*/ + +var tup = Tuple(1, 2, 10n ** 100n, Tuple(5, 6)); + +assert.sameValue(tup[0], 1); +assert.sameValue(tup[1], 2); +assert.sameValue(tup[2], 10n ** 100n); +assert.sameValue(typeof tup[3], "tuple"); +assert.sameValue(tup[3][0], 5); +assert.sameValue(tup[3][1], 6); + +assert.sameValue(Object(tup)[0], 1); + +assert.sameValue(tup.length, 4); +assert.sameValue(Object(tup).length, 4); + +assert.sameValue("0" in Object(tup), true); + diff --git a/test/staging/sm/Tuple/enumeration.js b/test/staging/sm/Tuple/enumeration.js new file mode 100644 index 0000000000..47047aa188 --- /dev/null +++ b/test/staging/sm/Tuple/enumeration.js @@ -0,0 +1,59 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +features: +- record-tuple +description: | + pending +esid: pending +---*/ + +var tup = #[1, 2, 3]; + +var keys = Object.keys(tup); +assert.sameValue(keys.length, 3); +assert.sameValue(keys[0], "0"); +assert.sameValue(keys[1], "1"); +assert.sameValue(keys[2], "2"); + +var values = Object.values(tup); +assert.sameValue(values.length, 3); +assert.sameValue(values[0], 1); +assert.sameValue(values[1], 2); +assert.sameValue(values[2], 3); + +var entries = Object.entries(tup); +assert.sameValue(entries.length, 3); +assert.sameValue(entries[0][0], "0"); +assert.sameValue(entries[0][1], 1); +assert.sameValue(entries[1][0], "1"); +assert.sameValue(entries[1][1], 2); +assert.sameValue(entries[2][0], "2"); +assert.sameValue(entries[2][1], 3); + +var ownKeys = Reflect.ownKeys(Object(tup)); +assert.sameValue(ownKeys.length, 3); +assert.sameValue(ownKeys[0], "0"); +assert.sameValue(ownKeys[1], "1"); +assert.sameValue(ownKeys[2], "2"); + +var spreadKeys = Object.keys({ ...tup }); +assert.sameValue(spreadKeys.length, 3); +assert.sameValue(spreadKeys[0], "0"); +assert.sameValue(spreadKeys[1], "1"); +assert.sameValue(spreadKeys[2], "2"); + +var i = 0; +for (var key in tup) { + switch (i++) { + case 0: assert.sameValue(key, "0"); break; + case 1: assert.sameValue(key, "1"); break; + case 2: assert.sameValue(key, "2"); break; + default: assertUnreachable(); + } +} + diff --git a/test/staging/sm/Tuple/equality.js b/test/staging/sm/Tuple/equality.js new file mode 100644 index 0000000000..dc7d089d50 --- /dev/null +++ b/test/staging/sm/Tuple/equality.js @@ -0,0 +1,43 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +features: +- record-tuple +description: | + pending +esid: pending +---*/ + +let simple1 = #[1, 2]; +let simple2 = #[1, 2]; +let simpleDiff = #[0, 2]; +let simpleDiff2 = #[1]; + +assert.sameValue(simple1 === simple2, true); +assert.sameValue(simple1 === simpleDiff, false); +assert.sameValue(simple1 === simpleDiff2, false); + +let withPositiveZero = #[1, 2, +0]; +let withPositiveZero2 = #[1, 2, +0]; +let withNegativeZero = #[1, 2, -0]; + +assert.sameValue(withPositiveZero === withPositiveZero2, true); +assert.sameValue(Object.is(withPositiveZero, withPositiveZero2), true); +assert.sameValue(#[withPositiveZero] === #[withPositiveZero2], true); +assert.sameValue(Object.is(#[withPositiveZero], #[withPositiveZero2]), true); + +assert.sameValue(withPositiveZero === withNegativeZero, true); +assert.sameValue(Object.is(withPositiveZero, withNegativeZero), false); +assert.sameValue(#[withPositiveZero] === #[withNegativeZero], true); +assert.sameValue(Object.is(#[withPositiveZero], #[withNegativeZero]), false); + +let withNaN = #[1, NaN, 2]; +let withNaN2 = #[1, NaN, 2]; + +assert.sameValue(withNaN === withNaN2, true); +assert.sameValue(Object.is(withNaN, withNaN2), true); + diff --git a/test/staging/sm/Tuple/from/arraylike-get-length-error.js b/test/staging/sm/Tuple/from/arraylike-get-length-error.js new file mode 100644 index 0000000000..3c28d9a8a5 --- /dev/null +++ b/test/staging/sm/Tuple/from/arraylike-get-length-error.js @@ -0,0 +1,28 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +features: +- record-tuple +description: | + pending +esid: pending +---*/ + +/* 9. Let len be ? LengthOfArrayLike(arrayLike). */ + +var arrayLike = {}; + +Object.defineProperty(arrayLike, "length", { + get: function() { + throw new SyntaxError(); + } +}); + +assertThrowsInstanceOf(function() { + Tuple.from(arrayLike); +}, SyntaxError, "items.length throws"); + diff --git a/test/staging/sm/Tuple/from/arraylike-to-length-error.js b/test/staging/sm/Tuple/from/arraylike-to-length-error.js new file mode 100644 index 0000000000..85e4845680 --- /dev/null +++ b/test/staging/sm/Tuple/from/arraylike-to-length-error.js @@ -0,0 +1,27 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +features: +- record-tuple +description: | + pending +esid: pending +---*/ + +/* 9. Let len be ? LengthOfArrayLike(arrayLike). */ + +var arrayLike = { length: {} }; + +arrayLike.length = { + valueOf: function() { + throw new SyntaxError(); + } +}; + +assertThrowsInstanceOf(() => Tuple.from(arrayLike), + SyntaxError, "items has invalid length"); + diff --git a/test/staging/sm/Tuple/from/calling-from-valid-1-noStrict.js b/test/staging/sm/Tuple/from/calling-from-valid-1-noStrict.js new file mode 100644 index 0000000000..dc0cf66bf2 --- /dev/null +++ b/test/staging/sm/Tuple/from/calling-from-valid-1-noStrict.js @@ -0,0 +1,54 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +features: +- record-tuple +description: | + pending +esid: pending +---*/ + +var list = { + '0': 41, + '1': 42, + '2': 43, + length: 3 +}; +var calls = []; + +function mapFn(value) { + calls.push({ + args: arguments, + thisArg: this + }); + return value * 2; +} + +var result = Tuple.from(list, mapFn); + +assert.sameValue(result.length, 3); +assert.sameValue(result[0], 82); +assert.sameValue(result[1], 84); +assert.sameValue(result[2], 86); + +assert.sameValue(calls.length, 3); + +assert.sameValue(calls[0].args.length, 2); +assert.sameValue(calls[0].args[0], 41); +assert.sameValue(calls[0].args[1], 0); +assert.sameValue(calls[0].thisArg, this); + +assert.sameValue(calls[1].args.length, 2); +assert.sameValue(calls[1].args[0], 42); +assert.sameValue(calls[1].args[1], 1); +assert.sameValue(calls[1].thisArg, this); + +assert.sameValue(calls[2].args.length, 2); +assert.sameValue(calls[2].args[0], 43); +assert.sameValue(calls[2].args[1], 2); +assert.sameValue(calls[2].thisArg, this); + diff --git a/test/staging/sm/Tuple/from/calling-from-valid-1-onlyStrict-strict.js b/test/staging/sm/Tuple/from/calling-from-valid-1-onlyStrict-strict.js new file mode 100644 index 0000000000..9d1eb1d64c --- /dev/null +++ b/test/staging/sm/Tuple/from/calling-from-valid-1-onlyStrict-strict.js @@ -0,0 +1,55 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +flags: +- onlyStrict +includes: [sm/non262-shell.js, sm/non262.js] +features: +- record-tuple +description: | + pending +esid: pending +---*/ +'use strict'; + +var list = { + '0': 41, + '1': 42, + '2': 43, + length: 3 +}; +var calls = []; + +function mapFn(value) { + calls.push({ + args: arguments, + thisArg: this + }); + return value * 2; +} + +var result = Tuple.from(list, mapFn); + +assert.sameValue(result.length, 3); +assert.sameValue(result[0], 82); +assert.sameValue(result[1], 84); +assert.sameValue(result[2], 86); + +assert.sameValue(calls.length, 3); + +assert.sameValue(calls[0].args.length, 2); +assert.sameValue(calls[0].args[0], 41); +assert.sameValue(calls[0].args[1], 0); +assert.sameValue(calls[0].thisArg, undefined); + +assert.sameValue(calls[1].args.length, 2); +assert.sameValue(calls[1].args[0], 42); +assert.sameValue(calls[1].args[1], 1); +assert.sameValue(calls[1].thisArg, undefined); + +assert.sameValue(calls[2].args.length, 2); +assert.sameValue(calls[2].args[0], 43); +assert.sameValue(calls[2].args[1], 2); +assert.sameValue(calls[2].thisArg, undefined); + diff --git a/test/staging/sm/Tuple/from/calling-from-valid-2.js b/test/staging/sm/Tuple/from/calling-from-valid-2.js new file mode 100644 index 0000000000..52bf65c9d6 --- /dev/null +++ b/test/staging/sm/Tuple/from/calling-from-valid-2.js @@ -0,0 +1,55 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +features: +- record-tuple +description: | + pending +esid: pending +---*/ + +var list = { + '0': 41, + '1': 42, + '2': 43, + length: 3 +}; +var calls = []; +var thisArg = {}; + +function mapFn(value) { + calls.push({ + args: arguments, + thisArg: this + }); + return value * 2; +} + +var result = Tuple.from(list, mapFn, thisArg); + +assert.sameValue(result.length, 3); +assert.sameValue(result[0], 82); +assert.sameValue(result[1], 84); +assert.sameValue(result[2], 86); + +assert.sameValue(calls.length, 3); + +assert.sameValue(calls[0].args.length, 2); +assert.sameValue(calls[0].args[0], 41); +assert.sameValue(calls[0].args[1], 0); +assert.sameValue(calls[0].thisArg, thisArg); + +assert.sameValue(calls[1].args.length, 2); +assert.sameValue(calls[1].args[0], 42); +assert.sameValue(calls[1].args[1], 1); +assert.sameValue(calls[1].thisArg, thisArg); + +assert.sameValue(calls[2].args.length, 2); +assert.sameValue(calls[2].args[0], 43); +assert.sameValue(calls[2].args[1], 2); +assert.sameValue(calls[2].thisArg, thisArg); + diff --git a/test/staging/sm/Tuple/from/descriptor.js b/test/staging/sm/Tuple/from/descriptor.js new file mode 100644 index 0000000000..a80cf16de1 --- /dev/null +++ b/test/staging/sm/Tuple/from/descriptor.js @@ -0,0 +1,20 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +features: +- record-tuple +description: | + pending +esid: pending +---*/ + +var desc = Object.getOwnPropertyDescriptor(Tuple, "from"); +assert.sameValue(desc.value, Tuple.from); +assert.sameValue(desc.writable, true); +assert.sameValue(desc.enumerable, false); +assert.sameValue(desc.configurable, true); + diff --git a/test/staging/sm/Tuple/from/elements-added-after.js b/test/staging/sm/Tuple/from/elements-added-after.js new file mode 100644 index 0000000000..a5d2f47ce0 --- /dev/null +++ b/test/staging/sm/Tuple/from/elements-added-after.js @@ -0,0 +1,40 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +features: +- record-tuple +description: | + pending +esid: pending +---*/ +var tupleIndex = -1; +var originalLength = 7; +var obj = { + length: originalLength, + 0: 2, + 1: 4, + 2: 8, + 3: 16, + 4: 32, + 5: 64, + 6: 128 +}; +var tuple = #[2, 4, 8, 16, 32, 64, 128]; + +function mapFn(value, index) { + tupleIndex++; + assert.sameValue(value, obj[tupleIndex]); + assert.sameValue(index, tupleIndex); + obj[originalLength + tupleIndex] = 2 * tupleIndex + 1; + + return obj[tupleIndex]; +} + + +var t = Tuple.from(obj, mapFn); +assert.sameValue(t, tuple); + diff --git a/test/staging/sm/Tuple/from/elements-deleted-after.js b/test/staging/sm/Tuple/from/elements-deleted-after.js new file mode 100644 index 0000000000..80a2f49be4 --- /dev/null +++ b/test/staging/sm/Tuple/from/elements-deleted-after.js @@ -0,0 +1,35 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +features: +- record-tuple +description: | + pending +esid: pending +---*/ +var originalTuple = #[0, 1, -2, 4, -8, 16]; +var array = [0,1,-2,4,-8,16]; +var t = #[]; +var arrayIndex = -1; + +function mapFn(value, index) { + this.arrayIndex++; + assert.sameValue(value, array[this.arrayIndex]); + assert.sameValue(index, this.arrayIndex); + array.splice(array.length - 1, 1); + return 127; +} + + +t = Tuple.from(array, mapFn, this); + +assert.sameValue(t.length, originalTuple.length / 2); + +for (var j = 0; j < originalTuple.length / 2; j++) { + assert.sameValue(t[j], 127); +} + diff --git a/test/staging/sm/Tuple/from/from.js b/test/staging/sm/Tuple/from/from.js new file mode 100644 index 0000000000..7e2f429607 --- /dev/null +++ b/test/staging/sm/Tuple/from/from.js @@ -0,0 +1,100 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +features: +- record-tuple +description: | + pending +esid: pending +---*/ +/* +8.2.2.2 Tuple.from ( items [ , mapFn [, thisArg ] ] ) +When the from method is called with argument items and optional arguments mapfn and thisArg, the following steps are taken: + +1. If mapfn is undefined, let mapping be false. +2. Else, +a. If IsCallable(mapfn) is false, throw a TypeError exception. +b. Let mapping be true. +3. Let list be a new empty List. +4. Let k be 0. +5. Let usingIterator be ? GetMethod(items, @@iterator). +6. If usingIterator is not undefined, then +a. Let adder be a new Abstract Closure with parameters (key, value) that captures (list, mapFn, thisArg, mapping, k) and performs the following steps when called: +i. If mapping is true, then +1. Let mappedValue be ? Call(mapfn, thisArg, « value, k »). +ii. Else, let mappedValue be value. +iii. If Type(mappedValue) is Object, throw a TypeError exception. +iv. Append mappedValue to list. +v. Set k to k + 1. +b. Perform ! AddEntriesFromIterable(undefined, iterable, adder). +c. Return a new Tuple value whose [[Sequence]] is list. +7. NOTE: items is not an Iterable so assume it is an array-like object. +8. Let arrayLike be ! ToObject(items). +9. Let len be ? LengthOfArrayLike(arrayLike). +10. Repeat, while k < len, +a. Let Pk be ! ToString(k). +b. Let kValue be ? Get(arrayLike, Pk). +c. If mapping is true, then +i. Let mappedValue be ? Call(mapfn, thisArg, « kValue, k »). +d. Else, let mappedValue be kValue. +e. If Type(mappedValue) is Object, throw a TypeError exception. +f. Append mappedValue to list. +g. Set k to k + 1. +11. Return a new Tuple value whose [[Sequence]] is list. +*/ + +/* Step 1: mapfn explicitly undefined */ +assert.sameValue(Tuple.from([1,2],undefined),#[1,2]); + +/* Step 2a: If IsCallable(mapfn) is false, throw a TypeError exception. */ +assertThrowsInstanceOf(() => Tuple.from([1,2,3],"monkeys"), TypeError, "mapfn not callable"); + +/* Step 5 */ +assertThrowsInstanceOf(() => Tuple.from(undefined), TypeError, + "can't access property Symbol.iterator of undefined"); +assertThrowsInstanceOf(() => Tuple.from(null), TypeError, + "can't access property Symbol.iterator of null"); +assert.sameValue(Tuple.from(1), #[]); +var obj = {}; +obj[Symbol.iterator] = null; +assert.sameValue(Tuple.from(obj), #[]); +obj[Symbol.iterator] = 5; +assertThrowsInstanceOf(() => Tuple.from(obj), TypeError, + "number is not a function"); + + +/* Step 6a.i. mapping exists */ +assert.sameValue(Tuple.from([1,2,3],x => x+1), #[2,3,4]); +assert.sameValue(Tuple.from(#[1,2,3],x => x+1), #[2,3,4]); +assert.sameValue(Tuple.from("xyz", c => String.fromCharCode(c.charCodeAt(0) + 1)), #['y', 'z', '{']); +/* Step 6a.ii. mapping does not exist */ +assert.sameValue(Tuple.from([1,2,3,4,5]), #[1,2,3,4,5]); +assert.sameValue(Tuple.from(#[1,2,3,4,5]), #[1,2,3,4,5]); +assert.sameValue(Tuple.from("xyz"), #['x', 'y', 'z']); + +/* Step 6a.iii. if mapfn returns Object, throw */ +assertThrowsInstanceOf(() => Tuple.from([1,2], x => [x]), TypeError, "Tuple cannot contain object"); + +/* Step 7 -- array-like but not iterable */ +var obj = { length: 3, 0: "a", 1: "b", 2: "c" }; +assert.sameValue(Tuple.from(obj), #["a","b","c"]); +assert.sameValue(Tuple.from(obj, s => s + s), #["aa","bb","cc"]); + +obj = { 0: "a", 1: "b", 2: "c" }; +assert.sameValue(Tuple.from(obj), #[]); + +obj = { length: 3, 0: 1, 2: 3 }; +assert.sameValue(Tuple.from(obj), #[1, undefined, 3]); + +obj = { length: 3, 0: 1, 1: [2], 2: 3 }; +assertThrowsInstanceOf(() => Tuple.from(obj), TypeError, "Tuple cannot contain object"); + +/* Step 10e */ +assertThrowsInstanceOf(() => Tuple.from([1, 2, [3,4]]), TypeError, + "Tuple can't contain Object"); + + diff --git a/test/staging/sm/Tuple/from/get-iter-method-err.js b/test/staging/sm/Tuple/from/get-iter-method-err.js new file mode 100644 index 0000000000..5677230aee --- /dev/null +++ b/test/staging/sm/Tuple/from/get-iter-method-err.js @@ -0,0 +1,23 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +features: +- record-tuple +description: | + pending +esid: pending +---*/ +var items = {}; +Object.defineProperty(items, Symbol.iterator, { + get: function() { + throw new RangeError(); + } +}); + +assertThrowsInstanceOf(() => Tuple.from(items), RangeError, + 'Tuple.from(items) should throw'); + diff --git a/test/staging/sm/Tuple/from/indexed-setters.js b/test/staging/sm/Tuple/from/indexed-setters.js new file mode 100644 index 0000000000..859ed2d087 --- /dev/null +++ b/test/staging/sm/Tuple/from/indexed-setters.js @@ -0,0 +1,22 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +features: +- record-tuple +description: | + pending +esid: pending +---*/ + +// If an indexed Array setter is overridden, TupleMap shouldn't use it +// when constructing the intermediate array + +z = 5; +Object.defineProperty(Array.prototype, '0', { set: function(y) { z = 42; }}); +newT = Tuple.from([1, 2, 3]); +assert.sameValue(z, 5); + diff --git a/test/staging/sm/Tuple/from/items-is-arraybuffer.js b/test/staging/sm/Tuple/from/items-is-arraybuffer.js new file mode 100644 index 0000000000..6b8df8463d --- /dev/null +++ b/test/staging/sm/Tuple/from/items-is-arraybuffer.js @@ -0,0 +1,19 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +features: +- record-tuple +description: | + pending +esid: pending +---*/ +var arrayBuffer = new ArrayBuffer(7); + +var result = Tuple.from(arrayBuffer); + +assert.sameValue(result.length, 0); + diff --git a/test/staging/sm/Tuple/from/items-is-null-throws.js b/test/staging/sm/Tuple/from/items-is-null-throws.js new file mode 100644 index 0000000000..93b90d7e3a --- /dev/null +++ b/test/staging/sm/Tuple/from/items-is-null-throws.js @@ -0,0 +1,16 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +features: +- record-tuple +description: | + pending +esid: pending +---*/ +assertThrowsInstanceOf(() => Tuple.from(null), TypeError, + 'Tuple.from(null) should throw'); + diff --git a/test/staging/sm/Tuple/from/iter-adv-err.js b/test/staging/sm/Tuple/from/iter-adv-err.js new file mode 100644 index 0000000000..b9890c6945 --- /dev/null +++ b/test/staging/sm/Tuple/from/iter-adv-err.js @@ -0,0 +1,26 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +features: +- record-tuple +description: | + pending +esid: pending +---*/ +var items = {}; +items[Symbol.iterator] = function() { + return { + next: function() { + throw new RangeError(); + } + }; +}; + +assertThrowsInstanceOf(function() { + Tuple.from(items); +}, RangeError, 'Tuple.from(items) should throw'); + diff --git a/test/staging/sm/Tuple/from/iter-get-iter-err.js b/test/staging/sm/Tuple/from/iter-get-iter-err.js new file mode 100644 index 0000000000..e75812ac2d --- /dev/null +++ b/test/staging/sm/Tuple/from/iter-get-iter-err.js @@ -0,0 +1,22 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +features: +- record-tuple +description: | + pending +esid: pending +---*/ +var itemsPoisonedSymbolIterator = {}; +itemsPoisonedSymbolIterator[Symbol.iterator] = function() { + throw new RangeError(); +}; + +assertThrowsInstanceOf(function() { + Tuple.from(itemsPoisonedSymbolIterator); +}, RangeError, 'Tuple.from(itemsPoisonedSymbolIterator) throws'); + diff --git a/test/staging/sm/Tuple/from/iter-get-iter-val-err.js b/test/staging/sm/Tuple/from/iter-get-iter-val-err.js new file mode 100644 index 0000000000..a4e2f70aff --- /dev/null +++ b/test/staging/sm/Tuple/from/iter-get-iter-val-err.js @@ -0,0 +1,32 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +features: +- record-tuple +description: | + pending +esid: pending +---*/ +var itemsPoisonedIteratorValue = {}; +var poisonedValue = {}; +Object.defineProperty(poisonedValue, 'value', { + get: function() { + throw new RangeError(); + } +}); +itemsPoisonedIteratorValue[Symbol.iterator] = function() { + return { + next: function() { + return poisonedValue; + } + }; +}; + +assertThrowsInstanceOf(function() { + Tuple.from(itemsPoisonedIteratorValue); +}, RangeError, 'Tuple.from(itemsPoisonedIteratorValue) throws'); + diff --git a/test/staging/sm/Tuple/from/iter-map-fn-args.js b/test/staging/sm/Tuple/from/iter-map-fn-args.js new file mode 100644 index 0000000000..03328fc398 --- /dev/null +++ b/test/staging/sm/Tuple/from/iter-map-fn-args.js @@ -0,0 +1,55 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +features: +- record-tuple +description: | + pending +esid: pending +---*/ +var args = []; +var firstResult = { + done: false, + value: {} +}; +var secondResult = { + done: false, + value: {} +}; +var mapFn = function(value, idx) { + args.push(arguments); +}; +var items = {}; +var nextResult = firstResult; +var nextNextResult = secondResult; + +items[Symbol.iterator] = function() { + return { + next: function() { + var result = nextResult; + nextResult = nextNextResult; + nextNextResult = { + done: true + }; + + return result; + } + }; +}; + +Tuple.from(items, mapFn); + +assert.sameValue(args.length, 2); + +assert.sameValue(args[0].length, 2); +assert.sameValue(args[0][0], firstResult.value); +assert.sameValue(args[0][1], 0); + +assert.sameValue(args[1].length, 2); +assert.sameValue(args[1][0], secondResult.value); +assert.sameValue(args[1][1], 1); + diff --git a/test/staging/sm/Tuple/from/iter-map-fn-err.js b/test/staging/sm/Tuple/from/iter-map-fn-err.js new file mode 100644 index 0000000000..6eaf91c05c --- /dev/null +++ b/test/staging/sm/Tuple/from/iter-map-fn-err.js @@ -0,0 +1,37 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +features: +- record-tuple +description: | + pending +esid: pending +---*/ +var closeCount = 0; +var mapFn = function() { + throw new RangeError(); +}; +var items = {}; +items[Symbol.iterator] = function() { + return { + return: function() { + closeCount += 1; + }, + next: function() { + return { + done: false + }; + } + }; +}; + +assertThrowsInstanceOf(function() { + Tuple.from(items, mapFn); +}, RangeError, 'Tuple.from(items, mapFn) should throw'); + +assert.sameValue(closeCount, 1); + diff --git a/test/staging/sm/Tuple/from/iter-map-fn-return.js b/test/staging/sm/Tuple/from/iter-map-fn-return.js new file mode 100644 index 0000000000..e341312f1e --- /dev/null +++ b/test/staging/sm/Tuple/from/iter-map-fn-return.js @@ -0,0 +1,55 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +features: +- record-tuple +description: | + pending +esid: pending +---*/ +var thisVals = []; +var nextResult = { + done: false, + value: {} +}; +var nextNextResult = { + done: false, + value: {} +}; +var firstReturnVal = 1; +var secondReturnVal = 2; +var mapFn = function(value, idx) { + var returnVal = nextReturnVal; + nextReturnVal = nextNextReturnVal; + nextNextReturnVal = null; + return returnVal; +}; +var nextReturnVal = firstReturnVal; +var nextNextReturnVal = secondReturnVal; +var items = {}; +var result; + +items[Symbol.iterator] = function() { + return { + next: function() { + var result = nextResult; + nextResult = nextNextResult; + nextNextResult = { + done: true + }; + + return result; + } + }; +}; + +result = Tuple.from(items, mapFn); + +assert.sameValue(result.length, 2); +assert.sameValue(result[0], firstReturnVal); +assert.sameValue(result[1], secondReturnVal); + diff --git a/test/staging/sm/Tuple/from/iter-map-fn-this-arg.js b/test/staging/sm/Tuple/from/iter-map-fn-this-arg.js new file mode 100644 index 0000000000..aab6900965 --- /dev/null +++ b/test/staging/sm/Tuple/from/iter-map-fn-this-arg.js @@ -0,0 +1,49 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +features: +- record-tuple +description: | + pending +esid: pending +---*/ + +var thisVals = []; +var nextResult = { + done: false, + value: {} +}; +var nextNextResult = { + done: false, + value: {} +}; +var mapFn = function() { + thisVals.push(this); +}; +var items = {}; +var thisVal = {}; + +items[Symbol.iterator] = function() { + return { + next: function() { + var result = nextResult; + nextResult = nextNextResult; + nextNextResult = { + done: true + }; + + return result; + } + }; +}; + +Tuple.from(items, mapFn, thisVal); + +assert.sameValue(thisVals.length, 2); +assert.sameValue(thisVals[0], thisVal); +assert.sameValue(thisVals[1], thisVal); + diff --git a/test/staging/sm/Tuple/from/iter-map-fn-this-non-strict.js b/test/staging/sm/Tuple/from/iter-map-fn-this-non-strict.js new file mode 100644 index 0000000000..98df70a806 --- /dev/null +++ b/test/staging/sm/Tuple/from/iter-map-fn-this-non-strict.js @@ -0,0 +1,50 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +features: +- record-tuple +description: | + pending +esid: pending +---*/ +var thisVals = []; +var nextResult = { + done: false, + value: {} +}; +var nextNextResult = { + done: false, + value: {} +}; +var mapFn = function() { + thisVals.push(this); +}; +var items = {}; +var global = function() { + return this; +}(); + +items[Symbol.iterator] = function() { + return { + next: function() { + var result = nextResult; + nextResult = nextNextResult; + nextNextResult = { + done: true + }; + + return result; + } + }; +}; + +Tuple.from(items, mapFn); + +assert.sameValue(thisVals.length, 2); +assert.sameValue(thisVals[0], global); +assert.sameValue(thisVals[1], global); + diff --git a/test/staging/sm/Tuple/from/iter-map-fn-this-strict-strict.js b/test/staging/sm/Tuple/from/iter-map-fn-this-strict-strict.js new file mode 100644 index 0000000000..3c95b123fa --- /dev/null +++ b/test/staging/sm/Tuple/from/iter-map-fn-this-strict-strict.js @@ -0,0 +1,48 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +flags: +- onlyStrict +includes: [sm/non262-shell.js, sm/non262.js] +features: +- record-tuple +description: | + pending +esid: pending +---*/ +'use strict'; +var thisVals = []; +var nextResult = { + done: false, + value: {} +}; +var nextNextResult = { + done: false, + value: {} +}; +var mapFn = function() { + thisVals.push(this); +}; +var items = {}; + +items[Symbol.iterator] = function() { + return { + next: function() { + var result = nextResult; + nextResult = nextNextResult; + nextNextResult = { + done: true + }; + + return result; + } + }; +}; + +Tuple.from(items, mapFn); + +assert.sameValue(thisVals.length, 2); +assert.sameValue(thisVals[0], undefined); +assert.sameValue(thisVals[1], undefined); + diff --git a/test/staging/sm/Tuple/from/iter-next-error.js b/test/staging/sm/Tuple/from/iter-next-error.js new file mode 100644 index 0000000000..786688f421 --- /dev/null +++ b/test/staging/sm/Tuple/from/iter-next-error.js @@ -0,0 +1,29 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +features: +- record-tuple +description: | + pending +esid: pending +---*/ +/* Step 6b. */ +/* AddEntriesFromIterable should throw if next() throws */ + +var iter = {}; +iter[Symbol.iterator] = function() { + return { + next: function() { + throw new SyntaxError(); + } + }; +}; + +assertThrowsInstanceOf(function() { + Tuple.from(iter); +}, SyntaxError, "from() should throw if next() throws"); + diff --git a/test/staging/sm/Tuple/from/iter-next-value-error.js b/test/staging/sm/Tuple/from/iter-next-value-error.js new file mode 100644 index 0000000000..a842fb96f3 --- /dev/null +++ b/test/staging/sm/Tuple/from/iter-next-value-error.js @@ -0,0 +1,36 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +features: +- record-tuple +description: | + pending +esid: pending +---*/ +/* Step 6b. */ +/* AddEntriesFromIterable should throw if next() throws */ + +var iter = {}; +iter[Symbol.iterator] = function() { + return { + next: function() { + var result = {}; + Object.defineProperty(result, 'value', { + get: function() { + throw new SyntaxError(); + } + }); + + return result; + } + }; +}; + +assertThrowsInstanceOf(function() { + Tuple.from(iter); +}, SyntaxError, "from() should throw if next() returns value that throws"); + diff --git a/test/staging/sm/Tuple/from/iter-set-elem-prop.js b/test/staging/sm/Tuple/from/iter-set-elem-prop.js new file mode 100644 index 0000000000..fe8b441426 --- /dev/null +++ b/test/staging/sm/Tuple/from/iter-set-elem-prop.js @@ -0,0 +1,48 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +features: +- record-tuple +description: | + pending +esid: pending +---*/ +var items = {}; +var firstIterResult = { + done: false, + value: 1 +}; +var secondIterResult = { + done: false, + value: 2 +}; +var thirdIterResult = { + done: true, + value: 3 +}; +var nextIterResult = firstIterResult; +var nextNextIterResult = secondIterResult; +var result; + +items[Symbol.iterator] = function() { + return { + next: function() { + var result = nextIterResult; + + nextIterResult = nextNextIterResult; + nextNextIterResult = thirdIterResult; + + return result; + } + }; +}; + +result = Tuple.from(items); + +assert.sameValue(result[0], firstIterResult.value); +assert.sameValue(result[1], secondIterResult.value); + diff --git a/test/staging/sm/Tuple/from/iter-set-length.js b/test/staging/sm/Tuple/from/iter-set-length.js new file mode 100644 index 0000000000..dc18f58fba --- /dev/null +++ b/test/staging/sm/Tuple/from/iter-set-length.js @@ -0,0 +1,42 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +features: +- record-tuple +description: | + pending +esid: pending +---*/ +var items = {}; +var result, nextIterResult, lastIterResult; +items[Symbol.iterator] = function() { + return { + next: function() { + var result = nextIterResult; + nextIterResult = lastIterResult; + return result; + } + }; +}; + +nextIterResult = lastIterResult = { + done: true +}; +result = Tuple.from(items); + +assert.sameValue(result.length, 0); + +nextIterResult = { + done: false +}; +lastIterResult = { + done: true +}; +result = Tuple.from(items); + +assert.sameValue(result.length, 1); + diff --git a/test/staging/sm/Tuple/from/length.js b/test/staging/sm/Tuple/from/length.js new file mode 100644 index 0000000000..2b50e3bb99 --- /dev/null +++ b/test/staging/sm/Tuple/from/length.js @@ -0,0 +1,25 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +features: +- record-tuple +description: | + pending +esid: pending +---*/ +var desc = Object.getOwnPropertyDescriptor(Tuple.from, "length"); +assert.sameValue(desc.value, 1); +assert.sameValue(desc.writable, false); +assert.sameValue(desc.enumerable, false); +assert.sameValue(desc.configurable, true); + +assert.sameValue(isConstructor(Tuple.from), false); + +assertThrowsInstanceOf(() => { + new Tuple.from([]); +}, TypeError, '`new Tuple.from()` throws TypeError'); + diff --git a/test/staging/sm/Tuple/from/mapfn-is-not-callable-typeerror.js b/test/staging/sm/Tuple/from/mapfn-is-not-callable-typeerror.js new file mode 100644 index 0000000000..24cc5bdbbf --- /dev/null +++ b/test/staging/sm/Tuple/from/mapfn-is-not-callable-typeerror.js @@ -0,0 +1,26 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +features: +- record-tuple +description: | + pending +esid: pending +---*/ +let vals = [[null, "null"], + [{}, "{}"], + ['string', "\'string\'"], + [true, "true"], + [42, "42"], + [Symbol('1'), "Symbol(\'1\')"]]; + +for (p of vals) { + let mapfn = p[0]; + assertThrowsInstanceOf(() => Tuple.from([], mapfn), + TypeError, 'Tuple.from([],' + p[1] + ' should throw'); +} + diff --git a/test/staging/sm/Tuple/from/mapfn-throws-exception.js b/test/staging/sm/Tuple/from/mapfn-throws-exception.js new file mode 100644 index 0000000000..feeff4f553 --- /dev/null +++ b/test/staging/sm/Tuple/from/mapfn-throws-exception.js @@ -0,0 +1,23 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +features: +- record-tuple +description: | + pending +esid: pending +---*/ +var array = [2, 4, 8, 16, 32, 64, 128]; + +function mapFnThrows(value, index, obj) { + throw new RangeError(); +} + +assertThrowsInstanceOf(function() { + Tuple.from(array, mapFnThrows); +}, RangeError, 'Tuple.from(array, mapFnThrows) throws'); + diff --git a/test/staging/sm/Tuple/from/name.js b/test/staging/sm/Tuple/from/name.js new file mode 100644 index 0000000000..7358be8f0a --- /dev/null +++ b/test/staging/sm/Tuple/from/name.js @@ -0,0 +1,20 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +features: +- record-tuple +description: | + pending +esid: pending +---*/ + +desc = Object.getOwnPropertyDescriptor(Tuple.from, "name"); +assert.sameValue(desc.value, "from"); +assert.sameValue(desc.writable, false); +assert.sameValue(desc.enumerable, false); +assert.sameValue(desc.configurable, true); + diff --git a/test/staging/sm/Tuple/from/not-a-constructor.js b/test/staging/sm/Tuple/from/not-a-constructor.js new file mode 100644 index 0000000000..333142eee8 --- /dev/null +++ b/test/staging/sm/Tuple/from/not-a-constructor.js @@ -0,0 +1,20 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +features: +- record-tuple +description: | + pending +esid: pending +---*/ +assert.sameValue(isConstructor(Tuple.from), false); + +assertThrowsInstanceOf(() => { + new Tuple.from([]); +}, TypeError, 'new Tuple.from([]) throws a TypeError exception'); + + diff --git a/test/staging/sm/Tuple/from/prop-desc.js b/test/staging/sm/Tuple/from/prop-desc.js new file mode 100644 index 0000000000..a80cf16de1 --- /dev/null +++ b/test/staging/sm/Tuple/from/prop-desc.js @@ -0,0 +1,20 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +features: +- record-tuple +description: | + pending +esid: pending +---*/ + +var desc = Object.getOwnPropertyDescriptor(Tuple, "from"); +assert.sameValue(desc.value, Tuple.from); +assert.sameValue(desc.writable, true); +assert.sameValue(desc.enumerable, false); +assert.sameValue(desc.configurable, true); + diff --git a/test/staging/sm/Tuple/from/source-array-boundary.js b/test/staging/sm/Tuple/from/source-array-boundary.js new file mode 100644 index 0000000000..e6ea9777f0 --- /dev/null +++ b/test/staging/sm/Tuple/from/source-array-boundary.js @@ -0,0 +1,32 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +features: +- record-tuple +description: | + pending +esid: pending +---*/ +var array = [Number.MAX_VALUE, Number.MIN_VALUE, Number.NaN, Number.NEGATIVE_INFINITY, Number.POSITIVE_INFINITY]; +var arrayIndex = -1; + +function mapFn(value, index) { + this.arrayIndex++; + assert.sameValue(value, array[this.arrayIndex]); + assert.sameValue(index, this.arrayIndex); + return value; +} + +var t = Tuple.from(array, mapFn, this); + +assert.sameValue(t.length, array.length); +assert.sameValue(t[0], Number.MAX_VALUE); +assert.sameValue(t[1], Number.MIN_VALUE); +assert.sameValue(t[2], Number.NaN); +assert.sameValue(t[3], Number.NEGATIVE_INFINITY); +assert.sameValue(t[4], Number.POSITIVE_INFINITY); + diff --git a/test/staging/sm/Tuple/from/source-object-iterator-1.js b/test/staging/sm/Tuple/from/source-object-iterator-1.js new file mode 100644 index 0000000000..a14aa41392 --- /dev/null +++ b/test/staging/sm/Tuple/from/source-object-iterator-1.js @@ -0,0 +1,36 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +features: +- record-tuple +description: | + pending +esid: pending +---*/ +var array = [2, 4, 8, 16, 32, 64, 128]; +var obj = { + [Symbol.iterator]() { + return { + index: 0, + next() { + throw new RangeError(); + }, + isDone: false, + get val() { + this.index++; + if (this.index > 7) { + this.isDone = true; + } + return 1 << this.index; + } + }; + } +}; +assertThrowsInstanceOf(function() { + Tuple.from(obj); +}, RangeError, 'Tuple.from(obj) throws'); + diff --git a/test/staging/sm/Tuple/from/source-object-length.js b/test/staging/sm/Tuple/from/source-object-length.js new file mode 100644 index 0000000000..9785a9ec21 --- /dev/null +++ b/test/staging/sm/Tuple/from/source-object-length.js @@ -0,0 +1,26 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +features: +- record-tuple +description: | + pending +esid: pending +---*/ +var array = [2, 4, 0, 16]; +var expectedTuple = #[2, 4, undefined, 16]; +var obj = { + length: 4, + 0: 2, + 1: 4, + 2: 0, + 3: 16 +}; +delete obj[2]; +let t = Tuple.from(obj); +assert.sameValue(t, expectedTuple); + diff --git a/test/staging/sm/Tuple/from/source-object-without.js b/test/staging/sm/Tuple/from/source-object-without.js new file mode 100644 index 0000000000..dcdd7e92db --- /dev/null +++ b/test/staging/sm/Tuple/from/source-object-without.js @@ -0,0 +1,24 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +features: +- record-tuple +description: | + pending +esid: pending +---*/ + +var obj = { + 0: 2, + 1: 4, + 2: 8, + 3: 16 +} + +var t = Tuple.from(obj); +assert.sameValue(t.length, 0); + diff --git a/test/staging/sm/Tuple/from/this-null.js b/test/staging/sm/Tuple/from/this-null.js new file mode 100644 index 0000000000..8b79cc16ec --- /dev/null +++ b/test/staging/sm/Tuple/from/this-null.js @@ -0,0 +1,25 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +features: +- record-tuple +description: | + pending +esid: pending +---*/ + +// this = null or undefined should not throw +var result = Tuple.from.call(null, #[]); + +assert.sameValue(result, #[]); +result = Tuple.from.call(undefined, #[]); +assert.sameValue(result, #[]); +result = Tuple.from.call({}, #[]); +assert.sameValue(result, #[]); +result = Tuple.from.call(5, #[]); +assert.sameValue(result, #[]); + diff --git a/test/staging/sm/Tuple/gc.js b/test/staging/sm/Tuple/gc.js new file mode 100644 index 0000000000..359ae510b6 --- /dev/null +++ b/test/staging/sm/Tuple/gc.js @@ -0,0 +1,25 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +features: +- record-tuple +description: | + pending +esid: pending +---*/ + +// Test that objects (in this case, closures) containing Tuples are traced properly +function foo() { + var tup = #[1]; + (() => assert.sameValue(tup, #[1]))(); +} + +let n = 1000; +for (i = 0; i < n; i++) { + foo(); +} + diff --git a/test/staging/sm/Tuple/initializers/6.1.2.1.js b/test/staging/sm/Tuple/initializers/6.1.2.1.js new file mode 100644 index 0000000000..0c755fda0e --- /dev/null +++ b/test/staging/sm/Tuple/initializers/6.1.2.1.js @@ -0,0 +1,138 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +features: +- record-tuple +description: | + pending +esid: pending +---*/ +/* +TupleElementList : AssignmentExpression +1. Let initResult be the result of evaluating AssignmentExpression. +2. Let initValue be ? GetValue(initResult). +3. Return ? AddValueToTupleSequenceList(sequence, value). +*/ + +var a = 5; +var b = 10; +var arr = [1,2,3,4,5]; +var badArr = [1, new Object(), 3]; +var t = #[a < b ? "x" : "y"]; +assert.sameValue(t, #["x"]); + +t = #[0 in arr, 42 in arr, 1 in arr, 100 in arr]; +assert.sameValue(t, #[true, false, true, false]); + +t = #[a = 1, b = b * 3]; +assert.sameValue(t, #[1, 30]); +assert.sameValue(a, 1); +assert.sameValue(b, 30); + +/* 6.1.2.1 +TupleElementList : AssignmentExpression + ... + 2. Let initValue be ? GetValue(initResult). + ... + 6.2.4.5 GetValue ( V ) + The abstract operation GetValue takes argument V. It performs the following steps when called: + + 1. ReturnIfAbrupt(V). +*/ +let bBefore = b; +let tBefore = t; +function f() { throw new RangeError(); } +assertThrowsInstanceOf(() => t = #[a = 2, f(), b = 3], + RangeError, "t = #[a = 2, f(), b = 3] throws"); +assert.sameValue(a, 2); +assert.sameValue(b, bBefore); +assert.sameValue(t, tBefore); + +/* + GetValue + ... + 3. If IsUnresolvableReference(V) is true, throw a ReferenceError exception. +*/ +assertThrowsInstanceOf(() => t = #[unbound], + ReferenceError, "t = #[unbound] throws"); +assert.sameValue(t, tBefore); + +/* 6.1.2.1 +TupleElementList : AssignmentExpression + ... + 3. Return ? AddValueToTupleSequenceList(sequence, value). +*/ +assertThrowsInstanceOf(() => t = #[new Object()], + TypeError, "Object in Tuple"); +assert.sameValue(t, tBefore); +assertThrowsInstanceOf(() => t = #[{}], + TypeError, "Object in Tuple") +assert.sameValue(t, tBefore); +assertThrowsInstanceOf(() => t = #[new String("s")], + TypeError, "Object in Tuple") +assert.sameValue(t, tBefore); +assertThrowsInstanceOf(() => t = #[[1,2,3]], + TypeError, "Object in Tuple") +assert.sameValue(t, tBefore); +assertThrowsInstanceOf(() => t = #[function(x) { return x; }], + TypeError, "Object in Tuple") +assert.sameValue(t, tBefore); + +/* 6.1.2.1 + +TupleElementList : SpreadElement +1. Return the Result of performing TupleSequenceAccumulation for SpreadElement with argument sequence. +*/ +assert.sameValue(#[...arr], #[1,2,3,4,5]); +assertThrowsInstanceOf(() => #[...badArr], + TypeError, "Object in Tuple"); + +/* +TupleElementList : TupleElementList , AssignmentExpression +1. Perform TupleSequenceAccumulation for TupleElementList with argument sequence. +2. Let initResult be the result of evaluating AssignmentExpression. +3. Let initValue be ? GetValue(initResult). +4. Return ? AddValueToTupleSequenceList(sequence, value). +*/ + +assertThrowsInstanceOf(() => t = #[1, a = 5, b = new Object(), 5], + TypeError, "Object in Tuple"); +assert.sameValue(t, tBefore); + +/* TupleElementList : TupleElementList , SpreadElement +1. Perform TupleSequenceAccumulation for TupleElementList with argument sequence. +2. Return the Result of performing TupleSequenceAccumulation for SpreadElement with argument sequence. +*/ + +assert.sameValue(#["a", "b", ...arr, "c"], #["a", "b", 1, 2, 3, 4, 5, "c"]); +assertThrowsInstanceOf(() => t = #["a", "b", ...badArr, "c"], + TypeError, "Object in Tuple"); + +/* +SpreadElement : ... AssignmentExpression +1. Let spreadRef be the result of evaluating AssignmentExpression. +2. Let spreadObj be ? GetValue(spreadRef). +3. Let iteratorRecord be ? GetIterator(spreadObj). +4. Repeat, +a. Let next be ? IteratorStep(iteratorRecord). +b. If next is false, return sequence. +c. Let nextValue be ? IteratorValue(next). +d. Let completion be AddValueToTupleSequenceList(sequence, nextValue). +e. If completion is an abrupt completion, then +i. Return IteratorClose(iteratorRecord, completion). +*/ +/* Step 2 */ +assertThrowsInstanceOf(() => t = #[...unbound], + ReferenceError, "t = #[...unbound throws]"); +assert.sameValue(t, tBefore); +/* Step 3 */ +var notIterable = Symbol('c'); +assertThrowsInstanceOf(() => t = #[...notIterable], + TypeError, "t = #[...notIterable] is type error"); +/* TODO -- test other iterator cases */ + + diff --git a/test/staging/sm/Tuple/isTuple/8.2.2.1.js b/test/staging/sm/Tuple/isTuple/8.2.2.1.js new file mode 100644 index 0000000000..ca6561be4b --- /dev/null +++ b/test/staging/sm/Tuple/isTuple/8.2.2.1.js @@ -0,0 +1,65 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +features: +- record-tuple +description: | + pending +esid: pending +---*/ +/* +8.2.2 +The Tuple constructor: +... +has the following properties: +... + +8.2.2.1 Tuple.isTuple ( arg ) +The isTuple function takes one argument arg, and performs the following steps: + +1. Return ! IsTuple(arg). +*/ + +var Tuple_isTuple = Tuple.isTuple; +assert.sameValue(typeof Tuple_isTuple, "function"); + +assert.sameValue(Tuple_isTuple(), false); +assert.sameValue(Tuple_isTuple(Tuple.prototype), false); +assert.sameValue(Tuple_isTuple([]), false); +assert.sameValue(Tuple_isTuple(42), false); +assert.sameValue(Tuple_isTuple(new Number(-50)), false); +assert.sameValue(Tuple_isTuple(undefined), false); +assert.sameValue(Tuple_isTuple(true), false); +assert.sameValue(Tuple_isTuple(new Boolean(false)), false); +assert.sameValue(Tuple_isTuple("hello"), false); +assert.sameValue(Tuple_isTuple(new String("bye")), false); +assert.sameValue(Tuple_isTuple({}), false); +assert.sameValue(Tuple_isTuple(null), false); +assert.sameValue(Tuple_isTuple(new RegExp()), false); +assert.sameValue(Tuple_isTuple(JSON), false); +assert.sameValue(Tuple_isTuple(Math), false); +assert.sameValue(Tuple_isTuple(new Date()), false); +assert.sameValue(Tuple_isTuple(new SyntaxError()), false); +var arg; +function fun() { arg = arguments; }(1, 2, 3); +assert.sameValue(Tuple_isTuple(arg), false); +assert.sameValue(Tuple_isTuple(this), false); +assert.sameValue(Tuple_isTuple(function() {}), false); +var proto = Tuple.prototype; +var Con = function() {}; +Con.prototype = proto; +var child = new Con(); +assert.sameValue(Tuple_isTuple(child), false); +assert.sameValue(Tuple_isTuple({0: 1, 1: 2, length: 2}), false); + +assert.sameValue(Tuple_isTuple.call(1), false); +assert.sameValue(Tuple_isTuple.call(#[1]), false); +assert.sameValue(Tuple_isTuple.call(undefined, 1), false); +assert.sameValue(Tuple_isTuple.call(undefined, undefined), false); +assert.sameValue(Tuple_isTuple.call(undefined, #[1]), true); +assert.sameValue(Tuple_isTuple.call(undefined, Object(#[1])), true); + diff --git a/test/staging/sm/Tuple/isTuple/descriptor.js b/test/staging/sm/Tuple/isTuple/descriptor.js new file mode 100644 index 0000000000..a2fae9f92a --- /dev/null +++ b/test/staging/sm/Tuple/isTuple/descriptor.js @@ -0,0 +1,20 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +features: +- record-tuple +description: | + pending +esid: pending +---*/ + +var desc = Object.getOwnPropertyDescriptor(Tuple, "isTuple"); +assert.sameValue(desc.value, Tuple.isTuple); +assert.sameValue(desc.writable, true); +assert.sameValue(desc.enumerable, false); +assert.sameValue(desc.configurable, true); + diff --git a/test/staging/sm/Tuple/isTuple/length.js b/test/staging/sm/Tuple/isTuple/length.js new file mode 100644 index 0000000000..c5196c86f1 --- /dev/null +++ b/test/staging/sm/Tuple/isTuple/length.js @@ -0,0 +1,20 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +features: +- record-tuple +description: | + pending +esid: pending +---*/ + +desc = Object.getOwnPropertyDescriptor(Tuple.isTuple, "length"); +assert.sameValue(desc.value, 1); +assert.sameValue(desc.writable, false); +assert.sameValue(desc.enumerable, false); +assert.sameValue(desc.configurable, true); + diff --git a/test/staging/sm/Tuple/isTuple/name.js b/test/staging/sm/Tuple/isTuple/name.js new file mode 100644 index 0000000000..953db18c6d --- /dev/null +++ b/test/staging/sm/Tuple/isTuple/name.js @@ -0,0 +1,20 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +features: +- record-tuple +description: | + pending +esid: pending +---*/ + +desc = Object.getOwnPropertyDescriptor(Tuple.isTuple, "name"); +assert.sameValue(desc.value, "isTuple"); +assert.sameValue(desc.writable, false); +assert.sameValue(desc.enumerable, false); +assert.sameValue(desc.configurable, true); + diff --git a/test/staging/sm/Tuple/isTuple/not-a-constructor.js b/test/staging/sm/Tuple/isTuple/not-a-constructor.js new file mode 100644 index 0000000000..1007c426e9 --- /dev/null +++ b/test/staging/sm/Tuple/isTuple/not-a-constructor.js @@ -0,0 +1,26 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +features: +- record-tuple +description: | + pending +esid: pending +---*/ +/* 18 ECMAScript Standard Built-in Objects +... + + Built-in function objects that are not identified as constructors do not + implement the [[Construct]] internal method unless otherwise specified in + the description of a particular function. +*/ + +assert.sameValue(isConstructor(Tuple.isTuple), false); + +assertThrowsInstanceOf(() => new Tuple.isTuple(#[]), TypeError, + "new Tuple.isTuple(#[]) throws"); + diff --git a/test/staging/sm/Tuple/length-ownproperty.js b/test/staging/sm/Tuple/length-ownproperty.js new file mode 100644 index 0000000000..e023f4bbf2 --- /dev/null +++ b/test/staging/sm/Tuple/length-ownproperty.js @@ -0,0 +1,32 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +features: +- record-tuple +description: | + pending +esid: pending +---*/ +/* Tuples should have a length ownProperty that can't be overridden + * This test is expected to fail until the spec change in + * https://github.com/tc39/proposal-record-tuple/issues/282 is implemented. + */ + +/* +var desc = Object.getOwnPropertyDescriptor(#[1,2,3], "length"); +assert.sameValue(desc.value, 3); +assert.sameValue(desc.writable, false); +assert.sameValue(desc.enumerable, false); +assert.sameValue(desc.configurable, false); +Object.defineProperty(Tuple.prototype, "length", {value: 0}); +desc = Object.getOwnPropertyDescriptor(#[1,2,3], "length"); +assert.sameValue(desc.value, 3); +assert.sameValue(desc.writable, false); +assert.sameValue(desc.enumerable, false); +assert.sameValue(desc.configurable, false); +*/ + diff --git a/test/staging/sm/Tuple/literal.js b/test/staging/sm/Tuple/literal.js new file mode 100644 index 0000000000..2979331eaf --- /dev/null +++ b/test/staging/sm/Tuple/literal.js @@ -0,0 +1,43 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +features: +- record-tuple +description: | + pending +esid: pending +---*/ + +let tup = #[1, 2, 3]; + +assert.sameValue(tup.length, 3); +assert.sameValue(tup[0], 1); +assert.sameValue(tup[1], 2); +assert.sameValue(tup[2], 3); + +let arr = [3, 4, 5]; +tup = #[1, 2, ...arr, 6, ...arr]; + +assert.sameValue(tup.length, 9); +assert.sameValue(tup[0], 1); +assert.sameValue(tup[1], 2); +assert.sameValue(tup[2], 3); +assert.sameValue(tup[3], 4); +assert.sameValue(tup[4], 5); +assert.sameValue(tup[5], 6); +assert.sameValue(tup[6], 3); +assert.sameValue(tup[7], 4); +assert.sameValue(tup[8], 5); + +tup = #[(() => 1)()]; + +assert.sameValue(tup.length, 1); +assert.sameValue(tup[0], 1); + +tup = #[]; +assert.sameValue(tup.length, 0); + diff --git a/test/staging/sm/Tuple/methods.js b/test/staging/sm/Tuple/methods.js new file mode 100644 index 0000000000..c41dae50f0 --- /dev/null +++ b/test/staging/sm/Tuple/methods.js @@ -0,0 +1,565 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +features: +- record-tuple +description: | + pending +esid: pending +---*/ + +let tup = #[1,2,3]; +let tup2 = #[1,2,3]; +let empty = #[]; + +var tReversed = tup.toReversed(); +assert.sameValue(tReversed, #[3, 2, 1]); +assert.sameValue(tup, tup2); +assert.sameValue(#[].toReversed(), #[]); + + +let tup5 = #[42, 1, 5, 0, 333, 10]; +let sorted_result = tup5.toSorted(); +let expected_result = #[0, 1, 10, 333, 42, 5]; +assert.sameValue(sorted_result, expected_result); +let sorted_result2 = tup5.toSorted((x, y) => y > x); +let expected_result2 = #[333, 42, 10, 5, 1, 0]; +assert.sameValue(sorted_result2, expected_result2); + +assertThrowsInstanceOf(() => tup5.toSorted("monkeys"), + TypeError, + "invalid Array.prototype.toSorted argument") + +/* toSpliced */ +/* examples from: + https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/splice */ + +function unchanged(t) { + assert.sameValue(t, #['angel', 'clown', 'mandarin', 'sturgeon']); +} + +// Remove no elements before index 2, insert "drum" +let myFish = #['angel', 'clown', 'mandarin', 'sturgeon'] +var myFishSpliced = myFish.toSpliced(2, 0, 'drum') +unchanged(myFish); +assert.sameValue(myFishSpliced, #['angel', 'clown', 'drum', 'mandarin', 'sturgeon']); + + +// Remove no elements before index 2, insert "drum" and "guitar" +myFishSpliced = myFish.toSpliced(2, 0, 'drum', 'guitar'); +unchanged(myFish); +assert.sameValue(myFishSpliced, #['angel', 'clown', 'drum', 'guitar', 'mandarin', 'sturgeon']) + +// Remove 1 element at index 3 +let myFish1 = #['angel', 'clown', 'drum', 'mandarin', 'sturgeon']; +myFishSpliced = myFish1.toSpliced(3, 1); +assert.sameValue(myFish1, #['angel', 'clown', 'drum', 'mandarin', 'sturgeon']); +assert.sameValue(myFishSpliced, #['angel', 'clown', 'drum', 'sturgeon']); + +// Remove 1 element at index 2, and insert 'trumpet' +let myFish2 = #['angel', 'clown', 'drum', 'sturgeon'] +myFishSpliced = myFish2.toSpliced(2, 1, 'trumpet'); +assert.sameValue(myFish2, #['angel', 'clown', 'drum', 'sturgeon']); +assert.sameValue(myFishSpliced, #['angel', 'clown', 'trumpet', 'sturgeon']); + +// Remove 2 elements at index 0, and insert 'parrot', 'anemone', and 'blue' +let myFish3 = #['angel', 'clown', 'trumpet', 'sturgeon'] +myFishSpliced = myFish3.toSpliced(0, 2, 'parrot', 'anemone', 'blue'); +assert.sameValue(myFish3, #['angel', 'clown', 'trumpet', 'sturgeon']); +assert.sameValue(myFishSpliced, #['parrot', 'anemone', 'blue', 'trumpet', 'sturgeon']); + +// Remove 2 elements, starting at index 2 +let myFish4 = #['parrot', 'anemone', 'blue', 'trumpet', 'sturgeon'] +myFishSpliced = myFish4.toSpliced(2, 2); +assert.sameValue(myFish4, #['parrot', 'anemone', 'blue', 'trumpet', 'sturgeon']); +assert.sameValue(myFishSpliced, #['parrot', 'anemone', 'sturgeon']); + +// Remove 1 element from index -2 +myFishSpliced = myFish.toSpliced(-2, 1); +unchanged(myFish); +assert.sameValue(myFishSpliced, #['angel', 'clown', 'sturgeon']); + +// Remove all elements, starting from index 2 +myFishSpliced = myFish.toSpliced(2); +unchanged(myFish); +assert.sameValue(myFishSpliced, #['angel', 'clown']); + +assertThrowsInstanceOf(() => myFish.toSpliced(1, 0, new Object(42)), + TypeError, + "Record and Tuple can only contain primitive values"); + +//****************** +function concatTest(t, expected, ...args) { + let result = t.concat(...args); + assert.sameValue(result, expected); +} + +let tupConcat = tup.concat(#[4,5,6]); +assert.sameValue(tup, tup2); +assert.sameValue(tupConcat, #[1,2,3,4,5,6]); + +concatTest(tup, tup, #[]); +concatTest(empty, tup, #[1,2,3]); +concatTest(tup, #[1,2,3,1,2,3,4,5,6],1,2,3,4,5,6); +concatTest(tup, #[1,2,3,1,2,3,4,5,6],1,#[2,3,4],5,6); +concatTest(tup, #[1,2,3,1,2,3,4],[1,2,3,4]); +concatTest(tup, #[1,2,3,1,2,3,4,5,6],1,[2,3,4],5,6); +concatTest(tup, #[1,2,3,1,2,3,4,5,6],[1,2,3],[4,5,6]); +concatTest(tup, #[1,2,3,1,2,3,4,5,6],#[1,2,3],#[4,5,6]); + +// .includes() + +assert.sameValue(tup.includes(1), true); +assert.sameValue(tup.includes(2), true); +assert.sameValue(tup.includes(3), true); +assert.sameValue(empty.includes(1), false); +assert.sameValue(empty.includes(0), false); +assert.sameValue(empty.includes(0, 1), false); +assert.sameValue(tup.includes(2, 1), true); +assert.sameValue(tup.includes(2, 2), false); +assert.sameValue(tup.includes(2, -1), false); +assert.sameValue(tup.includes(2, -2), true); +assert.sameValue(tup.includes(0, Infinity), false); +assert.sameValue(tup.includes(2, -Infinity), true); +assert.sameValue(tup.includes(2, undefined), true); + +// .indexOf() +assert.sameValue(tup.indexOf(1), 0); +assert.sameValue(tup.indexOf(2), 1); +assert.sameValue(tup.indexOf(3), 2); +assert.sameValue(empty.indexOf(1), -1); +assert.sameValue(empty.indexOf(0), -1); +assert.sameValue(empty.indexOf(0, 1), -1); +assert.sameValue(tup.indexOf(2, 1), 1); +assert.sameValue(tup.indexOf(2, 2), -1); +assert.sameValue(tup.indexOf(2, -1), -1); +assert.sameValue(tup.indexOf(2, -2), 1); +assert.sameValue(tup.indexOf(0, Infinity), -1); +assert.sameValue(tup.indexOf(2, -Infinity), 1); +assert.sameValue(tup.indexOf(2, undefined), 1); + +// .join() +assert.sameValue(tup.join(), "1,2,3"); +assert.sameValue(tup.join("~"),"1~2~3"); +assert.sameValue(#[1].join(), "1"); +assert.sameValue(empty.join(), ""); +assert.sameValue(#[1,2,undefined,3].join(), "1,2,,3"); +assert.sameValue(#[1,null,2,3].join(), "1,,2,3"); + +// .lastIndexOf() +assert.sameValue(tup.lastIndexOf(1), 0); +assert.sameValue(tup.lastIndexOf(2), 1); +assert.sameValue(tup.lastIndexOf(3), 2); +assert.sameValue(empty.lastIndexOf(1), -1); +assert.sameValue(empty.lastIndexOf(0), -1); +assert.sameValue(empty.lastIndexOf(0, 1), -1); +assert.sameValue(tup.lastIndexOf(2, 1), 1); +assert.sameValue(tup.lastIndexOf(2, 0), -1); +assert.sameValue(tup.lastIndexOf(2, -3), -1); +assert.sameValue(tup.lastIndexOf(2, -2), 1); +assert.sameValue(tup.lastIndexOf(2, -Infinity), -1); +var duplicates = #[1,2,3,1,3,1,5,6,1,2,10]; +assert.sameValue(duplicates.lastIndexOf(2), 9); +assert.sameValue(duplicates.lastIndexOf(3, 2), 2); +assert.sameValue(duplicates.lastIndexOf(3, -7), 4); +assert.sameValue(duplicates.lastIndexOf(1), 8); +assert.sameValue(duplicates.lastIndexOf(1, 0), 0); +assert.sameValue(duplicates.lastIndexOf(1, -5), 5); + +// .slice() +var sliced = empty.slice(2); +assert.sameValue(empty, #[]); +assert.sameValue(empty, sliced); +sliced = empty.slice(2, 3); +assert.sameValue(empty, sliced); +sliced = tup.slice(1); +assert.sameValue(tup, tup2); +assert.sameValue(sliced, #[2,3]); +sliced = tup.slice(3); +assert.sameValue(sliced, #[]); +sliced = tup.slice(0, 0); +assert.sameValue(sliced, #[]); +sliced = tup.slice(0, 1); +assert.sameValue(sliced, #[1]); +sliced = tup.slice(0, 3); +assert.sameValue(sliced, tup); + +// .toString() +assert.sameValue(tup.toString(), "1,2,3"); +assert.sameValue(empty.toString(), ""); +assert.sameValue(#[1].toString(), "1"); +assert.sameValue(myFish.toString(), "angel,clown,mandarin,sturgeon"); + +// .toLocaleString() -- TODO more tests +assert.sameValue(tup.toString(), tup.toLocaleString()); +assert.sameValue(empty.toString(), empty.toLocaleString()); +assert.sameValue(myFish.toString(), myFish.toLocaleString()); + +// .entries() +var iterator = tup.entries(); +var result; +result = iterator.next(); +assert.sameValue(result.done, false); +assert.sameValue(result.value[0], 0); +assert.sameValue(result.value[1], 1); +assert.sameValue(result.value.length, 2); + +result = iterator.next(); +assert.sameValue(result.done, false); +assert.sameValue(result.value[0], 1); +assert.sameValue(result.value[1], 2); +assert.sameValue(result.value.length, 2); + +result = iterator.next(); +assert.sameValue(result.done, false); +assert.sameValue(result.value[0], 2); +assert.sameValue(result.value[1], 3); +assert.sameValue(result.value.length, 2); + +result = iterator.next(); +assert.sameValue(result.done, true); +assert.sameValue(result.value, undefined); + +iterator = empty.entries(); +var result1 = iterator.next(); +assert.sameValue(result1.done, true); +assert.sameValue(result1.value, undefined); + +// .every() +var everyResult = tup.every(x => x < 10); +assert.sameValue(tup, tup2); +assert.sameValue(everyResult, true); +everyResult = tup.every(x => x < 2); +assert.sameValue(everyResult, false); +assert.sameValue(true, empty.every(x => a > 100)); + +assertThrowsInstanceOf(() => tup.every(), + TypeError, + "missing argument 0 when calling function Tuple.prototype.every"); + +assertThrowsInstanceOf(() => tup.every("monkeys"), + TypeError, + "\"monkeys\" is not a function"); + +// .filter() +var filtered = tup.filter(x => x % 2 == 1); +assert.sameValue(tup, tup2); +assert.sameValue(filtered, #[1,3]); +assert.sameValue(#[].filter(x => x), #[]); + +assertThrowsInstanceOf(() => tup.filter(), + TypeError, + "missing argument 0 when calling function Tuple.prototype.filter"); + +assertThrowsInstanceOf(() => tup.filter("monkeys"), + TypeError, + "\"monkeys\" is not a function"); + +// .find() +var findResult = tup.find(x => x > 2); +assert.sameValue(tup, tup2); +assert.sameValue(findResult, 3); +assert.sameValue(#[].find(x => true), undefined); + +assertThrowsInstanceOf(() => tup.find(), + TypeError, + "missing argument 0 when calling function Tuple.prototype.find"); + +assertThrowsInstanceOf(() => tup.find("monkeys"), + TypeError, + "\"monkeys\" is not a function"); + +// .findIndex() +var findIndexResult = tup.findIndex(x => x > 2); +assert.sameValue(tup, tup2); +assert.sameValue(findIndexResult, 2); +assert.sameValue(#[].findIndex(x => true), -1); + +assertThrowsInstanceOf(() => tup.findIndex(), + TypeError, + "missing argument 0 when calling function Tuple.prototype.find"); + +assertThrowsInstanceOf(() => tup.findIndex("monkeys"), + TypeError, + "\"monkeys\" is not a function"); + + +// .forEach() +var a = 0; +var forEachResult = tup.forEach(x => a += x); +assert.sameValue(tup, tup2); +assert.sameValue(forEachResult, undefined); +assert.sameValue(a, 6); + +assert.sameValue(undefined, empty.forEach(x => a += x)); +assert.sameValue(a, 6); + +assertThrowsInstanceOf(() => tup.forEach(), + TypeError, + "missing argument 0 when calling function Tuple.prototype.forEach"); + +assertThrowsInstanceOf(() => tup.forEach("monkeys"), + TypeError, + "\"monkeys\" is not a function"); + +// .keys() +var iterator = tup.keys(); +var result; +result = iterator.next(); +assert.sameValue(result.done, false); +assert.sameValue(result.value, 0); + +result = iterator.next(); +assert.sameValue(result.done, false); +assert.sameValue(result.value, 1); + +result = iterator.next(); +assert.sameValue(result.done, false); +assert.sameValue(result.value, 2); + +result = iterator.next(); +assert.sameValue(result.done, true); +assert.sameValue(result.value, undefined); + +iterator = empty.keys(); +var result1 = iterator.next(); +assert.sameValue(result1.done, true); +assert.sameValue(result1.value, undefined); + +// .map() +var mapResult = tup.map(x => x*x); +assert.sameValue(tup, tup2); +assert.sameValue(mapResult, #[1, 4, 9]); +assert.sameValue(empty, empty.map(x => x*x)); + +assertThrowsInstanceOf(() => tup.map(x => new Object(x)), + TypeError, + "Record and Tuple can only contain primitive values"); + +assertThrowsInstanceOf(() => tup.map("monkeys"), + TypeError, + "\"monkeys\" is not a function"); + +// .reduce() +var add = (previousValue, currentValue, currentIndex, O) => + previousValue + currentValue; +var reduceResult = tup.reduce(add); +assert.sameValue(tup, tup2); +assert.sameValue(reduceResult, 6); +assert.sameValue(tup.reduce(add, 42), 48); +assert.sameValue(0, empty.reduce(add, 0)); + +assertThrowsInstanceOf(() => tup.reduce(), + TypeError, + "Tuple.prototype.reduce"); + +assertThrowsInstanceOf(() => tup.reduce("monkeys"), + TypeError, + "\"monkeys\" is not a function"); + +assertThrowsInstanceOf(() => empty.reduce(add), + TypeError, + "reduce of empty tuple with no initial value"); + +// .reduceRight() +var sub = (previousValue, currentValue, currentIndex, O) => + previousValue - currentValue; +var reduceResult = tup.reduceRight(sub); +assert.sameValue(tup, tup2); +assert.sameValue(reduceResult, 0); +assert.sameValue(tup.reduceRight(sub, 42), 36); +assert.sameValue(0, empty.reduceRight(sub, 0)); + +assertThrowsInstanceOf(() => tup.reduceRight(), + TypeError, + "Tuple.prototype.reduceRight"); + +assertThrowsInstanceOf(() => tup.reduceRight("monkeys"), + TypeError, + "\"monkeys\" is not a function"); + +assertThrowsInstanceOf(() => empty.reduceRight(sub), + TypeError, + "reduce of empty tuple with no initial value"); + +// .some() +var truePred = x => x % 2 == 0; +var falsePred = x => x > 30; +var trueResult = tup.some(truePred); +assert.sameValue(tup, tup2); +assert.sameValue(trueResult, true); +var falseResult = tup.some(falsePred); +assert.sameValue(falseResult, false); +assert.sameValue(false, empty.some(truePred)); + +assertThrowsInstanceOf(() => tup.some(), + TypeError, + "Tuple.prototype.some"); + +assertThrowsInstanceOf(() => tup.some("monkeys"), + TypeError, + "\"monkeys\" is not a function"); + +// .values() +var iterator = tup.values(); +var result; +result = iterator.next(); +assert.sameValue(result.done, false); +assert.sameValue(result.value, 1); + +result = iterator.next(); +assert.sameValue(result.done, false); +assert.sameValue(result.value, 2); + +result = iterator.next(); +assert.sameValue(result.done, false); +assert.sameValue(result.value, 3); + +result = iterator.next(); +assert.sameValue(result.done, true); +assert.sameValue(result.value, undefined); + +iterator = empty.values(); +var result1 = iterator.next(); +assert.sameValue(result1.done, true); +assert.sameValue(result1.value, undefined); + +// @@iterator + +var iterator = tup[Symbol.iterator](tup); +var result; +result = iterator.next(); +assert.sameValue(result.done, false); +assert.sameValue(result.value, 1); + +result = iterator.next(); +assert.sameValue(result.done, false); +assert.sameValue(result.value, 2); + +result = iterator.next(); +assert.sameValue(result.done, false); +assert.sameValue(result.value, 3); + +result = iterator.next(); +assert.sameValue(result.done, true); +assert.sameValue(result.value, undefined); + +iterator = empty[Symbol.iterator](empty); +var result1 = iterator.next(); +assert.sameValue(result1.done, true); +assert.sameValue(result1.value, undefined); + +// @@toStringTag + +assert.sameValue(tup[Symbol.toStringTag], "Tuple"); +assert.sameValue(Object(#[1,2,3])[Symbol.toStringTag], "Tuple"); + +// length +assert.sameValue(tup.length, 3); +assert.sameValue(Object(#[1,2,3]).length, 3); +assert.sameValue(empty.length, 0); +assert.sameValue(Object(#[]).length, 0); + +// .flat() +var toFlatten = #[#[1,2],#[3,#[4,5]],#[6],#[7,8,#[9,#[10,#[11,12]]]]]; +var toFlatten2 = #[#[1,2],#[3,#[4,5]],#[6],#[7,8,#[9,#[10,#[11,12]]]]]; +assert.sameValue(toFlatten.flat(10), #[1,2,3,4,5,6,7,8,9,10,11,12]); +assert.sameValue(toFlatten, toFlatten2); +assert.sameValue(tup.flat(), tup); +assert.sameValue(empty.flat(), empty); +assert.sameValue(toFlatten.flat(2), #[1,2,3,4,5,6,7,8,9,#[10,#[11,12]]]); +assert.sameValue(toFlatten.flat(), #[1,2,3,#[4,5],6,7,8,#[9,#[10,#[11,12]]]]); + +// .flatMap() +var inc = (x, sourceIndex, source) => #[x, x+1]; +var toFlatten0 = #[1, 2, 3]; +assert.sameValue(toFlatten0.flatMap(inc), #[1, 2, 2, 3, 3, 4]); +assert.sameValue(empty.flatMap(inc), empty); + +// miscellaneous + +let nullaryMethods = [[Tuple.prototype.toReversed, x => x === #[1,2,3]], + [Tuple.prototype.toSorted, x => x === #[1,2,3]], + [Tuple.prototype.toString, x => x === "3,2,1"], + [Tuple.prototype.toLocaleString, x => x === "3,2,1"], + [Tuple.prototype.join, x => x === "3,2,1"], + [Tuple.prototype.entries, x => typeof(x) === "object"], + [Tuple.prototype.keys, x => typeof(x) === "object"], + [Tuple.prototype.values, x => typeof(x) === "object"], + [Tuple.prototype.flat, x => x === #[3,2,1]]]; + +for (p of nullaryMethods) { + let method = p[0]; + let f = p[1]; + assert.sameValue(f(method.call(Object(#[3,2,1]))), true); +} + +function assertTypeError(f) { + for (thisVal of ["monkeys", [3,2,1], null, undefined, 0]) { + assertThrowsInstanceOf(f(thisVal), TypeError, "value of TupleObject must be a Tuple"); + } +} + +assertTypeError(x => (() => Tuple.prototype.toSorted.call(x))); + +assert.sameValue(Tuple.prototype.toSpliced.call(Object(myFish), 2, 0, 'drum'), + #['angel', 'clown', 'drum', 'mandarin', 'sturgeon']); +assertTypeError(thisVal => (() => Tuple.prototype.toSpliced.call(thisVal, 2, 0, 'drum'))); + +assert.sameValue(Tuple.prototype.concat.call(Object(#[1,2,3]), 1,2,3,4,5,6), #[1,2,3,1,2,3,4,5,6]); +assert.sameValue(Tuple.prototype.concat.call(Object(#[1,2,3]), 1,2,Object(#[3,4]),5,6), #[1,2,3,1,2,3,4,5,6]); +assertTypeError(thisVal => (() => Tuple.prototype.concat.call(thisVal, 1, 2, 3, 4))); + +assert.sameValue(Tuple.prototype.includes.call(Object(#[1,2,3]), 1), true); +assertTypeError(thisVal => (() => Tuple.prototype.concat.includes(thisVal, 1))); + +assert.sameValue(Tuple.prototype.indexOf.call(Object(#[1,2,3]), 1), 0); +assertTypeError(thisVal => (() => Tuple.prototype.indexOf.call(thisVal, 0))); + +assert.sameValue(Tuple.prototype.lastIndexOf.call(Object(#[1,2,3]), 1), 0); +assertTypeError(thisVal => (() => Tuple.prototype.lastIndexOf.call(thisVal, 0))); + +assert.sameValue(Tuple.prototype.slice.call(Object(#[1,2,3]), 1), #[2,3]); +assertTypeError(thisVal => (() => Tuple.prototype.slice.call(thisVal, 0))); + +var pred = x => x > 2; + +assert.sameValue(Tuple.prototype.every.call(Object(#[1,2,3]), pred), false); +assertTypeError(thisVal => (() => Tuple.prototype.every.call(thisVal, pred))); + +assert.sameValue(Tuple.prototype.filter.call(Object(#[1,2,3]), pred), #[3]); +assertTypeError(thisVal => (() => Tuple.prototype.filter.call(thisVal, pred))); + +assert.sameValue(Tuple.prototype.find.call(Object(#[1,2,3]), pred), 3); +assertTypeError(thisVal => (() => Tuple.prototype.find.call(thisVal, pred))); + +assert.sameValue(Tuple.prototype.findIndex.call(Object(#[1,2,3]), pred), 2); +assertTypeError(thisVal => (() => Tuple.prototype.findIndex.call(thisVal, pred))); + +assert.sameValue(Tuple.prototype.some.call(Object(#[1,2,3]), pred), true); +assertTypeError(thisVal => (() => Tuple.prototype.some.call(thisVal, pred))); + +var a = 0; +var f = (x => a += x); +assert.sameValue(Tuple.prototype.forEach.call(Object(#[1,2,3]), f), undefined); +assert.sameValue(a, 6); +assertTypeError(thisVal => (() => Tuple.prototype.forEach.call(thisVal, f))); + +f = (x => x+1); +assert.sameValue(Tuple.prototype.map.call(Object(#[1,2,3]), f), #[2,3,4]); +assertTypeError(thisVal => (() => Tuple.prototype.map.call(thisVal, f))); + +f = (x => #[x,x+1]); +assert.sameValue(Tuple.prototype.flatMap.call(Object(#[1,2,3]), f), #[1,2,2,3,3,4]); +assertTypeError(thisVal => (() => Tuple.prototype.flatMap.call(thisVal, f))); + +assert.sameValue(Tuple.prototype.reduce.call(Object(#[1,2,3]), add), 6); +assertTypeError(thisVal => (() => Tuple.prototype.reduce.call(thisVal, add))); + +assert.sameValue(Tuple.prototype.reduceRight.call(Object(#[1,2,3]), sub), 0); +assertTypeError(thisVal => (() => Tuple.prototype.reduce.call(thisVal, sub))); + diff --git a/test/staging/sm/Tuple/of/length.js b/test/staging/sm/Tuple/of/length.js new file mode 100644 index 0000000000..baa0f52ded --- /dev/null +++ b/test/staging/sm/Tuple/of/length.js @@ -0,0 +1,31 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +features: +- record-tuple +description: | + pending +esid: pending +---*/ +var desc = Object.getOwnPropertyDescriptor(Tuple.of, "length"); +assert.sameValue(desc.value, 0); +assert.sameValue(desc.writable, false); +assert.sameValue(desc.enumerable, false); +assert.sameValue(desc.configurable, true); + +desc = Object.getOwnPropertyDescriptor(Tuple.of, "name"); +assert.sameValue(desc.value, "of"); +assert.sameValue(desc.writable, false); +assert.sameValue(desc.enumerable, false); +assert.sameValue(desc.configurable, true); + +assert.sameValue(isConstructor(Tuple.of), false); + +assertThrowsInstanceOf(() => { + new Tuple.of(1, 2, 3); +}, TypeError, '`new Tuple.of(1, 2, 3)` throws TypeError'); + diff --git a/test/staging/sm/Tuple/of/name.js b/test/staging/sm/Tuple/of/name.js new file mode 100644 index 0000000000..e778d7d588 --- /dev/null +++ b/test/staging/sm/Tuple/of/name.js @@ -0,0 +1,20 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +features: +- record-tuple +description: | + pending +esid: pending +---*/ + +var desc = Object.getOwnPropertyDescriptor(Tuple.of, "name"); +assert.sameValue(desc.value, "of"); +assert.sameValue(desc.writable, false); +assert.sameValue(desc.enumerable, false); +assert.sameValue(desc.configurable, true); + diff --git a/test/staging/sm/Tuple/of/not-a-constructor.js b/test/staging/sm/Tuple/of/not-a-constructor.js new file mode 100644 index 0000000000..4c8c8b609b --- /dev/null +++ b/test/staging/sm/Tuple/of/not-a-constructor.js @@ -0,0 +1,20 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +features: +- record-tuple +description: | + pending +esid: pending +---*/ + +assert.sameValue(isConstructor(Tuple.of), false); + +assertThrowsInstanceOf(() => { + new Tuple.of(1, 2, 3); +}, TypeError, '`new Tuple.of(1, 2, 3)` throws TypeError'); + diff --git a/test/staging/sm/Tuple/of/of.js b/test/staging/sm/Tuple/of/of.js new file mode 100644 index 0000000000..58e9870fad --- /dev/null +++ b/test/staging/sm/Tuple/of/of.js @@ -0,0 +1,40 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +features: +- record-tuple +description: | + pending +esid: pending +---*/ +/* +8.2.2.3 Tuple.of ( ...items ) +The of method takes any number of arguments, and performs the following steps: + +1. Let items be the List of arguments passed to this function. +2. For each element e of items, +a. If Type(e) is Object, throw a TypeError exception. +3. Let tuple be a new Tuple value whose [[Sequence]] is items. +4. Return tuple. +*/ + +assert.sameValue(Tuple.of(), #[]); +assert.sameValue(Tuple.of(undefined), #[undefined]); +assert.sameValue(Tuple.of(null), #[null]); +assert.sameValue(Tuple.of(1), #[1]); +assert.sameValue(Tuple.of(1, 2), #[1,2]); +assert.sameValue(Tuple.of(true, 5, "monkeys", #[3, 4]), #[true, 5, "monkeys", #[3, 4]]); +assert.sameValue(Tuple.of(undefined, false, null, undefined), #[undefined, false, null, undefined]); + +/* Step 2a. */ +assertThrowsInstanceOf(() => Tuple.of([1, 2, 3]), TypeError, + "Tuple can't contain Object"); +assertThrowsInstanceOf(() => Tuple.of([]), TypeError, + "Tuple can't contain Object"); +assertThrowsInstanceOf(() => Tuple.of(new Object(), [1, 2, 3], new String("a")), TypeError, + "Tuple can't contain Object"); + diff --git a/test/staging/sm/Tuple/of/prop-desc.js b/test/staging/sm/Tuple/of/prop-desc.js new file mode 100644 index 0000000000..55d65a50d3 --- /dev/null +++ b/test/staging/sm/Tuple/of/prop-desc.js @@ -0,0 +1,20 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +features: +- record-tuple +description: | + pending +esid: pending +---*/ + +var desc = Object.getOwnPropertyDescriptor(Tuple, "of"); +assert.sameValue(desc.value, Tuple.of); +assert.sameValue(desc.writable, true); +assert.sameValue(desc.enumerable, false); +assert.sameValue(desc.configurable, true); + diff --git a/test/staging/sm/Tuple/property-descriptors.js b/test/staging/sm/Tuple/property-descriptors.js new file mode 100644 index 0000000000..55c9b5f31a --- /dev/null +++ b/test/staging/sm/Tuple/property-descriptors.js @@ -0,0 +1,102 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +features: +- record-tuple +description: | + pending +esid: pending +---*/ + +var tup = Tuple(1, 2, 3); +var tupO = Object(tup); + +var desc = Object.getOwnPropertyDescriptor(tupO, "0"); +assert.sameValue(desc.value, 1); +assert.sameValue(desc.writable, false); +assert.sameValue(desc.enumerable, true); +assert.sameValue(desc.configurable, false); + +assert.sameValue(Object.getOwnPropertyDescriptor(tupO, "3"), undefined); +assert.sameValue(Object.getOwnPropertyDescriptor(tupO, "w"), undefined); +assert.sameValue(Object.getOwnPropertyDescriptor(tupO, "length"), undefined); + +assertThrowsInstanceOf( + () => Object.defineProperty(tup, "0", { value: 1 }), + TypeError, + "#[1, 2, 3] is not a non-null object" +); + +assertThrowsInstanceOf( + () => Object.defineProperty(tupO, "b", {}), + TypeError, + 'can\'t define property "b": tuple is not extensible' +); + +assertThrowsInstanceOf( + () => Object.defineProperty(tupO, "3", {}), + TypeError, + 'can\'t define property "3": tuple is not extensible' +); + +assertThrowsInstanceOf( + () => Object.defineProperty(tupO, Symbol(), {}), + TypeError, + 'can\'t define property "Symbol()": tuple is not extensible' +); + +assertThrowsInstanceOf( + () => Object.defineProperty(tupO, "0", { value: 2 }), + TypeError, + '"0" is read-only' +); + +Object.defineProperty(tupO, "0", { value: 1 }); + +assertThrowsInstanceOf( + () => Object.defineProperty(tupO, "0", { value: 1, writable: true }), + TypeError, + "Invalid tuple property descriptor" +); + +assertThrowsInstanceOf( + () => Object.defineProperty(tupO, "0", { value: 1, enumerable: false }), + TypeError, + "Invalid tuple property descriptor" +); + +assertThrowsInstanceOf( + () => Object.defineProperty(tupO, "0", { value: 1, configurable: true }), + TypeError, + "Invalid tuple property descriptor" +); + +assert.sameValue(Object.prototype.propertyIsEnumerable.call(tupO, "0"), true); +assert.sameValue(Object.prototype.propertyIsEnumerable.call(tupO, "0"), true); +assert.sameValue(Object.prototype.propertyIsEnumerable.call(tupO, "w"), false); +assert.sameValue(Object.prototype.propertyIsEnumerable.call(tupO, "w"), false); +assert.sameValue(Object.prototype.propertyIsEnumerable.call(tupO, "3"), false); +assert.sameValue(Object.prototype.propertyIsEnumerable.call(tupO, "3"), false); + +assert.sameValue(Object.prototype.hasOwnProperty.call(tupO, "0"), true); +assert.sameValue(Object.prototype.hasOwnProperty.call(tupO, "0"), true); +assert.sameValue(Object.prototype.hasOwnProperty.call(tupO, "w"), false); +assert.sameValue(Object.prototype.hasOwnProperty.call(tupO, "w"), false); +assert.sameValue(Object.prototype.hasOwnProperty.call(tupO, "3"), false); +assert.sameValue(Object.prototype.hasOwnProperty.call(tupO, "3"), false); + +assert.sameValue("0" in tupO, true); +assert.sameValue("w" in tupO, false); +assert.sameValue("3" in tupO, false); + +assert.sameValue(delete tupO[0], false); +assert.sameValue(delete tupO[0], false); +assert.sameValue(delete tupO.w, true); +assert.sameValue(delete tupO.w, true); +assert.sameValue(delete tupO[3], true); +assert.sameValue(delete tupO[3], true); + diff --git a/test/staging/sm/Tuple/proto-override.js b/test/staging/sm/Tuple/proto-override.js new file mode 100644 index 0000000000..bd666005b1 --- /dev/null +++ b/test/staging/sm/Tuple/proto-override.js @@ -0,0 +1,24 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +features: +- record-tuple +description: | + pending +esid: pending +---*/ + +//CHECK#1 +Tuple.prototype.toString = Object.prototype.toString; +var x = Tuple(); +assert.sameValue(x.toString(), "[object Tuple]"); + +//CHECK#2 +Tuple.prototype.toString = Object.prototype.toString; +var x = Tuple(0, 1, 2); +assert.sameValue(x.toString(), "[object Tuple]"); + diff --git a/test/staging/sm/Tuple/prototype/Symbol.toStringTag/invoked-as-accessor.js b/test/staging/sm/Tuple/prototype/Symbol.toStringTag/invoked-as-accessor.js new file mode 100644 index 0000000000..275a982ef9 --- /dev/null +++ b/test/staging/sm/Tuple/prototype/Symbol.toStringTag/invoked-as-accessor.js @@ -0,0 +1,24 @@ +// Copyright (C) 2016 the V8 project authors. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. +/*--- +esid: sec-get-%Tuple%.prototype-@@tostringtag +info: | + 8.2.3.4 %Tuple%.prototype [ @@toStringTag ] + + The initial value of Tuple.prototype[@@toStringTag] is the String value "Tuple". + + This property has the attributes { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: true }. +features: +- Symbol.toStringTag +- record-tuple +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +---*/ + +var TuplePrototype = Tuple.prototype; + +assert.sameValue(TuplePrototype[Symbol.toStringTag], "Tuple"); + diff --git a/test/staging/sm/Tuple/prototype/Symbol.toStringTag/length.js b/test/staging/sm/Tuple/prototype/Symbol.toStringTag/length.js new file mode 100644 index 0000000000..a8cf4b3a2b --- /dev/null +++ b/test/staging/sm/Tuple/prototype/Symbol.toStringTag/length.js @@ -0,0 +1,22 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +features: +- record-tuple +description: | + pending +esid: pending +---*/ + +var desc = Object.getOwnPropertyDescriptor(Tuple.prototype, Symbol.toStringTag); + +assert.sameValue(desc.length, undefined); + +assert.sameValue(desc.writable, false); +assert.sameValue(desc.enumerable, false); +assert.sameValue(desc.configurable, true); + diff --git a/test/staging/sm/Tuple/prototype/Symbol.toStringTag/name.js b/test/staging/sm/Tuple/prototype/Symbol.toStringTag/name.js new file mode 100644 index 0000000000..d30dd8733d --- /dev/null +++ b/test/staging/sm/Tuple/prototype/Symbol.toStringTag/name.js @@ -0,0 +1,18 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +features: +- record-tuple +description: | + pending +esid: pending +---*/ + +var desc = Object.getOwnPropertyDescriptor(Tuple.prototype, Symbol.toStringTag); + +assert.sameValue(desc.name, undefined); + diff --git a/test/staging/sm/Tuple/prototype/Symbol.toStringTag/prop-desc.js b/test/staging/sm/Tuple/prototype/Symbol.toStringTag/prop-desc.js new file mode 100644 index 0000000000..d5f2d1b47a --- /dev/null +++ b/test/staging/sm/Tuple/prototype/Symbol.toStringTag/prop-desc.js @@ -0,0 +1,33 @@ +// Copyright (C) 2016 the V8 project authors. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. +/*--- +esid: sec-get-%Tuple%.prototype-@@tostringtag +info: | + 8.2.3.4 %Tuple%.prototype [ @@toStringTag ] + + The initial value of Tuple.prototype[@@toStringTag] is the String value "Tuple". + + This property has the attributes { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: true }. +features: +- Symbol.toStringTag +- record-tuple +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +---*/ + +var TuplePrototype = Tuple.prototype; +var desc = Object.getOwnPropertyDescriptor( + TuplePrototype, Symbol.toStringTag +); + +assert.sameValue(desc.value, "Tuple"); +assert.sameValue(desc.writable, false); +assert.sameValue(desc.enumerable, false); +assert.sameValue(desc.configurable, true); + +assert.sameValue(desc.set, undefined); +assert.sameValue(desc.get, undefined); + diff --git a/test/staging/sm/Tuple/prototype/concat/concat.js b/test/staging/sm/Tuple/prototype/concat/concat.js new file mode 100644 index 0000000000..631a7832e5 --- /dev/null +++ b/test/staging/sm/Tuple/prototype/concat/concat.js @@ -0,0 +1,115 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +features: +- record-tuple +description: | + pending +esid: pending +---*/ +/* +8.2.3.6 Tuple.prototype.concat ( ...args ) + +When the concat method is called with zero or more arguments, it returns a Tuple containing the elements of the Tuple followed by the elements of each argument in order. + +The following steps are taken: + +1. Let T be ? thisTupleValue(this value). +2. Let list be a new empty List. +3. Let n be 0. +4. Let items be a List whose first element is T and whose subsequent element are, in left to right order, the arguments that were passed to this function invocation. +5. Repeat, while items is not empty, +a. Remove the first element from items and let E be the value of the element. +b. Let spreadable be ? IsConcatSpreadable(E). +c. If spreadable is true, then +i. Let k be 0. +ii. Let len be ? LengthOfArrayLike(E). +iii. If n + len > 253 - 1, throw a TypeError exception. +iv. Repeat, while k < len, +1. Let P be ! ToString(k). +2. Let exists be ? HasProperty(E, P). +3. If exists is true, then +a. Let subElement be ? Get(E, P). +b. If Type(subElement) is Object, throw a TypeError exception. +c. Append subElement to the end of list list. +4. Set n to n + 1. +5. Set k to k + 1. +d. Else, +i. NOTE: E is added as a single item rather than spread. +ii. If n ≥ 253 - 1, throw a TypeError exception. +iii. If Type(E) is Object, throw a TypeError exception. +iv. Append E to the end of list list. +v. Set n to n + 1. +6. Return a new Tuple value whose [[Sequence]] is list. +*/ + +/* Step 1 */ +/* concat() should throw on a non-Tuple */ +let method = Tuple.prototype.concat; +assert.sameValue(method.call(#[1,2,3,4,5,6], #[1],#[2,3]), #[1,2,3,4,5,6,1,2,3]); +assert.sameValue(method.call(Object(#[1,2,3,4,5,6]), #[1],#[2,3]), method.call(#[1,2,3,4,5,6],#[1],#[2,3])); +assertThrowsInstanceOf(() => method.call("monkeys"), TypeError, + "value of TupleObject must be a Tuple"); + +/* Step 5 */ +/* No arguments or empty arguments => returns this */ +let tup = #[1,2,3]; +assert.sameValue(tup.concat(), tup); +assert.sameValue(tup.concat(#[]), tup); +assert.sameValue(tup.concat([]), tup); +assert.sameValue(tup.concat(#[],#[],#[]), tup); + +/* Step 5 */ +/* 1 spreadable argument */ +assert.sameValue(tup.concat(tup), #[1,2,3,1,2,3]); +assert.sameValue(tup.concat([1,2,3]), #[1,2,3,1,2,3]); + +/* spreadable followed by non-spreadable */ +assert.sameValue(tup.concat(tup, "monkeys"), #[1,2,3,1,2,3, "monkeys"]); +assert.sameValue(tup.concat([1,2,3], "monkeys"), #[1,2,3,1,2,3, "monkeys"]); + +/* non-spreadable followed by spreadable */ +assert.sameValue(tup.concat("monkeys", tup), #[1,2,3, "monkeys", 1,2,3]); +assert.sameValue(tup.concat("monkeys", [1,2,3]), #[1,2,3, "monkeys", 1,2,3,]); + +/* Step 5.c.iii. + If n + len > 2^53 - 1, throw a TypeError */ +var spreadableLengthOutOfRange = {}; +spreadableLengthOutOfRange.length = Number.MAX_SAFE_INTEGER; +spreadableLengthOutOfRange[Symbol.isConcatSpreadable] = true; +/* +TODO +this.length = (2^53/2) +this.concat(a) throws if a.length = 2^53/2 - 1 +*/ + + +assertThrowsInstanceOf(() => tup.concat(spreadableLengthOutOfRange), + TypeError, + 'Too long array'); + +/* Step 5.c.iv.2. Let exists be ?HasProperty(E, P) + Step 5.c.iv.3 Append only if exists is true */ +assert.sameValue(tup.concat([42,17,,5,,12]), #[1,2,3,42,17,5,12]); + +/* Step 5.c.iv.3.b. -- Object elements should throw */ +assertThrowsInstanceOf(() => tup.concat([1, new Object(), 2]), + TypeError, + '#[1,2,3].concat([1, new Object(), 2]) throws a TypeError exception'); + +/* Step 5d -- add as a single item */ +assert.sameValue(tup.concat("monkeys"), #[1,2,3, "monkeys"]); +/* +Step 5d.c.ii. +- Throw if this has length 2^53 +TODO: not sure how to test this -- creating a tuple with length 2^53 takes too long +*/ + +/* Step 5d.iii -- Object should throw */ +assertThrowsInstanceOf(() => tup.concat(new Object()), TypeError, + '#[1,2,3].concat(new Object()) throws a TypeError exception'); + diff --git a/test/staging/sm/Tuple/prototype/concat/indexed-setters.js b/test/staging/sm/Tuple/prototype/concat/indexed-setters.js new file mode 100644 index 0000000000..5b161e5aa9 --- /dev/null +++ b/test/staging/sm/Tuple/prototype/concat/indexed-setters.js @@ -0,0 +1,27 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +features: +- record-tuple +description: | + pending +esid: pending +---*/ + +// If an indexed Array setter is overridden, TupleConcat shouldn't use it +// when constructing the intermediate array + +var z = 5; +for (i = 0; i < 4; i++) { + Object.defineProperty(Array.prototype, i, { set: function(y) { z = 42; }}); +} +var newT = #[1, 2].concat([3, 4]); +assert.sameValue(z, 5); + +newT = #[1, 2].concat("hello"); +assert.sameValue(z, 5); + diff --git a/test/staging/sm/Tuple/prototype/concat/length.js b/test/staging/sm/Tuple/prototype/concat/length.js new file mode 100644 index 0000000000..a44e7c5667 --- /dev/null +++ b/test/staging/sm/Tuple/prototype/concat/length.js @@ -0,0 +1,38 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +features: +- record-tuple +description: | + pending +esid: pending +---*/ +var desc = Object.getOwnPropertyDescriptor(Tuple.prototype.concat, "length"); +assert.sameValue(desc.value, 0); +assert.sameValue(desc.writable, false); +assert.sameValue(desc.enumerable, false); +assert.sameValue(desc.configurable, true); + + +desc = Object.getOwnPropertyDescriptor(Tuple.prototype.concat, "name"); +assert.sameValue(desc.value, "concat"); +assert.sameValue(desc.writable, false); +assert.sameValue(desc.enumerable, false); +assert.sameValue(desc.configurable, true); + +desc = Object.getOwnPropertyDescriptor(Tuple.prototype, "concat"); +assert.sameValue(desc.writable, true); +assert.sameValue(desc.enumerable, false); +assert.sameValue(desc.configurable, true); + +assert.sameValue(isConstructor(Tuple.prototype.concat), false); + +assertThrowsInstanceOf(() => { + let t = #[1]; + new t.concat(); +}, TypeError, '`let t = #[1]; new t.concat()` throws TypeError'); + diff --git a/test/staging/sm/Tuple/prototype/filter/filter.js b/test/staging/sm/Tuple/prototype/filter/filter.js new file mode 100644 index 0000000000..0b6fe7fe97 --- /dev/null +++ b/test/staging/sm/Tuple/prototype/filter/filter.js @@ -0,0 +1,93 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +features: +- record-tuple +description: | + pending +esid: pending +---*/ +/* +8.2.3.13 Tuple.prototype.filter ( callbackfn [ , thisArg ] ) +NOTE +callbackfn should be a function that accepts three arguments and returns a value that is coercible to the Boolean value true or false. filter calls callbackfn once for each element in the tuple, in ascending order, and constructs a new tuple of all the values for which callbackfn returns true. + +If a thisArg parameter is provided, it will be used as the this value for each invocation of callbackfn. If it is not provided, undefined is used instead. + +callbackfn is called with three arguments: the value of the element, the index of the element, and the Tuple being traversed. + +When the filter method is called with one or two arguments, the following steps are taken: + +1. Let T be ? thisTupleValue(this value). +2. Let list be T.[[Sequence]]. +3. Let len be the number of elements in list. +4. If IsCallable(callbackfn) is false, throw a TypeError exception. +5. Let newList be a new empty List. +6. Let k be 0. +7. Repeat, while k < len, +a. Let kValue be list[k]. +b. Let selected be ! ToBoolean(? Call(callbackfn, thisArg, « kValue, k, T »)). +c. If selected is true, then +i. Append kValue to the end of list newList. +d. Set k to k + 1. +8. Return a new Tuple value whose [[Sequence]] is newLis.t + +*/ + +/* Step 1 */ +/* filter() should throw on a non-Tuple */ +let method = Tuple.prototype.filter; +let pred = (x, i, tup) => x % 2 === 0; +assert.sameValue(method.call(#[1,2,3,4,5,6],pred), #[2,4,6]); +assert.sameValue(method.call(Object(#[1,2,3,4,5,6]), pred), #[2,4,6]); +assertThrowsInstanceOf(() => method.call("monkeys", pred), TypeError, + "value of TupleObject must be a Tuple"); + +let tup = #[1,2,3]; + +/* Step 4 */ +/* callbackfn not callable -- should throw */ +assertThrowsInstanceOf(() => tup.filter(), TypeError, + "missing function argument to Tuple.prototype.filter"); +assertThrowsInstanceOf(() => tup.filter(undefined), TypeError, + "missing function argument to Tuple.prototype.filter"); +assertThrowsInstanceOf(() => tup.filter("monkeys"), TypeError, + "bad function argument to Tuple.prototype.filter"); + + +/* callbackfn with 1 argument -- should be allowed */ +var pred2 = x => x % 2 === 0; +assert.sameValue(tup.filter(pred2), #[2]); + +/* callbackfn with 2 arguments -- should be allowed */ +pred2 = (x, i) => x + i < 5; +assert.sameValue(tup.filter(pred2), #[1, 2]); + +/* callbackfn with > 3 arguments -- subsequent ones will be undefined */ +var pred3 = (a, b, c, d, e) => e === undefined; +assert.sameValue(tup.filter(pred3), tup); + +/* callbackfn should be able to use index and tuple */ +var pred1 = (x, i, tup) => (tup.indexOf(x + i) !== (-1)); +assert.sameValue(#[1,2,3,4,5,6,7].filter(pred1), #[1,2,3,4]); + +/* explicit thisArg */ +pred1 = function (x, i, tup) { return(this.elements.indexOf(x) !== -1); }; +assert.sameValue(#[1,2,3,4,5].filter(pred1, { elements: [2, 4] }), #[2,4]); + +/* Step 3 */ +/* Test that length is still handled correctly if it's overridden */ +Object.defineProperty(Tuple.prototype, "length", { get() { return 0 } }) +assert.sameValue(tup.filter(pred), #[2]); + +/* Step 7 */ +assert.sameValue(#[].filter(pred), #[]); +assert.sameValue(#[1].filter(pred), #[]); +assert.sameValue(#[2].filter(pred), #[2]); +assert.sameValue(tup.filter(pred), #[2]); +assert.sameValue(tup.filter(x => x > 1), #[2,3]); + diff --git a/test/staging/sm/Tuple/prototype/filter/indexed-setters.js b/test/staging/sm/Tuple/prototype/filter/indexed-setters.js new file mode 100644 index 0000000000..cc9b0bb2aa --- /dev/null +++ b/test/staging/sm/Tuple/prototype/filter/indexed-setters.js @@ -0,0 +1,26 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +features: +- record-tuple +description: | + pending +esid: pending +---*/ + +// If an indexed Array setter is overridden, TupleSplice shouldn't use it +// when constructing the intermediate array + +var z = 5; +print("1111"); +Object.defineProperty(Array.prototype, '0', { set: function(y) { z = 42; }}); +print("2222"); +let newT = #[1,2,3].filter(x => true); +print("3333"); +assert.sameValue(z, 5); +print("4444"); + diff --git a/test/staging/sm/Tuple/prototype/filter/length.js b/test/staging/sm/Tuple/prototype/filter/length.js new file mode 100644 index 0000000000..902d9babfe --- /dev/null +++ b/test/staging/sm/Tuple/prototype/filter/length.js @@ -0,0 +1,38 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +features: +- record-tuple +description: | + pending +esid: pending +---*/ +var desc = Object.getOwnPropertyDescriptor(Tuple.prototype.filter, "length"); +assert.sameValue(desc.value, 1); +assert.sameValue(desc.writable, false); +assert.sameValue(desc.enumerable, false); +assert.sameValue(desc.configurable, true); + + +desc = Object.getOwnPropertyDescriptor(Tuple.prototype.filter, "name"); +assert.sameValue(desc.value, "filter"); +assert.sameValue(desc.writable, false); +assert.sameValue(desc.enumerable, false); +assert.sameValue(desc.configurable, true); + +desc = Object.getOwnPropertyDescriptor(Tuple.prototype, "filter"); +assert.sameValue(desc.writable, true); +assert.sameValue(desc.enumerable, false); +assert.sameValue(desc.configurable, true); + +assert.sameValue(isConstructor(Tuple.prototype.filter), false); + +assertThrowsInstanceOf(() => { + let t = #[1]; + new t.filter(); +}, TypeError, '`let t = #[1]; new t.filter()` throws TypeError'); + diff --git a/test/staging/sm/Tuple/prototype/flat/empty-tuple-elements.js b/test/staging/sm/Tuple/prototype/flat/empty-tuple-elements.js new file mode 100644 index 0000000000..840338e7bf --- /dev/null +++ b/test/staging/sm/Tuple/prototype/flat/empty-tuple-elements.js @@ -0,0 +1,19 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +features: +- record-tuple +description: | + pending +esid: pending +---*/ +var t = #[]; +assert.sameValue(#[].flat(), #[]); +assert.sameValue(#[#[],#[]].flat(), #[]); +assert.sameValue(#[#[], #[1]].flat(), #[1]); +assert.sameValue(#[#[], #[1, t]].flat(), #[1, t]); + diff --git a/test/staging/sm/Tuple/prototype/flat/flat.js b/test/staging/sm/Tuple/prototype/flat/flat.js new file mode 100644 index 0000000000..85af15771f --- /dev/null +++ b/test/staging/sm/Tuple/prototype/flat/flat.js @@ -0,0 +1,107 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +features: +- record-tuple +description: | + pending +esid: pending +---*/ +/* +8.2.3.16 Tuple.prototype.flat ( [ depth ] ) +When the flat method is called with zero or one arguments, the following steps are taken: + +1. Let T be ? thisTupleValue(this value). +2. Let list be T.[[Sequence]]. +3. Let depthNum be 1. +4. If depth is not undefined, then +a. Set depthNum to ? ToInteger(depth). +5. Let flat be a new empty List. +6. Perform ? FlattenIntoTuple(flat, list, depthNum). +7. Return a new Tuple value whose [[Sequence]] is flat. + +8.2.3.16.1 FlattenIntoTuple ( target, source, depth [ , mapperFunction, thisArg ] ) +The abstract operation FlattenIntoTuple takes arguments target, source, and depth and optional arguments mapperFunction and thisArg. It performs the following steps when called: + +1. Assert: target is a List. +2. Assert: source is a List. +3. Assert: ! IsInteger(depth) is true, or depth is either +∞ or -∞. +4. Assert: If mapperFunction is present, then ! IsCallable(mapperFunction) is true, thisArg is present, and depth is 1. +5. Let sourceIndex be 0. +6. For each element of source, +a. If mapperFunction is present, then +i. Set element to ? Call(mapperFunction, thisArg, « element, sourceIndex, source »). +ii. If Type(element) is Object, throw a TypeError exception. +b. If depth > 0 and Type(element) is Tuple, then +i. Perform ? FlattenIntoTuple(target, element, depth - 1). +c. Else, +i. Let len be the length of target. +ii. If len ≥ 253 - 1, throw a TypeError exception. +iii. Append element to target. +d. Set sourceIndex to sourceIndex + 1. + +*/ +/* Step 1 */ +/* flat() should throw on a non-Tuple */ +let method = Tuple.prototype.flat; +assert.sameValue(method.call(#[1,#[2],3]), #[1,2,3]); +assert.sameValue(method.call(Object(#[1,#[2],3])), #[1,2,3]); +assertThrowsInstanceOf(() => method.call("monkeys"), TypeError, + "value of TupleObject must be a Tuple"); +assertThrowsInstanceOf(() => method.call(null), TypeError, + "value of TupleObject must be a Tuple"); +assertThrowsInstanceOf(() => method.call(), TypeError, + "value of TupleObject must be a Tuple"); + + +let tup = #[1,2,#[3,#[4,5],6],#[5,6],7]; +let tup2 = #[1,2,#[3,#[4,#["a", "b"], 5],6],#[5,#[6,#[7,8,#[9,10]]]],7]; + +/* Step 3 -- depth is converted to Integer */ +assert.sameValue(tup.flat("monkeys"), tup.flat(0)); +assert.sameValue(tup.flat({}), tup.flat(0)); +assert.sameValue(tup.flat(+0), tup.flat(0)); +assert.sameValue(tup.flat(-0), tup.flat(0)); +assert.sameValue(tup.flat('2'), tup.flat(2)); +assert.sameValue(tup.flat(true), tup.flat(1)); +assert.sameValue(tup.flat(false), tup.flat(0)); +assert.sameValue(tup.flat(null), tup.flat(0)); +assert.sameValue(tup.flat(NaN), tup.flat(0)); +assert.sameValue(tup.flat([1,2,3]), tup.flat(0)); +assertThrowsInstanceOf(() => tup.flat(Symbol("x")), TypeError, + "can't convert symbol to number"); +assertThrowsInstanceOf(() => tup.flat(Object.create(null)), TypeError, + "can't convert Object to number"); +assertThrowsInstanceOf(() => tup.flat(#[1]), TypeError, + "can't convert Tuple to number"); + + +/* Step 3 -- if depth is undefined, depthNum is set to 1 */ +assert.sameValue(tup.flat(undefined), tup.flat(1)); +assert.sameValue(tup.flat(), tup.flat(1)); + +/* Step 7 */ +assert.sameValue(#[].flat(), #[]); +assert.sameValue(#[1].flat(), #[1]); +assert.sameValue(#[#[1,2],#[3,4]].flat(), #[1,2,3,4]); +assert.sameValue(tup.flat(0), tup); +assert.sameValue(tup.flat(1), #[1,2,3,#[4,5],6,5,6,7]); +assert.sameValue(tup.flat(2), #[1,2,3,4,5,6,5,6,7]); +assert.sameValue(tup.flat(3), tup.flat(2)); +assert.sameValue(tup2.flat(0), tup2); +assert.sameValue(tup2.flat(1), #[1,2,3,#[4,#["a", "b"], 5],6,5,#[6,#[7,8,#[9,10]]],7]); +assert.sameValue(tup2.flat(2), #[1,2,3,4,#["a", "b"],5,6,5,6,#[7, 8, #[9, 10]],7]); +assert.sameValue(tup2.flat(3), #[1,2,3,4,"a","b",5,6,5,6, 7, 8, #[9, 10], 7]); +assert.sameValue(tup2.flat(4), #[1,2,3,4,"a","b",5,6,5,6, 7, 8, 9, 10, 7]); + +/* FlattenIntoTuple steps: */ +/* Step 3: depth can be Infinity or -Infinity */ +assert.sameValue(tup2.flat(Infinity), tup2.flat(4)); +assert.sameValue(tup2.flat(-Infinity), tup2.flat(0)); + +/* Step 6.c.ii. -- throw if len would be > n^253 - 1 -- not sure how to test this */ + diff --git a/test/staging/sm/Tuple/prototype/flat/indexed-setters.js b/test/staging/sm/Tuple/prototype/flat/indexed-setters.js new file mode 100644 index 0000000000..0799e61a48 --- /dev/null +++ b/test/staging/sm/Tuple/prototype/flat/indexed-setters.js @@ -0,0 +1,26 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +features: +- record-tuple +description: | + pending +esid: pending +---*/ + +// If an indexed Array setter is overridden, TupleSplice shouldn't use it +// when constructing the intermediate array + +var z = 5; +print("1111"); +Object.defineProperty(Array.prototype, '0', { set: function(y) { z = 42; }}); +print("2222"); +let newT = #[#[1],#[2,3]].flat(); +print("3333"); +assert.sameValue(z, 5); +print("4444"); + diff --git a/test/staging/sm/Tuple/prototype/flat/length.js b/test/staging/sm/Tuple/prototype/flat/length.js new file mode 100644 index 0000000000..4402a56541 --- /dev/null +++ b/test/staging/sm/Tuple/prototype/flat/length.js @@ -0,0 +1,38 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +features: +- record-tuple +description: | + pending +esid: pending +---*/ +var desc = Object.getOwnPropertyDescriptor(Tuple.prototype.flat, "length"); +assert.sameValue(desc.value, 0); +assert.sameValue(desc.writable, false); +assert.sameValue(desc.enumerable, false); +assert.sameValue(desc.configurable, true); + + +desc = Object.getOwnPropertyDescriptor(Tuple.prototype.flat, "name"); +assert.sameValue(desc.value, "flat"); +assert.sameValue(desc.writable, false); +assert.sameValue(desc.enumerable, false); +assert.sameValue(desc.configurable, true); + +desc = Object.getOwnPropertyDescriptor(Tuple.prototype, "flat"); +assert.sameValue(desc.writable, true); +assert.sameValue(desc.enumerable, false); +assert.sameValue(desc.configurable, true); + +assert.sameValue(isConstructor(Tuple.prototype.flat), false); + +assertThrowsInstanceOf(() => { + let t = #[1]; + new t.flat(); +}, TypeError, '`let t = #[1]; new t.flat()` throws TypeError'); + diff --git a/test/staging/sm/Tuple/prototype/flat/undefined-elements.js b/test/staging/sm/Tuple/prototype/flat/undefined-elements.js new file mode 100644 index 0000000000..b9279c874e --- /dev/null +++ b/test/staging/sm/Tuple/prototype/flat/undefined-elements.js @@ -0,0 +1,21 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +features: +- record-tuple +description: | + pending +esid: pending +---*/ +var t = #[void 0]; + +assert.sameValue(#[1, null, void 0].flat(), #[1, null, undefined]); +assert.sameValue(#[1, #[null, void 0]].flat(), #[1, null, undefined]); +assert.sameValue(#[#[null, void 0], #[null, void 0]].flat(), #[null, undefined, null, undefined]); +assert.sameValue(#[1, #[null, t]].flat(1), #[1, null, t]); +assert.sameValue(#[1, #[null, t]].flat(2), #[1, null, undefined]); + diff --git a/test/staging/sm/Tuple/prototype/flatMap/depth-always-one.js b/test/staging/sm/Tuple/prototype/flatMap/depth-always-one.js new file mode 100644 index 0000000000..0e0ce5dfb9 --- /dev/null +++ b/test/staging/sm/Tuple/prototype/flatMap/depth-always-one.js @@ -0,0 +1,27 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +features: +- record-tuple +description: | + pending +esid: pending +---*/ +assert.sameValue(#[1, 2].flatMap(function(e) { + return #[e, e * 2]; +}), #[1, 2, 2, 4]); + +var result = #[1, 2, 3].flatMap(function(ele) { + return #[ + #[ele * 2] + ]; +}); +assert.sameValue(result.length, 3); +assert.sameValue(result[0], #[2]); +assert.sameValue(result[1] ,#[4]); +assert.sameValue(result[2], #[6]); + diff --git a/test/staging/sm/Tuple/prototype/flatMap/flatMap.js b/test/staging/sm/Tuple/prototype/flatMap/flatMap.js new file mode 100644 index 0000000000..0d69922971 --- /dev/null +++ b/test/staging/sm/Tuple/prototype/flatMap/flatMap.js @@ -0,0 +1,125 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +features: +- record-tuple +description: | + pending +esid: pending +---*/ +/* +8.2.3.17 Tuple.prototype.flatMap ( mapperFunction [ , thisArg ] ) +When the flatMap method is called with one or two arguments, the following steps are taken: + +1. Let T be ? thisTupleValue(this value). +2. Let list be T.[[Sequence]]. +3. If ! IsCallable(mapperFunction) is false, throw a TypeError exception. +4. Let flat be a new empty List. +5. Perform ? FlattenIntoTuple(flat, list, 1, mapperFunction, thisArg). +6. Return a new Tuple value whose [[Sequence]] is flat. + +8.2.3.16.1 FlattenIntoTuple ( target, source, depth [ , mapperFunction, thisArg ] ) +The abstract operation FlattenIntoTuple takes arguments target, source, and depth and optional arguments mapperFunction and thisArg. It performs the following steps when called: + +1. Assert: target is a List. +2. Assert: source is a List. +3. Assert: ! IsInteger(depth) is true, or depth is either +∞ or -∞. +4. Assert: If mapperFunction is present, then ! IsCallable(mapperFunction) is true, thisArg is present, and depth is 1. +5. Let sourceIndex be 0. +6. For each element of source, +a. If mapperFunction is present, then +i. Set element to ? Call(mapperFunction, thisArg, « element, sourceIndex, source »). +ii. If Type(element) is Object, throw a TypeError exception. +b. If depth > 0 and Type(element) is Tuple, then +i. Perform ? FlattenIntoTuple(target, element, depth - 1). +c. Else, +i. Let len be the length of target. +ii. If len ≥ 253 - 1, throw a TypeError exception. +iii. Append element to target. +d. Set sourceIndex to sourceIndex + 1. + */ + +/* Step 1 */ +/* flatMap() should throw on a non-Tuple */ +let method = Tuple.prototype.flatMap; +let id = x => x; +assert.sameValue(method.call(#[1,#[2],3], id), #[1,2,3]); +assert.sameValue(method.call(Object(#[1,#[2],3]), id), #[1,2,3]); +assertThrowsInstanceOf(() => method.call("monkeys", id), TypeError, + "value of TupleObject must be a Tuple"); +assertThrowsInstanceOf(() => method.call(null, id), TypeError, + "value of TupleObject must be a Tuple"); +assertThrowsInstanceOf(() => method.call(id), TypeError, + "value of TupleObject must be a Tuple"); + + +let tup = #[1,2,#[3,#[4,5],6],#[5,6],7]; +let tup2 = #[1, #[2], 3]; + +/* Step 4 */ +/* callbackfn not callable -- should throw */ +assertThrowsInstanceOf(() => tup.flatMap(), TypeError, + "missing function argument to Tuple.prototype.flatMap"); +assertThrowsInstanceOf(() => tup.flatMap(undefined), TypeError, + "missing function argument to Tuple.prototype.flatMap"); +assertThrowsInstanceOf(() => tup.flatMap("monkeys"), TypeError, + "bad function argument to Tuple.prototype.flatMap"); + + +/* callbackfn with 1 argument -- should be allowed */ +var f2 = function(x) { + if (typeof(x) === "number") { + return(x * x); + } else { + return 0; + } +}; +assert.sameValue(tup2.flatMap(f2), #[1, 0, 9]); + +/* callbackfn with 2 arguments -- should be allowed */ +f2 = function(x, i) { + if (typeof(x) === "number") { + return(x + i); + } else { + return(i); + } +}; +assert.sameValue(tup2.flatMap(f2), #[1, 1, 5]); + +/* callbackfn with > 3 arguments -- subsequent ones will be undefined */ +var f3 = (a, b, c, d, e) => e === undefined; +assert.sameValue(tup2.flatMap(f3), #[true, true, true]); + +/* callbackfn should be able to use index and tuple */ +var f4 = function (x, i, tup) { + if (typeof(x) === "number") { + return(tup.indexOf(x+1) * i * x); + } else { + return(tup.indexOf(x) * i); + } +} +assert.sameValue(tup2.flatMap(f4), #[-0, 1, -6]); + +/* explicit thisArg */ +f1 = function (x, i, tup) { + if (typeof(x) == "number") { + return(this.elements.indexOf(x) * x); + } else { + return(this.elements.indexOf(x)); + } +} +assert.sameValue(#[1,2,#[3,4],#[5]].flatMap(f1, { elements: [2, 4] }), #[-1, 0, -1, -1]); + +/* FlattenIntoTuple steps */ +/* Step 6.a.ii. */ +var badF = x => new Object(x); +assertThrowsInstanceOf(() => tup.flatMap(badF), TypeError, + "Tuple cannot contain Object"); +/* Step 6.b.i. */ +var f = x => #[x, x]; +assert.sameValue(#[1,#[2,3],4].flatMap(f), #[1,1,#[2,3],#[2,3],4,4]); + diff --git a/test/staging/sm/Tuple/prototype/flatMap/length.js b/test/staging/sm/Tuple/prototype/flatMap/length.js new file mode 100644 index 0000000000..8f50caaf11 --- /dev/null +++ b/test/staging/sm/Tuple/prototype/flatMap/length.js @@ -0,0 +1,38 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +features: +- record-tuple +description: | + pending +esid: pending +---*/ +var desc = Object.getOwnPropertyDescriptor(Tuple.prototype.flatMap, "length"); +assert.sameValue(desc.value, 1); +assert.sameValue(desc.writable, false); +assert.sameValue(desc.enumerable, false); +assert.sameValue(desc.configurable, true); + + +desc = Object.getOwnPropertyDescriptor(Tuple.prototype.flatMap, "name"); +assert.sameValue(desc.value, "flatMap"); +assert.sameValue(desc.writable, false); +assert.sameValue(desc.enumerable, false); +assert.sameValue(desc.configurable, true); + +desc = Object.getOwnPropertyDescriptor(Tuple.prototype, "flatMap"); +assert.sameValue(desc.writable, true); +assert.sameValue(desc.enumerable, false); +assert.sameValue(desc.configurable, true); + +assert.sameValue(isConstructor(Tuple.prototype.flatMap), false); + +assertThrowsInstanceOf(() => { + let t = #[1]; + new t.flatMap(); +}, TypeError, '`let t = #[1]; new t.flatMap()` throws TypeError'); + diff --git a/test/staging/sm/Tuple/prototype/includes/fromIndex-equal-or-greater-length-returns-false.js b/test/staging/sm/Tuple/prototype/includes/fromIndex-equal-or-greater-length-returns-false.js new file mode 100644 index 0000000000..15fe113496 --- /dev/null +++ b/test/staging/sm/Tuple/prototype/includes/fromIndex-equal-or-greater-length-returns-false.js @@ -0,0 +1,17 @@ +// Copyright (C) 2016 the V8 project authors. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +description: | + Return false if fromIndex >= TupleLength +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +features: +- record-tuple +esid: pending +---*/ +var sample = #[7, 7, 7, 7]; +assert.sameValue(sample.includes(7, 4), false, "length"); +assert.sameValue(sample.includes(7, 5), false, "length + 1"); + diff --git a/test/staging/sm/Tuple/prototype/includes/fromIndex-infinity.js b/test/staging/sm/Tuple/prototype/includes/fromIndex-infinity.js new file mode 100644 index 0000000000..664caec113 --- /dev/null +++ b/test/staging/sm/Tuple/prototype/includes/fromIndex-infinity.js @@ -0,0 +1,26 @@ +// Copyright (C) 2016 the V8 project authors. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +esid: sec-array.prototype.includes +description: | + handle Infinity values for fromIndex +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +features: +- record-tuple +---*/ +var sample = #[42, 43, 43, 41]; + +assert.sameValue( + sample.includes(43, Infinity), + false, + "includes(43, Infinity)" +); +assert.sameValue( + sample.includes(43, -Infinity), + true, + "includes(43, -Infinity)" +); + diff --git a/test/staging/sm/Tuple/prototype/includes/fromIndex-minus-zero.js b/test/staging/sm/Tuple/prototype/includes/fromIndex-minus-zero.js new file mode 100644 index 0000000000..0a303ecd72 --- /dev/null +++ b/test/staging/sm/Tuple/prototype/includes/fromIndex-minus-zero.js @@ -0,0 +1,27 @@ +// Copyright (C) 2016 the V8 project authors. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +esid: sec-array.prototype.includes +description: | + -0 fromIndex becomes 0 +info: | + 22.1.3.11 Array.prototype.includes ( searchElement [ , fromIndex ] ) + + ... + 5. If n ≥ 0, then + a. Let k be n. + ... + 7. Repeat, while k < len + ... +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +features: +- record-tuple +---*/ +var sample = [42, 43]; +assert.sameValue(sample.includes(42, -0), true, "-0 [0]"); +assert.sameValue(sample.includes(43, -0), true, "-0 [1]"); +assert.sameValue(sample.includes(44, -0), false, "-0 [2]"); + diff --git a/test/staging/sm/Tuple/prototype/includes/includes.js b/test/staging/sm/Tuple/prototype/includes/includes.js new file mode 100644 index 0000000000..02d1d2021e --- /dev/null +++ b/test/staging/sm/Tuple/prototype/includes/includes.js @@ -0,0 +1,29 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +features: +- record-tuple +description: | + pending +esid: pending +---*/ +/* +8.2.3.7 Tuple.prototype.includes ( searchElement [ , fromIndex ] ) +Tuple.prototype.includes is a distinct function that implements the same algorithm as Array.prototype.includes as defined in 22.1.3.13 except that ? thisTupleValue(this value) is used instead of directly accessing the this value. The implementation of the algorithm may be optimized with the knowledge that the this value is an object that has a fixed length and whose integer-indexed properties are not sparse, do not change, and their access is not observable. However, such optimization must not introduce any observable changes in the specified behaviour of the algorithm. + +This function is not generic, since thisTupleValue(this value) can return an abrupt completion: in that case, that exception is thrown instead of evaluating the algorithm. +*/ + +/* Step 1 */ +/* includes() should throw on a non-Tuple */ +let method = Tuple.prototype.includes; +assert.sameValue(method.call(#[1,2,3,4,5,6], 2), true); +assert.sameValue(method.call(Object(#[1,2,3,4,5,6]), 2), true); +assertThrowsInstanceOf(() => method.call("monkeys", 2), TypeError, + "value of TupleObject must be a Tuple"); + +/* Not sure what else to test, since it just calls the array method */ diff --git a/test/staging/sm/Tuple/prototype/includes/length-internal.js b/test/staging/sm/Tuple/prototype/includes/length-internal.js new file mode 100644 index 0000000000..2f36138fa8 --- /dev/null +++ b/test/staging/sm/Tuple/prototype/includes/length-internal.js @@ -0,0 +1,25 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +features: +- record-tuple +description: | + pending +esid: pending +---*/ +/* Tuples should have a length ownProperty that can't be overridden, which will + * be read by any built-in methods called on Tuples. + * This test is expected to fail until the spec change in + * https://github.com/tc39/proposal-record-tuple/issues/282 is implemented. + */ + +/* +t = #[1,2,3]; +Object.defineProperty(Tuple.prototype, "length", {value: 0}); +assert.sameValue(t.includes(2), true); +*/ + diff --git a/test/staging/sm/Tuple/prototype/includes/length-zero-returns-false.js b/test/staging/sm/Tuple/prototype/includes/length-zero-returns-false.js new file mode 100644 index 0000000000..dcce4db37c --- /dev/null +++ b/test/staging/sm/Tuple/prototype/includes/length-zero-returns-false.js @@ -0,0 +1,26 @@ +// Copyright (C) 2016 the V8 project authors. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +description: | + Returns false if length is 0 ... +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +features: +- record-tuple +esid: pending +---*/ +var calls = 0; +var fromIndex = { + valueOf: function() { + calls++; + } +}; + +var sample = #[]; +assert.sameValue(sample.includes(0), false, "returns false"); +assert.sameValue(sample.includes(), false, "returns false - no arg"); +assert.sameValue(sample.includes(0, fromIndex), false, "using fromIndex"); +assert.sameValue(calls, 0, "length is checked before ToInteger(fromIndex)"); + diff --git a/test/staging/sm/Tuple/prototype/includes/length.js b/test/staging/sm/Tuple/prototype/includes/length.js new file mode 100644 index 0000000000..3fd4942efe --- /dev/null +++ b/test/staging/sm/Tuple/prototype/includes/length.js @@ -0,0 +1,38 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +features: +- record-tuple +description: | + pending +esid: pending +---*/ +var desc = Object.getOwnPropertyDescriptor(Tuple.prototype.includes, "length"); +assert.sameValue(desc.value, 1); +assert.sameValue(desc.writable, false); +assert.sameValue(desc.enumerable, false); +assert.sameValue(desc.configurable, true); + + +desc = Object.getOwnPropertyDescriptor(Tuple.prototype.includes, "name"); +assert.sameValue(desc.value, "includes"); +assert.sameValue(desc.writable, false); +assert.sameValue(desc.enumerable, false); +assert.sameValue(desc.configurable, true); + +desc = Object.getOwnPropertyDescriptor(Tuple.prototype, "includes"); +assert.sameValue(desc.writable, true); +assert.sameValue(desc.enumerable, false); +assert.sameValue(desc.configurable, true); + +assert.sameValue(isConstructor(Tuple.prototype.includes), false); + +assertThrowsInstanceOf(() => { + let t = #[1]; + new t.includes(); +}, TypeError, '`let t = #[1]; new t.includes()` throws TypeError'); + diff --git a/test/staging/sm/Tuple/prototype/includes/name.js b/test/staging/sm/Tuple/prototype/includes/name.js new file mode 100644 index 0000000000..ec011a8705 --- /dev/null +++ b/test/staging/sm/Tuple/prototype/includes/name.js @@ -0,0 +1,20 @@ +// Copyright (C) 2016 the V8 project authors. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +description: | + Tuple.prototype.includes.name is "includes". +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +features: +- record-tuple +esid: pending +---*/ +assert.sameValue(Tuple.prototype.includes.name, "includes"); +var desc = Object.getOwnPropertyDescriptor(Tuple.prototype.includes, "name"); + +assert.sameValue(desc.writable, false); +assert.sameValue(desc.enumerable, false); +assert.sameValue(desc.configurable, true); + diff --git a/test/staging/sm/Tuple/prototype/includes/no-arg.js b/test/staging/sm/Tuple/prototype/includes/no-arg.js new file mode 100644 index 0000000000..f565c93567 --- /dev/null +++ b/test/staging/sm/Tuple/prototype/includes/no-arg.js @@ -0,0 +1,16 @@ +// Copyright (C) 2016 the V8 project authors. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +description: | + no argument searches for a undefined value +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +features: +- record-tuple +esid: pending +---*/ +assert.sameValue(#[0].includes(), false, "#[0].includes()"); +assert.sameValue(#[undefined].includes(), true, "#[undefined].includes()"); + diff --git a/test/staging/sm/Tuple/prototype/includes/not-a-constructor.js b/test/staging/sm/Tuple/prototype/includes/not-a-constructor.js new file mode 100644 index 0000000000..f1c5daf692 --- /dev/null +++ b/test/staging/sm/Tuple/prototype/includes/not-a-constructor.js @@ -0,0 +1,23 @@ +// Copyright (C) 2020 Rick Waldron. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +description: | + Tuple.prototype.includes does not implement [[Construct]], is not new-able +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +features: +- record-tuple +esid: pending +---*/ +assert.sameValue( + isConstructor(Tuple.prototype.includes), + false, + 'isConstructor(Tuple.prototype.includes) must return false' +); + +assertThrowsInstanceOf(() => new Tuple.prototype.includes(1), + TypeError, '`new Tuple.prototype.includes(1)` throws TypeError'); + + diff --git a/test/staging/sm/Tuple/prototype/includes/prop-desc.js b/test/staging/sm/Tuple/prototype/includes/prop-desc.js new file mode 100644 index 0000000000..29d08b26e9 --- /dev/null +++ b/test/staging/sm/Tuple/prototype/includes/prop-desc.js @@ -0,0 +1,17 @@ +// Copyright (C) 2016 the V8 project authors. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. +/*--- +description: | + "includes" property of Tuple.prototype +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +features: +- record-tuple +esid: pending +---*/ +var desc = Object.getOwnPropertyDescriptor(Tuple.prototype, "includes"); +assert.sameValue(desc.writable, true); +assert.sameValue(desc.enumerable, false); +assert.sameValue(desc.configurable, true); + diff --git a/test/staging/sm/Tuple/prototype/includes/return-abrupt-get-length.js b/test/staging/sm/Tuple/prototype/includes/return-abrupt-get-length.js new file mode 100644 index 0000000000..cb7f31ad06 --- /dev/null +++ b/test/staging/sm/Tuple/prototype/includes/return-abrupt-get-length.js @@ -0,0 +1,30 @@ +// Copyright (C) 2016 the V8 project authors. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +esid: sec-array.prototype.includes +description: | + Return abrupt from Get(O, "length") +info: | + 22.1.3.11 Array.prototype.includes ( searchElement [ , fromIndex ] ) + + ... + 2. Let len be ? ToLength(? Get(O, "length")). + ... +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +features: +- record-tuple +---*/ +var obj = {}; + +Object.defineProperty(obj, "length", { + get: function() { + throw new Test262Error(); + } +}); + +assertThrowsInstanceOf(() => #[].includes.call(obj, 7), TypeError, + "value of TupleObject must be a tuple"); + diff --git a/test/staging/sm/Tuple/prototype/includes/return-abrupt-tointeger-fromindex-symbol.js b/test/staging/sm/Tuple/prototype/includes/return-abrupt-tointeger-fromindex-symbol.js new file mode 100644 index 0000000000..02eb46fc35 --- /dev/null +++ b/test/staging/sm/Tuple/prototype/includes/return-abrupt-tointeger-fromindex-symbol.js @@ -0,0 +1,19 @@ +// Copyright (C) 2016 the V8 project authors. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +description: | + Return abrupt from ToInteger(fromIndex) - using symbol +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +features: +- record-tuple +esid: pending +---*/ +var fromIndex = Symbol("1"); + +var sample = #[7]; + +assertThrowsInstanceOf(() => sample.includes(7, fromIndex), TypeError); + diff --git a/test/staging/sm/Tuple/prototype/includes/return-abrupt-tointeger-fromindex.js b/test/staging/sm/Tuple/prototype/includes/return-abrupt-tointeger-fromindex.js new file mode 100644 index 0000000000..d1747dae54 --- /dev/null +++ b/test/staging/sm/Tuple/prototype/includes/return-abrupt-tointeger-fromindex.js @@ -0,0 +1,25 @@ +// Copyright (C) 2016 the V8 project authors. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +description: | + Return abrupt from ToInteger(fromIndex) +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +features: +- record-tuple +esid: pending +---*/ +function TestError() {}; + +var fromIndex = { + valueOf: function() { + throw new TestError(); + } +}; + +var sample = #[7]; + +assertThrowsInstanceOf(() => sample.includes(7, fromIndex), TestError); + diff --git a/test/staging/sm/Tuple/prototype/includes/return-abrupt-tonumber-length-symbol.js b/test/staging/sm/Tuple/prototype/includes/return-abrupt-tonumber-length-symbol.js new file mode 100644 index 0000000000..1e917e0595 --- /dev/null +++ b/test/staging/sm/Tuple/prototype/includes/return-abrupt-tonumber-length-symbol.js @@ -0,0 +1,19 @@ +// Copyright (C) 2016 the V8 project authors. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +description: | + Return abrupt from ToNumber(symbol "length") +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +features: +- record-tuple +esid: pending +---*/ +var obj = { + length: Symbol("1") +}; + +assertThrowsInstanceOf(() => #[].includes.call(obj, 7), TypeError); + diff --git a/test/staging/sm/Tuple/prototype/includes/samevaluezero.js b/test/staging/sm/Tuple/prototype/includes/samevaluezero.js new file mode 100644 index 0000000000..98f764e747 --- /dev/null +++ b/test/staging/sm/Tuple/prototype/includes/samevaluezero.js @@ -0,0 +1,25 @@ +// Copyright (C) 2016 the V8 project authors. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +description: | + search element is compared using SameValueZero +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +features: +- record-tuple +esid: pending +---*/ +var sample = #[42, 0, 1, NaN]; +assert.sameValue(sample.includes("42"), false); +assert.sameValue(sample.includes([42]), false); +assert.sameValue(sample.includes(#[42]), false); +assert.sameValue(sample.includes(42.0), true); +assert.sameValue(sample.includes(-0), true); +assert.sameValue(sample.includes(true), false); +assert.sameValue(sample.includes(false), false); +assert.sameValue(sample.includes(null), false); +assert.sameValue(sample.includes(""), false); +assert.sameValue(sample.includes(NaN), true); + diff --git a/test/staging/sm/Tuple/prototype/includes/search-found-returns-true.js b/test/staging/sm/Tuple/prototype/includes/search-found-returns-true.js new file mode 100644 index 0000000000..18dc7ac527 --- /dev/null +++ b/test/staging/sm/Tuple/prototype/includes/search-found-returns-true.js @@ -0,0 +1,32 @@ +// Copyright (C) 2016 the V8 project authors. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +description: | + returns true for found index +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +features: +- record-tuple +esid: pending +---*/ +var symbol = Symbol("1"); +var tuple = #[]; +var record = #{}; + +var sample = #[42, "test262", null, undefined, true, false, 0, -1, "", symbol, tuple, record]; + +assert.sameValue(sample.includes(42), true, "42"); +assert.sameValue(sample.includes("test262"), true, "'test262'"); +assert.sameValue(sample.includes(null), true, "null"); +assert.sameValue(sample.includes(undefined), true, "undefined"); +assert.sameValue(sample.includes(true), true, "true"); +assert.sameValue(sample.includes(false), true, "false"); +assert.sameValue(sample.includes(0), true, "0"); +assert.sameValue(sample.includes(-1), true, "-1"); +assert.sameValue(sample.includes(""), true, "the empty string"); +assert.sameValue(sample.includes(symbol), true, "symbol"); +assert.sameValue(sample.includes(tuple), true, "tuple"); +assert.sameValue(sample.includes(record), true, "record"); + diff --git a/test/staging/sm/Tuple/prototype/includes/search-not-found-returns-false.js b/test/staging/sm/Tuple/prototype/includes/search-not-found-returns-false.js new file mode 100644 index 0000000000..cd5e065b16 --- /dev/null +++ b/test/staging/sm/Tuple/prototype/includes/search-not-found-returns-false.js @@ -0,0 +1,30 @@ +// Copyright (C) 2016 the V8 project authors. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +description: | + returns false if the element is not found +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +features: +- record-tuple +esid: pending +---*/ +assert.sameValue(#[42].includes(43), false, "43"); + +assert.sameValue(#["test262"].includes("test"), false, "string"); + +assert.sameValue(#[0, "test262", undefined].includes(""), false, "the empty string"); + +assert.sameValue(#["true", false].includes(true), false, "true"); +assert.sameValue(#["", true].includes(false), false, "false"); + +assert.sameValue(#[undefined, false, 0, 1].includes(null), false, "null"); +assert.sameValue(#[null].includes(undefined), false, "undefined"); + +assert.sameValue(#[Symbol("1")].includes(Symbol("1")), false, "symbol"); + +var sample = #[42]; +assert.sameValue(sample.includes(sample), false, "this"); + diff --git a/test/staging/sm/Tuple/prototype/includes/this-is-not-tuple.js b/test/staging/sm/Tuple/prototype/includes/this-is-not-tuple.js new file mode 100644 index 0000000000..a23b2642b8 --- /dev/null +++ b/test/staging/sm/Tuple/prototype/includes/this-is-not-tuple.js @@ -0,0 +1,20 @@ +// Copyright (C) 2016 the V8 project authors. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. +/*--- +description: | + Throws a TypeError exception when `this` cannot be coerced to Tuple +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +features: +- record-tuple +esid: pending +---*/ +var includes = Tuple.prototype.includes; + +assertThrowsInstanceOf(() => includes.call(undefined, 42), TypeError, + "this is undefined"); + +assertThrowsInstanceOf(() => includes.call(null, 42), TypeError, + "this is null"); + diff --git a/test/staging/sm/Tuple/prototype/includes/tointeger-fromindex.js b/test/staging/sm/Tuple/prototype/includes/tointeger-fromindex.js new file mode 100644 index 0000000000..3cca1b9392 --- /dev/null +++ b/test/staging/sm/Tuple/prototype/includes/tointeger-fromindex.js @@ -0,0 +1,48 @@ +// Copyright (C) 2016 the V8 project authors. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +features: +- record-tuple +description: | + pending +esid: pending +---*/ +/*--- +description: get the integer value from fromIndex +*/ + +var obj = { + valueOf: function() { + return 1; + } +}; + +var sample = #[42, 43]; +assert.sameValue(sample.includes(42, "1"), false, "string [0]"); +assert.sameValue(sample.includes(43, "1"), true, "string [1]"); + +assert.sameValue(sample.includes(42, true), false, "true [0]"); +assert.sameValue(sample.includes(43, true), true, "true [1]"); + +assert.sameValue(sample.includes(42, false), true, "false [0]"); +assert.sameValue(sample.includes(43, false), true, "false [1]"); + +assert.sameValue(sample.includes(42, NaN), true, "NaN [0]"); +assert.sameValue(sample.includes(43, NaN), true, "NaN [1]"); + +assert.sameValue(sample.includes(42, null), true, "null [0]"); +assert.sameValue(sample.includes(43, null), true, "null [1]"); + +assert.sameValue(sample.includes(42, undefined), true, "undefined [0]"); +assert.sameValue(sample.includes(43, undefined), true, "undefined [1]"); + +assert.sameValue(sample.includes(42, null), true, "null [0]"); +assert.sameValue(sample.includes(43, null), true, "null [1]"); + +assert.sameValue(sample.includes(42, obj), false, "object [0]"); +assert.sameValue(sample.includes(43, obj), true, "object [1]"); + diff --git a/test/staging/sm/Tuple/prototype/includes/using-fromindex.js b/test/staging/sm/Tuple/prototype/includes/using-fromindex.js new file mode 100644 index 0000000000..f111ebb7a4 --- /dev/null +++ b/test/staging/sm/Tuple/prototype/includes/using-fromindex.js @@ -0,0 +1,43 @@ +// Copyright (C) 2016 the V8 project authors. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +info: | + 22.1.3.11 Tuple.prototype.includes ( searchElement [ , fromIndex ] ) +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +features: +- record-tuple +description: | + pending +esid: pending +---*/ +var sample = #["a", "b", "c"]; +assert.sameValue(sample.includes("a", 0), true, "includes('a', 0)"); +assert.sameValue(sample.includes("a", 1), false, "includes('a', 1)"); +assert.sameValue(sample.includes("a", 2), false, "includes('a', 2)"); + +assert.sameValue(sample.includes("b", 0), true, "includes('b', 0)"); +assert.sameValue(sample.includes("b", 1), true, "includes('b', 1)"); +assert.sameValue(sample.includes("b", 2), false, "includes('b', 2)"); + +assert.sameValue(sample.includes("c", 0), true, "includes('c', 0)"); +assert.sameValue(sample.includes("c", 1), true, "includes('c', 1)"); +assert.sameValue(sample.includes("c", 2), true, "includes('c', 2)"); + +assert.sameValue(sample.includes("a", -1), false, "includes('a', -1)"); +assert.sameValue(sample.includes("a", -2), false, "includes('a', -2)"); +assert.sameValue(sample.includes("a", -3), true, "includes('a', -3)"); +assert.sameValue(sample.includes("a", -4), true, "includes('a', -4)"); + +assert.sameValue(sample.includes("b", -1), false, "includes('b', -1)"); +assert.sameValue(sample.includes("b", -2), true, "includes('b', -2)"); +assert.sameValue(sample.includes("b", -3), true, "includes('b', -3)"); +assert.sameValue(sample.includes("b", -4), true, "includes('b', -4)"); + +assert.sameValue(sample.includes("c", -1), true, "includes('c', -1)"); +assert.sameValue(sample.includes("c", -2), true, "includes('c', -2)"); +assert.sameValue(sample.includes("c", -3), true, "includes('c', -3)"); +assert.sameValue(sample.includes("c", -4), true, "includes('c', -4)"); + diff --git a/test/staging/sm/Tuple/prototype/indexOf/empty-tuple.js b/test/staging/sm/Tuple/prototype/indexOf/empty-tuple.js new file mode 100644 index 0000000000..373f26a98c --- /dev/null +++ b/test/staging/sm/Tuple/prototype/indexOf/empty-tuple.js @@ -0,0 +1,17 @@ +// Copyright (c) 2012 Ecma International. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +description: | + Tuple.prototype.indexOf returns -1 if 'length' is 0 (empty tuple) +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +features: +- record-tuple +esid: pending +---*/ +var i = #[].indexOf(42); + +assert.sameValue(i, -1); + diff --git a/test/staging/sm/Tuple/prototype/indexOf/fromIndex-boolean.js b/test/staging/sm/Tuple/prototype/indexOf/fromIndex-boolean.js new file mode 100644 index 0000000000..1a63cd38cd --- /dev/null +++ b/test/staging/sm/Tuple/prototype/indexOf/fromIndex-boolean.js @@ -0,0 +1,18 @@ +// Copyright (c) 2012 Ecma International. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +description: | + Tuple.prototype.indexOf when fromIndex is boolean +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +features: +- record-tuple +esid: pending +---*/ +let a = #[1, 2, 3]; + +assert.sameValue(a.indexOf(1, true), -1); +assert.sameValue(a.indexOf(1, false), 0); + diff --git a/test/staging/sm/Tuple/prototype/indexOf/fromIndex-float.js b/test/staging/sm/Tuple/prototype/indexOf/fromIndex-float.js new file mode 100644 index 0000000000..bcaf850982 --- /dev/null +++ b/test/staging/sm/Tuple/prototype/indexOf/fromIndex-float.js @@ -0,0 +1,19 @@ +// Copyright (c) 2012 Ecma International. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +description: | + Tuple.prototype.indexOf when fromIndex is floating point number +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +features: +- record-tuple +esid: pending +---*/ +var a = #[1,2,3]; + +assert.sameValue(a.indexOf(3, 0.49), 2); +assert.sameValue(a.indexOf(1, 0.51), 0); +assert.sameValue(a.indexOf(1, 1.51), -1); + diff --git a/test/staging/sm/Tuple/prototype/indexOf/fromIndex-greater-than-length.js b/test/staging/sm/Tuple/prototype/indexOf/fromIndex-greater-than-length.js new file mode 100644 index 0000000000..295f188d77 --- /dev/null +++ b/test/staging/sm/Tuple/prototype/indexOf/fromIndex-greater-than-length.js @@ -0,0 +1,19 @@ +// Copyright (c) 2012 Ecma International. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +description: | + Tuple.prototype.indexOf returns -1 if fromIndex is greater than Tuple length +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +features: +- record-tuple +esid: pending +---*/ +let a = #[1, 2, 3]; + +assert.sameValue(a.indexOf(1, 5), -1); +assert.sameValue(a.indexOf(1, 3), -1); +assert.sameValue(#[].indexOf(1, 0), -1); + diff --git a/test/staging/sm/Tuple/prototype/indexOf/fromIndex-infinity-string.js b/test/staging/sm/Tuple/prototype/indexOf/fromIndex-infinity-string.js new file mode 100644 index 0000000000..5de990ff16 --- /dev/null +++ b/test/staging/sm/Tuple/prototype/indexOf/fromIndex-infinity-string.js @@ -0,0 +1,15 @@ +// Copyright (c) 2012 Ecma International. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +description: | + Tuple.prototype.indexOf - value of 'fromIndex' is a string containing -Infinity +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +features: +- record-tuple +esid: pending +---*/ +assert.sameValue(#[true].indexOf(true, "-Infinity"), 0); + diff --git a/test/staging/sm/Tuple/prototype/indexOf/fromIndex-inherited-valueOf.js b/test/staging/sm/Tuple/prototype/indexOf/fromIndex-inherited-valueOf.js new file mode 100644 index 0000000000..950f53833b --- /dev/null +++ b/test/staging/sm/Tuple/prototype/indexOf/fromIndex-inherited-valueOf.js @@ -0,0 +1,36 @@ +// Copyright (c) 2012 Ecma International. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +esid: sec-array.prototype.indexof +description: | + Tuple.prototype.indexOf uses inherited valueOf method when value of 'fromIndex' is an object with an own toString and inherited valueOf methods +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +features: +- record-tuple +---*/ +var toStringAccessed = false; +var valueOfAccessed = false; + +var proto = { + valueOf: function() { + valueOfAccessed = true; + return 1; + } +}; + +var Con = function() {}; +Con.prototype = proto; + +var child = new Con(); +child.toString = function() { + toStringAccessed = true; + return 2; +}; + +assert.sameValue(#[0, true].indexOf(true, child), 1, '[0, true].indexOf(true, child)'); +assert.sameValue(valueOfAccessed, true); +assert.sameValue(toStringAccessed, false, 'toStringAccessed'); + diff --git a/test/staging/sm/Tuple/prototype/indexOf/fromIndex-missing.js b/test/staging/sm/Tuple/prototype/indexOf/fromIndex-missing.js new file mode 100644 index 0000000000..4ec1c9798d --- /dev/null +++ b/test/staging/sm/Tuple/prototype/indexOf/fromIndex-missing.js @@ -0,0 +1,20 @@ +// Copyright (c) 2012 Ecma International. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +esid: sec-array.prototype.indexof +description: | + Tuple.prototype.indexOf - 'fromIndex' isn't passed +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +features: +- record-tuple +---*/ +var arr = #[0, 1, 2, 3, 4]; +//'fromIndex' will be set as 0 if not passed by default + +assert.sameValue(arr.indexOf(0), arr.indexOf(0, 0), 'arr.indexOf(0)'); +assert.sameValue(arr.indexOf(2), arr.indexOf(2, 0), 'arr.indexOf(2)'); +assert.sameValue(arr.indexOf(4), arr.indexOf(4, 0), 'arr.indexOf(4)'); + diff --git a/test/staging/sm/Tuple/prototype/indexOf/fromIndex-nan.js b/test/staging/sm/Tuple/prototype/indexOf/fromIndex-nan.js new file mode 100644 index 0000000000..748001d20c --- /dev/null +++ b/test/staging/sm/Tuple/prototype/indexOf/fromIndex-nan.js @@ -0,0 +1,16 @@ +// Copyright (c) 2012 Ecma International. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +esid: sec-array.prototype.indexof +description: | + Tuple.prototype.indexOf - value of 'fromIndex' is a number (value is NaN) +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +features: +- record-tuple +---*/ +assert.sameValue(#[true].indexOf(true, NaN), 0, '[true].indexOf(true, NaN)'); +assert.sameValue(#[true].indexOf(true, -NaN), 0, '[true].indexOf(true, -NaN)'); + diff --git a/test/staging/sm/Tuple/prototype/indexOf/fromIndex-neg-infinity.js b/test/staging/sm/Tuple/prototype/indexOf/fromIndex-neg-infinity.js new file mode 100644 index 0000000000..b2c8cb8196 --- /dev/null +++ b/test/staging/sm/Tuple/prototype/indexOf/fromIndex-neg-infinity.js @@ -0,0 +1,15 @@ +// Copyright (c) 2012 Ecma International. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +description: | + Tuple.prototype.indexOf - value of 'fromIndex' is a number (value is -Infinity) +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +features: +- record-tuple +esid: pending +---*/ +assert.sameValue(#[true].indexOf(true, -Infinity), 0, '#[true].indexOf(true, -Infinity)'); + diff --git a/test/staging/sm/Tuple/prototype/indexOf/fromIndex-neg-zero.js b/test/staging/sm/Tuple/prototype/indexOf/fromIndex-neg-zero.js new file mode 100644 index 0000000000..d46f96f290 --- /dev/null +++ b/test/staging/sm/Tuple/prototype/indexOf/fromIndex-neg-zero.js @@ -0,0 +1,15 @@ +// Copyright (c) 2012 Ecma International. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +esid: sec-array.prototype.indexof +description: | + Tuple.prototype.indexOf - value of 'fromIndex' is a number (value is -0) +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +features: +- record-tuple +---*/ +assert.sameValue(#[true].indexOf(true, -0), 0, '#[true].indexOf(true, -0)'); + diff --git a/test/staging/sm/Tuple/prototype/indexOf/fromIndex-negative.js b/test/staging/sm/Tuple/prototype/indexOf/fromIndex-negative.js new file mode 100644 index 0000000000..eb55d216ff --- /dev/null +++ b/test/staging/sm/Tuple/prototype/indexOf/fromIndex-negative.js @@ -0,0 +1,18 @@ +// Copyright (c) 2012 Ecma International. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +description: | + Tuple.prototype.indexOf - value of 'fromIndex' is a number (value is negative number) +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +features: +- record-tuple +esid: pending +---*/ +var target = #[]; + +assert.sameValue(#[0, target, 2].indexOf(target, -1), -1, '[0, target, 2].indexOf(target, -1)'); +assert.sameValue(#[0, 1, target].indexOf(target, -1), 2, '[0, 1, target].indexOf(target, -1)'); + diff --git a/test/staging/sm/Tuple/prototype/indexOf/fromIndex-null.js b/test/staging/sm/Tuple/prototype/indexOf/fromIndex-null.js new file mode 100644 index 0000000000..75af7f4545 --- /dev/null +++ b/test/staging/sm/Tuple/prototype/indexOf/fromIndex-null.js @@ -0,0 +1,18 @@ +// Copyright (c) 2012 Ecma International. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +esid: sec-array.prototype.indexof +description: | + Tuple.prototype.indexOf returns 0 if fromIndex is null +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +features: +- record-tuple +---*/ +var a = #[1, 2, 3]; + +// null resolves to 0 +assert.sameValue(a.indexOf(1, null), 0, 'a.indexOf(1,null)'); + diff --git a/test/staging/sm/Tuple/prototype/indexOf/fromIndex-number.js b/test/staging/sm/Tuple/prototype/indexOf/fromIndex-number.js new file mode 100644 index 0000000000..94cbc2a210 --- /dev/null +++ b/test/staging/sm/Tuple/prototype/indexOf/fromIndex-number.js @@ -0,0 +1,15 @@ +// Copyright (c) 2012 Ecma International. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +esid: sec-array.prototype.indexof +description: | + Tuple.prototype.indexOf - value of 'fromIndex' is a number (value is 0) +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +features: +- record-tuple +---*/ +assert.sameValue(#[true].indexOf(true, 0), 0, '#[true].indexOf(true, 0)'); + diff --git a/test/staging/sm/Tuple/prototype/indexOf/fromIndex-object-not-primitive.js b/test/staging/sm/Tuple/prototype/indexOf/fromIndex-object-not-primitive.js new file mode 100644 index 0000000000..f174902321 --- /dev/null +++ b/test/staging/sm/Tuple/prototype/indexOf/fromIndex-object-not-primitive.js @@ -0,0 +1,34 @@ +// Copyright (c) 2012 Ecma International. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +description: | + Tuple.prototype.indexOf throws TypeError exception when value of 'fromIndex' is an object with toString and valueOf methods that don�t return primitive values +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +features: +- record-tuple +esid: pending +---*/ +var toStringAccessed = false; +var valueOfAccessed = false; +var fromIndex = { + toString: function() { + toStringAccessed = true; + return {}; + }, + + valueOf: function() { + valueOfAccessed = true; + return {}; + } +}; + +assertThrowsInstanceOf(function() { + #[0, true].indexOf(true, fromIndex); +}, TypeError); + +assert.sameValue(toStringAccessed, true); +assert.sameValue(valueOfAccessed, true); + diff --git a/test/staging/sm/Tuple/prototype/indexOf/fromIndex-object-valueOf-toString.js b/test/staging/sm/Tuple/prototype/indexOf/fromIndex-object-valueOf-toString.js new file mode 100644 index 0000000000..544bd39510 --- /dev/null +++ b/test/staging/sm/Tuple/prototype/indexOf/fromIndex-object-valueOf-toString.js @@ -0,0 +1,32 @@ +// Copyright (c) 2012 Ecma International. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +description: | + Tuple.prototype.indexOf - value of 'fromIndex' is an object that has an own valueOf method that returns an object and toString method that returns a string +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +features: +- record-tuple +esid: pending +---*/ +var toStringAccessed = false; +var valueOfAccessed = false; + +var fromIndex = { + toString: function() { + toStringAccessed = true; + return '1'; + }, + + valueOf: function() { + valueOfAccessed = true; + return {}; + } +}; + +assert.sameValue(#[0, true].indexOf(true, fromIndex), 1, '#[0, true].indexOf(true, fromIndex)'); +assert.sameValue(toStringAccessed, true); +assert.sameValue(valueOfAccessed, true); + diff --git a/test/staging/sm/Tuple/prototype/indexOf/fromIndex-object-valueOf.js b/test/staging/sm/Tuple/prototype/indexOf/fromIndex-object-valueOf.js new file mode 100644 index 0000000000..0a5420c12a --- /dev/null +++ b/test/staging/sm/Tuple/prototype/indexOf/fromIndex-object-valueOf.js @@ -0,0 +1,22 @@ +// Copyright (c) 2012 Ecma International. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +esid: sec-array.prototype.indexof +description: | + Tuple.prototype.indexOf - value of 'fromIndex' is an Object, which has an own valueOf method +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +features: +- record-tuple +---*/ +var fromIndex = { + valueOf: function() { + return 1; + } +}; + + +assert.sameValue(#[0, true].indexOf(true, fromIndex), 1, '#[0, true].indexOf(true, fromIndex)'); + diff --git a/test/staging/sm/Tuple/prototype/indexOf/fromIndex-object.js b/test/staging/sm/Tuple/prototype/indexOf/fromIndex-object.js new file mode 100644 index 0000000000..d18f998476 --- /dev/null +++ b/test/staging/sm/Tuple/prototype/indexOf/fromIndex-object.js @@ -0,0 +1,26 @@ +// Copyright (c) 2012 Ecma International. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +description: | + Tuple.prototype.indexOf - value of 'fromIndex' is an Object, which has an own toString method +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +features: +- record-tuple +esid: pending +---*/ +// objects inherit the default valueOf() method from Object +// that simply returns itself. Since the default valueOf() method +// does not return a primitive value, ES next tries to convert the object +// to a number by calling its toString() method and converting the +// resulting string to a number. +var fromIndex = { + toString: function() { + return '1'; + } +}; + +assert.sameValue(#[0, true].indexOf(true, fromIndex), 1, '#[0, true].indexOf(true, fromIndex)'); + diff --git a/test/staging/sm/Tuple/prototype/indexOf/fromIndex-positive.js b/test/staging/sm/Tuple/prototype/indexOf/fromIndex-positive.js new file mode 100644 index 0000000000..7a4c34bb7c --- /dev/null +++ b/test/staging/sm/Tuple/prototype/indexOf/fromIndex-positive.js @@ -0,0 +1,18 @@ +// Copyright (c) 2012 Ecma International. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +description: | + Tuple.prototype.indexOf - value of 'fromIndex' is a number (value is positive number) +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +features: +- record-tuple +esid: pending +---*/ +var target = #[]; + +assert.sameValue(#[0, target, 2].indexOf(target, 2), -1, '#[0, target, 2].indexOf(target, 2)'); +assert.sameValue(#[0, 1, target].indexOf(target, 2), 2, '#[0, 1, target].indexOf(target, 2)'); + diff --git a/test/staging/sm/Tuple/prototype/indexOf/fromIndex-side-effects-3.js b/test/staging/sm/Tuple/prototype/indexOf/fromIndex-side-effects-3.js new file mode 100644 index 0000000000..c17962471f --- /dev/null +++ b/test/staging/sm/Tuple/prototype/indexOf/fromIndex-side-effects-3.js @@ -0,0 +1,25 @@ +// Copyright (c) 2012 Ecma International. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +description: | + Tuple.prototype.indexOf - side effects produced by step 1 are visible when an exception occurs +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +features: +- record-tuple +esid: pending +---*/ +var stepFiveOccurs = false; +var fromIndex = { + valueOf: function() { + stepFiveOccurs = true; + return 0; + } +}; +assertThrowsInstanceOf(function() { + Tuple.prototype.indexOf.call(undefined, undefined, fromIndex); +}, TypeError); +assert.sameValue(stepFiveOccurs, false, 'stepFiveOccurs'); + diff --git a/test/staging/sm/Tuple/prototype/indexOf/fromIndex-string-2.js b/test/staging/sm/Tuple/prototype/indexOf/fromIndex-string-2.js new file mode 100644 index 0000000000..4ff8a6fc66 --- /dev/null +++ b/test/staging/sm/Tuple/prototype/indexOf/fromIndex-string-2.js @@ -0,0 +1,18 @@ +// Copyright (c) 2012 Ecma International. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +description: | + Tuple.prototype.indexOf when fromIndex is string +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +features: +- record-tuple +esid: pending +---*/ +var a = #[1, 2, 1, 2, 1, 2]; + +assert.sameValue(a.indexOf(2, "2"), 3, '"2" resolves to 2'); +assert.sameValue(a.indexOf(2, "one"), 1, '"one" resolves to 0'); + diff --git a/test/staging/sm/Tuple/prototype/indexOf/fromIndex-string-exponent.js b/test/staging/sm/Tuple/prototype/indexOf/fromIndex-string-exponent.js new file mode 100644 index 0000000000..b2d004de10 --- /dev/null +++ b/test/staging/sm/Tuple/prototype/indexOf/fromIndex-string-exponent.js @@ -0,0 +1,18 @@ +// Copyright (c) 2012 Ecma International. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +description: | + Tuple.prototype.indexOf - value of 'fromIndex' is a string containing an exponential number +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +features: +- record-tuple +esid: pending +---*/ +var target = #[]; + +assert.sameValue(#[0, 1, target, 3, 4].indexOf(target, "3E0"), -1, '#[0, 1, target, 3, 4].indexOf(target, "3E0")'); +assert.sameValue(#[0, 1, 2, target, 4].indexOf(target, "3E0"), 3, '#[0, 1, 2, target, 4].indexOf(target, "3E0")'); + diff --git a/test/staging/sm/Tuple/prototype/indexOf/fromIndex-string-hex.js b/test/staging/sm/Tuple/prototype/indexOf/fromIndex-string-hex.js new file mode 100644 index 0000000000..985b0a1d92 --- /dev/null +++ b/test/staging/sm/Tuple/prototype/indexOf/fromIndex-string-hex.js @@ -0,0 +1,18 @@ +// Copyright (c) 2012 Ecma International. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +esid: sec-array.prototype.indexof +description: | + Tuple.prototype.indexOf - value of 'fromIndex' is a string containing a hex number +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +features: +- record-tuple +---*/ +var target = #[]; + +assert.sameValue(#[0, 1, target, 3, 4].indexOf(target, "0x0003"), -1, '#[0, 1, target, 3, 4].indexOf(target, "0x0003")'); +assert.sameValue(#[0, 1, 2, target, 4].indexOf(target, "0x0003"), 3, '#[0, 1, 2, target, 4].indexOf(target, "0x0003")'); + diff --git a/test/staging/sm/Tuple/prototype/indexOf/fromIndex-string-leading-zeros.js b/test/staging/sm/Tuple/prototype/indexOf/fromIndex-string-leading-zeros.js new file mode 100644 index 0000000000..371de06bdf --- /dev/null +++ b/test/staging/sm/Tuple/prototype/indexOf/fromIndex-string-leading-zeros.js @@ -0,0 +1,18 @@ +// Copyright (c) 2012 Ecma International. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +description: | + Tuple.prototype.indexOf - value of 'fromIndex' which is a string containing a number with leading zeros +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +features: +- record-tuple +esid: pending +---*/ +var target = #[]; + +assert.sameValue(#[0, 1, target, 3, 4].indexOf(target, "0003.10"), -1, '#[0, 1, target, 3, 4].indexOf(target, "0003.10")'); +assert.sameValue(#[0, 1, 2, target, 4].indexOf(target, "0003.10"), 3, '#[0, 1, 2, target, 4].indexOf(target, "0003.10")'); + diff --git a/test/staging/sm/Tuple/prototype/indexOf/fromIndex-string-neg-infinity.js b/test/staging/sm/Tuple/prototype/indexOf/fromIndex-string-neg-infinity.js new file mode 100644 index 0000000000..e0b42b0658 --- /dev/null +++ b/test/staging/sm/Tuple/prototype/indexOf/fromIndex-string-neg-infinity.js @@ -0,0 +1,15 @@ +// Copyright (c) 2012 Ecma International. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +description: | + Tuple.prototype.indexOf - value of 'fromIndex' is a string containing -Infinity +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +features: +- record-tuple +esid: pending +---*/ +assert.sameValue(#[true].indexOf(true, "-Infinity"), 0, '#[true].indexOf(true, "-Infinity")'); + diff --git a/test/staging/sm/Tuple/prototype/indexOf/fromIndex-string-negative.js b/test/staging/sm/Tuple/prototype/indexOf/fromIndex-string-negative.js new file mode 100644 index 0000000000..fc9c8cd09a --- /dev/null +++ b/test/staging/sm/Tuple/prototype/indexOf/fromIndex-string-negative.js @@ -0,0 +1,16 @@ +// Copyright (c) 2012 Ecma International. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +description: | + Tuple.prototype.indexOf - value of 'fromIndex' is a string containing a negative number +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +features: +- record-tuple +esid: pending +---*/ +assert.sameValue(#[0, true, 2].indexOf(true, "-1"), -1, '#[0, true, 2].indexOf(true, "-1")'); +assert.sameValue(#[0, 1, true].indexOf(true, "-1"), 2, '#[0, 1, true].indexOf(true, "-1")'); + diff --git a/test/staging/sm/Tuple/prototype/indexOf/fromIndex-string.js b/test/staging/sm/Tuple/prototype/indexOf/fromIndex-string.js new file mode 100644 index 0000000000..fc9c8cd09a --- /dev/null +++ b/test/staging/sm/Tuple/prototype/indexOf/fromIndex-string.js @@ -0,0 +1,16 @@ +// Copyright (c) 2012 Ecma International. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +description: | + Tuple.prototype.indexOf - value of 'fromIndex' is a string containing a negative number +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +features: +- record-tuple +esid: pending +---*/ +assert.sameValue(#[0, true, 2].indexOf(true, "-1"), -1, '#[0, true, 2].indexOf(true, "-1")'); +assert.sameValue(#[0, 1, true].indexOf(true, "-1"), 2, '#[0, 1, true].indexOf(true, "-1")'); + diff --git a/test/staging/sm/Tuple/prototype/indexOf/fromIndex-trunc-2.js b/test/staging/sm/Tuple/prototype/indexOf/fromIndex-trunc-2.js new file mode 100644 index 0000000000..643cf49a8d --- /dev/null +++ b/test/staging/sm/Tuple/prototype/indexOf/fromIndex-trunc-2.js @@ -0,0 +1,18 @@ +// Copyright (c) 2012 Ecma International. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +esid: sec-array.prototype.indexof +description: | + Tuple.prototype.indexOf - 'fromIndex' is a negative non-integer, verify truncation occurs in the proper direction +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +features: +- record-tuple +---*/ +var target = #[]; + +assert.sameValue(#[0, target, 2].indexOf(target, -1.5), -1, '#[0, target, 2].indexOf(target, -1.5)'); +assert.sameValue(#[0, 1, target].indexOf(target, -1.5), 2, '#[0, 1, target].indexOf(target, -1.5)'); + diff --git a/test/staging/sm/Tuple/prototype/indexOf/fromIndex-trunc.js b/test/staging/sm/Tuple/prototype/indexOf/fromIndex-trunc.js new file mode 100644 index 0000000000..506adadfee --- /dev/null +++ b/test/staging/sm/Tuple/prototype/indexOf/fromIndex-trunc.js @@ -0,0 +1,18 @@ +// Copyright (c) 2012 Ecma International. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +esid: sec-array.prototype.indexof +description: | + Tuple.prototype.indexOf - 'fromIndex' is a positive non-integer, verify truncation occurs in the proper direction +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +features: +- record-tuple +---*/ +var target = #[]; + +assert.sameValue(#[0, target, 2].indexOf(target, 2.5), -1, '#[0, target, 2].indexOf(target, 2.5)'); +assert.sameValue(#[0, 1, target].indexOf(target, 2.5), 2, '#[0, 1, target].indexOf(target, 2.5)'); + diff --git a/test/staging/sm/Tuple/prototype/indexOf/fromIndex-undefined.js b/test/staging/sm/Tuple/prototype/indexOf/fromIndex-undefined.js new file mode 100644 index 0000000000..1149e4e034 --- /dev/null +++ b/test/staging/sm/Tuple/prototype/indexOf/fromIndex-undefined.js @@ -0,0 +1,18 @@ +// Copyright (c) 2012 Ecma International. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +description: | + Tuple.prototype.indexOf returns 0 if fromIndex is 'undefined' +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +features: +- record-tuple +esid: pending +---*/ +var a = #[1, 2, 3]; + +// undefined resolves to 0 +assert.sameValue(a.indexOf(1, undefined), 0, 'a.indexOf(1,undefined)'); + diff --git a/test/staging/sm/Tuple/prototype/indexOf/fromIndex-with-index.js b/test/staging/sm/Tuple/prototype/indexOf/fromIndex-with-index.js new file mode 100644 index 0000000000..4d31164242 --- /dev/null +++ b/test/staging/sm/Tuple/prototype/indexOf/fromIndex-with-index.js @@ -0,0 +1,19 @@ +// Copyright (c) 2012 Ecma International. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +description: | + Tuple.prototype.indexOf match on the first element, a middle element and the last element when 'fromIndex' is passed +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +features: +- record-tuple +esid: pending +---*/ +assert.sameValue(#[0, 1, 2, 3, 4].indexOf(0, 0), 0, '#[0, 1, 2, 3, 4].indexOf(0, 0)'); +assert.sameValue(#[0, 1, 2, 3, 4].indexOf(2, 1), 2, '#[0, 1, 2, 3, 4].indexOf(2, 1)'); +assert.sameValue(#[0, 1, 2, 3, 4].indexOf(2, 2), 2, '#[0, 1, 2, 3, 4].indexOf(2, 2)'); +assert.sameValue(#[0, 1, 2, 3, 4].indexOf(4, 2), 4, '#[0, 1, 2, 3, 4].indexOf(4, 2)'); +assert.sameValue(#[0, 1, 2, 3, 4].indexOf(4, 4), 4, '#[0, 1, 2, 3, 4].indexOf(4, 4)'); + diff --git a/test/staging/sm/Tuple/prototype/indexOf/fromIndex-zero.js b/test/staging/sm/Tuple/prototype/indexOf/fromIndex-zero.js new file mode 100644 index 0000000000..8b2660991f --- /dev/null +++ b/test/staging/sm/Tuple/prototype/indexOf/fromIndex-zero.js @@ -0,0 +1,15 @@ +// Copyright (c) 2012 Ecma International. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +description: | + Tuple.prototype.indexOf - value of 'fromIndex' is a number (value is +0) +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +features: +- record-tuple +esid: pending +---*/ +assert.sameValue(#[true].indexOf(true, +0), 0, '#[true].indexOf(true, +0)'); + diff --git a/test/staging/sm/Tuple/prototype/indexOf/includes.js b/test/staging/sm/Tuple/prototype/indexOf/includes.js new file mode 100644 index 0000000000..02d1d2021e --- /dev/null +++ b/test/staging/sm/Tuple/prototype/indexOf/includes.js @@ -0,0 +1,29 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +features: +- record-tuple +description: | + pending +esid: pending +---*/ +/* +8.2.3.7 Tuple.prototype.includes ( searchElement [ , fromIndex ] ) +Tuple.prototype.includes is a distinct function that implements the same algorithm as Array.prototype.includes as defined in 22.1.3.13 except that ? thisTupleValue(this value) is used instead of directly accessing the this value. The implementation of the algorithm may be optimized with the knowledge that the this value is an object that has a fixed length and whose integer-indexed properties are not sparse, do not change, and their access is not observable. However, such optimization must not introduce any observable changes in the specified behaviour of the algorithm. + +This function is not generic, since thisTupleValue(this value) can return an abrupt completion: in that case, that exception is thrown instead of evaluating the algorithm. +*/ + +/* Step 1 */ +/* includes() should throw on a non-Tuple */ +let method = Tuple.prototype.includes; +assert.sameValue(method.call(#[1,2,3,4,5,6], 2), true); +assert.sameValue(method.call(Object(#[1,2,3,4,5,6]), 2), true); +assertThrowsInstanceOf(() => method.call("monkeys", 2), TypeError, + "value of TupleObject must be a Tuple"); + +/* Not sure what else to test, since it just calls the array method */ diff --git a/test/staging/sm/Tuple/prototype/indexOf/length-internal.js b/test/staging/sm/Tuple/prototype/indexOf/length-internal.js new file mode 100644 index 0000000000..2f36138fa8 --- /dev/null +++ b/test/staging/sm/Tuple/prototype/indexOf/length-internal.js @@ -0,0 +1,25 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +features: +- record-tuple +description: | + pending +esid: pending +---*/ +/* Tuples should have a length ownProperty that can't be overridden, which will + * be read by any built-in methods called on Tuples. + * This test is expected to fail until the spec change in + * https://github.com/tc39/proposal-record-tuple/issues/282 is implemented. + */ + +/* +t = #[1,2,3]; +Object.defineProperty(Tuple.prototype, "length", {value: 0}); +assert.sameValue(t.includes(2), true); +*/ + diff --git a/test/staging/sm/Tuple/prototype/indexOf/length.js b/test/staging/sm/Tuple/prototype/indexOf/length.js new file mode 100644 index 0000000000..d6498bf701 --- /dev/null +++ b/test/staging/sm/Tuple/prototype/indexOf/length.js @@ -0,0 +1,38 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +features: +- record-tuple +description: | + pending +esid: pending +---*/ +var desc = Object.getOwnPropertyDescriptor(Tuple.prototype.indexOf, "length"); +assert.sameValue(desc.value, 1); +assert.sameValue(desc.writable, false); +assert.sameValue(desc.enumerable, false); +assert.sameValue(desc.configurable, true); + + +desc = Object.getOwnPropertyDescriptor(Tuple.prototype.indexOf, "name"); +assert.sameValue(desc.value, "indexOf"); +assert.sameValue(desc.writable, false); +assert.sameValue(desc.enumerable, false); +assert.sameValue(desc.configurable, true); + +desc = Object.getOwnPropertyDescriptor(Tuple.prototype, "indexOf"); +assert.sameValue(desc.writable, true); +assert.sameValue(desc.enumerable, false); +assert.sameValue(desc.configurable, true); + +assert.sameValue(isConstructor(Tuple.prototype.indexOf), false); + +assertThrowsInstanceOf(() => { + let t = #[1]; + new t.indexOf(); +}, TypeError, '`let t = #[1]; new t.indexOf()` throws TypeError'); + diff --git a/test/staging/sm/Tuple/prototype/indexOf/undefined-throws-type-error.js b/test/staging/sm/Tuple/prototype/indexOf/undefined-throws-type-error.js new file mode 100644 index 0000000000..fd1a163334 --- /dev/null +++ b/test/staging/sm/Tuple/prototype/indexOf/undefined-throws-type-error.js @@ -0,0 +1,22 @@ +// Copyright (c) 2012 Ecma International. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +description: | + Tuple.prototype.indexOf applied to undefined throws a TypeError +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +features: +- record-tuple +esid: pending +---*/ + +assertThrowsInstanceOf(function() { + Tuple.prototype.indexOf.call(undefined); +}, TypeError); + +assertThrowsInstanceOf(function() { + Tuple.prototype.indexOf.call(null); +}, TypeError); + diff --git a/test/staging/sm/Tuple/prototype/indexOf/uses-internal-length.js b/test/staging/sm/Tuple/prototype/indexOf/uses-internal-length.js new file mode 100644 index 0000000000..338c6ef21d --- /dev/null +++ b/test/staging/sm/Tuple/prototype/indexOf/uses-internal-length.js @@ -0,0 +1,19 @@ +// Copyright (c) 2012 Ecma International. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +description: | + Tuple.prototype.indexOf - 'length' is own data property that overrides an inherited data property on an Tuple +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +features: +- record-tuple +esid: pending +---*/ +var target = #[]; + +Tuple.prototype.length = 0; + +assert.sameValue(#[0, target].indexOf(target), 1, '#[0, target].indexOf(target)'); + diff --git a/test/staging/sm/Tuple/prototype/isTuple/isTuple.js b/test/staging/sm/Tuple/prototype/isTuple/isTuple.js new file mode 100644 index 0000000000..582a86cf37 --- /dev/null +++ b/test/staging/sm/Tuple/prototype/isTuple/isTuple.js @@ -0,0 +1,56 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +features: +- record-tuple +description: | + pending +esid: pending +---*/ +var f = Tuple.isTuple; + +assert.sameValue(typeof f, "function"); +assert.sameValue(f.length, 1); +assert.sameValue(f(#[]), true); +assert.sameValue(f(#[1]), true); +assert.sameValue(f(#[1,2,3]), true); +assert.sameValue(f(Object(#[])), true); +assert.sameValue(f(Object(#[1])), true); +assert.sameValue(f(Object(#[1,2,3])), true); + +for (thing of [42, new Number(-42), undefined, true, false, "abc" , new String("a\nb\\!"), {}, [], [1,2,3], new Uint8Array(1,2,3), null, new RegExp(), JSON, new SyntaxError(), function() {}, Math, new Date()]) { + assert.sameValue(f(thing), false); +} +assert.sameValue(f(Tuple.prototype), false); +var arg; +(function fun() { arg = arguments; }(1,2,3)); +assert.sameValue(f(arg), false); +assert.sameValue(f(this), false); + +var proto = []; +var Con = function() {}; +Con.prototype = proto; + +var child = new Con(); + +assert.sameValue(f(child), false); + +var proto = Tuple.prototype; +var Con = function() {}; +Con.prototype = proto; + +var child = new Con(); + +assert.sameValue(f(child), false); + +assert.sameValue(f({ + 0: 12, + 1: 9, + length: 2 +}), false); + + diff --git a/test/staging/sm/Tuple/prototype/isTuple/length.js b/test/staging/sm/Tuple/prototype/isTuple/length.js new file mode 100644 index 0000000000..b044ed5c4a --- /dev/null +++ b/test/staging/sm/Tuple/prototype/isTuple/length.js @@ -0,0 +1,33 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +features: +- record-tuple +description: | + pending +esid: pending +---*/ +var desc = Object.getOwnPropertyDescriptor(Tuple.isTuple, "length"); +assert.sameValue(desc.value, 1); +assert.sameValue(desc.writable, false); +assert.sameValue(desc.enumerable, false); +assert.sameValue(desc.configurable, true); + + +desc = Object.getOwnPropertyDescriptor(Tuple.isTuple, "name"); +assert.sameValue(desc.value, "isTuple"); +assert.sameValue(desc.writable, false); +assert.sameValue(desc.enumerable, false); +assert.sameValue(desc.configurable, true); + +assert.sameValue(isConstructor(Tuple.isTuple), false); + +assertThrowsInstanceOf(() => { + let t = #[1]; + new t.isTuple()(); +}, TypeError, '`let t = #[1]; new t.isTuple()` throws TypeError'); + diff --git a/test/staging/sm/Tuple/prototype/join/dda-separator.js b/test/staging/sm/Tuple/prototype/join/dda-separator.js new file mode 100644 index 0000000000..1d4958f6ae --- /dev/null +++ b/test/staging/sm/Tuple/prototype/join/dda-separator.js @@ -0,0 +1,28 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +features: +- IsHTMLDDA +- record-tuple +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ + +let dda = createIsHTMLDDA(); + +assert.sameValue(dda == null, true); +assert.sameValue(dda === null, false); + +assert.sameValue(dda == undefined, true); +assert.sameValue(dda === undefined, false); + +let tup = Tuple("A", "B"); +assert.sameValue(tup.join(null), "A,B"); +assert.sameValue(tup.join(undefined), "A,B"); +assert.sameValue(tup.join(dda), "A" + dda.toString() + "B"); + diff --git a/test/staging/sm/Tuple/prototype/length/length-getter.js b/test/staging/sm/Tuple/prototype/length/length-getter.js new file mode 100644 index 0000000000..ba5344d810 --- /dev/null +++ b/test/staging/sm/Tuple/prototype/length/length-getter.js @@ -0,0 +1,46 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +esid: sec-get-%tuple%.prototype.length +info: | + get %Tuple%.prototype.length + + Tuple.prototype.length is an accessor property whose set accessor function is undefined. Its get accessor function performs the following steps: + + 1. Let T be ? thisTupleValue(this value). + 2. Let size be the length of T.[[Sequence]]. + 3. Return size. +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +features: +- record-tuple +description: | + pending +---*/ +/* Section 8.2.3.2 */ + +let TuplePrototype = Tuple.prototype; +let desc = Object.getOwnPropertyDescriptor(TuplePrototype, "length"); + +assert.sameValue(typeof desc.get, "function"); + +assert.sameValue(desc.enumerable, false); +assert.sameValue(desc.configurable, true); + +assert.sameValue(desc.set, undefined); + +let values = [[#[1,2,3], 3], [#[1], 1], [#[], 0]]; + +for (pair of values) { + let tup = pair[0]; + let len = pair[1]; + assert.sameValue(desc.get.call(tup), len); + assert.sameValue(desc.get.call(Object(tup)), len); + assert.sameValue(tup["length"], len); +} + +assertThrowsInstanceOf(() => desc.get.call("monkeys"), TypeError, "get length method called on incompatible string"); +assertThrowsInstanceOf(() => desc.get.call(new Object()), TypeError, "get length method called on incompatible Object"); + diff --git a/test/staging/sm/Tuple/prototype/map/callback-not-called-on-empty.js b/test/staging/sm/Tuple/prototype/map/callback-not-called-on-empty.js new file mode 100644 index 0000000000..2a41d19b06 --- /dev/null +++ b/test/staging/sm/Tuple/prototype/map/callback-not-called-on-empty.js @@ -0,0 +1,17 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +features: +- record-tuple +description: | + pending +esid: pending +---*/ +var called = 0; +#[].map(() => called++); +assert.sameValue(called, 0); + diff --git a/test/staging/sm/Tuple/prototype/map/callbackfn-arguments-with-thisarg.js b/test/staging/sm/Tuple/prototype/map/callbackfn-arguments-with-thisarg.js new file mode 100644 index 0000000000..b2c41399aa --- /dev/null +++ b/test/staging/sm/Tuple/prototype/map/callbackfn-arguments-with-thisarg.js @@ -0,0 +1,44 @@ +// Copyright (C) 2016 the V8 project authors. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. +/*--- +esid: sec-%Tuple%.prototype.map +description: | + callbackfn arguments +info: | + 8.2.3.20 %Tuple%.prototype.map ( callbackfn [ , thisArg ] ) + + ... + 7. Repeat, while k < len, + a. Let kValue be list[k]. + b. Let mappedValue be ? Call(callbackfn, thisArg, « kValue, k, T »). + ... +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +features: +- record-tuple +---*/ +var sample = #[42,43,44]; +var results = []; +var thisArg = ["monkeys", 0, "bunnies", 0]; + +sample.map(function() { results.push(arguments); return 0; }, thisArg); + +assert.sameValue(results.length, 3); +assert.sameValue(thisArg.length, 4); + +assert.sameValue(results[0].length, 3); +assert.sameValue(results[0][0], 42); +assert.sameValue(results[0][1], 0); +assert.sameValue(results[0][2], sample); + +assert.sameValue(results[1].length, 3); +assert.sameValue(results[1][0], 43); +assert.sameValue(results[1][1], 1); +assert.sameValue(results[1][2], sample); + +assert.sameValue(results[2].length, 3); +assert.sameValue(results[2][0], 44); +assert.sameValue(results[2][1], 2); +assert.sameValue(results[2][2], sample); + diff --git a/test/staging/sm/Tuple/prototype/map/callbackfn-arguments-without-thisarg.js b/test/staging/sm/Tuple/prototype/map/callbackfn-arguments-without-thisarg.js new file mode 100644 index 0000000000..23d271607f --- /dev/null +++ b/test/staging/sm/Tuple/prototype/map/callbackfn-arguments-without-thisarg.js @@ -0,0 +1,46 @@ +// Copyright (C) 2016 the V8 project authors. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. +/*--- +esid: sec-%Tuple%.prototype.map +description: | + callbackfn arguments +info: | + 8.2.3.20 %Tuple%.prototype.map ( callbackfn [ , thisArg ] ) + + ... + 7. Repeat, while k < len, + a. Let kValue be list[k]. + b. Let mappedValue be ? Call(callbackfn, thisArg, « kValue, k, T »). + ... +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +features: +- record-tuple +---*/ +var sample = #[42,43,44]; + +var results = []; + +sample.map(function() { + results.push(arguments); + return 0; +}); + +assert.sameValue(results.length, 3); + +assert.sameValue(results[0].length, 3); +assert.sameValue(results[0][0], 42); +assert.sameValue(results[0][1], 0); +assert.sameValue(results[0][2], sample); + +assert.sameValue(results[1].length, 3); +assert.sameValue(results[1][0], 43); +assert.sameValue(results[1][1], 1); +assert.sameValue(results[1][2], sample); + +assert.sameValue(results[2].length, 3); +assert.sameValue(results[2][0], 44); +assert.sameValue(results[2][1], 2); +assert.sameValue(results[2][2], sample); + diff --git a/test/staging/sm/Tuple/prototype/map/callbackfn-is-not-callable.js b/test/staging/sm/Tuple/prototype/map/callbackfn-is-not-callable.js new file mode 100644 index 0000000000..4008fb251f --- /dev/null +++ b/test/staging/sm/Tuple/prototype/map/callbackfn-is-not-callable.js @@ -0,0 +1,41 @@ +// Copyright (C) 2016 the V8 project authors. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. +/*--- +esid: sec-%Tuple%.prototype.map +description: | + callbackfn arguments +info: | + 8.2.3.20 %Tuple%.prototype.map ( callbackfn [ , thisArg ] ) + + ... + 4. If IsCallable(callbackfn) is false, throw a TypeError exception. + ... +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +features: +- record-tuple +---*/ +var sample = #[1,2,3]; + +assertThrowsInstanceOf(() => sample.map(), TypeError, + "map: callbackfn is not callable (no argument)"); + +assertThrowsInstanceOf(() => sample.map(undefined), TypeError, + "map: callbackfn is not callable (undefined)"); + +assertThrowsInstanceOf(() => sample.map(null), TypeError, + "map: callbackfn is not callable (null)"); + +assertThrowsInstanceOf(() => sample.map({}), TypeError, + "map: callbackfn is not callable ({})"); + +assertThrowsInstanceOf(() => sample.map(1), TypeError, + "map: callbackfn is not callable (1)"); + +assertThrowsInstanceOf(() => sample.map(""), TypeError, + "map: callbackfn is not callable (\"\")"); + +assertThrowsInstanceOf(() => sample.map(false), TypeError, + "map: callbackfn is not callable (false)"); + diff --git a/test/staging/sm/Tuple/prototype/map/callbackfn-returns-abrupt.js b/test/staging/sm/Tuple/prototype/map/callbackfn-returns-abrupt.js new file mode 100644 index 0000000000..0675bf6a6d --- /dev/null +++ b/test/staging/sm/Tuple/prototype/map/callbackfn-returns-abrupt.js @@ -0,0 +1,19 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +features: +- record-tuple +description: | + pending +esid: pending +---*/ +var sample = #[1,2,3]; + +assertThrowsInstanceOf(() => sample.map(function () { throw new TypeError("monkeys"); }), + TypeError, + "should throw TypeError: monkeys"); + diff --git a/test/staging/sm/Tuple/prototype/map/indexed-setters.js b/test/staging/sm/Tuple/prototype/map/indexed-setters.js new file mode 100644 index 0000000000..822adff93e --- /dev/null +++ b/test/staging/sm/Tuple/prototype/map/indexed-setters.js @@ -0,0 +1,22 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +features: +- record-tuple +description: | + pending +esid: pending +---*/ + +// If an indexed Array setter is overridden, TupleMap shouldn't use it +// when constructing the intermediate array + +z = 5; +Object.defineProperty(Array.prototype, '0', { set: function(y) { z = 42; }}); +newT = #[1,2,3].map(x => x*x); +assert.sameValue(z, 5); + diff --git a/test/staging/sm/Tuple/prototype/map/invoked-as-func.js b/test/staging/sm/Tuple/prototype/map/invoked-as-func.js new file mode 100644 index 0000000000..f2cc351d69 --- /dev/null +++ b/test/staging/sm/Tuple/prototype/map/invoked-as-func.js @@ -0,0 +1,17 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +features: +- record-tuple +description: | + pending +esid: pending +---*/ +var map = Tuple.prototype.map; + +assert.sameValue(typeof map, 'function'); + diff --git a/test/staging/sm/Tuple/prototype/map/invoked-as-method.js b/test/staging/sm/Tuple/prototype/map/invoked-as-method.js new file mode 100644 index 0000000000..25b17b876b --- /dev/null +++ b/test/staging/sm/Tuple/prototype/map/invoked-as-method.js @@ -0,0 +1,21 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +features: +- record-tuple +description: | + pending +esid: pending +---*/ +var TuplePrototype = Tuple.prototype; + +assert.sameValue(typeof TuplePrototype.map, 'function'); + +assertThrowsInstanceOf(function() { + TuplePrototype.map(); +}, TypeError, "Tuple.prototype.map() with no argument"); + diff --git a/test/staging/sm/Tuple/prototype/map/length-internal.js b/test/staging/sm/Tuple/prototype/map/length-internal.js new file mode 100644 index 0000000000..0e89ac5b04 --- /dev/null +++ b/test/staging/sm/Tuple/prototype/map/length-internal.js @@ -0,0 +1,28 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +features: +- record-tuple +description: | + pending +esid: pending +---*/ +Object.defineProperty(Tuple.prototype, "length", {value: 0}); +let t = #[1,2,3]; +var result = t.map(x => x + 1); +// overriding length shouldn't have an effect +assert.sameValue(result, #[2,3,4]); + + +Object.defineProperty(Tuple.prototype, "length", { + get() { return 0 } +}); +let u = #[1,2,3]; +var result = u.map(x => x + 1); +// overriding length shouldn't have an effect +assert.sameValue(result, #[2,3,4]); + diff --git a/test/staging/sm/Tuple/prototype/map/length.js b/test/staging/sm/Tuple/prototype/map/length.js new file mode 100644 index 0000000000..09c6b684a8 --- /dev/null +++ b/test/staging/sm/Tuple/prototype/map/length.js @@ -0,0 +1,38 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +features: +- record-tuple +description: | + pending +esid: pending +---*/ +var desc = Object.getOwnPropertyDescriptor(Tuple.prototype.map, "length"); +assert.sameValue(desc.value, 1); +assert.sameValue(desc.writable, false); +assert.sameValue(desc.enumerable, false); +assert.sameValue(desc.configurable, true); + + +desc = Object.getOwnPropertyDescriptor(Tuple.prototype.map, "name"); +assert.sameValue(desc.value, "map"); +assert.sameValue(desc.writable, false); +assert.sameValue(desc.enumerable, false); +assert.sameValue(desc.configurable, true); + +desc = Object.getOwnPropertyDescriptor(Tuple.prototype, "map"); +assert.sameValue(desc.writable, true); +assert.sameValue(desc.enumerable, false); +assert.sameValue(desc.configurable, true); + +assert.sameValue(isConstructor(Tuple.prototype.map), false); + +assertThrowsInstanceOf(() => { + let t = #[1]; + new t.map(); +}, TypeError, '`let t = #[1]; new t.map()` throws TypeError'); + diff --git a/test/staging/sm/Tuple/prototype/map/map.js b/test/staging/sm/Tuple/prototype/map/map.js new file mode 100644 index 0000000000..ecdb5c39e6 --- /dev/null +++ b/test/staging/sm/Tuple/prototype/map/map.js @@ -0,0 +1,96 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +features: +- record-tuple +description: | + pending +esid: pending +---*/ +/* +8.2.3.20 Tuple.prototype.map ( callbackfn [ , thisArg ] ) +NOTE +callbackfn should be a function that accepts three arguments. map calls callbackfn once for each element in the Tuple, in ascending order, and constructs a new tuple from the results. + +If a thisArg parameter is provided, it will be used as the this value for each invocation of callbackfn. If it is not provided, undefined is used instead. + +callbackfn is called with three arguments: the value of the element, the index of the element, and the Tuple being traversed. + +When the map method is called with one or two arguments, the following steps are taken: + +1. Let T be ? thisTupleValue(this value). +2. Let list be T.[[Sequence]]. +3. Let len be the number of elements in list. +4. If IsCallable(callbackfn) is false, throw a TypeError exception. +5. Let newList be a new empty List. +6. Let k be 0. +7. Repeat, while k < len, +a. Let kValue be list[k]. +b. Let mappedValue be ? Call(callbackfn, thisArg, « kValue, k, T »). +c. If Type(mappedValue) is Object, throw a TypeError exception. +d. Append mappedValue to the end of list newList. +e. Set k to k + 1. +8. Return a new Tuple value whose [[Sequence]] is newList. + +*/ + +/* Step 1 */ +/* map() should throw on a non-Tuple */ +let method = Tuple.prototype.map; +let f = (x, i, tup) => x + 1; +assert.sameValue(method.call(#[1,2,3,4,5,6],f), #[2,3,4,5,6,7]); +assert.sameValue(method.call(Object(#[1,2,3,4,5,6]), f), #[2,3,4,5,6,7]); +assertThrowsInstanceOf(() => method.call("monkeys", f), TypeError, + "value of TupleObject must be a Tuple"); + +let tup = #[1,2,3]; + +/* Step 4 */ +/* callbackfn not callable -- should throw */ +assertThrowsInstanceOf(() => tup.map(), TypeError, + "missing function argument to Tuple.prototype.map"); +assertThrowsInstanceOf(() => tup.map(undefined), TypeError, + "missing function argument to Tuple.prototype.map"); +assertThrowsInstanceOf(() => tup.map("monkeys"), TypeError, + "bad function argument to Tuple.prototype.map"); + + +/* callbackfn with 1 argument -- should be allowed */ +var f2 = x => x * x; +assert.sameValue(tup.map(f2), #[1, 4, 9]); + +/* callbackfn with 2 arguments -- should be allowed */ +f2 = (x, i) => x + i; +assert.sameValue(tup.map(f2), #[1, 3, 5]); + +/* callbackfn with > 3 arguments -- subsequent ones will be undefined */ +var f3 = (a, b, c, d, e) => e === undefined; +assert.sameValue(tup.map(f3), #[true, true, true]); + +/* callbackfn should be able to use index and tuple */ +var f4 = (x, i, tup) => (tup.indexOf(x+1) * i * x); +assert.sameValue(tup.map(f4), #[0, 4, -6]); + +/* explicit thisArg */ +f1 = function (x, i, tup) { return(this.elements.indexOf(x) * x); }; +assert.sameValue(#[1,2,3,4,5].map(f1, { elements: [2, 4] }), #[-1, 0, -3, 4, -5]); + +/* Step 3 */ +/* Test that length is still handled correctly if it's overridden */ +Object.defineProperty(Tuple.prototype, "length", { get() { return 0 } }) +assert.sameValue(tup.map(f), #[2,3,4]); + +/* Step 7 */ +assert.sameValue(#[].map(f), #[]); +assert.sameValue(#[1].map(f), #[2]); +assert.sameValue(#[1,2].map(f), #[2,3]); + +/* Step 7c. */ +var badFun = x => new Object(x); +assertThrowsInstanceOf(() => tup.map(badFun), + TypeError, "Tuples cannot contain Objects"); + diff --git a/test/staging/sm/Tuple/prototype/map/this-is-not-tuple.js b/test/staging/sm/Tuple/prototype/map/this-is-not-tuple.js new file mode 100644 index 0000000000..27bf783f9d --- /dev/null +++ b/test/staging/sm/Tuple/prototype/map/this-is-not-tuple.js @@ -0,0 +1,30 @@ +// Copyright (C) 2016 the V8 project authors. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. +/*--- +esid: sec-%typedarray%.prototype.map +description: | + Throws a TypeError exception when `this` is not a Tuple +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +features: +- record-tuple +---*/ +var map = Tuple.prototype.map; +var callbackfn = function() {}; + +var thisVals = [[undefined, "undefined"], + [null, "null"], + [42, "42"], + ["1", "1"], + [true, "true"], + [false, "false"], + [Symbol("s"), "Symbol(\"s\")"]]; + +for (pair of thisVals) { + thisVal = pair[0]; + errorMsg = "this is: " + pair[1]; + assertThrowsInstanceOf(() => map.call(thisVal, callbackfn), + TypeError, errorMsg); +} + diff --git a/test/staging/sm/Tuple/prototype/slice/invoked-as-func.js b/test/staging/sm/Tuple/prototype/slice/invoked-as-func.js new file mode 100644 index 0000000000..066ad65727 --- /dev/null +++ b/test/staging/sm/Tuple/prototype/slice/invoked-as-func.js @@ -0,0 +1,18 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +features: +- record-tuple +description: | + pending +esid: pending +---*/ +var slice = Tuple.prototype.slice; + +assertThrowsInstanceOf(function() { slice() }, TypeError, + "value of TupleObject must be a Tuple"); + diff --git a/test/staging/sm/Tuple/prototype/slice/invoked-as-method.js b/test/staging/sm/Tuple/prototype/slice/invoked-as-method.js new file mode 100644 index 0000000000..cb44e9c42c --- /dev/null +++ b/test/staging/sm/Tuple/prototype/slice/invoked-as-method.js @@ -0,0 +1,20 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +features: +- record-tuple +description: | + pending +esid: pending +---*/ +var TuplePrototype = Tuple.prototype; + +assert.sameValue(typeof TuplePrototype.slice, 'function'); + +assertThrowsInstanceOf(function() { TuplePrototype.slice() }, TypeError, + "value of TupleObject must be a Tuple"); + diff --git a/test/staging/sm/Tuple/prototype/slice/length.js b/test/staging/sm/Tuple/prototype/slice/length.js new file mode 100644 index 0000000000..4813f58f53 --- /dev/null +++ b/test/staging/sm/Tuple/prototype/slice/length.js @@ -0,0 +1,37 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +features: +- record-tuple +description: | + pending +esid: pending +---*/ +var desc = Object.getOwnPropertyDescriptor(Tuple.prototype.slice, "length"); +assert.sameValue(desc.value, 2); +assert.sameValue(desc.writable, false); +assert.sameValue(desc.enumerable, false); +assert.sameValue(desc.configurable, true); + +desc = Object.getOwnPropertyDescriptor(Tuple.prototype.slice, "name"); +assert.sameValue(desc.value, "slice"); +assert.sameValue(desc.writable, false); +assert.sameValue(desc.enumerable, false); +assert.sameValue(desc.configurable, true); + +desc = Object.getOwnPropertyDescriptor(Tuple.prototype, "slice"); +assert.sameValue(desc.writable, true); +assert.sameValue(desc.enumerable, false); +assert.sameValue(desc.configurable, true); + +assert.sameValue(isConstructor(Tuple.prototype.slice), false); + +assertThrowsInstanceOf(() => { + let t = #[1]; + new t.slice(); +}, TypeError, '`let t = #[1]; new t.slice()` throws TypeError'); + diff --git a/test/staging/sm/Tuple/prototype/slice/name.js b/test/staging/sm/Tuple/prototype/slice/name.js new file mode 100644 index 0000000000..d7dfd67977 --- /dev/null +++ b/test/staging/sm/Tuple/prototype/slice/name.js @@ -0,0 +1,20 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +features: +- record-tuple +description: | + pending +esid: pending +---*/ + +var desc = Object.getOwnPropertyDescriptor(Tuple.prototype.slice, "name"); +assert.sameValue(desc.value, "slice"); +assert.sameValue(desc.writable, false); +assert.sameValue(desc.enumerable, false); +assert.sameValue(desc.configurable, true); + diff --git a/test/staging/sm/Tuple/prototype/slice/negative-zero.js b/test/staging/sm/Tuple/prototype/slice/negative-zero.js new file mode 100644 index 0000000000..6bba31f1f9 --- /dev/null +++ b/test/staging/sm/Tuple/prototype/slice/negative-zero.js @@ -0,0 +1,21 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +features: +- record-tuple +description: | + pending +esid: pending +---*/ + +var sample = #[40,41,42,43]; + +assert.sameValue(sample.slice(-0), sample); +assert.sameValue(sample.slice(-0, 4), sample); +assert.sameValue(sample.slice(0, -0), #[]); +assert.sameValue(sample.slice(-0, -0), #[]); + diff --git a/test/staging/sm/Tuple/prototype/slice/not-a-constructor.js b/test/staging/sm/Tuple/prototype/slice/not-a-constructor.js new file mode 100644 index 0000000000..965b345a8f --- /dev/null +++ b/test/staging/sm/Tuple/prototype/slice/not-a-constructor.js @@ -0,0 +1,21 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +features: +- record-tuple +description: | + pending +esid: pending +---*/ + +assert.sameValue(isConstructor(Tuple.prototype.slice), false); + +assertThrowsInstanceOf(() => { + let t = #[1]; + new t.slice(); +}, TypeError, '`let t = #[1]; new t.slice()` throws TypeError'); + diff --git a/test/staging/sm/Tuple/prototype/slice/prop-desc.js b/test/staging/sm/Tuple/prototype/slice/prop-desc.js new file mode 100644 index 0000000000..18e986435a --- /dev/null +++ b/test/staging/sm/Tuple/prototype/slice/prop-desc.js @@ -0,0 +1,20 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +features: +- record-tuple +description: | + pending +esid: pending +---*/ + +var desc = Object.getOwnPropertyDescriptor(Tuple.prototype, "slice"); +assert.sameValue(desc.writable, true); +assert.sameValue(desc.enumerable, false); +assert.sameValue(desc.configurable, true); +assert.sameValue(typeof Tuple.prototype.slice, 'function'); + diff --git a/test/staging/sm/Tuple/prototype/slice/return-abrupt-from-end.js b/test/staging/sm/Tuple/prototype/slice/return-abrupt-from-end.js new file mode 100644 index 0000000000..36b6c38a07 --- /dev/null +++ b/test/staging/sm/Tuple/prototype/slice/return-abrupt-from-end.js @@ -0,0 +1,24 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +features: +- record-tuple +description: | + pending +esid: pending +---*/ + +var o1 = { valueOf: function() { throw new SyntaxError(); } }; +var o2 = { toString: function() { throw new SyntaxError(); } }; + +var sample = #[]; + +assertThrowsInstanceOf(() => sample.slice(0, o1), + SyntaxError, "valueOf throws"); +assertThrowsInstanceOf(() => sample.slice(0, o2), + SyntaxError, "toString throws"); + diff --git a/test/staging/sm/Tuple/prototype/slice/return-abrupt-from-start.js b/test/staging/sm/Tuple/prototype/slice/return-abrupt-from-start.js new file mode 100644 index 0000000000..fbe457e283 --- /dev/null +++ b/test/staging/sm/Tuple/prototype/slice/return-abrupt-from-start.js @@ -0,0 +1,24 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +features: +- record-tuple +description: | + pending +esid: pending +---*/ + +var o1 = { valueOf: function() { throw new SyntaxError(); } }; +var o2 = { toString: function() { throw new SyntaxError(); } }; + +var sample = #[]; + +assertThrowsInstanceOf(() => sample.slice(o1), + SyntaxError, "valueOf throws"); +assertThrowsInstanceOf(() => sample.slice(o2), + SyntaxError, "toString throws"); + diff --git a/test/staging/sm/Tuple/prototype/slice/slice.js b/test/staging/sm/Tuple/prototype/slice/slice.js new file mode 100644 index 0000000000..4b1a00f2c4 --- /dev/null +++ b/test/staging/sm/Tuple/prototype/slice/slice.js @@ -0,0 +1,186 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +features: +- record-tuple +description: | + pending +esid: pending +---*/ +/* +8.2.3.5 Tuple.prototype.slice ( start, end ) +When the slice method is called with two arguments, start and end, and returns a Tuple containing the elements of the Tuple from element start up to, but not including, element end (or through the end of the tuple if end is undefined). If start is negative, it is treated as length + start where length is the length of the tuple. If end is negative, it is treated as length + end where length is the length of the tuple. + +The following steps are taken: + +1. Let T be ? thisTupleValue(this value). +2. Let list be T.[[Sequence]]. +3. Let len be the number of elements in list. +4. Let relativeStart be ? ToInteger(start). +5. If relativeStart < 0, let k be max((len + relativeStart), 0); else let k be min(relativeStart, len). +6. If end is undefined, let relativeEnd be len; else let relativeEnd be ? ToInteger(end). +7. If relativeEnd < 0, let final be max((len + relativeEnd), 0); else let final be min(relativeEnd, len). +8. Let newList be a new empty List. +9. Repeat, while k < final, +a. Let kValue be list[k]. +b. Assert: Type(kValue) is not Object. +c. Append kValue to the end of newList. +d. Set k to k + 1. +10. Return a new Tuple value whose [[Sequence]] is newList. +*/ + +/* Step 1 */ +/* slice() should throw on a non-Tuple */ +let method = Tuple.prototype.slice; +assert.sameValue(method.call(#[1,2,3,4,5,6], 2, 4), #[3,4]); +assert.sameValue(method.call(Object(#[1,2,3,4,5,6]), 2, 4), #[3,4]); +assertThrowsInstanceOf(() => method.call("monkeys"), TypeError, + "value of TupleObject must be a Tuple"); +assertThrowsInstanceOf(() => method.call(true), TypeError, + "value of TupleObject must be a Tuple"); +assertThrowsInstanceOf(() => method.call(false), TypeError, + "value of TupleObject must be a Tuple"); + + +let tup = #[1,2,3]; +let len = 3; +/* Step 4 -- toInteger returns 0 for non-integers */ +assert.sameValue(tup.slice("monkeys", 4), tup.slice(0, 4)); +assertThrowsInstanceOf(() => tup.slice(Symbol("1"), 4), + TypeError, "can't convert symbol to number"); +assert.sameValue(tup.slice(undefined, 4), tup.slice(0, 4)); +assert.sameValue(tup.slice(undefined), tup.slice(0)); +assert.sameValue(tup.slice(NaN), tup.slice(0)); +assert.sameValue(tup.slice(Number.POSITIVE_INFINITY), tup.slice(len)); +assert.sameValue(tup.slice(Number.NEGATIVE_INFINITY), tup.slice(0)); +assert.sameValue(tup.slice({valueOf: function() { return 0 }, + toString: function() { return 3 }}), + tup.slice(0, 3)); +assert.sameValue(tup.slice(), tup.slice(0)); + + +/* Step 5 -- if relativeStart < 0, k should be max((len + relativeStart), 0) */ +/* Case 1: len + relativeStart > 0 */ +var relativeStart = -2; +assert.sameValue(tup.slice(relativeStart, 4), tup.slice(len + relativeStart, 4)); +/* Case 2: len + relativeStart === 0 */ +relativeStart = (-1 * len); +assert.sameValue(tup.slice(relativeStart, 4), tup.slice(0, 4)); +/* Case 3: len + relativeStart < 0 */ +relativeStart = -256; +assert.sameValue(tup.slice(relativeStart, 4), tup.slice(0, 4)); + +/* Step 5 -- start positive, end positive */ +var tup2 = #[1,2,3,4,5,6,7]; +relativeStart = 2; +/* length > end > start */ +assert.sameValue(tup2.slice(relativeStart, 4), #[3,4]); +/* start == len */ +/* length == end == start */ +assert.sameValue(tup2.slice(tup2.length, tup2.length), #[]); +/* start > len */ +/* start > end == len */ +assert.sameValue(tup2.slice(tup2.length + 5, tup2.length), tup2.slice(tup2.length, tup2.length)); +/* length > end > start = 0 */ +relativeStart = 0; +assert.sameValue(tup2.slice(relativeStart, 4), #[1,2,3,4]); +/* length > end == start > 0 */ +relativeStart = 2; +assert.sameValue(tup2.slice(relativeStart, relativeStart), #[]); +/* length > start > end > 0 */ +relativeStart = 4; +relativeEnd = 2; +assert.sameValue(tup2.slice(relativeStart, relativeEnd), #[]); +/* length = end > start > 0 */ +relativeEnd = tup2.length; +assert.sameValue(tup2.slice(relativeStart, relativeEnd), #[5,6,7]); +/* end > length > start > 0 */ +relativeEnd = tup2.length + 3; +assert.sameValue(tup2.slice(relativeStart, relativeEnd), #[5,6,7]); + +/* length > end == abs(start), start < 0 */ +relativeStart = -4; +relativeEnd = 4; +assert.sameValue(tup2.slice(relativeStart, relativeEnd), #[4]); +/* length == end > abs(start), start < 0 */ +relativeEnd = tup2.length; +assert.sameValue(tup2.slice(relativeStart, relativeEnd), #[4,5,6,7]); +/* abs(start) = length > end > 0, start < 0 */ +relativeStart = -1*tup2.length; +relativeEnd = 5; +assert.sameValue(tup2.slice(relativeStart, relativeEnd), #[1,2,3,4,5]); +/* abs(start) > length = end > 0 */ +relativeStart = (-1*tup2.length) - 4; +relativeEnd = tup2.length; +assert.sameValue(tup2.slice(relativeStart, relativeEnd), tup2); + +/* Step 6 -- if end is undefined, let relativeEnd = len */ +assert.sameValue(tup.slice(2, undefined), tup.slice(2, len)); +assert.sameValue(tup.slice(2), tup.slice(2, len)); +/* relativeEnd converted with toInteger */ +assert.sameValue(tup.slice(2, "monkeys"), tup.slice(2, 0)); +assertThrowsInstanceOf(() => tup.slice(2, Symbol("x")), + TypeError, "can't convert Symbol to Number"); +assert.sameValue(tup.slice(2, 2.5), tup.slice(2, 0)); +assert.sameValue(tup.slice(2, NaN), tup.slice(2, 0)); +assert.sameValue(tup.slice(2, Number.POSITIVE_INFINITY), tup.slice(2, len)); +assert.sameValue(tup.slice(2, Number.NEGATIVE_INFINITY), tup.slice(2, 0)); +assert.sameValue(tup.slice(0, Number.POSITIVE_INFINITY), tup.slice(0, len)); +assert.sameValue(tup.slice(0, Number.NEGATIVE_INFINITY), tup.slice(0, 0)); +assert.sameValue(tup.slice({valueOf: function() { return 3 }, + toString: function() { return 0 }}), + tup.slice(0, 0)); + +/* Step 7 -- if relativeEnd < 0, final should be max((len + relativeEnd), 0) */ +/* Case 1: len + relativeEnd > 0 */ +var relativeEnd = -1; +relativeStart = 2; +assert.sameValue(tup.slice(relativeStart, relativeEnd), tup.slice(relativeStart, len + relativeEnd)); +/* Case 2: len + relativeEnd === 0 */ +relativeEnd = (-1 * len); +assert.sameValue(tup.slice(relativeStart, relativeEnd), tup.slice(relativeStart, 0)); +/* Case 3: len + relativeEnd < 0 */ +relativeEnd = -256; +assert.sameValue(tup.slice(relativeStart, relativeEnd), tup.slice(relativeStart, 0)); +/* start and end both negative */ +relativeStart = -3; +relativeEnd = -1; +assert.sameValue(tup2.slice(relativeStart, relativeEnd), #[5, 6]); +relativeEnd = (-1*len); +assert.sameValue(tup2.slice(relativeStart, relativeEnd), #[]); +relativeEnd = -256; +assert.sameValue(tup2.slice(relativeStart, relativeEnd), #[]); + +/* length > abs(end) > start === 0 */ +relativeStart = 0; +relativeEnd = -3; +assert.sameValue(tup2.slice(relativeStart, relativeEnd), #[1,2,3,4]); +/* length > abs(end) > start > 0 */ +relativeStart = 2; +assert.sameValue(tup2.slice(relativeStart, relativeEnd), #[3,4]); +/* length == abs(end) > start == 0 */ +relativeEnd = -1*tup2.length; +assert.sameValue(tup2.slice(relativeStart, relativeEnd), #[]); +/* abs(end) > length > start > 0 */ +relativeEnd = (-1*tup2.length) - 5; +assert.sameValue(tup2.slice(relativeStart, relativeEnd), #[]); +/* -length == start < end < 0 */ +relativeStart = -1*tup2.length; +relativeEnd = 5; +assert.sameValue(tup2.slice(relativeStart, relativeEnd), #[1,2,3,4,5]); +/* -length < start < end < 0 */ +relativeStart = -3; +relativeEnd = -1; +assert.sameValue(tup2.slice(relativeStart, relativeEnd), #[5,6]); +/* start < -length < end < 0 */ +relativeStart = (-1*tup2.length) - 5; +relativeEnd = -3; +assert.sameValue(tup2.slice(relativeStart, relativeEnd), #[1,2,3,4]); +/* start = end < -length */ +relativeEnd = relativeStart; +assert.sameValue(tup2.slice(relativeStart, relativeEnd), #[]); + diff --git a/test/staging/sm/Tuple/prototype/slice/tointeger-end.js b/test/staging/sm/Tuple/prototype/slice/tointeger-end.js new file mode 100644 index 0000000000..3db7c25064 --- /dev/null +++ b/test/staging/sm/Tuple/prototype/slice/tointeger-end.js @@ -0,0 +1,46 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +features: +- record-tuple +description: | + pending +esid: pending +---*/ +/* +8.2.3.5 +... +6. If end is undefined, let relativeEnd be len; else let relativeEnd be ? ToInteger(end). +*/ + +var obj = { + valueOf: function() { + return 2; + } +}; + + +var sample = #[40, 41, 42, 43]; + +assert.sameValue(sample.slice(0, false), #[]); +assert.sameValue(sample.slice(0, true), #[40]); + +assert.sameValue(sample.slice(0, NaN), #[]); +assert.sameValue(sample.slice(0, null), #[]); +assert.sameValue(sample.slice(0, undefined), #[40, 41, 42, 43]); + +assert.sameValue(sample.slice(0, 0.6), #[]); +assert.sameValue(sample.slice(0, 1.1), #[40]); +assert.sameValue(sample.slice(0, 1.5), #[40]); +assert.sameValue(sample.slice(0, -0.6), #[]); +assert.sameValue(sample.slice(0, -1.1), #[40, 41, 42]); +assert.sameValue(sample.slice(0, -1.5), #[40, 41, 42]); + +assert.sameValue(sample.slice(0, "3"), #[40, 41, 42]); + +assert.sameValue(sample.slice(0, obj), #[40, 41]); + diff --git a/test/staging/sm/Tuple/prototype/slice/tointeger-start.js b/test/staging/sm/Tuple/prototype/slice/tointeger-start.js new file mode 100644 index 0000000000..72b91abce5 --- /dev/null +++ b/test/staging/sm/Tuple/prototype/slice/tointeger-start.js @@ -0,0 +1,46 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +features: +- record-tuple +description: | + pending +esid: pending +---*/ +/* +8.2.3.5 +... +4. Let relativeStart be ? ToInteger(start). +*/ + +var obj = { + valueOf: function() { + return 2; + } +}; + + +var sample = #[40, 41, 42, 43]; + +assert.sameValue(sample.slice(false), sample); +assert.sameValue(sample.slice(true), #[41, 42, 43]); + +assert.sameValue(sample.slice(NaN), sample); +assert.sameValue(sample.slice(null), sample); +assert.sameValue(sample.slice(undefined), sample); + +assert.sameValue(sample.slice(0.6), sample); +assert.sameValue(sample.slice(1.1), #[41, 42, 43]); +assert.sameValue(sample.slice(1.5), #[41, 42, 43]); +assert.sameValue(sample.slice(-0.6), sample); +assert.sameValue(sample.slice(-1.1), #[43]); +assert.sameValue(sample.slice(-1.5), #[43]); + +assert.sameValue(sample.slice("3"), #[43]); + +assert.sameValue(sample.slice(obj), #[42, 43]); + diff --git a/test/staging/sm/Tuple/prototype/slice/tuple-length-internal.js b/test/staging/sm/Tuple/prototype/slice/tuple-length-internal.js new file mode 100644 index 0000000000..c7f872ee51 --- /dev/null +++ b/test/staging/sm/Tuple/prototype/slice/tuple-length-internal.js @@ -0,0 +1,34 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +features: +- record-tuple +description: | + pending +esid: pending +---*/ + +/* Ensure that slice uses internal length and not length property */ + + +var getCalls = 0; +var desc = { + get: function getLen() { + getCalls++; + return 0; + } +}; + +Object.defineProperty(Tuple.prototype, "length", desc); + +var sample = Object(#[42, 43]); + +var result = sample.slice(); + +assert.sameValue(getCalls, 0, "ignores length properties"); +assert.sameValue(result, #[42, 43]); + diff --git a/test/staging/sm/Tuple/prototype/toReversed/indexed-setters.js b/test/staging/sm/Tuple/prototype/toReversed/indexed-setters.js new file mode 100644 index 0000000000..13d564e871 --- /dev/null +++ b/test/staging/sm/Tuple/prototype/toReversed/indexed-setters.js @@ -0,0 +1,26 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +features: +- record-tuple +description: | + pending +esid: pending +---*/ + +// If an indexed Array setter is overridden, TupleSplice shouldn't use it +// when constructing the intermediate array + +var z = 5; +print("1111"); +Object.defineProperty(Array.prototype, '0', { set: function(y) { z = 42; }}); +print("2222"); +let newT = #[1,2,3].toReversed(); +print("3333"); +assert.sameValue(z, 5); +print("4444"); + diff --git a/test/staging/sm/Tuple/prototype/toReversed/invoked-as-func.js b/test/staging/sm/Tuple/prototype/toReversed/invoked-as-func.js new file mode 100644 index 0000000000..766238d7a4 --- /dev/null +++ b/test/staging/sm/Tuple/prototype/toReversed/invoked-as-func.js @@ -0,0 +1,21 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +features: +- record-tuple +description: | + pending +esid: pending +---*/ +var toReversed = Tuple.prototype.toReversed; + +assert.sameValue(typeof toReversed, 'function'); + +assertThrowsInstanceOf(function() { + toReversed(); +}, TypeError, "toReversed() invoked as function"); + diff --git a/test/staging/sm/Tuple/prototype/toReversed/invoked-as-method.js b/test/staging/sm/Tuple/prototype/toReversed/invoked-as-method.js new file mode 100644 index 0000000000..57ccafc67c --- /dev/null +++ b/test/staging/sm/Tuple/prototype/toReversed/invoked-as-method.js @@ -0,0 +1,21 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +features: +- record-tuple +description: | + pending +esid: pending +---*/ +var TuplePrototype = Tuple.prototype; + +assert.sameValue(typeof TuplePrototype.toReversed, 'function'); + +assertThrowsInstanceOf(function() { + TuplePrototype.toReversed(); +}, TypeError, "toReversed() invoked as method"); + diff --git a/test/staging/sm/Tuple/prototype/toReversed/length.js b/test/staging/sm/Tuple/prototype/toReversed/length.js new file mode 100644 index 0000000000..b4f3d9a1c1 --- /dev/null +++ b/test/staging/sm/Tuple/prototype/toReversed/length.js @@ -0,0 +1,38 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +features: +- record-tuple +description: | + pending +esid: pending +---*/ +var desc = Object.getOwnPropertyDescriptor(Tuple.prototype.toReversed, "length"); +assert.sameValue(desc.value, 0); +assert.sameValue(desc.writable, false); +assert.sameValue(desc.enumerable, false); +assert.sameValue(desc.configurable, true); + + +desc = Object.getOwnPropertyDescriptor(Tuple.prototype.toReversed, "name"); +assert.sameValue(desc.value, "toReversed"); +assert.sameValue(desc.writable, false); +assert.sameValue(desc.enumerable, false); +assert.sameValue(desc.configurable, true); + +desc = Object.getOwnPropertyDescriptor(Tuple.prototype, "toReversed"); +assert.sameValue(desc.writable, true); +assert.sameValue(desc.enumerable, false); +assert.sameValue(desc.configurable, true); + +assert.sameValue(isConstructor(Tuple.prototype.toReversed), false); + +assertThrowsInstanceOf(() => { + let t = #[1]; + new t.toReversed(); +}, TypeError, '`let t = #[1]; new t.toReversed()` throws TypeError'); + diff --git a/test/staging/sm/Tuple/prototype/toReversed/this-is-not-tuple.js b/test/staging/sm/Tuple/prototype/toReversed/this-is-not-tuple.js new file mode 100644 index 0000000000..5ca6cba860 --- /dev/null +++ b/test/staging/sm/Tuple/prototype/toReversed/this-is-not-tuple.js @@ -0,0 +1,32 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +features: +- record-tuple +description: | + pending +esid: pending +---*/ +var withReversed = Tuple.prototype.withReversed; + +var thisVals = [[undefined, "undefined"], + [null, "null"], + [42, "42"], + ["1", "1"], + [true, "true"], + [false, "false"], + [Symbol("s"), "Symbol(\"s\")"], + [[], "[]"], + [{}, "{}"]]; + +for (pair of thisVals) { + thisVal = pair[0]; + errorMsg = "this is: " + pair[1]; + assertThrowsInstanceOf(() => withReversed.call(thisVal), + TypeError, errorMsg); +} + diff --git a/test/staging/sm/Tuple/prototype/toReversed/toReversed.js b/test/staging/sm/Tuple/prototype/toReversed/toReversed.js new file mode 100644 index 0000000000..10572ede50 --- /dev/null +++ b/test/staging/sm/Tuple/prototype/toReversed/toReversed.js @@ -0,0 +1,40 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +features: +- record-tuple +description: | + pending +esid: pending +---*/ +/* +8.2.3.28 Tuple.prototype.toReversed ( ) +When the toReversed method is called, the following steps are taken: + +1. Let T be ? thisTupleValue(this value). +2. Let oldList be a new List containing the elements of T.[[Sequence]]. +3. Let newList be a new empty List. +4. Repeat, while oldList is not empty, +a. Remove the last element from oldList, and let E be the value of the element. +b. Append E to the end of List newList. +5. Return a new Tuple value whose [[Sequence]] is newList. +*/ +/* Step 1 */ +/* toReversed() should throw on a non-Tuple */ +let method = Tuple.prototype.toReversed; +assert.sameValue(method.call(#[1,2,3,4,5,6]), #[6,5,4,3,2,1]); +assert.sameValue(method.call(Object(#[1,2,3,4,5,6])), #[6,5,4,3,2,1]); +assertThrowsInstanceOf(() => method.call("monkeys"), TypeError, + "value of TupleObject must be a Tuple"); + +assert.sameValue(#[].toReversed(), #[]); +assert.sameValue(#[1].toReversed(), #[1]); + +/* Test that length is still handled correctly if it's overridden */ +Object.defineProperty(Tuple.prototype, "length", { get() { return 0 } }) +assert.sameValue(#[1,2,3,4,5].toReversed(), #[5,4,3,2,1]); + diff --git a/test/staging/sm/Tuple/prototype/toSorted/comparefn-call-throws.js b/test/staging/sm/Tuple/prototype/toSorted/comparefn-call-throws.js new file mode 100644 index 0000000000..e8265e9abd --- /dev/null +++ b/test/staging/sm/Tuple/prototype/toSorted/comparefn-call-throws.js @@ -0,0 +1,27 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +features: +- record-tuple +description: | + pending +esid: pending +---*/ +let sample = #[42, 43, 44, 45, 46]; +var calls = 0; + +let comparefn = function() { + calls += 1; + throw new TypeError(); +}; + +assertThrowsInstanceOf(function() { + sample.toSorted(comparefn); +}, TypeError, "comparefn should throw"); + +assert.sameValue(calls, 1); + diff --git a/test/staging/sm/Tuple/prototype/toSorted/comparefn-calls.js b/test/staging/sm/Tuple/prototype/toSorted/comparefn-calls.js new file mode 100644 index 0000000000..6550990afc --- /dev/null +++ b/test/staging/sm/Tuple/prototype/toSorted/comparefn-calls.js @@ -0,0 +1,36 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +features: +- record-tuple +description: | + pending +esid: pending +---*/ +var expectedThis = (function() { + return this; +})(); + + +var sample = #[42, 42, 42, 42, 42]; +var calls = []; + +var comparefn = function() { + calls.push([this, arguments]); +}; + +let result = sample.toSorted(comparefn); + +assert.sameValue(calls.length > 0, true); + +calls.forEach(function(args) { + assert.sameValue(args[0], expectedThis); + assert.sameValue(args[1].length, 2); + assert.sameValue(args[1][0], 42); + assert.sameValue(args[1][0], 42); +}); + diff --git a/test/staging/sm/Tuple/prototype/toSorted/comparefn-nonfunction-call-throws.js b/test/staging/sm/Tuple/prototype/toSorted/comparefn-nonfunction-call-throws.js new file mode 100644 index 0000000000..5ad7a0b2a7 --- /dev/null +++ b/test/staging/sm/Tuple/prototype/toSorted/comparefn-nonfunction-call-throws.js @@ -0,0 +1,36 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +features: +- record-tuple +description: | + pending +esid: pending +---*/ +/* + 1. If _comparefn_ is not *undefined* and IsCallable(_comparefn_) is *false*, throw a *TypeError* exception. + ... +*/ + +let sample = #[42, 43, 44, 45, 46]; + +let compareFnVals = [[null, "null"], + [true, "true"], + [false, "false"], + ['', "\'\'"], + [/a/g, "/a/g"], + [42, "42"], + [[], "[]"], + [{}, "{}"]]; + +for (pair of compareFnVals) { + f = pair[0]; + errorMsg = "comparefn is: " + pair[1]; + assertThrowsInstanceOf(() => sample.withSorted(f), + TypeError, errorMsg); +} + diff --git a/test/staging/sm/Tuple/prototype/toSorted/invoked-as-func.js b/test/staging/sm/Tuple/prototype/toSorted/invoked-as-func.js new file mode 100644 index 0000000000..00acb10ce7 --- /dev/null +++ b/test/staging/sm/Tuple/prototype/toSorted/invoked-as-func.js @@ -0,0 +1,21 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +features: +- record-tuple +description: | + pending +esid: pending +---*/ +var toSorted = Tuple.prototype.toSorted; + +assert.sameValue(typeof toSorted, 'function'); + +assertThrowsInstanceOf(function() { + toSorted(); +}, TypeError, "toSorted invoked as function"); + diff --git a/test/staging/sm/Tuple/prototype/toSorted/invoked-as-method.js b/test/staging/sm/Tuple/prototype/toSorted/invoked-as-method.js new file mode 100644 index 0000000000..d36e762d1a --- /dev/null +++ b/test/staging/sm/Tuple/prototype/toSorted/invoked-as-method.js @@ -0,0 +1,21 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +features: +- record-tuple +description: | + pending +esid: pending +---*/ +var TuplePrototype = Tuple.prototype; + +assert.sameValue(typeof TuplePrototype.toSorted, 'function'); + +assertThrowsInstanceOf(function() { + TuplePrototype.toSorted(); +}, TypeError, "toSorted() invoked as method"); + diff --git a/test/staging/sm/Tuple/prototype/toSorted/length.js b/test/staging/sm/Tuple/prototype/toSorted/length.js new file mode 100644 index 0000000000..43bda34224 --- /dev/null +++ b/test/staging/sm/Tuple/prototype/toSorted/length.js @@ -0,0 +1,38 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +features: +- record-tuple +description: | + pending +esid: pending +---*/ +var desc = Object.getOwnPropertyDescriptor(Tuple.prototype.toSorted, "length"); +assert.sameValue(desc.value, 1); +assert.sameValue(desc.writable, false); +assert.sameValue(desc.enumerable, false); +assert.sameValue(desc.configurable, true); + + +desc = Object.getOwnPropertyDescriptor(Tuple.prototype.toSorted, "name"); +assert.sameValue(desc.value, "toSorted"); +assert.sameValue(desc.writable, false); +assert.sameValue(desc.enumerable, false); +assert.sameValue(desc.configurable, true); + +desc = Object.getOwnPropertyDescriptor(Tuple.prototype, "toSorted"); +assert.sameValue(desc.writable, true); +assert.sameValue(desc.enumerable, false); +assert.sameValue(desc.configurable, true); + +assert.sameValue(isConstructor(Tuple.prototype.toSorted), false); + +assertThrowsInstanceOf(() => { + let t = #[1]; + new t.toSorted(); +}, TypeError, '`let t = #[1]; new t.toSorted()` throws TypeError'); + diff --git a/test/staging/sm/Tuple/prototype/toSorted/sorted-values.js b/test/staging/sm/Tuple/prototype/toSorted/sorted-values.js new file mode 100644 index 0000000000..77675edbf9 --- /dev/null +++ b/test/staging/sm/Tuple/prototype/toSorted/sorted-values.js @@ -0,0 +1,40 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +features: +- record-tuple +description: | + pending +esid: pending +---*/ +var sample; + +sample = #[4,3,2,1].toSorted(); +assert.sameValue(sample, #[1,2,3,4]); + +sample = #[3, 4, 1, 2].toSorted(); +assert.sameValue(sample, #[1, 2, 3, 4]); + +sample = #[3,4,3,1,0,1,2].toSorted(); +assert.sameValue(sample, #[0,1,1,2,3,3,4]); + +sample = #[1,0,-0,2].toSorted(); +// This matches the behavior of Array.sort() +assert.sameValue(sample, #[0,-0,1,2]); + +sample = #[-4,3,4,-3,2,-1,1,0].toSorted(); +assert.sameValue(sample, #[-1,-3,-4,0,1,2,3,4]); + +sample = #[0.5,0,1.5,1].toSorted(); +assert.sameValue(sample, #[0,0.5,1,1.5]); + +sample = #[0.5,0,1.5,-0.5,-1,-1.5,1].toSorted(); +assert.sameValue(sample, #[-0.5,-1,-1.5,0,0.5,1,1.5]); + +sample = #[3,4,Infinity,-Infinity,1,2].toSorted(); +assert.sameValue(sample, #[-Infinity,1,2,3,4,Infinity]); + diff --git a/test/staging/sm/Tuple/prototype/toSorted/stability.js b/test/staging/sm/Tuple/prototype/toSorted/stability.js new file mode 100644 index 0000000000..7bad8e433c --- /dev/null +++ b/test/staging/sm/Tuple/prototype/toSorted/stability.js @@ -0,0 +1,42 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +features: +- record-tuple +description: | + pending +esid: pending +---*/ +// Treat 0..3, 4..7, etc. as equal. +const compare = (a, b) => (a / 4 | 0) - (b / 4 | 0); + +// Create a tuple of the form `[0, 1, …, 126, 127]`. +var tup = Tuple.from({ length: 128 }, (_, i) => i); + +const tuple1 = tup; +assert.sameValue(tuple1.toSorted(compare), tup); + + +// Reverse `tup` so it becomes `[127, 126, …, 1, 0]`. +tup = tup.toReversed(); + +const tuple2 = tup; +assert.sameValue(tuple2.toSorted(compare), + #[ + 3, 2, 1, 0, 7, 6, 5, 4, 11, 10, 9, 8, + 15, 14, 13, 12, 19, 18, 17, 16, 23, 22, 21, 20, + 27, 26, 25, 24, 31, 30, 29, 28, 35, 34, 33, 32, + 39, 38, 37, 36, 43, 42, 41, 40, 47, 46, 45, 44, + 51, 50, 49, 48, 55, 54, 53, 52, 59, 58, 57, 56, + 63, 62, 61, 60, 67, 66, 65, 64, 71, 70, 69, 68, + 75, 74, 73, 72, 79, 78, 77, 76, 83, 82, 81, 80, + 87, 86, 85, 84, 91, 90, 89, 88, 95, 94, 93, 92, + 99, 98, 97, 96, 103, 102, 101, 100, 107, 106, 105, 104, + 111, 110, 109, 108, 115, 114, 113, 112, 119, 118, 117, 116, + 123, 122, 121, 120, 127, 126, 125, 124, + ]); + diff --git a/test/staging/sm/Tuple/prototype/toSorted/this-is-not-tuple.js b/test/staging/sm/Tuple/prototype/toSorted/this-is-not-tuple.js new file mode 100644 index 0000000000..611e3e6157 --- /dev/null +++ b/test/staging/sm/Tuple/prototype/toSorted/this-is-not-tuple.js @@ -0,0 +1,32 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +features: +- record-tuple +description: | + pending +esid: pending +---*/ +var withSorted = Tuple.prototype.withSorted; + +var thisVals = [[undefined, "undefined"], + [null, "null"], + [42, "42"], + ["1", "1"], + [true, "true"], + [false, "false"], + [Symbol("s"), "Symbol(\"s\")"], + [[], "[]"], + [{}, "{}"]]; + +for (pair of thisVals) { + thisVal = pair[0]; + errorMsg = "this is: " + pair[1]; + assertThrowsInstanceOf(() => withSorted.call(thisVal), + TypeError, errorMsg); +} + diff --git a/test/staging/sm/Tuple/prototype/toSorted/toSorted.js b/test/staging/sm/Tuple/prototype/toSorted/toSorted.js new file mode 100644 index 0000000000..2f5da7bfb0 --- /dev/null +++ b/test/staging/sm/Tuple/prototype/toSorted/toSorted.js @@ -0,0 +1,46 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +features: +- record-tuple +description: | + pending +esid: pending +---*/ +/* +8.2.3.29 Tuple.prototype.toSorted ( compareFn ) +Except as described below, implements the same requirements as those of Array.prototype.sort as defined in 22.1.3.27. The implementation may be optimized with the knowledge that the this value is an object that has a fixed length and whose integer-indexed properties are not sparse. + +Upon entry, the following steps are performed to initialize evaluation of the sorted function. These steps are used instead of the entry steps in 22.1.3.27: + +1. If comparefn is not undefined and IsCallable(comparefn) is false, throw a TypeError exception. +2. Let T be ? thisTupleValue(this value). +3. Let list be a new List containing the elements of T.[[Sequence]]. +4. Let len be the length of list. +A new Tuple containing the elements from the original Tuple is returned, where the elements are sorted. The sort order is the ordering, after completion of this function, of the elements of list. The sort order of the result of sorted is the same order as if the elements of list were sorted in an Array via %Array.prototype.sort% with comparefn as the first argument. + +*/ +/* Step 2 */ +/* toSorted() should throw on a non-Tuple */ +let method = Tuple.prototype.toSorted; +assert.sameValue(method.call(#[6,5,4,3,2,1]), #[1,2,3,4,5,6]); +assert.sameValue(method.call(Object(#[6,5,4,3,2,1])), #[1,2,3,4,5,6]); +assertThrowsInstanceOf(() => method.call("monkeys"), TypeError, + "value of TupleObject must be a Tuple"); + +/* Test that length is still handled correctly if it's overridden */ +Object.defineProperty(Tuple.prototype, "length", { get() { return 0 } }) +assert.sameValue(#[5,4,3,2,1].toSorted(), #[1,2,3,4,5]); + +/* Step 1. If comparefn is not undefined... */ +assert.sameValue(#[5,4,3,2,1].toSorted(), #[1,2,3,4,5]); +assert.sameValue(#[5,4,3,2,1].toSorted(undefined), #[1,2,3,4,5]); +assertThrowsInstanceOf(() => #[1].toSorted("monkeys"), TypeError, + "bad comparefn passed to toSorted"); +let comparefn = (x, y) => x < y; +assert.sameValue(#[1,2,3,4,5].toSorted(comparefn), #[5,4,3,2,1]); + diff --git a/test/staging/sm/Tuple/prototype/toSorted/toSortedcompare-with-no-tostring.js b/test/staging/sm/Tuple/prototype/toSorted/toSortedcompare-with-no-tostring.js new file mode 100644 index 0000000000..7ab49b877a --- /dev/null +++ b/test/staging/sm/Tuple/prototype/toSorted/toSortedcompare-with-no-tostring.js @@ -0,0 +1,25 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +features: +- record-tuple +description: | + pending +esid: pending +---*/ +/* description: Tuple toSorted does cast values to String */ + +var toStringCalled = false; +Number.prototype.toString = function() { + toStringCalled = true; +} + +let sample = #[20, 100, 3]; +let result = sample.toSorted(); +assert.sameValue(toStringCalled, false); +assert.sameValue(result, #[100, 20, 3]); + diff --git a/test/staging/sm/Tuple/prototype/toSorted/tuplelength-internal.js b/test/staging/sm/Tuple/prototype/toSorted/tuplelength-internal.js new file mode 100644 index 0000000000..cdb7c5f56e --- /dev/null +++ b/test/staging/sm/Tuple/prototype/toSorted/tuplelength-internal.js @@ -0,0 +1,39 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +features: +- record-tuple +description: | + pending +esid: pending +---*/ +/* Use internal length rather than getting a length property */ +var getCalls = 0; +var desc = { + get: function getLen() { + getCalls++; + return 0; + } +}; + +var internalLength = Object.getOwnPropertyDescriptor(Tuple.prototype, "length").get; +Object.defineProperty(Tuple.prototype, "length", desc); + +let sample = #[42,42,42]; + +getCalls = 0; + +var result = sample.toSorted(); + +assert.sameValue(getCalls, 0) +assert.sameValue(result, sample); +assert.sameValue(result[0], sample[0]); +assert.sameValue(result[1], sample[1]); +assert.sameValue(result[2], sample[2]); +assert.sameValue(result.length, 0); +assert.sameValue(internalLength.call(result), 3); + diff --git a/test/staging/sm/Tuple/prototype/toSpliced/indexed-setters.js b/test/staging/sm/Tuple/prototype/toSpliced/indexed-setters.js new file mode 100644 index 0000000000..5b42246f61 --- /dev/null +++ b/test/staging/sm/Tuple/prototype/toSpliced/indexed-setters.js @@ -0,0 +1,26 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +features: +- record-tuple +description: | + pending +esid: pending +---*/ + +// If an indexed Array setter is overridden, TupleSplice shouldn't use it +// when constructing the intermediate array + +var z = 5; +print("1111"); +Object.defineProperty(Array.prototype, '0', { set: function(y) { z = 42; }}); +print("2222"); +let newT = #[1,2,3].toSpliced(0, 2); +print("3333"); +assert.sameValue(z, 5); +print("4444"); + diff --git a/test/staging/sm/Tuple/prototype/toSpliced/length.js b/test/staging/sm/Tuple/prototype/toSpliced/length.js new file mode 100644 index 0000000000..ec7ab81876 --- /dev/null +++ b/test/staging/sm/Tuple/prototype/toSpliced/length.js @@ -0,0 +1,38 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +features: +- record-tuple +description: | + pending +esid: pending +---*/ +var desc = Object.getOwnPropertyDescriptor(Tuple.prototype.toSpliced, "length"); +assert.sameValue(desc.value, 2); +assert.sameValue(desc.writable, false); +assert.sameValue(desc.enumerable, false); +assert.sameValue(desc.configurable, true); + + +desc = Object.getOwnPropertyDescriptor(Tuple.prototype.toSpliced, "name"); +assert.sameValue(desc.value, "toSpliced"); +assert.sameValue(desc.writable, false); +assert.sameValue(desc.enumerable, false); +assert.sameValue(desc.configurable, true); + +desc = Object.getOwnPropertyDescriptor(Tuple.prototype, "toSpliced"); +assert.sameValue(desc.writable, true); +assert.sameValue(desc.enumerable, false); +assert.sameValue(desc.configurable, true); + +assert.sameValue(isConstructor(Tuple.prototype.toSpliced), false); + +assertThrowsInstanceOf(() => { + let t = #[1]; + new t.toSpliced(); +}, TypeError, '`let t = #[1]; new t.toSpliced()` throws TypeError'); + diff --git a/test/staging/sm/Tuple/prototype/toSpliced/toSpliced.js b/test/staging/sm/Tuple/prototype/toSpliced/toSpliced.js new file mode 100644 index 0000000000..e85efbd776 --- /dev/null +++ b/test/staging/sm/Tuple/prototype/toSpliced/toSpliced.js @@ -0,0 +1,265 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +features: +- record-tuple +description: | + pending +esid: pending +---*/ +/* +8.2.3.30 Tuple.prototype.toSpliced ( start, deleteCount, ...items ) +When the toSpliced method is called with two or more arguments start, deleteCount and zero or more items, a new Tuple is returned where the deleteCount elements of the Tuple starting at integer index start are replaced by the arguments items. + +The following steps are taken: + +1. Let T be ? thisTupleValue(this value). +2. Let list be T.[[Sequence]]. +3. Let len be the number of elements in list. +4. Let relativeStart be ? ToInteger(start). +5. If relativeStart < 0, let actualStart be max((len + relativeStart), 0); else let actualStart be min(relativeStart, len). +6. If the number of actual arguments is 0, then +a. Let insertCount be 0. +b. Let actualDeleteCount be 0. +7. Else if the number of actual arguments is 1, then +a. Let insertCount be 0. +b. Let actualDeleteCount be len - actualStart. +8. Else, +a. Let insertCount be the number of actual arguments minus 2. +b. Let dc be ? ToInteger(deleteCount). +c. Let actualDeleteCount be min(max(dc, 0), len - actualStart). +9. If len + insertCount - actualDeleteCount > 253 - 1, throw a TypeError exception. +10. Let k be 0. +11. Let items be a List whose elements are, in left to right order, the portion of the actual argument list starting with the third argument. The list is empty if fewer than three arguments were passed. +12. Let itemCount be the number of elements in items. +13. Let newList be a new empty List. +14. Repeat, while k < actualStart, +a. Let E be list[k]. +b. Append E to the end of list newList. +c. Set k to k + 1. +15. Let itemK be 0. +16. Repeat, while itemK < itemCount. +a. Let E be items[itemK]. +b. If Type(E) is Object, throw a TypeError exception. +c. Append E to the end of newList. +d. Set itemK to itemK + 1. +17. Set k to actualStart + actualDeleteCount. +18. Repeat, while k < len, +a. Let E be list[k]. +b. Append E to the end of newList. +c. Set k to k + 1. +19. Return a new Tuple value whose [[Sequence]] is newList. +*/ +/* Step 1 */ +/* toSpliced() should throw on a non-Tuple */ +let method = Tuple.prototype.toSpliced; +assert.sameValue(method.call(#[1,2,3,4,5,6], 2, 3), #[1,2,6]); +assert.sameValue(method.call(Object(#[1,2,3,4,5,6]),2,3), #[1,2,6]); +assertThrowsInstanceOf(() => method.call("monkeys"), TypeError, + "value of TupleObject must be a Tuple"); +assertThrowsInstanceOf(() => method.call(true), TypeError, + "value of TupleObject must be a Tuple"); +assertThrowsInstanceOf(() => method.call(false), TypeError, + "value of TupleObject must be a Tuple"); + +/* method does not access constructor */ +var t = #[]; +t.constructor = null; +var result = t.toSpliced(0, 0); +assert.sameValue(result, #[]); +assert.sameValue(Object.getPrototypeOf(result), Tuple.prototype); + +/* Step 3 */ +/* Test that length is still handled correctly if it's overridden */ +Object.defineProperty(Tuple.prototype, "length", { get() { return 0 } }) +assert.sameValue(#[1,2,3,4,5].toSpliced(1, 2), #[1,4,5]); + +var tup = #[1,2,3]; +var len = 3; +/* Step 4 -- toInteger returns 0 for non-integers */ +assert.sameValue(tup.toSpliced("monkeys", 2), tup.toSpliced(0, 2)); +assert.sameValue(tup.toSpliced(undefined, 2), tup.toSpliced(0, 2)); +assert.sameValue(tup.toSpliced(undefined), tup.toSpliced(0, len)); +assert.sameValue(tup.toSpliced(), tup.slice(0)); + +/* Step 5 */ +/* relativeStart < 0, len + relativeStart > 0 */ +var relativeStart = -1; +var result = tup.toSpliced(relativeStart, 1); +assert.sameValue(result, tup.toSpliced(len + relativeStart, 1)); +assert.sameValue(result, #[1,2]); +/* relativeStart < 0, len + relativeStart < 0 */ +relativeStart = -4; +result = tup.toSpliced(relativeStart, 1); +assert.sameValue(result, tup.toSpliced(0, 1)); +assert.sameValue(result, #[2,3]); +/* relativeStart < 0, len + relativeStart === 0 */ +relativeStart = -3; +result = tup.toSpliced(relativeStart, 1); +assert.sameValue(result, tup.toSpliced(0, 1)); +/* relativeStart === 0 */ +relativeStart = 0; +result = tup.toSpliced(relativeStart, 2); +assert.sameValue(result, #[3]); +/* relativeStart > 0, relativeStart < len */ +relativeStart = 2; +result = tup.toSpliced(relativeStart, 1); +assert.sameValue(result, #[1,2]); +/* relativeStart > 0, relativeStart > len */ +relativeStart = 5; +result = tup.toSpliced(relativeStart, 1); +assert.sameValue(result, tup.toSpliced(len, 1)); +assert.sameValue(result, tup); +/* relativeStart > 0, relativeStart === len */ +relativeStart = len; +result = tup.toSpliced(relativeStart, 1); +assert.sameValue(result, tup); + +/* Step 6 - no arguments */ +result = tup.toSpliced(); +assert.sameValue(result, tup.toSpliced(0, 0)); +assert.sameValue(result, tup); + +/* Step 7 -- 1 argument */ +result = tup.toSpliced(1); +assert.sameValue(result, tup.toSpliced(1, len - 1)); +assert.sameValue(result, #[1]); + +/* Step 8 */ +/* 2 arguments */ +/* insertCount = 0 */ +/* (a) deleteCount = non-integer */ +assert.sameValue(tup.toSpliced(1, "monkeys"), tup.toSpliced(1, 0)); +assert.sameValue(tup.toSpliced(1, undefined), tup.toSpliced(1, 0)); +assert.sameValue(tup.toSpliced(1, true), tup.toSpliced(1, 1)); +/* (b) deleteCount < 0, len - actualStart > 0 */ +result = tup.toSpliced(1, -1); +assert.sameValue(result, tup.toSpliced(1, 0)); +assert.sameValue(result, tup); +/* (c) deleteCount < 0, len - actualStart === 0 */ +result = tup.toSpliced(3, -1); +assert.sameValue(result, tup.toSpliced(3, 0)); +assert.sameValue(result, tup); +/* (d) deleteCount < 0, len - actualStart < 0 */ +/* Step 5 guarantees this case can't happen */ +/* (e) deleteCount === 0 */ +assert.sameValue(tup.toSpliced(1, 0), tup); +/* (f) deleteCount > 0, deleteCount < (len - actualStart) */ +var tup2 = #[1,2,3,4,5]; +var tup2_len = 5; +result = tup2.toSpliced(1, 3); +assert.sameValue(result, #[1, 5]); +/* (g) deleteCount > 0, deleteCount > (len - actualStart) */ +var actualStart = 3; +result = tup2.toSpliced(actualStart, 4); +assert.sameValue(result, tup2.toSpliced(actualStart, tup2_len - actualStart)); +assert.sameValue(result, #[1,2,3]); +/* 3 arguments */ +assert.sameValue(tup2.toSpliced(1, "bunnies", "monkeys"), tup2.toSpliced(1, 0, "monkeys")); // (a) +assert.sameValue(tup2.toSpliced(1, -1, "monkeys"), tup2.toSpliced(1, 0, "monkeys")); // (b) +assert.sameValue(tup2.toSpliced(tup2_len, -1, "monkeys"), tup2.toSpliced(tup2_len, 0, "monkeys")); // (c) +assert.sameValue(tup2.toSpliced(2, 0, "monkeys"), #[1, 2, "monkeys", 3, 4, 5]); // (e) +assert.sameValue(tup2.toSpliced(1, 3, "monkeys"), #[1, "monkeys", 5]); // (f) +assert.sameValue(tup2.toSpliced(3, 4, "monkeys"), #[1, 2, 3, "monkeys"]); // (g) +/* 4 arguments */ +assert.sameValue(tup2.toSpliced(1, "monkeys", 42, 17), tup2.toSpliced(1, 0, 42, 17)); // (a) +assert.sameValue(tup2.toSpliced(1, -1, 42, 17), tup2.toSpliced(1, 0, 42, 17)); // (b) +assert.sameValue(tup2.toSpliced(tup2_len, -1, 42, 17), tup2.toSpliced(tup2_len, 0, 42, 17)); // (c) +assert.sameValue(tup2.toSpliced(2, 0, 42, 17), #[1, 2, 42, 17, 3, 4, 5]); // (e) +assert.sameValue(tup2.toSpliced(1, 3, 42, 17), #[1, 42, 17, 5]); // (f) +assert.sameValue(tup2.toSpliced(3, 4, 42, 17), #[1, 2, 3, 42, 17]); // (g) + +/* Step 9 */ +/* If len + insertCount - actualDeleteCount > 2^53 - 1, throw a TypeError exception. + Not sure how to test the error case without constructing a tuple with length 2^53 */ + +/* Steps 14-18 */ +/* each combination of: + actualStart = 0, actualStart = 1, actualStart = 4 + itemCount = 0, itemCount = 1, itemCount = 4 + actualStart + actualDeleteCount = len, actualStart + actualDeleteCount < len */ + +/* actualStart = 0, itemCount = 0, actualDeleteCount = len */ +var tup = #[1,2,3,4,5,6]; +var len = 6; +var actualStart; +var actualDeleteCount; +actualStart = 0; +actualDeleteCount = len; +assert.sameValue(tup.toSpliced(actualStart, actualDeleteCount), #[]); + +/* actualStart = 0, itemCount = 1, actualDeleteCount = len */ +actualStart = 0; +actualDeleteCount = len; +assert.sameValue(tup.toSpliced(actualStart, actualDeleteCount, "monkeys"), #["monkeys"]); + +/* actualStart = 0, itemCount = 4, actualDeleteCount = len */ +assert.sameValue(tup.toSpliced(actualStart, actualDeleteCount, "a", "b", "c", "d"), #["a", "b", "c", "d"]); + +/* actualStart = 0, itemCount = 0, actualDeleteCount < len */ +actualDeleteCount = 3; +assert.sameValue(tup.toSpliced(actualStart, actualDeleteCount), #[4, 5, 6]); + +/* actualStart = 0, itemCount = 1, actualDeleteCount < len */ +assert.sameValue(tup.toSpliced(actualStart, actualDeleteCount, "monkeys"), #["monkeys", 4, 5, 6]); + +/* actualStart = 0, itemCount = 4, actualDeleteCount < len */ +assert.sameValue(tup.toSpliced(actualStart, actualDeleteCount, 42, 43, 44, 45), #[42, 43, 44, 45, 4, 5, 6]); + +/* actualStart = 1, itemCount = 0, actualDeleteCount = len - 1 */ +actualStart = 1; +actualDeleteCount = len - 1; +assert.sameValue(tup.toSpliced(actualStart, actualDeleteCount), #[1]); + +/* actualStart = 1, itemCount = 1, actualDeleteCount = len - 1 */ +assert.sameValue(tup.toSpliced(actualStart, actualDeleteCount, "monkeys"), #[1, "monkeys"]); + +/* actualStart = 1, itemCount = 4, actualDeleteCount = len - 1 */ +assert.sameValue(tup.toSpliced(actualStart, actualDeleteCount, 0.0, 0.1, 0.2, 0.3), #[1, 0.0, 0.1, 0.2, 0.3]); + +/* actualStart = 1, itemCount = 0, actualDeleteCount < len - 1 */ +actualDeleteCount = 1; +assert.sameValue(tup.toSpliced(actualStart, actualDeleteCount), #[1, 3, 4, 5, 6]); + +/* actualStart = 1, itemCount = 1, actualDeleteCount < len - 1 */ +assert.sameValue(tup.toSpliced(actualStart, actualDeleteCount, "monkeys"), #[1, "monkeys", 3, 4, 5, 6]); + +/* actualStart = 1, itemCount = 4, actualDeleteCount < len - 1 */ +assert.sameValue(tup.toSpliced(actualStart, actualDeleteCount, 8, 9, 10, 11), #[1, 8, 9, 10, 11, 3, 4, 5, 6]); + +/* actualStart = 4, itemCount = 0, actualDeleteCount = len - 4 */ +actualStart = 4; +actualDeleteCount = len - 4; +assert.sameValue(tup.toSpliced(actualStart, actualDeleteCount), #[1, 2, 3, 4]); + +/* actualStart = 4, itemCount = 1, actualDeleteCount = len - 4 */ +assert.sameValue(tup.toSpliced(actualStart, actualDeleteCount, "monkeys"), #[1, 2, 3, 4, "monkeys"]); + +/* actualStart = 4, itemCount = 4, actualDeleteCount = len - 4 */ +assert.sameValue(tup.toSpliced(actualStart, actualDeleteCount, 0, -1, -2, -3), #[1, 2, 3, 4, 0, -1, -2, -3]); + +/* actualStart = 4, itemCount = 0, actualDeleteCount < len - 4 */ +actualDeleteCount = 1; +assert.sameValue(tup.toSpliced(actualStart, actualDeleteCount), #[1, 2, 3, 4, 6]); + +/* actualStart = 4, itemCount = 1, actualDeleteCount < len - 4 */ +assert.sameValue(tup.toSpliced(actualStart, actualDeleteCount, "monkeys"), #[1, 2, 3, 4, "monkeys", 6]); + +/* actualStart = 4, itemCount = 4, actualDeleteCount < len - 4 */ +assert.sameValue(tup.toSpliced(actualStart, actualDeleteCount, "p", "q", "r", "s"), #[1, 2, 3, 4, "p", "q", "r", "s", 6]); + +/* Step 16.b -- item is Object */ +assertThrowsInstanceOf(() => tup.toSpliced(actualStart, actualDeleteCount, []), + TypeError, "Tuple can't contain Object"); +assertThrowsInstanceOf(() => tup.toSpliced(actualStart, actualDeleteCount, [], 2, 3), + TypeError, "Tuple can't contain Object"); +assertThrowsInstanceOf(() => tup.toSpliced(actualStart, actualDeleteCount, 2, new Object(), 3), + TypeError, "Tuple can't contain Object"); +assertThrowsInstanceOf(() => tup.toSpliced(actualStart, actualDeleteCount, 2, 3, {"a": "b"}), + TypeError, "Tuple can't contain Object"); + + diff --git a/test/staging/sm/Tuple/prototype/toString/length.js b/test/staging/sm/Tuple/prototype/toString/length.js new file mode 100644 index 0000000000..9d7f57d921 --- /dev/null +++ b/test/staging/sm/Tuple/prototype/toString/length.js @@ -0,0 +1,38 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +features: +- record-tuple +description: | + pending +esid: pending +---*/ +var desc = Object.getOwnPropertyDescriptor(Tuple.prototype.toString, "length"); +assert.sameValue(desc.value, 0); +assert.sameValue(desc.writable, false); +assert.sameValue(desc.enumerable, false); +assert.sameValue(desc.configurable, true); + + +desc = Object.getOwnPropertyDescriptor(Tuple.prototype.toString, "name"); +assert.sameValue(desc.value, "toString"); +assert.sameValue(desc.writable, false); +assert.sameValue(desc.enumerable, false); +assert.sameValue(desc.configurable, true); + +desc = Object.getOwnPropertyDescriptor(Tuple.prototype, "toString"); +assert.sameValue(desc.writable, true); +assert.sameValue(desc.enumerable, false); +assert.sameValue(desc.configurable, true); + +assert.sameValue(isConstructor(Tuple.prototype.toString), false); + +assertThrowsInstanceOf(() => { + let t = #[1]; + new t.toString(); +}, TypeError, '`let t = #[1]; new t.toString()` throws TypeError'); + diff --git a/test/staging/sm/Tuple/prototype/toString/to-string.js b/test/staging/sm/Tuple/prototype/toString/to-string.js new file mode 100644 index 0000000000..39e9ace5f2 --- /dev/null +++ b/test/staging/sm/Tuple/prototype/toString/to-string.js @@ -0,0 +1,32 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +features: +- record-tuple +description: | + pending +esid: pending +---*/ +/* Step 1 */ +/* toString() should throw on a non-Tuple */ +let method = Tuple.prototype.toString; +assert.sameValue(method.call(#[1,2,3,4,5,6]), "1,2,3,4,5,6"); +assert.sameValue(method.call(Object(#[1,2,3,4,5,6])), "1,2,3,4,5,6"); +assertThrowsInstanceOf(() => method.call("monkeys"), TypeError, + "value of TupleObject must be a Tuple"); + +// Normal case +assert.sameValue(#[].toString(), ""); +assert.sameValue(#[1].toString(), "1"); +assert.sameValue(#[1,2].toString(), "1,2"); + +// if join method isn't callable, Object.toString should be called +Tuple.prototype.join = 7; +var t = #[1,2,3]; +assert.sameValue(t.toString(), "[object Tuple]"); + + diff --git a/test/staging/sm/Tuple/prototype/valueOf/length.js b/test/staging/sm/Tuple/prototype/valueOf/length.js new file mode 100644 index 0000000000..e958ef91d8 --- /dev/null +++ b/test/staging/sm/Tuple/prototype/valueOf/length.js @@ -0,0 +1,26 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +features: +- record-tuple +description: | + pending +esid: pending +---*/ + +var desc = Object.getOwnPropertyDescriptor(Tuple.valueOf, "length"); +assert.sameValue(desc.value, 0); +assert.sameValue(desc.writable, false); +assert.sameValue(desc.enumerable, false); +assert.sameValue(desc.configurable, true); + +assert.sameValue(isConstructor(Tuple.valueOf), false); + +assertThrowsInstanceOf(() => { + new Tuple.valueOf([]); +}, TypeError, '`new Tuple.valueOf()` throws TypeError'); + diff --git a/test/staging/sm/Tuple/prototype/valueOf/name.js b/test/staging/sm/Tuple/prototype/valueOf/name.js new file mode 100644 index 0000000000..49248ee865 --- /dev/null +++ b/test/staging/sm/Tuple/prototype/valueOf/name.js @@ -0,0 +1,20 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +features: +- record-tuple +description: | + pending +esid: pending +---*/ + +desc = Object.getOwnPropertyDescriptor(Tuple.valueOf, "name"); +assert.sameValue(desc.value, "valueOf"); +assert.sameValue(desc.writable, false); +assert.sameValue(desc.enumerable, false); +assert.sameValue(desc.configurable, true); + diff --git a/test/staging/sm/Tuple/prototype/valueOf/valueOf.js b/test/staging/sm/Tuple/prototype/valueOf/valueOf.js new file mode 100644 index 0000000000..6b415a7df7 --- /dev/null +++ b/test/staging/sm/Tuple/prototype/valueOf/valueOf.js @@ -0,0 +1,34 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +features: +- record-tuple +description: | + pending +esid: pending +---*/ +/* +8.2.3.3 Tuple.prototype.valueOf ( ) +When the valueOf function is called, the following steps are taken: + +1. Return ? thisTupleValue(this value). +*/ + +var valueOf = Tuple.prototype.valueOf; +assert.sameValue(typeof valueOf, 'function'); + +var tup = #[1,2,3]; +assert.sameValue(valueOf.call(tup), tup); +assert.sameValue(valueOf.call(Object(tup)), tup); +assertThrowsInstanceOf(() => valueOf.call("monkeys"), TypeError, + "this is not Tuple"); +assertThrowsInstanceOf(() => valueOf.call({}), TypeError, + "this is not Tuple"); +assertThrowsInstanceOf(() => valueOf.call(new Object(1)), TypeError, + "this is not Tuple"); + + diff --git a/test/staging/sm/Tuple/prototype/with/with.js b/test/staging/sm/Tuple/prototype/with/with.js new file mode 100644 index 0000000000..43f467b56f --- /dev/null +++ b/test/staging/sm/Tuple/prototype/with/with.js @@ -0,0 +1,79 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +features: +- record-tuple +description: | + pending +esid: pending +---*/ +/* +8.2.3.31 Tuple.prototype.with ( index, value ) +When the with method is called with two arguments, it returns a new Tuple with the element at index index replaced with value value. + +1. Let T be ? thisTupleValue(this value). +2. Let list be a new List containing the elements of T.[[Sequence]]. +3. Let length be the length of list list. +4. Let I be ? ToIndex(index). +5. If I ≥ length, throw a RangeError exception. +6. If Type(value) is Object, throw a TypeError exception. +7. Set list[I] to value. +8. Return a new Tuple value whose [[Sequence]] is list. +*/ +/* Step 1 */ +/* with() should throw on a non-Tuple */ +let method = Tuple.prototype.with; +assert.sameValue(method.call(#[1,2,3], 1, "monkeys"), #[1, "monkeys", 3]); +assert.sameValue(method.call(Object(#[1,2,3]), 1, "monkeys"), #[1, "monkeys", 3]); +assertThrowsInstanceOf(() => method.call("monkeys"), TypeError, + "value of TupleObject must be a Tuple"); +assertThrowsInstanceOf(() => method.call(true), TypeError, + "value of TupleObject must be a Tuple"); +assertThrowsInstanceOf(() => method.call(false), TypeError, + "value of TupleObject must be a Tuple"); + +/* method does not access constructor */ +var t = #[1]; +t.constructor = null; +var result = t.with(0, 0); +assert.sameValue(result, #[0]); +assert.sameValue(Object.getPrototypeOf(result), Tuple.prototype); + +/* Step 3 */ +/* Test that length is still handled correctly if it's overridden */ +Object.defineProperty(Tuple.prototype, "length", { get() { return 0 } }) +assert.sameValue(#[1,2,3,4,5].with(1, 5), #[1,5,3,4,5]); + +var tup = #[1,2,3]; +var len = 3; +/* Step 4 -- toIndex returns 0 for non-integers */ +assert.sameValue(tup.with("monkeys", 2), tup.with(0, 2)); +assert.sameValue(tup.with(undefined, 2), tup.with(0, 2)); +assert.sameValue(tup.with(undefined), tup.with(0, undefined)); +assert.sameValue(tup.with(), tup.with(0, undefined)); + +/* Step 5 */ +assertThrowsInstanceOf(() => tup.with(-5, "monkeys"), + RangeError, "index out of range"); +assertThrowsInstanceOf(() => tup.with(Number.MAX_SAFE_INTEGER, "monkeys"), + RangeError, "index out of range"); +assertThrowsInstanceOf(() => tup.with(len + 5, "monkeys"), + RangeError, "index out of range"); + +/* Step 6 -- item is Object */ +assertThrowsInstanceOf(() => tup.with(1, []), + TypeError, "Tuple can't contain Object"); +assertThrowsInstanceOf(() => tup.with(0, new Object()), + TypeError, "Tuple can't contain Object"); +assertThrowsInstanceOf(() => tup.with(2, {'a': 'b'}), + TypeError, "Tuple can't contain Object"); + +/* Step 8 */ +assert.sameValue(tup.with(0, "monkeys"), #["monkeys", 2, 3]); +assert.sameValue(tup.with(1, #['a', 'b', 'c']), #[1, #['a', 'b', 'c'], 3]); +assert.sameValue(tup.with(2, 42), #[1, 2, 42]); + diff --git a/test/staging/sm/Tuple/type-errors.js b/test/staging/sm/Tuple/type-errors.js new file mode 100644 index 0000000000..9b9aa626e2 --- /dev/null +++ b/test/staging/sm/Tuple/type-errors.js @@ -0,0 +1,42 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +features: +- record-tuple +description: | + pending +esid: pending +---*/ +/* +3.1.2 ToNumber ( argument ) +The abstract operation ToNumber takes argument argument. It converts argument to a value of type Number according to Table 2: + +... +Tuple Throw a TypeError exception. +... +*/ +assertThrowsInstanceOf(() => #[1, 2] + 3, TypeError, + "cannot convert record or tuple to number"); +assertThrowsInstanceOf(() => 3 + #[1, 2], TypeError, + "cannot convert record or tuple to number"); +assertThrowsInstanceOf(() => 3 - #[1, 2], TypeError, + "cannot convert record or tuple to number"); +assertThrowsInstanceOf(() => 3 * #[1, 2], TypeError, + "cannot convert record or tuple to number"); +assertThrowsInstanceOf(() => 3 / #[1, 2], TypeError, + "cannot convert record or tuple to number"); +assertThrowsInstanceOf(() => #[1, 2] > #[1, 3], TypeError, + "cannot convert record or tuple to number"); +assertThrowsInstanceOf(() => #[1, 2] < #[1, 3], TypeError, + "cannot convert record or tuple to number"); +assertThrowsInstanceOf(() => #[1, 2] >= #[1, 3], TypeError, + "cannot convert record or tuple to number"); +assertThrowsInstanceOf(() => #[1, 2] <= #[1, 3], TypeError, + "cannot convert record or tuple to number"); + + + diff --git a/test/staging/sm/Tuple/wrapper.js b/test/staging/sm/Tuple/wrapper.js new file mode 100644 index 0000000000..f65ffec39f --- /dev/null +++ b/test/staging/sm/Tuple/wrapper.js @@ -0,0 +1,36 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +features: +- record-tuple +description: | + pending +esid: pending +---*/ + +var boxO = Object(#[1, 2, 3]); + +assert.sameValue(Object.isExtensible(boxO), false); +assert.sameValue(Object.isSealed(boxO), true); +assert.sameValue(Object.isFrozen(boxO), true); + +boxO[0] = 3; +assert.sameValue(boxO[0], 1); +assertThrowsInstanceOf(() => { "use strict"; boxO[0] = 3; }, TypeError); +assert.sameValue(boxO[0], 1); + +boxO[4] = 3; +assert.sameValue(boxO[4], undefined); +assertThrowsInstanceOf(() => { "use strict"; boxO[4] = 3; }, TypeError); +assert.sameValue(boxO[4], undefined); + +assertThrowsInstanceOf(() => { Object.defineProperty(boxO, "0", { value: 3 }); }, TypeError); +assert.sameValue(boxO[0], 1); + +assertThrowsInstanceOf(() => { Object.defineProperty(boxO, "4", { value: 3 }); }, TypeError); +assert.sameValue(boxO[4], undefined); + diff --git a/test/staging/sm/TypedArray/Tconstructor-fromTypedArray-byteLength.js b/test/staging/sm/TypedArray/Tconstructor-fromTypedArray-byteLength.js new file mode 100644 index 0000000000..0cf478a8ab --- /dev/null +++ b/test/staging/sm/TypedArray/Tconstructor-fromTypedArray-byteLength.js @@ -0,0 +1,26 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-TypedArray-shell.js, sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +var g = createNewGlobal(); + +var arr = [1, 2, 3]; +for (var constructor of anyTypedArrayConstructors) { + var tarr = new constructor(arr); + for (var constructor2 of anyTypedArrayConstructors) { + var copied = new constructor2(tarr); + assert.sameValue(copied.buffer.byteLength, arr.length * constructor2.BYTES_PER_ELEMENT); + + g.tarr = tarr; + copied = g.eval(`new ${constructor2.name}(tarr);`); + assert.sameValue(copied.buffer.byteLength, arr.length * constructor2.BYTES_PER_ELEMENT); + } +} + diff --git a/test/staging/sm/TypedArray/at.js b/test/staging/sm/TypedArray/at.js new file mode 100644 index 0000000000..a76def85d5 --- /dev/null +++ b/test/staging/sm/TypedArray/at.js @@ -0,0 +1,56 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-TypedArray-shell.js, sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +for (var constructor of anyTypedArrayConstructors) { + assert.sameValue(constructor.prototype.at.length, 1); + + assert.sameValue(new constructor([0]).at(0), 0); + assert.sameValue(new constructor([0]).at(-1), 0); + + assert.sameValue(new constructor([]).at(0), undefined); + assert.sameValue(new constructor([]).at(-1), undefined); + assert.sameValue(new constructor([]).at(1), undefined); + + assert.sameValue(new constructor([0, 1]).at(0), 0); + assert.sameValue(new constructor([0, 1]).at(1), 1); + assert.sameValue(new constructor([0, 1]).at(-2), 0); + assert.sameValue(new constructor([0, 1]).at(-1), 1); + + assert.sameValue(new constructor([0, 1]).at(2), undefined); + assert.sameValue(new constructor([0, 1]).at(-3), undefined); + assert.sameValue(new constructor([0, 1]).at(-4), undefined); + assert.sameValue(new constructor([0, 1]).at(Infinity), undefined); + assert.sameValue(new constructor([0, 1]).at(-Infinity), undefined); + assert.sameValue(new constructor([0, 1]).at(NaN), 0); // ToInteger(NaN) = 0 + + // Called from other globals. + if (typeof createNewGlobal === "function") { + var at = createNewGlobal()[constructor.name].prototype.at; + assert.sameValue(at.call(new constructor([1, 2, 3]), 2), 3); + } + + // Throws if `this` isn't a TypedArray. + var invalidReceivers = [undefined, null, 1, false, "", Symbol(), [], {}, /./, + new Proxy(new constructor(), {})]; + invalidReceivers.forEach(invalidReceiver => { + assertThrowsInstanceOf(() => { + constructor.prototype.at.call(invalidReceiver); + }, TypeError, "Assert that 'at' fails if this value is not a TypedArray"); + }); + + // Test that the length getter is never called. + assert.sameValue(Object.defineProperty(new constructor([1, 2, 3]), "length", { + get() { + throw new Error("length accessor called"); + } + }).at(1), 2); +} + diff --git a/test/staging/sm/TypedArray/bug1526838.js b/test/staging/sm/TypedArray/bug1526838.js new file mode 100644 index 0000000000..a30cce5aa6 --- /dev/null +++ b/test/staging/sm/TypedArray/bug1526838.js @@ -0,0 +1,17 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-TypedArray-shell.js, sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +const testArray = [1n]; +for (const constructor of anyTypedArrayConstructors) { + assertThrowsInstanceOf(() => new constructor(testArray), TypeError); + assertThrowsInstanceOf(() => new constructor(testArray.values()), TypeError); +} + diff --git a/test/staging/sm/TypedArray/constructor-ArrayBuffer-species-wrap.js b/test/staging/sm/TypedArray/constructor-ArrayBuffer-species-wrap.js new file mode 100644 index 0000000000..85d956db43 --- /dev/null +++ b/test/staging/sm/TypedArray/constructor-ArrayBuffer-species-wrap.js @@ -0,0 +1,63 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-TypedArray-shell.js, sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ + +let g = createNewGlobal(); + +// Both TypedArray and ArrayBuffer from different global. +for (let ctor of typedArrayConstructors) { + let a = g.eval(`new ${ctor.name}([1, 2, 3, 4, 5]);`); + for (let ctor2 of typedArrayConstructors) { + let b = new ctor2(a); + assert.sameValue(Object.getPrototypeOf(b).constructor, ctor2); + assert.sameValue(Object.getPrototypeOf(b.buffer).constructor, ArrayBuffer); + } +} + +// Only ArrayBuffer from different global. +let origSpecies = Object.getOwnPropertyDescriptor(ArrayBuffer, Symbol.species); +let modSpecies = { + get() { + throw new Error("unexpected @@species access"); + } +}; +for (let ctor of typedArrayConstructors) { + let a = new ctor([1, 2, 3, 4, 5]); + for (let ctor2 of typedArrayConstructors) { + Object.defineProperty(ArrayBuffer, Symbol.species, modSpecies); + let b = new ctor2(a); + Object.defineProperty(ArrayBuffer, Symbol.species, origSpecies); + assert.sameValue(Object.getPrototypeOf(b).constructor, ctor2); + assert.sameValue(Object.getPrototypeOf(b.buffer).constructor, ArrayBuffer); + } +} + +// Only TypedArray from different global. +g.otherArrayBuffer = ArrayBuffer; +g.eval(` +var origSpecies = Object.getOwnPropertyDescriptor(ArrayBuffer, Symbol.species); +var modSpecies = { + get() { + throw new Error("unexpected @@species access"); + } +}; +`); +for (let ctor of typedArrayConstructors) { + let a = g.eval(`new ${ctor.name}([1, 2, 3, 4, 5]);`); + for (let ctor2 of typedArrayConstructors) { + g.eval(`Object.defineProperty(ArrayBuffer, Symbol.species, modSpecies);`); + let b = new ctor2(a); + g.eval(`Object.defineProperty(ArrayBuffer, Symbol.species, origSpecies);`); + assert.sameValue(Object.getPrototypeOf(b).constructor, ctor2); + assert.sameValue(Object.getPrototypeOf(b.buffer).constructor, ArrayBuffer); + } +} + diff --git a/test/staging/sm/TypedArray/constructor-ArrayBuffer-species.js b/test/staging/sm/TypedArray/constructor-ArrayBuffer-species.js new file mode 100644 index 0000000000..1086f444cb --- /dev/null +++ b/test/staging/sm/TypedArray/constructor-ArrayBuffer-species.js @@ -0,0 +1,28 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-TypedArray-shell.js, sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +for (let ctor of typedArrayConstructors) { + let arr = new ctor([1, 2, 3, 4, 5, 6, 7, 8]); + + arr.buffer.constructor = { + get [Symbol.species]() { + throw new Error("unexpected @@species access"); + } + }; + + for (let ctor2 of typedArrayConstructors) { + let arr2 = new ctor2(arr); + + assert.sameValue(Object.getPrototypeOf(arr2.buffer), ArrayBuffer.prototype); + assert.sameValue(arr2.buffer.constructor, ArrayBuffer); + } +} + diff --git a/test/staging/sm/TypedArray/constructor-buffer-sequence.js b/test/staging/sm/TypedArray/constructor-buffer-sequence.js new file mode 100644 index 0000000000..e272c75f66 --- /dev/null +++ b/test/staging/sm/TypedArray/constructor-buffer-sequence.js @@ -0,0 +1,239 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-TypedArray-shell.js, sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +// 22.2.4.5 TypedArray ( buffer [ , byteOffset [ , length ] ] ) + +// Ensure the various error conditions are tested in the correct order. + +const otherGlobal = createNewGlobal(); + +function* createBuffers(lengths = [0, 8]) { + for (let length of lengths) { + let buffer = new ArrayBuffer(length); + yield {buffer, detach: () => $262.detachArrayBuffer(buffer)}; + } + + for (let length of lengths) { + let buffer = new otherGlobal.ArrayBuffer(length); + yield {buffer, detach: () => otherGlobal.$262.detachArrayBuffer(buffer)}; + } +} + +const poisonedValue = new Proxy({}, new Proxy({}, { + get() { + // Throws an exception when any proxy trap is invoked. + throw new Error("Poisoned Value"); + } +})); + +class ExpectedError extends Error { } + +function ConstructorWithThrowingPrototype(detach) { + return Object.defineProperty(function(){}.bind(null), "prototype", { + get() { + if (detach) + detach(); + throw new ExpectedError(); + } + }); +} + +function ValueThrowing(detach) { + return { + valueOf() { + if (detach) + detach(); + throw new ExpectedError(); + } + }; +} + +function ValueReturning(value, detach) { + return { + valueOf() { + if (detach) + detach(); + return value; + } + }; +} + +// Ensure step 4 |AllocateTypedArray| is executed before step 6 |ToIndex(byteOffset)|. +for (let {buffer} of createBuffers()) { + let constructor = ConstructorWithThrowingPrototype(); + + assertThrowsInstanceOf(() => + Reflect.construct(Int32Array, [buffer, poisonedValue, 0], constructor), ExpectedError); +} + +// Ensure step 4 |AllocateTypedArray| is executed before step 9 |IsDetachedBuffer(buffer)|. +for (let {buffer, detach} of createBuffers()) { + let constructor = ConstructorWithThrowingPrototype(); + + detach(); + assertThrowsInstanceOf(() => + Reflect.construct(Int32Array, [buffer, 0, 0], constructor), ExpectedError); +} + +// Ensure step 4 |AllocateTypedArray| is executed before step 9 |IsDetachedBuffer(buffer)|. +// - Variant: Detach buffer dynamically. +for (let {buffer, detach} of createBuffers()) { + let constructor = ConstructorWithThrowingPrototype(detach); + + assertThrowsInstanceOf(() => + Reflect.construct(Int32Array, [buffer, 0, 0], constructor), ExpectedError); +} + +// Ensure step 4 |AllocateTypedArray| is executed before step 8.a |ToIndex(length)|. +for (let {buffer} of createBuffers()) { + let constructor = ConstructorWithThrowingPrototype(); + + assertThrowsInstanceOf(() => + Reflect.construct(Int32Array, [buffer, 0, poisonedValue], constructor), ExpectedError); +} + +// Ensure step 6 |ToIndex(byteOffset)| is executed before step 9 |IsDetachedBuffer(buffer)|. +for (let {buffer, detach} of createBuffers()) { + let byteOffset = ValueThrowing(); + + detach(); + assertThrowsInstanceOf(() => new Int32Array(buffer, byteOffset, 0), ExpectedError); +} + +// Ensure step 6 |ToIndex(byteOffset)| is executed before step 9 |IsDetachedBuffer(buffer)|. +// - Variant: Detach buffer dynamically. +for (let {buffer, detach} of createBuffers()) { + let byteOffset = ValueThrowing(detach); + + assertThrowsInstanceOf(() => new Int32Array(buffer, byteOffset, 0), ExpectedError); +} + +// Ensure step 6 |ToIndex(byteOffset)| is executed before step 8.a |ToIndex(length)|. +for (let {buffer} of createBuffers()) { + let byteOffset = ValueThrowing(); + + assertThrowsInstanceOf(() => new Int32Array(buffer, byteOffset, poisonedValue), ExpectedError); +} + +// Ensure step 7 |offset modulo elementSize ≠ 0| is executed before step 9 |IsDetachedBuffer(buffer)|. +for (let {buffer, detach} of createBuffers()) { + let byteOffset = 1; + + detach(); + assertThrowsInstanceOf(() => new Int32Array(buffer, byteOffset, 0), RangeError); +} + +// Ensure step 7 |offset modulo elementSize ≠ 0| is executed before step 9 |IsDetachedBuffer(buffer)|. +// - Variant: Detach buffer dynamically. +for (let {buffer, detach} of createBuffers()) { + let byteOffset = ValueReturning(1, detach); + + assertThrowsInstanceOf(() => new Int32Array(buffer, byteOffset, 0), RangeError); +} + +// Ensure step 7 |offset modulo elementSize ≠ 0| is executed before step 8.a |ToIndex(length)|. +for (let {buffer} of createBuffers()) { + assertThrowsInstanceOf(() => new Int32Array(buffer, 1, poisonedValue), RangeError); +} + +// Ensure step 8.a |ToIndex(length)| is executed before step 9 |IsDetachedBuffer(buffer)|. +for (let {buffer, detach} of createBuffers()) { + let byteOffset = 0; + let length = ValueThrowing(); + + detach(); + assertThrowsInstanceOf(() => new Int32Array(buffer, byteOffset, length), ExpectedError); +} + +// Ensure step 8.a |ToIndex(length)| is executed before step 9 |IsDetachedBuffer(buffer)|. +// - Variant: Detach buffer dynamically (1). +for (let {buffer, detach} of createBuffers()) { + let byteOffset = ValueReturning(0, detach); + let length = ValueThrowing(); + + assertThrowsInstanceOf(() => new Int32Array(buffer, byteOffset, length), ExpectedError); +} + +// Ensure step 8.a |ToIndex(length)| is executed before step 9 |IsDetachedBuffer(buffer)|. +// - Variant: Detach buffer dynamically (2). +for (let {buffer, detach} of createBuffers()) { + let byteOffset = 0; + let length = ValueThrowing(detach); + + assertThrowsInstanceOf(() => new Int32Array(buffer, byteOffset, length), ExpectedError); +} + +// Ensure step 9 |IsDetachedBuffer(buffer)| is executed before step 11.a |bufferByteLength modulo elementSize ≠ 0|. +for (let {buffer, detach} of createBuffers([1, 9])) { + let byteOffset = 0; + + detach(); + assertThrowsInstanceOf(() => new Int32Array(buffer, byteOffset), TypeError); +} + +// Ensure step 9 |IsDetachedBuffer(buffer)| is executed before step 11.a |bufferByteLength modulo elementSize ≠ 0|. +// - Variant: Detach buffer dynamically. +for (let {buffer, detach} of createBuffers([1, 9])) { + let byteOffset = ValueReturning(0, detach); + + assertThrowsInstanceOf(() => new Int32Array(buffer, byteOffset), TypeError); +} + +// Ensure step 9 |IsDetachedBuffer(buffer)| is executed before step 11.c |newByteLength < 0|. +for (let {buffer, detach} of createBuffers()) { + let byteOffset = 64; + + detach(); + assertThrowsInstanceOf(() => new Int32Array(buffer, byteOffset), TypeError); +} + +// Ensure step 9 |IsDetachedBuffer(buffer)| is executed before step 11.c |newByteLength < 0|. +// - Variant: Detach buffer dynamically. +for (let {buffer, detach} of createBuffers()) { + let byteOffset = ValueReturning(64, detach); + + assertThrowsInstanceOf(() => new Int32Array(buffer, byteOffset), TypeError); +} + +// Ensure step 9 |IsDetachedBuffer(buffer)| is executed before step 12.b |offset+newByteLength > bufferByteLength|. +// - Case A: The given byteOffset is too large. +for (let {buffer, detach} of createBuffers()) { + let byteOffset = 64; + let length = ValueReturning(0, detach); + + assertThrowsInstanceOf(() => new Int32Array(buffer, byteOffset, length), TypeError); +} + +// Ensure step 9 |IsDetachedBuffer(buffer)| is executed before step 12.b |offset+newByteLength > bufferByteLength|. +// - Case B: The given length is too large. +for (let {buffer, detach} of createBuffers()) { + let byteOffset = 0; + let length = ValueReturning(64, detach); + + assertThrowsInstanceOf(() => new Int32Array(buffer, byteOffset, length), TypeError); +} + +// Ensure we handle the case when ToIndex(byteOffset) detaches the array buffer. +for (let {buffer, detach} of createBuffers()) { + let byteOffset = ValueReturning(0, detach); + let length = 0; + + assertThrowsInstanceOf(() => new Int32Array(buffer, byteOffset, length), TypeError); +} + +// Ensure we handle the case when ToIndex(length) detaches the array buffer. +for (let {buffer, detach} of createBuffers()) { + let byteOffset = 0; + let length = ValueReturning(0, detach); + + assertThrowsInstanceOf(() => new Int32Array(buffer, byteOffset, length), TypeError); +} + diff --git a/test/staging/sm/TypedArray/constructor-byteoffsets-bounds.js b/test/staging/sm/TypedArray/constructor-byteoffsets-bounds.js new file mode 100644 index 0000000000..eab0f0c0a0 --- /dev/null +++ b/test/staging/sm/TypedArray/constructor-byteoffsets-bounds.js @@ -0,0 +1,43 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-TypedArray-shell.js, sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +// 22.2.4.5 TypedArray ( buffer [ , byteOffset [ , length ] ] ) + +// Test bound checks around for |byteOffset| and |length| arguments. + +const ab = new ArrayBuffer(0); + +for (let TA of typedArrayConstructors) { + // Test bound checks around INT32_MAX for |byteOffset| argument. + assertThrowsInstanceOf(() => new TA(ab, 2**31 - TA.BYTES_PER_ELEMENT), RangeError); + assertThrowsInstanceOf(() => new TA(ab, 2**31 - 1), RangeError); + assertThrowsInstanceOf(() => new TA(ab, 2**31), RangeError); + assertThrowsInstanceOf(() => new TA(ab, 2**31 + 1), RangeError); + assertThrowsInstanceOf(() => new TA(ab, 2**31 + TA.BYTES_PER_ELEMENT), RangeError); + + // Test bound checks around UINT32_MAX for |byteOffset| argument. + assertThrowsInstanceOf(() => new TA(ab, 2**32 - TA.BYTES_PER_ELEMENT), RangeError); + assertThrowsInstanceOf(() => new TA(ab, 2**32 - 1), RangeError); + assertThrowsInstanceOf(() => new TA(ab, 2**32), RangeError); + assertThrowsInstanceOf(() => new TA(ab, 2**32 + 1), RangeError); + assertThrowsInstanceOf(() => new TA(ab, 2**32 + TA.BYTES_PER_ELEMENT), RangeError); + + // Test bound checks around INT32_MAX for |length| argument. + assertThrowsInstanceOf(() => new TA(ab, 0, 2**31 - 1), RangeError); + assertThrowsInstanceOf(() => new TA(ab, 0, 2**31), RangeError); + assertThrowsInstanceOf(() => new TA(ab, 0, 2**31 + 1), RangeError); + + // Test bound checks around UINT32_MAX for |length| argument. + assertThrowsInstanceOf(() => new TA(ab, 0, 2**32 - 1), RangeError); + assertThrowsInstanceOf(() => new TA(ab, 0, 2**32), RangeError); + assertThrowsInstanceOf(() => new TA(ab, 0, 2**32 + 1), RangeError); +} + diff --git a/test/staging/sm/TypedArray/constructor-iterator-primitive.js b/test/staging/sm/TypedArray/constructor-iterator-primitive.js new file mode 100644 index 0000000000..0767e86327 --- /dev/null +++ b/test/staging/sm/TypedArray/constructor-iterator-primitive.js @@ -0,0 +1,38 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-TypedArray-shell.js, sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +var BUGNUMBER = 1021835; +var summary = "Returning non-object from @@iterator should throw"; + +print(BUGNUMBER + ": " + summary); + +let primitives = [ + 1, + true, + undefined, + null, + "foo", + Symbol.iterator +]; + +for (let ctor of typedArrayConstructors) { + for (let primitive of primitives) { + let arg = { + [Symbol.iterator]() { + return primitive; + } + }; + assertThrowsInstanceOf(() => { + new ctor(arg); + }, TypeError); + } +} + diff --git a/test/staging/sm/TypedArray/constructor-non-detached.js b/test/staging/sm/TypedArray/constructor-non-detached.js new file mode 100644 index 0000000000..90a91c799d --- /dev/null +++ b/test/staging/sm/TypedArray/constructor-non-detached.js @@ -0,0 +1,22 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-TypedArray-shell.js, sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +for (var constructor of typedArrayConstructors) { + var buf = new constructor(); + $262.detachArrayBuffer(buf.buffer); + assertThrowsInstanceOf(() => new constructor(buf), TypeError); + + var buffer = new ArrayBuffer(); + $262.detachArrayBuffer(buffer); + assertThrowsInstanceOf(() => new constructor(buffer), TypeError); +} + + diff --git a/test/staging/sm/TypedArray/constructor-not-callable.js b/test/staging/sm/TypedArray/constructor-not-callable.js new file mode 100644 index 0000000000..b1847f75e5 --- /dev/null +++ b/test/staging/sm/TypedArray/constructor-not-callable.js @@ -0,0 +1,19 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-TypedArray-shell.js, sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +for (var constructor of anyTypedArrayConstructors) { + assertThrowsInstanceOf(() => constructor(), TypeError); + assertThrowsInstanceOf(() => constructor(1), TypeError); + assertThrowsInstanceOf(() => constructor.call(null), TypeError); + assertThrowsInstanceOf(() => constructor.apply(null, []), TypeError); + assertThrowsInstanceOf(() => Reflect.apply(constructor, null, []), TypeError); +} + diff --git a/test/staging/sm/TypedArray/constructor-typedarray-species-other-global.js b/test/staging/sm/TypedArray/constructor-typedarray-species-other-global.js new file mode 100644 index 0000000000..e134db16bd --- /dev/null +++ b/test/staging/sm/TypedArray/constructor-typedarray-species-other-global.js @@ -0,0 +1,42 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-TypedArray-shell.js, sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +// 22.2.4.3 TypedArray ( typedArray ) + +// Test [[Prototype]] of newly created typed array and its array buffer, and +// ensure they are both created in the correct global. + +const thisGlobal = this; +const otherGlobal = createNewGlobal(); + +const typedArrays = [otherGlobal.eval("new Int32Array(0)")]; + +if (this.SharedArrayBuffer) { + typedArrays.push(otherGlobal.eval("new Int32Array(new SharedArrayBuffer(0))")); +} + +for (let typedArray of typedArrays) { + // Ensure the "constructor" property isn't accessed. + Object.defineProperty(typedArray.buffer, "constructor", { + get() { + throw new Error("constructor property accessed"); + } + }); + + for (let ctor of typedArrayConstructors) { + let newTypedArray = new ctor(typedArray); + + assert.sameValue(Object.getPrototypeOf(newTypedArray), ctor.prototype); + assert.sameValue(Object.getPrototypeOf(newTypedArray.buffer), ArrayBuffer.prototype); + assert.sameValue(newTypedArray.buffer.constructor, ArrayBuffer); + } +} + diff --git a/test/staging/sm/TypedArray/constructor-undefined-args.js b/test/staging/sm/TypedArray/constructor-undefined-args.js new file mode 100644 index 0000000000..53c591dc58 --- /dev/null +++ b/test/staging/sm/TypedArray/constructor-undefined-args.js @@ -0,0 +1,23 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-TypedArray-shell.js, sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +// Bug 1040402 + +var ab = new ArrayBuffer(16); + +assert.sameValue(new Int32Array(ab).length, 4); +assert.sameValue(new Int32Array(ab, undefined).length, 4); +assert.sameValue(new Int32Array(ab, undefined, undefined).length, 4); +assert.sameValue(new Int32Array(ab, 0).length, 4); +assert.sameValue(new Int32Array(ab, 0, undefined).length, 4); +assert.sameValue(new Int32Array(ab, 4).length, 3); +assert.sameValue(new Int32Array(ab, 4, undefined).length, 3); + diff --git a/test/staging/sm/TypedArray/constructor_bad-args.js b/test/staging/sm/TypedArray/constructor_bad-args.js new file mode 100644 index 0000000000..eae56e9d0a --- /dev/null +++ b/test/staging/sm/TypedArray/constructor_bad-args.js @@ -0,0 +1,22 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-TypedArray-shell.js, sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +// Bug 1227207 + +var AB = new ArrayBuffer(12); // Length divides 4 +var BC = new ArrayBuffer(14); // Length does not divide 4 + +assertThrowsInstanceOf(() => new Int32Array(AB, -1), RangeError); // 22.2.4.5 #8 +assertThrowsInstanceOf(() => new Int32Array(AB, 2), RangeError); // 22.2.4.5 #10 +assertThrowsInstanceOf(() => new Int32Array(BC), RangeError); // 22.2.4.5 #13.a +assertThrowsInstanceOf(() => new Int32Array(AB, 16), RangeError); // 22.2.4.5 #13.c +assertThrowsInstanceOf(() => new Int32Array(AB, 0, 4), RangeError); // 22.2.4.5 #14.c + diff --git a/test/staging/sm/TypedArray/detached-array-buffer-checks.js b/test/staging/sm/TypedArray/detached-array-buffer-checks.js new file mode 100644 index 0000000000..84e39bf219 --- /dev/null +++ b/test/staging/sm/TypedArray/detached-array-buffer-checks.js @@ -0,0 +1,116 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-TypedArray-shell.js, sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +// Nearly every %TypedArray%.prototype method should throw a TypeError when called +// atop a detached array buffer. Here we check verify that this holds true for +// all relevant functions. +let buffer = new ArrayBuffer(32); +let array = new Int32Array(buffer); +$262.detachArrayBuffer(buffer); + +// A nice poisoned callable to ensure that we fail on a detached buffer check +// before a method attempts to do anything with its arguments. +var POISON = (function() { + var internalTarget = {}; + var throwForAllTraps = + new Proxy(internalTarget, { get(target, prop, receiver) { + assert.sameValue(target, internalTarget); + assert.sameValue(receiver, throwForAllTraps); + throw "FAIL: " + prop + " trap invoked"; + }}); + return new Proxy(throwForAllTraps, throwForAllTraps); +}); + + +assertThrowsInstanceOf(() => { + array.copyWithin(POISON); +}, TypeError); + +assertThrowsInstanceOf(() => { + array.entries(); +}, TypeError); + +assertThrowsInstanceOf(() => { + array.fill(POISON); +}, TypeError); + +assertThrowsInstanceOf(() => { + array.filter(POISON); +}, TypeError); + +assertThrowsInstanceOf(() => { + array.find(POISON); +}, TypeError); + +assertThrowsInstanceOf(() => { + array.findIndex(POISON); +}, TypeError); + +assertThrowsInstanceOf(() => { + array.forEach(POISON); +}, TypeError); + +assertThrowsInstanceOf(() => { + array.indexOf(POISON); +}, TypeError); + +assertThrowsInstanceOf(() => { + array.includes(POISON); +}, TypeError); + +assertThrowsInstanceOf(() => { + array.join(POISON); +}, TypeError); + +assertThrowsInstanceOf(() => { + array.keys(); +}, TypeError); + +assertThrowsInstanceOf(() => { + array.lastIndexOf(POISON); +}, TypeError); + +assertThrowsInstanceOf(() => { + array.map(POISON); +}, TypeError); + +assertThrowsInstanceOf(() => { + array.reduce(POISON); +}, TypeError); + +assertThrowsInstanceOf(() => { + array.reduceRight(POISON); +}, TypeError); + +assertThrowsInstanceOf(() => { + array.reverse(); +}, TypeError); + +assertThrowsInstanceOf(() => { + array.slice(POISON, POISON); +}, TypeError); + +assertThrowsInstanceOf(() => { + array.some(POISON); +}, TypeError); + +assertThrowsInstanceOf(() => { + array.values(); +}, TypeError); + +assertThrowsInstanceOf(() => { + array.every(POISON); +}, TypeError); + +assertThrowsInstanceOf(() => { + array.sort(POISON); +}, TypeError); + diff --git a/test/staging/sm/TypedArray/element-setting-converts-using-ToNumber.js b/test/staging/sm/TypedArray/element-setting-converts-using-ToNumber.js new file mode 100644 index 0000000000..434da306c3 --- /dev/null +++ b/test/staging/sm/TypedArray/element-setting-converts-using-ToNumber.js @@ -0,0 +1,96 @@ +/* + * Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/licenses/publicdomain/ + */ + +/*--- +includes: [sm/non262-TypedArray-shell.js, sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +var gTestfile = 'element-setting-converts-using-ToNumber.js'; +//----------------------------------------------------------------------------- +var BUGNUMBER = 985733; +var summary = + "Typed array element-setting should convert to target type using ToNumber " + "followed by an element-type-specific truncation function"; + +print(BUGNUMBER + ": " + summary); + +/************** + * BEGIN TEST * + **************/ + +anyTypedArrayConstructors.forEach(function(TypedArray) { + var ta = new TypedArray(1); + assert.sameValue(ta[0], 0); + + var count = 0; + function setToObject() + { + for (var i = 0; i < 1e4; i++) + { + assert.sameValue(count, i); + ta[0] = { valueOf: function() { count++; return 17; } }; + } + } + setToObject(); + assert.sameValue(count, 1e4); + assert.sameValue(ta[0], 17); + + function setToString() + { + for (var i = 0; i < 2e4; i++) + ta[0] = "17.0000000000000000000000000000000000000000000000000000001"; + } + setToString(); + assert.sameValue(ta[0], 17); + + count = 0; + var arrayConstructed = + new TypedArray([{ valueOf: function() { count++; return 17; } }, + "17.0000000000000000000000000000000000000000000000000001"]); + assert.sameValue(count, 1); + assert.sameValue(arrayConstructed[0], 17); + assert.sameValue(arrayConstructed[1], 17); + + count = 0; + var arraySet = new TypedArray(5); + arraySet.set({ 0: 17, + 1: "17.000000000000000000000000000000000000000000000000000", + get 2() { + return { valueOf: undefined, + toString: function() { count++; return 42; } }; + }, + get 3() { return true; }, + set 3(v) { throw "FAIL"; }, + 4: { valueOf: function() { count++; return 127; } }, + length: 5 }); + assert.sameValue(count, 2); + assert.sameValue(arraySet[0], 17); + assert.sameValue(arraySet[1], 17); + assert.sameValue(arraySet[2], 42); + assert.sameValue(arraySet[3], 1); + assert.sameValue(arraySet[4], 127); + + var bigLen = 1e4; + var big = new TypedArray(bigLen); + function initBig() + { + for (var i = 0; i < bigLen; i++) + big[i] = (i % 2) ? 3 : { valueOf: function() { return 3; } }; + } + initBig(); + for (var i = 0; i < bigLen; i++) + { + assert.sameValue(big[i], 3, + "(" + Object.prototype.toString.call(big) + ")"); + } +}); + +/******************************************************************************/ + +print("Tests complete"); diff --git a/test/staging/sm/TypedArray/entries.js b/test/staging/sm/TypedArray/entries.js new file mode 100644 index 0000000000..2fa0f61fa9 --- /dev/null +++ b/test/staging/sm/TypedArray/entries.js @@ -0,0 +1,47 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [deepEqual.js, sm/non262-TypedArray-shell.js, sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +for (var constructor of anyTypedArrayConstructors) { + assert.sameValue(constructor.prototype.entries.length, 0); + assert.sameValue(constructor.prototype.entries.name, "entries"); + + assert.deepEqual([...new constructor(0).entries()], []); + assert.deepEqual([...new constructor(1).entries()], [[0, 0]]); + assert.deepEqual([...new constructor(2).entries()], [[0, 0], [1, 0]]); + assert.deepEqual([...new constructor([15]).entries()], [[0, 15]]); + + var arr = new constructor([1, 2, 3]); + var iterator = arr.entries(); + assert.deepEqual(iterator.next(), {value: [0, 1], done: false}); + assert.deepEqual(iterator.next(), {value: [1, 2], done: false}); + assert.deepEqual(iterator.next(), {value: [2, 3], done: false}); + assert.deepEqual(iterator.next(), {value: undefined, done: true}); + + // Called from other globals. + if (typeof createNewGlobal === "function") { + var otherGlobal = createNewGlobal(); + var entries = otherGlobal[constructor.name].prototype.entries; + assert.deepEqual([...entries.call(new constructor(2))], + [new otherGlobal.Array(0, 0), new otherGlobal.Array(1, 0)]); + arr = new (createNewGlobal()[constructor.name])(2); + assert.sameValue([...constructor.prototype.entries.call(arr)].toString(), "0,0,1,0"); + } + + // Throws if `this` isn't a TypedArray. + var invalidReceivers = [undefined, null, 1, false, "", Symbol(), [], {}, /./, + new Proxy(new constructor(), {})]; + invalidReceivers.forEach(invalidReceiver => { + assertThrowsInstanceOf(() => { + constructor.prototype.entries.call(invalidReceiver); + }, TypeError, "Assert that entries fails if this value is not a TypedArray"); + }); +} + diff --git a/test/staging/sm/TypedArray/every-and-some.js b/test/staging/sm/TypedArray/every-and-some.js new file mode 100644 index 0000000000..2159405355 --- /dev/null +++ b/test/staging/sm/TypedArray/every-and-some.js @@ -0,0 +1,258 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [deepEqual.js, sm/non262-TypedArray-shell.js, sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +// Tests for TypedArray#every. +for (var constructor of anyTypedArrayConstructors) { + assert.sameValue(constructor.prototype.every.length, 1); + + // Basic tests. + assert.sameValue(new constructor([1, 3, 5]).every(v => v % 2), true); + assert.sameValue(new constructor([1, 3, 5]).every(v => v > 2), false); + assert.sameValue(new constructor(10).every(v => v === 0), true); + assert.sameValue(new constructor().every(v => v > 1), true); + + var arr = new constructor([1, 2, 3, 4, 5]); + var sum = 0; + var count = 0; + assert.sameValue(arr.every((v, k, o) => { + count++; + sum += v; + assert.sameValue(k, v - 1); + assert.sameValue(o, arr); + return v < 3; + }), false); + assert.sameValue(sum, 6); + assert.sameValue(count, 3); + + // Tests for `thisArg` argument. + function assertThisArg(thisArg, thisValue) { + // In sloppy mode, `this` could be global object or a wrapper of `thisArg`. + assert.sameValue(arr.every(function() { + assert.deepEqual(this, thisValue); + return true; + }, thisArg), true); + + // In strict mode, `this` strictly equals `thisArg`. + assert.sameValue(arr.every(function() { + "use strict"; + assert.deepEqual(this, thisArg); + return true; + }, thisArg), true); + + // Passing `thisArg` has no effect if callback is an arrow function. + var self = this; + assert.sameValue(arr.every(() => { + assert.sameValue(this, self); + return true; + }, thisArg), true); + } + assertThisArg([1, 2, 3], [1, 2, 3]); + assertThisArg(Object, Object); + assertThisArg(1, Object(1)); + assertThisArg("1", Object("1")); + assertThisArg(false, Object(false)); + assertThisArg(undefined, this); + assertThisArg(null, this); + + // Throw an exception in the callback. + var sum = 0; + var count = 0; + var thrown = false; + try { + arr.every((v, k, o) => { + count++; + sum += v; + assert.sameValue(k, v - 1); + assert.sameValue(o, arr); + if (v === 3) { + throw "every"; + } + return true + }) + } catch(e) { + assert.sameValue(e, "every"); + thrown = true; + } + assert.sameValue(thrown, true); + assert.sameValue(sum, 6); + assert.sameValue(count, 3); + + // There is no callback or callback is not a function. + assertThrowsInstanceOf(() => { + arr.every(); + }, TypeError); + var invalidCallbacks = [undefined, null, 1, false, "", Symbol(), [], {}, /./]; + invalidCallbacks.forEach(callback => { + assertThrowsInstanceOf(() => { + arr.every(callback); + }, TypeError); + }) + + // Callback is a generator. + arr.every(function*(){ + throw "This line will not be executed"; + }); + + // Called from other globals. + if (typeof createNewGlobal === "function") { + var every = createNewGlobal()[constructor.name].prototype.every; + var sum = 0; + assert.sameValue(every.call(new constructor([1, 2, 3]), v => sum += v), true); + assert.sameValue(sum, 6); + } + + // Throws if `this` isn't a TypedArray. + var invalidReceivers = [undefined, null, 1, false, "", Symbol(), [], {}, /./, + new Proxy(new constructor(), {})]; + invalidReceivers.forEach(invalidReceiver => { + assertThrowsInstanceOf(() => { + constructor.prototype.every.call(invalidReceiver, () => true); + }, TypeError, "Assert that every fails if this value is not a TypedArray"); + }); + + // Test that the length getter is never called. + assert.sameValue(Object.defineProperty(new constructor([1, 2, 3]), "length", { + get() { + throw new Error("length accessor called"); + } + }).every(() => true), true); +} + +for (let constructor of anyTypedArrayConstructors.filter(isFloatConstructor)) { + assert.sameValue(new constructor([undefined, , NaN]).every(v => Object.is(v, NaN)), true); +} + +// Tests for TypedArray#some. +for (var constructor of anyTypedArrayConstructors) { + assert.sameValue(constructor.prototype.some.length, 1); + + // Basic tests. + assert.sameValue(new constructor([1, 2, 3]).some(v => v % 2), true); + assert.sameValue(new constructor([0, 2, 4]).some(v => v % 2), false); + assert.sameValue(new constructor([1, 3, 5]).some(v => v > 2), true); + assert.sameValue(new constructor([1, 3, 5]).some(v => v < 0), false); + assert.sameValue(new constructor(10).some(v => v !== 0), false); + assert.sameValue(new constructor().some(v => v > 1), false); + + var arr = new constructor([1, 2, 3, 4, 5]); + var sum = 0; + var count = 0; + assert.sameValue(arr.some((v, k, o) => { + count++; + sum += v; + assert.sameValue(k, v - 1); + assert.sameValue(o, arr); + return v > 2; + }), true); + assert.sameValue(sum, 6); + assert.sameValue(count, 3); + + // Tests for `thisArg` argument. + function assertThisArg(thisArg, thisValue) { + // In sloppy mode, `this` could be global object or a wrapper of `thisArg`. + assert.sameValue(arr.some(function() { + assert.deepEqual(this, thisValue); + return false; + }, thisArg), false); + + // In strict mode, `this` strictly equals `thisArg`. + assert.sameValue(arr.some(function() { + "use strict"; + assert.deepEqual(this, thisArg); + return false; + }, thisArg), false); + + // Passing `thisArg` has no effect if callback is an arrow function. + var self = this; + assert.sameValue(arr.some(() => { + assert.sameValue(this, self); + return false; + }, thisArg), false); + } + assertThisArg([1, 2, 3], [1, 2, 3]); + assertThisArg(Object, Object); + assertThisArg(1, Object(1)); + assertThisArg("1", Object("1")); + assertThisArg(false, Object(false)); + assertThisArg(undefined, this); + assertThisArg(null, this); + + // Throw an exception in the callback. + var sum = 0; + var count = 0; + var thrown = false; + try { + arr.some((v, k, o) => { + count++; + sum += v; + assert.sameValue(k, v - 1); + assert.sameValue(o, arr); + if (v === 3) { + throw "some"; + } + return false + }) + } catch(e) { + assert.sameValue(e, "some"); + thrown = true; + } + assert.sameValue(thrown, true); + assert.sameValue(sum, 6); + assert.sameValue(count, 3); + + // There is no callback or callback is not a function. + assertThrowsInstanceOf(() => { + arr.some(); + }, TypeError); + var invalidCallbacks = [undefined, null, 1, false, "", Symbol(), [], {}, /./]; + invalidCallbacks.forEach(callback => { + assertThrowsInstanceOf(() => { + arr.some(callback); + }, TypeError); + }) + + // Callback is a generator. + arr.some(function*(){ + throw "This line will not be executed"; + }); + + // Called from other globals. + if (typeof createNewGlobal === "function") { + var some = createNewGlobal()[constructor.name].prototype.some; + var sum = 0; + assert.sameValue(some.call(new constructor([1, 2, 3]), v => { + sum += v; + return false; + }), false); + assert.sameValue(sum, 6); + } + + // Throws if `this` isn't a TypedArray. + var invalidReceivers = [undefined, null, 1, false, "", Symbol(), [], {}, /./, + new Proxy(new constructor(), {})]; + invalidReceivers.forEach(invalidReceiver => { + assertThrowsInstanceOf(() => { + constructor.prototype.some.call(invalidReceiver, () => true); + }, TypeError, "Assert that some fails if this value is not a TypedArray"); + }); + + // Test that the length getter is never called. + assert.sameValue(Object.defineProperty(new constructor([1, 2, 3]), "length", { + get() { + throw new Error("length accessor called"); + } + }).some(() => false), false); +} + +for (let constructor of anyTypedArrayConstructors.filter(isFloatConstructor)) { + assert.sameValue(new constructor([undefined, , NaN]).some(v => v === v), false); +} + diff --git a/test/staging/sm/TypedArray/fill-detached.js b/test/staging/sm/TypedArray/fill-detached.js new file mode 100644 index 0000000000..0f965e1625 --- /dev/null +++ b/test/staging/sm/TypedArray/fill-detached.js @@ -0,0 +1,45 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-TypedArray-shell.js, sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +// Ensure %TypedArray%.prototype.fill checks for detached buffers. + +function DetachArrayBufferValue(buffer, value) { + return { + valueOf() { + $262.detachArrayBuffer(buffer); + return value; + } + }; +} + +function DetachTypedArrayValue(ta, value) { + return { + valueOf() { + $262.detachArrayBuffer(ta.buffer); + return value; + } + }; +} + +// Test when ArrayBuffer is already reified. +for (let length of [0, 1, 10, 4096]) { + let ta = new Int32Array(length); + let value = DetachArrayBufferValue(ta.buffer, 123); + assertThrowsInstanceOf(() => ta.fill(value), TypeError); +} + +// Test when ArrayBuffer is reified during the fill() call. +for (let length of [0, 1, 10, 4096]) { + let ta = new Int32Array(length); + let value = DetachTypedArrayValue(ta, 123); + assertThrowsInstanceOf(() => ta.fill(value), TypeError); +} + diff --git a/test/staging/sm/TypedArray/fill.js b/test/staging/sm/TypedArray/fill.js new file mode 100644 index 0000000000..0529caa47d --- /dev/null +++ b/test/staging/sm/TypedArray/fill.js @@ -0,0 +1,74 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [deepEqual.js, sm/non262-TypedArray-shell.js, sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +for (var constructor of anyTypedArrayConstructors) { + assert.deepEqual(constructor.prototype.fill.length, 1); + + assert.deepEqual(new constructor([]).fill(1), new constructor([])); + assert.deepEqual(new constructor([1,1,1]).fill(2), new constructor([2,2,2])); + assert.deepEqual(new constructor([1,1,1]).fill(2, 1), new constructor([1,2,2])); + assert.deepEqual(new constructor([1,1,1]).fill(2, 1, 2), new constructor([1,2,1])); + assert.deepEqual(new constructor([1,1,1]).fill(2, -2), new constructor([1,2,2])); + assert.deepEqual(new constructor([1,1,1]).fill(2, -2, -1), new constructor([1,2,1])); + assert.deepEqual(new constructor([1,1,1]).fill(2, undefined), new constructor([2,2,2])); + assert.deepEqual(new constructor([1,1,1]).fill(2, undefined, undefined), new constructor([2,2,2])); + assert.deepEqual(new constructor([1,1,1]).fill(2, 1, undefined), new constructor([1,2,2])); + assert.deepEqual(new constructor([1,1,1]).fill(2, undefined, 1), new constructor([2,1,1])); + assert.deepEqual(new constructor([1,1,1]).fill(2, 2, 1), new constructor([1,1,1])); + assert.deepEqual(new constructor([1,1,1]).fill(2, -1, 1), new constructor([1,1,1])); + assert.deepEqual(new constructor([1,1,1]).fill(2, -2, 1), new constructor([1,1,1])); + assert.deepEqual(new constructor([1,1,1]).fill(2, 1, -2), new constructor([1,1,1])); + assert.deepEqual(new constructor([1,1,1]).fill(2, 0.1), new constructor([2,2,2])); + assert.deepEqual(new constructor([1,1,1]).fill(2, 0.9), new constructor([2,2,2])); + assert.deepEqual(new constructor([1,1,1]).fill(2, 1.1), new constructor([1,2,2])); + assert.deepEqual(new constructor([1,1,1]).fill(2, 0.1, 0.9), new constructor([1,1,1])); + assert.deepEqual(new constructor([1,1,1]).fill(2, 0.1, 1.9), new constructor([2,1,1])); + assert.deepEqual(new constructor([1,1,1]).fill(2, 0.1, 1.9), new constructor([2,1,1])); + assert.deepEqual(new constructor([1,1,1]).fill(2, -0), new constructor([2,2,2])); + assert.deepEqual(new constructor([1,1,1]).fill(2, 0, -0), new constructor([1,1,1])); + assert.deepEqual(new constructor([1,1,1]).fill(2, NaN), new constructor([2,2,2])); + assert.deepEqual(new constructor([1,1,1]).fill(2, 0, NaN), new constructor([1,1,1])); + assert.deepEqual(new constructor([1,1,1]).fill(2, false), new constructor([2,2,2])); + assert.deepEqual(new constructor([1,1,1]).fill(2, true), new constructor([1,2,2])); + assert.deepEqual(new constructor([1,1,1]).fill(2, "0"), new constructor([2,2,2])); + assert.deepEqual(new constructor([1,1,1]).fill(2, "1"), new constructor([1,2,2])); + assert.deepEqual(new constructor([1,1,1]).fill(2, "-2"), new constructor([1,2,2])); + assert.deepEqual(new constructor([1,1,1]).fill(2, "-2", "-1"), new constructor([1,2,1])); + assert.deepEqual(new constructor([1,1,1]).fill(2, {valueOf: ()=>1}), new constructor([1,2,2])); + assert.deepEqual(new constructor([1,1,1]).fill(2, 0, {valueOf: ()=>1}), new constructor([2,1,1])); + + // Called from other globals. + if (typeof createNewGlobal === "function") { + var fill = createNewGlobal()[constructor.name].prototype.fill; + assert.deepEqual(fill.call(new constructor([3, 2, 1]), 2), new constructor([2, 2, 2])); + } + + // Throws if `this` isn't a TypedArray. + var invalidReceivers = [undefined, null, 1, false, "", Symbol(), [], {}, /./, + new Proxy(new constructor(), {})]; + invalidReceivers.forEach(invalidReceiver => { + assertThrowsInstanceOf(() => { + constructor.prototype.fill.call(invalidReceiver, 1); + }, TypeError); + }); + + // Test that the length getter is never called. + Object.defineProperty(new constructor([1, 2, 3]), "length", { + get() { + throw new Error("length accessor called"); + } + }).fill(1); +} + +for (let constructor of anyTypedArrayConstructors.filter(isFloatConstructor)) { + assert.deepEqual(new constructor([0, 0]).fill(NaN), new constructor([NaN, NaN])); +} + diff --git a/test/staging/sm/TypedArray/filter-species.js b/test/staging/sm/TypedArray/filter-species.js new file mode 100644 index 0000000000..2b68d3e0b0 --- /dev/null +++ b/test/staging/sm/TypedArray/filter-species.js @@ -0,0 +1,65 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [deepEqual.js, sm/non262-TypedArray-shell.js, sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +function test(constructor, constructor2, from=[1, 2, 3, 4, 5], to=[2, 4]) { + var modifiedConstructor = new constructor(from); + modifiedConstructor.constructor = constructor2; + assert.deepEqual(modifiedConstructor.filter(x => x % 2 == 0), new constructor2(to)); + var modifiedSpecies = new constructor(from); + modifiedSpecies.constructor = { [Symbol.species]: constructor2 }; + assert.deepEqual(modifiedSpecies.filter(x => x % 2 == 0), new constructor2(to)); +} + +// same size, same sign + +test(Int8Array, Uint8Array); +test(Int8Array, Uint8ClampedArray); + +test(Uint8Array, Int8Array); +test(Uint8Array, Uint8ClampedArray); + +test(Uint8ClampedArray, Int8Array); +test(Uint8ClampedArray, Uint8Array); + +test(Int16Array, Uint16Array); +test(Uint16Array, Int16Array); + +test(Int32Array, Uint32Array); +test(Uint32Array, Int32Array); + +// same size, different sign + +test(Int8Array, Uint8Array, [-1, -2, -3, -4, -5], [0xFE, 0xFC]); +test(Int8Array, Uint8ClampedArray, [-1, -2, -3, -4, -5], [0, 0]); + +test(Uint8Array, Int8Array, [0xFF, 0xFE, 0xFD, 0xFC, 0xFB], [-2, -4]); +test(Uint8ClampedArray, Int8Array, [0xFF, 0xFE, 0xFD, 0xFC, 0xFB], [-2, -4]); + +test(Int16Array, Uint16Array, [-1, -2, -3, -4, -5], [0xFFFE, 0xFFFC]); +test(Uint16Array, Int16Array, [0xFFFF, 0xFFFE, 0xFFFD, 0xFFFC, 0xFFFB], [-2, -4]); + +test(Int32Array, Uint32Array, [-1, -2, -3, -4, -5], [0xFFFFFFFE, 0xFFFFFFFC]); +test(Uint32Array, Int32Array, [0xFFFFFFFF, 0xFFFFFFFE, 0xFFFFFFFD, 0xFFFFFFFC, 0xFFFFFFFB], [-2, -4]); + +// different size + +test(Uint8Array, Uint16Array); +test(Uint16Array, Uint8Array); + +test(Uint8Array, Uint32Array); +test(Uint32Array, Uint8Array); + +test(Uint16Array, Uint32Array); +test(Uint32Array, Uint16Array); + +test(Float32Array, Float64Array); +test(Float64Array, Float32Array); + diff --git a/test/staging/sm/TypedArray/find-and-findIndex.js b/test/staging/sm/TypedArray/find-and-findIndex.js new file mode 100644 index 0000000000..5e7a3a7866 --- /dev/null +++ b/test/staging/sm/TypedArray/find-and-findIndex.js @@ -0,0 +1,58 @@ +/* + * Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/licenses/publicdomain/ + */ + +/*--- +includes: [sm/non262-TypedArray-shell.js, sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +var BUGNUMBER = 1078975; +var summary = "Implement %TypedArray%.prototype.{find, findIndex}"; +print(BUGNUMBER + ": " + summary); + +const methods = ["find", "findIndex"]; + +anyTypedArrayConstructors.forEach(constructor => { + methods.forEach(method => { + var arr = new constructor([0, 1, 2, 3, 4, 5]); + // test that this.length is never called + Object.defineProperty(arr, "length", { + get() { + throw new Error("length accessor called"); + } + }); + assert.sameValue(arr[method].length, 1); + assert.sameValue(arr[method](v => v === 3), 3); + assert.sameValue(arr[method](v => v === 6), method === "find" ? undefined : -1); + + var thisValues = [undefined, null, true, 1, "foo", [], {}]; + if (typeof Symbol == "function") + thisValues.push(Symbol()); + + thisValues.forEach(thisArg => + assertThrowsInstanceOf(() => arr[method].call(thisArg, () => true), TypeError) + ); + + assertThrowsInstanceOf(() => arr[method](), TypeError); + assertThrowsInstanceOf(() => arr[method](1), TypeError); + }); +}); + +anyTypedArrayConstructors.filter(isFloatConstructor).forEach(constructor => { + var arr = new constructor([-0, 0, 1, 5, NaN, 6]); + assert.sameValue(arr.find(v => Number.isNaN(v)), NaN); + assert.sameValue(arr.findIndex(v => Number.isNaN(v)), 4); + + assert.sameValue(arr.find(v => Object.is(v, 0)), 0); + assert.sameValue(arr.findIndex(v => Object.is(v, 0)), 1); + + assert.sameValue(arr.find(v => Object.is(v, -0)), -0); + assert.sameValue(arr.findIndex(v => Object.is(v, -0)), 0); +}) + + diff --git a/test/staging/sm/TypedArray/findLast-and-findLastIndex.js b/test/staging/sm/TypedArray/findLast-and-findLastIndex.js new file mode 100644 index 0000000000..c02d00c8fc --- /dev/null +++ b/test/staging/sm/TypedArray/findLast-and-findLastIndex.js @@ -0,0 +1,58 @@ +/* + * Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/licenses/publicdomain/ + */ + +/*--- +includes: [sm/non262-TypedArray-shell.js, sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +var BUGNUMBER = 1704385; +var summary = "Implement %TypedArray%.prototype.{findLast, findLastIndex}"; +print(BUGNUMBER + ": " + summary); + +const methods = ["findLast", "findLastIndex"]; + +anyTypedArrayConstructors.forEach(constructor => { + methods.forEach(method => { + var arr = new constructor([0, 1, 2, 3, 4, 5]); + // test that this.length is never called + Object.defineProperty(arr, "length", { + get() { + throw new Error("length accessor called"); + } + }); + assert.sameValue(arr[method].length, 1); + assert.sameValue(arr[method](v => v === 3), 3); + assert.sameValue(arr[method](v => v === 6), method === "findLast" ? undefined : -1); + + var thisValues = [undefined, null, true, 1, "foo", [], {}]; + if (typeof Symbol == "function") + thisValues.push(Symbol()); + + thisValues.forEach(thisArg => + assertThrowsInstanceOf(() => arr[method].call(thisArg, () => true), TypeError) + ); + + assertThrowsInstanceOf(() => arr[method](), TypeError); + assertThrowsInstanceOf(() => arr[method](1), TypeError); + }); +}); + +anyTypedArrayConstructors.filter(isFloatConstructor).forEach(constructor => { + var arr = new constructor([-0, 0, 1, 5, NaN, 6]); + assert.sameValue(arr.findLast(v => Number.isNaN(v)), NaN); + assert.sameValue(arr.findLastIndex(v => Number.isNaN(v)), 4); + + assert.sameValue(arr.findLast(v => Object.is(v, 0)), 0); + assert.sameValue(arr.findLastIndex(v => Object.is(v, 0)), 1); + + assert.sameValue(arr.findLast(v => Object.is(v, -0)), -0); + assert.sameValue(arr.findLastIndex(v => Object.is(v, -0)), 0); +}) + + diff --git a/test/staging/sm/TypedArray/forEach.js b/test/staging/sm/TypedArray/forEach.js new file mode 100644 index 0000000000..0b54003a8e --- /dev/null +++ b/test/staging/sm/TypedArray/forEach.js @@ -0,0 +1,102 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [deepEqual.js, sm/non262-TypedArray-shell.js, sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +// Tests for TypedArray#forEach +for (var constructor of anyTypedArrayConstructors) { + assert.sameValue(constructor.prototype.forEach.length, 1); + + var arr = new constructor([1, 2, 3, 4, 5]); + // Tests for `thisArg` argument. + function assertThisArg(thisArg, thisValue) { + // In sloppy mode, `this` could be global object or a wrapper of `thisArg`. + arr.forEach(function() { + assert.deepEqual(this, thisValue); + return false; + }, thisArg); + + // In strict mode, `this` strictly equals `thisArg`. + arr.forEach(function() { + "use strict"; + assert.deepEqual(this, thisArg); + return false; + }, thisArg); + + // Passing `thisArg` has no effect if callback is an arrow function. + var self = this; + arr.forEach(() => { + assert.sameValue(this, self); + return false; + }, thisArg); + } + assertThisArg([1, 2, 3], [1, 2, 3]); + assertThisArg(Object, Object); + assertThisArg(1, Object(1)); + assertThisArg("1", Object("1")); + assertThisArg(false, Object(false)); + assertThisArg(undefined, this); + assertThisArg(null, this); + + // Throw an exception in the callback. + var sum = 0; + var count = 0; + var thrown = false; + try { + assert.sameValue(arr.forEach((v) => { + count++; + sum += v; + if (v === 3) { + throw "forEach"; + } + }), undefined) + } catch(e) { + assert.sameValue(e, "forEach"); + thrown = true; + } + assert.sameValue(thrown, true); + assert.sameValue(sum, 6); + assert.sameValue(count, 3); + + // There is no callback or callback is not a function. + assertThrowsInstanceOf(() => { + arr.forEach(); + }, TypeError); + var invalidCallbacks = [undefined, null, 1, false, "", Symbol(), [], {}, /./]; + invalidCallbacks.forEach(callback => { + assertThrowsInstanceOf(() => { + arr.forEach(callback); + }, TypeError); + }) + + // Callback is a generator. + arr.forEach(function*(){ + throw "This line will not be executed"; + }); + + // Called from other globals. + if (typeof createNewGlobal === "function") { + var forEach = createNewGlobal()[constructor.name].prototype.forEach; + var sum = 0; + forEach.call(new constructor([1, 2, 3]), v => { + sum += v; + }); + assert.sameValue(sum, 6); + } + + // Throws if `this` isn't a TypedArray. + var invalidReceivers = [undefined, null, 1, false, "", Symbol(), [], {}, /./, + new Proxy(new constructor(), {})]; + invalidReceivers.forEach(invalidReceiver => { + assertThrowsInstanceOf(() => { + constructor.prototype.forEach.call(invalidReceiver, () => true); + }, TypeError, "Assert that some fails if this value is not a TypedArray"); + }); +} + diff --git a/test/staging/sm/TypedArray/from_basics.js b/test/staging/sm/TypedArray/from_basics.js new file mode 100644 index 0000000000..d27558270f --- /dev/null +++ b/test/staging/sm/TypedArray/from_basics.js @@ -0,0 +1,51 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [deepEqual.js, sm/non262-TypedArray-shell.js, sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +for (var constructor of anyTypedArrayConstructors) { + // 'from' method is identical for all typed array constructors. + assert.sameValue(anyTypedArrayConstructors[0].from === constructor.from, true); + + // %TypedArray%.from copies arrays. + var src = new constructor([1, 2, 3]), copy = constructor.from(src); + assert.sameValue(copy === src, false); + assert.sameValue(copy instanceof constructor, true); + assert.deepEqual(copy, src); + + // Non-element properties are not copied. + var a = new constructor([0, 1]); + a.name = "lisa"; + assert.deepEqual(constructor.from(a), new constructor([0, 1])); + + // %TypedArray%.from can copy non-iterable objects, if they're array-like. + src = {0: 0, 1: 1, length: 2}; + copy = constructor.from(src); + assert.sameValue(copy instanceof constructor, true); + assert.deepEqual(copy, new constructor([0, 1])); + + // Properties past the .length are not copied. + src = {0: "0", 1: "1", 2: "two", 9: "nine", name: "lisa", length: 2}; + assert.deepEqual(constructor.from(src), new constructor([0, 1])); + + // If an object has neither an @@iterator method nor .length, + // then it's treated as zero-length. + assert.deepEqual(constructor.from({}), new constructor()); + + // Primitives will be coerced to primitive wrapper first. + assert.deepEqual(constructor.from(1), new constructor()); + assert.deepEqual(constructor.from("123"), new constructor([1, 2, 3])); + assert.deepEqual(constructor.from(true), new constructor()); + assert.deepEqual(constructor.from(Symbol()), new constructor()); + + // Source object property order doesn't matter. + src = {length: 2, 1: "1", 0: "0"}; + assert.deepEqual(constructor.from(src), new constructor([0, 1])); +} + diff --git a/test/staging/sm/TypedArray/from_constructor.js b/test/staging/sm/TypedArray/from_constructor.js new file mode 100644 index 0000000000..35415f4c45 --- /dev/null +++ b/test/staging/sm/TypedArray/from_constructor.js @@ -0,0 +1,45 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-TypedArray-shell.js, sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +for (var constructor of anyTypedArrayConstructors) { + // Note %TypedArray%.from(iterable) calls 'this' with an argument whose value is + // `[...iterable].length`, while Array.from(iterable) doesn't pass any argument. + constructor.from.call(function(len){ + assert.sameValue(len, 3); + return new constructor(len); + }, Array(3)); + + // If the 'this' value passed to %TypedArray.from is not a constructor, + // then an exception is thrown, while Array.from will use Array as it's constructor. + var arr = [3, 4, 5]; + var nonconstructors = [ + {}, Math, Object.getPrototypeOf, undefined, 17, + () => ({}) // arrow functions are not constructors + ]; + for (var v of nonconstructors) { + assertThrowsInstanceOf(() => { + constructor.from.call(v, arr); + }, TypeError); + } + + // %TypedArray%.from does not get confused if global constructors for typed arrays + // are replaced with another constructor. + function NotArray(...rest) { + return new constructor(...rest); + } + var RealArray = constructor; + NotArray.from = constructor.from; + this[constructor.name] = NotArray; + assert.sameValue(RealArray.from([1]) instanceof RealArray, true); + assert.sameValue(NotArray.from([1]) instanceof RealArray, true); + this[constructor.name] = RealArray; +} + diff --git a/test/staging/sm/TypedArray/from_errors.js b/test/staging/sm/TypedArray/from_errors.js new file mode 100644 index 0000000000..52cd523b06 --- /dev/null +++ b/test/staging/sm/TypedArray/from_errors.js @@ -0,0 +1,85 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [deepEqual.js, sm/non262-TypedArray-shell.js, sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +for (var constructor of anyTypedArrayConstructors) { + // %TypedArray%.from throws if the argument is undefined or null. + assertThrowsInstanceOf(() => constructor.from(), TypeError); + assertThrowsInstanceOf(() => constructor.from(undefined), TypeError); + assertThrowsInstanceOf(() => constructor.from(null), TypeError); + + // Unlike Array.from, %TypedArray%.from doesn't get or set the length property. + function ObjectWithThrowingLengthGetterSetter(...rest) { + var ta = new constructor(...rest); + Object.defineProperty(ta, "length", { + configurable: true, + get() { throw new RangeError("getter!"); }, + set() { throw new RangeError("setter!"); } + }); + return ta; + } + ObjectWithThrowingLengthGetterSetter.from = constructor.from; + assert.sameValue(ObjectWithThrowingLengthGetterSetter.from([123])[0], 123); + + // %TypedArray%.from throws if mapfn is neither callable nor undefined. + assertThrowsInstanceOf(() => constructor.from([3, 4, 5], {}), TypeError); + assertThrowsInstanceOf(() => constructor.from([3, 4, 5], "also not a function"), TypeError); + assertThrowsInstanceOf(() => constructor.from([3, 4, 5], null), TypeError); + + // Even if the function would not have been called. + assertThrowsInstanceOf(() => constructor.from([], JSON), TypeError); + + // If mapfn is not undefined and not callable, the error happens before anything else. + // Before calling the constructor, before touching the arrayLike. + var log = ""; + var obj; + function C(...rest) { + log += "C"; + obj = new constructor(...rest); + return obj; + } + var p = new Proxy({}, { + has: function () { log += "1"; }, + get: function () { log += "2"; }, + getOwnPropertyDescriptor: function () { log += "3"; } + }); + assertThrowsInstanceOf(() => constructor.from.call(C, p, {}), TypeError); + assert.sameValue(log, ""); + + // If mapfn throws, the new object has already been created. + var arrayish = { + get length() { log += "l"; return 1; }, + get 0() { log += "0"; return "q"; } + }; + log = ""; + var exc = {surprise: "ponies"}; + assertThrowsValue(() => constructor.from.call(C, arrayish, () => { throw exc; }), exc); + assert.sameValue(log, "lC0"); + assert.sameValue(obj instanceof constructor, true); + + // It's a TypeError if the @@iterator property is a primitive (except null and undefined). + for (var primitive of ["foo", 17, Symbol(), true]) { + assertThrowsInstanceOf(() => constructor.from({[Symbol.iterator] : primitive}), TypeError); + } + assert.deepEqual(constructor.from({[Symbol.iterator]: null}), new constructor()); + assert.deepEqual(constructor.from({[Symbol.iterator]: undefined}), new constructor()); + + // It's a TypeError if the iterator's .next() method returns a primitive. + for (var primitive of [undefined, null, "foo", 17, Symbol(), true]) { + assertThrowsInstanceOf( + () => constructor.from({ + [Symbol.iterator]() { + return {next() { return primitive; }}; + } + }), + TypeError); + } +} + diff --git a/test/staging/sm/TypedArray/from_iterable.js b/test/staging/sm/TypedArray/from_iterable.js new file mode 100644 index 0000000000..2fee3f4a2c --- /dev/null +++ b/test/staging/sm/TypedArray/from_iterable.js @@ -0,0 +1,58 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [deepEqual.js, sm/non262-TypedArray-shell.js, sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +for (var constructor of anyTypedArrayConstructors) { + // %TypedArray%.from works on arguments objects. + (function () { + assert.deepEqual(constructor.from(arguments), new constructor(["0", "1", undefined])); + })("0", "1", undefined); + + // If an object has both .length and [@@iterator] properties, [@@iterator] is used. + var a = ['0', '1', '2', '3', '4']; + a[Symbol.iterator] = function* () { + for (var i = 5; i--; ) + yield this[i]; + }; + + var log = ''; + function f(x) { + log += x; + return x + x; + } + + var b = constructor.from(a, f); + assert.deepEqual(b, new constructor(['44', '33', '22', '11', '00'])); + assert.sameValue(log, '43210'); + + // In fact, if [@@iterator] is present, .length isn't queried at all. + var pa = new Proxy(a, { + has: function (target, id) { + if (id === "length") + throw new Error(".length should not be queried (has)"); + return id in target; + }, + get: function (target, id) { + if (id === "length") + throw new Error(".length should not be queried (get)"); + return target[id]; + }, + getOwnPropertyDescriptor: function (target, id) { + if (id === "length") + throw new Error(".length should not be queried (getOwnPropertyDescriptor)"); + return Object.getOwnPropertyDescriptor(target, id) + } + }); + log = ""; + b = constructor.from(pa, f); + assert.deepEqual(b, new constructor(['44', '33', '22', '11', '00'])); + assert.sameValue(log, '43210'); +} + diff --git a/test/staging/sm/TypedArray/from_mapping.js b/test/staging/sm/TypedArray/from_mapping.js new file mode 100644 index 0000000000..b68bbb6522 --- /dev/null +++ b/test/staging/sm/TypedArray/from_mapping.js @@ -0,0 +1,54 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [deepEqual.js, sm/non262-TypedArray-shell.js, sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +for (var constructor of anyTypedArrayConstructors) { + // If the mapfn argument to %TypedArray%.from is undefined, don't map. + assert.deepEqual(constructor.from([3, 4, 5], undefined), new constructor([3, 4, 5])); + assert.deepEqual(constructor.from([4, 5, 6], undefined, Math), new constructor([4, 5, 6])); + + // mapfn is called with two arguments: value and index. + var log = []; + function f(...args) { + log.push(args); + return log.length; + } + assert.deepEqual(constructor.from(['a', 'e', 'i', 'o', 'u'], f), new constructor([1, 2, 3, 4, 5])); + assert.deepEqual(log, [['a', 0], ['e', 1], ['i', 2], ['o', 3], ['u', 4]]); + + // If the object to be copied is non-iterable, mapfn is still called with two + // arguments. + log = []; + assert.deepEqual(constructor.from({0: "zero", 1: "one", length: 2}, f), new constructor([1, 2])); + assert.deepEqual(log, [["zero", 0], ["one", 1]]); + + // If the object to be copied is iterable and the constructor is not Array, + // mapfn is still called with two arguments. + log = []; + function C(...rest) { + return new constructor(...rest); + } + C.from = constructor.from; + var c = new C(2); + c[0] = 1; + c[1] = 2; + assert.deepEqual(C.from(["zero", "one"], f), c); + assert.deepEqual(log, [["zero", 0], ["one", 1]]); + + // The mapfn is called even if the value to be mapped is undefined. + assert.deepEqual(constructor.from([0, 1, , 3], String), new constructor(["0", "1", "undefined", "3"])); + var arraylike = {length: 4, "0": 0, "1": 1, "3": 3}; + assert.deepEqual(constructor.from(arraylike, String), new constructor(["0", "1", "undefined", "3"])); +} + +// %TypedArray%.from(obj, map) is not exactly the same as %TypedArray%.from(obj).map(mapFn). +assert.deepEqual(Int8Array.from([150], v => v / 2), new Int8Array([75])); +assert.deepEqual(Int8Array.from([150]).map(v => v / 2), new Int8Array([-53])); + diff --git a/test/staging/sm/TypedArray/from_realms.js b/test/staging/sm/TypedArray/from_realms.js new file mode 100644 index 0000000000..3617fdcec6 --- /dev/null +++ b/test/staging/sm/TypedArray/from_realms.js @@ -0,0 +1,41 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-TypedArray-shell.js, sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +for (var constructor of anyTypedArrayConstructors) { + if (typeof createNewGlobal !== 'function') + break; + + // G[constructor.name].from, where G is any global, produces an array whose prototype + // is G[constructor.name].prototype. + var g = createNewGlobal(); + var ga = g[constructor.name].from([1, 2, 3]); + assert.sameValue(ga instanceof g[constructor.name], true); + + // %TypedArray%.from can be applied to a constructor from another realm. + var p = constructor.from.call(g[constructor.name], [1, 2, 3]); + assert.sameValue(p instanceof g[constructor.name], true); + var q = g[constructor.name].from.call(constructor, [3, 4, 5]); + assert.sameValue(q instanceof constructor, true); + + // The default 'this' value received by a non-strict mapping function is + // that function's global, not %TypedArray%.from's global or the caller's global. + var h = createNewGlobal(), result = undefined; + h.mainGlobal = this; + h.eval("function f() { mainGlobal.result = this; }"); + g[constructor.name].from.call(constructor, [5, 6, 7], h.f); + // (Give each global in the test a name, for better error messages. But use + // globalName, because window.name is complicated.) + this.globalName = "main"; + g.globalName = "g"; + h.globalName = "h"; + assert.sameValue(result.globalName, "h"); +} + diff --git a/test/staging/sm/TypedArray/from_string.js b/test/staging/sm/TypedArray/from_string.js new file mode 100644 index 0000000000..4777792126 --- /dev/null +++ b/test/staging/sm/TypedArray/from_string.js @@ -0,0 +1,33 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [compareArray.js, sm/non262-TypedArray-shell.js, sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +// %TypedArray%.from called on Array should also handle strings correctly. +var from = Int8Array.from.bind(Uint32Array); +var toCodePoint = s => s.codePointAt(0); + +// %TypedArray%.from on a string iterates over the string. +assert.compareArray(from("test string", toCodePoint), + ['t', 'e', 's', 't', ' ', 's', 't', 'r', 'i', 'n', 'g'].map(toCodePoint)); + +// %TypedArray%.from on a string handles surrogate pairs correctly. +var gclef = "\uD834\uDD1E"; // U+1D11E MUSICAL SYMBOL G CLEF +assert.compareArray(from(gclef, toCodePoint), [gclef].map(toCodePoint)); +assert.compareArray(from(gclef + " G", toCodePoint), [gclef, " ", "G"].map(toCodePoint)); + +// %TypedArray%.from on a string calls the @@iterator method. +String.prototype[Symbol.iterator] = function* () { yield 1; yield 2; }; +assert.compareArray(from("anything"), [1, 2]); + +// If the iterator method is deleted, Strings are still arraylike. +delete String.prototype[Symbol.iterator]; +assert.compareArray(from("works", toCodePoint), ['w', 'o', 'r', 'k', 's'].map(toCodePoint)); +assert.compareArray(from(gclef, toCodePoint), ['\uD834', '\uDD1E'].map(toCodePoint)); + diff --git a/test/staging/sm/TypedArray/from_surfaces.js b/test/staging/sm/TypedArray/from_surfaces.js new file mode 100644 index 0000000000..07bd61cb50 --- /dev/null +++ b/test/staging/sm/TypedArray/from_surfaces.js @@ -0,0 +1,21 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-TypedArray-shell.js, sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +for (var constructor of anyTypedArrayConstructors) { + // Check superficial features of %TypeArray%.from. + var desc = Object.getOwnPropertyDescriptor(constructor.__proto__, "from"); + assert.sameValue(desc.configurable, true); + assert.sameValue(desc.enumerable, false); + assert.sameValue(desc.writable, true); + assert.sameValue(constructor.from.length, 1); + assertThrowsInstanceOf(() => new constructor.from(), TypeError); // not a constructor +} + diff --git a/test/staging/sm/TypedArray/from_this.js b/test/staging/sm/TypedArray/from_this.js new file mode 100644 index 0000000000..0e47ea7e38 --- /dev/null +++ b/test/staging/sm/TypedArray/from_this.js @@ -0,0 +1,68 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [deepEqual.js, sm/non262-TypedArray-shell.js, sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +for (var constructor of anyTypedArrayConstructors) { + // The third argument to %TypedArray%.from is passed as the 'this' value to the + // mapping function. + var hits = 0, obj = {}; + function f(x) { + assert.sameValue(this, obj); + hits++; + } + constructor.from(["a", "b", "c"], f, obj); + assert.sameValue(hits, 3); + + // Without an argument, undefined is passed... + hits = 0; + function gs(x) { + "use strict"; + assert.sameValue(this, undefined); + hits++; + } + constructor.from("def", gs); + assert.sameValue(hits, 3); + + // ...and if the mapping function is non-strict, that means the global is + // passed. + var global = this; + hits = 0; + function g(x) { + assert.sameValue(this, global); + hits++; + } + constructor.from("ghi", g); + assert.sameValue(hits, 3); + + // A primitive value can be passed. + for (var v of [0, "str", undefined]) { + hits = 0; + var mapfn = function h(x) { + "use strict"; + assert.sameValue(this, v); + hits++; + }; + constructor.from("pq", mapfn, v); + assert.sameValue(hits, 2); + } + + // ...and if the mapping function is non-strict, primitive values will + // be wrapped to objects. + for (var v of [0, "str", true]) { + hits = 0; + var mapfn = function h(x) { + assert.deepEqual(this, Object(v)); + hits++; + }; + constructor.from("pq", mapfn, v); + assert.sameValue(hits, 2); + } +} + diff --git a/test/staging/sm/TypedArray/from_typedarray_fastpath_detached.js b/test/staging/sm/TypedArray/from_typedarray_fastpath_detached.js new file mode 100644 index 0000000000..a9c48505d7 --- /dev/null +++ b/test/staging/sm/TypedArray/from_typedarray_fastpath_detached.js @@ -0,0 +1,19 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-TypedArray-shell.js, sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +// Ensure the fast-path when TypedArray.from is called with a TypedArray still +// checks for detached buffers. + +var ta = new Int32Array(4); +$262.detachArrayBuffer(ta.buffer); + +assertThrowsInstanceOf(() => Int32Array.from(ta), TypeError); + diff --git a/test/staging/sm/TypedArray/getter-name.js b/test/staging/sm/TypedArray/getter-name.js new file mode 100644 index 0000000000..c6e95b2500 --- /dev/null +++ b/test/staging/sm/TypedArray/getter-name.js @@ -0,0 +1,25 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-TypedArray-shell.js, sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +var BUGNUMBER = 1180290; +var summary = 'TypedArray getters should have get prefix'; + +print(BUGNUMBER + ": " + summary); + +let TypedArray = Object.getPrototypeOf(Float32Array.prototype).constructor; + +assert.sameValue(Object.getOwnPropertyDescriptor(TypedArray, Symbol.species).get.name, "get [Symbol.species]"); +assert.sameValue(Object.getOwnPropertyDescriptor(TypedArray.prototype, "buffer").get.name, "get buffer"); +assert.sameValue(Object.getOwnPropertyDescriptor(TypedArray.prototype, "byteLength").get.name, "get byteLength"); +assert.sameValue(Object.getOwnPropertyDescriptor(TypedArray.prototype, "byteOffset").get.name, "get byteOffset"); +assert.sameValue(Object.getOwnPropertyDescriptor(TypedArray.prototype, "length").get.name, "get length"); +assert.sameValue(Object.getOwnPropertyDescriptor(TypedArray.prototype, Symbol.toStringTag).get.name, "get [Symbol.toStringTag]"); + diff --git a/test/staging/sm/TypedArray/has-property-op.js b/test/staging/sm/TypedArray/has-property-op.js new file mode 100644 index 0000000000..80c399f1b8 --- /dev/null +++ b/test/staging/sm/TypedArray/has-property-op.js @@ -0,0 +1,31 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-TypedArray-shell.js, sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +for (var constructor of anyTypedArrayConstructors) { + var obj = new constructor(5); + + for (var i = 0; i < obj.length; i++) + assert.sameValue(i in obj, true); + + for (var v of [20, 300, -1, 5, -10, Math.pow(2, 32) - 1, -Math.pow(2, 32)]) + assert.sameValue(v in obj, false); + + // Don't inherit elements + obj.__proto__[50] = "hello"; + assert.sameValue(obj.__proto__[50], "hello"); + assert.sameValue(50 in obj, false); + + // Do inherit normal properties + obj.__proto__.a = "world"; + assert.sameValue(obj.__proto__.a, "world"); + assert.sameValue("a" in obj, true); +} + diff --git a/test/staging/sm/TypedArray/includes.js b/test/staging/sm/TypedArray/includes.js new file mode 100644 index 0000000000..724beae029 --- /dev/null +++ b/test/staging/sm/TypedArray/includes.js @@ -0,0 +1,49 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-TypedArray-shell.js, sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +for (var constructor of anyTypedArrayConstructors) { + assert.sameValue(constructor.prototype.includes.length, 1); + + assert.sameValue(new constructor([1, 2, 3]).includes(1), true); + assert.sameValue(new constructor([1, 2, 3]).includes(2), true); + assert.sameValue(new constructor([1, 2, 3]).includes(3), true); + assert.sameValue(new constructor([1, 2, 3]).includes(2, 1), true); + assert.sameValue(new constructor([1, 2, 3]).includes(2, -2), true); + assert.sameValue(new constructor([1, 2, 3]).includes(2, -100), true); + + assert.sameValue(new constructor([1, 2, 3]).includes("2"), false); + assert.sameValue(new constructor([1, 2, 3]).includes(2, 2), false); + assert.sameValue(new constructor([1, 2, 3]).includes(2, -1), false); + assert.sameValue(new constructor([1, 2, 3]).includes(2, 100), false); + + // Called from other globals. + if (typeof createNewGlobal === "function") { + var includes = createNewGlobal()[constructor.name].prototype.includes; + assert.sameValue(includes.call(new constructor([1, 2, 3]), 2), true); + } + + // Throws if `this` isn't a TypedArray. + var invalidReceivers = [undefined, null, 1, false, "", Symbol(), [], {}, /./, + new Proxy(new constructor(), {})]; + invalidReceivers.forEach(invalidReceiver => { + assertThrowsInstanceOf(() => { + constructor.prototype.includes.call(invalidReceiver); + }, TypeError, "Assert that reverse fails if this value is not a TypedArray"); + }); + + // Test that the length getter is never called. + assert.sameValue(Object.defineProperty(new constructor([1, 2, 3]), "length", { + get() { + throw new Error("length accessor called"); + } + }).includes(2), true); +} + diff --git a/test/staging/sm/TypedArray/indexOf-and-lastIndexOf.js b/test/staging/sm/TypedArray/indexOf-and-lastIndexOf.js new file mode 100644 index 0000000000..4b2b11a58f --- /dev/null +++ b/test/staging/sm/TypedArray/indexOf-and-lastIndexOf.js @@ -0,0 +1,138 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-TypedArray-shell.js, sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +// Tests for TypedArray#indexOf. +for (var constructor of anyTypedArrayConstructors) { + assert.sameValue(constructor.prototype.indexOf.length, 1); + + // Works with one argument. + assert.sameValue(new constructor([1, 2, 3, 4, 5]).indexOf(0), -1); + assert.sameValue(new constructor([1, 2, 3, 4, 5]).indexOf(1), 0); + assert.sameValue(new constructor([1, 2, 3, 4, 5]).indexOf(5), 4); + assert.sameValue(new constructor([1, 2, 3, 4, 5]).indexOf(6), -1); + assert.sameValue(new constructor([1, 2, 1, 2, 1]).indexOf(1), 0); + + if (isFloatConstructor(constructor)) { + assert.sameValue(new constructor([NaN, 0, -0]).indexOf(NaN), -1); + assert.sameValue(new constructor([NaN, 0, -0]).indexOf(0), 1); + assert.sameValue(new constructor([NaN, 0, -0]).indexOf(-0), 1); + } else { + // [NaN, 0, -0] will be coerced to [0, 0, 0] + assert.sameValue(new constructor([NaN, 0, -0]).indexOf(NaN), -1); + assert.sameValue(new constructor([NaN, 0, -0]).indexOf(0), 0); + assert.sameValue(new constructor([NaN, 0, -0]).indexOf(-0), 0); + } + + // Works with two arguments. + assert.sameValue(new constructor([1, 2, 3, 4, 5]).indexOf(1, 1), -1); + assert.sameValue(new constructor([1, 2, 3, 4, 5]).indexOf(1, -100), 0); + assert.sameValue(new constructor([1, 2, 3, 4, 5]).indexOf(3, 100), -1); + assert.sameValue(new constructor([1, 2, 3, 4, 5]).indexOf(5, -1), 4); + assert.sameValue(new constructor([1, 2, 1, 2, 1]).indexOf(1, 2), 2); + assert.sameValue(new constructor([1, 2, 1, 2, 1]).indexOf(1, -2), 4); + + // Throws if `this` isn't a TypedArray. + var invalidReceivers = [undefined, null, 1, false, "", Symbol(), [], {}, /./, + new Proxy(new constructor(), {})]; + invalidReceivers.forEach(invalidReceiver => { + assertThrowsInstanceOf(() => { + constructor.prototype.indexOf.call(invalidReceiver); + }, TypeError, "Assert that indexOf fails if this value is not a TypedArray"); + }); + + // test that this.length is never called + assert.sameValue(Object.defineProperty(new constructor([0, 1, 2, 3, 5]), "length", { + get() { + throw new Error("length accessor called"); + } + }).indexOf(1), 1); +} + +for (let constructor of anyTypedArrayConstructors.filter(isFloatConstructor)) { + if (constructor.BYTES_PER_ELEMENT === 2) { + assert.sameValue(new constructor([.1, .2, .3]).indexOf(.2), -1); + assert.sameValue(new constructor([.1, .2, .3]).indexOf(Math.f16round(.2)), 1); + } else if (constructor.BYTES_PER_ELEMENT === 4) { + assert.sameValue(new constructor([.1, .2, .3]).indexOf(.2), -1); + assert.sameValue(new constructor([.1, .2, .3]).indexOf(Math.fround(.2)), 1); + } else { + assert.sameValue(constructor.BYTES_PER_ELEMENT, 8); + assert.sameValue(new constructor([.1, .2, .3]).indexOf(.2), 1); + } +} + +// Tests for TypedArray#lastIndexOf. +for (var constructor of anyTypedArrayConstructors) { + + assert.sameValue(constructor.prototype.lastIndexOf.length, 1); + + // Works with one arguments. + assert.sameValue(new constructor([1, 2, 3, 4, 5]).lastIndexOf(0), -1); + assert.sameValue(new constructor([1, 2, 3, 4, 5]).lastIndexOf(1), 0); + assert.sameValue(new constructor([1, 2, 3, 4, 5]).lastIndexOf(5), 4); + assert.sameValue(new constructor([1, 2, 3, 4, 5]).lastIndexOf(6), -1); + assert.sameValue(new constructor([1, 2, 1, 2, 1]).lastIndexOf(1), 4); + + if (isFloatConstructor(constructor)) { + assert.sameValue(new constructor([NaN, 0, -0]).lastIndexOf(NaN), -1); + assert.sameValue(new constructor([NaN, 0, -0]).lastIndexOf(0), 2); + assert.sameValue(new constructor([NaN, 0, -0]).lastIndexOf(-0), 2); + } else { + // [NaN, 0, -0] will be coerced to [0, 0, 0]. + assert.sameValue(new constructor([NaN, 0, -0]).lastIndexOf(NaN), -1); + assert.sameValue(new constructor([NaN, 0, -0]).lastIndexOf(0), 2); + assert.sameValue(new constructor([NaN, 0, -0]).lastIndexOf(-0), 2); + } + + // Works with two arguments. + assert.sameValue(new constructor([1, 2, 3, 4, 5]).lastIndexOf(1, 1), 0); + assert.sameValue(new constructor([1, 2, 3, 4, 5]).lastIndexOf(1, -100), -1); + assert.sameValue(new constructor([1, 2, 3, 4, 5]).lastIndexOf(3, 100), 2); + assert.sameValue(new constructor([1, 2, 3, 4, 5]).lastIndexOf(5, -1), 4); + assert.sameValue(new constructor([1, 2, 1, 2, 1]).lastIndexOf(1, 2), 2); + assert.sameValue(new constructor([1, 2, 1, 2, 1]).lastIndexOf(1, -2), 2); + + // Throws if `this` isn't a TypedArray. + var invalidReceivers = [undefined, null, 1, false, "", Symbol(), [], {}, /./, + new Proxy(new constructor(), {})]; + invalidReceivers.forEach(invalidReceiver => { + assertThrowsInstanceOf(() => { + constructor.prototype.lastIndexOf.call(invalidReceiver); + }, TypeError, "Assert that lastIndexOf fails if this value is not a TypedArray"); + }); + + // Test that the length getter is never called. + assert.sameValue(Object.defineProperty(new constructor([0, 1, 2, 3, 5]), "length", { + get() { + throw new Error("length accessor called"); + } + }).lastIndexOf(1), 1); + + // Starts search at last index when fromIndex parameter is absent. + assert.sameValue(new constructor([10, 20, 10]).lastIndexOf(10), 2); + + // Starts search at first index when fromIndex parameter is undefined. + assert.sameValue(new constructor([10, 20, 10]).lastIndexOf(10, undefined), 0); +} + +for (let constructor of anyTypedArrayConstructors.filter(isFloatConstructor)) { + if (constructor.BYTES_PER_ELEMENT === 2) { + assert.sameValue(new constructor([.1, .2, .3]).lastIndexOf(.2), -1); + assert.sameValue(new constructor([.1, .2, .3]).lastIndexOf(Math.f16round(.2)), 1); + } else if (constructor.BYTES_PER_ELEMENT === 4) { + assert.sameValue(new constructor([.1, .2, .3]).lastIndexOf(.2), -1); + assert.sameValue(new constructor([.1, .2, .3]).lastIndexOf(Math.fround(.2)), 1); + } else { + assert.sameValue(constructor.BYTES_PER_ELEMENT, 8); + assert.sameValue(new constructor([.1, .2, .3]).lastIndexOf(.2), 1); + } +} + diff --git a/test/staging/sm/TypedArray/indexOf-never-returns-negative-zero.js b/test/staging/sm/TypedArray/indexOf-never-returns-negative-zero.js new file mode 100644 index 0000000000..df0b739db7 --- /dev/null +++ b/test/staging/sm/TypedArray/indexOf-never-returns-negative-zero.js @@ -0,0 +1,16 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-TypedArray-shell.js, sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +var ta = new Uint8Array(1); +ta[0] = 17; + +assert.sameValue(ta.indexOf(17, -0), +0); + diff --git a/test/staging/sm/TypedArray/iterator-next-with-detached.js b/test/staging/sm/TypedArray/iterator-next-with-detached.js new file mode 100644 index 0000000000..6dcbcf1d88 --- /dev/null +++ b/test/staging/sm/TypedArray/iterator-next-with-detached.js @@ -0,0 +1,82 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-TypedArray-shell.js, sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +function checkResult(actual, expected) +{ + assert.sameValue(actual.value, expected.value); + assert.sameValue(actual.done, expected.done); +} + +if (typeof $262.detachArrayBuffer === "function" && typeof createNewGlobal === "function") +{ + var iteratorFunction = Uint8Array.prototype[Symbol.iterator]; + + + var thisGlobal = this; + var otherGlobal = createNewGlobal(); + + var thisNext = new Uint8Array()[Symbol.iterator]().next + + for (const constructor of typedArrayConstructors) + { + assert.sameValue(new constructor()[Symbol.iterator]().next, thisNext); + + var globals = + [ + [thisGlobal, thisGlobal], + [thisGlobal, otherGlobal], + [otherGlobal, otherGlobal], + [otherGlobal, thisGlobal], + ]; + + for (const [arrayGlobal, bufferGlobal] of globals) + { + var arr, buffer, iterator; + + function arrayBufferIterator() + { + var byteLength = 2 * constructor.BYTES_PER_ELEMENT; + var buf = new bufferGlobal.ArrayBuffer(byteLength); + var tarray = new arrayGlobal[constructor.name](buf); + + tarray[0] = 1; + tarray[1] = 2; + + return [tarray, buf, Reflect.apply(iteratorFunction, tarray, [])]; + } + + [arr, buffer, iterator] = arrayBufferIterator(); + checkResult(thisNext.call(iterator), {value: 1, done: false}); + checkResult(thisNext.call(iterator), {value: 2, done: false}); + checkResult(thisNext.call(iterator), {value: undefined, done: true}); + + // Test an exhausted iterator. + bufferGlobal.$262.detachArrayBuffer(buffer); + checkResult(thisNext.call(iterator), {value: undefined, done: true}); + + // Test an all-but-exhausted iterator. + [arr, buffer, iterator] = arrayBufferIterator(); + checkResult(thisNext.call(iterator), {value: 1, done: false}); + checkResult(thisNext.call(iterator), {value: 2, done: false}); + + bufferGlobal.$262.detachArrayBuffer(buffer); + assertThrowsInstanceOf(() => thisNext.call(iterator), TypeError); + + // Test an unexhausted iterator. + [arr, buffer, iterator] = arrayBufferIterator(); + checkResult(thisNext.call(iterator), {value: 1, done: false}); + + bufferGlobal.$262.detachArrayBuffer(buffer); + assertThrowsInstanceOf(() => thisNext.call(iterator), TypeError); + } + } +} + diff --git a/test/staging/sm/TypedArray/iterator.js b/test/staging/sm/TypedArray/iterator.js new file mode 100644 index 0000000000..eb9b3c28be --- /dev/null +++ b/test/staging/sm/TypedArray/iterator.js @@ -0,0 +1,51 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-TypedArray-shell.js, sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +// Ensure that we're using [[ArrayLength]] to determine the number of +// values to produce instead of the length property. + +function testIterationCount(iterator, expectedLength) { + for (let i = 0; i < expectedLength; i++) + assert.sameValue(iterator.next().done, false); + assert.sameValue(iterator.next().done, true); +} + +let i8Array = new Int8Array(4); +Object.defineProperty(i8Array, "length", {value: 0}); +let i8Iterator = i8Array[Symbol.iterator](); +testIterationCount(i8Iterator, 4); + +// Veryify that the length property isn't even touched +i8Array = new Int8Array(); +Object.defineProperty(i8Array, "length", { + get() { + throw TypeError; + } +}); +i8Iterator = i8Array[Symbol.iterator](); +testIterationCount(i8Iterator, 0); + +// Verify that it works for set as well +i8Array = new Uint8Array(1); +// Try setting a high length which would trigger failure +Object.defineProperty(i8Array, "length", {value: 15}); +// Works if the fake length is ignored +(new Uint8Array(4)).set(i8Array, 3); + +// Ensure that it works across globals +let g2 = createNewGlobal(); + +i8Array = new Int8Array(8); +Object.defineProperty(i8Array, "length", {value: 0}); +let iterator = i8Array[Symbol.iterator](); +iterator.next = g2.Array.prototype[Symbol.iterator]().next; +testIterationCount(iterator, 8); + diff --git a/test/staging/sm/TypedArray/join.js b/test/staging/sm/TypedArray/join.js new file mode 100644 index 0000000000..c557c972f8 --- /dev/null +++ b/test/staging/sm/TypedArray/join.js @@ -0,0 +1,57 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [deepEqual.js, sm/non262-TypedArray-shell.js, sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +for (var constructor of anyTypedArrayConstructors) { + assert.sameValue(constructor.prototype.join.length, 1); + + assert.sameValue(new constructor([1, 2, 3]).join(), "1,2,3"); + assert.sameValue(new constructor([1, 2, 3]).join(undefined), "1,2,3"); + assert.sameValue(new constructor([1, 2, 3]).join(null), "1null2null3"); + assert.sameValue(new constructor([1, 2, 3]).join(""), "123"); + assert.sameValue(new constructor([1, 2, 3]).join("+"), "1+2+3"); + assert.sameValue(new constructor([1, 2, 3]).join(.1), "10.120.13"); + assert.sameValue(new constructor([1, 2, 3]).join({toString(){return "foo"}}), "1foo2foo3"); + assert.sameValue(new constructor([1]).join("-"), "1"); + assert.sameValue(new constructor().join(), ""); + assert.sameValue(new constructor().join("*"), ""); + assert.sameValue(new constructor(1).join(), "0"); + assert.sameValue(new constructor(3).join(), "0,0,0"); + + assertThrowsInstanceOf(() => new constructor().join({toString(){throw new TypeError}}), TypeError); + assertThrowsInstanceOf(() => new constructor().join(Symbol()), TypeError); + + // Called from other globals. + if (typeof createNewGlobal === "function") { + var join = createNewGlobal()[constructor.name].prototype.join; + assert.sameValue(join.call(new constructor([1, 2, 3]), "\t"), "1\t2\t3"); + } + + // Throws if `this` isn't a TypedArray. + var invalidReceivers = [undefined, null, 1, false, "", Symbol(), [], {}, /./, + new Proxy(new constructor(), {})]; + invalidReceivers.forEach(invalidReceiver => { + assertThrowsInstanceOf(() => { + constructor.prototype.join.call(invalidReceiver); + }, TypeError, "Assert that join fails if this value is not a TypedArray"); + }); + + // Test that the length getter is never called. + assert.sameValue(Object.defineProperty(new constructor([1, 2, 3]), "length", { + get() { + throw new Error("length accessor called"); + } + }).join("\0"), "1\0002\0003"); +} + +for (let constructor of anyTypedArrayConstructors.filter(isFloatConstructor)) { + assert.deepEqual(new constructor([null, , NaN]).join(), "0,NaN,NaN"); +} + diff --git a/test/staging/sm/TypedArray/keys.js b/test/staging/sm/TypedArray/keys.js new file mode 100644 index 0000000000..9600c61d54 --- /dev/null +++ b/test/staging/sm/TypedArray/keys.js @@ -0,0 +1,45 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [deepEqual.js, sm/non262-TypedArray-shell.js, sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +for (var constructor of anyTypedArrayConstructors) { + assert.sameValue(constructor.prototype.keys.length, 0); + assert.sameValue(constructor.prototype.keys.name, "keys"); + + assert.deepEqual([...new constructor(0).keys()], []); + assert.deepEqual([...new constructor(1).keys()], [0]); + assert.deepEqual([...new constructor(2).keys()], [0, 1]); + assert.deepEqual([...new constructor([15]).keys()], [0]); + + var arr = new constructor([1, 2, 3]); + var iterator = arr.keys(); + assert.deepEqual(iterator.next(), {value: 0, done: false}); + assert.deepEqual(iterator.next(), {value: 1, done: false}); + assert.deepEqual(iterator.next(), {value: 2, done: false}); + assert.deepEqual(iterator.next(), {value: undefined, done: true}); + + // Called from other globals. + if (typeof createNewGlobal === "function") { + var keys = createNewGlobal()[constructor.name].prototype.keys; + assert.deepEqual([...keys.call(new constructor(2))], [0, 1]); + arr = new (createNewGlobal()[constructor.name])(2); + assert.sameValue([...constructor.prototype.keys.call(arr)].toString(), "0,1"); + } + + // Throws if `this` isn't a TypedArray. + var invalidReceivers = [undefined, null, 1, false, "", Symbol(), [], {}, /./, + new Proxy(new constructor(), {})]; + invalidReceivers.forEach(invalidReceiver => { + assertThrowsInstanceOf(() => { + constructor.prototype.keys.call(invalidReceiver); + }, TypeError, "Assert that keys fails if this value is not a TypedArray"); + }); +} + diff --git a/test/staging/sm/TypedArray/lastIndexOf-never-returns-negative-zero.js b/test/staging/sm/TypedArray/lastIndexOf-never-returns-negative-zero.js new file mode 100644 index 0000000000..763afd0c6e --- /dev/null +++ b/test/staging/sm/TypedArray/lastIndexOf-never-returns-negative-zero.js @@ -0,0 +1,16 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-TypedArray-shell.js, sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +var ta = new Uint8Array(1); +ta[0] = 17; + +assert.sameValue(ta.lastIndexOf(17, -0), +0); + diff --git a/test/staging/sm/TypedArray/map-and-filter.js b/test/staging/sm/TypedArray/map-and-filter.js new file mode 100644 index 0000000000..a20b9594a3 --- /dev/null +++ b/test/staging/sm/TypedArray/map-and-filter.js @@ -0,0 +1,283 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [compareArray.js, deepEqual.js, sm/non262-TypedArray-shell.js, sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +// Tests for TypedArray#map. +for (var constructor of anyTypedArrayConstructors) { + assert.sameValue(constructor.prototype.map.length, 1); + + // Basic tests. + assert.compareArray(new constructor([1, 3, 5]).map(v => v * 2), new constructor([2,6,10])); + assert.compareArray(new constructor([-1, 13, 5]).map(v => v - 2), new constructor([-3, 11, 3])); + assert.compareArray(new constructor(10).map(v => v), new constructor(10)); + assert.compareArray(new constructor().map(v => v + 1), new constructor); + assert.compareArray(new constructor([1,2,3]).map(v => v), new constructor([1,2,3])); + + var arr = new constructor([1, 2, 3, 4, 5]); + var sum = 0; + var count = 0; + assert.compareArray(arr.map((v, k, o) => { + count++; + sum += v; + assert.sameValue(k, v - 1); + assert.sameValue(o, arr); + return v; + }), arr); + assert.sameValue(sum, 15); + assert.sameValue(count, 5); + + // Test that changing elements that have been visited does not affect the result. + var changeArr = new constructor([1,2,3,4,5]); + assert.compareArray(arr.map((v,k) => { + changeArr[k] = v + 1; + return v; + }), new constructor([1,2,3,4,5])); + + // Tests for `thisArg` argument. + function assertThisArg(thisArg, thisValue) { + // In sloppy mode, `this` could be global object or a wrapper of `thisArg`. + assert.compareArray(arr.map(function(v) { + assert.deepEqual(this, thisValue); + return v; + }, thisArg), arr); + + // In strict mode, `this` strictly equals `thisArg`. + assert.compareArray(arr.map(function(v) { + "use strict"; + assert.deepEqual(this, thisArg); + return v; + }, thisArg), arr); + + // Passing `thisArg` has no effect if callback is an arrow function. + var self = this; + assert.compareArray(arr.map((v) => { + assert.sameValue(this, self); + return v; + }, thisArg), arr); + } + assertThisArg([1, 2, 3], [1, 2, 3]); + assertThisArg(Object, Object); + assertThisArg(1, Object(1)); + assertThisArg("1", Object("1")); + assertThisArg(false, Object(false)); + assertThisArg(undefined, this); + assertThisArg(null, this); + + // Throw an exception in the callback. + var sum = 0; + var count = 0; + var thrown = false; + try { + arr.map((v, k, o) => { + count++; + sum += v; + assert.sameValue(k, v - 1); + assert.sameValue(o, arr); + if (v === 3) { + throw "map"; + } + return v; + }) + } catch(e) { + assert.sameValue(e, "map"); + thrown = true; + } + assert.sameValue(thrown, true); + assert.sameValue(sum, 6); + assert.sameValue(count, 3); + + // There is no callback or callback is not a function. + assertThrowsInstanceOf(() => { + arr.map(); + }, TypeError); + var invalidCallbacks = [undefined, null, 1, false, "", Symbol(), [], {}, /./]; + invalidCallbacks.forEach(callback => { + assertThrowsInstanceOf(() => { + arr.map(callback); + }, TypeError); + }) + + // Callback is a generator. + arr.map(function*(){ + throw "This line will not be executed"; + }); + + // Called from other globals. + if (typeof createNewGlobal === "function") { + var map = createNewGlobal()[constructor.name].prototype.map; + var sum = 0; + assert.compareArray(map.call(new constructor([1, 2, 3]), v => sum += v), new constructor([1,3,6])); + assert.sameValue(sum, 6); + } + + // Throws if `this` isn't a TypedArray. + var invalidReceivers = [undefined, null, 1, false, "", Symbol(), [], {}, /./, + new Proxy(new constructor(), {})]; + invalidReceivers.forEach(invalidReceiver => { + assertThrowsInstanceOf(() => { + constructor.prototype.filter.call(invalidReceiver, () => true); + }, TypeError, "Assert that map fails if this value is not a TypedArray"); + }); + + // Test that the length getter is never called. + assert.compareArray(Object.defineProperty(new constructor([1, 2, 3]), "length", { + get() { + throw new Error("length accessor called"); + } + }).map((b) => b), new constructor([1,2,3])); +} + +// Test For TypedArray#filter. +for (var constructor of anyTypedArrayConstructors) { + assert.sameValue(constructor.prototype.filter.length, 1) + + // Basic tests. + assert.compareArray(new constructor([1,2,3]).filter(x => x == x), new constructor([1,2,3])); + assert.compareArray(new constructor([1,2,3,4]).filter(x => x % 2 == 0), new constructor([2,4])); + assert.compareArray(new constructor([1,2,3,4,5]).filter(x => x < 4), new constructor([1,2,3])); + assert.compareArray(new constructor().filter(x => x * 2 == 4), new constructor()); + + var arr = new constructor([1,2,3,4,5]); + var sum = 0; + var count = 0; + assert.compareArray(arr.filter((v, k, o) => { + count++; + sum += v; + assert.sameValue(k, v - 1); + assert.sameValue(o, arr); + return (v < 4); + }), new constructor([1,2,3])); + assert.sameValue(sum, 15); + assert.sameValue(count, 5); + + // Test that changing elements that have been visited does not affect the result. + var changeArr = new constructor([1,2,3,4,5]); + assert.compareArray(arr.filter((v,k) => { + changeArr[k] = v + 1; + return true; + }), new constructor([1,2,3,4,5])); + + // Tests for `thisArg` argument. + function assertThisArg(thisArg, thisValue) { + // In sloppy mode, `this` could be global object or a wrapper of `thisArg`. + assert.compareArray(arr.filter(function(v) { + assert.deepEqual(this, thisValue); + return v; + }, thisArg), arr); + + // In strict mode, `this` strictly equals `thisArg`. + assert.compareArray(arr.filter(function(v) { + "use strict"; + assert.deepEqual(this, thisArg); + return v; + }, thisArg), arr); + + // Passing `thisArg` has no effect if callback is an arrow function. + var self = this; + assert.compareArray(arr.filter((v) => { + assert.sameValue(this, self); + return v; + }, thisArg), arr); + } + assertThisArg([1, 2, 3], [1, 2, 3]); + assertThisArg(Object, Object); + assertThisArg(1, Object(1)); + assertThisArg("1", Object("1")); + assertThisArg(false, Object(false)); + assertThisArg(undefined, this); + assertThisArg(null, this); + + // Throw an exception in the callback. + var sum = 0; + var count = 0; + var thrown = false; + try { + arr.filter((v, k, o) => { + count++; + sum += v; + assert.sameValue(k, v - 1); + assert.sameValue(o, arr); + if (v === 3) { + throw "filter"; + } + return v; + }) + } catch(e) { + assert.sameValue(e, "filter"); + thrown = true; + } + assert.sameValue(thrown, true); + assert.sameValue(sum, 6); + assert.sameValue(count, 3); + + // There is no callback or callback is not a function. + assertThrowsInstanceOf(() => { + arr.filter(); + }, TypeError); + var invalidCallbacks = [undefined, null, 1, false, "", Symbol(), [], {}, /./]; + invalidCallbacks.forEach(callback => { + assertThrowsInstanceOf(() => { + arr.filter(callback); + }, TypeError); + }) + + // Callback is a generator. + arr.filter(function*(){ + throw "This line will not be executed"; + }); + + // Called from other globals. + if (typeof createNewGlobal === "function") { + var filter = createNewGlobal()[constructor.name].prototype.filter; + var sum = 0; + assert.compareArray(filter.call(new constructor([1, 2, 3]), v => {sum += v; return true}), + new constructor([1,2,3])); + assert.sameValue(sum, 6); + } + + // Throws if `this` isn't a TypedArray. + var invalidReceivers = [undefined, null, 1, false, "", Symbol(), [], {}, /./, + new Proxy(new constructor(), {})]; + invalidReceivers.forEach(invalidReceiver => { + assertThrowsInstanceOf(() => { + constructor.prototype.filter.call(invalidReceiver, () => true); + }, TypeError, "Assert that filter fails if this value is not a TypedArray"); + }); + + // Test that the length getter is never called. + assert.compareArray(Object.defineProperty(new constructor([1, 2, 3]), "length", { + get() { + throw new Error("length accessor called"); + } + }).filter((b) => true), new constructor([1,2,3])); +} + +// Test that changing Array.prototype[Symbol.iterator] does not affect the +// behaviour of filter. See https://bugzilla.mozilla.org/show_bug.cgi?id=1121936#c18 +// for more details. + +var arr = new Uint16Array([1,2,3]); + +// save +var old = Array.prototype[Symbol.iterator]; + +Array.prototype[Symbol.iterator] = () => { throw new Error("unreachable"); }; +assert.compareArray(arr.filter(v => true), arr); + +// restore +Array.prototype[Symbol.iterator] = old; + +// Test that defining accessors on Array.prototype doesn't affect the behaviour +// of filter. See https://bugzilla.mozilla.org/show_bug.cgi?id=1121936#c18 +// for more details. +Object.defineProperty(Array.prototype, 0, {configurable: true, get: function() { return 1; }, set: function() { this.b = 1; }}); +assert.compareArray(new Uint16Array([1,2,3]).filter(v => true), new Uint16Array([1,2,3])); +delete Array.prototype[0]; + diff --git a/test/staging/sm/TypedArray/map-species.js b/test/staging/sm/TypedArray/map-species.js new file mode 100644 index 0000000000..c63e93d487 --- /dev/null +++ b/test/staging/sm/TypedArray/map-species.js @@ -0,0 +1,65 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [deepEqual.js, sm/non262-TypedArray-shell.js, sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +function test(constructor, constructor2, from=[1, 2, 3, 4, 5], to=[2, 4, 6, 8, 10]) { + var modifiedConstructor = new constructor(from); + modifiedConstructor.constructor = constructor2; + assert.deepEqual(modifiedConstructor.map(x => x * 2), new constructor2(to)); + var modifiedSpecies = new constructor(from); + modifiedSpecies.constructor = { [Symbol.species]: constructor2 }; + assert.deepEqual(modifiedSpecies.map(x => x * 2), new constructor2(to)); +} + +// same size, same sign + +test(Int8Array, Uint8Array); +test(Int8Array, Uint8ClampedArray); + +test(Uint8Array, Int8Array); +test(Uint8Array, Uint8ClampedArray); + +test(Uint8ClampedArray, Int8Array); +test(Uint8ClampedArray, Uint8Array); + +test(Int16Array, Uint16Array); +test(Uint16Array, Int16Array); + +test(Int32Array, Uint32Array); +test(Uint32Array, Int32Array); + +// same size, different sign + +test(Int8Array, Uint8Array, [-1, -2, -3, -4, -5], [0xFE, 0xFC, 0xFA, 0xF8, 0xF6]); +test(Int8Array, Uint8ClampedArray, [-1, -2, -3, -4, -5], [0, 0, 0, 0, 0]); + +test(Uint8Array, Int8Array, [0xFF, 0xFE, 0xFD, 0xFC, 0xFB], [-2, -4, -6, -8, -10]); +test(Uint8ClampedArray, Int8Array, [0xFF, 0xFE, 0xFD, 0xFC, 0xFB], [-2, -4, -6, -8, -10]); + +test(Int16Array, Uint16Array, [-1, -2, -3, -4, -5], [0xFFFE, 0xFFFC, 0xFFFA, 0xFFF8, 0xFFF6]); +test(Uint16Array, Int16Array, [0xFFFF, 0xFFFE, 0xFFFD, 0xFFFC, 0xFFFB], [-2, -4, -6, -8, -10]); + +test(Int32Array, Uint32Array, [-1, -2, -3, -4, -5], [0xFFFFFFFE, 0xFFFFFFFC, 0xFFFFFFFA, 0xFFFFFFF8, 0xFFFFFFF6]); +test(Uint32Array, Int32Array, [0xFFFFFFFF, 0xFFFFFFFE, 0xFFFFFFFD, 0xFFFFFFFC, 0xFFFFFFFB], [-2, -4, -6, -8, -10]); + +// different size + +test(Uint8Array, Uint16Array); +test(Uint16Array, Uint8Array); + +test(Uint8Array, Uint32Array); +test(Uint32Array, Uint8Array); + +test(Uint16Array, Uint32Array); +test(Uint32Array, Uint16Array); + +test(Float32Array, Float64Array); +test(Float64Array, Float32Array); + diff --git a/test/staging/sm/TypedArray/object-defineproperty.js b/test/staging/sm/TypedArray/object-defineproperty.js new file mode 100644 index 0000000000..bafaf65698 --- /dev/null +++ b/test/staging/sm/TypedArray/object-defineproperty.js @@ -0,0 +1,78 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-TypedArray-shell.js, sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +var obj = new Int32Array(2); +obj[0] = 100; + +var throws = [ + // Disallow accessors + {get: undefined}, + {set: undefined}, + {get: undefined, set: undefined}, + {get: function() {}}, + {set: function() {}}, + {get: function() {}, set: function() {}}, + + {configurable: false}, + {enumerable: false}, + {writable: false}, + + {configurable: false, writable: true}, + {enumerable: false, configurable: false}, + + {configurable: false, value: 15} +]; + +for (var desc of throws) { + assertThrowsInstanceOf(function() { Object.defineProperty(obj, 0, desc); }, TypeError); + assertThrowsInstanceOf(function() { Object.defineProperties(obj, {0: desc}); }, TypeError); +} + +Object.defineProperty(obj, 0, {}); +Object.defineProperty(obj, 0, {configurable: true}); +Object.defineProperty(obj, 0, {enumerable: true}); +Object.defineProperty(obj, 0, {writable: true}); + +assert.sameValue(obj[0], 100); + +Object.defineProperty(obj, 0, {configurable: true, value: 15}); +assert.sameValue(obj[0], 15); +Object.defineProperty(obj, 0, {enumerable: true, value: 16}); +assert.sameValue(obj[0], 16); +Object.defineProperty(obj, 0, {writable: true, value: 17}); +assert.sameValue(obj[0], 17); +Object.defineProperty(obj, 0, {value: 18}); +assert.sameValue(obj[0], 18); + +var desc = Object.getOwnPropertyDescriptor(obj, 0); +assert.sameValue(desc.configurable, true); +assert.sameValue(desc.enumerable, true); +assert.sameValue(desc.writable, true); +assert.sameValue(desc.value, 18); +assert.sameValue('get' in desc, false); +assert.sameValue('set' in desc, false); + +Object.defineProperties(obj, {0: {value: 20}, 1: {value: 42}}); +assert.sameValue(obj[0], 20); +assert.sameValue(obj[1], 42); + +anyTypedArrayConstructors.forEach(constructor => { + var obj = new constructor(4); + obj[0] = 100; + obj[1] = 200; + + for (var v of [20, 300, -10, Math.pow(2, 32), -Math.pow(2, 32), NaN]) { + Object.defineProperty(obj, 0, {value: v}); + obj[1] = v; + assert.sameValue(obj[0], obj[1]); + } +}); + diff --git a/test/staging/sm/TypedArray/of.js b/test/staging/sm/TypedArray/of.js new file mode 100644 index 0000000000..065acbfb5f --- /dev/null +++ b/test/staging/sm/TypedArray/of.js @@ -0,0 +1,101 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [deepEqual.js, sm/non262-TypedArray-shell.js, sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +for (var constructor of anyTypedArrayConstructors) { + assert.sameValue(constructor.of.length, 0); + + assert.deepEqual(Object.getOwnPropertyDescriptor(constructor.__proto__, "of"), { + value: constructor.of, + writable: true, + enumerable: false, + configurable: true + }); + + // Basic tests. + assert.sameValue(constructor.of().constructor, constructor); + assert.sameValue(constructor.of() instanceof constructor, true); + assert.deepEqual(constructor.of(10), new constructor([10])); + assert.deepEqual(constructor.of(1, 2, 3), new constructor([1, 2, 3])); + assert.deepEqual(constructor.of("1", "2", "3"), new constructor([1, 2, 3])); + + // This method can't be transplanted to other constructors. + assertThrowsInstanceOf(() => constructor.of.call(Array), TypeError); + assertThrowsInstanceOf(() => constructor.of.call(Array, 1, 2, 3), TypeError); + + var hits = 0; + assert.deepEqual(constructor.of.call(function(len) { + assert.sameValue(arguments.length, 1); + assert.sameValue(len, 3); + hits++; + return new constructor(len); + }, 10, 20, 30), new constructor([10, 20, 30])); + assert.sameValue(hits, 1); + + // Behavior across compartments. + if (typeof createNewGlobal === "function") { + var newC = createNewGlobal()[constructor.name]; + assert.sameValue(newC.of() instanceof newC, true); + assert.sameValue(newC.of() instanceof constructor, false); + assert.sameValue(newC.of.call(constructor) instanceof constructor, true); + } + + // Throws if `this` isn't a constructor. + var invalidConstructors = [undefined, null, 1, false, "", Symbol(), [], {}, /./, + constructor.of, () => {}]; + invalidConstructors.forEach(C => { + assertThrowsInstanceOf(() => { + constructor.of.call(C); + }, TypeError); + }); + + // Throw if `this` is a method definition or a getter/setter function. + assertThrowsInstanceOf(() => { + constructor.of.call({method() {}}.method); + }, TypeError); + assertThrowsInstanceOf(() => { + constructor.of.call(Object.getOwnPropertyDescriptor({get getter() {}}, "getter").get); + }, TypeError); + + // Generators are not legal constructors. + assertThrowsInstanceOf(() => { + constructor.of.call(function*(len) { + return len; + }, "a") + }, TypeError); + + // An exception might be thrown in a strict assignment to the new object's indexed properties. + assertThrowsInstanceOf(() => { + constructor.of.call(function() { + return {get 0() {}}; + }, "a"); + }, TypeError); + + assertThrowsInstanceOf(() => { + constructor.of.call(function() { + return Object("1"); + }, "a"); + }, TypeError); + + assertThrowsInstanceOf(() => { + constructor.of.call(function() { + return Object.create({ + set 0(v) { + throw new TypeError; + } + }); + }, "a"); + }, TypeError); +} + +for (let constructor of anyTypedArrayConstructors.filter(isFloatConstructor)) { + assert.deepEqual(constructor.of(0.1, null, undefined, NaN), new constructor([0.1, 0, NaN, NaN])); +} + diff --git a/test/staging/sm/TypedArray/prototype-constructor-identity.js b/test/staging/sm/TypedArray/prototype-constructor-identity.js new file mode 100644 index 0000000000..0babb8498f --- /dev/null +++ b/test/staging/sm/TypedArray/prototype-constructor-identity.js @@ -0,0 +1,68 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-TypedArray-shell.js, sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +/* + * Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/publicdomain/zero/1.0/ + */ + +var gTestfile = 'prototype-constructor-identity.js'; +//----------------------------------------------------------------------------- +var BUGNUMBER = 896116; +var summary = + "Typed array prototypes/constructors should be largely empty, inheriting " + "most functionality from %TypedArray% and %TypedArray%.prototype"; + +print(BUGNUMBER + ": " + summary); + +/************** + * BEGIN TEST * + **************/ + +var TypedArray = Object.getPrototypeOf(Int8Array); + +assert.sameValue(TypedArray !== Function.prototype, true, + "%TypedArray% should be in constructors' [[Prototype]] chains"); +assert.sameValue(Object.getPrototypeOf(TypedArray), Function.prototype, + "%TypedArray%.prototype should inherit from Function.prototype"); + +assert.sameValue(TypedArray.prototype.constructor, TypedArray, + "bad %TypedArray%.prototype.constructor"); + +// Check a few different functions we implement are here, as a sanity check. +var typedArrayProps = Object.getOwnPropertyNames(TypedArray.prototype); +assert.sameValue(typedArrayProps.indexOf("copyWithin") >= 0, true); +assert.sameValue(typedArrayProps.indexOf("subarray") >= 0, true); +assert.sameValue(typedArrayProps.indexOf("set") >= 0, true); + +anyTypedArrayConstructors.forEach(function(ctor) { + assert.sameValue(Object.getPrototypeOf(ctor), TypedArray); + + var proto = ctor.prototype; + + // Inherited functions aren't present. + var props = Object.getOwnPropertyNames(proto).sort(); + assert.sameValue(props[0], "BYTES_PER_ELEMENT"); + assert.sameValue(props[1], "constructor"); + if (ctor === Uint8Array) { + assert.sameValue(props.length, 6); + } else { + assert.sameValue(props.length, 2); + } + + // The inheritance chain should be set up properly. + assert.sameValue(Object.getPrototypeOf(proto), TypedArray.prototype, + "prototype should inherit from %TypedArray%.prototype"); +}); + +/******************************************************************************/ + +print("Tests complete"); diff --git a/test/staging/sm/TypedArray/reduce-and-reduceRight.js b/test/staging/sm/TypedArray/reduce-and-reduceRight.js new file mode 100644 index 0000000000..0c39652593 --- /dev/null +++ b/test/staging/sm/TypedArray/reduce-and-reduceRight.js @@ -0,0 +1,197 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [deepEqual.js, sm/non262-TypedArray-shell.js, sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +// Tests for TypedArray#reduce. +for (var constructor of anyTypedArrayConstructors) { + assert.sameValue(constructor.prototype.reduce.length, 1); + + // Basic tests. + var arr = new constructor([1, 2, 3, 4, 5]); + + assert.sameValue(arr.reduce((previous, current) => previous + current), 15); + assert.sameValue(arr.reduce((previous, current) => current - previous), 3); + + var count = 0; + var sum = 0; + assert.sameValue(arr.reduce((previous, current, index, array) => { + count++; + sum += current; + assert.sameValue(current - 1, index); + assert.sameValue(current, arr[index]); + assert.sameValue(array, arr); + return previous * current; + }), 120); + assert.sameValue(count, 4); + assert.sameValue(sum, 14); + + // Tests for `initialValue` argument. + assert.sameValue(arr.reduce((previous, current) => previous + current, -15), 0); + assert.sameValue(arr.reduce((previous, current) => previous + current, ""), "12345"); + assert.deepEqual(arr.reduce((previous, current) => previous.concat(current), []), [1, 2, 3, 4, 5]); + + // Tests for `this` value. + var global = this; + arr.reduce(function(){ + assert.sameValue(this, global); + }); + arr.reduce(function(){ + "use strict"; + assert.sameValue(this, undefined); + }); + arr.reduce(() => assert.sameValue(this, global)); + + // Throw an exception in the callback. + var count = 0; + var sum = 0; + assertThrowsInstanceOf(() => { + arr.reduce((previous, current, index, array) => { + count++; + sum += current; + if (index === 3) { + throw TypeError("reduce"); + } + }) + }, TypeError); + assert.sameValue(count, 3); + assert.sameValue(sum, 9); + + // There is no callback or callback is not a function. + assertThrowsInstanceOf(() => { + arr.reduce(); + }, TypeError); + var invalidCallbacks = [undefined, null, 1, false, "", Symbol(), [], {}, /./]; + invalidCallbacks.forEach(callback => { + assertThrowsInstanceOf(() => { + arr.reduce(callback); + }, TypeError); + }) + + // Callback is a generator. + arr.reduce(function*(){ + throw "This line will not be executed"; + }); + + // Called from other globals. + if (typeof createNewGlobal === "function") { + var reduce = createNewGlobal()[constructor.name].prototype.reduce; + assert.sameValue(reduce.call(arr, (previous, current) => Math.min(previous, current)), 1); + } + + // Throws if `this` isn't a TypedArray. + var invalidReceivers = [undefined, null, 1, false, "", Symbol(), [], {}, /./, + new Proxy(new constructor(3), {})]; + invalidReceivers.forEach(invalidReceiver => { + assertThrowsInstanceOf(() => { + constructor.prototype.reduce.call(invalidReceiver, () => {}); + }, TypeError, "Assert that reduce fails if this value is not a TypedArray"); + }); + + // Test that the length getter is never called. + assert.sameValue(Object.defineProperty(arr, "length", { + get() { + throw new Error("length accessor called"); + } + }).reduce((previous, current) => Math.max(previous, current)), 5); +} + +// Tests for TypedArray#reduceRight. +for (var constructor of anyTypedArrayConstructors) { + assert.sameValue(constructor.prototype.reduceRight.length, 1); + + // Basic tests. + var arr = new constructor([1, 2, 3, 4, 5]); + + assert.sameValue(arr.reduceRight((previous, current) => previous + current), 15); + assert.sameValue(arr.reduceRight((previous, current) => current - previous), 3); + + var count = 0; + var sum = 0; + assert.sameValue(arr.reduceRight((previous, current, index, array) => { + count++; + sum += current; + assert.sameValue(current - 1, index); + assert.sameValue(current, arr[index]); + assert.sameValue(array, arr); + return previous * current; + }), 120); + assert.sameValue(count, 4); + assert.sameValue(sum, 10); + + // Tests for `initialValue` argument. + assert.sameValue(arr.reduceRight((previous, current) => previous + current, -15), 0); + assert.sameValue(arr.reduceRight((previous, current) => previous + current, ""), "54321"); + assert.deepEqual(arr.reduceRight((previous, current) => previous.concat(current), []), [5, 4, 3, 2, 1]); + + // Tests for `this` value. + var global = this; + arr.reduceRight(function(){ + assert.sameValue(this, global); + }); + arr.reduceRight(function(){ + "use strict"; + assert.sameValue(this, undefined); + }); + arr.reduceRight(() => assert.sameValue(this, global)); + + // Throw an exception in the callback. + var count = 0; + var sum = 0; + assertThrowsInstanceOf(() => { + arr.reduceRight((previous, current, index, array) => { + count++; + sum += current; + if (index === 1) { + throw TypeError("reduceRight"); + } + }) + }, TypeError); + assert.sameValue(count, 3); + assert.sameValue(sum, 9); + + // There is no callback or callback is not a function. + assertThrowsInstanceOf(() => { + arr.reduceRight(); + }, TypeError); + var invalidCallbacks = [undefined, null, 1, false, "", Symbol(), [], {}, /./]; + invalidCallbacks.forEach(callback => { + assertThrowsInstanceOf(() => { + arr.reduceRight(callback); + }, TypeError); + }) + + // Callback is a generator. + arr.reduceRight(function*(){ + throw "This line will not be executed"; + }); + + // Called from other globals. + if (typeof createNewGlobal === "function") { + var reduceRight = createNewGlobal()[constructor.name].prototype.reduceRight; + assert.sameValue(reduceRight.call(arr, (previous, current) => Math.min(previous, current)), 1); + } + + // Throws if `this` isn't a TypedArray. + var invalidReceivers = [undefined, null, 1, false, "", Symbol(), [], {}, /./, + new Proxy(new constructor(3), {})]; + invalidReceivers.forEach(invalidReceiver => { + assertThrowsInstanceOf(() => { + constructor.prototype.reduceRight.call(invalidReceiver, () => {}); + }, TypeError, "Assert that reduceRight fails if this value is not a TypedArray"); + }); + + // Test that the length getter is never called. + assert.sameValue(Object.defineProperty(arr, "length", { + get() { + throw new Error("length accessor called"); + } + }).reduceRight((previous, current) => Math.max(previous, current)), 5); +} + diff --git a/test/staging/sm/TypedArray/reverse.js b/test/staging/sm/TypedArray/reverse.js new file mode 100644 index 0000000000..dca65068bf --- /dev/null +++ b/test/staging/sm/TypedArray/reverse.js @@ -0,0 +1,47 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [deepEqual.js, sm/non262-TypedArray-shell.js, sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +for (var constructor of anyTypedArrayConstructors) { + assert.deepEqual(constructor.prototype.reverse.length, 0); + + assert.deepEqual(new constructor().reverse(), new constructor()); + assert.deepEqual(new constructor(10).reverse(), new constructor(10)); + assert.deepEqual(new constructor([]).reverse(), new constructor([])); + assert.deepEqual(new constructor([1]).reverse(), new constructor([1])); + assert.deepEqual(new constructor([1, 2]).reverse(), new constructor([2, 1])); + assert.deepEqual(new constructor([1, 2, 3]).reverse(), new constructor([3, 2, 1])); + assert.deepEqual(new constructor([1, 2, 3, 4]).reverse(), new constructor([4, 3, 2, 1])); + assert.deepEqual(new constructor([1, 2, 3, 4, 5]).reverse(), new constructor([5, 4, 3, 2, 1])); + assert.deepEqual(new constructor([.1, .2, .3]).reverse(), new constructor([.3, .2, .1])); + + // Called from other globals. + if (typeof createNewGlobal === "function") { + var reverse = createNewGlobal()[constructor.name].prototype.reverse; + assert.deepEqual(reverse.call(new constructor([3, 2, 1])), new constructor([1, 2, 3])); + } + + // Throws if `this` isn't a TypedArray. + var invalidReceivers = [undefined, null, 1, false, "", Symbol(), [], {}, /./, + new Proxy(new constructor(), {})]; + invalidReceivers.forEach(invalidReceiver => { + assertThrowsInstanceOf(() => { + constructor.prototype.reverse.call(invalidReceiver); + }, TypeError, "Assert that reverse fails if this value is not a TypedArray"); + }); + + // Test that the length getter is never called. + Object.defineProperty(new constructor([1, 2, 3]), "length", { + get() { + throw new Error("length accessor called"); + } + }).reverse(); +} + diff --git a/test/staging/sm/TypedArray/seal-and-freeze.js b/test/staging/sm/TypedArray/seal-and-freeze.js new file mode 100644 index 0000000000..6ae64d3147 --- /dev/null +++ b/test/staging/sm/TypedArray/seal-and-freeze.js @@ -0,0 +1,58 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +flags: +- onlyStrict +includes: [sm/non262-TypedArray-shell.js, sm/non262-shell.js, sm/non262.js] +description: | + pending +esid: pending +---*/ +"use strict"; + +// Seal +assert.sameValue(Object.isSealed(new Int32Array(2)), false); +assert.sameValue(Object.isSealed(new Int32Array(0)), false); + +var array = new Int32Array(0); +Object.preventExtensions(array); +assert.sameValue(Object.isSealed(array), true); + +// Non-empty typed arrays can never be sealed, because the elements stay configurable. +array = new Int32Array(1); +array.b = "test"; +Object.preventExtensions(array); +assert.sameValue(Object.isSealed(array), false); +Object.defineProperty(array, "b", {configurable: false}); +assert.sameValue(Object.isSealed(array), false); + +array = new Int32Array(2); +array.b = "test"; +assertThrowsInstanceOf(() => Object.seal(array), TypeError); +assert.sameValue(Object.isSealed(array), false); +assertThrowsInstanceOf(() => array.c = 15, TypeError); + +// Freeze +assert.sameValue(Object.isFrozen(new Int32Array(2)), false); +assert.sameValue(Object.isFrozen(new Int32Array(0)), false); + +// Empty non-extensible typed-array is trivially frozen +var array = new Int32Array(0); +Object.preventExtensions(array); +assert.sameValue(Object.isFrozen(array), true); + +array = new Int32Array(0); +array.b = "test"; +assert.sameValue(Object.isFrozen(array), false); +Object.preventExtensions(array); +assert.sameValue(Object.isFrozen(array), false); +Object.defineProperty(array, "b", {configurable: false, writable: false}); +assert.sameValue(Object.isFrozen(array), true); + +// Non-empty typed arrays can never be frozen, because the elements stay writable +array = new Int32Array(1); +assertThrowsInstanceOf(() => Object.freeze(array), TypeError); +assert.sameValue(Object.isExtensible(array), false); +assert.sameValue(Object.isFrozen(array), false); + diff --git a/test/staging/sm/TypedArray/set-detached-bigint.js b/test/staging/sm/TypedArray/set-detached-bigint.js new file mode 100644 index 0000000000..77ea76233c --- /dev/null +++ b/test/staging/sm/TypedArray/set-detached-bigint.js @@ -0,0 +1,28 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-TypedArray-shell.js, sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +let ta = new BigInt64Array(10); + +let obj = { + get length() { + $262.detachArrayBuffer(ta.buffer); + return 1; + }, + 0: { + valueOf() { + return "huzzah!"; + } + }, +}; + +// Throws a SyntaxError, because "huzzah!" can't be parsed as a BigInt. +assertThrowsInstanceOf(() => ta.set(obj), SyntaxError); + diff --git a/test/staging/sm/TypedArray/set-detached.js b/test/staging/sm/TypedArray/set-detached.js new file mode 100644 index 0000000000..550a59fcb3 --- /dev/null +++ b/test/staging/sm/TypedArray/set-detached.js @@ -0,0 +1,274 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-TypedArray-shell.js, sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +// Tests for detached ArrayBuffer checks in %TypedArray%.prototype.set(array|typedArray, offset). + +function* createTypedArrays(lengths = [0, 1, 4, 4096]) { + for (let length of lengths) { + let buffer = new ArrayBuffer(length * Int32Array.BYTES_PER_ELEMENT); + let typedArray = new Int32Array(buffer); + + yield {typedArray, buffer}; + } +} + +if (typeof $262.detachArrayBuffer === "function") { + class ExpectedError extends Error {} + + // No detached check on function entry. + for (let {typedArray, buffer} of createTypedArrays()) { + $262.detachArrayBuffer(buffer); + + assertThrowsInstanceOf(() => typedArray.set(null, { + valueOf() { + throw new ExpectedError(); + } + }), ExpectedError); + } + + // Check for detached buffer after calling ToInteger(offset). Test with: + // - valid offset, + // - too large offset, + // - and negative offset. + for (let [offset, error] of [[0, TypeError], [1000000, TypeError], [-1, RangeError]]) { + for (let source of [[], [0], new Int32Array(0), new Int32Array(1)]) { + for (let {typedArray, buffer} of createTypedArrays()) { + assertThrowsInstanceOf(() => typedArray.set(source, { + valueOf() { + $262.detachArrayBuffer(buffer); + return offset; + } + }), error); + } + } + } + + // Tests when called with detached typed array as source. + for (let {typedArray} of createTypedArrays()) { + for (let {typedArray: source, buffer: sourceBuffer} of createTypedArrays()) { + $262.detachArrayBuffer(sourceBuffer); + + assertThrowsInstanceOf(() => typedArray.set(source, { + valueOf() { + throw new ExpectedError(); + } + }), ExpectedError); + } + } + + // Check when detaching source buffer in ToInteger(offset). Test with: + // - valid offset, + // - too large offset, + // - and negative offset. + for (let [offset, error] of [[0, TypeError], [1000000, TypeError], [-1, RangeError]]) { + for (let {typedArray} of createTypedArrays()) { + for (let {typedArray: source, buffer: sourceBuffer} of createTypedArrays()) { + assertThrowsInstanceOf(() => typedArray.set(source, { + valueOf() { + $262.detachArrayBuffer(sourceBuffer); + return offset; + } + }), error); + } + } + } + + // Test when target and source use the same underlying buffer and + // ToInteger(offset) detaches the buffer. Test with: + // - same typed array, + // - different typed array, but same element type, + // - and different element type. + for (let src of [ta => ta, ta => new Int32Array(ta.buffer), ta => new Float32Array(ta.buffer)]) { + for (let {typedArray, buffer} of createTypedArrays()) { + let source = src(typedArray); + assertThrowsInstanceOf(() => typedArray.set(source, { + valueOf() { + $262.detachArrayBuffer(buffer); + return 0; + } + }), TypeError); + } + } + + // Test when Get(src, "length") detaches the buffer, but srcLength is 0. + // Also use different offsets to ensure bounds checks use the typed array's + // length value from before detaching the buffer. + for (let offset of [() => 0, ta => Math.min(1, ta.length), ta => Math.max(0, ta.length - 1)]) { + for (let {typedArray, buffer} of createTypedArrays()) { + let source = { + get length() { + $262.detachArrayBuffer(buffer); + return 0; + } + }; + typedArray.set(source, offset(typedArray)); + } + } + + // Test when ToLength(Get(src, "length")) detaches the buffer, but + // srcLength is 0. Also use different offsets to ensure bounds checks use + // the typed array's length value from before detaching the buffer. + for (let offset of [() => 0, ta => Math.min(1, ta.length), ta => Math.max(0, ta.length - 1)]) { + for (let {typedArray, buffer} of createTypedArrays()) { + let source = { + length: { + valueOf() { + $262.detachArrayBuffer(buffer); + return 0; + } + } + }; + typedArray.set(source, offset(typedArray)); + } + } + + // Test no TypeError is thrown when the typed array is detached and + // srcLength > 0. + for (let {typedArray, buffer} of createTypedArrays()) { + let source = { + length: { + valueOf() { + $262.detachArrayBuffer(buffer); + return 1; + } + } + }; + if (typedArray.length === 0) { + assertThrowsInstanceOf(() => typedArray.set(source), RangeError); + } else { + typedArray.set(source); + } + } + + // Same as above, but with side-effect when executing Get(src, "0"). + for (let {typedArray, buffer} of createTypedArrays()) { + let source = { + get 0() { + throw new ExpectedError(); + }, + length: { + valueOf() { + $262.detachArrayBuffer(buffer); + return 1; + } + } + }; + let err = typedArray.length === 0 ? RangeError : ExpectedError; + assertThrowsInstanceOf(() => typedArray.set(source), err); + } + + // Same as above, but with side-effect when executing ToNumber(Get(src, "0")). + for (let {typedArray, buffer} of createTypedArrays()) { + let source = { + get 0() { + return { + valueOf() { + throw new ExpectedError(); + } + }; + }, + length: { + valueOf() { + $262.detachArrayBuffer(buffer); + return 1; + } + } + }; + let err = typedArray.length === 0 ? RangeError : ExpectedError; + assertThrowsInstanceOf(() => typedArray.set(source), err); + } + + // Side-effects when getting the source elements detach the buffer. + for (let {typedArray, buffer} of createTypedArrays()) { + let source = Object.defineProperties([], { + 0: { + get() { + $262.detachArrayBuffer(buffer); + return 1; + } + } + }); + if (typedArray.length === 0) { + assertThrowsInstanceOf(() => typedArray.set(source), RangeError); + } else { + typedArray.set(source); + } + } + + // Side-effects when getting the source elements detach the buffer. Also + // ensure other elements are accessed. + for (let {typedArray, buffer} of createTypedArrays()) { + let accessed = false; + let source = Object.defineProperties([], { + 0: { + get() { + $262.detachArrayBuffer(buffer); + return 1; + } + }, + 1: { + get() { + assert.sameValue(accessed, false); + accessed = true; + return 2; + } + } + }); + if (typedArray.length <= 1) { + assertThrowsInstanceOf(() => typedArray.set(source), RangeError); + } else { + assert.sameValue(accessed, false); + typedArray.set(source); + assert.sameValue(accessed, true); + } + } + + // Side-effects when converting the source elements detach the buffer. + for (let {typedArray, buffer} of createTypedArrays()) { + let source = [{ + valueOf() { + $262.detachArrayBuffer(buffer); + return 1; + } + }]; + if (typedArray.length === 0) { + assertThrowsInstanceOf(() => typedArray.set(source), RangeError); + } else { + typedArray.set(source); + } + } + + // Side-effects when converting the source elements detach the buffer. Also + // ensure other elements are accessed. + for (let {typedArray, buffer} of createTypedArrays()) { + let accessed = false; + let source = [{ + valueOf() { + $262.detachArrayBuffer(buffer); + return 1; + } + }, { + valueOf() { + assert.sameValue(accessed, false); + accessed = true; + return 2; + } + }]; + if (typedArray.length <= 1) { + assertThrowsInstanceOf(() => typedArray.set(source), RangeError); + } else { + assert.sameValue(accessed, false); + typedArray.set(source); + assert.sameValue(accessed, true); + } + } +} + diff --git a/test/staging/sm/TypedArray/set-negative-offset.js b/test/staging/sm/TypedArray/set-negative-offset.js new file mode 100644 index 0000000000..fde5fe5727 --- /dev/null +++ b/test/staging/sm/TypedArray/set-negative-offset.js @@ -0,0 +1,43 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-TypedArray-shell.js, sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +/* + * Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/publicdomain/zero/1.0/ + */ + +var gTestfile = "set-negative-offset.js"; +//----------------------------------------------------------------------------- +var BUGNUMBER = 1140752; +var summary = + "%TypedArray%.prototype.set must throw a RangeError when passed a negative " + + "offset"; + +print(BUGNUMBER + ": " + summary); + +/************** + * BEGIN TEST * + **************/ + +try +{ + new Uint8Array().set([], -1); + throw new Error("didn't throw at all"); +} +catch (e) +{ + assert.sameValue(e instanceof RangeError, true, + "expected RangeError, instead got: " + e); +} + +/******************************************************************************/ + +print("Tests complete"); diff --git a/test/staging/sm/TypedArray/set-same-buffer-different-source-target-types.js b/test/staging/sm/TypedArray/set-same-buffer-different-source-target-types.js new file mode 100644 index 0000000000..57a231c7e9 --- /dev/null +++ b/test/staging/sm/TypedArray/set-same-buffer-different-source-target-types.js @@ -0,0 +1,49 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-TypedArray-shell.js, sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +/* + * Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/publicdomain/zero/1.0/ + */ + +var gTestfile = "set-same-buffer-different-source-target-types.js"; +//----------------------------------------------------------------------------- +var BUGNUMBER = 896116; +var summary = + "When setting a typed array from an overlapping typed array of different " + + "element type, copy the source elements into properly-sized temporary " + + "memory, and properly copy them into the target without overflow (of " + + "either source *or* target) when finished"; + +print(BUGNUMBER + ": " + summary); + +/************** + * BEGIN TEST * + **************/ + +// smallest 2**n triggering segfaults in a pre-patch build locally, then +// quadrupled in case the boundary ever changes, or is different in some other +// memory-allocating implementation +var srclen = 65536; + +var ta = new Uint8Array(srclen * Float64Array.BYTES_PER_ELEMENT); +var ta2 = new Float64Array(ta.buffer, 0, srclen); +ta.set(ta2); + +// This test mostly exists to check for no crash above, but it's worth testing +// for no uninitialized memory (in case of buffer overflow) being copied into +// the array, too. +for (var i = 0, len = ta.length; i < len; i++) + assert.sameValue(ta[i], 0, "zero-bits double should convert to zero"); + +/******************************************************************************/ + +print("Tests complete"); diff --git a/test/staging/sm/TypedArray/set-tointeger.js b/test/staging/sm/TypedArray/set-tointeger.js new file mode 100644 index 0000000000..642fe5004d --- /dev/null +++ b/test/staging/sm/TypedArray/set-tointeger.js @@ -0,0 +1,104 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-TypedArray-shell.js, sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +// Test ToInteger conversion in %TypedArray%.prototype.set(array|typedArray, offset). + +let ta = new Int32Array(4); + +// %TypedArray%.prototype.set has two different implementations for typed array +// and non-typed array arguments. Test with both input types. +let emptySources = [[], new Int32Array(0)]; +let nonEmptySource = [[0], new Int32Array(1)]; +let sources = [...emptySources, ...nonEmptySource]; + +// Test when ToInteger(offset) is in (-1, 4). +let validOffsets = [ + // Values in [+0, 4). + 0, + 0.1, + 3, + 3.9, + + // Values in (-1, -0]. + -0, + -0.1, + -0.9, + + NaN, + + // Also include some non-number values. + undefined, + null, + true, + "", + "3", + " 1\t\n", + "some string", + {valueOf() { return 2; }}, +]; + +for (let offset of validOffsets) { + for (let source of sources) { + ta.set(source, offset); + } +} + +// Test when ToInteger(offset) isn't in (-1, 4). +let invalidOffsets = [ + // Values exceeding the typed array's length. + 5, + 2147483647, + 2147483648, + 2147483649, + 4294967295, + 4294967296, + 4294967297, + Infinity, + + // Negative values. + -1, + -1.1, + -2147483647, + -2147483648, + -2147483649, + -4294967295, + -4294967296, + -4294967297, + -Infinity, + + // Also include some non-number values. + "8", + "Infinity", + " Infinity ", + {valueOf() { return 10; }}, +]; + +for (let offset of invalidOffsets) { + for (let source of sources) { + assertThrowsInstanceOf(() => ta.set(source, offset), RangeError); + } +} + +// Test when ToInteger(offset) is in [4, 5). +for (let source of emptySources) { + ta.set(source, 4); + ta.set(source, 4.9); +} +for (let source of nonEmptySource) { + assertThrowsInstanceOf(() => ta.set(source, 4), RangeError); + assertThrowsInstanceOf(() => ta.set(source, 4.9), RangeError); +} + +// ToInteger(symbol value) throws a TypeError. +for (let source of sources) { + assertThrowsInstanceOf(() => ta.set(source, Symbol()), TypeError); +} + diff --git a/test/staging/sm/TypedArray/set-toobject.js b/test/staging/sm/TypedArray/set-toobject.js new file mode 100644 index 0000000000..e854e669d7 --- /dev/null +++ b/test/staging/sm/TypedArray/set-toobject.js @@ -0,0 +1,62 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [compareArray.js, sm/non262-TypedArray-shell.js, sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +// Test ToObject in %TypedArray%.prototype.set(array|typedArray, offset). + +let ta = new Int32Array(4); + +for (let nullOrUndefined of [null, undefined]) { + // ToObject(array) throws a TypeError when |array| is null or undefined. + assertThrowsInstanceOf(() => ta.set(nullOrUndefined), TypeError); + + // ToInteger(offset) is called before ToObject(array). + class ExpectedError extends Error {} + assertThrowsInstanceOf(() => ta.set(nullOrUndefined, { + valueOf() { + throw new ExpectedError(); + } + }), ExpectedError); +} + +// Ensure ta is still initialized with zeros. +assert.compareArray(ta, [0, 0, 0, 0]); + +// %TypedArray%.prototype.set can be called with a string primitive values. +ta.set(""); +assert.compareArray(ta, [0, 0, 0, 0]); + +ta.set("123"); +assert.compareArray(ta, [1, 2, 3, 0]); + +// Throws a RangeError if the length is too large. +assertThrowsInstanceOf(() => ta.set("456789"), RangeError); +assert.compareArray(ta, [1, 2, 3, 0]); + +// When called with other primitive values the typed array contents don't +// change since ToObject().length is zero, i.e. the source object is +// treated the same as an empty array. +for (let value of [true, false, 0, NaN, 123, Infinity, Symbol()]) { + ta.set(value); + assert.compareArray(ta, [1, 2, 3, 0]); +} + +// Repeat test from above when the primitive wrapper prototype has been changed +// to include "length" and an indexed property. +Number.prototype.length = 4; +Number.prototype[3] = -1; +try { + ta.set(456); + assert.compareArray(ta, [0, 0, 0, -1]); +} finally { + delete Number.prototype.length; + delete Number.prototype[3]; +} + diff --git a/test/staging/sm/TypedArray/set-with-receiver.js b/test/staging/sm/TypedArray/set-with-receiver.js new file mode 100644 index 0000000000..b76d282ec2 --- /dev/null +++ b/test/staging/sm/TypedArray/set-with-receiver.js @@ -0,0 +1,38 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-TypedArray-shell.js, sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +for (var constructor of anyTypedArrayConstructors) { + var receiver = {}; + + var ta = new constructor(1); + assert.sameValue(Reflect.set(ta, 0, 47, receiver), true); + assert.sameValue(ta[0], 0); + assert.sameValue(receiver[0], 47); + + // Out-of-bounds + assert.sameValue(Reflect.set(ta, 10, 47, receiver), true); + assert.sameValue(ta[10], undefined); + assert.sameValue(receiver[10], undefined); + assert.sameValue(Object.hasOwn(receiver, 10), false); + + // Detached + if (typeof $262.detachArrayBuffer === "function" && + !isSharedConstructor(constructor)) + { + $262.detachArrayBuffer(ta.buffer) + + assert.sameValue(ta[0], undefined); + assert.sameValue(Reflect.set(ta, 0, 42, receiver), true); + assert.sameValue(ta[0], undefined); + assert.sameValue(receiver[0], 47); + } +} + diff --git a/test/staging/sm/TypedArray/set-wrapped.js b/test/staging/sm/TypedArray/set-wrapped.js new file mode 100644 index 0000000000..bfcb35e671 --- /dev/null +++ b/test/staging/sm/TypedArray/set-wrapped.js @@ -0,0 +1,90 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [compareArray.js, sm/non262-TypedArray-shell.js, sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +// Test %TypedArray%.prototype.set(typedArray, offset) when called with wrapped +// typed array. + +if (typeof createNewGlobal === "function") { + var otherGlobal = createNewGlobal(); + + function taintLengthProperty(obj) { + Object.defineProperty(obj, "length", { + get() { + assert.sameValue(true, false); + } + }); + } + + for (var TA of anyTypedArrayConstructors) { + var target = new TA(4); + var source = new otherGlobal[TA.name]([10, 20]); + + // Ensure "length" getter accessor isn't called. + taintLengthProperty(source); + + assert.compareArray(target, [0, 0, 0, 0]); + target.set(source, 1); + assert.compareArray(target, [0, 10, 20, 0]); + } + + // Detachment checks are also applied correctly for wrapped typed arrays. + if (typeof $262.detachArrayBuffer === "function") { + // Create typed array from different global (explicit constructor call). + for (var TA of typedArrayConstructors) { + var target = new TA(4); + var source = new otherGlobal[TA.name](1); + taintLengthProperty(source); + + // Called with wrapped typed array, array buffer already detached. + otherGlobal.$262.detachArrayBuffer(source.buffer); + assertThrowsInstanceOf(() => target.set(source), TypeError); + + var source = new otherGlobal[TA.name](1); + taintLengthProperty(source); + + // Called with wrapped typed array, array buffer detached when + // processing offset parameter. + var offset = { + valueOf() { + otherGlobal.$262.detachArrayBuffer(source.buffer); + return 0; + } + }; + assertThrowsInstanceOf(() => target.set(source, offset), TypeError); + } + + // Create typed array from different global (implictly created when + // ArrayBuffer is a CCW). + for (var TA of typedArrayConstructors) { + var target = new TA(4); + var source = new TA(new otherGlobal.ArrayBuffer(1 * TA.BYTES_PER_ELEMENT)); + taintLengthProperty(source); + + // Called with wrapped typed array, array buffer already detached. + otherGlobal.$262.detachArrayBuffer(source.buffer); + assertThrowsInstanceOf(() => target.set(source), TypeError); + + var source = new TA(new otherGlobal.ArrayBuffer(1 * TA.BYTES_PER_ELEMENT)); + taintLengthProperty(source); + + // Called with wrapped typed array, array buffer detached when + // processing offset parameter. + var offset = { + valueOf() { + otherGlobal.$262.detachArrayBuffer(source.buffer); + return 0; + } + }; + assertThrowsInstanceOf(() => target.set(source, offset), TypeError); + } + } +} + diff --git a/test/staging/sm/TypedArray/set.js b/test/staging/sm/TypedArray/set.js new file mode 100644 index 0000000000..4e2bb24989 --- /dev/null +++ b/test/staging/sm/TypedArray/set.js @@ -0,0 +1,30 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [deepEqual.js, sm/non262-TypedArray-shell.js, sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +const TypedArrayPrototype = Object.getPrototypeOf(Int8Array.prototype); + +// %TypedArrayPrototype% has an own "set" function property. +assert.sameValue(TypedArrayPrototype.hasOwnProperty("set"), true); +assert.sameValue(typeof TypedArrayPrototype.set, "function"); + +// The concrete TypedArray prototypes do not have an own "set" property. +assert.sameValue(anyTypedArrayConstructors.every(c => !c.hasOwnProperty("set")), true); + +assert.deepEqual(Object.getOwnPropertyDescriptor(TypedArrayPrototype, "set"), { + value: TypedArrayPrototype.set, + writable: true, + enumerable: false, + configurable: true, +}); + +assert.sameValue(TypedArrayPrototype.set.name, "set"); +assert.sameValue(TypedArrayPrototype.set.length, 1); + diff --git a/test/staging/sm/TypedArray/slice-bitwise-same.js b/test/staging/sm/TypedArray/slice-bitwise-same.js new file mode 100644 index 0000000000..f37150df1a --- /dev/null +++ b/test/staging/sm/TypedArray/slice-bitwise-same.js @@ -0,0 +1,116 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [compareArray.js, sm/non262-TypedArray-shell.js, sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +// Copies bytes bit-wise if source and target type are the same. +// Only detectable when using floating point typed arrays. +const float32Constructors = anyTypedArrayConstructors.filter(isFloatConstructor) + .filter(c => c.BYTES_PER_ELEMENT === 4); +const float64Constructors = anyTypedArrayConstructors.filter(isFloatConstructor) + .filter(c => c.BYTES_PER_ELEMENT === 8); + +// Also test with cross-compartment typed arrays. +const otherGlobal = createNewGlobal(); +float32Constructors.push(otherGlobal.Float32Array); +float64Constructors.push(otherGlobal.Float64Array); + +function* p(xs, ys) { + for (let x of xs) { + for (let y of ys) { + yield [x, y]; + } + } +} + +const isLittleEndian = new Uint8Array(new Uint16Array([1]).buffer)[0] !== 0; + +function geti64(i32, i) { + return [i32[2 * i + isLittleEndian], i32[2 * i + !isLittleEndian]]; +} + +function seti64(i32, i, [hi, lo]) { + i32[i * 2 + isLittleEndian] = hi; + i32[i * 2 + !isLittleEndian] = lo; +} + +const NaNs = { + Float32: [ + 0x7F800001|0, // smallest SNaN + 0x7FBFFFFF|0, // largest SNaN + 0x7FC00000|0, // smallest QNaN + 0x7FFFFFFF|0, // largest QNaN + 0xFF800001|0, // smallest SNaN, sign-bit set + 0xFFBFFFFF|0, // largest SNaN, sign-bit set + 0xFFC00000|0, // smallest QNaN, sign-bit set + 0xFFFFFFFF|0, // largest QNaN, sign-bit set + ], + Float64: [ + [0x7FF00000|0, 0x00000001|0], // smallest SNaN + [0x7FF7FFFF|0, 0xFFFFFFFF|0], // largest SNaN + [0x7FF80000|0, 0x00000000|0], // smallest QNaN + [0x7FFFFFFF|0, 0xFFFFFFFF|0], // largest QNaN + [0xFFF00000|0, 0x00000001|0], // smallest SNaN, sign-bit set + [0xFFF7FFFF|0, 0xFFFFFFFF|0], // largest SNaN, sign-bit set + [0xFFF80000|0, 0x00000000|0], // smallest QNaN, sign-bit set + [0xFFFFFFFF|0, 0xFFFFFFFF|0], // largest QNaN, sign-bit set + ], +}; + +const cNaN = { + Float32: new Int32Array(new Float32Array([NaN]).buffer)[0], + Float64: geti64(new Int32Array(new Float64Array([NaN]).buffer), 0), +}; + +// Float32 -> Float32 +for (let [sourceConstructor, targetConstructor] of p(float32Constructors, float32Constructors)) { + let len = NaNs.Float32.length; + let f32 = new sourceConstructor(len); + let i32 = new Int32Array(f32.buffer); + f32.constructor = targetConstructor; + + for (let i = 0; i < len; ++i) { + i32[i] = NaNs.Float32[i]; + } + + let rf32 = f32.slice(0); + let ri32 = new Int32Array(rf32.buffer); + + assert.sameValue(rf32.length, len); + assert.sameValue(ri32.length, len); + + // Same bits. + for (let i = 0; i < len; ++i) { + assert.sameValue(ri32[i], NaNs.Float32[i]); + } +} + +// Float64 -> Float64 +for (let [sourceConstructor, targetConstructor] of p(float64Constructors, float64Constructors)) { + let len = NaNs.Float64.length; + let f64 = new sourceConstructor(len); + let i32 = new Int32Array(f64.buffer); + f64.constructor = targetConstructor; + + for (let i = 0; i < len; ++i) { + seti64(i32, i, NaNs.Float64[i]); + } + + let rf64 = f64.slice(0); + let ri32 = new Int32Array(rf64.buffer); + + assert.sameValue(rf64.length, len); + assert.sameValue(ri32.length, 2 * len); + + // Same bits. + for (let i = 0; i < len; ++i) { + assert.compareArray(geti64(ri32, i), NaNs.Float64[i]); + } +} + diff --git a/test/staging/sm/TypedArray/slice-conversion.js b/test/staging/sm/TypedArray/slice-conversion.js new file mode 100644 index 0000000000..2452f2e4bb --- /dev/null +++ b/test/staging/sm/TypedArray/slice-conversion.js @@ -0,0 +1,524 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [compareArray.js, sm/non262-TypedArray-shell.js, sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +// Test conversions to different element types. +let tests = [ + /* Int8Array */ + { + from: Int8Array, + to: Int8Array, + values: [-129, -128, -127, -1, 0, 1, 127, 128, 129], + expected: [127, -128, -127, -1, 0, 1, 127, -128, -127], + }, + { + from: Int8Array, + to: Uint8Array, + values: [-129, -128, -127, -1, 0, 1, 127, 128, 129], + expected: [127, 128, 129, 255, 0, 1, 127, 128, 129], + }, + { + from: Int8Array, + to: Uint8ClampedArray, + values: [-129, -128, -127, -1, 0, 1, 127, 128, 129], + expected: [127, 0, 0, 0, 0, 1, 127, 0, 0], + }, + { + from: Int8Array, + to: Int16Array, + values: [-129, -128, -127, -1, 0, 1, 127, 128, 129], + expected: [127, -128, -127, -1, 0, 1, 127, -128, -127], + }, + { + from: Int8Array, + to: Uint16Array, + values: [-129, -128, -127, -1, 0, 1, 127, 128, 129], + expected: [127, 65408, 65409, 65535, 0, 1, 127, 65408, 65409], + }, + { + from: Int8Array, + to: Int32Array, + values: [-129, -128, -127, -1, 0, 1, 127, 128, 129], + expected: [127, -128, -127, -1, 0, 1, 127, -128, -127], + }, + { + from: Int8Array, + to: Uint32Array, + values: [-129, -128, -127, -1, 0, 1, 127, 128, 129], + expected: [127, 4294967168, 4294967169, 4294967295, 0, 1, 127, 4294967168, 4294967169], + }, + { + from: Int8Array, + to: Float32Array, + values: [-129, -128, -127, -1, 0, 1, 127, 128, 129], + expected: [127, -128, -127, -1, 0, 1, 127, -128, -127], + }, + { + from: Int8Array, + to: Float64Array, + values: [-129, -128, -127, -1, 0, 1, 127, 128, 129], + expected: [127, -128, -127, -1, 0, 1, 127, -128, -127], + }, + + /* Uint8Array */ + { + from: Uint8Array, + to: Int8Array, + values: [0, 1, 127, 128, 129, 254, 255, 256], + expected: [0, 1, 127, -128, -127, -2, -1, 0], + }, + { + from: Uint8Array, + to: Uint8Array, + values: [0, 1, 127, 128, 129, 254, 255, 256], + expected: [0, 1, 127, 128, 129, 254, 255, 0], + }, + { + from: Uint8Array, + to: Uint8ClampedArray, + values: [0, 1, 127, 128, 129, 254, 255, 256], + expected: [0, 1, 127, 128, 129, 254, 255, 0], + }, + { + from: Uint8Array, + to: Int16Array, + values: [0, 1, 127, 128, 129, 254, 255, 256], + expected: [0, 1, 127, 128, 129, 254, 255, 0], + }, + { + from: Uint8Array, + to: Uint16Array, + values: [0, 1, 127, 128, 129, 254, 255, 256], + expected: [0, 1, 127, 128, 129, 254, 255, 0], + }, + { + from: Uint8Array, + to: Int32Array, + values: [0, 1, 127, 128, 129, 254, 255, 256], + expected: [0, 1, 127, 128, 129, 254, 255, 0], + }, + { + from: Uint8Array, + to: Uint32Array, + values: [0, 1, 127, 128, 129, 254, 255, 256], + expected: [0, 1, 127, 128, 129, 254, 255, 0], + }, + { + from: Uint8Array, + to: Float32Array, + values: [0, 1, 127, 128, 129, 254, 255, 256], + expected: [0, 1, 127, 128, 129, 254, 255, 0], + }, + { + from: Uint8Array, + to: Float64Array, + values: [0, 1, 127, 128, 129, 254, 255, 256], + expected: [0, 1, 127, 128, 129, 254, 255, 0], + }, + + /* Uint8ClampedArray */ + { + from: Uint8ClampedArray, + to: Int8Array, + values: [0, 1, 127, 128, 129, 254, 255, 256], + expected: [0, 1, 127, -128, -127, -2, -1, -1], + }, + { + from: Uint8ClampedArray, + to: Uint8Array, + values: [0, 1, 127, 128, 129, 254, 255, 256], + expected: [0, 1, 127, 128, 129, 254, 255, 255], + }, + { + from: Uint8ClampedArray, + to: Uint8ClampedArray, + values: [0, 1, 127, 128, 129, 254, 255, 256], + expected: [0, 1, 127, 128, 129, 254, 255, 255], + }, + { + from: Uint8ClampedArray, + to: Int16Array, + values: [0, 1, 127, 128, 129, 254, 255, 256], + expected: [0, 1, 127, 128, 129, 254, 255, 255], + }, + { + from: Uint8ClampedArray, + to: Uint16Array, + values: [0, 1, 127, 128, 129, 254, 255, 256], + expected: [0, 1, 127, 128, 129, 254, 255, 255], + }, + { + from: Uint8ClampedArray, + to: Int32Array, + values: [0, 1, 127, 128, 129, 254, 255, 256], + expected: [0, 1, 127, 128, 129, 254, 255, 255], + }, + { + from: Uint8ClampedArray, + to: Uint32Array, + values: [0, 1, 127, 128, 129, 254, 255, 256], + expected: [0, 1, 127, 128, 129, 254, 255, 255], + }, + { + from: Uint8ClampedArray, + to: Float32Array, + values: [0, 1, 127, 128, 129, 254, 255, 256], + expected: [0, 1, 127, 128, 129, 254, 255, 255], + }, + { + from: Uint8ClampedArray, + to: Float64Array, + values: [0, 1, 127, 128, 129, 254, 255, 256], + expected: [0, 1, 127, 128, 129, 254, 255, 255], + }, + + /* Int16Array */ + { + from: Int16Array, + to: Int8Array, + values: [-32769, -32768, -32767, -129, -128, -127, -1, 0, 1, 127, 128, 129, 32767, 32768, 32769], + expected: [-1, 0, 1, 127, -128, -127, -1, 0, 1, 127, -128, -127, -1, 0, 1], + }, + { + from: Int16Array, + to: Uint8Array, + values: [-32769, -32768, -32767, -129, -128, -127, -1, 0, 1, 127, 128, 129, 32767, 32768, 32769], + expected: [255, 0, 1, 127, 128, 129, 255, 0, 1, 127, 128, 129, 255, 0, 1], + }, + { + from: Int16Array, + to: Uint8ClampedArray, + values: [-32769, -32768, -32767, -129, -128, -127, -1, 0, 1, 127, 128, 129, 32767, 32768, 32769], + expected: [255, 0, 0, 0, 0, 0, 0, 0, 1, 127, 128, 129, 255, 0, 0], + }, + { + from: Int16Array, + to: Int16Array, + values: [-32769, -32768, -32767, -129, -128, -127, -1, 0, 1, 127, 128, 129, 32767, 32768, 32769], + expected: [32767, -32768, -32767, -129, -128, -127, -1, 0, 1, 127, 128, 129, 32767, -32768, -32767], + }, + { + from: Int16Array, + to: Uint16Array, + values: [-32769, -32768, -32767, -129, -128, -127, -1, 0, 1, 127, 128, 129, 32767, 32768, 32769], + expected: [32767, 32768, 32769, 65407, 65408, 65409, 65535, 0, 1, 127, 128, 129, 32767, 32768, 32769], + }, + { + from: Int16Array, + to: Int32Array, + values: [-32769, -32768, -32767, -129, -128, -127, -1, 0, 1, 127, 128, 129, 32767, 32768, 32769], + expected: [32767, -32768, -32767, -129, -128, -127, -1, 0, 1, 127, 128, 129, 32767, -32768, -32767], + }, + { + from: Int16Array, + to: Uint32Array, + values: [-32769, -32768, -32767, -129, -128, -127, -1, 0, 1, 127, 128, 129, 32767, 32768, 32769], + expected: [32767, 4294934528, 4294934529, 4294967167, 4294967168, 4294967169, 4294967295, 0, 1, 127, 128, 129, 32767, 4294934528, 4294934529], + }, + { + from: Int16Array, + to: Float32Array, + values: [-32769, -32768, -32767, -129, -128, -127, -1, 0, 1, 127, 128, 129, 32767, 32768, 32769], + expected: [32767, -32768, -32767, -129, -128, -127, -1, 0, 1, 127, 128, 129, 32767, -32768, -32767], + }, + { + from: Int16Array, + to: Float64Array, + values: [-32769, -32768, -32767, -129, -128, -127, -1, 0, 1, 127, 128, 129, 32767, 32768, 32769], + expected: [32767, -32768, -32767, -129, -128, -127, -1, 0, 1, 127, 128, 129, 32767, -32768, -32767], + }, + + /* Uint16Array */ + { + from: Uint16Array, + to: Int8Array, + values: [0, 1, 127, 128, 129, 254, 255, 256, 32767, 32768, 32769, 65534, 65535, 65536], + expected: [0, 1, 127, -128, -127, -2, -1, 0, -1, 0, 1, -2, -1, 0], + }, + { + from: Uint16Array, + to: Uint8Array, + values: [0, 1, 127, 128, 129, 254, 255, 256, 32767, 32768, 32769, 65534, 65535, 65536], + expected: [0, 1, 127, 128, 129, 254, 255, 0, 255, 0, 1, 254, 255, 0], + }, + { + from: Uint16Array, + to: Uint8ClampedArray, + values: [0, 1, 127, 128, 129, 254, 255, 256, 32767, 32768, 32769, 65534, 65535, 65536], + expected: [0, 1, 127, 128, 129, 254, 255, 255, 255, 255, 255, 255, 255, 0], + }, + { + from: Uint16Array, + to: Int16Array, + values: [0, 1, 127, 128, 129, 254, 255, 256, 32767, 32768, 32769, 65534, 65535, 65536], + expected: [0, 1, 127, 128, 129, 254, 255, 256, 32767, -32768, -32767, -2, -1, 0], + }, + { + from: Uint16Array, + to: Uint16Array, + values: [0, 1, 127, 128, 129, 254, 255, 256, 32767, 32768, 32769, 65534, 65535, 65536], + expected: [0, 1, 127, 128, 129, 254, 255, 256, 32767, 32768, 32769, 65534, 65535, 0], + }, + { + from: Uint16Array, + to: Int32Array, + values: [0, 1, 127, 128, 129, 254, 255, 256, 32767, 32768, 32769, 65534, 65535, 65536], + expected: [0, 1, 127, 128, 129, 254, 255, 256, 32767, 32768, 32769, 65534, 65535, 0], + }, + { + from: Uint16Array, + to: Uint32Array, + values: [0, 1, 127, 128, 129, 254, 255, 256, 32767, 32768, 32769, 65534, 65535, 65536], + expected: [0, 1, 127, 128, 129, 254, 255, 256, 32767, 32768, 32769, 65534, 65535, 0], + }, + { + from: Uint16Array, + to: Float32Array, + values: [0, 1, 127, 128, 129, 254, 255, 256, 32767, 32768, 32769, 65534, 65535, 65536], + expected: [0, 1, 127, 128, 129, 254, 255, 256, 32767, 32768, 32769, 65534, 65535, 0], + }, + { + from: Uint16Array, + to: Float64Array, + values: [0, 1, 127, 128, 129, 254, 255, 256, 32767, 32768, 32769, 65534, 65535, 65536], + expected: [0, 1, 127, 128, 129, 254, 255, 256, 32767, 32768, 32769, 65534, 65535, 0], + }, + + /* Int32Array */ + { + from: Int32Array, + to: Int8Array, + values: [-2147483649, -2147483648, -2147483647, -32769, -32768, -32767, -129, -128, -127, -1, 0, 1, 127, 128, 129, 32767, 32768, 32769, 2147483647, 2147483648, 2147483649], + expected: [-1, 0, 1, -1, 0, 1, 127, -128, -127, -1, 0, 1, 127, -128, -127, -1, 0, 1, -1, 0, 1], + }, + { + from: Int32Array, + to: Uint8Array, + values: [-2147483649, -2147483648, -2147483647, -32769, -32768, -32767, -129, -128, -127, -1, 0, 1, 127, 128, 129, 32767, 32768, 32769, 2147483647, 2147483648, 2147483649], + expected: [255, 0, 1, 255, 0, 1, 127, 128, 129, 255, 0, 1, 127, 128, 129, 255, 0, 1, 255, 0, 1], + }, + { + from: Int32Array, + to: Uint8ClampedArray, + values: [-2147483649, -2147483648, -2147483647, -32769, -32768, -32767, -129, -128, -127, -1, 0, 1, 127, 128, 129, 32767, 32768, 32769, 2147483647, 2147483648, 2147483649], + expected: [255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 127, 128, 129, 255, 255, 255, 255, 0, 0], + }, + { + from: Int32Array, + to: Int16Array, + values: [-2147483649, -2147483648, -2147483647, -32769, -32768, -32767, -129, -128, -127, -1, 0, 1, 127, 128, 129, 32767, 32768, 32769, 2147483647, 2147483648, 2147483649], + expected: [-1, 0, 1, 32767, -32768, -32767, -129, -128, -127, -1, 0, 1, 127, 128, 129, 32767, -32768, -32767, -1, 0, 1], + }, + { + from: Int32Array, + to: Uint16Array, + values: [-2147483649, -2147483648, -2147483647, -32769, -32768, -32767, -129, -128, -127, -1, 0, 1, 127, 128, 129, 32767, 32768, 32769, 2147483647, 2147483648, 2147483649], + expected: [65535, 0, 1, 32767, 32768, 32769, 65407, 65408, 65409, 65535, 0, 1, 127, 128, 129, 32767, 32768, 32769, 65535, 0, 1], + }, + { + from: Int32Array, + to: Int32Array, + values: [-2147483649, -2147483648, -2147483647, -32769, -32768, -32767, -129, -128, -127, -1, 0, 1, 127, 128, 129, 32767, 32768, 32769, 2147483647, 2147483648, 2147483649], + expected: [2147483647, -2147483648, -2147483647, -32769, -32768, -32767, -129, -128, -127, -1, 0, 1, 127, 128, 129, 32767, 32768, 32769, 2147483647, -2147483648, -2147483647], + }, + { + from: Int32Array, + to: Uint32Array, + values: [-2147483649, -2147483648, -2147483647, -32769, -32768, -32767, -129, -128, -127, -1, 0, 1, 127, 128, 129, 32767, 32768, 32769, 2147483647, 2147483648, 2147483649], + expected: [2147483647, 2147483648, 2147483649, 4294934527, 4294934528, 4294934529, 4294967167, 4294967168, 4294967169, 4294967295, 0, 1, 127, 128, 129, 32767, 32768, 32769, 2147483647, 2147483648, 2147483649], + }, + { + from: Int32Array, + to: Float32Array, + values: [-2147483649, -2147483648, -2147483647, -32769, -32768, -32767, -129, -128, -127, -1, 0, 1, 127, 128, 129, 32767, 32768, 32769, 2147483647, 2147483648, 2147483649], + expected: [2147483648, -2147483648, -2147483648, -32769, -32768, -32767, -129, -128, -127, -1, 0, 1, 127, 128, 129, 32767, 32768, 32769, 2147483648, -2147483648, -2147483648], + }, + { + from: Int32Array, + to: Float64Array, + values: [-2147483649, -2147483648, -2147483647, -32769, -32768, -32767, -129, -128, -127, -1, 0, 1, 127, 128, 129, 32767, 32768, 32769, 2147483647, 2147483648, 2147483649], + expected: [2147483647, -2147483648, -2147483647, -32769, -32768, -32767, -129, -128, -127, -1, 0, 1, 127, 128, 129, 32767, 32768, 32769, 2147483647, -2147483648, -2147483647], + }, + + /* Uint32Array */ + { + from: Uint32Array, + to: Int8Array, + values: [0, 1, 127, 128, 129, 254, 255, 256, 32767, 32768, 32769, 65534, 65535, 65536, 2147483647, 2147483648, 2147483649, 4294967294, 4294967295, 4294967296], + expected: [0, 1, 127, -128, -127, -2, -1, 0, -1, 0, 1, -2, -1, 0, -1, 0, 1, -2, -1, 0], + }, + { + from: Uint32Array, + to: Uint8Array, + values: [0, 1, 127, 128, 129, 254, 255, 256, 32767, 32768, 32769, 65534, 65535, 65536, 2147483647, 2147483648, 2147483649, 4294967294, 4294967295, 4294967296], + expected: [0, 1, 127, 128, 129, 254, 255, 0, 255, 0, 1, 254, 255, 0, 255, 0, 1, 254, 255, 0], + }, + { + from: Uint32Array, + to: Uint8ClampedArray, + values: [0, 1, 127, 128, 129, 254, 255, 256, 32767, 32768, 32769, 65534, 65535, 65536, 2147483647, 2147483648, 2147483649, 4294967294, 4294967295, 4294967296], + expected: [0, 1, 127, 128, 129, 254, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 0], + }, + { + from: Uint32Array, + to: Int16Array, + values: [0, 1, 127, 128, 129, 254, 255, 256, 32767, 32768, 32769, 65534, 65535, 65536, 2147483647, 2147483648, 2147483649, 4294967294, 4294967295, 4294967296], + expected: [0, 1, 127, 128, 129, 254, 255, 256, 32767, -32768, -32767, -2, -1, 0, -1, 0, 1, -2, -1, 0], + }, + { + from: Uint32Array, + to: Uint16Array, + values: [0, 1, 127, 128, 129, 254, 255, 256, 32767, 32768, 32769, 65534, 65535, 65536, 2147483647, 2147483648, 2147483649, 4294967294, 4294967295, 4294967296], + expected: [0, 1, 127, 128, 129, 254, 255, 256, 32767, 32768, 32769, 65534, 65535, 0, 65535, 0, 1, 65534, 65535, 0], + }, + { + from: Uint32Array, + to: Int32Array, + values: [0, 1, 127, 128, 129, 254, 255, 256, 32767, 32768, 32769, 65534, 65535, 65536, 2147483647, 2147483648, 2147483649, 4294967294, 4294967295, 4294967296], + expected: [0, 1, 127, 128, 129, 254, 255, 256, 32767, 32768, 32769, 65534, 65535, 65536, 2147483647, -2147483648, -2147483647, -2, -1, 0], + }, + { + from: Uint32Array, + to: Uint32Array, + values: [0, 1, 127, 128, 129, 254, 255, 256, 32767, 32768, 32769, 65534, 65535, 65536, 2147483647, 2147483648, 2147483649, 4294967294, 4294967295, 4294967296], + expected: [0, 1, 127, 128, 129, 254, 255, 256, 32767, 32768, 32769, 65534, 65535, 65536, 2147483647, 2147483648, 2147483649, 4294967294, 4294967295, 0], + }, + { + from: Uint32Array, + to: Float32Array, + values: [0, 1, 127, 128, 129, 254, 255, 256, 32767, 32768, 32769, 65534, 65535, 65536, 2147483647, 2147483648, 2147483649, 4294967294, 4294967295, 4294967296], + expected: [0, 1, 127, 128, 129, 254, 255, 256, 32767, 32768, 32769, 65534, 65535, 65536, 2147483648, 2147483648, 2147483648, 4294967296, 4294967296, 0], + }, + { + from: Uint32Array, + to: Float64Array, + values: [0, 1, 127, 128, 129, 254, 255, 256, 32767, 32768, 32769, 65534, 65535, 65536, 2147483647, 2147483648, 2147483649, 4294967294, 4294967295, 4294967296], + expected: [0, 1, 127, 128, 129, 254, 255, 256, 32767, 32768, 32769, 65534, 65535, 65536, 2147483647, 2147483648, 2147483649, 4294967294, 4294967295, 0], + }, + + /* Float32Array */ + { + from: Float32Array, + to: Int8Array, + values: [-Infinity, -2147483649, -2147483648, -2147483647, -32769, -32768, -32767, -129, -128, -127, -1.6, -1.5, -1.4, -1, -0, 0, 1, 1.4, 1.5, 1.6, 127, 128, 129, 32767, 32768, 32769, 2147483647, 2147483648, 2147483649, Infinity, NaN], + expected: [0, 0, 0, 0, -1, 0, 1, 127, -128, -127, -1, -1, -1, -1, 0, 0, 1, 1, 1, 1, 127, -128, -127, -1, 0, 1, 0, 0, 0, 0, 0], + }, + { + from: Float32Array, + to: Uint8Array, + values: [-Infinity, -2147483649, -2147483648, -2147483647, -32769, -32768, -32767, -129, -128, -127, -1.6, -1.5, -1.4, -1, -0, 0, 1, 1.4, 1.5, 1.6, 127, 128, 129, 32767, 32768, 32769, 2147483647, 2147483648, 2147483649, Infinity, NaN], + expected: [0, 0, 0, 0, 255, 0, 1, 127, 128, 129, 255, 255, 255, 255, 0, 0, 1, 1, 1, 1, 127, 128, 129, 255, 0, 1, 0, 0, 0, 0, 0], + }, + { + from: Float32Array, + to: Uint8ClampedArray, + values: [-Infinity, -2147483649, -2147483648, -2147483647, -32769, -32768, -32767, -129, -128, -127, -1.6, -1.5, -1.4, -1, -0, 0, 1, 1.4, 1.5, 1.6, 127, 128, 129, 32767, 32768, 32769, 2147483647, 2147483648, 2147483649, Infinity, NaN], + expected: [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 2, 127, 128, 129, 255, 255, 255, 255, 255, 255, 255, 0], + }, + { + from: Float32Array, + to: Int16Array, + values: [-Infinity, -2147483649, -2147483648, -2147483647, -32769, -32768, -32767, -129, -128, -127, -1.6, -1.5, -1.4, -1, -0, 0, 1, 1.4, 1.5, 1.6, 127, 128, 129, 32767, 32768, 32769, 2147483647, 2147483648, 2147483649, Infinity, NaN], + expected: [0, 0, 0, 0, 32767, -32768, -32767, -129, -128, -127, -1, -1, -1, -1, 0, 0, 1, 1, 1, 1, 127, 128, 129, 32767, -32768, -32767, 0, 0, 0, 0, 0], + }, + { + from: Float32Array, + to: Uint16Array, + values: [-Infinity, -2147483649, -2147483648, -2147483647, -32769, -32768, -32767, -129, -128, -127, -1.6, -1.5, -1.4, -1, -0, 0, 1, 1.4, 1.5, 1.6, 127, 128, 129, 32767, 32768, 32769, 2147483647, 2147483648, 2147483649, Infinity, NaN], + expected: [0, 0, 0, 0, 32767, 32768, 32769, 65407, 65408, 65409, 65535, 65535, 65535, 65535, 0, 0, 1, 1, 1, 1, 127, 128, 129, 32767, 32768, 32769, 0, 0, 0, 0, 0], + }, + { + from: Float32Array, + to: Int32Array, + values: [-Infinity, -2147483649, -2147483648, -2147483647, -32769, -32768, -32767, -129, -128, -127, -1.6, -1.5, -1.4, -1, -0, 0, 1, 1.4, 1.5, 1.6, 127, 128, 129, 32767, 32768, 32769, 2147483647, 2147483648, 2147483649, Infinity, NaN], + expected: [0, -2147483648, -2147483648, -2147483648, -32769, -32768, -32767, -129, -128, -127, -1, -1, -1, -1, 0, 0, 1, 1, 1, 1, 127, 128, 129, 32767, 32768, 32769, -2147483648, -2147483648, -2147483648, 0, 0], + }, + { + from: Float32Array, + to: Uint32Array, + values: [-Infinity, -2147483649, -2147483648, -2147483647, -32769, -32768, -32767, -129, -128, -127, -1.6, -1.5, -1.4, -1, -0, 0, 1, 1.4, 1.5, 1.6, 127, 128, 129, 32767, 32768, 32769, 2147483647, 2147483648, 2147483649, Infinity, NaN], + expected: [0, 2147483648, 2147483648, 2147483648, 4294934527, 4294934528, 4294934529, 4294967167, 4294967168, 4294967169, 4294967295, 4294967295, 4294967295, 4294967295, 0, 0, 1, 1, 1, 1, 127, 128, 129, 32767, 32768, 32769, 2147483648, 2147483648, 2147483648, 0, 0], + }, + { + from: Float32Array, + to: Float32Array, + values: [-Infinity, -2147483649, -2147483648, -2147483647, -32769, -32768, -32767, -129, -128, -127, -1.6, -1.5, -1.4, -1, -0, 0, 1, 1.4, 1.5, 1.6, 127, 128, 129, 32767, 32768, 32769, 2147483647, 2147483648, 2147483649, Infinity, NaN], + expected: [-Infinity, -2147483648, -2147483648, -2147483648, -32769, -32768, -32767, -129, -128, -127, -1.600000023841858, -1.5, -1.399999976158142, -1, -0, 0, 1, 1.399999976158142, 1.5, 1.600000023841858, 127, 128, 129, 32767, 32768, 32769, 2147483648, 2147483648, 2147483648, Infinity, NaN], + }, + { + from: Float32Array, + to: Float64Array, + values: [-Infinity, -2147483649, -2147483648, -2147483647, -32769, -32768, -32767, -129, -128, -127, -1.6, -1.5, -1.4, -1, -0, 0, 1, 1.4, 1.5, 1.6, 127, 128, 129, 32767, 32768, 32769, 2147483647, 2147483648, 2147483649, Infinity, NaN], + expected: [-Infinity, -2147483648, -2147483648, -2147483648, -32769, -32768, -32767, -129, -128, -127, -1.600000023841858, -1.5, -1.399999976158142, -1, -0, 0, 1, 1.399999976158142, 1.5, 1.600000023841858, 127, 128, 129, 32767, 32768, 32769, 2147483648, 2147483648, 2147483648, Infinity, NaN], + }, + + /* Float64Array */ + { + from: Float64Array, + to: Int8Array, + values: [-Infinity, -2147483649, -2147483648, -2147483647, -32769, -32768, -32767, -129, -128, -127, -1.6, -1.5, -1.4, -1, -0, 0, 1, 1.4, 1.5, 1.6, 127, 128, 129, 32767, 32768, 32769, 2147483647, 2147483648, 2147483649, Infinity, NaN], + expected: [0, -1, 0, 1, -1, 0, 1, 127, -128, -127, -1, -1, -1, -1, 0, 0, 1, 1, 1, 1, 127, -128, -127, -1, 0, 1, -1, 0, 1, 0, 0], + }, + { + from: Float64Array, + to: Uint8Array, + values: [-Infinity, -2147483649, -2147483648, -2147483647, -32769, -32768, -32767, -129, -128, -127, -1.6, -1.5, -1.4, -1, -0, 0, 1, 1.4, 1.5, 1.6, 127, 128, 129, 32767, 32768, 32769, 2147483647, 2147483648, 2147483649, Infinity, NaN], + expected: [0, 255, 0, 1, 255, 0, 1, 127, 128, 129, 255, 255, 255, 255, 0, 0, 1, 1, 1, 1, 127, 128, 129, 255, 0, 1, 255, 0, 1, 0, 0], + }, + { + from: Float64Array, + to: Uint8ClampedArray, + values: [-Infinity, -2147483649, -2147483648, -2147483647, -32769, -32768, -32767, -129, -128, -127, -1.6, -1.5, -1.4, -1, -0, 0, 1, 1.4, 1.5, 1.6, 127, 128, 129, 32767, 32768, 32769, 2147483647, 2147483648, 2147483649, Infinity, NaN], + expected: [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 2, 127, 128, 129, 255, 255, 255, 255, 255, 255, 255, 0], + }, + { + from: Float64Array, + to: Int16Array, + values: [-Infinity, -2147483649, -2147483648, -2147483647, -32769, -32768, -32767, -129, -128, -127, -1.6, -1.5, -1.4, -1, -0, 0, 1, 1.4, 1.5, 1.6, 127, 128, 129, 32767, 32768, 32769, 2147483647, 2147483648, 2147483649, Infinity, NaN], + expected: [0, -1, 0, 1, 32767, -32768, -32767, -129, -128, -127, -1, -1, -1, -1, 0, 0, 1, 1, 1, 1, 127, 128, 129, 32767, -32768, -32767, -1, 0, 1, 0, 0], + }, + { + from: Float64Array, + to: Uint16Array, + values: [-Infinity, -2147483649, -2147483648, -2147483647, -32769, -32768, -32767, -129, -128, -127, -1.6, -1.5, -1.4, -1, -0, 0, 1, 1.4, 1.5, 1.6, 127, 128, 129, 32767, 32768, 32769, 2147483647, 2147483648, 2147483649, Infinity, NaN], + expected: [0, 65535, 0, 1, 32767, 32768, 32769, 65407, 65408, 65409, 65535, 65535, 65535, 65535, 0, 0, 1, 1, 1, 1, 127, 128, 129, 32767, 32768, 32769, 65535, 0, 1, 0, 0], + }, + { + from: Float64Array, + to: Int32Array, + values: [-Infinity, -2147483649, -2147483648, -2147483647, -32769, -32768, -32767, -129, -128, -127, -1.6, -1.5, -1.4, -1, -0, 0, 1, 1.4, 1.5, 1.6, 127, 128, 129, 32767, 32768, 32769, 2147483647, 2147483648, 2147483649, Infinity, NaN], + expected: [0, 2147483647, -2147483648, -2147483647, -32769, -32768, -32767, -129, -128, -127, -1, -1, -1, -1, 0, 0, 1, 1, 1, 1, 127, 128, 129, 32767, 32768, 32769, 2147483647, -2147483648, -2147483647, 0, 0], + }, + { + from: Float64Array, + to: Uint32Array, + values: [-Infinity, -2147483649, -2147483648, -2147483647, -32769, -32768, -32767, -129, -128, -127, -1.6, -1.5, -1.4, -1, -0, 0, 1, 1.4, 1.5, 1.6, 127, 128, 129, 32767, 32768, 32769, 2147483647, 2147483648, 2147483649, Infinity, NaN], + expected: [0, 2147483647, 2147483648, 2147483649, 4294934527, 4294934528, 4294934529, 4294967167, 4294967168, 4294967169, 4294967295, 4294967295, 4294967295, 4294967295, 0, 0, 1, 1, 1, 1, 127, 128, 129, 32767, 32768, 32769, 2147483647, 2147483648, 2147483649, 0, 0], + }, + { + from: Float64Array, + to: Float32Array, + values: [-Infinity, -2147483649, -2147483648, -2147483647, -32769, -32768, -32767, -129, -128, -127, -1.6, -1.5, -1.4, -1, -0, 0, 1, 1.4, 1.5, 1.6, 127, 128, 129, 32767, 32768, 32769, 2147483647, 2147483648, 2147483649, Infinity, NaN], + expected: [-Infinity, -2147483648, -2147483648, -2147483648, -32769, -32768, -32767, -129, -128, -127, -1.600000023841858, -1.5, -1.399999976158142, -1, -0, 0, 1, 1.399999976158142, 1.5, 1.600000023841858, 127, 128, 129, 32767, 32768, 32769, 2147483648, 2147483648, 2147483648, Infinity, NaN], + }, + { + from: Float64Array, + to: Float64Array, + values: [-Infinity, -2147483649, -2147483648, -2147483647, -32769, -32768, -32767, -129, -128, -127, -1.6, -1.5, -1.4, -1, -0, 0, 1, 1.4, 1.5, 1.6, 127, 128, 129, 32767, 32768, 32769, 2147483647, 2147483648, 2147483649, Infinity, NaN], + expected: [-Infinity, -2147483649, -2147483648, -2147483647, -32769, -32768, -32767, -129, -128, -127, -1.6, -1.5, -1.4, -1, -0, 0, 1, 1.4, 1.5, 1.6, 127, 128, 129, 32767, 32768, 32769, 2147483647, 2147483648, 2147483649, Infinity, NaN], + }, +]; + +for (let {from, to, values, expected} of tests) { + let ta = new from(values); + ta.constructor = to; + assert.compareArray(ta.slice(0), expected, `${from.name} -> ${to.name}`); +} + diff --git a/test/staging/sm/TypedArray/slice-detached.js b/test/staging/sm/TypedArray/slice-detached.js new file mode 100644 index 0000000000..b132f62af0 --- /dev/null +++ b/test/staging/sm/TypedArray/slice-detached.js @@ -0,0 +1,112 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-TypedArray-shell.js, sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +// Tests for detached ArrayBuffer checks in %TypedArray%.prototype.slice ( start, end ). + +function* createTypedArrays(lengths = [0, 1, 4, 4096]) { + // Test with eagerly created ArrayBuffer. + for (let length of lengths) { + let buffer = new ArrayBuffer(length * Int32Array.BYTES_PER_ELEMENT); + let typedArray = new Int32Array(buffer); + + yield {typedArray, length, buffer() { return buffer; }}; + } + + // Test with lazily created ArrayBuffer. + for (let length of lengths) { + let typedArray = new Int32Array(length); + + yield {typedArray, length, buffer() { return typedArray.buffer; }}; + } +} + +if (typeof $262.detachArrayBuffer === "function") { + // ArrayBuffer is detached when entering slice(). + for (let {typedArray, buffer} of createTypedArrays()) { + $262.detachArrayBuffer(buffer()); + assertThrowsInstanceOf(() => { + typedArray.slice(0); + }, TypeError, "ArrayBuffer is detached on function entry"); + } + + // ArrayBuffer is detached when computing ToInteger(start). + for (let {typedArray, length, buffer} of createTypedArrays()) { + let detached = false; + let start = { + valueOf() { + assert.sameValue(detached, false); + $262.detachArrayBuffer(buffer()); + assert.sameValue(detached, false); + detached = true; + return 0; + } + }; + + // Doesn't throw an error when no bytes are copied. + if (length === 0) { + typedArray.slice(start); + } else { + assertThrowsInstanceOf(() => { + typedArray.slice(start); + }, TypeError, "ArrayBuffer is detached in ToInteger(start)"); + } + assert.sameValue(detached, true, "$262.detachArrayBuffer was called"); + } + + // ArrayBuffer is detached when computing ToInteger(end). + for (let {typedArray, length, buffer} of createTypedArrays()) { + let detached = false; + let end = { + valueOf() { + assert.sameValue(detached, false); + $262.detachArrayBuffer(buffer()); + assert.sameValue(detached, false); + detached = true; + return length; + } + }; + + // Doesn't throw an error when no bytes are copied. + if (length === 0) { + typedArray.slice(0, end); + } else { + assertThrowsInstanceOf(() => { + typedArray.slice(0, end); + }, TypeError, "ArrayBuffer is detached in ToInteger(end)"); + } + assert.sameValue(detached, true, "$262.detachArrayBuffer was called"); + } + + // ArrayBuffer is detached in species constructor. + for (let {typedArray, length, buffer} of createTypedArrays()) { + let detached = false; + typedArray.constructor = { + [Symbol.species]: function(...args) { + assert.sameValue(detached, false); + $262.detachArrayBuffer(buffer()); + assert.sameValue(detached, false); + detached = true; + return new Int32Array(...args); + } + }; + + // Doesn't throw an error when no bytes are copied. + if (length === 0) { + typedArray.slice(0); + } else { + assertThrowsInstanceOf(() => { + typedArray.slice(0); + }, TypeError, "ArrayBuffer is detached in TypedArraySpeciesCreate(...)"); + } + assert.sameValue(detached, true, "$262.detachArrayBuffer was called"); + } +} + diff --git a/test/staging/sm/TypedArray/slice-memcpy.js b/test/staging/sm/TypedArray/slice-memcpy.js new file mode 100644 index 0000000000..55bbb6ab5b --- /dev/null +++ b/test/staging/sm/TypedArray/slice-memcpy.js @@ -0,0 +1,93 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [compareArray.js, sm/non262-TypedArray-shell.js, sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +const otherGlobal = createNewGlobal(); + +// Create with new ArrayBuffer and offset. +for (var constructor of typedArrayConstructors) { + const elementSize = constructor.BYTES_PER_ELEMENT; + let ab = new constructor(10).map((v, i) => i).buffer; + let ta = new constructor(ab, 2 * elementSize, 6); + ta.constructor = { + [Symbol.species]: function(len) { + return new constructor(new ArrayBuffer((len + 4) * elementSize), 4 * elementSize); + } + }; + let tb = ta.slice(0); + + assert.compareArray(ta, [2, 3, 4, 5, 6, 7]); + assert.compareArray(tb, [2, 3, 4, 5, 6, 7]); +} + +// Source and target arrays use the same ArrayBuffer, target range before source range. +for (var constructor of typedArrayConstructors) { + const elementSize = constructor.BYTES_PER_ELEMENT; + let ab = new constructor(10).map((v, i) => i).buffer; + let ta = new constructor(ab, 2 * elementSize, 6); + ta.constructor = { + [Symbol.species]: function(len) { + return new constructor(ab, 0, len); + } + }; + let tb = ta.slice(0); + + assert.compareArray(ta, [4, 5, 6, 7, 6, 7]); + assert.compareArray(tb, [2, 3, 4, 5, 6, 7]); + assert.compareArray(new constructor(ab), [2, 3, 4, 5, 6, 7, 6, 7, 8, 9]); +} + +// Source and target arrays use the same ArrayBuffer, target range after source range. +for (var constructor of typedArrayConstructors) { + const elementSize = constructor.BYTES_PER_ELEMENT; + let ab = new constructor(10).map((v, i) => i + 1).buffer; + let ta = new constructor(ab, 0, 6); + ta.constructor = { + [Symbol.species]: function(len) { + return new constructor(ab, 2 * elementSize, len); + } + }; + let tb = ta.slice(0); + + assert.compareArray(ta, [1, 2, 1, 2, 1, 2]); + assert.compareArray(tb, [1, 2, 1, 2, 1, 2]); + assert.compareArray(new constructor(ab), [1, 2, 1, 2, 1, 2, 1, 2, 9, 10]); +} + +// Tricky: Same as above, but with SharedArrayBuffer and different compartments. +if (this.setSharedObject && this.SharedArrayBuffer) { + for (var constructor of typedArrayConstructors) { + const elementSize = constructor.BYTES_PER_ELEMENT; + let ts = new constructor(new SharedArrayBuffer(10 * elementSize)); + for (let i = 0; i < ts.length; i++) { + ts[i] = i + 1; + } + let ab = ts.buffer; + let ta = new constructor(ab, 0, 6); + ta.constructor = { + [Symbol.species]: function(len) { + setSharedObject(ab); + try { + return otherGlobal.eval(` + new ${constructor.name}(getSharedObject(), ${2 * elementSize}, ${len}); + `); + } finally { + setSharedObject(null); + } + } + }; + let tb = ta.slice(0); + + assert.compareArray(ta, [1, 2, 1, 2, 1, 2]); + assert.compareArray(tb, [1, 2, 1, 2, 1, 2]); + assert.compareArray(new constructor(ab), [1, 2, 1, 2, 1, 2, 1, 2, 9, 10]); + } +} + diff --git a/test/staging/sm/TypedArray/slice-species.js b/test/staging/sm/TypedArray/slice-species.js new file mode 100644 index 0000000000..7f460325d4 --- /dev/null +++ b/test/staging/sm/TypedArray/slice-species.js @@ -0,0 +1,58 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [deepEqual.js, sm/non262-TypedArray-shell.js, sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +for (var constructor of typedArrayConstructors) { + // Basic tests for our SpeciesConstructor implementation. + var undefConstructor = new constructor(2); + undefConstructor.constructor = undefined; + assert.deepEqual(undefConstructor.slice(1), new constructor(1)); + + assertThrowsInstanceOf(() => { + var strConstructor = new constructor; + strConstructor.constructor = "not a constructor"; + strConstructor.slice(123); + }, TypeError, "Assert that we have an invalid constructor"); + + // If obj.constructor[@@species] is undefined or null then the default + // constructor is used. + var mathConstructor = new constructor(8); + mathConstructor.constructor = Math.sin; + assert.deepEqual(mathConstructor.slice(4), new constructor(4)); + + var undefSpecies = new constructor(2); + undefSpecies.constructor = { [Symbol.species]: undefined }; + assert.deepEqual(undefSpecies.slice(1), new constructor(1)); + + var nullSpecies = new constructor(2); + nullSpecies.constructor = { [Symbol.species]: null }; + assert.deepEqual(nullSpecies.slice(1), new constructor(1)); + + // If obj.constructor[@@species] is different constructor, it should be + // used. + for (var constructor2 of typedArrayConstructors) { + var modifiedConstructor = new constructor(2); + modifiedConstructor.constructor = constructor2; + assert.deepEqual(modifiedConstructor.slice(1), new constructor2(1)); + + var modifiedSpecies = new constructor(2); + modifiedSpecies.constructor = { [Symbol.species]: constructor2 }; + assert.deepEqual(modifiedSpecies.slice(1), new constructor2(1)); + } + + // If obj.constructor[@@species] is neither undefined nor null, and it's + // not a constructor, TypeError should be thrown. + assertThrowsInstanceOf(() => { + var strSpecies = new constructor; + strSpecies.constructor = { [Symbol.species]: "not a constructor" }; + strSpecies.slice(123); + }, TypeError); +} + diff --git a/test/staging/sm/TypedArray/slice.js b/test/staging/sm/TypedArray/slice.js new file mode 100644 index 0000000000..56a3c6a0aa --- /dev/null +++ b/test/staging/sm/TypedArray/slice.js @@ -0,0 +1,53 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [compareArray.js, sm/non262-TypedArray-shell.js, sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +for (var constructor of anyTypedArrayConstructors) { + assert.sameValue(constructor.prototype.slice.length, 2); + + assert.compareArray(new constructor().slice(0), new constructor()); + assert.compareArray(new constructor().slice(0, 4), new constructor()); + assert.compareArray(new constructor(10).slice(0, 2), new constructor(2)); + + assert.compareArray(new constructor([1, 2]).slice(1), new constructor([2])); + assert.compareArray(new constructor([1, 2]).slice(0), new constructor([1, 2])); + assert.compareArray(new constructor([1, 2, 3]).slice(-1), new constructor([3])); + assert.compareArray(new constructor([1, 2, 3, 4]).slice(-3, -1), new constructor([2, 3])); + assert.compareArray(new constructor([.1, .2]).slice(0), new constructor([.1, .2])); + + assert.compareArray(new constructor([1, 2]).slice(-3), new constructor([1, 2])); + assert.compareArray(new constructor([1, 2]).slice(0, -3), new constructor()); + assert.compareArray(new constructor([1, 2]).slice(4), new constructor()); + assert.compareArray(new constructor([1, 2]).slice(1, 5), new constructor([2])); + + // Called from other globals. + if (typeof createNewGlobal === "function") { + var slice = createNewGlobal()[constructor.name].prototype.slice; + assert.compareArray(slice.call(new constructor([3, 2, 1]), 1), + new constructor([2, 1])); + } + + // Throws if `this` isn't a TypedArray. + var invalidReceivers = [undefined, null, 1, false, "", Symbol(), [], {}, /./, + new Proxy(new constructor(), {})]; + invalidReceivers.forEach(invalidReceiver => { + assertThrowsInstanceOf(() => { + constructor.prototype.slice.call(invalidReceiver, 0); + }, TypeError, "Assert that slice fails if this value is not a TypedArray"); + }); + + // Test that the length getter is never called. + Object.defineProperty(new constructor([1, 2, 3]), "length", { + get() { + throw new Error("length accessor called"); + } + }).slice(2); +} + diff --git a/test/staging/sm/TypedArray/sort-negative-nan.js b/test/staging/sm/TypedArray/sort-negative-nan.js new file mode 100644 index 0000000000..a29a324088 --- /dev/null +++ b/test/staging/sm/TypedArray/sort-negative-nan.js @@ -0,0 +1,141 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-TypedArray-shell.js, sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +// Test with all floating point typed arrays. +const floatConstructors = anyTypedArrayConstructors.filter(isFloatConstructor); + +// Also test with cross-compartment wrapped typed arrays. +if (typeof createNewGlobal === "function") { + const otherGlobal = createNewGlobal(); + floatConstructors.push(otherGlobal.Float16Array); + floatConstructors.push(otherGlobal.Float32Array); + floatConstructors.push(otherGlobal.Float64Array); +} + +function* prod(xs, ys) { + for (let x of xs) { + for (let y of ys) { + yield [x, y]; + } + } +} + +const isLittleEndian = new Uint8Array(new Uint16Array([1]).buffer)[0] !== 0; + +function seti16(i16, i, v) { + i16[i] = v; +} + +function seti32(i16, i, [hi, lo]) { + i16[i * 2 + isLittleEndian] = hi; + i16[i * 2 + !isLittleEndian] = lo; +} + +function seti64(i16, i, [hi, hiMid, loMid, lo]) { + if (isLittleEndian) { + i16[i * 4] = lo; + i16[i * 4 + 1] = loMid; + i16[i * 4 + 2] = hiMid; + i16[i * 4 + 3] = hi; + } else { + i16[i * 4 + 3] = lo; + i16[i * 4 + 2] = loMid; + i16[i * 4 + 1] = hiMid; + i16[i * 4] = hi; + } +} + +const setInt = { + Float16: seti16, + Float32: seti32, + Float64: seti64, +}; + +const NaNs = { + Float16: [ + 0x7C01|0, // smallest SNaN + 0x7DFF|0, // largest SNaN + 0x7E01|0, // smallest QNaN + 0x7FFF|0, // largest QNaN + 0xFC01|0, // smallest SNaN, sign-bit set + 0xFDFF|0, // largest SNaN, sign-bit set + 0xFE01|0, // smallest QNaN, sign-bit set + 0xFFFF|0, // largest QNaN, sign-bit set + ], + Float32: [ + [0x7F80|0, 0x0001|0], // smallest SNaN + [0x7FBF|0, 0xFFFF|0], // largest SNaN + [0x7FC0|0, 0x0000|0], // smallest QNaN + [0x7FFF|0, 0xFFFF|0], // largest QNaN + [0xFF80|0, 0x0001|0], // smallest SNaN, sign-bit set + [0xFFBF|0, 0xFFFF|0], // largest SNaN, sign-bit set + [0xFFC0|0, 0x0000|0], // smallest QNaN, sign-bit set + [0xFFFF|0, 0xFFFF|0], // largest QNaN, sign-bit set + ], + Float64: [ + [0x7FF0|0, 0x0000|0, 0x0000|0, 0x0001|0], // smallest SNaN + [0x7FF7|0, 0xFFFF|0, 0xFFFF|0, 0xFFFF|0], // largest SNaN + [0x7FF8|0, 0x0000|0, 0x0000|0, 0x0000|0], // smallest QNaN + [0x7FFF|0, 0xFFFF|0, 0xFFFF|0, 0xFFFF|0], // largest QNaN + [0xFFF0|0, 0x0000|0, 0x0000|0, 0x0001|0], // smallest SNaN, sign-bit set + [0xFFF7|0, 0xFFFF|0, 0xFFFF|0, 0xFFFF|0], // largest SNaN, sign-bit set + [0xFFF8|0, 0x0000|0, 0x0000|0, 0x0000|0], // smallest QNaN, sign-bit set + [0xFFFF|0, 0xFFFF|0, 0xFFFF|0, 0xFFFF|0], // largest QNaN, sign-bit set + ], +}; + +// %TypedArray%.prototype.sort +const TypedArraySort = Int32Array.prototype.sort; + +// Test with small and large typed arrays. +const typedArrayLengths = [16, 4096]; + +for (const [TA, taLength] of prod(floatConstructors, typedArrayLengths)) { + let type = TA.name.slice(0, -"Array".length); + let nansLength = NaNs[type].length; + let fta = new TA(taLength); + let i16 = new Int16Array(fta.buffer); + + // Add NaNs in various representations at the start of the typed array. + for (let i = 0; i < nansLength; ++i) { + setInt[type](i16, i, NaNs[type][i]); + } + + // Also add two non-NaN values for testing. + fta[nansLength] = 123; + fta[nansLength + 1] = -456; + + // Sort the array and validate sort() sorted all elements correctly. + TypedArraySort.call(fta); + + // |-456| should be sorted to the start. + assert.sameValue(fta[0], -456); + + // Followed by a bunch of zeros, + const zeroOffset = 1; + const zeroCount = taLength - nansLength - 2; + for (let i = 0; i < zeroCount; ++i) { + assert.sameValue(fta[zeroOffset + i], 0, `At offset: ${zeroOffset + i}`); + } + + // and then |123|. + assert.sameValue(fta[zeroOffset + zeroCount], 123); + + // And finally the NaNs. + const nanOffset = zeroCount + 2; + for (let i = 0; i < nansLength; ++i) { + // We don't assert a specific NaN value is present, because this is + // not required by the spec and we don't provide any guarantees NaN + // values are either unchanged or canonicalized in sort(). + assert.sameValue(fta[nanOffset + i], NaN, `At offset: ${nanOffset + i}`); + } +} + diff --git a/test/staging/sm/TypedArray/sort-non-function.js b/test/staging/sm/TypedArray/sort-non-function.js new file mode 100644 index 0000000000..74953d1bde --- /dev/null +++ b/test/staging/sm/TypedArray/sort-non-function.js @@ -0,0 +1,31 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-TypedArray-shell.js, sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +// %TypedArray%.prototype.sort throws if the comparator is neither undefined nor +// a callable object. + +// Use a zero length typed array, so we can provide any kind of callable object +// without worrying that the function is actually a valid comparator function. +const typedArray = new Int32Array(0); + +// Throws if the comparator is neither undefined nor callable. +for (let invalidComparator of [null, 0, true, Symbol(), {}, []]) { + assertThrowsInstanceOf(() => typedArray.sort(invalidComparator), TypeError); +} + +// Doesn't throw if the comparator is undefined or a callable object. +for (let validComparator of [undefined, () => {}, Math.max, class {}, new Proxy(function(){}, {})]) { + typedArray.sort(validComparator); +} + +// Also doesn't throw if no comparator was provided at all. +typedArray.sort(); + diff --git a/test/staging/sm/TypedArray/sort_byteoffset.js b/test/staging/sm/TypedArray/sort_byteoffset.js new file mode 100644 index 0000000000..cfa4e191f8 --- /dev/null +++ b/test/staging/sm/TypedArray/sort_byteoffset.js @@ -0,0 +1,39 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-TypedArray-shell.js, sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +// Ensure that when sorting TypedArrays we don't +// ignore byte offsets (bug 1290579). + +var sortFunctions = [Int32Array.prototype.sort]; + +// Also test with cross-compartment wrapped typed arrays. +if (typeof createNewGlobal === "function") { + var otherGlobal = createNewGlobal(); + sortFunctions.push(createNewGlobal().Int32Array.prototype.sort); +} + +// The bug manifests itself only with Float arrays, +// but checking everything here just for sanity. + +for (var ctor of anyTypedArrayConstructors) { + var ab = new ArrayBuffer(1025 * ctor.BYTES_PER_ELEMENT); + var ta = new ctor(ab, ctor.BYTES_PER_ELEMENT, 1024); + + // |testArray[0]| shouldn't be modified when sort() is called below. + var testArray = new ctor(ab, 0, 1); + testArray[0] = 1; + + for (var sortFn of sortFunctions) { + sortFn.call(ta); + assert.sameValue(testArray[0], 1); + } +} + diff --git a/test/staging/sm/TypedArray/sort_comparators.js b/test/staging/sm/TypedArray/sort_comparators.js new file mode 100644 index 0000000000..c4e0afd064 --- /dev/null +++ b/test/staging/sm/TypedArray/sort_comparators.js @@ -0,0 +1,41 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-TypedArray-shell.js, sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +// Ensure that sorts finish even if a comparator adds items +// Note: the array is not expected to be properly sorted. +let outsideArray = new Int32Array([1, 99, 2]); +function addingComparator(x, y) { + if (x == 99 || y == 99) { + outsideArray[0] = 101; + outsideArray[outsideArray.length - 1] = 102; + } + return x - y; +} +outsideArray.sort(addingComparator); +assert.sameValue(outsideArray.every(x => [1, 2, 99, 101, 102].includes(x)), true); + +// Ensure that sorts finish even if a comparator calls sort again +// Note: the array is not expected to be properly sorted. +outsideArray = new Int32Array([1, 99, 2]); +function recursiveComparator(x, y) { + outsideArray.sort(); + return x - y; +} +outsideArray.sort(recursiveComparator); +assert.sameValue(outsideArray.every(x => outsideArray.includes(x)), true) + +// Ensure that NaN's returned from custom comparators behave as / are converted +// to +0s. +let nanComparatorData = [2112, 42, 1111, 34]; +let nanComparatorArray = new Int32Array(nanComparatorData); +nanComparatorArray.sort((x, y) => NaN); +assert.sameValue(nanComparatorData.every(x => nanComparatorArray.includes(x)), true); + diff --git a/test/staging/sm/TypedArray/sort_compare_nan.js b/test/staging/sm/TypedArray/sort_compare_nan.js new file mode 100644 index 0000000000..5d68c451c1 --- /dev/null +++ b/test/staging/sm/TypedArray/sort_compare_nan.js @@ -0,0 +1,21 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-TypedArray-shell.js, sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +// Returning zero from the sort comparator... +let ta = new Int32Array([0, 1]).sort(() => 0); +assert.sameValue(ta[0], 0); +assert.sameValue(ta[1], 1); + +// ... should give the same result as returning NaN. +let tb = new Int32Array([0, 1]).sort(() => NaN); +assert.sameValue(tb[0], 0); +assert.sameValue(tb[1], 1); + diff --git a/test/staging/sm/TypedArray/sort_errors.js b/test/staging/sm/TypedArray/sort_errors.js new file mode 100644 index 0000000000..559b9ba91c --- /dev/null +++ b/test/staging/sm/TypedArray/sort_errors.js @@ -0,0 +1,96 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-TypedArray-shell.js, sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +// Ensure that TypedArrays throw when attempting to sort a detached ArrayBuffer +if (typeof $262.detachArrayBuffer === "function") { + assertThrowsInstanceOf(() => { + let buffer = new ArrayBuffer(32); + let array = new Int32Array(buffer); + $262.detachArrayBuffer(buffer); + array.sort(); + }, TypeError); +} + +// Ensure detaching buffer in comparator doesn't throw an error. +if (typeof $262.detachArrayBuffer === "function") { + let detached = false; + let ta = new Int32Array(3); + ta.sort(function(a, b) { + if (!detached) { + detached = true; + $262.detachArrayBuffer(ta.buffer); + } + return a - b; + }); + assert.sameValue(detached, true); +} + +// Ensure detachment check doesn't choke on wrapped typed array. +if (typeof createNewGlobal === "function") { + let ta = new Int32Array(3); + let otherGlobal = createNewGlobal(); + otherGlobal.Int32Array.prototype.sort.call(ta, function(a, b) { + return a - b; + }); +} + +// Ensure detaching buffer in comparator doesn't throw an error when the typed array is wrapped. +if (typeof createNewGlobal === "function" && typeof $262.detachArrayBuffer === "function") { + let detached = false; + let ta = new Int32Array(3); + let otherGlobal = createNewGlobal(); + otherGlobal.Int32Array.prototype.sort.call(ta, function(a,b) { + if (!detached) { + detached = true; + $262.detachArrayBuffer(ta.buffer); + } + return a - b; + }); + assert.sameValue(detached, true); +} + +// Ensure that TypedArray.prototype.sort will not sort non-TypedArrays +assertThrowsInstanceOf(() => { + let array = [4, 3, 2, 1]; + Int32Array.prototype.sort.call(array); +}, TypeError); + +assertThrowsInstanceOf(() => { + Int32Array.prototype.sort.call({a: 1, b: 2}); +}, TypeError); + +assertThrowsInstanceOf(() => { + Int32Array.prototype.sort.call(Int32Array.prototype); +}, TypeError); + +assertThrowsInstanceOf(() => { + let buf = new ArrayBuffer(32); + Int32Array.prototype.sort.call(buf); +}, TypeError); + +// Ensure that comparator errors are propagataed +function badComparator(x, y) { + if (x == 99 && y == 99) + throw new TypeError; + return x - y; +} + +assertThrowsInstanceOf(() => { + let array = new Uint8Array([99, 99, 99, 99]); + array.sort(badComparator); +}, TypeError); + +assertThrowsInstanceOf(() => { + let array = new Uint8Array([1, 99, 2, 99]); + array.sort(badComparator); +}, TypeError); + + diff --git a/test/staging/sm/TypedArray/sort_globals.js b/test/staging/sm/TypedArray/sort_globals.js new file mode 100644 index 0000000000..963da895a8 --- /dev/null +++ b/test/staging/sm/TypedArray/sort_globals.js @@ -0,0 +1,18 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [compareArray.js, sm/non262-TypedArray-shell.js, sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +// TypedArray.prototype.sort should work across globals +let g2 = createNewGlobal(); +assert.compareArray( + Int32Array.prototype.sort.call(new g2.Int32Array([3, 2, 1])), + new Int32Array([1, 2, 3]) +); + diff --git a/test/staging/sm/TypedArray/sort_large_countingsort.js b/test/staging/sm/TypedArray/sort_large_countingsort.js new file mode 100644 index 0000000000..b0b1b79d75 --- /dev/null +++ b/test/staging/sm/TypedArray/sort_large_countingsort.js @@ -0,0 +1,59 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-TypedArray-shell.js, sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +// Counting sort instead of radix sort is only used for large two-byte typed arrays. +const TwoByteTypedArrays = anyTypedArrayConstructors.filter(ta => ta.BYTES_PER_ELEMENT === 2); + +// The typed array must be large enough to prefer counting sort instead of +// radix sort. +// +// The exact condition is: 65536 * (sizeof(size_t) / sizeof(T)) - constant. +// +// Where `sizeof(T) == 2` and `sizeof(size_t)` is either 4 (32-bit) or 8 (64-bit). +// Use `sizeof(size_t) == 8` which works on both 32- and 64-bit targets. +const LARGE_LENGTH = 65536 * 4; + +for (let TA of TwoByteTypedArrays) { + // Create a large enough typed array. + let ta = new TA(LARGE_LENGTH); + + // Fill the typed array with the smallest value depending on its type. + let smallest = isFloatConstructor(TA) ? -Infinity : + isUnsignedConstructor(TA) ? 0 : -32768; + ta.fill(smallest); + + // Write the sample values into the middle of the typed array, so we can + // easily determine if the sort operation worked correctly. + const offset = 100_000; + + // Write all possible values into the array. Use the unsigned representation + // to ensure all possible byte patterns are used. + let unsigned = new Uint16Array(ta.buffer); + for (let i = 0; i < 65536; ++i) { + unsigned[offset + i] = i; + } + + // Sort the typed array. + ta.sort(); + + // The smallest value is moved to the start. These are exactly 1 + 65536 * 3 + // elements. + for (let i = 0; i <= 65536 * 3; ++i) { + assert.sameValue(ta[i], smallest); + } + + // The last 65536 elements are sorted in order. + for (let i = 65536 * 3; i < ta.length - 1; ++i) { + // Not `ta[i] < ta[i + 1]` in order to handle NaN values correctly. + assert.sameValue(!(ta[i] > ta[i + 1]), true); + } +} + diff --git a/test/staging/sm/TypedArray/sort_modifications.js b/test/staging/sm/TypedArray/sort_modifications.js new file mode 100644 index 0000000000..c9c917a1ea --- /dev/null +++ b/test/staging/sm/TypedArray/sort_modifications.js @@ -0,0 +1,82 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-TypedArray-shell.js, sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +const TAConstructors = [ + Int8Array, + Uint8Array, + Int16Array, + Uint16Array, + Int32Array, + Uint32Array, + Uint8ClampedArray, + Float32Array, + Float64Array, + BigInt64Array, + BigUint64Array, +].concat(this.Float16Array ?? []); + +// Use different size classes to catch any implementation-specific +// optimisations. +const sizes = [ + 4, 8, 64, 128, 1024 +]; + +function ToNumeric(TA) { + if (TA === BigInt64Array || TA === BigUint64Array) { + return BigInt; + } + return Number; +} + +function ascending(a, b) { + return a < b ? -1 : a > b ? 1 : 0; +} + +function descending(a, b) { + return -ascending(a, b); +} + +for (let TA of TAConstructors) { + let toNumeric = ToNumeric(TA); + for (let size of sizes) { + let sorted = new TA(size); + + // Fill with |1..size| and then sort to account for wrap-arounds. + for (let i = 0; i < size; ++i) { + sorted[i] = toNumeric(i + 1); + } + sorted.sort(); + + // Create a copy in descending order. + let ta = new TA(sorted); + ta.sort(descending); + + // Sort the copy in ascending order and on the first call reset all + // elements to zero. + let called = false; + ta.sort(function(a, b) { + if (!called) { + called = true; + ta.fill(toNumeric(0)); + } + return ascending(a, b); + }); + + // Ensure the comparator function was called. + assert.sameValue(called, true); + + // All elements should be sorted correctly. No elements should be zero. + for (let i = 0; i < size; ++i) { + assert.sameValue(ta[i], sorted[i], `${TA.name} at index ${i} for size ${size}`); + } + } +} + diff --git a/test/staging/sm/TypedArray/sort_small.js b/test/staging/sm/TypedArray/sort_small.js new file mode 100644 index 0000000000..99e2838830 --- /dev/null +++ b/test/staging/sm/TypedArray/sort_small.js @@ -0,0 +1,51 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [deepEqual.js, sm/non262-TypedArray-shell.js, sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +const testCases = { + // Pre-sorted test data, it's important that these arrays remain in ascending order. + [Int8Array.name]: [[-128, 127]], + [Int16Array.name]: [[-32768, -999, 1942, 32767]], + [Int32Array.name]: [[-2147483648, -320000, -244000, 2147483647]], + [Uint8Array.name]: [[255]], + [Uint16Array.name]: [[0, 65535, 65535]], + [Uint32Array.name]: [[0, 987632, 4294967295]], + [Uint8ClampedArray.name]: [[255]], + + // Test the behavior in the default comparator as described in 22.2.3.26. + // The spec boils down to, -0s come before +0s, and NaNs always come last. + // Float Arrays are used because all other types convert -0 and NaN to +0. + [Float16Array.name]: [ + [-2147483647, -2147483646.99, -0, 0, 2147483646.99, NaN], + [1/undefined, NaN, Number.NaN] + ], + [Float32Array.name]: [ + [-2147483647, -2147483646.99, -0, 0, 2147483646.99, NaN], + [1/undefined, NaN, Number.NaN] + ], + [Float64Array.name]: [ + [-2147483646.99, -0, 0, 4147483646.99, NaN], + [1/undefined, NaN, Number.NaN] + ], +}; + +// Sort every possible permutation of an arrays +function sortAllPermutations(dataType, testData) { + let reference = new dataType(testData); + for (let permutation of Permutations(testData)) + assert.deepEqual((new dataType(permutation)).sort(), reference); +} + +for (let constructor of sharedTypedArrayConstructors) { + for (let data of testCases[constructor.name]) { + sortAllPermutations(constructor, data); + } +} + diff --git a/test/staging/sm/TypedArray/sort_snans.js b/test/staging/sm/TypedArray/sort_snans.js new file mode 100644 index 0000000000..8ddf7e96ce --- /dev/null +++ b/test/staging/sm/TypedArray/sort_snans.js @@ -0,0 +1,88 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [deepEqual.js, sm/non262-TypedArray-shell.js, sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +// Ensure that signaling NaN's don't cause problems while sorting + +function getNaNArray(length) { + let a = []; + for (let i = 0; i < length; i++) + a.push(NaN); + return a; +} + +// Test every skipNth value in some range n, where start <= n <= end +// and start/stop should be 32-bit integers with bit patterns that +// form Float32 NaNs. +function testFloat32NaNRanges(start, end) { + let skipN = 10e3; + + // sample the space of possible NaNs to save time + let sampleSize = Math.floor((end - start)/ skipN); + + let NaNArray = new Float32Array(getNaNArray(sampleSize)); + let buffer = new ArrayBuffer(4 * sampleSize); + let uintView = new Uint32Array(buffer); + let floatView = new Float32Array(buffer); + + uintView[0] = start; + for (let i = 1; i < sampleSize; i++) { + uintView[i] = uintView[0] + (i * skipN); + } + + floatView.sort(); + assert.deepEqual(floatView, NaNArray); +} + +// Test every skipNth value in some range n, where start <= n <= end +// and startHi, startLow and endHi, endLow should be 32-bit integers which, +// when combined (Hi + Low), form Float64 NaNs. +function testFloat64NaNRanges(startHi, startLow, endHi, endLow) { + + // Swap on big endian platforms + if (new Uint32Array(new Uint8Array([1,2,3,4]).buffer)[0] === 0x01020304) { + [startHi, startLow] = [startLow, startHi]; + [endHi, endLow] = [endLow, endHi]; + } + + let skipN = 10e6; + + let sampleSizeHi = Math.floor((endHi - startHi)/skipN); + let sampleSizeLow = Math.floor((endLow - startLow)/skipN); + + let NaNArray = new Float64Array(getNaNArray(sampleSizeHi + sampleSizeLow)); + let buffer = new ArrayBuffer(8 * (sampleSizeHi + sampleSizeLow)); + let uintView = new Uint32Array(buffer); + let floatView = new Float64Array(buffer); + + // Fill in all of the low bits first. + for (let i = 0; i <= sampleSizeLow; i++) { + uintView[i * 2] = startLow + (i * skipN); + uintView[(i * 2) + 1] = startHi; + } + + // Then the high bits. + for (let i = sampleSizeLow; i <= sampleSizeLow + sampleSizeHi; i++) { + uintView[i * 2] = endLow; + uintView[(i * 2) + 1] = startHi + ((i - sampleSizeLow) * skipN); + } + + floatView.sort(); + assert.deepEqual(floatView, NaNArray); +} + +// Float32 Signaling NaN ranges +testFloat32NaNRanges(0x7F800001, 0x7FBFFFFF); +testFloat32NaNRanges(0xFF800001, 0xFFBFFFFF); + +// Float64 Signaling NaN ranges +testFloat64NaNRanges(0x7FF00000, 0x00000001, 0x7FF7FFFF, 0xFFFFFFFF); +testFloat64NaNRanges(0xFFF00000, 0x00000001, 0xFFF7FFFF, 0xFFFFFFFF); + diff --git a/test/staging/sm/TypedArray/sort_sorted.js b/test/staging/sm/TypedArray/sort_sorted.js new file mode 100644 index 0000000000..a7c6fe96a3 --- /dev/null +++ b/test/staging/sm/TypedArray/sort_sorted.js @@ -0,0 +1,39 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-TypedArray-shell.js, sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +function SortedAscending(length) { + var array = new Int32Array(length); + for (var i = 0; i < length; ++i) + array[i] = i + 1; + + array.sort((x, y) => x - y); + + for (var i = 0; i < length; ++i) + assert.sameValue(i + 1, array[i], `Mismatch at index=${i}, length=${length}`); +} + +for (var i = 0; i < 256; ++i) + SortedAscending(i); + +function SortedDescending(length) { + var array = new Int32Array(length); + for (var i = 0; i < length; ++i) + array[i] = length - i; + + array.sort((x, y) => x - y); + + for (var i = 0; i < length; ++i) + assert.sameValue(i + 1, array[i], `Mismatch at index=${i}, length=${length}`); +} + +for (var i = 0; i < 256; ++i) + SortedDescending(i); + diff --git a/test/staging/sm/TypedArray/sort_stable.js b/test/staging/sm/TypedArray/sort_stable.js new file mode 100644 index 0000000000..56e2c39386 --- /dev/null +++ b/test/staging/sm/TypedArray/sort_stable.js @@ -0,0 +1,32 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-TypedArray-shell.js, sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +// Test with different lengths to cover the case when InsertionSort is resp. +// is not called. +for (let i = 2; i <= 10; ++i) { + let length = 2 ** i; + let ta = new Int8Array(length); + + ta[0] = 2; + ta[1] = 1; + ta[2] = 0; + + for (let i = 3; i < length; ++i) { + ta[i] = 4; + } + + ta.sort((a, b) => (a/4|0) - (b/4|0)); + + assert.sameValue(ta[0], 2); + assert.sameValue(ta[1], 1); + assert.sameValue(ta[2], 0); +} + diff --git a/test/staging/sm/TypedArray/sorting_buffer_access.js b/test/staging/sm/TypedArray/sorting_buffer_access.js new file mode 100644 index 0000000000..1ce18eb522 --- /dev/null +++ b/test/staging/sm/TypedArray/sorting_buffer_access.js @@ -0,0 +1,24 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-TypedArray-shell.js, sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +// Ensure that when sorting arrays of size greater than 128, which +// calls RadixSort under the hood, we don't access the 'buffer' +// property of the typed array directly. + + +// The buggy behavior in the RadixSort is only exposed when we use +// float arrays, but checking everything just to be sure. +for (var ctor of anyTypedArrayConstructors) { + var testArray = new ctor(1024); + Object.defineProperty(testArray, "buffer", { get() { throw new Error("FAIL: Buffer accessed directly"); } }); + testArray.sort(); +} + diff --git a/test/staging/sm/TypedArray/subarray-species.js b/test/staging/sm/TypedArray/subarray-species.js new file mode 100644 index 0000000000..96e6afc4fc --- /dev/null +++ b/test/staging/sm/TypedArray/subarray-species.js @@ -0,0 +1,71 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [deepEqual.js, sm/non262-TypedArray-shell.js, sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +function test(constructor, constructor2, from=[1, 2, 3, 4, 5], to=[3, 4], begin=2, end=4) { + var modifiedConstructor = new constructor(from); + modifiedConstructor.constructor = constructor2; + assert.deepEqual(modifiedConstructor.subarray(begin, end), new constructor2(to)); + var modifiedSpecies = new constructor(from); + modifiedSpecies.constructor = { [Symbol.species]: constructor2 }; + assert.deepEqual(modifiedSpecies.subarray(begin, end), new constructor2(to)); +} + +// same size, same sign + +test(Int8Array, Uint8Array); +test(Int8Array, Uint8ClampedArray); + +test(Uint8Array, Int8Array); +test(Uint8Array, Uint8ClampedArray); + +test(Uint8ClampedArray, Int8Array); +test(Uint8ClampedArray, Uint8Array); + +test(Int16Array, Uint16Array); +test(Uint16Array, Int16Array); + +test(Int32Array, Uint32Array); +test(Uint32Array, Int32Array); + +// same size, different sign + +test(Int8Array, Uint8Array, [-1, -2, -3, -4, -5], [0xFD, 0xFC]); +test(Int8Array, Uint8ClampedArray, [-1, -2, -3, -4, -5], [0xFD, 0xFC]); + +test(Uint8Array, Int8Array, [0xFF, 0xFE, 0xFD, 0xFC, 0xFB], [-3, -4]); +test(Uint8ClampedArray, Int8Array, [0xFF, 0xFE, 0xFD, 0xFC, 0xFB], [-3, -4]); + +test(Int16Array, Uint16Array, [-1, -2, -3, -4, -5], [0xFFFD, 0xFFFC]); +test(Uint16Array, Int16Array, [0xFFFF, 0xFFFE, 0xFFFD, 0xFFFC, 0xFFFB], [-3, -4]); + +test(Int32Array, Uint32Array, [-1, -2, -3, -4, -5], [0xFFFFFFFD, 0xFFFFFFFC]); +test(Uint32Array, Int32Array, [0xFFFFFFFF, 0xFFFFFFFE, 0xFFFFFFFD, 0xFFFFFFFC, 0xFFFFFFFB], [-3, -4]); + +// different size + +// To avoid handling endian, use ArrayBuffer as an argument. +var a = new Int8Array([0x12, 0x34, 0x56, 0x78, 0x9A, 0xBC, 0xDE, 0xF0, + 0x23, 0x45, 0x67, 0x89, 0xAB, 0xCD, 0xEF, 0x01, + 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77, 0x88, + 0x99, 0xAA, 0xBB, 0xCC, 0xDD, 0xEE, 0xFF, 0x0F]); + +test(Uint8Array, Uint16Array, a.buffer, a.slice(2, 6).buffer); +test(Uint16Array, Uint8Array, a.buffer, a.slice(4, 6).buffer); + +test(Uint8Array, Uint32Array, a.buffer, a.slice(4, 12).buffer, 4, 6); +test(Uint32Array, Uint8Array, a.buffer, a.slice(8, 10).buffer); + +test(Uint16Array, Uint32Array, a.buffer, a.slice(4, 12).buffer); +test(Uint32Array, Uint16Array, a.buffer, a.slice(8, 12).buffer); + +test(Float32Array, Float64Array, a.buffer, a.slice(8, 24).buffer); +test(Float64Array, Float32Array, a.buffer, a.slice(16, 24).buffer); + diff --git a/test/staging/sm/TypedArray/subarray.js b/test/staging/sm/TypedArray/subarray.js new file mode 100644 index 0000000000..fb0ab881d3 --- /dev/null +++ b/test/staging/sm/TypedArray/subarray.js @@ -0,0 +1,38 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-TypedArray-shell.js, sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +// Bug 1291003 +if (typeof $262.detachArrayBuffer === "function") { + for (let constructor of typedArrayConstructors) { + const elementSize = constructor.BYTES_PER_ELEMENT; + + let targetOffset; + let buffer = new ArrayBuffer(2 * elementSize); + let typedArray = new constructor(buffer, 1 * elementSize, 1); + typedArray.constructor = { + [Symbol.species]: function(ab, offset, length) { + targetOffset = offset; + return new constructor(1); + } + }; + + let beginIndex = { + valueOf() { + $262.detachArrayBuffer(buffer); + return 0; + } + }; + typedArray.subarray(beginIndex); + + assert.sameValue(targetOffset, 1 * elementSize); + } +} + diff --git a/test/staging/sm/TypedArray/test-integrity-level-detached.js b/test/staging/sm/TypedArray/test-integrity-level-detached.js new file mode 100644 index 0000000000..b4cc8e0216 --- /dev/null +++ b/test/staging/sm/TypedArray/test-integrity-level-detached.js @@ -0,0 +1,85 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-TypedArray-shell.js, sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +const EMPTY = 0; +const INLINE_STORAGE = 10; +const NON_INLINE_STORAGE = 1024; + +class DetachedInt32Array extends Int32Array { + constructor(...args) { + super(...args); + $262.detachArrayBuffer(this.buffer); + } +} + +// Empty typed arrays can be sealed. +{ + let ta = new DetachedInt32Array(EMPTY); + Object.seal(ta); + + assert.sameValue(Object.isExtensible(ta), false); + assert.sameValue(Object.isSealed(ta), true); + assert.sameValue(Object.isFrozen(ta), true); +} + +// Non-empty typed arrays can be sealed, but calling TestIntegrityLevel will +// throw on detached typed arrays. +for (let length of [INLINE_STORAGE, NON_INLINE_STORAGE]) { + let ta = new DetachedInt32Array(length); + Object.seal(ta); + + assert.sameValue(Object.isExtensible(ta), false); + assert.sameValue(Object.isSealed(ta), true); + assert.sameValue(Object.isFrozen(ta), true); +} + +// Empty typed arrays can be frozen. +{ + let ta = new DetachedInt32Array(EMPTY); + Object.freeze(ta); + + assert.sameValue(Object.isExtensible(ta), false); + assert.sameValue(Object.isSealed(ta), true); + assert.sameValue(Object.isFrozen(ta), true); +} + +// Non-empty typed arrays cannot be frozen. +for (let length of [INLINE_STORAGE, NON_INLINE_STORAGE]) { + let ta = new DetachedInt32Array(length); + Object.freeze(ta); + + assert.sameValue(Object.isExtensible(ta), false); + assert.sameValue(Object.isSealed(ta), true); + assert.sameValue(Object.isFrozen(ta), true); +} + +// Non-extensible empty typed arrays are sealed and frozen. +{ + let ta = new DetachedInt32Array(EMPTY); + Object.preventExtensions(ta); + + assert.sameValue(Object.isExtensible(ta), false); + assert.sameValue(Object.isSealed(ta), true); + assert.sameValue(Object.isFrozen(ta), true); +} + +// Calling TestIntegrityLevel will throw on detached typed arrays with non-zero +// length. +for (let length of [INLINE_STORAGE, NON_INLINE_STORAGE]) { + let ta = new DetachedInt32Array(length); + Object.preventExtensions(ta); + + assert.sameValue(Object.isExtensible(ta), false); + assert.sameValue(Object.isSealed(ta), true); + assert.sameValue(Object.isFrozen(ta), true); +} + + diff --git a/test/staging/sm/TypedArray/test-integrity-level.js b/test/staging/sm/TypedArray/test-integrity-level.js new file mode 100644 index 0000000000..b9a8178057 --- /dev/null +++ b/test/staging/sm/TypedArray/test-integrity-level.js @@ -0,0 +1,76 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-TypedArray-shell.js, sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +const EMPTY = 0; +const INLINE_STORAGE = 10; +const NON_INLINE_STORAGE = 1024; + +// Empty typed arrays can be sealed. +{ + let ta = new Int32Array(EMPTY); + Object.seal(ta); + + assert.sameValue(Object.isExtensible(ta), false); + assert.sameValue(Object.isSealed(ta), true); + assert.sameValue(Object.isFrozen(ta), true); +} + +// Non-empty typed arrays cannot be sealed. +for (let length of [INLINE_STORAGE, NON_INLINE_STORAGE]) { + let ta = new Int32Array(length); + assertThrowsInstanceOf(() => Object.seal(ta), TypeError); + + assert.sameValue(Object.isExtensible(ta), false); + assert.sameValue(Object.isSealed(ta), false); + assert.sameValue(Object.isFrozen(ta), false); +} + +// Empty typed arrays can be frozen. +{ + let ta = new Int32Array(EMPTY); + Object.freeze(ta); + + assert.sameValue(Object.isExtensible(ta), false); + assert.sameValue(Object.isSealed(ta), true); + assert.sameValue(Object.isFrozen(ta), true); +} + +// Non-empty typed arrays cannot be frozen. +for (let length of [INLINE_STORAGE, NON_INLINE_STORAGE]) { + let ta = new Int32Array(length); + assertThrowsInstanceOf(() => Object.freeze(ta), TypeError); + + assert.sameValue(Object.isExtensible(ta), false); + assert.sameValue(Object.isSealed(ta), false); + assert.sameValue(Object.isFrozen(ta), false); +} + +// Non-extensible empty typed arrays are sealed and frozen. +{ + let ta = new Int32Array(EMPTY); + Object.preventExtensions(ta); + + assert.sameValue(Object.isExtensible(ta), false); + assert.sameValue(Object.isSealed(ta), true); + assert.sameValue(Object.isFrozen(ta), true); +} + +// Non-extensible non-empty typed arrays are neither sealed nor frozen. +for (let length of [INLINE_STORAGE, NON_INLINE_STORAGE]) { + let ta = new Int32Array(length); + Object.preventExtensions(ta); + + assert.sameValue(Object.isExtensible(ta), false); + assert.sameValue(Object.isSealed(ta), false); + assert.sameValue(Object.isFrozen(ta), false); +} + + diff --git a/test/staging/sm/TypedArray/toLocaleString-detached.js b/test/staging/sm/TypedArray/toLocaleString-detached.js new file mode 100644 index 0000000000..708d8b1b23 --- /dev/null +++ b/test/staging/sm/TypedArray/toLocaleString-detached.js @@ -0,0 +1,47 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-TypedArray-shell.js, sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +if (typeof $262.detachArrayBuffer === "function") { + const originalNumberToLocaleString = Number.prototype.toLocaleString; + + // Throws if array buffer is detached. + for (let constructor of typedArrayConstructors) { + let typedArray = new constructor(42); + $262.detachArrayBuffer(typedArray.buffer); + assertThrowsInstanceOf(() => typedArray.toLocaleString(), TypeError); + } + + // Doesn't throw a TypeError if detached in Number.prototype.toLocaleString. + for (let constructor of typedArrayConstructors) { + Number.prototype.toLocaleString = function() { + "use strict"; + if (!detached) { + $262.detachArrayBuffer(typedArray.buffer); + detached = true; + } + return this; + }; + + // No error for single element arrays. + let detached = false; + let typedArray = new constructor(1); + assert.sameValue(typedArray.toLocaleString(), "0"); + assert.sameValue(detached, true); + + // And no error if more than one element is present. + detached = false; + typedArray = new constructor(2); + assert.sameValue(typedArray.toLocaleString(), "0,"); + assert.sameValue(detached, true); + } + Number.prototype.toLocaleString = originalNumberToLocaleString; +} + diff --git a/test/staging/sm/TypedArray/toLocaleString-nointl.js b/test/staging/sm/TypedArray/toLocaleString-nointl.js new file mode 100644 index 0000000000..c412a26f1d --- /dev/null +++ b/test/staging/sm/TypedArray/toLocaleString-nointl.js @@ -0,0 +1,49 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-TypedArray-shell.js, sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +if (typeof Intl !== "object") { + const localeSep = [,,].toLocaleString(); + + const originalNumberToLocaleString = Number.prototype.toLocaleString; + + // Ensure no arguments are passed to the array elements. + for (let constructor of anyTypedArrayConstructors) { + Number.prototype.toLocaleString = function() { + assert.sameValue(arguments.length, 0); + return "pass"; + }; + + // Single element case. + assert.sameValue(new constructor(1).toLocaleString(), "pass"); + + // More than one element. + assert.sameValue(new constructor(2).toLocaleString(), "pass" + localeSep + "pass"); + } + Number.prototype.toLocaleString = originalNumberToLocaleString; + + // Ensure no arguments are passed to the array elements even if supplied. + for (let constructor of anyTypedArrayConstructors) { + Number.prototype.toLocaleString = function() { + assert.sameValue(arguments.length, 0); + return "pass"; + }; + let locales = {}; + let options = {}; + + // Single element case. + assert.sameValue(new constructor(1).toLocaleString(locales, options), "pass"); + + // More than one element. + assert.sameValue(new constructor(2).toLocaleString(locales, options), "pass" + localeSep + "pass"); + } + Number.prototype.toLocaleString = originalNumberToLocaleString; +} + diff --git a/test/staging/sm/TypedArray/toLocaleString.js b/test/staging/sm/TypedArray/toLocaleString.js new file mode 100644 index 0000000000..5769f0eb5f --- /dev/null +++ b/test/staging/sm/TypedArray/toLocaleString.js @@ -0,0 +1,89 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [deepEqual.js, sm/non262-TypedArray-shell.js, sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +const TypedArrayPrototype = Object.getPrototypeOf(Int8Array.prototype); + +// %TypedArrayPrototype% has an own "toLocaleString" function property. +assert.sameValue(TypedArrayPrototype.hasOwnProperty("toLocaleString"), true); +assert.sameValue(typeof TypedArrayPrototype.toLocaleString, "function"); + +// The initial value of %TypedArrayPrototype%.toLocaleString is not Array.prototype.toLocaleString. +assert.sameValue(TypedArrayPrototype.toLocaleString === Array.prototype.toLocaleString, false); + +// The concrete TypedArray prototypes do not have an own "toLocaleString" property. +assert.sameValue(anyTypedArrayConstructors.every(c => !c.hasOwnProperty("toLocaleString")), true); + +assert.deepEqual(Object.getOwnPropertyDescriptor(TypedArrayPrototype, "toLocaleString"), { + value: TypedArrayPrototype.toLocaleString, + writable: true, + enumerable: false, + configurable: true, +}); + +assert.sameValue(TypedArrayPrototype.toLocaleString.name, "toLocaleString"); +assert.sameValue(TypedArrayPrototype.toLocaleString.length, 0); + +// It's not a generic method. +assertThrowsInstanceOf(() => TypedArrayPrototype.toLocaleString.call(), TypeError); +for (let invalid of [void 0, null, {}, [], function(){}, true, 0, "", Symbol()]) { + assertThrowsInstanceOf(() => TypedArrayPrototype.toLocaleString.call(invalid), TypeError); +} + +const localeOne = 1..toLocaleString(), + localeTwo = 2..toLocaleString(), + localeSep = [,,].toLocaleString(); + +for (let constructor of anyTypedArrayConstructors) { + assert.sameValue(new constructor([]).toLocaleString(), ""); + assert.sameValue(new constructor([1]).toLocaleString(), localeOne); + assert.sameValue(new constructor([1, 2]).toLocaleString(), localeOne + localeSep + localeTwo); +} + +const originalNumberToLocaleString = Number.prototype.toLocaleString; + +// Calls Number.prototype.toLocaleString on each element. +for (let constructor of anyTypedArrayConstructors) { + Number.prototype.toLocaleString = function() { + "use strict"; + + // Ensure this-value is not boxed. + assert.sameValue(typeof this, "number"); + + // Test ToString is applied. + return { + valueOf: () => { + throw new Error("valueOf called"); + }, + toString: () => { + return this + 10; + } + }; + }; + let typedArray = new constructor([1, 2]); + assert.sameValue(typedArray.toLocaleString(), "11" + localeSep + "12"); +} +Number.prototype.toLocaleString = originalNumberToLocaleString; + +// Calls Number.prototype.toLocaleString from the current Realm. +const otherGlobal = createNewGlobal(); +for (let constructor of anyTypedArrayConstructors) { + Number.prototype.toLocaleString = function() { + "use strict"; + called = true; + return this; + }; + let typedArray = new otherGlobal[constructor.name]([1]); + let called = false; + assert.sameValue(TypedArrayPrototype.toLocaleString.call(typedArray), "1"); + assert.sameValue(called, true); +} +Number.prototype.toLocaleString = originalNumberToLocaleString; + diff --git a/test/staging/sm/TypedArray/toReversed-detached.js b/test/staging/sm/TypedArray/toReversed-detached.js new file mode 100644 index 0000000000..44ac0b2fb5 --- /dev/null +++ b/test/staging/sm/TypedArray/toReversed-detached.js @@ -0,0 +1,18 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-TypedArray-shell.js, sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ + +var ta = new Int32Array([3, 2, 1]); + +$262.detachArrayBuffer(ta.buffer); + +assertThrowsInstanceOf(() => ta.toReversed(), TypeError); + diff --git a/test/staging/sm/TypedArray/toSorted-detached.js b/test/staging/sm/TypedArray/toSorted-detached.js new file mode 100644 index 0000000000..afc8656bef --- /dev/null +++ b/test/staging/sm/TypedArray/toSorted-detached.js @@ -0,0 +1,18 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-TypedArray-shell.js, sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ + +var ta = new Int32Array([3, 2, 1]); + +$262.detachArrayBuffer(ta.buffer); + +assertThrowsInstanceOf(() => ta.toSorted(), TypeError); + diff --git a/test/staging/sm/TypedArray/toString.js b/test/staging/sm/TypedArray/toString.js new file mode 100644 index 0000000000..8cd82aed2d --- /dev/null +++ b/test/staging/sm/TypedArray/toString.js @@ -0,0 +1,82 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [deepEqual.js, sm/non262-TypedArray-shell.js, sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +const TypedArrayPrototype = Object.getPrototypeOf(Int8Array.prototype); + +// %TypedArrayPrototype% has an own "toString" property. +assert.sameValue(TypedArrayPrototype.hasOwnProperty("toString"), true); + +// The initial value of %TypedArrayPrototype%.toString is Array.prototype.toString. +assert.sameValue(TypedArrayPrototype.toString, Array.prototype.toString); + +// The concrete TypedArray prototypes do not have an own "toString" property. +assert.sameValue(anyTypedArrayConstructors.every(c => !c.hasOwnProperty("toString")), true); + +assert.deepEqual(Object.getOwnPropertyDescriptor(TypedArrayPrototype, "toString"), { + value: TypedArrayPrototype.toString, + writable: true, + enumerable: false, + configurable: true, +}); + +for (let constructor of anyTypedArrayConstructors) { + assert.sameValue(new constructor([]).toString(), ""); + assert.sameValue(new constructor([1]).toString(), "1"); + assert.sameValue(new constructor([1, 2]).toString(), "1,2"); +} + +const testCases = { + [Int8Array.name]: { + array: [-1, 2, -3, 4, NaN], + expected: "-1,2,-3,4,0", + }, + [Int16Array.name]: { + array: [-1, 2, -3, 4, NaN], + expected: "-1,2,-3,4,0", + }, + [Int32Array.name]: { + array: [-1, 2, -3, 4, NaN], + expected: "-1,2,-3,4,0", + }, + [Uint8Array.name]: { + array: [255, 2, 3, 4, NaN], + expected: "255,2,3,4,0", + }, + [Uint16Array.name]: { + array: [-1, 2, 3, 4, NaN], + expected: "65535,2,3,4,0", + }, + [Uint32Array.name]: { + array: [-1, 2, 3, 4, NaN], + expected: "4294967295,2,3,4,0", + }, + [Uint8ClampedArray.name]: { + array: [255, 256, 2, 3, 4, NaN], + expected: "255,255,2,3,4,0", + }, + [Float16Array.name]: { + array: [-0, 0, 0.5, -0.5, NaN, Infinity, -Infinity], + expected: "0,0,0.5,-0.5,NaN,Infinity,-Infinity", + }, + [Float32Array.name]: { + array: [-0, 0, 0.5, -0.5, NaN, Infinity, -Infinity], + expected: "0,0,0.5,-0.5,NaN,Infinity,-Infinity", + }, + [Float64Array.name]: { + array: [-0, 0, 0.5, -0.5, NaN, Infinity, -Infinity], + expected: "0,0,0.5,-0.5,NaN,Infinity,-Infinity", + }, +}; +for (let constructor of anyTypedArrayConstructors) { + let {array, expected} = testCases[constructor.name]; + assert.sameValue(new constructor(array).toString(), expected); +} + diff --git a/test/staging/sm/TypedArray/toStringTag-cross-compartment.js b/test/staging/sm/TypedArray/toStringTag-cross-compartment.js new file mode 100644 index 0000000000..0c253b678e --- /dev/null +++ b/test/staging/sm/TypedArray/toStringTag-cross-compartment.js @@ -0,0 +1,21 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-TypedArray-shell.js, sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +const TypedArrayPrototype = Object.getPrototypeOf(Int8Array.prototype); +const {get: toStringTag} = Object.getOwnPropertyDescriptor(TypedArrayPrototype, Symbol.toStringTag); + +const otherGlobal = createNewGlobal(); + +for (let constructor of anyTypedArrayConstructors) { + let ta = new otherGlobal[constructor.name](0); + assert.sameValue(toStringTag.call(ta), constructor.name); +} + diff --git a/test/staging/sm/TypedArray/uint8clamped-constructor.js b/test/staging/sm/TypedArray/uint8clamped-constructor.js new file mode 100644 index 0000000000..809ddb3c92 --- /dev/null +++ b/test/staging/sm/TypedArray/uint8clamped-constructor.js @@ -0,0 +1,19 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-TypedArray-shell.js, sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +for (var v of [-300, 255.6, 300, 3.5, -3.9]) { + var a = new Uint8ClampedArray([v]); + var b = new Uint8ClampedArray(1); + b[0] = v; + + assert.sameValue(a[0], b[0]); +} + diff --git a/test/staging/sm/TypedArray/values.js b/test/staging/sm/TypedArray/values.js new file mode 100644 index 0000000000..76f0cbc124 --- /dev/null +++ b/test/staging/sm/TypedArray/values.js @@ -0,0 +1,46 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [deepEqual.js, sm/non262-TypedArray-shell.js, sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +for (var constructor of anyTypedArrayConstructors) { + assert.sameValue(constructor.prototype.values.length, 0); + assert.sameValue(constructor.prototype.values.name, "values"); + assert.sameValue(constructor.prototype.values, constructor.prototype[Symbol.iterator]); + + assert.deepEqual([...new constructor(0).values()], []); + assert.deepEqual([...new constructor(1).values()], [0]); + assert.deepEqual([...new constructor(2).values()], [0, 0]); + assert.deepEqual([...new constructor([15]).values()], [15]); + + var arr = new constructor([1, 2, 3]); + var iterator = arr.values(); + assert.deepEqual(iterator.next(), {value: 1, done: false}); + assert.deepEqual(iterator.next(), {value: 2, done: false}); + assert.deepEqual(iterator.next(), {value: 3, done: false}); + assert.deepEqual(iterator.next(), {value: undefined, done: true}); + + // Called from other globals. + if (typeof createNewGlobal === "function") { + var values = createNewGlobal()[constructor.name].prototype.values; + assert.deepEqual([...values.call(new constructor([42, 36]))], [42, 36]); + arr = new (createNewGlobal()[constructor.name])([42, 36]); + assert.sameValue([...constructor.prototype.values.call(arr)].toString(), "42,36"); + } + + // Throws if `this` isn't a TypedArray. + var invalidReceivers = [undefined, null, 1, false, "", Symbol(), [], {}, /./, + new Proxy(new constructor(), {})]; + invalidReceivers.forEach(invalidReceiver => { + assertThrowsInstanceOf(() => { + constructor.prototype.values.call(invalidReceiver); + }, TypeError, "Assert that values fails if this value is not a TypedArray"); + }); +} + diff --git a/test/staging/sm/TypedArray/with-detached.js b/test/staging/sm/TypedArray/with-detached.js new file mode 100644 index 0000000000..bf1ebcd843 --- /dev/null +++ b/test/staging/sm/TypedArray/with-detached.js @@ -0,0 +1,18 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-TypedArray-shell.js, sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ + +var ta = new Int32Array([3, 2, 1]); + +$262.detachArrayBuffer(ta.buffer); + +assertThrowsInstanceOf(() => ta.with(0, 0), TypeError); + diff --git a/test/staging/sm/TypedArray/with.js b/test/staging/sm/TypedArray/with.js new file mode 100644 index 0000000000..17ed98fa82 --- /dev/null +++ b/test/staging/sm/TypedArray/with.js @@ -0,0 +1,42 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-TypedArray-shell.js, sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ + +class Err {} + +const indices = [ + -Infinity, -10, -0.5, -0, 0, 0.5, 10, Infinity, NaN +]; + +let value = { + valueOf() { + throw new Err; + } +}; + +let ta = new Int32Array(5); +for (let index of indices) { + assertThrowsInstanceOf(() => ta.with(index, value), Err); +} + +for (let index of indices) { + let ta = new Int32Array(5); + + let value = { + valueOf() { + $262.detachArrayBuffer(ta.buffer); + return 0; + } + }; + + assertThrowsInstanceOf(() => ta.with(index, value), RangeError); +} + diff --git a/test/staging/sm/TypedArray/write-out-of-bounds-tonumber.js b/test/staging/sm/TypedArray/write-out-of-bounds-tonumber.js new file mode 100644 index 0000000000..1c0450bed5 --- /dev/null +++ b/test/staging/sm/TypedArray/write-out-of-bounds-tonumber.js @@ -0,0 +1,69 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-TypedArray-shell.js, sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +// ToNumber(value) is executed for OOB writes when using a direct assignment. +function plainSet() { + var callCount = 0; + var value = { + valueOf() { + callCount++; + return 1; + } + }; + + var N = 100; + var ta = new Int32Array(0); + for (var i = 0; i < N; ++i) + ta[0] = value + + assert.sameValue(callCount, N); +} +for (var i = 0; i < 2; ++i) plainSet(); + +// ToNumber(value) is executed for OOB writes when using Reflect.set(...). +function reflectSet() { + var callCount = 0; + var value = { + valueOf() { + callCount++; + return 1; + } + }; + + var N = 100; + var ta = new Int32Array(0); + for (var i = 0; i < N; ++i) + assert.sameValue(Reflect.set(ta, 0, value), true); + + assert.sameValue(callCount, N); +} +for (var i = 0; i < 2; ++i) reflectSet(); + +// ToNumber(value) is not executed for OOB writes when using Reflect.defineProperty(...). +function defineProp() { + var callCount = 0; + var value = { + valueOf() { + callCount++; + return 1; + } + }; + var desc = {value, writable: true, enumerable: true, configurable: true}; + + var N = 100; + var ta = new Int32Array(0); + for (var i = 0; i < N; ++i) + assert.sameValue(Reflect.defineProperty(ta, 0, desc), false); + + assert.sameValue(callCount, 0); +} +for (var i = 0; i < 2; ++i) defineProp(); + diff --git a/test/staging/sm/WeakMap/symbols.js b/test/staging/sm/WeakMap/symbols.js new file mode 100644 index 0000000000..5dbfbd42ad --- /dev/null +++ b/test/staging/sm/WeakMap/symbols.js @@ -0,0 +1,30 @@ +/* + * Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/licenses/publicdomain/ + */ + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +info: | + requires shell-options +description: | + pending +esid: pending +---*/ +var m = new WeakMap; +var sym = Symbol(); +m.set(sym, 0); +assert.sameValue(m.get(sym), 0); + +// sym1 will be registered in global Symbol registry hence cannot be used as a +// key in WeakMap. +var sym1 = Symbol.for("testKey"); +assertThrowsInstanceOf(() => m.set(sym1, 1), TypeError); + +// Well-known symbols can be used as weakmap keys. +var sym2 = Symbol.hasInstance; +m.set(sym2, 2); +assert.sameValue(m.get(sym2), 2); + diff --git a/test/staging/sm/argumentsLengthOpt.js b/test/staging/sm/argumentsLengthOpt.js new file mode 100644 index 0000000000..efe8f9948f --- /dev/null +++ b/test/staging/sm/argumentsLengthOpt.js @@ -0,0 +1,96 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +// Test cases for arguments.length optimization. + +function f1() { + return arguments.length; +} + +function f2(a, b, c) { + return arguments.length; +} + +// arrow functions don't have their own arguments, and so capture the enclosing +// scope. +function f3(a, b, c, d) { + return (() => arguments.length)(); +} + +// Test a function which mutates arguments.length +function f4(a, b, c, d) { + arguments.length = 42; + return arguments.length; +} + +// Manually read out arguments; should disable the length opt +function f5() { + for (var i = 0; i < arguments.length; i++) { + if (arguments[i] == 10) { return true } + } + return false; +} + +function f6() { + function inner() { + return arguments.length; + } + return inner(1, 2, 3); +} + +// edge cases of the arguments bindings: +function f7() { + var arguments = 42; + return arguments; +} + +function f8() { + var arguments = [1, 2]; + return arguments.length; +} + +function f9() { + eval("arguments.length = 42"); + return arguments.length; +} + +function test() { + assert.sameValue(f1(), 0); + assert.sameValue(f1(1), 1); + assert.sameValue(f1(1, 2), 2); + assert.sameValue(f1(1, 2, 3), 3); + + assert.sameValue(f2(), 0); + assert.sameValue(f2(1, 2, 3), 3); + + assert.sameValue(f3(), 0); + assert.sameValue(f3(1, 2, 3), 3); + + assert.sameValue(f4(), 42); + assert.sameValue(f4(1, 2, 3), 42); + + assert.sameValue(f5(), false); + assert.sameValue(f5(1, 2, 3, 10), true); + assert.sameValue(f5(1, 2, 3, 10, 20), true); + assert.sameValue(f5(1, 2, 3, 9, 20, 30), false); + + assert.sameValue(f6(), 3) + assert.sameValue(f6(1, 2, 3, 4), 3) + + assert.sameValue(f7(), 42); + + assert.sameValue(f8(), 2); + + assert.sameValue(f9(), 42); +} + +test(); + diff --git a/test/staging/sm/async-functions/async-contains-unicode-escape.js b/test/staging/sm/async-functions/async-contains-unicode-escape.js new file mode 100644 index 0000000000..c2f5740006 --- /dev/null +++ b/test/staging/sm/async-functions/async-contains-unicode-escape.js @@ -0,0 +1,63 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +var BUGNUMBER = 1315815; +var summary = "async/await containing escapes"; + +print(BUGNUMBER + ": " + summary); + +// Using "eval" as the argument name is fugly, but it means evals below are +// *direct* evals, and so their effects in the unescaped case won't extend +// past each separate |test| call (as would happen if we used a different name +// that made each eval into an indirect eval, affecting code in the global +// scope). +function test(code, eval) +{ + var unescaped = code.replace("###", "async"); + var escaped = code.replace("###", "\\u0061"); + + assertThrowsInstanceOf(() => eval(escaped), SyntaxError); + eval(unescaped); +} + +test("### function f() {}", eval); +test("var x = ### function f() {}", eval); +test("### x => {};", eval); +test("var x = ### x => {}", eval); +test("### () => {};", eval); +test("var x = ### () => {}", eval); +test("### (y) => {};", eval); +test("var x = ### (y) => {}", eval); +test("({ ### x() {} })", eval); +test("var x = ### function f() {}", eval); + +if (typeof parseModule === "function") + test("export default ### function f() {}", parseModule); + +assertThrowsInstanceOf(() => eval("async await => 1;"), + SyntaxError); +assertThrowsInstanceOf(() => eval("async aw\\u0061it => 1;"), + SyntaxError); + +var async = 0; +assert.sameValue(\u0061sync, 0); + +var obj = { \u0061sync() { return 1; } }; +assert.sameValue(obj.async(), 1); + +async = function() { return 42; }; + +var z = async(obj); +assert.sameValue(z, 42); + +var w = async(obj)=>{}; +assert.sameValue(typeof w, "function"); + diff --git a/test/staging/sm/async-functions/async-function-declaration-in-modules.js b/test/staging/sm/async-functions/async-function-declaration-in-modules.js new file mode 100644 index 0000000000..145bd112f5 --- /dev/null +++ b/test/staging/sm/async-functions/async-function-declaration-in-modules.js @@ -0,0 +1,23 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- module +description: | + pending +esid: pending +---*/ + +async function f() { + return "success"; +} + +var AsyncFunction = (async function(){}).constructor; + +assert.sameValue(f instanceof AsyncFunction, true); + +f().then(v => { + assert.sameValue("success", v); +}); diff --git a/test/staging/sm/async-functions/async-property-name-error.js b/test/staging/sm/async-functions/async-property-name-error.js new file mode 100644 index 0000000000..03fe0f0ed8 --- /dev/null +++ b/test/staging/sm/async-functions/async-property-name-error.js @@ -0,0 +1,30 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +function assertSyntaxError(code) { + assertThrowsInstanceOf(() => { Function(code); }, SyntaxError, "Function:" + code); + assertThrowsInstanceOf(() => { eval(code); }, SyntaxError, "eval:" + code); + var ieval = eval; + assertThrowsInstanceOf(() => { ieval(code); }, SyntaxError, "indirect eval:" + code); +} + +assertSyntaxError(`({async async: 0})`); +assertSyntaxError(`({async async})`); +assertSyntaxError(`({async async, })`); +assertSyntaxError(`({async async = 0} = {})`); + +for (let decl of ["var", "let", "const"]) { + assertSyntaxError(`${decl} {async async: a} = {}`); + assertSyntaxError(`${decl} {async async} = {}`); + assertSyntaxError(`${decl} {async async, } = {}`); + assertSyntaxError(`${decl} {async async = 0} = {}`); +} + diff --git a/test/staging/sm/async-functions/await-error.js b/test/staging/sm/async-functions/await-error.js new file mode 100644 index 0000000000..2d8981847a --- /dev/null +++ b/test/staging/sm/async-functions/await-error.js @@ -0,0 +1,25 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +var BUGNUMBER = 1317153; +var summary = "await outside of async function should provide better error"; + +print(BUGNUMBER + ": " + summary); + +let caught = false; +try { + eval("await 10"); +} catch(e) { + assert.sameValue(e.message.includes("await is only valid in"), true); + caught = true; +} +assert.sameValue(caught, true); + diff --git a/test/staging/sm/async-functions/await-in-arrow-parameters.js b/test/staging/sm/async-functions/await-in-arrow-parameters.js new file mode 100644 index 0000000000..706cc493ee --- /dev/null +++ b/test/staging/sm/async-functions/await-in-arrow-parameters.js @@ -0,0 +1,103 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +var ieval = eval; +var AsyncFunction = async function(){}.constructor; + +var functionContext = { + Function: { + constructor: Function, + toSourceBody: code => `function f() { ${code} }`, + toSourceParameter: code => `function f(x = ${code}) { }`, + }, + AsyncFunction: { + constructor: AsyncFunction, + toSourceBody: code => `async function f() { ${code} }`, + toSourceParameter: code => `async function f(x = ${code}) { }`, + }, +}; + +function assertSyntaxError(kind, code) { + var {constructor, toSourceBody, toSourceParameter} = functionContext[kind]; + var body = toSourceBody(code); + var parameter = toSourceParameter(code); + + assertThrowsInstanceOf(() => { constructor(code); }, SyntaxError, constructor.name + ":" + code); + assertThrowsInstanceOf(() => { constructor(`x = ${code}`, ""); }, SyntaxError, constructor.name + ":" + code); + + assertThrowsInstanceOf(() => { eval(body); }, SyntaxError, "eval:" + body); + assertThrowsInstanceOf(() => { ieval(body); }, SyntaxError, "indirect eval:" + body); + + assertThrowsInstanceOf(() => { eval(parameter); }, SyntaxError, "eval:" + parameter); + assertThrowsInstanceOf(() => { ieval(parameter); }, SyntaxError, "indirect eval:" + parameter); +} + +function assertNoSyntaxError(kind, code) { + var {constructor, toSourceBody, toSourceParameter} = functionContext[kind]; + var body = toSourceBody(code); + var parameter = toSourceParameter(code); + + constructor(code); + constructor(`x = ${code}`, ""); + + eval(body); + ieval(body); + + eval(parameter); + ieval(parameter); +} + +function assertSyntaxErrorAsync(code) { + assertNoSyntaxError("Function", code); + assertSyntaxError("AsyncFunction", code); +} + +function assertSyntaxErrorBoth(code) { + assertSyntaxError("Function", code); + assertSyntaxError("AsyncFunction", code); +} + + +// Bug 1353691 +// |await| expression is invalid in arrow functions in async-context. +// |await/r/g| first parses as |AwaitExpression RegularExpressionLiteral|, when reparsing the +// arrow function, it is parsed as |IdentRef DIV IdentRef DIV IdentRef|. We need to ensure in this +// case, that we still treat |await| as a keyword and hence throw a SyntaxError. +assertSyntaxErrorAsync("(a = await/r/g) => {}"); +assertSyntaxErrorBoth("async(a = await/r/g) => {}"); + +// Also applies when nesting arrow functions. +assertSyntaxErrorAsync("(a = (b = await/r/g) => {}) => {}"); +assertSyntaxErrorBoth("async(a = (b = await/r/g) => {}) => {}"); +assertSyntaxErrorBoth("(a = async(b = await/r/g) => {}) => {}"); +assertSyntaxErrorBoth("async(a = async(b = await/r/g) => {}) => {}"); + + +// Bug 1355860 +// |await| cannot be used as rest-binding parameter in arrow functions in async-context. +assertSyntaxErrorAsync("(...await) => {}"); +assertSyntaxErrorBoth("async(...await) => {}"); + +assertSyntaxErrorAsync("(a, ...await) => {}"); +assertSyntaxErrorBoth("async(a, ...await) => {}"); + +// Also test nested arrow functions. +assertSyntaxErrorAsync("(a = (...await) => {}) => {}"); +assertSyntaxErrorBoth("(a = async(...await) => {}) => {}"); +assertSyntaxErrorBoth("async(a = (...await) => {}) => {}"); +assertSyntaxErrorBoth("async(a = async(...await) => {}) => {}"); + +assertSyntaxErrorAsync("(a = (b, ...await) => {}) => {}"); +assertSyntaxErrorBoth("(a = async(b, ...await) => {}) => {}"); +assertSyntaxErrorBoth("async(a = (b, ...await) => {}) => {}"); +assertSyntaxErrorBoth("async(a = async(b, ...await) => {}) => {}"); + + diff --git a/test/staging/sm/async-functions/await-in-parameters-of-async-func.js b/test/staging/sm/async-functions/await-in-parameters-of-async-func.js new file mode 100644 index 0000000000..ab0d5c0525 --- /dev/null +++ b/test/staging/sm/async-functions/await-in-parameters-of-async-func.js @@ -0,0 +1,72 @@ +/* + * Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/licenses/publicdomain/ + */ + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +//----------------------------------------------------------------------------- +var BUGNUMBER = 1478910; +var summary = 'JSMSG_AWAIT_IN_PARAMETER error for incomplete await expr in async function/generator parameter'; + + +//----------------------------------------------------------------------------- +test(); +//----------------------------------------------------------------------------- + +function test() +{ + printBugNumber(BUGNUMBER); + printStatus(summary); + + let testAwaitInDefaultExprOfAsyncFunc = (code) => { + assertThrowsInstanceOf(() => eval(code), SyntaxError, "await expression can't be used in parameter"); + }; + + let testNoException = (code) => { + assert.sameValue(completesNormally(code), true); + }; + + // https://www.ecma-international.org/ecma-262/9.0/ + + // Async Generator Function Definitions : AsyncGeneratorDeclaration & AsyncGeneratorExpression + // async function* f() {} + // f = async function*() {} + testAwaitInDefaultExprOfAsyncFunc("async function* f(a = await) {}"); + testAwaitInDefaultExprOfAsyncFunc("let f = async function*(a = await) {}"); + + testAwaitInDefaultExprOfAsyncFunc("function f(a = async function*(a = await) {}) {}"); + testAwaitInDefaultExprOfAsyncFunc("function f() { a = async function*(a = await) {}; }"); + + testAwaitInDefaultExprOfAsyncFunc("async function* f() { a = async function*(a = await) {}; }"); + testNoException("async function* f() { let a = function(a = await) {}; }"); + + testNoException("async function* f(a = async function*() { await 1; }) {}"); + + // Async Function Definitions : AsyncFunctionDeclaration & AsyncFunctionExpression + // async function f() {} + // f = async function() {} + testAwaitInDefaultExprOfAsyncFunc("async function f(a = await) {}"); + testAwaitInDefaultExprOfAsyncFunc("let f = async function(a = await) {}"); + + testAwaitInDefaultExprOfAsyncFunc("function f(a = async function(a = await) {}) {}"); + testAwaitInDefaultExprOfAsyncFunc("function f() { a = async function(a = await) {}; }"); + + testAwaitInDefaultExprOfAsyncFunc("async function f() { a = async function(a = await) {}; }"); + testNoException("async function f() { let a = function(a = await) {}; }"); + + testNoException("async function f(a = async function() { await 1; }) {}"); + + // Async Arrow Function Definitions : AsyncArrowFunction + // async () => {} + testAwaitInDefaultExprOfAsyncFunc("async (a = await) => {}"); + + testNoException("async (a = async () => { await 1; }) => {}"); + +} diff --git a/test/staging/sm/async-functions/constructor.js b/test/staging/sm/async-functions/constructor.js new file mode 100644 index 0000000000..673c748204 --- /dev/null +++ b/test/staging/sm/async-functions/constructor.js @@ -0,0 +1,42 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +var BUGNUMBER = 1185106; +var summary = "async function constructor and prototype"; + +print(BUGNUMBER + ": " + summary); + +var f1 = async function() {}; + +var AsyncFunction = f1.constructor; +var AsyncFunctionPrototype = AsyncFunction.prototype; + +assert.sameValue(AsyncFunction.name, "AsyncFunction"); +assert.sameValue(AsyncFunction.length, 1); +assert.sameValue(Object.getPrototypeOf(async function() {}), AsyncFunctionPrototype); + +assert.sameValue(AsyncFunctionPrototype.constructor, AsyncFunction); + +var f2 = AsyncFunction("await 1"); +assert.sameValue(f2.constructor, AsyncFunction); +assert.sameValue(f2.length, 0); +assert.sameValue(Object.getPrototypeOf(f2), AsyncFunctionPrototype); + +var f3 = new AsyncFunction("await 1"); +assert.sameValue(f3.constructor, AsyncFunction); +assert.sameValue(f3.length, 0); +assert.sameValue(Object.getPrototypeOf(f3), AsyncFunctionPrototype); + +var f4 = AsyncFunction("a", "b", "c", "await 1"); +assert.sameValue(f4.constructor, AsyncFunction); +assert.sameValue(f4.length, 3); +assert.sameValue(Object.getPrototypeOf(f4), AsyncFunctionPrototype); + diff --git a/test/staging/sm/async-functions/create-function-parse-before-getprototype.js b/test/staging/sm/async-functions/create-function-parse-before-getprototype.js new file mode 100644 index 0000000000..e117470d39 --- /dev/null +++ b/test/staging/sm/async-functions/create-function-parse-before-getprototype.js @@ -0,0 +1,28 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +var getProtoCalled = false; + +var newTarget = Object.defineProperty(function(){}.bind(), "prototype", { + get() { + getProtoCalled = true; + return null; + } +}); + +var AsyncFunction = async function(){}.constructor; + +assertThrowsInstanceOf(() => { + Reflect.construct(AsyncFunction, ["@error"], newTarget); +}, SyntaxError); + +assert.sameValue(getProtoCalled, false); + diff --git a/test/staging/sm/async-functions/inner-caller.js b/test/staging/sm/async-functions/inner-caller.js new file mode 100644 index 0000000000..e8924d4c38 --- /dev/null +++ b/test/staging/sm/async-functions/inner-caller.js @@ -0,0 +1,26 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +function g() { + return g.caller; +} + +(async function f() { + var inner = g(); + assert.sameValue(inner, null); +})(); + +(async function f() { + "use strict"; + var inner = g(); + assert.sameValue(inner, null); +})(); + diff --git a/test/staging/sm/async-functions/length.js b/test/staging/sm/async-functions/length.js new file mode 100644 index 0000000000..c6ab8ae06b --- /dev/null +++ b/test/staging/sm/async-functions/length.js @@ -0,0 +1,21 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +var BUGNUMBER = 1185106; +var summary = "async function length"; + +print(BUGNUMBER + ": " + summary); + +assert.sameValue(async function() {}.length, 0); +assert.sameValue(async function(a) {}.length, 1); +assert.sameValue(async function(a, b, c) {}.length, 3); +assert.sameValue(async function(a, b, c, ...d) {}.length, 3); + diff --git a/test/staging/sm/async-functions/no-expression-closure.js b/test/staging/sm/async-functions/no-expression-closure.js new file mode 100644 index 0000000000..82e5f3d9fd --- /dev/null +++ b/test/staging/sm/async-functions/no-expression-closure.js @@ -0,0 +1,26 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +function assertSyntaxError(code) { + assertThrowsInstanceOf(function () { Function(code); }, SyntaxError, "Function:" + code); + assertThrowsInstanceOf(function () { eval(code); }, SyntaxError, "eval:" + code); + var ieval = eval; + assertThrowsInstanceOf(function () { ieval(code); }, SyntaxError, "indirect eval:" + code); +} + +// AsyncFunction statement +assertSyntaxError(`async function f() 0`); + +// AsyncFunction expression +assertSyntaxError(`void async function() 0`); +assertSyntaxError(`void async function f() 0`); + + diff --git a/test/staging/sm/async-functions/property.js b/test/staging/sm/async-functions/property.js new file mode 100644 index 0000000000..0598c74805 --- /dev/null +++ b/test/staging/sm/async-functions/property.js @@ -0,0 +1,58 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +var BUGNUMBER = 1185106; +var summary = "async name token in property and object destructuring pattern"; + +print(BUGNUMBER + ": " + summary); + +{ + let a = { async: 10 }; + assert.sameValue(a.async, 10); +} + +{ + let a = { async() {} }; + assert.sameValue(a.async instanceof Function, true); + assert.sameValue(a.async.name, "async"); +} + +{ + let async = 11; + let a = { async }; + assert.sameValue(a.async, 11); +} + +{ + let { async } = { async: 12 }; + assert.sameValue(async, 12); +} + +{ + let { async = 13 } = {}; + assert.sameValue(async, 13); +} + +{ + let { async: a = 14 } = {}; + assert.sameValue(a, 14); +} + +{ + let { async, other } = { async: 15, other: 16 }; + assert.sameValue(async, 15); + assert.sameValue(other, 16); + + let a = { async, other }; + assert.sameValue(a.async, 15); + assert.sameValue(a.other, 16); +} + diff --git a/test/staging/sm/async-functions/toString.js b/test/staging/sm/async-functions/toString.js new file mode 100644 index 0000000000..6fd7700d58 --- /dev/null +++ b/test/staging/sm/async-functions/toString.js @@ -0,0 +1,33 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +var BUGNUMBER = 1185106; +var summary = "async function toString"; + +print(BUGNUMBER + ": " + summary); + +async function f1(a, b, c) { await a; } + +assert.sameValue(f1.toString(), + "async function f1(a, b, c) { await a; }"); + +assert.sameValue(async function (a, b, c) { await a; }.toString(), + "async function (a, b, c) { await a; }"); + +assert.sameValue((async (a, b, c) => await a).toString(), + "async (a, b, c) => await a"); + +assert.sameValue((async (a, b, c) => { await a; }).toString(), + "async (a, b, c) => { await a; }"); + +assert.sameValue({ async foo(a, b, c) { await a; } }.foo.toString(), + "async foo(a, b, c) { await a; }"); + diff --git a/test/staging/sm/class/boundFunctionSubclassing.js b/test/staging/sm/class/boundFunctionSubclassing.js new file mode 100644 index 0000000000..950adcf26c --- /dev/null +++ b/test/staging/sm/class/boundFunctionSubclassing.js @@ -0,0 +1,46 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +class func extends Function { } +let inst = new func("x", "return this.bar + x"); + +// First, ensure that we get sane prototype chains for the bound instance +let bound = inst.bind({bar: 3}, 4); +assert.sameValue(bound instanceof func, true); +assert.sameValue(bound(), 7); + +// Check the corner case for Function.prototype.bind where the function has +// a null [[Prototype]] +Object.setPrototypeOf(inst, null); +bound = Function.prototype.bind.call(inst, {bar:1}, 3); +assert.sameValue(Object.getPrototypeOf(bound), null); +assert.sameValue(bound(), 4); + +// Check that we actually pass the proper new.target when calling super() +function toBind() { } + +var boundArgs = []; +for (let i = 0; i < 5; i++) { + boundArgs.push(i); + let bound = toBind.bind(undefined, ...boundArgs); + + // We have to wire it up by hand to allow us to use a bound function + // as a superclass, but it's doable. + bound.prototype = {}; + class test extends bound { }; + let passedArgs = []; + for (let j = 0; j < 15; j++) { + passedArgs.push(j); + assert.sameValue(Object.getPrototypeOf(new test(...passedArgs)), test.prototype); + } +} + + diff --git a/test/staging/sm/class/bytecodePatternMatching.js b/test/staging/sm/class/bytecodePatternMatching.js new file mode 100644 index 0000000000..ca9167825a --- /dev/null +++ b/test/staging/sm/class/bytecodePatternMatching.js @@ -0,0 +1,38 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +// Constructors can't be called so we can't pattern match +// them in replace and sort. +function a() { + var b = {a: "A"}; + + class X { + constructor(a) { + return b[a] + } + }; + + assertThrowsInstanceOf(() => "a".replace(/a/, X), TypeError); +} + +function b() { + class X { + constructor(x, y) { + return x - y; + } + } + + assertThrowsInstanceOf(() => [1, 2, 3].sort(X), TypeError); +} + +a(); +b(); + diff --git a/test/staging/sm/class/classConstructorNoCall.js b/test/staging/sm/class/classConstructorNoCall.js new file mode 100644 index 0000000000..dc93587327 --- /dev/null +++ b/test/staging/sm/class/classConstructorNoCall.js @@ -0,0 +1,30 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +// Class constructors don't have a [[Call]] +class Foo { + constructor() { } +} + +assertThrowsInstanceOf(Foo, TypeError); + +class Bar extends Foo { + constructor() { } +} + +assertThrowsInstanceOf(Bar, TypeError); + +assertThrowsInstanceOf(class { constructor() { } }, TypeError); +assertThrowsInstanceOf(class extends Foo { constructor() { } }, TypeError); + +assertThrowsInstanceOf(class foo { constructor() { } }, TypeError); +assertThrowsInstanceOf(class foo extends Foo { constructor() { } }, TypeError); + diff --git a/test/staging/sm/class/classHeritage.js b/test/staging/sm/class/classHeritage.js new file mode 100644 index 0000000000..bf56bf3d44 --- /dev/null +++ b/test/staging/sm/class/classHeritage.js @@ -0,0 +1,106 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +// It's an error to have a non-constructor as your heritage +assertThrowsInstanceOf(() => eval(`class a extends Math.sin { + constructor() { } + }`), TypeError); +assertThrowsInstanceOf(() => eval(`(class a extends Math.sin { + constructor() { } + })`), TypeError); + +// Unless it's null, in which case it works like a normal class, except that +// the prototype object does not inherit from Object.prototype. +class basic { + constructor() { } +} +class nullExtends extends null { + constructor() { } +} +var nullExtendsExpr = class extends null { constructor() { } }; + +assert.sameValue(Object.getPrototypeOf(basic), Function.prototype); +assert.sameValue(Object.getPrototypeOf(basic.prototype), Object.prototype); + +for (let extension of [nullExtends, nullExtendsExpr]) { + assert.sameValue(Object.getPrototypeOf(extension), Function.prototype); + assert.sameValue(Object.getPrototypeOf(extension.prototype), null); +} + +var baseMethodCalled; +var staticMethodCalled; +var overrideCalled; +class base { + constructor() { }; + method() { baseMethodCalled = true; } + static staticMethod() { staticMethodCalled = true; } + override() { overrideCalled = "base" } +} +class derived extends base { + constructor() { super(); }; + override() { overrideCalled = "derived"; } +} +var derivedExpr = class extends base { + constructor() { super(); }; + override() { overrideCalled = "derived"; } +}; + +// Make sure we get the right object layouts. +for (let extension of [derived, derivedExpr]) { + baseMethodCalled = false; + staticMethodCalled = false; + overrideCalled = ""; + // Make sure we get the right object layouts. + assert.sameValue(Object.getPrototypeOf(extension), base); + assert.sameValue(Object.getPrototypeOf(extension.prototype), base.prototype); + + // We do inherit the methods, right? + (new extension()).method(); + assert.sameValue(baseMethodCalled, true); + + // But we can still override them? + (new extension()).override(); + assert.sameValue(overrideCalled, "derived"); + + // What about the statics? + extension.staticMethod(); + assert.sameValue(staticMethodCalled, true); +} + +// Gotta extend an object, or null. +function nope() { + class Foo extends "Bar" { + constructor() { } + } +} +function nopeExpr() { + (class extends "Bar" { + constructor() { } + }); +} +assertThrowsInstanceOf(nope, TypeError); +assertThrowsInstanceOf(nopeExpr, TypeError); + +// The .prototype of the extension must be an object, or null. +nope.prototype = "not really, no"; +function stillNo() { + class Foo extends nope { + constructor() { } + } +} +function stillNoExpr() { + (class extends nope { + constructor() { } + }); +} +assertThrowsInstanceOf(stillNo, TypeError); +assertThrowsInstanceOf(stillNoExpr, TypeError); + diff --git a/test/staging/sm/class/className.js b/test/staging/sm/class/className.js new file mode 100644 index 0000000000..6e8b89d058 --- /dev/null +++ b/test/staging/sm/class/className.js @@ -0,0 +1,257 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +function testName(C, name, hasValue, hasGetter, hasSetter, isFunction=false) { + if (isFunction) { + assert.sameValue(typeof C.name, "function"); + } else { + assert.sameValue(C.name, name); + } + + var desc = Object.getOwnPropertyDescriptor(C, "name"); + if (!hasValue && !hasGetter && !hasSetter) { + assert.sameValue(desc, undefined); + return; + } + + if (hasValue) { + assert.sameValue("value" in desc, true); + if (isFunction) { + assert.sameValue(typeof desc.value, "function"); + } else { + assert.sameValue(desc.value, name); + } + // FIXME: Methods defined in classes should not be enumerable + // (bug 1144630). + // assert.sameValue(desc.enumerable, false); + assert.sameValue(desc.configurable, true); + + assert.sameValue("get" in desc, false); + assert.sameValue("set" in desc, false); + + return; + } + + assert.sameValue("value" in desc, false); + + if (hasGetter) { + assert.sameValue("get" in desc, true); + assert.sameValue(desc.get(), name); + // assert.sameValue(desc.enumerable, false); + assert.sameValue(desc.configurable, true); + } else { + assert.sameValue("get" in desc, true); + assert.sameValue(desc.get, undefined); + // assert.sameValue(desc.enumerable, false); + assert.sameValue(desc.configurable, true); + } + + if (hasSetter) { + assert.sameValue("set" in desc, true); + assert.sameValue(typeof desc.set, "function"); + // assert.sameValue(desc.enumerable, false); + assert.sameValue(desc.configurable, true); + } else { + assert.sameValue("set" in desc, true); + assert.sameValue(desc.set, undefined); + // assert.sameValue(desc.enumerable, false); + assert.sameValue(desc.configurable, true); + } +} + +// ---- declaration --- + +class Decl { + constructor() {} +} +testName(Decl, "Decl", true, false, false); + +class DeclWithFunc { + constructor() {} + static name() {} +} +testName(DeclWithFunc, "DeclWithFunc", true, false, false, true); + +class DeclWithGetter { + constructor() {} + static get name() { return "base"; } +} +testName(DeclWithGetter, "base", false, true, false); + +class DeclWithSetter { + constructor() {} + static set name(v) {} +} +testName(DeclWithSetter, undefined, false, false, true); + +class DeclWithGetterSetter { + constructor() {} + static get name() { return "base"; } + static set name(v) {} +} +testName(DeclWithGetterSetter, "base", false, true, true); + +function prop() { + return "name"; +} +class DeclWithComputed { + constructor() {} + static get [prop()]() { return "base"; } +} +testName(DeclWithGetterSetter, "base", false, true, true); + +class ExtendedDecl1 extends Decl { + constructor() {} +} +testName(ExtendedDecl1, "ExtendedDecl1", true, false, false); +delete ExtendedDecl1.name; +testName(ExtendedDecl1, "Decl", false, false, false); + +class ExtendedDecl2 extends DeclWithGetterSetter { + constructor() {} + static get name() { return "extend"; } +} +testName(ExtendedDecl2, "extend", false, true, false); +delete ExtendedDecl2.name; +testName(ExtendedDecl2, "base", false, false, false); + +class ExtendedDecl3 extends DeclWithGetterSetter { + constructor() {} + static set name(v) {} +} +testName(ExtendedDecl3, undefined, false, false, true); +delete ExtendedDecl3.name; +testName(ExtendedDecl3, "base", false, false, false); + +// ---- expression --- + +let Expr = class Expr { + constructor() {} +}; +testName(Expr, "Expr", true, false, false); + +let ExprWithGetter = class ExprWithGetter { + constructor() {} + static get name() { return "base"; } +}; +testName(ExprWithGetter, "base", false, true, false); + +let ExprWithSetter = class ExprWithSetter { + constructor() {} + static set name(v) {} +}; +testName(ExprWithSetter, undefined, false, false, true); + +let ExprWithGetterSetter = class ExprWithGetterSetter { + constructor() {} + static get name() { return "base"; } + static set name(v) {} +}; +testName(ExprWithGetterSetter, "base", false, true, true); + + +let ExtendedExpr1 = class ExtendedExpr1 extends Expr { + constructor() {} +}; +testName(ExtendedExpr1, "ExtendedExpr1", true, false, false); +delete ExtendedExpr1.name; +testName(ExtendedExpr1, "Expr", false, false, false); + +let ExtendedExpr2 = class ExtendedExpr2 extends ExprWithGetterSetter { + constructor() {} + static get name() { return "extend"; } +}; +testName(ExtendedExpr2, "extend", false, true, false); +delete ExtendedExpr2.name; +testName(ExtendedExpr2, "base", false, false, false); + +let ExtendedExpr3 = class ExtendedExpr3 extends ExprWithGetterSetter { + constructor() {} + static set name(v) {} +}; +testName(ExtendedExpr3, undefined, false, false, true); +delete ExtendedExpr3.name; +testName(ExtendedExpr3, "base", false, false, false); + +// ---- anonymous ---- + +// Anonymous class expressions use the empty string as the default name property. +// Use property assignment to avoid setting name property. +let tmp = {}; +let Anon = tmp.value = class { + constructor() {} +}; +testName(Anon, "", true, false, false); + +let AnonDefault = tmp.value = class { }; +testName(AnonDefault, "", true, false, false); + +let AnonWithGetter = tmp.value = class { + constructor() {} + static get name() { return "base"; } +}; +testName(AnonWithGetter, "base", false, true, false); + +let AnonWithSetter = tmp.value = class { + constructor() {} + static set name(v) {} +}; +testName(AnonWithSetter, undefined, false, false, true); + +let AnonWithGetterSetter = tmp.value = class { + constructor() {} + static get name() { return "base"; } + static set name(v) {} +}; +testName(AnonWithGetterSetter, "base", false, true, true); + + +let ExtendedAnon1 = tmp.value = class extends Anon { + constructor() {} +}; +testName(ExtendedAnon1, "", true, false, false); + +let ExtendedAnonDefault = tmp.value = class extends Anon { }; +testName(ExtendedAnonDefault, "", true, false, false); + +let ExtendedAnon2 = tmp.value = class extends AnonWithGetterSetter { + constructor() {} + static get name() { return "extend"; } +}; +testName(ExtendedAnon2, "extend", false, true, false); +delete ExtendedAnon2.name; +testName(ExtendedAnon2, "base", false, false, false); + +let ExtendedAnon3 = tmp.value = class extends AnonWithGetterSetter { + constructor() {} + static set name(v) {} +}; +testName(ExtendedAnon3, undefined, false, false, true); +delete ExtendedAnon3.name; +testName(ExtendedAnon3, "base", false, false, false); + +// ---- mixed ---- + +let ExtendedExpr4 = class ExtendedExpr4 extends Anon { + constructor() {} +} +testName(ExtendedExpr4, "ExtendedExpr4", true, false, false); +delete ExtendedExpr4.name; +testName(ExtendedExpr4, "", false, false, false); + +let ExtendedExpr5 = class ExtendedExpr5 extends AnonWithGetterSetter { + constructor() {} + static get name() { return "extend"; } +} +testName(ExtendedExpr5, "extend", false, true, false); +delete ExtendedExpr5.name; +testName(ExtendedExpr5, "base", false, false, false); + diff --git a/test/staging/sm/class/classPrototype.js b/test/staging/sm/class/classPrototype.js new file mode 100644 index 0000000000..41706a3b3d --- /dev/null +++ b/test/staging/sm/class/classPrototype.js @@ -0,0 +1,74 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [deepEqual.js, sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +// The prototype of a class is a non-writable, non-configurable, non-enumerable data property. +class a { constructor() { } } +let b = class { constructor() { } }; +for (let test of [a,b]) { + var protoDesc = Object.getOwnPropertyDescriptor(test, "prototype"); + assert.sameValue(protoDesc.writable, false); + assert.sameValue(protoDesc.configurable, false); + assert.sameValue(protoDesc.enumerable, false); + + var prototype = protoDesc.value; + assert.sameValue(typeof prototype, "object"); + assert.sameValue(Object.getPrototypeOf(prototype), Object.prototype); + assert.sameValue(Object.isExtensible(prototype), true); + + var desiredPrototype = {}; + Object.defineProperty(desiredPrototype, "constructor", { writable: true, + configurable: true, + enumerable: false, + value: test }); + assert.deepEqual(prototype, desiredPrototype); +} + +// As such, it should by a TypeError to try and overwrite "prototype" with a +// static member. The only way to try is with a computed property name; the rest +// are early errors. +assertThrowsInstanceOf(() => eval(` + class a { + constructor() { }; + static ["prototype"]() { } + } + `), TypeError); +assertThrowsInstanceOf(() => eval(` + class a { + constructor() { }; + static get ["prototype"]() { } + } + `), TypeError); +assertThrowsInstanceOf(() => eval(` + class a { + constructor() { }; + static set ["prototype"](x) { } + } + `), TypeError); + +assertThrowsInstanceOf(() => eval(`( + class a { + constructor() { }; + static ["prototype"]() { } + } + )`), TypeError); +assertThrowsInstanceOf(() => eval(`( + class a { + constructor() { }; + static get ["prototype"]() { } + } + )`), TypeError); +assertThrowsInstanceOf(() => eval(`( + class a { + constructor() { }; + static set ["prototype"](x) { } + } + )`), TypeError); + diff --git a/test/staging/sm/class/compPropDestr.js b/test/staging/sm/class/compPropDestr.js new file mode 100644 index 0000000000..02299f32f7 --- /dev/null +++ b/test/staging/sm/class/compPropDestr.js @@ -0,0 +1,20 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +var BUGNUMBER = 924688; +var summary = 'Computed Property Names'; + +print(BUGNUMBER + ": " + summary); + +var key = "z"; +var { [key]: foo } = { z: "bar" }; +assert.sameValue(foo, "bar"); + diff --git a/test/staging/sm/class/compPropNames.js b/test/staging/sm/class/compPropNames.js new file mode 100644 index 0000000000..ab9474d884 --- /dev/null +++ b/test/staging/sm/class/compPropNames.js @@ -0,0 +1,252 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +var BUGNUMBER = 924688; +var summary = 'Computed Property Names'; + +print(BUGNUMBER + ": " + summary); + +// Function definitions. +function syntaxError (script) { + try { + Function(script); + } catch (e) { + if (e instanceof SyntaxError) { + return; + } + } + throw new Error('Expected syntax error: ' + script); +} + + +// Tests begin. + +assertThrowsInstanceOf(function() { var a = {[field1]: "a", [field2]: "b"}; }, ReferenceError); + +assertThrowsInstanceOf(function() { + field1 = 1; + var a = {[field1]: "a", [field2]: "b"}; + }, ReferenceError); + +var f1 = 1; +var f2 = 2; +var a = {[f1]: "a", [f2]: "b"}; +assert.sameValue(a[1], "a"); +assert.sameValue(a[2], "b"); + +var a = {[f1]: "a", f2: "b"}; +assert.sameValue(a[1], "a"); +assert.sameValue(a.f2, "b"); + +var a = {["f1"]: "a", [++f2]: "b"}; +assert.sameValue(a.f1, "a"); +assert.sameValue(a[3], "b"); + +var a = {["f1"]: "a", f2: "b"}; +assert.sameValue(a.f1, "a"); +assert.sameValue(a.f2, "b"); + + +var i = 0; +var a = { + ["foo" + ++i]: i, + ["foo" + ++i]: i, + ["foo" + ++i]: i +}; +assert.sameValue(a.foo1, 1); +assert.sameValue(a.foo2, 2); +assert.sameValue(a.foo3, 3); + +var expr = "abc"; +syntaxError("({["); +syntaxError("({[expr"); +syntaxError("({[expr]"); +syntaxError("({[expr]})"); +syntaxError("({[expr] 0})"); +syntaxError("({[expr], 0})"); +syntaxError("[[expr]: 0]"); +syntaxError("({[expr]: name: 0})"); +syntaxError("({[1, 2]: 3})"); // because '1,2' is an Expression but not an AssignmentExpression +syntaxError("({[1;]: 1})"); // and not an ExpressionStatement +syntaxError("({[if (0) 0;]})"); // much less a Statement +syntaxError("function f() { {[x]: 1} }"); // that's not even an ObjectLiteral +syntaxError("function f() { [x]: 1 }"); // or that +syntaxError('a = {[f1@]: "a", [f2]: "b"}'); // unexpected symbol at end of AssignmentExpression +try { JSON.parse('{["a"]:4}'); } catch(e) { + if (!(e instanceof SyntaxError)) throw new Error('Expected syntax error'); +} + +// Property characteristics. +a = { ["b"] : 4 }; +b = Object.getOwnPropertyDescriptor(a, "b"); +assert.sameValue(b.configurable, true); +assert.sameValue(b.enumerable, true); +assert.sameValue(b.writable, true); +assert.sameValue(b.value, 4); + +// Setter and getter are not hit. +Object.defineProperty(Object.prototype, "x", { set: function (x) { throw "FAIL"; }, + get: function (x) { throw "FAIL"; } }); +var a = {["x"]: 0}; +assert.sameValue(a.x, 0); + +a = {["x"]: 1, ["x"]: 2}; +assert.sameValue(a.x, 2); +a = {x: 1, ["x"]: 2}; +assert.sameValue(a.x, 2); +a = {["x"]: 1, x: 2}; +assert.sameValue(a.x, 2); + +// Symbols +var unique_sym = Symbol("1"), registered_sym = Symbol.for("2"); +a = { [unique_sym] : 2, [registered_sym] : 3 }; +assert.sameValue(a[unique_sym], 2); +assert.sameValue(a[registered_sym], 3); + +// Same expression can be run several times to build objects with different property names. +a = []; +for (var i = 0; i < 3; i++) { + a[i] = {["foo" + i]: i}; +} +assert.sameValue(a[0].foo0, 0); +assert.sameValue(a[1].foo1, 1); +assert.sameValue(a[2].foo2, 2); + +// Following are stored in object's elements rather than slots. +var i = 0; +a = { [++i] : i, + [++i] : i, + [++i] : i, + [++i] : i, + [++i] : i, + [++i] : i, + [++i] : i, + [++i] : i +} +for (var i = 1; i < 9; i++) + assert.sameValue(a[i], i); +syntaxError("a.1"); +syntaxError("a.2"); +syntaxError("a.3"); +syntaxError("a.4"); +syntaxError("a.5"); +syntaxError("a.6"); +syntaxError("a.7"); +syntaxError("a.8"); + +// Adding a single large index. +var i = 0; +a = { [++i] : i, + [++i] : i, + [++i] : i, + [++i] : i, + [++i] : i, + [++i] : i, + [++i] : i, + [++i] : i, + [3000] : 2999 +} +for (var i = 1; i < 9; i++) + assert.sameValue(a[i], i); +assert.sameValue(a[3000], 2999); + +// Defining several properties using eval. +var code = "({"; +for (i = 0; i < 1000; i++) + code += "['foo' + " + i + "]: 'ok', " +code += "['bar']: 'ok'});"; +var obj = eval(code); +for (i = 0; i < 1000; i++) + assert.sameValue(obj["foo" + i], "ok"); +assert.sameValue(obj["bar"], "ok"); + +// Can yield in a computed property name which is in a generator. +function* g() { + var a = { [yield 1]: 2, [yield 2]: 3}; + return a; +} + +var it = g(); +var next = it.next(); +assert.sameValue(next.done, false); +assert.sameValue(next.value, 1); +next = it.next("hello"); +assert.sameValue(next.done, false); +assert.sameValue(next.value, 2); +next = it.next("world"); +assert.sameValue(next.done, true); +assert.sameValue(next.value.hello, 2); +assert.sameValue(next.value.world, 3); + +// get and set. +expr = "abc"; +syntaxError("({get ["); +syntaxError("({get [expr()"); +syntaxError("({get [expr]()"); +syntaxError("({get [expr]()})"); +syntaxError("({get [expr] 0 ()})"); +syntaxError("({get [expr], 0(})"); +syntaxError("[get [expr]: 0()]"); +syntaxError("({get [expr](: name: 0})"); +syntaxError("({get [1, 2](): 3})"); +syntaxError("({get [1;](): 1})"); +syntaxError("({get [if (0) 0;](){}})"); +syntaxError("({set [(a)"); +syntaxError("({set [expr(a)"); +syntaxError("({set [expr](a){}"); +syntaxError("({set [expr]}(a)"); +syntaxError("({set [expr](a), 0})"); +syntaxError("[set [expr](a): 0]"); +syntaxError("({set [expr](a): name: 0})"); +syntaxError("({set [1, 2](a) {return 3;}})"); +syntaxError("({set [1;](a) {return 1}})"); +syntaxError("({set [if (0) 0;](a){}})"); +syntaxError("function f() { {get [x](): 1} }"); +syntaxError("function f() { get [x](): 1 }"); +syntaxError("function f() { {set [x](a): 1} }"); +syntaxError("function f() { set [x](a): 1 }"); +f1 = "abc"; +syntaxError('a = {get [f1@](){}, set [f1](a){}}'); // unexpected symbol at end of AssignmentExpression +syntaxError('a = {get@ [f1](){}, set [f1](a){}}'); // unexpected symbol after get +syntaxError('a = {get [f1](){}, set@ [f1](a){}}'); // unexpected symbol after set + +expr = "hey"; +a = {get [expr]() { return 3; }, set[expr](v) { throw 2; }}; +assert.sameValue(a.hey, 3); +assertThrowsValue(() => { a.hey = 5; }, 2); + +// Symbols with duplicate get and set. +expr = Symbol("hey"); +a = {get [expr]() { return 3; }, set[expr](v) { throw 2; }, + set [expr] (w) { throw 4; }, get[expr](){return 5; }}; +assert.sameValue(a[expr], 5); +assertThrowsValue(() => { a[expr] = 7; }, 4); + +// expressions with side effects are called in the right order +log = ""; +obj = { + "a": log += 'a', + get [log += 'b']() {}, + [log += 'c']: log += 'd', + set [log += 'e'](a) {} +}; +assert.sameValue(log, "abcde"); + +// assignment expressions, objects and regex in computed names +obj = { + get [a = "hey"]() { return 1; }, + get [a = {b : 4}.b]() { return 2; }, + set [/x/.source](a) { throw 3; } +} +assert.sameValue(obj.hey, 1); +assert.sameValue(obj[4], 2); +assertThrowsValue(() => { obj.x = 7; }, 3); + diff --git a/test/staging/sm/class/constructorCalled.js b/test/staging/sm/class/constructorCalled.js new file mode 100644 index 0000000000..85c1db84ab --- /dev/null +++ b/test/staging/sm/class/constructorCalled.js @@ -0,0 +1,54 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +// The constructor specified should get called, regardless of order, or +// other distractions + +var called = false; +class a { constructor(x) { assert.sameValue(x, 4); called = true } } +new a(4); +assert.sameValue(called, true); + +called = false; +var aExpr = class { constructor(x) { assert.sameValue(x, 4); called = true } }; +new aExpr(4); +assert.sameValue(called, true); + +called = false; +class b { constructor() { called = true } method() { } } +new b(); +assert.sameValue(called, true); + +called = false; +var bExpr = class { constructor() { called = true } method() { } }; +new bExpr(); +assert.sameValue(called, true); + +called = false; +class c { method() { } constructor() { called = true; } } +new c(); +assert.sameValue(called, true); + +called = false; +var cExpr = class { method() { } constructor() { called = true; } } +new cExpr(); +assert.sameValue(called, true); + +called = false; +class d { ["constructor"]() { throw new Error("NO"); } constructor() { called = true; } } +new d(); +assert.sameValue(called, true); + +called = false; +var dExpr = class { ["constructor"]() { throw new Error("NO"); } constructor() { called = true; } } +new dExpr(); +assert.sameValue(called, true); + diff --git a/test/staging/sm/class/defaultConstructorBase.js b/test/staging/sm/class/defaultConstructorBase.js new file mode 100644 index 0000000000..9cef313813 --- /dev/null +++ b/test/staging/sm/class/defaultConstructorBase.js @@ -0,0 +1,27 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +class base { + method() { return 1; } + *gen() { return 2; } + static sMethod() { return 3; } + get answer() { return 42; } +} + +// Having a default constructor should work, and also not make you lose +// everything for no good reason + +assert.sameValue(Object.getPrototypeOf(new base()), base.prototype); +assert.sameValue(new base().method(), 1); +assert.sameValue(new base().gen().next().value, 2); +assert.sameValue(base.sMethod(), 3); +assert.sameValue(new base().answer, 42); + diff --git a/test/staging/sm/class/defaultConstructorDerivedSpread.js b/test/staging/sm/class/defaultConstructorDerivedSpread.js new file mode 100644 index 0000000000..2a2c277c60 --- /dev/null +++ b/test/staging/sm/class/defaultConstructorDerivedSpread.js @@ -0,0 +1,32 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +/* Make sure that the default derived class constructor has the required spread semantics. + * + * Test credit André Bargull + */ + +// changed default derived class +// constructors to no longer execute the spread iteration protocol. +Array.prototype[Symbol.iterator] = function*() { + throw new Error("unexpected call"); +}; + +class Base { + constructor(a, b) { + assert.sameValue(a, 1); + assert.sameValue(b, 2); + } +}; +class Derived extends Base {}; + +new Derived(1, 2); + diff --git a/test/staging/sm/class/defaultConstructorNotCallable.js b/test/staging/sm/class/defaultConstructorNotCallable.js new file mode 100644 index 0000000000..def49a57f1 --- /dev/null +++ b/test/staging/sm/class/defaultConstructorNotCallable.js @@ -0,0 +1,17 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +class badBase {} +assertThrowsInstanceOf(badBase, TypeError); + +class badSub extends (class {}) {} +assertThrowsInstanceOf(badSub, TypeError); + diff --git a/test/staging/sm/class/derivedConstructorArrowEvalBinding.js b/test/staging/sm/class/derivedConstructorArrowEvalBinding.js new file mode 100644 index 0000000000..992bb66a49 --- /dev/null +++ b/test/staging/sm/class/derivedConstructorArrowEvalBinding.js @@ -0,0 +1,21 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +// Make sure it doesn't matter when we make the arrow function +new class extends class { } { + constructor() { + let arrow = () => this; + assertThrowsInstanceOf(arrow, ReferenceError); + super(); + assert.sameValue(arrow(), this); + } +}(); + diff --git a/test/staging/sm/class/derivedConstructorArrowEvalClosed.js b/test/staging/sm/class/derivedConstructorArrowEvalClosed.js new file mode 100644 index 0000000000..67fab9157a --- /dev/null +++ b/test/staging/sm/class/derivedConstructorArrowEvalClosed.js @@ -0,0 +1,20 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +new class extends class { } { + constructor() { + let a1 = () => this; + let a2 = (() => super()); + assertThrowsInstanceOf(a1, ReferenceError); + assert.sameValue(a2(), a1()); + } +}(); + diff --git a/test/staging/sm/class/derivedConstructorArrowEvalEscape.js b/test/staging/sm/class/derivedConstructorArrowEvalEscape.js new file mode 100644 index 0000000000..e9e5d9b60d --- /dev/null +++ b/test/staging/sm/class/derivedConstructorArrowEvalEscape.js @@ -0,0 +1,22 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +let arrow; + +class foo extends class { } { + constructor() { + arrow = () => this; + super(); + } +} + +assert.sameValue(new foo(), arrow()); + diff --git a/test/staging/sm/class/derivedConstructorArrowEvalEscapeUninitialized.js b/test/staging/sm/class/derivedConstructorArrowEvalEscapeUninitialized.js new file mode 100644 index 0000000000..3295acfe7d --- /dev/null +++ b/test/staging/sm/class/derivedConstructorArrowEvalEscapeUninitialized.js @@ -0,0 +1,47 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +let superArrow; +let thisArrow; + +let thisStash; + +class base { + constructor() { + // We run this constructor twice as part of the double init check + if (!thisStash) + thisStash = {prop:45}; + return thisStash; + } +} + +class foo extends base { + constructor() { + superArrow = (()=>super()); + thisArrow = ()=>this; + } +} + +// Populate the arrow function saves. Since we never invoke super(), we throw +assertThrowsInstanceOf(()=>new foo(), ReferenceError); + +// No |this| binding in the closure, yet +assertThrowsInstanceOf(thisArrow, ReferenceError); + +// call super() +superArrow(); + +// Can't call it twice +assertThrowsInstanceOf(superArrow, ReferenceError); + +// Oh look, |this| is populated, now. +assert.sameValue(thisArrow(), thisStash); + diff --git a/test/staging/sm/class/derivedConstructorArrowEvalGetThis.js b/test/staging/sm/class/derivedConstructorArrowEvalGetThis.js new file mode 100644 index 0000000000..dfcf569f19 --- /dev/null +++ b/test/staging/sm/class/derivedConstructorArrowEvalGetThis.js @@ -0,0 +1,19 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +new class extends class { } { + constructor() { + super(); + assert.sameValue(this, (()=>this)()); + assert.sameValue(this, eval("this")); + } +}(); + diff --git a/test/staging/sm/class/derivedConstructorArrowEvalNestedSuperCall.js b/test/staging/sm/class/derivedConstructorArrowEvalNestedSuperCall.js new file mode 100644 index 0000000000..74f5234283 --- /dev/null +++ b/test/staging/sm/class/derivedConstructorArrowEvalNestedSuperCall.js @@ -0,0 +1,43 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +new class extends class { } { + constructor() { + (()=>eval("super()"))(); + assert.sameValue(this, eval("this")); + assert.sameValue(this, (()=>this)()); + } +}(); + +new class extends class { } { + constructor() { + (()=>(()=>super())())(); + assert.sameValue(this, eval("this")); + assert.sameValue(this, (()=>this)()); + } +}(); + +new class extends class { } { + constructor() { + eval("(()=>super())()"); + assert.sameValue(this, eval("this")); + assert.sameValue(this, (()=>this)()); + } +}(); + +new class extends class { } { + constructor() { + eval("eval('super()')"); + assert.sameValue(this, eval("this")); + assert.sameValue(this, (()=>this)()); + } +}(); + diff --git a/test/staging/sm/class/derivedConstructorArrowEvalSuperCall.js b/test/staging/sm/class/derivedConstructorArrowEvalSuperCall.js new file mode 100644 index 0000000000..755145ba44 --- /dev/null +++ b/test/staging/sm/class/derivedConstructorArrowEvalSuperCall.js @@ -0,0 +1,27 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +new class extends class { } { + constructor() { + assert.sameValue(eval("super(); this"), this); + assert.sameValue(this, eval("this")); + assert.sameValue(this, (()=>this)()); + } +}(); + +new class extends class { } { + constructor() { + (()=>super())(); + assert.sameValue(this, eval("this")); + assert.sameValue(this, (()=>this)()); + } +}(); + diff --git a/test/staging/sm/class/derivedConstructorInlining.js b/test/staging/sm/class/derivedConstructorInlining.js new file mode 100644 index 0000000000..054110c69f --- /dev/null +++ b/test/staging/sm/class/derivedConstructorInlining.js @@ -0,0 +1,28 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +// Since we (for now!) can't emit jitcode for derived class statements. Make +// sure we can correctly invoke derived class constructors. + +class foo extends null { + constructor() { + // Anything that tests |this| should throw, so just let it run off the + // end. + } +} + +function intermediate() { + new foo(); +} + +for (let i = 0; i < 1100; i++) + assertThrownErrorContains(intermediate, "this"); + diff --git a/test/staging/sm/class/derivedConstructorName.js b/test/staging/sm/class/derivedConstructorName.js new file mode 100644 index 0000000000..e9f9347dd7 --- /dev/null +++ b/test/staging/sm/class/derivedConstructorName.js @@ -0,0 +1,20 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +class A { + constructor() { } +} + +class B extends A { } + +var b = new B(); +assert.sameValue(b.constructor.name, "B"); + diff --git a/test/staging/sm/class/derivedConstructorReturnPrimitive.js b/test/staging/sm/class/derivedConstructorReturnPrimitive.js new file mode 100644 index 0000000000..091416604e --- /dev/null +++ b/test/staging/sm/class/derivedConstructorReturnPrimitive.js @@ -0,0 +1,24 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +class foo extends null { + constructor() { + // Returning a primitive is a TypeError in derived constructors. This + // ensures that super() can take the return value directly, without + // checking it. Use |null| here, as a tricky check to make sure we + // didn't lump it in with the object check, somehow. + return null; + } +} + +for (let i = 0; i < 1100; i++) + assertThrownErrorContains(() => new foo(), "return"); + diff --git a/test/staging/sm/class/derivedConstructorTDZExplicitThis.js b/test/staging/sm/class/derivedConstructorTDZExplicitThis.js new file mode 100644 index 0000000000..4aed295553 --- /dev/null +++ b/test/staging/sm/class/derivedConstructorTDZExplicitThis.js @@ -0,0 +1,21 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +class foo extends null { + constructor() { + this; + assert.sameValue(false, true); + } +} + +for (let i = 0; i < 1100; i++) + assertThrownErrorContains(() => new foo(), "this"); + diff --git a/test/staging/sm/class/derivedConstructorTDZOffEdge.js b/test/staging/sm/class/derivedConstructorTDZOffEdge.js new file mode 100644 index 0000000000..75555bf7ab --- /dev/null +++ b/test/staging/sm/class/derivedConstructorTDZOffEdge.js @@ -0,0 +1,20 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +class foo extends null { + constructor() { + // Let it fall off the edge and throw. + } +} + +for (let i = 0; i < 1100; i++) + assertThrownErrorContains(() => new foo(), "this"); + diff --git a/test/staging/sm/class/derivedConstructorTDZReturnAliasedTry.js b/test/staging/sm/class/derivedConstructorTDZReturnAliasedTry.js new file mode 100644 index 0000000000..a5547189c4 --- /dev/null +++ b/test/staging/sm/class/derivedConstructorTDZReturnAliasedTry.js @@ -0,0 +1,23 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +class base {} +class derived extends base { + constructor() { + try { + (function() { p1(eval()) }()) + } catch (e) { + return + } + } +} +assertThrowsInstanceOf(()=>new derived(), ReferenceError); + diff --git a/test/staging/sm/class/derivedConstructorTDZReturnObject.js b/test/staging/sm/class/derivedConstructorTDZReturnObject.js new file mode 100644 index 0000000000..6508c24c25 --- /dev/null +++ b/test/staging/sm/class/derivedConstructorTDZReturnObject.js @@ -0,0 +1,22 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +class foo extends null { + constructor() { + // If you return an object, we don't care that |this| went + // uninitialized + return {}; + } +} + +for (let i = 0; i < 1100; i++) + new foo(); + diff --git a/test/staging/sm/class/derivedConstructorTDZReturnTry.js b/test/staging/sm/class/derivedConstructorTDZReturnTry.js new file mode 100644 index 0000000000..22bfb8d47e --- /dev/null +++ b/test/staging/sm/class/derivedConstructorTDZReturnTry.js @@ -0,0 +1,25 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +class base {} +class derived extends base { + constructor() { + try { + return; + } catch (e) { + try { + return; + } catch (e) {} + } + } +} +assertThrowsInstanceOf(() => new derived, ReferenceError); + diff --git a/test/staging/sm/class/derivedConstructorTDZReturnUndefined.js b/test/staging/sm/class/derivedConstructorTDZReturnUndefined.js new file mode 100644 index 0000000000..4791024fe1 --- /dev/null +++ b/test/staging/sm/class/derivedConstructorTDZReturnUndefined.js @@ -0,0 +1,22 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +class foo extends null { + constructor() { + // Explicit returns of undefined should act the same as falling off the + // end of the function. That is to say, they should throw. + return undefined; + } +} + +for (let i = 0; i < 1100; i++) + assertThrownErrorContains(() => new foo(), "this"); + diff --git a/test/staging/sm/class/extendBuiltinConstructors.js b/test/staging/sm/class/extendBuiltinConstructors.js new file mode 100644 index 0000000000..855e1e99e2 --- /dev/null +++ b/test/staging/sm/class/extendBuiltinConstructors.js @@ -0,0 +1,119 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +function testBuiltinInstanceIsInstanceOf(instance, builtin, class_) { + assert.sameValue(instance instanceof class_, true); + assert.sameValue(instance instanceof builtin, true); + + if (builtin === Array) + assert.sameValue(Array.isArray(instance), true); +} + +function testBuiltinInstance(builtin, ...args) { + class sub extends builtin { + constructor(...args) { + super(...args); + this.called = true; + } + } + + let instance = new sub(...args); + assert.sameValue(instance.called, true); + testBuiltinInstanceIsInstanceOf(instance, builtin, sub); +} + +function testBuiltinMultipleSubclasses(builtin, ...args) { + function f(obj, prop) { + assert.sameValue(obj.prop, prop); + } + + class sub1 extends builtin { }; + class sub2 extends builtin { }; + + const prop1 = "A"; + const prop2 = "B"; + + sub1.prototype.prop = prop1; + sub2.prototype.prop = prop2; + + let instance1 = new sub1(...args); + let instance2 = new sub2(...args); + + // Also make sure we get the properties we want with a default constructor + testBuiltinInstanceIsInstanceOf(instance1, builtin, sub1); + + for (let i = 0; i < 10; i++) { + f(instance1, prop1); + f(instance2, prop2); + } +} + +function testBuiltin(builtin, ...args) { + testBuiltinInstance(builtin, ...args); + testBuiltinMultipleSubclasses(builtin, ...args); +} + +function testBuiltinTypedArrays() { + let typedArrays = [Int8Array, + Uint8Array, + Uint8ClampedArray, + Int16Array, + Uint16Array, + Int32Array, + Uint32Array, + Float32Array, + Float64Array]; + + for (let array of typedArrays) { + testBuiltin(array); + testBuiltin(array, 5); + testBuiltin(array, new array()); + testBuiltin(array, new ArrayBuffer()); + } +} + +testBuiltin(Function); +testBuiltin(Object); +testBuiltin(Boolean); +testBuiltin(Error); +testBuiltin(EvalError); +testBuiltin(RangeError); +testBuiltin(ReferenceError); +testBuiltin(SyntaxError); +testBuiltin(TypeError); +testBuiltin(URIError); +testBuiltin(Number); +testBuiltin(Date); +testBuiltin(Date, 5); +testBuiltin(Date, 5, 10); +testBuiltin(RegExp); +testBuiltin(RegExp, /Regexp Argument/); +testBuiltin(RegExp, "String Argument"); +testBuiltin(Map); +testBuiltin(Set); +testBuiltin(WeakMap); +testBuiltin(WeakSet); +testBuiltin(ArrayBuffer); +testBuiltinTypedArrays(); +testBuiltin(DataView, new ArrayBuffer()); +testBuiltin(DataView, new (createNewGlobal().ArrayBuffer)()); +testBuiltin(String); +testBuiltin(Array); +testBuiltin(Array, 15); +testBuiltin(Array, 3.0); +testBuiltin(Array, "non-length one-arg"); +testBuiltin(Array, 5, 10, 15, "these are elements"); +// More Promise subclassing tests can be found in non262/Promise/promise-subclassing.js +testBuiltin(Promise, _=>{}); + +if (this.SharedArrayBuffer) + testBuiltin(SharedArrayBuffer); + diff --git a/test/staging/sm/class/fields-instance-class-name-binding-eval.js b/test/staging/sm/class/fields-instance-class-name-binding-eval.js new file mode 100644 index 0000000000..643719a2b5 --- /dev/null +++ b/test/staging/sm/class/fields-instance-class-name-binding-eval.js @@ -0,0 +1,49 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +// Instance field initialisers can access the inner name binding for class definitions. +{ + class C { + field = eval("C"); + } + assert.sameValue(new C().field, C); +} +{ + let C = class Inner { + field = eval("Inner"); + }; + assert.sameValue(new C().field, C); +} + +// Instance field initialiser expressions always resolve the inner name binding. +{ + class C { + field = () => eval("C"); + } + assert.sameValue(new C().field(), C); + + const D = C; + C = null; + + assert.sameValue(new D().field(), D); +} +{ + let C = class Inner { + field = () => eval("Inner"); + } + assert.sameValue(new C().field(), C); + + const D = C; + C = null; + + assert.sameValue(new D().field(), D); +} + diff --git a/test/staging/sm/class/fields-instance-class-name-binding.js b/test/staging/sm/class/fields-instance-class-name-binding.js new file mode 100644 index 0000000000..0fc07f1bb0 --- /dev/null +++ b/test/staging/sm/class/fields-instance-class-name-binding.js @@ -0,0 +1,49 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +// Instance field initialisers can access the inner name binding for class definitions. +{ + class C { + field = C; + } + assert.sameValue(new C().field, C); +} +{ + let C = class Inner { + field = Inner; + }; + assert.sameValue(new C().field, C); +} + +// Instance field initialiser expressions always resolve the inner name binding. +{ + class C { + field = () => C; + } + assert.sameValue(new C().field(), C); + + const D = C; + C = null; + + assert.sameValue(new D().field(), D); +} +{ + let C = class Inner { + field = () => Inner; + } + assert.sameValue(new C().field(), C); + + const D = C; + C = null; + + assert.sameValue(new D().field(), D); +} + diff --git a/test/staging/sm/class/fields-static-class-name-binding-eval.js b/test/staging/sm/class/fields-static-class-name-binding-eval.js new file mode 100644 index 0000000000..50582ce56b --- /dev/null +++ b/test/staging/sm/class/fields-static-class-name-binding-eval.js @@ -0,0 +1,68 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +// Static field initialisers can access the inner name binding for class definitions. +{ + class C { + static field = eval("C"); + } + assert.sameValue(C.field, C); +} +{ + let C = class Inner { + static field = eval("Inner"); + }; + assert.sameValue(C.field, C); +} + +// Static field initialisers can't access the outer name binding for class expressions +// before it has been initialised. +{ + assertThrowsInstanceOf(() => { + let C = class { + static field = eval("C"); + }; + }, ReferenceError); +} + +// Static field initialisers can access the outer name binding for class expressions after +// the binding has been initialised +{ + let C = class { + static field = () => eval("C"); + }; + assert.sameValue(C.field(), C); +} + +// Static field initialiser expressions always resolve the inner name binding. +{ + class C { + static field = () => eval("C"); + } + assert.sameValue(C.field(), C); + + const D = C; + C = null; + + assert.sameValue(D.field(), D); +} +{ + let C = class Inner { + static field = () => eval("Inner"); + } + assert.sameValue(C.field(), C); + + const D = C; + C = null; + + assert.sameValue(D.field(), D); +} + diff --git a/test/staging/sm/class/fields-static-class-name-binding.js b/test/staging/sm/class/fields-static-class-name-binding.js new file mode 100644 index 0000000000..094aa87bfc --- /dev/null +++ b/test/staging/sm/class/fields-static-class-name-binding.js @@ -0,0 +1,68 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +// Static field initialisers can access the inner name binding for class definitions. +{ + class C { + static field = C; + } + assert.sameValue(C.field, C); +} +{ + let C = class Inner { + static field = Inner; + }; + assert.sameValue(C.field, C); +} + +// Static field initialisers can't access the outer name binding for class expressions +// before it has been initialised. +{ + assertThrowsInstanceOf(() => { + let C = class { + static field = C; + }; + }, ReferenceError); +} + +// Static field initialisers can access the outer name binding for class expressions after +// the binding has been initialised +{ + let C = class { + static field = () => C; + }; + assert.sameValue(C.field(), C); +} + +// Static field initialiser expressions always resolve the inner name binding. +{ + class C { + static field = () => C; + } + assert.sameValue(C.field(), C); + + const D = C; + C = null; + + assert.sameValue(D.field(), D); +} +{ + let C = class Inner { + static field = () => Inner; + } + assert.sameValue(C.field(), C); + + const D = C; + C = null; + + assert.sameValue(D.field(), D); +} + diff --git a/test/staging/sm/class/geterNoExprClosure.js b/test/staging/sm/class/geterNoExprClosure.js new file mode 100644 index 0000000000..2c447c27bf --- /dev/null +++ b/test/staging/sm/class/geterNoExprClosure.js @@ -0,0 +1,29 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +// getter/setter with expression closure is allowed only in object literal. + +assertThrowsInstanceOf(() => eval(` + class foo { + constructor() {} + + get a() 1 + } +`), SyntaxError); + +assertThrowsInstanceOf(() => eval(` + class foo { + constructor() {} + + set a(v) 1 + } +`), SyntaxError); + diff --git a/test/staging/sm/class/innerBinding.js b/test/staging/sm/class/innerBinding.js new file mode 100644 index 0000000000..ea0e4707a7 --- /dev/null +++ b/test/staging/sm/class/innerBinding.js @@ -0,0 +1,95 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +// Named class definitions should create an immutable inner binding. +// Since all code in classes is in strict mode, attempts to mutate it +// should throw. +class Foof { constructor() { }; tryBreak() { Foof = 4; } } +for (let result of [Foof, class Bar { constructor() { }; tryBreak() { Bar = 4; } }]) + assertThrowsInstanceOf(() => new result().tryBreak(), TypeError); + +{ + class foo { constructor() { }; tryBreak() { foo = 4; } } + for (let result of [foo, class Bar { constructor() { }; tryBreak() { Bar = 4 } }]) + assertThrowsInstanceOf(() => new result().tryBreak(), TypeError); +} + +// TDZ applies to inner bindings +assertThrowsInstanceOf(()=>eval(`class Bar { + constructor() { }; + [Bar] () { }; + }`), ReferenceError); + +assertThrowsInstanceOf(()=>eval(`(class Bar { + constructor() { }; + [Bar] () { }; + })`), ReferenceError); + +// There's no magic "inner binding" global +{ + class Foo { + constructor() { }; + test() { + class Bar { + constructor() { } + test() { return Foo === Bar } + } + return new Bar().test(); + } + } + assert.sameValue(new Foo().test(), false); + assert.sameValue(new class foo { + constructor() { }; + test() { + return new class bar { + constructor() { } + test() { return foo === bar } + }().test(); + } + }().test(), false); +} + +// Inner bindings are shadowable +{ + class Foo { + constructor() { } + test(Foo) { return Foo; } + } + assert.sameValue(new Foo().test(4), 4); + assert.sameValue(new class foo { + constructor() { }; + test(foo) { return foo } + }().test(4), 4); +} + +// Inner bindings in expressions should shadow even existing names. +class Foo { constructor() { } static method() { throw new Error("NO!"); } } +assert.sameValue(new class Foo { + constructor() { }; + static method() { return 4; }; + test() { return Foo.method(); } + }().test(), 4); + +// The outer binding is distinct from the inner one +{ + let orig_X; + + class X { + constructor() { } + f() { assert.sameValue(X, orig_X); } + } + + orig_X = X; + X = 13; + assert.sameValue(X, 13); + new orig_X().f(); +} + diff --git a/test/staging/sm/class/methDefn.js b/test/staging/sm/class/methDefn.js new file mode 100644 index 0000000000..4629e936fb --- /dev/null +++ b/test/staging/sm/class/methDefn.js @@ -0,0 +1,213 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +var BUGNUMBER = 924672; +var summary = 'Method Definitions' + +print(BUGNUMBER + ": " + summary); + +// Function definitions. +function syntaxError (script) { + try { + Function(script); + } catch (e) { + if (e instanceof SyntaxError) { + return; + } + } + throw new Error('Expected syntax error: ' + script); +} + + +// Tests begin. + +syntaxError("{a(){}}"); +syntaxError("b = {a("); +syntaxError("b = {a)"); +syntaxError("b = {a(}"); +syntaxError("b = {a)}"); +syntaxError("b = {a()"); +syntaxError("b = {a()}"); +syntaxError("b = {a(){}"); +syntaxError("b = {a){}"); +syntaxError("b = {a}}"); +syntaxError("b = {a{}}"); +syntaxError("b = {a({}}"); +syntaxError("b = {a@(){}}"); +syntaxError("b = {a() => 0}"); +syntaxError("b = {a() void 0}"); +syntaxError("b = {a() 1}"); +syntaxError("b = {a() false}"); + +b = {a(){return 5;}}; +assert.sameValue(b.a(), 5); + +b = {a(){return "hey";}}; +assert.sameValue(b.a(), "hey"); + +b = {a(){return arguments;}}; +assert.sameValue(b.a().length, 0); + +b = {a(c){return arguments;}}; +assert.sameValue(b.a().length, 0); + +b = {a(c){return arguments;}}; +assert.sameValue(b.a(1).length, 1); + +b = {a(c){return arguments;}}; +assert.sameValue(b.a(1)[0], 1); + +b = {a(c,d){return arguments;}}; +assert.sameValue(b.a(1,2).length, 2); + +b = {a(c,d){return arguments;}}; +assert.sameValue(b.a(1,2)[0], 1); + +b = {a(c,d){return arguments;}}; +assert.sameValue(b.a(1,2)[1], 2); + +// Methods along with other properties. +syntaxError("b = {,a(){}}"); +syntaxError("b = {@,a(){}}"); +syntaxError("b = {a(){},@}"); +syntaxError("b = {a : 5 , (){}}"); +syntaxError("b = {a : 5@ , a(){}}"); +syntaxError("b = {a : , a(){}}"); +syntaxError("b = {a : 5, a()}}"); +syntaxError("b = {a : 5, a({}}"); +syntaxError("b = {a : 5, a){}}"); +syntaxError("b = {a : 5, a(){}"); +var c = "d"; +b = { a : 5, + [c] : "hey", + e() {return 6;}, + get f() {return 7;}, + set f(g) {this.h = 9;} +} +assert.sameValue(b.a, 5); +assert.sameValue(b.d, "hey"); +assert.sameValue(b.e(), 6); +assert.sameValue(b.f, 7); +assert.sameValue(b.h !== 9, true); +b.f = 15; +assert.sameValue(b.h, 9); + + +var i = 0; +var a = { + foo0 : function (){return 0;}, + ["foo" + ++i](){return 1;}, + ["foo" + ++i](){return 2;}, + ["foo" + ++i](){return 3;}, + foo4(){return 4;} +}; +assert.sameValue(a.foo0(), 0); +assert.sameValue(a.foo1(), 1); +assert.sameValue(a.foo2(), 2); +assert.sameValue(a.foo3(), 3); +assert.sameValue(a.foo4(), 4); + +// Symbols. +var unique_sym = Symbol("1"), registered_sym = Symbol.for("2"); +a = { [unique_sym](){return 2;}, [registered_sym](){return 3;} }; +assert.sameValue(a[unique_sym](), 2); +assert.sameValue(a[registered_sym](), 3); + +// Method characteristics. +a = { b(){ return 4;} }; +b = Object.getOwnPropertyDescriptor(a, "b"); +assert.sameValue(b.configurable, true); +assert.sameValue(b.enumerable, true); +assert.sameValue(b.writable, true); +assert.sameValue(b.value(), 4); + +// prototype property +assert.sameValue(a.b.prototype, undefined); +assert.sameValue(a.b.hasOwnProperty("prototype"), false); + +// Defining several methods using eval. +var code = "({"; +for (i = 0; i < 1000; i++) + code += "['foo' + " + i + "]() {return 'ok';}, " +code += "['bar']() {return 'all ok'}});"; +var obj = eval(code); +for (i = 0; i < 1000; i++) + assert.sameValue(obj["foo" + i](), "ok"); +assert.sameValue(obj["bar"](), "all ok"); + +// this +var obj = { + a : "hey", + meth(){return this.a;} +} +assert.sameValue(obj.meth(), "hey"); + +// Inheritance +var obj2 = Object.create(obj); +assert.sameValue(obj2.meth(), "hey"); + +var obj = { + a() { + return "hey"; + } +} +assert.sameValue(obj.a.call(), "hey"); + +// Duplicates +var obj = { + meth : 3, + meth() { return 4; }, + meth() { return 5; } +} +assert.sameValue(obj.meth(), 5); + +var obj = { + meth() { return 4; }, + meth() { return 5; }, + meth : 3 +} +assert.sameValue(obj.meth, 3); +assertThrowsInstanceOf(function() {obj.meth();}, TypeError); + +// Strict mode +a = {b(c){"use strict";return c;}}; +assert.sameValue(a.b(1), 1); +a = {["b"](c){"use strict";return c;}}; +assert.sameValue(a.b(1), 1); + +// Allow strict-reserved names as methods in objects. +// (Bug 1124362) +a = { static() { return 4; } }; +assert.sameValue(a.static(), 4); + +a = { get static() { return 4; } }; +assert.sameValue(a.static, 4); + +a = { set static(x) { assert.sameValue(x, 4); } }; +a.static = 4; + +function testStrictMode() { + "use strict"; + var obj = { static() { return 4; } }; + assert.sameValue(obj.static(), 4); + + obj = { get static() { return 4; } }; + assert.sameValue(obj.static, 4); + + obj = { set static(x) { assert.sameValue(x, 4); } }; + obj.static = 4; +} +testStrictMode(); + +// Tests provided by benvie in the bug to distinguish from ES5 desugar. +assert.sameValue(({ method() {} }).method.name, "method"); +assertThrowsInstanceOf(function() {({ method() { method() } }).method() }, ReferenceError); + diff --git a/test/staging/sm/class/methDefnGen.js b/test/staging/sm/class/methDefnGen.js new file mode 100644 index 0000000000..771ada50ec --- /dev/null +++ b/test/staging/sm/class/methDefnGen.js @@ -0,0 +1,92 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +var BUGNUMBER = 924672; +var summary = 'Method Definitions - Generators' + +print(BUGNUMBER + ": " + summary); + +// Function definitions. +function syntaxError (script) { + try { + Function(script); + } catch (e) { + if (e instanceof SyntaxError) { + return; + } + } + throw new Error('Expected syntax error: ' + script); +} + + +// Tests begin. + +syntaxError("{*a(){}}"); +syntaxError("b = {*(){}"); +syntaxError("b = {*{}"); +syntaxError("b = {*){}"); +syntaxError("b = {*({}"); +syntaxError("b = {*(){"); +syntaxError("b = {*()}"); +syntaxError("b = {*a("); +syntaxError("b = {*a)"); +syntaxError("b = {*a(}"); +syntaxError("b = {*a)}"); +syntaxError("b = {*a()"); +syntaxError("b = {*a()}"); +syntaxError("b = {*a(){}"); +syntaxError("b = {*a){}"); +syntaxError("b = {*a}}"); +syntaxError("b = {*a{}}"); +syntaxError("b = {*a({}}"); +syntaxError("b = {*a@(){}}"); +syntaxError("b = {*@(){}}"); +syntaxError("b = {*get a(){}}"); +syntaxError("b = {get *a(){}}"); +syntaxError("b = {get a*(){}}"); +syntaxError("b = {*set a(c){}}"); +syntaxError("b = {set *a(c){}}"); +syntaxError("b = {set a*(c){}}"); +syntaxError("b = {*a : 1}"); +syntaxError("b = {a* : 1}"); +syntaxError("b = {a :* 1}"); +syntaxError("b = {a*(){}}"); + +// Generator methods. +b = { * g() { + var a = { [yield 1]: 2, [yield 2]: 3}; + return a; +} } +var it = b.g(); +var next = it.next(); +assert.sameValue(next.done, false); +assert.sameValue(next.value, 1); +next = it.next("hello"); +assert.sameValue(next.done, false); +assert.sameValue(next.value, 2); +next = it.next("world"); +assert.sameValue(next.done, true); +assert.sameValue(next.value.hello, 2); +assert.sameValue(next.value.world, 3); + +// prototype property +assert.sameValue(b.g.hasOwnProperty("prototype"), true); + +// Strict mode +a = {*b(c){"use strict";yield c;}}; +assert.sameValue(a.b(1).next().value, 1); +a = {*["b"](c){"use strict";return c;}}; +assert.sameValue(a.b(1).next().value, 1); + +// Generators should not have [[Construct]] +a = {*g() { yield 1; }} +assertThrowsInstanceOf(() => { new a.g }, TypeError); + diff --git a/test/staging/sm/class/methodInstallation.js b/test/staging/sm/class/methodInstallation.js new file mode 100644 index 0000000000..3601b5e946 --- /dev/null +++ b/test/staging/sm/class/methodInstallation.js @@ -0,0 +1,110 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [deepEqual.js, sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +// Do the things we write in classes actually appear as they are supposed to? + +var methodCalled; +var getterCalled; +var setterCalled; +var constructorCalled; +var staticMethodCalled; +var staticGetterCalled; +var staticSetterCalled; +class testClass { + constructor() { constructorCalled = true; } + __proto__() { methodCalled = true } + get getter() { getterCalled = true; } + set setter(x) { setterCalled = true; } + static staticMethod() { staticMethodCalled = true; } + static get staticGetter() { staticGetterCalled = true; } + static set staticSetter(x) { staticSetterCalled = true; } + *[Symbol.iterator]() { yield "cow"; yield "pig"; } +} + +for (let a of [testClass, + class { + constructor() { constructorCalled = true; } + __proto__() { methodCalled = true } + get getter() { getterCalled = true; } + set setter(x) { setterCalled = true; } + static staticMethod() { staticMethodCalled = true; } + static get staticGetter() { staticGetterCalled = true; } + static set staticSetter(x) { staticSetterCalled = true; } + *[Symbol.iterator]() { yield "cow"; yield "pig"; } + }]) { + + methodCalled = false; + getterCalled = false; + setterCalled = false; + constructorCalled = false; + staticMethodCalled = false; + staticGetterCalled = false; + staticSetterCalled = false; + + var aConstDesc = Object.getOwnPropertyDescriptor(a.prototype, "constructor"); + assert.sameValue(aConstDesc.writable, true); + assert.sameValue(aConstDesc.configurable, true); + assert.sameValue(aConstDesc.enumerable, false); + new aConstDesc.value(); + assert.sameValue(constructorCalled, true); + + // __proto__ is just an identifier for classes. No prototype changes are made. + assert.sameValue(Object.getPrototypeOf(a.prototype), Object.prototype); + var aMethDesc = Object.getOwnPropertyDescriptor(a.prototype, "__proto__"); + assert.sameValue(aMethDesc.writable, true); + assert.sameValue(aMethDesc.configurable, true); + assert.sameValue(aMethDesc.enumerable, false); + aMethDesc.value(); + assert.sameValue(methodCalled, true); + + var aGetDesc = Object.getOwnPropertyDescriptor(a.prototype, "getter"); + assert.sameValue(aGetDesc.configurable, true); + assert.sameValue(aGetDesc.enumerable, false); + aGetDesc.get(); + assertThrowsInstanceOf(() => new aGetDesc.get, TypeError); + assert.sameValue(getterCalled, true); + + var aSetDesc = Object.getOwnPropertyDescriptor(a.prototype, "setter"); + assert.sameValue(aSetDesc.configurable, true); + assert.sameValue(aSetDesc.enumerable, false); + aSetDesc.set(); + assertThrowsInstanceOf(() => new aSetDesc.set, TypeError); + assert.sameValue(setterCalled, true); + assert.deepEqual(aSetDesc, Object.getOwnPropertyDescriptor(a.prototype, "setter")); + + assert.sameValue(Object.getOwnPropertyDescriptor(new a(), "staticMethod"), undefined); + var aStaticMethDesc = Object.getOwnPropertyDescriptor(a, "staticMethod"); + assert.sameValue(aStaticMethDesc.configurable, true); + assert.sameValue(aStaticMethDesc.enumerable, false); + assert.sameValue(aStaticMethDesc.writable, true); + aStaticMethDesc.value(); + assertThrowsInstanceOf(() => new aStaticMethDesc.value, TypeError); + assert.sameValue(staticMethodCalled, true); + + assert.sameValue(Object.getOwnPropertyDescriptor(new a(), "staticGetter"), undefined); + var aStaticGetDesc = Object.getOwnPropertyDescriptor(a, "staticGetter"); + assert.sameValue(aStaticGetDesc.configurable, true); + assert.sameValue(aStaticGetDesc.enumerable, false); + aStaticGetDesc.get(); + assertThrowsInstanceOf(() => new aStaticGetDesc.get, TypeError); + assert.sameValue(staticGetterCalled, true); + + assert.sameValue(Object.getOwnPropertyDescriptor(new a(), "staticSetter"), undefined); + var aStaticSetDesc = Object.getOwnPropertyDescriptor(a, "staticSetter"); + assert.sameValue(aStaticSetDesc.configurable, true); + assert.sameValue(aStaticSetDesc.enumerable, false); + aStaticSetDesc.set(); + assertThrowsInstanceOf(() => new aStaticSetDesc.set, TypeError); + assert.sameValue(staticSetterCalled, true); + + assert.sameValue([...new a()].join(), "cow,pig"); +} + diff --git a/test/staging/sm/class/methodName.js b/test/staging/sm/class/methodName.js new file mode 100644 index 0000000000..f031132a79 --- /dev/null +++ b/test/staging/sm/class/methodName.js @@ -0,0 +1,50 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +class TestClass { + get getter() { } + set setter(x) { } + method() { } + + static get staticGetter() { } + static set staticSetter(x) { } + static staticMethod() { } + + get 1() { } + set 2(v) { } + 3() { } + + static get 4() { } + static set 5(x) { } + static 6() { } +} + +function name(obj, property, get) { + let desc = Object.getOwnPropertyDescriptor(obj, property); + return (get ? desc.get : desc.set).name; +} + +assert.sameValue(name(TestClass.prototype, "getter", true), "get getter"); +assert.sameValue(name(TestClass.prototype, "setter", false), "set setter"); +assert.sameValue(TestClass.prototype.method.name, "method"); + +assert.sameValue(name(TestClass, "staticGetter", true), "get staticGetter"); +assert.sameValue(name(TestClass, "staticSetter", false), "set staticSetter"); +assert.sameValue(TestClass.staticMethod.name, "staticMethod"); + +assert.sameValue(name(TestClass.prototype, "1", true), "get 1"); +assert.sameValue(name(TestClass.prototype, "2", false), "set 2"); +assert.sameValue(TestClass.prototype[3].name, "3"); + +assert.sameValue(name(TestClass, "4", true), "get 4"); +assert.sameValue(name(TestClass, "5", false), "set 5"); +assert.sameValue(TestClass[6].name, "6"); + diff --git a/test/staging/sm/class/methodOverwrites.js b/test/staging/sm/class/methodOverwrites.js new file mode 100644 index 0000000000..db5f9baf78 --- /dev/null +++ b/test/staging/sm/class/methodOverwrites.js @@ -0,0 +1,89 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +// Ensure that we can overwrite methods when more tha one is present. +{ + var result = 0; + // Regardless of order, the constructor is overridden by any CPN, because it's + // processed seperately. + class a { ["constructor"]() { result += 1; }; constructor() { result += 2; } } + var aInst = new a(); + assert.sameValue(result, 2); + aInst.constructor(); + assert.sameValue(result, 3); + + class b { constructor() { result += 2; } ["constructor"]() { result += 1; }; } + var bInst = new b(); + assert.sameValue(result, 5); + bInst.constructor(); + assert.sameValue(result, 6); + + class c { constructor() { } method() { result += 1 } get method() { result += 2 } } + new c().method; + assert.sameValue(result, 8); + + class d { constructor() { } get method() { result += 1 } method() { result += 2 } } + new d().method(); + assert.sameValue(result, 10); + + // getters and setter should not overwrite each other, but merge cleanly. + class e { constructor() { } get method() { result += 1 } set method(x) { } } + new e().method; + assert.sameValue(result, 11); + + class f { constructor() { } + set method(x) { throw "NO"; } + method() { throw "NO" } + get method() { return new Function("result += 1"); } + } + new f().method(); + assert.sameValue(result, 12); +} + +// Try again with expressions. +{ + var result = 0; + // Regardless of order, the constructor is overridden by any CPN, because it's + // processed seperately. + let a = class { ["constructor"]() { result += 1; }; constructor() { result += 2; } }; + var aInst = new a(); + assert.sameValue(result, 2); + aInst.constructor(); + assert.sameValue(result, 3); + + let b = class { constructor() { result += 2; } ["constructor"]() { result += 1; }; }; + var bInst = new b(); + assert.sameValue(result, 5); + bInst.constructor(); + assert.sameValue(result, 6); + + let c = class { constructor() { } method() { result += 1 } get method() { result += 2 } }; + new c().method; + assert.sameValue(result, 8); + + let d = class { constructor() { } get method() { result += 1 } method() { result += 2 } }; + new d().method(); + assert.sameValue(result, 10); + + // getters and setter should not overwrite each other, but merge cleanly. + let e = class { constructor() { } get method() { result += 1 } set method(x) { } }; + new e().method; + assert.sameValue(result, 11); + + let f = class { constructor() { } + set method(x) { throw "NO"; } + method() { throw "NO" } + get method() { return new Function("result += 1"); } + }; + new f().method(); + assert.sameValue(result, 12); +} + diff --git a/test/staging/sm/class/methodsPrototype.js b/test/staging/sm/class/methodsPrototype.js new file mode 100644 index 0000000000..5957ead8ca --- /dev/null +++ b/test/staging/sm/class/methodsPrototype.js @@ -0,0 +1,48 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +class TestClass { + constructor() { } + method() { } + get getter() { } + set setter(x) { } + *generator() { } + static staticMethod() { } + static get staticGetter() { } + static set staticSetter(x) { } + static *staticGenerator() { } +} + +var test = new TestClass(); + +var hasPrototype = [ + test.constructor, + test.generator, + TestClass.staticGenerator +] + +for (var fun of hasPrototype) { + assert.sameValue(fun.hasOwnProperty('prototype'), true); +} + +var hasNoPrototype = [ + test.method, + Object.getOwnPropertyDescriptor(test.__proto__, 'getter').get, + Object.getOwnPropertyDescriptor(test.__proto__, 'setter').set, + TestClass.staticMethod, + Object.getOwnPropertyDescriptor(TestClass, 'staticGetter').get, + Object.getOwnPropertyDescriptor(TestClass, 'staticSetter').set, +] + +for (var fun of hasNoPrototype) { + assert.sameValue(fun.hasOwnProperty('prototype'), false); +} + diff --git a/test/staging/sm/class/newTargetArgumentsIntact.js b/test/staging/sm/class/newTargetArgumentsIntact.js new file mode 100644 index 0000000000..397da5d0fb --- /dev/null +++ b/test/staging/sm/class/newTargetArgumentsIntact.js @@ -0,0 +1,53 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +// Since we put new.target at the end of the arguments vector, ensrue that it +// doesn't interact with the arguments object + +var argsContent; + +function argsWithNewTarget(foo) { + assert.sameValue(arguments.length, argsContent.length); + for (let i = 0; i < arguments.length; i++) + assert.sameValue(arguments[i], argsContent[i]); + let nt = new.target; + + // Assigning to the arguments object shouldn't infect new.target, either + arguments[arguments.length] = 42; + assert.sameValue(new.target, nt); +} + +// Test constructing invocations, with under and overflow +argsContent = []; +for (let i = 0; i < 100; i++) + new argsWithNewTarget(); + +argsContent = [1]; +for (let i = 0; i < 100; i++) + new argsWithNewTarget(1); + +argsContent = [1,2,3]; +for (let i = 0; i < 100; i++) + new argsWithNewTarget(1, 2, 3); + +// Test spreadnew as well. +argsContent = []; +for (let i = 0; i < 100; i++) + new argsWithNewTarget(...[]); + +argsContent = [1]; +for (let i = 0; i < 100; i++) + new argsWithNewTarget(...[1]); + +argsContent = [1,2,3]; +for (let i = 0; i < 100; i++) + new argsWithNewTarget(...[1,2,3]); + diff --git a/test/staging/sm/class/newTargetArrow.js b/test/staging/sm/class/newTargetArrow.js new file mode 100644 index 0000000000..6987b57b8f --- /dev/null +++ b/test/staging/sm/class/newTargetArrow.js @@ -0,0 +1,33 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +// new.target is valid in any arrow function not in a global context. +new Function('(() => new.target)()'); + +// It's also good inside eval, but not global eval +assertThrowsInstanceOf(() => eval('() => new.target'), SyntaxError); + +function assertNewTarget(expected) { + assert.sameValue((()=>new.target)(), expected); + assert.sameValue(eval('()=>new.target')(), expected); + + // Make sure that arrow functions can escape their original context and + // still get the right answer. + return (() => new.target); +} + +const ITERATIONS = 550; +for (let i = 0; i < ITERATIONS; i++) + assert.sameValue(assertNewTarget(undefined)(), undefined); + +for (let i = 0; i < ITERATIONS; i++) + assert.sameValue(new assertNewTarget(assertNewTarget)(), assertNewTarget); + diff --git a/test/staging/sm/class/newTargetBound.js b/test/staging/sm/class/newTargetBound.js new file mode 100644 index 0000000000..f227ee1b74 --- /dev/null +++ b/test/staging/sm/class/newTargetBound.js @@ -0,0 +1,25 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +function boundTarget(expected) { + assert.sameValue(new.target, expected); +} + +let bound = boundTarget.bind(undefined); + +const TEST_ITERATIONS = 550; + +for (let i = 0; i < TEST_ITERATIONS; i++) + bound(undefined); + +for (let i = 0; i < TEST_ITERATIONS; i++) + new bound(boundTarget); + diff --git a/test/staging/sm/class/newTargetCCW.js b/test/staging/sm/class/newTargetCCW.js new file mode 100644 index 0000000000..98c6370287 --- /dev/null +++ b/test/staging/sm/class/newTargetCCW.js @@ -0,0 +1,19 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +// Make sure we wrap the new target on CCW construct calls. +var g = createNewGlobal(); + +let f = g.eval('(function (expected) { this.accept = new.target === expected; })'); + +for (let i = 0; i < 1100; i++) + assert.sameValue(new f(f).accept, true); + diff --git a/test/staging/sm/class/newTargetDVG.js b/test/staging/sm/class/newTargetDVG.js new file mode 100644 index 0000000000..dcf78dd3ae --- /dev/null +++ b/test/staging/sm/class/newTargetDVG.js @@ -0,0 +1,16 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +function thunk() { + new.target(); +} +assertThrownErrorContains(thunk, "new.target"); + diff --git a/test/staging/sm/class/newTargetDefaults.js b/test/staging/sm/class/newTargetDefaults.js new file mode 100644 index 0000000000..84de0695cf --- /dev/null +++ b/test/staging/sm/class/newTargetDefaults.js @@ -0,0 +1,34 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +// Check that new.target works properly in defaults. + +function check(expected, actual = new.target) { assert.sameValue(actual, expected); } +new check(check); +check(undefined); + +let evaldCheck = eval("(" + check.toString() + ")"); +new evaldCheck(evaldCheck); +evaldCheck(undefined); + +function testInFunction() { + function checkInFunction(expected, actual = new.target) { assert.sameValue(actual, expected); } + new checkInFunction(checkInFunction); + checkInFunction(undefined); + + let evaldCheckInFunction = eval("(" + checkInFunction.toString() + ")"); + new evaldCheckInFunction(evaldCheckInFunction); + evaldCheckInFunction(undefined); +} + +testInFunction(); +new testInFunction(); + diff --git a/test/staging/sm/class/newTargetDirectInvoke.js b/test/staging/sm/class/newTargetDirectInvoke.js new file mode 100644 index 0000000000..a6023cd7ea --- /dev/null +++ b/test/staging/sm/class/newTargetDirectInvoke.js @@ -0,0 +1,59 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +// new.target is valid inside Function() invocations +var func = new Function("new.target"); + +// Note that this will also test new.target in ion inlines. When the toplevel +// script is compiled, assertNewTarget will be inlined. +function assertNewTarget(expected, unused) { assert.sameValue(new.target, expected); } + +// Test non-constructing invocations, with arg underflow, overflow, and correct +// numbers +for (let i = 0; i < 100; i++) + assertNewTarget(undefined, null); + +for (let i = 0; i < 100; i++) + assertNewTarget(undefined); + +for (let i = 0; i < 100; i++) + assertNewTarget(undefined, null, 1); + +// Test spread-call +for (let i = 0; i < 100; i++) + assertNewTarget(...[undefined]); + +for (let i = 0; i < 100; i++) + assertNewTarget(...[undefined, null]); + +for (let i = 0; i < 100; i++) + assertNewTarget(...[undefined, null, 1]); + +// Test constructing invocations, again with under and overflow +for (let i = 0; i < 100; i++) + new assertNewTarget(assertNewTarget, null); + +for (let i = 0; i < 100; i++) + new assertNewTarget(assertNewTarget); + +for (let i = 0; i < 100; i++) + new assertNewTarget(assertNewTarget, null, 1); + +// Test spreadnew as well. +for (let i = 0; i < 100; i++) + new assertNewTarget(...[assertNewTarget]); + +for (let i = 0; i < 100; i++) + new assertNewTarget(...[assertNewTarget, null]); + +for (let i = 0; i < 100; i++) + new assertNewTarget(...[assertNewTarget, null, 1]); + diff --git a/test/staging/sm/class/newTargetEval.js b/test/staging/sm/class/newTargetEval.js new file mode 100644 index 0000000000..26b649f616 --- /dev/null +++ b/test/staging/sm/class/newTargetEval.js @@ -0,0 +1,49 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +// Eval of new.target is invalid outside functions. +try { + eval('new.target'); + assert.sameValue(false, true); +} catch (e) { + if (!(e instanceof SyntaxError)) + throw e; +} + +// new.target is invalid inside eval inside top-level arrow functions +assertThrowsInstanceOf(() => eval('new.target'), SyntaxError); + +// new.target is invalid inside indirect eval. +let ieval = eval; +try { + (function () { return ieval('new.target'); })(); + assert.sameValue(false, true); +} catch (e) { + if (!(e instanceof SyntaxError)) + throw e; +} + +function assertNewTarget(expected) { + assert.sameValue(eval('new.target'), expected); + assert.sameValue((()=>eval('new.target'))(), expected); + + // Also test nestings "by induction" + assert.sameValue(eval('eval("new.target")'), expected); + assert.sameValue(eval("eval('eval(`new.target`)')"), expected); +} + +const ITERATIONS = 550; +for (let i = 0; i < ITERATIONS; i++) + assertNewTarget(undefined); + +for (let i = 0; i < ITERATIONS; i++) + new assertNewTarget(assertNewTarget); + diff --git a/test/staging/sm/class/newTargetGenerators.js b/test/staging/sm/class/newTargetGenerators.js new file mode 100644 index 0000000000..07aadf3f63 --- /dev/null +++ b/test/staging/sm/class/newTargetGenerators.js @@ -0,0 +1,23 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +function *generatorNewTarget(expected) { + assert.sameValue(new.target, expected); + assert.sameValue(eval('new.target'), expected); + assert.sameValue((() => new.target)(), expected); + yield (() => new.target); +} + +const ITERATIONS = 25; + +for (let i = 0; i < ITERATIONS; i++) + assert.sameValue(generatorNewTarget(undefined).next().value(), undefined); + diff --git a/test/staging/sm/class/newTargetMethods.js b/test/staging/sm/class/newTargetMethods.js new file mode 100644 index 0000000000..4af7f32242 --- /dev/null +++ b/test/staging/sm/class/newTargetMethods.js @@ -0,0 +1,60 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +// Just like newTargetDirectInvoke, except to prove it works in functions +// defined with method syntax as well. Note that methods, getters, and setters +// are not constructible. + +let ol = { + olTest(arg) { assert.sameValue(arg, 4); assert.sameValue(new.target, undefined); }, + get ol() { assert.sameValue(new.target, undefined); }, + set ol(arg) { assert.sameValue(arg, 4); assert.sameValue(new.target, undefined); } +} + +class cl { + constructor() { assert.sameValue(new.target, cl); } + clTest(arg) { assert.sameValue(arg, 4); assert.sameValue(new.target, undefined); } + get cl() { assert.sameValue(new.target, undefined); } + set cl(arg) { assert.sameValue(arg, 4); assert.sameValue(new.target, undefined); } + + static staticclTest(arg) { assert.sameValue(arg, 4); assert.sameValue(new.target, undefined); } + static get staticcl() { assert.sameValue(new.target, undefined); } + static set staticcl(arg) { assert.sameValue(arg, 4); assert.sameValue(new.target, undefined); } +} + +const TEST_ITERATIONS = 150; + +for (let i = 0; i < TEST_ITERATIONS; i++) + ol.olTest(4); +for (let i = 0; i < TEST_ITERATIONS; i++) + ol.ol; +for (let i = 0; i < TEST_ITERATIONS; i++) + ol.ol = 4; + +for (let i = 0; i < TEST_ITERATIONS; i++) + cl.staticclTest(4); +for (let i = 0; i < TEST_ITERATIONS; i++) + cl.staticcl; +for (let i = 0; i < TEST_ITERATIONS; i++) + cl.staticcl = 4; + +for (let i = 0; i < TEST_ITERATIONS; i++) + new cl(); + +let clInst = new cl(); + +for (let i = 0; i < TEST_ITERATIONS; i++) + clInst.clTest(4); +for (let i = 0; i < TEST_ITERATIONS; i++) + clInst.cl; +for (let i = 0; i < TEST_ITERATIONS; i++) + clInst.cl = 4; + diff --git a/test/staging/sm/class/newTargetNonFunction.js b/test/staging/sm/class/newTargetNonFunction.js new file mode 100644 index 0000000000..fbfb9ab8d4 --- /dev/null +++ b/test/staging/sm/class/newTargetNonFunction.js @@ -0,0 +1,19 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +// Make sure that we can plumb new.target, even if the results are going to +// throw. + +assertThrowsInstanceOf(() => new ""(...Array()), TypeError); + +assertThrowsInstanceOf(() => new ""(), TypeError); +assertThrowsInstanceOf(() => new ""(1), TypeError); + diff --git a/test/staging/sm/class/newTargetProxyNative.js b/test/staging/sm/class/newTargetProxyNative.js new file mode 100644 index 0000000000..514fb39be6 --- /dev/null +++ b/test/staging/sm/class/newTargetProxyNative.js @@ -0,0 +1,14 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +var proxyToArray = new Proxy(Array, {}); +new proxyToArray(); + diff --git a/test/staging/sm/class/parenExprToString.js b/test/staging/sm/class/parenExprToString.js new file mode 100644 index 0000000000..697a82eb79 --- /dev/null +++ b/test/staging/sm/class/parenExprToString.js @@ -0,0 +1,17 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +// Test that parenthesized class expressions don't get their toString offsets +// messed up. + +assert.sameValue((class {}).toString(), "class {}"); +assert.sameValue(((class {})).toString(), "class {}"); + diff --git a/test/staging/sm/class/staticConstructor.js b/test/staging/sm/class/staticConstructor.js new file mode 100644 index 0000000000..94e9608369 --- /dev/null +++ b/test/staging/sm/class/staticConstructor.js @@ -0,0 +1,31 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +class testBasic { + constructor() { } + static constructor() { } +} + +class testWithExtends extends null { + constructor() { }; + static constructor() { }; +} + +class testOrder { + static constructor() { }; + constructor() { }; +} + +class testOrderWithExtends extends null { + static constructor() { }; + constructor() { }; +} + diff --git a/test/staging/sm/class/staticMethods.js b/test/staging/sm/class/staticMethods.js new file mode 100644 index 0000000000..4385b85757 --- /dev/null +++ b/test/staging/sm/class/staticMethods.js @@ -0,0 +1,24 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +// basic static method test +class X { + static count() { return ++this.hits; } + constructor() { } +} +X.hits = 0; +assert.sameValue(X.count(), 1); + +// A static method is just a function. +assert.sameValue(X.count instanceof Function, true); +assert.sameValue(X.count.length, 0); +assert.sameValue(X.count.bind({hits: 77})(), 78); + diff --git a/test/staging/sm/class/strictExecution.js b/test/staging/sm/class/strictExecution.js new file mode 100644 index 0000000000..450043364a --- /dev/null +++ b/test/staging/sm/class/strictExecution.js @@ -0,0 +1,47 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +// Classes are always strict mode. Check computed property names and heritage +// expressions as well. + +class a { constructor() { Object.preventExtensions({}).prop = 0; } } +assertThrowsInstanceOf(() => new a(), TypeError); +var aExpr = class { constructor() { Object.preventExtensions().prop = 0; } }; +assertThrowsInstanceOf(() => new aExpr(), TypeError); + +function shouldThrowCPN() { + class b { + [Object.preventExtensions({}).prop = 4]() { } + constructor() { } + } +} +function shouldThrowCPNExpr() { + var b = class { + [Object.preventExtensions({}).prop = 4]() { } + constructor() { } + }; +} +assertThrowsInstanceOf(shouldThrowCPN, TypeError); +assertThrowsInstanceOf(shouldThrowCPNExpr, TypeError); + +function shouldThrowHeritage() { + class b extends (Object.preventExtensions({}).prop = 4) { + constructor() { } + } +} +function shouldThrowHeritageExpr() { + var b = class extends (Object.preventExtensions({}).prop = 4) { + constructor() { } + }; +} +assertThrowsInstanceOf(shouldThrowHeritage, TypeError); +assertThrowsInstanceOf(shouldThrowHeritageExpr, TypeError); + diff --git a/test/staging/sm/class/stringConstructor.js b/test/staging/sm/class/stringConstructor.js new file mode 100644 index 0000000000..84399f76d3 --- /dev/null +++ b/test/staging/sm/class/stringConstructor.js @@ -0,0 +1,21 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +class A { + "constructor"() { return {}; } +} +assert.sameValue(new A() instanceof A, false); + +class B extends class { } { + "constructor"() { return {}; } +} +assert.sameValue(new B() instanceof B, false); + diff --git a/test/staging/sm/class/subclassedArrayUnboxed.js b/test/staging/sm/class/subclassedArrayUnboxed.js new file mode 100644 index 0000000000..5600e023a9 --- /dev/null +++ b/test/staging/sm/class/subclassedArrayUnboxed.js @@ -0,0 +1,31 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +class foo extends Array { } + +function testArrs(arrs) { + for (let arr of arrs) { + assert.sameValue(Object.getPrototypeOf(arr), foo.prototype); + } +} + +var arrs = []; +for (var i = 0; i < 25; i++) + arrs.push(new foo(1)); + +testArrs(arrs); + +arrs[0].nonIndexedProp = "uhoh"; + +arrs.push(new foo(1)); + +testArrs(arrs); + diff --git a/test/staging/sm/class/superCallBadDynamicSuperClass.js b/test/staging/sm/class/superCallBadDynamicSuperClass.js new file mode 100644 index 0000000000..16ae69f70d --- /dev/null +++ b/test/staging/sm/class/superCallBadDynamicSuperClass.js @@ -0,0 +1,21 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +class base { constructor() { } } + +class inst extends base { constructor() { super(); } } +Object.setPrototypeOf(inst, Math.sin); +assertThrowsInstanceOf(() => new inst(), TypeError); + +class defaultInst extends base { } +Object.setPrototypeOf(inst, Math.sin); +assertThrowsInstanceOf(() => new inst(), TypeError); + diff --git a/test/staging/sm/class/superCallBadNewTargetPrototype.js b/test/staging/sm/class/superCallBadNewTargetPrototype.js new file mode 100644 index 0000000000..631f49b710 --- /dev/null +++ b/test/staging/sm/class/superCallBadNewTargetPrototype.js @@ -0,0 +1,34 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +class base { constructor() { } } + +// lies and the lying liars who tell them +function lies() { } +lies.prototype = 4; + +assertThrowsInstanceOf(()=>Reflect.consruct(base, [], lies), TypeError); + +// lie a slightly different way +function get(target, property, receiver) { + if (property === "prototype") + return 42; + return Reflect.get(target, property, receiver); +} + +class inst extends base { + constructor() { super(); } +} +assertThrowsInstanceOf(()=>new new Proxy(inst, {get})(), TypeError); + +class defaultInst extends base {} +assertThrowsInstanceOf(()=>new new Proxy(defaultInst, {get})(), TypeError); + diff --git a/test/staging/sm/class/superCallBaseInvoked.js b/test/staging/sm/class/superCallBaseInvoked.js new file mode 100644 index 0000000000..69703584af --- /dev/null +++ b/test/staging/sm/class/superCallBaseInvoked.js @@ -0,0 +1,64 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +function testBase(base) { + class instance extends base { + constructor(inst, one) { + super(inst, one); + } + } + + let inst = new instance(instance, 1); + assert.sameValue(Object.getPrototypeOf(inst), instance.prototype); + assert.sameValue(inst.calledBase, true); + + class defaultInstance extends base { } + let defInst = new defaultInstance(defaultInstance, 1); + assert.sameValue(Object.getPrototypeOf(defInst), defaultInstance.prototype); + assert.sameValue(defInst.calledBase, true); +} + +class base { + // Base class must be [[Construct]]ed, as you cannot [[Call]] a class + // constructor + constructor(nt, one) { + assert.sameValue(new.target, nt); + + // Check argument ordering + assert.sameValue(one, 1); + this.calledBase = true; + } +} + +testBase(base); +testBase(class extends base { + constructor(nt, one) { + // Every step of the way, new.target and args should be right + assert.sameValue(new.target, nt); + assert.sameValue(one, 1); + super(nt, one); + } + }); +function baseFunc(nt, one) { + assert.sameValue(new.target, nt); + assert.sameValue(one, 1); + this.calledBase = true; +} + +testBase(baseFunc); + +let handler = {}; +let p = new Proxy(baseFunc, handler); +testBase(p); + +handler.construct = (target, args, nt) => Reflect.construct(target, args, nt); +testBase(p); + diff --git a/test/staging/sm/class/superCallIllegal.js b/test/staging/sm/class/superCallIllegal.js new file mode 100644 index 0000000000..20b7c9a60a --- /dev/null +++ b/test/staging/sm/class/superCallIllegal.js @@ -0,0 +1,16 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +// super() invalid outside derived class constructors, including in dynamic +// functions and eval +assertThrowsInstanceOf(() => new Function("super();"), SyntaxError); +assertThrowsInstanceOf(() => eval("super()"), SyntaxError); + diff --git a/test/staging/sm/class/superCallInvalidBase.js b/test/staging/sm/class/superCallInvalidBase.js new file mode 100644 index 0000000000..6a24db01d5 --- /dev/null +++ b/test/staging/sm/class/superCallInvalidBase.js @@ -0,0 +1,18 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +class instance extends null { + constructor() { super(); } +} + +assertThrowsInstanceOf(() => new instance(), TypeError); +assertThrowsInstanceOf(() => new class extends null { }(), TypeError); + diff --git a/test/staging/sm/class/superCallOrder.js b/test/staging/sm/class/superCallOrder.js new file mode 100644 index 0000000000..c60fd03b1c --- /dev/null +++ b/test/staging/sm/class/superCallOrder.js @@ -0,0 +1,37 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +function base() { } + +class beforeSwizzle extends base { + constructor() { + super(Object.setPrototypeOf(beforeSwizzle, null)); + } +} + +new beforeSwizzle(); + +function MyError() {} + +// Again, testing both dynamic prototype dispatch, and that we verify the function +// is a constructor after evaluating args +class beforeThrow extends base { + constructor() { + function thrower() { throw new MyError(); } + super(thrower()); + } +} + +Object.setPrototypeOf(beforeThrow, Math.sin); + +// Won't throw that Math.sin is not a constructor before evaluating the args +assertThrowsInstanceOf(() => new beforeThrow(), MyError); + diff --git a/test/staging/sm/class/superCallProperBase.js b/test/staging/sm/class/superCallProperBase.js new file mode 100644 index 0000000000..cdb6cee9db --- /dev/null +++ b/test/staging/sm/class/superCallProperBase.js @@ -0,0 +1,43 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +class base1 { + constructor() { + this.base = 1; + } +} + +class base2 { + constructor() { + this.base = 2; + } +} + +class inst extends base1 { + constructor() { + super(); + } +} + +assert.sameValue(new inst().base, 1); + +Object.setPrototypeOf(inst, base2); + +assert.sameValue(new inst().base, 2); + +// Still works with default constructor + +class defaultInst extends base1 { } + +assert.sameValue(new defaultInst().base, 1); +Object.setPrototypeOf(defaultInst, base2); +assert.sameValue(new defaultInst().base, 2); + diff --git a/test/staging/sm/class/superCallSpreadCall.js b/test/staging/sm/class/superCallSpreadCall.js new file mode 100644 index 0000000000..370e334ebb --- /dev/null +++ b/test/staging/sm/class/superCallSpreadCall.js @@ -0,0 +1,36 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +class base { + constructor(a, b, c) { + assert.sameValue(a, 1); + assert.sameValue(b, 2); + assert.sameValue(c, 3); + this.calledBase = true; + } +} + +class doTest extends base { + constructor(arr) { + super(...arr); + } +} + +assert.sameValue(new doTest([1,2,3]).calledBase, true); + +class testRest extends base { + constructor(...args) { + super(...args); + } +} + +assert.sameValue(new testRest(1,2,3).calledBase, true); + diff --git a/test/staging/sm/class/superCallThisInit.js b/test/staging/sm/class/superCallThisInit.js new file mode 100644 index 0000000000..eb304f830e --- /dev/null +++ b/test/staging/sm/class/superCallThisInit.js @@ -0,0 +1,57 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +function base() { this.prop = 42; } + +class testInitialize extends base { + constructor() { + // A poor man's assertThrowsInstanceOf, as arrow functions are currently + // disabled in this context + try { + this; + throw new Error(); + } catch (e) { + if (!(e instanceof ReferenceError)) + throw e; + } + super(); + assert.sameValue(this.prop, 42); + } +} +assert.sameValue(new testInitialize().prop, 42); + +// super() twice is a no-go. +class willThrow extends base { + constructor() { + super(); + super(); + } +} +assertThrowsInstanceOf(()=>new willThrow(), ReferenceError); + +// This is determined at runtime, not the syntax level. +class willStillThrow extends base { + constructor() { + for (let i = 0; i < 3; i++) { + super(); + } + } +} +assertThrowsInstanceOf(()=>new willStillThrow(), ReferenceError); + +class canCatchThrow extends base { + constructor() { + super(); + try { super(); } catch(e) { } + } +} +assert.sameValue(new canCatchThrow().prop, 42); + diff --git a/test/staging/sm/class/superElemDelete.js b/test/staging/sm/class/superElemDelete.js new file mode 100644 index 0000000000..b89caaeb41 --- /dev/null +++ b/test/staging/sm/class/superElemDelete.js @@ -0,0 +1,65 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +// Make sure we get the proper side effects. +// |delete super[expr]| applies ToPropertyKey on |expr| before throwing. + +class base { + constructor() { } +} + +class derived extends base { + constructor() { super(); } + testDeleteElem() { + let sideEffect = 0; + let key = { + toString() { + sideEffect++; + return ""; + } + }; + assertThrowsInstanceOf(() => delete super[key], ReferenceError); + assert.sameValue(sideEffect, 0); + } +} + +class derivedTestDeleteElem extends base { + constructor() { + let sideEffect = 0; + let key = { + toString() { + sideEffect++; + return ""; + } + }; + + assertThrowsInstanceOf(() => delete super[key], ReferenceError); + assert.sameValue(sideEffect, 0); + + super(); + + assertThrowsInstanceOf(() => delete super[key], ReferenceError); + assert.sameValue(sideEffect, 0); + + Object.setPrototypeOf(derivedTestDeleteElem.prototype, null); + + assertThrowsInstanceOf(() => delete super[key], ReferenceError); + assert.sameValue(sideEffect, 0); + + return {}; + } +} + +var d = new derived(); +d.testDeleteElem(); + +new derivedTestDeleteElem(); + diff --git a/test/staging/sm/class/superPropBasicCalls.js b/test/staging/sm/class/superPropBasicCalls.js new file mode 100644 index 0000000000..d3f908602d --- /dev/null +++ b/test/staging/sm/class/superPropBasicCalls.js @@ -0,0 +1,36 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +// Super property (and calls) works in non-extending classes and object +// litterals. +class toStringTest { + constructor() { + // Install a property to make it plausible that it's the same this + this.foo = "rhinoceros"; + } + + test() { + assert.sameValue(super.toString(), super["toString"]()); + assert.sameValue(super.toString(), this.toString()); + } +} + +new toStringTest().test(); + +let toStrOL = { + test() { + assert.sameValue(super.toString(), super["toString"]()); + assert.sameValue(super.toString(), this.toString()); + } +} + +toStrOL.test(); + diff --git a/test/staging/sm/class/superPropBasicChain.js b/test/staging/sm/class/superPropBasicChain.js new file mode 100644 index 0000000000..3e2be6218b --- /dev/null +++ b/test/staging/sm/class/superPropBasicChain.js @@ -0,0 +1,20 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +var o = { + access() { + super.foo.bar; + } +}; + +// Delazify +assertThrowsInstanceOf(o.access, TypeError); + diff --git a/test/staging/sm/class/superPropBasicGetter.js b/test/staging/sm/class/superPropBasicGetter.js new file mode 100644 index 0000000000..957c3e3771 --- /dev/null +++ b/test/staging/sm/class/superPropBasicGetter.js @@ -0,0 +1,45 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +class base { + constructor() {} + + getValue() { + return this._prop; + } + + setValue(v) { + this._prop = v; + } +} + +class derived extends base { + constructor() { super(); } + + get a() { return super.getValue(); } + set a(v) { super.setValue(v); } + + get b() { return eval('super.getValue()'); } + set b(v) { eval('super.setValue(v);'); } + + test() { + this.a = 15; + assert.sameValue(this.a, 15); + + assert.sameValue(this.b, 15); + this.b = 30; + assert.sameValue(this.b, 30); + } +} + +var derivedInstance = new derived(); +derivedInstance.test(); + diff --git a/test/staging/sm/class/superPropBasicNew.js b/test/staging/sm/class/superPropBasicNew.js new file mode 100644 index 0000000000..e7edb72aa9 --- /dev/null +++ b/test/staging/sm/class/superPropBasicNew.js @@ -0,0 +1,26 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +class Base { + constructor() {} +} +class Mid extends Base { + constructor() { super(); } + f() { return new super.constructor(); } +} +class Derived extends Mid { + constructor() { super(); } +} + +let d = new Derived(); +var df = d.f(); +assert.sameValue(df.constructor, Base); + diff --git a/test/staging/sm/class/superPropChains.js b/test/staging/sm/class/superPropChains.js new file mode 100644 index 0000000000..577ec21fa4 --- /dev/null +++ b/test/staging/sm/class/superPropChains.js @@ -0,0 +1,67 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +// First, let's test the trivial. A chain of three works. +class base { + constructor() { } + testChain() { + this.baseCalled = true; + } +} + +class middle extends base { + constructor() { super(); } + testChain() { + this.middleCalled = true; + super.testChain(); + } +} + +class derived extends middle { + constructor() { super(); } + testChain() { + super.testChain(); + assert.sameValue(this.middleCalled, true); + assert.sameValue(this.baseCalled, true); + } +} + +new derived().testChain(); + +// Super even chains in a wellbehaved fashion with normal functions. +function bootlegMiddle() { } +bootlegMiddle.prototype = middle.prototype; + +new class extends bootlegMiddle { + constructor() { super(); } + testChain() { + super.testChain(); + assert.sameValue(this.middleCalled, true); + assert.sameValue(this.baseCalled, true); + } + }().testChain(); + +// Now let's try out some "long" chains +base.prototype.x = "yeehaw"; + +let chain = class extends base { constructor() { super(); } } + +const CHAIN_LENGTH = 100; +for (let i = 0; i < CHAIN_LENGTH; i++) + chain = class extends chain { constructor() { super(); } } + +// Now we poke the chain +let inst = new chain(); +inst.testChain(); +assert.sameValue(inst.baseCalled, true); + +assert.sameValue(inst.x, "yeehaw"); + diff --git a/test/staging/sm/class/superPropDVG.js b/test/staging/sm/class/superPropDVG.js new file mode 100644 index 0000000000..b1c57c420a --- /dev/null +++ b/test/staging/sm/class/superPropDVG.js @@ -0,0 +1,26 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +// Super property accesses should play nice with the pretty printer. +class testNonExistent { + constructor() { + super["prop"](); + } +} +// Should fold to super.prop +assertThrownErrorContains(() => new testNonExistent(), 'super.prop'); + +var ol = { testNonExistent() { super.prop(); } }; +assertThrownErrorContains(() => ol.testNonExistent(), "super.prop"); + +var olElem = { testNonExistent() { var prop = "prop"; super[prop](); } }; +assertThrownErrorContains(() => olElem.testNonExistent(), "super[prop]"); + diff --git a/test/staging/sm/class/superPropDelete.js b/test/staging/sm/class/superPropDelete.js new file mode 100644 index 0000000000..5882f6e8da --- /dev/null +++ b/test/staging/sm/class/superPropDelete.js @@ -0,0 +1,67 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +// Make sure we get the proper side effects. +// |delete super.prop| and |delete super[expr]| throw universally. + +class base { + constructor() { } +} + +class derived extends base { + constructor() { super(); } + testDeleteProp() { delete super.prop; } + testDeleteElem() { + let sideEffect = 0; + assertThrowsInstanceOf(() => delete super[sideEffect = 1], ReferenceError); + assert.sameValue(sideEffect, 1); + } +} + +var d = new derived(); +assertThrowsInstanceOf(() => d.testDeleteProp(), ReferenceError); +d.testDeleteElem(); + +// |delete super.x| does not delete anything before throwing. +var thing1 = { + go() { delete super.toString; } +}; +let saved = Object.prototype.toString; +assertThrowsInstanceOf(() => thing1.go(), ReferenceError); +assert.sameValue(Object.prototype.toString, saved); + +// |delete super.x| does not tell the prototype to delete anything, when it's a proxy. +var thing2 = { + go() { delete super.prop; } +}; +Object.setPrototypeOf(thing2, new Proxy({}, { + deleteProperty(x) { throw "FAIL"; } +})); +assertThrowsInstanceOf(() => thing2.go(), ReferenceError); + +class derivedTestDeleteProp extends base { + constructor() { + // The deletion error is a reference error, even after munging the prototype + // chain. + Object.setPrototypeOf(derivedTestDeleteProp.prototype, null); + + assertThrowsInstanceOf(() => delete super.prop, ReferenceError); + + super(); + + assertThrowsInstanceOf(() => delete super.prop, ReferenceError); + + return {}; + } +} + +new derivedTestDeleteProp(); + diff --git a/test/staging/sm/class/superPropDerivedCalls.js b/test/staging/sm/class/superPropDerivedCalls.js new file mode 100644 index 0000000000..66862a65f7 --- /dev/null +++ b/test/staging/sm/class/superPropDerivedCalls.js @@ -0,0 +1,86 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +let derivedInstance; + +class base { + constructor() { } + method(a, b, c) { + assert.sameValue(this, derivedInstance); + this.methodCalled = true; + assert.sameValue(a, 1); + assert.sameValue(b, 2); + assert.sameValue(c, 3); + } + + get prop() { + assert.sameValue(this, derivedInstance); + this.getterCalled = true; + return this._prop; + } + + set prop(val) { + assert.sameValue(this, derivedInstance); + this.setterCalled = true; + this._prop = val; + } +} + +class derived extends base { + constructor() { super(); } + + // |super| actually checks the chain, not |this| + method() { throw "FAIL"; } + get prop() { throw "FAIL"; } + set prop(v) { throw "FAIL"; } + + test() { + this.reset(); + // While we're here. Let's check on super spread calls... + let spread = [1,2,3]; + super.method(...spread); + super.prop++; + this.asserts(); + } + + testInEval() { + this.reset(); + eval("super.method(1,2,3); super.prop++"); + this.asserts(); + } + + testInArrow() { + this.reset(); + (() => (super.method(1,2,3), super.prop++))(); + this.asserts(); + } + + reset() { + this._prop = 0; + this.methodCalled = false; + this.setterCalled = false; + this.getterCalled = false; + } + + asserts() { + assert.sameValue(this.methodCalled, true); + assert.sameValue(this.getterCalled, true); + assert.sameValue(this.setterCalled, true); + assert.sameValue(this._prop, 1); + } + +} + +derivedInstance = new derived(); +derivedInstance.test(); +derivedInstance.testInEval(); +derivedInstance.testInArrow(); + diff --git a/test/staging/sm/class/superPropDestructuring.js b/test/staging/sm/class/superPropDestructuring.js new file mode 100644 index 0000000000..27c7262715 --- /dev/null +++ b/test/staging/sm/class/superPropDestructuring.js @@ -0,0 +1,52 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [deepEqual.js, sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +class base { + constructor() { } +} + +let seenValues; +Object.defineProperty(base.prototype, "minutes", + { + set(x) { + assert.sameValue(x, 525600); + seenValues.push(x); + } + }); +Object.defineProperty(base.prototype, "intendent", + { + set(x) { + assert.sameValue(x, "Fred"); + seenValues.push(x) + } + }); + +const testArr = [525600, "Fred"]; +class derived extends base { + constructor() { super(); } + prepForTest() { seenValues = []; } + testAsserts() { assert.deepEqual(seenValues, testArr); } + testProps() { + this.prepForTest(); + [super.minutes, super.intendent] = testArr; + this.testAsserts(); + } + testElems() { + this.prepForTest(); + [super["minutes"], super["intendent"]] = testArr; + this.testAsserts(); + } +} + +let d = new derived(); +d.testProps(); +d.testElems(); + diff --git a/test/staging/sm/class/superPropEvalInsideArrow.js b/test/staging/sm/class/superPropEvalInsideArrow.js new file mode 100644 index 0000000000..659eba197f --- /dev/null +++ b/test/staging/sm/class/superPropEvalInsideArrow.js @@ -0,0 +1,20 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +class foo { + constructor() { } + + method() { + return (() => eval('super.toString')); + } +} +assert.sameValue(new foo().method()(), Object.prototype.toString); + diff --git a/test/staging/sm/class/superPropEvalInsideNested.js b/test/staging/sm/class/superPropEvalInsideNested.js new file mode 100644 index 0000000000..cb8ea16669 --- /dev/null +++ b/test/staging/sm/class/superPropEvalInsideNested.js @@ -0,0 +1,22 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +// It's invalid to eval super.prop inside a nested non-method, even if it +// appears inside a method definition +assertThrowsInstanceOf(() => +({ + method() { + (function () { + eval('super.toString'); + })(); + } +}).method(), SyntaxError); + diff --git a/test/staging/sm/class/superPropFor.js b/test/staging/sm/class/superPropFor.js new file mode 100644 index 0000000000..40ab4bf413 --- /dev/null +++ b/test/staging/sm/class/superPropFor.js @@ -0,0 +1,34 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +class testForIn { + constructor() { + let hits = 0; + for (super.prop in { prop1: 1, prop2: 2 }) + hits++; + assert.sameValue(this.prop, "prop2"); + assert.sameValue(hits, 2); + } +} + +new testForIn(); + + +({ + testForOf() { + let hits = 0; + for (super["prop"] of [1, 2]) + hits++; + assert.sameValue(this.prop, 2); + assert.sameValue(hits, 2); + } +}).testForOf(); + diff --git a/test/staging/sm/class/superPropHeavyweightArrow.js b/test/staging/sm/class/superPropHeavyweightArrow.js new file mode 100644 index 0000000000..7f59efa9f9 --- /dev/null +++ b/test/staging/sm/class/superPropHeavyweightArrow.js @@ -0,0 +1,21 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +class foo { + constructor() { } + + method() { + return (() => (eval(''), super.toString)); + } +} + +assert.sameValue(new foo().method()(), Object.prototype.toString); + diff --git a/test/staging/sm/class/superPropHomeObject.js b/test/staging/sm/class/superPropHomeObject.js new file mode 100644 index 0000000000..0141d6386e --- /dev/null +++ b/test/staging/sm/class/superPropHomeObject.js @@ -0,0 +1,70 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [deepEqual.js, sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +// This is super weird. A super property reference in the spec contains two +// things. The first is the object to do the lookup on, the super base. This +// should be unchanged, no matter what's going on: I can move the method to +// another object. I can pull it out as its own function. I can put it on my +// head and run around the front yard. No changes. The other half, the |this| +// for invoked calls, is the this at the time of referencing the property, which +// means it's gonna vary wildly as stuff gets moved around. + +class base { + constructor() { } + test(expectedThis) { assert.sameValue(this, expectedThis); } +} + +class derived extends base { + constructor() { super(); } + test(expected) { super.test(expected); } + testArrow() { return (() => super.test(this)); } + ["testCPN"](expected) { super.test(expected); } +} + +let derivedInstance = new derived(); +derivedInstance.test(derivedInstance); +derivedInstance.testCPN(derivedInstance); + +let obj = { test: derivedInstance.test }; +obj.test(obj); + +// Classes are strict, so primitives are not boxed/turned into globals +let testSolo = derivedInstance.test; +testSolo(undefined); + +let anotherObject = { }; +derivedInstance.test.call(anotherObject, anotherObject); + +let strThis = "this is not an object!"; +derivedInstance.test.call(strThis, strThis); + +// You can take the arrow function out of the super, ... or something like that +let arrowTest = derivedInstance.testArrow(); +arrowTest(); + +// There's no magic "super script index" per code location. +class base1 { + constructor() { } + test() { return "llama"; } +} +class base2 { + constructor() { } + test() { return "alpaca"; } +} + +let animals = []; +for (let exprBase of [base1, base2]) + new class extends exprBase { + constructor() { super(); } + test() { animals.push(super["test"]()); } + }().test(); +assert.deepEqual(animals, ["llama", "alpaca"]); + diff --git a/test/staging/sm/class/superPropIncDecElem.js b/test/staging/sm/class/superPropIncDecElem.js new file mode 100644 index 0000000000..b24cb58d67 --- /dev/null +++ b/test/staging/sm/class/superPropIncDecElem.js @@ -0,0 +1,33 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +// #1 +function base() { } + +base.prototype = { + test() { + --super[1]; + } +} + +var d = new base(); +d.test(); + +// #2 +class test2 { + test() { + super[1]++; + } +} + +var d = new test2(); +d.test() + diff --git a/test/staging/sm/class/superPropLazyInnerFunction.js b/test/staging/sm/class/superPropLazyInnerFunction.js new file mode 100644 index 0000000000..f04f40a612 --- /dev/null +++ b/test/staging/sm/class/superPropLazyInnerFunction.js @@ -0,0 +1,28 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +testcase(); +function testcase() { + var tokenCodes = { + get try() { + try { + super.actual(); + } catch (e) {} + } + }; + var arr = [ + 'try', + ]; + for (var i = 0; i < arr.length; i++) { + if (tokenCodes[arr[i]] !== i) {}; + } +} + diff --git a/test/staging/sm/class/superPropNoOverwriting.js b/test/staging/sm/class/superPropNoOverwriting.js new file mode 100644 index 0000000000..6b70e8f07a --- /dev/null +++ b/test/staging/sm/class/superPropNoOverwriting.js @@ -0,0 +1,67 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +class X { + constructor() { + Object.defineProperty(this, "prop1", { + configurable: true, + writable: false, + value: 1 + }); + + Object.defineProperty(this, "prop2", { + configurable: true, + get: function() { return 15; } + }); + + Object.defineProperty(this, "prop3", { + configurable: true, + set: function(a) { } + }); + + Object.defineProperty(this, "prop4", { + configurable: true, + get: function() { return 20; }, + set: function(a) { } + }); + } + + f1() { + super.prop1 = 2; + } + + f2() { + super.prop2 = 3; + } + + f3() { + super.prop3 = 4; + } + + f4() { + super.prop4 = 5; + } +} + +var x = new X(); + +assertThrowsInstanceOf(() => x.f1(), TypeError); +assert.sameValue(x.prop1, 1); + +assertThrowsInstanceOf(() => x.f2(), TypeError); +assert.sameValue(x.prop2, 15); + +assertThrowsInstanceOf(() => x.f3(), TypeError); +assert.sameValue(x.prop3, undefined); + +assertThrowsInstanceOf(() => x.f4(), TypeError); +assert.sameValue(x.prop4, 20); + diff --git a/test/staging/sm/class/superPropOrdering.js b/test/staging/sm/class/superPropOrdering.js new file mode 100644 index 0000000000..d1f27f14fa --- /dev/null +++ b/test/staging/sm/class/superPropOrdering.js @@ -0,0 +1,102 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +class base { + constructor() { } + method() { this.methodCalled++; } +} + +class derived extends base { + constructor() { super(); this.methodCalled = 0; } + + // Test orderings of various evaluations relative to the superbase + + // Unlike in regular element evaluation, the propVal is evaluated before + // checking the starting object ([[HomeObject]].[[Prototype]]) + testElem() { super[ruin()]; } + + // The starting object for looking up super.method is determined before + // ruin() is called. + testProp() { super.method(ruin()); } + + // The entire super.method property lookup has concluded before the args + // are evaluated + testPropCallDeleted() { super.method(()=>delete base.prototype.method); } + + // The starting object for looking up super["prop"] is determined before + // ruin() is called. + testElemAssign() { super["prop"] = ruin(); } + + // Test the normal assignment gotchas + testAssignElemPropValChange() { + let x = "prop1"; + super[x] = (()=>(x = "prop2", 0))(); + assert.sameValue(this.prop1, 0); + assert.sameValue(this.prop2, undefined); + } + + testAssignProp() { + Object.defineProperty(base.prototype, "piggy", + { + configurable: true, + set() { throw "WEE WEE WEE WEE"; } + }); + + // The property lookup is noted, but not actually evaluated, until the + // right hand side is. Please don't make the piggy cry. + super.piggy = (() => delete base.prototype.piggy)(); + } + testCompoundAssignProp() { + let getterCalled = false; + Object.defineProperty(base.prototype, "horse", + { + configurable: true, + get() { getterCalled = true; return "Of course"; }, + set() { throw "NO!"; } + }); + super.horse += (()=>(delete base.prototype.horse, ", of course!"))(); + assert.sameValue(getterCalled, true); + + // So, is a horse a horse? + assert.sameValue(this.horse, "Of course, of course!"); + } +} + +function ruin() { + Object.setPrototypeOf(derived.prototype, null); + return 5; +} + +function reset() { + Object.setPrototypeOf(derived.prototype, base.prototype); +} + +let instance = new derived(); +assertThrowsInstanceOf(() => instance.testElem(), TypeError); +reset(); + +instance.testProp(); +assert.sameValue(instance.methodCalled, 1); +reset(); + +instance.testPropCallDeleted(); +assert.sameValue(instance.methodCalled, 2); + +instance.testElemAssign(); +assert.sameValue(instance.prop, 5); +reset(); + +instance.testAssignElemPropValChange(); + +instance.testAssignProp(); + +instance.testCompoundAssignProp(); + diff --git a/test/staging/sm/class/superPropProtoChanges.js b/test/staging/sm/class/superPropProtoChanges.js new file mode 100644 index 0000000000..6e27608589 --- /dev/null +++ b/test/staging/sm/class/superPropProtoChanges.js @@ -0,0 +1,31 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +class base { + constructor() { } + test() { + return false; + } +} + +let standin = { test() { return true; } }; + +class derived extends base { + constructor() { super(); } + test() { + assert.sameValue(super.test(), false); + Object.setPrototypeOf(derived.prototype, standin); + assert.sameValue(super["test"](), true); + } +} + +new derived().test(); + diff --git a/test/staging/sm/class/superPropProxies.js b/test/staging/sm/class/superPropProxies.js new file mode 100644 index 0000000000..048a84647d --- /dev/null +++ b/test/staging/sm/class/superPropProxies.js @@ -0,0 +1,92 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +class base { + constructor() { } +} + +let midStaticHandler = { }; + +// We shouldn't use the |this.called| strategy here, since we have proxies +// snooping property accesses. +let getterCalled, setterCalled; + +class mid extends new Proxy(base, midStaticHandler) { + constructor() { super(); } + testSuperInProxy() { + super.prop = "looking"; + assert.sameValue(setterCalled, true); + assert.sameValue(super.prop, "found"); + assert.sameValue(getterCalled, true); + } +} + +class child extends mid { + constructor() { super(); } + static testStaticLookups() { + // This funtion is called more than once. + this.called = false; + super.prop; + assert.sameValue(this.called, true); + } +} + +let midInstance = new mid(); + +// Make sure proxies are searched properly on the prototype chain +let baseHandler = { + get(target, p, receiver) { + assert.sameValue(receiver, midInstance); + getterCalled = true; + return "found"; + }, + + set(t,p,val,receiver) { + assert.sameValue(receiver, midInstance); + assert.sameValue(val, "looking"); + setterCalled = true; + return true; + } +} +Object.setPrototypeOf(base.prototype, new Proxy(Object.prototype, baseHandler)); + +// make sure subclasses are not searched on static or super lookups. +let childHandler = { + get() { throw "NO!"; }, + set() { throw "NO!"; } +} +Object.setPrototypeOf(child.prototype, new Proxy(mid.prototype, childHandler)); + +midInstance.testSuperInProxy(); + +// Don't do this earlier to avoid the lookup of .prototype during class creation +function midGet(target, p, receiver) { + assert.sameValue(receiver, child); + receiver.called = true; +} +midStaticHandler.get = midGet; + +child.testStaticLookups(); + +// Hey does super work in a proxy? +assert.sameValue(new Proxy(({ method() { return super.hasOwnProperty("method"); } }), {}).method(), true); + +// What about a CCW? +var g = createNewGlobal(); +var wrappedSuper = g.eval("({ method() { return super.hasOwnProperty('method'); } })"); +assert.sameValue(wrappedSuper.method(), true); + +// With a CCW on the proto chain? +var wrappedBase = g.eval("({ method() { return this.__secretProp__; } })"); +var unwrappedDerived = { __secretProp__: 42, method() { return super.method(); } } +Object.setPrototypeOf(unwrappedDerived, wrappedBase); +assert.sameValue(unwrappedDerived.method(), 42); + diff --git a/test/staging/sm/class/superPropSkips.js b/test/staging/sm/class/superPropSkips.js new file mode 100644 index 0000000000..77b4913a46 --- /dev/null +++ b/test/staging/sm/class/superPropSkips.js @@ -0,0 +1,54 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +// Ensure that super lookups and sets skip over properties on the |this| object. +// That is, super lookups start with the superclass, not the current class. + +// The whole point: an empty superclass +class base { + constructor() { } +} + +class derived extends base { + constructor() { super(); this.prop = "flamingo"; } + + toString() { throw "No!"; } + + testSkipGet() { + assert.sameValue(super.prop, undefined); + } + + testSkipDerivedOverrides() { + assert.sameValue(super["toString"](), Object.prototype.toString.call(this)); + } + + testSkipSet() { + // since there's no prop on the chain, we should set the data property + // on the receiver, |this| + super.prop = "rat"; + assert.sameValue(this.prop, "rat"); + + // Since the receiver is the instance, we can overwrite inherited + // properties of the instance, even non-writable ones, as they could be + // skipped in the super lookup. + assert.sameValue(this.nonWritableProp, "pony"); + super.nonWritableProp = "bear"; + assert.sameValue(this.nonWritableProp, "bear"); + } +} + +Object.defineProperty(derived.prototype, "nonWritableProp", { writable: false, value: "pony" }); + +let instance = new derived(); +instance.testSkipGet(); +instance.testSkipDerivedOverrides(); +instance.testSkipSet(); + diff --git a/test/staging/sm/class/superPropStatics.js b/test/staging/sm/class/superPropStatics.js new file mode 100644 index 0000000000..33a9433f69 --- /dev/null +++ b/test/staging/sm/class/superPropStatics.js @@ -0,0 +1,43 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +class base { + constructor() { } + static found() { + this.foundCalled = true; + } + static get accessor() { + assert.sameValue(this, derived); + return 45; + } + notFound() { } +} + +class derived extends base { + constructor() { } + + static found() { throw "NO!"; } + static get accessor() { throw "NO!"; } + + static test() { + assert.sameValue(super["notFound"], undefined); + super.found(); + + // foundCalled is set on |derived| specifically. + let calledDesc = Object.getOwnPropertyDescriptor(derived, "foundCalled"); + assert.sameValue(calledDesc.value, true); + + assert.sameValue(super.accessor, 45); + } +} + +derived.test(); + diff --git a/test/staging/sm/class/superPropStrictAssign.js b/test/staging/sm/class/superPropStrictAssign.js new file mode 100644 index 0000000000..eefa1c033c --- /dev/null +++ b/test/staging/sm/class/superPropStrictAssign.js @@ -0,0 +1,32 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +// While |super| is common in classes, it also works in object litterals, +// where there is no guarantee of strict mode. Check that we do not somehow +// get strict mode semantics when they were not called for + +// |undefined|, writable: false +Object.defineProperty(Object.prototype, "prop", { writable: false }); + +class strictAssignmentTest { + constructor() { + // Strict mode. Throws. + super.prop = 14; + } +} + +assertThrowsInstanceOf(()=>new strictAssignmentTest(), TypeError); + +// Non-strict. Silent failure. +({ test() { super.prop = 14; } }).test(); + +assert.sameValue(Object.prototype.prop, undefined); + diff --git a/test/staging/sm/class/superThisStrictNoBoxing.js b/test/staging/sm/class/superThisStrictNoBoxing.js new file mode 100644 index 0000000000..95b5548f5c --- /dev/null +++ b/test/staging/sm/class/superThisStrictNoBoxing.js @@ -0,0 +1,40 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +class C { + get prop_this() { return this; } +} + +var g_prop_this = 'prop_this'; +class D extends C { + super_prop() { return super.prop_this; } + super_elem() { return super[g_prop_this]; } +} + +var barsym = Symbol("bar"); + +// Test that primitive |this| values are not boxed, and undefined/null are not +// globals for super.property. +assert.sameValue(new D().super_prop.call(3), 3); +assert.sameValue(new D().super_prop.call("foo"), "foo"); +assert.sameValue(new D().super_prop.call(true), true); +assert.sameValue(new D().super_prop.call(barsym), barsym); +assert.sameValue(new D().super_prop.call(null), null); +assert.sameValue(new D().super_prop.call(undefined), undefined); + +// Ditto for super[elem] +assert.sameValue(new D().super_elem.call(3), 3); +assert.sameValue(new D().super_elem.call("foo"), "foo"); +assert.sameValue(new D().super_elem.call(true), true); +assert.sameValue(new D().super_elem.call(barsym), barsym); +assert.sameValue(new D().super_elem.call(null), null); +assert.sameValue(new D().super_elem.call(undefined), undefined); + diff --git a/test/staging/sm/class/uninitializedThisError.js b/test/staging/sm/class/uninitializedThisError.js new file mode 100644 index 0000000000..5e21069cfc --- /dev/null +++ b/test/staging/sm/class/uninitializedThisError.js @@ -0,0 +1,56 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +function checkErr(f) { + assertThrowsInstanceOfWithMessage(f, ReferenceError, + "must call super constructor before using 'this' in derived class constructor"); +} +class TestNormal extends class {} { + constructor() { this; } +} +checkErr(() => new TestNormal()); + +class TestEval extends class {} { + constructor() { eval("this") } +} +checkErr(() => new TestEval()); + +class TestNestedEval extends class {} { + constructor() { eval("eval('this')") } +} +checkErr(() => new TestNestedEval()); + +checkErr(() => { + new class extends class {} { + constructor() { eval("this") } + } +}); + +class TestArrow extends class {} { + constructor() { (() => this)(); } +} +checkErr(() => new TestArrow()); + +class TestArrowEval extends class {} { + constructor() { (() => eval("this"))(); } +} +checkErr(() => new TestArrowEval()); + +class TestEvalArrow extends class {} { + constructor() { eval("(() => this)()"); } +} +checkErr(() => new TestEvalArrow()); + +class TestTypeOf extends class {} { + constructor() { eval("typeof this"); } +} +checkErr(() => new TestTypeOf()); + diff --git a/test/staging/sm/destructuring/array-default-class.js b/test/staging/sm/destructuring/array-default-class.js new file mode 100644 index 0000000000..e3beb95585 --- /dev/null +++ b/test/staging/sm/destructuring/array-default-class.js @@ -0,0 +1,34 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +var BUGNUMBER = 1322314; +var summary = "Function in computed property in class expression in array destructuring default"; + +print(BUGNUMBER + ": " + summary); + +function* g([ + a = class E { + [ (function() { return "foo"; })() ]() { + return 10; + } + } +]) { + yield a; +} + +let C = [...g([])][0]; +let x = new C(); +assert.sameValue(x.foo(), 10); + +C = [...g([undefined])][0]; +x = new C(); +assert.sameValue(x.foo(), 10); + diff --git a/test/staging/sm/destructuring/array-iterator-close.js b/test/staging/sm/destructuring/array-iterator-close.js new file mode 100644 index 0000000000..c7c19bfc2b --- /dev/null +++ b/test/staging/sm/destructuring/array-iterator-close.js @@ -0,0 +1,102 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +// Tests that IteratorClose is called in array destructuring patterns. + +function test() { + var returnCalled = 0; + var returnCalledExpected = 0; + var iterable = {}; + + // empty [] calls IteratorClose regardless of "done" on the result. + iterable[Symbol.iterator] = makeIterator({ + next: function() { + return { done: true }; + }, + ret: function() { + returnCalled++; + return {}; + } + }); + var [] = iterable; + assert.sameValue(returnCalled, ++returnCalledExpected); + + iterable[Symbol.iterator] = makeIterator({ + ret: function() { + returnCalled++; + return {}; + } + }); + var [] = iterable; + assert.sameValue(returnCalled, ++returnCalledExpected); + + // Non-empty destructuring calls IteratorClose if iterator is not done by + // the end of destructuring. + var [a,b] = iterable; + assert.sameValue(returnCalled, ++returnCalledExpected); + var [c,] = iterable; + assert.sameValue(returnCalled, ++returnCalledExpected); + + // throw in lhs ref calls IteratorClose + function throwlhs() { + throw "in lhs"; + } + assertThrowsValue(function() { + 0, [...{}[throwlhs()]] = iterable; + }, "in lhs"); + assert.sameValue(returnCalled, ++returnCalledExpected); + + // throw in lhs ref calls IteratorClose with falsy "done". + iterable[Symbol.iterator] = makeIterator({ + next: function() { + // "done" is undefined. + return {}; + }, + ret: function() { + returnCalled++; + return {}; + } + }); + assertThrowsValue(function() { + 0, [...{}[throwlhs()]] = iterable; + }, "in lhs"); + assert.sameValue(returnCalled, ++returnCalledExpected); + + // throw in iter.next doesn't call IteratorClose + iterable[Symbol.iterator] = makeIterator({ + next: function() { + throw "in next"; + }, + ret: function() { + returnCalled++; + return {}; + } + }); + assertThrowsValue(function() { + var [d] = iterable; + }, "in next"); + assert.sameValue(returnCalled, returnCalledExpected); + + // "return" must return an Object. + iterable[Symbol.iterator] = makeIterator({ + ret: function() { + returnCalled++; + return 42; + } + }); + assertThrowsInstanceOf(function() { + var [] = iterable; + }, TypeError); + assert.sameValue(returnCalled, ++returnCalledExpected); +} + +test(); + diff --git a/test/staging/sm/destructuring/bug1396261.js b/test/staging/sm/destructuring/bug1396261.js new file mode 100644 index 0000000000..d7b3d0367a --- /dev/null +++ b/test/staging/sm/destructuring/bug1396261.js @@ -0,0 +1,53 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +// Ensure array or object literals with trailing property accessors are not +// treated as nested destructuring patterns in assignment destructuring +// contexts. + +// Array destructuring with normal element. +[{a: 0}.x] = []; +[[0].x] = []; + +// Array destructuring with spread element. +[...{a: 0}.x] = []; +[...[0].x] = []; + +// Object destructuring with normal property. +({a: {b: 0}.x} = {}); +({a: [0].x} = {}); + +// Object destructuring with spread property. +({...{b: 0}.x} = {}); +({...[0].x} = {}); + +// Object literal with initializer shorthand in destructuring context. +assertThrowsInstanceOf(() => Function(`[{a = 0}.x] = [];`), SyntaxError); +assertThrowsInstanceOf(() => Function(`[...{a = 0}.x] = [];`), SyntaxError); +assertThrowsInstanceOf(() => Function(`({a: {b = 0}.x} = {});`), SyntaxError); +assertThrowsInstanceOf(() => Function(`({...{b = 0}.x} = {});`), SyntaxError); + +// Object destructuring with "eval" or "arguments" shorthand in strict mode. +(function() { + "use strict"; + + // Ensure "eval" resp. "arguments" is not treated as an assignment. + [{eval}.x] = []; + [...{eval}.x] = []; + ({a: {eval}.x} = {}); + ({...{eval}.x} = {}); + + [{arguments}.x] = []; + [...{arguments}.x] = []; + ({a: {arguments}.x} = {}); + ({...{arguments}.x} = {}); +})(); + diff --git a/test/staging/sm/destructuring/constant-folding.js b/test/staging/sm/destructuring/constant-folding.js new file mode 100644 index 0000000000..d81456a1a3 --- /dev/null +++ b/test/staging/sm/destructuring/constant-folding.js @@ -0,0 +1,25 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +function assertSyntaxError(code) { + assertThrowsInstanceOf(function () { Function(code); }, SyntaxError, "Function:" + code); + assertThrowsInstanceOf(function () { eval(code); }, SyntaxError, "eval:" + code); + var ieval = eval; + assertThrowsInstanceOf(function () { ieval(code); }, SyntaxError, "indirect eval:" + code); +} + +// |true && a| is constant-folded to |a|, ensure the destructuring assignment +// validation takes place before constant-folding. +for (let prefix of ["null,", "var", "let", "const"]) { + assertSyntaxError(`${prefix} [true && a] = [];`); + assertSyntaxError(`${prefix} {p: true && a} = {};`); +} + diff --git a/test/staging/sm/destructuring/iterator-primitive.js b/test/staging/sm/destructuring/iterator-primitive.js new file mode 100644 index 0000000000..0bf1f43d45 --- /dev/null +++ b/test/staging/sm/destructuring/iterator-primitive.js @@ -0,0 +1,45 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +var BUGNUMBER = 1021835; +var summary = "Returning non-object from @@iterator should throw"; + +print(BUGNUMBER + ": " + summary); + +let primitives = [ + 1, + true, + undefined, + null, + "foo", + Symbol.iterator +]; + +function f([]) { +} + +for (let primitive of primitives) { + let obj = { + [Symbol.iterator]() { + return primitive; + } + }; + assertThrowsInstanceOf(() => { + let [] = obj; + }, TypeError); + assertThrowsInstanceOf(() => { + [] = obj; + }, TypeError); + assertThrowsInstanceOf(() => { + f(obj); + }, TypeError); +} + diff --git a/test/staging/sm/destructuring/order-super.js b/test/staging/sm/destructuring/order-super.js new file mode 100644 index 0000000000..947896d2ac --- /dev/null +++ b/test/staging/sm/destructuring/order-super.js @@ -0,0 +1,710 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +var BUGNUMBER = 1204028; +var summary = "Destructuring should evaluate lhs reference before rhs in super property"; + +if (typeof assert.sameValue === "undefined") { + assert.sameValue = function(a, b) { + if (a !== b) + throw new Error(`expected ${b}, got ${a}\n${new Error().stack}`); + }; +} + +print(BUGNUMBER + ": " + summary); + +let logs = []; +function log(x) { + logs.push(x); +} + +let unwrapMap = new Map(); +function unwrap(maybeWrapped) { + if (unwrapMap.has(maybeWrapped)) + return unwrapMap.get(maybeWrapped); + return maybeWrapped; +} +function ToString(name) { + if (name == Symbol.iterator) + return "@@iterator"; + return String(name); +} +function logger(obj, prefix=[]) { + let wrapped = new Proxy(obj, { + get(that, name) { + if (name == "return") { + // FIXME: Bug 1147371. + // We ignore IteratorClose for now. + return obj[name]; + } + + let names = prefix.concat(ToString(name)); + log("rhs get " + names.join("::")); + let v = obj[name]; + if (typeof v === "object" || typeof v === "function") + return logger(v, names); + return v; + }, + apply(that, thisArg, args) { + let names = prefix.slice(); + log("rhs call " + names.join("::")); + let v = obj.apply(unwrap(thisArg), args); + if (typeof v === "object" || typeof v === "function") { + names[names.length - 1] += "()"; + return logger(v, names); + } + return v; + } + }); + unwrapMap.set(wrapped, obj); + return wrapped; +} + +class C1 { + constructor() { + this.clear(); + } + clear() { + this.values = {}; + } +} +for (let name of [ + "a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", + "n", "o", "p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z", + "0", "1", "length" +]) { + Object.defineProperty(C1.prototype, name, { + set: function(value) { + log("lhs set " + name); + this.values[name] = value; + } + }); +} +class C2 extends C1 { + constructor() { + super(); + + let clear = () => { + logs = []; + this.clear(); + }; + + // Array. + + clear(); + [ + super.a + ] = logger(["A"]); + assert.sameValue(logs.join(","), + [ + "rhs get @@iterator", + "rhs call @@iterator", + "rhs get @@iterator()::next", + + "rhs call @@iterator()::next", + "rhs get @@iterator()::next()::done", + "rhs get @@iterator()::next()::value", + "lhs set a", + ].join(",")); + assert.sameValue(this.values.a, "A"); + + clear(); + [ + super[ (log("lhs before name a"), "a") ] + ] = logger(["A"]); + assert.sameValue(logs.join(","), + [ + "rhs get @@iterator", + "rhs call @@iterator", + "rhs get @@iterator()::next", + + "lhs before name a", + "rhs call @@iterator()::next", + "rhs get @@iterator()::next()::done", + "rhs get @@iterator()::next()::value", + "lhs set a", + ].join(",")); + assert.sameValue(this.values.a, "A"); + + // Array rest. + + clear(); + [ + ...super.a + ] = logger(["A", "B", "C"]); + assert.sameValue(logs.join(","), + [ + "rhs get @@iterator", + "rhs call @@iterator", + "rhs get @@iterator()::next", + + "rhs call @@iterator()::next", + "rhs get @@iterator()::next()::done", + "rhs get @@iterator()::next()::value", + "rhs call @@iterator()::next", + "rhs get @@iterator()::next()::done", + "rhs get @@iterator()::next()::value", + "rhs call @@iterator()::next", + "rhs get @@iterator()::next()::done", + "rhs get @@iterator()::next()::value", + "rhs call @@iterator()::next", + "rhs get @@iterator()::next()::done", + "lhs set a", + ].join(",")); + assert.sameValue(this.values.a.join(","), "A,B,C"); + + clear(); + [ + ...super[ (log("lhs before name a"), "a") ] + ] = logger(["A", "B", "C"]);; + assert.sameValue(logs.join(","), + [ + "rhs get @@iterator", + "rhs call @@iterator", + "rhs get @@iterator()::next", + + "lhs before name a", + "rhs call @@iterator()::next", + "rhs get @@iterator()::next()::done", + "rhs get @@iterator()::next()::value", + "rhs call @@iterator()::next", + "rhs get @@iterator()::next()::done", + "rhs get @@iterator()::next()::value", + "rhs call @@iterator()::next", + "rhs get @@iterator()::next()::done", + "rhs get @@iterator()::next()::value", + "rhs call @@iterator()::next", + "rhs get @@iterator()::next()::done", + "lhs set a", + ].join(",")); + assert.sameValue(this.values.a.join(","), "A,B,C"); + + // Array combined. + + clear(); + [ + super.a, + super[ (log("lhs before name b"), "b") ], + ...super[ (log("lhs before name c"), "c") ] + ] = logger(["A", "B", "C"]); + assert.sameValue(logs.join(","), + [ + "rhs get @@iterator", + "rhs call @@iterator", + "rhs get @@iterator()::next", + + "rhs call @@iterator()::next", + "rhs get @@iterator()::next()::done", + "rhs get @@iterator()::next()::value", + "lhs set a", + + "lhs before name b", + "rhs call @@iterator()::next", + "rhs get @@iterator()::next()::done", + "rhs get @@iterator()::next()::value", + "lhs set b", + + "lhs before name c", + "rhs call @@iterator()::next", + "rhs get @@iterator()::next()::done", + "rhs get @@iterator()::next()::value", + "rhs call @@iterator()::next", + "rhs get @@iterator()::next()::done", + "lhs set c", + ].join(",")); + assert.sameValue(this.values.a, "A"); + assert.sameValue(this.values.b, "B"); + assert.sameValue(this.values.c.join(","), "C"); + + // Object. + + clear(); + ({ + a: super.a + } = logger({a: "A"})); + assert.sameValue(logs.join(","), + [ + "rhs get a", + "lhs set a", + ].join(",")); + assert.sameValue(this.values.a, "A"); + + clear(); + ({ + a: super[ (log("lhs before name a"), "a") ] + } = logger({a: "A"})); + assert.sameValue(logs.join(","), + [ + "lhs before name a", + "rhs get a", + "lhs set a", + ].join(",")); + assert.sameValue(this.values.a, "A"); + + // Object combined. + + clear(); + ({ + a: super.a, + b: super[ (log("lhs before name b"), "b") ] + } = logger({a: "A", b: "B"})); + assert.sameValue(logs.join(","), + [ + "rhs get a", + "lhs set a", + + "lhs before name b", + "rhs get b", + "lhs set b", + ].join(",")); + assert.sameValue(this.values.a, "A"); + assert.sameValue(this.values.b, "B"); + + // == Nested == + + // Array -> Array + + clear(); + [ + [ + super[ (log("lhs before name a"), "a") ], + ...super[ (log("lhs before name b"), "b") ] + ] + ] = logger([["A", "B"]]); + assert.sameValue(logs.join(","), + [ + "rhs get @@iterator", + "rhs call @@iterator", + "rhs get @@iterator()::next", + + "rhs call @@iterator()::next", + "rhs get @@iterator()::next()::done", + "rhs get @@iterator()::next()::value", + "rhs get @@iterator()::next()::value::@@iterator", + "rhs call @@iterator()::next()::value::@@iterator", + "rhs get @@iterator()::next()::value::@@iterator()::next", + + "lhs before name a", + "rhs call @@iterator()::next()::value::@@iterator()::next", + "rhs get @@iterator()::next()::value::@@iterator()::next()::done", + "rhs get @@iterator()::next()::value::@@iterator()::next()::value", + "lhs set a", + + "lhs before name b", + "rhs call @@iterator()::next()::value::@@iterator()::next", + "rhs get @@iterator()::next()::value::@@iterator()::next()::done", + "rhs get @@iterator()::next()::value::@@iterator()::next()::value", + "rhs call @@iterator()::next()::value::@@iterator()::next", + "rhs get @@iterator()::next()::value::@@iterator()::next()::done", + "lhs set b", + ].join(",")); + assert.sameValue(this.values.a, "A"); + assert.sameValue(this.values.b.length, 1); + assert.sameValue(this.values.b[0], "B"); + + // Array rest -> Array + + clear(); + [ + ...[ + super[ (log("lhs before name a"), "a") ], + ...super[ (log("lhs before name b"), "b") ] + ] + ] = logger(["A", "B"]); + assert.sameValue(logs.join(","), + [ + "rhs get @@iterator", + "rhs call @@iterator", + "rhs get @@iterator()::next", + + "rhs call @@iterator()::next", + "rhs get @@iterator()::next()::done", + "rhs get @@iterator()::next()::value", + "rhs call @@iterator()::next", + "rhs get @@iterator()::next()::done", + "rhs get @@iterator()::next()::value", + "rhs call @@iterator()::next", + "rhs get @@iterator()::next()::done", + + "lhs before name a", + "lhs set a", + + "lhs before name b", + "lhs set b", + ].join(",")); + assert.sameValue(this.values.a, "A"); + assert.sameValue(this.values.b.join(","), "B"); + + // Array -> Object + clear(); + [ + { + a: super[ (log("lhs before name a"), "a") ] + } + ] = logger([{a: "A"}]); + assert.sameValue(logs.join(","), + [ + "rhs get @@iterator", + "rhs call @@iterator", + "rhs get @@iterator()::next", + + "rhs call @@iterator()::next", + "rhs get @@iterator()::next()::done", + "rhs get @@iterator()::next()::value", + + "lhs before name a", + "rhs get @@iterator()::next()::value::a", + "lhs set a", + ].join(",")); + assert.sameValue(this.values.a, "A"); + + // Array rest -> Object + clear(); + [ + ...{ + 0: super[ (log("lhs before name 0"), "0") ], + 1: super[ (log("lhs before name 1"), "1") ], + length: super[ (log("lhs before name length"), "length") ], + } + ] = logger(["A", "B"]); + assert.sameValue(logs.join(","), + [ + "rhs get @@iterator", + "rhs call @@iterator", + "rhs get @@iterator()::next", + + "rhs call @@iterator()::next", + "rhs get @@iterator()::next()::done", + "rhs get @@iterator()::next()::value", + "rhs call @@iterator()::next", + "rhs get @@iterator()::next()::done", + "rhs get @@iterator()::next()::value", + "rhs call @@iterator()::next", + "rhs get @@iterator()::next()::done", + + "lhs before name 0", + "lhs set 0", + + "lhs before name 1", + "lhs set 1", + + "lhs before name length", + "lhs set length", + ].join(",")); + assert.sameValue(this.values["0"], "A"); + assert.sameValue(this.values["1"], "B"); + assert.sameValue(this.values.length, 2); + + // Object -> Array + clear(); + ({ + a: [ + super[ (log("lhs before name b"), "b") ] + ] + } = logger({a: ["B"]})); + assert.sameValue(logs.join(","), + [ + "rhs get a", + "rhs get a::@@iterator", + "rhs call a::@@iterator", + "rhs get a::@@iterator()::next", + + "lhs before name b", + "rhs call a::@@iterator()::next", + "rhs get a::@@iterator()::next()::done", + "rhs get a::@@iterator()::next()::value", + "lhs set b", + ].join(",")); + assert.sameValue(this.values.b, "B"); + + // Object -> Object + clear(); + ({ + a: { + b: super[ (log("lhs before name b"), "b") ] + } + } = logger({a: {b: "B"}})); + assert.sameValue(logs.join(","), + [ + "rhs get a", + "lhs before name b", + "rhs get a::b", + "lhs set b", + ].join(",")); + assert.sameValue(this.values.b, "B"); + + // All combined + + clear(); + [ + super[ (log("lhs before name a"), "a") ], + [ + super[ (log("lhs before name b"), "b") ], + { + c: super[ (log("lhs before name c"), "c") ], + d: { + e: super[ (log("lhs before name e"), "e") ], + f: [ + super[ (log("lhs before name g"), "g") ] + ] + } + } + ], + { + h: super[ (log("lhs before name h"), "h") ], + i: [ + super[ (log("lhs before name j"), "j") ], + { + k: [ + super[ (log("lhs before name l"), "l") ] + ] + } + ] + }, + ...[ + super[ (log("lhs before name m"), "m") ], + [ + super[ (log("lhs before name n"), "n") ], + { + o: super[ (log("lhs before name o"), "o") ], + p: { + q: super[ (log("lhs before name q"), "q") ], + r: [ + super[ (log("lhs before name s"), "s") ] + ] + } + } + ], + ...{ + 0: super[ (log("lhs before name t"), "t") ], + 1: [ + super[ (log("lhs before name u"), "u") ], + { + v: super[ (log("lhs before name v"), "v") ], + w: { + x: super[ (log("lhs before name x"), "x") ], + y: [ + super[ (log("lhs before name z"), "z") ] + ] + } + } + ], + length: super[ (log("lhs before name length"), "length") ], + } + ] + ] = logger(["A", + ["B", {c: "C", d: {e: "E", f: ["G"]}}], + {h: "H", i: ["J", {k: ["L"]}]}, + "M", + ["N", {o: "O", p: {q: "Q", r: ["S"]}}], + "T", ["U", {v: "V", w: {x: "X", y: ["Z"]}}]]); + assert.sameValue(logs.join(","), + [ + "rhs get @@iterator", + "rhs call @@iterator", + "rhs get @@iterator()::next", + + "lhs before name a", + "rhs call @@iterator()::next", + "rhs get @@iterator()::next()::done", + "rhs get @@iterator()::next()::value", + "lhs set a", + + "rhs call @@iterator()::next", + "rhs get @@iterator()::next()::done", + "rhs get @@iterator()::next()::value", + "rhs get @@iterator()::next()::value::@@iterator", + "rhs call @@iterator()::next()::value::@@iterator", + "rhs get @@iterator()::next()::value::@@iterator()::next", + + "lhs before name b", + "rhs call @@iterator()::next()::value::@@iterator()::next", + "rhs get @@iterator()::next()::value::@@iterator()::next()::done", + "rhs get @@iterator()::next()::value::@@iterator()::next()::value", + "lhs set b", + + "rhs call @@iterator()::next()::value::@@iterator()::next", + "rhs get @@iterator()::next()::value::@@iterator()::next()::done", + "rhs get @@iterator()::next()::value::@@iterator()::next()::value", + + "lhs before name c", + "rhs get @@iterator()::next()::value::@@iterator()::next()::value::c", + "lhs set c", + + "rhs get @@iterator()::next()::value::@@iterator()::next()::value::d", + + "lhs before name e", + "rhs get @@iterator()::next()::value::@@iterator()::next()::value::d::e", + "lhs set e", + + "rhs get @@iterator()::next()::value::@@iterator()::next()::value::d::f", + "rhs get @@iterator()::next()::value::@@iterator()::next()::value::d::f::@@iterator", + "rhs call @@iterator()::next()::value::@@iterator()::next()::value::d::f::@@iterator", + "rhs get @@iterator()::next()::value::@@iterator()::next()::value::d::f::@@iterator()::next", + + "lhs before name g", + "rhs call @@iterator()::next()::value::@@iterator()::next()::value::d::f::@@iterator()::next", + "rhs get @@iterator()::next()::value::@@iterator()::next()::value::d::f::@@iterator()::next()::done", + "rhs get @@iterator()::next()::value::@@iterator()::next()::value::d::f::@@iterator()::next()::value", + "lhs set g", + + "rhs call @@iterator()::next", + "rhs get @@iterator()::next()::done", + "rhs get @@iterator()::next()::value", + + "lhs before name h", + "rhs get @@iterator()::next()::value::h", + "lhs set h", + + "rhs get @@iterator()::next()::value::i", + "rhs get @@iterator()::next()::value::i::@@iterator", + "rhs call @@iterator()::next()::value::i::@@iterator", + "rhs get @@iterator()::next()::value::i::@@iterator()::next", + + "lhs before name j", + "rhs call @@iterator()::next()::value::i::@@iterator()::next", + "rhs get @@iterator()::next()::value::i::@@iterator()::next()::done", + "rhs get @@iterator()::next()::value::i::@@iterator()::next()::value", + "lhs set j", + + "rhs call @@iterator()::next()::value::i::@@iterator()::next", + "rhs get @@iterator()::next()::value::i::@@iterator()::next()::done", + "rhs get @@iterator()::next()::value::i::@@iterator()::next()::value", + + "rhs get @@iterator()::next()::value::i::@@iterator()::next()::value::k", + "rhs get @@iterator()::next()::value::i::@@iterator()::next()::value::k::@@iterator", + "rhs call @@iterator()::next()::value::i::@@iterator()::next()::value::k::@@iterator", + "rhs get @@iterator()::next()::value::i::@@iterator()::next()::value::k::@@iterator()::next", + + "lhs before name l", + "rhs call @@iterator()::next()::value::i::@@iterator()::next()::value::k::@@iterator()::next", + "rhs get @@iterator()::next()::value::i::@@iterator()::next()::value::k::@@iterator()::next()::done", + "rhs get @@iterator()::next()::value::i::@@iterator()::next()::value::k::@@iterator()::next()::value", + "lhs set l", + + "rhs call @@iterator()::next", + "rhs get @@iterator()::next()::done", + "rhs get @@iterator()::next()::value", + "rhs call @@iterator()::next", + "rhs get @@iterator()::next()::done", + "rhs get @@iterator()::next()::value", + "rhs call @@iterator()::next", + "rhs get @@iterator()::next()::done", + "rhs get @@iterator()::next()::value", + "rhs call @@iterator()::next", + "rhs get @@iterator()::next()::done", + "rhs get @@iterator()::next()::value", + "rhs call @@iterator()::next", + "rhs get @@iterator()::next()::done", + + "lhs before name m", + "lhs set m", + + "rhs get @@iterator()::next()::value::@@iterator", + "rhs call @@iterator()::next()::value::@@iterator", + "rhs get @@iterator()::next()::value::@@iterator()::next", + + "lhs before name n", + "rhs call @@iterator()::next()::value::@@iterator()::next", + "rhs get @@iterator()::next()::value::@@iterator()::next()::done", + "rhs get @@iterator()::next()::value::@@iterator()::next()::value", + "lhs set n", + + "rhs call @@iterator()::next()::value::@@iterator()::next", + "rhs get @@iterator()::next()::value::@@iterator()::next()::done", + "rhs get @@iterator()::next()::value::@@iterator()::next()::value", + + "lhs before name o", + "rhs get @@iterator()::next()::value::@@iterator()::next()::value::o", + "lhs set o", + + "rhs get @@iterator()::next()::value::@@iterator()::next()::value::p", + + "lhs before name q", + "rhs get @@iterator()::next()::value::@@iterator()::next()::value::p::q", + "lhs set q", + + "rhs get @@iterator()::next()::value::@@iterator()::next()::value::p::r", + "rhs get @@iterator()::next()::value::@@iterator()::next()::value::p::r::@@iterator", + "rhs call @@iterator()::next()::value::@@iterator()::next()::value::p::r::@@iterator", + "rhs get @@iterator()::next()::value::@@iterator()::next()::value::p::r::@@iterator()::next", + + "lhs before name s", + "rhs call @@iterator()::next()::value::@@iterator()::next()::value::p::r::@@iterator()::next", + "rhs get @@iterator()::next()::value::@@iterator()::next()::value::p::r::@@iterator()::next()::done", + "rhs get @@iterator()::next()::value::@@iterator()::next()::value::p::r::@@iterator()::next()::value", + "lhs set s", + + "lhs before name t", + "lhs set t", + + "rhs get @@iterator()::next()::value::@@iterator", + "rhs call @@iterator()::next()::value::@@iterator", + "rhs get @@iterator()::next()::value::@@iterator()::next", + + "lhs before name u", + "rhs call @@iterator()::next()::value::@@iterator()::next", + "rhs get @@iterator()::next()::value::@@iterator()::next()::done", + "rhs get @@iterator()::next()::value::@@iterator()::next()::value", + "lhs set u", + + "rhs call @@iterator()::next()::value::@@iterator()::next", + "rhs get @@iterator()::next()::value::@@iterator()::next()::done", + "rhs get @@iterator()::next()::value::@@iterator()::next()::value", + + "lhs before name v", + "rhs get @@iterator()::next()::value::@@iterator()::next()::value::v", + "lhs set v", + + "rhs get @@iterator()::next()::value::@@iterator()::next()::value::w", + + "lhs before name x", + "rhs get @@iterator()::next()::value::@@iterator()::next()::value::w::x", + "lhs set x", + + "rhs get @@iterator()::next()::value::@@iterator()::next()::value::w::y", + "rhs get @@iterator()::next()::value::@@iterator()::next()::value::w::y::@@iterator", + "rhs call @@iterator()::next()::value::@@iterator()::next()::value::w::y::@@iterator", + "rhs get @@iterator()::next()::value::@@iterator()::next()::value::w::y::@@iterator()::next", + + "lhs before name z", + "rhs call @@iterator()::next()::value::@@iterator()::next()::value::w::y::@@iterator()::next", + "rhs get @@iterator()::next()::value::@@iterator()::next()::value::w::y::@@iterator()::next()::done", + "rhs get @@iterator()::next()::value::@@iterator()::next()::value::w::y::@@iterator()::next()::value", + "lhs set z", + + "lhs before name length", + "lhs set length", + ].join(",")); + assert.sameValue(this.values.a, "A"); + assert.sameValue(this.values.b, "B"); + assert.sameValue(this.values.c, "C"); + assert.sameValue(this.values.e, "E"); + assert.sameValue(this.values.g, "G"); + assert.sameValue(this.values.h, "H"); + assert.sameValue(this.values.j, "J"); + assert.sameValue(this.values.l, "L"); + assert.sameValue(this.values.m, "M"); + assert.sameValue(this.values.n, "N"); + assert.sameValue(this.values.o, "O"); + assert.sameValue(this.values.q, "Q"); + assert.sameValue(this.values.s, "S"); + assert.sameValue(this.values.t, "T"); + assert.sameValue(this.values.u, "U"); + assert.sameValue(this.values.v, "V"); + assert.sameValue(this.values.x, "X"); + assert.sameValue(this.values.z, "Z"); + assert.sameValue(this.values.length, 2); + } +} + +new C2(); + diff --git a/test/staging/sm/destructuring/order.js b/test/staging/sm/destructuring/order.js new file mode 100644 index 0000000000..f56dcb2831 --- /dev/null +++ b/test/staging/sm/destructuring/order.js @@ -0,0 +1,728 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +var BUGNUMBER = 1204028; +var summary = "Destructuring should evaluate lhs reference before rhs"; + +print(BUGNUMBER + ": " + summary); + +let storage = { + clear() { + this.values = {}; + } +}; +storage.clear(); +let obj = new Proxy(storage, { + set(that, name, value) { + log("lhs set " + name); + storage.values[name] = value; + } +}); + +let logs = []; +function log(x) { + logs.push(x); +} + +function clear() { + logs = []; + storage.clear(); +} + +let unwrapMap = new Map(); +function unwrap(maybeWrapped) { + if (unwrapMap.has(maybeWrapped)) + return unwrapMap.get(maybeWrapped); + return maybeWrapped; +} +function ToString(name) { + if (name == Symbol.iterator) + return "@@iterator"; + return String(name); +} +function logger(obj, prefix=[]) { + let wrapped = new Proxy(obj, { + get(that, name) { + if (name == "return") { + // FIXME: Bug 1147371. + // We ignore IteratorClose for now. + return obj[name]; + } + + let names = prefix.concat(ToString(name)); + log("rhs get " + names.join("::")); + let v = obj[name]; + if (typeof v === "object" || typeof v === "function") + return logger(v, names); + return v; + }, + apply(that, thisArg, args) { + let names = prefix.slice(); + log("rhs call " + names.join("::")); + let v = obj.apply(unwrap(thisArg), args); + if (typeof v === "object" || typeof v === "function") { + names[names.length - 1] += "()"; + return logger(v, names); + } + return v; + } + }); + unwrapMap.set(wrapped, obj); + return wrapped; +} + +// Array. + +clear(); +[ + ( log("lhs before obj a"), obj ).a +] = logger(["A"]); +assert.sameValue(logs.join(","), + [ + "rhs get @@iterator", + "rhs call @@iterator", + "rhs get @@iterator()::next", + + "lhs before obj a", + "rhs call @@iterator()::next", + "rhs get @@iterator()::next()::done", + "rhs get @@iterator()::next()::value", + "lhs set a", + ].join(",")); +assert.sameValue(storage.values.a, "A"); + +clear(); +[ + ( log("lhs before obj a"), obj )[ (log("lhs before name a"), "a") ] +] = logger(["A"]); +assert.sameValue(logs.join(","), + [ + "rhs get @@iterator", + "rhs call @@iterator", + "rhs get @@iterator()::next", + + "lhs before obj a", + "lhs before name a", + "rhs call @@iterator()::next", + "rhs get @@iterator()::next()::done", + "rhs get @@iterator()::next()::value", + "lhs set a", + ].join(",")); +assert.sameValue(storage.values.a, "A"); + +// Array rest. + +clear(); +[ + ...( log("lhs before obj a"), obj ).a +] = logger(["A", "B", "C"]); +assert.sameValue(logs.join(","), + [ + "rhs get @@iterator", + "rhs call @@iterator", + "rhs get @@iterator()::next", + + "lhs before obj a", + "rhs call @@iterator()::next", + "rhs get @@iterator()::next()::done", + "rhs get @@iterator()::next()::value", + "rhs call @@iterator()::next", + "rhs get @@iterator()::next()::done", + "rhs get @@iterator()::next()::value", + "rhs call @@iterator()::next", + "rhs get @@iterator()::next()::done", + "rhs get @@iterator()::next()::value", + "rhs call @@iterator()::next", + "rhs get @@iterator()::next()::done", + "lhs set a", + ].join(",")); +assert.sameValue(storage.values.a.join(","), "A,B,C"); + +clear(); +[ + ...( log("lhs before obj a"), obj )[ (log("lhs before name a"), "a") ] +] = logger(["A", "B", "C"]);; +assert.sameValue(logs.join(","), + [ + "rhs get @@iterator", + "rhs call @@iterator", + "rhs get @@iterator()::next", + + "lhs before obj a", + "lhs before name a", + "rhs call @@iterator()::next", + "rhs get @@iterator()::next()::done", + "rhs get @@iterator()::next()::value", + "rhs call @@iterator()::next", + "rhs get @@iterator()::next()::done", + "rhs get @@iterator()::next()::value", + "rhs call @@iterator()::next", + "rhs get @@iterator()::next()::done", + "rhs get @@iterator()::next()::value", + "rhs call @@iterator()::next", + "rhs get @@iterator()::next()::done", + "lhs set a", + ].join(",")); +assert.sameValue(storage.values.a.join(","), "A,B,C"); + +// Array combined. + +clear(); +[ + ( log("lhs before obj a"), obj ).a, + ( log("lhs before obj b"), obj )[ (log("lhs before name b"), "b") ], + ...( log("lhs before obj c"), obj )[ (log("lhs before name c"), "c") ] +] = logger(["A", "B", "C"]); +assert.sameValue(logs.join(","), + [ + "rhs get @@iterator", + "rhs call @@iterator", + "rhs get @@iterator()::next", + + "lhs before obj a", + "rhs call @@iterator()::next", + "rhs get @@iterator()::next()::done", + "rhs get @@iterator()::next()::value", + "lhs set a", + + "lhs before obj b", + "lhs before name b", + "rhs call @@iterator()::next", + "rhs get @@iterator()::next()::done", + "rhs get @@iterator()::next()::value", + "lhs set b", + + "lhs before obj c", + "lhs before name c", + "rhs call @@iterator()::next", + "rhs get @@iterator()::next()::done", + "rhs get @@iterator()::next()::value", + "rhs call @@iterator()::next", + "rhs get @@iterator()::next()::done", + "lhs set c", + ].join(",")); +assert.sameValue(storage.values.a, "A"); +assert.sameValue(storage.values.b, "B"); +assert.sameValue(storage.values.c.join(","), "C"); + +// Object. + +clear(); +({ + a: ( log("lhs before obj a"), obj ).a +} = logger({a: "A"})); +assert.sameValue(logs.join(","), + [ + "lhs before obj a", + "rhs get a", + "lhs set a", + ].join(",")); +assert.sameValue(storage.values.a, "A"); + +clear(); +({ + a: ( log("lhs before obj a"), obj )[ (log("lhs before name a"), "a") ] +} = logger({a: "A"})); +assert.sameValue(logs.join(","), + [ + "lhs before obj a", + "lhs before name a", + "rhs get a", + "lhs set a", + ].join(",")); +assert.sameValue(storage.values.a, "A"); + +// Object combined. + +clear(); +({ + a: ( log("lhs before obj a"), obj ).a, + b: ( log("lhs before obj b"), obj )[ (log("lhs before name b"), "b") ] +} = logger({a: "A", b: "B"})); +assert.sameValue(logs.join(","), + [ + "lhs before obj a", + "rhs get a", + "lhs set a", + + "lhs before obj b", + "lhs before name b", + "rhs get b", + "lhs set b", + ].join(",")); +assert.sameValue(storage.values.a, "A"); +assert.sameValue(storage.values.b, "B"); + +// == Nested == + +// Array -> Array + +clear(); +[ + [ + ( log("lhs before obj a"), obj )[ (log("lhs before name a"), "a") ], + ...( log("lhs before obj b"), obj )[ (log("lhs before name b"), "b") ] + ] +] = logger([["A", "B"]]); +assert.sameValue(logs.join(","), + [ + "rhs get @@iterator", + "rhs call @@iterator", + "rhs get @@iterator()::next", + + "rhs call @@iterator()::next", + "rhs get @@iterator()::next()::done", + "rhs get @@iterator()::next()::value", + "rhs get @@iterator()::next()::value::@@iterator", + "rhs call @@iterator()::next()::value::@@iterator", + "rhs get @@iterator()::next()::value::@@iterator()::next", + + "lhs before obj a", + "lhs before name a", + "rhs call @@iterator()::next()::value::@@iterator()::next", + "rhs get @@iterator()::next()::value::@@iterator()::next()::done", + "rhs get @@iterator()::next()::value::@@iterator()::next()::value", + "lhs set a", + + "lhs before obj b", + "lhs before name b", + "rhs call @@iterator()::next()::value::@@iterator()::next", + "rhs get @@iterator()::next()::value::@@iterator()::next()::done", + "rhs get @@iterator()::next()::value::@@iterator()::next()::value", + "rhs call @@iterator()::next()::value::@@iterator()::next", + "rhs get @@iterator()::next()::value::@@iterator()::next()::done", + "lhs set b", + ].join(",")); +assert.sameValue(storage.values.a, "A"); +assert.sameValue(storage.values.b.length, 1); +assert.sameValue(storage.values.b[0], "B"); + +// Array rest -> Array + +clear(); +[ + ...[ + ( log("lhs before obj a"), obj )[ (log("lhs before name a"), "a") ], + ...( log("lhs before obj b"), obj )[ (log("lhs before name b"), "b") ] + ] +] = logger(["A", "B"]); +assert.sameValue(logs.join(","), + [ + "rhs get @@iterator", + "rhs call @@iterator", + "rhs get @@iterator()::next", + + "rhs call @@iterator()::next", + "rhs get @@iterator()::next()::done", + "rhs get @@iterator()::next()::value", + "rhs call @@iterator()::next", + "rhs get @@iterator()::next()::done", + "rhs get @@iterator()::next()::value", + "rhs call @@iterator()::next", + "rhs get @@iterator()::next()::done", + + "lhs before obj a", + "lhs before name a", + "lhs set a", + + "lhs before obj b", + "lhs before name b", + "lhs set b", + ].join(",")); +assert.sameValue(storage.values.a, "A"); +assert.sameValue(storage.values.b.join(","), "B"); + +// Array -> Object +clear(); +[ + { + a: ( log("lhs before obj a"), obj )[ (log("lhs before name a"), "a") ] + } +] = logger([{a: "A"}]); +assert.sameValue(logs.join(","), + [ + "rhs get @@iterator", + "rhs call @@iterator", + "rhs get @@iterator()::next", + + "rhs call @@iterator()::next", + "rhs get @@iterator()::next()::done", + "rhs get @@iterator()::next()::value", + + "lhs before obj a", + "lhs before name a", + "rhs get @@iterator()::next()::value::a", + "lhs set a", + ].join(",")); +assert.sameValue(storage.values.a, "A"); + +// Array rest -> Object +clear(); +[ + ...{ + 0: ( log("lhs before obj 0"), obj )[ (log("lhs before name 0"), "0") ], + 1: ( log("lhs before obj 1"), obj )[ (log("lhs before name 1"), "1") ], + length: ( log("lhs before obj length"), obj )[ (log("lhs before name length"), "length") ], + } +] = logger(["A", "B"]); +assert.sameValue(logs.join(","), + [ + "rhs get @@iterator", + "rhs call @@iterator", + "rhs get @@iterator()::next", + + "rhs call @@iterator()::next", + "rhs get @@iterator()::next()::done", + "rhs get @@iterator()::next()::value", + "rhs call @@iterator()::next", + "rhs get @@iterator()::next()::done", + "rhs get @@iterator()::next()::value", + "rhs call @@iterator()::next", + "rhs get @@iterator()::next()::done", + + "lhs before obj 0", + "lhs before name 0", + "lhs set 0", + + "lhs before obj 1", + "lhs before name 1", + "lhs set 1", + + "lhs before obj length", + "lhs before name length", + "lhs set length", + ].join(",")); +assert.sameValue(storage.values["0"], "A"); +assert.sameValue(storage.values["1"], "B"); +assert.sameValue(storage.values.length, 2); + +// Object -> Array +clear(); +({ + a: [ + ( log("lhs before obj b"), obj )[ (log("lhs before name b"), "b") ] + ] +} = logger({a: ["B"]})); +assert.sameValue(logs.join(","), + [ + "rhs get a", + "rhs get a::@@iterator", + "rhs call a::@@iterator", + "rhs get a::@@iterator()::next", + + "lhs before obj b", + "lhs before name b", + "rhs call a::@@iterator()::next", + "rhs get a::@@iterator()::next()::done", + "rhs get a::@@iterator()::next()::value", + "lhs set b", + ].join(",")); +assert.sameValue(storage.values.b, "B"); + +// Object -> Object +clear(); +({ + a: { + b: ( log("lhs before obj b"), obj )[ (log("lhs before name b"), "b") ] + } +} = logger({a: {b: "B"}})); +assert.sameValue(logs.join(","), + [ + "rhs get a", + "lhs before obj b", + "lhs before name b", + "rhs get a::b", + "lhs set b", + ].join(",")); +assert.sameValue(storage.values.b, "B"); + +// All combined + +clear(); +[ + ( log("lhs before obj a"), obj )[ (log("lhs before name a"), "a") ], + [ + ( log("lhs before obj b"), obj )[ (log("lhs before name b"), "b") ], + { + c: ( log("lhs before obj c"), obj )[ (log("lhs before name c"), "c") ], + d: { + e: ( log("lhs before obj e"), obj )[ (log("lhs before name e"), "e") ], + f: [ + ( log("lhs before obj g"), obj )[ (log("lhs before name g"), "g") ] + ] + } + } + ], + { + h: ( log("lhs before obj h"), obj )[ (log("lhs before name h"), "h") ], + i: [ + ( log("lhs before obj j"), obj )[ (log("lhs before name j"), "j") ], + { + k: [ + ( log("lhs before obj l"), obj )[ (log("lhs before name l"), "l") ] + ] + } + ] + }, + ...[ + ( log("lhs before obj m"), obj )[ (log("lhs before name m"), "m") ], + [ + ( log("lhs before obj n"), obj )[ (log("lhs before name n"), "n") ], + { + o: ( log("lhs before obj o"), obj )[ (log("lhs before name o"), "o") ], + p: { + q: ( log("lhs before obj q"), obj )[ (log("lhs before name q"), "q") ], + r: [ + ( log("lhs before obj s"), obj )[ (log("lhs before name s"), "s") ] + ] + } + } + ], + ...{ + 0: ( log("lhs before obj t"), obj )[ (log("lhs before name t"), "t") ], + 1: [ + ( log("lhs before obj u"), obj )[ (log("lhs before name u"), "u") ], + { + v: ( log("lhs before obj v"), obj )[ (log("lhs before name v"), "v") ], + w: { + x: ( log("lhs before obj x"), obj )[ (log("lhs before name x"), "x") ], + y: [ + ( log("lhs before obj z"), obj )[ (log("lhs before name z"), "z") ] + ] + } + } + ], + length: ( log("lhs before obj length"), obj )[ (log("lhs before name length"), "length") ], + } + ] +] = logger(["A", + ["B", {c: "C", d: {e: "E", f: ["G"]}}], + {h: "H", i: ["J", {k: ["L"]}]}, + "M", + ["N", {o: "O", p: {q: "Q", r: ["S"]}}], + "T", ["U", {v: "V", w: {x: "X", y: ["Z"]}}]]); +assert.sameValue(logs.join(","), + [ + "rhs get @@iterator", + "rhs call @@iterator", + "rhs get @@iterator()::next", + + "lhs before obj a", + "lhs before name a", + "rhs call @@iterator()::next", + "rhs get @@iterator()::next()::done", + "rhs get @@iterator()::next()::value", + "lhs set a", + + "rhs call @@iterator()::next", + "rhs get @@iterator()::next()::done", + "rhs get @@iterator()::next()::value", + "rhs get @@iterator()::next()::value::@@iterator", + "rhs call @@iterator()::next()::value::@@iterator", + "rhs get @@iterator()::next()::value::@@iterator()::next", + + "lhs before obj b", + "lhs before name b", + "rhs call @@iterator()::next()::value::@@iterator()::next", + "rhs get @@iterator()::next()::value::@@iterator()::next()::done", + "rhs get @@iterator()::next()::value::@@iterator()::next()::value", + "lhs set b", + + "rhs call @@iterator()::next()::value::@@iterator()::next", + "rhs get @@iterator()::next()::value::@@iterator()::next()::done", + "rhs get @@iterator()::next()::value::@@iterator()::next()::value", + + "lhs before obj c", + "lhs before name c", + "rhs get @@iterator()::next()::value::@@iterator()::next()::value::c", + "lhs set c", + + "rhs get @@iterator()::next()::value::@@iterator()::next()::value::d", + + "lhs before obj e", + "lhs before name e", + "rhs get @@iterator()::next()::value::@@iterator()::next()::value::d::e", + "lhs set e", + + "rhs get @@iterator()::next()::value::@@iterator()::next()::value::d::f", + "rhs get @@iterator()::next()::value::@@iterator()::next()::value::d::f::@@iterator", + "rhs call @@iterator()::next()::value::@@iterator()::next()::value::d::f::@@iterator", + "rhs get @@iterator()::next()::value::@@iterator()::next()::value::d::f::@@iterator()::next", + + "lhs before obj g", + "lhs before name g", + "rhs call @@iterator()::next()::value::@@iterator()::next()::value::d::f::@@iterator()::next", + "rhs get @@iterator()::next()::value::@@iterator()::next()::value::d::f::@@iterator()::next()::done", + "rhs get @@iterator()::next()::value::@@iterator()::next()::value::d::f::@@iterator()::next()::value", + "lhs set g", + + "rhs call @@iterator()::next", + "rhs get @@iterator()::next()::done", + "rhs get @@iterator()::next()::value", + + "lhs before obj h", + "lhs before name h", + "rhs get @@iterator()::next()::value::h", + "lhs set h", + + "rhs get @@iterator()::next()::value::i", + "rhs get @@iterator()::next()::value::i::@@iterator", + "rhs call @@iterator()::next()::value::i::@@iterator", + "rhs get @@iterator()::next()::value::i::@@iterator()::next", + + "lhs before obj j", + "lhs before name j", + "rhs call @@iterator()::next()::value::i::@@iterator()::next", + "rhs get @@iterator()::next()::value::i::@@iterator()::next()::done", + "rhs get @@iterator()::next()::value::i::@@iterator()::next()::value", + "lhs set j", + + "rhs call @@iterator()::next()::value::i::@@iterator()::next", + "rhs get @@iterator()::next()::value::i::@@iterator()::next()::done", + "rhs get @@iterator()::next()::value::i::@@iterator()::next()::value", + + "rhs get @@iterator()::next()::value::i::@@iterator()::next()::value::k", + "rhs get @@iterator()::next()::value::i::@@iterator()::next()::value::k::@@iterator", + "rhs call @@iterator()::next()::value::i::@@iterator()::next()::value::k::@@iterator", + "rhs get @@iterator()::next()::value::i::@@iterator()::next()::value::k::@@iterator()::next", + + "lhs before obj l", + "lhs before name l", + "rhs call @@iterator()::next()::value::i::@@iterator()::next()::value::k::@@iterator()::next", + "rhs get @@iterator()::next()::value::i::@@iterator()::next()::value::k::@@iterator()::next()::done", + "rhs get @@iterator()::next()::value::i::@@iterator()::next()::value::k::@@iterator()::next()::value", + "lhs set l", + + "rhs call @@iterator()::next", + "rhs get @@iterator()::next()::done", + "rhs get @@iterator()::next()::value", + "rhs call @@iterator()::next", + "rhs get @@iterator()::next()::done", + "rhs get @@iterator()::next()::value", + "rhs call @@iterator()::next", + "rhs get @@iterator()::next()::done", + "rhs get @@iterator()::next()::value", + "rhs call @@iterator()::next", + "rhs get @@iterator()::next()::done", + "rhs get @@iterator()::next()::value", + "rhs call @@iterator()::next", + "rhs get @@iterator()::next()::done", + + "lhs before obj m", + "lhs before name m", + "lhs set m", + + "rhs get @@iterator()::next()::value::@@iterator", + "rhs call @@iterator()::next()::value::@@iterator", + "rhs get @@iterator()::next()::value::@@iterator()::next", + + "lhs before obj n", + "lhs before name n", + "rhs call @@iterator()::next()::value::@@iterator()::next", + "rhs get @@iterator()::next()::value::@@iterator()::next()::done", + "rhs get @@iterator()::next()::value::@@iterator()::next()::value", + "lhs set n", + + "rhs call @@iterator()::next()::value::@@iterator()::next", + "rhs get @@iterator()::next()::value::@@iterator()::next()::done", + "rhs get @@iterator()::next()::value::@@iterator()::next()::value", + + "lhs before obj o", + "lhs before name o", + "rhs get @@iterator()::next()::value::@@iterator()::next()::value::o", + "lhs set o", + + "rhs get @@iterator()::next()::value::@@iterator()::next()::value::p", + + "lhs before obj q", + "lhs before name q", + "rhs get @@iterator()::next()::value::@@iterator()::next()::value::p::q", + "lhs set q", + + "rhs get @@iterator()::next()::value::@@iterator()::next()::value::p::r", + "rhs get @@iterator()::next()::value::@@iterator()::next()::value::p::r::@@iterator", + "rhs call @@iterator()::next()::value::@@iterator()::next()::value::p::r::@@iterator", + "rhs get @@iterator()::next()::value::@@iterator()::next()::value::p::r::@@iterator()::next", + + "lhs before obj s", + "lhs before name s", + "rhs call @@iterator()::next()::value::@@iterator()::next()::value::p::r::@@iterator()::next", + "rhs get @@iterator()::next()::value::@@iterator()::next()::value::p::r::@@iterator()::next()::done", + "rhs get @@iterator()::next()::value::@@iterator()::next()::value::p::r::@@iterator()::next()::value", + "lhs set s", + + "lhs before obj t", + "lhs before name t", + "lhs set t", + + "rhs get @@iterator()::next()::value::@@iterator", + "rhs call @@iterator()::next()::value::@@iterator", + "rhs get @@iterator()::next()::value::@@iterator()::next", + + "lhs before obj u", + "lhs before name u", + "rhs call @@iterator()::next()::value::@@iterator()::next", + "rhs get @@iterator()::next()::value::@@iterator()::next()::done", + "rhs get @@iterator()::next()::value::@@iterator()::next()::value", + "lhs set u", + + "rhs call @@iterator()::next()::value::@@iterator()::next", + "rhs get @@iterator()::next()::value::@@iterator()::next()::done", + "rhs get @@iterator()::next()::value::@@iterator()::next()::value", + + "lhs before obj v", + "lhs before name v", + "rhs get @@iterator()::next()::value::@@iterator()::next()::value::v", + "lhs set v", + + "rhs get @@iterator()::next()::value::@@iterator()::next()::value::w", + + "lhs before obj x", + "lhs before name x", + "rhs get @@iterator()::next()::value::@@iterator()::next()::value::w::x", + "lhs set x", + + "rhs get @@iterator()::next()::value::@@iterator()::next()::value::w::y", + "rhs get @@iterator()::next()::value::@@iterator()::next()::value::w::y::@@iterator", + "rhs call @@iterator()::next()::value::@@iterator()::next()::value::w::y::@@iterator", + "rhs get @@iterator()::next()::value::@@iterator()::next()::value::w::y::@@iterator()::next", + + "lhs before obj z", + "lhs before name z", + "rhs call @@iterator()::next()::value::@@iterator()::next()::value::w::y::@@iterator()::next", + "rhs get @@iterator()::next()::value::@@iterator()::next()::value::w::y::@@iterator()::next()::done", + "rhs get @@iterator()::next()::value::@@iterator()::next()::value::w::y::@@iterator()::next()::value", + "lhs set z", + + "lhs before obj length", + "lhs before name length", + "lhs set length", + ].join(",")); +assert.sameValue(storage.values.a, "A"); +assert.sameValue(storage.values.b, "B"); +assert.sameValue(storage.values.c, "C"); +assert.sameValue(storage.values.e, "E"); +assert.sameValue(storage.values.g, "G"); +assert.sameValue(storage.values.h, "H"); +assert.sameValue(storage.values.j, "J"); +assert.sameValue(storage.values.l, "L"); +assert.sameValue(storage.values.m, "M"); +assert.sameValue(storage.values.n, "N"); +assert.sameValue(storage.values.o, "O"); +assert.sameValue(storage.values.q, "Q"); +assert.sameValue(storage.values.s, "S"); +assert.sameValue(storage.values.t, "T"); +assert.sameValue(storage.values.u, "U"); +assert.sameValue(storage.values.v, "V"); +assert.sameValue(storage.values.x, "X"); +assert.sameValue(storage.values.z, "Z"); +assert.sameValue(storage.values.length, 2); + diff --git a/test/staging/sm/eval/exhaustive-fun-normalcaller-direct-normalcode.js b/test/staging/sm/eval/exhaustive-fun-normalcaller-direct-normalcode.js new file mode 100644 index 0000000000..bdb30819d7 --- /dev/null +++ b/test/staging/sm/eval/exhaustive-fun-normalcaller-direct-normalcode.js @@ -0,0 +1,215 @@ +/* + * Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/licenses/publicdomain/ + */ + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +//----------------------------------------------------------------------------- +var BUGNUMBER = 514568; +var summary = "eval in all its myriad flavors"; + +print(BUGNUMBER + ": " + summary); + +/************** + * BEGIN TEST * + **************/ + +var x = 17; +function globalX() { return x; } +var y = 42; +function globalY() { return y; } + +var ev = eval; + +function testX() +{ + var x = 2; + var xcode = + "var x = 4;" + + "function actX(action)" + + "{" + + " switch (action)" + + " {" + + " case 'get':" + + " return x;" + + " case 'set1':" + + " x = 9;" + + " return;" + + " case 'set2':" + + " x = 23;" + + " return;" + + " case 'delete':" + + " try { return eval('delete x'); }" + + " catch (e) { return e.name; }" + + " }" + + "}" + + "actX;"; + + var local0 = x; + var global0 = globalX(); + + var f = eval(xcode); + + var inner1 = f("get"); + var local1 = x; + var global1 = globalX(); + + x = 7; + var inner2 = f("get"); + var local2 = x; + var global2 = globalX(); + + f("set1"); + var inner3 = f("get"); + var local3 = x; + var global3 = globalX(); + + var del = f("delete"); + var inner4 = f("get"); + var local4 = x; + var global4 = globalX(); + + f("set2"); + var inner5 = f("get"); + var local5 = x; + var global5 = globalX(); + + return { + local0: local0, global0: global0, + inner1: inner1, local1: local1, global1: global1, + inner2: inner2, local2: local2, global2: global2, + inner3: inner3, local3: local3, global3: global3, + del: del, + inner4: inner4, local4: local4, global4: global4, + inner5: inner5, local5: local5, global5: global5, + }; +} + +var resultsX = testX(); + +assert.sameValue(resultsX.local0, 2); +assert.sameValue(resultsX.global0, 17); + +assert.sameValue(resultsX.inner1, 4); +assert.sameValue(resultsX.local1, 4); +assert.sameValue(resultsX.global1, 17); + +assert.sameValue(resultsX.inner2, 7); +assert.sameValue(resultsX.local2, 7); +assert.sameValue(resultsX.global2, 17); + +assert.sameValue(resultsX.inner3, 9); +assert.sameValue(resultsX.local3, 9); +assert.sameValue(resultsX.global3, 17); + +assert.sameValue(resultsX.del, false); + +assert.sameValue(resultsX.inner4, 9); +assert.sameValue(resultsX.local4, 9); +assert.sameValue(resultsX.global4, 17); + +assert.sameValue(resultsX.inner5, 23); +assert.sameValue(resultsX.local5, 23); +assert.sameValue(resultsX.global5, 17); + + +function testY() +{ + var ycode = + "var y = 5;" + + "function actY(action)" + + "{" + + " switch (action)" + + " {" + + " case 'get':" + + " return y;" + + " case 'set1':" + + " y = 2;" + + " return;" + + " case 'set2':" + + " y = 71;" + + " return;" + + " case 'delete':" + + " try { return eval('delete y'); }" + + " catch (e) { return e.name; }" + + " }" + + "}" + + "actY;"; + + var local0 = y; + var global0 = globalY(); + + var f = eval(ycode); + + var inner1 = f("get"); + var local1 = y; + var global1 = globalY(); + + y = 8; + var inner2 = f("get"); + var local2 = y; + var global2 = globalY(); + + f("set1"); + var inner3 = f("get"); + var local3 = y; + var global3 = globalY(); + + var del = f("delete"); + var inner4 = f("get"); + var local4 = y; + var global4 = globalY(); + + f("set2"); + var inner5 = f("get"); + var local5 = y; + var global5 = globalY(); + + return { + local0: local0, global0: global0, + inner1: inner1, local1: local1, global1: global1, + inner2: inner2, local2: local2, global2: global2, + inner3: inner3, local3: local3, global3: global3, + del: del, + inner4: inner4, local4: local4, global4: global4, + inner5: inner5, local5: local5, global5: global5, + }; +} + +var resultsY = testY(); + +assert.sameValue(resultsY.local0, 42); +assert.sameValue(resultsY.global0, 42); + +assert.sameValue(resultsY.inner1, 5); +assert.sameValue(resultsY.local1, 5); +assert.sameValue(resultsY.global1, 42); + +assert.sameValue(resultsY.inner2, 8); +assert.sameValue(resultsY.local2, 8); +assert.sameValue(resultsY.global2, 42); + +assert.sameValue(resultsY.inner3, 2); +assert.sameValue(resultsY.local3, 2); +assert.sameValue(resultsY.global3, 42); + +assert.sameValue(resultsY.del, true); + +assert.sameValue(resultsY.inner4, 42); +assert.sameValue(resultsY.local4, 42); +assert.sameValue(resultsY.global4, 42); + +assert.sameValue(resultsY.inner5, 71); +assert.sameValue(resultsY.local5, 71); +assert.sameValue(resultsY.global5, 71); + +/******************************************************************************/ + +print("Tests complete!"); diff --git a/test/staging/sm/eval/exhaustive-fun-normalcaller-direct-strictcode.js b/test/staging/sm/eval/exhaustive-fun-normalcaller-direct-strictcode.js new file mode 100644 index 0000000000..55fd18518d --- /dev/null +++ b/test/staging/sm/eval/exhaustive-fun-normalcaller-direct-strictcode.js @@ -0,0 +1,217 @@ +/* + * Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/licenses/publicdomain/ + */ + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +//----------------------------------------------------------------------------- +var BUGNUMBER = 514568; +var summary = "eval in all its myriad flavors"; + +print(BUGNUMBER + ": " + summary); + +/************** + * BEGIN TEST * + **************/ + +var x = 17; +function globalX() { return x; } +var y = 42; +function globalY() { return y; } + +var ev = eval; + +function testX() +{ + var x = 2; + var xcode = + "'use strict';" + + "var x = 4;" + + "function actX(action)" + + "{" + + " switch (action)" + + " {" + + " case 'get':" + + " return x;" + + " case 'set1':" + + " x = 9;" + + " return;" + + " case 'set2':" + + " x = 23;" + + " return;" + + " case 'delete':" + + " try { return eval('delete x'); }" + + " catch (e) { return e.name; }" + + " }" + + "}" + + "actX;"; + + var local0 = x; + var global0 = globalX(); + + var f = eval(xcode); + + var inner1 = f("get"); + var local1 = x; + var global1 = globalX(); + + x = 7; + var inner2 = f("get"); + var local2 = x; + var global2 = globalX(); + + f("set1"); + var inner3 = f("get"); + var local3 = x; + var global3 = globalX(); + + var del = f("delete"); + var inner4 = f("get"); + var local4 = x; + var global4 = globalX(); + + f("set2"); + var inner5 = f("get"); + var local5 = x; + var global5 = globalX(); + + return { + local0: local0, global0: global0, + inner1: inner1, local1: local1, global1: global1, + inner2: inner2, local2: local2, global2: global2, + inner3: inner3, local3: local3, global3: global3, + del: del, + inner4: inner4, local4: local4, global4: global4, + inner5: inner5, local5: local5, global5: global5, + }; +} + +var resultsX = testX(); + +assert.sameValue(resultsX.local0, 2); +assert.sameValue(resultsX.global0, 17); + +assert.sameValue(resultsX.inner1, 4); +assert.sameValue(resultsX.local1, 2); +assert.sameValue(resultsX.global1, 17); + +assert.sameValue(resultsX.inner2, 4); +assert.sameValue(resultsX.local2, 7); +assert.sameValue(resultsX.global2, 17); + +assert.sameValue(resultsX.inner3, 9); +assert.sameValue(resultsX.local3, 7); +assert.sameValue(resultsX.global3, 17); + +assert.sameValue(resultsX.del, "SyntaxError"); + +assert.sameValue(resultsX.inner4, 9); +assert.sameValue(resultsX.local4, 7); +assert.sameValue(resultsX.global4, 17); + +assert.sameValue(resultsX.inner5, 23); +assert.sameValue(resultsX.local5, 7); +assert.sameValue(resultsX.global5, 17); + + +function testY() +{ + var ycode = + "'use strict';" + + "var y = 5;" + + "function actY(action)" + + "{" + + " switch (action)" + + " {" + + " case 'get':" + + " return y;" + + " case 'set1':" + + " y = 2;" + + " return;" + + " case 'set2':" + + " y = 71;" + + " return;" + + " case 'delete':" + + " try { return eval('delete y'); }" + + " catch (e) { return e.name; }" + + " }" + + "}" + + "actY;"; + + var local0 = y; + var global0 = globalY(); + + var f = eval(ycode); + + var inner1 = f("get"); + var local1 = y; + var global1 = globalY(); + + y = 8; + var inner2 = f("get"); + var local2 = y; + var global2 = globalY(); + + f("set1"); + var inner3 = f("get"); + var local3 = y; + var global3 = globalY(); + + var del = f("delete"); + var inner4 = f("get"); + var local4 = y; + var global4 = globalY(); + + f("set2"); + var inner5 = f("get"); + var local5 = y; + var global5 = globalY(); + + return { + local0: local0, global0: global0, + inner1: inner1, local1: local1, global1: global1, + inner2: inner2, local2: local2, global2: global2, + inner3: inner3, local3: local3, global3: global3, + del: del, + inner4: inner4, local4: local4, global4: global4, + inner5: inner5, local5: local5, global5: global5, + }; +} + +var resultsY = testY(); + +assert.sameValue(resultsY.local0, 42); +assert.sameValue(resultsY.global0, 42); + +assert.sameValue(resultsY.inner1, 5); +assert.sameValue(resultsY.local1, 42); +assert.sameValue(resultsY.global1, 42); + +assert.sameValue(resultsY.inner2, 5); +assert.sameValue(resultsY.local2, 8); +assert.sameValue(resultsY.global2, 8); + +assert.sameValue(resultsY.inner3, 2); +assert.sameValue(resultsY.local3, 8); +assert.sameValue(resultsY.global3, 8); + +assert.sameValue(resultsY.del, "SyntaxError"); + +assert.sameValue(resultsY.inner4, 2); +assert.sameValue(resultsY.local4, 8); +assert.sameValue(resultsY.global4, 8); + +assert.sameValue(resultsY.inner5, 71); +assert.sameValue(resultsY.local5, 8); +assert.sameValue(resultsY.global5, 8); + +/******************************************************************************/ + +print("Tests complete!"); diff --git a/test/staging/sm/eval/exhaustive-fun-normalcaller-indirect-normalcode.js b/test/staging/sm/eval/exhaustive-fun-normalcaller-indirect-normalcode.js new file mode 100644 index 0000000000..0ff8f4d2e8 --- /dev/null +++ b/test/staging/sm/eval/exhaustive-fun-normalcaller-indirect-normalcode.js @@ -0,0 +1,215 @@ +/* + * Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/licenses/publicdomain/ + */ + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +//----------------------------------------------------------------------------- +var BUGNUMBER = 514568; +var summary = "eval in all its myriad flavors"; + +print(BUGNUMBER + ": " + summary); + +/************** + * BEGIN TEST * + **************/ + +var x = 17; +function globalX() { return x; } +var y = 42; +function globalY() { return y; } + +var ev = eval; + +function testX() +{ + var x = 2; + var xcode = + "var x = 4;" + + "function actX(action)" + + "{" + + " switch (action)" + + " {" + + " case 'get':" + + " return x;" + + " case 'set1':" + + " x = 9;" + + " return;" + + " case 'set2':" + + " x = 23;" + + " return;" + + " case 'delete':" + + " try { return eval('delete x'); }" + + " catch (e) { return e.name; }" + + " }" + + "}" + + "actX;"; + + var local0 = x; + var global0 = globalX(); + + var f = ev(xcode); + + var inner1 = f("get"); + var local1 = x; + var global1 = globalX(); + + x = 7; + var inner2 = f("get"); + var local2 = x; + var global2 = globalX(); + + f("set1"); + var inner3 = f("get"); + var local3 = x; + var global3 = globalX(); + + var del = f("delete"); + var inner4 = f("get"); + var local4 = x; + var global4 = globalX(); + + f("set2"); + var inner5 = f("get"); + var local5 = x; + var global5 = globalX(); + + return { + local0: local0, global0: global0, + inner1: inner1, local1: local1, global1: global1, + inner2: inner2, local2: local2, global2: global2, + inner3: inner3, local3: local3, global3: global3, + del: del, + inner4: inner4, local4: local4, global4: global4, + inner5: inner5, local5: local5, global5: global5, + }; +} + +var resultsX = testX(); + +assert.sameValue(resultsX.local0, 2); +assert.sameValue(resultsX.global0, 17); + +assert.sameValue(resultsX.inner1, 4); +assert.sameValue(resultsX.local1, 2); +assert.sameValue(resultsX.global1, 4); + +assert.sameValue(resultsX.inner2, 4); +assert.sameValue(resultsX.local2, 7); +assert.sameValue(resultsX.global2, 4); + +assert.sameValue(resultsX.inner3, 9); +assert.sameValue(resultsX.local3, 7); +assert.sameValue(resultsX.global3, 9); + +assert.sameValue(resultsX.del, false); + +assert.sameValue(resultsX.inner4, 9); +assert.sameValue(resultsX.local4, 7); +assert.sameValue(resultsX.global4, 9); + +assert.sameValue(resultsX.inner5, 23); +assert.sameValue(resultsX.local5, 7); +assert.sameValue(resultsX.global5, 23); + + +function testY() +{ + var ycode = + "var y = 5;" + + "function actY(action)" + + "{" + + " switch (action)" + + " {" + + " case 'get':" + + " return y;" + + " case 'set1':" + + " y = 2;" + + " return;" + + " case 'set2':" + + " y = 71;" + + " return;" + + " case 'delete':" + + " try { return eval('delete y'); }" + + " catch (e) { return e.name; }" + + " }" + + "}" + + "actY;"; + + var local0 = y; + var global0 = globalY(); + + var f = ev(ycode); + + var inner1 = f("get"); + var local1 = y; + var global1 = globalY(); + + y = 8; + var inner2 = f("get"); + var local2 = y; + var global2 = globalY(); + + f("set1"); + var inner3 = f("get"); + var local3 = y; + var global3 = globalY(); + + var del = f("delete"); + var inner4 = f("get"); + var local4 = y; + var global4 = globalY(); + + f("set2"); + var inner5 = f("get"); + var local5 = y; + var global5 = globalY(); + + return { + local0: local0, global0: global0, + inner1: inner1, local1: local1, global1: global1, + inner2: inner2, local2: local2, global2: global2, + inner3: inner3, local3: local3, global3: global3, + del: del, + inner4: inner4, local4: local4, global4: global4, + inner5: inner5, local5: local5, global5: global5, + }; +} + +var resultsY = testY(); + +assert.sameValue(resultsY.local0, 42); +assert.sameValue(resultsY.global0, 42); + +assert.sameValue(resultsY.inner1, 5); +assert.sameValue(resultsY.local1, 5); +assert.sameValue(resultsY.global1, 5); + +assert.sameValue(resultsY.inner2, 8); +assert.sameValue(resultsY.local2, 8); +assert.sameValue(resultsY.global2, 8); + +assert.sameValue(resultsY.inner3, 2); +assert.sameValue(resultsY.local3, 2); +assert.sameValue(resultsY.global3, 2); + +assert.sameValue(resultsY.del, false); + +assert.sameValue(resultsY.inner4, 2); +assert.sameValue(resultsY.local4, 2); +assert.sameValue(resultsY.global4, 2); + +assert.sameValue(resultsY.inner5, 71); +assert.sameValue(resultsY.local5, 71); +assert.sameValue(resultsY.global5, 71); + +/******************************************************************************/ + +print("Tests complete!"); diff --git a/test/staging/sm/eval/exhaustive-fun-normalcaller-indirect-strictcode.js b/test/staging/sm/eval/exhaustive-fun-normalcaller-indirect-strictcode.js new file mode 100644 index 0000000000..8dd5cb7cf8 --- /dev/null +++ b/test/staging/sm/eval/exhaustive-fun-normalcaller-indirect-strictcode.js @@ -0,0 +1,217 @@ +/* + * Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/licenses/publicdomain/ + */ + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +//----------------------------------------------------------------------------- +var BUGNUMBER = 514568; +var summary = "eval in all its myriad flavors"; + +print(BUGNUMBER + ": " + summary); + +/************** + * BEGIN TEST * + **************/ + +var x = 17; +function globalX() { return x; } +var y = 42; +function globalY() { return y; } + +var ev = eval; + +function testX() +{ + var x = 2; + var xcode = + "'use strict';" + + "var x = 4;" + + "function actX(action)" + + "{" + + " switch (action)" + + " {" + + " case 'get':" + + " return x;" + + " case 'set1':" + + " x = 9;" + + " return;" + + " case 'set2':" + + " x = 23;" + + " return;" + + " case 'delete':" + + " try { return eval('delete x'); }" + + " catch (e) { return e.name; }" + + " }" + + "}" + + "actX;"; + + var local0 = x; + var global0 = globalX(); + + var f = ev(xcode); + + var inner1 = f("get"); + var local1 = x; + var global1 = globalX(); + + x = 7; + var inner2 = f("get"); + var local2 = x; + var global2 = globalX(); + + f("set1"); + var inner3 = f("get"); + var local3 = x; + var global3 = globalX(); + + var del = f("delete"); + var inner4 = f("get"); + var local4 = x; + var global4 = globalX(); + + f("set2"); + var inner5 = f("get"); + var local5 = x; + var global5 = globalX(); + + return { + local0: local0, global0: global0, + inner1: inner1, local1: local1, global1: global1, + inner2: inner2, local2: local2, global2: global2, + inner3: inner3, local3: local3, global3: global3, + del: del, + inner4: inner4, local4: local4, global4: global4, + inner5: inner5, local5: local5, global5: global5, + }; +} + +var resultsX = testX(); + +assert.sameValue(resultsX.local0, 2); +assert.sameValue(resultsX.global0, 17); + +assert.sameValue(resultsX.inner1, 4); +assert.sameValue(resultsX.local1, 2); +assert.sameValue(resultsX.global1, 17); + +assert.sameValue(resultsX.inner2, 4); +assert.sameValue(resultsX.local2, 7); +assert.sameValue(resultsX.global2, 17); + +assert.sameValue(resultsX.inner3, 9); +assert.sameValue(resultsX.local3, 7); +assert.sameValue(resultsX.global3, 17); + +assert.sameValue(resultsX.del, "SyntaxError"); + +assert.sameValue(resultsX.inner4, 9); +assert.sameValue(resultsX.local4, 7); +assert.sameValue(resultsX.global4, 17); + +assert.sameValue(resultsX.inner5, 23); +assert.sameValue(resultsX.local5, 7); +assert.sameValue(resultsX.global5, 17); + + +function testY() +{ + var ycode = + "'use strict';" + + "var y = 5;" + + "function actY(action)" + + "{" + + " switch (action)" + + " {" + + " case 'get':" + + " return y;" + + " case 'set1':" + + " y = 2;" + + " return;" + + " case 'set2':" + + " y = 71;" + + " return;" + + " case 'delete':" + + " try { return eval('delete y'); }" + + " catch (e) { return e.name; }" + + " }" + + "}" + + "actY;"; + + var local0 = y; + var global0 = globalY(); + + var f = ev(ycode); + + var inner1 = f("get"); + var local1 = y; + var global1 = globalY(); + + y = 8; + var inner2 = f("get"); + var local2 = y; + var global2 = globalY(); + + f("set1"); + var inner3 = f("get"); + var local3 = y; + var global3 = globalY(); + + var del = f("delete"); + var inner4 = f("get"); + var local4 = y; + var global4 = globalY(); + + f("set2"); + var inner5 = f("get"); + var local5 = y; + var global5 = globalY(); + + return { + local0: local0, global0: global0, + inner1: inner1, local1: local1, global1: global1, + inner2: inner2, local2: local2, global2: global2, + inner3: inner3, local3: local3, global3: global3, + del: del, + inner4: inner4, local4: local4, global4: global4, + inner5: inner5, local5: local5, global5: global5, + }; +} + +var resultsY = testY(); + +assert.sameValue(resultsY.local0, 42); +assert.sameValue(resultsY.global0, 42); + +assert.sameValue(resultsY.inner1, 5); +assert.sameValue(resultsY.local1, 42); +assert.sameValue(resultsY.global1, 42); + +assert.sameValue(resultsY.inner2, 5); +assert.sameValue(resultsY.local2, 8); +assert.sameValue(resultsY.global2, 8); + +assert.sameValue(resultsY.inner3, 2); +assert.sameValue(resultsY.local3, 8); +assert.sameValue(resultsY.global3, 8); + +assert.sameValue(resultsY.del, "SyntaxError"); + +assert.sameValue(resultsY.inner4, 2); +assert.sameValue(resultsY.local4, 8); +assert.sameValue(resultsY.global4, 8); + +assert.sameValue(resultsY.inner5, 71); +assert.sameValue(resultsY.local5, 8); +assert.sameValue(resultsY.global5, 8); + +/******************************************************************************/ + +print("Tests complete!"); diff --git a/test/staging/sm/eval/exhaustive-fun-strictcaller-direct-normalcode.js b/test/staging/sm/eval/exhaustive-fun-strictcaller-direct-normalcode.js new file mode 100644 index 0000000000..801fe08101 --- /dev/null +++ b/test/staging/sm/eval/exhaustive-fun-strictcaller-direct-normalcode.js @@ -0,0 +1,219 @@ +/* + * Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/licenses/publicdomain/ + */ + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +//----------------------------------------------------------------------------- +var BUGNUMBER = 514568; +var summary = "eval in all its myriad flavors"; + +print(BUGNUMBER + ": " + summary); + +/************** + * BEGIN TEST * + **************/ + +var x = 17; +function globalX() { return x; } +var y = 42; +function globalY() { return y; } + +var ev = eval; + +function testX() +{ + "use strict"; + + var x = 2; + var xcode = + "var x = 4;" + + "function actX(action)" + + "{" + + " switch (action)" + + " {" + + " case 'get':" + + " return x;" + + " case 'set1':" + + " x = 9;" + + " return;" + + " case 'set2':" + + " x = 23;" + + " return;" + + " case 'delete':" + + " try { return eval('delete x'); }" + + " catch (e) { return e.name; }" + + " }" + + "}" + + "actX;"; + + var local0 = x; + var global0 = globalX(); + + var f = eval(xcode); + + var inner1 = f("get"); + var local1 = x; + var global1 = globalX(); + + x = 7; + var inner2 = f("get"); + var local2 = x; + var global2 = globalX(); + + f("set1"); + var inner3 = f("get"); + var local3 = x; + var global3 = globalX(); + + var del = f("delete"); + var inner4 = f("get"); + var local4 = x; + var global4 = globalX(); + + f("set2"); + var inner5 = f("get"); + var local5 = x; + var global5 = globalX(); + + return { + local0: local0, global0: global0, + inner1: inner1, local1: local1, global1: global1, + inner2: inner2, local2: local2, global2: global2, + inner3: inner3, local3: local3, global3: global3, + del: del, + inner4: inner4, local4: local4, global4: global4, + inner5: inner5, local5: local5, global5: global5, + }; +} + +var resultsX = testX(); + +assert.sameValue(resultsX.local0, 2); +assert.sameValue(resultsX.global0, 17); + +assert.sameValue(resultsX.inner1, 4); +assert.sameValue(resultsX.local1, 2); +assert.sameValue(resultsX.global1, 17); + +assert.sameValue(resultsX.inner2, 4); +assert.sameValue(resultsX.local2, 7); +assert.sameValue(resultsX.global2, 17); + +assert.sameValue(resultsX.inner3, 9); +assert.sameValue(resultsX.local3, 7); +assert.sameValue(resultsX.global3, 17); + +assert.sameValue(resultsX.del, "SyntaxError"); + +assert.sameValue(resultsX.inner4, 9); +assert.sameValue(resultsX.local4, 7); +assert.sameValue(resultsX.global4, 17); + +assert.sameValue(resultsX.inner5, 23); +assert.sameValue(resultsX.local5, 7); +assert.sameValue(resultsX.global5, 17); + + +function testY() +{ + "use strict"; + + var ycode = + "var y = 5;" + + "function actY(action)" + + "{" + + " switch (action)" + + " {" + + " case 'get':" + + " return y;" + + " case 'set1':" + + " y = 2;" + + " return;" + + " case 'set2':" + + " y = 71;" + + " return;" + + " case 'delete':" + + " try { return eval('delete y'); }" + + " catch (e) { return e.name; }" + + " }" + + "}" + + "actY;"; + + var local0 = y; + var global0 = globalY(); + + var f = eval(ycode); + + var inner1 = f("get"); + var local1 = y; + var global1 = globalY(); + + y = 8; + var inner2 = f("get"); + var local2 = y; + var global2 = globalY(); + + f("set1"); + var inner3 = f("get"); + var local3 = y; + var global3 = globalY(); + + var del = f("delete"); + var inner4 = f("get"); + var local4 = y; + var global4 = globalY(); + + f("set2"); + var inner5 = f("get"); + var local5 = y; + var global5 = globalY(); + + return { + local0: local0, global0: global0, + inner1: inner1, local1: local1, global1: global1, + inner2: inner2, local2: local2, global2: global2, + inner3: inner3, local3: local3, global3: global3, + del: del, + inner4: inner4, local4: local4, global4: global4, + inner5: inner5, local5: local5, global5: global5, + }; +} + +var resultsY = testY(); + +assert.sameValue(resultsY.local0, 42); +assert.sameValue(resultsY.global0, 42); + +assert.sameValue(resultsY.inner1, 5); +assert.sameValue(resultsY.local1, 42); +assert.sameValue(resultsY.global1, 42); + +assert.sameValue(resultsY.inner2, 5); +assert.sameValue(resultsY.local2, 8); +assert.sameValue(resultsY.global2, 8); + +assert.sameValue(resultsY.inner3, 2); +assert.sameValue(resultsY.local3, 8); +assert.sameValue(resultsY.global3, 8); + +assert.sameValue(resultsY.del, "SyntaxError"); + +assert.sameValue(resultsY.inner4, 2); +assert.sameValue(resultsY.local4, 8); +assert.sameValue(resultsY.global4, 8); + +assert.sameValue(resultsY.inner5, 71); +assert.sameValue(resultsY.local5, 8); +assert.sameValue(resultsY.global5, 8); + +/******************************************************************************/ + +print("Tests complete!"); diff --git a/test/staging/sm/eval/exhaustive-fun-strictcaller-direct-strictcode.js b/test/staging/sm/eval/exhaustive-fun-strictcaller-direct-strictcode.js new file mode 100644 index 0000000000..4fb0f8a624 --- /dev/null +++ b/test/staging/sm/eval/exhaustive-fun-strictcaller-direct-strictcode.js @@ -0,0 +1,221 @@ +/* + * Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/licenses/publicdomain/ + */ + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +//----------------------------------------------------------------------------- +var BUGNUMBER = 514568; +var summary = "eval in all its myriad flavors"; + +print(BUGNUMBER + ": " + summary); + +/************** + * BEGIN TEST * + **************/ + +var x = 17; +function globalX() { return x; } +var y = 42; +function globalY() { return y; } + +var ev = eval; + +function testX() +{ + "use strict"; + + var x = 2; + var xcode = + "'use strict';" + + "var x = 4;" + + "function actX(action)" + + "{" + + " switch (action)" + + " {" + + " case 'get':" + + " return x;" + + " case 'set1':" + + " x = 9;" + + " return;" + + " case 'set2':" + + " x = 23;" + + " return;" + + " case 'delete':" + + " try { return eval('delete x'); }" + + " catch (e) { return e.name; }" + + " }" + + "}" + + "actX;"; + + var local0 = x; + var global0 = globalX(); + + var f = eval(xcode); + + var inner1 = f("get"); + var local1 = x; + var global1 = globalX(); + + x = 7; + var inner2 = f("get"); + var local2 = x; + var global2 = globalX(); + + f("set1"); + var inner3 = f("get"); + var local3 = x; + var global3 = globalX(); + + var del = f("delete"); + var inner4 = f("get"); + var local4 = x; + var global4 = globalX(); + + f("set2"); + var inner5 = f("get"); + var local5 = x; + var global5 = globalX(); + + return { + local0: local0, global0: global0, + inner1: inner1, local1: local1, global1: global1, + inner2: inner2, local2: local2, global2: global2, + inner3: inner3, local3: local3, global3: global3, + del: del, + inner4: inner4, local4: local4, global4: global4, + inner5: inner5, local5: local5, global5: global5, + }; +} + +var resultsX = testX(); + +assert.sameValue(resultsX.local0, 2); +assert.sameValue(resultsX.global0, 17); + +assert.sameValue(resultsX.inner1, 4); +assert.sameValue(resultsX.local1, 2); +assert.sameValue(resultsX.global1, 17); + +assert.sameValue(resultsX.inner2, 4); +assert.sameValue(resultsX.local2, 7); +assert.sameValue(resultsX.global2, 17); + +assert.sameValue(resultsX.inner3, 9); +assert.sameValue(resultsX.local3, 7); +assert.sameValue(resultsX.global3, 17); + +assert.sameValue(resultsX.del, "SyntaxError"); + +assert.sameValue(resultsX.inner4, 9); +assert.sameValue(resultsX.local4, 7); +assert.sameValue(resultsX.global4, 17); + +assert.sameValue(resultsX.inner5, 23); +assert.sameValue(resultsX.local5, 7); +assert.sameValue(resultsX.global5, 17); + + +function testY() +{ + "use strict"; + + var ycode = + "'use strict';" + + "var y = 5;" + + "function actY(action)" + + "{" + + " switch (action)" + + " {" + + " case 'get':" + + " return y;" + + " case 'set1':" + + " y = 2;" + + " return;" + + " case 'set2':" + + " y = 71;" + + " return;" + + " case 'delete':" + + " try { return eval('delete y'); }" + + " catch (e) { return e.name; }" + + " }" + + "}" + + "actY;"; + + var local0 = y; + var global0 = globalY(); + + var f = eval(ycode); + + var inner1 = f("get"); + var local1 = y; + var global1 = globalY(); + + y = 8; + var inner2 = f("get"); + var local2 = y; + var global2 = globalY(); + + f("set1"); + var inner3 = f("get"); + var local3 = y; + var global3 = globalY(); + + var del = f("delete"); + var inner4 = f("get"); + var local4 = y; + var global4 = globalY(); + + f("set2"); + var inner5 = f("get"); + var local5 = y; + var global5 = globalY(); + + return { + local0: local0, global0: global0, + inner1: inner1, local1: local1, global1: global1, + inner2: inner2, local2: local2, global2: global2, + inner3: inner3, local3: local3, global3: global3, + del: del, + inner4: inner4, local4: local4, global4: global4, + inner5: inner5, local5: local5, global5: global5, + }; +} + +var resultsY = testY(); + +assert.sameValue(resultsY.local0, 42); +assert.sameValue(resultsY.global0, 42); + +assert.sameValue(resultsY.inner1, 5); +assert.sameValue(resultsY.local1, 42); +assert.sameValue(resultsY.global1, 42); + +assert.sameValue(resultsY.inner2, 5); +assert.sameValue(resultsY.local2, 8); +assert.sameValue(resultsY.global2, 8); + +assert.sameValue(resultsY.inner3, 2); +assert.sameValue(resultsY.local3, 8); +assert.sameValue(resultsY.global3, 8); + +assert.sameValue(resultsY.del, "SyntaxError"); + +assert.sameValue(resultsY.inner4, 2); +assert.sameValue(resultsY.local4, 8); +assert.sameValue(resultsY.global4, 8); + +assert.sameValue(resultsY.inner5, 71); +assert.sameValue(resultsY.local5, 8); +assert.sameValue(resultsY.global5, 8); + +/******************************************************************************/ + +print("Tests complete!"); diff --git a/test/staging/sm/eval/exhaustive-fun-strictcaller-indirect-normalcode.js b/test/staging/sm/eval/exhaustive-fun-strictcaller-indirect-normalcode.js new file mode 100644 index 0000000000..5aa5a2c160 --- /dev/null +++ b/test/staging/sm/eval/exhaustive-fun-strictcaller-indirect-normalcode.js @@ -0,0 +1,219 @@ +/* + * Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/licenses/publicdomain/ + */ + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +//----------------------------------------------------------------------------- +var BUGNUMBER = 514568; +var summary = "eval in all its myriad flavors"; + +print(BUGNUMBER + ": " + summary); + +/************** + * BEGIN TEST * + **************/ + +var x = 17; +function globalX() { return x; } +var y = 42; +function globalY() { return y; } + +var ev = eval; + +function testX() +{ + "use strict"; + + var x = 2; + var xcode = + "var x = 4;" + + "function actX(action)" + + "{" + + " switch (action)" + + " {" + + " case 'get':" + + " return x;" + + " case 'set1':" + + " x = 9;" + + " return;" + + " case 'set2':" + + " x = 23;" + + " return;" + + " case 'delete':" + + " try { return eval('delete x'); }" + + " catch (e) { return e.name; }" + + " }" + + "}" + + "actX;"; + + var local0 = x; + var global0 = globalX(); + + var f = ev(xcode); + + var inner1 = f("get"); + var local1 = x; + var global1 = globalX(); + + x = 7; + var inner2 = f("get"); + var local2 = x; + var global2 = globalX(); + + f("set1"); + var inner3 = f("get"); + var local3 = x; + var global3 = globalX(); + + var del = f("delete"); + var inner4 = f("get"); + var local4 = x; + var global4 = globalX(); + + f("set2"); + var inner5 = f("get"); + var local5 = x; + var global5 = globalX(); + + return { + local0: local0, global0: global0, + inner1: inner1, local1: local1, global1: global1, + inner2: inner2, local2: local2, global2: global2, + inner3: inner3, local3: local3, global3: global3, + del: del, + inner4: inner4, local4: local4, global4: global4, + inner5: inner5, local5: local5, global5: global5, + }; +} + +var resultsX = testX(); + +assert.sameValue(resultsX.local0, 2); +assert.sameValue(resultsX.global0, 17); + +assert.sameValue(resultsX.inner1, 4); +assert.sameValue(resultsX.local1, 2); +assert.sameValue(resultsX.global1, 4); + +assert.sameValue(resultsX.inner2, 4); +assert.sameValue(resultsX.local2, 7); +assert.sameValue(resultsX.global2, 4); + +assert.sameValue(resultsX.inner3, 9); +assert.sameValue(resultsX.local3, 7); +assert.sameValue(resultsX.global3, 9); + +assert.sameValue(resultsX.del, false); + +assert.sameValue(resultsX.inner4, 9); +assert.sameValue(resultsX.local4, 7); +assert.sameValue(resultsX.global4, 9); + +assert.sameValue(resultsX.inner5, 23); +assert.sameValue(resultsX.local5, 7); +assert.sameValue(resultsX.global5, 23); + + +function testY() +{ + "use strict"; + + var ycode = + "var y = 5;" + + "function actY(action)" + + "{" + + " switch (action)" + + " {" + + " case 'get':" + + " return y;" + + " case 'set1':" + + " y = 2;" + + " return;" + + " case 'set2':" + + " y = 71;" + + " return;" + + " case 'delete':" + + " try { return eval('delete y'); }" + + " catch (e) { return e.name; }" + + " }" + + "}" + + "actY;"; + + var local0 = y; + var global0 = globalY(); + + var f = ev(ycode); + + var inner1 = f("get"); + var local1 = y; + var global1 = globalY(); + + y = 8; + var inner2 = f("get"); + var local2 = y; + var global2 = globalY(); + + f("set1"); + var inner3 = f("get"); + var local3 = y; + var global3 = globalY(); + + var del = f("delete"); + var inner4 = f("get"); + var local4 = y; + var global4 = globalY(); + + f("set2"); + var inner5 = f("get"); + var local5 = y; + var global5 = globalY(); + + return { + local0: local0, global0: global0, + inner1: inner1, local1: local1, global1: global1, + inner2: inner2, local2: local2, global2: global2, + inner3: inner3, local3: local3, global3: global3, + del: del, + inner4: inner4, local4: local4, global4: global4, + inner5: inner5, local5: local5, global5: global5, + }; +} + +var resultsY = testY(); + +assert.sameValue(resultsY.local0, 42); +assert.sameValue(resultsY.global0, 42); + +assert.sameValue(resultsY.inner1, 5); +assert.sameValue(resultsY.local1, 5); +assert.sameValue(resultsY.global1, 5); + +assert.sameValue(resultsY.inner2, 8); +assert.sameValue(resultsY.local2, 8); +assert.sameValue(resultsY.global2, 8); + +assert.sameValue(resultsY.inner3, 2); +assert.sameValue(resultsY.local3, 2); +assert.sameValue(resultsY.global3, 2); + +assert.sameValue(resultsY.del, false); + +assert.sameValue(resultsY.inner4, 2); +assert.sameValue(resultsY.local4, 2); +assert.sameValue(resultsY.global4, 2); + +assert.sameValue(resultsY.inner5, 71); +assert.sameValue(resultsY.local5, 71); +assert.sameValue(resultsY.global5, 71); + +/******************************************************************************/ + +print("Tests complete!"); diff --git a/test/staging/sm/eval/exhaustive-fun-strictcaller-indirect-strictcode.js b/test/staging/sm/eval/exhaustive-fun-strictcaller-indirect-strictcode.js new file mode 100644 index 0000000000..3ff983d3db --- /dev/null +++ b/test/staging/sm/eval/exhaustive-fun-strictcaller-indirect-strictcode.js @@ -0,0 +1,221 @@ +/* + * Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/licenses/publicdomain/ + */ + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +//----------------------------------------------------------------------------- +var BUGNUMBER = 514568; +var summary = "eval in all its myriad flavors"; + +print(BUGNUMBER + ": " + summary); + +/************** + * BEGIN TEST * + **************/ + +var x = 17; +function globalX() { return x; } +var y = 42; +function globalY() { return y; } + +var ev = eval; + +function testX() +{ + "use strict"; + + var x = 2; + var xcode = + "'use strict';" + + "var x = 4;" + + "function actX(action)" + + "{" + + " switch (action)" + + " {" + + " case 'get':" + + " return x;" + + " case 'set1':" + + " x = 9;" + + " return;" + + " case 'set2':" + + " x = 23;" + + " return;" + + " case 'delete':" + + " try { return eval('delete x'); }" + + " catch (e) { return e.name; }" + + " }" + + "}" + + "actX;"; + + var local0 = x; + var global0 = globalX(); + + var f = ev(xcode); + + var inner1 = f("get"); + var local1 = x; + var global1 = globalX(); + + x = 7; + var inner2 = f("get"); + var local2 = x; + var global2 = globalX(); + + f("set1"); + var inner3 = f("get"); + var local3 = x; + var global3 = globalX(); + + var del = f("delete"); + var inner4 = f("get"); + var local4 = x; + var global4 = globalX(); + + f("set2"); + var inner5 = f("get"); + var local5 = x; + var global5 = globalX(); + + return { + local0: local0, global0: global0, + inner1: inner1, local1: local1, global1: global1, + inner2: inner2, local2: local2, global2: global2, + inner3: inner3, local3: local3, global3: global3, + del: del, + inner4: inner4, local4: local4, global4: global4, + inner5: inner5, local5: local5, global5: global5, + }; +} + +var resultsX = testX(); + +assert.sameValue(resultsX.local0, 2); +assert.sameValue(resultsX.global0, 17); + +assert.sameValue(resultsX.inner1, 4); +assert.sameValue(resultsX.local1, 2); +assert.sameValue(resultsX.global1, 17); + +assert.sameValue(resultsX.inner2, 4); +assert.sameValue(resultsX.local2, 7); +assert.sameValue(resultsX.global2, 17); + +assert.sameValue(resultsX.inner3, 9); +assert.sameValue(resultsX.local3, 7); +assert.sameValue(resultsX.global3, 17); + +assert.sameValue(resultsX.del, "SyntaxError"); + +assert.sameValue(resultsX.inner4, 9); +assert.sameValue(resultsX.local4, 7); +assert.sameValue(resultsX.global4, 17); + +assert.sameValue(resultsX.inner5, 23); +assert.sameValue(resultsX.local5, 7); +assert.sameValue(resultsX.global5, 17); + + +function testY() +{ + "use strict"; + + var ycode = + "'use strict';" + + "var y = 5;" + + "function actY(action)" + + "{" + + " switch (action)" + + " {" + + " case 'get':" + + " return y;" + + " case 'set1':" + + " y = 2;" + + " return;" + + " case 'set2':" + + " y = 71;" + + " return;" + + " case 'delete':" + + " try { return eval('delete y'); }" + + " catch (e) { return e.name; }" + + " }" + + "}" + + "actY;"; + + var local0 = y; + var global0 = globalY(); + + var f = ev(ycode); + + var inner1 = f("get"); + var local1 = y; + var global1 = globalY(); + + y = 8; + var inner2 = f("get"); + var local2 = y; + var global2 = globalY(); + + f("set1"); + var inner3 = f("get"); + var local3 = y; + var global3 = globalY(); + + var del = f("delete"); + var inner4 = f("get"); + var local4 = y; + var global4 = globalY(); + + f("set2"); + var inner5 = f("get"); + var local5 = y; + var global5 = globalY(); + + return { + local0: local0, global0: global0, + inner1: inner1, local1: local1, global1: global1, + inner2: inner2, local2: local2, global2: global2, + inner3: inner3, local3: local3, global3: global3, + del: del, + inner4: inner4, local4: local4, global4: global4, + inner5: inner5, local5: local5, global5: global5, + }; +} + +var resultsY = testY(); + +assert.sameValue(resultsY.local0, 42); +assert.sameValue(resultsY.global0, 42); + +assert.sameValue(resultsY.inner1, 5); +assert.sameValue(resultsY.local1, 42); +assert.sameValue(resultsY.global1, 42); + +assert.sameValue(resultsY.inner2, 5); +assert.sameValue(resultsY.local2, 8); +assert.sameValue(resultsY.global2, 8); + +assert.sameValue(resultsY.inner3, 2); +assert.sameValue(resultsY.local3, 8); +assert.sameValue(resultsY.global3, 8); + +assert.sameValue(resultsY.del, "SyntaxError"); + +assert.sameValue(resultsY.inner4, 2); +assert.sameValue(resultsY.local4, 8); +assert.sameValue(resultsY.global4, 8); + +assert.sameValue(resultsY.inner5, 71); +assert.sameValue(resultsY.local5, 8); +assert.sameValue(resultsY.global5, 8); + +/******************************************************************************/ + +print("Tests complete!"); diff --git a/test/staging/sm/eval/exhaustive-global-normalcaller-direct-normalcode.js b/test/staging/sm/eval/exhaustive-global-normalcaller-direct-normalcode.js new file mode 100644 index 0000000000..273c2ba711 --- /dev/null +++ b/test/staging/sm/eval/exhaustive-global-normalcaller-direct-normalcode.js @@ -0,0 +1,179 @@ +/* + * Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/licenses/publicdomain/ + */ + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +//----------------------------------------------------------------------------- +var BUGNUMBER = 514568; +var summary = "eval in all its myriad flavors"; + +print(BUGNUMBER + ": " + summary); + +/************** + * BEGIN TEST * + **************/ + +var x = 17; + +var ev = eval; + +var xcode = + "var x = 4;" + + "function actX(action)" + + "{" + + " switch (action)" + + " {" + + " case 'get':" + + " return x;" + + " case 'set1':" + + " x = 9;" + + " return;" + + " case 'set2':" + + " x = 23;" + + " return;" + + " case 'delete':" + + " try { return eval('delete x'); }" + + " catch (e) { return e.name; }" + + " }" + + "}" + + "actX;"; + +var local0 = x; + +var f = eval(xcode); + +var inner1 = f("get"); +var local1 = x; + +x = 7; +var inner2 = f("get"); +var local2 = x; + +f("set1"); +var inner3 = f("get"); +var local3 = x; + +var del = f("delete"); +var inner4 = f("get"); +var local4 = x; + +f("set2"); +var inner5 = f("get"); +var local5 = x; + +var resultsX = + { + local0: local0, + inner1: inner1, local1: local1, + inner2: inner2, local2: local2, + inner3: inner3, local3: local3, + del: del, + inner4: inner4, local4: local4, + inner5: inner5, local5: local5, + }; + +assert.sameValue(resultsX.local0, 17); + +assert.sameValue(resultsX.inner1, 4); +assert.sameValue(resultsX.local1, 4); + +assert.sameValue(resultsX.inner2, 7); +assert.sameValue(resultsX.local2, 7); + +assert.sameValue(resultsX.inner3, 9); +assert.sameValue(resultsX.local3, 9); + +assert.sameValue(resultsX.del, false); + +assert.sameValue(resultsX.inner4, 9); +assert.sameValue(resultsX.local4, 9); + +assert.sameValue(resultsX.inner5, 23); +assert.sameValue(resultsX.local5, 23); + + +var ycode = + "var y = 5;" + + "function actY(action)" + + "{" + + " switch (action)" + + " {" + + " case 'get':" + + " return y;" + + " case 'set1':" + + " y = 2;" + + " return;" + + " case 'set2':" + + " y = 71;" + + " return;" + + " case 'delete':" + + " try { return eval('delete y'); }" + + " catch (e) { return e.name; }" + + " }" + + "}" + + "actY;"; + +try { var local0 = y; } catch (e) { local0 = e.name; } + +var f = eval(ycode); + +var inner1 = f("get"); +var local1 = y; + +y = 8; +var inner2 = f("get"); +var local2 = y; + +f("set1"); +var inner3 = f("get"); +var local3 = y; + +var del = f("delete"); +try { var inner4 = f("get"); } catch (e) { inner4 = e.name; } +try { var local4 = y; } catch (e) { local4 = e.name; } + +f("set2"); +try { var inner5 = f("get"); } catch (e) { inner5 = e.name; } +try { var local5 = y; } catch (e) { local5 = e.name; } + +var resultsY = + { + local0: local0, + inner1: inner1, local1: local1, + inner2: inner2, local2: local2, + inner3: inner3, local3: local3, + del: del, + inner4: inner4, local4: local4, + inner5: inner5, local5: local5, + }; + +assert.sameValue(resultsY.local0, "ReferenceError"); + +assert.sameValue(resultsY.inner1, 5); +assert.sameValue(resultsY.local1, 5); + +assert.sameValue(resultsY.inner2, 8); +assert.sameValue(resultsY.local2, 8); + +assert.sameValue(resultsY.inner3, 2); +assert.sameValue(resultsY.local3, 2); + +assert.sameValue(resultsY.del, true); + +assert.sameValue(resultsY.inner4, "ReferenceError"); +assert.sameValue(resultsY.local4, "ReferenceError"); + +assert.sameValue(resultsY.inner5, 71); +assert.sameValue(resultsY.local5, 71); + +/******************************************************************************/ + +print("Tests complete!"); diff --git a/test/staging/sm/eval/exhaustive-global-normalcaller-direct-strictcode.js b/test/staging/sm/eval/exhaustive-global-normalcaller-direct-strictcode.js new file mode 100644 index 0000000000..358f13b558 --- /dev/null +++ b/test/staging/sm/eval/exhaustive-global-normalcaller-direct-strictcode.js @@ -0,0 +1,181 @@ +/* + * Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/licenses/publicdomain/ + */ + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +//----------------------------------------------------------------------------- +var BUGNUMBER = 514568; +var summary = "eval in all its myriad flavors"; + +print(BUGNUMBER + ": " + summary); + +/************** + * BEGIN TEST * + **************/ + +var x = 17; + +var ev = eval; + +var xcode = + "'use strict';" + + "var x = 4;" + + "function actX(action)" + + "{" + + " switch (action)" + + " {" + + " case 'get':" + + " return x;" + + " case 'set1':" + + " x = 9;" + + " return;" + + " case 'set2':" + + " x = 23;" + + " return;" + + " case 'delete':" + + " try { return eval('delete x'); }" + + " catch (e) { return e.name; }" + + " }" + + "}" + + "actX;"; + +var local0 = x; + +var f = eval(xcode); + +var inner1 = f("get"); +var local1 = x; + +x = 7; +var inner2 = f("get"); +var local2 = x; + +f("set1"); +var inner3 = f("get"); +var local3 = x; + +var del = f("delete"); +var inner4 = f("get"); +var local4 = x; + +f("set2"); +var inner5 = f("get"); +var local5 = x; + +var resultsX = + { + local0: local0, + inner1: inner1, local1: local1, + inner2: inner2, local2: local2, + inner3: inner3, local3: local3, + del: del, + inner4: inner4, local4: local4, + inner5: inner5, local5: local5, + }; + +assert.sameValue(resultsX.local0, 17); + +assert.sameValue(resultsX.inner1, 4); +assert.sameValue(resultsX.local1, 17); + +assert.sameValue(resultsX.inner2, 4); +assert.sameValue(resultsX.local2, 7); + +assert.sameValue(resultsX.inner3, 9); +assert.sameValue(resultsX.local3, 7); + +assert.sameValue(resultsX.del, "SyntaxError"); + +assert.sameValue(resultsX.inner4, 9); +assert.sameValue(resultsX.local4, 7); + +assert.sameValue(resultsX.inner5, 23); +assert.sameValue(resultsX.local5, 7); + + +var ycode = + "'use strict';" + + "var y = 5;" + + "function actY(action)" + + "{" + + " switch (action)" + + " {" + + " case 'get':" + + " return y;" + + " case 'set1':" + + " y = 2;" + + " return;" + + " case 'set2':" + + " y = 71;" + + " return;" + + " case 'delete':" + + " try { return eval('delete y'); }" + + " catch (e) { return e.name; }" + + " }" + + "}" + + "actY;"; + +try { var local0 = y; } catch (e) { local0 = e.name; } + +var f = eval(ycode); + +var inner1 = f("get"); +try { var local1 = y; } catch (e) { local1 = e.name; } + +y = 8; +var inner2 = f("get"); +var local2 = y; + +f("set1"); +var inner3 = f("get"); +var local3 = y; + +var del = f("delete"); +try { var inner4 = f("get"); } catch (e) { inner4 = e.name; } +try { var local4 = y; } catch (e) { local4 = e.name; } + +f("set2"); +try { var inner5 = f("get"); } catch (e) { inner5 = e.name; } +try { var local5 = y; } catch (e) { local5 = e.name; } + +var resultsY = + { + local0: local0, + inner1: inner1, local1: local1, + inner2: inner2, local2: local2, + inner3: inner3, local3: local3, + del: del, + inner4: inner4, local4: local4, + inner5: inner5, local5: local5, + }; + +assert.sameValue(resultsY.local0, "ReferenceError"); + +assert.sameValue(resultsY.inner1, 5); +assert.sameValue(resultsY.local1, "ReferenceError"); + +assert.sameValue(resultsY.inner2, 5); +assert.sameValue(resultsY.local2, 8); + +assert.sameValue(resultsY.inner3, 2); +assert.sameValue(resultsY.local3, 8); + +assert.sameValue(resultsY.del, "SyntaxError"); + +assert.sameValue(resultsY.inner4, 2); +assert.sameValue(resultsY.local4, 8); + +assert.sameValue(resultsY.inner5, 71); +assert.sameValue(resultsY.local5, 8); + +/******************************************************************************/ + +print("Tests complete!"); diff --git a/test/staging/sm/eval/exhaustive-global-normalcaller-indirect-normalcode.js b/test/staging/sm/eval/exhaustive-global-normalcaller-indirect-normalcode.js new file mode 100644 index 0000000000..af05ce0124 --- /dev/null +++ b/test/staging/sm/eval/exhaustive-global-normalcaller-indirect-normalcode.js @@ -0,0 +1,179 @@ +/* + * Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/licenses/publicdomain/ + */ + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +//----------------------------------------------------------------------------- +var BUGNUMBER = 514568; +var summary = "eval in all its myriad flavors"; + +print(BUGNUMBER + ": " + summary); + +/************** + * BEGIN TEST * + **************/ + +var x = 17; + +var ev = eval; + +var xcode = + "var x = 4;" + + "function actX(action)" + + "{" + + " switch (action)" + + " {" + + " case 'get':" + + " return x;" + + " case 'set1':" + + " x = 9;" + + " return;" + + " case 'set2':" + + " x = 23;" + + " return;" + + " case 'delete':" + + " try { return eval('delete x'); }" + + " catch (e) { return e.name; }" + + " }" + + "}" + + "actX;"; + +var local0 = x; + +var f = ev(xcode); + +var inner1 = f("get"); +var local1 = x; + +x = 7; +var inner2 = f("get"); +var local2 = x; + +f("set1"); +var inner3 = f("get"); +var local3 = x; + +var del = f("delete"); +var inner4 = f("get"); +var local4 = x; + +f("set2"); +var inner5 = f("get"); +var local5 = x; + +var resultsX = + { + local0: local0, + inner1: inner1, local1: local1, + inner2: inner2, local2: local2, + inner3: inner3, local3: local3, + del: del, + inner4: inner4, local4: local4, + inner5: inner5, local5: local5, + }; + +assert.sameValue(resultsX.local0, 17); + +assert.sameValue(resultsX.inner1, 4); +assert.sameValue(resultsX.local1, 4); + +assert.sameValue(resultsX.inner2, 7); +assert.sameValue(resultsX.local2, 7); + +assert.sameValue(resultsX.inner3, 9); +assert.sameValue(resultsX.local3, 9); + +assert.sameValue(resultsX.del, false); + +assert.sameValue(resultsX.inner4, 9); +assert.sameValue(resultsX.local4, 9); + +assert.sameValue(resultsX.inner5, 23); +assert.sameValue(resultsX.local5, 23); + + +var ycode = + "var y = 5;" + + "function actY(action)" + + "{" + + " switch (action)" + + " {" + + " case 'get':" + + " return y;" + + " case 'set1':" + + " y = 2;" + + " return;" + + " case 'set2':" + + " y = 71;" + + " return;" + + " case 'delete':" + + " try { return eval('delete y'); }" + + " catch (e) { return e.name; }" + + " }" + + "}" + + "actY;"; + +try { var local0 = y; } catch (e) { local0 = e.name; } + +var f = ev(ycode); + +var inner1 = f("get"); +var local1 = y; + +y = 8; +var inner2 = f("get"); +var local2 = y; + +f("set1"); +var inner3 = f("get"); +var local3 = y; + +var del = f("delete"); +try { var inner4 = f("get"); } catch (e) { inner4 = e.name; } +try { var local4 = y; } catch (e) { local4 = e.name; } + +f("set2"); +try { var inner5 = f("get"); } catch (e) { inner5 = e.name; } +try { var local5 = y; } catch (e) { local5 = e.name; } + +var resultsY = + { + local0: local0, + inner1: inner1, local1: local1, + inner2: inner2, local2: local2, + inner3: inner3, local3: local3, + del: del, + inner4: inner4, local4: local4, + inner5: inner5, local5: local5, + }; + +assert.sameValue(resultsY.local0, "ReferenceError"); + +assert.sameValue(resultsY.inner1, 5); +assert.sameValue(resultsY.local1, 5); + +assert.sameValue(resultsY.inner2, 8); +assert.sameValue(resultsY.local2, 8); + +assert.sameValue(resultsY.inner3, 2); +assert.sameValue(resultsY.local3, 2); + +assert.sameValue(resultsY.del, true); + +assert.sameValue(resultsY.inner4, "ReferenceError"); +assert.sameValue(resultsY.local4, "ReferenceError"); + +assert.sameValue(resultsY.inner5, 71); +assert.sameValue(resultsY.local5, 71); + +/******************************************************************************/ + +print("Tests complete!"); diff --git a/test/staging/sm/eval/exhaustive-global-normalcaller-indirect-strictcode.js b/test/staging/sm/eval/exhaustive-global-normalcaller-indirect-strictcode.js new file mode 100644 index 0000000000..1531a2ffa7 --- /dev/null +++ b/test/staging/sm/eval/exhaustive-global-normalcaller-indirect-strictcode.js @@ -0,0 +1,181 @@ +/* + * Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/licenses/publicdomain/ + */ + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +//----------------------------------------------------------------------------- +var BUGNUMBER = 514568; +var summary = "eval in all its myriad flavors"; + +print(BUGNUMBER + ": " + summary); + +/************** + * BEGIN TEST * + **************/ + +var x = 17; + +var ev = eval; + +var xcode = + "'use strict';" + + "var x = 4;" + + "function actX(action)" + + "{" + + " switch (action)" + + " {" + + " case 'get':" + + " return x;" + + " case 'set1':" + + " x = 9;" + + " return;" + + " case 'set2':" + + " x = 23;" + + " return;" + + " case 'delete':" + + " try { return eval('delete x'); }" + + " catch (e) { return e.name; }" + + " }" + + "}" + + "actX;"; + +var local0 = x; + +var f = ev(xcode); + +var inner1 = f("get"); +var local1 = x; + +x = 7; +var inner2 = f("get"); +var local2 = x; + +f("set1"); +var inner3 = f("get"); +var local3 = x; + +var del = f("delete"); +var inner4 = f("get"); +var local4 = x; + +f("set2"); +var inner5 = f("get"); +var local5 = x; + +var resultsX = + { + local0: local0, + inner1: inner1, local1: local1, + inner2: inner2, local2: local2, + inner3: inner3, local3: local3, + del: del, + inner4: inner4, local4: local4, + inner5: inner5, local5: local5, + }; + +assert.sameValue(resultsX.local0, 17); + +assert.sameValue(resultsX.inner1, 4); +assert.sameValue(resultsX.local1, 17); + +assert.sameValue(resultsX.inner2, 4); +assert.sameValue(resultsX.local2, 7); + +assert.sameValue(resultsX.inner3, 9); +assert.sameValue(resultsX.local3, 7); + +assert.sameValue(resultsX.del, "SyntaxError"); + +assert.sameValue(resultsX.inner4, 9); +assert.sameValue(resultsX.local4, 7); + +assert.sameValue(resultsX.inner5, 23); +assert.sameValue(resultsX.local5, 7); + + +var ycode = + "'use strict';" + + "var y = 5;" + + "function actY(action)" + + "{" + + " switch (action)" + + " {" + + " case 'get':" + + " return y;" + + " case 'set1':" + + " y = 2;" + + " return;" + + " case 'set2':" + + " y = 71;" + + " return;" + + " case 'delete':" + + " try { return eval('delete y'); }" + + " catch (e) { return e.name; }" + + " }" + + "}" + + "actY;"; + +try { var local0 = y; } catch (e) { local0 = e.name; } + +var f = ev(ycode); + +var inner1 = f("get"); +try { var local1 = y; } catch (e) { local1 = e.name; } + +y = 8; +var inner2 = f("get"); +var local2 = y; + +f("set1"); +var inner3 = f("get"); +var local3 = y; + +var del = f("delete"); +try { var inner4 = f("get"); } catch (e) { inner4 = e.name; } +try { var local4 = y; } catch (e) { local4 = e.name; } + +f("set2"); +try { var inner5 = f("get"); } catch (e) { inner5 = e.name; } +try { var local5 = y; } catch (e) { local5 = e.name; } + +var resultsY = + { + local0: local0, + inner1: inner1, local1: local1, + inner2: inner2, local2: local2, + inner3: inner3, local3: local3, + del: del, + inner4: inner4, local4: local4, + inner5: inner5, local5: local5, + }; + +assert.sameValue(resultsY.local0, "ReferenceError"); + +assert.sameValue(resultsY.inner1, 5); +assert.sameValue(resultsY.local1, "ReferenceError"); + +assert.sameValue(resultsY.inner2, 5); +assert.sameValue(resultsY.local2, 8); + +assert.sameValue(resultsY.inner3, 2); +assert.sameValue(resultsY.local3, 8); + +assert.sameValue(resultsY.del, "SyntaxError"); + +assert.sameValue(resultsY.inner4, 2); +assert.sameValue(resultsY.local4, 8); + +assert.sameValue(resultsY.inner5, 71); +assert.sameValue(resultsY.local5, 8); + +/******************************************************************************/ + +print("Tests complete!"); diff --git a/test/staging/sm/eval/exhaustive-global-strictcaller-direct-normalcode.js b/test/staging/sm/eval/exhaustive-global-strictcaller-direct-normalcode.js new file mode 100644 index 0000000000..a1d53da8bc --- /dev/null +++ b/test/staging/sm/eval/exhaustive-global-strictcaller-direct-normalcode.js @@ -0,0 +1,181 @@ +/* + * Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/licenses/publicdomain/ + */ + +/*--- +flags: +- onlyStrict +includes: [sm/non262-shell.js, sm/non262.js] +description: | + pending +esid: pending +---*/ +"use strict"; + +//----------------------------------------------------------------------------- +var BUGNUMBER = 514568; +var summary = "eval in all its myriad flavors"; + +print(BUGNUMBER + ": " + summary); + +/************** + * BEGIN TEST * + **************/ + +var x = 17; + +var ev = eval; + +var xcode = + "var x = 4;" + + "function actX(action)" + + "{" + + " switch (action)" + + " {" + + " case 'get':" + + " return x;" + + " case 'set1':" + + " x = 9;" + + " return;" + + " case 'set2':" + + " x = 23;" + + " return;" + + " case 'delete':" + + " try { return eval('delete x'); }" + + " catch (e) { return e.name; }" + + " }" + + "}" + + "actX;"; + +var local0 = x; + +var f = eval(xcode); + +var inner1 = f("get"); +var local1 = x; + +x = 7; +var inner2 = f("get"); +var local2 = x; + +f("set1"); +var inner3 = f("get"); +var local3 = x; + +var del = f("delete"); +var inner4 = f("get"); +var local4 = x; + +f("set2"); +var inner5 = f("get"); +var local5 = x; + +var resultsX = + { + local0: local0, + inner1: inner1, local1: local1, + inner2: inner2, local2: local2, + inner3: inner3, local3: local3, + del: del, + inner4: inner4, local4: local4, + inner5: inner5, local5: local5, + }; + +assert.sameValue(resultsX.local0, 17); + +assert.sameValue(resultsX.inner1, 4); +assert.sameValue(resultsX.local1, 17); + +assert.sameValue(resultsX.inner2, 4); +assert.sameValue(resultsX.local2, 7); + +assert.sameValue(resultsX.inner3, 9); +assert.sameValue(resultsX.local3, 7); + +assert.sameValue(resultsX.del, "SyntaxError"); + +assert.sameValue(resultsX.inner4, 9); +assert.sameValue(resultsX.local4, 7); + +assert.sameValue(resultsX.inner5, 23); +assert.sameValue(resultsX.local5, 7); + + +var ycode = + "var y = 5;" + + "function actY(action)" + + "{" + + " switch (action)" + + " {" + + " case 'get':" + + " return y;" + + " case 'set1':" + + " y = 2;" + + " return;" + + " case 'set2':" + + " y = 71;" + + " return;" + + " case 'delete':" + + " try { return eval('delete y'); }" + + " catch (e) { return e.name; }" + + " }" + + "}" + + "actY;"; + +try { var local0 = y; } catch (e) { local0 = e.name; } + +var f = eval(ycode); + +var inner1 = f("get"); +try { var local1 = y; } catch (e) { local1 = e.name; } + +try { y = 8; } catch (e) { assert.sameValue(e.name, "ReferenceError"); } +var inner2 = f("get"); +try { var local2 = y; } catch (e) { local2 = e.name; } + +f("set1"); +var inner3 = f("get"); +try { var local3 = y; } catch (e) { local3 = e.name; } + +var del = f("delete"); +try { var inner4 = f("get"); } catch (e) { inner4 = e.name; } +try { var local4 = y; } catch (e) { local4 = e.name; } + +f("set2"); +try { var inner5 = f("get"); } catch (e) { inner5 = e.name; } +try { var local5 = y; } catch (e) { local5 = e.name; } + +var resultsY = + { + local0: local0, + inner1: inner1, local1: local1, + inner2: inner2, local2: local2, + inner3: inner3, local3: local3, + del: del, + inner4: inner4, local4: local4, + inner5: inner5, local5: local5, + }; + +assert.sameValue(resultsY.local0, "ReferenceError"); + +assert.sameValue(resultsY.inner1, 5); +assert.sameValue(resultsY.local1, "ReferenceError"); + +assert.sameValue(resultsY.inner2, 5); +assert.sameValue(resultsY.local2, "ReferenceError"); + +assert.sameValue(resultsY.inner3, 2); +assert.sameValue(resultsY.local3, "ReferenceError"); + +assert.sameValue(resultsY.del, "SyntaxError"); + +assert.sameValue(resultsY.inner4, 2); +assert.sameValue(resultsY.local4, "ReferenceError"); + +assert.sameValue(resultsY.inner5, 71); +assert.sameValue(resultsY.local5, "ReferenceError"); + +/******************************************************************************/ + +print("Tests complete!"); diff --git a/test/staging/sm/eval/exhaustive-global-strictcaller-direct-strictcode.js b/test/staging/sm/eval/exhaustive-global-strictcaller-direct-strictcode.js new file mode 100644 index 0000000000..be57c19f64 --- /dev/null +++ b/test/staging/sm/eval/exhaustive-global-strictcaller-direct-strictcode.js @@ -0,0 +1,183 @@ +/* + * Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/licenses/publicdomain/ + */ + +/*--- +flags: +- onlyStrict +includes: [sm/non262-shell.js, sm/non262.js] +description: | + pending +esid: pending +---*/ +"use strict"; + +//----------------------------------------------------------------------------- +var BUGNUMBER = 514568; +var summary = "eval in all its myriad flavors"; + +print(BUGNUMBER + ": " + summary); + +/************** + * BEGIN TEST * + **************/ + +var x = 17; + +var ev = eval; + +var xcode = + "'use strict';" + + "var x = 4;" + + "function actX(action)" + + "{" + + " switch (action)" + + " {" + + " case 'get':" + + " return x;" + + " case 'set1':" + + " x = 9;" + + " return;" + + " case 'set2':" + + " x = 23;" + + " return;" + + " case 'delete':" + + " try { return eval('delete x'); }" + + " catch (e) { return e.name; }" + + " }" + + "}" + + "actX;"; + +var local0 = x; + +var f = eval(xcode); + +var inner1 = f("get"); +var local1 = x; + +x = 7; +var inner2 = f("get"); +var local2 = x; + +f("set1"); +var inner3 = f("get"); +var local3 = x; + +var del = f("delete"); +var inner4 = f("get"); +var local4 = x; + +f("set2"); +var inner5 = f("get"); +var local5 = x; + +var resultsX = + { + local0: local0, + inner1: inner1, local1: local1, + inner2: inner2, local2: local2, + inner3: inner3, local3: local3, + del: del, + inner4: inner4, local4: local4, + inner5: inner5, local5: local5, + }; + +assert.sameValue(resultsX.local0, 17); + +assert.sameValue(resultsX.inner1, 4); +assert.sameValue(resultsX.local1, 17); + +assert.sameValue(resultsX.inner2, 4); +assert.sameValue(resultsX.local2, 7); + +assert.sameValue(resultsX.inner3, 9); +assert.sameValue(resultsX.local3, 7); + +assert.sameValue(resultsX.del, "SyntaxError"); + +assert.sameValue(resultsX.inner4, 9); +assert.sameValue(resultsX.local4, 7); + +assert.sameValue(resultsX.inner5, 23); +assert.sameValue(resultsX.local5, 7); + + +var ycode = + "'use strict';" + + "var y = 5;" + + "function actY(action)" + + "{" + + " switch (action)" + + " {" + + " case 'get':" + + " return y;" + + " case 'set1':" + + " y = 2;" + + " return;" + + " case 'set2':" + + " y = 71;" + + " return;" + + " case 'delete':" + + " try { return eval('delete y'); }" + + " catch (e) { return e.name; }" + + " }" + + "}" + + "actY;"; + +try { var local0 = y; } catch (e) { local0 = e.name; } + +var f = eval(ycode); + +var inner1 = f("get"); +try { var local1 = y; } catch (e) { local1 = e.name; } + +try { y = 8; } catch (e) { assert.sameValue(e.name, "ReferenceError"); } +var inner2 = f("get"); +try { var local2 = y; } catch (e) { local2 = e.name; } + +f("set1"); +var inner3 = f("get"); +try { var local3 = y; } catch (e) { local3 = e.name; } + +var del = f("delete"); +try { var inner4 = f("get"); } catch (e) { inner4 = e.name; } +try { var local4 = y; } catch (e) { local4 = e.name; } + +f("set2"); +try { var inner5 = f("get"); } catch (e) { inner5 = e.name; } +try { var local5 = y; } catch (e) { local5 = e.name; } + +var resultsY = + { + local0: local0, + inner1: inner1, local1: local1, + inner2: inner2, local2: local2, + inner3: inner3, local3: local3, + del: del, + inner4: inner4, local4: local4, + inner5: inner5, local5: local5, + }; + +assert.sameValue(resultsY.local0, "ReferenceError"); + +assert.sameValue(resultsY.inner1, 5); +assert.sameValue(resultsY.local1, "ReferenceError"); + +assert.sameValue(resultsY.inner2, 5); +assert.sameValue(resultsY.local2, "ReferenceError"); + +assert.sameValue(resultsY.inner3, 2); +assert.sameValue(resultsY.local3, "ReferenceError"); + +assert.sameValue(resultsY.del, "SyntaxError"); + +assert.sameValue(resultsY.inner4, 2); +assert.sameValue(resultsY.local4, "ReferenceError"); + +assert.sameValue(resultsY.inner5, 71); +assert.sameValue(resultsY.local5, "ReferenceError"); + +/******************************************************************************/ + +print("Tests complete!"); diff --git a/test/staging/sm/eval/exhaustive-global-strictcaller-indirect-normalcode.js b/test/staging/sm/eval/exhaustive-global-strictcaller-indirect-normalcode.js new file mode 100644 index 0000000000..ecb37a50b8 --- /dev/null +++ b/test/staging/sm/eval/exhaustive-global-strictcaller-indirect-normalcode.js @@ -0,0 +1,181 @@ +/* + * Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/licenses/publicdomain/ + */ + +/*--- +flags: +- onlyStrict +includes: [sm/non262-shell.js, sm/non262.js] +description: | + pending +esid: pending +---*/ +"use strict"; + +//----------------------------------------------------------------------------- +var BUGNUMBER = 514568; +var summary = "eval in all its myriad flavors"; + +print(BUGNUMBER + ": " + summary); + +/************** + * BEGIN TEST * + **************/ + +var x = 17; + +var ev = eval; + +var xcode = + "var x = 4;" + + "function actX(action)" + + "{" + + " switch (action)" + + " {" + + " case 'get':" + + " return x;" + + " case 'set1':" + + " x = 9;" + + " return;" + + " case 'set2':" + + " x = 23;" + + " return;" + + " case 'delete':" + + " try { return eval('delete x'); }" + + " catch (e) { return e.name; }" + + " }" + + "}" + + "actX;"; + +var local0 = x; + +var f = ev(xcode); + +var inner1 = f("get"); +var local1 = x; + +x = 7; +var inner2 = f("get"); +var local2 = x; + +f("set1"); +var inner3 = f("get"); +var local3 = x; + +var del = f("delete"); +var inner4 = f("get"); +var local4 = x; + +f("set2"); +var inner5 = f("get"); +var local5 = x; + +var resultsX = + { + local0: local0, + inner1: inner1, local1: local1, + inner2: inner2, local2: local2, + inner3: inner3, local3: local3, + del: del, + inner4: inner4, local4: local4, + inner5: inner5, local5: local5, + }; + +assert.sameValue(resultsX.local0, 17); + +assert.sameValue(resultsX.inner1, 4); +assert.sameValue(resultsX.local1, 4); + +assert.sameValue(resultsX.inner2, 7); +assert.sameValue(resultsX.local2, 7); + +assert.sameValue(resultsX.inner3, 9); +assert.sameValue(resultsX.local3, 9); + +assert.sameValue(resultsX.del, false); + +assert.sameValue(resultsX.inner4, 9); +assert.sameValue(resultsX.local4, 9); + +assert.sameValue(resultsX.inner5, 23); +assert.sameValue(resultsX.local5, 23); + + +var ycode = + "var y = 5;" + + "function actY(action)" + + "{" + + " switch (action)" + + " {" + + " case 'get':" + + " return y;" + + " case 'set1':" + + " y = 2;" + + " return;" + + " case 'set2':" + + " y = 71;" + + " return;" + + " case 'delete':" + + " try { return eval('delete y'); }" + + " catch (e) { return e.name; }" + + " }" + + "}" + + "actY;"; + +try { var local0 = y; } catch (e) { local0 = e.name; } + +var f = ev(ycode); + +var inner1 = f("get"); +var local1 = y; + +try { y = 8; } catch (e) { assert.sameValue(e.name, "ReferenceError"); } +var inner2 = f("get"); +var local2 = y; + +f("set1"); +var inner3 = f("get"); +var local3 = y; + +var del = f("delete"); +try { var inner4 = f("get"); } catch (e) { inner4 = e.name; } +try { var local4 = y; } catch (e) { local4 = e.name; } + +f("set2"); +try { var inner5 = f("get"); } catch (e) { inner5 = e.name; } +try { var local5 = y; } catch (e) { local5 = e.name; } + +var resultsY = + { + local0: local0, + inner1: inner1, local1: local1, + inner2: inner2, local2: local2, + inner3: inner3, local3: local3, + del: del, + inner4: inner4, local4: local4, + inner5: inner5, local5: local5, + }; + +assert.sameValue(resultsY.local0, "ReferenceError"); + +assert.sameValue(resultsY.inner1, 5); +assert.sameValue(resultsY.local1, 5); + +assert.sameValue(resultsY.inner2, 8); +assert.sameValue(resultsY.local2, 8); + +assert.sameValue(resultsY.inner3, 2); +assert.sameValue(resultsY.local3, 2); + +assert.sameValue(resultsY.del, true); + +assert.sameValue(resultsY.inner4, "ReferenceError"); +assert.sameValue(resultsY.local4, "ReferenceError"); + +assert.sameValue(resultsY.inner5, 71); +assert.sameValue(resultsY.local5, 71); + +/******************************************************************************/ + +print("Tests complete!"); diff --git a/test/staging/sm/eval/exhaustive-global-strictcaller-indirect-strictcode.js b/test/staging/sm/eval/exhaustive-global-strictcaller-indirect-strictcode.js new file mode 100644 index 0000000000..d5a42962ea --- /dev/null +++ b/test/staging/sm/eval/exhaustive-global-strictcaller-indirect-strictcode.js @@ -0,0 +1,183 @@ +/* + * Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/licenses/publicdomain/ + */ + +/*--- +flags: +- onlyStrict +includes: [sm/non262-shell.js, sm/non262.js] +description: | + pending +esid: pending +---*/ +"use strict"; + +//----------------------------------------------------------------------------- +var BUGNUMBER = 514568; +var summary = "eval in all its myriad flavors"; + +print(BUGNUMBER + ": " + summary); + +/************** + * BEGIN TEST * + **************/ + +var x = 17; + +var ev = eval; + +var xcode = + "'use strict';" + + "var x = 4;" + + "function actX(action)" + + "{" + + " switch (action)" + + " {" + + " case 'get':" + + " return x;" + + " case 'set1':" + + " x = 9;" + + " return;" + + " case 'set2':" + + " x = 23;" + + " return;" + + " case 'delete':" + + " try { return eval('delete x'); }" + + " catch (e) { return e.name; }" + + " }" + + "}" + + "actX;"; + +var local0 = x; + +var f = ev(xcode); + +var inner1 = f("get"); +var local1 = x; + +x = 7; +var inner2 = f("get"); +var local2 = x; + +f("set1"); +var inner3 = f("get"); +var local3 = x; + +var del = f("delete"); +var inner4 = f("get"); +var local4 = x; + +f("set2"); +var inner5 = f("get"); +var local5 = x; + +var resultsX = + { + local0: local0, + inner1: inner1, local1: local1, + inner2: inner2, local2: local2, + inner3: inner3, local3: local3, + del: del, + inner4: inner4, local4: local4, + inner5: inner5, local5: local5, + }; + +assert.sameValue(resultsX.local0, 17); + +assert.sameValue(resultsX.inner1, 4); +assert.sameValue(resultsX.local1, 17); + +assert.sameValue(resultsX.inner2, 4); +assert.sameValue(resultsX.local2, 7); + +assert.sameValue(resultsX.inner3, 9); +assert.sameValue(resultsX.local3, 7); + +assert.sameValue(resultsX.del, "SyntaxError"); + +assert.sameValue(resultsX.inner4, 9); +assert.sameValue(resultsX.local4, 7); + +assert.sameValue(resultsX.inner5, 23); +assert.sameValue(resultsX.local5, 7); + + +var ycode = + "'use strict';" + + "var y = 5;" + + "function actY(action)" + + "{" + + " switch (action)" + + " {" + + " case 'get':" + + " return y;" + + " case 'set1':" + + " y = 2;" + + " return;" + + " case 'set2':" + + " y = 71;" + + " return;" + + " case 'delete':" + + " try { return eval('delete y'); }" + + " catch (e) { return e.name; }" + + " }" + + "}" + + "actY;"; + +try { var local0 = y; } catch (e) { local0 = e.name; } + +var f = ev(ycode); + +var inner1 = f("get"); +try { var local1 = y; } catch (e) { local1 = e.name; } + +try { y = 8; } catch (e) { assert.sameValue(e.name, "ReferenceError"); } +var inner2 = f("get"); +try { var local2 = y; } catch (e) { local2 = e.name; } + +f("set1"); +var inner3 = f("get"); +try { var local3 = y; } catch (e) { local3 = e.name; } + +var del = f("delete"); +try { var inner4 = f("get"); } catch (e) { inner4 = e.name; } +try { var local4 = y; } catch (e) { local4 = e.name; } + +f("set2"); +try { var inner5 = f("get"); } catch (e) { inner5 = e.name; } +try { var local5 = y; } catch (e) { local5 = e.name; } + +var resultsY = + { + local0: local0, + inner1: inner1, local1: local1, + inner2: inner2, local2: local2, + inner3: inner3, local3: local3, + del: del, + inner4: inner4, local4: local4, + inner5: inner5, local5: local5, + }; + +assert.sameValue(resultsY.local0, "ReferenceError"); + +assert.sameValue(resultsY.inner1, 5); +assert.sameValue(resultsY.local1, "ReferenceError"); + +assert.sameValue(resultsY.inner2, 5); +assert.sameValue(resultsY.local2, "ReferenceError"); + +assert.sameValue(resultsY.inner3, 2); +assert.sameValue(resultsY.local3, "ReferenceError"); + +assert.sameValue(resultsY.del, "SyntaxError"); + +assert.sameValue(resultsY.inner4, 2); +assert.sameValue(resultsY.local4, "ReferenceError"); + +assert.sameValue(resultsY.inner5, 71); +assert.sameValue(resultsY.local5, "ReferenceError"); + +/******************************************************************************/ + +print("Tests complete!"); diff --git a/test/staging/sm/eval/line-terminator-paragraph-terminator.js b/test/staging/sm/eval/line-terminator-paragraph-terminator.js new file mode 100644 index 0000000000..1511044500 --- /dev/null +++ b/test/staging/sm/eval/line-terminator-paragraph-terminator.js @@ -0,0 +1,31 @@ +/* + * Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/licenses/publicdomain/ + */ + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +//----------------------------------------------------------------------------- +var BUGNUMBER = 657367; +var summary = + "eval via the JSON parser should parse strings containing U+2028/U+2029 " + + "(as of , that is)"; + +print(BUGNUMBER + ": " + summary); + +/************** + * BEGIN TEST * + **************/ + +assert.sameValue(eval('("\u2028")'), "\u2028"); +assert.sameValue(eval('("\u2029")'), "\u2029"); + +/******************************************************************************/ + +print("Tests complete!"); diff --git a/test/staging/sm/eval/redeclared-arguments-in-param-expression-eval.js b/test/staging/sm/eval/redeclared-arguments-in-param-expression-eval.js new file mode 100644 index 0000000000..93b6c60e44 --- /dev/null +++ b/test/staging/sm/eval/redeclared-arguments-in-param-expression-eval.js @@ -0,0 +1,96 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +// Ensure there's no predefined |arguments| binding. +assert.sameValue("arguments" in this, false); + +// Declare |arguments| when no pre-existing (and explicit) |arguments| bindings are present. +function f1(p = eval("var arguments")) {} +assertThrowsInstanceOf(f1, SyntaxError); + +// Declare |arguments| when the function body contains an |arguments| var-binding. +function f2(p = eval("var arguments")) { + var arguments; +} +assertThrowsInstanceOf(f2, SyntaxError); + +// Declare |arguments| when the function body contains an |arguments| function declaration. +// +// doesn't create the +// implicit |arguments| binding when no parameter expressions are present. This case +// may be special-cased in implementations and therefore should be tested specifically. +function f3(p = eval("var arguments")) { + function arguments() {} +} +assertThrowsInstanceOf(f3, SyntaxError); + +// Declare |arguments| when the function body contains an |arguments| lexical binding. +// +// doesn't create the +// implicit |arguments| binding when no parameter expressions are present. This case +// may be special-cased in implementations and therefore should be tested specifically. +function f4(p = eval("var arguments")) { + let arguments; +} +assertThrowsInstanceOf(f4, SyntaxError); + +// Declare |arguments| when a following parameter is named |arguments|. +function f5(p = eval("var arguments"), arguments) {} +assertThrowsInstanceOf(f5, SyntaxError); + +// Declare |arguments| when a preceding parameter is named |arguments|. +function f6(arguments, p = eval("var arguments")) {} +assertThrowsInstanceOf(f6, SyntaxError); + + +// Repeat the same kind of tests for arrow function. + +// Declare |arguments| when no pre-existing |arguments| bindings are present. +var a1 = (p = eval("var arguments = 'param'")) => { + assert.sameValue(arguments, "param"); +}; +a1(); + +// Declare |arguments| when the function body contains an |arguments| var-binding. +var a2 = (p = eval("var arguments = 'param'"), q = () => arguments) => { + var arguments = "local"; + assert.sameValue(arguments, "local"); + assert.sameValue(q(), "param"); +}; +a2(); + +// Declare |arguments| when the function body contains an |arguments| function declaration. +var a3 = (p = eval("var arguments = 'param'"), q = () => arguments) => { + function arguments() {} + assert.sameValue(typeof arguments, "function"); + assert.sameValue(q(), "param"); +}; +a3(); + +// Declare |arguments| when the function body contains an |arguments| lexical binding. +var a4 = (p = eval("var arguments = 'param'"), q = () => arguments) => { + let arguments = "local"; + assert.sameValue(arguments, "local"); + assert.sameValue(q(), "param"); +}; +a4(); + +// Declare |arguments| when a following parameter is named |arguments|. +var a5 = (p = eval("var arguments"), arguments) => {}; +assertThrowsInstanceOf(a5, SyntaxError); + +// Declare |arguments| when a preceding parameter is named |arguments|. +var a6 = (arguments, p = eval("var arguments")) => {}; +assertThrowsInstanceOf(a6, SyntaxError); + +// None of the direct eval calls introduced a global |arguments| binding. +assert.sameValue("arguments" in this, false); + diff --git a/test/staging/sm/eval/regress-531682.js b/test/staging/sm/eval/regress-531682.js new file mode 100644 index 0000000000..c099538cee --- /dev/null +++ b/test/staging/sm/eval/regress-531682.js @@ -0,0 +1,39 @@ +/* + * Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/licenses/publicdomain/ + */ + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +//----------------------------------------------------------------------------- +var BUGNUMBER = 531682; +var summary = 'Checking proper wrapping of scope in eval(source, scope)'; +var actual; +var expect; + +//----------------------------------------------------------------------------- +var x = 0; + +test(); +//----------------------------------------------------------------------------- + +function scope1() { + eval('var x = 1;'); + return function() { return x; } +} + +function test() { + printBugNumber(BUGNUMBER); + printStatus (summary); + + // The scope chain in eval should be just scope1() and the global object. + actual = eval('x', scope1()); + expect = 0; + assert.sameValue(expect, actual, summary); +} diff --git a/test/staging/sm/eval/undeclared-name-in-nested-strict-eval.js b/test/staging/sm/eval/undeclared-name-in-nested-strict-eval.js new file mode 100644 index 0000000000..7f420d4c0d --- /dev/null +++ b/test/staging/sm/eval/undeclared-name-in-nested-strict-eval.js @@ -0,0 +1,34 @@ +/* + * Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/licenses/publicdomain/ + */ + +/*--- +flags: +- onlyStrict +includes: [sm/non262-shell.js, sm/non262.js] +description: | + pending +esid: pending +---*/ +"use strict"; + +//----------------------------------------------------------------------------- +var BUGNUMBER = 514568; +var summary = + "Verify that we don't optimize free names to gnames in eval code that's " + + "global, when the name refers to a binding introduced by a strict mode " + + "eval frame"; + +print(BUGNUMBER + ": " + summary); + +/************** + * BEGIN TEST * + **************/ + +var x = "global"; +assert.sameValue(eval('var x = "eval"; eval("x")'), "eval"); + +/******************************************************************************/ + +print("Tests complete!"); diff --git a/test/staging/sm/expressions/11.1.5-01.js b/test/staging/sm/expressions/11.1.5-01.js new file mode 100644 index 0000000000..07ce6b480f --- /dev/null +++ b/test/staging/sm/expressions/11.1.5-01.js @@ -0,0 +1,46 @@ +/* + * Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/licenses/publicdomain/ + */ + +/*--- +includes: [sm/non262-expressions-shell.js, sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +//----------------------------------------------------------------------------- +var BUGNUMBER = 520696; +var summary = + 'Implement support for string literals as names for properties defined ' + + 'using ES5 get/set syntax'; + +print(BUGNUMBER + ": " + summary); + + +var o; + +o = { get "a b c"() { return 17; } }; +assert.sameValue("get" in Object.getOwnPropertyDescriptor(o, "a b c"), true); + +o = eval('({ get "a b c"() { return 17; } })'); +assert.sameValue("get" in Object.getOwnPropertyDescriptor(o, "a b c"), true); + +var f = eval("(function literalInside() { return { set 'c d e'(q) { } }; })"); +f = function literalInside() { return { set 'c d e'(q) { } }; }; + +function checkO() +{ + assert.sameValue(3.141592654 in o, true, "fractional-named property isn't in object"); + assert.sameValue(10000 in o, true, "exponential-named property is in object"); + assert.sameValue(0xdeadbeef in o, true, "hex-named property is in object"); + assert.sameValue("Infinity" in o, true, "numeric index stringified correctly"); +} + +o = eval('({ 3.141592654: "pi", 1e4: 17, 0xdeadbeef: "hex", 1e3000: "Infinity" })'); +checkO(); +o = { 3.141592654: "pi", 1e4: 17, 0xdeadbeef: "hex", 1e3000: "Infinity" }; +checkO(); + diff --git a/test/staging/sm/expressions/ToPropertyKey-symbols.js b/test/staging/sm/expressions/ToPropertyKey-symbols.js new file mode 100644 index 0000000000..8512436f3b --- /dev/null +++ b/test/staging/sm/expressions/ToPropertyKey-symbols.js @@ -0,0 +1,100 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-expressions-shell.js, sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +var symbols = [ + Symbol(), Symbol("iterator"), Symbol.for("iterator"), Symbol.iterator +]; + +for (var sym of symbols) { + var key = { + toString() { return sym; } + }; + + // Test that ToPropertyKey can return a symbol in each of the following + // contexts. + + // Computed property names. + var obj = {[key]: 13}; + var found = Reflect.ownKeys(obj); + assert.sameValue(found.length, 1); + assert.sameValue(found[0], sym); + + // Computed accessor property names. + var obj2 = { + get [key]() { return "got"; }, + set [key](v) { this.v = v; } + }; + assert.sameValue(obj2[sym], "got"); + obj2[sym] = 33; + assert.sameValue(obj2.v, 33); + + // Getting and setting properties. + assert.sameValue(obj[key], 13); + obj[key] = 19; + assert.sameValue(obj[sym], 19); + (function () { "use strict"; obj[key] = 20; })(); + assert.sameValue(obj[sym], 20); + obj[key]++; + assert.sameValue(obj[sym], 21); + + // Getting properties of primitive values. + Number.prototype[sym] = "success"; + assert.sameValue(Math.PI[key], "success"); + delete Number.prototype[sym]; + + // Getting a super property. + class X { + [sym]() { return "X"; } + } + class Y extends X { + [sym]() { return super[key]() + "Y"; } + } + var y = new Y(); + assert.sameValue(y[sym](), "XY"); + + // Setting a super property. + class Z { + set [sym](v) { + this.self = this; + this.value = v; + } + } + class W extends Z { + set [sym](v) { + this.isW = true; + super[key] = v; + } + } + var w = new W(); + w[key] = "ok"; + assert.sameValue(w.self, w); + assert.sameValue(w.value, "ok"); + assert.sameValue(w.isW, true); + + // Deleting properties. + obj = {[sym]: 1}; + assert.sameValue(delete obj[key], true); + assert.sameValue(sym in obj, false); + + // LHS of `in` expressions. + assert.sameValue(key in {iterator: 0}, false); + assert.sameValue(key in {[sym]: 0}, true); + + // Methods of Object and Object.prototype + obj = {}; + Object.defineProperty(obj, key, {value: "ok", enumerable: true}); + assert.sameValue(obj[sym], "ok"); + assert.sameValue(obj.hasOwnProperty(key), true); + assert.sameValue(obj.propertyIsEnumerable(key), true); + var desc = Object.getOwnPropertyDescriptor(obj, key); + assert.sameValue(desc.value, "ok"); +} + diff --git a/test/staging/sm/expressions/binary-literals.js b/test/staging/sm/expressions/binary-literals.js new file mode 100644 index 0000000000..6447910ade --- /dev/null +++ b/test/staging/sm/expressions/binary-literals.js @@ -0,0 +1,122 @@ +/* + * Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/licenses/publicdomain/ + */ + +/*--- +includes: [sm/non262-expressions-shell.js, sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +//----------------------------------------------------------------------------- +var BUGNUMBER = 894026; +var summary = "Implement ES6 binary literals"; + +print(BUGNUMBER + ": " + summary); + +/************** + * BEGIN TEST * + **************/ + +var chars = ['b', 'B']; + +for (var i = 0; i < 2; i++) +{ + if (i === 2) + { + chars.forEach(function(v) + { + try + { + eval('0' + v + i); + throw "didn't throw"; + } + catch (e) + { + assert.sameValue(e instanceof SyntaxError, true, + "no syntax error evaluating 0" + v + i + ", " + + "got " + e); + } + }); + continue; + } + + for (var j = 0; j < 2; j++) + { + if (j === 2) + { + chars.forEach(function(v) + { + try + { + eval('0' + v + i + j); + throw "didn't throw"; + } + catch (e) + { + assert.sameValue(e instanceof SyntaxError, true, + "no syntax error evaluating 0" + v + i + j + ", " + + "got " + e); + } + }); + continue; + } + + for (var k = 0; k < 2; k++) + { + if (k === 2) + { + chars.forEach(function(v) + { + try + { + eval('0' + v + i + j + k); + throw "didn't throw"; + } + catch (e) + { + assert.sameValue(e instanceof SyntaxError, true, + "no syntax error evaluating 0" + v + i + j + k + ", " + + "got " + e); + } + }); + continue; + } + + chars.forEach(function(v) + { + assert.sameValue(eval('0' + v + i + j + k), i * 4 + j * 2 + k); + }); + } + } +} + +chars.forEach(function(v) +{ + try + { + } + catch (e) + { + assert.sameValue(e instanceof SyntaxError, true, + "no syntax error evaluating 0" + v + ", got " + e); + } +}); + +// Off-by-one check: '/' immediately precedes '0'. +assert.sameValue(0b110/1, 6); +assert.sameValue(0B10110/1, 22); + +function strict() +{ + "use strict"; + return 0b11010101; +} +assert.sameValue(strict(), 128 + 64 + 16 + 4 + 1); + +/******************************************************************************/ + +print("Tests complete"); diff --git a/test/staging/sm/expressions/computed-property-side-effects.js b/test/staging/sm/expressions/computed-property-side-effects.js new file mode 100644 index 0000000000..7736c372c7 --- /dev/null +++ b/test/staging/sm/expressions/computed-property-side-effects.js @@ -0,0 +1,42 @@ +/* + * Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/licenses/publicdomain/ + */ + +/*--- +includes: [sm/non262-expressions-shell.js, sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +//----------------------------------------------------------------------------- +var BUGNUMBER = 1199695; +var summary = + "Computed property names must be considered as always effectful even when " + + "the name expression isn't effectful, because calling ToPropertyKey on " + + "some non-effectful expressions has user-modifiable behavior"; + +print(BUGNUMBER + ": " + summary); + +/************** + * BEGIN TEST * + **************/ + +RegExp.prototype.toString = () => { throw 42; }; +assertThrowsValue(function() { + ({ [/regex/]: 0 }); // ToPropertyKey(/regex/) throws 42 +}, 42); + +function Q() { + ({ [new.target]: 0 }); // new.target will be Q, ToPropertyKey(Q) throws 17 +} +Q.toString = () => { throw 17; }; +assertThrowsValue(function() { + new Q; +}, 17); + +/******************************************************************************/ + +print("Tests complete"); diff --git a/test/staging/sm/expressions/constant-folded-labeled-statement.js b/test/staging/sm/expressions/constant-folded-labeled-statement.js new file mode 100644 index 0000000000..e1bb4db5bf --- /dev/null +++ b/test/staging/sm/expressions/constant-folded-labeled-statement.js @@ -0,0 +1,23 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-expressions-shell.js, sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +var BUGNUMBER = 1499448; +var summary = "Constant folder should fold labeled statements"; + +print(BUGNUMBER + ": " + summary); + +if (typeof disassemble === "function") { + var code = disassemble(() => { x: 2+2; }); + + if (typeof assert.sameValue === "function") + assert.sameValue(true, /Int8 4/.test(code)); +} + diff --git a/test/staging/sm/expressions/delete-constant-folded-and-or.js b/test/staging/sm/expressions/delete-constant-folded-and-or.js new file mode 100644 index 0000000000..c607680893 --- /dev/null +++ b/test/staging/sm/expressions/delete-constant-folded-and-or.js @@ -0,0 +1,48 @@ +/* + * Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/licenses/publicdomain/ + */ + +/*--- +includes: [sm/non262-expressions-shell.js, sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +//----------------------------------------------------------------------------- +var BUGNUMBER = 1183400; +var summary = + "Deletion of a && or || expression that constant-folds to a name must not " + + "attempt to delete the name"; + +print(BUGNUMBER + ": " + summary); + +/************** + * BEGIN TEST * + **************/ + +Object.defineProperty(this, "nonconfigurable", { value: 42 }); +assert.sameValue(nonconfigurable, 42); + +assert.sameValue(delete nonconfigurable, false); +assert.sameValue(delete (true && nonconfigurable), true); + +function nested() +{ + assert.sameValue(delete nonconfigurable, false); + assert.sameValue(delete (true && nonconfigurable), true); +} +nested(); + +function nestedStrict() +{ + "use strict"; + assert.sameValue(delete (true && nonconfigurable), true); +} +nestedStrict(); + +/******************************************************************************/ + +print("Tests complete"); diff --git a/test/staging/sm/expressions/delete-name-parenthesized-early-error-strict-mode.js b/test/staging/sm/expressions/delete-name-parenthesized-early-error-strict-mode.js new file mode 100644 index 0000000000..239faba254 --- /dev/null +++ b/test/staging/sm/expressions/delete-name-parenthesized-early-error-strict-mode.js @@ -0,0 +1,83 @@ +/* + * Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/licenses/publicdomain/ + */ + +/*--- +includes: [sm/non262-expressions-shell.js, sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +//----------------------------------------------------------------------------- +var BUGNUMBER = 1111101; +var summary = + "delete (foo), delete ((foo)), and so on are strict mode early errors"; + +print(BUGNUMBER + ": " + summary); + +/************** + * BEGIN TEST * + **************/ + +function checkSyntaxError(code) +{ + function helper(maker) + { + var earlyError = false; + try + { + var f = maker(code); + + var error = "no early error, created a function with code <" + code + ">"; + try + { + f(); + error += ", and the function can be called without error"; + } + catch (e) + { + error +=", and calling the function throws " + e; + } + + throw new Error(error); + } + catch (e) + { + assert.sameValue(e instanceof SyntaxError, true, + "expected syntax error, got " + e); + } + } + + helper(Function); + helper(eval); +} + +checkSyntaxError("function f() { 'use strict'; delete escape; } f();"); +checkSyntaxError("function f() { 'use strict'; delete escape; }"); +checkSyntaxError("function f() { 'use strict'; delete (escape); } f();"); +checkSyntaxError("function f() { 'use strict'; delete (escape); }"); +checkSyntaxError("function f() { 'use strict'; delete ((escape)); } f();"); +checkSyntaxError("function f() { 'use strict'; delete ((escape)); }"); + +// Meanwhile, non-strict all of these should work + +function checkFine(code) +{ + Function(code); + (1, eval)(code); // indirect, to be consistent w/above +} + +checkFine("function f() { delete escape; } f();"); +checkFine("function f() { delete escape; }"); +checkFine("function f() { delete (escape); } f();"); +checkFine("function f() { delete (escape); }"); +checkFine("function f() { delete ((escape)); } f();"); +checkFine("function f() { delete ((escape)); }"); + + +/******************************************************************************/ + +print("Tests complete"); diff --git a/test/staging/sm/expressions/destructuring-array-default-call.js b/test/staging/sm/expressions/destructuring-array-default-call.js new file mode 100644 index 0000000000..4990b9c89f --- /dev/null +++ b/test/staging/sm/expressions/destructuring-array-default-call.js @@ -0,0 +1,19 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-expressions-shell.js, sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +var BUGNUMBER = 1184922; +var summary = "Array destructuring with various default values in various context - call/new expression"; + +print(BUGNUMBER + ": " + summary); + +testDestructuringArrayDefault("func()"); +testDestructuringArrayDefault("new func()"); + diff --git a/test/staging/sm/expressions/destructuring-array-default-class.js b/test/staging/sm/expressions/destructuring-array-default-class.js new file mode 100644 index 0000000000..145349a8c6 --- /dev/null +++ b/test/staging/sm/expressions/destructuring-array-default-class.js @@ -0,0 +1,81 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-expressions-shell.js, sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +var BUGNUMBER = 1184922; +var summary = "Array destructuring with various default values in various context - class expression and super/new.target"; + +print(BUGNUMBER + ": " + summary); + +testDestructuringArrayDefault(`class E { + constructor() {} + method() {} + get v() {} + set v(_) {} + static method() {} + static get v() {} + static set v(_) {} +}`); + +testDestructuringArrayDefault(`class E extends C { + constructor() {} + method() {} + get v() {} + set v(_) {} + static method() {} + static get v() {} + static set v(_) {} +}`); + +var opt = { + no_plain: true, + no_func: true, + no_func_arg: true, + no_gen: true, + no_gen_arg: true, + no_ctor: true, + no_method: true, + no_pre_super: true, + no_comp: true, + + no_derived_ctor: false, +}; +testDestructuringArrayDefault("super()", opt); + +opt = { + no_plain: true, + no_func: true, + no_func_arg: true, + no_gen: true, + no_gen_arg: true, + no_ctor: true, + no_comp: true, + + no_derived_ctor: false, + no_method: false, + no_pre_super: false, +}; +testDestructuringArrayDefault("super.foo()", opt); + +opt = { + no_plain: true, + + no_func: false, + no_func_arg: false, + no_gen: false, + no_gen_arg: false, + no_ctor: false, + no_derived_ctor: false, + no_method: false, + no_pre_super: false, + no_comp: false, +}; +testDestructuringArrayDefault("new.target", opt); + diff --git a/test/staging/sm/expressions/destructuring-array-default-function-nested.js b/test/staging/sm/expressions/destructuring-array-default-function-nested.js new file mode 100644 index 0000000000..428dbb4f94 --- /dev/null +++ b/test/staging/sm/expressions/destructuring-array-default-function-nested.js @@ -0,0 +1,20 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-expressions-shell.js, sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +var BUGNUMBER = 1184922; +var summary = "Array destructuring with various default values in various context - function expression with nested objects"; + +print(BUGNUMBER + ": " + summary); + +testDestructuringArrayDefault("function f() { return { f() {}, *g() {}, r: /a/ }; }"); +testDestructuringArrayDefault("function* g() { return { f() {}, *g() {}, r: /b/ }; }"); +testDestructuringArrayDefault("() => { return { f() {}, *g() {}, r: /c/ }; }"); + diff --git a/test/staging/sm/expressions/destructuring-array-default-function.js b/test/staging/sm/expressions/destructuring-array-default-function.js new file mode 100644 index 0000000000..28d2e9649e --- /dev/null +++ b/test/staging/sm/expressions/destructuring-array-default-function.js @@ -0,0 +1,20 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-expressions-shell.js, sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +var BUGNUMBER = 1184922; +var summary = "Array destructuring with various default values in various context - function expression"; + +print(BUGNUMBER + ": " + summary); + +testDestructuringArrayDefault("function f() {}"); +testDestructuringArrayDefault("function* g() {}"); +testDestructuringArrayDefault("() => {}"); + diff --git a/test/staging/sm/expressions/destructuring-array-default-simple.js b/test/staging/sm/expressions/destructuring-array-default-simple.js new file mode 100644 index 0000000000..f6c988ea79 --- /dev/null +++ b/test/staging/sm/expressions/destructuring-array-default-simple.js @@ -0,0 +1,25 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-expressions-shell.js, sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +var BUGNUMBER = 1184922; +var summary = "Array destructuring with various default values in various context - simple literal"; + +print(BUGNUMBER + ": " + summary); + +testDestructuringArrayDefault("'foo'"); +testDestructuringArrayDefault("`foo`"); +testDestructuringArrayDefault("func`foo`"); + +testDestructuringArrayDefault("/foo/"); + +testDestructuringArrayDefault("{}"); +testDestructuringArrayDefault("[]"); + diff --git a/test/staging/sm/expressions/destructuring-array-default-yield.js b/test/staging/sm/expressions/destructuring-array-default-yield.js new file mode 100644 index 0000000000..7c337de775 --- /dev/null +++ b/test/staging/sm/expressions/destructuring-array-default-yield.js @@ -0,0 +1,31 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-expressions-shell.js, sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +var BUGNUMBER = 1184922; +var summary = "Array destructuring with various default values in various context - yield expression"; + +print(BUGNUMBER + ": " + summary); + +var opt = { + no_plain: true, + no_func: true, + no_func_arg: true, + no_gen_arg: true, + no_ctor: true, + no_derived_ctor: true, + no_method: true, + no_pre_super: true, + no_comp: true, + + no_gen: false, +}; +testDestructuringArrayDefault("yield 1", opt); + diff --git a/test/staging/sm/expressions/destructuring-array-done.js b/test/staging/sm/expressions/destructuring-array-done.js new file mode 100644 index 0000000000..bb7ae48bd3 --- /dev/null +++ b/test/staging/sm/expressions/destructuring-array-done.js @@ -0,0 +1,328 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-expressions-shell.js, sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +var BUGNUMBER = 1184922; +var summary = "iterator.next() should not be called when after iterator completes"; + +print(BUGNUMBER + ": " + summary); + +var log; +function reset() { + log = ""; +} +var obj = new Proxy({}, { + set(that, name, value) { + var v; + if (value instanceof Function || value instanceof RegExp) + v = value.toString(); + else + v = JSON.stringify(value); + log += "set:" + name + "=" + v + ","; + } +}); +function createIterable(n) { + return { + i: 0, + [Symbol.iterator]() { + return this; + }, + next() { + log += "next,"; + this.i++; + if (this.i <= n) + return {value: this.i, done: false}; + return {value: 0, done: true}; + } + }; +} + +// Simple pattern. + +reset(); +[obj.a, obj.b, obj.c] = createIterable(0); +assert.sameValue(log, + "next," + + "set:a=undefined," + + "set:b=undefined," + + "set:c=undefined,"); + +reset(); +[obj.a, obj.b, obj.c] = createIterable(1); +assert.sameValue(log, + "next," + + "set:a=1," + + "next," + + "set:b=undefined," + + "set:c=undefined,"); + +reset(); +[obj.a, obj.b, obj.c] = createIterable(2); +assert.sameValue(log, + "next," + + "set:a=1," + + "next," + + "set:b=2," + + "next," + + "set:c=undefined,"); + +reset(); +[obj.a, obj.b, obj.c] = createIterable(3); +assert.sameValue(log, + "next," + + "set:a=1," + + "next," + + "set:b=2," + + "next," + + "set:c=3,"); + +// Elision. + +reset(); +[obj.a, , obj.b, , , obj.c, ,] = createIterable(0); +assert.sameValue(log, + "next," + + "set:a=undefined," + + "set:b=undefined," + + "set:c=undefined,"); + +reset(); +[obj.a, , obj.b, , , obj.c, ,] = createIterable(1); +assert.sameValue(log, + "next," + + "set:a=1," + + "next," + + "set:b=undefined," + + "set:c=undefined,"); + +reset(); +[obj.a, , obj.b, , , obj.c, ,] = createIterable(2); +assert.sameValue(log, + "next," + + "set:a=1," + + "next," + + "next," + + "set:b=undefined," + + "set:c=undefined,"); + +reset(); +[obj.a, , obj.b, , , obj.c, ,] = createIterable(3); +assert.sameValue(log, + "next," + + "set:a=1," + + "next," + + "next," + + "set:b=3," + + "next," + + "set:c=undefined,"); + +reset(); +[obj.a, , obj.b, , , obj.c, ,] = createIterable(4); +assert.sameValue(log, + "next," + + "set:a=1," + + "next," + + "next," + + "set:b=3," + + "next," + + "next," + + "set:c=undefined,"); + +reset(); +[obj.a, , obj.b, , , obj.c, ,] = createIterable(5); +assert.sameValue(log, + "next," + + "set:a=1," + + "next," + + "next," + + "set:b=3," + + "next," + + "next," + + "next," + + "set:c=undefined,"); + +reset(); +[obj.a, , obj.b, , , obj.c, ,] = createIterable(6); +assert.sameValue(log, + "next," + + "set:a=1," + + "next," + + "next," + + "set:b=3," + + "next," + + "next," + + "next," + + "set:c=6," + + "next,"); + +reset(); +[obj.a, , obj.b, , , obj.c, ,] = createIterable(7); +assert.sameValue(log, + "next," + + "set:a=1," + + "next," + + "next," + + "set:b=3," + + "next," + + "next," + + "next," + + "set:c=6," + + "next,"); + +// Rest. + +reset(); +[...obj.r] = createIterable(0); +assert.sameValue(log, + "next," + + "set:r=[],"); + +reset(); +[...obj.r] = createIterable(1); +assert.sameValue(log, + "next," + + "next," + + "set:r=[1],"); + +reset(); +[obj.a, ...obj.r] = createIterable(0); +assert.sameValue(log, + "next," + + "set:a=undefined," + + "set:r=[],"); + +reset(); +[obj.a, ...obj.r] = createIterable(1); +assert.sameValue(log, + "next," + + "set:a=1," + + "next," + + "set:r=[],"); + +reset(); +[obj.a, ...obj.r] = createIterable(2); +assert.sameValue(log, + "next," + + "set:a=1," + + "next," + + "next," + + "set:r=[2],"); + +reset(); +[obj.a, obj.b, ...obj.r] = createIterable(0); +assert.sameValue(log, + "next," + + "set:a=undefined," + + "set:b=undefined," + + "set:r=[],"); + +reset(); +[obj.a, obj.b, ...obj.r] = createIterable(1); +assert.sameValue(log, + "next," + + "set:a=1," + + "next," + + "set:b=undefined," + + "set:r=[],"); + +reset(); +[obj.a, obj.b, ...obj.r] = createIterable(2); +assert.sameValue(log, + "next," + + "set:a=1," + + "next," + + "set:b=2," + + "next," + + "set:r=[],"); + +reset(); +[obj.a, obj.b, ...obj.r] = createIterable(3); +assert.sameValue(log, + "next," + + "set:a=1," + + "next," + + "set:b=2," + + "next," + + "next," + + "set:r=[3],"); + +// Rest and elision. + +reset(); +[, ...obj.r] = createIterable(0); +assert.sameValue(log, + "next," + + "set:r=[],"); + +reset(); +[, ...obj.r] = createIterable(1); +assert.sameValue(log, + "next," + + "next," + + "set:r=[],"); + +reset(); +[, ...obj.r] = createIterable(2); +assert.sameValue(log, + "next," + + "next," + + "next," + + "set:r=[2],"); + +reset(); +[obj.a, obj.b, , ...obj.r] = createIterable(0); +assert.sameValue(log, + "next," + + "set:a=undefined," + + "set:b=undefined," + + "set:r=[],"); + +reset(); +[obj.a, obj.b, , ...obj.r] = createIterable(1); +assert.sameValue(log, + "next," + + "set:a=1," + + "next," + + "set:b=undefined," + + "set:r=[],"); + +reset(); +[obj.a, obj.b, , ...obj.r] = createIterable(2); +assert.sameValue(log, + "next," + + "set:a=1," + + "next," + + "set:b=2," + + "next," + + "set:r=[],"); + +reset(); +[obj.a, obj.b, , ...obj.r] = createIterable(3); +assert.sameValue(log, + "next," + + "set:a=1," + + "next," + + "set:b=2," + + "next," + + "next," + + "set:r=[],"); + +reset(); +[obj.a, obj.b, , ...obj.r] = createIterable(4); +assert.sameValue(log, + "next," + + "set:a=1," + + "next," + + "set:b=2," + + "next," + + "next," + + "next," + + "set:r=[4],"); + diff --git a/test/staging/sm/expressions/destructuring-array-lexical.js b/test/staging/sm/expressions/destructuring-array-lexical.js new file mode 100644 index 0000000000..fca645039f --- /dev/null +++ b/test/staging/sm/expressions/destructuring-array-lexical.js @@ -0,0 +1,21 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-expressions-shell.js, sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +var BUGNUMBER = 1184922; +var summary = "Array destructuring with accessing uninitialized lexical binding."; + +print(BUGNUMBER + ": " + summary); + +assertThrowsInstanceOf(() => { let y = [y] = []; }, + ReferenceError); +assertThrowsInstanceOf(() => { let y = [y] = [,]; }, + ReferenceError); + diff --git a/test/staging/sm/expressions/destructuring-object-__proto__-1.js b/test/staging/sm/expressions/destructuring-object-__proto__-1.js new file mode 100644 index 0000000000..fc0f4ae74e --- /dev/null +++ b/test/staging/sm/expressions/destructuring-object-__proto__-1.js @@ -0,0 +1,91 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-expressions-shell.js, sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +// Test __proto__ is destructuring binding initialization. + +// __proto__ shorthand, no default. +{ + let {__proto__} = {}; + assert.sameValue(__proto__, Object.prototype); +} + +// __proto__ shorthand, with default. +{ + let {__proto__ = 0} = {}; + assert.sameValue(__proto__, Object.prototype); +} + +{ + let {__proto__ = 0} = Object.create(null); + assert.sameValue(__proto__, 0); +} + +// __proto__ keyed, no default. +{ + let {__proto__: p} = {}; + assert.sameValue(p, Object.prototype); +} + +// __proto__ keyed, with default. +{ + let {__proto__: p = 0} = {}; + assert.sameValue(p, Object.prototype); +} + +// __proto__ keyed, with default. +{ + let {__proto__: p = 0} = Object.create(null); + assert.sameValue(p, 0); +} + +// Repeat the cases from above, but this time with a rest property. + +// __proto__ shorthand, no default. +{ + let {__proto__, ...rest} = {}; + assert.sameValue(__proto__, Object.prototype); + assert.sameValue(Reflect.ownKeys(rest).length, 0); +} + +// __proto__ shorthand, with default. +{ + let {__proto__ = 0, ...rest} = {}; + assert.sameValue(__proto__, Object.prototype); + assert.sameValue(Reflect.ownKeys(rest).length, 0); +} + +{ + let {__proto__ = 0, ...rest} = Object.create(null); + assert.sameValue(__proto__, 0); + assert.sameValue(Reflect.ownKeys(rest).length, 0); +} + +// __proto__ keyed, no default. +{ + let {__proto__: p, ...rest} = {}; + assert.sameValue(p, Object.prototype); + assert.sameValue(Reflect.ownKeys(rest).length, 0); +} + +// __proto__ keyed, with default. +{ + let {__proto__: p = 0, ...rest} = {}; + assert.sameValue(p, Object.prototype); + assert.sameValue(Reflect.ownKeys(rest).length, 0); +} + +// __proto__ keyed, with default. +{ + let {__proto__: p = 0, ...rest} = Object.create(null); + assert.sameValue(p, 0); + assert.sameValue(Reflect.ownKeys(rest).length, 0); +} + diff --git a/test/staging/sm/expressions/destructuring-object-__proto__-2.js b/test/staging/sm/expressions/destructuring-object-__proto__-2.js new file mode 100644 index 0000000000..394b3ad123 --- /dev/null +++ b/test/staging/sm/expressions/destructuring-object-__proto__-2.js @@ -0,0 +1,103 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-expressions-shell.js, sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +// Test __proto__ is destructuring assignment. + +// __proto__ shorthand, no default. +{ + let __proto__; + ({__proto__} = {}); + assert.sameValue(__proto__, Object.prototype); +} + +// __proto__ shorthand, with default. +{ + let __proto__; + ({__proto__ = 0} = {}); + assert.sameValue(__proto__, Object.prototype); +} + +{ + let __proto__; + ({__proto__ = 0} = Object.create(null)); + assert.sameValue(__proto__, 0); +} + +// __proto__ keyed, no default. +{ + let p; + ({__proto__: p} = {}); + assert.sameValue(p, Object.prototype); +} + +// __proto__ keyed, with default. +{ + let p; + ({__proto__: p = 0} = {}); + assert.sameValue(p, Object.prototype); +} + +// __proto__ keyed, with default. +{ + let p; + ({__proto__: p = 0} = Object.create(null)); + assert.sameValue(p, 0); +} + +// Repeat the cases from above, but this time with a rest property. + +// __proto__ shorthand, no default. +{ + let __proto__, rest; + ({__proto__, ...rest} = {}); + assert.sameValue(__proto__, Object.prototype); + assert.sameValue(Reflect.ownKeys(rest).length, 0); +} + +// __proto__ shorthand, with default. +{ + let __proto__, rest; + ({__proto__ = 0, ...rest} = {}); + assert.sameValue(__proto__, Object.prototype); + assert.sameValue(Reflect.ownKeys(rest).length, 0); +} + +{ + let __proto__, rest; + ({__proto__ = 0, ...rest} = Object.create(null)); + assert.sameValue(__proto__, 0); + assert.sameValue(Reflect.ownKeys(rest).length, 0); +} + +// __proto__ keyed, no default. +{ + let p, rest; + ({__proto__: p, ...rest} = {}); + assert.sameValue(p, Object.prototype); + assert.sameValue(Reflect.ownKeys(rest).length, 0); +} + +// __proto__ keyed, with default. +{ + let p, rest; + ({__proto__: p = 0, ...rest} = {}); + assert.sameValue(p, Object.prototype); + assert.sameValue(Reflect.ownKeys(rest).length, 0); +} + +// __proto__ keyed, with default. +{ + let p, rest; + ({__proto__: p = 0, ...rest} = Object.create(null)); + assert.sameValue(p, 0); + assert.sameValue(Reflect.ownKeys(rest).length, 0); +} + diff --git a/test/staging/sm/expressions/destructuring-pattern-parenthesized.js b/test/staging/sm/expressions/destructuring-pattern-parenthesized.js new file mode 100644 index 0000000000..45e3b757e5 --- /dev/null +++ b/test/staging/sm/expressions/destructuring-pattern-parenthesized.js @@ -0,0 +1,144 @@ +/* + * Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/licenses/publicdomain/ + */ + +/*--- +includes: [sm/non262-expressions-shell.js, sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +//----------------------------------------------------------------------------- +var BUGNUMBER = 1146136; +var summary = + 'Parenthesized "destructuring patterns" are not usable as destructuring ' + + 'patterns'; + +print(BUGNUMBER + ": " + summary); + +/************** + * BEGIN TEST * + **************/ + +// Don't pollute the top-level script with eval references. +var savedEval = this[String.fromCharCode(101, 118, 97, 108)]; + +function checkError(code, nonstrictErr, strictErr) +{ + function helper(exec, prefix, err) + { + var fullCode = prefix + code; + try + { + var f = exec(fullCode); + + var error = + "no early error, parsed code <" + fullCode + "> using " + exec.name; + if (typeof f === "function") + { + try + { + f(); + error += ", and the function can be called without error"; + } + catch (e) + { + error +=", and calling the function throws " + e; + } + } + + throw new Error(error); + } + catch (e) + { + assert.sameValue(e instanceof err, true, + "expected " + err.name + ", got " + e + " " + + "for code <" + fullCode + "> when parsed using " + exec.name); + } + } + + helper(Function, "", nonstrictErr); + helper(Function, "'use strict'; ", strictErr); + helper(savedEval, "", nonstrictErr); + helper(savedEval, "'use strict'; ", strictErr); +} + +// Parenthesized destructuring patterns don't trigger grammar refinement, so we +// get the usual SyntaxError for an invalid assignment target, per +// 12.14.1 second bullet. +checkError("var a, b; ([a, b]) = [1, 2];", SyntaxError, SyntaxError); +checkError("var a, b; ({a, b}) = { a: 1, b: 2 };", SyntaxError, SyntaxError); + +// *Nested* parenthesized destructuring patterns, on the other hand, do trigger +// grammar refinement. But subtargets in a destructuring pattern must be +// either object/array literals that match the destructuring pattern refinement +// *or* valid simple assignment targets (or such things with a default, with the +// entire subtarget unparenthesized: |a = 3| is fine, |(a) = 3| is fine for +// destructuring in an expression, |(a = 3)| is forbidden). Parenthesized +// object/array patterns are neither. And so 12.14.5.1 third bullet requires an +// early SyntaxError. +checkError("var a, b; ({ a: ({ b: b }) } = { a: { b: 42 } });", SyntaxError, SyntaxError); +checkError("var a, b; ({ a: { b: (b = 7) } } = { a: {} });", SyntaxError, SyntaxError); +checkError("var a, b; ({ a: ([b]) } = { a: [42] });", SyntaxError, SyntaxError); +checkError("var a, b; [(a = 5)] = [1];", SyntaxError, SyntaxError); +checkError("var a, b; ({ a: (b = 7)} = { b: 1 });", SyntaxError, SyntaxError); + +Function("var a, b; [(a), b] = [1, 2];")(); +Function("var a, b; [(a) = 5, b] = [1, 2];")(); +Function("var a, b; [(arguments), b] = [1, 2];")(); +Function("var a, b; [(arguments) = 5, b] = [1, 2];")(); +Function("var a, b; [(eval), b] = [1, 2];")(); +Function("var a, b; [(eval) = 5, b] = [1, 2];")(); + +var repair = {}, demolition = {}; + +Function("var a, b; [(repair.man), b] = [1, 2];")(); +Function("var a, b; [(demolition['man']) = 'motel', b] = [1, 2];")(); +Function("var a, b; [(demolition['man' + {}]) = 'motel', b] = [1, 2];")(); // evade constant-folding + +function classesEnabled() +{ + try + { + new Function("class B { constructor() { } }; class D extends B { constructor() { super(); } }"); + return true; + } + catch (e) { + if (!(e instanceof SyntaxError)) + throw e; + return false; + } +} + +if (classesEnabled()) +{ + Function("var a, b; var obj = { x() { [(super.man), b] = [1, 2]; } };")(); + Function("var a, b; var obj = { x() { [(super[8]) = 'motel', b] = [1, 2]; } };")(); + Function("var a, b; var obj = { x() { [(super[8 + {}]) = 'motel', b] = [1, 2]; } };")(); // evade constant-folding +} + +// As noted above, when the assignment element has an initializer, the +// assignment element must not be parenthesized. +checkError("var a, b; [(repair.man = 17)] = [1];", SyntaxError, SyntaxError); +checkError("var a, b; [(demolition['man'] = 'motel')] = [1, 2];", SyntaxError, SyntaxError); +checkError("var a, b; [(demolition['man' + {}] = 'motel')] = [1];", SyntaxError, SyntaxError); // evade constant-folding +if (classesEnabled()) +{ + checkError("var a, b; var obj = { x() { [(super.man = 5)] = [1]; } };", SyntaxError, SyntaxError); + checkError("var a, b; var obj = { x() { [(super[8] = 'motel')] = [1]; } };", SyntaxError, SyntaxError); + checkError("var a, b; var obj = { x() { [(super[8 + {}] = 'motel')] = [1]; } };", SyntaxError, SyntaxError); // evade constant-folding +} + +checkError("var a, b; [f() = 'ohai', b] = [1, 2];", SyntaxError, SyntaxError); +checkError("var a, b; [(f()) = 'kthxbai', b] = [1, 2];", SyntaxError, SyntaxError); + +Function("var a, b; ({ a: (a), b} = { a: 1, b: 2 });")(); +Function("var a, b; ({ a: (a) = 5, b} = { a: 1, b: 2 });")(); + + +/******************************************************************************/ + +print("Tests complete"); diff --git a/test/staging/sm/expressions/exponentiation-unparenthesised-unary.js b/test/staging/sm/expressions/exponentiation-unparenthesised-unary.js new file mode 100644 index 0000000000..66a19466cc --- /dev/null +++ b/test/staging/sm/expressions/exponentiation-unparenthesised-unary.js @@ -0,0 +1,115 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-expressions-shell.js, sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +const AsyncFunction = async function(){}.constructor; + +function assertNoError(f, msg) { + try { + f(); + } catch (e) { + assert.sameValue(true, false, `${msg}: ${e}`); + } +} + +function assertSyntaxError(code) { + assertThrowsInstanceOf(function () { Function(code); }, SyntaxError, "Function:" + code); + assertThrowsInstanceOf(function () { AsyncFunction(code); }, SyntaxError, "AsyncFunction:" + code); +} + +function assertNoSyntaxError(code) { + assertNoError(function () { Function(code); }, "Function:" + code); + assertNoError(function () { AsyncFunction(code); }, "AsyncFunction:" + code); +} + +function assertNoSyntaxErrorAsyncContext(code) { + assertNoError(function () { AsyncFunction(code); }, "AsyncFunction:" + code); +} + +const invalidTestCases = [ + // UnaryExpression : delete UnaryExpression + // + // Test all possible `delete` expression kinds. + "delete a ** 0", + "delete a.prop ** 0", + "delete a[0] ** 0", + "delete a?.prop ** 0", + "delete 0 ** 0", + + // UnaryExpression : void UnaryExpression + "void a ** 0", + + // UnaryExpression : typeof UnaryExpression + // + // Test all possible `typeof` expression kinds. + "typeof a ** 0", + "typeof 0 ** 0", + + // UnaryExpression : + UnaryExpression + "+a ** 0", + + // UnaryExpression : - UnaryExpression + "-a ** 0", + + // UnaryExpression : ~ UnaryExpression + "~a ** 0", + + // UnaryExpression : ! UnaryExpression + "!a ** 0", + + // UnaryExpression : AwaitExpression + "await a ** 0", +]; + +for (let source of invalidTestCases) { + assertSyntaxError(source); +} + +const validTestCases = [ + // UnaryExpression : delete UnaryExpression + "(delete a) ** 0", + "(delete a.prop) ** 0", + "(delete a[0]) ** 0", + "(delete a?.prop) ** 0", + "(delete 0) ** 0", + + // UnaryExpression : void UnaryExpression + "(void a) ** 0", + + // UnaryExpression : typeof UnaryExpression + "(typeof a) ** 0", + "(typeof 0) ** 0", + + // UnaryExpression : + UnaryExpression + "(+a) ** 0", + + // UnaryExpression : - UnaryExpression + "(-a) ** 0", + + // UnaryExpression : ~ UnaryExpression + "(~a) ** 0", + + // UnaryExpression : ! UnaryExpression + "(!a) ** 0", +]; + +for (let source of validTestCases) { + assertNoSyntaxError(source); +} + +const validTestCasesAsync = [ + // UnaryExpression : AwaitExpression + "(await a) ** 0", +]; + +for (let source of validTestCasesAsync) { + assertNoSyntaxErrorAsyncContext(source); +} + diff --git a/test/staging/sm/expressions/inNotObjectError.js b/test/staging/sm/expressions/inNotObjectError.js new file mode 100644 index 0000000000..fc1b733b67 --- /dev/null +++ b/test/staging/sm/expressions/inNotObjectError.js @@ -0,0 +1,54 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-expressions-shell.js, sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +var BUGNUMBER = 1352429; +var summary = 'Error message should provide enough infomation for use of in operator'; + +print(BUGNUMBER + ": " + summary); + +function checkErr(substr, str, messageSubstr, messageStr) { + assertThrowsInstanceOfWithMessageCheck( + () => substr in str, + TypeError, + message => + message.includes(messageSubstr) && + message.includes(messageStr) && + message.length < 100, + `"${substr}" in "${str}"` + ); +} + +// These test cases check if long string is omitted properly. +checkErr('subString', 'base', 'subString', 'base'); +checkErr('this is subString', 'base', 'this is subStrin...', 'base'); +checkErr('subString', 'this is baseString', 'subString', 'this is baseStri...'); +checkErr('this is subString', 'this is base', 'this is subStrin...', 'this is base'); +checkErr('HEAD' + 'subString'.repeat(30000), 'HEAD' + 'base'.repeat(30000), 'HEADsubStringsub...', 'HEADbasebasebase...'); + +// These test cases check if it does not crash and throws appropriate error. +assertThrowsInstanceOf(() => { 1 in 'hello' }, TypeError); +assertThrowsInstanceOf(() => { 'hello' in 1 }, TypeError); +assertThrowsInstanceOf(() => { 'hello' in null }, TypeError); +assertThrowsInstanceOf(() => { null in 'hello' }, TypeError); +assertThrowsInstanceOf(() => { null in null }, TypeError); +assertThrowsInstanceOf(() => { 'hello' in true }, TypeError); +assertThrowsInstanceOf(() => { false in 1.1 }, TypeError); +assertThrowsInstanceOf(() => { Symbol.iterator in undefined }, TypeError); +assertThrowsInstanceOf(() => { [] in undefined }, TypeError); +assertThrowsInstanceOf(() => { /a/ in 'hello' }, TypeError); +var str = 'hello'; +assertThrowsInstanceOf(() => { str in 'hello' }, TypeError); +class A {}; +assertThrowsInstanceOf(() => { new A() in undefined }, TypeError); +var a = new A(); +a.b = 1.1; +assertThrowsInstanceOf(() => { a.b in 1.1 }, TypeError); + diff --git a/test/staging/sm/expressions/named-accessor-function.js b/test/staging/sm/expressions/named-accessor-function.js new file mode 100644 index 0000000000..10519efd18 --- /dev/null +++ b/test/staging/sm/expressions/named-accessor-function.js @@ -0,0 +1,59 @@ +/* + * Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/licenses/publicdomain/ + */ + +/*--- +includes: [sm/non262-expressions-shell.js, sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +// Contributor: +// Jeff Walden + +//----------------------------------------------------------------------------- +var BUGNUMBER = 999999; +var summary = '{ get x y() { } } is not valid getter syntax'; + +print(BUGNUMBER + ": " + summary); + +var BAD_CODE = ["({ get x y() { } })", "({ set x y(v) { } })"]; + +for (var i = 0, sz = BAD_CODE.length; i < sz; i++) +{ + var code = BAD_CODE[i]; + + var err = "no exception"; + try + { + eval(code); + } + catch (e) + { + err = e; + } + if (!(err instanceof SyntaxError)) + { + assert.sameValue(true, false, + "bad or no exception thrown for eval(" + code + "): " + err); + } + + err = "no exception"; + try + { + new Function(code); + } + catch (e) + { + err = e; + } + if (!(err instanceof SyntaxError)) + { + assert.sameValue(true, false, + "bad or no exception thrown for Function(" + code + "): " + err); + } +} + diff --git a/test/staging/sm/expressions/nested-delete-name-in-evalcode.js b/test/staging/sm/expressions/nested-delete-name-in-evalcode.js new file mode 100644 index 0000000000..af6917ec9f --- /dev/null +++ b/test/staging/sm/expressions/nested-delete-name-in-evalcode.js @@ -0,0 +1,170 @@ +/* + * Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/licenses/publicdomain/ + */ + +/*--- +includes: [sm/non262-expressions-shell.js, sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +//----------------------------------------------------------------------------- +var BUGNUMBER = 616294; +var summary = + "|delete x| inside a function in eval code, where that eval code includes " + + "|var x| at top level, actually does delete the binding for x"; + +print(BUGNUMBER + ": " + summary); + +/************** + * BEGIN TEST * + **************/ + +var f; + +function testOuterVar() +{ + return eval("var x; (function() { return delete x; })"); +} + +f = testOuterVar(); + +assert.sameValue(f(), true); // configurable, so remove => true +assert.sameValue(f(), true); // not there => true (only non-configurable => false) + + +function testOuterFunction() +{ + return eval("function x() { } (function() { return delete x; })"); +} + +f = testOuterFunction(); + +assert.sameValue(f(), true); // configurable, so remove => true +assert.sameValue(f(), true); // not there => true (only non-configurable => false) + + +function testOuterForVar() +{ + return eval("for (var x; false; ); (function() { return delete x; })"); +} + +f = testOuterForVar(); + +assert.sameValue(f(), true); // configurable, so remove => true +assert.sameValue(f(), true); // not there => true (only non-configurable => false) + + +function testOuterForInVar() +{ + return eval("for (var x in {}); (function() { return delete x; })"); +} + +f = testOuterForInVar(); + +assert.sameValue(f(), true); // configurable, so remove => true +assert.sameValue(f(), true); // not there => true (only non-configurable => false) + + +function testOuterNestedVar() +{ + return eval("for (var q = 0; q < 5; q++) { var x; } (function() { return delete x; })"); +} + +f = testOuterNestedVar(); + +assert.sameValue(f(), true); // configurable, so remove => true +assert.sameValue(f(), true); // not there => true (only non-configurable => false) + + +function testOuterNestedConditionalVar() +{ + return eval("for (var q = 0; q < 5; q++) { if (false) { var x; } } (function() { return delete x; })"); +} + +f = testOuterNestedConditionalVar(); + +assert.sameValue(f(), true); // configurable, so remove => true +assert.sameValue(f(), true); // not there => true (only non-configurable => false) + + +function testVarInWith() +{ + return eval("with ({}) { var x; } (function() { return delete x; })"); +} + +f = testVarInWith(); + +assert.sameValue(f(), true); // configurable, so remove => true +assert.sameValue(f(), true); // not there => true (only non-configurable => false) + + +function testForVarInWith() +{ + return eval("with ({}) { for (var x = 0; x < 5; x++); } (function() { return delete x; })"); +} + +f = testForVarInWith(); + +assert.sameValue(f(), true); // configurable, so remove => true +assert.sameValue(f(), true); // not there => true (only non-configurable => false) + + +function testForInVarInWith() +{ + return eval("with ({}) { for (var x in {}); } (function() { return delete x; })"); +} + +f = testForInVarInWith(); + +assert.sameValue(f(), true); // configurable, so remove => true +assert.sameValue(f(), true); // not there => true (only non-configurable => false) + + +function testUnknown() +{ + return eval("nameToDelete = 17; (function() { return delete nameToDelete; })"); +} + +f = testUnknown(); + +assert.sameValue(f(), true); // configurable global property, so remove => true +assert.sameValue(f(), true); // not there => true (only non-configurable => false) + + +function testArgumentShadow() +{ + return eval("var x; (function(x) { return delete x; })"); +} + +f = testArgumentShadow(); + +assert.sameValue(f(), false); // non-configurable argument => false + + +function testArgument() +{ + return eval("(function(x) { return delete x; })"); +} + +f = testArgument(); + +assert.sameValue(f(), false); // non-configurable argument => false + + +function testFunctionLocal() +{ + return eval("(function() { var x; return delete x; })"); +} + +f = testFunctionLocal(); + +assert.sameValue(f(), false); // defined by function code => not configurable => false + + +/******************************************************************************/ + +print("All tests passed!"); diff --git a/test/staging/sm/expressions/nullish-coalescing.js b/test/staging/sm/expressions/nullish-coalescing.js new file mode 100644 index 0000000000..d52238631b --- /dev/null +++ b/test/staging/sm/expressions/nullish-coalescing.js @@ -0,0 +1,122 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +features: +- IsHTMLDDA +includes: [sm/non262-expressions-shell.js, sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +var BUGNUMBER = 1566141; +var summary = "Implement the Nullish Coalescing operator (??) proposal"; + +print(BUGNUMBER + ": " + summary); + +// These tests are originally from webkit. +// webkit specifics have been removed and a test for `document.all` has +// been added. +function shouldBe(actual, expected) { + if (actual !== expected) + throw new Error(`expected ${expected} but got ${actual}`); +} + +function shouldNotThrow(script) { + eval(script); +} + +function shouldThrowSyntaxError(script) { + let error; + try { + eval(script); + } catch (e) { + error = e; + } + + if (!(error instanceof SyntaxError)) + throw new Error('Expected SyntaxError!'); +} + +function testBasicCases() { + shouldBe(undefined ?? 3, 3); + shouldBe(null ?? 3, 3); + shouldBe(true ?? 3, true); + shouldBe(false ?? 3, false); + shouldBe(0 ?? 3, 0); + shouldBe(1 ?? 3, 1); + shouldBe('' ?? 3, ''); + shouldBe('hi' ?? 3, 'hi'); + shouldBe(({} ?? 3) instanceof Object, true); + shouldBe(({ x: 'hi' } ?? 3).x, 'hi'); + shouldBe(([] ?? 3) instanceof Array, true); + shouldBe((['hi'] ?? 3)[0], 'hi'); + // test document.all, which has odd behavior + shouldBe(typeof(createIsHTMLDDA() ?? 3), "undefined"); +} + +for (let i = 0; i < 1e5; i++) + testBasicCases(); + +shouldBe(1 | null ?? 3, 1); +shouldBe(1 ^ null ?? 3, 1); +shouldBe(1 & null ?? 3, 0); +shouldBe(3 == null ?? 3, false); +shouldBe(3 != null ?? 3, true); +shouldBe(3 === null ?? 3, false); +shouldBe(3 !== null ?? 3, true); +shouldBe(1 < null ?? 3, false); +shouldBe(1 > null ?? 3, true); +shouldBe(1 <= null ?? 3, false); +shouldBe(1 >= null ?? 3, true); +shouldBe(1 << null ?? 3, 1); +shouldBe(1 >> null ?? 3, 1); +shouldBe(1 >>> null ?? 3, 1); +shouldBe(1 + null ?? 3, 1); +shouldBe(1 - null ?? 3, 1); +shouldBe(1 * null ?? 3, 0); +shouldBe(1 / null ?? 3, Infinity); +shouldBe(isNaN(1 % null ?? 3), true); +shouldBe(1 ** null ?? 3, 1); +shouldBe((void 0) ?? 3, 3); + +const obj = { + count: 0, + get x() { this.count++; return 'x'; } +}; +false ?? obj.x; +shouldBe(obj.count, 0); +null ?? obj.x; +shouldBe(obj.count, 1); +obj.x ?? obj.x; +shouldBe(obj.count, 2); + +shouldThrowSyntaxError('0 || 1 ?? 2'); +shouldThrowSyntaxError('0 && 1 ?? 2'); +shouldThrowSyntaxError('0 ?? 1 || 2'); +shouldThrowSyntaxError('0 ?? 1 && 2'); +shouldNotThrow('(0 || 1) ?? 2'); +shouldNotThrow('0 || (1 ?? 2)'); +shouldNotThrow('(0 && 1) ?? 2'); +shouldNotThrow('0 && (1 ?? 2)'); +shouldNotThrow('(0 ?? 1) || 2'); +shouldNotThrow('0 ?? (1 || 2)'); +shouldNotThrow('(0 ?? 1) && 2'); +shouldNotThrow('0 ?? (1 && 2)'); + +shouldNotThrow('0 || 1 && 2 | 3 ^ 4 & 5 == 6 != 7 === 8 !== 9 < 0 > 1 <= 2 >= 3 << 4 >> 5 >>> 6 + 7 - 8 * 9 / 0 % 1 ** 2'); +shouldThrowSyntaxError('0 || 1 && 2 | 3 ^ 4 & 5 == 6 != 7 === 8 !== 9 < 0 > 1 <= 2 >= 3 << 4 >> 5 >>> 6 + 7 - 8 * 9 / 0 % 1 ** 2 ?? 3'); +shouldThrowSyntaxError('3 ?? 2 ** 1 % 0 / 9 * 8 - 7 + 6 >>> 5 >> 4 << 3 >= 2 <= 1 > 0 < 9 !== 8 === 7 != 6 == 5 & 4 ^ 3 | 2 && 1 || 0'); + +shouldBe(null?.x ?? 3, 3); +shouldBe(({})?.x ?? 3, 3); +shouldBe(({ x: 0 })?.x ?? 3, 0); +shouldBe(null?.() ?? 3, 3); +shouldBe((() => 0)?.() ?? 3, 0); +shouldBe(({ x: 0 })?.[null?.a ?? 'x'] ?? 3, 0); +shouldBe((() => 0)?.(null?.a ?? 'x') ?? 3, 0); + +print("Tests complete"); + diff --git a/test/staging/sm/expressions/object-literal-__proto__.js b/test/staging/sm/expressions/object-literal-__proto__.js new file mode 100644 index 0000000000..97fc6e4211 --- /dev/null +++ b/test/staging/sm/expressions/object-literal-__proto__.js @@ -0,0 +1,274 @@ +/* + * Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/licenses/publicdomain/ + */ + +/*--- +includes: [sm/non262-expressions-shell.js, sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +//----------------------------------------------------------------------------- +var BUGNUMBER = 1061853; +var summary = + "__proto__ in object literals in non-__proto__:v contexts doesn't modify " + + "[[Prototype]]"; + +print(BUGNUMBER + ": " + summary); + +/************** + * BEGIN TEST * + **************/ + +function hasOwn(obj, prop) +{ + return Object.getOwnPropertyDescriptor(obj, prop) !== undefined; +} + +var objectStart = "{ "; +var objectEnd = " }"; + +var members = + { + nullProto: "__proto__: null", + functionProtoProto: "__proto__: Function.prototype", + computedNull: "['__proto__']: null", + method: "__proto__() {}", + computedMethod: "['__proto__']() {}", + generatorMethod: "*__proto__() {}", + computedGenerator: "*['__proto__']() {}", + shorthand: "__proto__", + getter: "get __proto__() { return 42; }", + getterComputed: "get ['__proto__']() { return 42; }", + setter: "set __proto__(v) { }", + setterComputed: "set ['__proto__'](v) { }", + }; + +function isProtoMutation(key) +{ + return key === "nullProto" || key === "functionProtoProto"; +} + +function isGetter(key) +{ + return key === "getter" || key === "getterComputed"; +} + +function isSetter(key) +{ + return key === "setter" || key === "setterComputed"; +} + +function isData(key) +{ + return !isProtoMutation(key) && !isGetter(key) && !isSetter(key); +} + +var __proto__ = "string value"; + +function typeOfProto(key) +{ + if (key === "computedNull") + return "object"; + if (key === "method" || key === "computedMethod" || + key === "computedGenerator" || key === "generatorMethod") + { + return "function"; + } + if (key === "getter" || key === "getterComputed") + return "number"; + assert.sameValue(key, "shorthand", "bug in test!"); + return "string"; +} + +for (var first in members) +{ + var fcode = "return " + objectStart + members[first] + objectEnd; + var f = Function(fcode); + var oneProp = f(); + + if (first === "nullProto") + { + assert.sameValue(Object.getPrototypeOf(oneProp), null); + assert.sameValue(hasOwn(oneProp, "__proto__"), false); + } + else if (first === "functionProtoProto") + { + assert.sameValue(Object.getPrototypeOf(oneProp), Function.prototype); + assert.sameValue(hasOwn(oneProp, "__proto__"), false); + } + else if (isSetter(first)) + { + assert.sameValue(Object.getPrototypeOf(oneProp), Object.prototype); + assert.sameValue(hasOwn(oneProp, "__proto__"), true); + assert.sameValue(typeof Object.getOwnPropertyDescriptor(oneProp, "__proto__").set, + "function"); + } + else + { + assert.sameValue(Object.getPrototypeOf(oneProp), Object.prototype); + assert.sameValue(hasOwn(oneProp, "__proto__"), true); + assert.sameValue(typeof oneProp.__proto__, typeOfProto(first)); + } + + for (var second in members) + { + try + { + var gcode = "return " + objectStart + members[first] + ", " + + members[second] + objectEnd; + var g = Function(gcode); + } + catch (e) + { + assert.sameValue(e instanceof SyntaxError, true, + "__proto__ member conflicts should be syntax errors, got " + e); + assert.sameValue(+(first === "nullProto" || first === "functionProtoProto") + + +(second === "nullProto" || second === "functionProtoProto") > 1, + true, + "unexpected conflict between members: " + first + ", " + second); + continue; + } + + var twoProps = g(); + + if (first === "nullProto" || second === "nullProto") + assert.sameValue(Object.getPrototypeOf(twoProps), null); + else if (first === "functionProtoProto" || second === "functionProtoProto") + assert.sameValue(Object.getPrototypeOf(twoProps), Function.prototype); + else + assert.sameValue(Object.getPrototypeOf(twoProps), Object.prototype); + + if (isSetter(second)) + { + assert.sameValue(hasOwn(twoProps, "__proto__"), true); + assert.sameValue(typeof Object.getOwnPropertyDescriptor(twoProps, "__proto__").get, + isGetter(first) ? "function" : "undefined"); + } + else if (!isProtoMutation(second)) + { + assert.sameValue(hasOwn(twoProps, "__proto__"), true); + assert.sameValue(typeof twoProps.__proto__, typeOfProto(second)); + if (isGetter(second)) + { + assert.sameValue(typeof Object.getOwnPropertyDescriptor(twoProps, "__proto__").get, + "function"); + assert.sameValue(typeof Object.getOwnPropertyDescriptor(twoProps, "__proto__").set, + isSetter(first) ? "function" : "undefined"); + } + } + else if (isSetter(first)) + { + assert.sameValue(hasOwn(twoProps, "__proto__"), true); + assert.sameValue(typeof Object.getOwnPropertyDescriptor(twoProps, "__proto__").set, + "function"); + assert.sameValue(typeof Object.getOwnPropertyDescriptor(twoProps, "__proto__").get, + "undefined"); + } + else if (!isProtoMutation(first)) + { + assert.sameValue(hasOwn(twoProps, "__proto__"), true); + assert.sameValue(typeof twoProps.__proto__, typeOfProto(first)); + } + else + { + assert.sameValue(true, false, "should be unreachable: " + first + ", " + second); + } + + for (var third in members) + { + try + { + var hcode = "return " + objectStart + members[first] + ", " + + members[second] + ", " + + members[third] + objectEnd; + var h = Function(hcode); + } + catch (e) + { + assert.sameValue(e instanceof SyntaxError, true, + "__proto__ member conflicts should be syntax errors, got " + e); + assert.sameValue(+(first === "nullProto" || first === "functionProtoProto") + + +(second === "nullProto" || second === "functionProtoProto") + + +(third === "nullProto" || third === "functionProtoProto") > 1, + true, + "unexpected conflict among members: " + + first + ", " + second + ", " + third); + continue; + } + + var threeProps = h(); + + if (first === "nullProto" || second === "nullProto" || + third === "nullProto") + { + assert.sameValue(Object.getPrototypeOf(threeProps), null); + } + else if (first === "functionProtoProto" || + second === "functionProtoProto" || + third === "functionProtoProto") + { + assert.sameValue(Object.getPrototypeOf(threeProps), Function.prototype); + } + else + { + assert.sameValue(Object.getPrototypeOf(threeProps), Object.prototype); + } + + if (isSetter(third)) + { + assert.sameValue(hasOwn(threeProps, "__proto__"), true); + assert.sameValue(typeof Object.getOwnPropertyDescriptor(threeProps, "__proto__").get, + isGetter(second) || (!isData(second) && isGetter(first)) + ? "function" + : "undefined", + "\n" + hcode); + } + else if (!isProtoMutation(third)) + { + assert.sameValue(hasOwn(threeProps, "__proto__"), true); + assert.sameValue(typeof threeProps.__proto__, typeOfProto(third), first + ", " + second + ", " + third); + if (isGetter(third)) + { + var desc = Object.getOwnPropertyDescriptor(threeProps, "__proto__"); + assert.sameValue(typeof desc.get, "function"); + assert.sameValue(typeof desc.set, + isSetter(second) || (!isData(second) && isSetter(first)) + ? "function" + : "undefined"); + } + } + else if (isSetter(second)) + { + assert.sameValue(hasOwn(threeProps, "__proto__"), true); + assert.sameValue(typeof Object.getOwnPropertyDescriptor(threeProps, "__proto__").get, + isGetter(first) ? "function" : "undefined"); + } + else if (!isProtoMutation(second)) + { + assert.sameValue(hasOwn(threeProps, "__proto__"), true); + assert.sameValue(typeof threeProps.__proto__, typeOfProto(second)); + if (isGetter(second)) + { + var desc = Object.getOwnPropertyDescriptor(threeProps, "__proto__"); + assert.sameValue(typeof desc.get, "function"); + assert.sameValue(typeof desc.set, + isSetter(first) ? "function" : "undefined"); + } + } + else + { + assert.sameValue(true, false, + "should be unreachable: " + + first + ", " + second + ", " + third); + } + } + } +} + +/******************************************************************************/ + +print("Tests complete"); diff --git a/test/staging/sm/expressions/object-literal-accessor-arguments.js b/test/staging/sm/expressions/object-literal-accessor-arguments.js new file mode 100644 index 0000000000..0c70f572fc --- /dev/null +++ b/test/staging/sm/expressions/object-literal-accessor-arguments.js @@ -0,0 +1,51 @@ +/* + * Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/licenses/publicdomain/ + */ + +/*--- +includes: [sm/non262-expressions-shell.js, sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +var gTestfile = 'object-literal-accessor-arguments.js'; +//----------------------------------------------------------------------------- +var BUGNUMBER = 536472; +var summary = + 'ES5: { get x(v) { } } and { set x(v, v2) { } } should be syntax errors'; + +print(BUGNUMBER + ": " + summary); + +//----------------------------------------------------------------------------- + +function expectSyntaxError(s) +{ + try + { + eval(s); + throw new Error("no error thrown"); + } + catch (e) + { + assert.sameValue(e instanceof SyntaxError, true, + "expected syntax error parsing '" + s + "', got: " + e); + } +} + +expectSyntaxError("({ get x(a) { } })"); +expectSyntaxError("({ get x(a, a) { } })"); +expectSyntaxError("({ get x(a, b) { } })"); +expectSyntaxError("({ get x(a, a, b) { } })"); +expectSyntaxError("({ get x(a, b, c) { } })"); + +expectSyntaxError("({ set x() { } })"); +expectSyntaxError("({ set x(a, a) { } })"); +expectSyntaxError("({ set x(a, b) { } })"); +expectSyntaxError("({ set x(a, a, b) { } })"); +expectSyntaxError("({ set x(a, b, c) { } })"); + +//----------------------------------------------------------------------------- + diff --git a/test/staging/sm/expressions/object-literal-accessor-property-name.js b/test/staging/sm/expressions/object-literal-accessor-property-name.js new file mode 100644 index 0000000000..4592ec059f --- /dev/null +++ b/test/staging/sm/expressions/object-literal-accessor-property-name.js @@ -0,0 +1,38 @@ +/* + * Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/licenses/publicdomain/ + */ + +/*--- +includes: [sm/non262-expressions-shell.js, sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +var gTestfile = 'object-literal-accessor-property-name.js'; +//----------------------------------------------------------------------------- +var BUGNUMBER = 715682; +var summary = + "Permit numbers and strings containing numbers as accessor property names"; +print(BUGNUMBER + ": " + summary); + +//----------------------------------------------------------------------------- + +({ get "0"() { } }); +({ get 0() { } }); +({ get 0.0() { } }); +({ get 0.() { } }); +({ get 1.() { } }); +({ get 5.2322341234123() { } }); + +({ set "0"(q) { } }); +({ set 0(q) { } }); +({ set 0.0(q) { } }); +({ set 0.(q) { } }); +({ set 1.(q) { } }); +({ set 5.2322341234123(q) { } }); + +//----------------------------------------------------------------------------- + diff --git a/test/staging/sm/expressions/object-literal-computed-property-evaluation.js b/test/staging/sm/expressions/object-literal-computed-property-evaluation.js new file mode 100644 index 0000000000..b64c548936 --- /dev/null +++ b/test/staging/sm/expressions/object-literal-computed-property-evaluation.js @@ -0,0 +1,45 @@ +/* + * Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/licenses/publicdomain/ + */ + +/*--- +includes: [sm/non262-expressions-shell.js, sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +//----------------------------------------------------------------------------- +var BUGNUMBER = 1199546; +var summary = + "Convert computed property name expressions to property key before " + + "evaluating the property's value"; + +print(BUGNUMBER + ": " + summary); + +/************** + * BEGIN TEST * + **************/ + +var s = "foo"; +var convertsToS = { toString() { return s; } }; + +var o = { + [convertsToS]: // after ToPropertyKey becomes "foo" + (function() { + s = 'bar'; + return 'abc'; // so we have "foo": "bar" for the first property + })(), + + [convertsToS]: // |s| was set above to "bar", so after ToPropertyKey, "bar" + 'efg' // so we have "bar": "efg" for the second property +}; + +assert.sameValue(o.foo, "abc"); +assert.sameValue(o.bar, "efg"); + +/******************************************************************************/ + +print("Tests complete"); diff --git a/test/staging/sm/expressions/octal-literals.js b/test/staging/sm/expressions/octal-literals.js new file mode 100644 index 0000000000..4dee273ec5 --- /dev/null +++ b/test/staging/sm/expressions/octal-literals.js @@ -0,0 +1,110 @@ +/* + * Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/licenses/publicdomain/ + */ + +/*--- +includes: [sm/non262-expressions-shell.js, sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +//----------------------------------------------------------------------------- +var BUGNUMBER = 894026; +var summary = "Implement ES6 octal literals"; + +print(BUGNUMBER + ": " + summary); + +/************** + * BEGIN TEST * + **************/ + +var chars = ['o', 'O']; + +for (var i = 0; i < 8; i++) +{ + if (i === 8) + { + chars.forEach(function(v) + { + try + { + eval('0' + v + i); + throw "didn't throw"; + } + catch (e) + { + assert.sameValue(e instanceof SyntaxError, true, + "no syntax error evaluating 0" + v + i + ", " + + "got " + e); + } + }); + continue; + } + + for (var j = 0; j < 8; j++) + { + if (j === 8) + { + chars.forEach(function(v) + { + try + { + eval('0' + v + i + j); + throw "didn't throw"; + } + catch (e) + { + assert.sameValue(e instanceof SyntaxError, true, + "no syntax error evaluating 0" + v + i + j + ", " + + "got " + e); + } + }); + continue; + } + + for (var k = 0; k < 8; k++) + { + if (k === 8) + { + chars.forEach(function(v) + { + try + { + eval('0' + v + i + j + k); + throw "didn't throw"; + } + catch (e) + { + assert.sameValue(e instanceof SyntaxError, true, + "no syntax error evaluating 0" + v + i + j + k + ", " + + "got " + e); + } + }); + continue; + } + + chars.forEach(function(v) + { + assert.sameValue(eval('0' + v + i + j + k), i * 64 + j * 8 + k); + }); + } + } +} + +// Off-by-one check: '/' immediately precedes '0'. +assert.sameValue(0o110/2, 36); +assert.sameValue(0O644/2, 210); + +function strict() +{ + "use strict"; + return 0o755; +} +assert.sameValue(strict(), 7 * 64 + 5 * 8 + 5); + +/******************************************************************************/ + +print("Tests complete"); diff --git a/test/staging/sm/expressions/optional-chain-class-heritage.js b/test/staging/sm/expressions/optional-chain-class-heritage.js new file mode 100644 index 0000000000..b71b6acb07 --- /dev/null +++ b/test/staging/sm/expressions/optional-chain-class-heritage.js @@ -0,0 +1,19 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-expressions-shell.js, sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +// Optional expression can be part of a class heritage expression. + +var a = {b: null}; + +class C extends a?.b {} + +assert.sameValue(Object.getPrototypeOf(C.prototype), null); + diff --git a/test/staging/sm/expressions/optional-chain-first-expression.js b/test/staging/sm/expressions/optional-chain-first-expression.js new file mode 100644 index 0000000000..3802551bd0 --- /dev/null +++ b/test/staging/sm/expressions/optional-chain-first-expression.js @@ -0,0 +1,101 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-expressions-shell.js, sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +// Verify bytecode emitter accepts all valid optional chain first expressions. + +const expressions = [ + // https://tc39.es/ecma262/#sec-primary-expression + "this", + "ident", + "null", + "true", + "false", + "123", + "123n", + "'str'", + "[]", + "{}", + "function(){}", + "class{}", + "function*(){}", + "async function(){}", + "async function*(){}", + "/a/", + "`str`", + "(a + b)", + + // https://tc39.es/ecma262/#sec-left-hand-side-expressions + "a[b]", + "a.b", + "a``", + "super[a]", + "super.a", + "new.target", + "import.meta", + "new C()", + "new C", + "f()", + "super()", + "a?.b", + "a?.[b]", + "a?.()", + "a?.``", +]; + +function tryParse(s, f = Function) { + try { f(s); } catch {} +} + +function tryRun(s, f = Function) { + try { f(s)(); } catch {} +} + +for (let expr of expressions) { + // Evaluate in an expression context. + tryRun(`void (${expr}?.());`); + tryRun(`void (${expr}?.p());`); + + // Also try parenthesized. + tryRun(`void ((${expr})?.());`); + tryRun(`void ((${expr})?.p());`); +} + +function inClassConstructor(s) { + return `class C { constructor() { ${s} } }`; +} + +for (let expr of ["super[a]", "super.a", "super()"]) { + // Evaluate in an expression context. + tryRun(inClassConstructor(`void (${expr}?.());`)); + tryRun(inClassConstructor(`void (${expr}?.p());`)); + + // Also try parenthesized. + tryRun(inClassConstructor(`void ((${expr})?.());`)); + tryRun(inClassConstructor(`void ((${expr})?.p());`)); +} + +if (typeof parseModule === "function") { + const expressions = [ + "import.meta", + "import('')", + ]; + + for (let expr of expressions) { + // Evaluate in an expression context. + tryParse(`void (${expr}?.());`, parseModule); + tryParse(`void (${expr}?.p());`, parseModule); + + // Also try parenthesized. + tryParse(`void ((${expr})?.());`, parseModule); + tryParse(`void ((${expr})?.p());`, parseModule); + } +} + diff --git a/test/staging/sm/expressions/optional-chain-super-elem.js b/test/staging/sm/expressions/optional-chain-super-elem.js new file mode 100644 index 0000000000..9b17500a6a --- /dev/null +++ b/test/staging/sm/expressions/optional-chain-super-elem.js @@ -0,0 +1,21 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-expressions-shell.js, sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +// Don't assert. + +var obj = { + m() { + super[0]?.a + } +}; + +obj.m(); + diff --git a/test/staging/sm/expressions/optional-chain-tdz.js b/test/staging/sm/expressions/optional-chain-tdz.js new file mode 100644 index 0000000000..fd5ba02d3a --- /dev/null +++ b/test/staging/sm/expressions/optional-chain-tdz.js @@ -0,0 +1,37 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-expressions-shell.js, sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +// Test TDZ for optional chaining. + +// TDZ for lexical |let| bindings with optional chaining. +{ + assertThrowsInstanceOf(() => { + const Null = null; + Null?.[b]; + b = 0; + let b; + }, ReferenceError); + + assertThrowsInstanceOf(() => { + const Null = null; + Null?.[b](); + b = 0; + let b; + }, ReferenceError); + + assertThrowsInstanceOf(() => { + const Null = null; + delete Null?.[b]; + b = 0; + let b; + }, ReferenceError); +} + diff --git a/test/staging/sm/expressions/optional-chain.js b/test/staging/sm/expressions/optional-chain.js new file mode 100644 index 0000000000..c5688ac7ee --- /dev/null +++ b/test/staging/sm/expressions/optional-chain.js @@ -0,0 +1,244 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-expressions-shell.js, sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +var BUGNUMBER = 1566143; +var summary = "Implement the Optional Chain operator (?.) proposal"; + +print(BUGNUMBER + ": " + summary); + +// These tests are originally from webkit. +// webkit specifics have been removed and error messages have been updated. +function shouldBe(actual, expected) { + if (actual !== expected) + throw new Error(`expected ${expected} but got ${actual}`); +} + +function shouldThrowSyntaxError(script) { + assertThrowsInstanceOf(() => eval(script), SyntaxError); +} + +function shouldNotThrowSyntaxError(script) { + let error; + try { + eval(script); + } catch (e) { + error = e; + } + + if ((error instanceof SyntaxError)) + throw new Error('Unxpected SyntaxError!'); +} + +function shouldThrowTypeError(func, messagePrefix) { + assertThrowsInstanceOfWithMessageContains(func, TypeError, messagePrefix); +} + +function shouldThrowReferenceError(script) { + assertThrowsInstanceOf(() => eval(script), ReferenceError); +} + +function testBasicSuccessCases() { + shouldBe(undefined?.valueOf(), undefined); + shouldBe(null?.valueOf(), undefined); + shouldBe(true?.valueOf(), true); + shouldBe(false?.valueOf(), false); + shouldBe(0?.valueOf(), 0); + shouldBe(1?.valueOf(), 1); + shouldBe(''?.valueOf(), ''); + shouldBe('hi'?.valueOf(), 'hi'); + shouldBe(({})?.constructor, Object); + shouldBe(({ x: 'hi' })?.x, 'hi'); + shouldBe([]?.length, 0); + shouldBe(['hi']?.length, 1); + + shouldBe(undefined?.['valueOf'](), undefined); + shouldBe(null?.['valueOf'](), undefined); + shouldBe(true?.['valueOf'](), true); + shouldBe(false?.['valueOf'](), false); + shouldBe(0?.['valueOf'](), 0); + shouldBe(1?.['valueOf'](), 1); + shouldBe(''?.['valueOf'](), ''); + shouldBe('hi'?.['valueOf'](), 'hi'); + shouldBe(({})?.['constructor'], Object); + shouldBe(({ x: 'hi' })?.['x'], 'hi'); + shouldBe([]?.['length'], 0); + shouldBe(['hi']?.[0], 'hi'); + + shouldBe(undefined?.(), undefined); + shouldBe(null?.(), undefined); + shouldBe((() => 3)?.(), 3); +} + +function testBasicFailureCases() { + shouldThrowTypeError(() => true?.(), 'true is not a function'); + shouldThrowTypeError(() => false?.(), 'false is not a function'); + shouldThrowTypeError(() => 0?.(), '0 is not a function'); + shouldThrowTypeError(() => 1?.(), '1 is not a function'); + shouldThrowTypeError(() => ''?.(), '"" is not a function'); + shouldThrowTypeError(() => 'hi'?.(), '"hi" is not a function'); + shouldThrowTypeError(() => ({})?.(), '({}) is not a function'); + shouldThrowTypeError(() => ({ x: 'hi' })?.(), '({x:"hi"}) is not a function'); + shouldThrowTypeError(() => []?.(), '[] is not a function'); + shouldThrowTypeError(() => ['hi']?.(), '[...] is not a function'); +} + +testBasicSuccessCases(); + +testBasicFailureCases(); + +shouldThrowTypeError(() => ({})?.i(), '(intermediate value).i is not a function'); +shouldBe(({}).i?.(), undefined); +shouldBe(({})?.i?.(), undefined); +shouldThrowTypeError(() => ({})?.['i'](), '(intermediate value)["i"] is not a function'); +shouldBe(({})['i']?.(), undefined); +shouldBe(({})?.['i']?.(), undefined); + +shouldThrowTypeError(() => ({})?.a['b'], '(intermediate value).a is undefined'); +shouldBe(({})?.a?.['b'], undefined); +shouldBe(null?.a['b']().c, undefined); +shouldThrowTypeError(() => ({})?.['a'].b, '(intermediate value)["a"] is undefined'); +shouldBe(({})?.['a']?.b, undefined); +shouldBe(null?.['a'].b()['c'], undefined); +shouldBe(null?.()().a['b'], undefined); + +const o0 = { a: { b() { return this._b.bind(this); }, _b() { return this.__b; }, __b: { c: 42 } } }; +shouldBe(o0?.a?.['b']?.()?.()?.c, 42); +shouldBe(o0?.i?.['j']?.()?.()?.k, undefined); +shouldBe((o0.a?._b)?.().c, 42); +shouldBe((o0.a?._b)().c, 42); +shouldBe((o0.a?.b?.())?.().c, 42); +shouldBe((o0.a?.['b']?.())?.().c, 42); + +shouldBe(({ undefined: 3 })?.[null?.a], 3); +shouldBe((() => 3)?.(null?.a), 3); + +const o1 = { count: 0, get x() { this.count++; return () => {}; } }; +o1.x?.y; +shouldBe(o1.count, 1); +o1.x?.['y']; +shouldBe(o1.count, 2); +o1.x?.(); +shouldBe(o1.count, 3); +null?.(o1.x); +shouldBe(o1.count, 3); + +shouldBe(delete undefined?.foo, true); +shouldBe(delete null?.foo, true); +shouldBe(delete undefined?.['foo'], true); +shouldBe(delete null?.['foo'], true); +shouldBe(delete undefined?.(), true); +shouldBe(delete null?.(), true); +shouldBe(delete ({}).a?.b?.b, true); +shouldBe(delete ({a : {b: undefined}}).a?.b?.b, true); +shouldBe(delete ({a : {b: undefined}}).a?.["b"]?.["b"], true); + +const o2 = { x: 0, y: 0, z() {} }; +shouldBe(delete o2?.x, true); +shouldBe(o2.x, undefined); +shouldBe(o2.y, 0); +shouldBe(delete o2?.x, true); +shouldBe(delete o2?.['y'], true); +shouldBe(o2.y, undefined); +shouldBe(delete o2?.['y'], true); +shouldBe(delete o2.z?.(), true); + +function greet(name) { return `hey, ${name}${this.suffix ?? '.'}`; } +shouldBe(eval?.('greet("world")'), 'hey, world.'); +shouldBe(greet?.call({ suffix: '!' }, 'world'), 'hey, world!'); +shouldBe(greet.call?.({ suffix: '!' }, 'world'), 'hey, world!'); +shouldBe(null?.call({ suffix: '!' }, 'world'), undefined); +shouldBe(({}).call?.({ suffix: '!' }, 'world'), undefined); +shouldBe(greet?.apply({ suffix: '?' }, ['world']), 'hey, world?'); +shouldBe(greet.apply?.({ suffix: '?' }, ['world']), 'hey, world?'); +shouldBe(null?.apply({ suffix: '?' }, ['world']), undefined); +shouldBe(({}).apply?.({ suffix: '?' }, ['world']), undefined); +shouldThrowSyntaxError('class C {} class D extends C { foo() { return super?.bar; } }'); +shouldThrowSyntaxError('class C {} class D extends C { foo() { return super?.["bar"]; } }'); +shouldThrowSyntaxError('class C {} class D extends C { constructor() { super?.(); } }'); +shouldThrowSyntaxError('const o = { C: class {} }; new o?.C();') +shouldThrowSyntaxError('const o = { C: class {} }; new o?.["C"]();') +shouldThrowSyntaxError('class C {} new C?.();') +shouldThrowSyntaxError('function foo() { new?.target; }'); +shouldThrowSyntaxError('function tag() {} tag?.``;'); +shouldThrowSyntaxError('const o = { tag() {} }; o?.tag``;'); +shouldThrowReferenceError('`${G}`?.r'); + +// NOT an optional chain +shouldBe(false?.4:5, 5); + +// Special case: binary operators that follow a binary expression +shouldThrowReferenceError('(0 || 1 << x)?.$'); +shouldThrowReferenceError('(0 || 1 >> x)?.$'); +shouldThrowReferenceError('(0 || 1 >>> x)?.$'); +shouldThrowReferenceError('(0 || 1 + x)?.$'); +shouldThrowReferenceError('(0 || 1 - x)?.$'); +shouldThrowReferenceError('(0 || 1 % x)?.$'); +shouldThrowReferenceError('(0 || 1 / x)?.$'); +shouldThrowReferenceError('(0 || 1 == x)?.$'); +shouldThrowReferenceError('(0 || 1 != x)?.$'); +shouldThrowReferenceError('(0 || 1 !== x)?.$'); +shouldThrowReferenceError('(0 || 1 === x)?.$'); +shouldThrowReferenceError('(0 || 1 <= x)?.$'); +shouldThrowReferenceError('(0 || 1 >= x)?.$'); +shouldThrowReferenceError('(0 || 1 ** x)?.$'); +shouldThrowReferenceError('(0 || 1 | x)?.$'); +shouldThrowReferenceError('(0 || 1 & x)?.$'); +shouldThrowReferenceError('(0 || 1 instanceof x)?.$'); +shouldThrowReferenceError('(0 || "foo" in x)?.$'); + +function testSideEffectCountFunction() { + let count = 0; + let a = { + b: { + c: { + d: () => { + count++; + return a; + } + } + } + } + + a.b.c.d?.()?.b?.c?.d + + shouldBe(count, 1); +} + +function testSideEffectCountGetters() { + let count = 0; + let a = { + get b() { + count++; + return { c: {} }; + } + } + + a.b?.c?.d; + shouldBe(count, 1); + a.b?.c?.d; + shouldBe(count, 2); +} + +testSideEffectCountFunction(); +testSideEffectCountGetters(); + +// stress test SM +shouldBe(({a : {b: undefined}}).a.b?.()()(), undefined); +shouldBe(({a : {b: undefined}}).a.b?.()?.()(), undefined); +shouldBe(({a : {b: () => undefined}}).a.b?.()?.(), undefined); +shouldThrowTypeError(() => delete ({a : {b: undefined}}).a?.b.b.c, '(intermediate value).a.b is undefined'); +shouldBe(delete ({a : {b: undefined}}).a?.["b"]?.["b"], true); +shouldBe(delete undefined ?.x[y+1], true); +shouldThrowTypeError(() => (({a : {b: () => undefined}}).a.b?.())(), 'undefined is not a function'); +shouldThrowTypeError(() => (delete[1]?.r[delete[1]?.r1]), "[...].r is undefined"); +shouldThrowTypeError(() => (delete[1]?.r[[1]?.r1]), "[...].r is undefined"); + +print("Tests complete"); diff --git a/test/staging/sm/expressions/primitive-this-boxing-behavior.js b/test/staging/sm/expressions/primitive-this-boxing-behavior.js new file mode 100644 index 0000000000..6f661573a2 --- /dev/null +++ b/test/staging/sm/expressions/primitive-this-boxing-behavior.js @@ -0,0 +1,113 @@ +/* + * Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/licenses/publicdomain/ + */ + +/*--- +includes: [sm/non262-expressions-shell.js, sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +//----------------------------------------------------------------------------- +var BUGNUMBER = 732669; +var summary = "Primitive values don't box correctly"; + +print(BUGNUMBER + ": " + summary); + +/************** + * BEGIN TEST * + **************/ + +var t; +function returnThis() { return this; } + +// Boolean + +Boolean.prototype.method = returnThis; +t = true.method(); +assert.sameValue(t !== Boolean.prototype, true); +assert.sameValue(t.toString(), "true"); + +Object.defineProperty(Boolean.prototype, "property", { get: returnThis, configurable: true }); +t = false.property; +assert.sameValue(t !== Boolean.prototype, true); +assert.sameValue(t.toString(), "false"); + +delete Boolean.prototype.method; +delete Boolean.prototype.property; + + +// Number + +Number.prototype.method = returnThis; +t = 5..method(); +assert.sameValue(t !== Number.prototype, true); +assert.sameValue(t.toString(), "5"); + +Object.defineProperty(Number.prototype, "property", { get: returnThis, configurable: true }); +t = 17..property; +assert.sameValue(t !== Number.prototype, true); +assert.sameValue(t.toString(), "17"); + +delete Number.prototype.method; +delete Number.prototype.property; + + +// String + +String.prototype.method = returnThis; +t = "foo".method(); +assert.sameValue(t !== String.prototype, true); +assert.sameValue(t.toString(), "foo"); + +Object.defineProperty(String.prototype, "property", { get: returnThis, configurable: true }); +t = "bar".property; +assert.sameValue(t !== String.prototype, true); +assert.sameValue(t.toString(), "bar"); + +delete String.prototype.method; +delete String.prototype.property; + + +// Object + +Object.prototype.method = returnThis; + +t = true.method(); +assert.sameValue(t !== Object.prototype, true); +assert.sameValue(t !== Boolean.prototype, true); +assert.sameValue(t.toString(), "true"); + +t = 42..method(); +assert.sameValue(t !== Object.prototype, true); +assert.sameValue(t !== Number.prototype, true); +assert.sameValue(t.toString(), "42"); + +t = "foo".method(); +assert.sameValue(t !== Object.prototype, true); +assert.sameValue(t !== String.prototype, true); +assert.sameValue(t.toString(), "foo"); + +Object.defineProperty(Object.prototype, "property", { get: returnThis, configurable: true }); + +t = false.property; +assert.sameValue(t !== Object.prototype, true); +assert.sameValue(t !== Boolean.prototype, true); +assert.sameValue(t.toString(), "false"); + +t = 8675309..property; +assert.sameValue(t !== Object.prototype, true); +assert.sameValue(t !== Number.prototype, true); +assert.sameValue(t.toString(), "8675309"); + +t = "bar".property; +assert.sameValue(t !== Object.prototype, true); +assert.sameValue(t !== String.prototype, true); +assert.sameValue(t.toString(), "bar"); + +/******************************************************************************/ + +print("Tests complete"); diff --git a/test/staging/sm/expressions/short-circuit-compound-assignment-anon-fns.js b/test/staging/sm/expressions/short-circuit-compound-assignment-anon-fns.js new file mode 100644 index 0000000000..d42c3f841f --- /dev/null +++ b/test/staging/sm/expressions/short-circuit-compound-assignment-anon-fns.js @@ -0,0 +1,51 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-expressions-shell.js, sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +// NamedEvaluation applies to short-circuit assignment. + +{ + let a; + a ??= function(){}; + assert.sameValue(a.name, "a"); +} + +{ + let a = false; + a ||= function(){}; + assert.sameValue(a.name, "a"); +} + +{ + let a = true; + a &&= function(){}; + assert.sameValue(a.name, "a"); +} + +// No name assignments for parenthesised left-hand sides. + +{ + let a; + (a) ??= function(){}; + assert.sameValue(a.name, ""); +} + +{ + let a = false; + (a) ||= function(){}; + assert.sameValue(a.name, ""); +} + +{ + let a = true; + (a) &&= function(){}; + assert.sameValue(a.name, ""); +} + diff --git a/test/staging/sm/expressions/short-circuit-compound-assignment-const.js b/test/staging/sm/expressions/short-circuit-compound-assignment-const.js new file mode 100644 index 0000000000..24189883cf --- /dev/null +++ b/test/staging/sm/expressions/short-circuit-compound-assignment-const.js @@ -0,0 +1,99 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-expressions-shell.js, sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +// Test assignment to const and function name bindings. The latter is kind of a +// const binding, but only throws in strict mode. + +function notEvaluated() { + throw new Error("should not be evaluated"); +} + +// AndAssignExpr with const lexical binding. +{ + const a = false; + a &&= notEvaluated(); + assert.sameValue(a, false); + + const b = true; + assertThrowsInstanceOf(() => { b &&= 1; }, TypeError); + assert.sameValue(b, true); +} + +// AndAssignExpr with function name binding. +{ + let f = function fn() { + fn &&= true; + assert.sameValue(fn, f); + }; + f(); + + let g = function fn() { + "use strict"; + assertThrowsInstanceOf(() => { fn &&= 1; }, TypeError); + assert.sameValue(fn, g); + }; + g(); +} + +// OrAssignExpr with const lexical binding. +{ + const a = true; + a ||= notEvaluated(); + assert.sameValue(a, true); + + const b = false; + assertThrowsInstanceOf(() => { b ||= 0; }, TypeError); + assert.sameValue(b, false); +} + +// OrAssignExpr with function name binding. +{ + let f = function fn() { + fn ||= notEvaluated(); + assert.sameValue(fn, f); + }; + f(); + + let g = function fn() { + "use strict"; + fn ||= notEvaluated(); + assert.sameValue(fn, g); + }; + g(); +} + +// CoalesceAssignExpr with const lexical binding. +{ + const a = true; + a ??= notEvaluated(); + assert.sameValue(a, true); + + const b = null; + assertThrowsInstanceOf(() => { b ??= 0; }, TypeError); + assert.sameValue(b, null); +} + +// CoalesceAssignExpr with function name binding. +{ + let f = function fn() { + fn ??= notEvaluated(); + assert.sameValue(fn, f); + }; + f(); + + let g = function fn() { + "use strict"; + fn ??= notEvaluated(); + assert.sameValue(fn, g); + }; + g(); +} + diff --git a/test/staging/sm/expressions/short-circuit-compound-assignment-property-key-evaluation.js b/test/staging/sm/expressions/short-circuit-compound-assignment-property-key-evaluation.js new file mode 100644 index 0000000000..fa8ba16fe7 --- /dev/null +++ b/test/staging/sm/expressions/short-circuit-compound-assignment-property-key-evaluation.js @@ -0,0 +1,77 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-expressions-shell.js, sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +// Test that property keys are only evaluated once. + +class PropertyKey { + constructor(key) { + this.key = key; + this.count = 0; + } + + toString() { + this.count++; + return this.key; + } + + valueOf() { + throw new Error("unexpected valueOf call"); + } +} + +// AndAssignExpr +{ + let obj = {p: true}; + let pk = new PropertyKey("p"); + + obj[pk] &&= false; + + assert.sameValue(obj.p, false); + assert.sameValue(pk.count, 1); + + obj[pk] &&= true; + + assert.sameValue(obj.p, false); + assert.sameValue(pk.count, 2); +} + +// OrAssignExpr +{ + let obj = {p: false}; + let pk = new PropertyKey("p"); + + obj[pk] ||= true; + + assert.sameValue(obj.p, true); + assert.sameValue(pk.count, 1); + + obj[pk] ||= false; + + assert.sameValue(obj.p, true); + assert.sameValue(pk.count, 2); +} + +// CoalesceAssignExpr +{ + let obj = {p: null}; + let pk = new PropertyKey("p"); + + obj[pk] ??= true; + + assert.sameValue(obj.p, true); + assert.sameValue(pk.count, 1); + + obj[pk] ??= false; + + assert.sameValue(obj.p, true); + assert.sameValue(pk.count, 2); +} + diff --git a/test/staging/sm/expressions/short-circuit-compound-assignment-tdz.js b/test/staging/sm/expressions/short-circuit-compound-assignment-tdz.js new file mode 100644 index 0000000000..fb58200158 --- /dev/null +++ b/test/staging/sm/expressions/short-circuit-compound-assignment-tdz.js @@ -0,0 +1,65 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-expressions-shell.js, sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +// Test TDZ for short-circuit compound assignments. + +// TDZ for lexical |let| bindings. +{ + assertThrowsInstanceOf(() => { let a = (a &&= 0); }, ReferenceError); + assertThrowsInstanceOf(() => { let a = (a ||= 0); }, ReferenceError); + assertThrowsInstanceOf(() => { let a = (a ??= 0); }, ReferenceError); +} + +// TDZ for lexical |const| bindings. +{ + assertThrowsInstanceOf(() => { const a = (a &&= 0); }, ReferenceError); + assertThrowsInstanceOf(() => { const a = (a ||= 0); }, ReferenceError); + assertThrowsInstanceOf(() => { const a = (a ??= 0); }, ReferenceError); +} + +// TDZ for parameter expressions. +{ + assertThrowsInstanceOf((a = (b &&= 0), b) => {}, ReferenceError); + assertThrowsInstanceOf((a = (b ||= 0), b) => {}, ReferenceError); + assertThrowsInstanceOf((a = (b ??= 0), b) => {}, ReferenceError); +} + +// TDZ for |class| bindings. +{ + assertThrowsInstanceOf(() => { class a extends (a &&= 0) {} }, ReferenceError); + assertThrowsInstanceOf(() => { class a extends (a ||= 0) {} }, ReferenceError); + assertThrowsInstanceOf(() => { class a extends (a ??= 0) {} }, ReferenceError); +} + +// TDZ for lexical |let| bindings with conditional assignment. +{ + assertThrowsInstanceOf(() => { + const False = false; + False &&= b; + b = 2; + let b; + }, ReferenceError); + + assertThrowsInstanceOf(() => { + const True = true; + True ||= b; + b = 2; + let b; + }, ReferenceError); + + assertThrowsInstanceOf(() => { + const NonNull = {}; + NonNull ??= b; + b = 2; + let b; + }, ReferenceError); +} + diff --git a/test/staging/sm/expressions/short-circuit-compound-assignment.js b/test/staging/sm/expressions/short-circuit-compound-assignment.js new file mode 100644 index 0000000000..413fdea049 --- /dev/null +++ b/test/staging/sm/expressions/short-circuit-compound-assignment.js @@ -0,0 +1,274 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-expressions-shell.js, sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +const testCasesAnd = []; +const testCasesOr = []; +const testCasesCoalesce = []; + + +// Assignment to a global variable (JSOp::SetGName). +var globalVar; + +function testAnd_GlobalVar(init, value) { + globalVar = init; + return [(globalVar &&= value), globalVar]; +} +testCasesAnd.push(testAnd_GlobalVar); + +function testOr_GlobalVar(init, value) { + globalVar = init; + return [(globalVar ||= value), globalVar]; +} +testCasesOr.push(testOr_GlobalVar); + +function testCoalesce_GlobalVar(init, value) { + globalVar = init; + return [(globalVar ??= value), globalVar]; +} +testCasesCoalesce.push(testCoalesce_GlobalVar); + + +// Assignment to a local variable (JSOp::SetLocal). +function testAnd_LocalVar(init, value) { + let v = init; + return [(v &&= value), v]; +} +testCasesAnd.push(testAnd_LocalVar); + +function testOr_LocalVar(init, value) { + let v = init; + return [(v ||= value), v]; +} +testCasesOr.push(testOr_LocalVar); + +function testCoalesce_LocalVar(init, value) { + let v = init; + return [(v ??= value), v]; +} +testCasesCoalesce.push(testCoalesce_LocalVar); + + +// Assignment to a parameter (JSOp::SetArg). +function testAnd_Arg(init, value) { + function f(v) { + return [(v &&= value), v]; + } + return f(init); +} +testCasesAnd.push(testAnd_Arg); + +function testOr_Arg(init, value) { + function f(v) { + return [(v ||= value), v]; + } + return f(init); +} +testCasesOr.push(testOr_Arg); + +function testCoalesce_Arg(init, value) { + function f(v) { + return [(v ??= value), v]; + } + return f(init); +} +testCasesCoalesce.push(testCoalesce_Arg); + + +// Assignment to a closed over variable (JSOp::SetAliasedVar). +function testAnd_ClosedOver(init, value) { + let v = init; + function f() { + return (v &&= value); + } + return [f(), v]; +} +testCasesAnd.push(testAnd_ClosedOver); + +function testOr_ClosedOver(init, value) { + let v = init; + function f() { + return (v ||= value); + } + return [f(), v]; +} +testCasesOr.push(testOr_ClosedOver); + +function testCoalesce_ClosedOver(init, value) { + let v = init; + function f() { + return (v ??= value); + } + return [f(), v]; +} +testCasesCoalesce.push(testCoalesce_ClosedOver); + + +// Assignment to a dynamic name (JSOp::SetName). +function testAnd_DynamicName(init, value) { + eval("var v = init;"); + return [(v &&= value), v]; +} +testCasesAnd.push(testAnd_DynamicName); + +function testOr_DynamicName(init, value) { + eval("var v = init;"); + return [(v ||= value), v]; +} +testCasesOr.push(testOr_DynamicName); + +function testCoalesce_DynamicName(init, value) { + eval("var v = init;"); + return [(v ??= value), v]; +} +testCasesCoalesce.push(testCoalesce_DynamicName); + + +// Assignment to a property. +function testAnd_Property(init, value) { + let obj = {p: init}; + return [(obj.p &&= value), obj.p]; +} +testCasesAnd.push(testAnd_Property); + +function testOr_Property(init, value) { + let obj = {p: init}; + return [(obj.p ||= value), obj.p]; +} +testCasesOr.push(testOr_Property); + +function testCoalesce_Property(init, value) { + let obj = {p: init}; + return [(obj.p ??= value), obj.p]; +} +testCasesCoalesce.push(testCoalesce_Property); + + +// Assignment to a super property. +function testAnd_SuperProperty(init, value) { + let proto = {p: init}; + let obj = {__proto__: proto, m() { return (super.p &&= value); }}; + return [obj.m(), obj.p]; +} +testCasesAnd.push(testAnd_SuperProperty); + +function testOr_SuperProperty(init, value) { + let proto = {p: init}; + let obj = {__proto__: proto, m() { return (super.p ||= value); }}; + return [obj.m(), obj.p]; +} +testCasesOr.push(testOr_SuperProperty); + +function testCoalesce_SuperProperty(init, value) { + let proto = {p: init}; + let obj = {__proto__: proto, m() { return (super.p ??= value); }}; + return [obj.m(), obj.p]; +} +testCasesCoalesce.push(testCoalesce_SuperProperty); + + +// Assignment to an element. +function testAnd_Element(init, value) { + let p = 123; + let obj = {[p]: init}; + return [(obj[p] &&= value), obj[p]]; +} +testCasesAnd.push(testAnd_Element); + +function testOr_Element(init, value) { + let p = 123; + let obj = {[p]: init}; + return [(obj[p] ||= value), obj[p]]; +} +testCasesOr.push(testOr_Element); + +function testCoalesce_Element(init, value) { + let p = 123; + let obj = {[p]: init}; + return [(obj[p] ??= value), obj[p]]; +} +testCasesCoalesce.push(testCoalesce_Element); + + +// Assignment to a super element. +function testAnd_SuperElement(init, value) { + let p = 123; + let proto = {[p]: init}; + let obj = {__proto__: proto, m() { return (super[p] &&= value); }}; + return [obj.m(), obj[p]]; +} +testCasesAnd.push(testAnd_SuperElement); + +function testOr_SuperElement(init, value) { + let p = 123; + let proto = {[p]: init}; + let obj = {__proto__: proto, m() { return (super[p] ||= value); }}; + return [obj.m(), obj[p]]; +} +testCasesOr.push(testOr_SuperElement); + +function testCoalesce_SuperElement(init, value) { + let p = 123; + let proto = {[p]: init}; + let obj = {__proto__: proto, m() { return (super[p] ??= value); }}; + return [obj.m(), obj[p]]; +} +testCasesCoalesce.push(testCoalesce_SuperElement); + + +// Run the actual tests. + +function runTest(testCases, init, value, expected) { + for (let f of testCases) { + let [result, newValue] = f(init, value); + + assert.sameValue(result, expected); + assert.sameValue(newValue, expected); + } +} + +function testAnd(init, value) { + const expected = init ? value : init; + runTest(testCasesAnd, init, value, expected); +} + +function testOr(init, value) { + const expected = !init ? value : init; + runTest(testCasesOr, init, value, expected); +} + +function testCoalesce(init, value) { + const expected = init === undefined || init === null ? value : init; + runTest(testCasesCoalesce, init, value, expected); +} + + +// Repeat a number of times to ensure JITs can kick in, too. +for (let i = 0; i < 50; ++i) { + for (let thruthy of [true, 123, 123n, "hi", [], Symbol()]) { + testAnd(thruthy, "pass"); + testOr(thruthy, "fail"); + testCoalesce(thruthy, "fail"); + } + + for (let falsy of [false, 0, NaN, 0n, ""]) { + testAnd(falsy, "fail"); + testOr(falsy, "pass"); + testCoalesce(falsy, "fail"); + } + + for (let nullOrUndefined of [null, undefined]) { + testAnd(nullOrUndefined, "fail"); + testOr(nullOrUndefined, "pass"); + testCoalesce(nullOrUndefined, "pass"); + } +} + + diff --git a/test/staging/sm/expressions/string-literal-escape-sequences.js b/test/staging/sm/expressions/string-literal-escape-sequences.js new file mode 100644 index 0000000000..733495be53 --- /dev/null +++ b/test/staging/sm/expressions/string-literal-escape-sequences.js @@ -0,0 +1,153 @@ +/* + * Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/licenses/publicdomain/ + */ + +/*--- +includes: [sm/non262-expressions-shell.js, sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +//----------------------------------------------------------------------------- +var BUGNUMBER = 663300; +var summary = + "\\u and \\x must be followed by the appropriate number of hex digits or " + + "else it is a syntax error"; + +print(BUGNUMBER + ": " + summary); + +/************** + * BEGIN TEST * + **************/ + +function expectSyntaxError(str) +{ + try + { + eval(str); + } + catch (e) + { + assert.sameValue(e instanceof SyntaxError, true, + "no syntax error evaluating " + str); + } +} + +expectSyntaxError('"\\x"'); +expectSyntaxError('"\\x0"'); +expectSyntaxError('"\\x1"'); +expectSyntaxError('"\\x2"'); +expectSyntaxError('"\\x3"'); +expectSyntaxError('"\\x4"'); +expectSyntaxError('"\\x5"'); +expectSyntaxError('"\\x6"'); +expectSyntaxError('"\\x7"'); +expectSyntaxError('"\\x8"'); +expectSyntaxError('"\\x9"'); +expectSyntaxError('"\\xA"'); +expectSyntaxError('"\\xB"'); +expectSyntaxError('"\\xC"'); +expectSyntaxError('"\\xD"'); +expectSyntaxError('"\\xE"'); +expectSyntaxError('"\\xF"'); +expectSyntaxError('"\\xG"'); +expectSyntaxError('"\\x0G"'); +expectSyntaxError('"\\x1G"'); +expectSyntaxError('"\\x2G"'); +expectSyntaxError('"\\x3G"'); +expectSyntaxError('"\\x4G"'); +expectSyntaxError('"\\x5G"'); +expectSyntaxError('"\\x6G"'); +expectSyntaxError('"\\x7G"'); +expectSyntaxError('"\\x8G"'); +expectSyntaxError('"\\x9G"'); +expectSyntaxError('"\\xAG"'); +expectSyntaxError('"\\xBG"'); +expectSyntaxError('"\\xCG"'); +expectSyntaxError('"\\xDG"'); +expectSyntaxError('"\\xEG"'); +expectSyntaxError('"\\xFG"'); +expectSyntaxError('"\\xGG"'); + +expectSyntaxError('"\\u"'); +expectSyntaxError('"\\u0"'); +expectSyntaxError('"\\u1"'); +expectSyntaxError('"\\u2"'); +expectSyntaxError('"\\u3"'); +expectSyntaxError('"\\u4"'); +expectSyntaxError('"\\u5"'); +expectSyntaxError('"\\u6"'); +expectSyntaxError('"\\u7"'); +expectSyntaxError('"\\u8"'); +expectSyntaxError('"\\u9"'); +expectSyntaxError('"\\uA"'); +expectSyntaxError('"\\uB"'); +expectSyntaxError('"\\uC"'); +expectSyntaxError('"\\uD"'); +expectSyntaxError('"\\uE"'); +expectSyntaxError('"\\uF"'); +expectSyntaxError('"\\uG"'); +expectSyntaxError('"\\u00"'); +expectSyntaxError('"\\u11"'); +expectSyntaxError('"\\u22"'); +expectSyntaxError('"\\u33"'); +expectSyntaxError('"\\u44"'); +expectSyntaxError('"\\u55"'); +expectSyntaxError('"\\u66"'); +expectSyntaxError('"\\u77"'); +expectSyntaxError('"\\u88"'); +expectSyntaxError('"\\u99"'); +expectSyntaxError('"\\uAA"'); +expectSyntaxError('"\\uBB"'); +expectSyntaxError('"\\uCC"'); +expectSyntaxError('"\\uDD"'); +expectSyntaxError('"\\uEE"'); +expectSyntaxError('"\\uFF"'); +expectSyntaxError('"\\uGG"'); +expectSyntaxError('"\\u000"'); +expectSyntaxError('"\\u111"'); +expectSyntaxError('"\\u222"'); +expectSyntaxError('"\\u333"'); +expectSyntaxError('"\\u444"'); +expectSyntaxError('"\\u555"'); +expectSyntaxError('"\\u666"'); +expectSyntaxError('"\\u777"'); +expectSyntaxError('"\\u888"'); +expectSyntaxError('"\\u999"'); +expectSyntaxError('"\\uAAA"'); +expectSyntaxError('"\\uBBB"'); +expectSyntaxError('"\\uCCC"'); +expectSyntaxError('"\\uDDD"'); +expectSyntaxError('"\\uEEE"'); +expectSyntaxError('"\\uFFF"'); +expectSyntaxError('"\\uGGG"'); +expectSyntaxError('"\\u000G"'); +expectSyntaxError('"\\u111G"'); +expectSyntaxError('"\\u222G"'); +expectSyntaxError('"\\u333G"'); +expectSyntaxError('"\\u444G"'); +expectSyntaxError('"\\u555G"'); +expectSyntaxError('"\\u666G"'); +expectSyntaxError('"\\u777G"'); +expectSyntaxError('"\\u888G"'); +expectSyntaxError('"\\u999G"'); +expectSyntaxError('"\\uAAAG"'); +expectSyntaxError('"\\uBBBG"'); +expectSyntaxError('"\\uCCCG"'); +expectSyntaxError('"\\uDDDG"'); +expectSyntaxError('"\\uEEEG"'); +expectSyntaxError('"\\uFFFG"'); +expectSyntaxError('"\\uGGGG"'); + +assert.sameValue(eval('"a\\\rb"'), "ab"); +assert.sameValue(eval('"a\\\nb"'), "ab"); +assert.sameValue(eval('"a\\\r\nb"'), "ab"); +assert.sameValue(eval('"a\\\u2028b"'), "ab"); +assert.sameValue(eval('"a\\\u2029b"'), "ab"); + +/******************************************************************************/ + +print("All tests passed!"); diff --git a/test/staging/sm/expressions/tagged-template-constant-folding.js b/test/staging/sm/expressions/tagged-template-constant-folding.js new file mode 100644 index 0000000000..d3dab1ec3f --- /dev/null +++ b/test/staging/sm/expressions/tagged-template-constant-folding.js @@ -0,0 +1,35 @@ +/* + * Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/licenses/publicdomain/ + */ + +/*--- +includes: [sm/non262-expressions-shell.js, sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +//----------------------------------------------------------------------------- +var BUGNUMBER = 1182373; +var summary = + "Don't let constant-folding in the MemberExpression part of a tagged " + + "template cause an incorrect |this| be passed to the callee"; + +print(BUGNUMBER + ": " + summary); + +/************** + * BEGIN TEST * + **************/ + +var prop = "global"; + +var obj = { prop: "obj", f: function() { return this.prop; } }; + +assert.sameValue(obj.f``, "obj"); +assert.sameValue((true ? obj.f : null)``, "global"); + +/******************************************************************************/ + +print("Tests complete"); diff --git a/test/staging/sm/extensions/8.12.5-01.js b/test/staging/sm/extensions/8.12.5-01.js new file mode 100644 index 0000000000..fe6e219377 --- /dev/null +++ b/test/staging/sm/extensions/8.12.5-01.js @@ -0,0 +1,74 @@ +/* + * Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/licenses/publicdomain/ + */ + +/*--- +includes: [sm/non262-extensions-shell.js, sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +//----------------------------------------------------------------------------- +var BUGNUMBER = 523846; +var summary = + "Assignments to a property that has a getter but not a setter should not " + + "throw a TypeError per ES5 (at least not until strict mode is supported)"; +var actual = "Early failure"; +var expect = "No errors"; + + +printBugNumber(BUGNUMBER); +printStatus(summary); + +var o = { get p() { return "a"; } }; + +function test1() +{ + o.p = "b"; // strict-mode violation here + assert.sameValue(o.p, "a"); +} + +function test2() +{ + function T() {} + T.prototype = o; + y = new T(); + y.p = "b"; // strict-mode violation here + assert.sameValue(y.p, "a"); +} + + +var errors = []; +try +{ + try + { + test1(); + } + catch (e) + { + errors.push(e); + } + + try + { + test2(); + } + catch (e) + { + errors.push(e); + } +} +catch (e) +{ + errors.push("Unexpected error: " + e); +} +finally +{ + actual = errors.length > 0 ? errors.join(", ") : "No errors"; +} + +assert.sameValue(expect, actual, summary); diff --git a/test/staging/sm/extensions/ArrayBuffer-slice-arguments-detaching.js b/test/staging/sm/extensions/ArrayBuffer-slice-arguments-detaching.js new file mode 100644 index 0000000000..698303c08d --- /dev/null +++ b/test/staging/sm/extensions/ArrayBuffer-slice-arguments-detaching.js @@ -0,0 +1,85 @@ +/* + * Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/licenses/publicdomain/ + */ + +/*--- +includes: [sm/non262-extensions-shell.js, sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +var gTestfile = "ArrayBuffer-slice-arguments-detaching.js"; +//----------------------------------------------------------------------------- +var BUGNUMBER = 991981; +var summary = + "ArrayBuffer.prototype.slice shouldn't misbehave horribly if " + + "index-argument conversion detaches the ArrayBuffer being sliced"; + +print(BUGNUMBER + ": " + summary); + +/************** + * BEGIN TEST * + **************/ + +function testStart() +{ + var ab = new ArrayBuffer(0x1000); + + var start = + { + valueOf: function() + { + $262.detachArrayBuffer(ab); + gc(); + return 0x800; + } + }; + + var ok = false; + try + { + ab.slice(start); + } + catch (e) + { + ok = true; + } + assert.sameValue(ok, true, "start weirdness should have thrown"); + assert.sameValue(ab.byteLength, 0, "detaching should work for start weirdness"); +} +testStart(); + +function testEnd() +{ + var ab = new ArrayBuffer(0x1000); + + var end = + { + valueOf: function() + { + $262.detachArrayBuffer(ab); + gc(); + return 0x1000; + } + }; + + var ok = false; + try + { + ab.slice(0x800, end); + } + catch (e) + { + ok = true; + } + assert.sameValue(ok, true, "byteLength weirdness should have thrown"); + assert.sameValue(ab.byteLength, 0, "detaching should work for byteLength weirdness"); +} +testEnd(); + +/******************************************************************************/ + +print("Tests complete"); diff --git a/test/staging/sm/extensions/DataView-construct-arguments-detaching.js b/test/staging/sm/extensions/DataView-construct-arguments-detaching.js new file mode 100644 index 0000000000..a5f9d93a64 --- /dev/null +++ b/test/staging/sm/extensions/DataView-construct-arguments-detaching.js @@ -0,0 +1,85 @@ +/* + * Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/licenses/publicdomain/ + */ + +/*--- +includes: [sm/non262-extensions-shell.js, sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +var gTestfile = "DataView-construct-arguments-detaching.js"; +//----------------------------------------------------------------------------- +var BUGNUMBER = 991981; +var summary = + "new DataView(...) shouldn't misbehave horribly if index-argument " + + "conversion detaches the ArrayBuffer to be viewed"; + +print(BUGNUMBER + ": " + summary); + +/************** + * BEGIN TEST * + **************/ + +function testByteOffset() +{ + var ab = new ArrayBuffer(0x1000); + + var start = + { + valueOf: function() + { + $262.detachArrayBuffer(ab); + gc(); + return 0x800; + } + }; + + var ok = false; + try + { + new DataView(ab, start); + } + catch (e) + { + ok = true; + } + assert.sameValue(ok, true, "byteOffset weirdness should have thrown"); + assert.sameValue(ab.byteLength, 0, "detaching should work for byteOffset weirdness"); +} +testByteOffset(); + +function testByteLength() +{ + var ab = new ArrayBuffer(0x1000); + + var len = + { + valueOf: function() + { + $262.detachArrayBuffer(ab); + gc(); + return 0x800; + } + }; + + var ok = false; + try + { + new DataView(ab, 0x800, len); + } + catch (e) + { + ok = true; + } + assert.sameValue(ok, true, "byteLength weirdness should have thrown"); + assert.sameValue(ab.byteLength, 0, "detaching should work for byteLength weirdness"); +} +testByteLength(); + +/******************************************************************************/ + +print("Tests complete"); diff --git a/test/staging/sm/extensions/DataView-set-arguments-detaching.js b/test/staging/sm/extensions/DataView-set-arguments-detaching.js new file mode 100644 index 0000000000..f44775b359 --- /dev/null +++ b/test/staging/sm/extensions/DataView-set-arguments-detaching.js @@ -0,0 +1,89 @@ +/* + * Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/licenses/publicdomain/ + */ + +/*--- +includes: [sm/non262-extensions-shell.js, sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +var gTestfile = "DataView-set-arguments-detaching.js"; +//----------------------------------------------------------------------------- +var BUGNUMBER = 991981; +var summary = + "DataView.prototype.set* methods shouldn't misbehave horribly if " + + "index-argument conversion detaches the ArrayBuffer being modified"; + +print(BUGNUMBER + ": " + summary); + +/************** + * BEGIN TEST * + **************/ + +function testIndex() +{ + var ab = new ArrayBuffer(0x1000); + + var dv = new DataView(ab); + + var start = + { + valueOf: function() + { + $262.detachArrayBuffer(ab); + gc(); + return 0xFFF; + } + }; + + var ok = false; + try + { + dv.setUint8(start, 0x42); + } + catch (e) + { + ok = true; + } + assert.sameValue(ok, true, "should have thrown"); + assert.sameValue(ab.byteLength, 0, "should have been detached correctly"); +} +testIndex(); + +function testValue() +{ + var ab = new ArrayBuffer(0x100000); + + var dv = new DataView(ab); + + var value = + { + valueOf: function() + { + $262.detachArrayBuffer(ab); + gc(); + return 0x42; + } + }; + + var ok = false; + try + { + dv.setUint8(0xFFFFF, value); + } + catch (e) + { + ok = true; + } + assert.sameValue(ok, true, "should have thrown"); + assert.sameValue(ab.byteLength, 0, "should have been detached correctly"); +} +testValue(); + +/******************************************************************************/ + +print("Tests complete"); diff --git a/test/staging/sm/extensions/RegExp-error-message-skip-selfhosted-frames.js b/test/staging/sm/extensions/RegExp-error-message-skip-selfhosted-frames.js new file mode 100644 index 0000000000..64278cfdfc --- /dev/null +++ b/test/staging/sm/extensions/RegExp-error-message-skip-selfhosted-frames.js @@ -0,0 +1,19 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-extensions-shell.js, sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +for (let name of ["test", Symbol.match, Symbol.replace, Symbol.search]) { + let methodName = typeof name === "symbol" ? `[${name.description}]` : name; + assertThrowsInstanceOfWithMessage( + () => RegExp.prototype[name].call({}), + TypeError, + `${methodName} method called on incompatible Object`); +} + diff --git a/test/staging/sm/extensions/String-match-flags.js b/test/staging/sm/extensions/String-match-flags.js new file mode 100644 index 0000000000..fd300bd702 --- /dev/null +++ b/test/staging/sm/extensions/String-match-flags.js @@ -0,0 +1,36 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-extensions-shell.js, sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +var BUGNUMBER = 1263139; +var summary = "String.prototype.match with non-string non-standard flags argument."; + +print(BUGNUMBER + ": " + summary); + +var called; +var flags = { + toString() { + called = true; + return ""; + } +}; + +called = false; +"a".match("a", flags); +assert.sameValue(called, false); + +called = false; +"a".search("a", flags); +assert.sameValue(called, false); + +called = false; +"a".replace("a", "b", flags); +assert.sameValue(called, false); + diff --git a/test/staging/sm/extensions/TypedArray-set-object-funky-length-detaches.js b/test/staging/sm/extensions/TypedArray-set-object-funky-length-detaches.js new file mode 100644 index 0000000000..5e81a4d8dc --- /dev/null +++ b/test/staging/sm/extensions/TypedArray-set-object-funky-length-detaches.js @@ -0,0 +1,60 @@ +/* + * Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/licenses/publicdomain/ + */ + +/*--- +includes: [sm/non262-extensions-shell.js, sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +var gTestfile = "set-object-funky-length-detaches.js"; +//----------------------------------------------------------------------------- +var BUGNUMBER = 991981; +var summary = + "%TypedArray%.prototype.set(object w/funky length property, offset) " + + "shouldn't misbehave if the funky length property detaches this typed " + + "array's buffer"; + +print(BUGNUMBER + ": " + summary); + +/************** + * BEGIN TEST * + **************/ + +var ctors = [Int8Array, Uint8Array, Uint8ClampedArray, + Int16Array, Uint16Array, + Int32Array, Uint32Array, + Float32Array, Float64Array]; +ctors.forEach(function(TypedArray) { + var buf = new ArrayBuffer(512 * 1024); + var ta = new TypedArray(buf); + + var arraylike = + { + 0: 17, + 1: 42, + 2: 3, + 3: 99, + 4: 37, + 5: 9, + 6: 72, + 7: 31, + 8: 22, + 9: 0, + get length() + { + $262.detachArrayBuffer(buf); + return 10; + } + }; + + ta.set(arraylike, 0x1234); +}); + +/******************************************************************************/ + +print("Tests complete"); diff --git a/test/staging/sm/extensions/TypedArray-subarray-arguments-detaching.js b/test/staging/sm/extensions/TypedArray-subarray-arguments-detaching.js new file mode 100644 index 0000000000..e91070d473 --- /dev/null +++ b/test/staging/sm/extensions/TypedArray-subarray-arguments-detaching.js @@ -0,0 +1,116 @@ +/* + * Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/licenses/publicdomain/ + */ + +/*--- +includes: [sm/non262-extensions-shell.js, sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +var gTestfile = "TypedArray-subarray-arguments-detaching.js"; +//----------------------------------------------------------------------------- +var BUGNUMBER = 991981; +var summary = + "%TypedArray.prototype.subarray shouldn't misbehave horribly if " + + "index-argument conversion detaches the underlying ArrayBuffer"; + +print(BUGNUMBER + ": " + summary); + +/************** + * BEGIN TEST * + **************/ + +function testBegin() +{ + var ab = new ArrayBuffer(0x1000); + + var begin = + { + valueOf: function() + { + $262.detachArrayBuffer(ab); + return 0x800; + } + }; + + var ta = new Uint8Array(ab); + + var ok = false; + try + { + ta.subarray(begin); + } + catch (e) + { + ok = true; + } + assert.sameValue(ok, true, "start weirdness should have thrown"); + assert.sameValue(ab.byteLength, 0, "detaching should work for start weirdness"); +} +testBegin(); + +function testBeginWithEnd() +{ + var ab = new ArrayBuffer(0x1000); + + var begin = + { + valueOf: function() + { + $262.detachArrayBuffer(ab); + return 0x800; + } + }; + + var ta = new Uint8Array(ab); + + var ok = false; + try + { + ta.subarray(begin, 0x1000); + } + catch (e) + { + ok = true; + } + assert.sameValue(ok, true, "start weirdness should have thrown"); + assert.sameValue(ab.byteLength, 0, "detaching should work for start weirdness"); +} +testBeginWithEnd(); + +function testEnd() +{ + var ab = new ArrayBuffer(0x1000); + + var end = + { + valueOf: function() + { + $262.detachArrayBuffer(ab); + return 0x1000; + } + }; + + var ta = new Uint8Array(ab); + + var ok = false; + try + { + ta.subarray(0x800, end); + } + catch (e) + { + ok = true; + } + assert.sameValue(ok, true, "start weirdness should have thrown"); + assert.sameValue(ab.byteLength, 0, "detaching should work for start weirdness"); +} +testEnd(); + +/******************************************************************************/ + +print("Tests complete"); diff --git a/test/staging/sm/extensions/__proto__.js b/test/staging/sm/extensions/__proto__.js new file mode 100644 index 0000000000..c9f7f9177f --- /dev/null +++ b/test/staging/sm/extensions/__proto__.js @@ -0,0 +1,58 @@ +/* + * Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/licenses/publicdomain/ + */ + +/*--- +includes: [sm/non262-extensions-shell.js, sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +var gTestfile = '__proto__.js'; +var BUGNUMBER = 770344; +var summary = "__proto__ as accessor"; + +print(BUGNUMBER + ": " + summary); + +/************** + * BEGIN TEST * + **************/ + +var protoDesc = Object.getOwnPropertyDescriptor(Object.prototype, "__proto__"); +assert.sameValue(protoDesc !== null, true); +assert.sameValue(typeof protoDesc, "object"); +assert.sameValue(protoDesc.hasOwnProperty("get"), true); +assert.sameValue(protoDesc.hasOwnProperty("set"), true); +assert.sameValue(protoDesc.hasOwnProperty("enumerable"), true); +assert.sameValue(protoDesc.hasOwnProperty("configurable"), true); +assert.sameValue(protoDesc.hasOwnProperty("value"), false); +assert.sameValue(protoDesc.hasOwnProperty("writable"), false); + +assert.sameValue(protoDesc.configurable, true); +assert.sameValue(protoDesc.enumerable, false); +assert.sameValue(typeof protoDesc.get, "function", protoDesc.get + ""); +assert.sameValue(typeof protoDesc.set, "function", protoDesc.set + ""); + +assert.sameValue(delete Object.prototype.__proto__, true); +assert.sameValue(Object.getOwnPropertyDescriptor(Object.prototype, "__proto__"), + undefined); + +var obj = {}; +obj.__proto__ = 5; +assert.sameValue(Object.getPrototypeOf(obj), Object.prototype); +assert.sameValue(obj.hasOwnProperty("__proto__"), true); + +var desc = Object.getOwnPropertyDescriptor(obj, "__proto__"); +assert.sameValue(desc !== null, true); +assert.sameValue(typeof desc, "object"); +assert.sameValue(desc.value, 5); +assert.sameValue(desc.writable, true); +assert.sameValue(desc.enumerable, true); +assert.sameValue(desc.configurable, true); + +/******************************************************************************/ + +print("Tests complete"); diff --git a/test/staging/sm/extensions/arguments-property-access-in-function.js b/test/staging/sm/extensions/arguments-property-access-in-function.js new file mode 100644 index 0000000000..1ae6d2d9b9 --- /dev/null +++ b/test/staging/sm/extensions/arguments-property-access-in-function.js @@ -0,0 +1,61 @@ +/* + * Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/licenses/publicdomain/ + */ + +/*--- +includes: [sm/non262-extensions-shell.js, sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +//----------------------------------------------------------------------------- +var BUGNUMBER = 721322; +var summary = + 'f.arguments must trigger an arguments object in non-strict mode functions'; + +print(BUGNUMBER + ": " + summary); + +/************** + * BEGIN TEST * + **************/ + +var obj = + { + test: function() + { + var args = obj.test.arguments; + assert.sameValue(args !== null, true); + assert.sameValue(args[0], 5); + assert.sameValue(args[1], undefined); + assert.sameValue(args.length, 2); + } + }; +obj.test(5, undefined); + +var sobj = + { + test: function() + { + "use strict"; + + try + { + var args = sobj.test.arguments; + throw new Error("access to arguments property of strict mode " + + "function didn't throw"); + } + catch (e) + { + assert.sameValue(e instanceof TypeError, true, + "should have thrown TypeError, instead got: " + e); + } + } + }; +sobj.test(5, undefined); + +/******************************************************************************/ + +print("Tests complete"); diff --git a/test/staging/sm/extensions/array-inherited-__proto__.js b/test/staging/sm/extensions/array-inherited-__proto__.js new file mode 100644 index 0000000000..166786fcf4 --- /dev/null +++ b/test/staging/sm/extensions/array-inherited-__proto__.js @@ -0,0 +1,37 @@ +/* + * Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/licenses/publicdomain/ + */ + +/*--- +includes: [sm/non262-extensions-shell.js, sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +var gTestfile = 'array-inherited-__proto__.js'; +var BUGNUMBER = 769041; +var summary = + "The [[Prototype]] of an object whose prototype chain contains an array " + + "isn't that array's [[Prototype]]"; + +print(BUGNUMBER + ": " + summary); + +/************** + * BEGIN TEST * + **************/ + +var arr = []; +assert.sameValue(Array.isArray(arr), true); +var objWithArrPrototype = Object.create(arr); +assert.sameValue(!Array.isArray(objWithArrPrototype), true); +assert.sameValue(objWithArrPrototype.__proto__, arr); +var objWithArrGrandPrototype = Object.create(objWithArrPrototype); +assert.sameValue(!Array.isArray(objWithArrGrandPrototype), true); +assert.sameValue(objWithArrGrandPrototype.__proto__, objWithArrPrototype); + +/******************************************************************************/ + +print("Tests complete"); diff --git a/test/staging/sm/extensions/array-length-protochange.js b/test/staging/sm/extensions/array-length-protochange.js new file mode 100644 index 0000000000..e4965fa67b --- /dev/null +++ b/test/staging/sm/extensions/array-length-protochange.js @@ -0,0 +1,42 @@ +/* + * Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/licenses/publicdomain/ + */ + +/*--- +includes: [sm/non262-extensions-shell.js, sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +//----------------------------------------------------------------------------- +var BUGNUMBER = 548671; +var summary = + "Don't use a shared-permanent inherited property to implement " + + "[].length or (function(){}).length"; + +print(BUGNUMBER + ": " + summary); + +/************** + * BEGIN TEST * + **************/ + +var a = [1, 2, 3]; +a.__proto__ = null; +assert.sameValue("length" in a, true, "length should be own property of array"); +assert.sameValue(Object.hasOwnProperty.call(a, "length"), true, + "length should be own property of array"); +assert.sameValue(a.length, 3, "array length should be 3"); + +var a = [], b = []; +b.__proto__ = a; +assert.sameValue(b.hasOwnProperty("length"), true, + "length should be own property of array"); +b.length = 42; +assert.sameValue(b.length, 42, "should have mutated b's (own) length"); +assert.sameValue(a.length, 0, "should not have mutated a's (own) length"); + + +print("All tests passed!"); diff --git a/test/staging/sm/extensions/array-pop-proxy.js b/test/staging/sm/extensions/array-pop-proxy.js new file mode 100644 index 0000000000..87959ed531 --- /dev/null +++ b/test/staging/sm/extensions/array-pop-proxy.js @@ -0,0 +1,29 @@ +/* + * Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/licenses/publicdomain/ + */ + +/*--- +includes: [sm/non262-extensions-shell.js, sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +var gTestfile = 'array-pop-proxy.js'; +var BUGNUMBER = 858381; +var summary = "Behavior of [].pop on proxies"; + +print(BUGNUMBER + ": " + summary); + +/************** + * BEGIN TEST * + **************/ + +var p = new Proxy([0, 1, 2], {}); +Array.prototype.pop.call(p); + +/******************************************************************************/ + +print("Tests complete"); diff --git a/test/staging/sm/extensions/arraybuffer-prototype.js b/test/staging/sm/extensions/arraybuffer-prototype.js new file mode 100644 index 0000000000..6e8c28a13a --- /dev/null +++ b/test/staging/sm/extensions/arraybuffer-prototype.js @@ -0,0 +1,37 @@ +/* + * Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/licenses/publicdomain/ + */ + +/*--- +includes: [sm/non262-extensions-shell.js, sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +//----------------------------------------------------------------------------- +var BUGNUMBER = 665961; +var summary = + "ArrayBuffer cannot access properties defined on the prototype chain."; +print(BUGNUMBER + ": " + summary); + +/************** + * BEGIN TEST * + **************/ + +ArrayBuffer.prototype.prop = "on prototype"; +var b = new ArrayBuffer([]); +assert.sameValue(b.prop, "on prototype"); + +var c = new ArrayBuffer([]); +assert.sameValue(c.prop, "on prototype"); +c.prop = "direct"; +assert.sameValue(c.prop, "direct"); + +assert.sameValue(ArrayBuffer.prototype.prop, "on prototype"); +assert.sameValue(new ArrayBuffer([]).prop, "on prototype"); + +assert.sameValue(c.nonexistent, undefined); + diff --git a/test/staging/sm/extensions/bug472534.js b/test/staging/sm/extensions/bug472534.js new file mode 100644 index 0000000000..3821e18ea3 --- /dev/null +++ b/test/staging/sm/extensions/bug472534.js @@ -0,0 +1,39 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-extensions-shell.js, sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +function monthNames () { + return [ + /jan(uar(y)?)?/, 0, + /feb(ruar(y)?)?/, 1, + /m\u00e4r|mar|m\u00e4rz|maerz|march/, 2, + /apr(il)?/, 3, + /ma(i|y)/, 4, + /jun(i|o|e)?/, 5, + /jul(i|y)?/, 6, + /aug(ust)?/, 7, + /sep((t)?(ember))?/, 8, + /o(c|k)t(ober)?/, 9, + /nov(ember)?/, 10, + /de(c|z)(ember)?/, 11 + ]; +}; + +var actual = ''; +var expected = '(jan(uar(y)?)?)|(feb(ruar(y)?)?)|(m\\u00e4r|mar|m\\u00e4rz|maerz|march)|(apr(il)?)|(ma(i|y))|(jun(i|o|e)?)|(jul(i|y)?)|(aug(ust)?)|(sep((t)?(ember))?)|(o(c|k)t(ober)?)|(nov(ember)?)|(de(c|z)(ember)?)'; +var mn = monthNames(); +for (var i = 0; i < mn.length; ++i) { + if (actual) + actual += '|'; + actual += '(' + mn[i++].source + ')'; +} + +assert.sameValue(actual, expected); + diff --git a/test/staging/sm/extensions/builtin-function-arguments-caller.js b/test/staging/sm/extensions/builtin-function-arguments-caller.js new file mode 100644 index 0000000000..dc1314a283 --- /dev/null +++ b/test/staging/sm/extensions/builtin-function-arguments-caller.js @@ -0,0 +1,65 @@ +/* + * Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/licenses/publicdomain/ + */ + +/*--- +includes: [sm/non262-extensions-shell.js, sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +var gTestfile = 'builtin-function-arguments-caller.js'; +var BUGNUMBER = 929642; +var summary = + "Built-in functions defined in ECMAScript pick up arguments/caller " + + "properties from Function.prototype"; + +print(BUGNUMBER + ": " + summary); + +/************** + * BEGIN TEST * + **************/ + +function expectNoProperty(obj, prop) +{ + var desc = Object.getOwnPropertyDescriptor(obj, prop); + assert.sameValue(desc, undefined, + "should be no '" + prop + "' property on " + obj); +} + +// Test a builtin that's native. +expectNoProperty(Object, "arguments"); +expectNoProperty(Object, "caller"); + +// Also test a builtin that's self-hosted. +expectNoProperty(Array.prototype.indexOf, "arguments"); +expectNoProperty(Array.prototype.indexOf, "caller"); + +// Test the Function construct for good measure, because it's so intricately +// invovled in bootstrapping. +expectNoProperty(Function, "arguments"); +expectNoProperty(Function, "caller"); + +var argsDesc = Object.getOwnPropertyDescriptor(Function.prototype, "arguments"); +var callerDesc = Object.getOwnPropertyDescriptor(Function.prototype, "caller"); + +var argsGet = argsDesc.get, argsSet = argsDesc.set; + +expectNoProperty(argsGet, "arguments"); +expectNoProperty(argsGet, "caller"); +expectNoProperty(argsSet, "arguments"); +expectNoProperty(argsSet, "caller"); + +var callerGet = callerDesc.get, callerSet = callerDesc.set; + +expectNoProperty(callerGet, "arguments"); +expectNoProperty(callerGet, "caller"); +expectNoProperty(callerSet, "arguments"); +expectNoProperty(callerSet, "caller"); + +/******************************************************************************/ + +print("Tests complete"); diff --git a/test/staging/sm/extensions/censor-strict-caller.js b/test/staging/sm/extensions/censor-strict-caller.js new file mode 100644 index 0000000000..bb242a9338 --- /dev/null +++ b/test/staging/sm/extensions/censor-strict-caller.js @@ -0,0 +1,22 @@ +/* + * Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/licenses/publicdomain/ + */ + +/*--- +includes: [sm/non262-extensions-shell.js, sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ + +function nonstrict() { return nonstrict.caller; } +function strict() { "use strict"; return nonstrict(); } + +assert.sameValue(strict(), null); + +/******************************************************************************/ + +print("All tests passed!"); diff --git a/test/staging/sm/extensions/clone-v1-typed-array-data.dat b/test/staging/sm/extensions/clone-v1-typed-array-data.dat new file mode 100644 index 0000000000..9ced341009 --- /dev/null +++ b/test/staging/sm/extensions/clone-v1-typed-array-data.dat @@ -0,0 +1,32 @@ +var captured = []; +captured[0] = serialize(0); captured[0].clonebuffer = String.fromCharCode(0, 0, 0, 0, 9, 0, 255, 255); +captured[1] = serialize(0); captured[1].clonebuffer = String.fromCharCode(7, 0, 0, 0, 9, 0, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0); +captured[2] = (new TypeError("unsupported type for structured data", "js1_8_5/extensions/clone-v1-typed-array.js", 19)); +captured[3] = serialize(0); captured[3].clonebuffer = String.fromCharCode(0, 0, 0, 0, 0, 1, 255, 255); +captured[4] = serialize(0); captured[4].clonebuffer = String.fromCharCode(100, 0, 0, 0, 0, 1, 255, 255, 1, 7, 49, 87, 97, 167, 145, 247, 193, 71, 241, 151, 33, 231, 81, 55, 129, 135, 177, 216, 224, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0); +captured[5] = (new TypeError("unsupported type for structured data", "js1_8_5/extensions/clone-v1-typed-array.js", 19)); +captured[6] = serialize(0); captured[6].clonebuffer = String.fromCharCode(0, 0, 0, 0, 1, 1, 255, 255); +captured[7] = serialize(0); captured[7].clonebuffer = String.fromCharCode(100, 0, 0, 0, 1, 1, 255, 255, 1, 7, 49, 87, 97, 167, 145, 247, 193, 71, 241, 151, 33, 231, 81, 55, 129, 135, 177, 216, 224, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0); +captured[8] = (new TypeError("unsupported type for structured data", "js1_8_5/extensions/clone-v1-typed-array.js", 19)); +captured[9] = serialize(0); captured[9].clonebuffer = String.fromCharCode(0, 0, 0, 0, 2, 1, 255, 255); +captured[10] = serialize(0); captured[10].clonebuffer = String.fromCharCode(100, 0, 0, 0, 2, 1, 255, 255, 1, 0, 7, 0, 49, 0, 87, 1, 97, 9, 167, 65, 145, 203, 247, 144, 193, 246, 71, 191, 241, 58, 151, 156, 33, 72, 231, 248, 81, 206, 55, 164, 129, 125, 135, 110, 177, 5, 216, 39, 224, 22, 0, 160, 0, 96, 0, 160, 0, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0); +captured[11] = (new TypeError("unsupported type for structured data", "js1_8_5/extensions/clone-v1-typed-array.js", 19)); +captured[12] = serialize(0); captured[12].clonebuffer = String.fromCharCode(0, 0, 0, 0, 3, 1, 255, 255); +captured[13] = serialize(0); captured[13].clonebuffer = String.fromCharCode(100, 0, 0, 0, 3, 1, 255, 255, 1, 0, 7, 0, 49, 0, 87, 1, 97, 9, 167, 65, 145, 203, 247, 144, 193, 246, 71, 191, 241, 58, 151, 156, 33, 72, 231, 248, 81, 206, 55, 164, 129, 125, 135, 110, 177, 5, 216, 39, 224, 22, 0, 160, 0, 96, 0, 160, 0, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0); +captured[14] = (new TypeError("unsupported type for structured data", "js1_8_5/extensions/clone-v1-typed-array.js", 19)); +captured[15] = serialize(0); captured[15].clonebuffer = String.fromCharCode(0, 0, 0, 0, 4, 1, 255, 255); +captured[16] = serialize(0); captured[16].clonebuffer = String.fromCharCode(100, 0, 0, 0, 4, 1, 255, 255, 1, 0, 0, 0, 7, 0, 0, 0, 49, 0, 0, 0, 87, 1, 0, 0, 97, 9, 0, 0, 167, 65, 0, 0, 145, 203, 1, 0, 247, 144, 12, 0, 193, 246, 87, 0, 71, 191, 103, 2, 241, 58, 214, 16, 151, 156, 219, 117, 33, 72, 1, 57, 231, 248, 8, 143, 81, 206, 62, 233, 55, 164, 183, 96, 129, 125, 5, 165, 135, 110, 38, 131, 177, 5, 13, 150, 216, 39, 91, 26, 224, 22, 126, 184, 0, 160, 114, 11, 0, 96, 34, 80, 0, 160, 240, 48, 0, 128, 148, 86, 0, 0, 16, 94, 0, 0, 112, 146, 0, 0, 0, 1, 0, 0, 0, 8, 0, 0, 0, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0); +captured[17] = (new TypeError("unsupported type for structured data", "js1_8_5/extensions/clone-v1-typed-array.js", 19)); +captured[18] = serialize(0); captured[18].clonebuffer = String.fromCharCode(0, 0, 0, 0, 5, 1, 255, 255); +captured[19] = serialize(0); captured[19].clonebuffer = String.fromCharCode(100, 0, 0, 0, 5, 1, 255, 255, 1, 0, 0, 0, 7, 0, 0, 0, 49, 0, 0, 0, 87, 1, 0, 0, 97, 9, 0, 0, 167, 65, 0, 0, 145, 203, 1, 0, 247, 144, 12, 0, 193, 246, 87, 0, 71, 191, 103, 2, 241, 58, 214, 16, 151, 156, 219, 117, 33, 72, 1, 57, 231, 248, 8, 143, 81, 206, 62, 233, 55, 164, 183, 96, 129, 125, 5, 165, 135, 110, 38, 131, 177, 5, 13, 150, 216, 39, 91, 26, 224, 22, 126, 184, 0, 160, 114, 11, 0, 96, 34, 80, 0, 160, 240, 48, 0, 128, 148, 86, 0, 0, 16, 94, 0, 0, 112, 146, 0, 0, 0, 1, 0, 0, 0, 8, 0, 0, 0, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0); +captured[20] = (new TypeError("unsupported type for structured data", "js1_8_5/extensions/clone-v1-typed-array.js", 19)); +captured[21] = serialize(0); captured[21].clonebuffer = String.fromCharCode(0, 0, 0, 0, 6, 1, 255, 255); +captured[22] = serialize(0); captured[22].clonebuffer = String.fromCharCode(100, 0, 0, 0, 6, 1, 255, 255, 0, 0, 128, 63, 0, 0, 224, 64, 0, 0, 68, 66, 0, 128, 171, 67, 0, 16, 22, 69, 0, 78, 131, 70, 128, 200, 229, 71, 112, 15, 73, 73, 130, 237, 175, 74, 210, 239, 25, 76, 216, 177, 134, 77, 57, 183, 235, 78, 82, 64, 78, 80, 72, 120, 180, 81, 63, 233, 29, 83, 23, 44, 138, 84, 40, 205, 241, 85, 131, 147, 83, 87, 19, 33, 185, 88, 240, 252, 33, 90, 82, 189, 141, 91, 80, 11, 248, 92, 230, 9, 89, 94, 169, 232, 189, 95, 148, 43, 38, 97, 34, 102, 145, 98, 187, 114, 254, 99, 100, 164, 94, 101, 215, 207, 194, 102, 220, 117, 42, 104, 33, 39, 149, 105, 61, 130, 2, 107, 234, 99, 100, 108, 109, 215, 199, 109, 127, 220, 46, 111, 239, 0, 153, 112, 209, 224, 5, 114, 110, 73, 106, 115, 65, 0, 205, 116, 57, 96, 51, 118, 49, 244, 156, 119, 171, 85, 9, 121, 236, 85, 112, 122, 46, 75, 210, 123, 200, 1, 56, 125, 143, 1, 161, 126, 0, 0, 128, 127, 0, 0, 128, 127, 0, 0, 128, 127, 0, 0, 128, 127, 0, 0, 128, 127, 0, 0, 128, 127, 0, 0, 128, 127, 0, 0, 128, 127, 0, 0, 128, 127, 0, 0, 128, 127, 0, 0, 128, 127, 0, 0, 128, 127, 0, 0, 128, 127, 0, 0, 128, 127, 0, 0, 128, 127, 0, 0, 128, 127, 0, 0, 128, 127, 0, 0, 128, 127, 0, 0, 128, 127, 0, 0, 128, 127, 0, 0, 128, 127, 0, 0, 128, 127, 0, 0, 128, 127, 0, 0, 128, 127, 0, 0, 128, 127, 0, 0, 128, 127, 0, 0, 128, 127, 0, 0, 128, 127, 0, 0, 128, 127, 0, 0, 128, 127, 0, 0, 128, 127, 0, 0, 128, 127, 0, 0, 128, 127, 0, 0, 128, 127, 0, 0, 128, 127, 0, 0, 128, 127, 0, 0, 128, 127, 0, 0, 128, 127, 0, 0, 128, 127, 0, 0, 128, 127, 0, 0, 128, 127, 0, 0, 128, 127, 0, 0, 128, 127, 0, 0, 128, 127, 0, 0, 128, 127, 0, 0, 128, 127, 0, 0, 128, 127, 0, 0, 128, 127, 0, 0, 128, 127, 0, 0, 128, 127, 0, 0, 128, 127, 0, 0, 128, 127, 0, 0, 128, 127, 0, 0, 192, 127); +captured[23] = (new TypeError("unsupported type for structured data", "js1_8_5/extensions/clone-v1-typed-array.js", 19)); +captured[24] = serialize(0); captured[24].clonebuffer = String.fromCharCode(0, 0, 0, 0, 7, 1, 255, 255); +captured[25] = serialize(0); captured[25].clonebuffer = String.fromCharCode(100, 0, 0, 0, 7, 1, 255, 255, 0, 0, 0, 0, 0, 0, 240, 63, 0, 0, 0, 0, 0, 0, 28, 64, 0, 0, 0, 0, 0, 128, 72, 64, 0, 0, 0, 0, 0, 112, 117, 64, 0, 0, 0, 0, 0, 194, 162, 64, 0, 0, 0, 0, 192, 105, 208, 64, 0, 0, 0, 0, 16, 185, 252, 64, 0, 0, 0, 0, 238, 33, 41, 65, 0, 0, 0, 64, 176, 253, 85, 65, 0, 0, 0, 56, 250, 61, 131, 65, 0, 0, 0, 241, 58, 214, 176, 65, 0, 0, 192, 37, 231, 118, 221, 65, 0, 0, 8, 65, 10, 200, 9, 66, 0, 0, 231, 248, 8, 143, 54, 66, 0, 32, 202, 217, 39, 189, 99, 66, 0, 220, 144, 222, 130, 69, 145, 66, 0, 129, 125, 5, 165, 57, 190, 66, 224, 208, 205, 100, 112, 114, 234, 66, 196, 22, 52, 88, 34, 36, 23, 67, 236, 147, 45, 13, 158, 63, 68, 67, 110, 225, 135, 75, 170, 183, 113, 67, 128, 202, 45, 4, 106, 1, 159, 67, 48, 17, 168, 195, 60, 33, 203, 67, 10, 15, 51, 43, 21, 189, 247, 67, 41, 173, 204, 133, 114, 197, 36, 68, 132, 23, 19, 53, 196, 44, 82, 68, 39, 105, 225, 92, 87, 206, 127, 68, 2, 60, 69, 113, 140, 212, 171, 68, 130, 148, 28, 227, 250, 89, 216, 68, 242, 1, 185, 134, 187, 78, 5, 69, 180, 225, 225, 21, 228, 164, 50, 69, 126, 165, 37, 147, 71, 80, 96, 69, 156, 225, 129, 65, 125, 140, 140, 69, 104, 165, 81, 153, 237, 250, 184, 69, 187, 112, 39, 230, 143, 219, 229, 69, 164, 130, 98, 233, 29, 32, 19, 70, 80, 50, 54, 44, 26, 188, 64, 70, 12, 216, 94, 205, 45, 73, 109, 70, 10, 253, 178, 19, 8, 160, 153, 70, 105, 157, 60, 17, 7, 108, 198, 70, 188, 9, 21, 47, 134, 158, 243, 70, 132, 104, 50, 105, 181, 42, 33, 71, 231, 54, 24, 120, 189, 10, 78, 71, 10, 48, 21, 201, 101, 73, 122, 71, 9, 138, 242, 15, 57, 0, 167, 71, 200, 56, 244, 237, 49, 32, 212, 71, 175, 177, 53, 176, 43, 156, 1, 72, 242, 246, 93, 116, 76, 209, 46, 72, 20, 56, 210, 229, 34, 247, 90, 72, 18, 241, 23, 137, 62, 152, 135, 72, 240, 242, 244, 183, 54, 165, 180, 72, 146, 84, 246, 224, 143, 16, 226, 72, 0, 20, 175, 201, 251, 156, 15, 73, 128, 49, 121, 80, 92, 169, 59, 73, 80, 11, 106, 198, 48, 52, 104, 73, 230, 201, 156, 173, 170, 45, 149, 73, 169, 48, 233, 87, 245, 135, 194, 73, 148, 10, 236, 172, 246, 54, 240, 73, 131, 18, 157, 174, 47, 96, 28, 74, 51, 112, 201, 184, 41, 212, 72, 74, 45, 66, 176, 129, 164, 185, 117, 74, 231, 57, 122, 241, 111, 2, 163, 74, 170, 242, 74, 243, 33, 162, 208, 74, 170, 40, 195, 105, 187, 27, 253, 74, 149, 195, 138, 252, 67, 120, 41, 75, 34, 107, 249, 124, 59, 73, 86, 75, 190, 61, 90, 13, 20, 128, 131, 75, 6, 246, 174, 139, 17, 16, 177, 75, 138, 46, 114, 180, 30, 220, 221, 75, 185, 232, 227, 221, 154, 32, 10, 76, 162, 107, 39, 130, 135, 220, 54, 76, 46, 126, 226, 145, 246, 0, 100, 76, 104, 46, 166, 191, 215, 128, 145, 76, 54, 209, 98, 143, 121, 161, 190, 76, 15, 119, 118, 93, 74, 205, 234, 76, 45, 168, 199, 17, 161, 115, 23, 77, 39, 179, 142, 239, 44, 133, 68, 77, 194, 220, 156, 81, 135, 244, 113, 77, 84, 130, 210, 206, 236, 107, 159, 77, 10, 50, 248, 52, 111, 126, 203, 77, 201, 43, 89, 78, 161, 14, 248, 77, 80, 6, 142, 36, 205, 12, 37, 78, 134, 69, 252, 127, 51, 107, 82, 78, 213, 188, 252, 15, 205, 29, 128, 78, 117, 74, 250, 219, 38, 52, 172, 78, 38, 1, 123, 0, 162, 173, 216, 78, 1, 161, 107, 192, 237, 151, 5, 79, 225, 44, 94, 8, 240, 228, 50, 79, 69, 103, 82, 7, 82, 136, 96, 79, 185, 52, 208, 140, 143, 238, 140, 79, 34, 46, 54, 155, 189, 80, 185, 79, 94, 104, 207, 231, 165, 38, 230, 79, 82, 123, 213, 42, 209, 97, 19, 80, 232, 203, 122, 5, 151, 245, 64, 80, 214, 228, 150, 73, 200, 173, 109, 80, 59, 8, 100, 64, 15, 248, 153, 80, 52, 135, 87, 88, 13, 185, 198, 80, 78, 150, 76, 173, 235, 225, 243, 80, 132, 3, 163, 55, 174, 101, 33, 81, 0, 0, 0, 0, 0, 0, 248, 127); +captured[26] = (new TypeError("unsupported type for structured data", "js1_8_5/extensions/clone-v1-typed-array.js", 19)); +captured[27] = serialize(0); captured[27].clonebuffer = String.fromCharCode(0, 0, 0, 0, 8, 1, 255, 255); +captured[28] = serialize(0); captured[28].clonebuffer = String.fromCharCode(100, 0, 0, 0, 8, 1, 255, 255, 1, 7, 49, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 0, 0, 0, 0, 0); +captured[29] = (new TypeError("unsupported type for structured data", "js1_8_5/extensions/clone-v1-typed-array.js", 19)); +captured[30] = serialize(0); captured[30].clonebuffer = String.fromCharCode(0, 0, 0, 0, 7, 0, 255, 255, 0, 0, 0, 0, 3, 0, 255, 255, 3, 0, 0, 0, 0, 1, 255, 255, 0, 1, 2, 0, 0, 0, 0, 0, 1, 0, 0, 0, 3, 0, 255, 255, 3, 0, 0, 0, 0, 1, 255, 255, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255); diff --git a/test/staging/sm/extensions/cross-global-eval-is-indirect.js b/test/staging/sm/extensions/cross-global-eval-is-indirect.js new file mode 100644 index 0000000000..65f95e6f51 --- /dev/null +++ b/test/staging/sm/extensions/cross-global-eval-is-indirect.js @@ -0,0 +1,66 @@ +/* + * Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/licenses/publicdomain/ + */ + +/*--- +includes: [sm/non262-extensions-shell.js, sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +info: | + needs newGlobal() +description: | + pending +esid: pending +---*/ +//----------------------------------------------------------------------------- +var BUGNUMBER = 608473; +var summary = + '|var eval = otherWindow.eval; eval(...)| should behave like indirectly ' + + 'calling that eval from a script in that other window'; + +print(BUGNUMBER + ": " + summary); + +/************** + * BEGIN TEST * + **************/ + +var originalEval = eval; +var res; + +function f() +{ + return [this, eval("this")]; +} + +var otherGlobalSameCompartment = createNewGlobal("same-compartment"); + +eval = otherGlobalSameCompartment.eval; +res = new f(); +assert.sameValue(res[0] !== res[1], true); +assert.sameValue(res[0] !== this, true); +assert.sameValue(res[0] instanceof f, true); +assert.sameValue(res[1], otherGlobalSameCompartment); + +res = f(); +assert.sameValue(res[0] !== res[1], true); +assert.sameValue(res[0], this); +assert.sameValue(res[1], otherGlobalSameCompartment); + +var otherGlobalDifferentCompartment = createNewGlobal(); + +eval = otherGlobalDifferentCompartment.eval; +res = new f(); +assert.sameValue(res[0] !== res[1], true); +assert.sameValue(res[0] !== this, true); +assert.sameValue(res[0] instanceof f, true); +assert.sameValue(res[1], otherGlobalDifferentCompartment); + +res = f(); +assert.sameValue(res[0] !== res[1], true); +assert.sameValue(res[0], this); +assert.sameValue(res[1], otherGlobalDifferentCompartment); + +/******************************************************************************/ + +print("All tests passed!"); diff --git a/test/staging/sm/extensions/dataview.js b/test/staging/sm/extensions/dataview.js new file mode 100644 index 0000000000..a55a8891d7 --- /dev/null +++ b/test/staging/sm/extensions/dataview.js @@ -0,0 +1,1662 @@ +/* + * Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/licenses/publicdomain/ + */ + +/*--- +includes: [sm/non262-extensions-shell.js, sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +//------------------------------------------------------------------------------ +var BUGNUMBER = 575688; +var summary = 'DataView tests'; + +function test(sharedMem) { + function die(message, uplevel) { + var e = new Error(message); + var frame = e.stack.split("\n")[uplevel]; + print(message + " at " + frame.split("@")[1]); + print("Stack:\n" + e.stack); + throw(e); + } + + function checkThrow(fun, type) { + var thrown = false; + try { + fun(); + } catch (x) { + thrown = x; + } + + if (!thrown) { + die('no exception thrown, expected ' + type.name, 2); + } else if (!(thrown instanceof type)) { + die('expected ' + type.name + ', got ' + thrown, 2); + } + } + + function checkThrowTODO(fun, type) { + var thrown = false; + try { + fun(); + } catch (x) { + thrown = x; + } + + if (!thrown) { + print('(TODO) no exception thrown, expected ' + type.name); + } else if (!(thrown instanceof type)) { + print('(TODO) expected ' + type.name + ', got ' + thrown); + } else { + print('test unexpectedly passed: expected ' + type.name + ' exception'); + } + } + + function bufferize(u8array) { + if (!sharedMem) + return u8array.buffer; + + let v = new Uint8Array(new SharedArrayBuffer(u8array.buffer.byteLength)); + v.set(u8array); + + // Sanity checking + assert.sameValue(v.buffer instanceof SharedArrayBuffer, true); + assert.sameValue(v.buffer.byteLength, u8array.buffer.byteLength); + assert.sameValue(u8array[0], v[0]); + + return v.buffer; + } + + printBugNumber(BUGNUMBER); + printStatus(summary); + + // testConstructor + buffer = bufferize(new Uint8Array([1, 2])); + checkThrow(() => new DataView(buffer, 0, 3), RangeError); + checkThrow(() => new DataView(buffer, 1, 2), RangeError); + checkThrow(() => new DataView(buffer, 2, 1), RangeError); + checkThrow(() => new DataView(buffer, 2147483649, 0), RangeError); + checkThrow(() => new DataView(buffer, 0, 2147483649), RangeError); + checkThrow(() => new DataView(), TypeError); + checkThrow(() => new DataView(Object.create(new ArrayBuffer(5))), TypeError); + + // testGetMethods + + // testIntegerGets(start=0, length=16) + var data1 = [0,1,2,3,0x64,0x65,0x66,0x67,0x80,0x81,0x82,0x83,252,253,254,255]; + var data1_r = data1.slice().reverse(); + var buffer1 = bufferize(new Uint8Array(data1)); + var view1 = new DataView(buffer1, 0, 16); + view = view1; + assert.sameValue(view.getInt8(0), 0); + assert.sameValue(view.getInt8(8), -128); + assert.sameValue(view.getInt8(15), -1); + assert.sameValue(view.getUint8(0), 0); + assert.sameValue(view.getUint8(8), 128); + assert.sameValue(view.getUint8(15), 255); + // Little endian. + assert.sameValue(view.getInt16(0, true), 256); + assert.sameValue(view.getInt16(5, true), 0x6665); + assert.sameValue(view.getInt16(9, true), -32127); + assert.sameValue(view.getInt16(14, true), -2); + // Big endian. + assert.sameValue(view.getInt16(0), 1); + assert.sameValue(view.getInt16(5), 0x6566); + assert.sameValue(view.getInt16(9), -32382); + assert.sameValue(view.getInt16(14), -257); + // Little endian. + assert.sameValue(view.getUint16(0, true), 256); + assert.sameValue(view.getUint16(5, true), 0x6665); + assert.sameValue(view.getUint16(9, true), 0x8281); + assert.sameValue(view.getUint16(14, true), 0xfffe); + // Big endian. + assert.sameValue(view.getUint16(0), 1); + assert.sameValue(view.getUint16(5), 0x6566); + assert.sameValue(view.getUint16(9), 0x8182); + assert.sameValue(view.getUint16(14), 0xfeff); + // Little endian. + assert.sameValue(view.getInt32(0, true), 0x3020100); + assert.sameValue(view.getInt32(3, true), 0x66656403); + assert.sameValue(view.getInt32(6, true), -2122291354); + assert.sameValue(view.getInt32(9, true), -58490239); + assert.sameValue(view.getInt32(12, true), -66052); + // Big endian. + assert.sameValue(view.getInt32(0), 0x10203); + assert.sameValue(view.getInt32(3), 0x3646566); + assert.sameValue(view.getInt32(6), 0x66678081); + assert.sameValue(view.getInt32(9), -2122152964); + assert.sameValue(view.getInt32(12), -50462977); + // Little endian. + assert.sameValue(view.getUint32(0, true), 0x3020100); + assert.sameValue(view.getUint32(3, true), 0x66656403); + assert.sameValue(view.getUint32(6, true), 0x81806766); + assert.sameValue(view.getUint32(9, true), 0xfc838281); + assert.sameValue(view.getUint32(12, true), 0xfffefdfc); + // Big endian. + assert.sameValue(view.getUint32(0), 0x10203); + assert.sameValue(view.getUint32(3), 0x3646566); + assert.sameValue(view.getUint32(6), 0x66678081); + assert.sameValue(view.getUint32(9), 0x818283fc); + assert.sameValue(view.getUint32(12), 0xfcfdfeff); + + // testFloatGets(start=0) + + // testFloatGet expected=10 + // Little endian + var data2 = [0,0,32,65]; + var data2_r = data2.slice().reverse(); + var buffer2 = bufferize(new Uint8Array(data2)); + view = new DataView(buffer2, 0, 4); + assert.sameValue(view.getFloat32(0, true), 10); + var buffer2_pad3 = bufferize(new Uint8Array(Array(3).concat(data2))); + view = new DataView(buffer2_pad3, 0, 7); + assert.sameValue(view.getFloat32(3, true), 10); + var buffer2_pad7 = bufferize(new Uint8Array(Array(7).concat(data2))); + view = new DataView(buffer2_pad7, 0, 11); + assert.sameValue(view.getFloat32(7, true), 10); + var buffer2_pad10 = bufferize(new Uint8Array(Array(10).concat(data2))); + view = new DataView(buffer2_pad10, 0, 14); + assert.sameValue(view.getFloat32(10, true), 10); + // Big endian. + var buffer2_r = bufferize(new Uint8Array(data2_r)); + view = new DataView(buffer2_r, 0, 4); + assert.sameValue(view.getFloat32(0, false), 10); + var buffer2_r_pad3 = bufferize(new Uint8Array(Array(3).concat(data2_r))); + view = new DataView(buffer2_r_pad3, 0, 7); + assert.sameValue(view.getFloat32(3, false), 10); + var buffer2_r_pad7 = bufferize(new Uint8Array(Array(7).concat(data2_r))); + view = new DataView(buffer2_r_pad7, 0, 11); + assert.sameValue(view.getFloat32(7, false), 10); + var buffer2_r_pad10 = bufferize(new Uint8Array(Array(10).concat(data2_r))); + view = new DataView(buffer2_r_pad10, 0, 14); + assert.sameValue(view.getFloat32(10, false), 10); + + // testFloatGet expected=1.2300000190734863 + // Little endian + var data3 = [164,112,157,63]; + var data3_r = data3.slice().reverse(); + var buffer3 = bufferize(new Uint8Array(data3)); + view = new DataView(buffer3, 0, 4); + assert.sameValue(view.getFloat32(0, true), 1.2300000190734863); + var buffer3_pad3 = bufferize(new Uint8Array(Array(3).concat(data3))); + view = new DataView(buffer3_pad3, 0, 7); + assert.sameValue(view.getFloat32(3, true), 1.2300000190734863); + var buffer3_pad7 = bufferize(new Uint8Array(Array(7).concat(data3))); + view = new DataView(buffer3_pad7, 0, 11); + assert.sameValue(view.getFloat32(7, true), 1.2300000190734863); + var buffer3_pad10 = bufferize(new Uint8Array(Array(10).concat(data3))); + view = new DataView(buffer3_pad10, 0, 14); + assert.sameValue(view.getFloat32(10, true), 1.2300000190734863); + // Big endian. + var buffer3_r = bufferize(new Uint8Array(data3_r)); + view = new DataView(buffer3_r, 0, 4); + assert.sameValue(view.getFloat32(0, false), 1.2300000190734863); + var buffer3_r_pad3 = bufferize(new Uint8Array(Array(3).concat(data3_r))); + view = new DataView(buffer3_r_pad3, 0, 7); + assert.sameValue(view.getFloat32(3, false), 1.2300000190734863); + var buffer3_r_pad7 = bufferize(new Uint8Array(Array(7).concat(data3_r))); + view = new DataView(buffer3_r_pad7, 0, 11); + assert.sameValue(view.getFloat32(7, false), 1.2300000190734863); + var buffer3_r_pad10 = bufferize(new Uint8Array(Array(10).concat(data3_r))); + view = new DataView(buffer3_r_pad10, 0, 14); + assert.sameValue(view.getFloat32(10, false), 1.2300000190734863); + + // testFloatGet expected=-45621.37109375 + // Little endian + var data4 = [95,53,50,199]; + var data4_r = data4.slice().reverse(); + var buffer4 = bufferize(new Uint8Array(data4)); + view = new DataView(buffer4, 0, 4); + assert.sameValue(view.getFloat32(0, true), -45621.37109375); + var buffer4_pad3 = bufferize(new Uint8Array(Array(3).concat(data4))); + view = new DataView(buffer4_pad3, 0, 7); + assert.sameValue(view.getFloat32(3, true), -45621.37109375); + var buffer4_pad7 = bufferize(new Uint8Array(Array(7).concat(data4))); + view = new DataView(buffer4_pad7, 0, 11); + assert.sameValue(view.getFloat32(7, true), -45621.37109375); + var buffer4_pad10 = bufferize(new Uint8Array(Array(10).concat(data4))); + view = new DataView(buffer4_pad10, 0, 14); + assert.sameValue(view.getFloat32(10, true), -45621.37109375); + // Big endian. + var buffer4_r = bufferize(new Uint8Array(data4_r)); + view = new DataView(buffer4_r, 0, 4); + assert.sameValue(view.getFloat32(0, false), -45621.37109375); + var buffer4_r_pad3 = bufferize(new Uint8Array(Array(3).concat(data4_r))); + view = new DataView(buffer4_r_pad3, 0, 7); + assert.sameValue(view.getFloat32(3, false), -45621.37109375); + var buffer4_r_pad7 = bufferize(new Uint8Array(Array(7).concat(data4_r))); + view = new DataView(buffer4_r_pad7, 0, 11); + assert.sameValue(view.getFloat32(7, false), -45621.37109375); + var buffer4_r_pad10 = bufferize(new Uint8Array(Array(10).concat(data4_r))); + view = new DataView(buffer4_r_pad10, 0, 14); + assert.sameValue(view.getFloat32(10, false), -45621.37109375); + + // testFloatGet expected=NaN + // Little endian + var data5 = [255,255,255,127]; + var data5_r = data5.slice().reverse(); + var buffer5 = bufferize(new Uint8Array(data5)); + view = new DataView(buffer5, 0, 4); + assert.sameValue(view.getFloat32(0, true), NaN); + var buffer5_pad3 = bufferize(new Uint8Array(Array(3).concat(data5))); + view = new DataView(buffer5_pad3, 0, 7); + assert.sameValue(view.getFloat32(3, true), NaN); + var buffer5_pad7 = bufferize(new Uint8Array(Array(7).concat(data5))); + view = new DataView(buffer5_pad7, 0, 11); + assert.sameValue(view.getFloat32(7, true), NaN); + var buffer5_pad10 = bufferize(new Uint8Array(Array(10).concat(data5))); + view = new DataView(buffer5_pad10, 0, 14); + assert.sameValue(view.getFloat32(10, true), NaN); + // Big endian. + var buffer5_r = bufferize(new Uint8Array(data5_r)); + view = new DataView(buffer5_r, 0, 4); + assert.sameValue(view.getFloat32(0, false), NaN); + var buffer5_r_pad3 = bufferize(new Uint8Array(Array(3).concat(data5_r))); + view = new DataView(buffer5_r_pad3, 0, 7); + assert.sameValue(view.getFloat32(3, false), NaN); + var buffer5_r_pad7 = bufferize(new Uint8Array(Array(7).concat(data5_r))); + view = new DataView(buffer5_r_pad7, 0, 11); + assert.sameValue(view.getFloat32(7, false), NaN); + var buffer5_r_pad10 = bufferize(new Uint8Array(Array(10).concat(data5_r))); + view = new DataView(buffer5_r_pad10, 0, 14); + assert.sameValue(view.getFloat32(10, false), NaN); + + // testFloatGet expected=NaN + // Little endian + var data6 = [255,255,255,255]; + var data6_r = data6.slice().reverse(); + var buffer6 = bufferize(new Uint8Array(data6)); + view = new DataView(buffer6, 0, 4); + assert.sameValue(view.getFloat32(0, true), NaN); + var buffer6_pad3 = bufferize(new Uint8Array(Array(3).concat(data6))); + view = new DataView(buffer6_pad3, 0, 7); + assert.sameValue(view.getFloat32(3, true), NaN); + var buffer6_pad7 = bufferize(new Uint8Array(Array(7).concat(data6))); + view = new DataView(buffer6_pad7, 0, 11); + assert.sameValue(view.getFloat32(7, true), NaN); + var buffer6_pad10 = bufferize(new Uint8Array(Array(10).concat(data6))); + view = new DataView(buffer6_pad10, 0, 14); + assert.sameValue(view.getFloat32(10, true), NaN); + // Big endian. + var buffer6_r = bufferize(new Uint8Array(data6_r)); + view = new DataView(buffer6_r, 0, 4); + assert.sameValue(view.getFloat32(0, false), NaN); + var buffer6_r_pad3 = bufferize(new Uint8Array(Array(3).concat(data6_r))); + view = new DataView(buffer6_r_pad3, 0, 7); + assert.sameValue(view.getFloat32(3, false), NaN); + var buffer6_r_pad7 = bufferize(new Uint8Array(Array(7).concat(data6_r))); + view = new DataView(buffer6_r_pad7, 0, 11); + assert.sameValue(view.getFloat32(7, false), NaN); + var buffer6_r_pad10 = bufferize(new Uint8Array(Array(10).concat(data6_r))); + view = new DataView(buffer6_r_pad10, 0, 14); + assert.sameValue(view.getFloat32(10, false), NaN); + + // testFloatGet expected=10 + // Little endian + var data7 = [0,0,0,0,0,0,36,64]; + var data7_r = data7.slice().reverse(); + var buffer7 = bufferize(new Uint8Array(data7)); + view = new DataView(buffer7, 0, 8); + assert.sameValue(view.getFloat64(0, true), 10); + var buffer7_pad3 = bufferize(new Uint8Array(Array(3).concat(data7))); + view = new DataView(buffer7_pad3, 0, 11); + assert.sameValue(view.getFloat64(3, true), 10); + var buffer7_pad7 = bufferize(new Uint8Array(Array(7).concat(data7))); + view = new DataView(buffer7_pad7, 0, 15); + assert.sameValue(view.getFloat64(7, true), 10); + var buffer7_pad10 = bufferize(new Uint8Array(Array(10).concat(data7))); + view = new DataView(buffer7_pad10, 0, 18); + assert.sameValue(view.getFloat64(10, true), 10); + // Big endian. + var buffer7_r = bufferize(new Uint8Array(data7_r)); + view = new DataView(buffer7_r, 0, 8); + assert.sameValue(view.getFloat64(0, false), 10); + var buffer7_r_pad3 = bufferize(new Uint8Array(Array(3).concat(data7_r))); + view = new DataView(buffer7_r_pad3, 0, 11); + assert.sameValue(view.getFloat64(3, false), 10); + var buffer7_r_pad7 = bufferize(new Uint8Array(Array(7).concat(data7_r))); + view = new DataView(buffer7_r_pad7, 0, 15); + assert.sameValue(view.getFloat64(7, false), 10); + var buffer7_r_pad10 = bufferize(new Uint8Array(Array(10).concat(data7_r))); + view = new DataView(buffer7_r_pad10, 0, 18); + assert.sameValue(view.getFloat64(10, false), 10); + + // testFloatGet expected=1.23 + // Little endian + var data8 = [174,71,225,122,20,174,243,63]; + var data8_r = data8.slice().reverse(); + var buffer8 = bufferize(new Uint8Array(data8)); + view = new DataView(buffer8, 0, 8); + assert.sameValue(view.getFloat64(0, true), 1.23); + var buffer8_pad3 = bufferize(new Uint8Array(Array(3).concat(data8))); + view = new DataView(buffer8_pad3, 0, 11); + assert.sameValue(view.getFloat64(3, true), 1.23); + var buffer8_pad7 = bufferize(new Uint8Array(Array(7).concat(data8))); + view = new DataView(buffer8_pad7, 0, 15); + assert.sameValue(view.getFloat64(7, true), 1.23); + var buffer8_pad10 = bufferize(new Uint8Array(Array(10).concat(data8))); + view = new DataView(buffer8_pad10, 0, 18); + assert.sameValue(view.getFloat64(10, true), 1.23); + // Big endian. + var buffer8_r = bufferize(new Uint8Array(data8_r)); + view = new DataView(buffer8_r, 0, 8); + assert.sameValue(view.getFloat64(0, false), 1.23); + var buffer8_r_pad3 = bufferize(new Uint8Array(Array(3).concat(data8_r))); + view = new DataView(buffer8_r_pad3, 0, 11); + assert.sameValue(view.getFloat64(3, false), 1.23); + var buffer8_r_pad7 = bufferize(new Uint8Array(Array(7).concat(data8_r))); + view = new DataView(buffer8_r_pad7, 0, 15); + assert.sameValue(view.getFloat64(7, false), 1.23); + var buffer8_r_pad10 = bufferize(new Uint8Array(Array(10).concat(data8_r))); + view = new DataView(buffer8_r_pad10, 0, 18); + assert.sameValue(view.getFloat64(10, false), 1.23); + + // testFloatGet expected=-6213576.4839 + // Little endian + var data9 = [181,55,248,30,242,179,87,193]; + var data9_r = data9.slice().reverse(); + var buffer9 = bufferize(new Uint8Array(data9)); + view = new DataView(buffer9, 0, 8); + assert.sameValue(view.getFloat64(0, true), -6213576.4839); + var buffer9_pad3 = bufferize(new Uint8Array(Array(3).concat(data9))); + view = new DataView(buffer9_pad3, 0, 11); + assert.sameValue(view.getFloat64(3, true), -6213576.4839); + var buffer9_pad7 = bufferize(new Uint8Array(Array(7).concat(data9))); + view = new DataView(buffer9_pad7, 0, 15); + assert.sameValue(view.getFloat64(7, true), -6213576.4839); + var buffer9_pad10 = bufferize(new Uint8Array(Array(10).concat(data9))); + view = new DataView(buffer9_pad10, 0, 18); + assert.sameValue(view.getFloat64(10, true), -6213576.4839); + // Big endian. + var buffer9_r = bufferize(new Uint8Array(data9_r)); + view = new DataView(buffer9_r, 0, 8); + assert.sameValue(view.getFloat64(0, false), -6213576.4839); + var buffer9_r_pad3 = bufferize(new Uint8Array(Array(3).concat(data9_r))); + view = new DataView(buffer9_r_pad3, 0, 11); + assert.sameValue(view.getFloat64(3, false), -6213576.4839); + var buffer9_r_pad7 = bufferize(new Uint8Array(Array(7).concat(data9_r))); + view = new DataView(buffer9_r_pad7, 0, 15); + assert.sameValue(view.getFloat64(7, false), -6213576.4839); + var buffer9_r_pad10 = bufferize(new Uint8Array(Array(10).concat(data9_r))); + view = new DataView(buffer9_r_pad10, 0, 18); + assert.sameValue(view.getFloat64(10, false), -6213576.4839); + + // testFloatGet expected=NaN + // Little endian + var data10 = [255,255,255,255,255,255,255,127]; + var data10_r = data10.slice().reverse(); + var buffer10 = bufferize(new Uint8Array(data10)); + view = new DataView(buffer10, 0, 8); + assert.sameValue(view.getFloat64(0, true), NaN); + var buffer10_pad3 = bufferize(new Uint8Array(Array(3).concat(data10))); + view = new DataView(buffer10_pad3, 0, 11); + assert.sameValue(view.getFloat64(3, true), NaN); + var buffer10_pad7 = bufferize(new Uint8Array(Array(7).concat(data10))); + view = new DataView(buffer10_pad7, 0, 15); + assert.sameValue(view.getFloat64(7, true), NaN); + var buffer10_pad10 = bufferize(new Uint8Array(Array(10).concat(data10))); + view = new DataView(buffer10_pad10, 0, 18); + assert.sameValue(view.getFloat64(10, true), NaN); + // Big endian. + var buffer10_r = bufferize(new Uint8Array(data10_r)); + view = new DataView(buffer10_r, 0, 8); + assert.sameValue(view.getFloat64(0, false), NaN); + var buffer10_r_pad3 = bufferize(new Uint8Array(Array(3).concat(data10_r))); + view = new DataView(buffer10_r_pad3, 0, 11); + assert.sameValue(view.getFloat64(3, false), NaN); + var buffer10_r_pad7 = bufferize(new Uint8Array(Array(7).concat(data10_r))); + view = new DataView(buffer10_r_pad7, 0, 15); + assert.sameValue(view.getFloat64(7, false), NaN); + var buffer10_r_pad10 = bufferize(new Uint8Array(Array(10).concat(data10_r))); + view = new DataView(buffer10_r_pad10, 0, 18); + assert.sameValue(view.getFloat64(10, false), NaN); + + // testFloatGet expected=NaN + // Little endian + var data11 = [255,255,255,255,255,255,255,255]; + var data11_r = data11.slice().reverse(); + var buffer11 = bufferize(new Uint8Array(data11)); + view = new DataView(buffer11, 0, 8); + assert.sameValue(view.getFloat64(0, true), NaN); + var buffer11_pad3 = bufferize(new Uint8Array(Array(3).concat(data11))); + view = new DataView(buffer11_pad3, 0, 11); + assert.sameValue(view.getFloat64(3, true), NaN); + var buffer11_pad7 = bufferize(new Uint8Array(Array(7).concat(data11))); + view = new DataView(buffer11_pad7, 0, 15); + assert.sameValue(view.getFloat64(7, true), NaN); + var buffer11_pad10 = bufferize(new Uint8Array(Array(10).concat(data11))); + view = new DataView(buffer11_pad10, 0, 18); + assert.sameValue(view.getFloat64(10, true), NaN); + // Big endian. + var buffer11_r = bufferize(new Uint8Array(data11_r)); + view = new DataView(buffer11_r, 0, 8); + assert.sameValue(view.getFloat64(0, false), NaN); + var buffer11_r_pad3 = bufferize(new Uint8Array(Array(3).concat(data11_r))); + view = new DataView(buffer11_r_pad3, 0, 11); + assert.sameValue(view.getFloat64(3, false), NaN); + var buffer11_r_pad7 = bufferize(new Uint8Array(Array(7).concat(data11_r))); + view = new DataView(buffer11_r_pad7, 0, 15); + assert.sameValue(view.getFloat64(7, false), NaN); + var buffer11_r_pad10 = bufferize(new Uint8Array(Array(10).concat(data11_r))); + view = new DataView(buffer11_r_pad10, 0, 18); + assert.sameValue(view.getFloat64(10, false), NaN); + + // testIntegerGets(start=3, length=2) + var data12 = [31,32,33,0,1,2,3,100,101,102,103,128,129,130,131,252,253,254,255]; + var data12_r = data12.slice().reverse(); + var buffer12 = bufferize(new Uint8Array(data12)); + view = new DataView(buffer12, 3, 2); + assert.sameValue(view.getInt8(0), 0); + checkThrow(() => view.getInt8(8), RangeError); + checkThrow(() => view.getInt8(15), RangeError); + assert.sameValue(view.getUint8(0), 0); + checkThrow(() => view.getUint8(8), RangeError); + checkThrow(() => view.getUint8(15), RangeError); + // Little endian. + assert.sameValue(view.getInt16(0, true), 256); + checkThrow(() => view.getInt16(5, true), RangeError); + checkThrow(() => view.getInt16(9, true), RangeError); + checkThrow(() => view.getInt16(14, true), RangeError); + // Big endian. + assert.sameValue(view.getInt16(0), 1); + checkThrow(() => view.getInt16(5), RangeError); + checkThrow(() => view.getInt16(9), RangeError); + checkThrow(() => view.getInt16(14), RangeError); + // Little endian. + assert.sameValue(view.getUint16(0, true), 256); + checkThrow(() => view.getUint16(5, true), RangeError); + checkThrow(() => view.getUint16(9, true), RangeError); + checkThrow(() => view.getUint16(14, true), RangeError); + // Big endian. + assert.sameValue(view.getUint16(0), 1); + checkThrow(() => view.getUint16(5), RangeError); + checkThrow(() => view.getUint16(9), RangeError); + checkThrow(() => view.getUint16(14), RangeError); + // Little endian. + checkThrow(() => view.getInt32(0, true), RangeError); + checkThrow(() => view.getInt32(3, true), RangeError); + checkThrow(() => view.getInt32(6, true), RangeError); + checkThrow(() => view.getInt32(9, true), RangeError); + checkThrow(() => view.getInt32(12, true), RangeError); + // Big endian. + checkThrow(() => view.getInt32(0), RangeError); + checkThrow(() => view.getInt32(3), RangeError); + checkThrow(() => view.getInt32(6), RangeError); + checkThrow(() => view.getInt32(9), RangeError); + checkThrow(() => view.getInt32(12), RangeError); + // Little endian. + checkThrow(() => view.getUint32(0, true), RangeError); + checkThrow(() => view.getUint32(3, true), RangeError); + checkThrow(() => view.getUint32(6, true), RangeError); + checkThrow(() => view.getUint32(9, true), RangeError); + checkThrow(() => view.getUint32(12, true), RangeError); + // Big endian. + checkThrow(() => view.getUint32(0), RangeError); + checkThrow(() => view.getUint32(3), RangeError); + checkThrow(() => view.getUint32(6), RangeError); + checkThrow(() => view.getUint32(9), RangeError); + checkThrow(() => view.getUint32(12), RangeError); + + // testFloatGets(start=3) + + // testFloatGet expected=10 + // Little endian + view = new DataView(buffer2, 3, 1); + checkThrow(() => view.getFloat32(0, true), RangeError); + view = new DataView(buffer2_pad3, 3, 4); + checkThrow(() => view.getFloat32(3, true), RangeError); + view = new DataView(buffer2_pad7, 3, 8); + checkThrow(() => view.getFloat32(7, true), RangeError); + view = new DataView(buffer2_pad10, 3, 11); + checkThrow(() => view.getFloat32(10, true), RangeError); + // Big endian. + view = new DataView(buffer2_r, 3, 1); + checkThrow(() => view.getFloat32(0, false), RangeError); + view = new DataView(buffer2_r_pad3, 3, 4); + checkThrow(() => view.getFloat32(3, false), RangeError); + view = new DataView(buffer2_r_pad7, 3, 8); + checkThrow(() => view.getFloat32(7, false), RangeError); + view = new DataView(buffer2_r_pad10, 3, 11); + checkThrow(() => view.getFloat32(10, false), RangeError); + + // testFloatGet expected=1.2300000190734863 + // Little endian + view = new DataView(buffer3, 3, 1); + checkThrow(() => view.getFloat32(0, true), RangeError); + view = new DataView(buffer3_pad3, 3, 4); + checkThrow(() => view.getFloat32(3, true), RangeError); + view = new DataView(buffer3_pad7, 3, 8); + checkThrow(() => view.getFloat32(7, true), RangeError); + view = new DataView(buffer3_pad10, 3, 11); + checkThrow(() => view.getFloat32(10, true), RangeError); + // Big endian. + view = new DataView(buffer3_r, 3, 1); + checkThrow(() => view.getFloat32(0, false), RangeError); + view = new DataView(buffer3_r_pad3, 3, 4); + checkThrow(() => view.getFloat32(3, false), RangeError); + view = new DataView(buffer3_r_pad7, 3, 8); + checkThrow(() => view.getFloat32(7, false), RangeError); + view = new DataView(buffer3_r_pad10, 3, 11); + checkThrow(() => view.getFloat32(10, false), RangeError); + + // testFloatGet expected=-45621.37109375 + // Little endian + view = new DataView(buffer4, 3, 1); + checkThrow(() => view.getFloat32(0, true), RangeError); + view = new DataView(buffer4_pad3, 3, 4); + checkThrow(() => view.getFloat32(3, true), RangeError); + view = new DataView(buffer4_pad7, 3, 8); + checkThrow(() => view.getFloat32(7, true), RangeError); + view = new DataView(buffer4_pad10, 3, 11); + checkThrow(() => view.getFloat32(10, true), RangeError); + // Big endian. + view = new DataView(buffer4_r, 3, 1); + checkThrow(() => view.getFloat32(0, false), RangeError); + view = new DataView(buffer4_r_pad3, 3, 4); + checkThrow(() => view.getFloat32(3, false), RangeError); + view = new DataView(buffer4_r_pad7, 3, 8); + checkThrow(() => view.getFloat32(7, false), RangeError); + view = new DataView(buffer4_r_pad10, 3, 11); + checkThrow(() => view.getFloat32(10, false), RangeError); + + // testFloatGet expected=NaN + // Little endian + view = new DataView(buffer5, 3, 1); + checkThrow(() => view.getFloat32(0, true), RangeError); + view = new DataView(buffer5_pad3, 3, 4); + checkThrow(() => view.getFloat32(3, true), RangeError); + view = new DataView(buffer5_pad7, 3, 8); + checkThrow(() => view.getFloat32(7, true), RangeError); + view = new DataView(buffer5_pad10, 3, 11); + checkThrow(() => view.getFloat32(10, true), RangeError); + // Big endian. + view = new DataView(buffer5_r, 3, 1); + checkThrow(() => view.getFloat32(0, false), RangeError); + view = new DataView(buffer5_r_pad3, 3, 4); + checkThrow(() => view.getFloat32(3, false), RangeError); + view = new DataView(buffer5_r_pad7, 3, 8); + checkThrow(() => view.getFloat32(7, false), RangeError); + view = new DataView(buffer5_r_pad10, 3, 11); + checkThrow(() => view.getFloat32(10, false), RangeError); + + // testFloatGet expected=NaN + // Little endian + view = new DataView(buffer6, 3, 1); + checkThrow(() => view.getFloat32(0, true), RangeError); + view = new DataView(buffer6_pad3, 3, 4); + checkThrow(() => view.getFloat32(3, true), RangeError); + view = new DataView(buffer6_pad7, 3, 8); + checkThrow(() => view.getFloat32(7, true), RangeError); + view = new DataView(buffer6_pad10, 3, 11); + checkThrow(() => view.getFloat32(10, true), RangeError); + // Big endian. + view = new DataView(buffer6_r, 3, 1); + checkThrow(() => view.getFloat32(0, false), RangeError); + view = new DataView(buffer6_r_pad3, 3, 4); + checkThrow(() => view.getFloat32(3, false), RangeError); + view = new DataView(buffer6_r_pad7, 3, 8); + checkThrow(() => view.getFloat32(7, false), RangeError); + view = new DataView(buffer6_r_pad10, 3, 11); + checkThrow(() => view.getFloat32(10, false), RangeError); + + // testFloatGet expected=10 + // Little endian + view = new DataView(buffer7, 3, 5); + checkThrow(() => view.getFloat64(0, true), RangeError); + view = new DataView(buffer7_pad3, 3, 8); + checkThrow(() => view.getFloat64(3, true), RangeError); + view = new DataView(buffer7_pad7, 3, 12); + checkThrow(() => view.getFloat64(7, true), RangeError); + view = new DataView(buffer7_pad10, 3, 15); + checkThrow(() => view.getFloat64(10, true), RangeError); + // Big endian. + view = new DataView(buffer7_r, 3, 5); + checkThrow(() => view.getFloat64(0, false), RangeError); + view = new DataView(buffer7_r_pad3, 3, 8); + checkThrow(() => view.getFloat64(3, false), RangeError); + view = new DataView(buffer7_r_pad7, 3, 12); + checkThrow(() => view.getFloat64(7, false), RangeError); + view = new DataView(buffer7_r_pad10, 3, 15); + checkThrow(() => view.getFloat64(10, false), RangeError); + + // testFloatGet expected=1.23 + // Little endian + view = new DataView(buffer8, 3, 5); + checkThrow(() => view.getFloat64(0, true), RangeError); + view = new DataView(buffer8_pad3, 3, 8); + checkThrow(() => view.getFloat64(3, true), RangeError); + view = new DataView(buffer8_pad7, 3, 12); + checkThrow(() => view.getFloat64(7, true), RangeError); + view = new DataView(buffer8_pad10, 3, 15); + checkThrow(() => view.getFloat64(10, true), RangeError); + // Big endian. + view = new DataView(buffer8_r, 3, 5); + checkThrow(() => view.getFloat64(0, false), RangeError); + view = new DataView(buffer8_r_pad3, 3, 8); + checkThrow(() => view.getFloat64(3, false), RangeError); + view = new DataView(buffer8_r_pad7, 3, 12); + checkThrow(() => view.getFloat64(7, false), RangeError); + view = new DataView(buffer8_r_pad10, 3, 15); + checkThrow(() => view.getFloat64(10, false), RangeError); + + // testFloatGet expected=-6213576.4839 + // Little endian + view = new DataView(buffer9, 3, 5); + checkThrow(() => view.getFloat64(0, true), RangeError); + view = new DataView(buffer9_pad3, 3, 8); + checkThrow(() => view.getFloat64(3, true), RangeError); + view = new DataView(buffer9_pad7, 3, 12); + checkThrow(() => view.getFloat64(7, true), RangeError); + view = new DataView(buffer9_pad10, 3, 15); + checkThrow(() => view.getFloat64(10, true), RangeError); + // Big endian. + view = new DataView(buffer9_r, 3, 5); + checkThrow(() => view.getFloat64(0, false), RangeError); + view = new DataView(buffer9_r_pad3, 3, 8); + checkThrow(() => view.getFloat64(3, false), RangeError); + view = new DataView(buffer9_r_pad7, 3, 12); + checkThrow(() => view.getFloat64(7, false), RangeError); + view = new DataView(buffer9_r_pad10, 3, 15); + checkThrow(() => view.getFloat64(10, false), RangeError); + + // testFloatGet expected=NaN + // Little endian + view = new DataView(buffer10, 3, 5); + checkThrow(() => view.getFloat64(0, true), RangeError); + view = new DataView(buffer10_pad3, 3, 8); + checkThrow(() => view.getFloat64(3, true), RangeError); + view = new DataView(buffer10_pad7, 3, 12); + checkThrow(() => view.getFloat64(7, true), RangeError); + view = new DataView(buffer10_pad10, 3, 15); + checkThrow(() => view.getFloat64(10, true), RangeError); + // Big endian. + view = new DataView(buffer10_r, 3, 5); + checkThrow(() => view.getFloat64(0, false), RangeError); + view = new DataView(buffer10_r_pad3, 3, 8); + checkThrow(() => view.getFloat64(3, false), RangeError); + view = new DataView(buffer10_r_pad7, 3, 12); + checkThrow(() => view.getFloat64(7, false), RangeError); + view = new DataView(buffer10_r_pad10, 3, 15); + checkThrow(() => view.getFloat64(10, false), RangeError); + + // testFloatGet expected=NaN + // Little endian + view = new DataView(buffer11, 3, 5); + checkThrow(() => view.getFloat64(0, true), RangeError); + view = new DataView(buffer11_pad3, 3, 8); + checkThrow(() => view.getFloat64(3, true), RangeError); + view = new DataView(buffer11_pad7, 3, 12); + checkThrow(() => view.getFloat64(7, true), RangeError); + view = new DataView(buffer11_pad10, 3, 15); + checkThrow(() => view.getFloat64(10, true), RangeError); + // Big endian. + view = new DataView(buffer11_r, 3, 5); + checkThrow(() => view.getFloat64(0, false), RangeError); + view = new DataView(buffer11_r_pad3, 3, 8); + checkThrow(() => view.getFloat64(3, false), RangeError); + view = new DataView(buffer11_r_pad7, 3, 12); + checkThrow(() => view.getFloat64(7, false), RangeError); + view = new DataView(buffer11_r_pad10, 3, 15); + checkThrow(() => view.getFloat64(10, false), RangeError); + + // testGetNegativeIndexes + view = new DataView(buffer1, 0, 16); + checkThrow(() => view.getInt8(-1), RangeError); + checkThrow(() => view.getInt8(-2), RangeError); + checkThrow(() => view.getUint8(-1), RangeError); + checkThrow(() => view.getUint8(-2), RangeError); + checkThrow(() => view.getInt16(-1), RangeError); + checkThrow(() => view.getInt16(-2), RangeError); + checkThrow(() => view.getInt16(-3), RangeError); + checkThrow(() => view.getUint16(-1), RangeError); + checkThrow(() => view.getUint16(-2), RangeError); + checkThrow(() => view.getUint16(-3), RangeError); + checkThrow(() => view.getInt32(-1), RangeError); + checkThrow(() => view.getInt32(-3), RangeError); + checkThrow(() => view.getInt32(-5), RangeError); + checkThrow(() => view.getUint32(-1), RangeError); + checkThrow(() => view.getUint32(-3), RangeError); + checkThrow(() => view.getUint32(-5), RangeError); + view = new DataView(buffer7, 0, 8); + checkThrow(() => view.getFloat32(-1), RangeError); + checkThrow(() => view.getFloat32(-3), RangeError); + checkThrow(() => view.getFloat32(-5), RangeError); + checkThrow(() => view.getFloat64(-1), RangeError); + checkThrow(() => view.getFloat64(-5), RangeError); + checkThrow(() => view.getFloat64(-9), RangeError); + + // Too large for signed 32 bit integer index + checkThrow(() => view.getInt8(2147483648), RangeError); + checkThrow(() => view.getInt8(2147483649), RangeError); + checkThrow(() => view.getUint8(2147483648), RangeError); + checkThrow(() => view.getUint8(2147483649), RangeError); + checkThrow(() => view.getInt16(2147483648), RangeError); + checkThrow(() => view.getInt16(2147483649), RangeError); + checkThrow(() => view.getUint16(2147483648), RangeError); + checkThrow(() => view.getUint16(2147483649), RangeError); + checkThrow(() => view.getInt32(2147483648), RangeError); + checkThrow(() => view.getInt32(2147483649), RangeError); + checkThrow(() => view.getUint32(2147483648), RangeError); + checkThrow(() => view.getUint32(2147483649), RangeError); + checkThrow(() => view.getFloat32(2147483648), RangeError); + checkThrow(() => view.getFloat32(2147483649), RangeError); + checkThrow(() => view.getFloat64(2147483648), RangeError); + checkThrow(() => view.getFloat64(2147483649), RangeError); + + // Test for wrong type of |this| + checkThrow(() => view.getInt8.apply("dead", [0]), TypeError); + checkThrow(() => view.getUint8.apply("puppies", [0]), TypeError); + checkThrow(() => view.getInt16.apply("aren", [0]), TypeError); + checkThrow(() => view.getUint16.apply("t", [0]), TypeError); + checkThrow(() => view.getInt32.apply("much", [0]), TypeError); + checkThrow(() => view.getUint32.apply("fun", [0]), TypeError); + checkThrow(() => view.getFloat32.apply("(in", [0]), TypeError); + checkThrow(() => view.getFloat64.apply("bed)", [0]), TypeError); + checkThrow(() => view.setInt8.apply("dead", [0, 0]), TypeError); + checkThrow(() => view.setUint8.apply("puppies", [0, 0]), TypeError); + checkThrow(() => view.setInt16.apply("aren", [0, 0]), TypeError); + checkThrow(() => view.setUint16.apply("t", [0, 0]), TypeError); + checkThrow(() => view.setInt32.apply("much", [0, 0]), TypeError); + checkThrow(() => view.setUint32.apply("fun", [0, 0]), TypeError); + checkThrow(() => view.setFloat32.apply("(in", [0, 0]), TypeError); + checkThrow(() => view.setFloat64.apply("bed)", [0, 0]), TypeError); + + // testSetMethods + + // Test for set methods that work + + // testIntegerSets(start=0, length=16) + var data13 = [204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204]; + var data13_r = data13.slice().reverse(); + var buffer13 = bufferize(new Uint8Array(data13)); + view = new DataView(buffer13, 0, 16); + view.setInt8(0, 0); + assert.sameValue(view.getInt8(0), 0); + view.setInt8(8, -128); + assert.sameValue(view.getInt8(8), -128); + view.setInt8(15, -1); + assert.sameValue(view.getInt8(15), -1); + view.setUint8(0, 0); + assert.sameValue(view.getUint8(0), 0); + view.setUint8(8, 128); + assert.sameValue(view.getUint8(8), 128); + view.setUint8(15, 255); + assert.sameValue(view.getUint8(15), 255); + view.setInt16(0, 256, true); + assert.sameValue(view.getInt16(0, true), 256); + view.setInt16(5, 26213, true); + assert.sameValue(view.getInt16(5, true), 26213); + view.setInt16(9, -32127, true); + assert.sameValue(view.getInt16(9, true), -32127); + view.setInt16(14, -2, true); + assert.sameValue(view.getInt16(14, true), -2); + view.setInt16(0, 1); + assert.sameValue(view.getInt16(0), 1); + view.setInt16(5, 25958); + assert.sameValue(view.getInt16(5), 25958); + view.setInt16(9, -32382); + assert.sameValue(view.getInt16(9), -32382); + view.setInt16(14, -257); + assert.sameValue(view.getInt16(14), -257); + view.setUint16(0, 256, true); + assert.sameValue(view.getUint16(0, true), 256); + view.setUint16(5, 26213, true); + assert.sameValue(view.getUint16(5, true), 26213); + view.setUint16(9, 33409, true); + assert.sameValue(view.getUint16(9, true), 33409); + view.setUint16(14, 65534, true); + assert.sameValue(view.getUint16(14, true), 65534); + view.setUint16(0, 1); + assert.sameValue(view.getUint16(0), 1); + view.setUint16(5, 25958); + assert.sameValue(view.getUint16(5), 25958); + view.setUint16(9, 33154); + assert.sameValue(view.getUint16(9), 33154); + view.setUint16(14, 65279); + assert.sameValue(view.getUint16(14), 65279); + view.setInt32(0, 50462976, true); + assert.sameValue(view.getInt32(0, true), 50462976); + view.setInt32(3, 1717920771, true); + assert.sameValue(view.getInt32(3, true), 1717920771); + view.setInt32(6, -2122291354, true); + assert.sameValue(view.getInt32(6, true), -2122291354); + view.setInt32(9, -58490239, true); + assert.sameValue(view.getInt32(9, true), -58490239); + view.setInt32(12, -66052, true); + assert.sameValue(view.getInt32(12, true), -66052); + view.setInt32(0, 66051); + assert.sameValue(view.getInt32(0), 66051); + view.setInt32(3, 56911206); + assert.sameValue(view.getInt32(3), 56911206); + view.setInt32(6, 1718059137); + assert.sameValue(view.getInt32(6), 1718059137); + view.setInt32(9, -2122152964); + assert.sameValue(view.getInt32(9), -2122152964); + view.setInt32(12, -50462977); + assert.sameValue(view.getInt32(12), -50462977); + view.setUint32(0, 50462976, true); + assert.sameValue(view.getUint32(0, true), 50462976); + view.setUint32(3, 1717920771, true); + assert.sameValue(view.getUint32(3, true), 1717920771); + view.setUint32(6, 2172675942, true); + assert.sameValue(view.getUint32(6, true), 2172675942); + view.setUint32(9, 4236477057, true); + assert.sameValue(view.getUint32(9, true), 4236477057); + view.setUint32(12, 4294901244, true); + assert.sameValue(view.getUint32(12, true), 4294901244); + view.setUint32(0, 66051); + assert.sameValue(view.getUint32(0), 66051); + view.setUint32(3, 56911206); + assert.sameValue(view.getUint32(3), 56911206); + view.setUint32(6, 1718059137); + assert.sameValue(view.getUint32(6), 1718059137); + view.setUint32(9, 2172814332); + assert.sameValue(view.getUint32(9), 2172814332); + view.setUint32(12, 4244504319); + assert.sameValue(view.getUint32(12), 4244504319); + + // testFloatSets(start=undefined) + + // testFloatSet expected=10 + // Little endian + view = new DataView(buffer13, 0, 16); + view.setFloat32(0, 10, true); + assert.sameValue(view.getFloat32(0, true), 10); + var buffer13_pad3 = bufferize(new Uint8Array(Array(3).concat(data13))); + view = new DataView(buffer13_pad3, 0, 19); + view.setFloat32(3, 10, true); + assert.sameValue(view.getFloat32(3, true), 10); + var buffer13_pad7 = bufferize(new Uint8Array(Array(7).concat(data13))); + view = new DataView(buffer13_pad7, 0, 23); + view.setFloat32(7, 10, true); + assert.sameValue(view.getFloat32(7, true), 10); + var buffer13_pad10 = bufferize(new Uint8Array(Array(10).concat(data13))); + view = new DataView(buffer13_pad10, 0, 26); + view.setFloat32(10, 10, true); + assert.sameValue(view.getFloat32(10, true), 10); + // Big endian. + var buffer13_r = bufferize(new Uint8Array(data13_r)); + view = new DataView(buffer13_r, 0, 16); + view.setFloat32(0, 10, false); + assert.sameValue(view.getFloat32(0, false), 10); + var buffer13_r_pad3 = bufferize(new Uint8Array(Array(3).concat(data13_r))); + view = new DataView(buffer13_r_pad3, 0, 19); + view.setFloat32(3, 10, false); + assert.sameValue(view.getFloat32(3, false), 10); + var buffer13_r_pad7 = bufferize(new Uint8Array(Array(7).concat(data13_r))); + view = new DataView(buffer13_r_pad7, 0, 23); + view.setFloat32(7, 10, false); + assert.sameValue(view.getFloat32(7, false), 10); + var buffer13_r_pad10 = bufferize(new Uint8Array(Array(10).concat(data13_r))); + view = new DataView(buffer13_r_pad10, 0, 26); + view.setFloat32(10, 10, false); + assert.sameValue(view.getFloat32(10, false), 10); + + // testFloatSet expected=1.2300000190734863 + // Little endian + view = new DataView(buffer13, 0, 16); + view.setFloat32(0, 1.2300000190734863, true); + assert.sameValue(view.getFloat32(0, true), 1.2300000190734863); + view = new DataView(buffer13_pad3, 0, 19); + view.setFloat32(3, 1.2300000190734863, true); + assert.sameValue(view.getFloat32(3, true), 1.2300000190734863); + view = new DataView(buffer13_pad7, 0, 23); + view.setFloat32(7, 1.2300000190734863, true); + assert.sameValue(view.getFloat32(7, true), 1.2300000190734863); + view = new DataView(buffer13_pad10, 0, 26); + view.setFloat32(10, 1.2300000190734863, true); + assert.sameValue(view.getFloat32(10, true), 1.2300000190734863); + // Big endian. + view = new DataView(buffer13_r, 0, 16); + view.setFloat32(0, 1.2300000190734863, false); + assert.sameValue(view.getFloat32(0, false), 1.2300000190734863); + view = new DataView(buffer13_r_pad3, 0, 19); + view.setFloat32(3, 1.2300000190734863, false); + assert.sameValue(view.getFloat32(3, false), 1.2300000190734863); + view = new DataView(buffer13_r_pad7, 0, 23); + view.setFloat32(7, 1.2300000190734863, false); + assert.sameValue(view.getFloat32(7, false), 1.2300000190734863); + view = new DataView(buffer13_r_pad10, 0, 26); + view.setFloat32(10, 1.2300000190734863, false); + assert.sameValue(view.getFloat32(10, false), 1.2300000190734863); + + // testFloatSet expected=-45621.37109375 + // Little endian + view = new DataView(buffer13, 0, 16); + view.setFloat32(0, -45621.37109375, true); + assert.sameValue(view.getFloat32(0, true), -45621.37109375); + view = new DataView(buffer13_pad3, 0, 19); + view.setFloat32(3, -45621.37109375, true); + assert.sameValue(view.getFloat32(3, true), -45621.37109375); + view = new DataView(buffer13_pad7, 0, 23); + view.setFloat32(7, -45621.37109375, true); + assert.sameValue(view.getFloat32(7, true), -45621.37109375); + view = new DataView(buffer13_pad10, 0, 26); + view.setFloat32(10, -45621.37109375, true); + assert.sameValue(view.getFloat32(10, true), -45621.37109375); + // Big endian. + view = new DataView(buffer13_r, 0, 16); + view.setFloat32(0, -45621.37109375, false); + assert.sameValue(view.getFloat32(0, false), -45621.37109375); + view = new DataView(buffer13_r_pad3, 0, 19); + view.setFloat32(3, -45621.37109375, false); + assert.sameValue(view.getFloat32(3, false), -45621.37109375); + view = new DataView(buffer13_r_pad7, 0, 23); + view.setFloat32(7, -45621.37109375, false); + assert.sameValue(view.getFloat32(7, false), -45621.37109375); + view = new DataView(buffer13_r_pad10, 0, 26); + view.setFloat32(10, -45621.37109375, false); + assert.sameValue(view.getFloat32(10, false), -45621.37109375); + + // testFloatSet expected=NaN + // Little endian + view = new DataView(buffer13, 0, 16); + view.setFloat32(0, NaN, true); + assert.sameValue(view.getFloat32(0, true), NaN); + view = new DataView(buffer13_pad3, 0, 19); + view.setFloat32(3, NaN, true); + assert.sameValue(view.getFloat32(3, true), NaN); + view = new DataView(buffer13_pad7, 0, 23); + view.setFloat32(7, NaN, true); + assert.sameValue(view.getFloat32(7, true), NaN); + view = new DataView(buffer13_pad10, 0, 26); + view.setFloat32(10, NaN, true); + assert.sameValue(view.getFloat32(10, true), NaN); + // Big endian. + view = new DataView(buffer13_r, 0, 16); + view.setFloat32(0, NaN, false); + assert.sameValue(view.getFloat32(0, false), NaN); + view = new DataView(buffer13_r_pad3, 0, 19); + view.setFloat32(3, NaN, false); + assert.sameValue(view.getFloat32(3, false), NaN); + view = new DataView(buffer13_r_pad7, 0, 23); + view.setFloat32(7, NaN, false); + assert.sameValue(view.getFloat32(7, false), NaN); + view = new DataView(buffer13_r_pad10, 0, 26); + view.setFloat32(10, NaN, false); + assert.sameValue(view.getFloat32(10, false), NaN); + + // testFloatSet expected=-NaN + // Little endian + view = new DataView(buffer13, 0, 16); + view.setFloat32(0, -NaN, true); + assert.sameValue(view.getFloat32(0, true), -NaN); + view = new DataView(buffer13_pad3, 0, 19); + view.setFloat32(3, -NaN, true); + assert.sameValue(view.getFloat32(3, true), -NaN); + view = new DataView(buffer13_pad7, 0, 23); + view.setFloat32(7, -NaN, true); + assert.sameValue(view.getFloat32(7, true), -NaN); + view = new DataView(buffer13_pad10, 0, 26); + view.setFloat32(10, -NaN, true); + assert.sameValue(view.getFloat32(10, true), -NaN); + // Big endian. + view = new DataView(buffer13_r, 0, 16); + view.setFloat32(0, -NaN, false); + assert.sameValue(view.getFloat32(0, false), -NaN); + view = new DataView(buffer13_r_pad3, 0, 19); + view.setFloat32(3, -NaN, false); + assert.sameValue(view.getFloat32(3, false), -NaN); + view = new DataView(buffer13_r_pad7, 0, 23); + view.setFloat32(7, -NaN, false); + assert.sameValue(view.getFloat32(7, false), -NaN); + view = new DataView(buffer13_r_pad10, 0, 26); + view.setFloat32(10, -NaN, false); + assert.sameValue(view.getFloat32(10, false), -NaN); + + // testFloatSet expected=10 + // Little endian + view = new DataView(buffer13, 0, 16); + view.setFloat64(0, 10, true); + assert.sameValue(view.getFloat64(0, true), 10); + view = new DataView(buffer13_pad3, 0, 19); + view.setFloat64(3, 10, true); + assert.sameValue(view.getFloat64(3, true), 10); + view = new DataView(buffer13_pad7, 0, 23); + view.setFloat64(7, 10, true); + assert.sameValue(view.getFloat64(7, true), 10); + view = new DataView(buffer13_pad10, 0, 26); + view.setFloat64(10, 10, true); + assert.sameValue(view.getFloat64(10, true), 10); + // Big endian. + view = new DataView(buffer13_r, 0, 16); + view.setFloat64(0, 10, false); + assert.sameValue(view.getFloat64(0, false), 10); + view = new DataView(buffer13_r_pad3, 0, 19); + view.setFloat64(3, 10, false); + assert.sameValue(view.getFloat64(3, false), 10); + view = new DataView(buffer13_r_pad7, 0, 23); + view.setFloat64(7, 10, false); + assert.sameValue(view.getFloat64(7, false), 10); + view = new DataView(buffer13_r_pad10, 0, 26); + view.setFloat64(10, 10, false); + assert.sameValue(view.getFloat64(10, false), 10); + + // testFloatSet expected=1.23 + // Little endian + view = new DataView(buffer13, 0, 16); + view.setFloat64(0, 1.23, true); + assert.sameValue(view.getFloat64(0, true), 1.23); + view = new DataView(buffer13_pad3, 0, 19); + view.setFloat64(3, 1.23, true); + assert.sameValue(view.getFloat64(3, true), 1.23); + view = new DataView(buffer13_pad7, 0, 23); + view.setFloat64(7, 1.23, true); + assert.sameValue(view.getFloat64(7, true), 1.23); + view = new DataView(buffer13_pad10, 0, 26); + view.setFloat64(10, 1.23, true); + assert.sameValue(view.getFloat64(10, true), 1.23); + // Big endian. + view = new DataView(buffer13_r, 0, 16); + view.setFloat64(0, 1.23, false); + assert.sameValue(view.getFloat64(0, false), 1.23); + view = new DataView(buffer13_r_pad3, 0, 19); + view.setFloat64(3, 1.23, false); + assert.sameValue(view.getFloat64(3, false), 1.23); + view = new DataView(buffer13_r_pad7, 0, 23); + view.setFloat64(7, 1.23, false); + assert.sameValue(view.getFloat64(7, false), 1.23); + view = new DataView(buffer13_r_pad10, 0, 26); + view.setFloat64(10, 1.23, false); + assert.sameValue(view.getFloat64(10, false), 1.23); + + // testFloatSet expected=-6213576.4839 + // Little endian + view = new DataView(buffer13, 0, 16); + view.setFloat64(0, -6213576.4839, true); + assert.sameValue(view.getFloat64(0, true), -6213576.4839); + view = new DataView(buffer13_pad3, 0, 19); + view.setFloat64(3, -6213576.4839, true); + assert.sameValue(view.getFloat64(3, true), -6213576.4839); + view = new DataView(buffer13_pad7, 0, 23); + view.setFloat64(7, -6213576.4839, true); + assert.sameValue(view.getFloat64(7, true), -6213576.4839); + view = new DataView(buffer13_pad10, 0, 26); + view.setFloat64(10, -6213576.4839, true); + assert.sameValue(view.getFloat64(10, true), -6213576.4839); + // Big endian. + view = new DataView(buffer13_r, 0, 16); + view.setFloat64(0, -6213576.4839, false); + assert.sameValue(view.getFloat64(0, false), -6213576.4839); + view = new DataView(buffer13_r_pad3, 0, 19); + view.setFloat64(3, -6213576.4839, false); + assert.sameValue(view.getFloat64(3, false), -6213576.4839); + view = new DataView(buffer13_r_pad7, 0, 23); + view.setFloat64(7, -6213576.4839, false); + assert.sameValue(view.getFloat64(7, false), -6213576.4839); + view = new DataView(buffer13_r_pad10, 0, 26); + view.setFloat64(10, -6213576.4839, false); + assert.sameValue(view.getFloat64(10, false), -6213576.4839); + + // testFloatSet expected=NaN + // Little endian + view = new DataView(buffer13, 0, 16); + view.setFloat64(0, NaN, true); + assert.sameValue(view.getFloat64(0, true), NaN); + view = new DataView(buffer13_pad3, 0, 19); + view.setFloat64(3, NaN, true); + assert.sameValue(view.getFloat64(3, true), NaN); + view = new DataView(buffer13_pad7, 0, 23); + view.setFloat64(7, NaN, true); + assert.sameValue(view.getFloat64(7, true), NaN); + view = new DataView(buffer13_pad10, 0, 26); + view.setFloat64(10, NaN, true); + assert.sameValue(view.getFloat64(10, true), NaN); + // Big endian. + view = new DataView(buffer13_r, 0, 16); + view.setFloat64(0, NaN, false); + assert.sameValue(view.getFloat64(0, false), NaN); + view = new DataView(buffer13_r_pad3, 0, 19); + view.setFloat64(3, NaN, false); + assert.sameValue(view.getFloat64(3, false), NaN); + view = new DataView(buffer13_r_pad7, 0, 23); + view.setFloat64(7, NaN, false); + assert.sameValue(view.getFloat64(7, false), NaN); + view = new DataView(buffer13_r_pad10, 0, 26); + view.setFloat64(10, NaN, false); + assert.sameValue(view.getFloat64(10, false), NaN); + + // testFloatSet expected=-NaN + // Little endian + view = new DataView(buffer13, 0, 16); + view.setFloat64(0, -NaN, true); + assert.sameValue(view.getFloat64(0, true), -NaN); + view = new DataView(buffer13_pad3, 0, 19); + view.setFloat64(3, -NaN, true); + assert.sameValue(view.getFloat64(3, true), -NaN); + view = new DataView(buffer13_pad7, 0, 23); + view.setFloat64(7, -NaN, true); + assert.sameValue(view.getFloat64(7, true), -NaN); + view = new DataView(buffer13_pad10, 0, 26); + view.setFloat64(10, -NaN, true); + assert.sameValue(view.getFloat64(10, true), -NaN); + // Big endian. + view = new DataView(buffer13_r, 0, 16); + view.setFloat64(0, -NaN, false); + assert.sameValue(view.getFloat64(0, false), -NaN); + view = new DataView(buffer13_r_pad3, 0, 19); + view.setFloat64(3, -NaN, false); + assert.sameValue(view.getFloat64(3, false), -NaN); + view = new DataView(buffer13_r_pad7, 0, 23); + view.setFloat64(7, -NaN, false); + assert.sameValue(view.getFloat64(7, false), -NaN); + view = new DataView(buffer13_r_pad10, 0, 26); + view.setFloat64(10, -NaN, false); + assert.sameValue(view.getFloat64(10, false), -NaN); + + // Test for set methods that might write beyond the range + + // testIntegerSets(start=3, length=2) + view = new DataView(buffer13, 3, 2); + view.setInt8(0, 0); + assert.sameValue(view.getInt8(0), 0); + checkThrow(() => view.setInt8(8, -128), RangeError); + checkThrow(() => view.setInt8(15, -1), RangeError); + view.setUint8(0, 0); + assert.sameValue(view.getUint8(0), 0); + checkThrow(() => view.setUint8(8, 128), RangeError); + checkThrow(() => view.setUint8(15, 255), RangeError); + view.setInt16(0, 256, true); + assert.sameValue(view.getInt16(0, true), 256); + checkThrow(() => view.setInt16(5, 26213, true), RangeError); + checkThrow(() => view.setInt16(9, -32127, true), RangeError); + checkThrow(() => view.setInt16(14, -2, true), RangeError); + view.setInt16(0, 1); + assert.sameValue(view.getInt16(0), 1); + checkThrow(() => view.setInt16(5, 25958), RangeError); + checkThrow(() => view.setInt16(9, -32382), RangeError); + checkThrow(() => view.setInt16(14, -257), RangeError); + view.setUint16(0, 256, true); + assert.sameValue(view.getUint16(0, true), 256); + checkThrow(() => view.setUint16(5, 26213, true), RangeError); + checkThrow(() => view.setUint16(9, 33409, true), RangeError); + checkThrow(() => view.setUint16(14, 65534, true), RangeError); + view.setUint16(0, 1); + assert.sameValue(view.getUint16(0), 1); + checkThrow(() => view.setUint16(5, 25958), RangeError); + checkThrow(() => view.setUint16(9, 33154), RangeError); + checkThrow(() => view.setUint16(14, 65279), RangeError); + checkThrow(() => view.setInt32(0, 50462976, true), RangeError); + checkThrow(() => view.setInt32(3, 1717920771, true), RangeError); + checkThrow(() => view.setInt32(6, -2122291354, true), RangeError); + checkThrow(() => view.setInt32(9, -58490239, true), RangeError); + checkThrow(() => view.setInt32(12, -66052, true), RangeError); + checkThrow(() => view.setInt32(0, 66051), RangeError); + checkThrow(() => view.setInt32(3, 56911206), RangeError); + checkThrow(() => view.setInt32(6, 1718059137), RangeError); + checkThrow(() => view.setInt32(9, -2122152964), RangeError); + checkThrow(() => view.setInt32(12, -50462977), RangeError); + checkThrow(() => view.setUint32(0, 50462976, true), RangeError); + checkThrow(() => view.setUint32(3, 1717920771, true), RangeError); + checkThrow(() => view.setUint32(6, 2172675942, true), RangeError); + checkThrow(() => view.setUint32(9, 4236477057, true), RangeError); + checkThrow(() => view.setUint32(12, 4294901244, true), RangeError); + checkThrow(() => view.setUint32(0, 66051), RangeError); + checkThrow(() => view.setUint32(3, 56911206), RangeError); + checkThrow(() => view.setUint32(6, 1718059137), RangeError); + checkThrow(() => view.setUint32(9, 2172814332), RangeError); + checkThrow(() => view.setUint32(12, 4244504319), RangeError); + + // testFloatSets(start=7) + + // testFloatSet expected=10 + // Little endian + view = new DataView(buffer13, 7, 9); + view.setFloat32(0, 10, true); + assert.sameValue(view.getFloat32(0, true), 10); + view = new DataView(buffer13_pad3, 7, 12); + view.setFloat32(3, 10, true); + assert.sameValue(view.getFloat32(3, true), 10); + view = new DataView(buffer13_pad7, 7, 16); + view.setFloat32(7, 10, true); + assert.sameValue(view.getFloat32(7, true), 10); + view = new DataView(buffer13_pad10, 7, 19); + view.setFloat32(10, 10, true); + assert.sameValue(view.getFloat32(10, true), 10); + // Big endian. + view = new DataView(buffer13_r, 7, 9); + view.setFloat32(0, 10, false); + assert.sameValue(view.getFloat32(0, false), 10); + view = new DataView(buffer13_r_pad3, 7, 12); + view.setFloat32(3, 10, false); + assert.sameValue(view.getFloat32(3, false), 10); + view = new DataView(buffer13_r_pad7, 7, 16); + view.setFloat32(7, 10, false); + assert.sameValue(view.getFloat32(7, false), 10); + view = new DataView(buffer13_r_pad10, 7, 19); + view.setFloat32(10, 10, false); + assert.sameValue(view.getFloat32(10, false), 10); + + // testFloatSet expected=1.2300000190734863 + // Little endian + view = new DataView(buffer13, 7, 9); + view.setFloat32(0, 1.2300000190734863, true); + assert.sameValue(view.getFloat32(0, true), 1.2300000190734863); + view = new DataView(buffer13_pad3, 7, 12); + view.setFloat32(3, 1.2300000190734863, true); + assert.sameValue(view.getFloat32(3, true), 1.2300000190734863); + view = new DataView(buffer13_pad7, 7, 16); + view.setFloat32(7, 1.2300000190734863, true); + assert.sameValue(view.getFloat32(7, true), 1.2300000190734863); + view = new DataView(buffer13_pad10, 7, 19); + view.setFloat32(10, 1.2300000190734863, true); + assert.sameValue(view.getFloat32(10, true), 1.2300000190734863); + // Big endian. + view = new DataView(buffer13_r, 7, 9); + view.setFloat32(0, 1.2300000190734863, false); + assert.sameValue(view.getFloat32(0, false), 1.2300000190734863); + view = new DataView(buffer13_r_pad3, 7, 12); + view.setFloat32(3, 1.2300000190734863, false); + assert.sameValue(view.getFloat32(3, false), 1.2300000190734863); + view = new DataView(buffer13_r_pad7, 7, 16); + view.setFloat32(7, 1.2300000190734863, false); + assert.sameValue(view.getFloat32(7, false), 1.2300000190734863); + view = new DataView(buffer13_r_pad10, 7, 19); + view.setFloat32(10, 1.2300000190734863, false); + assert.sameValue(view.getFloat32(10, false), 1.2300000190734863); + + // testFloatSet expected=-45621.37109375 + // Little endian + view = new DataView(buffer13, 7, 9); + view.setFloat32(0, -45621.37109375, true); + assert.sameValue(view.getFloat32(0, true), -45621.37109375); + view = new DataView(buffer13_pad3, 7, 12); + view.setFloat32(3, -45621.37109375, true); + assert.sameValue(view.getFloat32(3, true), -45621.37109375); + view = new DataView(buffer13_pad7, 7, 16); + view.setFloat32(7, -45621.37109375, true); + assert.sameValue(view.getFloat32(7, true), -45621.37109375); + view = new DataView(buffer13_pad10, 7, 19); + view.setFloat32(10, -45621.37109375, true); + assert.sameValue(view.getFloat32(10, true), -45621.37109375); + // Big endian. + view = new DataView(buffer13_r, 7, 9); + view.setFloat32(0, -45621.37109375, false); + assert.sameValue(view.getFloat32(0, false), -45621.37109375); + view = new DataView(buffer13_r_pad3, 7, 12); + view.setFloat32(3, -45621.37109375, false); + assert.sameValue(view.getFloat32(3, false), -45621.37109375); + view = new DataView(buffer13_r_pad7, 7, 16); + view.setFloat32(7, -45621.37109375, false); + assert.sameValue(view.getFloat32(7, false), -45621.37109375); + view = new DataView(buffer13_r_pad10, 7, 19); + view.setFloat32(10, -45621.37109375, false); + assert.sameValue(view.getFloat32(10, false), -45621.37109375); + + // testFloatSet expected=NaN + // Little endian + view = new DataView(buffer13, 7, 9); + view.setFloat32(0, NaN, true); + assert.sameValue(view.getFloat32(0, true), NaN); + view = new DataView(buffer13_pad3, 7, 12); + view.setFloat32(3, NaN, true); + assert.sameValue(view.getFloat32(3, true), NaN); + view = new DataView(buffer13_pad7, 7, 16); + view.setFloat32(7, NaN, true); + assert.sameValue(view.getFloat32(7, true), NaN); + view = new DataView(buffer13_pad10, 7, 19); + view.setFloat32(10, NaN, true); + assert.sameValue(view.getFloat32(10, true), NaN); + // Big endian. + view = new DataView(buffer13_r, 7, 9); + view.setFloat32(0, NaN, false); + assert.sameValue(view.getFloat32(0, false), NaN); + view = new DataView(buffer13_r_pad3, 7, 12); + view.setFloat32(3, NaN, false); + assert.sameValue(view.getFloat32(3, false), NaN); + view = new DataView(buffer13_r_pad7, 7, 16); + view.setFloat32(7, NaN, false); + assert.sameValue(view.getFloat32(7, false), NaN); + view = new DataView(buffer13_r_pad10, 7, 19); + view.setFloat32(10, NaN, false); + assert.sameValue(view.getFloat32(10, false), NaN); + + // testFloatSet expected=-NaN + // Little endian + view = new DataView(buffer13, 7, 9); + view.setFloat32(0, -NaN, true); + assert.sameValue(view.getFloat32(0, true), -NaN); + view = new DataView(buffer13_pad3, 7, 12); + view.setFloat32(3, -NaN, true); + assert.sameValue(view.getFloat32(3, true), -NaN); + view = new DataView(buffer13_pad7, 7, 16); + view.setFloat32(7, -NaN, true); + assert.sameValue(view.getFloat32(7, true), -NaN); + view = new DataView(buffer13_pad10, 7, 19); + view.setFloat32(10, -NaN, true); + assert.sameValue(view.getFloat32(10, true), -NaN); + // Big endian. + view = new DataView(buffer13_r, 7, 9); + view.setFloat32(0, -NaN, false); + assert.sameValue(view.getFloat32(0, false), -NaN); + view = new DataView(buffer13_r_pad3, 7, 12); + view.setFloat32(3, -NaN, false); + assert.sameValue(view.getFloat32(3, false), -NaN); + view = new DataView(buffer13_r_pad7, 7, 16); + view.setFloat32(7, -NaN, false); + assert.sameValue(view.getFloat32(7, false), -NaN); + view = new DataView(buffer13_r_pad10, 7, 19); + view.setFloat32(10, -NaN, false); + assert.sameValue(view.getFloat32(10, false), -NaN); + + // testFloatSet expected=10 + // Little endian + view = new DataView(buffer13, 7, 9); + view.setFloat64(0, 10, true); + assert.sameValue(view.getFloat64(0, true), 10); + view = new DataView(buffer13_pad3, 7, 12); + view.setFloat64(3, 10, true); + assert.sameValue(view.getFloat64(3, true), 10); + view = new DataView(buffer13_pad7, 7, 16); + view.setFloat64(7, 10, true); + assert.sameValue(view.getFloat64(7, true), 10); + view = new DataView(buffer13_pad10, 7, 19); + view.setFloat64(10, 10, true); + assert.sameValue(view.getFloat64(10, true), 10); + // Big endian. + view = new DataView(buffer13_r, 7, 9); + view.setFloat64(0, 10, false); + assert.sameValue(view.getFloat64(0, false), 10); + view = new DataView(buffer13_r_pad3, 7, 12); + view.setFloat64(3, 10, false); + assert.sameValue(view.getFloat64(3, false), 10); + view = new DataView(buffer13_r_pad7, 7, 16); + view.setFloat64(7, 10, false); + assert.sameValue(view.getFloat64(7, false), 10); + view = new DataView(buffer13_r_pad10, 7, 19); + view.setFloat64(10, 10, false); + assert.sameValue(view.getFloat64(10, false), 10); + + // testFloatSet expected=1.23 + // Little endian + view = new DataView(buffer13, 7, 9); + view.setFloat64(0, 1.23, true); + assert.sameValue(view.getFloat64(0, true), 1.23); + view = new DataView(buffer13_pad3, 7, 12); + view.setFloat64(3, 1.23, true); + assert.sameValue(view.getFloat64(3, true), 1.23); + view = new DataView(buffer13_pad7, 7, 16); + view.setFloat64(7, 1.23, true); + assert.sameValue(view.getFloat64(7, true), 1.23); + view = new DataView(buffer13_pad10, 7, 19); + view.setFloat64(10, 1.23, true); + assert.sameValue(view.getFloat64(10, true), 1.23); + // Big endian. + view = new DataView(buffer13_r, 7, 9); + view.setFloat64(0, 1.23, false); + assert.sameValue(view.getFloat64(0, false), 1.23); + view = new DataView(buffer13_r_pad3, 7, 12); + view.setFloat64(3, 1.23, false); + assert.sameValue(view.getFloat64(3, false), 1.23); + view = new DataView(buffer13_r_pad7, 7, 16); + view.setFloat64(7, 1.23, false); + assert.sameValue(view.getFloat64(7, false), 1.23); + view = new DataView(buffer13_r_pad10, 7, 19); + view.setFloat64(10, 1.23, false); + assert.sameValue(view.getFloat64(10, false), 1.23); + + // testFloatSet expected=-6213576.4839 + // Little endian + view = new DataView(buffer13, 7, 9); + view.setFloat64(0, -6213576.4839, true); + assert.sameValue(view.getFloat64(0, true), -6213576.4839); + view = new DataView(buffer13_pad3, 7, 12); + view.setFloat64(3, -6213576.4839, true); + assert.sameValue(view.getFloat64(3, true), -6213576.4839); + view = new DataView(buffer13_pad7, 7, 16); + view.setFloat64(7, -6213576.4839, true); + assert.sameValue(view.getFloat64(7, true), -6213576.4839); + view = new DataView(buffer13_pad10, 7, 19); + view.setFloat64(10, -6213576.4839, true); + assert.sameValue(view.getFloat64(10, true), -6213576.4839); + // Big endian. + view = new DataView(buffer13_r, 7, 9); + view.setFloat64(0, -6213576.4839, false); + assert.sameValue(view.getFloat64(0, false), -6213576.4839); + view = new DataView(buffer13_r_pad3, 7, 12); + view.setFloat64(3, -6213576.4839, false); + assert.sameValue(view.getFloat64(3, false), -6213576.4839); + view = new DataView(buffer13_r_pad7, 7, 16); + view.setFloat64(7, -6213576.4839, false); + assert.sameValue(view.getFloat64(7, false), -6213576.4839); + view = new DataView(buffer13_r_pad10, 7, 19); + view.setFloat64(10, -6213576.4839, false); + assert.sameValue(view.getFloat64(10, false), -6213576.4839); + + // testFloatSet expected=NaN + // Little endian + view = new DataView(buffer13, 7, 9); + view.setFloat64(0, NaN, true); + assert.sameValue(view.getFloat64(0, true), NaN); + view = new DataView(buffer13_pad3, 7, 12); + view.setFloat64(3, NaN, true); + assert.sameValue(view.getFloat64(3, true), NaN); + view = new DataView(buffer13_pad7, 7, 16); + view.setFloat64(7, NaN, true); + assert.sameValue(view.getFloat64(7, true), NaN); + view = new DataView(buffer13_pad10, 7, 19); + view.setFloat64(10, NaN, true); + assert.sameValue(view.getFloat64(10, true), NaN); + // Big endian. + view = new DataView(buffer13_r, 7, 9); + view.setFloat64(0, NaN, false); + assert.sameValue(view.getFloat64(0, false), NaN); + view = new DataView(buffer13_r_pad3, 7, 12); + view.setFloat64(3, NaN, false); + assert.sameValue(view.getFloat64(3, false), NaN); + view = new DataView(buffer13_r_pad7, 7, 16); + view.setFloat64(7, NaN, false); + assert.sameValue(view.getFloat64(7, false), NaN); + view = new DataView(buffer13_r_pad10, 7, 19); + view.setFloat64(10, NaN, false); + assert.sameValue(view.getFloat64(10, false), NaN); + + // testFloatSet expected=-NaN + // Little endian + view = new DataView(buffer13, 7, 9); + view.setFloat64(0, -NaN, true); + assert.sameValue(view.getFloat64(0, true), -NaN); + view = new DataView(buffer13_pad3, 7, 12); + view.setFloat64(3, -NaN, true); + assert.sameValue(view.getFloat64(3, true), -NaN); + view = new DataView(buffer13_pad7, 7, 16); + view.setFloat64(7, -NaN, true); + assert.sameValue(view.getFloat64(7, true), -NaN); + view = new DataView(buffer13_pad10, 7, 19); + view.setFloat64(10, -NaN, true); + assert.sameValue(view.getFloat64(10, true), -NaN); + // Big endian. + view = new DataView(buffer13_r, 7, 9); + view.setFloat64(0, -NaN, false); + assert.sameValue(view.getFloat64(0, false), -NaN); + view = new DataView(buffer13_r_pad3, 7, 12); + view.setFloat64(3, -NaN, false); + assert.sameValue(view.getFloat64(3, false), -NaN); + view = new DataView(buffer13_r_pad7, 7, 16); + view.setFloat64(7, -NaN, false); + assert.sameValue(view.getFloat64(7, false), -NaN); + view = new DataView(buffer13_r_pad10, 7, 19); + view.setFloat64(10, -NaN, false); + assert.sameValue(view.getFloat64(10, false), -NaN); + + // Test for set methods that write to negative index + + // testSetNegativeIndexes + view = new DataView(buffer1, 0, 16); + checkThrow(() => view.setInt8(-1, 0), RangeError); + checkThrow(() => view.setInt8(-2, 0), RangeError); + checkThrow(() => view.setUint8(-1, 0), RangeError); + checkThrow(() => view.setUint8(-2, 0), RangeError); + checkThrow(() => view.setInt16(-1, 0), RangeError); + checkThrow(() => view.setInt16(-2, 0), RangeError); + checkThrow(() => view.setInt16(-3, 0), RangeError); + checkThrow(() => view.setUint16(-1, 0), RangeError); + checkThrow(() => view.setUint16(-2, 0), RangeError); + checkThrow(() => view.setUint16(-3, 0), RangeError); + checkThrow(() => view.setInt32(-1, 0), RangeError); + checkThrow(() => view.setInt32(-3, 0), RangeError); + checkThrow(() => view.setInt32(-5, 0), RangeError); + checkThrow(() => view.setUint32(-1, 0), RangeError); + checkThrow(() => view.setUint32(-3, 0), RangeError); + checkThrow(() => view.setUint32(-5, 0), RangeError); + view = new DataView(buffer7, 0, 8); + checkThrow(() => view.setFloat32(-1, 0), RangeError); + checkThrow(() => view.setFloat32(-3, 0), RangeError); + checkThrow(() => view.setFloat32(-5, 0), RangeError); + checkThrow(() => view.setFloat64(-1, 0), RangeError); + checkThrow(() => view.setFloat64(-5, 0), RangeError); + checkThrow(() => view.setFloat64(-9, 0), RangeError); + + // Too large for signed 32 bit integer index + checkThrow(() => view.setInt8(2147483649, 1), RangeError); + checkThrow(() => view.setUint8(2147483649, 1), RangeError); + checkThrow(() => view.setInt16(2147483649, 1), RangeError); + checkThrow(() => view.setUint16(2147483649, 1), RangeError); + checkThrow(() => view.setInt32(2147483649, 1), RangeError); + checkThrow(() => view.setUint32(2147483649, 1), RangeError); + checkThrow(() => view.setFloat32(2147483649, 1), RangeError); + checkThrow(() => view.setFloat64(2147483649, 1), RangeError); + + // testAlignment + var intArray1 = [0, 1, 2, 3, 100, 101, 102, 103, 128, 129, 130, 131, 252, 253, 254, 255]; + view = new DataView(bufferize(new Uint8Array(intArray1)), 0); + assert.sameValue(view.getUint32(0, false), 0x00010203); + view = new DataView(bufferize(new Uint8Array(intArray1)), 1); + assert.sameValue(view.getUint32(0, false), 0x01020364); + view = new DataView(bufferize(new Uint8Array(intArray1)), 2); + assert.sameValue(view.getUint32(0, false), 0x02036465); + view = new DataView(bufferize(new Uint8Array(intArray1)), 3); + assert.sameValue(view.getUint32(0, false), 0x03646566); + view = new DataView(bufferize(new Uint8Array(intArray1)), 4); + assert.sameValue(view.getUint32(0, false), 0x64656667); + view = new DataView(bufferize(new Uint8Array(intArray1)), 5); + assert.sameValue(view.getUint32(0, false), 0x65666780); + view = new DataView(bufferize(new Uint8Array(intArray1)), 6); + assert.sameValue(view.getUint32(0, false), 0x66678081); + view = new DataView(bufferize(new Uint8Array(intArray1)), 7); + assert.sameValue(view.getUint32(0, false), 0x67808182); + + // Test for indexing into a DataView, which should not use the ArrayBuffer storage + view = new DataView(bufferize(new Uint8Array([1, 2]))); + assert.sameValue(view[0], undefined); + view[0] = 3; + assert.sameValue(view[0], 3); + assert.sameValue(view.getUint8(0), 1); + + // Test WebIDL-specific class and prototype class names + assert.sameValue(Object.prototype.toString.apply(new Uint8Array(0)), "[object Uint8Array]"); + assert.sameValue(Object.prototype.toString.apply(new Float32Array(0)), "[object Float32Array]"); + assert.sameValue(Object.prototype.toString.apply(new ArrayBuffer()), "[object ArrayBuffer]"); + assert.sameValue(Object.prototype.toString.apply(new DataView(view.buffer)), "[object DataView]"); + assert.sameValue(Object.prototype.toString.apply(DataView.prototype), "[object DataView]"); + + // get %TypedArray%.prototype[@@toStringTag] returns undefined thus + // Object.prototype.toString falls back to [object Object] + assert.sameValue(Object.prototype.toString.apply(Uint8Array.prototype), "[object Object]"); + assert.sameValue(Object.prototype.toString.apply(Float32Array.prototype), "[object Object]"); + var typedArrayPrototype = Object.getPrototypeOf(Float32Array.prototype); + assert.sameValue(Object.prototype.toString.apply(typedArrayPrototype), "[object Object]"); + + // Accessing DataView fields on DataView.prototype should crash + checkThrow(() => DataView.prototype.byteLength, TypeError); + checkThrow(() => DataView.prototype.byteOffset, TypeError); + checkThrow(() => DataView.prototype.buffer, TypeError); + + // Protos and proxies, oh my! + var alien = createNewGlobal(); + var alien_data = alien.eval('data = ' + JSON.stringify(data1)); + var alien_buffer = alien.eval(`buffer = new ${sharedMem ? 'Shared' : ''}ArrayBuffer(data.length)`); + alien.eval('new Uint8Array(buffer).set(data)'); + var alien_view = alien.eval('view = new DataView(buffer, 0, 16)'); + + // proto is view of buffer: should throw + var o = Object.create(view1); + checkThrow(() => o.getUint8(4), TypeError); // WebIDL 4.4.7: Operations + checkThrow(() => o.buffer, TypeError); // WebIDL 4.4.6: Attributes, section 2 + checkThrow(() => o.byteOffset, TypeError); + checkThrow(() => o.byteLength, TypeError); + + // proxy for view of buffer: should work + assert.sameValue(alien_view.buffer.byteLength > 0, true); + assert.sameValue(alien_view.getUint8(4), 100); + + // Bug 753996: when throwing an Error whose message contains the name of a + // function, the JS engine calls js_ValueToFunction to produce the function + // name to include in the message. js_ValueToFunction does not unwrap its + // argument. So if the function is actually a wrapper, then + // js_ValueToFunction will throw a TypeError ("X is not a function"). + // Confusingly, this TypeError uses the decompiler, which *will* unwrap the + // object to get the wrapped function name out, so the final error will + // look something like "SomeFunction() is not a function".) + var weirdo = Object.create(alien.eval("new Date")); + var e = null; + try { + weirdo.getTime(); + } catch (exc) { + e = exc; + } + if (!e) { + print("==== TODO but PASSED? ===="); + print("Bug 753996 unexpectedly passed"); + } + + // proto is proxy for view of buffer: should throw TypeError + // + // As of this writing, bug 753996 causes this to throw the *wrong* + // TypeError, and in fact it throws a (thisglobal).TypeError instead of + // alien.TypeError. + var av = Object.create(alien_view); + checkThrowTODO(() => av.getUint8(4), alien.TypeError); + checkThrowTODO(() => av.buffer, alien.TypeError); + + // view of object whose proto is buffer. This should not work per dherman. + // Note that DataView throws a TypeError while TypedArrays create a + // zero-length view. Odd though it seems, this is correct: TypedArrays have + // a constructor that takes a length argument; DataViews do not. So a + // TypedArray will do ToUint32 and end up passing a zero as the + // constructor's length argument. + buffer = Object.create(buffer1); + checkThrow(() => new DataView(buffer), TypeError); + + // view of proxy for buffer + av = new DataView(alien_buffer); + assert.sameValue(av.getUint8(4), 100); + assert.sameValue(Object.getPrototypeOf(av), DataView.prototype); + + // Bug 760904: call another compartment's constructor with an ArrayBuffer + // from this compartment. + var alien_constructor = alien.DataView; + var local_buffer = (new Int8Array(3)).buffer; + var foreign_exchange_student = new alien_constructor(local_buffer); + + // gc bug 787775 + var ab = new ArrayBuffer(4); + var dv = new DataView(ab); + dv = 1; + gc(); + + // Bug 1438569. + dv = new DataView(new ArrayBuffer(20 * 1024 * 1024)); + dv.setInt8(dv.byteLength - 10, 99); + assert.sameValue(dv.getInt8(dv.byteLength - 10), 99); + + // get/setFloat16 + dv = new DataView(new ArrayBuffer(4)); + if (DataView.prototype.getFloat16) { + dv.setInt16(0, 18688); + assert.sameValue(dv.getFloat16(0), 10); + dv.setFloat16(1, 10); + assert.sameValue(dv.getFloat16(1), 10); + assert.sameValue(dv.getInt16(1), 18688); + } + +} + +test(false); + +if (this.SharedArrayBuffer) + test(true); diff --git a/test/staging/sm/extensions/decompile-for-of.js b/test/staging/sm/extensions/decompile-for-of.js new file mode 100644 index 0000000000..3c19085fbc --- /dev/null +++ b/test/staging/sm/extensions/decompile-for-of.js @@ -0,0 +1,32 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-extensions-shell.js, sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +// The decompiler can handle the implicit call to @@iterator in a for-of loop. + +var x; +function check(code, msg) { + assertThrowsInstanceOfWithMessage( + () => eval(code), + TypeError, + msg); +} + +x = {}; +check("for (var v of x) throw fit;", "x is not iterable"); +check("[...x]", "x is not iterable"); +check("Math.hypot(...x)", "x is not iterable"); + +x[Symbol.iterator] = "potato"; +check("for (var v of x) throw fit;", "x is not iterable"); + +x[Symbol.iterator] = {}; +check("for (var v of x) throw fit;", "x[Symbol.iterator] is not a function"); + diff --git a/test/staging/sm/extensions/destructure-accessor.js b/test/staging/sm/extensions/destructure-accessor.js new file mode 100644 index 0000000000..17bb4eeb49 --- /dev/null +++ b/test/staging/sm/extensions/destructure-accessor.js @@ -0,0 +1,84 @@ +/* + * Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/licenses/publicdomain/ + */ + +/*--- +includes: [sm/non262-extensions-shell.js, sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +var gTestfile = 'destructure-accessor.js'; +//----------------------------------------------------------------------------- +var BUGNUMBER = 536472; +var summary = + 'ES5: { get x(v) { } } and { set x(v, v2) { } } should be syntax errors'; + +print(BUGNUMBER + ": " + summary); + +//----------------------------------------------------------------------------- + +function expectOk(s) +{ + try + { + eval(s); + return; + } + catch (e) + { + assert.sameValue(true, false, + "expected no error parsing '" + "', got : " + e); + } +} + +function expectSyntaxError(s) +{ + try + { + eval(s); + throw new Error("no error thrown"); + } + catch (e) + { + assert.sameValue(e instanceof SyntaxError, true, + "expected syntax error parsing '" + s + "', got: " + e); + } +} + +expectSyntaxError("({ get x([]) { } })"); +expectSyntaxError("({ get x({}) { } })"); +expectSyntaxError("({ get x(a, []) { } })"); +expectSyntaxError("({ get x(a, {}) { } })"); +expectSyntaxError("({ get x([], a) { } })"); +expectSyntaxError("({ get x({}, a) { } })"); +expectSyntaxError("({ get x([], a, []) { } })"); +expectSyntaxError("({ get x([], a, {}) { } })"); +expectSyntaxError("({ get x({}, a, []) { } })"); +expectSyntaxError("({ get x({}, a, {}) { } })"); + +expectOk("({ get x() { } })"); + + +expectSyntaxError("({ set x() { } })"); +expectSyntaxError("({ set x(a, []) { } })"); +expectSyntaxError("({ set x(a, b, c) { } })"); + +expectOk("({ set x([]) { } })"); +expectOk("({ set x({}) { } })"); +expectOk("({ set x([a]) { } })"); +expectOk("({ set x([a, b]) { } })"); +expectOk("({ set x([a,]) { } })"); +expectOk("({ set x([a, b,]) { } })"); +expectOk("({ set x([, b]) { } })"); +expectOk("({ set x([, b,]) { } })"); +expectOk("({ set x([, b, c]) { } })"); +expectOk("({ set x([, b, c,]) { } })"); +expectOk("({ set x({ a: a }) { } })"); +expectOk("({ set x({ a: a, b: b }) { } })"); + +//----------------------------------------------------------------------------- + diff --git a/test/staging/sm/extensions/destructuring-__proto__-shorthand-assignment-before-var.js b/test/staging/sm/extensions/destructuring-__proto__-shorthand-assignment-before-var.js new file mode 100644 index 0000000000..4677166536 --- /dev/null +++ b/test/staging/sm/extensions/destructuring-__proto__-shorthand-assignment-before-var.js @@ -0,0 +1,54 @@ +/* + * Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/licenses/publicdomain/ + */ + +/*--- +includes: [sm/non262-extensions-shell.js, sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +var gTestfile = 'destructuring-__proto__-shorthand-assignment-before-var.js'; +var BUGNUMBER = 963641; +var summary = "{ __proto__ } should work as a destructuring assignment pattern"; + +print(BUGNUMBER + ": " + summary); + +/************** + * BEGIN TEST * + **************/ + +function objectWithProtoProperty(v) +{ + var obj = {}; + return Object.defineProperty(obj, "__proto__", + { + enumerable: true, + configurable: true, + writable: true, + value: v + }); +} + +({ __proto__ } = objectWithProtoProperty(17)); +assert.sameValue(__proto__, 17); + +var { __proto__ } = objectWithProtoProperty(42); +assert.sameValue(__proto__, 42); + +function nested() +{ + ({ __proto__ } = objectWithProtoProperty(undefined)); + assert.sameValue(__proto__, undefined); + + var { __proto__ } = objectWithProtoProperty("fnord"); + assert.sameValue(__proto__, "fnord"); +} +nested(); + +/******************************************************************************/ + +print("Tests complete"); diff --git a/test/staging/sm/extensions/destructuring-__proto__-shorthand-assignment.js b/test/staging/sm/extensions/destructuring-__proto__-shorthand-assignment.js new file mode 100644 index 0000000000..2ffdbda7b9 --- /dev/null +++ b/test/staging/sm/extensions/destructuring-__proto__-shorthand-assignment.js @@ -0,0 +1,54 @@ +/* + * Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/licenses/publicdomain/ + */ + +/*--- +includes: [sm/non262-extensions-shell.js, sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +var gTestfile = 'destructuring-__proto__-shorthand-assignment.js'; +var BUGNUMBER = 963641; +var summary = "{ __proto__ } should work as a destructuring assignment pattern"; + +print(BUGNUMBER + ": " + summary); + +/************** + * BEGIN TEST * + **************/ + +function objectWithProtoProperty(v) +{ + var obj = {}; + return Object.defineProperty(obj, "__proto__", + { + enumerable: true, + configurable: true, + writable: true, + value: v + }); +} + +var { __proto__ } = objectWithProtoProperty(42); +assert.sameValue(__proto__, 42); + +({ __proto__ } = objectWithProtoProperty(17)); +assert.sameValue(__proto__, 17); + +function nested() +{ + var { __proto__ } = objectWithProtoProperty("fnord"); + assert.sameValue(__proto__, "fnord"); + + ({ __proto__ } = objectWithProtoProperty(undefined)); + assert.sameValue(__proto__, undefined); +} +nested(); + +/******************************************************************************/ + +print("Tests complete"); diff --git a/test/staging/sm/extensions/destructuring-__proto__-target-assignment.js b/test/staging/sm/extensions/destructuring-__proto__-target-assignment.js new file mode 100644 index 0000000000..dd6356139c --- /dev/null +++ b/test/staging/sm/extensions/destructuring-__proto__-target-assignment.js @@ -0,0 +1,55 @@ +/* + * Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/licenses/publicdomain/ + */ + +/*--- +includes: [sm/non262-extensions-shell.js, sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +var gTestfile = 'destructuring-__proto__-target--assignment.js'; +var BUGNUMBER = 963641; +var summary = + "{ __proto__: target } should work as a destructuring assignment pattern"; + +print(BUGNUMBER + ": " + summary); + +/************** + * BEGIN TEST * + **************/ + +function objectWithProtoProperty(v) +{ + var obj = {}; + return Object.defineProperty(obj, "__proto__", + { + enumerable: true, + configurable: true, + writable: true, + value: v + }); +} + +var { __proto__: target } = objectWithProtoProperty(null); +assert.sameValue(target, null); + +({ __proto__: target } = objectWithProtoProperty("aacchhorrt")); +assert.sameValue(target, "aacchhorrt"); + +function nested() +{ + var { __proto__: target } = objectWithProtoProperty(3.141592654); + assert.sameValue(target, 3.141592654); + + ({ __proto__: target } = objectWithProtoProperty(-0)); + assert.sameValue(target, -0); +} +nested(); + +/******************************************************************************/ + +print("Tests complete"); diff --git a/test/staging/sm/extensions/destructuring-for-inof-__proto__.js b/test/staging/sm/extensions/destructuring-for-inof-__proto__.js new file mode 100644 index 0000000000..06c4471a6f --- /dev/null +++ b/test/staging/sm/extensions/destructuring-for-inof-__proto__.js @@ -0,0 +1,90 @@ +/* + * Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/licenses/publicdomain/ + */ + +/*--- +includes: [sm/non262-extensions-shell.js, sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +var gTestfile = 'destructuring-for-inof-__proto__.js'; +var BUGNUMBER = 963641; +var summary = + "__proto__ should work in destructuring patterns as the targets of " + + "for-in/for-of loops"; + +print(BUGNUMBER + ": " + summary); + +/************** + * BEGIN TEST * + **************/ + +function objectWithProtoProperty(v) +{ + var obj = {}; + return Object.defineProperty(obj, "__proto__", + { + enumerable: true, + configurable: true, + writable: true, + value: v + }); +} + +function* objectWithProtoGenerator(v) +{ + yield objectWithProtoProperty(v); +} + +function* identityGenerator(v) +{ + yield v; +} + +for (var { __proto__: target } of objectWithProtoGenerator(null)) + assert.sameValue(target, null); + +for ({ __proto__: target } of objectWithProtoGenerator("aacchhorrt")) + assert.sameValue(target, "aacchhorrt"); + +for ({ __proto__: target } of identityGenerator(42)) + assert.sameValue(target, Number.prototype); + +for (var { __proto__: target } in { prop: "kneedle" }) + assert.sameValue(target, String.prototype); + +for ({ __proto__: target } in { prop: "snork" }) + assert.sameValue(target, String.prototype); + +for ({ __proto__: target } in { prop: "ohia" }) + assert.sameValue(target, String.prototype); + +function nested() +{ + for (var { __proto__: target } of objectWithProtoGenerator(null)) + assert.sameValue(target, null); + + for ({ __proto__: target } of objectWithProtoGenerator("aacchhorrt")) + assert.sameValue(target, "aacchhorrt"); + + for ({ __proto__: target } of identityGenerator(42)) + assert.sameValue(target, Number.prototype); + + for (var { __proto__: target } in { prop: "kneedle" }) + assert.sameValue(target, String.prototype); + + for ({ __proto__: target } in { prop: "snork" }) + assert.sameValue(target, String.prototype); + + for ({ __proto__: target } in { prop: "ohia" }) + assert.sameValue(target, String.prototype); +} +nested(); + +/******************************************************************************/ + +print("Tests complete"); diff --git a/test/staging/sm/extensions/element-setting-ToNumber-detaches.js b/test/staging/sm/extensions/element-setting-ToNumber-detaches.js new file mode 100644 index 0000000000..2e77588a47 --- /dev/null +++ b/test/staging/sm/extensions/element-setting-ToNumber-detaches.js @@ -0,0 +1,41 @@ +/* + * Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/licenses/publicdomain/ + */ + +/*--- +flags: +- onlyStrict +includes: [sm/non262-extensions-shell.js, sm/non262-shell.js, sm/non262.js] +description: | + pending +esid: pending +---*/ +"use strict"; // make test fail when limitation below is fixed + +var gTestfile = 'element-setting-ToNumber-detaches.js'; +//----------------------------------------------------------------------------- +var BUGNUMBER = 1001547; +var summary = + "Don't assert assigning into memory detached while converting the value to " + + "assign into a number"; + +print(BUGNUMBER + ": " + summary); + +/************** + * BEGIN TEST * + **************/ + +// Technically per current spec the element-sets should throw in strict mode, +// but we just silently do nothing for now, somewhat due to limitations of our +// internal MOP (which can't easily say "try this special behavior, else fall +// back on normal logic"), somewhat because it's consistent with current +// behavior (as of this test's addition) for out-of-bounds sets. + +var ab = new ArrayBuffer(64); +var ta = new Uint32Array(ab); +ta[4] = { valueOf() { $262.detachArrayBuffer(ab); return 5; } }; + +/******************************************************************************/ + +print("Tests complete"); diff --git a/test/staging/sm/extensions/empty.txt b/test/staging/sm/extensions/empty.txt new file mode 100644 index 0000000000..e69de29bb2 diff --git a/test/staging/sm/extensions/error-tostring-function.js b/test/staging/sm/extensions/error-tostring-function.js new file mode 100644 index 0000000000..c34bb04e24 --- /dev/null +++ b/test/staging/sm/extensions/error-tostring-function.js @@ -0,0 +1,52 @@ +/* + * Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/licenses/publicdomain/ + */ + +/*--- +includes: [sm/non262-extensions-shell.js, sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +//----------------------------------------------------------------------------- +var BUGNUMBER = 894653; +var summary = + "Error.prototype.toString called on function objects should work as on any " + + "object"; + +print(BUGNUMBER + ": " + summary); + +/************** + * BEGIN TEST * + **************/ + +function ErrorToString(v) +{ + return Error.prototype.toString.call(v); +} + +// The name property of function objects isn't standardized, so this must be an +// extension-land test. + +assert.sameValue(ErrorToString(function f(){}), "f"); +assert.sameValue(ErrorToString(function g(){}), "g"); +assert.sameValue(ErrorToString(function(){}), ""); + +var fn1 = function() {}; +fn1.message = "ohai"; +assert.sameValue(ErrorToString(fn1), "fn1: ohai"); + +var fn2 = function blerch() {}; +fn2.message = "fnord"; +assert.sameValue(ErrorToString(fn2), "blerch: fnord"); + +var fn3 = function() {}; +fn3.message = ""; +assert.sameValue(ErrorToString(fn3), "fn3"); + +/******************************************************************************/ + +print("Tests complete!"); diff --git a/test/staging/sm/extensions/es5ish-defineGetter-defineSetter.js b/test/staging/sm/extensions/es5ish-defineGetter-defineSetter.js new file mode 100644 index 0000000000..6bd402da3b --- /dev/null +++ b/test/staging/sm/extensions/es5ish-defineGetter-defineSetter.js @@ -0,0 +1,288 @@ +/* + * Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/licenses/publicdomain/ + */ + +/*--- +includes: [sm/non262-extensions-shell.js, sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +//----------------------------------------------------------------------------- +var BUGNUMBER = 715821; +var summary = "Implement __define[GS]etter__ using Object.defineProperty"; + +print(BUGNUMBER + ": " + summary); + +/************* + * UTILITIES * + *************/ + +function s(desc) +{ + if (typeof desc === "undefined") + return ""; + assert.sameValue(typeof desc, "object"); + assert.sameValue(desc !== null, true); + + var str = ", " + + " configurable: <" + desc.configurable + ">,"; + + if (desc.hasOwnProperty("value")) + { + return str + + " value: <" + desc.value + ">," + + " writable: <" + desc.writable + ">>"; + } + + return str + + " get: <" + desc.get + ">," + + " set: <" + desc.set + ">>"; +} + +function checkField(field, desc, expected) +{ + var present = desc.hasOwnProperty(field); + assert.sameValue(present, expected.hasOwnProperty(field), + field + " presence mismatch (got " + s(desc) + ", expected " + s(expected) + ")"); + if (present) + { + assert.sameValue(desc[field], expected[field], + field + " value mismatch (got " + s(desc) + ", expected " + s(expected) + ")"); + } +} + +function check(obj, prop, expected) +{ + var desc = Object.getOwnPropertyDescriptor(obj, prop); + assert.sameValue(typeof desc, typeof expected, + "type mismatch (got " + s(desc) + ", expected " + s(expected) + ")"); + + assert.sameValue(desc.hasOwnProperty("get"), desc.hasOwnProperty("set"), + "bad descriptor: " + s(desc)); + assert.sameValue(desc.hasOwnProperty("value"), desc.hasOwnProperty("writable"), + "bad descriptor: " + s(desc)); + + assert.sameValue(desc.hasOwnProperty("get"), !desc.hasOwnProperty("value"), + "bad descriptor: " + s(desc)); + + checkField("get", desc, expected); + checkField("set", desc, expected); + checkField("value", desc, expected); + checkField("writable", desc, expected); + checkField("enumerable", desc, expected); + checkField("configurable", desc, expected); +} + +function expectTypeError(f) +{ + try + { + f(); + throw new Error("no error thrown"); + } + catch (e) + { + assert.sameValue(e instanceof TypeError, true, + "wrong error thrown: got " + e + ", not a TypeError"); + } +} + +/************** + * BEGIN TEST * + **************/ + +// Adding a new getter, overwriting an existing one + +function g1() { } +var gobj = {}; +gobj.__defineGetter__("foo", g1); +check(gobj, "foo", { get: g1, set: undefined, enumerable: true, configurable: true }); + +function g2() { } +gobj.__defineGetter__("foo", g2); +check(gobj, "foo", { get: g2, set: undefined, enumerable: true, configurable: true }); + +/******************************************************************************/ + +// Adding a new setter, overwriting an existing one + +function s1() { } +var sobj = {}; +sobj.__defineSetter__("bar", s1); +check(sobj, "bar", { get: undefined, set: s1, enumerable: true, configurable: true }); + +function s2() { } +sobj.__defineSetter__("bar", s2); +check(sobj, "bar", { get: undefined, set: s2, enumerable: true, configurable: true }); + +/******************************************************************************/ + +// Adding a new getter, then adding a setter +// Changing an existing accessor's enumerability, then "null"-changing the accessor +// Changing an accessor's configurability, then "null"-changing and real-changing the accessor + +function g3() { } +var gsobj = {}; +gsobj.__defineGetter__("baz", g3); +check(gsobj, "baz", { get: g3, set: undefined, enumerable: true, configurable: true }); + +function s3() { } +gsobj.__defineSetter__("baz", s3); +check(gsobj, "baz", { get: g3, set: s3, enumerable: true, configurable: true }); + +Object.defineProperty(gsobj, "baz", { enumerable: false }); +check(gsobj, "baz", { get: g3, set: s3, enumerable: false, configurable: true }); + +gsobj.__defineGetter__("baz", g3); +check(gsobj, "baz", { get: g3, set: s3, enumerable: true, configurable: true }); + +Object.defineProperty(gsobj, "baz", { enumerable: false }); +check(gsobj, "baz", { get: g3, set: s3, enumerable: false, configurable: true }); + +gsobj.__defineSetter__("baz", s3); +check(gsobj, "baz", { get: g3, set: s3, enumerable: true, configurable: true }); + +Object.defineProperty(gsobj, "baz", { configurable: false }); +expectTypeError(function() { gsobj.__defineSetter__("baz", s2); }); +expectTypeError(function() { gsobj.__defineSetter__("baz", s3); }); +check(gsobj, "baz", { get: g3, set: s3, enumerable: true, configurable: false }); + +/******************************************************************************/ + +// Adding a new setter, then adding a getter +// Changing an existing accessor's enumerability, then "null"-changing the accessor +// Changing an accessor's configurability, then "null"-changing and real-changing the accessor + +function s4() { } +var sgobj = {}; +sgobj.__defineSetter__("baz", s4); +check(sgobj, "baz", { get: undefined, set: s4, enumerable: true, configurable: true }); + +function g4() { } +sgobj.__defineGetter__("baz", g4); +check(sgobj, "baz", { get: g4, set: s4, enumerable: true, configurable: true }); + +Object.defineProperty(sgobj, "baz", { enumerable: false }); +check(sgobj, "baz", { get: g4, set: s4, enumerable: false, configurable: true }); + +sgobj.__defineSetter__("baz", s4); +check(sgobj, "baz", { get: g4, set: s4, enumerable: true, configurable: true }); + +Object.defineProperty(sgobj, "baz", { enumerable: false }); +check(sgobj, "baz", { get: g4, set: s4, enumerable: false, configurable: true }); + +sgobj.__defineSetter__("baz", s4); +check(sgobj, "baz", { get: g4, set: s4, enumerable: true, configurable: true }); + +Object.defineProperty(sgobj, "baz", { configurable: false }); +expectTypeError(function() { sgobj.__defineGetter__("baz", g3); }); +expectTypeError(function() { sgobj.__defineSetter__("baz", s4); }); +check(sgobj, "baz", { get: g4, set: s4, enumerable: true, configurable: false }); + +/******************************************************************************/ + +// Adding a getter over a writable data property + +function g5() { } +var gover = { quux: 17 }; +check(gover, "quux", { value: 17, writable: true, enumerable: true, configurable: true }); + +gover.__defineGetter__("quux", g5); +check(gover, "quux", { get: g5, set: undefined, enumerable: true, configurable: true }); + +/******************************************************************************/ + +// Adding a setter over a writable data property + +function s5() { } +var sover = { quux: 17 }; +check(sover, "quux", { value: 17, writable: true, enumerable: true, configurable: true }); + +sover.__defineSetter__("quux", s5); +check(sover, "quux", { get: undefined, set: s5, enumerable: true, configurable: true }); + +/******************************************************************************/ + +// Adding a getter over a non-writable data property + +function g6() { } +var gnover = { eit: 17 }; +check(gnover, "eit", { value: 17, writable: true, enumerable: true, configurable: true }); +Object.defineProperty(gnover, "eit", { writable: false }); +check(gnover, "eit", { value: 17, writable: false, enumerable: true, configurable: true }); + +gnover.__defineGetter__("eit", g6); +check(gnover, "eit", { get: g6, set: undefined, enumerable: true, configurable: true }); + +/******************************************************************************/ + +// Adding a setter over a non-writable data property + +function s6() { } +var snover = { eit: 17 }; +check(snover, "eit", { value: 17, writable: true, enumerable: true, configurable: true }); +Object.defineProperty(snover, "eit", { writable: false }); +check(snover, "eit", { value: 17, writable: false, enumerable: true, configurable: true }); + +snover.__defineSetter__("eit", s6); +check(snover, "eit", { get: undefined, set: s6, enumerable: true, configurable: true }); + +/******************************************************************************/ + +// Adding a getter over a non-configurable, writable data property + +function g7() { } +var gncover = { moo: 17 }; +check(gncover, "moo", { value: 17, writable: true, enumerable: true, configurable: true }); +Object.defineProperty(gncover, "moo", { configurable: false }); +check(gncover, "moo", { value: 17, writable: true, enumerable: true, configurable: false }); + +expectTypeError(function() { gncover.__defineGetter__("moo", g7); }); +check(gncover, "moo", { value: 17, writable: true, enumerable: true, configurable: false }); + +/******************************************************************************/ + +// Adding a setter over a non-configurable, writable data property + +function s7() { } +var sncover = { moo: 17 }; +check(sncover, "moo", { value: 17, writable: true, enumerable: true, configurable: true }); +Object.defineProperty(sncover, "moo", { configurable: false }); +check(sncover, "moo", { value: 17, writable: true, enumerable: true, configurable: false }); + +expectTypeError(function() { sncover.__defineSetter__("moo", s7); }); +check(sncover, "moo", { value: 17, writable: true, enumerable: true, configurable: false }); + +/******************************************************************************/ + +// Adding a getter over a non-configurable, non-writable data property + +function g8() { } +var gncwover = { fwoosh: 17 }; +check(gncwover, "fwoosh", { value: 17, writable: true, enumerable: true, configurable: true }); +Object.defineProperty(gncwover, "fwoosh", { writable: false, configurable: false }); +check(gncwover, "fwoosh", { value: 17, writable: false, enumerable: true, configurable: false }); + +expectTypeError(function() { gncwover.__defineGetter__("fwoosh", g7); }); +check(gncwover, "fwoosh", { value: 17, writable: false, enumerable: true, configurable: false }); + +/******************************************************************************/ + +// Adding a setter over a non-configurable, non-writable data property + +function s8() { } +var sncwover = { fwoosh: 17 }; +check(sncwover, "fwoosh", { value: 17, writable: true, enumerable: true, configurable: true }); +Object.defineProperty(sncwover, "fwoosh", { writable: false, configurable: false }); +check(sncwover, "fwoosh", { value: 17, writable: false, enumerable: true, configurable: false }); + +expectTypeError(function() { sncwover.__defineSetter__("fwoosh", s7); }); +check(sncwover, "fwoosh", { value: 17, writable: false, enumerable: true, configurable: false }); + +/******************************************************************************/ + +print("Tests complete"); diff --git a/test/staging/sm/extensions/eval-native-callback-is-indirect.js b/test/staging/sm/extensions/eval-native-callback-is-indirect.js new file mode 100644 index 0000000000..0fdd03c487 --- /dev/null +++ b/test/staging/sm/extensions/eval-native-callback-is-indirect.js @@ -0,0 +1,40 @@ +/* + * Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/licenses/publicdomain/ + */ + +/*--- +includes: [sm/non262-extensions-shell.js, sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +//----------------------------------------------------------------------------- +var BUGNUMBER = 604504; +var summary = "eval called from a native function is indirect"; + +print(BUGNUMBER + ": " + summary); + +/************** + * BEGIN TEST * + **************/ + +var originalEval = eval; + +var global = this; +var directCheckCode = "this === global"; + +function testArrayGeneric() +{ + var global = "psych!"; + var eval = Array.map; + + var mapped = eval([directCheckCode], originalEval); + assert.sameValue(mapped[0], true); +} + +/******************************************************************************/ + +print("All tests passed!"); diff --git a/test/staging/sm/extensions/expression-closure-syntax.js b/test/staging/sm/extensions/expression-closure-syntax.js new file mode 100644 index 0000000000..63bfa2f823 --- /dev/null +++ b/test/staging/sm/extensions/expression-closure-syntax.js @@ -0,0 +1,70 @@ +/* + * Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/licenses/publicdomain/ + */ + +/*--- +includes: [sm/non262-extensions-shell.js, sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +//----------------------------------------------------------------------------- +var BUGNUMBER = 1416337; +var summary = + "Expression closure syntax is only permitted for functions that constitute " + + "entire AssignmentExpressions, not PrimaryExpressions that are themselves " + + "components of larger binary expressions"; + +print(BUGNUMBER + ": " + summary); + +/************** + * BEGIN TEST * + **************/ + +{ + function assertThrowsSyntaxError(code) + { + function testOne(replacement) + { + var x, rv; + try + { + rv = eval(code.replace("@@@", replacement)); + } + catch (e) + { + assert.sameValue(e instanceof SyntaxError, true, + "should have thrown a SyntaxError, instead got: " + e); + return; + } + + assert.sameValue(true, false, "should have thrown, instead returned " + rv); + } + + testOne("function"); + testOne("async function"); + } + + assertThrowsSyntaxError("x = ++@@@() 1"); + assertThrowsSyntaxError("x = delete @@@() 1"); + assertThrowsSyntaxError("x = new @@@() 1"); + assertThrowsSyntaxError("x = void @@@() 1"); + assertThrowsSyntaxError("x = +@@@() 1"); + assertThrowsSyntaxError("x = 1 + @@@() 1"); + assertThrowsSyntaxError("x = null != @@@() 1"); + assertThrowsSyntaxError("x = null != @@@() 0 ? 1 : a => {}"); + assertThrowsSyntaxError("x = @@@() 0 ? 1 : a => {} !== null"); + assertThrowsSyntaxError("x = @@@() 0 ? 1 : a => {}.toString"); + assertThrowsSyntaxError("x = @@@() 0 ? 1 : a => {}['toString']"); + assertThrowsSyntaxError("x = @@@() 0 ? 1 : a => {}``"); + assertThrowsSyntaxError("x = @@@() 0 ? 1 : a => {}()"); + assertThrowsSyntaxError("x = @@@() 0 ? 1 : a => {}++"); + assertThrowsSyntaxError("x = @@@() 0 ? 1 : a => {} || 0"); + assertThrowsSyntaxError("x = 0 || @@@() 0 ? 1 : a => {}"); + assertThrowsSyntaxError("x = @@@() 0 ? 1 : a => {} && true"); + assertThrowsSyntaxError("x = true && @@@() 0 ? 1 : a => {}"); +} + diff --git a/test/staging/sm/extensions/extension-methods-reject-null-undefined-this.js b/test/staging/sm/extensions/extension-methods-reject-null-undefined-this.js new file mode 100644 index 0000000000..b84462eb49 --- /dev/null +++ b/test/staging/sm/extensions/extension-methods-reject-null-undefined-this.js @@ -0,0 +1,109 @@ +/* + * Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/licenses/publicdomain/ + */ + +/*--- +includes: [sm/non262-extensions-shell.js, sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ + +//----------------------------------------------------------------------------- +var BUGNUMBER = 619283; +var summary = + "ECMAScript built-in methods that immediately throw when |this| is " + + "|undefined| or |null| (due to CheckObjectCoercible, ToObject, or ToString)"; + +print(BUGNUMBER + ": " + summary); + +/************** + * BEGIN TEST * + **************/ + +// This test fills out for the non-standard methods which +// non262/misc/builtin-methods-reject-null-undefined-this.js declines to test. + +var ClassToMethodMap = + { + Object: ["toSource"], + Function: ["toSource"], + Array: ["toSource"], + String: ["toSource"], + Boolean: ["toSource"], + Number: ["toSource"], + Date: ["toSource"], + RegExp: ["toSource"], + Error: ["toSource"], + }; + +var badThisValues = [null, undefined]; + +function testMethod(Class, className, method) +{ + var expr; + + // Try out explicit this values + for (var i = 0, sz = badThisValues.length; i < sz; i++) + { + var badThis = badThisValues[i]; + + expr = className + ".prototype." + method + ".call(" + badThis + ")"; + try + { + Class.prototype[method].call(badThis); + throw new Error(expr + " didn't throw a TypeError"); + } + catch (e) + { + assert.sameValue(e instanceof TypeError, true, + "wrong error for " + expr + ", instead threw " + e); + } + + expr = className + ".prototype." + method + ".apply(" + badThis + ")"; + try + { + Class.prototype[method].apply(badThis); + throw new Error(expr + " didn't throw a TypeError"); + } + catch (e) + { + assert.sameValue(e instanceof TypeError, true, + "wrong error for " + expr + ", instead threw " + e); + } + } + + // ..and for good measure.. + + expr = "(0, " + className + ".prototype." + method + ")()" + try + { + // comma operator to call GetValue() on the method and de-Reference it + (0, Class.prototype[method])(); + throw new Error(expr + " didn't throw a TypeError"); + } + catch (e) + { + assert.sameValue(e instanceof TypeError, true, + "wrong error for " + expr + ", instead threw " + e); + } +} + +for (var className in ClassToMethodMap) +{ + var Class = this[className]; + + var methodNames = ClassToMethodMap[className]; + for (var i = 0, sz = methodNames.length; i < sz; i++) + { + var method = methodNames[i]; + testMethod(Class, className, method); + } +} + +/******************************************************************************/ + +print("All tests passed!"); diff --git a/test/staging/sm/extensions/file-mapped-arraybuffers.txt b/test/staging/sm/extensions/file-mapped-arraybuffers.txt new file mode 100644 index 0000000000..4289a17b8f --- /dev/null +++ b/test/staging/sm/extensions/file-mapped-arraybuffers.txt @@ -0,0 +1 @@ +01234567abcdefghijkl \ No newline at end of file diff --git a/test/staging/sm/extensions/for-loop-with-lexical-declaration-and-nested-function-statement.js b/test/staging/sm/extensions/for-loop-with-lexical-declaration-and-nested-function-statement.js new file mode 100644 index 0000000000..d9d47a6202 --- /dev/null +++ b/test/staging/sm/extensions/for-loop-with-lexical-declaration-and-nested-function-statement.js @@ -0,0 +1,135 @@ +/* + * Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/licenses/publicdomain/ + */ + +/*--- +includes: [sm/non262-extensions-shell.js, sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +var gTestfile = + "for-loop-with-lexical-declaration-and-nested-function-statement.js"; +//----------------------------------------------------------------------------- +var BUGNUMBER = 1149797; +var summary = + "Don't assert when freshening the scope chain for a for-loop whose head " + + "contains a lexical declaration, where the loop body might add more " + + "bindings at runtime"; + +print(BUGNUMBER + ": " + summary); + +/************** + * BEGIN TEST * + **************/ + +for (let x = 0; x < 9; ++x) { + function q1() {} +} + +{ + for (let x = 0; x < 9; ++x) { + function q2() {} + } +} + +function f1() +{ + for (let x = 0; x < 9; ++x) { + function q3() {} + } +} +f1(); + +function f2() +{ + { + for (let x = 0; x < 9; ++x) { + function q4() {} + } + } +} +f2(); + +for (let x = 0; x < 9; ++x) +{ + // deliberately inside a block statement + function q5() {} +} + +{ + for (let x = 0; x < 9; ++x) + { + // deliberately inside a block statement + function q6() {} + } +} + +function g1() +{ + for (let x = 0; x < 9; ++x) + { + // deliberately inside a block statement + function q7() {} + } +} +g1(); + +function g2() +{ + { + for (let x = 0; x < 9; ++x) + { + // deliberately inside a block statement + function q8() {} + } + } +} +g2(); + +for (let x = 0; x < 9; ++x) { + (function() { + eval("function q9() {}"); + })(); +} + +{ + for (let x = 0; x < 9; ++x) + { + // deliberately inside a block statement + (function() { + eval("function q10() {}"); + })(); + } +} + +function h1() +{ + for (let x = 0; x < 9; ++x) + { + // deliberately inside a block statement + (function() { + eval("function q11() {}"); + })(); + } +} +h1(); + +function h2() +{ + { + for (let x = 0; x < 9; ++x) + { + // deliberately inside a block statement + (function() { eval("function q12() {}"); })(); + } + } +} +h2(); + +/******************************************************************************/ + +print("Tests complete"); diff --git a/test/staging/sm/extensions/function-caller-skips-eval-frames.js b/test/staging/sm/extensions/function-caller-skips-eval-frames.js new file mode 100644 index 0000000000..c481577e6f --- /dev/null +++ b/test/staging/sm/extensions/function-caller-skips-eval-frames.js @@ -0,0 +1,41 @@ +/* + * Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/licenses/publicdomain/ + */ + +/*--- +includes: [sm/non262-extensions-shell.js, sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +function innermost() { return arguments.callee.caller; } +function nest() { return eval("innermost();"); } +function nest2() { return nest(); } + +assert.sameValue(nest2(), nest); + +var innermost = function innermost() { return arguments.callee.caller.caller; }; + +assert.sameValue(nest2(), nest2); + +function nestTwice() { return eval("eval('innermost();');"); } +var nest = nestTwice; + +assert.sameValue(nest2(), nest2); + +function innermostEval() { return eval("arguments.callee.caller"); } +var innermost = innermostEval; + +assert.sameValue(nest2(), nestTwice); + +function innermostEvalTwice() { return eval('eval("arguments.callee.caller");'); } +var innermost = innermostEvalTwice; + +assert.sameValue(nest2(), nestTwice); + +/******************************************************************************/ + +print("Tests complete"); diff --git a/test/staging/sm/extensions/function-properties.js b/test/staging/sm/extensions/function-properties.js new file mode 100644 index 0000000000..22d4b6fccd --- /dev/null +++ b/test/staging/sm/extensions/function-properties.js @@ -0,0 +1,28 @@ +/* + * Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/licenses/publicdomain/ + */ + +/*--- +includes: [sm/non262-extensions-shell.js, sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +function foo() +{ + assert.sameValue(foo.arguments.length, 0); + assert.sameValue(foo.caller, null); +} + +assert.sameValue(foo.arguments, null); +assert.sameValue(foo.caller, null); +foo(); +assert.sameValue(foo.arguments, null); +assert.sameValue(foo.caller, null); + +/******************************************************************************/ + +print("Tests complete"); diff --git a/test/staging/sm/extensions/getOwnPropertyNames-__proto__.js b/test/staging/sm/extensions/getOwnPropertyNames-__proto__.js new file mode 100644 index 0000000000..412294d731 --- /dev/null +++ b/test/staging/sm/extensions/getOwnPropertyNames-__proto__.js @@ -0,0 +1,31 @@ +/* + * Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/licenses/publicdomain/ + */ + +/*--- +includes: [sm/non262-extensions-shell.js, sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +//----------------------------------------------------------------------------- +var BUGNUMBER = 837630; +var summary ='__proto__ should show up with O.getOwnPropertyNames(O.prototype)'; + +print(BUGNUMBER + ": " + summary); + +/************** + * BEGIN TEST * + **************/ + +var keys = Object.getOwnPropertyNames(Object.prototype); +assert.sameValue(keys.indexOf("__proto__") >= 0, true, + "should have gotten __proto__ as a property of Object.prototype " + + "(got these properties: " + keys + ")"); + +/******************************************************************************/ + +print("Tests complete"); diff --git a/test/staging/sm/extensions/inc-dec-functioncall.js b/test/staging/sm/extensions/inc-dec-functioncall.js new file mode 100644 index 0000000000..5927a5095b --- /dev/null +++ b/test/staging/sm/extensions/inc-dec-functioncall.js @@ -0,0 +1,95 @@ +/* + * Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/licenses/publicdomain/ + */ + +/*--- +includes: [sm/non262-extensions-shell.js, sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +//----------------------------------------------------------------------------- +var BUGNUMBER = 609756; +var summary = + "Perform ToNumber on the result of the |fun()| in |fun()++| before " + + "throwing"; + +print(BUGNUMBER + ": " + summary); + +/************** + * BEGIN TEST * + **************/ + +var hadSideEffect; + +function f() +{ + return { valueOf: function() { hadSideEffect = true; return 0; } }; +} + +hadSideEffect = false; +assertThrowsInstanceOf(function() { f()++; }, ReferenceError); +assert.sameValue(hadSideEffect, true); + +hadSideEffect = false; +assertThrowsInstanceOf(function() { + for (var i = 0; i < 20; i++) + { + if (i > 18) + f()++; + } +}, ReferenceError); +assert.sameValue(hadSideEffect, true); + + +hadSideEffect = false; +assertThrowsInstanceOf(function() { f()--; }, ReferenceError); +assert.sameValue(hadSideEffect, true); + +hadSideEffect = false; +assertThrowsInstanceOf(function() { + for (var i = 0; i < 20; i++) + { + if (i > 18) + f()--; + } +}, ReferenceError); +assert.sameValue(hadSideEffect, true); + + +hadSideEffect = false; +assertThrowsInstanceOf(function() { ++f(); }, ReferenceError); +assert.sameValue(hadSideEffect, true); + +hadSideEffect = false; +assertThrowsInstanceOf(function() { + for (var i = 0; i < 20; i++) + { + if (i > 18) + ++f(); + } +}, ReferenceError); +assert.sameValue(hadSideEffect, true); + + +hadSideEffect = false; +assertThrowsInstanceOf(function() { --f(); }, ReferenceError); +assert.sameValue(hadSideEffect, true); + +hadSideEffect = false; +assertThrowsInstanceOf(function() { + for (var i = 0; i < 20; i++) + { + if (i > 18) + --f(); + } +}, ReferenceError); +assert.sameValue(hadSideEffect, true); + + +/******************************************************************************/ + +print("Tests complete"); diff --git a/test/staging/sm/extensions/keyword-unescaped-requirement.js b/test/staging/sm/extensions/keyword-unescaped-requirement.js new file mode 100644 index 0000000000..4bc62b9ea7 --- /dev/null +++ b/test/staging/sm/extensions/keyword-unescaped-requirement.js @@ -0,0 +1,48 @@ +/* + * Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/licenses/publicdomain/ + */ + +/*--- +includes: [sm/non262-extensions-shell.js, sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +//----------------------------------------------------------------------------- +var BUGNUMBER = 1204027; +var summary = + "Escape sequences aren't allowed in bolded grammar tokens (that is, in " + + "keywords, possibly contextual keywords)"; + +print(BUGNUMBER + ": " + summary); + +/************** + * BEGIN TEST * + **************/ + +var randomExtensions = + [ + "for \\u0065ach (var x in []);", + "for e\\u0061ch (var x in []);", + "[0 for \\u0065ach (var x in [])]", + "[0 for e\\u0061ch (var x in [])]", + "(0 for \\u0065ach (var x in []))", + "(0 for e\\u0061ch (var x in []))", + + // Soon to be not an extension, maybe... + "(for (x \\u006ff [1]) x)", + "(for (x o\\u0066 [1]) x)", + ]; + +for (var extension of randomExtensions) +{ + assertThrowsInstanceOf(() => Function(extension), SyntaxError, + "bad behavior for: " + extension); +} + +/******************************************************************************/ + +print("Tests complete"); diff --git a/test/staging/sm/extensions/mutable-proto-special-form.js b/test/staging/sm/extensions/mutable-proto-special-form.js new file mode 100644 index 0000000000..3d4bfc0ea5 --- /dev/null +++ b/test/staging/sm/extensions/mutable-proto-special-form.js @@ -0,0 +1,98 @@ +/* + * Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/licenses/publicdomain/ + */ + +/*--- +includes: [sm/non262-extensions-shell.js, sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +//----------------------------------------------------------------------------- +var BUGNUMBER = 948583; +var summary = + "Make __proto__ in object literals a special form not influenced by " + + "|Object.prototype|"; + +print(BUGNUMBER + ": " + summary); + +/************** + * BEGIN TEST * + **************/ + +var passed = true; + +function performProtoTests(msg) +{ + print("Testing " + msg); + assert.sameValue(passed, true, "passed wrong at start of test set"); + + assert.sameValue(Object.getPrototypeOf({ __proto__: null }), null); + assert.sameValue(Object.getPrototypeOf({ __proto__: undefined }), Object.prototype); + assert.sameValue(Object.getPrototypeOf({ __proto__: 17 }), Object.prototype); + + var obj = {}; + assert.sameValue(Object.getPrototypeOf({ __proto__: obj }), obj); + + assert.sameValue(passed, true, "passed wrong at end of test set"); + print("Tests of " + msg + " passed!"); +} + +function poisonProto(obj) +{ + Object.defineProperty(obj, "__proto__", + { + configurable: true, + enumerable: true, + set: function(v) { passed = false; }, + }); +} + +performProtoTests("initial behavior"); + +var desc = Object.getOwnPropertyDescriptor(Object.prototype, "__proto__"); +var setProto = desc.set; +delete Object.prototype.__proto__; + +performProtoTests("behavior after Object.prototype.__proto__ deletion"); + +Object.defineProperty(Object.prototype, "__proto__", + { + configurable: true, + enumerable: false, + set: function(v) { passed = false; }, + }); + +performProtoTests("behavior after making Object.prototype.__proto__ a " + + "custom setter"); + +Object.defineProperty(Object.prototype, "__proto__", { set: undefined }); + +performProtoTests("behavior after making Object.prototype.__proto__'s " + + "[[Set]] === undefined"); + +try +{ + var superProto = Object.create(null); + poisonProto(superProto); + setProto.call(Object.prototype, superProto); + + performProtoTests("behavior after mutating Object.prototype.[[Prototype]]"); + + // Note: The handler below will have to be updated to exempt a scriptable + // getPrototypeOf trap (to instead consult the target whose [[Prototype]] + // is safely non-recursive), if we ever implement one. + var death = new Proxy(Object.create(null), + new Proxy({}, { get: function() { passed = false; } })); + + setProto.call(Object.prototype, death); + + performProtoTests("behavior after making Object.prototype.[[Prototype]] a " + + "proxy that throws for any access"); +} +catch (e) {} + +print("Tests complete"); diff --git a/test/staging/sm/extensions/nested-delete-name-in-evalcode.js b/test/staging/sm/extensions/nested-delete-name-in-evalcode.js new file mode 100644 index 0000000000..95bc1c97ac --- /dev/null +++ b/test/staging/sm/extensions/nested-delete-name-in-evalcode.js @@ -0,0 +1,92 @@ +/* + * Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/licenses/publicdomain/ + */ + +/*--- +includes: [sm/non262-extensions-shell.js, sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +//----------------------------------------------------------------------------- +var BUGNUMBER = 616294; +var summary = + "|delete x| inside a function in eval code, where that eval code includes " + + "|var x| at top level, actually does delete the binding for x"; + +print(BUGNUMBER + ": " + summary); + +/************** + * BEGIN TEST * + **************/ + +var f; + +function testOuterLet() +{ + return eval("let x; (function() { return delete x; })"); +} + +f = testOuterLet(); + +assert.sameValue(f(), false); // can't delete lexical declarations => false + + +function testOuterForLet() +{ + return eval("for (let x; false; ); (function() { return delete x; })"); +} + +f = testOuterForLet(); + +assert.sameValue(f(), true); // not there => true (only non-configurable => false) + + +function testOuterForInLet() +{ + return eval("for (let x in {}); (function() { return delete x; })"); +} + +f = testOuterForInLet(); + +assert.sameValue(f(), true); // configurable, so remove => true +assert.sameValue(f(), true); // not there => true (only non-configurable => false) + + +function testOuterNestedVarInForLet() +{ + return eval("for (let q = 0; q < 5; q++) { var x; } (function() { return delete x; })"); +} + +f = testOuterNestedVarInForLet(); + +assert.sameValue(f(), true); // configurable, so remove => true +assert.sameValue(f(), true); // there => true + + +function testArgumentShadowLet() +{ + return eval("let x; (function(x) { return delete x; })"); +} + +f = testArgumentShadowLet(); + +assert.sameValue(f(), false); // non-configurable argument => false + + +function testFunctionLocal() +{ + return eval("(function() { let x; return delete x; })"); +} + +f = testFunctionLocal(); + +assert.sameValue(f(), false); // defined by function code => not configurable => false + + +/******************************************************************************/ + +print("All tests passed!"); diff --git a/test/staging/sm/extensions/new-cross-compartment.js b/test/staging/sm/extensions/new-cross-compartment.js new file mode 100644 index 0000000000..d3dfc95a88 --- /dev/null +++ b/test/staging/sm/extensions/new-cross-compartment.js @@ -0,0 +1,46 @@ +/* + * Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/licenses/publicdomain/ + */ + +/*--- +includes: [sm/non262-extensions-shell.js, sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +//----------------------------------------------------------------------------- +var BUGNUMBER = 1178653; +var summary = + "|new| on a cross-compartment wrapper to a non-constructor shouldn't assert"; + +print(BUGNUMBER + ": " + summary); + +/************** + * BEGIN TEST * + **************/ + +var g = createNewGlobal(); + +var otherStr = new g.String("foo"); +assert.sameValue(otherStr instanceof g.String, true); +assert.sameValue(otherStr.valueOf(), "foo"); + +try +{ + var constructor = g.parseInt; + new constructor(); + throw new Error("no error thrown"); +} +catch (e) +{ + // NOTE: not |g.TypeError|, because |new| itself throws because + // |!IsConstructor(constructor)|. + assert.sameValue(e instanceof TypeError, true); +} + +/******************************************************************************/ + +print("Tests complete"); diff --git a/test/staging/sm/extensions/new-parenthesization.js b/test/staging/sm/extensions/new-parenthesization.js new file mode 100644 index 0000000000..ae19953228 --- /dev/null +++ b/test/staging/sm/extensions/new-parenthesization.js @@ -0,0 +1,26 @@ +/* + * Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/licenses/publicdomain/ + */ + +/*--- +includes: [sm/non262-extensions-shell.js, sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +//----------------------------------------------------------------------------- +var BUGNUMBER = 521456; +var summary = + 'Incorrect decompilation of new (eval(v)).s and new (f.apply(2)).s'; +printBugNumber(BUGNUMBER); +printStatus(summary); + +function foo(c) { return new (eval(c)).s; } +function bar(f) { var a = new (f.apply(2).s); return a; } + +assert.sameValue(bar.toString().search(/new\s+f/), -1); +assert.sameValue(foo.toString().search(/new\s+eval/), -1); + diff --git a/test/staging/sm/extensions/newer-type-functions-caller-arguments.js b/test/staging/sm/extensions/newer-type-functions-caller-arguments.js new file mode 100644 index 0000000000..fc80c8bce6 --- /dev/null +++ b/test/staging/sm/extensions/newer-type-functions-caller-arguments.js @@ -0,0 +1,103 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-extensions-shell.js, sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +// Tests that newer-type functions (i.e. anything not defined by regular function declarations and +// expressions) throw when accessing their 'arguments' and 'caller' properties. + +// 9.2.7 (AddRestrictedFunctionProperties) defines accessors on Function.prototype which throw on +// every 'get' and 'set' of 'caller' and 'arguments'. +// Additionally, 16.2 (Forbidden Extensions) forbids adding properties to all non-"legacy" function +// declarations and expressions. This creates the effect that all newer-style functions act like +// strict-mode functions when accessing their 'caller' and 'arguments' properties. + +const container = { + async asyncMethod() {}, + *genMethod() {}, + method() {}, + get getterMethod() {}, + set setterMethod(x) {}, +}; + +function* genDecl(){} +async function asyncDecl(){} +class classDecl {} +class extClassDecl extends Object {} +class classDeclExplicitCtor { constructor(){} } +class extClassDeclExplicitCtor extends Object { constructor(){} } + +const functions = [ + // Declarations + genDecl, + asyncDecl, + classDecl, + extClassDecl, + classDeclExplicitCtor, + extClassDeclExplicitCtor, + + // Expressions + async function(){}, + function*(){}, + () => {}, + async () => {}, + class {}, + class extends Object {}, + class { constructor(){} }, + class extends Object { constructor(){} }, + + // Methods + container.asyncMethod, + container.genMethod, + container.method, + Object.getOwnPropertyDescriptor(container, "getterMethod").get, + Object.getOwnPropertyDescriptor(container, "setterMethod").set, + + // Bound functions + function(){}.bind(), + + // Built-ins (native and self-hosted) + Function, + Function.prototype.bind, +]; + +const supportsAsyncGenerator = (function() { + try { + eval("async function* f(){}"); + return true; + } catch (e) { + return false; + } +})(); + +if (supportsAsyncGenerator) { +eval(` + async function* asyncGenDecl(){} + + functions.push(asyncGenDecl); + functions.push(async function*(){}); + functions.push({async* asyncGenerator(){}}.asyncGenerator); +`); +} + +functions.forEach(f => { + checkArgumentsAccess(f); + checkCallerAccess(f); +}); + +function checkArgumentsAccess(f) { + assertThrowsInstanceOf(() => f.arguments, TypeError, + `Expected 'arguments' property access to throw on ${f}`); +} + +function checkCallerAccess(f) { + assertThrowsInstanceOf(() => f.caller, TypeError, + `Expected 'caller' property access to throw on ${f}`); +} + diff --git a/test/staging/sm/extensions/proxy-array-target-length-definition.js b/test/staging/sm/extensions/proxy-array-target-length-definition.js new file mode 100644 index 0000000000..4234bccdd8 --- /dev/null +++ b/test/staging/sm/extensions/proxy-array-target-length-definition.js @@ -0,0 +1,60 @@ +/* + * Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/licenses/publicdomain/ + */ + +/*--- +includes: [sm/non262-extensions-shell.js, sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +var gTestfile = 'proxy-array-target-length-definition.js'; +var BUGNUMBER = 905947; +var summary = + "Redefining an array's |length| property when redefining the |length| " + + "property on a proxy with an array as target"; + +print(BUGNUMBER + ": " + summary); + +/************** + * BEGIN TEST * + **************/ + +var arr = []; +var p = new Proxy(arr, {}); + +function assertThrowsTypeError(f) +{ + try { + f(); + assert.sameValue(false, true, "Must have thrown"); + } catch (e) { + assert.sameValue(e instanceof TypeError, true, "Must have thrown TypeError"); + } +} + +// Redefining non-configurable length should throw a TypeError +assertThrowsTypeError(function () { Object.defineProperty(p, "length", { value: 17, configurable: true }); }); + +// Same here. +assertThrowsTypeError(function () { Object.defineProperty(p, "length", { value: 42, enumerable: true }); }); + +// Check the property went unchanged. +var pd = Object.getOwnPropertyDescriptor(p, "length"); +assert.sameValue(pd.value, 0); +assert.sameValue(pd.writable, true); +assert.sameValue(pd.enumerable, false); +assert.sameValue(pd.configurable, false); + +var ad = Object.getOwnPropertyDescriptor(arr, "length"); +assert.sameValue(ad.value, 0); +assert.sameValue(ad.writable, true); +assert.sameValue(ad.enumerable, false); +assert.sameValue(ad.configurable, false); + +/******************************************************************************/ + +print("Tests complete"); diff --git a/test/staging/sm/extensions/proxy-enumeration.js b/test/staging/sm/extensions/proxy-enumeration.js new file mode 100644 index 0000000000..8b00ef7eab --- /dev/null +++ b/test/staging/sm/extensions/proxy-enumeration.js @@ -0,0 +1,14 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-extensions-shell.js, sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +var list = Object.getOwnPropertyNames(this); +var found = list.indexOf("Proxy") != -1; +assert.sameValue(found, true) diff --git a/test/staging/sm/extensions/proxy-strict.js b/test/staging/sm/extensions/proxy-strict.js new file mode 100644 index 0000000000..5e65c4fee6 --- /dev/null +++ b/test/staging/sm/extensions/proxy-strict.js @@ -0,0 +1,19 @@ +/* + * Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/licenses/publicdomain/ + */ + +/*--- +includes: [sm/non262-extensions-shell.js, sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +var s = "grape"; +function f() { "use strict"; return this; } +var p = new Proxy(f, {}); +String.prototype.p = p; +assert.sameValue(s.p(), "grape"); + diff --git a/test/staging/sm/extensions/quote-string-for-nul-character.js b/test/staging/sm/extensions/quote-string-for-nul-character.js new file mode 100644 index 0000000000..67a1e943a9 --- /dev/null +++ b/test/staging/sm/extensions/quote-string-for-nul-character.js @@ -0,0 +1,93 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-extensions-shell.js, sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +// Ensure we properly quote strings which can contain the NUL character before +// returning them to the user to avoid cutting off any trailing characters. + +function assertStringIncludes(actual, expected) { + assert.sameValue(actual.includes(expected), true, `"${actual}" includes "${expected}"`); +} + +assertThrownErrorContains(() => "foo\0bar" in "asdf\0qwertz", "bar"); +assertThrownErrorContains(() => "foo\0bar" in "asdf\0qwertz", "qwertz"); + +if (this.Intl) { + assertThrownErrorContains(() => Intl.getCanonicalLocales("de\0Latn"), "Latn"); + + assertThrownErrorContains(() => Intl.Collator.supportedLocalesOf([], {localeMatcher:"lookup\0cookie"}), "cookie"); + assertThrownErrorContains(() => new Intl.Collator("en", {localeMatcher: "lookup\0cookie"}), "cookie"); + assertThrownErrorContains(() => new Intl.Collator("en", {usage: "sort\0cookie"}), "cookie"); + assertThrownErrorContains(() => new Intl.Collator("en", {caseFirst: "upper\0cookie"}), "cookie"); + assertThrownErrorContains(() => new Intl.Collator("en", {sensitivity: "base\0cookie"}), "cookie"); + + assertThrownErrorContains(() => Intl.DateTimeFormat.supportedLocalesOf([], {localeMatcher:"lookup\0cookie"}), "cookie"); + assertThrownErrorContains(() => new Intl.DateTimeFormat("en", {localeMatcher: "lookup\0cookie"}), "cookie"); + assertThrownErrorContains(() => new Intl.DateTimeFormat("en", {hourCycle: "h24\0cookie"}), "cookie"); + assertThrownErrorContains(() => new Intl.DateTimeFormat("en", {weekday: "narrow\0cookie"}), "cookie"); + assertThrownErrorContains(() => new Intl.DateTimeFormat("en", {era: "narrow\0cookie"}), "cookie"); + assertThrownErrorContains(() => new Intl.DateTimeFormat("en", {year: "2-digit\0cookie"}), "cookie"); + assertThrownErrorContains(() => new Intl.DateTimeFormat("en", {month: "2-digit\0cookie"}), "cookie"); + assertThrownErrorContains(() => new Intl.DateTimeFormat("en", {day: "2-digit\0cookie"}), "cookie"); + assertThrownErrorContains(() => new Intl.DateTimeFormat("en", {hour: "2-digit\0cookie"}), "cookie"); + assertThrownErrorContains(() => new Intl.DateTimeFormat("en", {minute: "2-digit\0cookie"}), "cookie"); + assertThrownErrorContains(() => new Intl.DateTimeFormat("en", {second: "2-digit\0cookie"}), "cookie"); + assertThrownErrorContains(() => new Intl.DateTimeFormat("en", {formatMatcher: "basic\0cookie"}), "cookie"); + assertThrownErrorContains(() => new Intl.DateTimeFormat("en", {timeZone: "UTC\0cookie"}), "cookie"); + + assertThrownErrorContains(() => Intl.NumberFormat.supportedLocalesOf([], {localeMatcher:"lookup\0cookie"}), "cookie"); + assertThrownErrorContains(() => new Intl.NumberFormat("en", {localeMatcher: "lookup\0cookie"}), "cookie"); + assertThrownErrorContains(() => new Intl.NumberFormat("en", {style: "decimal\0cookie"}), "cookie"); + assertThrownErrorContains(() => new Intl.NumberFormat("en", {currency: "USD\0cookie"}), "cookie"); + assertThrownErrorContains(() => new Intl.NumberFormat("en", {currencyDisplay: "code\0cookie"}), "cookie"); + + assertThrownErrorContains(() => Intl.PluralRules.supportedLocalesOf([], {localeMatcher:"lookup\0cookie"}), "cookie"); + assertThrownErrorContains(() => new Intl.PluralRules("en", {localeMatcher: "lookup\0cookie"}), "cookie"); + assertThrownErrorContains(() => new Intl.PluralRules("en", {type: "cardinal\0cookie"}), "cookie"); + + assertThrownErrorContains(() => Intl.RelativeTimeFormat.supportedLocalesOf([], {localeMatcher:"lookup\0cookie"}), "cookie"); + assertThrownErrorContains(() => new Intl.RelativeTimeFormat("en", {localeMatcher: "lookup\0cookie"}), "cookie"); + assertThrownErrorContains(() => new Intl.RelativeTimeFormat("en", {style: "long\0cookie"}), "cookie"); + assertThrownErrorContains(() => new Intl.RelativeTimeFormat("en", {numeric: "auto\0cookie"}), "cookie"); + assertThrownErrorContains(() => new Intl.RelativeTimeFormat().format(1, "day\0cookie"), "cookie"); + + assertThrownErrorContains(() => new Intl.Locale("de\0keks"), "keks"); + assertThrownErrorContains(() => new Intl.Locale("de", {language: "it\0biscotto"}), "biscotto"); + assertThrownErrorContains(() => new Intl.Locale("th", {script: "Thai\0คุกกี้"}), "\\u0E04\\u0E38\\u0E01\\u0E01\\u0E35\\u0E49"); + assertThrownErrorContains(() => new Intl.Locale("en", {region: "GB\0biscuit"}), "biscuit"); + + assertThrownErrorContains(() => new Intl.Locale("und", {calendar: "gregory\0F1"}), "F1"); + assertThrownErrorContains(() => new Intl.Locale("und", {collation: "phonebk\0F2"}), "F2"); + assertThrownErrorContains(() => new Intl.Locale("und", {hourCycle: "h24\0F3"}), "F3"); + assertThrownErrorContains(() => new Intl.Locale("und", {caseFirst: "false\0F4"}), "F4"); + assertThrownErrorContains(() => new Intl.Locale("und", {numberingSystem: "arab\0F5"}), "F5"); +} + +// Shell and helper functions. + +assertThrownErrorContains(() => assert.sameValue(true, false, "foo\0bar"), "bar"); + +if (this.disassemble) { + assertStringIncludes(disassemble(Function("var re = /foo\0bar/")), "bar"); +} + +if (this.getBacktrace) { + const k = "asdf\0asdf"; + const o = {[k](a) { "use strict"; return getBacktrace({locals: true, args: true}); }}; + const r = o[k].call("foo\0bar", "baz\0faz"); + assertStringIncludes(r, "bar"); + assertStringIncludes(r, "faz"); +} + +// js/src/tests/browser.js provides its own |options| function, make sure we don't test that one. +if (this.options && typeof document === "undefined") { + assertThrownErrorContains(() => options("foo\0bar"), "bar"); +} + diff --git a/test/staging/sm/extensions/recursion.js b/test/staging/sm/extensions/recursion.js new file mode 100644 index 0000000000..2e60b28a5a --- /dev/null +++ b/test/staging/sm/extensions/recursion.js @@ -0,0 +1,63 @@ +/* + * Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/licenses/publicdomain/ + */ + +/*--- +includes: [sm/non262-extensions-shell.js, sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +//----------------------------------------------------------------------------- +var BUGNUMBER = 622167; +var summary = 'Handle infinite recursion'; +print(BUGNUMBER + ": " + summary); + +/************** + * BEGIN TEST * + **************/ + +function eval() { eval(); } + +function DoWhile_3() +{ + eval(); +} + +try +{ + DoWhile_3(); +} +catch(e) { } + +var r; +function* f() +{ + r = arguments; + test(); + yield 170; +} + +function test() +{ + function foopy() + { + try + { + for (var i of f()); + } + catch (e) + { + gc(); + } + } + foopy(); +} +test(); + +/******************************************************************************/ + +print("All tests passed!"); diff --git a/test/staging/sm/extensions/regress-455380.js b/test/staging/sm/extensions/regress-455380.js new file mode 100644 index 0000000000..59e448e2d6 --- /dev/null +++ b/test/staging/sm/extensions/regress-455380.js @@ -0,0 +1,66 @@ +/* + * Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/licenses/publicdomain/ + */ + +/*--- +includes: [sm/non262-extensions-shell.js, sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +//----------------------------------------------------------------------------- +var BUGNUMBER = 455380; +var summary = 'Do not assert with JIT: !lhs->isQuad() && !rhs->isQuad()'; +var actual = 'No Crash'; +var expect = 'No Crash'; + +printBugNumber(BUGNUMBER); +printStatus (summary); + + +const IS_TOKEN_ARRAY = + [0, 0, 0, 0, 0, 0, 0, 0, // 0 + 0, 0, 0, 0, 0, 0, 0, 0, // 8 + 0, 0, 0, 0, 0, 0, 0, 0, // 16 + 0, 0, 0, 0, 0, 0, 0, 0, // 24 + + 0, 1, 0, 1, 1, 1, 1, 1, // 32 + 0, 0, 1, 1, 0, 1, 1, 0, // 40 + 1, 1, 1, 1, 1, 1, 1, 1, // 48 + 1, 1, 0, 0, 0, 0, 0, 0, // 56 + + 0, 1, 1, 1, 1, 1, 1, 1, // 64 + 1, 1, 1, 1, 1, 1, 1, 1, // 72 + 1, 1, 1, 1, 1, 1, 1, 1, // 80 + 1, 1, 1, 0, 0, 0, 1, 1, // 88 + + 1, 1, 1, 1, 1, 1, 1, 1, // 96 + 1, 1, 1, 1, 1, 1, 1, 1, // 104 + 1, 1, 1, 1, 1, 1, 1, 1, // 112 + 1, 1, 1, 0, 1, 0, 1]; // 120 + +const headerUtils = { +normalizeFieldName: function(fieldName) +{ + if (fieldName == "") + throw "error: empty string"; + + for (var i = 0, sz = fieldName.length; i < sz; i++) + { + if (!IS_TOKEN_ARRAY[fieldName.charCodeAt(i)]) + { + throw (fieldName + " is not a valid header field name!"); + } + } + + return fieldName.toLowerCase(); +} +}; + +headerUtils.normalizeFieldName("Host"); + + +assert.sameValue(expect, actual, summary); diff --git a/test/staging/sm/extensions/regress-469625-01.js b/test/staging/sm/extensions/regress-469625-01.js new file mode 100644 index 0000000000..2188ee9f49 --- /dev/null +++ b/test/staging/sm/extensions/regress-469625-01.js @@ -0,0 +1,45 @@ +/* + * Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/licenses/publicdomain/ + */ + +/*--- +includes: [sm/non262-extensions-shell.js, sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +//----------------------------------------------------------------------------- +var BUGNUMBER = 469625; +var summary = 'TM: Array prototype and expression closures'; +var actual = ''; +var expect = ''; + + +//----------------------------------------------------------------------------- +test(); +//----------------------------------------------------------------------------- + +function test() +{ + printBugNumber(BUGNUMBER); + printStatus (summary); + + expect = 'TypeError: [].__proto__ is not a function'; + + + Array.prototype.__proto__ = function () { return 3; }; + + try + { + [].__proto__(); + } + catch(ex) + { + print(actual = ex + ''); + } + + assert.sameValue(expect, actual, summary); +} diff --git a/test/staging/sm/extensions/regress-480579.js b/test/staging/sm/extensions/regress-480579.js new file mode 100644 index 0000000000..046a9ec5c8 --- /dev/null +++ b/test/staging/sm/extensions/regress-480579.js @@ -0,0 +1,41 @@ +/* + * Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/licenses/publicdomain/ + */ + +/*--- +includes: [sm/non262-extensions-shell.js, sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +//----------------------------------------------------------------------------- +var BUGNUMBER = 480579; +var summary = 'Do not assert: pobj_ == obj2'; +var actual = ''; +var expect = ''; + + +//----------------------------------------------------------------------------- +test(); +//----------------------------------------------------------------------------- + +function test() +{ + printBugNumber(BUGNUMBER); + printStatus (summary); + + expect = '12'; + + a = {x: 1}; + b = {__proto__: a}; + c = {__proto__: b}; + for (i = 0; i < 2; i++) { + print(actual += c.x); + b.x = 2; + } + + assert.sameValue(expect, actual, summary); +} diff --git a/test/staging/sm/extensions/regress-481516.js b/test/staging/sm/extensions/regress-481516.js new file mode 100644 index 0000000000..da0d48ab87 --- /dev/null +++ b/test/staging/sm/extensions/regress-481516.js @@ -0,0 +1,44 @@ +/* + * Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/licenses/publicdomain/ + */ + +/*--- +includes: [sm/non262-extensions-shell.js, sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +//----------------------------------------------------------------------------- +var BUGNUMBER = 481516; +var summary = 'TM: pobj_ == obj2'; +var actual = ''; +var expect = ''; + + +//----------------------------------------------------------------------------- +test(); +//----------------------------------------------------------------------------- + +function test() +{ + printBugNumber(BUGNUMBER); + printStatus (summary); + + expect = '1111222'; + + a = {x: 1}; + b = {__proto__: a}; + c = {__proto__: b}; + objs = [{__proto__: a}, {__proto__: a}, {__proto__: a}, b, {__proto__: a}, + {__proto__: a}]; + for (i = 0; i < 6; i++) { + print(actual += ""+c.x); + objs[i].x = 2; + } + print(actual += c.x); + + assert.sameValue(expect, actual, summary); +} diff --git a/test/staging/sm/extensions/regress-591450.js b/test/staging/sm/extensions/regress-591450.js new file mode 100644 index 0000000000..97f933c8fe --- /dev/null +++ b/test/staging/sm/extensions/regress-591450.js @@ -0,0 +1,19 @@ +/* + * Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/licenses/publicdomain/ + */ + +/*--- +includes: [sm/non262-extensions-shell.js, sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +/* + * This was causing the parser to assert at one point. Now it's not. Yay! + */ +function f(a,[x,y],b,[w,z],c) { function b() { } } + +assert.sameValue(0, 0, "don't crash"); diff --git a/test/staging/sm/extensions/regress-645160.js b/test/staging/sm/extensions/regress-645160.js new file mode 100644 index 0000000000..620756102e --- /dev/null +++ b/test/staging/sm/extensions/regress-645160.js @@ -0,0 +1,17 @@ +/* + * Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/licenses/publicdomain/ + */ + +/*--- +includes: [sm/non262-extensions-shell.js, sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +function potatoMasher(obj, arg) { this.eval(arg); } +potatoMasher(this, "var s = Error().stack"); +assert.sameValue(/potatoMasher/.exec(s) instanceof Array, true); + diff --git a/test/staging/sm/extensions/regress-650753.js b/test/staging/sm/extensions/regress-650753.js new file mode 100644 index 0000000000..30b8013e74 --- /dev/null +++ b/test/staging/sm/extensions/regress-650753.js @@ -0,0 +1,17 @@ +/* + * Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/licenses/publicdomain/ + */ + +/*--- +includes: [sm/non262-extensions-shell.js, sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +var x = {}, h = new WeakMap; +h.set(x, null); +gc(); + diff --git a/test/staging/sm/extensions/regress-bug629723.js b/test/staging/sm/extensions/regress-bug629723.js new file mode 100644 index 0000000000..49d91fbe22 --- /dev/null +++ b/test/staging/sm/extensions/regress-bug629723.js @@ -0,0 +1,27 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-extensions-shell.js, sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +function f(foo) { + "use strict"; + foo.bar; +} + +var actual; +try { + f(); + actual = "no error"; +} catch (x) { + actual = (x instanceof TypeError) ? "type error" : "some other error"; + actual += (/use strict/.test(x)) ? " with directive" : " without directive"; +} + +assert.sameValue("type error without directive", actual, + "decompiled expressions in error messages should not include directive prologues"); diff --git a/test/staging/sm/extensions/reviver-mutates-holder-array-nonnative.js b/test/staging/sm/extensions/reviver-mutates-holder-array-nonnative.js new file mode 100644 index 0000000000..9e9dca4bff --- /dev/null +++ b/test/staging/sm/extensions/reviver-mutates-holder-array-nonnative.js @@ -0,0 +1,49 @@ +/* + * Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/licenses/publicdomain/ + */ + +/*--- +includes: [sm/non262-extensions-shell.js, sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +//----------------------------------------------------------------------------- +var BUGNUMBER = 901380; +var summary = "Behavior when JSON.parse walks over a non-native object"; + +print(BUGNUMBER + ": " + summary); + +/************** + * BEGIN TEST * + **************/ + +var typedArray = null; + +var observedTypedArrayElementCount = 0; + +var arr = JSON.parse('[0, 1]', function(prop, v) { + if (prop === "0" && Array.isArray(this)) // exclude typedArray[0] + { + typedArray = new Int8Array(1); + this[1] = typedArray; + } + if (this instanceof Int8Array) + { + assert.sameValue(prop, "0"); + observedTypedArrayElementCount++; + } + return v; +}); + +assert.sameValue(arr[0], 0); +assert.sameValue(arr[1], typedArray); + +assert.sameValue(observedTypedArrayElementCount, 1); + +/******************************************************************************/ + +print("Tests complete"); diff --git a/test/staging/sm/extensions/reviver-mutates-holder-array.js b/test/staging/sm/extensions/reviver-mutates-holder-array.js new file mode 100644 index 0000000000..69f2641179 --- /dev/null +++ b/test/staging/sm/extensions/reviver-mutates-holder-array.js @@ -0,0 +1,42 @@ +/* + * Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/licenses/publicdomain/ + */ + +/*--- +includes: [sm/non262-extensions-shell.js, sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +//----------------------------------------------------------------------------- +var BUGNUMBER = 901351; +var summary = "Behavior when the JSON.parse reviver mutates the holder array"; + +print(BUGNUMBER + ": " + summary); + +/************** + * BEGIN TEST * + **************/ + +var proxyObj = null; + +var arr = JSON.parse('[0, 1]', function(prop, v) { + if (prop === "0") + { + proxyObj = new Proxy({ c: 17, d: 42 }, {}); + this[1] = proxyObj; + } + return v; +}); + +assert.sameValue(arr[0], 0); +assert.sameValue(arr[1], proxyObj); +assert.sameValue(arr[1].c, 17); +assert.sameValue(arr[1].d, 42); + +/******************************************************************************/ + +print("Tests complete"); diff --git a/test/staging/sm/extensions/reviver-mutates-holder-object-nonnative.js b/test/staging/sm/extensions/reviver-mutates-holder-object-nonnative.js new file mode 100644 index 0000000000..9abc52b7b7 --- /dev/null +++ b/test/staging/sm/extensions/reviver-mutates-holder-object-nonnative.js @@ -0,0 +1,63 @@ +/* + * Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/licenses/publicdomain/ + */ + +/*--- +includes: [sm/non262-extensions-shell.js, sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +//----------------------------------------------------------------------------- +var BUGNUMBER = 901380; +var summary = "Behavior when JSON.parse walks over a non-native object"; + +print(BUGNUMBER + ": " + summary); + +/************** + * BEGIN TEST * + **************/ + +// A little trickiness to account for the undefined-ness of property +// enumeration order. +var first = "unset"; + +var observedTypedArrayElementCount = 0; + +var typedArray = null; + +var obj = JSON.parse('{ "a": 0, "b": 1 }', function(prop, v) { + if (first === "unset") + { + first = prop; + var second = (prop === "a") ? "b" : "a"; + typedArray = new Int8Array(1); + Object.defineProperty(this, second, { value: typedArray }); + } + if (this instanceof Int8Array) + { + assert.sameValue(prop, "0"); + observedTypedArrayElementCount++; + } + return v; +}); + +if (first === "a") +{ + assert.sameValue(obj.a, 0); + assert.sameValue(obj.b, typedArray); +} +else +{ + assert.sameValue(obj.a, typedArray); + assert.sameValue(obj.b, 1); +} + +assert.sameValue(observedTypedArrayElementCount, 1); + +/******************************************************************************/ + +print("Tests complete"); diff --git a/test/staging/sm/extensions/reviver-mutates-holder-object.js b/test/staging/sm/extensions/reviver-mutates-holder-object.js new file mode 100644 index 0000000000..fd6bc8ac0d --- /dev/null +++ b/test/staging/sm/extensions/reviver-mutates-holder-object.js @@ -0,0 +1,59 @@ +/* + * Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/licenses/publicdomain/ + */ + +/*--- +includes: [sm/non262-extensions-shell.js, sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +//----------------------------------------------------------------------------- +var BUGNUMBER = 901351; +var summary = "Behavior when the JSON.parse reviver mutates the holder object"; + +print(BUGNUMBER + ": " + summary); + +/************** + * BEGIN TEST * + **************/ + +// A little trickiness to account for the undefined-ness of property +// enumeration order. +var first = "unset"; + +var proxyObj = null; + +var obj = JSON.parse('{ "a": 0, "b": 1 }', function(prop, v) { + if (first === "unset") + { + first = prop; + var second = (prop === "a") ? "b" : "a"; + + proxyObj = new Proxy({ c: 42, d: 17 }, {}); + Object.defineProperty(this, second, { value: proxyObj }); + } + return v; +}); + +if (first === "a") +{ + assert.sameValue(obj.a, 0); + assert.sameValue(obj.b, proxyObj); + assert.sameValue(obj.b.c, 42); + assert.sameValue(obj.b.d, 17); +} +else +{ + assert.sameValue(obj.a, proxyObj); + assert.sameValue(obj.a.c, 42); + assert.sameValue(obj.a.d, 17); + assert.sameValue(obj.b, 1); +} + +/******************************************************************************/ + +print("Tests complete"); diff --git a/test/staging/sm/extensions/set-property-non-extensible.js b/test/staging/sm/extensions/set-property-non-extensible.js new file mode 100644 index 0000000000..46e933ae8b --- /dev/null +++ b/test/staging/sm/extensions/set-property-non-extensible.js @@ -0,0 +1,38 @@ +/* + * Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/licenses/publicdomain/ + */ + +/*--- +includes: [sm/non262-extensions-shell.js, sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +info: | + preventExtensions on global +description: | + pending +esid: pending +---*/ +//----------------------------------------------------------------------------- +var BUGNUMBER = 600128; +var summary = + "Properly handle attempted addition of properties to non-extensible objects"; + +print(BUGNUMBER + ": " + summary); + +/************** + * BEGIN TEST * + **************/ + +var o = Object.freeze({}); +for (var i = 0; i < 10; i++) + print(o.u = ""); + +Object.freeze(this); +for (let j = 0; j < 10; j++) + print(u = ""); + + +/******************************************************************************/ + +print("All tests passed!"); diff --git a/test/staging/sm/extensions/shareddataview.js b/test/staging/sm/extensions/shareddataview.js new file mode 100644 index 0000000000..642a224795 --- /dev/null +++ b/test/staging/sm/extensions/shareddataview.js @@ -0,0 +1,48 @@ +/* + * Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/licenses/publicdomain/ + */ + +/*--- +includes: [sm/non262-extensions-shell.js, sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +// Test DataView on SharedArrayBuffer. + +if (this.SharedArrayBuffer) { + +var sab = new SharedArrayBuffer(4096); +var dv = new DataView(sab); + +assert.sameValue(sab, dv.buffer); +assert.sameValue(dv.byteLength, sab.byteLength); +assert.sameValue(ArrayBuffer.isView(dv), true); + +var dv2 = new DataView(sab, 1075, 2048); + +assert.sameValue(sab, dv2.buffer); +assert.sameValue(dv2.byteLength, 2048); +assert.sameValue(dv2.byteOffset, 1075); +assert.sameValue(ArrayBuffer.isView(dv2), true); + +// Test that it is the same buffer memory for the two views + +dv.setInt8(1075, 37); +assert.sameValue(dv2.getInt8(0), 37); + +// Test that range checking works + +assertThrowsInstanceOf(() => dv.setInt32(4098, -1), RangeError); +assertThrowsInstanceOf(() => dv.setInt32(4094, -1), RangeError); +assertThrowsInstanceOf(() => dv.setInt32(-1, -1), RangeError); + +assertThrowsInstanceOf(() => dv2.setInt32(2080, -1), RangeError); +assertThrowsInstanceOf(() => dv2.setInt32(2046, -1), RangeError); +assertThrowsInstanceOf(() => dv2.setInt32(-1, -1), RangeError); + +} + diff --git a/test/staging/sm/extensions/sps-generators.js b/test/staging/sm/extensions/sps-generators.js new file mode 100644 index 0000000000..9146669401 --- /dev/null +++ b/test/staging/sm/extensions/sps-generators.js @@ -0,0 +1,47 @@ +/* + * Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/licenses/publicdomain/ + */ + +/*--- +includes: [sm/non262-extensions-shell.js, sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ + +//----------------------------------------------------------------------------- +var BUGNUMBER = 822041; +var summary = "Live generators should not cache Gecko Profiler state"; + +print(BUGNUMBER + ": " + summary); + +function* gen() { + var x = yield turnoff(); + yield x; + yield 'bye'; +} + +function turnoff() { + print("Turning off profiler\n"); + disableGeckoProfiling(); + return 'hi'; +} + +for (var slowAsserts of [ true, false ]) { + // The slowAssertions setting is not expected to matter + if (slowAsserts) + enableGeckoProfilingWithSlowAssertions(); + else + enableGeckoProfiling(); + + g = gen(); + assert.sameValue(g.next().value, 'hi'); + assert.sameValue(g.next('gurgitating...').value, 'gurgitating...'); + for (var x of g) + assert.sameValue(x, 'bye'); +} + +// This is really a crashtest diff --git a/test/staging/sm/extensions/string-literal-getter-setter-decompilation.js b/test/staging/sm/extensions/string-literal-getter-setter-decompilation.js new file mode 100644 index 0000000000..ce2d9b7cdf --- /dev/null +++ b/test/staging/sm/extensions/string-literal-getter-setter-decompilation.js @@ -0,0 +1,43 @@ +/* + * Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/licenses/publicdomain/ + */ + +/*--- +includes: [sm/non262-extensions-shell.js, sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +var f; +try +{ + f = eval("(function literalInside() { return { set 'c d e'(v) { } }; })"); +} +catch (e) +{ + assert.sameValue(true, false, + "string-literal property name in setter in object literal in " + + "function statement failed to parse: " + e); +} + +var fstr = "" + f; +assert.sameValue(fstr.indexOf("set") < fstr.indexOf("c d e"), true, + "should be using new-style syntax with string literal in place of " + + "property identifier"); +assert.sameValue(fstr.indexOf("setter") < 0, true, "using old-style syntax?"); + +var o = f(); +var ostr = "" + o; +assert.sameValue("c d e" in o, true, "missing the property?"); +assert.sameValue("set" in Object.getOwnPropertyDescriptor(o, "c d e"), true, + "'c d e' property not a setter?"); +// disabled because we still generate old-style syntax here (toSource +// decompilation is as yet unfixed) +// assert.sameValue(ostr.indexOf("set") < ostr.indexOf("c d e"), true, +// "should be using new-style syntax when getting the source of a " + +// "getter/setter while decompiling an object"); +// assert.sameValue(ostr.indexOf("setter") < 0, true, "using old-style syntax?"); + diff --git a/test/staging/sm/extensions/typedarray-copyWithin-arguments-detaching.js b/test/staging/sm/extensions/typedarray-copyWithin-arguments-detaching.js new file mode 100644 index 0000000000..82c4204f61 --- /dev/null +++ b/test/staging/sm/extensions/typedarray-copyWithin-arguments-detaching.js @@ -0,0 +1,116 @@ +/* + * Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/licenses/publicdomain/ + */ + +/*--- +includes: [sm/non262-extensions-shell.js, sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +var gTestfile = "typedarray-copyWithin-arguments-detaching.js"; +//----------------------------------------------------------------------------- +var BUGNUMBER = 991981; +var summary = + "%TypedArray.prototype.copyWithin shouldn't misbehave horribly if " + + "index-argument conversion detaches the underlying ArrayBuffer"; + +print(BUGNUMBER + ": " + summary); + +/************** + * BEGIN TEST * + **************/ + +function testBegin() +{ + var ab = new ArrayBuffer(0x1000); + + var begin = + { + valueOf: function() + { + $262.detachArrayBuffer(ab); + return 0x800; + } + }; + + var ta = new Uint8Array(ab); + + var ok = false; + try + { + ta.copyWithin(0, begin, 0x1000); + } + catch (e) + { + ok = true; + } + assert.sameValue(ok, true, "start weirdness should have thrown"); + assert.sameValue(ab.byteLength, 0, "detaching should work for start weirdness"); +} +testBegin(); + +function testEnd() +{ + var ab = new ArrayBuffer(0x1000); + + var end = + { + valueOf: function() + { + $262.detachArrayBuffer(ab); + return 0x1000; + } + }; + + var ta = new Uint8Array(ab); + + var ok = false; + try + { + ta.copyWithin(0, 0x800, end); + } + catch (e) + { + ok = true; + } + assert.sameValue(ok, true, "start weirdness should have thrown"); + assert.sameValue(ab.byteLength, 0, "detaching should work for start weirdness"); +} +testEnd(); + +function testDest() +{ + var ab = new ArrayBuffer(0x1000); + + var dest = + { + valueOf: function() + { + $262.detachArrayBuffer(ab); + return 0; + } + }; + + var ta = new Uint8Array(ab); + + var ok = false; + try + { + ta.copyWithin(dest, 0x800, 0x1000); + } + catch (e) + { + ok = true; + } + assert.sameValue(ok, true, "start weirdness should have thrown"); + assert.sameValue(ab.byteLength, 0, "detaching should work for start weirdness"); +} +testDest(); + +/******************************************************************************/ + +print("Tests complete"); diff --git a/test/staging/sm/extensions/typedarray-set-detach.js b/test/staging/sm/extensions/typedarray-set-detach.js new file mode 100644 index 0000000000..39722d7804 --- /dev/null +++ b/test/staging/sm/extensions/typedarray-set-detach.js @@ -0,0 +1,52 @@ +/* + * Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/licenses/publicdomain/ + */ + +/*--- +includes: [sm/non262-extensions-shell.js, sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +//----------------------------------------------------------------------------- +var BUGNUMBER = 983344; +var summary = + "Uint8Array.prototype.set issues when this array changes during setting"; + +print(BUGNUMBER + ": " + summary); + +/************** + * BEGIN TEST * + **************/ + +var ab = new ArrayBuffer(200); +var a = new Uint8Array(ab); +var a_2 = new Uint8Array(10); + +var src = [ 10, 20, 30, 40, + 10, 20, 30, 40, + 10, 20, 30, 40, + 10, 20, 30, 40, + 10, 20, 30, 40, + 10, 20, 30, 40, + 10, 20, 30, 40, + 10, 20, 30, 40, + 10, 20, 30, 40, + 10, 20, 30, 40, + ]; +Object.defineProperty(src, 4, { + get: function () { + $262.detachArrayBuffer(ab); + gc(); + return 200; + } +}); + +a.set(src); + +/******************************************************************************/ + +print("Tests complete"); diff --git a/test/staging/sm/extensions/typedarray-subarray-of-subarray.js b/test/staging/sm/extensions/typedarray-subarray-of-subarray.js new file mode 100644 index 0000000000..b51dad206d --- /dev/null +++ b/test/staging/sm/extensions/typedarray-subarray-of-subarray.js @@ -0,0 +1,40 @@ +/* + * Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/licenses/publicdomain/ + */ + +/*--- +includes: [sm/non262-extensions-shell.js, sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +//----------------------------------------------------------------------------- +var BUGNUMBER = 637643; +var summary = + "new Int8Array([1, 2, 3]).subarray(1).subarray(1)[0] === 3"; + +print(BUGNUMBER + ": " + summary); + +/************** + * BEGIN TEST * + **************/ + +var ta = new Int8Array([1, 2, 3]); +assert.sameValue(ta.length, 3); +assert.sameValue(ta[0], 1); +assert.sameValue(ta[1], 2); +assert.sameValue(ta[2], 3); + +var sa1 = ta.subarray(1); +assert.sameValue(sa1.length, 2); +assert.sameValue(sa1[0], 2); +assert.sameValue(sa1[1], 3); + +var sa2 = sa1.subarray(1); +assert.sameValue(sa2.length, 1); +assert.sameValue(sa2[0], 3); + +print("All tests passed!"); diff --git a/test/staging/sm/extensions/weakmap.js b/test/staging/sm/extensions/weakmap.js new file mode 100644 index 0000000000..797ac5896c --- /dev/null +++ b/test/staging/sm/extensions/weakmap.js @@ -0,0 +1,127 @@ +/* + * Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/licenses/publicdomain/ + */ + +/*--- +includes: [sm/non262-extensions-shell.js, sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +//----------------------------------------------------------------------------- +var BUGNUMBER = 547941; +var summary = 'js weak maps'; +var actual = ''; +var expect = ''; + +//----------------------------------------------------------------------------- +test(); +//----------------------------------------------------------------------------- + +function test() +{ + printBugNumber(BUGNUMBER); + printStatus(summary); + + var TestPassCount = 0; + var TestFailCount = 0; + var TestTodoCount = 0; + + var TODO = 1; + + function check(fun, todo) { + var thrown = null; + var success = false; + try { + success = fun(); + } catch (x) { + thrown = x; + } + + if (thrown) + success = false; + + if (todo) { + TestTodoCount++; + + if (success) { + var ex = new Error; + print ("=== TODO but PASSED? ==="); + print (ex.stack); + print ("========================"); + } + + return; + } + + if (success) { + TestPassCount++; + } else { + TestFailCount++; + + var ex = new Error; + print ("=== FAILED ==="); + print (ex.stack); + if (thrown) { + print (" threw exception:"); + print (thrown); + } + print ("=============="); + } + } + + function checkThrows(fun, todo) { + let thrown = false; + try { + fun(); + } catch (x) { + thrown = true; + } + + check(() => thrown, todo); + } + + var key = {}; + var map = new WeakMap(); + + check(() => !map.has(key)); + check(() => map.delete(key) == false); + check(() => map.set(key, 42) === map); + check(() => map.get(key) == 42); + check(() => typeof map.get({}) == "undefined"); + check(() => map.get({}, "foo") == undefined); + + gc(); gc(); gc(); + + check(() => map.get(key) == 42); + check(() => map.delete(key) == true); + check(() => map.delete(key) == false); + check(() => map.delete({}) == false); + + check(() => typeof map.get(key) == "undefined"); + check(() => !map.has(key)); + check(() => map.delete(key) == false); + + var value = { }; + check(() => map.set(new Object(), value) === map); + gc(); gc(); gc(); + + check(() => map.has("non-object key") == false); + check(() => map.has() == false); + check(() => map.get("non-object key") == undefined); + check(() => map.get() == undefined); + check(() => map.delete("non-object key") == false); + check(() => map.delete() == false); + + check(() => map.set(key) === map); + check(() => map.get(key) == undefined); + + checkThrows(() => map.set("non-object key", value)); + + print ("done"); + + assert.sameValue(0, TestFailCount, "weak map tests"); +} diff --git a/test/staging/sm/fields/await-identifier-module-1.js b/test/staging/sm/fields/await-identifier-module-1.js new file mode 100644 index 0000000000..3f49917cb9 --- /dev/null +++ b/test/staging/sm/fields/await-identifier-module-1.js @@ -0,0 +1,17 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- module +negative: + phase: parse + type: SyntaxError +description: | + pending +esid: pending +---*/ + +async () => class { [await] = 1 }; +$DONOTEVALUATE(); diff --git a/test/staging/sm/fields/await-identifier-module-2.js b/test/staging/sm/fields/await-identifier-module-2.js new file mode 100644 index 0000000000..eaf4ce0c42 --- /dev/null +++ b/test/staging/sm/fields/await-identifier-module-2.js @@ -0,0 +1,17 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- module +negative: + phase: parse + type: SyntaxError +description: | + pending +esid: pending +---*/ + +async () => class { x = await }; +$DONOTEVALUATE(); diff --git a/test/staging/sm/fields/await-identifier-module-3.js b/test/staging/sm/fields/await-identifier-module-3.js new file mode 100644 index 0000000000..2cf7854476 --- /dev/null +++ b/test/staging/sm/fields/await-identifier-module-3.js @@ -0,0 +1,17 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- module +negative: + phase: parse + type: SyntaxError +description: | + pending +esid: pending +---*/ + +async () => class { x = await 1 }; +$DONOTEVALUATE(); diff --git a/test/staging/sm/fields/await-identifier-script.js b/test/staging/sm/fields/await-identifier-script.js new file mode 100644 index 0000000000..5cf66db5e9 --- /dev/null +++ b/test/staging/sm/fields/await-identifier-script.js @@ -0,0 +1,31 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +var await = 1; + +async function getClass() { + return class { + x = await; + }; +} + +getClass().then(cl => { + assert.sameValue(new cl().x, 1); +}); + +assert.sameValue(raisesException(SyntaxError)(` +async () => class { [await] = 1 }; +`), true); + +assert.sameValue(raisesException(SyntaxError)(` + async () => class { x = await 1 }; +`), true); + diff --git a/test/staging/sm/fields/bug1587574.js b/test/staging/sm/fields/bug1587574.js new file mode 100644 index 0000000000..fdb97624ce --- /dev/null +++ b/test/staging/sm/fields/bug1587574.js @@ -0,0 +1,24 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +// Don't Crash +var testStr = ` +class C extends Object { + constructor() { + eval(\`a => b => { + class Q { f = 1; } // inhibits lazy parsing + super(); + }\`); + } +} +new C;` +assert.sameValue(raisesException(ReferenceError)(testStr), true); + diff --git a/test/staging/sm/fields/init-order.js b/test/staging/sm/fields/init-order.js new file mode 100644 index 0000000000..b2614d83d1 --- /dev/null +++ b/test/staging/sm/fields/init-order.js @@ -0,0 +1,34 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +function g1() { + throw 10; +} + +function g2() { + throw 20; +} + +class A { + #x = "hello" + g1(); + constructor(o = g2()) { + } +}; + +var thrown; +try { + new A; +} catch (e) { + thrown = e; +} + +assert.sameValue(thrown, 10); + diff --git a/test/staging/sm/fields/numeric-fields.js b/test/staging/sm/fields/numeric-fields.js new file mode 100644 index 0000000000..587a816f14 --- /dev/null +++ b/test/staging/sm/fields/numeric-fields.js @@ -0,0 +1,23 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +// Number field names. +class C { + 128 = class {}; +} +assert.sameValue(new C()[128].name, "128"); + +// Bigint field names. +class D { + 128n = class {}; +} +assert.sameValue(new D()[128].name, "128"); + diff --git a/test/staging/sm/fields/scopes.js b/test/staging/sm/fields/scopes.js new file mode 100644 index 0000000000..3ec735c4e8 --- /dev/null +++ b/test/staging/sm/fields/scopes.js @@ -0,0 +1,20 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +(function({ + k = class i { + [_ => i]() + {} + } +} = {}) { + var j = 0; +})() + diff --git a/test/staging/sm/fields/unimplemented.js b/test/staging/sm/fields/unimplemented.js new file mode 100644 index 0000000000..91c8383ed1 --- /dev/null +++ b/test/staging/sm/fields/unimplemented.js @@ -0,0 +1,66 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +// Field syntax doesn't crash the engine when fields are disabled. + +// Are fields enabled? +let fieldsEnabled = false; +try { + Function("class C { x; }"); + fieldsEnabled = true; +} catch (exc) { + assert.sameValue(exc instanceof SyntaxError, true); +} + +// If not, run these tests. (Many other tests cover actual behavior of the +// feature when enabled.) +if (!fieldsEnabled) { + let source = `class C { + x + }`; + assertThrowsInstanceOf(() => Function(source), SyntaxError); + + source = `class C { + x = 0; + }`; + assertThrowsInstanceOf(() => Function(source), SyntaxError); + + source = `class C { + 0 = 0; + }`; + assertThrowsInstanceOf(() => Function(source), SyntaxError); + + source = `class C { + [0] = 0; + }`; + assertThrowsInstanceOf(() => Function(source), SyntaxError); + + source = `class C { + "hi" = 0; + }`; + assertThrowsInstanceOf(() => Function(source), SyntaxError); + + source = `class C { + "hi" = 0; + }`; + assertThrowsInstanceOf(() => Function(source), SyntaxError); + + source = `class C { + d = function(){}; + }`; + assertThrowsInstanceOf(() => Function(source), SyntaxError); + + source = `class C { + d = class D { x = 0; }; + }`; + assertThrowsInstanceOf(() => Function(source), SyntaxError); +} + diff --git a/test/staging/sm/generators/create-function-parse-before-getprototype.js b/test/staging/sm/generators/create-function-parse-before-getprototype.js new file mode 100644 index 0000000000..fd823b8083 --- /dev/null +++ b/test/staging/sm/generators/create-function-parse-before-getprototype.js @@ -0,0 +1,28 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-generators-shell.js, sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +var getProtoCalled = false; + +var newTarget = Object.defineProperty(function(){}.bind(), "prototype", { + get() { + getProtoCalled = true; + return null; + } +}); + +var Generator = function*(){}.constructor; + +assertThrowsInstanceOf(() => { + Reflect.construct(Generator, ["@error"], newTarget); +}, SyntaxError); + +assert.sameValue(getProtoCalled, false); + diff --git a/test/staging/sm/generators/delegating-yield-1.js b/test/staging/sm/generators/delegating-yield-1.js new file mode 100644 index 0000000000..3455324d6f --- /dev/null +++ b/test/staging/sm/generators/delegating-yield-1.js @@ -0,0 +1,51 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [deepEqual.js, sm/non262-generators-shell.js, sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +// This file was written by Andy Wingo and originally +// contributed to V8 as generators-objects.js, available here: +// +// http://code.google.com/p/v8/source/browse/branches/bleeding_edge/test/mjsunit/harmony/generators-objects.js + +// Test that yield* re-yields received results without re-boxing. + +function results(results) { + var i = 0; + function next() { + return results[i++]; + } + var iter = { next: next } + var ret = {}; + ret[Symbol.iterator] = function () { return iter; } + return ret; +} + +function* yield_results(expected) { + return yield* results(expected); +} + +function collect_results(iterable) { + var ret = []; + var result; + var iter = iterable[Symbol.iterator](); + do { + result = iter.next(); + ret.push(result); + } while (!result.done); + return ret; +} + +// We have to put a full result for the end, because the return will re-box. +var expected = [{value: 1}, {value: 34, done: true}]; + +// Sanity check. +assert.deepEqual(expected, collect_results(results(expected))); +assert.deepEqual(expected, collect_results(yield_results(expected))); + diff --git a/test/staging/sm/generators/delegating-yield-10.js b/test/staging/sm/generators/delegating-yield-10.js new file mode 100644 index 0000000000..baf2eb0c20 --- /dev/null +++ b/test/staging/sm/generators/delegating-yield-10.js @@ -0,0 +1,58 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-generators-shell.js, sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +// Errors accessing next, done, or value don't cause an exception to be +// thrown into the iterator of a yield*. + +function* g(n) { for (var i=0; i 0) { + yield n; + yield* countdown(--n); + } + return 34; +} + +function collect_results(iter) { + var ret = []; + var result; + do { + result = iter.next(); + ret.push(result); + } while (!result.done); + return ret; +} + +var expected = [ + // yield in countdown(3), n == 3 + {value: 3, done: false}, + // yield in yield* countdown(2), n == 2 + {value: 2, done: false}, + // yield in nested yield* countdown(1), n == 1 + {value: 1, done: false}, + // countdown(0) yields no values + // second go-through of countdown(2) loop, n == 1 + {value: 1, done: false}, + // second go-through of countdown(3) loop, n == 2 + {value: 2, done: false}, + // yield in yield* countdown(1), n == 1 + {value: 1, done: false}, + // third go-through of countdown(3) loop, n == 1 + {value: 1, done: false}, + // done + {value: 34, done: true} +]; + +assert.deepEqual(expected, collect_results(countdown(3))); + diff --git a/test/staging/sm/generators/delegating-yield-9.js b/test/staging/sm/generators/delegating-yield-9.js new file mode 100644 index 0000000000..5d69b168e6 --- /dev/null +++ b/test/staging/sm/generators/delegating-yield-9.js @@ -0,0 +1,46 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [deepEqual.js, sm/non262-generators-shell.js, sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +// Test that yield* can appear in a loop, and inside yield. + +function* countdown(n) { + while (n > 0) { + yield (yield* countdown(--n)); + } + return 34; +} + +function collect_results(iter) { + var ret = []; + var result; + do { + result = iter.next(); + ret.push(result); + } while (!result.done); + return ret; +} + +var expected = [ + // Only 34 yielded from the "yield" and the last return make it out. + // Three yields in countdown(3), two in countdown(2), and one in + // countdown(1) (called twice). + {value: 34, done: false}, + {value: 34, done: false}, + {value: 34, done: false}, + {value: 34, done: false}, + {value: 34, done: false}, + {value: 34, done: false}, + {value: 34, done: false}, + {value: 34, done: true}, // final +]; + +assert.deepEqual(collect_results(countdown(3)), expected); + diff --git a/test/staging/sm/generators/gen-with-call-obj.js b/test/staging/sm/generators/gen-with-call-obj.js new file mode 100644 index 0000000000..878ed6f383 --- /dev/null +++ b/test/staging/sm/generators/gen-with-call-obj.js @@ -0,0 +1,46 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-generators-shell.js, sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +var foo; + +function* gen() { + var x = 0; + foo = function() { return x++; } + for (var i = 0; i < 10; ++i) + yield x++; +} + +var j = 0; +for (i of gen()) + assert.sameValue(i, j++); + +// now mess up the stack + +function f1(x) { + var a, b, c, d, e, f, g; + return x <= 0 ? 0 : f1(x-1); +} +f1(10); +function f2(x) { + var a = x, b = x; + return x <= 0 ? 0 : f2(x-1); +} +f2(10); + +// now observe gen's call object (which should have been put) + +gc(); +assert.sameValue(foo(), 10); +gc(); +assert.sameValue(foo(), 11); +gc(); +assert.sameValue(foo(), 12); + diff --git a/test/staging/sm/generators/iteration.js b/test/staging/sm/generators/iteration.js new file mode 100644 index 0000000000..06ee0b416f --- /dev/null +++ b/test/staging/sm/generators/iteration.js @@ -0,0 +1,583 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-generators-shell.js, sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +// This file was written by Andy Wingo and originally +// contributed to V8 as generators-objects.js, available here: +// +// http://code.google.com/p/v8/source/browse/branches/bleeding_edge/test/mjsunit/harmony/generators-objects.js + +// Test aspects of the generator runtime. + + +var GeneratorFunction = (function*(){yield 1;}).constructor; + + +function TestGeneratorResultPrototype() { + function* g() { yield 1; } + var iter = g(); + assertIteratorNext(iter, 1); + assertIteratorDone(iter, undefined); + assertIteratorDone(iter, undefined); +} +TestGeneratorResultPrototype(); + +function TestGenerator(g, expected_values_for_next, + send_val, expected_values_for_send) { + function testNext(thunk) { + var iter = thunk(); + for (var i = 0; i < expected_values_for_next.length; i++) { + assertIteratorResult(iter.next(), expected_values_for_next[i], + i == expected_values_for_next.length - 1); + } + assertIteratorDone(iter, undefined); + } + function testSend(thunk) { + var iter = thunk(); + for (var i = 0; i < expected_values_for_send.length; i++) { + assertIteratorResult(iter.next(send_val), + expected_values_for_send[i], + i == expected_values_for_send.length - 1); + } + assertIteratorDone(iter, undefined); + } + function testThrow(thunk) { + for (var i = 0; i < expected_values_for_next.length; i++) { + var iter = thunk(); + for (var j = 0; j < i; j++) { + assertIteratorResult(iter.next(), + expected_values_for_next[j], + j == expected_values_for_next.length - 1); + } + var Sentinel = function () {} + assertThrowsInstanceOf(function () { iter.throw(new Sentinel); }, Sentinel); + assertIteratorDone(iter, undefined); + } + } + + testNext(g); + testSend(g); + testThrow(g); + + testNext(function*() { return yield* g(); }); + testSend(function*() { return yield* g(); }); + testThrow(function*() { return yield* g(); }); + + if (g instanceof GeneratorFunction) { + testNext(function() { return g(); }); + testSend(function() { return g(); }); + testThrow(function() { return g(); }); + } +} + +TestGenerator(function* g1() { }, + [undefined], + "foo", + [undefined]); + +TestGenerator(function* g2() { yield 1; }, + [1, undefined], + "foo", + [1, undefined]); + +TestGenerator(function* g3() { yield 1; yield 2; }, + [1, 2, undefined], + "foo", + [1, 2, undefined]); + +TestGenerator(function* g4() { yield 1; yield 2; return 3; }, + [1, 2, 3], + "foo", + [1, 2, 3]); + +TestGenerator(function* g5() { return 1; }, + [1], + "foo", + [1]); + +TestGenerator(function* g6() { var x = yield 1; return x; }, + [1, undefined], + "foo", + [1, "foo"]); + +TestGenerator(function* g7() { var x = yield 1; yield 2; return x; }, + [1, 2, undefined], + "foo", + [1, 2, "foo"]); + +TestGenerator(function* g8() { for (var x = 0; x < 4; x++) { yield x; } }, + [0, 1, 2, 3, undefined], + "foo", + [0, 1, 2, 3, undefined]); + +// Generator with arguments. +TestGenerator( + function g9() { + return (function*(a, b, c, d) { + yield a; yield b; yield c; yield d; + })("fee", "fi", "fo", "fum"); + }, + ["fee", "fi", "fo", "fum", undefined], + "foo", + ["fee", "fi", "fo", "fum", undefined]); + +// Too few arguments. +TestGenerator( + function g10() { + return (function*(a, b, c, d) { + yield a; yield b; yield c; yield d; + })("fee", "fi"); + }, + ["fee", "fi", undefined, undefined, undefined], + "foo", + ["fee", "fi", undefined, undefined, undefined]); + +// Too many arguments. +TestGenerator( + function g11() { + return (function*(a, b, c, d) { + yield a; yield b; yield c; yield d; + })("fee", "fi", "fo", "fum", "I smell the blood of an Englishman"); + }, + ["fee", "fi", "fo", "fum", undefined], + "foo", + ["fee", "fi", "fo", "fum", undefined]); + +// The arguments object. +TestGenerator( + function g12() { + return (function*(a, b, c, d) { + for (var i = 0; i < arguments.length; i++) { + yield arguments[i]; + } + })("fee", "fi", "fo", "fum", "I smell the blood of an Englishman"); + }, + ["fee", "fi", "fo", "fum", "I smell the blood of an Englishman", + undefined], + "foo", + ["fee", "fi", "fo", "fum", "I smell the blood of an Englishman", + undefined]); + +// Access to captured free variables. +TestGenerator( + function g13() { + return (function(a, b, c, d) { + return (function*() { + yield a; yield b; yield c; yield d; + })(); + })("fee", "fi", "fo", "fum"); + }, + ["fee", "fi", "fo", "fum", undefined], + "foo", + ["fee", "fi", "fo", "fum", undefined]); + +// Abusing the arguments object. +TestGenerator( + function g14() { + return (function*(a, b, c, d) { + arguments[0] = "Be he live"; + arguments[1] = "or be he dead"; + arguments[2] = "I'll grind his bones"; + arguments[3] = "to make my bread"; + yield a; yield b; yield c; yield d; + })("fee", "fi", "fo", "fum"); + }, + ["Be he live", "or be he dead", "I'll grind his bones", "to make my bread", + undefined], + "foo", + ["Be he live", "or be he dead", "I'll grind his bones", "to make my bread", + undefined]); + +// Abusing the arguments object: strict mode. +TestGenerator( + function g15() { + return (function*(a, b, c, d) { + "use strict"; + arguments[0] = "Be he live"; + arguments[1] = "or be he dead"; + arguments[2] = "I'll grind his bones"; + arguments[3] = "to make my bread"; + yield a; yield b; yield c; yield d; + })("fee", "fi", "fo", "fum"); + }, + ["fee", "fi", "fo", "fum", undefined], + "foo", + ["fee", "fi", "fo", "fum", undefined]); + +// GC. +if (typeof gc == 'function') { + TestGenerator(function* g16() { yield "baz"; gc(); yield "qux"; }, + ["baz", "qux", undefined], + "foo", + ["baz", "qux", undefined]); +} + +// Receivers. +TestGenerator( + function g17() { + function* g() { yield this.x; yield this.y; } + var o = { start: g, x: 1, y: 2 }; + return o.start(); + }, + [1, 2, undefined], + "foo", + [1, 2, undefined]); + +// FIXME: Capture the generator object as "this" in new g(). Bug 907742. +// TestGenerator( +// function g18() { +// function* g() { yield this.x; yield this.y; } +// var iter = new g; +// iter.x = 1; +// iter.y = 2; +// return iter; +// }, +// [1, 2, undefined], +// "foo", +// [1, 2, undefined]); + +TestGenerator( + function* g19() { + var x = 1; + yield x; + with({x:2}) { yield x; } + yield x; + }, + [1, 2, 1, undefined], + "foo", + [1, 2, 1, undefined]); + +TestGenerator( + function* g20() { yield (1 + (yield 2) + 3); }, + [2, NaN, undefined], + "foo", + [2, "1foo3", undefined]); + +TestGenerator( + function* g21() { return (1 + (yield 2) + 3); }, + [2, NaN], + "foo", + [2, "1foo3"]); + +TestGenerator( + function* g22() { yield (1 + (yield 2) + 3); yield (4 + (yield 5) + 6); }, + [2, NaN, 5, NaN, undefined], + "foo", + [2, "1foo3", 5, "4foo6", undefined]); + +TestGenerator( + function* g23() { + return (yield (1 + (yield 2) + 3)) + (yield (4 + (yield 5) + 6)); + }, + [2, NaN, 5, NaN, NaN], + "foo", + [2, "1foo3", 5, "4foo6", "foofoo"]); + +// Rewind a try context with and without operands on the stack. +TestGenerator( + function* g24() { + try { + return (yield (1 + (yield 2) + 3)) + (yield (4 + (yield 5) + 6)); + } catch (e) { + throw e; + } + }, + [2, NaN, 5, NaN, NaN], + "foo", + [2, "1foo3", 5, "4foo6", "foofoo"]); + +// Yielding in a catch context, with and without operands on the stack. +TestGenerator( + function* g25() { + try { + throw (yield (1 + (yield 2) + 3)) + } catch (e) { + if (typeof e == 'object') throw e; + return e + (yield (4 + (yield 5) + 6)); + } + }, + [2, NaN, 5, NaN, NaN], + "foo", + [2, "1foo3", 5, "4foo6", "foofoo"]); + +// Generator function instances. +TestGenerator(GeneratorFunction(), + [undefined], + "foo", + [undefined]); + +TestGenerator(new GeneratorFunction(), + [undefined], + "foo", + [undefined]); + +TestGenerator(GeneratorFunction('yield 1;'), + [1, undefined], + "foo", + [1, undefined]); + +TestGenerator( + function() { return GeneratorFunction('x', 'y', 'yield x + y;')(1, 2) }, + [3, undefined], + "foo", + [3, undefined]); + +// Access to this with formal arguments. +TestGenerator( + function () { + return ({ x: 42, g: function* (a) { yield this.x } }).g(0); + }, + [42, undefined], + "foo", + [42, undefined]); + +function TestTryCatch(instantiate) { + function* g() { yield 1; try { yield 2; } catch (e) { yield e; } yield 3; } + function Sentinel() {} + + function Test1(iter) { + assertIteratorNext(iter, 1); + assertIteratorNext(iter, 2); + assertIteratorNext(iter, 3); + assertIteratorDone(iter, undefined); + assertIteratorDone(iter, undefined); + } + Test1(instantiate(g)); + + function Test2(iter) { + assertThrowsInstanceOf(function() { iter.throw(new Sentinel); }, Sentinel); + assertIteratorDone(iter, undefined); + } + Test2(instantiate(g)); + + function Test3(iter) { + assertIteratorNext(iter, 1); + assertThrowsInstanceOf(function() { iter.throw(new Sentinel); }, Sentinel); + assertIteratorDone(iter, undefined); + } + Test3(instantiate(g)); + + function Test4(iter) { + assertIteratorNext(iter, 1); + assertIteratorNext(iter, 2); + var exn = new Sentinel; + assertIteratorResult(iter.throw(exn), exn, false); + assertIteratorNext(iter, 3); + assertIteratorDone(iter, undefined); + assertIteratorDone(iter, undefined); + } + Test4(instantiate(g)); + + function Test5(iter) { + assertIteratorNext(iter, 1); + assertIteratorNext(iter, 2); + var exn = new Sentinel; + assertIteratorResult(iter.throw(exn), exn, false); + assertIteratorNext(iter, 3); + assertThrowsInstanceOf(function() { iter.throw(new Sentinel); }, Sentinel); + assertIteratorDone(iter, undefined); + + } + Test5(instantiate(g)); + + function Test6(iter) { + assertIteratorNext(iter, 1); + assertIteratorNext(iter, 2); + var exn = new Sentinel; + assertIteratorResult(iter.throw(exn), exn, false); + assertThrowsInstanceOf(function() { iter.throw(new Sentinel); }, Sentinel); + assertIteratorDone(iter, undefined); + } + Test6(instantiate(g)); +} +TestTryCatch(function (g) { return g(); }); +TestTryCatch(function* (g) { return yield* g(); }); + +function TestTryFinally(instantiate) { + function* g() { yield 1; try { yield 2; } finally { yield 3; } yield 4; } + function Sentinel() {} + function Sentinel2() {} + + function Test1(iter) { + assertIteratorNext(iter, 1); + assertIteratorNext(iter, 2); + assertIteratorNext(iter, 3); + assertIteratorNext(iter, 4); + assertIteratorDone(iter, undefined); + assertIteratorDone(iter, undefined); + } + Test1(instantiate(g)); + + function Test2(iter) { + assertThrowsInstanceOf(function() { iter.throw(new Sentinel); }, Sentinel); + assertIteratorDone(iter, undefined); + } + Test2(instantiate(g)); + + function Test3(iter) { + assertIteratorNext(iter, 1); + assertThrowsInstanceOf(function() { iter.throw(new Sentinel); }, Sentinel); + assertIteratorDone(iter, undefined); + } + Test3(instantiate(g)); + + function Test4(iter) { + assertIteratorNext(iter, 1); + assertIteratorNext(iter, 2); + assertIteratorResult(iter.throw(new Sentinel), 3, false); + assertThrowsInstanceOf(function() { iter.next(); }, Sentinel); + assertIteratorDone(iter, undefined); + + } + Test4(instantiate(g)); + + function Test5(iter) { + assertIteratorNext(iter, 1); + assertIteratorNext(iter, 2); + assertIteratorResult(iter.throw(new Sentinel), 3, false); + assertThrowsInstanceOf(function() { iter.throw(new Sentinel2); }, Sentinel2); + assertIteratorDone(iter, undefined); + } + Test5(instantiate(g)); + + function Test6(iter) { + assertIteratorNext(iter, 1); + assertIteratorNext(iter, 2); + assertIteratorNext(iter, 3); + assertThrowsInstanceOf(function() { iter.throw(new Sentinel); }, Sentinel); + assertIteratorDone(iter, undefined); + } + Test6(instantiate(g)); + + function Test7(iter) { + assertIteratorNext(iter, 1); + assertIteratorNext(iter, 2); + assertIteratorNext(iter, 3); + assertIteratorNext(iter, 4); + assertThrowsInstanceOf(function() { iter.throw(new Sentinel); }, Sentinel); + assertIteratorDone(iter, undefined); + } + Test7(instantiate(g)); +} +TestTryFinally(function (g) { return g(); }); +TestTryFinally(function* (g) { return yield* g(); }); + +function TestNestedTry(instantiate) { + function* g() { + try { + yield 1; + try { yield 2; } catch (e) { yield e; } + yield 3; + } finally { + yield 4; + } + yield 5; + } + function Sentinel() {} + function Sentinel2() {} + + function Test1(iter) { + assertIteratorNext(iter, 1); + assertIteratorNext(iter, 2); + assertIteratorNext(iter, 3); + assertIteratorNext(iter, 4); + assertIteratorNext(iter, 5); + assertIteratorDone(iter, undefined); + assertIteratorDone(iter, undefined); + } + Test1(instantiate(g)); + + function Test2(iter) { + assertThrowsInstanceOf(function() { iter.throw(new Sentinel); }, Sentinel); + assertIteratorDone(iter, undefined); + } + Test2(instantiate(g)); + + function Test3(iter) { + assertIteratorNext(iter, 1); + assertIteratorResult(iter.throw(new Sentinel), 4, false); + assertThrowsInstanceOf(function() { iter.next(); }, Sentinel); + assertIteratorDone(iter, undefined); + } + Test3(instantiate(g)); + + function Test4(iter) { + assertIteratorNext(iter, 1); + assertIteratorResult(iter.throw(new Sentinel), 4, false); + assertThrowsInstanceOf(function() { iter.throw(new Sentinel2); }, Sentinel2); + assertIteratorDone(iter, undefined); + } + Test4(instantiate(g)); + + function Test5(iter) { + assertIteratorNext(iter, 1); + assertIteratorNext(iter, 2); + var exn = new Sentinel; + assertIteratorResult(iter.throw(exn), exn, false); + assertIteratorNext(iter, 3); + assertIteratorNext(iter, 4); + assertIteratorNext(iter, 5); + assertIteratorDone(iter, undefined); + assertIteratorDone(iter, undefined); + + } + Test5(instantiate(g)); + + function Test6(iter) { + assertIteratorNext(iter, 1); + assertIteratorNext(iter, 2); + var exn = new Sentinel; + assertIteratorResult(iter.throw(exn), exn, false); + assertIteratorResult(iter.throw(new Sentinel2), 4, false); + assertThrowsInstanceOf(function() { iter.next(); }, Sentinel2); + assertIteratorDone(iter, undefined); + } + Test6(instantiate(g)); + + function Test7(iter) { + assertIteratorNext(iter, 1); + assertIteratorNext(iter, 2); + var exn = new Sentinel; + assertIteratorResult(iter.throw(exn), exn, false); + assertIteratorNext(iter, 3); + assertIteratorResult(iter.throw(new Sentinel2), 4, false); + assertThrowsInstanceOf(function() { iter.next(); }, Sentinel2); + assertIteratorDone(iter, undefined); + + } + Test7(instantiate(g)); + + // That's probably enough. +} +TestNestedTry(function (g) { return g(); }); +TestNestedTry(function* (g) { return yield* g(); }); + +function TestRecursion() { + function TestNextRecursion() { + function* g() { yield iter.next(); } + var iter = g(); + return iter.next(); + } + function TestSendRecursion() { + function* g() { yield iter.next(42); } + var iter = g(); + return iter.next(); + } + function TestThrowRecursion() { + function* g() { yield iter.throw(1); } + var iter = g(); + return iter.next(); + } + assertThrowsInstanceOf(TestNextRecursion, TypeError); + assertThrowsInstanceOf(TestSendRecursion, TypeError); + assertThrowsInstanceOf(TestThrowRecursion, TypeError); +} +TestRecursion(); + diff --git a/test/staging/sm/generators/iterator-next-non-object.js b/test/staging/sm/generators/iterator-next-non-object.js new file mode 100644 index 0000000000..c29431a511 --- /dev/null +++ b/test/staging/sm/generators/iterator-next-non-object.js @@ -0,0 +1,73 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-generators-shell.js, sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +var BUGNUMBER = 1016936; +var summary = "IteratorNext should throw if the value returned by iterator.next() is not an object."; + +print(BUGNUMBER + ": " + summary); + +var nonobjs = [ + null, + undefined, + 1, + true, + "a", + Symbol.iterator, +]; + +function createIterable(v) { + var iterable = {}; + iterable[Symbol.iterator] = function () { + return { + next: function () { + return v; + } + }; + }; + return iterable; +} + +function f() { +} + +for (var nonobj of nonobjs) { + var iterable = createIterable(nonobj); + + assertThrowsInstanceOf(() => [...iterable], TypeError); + assertThrowsInstanceOf(() => f(...iterable), TypeError); + + assertThrowsInstanceOf(() => { for (var x of iterable) {} }, TypeError); + + assertThrowsInstanceOf(() => { + var [a] = iterable; + }, TypeError); + assertThrowsInstanceOf(() => { + var [...a] = iterable; + }, TypeError); + + assertThrowsInstanceOf(() => Array.from(iterable), TypeError); + assertThrowsInstanceOf(() => new Map(iterable), TypeError); + assertThrowsInstanceOf(() => new Set(iterable), TypeError); + assertThrowsInstanceOf(() => new WeakMap(iterable), TypeError); + assertThrowsInstanceOf(() => new WeakSet(iterable), TypeError); + // FIXME: bug 1232266 + // assertThrowsInstanceOf(() => new Int8Array(iterable), TypeError); + assertThrowsInstanceOf(() => Int8Array.from(iterable), TypeError); + + assertThrowsInstanceOf(() => { + var g = function*() { + yield* iterable; + }; + var v = g(); + v.next(); + }, TypeError); +} + diff --git a/test/staging/sm/generators/objects.js b/test/staging/sm/generators/objects.js new file mode 100644 index 0000000000..8fb4022d06 --- /dev/null +++ b/test/staging/sm/generators/objects.js @@ -0,0 +1,58 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [deepEqual.js, sm/non262-generators-shell.js, sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +// This file was written by Andy Wingo and originally +// contributed to V8 as generators-objects.js, available here: +// +// http://code.google.com/p/v8/source/browse/branches/bleeding_edge/test/mjsunit/harmony/generators-objects.js + +// Test aspects of the generator runtime. + +// Test the properties and prototype of a generator object. +function TestGeneratorObject() { + function* g() { yield 1; } + + var iter = g(); + assert.sameValue(Object.getPrototypeOf(iter), g.prototype); + assertTrue(iter instanceof g); + assert.sameValue(String(iter), "[object Generator]"); + assert.deepEqual(Object.getOwnPropertyNames(iter), []); + assertNotEq(g(), iter); +} +TestGeneratorObject(); + + +// Test the methods of generator objects. +function TestGeneratorObjectMethods() { + function* g() { yield 1; } + var iter = g(); + + assert.sameValue(iter.next.length, 1); + assert.sameValue(iter.return.length, 1); + assert.sameValue(iter.throw.length, 1); + + function TestNonGenerator(non_generator) { + assertThrowsInstanceOf(function() { iter.next.call(non_generator); }, TypeError); + assertThrowsInstanceOf(function() { iter.next.call(non_generator, 1); }, TypeError); + assertThrowsInstanceOf(function() { iter.return.call(non_generator, 1); }, TypeError); + assertThrowsInstanceOf(function() { iter.throw.call(non_generator, 1); }, TypeError); + assertThrowsInstanceOf(function() { iter.close.call(non_generator); }, TypeError); + } + + TestNonGenerator(1); + TestNonGenerator({}); + TestNonGenerator(function(){}); + TestNonGenerator(g); + TestNonGenerator(g.prototype); +} +TestGeneratorObjectMethods(); + + diff --git a/test/staging/sm/generators/regress-366941.js b/test/staging/sm/generators/regress-366941.js new file mode 100644 index 0000000000..d8a497230a --- /dev/null +++ b/test/staging/sm/generators/regress-366941.js @@ -0,0 +1,86 @@ +/* + * Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/licenses/publicdomain/ + */ + +/*--- +includes: [sm/non262-generators-shell.js, sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ + +//----------------------------------------------------------------------------- +var BUGNUMBER = 366941; +var summary = 'Destructuring enumerations, iterations'; +var actual = ''; +var expect = ''; + + +//----------------------------------------------------------------------------- +test(); +//----------------------------------------------------------------------------- + +function test() +{ + printBugNumber(BUGNUMBER); + printStatus (summary); + + var list1 = [[1,2],[3,4],[5,6]]; + var list2 = [[1,2,3],[4,5,6],[7,8,9]]; + + expect = '1,2;3,4;5,6;'; + actual = ''; + + for (var [foo, bar] of list1) { + actual += foo + "," + bar + ";"; + } + + assert.sameValue(expect, actual, summary + ': 1'); + + expect = '1,2,3;4,5,6;7,8,9;'; + actual = ''; + for (var [foo, bar, baz] of list2) { + actual += foo + "," + bar + "," + baz + ";"; + } + + assert.sameValue(expect, actual, summary + ': 2'); + + function* gen(list) { + for (var test of list) { + yield test; + } + } + + var iter1 = gen(list1); + + expect = '1,2;3,4;5,6;'; + actual = ''; + + for (var [foo, bar] of iter1) { + actual += foo + "," + bar + ";"; + } + + assert.sameValue(expect, actual, summary + ': 3'); + + // Before JS1.7's destructuring for…in was fixed to match JS1.8's, + // the expected result was a SyntaxError about the for…in loop's lhs. + var iter2 = gen(list2); + expect = '1,2,3;4,5,6;7,8,9;'; + actual = ''; + + try + { + eval('for (var [foo, bar, baz] of iter2) {' + + 'actual += foo + "," + bar + "," + baz + ";";' + + '}'); + } + catch(ex) + { + actual = ex + ''; + } + + assert.sameValue(expect, actual, summary + ': 4'); +} diff --git a/test/staging/sm/generators/return-finally.js b/test/staging/sm/generators/return-finally.js new file mode 100644 index 0000000000..06e82ec43f --- /dev/null +++ b/test/staging/sm/generators/return-finally.js @@ -0,0 +1,318 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-generators-shell.js, sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +var BUGNUMBER = 1202134; +var summary = "Return value should not be overwritten by finally block with normal execution."; + +print(BUGNUMBER + ": " + summary); + +// ==== single ==== + +var f, g, v; +f = function*() { + // F.[[type]] is normal + // B.[[type]] is return + try { + return 42; + } finally { + } +}; +g = f(); +v = g.next(); +assert.sameValue(v.value, 42); +assert.sameValue(v.done, true); + +f = function*() { + // F.[[type]] is return + try { + return 42; + } finally { + return 43; + } +}; +g = f(); +v = g.next(); +assert.sameValue(v.value, 43); +assert.sameValue(v.done, true); + +f = function*() { + // F.[[type]] is throw + try { + return 42; + } finally { + throw 43; + } +}; +var caught = false; +g = f(); +try { + v = g.next(); +} catch (e) { + assert.sameValue(e, 43); + caught = true; +} +assert.sameValue(caught, true); + +f = function*() { + // F.[[type]] is break + do try { + return 42; + } finally { + break; + } while (false); + return 43; +}; +g = f(); +v = g.next(); +assert.sameValue(v.value, 43); +assert.sameValue(v.done, true); + +f = function*() { + // F.[[type]] is break + L: try { + return 42; + } finally { + break L; + } + return 43; +}; +g = f(); +v = g.next(); +assert.sameValue(v.value, 43); +assert.sameValue(v.done, true); + +f = function*() { + // F.[[type]] is continue + do try { + return 42; + } finally { + continue; + } while (false); + return 43; +}; +g = f(); +v = g.next(); +assert.sameValue(v.value, 43); +assert.sameValue(v.done, true); + +// ==== nested ==== + +f = function*() { + // F.[[type]] is normal + // B.[[type]] is return + try { + return 42; + } finally { + // F.[[type]] is break + do try { + return 43; + } finally { + break; + } while (0); + } +}; +g = f(); +v = g.next(); +assert.sameValue(v.value, 42); +assert.sameValue(v.done, true); + +f = function*() { + // F.[[type]] is normal + // B.[[type]] is return + try { + return 42; + } finally { + // F.[[type]] is break + L: try { + return 43; + } finally { + break L; + } + } +} +g = f(); +v = g.next(); +assert.sameValue(v.value, 42); +assert.sameValue(v.done, true); + +f = function*() { + // F.[[type]] is normal + // B.[[type]] is return + try { + return 42; + } finally { + // F.[[type]] is continue + do try { + return 43; + } finally { + continue; + } while (0); + } +}; +g = f(); +v = g.next(); +assert.sameValue(v.value, 42); +assert.sameValue(v.done, true); + +f = function*() { + // F.[[type]] is normal + // B.[[type]] is return + try { + return 42; + } finally { + // F.[[type]] is normal + // B.[[type]] is normal + try { + // F.[[type]] is throw + try { + return 43; + } finally { + throw 9; + } + } catch (e) { + } + } +}; +g = f(); +v = g.next(); +assert.sameValue(v.value, 42); +assert.sameValue(v.done, true); + +f = function*() { + // F.[[type]] is return + try { + return 41; + } finally { + // F.[[type]] is normal + // B.[[type]] is return + try { + return 42; + } finally { + // F.[[type]] is break + do try { + return 43; + } finally { + break; + } while (0); + } + } +}; +g = f(); +v = g.next(); +assert.sameValue(v.value, 42); +assert.sameValue(v.done, true); + +// ==== with yield ==== + +f = function*() { + // F.[[type]] is normal + // B.[[type]] is return + try { + return 42; + } finally { + yield 43; + } +}; +g = f(); +v = g.next(); +assert.sameValue(v.value, 43); +assert.sameValue(v.done, false); +v = g.next(); +assert.sameValue(v.value, 42); +assert.sameValue(v.done, true); + +// ==== throw() ==== + +f = function*() { + // F.[[type]] is throw + try { + return 42; + } finally { + yield 43; + } +}; +caught = false; +g = f(); +v = g.next(); +assert.sameValue(v.value, 43); +assert.sameValue(v.done, false); +try { + v = g.throw(44); +} catch (e) { + assert.sameValue(e, 44); + caught = true; +} +assert.sameValue(caught, true); + +f = function*() { + // F.[[type]] is normal + try { + return 42; + } finally { + // F.[[type]] is normal + // B.[[type]] is throw + try { + yield 43; + } catch (e) { + } + } +}; +caught = false; +g = f(); +v = g.next(); +assert.sameValue(v.value, 43); +assert.sameValue(v.done, false); +v = g.throw(44); +assert.sameValue(v.value, 42); +assert.sameValue(v.done, true); + +// ==== return() ==== + +f = function*() { + // F.[[type]] is return + try { + return 42; + } finally { + yield 43; + } +}; +caught = false; +g = f(); +v = g.next(); +assert.sameValue(v.value, 43); +assert.sameValue(v.done, false); +v = g.return(44); +assert.sameValue(v.value, 44); +assert.sameValue(v.done, true); + +f = function*() { + // F.[[type]] is normal + // B.[[type]] is return + try { + yield 42; + } finally { + // F.[[type]] is continue + do try { + return 43; + } finally { + continue; + } while (0); + } +}; +caught = false; +g = f(); +v = g.next(); +assert.sameValue(v.value, 42); +assert.sameValue(v.done, false); +v = g.return(44); +assert.sameValue(v.value, 44); +assert.sameValue(v.done, true); + diff --git a/test/staging/sm/generators/runtime.js b/test/staging/sm/generators/runtime.js new file mode 100644 index 0000000000..203637de4e --- /dev/null +++ b/test/staging/sm/generators/runtime.js @@ -0,0 +1,141 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [deepEqual.js, sm/non262-generators-shell.js, sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +// This file was written by Andy Wingo and originally +// contributed to V8 as generators-runtime.js, available here: +// +// https://source.chromium.org/chromium/chromium/src/+/main:v8/test/mjsunit/es6/generators-runtime.js + +// Test aspects of the generator runtime. + +// See http://people.mozilla.org/~jorendorff/es6-draft.html#sec-15.19.3. + +function assertSyntaxError(str) { + assertThrowsInstanceOf(Function(str), SyntaxError); +} + + +function f() { "use strict"; } +function* g() { yield 1; } +var GeneratorFunctionPrototype = Object.getPrototypeOf(g); +var GeneratorFunction = GeneratorFunctionPrototype.constructor; +var GeneratorObjectPrototype = GeneratorFunctionPrototype.prototype; + + +// A generator function should have the same set of properties as any +// other function. +function TestGeneratorFunctionInstance() { + var f_own_property_names = Object.getOwnPropertyNames(f); + var g_own_property_names = Object.getOwnPropertyNames(g); + + f_own_property_names.sort(); + g_own_property_names.sort(); + + assert.deepEqual(f_own_property_names, g_own_property_names); + var i; + for (i = 0; i < f_own_property_names.length; i++) { + var prop = f_own_property_names[i]; + var f_desc = Object.getOwnPropertyDescriptor(f, prop); + var g_desc = Object.getOwnPropertyDescriptor(g, prop); + assert.sameValue(f_desc.configurable, g_desc.configurable, prop); + assert.sameValue(f_desc.writable, g_desc.writable, prop); + assert.sameValue(f_desc.enumerable, g_desc.enumerable, prop); + } +} +TestGeneratorFunctionInstance(); + + +// Generators have an additional object interposed in the chain between +// themselves and Function.prototype. +function TestGeneratorFunctionPrototype() { + // Sanity check. + assert.sameValue(Object.getPrototypeOf(f), Function.prototype); + assertNotEq(GeneratorFunctionPrototype, Function.prototype); + assert.sameValue(Object.getPrototypeOf(GeneratorFunctionPrototype), + Function.prototype); + assert.sameValue(Object.getPrototypeOf(function* () {}), + GeneratorFunctionPrototype); +} +TestGeneratorFunctionPrototype(); + + +// Functions that we associate with generator objects are actually defined by +// a common prototype. +function TestGeneratorObjectPrototype() { + // %GeneratorPrototype% must inherit from %IteratorPrototype%. + var iterProto = Object.getPrototypeOf(Object.getPrototypeOf([][Symbol.iterator]())); + assert.sameValue(Object.getPrototypeOf(GeneratorObjectPrototype), + iterProto); + assert.sameValue(Object.getPrototypeOf((function*(){yield 1}).prototype), + GeneratorObjectPrototype); + + var expected_property_names = ["next", "return", "throw", "constructor"]; + var found_property_names = + Object.getOwnPropertyNames(GeneratorObjectPrototype); + + expected_property_names.sort(); + found_property_names.sort(); + + assert.deepEqual(found_property_names, expected_property_names); + assert.deepEqual(Object.getOwnPropertySymbols(GeneratorObjectPrototype), [Symbol.toStringTag]); +} +TestGeneratorObjectPrototype(); + + +// This tests the object that would be called "GeneratorFunction", if it were +// like "Function". +function TestGeneratorFunction() { + assert.sameValue(GeneratorFunctionPrototype, GeneratorFunction.prototype); + assertTrue(g instanceof GeneratorFunction); + + assert.sameValue(Function, Object.getPrototypeOf(GeneratorFunction)); + assertTrue(g instanceof Function); + + assert.sameValue("function* g() { yield 1; }", g.toString()); + + // Not all functions are generators. + assertTrue(f instanceof Function); // Sanity check. + assertFalse(f instanceof GeneratorFunction); + + assertTrue((new GeneratorFunction()) instanceof GeneratorFunction); + assertTrue(GeneratorFunction() instanceof GeneratorFunction); + + assertTrue(GeneratorFunction('yield 1') instanceof GeneratorFunction); + assertTrue(GeneratorFunction('return 1') instanceof GeneratorFunction); + assertTrue(GeneratorFunction('a', 'yield a') instanceof GeneratorFunction); + assertTrue(GeneratorFunction('a', 'return a') instanceof GeneratorFunction); + assertTrue(GeneratorFunction('a', 'return a') instanceof GeneratorFunction); + assertSyntaxError("GeneratorFunction('yield', 'return yield')"); + assertTrue(GeneratorFunction('with (x) return foo;') instanceof GeneratorFunction); + assertSyntaxError("GeneratorFunction('\"use strict\"; with (x) return foo;')"); + + // Doesn't matter particularly what string gets serialized, as long + // as it contains "function*" and "yield 10". + assert.sameValue(GeneratorFunction('yield 10').toString(), + "function* anonymous(\n) {\nyield 10\n}"); +} +TestGeneratorFunction(); + + +function TestPerGeneratorPrototype() { + assertNotEq((function*(){}).prototype, (function*(){}).prototype); + assertNotEq((function*(){}).prototype, g.prototype); + assert.sameValue(typeof GeneratorFunctionPrototype, "object"); + assert.sameValue(g.prototype.__proto__.constructor, GeneratorFunctionPrototype, "object"); + assert.sameValue(Object.getPrototypeOf(g.prototype), GeneratorObjectPrototype); + assertFalse(g.prototype instanceof Function); + assert.sameValue(typeof (g.prototype), "object"); + + assert.deepEqual(Object.getOwnPropertyNames(g.prototype), []); +} +TestPerGeneratorPrototype(); + + diff --git a/test/staging/sm/generators/syntax.js b/test/staging/sm/generators/syntax.js new file mode 100644 index 0000000000..6391cc1054 --- /dev/null +++ b/test/staging/sm/generators/syntax.js @@ -0,0 +1,149 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-generators-shell.js, sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +// This file was written by Andy Wingo and originally +// contributed to V8 as generators-parsing.js, available here: +// +// http://code.google.com/p/v8/source/browse/branches/bleeding_edge/test/mjsunit/harmony/generators-parsing.js + +function assertSyntaxError(str) { + var msg; + var evil = eval; + try { + // Non-direct eval. + evil(str); + } catch (exc) { + if (exc instanceof SyntaxError) + return; + msg = "Assertion failed: expected SyntaxError, got " + exc; + } + if (msg === undefined) + msg = "Assertion failed: expected SyntaxError, but no exception thrown"; + throw new Error(msg + " - " + str); +} + +// Yield statements. +function* g() { yield 3; yield 4; } + +// Yield expressions. +function* g() { (yield 3) + (yield 4); } + +// Yield without a RHS. +function* g() { yield; } +function* g() { yield } +function* g() { + yield +} +function* g() { (yield) } +function* g() { [yield] } +function* g() { {yield} } +function* g() { (yield), (yield) } +function* g() { yield; yield } +function* g() { (yield) ? yield : yield } +function* g() { + (yield) + ? yield + : yield +} + +// If yield has a RHS, it needs to start on the same line. The * in a +// yield* counts as starting the RHS. +function* g() { + yield * + foo +} +assertThrowsInstanceOf(() => Function("function* g() { yield\n* foo }"), SyntaxError); +assertIteratorNext(function*(){ + yield + 3 + }(), undefined) + +// A YieldExpression is not a LogicalORExpression. +assertThrowsInstanceOf(() => Function("function* g() { yield ? yield : yield }"), SyntaxError); + +// You can have a generator in strict mode. +function* g() { "use strict"; yield 3; yield 4; } + +// Generators can have return statements also, which internally parse to a kind +// of yield expression. +function* g() { yield 1; return; } +function* g() { yield 1; return 2; } +function* g() { yield 1; return 2; yield "dead"; } + +// Generator expression. +(function* () { yield 3; }); + +// Named generator expression. +(function* g() { yield 3; }); + +// Generators do not have to contain yield expressions. +function* g() { } + +// YieldExpressions can occur in the RHS of a YieldExpression. +function* g() { yield yield 1; } +function* g() { yield 3 + (yield 4); } + +// Generator definitions with a name of "yield" are not specifically ruled out +// by the spec, as the `yield' name is outside the generator itself. However, +// in strict-mode, "yield" is an invalid identifier. +function* yield() { (yield 3) + (yield 4); } +assertSyntaxError("function* yield() { 'use strict'; (yield 3) + (yield 4); }"); + +// In classic mode, yield is a normal identifier, outside of generators. +function yield(yield) { yield: yield (yield + yield (0)); } + +// Yield is always valid as a key in an object literal. +({ yield: 1 }); +function* g() { yield ({ yield: 1 }) } +function* g() { yield ({ get yield() { return 1; }}) } + +// Yield is a valid property name. +function* g(obj) { yield obj.yield; } + +// Checks that yield is a valid label in classic mode, but not valid in a strict +// mode or in generators. +function f() { yield: 1 } +assertSyntaxError("function f() { 'use strict'; yield: 1 }") +assertSyntaxError("function* g() { yield: 1 }") + +// Yield is only a keyword in the body of the generator, not in nested +// functions. +function* g() { function f(yield) { yield (yield + yield (0)); } } + +// Yield in a generator is not an identifier. +assertSyntaxError("function* g() { yield = 10; }"); + +// Yield binds very loosely, so this parses as "yield (3 + yield 4)", which is +// invalid. +assertSyntaxError("function* g() { yield 3 + yield 4; }"); + +// Yield is still a future-reserved-word in strict mode +assertSyntaxError("function f() { 'use strict'; var yield = 13; }"); + +// The name of the NFE isn't let-bound in F/G, so this is valid. +function f() { (function yield() {}); } +function* g() { (function yield() {}); } + +// The name of the NFE is let-bound in the function/generator expression, so this is invalid. +assertSyntaxError("function f() { (function* yield() {}); }"); +assertSyntaxError("function* g() { (function* yield() {}); }"); + +// The name of the declaration is let-bound in F, so this is valid. +function f() { function yield() {} } +function f() { function* yield() {} } + +// The name of the declaration is let-bound in G, so this is invalid. +assertSyntaxError("function* g() { function yield() {} }"); +assertSyntaxError("function* g() { function* yield() {} }"); + +// In generators, yield is invalid as a formal argument name. +assertSyntaxError("function* g(yield) { yield (10); }"); + diff --git a/test/staging/sm/generators/yield-error.js b/test/staging/sm/generators/yield-error.js new file mode 100644 index 0000000000..f321eb334b --- /dev/null +++ b/test/staging/sm/generators/yield-error.js @@ -0,0 +1,31 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-generators-shell.js, sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +var BUGNUMBER = 1384299; +var summary = "yield outside of generators should provide better error"; + +print(BUGNUMBER + ": " + summary); + +assertThrowsInstanceOfWithMessage( + () => eval("yield 10"), + SyntaxError, + "yield expression is only valid in generators"); + +assertThrowsInstanceOfWithMessage( + () => eval("yield 10"), + SyntaxError, + "yield expression is only valid in generators"); + +assertThrowsInstanceOfWithMessage( + () => eval("yield 10"), + SyntaxError, + "yield expression is only valid in generators"); + diff --git a/test/staging/sm/generators/yield-iterator-close.js b/test/staging/sm/generators/yield-iterator-close.js new file mode 100644 index 0000000000..0510cbf0c3 --- /dev/null +++ b/test/staging/sm/generators/yield-iterator-close.js @@ -0,0 +1,67 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-generators-shell.js, sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +// Test that IteratorClose is called when a Generator is abruptly completed by +// Generator.return. + +var returnCalled = 0; +function* wrapNoThrow() { + let iter = { + [Symbol.iterator]() { + return this; + }, + next() { + return { value: 10, done: false }; + }, + return() { + returnCalled++; + return {}; + } + }; + for (const i of iter) { + yield i; + } +} + +// Breaking calls Generator.return, which causes the yield above to resume with +// an abrupt completion of kind "return", which then calls +// iter.return. +for (const i of wrapNoThrow()) { + break; +} +assert.sameValue(returnCalled, 1); + +function* wrapThrow() { + let iter = { + [Symbol.iterator]() { + return this; + }, + next() { + return { value: 10, done: false }; + }, + return() { + throw 42; + } + }; + for (const i of iter) { + yield i; + } +} + +// Breaking calls Generator.return, which, like above, calls iter.return. If +// iter.return throws, since the yield is resuming with an abrupt completion of +// kind "return", the newly thrown value takes precedence over returning. +assertThrowsValue(() => { + for (const i of wrapThrow()) { + break; + } +}, 42); + diff --git a/test/staging/sm/generators/yield-non-regexp.js b/test/staging/sm/generators/yield-non-regexp.js new file mode 100644 index 0000000000..1648674a00 --- /dev/null +++ b/test/staging/sm/generators/yield-non-regexp.js @@ -0,0 +1,26 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-generators-shell.js, sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +var BUGNUMBER = 1099956; +var summary = + "The token next to yield should be tokenized as non-operand if yield is " + + "a valid name"; + +printBugNumber(BUGNUMBER); +printStatus(summary); + +var yield = 12, a = 3, b = 6, g = 2; +var yieldParsedAsIdentifier = false; + +yield /a; yieldParsedAsIdentifier = true; b/g; + +assert.sameValue(yieldParsedAsIdentifier, true); + diff --git a/test/staging/sm/generators/yield-star-iterator-close.js b/test/staging/sm/generators/yield-star-iterator-close.js new file mode 100644 index 0000000000..a77f3a1630 --- /dev/null +++ b/test/staging/sm/generators/yield-star-iterator-close.js @@ -0,0 +1,155 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-generators-shell.js, sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +// Tests that the "return" method on iterators is called in yield* +// expressions. + +function test() { + var returnCalled = 0; + var returnCalledExpected = 0; + var nextCalled = 0; + var nextCalledExpected = 0; + var throwCalled = 0; + var throwCalledExpected = 0; + var iterable = {}; + iterable[Symbol.iterator] = makeIterator({ + next: function() { + nextCalled++; + return { done: false }; + }, + ret: function() { + returnCalled++; + return { done: true, value: "iter.return" }; + } + }); + + function* y() { + yield* iterable; + } + + // G.p.throw on an iterator without "throw" calls IteratorClose. + var g1 = y(); + g1.next(); + assertThrowsInstanceOf(function() { + g1.throw("foo"); + }, TypeError); + assert.sameValue(returnCalled, ++returnCalledExpected); + assert.sameValue(nextCalled, ++nextCalledExpected); + g1.next(); + assert.sameValue(nextCalled, nextCalledExpected); + + // G.p.return calls "return", and if the result.done is true, return the + // result. + var g2 = y(); + g2.next(); + var v2 = g2.return("test return"); + assert.sameValue(v2.done, true); + assert.sameValue(v2.value, "iter.return"); + assert.sameValue(returnCalled, ++returnCalledExpected); + assert.sameValue(nextCalled, ++nextCalledExpected); + g2.next(); + assert.sameValue(nextCalled, nextCalledExpected); + + // G.p.return calls "return", and if the result.done is false, continue + // yielding. + iterable[Symbol.iterator] = makeIterator({ + next: function() { + nextCalled++; + return { done: false }; + }, + ret: function() { + returnCalled++; + return { done: false, value: "iter.return" }; + } + }); + var g3 = y(); + g3.next(); + var v3 = g3.return("test return"); + assert.sameValue(v3.done, false); + assert.sameValue(v3.value, "iter.return"); + assert.sameValue(returnCalled, ++returnCalledExpected); + assert.sameValue(nextCalled, ++nextCalledExpected); + g3.next(); + assert.sameValue(nextCalled, ++nextCalledExpected); + + // G.p.return throwing does not re-call iter.return. + iterable[Symbol.iterator] = makeIterator({ + ret: function() { + returnCalled++; + throw "in iter.return"; + } + }); + var g4 = y(); + g4.next(); + assertThrowsValue(function() { + g4.return("in test"); + }, "in iter.return"); + assert.sameValue(returnCalled, ++returnCalledExpected); + + // G.p.return expects iter.return to return an Object. + iterable[Symbol.iterator] = makeIterator({ + ret: function() { + returnCalled++; + return 42; + } + }); + var g5 = y(); + g5.next(); + assertThrowsInstanceOf(function() { + g5.return("foo"); + }, TypeError); + assert.sameValue(returnCalled, ++returnCalledExpected); + + // IteratorClose expects iter.return to return an Object. + var g6 = y(); + g6.next(); + assertThrowsInstanceOfWithMessageContains( + () => g6.throw("foo"), + TypeError, + "non-object" + ); + assert.sameValue(returnCalled, ++returnCalledExpected); + + // G.p.return passes its argument to "return". + iterable[Symbol.iterator] = makeIterator({ + ret: function(x) { + assert.sameValue(x, "in test"); + returnCalled++; + return { done: true }; + } + }); + var g7 = y(); + g7.next(); + g7.return("in test"); + assert.sameValue(returnCalled, ++returnCalledExpected); + + // If a throw method is present, do not call "return". + iterable[Symbol.iterator] = makeIterator({ + throw: function(e) { + throwCalled++; + throw e; + }, + ret: function(x) { + returnCalled++; + return { done: true }; + } + }); + var g8 = y(); + g8.next(); + assertThrowsValue(function() { + g8.throw("foo"); + }, "foo"); + assert.sameValue(throwCalled, ++throwCalledExpected); + assert.sameValue(returnCalled, returnCalledExpected); +} + +test(); + diff --git a/test/staging/sm/generators/yield-star-iterator-primitive.js b/test/staging/sm/generators/yield-star-iterator-primitive.js new file mode 100644 index 0000000000..5ddf443455 --- /dev/null +++ b/test/staging/sm/generators/yield-star-iterator-primitive.js @@ -0,0 +1,40 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-generators-shell.js, sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +var BUGNUMBER = 1021835; +var summary = "Returning non-object from @@iterator should throw"; + +print(BUGNUMBER + ": " + summary); + +let primitives = [ + 1, + true, + undefined, + null, + "foo", + Symbol.iterator +]; + +for (let primitive of primitives) { + let obj = { + [Symbol.iterator]() { + return primitive; + } + }; + assertThrowsInstanceOf(() => { + function* g() { + yield* obj; + } + for (let x of g()) { + } + }, TypeError); +} + diff --git a/test/staging/sm/generators/yield-star-throw-htmldda.js b/test/staging/sm/generators/yield-star-throw-htmldda.js new file mode 100644 index 0000000000..1550d10158 --- /dev/null +++ b/test/staging/sm/generators/yield-star-throw-htmldda.js @@ -0,0 +1,39 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +features: +- IsHTMLDDA +includes: [sm/non262-generators-shell.js, sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +function* g(iter) { + yield* iter; +} + +var calledReturn = false; + +var it = g({ + [Symbol.iterator]() { + return this; + }, + next() { + return {done: false}; + }, + throw: createIsHTMLDDA(), + return() { + calledReturn = true; + return {done: false}; + } +}); + +it.next(); + +assertThrowsInstanceOf(() => it.throw(""), TypeError); + +assert.sameValue(calledReturn, false); + diff --git a/test/staging/sm/global/adding-global-var-nonextensible-error.js b/test/staging/sm/global/adding-global-var-nonextensible-error.js new file mode 100644 index 0000000000..57c79c663d --- /dev/null +++ b/test/staging/sm/global/adding-global-var-nonextensible-error.js @@ -0,0 +1,44 @@ +/* + * Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/licenses/publicdomain/ + */ + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +info: | + preventExtensions on global +description: | + pending +esid: pending +---*/ +//----------------------------------------------------------------------------- +var BUGNUMBER = 621432; +var summary = + "If a var statement can't create a global property because the global " + + "object isn't extensible, and an error is thrown while decompiling the " + + "global, don't assert"; + +print(BUGNUMBER + ": " + summary); + +/************** + * BEGIN TEST * + **************/ + +var toSource = []; +Object.preventExtensions(this); + +try +{ + eval("var x;"); + throw new Error("no error thrown"); +} +catch (e) +{ + assert.sameValue(e instanceof TypeError, true, "expected TypeError, got: " + e); +} + +/******************************************************************************/ + +print("All tests passed!"); diff --git a/test/staging/sm/global/bug-320887.js b/test/staging/sm/global/bug-320887.js new file mode 100644 index 0000000000..572e98635d --- /dev/null +++ b/test/staging/sm/global/bug-320887.js @@ -0,0 +1,25 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +// `var x` should not call the getter of an existing global property. + +var hit = 0; +Object.defineProperty(this, "x", { + get: function () { return ++hit; }, + configurable: true +}); +eval("var x;"); +assert.sameValue(hit, 0); + +// The declaration should not have redefined the global x, either. +assert.sameValue(x, 1); +assert.sameValue(x, 2); + diff --git a/test/staging/sm/global/bug660612.js b/test/staging/sm/global/bug660612.js new file mode 100644 index 0000000000..c200dfa4a8 --- /dev/null +++ b/test/staging/sm/global/bug660612.js @@ -0,0 +1,17 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +try { + decodeURIComponent('%ED%A0%80'); + assert.sameValue(true, false, "expected an URIError"); +} catch (e) { + assert.sameValue(e instanceof URIError, true); +} diff --git a/test/staging/sm/global/decodeURI-decodes-FFFE-FFFF.js b/test/staging/sm/global/decodeURI-decodes-FFFE-FFFF.js new file mode 100644 index 0000000000..f9b7bb6fa3 --- /dev/null +++ b/test/staging/sm/global/decodeURI-decodes-FFFE-FFFF.js @@ -0,0 +1,33 @@ +/* + * Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/licenses/publicdomain/ + */ + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +//----------------------------------------------------------------------------- +var BUGNUMBER = 520095; +var summary = + "decodeURI{,Component} should return the specified character for " + + "'%EF%BF%BE' and '%EF%BF%BF', not return U+FFFD"; + +print(BUGNUMBER + ": " + summary); + +/************** + * BEGIN TEST * + **************/ + +assert.sameValue(decodeURI("%EF%BF%BE"), "\uFFFE"); +assert.sameValue(decodeURI("%EF%BF%BF"), "\uFFFF"); +assert.sameValue(decodeURIComponent("%EF%BF%BE"), "\uFFFE"); +assert.sameValue(decodeURIComponent("%EF%BF%BF"), "\uFFFF"); + +/******************************************************************************/ + +print("All tests passed!"); diff --git a/test/staging/sm/global/delete-global-NaN-property.js b/test/staging/sm/global/delete-global-NaN-property.js new file mode 100644 index 0000000000..ca4ca04b95 --- /dev/null +++ b/test/staging/sm/global/delete-global-NaN-property.js @@ -0,0 +1,40 @@ +/* + * Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/licenses/publicdomain/ + */ + +/*--- +flags: +- onlyStrict +includes: [sm/non262-shell.js, sm/non262.js] +description: | + pending +esid: pending +---*/ +"use strict" + +//----------------------------------------------------------------------------- +var BUGNUMBER = 649570; +var summary = "|delete window.NaN| should throw a TypeError"; + +print(BUGNUMBER + ": " + summary); + +/************** + * BEGIN TEST * + **************/ + +var g = this, v = false; +try +{ + delete this.NaN; + throw new Error("no exception thrown"); +} +catch (e) +{ + assert.sameValue(e instanceof TypeError, true, + "Expected a TypeError, got: " + e); +} + +/******************************************************************************/ + +print("Tests complete"); diff --git a/test/staging/sm/global/direct-eval-but-not.js b/test/staging/sm/global/direct-eval-but-not.js new file mode 100644 index 0000000000..27c8b54a9d --- /dev/null +++ b/test/staging/sm/global/direct-eval-but-not.js @@ -0,0 +1,39 @@ +/* + * Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/licenses/publicdomain/ + */ + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +//----------------------------------------------------------------------------- +var BUGNUMBER = 609256; +var summary = + "Don't crash doing a direct eval when eval doesn't resolve to an object " + + "(let alone the original eval function)"; + +print(BUGNUMBER + ": " + summary); + +/************** + * BEGIN TEST * + **************/ + +var eval = ""; +try +{ + eval(); + throw new Error("didn't throw?"); +} +catch (e) +{ + assert.sameValue(e instanceof TypeError, true); +} + +/******************************************************************************/ + +print("All tests passed!"); diff --git a/test/staging/sm/global/eval-01.js b/test/staging/sm/global/eval-01.js new file mode 100644 index 0000000000..33322a823b --- /dev/null +++ b/test/staging/sm/global/eval-01.js @@ -0,0 +1,47 @@ +/* + * Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/licenses/publicdomain/ + */ + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +var a = 9; +var global = this; + +function test() { + var a = 0; + + // direct eval sees local a + assert.sameValue(eval('a+1'), 1); + assert.sameValue(eval('eval("a+1")'), 1); + + // indirect: using a name other than 'eval' + var foo = eval; + assert.sameValue(foo('a+1'), 10); + assert.sameValue(eval('foo("a+1")'), 10); // outer eval is direct, inner foo("a+1") is indirect + + // indirect: qualified method call + assert.sameValue(this.eval("a+1"), 10); + assert.sameValue(global.eval("a+1"), 10); + var obj = {foo: eval, eval: eval}; + assert.sameValue(obj.foo('a+1'), 10); + assert.sameValue(obj.eval('a+1'), 10); + var name = "eval"; + assert.sameValue(obj[name]('a+1'), 10); + assert.sameValue([eval][0]('a+1'), 10); + + // indirect: not called from a CallExpression at all + assert.sameValue(eval.call(undefined, 'a+1'), 10); + assert.sameValue(eval.call(global, 'a+1'), 10); + assert.sameValue(eval.apply(undefined, ['a+1']), 10); + assert.sameValue(eval.apply(global, ['a+1']), 10); + assert.sameValue(['a+1'].map(eval)[0], 10); +} + +test(); diff --git a/test/staging/sm/global/eval-02.js b/test/staging/sm/global/eval-02.js new file mode 100644 index 0000000000..ad06e925bc --- /dev/null +++ b/test/staging/sm/global/eval-02.js @@ -0,0 +1,47 @@ +/* + * Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/licenses/publicdomain/ + */ + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +var a = 9; + +function directArg(eval, s) { + var a = 1; + return eval(s); +} + +function directVar(f, s) { + var eval = f; + var a = 1; + return eval(s); +} + +function directWith(obj, s) { + var f; + with (obj) { + f = function () { + var a = 1; + return eval(s); + }; + } + return f(); +} + +// direct eval, even though 'eval' is an argument +assert.sameValue(directArg(eval, 'a+1'), 2); + +// direct eval, even though 'eval' is a var +assert.sameValue(directVar(eval, 'a+1'), 2); + +// direct eval, even though 'eval' is found via a with block +assert.sameValue(directWith(this, 'a+1'), 2); +assert.sameValue(directWith({eval: eval, a: -1000}, 'a+1'), 2); + diff --git a/test/staging/sm/global/eval-in-strict-eval-in-normal-function.js b/test/staging/sm/global/eval-in-strict-eval-in-normal-function.js new file mode 100644 index 0000000000..3345c482ea --- /dev/null +++ b/test/staging/sm/global/eval-in-strict-eval-in-normal-function.js @@ -0,0 +1,37 @@ +/* + * Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/licenses/publicdomain/ + */ + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +//----------------------------------------------------------------------------- +var BUGNUMBER = 620130; +var summary = + "Calls to eval with same code + varying strict mode of script containing " + + "eval == fail"; + +print(BUGNUMBER + ": " + summary); + +/************** + * BEGIN TEST * + **************/ + +function t(code) { return eval(code); } + +assert.sameValue(t("'use strict'; try { eval('with (5) 17'); } catch (e) { 'threw'; }"), + "threw"); +assert.sameValue(t("try { eval('with (5) 17'); } catch (e) { 'threw'; }"), + 17); +assert.sameValue(t("'use strict'; try { eval('with (5) 17'); } catch (e) { 'threw'; }"), + "threw"); + +/******************************************************************************/ + +print("All tests passed!"); diff --git a/test/staging/sm/global/eval-inside-with-is-direct.js b/test/staging/sm/global/eval-inside-with-is-direct.js new file mode 100644 index 0000000000..43257a474c --- /dev/null +++ b/test/staging/sm/global/eval-inside-with-is-direct.js @@ -0,0 +1,35 @@ +/* + * Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/licenses/publicdomain/ + */ + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +//----------------------------------------------------------------------------- +var BUGNUMBER = 601307; +var summary = "with (...) eval(...) is a direct eval"; + +print(BUGNUMBER + ": " + summary); + +/************** + * BEGIN TEST * + **************/ + +var t = "global"; +function test() +{ + var t = "local"; + with ({}) + return eval("t"); +} +assert.sameValue(test(), "local"); + +/******************************************************************************/ + +print("All tests passed!"); diff --git a/test/staging/sm/global/eval-native-callback-is-indirect.js b/test/staging/sm/global/eval-native-callback-is-indirect.js new file mode 100644 index 0000000000..33ea31028c --- /dev/null +++ b/test/staging/sm/global/eval-native-callback-is-indirect.js @@ -0,0 +1,39 @@ +/* + * Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/licenses/publicdomain/ + */ + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +//----------------------------------------------------------------------------- +var BUGNUMBER = 604504; +var summary = "eval called from a native function is indirect"; + +print(BUGNUMBER + ": " + summary); + +/************** + * BEGIN TEST * + **************/ + +var originalEval = eval; + +var global = this; +var directCheckCode = "this === global"; + +function testBound() +{ + var global = "psych!"; + var eval = originalEval.bind(undefined, directCheckCode); + assert.sameValue(eval(), true); +} +testBound(); + +/******************************************************************************/ + +print("All tests passed!"); diff --git a/test/staging/sm/global/globalThis-enumeration.js b/test/staging/sm/global/globalThis-enumeration.js new file mode 100644 index 0000000000..e3422ddd0f --- /dev/null +++ b/test/staging/sm/global/globalThis-enumeration.js @@ -0,0 +1,15 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +assert.sameValue(Object.getOwnPropertyNames(this).includes('globalThis'), true); + +if (typeof assert.sameValue === "function") { +} diff --git a/test/staging/sm/global/parenthesized-eval-is-direct.js b/test/staging/sm/global/parenthesized-eval-is-direct.js new file mode 100644 index 0000000000..c513059450 --- /dev/null +++ b/test/staging/sm/global/parenthesized-eval-is-direct.js @@ -0,0 +1,75 @@ +/* + * Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/licenses/publicdomain/ + */ + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +//----------------------------------------------------------------------------- +print("(eval)(...) is a direct eval, (1, eval)() isn't, etc."); + +/************** + * BEGIN TEST * + **************/ + +/* + * Justification: + * + * https://mail.mozilla.org/pipermail/es5-discuss/2010-October/003724.html + * + * Note also bug 537673. + */ + +var t = "global"; + +function group() +{ + var t = "local"; + return (eval)("t"); +} +assert.sameValue(group(), "local"); + +function groupAndComma() +{ + var t = "local"; + return (1, eval)("t"); +} +assert.sameValue(groupAndComma(), "global"); + +function groupAndTrueTernary() +{ + var t = "local"; + return (true ? eval : null)("t"); +} +assert.sameValue(groupAndTrueTernary(), "global"); + +function groupAndEmptyStringTernary() +{ + var t = "local"; + return ("" ? null : eval)("t"); +} +assert.sameValue(groupAndEmptyStringTernary(), "global"); + +function groupAndZeroTernary() +{ + var t = "local"; + return (0 ? null : eval)("t"); +} +assert.sameValue(groupAndZeroTernary(), "global"); + +function groupAndNaNTernary() +{ + var t = "local"; + return (0 / 0 ? null : eval)("t"); +} +assert.sameValue(groupAndNaNTernary(), "global"); + +/******************************************************************************/ + +print("All tests passed!"); diff --git a/test/staging/sm/global/parseFloat-01.js b/test/staging/sm/global/parseFloat-01.js new file mode 100644 index 0000000000..41a6f416a5 --- /dev/null +++ b/test/staging/sm/global/parseFloat-01.js @@ -0,0 +1,31 @@ +/* + * Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/licenses/publicdomain/ + */ + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +//----------------------------------------------------------------------------- +var BUGNUMBER = 613492; +var summary = "ES5 15.1.2.3 parseFloat(string)"; + +print(BUGNUMBER + ": " + summary); + +assert.sameValue(parseFloat("Infinity"), Infinity); +assert.sameValue(parseFloat("+Infinity"), Infinity); +assert.sameValue(parseFloat("-Infinity"), -Infinity); + +assert.sameValue(parseFloat("inf"), NaN); +assert.sameValue(parseFloat("Inf"), NaN); +assert.sameValue(parseFloat("infinity"), NaN); + +assert.sameValue(parseFloat("nan"), NaN); +assert.sameValue(parseFloat("NaN"), NaN); + +print("All tests passed!"); diff --git a/test/staging/sm/global/parseInt-01.js b/test/staging/sm/global/parseInt-01.js new file mode 100644 index 0000000000..5de98e91f0 --- /dev/null +++ b/test/staging/sm/global/parseInt-01.js @@ -0,0 +1,177 @@ +/* + * Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/licenses/publicdomain/ + */ + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +//----------------------------------------------------------------------------- +var BUGNUMBER = 577536; +var summary = "ES5 15.1.2.2 parseInt(string, radix)"; + +print(BUGNUMBER + ": " + summary); + +/************** + * BEGIN TEST * + **************/ + +var str, radix; +var upvar; + +/* 1. Let inputString be ToString(string). */ + +assert.sameValue(parseInt({ toString: function() { return "17" } }, 10), 17); + +upvar = 0; +str = { get toString() { upvar++; return function() { upvar++; return "12345"; } } }; +assert.sameValue(parseInt(str, 10), 12345); +assert.sameValue(upvar, 2); + + +/* + * 2. Let S be a newly created substring of inputString consisting of the first + * character that is not a StrWhiteSpaceChar and all characters following + * that character. (In other words, remove leading white space.) + */ + +var ws = + ["\t", "\v", "\f", " ", "\xA0", "\uFEFF", + "\u2004", "\u3000", // a few Unicode whitespaces + "\r", "\n", "\u2028", "\u2029"]; + +str = "8675309"; +for (var i = 0, sz = ws.length; i < sz; i++) +{ + assert.sameValue(parseInt(ws[i] + str, 10), 8675309); + for (var j = 0, sz = ws.length; j < sz; j++) + { + assert.sameValue(parseInt(ws[i] + ws[j] + str, 10), 8675309, + ws[i].charCodeAt(0).toString(16) + ", " + + ws[j].charCodeAt(0).toString(16)); + } +} + + +/* + * 3. Let sign be 1. + * 4. If S is not empty and the first character of S is a minus sign -, let + * sign be −1. + */ +str = "5552368"; +assert.sameValue(parseInt("-" + str, 10), -parseInt(str, 10)); +assert.sameValue(parseInt(" -" + str, 10), -parseInt(str, 10)); +assert.sameValue(parseInt("-", 10), NaN); +assert.sameValue(parseInt("", 10), NaN); +assert.sameValue(parseInt("-0", 10), -0); + + +/* + * 5. If S is not empty and the first character of S is a plus sign + or a + * minus sign -, then remove the first character from S. + */ +assert.sameValue(parseInt("+12345", 10), 12345); +assert.sameValue(parseInt(" +12345", 10), 12345); +assert.sameValue(parseInt("-12345", 10), -12345); +assert.sameValue(parseInt(" -12345", 10), -12345); + + +/* + * 6. Let R = ToInt32(radix). + */ + +upvar = ""; +str = + { toString: function() { if (!upvar) upvar = "string"; return "42"; } }; +radix = + { toString: function() { if (!upvar) upvar = "radix"; return "10"; } }; + +assert.sameValue(parseInt(str, radix), 42); +assert.sameValue(upvar, "string"); + +assert.sameValue(parseInt("123", null), 123); +assert.sameValue(parseInt("123", undefined), 123); +assert.sameValue(parseInt("123", NaN), 123); +assert.sameValue(parseInt("123", -0), 123); +assert.sameValue(parseInt("10", 72057594037927950), 16); +assert.sameValue(parseInt("10", -4294967292), 4); +assert.sameValue(parseInt("0x10", 1e308), 16); +assert.sameValue(parseInt("10", 1e308), 10); +assert.sameValue(parseInt("10", { valueOf: function() { return 16; } }), 16); + + +/* + * 7. Let stripPrefix be true. + * 8. If R ≠ 0, then + * a. If R < 2 or R > 36, then return NaN. + * b. If R ≠ 16, let stripPrefix be false. + * 9. Else, R = 0 + * a. Let R = 10. + * 10. If stripPrefix is true, then + * a. If the length of S is at least 2 and the first two characters of S + * are either “0x” or “0X”, then remove the first two characters from S and + * let R = 16. + */ +var vs = ["1", "51", "917", "2343", "99963"]; +for (var i = 0, sz = vs.length; i < sz; i++) + assert.sameValue(parseInt(vs[i], 0), parseInt(vs[i], 10), "bad " + vs[i]); + +assert.sameValue(parseInt("0x10"), 16); +assert.sameValue(parseInt("0x10", 0), 16); +assert.sameValue(parseInt("0x10", 16), 16); +assert.sameValue(parseInt("0x10", 8), 0); +assert.sameValue(parseInt("-0x10", 16), -16); + +assert.sameValue(parseInt("5", 1), NaN); +assert.sameValue(parseInt("5", 37), NaN); +assert.sameValue(parseInt("5", { valueOf: function() { return -1; } }), NaN); + + +/* + * 11. If S contains any character that is not a radix-R digit, then let Z be + * the substring of S consisting of all characters before the first such + * character; otherwise, let Z be S. + * 12. If Z is empty, return NaN. + */ +assert.sameValue(parseInt(""), NaN); +assert.sameValue(parseInt("ohai"), NaN); +assert.sameValue(parseInt("0xohai"), NaN); +assert.sameValue(parseInt("-ohai"), NaN); +assert.sameValue(parseInt("+ohai"), NaN); +assert.sameValue(parseInt(" ohai"), NaN); + +assert.sameValue(parseInt("0xaohai"), 10); +assert.sameValue(parseInt("hohai", 18), 17); + + +/* + * 13. Let mathInt be the mathematical integer value that is represented by Z + * in radix-R notation, using the letters A-Z and a-z for digits with + * values 10 through 35. (However, if R is 10 and Z contains more than 20 + * significant digits, every significant digit after the 20th may be + * replaced by a 0 digit, at the option of the implementation; and if R is + * not 2, 4, 8, 10, 16, or 32, then mathInt may be an implementation- + * dependent approximation to the mathematical integer value that is + * represented by Z in radix-R notation.) + * 14. Let number be the Number value for mathInt. + * 15. Return sign × number. + */ +assert.sameValue(parseInt("ohai", 36), 1142154); +assert.sameValue(parseInt("0ohai", 36), 1142154); +assert.sameValue(parseInt("00ohai", 36), 1142154); +assert.sameValue(parseInt("A", 16), 10); +assert.sameValue(parseInt("0A", 16), 10); +assert.sameValue(parseInt("00A", 16), 10); +assert.sameValue(parseInt("A", 17), 10); +assert.sameValue(parseInt("0A", 17), 10); +assert.sameValue(parseInt("00A", 17), 10); + + +/******************************************************************************/ + +print("All tests passed!"); diff --git a/test/staging/sm/global/parseInt-default-to-decimal.js b/test/staging/sm/global/parseInt-default-to-decimal.js new file mode 100644 index 0000000000..92fb4cc381 --- /dev/null +++ b/test/staging/sm/global/parseInt-default-to-decimal.js @@ -0,0 +1,38 @@ +/* + * Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/licenses/publicdomain/ + */ + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +//----------------------------------------------------------------------------- +var BUGNUMBER = 583925; +var summary = + "parseInt should treat leading-zero inputs (with radix unspecified) as " + + "decimal, not octal (this changed in bug 786135)"; + +print(BUGNUMBER + ": " + summary); + +/************** + * BEGIN TEST * + **************/ + +assert.sameValue(parseInt("08"), 8); +assert.sameValue(parseInt("09"), 9); +assert.sameValue(parseInt("014"), 14); + +function strictParseInt(s) { "use strict"; return parseInt(s); } + +assert.sameValue(strictParseInt("08"), 8); +assert.sameValue(strictParseInt("09"), 9); +assert.sameValue(strictParseInt("014"), 14); + +/******************************************************************************/ + +print("All tests passed!"); diff --git a/test/staging/sm/lexical-environment/block-scoped-functions-annex-b-arguments.js b/test/staging/sm/lexical-environment/block-scoped-functions-annex-b-arguments.js new file mode 100644 index 0000000000..d73905883a --- /dev/null +++ b/test/staging/sm/lexical-environment/block-scoped-functions-annex-b-arguments.js @@ -0,0 +1,19 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +// Test that Annex B function interaction with 'arguments'. + +(function() { + assert.sameValue(typeof arguments, "object"); + { function arguments() {} } + assert.sameValue(typeof arguments, "function"); +})(); + diff --git a/test/staging/sm/lexical-environment/block-scoped-functions-annex-b-eval.js b/test/staging/sm/lexical-environment/block-scoped-functions-annex-b-eval.js new file mode 100644 index 0000000000..852df56873 --- /dev/null +++ b/test/staging/sm/lexical-environment/block-scoped-functions-annex-b-eval.js @@ -0,0 +1,62 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +var log = ""; + +function f() { + log += g(); + function g() { return "outer-g"; } + + var o = { g: function () { return "with-g"; } }; + with (o) { + // Annex B.3.3.3 says g should be set on the nearest VariableEnvironment, + // and so should not change o.g. + eval(`{ + function g() { return "eval-g"; } + }`); + } + + log += g(); + log += o.g(); +} + +f(); + +function h() { + eval(` + // Should return true, as var bindings introduced by eval are configurable. + log += (delete q); + { + function q() { log += "q"; } + // Should return false, as lexical bindings introduced by eval are not + // configurable. + log += (delete q); + } + `); + return q; +} + +h()(); + +function f2() { + // Should not throw, just simply not synthesize an Annex B var in the eval + // because there's an outer const. + eval("{ function a() {} }"); + const a = 1; +} + +function f3() { + // As above, but for let. + eval("{ function a() {} }"); + let a; +} + +assert.sameValue(log, "outer-geval-gwith-gtruefalseq"); diff --git a/test/staging/sm/lexical-environment/block-scoped-functions-annex-b-generators.js b/test/staging/sm/lexical-environment/block-scoped-functions-annex-b-generators.js new file mode 100644 index 0000000000..ecec0890f6 --- /dev/null +++ b/test/staging/sm/lexical-environment/block-scoped-functions-annex-b-generators.js @@ -0,0 +1,35 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +// Tests by André Bargull + +// Annex B.3.3.1 +function f1() { + { function* g() {} } + assert.sameValue(typeof g, "undefined"); +} +f1(); + +// Annex B.3.3.2 +{ function* g() {} } +assert.sameValue(typeof g, "undefined"); + +// Annex B.3.3.3 +function f2() { + eval("{ function* g() {} }"); + assert.sameValue(typeof g, "undefined"); +} +f2(); + +// Annex B.3.3.3 +eval("{ function* g() {} }"); +assert.sameValue(typeof g, "undefined"); + diff --git a/test/staging/sm/lexical-environment/block-scoped-functions-annex-b-if.js b/test/staging/sm/lexical-environment/block-scoped-functions-annex-b-if.js new file mode 100644 index 0000000000..2cdeb5c0e6 --- /dev/null +++ b/test/staging/sm/lexical-environment/block-scoped-functions-annex-b-if.js @@ -0,0 +1,53 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +var log = ""; + +function f(x) { + if (x) + function g() { return "g0"; } + else + function g() { return "g1"; } + + log += g(); + + if (x) + function g() { return "g2"; } + else { + } + + log += g(); + + if (x) { + } else + function g() { return "g3"; } + + log += g(); + + if (x) + function g() { return "g4"; } + + log += g(); +} + +f(true); +f(false); + +try { + eval(` + if (1) + l: function foo() {} + `); +} catch (e) { + log += "e"; +} + +assert.sameValue(log, "g0g2g2g4g1g1g3g3e"); diff --git a/test/staging/sm/lexical-environment/block-scoped-functions-annex-b-label.js b/test/staging/sm/lexical-environment/block-scoped-functions-annex-b-label.js new file mode 100644 index 0000000000..f898e1baa6 --- /dev/null +++ b/test/staging/sm/lexical-environment/block-scoped-functions-annex-b-label.js @@ -0,0 +1,53 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +function expectSyntaxError(str) { + var threwSyntaxError; + try { + eval(str); + } catch (e) { + threwSyntaxError = e instanceof SyntaxError; + } + assert.sameValue(threwSyntaxError, true); + + try { + eval('"use strict";' + str); + } catch (e) { + threwSyntaxError = e instanceof SyntaxError; + } + assert.sameValue(threwSyntaxError, true); +} + +function expectSloppyPass(str) { + eval(str); + + try { + eval('"use strict";' + str); + } catch (e) { + threwSyntaxError = e instanceof SyntaxError; + } + assert.sameValue(threwSyntaxError, true); +} + +expectSloppyPass(`l: function f1() {}`); +expectSloppyPass(`l0: l: function f1() {}`); +expectSloppyPass(`{ f1(); l: function f1() {} }`); +expectSloppyPass(`{ f1(); l0: l: function f1() {} }`); +expectSloppyPass(`{ f1(); l: function f1() { return 42; } } assert.sameValue(f1(), 42);`); +expectSloppyPass(`eval("fe(); l: function fe() {}")`); +expectSyntaxError(`if (1) l: function f2() {}`); +expectSyntaxError(`if (1) {} else l: function f3() {}`); +expectSyntaxError(`do l: function f4() {} while (0)`); +expectSyntaxError(`while (0) l: function f5() {}`); +expectSyntaxError(`for (;;) l: function f6() {}`); +expectSloppyPass(`switch (1) { case 1: l: function f7() {} }`); +expectSloppyPass(`switch (1) { case 1: assert.sameValue(f8(), 'f8'); case 2: l: function f8() { return 'f8'; } } assert.sameValue(f8(), 'f8');`); + diff --git a/test/staging/sm/lexical-environment/block-scoped-functions-annex-b-notapplicable.js b/test/staging/sm/lexical-environment/block-scoped-functions-annex-b-notapplicable.js new file mode 100644 index 0000000000..828c832a1e --- /dev/null +++ b/test/staging/sm/lexical-environment/block-scoped-functions-annex-b-notapplicable.js @@ -0,0 +1,23 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +// Test that functions in block that do not exhibit Annex B do not override +// previous functions that do exhibit Annex B. + +function f() { + var outerX; + { function x() {1} outerX = x; } + { { function x() {2}; } let x; } + { let x; { function x() {3}; } } + assert.sameValue(x, outerX); +} +f(); + diff --git a/test/staging/sm/lexical-environment/block-scoped-functions-annex-b-parameter.js b/test/staging/sm/lexical-environment/block-scoped-functions-annex-b-parameter.js new file mode 100644 index 0000000000..f5f153f481 --- /dev/null +++ b/test/staging/sm/lexical-environment/block-scoped-functions-annex-b-parameter.js @@ -0,0 +1,30 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +// Annex B.3.3.1 disallows Annex B lexical function behavior when redeclaring a +// parameter. + +(function(f) { + if (true) function f() { } + assert.sameValue(f, 123); +}(123)); + +(function(f) { + { function f() { } } + assert.sameValue(f, 123); +}(123)); + +(function(f = 123) { + assert.sameValue(f, 123); + { function f() { } } + assert.sameValue(f, 123); +}()); + diff --git a/test/staging/sm/lexical-environment/block-scoped-functions-annex-b-same-name.js b/test/staging/sm/lexical-environment/block-scoped-functions-annex-b-same-name.js new file mode 100644 index 0000000000..b4a91c5cbb --- /dev/null +++ b/test/staging/sm/lexical-environment/block-scoped-functions-annex-b-same-name.js @@ -0,0 +1,18 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +{ + function f() { return "inner"; } +} + +function f() { return "outer"; } + +assert.sameValue(f(), "inner"); diff --git a/test/staging/sm/lexical-environment/block-scoped-functions-annex-b-with.js b/test/staging/sm/lexical-environment/block-scoped-functions-annex-b-with.js new file mode 100644 index 0000000000..b8a4725830 --- /dev/null +++ b/test/staging/sm/lexical-environment/block-scoped-functions-annex-b-with.js @@ -0,0 +1,28 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +var o = { f: "string-f" }; +with (o) { + var desc = Object.getOwnPropertyDescriptor(this, "f"); + assert.sameValue(desc.value, undefined); + assert.sameValue(desc.writable, true); + assert.sameValue(desc.enumerable, true); + assert.sameValue(desc.configurable, false); + function f() { + return "fun-f"; + } +} + +// Annex B explicitly assigns to the nearest VariableEnvironment, so the +// with-object "o" should have its property unchanged. +assert.sameValue(o.f, "string-f"); +assert.sameValue(f(), "fun-f"); + diff --git a/test/staging/sm/lexical-environment/block-scoped-functions-annex-b.js b/test/staging/sm/lexical-environment/block-scoped-functions-annex-b.js new file mode 100644 index 0000000000..05b11aa73a --- /dev/null +++ b/test/staging/sm/lexical-environment/block-scoped-functions-annex-b.js @@ -0,0 +1,42 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +var log = ""; + +log += typeof f; + +{ + log += f(); + + function f() { + return "f1"; + } +} + +log += f(); + +function g() { + log += typeof h; + + { + log += h(); + + function h() { + return "h1"; + } + } + + log += h(); +} + +g(); + +assert.sameValue(log, "undefinedf1f1undefinedh1h1"); diff --git a/test/staging/sm/lexical-environment/block-scoped-functions-deprecated-redecl.js b/test/staging/sm/lexical-environment/block-scoped-functions-deprecated-redecl.js new file mode 100644 index 0000000000..843a956ee0 --- /dev/null +++ b/test/staging/sm/lexical-environment/block-scoped-functions-deprecated-redecl.js @@ -0,0 +1,88 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +{ + assert.sameValue(f(), 4); + function f() { return 3; } + assert.sameValue(f(), 4); + function f() { return 4; } + assert.sameValue(f(), 4); +} + +// Annex B still works. +assert.sameValue(f(), 4); + +// The same thing with labels. +{ + assert.sameValue(f(), 4); + function f() { return 3; } + assert.sameValue(f(), 4); + l: function f() { return 4; } + assert.sameValue(f(), 4); +} + +// Annex B still works. +assert.sameValue(f(), 4); + +function test() { + { + assert.sameValue(f(), 2); + function f() { return 1; } + assert.sameValue(f(), 2); + function f() { return 2; } + assert.sameValue(f(), 2); + } + + // Annex B still works. + assert.sameValue(f(), 2); +} + +test(); + +var log = ''; + +try { + // Strict mode still cannot redeclare. + eval(`"use strict"; + { + function f() { } + function f() { } + }`); +} catch (e) { + assert.sameValue(e instanceof SyntaxError, true); + log += 'e'; +} + +try { + // Redeclaring an explicitly 'let'-declared binding doesn't work. + eval(`{ + let x = 42; + function x() {} + }`); +} catch (e) { + assert.sameValue(e instanceof SyntaxError, true); + log += 'e'; +} + +try { + // Redeclaring an explicitly 'const'-declared binding doesn't work. + eval(`{ + const x = 42; + function x() {} + }`); +} catch (e) { + assert.sameValue(e instanceof SyntaxError, true); + log += 'e'; +} + +assert.sameValue(log, 'eee'); + +if ('assert.sameValue' in this) diff --git a/test/staging/sm/lexical-environment/block-scoped-functions-hoisted-tdz.js b/test/staging/sm/lexical-environment/block-scoped-functions-hoisted-tdz.js new file mode 100644 index 0000000000..7dc9b7af85 --- /dev/null +++ b/test/staging/sm/lexical-environment/block-scoped-functions-hoisted-tdz.js @@ -0,0 +1,40 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +var log = ""; +try { + (function() { + { + let y = f(); + function f() { y; } + } + })() +} catch (e) { + log += e instanceof ReferenceError; +} + +try { + function f() { + switch (1) { + case 0: + let x; + case 1: + (function() { x; })(); + } + } + f(); +} catch (e) { + log += e instanceof ReferenceError; +} + +assert.sameValue(log, "truetrue"); + +if ("assert.sameValue" in this) diff --git a/test/staging/sm/lexical-environment/block-scoped-functions-strict.js b/test/staging/sm/lexical-environment/block-scoped-functions-strict.js new file mode 100644 index 0000000000..4f22db4bde --- /dev/null +++ b/test/staging/sm/lexical-environment/block-scoped-functions-strict.js @@ -0,0 +1,56 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +flags: +- onlyStrict +includes: [sm/non262-shell.js, sm/non262.js] +description: | + pending +esid: pending +---*/ +"use strict" + +var log = ""; + +function f() { + return "f0"; +} + +log += f(); + +{ + log += f(); + + function f() { + return "f1"; + } + + log += f(); +} + +log += f(); + +function g() { + function h() { + return "h0"; + } + + log += h(); + + { + log += h(); + + function h() { + return "h1"; + } + + log += h(); + } + + log += h(); +} + +g(); + +assert.sameValue(log, "f0f1f1f0h0h1h1h0"); diff --git a/test/staging/sm/lexical-environment/bug-1216623.js b/test/staging/sm/lexical-environment/bug-1216623.js new file mode 100644 index 0000000000..c32e40a518 --- /dev/null +++ b/test/staging/sm/lexical-environment/bug-1216623.js @@ -0,0 +1,29 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +// Scoping in the head of for(let;;) statements. + +let x = 0; +for (let i = 0, a = () => i; i < 4; i++) { + assert.sameValue(i, x++); + assert.sameValue(a(), 0); +} +assert.sameValue(x, 4); + +x = 11; +let q = 0; +for (let {[++q]: r} = [0, 11, 22], s = () => r; r < 13; r++) { + assert.sameValue(r, x++); + assert.sameValue(s(), 11); +} +assert.sameValue(x, 13); +assert.sameValue(q, 1); + diff --git a/test/staging/sm/lexical-environment/catch-body.js b/test/staging/sm/lexical-environment/catch-body.js new file mode 100644 index 0000000000..8421fbae84 --- /dev/null +++ b/test/staging/sm/lexical-environment/catch-body.js @@ -0,0 +1,28 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +function f() { + var probeParam, probeBlock; + let x = 'outside'; + + try { + throw []; + } catch ([_ = probeParam = function() { return x; }]) { + probeBlock = function() { return x; }; + let x = 'inside'; + } + + assert.sameValue(probeBlock(), 'inside'); + assert.sameValue(probeParam(), 'outside'); +} + +f(); + diff --git a/test/staging/sm/lexical-environment/const-declaration-in-for-loop.js b/test/staging/sm/lexical-environment/const-declaration-in-for-loop.js new file mode 100644 index 0000000000..fab1385263 --- /dev/null +++ b/test/staging/sm/lexical-environment/const-declaration-in-for-loop.js @@ -0,0 +1,93 @@ +/* + * Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/licenses/publicdomain/ + */ + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +var gTestfile = "const-declaration-in-for-loop.js"; +//----------------------------------------------------------------------------- +var BUGNUMBER = 1146644; +var summary = + "Don't crash compiling a non-body-level for-loop whose loop declaration is " + + "a const"; + +print(BUGNUMBER + ": " + summary); + +/************** + * BEGIN TEST * + **************/ + +// Don't attempt execution as a script if we can't properly emulate it. We +// could perhaps use eval, but eval, while also doing global execution, is its +// own can of messiness. Ongoing work on for-loop scoping for lexical +// declarations will likely make these tests redundant with other tests to be +// added, anyway, in the very short term. +var executeGlobalScript = typeof evaluate === "function" + ? evaluate + : function(s) {}; + +for (const a1 = 3; false; ) + continue; + +Function(`for (const a2 = 3; false; ) + continue; + `)(); + +if (true) +{ + for (const a3 = 3; false; ) + continue; +} + +Function(`if (true) + { + for (const a4 = 3; false; ) + continue; + }`)(); + +executeGlobalScript(`for (const a5 of []) + continue;`); + +Function(`for (const a6 of []) + continue;`)(); + +executeGlobalScript(`if (true) + { + for (const a7 of []) + continue; + }`); + +Function(`if (true) + { + for (const a8 of []) + continue; + }`)(); + +executeGlobalScript(`for (const a9 in {}) + continue;`); + +Function(`for (const a10 in {}) + continue;`)(); + +executeGlobalScript(`if (true) + { + for (const a11 in {}) + continue; + }`); + +Function(`if (true) + { + for (const a12 in {}) + continue; + }`)(); + +/******************************************************************************/ + +print("Tests complete"); diff --git a/test/staging/sm/lexical-environment/eval-has-lexical-environment.js b/test/staging/sm/lexical-environment/eval-has-lexical-environment.js new file mode 100644 index 0000000000..f3064932c8 --- /dev/null +++ b/test/staging/sm/lexical-environment/eval-has-lexical-environment.js @@ -0,0 +1,50 @@ +/* + * Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/licenses/publicdomain/ + */ + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +var gTestfile = "eval-has-lexical-environment.js" +//----------------------------------------------------------------------------- +var BUGNUMBER = 1193583; +var summary = + "Eval always has a lexical environment"; + +/************** + * BEGIN TEST * + **************/ + +eval(` +let foo = 42; +const kay = foo; +var bar = 84; +function f() { + return foo + kay; +} + `); + +(1, eval)(` +let foo2 = 42; +const kay2 = foo2; +`); + +// Lexical declarations should not have escaped eval. +assert.sameValue(typeof foo, "undefined"); +assert.sameValue(typeof kay, "undefined"); +assert.sameValue(typeof foo2, "undefined"); +assert.sameValue(typeof kay2, "undefined"); + +// Eval'd functions can close over lexical bindings. +assert.sameValue(f(), 84); + +// Var can escape direct eval. +assert.sameValue(bar, 84); + +print("Tests complete"); diff --git a/test/staging/sm/lexical-environment/for-loop-with-bindings-added-at-runtime.js b/test/staging/sm/lexical-environment/for-loop-with-bindings-added-at-runtime.js new file mode 100644 index 0000000000..f8ef0df6f5 --- /dev/null +++ b/test/staging/sm/lexical-environment/for-loop-with-bindings-added-at-runtime.js @@ -0,0 +1,130 @@ +/* + * Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/licenses/publicdomain/ + */ + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +var gTestfile = "for-loop-with-bindings-added-at-runtime.js"; +//----------------------------------------------------------------------------- +var BUGNUMBER = 1149797; +var summary = + "Don't assert when freshening the scope chain for a for-loop whose head " + + "contains a lexical declaration, where the loop body might add more " + + "bindings at runtime"; + +print(BUGNUMBER + ": " + summary); + +/************** + * BEGIN TEST * + **************/ + +for (let x = 0; x < 9; ++x) + eval("var y"); + +{ + for (let x = 0; x < 9; ++x) + eval("var y"); +} + +function f1() +{ + for (let x = 0; x < 9; ++x) + eval("var y"); +} +f1(); + +function f2() +{ + { + for (let x = 0; x < 9; ++x) + eval("var y"); + } +} +f2(); + +for (let x = 0; x < 9; ++x) +{ + // deliberately inside a block statement + eval("var y"); +} + +{ + for (let x = 0; x < 9; ++x) + { + // deliberately inside a block statement + eval("var y"); + } +} + +function g1() +{ + for (let x = 0; x < 9; ++x) + { + // deliberately inside a block statement + eval("var y"); + } +} +g1(); + +function g2() +{ + { + for (let x = 0; x < 9; ++x) + { + // deliberately inside a block statement + eval("var y"); + } + } +} +g2(); + +for (let x = 0; x < 9; ++x) { + (function() { + eval("var y"); + })(); +} + +{ + for (let x = 0; x < 9; ++x) + { + // deliberately inside a block statement + (function() { + eval("var y"); + })(); + } +} + +function h1() +{ + for (let x = 0; x < 9; ++x) + { + // deliberately inside a block statement + (function() { + eval("var y"); + })(); + } +} +h1(); + +function h2() +{ + { + for (let x = 0; x < 9; ++x) + { + // deliberately inside a block statement + (function() { eval("var y"); })(); + } + } +} +h2(); + +/******************************************************************************/ + +print("Tests complete"); diff --git a/test/staging/sm/lexical-environment/for-loop.js b/test/staging/sm/lexical-environment/for-loop.js new file mode 100644 index 0000000000..fee0df10ec --- /dev/null +++ b/test/staging/sm/lexical-environment/for-loop.js @@ -0,0 +1,126 @@ +/* + * Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/licenses/publicdomain/ + */ + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +var gTestfile = "for-loop.js"; +//----------------------------------------------------------------------------- +var BUGNUMBER = 985733; +var summary = + "ES6 for-loop semantics for for(;;) loops whose heads contain lexical " + "declarations"; + +print(BUGNUMBER + ": " + summary); + +/************** + * BEGIN TEST * + **************/ + +function isError(code, type) +{ + try + { + Function(code); + throw new Error("didn't throw"); + } + catch (e) + { + assert.sameValue(e instanceof type, true, + "unexpected error for `" + code + "`: got " + e); + } +} + +function isOK(code) +{ + Function(code); +} + +isError("for (const x; ; ) ;", SyntaxError); +isError("for (const x = 5, y; ; ) ;", SyntaxError); +isError("for (const [z]; ; ) ;", SyntaxError); +//isError("for (const [z, z]; ; ) ;", SyntaxError); +//isError("for (const [z, z] = [0, 1]; ; ) ;", SyntaxError); + +isOK("for (let x; ; ) ;"); +isOK("for (let x = 5, y; ; ) ;"); + +// I'm fairly sure this is supposed to work: the negative-lookahead rules in +// IterationStatement ensure that |for (let| *always* is a loop header starting +// with a lexical declaration. But I'm not 100% certain, so these tests might +// need to be fixed when we implement the negative-lookahead restrictions. +isOK("for (let [z] = [3]; ; ) ;"); +isError("for (let [z, z]; ; ) ;", SyntaxError); // because missing initializer + +isError("for (let [z, z] = [0, 1]; ; ) ;", SyntaxError); + +// A for-loop with lexical declarations, with a mixture of bindings that are and +// aren't aliased. (The mixture stress-tests any code that incorrectly assumes +// all bindings are aliased.) +var funcs = []; +for (let [i, j, k] = [0, 1, 2]; i < 10; i++) + funcs.push(() => i); + +assert.sameValue(funcs[0](), 0); +assert.sameValue(funcs[1](), 1); +assert.sameValue(funcs[2](), 2); +assert.sameValue(funcs[3](), 3); +assert.sameValue(funcs[4](), 4); +assert.sameValue(funcs[5](), 5); +assert.sameValue(funcs[6](), 6); +assert.sameValue(funcs[7](), 7); +assert.sameValue(funcs[8](), 8); +assert.sameValue(funcs[9](), 9); + +var outer = "OUTER V IGNORE"; +var save; +for (let outer = (save = function() { return outer; }); ; ) + break; +assert.sameValue(save(), save); + +var funcs = []; +function t(i, name, expect) +{ + assert.sameValue(funcs[i].name, name); + assert.sameValue(funcs[i](), expect); +} + +if (save() !== "OUTER V IGNORE") +{ + var v = "OUTER V IGNORE"; + var i = 0; + for (let v = (funcs.push(function init() { return v; }), + 0); + v = (funcs.push(function test() { return v; }), + v + 1); + v = (funcs.push(function incr() { return v; }), + v + 1)) + { + v = (funcs.push(function body() { return v; }), + v + 1); + i++; + if (i >= 3) + break; + } + t(0, "init", 0); + t(1, "test", 2); + t(2, "body", 2); + t(3, "incr", 5); + t(4, "test", 5); + t(5, "body", 5); + t(6, "incr", 8); + t(7, "test", 8); + t(8, "body", 8); + assert.sameValue(funcs.length, 9); +} + +/******************************************************************************/ + +print("Tests complete"); diff --git a/test/staging/sm/lexical-environment/implicit-this-in-with.js b/test/staging/sm/lexical-environment/implicit-this-in-with.js new file mode 100644 index 0000000000..7658cda9f2 --- /dev/null +++ b/test/staging/sm/lexical-environment/implicit-this-in-with.js @@ -0,0 +1,27 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +// Test that callees that resolve to bindings on the global object or the +// global lexical environment get an 'undefined' this inside with scopes. + +let g = function () { "use strict"; assert.sameValue(this, undefined); } +function f() { "use strict"; assert.sameValue(this, undefined); } + +with ({}) { + // f is resolved on the global object + f(); + // g is resolved on the global lexical environment + g(); +} + +f(); +g(); + diff --git a/test/staging/sm/lexical-environment/unscopables-basics.js b/test/staging/sm/lexical-environment/unscopables-basics.js new file mode 100644 index 0000000000..1544bc2ffc --- /dev/null +++ b/test/staging/sm/lexical-environment/unscopables-basics.js @@ -0,0 +1,32 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +// Basics of @@unscopables support. + +// In with(obj), if obj[@@unscopables][id] is truthy, then the identifier id +// is not present as a binding in the with-block's scope. +var x = "global"; +with ({x: "with", [Symbol.unscopables]: {x: true}}) + assert.sameValue(x, "global"); + +// But if obj[@@unscopables][id] is false or not present, there is a binding. +with ({y: "with", z: "with", [Symbol.unscopables]: {y: false}}) { + assert.sameValue(y, "with"); + assert.sameValue(z, "with"); +} + +// ToBoolean(obj[@@unscopables][id]) determines whether there's a binding. +let someValues = [0, -0, NaN, "", undefined, null, "x", {}, []]; +for (let v of someValues) { + with ({x: "with", [Symbol.unscopables]: {x: v}}) + assert.sameValue(x, v ? "global" : "with"); +} + diff --git a/test/staging/sm/lexical-environment/unscopables-closures.js b/test/staging/sm/lexical-environment/unscopables-closures.js new file mode 100644 index 0000000000..efeae85a37 --- /dev/null +++ b/test/staging/sm/lexical-environment/unscopables-closures.js @@ -0,0 +1,33 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +// @@unscopables continues to work after exiting the relevant `with` block, +// if the environment is captured by a closure. + +let env = { + x: 9000, + [Symbol.unscopables]: {x: true} +}; + +function make_adder(x) { + with (env) + return function (y) { return x + y; }; +} +assert.sameValue(make_adder(3)(10), 13); + +// Same test, but with a bunch of different parts for bad luck +let x = 500; +function make_adder_with_eval() { + with (env) + return eval('y => eval("x + y")'); +} +assert.sameValue(make_adder_with_eval()(10), 510); + diff --git a/test/staging/sm/lexical-environment/unscopables-const.js b/test/staging/sm/lexical-environment/unscopables-const.js new file mode 100644 index 0000000000..6ff2a4f93b --- /dev/null +++ b/test/staging/sm/lexical-environment/unscopables-const.js @@ -0,0 +1,18 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +// @@unscopables prevents a property from having any effect on assigning to a +// const binding (which is an error). + +const x = 1; +with ({x: 1, [Symbol.unscopables]: {x: true}}) + assertThrowsInstanceOf(() => {x = 2;}, TypeError); + diff --git a/test/staging/sm/lexical-environment/unscopables-delete.js b/test/staging/sm/lexical-environment/unscopables-delete.js new file mode 100644 index 0000000000..b26531a442 --- /dev/null +++ b/test/staging/sm/lexical-environment/unscopables-delete.js @@ -0,0 +1,37 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +// If obj[@@unscopables][id], then `delete id` works across `with (obj)` scope. + +this.niche = 7; +let obj = { niche: 8, [Symbol.unscopables]: { niche: true } }; +with (obj) { + delete niche; +} + +assert.sameValue(obj.niche, 8); +assert.sameValue("niche" in this, false); + +// Same thing, but delete a variable introduced by sloppy direct eval. +this.niche = 9; +function f() { + eval("var niche = 10;"); + with (obj) { + assert.sameValue(niche, 10); + delete niche; + } + assert.sameValue(niche, 9); +} + +// Of course none of this affects a qualified delete. +assert.sameValue(delete this.niche, true); +assert.sameValue("niche" in this, false); + diff --git a/test/staging/sm/lexical-environment/unscopables-getters.js b/test/staging/sm/lexical-environment/unscopables-getters.js new file mode 100644 index 0000000000..ca6d482298 --- /dev/null +++ b/test/staging/sm/lexical-environment/unscopables-getters.js @@ -0,0 +1,51 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +// @@unscopables checks can call getters. + +// The @@unscopables property itself can be a getter. +let hit1 = 0; +let x = "global x"; +let env1 = { + x: "env1.x", + get [Symbol.unscopables]() { + hit1++; + return {x: true}; + } +}; +with (env1) + assert.sameValue(x, "global x"); +assert.sameValue(hit1, 1); + +// It can throw; the exception is propagated out. +function Fit() {} +with ({x: 0, get [Symbol.unscopables]() { throw new Fit; }}) + assertThrowsInstanceOf(() => x, Fit); + +// Individual properties on the @@unscopables object can have getters. +let hit2 = 0; +let env2 = { + x: "env2.x", + [Symbol.unscopables]: { + get x() { + hit2++; + return true; + } + } +}; +with (env2) + assert.sameValue(x, "global x"); +assert.sameValue(hit2, 1); + +// And they can throw. +with ({x: 0, [Symbol.unscopables]: {get x() { throw new Fit; }}}) + assertThrowsInstanceOf(() => x, Fit); + diff --git a/test/staging/sm/lexical-environment/unscopables-global.js b/test/staging/sm/lexical-environment/unscopables-global.js new file mode 100644 index 0000000000..539548244b --- /dev/null +++ b/test/staging/sm/lexical-environment/unscopables-global.js @@ -0,0 +1,28 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +// @@unscopables does not affect the global environment. + +this.x = "global property x"; +let y = "global lexical y"; +this[Symbol.unscopables] = {x: true, y: true}; +assert.sameValue(x, "global property x"); +assert.sameValue(y, "global lexical y"); +assert.sameValue(eval("x"), "global property x"); +assert.sameValue(eval("y"), "global lexical y"); + +// But it does affect `with` statements targeting the global object. +{ + let x = "local x"; + with (this) + assert.sameValue(x, "local x"); +} + diff --git a/test/staging/sm/lexical-environment/unscopables-ignored.js b/test/staging/sm/lexical-environment/unscopables-ignored.js new file mode 100644 index 0000000000..7ee63fd81d --- /dev/null +++ b/test/staging/sm/lexical-environment/unscopables-ignored.js @@ -0,0 +1,32 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +// In these cases, @@unscopables should not be consulted. + +// Because obj has no properties `assert.sameValue` or `x`, +// obj[@@unscopables] is not checked here: +var obj = { + get [Symbol.unscopables]() { + throw "tried to read @@unscopables"; + } +}; +var x = 3; +with (obj) + assert.sameValue(x, 3); + +// If @@unscopables is present but not an object, it is ignored: +for (let nonObject of [undefined, null, "nothing", Symbol.for("moon")]) { + let y = 4; + let obj2 = {[Symbol.unscopables]: nonObject, y: 5}; + with (obj2) + assert.sameValue(y, 5); +} + diff --git a/test/staging/sm/lexical-environment/unscopables-miss.js b/test/staging/sm/lexical-environment/unscopables-miss.js new file mode 100644 index 0000000000..0d52bd6153 --- /dev/null +++ b/test/staging/sm/lexical-environment/unscopables-miss.js @@ -0,0 +1,17 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +// Trying to access a binding that doesn't exist due to @@unscopables +// is a ReferenceError. + +with ({x: 1, [Symbol.unscopables]: {x: true}}) + assertThrowsInstanceOf(() => x, ReferenceError); + diff --git a/test/staging/sm/lexical-environment/unscopables-mutation-frozen.js b/test/staging/sm/lexical-environment/unscopables-mutation-frozen.js new file mode 100644 index 0000000000..cca4b71bc8 --- /dev/null +++ b/test/staging/sm/lexical-environment/unscopables-mutation-frozen.js @@ -0,0 +1,28 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +// When env[@@unscopables].x changes, bindings can appear even if env is inextensible. + +let x = "global"; +let unscopables = {x: true}; +let env = Object.create(null); +env[Symbol.unscopables] = unscopables; +env.x = "object"; +Object.freeze(env); + +for (let i = 0; i < 1004; i++) { + if (i === 1000) + unscopables.x = false; + with (env) { + assert.sameValue(x, i < 1000 ? "global" : "object"); + } +} + diff --git a/test/staging/sm/lexical-environment/unscopables-proto.js b/test/staging/sm/lexical-environment/unscopables-proto.js new file mode 100644 index 0000000000..cb20ee0023 --- /dev/null +++ b/test/staging/sm/lexical-environment/unscopables-proto.js @@ -0,0 +1,49 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +// @@unscopables treats properties found on prototype chains the same as other +// properties. + +const x = "global x"; +const y = "global y"; + +// obj[@@unscopables].x works when obj.x is inherited via the prototype chain. +let proto = {x: "object x", y: "object y"}; +let env = Object.create(proto); +env[Symbol.unscopables] = {x: true, y: false}; +with (env) { + assert.sameValue(x, "global x"); + assert.sameValue(delete x, false); + assert.sameValue(y, "object y"); +} +assert.sameValue(env.x, "object x"); + +// @@unscopables works if is inherited via the prototype chain. +env = { + x: "object", + [Symbol.unscopables]: {x: true, y: true} +}; +for (let i = 0; i < 50; i++) + env = Object.create(env); +env.y = 1; +with (env) { + assert.sameValue(x, "global x"); + assert.sameValue(y, "global y"); +} + +// @@unscopables works if the obj[@@unscopables][id] property is inherited. +env = { + x: "object", + [Symbol.unscopables]: Object.create({x: true}) +}; +with (env) + assert.sameValue(x, "global x"); + diff --git a/test/staging/sm/lexical-environment/unscopables-proxy.js b/test/staging/sm/lexical-environment/unscopables-proxy.js new file mode 100644 index 0000000000..53b3e6c7f8 --- /dev/null +++ b/test/staging/sm/lexical-environment/unscopables-proxy.js @@ -0,0 +1,56 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [deepEqual.js, sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +// Object operations are performed in the right order, as observed by proxies. + +let log = []; +function LoggingProxyHandlerWrapper(name, handler={}) { + return new Proxy(handler, { + get(t, id) { + let method = handler[id]; + return function (...args) { + log.push([name + "." + id, ...args.filter(v => typeof v !== "object")]); + if (method === undefined) + return Reflect[id].apply(null, args); + return method.apply(this, args); + }; + } + }); +} + +function LoggingProxy(name, target) { + return new Proxy(target, new LoggingProxyHandlerWrapper(name)); +} + +let proto = {x: 44}; +let proto_proxy = new LoggingProxy("proto", proto); +let unscopables = {x: true}; +let unscopables_proxy = new LoggingProxy("unscopables", {x: true}); +let env = Object.create(proto_proxy, { + [Symbol.unscopables]: { value: unscopables_proxy } +}); +let env_proxy = new LoggingProxy("env", env); + +let x = 11; +function f() { + with (env_proxy) + return x; +} + +assert.sameValue(f(), 11); + +assert.deepEqual(log, [ + ["env.has", "x"], + ["proto.has", "x"], + ["env.get", Symbol.unscopables], + ["unscopables.get", "x"] +]); + diff --git a/test/staging/sm/lexical-environment/unscopables-tdz.js b/test/staging/sm/lexical-environment/unscopables-tdz.js new file mode 100644 index 0000000000..ba98869788 --- /dev/null +++ b/test/staging/sm/lexical-environment/unscopables-tdz.js @@ -0,0 +1,18 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +// Accessing an uninitialized variable due to @@unscopables is still a ReferenceError. + +with ({x: 1, [Symbol.unscopables]: {x: true}}) + assertThrowsInstanceOf(() => x, ReferenceError); + +let x; + diff --git a/test/staging/sm/lexical-environment/var-in-catch-body-annex-b-eval.js b/test/staging/sm/lexical-environment/var-in-catch-body-annex-b-eval.js new file mode 100644 index 0000000000..0bb1f81e86 --- /dev/null +++ b/test/staging/sm/lexical-environment/var-in-catch-body-annex-b-eval.js @@ -0,0 +1,31 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +// Tests annex B.3.5 that introduces a var via direct eval. + +var x = "global-x"; +var log = ""; + +// Tests that direct eval works. +function g() { + try { throw 8; } catch (x) { + eval("var x = 42;"); + log += x; + } + x = "g"; + log += x; +} +g(); + +assert.sameValue(x, "global-x"); +assert.sameValue(log, "42g"); + +if ("assert.sameValue" in this) diff --git a/test/staging/sm/lexical-environment/with-global-ignores-global-let-variables.js b/test/staging/sm/lexical-environment/with-global-ignores-global-let-variables.js new file mode 100644 index 0000000000..f02d8b1958 --- /dev/null +++ b/test/staging/sm/lexical-environment/with-global-ignores-global-let-variables.js @@ -0,0 +1,25 @@ +/* + * Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/licenses/publicdomain/ + */ + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +let v = "global-v"; + +function f(v, global) +{ + with (global) + return v; +} + +assert.sameValue(f("argument-v", this), "argument-v", + "let-var shouldn't appear in global for |with| purposes"); + +print("Tests complete"); diff --git a/test/staging/sm/literals/numeric/idstart-after-numeric.js b/test/staging/sm/literals/numeric/idstart-after-numeric.js new file mode 100644 index 0000000000..aad8633bd9 --- /dev/null +++ b/test/staging/sm/literals/numeric/idstart-after-numeric.js @@ -0,0 +1,23 @@ +/* + * Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/licenses/publicdomain/ + */ + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +var BUGNUMBER = '523401'; +var summary = 'numeric literal followed by an identifier'; + +var array = new Array(); +assertThrowsInstanceOf(() => eval("array[0for]"), SyntaxError); +assertThrowsInstanceOf(() => eval("array[1yield]"), SyntaxError); +assertThrowsInstanceOf(() => eval("array[2in []]"), SyntaxError); // "2 in []" is valid. +assert.sameValue(array[2 in []], undefined); +assert.sameValue(2 in [], false); +assertThrowsInstanceOf(() => eval("array[3in]"), SyntaxError); diff --git a/test/staging/sm/misc/bug1126318.js b/test/staging/sm/misc/bug1126318.js new file mode 100644 index 0000000000..646c9b54b5 --- /dev/null +++ b/test/staging/sm/misc/bug1126318.js @@ -0,0 +1,22 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +if (typeof window === "undefined") + window = this; + +Object.defineProperty(window, "foo", { + get: function() { return 5; }, + configurable: true +}); + +for (var i = 0; i < 100; ++i) + assert.sameValue(window.foo, 5); + diff --git a/test/staging/sm/misc/builtin-methods-reject-null-undefined-this.js b/test/staging/sm/misc/builtin-methods-reject-null-undefined-this.js new file mode 100644 index 0000000000..b53ae04f36 --- /dev/null +++ b/test/staging/sm/misc/builtin-methods-reject-null-undefined-this.js @@ -0,0 +1,161 @@ +/* + * Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/licenses/publicdomain/ + */ + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +//----------------------------------------------------------------------------- +var BUGNUMBER = 619283; +var summary = + "ECMAScript built-in methods that immediately throw when |this| is " + + "|undefined| or |null| (due to CheckObjectCoercible, ToObject, or ToString)"; + +print(BUGNUMBER + ": " + summary); + +/************** + * BEGIN TEST * + **************/ + +// We can't just exhaustively loop over everything because 1) method properties +// might be extensions with special |this| handling, and 2) some methods don't +// *quite* immediately throw a TypeError, first thing, if |this| is |undefined| +// or |null|, or their algorithms are very slightly ambiguous about whether they +// do. Why? Ipse-dixitism. *shrug* + +var ClassToMethodMap = + { + Object: [/* "toString" has special |this| handling */ + "toLocaleString", "valueOf", "hasOwnProperty", + /* + * "isPrototypeOf" has special |this| handling already tested in + * non262/Object/isPrototypeOf.js. + */ + /* + * "isPrototypeOf" has special |this| handling already tested in + * non262/Object/propertyIsEnumerable.js. + */ + "__defineGetter__", "__defineSetter__", + "__lookupGetter__", "__lookupSetter__", + ], + // Function methods often don't ToObject(this) as their very first step, + // and they're already stepwise well-tested such that manual tests here + // would be redundant. + Array: ["toString", "toLocaleString", "concat", "join", "pop", "push", + "reverse", "shift", "slice", "sort", "splice", "unshift", + "indexOf", "lastIndexOf", "every", "some", "forEach", "map", + "filter", "reduce", "reduceRight"], + String: ["toString", "valueOf", "charAt", "charCodeAt", "concat", + "indexOf", "lastIndexOf", "localeCompare", "match", "replace", + "search", "slice", "split", "substring", "toLowerCase", + "toLocaleLowerCase", "toUpperCase", "toLocaleUpperCase", "trim", + "bold", "italics", "fixed", "fontsize", + "fontcolor", "link", "anchor", "strike", "small", "big", "blink", + "sup", "sub", "substr", "trimLeft", "trimRight", + ], + Boolean: ["toString", "valueOf"], + Number: ["toString", "toLocaleString", "valueOf", + /* + * toFixed doesn't *immediately* test |this| for number or + * Number-ness, but because the ToInteger(void 0) which arguably + * precedes it in the toFixed algorithm won't throw in this test, + * we don't need to specially test it. + */ + "toFixed", + "toExponential", "toPrecision"], + Date: ["toDateString", "toTimeString", "toLocaleString", + "toLocaleDateString", "toLocaleTimeString", "valueOf", "getTime", + "getFullYear", "getUTCFullYear", "getMonth", "getUTCMonth", + "getDate", "getUTCDate", "getDay", "getUTCDay", "getHours", + "getUTCHours", "getMinutes", "getUTCMinutes", "getSeconds", + "getUTCSeconds", "getMilliseconds", "getUTCMilliseconds", + /* + * toFixed doesn't *immediately* test |this| for number or + * Number-ness, but because the TimeClip(ToNumber(void 0)) which + * arguably precedes it in the setTime algorithm won't throw in + * this test, we don't need to specially test it. + */ + "setTime", + "getTimezoneOffset", "setMilliseconds", "setUTCMilliseconds", + "setSeconds", "setUTCSeconds", "setMinutes", "setUTCMinutes", + "setHours", "setUTCHours", "setDate", "setUTCDate", "setMonth", + "setUTCMonth", "setFullYear", "setUTCFullYear", "toUTCString", + "toISOString", "toJSON", + "getYear", "setYear", "toGMTString"], + RegExp: ["exec", "test", "toString"], + Error: ["toString"], + }; + +var badThisValues = [null, undefined]; + +function testMethod(Class, className, method) +{ + var expr; + + // Try out explicit this values + for (var i = 0, sz = badThisValues.length; i < sz; i++) + { + var badThis = badThisValues[i]; + + expr = className + ".prototype." + method + ".call(" + badThis + ")"; + try + { + Class.prototype[method].call(badThis); + throw new Error(expr + " didn't throw a TypeError"); + } + catch (e) + { + assert.sameValue(e instanceof TypeError, true, + "wrong error for " + expr + ", instead threw " + e); + } + + expr = className + ".prototype." + method + ".apply(" + badThis + ")"; + try + { + Class.prototype[method].apply(badThis); + throw new Error(expr + " didn't throw a TypeError"); + } + catch (e) + { + assert.sameValue(e instanceof TypeError, true, + "wrong error for " + expr + ", instead threw " + e); + } + } + + // ..and for good measure.. + + expr = "(0, " + className + ".prototype." + method + ")()" + try + { + // comma operator to call GetValue() on the method and de-Reference it + (0, Class.prototype[method])(); + throw new Error(expr + " didn't throw a TypeError"); + } + catch (e) + { + assert.sameValue(e instanceof TypeError, true, + "wrong error for " + expr + ", instead threw " + e); + } +} + +for (var className in ClassToMethodMap) +{ + var Class = this[className]; + + var methodNames = ClassToMethodMap[className]; + for (var i = 0, sz = methodNames.length; i < sz; i++) + { + var method = methodNames[i]; + testMethod(Class, className, method); + } +} + +/******************************************************************************/ + +print("All tests passed!"); diff --git a/test/staging/sm/misc/enumerate-undefined.js b/test/staging/sm/misc/enumerate-undefined.js new file mode 100644 index 0000000000..0b1707a45b --- /dev/null +++ b/test/staging/sm/misc/enumerate-undefined.js @@ -0,0 +1,30 @@ +/* + * Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/licenses/publicdomain/ + */ + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +//----------------------------------------------------------------------------- +var BUGNUMBER = 547087; +var summary = 'JS_EnumerateStandardClasses uses wrong attributes for undefined'; + +print(BUGNUMBER + ": " + summary); + +/************** + * BEGIN TEST * + **************/ + +for (var p in this); + +assert.sameValue(Object.getOwnPropertyDescriptor(this, "undefined").writable, false); + +/******************************************************************************/ + +print("All tests passed!"); diff --git a/test/staging/sm/misc/error-undefined-message.js b/test/staging/sm/misc/error-undefined-message.js new file mode 100644 index 0000000000..69fed824a4 --- /dev/null +++ b/test/staging/sm/misc/error-undefined-message.js @@ -0,0 +1,16 @@ +/* + * Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/licenses/publicdomain/ + */ + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +assert.sameValue(new Error().hasOwnProperty('message'), false); +assert.sameValue(new Error(undefined).hasOwnProperty('message'), false); + diff --git a/test/staging/sm/misc/explicit-undefined-optional-argument.js b/test/staging/sm/misc/explicit-undefined-optional-argument.js new file mode 100644 index 0000000000..991d7539df --- /dev/null +++ b/test/staging/sm/misc/explicit-undefined-optional-argument.js @@ -0,0 +1,43 @@ +/* + * Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/licenses/publicdomain/ + */ + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +var BUGNUMBER = 373118; +var summary = + 'Properly handle explicitly-undefined optional arguments to a bunch of ' + + 'functions'; + +print(BUGNUMBER + ": " + summary); + +//----------------------------------------------------------------------------- + +var a; + +a = "abc".slice(0, undefined); +assert.sameValue(a, "abc"); + +a = "abc".substr(0, undefined); +assert.sameValue(a, "abc"); + +a = "abc".substring(0, undefined); +assert.sameValue(a, "abc"); + +a = [1, 2, 3].slice(0, undefined); +assert.sameValue(a.join(), '1,2,3'); + +a = [1, 2, 3].sort(undefined); +assert.sameValue(a.join(), '1,2,3'); + +assert.sameValue((20).toString(undefined), '20'); + +//----------------------------------------------------------------------------- + diff --git a/test/staging/sm/misc/function-definition-eval.js b/test/staging/sm/misc/function-definition-eval.js new file mode 100644 index 0000000000..0d48c65dbf --- /dev/null +++ b/test/staging/sm/misc/function-definition-eval.js @@ -0,0 +1,353 @@ +/* + * Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/licenses/publicdomain/ + */ + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +//----------------------------------------------------------------------------- +var BUGNUMBER = 577325; +var summary = 'Implement the ES5 algorithm for processing function statements'; + +print(BUGNUMBER + ": " + summary); + +/************** + * BEGIN TEST * + **************/ + +var outer, desc; +var isInShell = !("Window" in this); + +/////////////////////////////////////////////////// +// Function definitions over accessor properties // +/////////////////////////////////////////////////// + +var getCalled, setCalled; + +// configurable properties get blown away + +getCalled = false, setCalled = false; +Object.defineProperty(this, "acc1", + { + get: function() { getCalled = true; throw "FAIL get 1"; }, + set: function(v) { setCalled = true; throw "FAIL set 1 " + v; }, + configurable: true, + enumerable: false + }); + +// does not throw +outer = undefined; +eval("function acc1() { throw 'FAIL redefined 1'; } outer = acc1;"); +assert.sameValue(getCalled, false); +assert.sameValue(setCalled, false); +assert.sameValue(typeof acc1, "function"); +assert.sameValue(acc1, outer); +desc = Object.getOwnPropertyDescriptor(this, "acc1"); +assert.sameValue(desc.value, acc1); +assert.sameValue(desc.writable, true); +assert.sameValue(desc.enumerable, true); +assert.sameValue(desc.configurable, true); + + +getCalled = false, setCalled = false; +Object.defineProperty(this, "acc2", + { + get: function() { getCalled = true; throw "FAIL get 2"; }, + set: function(v) { setCalled = true; throw "FAIL set 2 " + v; }, + configurable: true, + enumerable: true + }); + +// does not throw +outer = undefined; +eval("function acc2() { throw 'FAIL redefined 2'; } outer = acc2;"); +assert.sameValue(getCalled, false); +assert.sameValue(setCalled, false); +assert.sameValue(typeof acc2, "function"); +assert.sameValue(acc2, outer); +desc = Object.getOwnPropertyDescriptor(this, "acc2"); +assert.sameValue(desc.value, acc2); +assert.sameValue(desc.writable, true); +assert.sameValue(desc.enumerable, true); +assert.sameValue(desc.configurable, true); + + +// non-configurable properties produce a TypeError. We only test this in shell, +// since defining non-configurable properties on Window instances throws. +if (isInShell) { + getCalled = false, setCalled = false; + Object.defineProperty(this, "acc3", + { + get: function() { getCalled = true; throw "FAIL get 3"; }, + set: function(v) { setCalled = true; throw "FAIL set 3 " + v; }, + configurable: false, + enumerable: true + }); + + outer = undefined; + try + { + eval("function acc3() { throw 'FAIL redefined 3'; }; outer = acc3"); + throw new Error("should have thrown trying to redefine global function " + + "over a non-configurable, enumerable accessor"); + } + catch (e) + { + assert.sameValue(e instanceof TypeError, true, + "global function definition, when that function would overwrite " + + "a non-configurable, enumerable accessor, must throw a TypeError " + + "per ES5+errata: " + e); + desc = Object.getOwnPropertyDescriptor(this, "acc3"); + assert.sameValue(typeof desc.get, "function"); + assert.sameValue(typeof desc.set, "function"); + assert.sameValue(desc.enumerable, true); + assert.sameValue(desc.configurable, false); + assert.sameValue(outer, undefined); + assert.sameValue(getCalled, false); + assert.sameValue(setCalled, false); + } + + + getCalled = false, setCalled = false; + Object.defineProperty(this, "acc4", + { + get: function() { getCalled = true; throw "FAIL get 4"; }, + set: function(v) { setCalled = true; throw "FAIL set 4 " + v; }, + configurable: false, + enumerable: false + }); + + outer = undefined; + try + { + eval("function acc4() { throw 'FAIL redefined 4'; }; outer = acc4"); + throw new Error("should have thrown trying to redefine global function " + + "over a non-configurable, non-enumerable accessor"); + } + catch (e) + { + assert.sameValue(e instanceof TypeError, true, + "global function definition, when that function would overwrite " + + "a non-configurable, non-enumerable accessor, must throw a " + + "TypeError per ES5+errata: " + e); + desc = Object.getOwnPropertyDescriptor(this, "acc4"); + assert.sameValue(typeof desc.get, "function"); + assert.sameValue(typeof desc.set, "function"); + assert.sameValue(desc.enumerable, false); + assert.sameValue(desc.configurable, false); + assert.sameValue(outer, undefined); + assert.sameValue(getCalled, false); + assert.sameValue(setCalled, false); + } +} + + +/////////////////////////////////////////////// +// Function definitions over data properties // +/////////////////////////////////////////////// + + +// configurable properties, regardless of other attributes, get blown away + +Object.defineProperty(this, "data1", + { + configurable: true, + enumerable: true, + writable: true, + value: "data1" + }); + +outer = undefined; +eval("function data1() { return 'data1 function'; } outer = data1;"); +assert.sameValue(typeof data1, "function"); +assert.sameValue(data1, outer); +desc = Object.getOwnPropertyDescriptor(this, "data1"); +assert.sameValue(desc.configurable, true); +assert.sameValue(desc.enumerable, true); +assert.sameValue(desc.writable, true); +assert.sameValue(desc.value, data1); + + +Object.defineProperty(this, "data2", + { + configurable: true, + enumerable: true, + writable: false, + value: "data2" + }); + +outer = undefined; +eval("function data2() { return 'data2 function'; } outer = data2;"); +assert.sameValue(typeof data2, "function"); +assert.sameValue(data2, outer); +desc = Object.getOwnPropertyDescriptor(this, "data2"); +assert.sameValue(desc.configurable, true); +assert.sameValue(desc.enumerable, true); +assert.sameValue(desc.writable, true); +assert.sameValue(desc.value, data2); + + +Object.defineProperty(this, "data3", + { + configurable: true, + enumerable: false, + writable: true, + value: "data3" + }); + +outer = undefined; +eval("function data3() { return 'data3 function'; } outer = data3;"); +assert.sameValue(typeof data3, "function"); +assert.sameValue(data3, outer); +desc = Object.getOwnPropertyDescriptor(this, "data3"); +assert.sameValue(desc.configurable, true); +assert.sameValue(desc.enumerable, true); +assert.sameValue(desc.writable, true); +assert.sameValue(desc.value, data3); + + +Object.defineProperty(this, "data4", + { + configurable: true, + enumerable: false, + writable: false, + value: "data4" + }); + +outer = undefined; +eval("function data4() { return 'data4 function'; } outer = data4;"); +assert.sameValue(typeof data4, "function"); +assert.sameValue(data4, outer); +desc = Object.getOwnPropertyDescriptor(this, "data4"); +assert.sameValue(desc.value, data4); +assert.sameValue(desc.writable, true); +assert.sameValue(desc.enumerable, true); +assert.sameValue(desc.configurable, true); + + +// non-configurable data properties are trickier. Again, we test these only in shell. + +if (isInShell) { + Object.defineProperty(this, "data5", + { + configurable: false, + enumerable: true, + writable: true, + value: "data5" + }); + + outer = undefined; + eval("function data5() { return 'data5 function'; } outer = data5;"); + assert.sameValue(typeof data5, "function"); + assert.sameValue(data5, outer); + desc = Object.getOwnPropertyDescriptor(this, "data5"); + assert.sameValue(desc.configurable, false); + assert.sameValue(desc.enumerable, true); + assert.sameValue(desc.writable, true); + assert.sameValue(desc.value, data5); + + + Object.defineProperty(this, "data6", + { + configurable: false, + enumerable: true, + writable: false, + value: "data6" + }); + + outer = undefined; + try + { + eval("function data6() { return 'data6 function'; } outer = data6;"); + throw new Error("should have thrown trying to redefine global function " + + "over a non-configurable, enumerable, non-writable accessor"); + } + catch (e) + { + assert.sameValue(e instanceof TypeError, true, + "global function definition, when that function would overwrite " + + "a non-configurable, enumerable, non-writable data property, must " + + "throw a TypeError per ES5+errata: " + e); + assert.sameValue(data6, "data6"); + assert.sameValue(outer, undefined); + desc = Object.getOwnPropertyDescriptor(this, "data6"); + assert.sameValue(desc.configurable, false); + assert.sameValue(desc.enumerable, true); + assert.sameValue(desc.writable, false); + assert.sameValue(desc.value, "data6"); + } + + + Object.defineProperty(this, "data7", + { + configurable: false, + enumerable: false, + writable: true, + value: "data7" + }); + + outer = undefined; + try + { + eval("function data7() { return 'data7 function'; } outer = data7;"); + throw new Error("should have thrown trying to redefine global function " + + "over a non-configurable, non-enumerable, writable data" + + "property"); + } + catch (e) + { + assert.sameValue(e instanceof TypeError, true, + "global function definition, when that function would overwrite " + + "a non-configurable, non-enumerable, writable data property, must " + + "throw a TypeError per ES5+errata: " + e); + assert.sameValue(data7, "data7"); + assert.sameValue(outer, undefined); + desc = Object.getOwnPropertyDescriptor(this, "data7"); + assert.sameValue(desc.configurable, false); + assert.sameValue(desc.enumerable, false); + assert.sameValue(desc.writable, true); + assert.sameValue(desc.value, "data7"); + } + + + Object.defineProperty(this, "data8", + { + configurable: false, + enumerable: false, + writable: false, + value: "data8" + }); + + outer = undefined; + try + { + eval("function data8() { return 'data8 function'; } outer = data8;"); + throw new Error("should have thrown trying to redefine global function " + + "over a non-configurable, non-enumerable, non-writable data" + + "property"); + } + catch (e) + { + assert.sameValue(e instanceof TypeError, true, + "global function definition, when that function would overwrite " + + "a non-configurable, non-enumerable, non-writable data property, " + + "must throw a TypeError per ES5+errata: " + e); + assert.sameValue(data8, "data8"); + assert.sameValue(outer, undefined); + desc = Object.getOwnPropertyDescriptor(this, "data8"); + assert.sameValue(desc.configurable, false); + assert.sameValue(desc.enumerable, false); + assert.sameValue(desc.writable, false); + assert.sameValue(desc.value, "data8"); + } +} + +/******************************************************************************/ + +print("All tests passed!"); diff --git a/test/staging/sm/misc/future-reserved-words.js b/test/staging/sm/misc/future-reserved-words.js new file mode 100644 index 0000000000..a17ae7248e --- /dev/null +++ b/test/staging/sm/misc/future-reserved-words.js @@ -0,0 +1,498 @@ +/* + * Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/licenses/publicdomain/ + */ + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +//----------------------------------------------------------------------------- +var BUGNUMBER = 497869; +var summary = "Implement FutureReservedWords per-spec"; + +print(BUGNUMBER + ": " + summary); + +/************** + * BEGIN TEST * + **************/ + +var futureReservedWords = + [ + "class", + // "const", // Mozilla extension enabled even for versionless code + "enum", + "export", + "extends", + "import", + "super", + ]; + +var strictFutureReservedWords = + [ + "implements", + "interface", + "let", // enabled: this file doesn't execute as JS1.7 + "package", + "private", + "protected", + "public", + "static", + "yield", // enabled: this file doesn't execute as JS1.7 + ]; + +function testWord(word, expectNormal, expectStrict) +{ + var actual, status; + + // USE AS LHS FOR ASSIGNMENT + + actual = ""; + status = summary + ": " + word + ": normal assignment"; + try + { + eval(word + " = 'foo';"); + actual = "no error"; + } + catch(e) + { + actual = e.name; + status += ", " + e.name + ": " + e.message + " "; + } + assert.sameValue(actual, expectNormal, status); + + actual = ""; + status = summary + ": " + word + ": strict assignment"; + try + { + eval("'use strict'; " + word + " = 'foo';"); + actual = "no error"; + } + catch(e) + { + actual = e.name; + status += ", " + e.name + ": " + e.message + " "; + } + assert.sameValue(actual, expectStrict, status); + + // USE AS DESTRUCTURING SHORTHAND + + actual = ""; + status = summary + ": " + word + ": destructuring shorthand"; + try + { + eval("({ " + word + " } = 'foo');"); + actual = "no error"; + } + catch(e) + { + actual = e.name; + status += ", " + e.name + ": " + e.message + " "; + } + assert.sameValue(actual, expectNormal, status); + + actual = ""; + status = summary + ": " + word + ": strict destructuring shorthand"; + try + { + eval("'use strict'; ({ " + word + " } = 'foo');"); + actual = "no error"; + } + catch(e) + { + actual = e.name; + status += ", " + e.name + ": " + e.message + " "; + } + assert.sameValue(actual, expectStrict, status); + + // USE IN VARIABLE DECLARATION + + actual = ""; + status = summary + ": " + word + ": normal var"; + try + { + eval("var " + word + ";"); + actual = "no error"; + } + catch (e) + { + actual = e.name; + status += ", " + e.name + ": " + e.message + " "; + } + assert.sameValue(actual, expectNormal, status); + + actual = ""; + status = summary + ": " + word + ": strict var"; + try + { + eval("'use strict'; var " + word + ";"); + actual = "no error"; + } + catch (e) + { + actual = e.name; + status += ", " + e.name + ": " + e.message + " "; + } + assert.sameValue(actual, expectStrict, status); + + // USE IN FOR-IN VARIABLE DECLARATION + + actual = ""; + status = summary + ": " + word + ": normal for-in var"; + try + { + eval("for (var " + word + " in {});"); + actual = "no error"; + } + catch (e) + { + actual = e.name; + status += ", " + e.name + ": " + e.message + " "; + } + assert.sameValue(actual, expectNormal, status); + + actual = ""; + status = summary + ": " + word + ": strict for-in var"; + try + { + eval("'use strict'; for (var " + word + " in {});"); + actual = "no error"; + } + catch (e) + { + actual = e.name; + status += ", " + e.name + ": " + e.message + " "; + } + assert.sameValue(actual, expectStrict, status); + + // USE AS CATCH IDENTIFIER + + actual = ""; + status = summary + ": " + word + ": normal var"; + try + { + eval("try { } catch (" + word + ") { }"); + actual = "no error"; + } + catch (e) + { + actual = e.name; + status += ", " + e.name + ": " + e.message + " "; + } + assert.sameValue(actual, expectNormal, status); + + actual = ""; + status = summary + ": " + word + ": strict var"; + try + { + eval("'use strict'; try { } catch (" + word + ") { }"); + actual = "no error"; + } + catch (e) + { + actual = e.name; + status += ", " + e.name + ": " + e.message + " "; + } + assert.sameValue(actual, expectStrict, status); + + // USE AS LABEL + + actual = ""; + status = summary + ": " + word + ": normal label"; + try + { + eval(word + ": while (false);"); + actual = "no error"; + } + catch (e) + { + actual = e.name; + status += ", " + e.name + ": " + e.message + " "; + } + assert.sameValue(actual, expectNormal, status); + + actual = ""; + status = summary + ": " + word + ": strict label"; + try + { + eval("'use strict'; " + word + ": while (false);"); + actual = "no error"; + } + catch (e) + { + actual = e.name; + status += ", " + e.name + ": " + e.message + " "; + } + assert.sameValue(actual, expectStrict, status); + + // USE AS ARGUMENT NAME IN FUNCTION DECLARATION + + actual = ""; + status = summary + ": " + word + ": normal function argument"; + try + { + eval("function foo(" + word + ") { }"); + actual = "no error"; + } + catch (e) + { + actual = e.name; + status += ", " + e.name + ": " + e.message + " "; + } + assert.sameValue(actual, expectNormal, status); + + actual = ""; + status = summary + ": " + word + ": strict function argument"; + try + { + eval("'use strict'; function foo(" + word + ") { }"); + actual = "no error"; + } + catch (e) + { + actual = e.name; + status += ", " + e.name + ": " + e.message + " "; + } + assert.sameValue(actual, expectStrict, status); + + actual = ""; + status = summary + ": " + word + ": function argument retroactively strict"; + try + { + eval("function foo(" + word + ") { 'use strict'; }"); + actual = "no error"; + } + catch (e) + { + actual = e.name; + status += ", " + e.name + ": " + e.message + " "; + } + assert.sameValue(actual, expectStrict, status); + + // USE AS ARGUMENT NAME IN FUNCTION EXPRESSION + + actual = ""; + status = summary + ": " + word + ": normal function expression argument"; + try + { + eval("var s = (function foo(" + word + ") { });"); + actual = "no error"; + } + catch (e) + { + actual = e.name; + status += ", " + e.name + ": " + e.message + " "; + } + assert.sameValue(actual, expectNormal, status); + + actual = ""; + status = summary + ": " + word + ": strict function expression argument"; + try + { + eval("'use strict'; var s = (function foo(" + word + ") { });"); + actual = "no error"; + } + catch (e) + { + actual = e.name; + status += ", " + e.name + ": " + e.message + " "; + } + assert.sameValue(actual, expectStrict, status); + + actual = ""; + status = summary + ": " + word + ": function expression argument retroactively strict"; + try + { + eval("var s = (function foo(" + word + ") { 'use strict'; });"); + actual = "no error"; + } + catch (e) + { + actual = e.name; + status += ", " + e.name + ": " + e.message + " "; + } + assert.sameValue(actual, expectStrict, status); + + // USE AS ARGUMENT NAME WITH FUNCTION CONSTRUCTOR + + actual = ""; + status = summary + ": " + word + ": argument with normal Function"; + try + { + Function(word, "return 17"); + actual = "no error"; + } + catch (e) + { + actual = e.name; + status += ", " + e.name + ": " + e.message + " "; + } + assert.sameValue(actual, expectNormal, status); + + actual = ""; + status = summary + ": " + word + ": argument with strict Function"; + try + { + Function(word, "'use strict'; return 17"); + actual = "no error"; + } + catch (e) + { + actual = e.name; + status += ", " + e.name + ": " + e.message + " "; + } + assert.sameValue(actual, expectStrict, status); + + // USE AS ARGUMENT NAME IN PROPERTY SETTER + + actual = ""; + status = summary + ": " + word + ": normal property setter argument"; + try + { + eval("var o = { set x(" + word + ") { } };"); + actual = "no error"; + } + catch (e) + { + actual = e.name; + status += ", " + e.name + ": " + e.message + " "; + } + assert.sameValue(actual, expectNormal, status); + + actual = ""; + status = summary + ": " + word + ": strict property setter argument"; + try + { + eval("'use strict'; var o = { set x(" + word + ") { } };"); + actual = "no error"; + } + catch (e) + { + actual = e.name; + status += ", " + e.name + ": " + e.message + " "; + } + assert.sameValue(actual, expectStrict, status); + + actual = ""; + status = summary + ": " + word + ": property setter argument retroactively strict"; + try + { + eval("var o = { set x(" + word + ") { 'use strict'; } };"); + actual = "no error"; + } + catch (e) + { + actual = e.name; + status += ", " + e.name + ": " + e.message + " "; + } + assert.sameValue(actual, expectStrict, status); + + // USE AS FUNCTION NAME IN FUNCTION DECLARATION + + actual = ""; + status = summary + ": " + word + ": normal function name"; + try + { + eval("function " + word + "() { }"); + actual = "no error"; + } + catch (e) + { + actual = e.name; + status += ", " + e.name + ": " + e.message + " "; + } + assert.sameValue(actual, expectNormal, status); + + actual = ""; + status = summary + ": " + word + ": strict function name"; + try + { + eval("'use strict'; function " + word + "() { }"); + actual = "no error"; + } + catch (e) + { + actual = e.name; + status += ", " + e.name + ": " + e.message + " "; + } + assert.sameValue(actual, expectStrict, status); + + actual = ""; + status = summary + ": " + word + ": function name retroactively strict"; + try + { + eval("function " + word + "() { 'use strict'; }"); + actual = "no error"; + } + catch (e) + { + actual = e.name; + status += ", " + e.name + ": " + e.message + " "; + } + assert.sameValue(actual, expectStrict, status); + + // USE AS FUNCTION NAME IN FUNCTION EXPRESSION + + actual = ""; + status = summary + ": " + word + ": normal function expression name"; + try + { + eval("var s = (function " + word + "() { });"); + actual = "no error"; + } + catch (e) + { + actual = e.name; + status += ", " + e.name + ": " + e.message + " "; + } + assert.sameValue(actual, expectNormal, status); + + actual = ""; + status = summary + ": " + word + ": strict function expression name"; + try + { + eval("'use strict'; var s = (function " + word + "() { });"); + actual = "no error"; + } + catch (e) + { + actual = e.name; + status += ", " + e.name + ": " + e.message + " "; + } + assert.sameValue(actual, expectStrict, status); + + actual = ""; + status = summary + ": " + word + ": function expression name retroactively strict"; + try + { + eval("var s = (function " + word + "() { 'use strict'; });"); + actual = "no error"; + } + catch (e) + { + actual = e.name; + status += ", " + e.name + ": " + e.message + " "; + } + assert.sameValue(actual, expectStrict, status); +} + +function testFutureReservedWord(word) +{ + testWord(word, "SyntaxError", "SyntaxError"); +} + +function testStrictFutureReservedWord(word) +{ + testWord(word, "no error", "SyntaxError"); +} + +futureReservedWords.forEach(testFutureReservedWord); +strictFutureReservedWords.forEach(testStrictFutureReservedWord); + +/******************************************************************************/ + +print("All tests passed!"); diff --git a/test/staging/sm/misc/getter-setter-outerize-this.js b/test/staging/sm/misc/getter-setter-outerize-this.js new file mode 100644 index 0000000000..fc76cfa2e9 --- /dev/null +++ b/test/staging/sm/misc/getter-setter-outerize-this.js @@ -0,0 +1,31 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +if (typeof window === "undefined") { + // This test is meant to run in the browser, but it's easy to + // run it in the shell as well, even though it has no inner/outer + // windows. + window = this; +} + +var res = false; +Object.defineProperty(this, "foo", {configurable: true, + get: function() { return this === window; }, + set: function(v) { res = this === window; }}); + +(function() { + for (var i = 0; i < 3000; ++i) { + window.foo = i; + assert.sameValue(res, true, "setter"); + assert.sameValue(window.foo, true, "getter"); + } +})(); + diff --git a/test/staging/sm/misc/global-numeric-properties.js b/test/staging/sm/misc/global-numeric-properties.js new file mode 100644 index 0000000000..5d860c2d6d --- /dev/null +++ b/test/staging/sm/misc/global-numeric-properties.js @@ -0,0 +1,65 @@ +/* + * Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/licenses/publicdomain/ + */ + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +//----------------------------------------------------------------------------- +var BUGNUMBER = 537863; +var summary = + 'undefined, Infinity, and NaN global properties should not be writable'; + +print(BUGNUMBER + ": " + summary); + +/************** + * BEGIN TEST * + **************/ + +var desc, old, error; +var global = this; + +var names = ["NaN", "Infinity", "undefined"]; + +for (var i = 0; i < names.length; i++) +{ + var name = names[i]; + desc = Object.getOwnPropertyDescriptor(global, name); + assert.sameValue(desc !== undefined, true, name + " should be present"); + assert.sameValue(desc.enumerable, false, name + " should not be enumerable"); + assert.sameValue(desc.configurable, false, name + " should not be configurable"); + assert.sameValue(desc.writable, false, name + " should not be writable"); + + old = global[name]; + global[name] = 17; + assert.sameValue(global[name], old, name + " changed on setting?"); + + error = "before"; + try + { + throw new TypeError("SpiderMonkey doesn't currently implement " + + "strict-mode throwing when setting a readonly " + + "property, not running this bit of test for now; " + + "see bug 537873"); + + (function() { "use strict"; global[name] = 42; error = "didn't throw"; })(); + } + catch (e) + { + if (e instanceof TypeError) + error = "typeerror"; + else + error = "bad exception: " + e; + } + assert.sameValue(error, "typeerror", "wrong strict mode error setting " + name); +} + +/******************************************************************************/ + +print("All tests passed!"); diff --git a/test/staging/sm/misc/line-paragraph-separator-parse-as-lineterminator.js b/test/staging/sm/misc/line-paragraph-separator-parse-as-lineterminator.js new file mode 100644 index 0000000000..8edddbaa0b --- /dev/null +++ b/test/staging/sm/misc/line-paragraph-separator-parse-as-lineterminator.js @@ -0,0 +1,57 @@ +/* + * Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/licenses/publicdomain/ + */ + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +//----------------------------------------------------------------------------- +var BUGNUMBER = 663331; +var summary = + "U+2028 LINE SEPARATOR and U+2029 PARAGRAPH SEPARATOR must match the " + + "LineTerminator production when parsing code"; + +print(BUGNUMBER + ": " + summary); + +/************** + * BEGIN TEST * + **************/ + +var hidden = 17; +var assigned; + +assigned = 42; +assert.sameValue(eval('"use strict"; var hidden\u2028assigned = 5; typeof hidden'), + "undefined"); +assert.sameValue(assigned, 5); + +assigned = 42; +function t1() +{ + assert.sameValue(eval('var hidden\u2028assigned = 5; typeof hidden'), "undefined"); + assert.sameValue(assigned, 5); +} +t1(); + +assigned = 42; +assert.sameValue(eval('"use strict"; var hidden\u2029assigned = 5; typeof hidden'), + "undefined"); +assert.sameValue(assigned, 5); + +assigned = 42; +function t2() +{ + assert.sameValue(eval('var hidden\u2029assigned = 5; typeof hidden'), "undefined"); + assert.sameValue(assigned, 5); +} +t2(); + +/******************************************************************************/ + +print("All tests passed!"); diff --git a/test/staging/sm/misc/new-with-non-constructor.js b/test/staging/sm/misc/new-with-non-constructor.js new file mode 100644 index 0000000000..e8f2b5e34e --- /dev/null +++ b/test/staging/sm/misc/new-with-non-constructor.js @@ -0,0 +1,38 @@ +/* + * Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/licenses/publicdomain/ + */ + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +function checkConstruct(thing) { + try { + new thing(); + assert.sameValue(0, 1, "not reached " + thing); + } catch (e) { + assert.sameValue(e.message.includes(" is not a constructor") || + e.message === "Function.prototype.toString called on incompatible object", true); + } +} + +var re = /aaa/ +checkConstruct(re); + +var boundFunctionPrototype = Function.prototype.bind(); +checkConstruct(boundFunctionPrototype); + +var boundBuiltin = Math.sin.bind(); +checkConstruct(boundBuiltin); + +var proxiedFunctionPrototype = new Proxy(Function.prototype, {}); +checkConstruct(proxiedFunctionPrototype); + +var proxiedBuiltin = new Proxy(parseInt, {}); +checkConstruct(proxiedBuiltin); + diff --git a/test/staging/sm/misc/redeclare-var-non-writable-property.js b/test/staging/sm/misc/redeclare-var-non-writable-property.js new file mode 100644 index 0000000000..7214924fe5 --- /dev/null +++ b/test/staging/sm/misc/redeclare-var-non-writable-property.js @@ -0,0 +1,30 @@ +/* + * Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/licenses/publicdomain/ + */ + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +//----------------------------------------------------------------------------- +var BUGNUMBER = 539488; +var summary = + '|var| statements for existing, read-only/permanent properties should not ' + + 'be errors'; + +print(BUGNUMBER + ": " + summary); + +/************** + * BEGIN TEST * + **************/ + +var undefined; + +/******************************************************************************/ + +print("All tests passed!"); diff --git a/test/staging/sm/misc/regexp-functions-with-undefined.js b/test/staging/sm/misc/regexp-functions-with-undefined.js new file mode 100644 index 0000000000..61bdd5a8e4 --- /dev/null +++ b/test/staging/sm/misc/regexp-functions-with-undefined.js @@ -0,0 +1,49 @@ +/* + * Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/licenses/publicdomain/ + */ + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +var a = /undefined/.exec(); +assert.sameValue(a[0], 'undefined'); +assert.sameValue(a.length, 1); + +a = /undefined/.exec(undefined); +assert.sameValue(a[0], 'undefined'); +assert.sameValue(a.length, 1); + +assert.sameValue(/undefined/.test(), true); +assert.sameValue(/undefined/.test(undefined), true); + +assert.sameValue(/aaaa/.exec(), null); +assert.sameValue(/aaaa/.exec(undefined), null); + +assert.sameValue(/aaaa/.test(), false); +assert.sameValue(/aaaa/.test(undefined), false); + + +assert.sameValue("undefined".search(), 0); +assert.sameValue("undefined".search(undefined), 0); +assert.sameValue("aaaa".search(), 0); +assert.sameValue("aaaa".search(undefined), 0); + +a = "undefined".match(); +assert.sameValue(a[0], ""); +assert.sameValue(a.length, 1); +a = "undefined".match(undefined); +assert.sameValue(a[0], ""); +assert.sameValue(a.length, 1); +a = "aaaa".match(); +assert.sameValue(a[0], ""); +assert.sameValue(a.length, 1); +a = "aaaa".match(undefined); +assert.sameValue(a[0], ""); +assert.sameValue(a.length, 1); + diff --git a/test/staging/sm/misc/syntax-error-end-of-for-head-part.js b/test/staging/sm/misc/syntax-error-end-of-for-head-part.js new file mode 100644 index 0000000000..b7ed3b0dc3 --- /dev/null +++ b/test/staging/sm/misc/syntax-error-end-of-for-head-part.js @@ -0,0 +1,57 @@ +/* + * Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/licenses/publicdomain/ + */ + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +//----------------------------------------------------------------------------- +var BUGNUMBER = 672854; +var summary = + "Syntax errors at the end of |for| statement header parts shouldn't cause " + + "crashes"; + +print(BUGNUMBER + ": " + summary); + +/************** + * BEGIN TEST * + **************/ + +function checkSyntaxError(str) +{ + try + { + var f = Function("for(w in\\"); + throw new Error("didn't throw, returned " + f); + } + catch (e) + { + assert.sameValue(e instanceof SyntaxError, true, + "expected SyntaxError, got " + e); + } +} + +checkSyntaxError("for(var w in \\"); +checkSyntaxError("for(w in \\"); +checkSyntaxError("for(var w\\"); +checkSyntaxError("for(w\\"); +checkSyntaxError("for(var w;\\"); +checkSyntaxError("for(w;\\"); +checkSyntaxError("for(var w; w >\\"); +checkSyntaxError("for(w; w >\\"); +checkSyntaxError("for(var w; w > 3;\\"); +checkSyntaxError("for(w; w > 3;\\"); +checkSyntaxError("for(var w; w > 3; 5\\"); +checkSyntaxError("for(w; w > 3; 5\\"); +checkSyntaxError("for(var w; w > 3; 5foo"); +checkSyntaxError("for(w; w > 3; 5foo"); + +/******************************************************************************/ + +print("Tests complete!"); diff --git a/test/staging/sm/misc/unicode-escaped-keyword.js b/test/staging/sm/misc/unicode-escaped-keyword.js new file mode 100644 index 0000000000..7c52e38215 --- /dev/null +++ b/test/staging/sm/misc/unicode-escaped-keyword.js @@ -0,0 +1,28 @@ +/* + * Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/licenses/publicdomain/ + */ + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +function throws(code) { + var type; + try { + eval(code); + } catch (ex) { + type = ex.name; + } + assert.sameValue(type, 'SyntaxError'); +} + +var s = '\\u0073'; +throws('var thi' + s); +throws('switch (' + s + 'witch) {}') +throws('var ' + s + 'witch'); + diff --git a/test/staging/sm/misc/unicode-identifier-1d17.js b/test/staging/sm/misc/unicode-identifier-1d17.js new file mode 100644 index 0000000000..ef1770de05 --- /dev/null +++ b/test/staging/sm/misc/unicode-identifier-1d17.js @@ -0,0 +1,22 @@ +/* + * Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/licenses/publicdomain/ + */ + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +var o = {} +try { + eval('o.\\u1d17 = 42;'); +} +catch (e) { + assert.sameValue('should not fail', true); +} +assert.sameValue(o['\u1d17'], 42); + diff --git a/test/staging/sm/misc/unicode-identifier-82f1.js b/test/staging/sm/misc/unicode-identifier-82f1.js new file mode 100644 index 0000000000..6a17744ec0 --- /dev/null +++ b/test/staging/sm/misc/unicode-identifier-82f1.js @@ -0,0 +1,22 @@ +/* + * Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/licenses/publicdomain/ + */ + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +var o = {} +try { + eval('o.\\u82f1 = 42;'); +} +catch (e) { + assert.sameValue('should not fail', true); +} +assert.sameValue(o['\u82f1'], 42); + diff --git a/test/staging/sm/misc/unwrapped-no-such-method.js b/test/staging/sm/misc/unwrapped-no-such-method.js new file mode 100644 index 0000000000..6d6ff47a3a --- /dev/null +++ b/test/staging/sm/misc/unwrapped-no-such-method.js @@ -0,0 +1,23 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +// Our __noSuchMethod__ handling should only be called when |this| is an object. + +var x = ""; +// Reached from interpreter's JSOP_CALLPROP, and js::mjit::ic::CallProp. +try { x.i(); } catch (ex) { } + +// Reached from interpreter's JSOP_CALLELEM, and js::mjit::stubs::CallElem. +try { x[x](); } catch (ex) { } + +// Reached from js::mjit::stubs::CallProp: +try { true.i(); } catch(ex) { } + diff --git a/test/staging/sm/module/await-restricted-nested.js b/test/staging/sm/module/await-restricted-nested.js new file mode 100644 index 0000000000..2375df8110 --- /dev/null +++ b/test/staging/sm/module/await-restricted-nested.js @@ -0,0 +1,20 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- module +negative: + phase: parse + type: SyntaxError +description: | + pending +esid: pending +---*/ + +// 'await' is always a keyword when parsing modules. +function f() { + await; +} +$DONOTEVALUATE(); diff --git a/test/staging/sm/module/bug1488117-empty_FIXTURE.js b/test/staging/sm/module/bug1488117-empty_FIXTURE.js new file mode 100644 index 0000000000..f348cfb5ce --- /dev/null +++ b/test/staging/sm/module/bug1488117-empty_FIXTURE.js @@ -0,0 +1,7 @@ +// |reftest| skip -- support file +/* + * Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/licenses/publicdomain/ + */ + +// Intentionally left empty. diff --git a/test/staging/sm/module/bug1488117-import-namespace_FIXTURE.js b/test/staging/sm/module/bug1488117-import-namespace_FIXTURE.js new file mode 100644 index 0000000000..3ce216e05d --- /dev/null +++ b/test/staging/sm/module/bug1488117-import-namespace_FIXTURE.js @@ -0,0 +1,7 @@ +// |reftest| skip -- support file +/* + * Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/licenses/publicdomain/ + */ + +import* as ns from "./bug1488117.js"; diff --git a/test/staging/sm/module/bug1488117.js b/test/staging/sm/module/bug1488117.js new file mode 100644 index 0000000000..179d0288e2 --- /dev/null +++ b/test/staging/sm/module/bug1488117.js @@ -0,0 +1,22 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- module +description: | + pending +esid: pending +---*/ + +// Load and instantiate "bug1488117-import-namespace_FIXTURE.js". +// "bug1488117-import-namespace_FIXTURE.js" contains an |import*| request for the current module, +// which triggers GetModuleNamespace for this module. GetModuleNamespace calls GetExportedNames on +// the current module, which in turn resolves and calls GetExportedNames on all |export*| entries. +// And that means HostResolveImportedModule is called for "bug1488117-empty_FIXTURE.js" before +// InnerModuleInstantiation for "bug1488117.js" has resolved that module file. + +import "./bug1488117-import-namespace_FIXTURE.js"; +export* from "./bug1488117-empty_FIXTURE.js"; + diff --git a/test/staging/sm/module/bug1693261-async.mjs b/test/staging/sm/module/bug1693261-async.mjs new file mode 100644 index 0000000000..bc345e0b4c --- /dev/null +++ b/test/staging/sm/module/bug1693261-async.mjs @@ -0,0 +1,7 @@ +// |reftest| skip -- support file +if (globalThis.testArray === undefined) { + globalThis.testArray = []; +} +globalThis.testArray.push("async 1"); +await 0; +globalThis.testArray.push("async 2"); diff --git a/test/staging/sm/module/bug1693261-c1.mjs b/test/staging/sm/module/bug1693261-c1.mjs new file mode 100644 index 0000000000..31f42d027e --- /dev/null +++ b/test/staging/sm/module/bug1693261-c1.mjs @@ -0,0 +1,6 @@ +// |reftest| skip -- support file +import "./bug1693261-async.mjs"; +if (globalThis.testArray === undefined) { + globalThis.testArray = []; +} +globalThis.testArray.push("c1"); diff --git a/test/staging/sm/module/bug1693261-c2.mjs b/test/staging/sm/module/bug1693261-c2.mjs new file mode 100644 index 0000000000..e5ceb3079d --- /dev/null +++ b/test/staging/sm/module/bug1693261-c2.mjs @@ -0,0 +1,6 @@ +// |reftest| skip -- support file +import "./bug1693261-async.mjs"; +if (globalThis.testArray === undefined) { + globalThis.testArray = []; +} +globalThis.testArray.push("c2"); diff --git a/test/staging/sm/module/bug1693261-x.mjs b/test/staging/sm/module/bug1693261-x.mjs new file mode 100644 index 0000000000..4c73867e58 --- /dev/null +++ b/test/staging/sm/module/bug1693261-x.mjs @@ -0,0 +1,6 @@ +// |reftest| skip -- support file +import "./bug1693261-c1.mjs"; +if (globalThis.testArray === undefined) { + globalThis.testArray = []; +} +globalThis.testArray.push("x"); diff --git a/test/staging/sm/module/duplicate-exported-names-in-single-export-declaration.js b/test/staging/sm/module/duplicate-exported-names-in-single-export-declaration.js new file mode 100644 index 0000000000..c93c54d52d --- /dev/null +++ b/test/staging/sm/module/duplicate-exported-names-in-single-export-declaration.js @@ -0,0 +1,19 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- module +negative: + phase: parse + type: SyntaxError +description: | + pending +esid: pending +---*/ + +const a = 1; + +export { a, a }; +$DONOTEVALUATE(); diff --git a/test/staging/sm/module/duplicate-exported-names-in-single-export-var-declaration.js b/test/staging/sm/module/duplicate-exported-names-in-single-export-var-declaration.js new file mode 100644 index 0000000000..d468b55ad5 --- /dev/null +++ b/test/staging/sm/module/duplicate-exported-names-in-single-export-var-declaration.js @@ -0,0 +1,17 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- module +negative: + phase: parse + type: SyntaxError +description: | + pending +esid: pending +---*/ + +export var a, a; +$DONOTEVALUATE(); diff --git a/test/staging/sm/module/module-export-name-star.js b/test/staging/sm/module/module-export-name-star.js new file mode 100644 index 0000000000..0934b6785d --- /dev/null +++ b/test/staging/sm/module/module-export-name-star.js @@ -0,0 +1,20 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- module +description: | + pending +esid: pending +---*/ + +var x = "ok"; + +export {x as "*"}; + +import {"*" as y} from "./module-export-name-star.js" + +assert.sameValue(y, "ok"); + diff --git a/test/staging/sm/object/15.2.3.12.js b/test/staging/sm/object/15.2.3.12.js new file mode 100644 index 0000000000..09eea3bf3e --- /dev/null +++ b/test/staging/sm/object/15.2.3.12.js @@ -0,0 +1,53 @@ +/* + * Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/licenses/publicdomain/ + */ + +/*--- +includes: [sm/non262-object-shell.js, sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +/* Object.isFrozen */ + +assert.sameValue(Object.isFrozen({}), false); + +assert.sameValue(Object.isFrozen(Object.preventExtensions({})), true); + +var o = Object.defineProperty({}, 'x', { writable:true, configurable:true }); +Object.preventExtensions(o); +assert.sameValue(Object.isFrozen(o), false); + +var o = Object.defineProperty({}, 'x', { writable:false, configurable:true }); +Object.preventExtensions(o); +assert.sameValue(Object.isFrozen(o), false); + +var o = Object.defineProperty({}, 'x', { writable:true, configurable:false }); +Object.preventExtensions(o); +assert.sameValue(Object.isFrozen(o), false); + +var o = Object.defineProperty({}, 'x', { writable:false, configurable:false }); +assert.sameValue(Object.isFrozen(o), false); + +var o = Object.defineProperty({}, 'x', { writable:false, configurable:false }); +Object.preventExtensions(o); +assert.sameValue(Object.isFrozen(o), true); + +var o = Object.defineProperties({}, { x: { writable:true, configurable:true }, + y: { writable:false, configurable:false } }); +Object.preventExtensions(o); +assert.sameValue(Object.isFrozen(o), false); + +var o = Object.defineProperties({}, { x: { writable:false, configurable:false }, + y: { writable:true, configurable:true } }); +Object.preventExtensions(o); +assert.sameValue(Object.isFrozen(o), false); + +var o = Object.defineProperties({}, { x: { writable:true, configurable:true }, + y: { writable:true, configurable:true } }); +Object.preventExtensions(o); +assert.sameValue(Object.isFrozen(o), false); + diff --git a/test/staging/sm/object/15.2.3.14-01.js b/test/staging/sm/object/15.2.3.14-01.js new file mode 100644 index 0000000000..532234d5de --- /dev/null +++ b/test/staging/sm/object/15.2.3.14-01.js @@ -0,0 +1,100 @@ +/* + * Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/licenses/publicdomain/ + */ + +/*--- +includes: [sm/non262-object-shell.js, sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +//----------------------------------------------------------------------------- +var BUGNUMBER = 307791; +var summary = 'ES5 Object.keys(O)'; +var actual = ''; +var expect = ''; + +printBugNumber(BUGNUMBER); +printStatus(summary); + +function arraysEqual(a1, a2) +{ + return a1.length === a2.length && + a1.every(function(v, i) { return v === a2[i]; }); +} + +/************** + * BEGIN TEST * + **************/ + +assert.sameValue(Object.keys.length, 1); + +var o, keys; + +o = { a: 3, b: 2 }; +keys = Object.keys(o); +assert.sameValue(arraysEqual(keys, ["a", "b"]), true, + "" + keys); + +o = { get a() { return 17; }, b: 2 }; +keys = Object.keys(o), +assert.sameValue(arraysEqual(keys, ["a", "b"]), true, + "" + keys); + +o = { __iterator__: function() { throw new Error("non-standard __iterator__ called?"); } }; +keys = Object.keys(o); +assert.sameValue(arraysEqual(keys, ["__iterator__"]), true, + "" + keys); + +o = { a: 1, b: 2 }; +delete o.a; +o.a = 3; +keys = Object.keys(o); +assert.sameValue(arraysEqual(keys, ["b", "a"]), true, + "" + keys); + +o = [0, 1, 2]; +keys = Object.keys(o); +assert.sameValue(arraysEqual(keys, ["0", "1", "2"]), true, + "" + keys); + +o = /./.exec("abc"); +keys = Object.keys(o); +assert.sameValue(arraysEqual(keys, ["0", "index", "input", "groups"]), true, + "" + keys); + +o = { a: 1, b: 2, c: 3 }; +delete o.b; +o.b = 5; +keys = Object.keys(o); +assert.sameValue(arraysEqual(keys, ["a", "c", "b"]), true, + "" + keys); + +function f() { } +f.prototype.p = 1; +o = new f(); +o.g = 1; +keys = Object.keys(o); +assert.sameValue(arraysEqual(keys, ["g"]), true, + "" + keys); + +if (typeof Namespace !== "undefined" && typeof QName !== "undefined") +{ + var o2 = {}; + var qn = new QName(new Namespace("foo"), "v"); + o2.f = 1; + o2[qn] = 3; + o2.baz = 4; + var keys2 = Object.keys(o2); + assert.sameValue(arraysEqual(keys2, ["f", "foo::v", "baz"]), true, + "" + keys2); +} + +/******************************************************************************/ + +assert.sameValue(expect, actual, "Object.keys"); + +printStatus("All tests passed!"); diff --git a/test/staging/sm/object/15.2.3.4-01.js b/test/staging/sm/object/15.2.3.4-01.js new file mode 100644 index 0000000000..a805186536 --- /dev/null +++ b/test/staging/sm/object/15.2.3.4-01.js @@ -0,0 +1,34 @@ +/* + * Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/licenses/publicdomain/ + */ + +/*--- +includes: [sm/non262-object-shell.js, sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +//----------------------------------------------------------------------------- +var BUGNUMBER = 518663; +var summary = + 'Object.getOwnPropertyNames should play nicely with enumerator caching'; + +print(BUGNUMBER + ": " + summary); + +/************** + * BEGIN TEST * + **************/ + +for (var p in JSON); +var names = Object.getOwnPropertyNames(JSON); +assert.sameValue(names.length >= 2, true, + "wrong number of property names? [" + names + "]"); +assert.sameValue(names.indexOf("parse") >= 0, true); +assert.sameValue(names.indexOf("stringify") >= 0, true); + +/******************************************************************************/ + +print("All tests passed!"); diff --git a/test/staging/sm/object/15.2.3.4-02.js b/test/staging/sm/object/15.2.3.4-02.js new file mode 100644 index 0000000000..50b31c876d --- /dev/null +++ b/test/staging/sm/object/15.2.3.4-02.js @@ -0,0 +1,56 @@ +/* + * Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/licenses/publicdomain/ + */ + +/*--- +includes: [sm/non262-object-shell.js, sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +//----------------------------------------------------------------------------- +var BUGNUMBER = 518663; +var summary = 'Object.getOwnPropertyNames: array objects'; + +print(BUGNUMBER + ": " + summary); + +/************** + * BEGIN TEST * + **************/ + +var a, names, expected; + +function arraysEqual(a1, a2) +{ + return a1.length === a2.length && + a1.every(function(v, i) { return v === a2[i]; }); +} + + +a = [0, 1, 2]; + +names = Object.getOwnPropertyNames(a).sort(); +expected = ["0", "1", "2", "length"].sort(); + +a = [1, , , 7]; +a.p = 2; +Object.defineProperty(a, "q", { value: 42, enumerable: false }); + +names = Object.getOwnPropertyNames(a).sort(); +expected = ["0", "3", "p", "q", "length"].sort(); +assert.sameValue(arraysEqual(names, expected), true); + + +a = []; + +names = Object.getOwnPropertyNames(a).sort(); +expected = ["length"]; +assert.sameValue(arraysEqual(names, expected), true); + + +/******************************************************************************/ + +print("All tests passed!"); diff --git a/test/staging/sm/object/15.2.3.4-03.js b/test/staging/sm/object/15.2.3.4-03.js new file mode 100644 index 0000000000..52c1662c28 --- /dev/null +++ b/test/staging/sm/object/15.2.3.4-03.js @@ -0,0 +1,59 @@ +/* + * Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/licenses/publicdomain/ + */ + +/*--- +includes: [sm/non262-object-shell.js, sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +//----------------------------------------------------------------------------- +var BUGNUMBER = 518663; +var summary = 'Object.getOwnPropertyNames: function objects'; + +print(BUGNUMBER + ": " + summary); + +/************** + * BEGIN TEST * + **************/ + +function two(a, b) { } + +assert.sameValue(Object.getOwnPropertyNames(two).indexOf("length") >= 0, true); + +var bound0 = Function.prototype.bind + ? two.bind("this") + : function two(a, b) { }; + +assert.sameValue(Object.getOwnPropertyNames(bound0).indexOf("length") >= 0, true); +assert.sameValue(bound0.length, 2); + +var bound1 = Function.prototype.bind + ? two.bind("this", 1) + : function one(a) { }; + +assert.sameValue(Object.getOwnPropertyNames(bound1).indexOf("length") >= 0, true); +assert.sameValue(bound1.length, 1); + +var bound2 = Function.prototype.bind + ? two.bind("this", 1, 2) + : function zero() { }; + +assert.sameValue(Object.getOwnPropertyNames(bound2).indexOf("length") >= 0, true); +assert.sameValue(bound2.length, 0); + +var bound3 = Function.prototype.bind + ? two.bind("this", 1, 2, 3) + : function zero() { }; + +assert.sameValue(Object.getOwnPropertyNames(bound3).indexOf("length") >= 0, true); +assert.sameValue(bound3.length, 0); + + +/******************************************************************************/ + +print("All tests passed!"); diff --git a/test/staging/sm/object/15.2.3.4-04.js b/test/staging/sm/object/15.2.3.4-04.js new file mode 100644 index 0000000000..0ecf97abde --- /dev/null +++ b/test/staging/sm/object/15.2.3.4-04.js @@ -0,0 +1,35 @@ +/* + * Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/licenses/publicdomain/ + */ + +/*--- +includes: [sm/non262-object-shell.js, sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +//----------------------------------------------------------------------------- +var BUGNUMBER = 518663; +var summary = 'Object.getOwnPropertyNames: regular expression objects'; + +print(BUGNUMBER + ": " + summary); + +/************** + * BEGIN TEST * + **************/ + +var actual = Object.getOwnPropertyNames(/a/); +var expected = ["lastIndex"]; + +for (var i = 0; i < expected.length; i++) +{ + assert.sameValue(actual.indexOf(expected[i]) >= 0, true, + expected[i] + " should be a property name on a RegExp"); +} + +/******************************************************************************/ + +print("All tests passed!"); diff --git a/test/staging/sm/object/15.2.3.5-01.js b/test/staging/sm/object/15.2.3.5-01.js new file mode 100644 index 0000000000..8d544450f9 --- /dev/null +++ b/test/staging/sm/object/15.2.3.5-01.js @@ -0,0 +1,66 @@ +/* + * Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/licenses/publicdomain/ + */ + +/*--- +includes: [sm/non262-object-shell.js, sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +//----------------------------------------------------------------------------- +var BUGNUMBER = 492840; +var summary = 'ES5 Object.create(O [, Properties])'; + +print(BUGNUMBER + ": " + summary); + +/************** + * BEGIN TEST * + **************/ + +assert.sameValue("create" in Object, true); +assert.sameValue(Object.create.length, 2); + +var o, desc, props, proto; + +o = Object.create(null); +assert.sameValue(Object.getPrototypeOf(o), null, "bad null-proto"); + +o = Object.create(null, { a: { value: 17, enumerable: false } }); +assert.sameValue(Object.getPrototypeOf(o), null, "bad null-proto"); +assert.sameValue("a" in o, true); +desc = Object.getOwnPropertyDescriptor(o, "a"); +assert.sameValue(desc !== undefined, true, "no descriptor?"); +assert.sameValue(desc.value, 17); +assert.sameValue(desc.enumerable, false); +assert.sameValue(desc.configurable, false); +assert.sameValue(desc.writable, false); + +props = Object.create({ bar: 15 }); +Object.defineProperty(props, "foo", { enumerable: false, value: 42 }); +proto = { baz: 12 }; +o = Object.create(proto, props); +assert.sameValue(Object.getPrototypeOf(o), proto); +assert.sameValue(Object.getOwnPropertyDescriptor(o, "foo"), undefined); +assert.sameValue("foo" in o, false); +assert.sameValue(Object.getOwnPropertyDescriptor(o, "bar"), undefined); +assert.sameValue("bar" in o, false); +assert.sameValue(Object.getOwnPropertyDescriptor(o, "baz"), undefined); +assert.sameValue(o.baz, 12); +assert.sameValue(o.hasOwnProperty("baz"), false); + +try { + var actual = + Object.create(Object.create({}, + { boom: { get: function() { return "base"; }}}), + { boom: { get: function() { return "overridden"; }}}).boom +} catch (e) { +} +assert.sameValue(actual, "overridden"); + +/******************************************************************************/ + +print("All tests passed!"); diff --git a/test/staging/sm/object/15.2.3.6-define-over-method.js b/test/staging/sm/object/15.2.3.6-define-over-method.js new file mode 100644 index 0000000000..3b1d953f3e --- /dev/null +++ b/test/staging/sm/object/15.2.3.6-define-over-method.js @@ -0,0 +1,31 @@ +/* + * Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/licenses/publicdomain/ + */ + +/*--- +includes: [sm/non262-object-shell.js, sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +//----------------------------------------------------------------------------- +var BUGNUMBER = 568786; +var summary = + 'Do not assert: !(attrs & (JSPROP_GETTER | JSPROP_SETTER)) with ' + + 'Object.defineProperty'; + +print(BUGNUMBER + ": " + summary); + +/************** + * BEGIN TEST * + **************/ + +var o = { x: function(){} }; +Object.defineProperty(o, "x", { get: function(){} }); + +/******************************************************************************/ + +print("All tests passed!"); diff --git a/test/staging/sm/object/15.2.3.7-01.js b/test/staging/sm/object/15.2.3.7-01.js new file mode 100644 index 0000000000..4a97c76d1b --- /dev/null +++ b/test/staging/sm/object/15.2.3.7-01.js @@ -0,0 +1,143 @@ +/* + * Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/licenses/publicdomain/ + */ + +/*--- +includes: [sm/non262-object-shell.js, sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +//----------------------------------------------------------------------------- +var BUGNUMBER = 430133; +var summary = 'ES5 Object.defineProperties(O, Properties)'; + +print(BUGNUMBER + ": " + summary); + +/************** + * BEGIN TEST * + **************/ + +assert.sameValue("defineProperties" in Object, true); +assert.sameValue(Object.defineProperties.length, 2); + +var o, props, desc, passed; + +o = {}; +props = + { + a: { value: 17, enumerable: true, configurable: true, writable: true }, + b: { value: 42, enumerable: false, configurable: false, writable: false } + }; +Object.defineProperties(o, props); +assert.sameValue("a" in o, true); +assert.sameValue("b" in o, true); +desc = Object.getOwnPropertyDescriptor(o, "a"); +assert.sameValue(desc.value, 17); +assert.sameValue(desc.enumerable, true); +assert.sameValue(desc.configurable, true); +assert.sameValue(desc.writable, true); +desc = Object.getOwnPropertyDescriptor(o, "b"); +assert.sameValue(desc.value, 42); +assert.sameValue(desc.enumerable, false); +assert.sameValue(desc.configurable, false); +assert.sameValue(desc.writable, false); + +props = + { + c: { value: NaN, enumerable: false, configurable: true, writable: true }, + b: { value: 44 } + }; +var error = "before"; +try +{ + Object.defineProperties(o, props); + error = "no exception thrown"; +} +catch (e) +{ + if (e instanceof TypeError) + error = "typeerror"; + else + error = "bad exception: " + e; +} +assert.sameValue(error, "typeerror", "didn't throw or threw wrongly"); +assert.sameValue("c" in o, true, "new property added"); +assert.sameValue(o.b, 42, "old property value preserved"); + +function Properties() { } +Properties.prototype = { b: { value: 42, enumerable: true } }; +props = new Properties(); +Object.defineProperty(props, "a", { enumerable: false }); +o = {}; +Object.defineProperties(o, props); +assert.sameValue("a" in o, false); +assert.sameValue(Object.getOwnPropertyDescriptor(o, "a"), undefined, + "Object.defineProperties(O, Properties) should only use enumerable " + + "properties on Properties"); +assert.sameValue("b" in o, false); +assert.sameValue(Object.getOwnPropertyDescriptor(o, "b"), undefined, + "Object.defineProperties(O, Properties) should only use enumerable " + + "properties directly on Properties"); + +Number.prototype.foo = { value: 17, enumerable: true }; +Boolean.prototype.bar = { value: 8675309, enumerable: true }; +String.prototype.quux = { value: "Are you HAPPY yet?", enumerable: true }; +o = {}; +Object.defineProperties(o, 5); // ToObject only throws for null/undefined +assert.sameValue("foo" in o, false, "foo is not an enumerable own property"); +Object.defineProperties(o, false); +assert.sameValue("bar" in o, false, "bar is not an enumerable own property"); +Object.defineProperties(o, ""); +assert.sameValue("quux" in o, false, "quux is not an enumerable own property"); + +error = "before"; +try +{ + Object.defineProperties(o, "1"); +} +catch (e) +{ + if (e instanceof TypeError) + error = "typeerror"; + else + error = "bad exception: " + e; +} +assert.sameValue(error, "typeerror", + "should throw on Properties == '1' due to '1'[0] not being a " + + "property descriptor"); + +error = "before"; +try +{ + Object.defineProperties(o, null); +} +catch (e) +{ + if (e instanceof TypeError) + error = "typeerror"; + else + error = "bad exception: " + e; +} +assert.sameValue(error, "typeerror", "should throw on Properties == null"); + +error = "before"; +try +{ + Object.defineProperties(o, undefined); +} +catch (e) +{ + if (e instanceof TypeError) + error = "typeerror"; + else + error = "bad exception: " + e; +} +assert.sameValue(error, "typeerror", "should throw on Properties == undefined"); + +/******************************************************************************/ + +print("All tests passed!"); diff --git a/test/staging/sm/object/15.2.3.9.js b/test/staging/sm/object/15.2.3.9.js new file mode 100644 index 0000000000..6613293895 --- /dev/null +++ b/test/staging/sm/object/15.2.3.9.js @@ -0,0 +1,58 @@ +/* + * Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/licenses/publicdomain/ + */ + +/*--- +includes: [sm/non262-object-shell.js, sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +/* Object.freeze */ + +function getme() { return 42; }; +function setme(x) { }; + +var properties = { all: { value:1, writable:true, configurable:true, enumerable: true }, + readOnly: { value:2, writable:false, configurable:true, enumerable: true }, + nonConfig: { value:3, writable:true, configurable:false, enumerable: true }, + none: { value:4, writable:false, configurable:false, enumerable: true }, + getter: { get: getme, configurable:false, enumerable: true }, + setter: { set: setme, configurable:false, enumerable: true }, + getandset: { get: getme, set: setme, configurable:false, enumerable: true } + }; +var o = Object.defineProperties({}, properties); + +Object.freeze(o); + +function getPropertyOf(obj) { + return function (prop) { + return Object.getOwnPropertyDescriptor(obj, prop); + }; +}; + +assert.sameValue(deepEqual(Object.getOwnPropertyDescriptor(o, 'all'), + { value: 1, writable:false, enumerable:true, configurable:false }), + true); +assert.sameValue(deepEqual(Object.getOwnPropertyDescriptor(o, 'readOnly'), + { value: 2, writable:false, enumerable:true, configurable:false }), + true); +assert.sameValue(deepEqual(Object.getOwnPropertyDescriptor(o, 'nonConfig'), + { value: 3, writable:false, enumerable:true, configurable:false }), + true); +assert.sameValue(deepEqual(Object.getOwnPropertyDescriptor(o, 'none'), + { value: 4, writable:false, enumerable:true, configurable:false }), + true); +assert.sameValue(deepEqual(Object.getOwnPropertyDescriptor(o, 'getter'), + { get: getme, set: (void 0), enumerable:true, configurable:false }), + true); +assert.sameValue(deepEqual(Object.getOwnPropertyDescriptor(o, 'setter'), + { set: setme, get: (void 0), enumerable:true, configurable:false }), + true); +assert.sameValue(deepEqual(Object.getOwnPropertyDescriptor(o, 'getandset'), + { get: getme, set: setme, enumerable:true, configurable:false }), + true); + diff --git a/test/staging/sm/object/accessor-arguments-rest.js b/test/staging/sm/object/accessor-arguments-rest.js new file mode 100644 index 0000000000..b8dfe338c8 --- /dev/null +++ b/test/staging/sm/object/accessor-arguments-rest.js @@ -0,0 +1,33 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-object-shell.js, sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +assertThrowsInstanceOf(() => eval("({ get x(...a) { } })"), SyntaxError); +assertThrowsInstanceOf(() => eval("({ get x(a, ...b) { } })"), SyntaxError); +assertThrowsInstanceOf(() => eval("({ get x([a], ...b) { } })"), SyntaxError); +assertThrowsInstanceOf(() => eval("({ get x({a}, ...b) { } })"), SyntaxError); +assertThrowsInstanceOf(() => eval("({ get x({a: A}, ...b) { } })"), SyntaxError); + +assertThrowsInstanceOf(() => eval("({ set x(...a) { } })"), SyntaxError); +assertThrowsInstanceOf(() => eval("({ set x(a, ...b) { } })"), SyntaxError); +assertThrowsInstanceOf(() => eval("({ set x([a], ...b) { } })"), SyntaxError); +assertThrowsInstanceOf(() => eval("({ set x({a: A}, ...b) { } })"), SyntaxError); + +({ get(...a) { } }); +({ get(a, ...b) { } }); +({ get([a], ...b) { } }); +({ get({a}, ...b) { } }); +({ get({a: A}, ...b) { } }); + +({ set(...a) { } }); +({ set(a, ...b) { } }); +({ set([a], ...b) { } }); +({ set({a: A}, ...b) { } }); + diff --git a/test/staging/sm/object/accessor-name.js b/test/staging/sm/object/accessor-name.js new file mode 100644 index 0000000000..c4d942380e --- /dev/null +++ b/test/staging/sm/object/accessor-name.js @@ -0,0 +1,45 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-object-shell.js, sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +function name(obj, property, get) { + let desc = Object.getOwnPropertyDescriptor(obj, property); + return (get ? desc.get : desc.set).name; +} + +assert.sameValue(name({get a() {}}, "a", true), "get a"); +assert.sameValue(name({set a(v) {}}, "a", false), "set a"); + +assert.sameValue(name({get 123() {}}, "123", true), "get 123"); +assert.sameValue(name({set 123(v) {}}, "123", false), "set 123"); + +assert.sameValue(name({get case() {}}, "case", true), "get case"); +assert.sameValue(name({set case(v) {}}, "case", false), "set case"); + +assert.sameValue(name({get get() {}}, "get", true), "get get"); +assert.sameValue(name({set set(v) {}}, "set", false), "set set"); + +let o = {get a() { }, set a(v) {}}; +assert.sameValue(name(o, "a", true), "get a"); +assert.sameValue(name(o, "a", false), "set a"); + +o = {get 123() { }, set 123(v) {}} +assert.sameValue(name(o, "123", true), "get 123"); +assert.sameValue(name(o, "123", false), "set 123"); + +o = {get case() { }, set case(v) {}} +assert.sameValue(name(o, "case", true), "get case"); +assert.sameValue(name(o, "case", false), "set case"); + +assert.sameValue(name({get ["a"]() {}}, "a", true), "get a"); +assert.sameValue(name({get [123]() {}}, "123", true), "get 123"); +assert.sameValue(name({set ["a"](v) {}}, "a", false), "set a"); +assert.sameValue(name({set [123](v) {}}, "123", false), "set 123"); + diff --git a/test/staging/sm/object/accessor-non-constructor.js b/test/staging/sm/object/accessor-non-constructor.js new file mode 100644 index 0000000000..472cd44970 --- /dev/null +++ b/test/staging/sm/object/accessor-non-constructor.js @@ -0,0 +1,29 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-object-shell.js, sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +var obj = { get a() { return 1; } }; +assertThrowsInstanceOf(() => { + new Object.getOwnPropertyDescriptor(obj, "a").get +}, TypeError); + +obj = { set a(b) { } }; +assertThrowsInstanceOf(() => { + new Object.getOwnPropertyDescriptor(obj, "a").set +}, TypeError); + +obj = { get a() { return 1; }, set a(b) { } }; +assertThrowsInstanceOf(() => { + new Object.getOwnPropertyDescriptor(obj, "a").get +}, TypeError); +assertThrowsInstanceOf(() => { + new Object.getOwnPropertyDescriptor(obj, "a").set +}, TypeError); + diff --git a/test/staging/sm/object/add-property-non-extensible.js b/test/staging/sm/object/add-property-non-extensible.js new file mode 100644 index 0000000000..2dcf3d14f1 --- /dev/null +++ b/test/staging/sm/object/add-property-non-extensible.js @@ -0,0 +1,122 @@ +/* + * Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/licenses/publicdomain/ + */ + +/*--- +includes: [sm/non262-object-shell.js, sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +var gTestfile = 'add-property-non-extensible.js'; +//----------------------------------------------------------------------------- +var BUGNUMBER = 602144; +var summary = + 'Properly method-compile attempted addition of properties to ' + + 'non-extensible objects'; + +print(BUGNUMBER + ": " + summary); + +/************** + * BEGIN TEST * + **************/ + +// No property + +var o1 = {}; +for (var i = 0; i < 5; i++) + o1.a = 3; +assert.sameValue(o1.a, 3); + +var o2 = Object.preventExtensions({}); +for (var i = 0; i < 5; i++) + o2.a = 3; +assert.sameValue(Object.getOwnPropertyDescriptor(o2, "a"), undefined); + +var o3 = Object.seal({}); +for (var i = 0; i < 5; i++) + o3.a = 3; +assert.sameValue(Object.getOwnPropertyDescriptor(o3, "a"), undefined); + +var o4 = Object.freeze({}); +for (var i = 0; i < 5; i++) + o4.a = 3; +assert.sameValue(Object.getOwnPropertyDescriptor(o4, "a"), undefined); + + +// Has property + +var o5 = { a: 2 }; +for (var i = 0; i < 5; i++) + o5.a = 3; +assert.sameValue(o5.a, 3); + +var o6 = Object.preventExtensions({ a: 2 }); +for (var i = 0; i < 5; i++) + o6.a = 3; +assert.sameValue(o6.a, 3); + +var o7 = Object.seal({ a: 2 }); +for (var i = 0; i < 5; i++) + o7.a = 3; +assert.sameValue(o7.a, 3); + +var o8 = Object.freeze({ a: 2 }); +for (var i = 0; i < 5; i++) + o8.a = 3; +assert.sameValue(o8.a, 2); + + +// Extensible, hit up the prototype chain + +var o9 = Object.create({ a: 2 }); +for (var i = 0; i < 5; i++) + o9.a = 3; +assert.sameValue(o9.a, 3); + +var o10 = Object.create(Object.preventExtensions({ a: 2 })); +for (var i = 0; i < 5; i++) + o10.a = 3; +assert.sameValue(o10.a, 3); + +var o11 = Object.create(Object.seal({ a: 2 })); +for (var i = 0; i < 5; i++) + o11.a = 3; +assert.sameValue(o11.a, 3); + +var o12 = Object.create(Object.freeze({ a: 2 })); +for (var i = 0; i < 5; i++) + o12.a = 3; +assert.sameValue(Object.getOwnPropertyDescriptor(o12, "a"), undefined); + + +// Not extensible, hit up the prototype chain + +var o13 = Object.preventExtensions(Object.create({ a: 2 })); +for (var i = 0; i < 5; i++) + o13.a = 3; +assert.sameValue(Object.getOwnPropertyDescriptor(o13, "a"), undefined); + +var o14 = + Object.preventExtensions(Object.create(Object.preventExtensions({ a: 2 }))); +for (var i = 0; i < 5; i++) + o14.a = 3; +assert.sameValue(Object.getOwnPropertyDescriptor(o14, "a"), undefined); + +var o15 = Object.preventExtensions(Object.create(Object.seal({ a: 2 }))); +for (var i = 0; i < 5; i++) + o15.a = 3; +assert.sameValue(Object.getOwnPropertyDescriptor(o15, "a"), undefined); + +var o16 = Object.preventExtensions(Object.create(Object.freeze({ a: 2 }))); +for (var i = 0; i < 5; i++) + o16.a = 3; +assert.sameValue(Object.getOwnPropertyDescriptor(o16, "a"), undefined); + + +/******************************************************************************/ + +print("All tests passed!"); diff --git a/test/staging/sm/object/bug-1150906.js b/test/staging/sm/object/bug-1150906.js new file mode 100644 index 0000000000..70b38a1d71 --- /dev/null +++ b/test/staging/sm/object/bug-1150906.js @@ -0,0 +1,23 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-object-shell.js, sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +function f(x) { + Object.defineProperty(arguments, 0, { + get: function() {} + }); + return arguments; +} + +var obj = f(1); +assert.sameValue(obj[0], undefined); +assert.sameValue(Object.getOwnPropertyDescriptor(obj, 0).set, undefined); +assertThrowsInstanceOf(() => { "use strict"; obj[0] = 1; }, TypeError); + diff --git a/test/staging/sm/object/bug-1206700.js b/test/staging/sm/object/bug-1206700.js new file mode 100644 index 0000000000..935bd9534a --- /dev/null +++ b/test/staging/sm/object/bug-1206700.js @@ -0,0 +1,20 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-object-shell.js, sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +var x = {}; +Reflect.set(x, "prop", 5, Object.prototype); +var y = {}; +Reflect.set(y, "prop", 6, Object.prototype); +assert.sameValue(x.hasOwnProperty("prop"), false); +assert.sameValue(y.hasOwnProperty("prop"), false); +assert.sameValue(Object.prototype.hasOwnProperty("prop"), true); +assert.sameValue(Object.prototype.prop, 6); + diff --git a/test/staging/sm/object/clear-dictionary-accessor-getset.js b/test/staging/sm/object/clear-dictionary-accessor-getset.js new file mode 100644 index 0000000000..71d1eb9f6b --- /dev/null +++ b/test/staging/sm/object/clear-dictionary-accessor-getset.js @@ -0,0 +1,60 @@ +/* + * Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/licenses/publicdomain/ + */ + +/*--- +includes: [sm/non262-object-shell.js, sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +var gTestfile = "clear-dictionary-accessor-getset.js"; +var BUGNUMBER = 1082662; +var summary = + "Properly handle GC of a dictionary accessor property whose [[Get]] or " + + "[[Set]] has been changed to |undefined|"; + +print(BUGNUMBER + ": " + summary); + +/************** + * BEGIN TEST * + **************/ + +function test(field) +{ + var prop = "[[" + field[0].toUpperCase() + field.substring(1) + "]]"; + print("Testing for GC crashes after setting " + prop + " to undefined..."); + + function inner() + { + // Create an object with an accessor property. + var obj = { x: 42, get y() {}, set y(v) {} }; + + // 1) convert it to dictionary mode, in the process 2) creating a new + // version of that accessor property whose [[Get]] and [[Set]] are objects + // that trigger post barriers. + delete obj.x; + + var desc = {}; + desc[field] = undefined; + + // Overwrite [[field]] with undefined. Note #1 above is necessary so this + // is an actual *overwrite*, and not (possibly) a shape-tree fork that + // doesn't overwrite. + Object.defineProperty(obj, "y", desc); + + } + + inner(); + gc(); // In unfixed code, this crashes trying to mark a null [[field]]. +} + +test("get"); +test("set"); + +/******************************************************************************/ + +print("Tests complete"); diff --git a/test/staging/sm/object/defineGetter-defineSetter.js b/test/staging/sm/object/defineGetter-defineSetter.js new file mode 100644 index 0000000000..afa802af48 --- /dev/null +++ b/test/staging/sm/object/defineGetter-defineSetter.js @@ -0,0 +1,99 @@ +/* + * Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/licenses/publicdomain/ + */ + +/*--- +includes: [sm/non262-object-shell.js, sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +let count = 0; +let verifyProxy = new Proxy({}, { + defineProperty(target, property, descriptor) { + assert.sameValue(property, "x"); + + assert.sameValue(descriptor.enumerable, true); + assert.sameValue(descriptor.configurable, true); + + if ("set" in descriptor) + assert.sameValue(descriptor.set, Object.prototype.__defineSetter__); + else + assert.sameValue(descriptor.get, Object.prototype.__defineGetter__); + + assert.sameValue(Object.keys(descriptor).length, 3); + + count++; + return true; + } +}); + +for (let define of [Object.prototype.__defineGetter__, Object.prototype.__defineSetter__]) { + // null/undefined |this| value + for (let thisv of [undefined, null]) + assertThrowsInstanceOf(() => define.call(thisv, "x", define), TypeError); + + // non-callable getter/setter + let nonCallable = [{}, [], new Proxy({}, {})]; + for (let value of nonCallable) + assertThrowsInstanceOf(() => define.call(verifyProxy, "x", value), TypeError); + + // ToPropertyKey + let key = { + [Symbol.toPrimitive](hint) { + assert.sameValue(hint, "string"); + // Throws, because non-primitive is returned + return {}; + }, + valueOf() { throw "wrongly invoked"; }, + toString() { throw "wrongly invoked"; } + }; + assertThrowsInstanceOf(() => define.call(verifyProxy, key, define), TypeError); + + key = { + [Symbol.toPrimitive](hint) { + assert.sameValue(hint, "string"); + return "x"; + }, + valueOf() { throw "wrongly invoked"; }, + toString() { throw "wrongly invoked"; } + } + define.call(verifyProxy, key, define); + + key = { + [Symbol.toPrimitive]: undefined, + + valueOf() { throw "wrongly invoked"; }, + toString() { return "x"; } + } + define.call(verifyProxy, key, define); + + // Bog standard call + define.call(verifyProxy, "x", define); + + let obj = {}; + define.call(obj, "x", define); + let descriptor = Object.getOwnPropertyDescriptor(obj, "x"); + + assert.sameValue(descriptor.enumerable, true); + assert.sameValue(descriptor.configurable, true); + + if (define == Object.prototype.__defineSetter__) { + assert.sameValue(descriptor.get, undefined); + assert.sameValue(descriptor.set, define); + } else { + assert.sameValue(descriptor.get, define); + assert.sameValue(descriptor.set, undefined); + } + + assert.sameValue(Object.keys(descriptor).length, 4); + + +} + +// Number of calls that should succeed +assert.sameValue(count, 6); + diff --git a/test/staging/sm/object/defineProperties-callable-accessor.js b/test/staging/sm/object/defineProperties-callable-accessor.js new file mode 100644 index 0000000000..da48a30c7c --- /dev/null +++ b/test/staging/sm/object/defineProperties-callable-accessor.js @@ -0,0 +1,29 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-object-shell.js, sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +// ObjectDefineProperties with non callable accessor throws. +const descriptors = [ + {get: 1}, {set: 1}, + {get: []}, {set: []}, + {get: {}}, {set: {}}, + {get: new Number}, {set: new Number}, + + {get: 1, set: 1}, + {get: [], set: []}, + {get: {}, set: {}}, + {get: new Number, set: new Number}, +]; + +for (const descriptor of descriptors) { + assertThrowsInstanceOf(() => Object.create(null, {x: descriptor}), TypeError); + assertThrowsInstanceOf(() => Object.defineProperties({}, {x: descriptor}), TypeError); +} + diff --git a/test/staging/sm/object/defineProperties-order.js b/test/staging/sm/object/defineProperties-order.js new file mode 100644 index 0000000000..23892817a0 --- /dev/null +++ b/test/staging/sm/object/defineProperties-order.js @@ -0,0 +1,27 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-object-shell.js, sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +// Based on testcases provided by André Bargull + +let log = []; +let logger = new Proxy({}, { + get(target, key) { + log.push(key); + } +}); + +Object.create(null, new Proxy({a: {value: 0}, b: {value: 1}}, logger)); +assert.sameValue(log.join(), "ownKeys,getOwnPropertyDescriptor,get,getOwnPropertyDescriptor,get"); + +log = []; +Object.defineProperties({}, new Proxy({a: {value: 0}, b: {value: 1}}, logger)); +assert.sameValue(log.join(), "ownKeys,getOwnPropertyDescriptor,get,getOwnPropertyDescriptor,get"); + diff --git a/test/staging/sm/object/defineProperty-proxy.js b/test/staging/sm/object/defineProperty-proxy.js new file mode 100644 index 0000000000..5e71d47ca0 --- /dev/null +++ b/test/staging/sm/object/defineProperty-proxy.js @@ -0,0 +1,63 @@ +/* + * Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/licenses/publicdomain/ + */ + +/*--- +includes: [deepEqual.js, sm/non262-object-shell.js, sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +// Test details of the implementation of ToPropertyDescriptor exposed to scripts +// thanks to scriptable proxies. + +// A LoggingProxy object logs certain operations performed on it. +var log = []; +function LoggingProxy(target) { + return new Proxy(target, { + has: function (t, id) { + log.push("has " + id); + return id in t; + }, + get: function (t, id) { + log.push("get " + id); + return t[id]; + } + }); +} + +// Tragically, we use separate code to implement Object.defineProperty on +// arrays and on proxies. So run the test three times. +var testSubjects = [ + {}, + [], + new Proxy({}, {}) +]; + +for (var obj of testSubjects) { + log = []; + + // Object.defineProperty is one public method that performs a + // ToPropertyDescriptor call. + Object.defineProperty(obj, "x", new LoggingProxy({ + enumerable: true, + configurable: true, + value: 3, + writable: true + })); + + // It should have performed exactly these operations on the proxy, in this + // order. See ES6 rev 24 (2014 April 27) 6.2.4.5 ToPropertyDescriptor. + assert.deepEqual(log, [ + "has enumerable", "get enumerable", + "has configurable", "get configurable", + "has value", "get value", + "has writable", "get writable", + "has get", + "has set" + ]); +} + diff --git a/test/staging/sm/object/duplProps.js b/test/staging/sm/object/duplProps.js new file mode 100644 index 0000000000..ea82719089 --- /dev/null +++ b/test/staging/sm/object/duplProps.js @@ -0,0 +1,126 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-object-shell.js, sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +/* + * ES6 allows duplicate property names in object literals, even in strict mode. + * These tests modify the tests in test262 to reflect this change. + */ + +// test262/ch11/11.1/11.1.5/11.1.5-4-4-a-1-s.js +a = function() { "use strict"; return { foo: 0, foo : 1 }}; +assert.sameValue(a().foo, 1); +a = function() { return { foo: 0, foo : 1 }}; +assert.sameValue(a().foo, 1); + +// test262/ch11/11.1/11.1.5/11.1.5_4-4-b-1.js +a = function() { "use strict"; return { foo : 1, get foo() { return 2; }}}; +assert.sameValue(a().foo, 2); +a = function() { return { foo : 1, get foo() { return 2;} }}; +assert.sameValue(a().foo, 2); + +// test262/ch11/11.1/11.1.5/11.1.5_4-4-c-1.js +a = function() { "use strict"; return { get foo() { return 2; }, foo : 1 }}; +assert.sameValue(a().foo, 1); +a = function() { return { get foo() { return 2; }, foo : 1 }}; +assert.sameValue(a().foo, 1); + +// test262/ch11/11.1/11.1.5/11.1.5_4-4-b-2.js +a = function() { "use strict"; return { foo : 1, set foo(a) { throw 2; }}}; +try { + a().foo = 5; + throw new Error("2 should be thrown here"); +} catch (e) { + if (e !== 2) + throw new Error("2 should be thrown here"); +} +a = function() { return { foo : 1, set foo(a) { throw 2;} }}; +try { + a().foo = 5; + throw new Error("2 should be thrown here"); +} catch (e) { + if (e !== 2) + throw new Error("2 should be thrown here"); +} + +// test262/ch11/11.1/11.1.5/11.1.5_4-4-d-1.js +a = function() { "use strict"; return { get foo() { return 2; }, get foo() { return 3; } }}; +assert.sameValue(a().foo, 3); +a = function() { return { get foo() { return 2; }, get foo() { return 3; } }}; +assert.sameValue(a().foo, 3); + +// test262/ch11/11.1/11.1.5/11.1.5_4-4-c-2.js +a = function() { "use strict"; return { set foo(a) { throw 2; }, foo : 1 }}; +assert.sameValue(a().foo, 1); +a = function() { return { set foo(a) { throw 2; }, foo : 1 }}; +assert.sameValue(a().foo, 1); + +// test262/ch11/11.1/11.1.5/11.1.5_4-4-d-2.js +a = function() { "use strict"; return { set foo(a) { throw 2; }, set foo(a) { throw 3; }}}; +try { + a().foo = 5; + throw new Error("3 should be thrown here"); +} catch (e) { + if (e !== 3) + throw new Error("3 should be thrown here"); +} +a = function() { return { set foo(a) { throw 2; }, set foo(a) { throw 3; }}}; +try { + a().foo = 5; + throw new Error("3 should be thrown here"); +} catch (e) { + if (e !== 3) + throw new Error("3 should be thrown here"); +} + +// test262/ch11/11.1/11.1.5/11.1.5_4-4-d-3.js +a = function() { "use strict"; return { get foo() { return 2; }, set foo(a) { throw 3; }, + get foo() { return 4; }}}; +try { + assert.sameValue(a().foo, 4); + a().foo = 5; + throw new Error("3 should be thrown here"); +} catch (e) { + if (e !== 3) + throw new Error("3 should be thrown here"); +} +a = function() { return { get foo() { return 2; }, set foo(a) { throw 3; }, + get foo() { return 4; }}}; +try { + assert.sameValue(a().foo, 4); + a().foo = 5; + throw new Error("3 should be thrown here"); +} catch (e) { + if (e !== 3) + throw new Error("3 should be thrown here"); +} + +// test262/ch11/11.1/11.1.5/11.1.5_4-4-d-4.js +a = function() { "use strict"; return { set foo(a) { throw 2; }, get foo() { return 4; }, + set foo(a) { throw 3; }}}; +try { + assert.sameValue(a().foo, 4); + a().foo = 5; + throw new Error("3 should be thrown here"); +} catch (e) { + if (e !== 3) + throw new Error("3 should be thrown here"); +} +a = function() { return { set foo(a) { throw 2; }, get foo() { return 4; }, + set foo(a) { throw 3; }}}; +try { + assert.sameValue(a().foo, 4); + a().foo = 5; + throw new Error("3 should be thrown here"); +} catch (e) { + if (e !== 3) + throw new Error("3 should be thrown here"); +} + diff --git a/test/staging/sm/object/entries.js b/test/staging/sm/object/entries.js new file mode 100644 index 0000000000..ba06b8fe68 --- /dev/null +++ b/test/staging/sm/object/entries.js @@ -0,0 +1,100 @@ +/* + * Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/licenses/publicdomain/ + */ + +/*--- +includes: [deepEqual.js, sm/non262-object-shell.js, sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +if ("entries" in Object) { + assert.sameValue(Object.entries.length, 1); + + var o, entries; + + o = { a: 3, b: 2 }; + entries = Object.entries(o); + assert.deepEqual(entries, [["a", 3], ["b", 2]]); + + o = { get a() { return 17; }, b: 2 }; + entries = Object.entries(o), + assert.deepEqual(entries, [["a", 17], ["b", 2]]); + + o = { __iterator__: function() { throw new Error("non-standard __iterator__ called?"); } }; + entries = Object.entries(o); + assert.deepEqual(entries, [["__iterator__", o.__iterator__]]); + + o = { a: 1, b: 2 }; + delete o.a; + o.a = 3; + entries = Object.entries(o); + assert.deepEqual(entries, [["b", 2], ["a", 3]]); + + o = [0, 1, 2]; + entries = Object.entries(o); + assert.deepEqual(entries, [["0", 0], ["1", 1], ["2", 2]]); + + o = /./.exec("abc"); + entries = Object.entries(o); + assert.deepEqual(entries, [["0", "a"], ["index", 0], ["input", "abc"], ["groups", undefined]]); + + o = { a: 1, b: 2, c: 3 }; + delete o.b; + o.b = 5; + entries = Object.entries(o); + assert.deepEqual(entries, [["a", 1], ["c", 3], ["b", 5]]); + + function f() { } + f.prototype.p = 1; + o = new f(); + o.g = 1; + entries = Object.entries(o); + assert.deepEqual(entries, [["g", 1]]); + + var o = {get a() {delete this.b; return 1}, b: 2, c: 3}; + entries = Object.entries(o); + assert.deepEqual(entries, [["a", 1], ["c", 3]]); + + assertThrowsInstanceOf(() => Object.entries(), TypeError); + assertThrowsInstanceOf(() => Object.entries(undefined), TypeError); + assertThrowsInstanceOf(() => Object.entries(null), TypeError); + + assert.deepEqual(Object.entries(1), []); + assert.deepEqual(Object.entries(true), []); + if (typeof Symbol === "function") + assert.deepEqual(Object.entries(Symbol("foo")), []); + + assert.deepEqual(Object.entries("foo"), [["0", "f"], ["1", "o"], ["2", "o"]]); + + entries = Object.entries({ + get a(){ + Object.defineProperty(this, "b", {enumerable: false}); + return "A"; + }, + b: "B" + }); + assert.deepEqual(entries, [["a", "A"]]); + + let ownKeysCallCount = 0; + let getOwnPropertyDescriptorCalls = []; + let target = { a: 1, b: 2, c: 3 }; + o = new Proxy(target, { + ownKeys() { + ownKeysCallCount++; + return ["c", "a"]; + }, + getOwnPropertyDescriptor(target, key) { + getOwnPropertyDescriptorCalls.push(key); + return Object.getOwnPropertyDescriptor(target, key); + } + }); + entries = Object.entries(o); + assert.sameValue(ownKeysCallCount, 1); + assert.deepEqual(entries, [["c", 3], ["a", 1]]); + assert.deepEqual(getOwnPropertyDescriptorCalls, ["c", "a"]); +} + diff --git a/test/staging/sm/object/extensibility-01.js b/test/staging/sm/object/extensibility-01.js new file mode 100644 index 0000000000..ab479d52cd --- /dev/null +++ b/test/staging/sm/object/extensibility-01.js @@ -0,0 +1,107 @@ +/* + * Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/licenses/publicdomain/ + */ + +/*--- +includes: [sm/non262-object-shell.js, sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +var gTestfile = '15.2.3.10-01.js'; +//----------------------------------------------------------------------------- +var BUGNUMBER = 492849; +var summary = 'ES5: Implement Object.preventExtensions, Object.isExtensible'; + +print(BUGNUMBER + ": " + summary); + +/************** + * BEGIN TEST * + **************/ + +function trySetProperty(o, p, v, strict) +{ + function strictSetProperty() + { + "use strict"; + o[p] = v; + } + + function setProperty() + { + o[p] = v; + } + + assert.sameValue(Object.prototype.hasOwnProperty.call(o, p), false); + + try + { + if (strict) + strictSetProperty(); + else + setProperty(); + if (o[p] === v) + return "set"; + if (p in o) + return "set-converted"; + return "swallowed"; + } + catch (e) + { + return "throw"; + } +} + +function tryDefineProperty(o, p, v) +{ + assert.sameValue(Object.prototype.hasOwnProperty.call(o, p), false); + + try + { + Object.defineProperty(o, p, { value: v }); + if (o[p] === v) + return "set"; + if (p in o) + return "set-converted"; + return "swallowed"; + } + catch (e) + { + return "throw"; + } +} + +assert.sameValue(typeof Object.preventExtensions, "function"); +assert.sameValue(Object.preventExtensions.length, 1); + +var slowArray = [1, 2, 3]; +slowArray.slow = 5; +var objs = + [{}, { 1: 2 }, { a: 3 }, [], [1], [, 1], slowArray, function a(){}, /a/]; + +for (var i = 0, sz = objs.length; i < sz; i++) +{ + var o = objs[i]; + assert.sameValue(Object.isExtensible(o), true, "object " + i + " not extensible?"); + + var o2 = Object.preventExtensions(o); + assert.sameValue(o, o2); + + assert.sameValue(Object.isExtensible(o), false, "object " + i + " is extensible?"); + + assert.sameValue(trySetProperty(o, "baz", 17, true), "throw", + "unexpected behavior for strict-mode property-addition to " + + "object " + i); + assert.sameValue(trySetProperty(o, "baz", 17, false), "swallowed", + "unexpected behavior for property-addition to object " + i); + + assert.sameValue(tryDefineProperty(o, "baz", 17), "throw", + "unexpected behavior for new property definition on object " + i); +} + +/******************************************************************************/ + +print("All tests passed!"); diff --git a/test/staging/sm/object/extensibility-02.js b/test/staging/sm/object/extensibility-02.js new file mode 100644 index 0000000000..2dbdb76b51 --- /dev/null +++ b/test/staging/sm/object/extensibility-02.js @@ -0,0 +1,46 @@ +/* + * Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/licenses/publicdomain/ + */ + +/*--- +includes: [sm/non262-object-shell.js, sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +var gTestfile = '15.2.3.4-01.js'; +//----------------------------------------------------------------------------- +var BUGNUMBER = 492849; +var summary = 'ES5: Implement Object.preventExtensions, Object.isExtensible'; + +print(BUGNUMBER + ": " + summary); + +/************** + * BEGIN TEST * + **************/ + +assert.sameValue(typeof Object.isExtensible, "function"); +assert.sameValue(Object.isExtensible.length, 1); + +var slowArray = [1, 2, 3]; +slowArray.slow = 5; +var objs = + [{}, { 1: 2 }, { a: 3 }, [], [1], [, 1], slowArray, function a(){}, /a/]; + +for (var i = 0, sz = objs.length; i < sz; i++) +{ + var o = objs[i]; + assert.sameValue(Object.isExtensible(o), true, "object " + i + " not extensible?"); + + var o2 = Object.preventExtensions(o); + assert.sameValue(o, o2); + + assert.sameValue(Object.isExtensible(o), false, "object " + i + " is extensible?"); +} + +/******************************************************************************/ + +print("All tests passed!"); diff --git a/test/staging/sm/object/freeze-proxy.js b/test/staging/sm/object/freeze-proxy.js new file mode 100644 index 0000000000..5d2e5684ab --- /dev/null +++ b/test/staging/sm/object/freeze-proxy.js @@ -0,0 +1,37 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [deepEqual.js, sm/non262-object-shell.js, sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +/* Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/publicdomain/zero/1.0/ */ + +function logProxy(object = {}, handler = {}) { + var log = []; + var proxy = new Proxy(object, new Proxy(handler, { + get(target, propertyKey, receiver) { + log.push(propertyKey); + return target[propertyKey]; + } + })); + return {proxy, log}; +} + +// The order of operations is backwards when compared to ES6 draft rev 27 +// (2014 August 24), but see https://bugs.ecmascript.org/show_bug.cgi?id=3215 +// for an explanation on why the spec version is clearly wrong. + +var {proxy, log} = logProxy(); +Object.freeze(proxy); +assert.deepEqual(log, ["preventExtensions", "ownKeys"]); + +var {proxy, log} = logProxy(); +Object.freeze(Object.freeze(proxy)); +assert.deepEqual(log, ["preventExtensions", "ownKeys", "preventExtensions", "ownKeys"]); + diff --git a/test/staging/sm/object/freeze.js b/test/staging/sm/object/freeze.js new file mode 100644 index 0000000000..08f5f5675a --- /dev/null +++ b/test/staging/sm/object/freeze.js @@ -0,0 +1,27 @@ +/* + * Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/licenses/publicdomain/ + */ + +/*--- +includes: [sm/non262-object-shell.js, sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +var BUGNUMBER = 1076588; +var summary = "Object.freeze() should return its argument with no conversion when the argument is a primitive value"; + +print(BUGNUMBER + ": " + summary); +assert.sameValue(Object.freeze(), undefined); +assert.sameValue(Object.freeze(undefined), undefined); +assert.sameValue(Object.freeze(null), null); +assert.sameValue(Object.freeze(1), 1); +assert.sameValue(Object.freeze("foo"), "foo"); +assert.sameValue(Object.freeze(true), true); +if (typeof Symbol === "function") { + assert.sameValue(Object.freeze(Symbol.for("foo")), Symbol.for("foo")); +} + diff --git a/test/staging/sm/object/gOPD-vs-prototype-accessor.js b/test/staging/sm/object/gOPD-vs-prototype-accessor.js new file mode 100644 index 0000000000..78baeb7bc4 --- /dev/null +++ b/test/staging/sm/object/gOPD-vs-prototype-accessor.js @@ -0,0 +1,22 @@ +/* + * Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/licenses/publicdomain/ + */ + +/*--- +includes: [sm/non262-object-shell.js, sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +assert.sameValue(function testcase() { + var proto = {}; + Object.defineProperty(proto, "prop", {get: function () {return {};}, enumerable: true}); + var ConstructFun = function () {}; + ConstructFun.prototype = proto; + var child = new ConstructFun; + return Object.getOwnPropertyNames(child).indexOf('prop'); +}(), -1); + diff --git a/test/staging/sm/object/getOwnPropertyDescriptor.js b/test/staging/sm/object/getOwnPropertyDescriptor.js new file mode 100644 index 0000000000..1ae5f2937e --- /dev/null +++ b/test/staging/sm/object/getOwnPropertyDescriptor.js @@ -0,0 +1,41 @@ +/* + * Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/licenses/publicdomain/ + */ + +/*--- +includes: [deepEqual.js, sm/non262-object-shell.js, sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +var BUGNUMBER = 1079188; +var summary = "Coerce the argument passed to Object.getOwnPropertyDescriptor using ToObject"; +print(BUGNUMBER + ": " + summary); + +assertThrowsInstanceOf(() => Object.getOwnPropertyDescriptor(), TypeError); +assertThrowsInstanceOf(() => Object.getOwnPropertyDescriptor(undefined), TypeError); +assertThrowsInstanceOf(() => Object.getOwnPropertyDescriptor(null), TypeError); + +Object.getOwnPropertyDescriptor(1); +Object.getOwnPropertyDescriptor(true); +if (typeof Symbol === "function") { + Object.getOwnPropertyDescriptor(Symbol("foo")); +} + +assert.deepEqual(Object.getOwnPropertyDescriptor("foo", "length"), { + value: 3, + writable: false, + enumerable: false, + configurable: false +}); + +assert.deepEqual(Object.getOwnPropertyDescriptor("foo", 0), { + value: "f", + writable: false, + enumerable: true, + configurable: false +}); + diff --git a/test/staging/sm/object/getOwnPropertySymbols-proxy.js b/test/staging/sm/object/getOwnPropertySymbols-proxy.js new file mode 100644 index 0000000000..49c85c2000 --- /dev/null +++ b/test/staging/sm/object/getOwnPropertySymbols-proxy.js @@ -0,0 +1,36 @@ +/* + * Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/licenses/publicdomain/ + */ + +/*--- +includes: [deepEqual.js, sm/non262-object-shell.js, sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +// getOwnPropertySymbols(proxy) calls the getOwnPropertyNames hook (only). + +var symbols = [Symbol(), Symbol("moon"), Symbol.for("sun"), Symbol.iterator]; +var hits = 0; + +function HandlerProxy() { + return new Proxy({}, { + get: function (t, key) { + if (key !== "ownKeys") + throw new Error("tried to access handler[" + String(key) + "]"); + hits++; + return t => symbols; + } + }); +} + +function OwnKeysProxy() { + return new Proxy({}, new HandlerProxy); +} + +assert.deepEqual(Object.getOwnPropertySymbols(new OwnKeysProxy), symbols); +assert.sameValue(hits, 1); + diff --git a/test/staging/sm/object/getOwnPropertySymbols.js b/test/staging/sm/object/getOwnPropertySymbols.js new file mode 100644 index 0000000000..bb40c08b67 --- /dev/null +++ b/test/staging/sm/object/getOwnPropertySymbols.js @@ -0,0 +1,54 @@ +/* + * Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/licenses/publicdomain/ + */ + +/*--- +includes: [deepEqual.js, sm/non262-object-shell.js, sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +assert.deepEqual(Object.getOwnPropertySymbols({}), []); + +// String keys are ignored. +assert.sameValue(Object.getOwnPropertySymbols({a: 1, b: 2}).length, 0); +assert.sameValue(Object.getOwnPropertySymbols([0, 1, 2, 3]).length, 0); + +// Symbol keys are observed. +var iterable = {}; +Object.defineProperty(iterable, Symbol.iterator, { + value: () => [][Symbol.iterator]() +}); +assert.deepEqual(Object.getOwnPropertySymbols(iterable), [Symbol.iterator]); +assert.deepEqual(Object.getOwnPropertySymbols(new Proxy(iterable, {})), [Symbol.iterator]); + +// Test on an object with a thousand own properties. +var obj = {}; +for (var i = 0; i < 1000; i++) { + obj[Symbol.for("x" + i)] = 1; +} +assert.sameValue(Object.getOwnPropertyNames(obj).length, 0); +var symbols = Object.getOwnPropertySymbols(obj); +assert.sameValue(symbols.length, 1000); +assert.sameValue(symbols.indexOf(Symbol.for("x0")) !== -1, true); +assert.sameValue(symbols.indexOf(Symbol.for("x241")) !== -1, true); +assert.sameValue(symbols.indexOf(Symbol.for("x999")) !== -1, true); +assert.sameValue(Object.getOwnPropertySymbols(new Proxy(obj, {})).length, 1000); + +// The prototype chain is not consulted. +assert.sameValue(Object.getOwnPropertySymbols(Object.create(obj)).length, 0); +assert.sameValue(Object.getOwnPropertySymbols(new Proxy(Object.create(obj), {})).length, 0); + +// Primitives are coerced to objects; but there are never any symbol-keyed +// properties on the resulting wrapper objects. +assertThrowsInstanceOf(() => Object.getOwnPropertySymbols(), TypeError); +assertThrowsInstanceOf(() => Object.getOwnPropertySymbols(undefined), TypeError); +assertThrowsInstanceOf(() => Object.getOwnPropertySymbols(null), TypeError); +for (var primitive of [true, 1, 3.14, "hello", Symbol()]) + assert.sameValue(Object.getOwnPropertySymbols(primitive).length, 0); + +assert.sameValue(Object.getOwnPropertySymbols.length, 1); + diff --git a/test/staging/sm/object/getPrototypeOf-array.js b/test/staging/sm/object/getPrototypeOf-array.js new file mode 100644 index 0000000000..f9b41f4096 --- /dev/null +++ b/test/staging/sm/object/getPrototypeOf-array.js @@ -0,0 +1,37 @@ +/* + * Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/licenses/publicdomain/ + */ + +/*--- +includes: [sm/non262-object-shell.js, sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +var gTestfile = 'getPrototypeOf-array.js'; +var BUGNUMBER = 769041; +var summary = + "The [[Prototype]] of an object whose prototype chain contains an array " + + "isn't that array's [[Prototype]]"; + +print(BUGNUMBER + ": " + summary); + +/************** + * BEGIN TEST * + **************/ + +var arr = []; +assert.sameValue(Array.isArray(arr), true); +var objWithArrPrototype = Object.create(arr); +assert.sameValue(!Array.isArray(objWithArrPrototype), true); +assert.sameValue(Object.getPrototypeOf(objWithArrPrototype), arr); +var objWithArrGrandPrototype = Object.create(objWithArrPrototype); +assert.sameValue(!Array.isArray(objWithArrGrandPrototype), true); +assert.sameValue(Object.getPrototypeOf(objWithArrGrandPrototype), objWithArrPrototype); + +/******************************************************************************/ + +print("Tests complete"); diff --git a/test/staging/sm/object/getPrototypeOf.js b/test/staging/sm/object/getPrototypeOf.js new file mode 100644 index 0000000000..65f0cb91e3 --- /dev/null +++ b/test/staging/sm/object/getPrototypeOf.js @@ -0,0 +1,28 @@ +/* + * Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/licenses/publicdomain/ + */ + +/*--- +includes: [sm/non262-object-shell.js, sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +var BUGNUMBER = 1079090; +var summary = "Coerce the argument passed to Object.getPrototypeOf using ToObject"; +print(BUGNUMBER + ": " + summary); + +assertThrowsInstanceOf(() => Object.getPrototypeOf(), TypeError); +assertThrowsInstanceOf(() => Object.getPrototypeOf(undefined), TypeError); +assertThrowsInstanceOf(() => Object.getPrototypeOf(null), TypeError); + +assert.sameValue(Object.getPrototypeOf(1), Number.prototype); +assert.sameValue(Object.getPrototypeOf(true), Boolean.prototype); +assert.sameValue(Object.getPrototypeOf("foo"), String.prototype); +if (typeof Symbol === "function") { + assert.sameValue(Object.getPrototypeOf(Symbol("foo")), Symbol.prototype); +} + diff --git a/test/staging/sm/object/getter-name.js b/test/staging/sm/object/getter-name.js new file mode 100644 index 0000000000..b421af6224 --- /dev/null +++ b/test/staging/sm/object/getter-name.js @@ -0,0 +1,19 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-object-shell.js, sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +var BUGNUMBER = 1180290; +var summary = 'Object accessors should have get prefix'; + +print(BUGNUMBER + ": " + summary); + +assert.sameValue(Object.getOwnPropertyDescriptor(Object.prototype, "__proto__").get.name, "get __proto__"); +assert.sameValue(Object.getOwnPropertyDescriptor(Object.prototype, "__proto__").set.name, "set __proto__"); + diff --git a/test/staging/sm/object/hasOwn.js b/test/staging/sm/object/hasOwn.js new file mode 100644 index 0000000000..6e46a1f409 --- /dev/null +++ b/test/staging/sm/object/hasOwn.js @@ -0,0 +1,24 @@ +/* + * Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/licenses/publicdomain/ + */ + +/*--- +includes: [sm/non262-object-shell.js, sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +assert.sameValue(Object.hasOwn({}, "any"), false); +assertThrowsInstanceOf(() => Object.hasOwn(null, "any"), TypeError); + +var x = { test: 'test value'} +var y = {} +var z = Object.create(x); + +assert.sameValue(Object.hasOwn(x, "test"), true); +assert.sameValue(Object.hasOwn(y, "test"), false); +assert.sameValue(Object.hasOwn(z, "test"), false); + diff --git a/test/staging/sm/object/isExtensible.js b/test/staging/sm/object/isExtensible.js new file mode 100644 index 0000000000..5e29987841 --- /dev/null +++ b/test/staging/sm/object/isExtensible.js @@ -0,0 +1,27 @@ +/* + * Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/licenses/publicdomain/ + */ + +/*--- +includes: [sm/non262-object-shell.js, sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +var BUGNUMBER = 1060873; +var summary = "Object.isExtensible() should return false when given primitive values as input"; + +print(BUGNUMBER + ": " + summary); +assert.sameValue(Object.isExtensible(), false); +assert.sameValue(Object.isExtensible(undefined), false); +assert.sameValue(Object.isExtensible(null), false); +assert.sameValue(Object.isExtensible(1), false); +assert.sameValue(Object.isExtensible("foo"), false); +assert.sameValue(Object.isExtensible(true), false); +if (typeof Symbol === "function") { + assert.sameValue(Object.isExtensible(Symbol()), false); +} + diff --git a/test/staging/sm/object/isFrozen.js b/test/staging/sm/object/isFrozen.js new file mode 100644 index 0000000000..6e50b768e6 --- /dev/null +++ b/test/staging/sm/object/isFrozen.js @@ -0,0 +1,27 @@ +/* + * Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/licenses/publicdomain/ + */ + +/*--- +includes: [sm/non262-object-shell.js, sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +var BUGNUMBER = 1071464; +var summary = "Object.isFrozen() should return true when given primitive values as input"; + +print(BUGNUMBER + ": " + summary); +assert.sameValue(Object.isFrozen(), true); +assert.sameValue(Object.isFrozen(undefined), true); +assert.sameValue(Object.isFrozen(null), true); +assert.sameValue(Object.isFrozen(1), true); +assert.sameValue(Object.isFrozen("foo"), true); +assert.sameValue(Object.isFrozen(true), true); +if (typeof Symbol === "function") { + assert.sameValue(Object.isFrozen(Symbol()), true); +} + diff --git a/test/staging/sm/object/isPrototypeOf.js b/test/staging/sm/object/isPrototypeOf.js new file mode 100644 index 0000000000..2346e86b2d --- /dev/null +++ b/test/staging/sm/object/isPrototypeOf.js @@ -0,0 +1,91 @@ +/* + * Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/licenses/publicdomain/ + */ + +/*--- +includes: [sm/non262-object-shell.js, sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +var gTestfile = 'isPrototypeOf.js'; +var BUGNUMBER = 619283; +var summary = "Object.prototype.isPrototypeOf"; + +print(BUGNUMBER + ": " + summary); + +/************** + * BEGIN TEST * + **************/ + +function expectThrowTypeError(fun) +{ + try + { + var r = fun(); + throw new Error("didn't throw TypeError, returned " + r); + } + catch (e) + { + assert.sameValue(e instanceof TypeError, true, + "didn't throw TypeError, got: " + e); + } +} + +var isPrototypeOf = Object.prototype.isPrototypeOf; + +/* + * 1. If V is not an Object, return false. + */ +assert.sameValue(isPrototypeOf(), false); +assert.sameValue(isPrototypeOf(1), false); +assert.sameValue(isPrototypeOf(Number.MAX_VALUE), false); +assert.sameValue(isPrototypeOf(NaN), false); +assert.sameValue(isPrototypeOf(""), false); +assert.sameValue(isPrototypeOf("sesquicentennial"), false); +assert.sameValue(isPrototypeOf(true), false); +assert.sameValue(isPrototypeOf(false), false); +assert.sameValue(isPrototypeOf(0.72), false); +assert.sameValue(isPrototypeOf(undefined), false); +assert.sameValue(isPrototypeOf(null), false); + + +/* + * 2. Let O be the result of calling ToObject passing the this value as the + * argument. + */ +var protoGlobal = Object.create(this); +expectThrowTypeError(function() { isPrototypeOf.call(null, {}); }); +expectThrowTypeError(function() { isPrototypeOf.call(undefined, {}); }); +expectThrowTypeError(function() { isPrototypeOf({}); }); +expectThrowTypeError(function() { isPrototypeOf.call(null, protoGlobal); }); +expectThrowTypeError(function() { isPrototypeOf.call(undefined, protoGlobal); }); +expectThrowTypeError(function() { isPrototypeOf(protoGlobal); }); + + +/* + * 3. Repeat + */ + +/* + * 3a. Let V be the value of the [[Prototype]] internal property of V. + * 3b. If V is null, return false. + */ +assert.sameValue(Object.prototype.isPrototypeOf(Object.prototype), false); +assert.sameValue(String.prototype.isPrototypeOf({}), false); +assert.sameValue(Object.prototype.isPrototypeOf(Object.create(null)), false); + +/* 3c. If O and V refer to the same object, return true. */ +assert.sameValue(Object.prototype.isPrototypeOf({}), true); +assert.sameValue(this.isPrototypeOf(protoGlobal), true); +assert.sameValue(Object.prototype.isPrototypeOf({}), true); +assert.sameValue(Object.prototype.isPrototypeOf(new Number(17)), true); +assert.sameValue(Object.prototype.isPrototypeOf(function(){}), true); + + +/******************************************************************************/ + +print("All tests passed!"); diff --git a/test/staging/sm/object/isSealed.js b/test/staging/sm/object/isSealed.js new file mode 100644 index 0000000000..e310e7e7bd --- /dev/null +++ b/test/staging/sm/object/isSealed.js @@ -0,0 +1,27 @@ +/* + * Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/licenses/publicdomain/ + */ + +/*--- +includes: [sm/non262-object-shell.js, sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +var BUGNUMBER = 1062860; +var summary = "Object.isSealed() should return true when given primitive values as input"; + +print(BUGNUMBER + ": " + summary); +assert.sameValue(Object.isSealed(), true); +assert.sameValue(Object.isSealed(undefined), true); +assert.sameValue(Object.isSealed(null), true); +assert.sameValue(Object.isSealed(1), true); +assert.sameValue(Object.isSealed("foo"), true); +assert.sameValue(Object.isSealed(true), true); +if (typeof Symbol === "function") { + assert.sameValue(Object.isSealed(Symbol()), true); +} + diff --git a/test/staging/sm/object/keys.js b/test/staging/sm/object/keys.js new file mode 100644 index 0000000000..3e7a6c8e63 --- /dev/null +++ b/test/staging/sm/object/keys.js @@ -0,0 +1,29 @@ +/* + * Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/licenses/publicdomain/ + */ + +/*--- +includes: [deepEqual.js, sm/non262-object-shell.js, sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +var BUGNUMBER = 1038545; +var summary = "Coerce the argument passed to Object.keys using ToObject"; +print(BUGNUMBER + ": " + summary); + +assertThrowsInstanceOf(() => Object.keys(), TypeError); +assertThrowsInstanceOf(() => Object.keys(undefined), TypeError); +assertThrowsInstanceOf(() => Object.keys(null), TypeError); + +assert.deepEqual(Object.keys(1), []); +assert.deepEqual(Object.keys(true), []); +if (typeof Symbol === "function") { + assert.deepEqual(Object.keys(Symbol("foo")), []); +} + +assert.deepEqual(Object.keys("foo"), ["0", "1", "2"]); + diff --git a/test/staging/sm/object/method-non-constructor.js b/test/staging/sm/object/method-non-constructor.js new file mode 100644 index 0000000000..4132ed7a18 --- /dev/null +++ b/test/staging/sm/object/method-non-constructor.js @@ -0,0 +1,21 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-object-shell.js, sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +var obj = { method() { } }; +assertThrowsInstanceOf(() => { + new obj.method; +}, TypeError); + +obj = { constructor() { } }; +assertThrowsInstanceOf(() => { + new obj.constructor; +}, TypeError); + diff --git a/test/staging/sm/object/mutation-prevention-methods.js b/test/staging/sm/object/mutation-prevention-methods.js new file mode 100644 index 0000000000..b0397ad012 --- /dev/null +++ b/test/staging/sm/object/mutation-prevention-methods.js @@ -0,0 +1,128 @@ +/* + * Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/licenses/publicdomain/ + */ + +/*--- +includes: [sm/non262-object-shell.js, sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +var gTestfile = 'mutation-prevention-methods.js'; +//----------------------------------------------------------------------------- +var BUGNUMBER = 492849; +var summary = 'Object.is{Sealed,Frozen}, Object.{seal,freeze}'; + +print(BUGNUMBER + ": " + summary); + +/************** + * BEGIN TEST * + **************/ + +// Empty object + +var o1 = {}; + +assert.sameValue(Object.isExtensible(o1), true); +assert.sameValue(Object.isSealed(o1), false); +assert.sameValue(Object.isFrozen(o1), false); + +Object.preventExtensions(o1); + +// An non-extensible empty object has no properties, so it is vacuously sealed +// and frozen. +assert.sameValue(Object.isExtensible(o1), false); +assert.sameValue(Object.isSealed(o1), true); +assert.sameValue(Object.isFrozen(o1), true); + + +// Object with a data property + +var o2 = { 1: 2 }; + +assert.sameValue(Object.isExtensible(o2), true); +assert.sameValue(Object.isSealed(o2), false); +assert.sameValue(Object.isFrozen(o2), false); + +Object.preventExtensions(o2); + +assert.sameValue(Object.isExtensible(o2), false); +assert.sameValue(Object.isSealed(o2), false); +assert.sameValue(Object.isFrozen(o2), false); + +Object.seal(o2); + +assert.sameValue(Object.isExtensible(o2), false); +assert.sameValue(Object.isSealed(o2), true); +assert.sameValue(Object.isFrozen(o2), false); + +assert.sameValue(o2[1], 2); + +var desc; + +desc = Object.getOwnPropertyDescriptor(o2, "1"); +assert.sameValue(typeof desc, "object"); +assert.sameValue(desc.enumerable, true); +assert.sameValue(desc.configurable, false); +assert.sameValue(desc.value, 2); +assert.sameValue(desc.writable, true); + +o2[1] = 17; + +assert.sameValue(o2[1], 17); + +desc = Object.getOwnPropertyDescriptor(o2, "1"); +assert.sameValue(typeof desc, "object"); +assert.sameValue(desc.enumerable, true); +assert.sameValue(desc.configurable, false); +assert.sameValue(desc.value, 17); +assert.sameValue(desc.writable, true); + +Object.freeze(o2); + +assert.sameValue(o2[1], 17); + +desc = Object.getOwnPropertyDescriptor(o2, "1"); +assert.sameValue(typeof desc, "object"); +assert.sameValue(desc.enumerable, true); +assert.sameValue(desc.configurable, false); +assert.sameValue(desc.value, 17); +assert.sameValue(desc.writable, false); + + +// Object with an accessor property + +var o3 = { get foo() { return 17; } }; + +assert.sameValue(Object.isExtensible(o3), true); +assert.sameValue(Object.isSealed(o3), false); +assert.sameValue(Object.isFrozen(o3), false); + +Object.preventExtensions(o3); + +assert.sameValue(Object.isExtensible(o3), false); +assert.sameValue(Object.isSealed(o3), false); +assert.sameValue(Object.isFrozen(o3), false); + +Object.seal(o3); + +// An accessor property in a sealed object is unchanged if that object is +// frozen, so a sealed object containing only accessor properties is also +// vacuously frozen. +assert.sameValue(Object.isExtensible(o3), false); +assert.sameValue(Object.isSealed(o3), true); +assert.sameValue(Object.isFrozen(o3), true); + +Object.freeze(o3); + +assert.sameValue(Object.isExtensible(o3), false); +assert.sameValue(Object.isSealed(o3), true); +assert.sameValue(Object.isFrozen(o3), true); + + +/******************************************************************************/ + +print("All tests passed!"); diff --git a/test/staging/sm/object/object-create-with-primitive-second-arg.js b/test/staging/sm/object/object-create-with-primitive-second-arg.js new file mode 100644 index 0000000000..5c0836a9f7 --- /dev/null +++ b/test/staging/sm/object/object-create-with-primitive-second-arg.js @@ -0,0 +1,17 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-object-shell.js, sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +[1, "", true, Symbol(), undefined].forEach(props => { + assert.sameValue(Object.getPrototypeOf(Object.create(null, props)), null); +}); + +assertThrowsInstanceOf(() => Object.create(null, null), TypeError); + diff --git a/test/staging/sm/object/object-toString-01.js b/test/staging/sm/object/object-toString-01.js new file mode 100644 index 0000000000..f1143e8532 --- /dev/null +++ b/test/staging/sm/object/object-toString-01.js @@ -0,0 +1,49 @@ +/* + * Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/licenses/publicdomain/ + */ + +/*--- +includes: [sm/non262-object-shell.js, sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +var gTestfile = 'object-toString-01.js'; +//----------------------------------------------------------------------------- +var BUGNUMBER = 575522; +var summary = '({}).toString.call(null) == "[object Null]", ' + + '({}).toString.call(undefined) == "[object Undefined]", '; + +print(BUGNUMBER + ": " + summary); + +/************** + * BEGIN TEST * + **************/ + +var toString = Object.prototype.toString; + +assert.sameValue(toString.call(null), "[object Null]"); +assert.sameValue(toString.call(undefined), "[object Undefined]"); + +assert.sameValue(toString.call(true), "[object Boolean]"); +assert.sameValue(toString.call(false), "[object Boolean]"); + +assert.sameValue(toString.call(0), "[object Number]"); +assert.sameValue(toString.call(-0), "[object Number]"); +assert.sameValue(toString.call(1), "[object Number]"); +assert.sameValue(toString.call(-1), "[object Number]"); +assert.sameValue(toString.call(NaN), "[object Number]"); +assert.sameValue(toString.call(Infinity), "[object Number]"); +assert.sameValue(toString.call(-Infinity), "[object Number]"); + +assert.sameValue(toString.call("foopy"), "[object String]"); + +assert.sameValue(toString.call({}), "[object Object]"); + + +/******************************************************************************/ + +print("All tests passed!"); diff --git a/test/staging/sm/object/preventExtensions-idempotent.js b/test/staging/sm/object/preventExtensions-idempotent.js new file mode 100644 index 0000000000..3ac4848ee6 --- /dev/null +++ b/test/staging/sm/object/preventExtensions-idempotent.js @@ -0,0 +1,33 @@ +/* + * Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/licenses/publicdomain/ + */ + +/*--- +includes: [sm/non262-object-shell.js, sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +var gTestfile = 'preventExtensions-idempotent.js'; +//----------------------------------------------------------------------------- +var BUGNUMBER = 599459; +var summary = 'Object.preventExtensions should be idempotent'; + +print(BUGNUMBER + ": " + summary); + +/************** + * BEGIN TEST * + **************/ + +var obj = {}; +assert.sameValue(Object.preventExtensions(obj), obj); +assert.sameValue(Object.isExtensible(obj), false); +assert.sameValue(Object.preventExtensions(obj), obj); +assert.sameValue(Object.isExtensible(obj), false); + +/******************************************************************************/ + +print("All tests passed!"); diff --git a/test/staging/sm/object/preventExtensions-proxy.js b/test/staging/sm/object/preventExtensions-proxy.js new file mode 100644 index 0000000000..10a42f5679 --- /dev/null +++ b/test/staging/sm/object/preventExtensions-proxy.js @@ -0,0 +1,33 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [deepEqual.js, sm/non262-object-shell.js, sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +/* Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/publicdomain/zero/1.0/ */ + +function logProxy(object = {}, handler = {}) { + var log = []; + var proxy = new Proxy(object, new Proxy(handler, { + get(target, propertyKey, receiver) { + log.push(propertyKey); + return target[propertyKey]; + } + })); + return {proxy, log}; +} + +var {proxy, log} = logProxy(); +Object.preventExtensions(proxy); +assert.deepEqual(log, ["preventExtensions"]); + +var {proxy, log} = logProxy(); +Object.preventExtensions(Object.preventExtensions(proxy)); +assert.deepEqual(log, ["preventExtensions", "preventExtensions"]); + diff --git a/test/staging/sm/object/preventExtensions.js b/test/staging/sm/object/preventExtensions.js new file mode 100644 index 0000000000..e261c68df0 --- /dev/null +++ b/test/staging/sm/object/preventExtensions.js @@ -0,0 +1,27 @@ +/* + * Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/licenses/publicdomain/ + */ + +/*--- +includes: [sm/non262-object-shell.js, sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +var BUGNUMBER = 1073446; +var summary = "Object.preventExtensions() should return its argument with no conversion when the argument is a primitive value"; + +print(BUGNUMBER + ": " + summary); +assert.sameValue(Object.preventExtensions(), undefined); +assert.sameValue(Object.preventExtensions(undefined), undefined); +assert.sameValue(Object.preventExtensions(null), null); +assert.sameValue(Object.preventExtensions(1), 1); +assert.sameValue(Object.preventExtensions("foo"), "foo"); +assert.sameValue(Object.preventExtensions(true), true); +if (typeof Symbol === "function") { + assert.sameValue(Object.preventExtensions(Symbol.for("foo")), Symbol.for("foo")); +} + diff --git a/test/staging/sm/object/property-descriptor-order.js b/test/staging/sm/object/property-descriptor-order.js new file mode 100644 index 0000000000..dc0a1f7322 --- /dev/null +++ b/test/staging/sm/object/property-descriptor-order.js @@ -0,0 +1,27 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [deepEqual.js, sm/non262-object-shell.js, sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +var names = Object.getOwnPropertyNames(Object.getOwnPropertyDescriptor({foo: 0}, "foo")); +assert.deepEqual(names, ["value", "writable", "enumerable", "configurable"]); + +names = Object.getOwnPropertyNames(Object.getOwnPropertyDescriptor({get foo(){}}, "foo")); +assert.deepEqual(names, ["get", "set", "enumerable", "configurable"]); + +var proxy = new Proxy({}, { + defineProperty(target, key, desc) { + var names = Object.getOwnPropertyNames(desc); + assert.deepEqual(names, ["set", "configurable"]); + return true; + } +}); + +Object.defineProperty(proxy, "foo", {configurable: true, set: function() {}}); + diff --git a/test/staging/sm/object/propertyIsEnumerable-proxy.js b/test/staging/sm/object/propertyIsEnumerable-proxy.js new file mode 100644 index 0000000000..c5b2ae3ee6 --- /dev/null +++ b/test/staging/sm/object/propertyIsEnumerable-proxy.js @@ -0,0 +1,69 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [deepEqual.js, sm/non262-object-shell.js, sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +/* Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/publicdomain/zero/1.0/ */ + +function logProxy(object) { + var log = []; + var handler = { + getOwnPropertyDescriptor(target, propertyKey) { + log.push(propertyKey); + return Object.getOwnPropertyDescriptor(target, propertyKey); + } + }; + var proxy = new Proxy(object, new Proxy(handler, { + get(target, propertyKey, receiver) { + if (!(propertyKey in target)) { + throw new Error(`Unexpected call to trap: "${propertyKey}"`); + } + return target[propertyKey]; + } + })); + return {proxy, log}; +} + +var properties = ["string-property"]; +if (typeof Symbol === 'function') + properties.push(Symbol("symbol-property")); + +for (var property of properties) { + // Test 1: property is not present on object + var {proxy, log} = logProxy({}); + var result = Object.prototype.propertyIsEnumerable.call(proxy, property); + assert.sameValue(result, false); + assert.deepEqual(log, [property]); + + // Test 2: property is present on object and enumerable + var {proxy, log} = logProxy({[property]: 0}); + var result = Object.prototype.propertyIsEnumerable.call(proxy, property); + assert.sameValue(result, true); + assert.deepEqual(log, [property]); + + // Test 3: property is present on object, but not enumerable + var {proxy, log} = logProxy(Object.defineProperty({[property]: 0}, property, {enumerable: false})); + var result = Object.prototype.propertyIsEnumerable.call(proxy, property); + assert.sameValue(result, false); + assert.deepEqual(log, [property]); + + // Test 4: property is present on prototype object + var {proxy, log} = logProxy(Object.create({[property]: 0})); + var result = Object.prototype.propertyIsEnumerable.call(proxy, property); + assert.sameValue(result, false); + assert.deepEqual(log, [property]); + + // Test 5: property is present on prototype object, prototype is proxy object + var {proxy, log} = logProxy({[property]: 0}); + var result = Object.prototype.propertyIsEnumerable.call(Object.create(proxy), property); + assert.sameValue(result, false); + assert.deepEqual(log, []); +} + diff --git a/test/staging/sm/object/propertyIsEnumerable.js b/test/staging/sm/object/propertyIsEnumerable.js new file mode 100644 index 0000000000..2ff4490bf5 --- /dev/null +++ b/test/staging/sm/object/propertyIsEnumerable.js @@ -0,0 +1,204 @@ +/* + * Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/licenses/publicdomain/ + */ + +/*--- +includes: [sm/non262-object-shell.js, sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +var gTestfile = 'propertyIsEnumerable.js'; +var BUGNUMBER = 619283; +var summary = "Object.prototype.propertyIsEnumerable"; + +print(BUGNUMBER + ": " + summary); + +/************** + * BEGIN TEST * + **************/ + +function expectThrowError(errorCtor, fun) +{ + try + { + var r = fun(); + throw "didn't throw TypeError, returned " + r; + } + catch (e) + { + assert.sameValue(e instanceof errorCtor, true, + "didn't throw " + errorCtor.prototype.name + ", got: " + e); + } +} + +function expectThrowTypeError(fun) +{ + expectThrowError(TypeError, fun); +} + +function withToString(fun) +{ + return { toString: fun }; +} + +function withValueOf(fun) +{ + return { toString: null, valueOf: fun }; +} + +var propertyIsEnumerable = Object.prototype.propertyIsEnumerable; + +/* + * 1. Let P be ToString(V). + */ +expectThrowError(ReferenceError, function() +{ + propertyIsEnumerable(withToString(function() { fahslkjdfhlkjdsl; })); +}); +expectThrowError(ReferenceError, function() +{ + propertyIsEnumerable.call(null, withToString(function() { fahslkjdfhlkjdsl; })); +}); +expectThrowError(ReferenceError, function() +{ + propertyIsEnumerable.call(undefined, withToString(function() { fahslkjdfhlkjdsl; })); +}); + +expectThrowError(ReferenceError, function() +{ + propertyIsEnumerable(withValueOf(function() { fahslkjdfhlkjdsl; })); +}); +expectThrowError(ReferenceError, function() +{ + propertyIsEnumerable.call(null, withValueOf(function() { fahslkjdfhlkjdsl; })); +}); +expectThrowError(ReferenceError, function() +{ + propertyIsEnumerable.call(undefined, withValueOf(function() { fahslkjdfhlkjdsl; })); +}); + +expectThrowError(SyntaxError, function() +{ + propertyIsEnumerable(withToString(function() { eval("}"); })); +}); +expectThrowError(SyntaxError, function() +{ + propertyIsEnumerable.call(null, withToString(function() { eval("}"); })); +}); +expectThrowError(SyntaxError, function() +{ + propertyIsEnumerable.call(undefined, withToString(function() { eval("}"); })); +}); + +expectThrowError(SyntaxError, function() +{ + propertyIsEnumerable(withValueOf(function() { eval("}"); })); +}); +expectThrowError(SyntaxError, function() +{ + propertyIsEnumerable.call(null, withValueOf(function() { eval("}"); })); +}); +expectThrowError(SyntaxError, function() +{ + propertyIsEnumerable.call(undefined, withValueOf(function() { eval("}"); })); +}); + +expectThrowError(RangeError, function() +{ + propertyIsEnumerable(withToString(function() { [].length = -1; })); +}); +expectThrowError(RangeError, function() +{ + propertyIsEnumerable.call(null, withToString(function() { [].length = -1; })); +}); +expectThrowError(RangeError, function() +{ + propertyIsEnumerable.call(undefined, withToString(function() { [].length = -1; })); +}); + +expectThrowError(RangeError, function() +{ + propertyIsEnumerable(withValueOf(function() { [].length = -1; })); +}); +expectThrowError(RangeError, function() +{ + propertyIsEnumerable.call(null, withValueOf(function() { [].length = -1; })); +}); +expectThrowError(RangeError, function() +{ + propertyIsEnumerable.call(undefined, withValueOf(function() { [].length = -1; })); +}); + +expectThrowError(RangeError, function() +{ + propertyIsEnumerable(withToString(function() { [].length = 0.7; })); +}); +expectThrowError(RangeError, function() +{ + propertyIsEnumerable.call(null, withToString(function() { [].length = 0.7; })); +}); +expectThrowError(RangeError, function() +{ + propertyIsEnumerable.call(undefined, withToString(function() { [].length = 0.7; })); +}); + +expectThrowError(RangeError, function() +{ + propertyIsEnumerable(withValueOf(function() { [].length = 0.7; })); +}); +expectThrowError(RangeError, function() +{ + propertyIsEnumerable.call(null, withValueOf(function() { [].length = 0.7; })); +}); +expectThrowError(RangeError, function() +{ + propertyIsEnumerable.call(undefined, withValueOf(function() { [].length = 0.7; })); +}); + +/* + * 2. Let O be the result of calling ToObject passing the this value as the + * argument. + */ +expectThrowTypeError(function() { propertyIsEnumerable("s"); }); +expectThrowTypeError(function() { propertyIsEnumerable.call(null, "s"); }); +expectThrowTypeError(function() { propertyIsEnumerable.call(undefined, "s"); }); +expectThrowTypeError(function() { propertyIsEnumerable(true); }); +expectThrowTypeError(function() { propertyIsEnumerable.call(null, true); }); +expectThrowTypeError(function() { propertyIsEnumerable.call(undefined, true); }); +expectThrowTypeError(function() { propertyIsEnumerable(NaN); }); +expectThrowTypeError(function() { propertyIsEnumerable.call(null, NaN); }); +expectThrowTypeError(function() { propertyIsEnumerable.call(undefined, NaN); }); + +expectThrowTypeError(function() { propertyIsEnumerable({}); }); +expectThrowTypeError(function() { propertyIsEnumerable.call(null, {}); }); +expectThrowTypeError(function() { propertyIsEnumerable.call(undefined, {}); }); + +/* + * 3. Let desc be the result of calling the [[GetOwnProperty]] internal method + * of O passing P as the argument. + * 4. If desc is undefined, return false. + */ +assert.sameValue(propertyIsEnumerable.call({}, "valueOf"), false); +assert.sameValue(propertyIsEnumerable.call({}, "toString"), false); +assert.sameValue(propertyIsEnumerable.call("s", 1), false); +assert.sameValue(propertyIsEnumerable.call({}, "dsfiodjfs"), false); +assert.sameValue(propertyIsEnumerable.call(true, "toString"), false); +assert.sameValue(propertyIsEnumerable.call({}, "__proto__"), false); + +assert.sameValue(propertyIsEnumerable.call(Object, "getOwnPropertyDescriptor"), false); +assert.sameValue(propertyIsEnumerable.call(this, "expectThrowTypeError"), true); +assert.sameValue(propertyIsEnumerable.call("s", "length"), false); +assert.sameValue(propertyIsEnumerable.call("s", 0), true); +assert.sameValue(propertyIsEnumerable.call(Number, "MAX_VALUE"), false); +assert.sameValue(propertyIsEnumerable.call({ x: 9 }, "x"), true); +assert.sameValue(propertyIsEnumerable.call(function() { }, "prototype"), false); +assert.sameValue(propertyIsEnumerable.call(function() { }, "length"), false); +assert.sameValue(propertyIsEnumerable.call(function() { "use strict"; }, "caller"), false); + +/******************************************************************************/ + +print("All tests passed!"); diff --git a/test/staging/sm/object/proto-property-change-writability-set.js b/test/staging/sm/object/proto-property-change-writability-set.js new file mode 100644 index 0000000000..7dfe9a92e8 --- /dev/null +++ b/test/staging/sm/object/proto-property-change-writability-set.js @@ -0,0 +1,59 @@ +/* + * Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/licenses/publicdomain/ + */ + +/*--- +includes: [sm/non262-object-shell.js, sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +//----------------------------------------------------------------------------- +var BUGNUMBER = 713944; +var summary = + "Don't assert anything about a shape from the property cache until it's " + + "known the cache entry matches"; + +print(BUGNUMBER + ": " + summary); + +/************** + * BEGIN TEST * + **************/ + +var accDesc = { set: function() {} }; +var dataDesc = { value: 3 }; + +function f() +{ + propertyIsEnumerable = {}; +} +function g() +{ + propertyIsEnumerable = {}; +} + +Object.defineProperty(Object.prototype, "propertyIsEnumerable", accDesc); +f(); +Object.defineProperty(Object.prototype, "propertyIsEnumerable", dataDesc); +assert.sameValue(propertyIsEnumerable, 3); +f(); +assert.sameValue(propertyIsEnumerable, 3); +g(); +assert.sameValue(propertyIsEnumerable, 3); + + + +var a = { p1: 1, p2: 2 }; +var b = Object.create(a); +Object.defineProperty(a, "p1", {set: function () {}}); +for (var i = 0; i < 2; i++) +{ + b.p1 = {}; + Object.defineProperty(a, "p1", {value: 3}); +} +assert.sameValue(b.p1, 3); +assert.sameValue(a.p1, 3); + diff --git a/test/staging/sm/object/regress-459405.js b/test/staging/sm/object/regress-459405.js new file mode 100644 index 0000000000..ea4989eb63 --- /dev/null +++ b/test/staging/sm/object/regress-459405.js @@ -0,0 +1,43 @@ +/* + * Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/licenses/publicdomain/ + */ + +/*--- +includes: [sm/non262-object-shell.js, sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +//----------------------------------------------------------------------------- +var BUGNUMBER = 459405; +var summary = 'Math is not ReadOnly'; +var actual = ''; +var expect = ''; + + +//----------------------------------------------------------------------------- +test(); +//----------------------------------------------------------------------------- + +function test() +{ + printBugNumber(BUGNUMBER); + printStatus (summary); + + expect = 'foo'; + + try + { + var Math = 'foo'; + actual = Math; + } + catch(ex) + { + actual = ex + ''; + } + + assert.sameValue(expect, actual, summary); +} diff --git a/test/staging/sm/object/seal-proxy.js b/test/staging/sm/object/seal-proxy.js new file mode 100644 index 0000000000..3673393590 --- /dev/null +++ b/test/staging/sm/object/seal-proxy.js @@ -0,0 +1,37 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [deepEqual.js, sm/non262-object-shell.js, sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +/* Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/publicdomain/zero/1.0/ */ + +function logProxy(object = {}, handler = {}) { + var log = []; + var proxy = new Proxy(object, new Proxy(handler, { + get(target, propertyKey, receiver) { + log.push(propertyKey); + return target[propertyKey]; + } + })); + return {proxy, log}; +} + +// The order of operations is backwards when compared to ES6 draft rev 27 +// (2014 August 24), but see https://bugs.ecmascript.org/show_bug.cgi?id=3215 +// for an explanation on why the spec version is clearly wrong. + +var {proxy, log} = logProxy(); +Object.seal(proxy); +assert.deepEqual(log, ["preventExtensions", "ownKeys"]); + +var {proxy, log} = logProxy(); +Object.seal(Object.seal(proxy)); +assert.deepEqual(log, ["preventExtensions", "ownKeys", "preventExtensions", "ownKeys"]); + diff --git a/test/staging/sm/object/seal.js b/test/staging/sm/object/seal.js new file mode 100644 index 0000000000..3f994612de --- /dev/null +++ b/test/staging/sm/object/seal.js @@ -0,0 +1,27 @@ +/* + * Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/licenses/publicdomain/ + */ + +/*--- +includes: [sm/non262-object-shell.js, sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +var BUGNUMBER = 1075294; +var summary = "Object.seal() should return its argument with no conversion when the argument is a primitive value"; + +print(BUGNUMBER + ": " + summary); +assert.sameValue(Object.seal(), undefined); +assert.sameValue(Object.seal(undefined), undefined); +assert.sameValue(Object.seal(null), null); +assert.sameValue(Object.seal(1), 1); +assert.sameValue(Object.seal("foo"), "foo"); +assert.sameValue(Object.seal(true), true); +if (typeof Symbol === "function") { + assert.sameValue(Object.seal(Symbol.for("foo")), Symbol.for("foo")); +} + diff --git a/test/staging/sm/object/setPrototypeOf-cross-realm-cycle.js b/test/staging/sm/object/setPrototypeOf-cross-realm-cycle.js new file mode 100644 index 0000000000..28c539be83 --- /dev/null +++ b/test/staging/sm/object/setPrototypeOf-cross-realm-cycle.js @@ -0,0 +1,21 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-object-shell.js, sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +// The cycle check in 9.1.2 [[SetPrototypeOf]] prevents cross-realm cycles +// involving only ordinary objects. + +var gw = createNewGlobal(); + +var obj = {}; +var w = gw.Object.create(obj); +assertThrowsInstanceOf(() => Object.setPrototypeOf(obj, w), TypeError); +assertThrowsInstanceOf(() => gw.Object.setPrototypeOf(obj, w), gw.TypeError); + diff --git a/test/staging/sm/object/setPrototypeOf-same-value.js b/test/staging/sm/object/setPrototypeOf-same-value.js new file mode 100644 index 0000000000..c89f9db99d --- /dev/null +++ b/test/staging/sm/object/setPrototypeOf-same-value.js @@ -0,0 +1,21 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-object-shell.js, sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +// Setting a "new" prototype to the current [[Prototype]] value should never fail + +var x = {}, t = Object.create(x); +Object.preventExtensions(t); +// Should not fail, because it is the same [[Prototype]] value +Object.setPrototypeOf(t, x); + +// Object.prototype's [[Prototype]] is immutable, make sure we can still set null +Object.setPrototypeOf(Object.prototype, null); + diff --git a/test/staging/sm/object/toLocaleString-01.js b/test/staging/sm/object/toLocaleString-01.js new file mode 100644 index 0000000000..68475547db --- /dev/null +++ b/test/staging/sm/object/toLocaleString-01.js @@ -0,0 +1,22 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +flags: +- onlyStrict +includes: [sm/non262-object-shell.js, sm/non262-shell.js, sm/non262.js] +description: | + pending +esid: pending +---*/ +"use strict"; + +Object.defineProperty(String.prototype, "toString", { + get() { + assert.sameValue(typeof this, "string"); + + return function() { return typeof this; }; + } +}) +assert.sameValue(Object.prototype.toLocaleString.call("test"), "string"); + diff --git a/test/staging/sm/object/toLocaleString.js b/test/staging/sm/object/toLocaleString.js new file mode 100644 index 0000000000..924f3bf2c6 --- /dev/null +++ b/test/staging/sm/object/toLocaleString.js @@ -0,0 +1,107 @@ +/* + * Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/licenses/publicdomain/ + */ + +/*--- +includes: [sm/non262-object-shell.js, sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +var gTestfile = 'toLocaleString.js'; +var BUGNUMBER = 653789; +var summary = "Object.prototype.toLocaleString"; + +print(BUGNUMBER + ": " + summary); + +/************** + * BEGIN TEST * + **************/ + +function expectThrowTypeError(fun) +{ + try + { + var r = fun(); + throw "didn't throw TypeError, returned " + r; + } + catch (e) + { + assert.sameValue(e instanceof TypeError, true, + "didn't throw TypeError, got: " + e); + } +} + +var toLocaleString = Object.prototype.toLocaleString; + +/* + * 1. Let O be the result of calling ToObject passing the this value as the + * argument. + */ +expectThrowTypeError(function() { toLocaleString.call(null); }); +expectThrowTypeError(function() { toLocaleString.call(undefined); }); +expectThrowTypeError(function() { toLocaleString.apply(null); }); +expectThrowTypeError(function() { toLocaleString.apply(undefined); }); + + +/* + * 2. Let toString be the result of calling the [[Get]] internal method of O + * passing "toString" as the argument. + */ +try +{ + toLocaleString.call({ get toString() { throw 17; } }); + throw new Error("didn't throw"); +} +catch (e) +{ + assert.sameValue(e, 17); +} + + +/* 3. If IsCallable(toString) is false, throw a TypeError exception. */ +expectThrowTypeError(function() { toLocaleString.call({ toString: 12 }); }); +expectThrowTypeError(function() { toLocaleString.call({ toString: 0.3423423452352e9 }); }); +expectThrowTypeError(function() { toLocaleString.call({ toString: undefined }); }); +expectThrowTypeError(function() { toLocaleString.call({ toString: false }); }); +expectThrowTypeError(function() { toLocaleString.call({ toString: [] }); }); +expectThrowTypeError(function() { toLocaleString.call({ toString: {} }); }); +expectThrowTypeError(function() { toLocaleString.call({ toString: new String }); }); +expectThrowTypeError(function() { toLocaleString.call({ toString: new Number(7.7) }); }); +expectThrowTypeError(function() { toLocaleString.call({ toString: new Boolean(true) }); }); +expectThrowTypeError(function() { toLocaleString.call({ toString: JSON }); }); + +expectThrowTypeError(function() { toLocaleString.call({ valueOf: 0, toString: 12 }); }); +expectThrowTypeError(function() { toLocaleString.call({ valueOf: 0, toString: 0.3423423452352e9 }); }); +expectThrowTypeError(function() { toLocaleString.call({ valueOf: 0, toString: undefined }); }); +expectThrowTypeError(function() { toLocaleString.call({ valueOf: 0, toString: false }); }); +expectThrowTypeError(function() { toLocaleString.call({ valueOf: 0, toString: [] }); }); +expectThrowTypeError(function() { toLocaleString.call({ valueOf: 0, toString: {} }); }); +expectThrowTypeError(function() { toLocaleString.call({ valueOf: 0, toString: new String }); }); +expectThrowTypeError(function() { toLocaleString.call({ valueOf: 0, toString: new Number(7.7) }); }); +expectThrowTypeError(function() { toLocaleString.call({ valueOf: 0, toString: new Boolean(true) }); }); +expectThrowTypeError(function() { toLocaleString.call({ valueOf: 0, toString: JSON }); }); + + +/* + * 4. Return the result of calling the [[Call]] internal method of toString + * passing O as the this value and no arguments. + */ +assert.sameValue(toLocaleString.call({ get toString() { return function() { return "foo"; } } }), + "foo"); + +var obj = { toString: function() { assert.sameValue(this, obj); assert.sameValue(arguments.length, 0); return 5; } }; +assert.sameValue(toLocaleString.call(obj), 5); + +assert.sameValue(toLocaleString.call({ toString: function() { return obj; } }), obj); + +assert.sameValue(toLocaleString.call({ toString: function() { return obj; }, + valueOf: function() { return "abc"; } }), + obj); + +/******************************************************************************/ + +print("All tests passed!"); diff --git a/test/staging/sm/object/toPrimitive-callers.js b/test/staging/sm/object/toPrimitive-callers.js new file mode 100644 index 0000000000..77520b581a --- /dev/null +++ b/test/staging/sm/object/toPrimitive-callers.js @@ -0,0 +1,67 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-object-shell.js, sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +// Check all the algorithms that call ToPrimitive. Confirm that they're passing +// the correct hint, per spec. + +var STRING = "xyzzy"; +var NUMBER = 42; + +function assertCallsToPrimitive(f, expectedHint, expectedResult) { + var hint = undefined; + var testObj = { + [Symbol.toPrimitive](h) { + assert.sameValue(hint, undefined); + hint = h; + return h === "number" ? NUMBER : STRING; + } + }; + var result = f(testObj); + assert.sameValue(hint, expectedHint, String(f)); + assert.sameValue(result, expectedResult, String(f)); +} + +// ToNumber +assertCallsToPrimitive(Number, "number", NUMBER); + +// ToString +assertCallsToPrimitive(String, "string", STRING); + +// ToPropertyKey +var obj = {[STRING]: "pass"}; +assertCallsToPrimitive(key => obj[key], "string", "pass"); + +// Abstract Relational Comparison +assertCallsToPrimitive(x => x >= 42, "number", true); +assertCallsToPrimitive(x => x > "42", "number", false); + +// Abstract Equality Comparison +assertCallsToPrimitive(x => x != STRING, "default", false); +assertCallsToPrimitive(x => STRING == x, "default", true); +assertCallsToPrimitive(x => x == NUMBER, "default", false); +assertCallsToPrimitive(x => NUMBER != x, "default", true); + +// Addition +assertCallsToPrimitive(x => 1 + x, "default", "1" + STRING); +assertCallsToPrimitive(x => "" + x, "default", STRING); + +// Date constructor +assertCallsToPrimitive(x => (new Date(x)).valueOf(), "default", Number(STRING)); + +// Date.prototype.toJSON +var expected = "a suffusion of yellow"; +function testJSON(x) { + x.toJSON = Date.prototype.toJSON; + x.toISOString = function () { return expected; }; + return JSON.stringify(x); +} +assertCallsToPrimitive(testJSON, "number", JSON.stringify(expected)); + diff --git a/test/staging/sm/object/toPrimitive.js b/test/staging/sm/object/toPrimitive.js new file mode 100644 index 0000000000..a100bc3093 --- /dev/null +++ b/test/staging/sm/object/toPrimitive.js @@ -0,0 +1,111 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [deepEqual.js, sm/non262-object-shell.js, sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +// ES6 7.1.1 ToPrimitive(input [, PreferredType]) specifies a new extension +// point in the language. Objects can override the behavior of ToPrimitive +// somewhat by supporting the method obj[@@toPrimitive](hint). +// +// (Rationale: ES5 had a [[DefaultValue]] internal method, overridden only by +// Date objects. The change in ES6 is to make [[DefaultValue]] a plain old +// method. This allowed ES6 to eliminate the [[DefaultValue]] internal method, +// simplifying the meta-object protocol and thus proxies.) + +// obj[Symbol.toPrimitive]() is called whenever the ToPrimitive algorithm is invoked. +var expectedThis, expectedHint; +var obj = { + [Symbol.toPrimitive](hint, ...rest) { + assert.sameValue(this, expectedThis); + assert.sameValue(hint, expectedHint); + assert.sameValue(rest.length, 0); + return 2015; + } +}; +expectedThis = obj; +expectedHint = "string"; +assert.sameValue(String(obj), "2015"); +expectedHint = "number"; +assert.sameValue(Number(obj), 2015); + +// It is called even through proxies. +var proxy = new Proxy(obj, {}); +expectedThis = proxy; +expectedHint = "default"; +assert.sameValue("ES" + proxy, "ES2015"); + +// It is called even through additional proxies and the prototype chain. +proxy = new Proxy(Object.create(proxy), {}); +expectedThis = proxy; +expectedHint = "default"; +assert.sameValue("ES" + (proxy + 1), "ES2016"); + +// It is not called if the operand is already a primitive. +var ok = true; +for (var constructor of [Boolean, Number, String, Symbol]) { + constructor.prototype[Symbol.toPrimitive] = function () { + ok = false; + throw "FAIL"; + }; +} +assert.sameValue(Number(true), 1); +assert.sameValue(Number(77.7), 77.7); +assert.sameValue(Number("123"), 123); +assertThrowsInstanceOf(() => Number(Symbol.iterator), TypeError); +assert.sameValue(String(true), "true"); +assert.sameValue(String(77.7), "77.7"); +assert.sameValue(String("123"), "123"); +assert.sameValue(String(Symbol.iterator), "Symbol(Symbol.iterator)"); +assert.sameValue(ok, true); + +// Converting a primitive symbol to another primitive type throws even if you +// delete the @@toPrimitive method from Symbol.prototype. +delete Symbol.prototype[Symbol.toPrimitive]; +var sym = Symbol("ok"); +assertThrowsInstanceOf(() => `${sym}`, TypeError); +assertThrowsInstanceOf(() => Number(sym), TypeError); +assertThrowsInstanceOf(() => "" + sym, TypeError); + +// However, having deleted that method, converting a Symbol wrapper object does +// work: it calls Symbol.prototype.toString(). +obj = Object(sym); +assert.sameValue(String(obj), "Symbol(ok)"); +assert.sameValue(`${obj}`, "Symbol(ok)"); + +// Deleting valueOf as well makes numeric conversion also call toString(). +delete Symbol.prototype.valueOf; +delete Object.prototype.valueOf; +assert.sameValue(Number(obj), NaN); +Symbol.prototype.toString = function () { return "2060"; }; +assert.sameValue(Number(obj), 2060); + +// Deleting Date.prototype[Symbol.toPrimitive] changes the result of addition +// involving Date objects. +var d = new Date; +assert.sameValue(0 + d, 0 + d.toString()); +delete Date.prototype[Symbol.toPrimitive]; +assert.sameValue(0 + d, 0 + d.valueOf()); + +// If @@toPrimitive, .toString, and .valueOf are all missing, we get a +// particular sequence of property accesses, followed by a TypeError exception. +var log = []; +function doGet(target, propertyName, receiver) { + log.push(propertyName); +} +var handler = new Proxy({}, { + get(target, trapName, receiver) { + if (trapName !== "get") + throw `FAIL: system tried to access handler method: ${String(trapName)}`; + return doGet; + } +}); +proxy = new Proxy(Object.create(null), handler); +assertThrowsInstanceOf(() => proxy == 0, TypeError); +assert.deepEqual(log, [Symbol.toPrimitive, "valueOf", "toString"]); + diff --git a/test/staging/sm/object/vacuous-accessor-unqualified-name.js b/test/staging/sm/object/vacuous-accessor-unqualified-name.js new file mode 100644 index 0000000000..30eb00eec1 --- /dev/null +++ b/test/staging/sm/object/vacuous-accessor-unqualified-name.js @@ -0,0 +1,32 @@ +/* + * Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/licenses/publicdomain/ + */ + +/*--- +includes: [sm/non262-object-shell.js, sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +var gTestfile = 'vacuous-accessor-unqualified-name.js'; +//----------------------------------------------------------------------------- +var BUGNUMBER = 560216; +var summary = + "Using a name referring to a { get: undefined, set: undefined } descriptor " + + "shouldn't assert"; + +print(BUGNUMBER + ": " + summary); + +/************** + * BEGIN TEST * + **************/ + +Object.defineProperty(this, "x", { set: undefined, configurable: true }); +x; + +/******************************************************************************/ + +print("All tests passed!"); diff --git a/test/staging/sm/object/values-entries-indexed.js b/test/staging/sm/object/values-entries-indexed.js new file mode 100644 index 0000000000..0f619dfb36 --- /dev/null +++ b/test/staging/sm/object/values-entries-indexed.js @@ -0,0 +1,80 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [compareArray.js, sm/non262-object-shell.js, sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +function assertSameEntries(actual, expected) { + assert.sameValue(actual.length, expected.length); + for (let i = 0; i < expected.length; ++i) + assert.compareArray(actual[i], expected[i]); +} + +// Test Object.keys/values/entries on objects with indexed properties. + +// Empty dense elements, test with array and plain object. +{ + let array = []; + assert.compareArray(Object.keys(array), []); + assert.compareArray(Object.values(array), []); + assertSameEntries(Object.entries(array), []); + + let object = {}; + assert.compareArray(Object.keys(object), []); + assert.compareArray(Object.values(object), []); + assertSameEntries(Object.entries(object), []); +} + +// Dense elements only, test with array and plain object. +{ + let array = [1, 2, 3]; + assert.compareArray(Object.keys(array), ["0", "1", "2"]); + assert.compareArray(Object.values(array), [1, 2, 3]); + assertSameEntries(Object.entries(array), [["0", 1], ["1", 2], ["2", 3]]); + + let object = {0: 4, 1: 5, 2: 6}; + assert.compareArray(Object.keys(object), ["0", "1", "2"]); + assert.compareArray(Object.values(object), [4, 5, 6]); + assertSameEntries(Object.entries(object), [["0", 4], ["1", 5], ["2", 6]]); +} + +// Extra indexed properties only, test with array and plain object. +{ + let array = []; + Object.defineProperty(array, 0, {configurable: true, enumerable: true, value: 123}); + + assert.compareArray(Object.keys(array), ["0"]); + assert.compareArray(Object.values(array), [123]); + assertSameEntries(Object.entries(array), [["0", 123]]); + + let object = []; + Object.defineProperty(object, 0, {configurable: true, enumerable: true, value: 123}); + + assert.compareArray(Object.keys(object), ["0"]); + assert.compareArray(Object.values(object), [123]); + assertSameEntries(Object.entries(object), [["0", 123]]); +} + +// Dense and extra indexed properties, test with array and plain object. +{ + let array = [1, 2, 3]; + Object.defineProperty(array, 0, {writable: false}); + + assert.compareArray(Object.keys(array), ["0", "1", "2"]); + assert.compareArray(Object.values(array), [1, 2, 3]); + assertSameEntries(Object.entries(array), [["0", 1], ["1", 2], ["2", 3]]); + + let object = {0: 4, 1: 5, 2: 6}; + Object.defineProperty(object, 0, {writable: false}); + + assert.compareArray(Object.keys(object), ["0", "1", "2"]); + assert.compareArray(Object.values(object), [4, 5, 6]); + assertSameEntries(Object.entries(object), [["0", 4], ["1", 5], ["2", 6]]); +} + + diff --git a/test/staging/sm/object/values-entries-lazy-props.js b/test/staging/sm/object/values-entries-lazy-props.js new file mode 100644 index 0000000000..11a4ad37b4 --- /dev/null +++ b/test/staging/sm/object/values-entries-lazy-props.js @@ -0,0 +1,102 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [compareArray.js, sm/non262-object-shell.js, sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +// Return new objects for each test case. +function makeTestCases() { + // Call the resolve hook for arguments/string objects. + const resolveIndex = object => 0 in object; + + // Calls the resolve hook for functions. + const resolveFunction = object => "length" in object; + + const expected = array => ({ + keys: Object.keys(array), + values: Object.values(array), + entries: Object.entries(array), + }); + + return [ + // Mapped arguments objects. + { + object: function(){ return arguments; }(), + resolve: resolveIndex, + ...expected([]), + }, + { + object: function(x){ return arguments; }(1), + resolve: resolveIndex, + ...expected([1]), + }, + { + object: function(x, y, z){ return arguments; }(1, 2, 3), + resolve: resolveIndex, + ...expected([1, 2, 3]), + }, + + // Unmapped arguments objects. + { + object: function(){ "use strict"; return arguments; }(), + resolve: resolveIndex, + ...expected([]), + }, + { + object: function(x){ "use strict"; return arguments; }(1), + resolve: resolveIndex, + ...expected([1]), + }, + { + object: function(x, y, z){ "use strict"; return arguments; }(1, 2, 3), + resolve: resolveIndex, + ...expected([1, 2, 3]), + }, + + // String objects. + { object: new String(""), resolve: resolveIndex, ...expected([]), }, + { object: new String("a"), resolve: resolveIndex, ...expected(["a"]), }, + { object: new String("abc"), resolve: resolveIndex, ...expected(["a","b","c"]), }, + + // Function objects. + { object: function(){}, resolve: resolveFunction, ...expected([]), }, + ]; +} + +var assertWith = { + keys: assert.compareArray, + values: assert.compareArray, + entries(actual, expected) { + assert.sameValue(actual.length, expected.length); + for (let i = 0; i < expected.length; ++i) + assert.compareArray(actual[i], expected[i]); + } +}; + +// Test Object.keys/values/entries on objects with enumerate/resolve hooks. + +for (let method of ["keys", "values", "entries"]) { + let assert = assertWith[method]; + + // Call each method twice to test the case when + // - the enumerate hook wasn't yet called, + // - the enumerate hook was already called. + for (let {object, [method]: expected} of makeTestCases()) { + assert(Object[method](object), expected); + assert(Object[method](object), expected); + } + + // Test the case when enumerate wasn't yet called, but a property was already resolved. + for (let {object, resolve, [method]: expected} of makeTestCases()) { + resolve(object); // Call the resolve hook. + + assert(Object[method](object), expected); + assert(Object[method](object), expected); + } +} + diff --git a/test/staging/sm/object/values-entries-typedarray.js b/test/staging/sm/object/values-entries-typedarray.js new file mode 100644 index 0000000000..2e0c220e53 --- /dev/null +++ b/test/staging/sm/object/values-entries-typedarray.js @@ -0,0 +1,62 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [compareArray.js, sm/non262-object-shell.js, sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +function assertSameEntries(actual, expected) { + assert.sameValue(actual.length, expected.length); + for (let i = 0; i < expected.length; ++i) + assert.compareArray(actual[i], expected[i]); +} + +function throwsTypeError(fn) { + try { + fn(); + } catch (e) { + assert.sameValue(e instanceof TypeError, true); + return true; + } + return false; +} + +// Non-standard: Accessing elements of detached array buffers should throw, but +// this is currently not implemented. +const ACCESS_ON_DETACHED_ARRAY_BUFFER_THROWS = (() => { + let ta = new Int32Array(10); + $262.detachArrayBuffer(ta.buffer); + let throws = throwsTypeError(() => ta[0]); + // Ensure [[Get]] and [[GetOwnProperty]] return consistent results. + assert.sameValue(throwsTypeError(() => Object.getOwnPropertyDescriptor(ta, 0)), throws); + return throws; +})(); + +function maybeThrowOnDetached(fn, returnValue) { + if (ACCESS_ON_DETACHED_ARRAY_BUFFER_THROWS) { + assertThrowsInstanceOf(fn, TypeError); + return returnValue; + } + return fn(); +} + +// Ensure Object.keys/values/entries work correctly on typed arrays. +for (let len of [0, 1, 10]) { + let array = new Array(len).fill(1); + let ta = new Int32Array(array); + + assert.compareArray(Object.keys(ta), Object.keys(array)); + assert.compareArray(Object.values(ta), Object.values(array)); + assertSameEntries(Object.entries(ta), Object.entries(array)); + + $262.detachArrayBuffer(ta.buffer); + + assert.compareArray(maybeThrowOnDetached(() => Object.keys(ta), []), []); + assert.compareArray(maybeThrowOnDetached(() => Object.values(ta), []), []); + assertSameEntries(maybeThrowOnDetached(() => Object.entries(ta), []), []); +} + diff --git a/test/staging/sm/object/values.js b/test/staging/sm/object/values.js new file mode 100644 index 0000000000..8387ecfaf0 --- /dev/null +++ b/test/staging/sm/object/values.js @@ -0,0 +1,100 @@ +/* + * Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/licenses/publicdomain/ + */ + +/*--- +includes: [compareArray.js, sm/non262-object-shell.js, sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +if ("values" in Object) { + assert.sameValue(Object.values.length, 1); + + var o, values; + + o = { a: 3, b: 2 }; + values = Object.values(o); + assert.compareArray(values, [3, 2]); + + o = { get a() { return 17; }, b: 2 }; + values = Object.values(o), + assert.compareArray(values, [17, 2]); + + o = { __iterator__: function() { throw new Error("non-standard __iterator__ called?"); } }; + values = Object.values(o); + assert.compareArray(values, [o.__iterator__]); + + o = { a: 1, b: 2 }; + delete o.a; + o.a = 3; + values = Object.values(o); + assert.compareArray(values, [2, 3]); + + o = [0, 1, 2]; + values = Object.values(o); + assert.compareArray(values, [0, 1, 2]); + + o = /./.exec("abc"); + values = Object.values(o); + assert.compareArray(values, ["a", 0, "abc", undefined]); + + o = { a: 1, b: 2, c: 3 }; + delete o.b; + o.b = 5; + values = Object.values(o); + assert.compareArray(values, [1, 3, 5]); + + function f() { } + f.prototype.p = 1; + o = new f(); + o.g = 1; + values = Object.values(o); + assert.compareArray(values, [1]); + + var o = {get a() {delete this.b; return 1}, b: 2, c: 3}; + values = Object.values(o); + assert.compareArray(values, [1, 3]); + + assertThrowsInstanceOf(() => Object.values(), TypeError); + assertThrowsInstanceOf(() => Object.values(undefined), TypeError); + assertThrowsInstanceOf(() => Object.values(null), TypeError); + + assert.compareArray(Object.values(1), []); + assert.compareArray(Object.values(true), []); + if (typeof Symbol === "function") + assert.compareArray(Object.values(Symbol("foo")), []); + + assert.compareArray(Object.values("foo"), ["f", "o", "o"]); + + values = Object.values({ + get a(){ + Object.defineProperty(this, "b", {enumerable: false}); + return "A"; + }, + b: "B" + }); + assert.compareArray(values, ["A"]); + + let ownKeysCallCount = 0; + let getOwnPropertyDescriptorCalls = []; + let target = { a: 1, b: 2, c: 3 }; + o = new Proxy(target, { + ownKeys() { + ownKeysCallCount++; + return ["c", "a"]; + }, + getOwnPropertyDescriptor(target, key) { + getOwnPropertyDescriptorCalls.push(key); + return Object.getOwnPropertyDescriptor(target, key); + } + }); + values = Object.values(o); + assert.sameValue(ownKeysCallCount, 1); + assert.compareArray(values, [3, 1]); + assert.compareArray(getOwnPropertyDescriptorCalls, ["c", "a"]); +} + diff --git a/test/staging/sm/regress/regress-10278.js b/test/staging/sm/regress/regress-10278.js new file mode 100644 index 0000000000..df2f0adeea --- /dev/null +++ b/test/staging/sm/regress/regress-10278.js @@ -0,0 +1,51 @@ +/* + * Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/licenses/publicdomain/ + */ + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +/** + * File Name: regress-10278.js + * Reference: https://bugzilla.mozilla.org/show_bug.cgi?id=10278 + * Description: Function declarations do not need to be separated + * by semi-colon if they occur on the same line. + * Author: bob@bclary.com + */ +//----------------------------------------------------------------------------- +var BUGNUMBER = 10278; +var summary = 'Function declarations do not need to be separated by semi-colon'; +var actual; +var expect; + + +//----------------------------------------------------------------------------- +test(); +//----------------------------------------------------------------------------- + +function test() +{ + printBugNumber(BUGNUMBER); + printStatus (summary); + + expect = 'pass'; + try + { + eval("function f(){}function g(){}"); + actual = "pass"; + printStatus('no exception thrown'); + } + catch ( e ) + { + actual = "fail"; + printStatus('exception ' + e.toString() + ' thrown'); + } + + assert.sameValue(expect, actual, summary); +} diff --git a/test/staging/sm/regress/regress-1383630.js b/test/staging/sm/regress/regress-1383630.js new file mode 100644 index 0000000000..a0b092bb03 --- /dev/null +++ b/test/staging/sm/regress/regress-1383630.js @@ -0,0 +1,812 @@ +/* + * Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/licenses/publicdomain/ + */ + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +/* These tests are not checking whether an exception is thrown or not for + * proxies: those tests should already exist in js/src/tests/non262/Proxy . + * We expect TypeErrors to be thrown in these tests, with a stringification + * of the error message showing whatever property name the error is being + * reported for. + * + * Beyond the presence of the property name, these tests do not care about the + * contents of the message. + * + * The reason for requiring the property name is simple: with ECMAScript + * proxies, it can be really hard to figure out what little assertion causes a + * TypeError in the first place. + */ +"use strict"; + +function assertThrowsTypeErrorIncludes(f, propStr, details) { + assertThrowsInstanceOfWithMessageCheck(f, TypeError, + message => message.includes(propStr) && (!details || message.includes(details))); +} + +const STR = "one", STR_NAME = `"one"`; +const SYM = Symbol("two"), SYM_NAME = `'Symbol("two")'`; + +function errorHasPropertyTests(test) { + assertThrowsTypeErrorIncludes(() => test(STR), STR_NAME); + assertThrowsTypeErrorIncludes(() => test(SYM), SYM_NAME); +} + +function errorHasPropertyTestsWithDetails(test) { + let [throwable, details] = test(STR); + assertThrowsTypeErrorIncludes(throwable, STR_NAME, details); + + [throwable, details] = test(SYM); + assertThrowsTypeErrorIncludes(throwable, SYM_NAME, details); +} + +// getOwnPropertyDescriptor + +function testGetOwnPropertyDescriptor_OBJORUNDEF(propName) { + // JSMSG_PROXY_GETOWN_OBJORUNDEF + const h = { + getOwnPropertyDescriptor: () => 2 + }; + + const t = {}; + const p = new Proxy(t, h); + + Reflect.getOwnPropertyDescriptor(p, propName); +} + +function testGetOwnPropertyDescriptor_NC_AS_NE(propName) { + // JSMSG_CANT_REPORT_NC_AS_NE + const h = { + getOwnPropertyDescriptor: () => undefined + }; + + const t = {}; + Reflect.defineProperty(t, propName, { + value: 1, + writable: true, + enumerable: true, + configurable: false + }); + const p = new Proxy(t, h); + + Reflect.getOwnPropertyDescriptor(p, propName); +} + +function testGetOwnPropertyDescriptor_E_AS_NE(propName) { + // JSMSG_CANT_REPORT_E_AS_NE + const h = { + getOwnPropertyDescriptor: () => undefined, + }; + + const t = {}; + Reflect.defineProperty(t, propName, { + value: 1, + writable: true, + enumerable: true, + configurable: true + }); + Reflect.preventExtensions(t); + const p = new Proxy(t, h); + + Reflect.getOwnPropertyDescriptor(p, propName); +} + +function testGetOwnPropertyDescriptor_NE_AS_NC(propName) { + // JSMSG_CANT_REPORT_NE_AS_NC + const h = { + getOwnPropertyDescriptor: function() { + return { + value: 1, + writable: true, + enumerable: true, + configurable: false + }; + } + }; + + const t = {}; + const p = new Proxy(t, h); + + Reflect.getOwnPropertyDescriptor(p, propName); +} + +function testGetOwnPropertyDescriptor_C_AS_NC(propName) { + // JSMSG_CANT_REPORT_C_AS_NC + const h = { + getOwnPropertyDescriptor: function() { + return { + value: 1, + writable: true, + enumerable: true, + configurable: false // here's the difference + }; + } + }; + + const t = {}; + Reflect.defineProperty(t, propName, { + value: 1, + writable: true, + enumerable: true, + configurable: true + }); + + const p = new Proxy(t, h); + + Reflect.getOwnPropertyDescriptor(p, propName); +} + +function testGetOwnPropertyDescriptor_INVALID_NOT_EXTENSIBLE(propName) { + // JSMSG_CANT_REPORT_INVALID, DETAILS_NOT_EXTENSIBLE + const h = { + getOwnPropertyDescriptor: function() { + return { + value: 1, + writable: true, + enumerable: true, + configurable: true + }; + } + }; + + const t = {}; + Reflect.preventExtensions(t); + + const p = new Proxy(t, h); + return [() => { Reflect.getOwnPropertyDescriptor(p, propName); }, + "proxy can't report an extensible object as non-extensible"]; +} + +function testGetOwnPropertyDescriptor_INVALID_C_AS_NC(propName) { + // JSMSG_CANT_REPORT_INVALID, DETAILS_CANT_REPORT_NC_AS_C + const h = { + getOwnPropertyDescriptor: function() { + return { + value: 1, + writable: true, + enumerable: true, + configurable: true + }; + } + }; + + const t = {}; + Reflect.defineProperty(t, propName, { + value: 1, + writable: true, + enumerable: true, + configurable: false + }); + + const p = new Proxy(t, h); + return [() => { Reflect.getOwnPropertyDescriptor(p, propName); }, + "proxy can't report an existing non-configurable property as configurable"]; +} + +function testGetOwnPropertyDescriptor_INVALID_ENUM_DIFFERENT_CURRENT(cEnumerable, propName) { + // JSMSG_CANT_REPORT_INVALID, DETAILS_ENUM_DIFFERENT + const h = { + getOwnPropertyDescriptor: function() { + return { + value: 1, + writable: true, + enumerable: !cEnumerable, + configurable: false + }; + } + }; + + const t = {}; + Reflect.defineProperty(t, propName, { + value: 1, + writable: true, + enumerable: cEnumerable, + configurable: false + }); + + const p = new Proxy(t, h); + return [() => { Reflect.getOwnPropertyDescriptor(p, propName); }, + "proxy can't report a different 'enumerable' from target when target is not configurable"]; +} + +function testGetOwnPropertyDescriptor_INVALID_CURRENT_NC_DIFF_TYPE(cAccessor, propName) { + // JSMSG_CANT_REPORT_INVALID, DETAILS_CURRENT_NC_DIFF_TYPE + const accDesc = { + get: () => 1, + enumerable: true, + configurable: false, + }; + const dataDesc = { + value: 1, + writable: true, + enumerable: true, + configurable: false + }; + + const h = { + getOwnPropertyDescriptor: () => { return (cAccessor ? dataDesc : accDesc); } + }; + + const t = {}; + Reflect.defineProperty(t, propName, cAccessor ? accDesc : dataDesc); + const p = new Proxy(t, h); + return [() => { Reflect.getOwnPropertyDescriptor(p, propName); }, + "proxy can't report a different descriptor type when target is not configurable"]; +} + +function testGetOwnPropertyDescriptor_INVALID_NW_AS_W(propName) { + // JSMSG_CANT_REPORT_INVALID, DETAILS_CANT_REPORT_NW_AS_W + const h = { + getOwnPropertyDescriptor: function() { + return { + value: 1, + writable: true, + enumerable: true, + configurable: false + }; + } + }; + + const t = {}; + Reflect.defineProperty(t, propName, { + value: 2, + writable: false, + enumerable: true, + configurable: false + }); + const p = new Proxy(t, h); + + return [() => { Reflect.getOwnPropertyDescriptor(p, propName); }, + "proxy can't report a non-configurable, non-writable property as writable"]; +} + +function testGetOwnPropertyDescriptor_INVALID_DIFFERENT_VALUE(propName) { + // JSMSG_CANT_REPORT_INVALID, DETAILS_DIFFERENT_VALUE + const h = { + getOwnPropertyDescriptor: function() { + return { + value: 1, + writable: false, + enumerable: true, + configurable: false + }; + } + }; + + const t = {}; + Reflect.defineProperty(t, propName, { + value: 2, + writable: false, + enumerable: true, + configurable: false + }); + const p = new Proxy(t, h); + + return [() => { Reflect.getOwnPropertyDescriptor(p, propName); }, + "proxy must report the same value for the non-writable, non-configurable property"]; +} + +function testGetOwnPropertyDescriptor_INVALID_SETTERS_DIFFERENT(propName) { + // JSMSG_CANT_REPORT_INVALID, DETAILS_SETTERS_DIFFERENT + const g = () => 1; + const h = { + getOwnPropertyDescriptor: function() { + return { + get: g, + set: () => 2, + enumerable: true, + configurable: false + }; + } + }; + + const t = {}; + Reflect.defineProperty(t, propName, { + get: g, + set: () => 2, + enumerable: true, + configurable: false + }); + const p = new Proxy(t, h); + + return [() => { Reflect.getOwnPropertyDescriptor(p, propName); }, + "proxy can't report different setters for a currently non-configurable property"]; +} + +function testGetOwnPropertyDescriptor_INVALID_GETTERS_DIFFERENT(propName) { + // JSMSG_CANT_REPORT_INVALID, DETAILS_GETTERS_DIFFERENT + const h = { + getOwnPropertyDescriptor: function() { + return { + get: () => 2, + enumerable: true, + configurable: false + }; + } + }; + + const t = {}; + Reflect.defineProperty(t, propName, { + get: () => 2, + enumerable: true, + configurable: false + }); + const p = new Proxy(t, h); + + return [() => { Reflect.getOwnPropertyDescriptor(p, propName); }, + "proxy can't report different getters for a currently non-configurable property"]; +} + +// defineProperty +function testDefineProperty_CANT_DEFINE_NEW(propName) { + // JSMSG_CANT_DEFINE_NEW + const h = { + defineProperty: () => true + }; + + const t = {}; + Reflect.preventExtensions(t); + + const p = new Proxy(t, h); + Reflect.defineProperty(p, propName, {}); +} + +function testDefineProperty_NE_AS_NC(propName) { + // JSMSG_CANT_DEFINE_NE_AS_NC + const h = { + defineProperty: () => true + }; + + const t = {}; + + const p = new Proxy(t, h); + Reflect.defineProperty(p, propName, { + value: 1, + enumerable: true, + writable: true, + configurable: false, + }); +} + +/* Reflect.defineProperty(proxy, propName, desc) cannot throw + * JSMSG_CANT_REPORT_INVALID with DETAILS_NOT_EXTENSIBLE. Here's why: + * + * To throw with DETAILS_NOT_EXTENSIBLE, current must be undefined and the + * target must not be extensible, inside ValidateAndApplyPropertyDescriptor. + * + * ValidateAndApplyPropertyDescriptor's current is also + * IsCompatiblePropertyDescriptor's current, and therefore also + * targetDesc in [[DefineOwnProperty]] for proxies at step 16b. + * + * BUT step 16 is not reached if targetDesc in [[DefineOwnProperty]] is + * undefined: instead step 15 is invoked. QED. + */ + +function testDefineProperty_INVALID_NC_AS_C(propName) { + // JSMSG_CANT_REPORT_INVALID, DETAILS_CANT_REPORT_NC_AS_C + const h = { + defineProperty: function() { + return true; + } + }; + + const newDesc = { + value: 1, + writable: true, + enumerable: true, + configurable: true + }; + + const t = {}; + Reflect.defineProperty(t, propName, { + value: 1, + writable: true, + enumerable: true, + configurable: false + }); + + const p = new Proxy(t, h); + return [() => { Reflect.defineProperty(p, propName, newDesc); }, + "proxy can't report an existing non-configurable property as configurable"]; +} + +function testDefineProperty_INVALID_ENUM_DIFFERENT_CURRENT(cEnumerable, propName) { + // JSMSG_CANT_REPORT_INVALID, DETAILS_ENUM_DIFFERENT + const h = { + defineProperty: function() { + return true; + } + }; + + const newDesc = { + value: 1, + writable: true, + enumerable: !cEnumerable, + configurable: false + }; + + const t = {}; + Reflect.defineProperty(t, propName, { + value: 1, + writable: true, + enumerable: cEnumerable, + configurable: false + }); + + const p = new Proxy(t, h); + return [() => { Reflect.defineProperty(p, propName, newDesc); }, + "proxy can't report a different 'enumerable' from target when target is not configurable"]; +} + +function testDefineProperty_INVALID_CURRENT_NC_DIFF_TYPE(cAccessor, propName) { + // JSMSG_CANT_REPORT_INVALID, DETAILS_CURRENT_NC_DIFF_TYPE + const accDesc = { + get: () => 1, + enumerable: true, + configurable: false, + }; + const dataDesc = { + value: 1, + writable: true, + enumerable: true, + configurable: false + }; + + const h = { + defineProperty: () => true, + }; + + const t = {}; + Reflect.defineProperty(t, propName, cAccessor ? accDesc : dataDesc); + const p = new Proxy(t, h); + return [() => { Reflect.defineProperty(p, propName, cAccessor ? dataDesc : accDesc); }, + "proxy can't report a different descriptor type when target is not configurable"]; +} + +function testDefineProperty_INVALID_NW_AS_W(propName) { + // JSMSG_CANT_REPORT_INVALID, DETAILS_CANT_REPORT_NW_AS_W + const h = { + defineProperty: function() { + return true; + } + }; + + const newDesc = { + value: 1, + writable: true, + enumerable: true, + configurable: false + }; + + const t = {}; + Reflect.defineProperty(t, propName, { + value: 2, + writable: false, + enumerable: true, + configurable: false + }); + const p = new Proxy(t, h); + + return [() => { Reflect.defineProperty(p, propName, newDesc); }, + "proxy can't report a non-configurable, non-writable property as writable"]; +} + +function testDefineProperty_INVALID_DIFFERENT_VALUE(propName) { + // JSMSG_CANT_REPORT_INVALID, DETAILS_DIFFERENT_VALUE + const h = { + defineProperty: function() { + return true; + } + }; + + const newDesc = { + value: 1, + writable: false, + enumerable: true, + configurable: false + }; + + const t = {}; + Reflect.defineProperty(t, propName, { + value: 2, + writable: false, + enumerable: true, + configurable: false + }); + const p = new Proxy(t, h); + + return [() => { Reflect.defineProperty(p, propName, newDesc); }, + "proxy must report the same value for the non-writable, non-configurable property"]; +} + +function testDefineProperty_INVALID_SETTERS_DIFFERENT(propName) { + // JSMSG_CANT_REPORT_INVALID, DETAILS_SETTERS_DIFFERENT + const g = () => 1; + const h = { + defineProperty: function() { + return true; + } + }; + + const newDesc = { + get: g, + set: () => 2, + enumerable: true, + configurable: false + }; + + const t = {}; + Reflect.defineProperty(t, propName, { + get: g, + set: () => 2, + enumerable: true, + configurable: false + }); + const p = new Proxy(t, h); + + return [() => { Reflect.defineProperty(p, propName, newDesc); }, + "proxy can't report different setters for a currently non-configurable property"]; +} + +function testDefineProperty_INVALID_GETTERS_DIFFERENT(propName) { + // JSMSG_CANT_REPORT_INVALID, DETAILS_GETTERS_DIFFERENT + const h = { + defineProperty: function() { + return true; + } + }; + + const newDesc = { + get: () => 2, + enumerable: true, + configurable: false + }; + + const t = {}; + Reflect.defineProperty(t, propName, { + get: () => 2, + enumerable: true, + configurable: false + }); + const p = new Proxy(t, h); + + return [() => { Reflect.defineProperty(p, propName, newDesc); }, + "proxy can't report different getters for a currently non-configurable property"]; +} + +function testDefineProperty_INVALID_C_AS_NC(propName) { + const h = { + defineProperty: function() { + return true; + } + }; + + const newDesc = { + value: 1, + writable: true, + enumerable: true, + configurable: false + }; + + const t = {}; + Reflect.defineProperty(t, propName, { + value: 1, + writable: true, + enumerable: true, + configurable: true + }); + const p = new Proxy(t, h); + + return [() => { Reflect.defineProperty(p, propName, newDesc); }, + "proxy can't define an existing configurable property as non-configurable"]; +} + +// ownKeys + +function testOwnKeys_CANT_SKIP_NC(propName) { + // JSMSG_CANT_SKIP_NC + const h = { + ownKeys: () => [] + }; + + const t = {}; + Reflect.defineProperty(t, propName, { + value: 1, + writable: true, + enumerable: true, + configurable: false + }); + + const p = new Proxy(t, h); + + Reflect.ownKeys(p); +} + +function testOwnKeys_E_AS_NE(propName) { + // JSMSG_CANT_REPORT_E_AS_NE + const h = { + ownKeys: () => [] + }; + + const t = {}; + Reflect.defineProperty(t, propName, { + configurable: true, + value: 1, + writable: true, + enumerable: true + }); + + Reflect.preventExtensions(t); + const p = new Proxy(t, h); + + Reflect.ownKeys(p); +} + +// has + +function testHas_NC_AS_NE(propName) { + // JSMSG_CANT_REPORT_NC_AS_NE + const h = { + has: () => undefined + }; + + const t = {}; + Reflect.defineProperty(t, propName, { + value: 1, + writable: true, + enumerable: true, + configurable: false + }); + const p = new Proxy(t, h); + + Reflect.has(p, propName); +} + +function testHas_E_AS_NE(propName) { + // JSMSG_CANT_REPORT_E_AS_NE + const h = { + has: () => undefined + }; + + const t = {}; + Reflect.defineProperty(t, propName, { + value: 1, + writable: true, + enumerable: true, + configurable: true + }); + Reflect.preventExtensions(t); + const p = new Proxy(t, h); + + Reflect.has(p, propName); +} + +// get + +function testGet_SAME_VALUE(propName) { + const h = { + get: () => 2 + }; + + const t = {}; + Reflect.defineProperty(t, propName, { + value: 1, + writable: false, + enumerable: true, + configurable: false + }); + + const p = new Proxy(t, h); + Reflect.get(p, propName); +} + +function testGet_MUST_REPORT_UNDEFINED(propName) { + // JSMSG_MUST_REPORT_UNDEFINED + const h = { + get: () => 2 + }; + + const t = {}; + Reflect.defineProperty(t, propName, { + set: () => { /* do nothing */}, + enumerable: true, + configurable: false + }); + + const p = new Proxy(t, h); + Reflect.get(p, propName); +} + +// set + +function testSet_CANT_SET_NW_NC(propName) { + // JSMSG_CANT_SET_NW_NC + const h = { + set: () => true, + }; + + const t = {}; + Reflect.defineProperty(t, propName, { + value: 1, + writable: false, + enumerable: true, + configurable: false + }); + + const p = new Proxy(t, h); + Reflect.set(p, propName, 3); +} + +function testSet_WO_SETTER(propName) { + // JSMSG_MUST_REPORT_UNDEFINED + const h = { + set: () => true + }; + + const t = {}; + Reflect.defineProperty(t, propName, { + get: () => { /* do nothing */}, + enumerable: true, + configurable: false + }); + + const p = new Proxy(t, h); + Reflect.set(p, propName, 1); +} + +// test sequence + +[ + testGetOwnPropertyDescriptor_OBJORUNDEF, + testGetOwnPropertyDescriptor_NC_AS_NE, + testGetOwnPropertyDescriptor_E_AS_NE, + testGetOwnPropertyDescriptor_NE_AS_NC, + testGetOwnPropertyDescriptor_C_AS_NC, + + testDefineProperty_CANT_DEFINE_NEW, + testDefineProperty_NE_AS_NC, + + testOwnKeys_CANT_SKIP_NC, + testOwnKeys_E_AS_NE, + + testHas_NC_AS_NE, + testHas_E_AS_NE, + + testGet_SAME_VALUE, + testGet_MUST_REPORT_UNDEFINED, + + testSet_CANT_SET_NW_NC, + testSet_WO_SETTER, +].forEach(errorHasPropertyTests); + +[ + testGetOwnPropertyDescriptor_INVALID_NOT_EXTENSIBLE, + testGetOwnPropertyDescriptor_INVALID_C_AS_NC, + testGetOwnPropertyDescriptor_INVALID_ENUM_DIFFERENT_CURRENT.bind(null, true), + testGetOwnPropertyDescriptor_INVALID_ENUM_DIFFERENT_CURRENT.bind(null, false), + testGetOwnPropertyDescriptor_INVALID_CURRENT_NC_DIFF_TYPE.bind(null, true), + testGetOwnPropertyDescriptor_INVALID_CURRENT_NC_DIFF_TYPE.bind(null, false), + testGetOwnPropertyDescriptor_INVALID_NW_AS_W, + testGetOwnPropertyDescriptor_INVALID_DIFFERENT_VALUE, + testGetOwnPropertyDescriptor_INVALID_SETTERS_DIFFERENT, + testGetOwnPropertyDescriptor_INVALID_GETTERS_DIFFERENT, + + testDefineProperty_INVALID_NC_AS_C, + testDefineProperty_INVALID_ENUM_DIFFERENT_CURRENT.bind(null, true), + testDefineProperty_INVALID_ENUM_DIFFERENT_CURRENT.bind(null, false), + testDefineProperty_INVALID_CURRENT_NC_DIFF_TYPE.bind(null, true), + testDefineProperty_INVALID_CURRENT_NC_DIFF_TYPE.bind(null, false), + testDefineProperty_INVALID_NW_AS_W, + testDefineProperty_INVALID_DIFFERENT_VALUE, + testDefineProperty_INVALID_SETTERS_DIFFERENT, + testDefineProperty_INVALID_GETTERS_DIFFERENT, + testDefineProperty_INVALID_C_AS_NC, +].forEach(errorHasPropertyTestsWithDetails); + diff --git a/test/staging/sm/regress/regress-1507322-deep-weakmap.js b/test/staging/sm/regress/regress-1507322-deep-weakmap.js new file mode 100644 index 0000000000..aa7e3a309e --- /dev/null +++ b/test/staging/sm/regress/regress-1507322-deep-weakmap.js @@ -0,0 +1,22 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +function TestGC2(m) { + var head = new Object; + for (key = head, i = 0; i < 99999; i++, key = m.get(key)) { + m.set(key, new Object); + } + gc(); + for (key = head; key != undefined; key = m.get(key)) {} +} +TestGC2(new WeakMap); + +assert.sameValue(true, true, "deep weakmaps"); diff --git a/test/staging/sm/regress/regress-162392.js b/test/staging/sm/regress/regress-162392.js new file mode 100644 index 0000000000..8c1015ce5f --- /dev/null +++ b/test/staging/sm/regress/regress-162392.js @@ -0,0 +1,38 @@ +/* + * Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/licenses/publicdomain/ + */ + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ + +//----------------------------------------------------------------------------- +// SUMMARY: 10.1.8 Arguments Object length + +var BUGNUMBER = 162392; +var summary = 'eval("arguments").length == 0 when no arguments specified'; +var actual = noargslength(); +var expect = 0; + +function noargslength() +{ + return eval('arguments').length; +} + +//----------------------------------------------------------------------------- +test(); +//----------------------------------------------------------------------------- + +function test() +{ + printBugNumber(BUGNUMBER); + printStatus (summary); + + assert.sameValue(expect, actual, summary); +} diff --git a/test/staging/sm/regress/regress-306794.js b/test/staging/sm/regress/regress-306794.js new file mode 100644 index 0000000000..f06fa143d2 --- /dev/null +++ b/test/staging/sm/regress/regress-306794.js @@ -0,0 +1,31 @@ +/* + * Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/licenses/publicdomain/ + */ + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +//----------------------------------------------------------------------------- +var BUGNUMBER = 306794; +var summary = 'Do not assert: parsing foo getter'; +var actual = 'No Assertion'; +var expect = 'No Assertion'; + +printBugNumber(BUGNUMBER); +printStatus (summary); + +try +{ + eval('getter\n'); +} +catch(e) +{ +} + +assert.sameValue(expect, actual, summary); diff --git a/test/staging/sm/regress/regress-325925.js b/test/staging/sm/regress/regress-325925.js new file mode 100644 index 0000000000..07c4ca3627 --- /dev/null +++ b/test/staging/sm/regress/regress-325925.js @@ -0,0 +1,25 @@ +/* + * Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/licenses/publicdomain/ + */ + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +//----------------------------------------------------------------------------- +var BUGNUMBER = 325925; +var summary = 'Do not Assert: c <= cs->length in AddCharacterToCharSet'; +var actual = 'No Crash'; +var expect = 'No Crash'; + +printBugNumber(BUGNUMBER); +printStatus (summary); + +/[\cA]/.exec('\x01'); + +assert.sameValue(expect, actual, summary); diff --git a/test/staging/sm/regress/regress-373843.js b/test/staging/sm/regress/regress-373843.js new file mode 100644 index 0000000000..50652a8f81 --- /dev/null +++ b/test/staging/sm/regress/regress-373843.js @@ -0,0 +1,22 @@ +/* + * Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/licenses/publicdomain/ + */ + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +if (typeof disassemble != 'undefined') +{ + var func = disassemble(function() { return "c\\d"; }) + + // The disassembled function will contain a bytecode "string" with the content of the string next to it. + // Check if that string isn't over-escaped i.e. \\ isn't escaped to \\\\ . + assert.sameValue(func.indexOf("\\\\\\\\"), -1) +} + diff --git a/test/staging/sm/regress/regress-383682.js b/test/staging/sm/regress/regress-383682.js new file mode 100644 index 0000000000..85e6d398f0 --- /dev/null +++ b/test/staging/sm/regress/regress-383682.js @@ -0,0 +1,39 @@ +/* + * Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/licenses/publicdomain/ + */ + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +//----------------------------------------------------------------------------- +var BUGNUMBER = 383682; +var summary = 'eval is too dynamic'; +var actual = ''; +var expect = ''; + + +//----------------------------------------------------------------------------- +test(); +//----------------------------------------------------------------------------- + +function test() +{ + printBugNumber(BUGNUMBER); + printStatus (summary); + + function f(s) { + return this.eval(s); + } + + expect = 'PASS'; + f("function g() { return('PASS'); }"); + actual = g(); + + assert.sameValue(expect, actual, summary); +} diff --git a/test/staging/sm/regress/regress-383902.js b/test/staging/sm/regress/regress-383902.js new file mode 100644 index 0000000000..7e4da00972 --- /dev/null +++ b/test/staging/sm/regress/regress-383902.js @@ -0,0 +1,47 @@ +/* + * Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/licenses/publicdomain/ + */ + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +var c = 0; + +function f(a) { + const b = a; + try { + eval('"use strict"; b = 1 + a; c = 1'); + assert.sameValue(0, 1); + } catch (e) { + assert.sameValue(e.name, 'TypeError'); + assert.sameValue(0, c); + assert.sameValue(a, b); + } +} + +var w = 42; +f(w); + +c = 2; +try { + eval('"use strict"; function g(x) { const y = x; y = 1 + x; } c = 3'); +} catch (e) { + assert.sameValue(0, 1); +} + +c = 4; +try { + eval('"use strict"; const z = w; z = 1 + w; c = 5'); + assert.sameValue(0, 1); +} catch (e) { + assert.sameValue(e.name, 'TypeError'); + assert.sameValue(4, c); + assert.sameValue('z' in this, false); +} + diff --git a/test/staging/sm/regress/regress-410852.js b/test/staging/sm/regress/regress-410852.js new file mode 100644 index 0000000000..a8a64ffdd9 --- /dev/null +++ b/test/staging/sm/regress/regress-410852.js @@ -0,0 +1,39 @@ +/* + * Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/licenses/publicdomain/ + */ + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +//----------------------------------------------------------------------------- +var BUGNUMBER = 410852; +var summary = 'Valgrind errors in jsemit.cpp'; + + +//----------------------------------------------------------------------------- +test(); +//----------------------------------------------------------------------------- + +function test() +{ + printBugNumber(BUGNUMBER); + printStatus (summary); + + print('Note: You must run this test under valgrind to determine if it passes'); + + try + { + eval('function(){if(t)'); + } + catch(ex) + { + assert.sameValue(ex instanceof SyntaxError, true, "wrong error: " + ex); + } + +} diff --git a/test/staging/sm/regress/regress-428366.js b/test/staging/sm/regress/regress-428366.js new file mode 100644 index 0000000000..3bb976fb47 --- /dev/null +++ b/test/staging/sm/regress/regress-428366.js @@ -0,0 +1,27 @@ +/* + * Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/licenses/publicdomain/ + */ + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +//----------------------------------------------------------------------------- +var BUGNUMBER = 428366; +var summary = 'Do not assert deleting eval 16 times'; +var actual = ''; +var expect = ''; + +printBugNumber(BUGNUMBER); +printStatus (summary); + +this.__proto__.x = eval; +for (i = 0; i < 16; ++i) delete eval; +(function w() { x = 1; })(); + +assert.sameValue(expect, actual, summary); diff --git a/test/staging/sm/regress/regress-441477-01.js b/test/staging/sm/regress/regress-441477-01.js new file mode 100644 index 0000000000..ab817de3c9 --- /dev/null +++ b/test/staging/sm/regress/regress-441477-01.js @@ -0,0 +1,45 @@ +/* + * Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/licenses/publicdomain/ + */ + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +//----------------------------------------------------------------------------- +var BUGNUMBER = 441477-01; +var summary = ''; +var actual = 'No Exception'; +var expect = 'No Exception'; + + +//----------------------------------------------------------------------------- +test(); +//----------------------------------------------------------------------------- + +function test() +{ + printBugNumber(BUGNUMBER); + printStatus (summary); + + try + { + for (i = 0; i < 5;) + { + if (i > 5) + throw "bad"; + i++; + continue; + } + } + catch(ex) + { + actual = ex + ''; + } + assert.sameValue(expect, actual, summary); +} diff --git a/test/staging/sm/regress/regress-449627.js b/test/staging/sm/regress/regress-449627.js new file mode 100644 index 0000000000..40efa99a9c --- /dev/null +++ b/test/staging/sm/regress/regress-449627.js @@ -0,0 +1,120 @@ +/* + * Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/licenses/publicdomain/ + */ + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +//----------------------------------------------------------------------------- +var BUGNUMBER = 449627; +var summary = 'Crash with JIT in js_FillPropertyCache'; +var actual = 'No Crash'; +var expect = 'No Crash'; + +printBugNumber(BUGNUMBER); +printStatus (summary); + + +/************************ BROWSER DETECT (http://www.quirksmode.org/js/detect.html) ************************/ + +if (typeof navigator == 'undefined') +{ + navigator = { + userAgent: "Firefox", + vendor: "Mozilla", + platform: "Mac" + }; +} + +global = this; + +var BrowserDetect = { + init: function _init() + { + this.browser=this.searchString(this.dataBrowser) || "An unknown browser"; + + this.OS= this.searchString(this.dataOS)||"an unknown OS"; + }, + searchString: function _searchString(a) + { + for(var i=0; i < a.length; i++) + { + var b=a[i].string; + var c=a[i].prop; + this.versionSearchString=a[i].versionSearch||a[i].identity; + if(b) + { + if(b.indexOf(a[i].subString)!=-1) + return a[i].identity; + } + else if(c) + return a[i].identity; + } + }, + + searchVersion:function _searchVersion(a) + { + var b=a.indexOf(this.versionSearchString); + if(b==-1) + return; + return parseFloat(a.substring(b+this.versionSearchString.length+1)); + }, + + dataBrowser:[ + { + string:navigator.userAgent,subString:"OmniWeb",versionSearch:"OmniWeb/",identity:"OmniWeb" + }, + { + string:navigator.vendor,subString:"Apple",identity:"Safari" + }, + { + prop:global.opera,identity:"Opera" + }, + { + string:navigator.vendor,subString:"iCab",identity:"iCab" + }, + { + string:navigator.vendor,subString:"KDE",identity:"Konqueror" + }, + { + string:navigator.userAgent,subString:"Firefox",identity:"Firefox" + }, + { + string:navigator.vendor,subString:"Camino",identity:"Camino" + }, + { + string:navigator.userAgent,subString:"Netscape",identity:"Netscape" + }, + { + string:navigator.userAgent,subString:"MSIE",identity:"Explorer",versionSearch:"MSIE" + }, + { + string:navigator.userAgent,subString:"Gecko",identity:"Mozilla",versionSearch:"rv" + }, + { + string:navigator.userAgent,subString:"Mozilla",identity:"Netscape",versionSearch:"Mozilla" + } + ], + dataOS:[ + { + string:navigator.platform,subString:"Win",identity:"Windows" + }, + { + string:navigator.platform,subString:"Mac",identity:"Mac" + }, + { + string:navigator.platform,subString:"Linux",identity:"Linux" + } + ] + }; + +BrowserDetect.init(); + + +assert.sameValue(expect, actual, summary); diff --git a/test/staging/sm/regress/regress-449666.js b/test/staging/sm/regress/regress-449666.js new file mode 100644 index 0000000000..10c1460690 --- /dev/null +++ b/test/staging/sm/regress/regress-449666.js @@ -0,0 +1,68 @@ +/* + * Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/licenses/publicdomain/ + */ + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +//----------------------------------------------------------------------------- +var BUGNUMBER = 449666; +var summary = 'Do not assert: JSSTRING_IS_FLAT(str_)'; +var actual = ''; +var expect = ''; + + +//----------------------------------------------------------------------------- +test(); +//----------------------------------------------------------------------------- + +function test() +{ + printBugNumber(BUGNUMBER); + printStatus (summary); + + var global; + + + if (typeof window == 'undefined') { + global = this; + } + else { + global = window; + } + + if (!global['g']) { + global['g'] = {}; + } + + if (!global['g']['l']) { + global['g']['l'] = {}; + (function() { + function k(a,b){ + var c=a.split(/\./); + var d=global; + for(var e=0;evector[i]) == 0 +// at ../jsopcode.cpp:2791 +// +// when decompiling the eval code, which is: +// +// main: +// 00000: 10 getupvar 0 +// 00003: 10 getprop "y" +// 00006: 10 popv +// 00007: 10 stop + try + { + function f() { var x; eval("x.y"); } + f(); + } + catch(ex) + { + } + assert.sameValue(expect, actual, summary); +} diff --git a/test/staging/sm/regress/regress-452498-053.js b/test/staging/sm/regress/regress-452498-053.js new file mode 100644 index 0000000000..d5bd6234ac --- /dev/null +++ b/test/staging/sm/regress/regress-452498-053.js @@ -0,0 +1,83 @@ +/* + * Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/licenses/publicdomain/ + */ + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +//----------------------------------------------------------------------------- +var BUGNUMBER = 452498; +var summary = 'TM: upvar2 regression tests'; +var actual = ''; +var expect = ''; + + +//----------------------------------------------------------------------------- +test(); +//----------------------------------------------------------------------------- + +function test() +{ + printBugNumber(BUGNUMBER); + printStatus (summary); + +// ------- Comment #53 From Jason Orendorff + +// Assertion failure: (slot) < (uint32_t)(obj)->dslots[-1] +// at ../jsobj.cpp:5559 +// On the last line of BindLet, we have +// JS_SetReservedSlot(cx, blockObj, index, PRIVATE_TO_JSVAL(pn)); +// but this uses reserved slots as though they were unlimited. +// blockObj only has 2. + { let a=0, b=1, c=2; } + +// In RecycleTree at ../jsparse.cpp:315, we hit +// MOZ_CRASH("RecycleUseDefKids"); +// pn->pn_type is TOK_UNARYOP +// pn->pn_op is JSOP_XMLNAME +// pn->pn_defn is 1 +// pn->pn_used is 1 + try + { + true; 0; + } + catch(ex) + { + } +// Calls LinkUseToDef with pn->pn_defn == 1. +// +// If you say "var x;" first, then run this case, it gets further, +// crashing in NoteLValue like the first case in comment 52. +// + try + { + for (var [x] in y) var x; + } + catch(ex) + { + } +// Assertion failure: !pn2->pn_defn, at ../jsparse.h:461 +// Another case where some optimization is going on. + try + { + if (true && foo) ; + } + catch(ex) + { + } +// Assertion failure: scope->object == ctor +// in js_FastNewObject at ../jsbuiltins.cpp:237 +// +// With the patch, we're new-ing a different function each time, and the +// .prototype property is missing. +// + for (var z = 0; z < 3; z++) { (new function(){}); } + + assert.sameValue(expect, actual, summary); +} diff --git a/test/staging/sm/regress/regress-452498-079.js b/test/staging/sm/regress/regress-452498-079.js new file mode 100644 index 0000000000..eae8a2feae --- /dev/null +++ b/test/staging/sm/regress/regress-452498-079.js @@ -0,0 +1,37 @@ +/* + * Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/licenses/publicdomain/ + */ + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +//----------------------------------------------------------------------------- +var BUGNUMBER = 452498; +var summary = 'TM: upvar2 regression tests'; +var actual = ''; +var expect = ''; + + +//----------------------------------------------------------------------------- +test(); +//----------------------------------------------------------------------------- + +function test() +{ + printBugNumber(BUGNUMBER); + printStatus (summary); + +// ------- Comment #79 From Jason Orendorff + + x; var x; function x() { return 0; } + +// Assertion failure: !(pn->pn_dflags & flag), at ../jsparse.h:635 + + assert.sameValue(expect, actual, summary); +} diff --git a/test/staging/sm/regress/regress-459085.js b/test/staging/sm/regress/regress-459085.js new file mode 100644 index 0000000000..8cb4499f7d --- /dev/null +++ b/test/staging/sm/regress/regress-459085.js @@ -0,0 +1,37 @@ +/* + * Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/licenses/publicdomain/ + */ + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +//----------------------------------------------------------------------------- +var BUGNUMBER = 459085; +var summary = 'Do not assert with JIT: Should not move data from GPR to XMM'; +var actual = 'No Crash'; +var expect = 'No Crash'; + + +//----------------------------------------------------------------------------- +test(); +//----------------------------------------------------------------------------- + +function test() +{ + printBugNumber(BUGNUMBER); + printStatus (summary); + + + var m = new Number(3); + function foo() { for (var i=0; i<20;i++) m.toString(); } + foo(); + + + assert.sameValue(expect, actual, summary); +} diff --git a/test/staging/sm/regress/regress-469625-02.js b/test/staging/sm/regress/regress-469625-02.js new file mode 100644 index 0000000000..4e580f33cb --- /dev/null +++ b/test/staging/sm/regress/regress-469625-02.js @@ -0,0 +1,38 @@ +/* + * Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/licenses/publicdomain/ + */ + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +//----------------------------------------------------------------------------- +var BUGNUMBER = 469625; +var summary = 'group assignment with rhs containing holes'; +var actual = ''; +var expect = ''; + + +//----------------------------------------------------------------------------- +test(); +//----------------------------------------------------------------------------- + +function test() +{ + printBugNumber(BUGNUMBER); + printStatus (summary); + + expect = 'y'; + + Array.prototype[1] = 'y'; + var [x, y, z] = ['x', , 'z']; + + actual = y; + + assert.sameValue(expect, actual, summary); +} diff --git a/test/staging/sm/regress/regress-469625-03.js b/test/staging/sm/regress/regress-469625-03.js new file mode 100644 index 0000000000..41fcb69c21 --- /dev/null +++ b/test/staging/sm/regress/regress-469625-03.js @@ -0,0 +1,38 @@ +/* + * Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/licenses/publicdomain/ + */ + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +//----------------------------------------------------------------------------- +var BUGNUMBER = 469625; +var summary = 'Do not assert: script->objectsOffset != 0'; +var actual = ''; +var expect = ''; + +//----------------------------------------------------------------------------- +test(); +//----------------------------------------------------------------------------- + +function test() +{ + printBugNumber(BUGNUMBER); + printStatus (summary); + + function f(x) { + var [a, b, [c0, c1]] = [x, x, x]; + } + assertThrowsInstanceOfWithMessageCheck( + () => f(null), + TypeError, + message => /.*\[\.\.\.\]\[Symbol.iterator\]\(\)\.next\(\)\.value is null/.exec(message) !== null + ); +} + diff --git a/test/staging/sm/regress/regress-469758.js b/test/staging/sm/regress/regress-469758.js new file mode 100644 index 0000000000..9cf6810b66 --- /dev/null +++ b/test/staging/sm/regress/regress-469758.js @@ -0,0 +1,21 @@ +/* + * Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/licenses/publicdomain/ + */ + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +assertThrowsInstanceOfWithMessageCheck( + () => { + {let i=1} + {let j=1; [][j][2]} + }, + TypeError, + message => message.endsWith("[][j] is undefined")); + diff --git a/test/staging/sm/regress/regress-470758-01.js b/test/staging/sm/regress/regress-470758-01.js new file mode 100644 index 0000000000..98fdda3a21 --- /dev/null +++ b/test/staging/sm/regress/regress-470758-01.js @@ -0,0 +1,33 @@ +/* + * Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/licenses/publicdomain/ + */ + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +//----------------------------------------------------------------------------- +var BUGNUMBER = 470758; +var summary = 'Do not crash with eval upvars'; +var actual = ''; +var expect = ''; + + +//----------------------------------------------------------------------------- +test(); +//----------------------------------------------------------------------------- + +function test() +{ + printBugNumber(BUGNUMBER); + printStatus (summary); + + (function() { var k; eval("for (var k in {});") })() + + assert.sameValue(expect, actual, summary); +} diff --git a/test/staging/sm/regress/regress-470758-02.js b/test/staging/sm/regress/regress-470758-02.js new file mode 100644 index 0000000000..4fea73c0bb --- /dev/null +++ b/test/staging/sm/regress/regress-470758-02.js @@ -0,0 +1,35 @@ +/* + * Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/licenses/publicdomain/ + */ + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +//----------------------------------------------------------------------------- +var BUGNUMBER = 470758; +var summary = 'Promote evald initializer into upvar'; +var actual = ''; +var expect = ''; + + +//----------------------------------------------------------------------------- +test(); +//----------------------------------------------------------------------------- + +function test() +{ + printBugNumber(BUGNUMBER); + printStatus (summary); + + expect = 5; + + (function(){var x;eval("for (x = 0; x < 5; x++);");print(actual = x);})(); + + assert.sameValue(expect, actual, summary); +} diff --git a/test/staging/sm/regress/regress-499524.js b/test/staging/sm/regress/regress-499524.js new file mode 100644 index 0000000000..b56e8336a3 --- /dev/null +++ b/test/staging/sm/regress/regress-499524.js @@ -0,0 +1,55 @@ +/* + * Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/licenses/publicdomain/ + */ + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +function isSyntaxError(code) { + try { + eval(code); + return false; + } catch (exception) { + if (SyntaxError.prototype.isPrototypeOf(exception)) + return true; + throw exception; + }; +}; + +/* + * Duplicate parameter names must be tolerated (as per ES3), unless + * the parameter list uses destructuring, in which case we claim the + * user has opted in to a modicum of sanity, and we forbid duplicate + * parameter names. + */ +assert.sameValue(isSyntaxError("function f(x,x){}"), false); + +assert.sameValue(isSyntaxError("function f(x,[x]){})"), true); +assert.sameValue(isSyntaxError("function f(x,{y:x}){})"), true); +assert.sameValue(isSyntaxError("function f(x,{x}){})"), true); + +assert.sameValue(isSyntaxError("function f([x],x){})"), true); +assert.sameValue(isSyntaxError("function f({y:x},x){})"), true); +assert.sameValue(isSyntaxError("function f({x},x){})"), true); + +assert.sameValue(isSyntaxError("function f([x,x]){}"), true); +assert.sameValue(isSyntaxError("function f({x,x}){}"), true); +assert.sameValue(isSyntaxError("function f({y:x,z:x}){}"), true); + +assert.sameValue(isSyntaxError("function f(x,x,[y]){}"), true); +assert.sameValue(isSyntaxError("function f(x,x,{y}){}"), true); +assert.sameValue(isSyntaxError("function f([y],x,x){}"), true); +assert.sameValue(isSyntaxError("function f({y},x,x){}"), true); + +assert.sameValue(isSyntaxError("function f(a,b,c,d,e,f,g,h,b,[y]){}"), true); +assert.sameValue(isSyntaxError("function f([y],a,b,c,d,e,f,g,h,a){}"), true); +assert.sameValue(isSyntaxError("function f([a],b,c,d,e,f,g,h,i,a){}"), true); +assert.sameValue(isSyntaxError("function f(a,b,c,d,e,f,g,h,i,[a]){}"), true); +assert.sameValue(isSyntaxError("function f(a,b,c,d,e,f,g,h,i,[a]){}"), true); + diff --git a/test/staging/sm/regress/regress-500528.js b/test/staging/sm/regress/regress-500528.js new file mode 100644 index 0000000000..7d47e7a14e --- /dev/null +++ b/test/staging/sm/regress/regress-500528.js @@ -0,0 +1,29 @@ +/* + * Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/licenses/publicdomain/ + */ + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +// This test appeared in bug 497789 comment 78. + +var a = {x: 'a'}, + b1 = Object.create(a), + c1 = Object.create(b1), + b2 = Object.create(a), + c2 = Object.create(b2); + +b2.x = 'b'; // foreshadowing a.x + +var s = ''; +for (var obj of [c1, c2]) + s += obj.x; +assert.sameValue(s, 'ab'); + +assert.sameValue(0, 0, "Property cache soundness: objects with the same shape but different prototypes."); diff --git a/test/staging/sm/regress/regress-503860.js b/test/staging/sm/regress/regress-503860.js new file mode 100644 index 0000000000..3ee147ed99 --- /dev/null +++ b/test/staging/sm/regress/regress-503860.js @@ -0,0 +1,30 @@ +/* + * Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/licenses/publicdomain/ + */ + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +//----------------------------------------------------------------------------- +var BUGNUMBER = 503860; +var summary = "Don't shadow a readonly or setter proto-property"; +var expect = "PASS"; +var actual = "FAIL"; +var a = {y: 1}; + +function B(){} +B.prototype.__defineSetter__('x', function setx(val) { actual = expect; }); +var b = new B; +b.y = 1; + +var arr = [a, b]; // same shape prior to bug 497789 fix +for (var obj of arr) + obj.x = 2; // should call b's setter but doesn't + +assert.sameValue(expect, actual, summary); diff --git a/test/staging/sm/regress/regress-530879.js b/test/staging/sm/regress/regress-530879.js new file mode 100644 index 0000000000..5e48987440 --- /dev/null +++ b/test/staging/sm/regress/regress-530879.js @@ -0,0 +1,17 @@ +/* + * Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/licenses/publicdomain/ + */ + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +function* f(a, b, c, d) { + yield arguments.length; +} +assert.sameValue(0, f().next().value, "bug 530879"); diff --git a/test/staging/sm/regress/regress-541255-3.js b/test/staging/sm/regress/regress-541255-3.js new file mode 100644 index 0000000000..608ea0ed74 --- /dev/null +++ b/test/staging/sm/regress/regress-541255-3.js @@ -0,0 +1,19 @@ +/* + * Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/licenses/publicdomain/ + */ + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +function f(y) { + eval("{ let z=2, w=y; (function () { w.p = 7; })(); }"); +} +var x = {}; +f(x); +assert.sameValue(x.p, 7); diff --git a/test/staging/sm/regress/regress-541455.js b/test/staging/sm/regress/regress-541455.js new file mode 100644 index 0000000000..92855491d9 --- /dev/null +++ b/test/staging/sm/regress/regress-541455.js @@ -0,0 +1,19 @@ +/* + * Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/licenses/publicdomain/ + */ + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +function f(x) { return eval('"mumble"; x + 42'); } + +var expect = true; +var actual = ('' + f).indexOf("mumble") >= 0; + +assert.sameValue(expect, actual, "unknown directive in eval code wrongly dropped"); diff --git a/test/staging/sm/regress/regress-551763-0.js b/test/staging/sm/regress/regress-551763-0.js new file mode 100644 index 0000000000..f319ce67bc --- /dev/null +++ b/test/staging/sm/regress/regress-551763-0.js @@ -0,0 +1,38 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +(function() { + var o = {'arguments': 42}; + with (o) { // Definitely forces heavyweight. + // Note syntax is not a property access. + assert.sameValue(delete arguments, true, + "arguments property deletion within with block"); + } + assert.sameValue('arguments' in o, false, + "property deletion observable"); +})(); + +(function() { + var o = {'arguments': 42}; + delete o.arguments; + assert.sameValue('arguments' in o, false, + "arguments property deletion with property access syntax"); +})(); + +(function() { + var arguments = 42; // Forces heavyweight. + assert.sameValue(delete arguments, false, + "arguments variable"); +})(); + +(function() { + assert.sameValue(delete arguments, false, "arguments object"); +})(); diff --git a/test/staging/sm/regress/regress-551763-1.js b/test/staging/sm/regress/regress-551763-1.js new file mode 100644 index 0000000000..a09a22a6df --- /dev/null +++ b/test/staging/sm/regress/regress-551763-1.js @@ -0,0 +1,15 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +/* Check we can delete arguments in the global space. */ +arguments = 42; +assert.sameValue(delete arguments, true, "arguments defined as global"); + diff --git a/test/staging/sm/regress/regress-551763-2.js b/test/staging/sm/regress/regress-551763-2.js new file mode 100644 index 0000000000..305774e3a4 --- /dev/null +++ b/test/staging/sm/regress/regress-551763-2.js @@ -0,0 +1,14 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +/* Check we can't delete a var-declared arguments in global space. */ +var arguments = 42; +assert.sameValue(delete arguments, false, "arguments defined as global variable"); diff --git a/test/staging/sm/regress/regress-552432.js b/test/staging/sm/regress/regress-552432.js new file mode 100644 index 0000000000..a843c7f4f7 --- /dev/null +++ b/test/staging/sm/regress/regress-552432.js @@ -0,0 +1,22 @@ +/* + * Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/licenses/publicdomain/ + */ + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +(function (y) { + arguments.y = 2; + var x = Object.create(arguments); + x[0] = 3; + assert.sameValue(x[0], 3); + assert.sameValue(x.y, 2); + assert.sameValue(y, 1); +})(1); + diff --git a/test/staging/sm/regress/regress-553778.js b/test/staging/sm/regress/regress-553778.js new file mode 100644 index 0000000000..28838e1561 --- /dev/null +++ b/test/staging/sm/regress/regress-553778.js @@ -0,0 +1,26 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +/* + * This should compile without triggering the following assertion: + * + * Assertion failure: cg->fun->u.i.skipmin <= skip, at ../jsemit.cpp:2346 + */ + +function f() { + function g() { + function h() { + g; x; + } + var [x] = []; + } +} + diff --git a/test/staging/sm/regress/regress-554955-1.js b/test/staging/sm/regress/regress-554955-1.js new file mode 100644 index 0000000000..81a3a4d0e2 --- /dev/null +++ b/test/staging/sm/regress/regress-554955-1.js @@ -0,0 +1,39 @@ +/* + * Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/licenses/publicdomain/ + */ + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +function f(s) { + eval(s); + return function(a) { + var d; + { + let c = 3; + d = function() { a; }; // force Block object to be cloned + with({}) {}; // repel JägerMonkey + return b; // lookup occurs in scope of Block + } + }; +} + +var b = 1; +var g1 = f(""); +var g2 = f("var b = 2;"); + +/* Call the lambda once, caching a reference to the global b. */ +g1(0); + +/* + * If this call sees the above cache entry, then it will erroneously use the + * global b. + */ +assert.sameValue(g2(0), 2); + diff --git a/test/staging/sm/regress/regress-554955-2.js b/test/staging/sm/regress/regress-554955-2.js new file mode 100644 index 0000000000..8a3c01bca1 --- /dev/null +++ b/test/staging/sm/regress/regress-554955-2.js @@ -0,0 +1,35 @@ +/* + * Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/licenses/publicdomain/ + */ + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +function f(s) { + eval(s); + return function(a) { + with({}) {}; // repel JägerMonkey + eval(a); + return b; + }; +} + +var b = 1; +var g1 = f(""); +var g2 = f("var b = 2;"); + +/* Call the lambda once, caching a reference to the global b. */ +g1(''); + +/* + * If this call sees the above cache entry, then it will erroneously use + * the global b. + */ +assert.sameValue(g2(''), 2); + diff --git a/test/staging/sm/regress/regress-554955-3.js b/test/staging/sm/regress/regress-554955-3.js new file mode 100644 index 0000000000..f9d7d7d837 --- /dev/null +++ b/test/staging/sm/regress/regress-554955-3.js @@ -0,0 +1,38 @@ +/* + * Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/licenses/publicdomain/ + */ + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +function f(s) { + eval(s); + return function(a) { + with({}) {}; // repel JägerMonkey + eval(a); + { + let c = 3; + return b; + }; + }; +} + +var b = 1; +var g1 = f(""); +var g2 = f("var b = 2;"); + +/* Call the lambda once, caching a reference to the global b. */ +g1(''); + +/* + * If this call sees the above cache entry, then it will erroneously use the + * global b. + */ +assert.sameValue(g2(''), 2); + diff --git a/test/staging/sm/regress/regress-554955-4.js b/test/staging/sm/regress/regress-554955-4.js new file mode 100644 index 0000000000..22951161ce --- /dev/null +++ b/test/staging/sm/regress/regress-554955-4.js @@ -0,0 +1,43 @@ +/* + * Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/licenses/publicdomain/ + */ + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +function f() { + return function(a) { + // This eval must take place before the block is cloned, when the + // call object is still not marked as a delegate. The scope chain + // purge for the JSOP_DEFVAR will not change the global's shape, + // and the property cache entry will remain valid. + eval(a); + { + let c = 3; + // This eval forces the block to be cloned, so its shape gets + // used as the property cache key shape. + eval(''); + return b; + }; + }; +} + +var b = 1; +var g1 = f(); +var g2 = f(); + +/* Call the lambda once, caching a reference to the global b. */ +g1(''); + +/* + * If this call sees the above cache entry, then it will erroneously use the + * global b. + */ +assert.sameValue(g2('var b=2'), 2); + diff --git a/test/staging/sm/regress/regress-554955-5.js b/test/staging/sm/regress/regress-554955-5.js new file mode 100644 index 0000000000..f07b1145e2 --- /dev/null +++ b/test/staging/sm/regress/regress-554955-5.js @@ -0,0 +1,36 @@ +/* + * Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/licenses/publicdomain/ + */ + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +function f(s) { + if (s) { + function b() { } + } + return function(a) { + eval(a); + return b; + }; +} + +var b = 1; +var g1 = f(false); +var g2 = f(true); + +/* Call the lambda once, caching a reference to the global b. */ +g1(''); + +/* + * If this call sees the above cache entry, then it will erroneously use the + * global b. + */ +assert.sameValue(typeof g2(''), "function"); + diff --git a/test/staging/sm/regress/regress-554955-6.js b/test/staging/sm/regress/regress-554955-6.js new file mode 100644 index 0000000000..5ab1afa000 --- /dev/null +++ b/test/staging/sm/regress/regress-554955-6.js @@ -0,0 +1,56 @@ +/* + * Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/licenses/publicdomain/ + */ + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +var v="global"; +function f(a) { + // This eval could extend f's call object. However, the call object has + // not yet been marked as a delegate at this point, so no scope chain + // purge takes place when it is extended. + eval(a); + { + let b=3; + // This eval causes the cloned block object to be added to the + // scope chain. The block needs a unique shape: its parent call + // could acquire bindings for anything without affecting the global + // object's shape, so it's up to the block's shape to mismatch all + // property cache entries for prior blocks. + eval(""); + return v; + }; +} + +// Call the function once, to cache a reference to the global v from within +// f's lexical block. +assert.sameValue("global", f("")); + +// Call the function again, adding a binding to the call, and ensure that +// we do not see any property cache entry created by the previous reference +// that would direct us to the global definition. +assert.sameValue("local", f("var v='local'")); + +// Similarly,but with a doubly-nested block; make sure everyone gets marked. +function f2(a) { + eval(a); + { + let b=3; + { + let c=4; + eval(""); + return v; + }; + }; +} + +assert.sameValue("global", f2("")); +assert.sameValue("local", f2("var v='local'")); + diff --git a/test/staging/sm/regress/regress-559402-1.js b/test/staging/sm/regress/regress-559402-1.js new file mode 100644 index 0000000000..166f607445 --- /dev/null +++ b/test/staging/sm/regress/regress-559402-1.js @@ -0,0 +1,23 @@ +/* + * Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/licenses/publicdomain/ + */ + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +var expect = "No error"; +var actual = expect; + +try { + eval('function foo() { "use strict"; }'); +} catch (e) { + actual = '' + e; +} + +assert.sameValue(expect, actual, "ok"); diff --git a/test/staging/sm/regress/regress-559402-2.js b/test/staging/sm/regress/regress-559402-2.js new file mode 100644 index 0000000000..cd441afd9f --- /dev/null +++ b/test/staging/sm/regress/regress-559402-2.js @@ -0,0 +1,17 @@ +/* + * Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/licenses/publicdomain/ + */ + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +var expect = undefined; +var actual = (function foo() { "bogus"; })(); + +assert.sameValue(expect, actual, "ok"); diff --git a/test/staging/sm/regress/regress-559438.js b/test/staging/sm/regress/regress-559438.js new file mode 100644 index 0000000000..b1dd236c12 --- /dev/null +++ b/test/staging/sm/regress/regress-559438.js @@ -0,0 +1,17 @@ +/* + * Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/licenses/publicdomain/ + */ + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +function f(x) { return 1 + "" + (x + 1); } +assert.sameValue("12", f(1), ""); +var g = eval("(" + f + ")"); +assert.sameValue("12", g(1), ""); diff --git a/test/staging/sm/regress/regress-560998-1.js b/test/staging/sm/regress/regress-560998-1.js new file mode 100644 index 0000000000..4ce25f3c45 --- /dev/null +++ b/test/staging/sm/regress/regress-560998-1.js @@ -0,0 +1,18 @@ +/* + * Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/licenses/publicdomain/ + */ + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +for (let j = 0; j < 4; ++j) { + function g() { j; } + g(); +} + diff --git a/test/staging/sm/regress/regress-560998-2.js b/test/staging/sm/regress/regress-560998-2.js new file mode 100644 index 0000000000..c20790f2d3 --- /dev/null +++ b/test/staging/sm/regress/regress-560998-2.js @@ -0,0 +1,18 @@ +/* + * Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/licenses/publicdomain/ + */ + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +var x = {}; +for (var i = 0; i < 2; i++) { + Object.defineProperty(x, "y", {configurable: true, value: function () {}}); + x.y(); +} diff --git a/test/staging/sm/regress/regress-561031.js b/test/staging/sm/regress/regress-561031.js new file mode 100644 index 0000000000..30a596cff6 --- /dev/null +++ b/test/staging/sm/regress/regress-561031.js @@ -0,0 +1,1836 @@ +/* + * Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/licenses/publicdomain/ + */ + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try {} catch(e) {} +try { + if (2 == 0) { } else { []; } +} catch (e) {} diff --git a/test/staging/sm/regress/regress-563221.js b/test/staging/sm/regress/regress-563221.js new file mode 100644 index 0000000000..972fc47ff8 --- /dev/null +++ b/test/staging/sm/regress/regress-563221.js @@ -0,0 +1,16 @@ +/* + * Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/licenses/publicdomain/ + */ + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +"" + eval("(function () { if (x) ; else if (y) n(); else { " + Array(10000).join("e;") + " } });"); + +if (this.assert.sameValue) diff --git a/test/staging/sm/regress/regress-567152.js b/test/staging/sm/regress/regress-567152.js new file mode 100644 index 0000000000..57ed816f93 --- /dev/null +++ b/test/staging/sm/regress/regress-567152.js @@ -0,0 +1,19 @@ +/* + * Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/licenses/publicdomain/ + */ + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +function c(a) { + this.f = function () { a; }; +} +c(0); // set both BRANDED and GENERIC bits in global scope +Object.defineProperty(this, "f", {configurable: true, enumerable: true, value: 3}); + diff --git a/test/staging/sm/regress/regress-569306.js b/test/staging/sm/regress/regress-569306.js new file mode 100644 index 0000000000..e812772267 --- /dev/null +++ b/test/staging/sm/regress/regress-569306.js @@ -0,0 +1,21 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +function f() {} +var g = new Function(); +delete Function; +function h() {} + +assert.sameValue(f.__proto__, g.__proto__); +assert.sameValue(g.__proto__, h.__proto__); +assert.sameValue(false, "Function" in this); + +assert.sameValue("ok", "ok", "bug 569306"); diff --git a/test/staging/sm/regress/regress-571014.js b/test/staging/sm/regress/regress-571014.js new file mode 100644 index 0000000000..58d0cad2b5 --- /dev/null +++ b/test/staging/sm/regress/regress-571014.js @@ -0,0 +1,43 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ + +var F, o; + +F = function () {}; +F.prototype = new ArrayBuffer(1); +o = new F(); +try { + o.byteLength; +} catch (ex) { + // o is not a platform object + assert.sameValue(ex instanceof TypeError, true); +} + +o = {}; +o.__proto__ = new Int32Array(1); +try { + o.buffer.byteLength; +} catch (ex) { + // o is not a platform object + assert.sameValue(ex instanceof TypeError, true); +} + +F = function () {}; +F.prototype = new Int32Array(1); +o = new F(); +try { + o.slice(0, 1); + reportFailure("Expected an exception!"); +} catch (ex) { +} + +assert.sameValue("ok", "ok", "bug 571014"); diff --git a/test/staging/sm/regress/regress-573875.js b/test/staging/sm/regress/regress-573875.js new file mode 100644 index 0000000000..47014e5831 --- /dev/null +++ b/test/staging/sm/regress/regress-573875.js @@ -0,0 +1,29 @@ +/* + * Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/licenses/publicdomain/ + */ + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +var o = {__iterator__:null, a:1, b:2, c:3} +var expect = '__iterator__,a,b,c,'; +var actual = ''; + +try { + for (var i in o) + actual += i + ','; +} catch (e) { + actual = '' + e; + if (/invalid __iterator__ value/.test(actual) || + /null is not a function/.test(actual)) { + expect = actual; + } +} + +assert.sameValue(expect, actual, "ok"); diff --git a/test/staging/sm/regress/regress-577648-1.js b/test/staging/sm/regress/regress-577648-1.js new file mode 100644 index 0000000000..f1d93d639c --- /dev/null +++ b/test/staging/sm/regress/regress-577648-1.js @@ -0,0 +1,95 @@ +/* + * Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/licenses/publicdomain/ + */ + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +var count = 0; + +function testCaller(obj) { + switch (++count) { + case 1: + case 2: + /* + * The first two times, obj is objA. The first time, we reference + * arguments.callee.caller before obj.go, so the caller getter must + * force the joined function object in the stack frame to cross the + * method read barrier. The second time, obj.go has been cloned and + * it should match the new frame's callee from the get-go. + */ + assert.sameValue(obj, objA); + break; + + case 3: { + assert.sameValue(obj, objB); + + /* + * Store another clone of the joined function object before obj.go has + * been read, but after it has been invoked via objB.go(objB). + * + * In this case, arguments.callee.caller must not lie and return what + * is currently stored in objB.go, since that function object (objA.go) + * was cloned earlier, when count was 1, and it is not the function + * object that was truly invoked. + * + * But since the invocation of objB.go(objB) did not clone go, and the + * following assignment overwrote the invoked value, leaving the only + * reference to the joined function object for go in the stack frame's + * callee (argv[-2]) member, the arguments.callee.caller reference must + * clone a function object for the callee, store it as the callee, and + * return it here. + * + * It won't equal obj.go, but (implementation detail) it should have + * the same proto as obj.go + */ + obj.go = objA.go; + + let caller = arguments.callee.caller; + let obj_go = obj.go; + return caller != obj_go && caller.__proto__ == obj_go.__proto__; + } + + case 4: { + assert.sameValue(obj, objC); + + let save = obj.go; + delete obj.go; + return arguments.callee.caller == save; + } + + case 5: { + assert.sameValue(obj, objD); + + let read = obj.go; + break; + } + } + + return arguments.callee.caller == obj.go; +} + +function make() { + return { + go: function(obj) { + return testCaller(obj); + } + }; +} + +var objA = make(), + objB = make(), + objC = make(), + objD = make(); + +assert.sameValue(true, objA.go(objA), "1"); +assert.sameValue(true, objA.go(objA), "2"); +assert.sameValue(true, objB.go(objB), "3"); +assert.sameValue(true, objC.go(objC), "4"); +assert.sameValue(true, objD.go(objD), "5"); diff --git a/test/staging/sm/regress/regress-577648-2.js b/test/staging/sm/regress/regress-577648-2.js new file mode 100644 index 0000000000..2439772337 --- /dev/null +++ b/test/staging/sm/regress/regress-577648-2.js @@ -0,0 +1,19 @@ +/* + * Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/licenses/publicdomain/ + */ + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +var o = { f: function() { return o.g(); }, g: function() { return arguments.callee.caller; } }; +var c = o.f(); +var i = 'f'; +var d = o[i](); + +assert.sameValue(true, c === o.f && d === o.f(), ""); diff --git a/test/staging/sm/regress/regress-580544.js b/test/staging/sm/regress/regress-580544.js new file mode 100644 index 0000000000..176f162163 --- /dev/null +++ b/test/staging/sm/regress/regress-580544.js @@ -0,0 +1,37 @@ +/* + * Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/licenses/publicdomain/ + */ + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +var gTestfile = 'regress-580544.js'; +//----------------------------------------------------------------------------- +var BUGNUMBER = 580544; +var summary = 'Do not assert: new (this.prototype = this)'; +var actual = 'No Crash'; +var expect = 'No Crash'; + + +//----------------------------------------------------------------------------- +test(); +//----------------------------------------------------------------------------- + +function test() +{ + printBugNumber(BUGNUMBER); + printStatus (summary); + + try { + new (this.prototype = this); + } catch (e) { + } + + assert.sameValue(expect, actual, summary); +} diff --git a/test/staging/sm/regress/regress-583429.js b/test/staging/sm/regress/regress-583429.js new file mode 100644 index 0000000000..40745b6d70 --- /dev/null +++ b/test/staging/sm/regress/regress-583429.js @@ -0,0 +1,16 @@ +/* + * Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/licenses/publicdomain/ + */ + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +assert.sameValue(Object.getOwnPropertyNames(Array.prototype).indexOf("length") >= 0, true); + +assert.sameValue("ok", "ok", "bug 583429"); diff --git a/test/staging/sm/regress/regress-584355.js b/test/staging/sm/regress/regress-584355.js new file mode 100644 index 0000000000..57d896ea74 --- /dev/null +++ b/test/staging/sm/regress/regress-584355.js @@ -0,0 +1,18 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +var actual; +var expect = "function f () { ff (); }"; +function fun() { + (new Function ("function ff () { actual = '' + ff. caller; } function f () { ff (); } f ();")) (); +} +fun(); +assert.sameValue(expect, actual, ""); diff --git a/test/staging/sm/regress/regress-586482-1.js b/test/staging/sm/regress/regress-586482-1.js new file mode 100644 index 0000000000..d7740900fd --- /dev/null +++ b/test/staging/sm/regress/regress-586482-1.js @@ -0,0 +1,32 @@ +/* + * Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/licenses/publicdomain/ + */ + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +var expect = true; +var actual; + +var checkCaller = function(me) { + var caller = arguments.callee.caller; + var callerIsMethod = (caller === me['doThing']); + actual = callerIsMethod; +}; + +var MyObj = function() { +}; + +MyObj.prototype.doThing = function() { + checkCaller(this); +}; + +(new MyObj()).doThing(); + +assert.sameValue(expect, actual, "ok"); diff --git a/test/staging/sm/regress/regress-586482-2.js b/test/staging/sm/regress/regress-586482-2.js new file mode 100644 index 0000000000..aab0298b39 --- /dev/null +++ b/test/staging/sm/regress/regress-586482-2.js @@ -0,0 +1,29 @@ +/* + * Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/licenses/publicdomain/ + */ + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +var expect = true; +var actual; + +var checkCaller = function(me) { + var caller = arguments.callee.caller; + var callerIsMethod = (caller === me['doThing']); + actual = callerIsMethod; +}; + +Object.prototype.doThing = function() { + checkCaller(this); +}; + +["dense"].doThing(); + +assert.sameValue(expect, actual, "ok"); diff --git a/test/staging/sm/regress/regress-586482-3.js b/test/staging/sm/regress/regress-586482-3.js new file mode 100644 index 0000000000..104168969b --- /dev/null +++ b/test/staging/sm/regress/regress-586482-3.js @@ -0,0 +1,34 @@ +/* + * Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/licenses/publicdomain/ + */ + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +var expect = true; +var actual; + +var checkCaller = function(me) { + var f = me['doThing']; + delete MyObj.prototype['doThing']; + var caller = arguments.callee.caller; + var callerIsMethod = (f === caller); + actual = callerIsMethod; +}; + +var MyObj = function() { +}; + +MyObj.prototype.doThing = function() { + checkCaller(this); +}; + +(new MyObj()).doThing(); + +assert.sameValue(expect, actual, "ok"); diff --git a/test/staging/sm/regress/regress-586482-4.js b/test/staging/sm/regress/regress-586482-4.js new file mode 100644 index 0000000000..fc7a7f7684 --- /dev/null +++ b/test/staging/sm/regress/regress-586482-4.js @@ -0,0 +1,32 @@ +/* + * Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/licenses/publicdomain/ + */ + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +var expect, actual; + +var obj = { + f: function() { + expect = this.g; + actual = arguments.callee.caller; + print("Ok"); + } +}; + +var obj2 = { __proto__: obj, g: function() { this.f(); }}; + +var obj3 = { __proto__: obj2, h: function() { this.g(); }}; + +var obj4 = { __proto__: obj3 } + +obj4.h(); + +assert.sameValue(expect, actual, "ok"); diff --git a/test/staging/sm/regress/regress-586482-5.js b/test/staging/sm/regress/regress-586482-5.js new file mode 100644 index 0000000000..06235e3a71 --- /dev/null +++ b/test/staging/sm/regress/regress-586482-5.js @@ -0,0 +1,24 @@ +/* + * Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/licenses/publicdomain/ + */ + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +function check() { + obj2.__proto__ = null; + return arguments.callee.caller; +} + +var obj = { f: function() { check(); }}; + +var obj2 = { __proto__: obj }; + +obj2.f(); + diff --git a/test/staging/sm/regress/regress-588339.js b/test/staging/sm/regress/regress-588339.js new file mode 100644 index 0000000000..c4dd16f207 --- /dev/null +++ b/test/staging/sm/regress/regress-588339.js @@ -0,0 +1,15 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +({}) +eval("{}") + +/* Watch for crash. */ diff --git a/test/staging/sm/regress/regress-591897.js b/test/staging/sm/regress/regress-591897.js new file mode 100644 index 0000000000..36e82b24d8 --- /dev/null +++ b/test/staging/sm/regress/regress-591897.js @@ -0,0 +1,22 @@ +/* + * Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/licenses/publicdomain/ + */ + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +var expect = 42; +var actual = (function({ + x: [w] +}, +x) { + with({}) {return w;} +})({x:[42]}); + +assert.sameValue(expect, actual, "ok"); diff --git a/test/staging/sm/regress/regress-592202-3.js b/test/staging/sm/regress/regress-592202-3.js new file mode 100644 index 0000000000..3897fda228 --- /dev/null +++ b/test/staging/sm/regress/regress-592202-3.js @@ -0,0 +1,35 @@ +/* + * Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/licenses/publicdomain/ + */ + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +test(); + +function test() +{ + var counter = 0; + function f(x,y) { + try + { + throw 42; + } + catch(e2) + { + foo(function(){ return x; }| "9.2" && 5 || counter && e); + ++counter; + } + } + + f(2, 1); +} + +function foo(bar) { return ""+bar; } + diff --git a/test/staging/sm/regress/regress-592202-4.js b/test/staging/sm/regress/regress-592202-4.js new file mode 100644 index 0000000000..13d0dbefa5 --- /dev/null +++ b/test/staging/sm/regress/regress-592202-4.js @@ -0,0 +1,38 @@ +/* + * Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/licenses/publicdomain/ + */ + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +function p() { } + +function test() +{ + var counter = 0; + + function f(x) { + try + { + throw 42; + } + catch(e) + { + assert.sameValue(counter, 0); + p(function(){x;}); + counter = 1; + } + } + + f(2); + assert.sameValue(counter, 1); +} + +test(); + diff --git a/test/staging/sm/regress/regress-592556-c35.js b/test/staging/sm/regress/regress-592556-c35.js new file mode 100644 index 0000000000..845e098e79 --- /dev/null +++ b/test/staging/sm/regress/regress-592556-c35.js @@ -0,0 +1,29 @@ +/* + * Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/licenses/publicdomain/ + */ + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ + +var obj = {a: 0, b: 1, c: 2}; +delete obj.b; // switch to dictionary mode +Object.defineProperty(obj, 'g', + {get: function () { return -1; }, configurable: true}); +for (var i = 3; i < 20; i++) + obj['x' + i] = i; // get property table +for (var i = 3; i < 20; i++) + delete obj['x' + i]; // add to freelist +delete obj.g; // must update lastProp->freeslot, to avoid assertion + +// extra junk to try to hit the assertion, if freeslot is not updated +gc(); +obj.d = 3; +obj.e = 4; + diff --git a/test/staging/sm/regress/regress-593256.js b/test/staging/sm/regress/regress-593256.js new file mode 100644 index 0000000000..204da46bd9 --- /dev/null +++ b/test/staging/sm/regress/regress-593256.js @@ -0,0 +1,28 @@ +/* + * Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/licenses/publicdomain/ + */ + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +eval("\ + (function(){for(d in[0,Number]) {\ + this.__defineGetter__(\"\",function(){}),\ + [(this.__defineGetter__(\"x\",Math.pow))]\ + }})\ +")() +delete gc +eval("\ + (function() {\ + for(e in this.__defineSetter__(\"x\",function(){})){}\ + })\ +")() +delete gc + +assert.sameValue(true, true, "don't crash"); diff --git a/test/staging/sm/regress/regress-595365-1.js b/test/staging/sm/regress/regress-595365-1.js new file mode 100644 index 0000000000..049c1b9c25 --- /dev/null +++ b/test/staging/sm/regress/regress-595365-1.js @@ -0,0 +1,38 @@ +/* + * Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/licenses/publicdomain/ + */ + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +/* + * NB: this test hardcodes the value of MAX_PROPERTY_TREE_HEIGHT. + */ +var i = 0; +function add0to64(o) { + o.p00 = ++i;o.p01 = ++i;o.p02 = ++i;o.p03 = ++i;o.p04 = ++i;o.p05 = ++i;o.p06 = ++i;o.p07 = ++i; + o.p10 = ++i;o.p11 = ++i;o.p12 = ++i;o.p13 = ++i;o.p14 = ++i;o.p15 = ++i;o.p16 = ++i;o.p17 = ++i; + o.p20 = ++i;o.p21 = ++i;o.p22 = ++i;o.p23 = ++i;o.p24 = ++i;o.p25 = ++i;o.p26 = ++i;o.p27 = ++i; + o.p30 = ++i;o.p31 = ++i;o.p32 = ++i;o.p33 = ++i;o.p34 = ++i;o.p35 = ++i;o.p36 = ++i;o.p37 = ++i; + o.p40 = ++i;o.p41 = ++i;o.p42 = ++i;o.p43 = ++i;o.p44 = ++i;o.p45 = ++i;o.p46 = ++i;o.p47 = ++i; + o.p50 = ++i;o.p51 = ++i;o.p52 = ++i;o.p53 = ++i;o.p54 = ++i;o.p55 = ++i;o.p56 = ++i;o.p57 = ++i; + o.p60 = ++i;o.p61 = ++i;o.p62 = ++i;o.p63 = ++i;o.p64 = ++i;o.p65 = ++i;o.p66 = ++i;o.p67 = ++i; + o.p70 = ++i;o.p71 = ++i;o.p72 = ++i;o.p73 = ++i;o.p74 = ++i;o.p75 = ++i;o.p76 = ++i;o.p77 = ++i; + o.p100 = ++i; + return o; +} +function add65th(o) { + o.p101 = ++i; +} +var o = add0to64({}); +add65th(o); +delete o.p101; +add65th(o); + +assert.sameValue(true, true, "don't crash"); diff --git a/test/staging/sm/regress/regress-596103.js b/test/staging/sm/regress/regress-596103.js new file mode 100644 index 0000000000..51ed963220 --- /dev/null +++ b/test/staging/sm/regress/regress-596103.js @@ -0,0 +1,21 @@ +/* + * Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/licenses/publicdomain/ + */ + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +for (var u = 0; u < 3; ++u) { + var y = []; + Object.create(y); + gc(); + y.t = 3; + gc(); +} + diff --git a/test/staging/sm/regress/regress-596805-1.js b/test/staging/sm/regress/regress-596805-1.js new file mode 100644 index 0000000000..6a0bb39426 --- /dev/null +++ b/test/staging/sm/regress/regress-596805-1.js @@ -0,0 +1,20 @@ +/* + * Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/licenses/publicdomain/ + */ + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +var f = function(){}; +for (var y in f); +f.j = 0; +Object.defineProperty(f, "k", ({configurable: true})); +delete f.j; +Object.defineProperty(f, "k", ({get: function() {}})); + diff --git a/test/staging/sm/regress/regress-596805-2.js b/test/staging/sm/regress/regress-596805-2.js new file mode 100644 index 0000000000..c0a3d3107a --- /dev/null +++ b/test/staging/sm/regress/regress-596805-2.js @@ -0,0 +1,33 @@ +/* + * Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/licenses/publicdomain/ + */ + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +for(let c of [0, 0, 0, 0, 0]) { + try { (function() { + this.c = this; + this.e = arguments; + Object.defineProperty(this, "d", { + get: Math.pow, + configurable: true + }); + delete this.e; + delete this.c; + Object.defineProperty(this, "d", { + writable: true + }); + if (Math.tan( - 1)) { + Object.defineProperty(this, {}); + } + } (c)); + } catch(e) {} +} + diff --git a/test/staging/sm/regress/regress-597945-1.js b/test/staging/sm/regress/regress-597945-1.js new file mode 100644 index 0000000000..3df91fdb32 --- /dev/null +++ b/test/staging/sm/regress/regress-597945-1.js @@ -0,0 +1,30 @@ +/* + * Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/licenses/publicdomain/ + */ + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +var arguments; + +function b(foo) { + delete foo.d + delete foo.w + foo.d = true + foo.w = Object + delete Object.defineProperty(foo, "d", ({ + set: Math.w + })); {} +} +for(e of [arguments, arguments]) { + try { + b(e)('') + } catch (e) {} +} + diff --git a/test/staging/sm/regress/regress-597945-2.js b/test/staging/sm/regress/regress-597945-2.js new file mode 100644 index 0000000000..e95833ffbc --- /dev/null +++ b/test/staging/sm/regress/regress-597945-2.js @@ -0,0 +1,19 @@ +/* + * Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/licenses/publicdomain/ + */ + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +var a = {d: true, w: true}; +Object.defineProperty(a, "d", {set: undefined}); +delete a.d; +delete a.w; +a.d = true; + diff --git a/test/staging/sm/regress/regress-598176.js b/test/staging/sm/regress/regress-598176.js new file mode 100644 index 0000000000..10c50a0dc7 --- /dev/null +++ b/test/staging/sm/regress/regress-598176.js @@ -0,0 +1,33 @@ +/* + * Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/licenses/publicdomain/ + */ + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +function make() { + var r = {}; + r.desc = {get: function() {}}; + r.a = Object.defineProperty({}, "prop", r.desc); + r.info = Object.getOwnPropertyDescriptor(r.a, "prop"); + return r; +} + +r1 = make(); +assert.sameValue(r1.desc.get, r1.info.get); + +// Distinct evaluations of an object literal make distinct methods. +r2 = make(); +assert.sameValue(r1.desc.get === r2.desc.get, false); + +r1.info.get.foo = 42; + +assert.sameValue(r1.desc.get.hasOwnProperty('foo'), !r2.desc.get.hasOwnProperty('foo')); +assert.sameValue(r1.info.get.hasOwnProperty('foo'), !r2.info.get.hasOwnProperty('foo')); + diff --git a/test/staging/sm/regress/regress-600067.js b/test/staging/sm/regress/regress-600067.js new file mode 100644 index 0000000000..a294f64caf --- /dev/null +++ b/test/staging/sm/regress/regress-600067.js @@ -0,0 +1,23 @@ +/* + * Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/licenses/publicdomain/ + */ + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +/* + * NB: this test hardcodes for the value of PropertyTable::HASH_THRESHOLD (6). + */ + +function s(e) { + var a, b, c, d; + function e() { } +} + +assert.sameValue(0, 0, "don't crash"); diff --git a/test/staging/sm/regress/regress-601399.js b/test/staging/sm/regress/regress-601399.js new file mode 100644 index 0000000000..89b62f59d3 --- /dev/null +++ b/test/staging/sm/regress/regress-601399.js @@ -0,0 +1,32 @@ +/* + * Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/licenses/publicdomain/ + */ + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +// Test courtesy of Olov Lassus . + +function keys(o) { + var a = []; + for (var key in o) { + a.push(key); + } + return a; +} + +var obj = { + 'a': function() {}, 'b': function() {}, 'c': function() {} +}; +var orig_order = keys(obj).toString(); +var tmp = obj["b"]; +var read_order = keys(obj).toString(); + +assert.sameValue(orig_order, read_order, + "property enumeration order should not change after reading a method value"); diff --git a/test/staging/sm/regress/regress-602621.js b/test/staging/sm/regress/regress-602621.js new file mode 100644 index 0000000000..bd7e1ea1e9 --- /dev/null +++ b/test/staging/sm/regress/regress-602621.js @@ -0,0 +1,22 @@ +/* + * Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/licenses/publicdomain/ + */ + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +function test(arg) { + eval(arg); + { + function arguments() { return 1; } + } + return arguments; +} + +assert.sameValue("function", typeof test("42"), "function sub-statement must override arguments"); diff --git a/test/staging/sm/regress/regress-609617.js b/test/staging/sm/regress/regress-609617.js new file mode 100644 index 0000000000..7fad7a9c9b --- /dev/null +++ b/test/staging/sm/regress/regress-609617.js @@ -0,0 +1,81 @@ +/* + * Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/licenses/publicdomain/ + */ + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +var actual; +var expect = "pass"; + +var x = "fail"; +function f() { + var x = "pass"; + delete(eval("actual = x")); +} +f(); +assert.sameValue(actual, expect); + +function g() { return 1 } +function h() { function g() { throw 2; } eval('g()')++; } + +assertThrowsValue(h, 2); + +var lhs_prefix = ["", "++", "--", "", "", "[", "[y, " ]; +var lhs_suffix = [" = 'no'", "", "", "++", "--", ", y] = [3, 4]", "] = [5, 6]"]; + +for (var i = 0; i < lhs_prefix.length; i++) { + var expected; + if (/\[/.test(lhs_prefix[i])) { + expected = "invalid destructuring target"; + } else { + /* + * NB: JSOP_SETCALL throws only JSMSG_ASSIGN_TO_CALL, it does not + * specialize for ++ and -- as the compiler's error reporting does. See + * the next section's forked assert.sameValue code. + */ + expected = "cannot assign to function call"; + } + assertThrownErrorContains( + () => eval(lhs_prefix[i] + "eval('x')" + lhs_suffix[i]), + expected); +} + +/* Now test for strict mode rejecting any SETCALL variant at compile time. */ +for (var i = 0; i < lhs_prefix.length; i++) { + var expected; + if (/\+\+|\-\-/.test(lhs_prefix[i] || lhs_suffix[i])) + expected = "invalid increment/decrement operand"; + else if (/\[/.test(lhs_prefix[i])) + expected = "invalid destructuring target"; + else + expected = "invalid assignment left-hand side"; + assertThrownErrorContains( + () => eval("(function () { 'use strict'; " + lhs_prefix[i] + "foo('x')" + lhs_suffix[i] + "; })"), + expected); +} + +/* + * The useless delete is optimized away, but the SETCALL must not be. It's not + * an early error, though. + */ +var fooArg; +function foo(arg) { fooArg = arg; } +assertThrownErrorContains( + () => eval("delete (foo('x') = 42);"), + "cannot assign to function call"); +assert.sameValue(fooArg, 'x'); + +/* Delete of a call expression is not an error at all, even in strict mode. */ +function g() { + "use strict"; + assert.sameValue(delete Object(), true); +} +g(); + diff --git a/test/staging/sm/regress/regress-610026.js b/test/staging/sm/regress/regress-610026.js new file mode 100644 index 0000000000..592ab1f496 --- /dev/null +++ b/test/staging/sm/regress/regress-610026.js @@ -0,0 +1,54 @@ +/* + * Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/licenses/publicdomain/ + */ + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +var expect = "pass"; +var actual; + +// Scripts used to be limited to 2**20 blocks, but no longer since the frontend +// rewrite. The exact limit-testing here should all pass now, not pass for +// 2**20 - 1 and fail for 2**20. +var s = "{}"; +for (var i = 0; i < 21; i++) + s += s; + +try { + eval(s); + actual = "pass"; +} catch (e) { + actual = "fail: " + e; +} + +assert.sameValue(actual, expect); + +s += s.slice(0, -4); + +try { + eval(s); + actual = "pass"; +} catch (e) { + actual = "fail: " + e; +} + +assert.sameValue(actual, expect); + +s += "{}"; + +try { + eval(s); + actual = "pass"; +} catch (e) { + actual = "fail: " + e; +} + +assert.sameValue(actual, expect); + diff --git a/test/staging/sm/regress/regress-617405-1.js b/test/staging/sm/regress/regress-617405-1.js new file mode 100644 index 0000000000..12fc67f17d --- /dev/null +++ b/test/staging/sm/regress/regress-617405-1.js @@ -0,0 +1,17 @@ +/* + * Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/licenses/publicdomain/ + */ + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +function C(){} +C.prototype = 1; +assert.sameValue(Object.getOwnPropertyDescriptor(C, "prototype").configurable, false); + diff --git a/test/staging/sm/regress/regress-617405-2.js b/test/staging/sm/regress/regress-617405-2.js new file mode 100644 index 0000000000..122d33d3f8 --- /dev/null +++ b/test/staging/sm/regress/regress-617405-2.js @@ -0,0 +1,23 @@ +/* + * Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/licenses/publicdomain/ + */ + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +function C(){} +C.prototype = 1; +try { + Object.defineProperty(C, "prototype", {get: function() { throw 0; }}); + actual = "no exception"; +} catch (exc) { + actual = exc.name; +} +new C; // don't assert +assert.sameValue(actual, "TypeError"); diff --git a/test/staging/sm/regress/regress-618572.js b/test/staging/sm/regress/regress-618572.js new file mode 100644 index 0000000000..cd7250fb6e --- /dev/null +++ b/test/staging/sm/regress/regress-618572.js @@ -0,0 +1,41 @@ +/* + * Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/licenses/publicdomain/ + */ + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +//----------------------------------------------------------------------------- +var BUGNUMBER = 618572; +var summary = 'Do not assert when ungetting a Unicode char sequence'; +var actual = ''; +var expect = ''; + +//----------------------------------------------------------------------------- +test(); +//----------------------------------------------------------------------------- + +function test() +{ + printBugNumber(BUGNUMBER); + printStatus (summary); + + expect = 'SyntaxError'; + + try + { + eval("var a\\0021 = 3;"); + } + catch(ex) + { + actual = ex.constructor.name; + } + + assert.sameValue(expect, actual, summary); +} diff --git a/test/staging/sm/regress/regress-619003-1.js b/test/staging/sm/regress/regress-619003-1.js new file mode 100644 index 0000000000..3f3aa45562 --- /dev/null +++ b/test/staging/sm/regress/regress-619003-1.js @@ -0,0 +1,23 @@ +/* + * Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/licenses/publicdomain/ + */ + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +var a = []; + +// Test up to 200 to cover tunables such as js::PropertyTree::MAX_HEIGHT. +for (var i = 0; i < 200; i++) { + a.push("b" + i); + assertThrowsInstanceOfWithMessage( + () => eval("(function ([" + a.join("],[") + "],a,a){})"), + SyntaxError, + 'duplicate argument names not allowed in this context'); +} diff --git a/test/staging/sm/regress/regress-619003-2.js b/test/staging/sm/regress/regress-619003-2.js new file mode 100644 index 0000000000..293d030f1b --- /dev/null +++ b/test/staging/sm/regress/regress-619003-2.js @@ -0,0 +1,18 @@ +/* + * Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/licenses/publicdomain/ + */ + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +var expect = "global"; +var actual = expect; +function f([actual]) { } +f(["local"]); +assert.sameValue(expect, actual, "ok"); diff --git a/test/staging/sm/regress/regress-624547.js b/test/staging/sm/regress/regress-624547.js new file mode 100644 index 0000000000..3e988aeec0 --- /dev/null +++ b/test/staging/sm/regress/regress-624547.js @@ -0,0 +1,23 @@ +/* + * Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/licenses/publicdomain/ + */ + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +function f(x) { + delete arguments[0]; + for(var i=0; i<20; i++) { + arguments[0] !== undefined; + } +} + +/* Don't crash. */ +f(1); + diff --git a/test/staging/sm/regress/regress-624968.js b/test/staging/sm/regress/regress-624968.js new file mode 100644 index 0000000000..aa13f15ea2 --- /dev/null +++ b/test/staging/sm/regress/regress-624968.js @@ -0,0 +1,17 @@ +/* + * Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/licenses/publicdomain/ + */ + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +try { + new {prototype: TypeError.prototype}; +} catch (e) {} + diff --git a/test/staging/sm/regress/regress-626436.js b/test/staging/sm/regress/regress-626436.js new file mode 100644 index 0000000000..106df5718d --- /dev/null +++ b/test/staging/sm/regress/regress-626436.js @@ -0,0 +1,15 @@ +/* + * Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/licenses/publicdomain/ + */ + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +(1 ? 2 : delete(0 ? 0 : {})).x; + diff --git a/test/staging/sm/regress/regress-633741.js b/test/staging/sm/regress/regress-633741.js new file mode 100644 index 0000000000..565d098a48 --- /dev/null +++ b/test/staging/sm/regress/regress-633741.js @@ -0,0 +1,24 @@ +/* + * Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/licenses/publicdomain/ + */ + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +info: | + preventExtensions on global +description: | + pending +esid: pending +---*/ +Object.preventExtensions(this); +delete Function; + +try { + /* Don't assert. */ + Object.getOwnPropertyNames(this); +} catch(e) { + assert.sameValue(true, false, "this shouldn't have thrown"); +} diff --git a/test/staging/sm/regress/regress-634210-1.js b/test/staging/sm/regress/regress-634210-1.js new file mode 100644 index 0000000000..1a445c3802 --- /dev/null +++ b/test/staging/sm/regress/regress-634210-1.js @@ -0,0 +1,18 @@ +/* + * Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/licenses/publicdomain/ + */ + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +function f() {} +f.p = function() {}; +Object.freeze(f); +f.p; + diff --git a/test/staging/sm/regress/regress-634210-2.js b/test/staging/sm/regress/regress-634210-2.js new file mode 100644 index 0000000000..c5bd5a87fd --- /dev/null +++ b/test/staging/sm/regress/regress-634210-2.js @@ -0,0 +1,20 @@ +/* + * Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/licenses/publicdomain/ + */ + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +var a = []; +for (var i = 0; i < 2; i++) { + a[i] = {m: function () {}}; + Object.defineProperty(a[i], "m", {writable: false}); +} +assert.sameValue(a[0].m === a[1].m, false); + diff --git a/test/staging/sm/regress/regress-634210-3.js b/test/staging/sm/regress/regress-634210-3.js new file mode 100644 index 0000000000..4ae4721cf8 --- /dev/null +++ b/test/staging/sm/regress/regress-634210-3.js @@ -0,0 +1,20 @@ +/* + * Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/licenses/publicdomain/ + */ + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +var a = []; +for (var i = 0; i < 2; i++) { + a[i] = {m: function () {}}; + Object.defineProperty(a[i], "m", {configurable: false}); +} +assert.sameValue(a[0].m === a[1].m, false); + diff --git a/test/staging/sm/regress/regress-634210-4.js b/test/staging/sm/regress/regress-634210-4.js new file mode 100644 index 0000000000..ac7a7e092e --- /dev/null +++ b/test/staging/sm/regress/regress-634210-4.js @@ -0,0 +1,27 @@ +/* + * Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/licenses/publicdomain/ + */ + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +function outer() { + function f() {} + f.p = function() {}; + Object.seal(f); + return f.p; +} + +var m1 = outer(); +var m2 = outer(); +assert.sameValue(m1 === m2, false); + +m1.foo = "hi"; +assert.sameValue(m2.foo, undefined); + diff --git a/test/staging/sm/regress/regress-636364.js b/test/staging/sm/regress/regress-636364.js new file mode 100644 index 0000000000..77349f5be0 --- /dev/null +++ b/test/staging/sm/regress/regress-636364.js @@ -0,0 +1,35 @@ +/* + * Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/licenses/publicdomain/ + */ + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +if (typeof createNewGlobal == 'function') { + var gsame = createNewGlobal('same-compartment'); + + gsame.eval("function f() { return this; }"); + f = gsame.f; + assert.sameValue(f(), gsame); + + gsame.eval("function g() { 'use strict'; return this; }"); + g = gsame.g; + assert.sameValue(g(), undefined); + + var gnew = createNewGlobal(); + + gnew.eval("function f() { return this; }"); + f = gnew.f; + assert.sameValue(f(), gnew); + + gnew.eval("function g() { 'use strict'; return this; }"); + g = gnew.g; + assert.sameValue(g(), undefined); +} + diff --git a/test/staging/sm/regress/regress-640075.js b/test/staging/sm/regress/regress-640075.js new file mode 100644 index 0000000000..0a70dc8dc3 --- /dev/null +++ b/test/staging/sm/regress/regress-640075.js @@ -0,0 +1,19 @@ +/* + * Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/licenses/publicdomain/ + */ + +/*--- +flags: +- onlyStrict +includes: [sm/non262-shell.js, sm/non262.js] +description: | + pending +esid: pending +---*/ +"use strict"; +assertThrowsInstanceOf( + () => eval("(function() { eval(); function eval() {} })"), + SyntaxError +) + diff --git a/test/staging/sm/regress/regress-642247.js b/test/staging/sm/regress/regress-642247.js new file mode 100644 index 0000000000..c295054e92 --- /dev/null +++ b/test/staging/sm/regress/regress-642247.js @@ -0,0 +1,18 @@ +/* + * Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/licenses/publicdomain/ + */ + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +if (typeof timeout == "function") { + assert.sameValue(typeof timeout(), "number"); + assert.sameValue(typeof timeout(1), "undefined"); +} + diff --git a/test/staging/sm/regress/regress-643222.js b/test/staging/sm/regress/regress-643222.js new file mode 100644 index 0000000000..19494665b7 --- /dev/null +++ b/test/staging/sm/regress/regress-643222.js @@ -0,0 +1,18 @@ +/* + * Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/licenses/publicdomain/ + */ + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +/* This shouldn't trigger an assertion. */ +(function () { + eval("var x=delete(x)") +})(); + diff --git a/test/staging/sm/regress/regress-646820-1.js b/test/staging/sm/regress/regress-646820-1.js new file mode 100644 index 0000000000..d8a90e365f --- /dev/null +++ b/test/staging/sm/regress/regress-646820-1.js @@ -0,0 +1,18 @@ +/* + * Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/licenses/publicdomain/ + */ + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +(function () { + var [x, y] = [1, function () { return x; }]; + assert.sameValue(y(), 1); +})(); + diff --git a/test/staging/sm/regress/regress-646820-2.js b/test/staging/sm/regress/regress-646820-2.js new file mode 100644 index 0000000000..db16515ee1 --- /dev/null +++ b/test/staging/sm/regress/regress-646820-2.js @@ -0,0 +1,20 @@ +/* + * Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/licenses/publicdomain/ + */ + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +(function () { + var obj = {prop: 1}; + var [x, {prop: y}] = [function () { return y; }, obj]; + assert.sameValue(y, 1); + assert.sameValue(x(), 1); +})(); + diff --git a/test/staging/sm/regress/regress-646820-3.js b/test/staging/sm/regress/regress-646820-3.js new file mode 100644 index 0000000000..39c19e33c2 --- /dev/null +++ b/test/staging/sm/regress/regress-646820-3.js @@ -0,0 +1,18 @@ +/* + * Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/licenses/publicdomain/ + */ + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +(function () { + var [x, y] = [function () { return y; }, 13]; + assert.sameValue(x(), 13); +})(); + diff --git a/test/staging/sm/regress/regress-665355.js b/test/staging/sm/regress/regress-665355.js new file mode 100644 index 0000000000..3cefac3010 --- /dev/null +++ b/test/staging/sm/regress/regress-665355.js @@ -0,0 +1,29 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +var x = new ArrayBuffer(2); + +var test = function(newProto) { +try { + x.__proto__ = newProto; + return false; +} catch(e) { + return true; +} +} + +// assert cycle doesn't work +assert.sameValue(test(x), true); + +// works +assert.sameValue(test({}), false); +assert.sameValue(test(null), false); + diff --git a/test/staging/sm/regress/regress-672892.js b/test/staging/sm/regress/regress-672892.js new file mode 100644 index 0000000000..2d5470673d --- /dev/null +++ b/test/staging/sm/regress/regress-672892.js @@ -0,0 +1,17 @@ +/* + * Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/licenses/publicdomain/ + */ + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +with (0) + for (var b in 0) // don't assert in parser + ; + diff --git a/test/staging/sm/regress/regress-672893.js b/test/staging/sm/regress/regress-672893.js new file mode 100644 index 0000000000..78a4865469 --- /dev/null +++ b/test/staging/sm/regress/regress-672893.js @@ -0,0 +1,27 @@ +/* + * Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/licenses/publicdomain/ + */ + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +function f() { + return function () { return function () { return function () { + return function () { return function () { return function () { + return function () { return function () { return function () { + return function () { return function () { return function () { + return function () { return function () { return function (a) { + var v = a; + assert.sameValue(v, 42); + return function() { return v; }; + }; }; }; }; }; }; }; }; }; }; }; }; }; }; }; +}; + +assert.sameValue(f()()()()()()()()()()()()()()()(42)(), 42); + diff --git a/test/staging/sm/regress/regress-694306.js b/test/staging/sm/regress/regress-694306.js new file mode 100644 index 0000000000..9f6bf0f0bf --- /dev/null +++ b/test/staging/sm/regress/regress-694306.js @@ -0,0 +1,30 @@ +/* + * Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/licenses/publicdomain/ + */ + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +var x; +try { + eval("var {if} = {'if': 1};"); +} catch (exc) { + x = exc; +} +assert.sameValue(x instanceof SyntaxError, true); +assert.sameValue("if" in this, false); + +x = undefined; +try { + Function("var {if} = {'if': 1};"); +} catch (exc) { + x = exc; +} +assert.sameValue(x instanceof SyntaxError, true); + diff --git a/test/staging/sm/regress/regress-698028-1.js b/test/staging/sm/regress/regress-698028-1.js new file mode 100644 index 0000000000..ca1a189e8f --- /dev/null +++ b/test/staging/sm/regress/regress-698028-1.js @@ -0,0 +1,33 @@ +/* + * Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/licenses/publicdomain/ + */ + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +{ + let x00, x01, x02, x03, x04, x05, x06, x07, x08, x09, x0a, x0b, x0c, x0d, x0e, x0f, + x10, x11, x12, x13, x14, x15, x16, x17, x18, x19, x1a, x1b, x1c, x1d, x1e, x1f, + x20, x21, x22, x23, x24, x25, x26, x27, x28, x29, x2a, x2b, x2c, x2d, x2e, x2f, + x30, x31, x32, x33, x34, x35, x36, x37, x38, x39, x3a, x3b, x3c, x3d, x3e, x3f, + x40, x41, x42, x43, x44, x45, x46, x47, x48, x49, x4a, x4b, x4c, x4d, x4e, x4f, + x50, x51, x52, x53, x54, x55, x56, x57, x58, x59, x5a, x5b, x5c, x5d, x5e, x5f, + x60, x61, x62, x63, x64, x65, x66, x67, x68, x69, x6a, x6b, x6c, x6d, x6e, x6f, + x70, x71, x72, x73, x74, x75, x76, x77, x78, x79, x7a, x7b, x7c, x7d, x7e, x7f, + x80, x81, x82, x83, x84, x85, x86, x87, x88, x89, x8a, x8b, x8c, x8d, x8e, x8f, + x90, x91, x92, x93, x94, x95, x96, x97, x98, x99, x9a, x9b, x9c, x9d, x9e, x9f, + xa0, xa1, xa2, xa3, xa4, xa5, xa6, xa7, xa8, xa9, xaa, xab, xac, xad, xae, xaf, + xb0, xb1, xb2, xb3, xb4, xb5, xb6, xb7, xb8, xb9, xba, xbb, xbc, xbd, xbe, xbf, + xc0, xc1, xc2, xc3, xc4, xc5, xc6, xc7, xc8, xc9, xca, xcb, xcc, xcd, xce, xcf, + xd0, xd1, xd2, xd3, xd4, xd5, xd6, xd7, xd8, xd9, xda, xdb, xdc, xdd, xde, xdf, + xe0, xe1, xe2, xe3, xe4, xe5, xe6, xe7, xe8, xe9, xea, xeb, xec, xed, xee, xef, + xf0, xf1, xf2, xf3, xf4, xf5, xf6, xf7, xf8, xf9, xfa, xfb, xfc, xfd, xfe, xff; + eval(""); +} + diff --git a/test/staging/sm/regress/regress-699682.js b/test/staging/sm/regress/regress-699682.js new file mode 100644 index 0000000000..f96ba5f306 --- /dev/null +++ b/test/staging/sm/regress/regress-699682.js @@ -0,0 +1,38 @@ +/* + * Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/licenses/publicdomain/ + */ + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +// Don't assert trying to parse any of these. +var a = ["({''})", + "({''} = {})", + "var {''};", + "var {'', a} = {a: 0};", + "var {'bad'};", + "({'bad'} = {bad: 0});", + "var {'if'};", + "function f({''}) {}", + "function f({a, 'bad', c}) {}"]; + +var x; +for (var i = 0; i < a.length; i++) { + x = undefined; + try { + eval(a[i]); + } catch (exc) { + x = exc; + } + assert.sameValue(x instanceof SyntaxError, true); +} +assert.sameValue("" in this, false); +assert.sameValue("bad" in this, false); +assert.sameValue("if" in this, false); + diff --git a/test/staging/sm/regress/regress-810525.js b/test/staging/sm/regress/regress-810525.js new file mode 100644 index 0000000000..141e8466ab --- /dev/null +++ b/test/staging/sm/regress/regress-810525.js @@ -0,0 +1,29 @@ +/* + * Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/licenses/publicdomain/ + */ + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +var expect = ''; +var actual = ''; + +function test(s) { + assertThrowsInstanceOfWithMessageCheck( + () => eval(s), + Error, + message => message.indexOf('(intermediate value)') === -1, + `error message for ${s} should not contain '(intermediate value)'`); +} + +test("({p:1, q:2}).m()"); +test("[].m()"); +test("[1,2,3].m()"); +test("/hi/.m()"); + diff --git a/test/staging/sm/statements/arrow-function-at-end-of-for-statement-head.js b/test/staging/sm/statements/arrow-function-at-end-of-for-statement-head.js new file mode 100644 index 0000000000..3708127018 --- /dev/null +++ b/test/staging/sm/statements/arrow-function-at-end-of-for-statement-head.js @@ -0,0 +1,71 @@ +/* + * Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/licenses/publicdomain/ + */ + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +//----------------------------------------------------------------------------- +var gTestfile = "arrow-function-in-for-statement-head.js"; +var BUGNUMBER = 1302994; +var summary = + "Don't assert when an arrow function occurs at the end of a declaration " + + "init-component of a for(;;) loop head"; + +print(BUGNUMBER + ": " + summary); + +/************** + * BEGIN TEST * + **************/ + +function f1() +{ + for (var x = a => b; false; false) + {} +} +f1(); + +function f2() +{ + for (var x = a => b, y = c => d; false; false) + {} +} +f2(); + +function f3() +{ + for (var x = a => {}; false; false) + {} +} +f3(); + +function f4() +{ + for (var x = a => {}, y = b => {}; false; false) + {} +} +f4(); + +function g1() +{ + for (a => b; false; false) + {} +} +g1(); + +function g2() +{ + for (a => {}; false; false) + {} +} +g2(); + +/******************************************************************************/ + +print("Tests complete"); diff --git a/test/staging/sm/statements/arrow-function-in-for-statement-head.js b/test/staging/sm/statements/arrow-function-in-for-statement-head.js new file mode 100644 index 0000000000..c39e58112a --- /dev/null +++ b/test/staging/sm/statements/arrow-function-in-for-statement-head.js @@ -0,0 +1,40 @@ +/* + * Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/licenses/publicdomain/ + */ + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +//----------------------------------------------------------------------------- +var gTestfile = "arrow-function-in-for-statement-head.js"; +var BUGNUMBER = 1163851; +var summary = + "|for (x => 0 in 1;;) break;| must be a syntax error per ES6, not an " + + "elaborate nop"; + +print(BUGNUMBER + ": " + summary); + +/************** + * BEGIN TEST * + **************/ + +try +{ + Function("for (x => 0 in 1;;) break;"); + throw new Error("didn't throw"); +} +catch (e) +{ + assert.sameValue(e instanceof SyntaxError, true, + "expected syntax error, got " + e); +} + +/******************************************************************************/ + +print("Tests complete"); diff --git a/test/staging/sm/statements/for-in-with-declaration.js b/test/staging/sm/statements/for-in-with-declaration.js new file mode 100644 index 0000000000..1b5ee31313 --- /dev/null +++ b/test/staging/sm/statements/for-in-with-declaration.js @@ -0,0 +1,38 @@ +/* + * Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/licenses/publicdomain/ + */ + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +//----------------------------------------------------------------------------- +var gTestfile = "for-in-with-declaration.js"; +var BUGNUMBER = 1163851; +var summary = + "Declarations in for-in loop heads must not contain |in|-expression " + + "initializers"; + +print(BUGNUMBER + ": " + summary); + +/************** + * BEGIN TEST * + **************/ + +assertThrowsInstanceOf(() => Function("for (var x = 3 in {}; ; ) break;"), SyntaxError); +assertThrowsInstanceOf(() => Function("for (var x, y = 3 in {}; ; ) break;"), SyntaxError); +assertThrowsInstanceOf(() => Function("for (var x = 5, y = 3 in {}; ; ) break;"), SyntaxError); +assertThrowsInstanceOf(() => Function("for (const x = 3 in {}; ; ) break;"), SyntaxError); +assertThrowsInstanceOf(() => Function("for (const x = 5, y = 3 in {}; ; ) break;"), SyntaxError); +assertThrowsInstanceOf(() => Function("for (let x = 3 in {}; ; ) break;"), SyntaxError); +assertThrowsInstanceOf(() => Function("for (let x, y = 3 in {}; ; ) break;"), SyntaxError); +assertThrowsInstanceOf(() => Function("for (let x = 2, y = 3 in {}; ; ) break;"), SyntaxError); + +/******************************************************************************/ + +print("Tests complete"); diff --git a/test/staging/sm/statements/for-in-with-gc-and-unvisited-deletion.js b/test/staging/sm/statements/for-in-with-gc-and-unvisited-deletion.js new file mode 100644 index 0000000000..16aa5620de --- /dev/null +++ b/test/staging/sm/statements/for-in-with-gc-and-unvisited-deletion.js @@ -0,0 +1,83 @@ +/* + * Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/licenses/publicdomain/ + */ + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +//----------------------------------------------------------------------------- +var gTestfile = "for-in-with-gc-and-unvisited-deletion.js"; +var BUGNUMBER = 1462939; +var summary = + "Don't mishandle deletion of a property from the internal iterator " + + "created for a for-in loop, when a gc occurs just after it"; + +print(BUGNUMBER + ": " + summary); + +/************** + * BEGIN TEST * + **************/ + +function testOneDeletion() +{ + var o = { + p: 1, + r: 3, + s: 4, + }; + + for (var i in o) + { + gc(); + delete o.s; + } +} +testOneDeletion(); + +function testTwoDeletions() +{ + var o = { + p: 1, + r: 3, + s: 4, + t: 5, + }; + + for (var i in o) + { + gc(); + delete o.t; + delete o.s; + } +} +testTwoDeletions(); + +function testThreeDeletions() +{ + var o = { + p: 1, + r: 3, + s: 4, + t: 5, + x: 7, + }; + + for (var i in o) + { + gc(); + delete o.x; + delete o.t; + delete o.s; + } +} +testThreeDeletions(); + +/******************************************************************************/ + +print("Tests complete"); diff --git a/test/staging/sm/statements/for-inof-finally.js b/test/staging/sm/statements/for-inof-finally.js new file mode 100644 index 0000000000..9e2e270cc8 --- /dev/null +++ b/test/staging/sm/statements/for-inof-finally.js @@ -0,0 +1,87 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +var BUGNUMBER = 1332881; +var summary = + "Leaving for-in and try should handle stack value in correct order"; + +print(BUGNUMBER + ": " + summary); + +var called = 0; +function reset() { + called = 0; +} +var obj = { + [Symbol.iterator]() { + return { + next() { + return { value: 10, done: false }; + }, + return() { + called++; + return {}; + } + }; + } +}; + +var a = (function () { + for (var x in [0]) { + try {} finally { + return 11; + } + } +})(); +assert.sameValue(a, 11); + +reset(); +var b = (function () { + for (var x of obj) { + try {} finally { + return 12; + } + } +})(); +assert.sameValue(called, 1); +assert.sameValue(b, 12); + +reset(); +var c = (function () { + for (var x in [0]) { + for (var y of obj) { + try {} finally { + return 13; + } + } + } +})(); +assert.sameValue(called, 1); +assert.sameValue(c, 13); + +reset(); +var d = (function () { + for (var x in [0]) { + for (var y of obj) { + try {} finally { + for (var z in [0]) { + for (var w of obj) { + try {} finally { + return 14; + } + } + } + } + } + } +})(); +assert.sameValue(called, 2); +assert.sameValue(d, 14); + diff --git a/test/staging/sm/statements/for-inof-loop-const-declaration.js b/test/staging/sm/statements/for-inof-loop-const-declaration.js new file mode 100644 index 0000000000..d555562009 --- /dev/null +++ b/test/staging/sm/statements/for-inof-loop-const-declaration.js @@ -0,0 +1,99 @@ +/* + * Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/licenses/publicdomain/ + */ + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +var gTestfile = "for-inof-loop-const-declaration.js"; +var BUGNUMBER = 1278150; +var summary = "Support const declarations in for-of loop heads"; + +print(BUGNUMBER + ": " + summary); + +/************** + * BEGIN TEST * + **************/ + +var count; + +count = 0; +for (const x in "abcdef") +{ + assert.sameValue(x, "" + count++); + + try + { + x = 3; + throw new Error("didn't throw"); + } + catch (e) + { + assert.sameValue(e instanceof TypeError, true, + "didn't get a TypeError, instead got: " + e); + } +} + +count = 0; +for (const x of "012345") +{ + assert.sameValue(x, "" + count++); + + try + { + x = 3; + throw new Error("didn't throw"); + } + catch (e) + { + assert.sameValue(e instanceof TypeError, true, + "didn't get a TypeError, instead got: " + e); + } +} + +count = 0; +for (const { length, 0: c } in "abcdef") +{ + assert.sameValue(length, 1); + assert.sameValue(c, "" + count++); + + + try + { + length = 1; + throw new Error("didn't throw"); + } + catch (e) + { + assert.sameValue(e instanceof TypeError, true, + "didn't get a TypeError, instead got: " + e); + } +} + +count = 0; +for (const { length, 0: c } of "012345") +{ + assert.sameValue(length, 1); + assert.sameValue(c, "" + count++); + + try + { + c = 42; + throw new Error("didn't throw"); + } + catch (e) + { + assert.sameValue(e instanceof TypeError, true, + "didn't get a TypeError, instead got: " + e); + } +} + +/******************************************************************************/ + +print("Tests complete"); diff --git a/test/staging/sm/statements/for-inof-name-iteration-expression-contains-index-string.js b/test/staging/sm/statements/for-inof-name-iteration-expression-contains-index-string.js new file mode 100644 index 0000000000..72802484fc --- /dev/null +++ b/test/staging/sm/statements/for-inof-name-iteration-expression-contains-index-string.js @@ -0,0 +1,50 @@ +/* + * Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/licenses/publicdomain/ + */ + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +//----------------------------------------------------------------------------- +var gTestfile = "for-inof-name-iteration-expression-contains-index-string.js"; +var BUGNUMBER = 1235640; +var summary = + "Don't assert parsing a for-in/of loop whose target is a name, where the " + + "expression being iterated over contains a string containing an index"; + +print(BUGNUMBER + ": " + summary); + +/************** + * BEGIN TEST * + **************/ + +function f() +{ + var x; + for (x in "9") + continue; + assert.sameValue(x, "0"); +} + +f(); + +function g() +{ + "use strict"; + var x = "unset"; + for (x in arguments) + continue; + assert.sameValue(x, "unset"); +} + +g(); + +/******************************************************************************/ + +print("Tests complete"); diff --git a/test/staging/sm/statements/for-loop-declaration-contains-computed-name.js b/test/staging/sm/statements/for-loop-declaration-contains-computed-name.js new file mode 100644 index 0000000000..ca575be9f2 --- /dev/null +++ b/test/staging/sm/statements/for-loop-declaration-contains-computed-name.js @@ -0,0 +1,53 @@ +/* + * Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/licenses/publicdomain/ + */ + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +var gTestfile = "for-loop-declaration-contains-computed-name.js"; +var BUGNUMBER = 1233767; +var summary = + "Support computed property names in destructuring declarations in " + + "for-in/of loop heads"; + +print(BUGNUMBER + ": " + summary); + +/************** + * BEGIN TEST * + **************/ + +var count; + +count = 0; +for (var { [5]: x, [x]: y } of [{ 5: 42, 42: "hi" }, { 5: 17, 17: 'fnord' }]) +{ + if (count === 0) { + assert.sameValue(x, 42); + assert.sameValue(y, "hi"); + } else { + assert.sameValue(x, 17); + assert.sameValue(y, "fnord"); + } + + count++; +} + +count = 0; +for (var { length: x, [x - 1]: y } in "foo") +{ + assert.sameValue(x, 1); + assert.sameValue("" + count, y); + + count++; +} + +/******************************************************************************/ + +print("Tests complete"); diff --git a/test/staging/sm/statements/for-loop-declaration-contains-initializer.js b/test/staging/sm/statements/for-loop-declaration-contains-initializer.js new file mode 100644 index 0000000000..e09850e797 --- /dev/null +++ b/test/staging/sm/statements/for-loop-declaration-contains-initializer.js @@ -0,0 +1,55 @@ +/* + * Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/licenses/publicdomain/ + */ + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +var gTestfile = "for-loop-declaration-contains-computed-name.js"; +var BUGNUMBER = 1233767; +var summary = + "Support initializer defaults in destructuring declarations in for-in/of " + + "loop heads"; + +print(BUGNUMBER + ": " + summary); + +/************** + * BEGIN TEST * + **************/ + +var count; +var expr; + +expr = [{ z: 42, 42: "hi" }, { 7: 'fnord' }]; +count = 0; +for (var { z: x = 7, [x]: y = 3 } of expr) +{ + if (count === 0) { + assert.sameValue(x, 42); + assert.sameValue(y, "hi"); + } else { + assert.sameValue(x, 7); + assert.sameValue(y, "fnord"); + } + + count++; +} + +count = 0; +for (var { length: x, [x - 1 + count]: y = "psych" } in "foo") +{ + assert.sameValue(x, 1); + assert.sameValue(y, count === 0 ? "0" : "psych"); + + count++; +} + +/******************************************************************************/ + +print("Tests complete"); diff --git a/test/staging/sm/statements/for-of-iterator-close-throw.js b/test/staging/sm/statements/for-of-iterator-close-throw.js new file mode 100644 index 0000000000..c5fe8a1add --- /dev/null +++ b/test/staging/sm/statements/for-of-iterator-close-throw.js @@ -0,0 +1,44 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +function test() { + var returnCalled = 0; + var returnCalledExpected = 0; + var catchEntered = 0; + var finallyEntered = 0; + var finallyEnteredExpected = 0; + var iterable = {}; + iterable[Symbol.iterator] = makeIterator({ + ret: function() { + returnCalled++; + throw 42; + } + }); + + // inner try cannot catch IteratorClose throwing + assertThrowsValue(function() { + for (var x of iterable) { + try { + return; + } catch (e) { + catchEntered++; + } finally { + finallyEntered++; + } + } + }, 42); + assert.sameValue(returnCalled, ++returnCalledExpected); + assert.sameValue(catchEntered, 0); + assert.sameValue(finallyEntered, ++finallyEnteredExpected); +} + +test(); + diff --git a/test/staging/sm/statements/for-of-iterator-close.js b/test/staging/sm/statements/for-of-iterator-close.js new file mode 100644 index 0000000000..3aefd1f2ce --- /dev/null +++ b/test/staging/sm/statements/for-of-iterator-close.js @@ -0,0 +1,111 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +// Tests that IteratorReturn is called when a for-of loop has an abrupt +// completion value during non-iterator code. + +function test() { + var returnCalled = 0; + var returnCalledExpected = 0; + var iterable = {}; + iterable[Symbol.iterator] = makeIterator({ + ret: function() { + returnCalled++; + return {}; + } + }); + + // break calls iter.return + for (var x of iterable) + break; + assert.sameValue(returnCalled, ++returnCalledExpected); + + // throw in body calls iter.return + assertThrowsValue(function() { + for (var x of iterable) + throw "in body"; + }, "in body"); + assert.sameValue(returnCalled, ++returnCalledExpected); + + // throw in lhs ref calls iter.return + function throwlhs() { + throw "in lhs"; + } + assertThrowsValue(function() { + for ((throwlhs()) of iterable) + continue; + }, "in lhs"); + assert.sameValue(returnCalled, ++returnCalledExpected); + + // throw in iter.return doesn't re-call iter.return + iterable[Symbol.iterator] = makeIterator({ + ret: function() { + returnCalled++; + throw "in iter.return"; + } + }); + assertThrowsValue(function() { + for (var x of iterable) + break; + }, "in iter.return"); + assert.sameValue(returnCalled, ++returnCalledExpected); + + // throw in iter.next doesn't call IteratorClose + iterable[Symbol.iterator] = makeIterator({ + next: function() { + throw "in next"; + } + }); + assertThrowsValue(function() { + for (var x of iterable) + break; + }, "in next"); + assert.sameValue(returnCalled, returnCalledExpected); + + // "return" must return an Object. + iterable[Symbol.iterator] = makeIterator({ + ret: function() { + returnCalled++; + return 42; + } + }); + assertThrowsInstanceOf(function() { + for (var x of iterable) + break; + }, TypeError); + assert.sameValue(returnCalled, ++returnCalledExpected); + + // continue doesn't call iter.return for the loop it's continuing + var i = 0; + iterable[Symbol.iterator] = makeIterator({ + next: function() { + return { done: i++ > 5 }; + }, + ret: function() { + returnCalled++; + return {}; + } + }); + for (var x of iterable) + continue; + assert.sameValue(returnCalled, returnCalledExpected); + + // continue does call iter.return for loops it skips + i = 0; + L: do { + for (var x of iterable) + continue L; + } while (false); + assert.sameValue(returnCalled, ++returnCalledExpected); +} + +test(); + diff --git a/test/staging/sm/statements/for-of-iterator-primitive.js b/test/staging/sm/statements/for-of-iterator-primitive.js new file mode 100644 index 0000000000..41fe1e76cb --- /dev/null +++ b/test/staging/sm/statements/for-of-iterator-primitive.js @@ -0,0 +1,37 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +var BUGNUMBER = 1021835; +var summary = "Returning non-object from @@iterator should throw"; + +print(BUGNUMBER + ": " + summary); + +let primitives = [ + 1, + true, + undefined, + null, + "foo", + Symbol.iterator +]; + +for (let primitive of primitives) { + let obj = { + [Symbol.iterator]() { + return primitive; + } + }; + assertThrowsInstanceOf(() => { + for (let x of obj) { + } + }, TypeError); +} + diff --git a/test/staging/sm/statements/for-of-var-with-initializer.js b/test/staging/sm/statements/for-of-var-with-initializer.js new file mode 100644 index 0000000000..05f49b2c20 --- /dev/null +++ b/test/staging/sm/statements/for-of-var-with-initializer.js @@ -0,0 +1,37 @@ +/* + * Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/licenses/publicdomain/ + */ + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +var gTestfile = "for-of-var-with-initializer.js"; +var BUGNUMBER = 1164741; +var summary = "Don't assert parsing |for (var x = 3 of 42);|"; + +print(BUGNUMBER + ": " + summary); + +/************** + * BEGIN TEST * + **************/ + +try +{ + Function("for (var x = 3 of 42);"); + throw new Error("didn't throw"); +} +catch (e) +{ + assert.sameValue(e instanceof SyntaxError, true, + "expected syntax error, got: " + e); +} + +/******************************************************************************/ + +print("Tests complete"); diff --git a/test/staging/sm/statements/if-constant-folding.js b/test/staging/sm/statements/if-constant-folding.js new file mode 100644 index 0000000000..80a2c08d61 --- /dev/null +++ b/test/staging/sm/statements/if-constant-folding.js @@ -0,0 +1,42 @@ +/* + * Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/licenses/publicdomain/ + */ + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +//----------------------------------------------------------------------------- +var gTestfile = "if-constant-folding.js"; +var BUGNUMBER = 1183400; +var summary = + "Don't crash constant-folding an |if| governed by a truthy constant, whose " + + "alternative statement is another |if|"; + +print(BUGNUMBER + ": " + summary); + +/************** + * BEGIN TEST * + **************/ + +// Perform |if| constant folding correctly when the condition is constantly +// truthy and the alternative statement is another |if|. +if (true) +{ + assert.sameValue(true, true, "sanity"); +} +else if (42) +{ + assert.sameValue(false, true, "not reached"); + assert.sameValue(true, false, "also not reached"); +} + + +/******************************************************************************/ + +print("Tests complete"); diff --git a/test/staging/sm/statements/property-reference-self-assignment.js b/test/staging/sm/statements/property-reference-self-assignment.js new file mode 100644 index 0000000000..020eb92307 --- /dev/null +++ b/test/staging/sm/statements/property-reference-self-assignment.js @@ -0,0 +1,47 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +var hits = 0; + +var p = { toString() { hits++; return "prop" } }; +var obj = { foo: 1 }; + + +var ops = [["obj[p]++", 2], + ["++obj[p]", 2], + ["--obj[p]", 0], + ["obj[p]--", 0], + ["obj[p] += 2", 3], + ["obj[p] -= 2", -1], + ["obj[p] *= 2", 2], + ["obj[p] /= 2", 0.5], + ["obj[p] %= 2", 1], + ["obj[p] >>>= 2", 0], + ["obj[p] >>= 2", 0], + ["obj[p] <<= 2", 4], + ["obj[p] |= 2", 3], + ["obj[p] ^= 2", 3], + ["obj[p] &= 2", 0]]; + +var testHits = 0; +for (let op of ops) { + // Seed the value for each test. + obj.prop = 1; + + // Do the operation. + eval(op[0]); + assert.sameValue(obj.prop, op[1], `value for ${op[0]}`); + + // We should always call toString once, for each operation. + testHits++; + assert.sameValue(hits, testHits, `toString calls for ${op[0]}`); +} + diff --git a/test/staging/sm/statements/regress-642975.js b/test/staging/sm/statements/regress-642975.js new file mode 100644 index 0000000000..f3ea298696 --- /dev/null +++ b/test/staging/sm/statements/regress-642975.js @@ -0,0 +1,36 @@ +/* + * Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/licenses/publicdomain/ + */ + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +var x = 0; +var y = 1; +var g = 1; + +var expect = "y"; +var actual; + +try { + eval("y: while (x) break\n/y/g.exec('y')"); + actual = RegExp.lastMatch; +} catch (e) { + actual = '' + e; +} +assert.sameValue(actual, expect); + +try { + eval("y: while (x) continue\n/y/g.exec('y')"); + actual = RegExp.lastMatch; +} catch (e) { + actual = '' + e; +} +assert.sameValue(actual, expect); + diff --git a/test/staging/sm/statements/try-completion.js b/test/staging/sm/statements/try-completion.js new file mode 100644 index 0000000000..f631a03c0f --- /dev/null +++ b/test/staging/sm/statements/try-completion.js @@ -0,0 +1,491 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +var BUGNUMBER = 819125; +var summary = "try block should return try value if finally returned normally"; + +print(BUGNUMBER + ": " + summary); + +function expectTryValue(code, isUndefined) { + assert.sameValue(eval(code), isUndefined ? undefined : 'try'); +} + +function expectCatchValue(code, isUndefined) { + assert.sameValue(eval(code), isUndefined ? undefined : 'catch'); +} + +function expectFinallyValue(code, isUndefined) { + assert.sameValue(eval(code), isUndefined ? undefined : 'finally'); +} + +// ==== finally: normal ==== + +// try: normal +// finally: normal +expectTryValue(` +try { + 'try'; +} finally { + 'finally'; +} +`); + +// try: normal without value +// finally: normal +expectTryValue(` +try { +} finally { + 'finally'; +} +`, true); + +// try: break +// finally: normal +expectTryValue(` +while (true) { + try { + 'try'; + break; + } finally { + 'finally'; + } +} +`); + +// try: break without value +// finally: normal +expectTryValue(` +while (true) { + try { + break; + } finally { + 'finally'; + } +} +`, true); + +// try: continue +// finally: normal +expectTryValue(` +do { + try { + 'try'; + continue; + } finally { + 'finally'; + } +} while (false); +`); + +// try: continue without value +// finally: normal +expectTryValue(` +do { + try { + continue; + } finally { + 'finally'; + } +} while (false); +`, true); + +// try: throw +// catch: normal +// finally: normal +expectCatchValue(` +try { + 'try'; + throw 'exception'; +} catch (e) { + 'catch'; +} finally { + 'finally'; +} +`); + +// try: throw +// catch: normal +// finally: normal +expectCatchValue(` +try { + 'try'; + throw 'exception'; +} catch (e) { + 'catch'; +} finally { + 'finally'; +} +`); + +// try: throw +// catch: normal without value +// finally: normal +expectCatchValue(` +try { + 'try'; + throw 'exception'; +} catch (e) { +} finally { + 'finally'; +} +`, true); + +// try: throw +// catch: normal without value +// finally: normal +expectCatchValue(` +try { + 'try'; + throw 'exception'; +} catch (e) { +} finally { + 'finally'; +} +`, true); + +// try: throw +// catch: break +// finally: normal +expectCatchValue(` +while (true) { + try { + 'try'; + throw 'exception'; + } catch (e) { + 'catch'; + break; + } finally { + 'finally'; + } +} +`); + +// try: throw +// catch: break without value +// finally: normal +expectCatchValue(` +while (true) { + try { + 'try'; + throw 'exception'; + } catch (e) { + break; + } finally { + 'finally'; + } +} +`, true); + +// try: throw +// catch: continue +// finally: normal +expectCatchValue(` +do { + try { + 'try'; + throw 'exception'; + } catch (e) { + 'catch'; + continue; + } finally { + 'finally'; + } +} while (false); +`); + +// try: throw +// catch: continue without value +// finally: normal +expectCatchValue(` +do { + try { + 'try'; + throw 'exception'; + } catch (e) { + continue; + } finally { + 'finally'; + } +} while (false); +`, true); + +// ==== finally: break ==== + +// try: normal +// finally: break +expectFinallyValue(` +while (true) { + try { + 'try'; + } finally { + 'finally'; + break; + } +} +`); + +// try: normal +// finally: break without value +expectFinallyValue(` +while (true) { + try { + 'try'; + } finally { + break; + } +} +`, true); + +// try: break +// finally: break +expectFinallyValue(` +while (true) { + try { + 'try'; + break; + } finally { + 'finally'; + break; + } +} +`); + +// try: break +// finally: break without value +expectFinallyValue(` +while (true) { + try { + 'try'; + break; + } finally { + break; + } +} +`, true); + +// try: continue +// finally: break +expectFinallyValue(` +do { + try { + 'try'; + continue; + } finally { + 'finally'; + break; + } +} while (false); +`); + +// try: continue +// finally: break without value +expectFinallyValue(` +do { + try { + 'try'; + continue; + } finally { + break; + } +} while (false); +`, true); + +// try: throw +// catch: normal +// finally: break +expectFinallyValue(` +while (true) { + try { + 'try'; + throw 'exception'; + } catch (e) { + 'catch'; + } finally { + 'finally'; + break; + } +} +`, false); + +// try: throw +// catch: normal +// finally: break without value +expectFinallyValue(` +while (true) { + try { + 'try'; + throw 'exception'; + } catch (e) { + 'catch'; + } finally { + break; + } +} +`, true); + +// ==== finally: continue ==== + +// try: normal +// finally: continue +expectFinallyValue(` +do { + try { + 'try'; + } finally { + 'finally'; + continue; + } +} while (false); +`); + +// try: normal +// finally: continue without value +expectFinallyValue(` +do { + try { + 'try'; + } finally { + continue; + } +} while (false); +`, true); + +// try: break +// finally: continue +expectFinallyValue(` +do { + try { + 'try'; + break; + } finally { + 'finally'; + continue; + } +} while (false); +`); + +// try: break +// finally: continue without value +expectFinallyValue(` +do { + try { + 'try'; + break; + } finally { + continue; + } +} while (false); +`, true); + +// try: continue +// finally: continue +expectFinallyValue(` +do { + try { + 'try'; + continue; + } finally { + 'finally'; + continue; + } +} while (false); +`); + +// try: continue +// finally: continue without value +expectFinallyValue(` +do { + try { + 'try'; + continue; + } finally { + continue; + } +} while (false); +`, true); + +// ==== without finally ==== + +// try: throw +// catch: normal +expectCatchValue(` +try { + 'try'; + throw 'exception'; +} catch (e) { + 'catch'; +} +`); + +// try: throw +// catch: normal without value +expectCatchValue(` +try { + 'try'; + throw 'exception'; +} catch (e) { +} +`, true); + +// try: throw +// catch: break +expectCatchValue(` +while (true) { + try { + 'try'; + throw 'exception'; + } catch (e) { + 'catch'; + break; + } +} +`); + +// try: throw +// catch: break without value +expectCatchValue(` +while (true) { + try { + 'try'; + throw 'exception'; + } catch (e) { + break; + } +} +`, true); + +// try: throw +// catch: continue +expectCatchValue(` +do { + try { + 'try'; + throw 'exception'; + } catch (e) { + 'catch'; + continue; + } +} while (false); +`); + +// try: throw +// catch: continue without value +expectCatchValue(` +do { + try { + 'try'; + throw 'exception'; + } catch (e) { + continue; + } +} while (false); +`, true); + diff --git a/test/staging/sm/strict/10.4.2.js b/test/staging/sm/strict/10.4.2.js new file mode 100644 index 0000000000..9b15aeb998 --- /dev/null +++ b/test/staging/sm/strict/10.4.2.js @@ -0,0 +1,60 @@ +/* + * Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/licenses/publicdomain/ + */ + +/*--- +includes: [sm/non262-shell.js, sm/non262-strict-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +/* Direct calls to eval should inherit the strictness of the calling code. */ +assert.sameValue(testLenientAndStrict("eval('010')", + completesNormally, + raisesException(SyntaxError)), + true); + +/* + * Directives in the eval code itself should always override a direct + * caller's strictness. + */ +assert.sameValue(testLenientAndStrict("eval('\"use strict\"; 010')", + raisesException(SyntaxError), + raisesException(SyntaxError)), + true); + +/* Code passed to indirect calls to eval should never be strict. */ +assert.sameValue(testLenientAndStrict("var evil=eval; evil('010')", + completesNormally, + completesNormally), + true); + +/* + * Code passed to the Function constructor never inherits the caller's + * strictness. + */ +assert.sameValue(completesNormally("Function('010')"), + true); +assert.sameValue(raisesException(SyntaxError)("Function('\"use strict\"; 010')"), + true); + +/* + * If 'eval' causes a frame's primitive |this| to become wrapped, the frame should see the same + * wrapper object as the eval code. + */ +var call_this, eval_this; +function f(code) { + /* + * At this point, a primitive |this| has not yet been wrapped. A + * reference to |this| from the eval call should wrap it, and the wrapper + * should be stored where the call frame can see it. + */ + eval(code); + call_this = this; +} +f.call(true, 'eval_this = this'); +assert.sameValue(call_this, eval_this); + diff --git a/test/staging/sm/strict/10.4.3.js b/test/staging/sm/strict/10.4.3.js new file mode 100644 index 0000000000..b83d00656e --- /dev/null +++ b/test/staging/sm/strict/10.4.3.js @@ -0,0 +1,63 @@ +/* + * Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/licenses/publicdomain/ + */ + +/*--- +includes: [sm/non262-shell.js, sm/non262-strict-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +var obj = {} + +function strict() { "use strict"; return this; } +assert.sameValue(strict.call(""), ""); +assert.sameValue(strict.call(true), true); +assert.sameValue(strict.call(42), 42); +assert.sameValue(strict.call(null), null); +assert.sameValue(strict.call(undefined), undefined); +assert.sameValue(strict.call(obj), obj); +assert.sameValue(new strict() instanceof Object, true); + +/* + * The compiler internally converts x['foo'] to x.foo. Writing x[s] where + * s='foo' is enough to throw it off the scent for now. + */ +var strictString = 'strict'; + +Boolean.prototype.strict = strict; +assert.sameValue(true.strict(), true); +assert.sameValue(true[strictString](), true); + +Number.prototype.strict = strict; +assert.sameValue((42).strict(), 42); +assert.sameValue(42[strictString](), 42); + +String.prototype.strict = strict; +assert.sameValue("".strict(), ""); +assert.sameValue(""[strictString](), ""); + +function lenient() { return this; } +assert.sameValue(lenient.call("") instanceof String, true); +assert.sameValue(lenient.call(true) instanceof Boolean, true); +assert.sameValue(lenient.call(42) instanceof Number, true); +assert.sameValue(lenient.call(null), this); +assert.sameValue(lenient.call(undefined), this); +assert.sameValue(lenient.call(obj), obj); +assert.sameValue(new lenient() instanceof Object, true); + +var lenientString = 'lenient'; + +Boolean.prototype.lenient = lenient; +assert.sameValue(true.lenient() instanceof Boolean, true); +assert.sameValue(true[lenientString]() instanceof Boolean, true); + +Number.prototype.lenient = lenient; +assert.sameValue(42[lenientString]() instanceof Number, true); + +String.prototype.lenient = lenient; +assert.sameValue(""[lenientString]() instanceof String, true); + diff --git a/test/staging/sm/strict/10.6.js b/test/staging/sm/strict/10.6.js new file mode 100644 index 0000000000..0c337fde70 --- /dev/null +++ b/test/staging/sm/strict/10.6.js @@ -0,0 +1,60 @@ +/* + * Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/licenses/publicdomain/ + */ + +/*--- +includes: [sm/non262-shell.js, sm/non262-strict-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +function callFunctionBody(expr) { + return ( + '(function f() {\n' + + 'Object.defineProperties(arguments, {1: { writable: false },\n' + + ' 2: { configurable: false },\n' + + ' 3: { writable: false,\n' + + ' configurable: false }});\n' + + 'return (' + expr + ');\n' + + '})(0, 1, 2, 3);'); +} + +assert.sameValue(testLenientAndStrict(callFunctionBody('arguments[0] = 42'), + returns(42), returns(42)), + true); + +assert.sameValue(testLenientAndStrict(callFunctionBody('delete arguments[0]'), + returns(true), returns(true)), + true); + + +assert.sameValue(testLenientAndStrict(callFunctionBody('arguments[1] = 42'), + returns(42), raisesException(TypeError)), + true); + +assert.sameValue(testLenientAndStrict(callFunctionBody('delete arguments[1]'), + returns(true), returns(true)), + true); + + +assert.sameValue(testLenientAndStrict(callFunctionBody('arguments[2] = 42'), + returns(42), returns(42)), + true); + +assert.sameValue(testLenientAndStrict(callFunctionBody('delete arguments[2]'), + returns(false), raisesException(TypeError)), + true); + + +assert.sameValue(testLenientAndStrict(callFunctionBody('arguments[3] = 42'), + returns(42), raisesException(TypeError)), + true); + +assert.sameValue(testLenientAndStrict(callFunctionBody('delete arguments[3]'), + returns(false), raisesException(TypeError)), + true); + + diff --git a/test/staging/sm/strict/11.1.5.js b/test/staging/sm/strict/11.1.5.js new file mode 100644 index 0000000000..a0cb72d81b --- /dev/null +++ b/test/staging/sm/strict/11.1.5.js @@ -0,0 +1,176 @@ +/* + * Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/licenses/publicdomain/ + */ + +/*--- +includes: [sm/non262-shell.js, sm/non262-strict-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +/* Simple identifier labels. */ +assert.sameValue(testLenientAndStrict('({x:1, x:1})', + parsesSuccessfully, + parsesSuccessfully), + true); + +assert.sameValue(testLenientAndStrict('({x:1, y:1})', + parsesSuccessfully, + parsesSuccessfully), + true); + +assert.sameValue(testLenientAndStrict('({x:1, y:1, x:1})', + parsesSuccessfully, + parsesSuccessfully), + true); + +/* Property names can be written as strings, too. */ +assert.sameValue(testLenientAndStrict('({x:1, "x":1})', + parsesSuccessfully, + parsesSuccessfully), + true); + +assert.sameValue(testLenientAndStrict('({"x":1, x:1})', + parsesSuccessfully, + parsesSuccessfully), + true); + +assert.sameValue(testLenientAndStrict('({"x":1, "x":1})', + parsesSuccessfully, + parsesSuccessfully), + true); + +/* Numeric property names. */ +assert.sameValue(testLenientAndStrict('({1.5:1, 1.5:1})', + parsesSuccessfully, + parsesSuccessfully), + true); + +assert.sameValue(testLenientAndStrict('({1.5:1, 15e-1:1})', + parsesSuccessfully, + parsesSuccessfully), + true); + +assert.sameValue(testLenientAndStrict('({6.02214179e23:1, 6.02214179e23:1})', + parsesSuccessfully, + parsesSuccessfully), + true); + +assert.sameValue(testLenientAndStrict('({6.02214179e23:1, 3.1415926535:1})', + parsesSuccessfully, + parsesSuccessfully), + true); + +assert.sameValue(testLenientAndStrict('({ 1: 1, "1": 2 })', + parsesSuccessfully, + parsesSuccessfully), + true); + +assert.sameValue(testLenientAndStrict('({ "1": 1, 1: 2 })', + parsesSuccessfully, + parsesSuccessfully), + true); + +assert.sameValue(testLenientAndStrict('({ 2.5: 1, "2.5": 2 })', + parsesSuccessfully, + parsesSuccessfully), + true); + +assert.sameValue(testLenientAndStrict('({ "2.5": 1, 2.5: 2 })', + parsesSuccessfully, + parsesSuccessfully), + true); + +/* Many properties, to exercise JSAtomList's hash-table variant. */ +assert.sameValue(testLenientAndStrict('({a:1, b:1, c:1, d:1, e:1, f:1, g:1, h:1, i:1, j:1, k:1, l:1, m:1, n:1, o:1, p:1, q:1, r:1, s:1, t:1, u:1, v:1, w:1, x:1, y:1, z:1})', + parsesSuccessfully, + parsesSuccessfully), + true); + +assert.sameValue(testLenientAndStrict('({a:1, b:1, c:1, d:1, e:1, f:1, g:1, h:1, i:1, j:1, k:1, l:1, m:1, n:1, o:1, p:1, q:1, r:1, s:1, t:1, u:1, v:1, w:1, x:1, y:1, a:1})', + parsesSuccessfully, + parsesSuccessfully), + true); + +/* + * Getters, setters, and value properties should conflict only when + * appropriate. + */ +assert.sameValue(testLenientAndStrict('({get x() {}, x:1})', + parsesSuccessfully, + parsesSuccessfully), + true); + +assert.sameValue(testLenientAndStrict('({x:1, get x() {}})', + parsesSuccessfully, + parsesSuccessfully), + true); + +assert.sameValue(testLenientAndStrict('({set x(q) {}, x:1})', + parsesSuccessfully, + parsesSuccessfully), + true); + +assert.sameValue(testLenientAndStrict('({x:1, set x(q) {}})', + parsesSuccessfully, + parsesSuccessfully), + true); + +assert.sameValue(testLenientAndStrict('({1:1, set 1(q) {}})', + parsesSuccessfully, + parsesSuccessfully), + true); + +assert.sameValue(testLenientAndStrict('({set 1(q) {}, 1:1})', + parsesSuccessfully, + parsesSuccessfully), + true); + +assert.sameValue(testLenientAndStrict('({"1":1, set 1(q) {}})', + parsesSuccessfully, + parsesSuccessfully), + true); + +assert.sameValue(testLenientAndStrict('({set 1(q) {}, "1":1})', + parsesSuccessfully, + parsesSuccessfully), + true); + +assert.sameValue(testLenientAndStrict('({get x() {}, set x(q) {}})', + parsesSuccessfully, + parsesSuccessfully), + true); + +assert.sameValue(testLenientAndStrict('({set x(q) {}, get x() {}})', + parsesSuccessfully, + parsesSuccessfully), + true); + +assert.sameValue(testLenientAndStrict('({get x() {}, set x(q) {}, x:1})', + parsesSuccessfully, + parsesSuccessfully), + true); + +assert.sameValue(testLenientAndStrict('({set x(q) {}, get x() {}, x:1})', + parsesSuccessfully, + parsesSuccessfully), + true); + +assert.sameValue(testLenientAndStrict('({get x() {}, get x() {}})', + parsesSuccessfully, + parsesSuccessfully), + true); + +assert.sameValue(testLenientAndStrict('({set x(q) {}, set x(q) {}})', + parsesSuccessfully, + parsesSuccessfully), + true); + +assert.sameValue(testLenientAndStrict('({get x() {}, set x(q) {}, y:1})', + parsesSuccessfully, + parsesSuccessfully), + true); + diff --git a/test/staging/sm/strict/11.13.1.js b/test/staging/sm/strict/11.13.1.js new file mode 100644 index 0000000000..6eb4d6bf3d --- /dev/null +++ b/test/staging/sm/strict/11.13.1.js @@ -0,0 +1,34 @@ +/* + * Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/licenses/publicdomain/ + */ + +/*--- +includes: [sm/non262-shell.js, sm/non262-strict-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +/* + * Simple assignment expressions in strict mode code must not be + * assignments to 'eval' or 'arguments'. + */ +assert.sameValue(testLenientAndStrict('arguments=1', + parsesSuccessfully, + parseRaisesException(SyntaxError)), + true); +assert.sameValue(testLenientAndStrict('eval=1', + parsesSuccessfully, + parseRaisesException(SyntaxError)), + true); +assert.sameValue(testLenientAndStrict('(arguments)=1', + parsesSuccessfully, + parseRaisesException(SyntaxError)), + true); +assert.sameValue(testLenientAndStrict('(eval)=1', + parsesSuccessfully, + parseRaisesException(SyntaxError)), + true); + diff --git a/test/staging/sm/strict/11.13.2.js b/test/staging/sm/strict/11.13.2.js new file mode 100644 index 0000000000..59347496a8 --- /dev/null +++ b/test/staging/sm/strict/11.13.2.js @@ -0,0 +1,34 @@ +/* + * Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/licenses/publicdomain/ + */ + +/*--- +includes: [sm/non262-shell.js, sm/non262-strict-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +/* + * Compound assignment expressions in strict mode code must not be + * assignments to 'eval' or 'arguments'. + */ +assert.sameValue(testLenientAndStrict('arguments+=1', + parsesSuccessfully, + parseRaisesException(SyntaxError)), + true); +assert.sameValue(testLenientAndStrict('eval+=1', + parsesSuccessfully, + parseRaisesException(SyntaxError)), + true); +assert.sameValue(testLenientAndStrict('(arguments)+=1', + parsesSuccessfully, + parseRaisesException(SyntaxError)), + true); +assert.sameValue(testLenientAndStrict('(eval)+=1', + parsesSuccessfully, + parseRaisesException(SyntaxError)), + true); + diff --git a/test/staging/sm/strict/11.3.1.js b/test/staging/sm/strict/11.3.1.js new file mode 100644 index 0000000000..0de28055db --- /dev/null +++ b/test/staging/sm/strict/11.3.1.js @@ -0,0 +1,34 @@ +/* + * Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/licenses/publicdomain/ + */ + +/*--- +includes: [sm/non262-shell.js, sm/non262-strict-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +/* + * Postfix increment expressions must not have 'eval' or 'arguments' + * as their operands. + */ +assert.sameValue(testLenientAndStrict('arguments++', + parsesSuccessfully, + parseRaisesException(SyntaxError)), + true); +assert.sameValue(testLenientAndStrict('eval++', + parsesSuccessfully, + parseRaisesException(SyntaxError)), + true); +assert.sameValue(testLenientAndStrict('(arguments)++', + parsesSuccessfully, + parseRaisesException(SyntaxError)), + true); +assert.sameValue(testLenientAndStrict('(eval)++', + parsesSuccessfully, + parseRaisesException(SyntaxError)), + true); + diff --git a/test/staging/sm/strict/11.3.2.js b/test/staging/sm/strict/11.3.2.js new file mode 100644 index 0000000000..3a8b6eafbb --- /dev/null +++ b/test/staging/sm/strict/11.3.2.js @@ -0,0 +1,34 @@ +/* + * Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/licenses/publicdomain/ + */ + +/*--- +includes: [sm/non262-shell.js, sm/non262-strict-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +/* + * Postfix decrement expressions must not have 'eval' or 'arguments' + * as their operands. + */ +assert.sameValue(testLenientAndStrict('arguments--', + parsesSuccessfully, + parseRaisesException(SyntaxError)), + true); +assert.sameValue(testLenientAndStrict('eval--', + parsesSuccessfully, + parseRaisesException(SyntaxError)), + true); +assert.sameValue(testLenientAndStrict('(arguments)--', + parsesSuccessfully, + parseRaisesException(SyntaxError)), + true); +assert.sameValue(testLenientAndStrict('(eval)--', + parsesSuccessfully, + parseRaisesException(SyntaxError)), + true); + diff --git a/test/staging/sm/strict/11.4.1.js b/test/staging/sm/strict/11.4.1.js new file mode 100644 index 0000000000..3f091bb1d7 --- /dev/null +++ b/test/staging/sm/strict/11.4.1.js @@ -0,0 +1,50 @@ +/* + * Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/licenses/publicdomain/ + */ + +/*--- +includes: [sm/non262-shell.js, sm/non262-strict-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +/* Deleting an identifier is a syntax error in strict mode code only. */ +assert.sameValue(testLenientAndStrict('delete x;', + parsesSuccessfully, + parseRaisesException(SyntaxError)), + true); + +/* + * A reference expression surrounded by parens is itself a reference + * expression. + */ +assert.sameValue(testLenientAndStrict('delete (x);', + parsesSuccessfully, + parseRaisesException(SyntaxError)), + true); + +/* Deleting other sorts of expressions are not syntax errors in either mode. */ +assert.sameValue(testLenientAndStrict('delete x.y;', + parsesSuccessfully, + parsesSuccessfully), + true); +assert.sameValue(testLenientAndStrict('delete Object();', + returns(true), + returns(true)), + true); + +/* Functions should inherit the surrounding code's strictness. */ +assert.sameValue(testLenientAndStrict('function f() { delete x; }', + parsesSuccessfully, + parseRaisesException(SyntaxError)), + true); + +/* Local directives override the surrounding code's strictness. */ +assert.sameValue(testLenientAndStrict('function f() { "use strict"; delete x; }', + parseRaisesException(SyntaxError), + parseRaisesException(SyntaxError)), + true); + diff --git a/test/staging/sm/strict/11.4.4.js b/test/staging/sm/strict/11.4.4.js new file mode 100644 index 0000000000..9acf7758b4 --- /dev/null +++ b/test/staging/sm/strict/11.4.4.js @@ -0,0 +1,34 @@ +/* + * Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/licenses/publicdomain/ + */ + +/*--- +includes: [sm/non262-shell.js, sm/non262-strict-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +/* + * Prefix increment expressions must not have 'eval' or 'arguments' as + * their operands. + */ +assert.sameValue(testLenientAndStrict('++arguments', + parsesSuccessfully, + parseRaisesException(SyntaxError)), + true); +assert.sameValue(testLenientAndStrict('++eval', + parsesSuccessfully, + parseRaisesException(SyntaxError)), + true); +assert.sameValue(testLenientAndStrict('++(arguments)', + parsesSuccessfully, + parseRaisesException(SyntaxError)), + true); +assert.sameValue(testLenientAndStrict('++(eval)', + parsesSuccessfully, + parseRaisesException(SyntaxError)), + true); + diff --git a/test/staging/sm/strict/11.4.5.js b/test/staging/sm/strict/11.4.5.js new file mode 100644 index 0000000000..bf176b02af --- /dev/null +++ b/test/staging/sm/strict/11.4.5.js @@ -0,0 +1,34 @@ +/* + * Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/licenses/publicdomain/ + */ + +/*--- +includes: [sm/non262-shell.js, sm/non262-strict-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +/* + * Prefix decrement expressions must not have 'eval' or 'arguments' as + * their operands. + */ +assert.sameValue(testLenientAndStrict('--arguments', + parsesSuccessfully, + parseRaisesException(SyntaxError)), + true); +assert.sameValue(testLenientAndStrict('--eval', + parsesSuccessfully, + parseRaisesException(SyntaxError)), + true); +assert.sameValue(testLenientAndStrict('--(arguments)', + parsesSuccessfully, + parseRaisesException(SyntaxError)), + true); +assert.sameValue(testLenientAndStrict('--(eval)', + parsesSuccessfully, + parseRaisesException(SyntaxError)), + true); + diff --git a/test/staging/sm/strict/12.10.1.js b/test/staging/sm/strict/12.10.1.js new file mode 100644 index 0000000000..4d78ecb940 --- /dev/null +++ b/test/staging/sm/strict/12.10.1.js @@ -0,0 +1,35 @@ +/* + * Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/licenses/publicdomain/ + */ + +/*--- +includes: [sm/non262-shell.js, sm/non262-strict-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +/* + * 'with' statements are forbidden in strict top-level code. This is + * eval code, but that's close enough. + */ +assert.sameValue(testLenientAndStrict('with (1) {}', + completesNormally, + raisesException(SyntaxError)), + true); + +/* 'with' statements are forbidden in strict function code. */ +assert.sameValue(testLenientAndStrict('function f() { "use strict"; with (1) {} }', + parseRaisesException(SyntaxError), + parseRaisesException(SyntaxError)), + true); + +/* + * A use strict directive in a function mustn't affect the strictness + * of subsequent code. + */ +assert.sameValue(parsesSuccessfully('function f() { "use strict"; }; with (1) {}'), + true); + diff --git a/test/staging/sm/strict/12.14.1.js b/test/staging/sm/strict/12.14.1.js new file mode 100644 index 0000000000..ce6548434f --- /dev/null +++ b/test/staging/sm/strict/12.14.1.js @@ -0,0 +1,42 @@ +/* + * Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/licenses/publicdomain/ + */ + +/*--- +includes: [sm/non262-shell.js, sm/non262-strict-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +/* + * In strict mode, the identifier bound by a 'catch' clause may not + * be 'eval' or 'arguments'. + */ +assert.sameValue(testLenientAndStrict('try{}catch(eval){}', + parsesSuccessfully, + parseRaisesException(SyntaxError)), + true); +assert.sameValue(testLenientAndStrict('try{}catch([eval]){}', + parsesSuccessfully, + parseRaisesException(SyntaxError)), + true); +assert.sameValue(testLenientAndStrict('try{}catch({x:eval}){}', + parsesSuccessfully, + parseRaisesException(SyntaxError)), + true); +assert.sameValue(testLenientAndStrict('try{}catch(arguments){}', + parsesSuccessfully, + parseRaisesException(SyntaxError)), + true); +assert.sameValue(testLenientAndStrict('try{}catch([arguments]){}', + parsesSuccessfully, + parseRaisesException(SyntaxError)), + true); +assert.sameValue(testLenientAndStrict('try{}catch({x:arguments}){}', + parsesSuccessfully, + parseRaisesException(SyntaxError)), + true); + diff --git a/test/staging/sm/strict/12.2.1-01.js b/test/staging/sm/strict/12.2.1-01.js new file mode 100644 index 0000000000..93c4a22a52 --- /dev/null +++ b/test/staging/sm/strict/12.2.1-01.js @@ -0,0 +1,79 @@ +/* + * Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/licenses/publicdomain/ + */ + +/*--- +includes: [sm/non262-shell.js, sm/non262-strict-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +/* + * In strict mode code, 'let' and 'const' declarations may not bind + * 'eval' or 'arguments'. + */ +assert.sameValue(testLenientAndStrict('let eval;', + parsesSuccessfully, + parseRaisesException(SyntaxError)), + true); +assert.sameValue(testLenientAndStrict('let x,eval;', + parsesSuccessfully, + parseRaisesException(SyntaxError)), + true); +assert.sameValue(testLenientAndStrict('let arguments;', + parsesSuccessfully, + parseRaisesException(SyntaxError)), + true); +assert.sameValue(testLenientAndStrict('let x,arguments;', + parsesSuccessfully, + parseRaisesException(SyntaxError)), + true); +assert.sameValue(testLenientAndStrict('const eval = undefined;', + parsesSuccessfully, + parseRaisesException(SyntaxError)), + true); +assert.sameValue(testLenientAndStrict('const x = undefined,eval = undefined;', + parsesSuccessfully, + parseRaisesException(SyntaxError)), + true); +assert.sameValue(testLenientAndStrict('const arguments = undefined;', + parsesSuccessfully, + parseRaisesException(SyntaxError)), + true); +assert.sameValue(testLenientAndStrict('const x = undefined,arguments = undefined;', + parsesSuccessfully, + parseRaisesException(SyntaxError)), + true); + +/* + * In strict mode code, 'let' declarations appearing in 'for' + * or 'for in' statements may not bind 'eval' or 'arguments'. + */ +assert.sameValue(testLenientAndStrict('for (let eval in [])break;', + parsesSuccessfully, + parseRaisesException(SyntaxError)), + true); +assert.sameValue(testLenientAndStrict('for (let [eval] in [])break;', + parsesSuccessfully, + parseRaisesException(SyntaxError)), + true); +assert.sameValue(testLenientAndStrict('for (let {x:eval} in [])break;', + parsesSuccessfully, + parseRaisesException(SyntaxError)), + true); +assert.sameValue(testLenientAndStrict('for (let arguments in [])break;', + parsesSuccessfully, + parseRaisesException(SyntaxError)), + true); +assert.sameValue(testLenientAndStrict('for (let [arguments] in [])break;', + parsesSuccessfully, + parseRaisesException(SyntaxError)), + true); +assert.sameValue(testLenientAndStrict('for (let {x:arguments} in [])break;', + parsesSuccessfully, + parseRaisesException(SyntaxError)), + true); + diff --git a/test/staging/sm/strict/12.2.1.js b/test/staging/sm/strict/12.2.1.js new file mode 100644 index 0000000000..1872db7679 --- /dev/null +++ b/test/staging/sm/strict/12.2.1.js @@ -0,0 +1,30 @@ +/* + * Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/licenses/publicdomain/ + */ + +/*--- +includes: [sm/non262-shell.js, sm/non262-strict-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +assert.sameValue(testLenientAndStrict('var eval;', + parsesSuccessfully, + parseRaisesException(SyntaxError)), + true); +assert.sameValue(testLenientAndStrict('var x,eval;', + parsesSuccessfully, + parseRaisesException(SyntaxError)), + true); +assert.sameValue(testLenientAndStrict('var arguments;', + parsesSuccessfully, + parseRaisesException(SyntaxError)), + true); +assert.sameValue(testLenientAndStrict('var x,arguments;', + parsesSuccessfully, + parseRaisesException(SyntaxError)), + true); + diff --git a/test/staging/sm/strict/13.1.js b/test/staging/sm/strict/13.1.js new file mode 100644 index 0000000000..9ad35ae68f --- /dev/null +++ b/test/staging/sm/strict/13.1.js @@ -0,0 +1,350 @@ +/* + * Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/licenses/publicdomain/ + */ + +/*--- +includes: [sm/non262-shell.js, sm/non262-strict-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +/* + * In strict mode, it is a syntax error for an identifier to appear + * more than once in a function's argument list. + */ + +/* + * The parameters of ordinary function definitions should not contain + * duplicate identifiers. + */ +assert.sameValue(testLenientAndStrict('function f(x,y) {}', + parsesSuccessfully, + parsesSuccessfully), + true); +assert.sameValue(testLenientAndStrict('function f(x,x) {}', + parsesSuccessfully, + parseRaisesException(SyntaxError)), + true); +assert.sameValue(testLenientAndStrict('function f(x,y,z,y) {}', + parsesSuccessfully, + parseRaisesException(SyntaxError)), + true); + +/* Exercise the hashed local name map case. */ +assert.sameValue(testLenientAndStrict('function f(a,b,c,d,e,f,g,h,d) {}', + parsesSuccessfully, + parseRaisesException(SyntaxError)), + true); + +/* + * SpiderMonkey has always treated duplicates in destructuring + * patterns as an error. Strict mode should not affect this. + */ +assert.sameValue(testLenientAndStrict('function f([x,y]) {}', + parsesSuccessfully, + parsesSuccessfully), + true); +assert.sameValue(testLenientAndStrict('function f([x,x]){}', + parseRaisesException(SyntaxError), + parseRaisesException(SyntaxError)), + true); +assert.sameValue(testLenientAndStrict('function f(x,[x]){}', + parseRaisesException(SyntaxError), + parseRaisesException(SyntaxError)), + true); + +/* + * Strict rules apply to the parameters if the function's body is + * strict. + */ +assert.sameValue(testLenientAndStrict('function f(x,x) { "use strict" };', + parseRaisesException(SyntaxError), + parseRaisesException(SyntaxError)), + true); + +/* + * Calls to the function constructor should not be affected by the + * strictness of the calling code, but should be affected by the + * strictness of the function body. + */ +assert.sameValue(testLenientAndStrict('Function("x","x","")', + completesNormally, + completesNormally), + true); +assert.sameValue(testLenientAndStrict('Function("x","y","")', + completesNormally, + completesNormally), + true); +assert.sameValue(testLenientAndStrict('Function("x","x","\'use strict\'")', + raisesException(SyntaxError), + raisesException(SyntaxError)), + true); +assert.sameValue(testLenientAndStrict('Function("x","y","\'use strict\'")', + completesNormally, + completesNormally), + true); + + +/* + * The parameter lists of function expressions should not contain + * duplicate identifiers. + */ +assert.sameValue(testLenientAndStrict('(function (x,x) {})', + parsesSuccessfully, + parseRaisesException(SyntaxError)), + true); +assert.sameValue(testLenientAndStrict('(function (x,y) {})', + parsesSuccessfully, + parsesSuccessfully), + true); + +/* + * All permutations of: + * - For the two magic identifiers 'arguments' or 'eval' + * - For function definitions, function expressions, expression closures, + * and getter and setter property definitions, + * - For forms that inherit their context's strictness, and forms that + * include their own strictness directives, + * - For ordinary parameters, array destructuring parameters, and + * object destructuring parameters, + * - the magic identifiers may be used to name such parameters + * in lenient code, but not in strict code + * - the magic identifiers may be used as function names in lenient code, + * but not in strict code + */ +assert.sameValue(testLenientAndStrict('function f(eval){}', + parsesSuccessfully, + parseRaisesException(SyntaxError)), + true); +assert.sameValue(testLenientAndStrict('function f([eval]){}', + parsesSuccessfully, + parseRaisesException(SyntaxError)), + true); +assert.sameValue(testLenientAndStrict('function f({x:eval}){}', + parsesSuccessfully, + parseRaisesException(SyntaxError)), + true); +assert.sameValue(testLenientAndStrict('function eval(){}', + parsesSuccessfully, + parseRaisesException(SyntaxError)), + true); +assert.sameValue(testLenientAndStrict('function f(eval){"use strict";}', + parseRaisesException(SyntaxError), + parseRaisesException(SyntaxError)), + true); +assert.sameValue(testLenientAndStrict('function f([eval]){"use strict";}', + parseRaisesException(SyntaxError), + parseRaisesException(SyntaxError)), + true); +assert.sameValue(testLenientAndStrict('function f({x:eval}){"use strict";}', + parseRaisesException(SyntaxError), + parseRaisesException(SyntaxError)), + true); +assert.sameValue(testLenientAndStrict('function eval(){"use strict";}', + parseRaisesException(SyntaxError), + parseRaisesException(SyntaxError)), + true); +assert.sameValue(testLenientAndStrict('(function f(eval){})', + parsesSuccessfully, + parseRaisesException(SyntaxError)), + true); +assert.sameValue(testLenientAndStrict('(function f([eval]){})', + parsesSuccessfully, + parseRaisesException(SyntaxError)), + true); +assert.sameValue(testLenientAndStrict('(function f({x:eval}){})', + parsesSuccessfully, + parseRaisesException(SyntaxError)), + true); +assert.sameValue(testLenientAndStrict('(function eval(){})', + parsesSuccessfully, + parseRaisesException(SyntaxError)), + true); +assert.sameValue(testLenientAndStrict('(function f(eval){"use strict";})', + parseRaisesException(SyntaxError), + parseRaisesException(SyntaxError)), + true); +assert.sameValue(testLenientAndStrict('(function f([eval]){"use strict";})', + parseRaisesException(SyntaxError), + parseRaisesException(SyntaxError)), + true); +assert.sameValue(testLenientAndStrict('(function f({x:eval}){"use strict";})', + parseRaisesException(SyntaxError), + parseRaisesException(SyntaxError)), + true); +assert.sameValue(testLenientAndStrict('(function eval(){"use strict";})', + parseRaisesException(SyntaxError), + parseRaisesException(SyntaxError)), + true); +assert.sameValue(testLenientAndStrict('(function f(eval) {})', + parsesSuccessfully, + parseRaisesException(SyntaxError)), + true); +assert.sameValue(testLenientAndStrict('(function f([eval]) {})', + parsesSuccessfully, + parseRaisesException(SyntaxError)), + true); +assert.sameValue(testLenientAndStrict('(function f({x:eval}) {})', + parsesSuccessfully, + parseRaisesException(SyntaxError)), + true); +assert.sameValue(testLenientAndStrict('(function eval() {})', + parsesSuccessfully, + parseRaisesException(SyntaxError)), + true); +assert.sameValue(testLenientAndStrict('({set x(eval){}})', + parsesSuccessfully, + parseRaisesException(SyntaxError)), + true); +assert.sameValue(testLenientAndStrict('({set x([eval]){}})', + parsesSuccessfully, + parseRaisesException(SyntaxError)), + true); +assert.sameValue(testLenientAndStrict('({set x({x:eval}){}})', + parsesSuccessfully, + parseRaisesException(SyntaxError)), + true); +assert.sameValue(testLenientAndStrict('({set x(eval){"use strict";}})', + parseRaisesException(SyntaxError), + parseRaisesException(SyntaxError)), + true); +assert.sameValue(testLenientAndStrict('({set x([eval]){"use strict";}})', + parseRaisesException(SyntaxError), + parseRaisesException(SyntaxError)), + true); +assert.sameValue(testLenientAndStrict('({set x({x:eval}){"use strict";}})', + parseRaisesException(SyntaxError), + parseRaisesException(SyntaxError)), + true); +assert.sameValue(testLenientAndStrict('function f(arguments){}', + parsesSuccessfully, + parseRaisesException(SyntaxError)), + true); +assert.sameValue(testLenientAndStrict('function f([arguments]){}', + parsesSuccessfully, + parseRaisesException(SyntaxError)), + true); +assert.sameValue(testLenientAndStrict('function f({x:arguments}){}', + parsesSuccessfully, + parseRaisesException(SyntaxError)), + true); +assert.sameValue(testLenientAndStrict('function arguments(){}', + parsesSuccessfully, + parseRaisesException(SyntaxError)), + true); +assert.sameValue(testLenientAndStrict('function f(arguments){"use strict";}', + parseRaisesException(SyntaxError), + parseRaisesException(SyntaxError)), + true); +assert.sameValue(testLenientAndStrict('function f([arguments]){"use strict";}', + parseRaisesException(SyntaxError), + parseRaisesException(SyntaxError)), + true); +assert.sameValue(testLenientAndStrict('function f({x:arguments}){"use strict";}', + parseRaisesException(SyntaxError), + parseRaisesException(SyntaxError)), + true); +assert.sameValue(testLenientAndStrict('function arguments(){"use strict";}', + parseRaisesException(SyntaxError), + parseRaisesException(SyntaxError)), + true); +assert.sameValue(testLenientAndStrict('(function f(arguments){})', + parsesSuccessfully, + parseRaisesException(SyntaxError)), + true); +assert.sameValue(testLenientAndStrict('(function f([arguments]){})', + parsesSuccessfully, + parseRaisesException(SyntaxError)), + true); +assert.sameValue(testLenientAndStrict('(function f({x:arguments}){})', + parsesSuccessfully, + parseRaisesException(SyntaxError)), + true); +assert.sameValue(testLenientAndStrict('(function arguments(){})', + parsesSuccessfully, + parseRaisesException(SyntaxError)), + true); +assert.sameValue(testLenientAndStrict('(function f(arguments){"use strict";})', + parseRaisesException(SyntaxError), + parseRaisesException(SyntaxError)), + true); +assert.sameValue(testLenientAndStrict('(function f([arguments]){"use strict";})', + parseRaisesException(SyntaxError), + parseRaisesException(SyntaxError)), + true); +assert.sameValue(testLenientAndStrict('(function f({x:arguments}){"use strict";})', + parseRaisesException(SyntaxError), + parseRaisesException(SyntaxError)), + true); +assert.sameValue(testLenientAndStrict('(function arguments(){"use strict";})', + parseRaisesException(SyntaxError), + parseRaisesException(SyntaxError)), + true); +assert.sameValue(testLenientAndStrict('(function f(arguments) {})', + parsesSuccessfully, + parseRaisesException(SyntaxError)), + true); +assert.sameValue(testLenientAndStrict('(function f([arguments]) {})', + parsesSuccessfully, + parseRaisesException(SyntaxError)), + true); +assert.sameValue(testLenientAndStrict('(function f({x:arguments}) {})', + parsesSuccessfully, + parseRaisesException(SyntaxError)), + true); +assert.sameValue(testLenientAndStrict('(function arguments() {})', + parsesSuccessfully, + parseRaisesException(SyntaxError)), + true); +assert.sameValue(testLenientAndStrict('({set x(arguments){}})', + parsesSuccessfully, + parseRaisesException(SyntaxError)), + true); +assert.sameValue(testLenientAndStrict('({set x([arguments]){}})', + parsesSuccessfully, + parseRaisesException(SyntaxError)), + true); +assert.sameValue(testLenientAndStrict('({set x({x:arguments}){}})', + parsesSuccessfully, + parseRaisesException(SyntaxError)), + true); +assert.sameValue(testLenientAndStrict('({set x(arguments){"use strict";}})', + parseRaisesException(SyntaxError), + parseRaisesException(SyntaxError)), + true); +assert.sameValue(testLenientAndStrict('({set x([arguments]){"use strict";}})', + parseRaisesException(SyntaxError), + parseRaisesException(SyntaxError)), + true); +assert.sameValue(testLenientAndStrict('({set x({x:arguments}){"use strict";}})', + parseRaisesException(SyntaxError), + parseRaisesException(SyntaxError)), + true); + +/* + * Functions produced using the Function constructor may not use + * 'eval' or 'arguments' as a parameter name if their body is strict + * mode code. The strictness of the calling code does not affect the + * constraints applied to the parameters. + */ +assert.sameValue(testLenientAndStrict('Function("eval","")', + completesNormally, + completesNormally), + true); +assert.sameValue(testLenientAndStrict('Function("eval","\'use strict\';")', + raisesException(SyntaxError), + raisesException(SyntaxError)), + true); +assert.sameValue(testLenientAndStrict('Function("arguments","")', + completesNormally, + completesNormally), + true); +assert.sameValue(testLenientAndStrict('Function("arguments","\'use strict\';")', + raisesException(SyntaxError), + raisesException(SyntaxError)), + true); + + diff --git a/test/staging/sm/strict/15.10.7.js b/test/staging/sm/strict/15.10.7.js new file mode 100644 index 0000000000..6f14892f7c --- /dev/null +++ b/test/staging/sm/strict/15.10.7.js @@ -0,0 +1,20 @@ +/* + * Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/licenses/publicdomain/ + */ + +/*--- +includes: [sm/non262-shell.js, sm/non262-strict-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +assert.sameValue(testLenientAndStrict('var r = /foo/; r.lastIndex = 42; r.lastIndex', + returns(42), returns(42)), + true); +assert.sameValue(testLenientAndStrict('var r = /foo/; delete r.lastIndex', + returns(false), raisesException(TypeError)), + true); + diff --git a/test/staging/sm/strict/15.3.4.5.js b/test/staging/sm/strict/15.3.4.5.js new file mode 100644 index 0000000000..472a631537 --- /dev/null +++ b/test/staging/sm/strict/15.3.4.5.js @@ -0,0 +1,31 @@ +/* + * Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/licenses/publicdomain/ + */ + +/*--- +includes: [sm/non262-shell.js, sm/non262-strict-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +function strict() { 'use strict'; return this; } +function lenient() { return this; } +var obj = {}; + +assert.sameValue(strict.bind(true)(), true); +assert.sameValue(strict.bind(42)(), 42); +assert.sameValue(strict.bind("")(), ""); +assert.sameValue(strict.bind(null)(), null); +assert.sameValue(strict.bind(undefined)(), undefined); +assert.sameValue(strict.bind(obj)(), obj); + +assert.sameValue(lenient.bind(true)() instanceof Boolean, true); +assert.sameValue(lenient.bind(42)() instanceof Number, true); +assert.sameValue(lenient.bind("")() instanceof String, true); +assert.sameValue(lenient.bind(null)(), this); +assert.sameValue(lenient.bind(undefined)(), this); +assert.sameValue(lenient.bind(obj)(), obj); + diff --git a/test/staging/sm/strict/15.3.5.1.js b/test/staging/sm/strict/15.3.5.1.js new file mode 100644 index 0000000000..baecace0f8 --- /dev/null +++ b/test/staging/sm/strict/15.3.5.1.js @@ -0,0 +1,21 @@ +/* + * Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/licenses/publicdomain/ + */ + +/*--- +includes: [sm/non262-shell.js, sm/non262-strict-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +function fn() { + return function(a, b, c) { }; +} + +assert.sameValue(testLenientAndStrict('var f = fn(); f.length = 1; f.length', + returns(3), raisesException(TypeError)), + true); + diff --git a/test/staging/sm/strict/15.3.5.2.js b/test/staging/sm/strict/15.3.5.2.js new file mode 100644 index 0000000000..d804841387 --- /dev/null +++ b/test/staging/sm/strict/15.3.5.2.js @@ -0,0 +1,21 @@ +/* + * Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/licenses/publicdomain/ + */ + +/*--- +includes: [sm/non262-shell.js, sm/non262-strict-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +function fn() { + return function(a, b, c) { }; +} + +assert.sameValue(testLenientAndStrict('var f = fn(); delete f.prototype', + returns(false), raisesException(TypeError)), + true); + diff --git a/test/staging/sm/strict/15.4.4.11.js b/test/staging/sm/strict/15.4.4.11.js new file mode 100644 index 0000000000..6ee836f438 --- /dev/null +++ b/test/staging/sm/strict/15.4.4.11.js @@ -0,0 +1,37 @@ +/* + * Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/licenses/publicdomain/ + */ + +/*--- +includes: [sm/non262-shell.js, sm/non262-strict-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +function arr() { + return Object.defineProperty([20, 10, 30], 0, {writable: false}); +} + +assert.sameValue(testLenientAndStrict('var a = arr(); a.sort()', + raisesException(TypeError), + raisesException(TypeError)), + true); + +function obj() { + var o = {0: 20, 1: 10, 2: 30, length: 3}; + Object.defineProperty(o, 0, {writable: false}); + return o; +} + +assert.sameValue(testLenientAndStrict('var o = obj(); Array.prototype.sort.call(o)', + raisesException(TypeError), + raisesException(TypeError)), + true); + +// The behavior of sort is implementation-defined if the object being +// sorted is sparse, so I'm not sure how to test its behavior on +// non-configurable properties. + diff --git a/test/staging/sm/strict/15.4.4.12.js b/test/staging/sm/strict/15.4.4.12.js new file mode 100644 index 0000000000..bcedb9c215 --- /dev/null +++ b/test/staging/sm/strict/15.4.4.12.js @@ -0,0 +1,55 @@ +/* + * Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/licenses/publicdomain/ + */ + +/*--- +includes: [sm/non262-shell.js, sm/non262-strict-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +function arr() { + return Object.defineProperty([1, 2, 3], 0, {writable: false}); +} + +function obj() { + var o = {0: 1, 1: 2, 2: 3, length: 3}; + Object.defineProperty(o, 0, {writable: false}); + return o; +} + +assert.sameValue(testLenientAndStrict('var a = arr(); [a.splice(0, 1), a]', + raisesException(TypeError), + raisesException(TypeError)), + true); + +assert.sameValue(testLenientAndStrict('var o = obj(); [Array.prototype.splice.call(o, 0, 1), o]', + raisesException(TypeError), + raisesException(TypeError)), + true); + +function agap() { + var a = [1, 2, , 4]; + Object.defineProperty(a, 1, {configurable: false}); + return a; +} + +function ogap() { + var o = {0: 1, 1: 2, /* no 2 */ 3: 4, length: 4}; + Object.defineProperty(o, 1, {configurable: false}); + return o; +} + +assert.sameValue(testLenientAndStrict('var a = agap(); [a.splice(0, 1), a]', + raisesException(TypeError), + raisesException(TypeError)), + true); + +assert.sameValue(testLenientAndStrict('var o = ogap(); [Array.prototype.splice.call(o, 0, 1), o]', + raisesException(TypeError), + raisesException(TypeError)), + true); + diff --git a/test/staging/sm/strict/15.4.4.13.js b/test/staging/sm/strict/15.4.4.13.js new file mode 100644 index 0000000000..4c6a3d9832 --- /dev/null +++ b/test/staging/sm/strict/15.4.4.13.js @@ -0,0 +1,55 @@ +/* + * Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/licenses/publicdomain/ + */ + +/*--- +includes: [sm/non262-shell.js, sm/non262-strict-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +function arr() { + return Object.defineProperty([1, 2, 3], 0, {writable: false}); +} + +function obj() { + var o = {0: 1, 1: 2, 2: 3, length: 3}; + Object.defineProperty(o, 0, {writable: false}); + return o; +} + +assert.sameValue(testLenientAndStrict('var a = arr(); [a.unshift(40, 50), a]', + raisesException(TypeError), + raisesException(TypeError)), + true); + +assert.sameValue(testLenientAndStrict('var o = obj(); [Array.prototype.unshift.call(o, 40, 50), o]', + raisesException(TypeError), + raisesException(TypeError)), + true); + +function agap() { + var a = [1, 2, , 4]; + Object.defineProperty(a, 3, {configurable: false}); + return a; +} + +function ogap() { + var o = {0: 1, 1: 2, /* no 2 */ 3: 4, length: 4}; + Object.defineProperty(o, 3, {configurable: false}); + return o; +} + +assert.sameValue(testLenientAndStrict('var a = agap(); [a.unshift(9), a]', + raisesException(TypeError), + raisesException(TypeError)), + true); + +assert.sameValue(testLenientAndStrict('var o = ogap(); [Array.prototype.unshift.call(o, 9), o]', + raisesException(TypeError), + raisesException(TypeError)), + true); + diff --git a/test/staging/sm/strict/15.4.4.6.js b/test/staging/sm/strict/15.4.4.6.js new file mode 100644 index 0000000000..4fac5bec67 --- /dev/null +++ b/test/staging/sm/strict/15.4.4.6.js @@ -0,0 +1,33 @@ +/* + * Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/licenses/publicdomain/ + */ + +/*--- +includes: [sm/non262-shell.js, sm/non262-strict-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +function arr() { + return Object.defineProperty([1, 2, 3], 2, {configurable: false}); +} + +function obj() { + var o = {0: 1, 1: 2, 2: 3, length: 3}; + Object.defineProperty(o, 2, {configurable: false}); + return o; +} + +assert.sameValue(testLenientAndStrict('var a = arr(); [a.pop(), a]', + raisesException(TypeError), + raisesException(TypeError)), + true); + +assert.sameValue(testLenientAndStrict('var o = obj(); [Array.prototype.pop.call(o), o]', + raisesException(TypeError), + raisesException(TypeError)), + true); + diff --git a/test/staging/sm/strict/15.4.4.8.js b/test/staging/sm/strict/15.4.4.8.js new file mode 100644 index 0000000000..9992df90af --- /dev/null +++ b/test/staging/sm/strict/15.4.4.8.js @@ -0,0 +1,55 @@ +/* + * Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/licenses/publicdomain/ + */ + +/*--- +includes: [sm/non262-shell.js, sm/non262-strict-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +function arr() { + return Object.defineProperty([1, 2, 3], 0, {writable: false}); +} + +function obj() { + var o = {0: 1, 1: 2, 2: 3, length: 3}; + Object.defineProperty(o, 0, {writable: false}); + return o; +} + +assert.sameValue(testLenientAndStrict('var a = arr(); a.reverse()', + raisesException(TypeError), + raisesException(TypeError)), + true); + +assert.sameValue(testLenientAndStrict('var o = obj(); Array.prototype.reverse.call(o)', + raisesException(TypeError), + raisesException(TypeError)), + true); + +function agap() { + var a = [1, 2, , 4]; + Object.defineProperty(a, 1, {configurable: false}); + return a; +} + +function ogap() { + var o = {0: 1, 1: 2, /* no 2 */ 3: 4, length: 4}; + Object.defineProperty(o, 1, {configurable: false}); + return o; +} + +assert.sameValue(testLenientAndStrict('var a = agap(); a.reverse()', + raisesException(TypeError), + raisesException(TypeError)), + true); + +assert.sameValue(testLenientAndStrict('var o = ogap(); Array.prototype.reverse.call(o)', + raisesException(TypeError), + raisesException(TypeError)), + true); + diff --git a/test/staging/sm/strict/15.4.4.9.js b/test/staging/sm/strict/15.4.4.9.js new file mode 100644 index 0000000000..4efade47e7 --- /dev/null +++ b/test/staging/sm/strict/15.4.4.9.js @@ -0,0 +1,55 @@ +/* + * Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/licenses/publicdomain/ + */ + +/*--- +includes: [sm/non262-shell.js, sm/non262-strict-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +function arr() { + return Object.defineProperty([10, 20, 30], 0, {writable: false}); +} + +function obj() { + var o = {0: 10, 1: 20, 2: 30, length: 3}; + Object.defineProperty(o, 0, {writable: false}); + return o; +} + +assert.sameValue(testLenientAndStrict('var a = arr(); [a.shift(), a]', + raisesException(TypeError), + raisesException(TypeError)), + true); + +assert.sameValue(testLenientAndStrict('var o = obj(); [Array.prototype.shift.call(o), o]', + raisesException(TypeError), + raisesException(TypeError)), + true); + +function agap() { + var a = [1, 2, , 4]; + Object.defineProperty(a, 1, {configurable: false}); + return a; +} + +function ogap() { + var o = {0: 1, 1: 2, /* no 2 */ 3: 4, length: 4}; + Object.defineProperty(o, 1, {configurable: false}); + return o; +} + +assert.sameValue(testLenientAndStrict('var a = agap(); [a.shift(), a]', + raisesException(TypeError), + raisesException(TypeError)), + true); + +assert.sameValue(testLenientAndStrict('var o = ogap(); [Array.prototype.shift.call(o), o]', + raisesException(TypeError), + raisesException(TypeError)), + true); + diff --git a/test/staging/sm/strict/15.4.5.1.js b/test/staging/sm/strict/15.4.5.1.js new file mode 100644 index 0000000000..e976fe8e53 --- /dev/null +++ b/test/staging/sm/strict/15.4.5.1.js @@ -0,0 +1,87 @@ +/* + * Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/licenses/publicdomain/ + */ + +/*--- +includes: [sm/non262-shell.js, sm/non262-strict-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +var out = {}; + +function arr() { + return Object.defineProperty([1, 2, 3, 4], 2, {configurable: false}); +} + +function nonStrict1(out) +{ + var a = out.array = arr(); + a.length = 2; +} + +function strict1(out) +{ + "use strict"; + var a = out.array = arr(); + a.length = 2; + return a; +} + +out.array = null; +nonStrict1(out); +assert.sameValue(deepEqual(out.array, [1, 2, 3]), true); + +out.array = null; +try +{ + strict1(out); + throw "no error"; +} +catch (e) +{ + assert.sameValue(e instanceof TypeError, true, "expected TypeError, got " + e); +} +assert.sameValue(deepEqual(out.array, [1, 2, 3]), true); + +// Internally, SpiderMonkey has two representations for arrays: +// fast-but-inflexible, and slow-but-flexible. Adding a non-index property +// to an array turns it into the latter. We should test on both kinds. +function addx(obj) { + obj.x = 5; + return obj; +} + +function nonStrict2(out) +{ + var a = out.array = addx(arr()); + a.length = 2; +} + +function strict2(out) +{ + "use strict"; + var a = out.array = addx(arr()); + a.length = 2; +} + +out.array = null; +nonStrict2(out); +assert.sameValue(deepEqual(out.array, addx([1, 2, 3])), true); + +out.array = null; +try +{ + strict2(out); + throw "no error"; +} +catch (e) +{ + assert.sameValue(e instanceof TypeError, true, "expected TypeError, got " + e); +} +assert.sameValue(deepEqual(out.array, addx([1, 2, 3])), true); + +print("Tests complete"); diff --git a/test/staging/sm/strict/15.5.5.1.js b/test/staging/sm/strict/15.5.5.1.js new file mode 100644 index 0000000000..6b911031e5 --- /dev/null +++ b/test/staging/sm/strict/15.5.5.1.js @@ -0,0 +1,31 @@ +/* + * Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/licenses/publicdomain/ + */ + +/*--- +includes: [sm/non262-shell.js, sm/non262-strict-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +function str() { + return new String("foo"); +} + +assert.sameValue(testLenientAndStrict('var s = str(); s.length = 1; s.length', + returns(3), raisesException(TypeError)), + true); +assert.sameValue(testLenientAndStrict('var s = str(); delete s.length', + returns(false), raisesException(TypeError)), + true); + +assert.sameValue(testLenientAndStrict('"foo".length = 1', + returns(1), raisesException(TypeError)), + true); +assert.sameValue(testLenientAndStrict('delete "foo".length', + returns(false), raisesException(TypeError)), + true); + diff --git a/test/staging/sm/strict/15.5.5.2.js b/test/staging/sm/strict/15.5.5.2.js new file mode 100644 index 0000000000..44ac42402c --- /dev/null +++ b/test/staging/sm/strict/15.5.5.2.js @@ -0,0 +1,20 @@ +/* + * Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/licenses/publicdomain/ + */ + +/*--- +includes: [sm/non262-shell.js, sm/non262-strict-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +assert.sameValue(testLenientAndStrict('"foo"[0] = 1', + returns(1), raisesException(TypeError)), + true); +assert.sameValue(testLenientAndStrict('delete "foo"[0]', + returns(false), raisesException(TypeError)), + true); + diff --git a/test/staging/sm/strict/8.12.5.js b/test/staging/sm/strict/8.12.5.js new file mode 100644 index 0000000000..afd94178c1 --- /dev/null +++ b/test/staging/sm/strict/8.12.5.js @@ -0,0 +1,87 @@ +/* + * Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/licenses/publicdomain/ + */ + +/*--- +includes: [sm/non262-shell.js, sm/non262-strict-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +function obj() { + var o = {all: 1, nowrite: 1, noconfig: 1, noble: 1}; + Object.defineProperty(o, 'nowrite', {writable: false}); + Object.defineProperty(o, 'noconfig', {configurable: false}); + Object.defineProperty(o, 'noble', {writable: false, configurable: false}); + return o; +} + +assert.sameValue(testLenientAndStrict('var o = obj(); o.all = 2; o.all', + returns(2), returns(2)), + true); + +assert.sameValue(testLenientAndStrict('var o = obj(); o.nowrite = 2; o.nowrite', + returns(1), raisesException(TypeError)), + true); + +assert.sameValue(testLenientAndStrict('var o = obj(); o.noconfig = 2; o.noconfig', + returns(2), returns(2)), + true); + +assert.sameValue(testLenientAndStrict('var o = obj(); o.noble = 2; o.noble', + returns(1), raisesException(TypeError)), + true); + +assert.sameValue(testLenientAndStrict('obj().nowrite++', + returns(1), raisesException(TypeError)), + true); +assert.sameValue(testLenientAndStrict('++obj().nowrite', + returns(2), raisesException(TypeError)), + true); +assert.sameValue(testLenientAndStrict('obj().nowrite--', + returns(1), raisesException(TypeError)), + true); +assert.sameValue(testLenientAndStrict('--obj().nowrite', + returns(0), raisesException(TypeError)), + true); + + +function arr() { + return Object.defineProperties([1, 1, 1, 1], + { 1: { writable: false }, + 2: { configurable: false }, + 3: { writable: false, configurable: false }}); +} + +assert.sameValue(testLenientAndStrict('var a = arr(); a[0] = 2; a[0]', + returns(2), returns(2)), + true); + +assert.sameValue(testLenientAndStrict('var a = arr(); a[1] = 2; a[1]', + returns(1), raisesException(TypeError)), + true); + +assert.sameValue(testLenientAndStrict('var a = arr(); a[2] = 2; a[2]', + returns(2), returns(2)), + true); + +assert.sameValue(testLenientAndStrict('var a = arr(); a[3] = 2; a[3]', + returns(1), raisesException(TypeError)), + true); + +assert.sameValue(testLenientAndStrict('arr()[1]++', + returns(1), raisesException(TypeError)), + true); +assert.sameValue(testLenientAndStrict('++arr()[1]', + returns(2), raisesException(TypeError)), + true); +assert.sameValue(testLenientAndStrict('arr()[1]--', + returns(1), raisesException(TypeError)), + true); +assert.sameValue(testLenientAndStrict('--arr()[1]', + returns(0), raisesException(TypeError)), + true); + diff --git a/test/staging/sm/strict/8.12.7-2.js b/test/staging/sm/strict/8.12.7-2.js new file mode 100644 index 0000000000..21b15cd35f --- /dev/null +++ b/test/staging/sm/strict/8.12.7-2.js @@ -0,0 +1,26 @@ +/* + * Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/licenses/publicdomain/ + */ + +/*--- +includes: [sm/non262-shell.js, sm/non262-strict-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +// delete o[p] only performs ToString(p) once, even if there's a strict error. +var hits = 0; +var p = { + toString: function () { + hits++; + return "noconfig"; + } +}; +assert.sameValue(testLenientAndStrict('var o = Object.freeze({noconfig: "ow"}); delete o[p]', + returns(false), raisesException(TypeError)), + true); +assert.sameValue(hits, 2); + diff --git a/test/staging/sm/strict/8.12.7.js b/test/staging/sm/strict/8.12.7.js new file mode 100644 index 0000000000..438a75b512 --- /dev/null +++ b/test/staging/sm/strict/8.12.7.js @@ -0,0 +1,37 @@ +/* + * Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/licenses/publicdomain/ + */ + +/*--- +includes: [sm/non262-shell.js, sm/non262-strict-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +function setup() { + var o = {all: 1, nowrite: 1, noconfig: 1, noble: 1}; + Object.defineProperty(o, 'nowrite', {writable: false}); + Object.defineProperty(o, 'noconfig', {configurable: false}); + Object.defineProperty(o, 'noble', {writable: false, configurable: false}); + return o; +} + +assert.sameValue(testLenientAndStrict('var o = setup(); delete o.all', + returns(true), returns(true)), + true); + +assert.sameValue(testLenientAndStrict('var o = setup(); delete o.nowrite', + returns(true), returns(true)), + true); + +assert.sameValue(testLenientAndStrict('var o = setup(); delete o.noconfig', + returns(false), raisesException(TypeError)), + true); + +assert.sameValue(testLenientAndStrict('var o = setup(); delete o.noble', + returns(false), raisesException(TypeError)), + true); + diff --git a/test/staging/sm/strict/8.7.2-01.js b/test/staging/sm/strict/8.7.2-01.js new file mode 100644 index 0000000000..322819eb56 --- /dev/null +++ b/test/staging/sm/strict/8.7.2-01.js @@ -0,0 +1,21 @@ +/* + * Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/licenses/publicdomain/ + */ + +/*--- +includes: [sm/non262-shell.js, sm/non262-strict-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +/* Check that assignment to a let-bound variable is permitted in both lenient and strict modes. */ + +/* Assigning to a let-declared variable is okay in strict and loose modes. */ +assert.sameValue(testLenientAndStrict('let let_declared; let_declared=1', + completesNormally, + completesNormally), + true); + diff --git a/test/staging/sm/strict/8.7.2.js b/test/staging/sm/strict/8.7.2.js new file mode 100644 index 0000000000..4469446f90 --- /dev/null +++ b/test/staging/sm/strict/8.7.2.js @@ -0,0 +1,61 @@ +/* + * Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/licenses/publicdomain/ + */ + +/*--- +includes: [sm/non262-shell.js, sm/non262-strict-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +/* + * These tests depend on the fact that testLenientAndStrict tries the + * strict case first; otherwise, the non-strict evaluation creates the + * variable. Ugh. Ideally, we would use evalcx, but that's not + * available in the browser. + */ + +/* Assigning to an undeclared variable should fail in strict mode. */ +assert.sameValue(testLenientAndStrict('undeclared=1', + completesNormally, + raisesException(ReferenceError)), + true); + +/* + * Assigning to a var-declared variable should be okay in strict and + * lenient modes. + */ +assert.sameValue(testLenientAndStrict('var var_declared; var_declared=1', + completesNormally, + completesNormally), + true); + +/* + * We mustn't report errors until the code is actually run; the variable + * could be created in the mean time. + */ +assert.sameValue(testLenientAndStrict('undeclared_at_compiletime=1', + parsesSuccessfully, + parsesSuccessfully), + true); + +function obj() { + var o = { x: 1, y: 1 }; + Object.defineProperty(o, 'x', { writable: false }); + return o; +} + +/* Put EXPR in a strict mode code context with 'with' bindings in scope. */ +function in_strict_with(expr) { + return "with(obj()) { (function () { 'use strict'; " + expr + " })(); }"; +} + +assert.sameValue(raisesException(TypeError)(in_strict_with('x = 2; y = 2;')), true); +assert.sameValue(raisesException(TypeError)(in_strict_with('x++;')), true); +assert.sameValue(raisesException(TypeError)(in_strict_with('++x;')), true); +assert.sameValue(raisesException(TypeError)(in_strict_with('x--;')), true); +assert.sameValue(raisesException(TypeError)(in_strict_with('--x;')), true); + diff --git a/test/staging/sm/strict/B.1.1.js b/test/staging/sm/strict/B.1.1.js new file mode 100644 index 0000000000..f20cfdf42b --- /dev/null +++ b/test/staging/sm/strict/B.1.1.js @@ -0,0 +1,36 @@ +/* + * Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/licenses/publicdomain/ + */ + +/*--- +includes: [sm/non262-shell.js, sm/non262-strict-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +/* Octal integer literal at top level. */ +assert.sameValue(testLenientAndStrict('010', + parsesSuccessfully, + parseRaisesException(SyntaxError)), + true); + +/* Octal integer literal in strict function body */ +assert.sameValue(parseRaisesException(SyntaxError) + ('function f() { "use strict"; 010; }'), + true); + + +/* + * Octal integer literal after strict function body (restoration of + * scanner state) + */ +assert.sameValue(parsesSuccessfully('function f() { "use strict"; }; 010'), + true); + +/* Octal integer literal in function body */ +assert.sameValue(parsesSuccessfully('function f() { 010; }'), + true); + diff --git a/test/staging/sm/strict/B.1.2.js b/test/staging/sm/strict/B.1.2.js new file mode 100644 index 0000000000..07c43d9d40 --- /dev/null +++ b/test/staging/sm/strict/B.1.2.js @@ -0,0 +1,43 @@ +/* + * Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/licenses/publicdomain/ + */ + +/*--- +includes: [sm/non262-shell.js, sm/non262-strict-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +assert.sameValue(testLenientAndStrict('"\\010"', + parsesSuccessfully, + parseRaisesException(SyntaxError)), + true); + +assert.sameValue(testLenientAndStrict('"\\00"', + parsesSuccessfully, + parseRaisesException(SyntaxError)), + true); + +assert.sameValue(testLenientAndStrict('"\\1"', + parsesSuccessfully, + parseRaisesException(SyntaxError)), + true); + +assert.sameValue(testLenientAndStrict('"\\08"', + parsesSuccessfully, + parseRaisesException(SyntaxError)), + true); + +assert.sameValue(testLenientAndStrict('"\\0"', + parsesSuccessfully, + parsesSuccessfully), + true); + +assert.sameValue(testLenientAndStrict('"\\0x"', + parsesSuccessfully, + parsesSuccessfully), + true); + diff --git a/test/staging/sm/strict/assign-to-callee-name.js b/test/staging/sm/strict/assign-to-callee-name.js new file mode 100644 index 0000000000..8a7845711f --- /dev/null +++ b/test/staging/sm/strict/assign-to-callee-name.js @@ -0,0 +1,47 @@ +/* + * Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/licenses/publicdomain/ + */ + +/*--- +includes: [sm/non262-shell.js, sm/non262-strict-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +var gTestfile = 'assign-to-callee-name.js'; +var BUGNUMBER = 610350; +var summary = + "Assigning to a function expression's name within that function should " + + "throw a TypeError in strict mode code"; + +print(BUGNUMBER + ": " + summary); + +/************** + * BEGIN TEST * + **************/ + +var f = function assignSelfStrict() { "use strict"; assignSelfStrict = 12; }; + +try +{ + var r = f(); + throw new Error("should have thrown a TypeError, returned " + r); +} +catch (e) +{ + assert.sameValue(e instanceof TypeError, true, + "didn't throw a TypeError: " + e); +} + +var assignSelf = 42; +var f2 = function assignSelf() { assignSelf = 12; }; + +f2(); // shouldn't throw, does nothing +assert.sameValue(assignSelf, 42); + +/******************************************************************************/ + +print("All tests passed!"); diff --git a/test/staging/sm/strict/deprecated-octal-noctal-tokens.js b/test/staging/sm/strict/deprecated-octal-noctal-tokens.js new file mode 100644 index 0000000000..a0faf75907 --- /dev/null +++ b/test/staging/sm/strict/deprecated-octal-noctal-tokens.js @@ -0,0 +1,48 @@ +/* + * Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/licenses/publicdomain/ + */ + +/*--- +includes: [sm/non262-shell.js, sm/non262-strict-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +/** + * These test cases check implementation-specific error messages for invalid + * octal literals, octal escape sequences, and non-octal decimal escape + * sequences in strings in strict mode code, where the error can't be reported + * at time of tokenization. + */ +var JSMSG_DEPRECATED_OCTAL_LITERAL = "\"0\"-prefixed octal literals are deprecated; use the \"0o\" prefix instead"; +var JSMSG_DEPRECATED_OCTAL_ESCAPE = "octal escape sequences can't be used in untagged template literals or in strict mode code"; +var JSMSG_DEPRECATED_EIGHT_OR_NINE_ESCAPE = "the escapes \\8 and \\9 can't be used in untagged template literals or in strict mode code"; + +function checkPrologue(val, msg) { + assertThrowsInstanceOfWithMessage( + () => eval('function invalid () { "' + val + '"; "use strict"; }'), + SyntaxError, + msg + ); +} + +checkPrologue('\\8', JSMSG_DEPRECATED_EIGHT_OR_NINE_ESCAPE); +checkPrologue('\\222', JSMSG_DEPRECATED_OCTAL_ESCAPE); +checkPrologue('\\222\\8', JSMSG_DEPRECATED_EIGHT_OR_NINE_ESCAPE); + +function checkAfter(val, msg) { + assertThrowsInstanceOfWithMessage( + () => eval('function invalid () { "use strict" \n ' + val + ' }'), + SyntaxError, + msg + ); +} + +checkAfter('0755', JSMSG_DEPRECATED_OCTAL_LITERAL); +checkAfter('"\\8"', JSMSG_DEPRECATED_EIGHT_OR_NINE_ESCAPE); +checkAfter('"\\222"', JSMSG_DEPRECATED_OCTAL_ESCAPE); +checkAfter('"\\222\\8"', JSMSG_DEPRECATED_EIGHT_OR_NINE_ESCAPE); + diff --git a/test/staging/sm/strict/directive-prologue-01.js b/test/staging/sm/strict/directive-prologue-01.js new file mode 100644 index 0000000000..5b26023982 --- /dev/null +++ b/test/staging/sm/strict/directive-prologue-01.js @@ -0,0 +1,85 @@ +/* + * Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/licenses/publicdomain/ + */ + +/*--- +includes: [sm/non262-shell.js, sm/non262-strict-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +//----------------------------------------------------------------------------- +var BUGNUMBER = 601262; +var summary = + "A string literal containing an octal escape before a strict mode " + + "directive should be a syntax error"; + +print(BUGNUMBER + ": " + summary); + +/************** + * BEGIN TEST * + **************/ + +try +{ + eval(" '\\145'; 'use strict'; "); + throw new Error("no error thrown for eval"); +} +catch (e) +{ + assert.sameValue(e instanceof SyntaxError, true, + "wrong error for octal-escape before strict directive in eval"); +} + +try +{ + Function(" '\\145'; 'use strict'; "); + throw new Error("no error thrown for Function"); +} +catch (e) +{ + assert.sameValue(e instanceof SyntaxError, true, + "wrong error for octal-escape before strict directive in Function"); +} + +try +{ + eval(" function f(){ '\\145'; 'use strict'; } "); + throw new Error("no error thrown for eval of function"); +} +catch (e) +{ + assert.sameValue(e instanceof SyntaxError, true, + "wrong error for octal-escape before strict directive in eval of " + + "function"); +} + +try +{ + Function(" function f(){ '\\145'; 'use strict'; } "); + throw new Error("no error thrown for eval of function"); +} +catch (e) +{ + assert.sameValue(e instanceof SyntaxError, true, + "wrong error for octal-escape before strict directive in eval of " + + "function"); +} + +eval("function notAnError1() { 5; '\\145'; function g() { 'use strict'; } }"); + +Function("function notAnError2() { 5; '\\145'; function g() { 'use strict'; } }"); + +function notAnError3() +{ + 5; + "\145"; + function g() { "use strict"; } +} + +/******************************************************************************/ + +print("All tests passed!"); diff --git a/test/staging/sm/strict/eval-variable-environment.js b/test/staging/sm/strict/eval-variable-environment.js new file mode 100644 index 0000000000..3340aa9536 --- /dev/null +++ b/test/staging/sm/strict/eval-variable-environment.js @@ -0,0 +1,74 @@ +/* + * Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/licenses/publicdomain/ + */ + +/*--- +includes: [sm/non262-shell.js, sm/non262-strict-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +var code; + +code = + "eval('var x = 2; typeof x');"; +assert.sameValue(testLenientAndStrict(code, returns("number"), returns("number")), + true); + +code = + "eval('\"use strict\"; var x = 2; typeof x');"; +assert.sameValue(testLenientAndStrict(code, returns("number"), returns("number")), + true); + +code = + "eval('var x = 2;'); " + + "typeof x"; +assert.sameValue(testLenientAndStrict(code, returns("number"), returns("undefined")), + true); + +code = + "eval('\"use strict\"; var x = 2;'); " + + "typeof x"; +assert.sameValue(testLenientAndStrict(code, returns("undefined"), returns("undefined")), + true); + +code = + "eval('\"use strict\"; var x = 2; typeof x'); " + + "typeof x"; +assert.sameValue(testLenientAndStrict(code, returns("undefined"), returns("undefined")), + true); + +code = + "function test() " + + "{ " + + " eval('var x = 2;'); " + + " return typeof x; " + + "} " + + "test();"; +assert.sameValue(testLenientAndStrict(code, returns("number"), returns("undefined")), + true); + +code = + "function test() " + + "{ " + + " 'use strict'; " + + " eval('var x = 2;'); " + + " return typeof x; " + + "} " + + "test();"; +assert.sameValue(testLenientAndStrict(code, returns("undefined"), returns("undefined")), + true); + +code = + "function test() " + + "{ " + + " eval('\"use strict\"; var x = 2;'); " + + " return typeof x; " + + "} " + + "test();"; +assert.sameValue(testLenientAndStrict(code, returns("undefined"), returns("undefined")), + true); + diff --git a/test/staging/sm/strict/primitive-assignment.js b/test/staging/sm/strict/primitive-assignment.js new file mode 100644 index 0000000000..91c52a1b96 --- /dev/null +++ b/test/staging/sm/strict/primitive-assignment.js @@ -0,0 +1,33 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-shell.js, sm/non262-strict-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +let primitives = [ + 10, + false, + "test", + Symbol() +]; + +let key = "key"; + +for (let value of primitives) { + // Doesn't throw outside strict mode. + assert.sameValue(value.x = 5, 5); + assert.sameValue(value[key] = 6, 6); + + assertThrowsInstanceOf(function() { "use strict"; value.x = 5; }, TypeError); + assertThrowsInstanceOf(function() { "use strict"; value[key] = 6; }, TypeError); + + let target = {}; + assert.sameValue(Reflect.set(target, key, 5, value), false); + assert.sameValue(key in target, false); +} + diff --git a/test/staging/sm/strict/primitive-this-getter.js b/test/staging/sm/strict/primitive-this-getter.js new file mode 100644 index 0000000000..fe356e15ce --- /dev/null +++ b/test/staging/sm/strict/primitive-this-getter.js @@ -0,0 +1,66 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-shell.js, sm/non262-strict-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +let primitives = [ + 10, + false, + "test", + Symbol() +] + +let getter = "getter"; +let getter2 = "getter2"; +let key = "key"; + +for (let value of primitives) { + let prototype = Object.getPrototypeOf(value); + + // Strict getters receive a primitive this value. + Object.defineProperty(prototype, "getter", {get: function() { + "use strict"; + assert.sameValue(this, value); + return "getter"; + }}) + + assert.sameValue(value.getter, "getter"); + assert.sameValue(value[getter], "getter"); + + // The proxy's [[Get]] trap is also invoked with primitive receiver values. + let proxy = new Proxy({}, { + get(target, property, receiver) { + assert.sameValue(property, "key"); + assert.sameValue(receiver, value); + return "get"; + } + }); + + Object.setPrototypeOf(prototype, proxy); + assert.sameValue(value.key, "get"); + assert.sameValue(value[key], "get"); + assert.sameValue(value.getter, "getter"); + assert.sameValue(value[getter], "getter"); + + // A getter still gets a primitive this value even after going through a proxy. + proxy = new Proxy({ + get getter2() { + "use strict"; + assert.sameValue(this, value); + return "getter2"; + } + }, {}); + + Object.setPrototypeOf(prototype, proxy); + assert.sameValue(value.getter2, "getter2"); + assert.sameValue(value[getter2], "getter2"); + assert.sameValue(value.getter, "getter"); + assert.sameValue(value[getter], "getter"); +} + diff --git a/test/staging/sm/strict/primitive-this-no-writeback.js b/test/staging/sm/strict/primitive-this-no-writeback.js new file mode 100644 index 0000000000..6c918b1eeb --- /dev/null +++ b/test/staging/sm/strict/primitive-this-no-writeback.js @@ -0,0 +1,25 @@ +/* + * Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/licenses/publicdomain/ + */ + +/*--- +includes: [sm/non262-shell.js, sm/non262-strict-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +/* Verify that GETTHISPROP does not update the frame's |this| slot. */ + +var f = String.prototype.m = function () { + "use strict"; + assert.sameValue(this, "s"); + // The GETTHISPROP should not cause |this| to become wrapped. + return [this.m, this]; +}; +var a = "s".m(); +assert.sameValue(a[0], f); +assert.sameValue(a[1], "s"); + diff --git a/test/staging/sm/strict/rebind-eval-should-fail-in-strict-mode.js b/test/staging/sm/strict/rebind-eval-should-fail-in-strict-mode.js new file mode 100644 index 0000000000..9ceeaea3a5 --- /dev/null +++ b/test/staging/sm/strict/rebind-eval-should-fail-in-strict-mode.js @@ -0,0 +1,46 @@ +/* + * Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/licenses/publicdomain/ + */ + +/*--- +includes: [sm/non262-shell.js, sm/non262-strict-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +var BadSyntaxStrings = [ + "function foo1() { \"use strict\"; try {} catch (eval) {} }", + "function foo2() { \"use strict\"; let eval = 9; foo(); }", + "function foo3() { \"use strict\"; for (let eval = 3;;) { foo(); }}", + "function foo4() { \"use strict\"; for (let eval in {a:1}) { foo(); }}", + "function foo5() { \"use strict\"; for (let eval of [1, 2, 3]) { foo(); }}", + "function foo6() { \"use strict\"; var eval = 12; }", + "function foo7() { \"use strict\"; for (var eval = 3;;) { foo(); }}", + "function foo8() { \"use strict\"; for (var eval in {a:1}) { foo(); }}", + "function foo9() { \"use strict\"; for (var eval of [1, 2, 3]) { foo(); }}", + "function foo10() { \"use strict\"; const eval = 12; }", + "function foo11() { \"use strict\"; for (const eval = 3;;) { foo(); }}", + "function foo12() { \"use strict\"; return [eval for (eval of [1, 2, 3])]; }", + "function foo13() { \"use strict\"; return [eval for (eval in {a:3})]; }", + "function foo14() { \"use strict\"; return (eval for (eval of [1, 2, 3])); }", + "function foo15() { \"use strict\"; return (eval for (eval in {a:3})); }" +]; + +function testString(s, i) { + var gotSyntaxError = -1; + try { + eval(s); + } catch(err) { + if (err instanceof SyntaxError) + gotSyntaxError = i; + } + + assert.sameValue(gotSyntaxError, i); +} + +for (var i = 0; i < BadSyntaxStrings.length; i++) + testString(BadSyntaxStrings[i], i); + diff --git a/test/staging/sm/strict/regress-532041.js b/test/staging/sm/strict/regress-532041.js new file mode 100644 index 0000000000..4088205b26 --- /dev/null +++ b/test/staging/sm/strict/regress-532041.js @@ -0,0 +1,22 @@ +/* + * Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/licenses/publicdomain/ + */ + +/*--- +includes: [sm/non262-shell.js, sm/non262-strict-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ + +/* + * JSFunction::findDuplicateFormal (nee js_FindDuplicateFormal), used + * by strict checks, sometimes failed to choose the correct branch of + * the fun->u.i.names union: it used the argument count, not the + * overall name count. + */ +function f(a1,a2,a3,a4,a5) { "use strict"; var v1, v2, v3, v4, v5, v6, v7; } + diff --git a/test/staging/sm/strict/regress-532254.js b/test/staging/sm/strict/regress-532254.js new file mode 100644 index 0000000000..ada023dc32 --- /dev/null +++ b/test/staging/sm/strict/regress-532254.js @@ -0,0 +1,18 @@ +/* + * Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/licenses/publicdomain/ + */ + +/*--- +includes: [sm/non262-shell.js, sm/non262-strict-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +assert.sameValue(testLenientAndStrict('function f(eval,[x]){}', + parsesSuccessfully, + parseRaisesException(SyntaxError)), + true); + diff --git a/test/staging/sm/strict/regress-599159.js b/test/staging/sm/strict/regress-599159.js new file mode 100644 index 0000000000..943c673bc9 --- /dev/null +++ b/test/staging/sm/strict/regress-599159.js @@ -0,0 +1,38 @@ +/* + * Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/licenses/publicdomain/ + */ + +/*--- +includes: [sm/non262-shell.js, sm/non262-strict-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +// Shu's test +function test(makeNonArray) { + function C() {} + C.prototype = [] + if (makeNonArray) + C.prototype.constructor = C + c = new C(); + c.push("foo"); + return c.length +} +assert.sameValue(test(true), 1); +assert.sameValue(test(false), 1); + +// jorendorff's longer test +var a = []; +a.slowify = 1; +var b = Object.create(a); +b.length = 12; +assert.sameValue(b.length, 12); + +// jorendorff's shorter test +var b = Object.create(Array.prototype); +b.length = 12; +assert.sameValue(b.length, 12); + diff --git a/test/staging/sm/strict/strict-function-statements.js b/test/staging/sm/strict/strict-function-statements.js new file mode 100644 index 0000000000..d561fc6d48 --- /dev/null +++ b/test/staging/sm/strict/strict-function-statements.js @@ -0,0 +1,101 @@ +/* + * Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/licenses/publicdomain/ + */ + +/*--- +includes: [sm/non262-shell.js, sm/non262-strict-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +// Ordinary function definitions should be unaffected. +assert.sameValue(testLenientAndStrict("function f() { }", + parsesSuccessfully, + parsesSuccessfully), + true); + +// Lambdas are always permitted within blocks. +assert.sameValue(testLenientAndStrict("{ (function f() { }) }", + parsesSuccessfully, + parsesSuccessfully), + true); + +// Function statements within unbraced blocks are forbidden in strict mode code. +// They are allowed only under if statements in sloppy mode. +assert.sameValue(testLenientAndStrict("if (true) function f() { }", + parsesSuccessfully, + parseRaisesException(SyntaxError)), + true); +assert.sameValue(testLenientAndStrict("while (true) function f() { }", + parseRaisesException(SyntaxError), + parseRaisesException(SyntaxError)), + true); +assert.sameValue(testLenientAndStrict("do function f() { } while (true);", + parseRaisesException(SyntaxError), + parseRaisesException(SyntaxError)), + true); +assert.sameValue(testLenientAndStrict("for(;;) function f() { }", + parseRaisesException(SyntaxError), + parseRaisesException(SyntaxError)), + true); +assert.sameValue(testLenientAndStrict("for(x in []) function f() { }", + parseRaisesException(SyntaxError), + parseRaisesException(SyntaxError)), + true); +assert.sameValue(testLenientAndStrict("with(o) function f() { }", + parseRaisesException(SyntaxError), + parseRaisesException(SyntaxError)), + true); +assert.sameValue(testLenientAndStrict("switch(1) { case 1: function f() { } }", + parsesSuccessfully, + parsesSuccessfully), + true); +assert.sameValue(testLenientAndStrict("x: function f() { }", + parsesSuccessfully, + parseRaisesException(SyntaxError)), + true); +assert.sameValue(testLenientAndStrict("try { function f() { } } catch (x) { }", + parsesSuccessfully, + parsesSuccessfully), + true); + +// Lambdas are always permitted within any sort of statement. +assert.sameValue(testLenientAndStrict("if (true) (function f() { })", + parsesSuccessfully, + parsesSuccessfully), + true); + +// Function statements are permitted in blocks within lenient functions. +assert.sameValue(parsesSuccessfully("function f() { function g() { } }"), + true); + +// Function statements are permitted in if statement within lenient functions. +assert.sameValue(parsesSuccessfully("function f() { if (true) function g() { } }"), + true); + +assert.sameValue(parseRaisesException(SyntaxError) + ("function f() { 'use strict'; if (true) function g() { } }"), + true); + +assert.sameValue(parsesSuccessfully("function f() { 'use strict'; { function g() { } } }"), + true); + +assert.sameValue(parsesSuccessfully("function f() { 'use strict'; if (true) (function g() { }) }"), + true); + +assert.sameValue(parsesSuccessfully("function f() { 'use strict'; { (function g() { }) } }"), + true); + +// Eval should behave the same way. (The parse-only tests use the Function constructor.) +assert.sameValue(testLenientAndStrict("function f() { }", + completesNormally, + completesNormally), + true); +assert.sameValue(testLenientAndStrict("{ function f() { } }", + completesNormally, + completesNormally), + true); + diff --git a/test/staging/sm/strict/strict-this-is-not-truthy.js b/test/staging/sm/strict/strict-this-is-not-truthy.js new file mode 100644 index 0000000000..b0eec89cfa --- /dev/null +++ b/test/staging/sm/strict/strict-this-is-not-truthy.js @@ -0,0 +1,22 @@ +/* + * Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/licenses/publicdomain/ + */ + +/*--- +includes: [sm/non262-shell.js, sm/non262-strict-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ + +// See bug 630543. + +function f() { + "use strict"; + return !this; +} +assert.sameValue(f.call(null), true); + diff --git a/test/staging/sm/strict/this-for-function-expression-recursion.js b/test/staging/sm/strict/this-for-function-expression-recursion.js new file mode 100644 index 0000000000..5f8b5b685a --- /dev/null +++ b/test/staging/sm/strict/this-for-function-expression-recursion.js @@ -0,0 +1,49 @@ +/* + * Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/licenses/publicdomain/ + */ + +/*--- +includes: [sm/non262-shell.js, sm/non262-strict-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +var gTestfile = 'this-for-function-expression-recursion.js'; +var BUGNUMBER = 611276; +var summary = "JSOP_CALLEE should push undefined, not null, for this"; + +print(BUGNUMBER + ": " + summary); + +/************** + * BEGIN TEST * + **************/ + +// Calling a named function expression (not function statement) uses the +// JSOP_CALLEE opcode. This opcode pushes its own |this|, distinct from the +// normal call path; verify that that |this| value is properly |undefined|. + +var calleeThisFun = + function calleeThisFun(recurring) + { + if (recurring) + return this; + return calleeThisFun(true); + }; +assert.sameValue(calleeThisFun(false), this); + +var calleeThisStrictFun = + function calleeThisStrictFun(recurring) + { + "use strict"; + if (recurring) + return this; + return calleeThisStrictFun(true); + }; +assert.sameValue(calleeThisStrictFun(false), undefined); + +/******************************************************************************/ + +print("All tests passed!"); diff --git a/test/staging/sm/strict/unbrand-this.js b/test/staging/sm/strict/unbrand-this.js new file mode 100644 index 0000000000..e320477119 --- /dev/null +++ b/test/staging/sm/strict/unbrand-this.js @@ -0,0 +1,50 @@ +/* + * Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/licenses/publicdomain/ + */ + +/*--- +includes: [sm/non262-shell.js, sm/non262-strict-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +/* Test JSOP_UNBRANDTHIS's behavior on object and non-object |this| values. */ + +function strict() { + "use strict"; + this.insert = function(){ bar(); }; + function bar() {} +} + +var exception; + +// Try 'undefined' as a |this| value. +exception = null; +try { + strict.call(undefined); +} catch (x) { + exception = x; +} +assert.sameValue(exception instanceof TypeError, true); + +// Try 'null' as a |this| value. +exception = null; +try { + strict.call(null); +} catch (x) { + exception = x; +} +assert.sameValue(exception instanceof TypeError, true); + +// An object as a |this| value should be fine. +exception = null; +try { + strict.call({}); +} catch (x) { + exception = x; +} +assert.sameValue(exception, null); + diff --git a/test/staging/sm/syntax/bug1863308.js b/test/staging/sm/syntax/bug1863308.js new file mode 100644 index 0000000000..b7486d9012 --- /dev/null +++ b/test/staging/sm/syntax/bug1863308.js @@ -0,0 +1,31 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +assertThrowsInstanceOfWithMessage( + () => eval("for (let case of ['foo', 'bar']) {}"), + SyntaxError, + "unexpected token: keyword 'case'"); + +assertThrowsInstanceOfWithMessage( + () => eval("for (let debugger of ['foo', 'bar']) {}"), + SyntaxError, + "unexpected token: keyword 'debugger'"); + +assertThrowsInstanceOfWithMessage( + () => eval("for (let case in ['foo', 'bar']) {}"), + SyntaxError, + "unexpected token: keyword 'case'"); + +assertThrowsInstanceOfWithMessage( + () => eval("for (let debugger in ['foo', 'bar']) {}"), + SyntaxError, + "unexpected token: keyword 'debugger'"); + diff --git a/test/staging/sm/syntax/class-error.js b/test/staging/sm/syntax/class-error.js new file mode 100644 index 0000000000..2babd8851f --- /dev/null +++ b/test/staging/sm/syntax/class-error.js @@ -0,0 +1,27 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +function assertThrowsSyntaxError(x) { + let success = false; + try { + eval(x); + success = true; + } catch (e) { + assert.sameValue(e instanceof SyntaxError, true); + } + assert.sameValue(success, false); +} + + +assertThrowsSyntaxError("class X { x: 1 }") + +if ('assert.sameValue' in this) { +} diff --git a/test/staging/sm/syntax/declaration-forbidden-in-label.js b/test/staging/sm/syntax/declaration-forbidden-in-label.js new file mode 100644 index 0000000000..26ccd0e674 --- /dev/null +++ b/test/staging/sm/syntax/declaration-forbidden-in-label.js @@ -0,0 +1,39 @@ +/* + * Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/licenses/publicdomain/ + */ + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +//----------------------------------------------------------------------------- +var BUGNUMBER = 1288459; +var summary = + "Properly implement the spec's distinctions between StatementListItem and " + + "Statement grammar productions and their uses"; + +print(BUGNUMBER + ": " + summary); + +/************** + * BEGIN TEST * + **************/ + +assertThrowsInstanceOf(() => Function("a: let x;"), SyntaxError); +assertThrowsInstanceOf(() => Function("b: const y = 3;"), SyntaxError); +assertThrowsInstanceOf(() => Function("c: class z {};"), SyntaxError); + +assertThrowsInstanceOf(() => Function("'use strict'; d: function w() {};"), SyntaxError); + +// Annex B.3.2 allows this in non-strict mode code. +Function("e: function x() {};"); + +assertThrowsInstanceOf(() => Function("f: function* y() {}"), SyntaxError); + +/******************************************************************************/ + +print("Tests complete"); diff --git a/test/staging/sm/syntax/escaped-let-static-identifier.js b/test/staging/sm/syntax/escaped-let-static-identifier.js new file mode 100644 index 0000000000..9c8003e4b7 --- /dev/null +++ b/test/staging/sm/syntax/escaped-let-static-identifier.js @@ -0,0 +1,62 @@ +/* + * Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/licenses/publicdomain/ + */ + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +//----------------------------------------------------------------------------- +var BUGNUMBER = 1288460; +var summary = + "|let| and |static| are forbidden as Identifier only in strict mode code, " + + "and it's permissible to use them as Identifier (with or without " + + "containing escapes) in non-strict code"; + +print(BUGNUMBER + ": " + summary); + +/************** + * BEGIN TEST * + **************/ + +function t(code) +{ + var strictSemi = " 'use strict'; " + code; + var strictASI = " 'use strict' \n " + code; + + var creationFunctions = [Function]; + if (typeof evaluate === "function") + creationFunctions.push(evaluate); + if (typeof parseModule === "function") + creationFunctions.push(parseModule); + + for (var func of creationFunctions) + { + if (typeof parseModule === "function" && func === parseModule) + assertThrowsInstanceOf(() => func(code), SyntaxError); + else + func(code); + + assertThrowsInstanceOf(() => func(strictSemi), SyntaxError); + assertThrowsInstanceOf(() => func(strictASI), SyntaxError); + } +} + +t("l\\u0065t: 42;"); +t("if (1) l\\u0065t: 42;"); +t("l\\u0065t = 42;"); +t("if (1) l\\u0065t = 42;"); + +t("st\\u0061tic: 42;"); +t("if (1) st\\u0061tic: 42;"); +t("st\\u0061tic = 42;"); +t("if (1) st\\u0061tic = 42;"); + +/******************************************************************************/ + +print("Tests complete"); diff --git a/test/staging/sm/syntax/keyword-unescaped-requirement.js b/test/staging/sm/syntax/keyword-unescaped-requirement.js new file mode 100644 index 0000000000..6c55494f2e --- /dev/null +++ b/test/staging/sm/syntax/keyword-unescaped-requirement.js @@ -0,0 +1,73 @@ +/* + * Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/licenses/publicdomain/ + */ + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +//----------------------------------------------------------------------------- +var BUGNUMBER = 1204027; +var summary = + "Escape sequences aren't allowed in bolded grammar tokens (that is, in " + + "keywords, possibly contextual keywords)"; + +print(BUGNUMBER + ": " + summary); + +/************** + * BEGIN TEST * + **************/ + +function memberVariants(code) +{ + return ["(class { constructor() {} " + code + " });", + "({ " + code + " })"]; +} + +var badScripts = + [ + "class { st\\u0061tic m() { return 0; } }", + "class { st\\u0061tic get foo() { return 0; } }", + "class { st\\u0061tic set foo(v) {} }", + "class { st\\u0061tic get ['hi']() { return 0; } }", + "class { st\\u0061tic set ['hi'](v) {} }", + "class { st\\u0061tic get 'hi'() { return 0; } }", + "class { st\\u0061tic set 'hi'(v) {} }", + "class { st\\u0061tic get 42() { return 0; } }", + "class { st\\u0061tic set 42(v) {} }", + ...memberVariants("\\u0067et foo() { return 0; }"), + ...memberVariants("\\u0073et foo() {}"), + ...memberVariants("g\\u0065t foo() { return 0; }"), + ...memberVariants("s\\u0065t foo() {}"), + ...memberVariants("g\\u0065t ['hi']() { return 0; }"), + ...memberVariants("s\\u0065t ['hi']() {}"), + ...memberVariants("g\\u0065t 'hi'() { return 0; }"), + ...memberVariants("s\\u0065t 'hi'() {}"), + ...memberVariants("g\\u0065t 42() { return 0; }"), + ...memberVariants("s\\u0065t 42() {}"), + "for (var foo o\\u0066 [1]) ;", + "for (var foo \\u006ff [1]) ;", + "for (var foo i\\u006e [1]) ;", + "for (var foo \\u0069n [1]) ;", + "function f() { return n\\u0065w.target }", + "function f() { return \\u006eew.target }", + "function f() { return new.t\\u0061rget }", + "function f() { return new.\\u0074arget }", + "function f() { return n\\u0065w Array }", + "function f() { return \\u006eew Array }", + "\\u0064o { } while (0)", + "[for (x \\u006ff [1]) x]", + "[for (x o\\u0066 [1]) x]", + ]; + +for (var script of badScripts) + assertThrowsInstanceOf(() => Function(script), SyntaxError); + +/******************************************************************************/ + +print("Tests complete"); diff --git a/test/staging/sm/syntax/let-as-label.js b/test/staging/sm/syntax/let-as-label.js new file mode 100644 index 0000000000..e8e2746ef2 --- /dev/null +++ b/test/staging/sm/syntax/let-as-label.js @@ -0,0 +1,40 @@ +/* + * Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/licenses/publicdomain/ + */ + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +//----------------------------------------------------------------------------- +var BUGNUMBER = 1288459; +var summary = "let can't be used as a label in strict mode code"; + +print(BUGNUMBER + ": " + summary); + +/************** + * BEGIN TEST * + **************/ + +Function("let: 42"); +Function("l\\u0065t: 42"); +assertThrowsInstanceOf(() => Function(" 'use strict'; let: 42"), SyntaxError); +assertThrowsInstanceOf(() => Function(" 'use strict' \n let: 42"), SyntaxError); +assertThrowsInstanceOf(() => Function(" 'use strict'; l\\u0065t: 42"), SyntaxError); +assertThrowsInstanceOf(() => Function(" 'use strict' \n l\\u0065t: 42"), SyntaxError); + +eval("let: 42"); +eval("l\\u0065t: 42"); +assertThrowsInstanceOf(() => eval(" 'use strict'; let: 42"), SyntaxError); +assertThrowsInstanceOf(() => eval(" 'use strict' \n let: 42;"), SyntaxError); +assertThrowsInstanceOf(() => eval(" 'use strict'; l\\u0065t: 42"), SyntaxError); +assertThrowsInstanceOf(() => eval(" 'use strict' \n l\\u0065t: 42;"), SyntaxError); + +/******************************************************************************/ + +print("Tests complete"); diff --git a/test/staging/sm/syntax/linefeed-at-eof-in-unterminated-string-or-template.js b/test/staging/sm/syntax/linefeed-at-eof-in-unterminated-string-or-template.js new file mode 100644 index 0000000000..73d8407620 --- /dev/null +++ b/test/staging/sm/syntax/linefeed-at-eof-in-unterminated-string-or-template.js @@ -0,0 +1,93 @@ +/* + * Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/licenses/publicdomain/ + */ + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +//----------------------------------------------------------------------------- +var BUGNUMBER = 1476409; +var summary = + "Properly handle the case of U+005C REVERSE SOLIDUS U+000D CARRIAGE RETURN " + + "at the end of source text being tokenized, in the middle of a string or " + + "template literal, where the next code point in memory (outside the bounds " + + "of the source text) is U+000A LINE FEED"; + +print(BUGNUMBER + ": " + summary); + +/************** + * BEGIN TEST * + **************/ + +function expectSyntaxError(code) +{ + try + { + eval(code); + throw new Error("didn't throw"); + } + catch (e) + { + assert.sameValue(e instanceof SyntaxError, true, + "got " + e.name + ", expected SyntaxError"); + } +} + +// The fundamental requirements of this test: +// +// 1. The computed string that is eval'd must be a Script that ends in a string +// literal ending with the code points U+005C REVERSE SOLIDUS U+000D CARRIAGE +// RETURN. +// 2. The *memory* that is actually tokenized/parsed by eval must be +// immediately followed by U+000A LINE FEED. +// +// There's only one way to guarantee a U+000A LINE FEED after the source text: +// compute the source text as a dependent string, of a larger (linear) string. +// A simple substr will do the trick -- just as long as the substring can't fit +// in inline storage. 53 in the tests below comfortably exceeds all inline +// storage limits. +// +// One final wrinkle: because we only tokenize/parse two-byte source text right +// now, ensuring we directly tokenize/parse the dependent string's character +// data means the dependent string must have two-byte character data, hence the +// '\u1234' in the strings below. + +function singleQuote() +{ + var containsBadSingleQuoteLiteral = + "\u1234x'01234567890123456789012345678901234567890123456789\\\r\n0123456789"; + // ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + + expectSyntaxError(containsBadSingleQuoteLiteral.substr(2, 53)); +} +singleQuote(); + +function doubleQuote() +{ + var containsBadDoubleQuoteLiteral = + "\u1234x\"01234567890123456789012345678901234567890123456789\\\r\n0123456789"; + // ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + + expectSyntaxError(containsBadDoubleQuoteLiteral.substr(2, 53)); +} +doubleQuote(); + +function template() +{ + var containsBadTemplateLiteral = + "\u1234x`01234567890123456789012345678901234567890123456789\\\r\n0123456789"; + // ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + + expectSyntaxError(containsBadTemplateLiteral.substr(2, 53)); +} +template(); + +/******************************************************************************/ + +print("Tests complete"); diff --git a/test/staging/sm/syntax/omitted-catch-binding.js b/test/staging/sm/syntax/omitted-catch-binding.js new file mode 100644 index 0000000000..fd425cf8bb --- /dev/null +++ b/test/staging/sm/syntax/omitted-catch-binding.js @@ -0,0 +1,45 @@ +// Copyright (C) 2024 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +var state = 'initial'; +try { + throw new Error('caught'); + state = 'unreachable'; +} catch { // Note the lack of a binding + assert.sameValue(state, 'initial'); + state = 'caught'; +} +assert.sameValue(state, 'caught'); + + +var sigil1 = {}; +try { + throw sigil1; +} catch (e) { + assert.sameValue(e, sigil1); +} + + +var sigil2 = {}; +var reached = false; +try { + try { + throw sigil1; + } catch { + reached = true; + } finally { + throw sigil2; + } +} catch (e) { + assert.sameValue(e, sigil2); +} +assert.sameValue(reached, true); + diff --git a/test/staging/sm/syntax/syntax-parsed-arrow-then-bigint.js b/test/staging/sm/syntax/syntax-parsed-arrow-then-bigint.js new file mode 100644 index 0000000000..aa68c4f420 --- /dev/null +++ b/test/staging/sm/syntax/syntax-parsed-arrow-then-bigint.js @@ -0,0 +1,45 @@ +/* + * Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/licenses/publicdomain/ + */ + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +//----------------------------------------------------------------------------- +var BUGNUMBER = 1596706; +var summary = + "Properly evaluate a bigint literal that's initially tokenized by a syntax " + + "parser (because the bigint literal appears immediately after an arrow " + + "function with expression body)"; + +print(BUGNUMBER + ": " + summary); + +/************** + * BEGIN TEST * + **************/ + +// block followed by semicolon +assert.sameValue(eval(`x=>{}; +17n`), 17n); + +// block not followed by semicolon +assert.sameValue(eval(`x=>{} +42n`), 42n); + +// expr followed by semicolon +assert.sameValue(eval(`x=>y; +8675309n`), 8675309n); + +// expr not followed by semicolon +assert.sameValue(eval(`x=>y +78051120n`), 78051120n); + +/******************************************************************************/ + +print("Tests complete"); diff --git a/test/staging/sm/syntax/syntax-parsed-arrow-then-directive.js b/test/staging/sm/syntax/syntax-parsed-arrow-then-directive.js new file mode 100644 index 0000000000..a91397c9e0 --- /dev/null +++ b/test/staging/sm/syntax/syntax-parsed-arrow-then-directive.js @@ -0,0 +1,77 @@ +/* + * Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/licenses/publicdomain/ + */ + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +//----------------------------------------------------------------------------- +var BUGNUMBER = 1596706; +var summary = + "Properly apply a directive comment that's only tokenized by a syntax " + + "parser (because the directive comment appears immediately after an arrow " + + "function with expression body)"; + +print(BUGNUMBER + ": " + summary); + +/************** + * BEGIN TEST * + **************/ + +var stack; + +function reset() +{ + stack = ""; +} + +function assertStackContains(needle, msg) +{ + assert.sameValue(stack.indexOf(needle) >= 0, true, + `stack should contain '${needle}': ${msg}`); +} + +Object.defineProperty(this, "detectSourceURL", { + get() { + stack = new Error().stack; + return 17; + } +}); + +// block followed by semicolon +reset(); +assert.sameValue(eval(`x=>{}; +//# sourceURL=http://example.com/foo.js +detectSourceURL`), 17); +assertStackContains("http://example.com/foo.js", "block, semi"); + +// block not followed by semicolon +reset(); +assert.sameValue(eval(`x=>{} +//# sourceURL=http://example.com/bar.js +detectSourceURL`), 17); +assertStackContains("http://example.com/bar.js", "block, not semi"); + +// expr followed by semicolon +reset(); +assert.sameValue(eval(`x=>y; +//# sourceURL=http://example.com/baz.js +detectSourceURL`), 17); +assertStackContains("http://example.com/baz.js", "expr, semi"); + +// expr not followed by semicolon +reset(); +assert.sameValue(eval(`x=>y +//# sourceURL=http://example.com/quux.js +detectSourceURL`), 17); +assertStackContains("http://example.com/quux.js", "expr, not semi"); + +/******************************************************************************/ + +print("Tests complete"); diff --git a/test/staging/sm/syntax/yield-as-identifier.js b/test/staging/sm/syntax/yield-as-identifier.js new file mode 100644 index 0000000000..6833388e12 --- /dev/null +++ b/test/staging/sm/syntax/yield-as-identifier.js @@ -0,0 +1,59 @@ +/* + * Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/licenses/publicdomain/ + */ + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +//----------------------------------------------------------------------------- +var BUGNUMBER = 1288459; +var summary = "|yield| is sometimes a valid identifier"; + +print(BUGNUMBER + ": " + summary); + +/************** + * BEGIN TEST * + **************/ + +function t(code) +{ + var strictSemi = " 'use strict'; " + code; + var strictASI = " 'use strict' \n " + code; + + var creationFunctions = ["Function"]; + if (typeof evaluate === "function") + creationFunctions.push("evaluate"); + if (typeof parseModule === "function") + creationFunctions.push("parseModule"); + + for (var func of creationFunctions) + { + var g = createNewGlobal(); + var f = g[func]; + + if (func === "parseModule") + assertThrowsInstanceOf(() => f(code), g.SyntaxError); + else + f(code); + + assertThrowsInstanceOf(() => f(strictSemi), g.SyntaxError); + assertThrowsInstanceOf(() => f(strictASI), g.SyntaxError); + } +} + +t("var yield = 3;"); +t("let yield = 3;"); +t("const yield = 3;"); +t("for (var yield = 3; ; ) break;"); +t("for (let yield = 3; ; ) break;"); +t("for (const yield = 3; ; ) break;"); + +/******************************************************************************/ + +print("Tests complete"); diff --git a/test/staging/sm/template.js b/test/staging/sm/template.js new file mode 100644 index 0000000000..311e57b965 --- /dev/null +++ b/test/staging/sm/template.js @@ -0,0 +1,31 @@ +/* + * Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/licenses/publicdomain/ + */ + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +//----------------------------------------------------------------------------- +var BUGNUMBER = 99999; +var summary = ''; +var actual = ''; +var expect = ''; + + +//----------------------------------------------------------------------------- +test(); +//----------------------------------------------------------------------------- + +function test() +{ + printBugNumber(BUGNUMBER); + printStatus (summary); + + assert.sameValue(expect, actual, summary); +} diff --git a/test/staging/sm/types/8.12.5-01.js b/test/staging/sm/types/8.12.5-01.js new file mode 100644 index 0000000000..2f69b4d429 --- /dev/null +++ b/test/staging/sm/types/8.12.5-01.js @@ -0,0 +1,114 @@ +/* + * Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/licenses/publicdomain/ + */ + +/*--- +includes: [sm/non262-shell.js, sm/non262.js] +flags: +- noStrict +description: | + pending +esid: pending +---*/ +//----------------------------------------------------------------------------- +var BUGNUMBER = 523846; +var summary = + "Assignments to a property that has a getter but not a setter should not " + + "throw a TypeError per ES5 (at least not until strict mode is supported)"; +var actual = "Early failure"; +var expect = "No errors"; + + +printBugNumber(BUGNUMBER); +printStatus(summary); + +var o = { get p() { return "a"; } }; + +function test1() +{ + o.p = "b"; + assert.sameValue(o.p, "a"); +} + +function test2() +{ + function T() {} + T.prototype = o; + y = new T(); + y.p = "b"; + assert.sameValue(y.p, "a"); +} + +function strictTest1() +{ + "use strict"; + + o.p = "b"; // strict-mode violation here + assert.sameValue(o.p, "a"); +} + +function strictTest2() +{ + "use strict"; + + function T() {} + T.prototype = o; + y = new T; + y.p = "b"; // strict-mode violation here + assert.sameValue(y.p, "a"); +} + +var errors = []; +try +{ + try + { + test1(); + } + catch (e) + { + errors.push(e); + } + + try + { + test2(); + } + catch (e) + { + errors.push(e); + } + + try + { + strictTest1(); + errors.push("strictTest1 didn't fail"); + } + catch (e) + { + if (!(e instanceof TypeError)) + errors.push("strictTest1 didn't fail with a TypeError: " + e); + } + + try + { + strictTest2(); + errors.push("strictTest2 didn't fail"); + } + catch (e) + { + if (!(e instanceof TypeError)) + errors.push("strictTest2 didn't fail with a TypeError: " + e); + } +} +catch (e) +{ + errors.push("Unexpected error: " + e); +} +finally +{ + actual = errors.length > 0 ? errors.join(", ") : "No errors"; +} + +assert.sameValue(expect, actual, summary);